diff --git a/config/app_dynamics_agent.yml b/config/app_dynamics_agent.yml index 3c55e187a..51ac5679b 100644 --- a/config/app_dynamics_agent.yml +++ b/config/app_dynamics_agent.yml @@ -15,9 +15,12 @@ # Configuration for the AppDynamics framework --- -version: + +version: 24.5.0_36037 repository_root: "{default.repository.root}/appdynamics" -default_application_name: $(jq -r -n "$VCAP_APPLICATION | .space_name + \":\" + .application_name | @sh") -default_node_name: $(jq -r -n "\"$APPD_CF_NODE_PREFIX\" + ($VCAP_APPLICATION | .application_name) + \":$CF_INSTANCE_INDEX\" | @sh") -default_tier_name: -default_unique_host_name: $(jq -r -n "$VCAP_APPLICATION | .application_id + \":$CF_INSTANCE_INDEX\" | @sh") +default_application_name: $(jq -r -n "$VCAP_APPLICATION | .space_name + \":\" + .application_name + | @sh") +default_node_name: $(jq -r -n "\"$APPD_CF_NODE_PREFIX\" + ($VCAP_APPLICATION | .application_name) + + \":$CF_INSTANCE_INDEX\" | @sh") +default_tier_name: +default_unique_host_name: $(jq -r -n "$VCAP_APPLICATION | .application_id + \":$CF_INSTANCE_INDEX\" + | @sh") diff --git a/config/azure_application_insights_agent.yml b/config/azure_application_insights_agent.yml index 419980133..1a63a7126 100644 --- a/config/azure_application_insights_agent.yml +++ b/config/azure_application_insights_agent.yml @@ -15,5 +15,5 @@ # Configuration for the Azure Application Insights framework. --- -version: 3.+ +version: 3.5.3 repository_root: "{default.repository.root}/azure-application-insights" diff --git a/config/client_certificate_mapper.yml b/config/client_certificate_mapper.yml index e32fbedc8..ad9579a0b 100644 --- a/config/client_certificate_mapper.yml +++ b/config/client_certificate_mapper.yml @@ -15,7 +15,7 @@ # Container security provider configuration --- -version: 2.+ +version: 2.0.1 version_lines: - - 2.+ -repository_root: "{default.repository.root}/client-certificate-mapper" \ No newline at end of file +- 2.+ +repository_root: "{default.repository.root}/client-certificate-mapper" diff --git a/config/container_customizer.yml b/config/container_customizer.yml index cfa6e00b5..419e92c6c 100644 --- a/config/container_customizer.yml +++ b/config/container_customizer.yml @@ -15,5 +15,5 @@ # Configuration for the Container Customizer framework --- -version: 2.+ +version: 2.6.0_RELEASE repository_root: "{default.repository.root}/container-customizer" diff --git a/config/container_security_provider.yml b/config/container_security_provider.yml index f4d88d84f..29a476e03 100644 --- a/config/container_security_provider.yml +++ b/config/container_security_provider.yml @@ -15,7 +15,7 @@ # Container security provider configuration --- -version: 1.+ +version: 1.20.0_RELEASE repository_root: "{default.repository.root}/container-security-provider" key_manager_enabled: trust_manager_enabled: diff --git a/config/contrast_security_agent.yml b/config/contrast_security_agent.yml index 60b5cae8d..d04c9b663 100644 --- a/config/contrast_security_agent.yml +++ b/config/contrast_security_agent.yml @@ -15,5 +15,5 @@ # Configuration for the ContrastSecurity framework --- -version: 6.+ +version: 6.5.3 repository_root: https://download.run.pivotal.io/contrast-security diff --git a/config/datadog_javaagent.yml b/config/datadog_javaagent.yml index ba5c97a32..d84236044 100644 --- a/config/datadog_javaagent.yml +++ b/config/datadog_javaagent.yml @@ -15,5 +15,5 @@ # Configuration for the Datadog APM Javaagent --- -version: + +version: 1.37.1 repository_root: https://raw.githubusercontent.com/datadog/dd-trace-java/cloudfoundry/ diff --git a/config/elastic_apm_agent.yml b/config/elastic_apm_agent.yml index e9db8ffcf..d27f2566c 100644 --- a/config/elastic_apm_agent.yml +++ b/config/elastic_apm_agent.yml @@ -15,5 +15,5 @@ # Configuration for the Elastic Apm Agent framework --- -version: 1.+ +version: 1.50.0 repository_root: https://raw.githubusercontent.com/elastic/apm-agent-java/master/cloudfoundry diff --git a/config/google_stackdriver_profiler.yml b/config/google_stackdriver_profiler.yml index 470051e04..162c9f662 100644 --- a/config/google_stackdriver_profiler.yml +++ b/config/google_stackdriver_profiler.yml @@ -15,7 +15,7 @@ # Configuration for the Groovy container --- -version: 0.+ +version: 0.1.0 repository_root: "{default.repository.root}/google-stackdriver-profiler/{platform}/{architecture}" application_name: application_version: diff --git a/config/groovy.yml b/config/groovy.yml index bd697ccd6..6032e8962 100644 --- a/config/groovy.yml +++ b/config/groovy.yml @@ -15,5 +15,5 @@ # Configuration for the Groovy container --- -version: 2.5.+ +version: 2.5.23 repository_root: "{default.repository.root}/groovy" diff --git a/config/introscope_agent.yml b/config/introscope_agent.yml index 2675cbf30..48e10e941 100644 --- a/config/introscope_agent.yml +++ b/config/introscope_agent.yml @@ -15,6 +15,6 @@ # Configuration for the CA Wily framework --- -version: + +version: 24.4.2_8 repository_root: https://packages.broadcom.com/artifactory/apm-agents default_agent_name: $(jq -r -n "$VCAP_APPLICATION | .application_name") diff --git a/config/jacoco_agent.yml b/config/jacoco_agent.yml index d26b0bec0..ce157cc1f 100644 --- a/config/jacoco_agent.yml +++ b/config/jacoco_agent.yml @@ -15,5 +15,5 @@ # Configuration for the JaCoco Agent framework --- -version: 0.+ +version: 0.8.12 repository_root: "{default.repository.root}/jacoco" diff --git a/config/java_cf_env.yml b/config/java_cf_env.yml index a021138ff..392afc7e2 100644 --- a/config/java_cf_env.yml +++ b/config/java_cf_env.yml @@ -17,6 +17,6 @@ # See https://github.com/pivotal-cf/java-cfenv for library information --- -version: 3.+ +version: 3.1.5 repository_root: "{default.repository.root}/java-cfenv" enabled: true diff --git a/config/java_memory_assistant.yml b/config/java_memory_assistant.yml index 9f4c87493..179f82127 100644 --- a/config/java_memory_assistant.yml +++ b/config/java_memory_assistant.yml @@ -15,7 +15,7 @@ --- enabled: false agent: - version: 0.+ + version: 0.5.0 repository_root: https://raw.githubusercontent.com/SAP/java-memory-assistant/repository heap_dump_folder: check_interval: 5s @@ -30,12 +30,11 @@ agent: eden: survivor: old_gen: ">600MB" - tenured_gen: - code_heap.non_nmethods: - code_heap.non_profiled_nmethods: - code_heap.profiled_nmethods: - + tenured_gen: + code_heap.non_nmethods: + code_heap.non_profiled_nmethods: + code_heap.profiled_nmethods: clean_up: - version: 0.+ + version: 0.1.0 repository_root: https://raw.githubusercontent.com/SAP/java-memory-assistant-tools/repository-cu max_dump_count: 1 diff --git a/config/jprofiler_profiler.yml b/config/jprofiler_profiler.yml index d741f2f61..21b203601 100644 --- a/config/jprofiler_profiler.yml +++ b/config/jprofiler_profiler.yml @@ -15,7 +15,7 @@ # JMX configuration --- -version: 13.+ +version: 13.0.7 repository_root: https://download.run.pivotal.io/jprofiler enabled: false nowait: true diff --git a/config/jrebel_agent.yml b/config/jrebel_agent.yml index fd197b69e..e24d589e8 100644 --- a/config/jrebel_agent.yml +++ b/config/jrebel_agent.yml @@ -15,6 +15,6 @@ # Configuration for the JRebel framework --- -version: + +version: 2024.3.0 repository_root: https://dl.zeroturnaround.com/jrebel enabled: true diff --git a/config/luna_security_provider.yml b/config/luna_security_provider.yml index e79f7103a..e152912a0 100644 --- a/config/luna_security_provider.yml +++ b/config/luna_security_provider.yml @@ -15,7 +15,7 @@ # Configuration for the Luna Security Provider framework --- -version: 7.+ +version: 7.4.0 repository_root: "{default.repository.root}/luna-security-provider" ha_logging_enabled: true logging_enabled: false diff --git a/config/maria_db_jdbc.yml b/config/maria_db_jdbc.yml index d13bf8d74..5eed29eba 100644 --- a/config/maria_db_jdbc.yml +++ b/config/maria_db_jdbc.yml @@ -15,5 +15,5 @@ # Configuration for the MariaDB JDBC framework --- -version: 2.+ +version: 2.7.9 repository_root: "{default.repository.root}/mariadb-jdbc" diff --git a/config/metric_writer.yml b/config/metric_writer.yml index 7d833ef38..e54218310 100644 --- a/config/metric_writer.yml +++ b/config/metric_writer.yml @@ -15,6 +15,6 @@ # Metric Writer configuration --- -version: 3.+ +version: 3.5.0_RELEASE repository_root: "{default.repository.root}/metric-writer" enabled: false diff --git a/config/new_relic_agent.yml b/config/new_relic_agent.yml index e431d0be1..e5515f5ff 100644 --- a/config/new_relic_agent.yml +++ b/config/new_relic_agent.yml @@ -15,8 +15,8 @@ # Configuration for the New Relic framework --- -version: + +version: 8.12.0 repository_root: https://download.run.pivotal.io/new-relic extensions: version: 1.+ - repository_root: + repository_root: diff --git a/config/open_jdk_jre.yml b/config/open_jdk_jre.yml index 8e706e2fb..f0fffc4a0 100644 --- a/config/open_jdk_jre.yml +++ b/config/open_jdk_jre.yml @@ -16,19 +16,19 @@ # Configuration for JRE repositories keyed by vendor --- jre: - version: 1.8.0_+ + version: 1.8.0_412 version_lines: - - 1.8.0_+ - - 11.+ - - 17.+ - - 21.+ + - 1.8.0_412 + - 11.0.23_10 + - 17.0.11_10 + - 21.0.3_10 repository_root: "{default.repository.root}/openjdk/{platform}/{architecture}" jvmkill_agent: - version: 1.+ + version: 1.17.0_RELEASE repository_root: "{default.repository.root}/jvmkill/{platform}/{architecture}" memory_calculator: - version: 3.+ + version: 3.13.0_RELEASE repository_root: "{default.repository.root}/memory-calculator/{platform}/{architecture}" - class_count: - headroom: + class_count: + headroom: stack_threads: 250 diff --git a/config/open_telemetry_javaagent.yml b/config/open_telemetry_javaagent.yml index 2e45e5713..b264c45a4 100644 --- a/config/open_telemetry_javaagent.yml +++ b/config/open_telemetry_javaagent.yml @@ -15,5 +15,5 @@ # Configuration for the OpenTelemetry Javaagent --- -version: + +version: 2.5.0 repository_root: https://raw.githubusercontent.com/open-telemetry/opentelemetry-java-instrumentation/cloudfoundry/ diff --git a/config/postgresql_jdbc.yml b/config/postgresql_jdbc.yml index 2238a6ba0..5d040d2a4 100644 --- a/config/postgresql_jdbc.yml +++ b/config/postgresql_jdbc.yml @@ -15,5 +15,5 @@ # Configuration for the Postgresql JDBC framework --- -version: 42.+ +version: 42.7.3 repository_root: "{default.repository.root}/postgresql-jdbc" diff --git a/config/riverbed_appinternals_agent.yml b/config/riverbed_appinternals_agent.yml index c628c5ba8..e795b3908 100644 --- a/config/riverbed_appinternals_agent.yml +++ b/config/riverbed_appinternals_agent.yml @@ -15,6 +15,6 @@ # Configuration for the riverbed appinternals agent framework --- -version: 11.+ +version: 11.8.5_BL527 repository_root: https://pcf-instrumentation-download.steelcentral.net/ rvbd_moniker: $(jq -r -n "$VCAP_APPLICATION | .application_name") diff --git a/config/ruby.yml b/config/ruby.yml index 40287d422..fa95147e9 100644 --- a/config/ruby.yml +++ b/config/ruby.yml @@ -15,5 +15,5 @@ # Configuration for Ruby --- -version: 3.1.+ +version: 3.1.3 repository_root: https://raw.githubusercontent.com/cloudfoundry/ruby-buildpack/master/java-index diff --git a/config/sealights_agent.yml b/config/sealights_agent.yml index a75881a85..a15ab6981 100644 --- a/config/sealights_agent.yml +++ b/config/sealights_agent.yml @@ -15,9 +15,9 @@ # Configuration for the SeaLights Agent framework --- -version: + +version: 4.0.2531 repository_root: https://agents.sealights.co/pcf -build_session_id: -lab_id: -proxy: +build_session_id: +lab_id: +proxy: auto_upgrade: false diff --git a/config/sky_walking_agent.yml b/config/sky_walking_agent.yml index dd8f25892..01aca0361 100644 --- a/config/sky_walking_agent.yml +++ b/config/sky_walking_agent.yml @@ -15,6 +15,7 @@ # Configuration for the Sky Walking framework. --- -version: + +version: 9.2.0 repository_root: "{default.repository.root}/sky-walking" -default_application_name: $(jq -r -n "$VCAP_APPLICATION | .space_name + \":\" + .application_name | @sh") +default_application_name: $(jq -r -n "$VCAP_APPLICATION | .space_name + \":\" + .application_name + | @sh") diff --git a/config/splunk_otel_java_agent.yml b/config/splunk_otel_java_agent.yml index 7a3824cf6..996ff0fb3 100644 --- a/config/splunk_otel_java_agent.yml +++ b/config/splunk_otel_java_agent.yml @@ -16,6 +16,5 @@ # Configuration for the Splunk Distribution of OpenTelemetry Java Instrumentation # See https://github.com/signalfx/splunk-otel-java for more information --- -version: + +version: 2.5.0 repository_root: https://raw.githubusercontent.com/signalfx/splunk-otel-java/main/deployments/cloudfoundry/ - \ No newline at end of file diff --git a/config/spring_auto_reconfiguration.yml b/config/spring_auto_reconfiguration.yml index 14e976bff..26e765240 100644 --- a/config/spring_auto_reconfiguration.yml +++ b/config/spring_auto_reconfiguration.yml @@ -17,6 +17,6 @@ # Note that the repository is shared with the Play Auto Reconfiguration framework and should be kept in step to # avoid conflicts. --- -version: 2.+ +version: 2.12.0_RELEASE repository_root: "{default.repository.root}/auto-reconfiguration" enabled: true diff --git a/config/spring_boot_cli.yml b/config/spring_boot_cli.yml index 54d4c8c5b..29f245fca 100644 --- a/config/spring_boot_cli.yml +++ b/config/spring_boot_cli.yml @@ -17,5 +17,5 @@ # Note that the repository is shared with the Play Auto Reconfiguration framework and should be kept in step to # avoid conflicts. --- -version: 2.+ +version: 2.7.18 repository_root: "{default.repository.root}/spring-boot-cli" diff --git a/config/takipi_agent.yml b/config/takipi_agent.yml index dd8407034..6f8c8bf72 100644 --- a/config/takipi_agent.yml +++ b/config/takipi_agent.yml @@ -15,7 +15,7 @@ # Configuration for the Takipi framework --- -version: 4.+ +version: 4.73.3 repository_root: https://get.takipi.com/cloudfoundry node_name_prefix: node application_name: diff --git a/config/tomcat.yml b/config/tomcat.yml index ac2df4789..a8f7d56d5 100644 --- a/config/tomcat.yml +++ b/config/tomcat.yml @@ -16,10 +16,10 @@ # Configuration for the Tomcat container --- tomcat: - version: 9.+ + version: 9.0.90 version_lines: - - 9.+ - - 10.1.+ + - 9.0.90 + - 10.1.25 repository_root: "{default.repository.root}/tomcat" context_path: external_configuration_enabled: false @@ -27,23 +27,21 @@ external_configuration: version: 1.+ repository_root: lifecycle_support: - version: 3.+ + version: 3.4.0_RELEASE repository_root: "{default.repository.root}/tomcat-lifecycle-support" logging_support: - version: 3.+ + version: 3.4.0_RELEASE repository_root: "{default.repository.root}/tomcat-logging-support" access_logging_support: - version: 3.+ + version: 3.4.0_RELEASE repository_root: "{default.repository.root}/tomcat-access-logging-support" access_logging: disabled redis_store: - version: 1.+ + version: 1.3.6_RELEASE repository_root: "{default.repository.root}/redis-store" database: 0 timeout: 2000 connection_pool_size: 2 geode_store: - # The version of Geode Store must be less than or equal to your Tanzu Gemfire for VMs version to ensure compatibility. - # The Geode Store version is pinned to 1.12.4 to be compatible with the most commonly used versions of Tanzu Gemfire for VMs. version: 1.14.9 repository_root: https://java-buildpack-tomcat-gemfire-store.s3-us-west-2.amazonaws.com diff --git a/config/version.yml b/config/version.yml new file mode 100644 index 000000000..088e07c74 --- /dev/null +++ b/config/version.yml @@ -0,0 +1,2 @@ +--- +version: v4.71.0 diff --git a/config/your_kit_profiler.yml b/config/your_kit_profiler.yml index 261bdbda9..98b84d788 100644 --- a/config/your_kit_profiler.yml +++ b/config/your_kit_profiler.yml @@ -15,7 +15,7 @@ # JMX configuration --- -version: + +version: 2024.3.157 repository_root: https://download.run.pivotal.io/your-kit/{platform}/{architecture} enabled: false port: 10001 diff --git a/vendor/bundle/ruby/3.1.0/bin/htmldiff b/vendor/bundle/ruby/3.1.0/bin/htmldiff new file mode 100755 index 000000000..a91f4b64b --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/bin/htmldiff @@ -0,0 +1,29 @@ +#!/usr/bin/env ruby +# +# This file was generated by RubyGems. +# +# The application 'diff-lcs' is installed as part of a gem, and +# this file is here to facilitate running it. +# + +require 'rubygems' + +Gem.use_gemdeps + +version = ">= 0.a" + +str = ARGV.first +if str + str = str.b[/\A_(.*)_\z/, 1] + if str and Gem::Version.correct?(str) + version = str + ARGV.shift + end +end + +if Gem.respond_to?(:activate_bin_path) +load Gem.activate_bin_path('diff-lcs', 'htmldiff', version) +else +gem "diff-lcs", version +load Gem.bin_path("diff-lcs", "htmldiff", version) +end diff --git a/vendor/bundle/ruby/3.1.0/bin/ldiff b/vendor/bundle/ruby/3.1.0/bin/ldiff new file mode 100755 index 000000000..b31792084 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/bin/ldiff @@ -0,0 +1,29 @@ +#!/usr/bin/env ruby +# +# This file was generated by RubyGems. +# +# The application 'diff-lcs' is installed as part of a gem, and +# this file is here to facilitate running it. +# + +require 'rubygems' + +Gem.use_gemdeps + +version = ">= 0.a" + +str = ARGV.first +if str + str = str.b[/\A_(.*)_\z/, 1] + if str and Gem::Version.correct?(str) + version = str + ARGV.shift + end +end + +if Gem.respond_to?(:activate_bin_path) +load Gem.activate_bin_path('diff-lcs', 'ldiff', version) +else +gem "diff-lcs", version +load Gem.bin_path("diff-lcs", "ldiff", version) +end diff --git a/vendor/bundle/ruby/3.1.0/bin/rake b/vendor/bundle/ruby/3.1.0/bin/rake new file mode 100755 index 000000000..3a26cbd4a --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/bin/rake @@ -0,0 +1,29 @@ +#!/usr/bin/env ruby +# +# This file was generated by RubyGems. +# +# The application 'rake' is installed as part of a gem, and +# this file is here to facilitate running it. +# + +require 'rubygems' + +Gem.use_gemdeps + +version = ">= 0.a" + +str = ARGV.first +if str + str = str.b[/\A_(.*)_\z/, 1] + if str and Gem::Version.correct?(str) + version = str + ARGV.shift + end +end + +if Gem.respond_to?(:activate_bin_path) +load Gem.activate_bin_path('rake', 'rake', version) +else +gem "rake", version +load Gem.bin_path("rake", "rake", version) +end diff --git a/vendor/bundle/ruby/3.1.0/bin/redcarpet b/vendor/bundle/ruby/3.1.0/bin/redcarpet new file mode 100755 index 000000000..788edd180 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/bin/redcarpet @@ -0,0 +1,29 @@ +#!/usr/bin/env ruby +# +# This file was generated by RubyGems. +# +# The application 'redcarpet' is installed as part of a gem, and +# this file is here to facilitate running it. +# + +require 'rubygems' + +Gem.use_gemdeps + +version = ">= 0.a" + +str = ARGV.first +if str + str = str.b[/\A_(.*)_\z/, 1] + if str and Gem::Version.correct?(str) + version = str + ARGV.shift + end +end + +if Gem.respond_to?(:activate_bin_path) +load Gem.activate_bin_path('redcarpet', 'redcarpet', version) +else +gem "redcarpet", version +load Gem.bin_path("redcarpet", "redcarpet", version) +end diff --git a/vendor/bundle/ruby/3.1.0/bin/rspec b/vendor/bundle/ruby/3.1.0/bin/rspec new file mode 100755 index 000000000..d2cafd0e5 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/bin/rspec @@ -0,0 +1,29 @@ +#!/usr/bin/env ruby +# +# This file was generated by RubyGems. +# +# The application 'rspec-core' is installed as part of a gem, and +# this file is here to facilitate running it. +# + +require 'rubygems' + +Gem.use_gemdeps + +version = ">= 0.a" + +str = ARGV.first +if str + str = str.b[/\A_(.*)_\z/, 1] + if str and Gem::Version.correct?(str) + version = str + ARGV.shift + end +end + +if Gem.respond_to?(:activate_bin_path) +load Gem.activate_bin_path('rspec-core', 'rspec', version) +else +gem "rspec-core", version +load Gem.bin_path("rspec-core", "rspec", version) +end diff --git a/vendor/bundle/ruby/3.1.0/bin/rubocop b/vendor/bundle/ruby/3.1.0/bin/rubocop new file mode 100755 index 000000000..9115ca0ba --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/bin/rubocop @@ -0,0 +1,29 @@ +#!/usr/bin/env ruby +# +# This file was generated by RubyGems. +# +# The application 'rubocop' is installed as part of a gem, and +# this file is here to facilitate running it. +# + +require 'rubygems' + +Gem.use_gemdeps + +version = ">= 0.a" + +str = ARGV.first +if str + str = str.b[/\A_(.*)_\z/, 1] + if str and Gem::Version.correct?(str) + version = str + ARGV.shift + end +end + +if Gem.respond_to?(:activate_bin_path) +load Gem.activate_bin_path('rubocop', 'rubocop', version) +else +gem "rubocop", version +load Gem.bin_path("rubocop", "rubocop", version) +end diff --git a/vendor/bundle/ruby/3.1.0/bin/ruby-parse b/vendor/bundle/ruby/3.1.0/bin/ruby-parse new file mode 100755 index 000000000..4cbe6e804 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/bin/ruby-parse @@ -0,0 +1,29 @@ +#!/usr/bin/env ruby +# +# This file was generated by RubyGems. +# +# The application 'parser' is installed as part of a gem, and +# this file is here to facilitate running it. +# + +require 'rubygems' + +Gem.use_gemdeps + +version = ">= 0.a" + +str = ARGV.first +if str + str = str.b[/\A_(.*)_\z/, 1] + if str and Gem::Version.correct?(str) + version = str + ARGV.shift + end +end + +if Gem.respond_to?(:activate_bin_path) +load Gem.activate_bin_path('parser', 'ruby-parse', version) +else +gem "parser", version +load Gem.bin_path("parser", "ruby-parse", version) +end diff --git a/vendor/bundle/ruby/3.1.0/bin/ruby-rewrite b/vendor/bundle/ruby/3.1.0/bin/ruby-rewrite new file mode 100755 index 000000000..00c71af8f --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/bin/ruby-rewrite @@ -0,0 +1,29 @@ +#!/usr/bin/env ruby +# +# This file was generated by RubyGems. +# +# The application 'parser' is installed as part of a gem, and +# this file is here to facilitate running it. +# + +require 'rubygems' + +Gem.use_gemdeps + +version = ">= 0.a" + +str = ARGV.first +if str + str = str.b[/\A_(.*)_\z/, 1] + if str and Gem::Version.correct?(str) + version = str + ARGV.shift + end +end + +if Gem.respond_to?(:activate_bin_path) +load Gem.activate_bin_path('parser', 'ruby-rewrite', version) +else +gem "parser", version +load Gem.bin_path("parser", "ruby-rewrite", version) +end diff --git a/vendor/bundle/ruby/3.1.0/bin/yard b/vendor/bundle/ruby/3.1.0/bin/yard new file mode 100755 index 000000000..20f711e52 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/bin/yard @@ -0,0 +1,29 @@ +#!/usr/bin/env ruby +# +# This file was generated by RubyGems. +# +# The application 'yard' is installed as part of a gem, and +# this file is here to facilitate running it. +# + +require 'rubygems' + +Gem.use_gemdeps + +version = ">= 0.a" + +str = ARGV.first +if str + str = str.b[/\A_(.*)_\z/, 1] + if str and Gem::Version.correct?(str) + version = str + ARGV.shift + end +end + +if Gem.respond_to?(:activate_bin_path) +load Gem.activate_bin_path('yard', 'yard', version) +else +gem "yard", version +load Gem.bin_path("yard", "yard", version) +end diff --git a/vendor/bundle/ruby/3.1.0/bin/yardoc b/vendor/bundle/ruby/3.1.0/bin/yardoc new file mode 100755 index 000000000..242937329 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/bin/yardoc @@ -0,0 +1,29 @@ +#!/usr/bin/env ruby +# +# This file was generated by RubyGems. +# +# The application 'yard' is installed as part of a gem, and +# this file is here to facilitate running it. +# + +require 'rubygems' + +Gem.use_gemdeps + +version = ">= 0.a" + +str = ARGV.first +if str + str = str.b[/\A_(.*)_\z/, 1] + if str and Gem::Version.correct?(str) + version = str + ARGV.shift + end +end + +if Gem.respond_to?(:activate_bin_path) +load Gem.activate_bin_path('yard', 'yardoc', version) +else +gem "yard", version +load Gem.bin_path("yard", "yardoc", version) +end diff --git a/vendor/bundle/ruby/3.1.0/bin/yri b/vendor/bundle/ruby/3.1.0/bin/yri new file mode 100755 index 000000000..4c3d5ce59 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/bin/yri @@ -0,0 +1,29 @@ +#!/usr/bin/env ruby +# +# This file was generated by RubyGems. +# +# The application 'yard' is installed as part of a gem, and +# this file is here to facilitate running it. +# + +require 'rubygems' + +Gem.use_gemdeps + +version = ">= 0.a" + +str = ARGV.first +if str + str = str.b[/\A_(.*)_\z/, 1] + if str and Gem::Version.correct?(str) + version = str + ARGV.shift + end +end + +if Gem.respond_to?(:activate_bin_path) +load Gem.activate_bin_path('yard', 'yri', version) +else +gem "yard", version +load Gem.bin_path("yard", "yri", version) +end diff --git a/vendor/bundle/ruby/3.1.0/cache/addressable-2.8.0.gem b/vendor/bundle/ruby/3.1.0/cache/addressable-2.8.0.gem new file mode 100644 index 000000000..1e41e1cd0 Binary files /dev/null and b/vendor/bundle/ruby/3.1.0/cache/addressable-2.8.0.gem differ diff --git a/vendor/bundle/ruby/3.1.0/cache/ast-2.4.2.gem b/vendor/bundle/ruby/3.1.0/cache/ast-2.4.2.gem new file mode 100644 index 000000000..abe164365 Binary files /dev/null and b/vendor/bundle/ruby/3.1.0/cache/ast-2.4.2.gem differ diff --git a/vendor/bundle/ruby/3.1.0/cache/crack-0.4.5.gem b/vendor/bundle/ruby/3.1.0/cache/crack-0.4.5.gem new file mode 100644 index 000000000..d622be1d7 Binary files /dev/null and b/vendor/bundle/ruby/3.1.0/cache/crack-0.4.5.gem differ diff --git a/vendor/bundle/ruby/3.1.0/cache/diff-lcs-1.5.0.gem b/vendor/bundle/ruby/3.1.0/cache/diff-lcs-1.5.0.gem new file mode 100644 index 000000000..3a2585203 Binary files /dev/null and b/vendor/bundle/ruby/3.1.0/cache/diff-lcs-1.5.0.gem differ diff --git a/vendor/bundle/ruby/3.1.0/cache/hashdiff-1.0.1.gem b/vendor/bundle/ruby/3.1.0/cache/hashdiff-1.0.1.gem new file mode 100644 index 000000000..4377d553e Binary files /dev/null and b/vendor/bundle/ruby/3.1.0/cache/hashdiff-1.0.1.gem differ diff --git a/vendor/bundle/ruby/3.1.0/cache/parallel-1.22.1.gem b/vendor/bundle/ruby/3.1.0/cache/parallel-1.22.1.gem new file mode 100644 index 000000000..5208c791b Binary files /dev/null and b/vendor/bundle/ruby/3.1.0/cache/parallel-1.22.1.gem differ diff --git a/vendor/bundle/ruby/3.1.0/cache/parser-3.1.2.0.gem b/vendor/bundle/ruby/3.1.0/cache/parser-3.1.2.0.gem new file mode 100644 index 000000000..d2ce30ac2 Binary files /dev/null and b/vendor/bundle/ruby/3.1.0/cache/parser-3.1.2.0.gem differ diff --git a/vendor/bundle/ruby/3.1.0/cache/public_suffix-4.0.7.gem b/vendor/bundle/ruby/3.1.0/cache/public_suffix-4.0.7.gem new file mode 100644 index 000000000..18c4dfa5b Binary files /dev/null and b/vendor/bundle/ruby/3.1.0/cache/public_suffix-4.0.7.gem differ diff --git a/vendor/bundle/ruby/3.1.0/cache/rainbow-3.1.1.gem b/vendor/bundle/ruby/3.1.0/cache/rainbow-3.1.1.gem new file mode 100644 index 000000000..863181a2e Binary files /dev/null and b/vendor/bundle/ruby/3.1.0/cache/rainbow-3.1.1.gem differ diff --git a/vendor/bundle/ruby/3.1.0/cache/rake-13.0.6.gem b/vendor/bundle/ruby/3.1.0/cache/rake-13.0.6.gem new file mode 100644 index 000000000..19ae80283 Binary files /dev/null and b/vendor/bundle/ruby/3.1.0/cache/rake-13.0.6.gem differ diff --git a/vendor/bundle/ruby/3.1.0/cache/redcarpet-3.5.1.gem b/vendor/bundle/ruby/3.1.0/cache/redcarpet-3.5.1.gem new file mode 100644 index 000000000..f510fa350 Binary files /dev/null and b/vendor/bundle/ruby/3.1.0/cache/redcarpet-3.5.1.gem differ diff --git a/vendor/bundle/ruby/3.1.0/cache/regexp_parser-2.3.1.gem b/vendor/bundle/ruby/3.1.0/cache/regexp_parser-2.3.1.gem new file mode 100644 index 000000000..89a758122 Binary files /dev/null and b/vendor/bundle/ruby/3.1.0/cache/regexp_parser-2.3.1.gem differ diff --git a/vendor/bundle/ruby/3.1.0/cache/rexml-3.2.5.gem b/vendor/bundle/ruby/3.1.0/cache/rexml-3.2.5.gem new file mode 100644 index 000000000..5680fec4c Binary files /dev/null and b/vendor/bundle/ruby/3.1.0/cache/rexml-3.2.5.gem differ diff --git a/vendor/bundle/ruby/3.1.0/cache/rspec-3.11.0.gem b/vendor/bundle/ruby/3.1.0/cache/rspec-3.11.0.gem new file mode 100644 index 000000000..2073e5bed Binary files /dev/null and b/vendor/bundle/ruby/3.1.0/cache/rspec-3.11.0.gem differ diff --git a/vendor/bundle/ruby/3.1.0/cache/rspec-core-3.11.0.gem b/vendor/bundle/ruby/3.1.0/cache/rspec-core-3.11.0.gem new file mode 100644 index 000000000..79cf601fa Binary files /dev/null and b/vendor/bundle/ruby/3.1.0/cache/rspec-core-3.11.0.gem differ diff --git a/vendor/bundle/ruby/3.1.0/cache/rspec-expectations-3.11.0.gem b/vendor/bundle/ruby/3.1.0/cache/rspec-expectations-3.11.0.gem new file mode 100644 index 000000000..1e84c06c1 Binary files /dev/null and b/vendor/bundle/ruby/3.1.0/cache/rspec-expectations-3.11.0.gem differ diff --git a/vendor/bundle/ruby/3.1.0/cache/rspec-mocks-3.11.1.gem b/vendor/bundle/ruby/3.1.0/cache/rspec-mocks-3.11.1.gem new file mode 100644 index 000000000..4ca8fc101 Binary files /dev/null and b/vendor/bundle/ruby/3.1.0/cache/rspec-mocks-3.11.1.gem differ diff --git a/vendor/bundle/ruby/3.1.0/cache/rspec-support-3.11.0.gem b/vendor/bundle/ruby/3.1.0/cache/rspec-support-3.11.0.gem new file mode 100644 index 000000000..0a210569d Binary files /dev/null and b/vendor/bundle/ruby/3.1.0/cache/rspec-support-3.11.0.gem differ diff --git a/vendor/bundle/ruby/3.1.0/cache/rubocop-1.28.2.gem b/vendor/bundle/ruby/3.1.0/cache/rubocop-1.28.2.gem new file mode 100644 index 000000000..4eef195ed Binary files /dev/null and b/vendor/bundle/ruby/3.1.0/cache/rubocop-1.28.2.gem differ diff --git a/vendor/bundle/ruby/3.1.0/cache/rubocop-ast-1.17.0.gem b/vendor/bundle/ruby/3.1.0/cache/rubocop-ast-1.17.0.gem new file mode 100644 index 000000000..48a86cb79 Binary files /dev/null and b/vendor/bundle/ruby/3.1.0/cache/rubocop-ast-1.17.0.gem differ diff --git a/vendor/bundle/ruby/3.1.0/cache/rubocop-rspec-2.10.0.gem b/vendor/bundle/ruby/3.1.0/cache/rubocop-rspec-2.10.0.gem new file mode 100644 index 000000000..7f32b55af Binary files /dev/null and b/vendor/bundle/ruby/3.1.0/cache/rubocop-rspec-2.10.0.gem differ diff --git a/vendor/bundle/ruby/3.1.0/cache/ruby-progressbar-1.11.0.gem b/vendor/bundle/ruby/3.1.0/cache/ruby-progressbar-1.11.0.gem new file mode 100644 index 000000000..a9d84e50b Binary files /dev/null and b/vendor/bundle/ruby/3.1.0/cache/ruby-progressbar-1.11.0.gem differ diff --git a/vendor/bundle/ruby/3.1.0/cache/rubyzip-2.3.2.gem b/vendor/bundle/ruby/3.1.0/cache/rubyzip-2.3.2.gem new file mode 100644 index 000000000..36fdea607 Binary files /dev/null and b/vendor/bundle/ruby/3.1.0/cache/rubyzip-2.3.2.gem differ diff --git a/vendor/bundle/ruby/3.1.0/cache/tee-1.0.0.gem b/vendor/bundle/ruby/3.1.0/cache/tee-1.0.0.gem new file mode 100644 index 000000000..06f6fa721 Binary files /dev/null and b/vendor/bundle/ruby/3.1.0/cache/tee-1.0.0.gem differ diff --git a/vendor/bundle/ruby/3.1.0/cache/terminal-table-3.0.2.gem b/vendor/bundle/ruby/3.1.0/cache/terminal-table-3.0.2.gem new file mode 100644 index 000000000..cab512cfd Binary files /dev/null and b/vendor/bundle/ruby/3.1.0/cache/terminal-table-3.0.2.gem differ diff --git a/vendor/bundle/ruby/3.1.0/cache/unicode-display_width-2.1.0.gem b/vendor/bundle/ruby/3.1.0/cache/unicode-display_width-2.1.0.gem new file mode 100644 index 000000000..bec8f2a7c Binary files /dev/null and b/vendor/bundle/ruby/3.1.0/cache/unicode-display_width-2.1.0.gem differ diff --git a/vendor/bundle/ruby/3.1.0/cache/webmock-3.14.0.gem b/vendor/bundle/ruby/3.1.0/cache/webmock-3.14.0.gem new file mode 100644 index 000000000..2db2e0457 Binary files /dev/null and b/vendor/bundle/ruby/3.1.0/cache/webmock-3.14.0.gem differ diff --git a/vendor/bundle/ruby/3.1.0/cache/webrick-1.7.0.gem b/vendor/bundle/ruby/3.1.0/cache/webrick-1.7.0.gem new file mode 100644 index 000000000..127b8368b Binary files /dev/null and b/vendor/bundle/ruby/3.1.0/cache/webrick-1.7.0.gem differ diff --git a/vendor/bundle/ruby/3.1.0/cache/yard-0.9.27.gem b/vendor/bundle/ruby/3.1.0/cache/yard-0.9.27.gem new file mode 100644 index 000000000..9e9bff1b8 Binary files /dev/null and b/vendor/bundle/ruby/3.1.0/cache/yard-0.9.27.gem differ diff --git a/vendor/bundle/ruby/3.1.0/extensions/x86_64-linux/3.1.0/redcarpet-3.5.1/gem.build_complete b/vendor/bundle/ruby/3.1.0/extensions/x86_64-linux/3.1.0/redcarpet-3.5.1/gem.build_complete new file mode 100644 index 000000000..e69de29bb diff --git a/vendor/bundle/ruby/3.1.0/extensions/x86_64-linux/3.1.0/redcarpet-3.5.1/gem_make.out b/vendor/bundle/ruby/3.1.0/extensions/x86_64-linux/3.1.0/redcarpet-3.5.1/gem_make.out new file mode 100644 index 000000000..3dad54ae6 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/extensions/x86_64-linux/3.1.0/redcarpet-3.5.1/gem_make.out @@ -0,0 +1,116 @@ +current directory: /home/runner/work/java-buildpack-release/java-buildpack-release/java-buildpack/vendor/bundle/ruby/3.1.0/gems/redcarpet-3.5.1/ext/redcarpet +/opt/hostedtoolcache/Ruby/3.1.6/x64/bin/ruby -I /opt/hostedtoolcache/Ruby/3.1.6/x64/lib/ruby/3.1.0 extconf.rb +creating Makefile + +current directory: /home/runner/work/java-buildpack-release/java-buildpack-release/java-buildpack/vendor/bundle/ruby/3.1.0/gems/redcarpet-3.5.1/ext/redcarpet +make DESTDIR\= sitearchdir\=./.gem.20240717-1584-9okv0z sitelibdir\=./.gem.20240717-1584-9okv0z clean + +current directory: /home/runner/work/java-buildpack-release/java-buildpack-release/java-buildpack/vendor/bundle/ruby/3.1.0/gems/redcarpet-3.5.1/ext/redcarpet +make DESTDIR\= sitearchdir\=./.gem.20240717-1584-9okv0z sitelibdir\=./.gem.20240717-1584-9okv0z +compiling autolink.c +compiling buffer.c +buffer.c: In function ‘bufcstr’: +buffer.c:111:52: warning: passing argument 1 of ‘bufgrow’ discards ‘const’ qualifier from pointer target type [-Wdiscarded-qualifiers] + 111 | if (buf->size + 1 <= buf->asize || bufgrow(buf, buf->size + 1) == BUF_OK) { + | ^~~ +buffer.c:60:21: note: expected ‘struct buf *’ but argument is of type ‘const struct buf *’ + 60 | bufgrow(struct buf *buf, size_t neosz) + | ~~~~~~~~~~~~^~~ +buffer.c: At top level: +cc1: note: unrecognized command-line option ‘-Wno-self-assign’ may have been intended to silence earlier diagnostics +cc1: note: unrecognized command-line option ‘-Wno-parentheses-equality’ may have been intended to silence earlier diagnostics +cc1: note: unrecognized command-line option ‘-Wno-constant-logical-operand’ may have been intended to silence earlier diagnostics +compiling houdini_href_e.c +compiling houdini_html_e.c +compiling html.c +compiling html_smartypants.c +html_smartypants.c: In function ‘squote_len’: +html_smartypants.c:104:46: warning: initialization discards ‘const’ qualifier from pointer target type [-Wdiscarded-qualifiers] + 104 | static char* single_quote_list[] = { "'", "'", "'", "'", NULL }; + | ^~~ +html_smartypants.c:104:51: warning: initialization discards ‘const’ qualifier from pointer target type [-Wdiscarded-qualifiers] + 104 | static char* single_quote_list[] = { "'", "'", "'", "'", NULL }; + | ^~~~~~~ +html_smartypants.c:104:60: warning: initialization discards ‘const’ qualifier from pointer target type [-Wdiscarded-qualifiers] + 104 | static char* single_quote_list[] = { "'", "'", "'", "'", NULL }; + | ^~~~~~~~ +html_smartypants.c:104:70: warning: initialization discards ‘const’ qualifier from pointer target type [-Wdiscarded-qualifiers] + 104 | static char* single_quote_list[] = { "'", "'", "'", "'", NULL }; + | ^~~~~~~~ +html_smartypants.c: In function ‘smartypants_squote’: +html_smartypants.c:149:51: warning: comparison of integer expressions of different signedness: ‘size_t’ {aka ‘long unsigned int’} and ‘int’ [-Wsign-compare] + 149 | uint8_t next_char = (size > 1+next_squote_len) ? text[1+next_squote_len] : 0; + | ^ +html_smartypants.c: In function ‘smartypants_cb__ltag’: +html_smartypants.c:385:55: warning: pointer targets in passing argument 2 of ‘strncmp’ differ in signedness [-Wpointer-sign] + 385 | if (next_to_closing_a && strncmp("'", text+(i+1), 5) == 0) { + | ~~~~^~~~~~ + | | + | const uint8_t * {aka const unsigned char *} +In file included from html_smartypants.c:26: +/usr/include/string.h:159:51: note: expected ‘const char *’ but argument is of type ‘const uint8_t *’ {aka ‘const unsigned char *’} + 159 | extern int strncmp (const char *__s1, const char *__s2, size_t __n) + | ~~~~~~~~~~~~^~~~ +html_smartypants.c: At top level: +cc1: note: unrecognized command-line option ‘-Wno-self-assign’ may have been intended to silence earlier diagnostics +cc1: note: unrecognized command-line option ‘-Wno-parentheses-equality’ may have been intended to silence earlier diagnostics +cc1: note: unrecognized command-line option ‘-Wno-constant-logical-operand’ may have been intended to silence earlier diagnostics +compiling markdown.c +In file included from markdown.c:46: +html_blocks.h: In function ‘hash_block_tag’: +html_blocks.h:91:1: warning: old-style function definition [-Wold-style-definition] + 91 | hash_block_tag (str, len) + | ^~~~~~~~~~~~~~ +html_blocks.h: In function ‘find_block_tag’: +html_blocks.h:139:1: warning: old-style function definition [-Wold-style-definition] + 139 | find_block_tag (str, len) + | ^~~~~~~~~~~~~~ +markdown.c: In function ‘char_link’: +markdown.c:1094:33: warning: this ‘else’ clause does not guard... [-Wmisleading-indentation] + 1094 | else nb_p--; i++; + | ^~~~ +markdown.c:1094:46: note: ...this statement, but the latter is misleadingly indented as if it were guarded by the ‘else’ + 1094 | else nb_p--; i++; + | ^ +markdown.c: In function ‘sd_markdown_render’: +markdown.c:2836:66: warning: passing argument 1 of ‘is_codefence’ discards ‘const’ qualifier from pointer target type [-Wdiscarded-qualifiers] + 2836 | if (codefences_enabled && (is_codefence(document + beg, doc_size - beg, NULL) != 0)) + | ~~~~~~~~~^~~~~ +markdown.c:1389:23: note: expected ‘uint8_t *’ {aka ‘unsigned char *’} but argument is of type ‘const uint8_t *’ {aka ‘const unsigned char *’} + 1389 | is_codefence(uint8_t *data, size_t size, struct buf *syntax) + | ~~~~~~~~~^~~~ +markdown.c: At top level: +markdown.c:94:15: warning: ‘char_underline’ declared ‘static’ but never defined [-Wunused-function] + 94 | static size_t char_underline(struct buf *ob, struct sd_markdown *rndr, uint8_t *data, size_t offset, size_t size); + | ^~~~~~~~~~~~~~ +cc1: note: unrecognized command-line option ‘-Wno-self-assign’ may have been intended to silence earlier diagnostics +cc1: note: unrecognized command-line option ‘-Wno-parentheses-equality’ may have been intended to silence earlier diagnostics +cc1: note: unrecognized command-line option ‘-Wno-constant-logical-operand’ may have been intended to silence earlier diagnostics +compiling rc_markdown.c +rc_markdown.c: In function ‘Init_redcarpet’: +rc_markdown.c:174:6: warning: old-style function definition [-Wold-style-definition] + 174 | void Init_redcarpet() + | ^~~~~~~~~~~~~~ +rc_markdown.c: At top level: +cc1: note: unrecognized command-line option ‘-Wno-self-assign’ may have been intended to silence earlier diagnostics +cc1: note: unrecognized command-line option ‘-Wno-parentheses-equality’ may have been intended to silence earlier diagnostics +cc1: note: unrecognized command-line option ‘-Wno-constant-logical-operand’ may have been intended to silence earlier diagnostics +compiling rc_render.c +rc_render.c: In function ‘rndr_link_attributes’: +rc_render.c:287:35: warning: variable ‘rndr’ set but not used [-Wunused-but-set-variable] + 287 | struct rb_redcarpet_rndr *rndr; + | ^~~~ +rc_render.c: In function ‘Init_redcarpet_rndr’: +rc_render.c:552:6: warning: old-style function definition [-Wold-style-definition] + 552 | void Init_redcarpet_rndr() + | ^~~~~~~~~~~~~~~~~~~ +rc_render.c: At top level: +cc1: note: unrecognized command-line option ‘-Wno-self-assign’ may have been intended to silence earlier diagnostics +cc1: note: unrecognized command-line option ‘-Wno-parentheses-equality’ may have been intended to silence earlier diagnostics +cc1: note: unrecognized command-line option ‘-Wno-constant-logical-operand’ may have been intended to silence earlier diagnostics +compiling stack.c +linking shared-object redcarpet.so + +current directory: /home/runner/work/java-buildpack-release/java-buildpack-release/java-buildpack/vendor/bundle/ruby/3.1.0/gems/redcarpet-3.5.1/ext/redcarpet +make DESTDIR\= sitearchdir\=./.gem.20240717-1584-9okv0z sitelibdir\=./.gem.20240717-1584-9okv0z install +/usr/bin/install -c -m 0755 redcarpet.so ./.gem.20240717-1584-9okv0z diff --git a/vendor/bundle/ruby/3.1.0/extensions/x86_64-linux/3.1.0/redcarpet-3.5.1/redcarpet.so b/vendor/bundle/ruby/3.1.0/extensions/x86_64-linux/3.1.0/redcarpet-3.5.1/redcarpet.so new file mode 100755 index 000000000..357107187 Binary files /dev/null and b/vendor/bundle/ruby/3.1.0/extensions/x86_64-linux/3.1.0/redcarpet-3.5.1/redcarpet.so differ diff --git a/vendor/bundle/ruby/3.1.0/gems/addressable-2.8.0/CHANGELOG.md b/vendor/bundle/ruby/3.1.0/gems/addressable-2.8.0/CHANGELOG.md new file mode 100644 index 000000000..4a9f8668e --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/addressable-2.8.0/CHANGELOG.md @@ -0,0 +1,246 @@ +# Addressable 2.8.0 +- fixes ReDoS vulnerability in Addressable::Template#match +- no longer replaces `+` with spaces in queries for non-http(s) schemes +- fixed encoding ipv6 literals +- the `:compacted` flag for `normalized_query` now dedupes parameters +- fix broken `escape_component` alias +- dropping support for Ruby 2.0 and 2.1 +- adding Ruby 3.0 compatibility for development tasks +- drop support for `rack-mount` and remove Addressable::Template#generate +- performance improvements +- switch CI/CD to GitHub Actions + +# Addressable 2.7.0 +- added `:compacted` flag to `normalized_query` +- `heuristic_parse` handles `mailto:` more intuitively +- dropped explicit support for JRuby 9.0.5.0 +- compatibility w/ public_suffix 4.x +- performance improvements + +# Addressable 2.6.0 +- added `tld=` method to allow assignment to the public suffix +- most `heuristic_parse` patterns are now case-insensitive +- `heuristic_parse` handles more `file://` URI variations +- fixes bug in `heuristic_parse` when uri starts with digit +- fixes bug in `request_uri=` with query strings +- fixes template issues with `nil` and `?` operator +- `frozen_string_literal` pragmas added +- minor performance improvements in regexps +- fixes to eliminate warnings + +# Addressable 2.5.2 +- better support for frozen string literals +- fixed bug w/ uppercase characters in scheme +- IDNA errors w/ emoji URLs +- compatibility w/ public_suffix 3.x + +# Addressable 2.5.1 +- allow unicode normalization to be disabled for URI Template expansion +- removed duplicate test + +# Addressable 2.5.0 +- dropping support for Ruby 1.9 +- adding support for Ruby 2.4 preview +- add support for public suffixes and tld; first runtime dependency +- hostname escaping should match RFC; underscores in hostnames no longer escaped +- paths beginning with // and missing an authority are now considered invalid +- validation now also takes place after setting a path +- handle backslashes in authority more like a browser for `heuristic_parse` +- unescaped backslashes in host now raise an `InvalidURIError` +- `merge!`, `join!`, `omit!` and `normalize!` don't disable deferred validation +- `heuristic_parse` now trims whitespace before parsing +- host parts longer than 63 bytes will be ignored and not passed to libidn +- normalized values always encoded as UTF-8 + +# Addressable 2.4.0 +- support for 1.8.x dropped +- double quotes in a host now raises an error +- newlines in host will no longer get unescaped during normalization +- stricter handling of bogus scheme values +- stricter handling of encoded port values +- calling `require 'addressable'` will now load both the URI and Template files +- assigning to the `hostname` component with an `IPAddr` object is now supported +- assigning to the `origin` component is now supported +- fixed minor bug where an exception would be thrown for a missing ACE suffix +- better partial expansion of URI templates + +# Addressable 2.3.8 +- fix warnings +- update dependency gems +- support for 1.8.x officially deprecated + +# Addressable 2.3.7 +- fix scenario in which invalid URIs don't get an exception until inspected +- handle hostnames with two adjacent periods correctly +- upgrade of RSpec + +# Addressable 2.3.6 +- normalization drops empty query string +- better handling in template extract for missing values +- template modifier for `'?'` now treated as optional +- fixed issue where character class parameters were modified +- templates can now be tested for equality +- added `:sorted` option to normalization of query strings +- fixed issue with normalization of hosts given in `'example.com.'` form + +# Addressable 2.3.5 +- added Addressable::URI#empty? method +- Addressable::URI#hostname methods now strip square brackets from IPv6 hosts +- compatibility with Net::HTTP in Ruby 2.0.0 +- Addressable::URI#route_from should always give relative URIs + +# Addressable 2.3.4 +- fixed issue with encoding altering its inputs +- query string normalization now leaves ';' characters alone +- FakeFS is detected before attempting to load unicode tables +- additional testing to ensure frozen objects don't cause problems + +# Addressable 2.3.3 +- fixed issue with converting common primitives during template expansion +- fixed port encoding issue +- removed a few warnings +- normalize should now ignore %2B in query strings +- the IDNA logic should now be handled by libidn in Ruby 1.9 +- no template match should now result in nil instead of an empty MatchData +- added license information to gemspec + +# Addressable 2.3.2 +- added Addressable::URI#default_port method +- fixed issue with Marshalling Unicode data on Windows +- improved heuristic parsing to better handle IPv4 addresses + +# Addressable 2.3.1 +- fixed missing unicode data file + +# Addressable 2.3.0 +- updated Addressable::Template to use RFC 6570, level 4 +- fixed compatibility problems with some versions of Ruby +- moved unicode tables into a data file for performance reasons +- removing support for multiple query value notations + +# Addressable 2.2.8 +- fixed issues with dot segment removal code +- form encoding can now handle multiple values per key +- updated development environment + +# Addressable 2.2.7 +- fixed issues related to Addressable::URI#query_values= +- the Addressable::URI.parse method is now polymorphic + +# Addressable 2.2.6 +- changed the way ambiguous paths are handled +- fixed bug with frozen URIs +- https supported in heuristic parsing + +# Addressable 2.2.5 +- 'parsing' a pre-parsed URI object is now a dup operation +- introduced conditional support for libidn +- fixed normalization issue on ampersands in query strings +- added additional tests around handling of query strings + +# Addressable 2.2.4 +- added origin support from draft-ietf-websec-origin-00 +- resolved issue with attempting to navigate below root +- fixed bug with string splitting in query strings + +# Addressable 2.2.3 +- added :flat_array notation for query strings + +# Addressable 2.2.2 +- fixed issue with percent escaping of '+' character in query strings + +# Addressable 2.2.1 +- added support for application/x-www-form-urlencoded. + +# Addressable 2.2.0 +- added site methods +- improved documentation + +# Addressable 2.1.2 +- added HTTP request URI methods +- better handling of Windows file paths +- validation_deferred boolean replaced with defer_validation block +- normalization of percent-encoded paths should now be correct +- fixed issue with constructing URIs with relative paths +- fixed warnings + +# Addressable 2.1.1 +- more type checking changes +- fixed issue with unicode normalization +- added method to find template defaults +- symbolic keys are now allowed in template mappings +- numeric values and symbolic values are now allowed in template mappings + +# Addressable 2.1.0 +- refactored URI template support out into its own class +- removed extract method due to being useless and unreliable +- removed Addressable::URI.expand_template +- removed Addressable::URI#extract_mapping +- added partial template expansion +- fixed minor bugs in the parse and heuristic_parse methods +- fixed incompatibility with Ruby 1.9.1 +- fixed bottleneck in Addressable::URI#hash and Addressable::URI#to_s +- fixed unicode normalization exception +- updated query_values methods to better handle subscript notation +- worked around issue with freezing URIs +- improved specs + +# Addressable 2.0.2 +- fixed issue with URI template expansion +- fixed issue with percent escaping characters 0-15 + +# Addressable 2.0.1 +- fixed issue with query string assignment +- fixed issue with improperly encoded components + +# Addressable 2.0.0 +- the initialize method now takes an options hash as its only parameter +- added query_values method to URI class +- completely replaced IDNA implementation with pure Ruby +- renamed Addressable::ADDRESSABLE_VERSION to Addressable::VERSION +- completely reworked the Rakefile +- changed the behavior of the port method significantly +- Addressable::URI.encode_segment, Addressable::URI.unencode_segment renamed +- documentation is now in YARD format +- more rigorous type checking +- to_str method implemented, implicit conversion to Strings now allowed +- Addressable::URI#omit method added, Addressable::URI#merge method replaced +- updated URI Template code to match v 03 of the draft spec +- added a bunch of new specifications + +# Addressable 1.0.4 +- switched to using RSpec's pending system for specs that rely on IDN +- fixed issue with creating URIs with paths that are not prefixed with '/' + +# Addressable 1.0.3 +- implemented a hash method + +# Addressable 1.0.2 +- fixed minor bug with the extract_mapping method + +# Addressable 1.0.1 +- fixed minor bug with the extract_mapping method + +# Addressable 1.0.0 +- heuristic parse method added +- parsing is slightly more strict +- replaced to_h with to_hash +- fixed routing methods +- improved specifications +- improved heckle rake task +- no surviving heckle mutations + +# Addressable 0.1.2 +- improved normalization +- fixed bug in joining algorithm +- updated specifications + +# Addressable 0.1.1 +- updated documentation +- added URI Template variable extraction + +# Addressable 0.1.0 +- initial release +- implementation based on RFC 3986, 3987 +- support for IRIs via libidn +- support for the URI Template draft spec diff --git a/vendor/bundle/ruby/3.1.0/gems/addressable-2.8.0/Gemfile b/vendor/bundle/ruby/3.1.0/gems/addressable-2.8.0/Gemfile new file mode 100644 index 000000000..2684c1543 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/addressable-2.8.0/Gemfile @@ -0,0 +1,28 @@ +# frozen_string_literal: true + +source 'https://rubygems.org' + +gemspec(path: __FILE__ == "(eval)" ? ".." : ".") + +group :test do + gem 'rspec', '~> 3.8' + gem 'rspec-its', '~> 1.3' +end + +group :coverage do + gem "coveralls", "> 0.7", require: false, platforms: :mri + gem "simplecov", require: false +end + +group :development do + gem 'launchy', '~> 2.4', '>= 2.4.3' + gem 'redcarpet', :platform => :mri_19 + gem 'yard' +end + +group :test, :development do + gem 'memory_profiler' + gem "rake", ">= 12.3.3" +end + +gem "idn-ruby", platform: :mri diff --git a/vendor/bundle/ruby/3.1.0/gems/addressable-2.8.0/LICENSE.txt b/vendor/bundle/ruby/3.1.0/gems/addressable-2.8.0/LICENSE.txt new file mode 100644 index 000000000..ef51da2b0 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/addressable-2.8.0/LICENSE.txt @@ -0,0 +1,202 @@ + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + +TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + +1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + +2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + +3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + +4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + +5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + +6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + +7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + +8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + +9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + +END OF TERMS AND CONDITIONS + +APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + +Copyright [yyyy] [name of copyright owner] + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. diff --git a/vendor/bundle/ruby/3.1.0/gems/addressable-2.8.0/README.md b/vendor/bundle/ruby/3.1.0/gems/addressable-2.8.0/README.md new file mode 100644 index 000000000..9892f6151 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/addressable-2.8.0/README.md @@ -0,0 +1,121 @@ +# Addressable + +
+
Homepage
github.com/sporkmonger/addressable
+
Author
Bob Aman
+
Copyright
Copyright © Bob Aman
+
License
Apache 2.0
+
+ +[![Gem Version](https://img.shields.io/gem/dt/addressable.svg)][gem] +[![Build Status](https://github.com/sporkmonger/addressable/workflows/CI/badge.svg)][actions] +[![Test Coverage Status](https://img.shields.io/coveralls/sporkmonger/addressable.svg)][coveralls] +[![Documentation Coverage Status](https://inch-ci.org/github/sporkmonger/addressable.svg?branch=master)][inch] + +[gem]: https://rubygems.org/gems/addressable +[actions]: https://github.com/sporkmonger/addressable/actions +[coveralls]: https://coveralls.io/r/sporkmonger/addressable +[inch]: https://inch-ci.org/github/sporkmonger/addressable + +# Description + +Addressable is an alternative implementation to the URI implementation +that is part of Ruby's standard library. It is flexible, offers heuristic +parsing, and additionally provides extensive support for IRIs and URI templates. + +Addressable closely conforms to RFC 3986, RFC 3987, and RFC 6570 (level 4). + +# Reference + +- {Addressable::URI} +- {Addressable::Template} + +# Example usage + +```ruby +require "addressable/uri" + +uri = Addressable::URI.parse("http://example.com/path/to/resource/") +uri.scheme +#=> "http" +uri.host +#=> "example.com" +uri.path +#=> "/path/to/resource/" + +uri = Addressable::URI.parse("http://www.詹姆斯.com/") +uri.normalize +#=> # +``` + + +# URI Templates + +For more details, see [RFC 6570](https://www.rfc-editor.org/rfc/rfc6570.txt). + + +```ruby + +require "addressable/template" + +template = Addressable::Template.new("http://example.com/{?query*}") +template.expand({ + "query" => { + 'foo' => 'bar', + 'color' => 'red' + } +}) +#=> # + +template = Addressable::Template.new("http://example.com/{?one,two,three}") +template.partial_expand({"one" => "1", "three" => 3}).pattern +#=> "http://example.com/?one=1{&two}&three=3" + +template = Addressable::Template.new( + "http://{host}{/segments*}/{?one,two,bogus}{#fragment}" +) +uri = Addressable::URI.parse( + "http://example.com/a/b/c/?one=1&two=2#foo" +) +template.extract(uri) +#=> +# { +# "host" => "example.com", +# "segments" => ["a", "b", "c"], +# "one" => "1", +# "two" => "2", +# "fragment" => "foo" +# } +``` + +# Install + +```console +$ gem install addressable +``` + +You may optionally turn on native IDN support by installing libidn and the +idn gem: + +```console +$ sudo apt-get install libidn11-dev # Debian/Ubuntu +$ brew install libidn # OS X +$ gem install idn-ruby +``` + +# Semantic Versioning + +This project uses [Semantic Versioning](https://semver.org/). You can (and should) specify your +dependency using a pessimistic version constraint covering the major and minor +values: + +```ruby +spec.add_dependency 'addressable', '~> 2.7' +``` + +If you need a specific bug fix, you can also specify minimum tiny versions +without preventing updates to the latest minor release: + +```ruby +spec.add_dependency 'addressable', '~> 2.3', '>= 2.3.7' +``` diff --git a/vendor/bundle/ruby/3.1.0/gems/addressable-2.8.0/Rakefile b/vendor/bundle/ruby/3.1.0/gems/addressable-2.8.0/Rakefile new file mode 100644 index 000000000..b7e0ff31e --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/addressable-2.8.0/Rakefile @@ -0,0 +1,34 @@ +# frozen_string_literal: true + +require 'rubygems' +require 'rake' + +require File.join(File.dirname(__FILE__), 'lib', 'addressable', 'version') + +PKG_DISPLAY_NAME = 'Addressable' +PKG_NAME = PKG_DISPLAY_NAME.downcase +PKG_VERSION = Addressable::VERSION::STRING +PKG_FILE_NAME = "#{PKG_NAME}-#{PKG_VERSION}" + +RELEASE_NAME = "REL #{PKG_VERSION}" + +PKG_SUMMARY = "URI Implementation" +PKG_DESCRIPTION = <<-TEXT +Addressable is an alternative implementation to the URI implementation that is +part of Ruby's standard library. It is flexible, offers heuristic parsing, and +additionally provides extensive support for IRIs and URI templates. +TEXT + +PKG_FILES = FileList[ + "lib/**/*", "spec/**/*", "vendor/**/*", "data/**/*", + "tasks/**/*", + "[A-Z]*", "Rakefile" +].exclude(/pkg/).exclude(/database\.yml/). + exclude(/Gemfile\.lock/).exclude(/[_\.]git$/) + +task :default => "spec" + +WINDOWS = (RUBY_PLATFORM =~ /mswin|win32|mingw|bccwin|cygwin/) rescue false +SUDO = WINDOWS ? '' : ('sudo' unless ENV['SUDOLESS']) + +Dir['tasks/**/*.rake'].each { |rake| load rake } diff --git a/vendor/bundle/ruby/3.1.0/gems/addressable-2.8.0/addressable.gemspec b/vendor/bundle/ruby/3.1.0/gems/addressable-2.8.0/addressable.gemspec new file mode 100644 index 000000000..12666a068 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/addressable-2.8.0/addressable.gemspec @@ -0,0 +1,37 @@ +# -*- encoding: utf-8 -*- +# stub: addressable 2.8.0 ruby lib + +Gem::Specification.new do |s| + s.name = "addressable".freeze + s.version = "2.8.0" + + s.required_rubygems_version = Gem::Requirement.new(">= 0".freeze) if s.respond_to? :required_rubygems_version= + s.require_paths = ["lib".freeze] + s.authors = ["Bob Aman".freeze] + s.date = "2021-07-03" + s.description = "Addressable is an alternative implementation to the URI implementation that is\npart of Ruby's standard library. It is flexible, offers heuristic parsing, and\nadditionally provides extensive support for IRIs and URI templates.\n".freeze + s.email = "bob@sporkmonger.com".freeze + s.extra_rdoc_files = ["README.md".freeze] + s.files = ["CHANGELOG.md".freeze, "Gemfile".freeze, "LICENSE.txt".freeze, "README.md".freeze, "Rakefile".freeze, "addressable.gemspec".freeze, "data/unicode.data".freeze, "lib/addressable.rb".freeze, "lib/addressable/idna.rb".freeze, "lib/addressable/idna/native.rb".freeze, "lib/addressable/idna/pure.rb".freeze, "lib/addressable/template.rb".freeze, "lib/addressable/uri.rb".freeze, "lib/addressable/version.rb".freeze, "spec/addressable/idna_spec.rb".freeze, "spec/addressable/net_http_compat_spec.rb".freeze, "spec/addressable/security_spec.rb".freeze, "spec/addressable/template_spec.rb".freeze, "spec/addressable/uri_spec.rb".freeze, "spec/spec_helper.rb".freeze, "tasks/clobber.rake".freeze, "tasks/gem.rake".freeze, "tasks/git.rake".freeze, "tasks/metrics.rake".freeze, "tasks/profile.rake".freeze, "tasks/rspec.rake".freeze, "tasks/yard.rake".freeze] + s.homepage = "https://github.com/sporkmonger/addressable".freeze + s.licenses = ["Apache-2.0".freeze] + s.rdoc_options = ["--main".freeze, "README.md".freeze] + s.required_ruby_version = Gem::Requirement.new(">= 2.0".freeze) + s.rubygems_version = "3.0.3".freeze + s.summary = "URI Implementation".freeze + + if s.respond_to? :specification_version then + s.specification_version = 4 + + if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then + s.add_runtime_dependency(%q.freeze, [">= 2.0.2", "< 5.0"]) + s.add_development_dependency(%q.freeze, [">= 1.0", "< 3.0"]) + else + s.add_dependency(%q.freeze, [">= 2.0.2", "< 5.0"]) + s.add_dependency(%q.freeze, [">= 1.0", "< 3.0"]) + end + else + s.add_dependency(%q.freeze, [">= 2.0.2", "< 5.0"]) + s.add_dependency(%q.freeze, [">= 1.0", "< 3.0"]) + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/addressable-2.8.0/data/unicode.data b/vendor/bundle/ruby/3.1.0/gems/addressable-2.8.0/data/unicode.data new file mode 100644 index 000000000..cdfc22418 Binary files /dev/null and b/vendor/bundle/ruby/3.1.0/gems/addressable-2.8.0/data/unicode.data differ diff --git a/vendor/bundle/ruby/3.1.0/gems/addressable-2.8.0/lib/addressable.rb b/vendor/bundle/ruby/3.1.0/gems/addressable-2.8.0/lib/addressable.rb new file mode 100644 index 000000000..b4e98b696 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/addressable-2.8.0/lib/addressable.rb @@ -0,0 +1,4 @@ +# frozen_string_literal: true + +require 'addressable/uri' +require 'addressable/template' diff --git a/vendor/bundle/ruby/3.1.0/gems/addressable-2.8.0/lib/addressable/idna.rb b/vendor/bundle/ruby/3.1.0/gems/addressable-2.8.0/lib/addressable/idna.rb new file mode 100644 index 000000000..e41c1f5da --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/addressable-2.8.0/lib/addressable/idna.rb @@ -0,0 +1,27 @@ +# frozen_string_literal: true + +# encoding:utf-8 +#-- +# Copyright (C) Bob Aman +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +#++ + + +begin + require "addressable/idna/native" +rescue LoadError + # libidn or the idn gem was not available, fall back on a pure-Ruby + # implementation... + require "addressable/idna/pure" +end diff --git a/vendor/bundle/ruby/3.1.0/gems/addressable-2.8.0/lib/addressable/idna/native.rb b/vendor/bundle/ruby/3.1.0/gems/addressable-2.8.0/lib/addressable/idna/native.rb new file mode 100644 index 000000000..84de8e8cb --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/addressable-2.8.0/lib/addressable/idna/native.rb @@ -0,0 +1,61 @@ +# frozen_string_literal: true + +# encoding:utf-8 +#-- +# Copyright (C) Bob Aman +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +#++ + + +require "idn" + +module Addressable + module IDNA + def self.punycode_encode(value) + IDN::Punycode.encode(value.to_s) + end + + def self.punycode_decode(value) + IDN::Punycode.decode(value.to_s) + end + + def self.unicode_normalize_kc(value) + IDN::Stringprep.nfkc_normalize(value.to_s) + end + + def self.to_ascii(value) + value.to_s.split('.', -1).map do |segment| + if segment.size > 0 && segment.size < 64 + IDN::Idna.toASCII(segment, IDN::Idna::ALLOW_UNASSIGNED) + elsif segment.size >= 64 + segment + else + '' + end + end.join('.') + end + + def self.to_unicode(value) + value.to_s.split('.', -1).map do |segment| + if segment.size > 0 && segment.size < 64 + IDN::Idna.toUnicode(segment, IDN::Idna::ALLOW_UNASSIGNED) + elsif segment.size >= 64 + segment + else + '' + end + end.join('.') + end + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/addressable-2.8.0/lib/addressable/idna/pure.rb b/vendor/bundle/ruby/3.1.0/gems/addressable-2.8.0/lib/addressable/idna/pure.rb new file mode 100644 index 000000000..7a0c1fda2 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/addressable-2.8.0/lib/addressable/idna/pure.rb @@ -0,0 +1,678 @@ +# frozen_string_literal: true + +# encoding:utf-8 +#-- +# Copyright (C) Bob Aman +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +#++ + + +module Addressable + module IDNA + # This module is loosely based on idn_actionmailer by Mick Staugaard, + # the unicode library by Yoshida Masato, and the punycode implementation + # by Kazuhiro Nishiyama. Most of the code was copied verbatim, but + # some reformatting was done, and some translation from C was done. + # + # Without their code to work from as a base, we'd all still be relying + # on the presence of libidn. Which nobody ever seems to have installed. + # + # Original sources: + # http://github.com/staugaard/idn_actionmailer + # http://www.yoshidam.net/Ruby.html#unicode + # http://rubyforge.org/frs/?group_id=2550 + + + UNICODE_TABLE = File.expand_path( + File.join(File.dirname(__FILE__), '../../..', 'data/unicode.data') + ) + + ACE_PREFIX = "xn--" + + UTF8_REGEX = /\A(?: + [\x09\x0A\x0D\x20-\x7E] # ASCII + | [\xC2-\xDF][\x80-\xBF] # non-overlong 2-byte + | \xE0[\xA0-\xBF][\x80-\xBF] # excluding overlongs + | [\xE1-\xEC\xEE\xEF][\x80-\xBF]{2} # straight 3-byte + | \xED[\x80-\x9F][\x80-\xBF] # excluding surrogates + | \xF0[\x90-\xBF][\x80-\xBF]{2} # planes 1-3 + | [\xF1-\xF3][\x80-\xBF]{3} # planes 4nil5 + | \xF4[\x80-\x8F][\x80-\xBF]{2} # plane 16 + )*\z/mnx + + UTF8_REGEX_MULTIBYTE = /(?: + [\xC2-\xDF][\x80-\xBF] # non-overlong 2-byte + | \xE0[\xA0-\xBF][\x80-\xBF] # excluding overlongs + | [\xE1-\xEC\xEE\xEF][\x80-\xBF]{2} # straight 3-byte + | \xED[\x80-\x9F][\x80-\xBF] # excluding surrogates + | \xF0[\x90-\xBF][\x80-\xBF]{2} # planes 1-3 + | [\xF1-\xF3][\x80-\xBF]{3} # planes 4nil5 + | \xF4[\x80-\x8F][\x80-\xBF]{2} # plane 16 + )/mnx + + # :startdoc: + + # Converts from a Unicode internationalized domain name to an ASCII + # domain name as described in RFC 3490. + def self.to_ascii(input) + input = input.to_s unless input.is_a?(String) + input = input.dup + if input.respond_to?(:force_encoding) + input.force_encoding(Encoding::ASCII_8BIT) + end + if input =~ UTF8_REGEX && input =~ UTF8_REGEX_MULTIBYTE + parts = unicode_downcase(input).split('.') + parts.map! do |part| + if part.respond_to?(:force_encoding) + part.force_encoding(Encoding::ASCII_8BIT) + end + if part =~ UTF8_REGEX && part =~ UTF8_REGEX_MULTIBYTE + ACE_PREFIX + punycode_encode(unicode_normalize_kc(part)) + else + part + end + end + parts.join('.') + else + input + end + end + + # Converts from an ASCII domain name to a Unicode internationalized + # domain name as described in RFC 3490. + def self.to_unicode(input) + input = input.to_s unless input.is_a?(String) + parts = input.split('.') + parts.map! do |part| + if part =~ /^#{ACE_PREFIX}(.+)/ + begin + punycode_decode(part[/^#{ACE_PREFIX}(.+)/, 1]) + rescue Addressable::IDNA::PunycodeBadInput + # toUnicode is explicitly defined as never-fails by the spec + part + end + else + part + end + end + output = parts.join('.') + if output.respond_to?(:force_encoding) + output.force_encoding(Encoding::UTF_8) + end + output + end + + # Unicode normalization form KC. + def self.unicode_normalize_kc(input) + input = input.to_s unless input.is_a?(String) + unpacked = input.unpack("U*") + unpacked = + unicode_compose(unicode_sort_canonical(unicode_decompose(unpacked))) + return unpacked.pack("U*") + end + + ## + # Unicode aware downcase method. + # + # @api private + # @param [String] input + # The input string. + # @return [String] The downcased result. + def self.unicode_downcase(input) + input = input.to_s unless input.is_a?(String) + unpacked = input.unpack("U*") + unpacked.map! { |codepoint| lookup_unicode_lowercase(codepoint) } + return unpacked.pack("U*") + end + private_class_method :unicode_downcase + + def self.unicode_compose(unpacked) + unpacked_result = [] + length = unpacked.length + + return unpacked if length == 0 + + starter = unpacked[0] + starter_cc = lookup_unicode_combining_class(starter) + starter_cc = 256 if starter_cc != 0 + for i in 1...length + ch = unpacked[i] + + if (starter_cc == 0 && + (composite = unicode_compose_pair(starter, ch)) != nil) + starter = composite + else + unpacked_result << starter + starter = ch + end + end + unpacked_result << starter + return unpacked_result + end + private_class_method :unicode_compose + + def self.unicode_compose_pair(ch_one, ch_two) + if ch_one >= HANGUL_LBASE && ch_one < HANGUL_LBASE + HANGUL_LCOUNT && + ch_two >= HANGUL_VBASE && ch_two < HANGUL_VBASE + HANGUL_VCOUNT + # Hangul L + V + return HANGUL_SBASE + ( + (ch_one - HANGUL_LBASE) * HANGUL_VCOUNT + (ch_two - HANGUL_VBASE) + ) * HANGUL_TCOUNT + elsif ch_one >= HANGUL_SBASE && + ch_one < HANGUL_SBASE + HANGUL_SCOUNT && + (ch_one - HANGUL_SBASE) % HANGUL_TCOUNT == 0 && + ch_two >= HANGUL_TBASE && ch_two < HANGUL_TBASE + HANGUL_TCOUNT + # Hangul LV + T + return ch_one + (ch_two - HANGUL_TBASE) + end + + p = [] + + ucs4_to_utf8(ch_one, p) + ucs4_to_utf8(ch_two, p) + + return lookup_unicode_composition(p) + end + private_class_method :unicode_compose_pair + + def self.ucs4_to_utf8(char, buffer) + if char < 128 + buffer << char + elsif char < 2048 + buffer << (char >> 6 | 192) + buffer << (char & 63 | 128) + elsif char < 0x10000 + buffer << (char >> 12 | 224) + buffer << (char >> 6 & 63 | 128) + buffer << (char & 63 | 128) + elsif char < 0x200000 + buffer << (char >> 18 | 240) + buffer << (char >> 12 & 63 | 128) + buffer << (char >> 6 & 63 | 128) + buffer << (char & 63 | 128) + elsif char < 0x4000000 + buffer << (char >> 24 | 248) + buffer << (char >> 18 & 63 | 128) + buffer << (char >> 12 & 63 | 128) + buffer << (char >> 6 & 63 | 128) + buffer << (char & 63 | 128) + elsif char < 0x80000000 + buffer << (char >> 30 | 252) + buffer << (char >> 24 & 63 | 128) + buffer << (char >> 18 & 63 | 128) + buffer << (char >> 12 & 63 | 128) + buffer << (char >> 6 & 63 | 128) + buffer << (char & 63 | 128) + end + end + private_class_method :ucs4_to_utf8 + + def self.unicode_sort_canonical(unpacked) + unpacked = unpacked.dup + i = 1 + length = unpacked.length + + return unpacked if length < 2 + + while i < length + last = unpacked[i-1] + ch = unpacked[i] + last_cc = lookup_unicode_combining_class(last) + cc = lookup_unicode_combining_class(ch) + if cc != 0 && last_cc != 0 && last_cc > cc + unpacked[i] = last + unpacked[i-1] = ch + i -= 1 if i > 1 + else + i += 1 + end + end + return unpacked + end + private_class_method :unicode_sort_canonical + + def self.unicode_decompose(unpacked) + unpacked_result = [] + for cp in unpacked + if cp >= HANGUL_SBASE && cp < HANGUL_SBASE + HANGUL_SCOUNT + l, v, t = unicode_decompose_hangul(cp) + unpacked_result << l + unpacked_result << v if v + unpacked_result << t if t + else + dc = lookup_unicode_compatibility(cp) + unless dc + unpacked_result << cp + else + unpacked_result.concat(unicode_decompose(dc.unpack("U*"))) + end + end + end + return unpacked_result + end + private_class_method :unicode_decompose + + def self.unicode_decompose_hangul(codepoint) + sindex = codepoint - HANGUL_SBASE; + if sindex < 0 || sindex >= HANGUL_SCOUNT + l = codepoint + v = t = nil + return l, v, t + end + l = HANGUL_LBASE + sindex / HANGUL_NCOUNT + v = HANGUL_VBASE + (sindex % HANGUL_NCOUNT) / HANGUL_TCOUNT + t = HANGUL_TBASE + sindex % HANGUL_TCOUNT + if t == HANGUL_TBASE + t = nil + end + return l, v, t + end + private_class_method :unicode_decompose_hangul + + def self.lookup_unicode_combining_class(codepoint) + codepoint_data = UNICODE_DATA[codepoint] + (codepoint_data ? + (codepoint_data[UNICODE_DATA_COMBINING_CLASS] || 0) : + 0) + end + private_class_method :lookup_unicode_combining_class + + def self.lookup_unicode_compatibility(codepoint) + codepoint_data = UNICODE_DATA[codepoint] + (codepoint_data ? + codepoint_data[UNICODE_DATA_COMPATIBILITY] : nil) + end + private_class_method :lookup_unicode_compatibility + + def self.lookup_unicode_lowercase(codepoint) + codepoint_data = UNICODE_DATA[codepoint] + (codepoint_data ? + (codepoint_data[UNICODE_DATA_LOWERCASE] || codepoint) : + codepoint) + end + private_class_method :lookup_unicode_lowercase + + def self.lookup_unicode_composition(unpacked) + return COMPOSITION_TABLE[unpacked] + end + private_class_method :lookup_unicode_composition + + HANGUL_SBASE = 0xac00 + HANGUL_LBASE = 0x1100 + HANGUL_LCOUNT = 19 + HANGUL_VBASE = 0x1161 + HANGUL_VCOUNT = 21 + HANGUL_TBASE = 0x11a7 + HANGUL_TCOUNT = 28 + HANGUL_NCOUNT = HANGUL_VCOUNT * HANGUL_TCOUNT # 588 + HANGUL_SCOUNT = HANGUL_LCOUNT * HANGUL_NCOUNT # 11172 + + UNICODE_DATA_COMBINING_CLASS = 0 + UNICODE_DATA_EXCLUSION = 1 + UNICODE_DATA_CANONICAL = 2 + UNICODE_DATA_COMPATIBILITY = 3 + UNICODE_DATA_UPPERCASE = 4 + UNICODE_DATA_LOWERCASE = 5 + UNICODE_DATA_TITLECASE = 6 + + begin + if defined?(FakeFS) + fakefs_state = FakeFS.activated? + FakeFS.deactivate! + end + # This is a sparse Unicode table. Codepoints without entries are + # assumed to have the value: [0, 0, nil, nil, nil, nil, nil] + UNICODE_DATA = File.open(UNICODE_TABLE, "rb") do |file| + Marshal.load(file.read) + end + ensure + if defined?(FakeFS) + FakeFS.activate! if fakefs_state + end + end + + COMPOSITION_TABLE = {} + UNICODE_DATA.each do |codepoint, data| + canonical = data[UNICODE_DATA_CANONICAL] + exclusion = data[UNICODE_DATA_EXCLUSION] + + if canonical && exclusion == 0 + COMPOSITION_TABLE[canonical.unpack("C*")] = codepoint + end + end + + UNICODE_MAX_LENGTH = 256 + ACE_MAX_LENGTH = 256 + + PUNYCODE_BASE = 36 + PUNYCODE_TMIN = 1 + PUNYCODE_TMAX = 26 + PUNYCODE_SKEW = 38 + PUNYCODE_DAMP = 700 + PUNYCODE_INITIAL_BIAS = 72 + PUNYCODE_INITIAL_N = 0x80 + PUNYCODE_DELIMITER = 0x2D + + PUNYCODE_MAXINT = 1 << 64 + + PUNYCODE_PRINT_ASCII = + "\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n" + + "\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n" + + " !\"\#$%&'()*+,-./" + + "0123456789:;<=>?" + + "@ABCDEFGHIJKLMNO" + + "PQRSTUVWXYZ[\\]^_" + + "`abcdefghijklmno" + + "pqrstuvwxyz{|}~\n" + + # Input is invalid. + class PunycodeBadInput < StandardError; end + # Output would exceed the space provided. + class PunycodeBigOutput < StandardError; end + # Input needs wider integers to process. + class PunycodeOverflow < StandardError; end + + def self.punycode_encode(unicode) + unicode = unicode.to_s unless unicode.is_a?(String) + input = unicode.unpack("U*") + output = [0] * (ACE_MAX_LENGTH + 1) + input_length = input.size + output_length = [ACE_MAX_LENGTH] + + # Initialize the state + n = PUNYCODE_INITIAL_N + delta = out = 0 + max_out = output_length[0] + bias = PUNYCODE_INITIAL_BIAS + + # Handle the basic code points: + input_length.times do |j| + if punycode_basic?(input[j]) + if max_out - out < 2 + raise PunycodeBigOutput, + "Output would exceed the space provided." + end + output[out] = input[j] + out += 1 + end + end + + h = b = out + + # h is the number of code points that have been handled, b is the + # number of basic code points, and out is the number of characters + # that have been output. + + if b > 0 + output[out] = PUNYCODE_DELIMITER + out += 1 + end + + # Main encoding loop: + + while h < input_length + # All non-basic code points < n have been + # handled already. Find the next larger one: + + m = PUNYCODE_MAXINT + input_length.times do |j| + m = input[j] if (n...m) === input[j] + end + + # Increase delta enough to advance the decoder's + # state to , but guard against overflow: + + if m - n > (PUNYCODE_MAXINT - delta) / (h + 1) + raise PunycodeOverflow, "Input needs wider integers to process." + end + delta += (m - n) * (h + 1) + n = m + + input_length.times do |j| + # Punycode does not need to check whether input[j] is basic: + if input[j] < n + delta += 1 + if delta == 0 + raise PunycodeOverflow, + "Input needs wider integers to process." + end + end + + if input[j] == n + # Represent delta as a generalized variable-length integer: + + q = delta; k = PUNYCODE_BASE + while true + if out >= max_out + raise PunycodeBigOutput, + "Output would exceed the space provided." + end + t = ( + if k <= bias + PUNYCODE_TMIN + elsif k >= bias + PUNYCODE_TMAX + PUNYCODE_TMAX + else + k - bias + end + ) + break if q < t + output[out] = + punycode_encode_digit(t + (q - t) % (PUNYCODE_BASE - t)) + out += 1 + q = (q - t) / (PUNYCODE_BASE - t) + k += PUNYCODE_BASE + end + + output[out] = punycode_encode_digit(q) + out += 1 + bias = punycode_adapt(delta, h + 1, h == b) + delta = 0 + h += 1 + end + end + + delta += 1 + n += 1 + end + + output_length[0] = out + + outlen = out + outlen.times do |j| + c = output[j] + unless c >= 0 && c <= 127 + raise StandardError, "Invalid output char." + end + unless PUNYCODE_PRINT_ASCII[c] + raise PunycodeBadInput, "Input is invalid." + end + end + + output[0..outlen].map { |x| x.chr }.join("").sub(/\0+\z/, "") + end + private_class_method :punycode_encode + + def self.punycode_decode(punycode) + input = [] + output = [] + + if ACE_MAX_LENGTH * 2 < punycode.size + raise PunycodeBigOutput, "Output would exceed the space provided." + end + punycode.each_byte do |c| + unless c >= 0 && c <= 127 + raise PunycodeBadInput, "Input is invalid." + end + input.push(c) + end + + input_length = input.length + output_length = [UNICODE_MAX_LENGTH] + + # Initialize the state + n = PUNYCODE_INITIAL_N + + out = i = 0 + max_out = output_length[0] + bias = PUNYCODE_INITIAL_BIAS + + # Handle the basic code points: Let b be the number of input code + # points before the last delimiter, or 0 if there is none, then + # copy the first b code points to the output. + + b = 0 + input_length.times do |j| + b = j if punycode_delimiter?(input[j]) + end + if b > max_out + raise PunycodeBigOutput, "Output would exceed the space provided." + end + + b.times do |j| + unless punycode_basic?(input[j]) + raise PunycodeBadInput, "Input is invalid." + end + output[out] = input[j] + out+=1 + end + + # Main decoding loop: Start just after the last delimiter if any + # basic code points were copied; start at the beginning otherwise. + + in_ = b > 0 ? b + 1 : 0 + while in_ < input_length + + # in_ is the index of the next character to be consumed, and + # out is the number of code points in the output array. + + # Decode a generalized variable-length integer into delta, + # which gets added to i. The overflow checking is easier + # if we increase i as we go, then subtract off its starting + # value at the end to obtain delta. + + oldi = i; w = 1; k = PUNYCODE_BASE + while true + if in_ >= input_length + raise PunycodeBadInput, "Input is invalid." + end + digit = punycode_decode_digit(input[in_]) + in_+=1 + if digit >= PUNYCODE_BASE + raise PunycodeBadInput, "Input is invalid." + end + if digit > (PUNYCODE_MAXINT - i) / w + raise PunycodeOverflow, "Input needs wider integers to process." + end + i += digit * w + t = ( + if k <= bias + PUNYCODE_TMIN + elsif k >= bias + PUNYCODE_TMAX + PUNYCODE_TMAX + else + k - bias + end + ) + break if digit < t + if w > PUNYCODE_MAXINT / (PUNYCODE_BASE - t) + raise PunycodeOverflow, "Input needs wider integers to process." + end + w *= PUNYCODE_BASE - t + k += PUNYCODE_BASE + end + + bias = punycode_adapt(i - oldi, out + 1, oldi == 0) + + # I was supposed to wrap around from out + 1 to 0, + # incrementing n each time, so we'll fix that now: + + if i / (out + 1) > PUNYCODE_MAXINT - n + raise PunycodeOverflow, "Input needs wider integers to process." + end + n += i / (out + 1) + i %= out + 1 + + # Insert n at position i of the output: + + # not needed for Punycode: + # raise PUNYCODE_INVALID_INPUT if decode_digit(n) <= base + if out >= max_out + raise PunycodeBigOutput, "Output would exceed the space provided." + end + + #memmove(output + i + 1, output + i, (out - i) * sizeof *output) + output[i + 1, out - i] = output[i, out - i] + output[i] = n + i += 1 + + out += 1 + end + + output_length[0] = out + + output.pack("U*") + end + private_class_method :punycode_decode + + def self.punycode_basic?(codepoint) + codepoint < 0x80 + end + private_class_method :punycode_basic? + + def self.punycode_delimiter?(codepoint) + codepoint == PUNYCODE_DELIMITER + end + private_class_method :punycode_delimiter? + + def self.punycode_encode_digit(d) + d + 22 + 75 * ((d < 26) ? 1 : 0) + end + private_class_method :punycode_encode_digit + + # Returns the numeric value of a basic codepoint + # (for use in representing integers) in the range 0 to + # base - 1, or PUNYCODE_BASE if codepoint does not represent a value. + def self.punycode_decode_digit(codepoint) + if codepoint - 48 < 10 + codepoint - 22 + elsif codepoint - 65 < 26 + codepoint - 65 + elsif codepoint - 97 < 26 + codepoint - 97 + else + PUNYCODE_BASE + end + end + private_class_method :punycode_decode_digit + + # Bias adaptation method + def self.punycode_adapt(delta, numpoints, firsttime) + delta = firsttime ? delta / PUNYCODE_DAMP : delta >> 1 + # delta >> 1 is a faster way of doing delta / 2 + delta += delta / numpoints + difference = PUNYCODE_BASE - PUNYCODE_TMIN + + k = 0 + while delta > (difference * PUNYCODE_TMAX) / 2 + delta /= difference + k += PUNYCODE_BASE + end + + k + (difference + 1) * delta / (delta + PUNYCODE_SKEW) + end + private_class_method :punycode_adapt + end + # :startdoc: +end diff --git a/vendor/bundle/ruby/3.1.0/gems/addressable-2.8.0/lib/addressable/template.rb b/vendor/bundle/ruby/3.1.0/gems/addressable-2.8.0/lib/addressable/template.rb new file mode 100644 index 000000000..45f6ae69e --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/addressable-2.8.0/lib/addressable/template.rb @@ -0,0 +1,1031 @@ +# frozen_string_literal: true + +# encoding:utf-8 +#-- +# Copyright (C) Bob Aman +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +#++ + + +require "addressable/version" +require "addressable/uri" + +module Addressable + ## + # This is an implementation of a URI template based on + # RFC 6570 (http://tools.ietf.org/html/rfc6570). + class Template + # Constants used throughout the template code. + anything = + Addressable::URI::CharacterClasses::RESERVED + + Addressable::URI::CharacterClasses::UNRESERVED + + + variable_char_class = + Addressable::URI::CharacterClasses::ALPHA + + Addressable::URI::CharacterClasses::DIGIT + '_' + + var_char = + "(?>(?:[#{variable_char_class}]|%[a-fA-F0-9][a-fA-F0-9])+)" + RESERVED = + "(?:[#{anything}]|%[a-fA-F0-9][a-fA-F0-9])" + UNRESERVED = + "(?:[#{ + Addressable::URI::CharacterClasses::UNRESERVED + }]|%[a-fA-F0-9][a-fA-F0-9])" + variable = + "(?:#{var_char}(?:\\.?#{var_char})*)" + varspec = + "(?:(#{variable})(\\*|:\\d+)?)" + VARNAME = + /^#{variable}$/ + VARSPEC = + /^#{varspec}$/ + VARIABLE_LIST = + /^#{varspec}(?:,#{varspec})*$/ + operator = + "+#./;?&=,!@|" + EXPRESSION = + /\{([#{operator}])?(#{varspec}(?:,#{varspec})*)\}/ + + + LEADERS = { + '?' => '?', + '/' => '/', + '#' => '#', + '.' => '.', + ';' => ';', + '&' => '&' + } + JOINERS = { + '?' => '&', + '.' => '.', + ';' => ';', + '&' => '&', + '/' => '/' + } + + ## + # Raised if an invalid template value is supplied. + class InvalidTemplateValueError < StandardError + end + + ## + # Raised if an invalid template operator is used in a pattern. + class InvalidTemplateOperatorError < StandardError + end + + ## + # Raised if an invalid template operator is used in a pattern. + class TemplateOperatorAbortedError < StandardError + end + + ## + # This class represents the data that is extracted when a Template + # is matched against a URI. + class MatchData + ## + # Creates a new MatchData object. + # MatchData objects should never be instantiated directly. + # + # @param [Addressable::URI] uri + # The URI that the template was matched against. + def initialize(uri, template, mapping) + @uri = uri.dup.freeze + @template = template + @mapping = mapping.dup.freeze + end + + ## + # @return [Addressable::URI] + # The URI that the Template was matched against. + attr_reader :uri + + ## + # @return [Addressable::Template] + # The Template used for the match. + attr_reader :template + + ## + # @return [Hash] + # The mapping that resulted from the match. + # Note that this mapping does not include keys or values for + # variables that appear in the Template, but are not present + # in the URI. + attr_reader :mapping + + ## + # @return [Array] + # The list of variables that were present in the Template. + # Note that this list will include variables which do not appear + # in the mapping because they were not present in URI. + def variables + self.template.variables + end + alias_method :keys, :variables + alias_method :names, :variables + + ## + # @return [Array] + # The list of values that were captured by the Template. + # Note that this list will include nils for any variables which + # were in the Template, but did not appear in the URI. + def values + @values ||= self.variables.inject([]) do |accu, key| + accu << self.mapping[key] + accu + end + end + alias_method :captures, :values + + ## + # Accesses captured values by name or by index. + # + # @param [String, Symbol, Fixnum] key + # Capture index or name. Note that when accessing by with index + # of 0, the full URI will be returned. The intention is to mimic + # the ::MatchData#[] behavior. + # + # @param [#to_int, nil] len + # If provided, an array of values will be returend with the given + # parameter used as length. + # + # @return [Array, String, nil] + # The captured value corresponding to the index or name. If the + # value was not provided or the key is unknown, nil will be + # returned. + # + # If the second parameter is provided, an array of that length will + # be returned instead. + def [](key, len = nil) + if len + to_a[key, len] + elsif String === key or Symbol === key + mapping[key.to_s] + else + to_a[key] + end + end + + ## + # @return [Array] + # Array with the matched URI as first element followed by the captured + # values. + def to_a + [to_s, *values] + end + + ## + # @return [String] + # The matched URI as String. + def to_s + uri.to_s + end + alias_method :string, :to_s + + # Returns multiple captured values at once. + # + # @param [String, Symbol, Fixnum] *indexes + # Indices of the captures to be returned + # + # @return [Array] + # Values corresponding to given indices. + # + # @see Addressable::Template::MatchData#[] + def values_at(*indexes) + indexes.map { |i| self[i] } + end + + ## + # Returns a String representation of the MatchData's state. + # + # @return [String] The MatchData's state, as a String. + def inspect + sprintf("#<%s:%#0x RESULT:%s>", + self.class.to_s, self.object_id, self.mapping.inspect) + end + + ## + # Dummy method for code expecting a ::MatchData instance + # + # @return [String] An empty string. + def pre_match + "" + end + alias_method :post_match, :pre_match + end + + ## + # Creates a new Addressable::Template object. + # + # @param [#to_str] pattern The URI Template pattern. + # + # @return [Addressable::Template] The initialized Template object. + def initialize(pattern) + if !pattern.respond_to?(:to_str) + raise TypeError, "Can't convert #{pattern.class} into String." + end + @pattern = pattern.to_str.dup.freeze + end + + ## + # Freeze URI, initializing instance variables. + # + # @return [Addressable::URI] The frozen URI object. + def freeze + self.variables + self.variable_defaults + self.named_captures + super + end + + ## + # @return [String] The Template object's pattern. + attr_reader :pattern + + ## + # Returns a String representation of the Template object's state. + # + # @return [String] The Template object's state, as a String. + def inspect + sprintf("#<%s:%#0x PATTERN:%s>", + self.class.to_s, self.object_id, self.pattern) + end + + ## + # Returns true if the Template objects are equal. This method + # does NOT normalize either Template before doing the comparison. + # + # @param [Object] template The Template to compare. + # + # @return [TrueClass, FalseClass] + # true if the Templates are equivalent, false + # otherwise. + def ==(template) + return false unless template.kind_of?(Template) + return self.pattern == template.pattern + end + + ## + # Addressable::Template makes no distinction between `==` and `eql?`. + # + # @see #== + alias_method :eql?, :== + + ## + # Extracts a mapping from the URI using a URI Template pattern. + # + # @param [Addressable::URI, #to_str] uri + # The URI to extract from. + # + # @param [#restore, #match] processor + # A template processor object may optionally be supplied. + # + # The object should respond to either the restore or + # match messages or both. The restore method should + # take two parameters: `[String] name` and `[String] value`. + # The restore method should reverse any transformations that + # have been performed on the value to ensure a valid URI. + # The match method should take a single + # parameter: `[String] name`. The match method should return + # a String containing a regular expression capture group for + # matching on that particular variable. The default value is `".*?"`. + # The match method has no effect on multivariate operator + # expansions. + # + # @return [Hash, NilClass] + # The Hash mapping that was extracted from the URI, or + # nil if the URI didn't match the template. + # + # @example + # class ExampleProcessor + # def self.restore(name, value) + # return value.gsub(/\+/, " ") if name == "query" + # return value + # end + # + # def self.match(name) + # return ".*?" if name == "first" + # return ".*" + # end + # end + # + # uri = Addressable::URI.parse( + # "http://example.com/search/an+example+search+query/" + # ) + # Addressable::Template.new( + # "http://example.com/search/{query}/" + # ).extract(uri, ExampleProcessor) + # #=> {"query" => "an example search query"} + # + # uri = Addressable::URI.parse("http://example.com/a/b/c/") + # Addressable::Template.new( + # "http://example.com/{first}/{second}/" + # ).extract(uri, ExampleProcessor) + # #=> {"first" => "a", "second" => "b/c"} + # + # uri = Addressable::URI.parse("http://example.com/a/b/c/") + # Addressable::Template.new( + # "http://example.com/{first}/{-list|/|second}/" + # ).extract(uri) + # #=> {"first" => "a", "second" => ["b", "c"]} + def extract(uri, processor=nil) + match_data = self.match(uri, processor) + return (match_data ? match_data.mapping : nil) + end + + ## + # Extracts match data from the URI using a URI Template pattern. + # + # @param [Addressable::URI, #to_str] uri + # The URI to extract from. + # + # @param [#restore, #match] processor + # A template processor object may optionally be supplied. + # + # The object should respond to either the restore or + # match messages or both. The restore method should + # take two parameters: `[String] name` and `[String] value`. + # The restore method should reverse any transformations that + # have been performed on the value to ensure a valid URI. + # The match method should take a single + # parameter: `[String] name`. The match method should return + # a String containing a regular expression capture group for + # matching on that particular variable. The default value is `".*?"`. + # The match method has no effect on multivariate operator + # expansions. + # + # @return [Hash, NilClass] + # The Hash mapping that was extracted from the URI, or + # nil if the URI didn't match the template. + # + # @example + # class ExampleProcessor + # def self.restore(name, value) + # return value.gsub(/\+/, " ") if name == "query" + # return value + # end + # + # def self.match(name) + # return ".*?" if name == "first" + # return ".*" + # end + # end + # + # uri = Addressable::URI.parse( + # "http://example.com/search/an+example+search+query/" + # ) + # match = Addressable::Template.new( + # "http://example.com/search/{query}/" + # ).match(uri, ExampleProcessor) + # match.variables + # #=> ["query"] + # match.captures + # #=> ["an example search query"] + # + # uri = Addressable::URI.parse("http://example.com/a/b/c/") + # match = Addressable::Template.new( + # "http://example.com/{first}/{+second}/" + # ).match(uri, ExampleProcessor) + # match.variables + # #=> ["first", "second"] + # match.captures + # #=> ["a", "b/c"] + # + # uri = Addressable::URI.parse("http://example.com/a/b/c/") + # match = Addressable::Template.new( + # "http://example.com/{first}{/second*}/" + # ).match(uri) + # match.variables + # #=> ["first", "second"] + # match.captures + # #=> ["a", ["b", "c"]] + def match(uri, processor=nil) + uri = Addressable::URI.parse(uri) unless uri.is_a?(Addressable::URI) + mapping = {} + + # First, we need to process the pattern, and extract the values. + expansions, expansion_regexp = + parse_template_pattern(pattern, processor) + + return nil unless uri.to_str.match(expansion_regexp) + unparsed_values = uri.to_str.scan(expansion_regexp).flatten + + if uri.to_str == pattern + return Addressable::Template::MatchData.new(uri, self, mapping) + elsif expansions.size > 0 + index = 0 + expansions.each do |expansion| + _, operator, varlist = *expansion.match(EXPRESSION) + varlist.split(',').each do |varspec| + _, name, modifier = *varspec.match(VARSPEC) + mapping[name] ||= nil + case operator + when nil, '+', '#', '/', '.' + unparsed_value = unparsed_values[index] + name = varspec[VARSPEC, 1] + value = unparsed_value + value = value.split(JOINERS[operator]) if value && modifier == '*' + when ';', '?', '&' + if modifier == '*' + if unparsed_values[index] + value = unparsed_values[index].split(JOINERS[operator]) + value = value.inject({}) do |acc, v| + key, val = v.split('=') + val = "" if val.nil? + acc[key] = val + acc + end + end + else + if (unparsed_values[index]) + name, value = unparsed_values[index].split('=') + value = "" if value.nil? + end + end + end + if processor != nil && processor.respond_to?(:restore) + value = processor.restore(name, value) + end + if processor == nil + if value.is_a?(Hash) + value = value.inject({}){|acc, (k, v)| + acc[Addressable::URI.unencode_component(k)] = + Addressable::URI.unencode_component(v) + acc + } + elsif value.is_a?(Array) + value = value.map{|v| Addressable::URI.unencode_component(v) } + else + value = Addressable::URI.unencode_component(value) + end + end + if !mapping.has_key?(name) || mapping[name].nil? + # Doesn't exist, set to value (even if value is nil) + mapping[name] = value + end + index = index + 1 + end + end + return Addressable::Template::MatchData.new(uri, self, mapping) + else + return nil + end + end + + ## + # Expands a URI template into another URI template. + # + # @param [Hash] mapping The mapping that corresponds to the pattern. + # @param [#validate, #transform] processor + # An optional processor object may be supplied. + # @param [Boolean] normalize_values + # Optional flag to enable/disable unicode normalization. Default: true + # + # The object should respond to either the validate or + # transform messages or both. Both the validate and + # transform methods should take two parameters: name and + # value. The validate method should return true + # or false; true if the value of the variable is valid, + # false otherwise. An InvalidTemplateValueError + # exception will be raised if the value is invalid. The transform + # method should return the transformed variable value as a String. + # If a transform method is used, the value will not be percent + # encoded automatically. Unicode normalization will be performed both + # before and after sending the value to the transform method. + # + # @return [Addressable::Template] The partially expanded URI template. + # + # @example + # Addressable::Template.new( + # "http://example.com/{one}/{two}/" + # ).partial_expand({"one" => "1"}).pattern + # #=> "http://example.com/1/{two}/" + # + # Addressable::Template.new( + # "http://example.com/{?one,two}/" + # ).partial_expand({"one" => "1"}).pattern + # #=> "http://example.com/?one=1{&two}/" + # + # Addressable::Template.new( + # "http://example.com/{?one,two,three}/" + # ).partial_expand({"one" => "1", "three" => 3}).pattern + # #=> "http://example.com/?one=1{&two}&three=3" + def partial_expand(mapping, processor=nil, normalize_values=true) + result = self.pattern.dup + mapping = normalize_keys(mapping) + result.gsub!( EXPRESSION ) do |capture| + transform_partial_capture(mapping, capture, processor, normalize_values) + end + return Addressable::Template.new(result) + end + + ## + # Expands a URI template into a full URI. + # + # @param [Hash] mapping The mapping that corresponds to the pattern. + # @param [#validate, #transform] processor + # An optional processor object may be supplied. + # @param [Boolean] normalize_values + # Optional flag to enable/disable unicode normalization. Default: true + # + # The object should respond to either the validate or + # transform messages or both. Both the validate and + # transform methods should take two parameters: name and + # value. The validate method should return true + # or false; true if the value of the variable is valid, + # false otherwise. An InvalidTemplateValueError + # exception will be raised if the value is invalid. The transform + # method should return the transformed variable value as a String. + # If a transform method is used, the value will not be percent + # encoded automatically. Unicode normalization will be performed both + # before and after sending the value to the transform method. + # + # @return [Addressable::URI] The expanded URI template. + # + # @example + # class ExampleProcessor + # def self.validate(name, value) + # return !!(value =~ /^[\w ]+$/) if name == "query" + # return true + # end + # + # def self.transform(name, value) + # return value.gsub(/ /, "+") if name == "query" + # return value + # end + # end + # + # Addressable::Template.new( + # "http://example.com/search/{query}/" + # ).expand( + # {"query" => "an example search query"}, + # ExampleProcessor + # ).to_str + # #=> "http://example.com/search/an+example+search+query/" + # + # Addressable::Template.new( + # "http://example.com/search/{query}/" + # ).expand( + # {"query" => "an example search query"} + # ).to_str + # #=> "http://example.com/search/an%20example%20search%20query/" + # + # Addressable::Template.new( + # "http://example.com/search/{query}/" + # ).expand( + # {"query" => "bogus!"}, + # ExampleProcessor + # ).to_str + # #=> Addressable::Template::InvalidTemplateValueError + def expand(mapping, processor=nil, normalize_values=true) + result = self.pattern.dup + mapping = normalize_keys(mapping) + result.gsub!( EXPRESSION ) do |capture| + transform_capture(mapping, capture, processor, normalize_values) + end + return Addressable::URI.parse(result) + end + + ## + # Returns an Array of variables used within the template pattern. + # The variables are listed in the Array in the order they appear within + # the pattern. Multiple occurrences of a variable within a pattern are + # not represented in this Array. + # + # @return [Array] The variables present in the template's pattern. + def variables + @variables ||= ordered_variable_defaults.map { |var, val| var }.uniq + end + alias_method :keys, :variables + alias_method :names, :variables + + ## + # Returns a mapping of variables to their default values specified + # in the template. Variables without defaults are not returned. + # + # @return [Hash] Mapping of template variables to their defaults + def variable_defaults + @variable_defaults ||= + Hash[*ordered_variable_defaults.reject { |k, v| v.nil? }.flatten] + end + + ## + # Coerces a template into a `Regexp` object. This regular expression will + # behave very similarly to the actual template, and should match the same + # URI values, but it cannot fully handle, for example, values that would + # extract to an `Array`. + # + # @return [Regexp] A regular expression which should match the template. + def to_regexp + _, source = parse_template_pattern(pattern) + Regexp.new(source) + end + + ## + # Returns the source of the coerced `Regexp`. + # + # @return [String] The source of the `Regexp` given by {#to_regexp}. + # + # @api private + def source + self.to_regexp.source + end + + ## + # Returns the named captures of the coerced `Regexp`. + # + # @return [Hash] The named captures of the `Regexp` given by {#to_regexp}. + # + # @api private + def named_captures + self.to_regexp.named_captures + end + + private + def ordered_variable_defaults + @ordered_variable_defaults ||= begin + expansions, _ = parse_template_pattern(pattern) + expansions.map do |capture| + _, _, varlist = *capture.match(EXPRESSION) + varlist.split(',').map do |varspec| + varspec[VARSPEC, 1] + end + end.flatten + end + end + + + ## + # Loops through each capture and expands any values available in mapping + # + # @param [Hash] mapping + # Set of keys to expand + # @param [String] capture + # The expression to expand + # @param [#validate, #transform] processor + # An optional processor object may be supplied. + # @param [Boolean] normalize_values + # Optional flag to enable/disable unicode normalization. Default: true + # + # The object should respond to either the validate or + # transform messages or both. Both the validate and + # transform methods should take two parameters: name and + # value. The validate method should return true + # or false; true if the value of the variable is valid, + # false otherwise. An InvalidTemplateValueError exception + # will be raised if the value is invalid. The transform method + # should return the transformed variable value as a String. If a + # transform method is used, the value will not be percent encoded + # automatically. Unicode normalization will be performed both before and + # after sending the value to the transform method. + # + # @return [String] The expanded expression + def transform_partial_capture(mapping, capture, processor = nil, + normalize_values = true) + _, operator, varlist = *capture.match(EXPRESSION) + + vars = varlist.split(",") + + if operator == "?" + # partial expansion of form style query variables sometimes requires a + # slight reordering of the variables to produce a valid url. + first_to_expand = vars.find { |varspec| + _, name, _ = *varspec.match(VARSPEC) + mapping.key?(name) && !mapping[name].nil? + } + + vars = [first_to_expand] + vars.reject {|varspec| varspec == first_to_expand} if first_to_expand + end + + vars. + inject("".dup) do |acc, varspec| + _, name, _ = *varspec.match(VARSPEC) + next_val = if mapping.key? name + transform_capture(mapping, "{#{operator}#{varspec}}", + processor, normalize_values) + else + "{#{operator}#{varspec}}" + end + # If we've already expanded at least one '?' operator with non-empty + # value, change to '&' + operator = "&" if (operator == "?") && (next_val != "") + acc << next_val + end + end + + ## + # Transforms a mapped value so that values can be substituted into the + # template. + # + # @param [Hash] mapping The mapping to replace captures + # @param [String] capture + # The expression to replace + # @param [#validate, #transform] processor + # An optional processor object may be supplied. + # @param [Boolean] normalize_values + # Optional flag to enable/disable unicode normalization. Default: true + # + # + # The object should respond to either the validate or + # transform messages or both. Both the validate and + # transform methods should take two parameters: name and + # value. The validate method should return true + # or false; true if the value of the variable is valid, + # false otherwise. An InvalidTemplateValueError exception + # will be raised if the value is invalid. The transform method + # should return the transformed variable value as a String. If a + # transform method is used, the value will not be percent encoded + # automatically. Unicode normalization will be performed both before and + # after sending the value to the transform method. + # + # @return [String] The expanded expression + def transform_capture(mapping, capture, processor=nil, + normalize_values=true) + _, operator, varlist = *capture.match(EXPRESSION) + return_value = varlist.split(',').inject([]) do |acc, varspec| + _, name, modifier = *varspec.match(VARSPEC) + value = mapping[name] + unless value == nil || value == {} + allow_reserved = %w(+ #).include?(operator) + # Common primitives where the .to_s output is well-defined + if Numeric === value || Symbol === value || + value == true || value == false + value = value.to_s + end + length = modifier.gsub(':', '').to_i if modifier =~ /^:\d+/ + + unless (Hash === value) || + value.respond_to?(:to_ary) || value.respond_to?(:to_str) + raise TypeError, + "Can't convert #{value.class} into String or Array." + end + + value = normalize_value(value) if normalize_values + + if processor == nil || !processor.respond_to?(:transform) + # Handle percent escaping + if allow_reserved + encode_map = + Addressable::URI::CharacterClasses::RESERVED + + Addressable::URI::CharacterClasses::UNRESERVED + else + encode_map = Addressable::URI::CharacterClasses::UNRESERVED + end + if value.kind_of?(Array) + transformed_value = value.map do |val| + if length + Addressable::URI.encode_component(val[0...length], encode_map) + else + Addressable::URI.encode_component(val, encode_map) + end + end + unless modifier == "*" + transformed_value = transformed_value.join(',') + end + elsif value.kind_of?(Hash) + transformed_value = value.map do |key, val| + if modifier == "*" + "#{ + Addressable::URI.encode_component( key, encode_map) + }=#{ + Addressable::URI.encode_component( val, encode_map) + }" + else + "#{ + Addressable::URI.encode_component( key, encode_map) + },#{ + Addressable::URI.encode_component( val, encode_map) + }" + end + end + unless modifier == "*" + transformed_value = transformed_value.join(',') + end + else + if length + transformed_value = Addressable::URI.encode_component( + value[0...length], encode_map) + else + transformed_value = Addressable::URI.encode_component( + value, encode_map) + end + end + end + + # Process, if we've got a processor + if processor != nil + if processor.respond_to?(:validate) + if !processor.validate(name, value) + display_value = value.kind_of?(Array) ? value.inspect : value + raise InvalidTemplateValueError, + "#{name}=#{display_value} is an invalid template value." + end + end + if processor.respond_to?(:transform) + transformed_value = processor.transform(name, value) + if normalize_values + transformed_value = normalize_value(transformed_value) + end + end + end + acc << [name, transformed_value] + end + acc + end + return "" if return_value.empty? + join_values(operator, return_value) + end + + ## + # Takes a set of values, and joins them together based on the + # operator. + # + # @param [String, Nil] operator One of the operators from the set + # (?,&,+,#,;,/,.), or nil if there wasn't one. + # @param [Array] return_value + # The set of return values (as [variable_name, value] tuples) that will + # be joined together. + # + # @return [String] The transformed mapped value + def join_values(operator, return_value) + leader = LEADERS.fetch(operator, '') + joiner = JOINERS.fetch(operator, ',') + case operator + when '&', '?' + leader + return_value.map{|k,v| + if v.is_a?(Array) && v.first =~ /=/ + v.join(joiner) + elsif v.is_a?(Array) + v.map{|inner_value| "#{k}=#{inner_value}"}.join(joiner) + else + "#{k}=#{v}" + end + }.join(joiner) + when ';' + return_value.map{|k,v| + if v.is_a?(Array) && v.first =~ /=/ + ';' + v.join(";") + elsif v.is_a?(Array) + ';' + v.map{|inner_value| "#{k}=#{inner_value}"}.join(";") + else + v && v != '' ? ";#{k}=#{v}" : ";#{k}" + end + }.join + else + leader + return_value.map{|k,v| v}.join(joiner) + end + end + + ## + # Takes a set of values, and joins them together based on the + # operator. + # + # @param [Hash, Array, String] value + # Normalizes keys and values with IDNA#unicode_normalize_kc + # + # @return [Hash, Array, String] The normalized values + def normalize_value(value) + unless value.is_a?(Hash) + value = value.respond_to?(:to_ary) ? value.to_ary : value.to_str + end + + # Handle unicode normalization + if value.kind_of?(Array) + value.map! { |val| Addressable::IDNA.unicode_normalize_kc(val) } + elsif value.kind_of?(Hash) + value = value.inject({}) { |acc, (k, v)| + acc[Addressable::IDNA.unicode_normalize_kc(k)] = + Addressable::IDNA.unicode_normalize_kc(v) + acc + } + else + value = Addressable::IDNA.unicode_normalize_kc(value) + end + value + end + + ## + # Generates a hash with string keys + # + # @param [Hash] mapping A mapping hash to normalize + # + # @return [Hash] + # A hash with stringified keys + def normalize_keys(mapping) + return mapping.inject({}) do |accu, pair| + name, value = pair + if Symbol === name + name = name.to_s + elsif name.respond_to?(:to_str) + name = name.to_str + else + raise TypeError, + "Can't convert #{name.class} into String." + end + accu[name] = value + accu + end + end + + ## + # Generates the Regexp that parses a template pattern. Memoizes the + # value if template processor not set (processors may not be deterministic) + # + # @param [String] pattern The URI template pattern. + # @param [#match] processor The template processor to use. + # + # @return [Array, Regexp] + # An array of expansion variables nad a regular expression which may be + # used to parse a template pattern + def parse_template_pattern(pattern, processor = nil) + if processor.nil? && pattern == @pattern + @cached_template_parse ||= + parse_new_template_pattern(pattern, processor) + else + parse_new_template_pattern(pattern, processor) + end + end + + ## + # Generates the Regexp that parses a template pattern. + # + # @param [String] pattern The URI template pattern. + # @param [#match] processor The template processor to use. + # + # @return [Array, Regexp] + # An array of expansion variables nad a regular expression which may be + # used to parse a template pattern + def parse_new_template_pattern(pattern, processor = nil) + # Escape the pattern. The two gsubs restore the escaped curly braces + # back to their original form. Basically, escape everything that isn't + # within an expansion. + escaped_pattern = Regexp.escape( + pattern + ).gsub(/\\\{(.*?)\\\}/) do |escaped| + escaped.gsub(/\\(.)/, "\\1") + end + + expansions = [] + + # Create a regular expression that captures the values of the + # variables in the URI. + regexp_string = escaped_pattern.gsub( EXPRESSION ) do |expansion| + + expansions << expansion + _, operator, varlist = *expansion.match(EXPRESSION) + leader = Regexp.escape(LEADERS.fetch(operator, '')) + joiner = Regexp.escape(JOINERS.fetch(operator, ',')) + combined = varlist.split(',').map do |varspec| + _, name, modifier = *varspec.match(VARSPEC) + + result = processor && processor.respond_to?(:match) ? processor.match(name) : nil + if result + "(?<#{name}>#{ result })" + else + group = case operator + when '+' + "#{ RESERVED }*?" + when '#' + "#{ RESERVED }*?" + when '/' + "#{ UNRESERVED }*?" + when '.' + "#{ UNRESERVED.gsub('\.', '') }*?" + when ';' + "#{ UNRESERVED }*=?#{ UNRESERVED }*?" + when '?' + "#{ UNRESERVED }*=#{ UNRESERVED }*?" + when '&' + "#{ UNRESERVED }*=#{ UNRESERVED }*?" + else + "#{ UNRESERVED }*?" + end + if modifier == '*' + "(?<#{name}>#{group}(?:#{joiner}?#{group})*)?" + else + "(?<#{name}>#{group})?" + end + end + end.join("#{joiner}?") + "(?:|#{leader}#{combined})" + end + + # Ensure that the regular expression matches the whole URI. + regexp_string = "^#{regexp_string}$" + return expansions, Regexp.new(regexp_string) + end + + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/addressable-2.8.0/lib/addressable/uri.rb b/vendor/bundle/ruby/3.1.0/gems/addressable-2.8.0/lib/addressable/uri.rb new file mode 100644 index 000000000..6b5f4fa7b --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/addressable-2.8.0/lib/addressable/uri.rb @@ -0,0 +1,2556 @@ +# frozen_string_literal: true + +# encoding:utf-8 +#-- +# Copyright (C) Bob Aman +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +#++ + + +require "addressable/version" +require "addressable/idna" +require "public_suffix" + +## +# Addressable is a library for processing links and URIs. +module Addressable + ## + # This is an implementation of a URI parser based on + # RFC 3986, + # RFC 3987. + class URI + ## + # Raised if something other than a uri is supplied. + class InvalidURIError < StandardError + end + + ## + # Container for the character classes specified in + # RFC 3986. + module CharacterClasses + ALPHA = "a-zA-Z" + DIGIT = "0-9" + GEN_DELIMS = "\\:\\/\\?\\#\\[\\]\\@" + SUB_DELIMS = "\\!\\$\\&\\'\\(\\)\\*\\+\\,\\;\\=" + RESERVED = GEN_DELIMS + SUB_DELIMS + UNRESERVED = ALPHA + DIGIT + "\\-\\.\\_\\~" + PCHAR = UNRESERVED + SUB_DELIMS + "\\:\\@" + SCHEME = ALPHA + DIGIT + "\\-\\+\\." + HOST = UNRESERVED + SUB_DELIMS + "\\[\\:\\]" + AUTHORITY = PCHAR + "\\[\\:\\]" + PATH = PCHAR + "\\/" + QUERY = PCHAR + "\\/\\?" + FRAGMENT = PCHAR + "\\/\\?" + end + + module NormalizeCharacterClasses + HOST = /[^#{CharacterClasses::HOST}]/ + UNRESERVED = /[^#{CharacterClasses::UNRESERVED}]/ + PCHAR = /[^#{CharacterClasses::PCHAR}]/ + SCHEME = /[^#{CharacterClasses::SCHEME}]/ + FRAGMENT = /[^#{CharacterClasses::FRAGMENT}]/ + QUERY = %r{[^a-zA-Z0-9\-\.\_\~\!\$\'\(\)\*\+\,\=\:\@\/\?%]|%(?!2B|2b)} + end + + SLASH = '/' + EMPTY_STR = '' + + URIREGEX = /^(([^:\/?#]+):)?(\/\/([^\/?#]*))?([^?#]*)(\?([^#]*))?(#(.*))?$/ + + PORT_MAPPING = { + "http" => 80, + "https" => 443, + "ftp" => 21, + "tftp" => 69, + "sftp" => 22, + "ssh" => 22, + "svn+ssh" => 22, + "telnet" => 23, + "nntp" => 119, + "gopher" => 70, + "wais" => 210, + "ldap" => 389, + "prospero" => 1525 + }.freeze + + ## + # Returns a URI object based on the parsed string. + # + # @param [String, Addressable::URI, #to_str] uri + # The URI string to parse. + # No parsing is performed if the object is already an + # Addressable::URI. + # + # @return [Addressable::URI] The parsed URI. + def self.parse(uri) + # If we were given nil, return nil. + return nil unless uri + # If a URI object is passed, just return itself. + return uri.dup if uri.kind_of?(self) + + # If a URI object of the Ruby standard library variety is passed, + # convert it to a string, then parse the string. + # We do the check this way because we don't want to accidentally + # cause a missing constant exception to be thrown. + if uri.class.name =~ /^URI\b/ + uri = uri.to_s + end + + # Otherwise, convert to a String + begin + uri = uri.to_str + rescue TypeError, NoMethodError + raise TypeError, "Can't convert #{uri.class} into String." + end if not uri.is_a? String + + # This Regexp supplied as an example in RFC 3986, and it works great. + scan = uri.scan(URIREGEX) + fragments = scan[0] + scheme = fragments[1] + authority = fragments[3] + path = fragments[4] + query = fragments[6] + fragment = fragments[8] + user = nil + password = nil + host = nil + port = nil + if authority != nil + # The Regexp above doesn't split apart the authority. + userinfo = authority[/^([^\[\]]*)@/, 1] + if userinfo != nil + user = userinfo.strip[/^([^:]*):?/, 1] + password = userinfo.strip[/:(.*)$/, 1] + end + host = authority.sub( + /^([^\[\]]*)@/, EMPTY_STR + ).sub( + /:([^:@\[\]]*?)$/, EMPTY_STR + ) + port = authority[/:([^:@\[\]]*?)$/, 1] + end + if port == EMPTY_STR + port = nil + end + + return new( + :scheme => scheme, + :user => user, + :password => password, + :host => host, + :port => port, + :path => path, + :query => query, + :fragment => fragment + ) + end + + ## + # Converts an input to a URI. The input does not have to be a valid + # URI — the method will use heuristics to guess what URI was intended. + # This is not standards-compliant, merely user-friendly. + # + # @param [String, Addressable::URI, #to_str] uri + # The URI string to parse. + # No parsing is performed if the object is already an + # Addressable::URI. + # @param [Hash] hints + # A Hash of hints to the heuristic parser. + # Defaults to {:scheme => "http"}. + # + # @return [Addressable::URI] The parsed URI. + def self.heuristic_parse(uri, hints={}) + # If we were given nil, return nil. + return nil unless uri + # If a URI object is passed, just return itself. + return uri.dup if uri.kind_of?(self) + + # If a URI object of the Ruby standard library variety is passed, + # convert it to a string, then parse the string. + # We do the check this way because we don't want to accidentally + # cause a missing constant exception to be thrown. + if uri.class.name =~ /^URI\b/ + uri = uri.to_s + end + + if !uri.respond_to?(:to_str) + raise TypeError, "Can't convert #{uri.class} into String." + end + # Otherwise, convert to a String + uri = uri.to_str.dup.strip + hints = { + :scheme => "http" + }.merge(hints) + case uri + when /^http:\//i + uri.sub!(/^http:\/+/i, "http://") + when /^https:\//i + uri.sub!(/^https:\/+/i, "https://") + when /^feed:\/+http:\//i + uri.sub!(/^feed:\/+http:\/+/i, "feed:http://") + when /^feed:\//i + uri.sub!(/^feed:\/+/i, "feed://") + when %r[^file:/{4}]i + uri.sub!(%r[^file:/+]i, "file:////") + when %r[^file://localhost/]i + uri.sub!(%r[^file://localhost/+]i, "file:///") + when %r[^file:/+]i + uri.sub!(%r[^file:/+]i, "file:///") + when /^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}/ + uri.sub!(/^/, hints[:scheme] + "://") + when /\A\d+\..*:\d+\z/ + uri = "#{hints[:scheme]}://#{uri}" + end + match = uri.match(URIREGEX) + fragments = match.captures + authority = fragments[3] + if authority && authority.length > 0 + new_authority = authority.tr("\\", "/").gsub(" ", "%20") + # NOTE: We want offset 4, not 3! + offset = match.offset(4) + uri = uri.dup + uri[offset[0]...offset[1]] = new_authority + end + parsed = self.parse(uri) + if parsed.scheme =~ /^[^\/?#\.]+\.[^\/?#]+$/ + parsed = self.parse(hints[:scheme] + "://" + uri) + end + if parsed.path.include?(".") + if parsed.path[/\b@\b/] + parsed.scheme = "mailto" unless parsed.scheme + elsif new_host = parsed.path[/^([^\/]+\.[^\/]*)/, 1] + parsed.defer_validation do + new_path = parsed.path.sub( + Regexp.new("^" + Regexp.escape(new_host)), EMPTY_STR) + parsed.host = new_host + parsed.path = new_path + parsed.scheme = hints[:scheme] unless parsed.scheme + end + end + end + return parsed + end + + ## + # Converts a path to a file scheme URI. If the path supplied is + # relative, it will be returned as a relative URI. If the path supplied + # is actually a non-file URI, it will parse the URI as if it had been + # parsed with Addressable::URI.parse. Handles all of the + # various Microsoft-specific formats for specifying paths. + # + # @param [String, Addressable::URI, #to_str] path + # Typically a String path to a file or directory, but + # will return a sensible return value if an absolute URI is supplied + # instead. + # + # @return [Addressable::URI] + # The parsed file scheme URI or the original URI if some other URI + # scheme was provided. + # + # @example + # base = Addressable::URI.convert_path("/absolute/path/") + # uri = Addressable::URI.convert_path("relative/path") + # (base + uri).to_s + # #=> "file:///absolute/path/relative/path" + # + # Addressable::URI.convert_path( + # "c:\\windows\\My Documents 100%20\\foo.txt" + # ).to_s + # #=> "file:///c:/windows/My%20Documents%20100%20/foo.txt" + # + # Addressable::URI.convert_path("http://example.com/").to_s + # #=> "http://example.com/" + def self.convert_path(path) + # If we were given nil, return nil. + return nil unless path + # If a URI object is passed, just return itself. + return path if path.kind_of?(self) + if !path.respond_to?(:to_str) + raise TypeError, "Can't convert #{path.class} into String." + end + # Otherwise, convert to a String + path = path.to_str.strip + + path.sub!(/^file:\/?\/?/, EMPTY_STR) if path =~ /^file:\/?\/?/ + path = SLASH + path if path =~ /^([a-zA-Z])[\|:]/ + uri = self.parse(path) + + if uri.scheme == nil + # Adjust windows-style uris + uri.path.sub!(/^\/?([a-zA-Z])[\|:][\\\/]/) do + "/#{$1.downcase}:/" + end + uri.path.tr!("\\", SLASH) + if File.exist?(uri.path) && + File.stat(uri.path).directory? + uri.path.chomp!(SLASH) + uri.path = uri.path + '/' + end + + # If the path is absolute, set the scheme and host. + if uri.path.start_with?(SLASH) + uri.scheme = "file" + uri.host = EMPTY_STR + end + uri.normalize! + end + + return uri + end + + ## + # Joins several URIs together. + # + # @param [String, Addressable::URI, #to_str] *uris + # The URIs to join. + # + # @return [Addressable::URI] The joined URI. + # + # @example + # base = "http://example.com/" + # uri = Addressable::URI.parse("relative/path") + # Addressable::URI.join(base, uri) + # #=> # + def self.join(*uris) + uri_objects = uris.collect do |uri| + if !uri.respond_to?(:to_str) + raise TypeError, "Can't convert #{uri.class} into String." + end + uri.kind_of?(self) ? uri : self.parse(uri.to_str) + end + result = uri_objects.shift.dup + for uri in uri_objects + result.join!(uri) + end + return result + end + + ## + # Tables used to optimize encoding operations in `self.encode_component` + # and `self.normalize_component` + SEQUENCE_ENCODING_TABLE = Hash.new do |hash, sequence| + hash[sequence] = sequence.unpack("C*").map do |c| + format("%02x", c) + end.join + end + + SEQUENCE_UPCASED_PERCENT_ENCODING_TABLE = Hash.new do |hash, sequence| + hash[sequence] = sequence.unpack("C*").map do |c| + format("%%%02X", c) + end.join + end + + ## + # Percent encodes a URI component. + # + # @param [String, #to_str] component The URI component to encode. + # + # @param [String, Regexp] character_class + # The characters which are not percent encoded. If a String + # is passed, the String must be formatted as a regular + # expression character class. (Do not include the surrounding square + # brackets.) For example, "b-zB-Z0-9" would cause + # everything but the letters 'b' through 'z' and the numbers '0' through + # '9' to be percent encoded. If a Regexp is passed, the + # value /[^b-zB-Z0-9]/ would have the same effect. A set of + # useful String values may be found in the + # Addressable::URI::CharacterClasses module. The default + # value is the reserved plus unreserved character classes specified in + # RFC 3986. + # + # @param [Regexp] upcase_encoded + # A string of characters that may already be percent encoded, and whose + # encodings should be upcased. This allows normalization of percent + # encodings for characters not included in the + # character_class. + # + # @return [String] The encoded component. + # + # @example + # Addressable::URI.encode_component("simple/example", "b-zB-Z0-9") + # => "simple%2Fex%61mple" + # Addressable::URI.encode_component("simple/example", /[^b-zB-Z0-9]/) + # => "simple%2Fex%61mple" + # Addressable::URI.encode_component( + # "simple/example", Addressable::URI::CharacterClasses::UNRESERVED + # ) + # => "simple%2Fexample" + def self.encode_component(component, character_class= + CharacterClasses::RESERVED + CharacterClasses::UNRESERVED, + upcase_encoded='') + return nil if component.nil? + + begin + if component.kind_of?(Symbol) || + component.kind_of?(Numeric) || + component.kind_of?(TrueClass) || + component.kind_of?(FalseClass) + component = component.to_s + else + component = component.to_str + end + rescue TypeError, NoMethodError + raise TypeError, "Can't convert #{component.class} into String." + end if !component.is_a? String + + if ![String, Regexp].include?(character_class.class) + raise TypeError, + "Expected String or Regexp, got #{character_class.inspect}" + end + if character_class.kind_of?(String) + character_class = /[^#{character_class}]/ + end + # We can't perform regexps on invalid UTF sequences, but + # here we need to, so switch to ASCII. + component = component.dup + component.force_encoding(Encoding::ASCII_8BIT) + # Avoiding gsub! because there are edge cases with frozen strings + component = component.gsub(character_class) do |sequence| + SEQUENCE_UPCASED_PERCENT_ENCODING_TABLE[sequence] + end + if upcase_encoded.length > 0 + upcase_encoded_chars = upcase_encoded.chars.map do |char| + SEQUENCE_ENCODING_TABLE[char] + end + component = component.gsub(/%(#{upcase_encoded_chars.join('|')})/, + &:upcase) + end + return component + end + + class << self + alias_method :escape_component, :encode_component + end + + ## + # Unencodes any percent encoded characters within a URI component. + # This method may be used for unencoding either components or full URIs, + # however, it is recommended to use the unencode_component + # alias when unencoding components. + # + # @param [String, Addressable::URI, #to_str] uri + # The URI or component to unencode. + # + # @param [Class] return_type + # The type of object to return. + # This value may only be set to String or + # Addressable::URI. All other values are invalid. Defaults + # to String. + # + # @param [String] leave_encoded + # A string of characters to leave encoded. If a percent encoded character + # in this list is encountered then it will remain percent encoded. + # + # @return [String, Addressable::URI] + # The unencoded component or URI. + # The return type is determined by the return_type + # parameter. + def self.unencode(uri, return_type=String, leave_encoded='') + return nil if uri.nil? + + begin + uri = uri.to_str + rescue NoMethodError, TypeError + raise TypeError, "Can't convert #{uri.class} into String." + end if !uri.is_a? String + if ![String, ::Addressable::URI].include?(return_type) + raise TypeError, + "Expected Class (String or Addressable::URI), " + + "got #{return_type.inspect}" + end + uri = uri.dup + # Seriously, only use UTF-8. I'm really not kidding! + uri.force_encoding("utf-8") + + unless leave_encoded.empty? + leave_encoded = leave_encoded.dup.force_encoding("utf-8") + end + + result = uri.gsub(/%[0-9a-f]{2}/iu) do |sequence| + c = sequence[1..3].to_i(16).chr + c.force_encoding("utf-8") + leave_encoded.include?(c) ? sequence : c + end + result.force_encoding("utf-8") + if return_type == String + return result + elsif return_type == ::Addressable::URI + return ::Addressable::URI.parse(result) + end + end + + class << self + alias_method :unescape, :unencode + alias_method :unencode_component, :unencode + alias_method :unescape_component, :unencode + end + + + ## + # Normalizes the encoding of a URI component. + # + # @param [String, #to_str] component The URI component to encode. + # + # @param [String, Regexp] character_class + # The characters which are not percent encoded. If a String + # is passed, the String must be formatted as a regular + # expression character class. (Do not include the surrounding square + # brackets.) For example, "b-zB-Z0-9" would cause + # everything but the letters 'b' through 'z' and the numbers '0' + # through '9' to be percent encoded. If a Regexp is passed, + # the value /[^b-zB-Z0-9]/ would have the same effect. A + # set of useful String values may be found in the + # Addressable::URI::CharacterClasses module. The default + # value is the reserved plus unreserved character classes specified in + # RFC 3986. + # + # @param [String] leave_encoded + # When character_class is a String then + # leave_encoded is a string of characters that should remain + # percent encoded while normalizing the component; if they appear percent + # encoded in the original component, then they will be upcased ("%2f" + # normalized to "%2F") but otherwise left alone. + # + # @return [String] The normalized component. + # + # @example + # Addressable::URI.normalize_component("simpl%65/%65xampl%65", "b-zB-Z") + # => "simple%2Fex%61mple" + # Addressable::URI.normalize_component( + # "simpl%65/%65xampl%65", /[^b-zB-Z]/ + # ) + # => "simple%2Fex%61mple" + # Addressable::URI.normalize_component( + # "simpl%65/%65xampl%65", + # Addressable::URI::CharacterClasses::UNRESERVED + # ) + # => "simple%2Fexample" + # Addressable::URI.normalize_component( + # "one%20two%2fthree%26four", + # "0-9a-zA-Z &/", + # "/" + # ) + # => "one two%2Fthree&four" + def self.normalize_component(component, character_class= + CharacterClasses::RESERVED + CharacterClasses::UNRESERVED, + leave_encoded='') + return nil if component.nil? + + begin + component = component.to_str + rescue NoMethodError, TypeError + raise TypeError, "Can't convert #{component.class} into String." + end if !component.is_a? String + + if ![String, Regexp].include?(character_class.class) + raise TypeError, + "Expected String or Regexp, got #{character_class.inspect}" + end + if character_class.kind_of?(String) + leave_re = if leave_encoded.length > 0 + character_class = "#{character_class}%" unless character_class.include?('%') + + "|%(?!#{leave_encoded.chars.map do |char| + seq = SEQUENCE_ENCODING_TABLE[char] + [seq.upcase, seq.downcase] + end.flatten.join('|')})" + end + + character_class = if leave_re + /[^#{character_class}]#{leave_re}/ + else + /[^#{character_class}]/ + end + end + # We can't perform regexps on invalid UTF sequences, but + # here we need to, so switch to ASCII. + component = component.dup + component.force_encoding(Encoding::ASCII_8BIT) + unencoded = self.unencode_component(component, String, leave_encoded) + begin + encoded = self.encode_component( + Addressable::IDNA.unicode_normalize_kc(unencoded), + character_class, + leave_encoded + ) + rescue ArgumentError + encoded = self.encode_component(unencoded) + end + encoded.force_encoding(Encoding::UTF_8) + return encoded + end + + ## + # Percent encodes any special characters in the URI. + # + # @param [String, Addressable::URI, #to_str] uri + # The URI to encode. + # + # @param [Class] return_type + # The type of object to return. + # This value may only be set to String or + # Addressable::URI. All other values are invalid. Defaults + # to String. + # + # @return [String, Addressable::URI] + # The encoded URI. + # The return type is determined by the return_type + # parameter. + def self.encode(uri, return_type=String) + return nil if uri.nil? + + begin + uri = uri.to_str + rescue NoMethodError, TypeError + raise TypeError, "Can't convert #{uri.class} into String." + end if !uri.is_a? String + + if ![String, ::Addressable::URI].include?(return_type) + raise TypeError, + "Expected Class (String or Addressable::URI), " + + "got #{return_type.inspect}" + end + uri_object = uri.kind_of?(self) ? uri : self.parse(uri) + encoded_uri = Addressable::URI.new( + :scheme => self.encode_component(uri_object.scheme, + Addressable::URI::CharacterClasses::SCHEME), + :authority => self.encode_component(uri_object.authority, + Addressable::URI::CharacterClasses::AUTHORITY), + :path => self.encode_component(uri_object.path, + Addressable::URI::CharacterClasses::PATH), + :query => self.encode_component(uri_object.query, + Addressable::URI::CharacterClasses::QUERY), + :fragment => self.encode_component(uri_object.fragment, + Addressable::URI::CharacterClasses::FRAGMENT) + ) + if return_type == String + return encoded_uri.to_s + elsif return_type == ::Addressable::URI + return encoded_uri + end + end + + class << self + alias_method :escape, :encode + end + + ## + # Normalizes the encoding of a URI. Characters within a hostname are + # not percent encoded to allow for internationalized domain names. + # + # @param [String, Addressable::URI, #to_str] uri + # The URI to encode. + # + # @param [Class] return_type + # The type of object to return. + # This value may only be set to String or + # Addressable::URI. All other values are invalid. Defaults + # to String. + # + # @return [String, Addressable::URI] + # The encoded URI. + # The return type is determined by the return_type + # parameter. + def self.normalized_encode(uri, return_type=String) + begin + uri = uri.to_str + rescue NoMethodError, TypeError + raise TypeError, "Can't convert #{uri.class} into String." + end if !uri.is_a? String + + if ![String, ::Addressable::URI].include?(return_type) + raise TypeError, + "Expected Class (String or Addressable::URI), " + + "got #{return_type.inspect}" + end + uri_object = uri.kind_of?(self) ? uri : self.parse(uri) + components = { + :scheme => self.unencode_component(uri_object.scheme), + :user => self.unencode_component(uri_object.user), + :password => self.unencode_component(uri_object.password), + :host => self.unencode_component(uri_object.host), + :port => (uri_object.port.nil? ? nil : uri_object.port.to_s), + :path => self.unencode_component(uri_object.path), + :query => self.unencode_component(uri_object.query), + :fragment => self.unencode_component(uri_object.fragment) + } + components.each do |key, value| + if value != nil + begin + components[key] = + Addressable::IDNA.unicode_normalize_kc(value.to_str) + rescue ArgumentError + # Likely a malformed UTF-8 character, skip unicode normalization + components[key] = value.to_str + end + end + end + encoded_uri = Addressable::URI.new( + :scheme => self.encode_component(components[:scheme], + Addressable::URI::CharacterClasses::SCHEME), + :user => self.encode_component(components[:user], + Addressable::URI::CharacterClasses::UNRESERVED), + :password => self.encode_component(components[:password], + Addressable::URI::CharacterClasses::UNRESERVED), + :host => components[:host], + :port => components[:port], + :path => self.encode_component(components[:path], + Addressable::URI::CharacterClasses::PATH), + :query => self.encode_component(components[:query], + Addressable::URI::CharacterClasses::QUERY), + :fragment => self.encode_component(components[:fragment], + Addressable::URI::CharacterClasses::FRAGMENT) + ) + if return_type == String + return encoded_uri.to_s + elsif return_type == ::Addressable::URI + return encoded_uri + end + end + + ## + # Encodes a set of key/value pairs according to the rules for the + # application/x-www-form-urlencoded MIME type. + # + # @param [#to_hash, #to_ary] form_values + # The form values to encode. + # + # @param [TrueClass, FalseClass] sort + # Sort the key/value pairs prior to encoding. + # Defaults to false. + # + # @return [String] + # The encoded value. + def self.form_encode(form_values, sort=false) + if form_values.respond_to?(:to_hash) + form_values = form_values.to_hash.to_a + elsif form_values.respond_to?(:to_ary) + form_values = form_values.to_ary + else + raise TypeError, "Can't convert #{form_values.class} into Array." + end + + form_values = form_values.inject([]) do |accu, (key, value)| + if value.kind_of?(Array) + value.each do |v| + accu << [key.to_s, v.to_s] + end + else + accu << [key.to_s, value.to_s] + end + accu + end + + if sort + # Useful for OAuth and optimizing caching systems + form_values = form_values.sort + end + escaped_form_values = form_values.map do |(key, value)| + # Line breaks are CRLF pairs + [ + self.encode_component( + key.gsub(/(\r\n|\n|\r)/, "\r\n"), + CharacterClasses::UNRESERVED + ).gsub("%20", "+"), + self.encode_component( + value.gsub(/(\r\n|\n|\r)/, "\r\n"), + CharacterClasses::UNRESERVED + ).gsub("%20", "+") + ] + end + return escaped_form_values.map do |(key, value)| + "#{key}=#{value}" + end.join("&") + end + + ## + # Decodes a String according to the rules for the + # application/x-www-form-urlencoded MIME type. + # + # @param [String, #to_str] encoded_value + # The form values to decode. + # + # @return [Array] + # The decoded values. + # This is not a Hash because of the possibility for + # duplicate keys. + def self.form_unencode(encoded_value) + if !encoded_value.respond_to?(:to_str) + raise TypeError, "Can't convert #{encoded_value.class} into String." + end + encoded_value = encoded_value.to_str + split_values = encoded_value.split("&").map do |pair| + pair.split("=", 2) + end + return split_values.map do |(key, value)| + [ + key ? self.unencode_component( + key.gsub("+", "%20")).gsub(/(\r\n|\n|\r)/, "\n") : nil, + value ? (self.unencode_component( + value.gsub("+", "%20")).gsub(/(\r\n|\n|\r)/, "\n")) : nil + ] + end + end + + ## + # Creates a new uri object from component parts. + # + # @option [String, #to_str] scheme The scheme component. + # @option [String, #to_str] user The user component. + # @option [String, #to_str] password The password component. + # @option [String, #to_str] userinfo + # The userinfo component. If this is supplied, the user and password + # components must be omitted. + # @option [String, #to_str] host The host component. + # @option [String, #to_str] port The port component. + # @option [String, #to_str] authority + # The authority component. If this is supplied, the user, password, + # userinfo, host, and port components must be omitted. + # @option [String, #to_str] path The path component. + # @option [String, #to_str] query The query component. + # @option [String, #to_str] fragment The fragment component. + # + # @return [Addressable::URI] The constructed URI object. + def initialize(options={}) + if options.has_key?(:authority) + if (options.keys & [:userinfo, :user, :password, :host, :port]).any? + raise ArgumentError, + "Cannot specify both an authority and any of the components " + + "within the authority." + end + end + if options.has_key?(:userinfo) + if (options.keys & [:user, :password]).any? + raise ArgumentError, + "Cannot specify both a userinfo and either the user or password." + end + end + + self.defer_validation do + # Bunch of crazy logic required because of the composite components + # like userinfo and authority. + self.scheme = options[:scheme] if options[:scheme] + self.user = options[:user] if options[:user] + self.password = options[:password] if options[:password] + self.userinfo = options[:userinfo] if options[:userinfo] + self.host = options[:host] if options[:host] + self.port = options[:port] if options[:port] + self.authority = options[:authority] if options[:authority] + self.path = options[:path] if options[:path] + self.query = options[:query] if options[:query] + self.query_values = options[:query_values] if options[:query_values] + self.fragment = options[:fragment] if options[:fragment] + end + self.to_s + end + + ## + # Freeze URI, initializing instance variables. + # + # @return [Addressable::URI] The frozen URI object. + def freeze + self.normalized_scheme + self.normalized_user + self.normalized_password + self.normalized_userinfo + self.normalized_host + self.normalized_port + self.normalized_authority + self.normalized_site + self.normalized_path + self.normalized_query + self.normalized_fragment + self.hash + super + end + + ## + # The scheme component for this URI. + # + # @return [String] The scheme component. + def scheme + return defined?(@scheme) ? @scheme : nil + end + + ## + # The scheme component for this URI, normalized. + # + # @return [String] The scheme component, normalized. + def normalized_scheme + return nil unless self.scheme + @normalized_scheme ||= begin + if self.scheme =~ /^\s*ssh\+svn\s*$/i + "svn+ssh".dup + else + Addressable::URI.normalize_component( + self.scheme.strip.downcase, + Addressable::URI::NormalizeCharacterClasses::SCHEME + ) + end + end + # All normalized values should be UTF-8 + @normalized_scheme.force_encoding(Encoding::UTF_8) if @normalized_scheme + @normalized_scheme + end + + ## + # Sets the scheme component for this URI. + # + # @param [String, #to_str] new_scheme The new scheme component. + def scheme=(new_scheme) + if new_scheme && !new_scheme.respond_to?(:to_str) + raise TypeError, "Can't convert #{new_scheme.class} into String." + elsif new_scheme + new_scheme = new_scheme.to_str + end + if new_scheme && new_scheme !~ /\A[a-z][a-z0-9\.\+\-]*\z/i + raise InvalidURIError, "Invalid scheme format: '#{new_scheme}'" + end + @scheme = new_scheme + @scheme = nil if @scheme.to_s.strip.empty? + + # Reset dependent values + remove_instance_variable(:@normalized_scheme) if defined?(@normalized_scheme) + remove_composite_values + + # Ensure we haven't created an invalid URI + validate() + end + + ## + # The user component for this URI. + # + # @return [String] The user component. + def user + return defined?(@user) ? @user : nil + end + + ## + # The user component for this URI, normalized. + # + # @return [String] The user component, normalized. + def normalized_user + return nil unless self.user + return @normalized_user if defined?(@normalized_user) + @normalized_user ||= begin + if normalized_scheme =~ /https?/ && self.user.strip.empty? && + (!self.password || self.password.strip.empty?) + nil + else + Addressable::URI.normalize_component( + self.user.strip, + Addressable::URI::NormalizeCharacterClasses::UNRESERVED + ) + end + end + # All normalized values should be UTF-8 + @normalized_user.force_encoding(Encoding::UTF_8) if @normalized_user + @normalized_user + end + + ## + # Sets the user component for this URI. + # + # @param [String, #to_str] new_user The new user component. + def user=(new_user) + if new_user && !new_user.respond_to?(:to_str) + raise TypeError, "Can't convert #{new_user.class} into String." + end + @user = new_user ? new_user.to_str : nil + + # You can't have a nil user with a non-nil password + if password != nil + @user = EMPTY_STR if @user.nil? + end + + # Reset dependent values + remove_instance_variable(:@userinfo) if defined?(@userinfo) + remove_instance_variable(:@normalized_userinfo) if defined?(@normalized_userinfo) + remove_instance_variable(:@authority) if defined?(@authority) + remove_instance_variable(:@normalized_user) if defined?(@normalized_user) + remove_composite_values + + # Ensure we haven't created an invalid URI + validate() + end + + ## + # The password component for this URI. + # + # @return [String] The password component. + def password + return defined?(@password) ? @password : nil + end + + ## + # The password component for this URI, normalized. + # + # @return [String] The password component, normalized. + def normalized_password + return nil unless self.password + return @normalized_password if defined?(@normalized_password) + @normalized_password ||= begin + if self.normalized_scheme =~ /https?/ && self.password.strip.empty? && + (!self.user || self.user.strip.empty?) + nil + else + Addressable::URI.normalize_component( + self.password.strip, + Addressable::URI::NormalizeCharacterClasses::UNRESERVED + ) + end + end + # All normalized values should be UTF-8 + if @normalized_password + @normalized_password.force_encoding(Encoding::UTF_8) + end + @normalized_password + end + + ## + # Sets the password component for this URI. + # + # @param [String, #to_str] new_password The new password component. + def password=(new_password) + if new_password && !new_password.respond_to?(:to_str) + raise TypeError, "Can't convert #{new_password.class} into String." + end + @password = new_password ? new_password.to_str : nil + + # You can't have a nil user with a non-nil password + @password ||= nil + @user ||= nil + if @password != nil + @user = EMPTY_STR if @user.nil? + end + + # Reset dependent values + remove_instance_variable(:@userinfo) if defined?(@userinfo) + remove_instance_variable(:@normalized_userinfo) if defined?(@normalized_userinfo) + remove_instance_variable(:@authority) if defined?(@authority) + remove_instance_variable(:@normalized_password) if defined?(@normalized_password) + remove_composite_values + + # Ensure we haven't created an invalid URI + validate() + end + + ## + # The userinfo component for this URI. + # Combines the user and password components. + # + # @return [String] The userinfo component. + def userinfo + current_user = self.user + current_password = self.password + (current_user || current_password) && @userinfo ||= begin + if current_user && current_password + "#{current_user}:#{current_password}" + elsif current_user && !current_password + "#{current_user}" + end + end + end + + ## + # The userinfo component for this URI, normalized. + # + # @return [String] The userinfo component, normalized. + def normalized_userinfo + return nil unless self.userinfo + return @normalized_userinfo if defined?(@normalized_userinfo) + @normalized_userinfo ||= begin + current_user = self.normalized_user + current_password = self.normalized_password + if !current_user && !current_password + nil + elsif current_user && current_password + "#{current_user}:#{current_password}".dup + elsif current_user && !current_password + "#{current_user}".dup + end + end + # All normalized values should be UTF-8 + if @normalized_userinfo + @normalized_userinfo.force_encoding(Encoding::UTF_8) + end + @normalized_userinfo + end + + ## + # Sets the userinfo component for this URI. + # + # @param [String, #to_str] new_userinfo The new userinfo component. + def userinfo=(new_userinfo) + if new_userinfo && !new_userinfo.respond_to?(:to_str) + raise TypeError, "Can't convert #{new_userinfo.class} into String." + end + new_user, new_password = if new_userinfo + [ + new_userinfo.to_str.strip[/^(.*):/, 1], + new_userinfo.to_str.strip[/:(.*)$/, 1] + ] + else + [nil, nil] + end + + # Password assigned first to ensure validity in case of nil + self.password = new_password + self.user = new_user + + # Reset dependent values + remove_instance_variable(:@authority) if defined?(@authority) + remove_composite_values + + # Ensure we haven't created an invalid URI + validate() + end + + ## + # The host component for this URI. + # + # @return [String] The host component. + def host + return defined?(@host) ? @host : nil + end + + ## + # The host component for this URI, normalized. + # + # @return [String] The host component, normalized. + def normalized_host + return nil unless self.host + + @normalized_host ||= begin + if !self.host.strip.empty? + result = ::Addressable::IDNA.to_ascii( + URI.unencode_component(self.host.strip.downcase) + ) + if result =~ /[^\.]\.$/ + # Single trailing dots are unnecessary. + result = result[0...-1] + end + result = Addressable::URI.normalize_component( + result, + NormalizeCharacterClasses::HOST + ) + result + else + EMPTY_STR.dup + end + end + # All normalized values should be UTF-8 + if @normalized_host && !@normalized_host.empty? + @normalized_host.force_encoding(Encoding::UTF_8) + end + @normalized_host + end + + ## + # Sets the host component for this URI. + # + # @param [String, #to_str] new_host The new host component. + def host=(new_host) + if new_host && !new_host.respond_to?(:to_str) + raise TypeError, "Can't convert #{new_host.class} into String." + end + @host = new_host ? new_host.to_str : nil + + # Reset dependent values + remove_instance_variable(:@authority) if defined?(@authority) + remove_instance_variable(:@normalized_host) if defined?(@normalized_host) + remove_composite_values + + # Ensure we haven't created an invalid URI + validate() + end + + ## + # This method is same as URI::Generic#host except + # brackets for IPv6 (and 'IPvFuture') addresses are removed. + # + # @see Addressable::URI#host + # + # @return [String] The hostname for this URI. + def hostname + v = self.host + /\A\[(.*)\]\z/ =~ v ? $1 : v + end + + ## + # This method is same as URI::Generic#host= except + # the argument can be a bare IPv6 address (or 'IPvFuture'). + # + # @see Addressable::URI#host= + # + # @param [String, #to_str] new_hostname The new hostname for this URI. + def hostname=(new_hostname) + if new_hostname && + (new_hostname.respond_to?(:ipv4?) || new_hostname.respond_to?(:ipv6?)) + new_hostname = new_hostname.to_s + elsif new_hostname && !new_hostname.respond_to?(:to_str) + raise TypeError, "Can't convert #{new_hostname.class} into String." + end + v = new_hostname ? new_hostname.to_str : nil + v = "[#{v}]" if /\A\[.*\]\z/ !~ v && /:/ =~ v + self.host = v + end + + ## + # Returns the top-level domain for this host. + # + # @example + # Addressable::URI.parse("http://www.example.co.uk").tld # => "co.uk" + def tld + PublicSuffix.parse(self.host, ignore_private: true).tld + end + + ## + # Sets the top-level domain for this URI. + # + # @param [String, #to_str] new_tld The new top-level domain. + def tld=(new_tld) + replaced_tld = host.sub(/#{tld}\z/, new_tld) + self.host = PublicSuffix::Domain.new(replaced_tld).to_s + end + + ## + # Returns the public suffix domain for this host. + # + # @example + # Addressable::URI.parse("http://www.example.co.uk").domain # => "example.co.uk" + def domain + PublicSuffix.domain(self.host, ignore_private: true) + end + + ## + # The authority component for this URI. + # Combines the user, password, host, and port components. + # + # @return [String] The authority component. + def authority + self.host && @authority ||= begin + authority = String.new + if self.userinfo != nil + authority << "#{self.userinfo}@" + end + authority << self.host + if self.port != nil + authority << ":#{self.port}" + end + authority + end + end + + ## + # The authority component for this URI, normalized. + # + # @return [String] The authority component, normalized. + def normalized_authority + return nil unless self.authority + @normalized_authority ||= begin + authority = String.new + if self.normalized_userinfo != nil + authority << "#{self.normalized_userinfo}@" + end + authority << self.normalized_host + if self.normalized_port != nil + authority << ":#{self.normalized_port}" + end + authority + end + # All normalized values should be UTF-8 + if @normalized_authority + @normalized_authority.force_encoding(Encoding::UTF_8) + end + @normalized_authority + end + + ## + # Sets the authority component for this URI. + # + # @param [String, #to_str] new_authority The new authority component. + def authority=(new_authority) + if new_authority + if !new_authority.respond_to?(:to_str) + raise TypeError, "Can't convert #{new_authority.class} into String." + end + new_authority = new_authority.to_str + new_userinfo = new_authority[/^([^\[\]]*)@/, 1] + if new_userinfo + new_user = new_userinfo.strip[/^([^:]*):?/, 1] + new_password = new_userinfo.strip[/:(.*)$/, 1] + end + new_host = new_authority.sub( + /^([^\[\]]*)@/, EMPTY_STR + ).sub( + /:([^:@\[\]]*?)$/, EMPTY_STR + ) + new_port = + new_authority[/:([^:@\[\]]*?)$/, 1] + end + + # Password assigned first to ensure validity in case of nil + self.password = defined?(new_password) ? new_password : nil + self.user = defined?(new_user) ? new_user : nil + self.host = defined?(new_host) ? new_host : nil + self.port = defined?(new_port) ? new_port : nil + + # Reset dependent values + remove_instance_variable(:@userinfo) if defined?(@userinfo) + remove_instance_variable(:@normalized_userinfo) if defined?(@normalized_userinfo) + remove_composite_values + + # Ensure we haven't created an invalid URI + validate() + end + + ## + # The origin for this URI, serialized to ASCII, as per + # RFC 6454, section 6.2. + # + # @return [String] The serialized origin. + def origin + if self.scheme && self.authority + if self.normalized_port + "#{self.normalized_scheme}://#{self.normalized_host}" + + ":#{self.normalized_port}" + else + "#{self.normalized_scheme}://#{self.normalized_host}" + end + else + "null" + end + end + + ## + # Sets the origin for this URI, serialized to ASCII, as per + # RFC 6454, section 6.2. This assignment will reset the `userinfo` + # component. + # + # @param [String, #to_str] new_origin The new origin component. + def origin=(new_origin) + if new_origin + if !new_origin.respond_to?(:to_str) + raise TypeError, "Can't convert #{new_origin.class} into String." + end + new_origin = new_origin.to_str + new_scheme = new_origin[/^([^:\/?#]+):\/\//, 1] + unless new_scheme + raise InvalidURIError, 'An origin cannot omit the scheme.' + end + new_host = new_origin[/:\/\/([^\/?#:]+)/, 1] + unless new_host + raise InvalidURIError, 'An origin cannot omit the host.' + end + new_port = new_origin[/:([^:@\[\]\/]*?)$/, 1] + end + + self.scheme = defined?(new_scheme) ? new_scheme : nil + self.host = defined?(new_host) ? new_host : nil + self.port = defined?(new_port) ? new_port : nil + self.userinfo = nil + + # Reset dependent values + remove_instance_variable(:@userinfo) if defined?(@userinfo) + remove_instance_variable(:@normalized_userinfo) if defined?(@normalized_userinfo) + remove_instance_variable(:@authority) if defined?(@authority) + remove_instance_variable(:@normalized_authority) if defined?(@normalized_authority) + remove_composite_values + + # Ensure we haven't created an invalid URI + validate() + end + + # Returns an array of known ip-based schemes. These schemes typically + # use a similar URI form: + # //:@:/ + def self.ip_based_schemes + return self.port_mapping.keys + end + + # Returns a hash of common IP-based schemes and their default port + # numbers. Adding new schemes to this hash, as necessary, will allow + # for better URI normalization. + def self.port_mapping + PORT_MAPPING + end + + ## + # The port component for this URI. + # This is the port number actually given in the URI. This does not + # infer port numbers from default values. + # + # @return [Integer] The port component. + def port + return defined?(@port) ? @port : nil + end + + ## + # The port component for this URI, normalized. + # + # @return [Integer] The port component, normalized. + def normalized_port + return nil unless self.port + return @normalized_port if defined?(@normalized_port) + @normalized_port ||= begin + if URI.port_mapping[self.normalized_scheme] == self.port + nil + else + self.port + end + end + end + + ## + # Sets the port component for this URI. + # + # @param [String, Integer, #to_s] new_port The new port component. + def port=(new_port) + if new_port != nil && new_port.respond_to?(:to_str) + new_port = Addressable::URI.unencode_component(new_port.to_str) + end + + if new_port.respond_to?(:valid_encoding?) && !new_port.valid_encoding? + raise InvalidURIError, "Invalid encoding in port" + end + + if new_port != nil && !(new_port.to_s =~ /^\d+$/) + raise InvalidURIError, + "Invalid port number: #{new_port.inspect}" + end + + @port = new_port.to_s.to_i + @port = nil if @port == 0 + + # Reset dependent values + remove_instance_variable(:@authority) if defined?(@authority) + remove_instance_variable(:@normalized_port) if defined?(@normalized_port) + remove_composite_values + + # Ensure we haven't created an invalid URI + validate() + end + + ## + # The inferred port component for this URI. + # This method will normalize to the default port for the URI's scheme if + # the port isn't explicitly specified in the URI. + # + # @return [Integer] The inferred port component. + def inferred_port + if self.port.to_i == 0 + self.default_port + else + self.port.to_i + end + end + + ## + # The default port for this URI's scheme. + # This method will always returns the default port for the URI's scheme + # regardless of the presence of an explicit port in the URI. + # + # @return [Integer] The default port. + def default_port + URI.port_mapping[self.scheme.strip.downcase] if self.scheme + end + + ## + # The combination of components that represent a site. + # Combines the scheme, user, password, host, and port components. + # Primarily useful for HTTP and HTTPS. + # + # For example, "http://example.com/path?query" would have a + # site value of "http://example.com". + # + # @return [String] The components that identify a site. + def site + (self.scheme || self.authority) && @site ||= begin + site_string = "".dup + site_string << "#{self.scheme}:" if self.scheme != nil + site_string << "//#{self.authority}" if self.authority != nil + site_string + end + end + + ## + # The normalized combination of components that represent a site. + # Combines the scheme, user, password, host, and port components. + # Primarily useful for HTTP and HTTPS. + # + # For example, "http://example.com/path?query" would have a + # site value of "http://example.com". + # + # @return [String] The normalized components that identify a site. + def normalized_site + return nil unless self.site + @normalized_site ||= begin + site_string = "".dup + if self.normalized_scheme != nil + site_string << "#{self.normalized_scheme}:" + end + if self.normalized_authority != nil + site_string << "//#{self.normalized_authority}" + end + site_string + end + # All normalized values should be UTF-8 + @normalized_site.force_encoding(Encoding::UTF_8) if @normalized_site + @normalized_site + end + + ## + # Sets the site value for this URI. + # + # @param [String, #to_str] new_site The new site value. + def site=(new_site) + if new_site + if !new_site.respond_to?(:to_str) + raise TypeError, "Can't convert #{new_site.class} into String." + end + new_site = new_site.to_str + # These two regular expressions derived from the primary parsing + # expression + self.scheme = new_site[/^(?:([^:\/?#]+):)?(?:\/\/(?:[^\/?#]*))?$/, 1] + self.authority = new_site[ + /^(?:(?:[^:\/?#]+):)?(?:\/\/([^\/?#]*))?$/, 1 + ] + else + self.scheme = nil + self.authority = nil + end + end + + ## + # The path component for this URI. + # + # @return [String] The path component. + def path + return defined?(@path) ? @path : EMPTY_STR + end + + NORMPATH = /^(?!\/)[^\/:]*:.*$/ + ## + # The path component for this URI, normalized. + # + # @return [String] The path component, normalized. + def normalized_path + @normalized_path ||= begin + path = self.path.to_s + if self.scheme == nil && path =~ NORMPATH + # Relative paths with colons in the first segment are ambiguous. + path = path.sub(":", "%2F") + end + # String#split(delimeter, -1) uses the more strict splitting behavior + # found by default in Python. + result = path.strip.split(SLASH, -1).map do |segment| + Addressable::URI.normalize_component( + segment, + Addressable::URI::NormalizeCharacterClasses::PCHAR + ) + end.join(SLASH) + + result = URI.normalize_path(result) + if result.empty? && + ["http", "https", "ftp", "tftp"].include?(self.normalized_scheme) + result = SLASH.dup + end + result + end + # All normalized values should be UTF-8 + @normalized_path.force_encoding(Encoding::UTF_8) if @normalized_path + @normalized_path + end + + ## + # Sets the path component for this URI. + # + # @param [String, #to_str] new_path The new path component. + def path=(new_path) + if new_path && !new_path.respond_to?(:to_str) + raise TypeError, "Can't convert #{new_path.class} into String." + end + @path = (new_path || EMPTY_STR).to_str + if !@path.empty? && @path[0..0] != SLASH && host != nil + @path = "/#{@path}" + end + + # Reset dependent values + remove_instance_variable(:@normalized_path) if defined?(@normalized_path) + remove_composite_values + + # Ensure we haven't created an invalid URI + validate() + end + + ## + # The basename, if any, of the file in the path component. + # + # @return [String] The path's basename. + def basename + # Path cannot be nil + return File.basename(self.path).sub(/;[^\/]*$/, EMPTY_STR) + end + + ## + # The extname, if any, of the file in the path component. + # Empty string if there is no extension. + # + # @return [String] The path's extname. + def extname + return nil unless self.path + return File.extname(self.basename) + end + + ## + # The query component for this URI. + # + # @return [String] The query component. + def query + return defined?(@query) ? @query : nil + end + + ## + # The query component for this URI, normalized. + # + # @return [String] The query component, normalized. + def normalized_query(*flags) + return nil unless self.query + return @normalized_query if defined?(@normalized_query) + @normalized_query ||= begin + modified_query_class = Addressable::URI::CharacterClasses::QUERY.dup + # Make sure possible key-value pair delimiters are escaped. + modified_query_class.sub!("\\&", "").sub!("\\;", "") + pairs = (query || "").split("&", -1) + pairs.delete_if(&:empty?).uniq! if flags.include?(:compacted) + pairs.sort! if flags.include?(:sorted) + component = pairs.map do |pair| + Addressable::URI.normalize_component( + pair, + Addressable::URI::NormalizeCharacterClasses::QUERY, + "+" + ) + end.join("&") + component == "" ? nil : component + end + # All normalized values should be UTF-8 + @normalized_query.force_encoding(Encoding::UTF_8) if @normalized_query + @normalized_query + end + + ## + # Sets the query component for this URI. + # + # @param [String, #to_str] new_query The new query component. + def query=(new_query) + if new_query && !new_query.respond_to?(:to_str) + raise TypeError, "Can't convert #{new_query.class} into String." + end + @query = new_query ? new_query.to_str : nil + + # Reset dependent values + remove_instance_variable(:@normalized_query) if defined?(@normalized_query) + remove_composite_values + end + + ## + # Converts the query component to a Hash value. + # + # @param [Class] return_type The return type desired. Value must be either + # `Hash` or `Array`. + # + # @return [Hash, Array, nil] The query string parsed as a Hash or Array + # or nil if the query string is blank. + # + # @example + # Addressable::URI.parse("?one=1&two=2&three=3").query_values + # #=> {"one" => "1", "two" => "2", "three" => "3"} + # Addressable::URI.parse("?one=two&one=three").query_values(Array) + # #=> [["one", "two"], ["one", "three"]] + # Addressable::URI.parse("?one=two&one=three").query_values(Hash) + # #=> {"one" => "three"} + # Addressable::URI.parse("?").query_values + # #=> {} + # Addressable::URI.parse("").query_values + # #=> nil + def query_values(return_type=Hash) + empty_accumulator = Array == return_type ? [] : {} + if return_type != Hash && return_type != Array + raise ArgumentError, "Invalid return type. Must be Hash or Array." + end + return nil if self.query == nil + split_query = self.query.split("&").map do |pair| + pair.split("=", 2) if pair && !pair.empty? + end.compact + return split_query.inject(empty_accumulator.dup) do |accu, pair| + # I'd rather use key/value identifiers instead of array lookups, + # but in this case I really want to maintain the exact pair structure, + # so it's best to make all changes in-place. + pair[0] = URI.unencode_component(pair[0]) + if pair[1].respond_to?(:to_str) + value = pair[1].to_str + # I loathe the fact that I have to do this. Stupid HTML 4.01. + # Treating '+' as a space was just an unbelievably bad idea. + # There was nothing wrong with '%20'! + # If it ain't broke, don't fix it! + value = value.tr("+", " ") if ["http", "https", nil].include?(scheme) + pair[1] = URI.unencode_component(value) + end + if return_type == Hash + accu[pair[0]] = pair[1] + else + accu << pair + end + accu + end + end + + ## + # Sets the query component for this URI from a Hash object. + # An empty Hash or Array will result in an empty query string. + # + # @param [Hash, #to_hash, Array] new_query_values The new query values. + # + # @example + # uri.query_values = {:a => "a", :b => ["c", "d", "e"]} + # uri.query + # # => "a=a&b=c&b=d&b=e" + # uri.query_values = [['a', 'a'], ['b', 'c'], ['b', 'd'], ['b', 'e']] + # uri.query + # # => "a=a&b=c&b=d&b=e" + # uri.query_values = [['a', 'a'], ['b', ['c', 'd', 'e']]] + # uri.query + # # => "a=a&b=c&b=d&b=e" + # uri.query_values = [['flag'], ['key', 'value']] + # uri.query + # # => "flag&key=value" + def query_values=(new_query_values) + if new_query_values == nil + self.query = nil + return nil + end + + if !new_query_values.is_a?(Array) + if !new_query_values.respond_to?(:to_hash) + raise TypeError, + "Can't convert #{new_query_values.class} into Hash." + end + new_query_values = new_query_values.to_hash + new_query_values = new_query_values.map do |key, value| + key = key.to_s if key.kind_of?(Symbol) + [key, value] + end + # Useful default for OAuth and caching. + # Only to be used for non-Array inputs. Arrays should preserve order. + new_query_values.sort! + end + + # new_query_values have form [['key1', 'value1'], ['key2', 'value2']] + buffer = "".dup + new_query_values.each do |key, value| + encoded_key = URI.encode_component( + key, CharacterClasses::UNRESERVED + ) + if value == nil + buffer << "#{encoded_key}&" + elsif value.kind_of?(Array) + value.each do |sub_value| + encoded_value = URI.encode_component( + sub_value, CharacterClasses::UNRESERVED + ) + buffer << "#{encoded_key}=#{encoded_value}&" + end + else + encoded_value = URI.encode_component( + value, CharacterClasses::UNRESERVED + ) + buffer << "#{encoded_key}=#{encoded_value}&" + end + end + self.query = buffer.chop + end + + ## + # The HTTP request URI for this URI. This is the path and the + # query string. + # + # @return [String] The request URI required for an HTTP request. + def request_uri + return nil if self.absolute? && self.scheme !~ /^https?$/i + return ( + (!self.path.empty? ? self.path : SLASH) + + (self.query ? "?#{self.query}" : EMPTY_STR) + ) + end + + ## + # Sets the HTTP request URI for this URI. + # + # @param [String, #to_str] new_request_uri The new HTTP request URI. + def request_uri=(new_request_uri) + if !new_request_uri.respond_to?(:to_str) + raise TypeError, "Can't convert #{new_request_uri.class} into String." + end + if self.absolute? && self.scheme !~ /^https?$/i + raise InvalidURIError, + "Cannot set an HTTP request URI for a non-HTTP URI." + end + new_request_uri = new_request_uri.to_str + path_component = new_request_uri[/^([^\?]*)\??(?:.*)$/, 1] + query_component = new_request_uri[/^(?:[^\?]*)\?(.*)$/, 1] + path_component = path_component.to_s + path_component = (!path_component.empty? ? path_component : SLASH) + self.path = path_component + self.query = query_component + + # Reset dependent values + remove_composite_values + end + + ## + # The fragment component for this URI. + # + # @return [String] The fragment component. + def fragment + return defined?(@fragment) ? @fragment : nil + end + + ## + # The fragment component for this URI, normalized. + # + # @return [String] The fragment component, normalized. + def normalized_fragment + return nil unless self.fragment + return @normalized_fragment if defined?(@normalized_fragment) + @normalized_fragment ||= begin + component = Addressable::URI.normalize_component( + self.fragment, + Addressable::URI::NormalizeCharacterClasses::FRAGMENT + ) + component == "" ? nil : component + end + # All normalized values should be UTF-8 + if @normalized_fragment + @normalized_fragment.force_encoding(Encoding::UTF_8) + end + @normalized_fragment + end + + ## + # Sets the fragment component for this URI. + # + # @param [String, #to_str] new_fragment The new fragment component. + def fragment=(new_fragment) + if new_fragment && !new_fragment.respond_to?(:to_str) + raise TypeError, "Can't convert #{new_fragment.class} into String." + end + @fragment = new_fragment ? new_fragment.to_str : nil + + # Reset dependent values + remove_instance_variable(:@normalized_fragment) if defined?(@normalized_fragment) + remove_composite_values + + # Ensure we haven't created an invalid URI + validate() + end + + ## + # Determines if the scheme indicates an IP-based protocol. + # + # @return [TrueClass, FalseClass] + # true if the scheme indicates an IP-based protocol. + # false otherwise. + def ip_based? + if self.scheme + return URI.ip_based_schemes.include?( + self.scheme.strip.downcase) + end + return false + end + + ## + # Determines if the URI is relative. + # + # @return [TrueClass, FalseClass] + # true if the URI is relative. false + # otherwise. + def relative? + return self.scheme.nil? + end + + ## + # Determines if the URI is absolute. + # + # @return [TrueClass, FalseClass] + # true if the URI is absolute. false + # otherwise. + def absolute? + return !relative? + end + + ## + # Joins two URIs together. + # + # @param [String, Addressable::URI, #to_str] The URI to join with. + # + # @return [Addressable::URI] The joined URI. + def join(uri) + if !uri.respond_to?(:to_str) + raise TypeError, "Can't convert #{uri.class} into String." + end + if !uri.kind_of?(URI) + # Otherwise, convert to a String, then parse. + uri = URI.parse(uri.to_str) + end + if uri.to_s.empty? + return self.dup + end + + joined_scheme = nil + joined_user = nil + joined_password = nil + joined_host = nil + joined_port = nil + joined_path = nil + joined_query = nil + joined_fragment = nil + + # Section 5.2.2 of RFC 3986 + if uri.scheme != nil + joined_scheme = uri.scheme + joined_user = uri.user + joined_password = uri.password + joined_host = uri.host + joined_port = uri.port + joined_path = URI.normalize_path(uri.path) + joined_query = uri.query + else + if uri.authority != nil + joined_user = uri.user + joined_password = uri.password + joined_host = uri.host + joined_port = uri.port + joined_path = URI.normalize_path(uri.path) + joined_query = uri.query + else + if uri.path == nil || uri.path.empty? + joined_path = self.path + if uri.query != nil + joined_query = uri.query + else + joined_query = self.query + end + else + if uri.path[0..0] == SLASH + joined_path = URI.normalize_path(uri.path) + else + base_path = self.path.dup + base_path = EMPTY_STR if base_path == nil + base_path = URI.normalize_path(base_path) + + # Section 5.2.3 of RFC 3986 + # + # Removes the right-most path segment from the base path. + if base_path.include?(SLASH) + base_path.sub!(/\/[^\/]+$/, SLASH) + else + base_path = EMPTY_STR + end + + # If the base path is empty and an authority segment has been + # defined, use a base path of SLASH + if base_path.empty? && self.authority != nil + base_path = SLASH + end + + joined_path = URI.normalize_path(base_path + uri.path) + end + joined_query = uri.query + end + joined_user = self.user + joined_password = self.password + joined_host = self.host + joined_port = self.port + end + joined_scheme = self.scheme + end + joined_fragment = uri.fragment + + return self.class.new( + :scheme => joined_scheme, + :user => joined_user, + :password => joined_password, + :host => joined_host, + :port => joined_port, + :path => joined_path, + :query => joined_query, + :fragment => joined_fragment + ) + end + alias_method :+, :join + + ## + # Destructive form of join. + # + # @param [String, Addressable::URI, #to_str] The URI to join with. + # + # @return [Addressable::URI] The joined URI. + # + # @see Addressable::URI#join + def join!(uri) + replace_self(self.join(uri)) + end + + ## + # Merges a URI with a Hash of components. + # This method has different behavior from join. Any + # components present in the hash parameter will override the + # original components. The path component is not treated specially. + # + # @param [Hash, Addressable::URI, #to_hash] The components to merge with. + # + # @return [Addressable::URI] The merged URI. + # + # @see Hash#merge + def merge(hash) + if !hash.respond_to?(:to_hash) + raise TypeError, "Can't convert #{hash.class} into Hash." + end + hash = hash.to_hash + + if hash.has_key?(:authority) + if (hash.keys & [:userinfo, :user, :password, :host, :port]).any? + raise ArgumentError, + "Cannot specify both an authority and any of the components " + + "within the authority." + end + end + if hash.has_key?(:userinfo) + if (hash.keys & [:user, :password]).any? + raise ArgumentError, + "Cannot specify both a userinfo and either the user or password." + end + end + + uri = self.class.new + uri.defer_validation do + # Bunch of crazy logic required because of the composite components + # like userinfo and authority. + uri.scheme = + hash.has_key?(:scheme) ? hash[:scheme] : self.scheme + if hash.has_key?(:authority) + uri.authority = + hash.has_key?(:authority) ? hash[:authority] : self.authority + end + if hash.has_key?(:userinfo) + uri.userinfo = + hash.has_key?(:userinfo) ? hash[:userinfo] : self.userinfo + end + if !hash.has_key?(:userinfo) && !hash.has_key?(:authority) + uri.user = + hash.has_key?(:user) ? hash[:user] : self.user + uri.password = + hash.has_key?(:password) ? hash[:password] : self.password + end + if !hash.has_key?(:authority) + uri.host = + hash.has_key?(:host) ? hash[:host] : self.host + uri.port = + hash.has_key?(:port) ? hash[:port] : self.port + end + uri.path = + hash.has_key?(:path) ? hash[:path] : self.path + uri.query = + hash.has_key?(:query) ? hash[:query] : self.query + uri.fragment = + hash.has_key?(:fragment) ? hash[:fragment] : self.fragment + end + + return uri + end + + ## + # Destructive form of merge. + # + # @param [Hash, Addressable::URI, #to_hash] The components to merge with. + # + # @return [Addressable::URI] The merged URI. + # + # @see Addressable::URI#merge + def merge!(uri) + replace_self(self.merge(uri)) + end + + ## + # Returns the shortest normalized relative form of this URI that uses the + # supplied URI as a base for resolution. Returns an absolute URI if + # necessary. This is effectively the opposite of route_to. + # + # @param [String, Addressable::URI, #to_str] uri The URI to route from. + # + # @return [Addressable::URI] + # The normalized relative URI that is equivalent to the original URI. + def route_from(uri) + uri = URI.parse(uri).normalize + normalized_self = self.normalize + if normalized_self.relative? + raise ArgumentError, "Expected absolute URI, got: #{self.to_s}" + end + if uri.relative? + raise ArgumentError, "Expected absolute URI, got: #{uri.to_s}" + end + if normalized_self == uri + return Addressable::URI.parse("##{normalized_self.fragment}") + end + components = normalized_self.to_hash + if normalized_self.scheme == uri.scheme + components[:scheme] = nil + if normalized_self.authority == uri.authority + components[:user] = nil + components[:password] = nil + components[:host] = nil + components[:port] = nil + if normalized_self.path == uri.path + components[:path] = nil + if normalized_self.query == uri.query + components[:query] = nil + end + else + if uri.path != SLASH and components[:path] + self_splitted_path = split_path(components[:path]) + uri_splitted_path = split_path(uri.path) + self_dir = self_splitted_path.shift + uri_dir = uri_splitted_path.shift + while !self_splitted_path.empty? && !uri_splitted_path.empty? and self_dir == uri_dir + self_dir = self_splitted_path.shift + uri_dir = uri_splitted_path.shift + end + components[:path] = (uri_splitted_path.fill('..') + [self_dir] + self_splitted_path).join(SLASH) + end + end + end + end + # Avoid network-path references. + if components[:host] != nil + components[:scheme] = normalized_self.scheme + end + return Addressable::URI.new( + :scheme => components[:scheme], + :user => components[:user], + :password => components[:password], + :host => components[:host], + :port => components[:port], + :path => components[:path], + :query => components[:query], + :fragment => components[:fragment] + ) + end + + ## + # Returns the shortest normalized relative form of the supplied URI that + # uses this URI as a base for resolution. Returns an absolute URI if + # necessary. This is effectively the opposite of route_from. + # + # @param [String, Addressable::URI, #to_str] uri The URI to route to. + # + # @return [Addressable::URI] + # The normalized relative URI that is equivalent to the supplied URI. + def route_to(uri) + return URI.parse(uri).route_from(self) + end + + ## + # Returns a normalized URI object. + # + # NOTE: This method does not attempt to fully conform to specifications. + # It exists largely to correct other people's failures to read the + # specifications, and also to deal with caching issues since several + # different URIs may represent the same resource and should not be + # cached multiple times. + # + # @return [Addressable::URI] The normalized URI. + def normalize + # This is a special exception for the frequently misused feed + # URI scheme. + if normalized_scheme == "feed" + if self.to_s =~ /^feed:\/*http:\/*/ + return URI.parse( + self.to_s[/^feed:\/*(http:\/*.*)/, 1] + ).normalize + end + end + + return self.class.new( + :scheme => normalized_scheme, + :authority => normalized_authority, + :path => normalized_path, + :query => normalized_query, + :fragment => normalized_fragment + ) + end + + ## + # Destructively normalizes this URI object. + # + # @return [Addressable::URI] The normalized URI. + # + # @see Addressable::URI#normalize + def normalize! + replace_self(self.normalize) + end + + ## + # Creates a URI suitable for display to users. If semantic attacks are + # likely, the application should try to detect these and warn the user. + # See RFC 3986, + # section 7.6 for more information. + # + # @return [Addressable::URI] A URI suitable for display purposes. + def display_uri + display_uri = self.normalize + display_uri.host = ::Addressable::IDNA.to_unicode(display_uri.host) + return display_uri + end + + ## + # Returns true if the URI objects are equal. This method + # normalizes both URIs before doing the comparison, and allows comparison + # against Strings. + # + # @param [Object] uri The URI to compare. + # + # @return [TrueClass, FalseClass] + # true if the URIs are equivalent, false + # otherwise. + def ===(uri) + if uri.respond_to?(:normalize) + uri_string = uri.normalize.to_s + else + begin + uri_string = ::Addressable::URI.parse(uri).normalize.to_s + rescue InvalidURIError, TypeError + return false + end + end + return self.normalize.to_s == uri_string + end + + ## + # Returns true if the URI objects are equal. This method + # normalizes both URIs before doing the comparison. + # + # @param [Object] uri The URI to compare. + # + # @return [TrueClass, FalseClass] + # true if the URIs are equivalent, false + # otherwise. + def ==(uri) + return false unless uri.kind_of?(URI) + return self.normalize.to_s == uri.normalize.to_s + end + + ## + # Returns true if the URI objects are equal. This method + # does NOT normalize either URI before doing the comparison. + # + # @param [Object] uri The URI to compare. + # + # @return [TrueClass, FalseClass] + # true if the URIs are equivalent, false + # otherwise. + def eql?(uri) + return false unless uri.kind_of?(URI) + return self.to_s == uri.to_s + end + + ## + # A hash value that will make a URI equivalent to its normalized + # form. + # + # @return [Integer] A hash of the URI. + def hash + @hash ||= self.to_s.hash * -1 + end + + ## + # Clones the URI object. + # + # @return [Addressable::URI] The cloned URI. + def dup + duplicated_uri = self.class.new( + :scheme => self.scheme ? self.scheme.dup : nil, + :user => self.user ? self.user.dup : nil, + :password => self.password ? self.password.dup : nil, + :host => self.host ? self.host.dup : nil, + :port => self.port, + :path => self.path ? self.path.dup : nil, + :query => self.query ? self.query.dup : nil, + :fragment => self.fragment ? self.fragment.dup : nil + ) + return duplicated_uri + end + + ## + # Omits components from a URI. + # + # @param [Symbol] *components The components to be omitted. + # + # @return [Addressable::URI] The URI with components omitted. + # + # @example + # uri = Addressable::URI.parse("http://example.com/path?query") + # #=> # + # uri.omit(:scheme, :authority) + # #=> # + def omit(*components) + invalid_components = components - [ + :scheme, :user, :password, :userinfo, :host, :port, :authority, + :path, :query, :fragment + ] + unless invalid_components.empty? + raise ArgumentError, + "Invalid component names: #{invalid_components.inspect}." + end + duplicated_uri = self.dup + duplicated_uri.defer_validation do + components.each do |component| + duplicated_uri.send((component.to_s + "=").to_sym, nil) + end + duplicated_uri.user = duplicated_uri.normalized_user + end + duplicated_uri + end + + ## + # Destructive form of omit. + # + # @param [Symbol] *components The components to be omitted. + # + # @return [Addressable::URI] The URI with components omitted. + # + # @see Addressable::URI#omit + def omit!(*components) + replace_self(self.omit(*components)) + end + + ## + # Determines if the URI is an empty string. + # + # @return [TrueClass, FalseClass] + # Returns true if empty, false otherwise. + def empty? + return self.to_s.empty? + end + + ## + # Converts the URI to a String. + # + # @return [String] The URI's String representation. + def to_s + if self.scheme == nil && self.path != nil && !self.path.empty? && + self.path =~ NORMPATH + raise InvalidURIError, + "Cannot assemble URI string with ambiguous path: '#{self.path}'" + end + @uri_string ||= begin + uri_string = String.new + uri_string << "#{self.scheme}:" if self.scheme != nil + uri_string << "//#{self.authority}" if self.authority != nil + uri_string << self.path.to_s + uri_string << "?#{self.query}" if self.query != nil + uri_string << "##{self.fragment}" if self.fragment != nil + uri_string.force_encoding(Encoding::UTF_8) + uri_string + end + end + + ## + # URI's are glorified Strings. Allow implicit conversion. + alias_method :to_str, :to_s + + ## + # Returns a Hash of the URI components. + # + # @return [Hash] The URI as a Hash of components. + def to_hash + return { + :scheme => self.scheme, + :user => self.user, + :password => self.password, + :host => self.host, + :port => self.port, + :path => self.path, + :query => self.query, + :fragment => self.fragment + } + end + + ## + # Returns a String representation of the URI object's state. + # + # @return [String] The URI object's state, as a String. + def inspect + sprintf("#<%s:%#0x URI:%s>", URI.to_s, self.object_id, self.to_s) + end + + ## + # This method allows you to make several changes to a URI simultaneously, + # which separately would cause validation errors, but in conjunction, + # are valid. The URI will be revalidated as soon as the entire block has + # been executed. + # + # @param [Proc] block + # A set of operations to perform on a given URI. + def defer_validation + raise LocalJumpError, "No block given." unless block_given? + @validation_deferred = true + yield + @validation_deferred = false + validate + return nil + end + + protected + SELF_REF = '.' + PARENT = '..' + + RULE_2A = /\/\.\/|\/\.$/ + RULE_2B_2C = /\/([^\/]*)\/\.\.\/|\/([^\/]*)\/\.\.$/ + RULE_2D = /^\.\.?\/?/ + RULE_PREFIXED_PARENT = /^\/\.\.?\/|^(\/\.\.?)+\/?$/ + + ## + # Resolves paths to their simplest form. + # + # @param [String] path The path to normalize. + # + # @return [String] The normalized path. + def self.normalize_path(path) + # Section 5.2.4 of RFC 3986 + + return nil if path.nil? + normalized_path = path.dup + begin + mod = nil + mod ||= normalized_path.gsub!(RULE_2A, SLASH) + + pair = normalized_path.match(RULE_2B_2C) + parent, current = pair[1], pair[2] if pair + if pair && ((parent != SELF_REF && parent != PARENT) || + (current != SELF_REF && current != PARENT)) + mod ||= normalized_path.gsub!( + Regexp.new( + "/#{Regexp.escape(parent.to_s)}/\\.\\./|" + + "(/#{Regexp.escape(current.to_s)}/\\.\\.$)" + ), SLASH + ) + end + + mod ||= normalized_path.gsub!(RULE_2D, EMPTY_STR) + # Non-standard, removes prefixed dotted segments from path. + mod ||= normalized_path.gsub!(RULE_PREFIXED_PARENT, SLASH) + end until mod.nil? + + return normalized_path + end + + ## + # Ensures that the URI is valid. + def validate + return if !!@validation_deferred + if self.scheme != nil && self.ip_based? && + (self.host == nil || self.host.empty?) && + (self.path == nil || self.path.empty?) + raise InvalidURIError, + "Absolute URI missing hierarchical segment: '#{self.to_s}'" + end + if self.host == nil + if self.port != nil || + self.user != nil || + self.password != nil + raise InvalidURIError, "Hostname not supplied: '#{self.to_s}'" + end + end + if self.path != nil && !self.path.empty? && self.path[0..0] != SLASH && + self.authority != nil + raise InvalidURIError, + "Cannot have a relative path with an authority set: '#{self.to_s}'" + end + if self.path != nil && !self.path.empty? && + self.path[0..1] == SLASH + SLASH && self.authority == nil + raise InvalidURIError, + "Cannot have a path with two leading slashes " + + "without an authority set: '#{self.to_s}'" + end + unreserved = CharacterClasses::UNRESERVED + sub_delims = CharacterClasses::SUB_DELIMS + if !self.host.nil? && (self.host =~ /[<>{}\/\\\?\#\@"[[:space:]]]/ || + (self.host[/^\[(.*)\]$/, 1] != nil && self.host[/^\[(.*)\]$/, 1] !~ + Regexp.new("^[#{unreserved}#{sub_delims}:]*$"))) + raise InvalidURIError, "Invalid character in host: '#{self.host.to_s}'" + end + return nil + end + + ## + # Replaces the internal state of self with the specified URI's state. + # Used in destructive operations to avoid massive code repetition. + # + # @param [Addressable::URI] uri The URI to replace self with. + # + # @return [Addressable::URI] self. + def replace_self(uri) + # Reset dependent values + instance_variables.each do |var| + if instance_variable_defined?(var) && var != :@validation_deferred + remove_instance_variable(var) + end + end + + @scheme = uri.scheme + @user = uri.user + @password = uri.password + @host = uri.host + @port = uri.port + @path = uri.path + @query = uri.query + @fragment = uri.fragment + return self + end + + ## + # Splits path string with "/" (slash). + # It is considered that there is empty string after last slash when + # path ends with slash. + # + # @param [String] path The path to split. + # + # @return [Array] An array of parts of path. + def split_path(path) + splitted = path.split(SLASH) + splitted << EMPTY_STR if path.end_with? SLASH + splitted + end + + ## + # Resets composite values for the entire URI + # + # @api private + def remove_composite_values + remove_instance_variable(:@uri_string) if defined?(@uri_string) + remove_instance_variable(:@hash) if defined?(@hash) + end + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/addressable-2.8.0/lib/addressable/version.rb b/vendor/bundle/ruby/3.1.0/gems/addressable-2.8.0/lib/addressable/version.rb new file mode 100644 index 000000000..2efe4340f --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/addressable-2.8.0/lib/addressable/version.rb @@ -0,0 +1,32 @@ +# frozen_string_literal: true + +# encoding:utf-8 +#-- +# Copyright (C) Bob Aman +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +#++ + + +# Used to prevent the class/module from being loaded more than once +if !defined?(Addressable::VERSION) + module Addressable + module VERSION + MAJOR = 2 + MINOR = 8 + TINY = 0 + + STRING = [MAJOR, MINOR, TINY].join('.') + end + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/addressable-2.8.0/spec/addressable/idna_spec.rb b/vendor/bundle/ruby/3.1.0/gems/addressable-2.8.0/spec/addressable/idna_spec.rb new file mode 100644 index 000000000..4104b3702 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/addressable-2.8.0/spec/addressable/idna_spec.rb @@ -0,0 +1,302 @@ +# frozen_string_literal: true + +# coding: utf-8 +# Copyright (C) Bob Aman +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + + +require "spec_helper" + +# Have to use RubyGems to load the idn gem. +require "rubygems" + +require "addressable/idna" + +shared_examples_for "converting from unicode to ASCII" do + it "should convert 'www.google.com' correctly" do + expect(Addressable::IDNA.to_ascii("www.google.com")).to eq("www.google.com") + end + + long = 'AcinusFallumTrompetumNullunCreditumVisumEstAtCuadLongumEtCefallum.com' + it "should convert '#{long}' correctly" do + expect(Addressable::IDNA.to_ascii(long)).to eq(long) + end + + it "should convert 'www.詹姆斯.com' correctly" do + expect(Addressable::IDNA.to_ascii( + "www.詹姆斯.com" + )).to eq("www.xn--8ws00zhy3a.com") + end + + it "should convert 'www.Iñtërnâtiônàlizætiøn.com' correctly" do + "www.Iñtërnâtiônàlizætiøn.com" + expect(Addressable::IDNA.to_ascii( + "www.I\xC3\xB1t\xC3\xABrn\xC3\xA2ti\xC3\xB4" + + "n\xC3\xA0liz\xC3\xA6ti\xC3\xB8n.com" + )).to eq("www.xn--itrntinliztin-vdb0a5exd8ewcye.com") + end + + it "should convert 'www.Iñtërnâtiônàlizætiøn.com' correctly" do + expect(Addressable::IDNA.to_ascii( + "www.In\xCC\x83te\xCC\x88rna\xCC\x82tio\xCC\x82n" + + "a\xCC\x80liz\xC3\xA6ti\xC3\xB8n.com" + )).to eq("www.xn--itrntinliztin-vdb0a5exd8ewcye.com") + end + + it "should convert " + + "'www.ほんとうにながいわけのわからないどめいんめいのらべるまだながくしないとたりない.w3.mag.keio.ac.jp' " + + "correctly" do + expect(Addressable::IDNA.to_ascii( + "www.\343\201\273\343\202\223\343\201\250\343\201\206\343\201\253\343" + + "\201\252\343\201\214\343\201\204\343\202\217\343\201\221\343\201\256" + + "\343\202\217\343\201\213\343\202\211\343\201\252\343\201\204\343\201" + + "\251\343\202\201\343\201\204\343\202\223\343\202\201\343\201\204\343" + + "\201\256\343\202\211\343\201\271\343\202\213\343\201\276\343\201\240" + + "\343\201\252\343\201\214\343\201\217\343\201\227\343\201\252\343\201" + + "\204\343\201\250\343\201\237\343\202\212\343\201\252\343\201\204." + + "w3.mag.keio.ac.jp" + )).to eq( + "www.xn--n8jaaaaai5bhf7as8fsfk3jnknefdde3" + + "fg11amb5gzdb4wi9bya3kc6lra.w3.mag.keio.ac.jp" + ) + end + + it "should convert " + + "'www.ほんとうにながいわけのわからないどめいんめいのらべるまだながくしないとたりない.w3.mag.keio.ac.jp' " + + "correctly" do + expect(Addressable::IDNA.to_ascii( + "www.\343\201\273\343\202\223\343\201\250\343\201\206\343\201\253\343" + + "\201\252\343\201\213\343\202\231\343\201\204\343\202\217\343\201\221" + + "\343\201\256\343\202\217\343\201\213\343\202\211\343\201\252\343\201" + + "\204\343\201\250\343\202\231\343\202\201\343\201\204\343\202\223\343" + + "\202\201\343\201\204\343\201\256\343\202\211\343\201\270\343\202\231" + + "\343\202\213\343\201\276\343\201\237\343\202\231\343\201\252\343\201" + + "\213\343\202\231\343\201\217\343\201\227\343\201\252\343\201\204\343" + + "\201\250\343\201\237\343\202\212\343\201\252\343\201\204." + + "w3.mag.keio.ac.jp" + )).to eq( + "www.xn--n8jaaaaai5bhf7as8fsfk3jnknefdde3" + + "fg11amb5gzdb4wi9bya3kc6lra.w3.mag.keio.ac.jp" + ) + end + + it "should convert '点心和烤鸭.w3.mag.keio.ac.jp' correctly" do + expect(Addressable::IDNA.to_ascii( + "点心和烤鸭.w3.mag.keio.ac.jp" + )).to eq("xn--0trv4xfvn8el34t.w3.mag.keio.ac.jp") + end + + it "should convert '가각갂갃간갅갆갇갈갉힢힣.com' correctly" do + expect(Addressable::IDNA.to_ascii( + "가각갂갃간갅갆갇갈갉힢힣.com" + )).to eq("xn--o39acdefghijk5883jma.com") + end + + it "should convert " + + "'\347\242\274\346\250\231\346\272\226\350" + + "\220\254\345\234\213\347\242\274.com' correctly" do + expect(Addressable::IDNA.to_ascii( + "\347\242\274\346\250\231\346\272\226\350" + + "\220\254\345\234\213\347\242\274.com" + )).to eq("xn--9cs565brid46mda086o.com") + end + + it "should convert 'リ宠퐱〹.com' correctly" do + expect(Addressable::IDNA.to_ascii( + "\357\276\230\345\256\240\355\220\261\343\200\271.com" + )).to eq("xn--eek174hoxfpr4k.com") + end + + it "should convert 'リ宠퐱卄.com' correctly" do + expect(Addressable::IDNA.to_ascii( + "\343\203\252\345\256\240\355\220\261\345\215\204.com" + )).to eq("xn--eek174hoxfpr4k.com") + end + + it "should convert 'ᆵ' correctly" do + expect(Addressable::IDNA.to_ascii( + "\341\206\265" + )).to eq("xn--4ud") + end + + it "should convert 'ᆵ' correctly" do + expect(Addressable::IDNA.to_ascii( + "\357\276\257" + )).to eq("xn--4ud") + end + + it "should convert '🌹🌹🌹.ws' correctly" do + expect(Addressable::IDNA.to_ascii( + "\360\237\214\271\360\237\214\271\360\237\214\271.ws" + )).to eq("xn--2h8haa.ws") + end + + it "should handle two adjacent '.'s correctly" do + expect(Addressable::IDNA.to_ascii( + "example..host" + )).to eq("example..host") + end +end + +shared_examples_for "converting from ASCII to unicode" do + long = 'AcinusFallumTrompetumNullunCreditumVisumEstAtCuadLongumEtCefallum.com' + it "should convert '#{long}' correctly" do + expect(Addressable::IDNA.to_unicode(long)).to eq(long) + end + + it "should return the identity conversion when punycode decode fails" do + expect(Addressable::IDNA.to_unicode("xn--zckp1cyg1.sblo.jp")).to eq( + "xn--zckp1cyg1.sblo.jp") + end + + it "should return the identity conversion when the ACE prefix has no suffix" do + expect(Addressable::IDNA.to_unicode("xn--...-")).to eq("xn--...-") + end + + it "should convert 'www.google.com' correctly" do + expect(Addressable::IDNA.to_unicode("www.google.com")).to eq( + "www.google.com") + end + + it "should convert 'www.詹姆斯.com' correctly" do + expect(Addressable::IDNA.to_unicode( + "www.xn--8ws00zhy3a.com" + )).to eq("www.詹姆斯.com") + end + + it "should convert '詹姆斯.com' correctly" do + expect(Addressable::IDNA.to_unicode( + "xn--8ws00zhy3a.com" + )).to eq("詹姆斯.com") + end + + it "should convert 'www.iñtërnâtiônàlizætiøn.com' correctly" do + expect(Addressable::IDNA.to_unicode( + "www.xn--itrntinliztin-vdb0a5exd8ewcye.com" + )).to eq("www.iñtërnâtiônàlizætiøn.com") + end + + it "should convert 'iñtërnâtiônàlizætiøn.com' correctly" do + expect(Addressable::IDNA.to_unicode( + "xn--itrntinliztin-vdb0a5exd8ewcye.com" + )).to eq("iñtërnâtiônàlizætiøn.com") + end + + it "should convert " + + "'www.ほんとうにながいわけのわからないどめいんめいのらべるまだながくしないとたりない.w3.mag.keio.ac.jp' " + + "correctly" do + expect(Addressable::IDNA.to_unicode( + "www.xn--n8jaaaaai5bhf7as8fsfk3jnknefdde3" + + "fg11amb5gzdb4wi9bya3kc6lra.w3.mag.keio.ac.jp" + )).to eq( + "www.ほんとうにながいわけのわからないどめいんめいのらべるまだながくしないとたりない.w3.mag.keio.ac.jp" + ) + end + + it "should convert '点心和烤鸭.w3.mag.keio.ac.jp' correctly" do + expect(Addressable::IDNA.to_unicode( + "xn--0trv4xfvn8el34t.w3.mag.keio.ac.jp" + )).to eq("点心和烤鸭.w3.mag.keio.ac.jp") + end + + it "should convert '가각갂갃간갅갆갇갈갉힢힣.com' correctly" do + expect(Addressable::IDNA.to_unicode( + "xn--o39acdefghijk5883jma.com" + )).to eq("가각갂갃간갅갆갇갈갉힢힣.com") + end + + it "should convert " + + "'\347\242\274\346\250\231\346\272\226\350" + + "\220\254\345\234\213\347\242\274.com' correctly" do + expect(Addressable::IDNA.to_unicode( + "xn--9cs565brid46mda086o.com" + )).to eq( + "\347\242\274\346\250\231\346\272\226\350" + + "\220\254\345\234\213\347\242\274.com" + ) + end + + it "should convert 'リ宠퐱卄.com' correctly" do + expect(Addressable::IDNA.to_unicode( + "xn--eek174hoxfpr4k.com" + )).to eq("\343\203\252\345\256\240\355\220\261\345\215\204.com") + end + + it "should convert 'ᆵ' correctly" do + expect(Addressable::IDNA.to_unicode( + "xn--4ud" + )).to eq("\341\206\265") + end + + it "should convert '🌹🌹🌹.ws' correctly" do + expect(Addressable::IDNA.to_unicode( + "xn--2h8haa.ws" + )).to eq("\360\237\214\271\360\237\214\271\360\237\214\271.ws") + end + + it "should handle two adjacent '.'s correctly" do + expect(Addressable::IDNA.to_unicode( + "example..host" + )).to eq("example..host") + end + + it "should normalize 'string' correctly" do + expect(Addressable::IDNA.unicode_normalize_kc(:'string')).to eq("string") + expect(Addressable::IDNA.unicode_normalize_kc("string")).to eq("string") + end +end + +describe Addressable::IDNA, "when using the pure-Ruby implementation" do + before do + Addressable.send(:remove_const, :IDNA) + load "addressable/idna/pure.rb" + end + + it_should_behave_like "converting from unicode to ASCII" + it_should_behave_like "converting from ASCII to unicode" + + begin + require "fiber" + + it "should not blow up inside fibers" do + f = Fiber.new do + Addressable.send(:remove_const, :IDNA) + load "addressable/idna/pure.rb" + end + f.resume + end + rescue LoadError + # Fibers aren't supported in this version of Ruby, skip this test. + warn('Fibers unsupported.') + end +end + +begin + require "idn" + + describe Addressable::IDNA, "when using the native-code implementation" do + before do + Addressable.send(:remove_const, :IDNA) + load "addressable/idna/native.rb" + end + + it_should_behave_like "converting from unicode to ASCII" + it_should_behave_like "converting from ASCII to unicode" + end +rescue LoadError => error + raise error if ENV["CI"] && TestHelper.native_supported? + + # Cannot test the native implementation without libidn support. + warn('Could not load native IDN implementation.') +end diff --git a/vendor/bundle/ruby/3.1.0/gems/addressable-2.8.0/spec/addressable/net_http_compat_spec.rb b/vendor/bundle/ruby/3.1.0/gems/addressable-2.8.0/spec/addressable/net_http_compat_spec.rb new file mode 100644 index 000000000..8663a8673 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/addressable-2.8.0/spec/addressable/net_http_compat_spec.rb @@ -0,0 +1,30 @@ +# frozen_string_literal: true + +# coding: utf-8 +# Copyright (C) Bob Aman +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + + +require "spec_helper" + +require "addressable/uri" +require "net/http" + +describe Net::HTTP do + it "should be compatible with Addressable" do + response_body = + Net::HTTP.get(Addressable::URI.parse('http://www.google.com/')) + expect(response_body).not_to be_nil + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/addressable-2.8.0/spec/addressable/security_spec.rb b/vendor/bundle/ruby/3.1.0/gems/addressable-2.8.0/spec/addressable/security_spec.rb new file mode 100644 index 000000000..601e8088e --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/addressable-2.8.0/spec/addressable/security_spec.rb @@ -0,0 +1,59 @@ +# frozen_string_literal: true + +# coding: utf-8 +# Copyright (C) Bob Aman +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + + +require "spec_helper" + +require "addressable/uri" + +describe Addressable::URI, "when created with a URI known to cause crashes " + + "in certain browsers" do + it "should parse correctly" do + uri = Addressable::URI.parse('%%30%30') + expect(uri.path).to eq('%%30%30') + expect(uri.normalize.path).to eq('%2500') + end + + it "should parse correctly as a full URI" do + uri = Addressable::URI.parse('http://www.example.com/%%30%30') + expect(uri.path).to eq('/%%30%30') + expect(uri.normalize.path).to eq('/%2500') + end +end + +describe Addressable::URI, "when created with a URI known to cause crashes " + + "in certain browsers" do + it "should parse correctly" do + uri = Addressable::URI.parse('لُصّبُلُلصّبُررً ॣ ॣh ॣ ॣ 冗') + expect(uri.path).to eq('لُصّبُلُلصّبُررً ॣ ॣh ॣ ॣ 冗') + expect(uri.normalize.path).to eq( + '%D9%84%D9%8F%D8%B5%D9%91%D8%A8%D9%8F%D9%84%D9%8F%D9%84%D8%B5%D9%91' + + '%D8%A8%D9%8F%D8%B1%D8%B1%D9%8B%20%E0%A5%A3%20%E0%A5%A3h%20%E0%A5' + + '%A3%20%E0%A5%A3%20%E5%86%97' + ) + end + + it "should parse correctly as a full URI" do + uri = Addressable::URI.parse('http://www.example.com/لُصّبُلُلصّبُررً ॣ ॣh ॣ ॣ 冗') + expect(uri.path).to eq('/لُصّبُلُلصّبُررً ॣ ॣh ॣ ॣ 冗') + expect(uri.normalize.path).to eq( + '/%D9%84%D9%8F%D8%B5%D9%91%D8%A8%D9%8F%D9%84%D9%8F%D9%84%D8%B5%D9%91' + + '%D8%A8%D9%8F%D8%B1%D8%B1%D9%8B%20%E0%A5%A3%20%E0%A5%A3h%20%E0%A5' + + '%A3%20%E0%A5%A3%20%E5%86%97' + ) + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/addressable-2.8.0/spec/addressable/template_spec.rb b/vendor/bundle/ruby/3.1.0/gems/addressable-2.8.0/spec/addressable/template_spec.rb new file mode 100644 index 000000000..d47589abf --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/addressable-2.8.0/spec/addressable/template_spec.rb @@ -0,0 +1,1460 @@ +# frozen_string_literal: true + +# coding: utf-8 +# Copyright (C) Bob Aman +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + + +require "spec_helper" + +require "bigdecimal" +require "timeout" +require "addressable/template" + +shared_examples_for 'expands' do |tests| + tests.each do |template, expansion| + exp = expansion.is_a?(Array) ? expansion.first : expansion + it "#{template} to #{exp}" do + tmpl = Addressable::Template.new(template).expand(subject) + if expansion.is_a?(Array) + expect(expansion.any?{|i| i == tmpl.to_str}).to be true + else + expect(tmpl.to_str).to eq(expansion) + end + end + end +end + +describe "eql?" do + let(:template) { Addressable::Template.new('https://www.example.com/{foo}') } + it 'is equal when the pattern matches' do + other_template = Addressable::Template.new('https://www.example.com/{foo}') + expect(template).to be_eql(other_template) + expect(other_template).to be_eql(template) + end + it 'is not equal when the pattern differs' do + other_template = Addressable::Template.new('https://www.example.com/{bar}') + expect(template).to_not be_eql(other_template) + expect(other_template).to_not be_eql(template) + end + it 'is not equal to non-templates' do + uri = 'https://www.example.com/foo/bar' + addressable_template = Addressable::Template.new uri + addressable_uri = Addressable::URI.parse uri + expect(addressable_template).to_not be_eql(addressable_uri) + expect(addressable_uri).to_not be_eql(addressable_template) + end +end + +describe "==" do + let(:template) { Addressable::Template.new('https://www.example.com/{foo}') } + it 'is equal when the pattern matches' do + other_template = Addressable::Template.new('https://www.example.com/{foo}') + expect(template).to eq other_template + expect(other_template).to eq template + end + it 'is not equal when the pattern differs' do + other_template = Addressable::Template.new('https://www.example.com/{bar}') + expect(template).not_to eq other_template + expect(other_template).not_to eq template + end + it 'is not equal to non-templates' do + uri = 'https://www.example.com/foo/bar' + addressable_template = Addressable::Template.new uri + addressable_uri = Addressable::URI.parse uri + expect(addressable_template).not_to eq addressable_uri + expect(addressable_uri).not_to eq addressable_template + end +end + +describe "Type conversion" do + subject { + { + :var => true, + :hello => 1234, + :nothing => nil, + :sym => :symbolic, + :decimal => BigDecimal('1') + } + } + + it_behaves_like 'expands', { + '{var}' => 'true', + '{hello}' => '1234', + '{nothing}' => '', + '{sym}' => 'symbolic', + '{decimal}' => RUBY_VERSION < '2.4.0' ? '0.1E1' : '0.1e1' + } +end + +describe "Level 1:" do + subject { + {:var => "value", :hello => "Hello World!"} + } + it_behaves_like 'expands', { + '{var}' => 'value', + '{hello}' => 'Hello%20World%21' + } +end + +describe "Level 2" do + subject { + { + :var => "value", + :hello => "Hello World!", + :path => "/foo/bar" + } + } + context "Operator +:" do + it_behaves_like 'expands', { + '{+var}' => 'value', + '{+hello}' => 'Hello%20World!', + '{+path}/here' => '/foo/bar/here', + 'here?ref={+path}' => 'here?ref=/foo/bar' + } + end + context "Operator #:" do + it_behaves_like 'expands', { + 'X{#var}' => 'X#value', + 'X{#hello}' => 'X#Hello%20World!' + } + end +end + +describe "Level 3" do + subject { + { + :var => "value", + :hello => "Hello World!", + :empty => "", + :path => "/foo/bar", + :x => "1024", + :y => "768" + } + } + context "Operator nil (multiple vars):" do + it_behaves_like 'expands', { + 'map?{x,y}' => 'map?1024,768', + '{x,hello,y}' => '1024,Hello%20World%21,768' + } + end + context "Operator + (multiple vars):" do + it_behaves_like 'expands', { + '{+x,hello,y}' => '1024,Hello%20World!,768', + '{+path,x}/here' => '/foo/bar,1024/here' + } + end + context "Operator # (multiple vars):" do + it_behaves_like 'expands', { + '{#x,hello,y}' => '#1024,Hello%20World!,768', + '{#path,x}/here' => '#/foo/bar,1024/here' + } + end + context "Operator ." do + it_behaves_like 'expands', { + 'X{.var}' => 'X.value', + 'X{.x,y}' => 'X.1024.768' + } + end + context "Operator /" do + it_behaves_like 'expands', { + '{/var}' => '/value', + '{/var,x}/here' => '/value/1024/here' + } + end + context "Operator ;" do + it_behaves_like 'expands', { + '{;x,y}' => ';x=1024;y=768', + '{;x,y,empty}' => ';x=1024;y=768;empty' + } + end + context "Operator ?" do + it_behaves_like 'expands', { + '{?x,y}' => '?x=1024&y=768', + '{?x,y,empty}' => '?x=1024&y=768&empty=' + } + end + context "Operator &" do + it_behaves_like 'expands', { + '?fixed=yes{&x}' => '?fixed=yes&x=1024', + '{&x,y,empty}' => '&x=1024&y=768&empty=' + } + end +end + +describe "Level 4" do + subject { + { + :var => "value", + :hello => "Hello World!", + :path => "/foo/bar", + :semi => ";", + :list => %w(red green blue), + :keys => {"semi" => ';', "dot" => '.', "comma" => ','} + } + } + context "Expansion with value modifiers" do + it_behaves_like 'expands', { + '{var:3}' => 'val', + '{var:30}' => 'value', + '{list}' => 'red,green,blue', + '{list*}' => 'red,green,blue', + '{keys}' => [ + 'semi,%3B,dot,.,comma,%2C', + 'dot,.,semi,%3B,comma,%2C', + 'comma,%2C,semi,%3B,dot,.', + 'semi,%3B,comma,%2C,dot,.', + 'dot,.,comma,%2C,semi,%3B', + 'comma,%2C,dot,.,semi,%3B' + ], + '{keys*}' => [ + 'semi=%3B,dot=.,comma=%2C', + 'dot=.,semi=%3B,comma=%2C', + 'comma=%2C,semi=%3B,dot=.', + 'semi=%3B,comma=%2C,dot=.', + 'dot=.,comma=%2C,semi=%3B', + 'comma=%2C,dot=.,semi=%3B' + ] + } + end + context "Operator + with value modifiers" do + it_behaves_like 'expands', { + '{+path:6}/here' => '/foo/b/here', + '{+list}' => 'red,green,blue', + '{+list*}' => 'red,green,blue', + '{+keys}' => [ + 'semi,;,dot,.,comma,,', + 'dot,.,semi,;,comma,,', + 'comma,,,semi,;,dot,.', + 'semi,;,comma,,,dot,.', + 'dot,.,comma,,,semi,;', + 'comma,,,dot,.,semi,;' + ], + '{+keys*}' => [ + 'semi=;,dot=.,comma=,', + 'dot=.,semi=;,comma=,', + 'comma=,,semi=;,dot=.', + 'semi=;,comma=,,dot=.', + 'dot=.,comma=,,semi=;', + 'comma=,,dot=.,semi=;' + ] + } + end + context "Operator # with value modifiers" do + it_behaves_like 'expands', { + '{#path:6}/here' => '#/foo/b/here', + '{#list}' => '#red,green,blue', + '{#list*}' => '#red,green,blue', + '{#keys}' => [ + '#semi,;,dot,.,comma,,', + '#dot,.,semi,;,comma,,', + '#comma,,,semi,;,dot,.', + '#semi,;,comma,,,dot,.', + '#dot,.,comma,,,semi,;', + '#comma,,,dot,.,semi,;' + ], + '{#keys*}' => [ + '#semi=;,dot=.,comma=,', + '#dot=.,semi=;,comma=,', + '#comma=,,semi=;,dot=.', + '#semi=;,comma=,,dot=.', + '#dot=.,comma=,,semi=;', + '#comma=,,dot=.,semi=;' + ] + } + end + context "Operator . with value modifiers" do + it_behaves_like 'expands', { + 'X{.var:3}' => 'X.val', + 'X{.list}' => 'X.red,green,blue', + 'X{.list*}' => 'X.red.green.blue', + 'X{.keys}' => [ + 'X.semi,%3B,dot,.,comma,%2C', + 'X.dot,.,semi,%3B,comma,%2C', + 'X.comma,%2C,semi,%3B,dot,.', + 'X.semi,%3B,comma,%2C,dot,.', + 'X.dot,.,comma,%2C,semi,%3B', + 'X.comma,%2C,dot,.,semi,%3B' + ], + 'X{.keys*}' => [ + 'X.semi=%3B.dot=..comma=%2C', + 'X.dot=..semi=%3B.comma=%2C', + 'X.comma=%2C.semi=%3B.dot=.', + 'X.semi=%3B.comma=%2C.dot=.', + 'X.dot=..comma=%2C.semi=%3B', + 'X.comma=%2C.dot=..semi=%3B' + ] + } + end + context "Operator / with value modifiers" do + it_behaves_like 'expands', { + '{/var:1,var}' => '/v/value', + '{/list}' => '/red,green,blue', + '{/list*}' => '/red/green/blue', + '{/list*,path:4}' => '/red/green/blue/%2Ffoo', + '{/keys}' => [ + '/semi,%3B,dot,.,comma,%2C', + '/dot,.,semi,%3B,comma,%2C', + '/comma,%2C,semi,%3B,dot,.', + '/semi,%3B,comma,%2C,dot,.', + '/dot,.,comma,%2C,semi,%3B', + '/comma,%2C,dot,.,semi,%3B' + ], + '{/keys*}' => [ + '/semi=%3B/dot=./comma=%2C', + '/dot=./semi=%3B/comma=%2C', + '/comma=%2C/semi=%3B/dot=.', + '/semi=%3B/comma=%2C/dot=.', + '/dot=./comma=%2C/semi=%3B', + '/comma=%2C/dot=./semi=%3B' + ] + } + end + context "Operator ; with value modifiers" do + it_behaves_like 'expands', { + '{;hello:5}' => ';hello=Hello', + '{;list}' => ';list=red,green,blue', + '{;list*}' => ';list=red;list=green;list=blue', + '{;keys}' => [ + ';keys=semi,%3B,dot,.,comma,%2C', + ';keys=dot,.,semi,%3B,comma,%2C', + ';keys=comma,%2C,semi,%3B,dot,.', + ';keys=semi,%3B,comma,%2C,dot,.', + ';keys=dot,.,comma,%2C,semi,%3B', + ';keys=comma,%2C,dot,.,semi,%3B' + ], + '{;keys*}' => [ + ';semi=%3B;dot=.;comma=%2C', + ';dot=.;semi=%3B;comma=%2C', + ';comma=%2C;semi=%3B;dot=.', + ';semi=%3B;comma=%2C;dot=.', + ';dot=.;comma=%2C;semi=%3B', + ';comma=%2C;dot=.;semi=%3B' + ] + } + end + context "Operator ? with value modifiers" do + it_behaves_like 'expands', { + '{?var:3}' => '?var=val', + '{?list}' => '?list=red,green,blue', + '{?list*}' => '?list=red&list=green&list=blue', + '{?keys}' => [ + '?keys=semi,%3B,dot,.,comma,%2C', + '?keys=dot,.,semi,%3B,comma,%2C', + '?keys=comma,%2C,semi,%3B,dot,.', + '?keys=semi,%3B,comma,%2C,dot,.', + '?keys=dot,.,comma,%2C,semi,%3B', + '?keys=comma,%2C,dot,.,semi,%3B' + ], + '{?keys*}' => [ + '?semi=%3B&dot=.&comma=%2C', + '?dot=.&semi=%3B&comma=%2C', + '?comma=%2C&semi=%3B&dot=.', + '?semi=%3B&comma=%2C&dot=.', + '?dot=.&comma=%2C&semi=%3B', + '?comma=%2C&dot=.&semi=%3B' + ] + } + end + context "Operator & with value modifiers" do + it_behaves_like 'expands', { + '{&var:3}' => '&var=val', + '{&list}' => '&list=red,green,blue', + '{&list*}' => '&list=red&list=green&list=blue', + '{&keys}' => [ + '&keys=semi,%3B,dot,.,comma,%2C', + '&keys=dot,.,semi,%3B,comma,%2C', + '&keys=comma,%2C,semi,%3B,dot,.', + '&keys=semi,%3B,comma,%2C,dot,.', + '&keys=dot,.,comma,%2C,semi,%3B', + '&keys=comma,%2C,dot,.,semi,%3B' + ], + '{&keys*}' => [ + '&semi=%3B&dot=.&comma=%2C', + '&dot=.&semi=%3B&comma=%2C', + '&comma=%2C&semi=%3B&dot=.', + '&semi=%3B&comma=%2C&dot=.', + '&dot=.&comma=%2C&semi=%3B', + '&comma=%2C&dot=.&semi=%3B' + ] + } + end +end +describe "Modifiers" do + subject { + { + :var => "value", + :semi => ";", + :year => %w(1965 2000 2012), + :dom => %w(example com) + } + } + context "length" do + it_behaves_like 'expands', { + '{var:3}' => 'val', + '{var:30}' => 'value', + '{var}' => 'value', + '{semi}' => '%3B', + '{semi:2}' => '%3B' + } + end + context "explode" do + it_behaves_like 'expands', { + 'find{?year*}' => 'find?year=1965&year=2000&year=2012', + 'www{.dom*}' => 'www.example.com', + } + end +end +describe "Expansion" do + subject { + { + :count => ["one", "two", "three"], + :dom => ["example", "com"], + :dub => "me/too", + :hello => "Hello World!", + :half => "50%", + :var => "value", + :who => "fred", + :base => "http://example.com/home/", + :path => "/foo/bar", + :list => ["red", "green", "blue"], + :keys => {"semi" => ";","dot" => ".","comma" => ","}, + :v => "6", + :x => "1024", + :y => "768", + :empty => "", + :empty_keys => {}, + :undef => nil + } + } + context "concatenation" do + it_behaves_like 'expands', { + '{count}' => 'one,two,three', + '{count*}' => 'one,two,three', + '{/count}' => '/one,two,three', + '{/count*}' => '/one/two/three', + '{;count}' => ';count=one,two,three', + '{;count*}' => ';count=one;count=two;count=three', + '{?count}' => '?count=one,two,three', + '{?count*}' => '?count=one&count=two&count=three', + '{&count*}' => '&count=one&count=two&count=three' + } + end + context "simple expansion" do + it_behaves_like 'expands', { + '{var}' => 'value', + '{hello}' => 'Hello%20World%21', + '{half}' => '50%25', + 'O{empty}X' => 'OX', + 'O{undef}X' => 'OX', + '{x,y}' => '1024,768', + '{x,hello,y}' => '1024,Hello%20World%21,768', + '?{x,empty}' => '?1024,', + '?{x,undef}' => '?1024', + '?{undef,y}' => '?768', + '{var:3}' => 'val', + '{var:30}' => 'value', + '{list}' => 'red,green,blue', + '{list*}' => 'red,green,blue', + '{keys}' => [ + 'semi,%3B,dot,.,comma,%2C', + 'dot,.,semi,%3B,comma,%2C', + 'comma,%2C,semi,%3B,dot,.', + 'semi,%3B,comma,%2C,dot,.', + 'dot,.,comma,%2C,semi,%3B', + 'comma,%2C,dot,.,semi,%3B' + ], + '{keys*}' => [ + 'semi=%3B,dot=.,comma=%2C', + 'dot=.,semi=%3B,comma=%2C', + 'comma=%2C,semi=%3B,dot=.', + 'semi=%3B,comma=%2C,dot=.', + 'dot=.,comma=%2C,semi=%3B', + 'comma=%2C,dot=.,semi=%3B' + ] + } + end + context "reserved expansion (+)" do + it_behaves_like 'expands', { + '{+var}' => 'value', + '{+hello}' => 'Hello%20World!', + '{+half}' => '50%25', + '{base}index' => 'http%3A%2F%2Fexample.com%2Fhome%2Findex', + '{+base}index' => 'http://example.com/home/index', + 'O{+empty}X' => 'OX', + 'O{+undef}X' => 'OX', + '{+path}/here' => '/foo/bar/here', + 'here?ref={+path}' => 'here?ref=/foo/bar', + 'up{+path}{var}/here' => 'up/foo/barvalue/here', + '{+x,hello,y}' => '1024,Hello%20World!,768', + '{+path,x}/here' => '/foo/bar,1024/here', + '{+path:6}/here' => '/foo/b/here', + '{+list}' => 'red,green,blue', + '{+list*}' => 'red,green,blue', + '{+keys}' => [ + 'semi,;,dot,.,comma,,', + 'dot,.,semi,;,comma,,', + 'comma,,,semi,;,dot,.', + 'semi,;,comma,,,dot,.', + 'dot,.,comma,,,semi,;', + 'comma,,,dot,.,semi,;' + ], + '{+keys*}' => [ + 'semi=;,dot=.,comma=,', + 'dot=.,semi=;,comma=,', + 'comma=,,semi=;,dot=.', + 'semi=;,comma=,,dot=.', + 'dot=.,comma=,,semi=;', + 'comma=,,dot=.,semi=;' + ] + } + end + context "fragment expansion (#)" do + it_behaves_like 'expands', { + '{#var}' => '#value', + '{#hello}' => '#Hello%20World!', + '{#half}' => '#50%25', + 'foo{#empty}' => 'foo#', + 'foo{#undef}' => 'foo', + '{#x,hello,y}' => '#1024,Hello%20World!,768', + '{#path,x}/here' => '#/foo/bar,1024/here', + '{#path:6}/here' => '#/foo/b/here', + '{#list}' => '#red,green,blue', + '{#list*}' => '#red,green,blue', + '{#keys}' => [ + '#semi,;,dot,.,comma,,', + '#dot,.,semi,;,comma,,', + '#comma,,,semi,;,dot,.', + '#semi,;,comma,,,dot,.', + '#dot,.,comma,,,semi,;', + '#comma,,,dot,.,semi,;' + ], + '{#keys*}' => [ + '#semi=;,dot=.,comma=,', + '#dot=.,semi=;,comma=,', + '#comma=,,semi=;,dot=.', + '#semi=;,comma=,,dot=.', + '#dot=.,comma=,,semi=;', + '#comma=,,dot=.,semi=;' + ] + } + end + context "label expansion (.)" do + it_behaves_like 'expands', { + '{.who}' => '.fred', + '{.who,who}' => '.fred.fred', + '{.half,who}' => '.50%25.fred', + 'www{.dom*}' => 'www.example.com', + 'X{.var}' => 'X.value', + 'X{.empty}' => 'X.', + 'X{.undef}' => 'X', + 'X{.var:3}' => 'X.val', + 'X{.list}' => 'X.red,green,blue', + 'X{.list*}' => 'X.red.green.blue', + 'X{.keys}' => [ + 'X.semi,%3B,dot,.,comma,%2C', + 'X.dot,.,semi,%3B,comma,%2C', + 'X.comma,%2C,semi,%3B,dot,.', + 'X.semi,%3B,comma,%2C,dot,.', + 'X.dot,.,comma,%2C,semi,%3B', + 'X.comma,%2C,dot,.,semi,%3B' + ], + 'X{.keys*}' => [ + 'X.semi=%3B.dot=..comma=%2C', + 'X.dot=..semi=%3B.comma=%2C', + 'X.comma=%2C.semi=%3B.dot=.', + 'X.semi=%3B.comma=%2C.dot=.', + 'X.dot=..comma=%2C.semi=%3B', + 'X.comma=%2C.dot=..semi=%3B' + ], + 'X{.empty_keys}' => 'X', + 'X{.empty_keys*}' => 'X' + } + end + context "path expansion (/)" do + it_behaves_like 'expands', { + '{/who}' => '/fred', + '{/who,who}' => '/fred/fred', + '{/half,who}' => '/50%25/fred', + '{/who,dub}' => '/fred/me%2Ftoo', + '{/var}' => '/value', + '{/var,empty}' => '/value/', + '{/var,undef}' => '/value', + '{/var,x}/here' => '/value/1024/here', + '{/var:1,var}' => '/v/value', + '{/list}' => '/red,green,blue', + '{/list*}' => '/red/green/blue', + '{/list*,path:4}' => '/red/green/blue/%2Ffoo', + '{/keys}' => [ + '/semi,%3B,dot,.,comma,%2C', + '/dot,.,semi,%3B,comma,%2C', + '/comma,%2C,semi,%3B,dot,.', + '/semi,%3B,comma,%2C,dot,.', + '/dot,.,comma,%2C,semi,%3B', + '/comma,%2C,dot,.,semi,%3B' + ], + '{/keys*}' => [ + '/semi=%3B/dot=./comma=%2C', + '/dot=./semi=%3B/comma=%2C', + '/comma=%2C/semi=%3B/dot=.', + '/semi=%3B/comma=%2C/dot=.', + '/dot=./comma=%2C/semi=%3B', + '/comma=%2C/dot=./semi=%3B' + ] + } + end + context "path-style expansion (;)" do + it_behaves_like 'expands', { + '{;who}' => ';who=fred', + '{;half}' => ';half=50%25', + '{;empty}' => ';empty', + '{;v,empty,who}' => ';v=6;empty;who=fred', + '{;v,bar,who}' => ';v=6;who=fred', + '{;x,y}' => ';x=1024;y=768', + '{;x,y,empty}' => ';x=1024;y=768;empty', + '{;x,y,undef}' => ';x=1024;y=768', + '{;hello:5}' => ';hello=Hello', + '{;list}' => ';list=red,green,blue', + '{;list*}' => ';list=red;list=green;list=blue', + '{;keys}' => [ + ';keys=semi,%3B,dot,.,comma,%2C', + ';keys=dot,.,semi,%3B,comma,%2C', + ';keys=comma,%2C,semi,%3B,dot,.', + ';keys=semi,%3B,comma,%2C,dot,.', + ';keys=dot,.,comma,%2C,semi,%3B', + ';keys=comma,%2C,dot,.,semi,%3B' + ], + '{;keys*}' => [ + ';semi=%3B;dot=.;comma=%2C', + ';dot=.;semi=%3B;comma=%2C', + ';comma=%2C;semi=%3B;dot=.', + ';semi=%3B;comma=%2C;dot=.', + ';dot=.;comma=%2C;semi=%3B', + ';comma=%2C;dot=.;semi=%3B' + ] + } + end + context "form query expansion (?)" do + it_behaves_like 'expands', { + '{?who}' => '?who=fred', + '{?half}' => '?half=50%25', + '{?x,y}' => '?x=1024&y=768', + '{?x,y,empty}' => '?x=1024&y=768&empty=', + '{?x,y,undef}' => '?x=1024&y=768', + '{?var:3}' => '?var=val', + '{?list}' => '?list=red,green,blue', + '{?list*}' => '?list=red&list=green&list=blue', + '{?keys}' => [ + '?keys=semi,%3B,dot,.,comma,%2C', + '?keys=dot,.,semi,%3B,comma,%2C', + '?keys=comma,%2C,semi,%3B,dot,.', + '?keys=semi,%3B,comma,%2C,dot,.', + '?keys=dot,.,comma,%2C,semi,%3B', + '?keys=comma,%2C,dot,.,semi,%3B' + ], + '{?keys*}' => [ + '?semi=%3B&dot=.&comma=%2C', + '?dot=.&semi=%3B&comma=%2C', + '?comma=%2C&semi=%3B&dot=.', + '?semi=%3B&comma=%2C&dot=.', + '?dot=.&comma=%2C&semi=%3B', + '?comma=%2C&dot=.&semi=%3B' + ] + } + end + context "form query expansion (&)" do + it_behaves_like 'expands', { + '{&who}' => '&who=fred', + '{&half}' => '&half=50%25', + '?fixed=yes{&x}' => '?fixed=yes&x=1024', + '{&x,y,empty}' => '&x=1024&y=768&empty=', + '{&x,y,undef}' => '&x=1024&y=768', + '{&var:3}' => '&var=val', + '{&list}' => '&list=red,green,blue', + '{&list*}' => '&list=red&list=green&list=blue', + '{&keys}' => [ + '&keys=semi,%3B,dot,.,comma,%2C', + '&keys=dot,.,semi,%3B,comma,%2C', + '&keys=comma,%2C,semi,%3B,dot,.', + '&keys=semi,%3B,comma,%2C,dot,.', + '&keys=dot,.,comma,%2C,semi,%3B', + '&keys=comma,%2C,dot,.,semi,%3B' + ], + '{&keys*}' => [ + '&semi=%3B&dot=.&comma=%2C', + '&dot=.&semi=%3B&comma=%2C', + '&comma=%2C&semi=%3B&dot=.', + '&semi=%3B&comma=%2C&dot=.', + '&dot=.&comma=%2C&semi=%3B', + '&comma=%2C&dot=.&semi=%3B' + ] + } + end + context "non-string key in match data" do + subject {Addressable::Template.new("http://example.com/{one}")} + + it "raises TypeError" do + expect { subject.expand(Object.new => "1") }.to raise_error TypeError + end + end +end + +class ExampleTwoProcessor + def self.restore(name, value) + return value.gsub(/-/, " ") if name == "query" + return value + end + + def self.match(name) + return ".*?" if name == "first" + return ".*" + end + def self.validate(name, value) + return !!(value =~ /^[\w ]+$/) if name == "query" + return true + end + + def self.transform(name, value) + return value.gsub(/ /, "+") if name == "query" + return value + end +end + +class DumbProcessor + def self.match(name) + return ".*?" if name == "first" + end +end + +describe Addressable::Template do + describe 'initialize' do + context 'with a non-string' do + it 'raises a TypeError' do + expect { Addressable::Template.new(nil) }.to raise_error(TypeError) + end + end + end + + describe 'freeze' do + subject { Addressable::Template.new("http://example.com/{first}/{+second}/") } + it 'freezes the template' do + expect(subject.freeze).to be_frozen + end + end + + describe "Matching" do + let(:uri){ + Addressable::URI.parse( + "http://example.com/search/an-example-search-query/" + ) + } + let(:uri2){ + Addressable::URI.parse("http://example.com/a/b/c/") + } + let(:uri3){ + Addressable::URI.parse("http://example.com/;a=1;b=2;c=3;first=foo") + } + let(:uri4){ + Addressable::URI.parse("http://example.com/?a=1&b=2&c=3&first=foo") + } + let(:uri5){ + "http://example.com/foo" + } + context "first uri with ExampleTwoProcessor" do + subject { + Addressable::Template.new( + "http://example.com/search/{query}/" + ).match(uri, ExampleTwoProcessor) + } + its(:variables){ should == ["query"] } + its(:captures){ should == ["an example search query"] } + end + + context "second uri with ExampleTwoProcessor" do + subject { + Addressable::Template.new( + "http://example.com/{first}/{+second}/" + ).match(uri2, ExampleTwoProcessor) + } + its(:variables){ should == ["first", "second"] } + its(:captures){ should == ["a", "b/c"] } + end + + context "second uri with DumbProcessor" do + subject { + Addressable::Template.new( + "http://example.com/{first}/{+second}/" + ).match(uri2, DumbProcessor) + } + its(:variables){ should == ["first", "second"] } + its(:captures){ should == ["a", "b/c"] } + end + + context "second uri" do + subject { + Addressable::Template.new( + "http://example.com/{first}{/second*}/" + ).match(uri2) + } + its(:variables){ should == ["first", "second"] } + its(:captures){ should == ["a", ["b","c"]] } + end + context "third uri" do + subject { + Addressable::Template.new( + "http://example.com/{;hash*,first}" + ).match(uri3) + } + its(:variables){ should == ["hash", "first"] } + its(:captures){ should == [ + {"a" => "1", "b" => "2", "c" => "3", "first" => "foo"}, nil] } + end + # Note that this expansion is impossible to revert deterministically - the + # * operator means first could have been a key of hash or a separate key. + # Semantically, a separate key is more likely, but both are possible. + context "fourth uri" do + subject { + Addressable::Template.new( + "http://example.com/{?hash*,first}" + ).match(uri4) + } + its(:variables){ should == ["hash", "first"] } + its(:captures){ should == [ + {"a" => "1", "b" => "2", "c" => "3", "first"=> "foo"}, nil] } + end + context "fifth uri" do + subject { + Addressable::Template.new( + "http://example.com/{path}{?hash*,first}" + ).match(uri5) + } + its(:variables){ should == ["path", "hash", "first"] } + its(:captures){ should == ["foo", nil, nil] } + end + end + + describe 'match' do + subject { Addressable::Template.new('http://example.com/first/second/') } + context 'when the URI is the same as the template' do + it 'returns the match data itself with an empty mapping' do + uri = Addressable::URI.parse('http://example.com/first/second/') + match_data = subject.match(uri) + expect(match_data).to be_an Addressable::Template::MatchData + expect(match_data.uri).to eq(uri) + expect(match_data.template).to eq(subject) + expect(match_data.mapping).to be_empty + expect(match_data.inspect).to be_an String + end + end + end + + describe "extract" do + let(:template) { + Addressable::Template.new( + "http://{host}{/segments*}/{?one,two,bogus}{#fragment}" + ) + } + let(:uri){ "http://example.com/a/b/c/?one=1&two=2#foo" } + let(:uri2){ "http://example.com/a/b/c/#foo" } + it "should be able to extract with queries" do + expect(template.extract(uri)).to eq({ + "host" => "example.com", + "segments" => %w(a b c), + "one" => "1", + "bogus" => nil, + "two" => "2", + "fragment" => "foo" + }) + end + it "should be able to extract without queries" do + expect(template.extract(uri2)).to eq({ + "host" => "example.com", + "segments" => %w(a b c), + "one" => nil, + "bogus" => nil, + "two" => nil, + "fragment" => "foo" + }) + end + + context "issue #137" do + subject { Addressable::Template.new('/path{?page,per_page}') } + + it "can match empty" do + data = subject.extract("/path") + expect(data["page"]).to eq(nil) + expect(data["per_page"]).to eq(nil) + expect(data.keys.sort).to eq(['page', 'per_page']) + end + + it "can match first var" do + data = subject.extract("/path?page=1") + expect(data["page"]).to eq("1") + expect(data["per_page"]).to eq(nil) + expect(data.keys.sort).to eq(['page', 'per_page']) + end + + it "can match second var" do + data = subject.extract("/path?per_page=1") + expect(data["page"]).to eq(nil) + expect(data["per_page"]).to eq("1") + expect(data.keys.sort).to eq(['page', 'per_page']) + end + + it "can match both vars" do + data = subject.extract("/path?page=2&per_page=1") + expect(data["page"]).to eq("2") + expect(data["per_page"]).to eq("1") + expect(data.keys.sort).to eq(['page', 'per_page']) + end + end + end + + describe "Partial expand with symbols" do + context "partial_expand with two simple values" do + subject { + Addressable::Template.new("http://example.com/{one}/{two}/") + } + it "builds a new pattern" do + expect(subject.partial_expand(:one => "1").pattern).to eq( + "http://example.com/1/{two}/" + ) + end + end + context "partial_expand query with missing param in middle" do + subject { + Addressable::Template.new("http://example.com/{?one,two,three}/") + } + it "builds a new pattern" do + expect(subject.partial_expand(:one => "1", :three => "3").pattern).to eq( + "http://example.com/?one=1{&two}&three=3/" + ) + end + end + context "partial_expand form style query with missing param at beginning" do + subject { + Addressable::Template.new("http://example.com/{?one,two}/") + } + it "builds a new pattern" do + expect(subject.partial_expand(:two => "2").pattern).to eq( + "http://example.com/?two=2{&one}/" + ) + end + end + context "issue #307 - partial_expand form query with nil params" do + subject do + Addressable::Template.new("http://example.com/{?one,two,three}/") + end + it "builds a new pattern with two=nil" do + expect(subject.partial_expand(two: nil).pattern).to eq( + "http://example.com/{?one}{&three}/" + ) + end + it "builds a new pattern with one=nil and two=nil" do + expect(subject.partial_expand(one: nil, two: nil).pattern).to eq( + "http://example.com/{?three}/" + ) + end + it "builds a new pattern with one=1 and two=nil" do + expect(subject.partial_expand(one: 1, two: nil).pattern).to eq( + "http://example.com/?one=1{&three}/" + ) + end + it "builds a new pattern with one=nil and two=2" do + expect(subject.partial_expand(one: nil, two: 2).pattern).to eq( + "http://example.com/?two=2{&three}/" + ) + end + it "builds a new pattern with one=nil" do + expect(subject.partial_expand(one: nil).pattern).to eq( + "http://example.com/{?two}{&three}/" + ) + end + end + context "partial_expand with query string" do + subject { + Addressable::Template.new("http://example.com/{?two,one}/") + } + it "builds a new pattern" do + expect(subject.partial_expand(:one => "1").pattern).to eq( + "http://example.com/?one=1{&two}/" + ) + end + end + context "partial_expand with path operator" do + subject { + Addressable::Template.new("http://example.com{/one,two}/") + } + it "builds a new pattern" do + expect(subject.partial_expand(:one => "1").pattern).to eq( + "http://example.com/1{/two}/" + ) + end + end + context "partial expand with unicode values" do + subject do + Addressable::Template.new("http://example.com/{resource}/{query}/") + end + it "normalizes unicode by default" do + template = subject.partial_expand("query" => "Cafe\u0301") + expect(template.pattern).to eq( + "http://example.com/{resource}/Caf%C3%A9/" + ) + end + + it "does not normalize unicode when byte semantics requested" do + template = subject.partial_expand({"query" => "Cafe\u0301"}, nil, false) + expect(template.pattern).to eq( + "http://example.com/{resource}/Cafe%CC%81/" + ) + end + end + end + describe "Partial expand with strings" do + context "partial_expand with two simple values" do + subject { + Addressable::Template.new("http://example.com/{one}/{two}/") + } + it "builds a new pattern" do + expect(subject.partial_expand("one" => "1").pattern).to eq( + "http://example.com/1/{two}/" + ) + end + end + context "partial_expand query with missing param in middle" do + subject { + Addressable::Template.new("http://example.com/{?one,two,three}/") + } + it "builds a new pattern" do + expect(subject.partial_expand("one" => "1", "three" => "3").pattern).to eq( + "http://example.com/?one=1{&two}&three=3/" + ) + end + end + context "partial_expand with query string" do + subject { + Addressable::Template.new("http://example.com/{?two,one}/") + } + it "builds a new pattern" do + expect(subject.partial_expand("one" => "1").pattern).to eq( + "http://example.com/?one=1{&two}/" + ) + end + end + context "partial_expand with path operator" do + subject { + Addressable::Template.new("http://example.com{/one,two}/") + } + it "builds a new pattern" do + expect(subject.partial_expand("one" => "1").pattern).to eq( + "http://example.com/1{/two}/" + ) + end + end + end + describe "Expand" do + context "expand with unicode values" do + subject do + Addressable::Template.new("http://example.com/search/{query}/") + end + it "normalizes unicode by default" do + uri = subject.expand("query" => "Cafe\u0301").to_str + expect(uri).to eq("http://example.com/search/Caf%C3%A9/") + end + + it "does not normalize unicode when byte semantics requested" do + uri = subject.expand({ "query" => "Cafe\u0301" }, nil, false).to_str + expect(uri).to eq("http://example.com/search/Cafe%CC%81/") + end + end + context "expand with a processor" do + subject { + Addressable::Template.new("http://example.com/search/{query}/") + } + it "processes spaces" do + expect(subject.expand({"query" => "an example search query"}, + ExampleTwoProcessor).to_str).to eq( + "http://example.com/search/an+example+search+query/" + ) + end + it "validates" do + expect{ + subject.expand({"query" => "Bogus!"}, + ExampleTwoProcessor).to_str + }.to raise_error(Addressable::Template::InvalidTemplateValueError) + end + end + context "partial_expand query with missing param in middle" do + subject { + Addressable::Template.new("http://example.com/{?one,two,three}/") + } + it "builds a new pattern" do + expect(subject.partial_expand("one" => "1", "three" => "3").pattern).to eq( + "http://example.com/?one=1{&two}&three=3/" + ) + end + end + context "partial_expand with query string" do + subject { + Addressable::Template.new("http://example.com/{?two,one}/") + } + it "builds a new pattern" do + expect(subject.partial_expand("one" => "1").pattern).to eq( + "http://example.com/?one=1{&two}/" + ) + end + end + context "partial_expand with path operator" do + subject { + Addressable::Template.new("http://example.com{/one,two}/") + } + it "builds a new pattern" do + expect(subject.partial_expand("one" => "1").pattern).to eq( + "http://example.com/1{/two}/" + ) + end + end + end + context "Matching with operators" do + describe "Level 1:" do + subject { Addressable::Template.new("foo{foo}/{bar}baz") } + it "can match" do + data = subject.match("foofoo/bananabaz") + expect(data.mapping["foo"]).to eq("foo") + expect(data.mapping["bar"]).to eq("banana") + end + it "can fail" do + expect(subject.match("bar/foo")).to be_nil + expect(subject.match("foobaz")).to be_nil + end + it "can match empty" do + data = subject.match("foo/baz") + expect(data.mapping["foo"]).to eq(nil) + expect(data.mapping["bar"]).to eq(nil) + end + it "lists vars" do + expect(subject.variables).to eq(["foo", "bar"]) + end + end + + describe "Level 2:" do + subject { Addressable::Template.new("foo{+foo}{#bar}baz") } + it "can match" do + data = subject.match("foo/test/banana#bazbaz") + expect(data.mapping["foo"]).to eq("/test/banana") + expect(data.mapping["bar"]).to eq("baz") + end + it "can match empty level 2 #" do + data = subject.match("foo/test/bananabaz") + expect(data.mapping["foo"]).to eq("/test/banana") + expect(data.mapping["bar"]).to eq(nil) + data = subject.match("foo/test/banana#baz") + expect(data.mapping["foo"]).to eq("/test/banana") + expect(data.mapping["bar"]).to eq("") + end + it "can match empty level 2 +" do + data = subject.match("foobaz") + expect(data.mapping["foo"]).to eq(nil) + expect(data.mapping["bar"]).to eq(nil) + data = subject.match("foo#barbaz") + expect(data.mapping["foo"]).to eq(nil) + expect(data.mapping["bar"]).to eq("bar") + end + it "lists vars" do + expect(subject.variables).to eq(["foo", "bar"]) + end + end + + describe "Level 3:" do + context "no operator" do + subject { Addressable::Template.new("foo{foo,bar}baz") } + it "can match" do + data = subject.match("foofoo,barbaz") + expect(data.mapping["foo"]).to eq("foo") + expect(data.mapping["bar"]).to eq("bar") + end + it "lists vars" do + expect(subject.variables).to eq(["foo", "bar"]) + end + end + context "+ operator" do + subject { Addressable::Template.new("foo{+foo,bar}baz") } + it "can match" do + data = subject.match("foofoo/bar,barbaz") + expect(data.mapping["bar"]).to eq("foo/bar,bar") + expect(data.mapping["foo"]).to eq("") + end + it "lists vars" do + expect(subject.variables).to eq(["foo", "bar"]) + end + end + context ". operator" do + subject { Addressable::Template.new("foo{.foo,bar}baz") } + it "can match" do + data = subject.match("foo.foo.barbaz") + expect(data.mapping["foo"]).to eq("foo") + expect(data.mapping["bar"]).to eq("bar") + end + it "lists vars" do + expect(subject.variables).to eq(["foo", "bar"]) + end + end + context "/ operator" do + subject { Addressable::Template.new("foo{/foo,bar}baz") } + it "can match" do + data = subject.match("foo/foo/barbaz") + expect(data.mapping["foo"]).to eq("foo") + expect(data.mapping["bar"]).to eq("bar") + end + it "lists vars" do + expect(subject.variables).to eq(["foo", "bar"]) + end + end + context "; operator" do + subject { Addressable::Template.new("foo{;foo,bar,baz}baz") } + it "can match" do + data = subject.match("foo;foo=bar%20baz;bar=foo;bazbaz") + expect(data.mapping["foo"]).to eq("bar baz") + expect(data.mapping["bar"]).to eq("foo") + expect(data.mapping["baz"]).to eq("") + end + it "lists vars" do + expect(subject.variables).to eq(%w(foo bar baz)) + end + end + context "? operator" do + context "test" do + subject { Addressable::Template.new("foo{?foo,bar}baz") } + it "can match" do + data = subject.match("foo?foo=bar%20baz&bar=foobaz") + expect(data.mapping["foo"]).to eq("bar baz") + expect(data.mapping["bar"]).to eq("foo") + end + it "lists vars" do + expect(subject.variables).to eq(%w(foo bar)) + end + end + + context "issue #137" do + subject { Addressable::Template.new('/path{?page,per_page}') } + + it "can match empty" do + data = subject.match("/path") + expect(data.mapping["page"]).to eq(nil) + expect(data.mapping["per_page"]).to eq(nil) + expect(data.mapping.keys.sort).to eq(['page', 'per_page']) + end + + it "can match first var" do + data = subject.match("/path?page=1") + expect(data.mapping["page"]).to eq("1") + expect(data.mapping["per_page"]).to eq(nil) + expect(data.mapping.keys.sort).to eq(['page', 'per_page']) + end + + it "can match second var" do + data = subject.match("/path?per_page=1") + expect(data.mapping["page"]).to eq(nil) + expect(data.mapping["per_page"]).to eq("1") + expect(data.mapping.keys.sort).to eq(['page', 'per_page']) + end + + it "can match both vars" do + data = subject.match("/path?page=2&per_page=1") + expect(data.mapping["page"]).to eq("2") + expect(data.mapping["per_page"]).to eq("1") + expect(data.mapping.keys.sort).to eq(['page', 'per_page']) + end + end + + context "issue #71" do + subject { Addressable::Template.new("http://cyberscore.dev/api/users{?username}") } + it "can match" do + data = subject.match("http://cyberscore.dev/api/users?username=foobaz") + expect(data.mapping["username"]).to eq("foobaz") + end + it "lists vars" do + expect(subject.variables).to eq(%w(username)) + expect(subject.keys).to eq(%w(username)) + end + end + end + context "& operator" do + subject { Addressable::Template.new("foo{&foo,bar}baz") } + it "can match" do + data = subject.match("foo&foo=bar%20baz&bar=foobaz") + expect(data.mapping["foo"]).to eq("bar baz") + expect(data.mapping["bar"]).to eq("foo") + end + it "lists vars" do + expect(subject.variables).to eq(%w(foo bar)) + end + end + end + end + + context "support regexes:" do + context "EXPRESSION" do + subject { Addressable::Template::EXPRESSION } + it "should be able to match an expression" do + expect(subject).to match("{foo}") + expect(subject).to match("{foo,9}") + expect(subject).to match("{foo.bar,baz}") + expect(subject).to match("{+foo.bar,baz}") + expect(subject).to match("{foo,foo%20bar}") + expect(subject).to match("{#foo:20,baz*}") + expect(subject).to match("stuff{#foo:20,baz*}things") + end + it "should fail on non vars" do + expect(subject).not_to match("!{foo") + expect(subject).not_to match("{foo.bar.}") + expect(subject).not_to match("!{}") + end + end + context "VARNAME" do + subject { Addressable::Template::VARNAME } + it "should be able to match a variable" do + expect(subject).to match("foo") + expect(subject).to match("9") + expect(subject).to match("foo.bar") + expect(subject).to match("foo_bar") + expect(subject).to match("foo_bar.baz") + expect(subject).to match("foo%20bar") + expect(subject).to match("foo%20bar.baz") + end + it "should fail on non vars" do + expect(subject).not_to match("!foo") + expect(subject).not_to match("foo.bar.") + expect(subject).not_to match("foo%2%00bar") + expect(subject).not_to match("foo_ba%r") + expect(subject).not_to match("foo_bar*") + expect(subject).not_to match("foo_bar:20") + end + + it 'should parse in a reasonable time' do + expect do + Timeout.timeout(0.1) do + expect(subject).not_to match("0"*25 + "!") + end + end.not_to raise_error + end + end + context "VARIABLE_LIST" do + subject { Addressable::Template::VARIABLE_LIST } + it "should be able to match a variable list" do + expect(subject).to match("foo,bar") + expect(subject).to match("foo") + expect(subject).to match("foo,bar*,baz") + expect(subject).to match("foo.bar,bar_baz*,baz:12") + end + it "should fail on non vars" do + expect(subject).not_to match(",foo,bar*,baz") + expect(subject).not_to match("foo,*bar,baz") + expect(subject).not_to match("foo,,bar*,baz") + end + end + context "VARSPEC" do + subject { Addressable::Template::VARSPEC } + it "should be able to match a variable with modifier" do + expect(subject).to match("9:8") + expect(subject).to match("foo.bar*") + expect(subject).to match("foo_bar:12") + expect(subject).to match("foo_bar.baz*") + expect(subject).to match("foo%20bar:12") + expect(subject).to match("foo%20bar.baz*") + end + it "should fail on non vars" do + expect(subject).not_to match("!foo") + expect(subject).not_to match("*foo") + expect(subject).not_to match("fo*o") + expect(subject).not_to match("fo:o") + expect(subject).not_to match("foo:") + end + end + end +end + +describe Addressable::Template::MatchData do + let(:template) { Addressable::Template.new('{foo}/{bar}') } + subject(:its) { template.match('ab/cd') } + its(:uri) { should == Addressable::URI.parse('ab/cd') } + its(:template) { should == template } + its(:mapping) { should == { 'foo' => 'ab', 'bar' => 'cd' } } + its(:variables) { should == ['foo', 'bar'] } + its(:keys) { should == ['foo', 'bar'] } + its(:names) { should == ['foo', 'bar'] } + its(:values) { should == ['ab', 'cd'] } + its(:captures) { should == ['ab', 'cd'] } + its(:to_a) { should == ['ab/cd', 'ab', 'cd'] } + its(:to_s) { should == 'ab/cd' } + its(:string) { should == its.to_s } + its(:pre_match) { should == "" } + its(:post_match) { should == "" } + + describe 'values_at' do + it 'returns an array with the values' do + expect(its.values_at(0, 2)).to eq(['ab/cd', 'cd']) + end + it 'allows mixing integer an string keys' do + expect(its.values_at('foo', 1)).to eq(['ab', 'ab']) + end + it 'accepts unknown keys' do + expect(its.values_at('baz', 'foo')).to eq([nil, 'ab']) + end + end + + describe '[]' do + context 'string key' do + it 'returns the corresponding capture' do + expect(its['foo']).to eq('ab') + expect(its['bar']).to eq('cd') + end + it 'returns nil for unknown keys' do + expect(its['baz']).to be_nil + end + end + context 'symbol key' do + it 'returns the corresponding capture' do + expect(its[:foo]).to eq('ab') + expect(its[:bar]).to eq('cd') + end + it 'returns nil for unknown keys' do + expect(its[:baz]).to be_nil + end + end + context 'integer key' do + it 'returns the full URI for index 0' do + expect(its[0]).to eq('ab/cd') + end + it 'returns the corresponding capture' do + expect(its[1]).to eq('ab') + expect(its[2]).to eq('cd') + end + it 'returns nil for unknown keys' do + expect(its[3]).to be_nil + end + end + context 'other key' do + it 'raises an exception' do + expect { its[Object.new] }.to raise_error(TypeError) + end + end + context 'with length' do + it 'returns an array starting at index with given length' do + expect(its[0, 2]).to eq(['ab/cd', 'ab']) + expect(its[2, 1]).to eq(['cd']) + end + end + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/addressable-2.8.0/spec/addressable/uri_spec.rb b/vendor/bundle/ruby/3.1.0/gems/addressable-2.8.0/spec/addressable/uri_spec.rb new file mode 100644 index 000000000..00baaacf9 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/addressable-2.8.0/spec/addressable/uri_spec.rb @@ -0,0 +1,6665 @@ +# frozen_string_literal: true + +# coding: utf-8 +# Copyright (C) Bob Aman +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + + +require "spec_helper" + +require "addressable/uri" +require "uri" +require "ipaddr" + +if !"".respond_to?("force_encoding") + class String + def force_encoding(encoding) + @encoding = encoding + end + + def encoding + @encoding ||= Encoding::ASCII_8BIT + end + end + + class Encoding + def initialize(name) + @name = name + end + + def to_s + return @name + end + + UTF_8 = Encoding.new("UTF-8") + ASCII_8BIT = Encoding.new("US-ASCII") + end +end + +module Fake + module URI + class HTTP + def initialize(uri) + @uri = uri + end + + def to_s + return @uri.to_s + end + + alias :to_str :to_s + end + end +end + +describe Addressable::URI, "when created with a non-numeric port number" do + it "should raise an error" do + expect do + Addressable::URI.new(:port => "bogus") + end.to raise_error(Addressable::URI::InvalidURIError) + end +end + +describe Addressable::URI, "when created with a invalid encoded port number" do + it "should raise an error" do + expect do + Addressable::URI.new(:port => "%eb") + end.to raise_error(Addressable::URI::InvalidURIError) + end +end + +describe Addressable::URI, "when created with a non-string scheme" do + it "should raise an error" do + expect do + Addressable::URI.new(:scheme => :bogus) + end.to raise_error(TypeError) + end +end + +describe Addressable::URI, "when created with a non-string user" do + it "should raise an error" do + expect do + Addressable::URI.new(:user => :bogus) + end.to raise_error(TypeError) + end +end + +describe Addressable::URI, "when created with a non-string password" do + it "should raise an error" do + expect do + Addressable::URI.new(:password => :bogus) + end.to raise_error(TypeError) + end +end + +describe Addressable::URI, "when created with a non-string userinfo" do + it "should raise an error" do + expect do + Addressable::URI.new(:userinfo => :bogus) + end.to raise_error(TypeError) + end +end + +describe Addressable::URI, "when created with a non-string host" do + it "should raise an error" do + expect do + Addressable::URI.new(:host => :bogus) + end.to raise_error(TypeError) + end +end + +describe Addressable::URI, "when created with a non-string authority" do + it "should raise an error" do + expect do + Addressable::URI.new(:authority => :bogus) + end.to raise_error(TypeError) + end +end + +describe Addressable::URI, "when created with a non-string path" do + it "should raise an error" do + expect do + Addressable::URI.new(:path => :bogus) + end.to raise_error(TypeError) + end +end + +describe Addressable::URI, "when created with a non-string query" do + it "should raise an error" do + expect do + Addressable::URI.new(:query => :bogus) + end.to raise_error(TypeError) + end +end + +describe Addressable::URI, "when created with a non-string fragment" do + it "should raise an error" do + expect do + Addressable::URI.new(:fragment => :bogus) + end.to raise_error(TypeError) + end +end + +describe Addressable::URI, "when created with a scheme but no hierarchical " + + "segment" do + it "should raise an error" do + expect do + Addressable::URI.parse("http:") + end.to raise_error(Addressable::URI::InvalidURIError) + end +end + +describe Addressable::URI, "quote handling" do + describe 'in host name' do + it "should raise an error for single quote" do + expect do + Addressable::URI.parse("http://local\"host/") + end.to raise_error(Addressable::URI::InvalidURIError) + end + end +end + +describe Addressable::URI, "newline normalization" do + it "should not accept newlines in scheme" do + expect do + Addressable::URI.parse("ht%0atp://localhost/") + end.to raise_error(Addressable::URI::InvalidURIError) + end + + it "should not unescape newline in path" do + uri = Addressable::URI.parse("http://localhost/%0a").normalize + expect(uri.to_s).to eq("http://localhost/%0A") + end + + it "should not unescape newline in hostname" do + uri = Addressable::URI.parse("http://local%0ahost/").normalize + expect(uri.to_s).to eq("http://local%0Ahost/") + end + + it "should not unescape newline in username" do + uri = Addressable::URI.parse("http://foo%0abar@localhost/").normalize + expect(uri.to_s).to eq("http://foo%0Abar@localhost/") + end + + it "should not unescape newline in username" do + uri = Addressable::URI.parse("http://example:foo%0abar@example/").normalize + expect(uri.to_s).to eq("http://example:foo%0Abar@example/") + end + + it "should not accept newline in hostname" do + uri = Addressable::URI.parse("http://localhost/") + expect do + uri.host = "local\nhost" + end.to raise_error(Addressable::URI::InvalidURIError) + end +end + +describe Addressable::URI, "when created with ambiguous path" do + it "should raise an error" do + expect do + Addressable::URI.parse("::http") + end.to raise_error(Addressable::URI::InvalidURIError) + end +end + +describe Addressable::URI, "when created with an invalid host" do + it "should raise an error" do + expect do + Addressable::URI.new(:host => "") + end.to raise_error(Addressable::URI::InvalidURIError) + end +end + +describe Addressable::URI, "when created with a host consisting of " + + "sub-delims characters" do + it "should not raise an error" do + expect do + Addressable::URI.new( + :host => Addressable::URI::CharacterClasses::SUB_DELIMS.gsub(/\\/, '') + ) + end.not_to raise_error + end +end + +describe Addressable::URI, "when created with a host consisting of " + + "unreserved characters" do + it "should not raise an error" do + expect do + Addressable::URI.new( + :host => Addressable::URI::CharacterClasses::UNRESERVED.gsub(/\\/, '') + ) + end.not_to raise_error + end +end + +describe Addressable::URI, "when created from nil components" do + before do + @uri = Addressable::URI.new + end + + it "should have a nil site value" do + expect(@uri.site).to eq(nil) + end + + it "should have an empty path" do + expect(@uri.path).to eq("") + end + + it "should be an empty uri" do + expect(@uri.to_s).to eq("") + end + + it "should have a nil default port" do + expect(@uri.default_port).to eq(nil) + end + + it "should be empty" do + expect(@uri).to be_empty + end + + it "should raise an error if the scheme is set to whitespace" do + expect do + @uri.scheme = "\t \n" + end.to raise_error(Addressable::URI::InvalidURIError, /'\t \n'/) + end + + it "should raise an error if the scheme is set to all digits" do + expect do + @uri.scheme = "123" + end.to raise_error(Addressable::URI::InvalidURIError, /'123'/) + end + + it "should raise an error if the scheme begins with a digit" do + expect do + @uri.scheme = "1scheme" + end.to raise_error(Addressable::URI::InvalidURIError, /'1scheme'/) + end + + it "should raise an error if the scheme begins with a plus" do + expect do + @uri.scheme = "+scheme" + end.to raise_error(Addressable::URI::InvalidURIError, /'\+scheme'/) + end + + it "should raise an error if the scheme begins with a dot" do + expect do + @uri.scheme = ".scheme" + end.to raise_error(Addressable::URI::InvalidURIError, /'\.scheme'/) + end + + it "should raise an error if the scheme begins with a dash" do + expect do + @uri.scheme = "-scheme" + end.to raise_error(Addressable::URI::InvalidURIError, /'-scheme'/) + end + + it "should raise an error if the scheme contains an illegal character" do + expect do + @uri.scheme = "scheme!" + end.to raise_error(Addressable::URI::InvalidURIError, /'scheme!'/) + end + + it "should raise an error if the scheme contains whitespace" do + expect do + @uri.scheme = "sch eme" + end.to raise_error(Addressable::URI::InvalidURIError, /'sch eme'/) + end + + it "should raise an error if the scheme contains a newline" do + expect do + @uri.scheme = "sch\neme" + end.to raise_error(Addressable::URI::InvalidURIError) + end + + it "should raise an error if set into an invalid state" do + expect do + @uri.user = "user" + end.to raise_error(Addressable::URI::InvalidURIError) + end + + it "should raise an error if set into an invalid state" do + expect do + @uri.password = "pass" + end.to raise_error(Addressable::URI::InvalidURIError) + end + + it "should raise an error if set into an invalid state" do + expect do + @uri.scheme = "http" + @uri.fragment = "fragment" + end.to raise_error(Addressable::URI::InvalidURIError) + end + + it "should raise an error if set into an invalid state" do + expect do + @uri.fragment = "fragment" + @uri.scheme = "http" + end.to raise_error(Addressable::URI::InvalidURIError) + end +end + +describe Addressable::URI, "when initialized from individual components" do + before do + @uri = Addressable::URI.new( + :scheme => "http", + :user => "user", + :password => "password", + :host => "example.com", + :port => 8080, + :path => "/path", + :query => "query=value", + :fragment => "fragment" + ) + end + + it "returns 'http' for #scheme" do + expect(@uri.scheme).to eq("http") + end + + it "returns 'http' for #normalized_scheme" do + expect(@uri.normalized_scheme).to eq("http") + end + + it "returns 'user' for #user" do + expect(@uri.user).to eq("user") + end + + it "returns 'user' for #normalized_user" do + expect(@uri.normalized_user).to eq("user") + end + + it "returns 'password' for #password" do + expect(@uri.password).to eq("password") + end + + it "returns 'password' for #normalized_password" do + expect(@uri.normalized_password).to eq("password") + end + + it "returns 'user:password' for #userinfo" do + expect(@uri.userinfo).to eq("user:password") + end + + it "returns 'user:password' for #normalized_userinfo" do + expect(@uri.normalized_userinfo).to eq("user:password") + end + + it "returns 'example.com' for #host" do + expect(@uri.host).to eq("example.com") + end + + it "returns 'example.com' for #normalized_host" do + expect(@uri.normalized_host).to eq("example.com") + end + + it "returns 'com' for #tld" do + expect(@uri.tld).to eq("com") + end + + it "returns 'user:password@example.com:8080' for #authority" do + expect(@uri.authority).to eq("user:password@example.com:8080") + end + + it "returns 'user:password@example.com:8080' for #normalized_authority" do + expect(@uri.normalized_authority).to eq("user:password@example.com:8080") + end + + it "returns 8080 for #port" do + expect(@uri.port).to eq(8080) + end + + it "returns 8080 for #normalized_port" do + expect(@uri.normalized_port).to eq(8080) + end + + it "returns 80 for #default_port" do + expect(@uri.default_port).to eq(80) + end + + it "returns 'http://user:password@example.com:8080' for #site" do + expect(@uri.site).to eq("http://user:password@example.com:8080") + end + + it "returns 'http://user:password@example.com:8080' for #normalized_site" do + expect(@uri.normalized_site).to eq("http://user:password@example.com:8080") + end + + it "returns '/path' for #path" do + expect(@uri.path).to eq("/path") + end + + it "returns '/path' for #normalized_path" do + expect(@uri.normalized_path).to eq("/path") + end + + it "returns 'query=value' for #query" do + expect(@uri.query).to eq("query=value") + end + + it "returns 'query=value' for #normalized_query" do + expect(@uri.normalized_query).to eq("query=value") + end + + it "returns 'fragment' for #fragment" do + expect(@uri.fragment).to eq("fragment") + end + + it "returns 'fragment' for #normalized_fragment" do + expect(@uri.normalized_fragment).to eq("fragment") + end + + it "returns #hash" do + expect(@uri.hash).not_to be nil + end + + it "returns #to_s" do + expect(@uri.to_s).to eq( + "http://user:password@example.com:8080/path?query=value#fragment" + ) + end + + it "should not be empty" do + expect(@uri).not_to be_empty + end + + it "should not be frozen" do + expect(@uri).not_to be_frozen + end + + it "should allow destructive operations" do + expect { @uri.normalize! }.not_to raise_error + end +end + +describe Addressable::URI, "when initialized from " + + "frozen individual components" do + before do + @uri = Addressable::URI.new( + :scheme => "http".freeze, + :user => "user".freeze, + :password => "password".freeze, + :host => "example.com".freeze, + :port => "8080".freeze, + :path => "/path".freeze, + :query => "query=value".freeze, + :fragment => "fragment".freeze + ) + end + + it "returns 'http' for #scheme" do + expect(@uri.scheme).to eq("http") + end + + it "returns 'http' for #normalized_scheme" do + expect(@uri.normalized_scheme).to eq("http") + end + + it "returns 'user' for #user" do + expect(@uri.user).to eq("user") + end + + it "returns 'user' for #normalized_user" do + expect(@uri.normalized_user).to eq("user") + end + + it "returns 'password' for #password" do + expect(@uri.password).to eq("password") + end + + it "returns 'password' for #normalized_password" do + expect(@uri.normalized_password).to eq("password") + end + + it "returns 'user:password' for #userinfo" do + expect(@uri.userinfo).to eq("user:password") + end + + it "returns 'user:password' for #normalized_userinfo" do + expect(@uri.normalized_userinfo).to eq("user:password") + end + + it "returns 'example.com' for #host" do + expect(@uri.host).to eq("example.com") + end + + it "returns 'example.com' for #normalized_host" do + expect(@uri.normalized_host).to eq("example.com") + end + + it "returns 'user:password@example.com:8080' for #authority" do + expect(@uri.authority).to eq("user:password@example.com:8080") + end + + it "returns 'user:password@example.com:8080' for #normalized_authority" do + expect(@uri.normalized_authority).to eq("user:password@example.com:8080") + end + + it "returns 8080 for #port" do + expect(@uri.port).to eq(8080) + end + + it "returns 8080 for #normalized_port" do + expect(@uri.normalized_port).to eq(8080) + end + + it "returns 80 for #default_port" do + expect(@uri.default_port).to eq(80) + end + + it "returns 'http://user:password@example.com:8080' for #site" do + expect(@uri.site).to eq("http://user:password@example.com:8080") + end + + it "returns 'http://user:password@example.com:8080' for #normalized_site" do + expect(@uri.normalized_site).to eq("http://user:password@example.com:8080") + end + + it "returns '/path' for #path" do + expect(@uri.path).to eq("/path") + end + + it "returns '/path' for #normalized_path" do + expect(@uri.normalized_path).to eq("/path") + end + + it "returns 'query=value' for #query" do + expect(@uri.query).to eq("query=value") + end + + it "returns 'query=value' for #normalized_query" do + expect(@uri.normalized_query).to eq("query=value") + end + + it "returns 'fragment' for #fragment" do + expect(@uri.fragment).to eq("fragment") + end + + it "returns 'fragment' for #normalized_fragment" do + expect(@uri.normalized_fragment).to eq("fragment") + end + + it "returns #hash" do + expect(@uri.hash).not_to be nil + end + + it "returns #to_s" do + expect(@uri.to_s).to eq( + "http://user:password@example.com:8080/path?query=value#fragment" + ) + end + + it "should not be empty" do + expect(@uri).not_to be_empty + end + + it "should not be frozen" do + expect(@uri).not_to be_frozen + end + + it "should allow destructive operations" do + expect { @uri.normalize! }.not_to raise_error + end +end + +describe Addressable::URI, "when parsed from a frozen string" do + before do + @uri = Addressable::URI.parse( + "http://user:password@example.com:8080/path?query=value#fragment".freeze + ) + end + + it "returns 'http' for #scheme" do + expect(@uri.scheme).to eq("http") + end + + it "returns 'http' for #normalized_scheme" do + expect(@uri.normalized_scheme).to eq("http") + end + + it "returns 'user' for #user" do + expect(@uri.user).to eq("user") + end + + it "returns 'user' for #normalized_user" do + expect(@uri.normalized_user).to eq("user") + end + + it "returns 'password' for #password" do + expect(@uri.password).to eq("password") + end + + it "returns 'password' for #normalized_password" do + expect(@uri.normalized_password).to eq("password") + end + + it "returns 'user:password' for #userinfo" do + expect(@uri.userinfo).to eq("user:password") + end + + it "returns 'user:password' for #normalized_userinfo" do + expect(@uri.normalized_userinfo).to eq("user:password") + end + + it "returns 'example.com' for #host" do + expect(@uri.host).to eq("example.com") + end + + it "returns 'example.com' for #normalized_host" do + expect(@uri.normalized_host).to eq("example.com") + end + + it "returns 'user:password@example.com:8080' for #authority" do + expect(@uri.authority).to eq("user:password@example.com:8080") + end + + it "returns 'user:password@example.com:8080' for #normalized_authority" do + expect(@uri.normalized_authority).to eq("user:password@example.com:8080") + end + + it "returns 8080 for #port" do + expect(@uri.port).to eq(8080) + end + + it "returns 8080 for #normalized_port" do + expect(@uri.normalized_port).to eq(8080) + end + + it "returns 80 for #default_port" do + expect(@uri.default_port).to eq(80) + end + + it "returns 'http://user:password@example.com:8080' for #site" do + expect(@uri.site).to eq("http://user:password@example.com:8080") + end + + it "returns 'http://user:password@example.com:8080' for #normalized_site" do + expect(@uri.normalized_site).to eq("http://user:password@example.com:8080") + end + + it "returns '/path' for #path" do + expect(@uri.path).to eq("/path") + end + + it "returns '/path' for #normalized_path" do + expect(@uri.normalized_path).to eq("/path") + end + + it "returns 'query=value' for #query" do + expect(@uri.query).to eq("query=value") + end + + it "returns 'query=value' for #normalized_query" do + expect(@uri.normalized_query).to eq("query=value") + end + + it "returns 'fragment' for #fragment" do + expect(@uri.fragment).to eq("fragment") + end + + it "returns 'fragment' for #normalized_fragment" do + expect(@uri.normalized_fragment).to eq("fragment") + end + + it "returns #hash" do + expect(@uri.hash).not_to be nil + end + + it "returns #to_s" do + expect(@uri.to_s).to eq( + "http://user:password@example.com:8080/path?query=value#fragment" + ) + end + + it "should not be empty" do + expect(@uri).not_to be_empty + end + + it "should not be frozen" do + expect(@uri).not_to be_frozen + end + + it "should allow destructive operations" do + expect { @uri.normalize! }.not_to raise_error + end +end + +describe Addressable::URI, "when frozen" do + before do + @uri = Addressable::URI.new.freeze + end + + it "returns nil for #scheme" do + expect(@uri.scheme).to eq(nil) + end + + it "returns nil for #normalized_scheme" do + expect(@uri.normalized_scheme).to eq(nil) + end + + it "returns nil for #user" do + expect(@uri.user).to eq(nil) + end + + it "returns nil for #normalized_user" do + expect(@uri.normalized_user).to eq(nil) + end + + it "returns nil for #password" do + expect(@uri.password).to eq(nil) + end + + it "returns nil for #normalized_password" do + expect(@uri.normalized_password).to eq(nil) + end + + it "returns nil for #userinfo" do + expect(@uri.userinfo).to eq(nil) + end + + it "returns nil for #normalized_userinfo" do + expect(@uri.normalized_userinfo).to eq(nil) + end + + it "returns nil for #host" do + expect(@uri.host).to eq(nil) + end + + it "returns nil for #normalized_host" do + expect(@uri.normalized_host).to eq(nil) + end + + it "returns nil for #authority" do + expect(@uri.authority).to eq(nil) + end + + it "returns nil for #normalized_authority" do + expect(@uri.normalized_authority).to eq(nil) + end + + it "returns nil for #port" do + expect(@uri.port).to eq(nil) + end + + it "returns nil for #normalized_port" do + expect(@uri.normalized_port).to eq(nil) + end + + it "returns nil for #default_port" do + expect(@uri.default_port).to eq(nil) + end + + it "returns nil for #site" do + expect(@uri.site).to eq(nil) + end + + it "returns nil for #normalized_site" do + expect(@uri.normalized_site).to eq(nil) + end + + it "returns '' for #path" do + expect(@uri.path).to eq('') + end + + it "returns '' for #normalized_path" do + expect(@uri.normalized_path).to eq('') + end + + it "returns nil for #query" do + expect(@uri.query).to eq(nil) + end + + it "returns nil for #normalized_query" do + expect(@uri.normalized_query).to eq(nil) + end + + it "returns nil for #fragment" do + expect(@uri.fragment).to eq(nil) + end + + it "returns nil for #normalized_fragment" do + expect(@uri.normalized_fragment).to eq(nil) + end + + it "returns #hash" do + expect(@uri.hash).not_to be nil + end + + it "returns #to_s" do + expect(@uri.to_s).to eq('') + end + + it "should be empty" do + expect(@uri).to be_empty + end + + it "should be frozen" do + expect(@uri).to be_frozen + end + + it "should not be frozen after duping" do + expect(@uri.dup).not_to be_frozen + end + + it "should not allow destructive operations" do + expect { @uri.normalize! }.to raise_error { |error| + expect(error.message).to match(/can't modify frozen/) + expect(error).to satisfy { |e| RuntimeError === e || TypeError === e } + } + end +end + +describe Addressable::URI, "when frozen" do + before do + @uri = Addressable::URI.parse( + "HTTP://example.com.:%38%30/%70a%74%68?a=%31#1%323" + ).freeze + end + + it "returns 'HTTP' for #scheme" do + expect(@uri.scheme).to eq("HTTP") + end + + it "returns 'http' for #normalized_scheme" do + expect(@uri.normalized_scheme).to eq("http") + expect(@uri.normalize.scheme).to eq("http") + end + + it "returns nil for #user" do + expect(@uri.user).to eq(nil) + end + + it "returns nil for #normalized_user" do + expect(@uri.normalized_user).to eq(nil) + end + + it "returns nil for #password" do + expect(@uri.password).to eq(nil) + end + + it "returns nil for #normalized_password" do + expect(@uri.normalized_password).to eq(nil) + end + + it "returns nil for #userinfo" do + expect(@uri.userinfo).to eq(nil) + end + + it "returns nil for #normalized_userinfo" do + expect(@uri.normalized_userinfo).to eq(nil) + end + + it "returns 'example.com.' for #host" do + expect(@uri.host).to eq("example.com.") + end + + it "returns nil for #normalized_host" do + expect(@uri.normalized_host).to eq("example.com") + expect(@uri.normalize.host).to eq("example.com") + end + + it "returns 'example.com.:80' for #authority" do + expect(@uri.authority).to eq("example.com.:80") + end + + it "returns 'example.com:80' for #normalized_authority" do + expect(@uri.normalized_authority).to eq("example.com") + expect(@uri.normalize.authority).to eq("example.com") + end + + it "returns 80 for #port" do + expect(@uri.port).to eq(80) + end + + it "returns nil for #normalized_port" do + expect(@uri.normalized_port).to eq(nil) + expect(@uri.normalize.port).to eq(nil) + end + + it "returns 80 for #default_port" do + expect(@uri.default_port).to eq(80) + end + + it "returns 'HTTP://example.com.:80' for #site" do + expect(@uri.site).to eq("HTTP://example.com.:80") + end + + it "returns 'http://example.com' for #normalized_site" do + expect(@uri.normalized_site).to eq("http://example.com") + expect(@uri.normalize.site).to eq("http://example.com") + end + + it "returns '/%70a%74%68' for #path" do + expect(@uri.path).to eq("/%70a%74%68") + end + + it "returns '/path' for #normalized_path" do + expect(@uri.normalized_path).to eq("/path") + expect(@uri.normalize.path).to eq("/path") + end + + it "returns 'a=%31' for #query" do + expect(@uri.query).to eq("a=%31") + end + + it "returns 'a=1' for #normalized_query" do + expect(@uri.normalized_query).to eq("a=1") + expect(@uri.normalize.query).to eq("a=1") + end + + it "returns '/%70a%74%68?a=%31' for #request_uri" do + expect(@uri.request_uri).to eq("/%70a%74%68?a=%31") + end + + it "returns '1%323' for #fragment" do + expect(@uri.fragment).to eq("1%323") + end + + it "returns '123' for #normalized_fragment" do + expect(@uri.normalized_fragment).to eq("123") + expect(@uri.normalize.fragment).to eq("123") + end + + it "returns #hash" do + expect(@uri.hash).not_to be nil + end + + it "returns #to_s" do + expect(@uri.to_s).to eq('HTTP://example.com.:80/%70a%74%68?a=%31#1%323') + expect(@uri.normalize.to_s).to eq('http://example.com/path?a=1#123') + end + + it "should not be empty" do + expect(@uri).not_to be_empty + end + + it "should be frozen" do + expect(@uri).to be_frozen + end + + it "should not be frozen after duping" do + expect(@uri.dup).not_to be_frozen + end + + it "should not allow destructive operations" do + expect { @uri.normalize! }.to raise_error { |error| + expect(error.message).to match(/can't modify frozen/) + expect(error).to satisfy { |e| RuntimeError === e || TypeError === e } + } + end +end + +describe Addressable::URI, "when created from string components" do + before do + @uri = Addressable::URI.new( + :scheme => "http", :host => "example.com" + ) + end + + it "should have a site value of 'http://example.com'" do + expect(@uri.site).to eq("http://example.com") + end + + it "should be equal to the equivalent parsed URI" do + expect(@uri).to eq(Addressable::URI.parse("http://example.com")) + end + + it "should raise an error if invalid components omitted" do + expect do + @uri.omit(:bogus) + end.to raise_error(ArgumentError) + expect do + @uri.omit(:scheme, :bogus, :path) + end.to raise_error(ArgumentError) + end +end + +describe Addressable::URI, "when created with a nil host but " + + "non-nil authority components" do + it "should raise an error" do + expect do + Addressable::URI.new(:user => "user", :password => "pass", :port => 80) + end.to raise_error(Addressable::URI::InvalidURIError) + end +end + +describe Addressable::URI, "when created with both an authority and a user" do + it "should raise an error" do + expect do + Addressable::URI.new( + :user => "user", :authority => "user@example.com:80" + ) + end.to raise_error(ArgumentError) + end +end + +describe Addressable::URI, "when created with an authority and no port" do + before do + @uri = Addressable::URI.new(:authority => "user@example.com") + end + + it "should not infer a port" do + expect(@uri.port).to eq(nil) + expect(@uri.default_port).to eq(nil) + expect(@uri.inferred_port).to eq(nil) + end + + it "should have a site value of '//user@example.com'" do + expect(@uri.site).to eq("//user@example.com") + end + + it "should have a 'null' origin" do + expect(@uri.origin).to eq('null') + end +end + +describe Addressable::URI, "when created with a host with trailing dots" do + before do + @uri = Addressable::URI.new(:authority => "example...") + end + + it "should have a stable normalized form" do + expect(@uri.normalize.normalize.normalize.host).to eq( + @uri.normalize.host + ) + end +end + +describe Addressable::URI, "when created with a host with a backslash" do + it "should raise an error" do + expect do + Addressable::URI.new(:authority => "example\\example") + end.to raise_error(Addressable::URI::InvalidURIError) + end +end + +describe Addressable::URI, "when created with a host with a slash" do + it "should raise an error" do + expect do + Addressable::URI.new(:authority => "example/example") + end.to raise_error(Addressable::URI::InvalidURIError) + end +end + +describe Addressable::URI, "when created with a host with a space" do + it "should raise an error" do + expect do + Addressable::URI.new(:authority => "example example") + end.to raise_error(Addressable::URI::InvalidURIError) + end +end + +describe Addressable::URI, "when created with both a userinfo and a user" do + it "should raise an error" do + expect do + Addressable::URI.new(:user => "user", :userinfo => "user:pass") + end.to raise_error(ArgumentError) + end +end + +describe Addressable::URI, "when created with a path that hasn't been " + + "prefixed with a '/' but a host specified" do + before do + @uri = Addressable::URI.new( + :scheme => "http", :host => "example.com", :path => "path" + ) + end + + it "should prefix a '/' to the path" do + expect(@uri).to eq(Addressable::URI.parse("http://example.com/path")) + end + + it "should have a site value of 'http://example.com'" do + expect(@uri.site).to eq("http://example.com") + end + + it "should have an origin of 'http://example.com" do + expect(@uri.origin).to eq('http://example.com') + end +end + +describe Addressable::URI, "when created with a path that hasn't been " + + "prefixed with a '/' but no host specified" do + before do + @uri = Addressable::URI.new( + :scheme => "http", :path => "path" + ) + end + + it "should not prefix a '/' to the path" do + expect(@uri).to eq(Addressable::URI.parse("http:path")) + end + + it "should have a site value of 'http:'" do + expect(@uri.site).to eq("http:") + end + + it "should have a 'null' origin" do + expect(@uri.origin).to eq('null') + end +end + +describe Addressable::URI, "when parsed from an Addressable::URI object" do + it "should not have unexpected side-effects" do + original_uri = Addressable::URI.parse("http://example.com/") + new_uri = Addressable::URI.parse(original_uri) + new_uri.host = 'www.example.com' + expect(new_uri.host).to eq('www.example.com') + expect(new_uri.to_s).to eq('http://www.example.com/') + expect(original_uri.host).to eq('example.com') + expect(original_uri.to_s).to eq('http://example.com/') + end + + it "should not have unexpected side-effects" do + original_uri = Addressable::URI.parse("http://example.com/") + new_uri = Addressable::URI.heuristic_parse(original_uri) + new_uri.host = 'www.example.com' + expect(new_uri.host).to eq('www.example.com') + expect(new_uri.to_s).to eq('http://www.example.com/') + expect(original_uri.host).to eq('example.com') + expect(original_uri.to_s).to eq('http://example.com/') + end + + it "should not have unexpected side-effects" do + original_uri = Addressable::URI.parse("http://example.com/") + new_uri = Addressable::URI.parse(original_uri) + new_uri.origin = 'https://www.example.com:8080' + expect(new_uri.host).to eq('www.example.com') + expect(new_uri.to_s).to eq('https://www.example.com:8080/') + expect(original_uri.host).to eq('example.com') + expect(original_uri.to_s).to eq('http://example.com/') + end + + it "should not have unexpected side-effects" do + original_uri = Addressable::URI.parse("http://example.com/") + new_uri = Addressable::URI.heuristic_parse(original_uri) + new_uri.origin = 'https://www.example.com:8080' + expect(new_uri.host).to eq('www.example.com') + expect(new_uri.to_s).to eq('https://www.example.com:8080/') + expect(original_uri.host).to eq('example.com') + expect(original_uri.to_s).to eq('http://example.com/') + end +end + +describe Addressable::URI, "when parsed from something that looks " + + "like a URI object" do + it "should parse without error" do + uri = Addressable::URI.parse(Fake::URI::HTTP.new("http://example.com/")) + expect do + Addressable::URI.parse(uri) + end.not_to raise_error + end +end + +describe Addressable::URI, "when parsed from a standard library URI object" do + it "should parse without error" do + uri = Addressable::URI.parse(URI.parse("http://example.com/")) + expect do + Addressable::URI.parse(uri) + end.not_to raise_error + end +end + +describe Addressable::URI, "when parsed from ''" do + before do + @uri = Addressable::URI.parse("") + end + + it "should have no scheme" do + expect(@uri.scheme).to eq(nil) + end + + it "should not be considered to be ip-based" do + expect(@uri).not_to be_ip_based + end + + it "should have a path of ''" do + expect(@uri.path).to eq("") + end + + it "should have a request URI of '/'" do + expect(@uri.request_uri).to eq("/") + end + + it "should be considered relative" do + expect(@uri).to be_relative + end + + it "should be considered to be in normal form" do + expect(@uri.normalize).to be_eql(@uri) + end + + it "should have a 'null' origin" do + expect(@uri.origin).to eq('null') + end +end + +# Section 1.1.2 of RFC 3986 +describe Addressable::URI, "when parsed from " + + "'ftp://ftp.is.co.za/rfc/rfc1808.txt'" do + before do + @uri = Addressable::URI.parse("ftp://ftp.is.co.za/rfc/rfc1808.txt") + end + + it "should use the 'ftp' scheme" do + expect(@uri.scheme).to eq("ftp") + end + + it "should be considered to be ip-based" do + expect(@uri).to be_ip_based + end + + it "should have a host of 'ftp.is.co.za'" do + expect(@uri.host).to eq("ftp.is.co.za") + end + + it "should have inferred_port of 21" do + expect(@uri.inferred_port).to eq(21) + end + + it "should have a path of '/rfc/rfc1808.txt'" do + expect(@uri.path).to eq("/rfc/rfc1808.txt") + end + + it "should not have a request URI" do + expect(@uri.request_uri).to eq(nil) + end + + it "should be considered to be in normal form" do + expect(@uri.normalize).to be_eql(@uri) + end + + it "should have an origin of 'ftp://ftp.is.co.za'" do + expect(@uri.origin).to eq('ftp://ftp.is.co.za') + end +end + +# Section 1.1.2 of RFC 3986 +describe Addressable::URI, "when parsed from " + + "'http://www.ietf.org/rfc/rfc2396.txt'" do + before do + @uri = Addressable::URI.parse("http://www.ietf.org/rfc/rfc2396.txt") + end + + it "should use the 'http' scheme" do + expect(@uri.scheme).to eq("http") + end + + it "should be considered to be ip-based" do + expect(@uri).to be_ip_based + end + + it "should have a host of 'www.ietf.org'" do + expect(@uri.host).to eq("www.ietf.org") + end + + it "should have inferred_port of 80" do + expect(@uri.inferred_port).to eq(80) + end + + it "should have a path of '/rfc/rfc2396.txt'" do + expect(@uri.path).to eq("/rfc/rfc2396.txt") + end + + it "should have a request URI of '/rfc/rfc2396.txt'" do + expect(@uri.request_uri).to eq("/rfc/rfc2396.txt") + end + + it "should be considered to be in normal form" do + expect(@uri.normalize).to be_eql(@uri) + end + + it "should correctly omit components" do + expect(@uri.omit(:scheme).to_s).to eq("//www.ietf.org/rfc/rfc2396.txt") + expect(@uri.omit(:path).to_s).to eq("http://www.ietf.org") + end + + it "should correctly omit components destructively" do + @uri.omit!(:scheme) + expect(@uri.to_s).to eq("//www.ietf.org/rfc/rfc2396.txt") + end + + it "should have an origin of 'http://www.ietf.org'" do + expect(@uri.origin).to eq('http://www.ietf.org') + end +end + +# Section 1.1.2 of RFC 3986 +describe Addressable::URI, "when parsed from " + + "'ldap://[2001:db8::7]/c=GB?objectClass?one'" do + before do + @uri = Addressable::URI.parse("ldap://[2001:db8::7]/c=GB?objectClass?one") + end + + it "should use the 'ldap' scheme" do + expect(@uri.scheme).to eq("ldap") + end + + it "should be considered to be ip-based" do + expect(@uri).to be_ip_based + end + + it "should have a host of '[2001:db8::7]'" do + expect(@uri.host).to eq("[2001:db8::7]") + end + + it "should have inferred_port of 389" do + expect(@uri.inferred_port).to eq(389) + end + + it "should have a path of '/c=GB'" do + expect(@uri.path).to eq("/c=GB") + end + + it "should not have a request URI" do + expect(@uri.request_uri).to eq(nil) + end + + it "should not allow request URI assignment" do + expect do + @uri.request_uri = "/" + end.to raise_error(Addressable::URI::InvalidURIError) + end + + it "should have a query of 'objectClass?one'" do + expect(@uri.query).to eq("objectClass?one") + end + + it "should be considered to be in normal form" do + expect(@uri.normalize).to be_eql(@uri) + end + + it "should correctly omit components" do + expect(@uri.omit(:scheme, :authority).to_s).to eq("/c=GB?objectClass?one") + expect(@uri.omit(:path).to_s).to eq("ldap://[2001:db8::7]?objectClass?one") + end + + it "should correctly omit components destructively" do + @uri.omit!(:scheme, :authority) + expect(@uri.to_s).to eq("/c=GB?objectClass?one") + end + + it "should raise an error if omission would create an invalid URI" do + expect do + @uri.omit(:authority, :path) + end.to raise_error(Addressable::URI::InvalidURIError) + end + + it "should have an origin of 'ldap://[2001:db8::7]'" do + expect(@uri.origin).to eq('ldap://[2001:db8::7]') + end +end + +# Section 1.1.2 of RFC 3986 +describe Addressable::URI, "when parsed from " + + "'mailto:John.Doe@example.com'" do + before do + @uri = Addressable::URI.parse("mailto:John.Doe@example.com") + end + + it "should use the 'mailto' scheme" do + expect(@uri.scheme).to eq("mailto") + end + + it "should not be considered to be ip-based" do + expect(@uri).not_to be_ip_based + end + + it "should not have an inferred_port" do + expect(@uri.inferred_port).to eq(nil) + end + + it "should have a path of 'John.Doe@example.com'" do + expect(@uri.path).to eq("John.Doe@example.com") + end + + it "should not have a request URI" do + expect(@uri.request_uri).to eq(nil) + end + + it "should be considered to be in normal form" do + expect(@uri.normalize).to be_eql(@uri) + end + + it "should have a 'null' origin" do + expect(@uri.origin).to eq('null') + end +end + +# Section 2 of RFC 6068 +describe Addressable::URI, "when parsed from " + + "'mailto:?to=addr1@an.example,addr2@an.example'" do + before do + @uri = Addressable::URI.parse( + "mailto:?to=addr1@an.example,addr2@an.example" + ) + end + + it "should use the 'mailto' scheme" do + expect(@uri.scheme).to eq("mailto") + end + + it "should not be considered to be ip-based" do + expect(@uri).not_to be_ip_based + end + + it "should not have an inferred_port" do + expect(@uri.inferred_port).to eq(nil) + end + + it "should have a path of ''" do + expect(@uri.path).to eq("") + end + + it "should not have a request URI" do + expect(@uri.request_uri).to eq(nil) + end + + it "should have the To: field value parameterized" do + expect(@uri.query_values(Hash)["to"]).to eq( + "addr1@an.example,addr2@an.example" + ) + end + + it "should be considered to be in normal form" do + expect(@uri.normalize).to be_eql(@uri) + end + + it "should have a 'null' origin" do + expect(@uri.origin).to eq('null') + end +end + +# Section 1.1.2 of RFC 3986 +describe Addressable::URI, "when parsed from " + + "'news:comp.infosystems.www.servers.unix'" do + before do + @uri = Addressable::URI.parse("news:comp.infosystems.www.servers.unix") + end + + it "should use the 'news' scheme" do + expect(@uri.scheme).to eq("news") + end + + it "should not have an inferred_port" do + expect(@uri.inferred_port).to eq(nil) + end + + it "should not be considered to be ip-based" do + expect(@uri).not_to be_ip_based + end + + it "should have a path of 'comp.infosystems.www.servers.unix'" do + expect(@uri.path).to eq("comp.infosystems.www.servers.unix") + end + + it "should not have a request URI" do + expect(@uri.request_uri).to eq(nil) + end + + it "should be considered to be in normal form" do + expect(@uri.normalize).to be_eql(@uri) + end + + it "should have a 'null' origin" do + expect(@uri.origin).to eq('null') + end +end + +# Section 1.1.2 of RFC 3986 +describe Addressable::URI, "when parsed from " + + "'tel:+1-816-555-1212'" do + before do + @uri = Addressable::URI.parse("tel:+1-816-555-1212") + end + + it "should use the 'tel' scheme" do + expect(@uri.scheme).to eq("tel") + end + + it "should not be considered to be ip-based" do + expect(@uri).not_to be_ip_based + end + + it "should not have an inferred_port" do + expect(@uri.inferred_port).to eq(nil) + end + + it "should have a path of '+1-816-555-1212'" do + expect(@uri.path).to eq("+1-816-555-1212") + end + + it "should not have a request URI" do + expect(@uri.request_uri).to eq(nil) + end + + it "should be considered to be in normal form" do + expect(@uri.normalize).to be_eql(@uri) + end + + it "should have a 'null' origin" do + expect(@uri.origin).to eq('null') + end +end + +# Section 1.1.2 of RFC 3986 +describe Addressable::URI, "when parsed from " + + "'telnet://192.0.2.16:80/'" do + before do + @uri = Addressable::URI.parse("telnet://192.0.2.16:80/") + end + + it "should use the 'telnet' scheme" do + expect(@uri.scheme).to eq("telnet") + end + + it "should have a host of '192.0.2.16'" do + expect(@uri.host).to eq("192.0.2.16") + end + + it "should have a port of 80" do + expect(@uri.port).to eq(80) + end + + it "should have a inferred_port of 80" do + expect(@uri.inferred_port).to eq(80) + end + + it "should have a default_port of 23" do + expect(@uri.default_port).to eq(23) + end + + it "should be considered to be ip-based" do + expect(@uri).to be_ip_based + end + + it "should have a path of '/'" do + expect(@uri.path).to eq("/") + end + + it "should not have a request URI" do + expect(@uri.request_uri).to eq(nil) + end + + it "should be considered to be in normal form" do + expect(@uri.normalize).to be_eql(@uri) + end + + it "should have an origin of 'telnet://192.0.2.16:80'" do + expect(@uri.origin).to eq('telnet://192.0.2.16:80') + end +end + +# Section 1.1.2 of RFC 3986 +describe Addressable::URI, "when parsed from " + + "'urn:oasis:names:specification:docbook:dtd:xml:4.1.2'" do + before do + @uri = Addressable::URI.parse( + "urn:oasis:names:specification:docbook:dtd:xml:4.1.2") + end + + it "should use the 'urn' scheme" do + expect(@uri.scheme).to eq("urn") + end + + it "should not have an inferred_port" do + expect(@uri.inferred_port).to eq(nil) + end + + it "should not be considered to be ip-based" do + expect(@uri).not_to be_ip_based + end + + it "should have a path of " + + "'oasis:names:specification:docbook:dtd:xml:4.1.2'" do + expect(@uri.path).to eq("oasis:names:specification:docbook:dtd:xml:4.1.2") + end + + it "should not have a request URI" do + expect(@uri.request_uri).to eq(nil) + end + + it "should be considered to be in normal form" do + expect(@uri.normalize).to be_eql(@uri) + end + + it "should have a 'null' origin" do + expect(@uri.origin).to eq('null') + end +end + +describe Addressable::URI, "when heuristically parsed from " + + "'192.0.2.16:8000/path'" do + before do + @uri = Addressable::URI.heuristic_parse("192.0.2.16:8000/path") + end + + it "should use the 'http' scheme" do + expect(@uri.scheme).to eq("http") + end + + it "should have a host of '192.0.2.16'" do + expect(@uri.host).to eq("192.0.2.16") + end + + it "should have a port of '8000'" do + expect(@uri.port).to eq(8000) + end + + it "should be considered to be ip-based" do + expect(@uri).to be_ip_based + end + + it "should have a path of '/path'" do + expect(@uri.path).to eq("/path") + end + + it "should be considered to be in normal form" do + expect(@uri.normalize).to be_eql(@uri) + end + + it "should have an origin of 'http://192.0.2.16:8000'" do + expect(@uri.origin).to eq('http://192.0.2.16:8000') + end +end + +describe Addressable::URI, "when parsed from " + + "'http://example.com'" do + before do + @uri = Addressable::URI.parse("http://example.com") + end + + it "when inspected, should have the correct URI" do + expect(@uri.inspect).to include("http://example.com") + end + + it "when inspected, should have the correct class name" do + expect(@uri.inspect).to include("Addressable::URI") + end + + it "when inspected, should have the correct object id" do + expect(@uri.inspect).to include("%#0x" % @uri.object_id) + end + + it "should use the 'http' scheme" do + expect(@uri.scheme).to eq("http") + end + + it "should be considered to be ip-based" do + expect(@uri).to be_ip_based + end + + it "should have an authority segment of 'example.com'" do + expect(@uri.authority).to eq("example.com") + end + + it "should have a host of 'example.com'" do + expect(@uri.host).to eq("example.com") + end + + it "should be considered ip-based" do + expect(@uri).to be_ip_based + end + + it "should have no username" do + expect(@uri.user).to eq(nil) + end + + it "should have no password" do + expect(@uri.password).to eq(nil) + end + + it "should use port 80" do + expect(@uri.inferred_port).to eq(80) + end + + it "should not have a specified port" do + expect(@uri.port).to eq(nil) + end + + it "should have an empty path" do + expect(@uri.path).to eq("") + end + + it "should have no query string" do + expect(@uri.query).to eq(nil) + expect(@uri.query_values).to eq(nil) + end + + it "should have a request URI of '/'" do + expect(@uri.request_uri).to eq("/") + end + + it "should have no fragment" do + expect(@uri.fragment).to eq(nil) + end + + it "should be considered absolute" do + expect(@uri).to be_absolute + end + + it "should not be considered relative" do + expect(@uri).not_to be_relative + end + + it "should not be exactly equal to 42" do + expect(@uri.eql?(42)).to eq(false) + end + + it "should not be equal to 42" do + expect(@uri == 42).to eq(false) + end + + it "should not be roughly equal to 42" do + expect(@uri === 42).to eq(false) + end + + it "should be exactly equal to http://example.com" do + expect(@uri.eql?(Addressable::URI.parse("http://example.com"))).to eq(true) + end + + it "should be roughly equal to http://example.com/" do + expect(@uri === Addressable::URI.parse("http://example.com/")).to eq(true) + end + + it "should be roughly equal to the string 'http://example.com/'" do + expect(@uri === "http://example.com/").to eq(true) + end + + it "should not be roughly equal to the string " + + "'http://example.com:bogus/'" do + expect do + expect(@uri === "http://example.com:bogus/").to eq(false) + end.not_to raise_error + end + + it "should result in itself when joined with itself" do + expect(@uri.join(@uri).to_s).to eq("http://example.com") + expect(@uri.join!(@uri).to_s).to eq("http://example.com") + end + + it "should be equivalent to http://EXAMPLE.com" do + expect(@uri).to eq(Addressable::URI.parse("http://EXAMPLE.com")) + end + + it "should be equivalent to http://EXAMPLE.com:80/" do + expect(@uri).to eq(Addressable::URI.parse("http://EXAMPLE.com:80/")) + end + + it "should have the same hash as http://example.com" do + expect(@uri.hash).to eq(Addressable::URI.parse("http://example.com").hash) + end + + it "should have the same hash as http://EXAMPLE.com after assignment" do + @uri.origin = "http://EXAMPLE.com" + expect(@uri.hash).to eq(Addressable::URI.parse("http://EXAMPLE.com").hash) + end + + it "should have a different hash from http://EXAMPLE.com" do + expect(@uri.hash).not_to eq(Addressable::URI.parse("http://EXAMPLE.com").hash) + end + + it "should not allow origin assignment without scheme" do + expect do + @uri.origin = "example.com" + end.to raise_error(Addressable::URI::InvalidURIError) + end + + it "should not allow origin assignment without host" do + expect do + @uri.origin = "http://" + end.to raise_error(Addressable::URI::InvalidURIError) + end + + it "should not allow origin assignment with bogus type" do + expect do + @uri.origin = :bogus + end.to raise_error(TypeError) + end + + # Section 6.2.3 of RFC 3986 + it "should be equivalent to http://example.com/" do + expect(@uri).to eq(Addressable::URI.parse("http://example.com/")) + end + + # Section 6.2.3 of RFC 3986 + it "should be equivalent to http://example.com:/" do + expect(@uri).to eq(Addressable::URI.parse("http://example.com:/")) + end + + # Section 6.2.3 of RFC 3986 + it "should be equivalent to http://example.com:80/" do + expect(@uri).to eq(Addressable::URI.parse("http://example.com:80/")) + end + + # Section 6.2.2.1 of RFC 3986 + it "should be equivalent to http://EXAMPLE.COM/" do + expect(@uri).to eq(Addressable::URI.parse("http://EXAMPLE.COM/")) + end + + it "should have a route of '/path/' to 'http://example.com/path/'" do + expect(@uri.route_to("http://example.com/path/")).to eq( + Addressable::URI.parse("/path/") + ) + end + + it "should have a route of '..' from 'http://example.com/path/'" do + expect(@uri.route_from("http://example.com/path/")).to eq( + Addressable::URI.parse("..") + ) + end + + it "should have a route of '#' to 'http://example.com/'" do + expect(@uri.route_to("http://example.com/")).to eq( + Addressable::URI.parse("#") + ) + end + + it "should have a route of 'http://elsewhere.com/' to " + + "'http://elsewhere.com/'" do + expect(@uri.route_to("http://elsewhere.com/")).to eq( + Addressable::URI.parse("http://elsewhere.com/") + ) + end + + it "when joined with 'relative/path' should be " + + "'http://example.com/relative/path'" do + expect(@uri.join('relative/path')).to eq( + Addressable::URI.parse("http://example.com/relative/path") + ) + end + + it "when joined with a bogus object a TypeError should be raised" do + expect do + @uri.join(42) + end.to raise_error(TypeError) + end + + it "should have the correct username after assignment" do + @uri.user = "newuser" + expect(@uri.user).to eq("newuser") + expect(@uri.password).to eq(nil) + expect(@uri.to_s).to eq("http://newuser@example.com") + end + + it "should have the correct username after assignment" do + @uri.user = "user@123!" + expect(@uri.user).to eq("user@123!") + expect(@uri.normalized_user).to eq("user%40123%21") + expect(@uri.password).to eq(nil) + expect(@uri.normalize.to_s).to eq("http://user%40123%21@example.com/") + end + + it "should have the correct password after assignment" do + @uri.password = "newpass" + expect(@uri.password).to eq("newpass") + expect(@uri.user).to eq("") + expect(@uri.to_s).to eq("http://:newpass@example.com") + end + + it "should have the correct password after assignment" do + @uri.password = "#secret@123!" + expect(@uri.password).to eq("#secret@123!") + expect(@uri.normalized_password).to eq("%23secret%40123%21") + expect(@uri.user).to eq("") + expect(@uri.normalize.to_s).to eq("http://:%23secret%40123%21@example.com/") + expect(@uri.omit(:password).to_s).to eq("http://example.com") + end + + it "should have the correct user/pass after repeated assignment" do + @uri.user = nil + expect(@uri.user).to eq(nil) + @uri.password = "newpass" + expect(@uri.password).to eq("newpass") + # Username cannot be nil if the password is set + expect(@uri.user).to eq("") + expect(@uri.to_s).to eq("http://:newpass@example.com") + @uri.user = "newuser" + expect(@uri.user).to eq("newuser") + @uri.password = nil + expect(@uri.password).to eq(nil) + expect(@uri.to_s).to eq("http://newuser@example.com") + @uri.user = "newuser" + expect(@uri.user).to eq("newuser") + @uri.password = "" + expect(@uri.password).to eq("") + expect(@uri.to_s).to eq("http://newuser:@example.com") + @uri.password = "newpass" + expect(@uri.password).to eq("newpass") + @uri.user = nil + # Username cannot be nil if the password is set + expect(@uri.user).to eq("") + expect(@uri.to_s).to eq("http://:newpass@example.com") + end + + it "should have the correct user/pass after userinfo assignment" do + @uri.user = "newuser" + expect(@uri.user).to eq("newuser") + @uri.password = "newpass" + expect(@uri.password).to eq("newpass") + @uri.userinfo = nil + expect(@uri.userinfo).to eq(nil) + expect(@uri.user).to eq(nil) + expect(@uri.password).to eq(nil) + end + + it "should correctly convert to a hash" do + expect(@uri.to_hash).to eq({ + :scheme => "http", + :user => nil, + :password => nil, + :host => "example.com", + :port => nil, + :path => "", + :query => nil, + :fragment => nil + }) + end + + it "should be identical to its duplicate" do + expect(@uri).to eq(@uri.dup) + end + + it "should have an origin of 'http://example.com'" do + expect(@uri.origin).to eq('http://example.com') + end +end + +# Section 5.1.2 of RFC 2616 +describe Addressable::URI, "when parsed from " + + "'HTTP://www.w3.org/pub/WWW/TheProject.html'" do + before do + @uri = Addressable::URI.parse("HTTP://www.w3.org/pub/WWW/TheProject.html") + end + + it "should have the correct request URI" do + expect(@uri.request_uri).to eq("/pub/WWW/TheProject.html") + end + + it "should have the correct request URI after assignment" do + @uri.request_uri = "/pub/WWW/TheProject.html?" + expect(@uri.request_uri).to eq("/pub/WWW/TheProject.html?") + expect(@uri.path).to eq("/pub/WWW/TheProject.html") + expect(@uri.query).to eq("") + end + + it "should have the correct request URI after assignment" do + @uri.request_uri = "/some/where/else.html" + expect(@uri.request_uri).to eq("/some/where/else.html") + expect(@uri.path).to eq("/some/where/else.html") + expect(@uri.query).to eq(nil) + end + + it "should have the correct request URI after assignment" do + @uri.request_uri = "/some/where/else.html?query?string" + expect(@uri.request_uri).to eq("/some/where/else.html?query?string") + expect(@uri.path).to eq("/some/where/else.html") + expect(@uri.query).to eq("query?string") + end + + it "should have the correct request URI after assignment" do + @uri.request_uri = "?x=y" + expect(@uri.request_uri).to eq("/?x=y") + expect(@uri.path).to eq("/") + expect(@uri.query).to eq("x=y") + end + + it "should raise an error if the site value is set to something bogus" do + expect do + @uri.site = 42 + end.to raise_error(TypeError) + end + + it "should raise an error if the request URI is set to something bogus" do + expect do + @uri.request_uri = 42 + end.to raise_error(TypeError) + end + + it "should correctly convert to a hash" do + expect(@uri.to_hash).to eq({ + :scheme => "HTTP", + :user => nil, + :password => nil, + :host => "www.w3.org", + :port => nil, + :path => "/pub/WWW/TheProject.html", + :query => nil, + :fragment => nil + }) + end + + it "should have an origin of 'http://www.w3.org'" do + expect(@uri.origin).to eq('http://www.w3.org') + end +end + +describe Addressable::URI, "when parsing IPv6 addresses" do + it "should not raise an error for " + + "'http://[3ffe:1900:4545:3:200:f8ff:fe21:67cf]/'" do + Addressable::URI.parse("http://[3ffe:1900:4545:3:200:f8ff:fe21:67cf]/") + end + + it "should not raise an error for " + + "'http://[fe80:0:0:0:200:f8ff:fe21:67cf]/'" do + Addressable::URI.parse("http://[fe80:0:0:0:200:f8ff:fe21:67cf]/") + end + + it "should not raise an error for " + + "'http://[fe80::200:f8ff:fe21:67cf]/'" do + Addressable::URI.parse("http://[fe80::200:f8ff:fe21:67cf]/") + end + + it "should not raise an error for " + + "'http://[::1]/'" do + Addressable::URI.parse("http://[::1]/") + end + + it "should not raise an error for " + + "'http://[fe80::1]/'" do + Addressable::URI.parse("http://[fe80::1]/") + end + + it "should raise an error for " + + "'http://[]/'" do + expect do + Addressable::URI.parse("http://[]/") + end.to raise_error(Addressable::URI::InvalidURIError) + end +end + +describe Addressable::URI, "when parsing IPv6 address" do + subject { Addressable::URI.parse("http://[3ffe:1900:4545:3:200:f8ff:fe21:67cf]/") } + its(:host) { should == '[3ffe:1900:4545:3:200:f8ff:fe21:67cf]' } + its(:hostname) { should == '3ffe:1900:4545:3:200:f8ff:fe21:67cf' } +end + +describe Addressable::URI, "when assigning IPv6 address" do + it "should allow to set bare IPv6 address as hostname" do + uri = Addressable::URI.parse("http://[::1]/") + uri.hostname = '3ffe:1900:4545:3:200:f8ff:fe21:67cf' + expect(uri.to_s).to eq('http://[3ffe:1900:4545:3:200:f8ff:fe21:67cf]/') + end + + it "should allow to set bare IPv6 address as hostname with IPAddr object" do + uri = Addressable::URI.parse("http://[::1]/") + uri.hostname = IPAddr.new('3ffe:1900:4545:3:200:f8ff:fe21:67cf') + expect(uri.to_s).to eq('http://[3ffe:1900:4545:3:200:f8ff:fe21:67cf]/') + end + + it "should not allow to set bare IPv6 address as host" do + uri = Addressable::URI.parse("http://[::1]/") + skip "not checked" + expect do + uri.host = '3ffe:1900:4545:3:200:f8ff:fe21:67cf' + end.to raise_error(Addressable::URI::InvalidURIError) + end +end + +describe Addressable::URI, "when parsing IPvFuture addresses" do + it "should not raise an error for " + + "'http://[v9.3ffe:1900:4545:3:200:f8ff:fe21:67cf]/'" do + Addressable::URI.parse("http://[v9.3ffe:1900:4545:3:200:f8ff:fe21:67cf]/") + end + + it "should not raise an error for " + + "'http://[vff.fe80:0:0:0:200:f8ff:fe21:67cf]/'" do + Addressable::URI.parse("http://[vff.fe80:0:0:0:200:f8ff:fe21:67cf]/") + end + + it "should not raise an error for " + + "'http://[v12.fe80::200:f8ff:fe21:67cf]/'" do + Addressable::URI.parse("http://[v12.fe80::200:f8ff:fe21:67cf]/") + end + + it "should not raise an error for " + + "'http://[va0.::1]/'" do + Addressable::URI.parse("http://[va0.::1]/") + end + + it "should not raise an error for " + + "'http://[v255.fe80::1]/'" do + Addressable::URI.parse("http://[v255.fe80::1]/") + end + + it "should raise an error for " + + "'http://[v0.]/'" do + expect do + Addressable::URI.parse("http://[v0.]/") + end.to raise_error(Addressable::URI::InvalidURIError) + end +end + +describe Addressable::URI, "when parsed from " + + "'http://example.com/'" do + before do + @uri = Addressable::URI.parse("http://example.com/") + end + + # Based on http://intertwingly.net/blog/2004/07/31/URI-Equivalence + it "should be equivalent to http://example.com" do + expect(@uri).to eq(Addressable::URI.parse("http://example.com")) + end + + # Based on http://intertwingly.net/blog/2004/07/31/URI-Equivalence + it "should be equivalent to HTTP://example.com/" do + expect(@uri).to eq(Addressable::URI.parse("HTTP://example.com/")) + end + + # Based on http://intertwingly.net/blog/2004/07/31/URI-Equivalence + it "should be equivalent to http://example.com:/" do + expect(@uri).to eq(Addressable::URI.parse("http://example.com:/")) + end + + # Based on http://intertwingly.net/blog/2004/07/31/URI-Equivalence + it "should be equivalent to http://example.com:80/" do + expect(@uri).to eq(Addressable::URI.parse("http://example.com:80/")) + end + + # Based on http://intertwingly.net/blog/2004/07/31/URI-Equivalence + it "should be equivalent to http://Example.com/" do + expect(@uri).to eq(Addressable::URI.parse("http://Example.com/")) + end + + it "should have the correct username after assignment" do + @uri.user = nil + expect(@uri.user).to eq(nil) + expect(@uri.password).to eq(nil) + expect(@uri.to_s).to eq("http://example.com/") + end + + it "should have the correct password after assignment" do + @uri.password = nil + expect(@uri.password).to eq(nil) + expect(@uri.user).to eq(nil) + expect(@uri.to_s).to eq("http://example.com/") + end + + it "should have a request URI of '/'" do + expect(@uri.request_uri).to eq("/") + end + + it "should correctly convert to a hash" do + expect(@uri.to_hash).to eq({ + :scheme => "http", + :user => nil, + :password => nil, + :host => "example.com", + :port => nil, + :path => "/", + :query => nil, + :fragment => nil + }) + end + + it "should be identical to its duplicate" do + expect(@uri).to eq(@uri.dup) + end + + it "should have the same hash as its duplicate" do + expect(@uri.hash).to eq(@uri.dup.hash) + end + + it "should have a different hash from its equivalent String value" do + expect(@uri.hash).not_to eq(@uri.to_s.hash) + end + + it "should have the same hash as an equal URI" do + expect(@uri.hash).to eq(Addressable::URI.parse("http://example.com/").hash) + end + + it "should be equivalent to http://EXAMPLE.com" do + expect(@uri).to eq(Addressable::URI.parse("http://EXAMPLE.com")) + end + + it "should be equivalent to http://EXAMPLE.com:80/" do + expect(@uri).to eq(Addressable::URI.parse("http://EXAMPLE.com:80/")) + end + + it "should have the same hash as http://example.com/" do + expect(@uri.hash).to eq(Addressable::URI.parse("http://example.com/").hash) + end + + it "should have the same hash as http://example.com after assignment" do + @uri.path = "" + expect(@uri.hash).to eq(Addressable::URI.parse("http://example.com").hash) + end + + it "should have the same hash as http://example.com/? after assignment" do + @uri.query = "" + expect(@uri.hash).to eq(Addressable::URI.parse("http://example.com/?").hash) + end + + it "should have the same hash as http://example.com/? after assignment" do + @uri.query_values = {} + expect(@uri.hash).to eq(Addressable::URI.parse("http://example.com/?").hash) + end + + it "should have the same hash as http://example.com/# after assignment" do + @uri.fragment = "" + expect(@uri.hash).to eq(Addressable::URI.parse("http://example.com/#").hash) + end + + it "should have a different hash from http://example.com" do + expect(@uri.hash).not_to eq(Addressable::URI.parse("http://example.com").hash) + end + + it "should have an origin of 'http://example.com'" do + expect(@uri.origin).to eq('http://example.com') + end +end + +describe Addressable::URI, "when parsed from " + + "'http://example.com?#'" do + before do + @uri = Addressable::URI.parse("http://example.com?#") + end + + it "should correctly convert to a hash" do + expect(@uri.to_hash).to eq({ + :scheme => "http", + :user => nil, + :password => nil, + :host => "example.com", + :port => nil, + :path => "", + :query => "", + :fragment => "" + }) + end + + it "should have a request URI of '/?'" do + expect(@uri.request_uri).to eq("/?") + end + + it "should normalize to 'http://example.com/'" do + expect(@uri.normalize.to_s).to eq("http://example.com/") + end + + it "should have an origin of 'http://example.com'" do + expect(@uri.origin).to eq("http://example.com") + end +end + +describe Addressable::URI, "when parsed from " + + "'http://@example.com/'" do + before do + @uri = Addressable::URI.parse("http://@example.com/") + end + + it "should be equivalent to http://example.com" do + expect(@uri).to eq(Addressable::URI.parse("http://example.com")) + end + + it "should correctly convert to a hash" do + expect(@uri.to_hash).to eq({ + :scheme => "http", + :user => "", + :password => nil, + :host => "example.com", + :port => nil, + :path => "/", + :query => nil, + :fragment => nil + }) + end + + it "should be identical to its duplicate" do + expect(@uri).to eq(@uri.dup) + end + + it "should have an origin of 'http://example.com'" do + expect(@uri.origin).to eq('http://example.com') + end +end + +describe Addressable::URI, "when parsed from " + + "'http://example.com./'" do + before do + @uri = Addressable::URI.parse("http://example.com./") + end + + it "should be equivalent to http://example.com" do + expect(@uri).to eq(Addressable::URI.parse("http://example.com")) + end + + it "should not be considered to be in normal form" do + expect(@uri.normalize).not_to be_eql(@uri) + end + + it "should be identical to its duplicate" do + expect(@uri).to eq(@uri.dup) + end + + it "should have an origin of 'http://example.com'" do + expect(@uri.origin).to eq('http://example.com') + end +end + +describe Addressable::URI, "when parsed from " + + "'http://:@example.com/'" do + before do + @uri = Addressable::URI.parse("http://:@example.com/") + end + + it "should be equivalent to http://example.com" do + expect(@uri).to eq(Addressable::URI.parse("http://example.com")) + end + + it "should correctly convert to a hash" do + expect(@uri.to_hash).to eq({ + :scheme => "http", + :user => "", + :password => "", + :host => "example.com", + :port => nil, + :path => "/", + :query => nil, + :fragment => nil + }) + end + + it "should be identical to its duplicate" do + expect(@uri).to eq(@uri.dup) + end + + it "should have an origin of 'http://example.com'" do + expect(@uri.origin).to eq('http://example.com') + end +end + +describe Addressable::URI, "when parsed from " + + "'HTTP://EXAMPLE.COM/'" do + before do + @uri = Addressable::URI.parse("HTTP://EXAMPLE.COM/") + end + + it "should be equivalent to http://example.com" do + expect(@uri).to eq(Addressable::URI.parse("http://example.com")) + end + + it "should correctly convert to a hash" do + expect(@uri.to_hash).to eq({ + :scheme => "HTTP", + :user => nil, + :password => nil, + :host => "EXAMPLE.COM", + :port => nil, + :path => "/", + :query => nil, + :fragment => nil + }) + end + + it "should be identical to its duplicate" do + expect(@uri).to eq(@uri.dup) + end + + it "should have an origin of 'http://example.com'" do + expect(@uri.origin).to eq('http://example.com') + end + + it "should have a tld of 'com'" do + expect(@uri.tld).to eq('com') + end +end + +describe Addressable::URI, "when parsed from " + + "'http://www.example.co.uk/'" do + before do + @uri = Addressable::URI.parse("http://www.example.co.uk/") + end + + it "should have an origin of 'http://www.example.co.uk'" do + expect(@uri.origin).to eq('http://www.example.co.uk') + end + + it "should have a tld of 'co.uk'" do + expect(@uri.tld).to eq('co.uk') + end + + it "should have a domain of 'example.co.uk'" do + expect(@uri.domain).to eq('example.co.uk') + end +end + +describe Addressable::URI, "when parsed from " + + "'http://sub_domain.blogspot.com/'" do + before do + @uri = Addressable::URI.parse("http://sub_domain.blogspot.com/") + end + + it "should have an origin of 'http://sub_domain.blogspot.com'" do + expect(@uri.origin).to eq('http://sub_domain.blogspot.com') + end + + it "should have a tld of 'com'" do + expect(@uri.tld).to eq('com') + end + + it "should have a domain of 'blogspot.com'" do + expect(@uri.domain).to eq('blogspot.com') + end +end + +describe Addressable::URI, "when parsed from " + + "'http://example.com/~smith/'" do + before do + @uri = Addressable::URI.parse("http://example.com/~smith/") + end + + # Based on http://intertwingly.net/blog/2004/07/31/URI-Equivalence + it "should be equivalent to http://example.com/%7Esmith/" do + expect(@uri).to eq(Addressable::URI.parse("http://example.com/%7Esmith/")) + end + + # Based on http://intertwingly.net/blog/2004/07/31/URI-Equivalence + it "should be equivalent to http://example.com/%7esmith/" do + expect(@uri).to eq(Addressable::URI.parse("http://example.com/%7esmith/")) + end + + it "should be identical to its duplicate" do + expect(@uri).to eq(@uri.dup) + end +end + +describe Addressable::URI, "when parsed from " + + "'http://example.com/%E8'" do + before do + @uri = Addressable::URI.parse("http://example.com/%E8") + end + + it "should not raise an exception when normalized" do + expect do + @uri.normalize + end.not_to raise_error + end + + it "should be considered to be in normal form" do + expect(@uri.normalize).to be_eql(@uri) + end + + it "should not change if encoded with the normalizing algorithm" do + expect(Addressable::URI.normalized_encode(@uri).to_s).to eq( + "http://example.com/%E8" + ) + expect(Addressable::URI.normalized_encode(@uri, Addressable::URI).to_s).to be === + "http://example.com/%E8" + end +end + +describe Addressable::URI, "when parsed from " + + "'http://example.com/path%2Fsegment/'" do + before do + @uri = Addressable::URI.parse("http://example.com/path%2Fsegment/") + end + + it "should be considered to be in normal form" do + expect(@uri.normalize).to be_eql(@uri) + end + + it "should be equal to 'http://example.com/path%2Fsegment/'" do + expect(@uri.normalize).to be_eql( + Addressable::URI.parse("http://example.com/path%2Fsegment/") + ) + end + + it "should not be equal to 'http://example.com/path/segment/'" do + expect(@uri).not_to eq( + Addressable::URI.parse("http://example.com/path/segment/") + ) + end + + it "should not be equal to 'http://example.com/path/segment/'" do + expect(@uri.normalize).not_to be_eql( + Addressable::URI.parse("http://example.com/path/segment/") + ) + end +end + +describe Addressable::URI, "when parsed from " + + "'http://example.com/?%F6'" do + before do + @uri = Addressable::URI.parse("http://example.com/?%F6") + end + + it "should not raise an exception when normalized" do + expect do + @uri.normalize + end.not_to raise_error + end + + it "should be considered to be in normal form" do + expect(@uri.normalize).to be_eql(@uri) + end + + it "should not change if encoded with the normalizing algorithm" do + expect(Addressable::URI.normalized_encode(@uri).to_s).to eq( + "http://example.com/?%F6" + ) + expect(Addressable::URI.normalized_encode(@uri, Addressable::URI).to_s).to be === + "http://example.com/?%F6" + end +end + +describe Addressable::URI, "when parsed from " + + "'http://example.com/#%F6'" do + before do + @uri = Addressable::URI.parse("http://example.com/#%F6") + end + + it "should not raise an exception when normalized" do + expect do + @uri.normalize + end.not_to raise_error + end + + it "should be considered to be in normal form" do + expect(@uri.normalize).to be_eql(@uri) + end + + it "should not change if encoded with the normalizing algorithm" do + expect(Addressable::URI.normalized_encode(@uri).to_s).to eq( + "http://example.com/#%F6" + ) + expect(Addressable::URI.normalized_encode(@uri, Addressable::URI).to_s).to be === + "http://example.com/#%F6" + end +end + +describe Addressable::URI, "when parsed from " + + "'http://example.com/%C3%87'" do + before do + @uri = Addressable::URI.parse("http://example.com/%C3%87") + end + + # Based on http://intertwingly.net/blog/2004/07/31/URI-Equivalence + it "should be equivalent to 'http://example.com/C%CC%A7'" do + expect(@uri).to eq(Addressable::URI.parse("http://example.com/C%CC%A7")) + end + + it "should not change if encoded with the normalizing algorithm" do + expect(Addressable::URI.normalized_encode(@uri).to_s).to eq( + "http://example.com/%C3%87" + ) + expect(Addressable::URI.normalized_encode(@uri, Addressable::URI).to_s).to be === + "http://example.com/%C3%87" + end + + it "should raise an error if encoding with an unexpected return type" do + expect do + Addressable::URI.normalized_encode(@uri, Integer) + end.to raise_error(TypeError) + end + + it "if percent encoded should be 'http://example.com/C%25CC%25A7'" do + expect(Addressable::URI.encode(@uri).to_s).to eq( + "http://example.com/%25C3%2587" + ) + end + + it "if percent encoded should be 'http://example.com/C%25CC%25A7'" do + expect(Addressable::URI.encode(@uri, Addressable::URI)).to eq( + Addressable::URI.parse("http://example.com/%25C3%2587") + ) + end + + it "should raise an error if encoding with an unexpected return type" do + expect do + Addressable::URI.encode(@uri, Integer) + end.to raise_error(TypeError) + end + + it "should be identical to its duplicate" do + expect(@uri).to eq(@uri.dup) + end +end + +describe Addressable::URI, "when parsed from " + + "'http://example.com/?q=string'" do + before do + @uri = Addressable::URI.parse("http://example.com/?q=string") + end + + it "should use the 'http' scheme" do + expect(@uri.scheme).to eq("http") + end + + it "should have an authority segment of 'example.com'" do + expect(@uri.authority).to eq("example.com") + end + + it "should have a host of 'example.com'" do + expect(@uri.host).to eq("example.com") + end + + it "should have no username" do + expect(@uri.user).to eq(nil) + end + + it "should have no password" do + expect(@uri.password).to eq(nil) + end + + it "should use port 80" do + expect(@uri.inferred_port).to eq(80) + end + + it "should have a path of '/'" do + expect(@uri.path).to eq("/") + end + + it "should have a query string of 'q=string'" do + expect(@uri.query).to eq("q=string") + end + + it "should have no fragment" do + expect(@uri.fragment).to eq(nil) + end + + it "should be considered absolute" do + expect(@uri).to be_absolute + end + + it "should not be considered relative" do + expect(@uri).not_to be_relative + end + + it "should be considered to be in normal form" do + expect(@uri.normalize).to be_eql(@uri) + end + + it "should be identical to its duplicate" do + expect(@uri).to eq(@uri.dup) + end +end + +describe Addressable::URI, "when parsed from " + + "'http://example.com:80/'" do + before do + @uri = Addressable::URI.parse("http://example.com:80/") + end + + it "should use the 'http' scheme" do + expect(@uri.scheme).to eq("http") + end + + it "should have an authority segment of 'example.com:80'" do + expect(@uri.authority).to eq("example.com:80") + end + + it "should have a host of 'example.com'" do + expect(@uri.host).to eq("example.com") + end + + it "should have no username" do + expect(@uri.user).to eq(nil) + end + + it "should have no password" do + expect(@uri.password).to eq(nil) + end + + it "should use port 80" do + expect(@uri.inferred_port).to eq(80) + end + + it "should have explicit port 80" do + expect(@uri.port).to eq(80) + end + + it "should have a path of '/'" do + expect(@uri.path).to eq("/") + end + + it "should have no query string" do + expect(@uri.query).to eq(nil) + end + + it "should have no fragment" do + expect(@uri.fragment).to eq(nil) + end + + it "should be considered absolute" do + expect(@uri).to be_absolute + end + + it "should not be considered relative" do + expect(@uri).not_to be_relative + end + + it "should be exactly equal to http://example.com:80/" do + expect(@uri.eql?(Addressable::URI.parse("http://example.com:80/"))).to eq(true) + end + + it "should be roughly equal to http://example.com/" do + expect(@uri === Addressable::URI.parse("http://example.com/")).to eq(true) + end + + it "should be roughly equal to the string 'http://example.com/'" do + expect(@uri === "http://example.com/").to eq(true) + end + + it "should not be roughly equal to the string " + + "'http://example.com:bogus/'" do + expect do + expect(@uri === "http://example.com:bogus/").to eq(false) + end.not_to raise_error + end + + it "should result in itself when joined with itself" do + expect(@uri.join(@uri).to_s).to eq("http://example.com:80/") + expect(@uri.join!(@uri).to_s).to eq("http://example.com:80/") + end + + # Section 6.2.3 of RFC 3986 + it "should be equal to http://example.com/" do + expect(@uri).to eq(Addressable::URI.parse("http://example.com/")) + end + + # Section 6.2.3 of RFC 3986 + it "should be equal to http://example.com:/" do + expect(@uri).to eq(Addressable::URI.parse("http://example.com:/")) + end + + # Section 6.2.3 of RFC 3986 + it "should be equal to http://example.com:80/" do + expect(@uri).to eq(Addressable::URI.parse("http://example.com:80/")) + end + + # Section 6.2.2.1 of RFC 3986 + it "should be equal to http://EXAMPLE.COM/" do + expect(@uri).to eq(Addressable::URI.parse("http://EXAMPLE.COM/")) + end + + it "should correctly convert to a hash" do + expect(@uri.to_hash).to eq({ + :scheme => "http", + :user => nil, + :password => nil, + :host => "example.com", + :port => 80, + :path => "/", + :query => nil, + :fragment => nil + }) + end + + it "should be identical to its duplicate" do + expect(@uri).to eq(@uri.dup) + end + + it "should have an origin of 'http://example.com'" do + expect(@uri.origin).to eq('http://example.com') + end + + it "should not change if encoded with the normalizing algorithm" do + expect(Addressable::URI.normalized_encode(@uri).to_s).to eq( + "http://example.com:80/" + ) + expect(Addressable::URI.normalized_encode(@uri, Addressable::URI).to_s).to be === + "http://example.com:80/" + end +end + +describe Addressable::URI, "when parsed from " + + "'http://example.com:8080/'" do + before do + @uri = Addressable::URI.parse("http://example.com:8080/") + end + + it "should use the 'http' scheme" do + expect(@uri.scheme).to eq("http") + end + + it "should have an authority segment of 'example.com:8080'" do + expect(@uri.authority).to eq("example.com:8080") + end + + it "should have a host of 'example.com'" do + expect(@uri.host).to eq("example.com") + end + + it "should have no username" do + expect(@uri.user).to eq(nil) + end + + it "should have no password" do + expect(@uri.password).to eq(nil) + end + + it "should use port 8080" do + expect(@uri.inferred_port).to eq(8080) + end + + it "should have explicit port 8080" do + expect(@uri.port).to eq(8080) + end + + it "should have default port 80" do + expect(@uri.default_port).to eq(80) + end + + it "should have a path of '/'" do + expect(@uri.path).to eq("/") + end + + it "should have no query string" do + expect(@uri.query).to eq(nil) + end + + it "should have no fragment" do + expect(@uri.fragment).to eq(nil) + end + + it "should be considered absolute" do + expect(@uri).to be_absolute + end + + it "should not be considered relative" do + expect(@uri).not_to be_relative + end + + it "should be exactly equal to http://example.com:8080/" do + expect(@uri.eql?(Addressable::URI.parse( + "http://example.com:8080/"))).to eq(true) + end + + it "should have a route of 'http://example.com:8080/' from " + + "'http://example.com/path/to/'" do + expect(@uri.route_from("http://example.com/path/to/")).to eq( + Addressable::URI.parse("http://example.com:8080/") + ) + end + + it "should have a route of 'http://example.com:8080/' from " + + "'http://example.com:80/path/to/'" do + expect(@uri.route_from("http://example.com:80/path/to/")).to eq( + Addressable::URI.parse("http://example.com:8080/") + ) + end + + it "should have a route of '../../' from " + + "'http://example.com:8080/path/to/'" do + expect(@uri.route_from("http://example.com:8080/path/to/")).to eq( + Addressable::URI.parse("../../") + ) + end + + it "should have a route of 'http://example.com:8080/' from " + + "'http://user:pass@example.com/path/to/'" do + expect(@uri.route_from("http://user:pass@example.com/path/to/")).to eq( + Addressable::URI.parse("http://example.com:8080/") + ) + end + + it "should correctly convert to a hash" do + expect(@uri.to_hash).to eq({ + :scheme => "http", + :user => nil, + :password => nil, + :host => "example.com", + :port => 8080, + :path => "/", + :query => nil, + :fragment => nil + }) + end + + it "should be identical to its duplicate" do + expect(@uri).to eq(@uri.dup) + end + + it "should have an origin of 'http://example.com:8080'" do + expect(@uri.origin).to eq('http://example.com:8080') + end + + it "should not change if encoded with the normalizing algorithm" do + expect(Addressable::URI.normalized_encode(@uri).to_s).to eq( + "http://example.com:8080/" + ) + expect(Addressable::URI.normalized_encode(@uri, Addressable::URI).to_s).to be === + "http://example.com:8080/" + end +end + +describe Addressable::URI, "when parsed from " + + "'http://example.com:%38%30/'" do + before do + @uri = Addressable::URI.parse("http://example.com:%38%30/") + end + + it "should have the correct port" do + expect(@uri.port).to eq(80) + end + + it "should not be considered to be in normal form" do + expect(@uri.normalize).not_to be_eql(@uri) + end + + it "should normalize to 'http://example.com/'" do + expect(@uri.normalize.to_s).to eq("http://example.com/") + end + + it "should have an origin of 'http://example.com'" do + expect(@uri.origin).to eq('http://example.com') + end +end + +describe Addressable::URI, "when parsed from " + + "'http://example.com/%2E/'" do + before do + @uri = Addressable::URI.parse("http://example.com/%2E/") + end + + it "should be considered to be in normal form" do + skip( + 'path segment normalization should happen before ' + + 'percent escaping normalization' + ) + @uri.normalize.should be_eql(@uri) + end + + it "should normalize to 'http://example.com/%2E/'" do + skip( + 'path segment normalization should happen before ' + + 'percent escaping normalization' + ) + expect(@uri.normalize).to eq("http://example.com/%2E/") + end +end + +describe Addressable::URI, "when parsed from " + + "'http://example.com/..'" do + before do + @uri = Addressable::URI.parse("http://example.com/..") + end + + it "should have the correct port" do + expect(@uri.inferred_port).to eq(80) + end + + it "should not be considered to be in normal form" do + expect(@uri.normalize).not_to be_eql(@uri) + end + + it "should normalize to 'http://example.com/'" do + expect(@uri.normalize.to_s).to eq("http://example.com/") + end +end + +describe Addressable::URI, "when parsed from " + + "'http://example.com/../..'" do + before do + @uri = Addressable::URI.parse("http://example.com/../..") + end + + it "should have the correct port" do + expect(@uri.inferred_port).to eq(80) + end + + it "should not be considered to be in normal form" do + expect(@uri.normalize).not_to be_eql(@uri) + end + + it "should normalize to 'http://example.com/'" do + expect(@uri.normalize.to_s).to eq("http://example.com/") + end +end + +describe Addressable::URI, "when parsed from " + + "'http://example.com/path(/..'" do + before do + @uri = Addressable::URI.parse("http://example.com/path(/..") + end + + it "should have the correct port" do + expect(@uri.inferred_port).to eq(80) + end + + it "should not be considered to be in normal form" do + expect(@uri.normalize).not_to be_eql(@uri) + end + + it "should normalize to 'http://example.com/'" do + expect(@uri.normalize.to_s).to eq("http://example.com/") + end +end + +describe Addressable::URI, "when parsed from " + + "'http://example.com/(path)/..'" do + before do + @uri = Addressable::URI.parse("http://example.com/(path)/..") + end + + it "should have the correct port" do + expect(@uri.inferred_port).to eq(80) + end + + it "should not be considered to be in normal form" do + expect(@uri.normalize).not_to be_eql(@uri) + end + + it "should normalize to 'http://example.com/'" do + expect(@uri.normalize.to_s).to eq("http://example.com/") + end +end + +describe Addressable::URI, "when parsed from " + + "'http://example.com/path(/../'" do + before do + @uri = Addressable::URI.parse("http://example.com/path(/../") + end + + it "should have the correct port" do + expect(@uri.inferred_port).to eq(80) + end + + it "should not be considered to be in normal form" do + expect(@uri.normalize).not_to be_eql(@uri) + end + + it "should normalize to 'http://example.com/'" do + expect(@uri.normalize.to_s).to eq("http://example.com/") + end +end + +describe Addressable::URI, "when parsed from " + + "'http://example.com/(path)/../'" do + before do + @uri = Addressable::URI.parse("http://example.com/(path)/../") + end + + it "should have the correct port" do + expect(@uri.inferred_port).to eq(80) + end + + it "should not be considered to be in normal form" do + expect(@uri.normalize).not_to be_eql(@uri) + end + + it "should normalize to 'http://example.com/'" do + expect(@uri.normalize.to_s).to eq("http://example.com/") + end +end + +describe Addressable::URI, "when parsed from " + + "'/..//example.com'" do + before do + @uri = Addressable::URI.parse("/..//example.com") + end + + it "should become invalid when normalized" do + expect do + @uri.normalize + end.to raise_error(Addressable::URI::InvalidURIError, /authority/) + end + + it "should have a path of '/..//example.com'" do + expect(@uri.path).to eq("/..//example.com") + end +end + +describe Addressable::URI, "when parsed from '/a/b/c/./../../g'" do + before do + @uri = Addressable::URI.parse("/a/b/c/./../../g") + end + + it "should not be considered to be in normal form" do + expect(@uri.normalize).not_to be_eql(@uri) + end + + # Section 5.2.4 of RFC 3986 + it "should normalize to '/a/g'" do + expect(@uri.normalize.to_s).to eq("/a/g") + end +end + +describe Addressable::URI, "when parsed from 'mid/content=5/../6'" do + before do + @uri = Addressable::URI.parse("mid/content=5/../6") + end + + it "should not be considered to be in normal form" do + expect(@uri.normalize).not_to be_eql(@uri) + end + + # Section 5.2.4 of RFC 3986 + it "should normalize to 'mid/6'" do + expect(@uri.normalize.to_s).to eq("mid/6") + end +end + +describe Addressable::URI, "when parsed from " + + "'http://www.example.com///../'" do + before do + @uri = Addressable::URI.parse('http://www.example.com///../') + end + + it "should not be considered to be in normal form" do + expect(@uri.normalize).not_to be_eql(@uri) + end + + it "should normalize to 'http://www.example.com//'" do + expect(@uri.normalize.to_s).to eq("http://www.example.com//") + end +end + +describe Addressable::URI, "when parsed from " + + "'http://example.com/path/to/resource/'" do + before do + @uri = Addressable::URI.parse("http://example.com/path/to/resource/") + end + + it "should use the 'http' scheme" do + expect(@uri.scheme).to eq("http") + end + + it "should have an authority segment of 'example.com'" do + expect(@uri.authority).to eq("example.com") + end + + it "should have a host of 'example.com'" do + expect(@uri.host).to eq("example.com") + end + + it "should have no username" do + expect(@uri.user).to eq(nil) + end + + it "should have no password" do + expect(@uri.password).to eq(nil) + end + + it "should use port 80" do + expect(@uri.inferred_port).to eq(80) + end + + it "should have a path of '/path/to/resource/'" do + expect(@uri.path).to eq("/path/to/resource/") + end + + it "should have no query string" do + expect(@uri.query).to eq(nil) + end + + it "should have no fragment" do + expect(@uri.fragment).to eq(nil) + end + + it "should be considered absolute" do + expect(@uri).to be_absolute + end + + it "should not be considered relative" do + expect(@uri).not_to be_relative + end + + it "should be exactly equal to http://example.com:8080/" do + expect(@uri.eql?(Addressable::URI.parse( + "http://example.com/path/to/resource/"))).to eq(true) + end + + it "should have a route of 'resource/' from " + + "'http://example.com/path/to/'" do + expect(@uri.route_from("http://example.com/path/to/")).to eq( + Addressable::URI.parse("resource/") + ) + end + + it "should have a route of '../' from " + + "'http://example.com/path/to/resource/sub'" do + expect(@uri.route_from("http://example.com/path/to/resource/sub")).to eq( + Addressable::URI.parse("../") + ) + end + + + it "should have a route of 'resource/' from " + + "'http://example.com/path/to/another'" do + expect(@uri.route_from("http://example.com/path/to/another")).to eq( + Addressable::URI.parse("resource/") + ) + end + + it "should have a route of 'resource/' from " + + "'http://example.com/path/to/res'" do + expect(@uri.route_from("http://example.com/path/to/res")).to eq( + Addressable::URI.parse("resource/") + ) + end + + it "should have a route of 'resource/' from " + + "'http://example.com:80/path/to/'" do + expect(@uri.route_from("http://example.com:80/path/to/")).to eq( + Addressable::URI.parse("resource/") + ) + end + + it "should have a route of 'http://example.com/path/to/' from " + + "'http://example.com:8080/path/to/'" do + expect(@uri.route_from("http://example.com:8080/path/to/")).to eq( + Addressable::URI.parse("http://example.com/path/to/resource/") + ) + end + + it "should have a route of 'http://example.com/path/to/' from " + + "'http://user:pass@example.com/path/to/'" do + expect(@uri.route_from("http://user:pass@example.com/path/to/")).to eq( + Addressable::URI.parse("http://example.com/path/to/resource/") + ) + end + + it "should have a route of '../../path/to/resource/' from " + + "'http://example.com/to/resource/'" do + expect(@uri.route_from("http://example.com/to/resource/")).to eq( + Addressable::URI.parse("../../path/to/resource/") + ) + end + + it "should correctly convert to a hash" do + expect(@uri.to_hash).to eq({ + :scheme => "http", + :user => nil, + :password => nil, + :host => "example.com", + :port => nil, + :path => "/path/to/resource/", + :query => nil, + :fragment => nil + }) + end + + it "should be identical to its duplicate" do + expect(@uri).to eq(@uri.dup) + end +end + +describe Addressable::URI, "when parsed from " + + "'relative/path/to/resource'" do + before do + @uri = Addressable::URI.parse("relative/path/to/resource") + end + + it "should not have a scheme" do + expect(@uri.scheme).to eq(nil) + end + + it "should not be considered ip-based" do + expect(@uri).not_to be_ip_based + end + + it "should not have an authority segment" do + expect(@uri.authority).to eq(nil) + end + + it "should not have a host" do + expect(@uri.host).to eq(nil) + end + + it "should have no username" do + expect(@uri.user).to eq(nil) + end + + it "should have no password" do + expect(@uri.password).to eq(nil) + end + + it "should not have a port" do + expect(@uri.port).to eq(nil) + end + + it "should have a path of 'relative/path/to/resource'" do + expect(@uri.path).to eq("relative/path/to/resource") + end + + it "should have no query string" do + expect(@uri.query).to eq(nil) + end + + it "should have no fragment" do + expect(@uri.fragment).to eq(nil) + end + + it "should not be considered absolute" do + expect(@uri).not_to be_absolute + end + + it "should be considered relative" do + expect(@uri).to be_relative + end + + it "should raise an error if routing is attempted" do + expect do + @uri.route_to("http://example.com/") + end.to raise_error(ArgumentError, /relative\/path\/to\/resource/) + expect do + @uri.route_from("http://example.com/") + end.to raise_error(ArgumentError, /relative\/path\/to\/resource/) + end + + it "when joined with 'another/relative/path' should be " + + "'relative/path/to/another/relative/path'" do + expect(@uri.join('another/relative/path')).to eq( + Addressable::URI.parse("relative/path/to/another/relative/path") + ) + end + + it "should be identical to its duplicate" do + expect(@uri).to eq(@uri.dup) + end +end + +describe Addressable::URI, "when parsed from " + + "'relative_path_with_no_slashes'" do + before do + @uri = Addressable::URI.parse("relative_path_with_no_slashes") + end + + it "should not have a scheme" do + expect(@uri.scheme).to eq(nil) + end + + it "should not be considered ip-based" do + expect(@uri).not_to be_ip_based + end + + it "should not have an authority segment" do + expect(@uri.authority).to eq(nil) + end + + it "should not have a host" do + expect(@uri.host).to eq(nil) + end + + it "should have no username" do + expect(@uri.user).to eq(nil) + end + + it "should have no password" do + expect(@uri.password).to eq(nil) + end + + it "should not have a port" do + expect(@uri.port).to eq(nil) + end + + it "should have a path of 'relative_path_with_no_slashes'" do + expect(@uri.path).to eq("relative_path_with_no_slashes") + end + + it "should have no query string" do + expect(@uri.query).to eq(nil) + end + + it "should have no fragment" do + expect(@uri.fragment).to eq(nil) + end + + it "should not be considered absolute" do + expect(@uri).not_to be_absolute + end + + it "should be considered relative" do + expect(@uri).to be_relative + end + + it "when joined with 'another_relative_path' should be " + + "'another_relative_path'" do + expect(@uri.join('another_relative_path')).to eq( + Addressable::URI.parse("another_relative_path") + ) + end +end + +describe Addressable::URI, "when parsed from " + + "'http://example.com/file.txt'" do + before do + @uri = Addressable::URI.parse("http://example.com/file.txt") + end + + it "should have a scheme of 'http'" do + expect(@uri.scheme).to eq("http") + end + + it "should have an authority segment of 'example.com'" do + expect(@uri.authority).to eq("example.com") + end + + it "should have a host of 'example.com'" do + expect(@uri.host).to eq("example.com") + end + + it "should have no username" do + expect(@uri.user).to eq(nil) + end + + it "should have no password" do + expect(@uri.password).to eq(nil) + end + + it "should use port 80" do + expect(@uri.inferred_port).to eq(80) + end + + it "should have a path of '/file.txt'" do + expect(@uri.path).to eq("/file.txt") + end + + it "should have a basename of 'file.txt'" do + expect(@uri.basename).to eq("file.txt") + end + + it "should have an extname of '.txt'" do + expect(@uri.extname).to eq(".txt") + end + + it "should have no query string" do + expect(@uri.query).to eq(nil) + end + + it "should have no fragment" do + expect(@uri.fragment).to eq(nil) + end +end + +describe Addressable::URI, "when parsed from " + + "'http://example.com/file.txt;parameter'" do + before do + @uri = Addressable::URI.parse("http://example.com/file.txt;parameter") + end + + it "should have a scheme of 'http'" do + expect(@uri.scheme).to eq("http") + end + + it "should have an authority segment of 'example.com'" do + expect(@uri.authority).to eq("example.com") + end + + it "should have a host of 'example.com'" do + expect(@uri.host).to eq("example.com") + end + + it "should have no username" do + expect(@uri.user).to eq(nil) + end + + it "should have no password" do + expect(@uri.password).to eq(nil) + end + + it "should use port 80" do + expect(@uri.inferred_port).to eq(80) + end + + it "should have a path of '/file.txt;parameter'" do + expect(@uri.path).to eq("/file.txt;parameter") + end + + it "should have a basename of 'file.txt'" do + expect(@uri.basename).to eq("file.txt") + end + + it "should have an extname of '.txt'" do + expect(@uri.extname).to eq(".txt") + end + + it "should have no query string" do + expect(@uri.query).to eq(nil) + end + + it "should have no fragment" do + expect(@uri.fragment).to eq(nil) + end +end + +describe Addressable::URI, "when parsed from " + + "'http://example.com/file.txt;x=y'" do + before do + @uri = Addressable::URI.parse("http://example.com/file.txt;x=y") + end + + it "should have a scheme of 'http'" do + expect(@uri.scheme).to eq("http") + end + + it "should have a scheme of 'http'" do + expect(@uri.scheme).to eq("http") + end + + it "should have an authority segment of 'example.com'" do + expect(@uri.authority).to eq("example.com") + end + + it "should have a host of 'example.com'" do + expect(@uri.host).to eq("example.com") + end + + it "should have no username" do + expect(@uri.user).to eq(nil) + end + + it "should have no password" do + expect(@uri.password).to eq(nil) + end + + it "should use port 80" do + expect(@uri.inferred_port).to eq(80) + end + + it "should have a path of '/file.txt;x=y'" do + expect(@uri.path).to eq("/file.txt;x=y") + end + + it "should have an extname of '.txt'" do + expect(@uri.extname).to eq(".txt") + end + + it "should have no query string" do + expect(@uri.query).to eq(nil) + end + + it "should have no fragment" do + expect(@uri.fragment).to eq(nil) + end + + it "should be considered to be in normal form" do + expect(@uri.normalize).to be_eql(@uri) + end +end + +describe Addressable::URI, "when parsed from " + + "'svn+ssh://developername@rubyforge.org/var/svn/project'" do + before do + @uri = Addressable::URI.parse( + "svn+ssh://developername@rubyforge.org/var/svn/project" + ) + end + + it "should have a scheme of 'svn+ssh'" do + expect(@uri.scheme).to eq("svn+ssh") + end + + it "should be considered to be ip-based" do + expect(@uri).to be_ip_based + end + + it "should have a path of '/var/svn/project'" do + expect(@uri.path).to eq("/var/svn/project") + end + + it "should have a username of 'developername'" do + expect(@uri.user).to eq("developername") + end + + it "should have no password" do + expect(@uri.password).to eq(nil) + end + + it "should be considered to be in normal form" do + expect(@uri.normalize).to be_eql(@uri) + end +end + +describe Addressable::URI, "when parsed from " + + "'ssh+svn://developername@RUBYFORGE.ORG/var/svn/project'" do + before do + @uri = Addressable::URI.parse( + "ssh+svn://developername@RUBYFORGE.ORG/var/svn/project" + ) + end + + it "should have a scheme of 'ssh+svn'" do + expect(@uri.scheme).to eq("ssh+svn") + end + + it "should have a normalized scheme of 'svn+ssh'" do + expect(@uri.normalized_scheme).to eq("svn+ssh") + end + + it "should have a normalized site of 'svn+ssh'" do + expect(@uri.normalized_site).to eq("svn+ssh://developername@rubyforge.org") + end + + it "should not be considered to be ip-based" do + expect(@uri).not_to be_ip_based + end + + it "should have a path of '/var/svn/project'" do + expect(@uri.path).to eq("/var/svn/project") + end + + it "should have a username of 'developername'" do + expect(@uri.user).to eq("developername") + end + + it "should have no password" do + expect(@uri.password).to eq(nil) + end + + it "should not be considered to be in normal form" do + expect(@uri.normalize).not_to be_eql(@uri) + end +end + +describe Addressable::URI, "when parsed from " + + "'mailto:user@example.com'" do + before do + @uri = Addressable::URI.parse("mailto:user@example.com") + end + + it "should have a scheme of 'mailto'" do + expect(@uri.scheme).to eq("mailto") + end + + it "should not be considered to be ip-based" do + expect(@uri).not_to be_ip_based + end + + it "should have a path of 'user@example.com'" do + expect(@uri.path).to eq("user@example.com") + end + + it "should have no user" do + expect(@uri.user).to eq(nil) + end + + it "should be considered to be in normal form" do + expect(@uri.normalize).to be_eql(@uri) + end +end + +describe Addressable::URI, "when parsed from " + + "'tag:example.com,2006-08-18:/path/to/something'" do + before do + @uri = Addressable::URI.parse( + "tag:example.com,2006-08-18:/path/to/something") + end + + it "should have a scheme of 'tag'" do + expect(@uri.scheme).to eq("tag") + end + + it "should be considered to be ip-based" do + expect(@uri).not_to be_ip_based + end + + it "should have a path of " + + "'example.com,2006-08-18:/path/to/something'" do + expect(@uri.path).to eq("example.com,2006-08-18:/path/to/something") + end + + it "should have no user" do + expect(@uri.user).to eq(nil) + end + + it "should be considered to be in normal form" do + expect(@uri.normalize).to be_eql(@uri) + end + + it "should have a 'null' origin" do + expect(@uri.origin).to eq('null') + end +end + +describe Addressable::URI, "when parsed from " + + "'http://example.com/x;y/'" do + before do + @uri = Addressable::URI.parse("http://example.com/x;y/") + end + + it "should be considered to be in normal form" do + expect(@uri.normalize).to be_eql(@uri) + end +end + +describe Addressable::URI, "when parsed from " + + "'http://example.com/?x=1&y=2'" do + before do + @uri = Addressable::URI.parse("http://example.com/?x=1&y=2") + end + + it "should be considered to be in normal form" do + expect(@uri.normalize).to be_eql(@uri) + end +end + +describe Addressable::URI, "when parsed from " + + "'view-source:http://example.com/'" do + before do + @uri = Addressable::URI.parse("view-source:http://example.com/") + end + + it "should have a scheme of 'view-source'" do + expect(@uri.scheme).to eq("view-source") + end + + it "should have a path of 'http://example.com/'" do + expect(@uri.path).to eq("http://example.com/") + end + + it "should be considered to be in normal form" do + expect(@uri.normalize).to be_eql(@uri) + end + + it "should have a 'null' origin" do + expect(@uri.origin).to eq('null') + end +end + +describe Addressable::URI, "when parsed from " + + "'http://user:pass@example.com/path/to/resource?query=x#fragment'" do + before do + @uri = Addressable::URI.parse( + "http://user:pass@example.com/path/to/resource?query=x#fragment") + end + + it "should use the 'http' scheme" do + expect(@uri.scheme).to eq("http") + end + + it "should have an authority segment of 'user:pass@example.com'" do + expect(@uri.authority).to eq("user:pass@example.com") + end + + it "should have a username of 'user'" do + expect(@uri.user).to eq("user") + end + + it "should have a password of 'pass'" do + expect(@uri.password).to eq("pass") + end + + it "should have a host of 'example.com'" do + expect(@uri.host).to eq("example.com") + end + + it "should use port 80" do + expect(@uri.inferred_port).to eq(80) + end + + it "should have a path of '/path/to/resource'" do + expect(@uri.path).to eq("/path/to/resource") + end + + it "should have a query string of 'query=x'" do + expect(@uri.query).to eq("query=x") + end + + it "should have a fragment of 'fragment'" do + expect(@uri.fragment).to eq("fragment") + end + + it "should be considered to be in normal form" do + expect(@uri.normalize).to be_eql(@uri) + end + + it "should have a route of '../../' to " + + "'http://user:pass@example.com/path/'" do + expect(@uri.route_to("http://user:pass@example.com/path/")).to eq( + Addressable::URI.parse("../../") + ) + end + + it "should have a route of 'to/resource?query=x#fragment' " + + "from 'http://user:pass@example.com/path/'" do + expect(@uri.route_from("http://user:pass@example.com/path/")).to eq( + Addressable::URI.parse("to/resource?query=x#fragment") + ) + end + + it "should have a route of '?query=x#fragment' " + + "from 'http://user:pass@example.com/path/to/resource'" do + expect(@uri.route_from("http://user:pass@example.com/path/to/resource")).to eq( + Addressable::URI.parse("?query=x#fragment") + ) + end + + it "should have a route of '#fragment' " + + "from 'http://user:pass@example.com/path/to/resource?query=x'" do + expect(@uri.route_from( + "http://user:pass@example.com/path/to/resource?query=x")).to eq( + Addressable::URI.parse("#fragment") + ) + end + + it "should have a route of '#fragment' from " + + "'http://user:pass@example.com/path/to/resource?query=x#fragment'" do + expect(@uri.route_from( + "http://user:pass@example.com/path/to/resource?query=x#fragment" + )).to eq(Addressable::URI.parse("#fragment")) + end + + it "should have a route of 'http://elsewhere.com/' to " + + "'http://elsewhere.com/'" do + expect(@uri.route_to("http://elsewhere.com/")).to eq( + Addressable::URI.parse("http://elsewhere.com/") + ) + end + + it "should have a route of " + + "'http://user:pass@example.com/path/to/resource?query=x#fragment' " + + "from 'http://example.com/path/to/'" do + expect(@uri.route_from("http://elsewhere.com/path/to/")).to eq( + Addressable::URI.parse( + "http://user:pass@example.com/path/to/resource?query=x#fragment") + ) + end + + it "should have the correct scheme after assignment" do + @uri.scheme = "ftp" + expect(@uri.scheme).to eq("ftp") + expect(@uri.to_s).to eq( + "ftp://user:pass@example.com/path/to/resource?query=x#fragment" + ) + expect(@uri.to_str).to eq( + "ftp://user:pass@example.com/path/to/resource?query=x#fragment" + ) + end + + it "should have the correct site segment after assignment" do + @uri.site = "https://newuser:newpass@example.com:443" + expect(@uri.scheme).to eq("https") + expect(@uri.authority).to eq("newuser:newpass@example.com:443") + expect(@uri.user).to eq("newuser") + expect(@uri.password).to eq("newpass") + expect(@uri.userinfo).to eq("newuser:newpass") + expect(@uri.normalized_userinfo).to eq("newuser:newpass") + expect(@uri.host).to eq("example.com") + expect(@uri.port).to eq(443) + expect(@uri.inferred_port).to eq(443) + expect(@uri.to_s).to eq( + "https://newuser:newpass@example.com:443" + + "/path/to/resource?query=x#fragment" + ) + end + + it "should have the correct authority segment after assignment" do + @uri.authority = "newuser:newpass@example.com:80" + expect(@uri.authority).to eq("newuser:newpass@example.com:80") + expect(@uri.user).to eq("newuser") + expect(@uri.password).to eq("newpass") + expect(@uri.userinfo).to eq("newuser:newpass") + expect(@uri.normalized_userinfo).to eq("newuser:newpass") + expect(@uri.host).to eq("example.com") + expect(@uri.port).to eq(80) + expect(@uri.inferred_port).to eq(80) + expect(@uri.to_s).to eq( + "http://newuser:newpass@example.com:80" + + "/path/to/resource?query=x#fragment" + ) + end + + it "should have the correct userinfo segment after assignment" do + @uri.userinfo = "newuser:newpass" + expect(@uri.userinfo).to eq("newuser:newpass") + expect(@uri.authority).to eq("newuser:newpass@example.com") + expect(@uri.user).to eq("newuser") + expect(@uri.password).to eq("newpass") + expect(@uri.host).to eq("example.com") + expect(@uri.port).to eq(nil) + expect(@uri.inferred_port).to eq(80) + expect(@uri.to_s).to eq( + "http://newuser:newpass@example.com" + + "/path/to/resource?query=x#fragment" + ) + end + + it "should have the correct username after assignment" do + @uri.user = "newuser" + expect(@uri.user).to eq("newuser") + expect(@uri.authority).to eq("newuser:pass@example.com") + end + + it "should have the correct password after assignment" do + @uri.password = "newpass" + expect(@uri.password).to eq("newpass") + expect(@uri.authority).to eq("user:newpass@example.com") + end + + it "should have the correct host after assignment" do + @uri.host = "newexample.com" + expect(@uri.host).to eq("newexample.com") + expect(@uri.authority).to eq("user:pass@newexample.com") + end + + it "should have the correct host after assignment" do + @uri.hostname = "newexample.com" + expect(@uri.host).to eq("newexample.com") + expect(@uri.hostname).to eq("newexample.com") + expect(@uri.authority).to eq("user:pass@newexample.com") + end + + it "should raise an error if assigning a bogus object to the hostname" do + expect do + @uri.hostname = Object.new + end.to raise_error(TypeError) + end + + it "should have the correct port after assignment" do + @uri.port = 8080 + expect(@uri.port).to eq(8080) + expect(@uri.authority).to eq("user:pass@example.com:8080") + end + + it "should have the correct origin after assignment" do + @uri.origin = "http://newexample.com" + expect(@uri.host).to eq("newexample.com") + expect(@uri.authority).to eq("newexample.com") + end + + it "should have the correct path after assignment" do + @uri.path = "/newpath/to/resource" + expect(@uri.path).to eq("/newpath/to/resource") + expect(@uri.to_s).to eq( + "http://user:pass@example.com/newpath/to/resource?query=x#fragment" + ) + end + + it "should have the correct scheme and authority after nil assignment" do + @uri.site = nil + expect(@uri.scheme).to eq(nil) + expect(@uri.authority).to eq(nil) + expect(@uri.to_s).to eq("/path/to/resource?query=x#fragment") + end + + it "should have the correct scheme and authority after assignment" do + @uri.site = "file://" + expect(@uri.scheme).to eq("file") + expect(@uri.authority).to eq("") + expect(@uri.to_s).to eq("file:///path/to/resource?query=x#fragment") + end + + it "should have the correct path after nil assignment" do + @uri.path = nil + expect(@uri.path).to eq("") + expect(@uri.to_s).to eq( + "http://user:pass@example.com?query=x#fragment" + ) + end + + it "should have the correct query string after assignment" do + @uri.query = "newquery=x" + expect(@uri.query).to eq("newquery=x") + expect(@uri.to_s).to eq( + "http://user:pass@example.com/path/to/resource?newquery=x#fragment" + ) + @uri.query = nil + expect(@uri.query).to eq(nil) + expect(@uri.to_s).to eq( + "http://user:pass@example.com/path/to/resource#fragment" + ) + end + + it "should have the correct query string after hash assignment" do + @uri.query_values = {"?uestion mark" => "=sign", "hello" => "g\xC3\xBCnther"} + expect(@uri.query.split("&")).to include("%3Fuestion%20mark=%3Dsign") + expect(@uri.query.split("&")).to include("hello=g%C3%BCnther") + expect(@uri.query_values).to eq({ + "?uestion mark" => "=sign", "hello" => "g\xC3\xBCnther" + }) + end + + it "should have the correct query string after flag hash assignment" do + @uri.query_values = {'flag?1' => nil, 'fl=ag2' => nil, 'flag3' => nil} + expect(@uri.query.split("&")).to include("flag%3F1") + expect(@uri.query.split("&")).to include("fl%3Dag2") + expect(@uri.query.split("&")).to include("flag3") + expect(@uri.query_values(Array).sort).to eq([["fl=ag2"], ["flag3"], ["flag?1"]]) + expect(@uri.query_values(Hash)).to eq({ + 'flag?1' => nil, 'fl=ag2' => nil, 'flag3' => nil + }) + end + + it "should raise an error if query values are set to a bogus type" do + expect do + @uri.query_values = "bogus" + end.to raise_error(TypeError) + end + + it "should have the correct fragment after assignment" do + @uri.fragment = "newfragment" + expect(@uri.fragment).to eq("newfragment") + expect(@uri.to_s).to eq( + "http://user:pass@example.com/path/to/resource?query=x#newfragment" + ) + + @uri.fragment = nil + expect(@uri.fragment).to eq(nil) + expect(@uri.to_s).to eq( + "http://user:pass@example.com/path/to/resource?query=x" + ) + end + + it "should have the correct values after a merge" do + expect(@uri.merge(:fragment => "newfragment").to_s).to eq( + "http://user:pass@example.com/path/to/resource?query=x#newfragment" + ) + end + + it "should have the correct values after a merge" do + expect(@uri.merge(:fragment => nil).to_s).to eq( + "http://user:pass@example.com/path/to/resource?query=x" + ) + end + + it "should have the correct values after a merge" do + expect(@uri.merge(:userinfo => "newuser:newpass").to_s).to eq( + "http://newuser:newpass@example.com/path/to/resource?query=x#fragment" + ) + end + + it "should have the correct values after a merge" do + expect(@uri.merge(:userinfo => nil).to_s).to eq( + "http://example.com/path/to/resource?query=x#fragment" + ) + end + + it "should have the correct values after a merge" do + expect(@uri.merge(:path => "newpath").to_s).to eq( + "http://user:pass@example.com/newpath?query=x#fragment" + ) + end + + it "should have the correct values after a merge" do + expect(@uri.merge(:port => "42", :path => "newpath", :query => "").to_s).to eq( + "http://user:pass@example.com:42/newpath?#fragment" + ) + end + + it "should have the correct values after a merge" do + expect(@uri.merge(:authority => "foo:bar@baz:42").to_s).to eq( + "http://foo:bar@baz:42/path/to/resource?query=x#fragment" + ) + # Ensure the operation was not destructive + expect(@uri.to_s).to eq( + "http://user:pass@example.com/path/to/resource?query=x#fragment" + ) + end + + it "should have the correct values after a destructive merge" do + @uri.merge!(:authority => "foo:bar@baz:42") + # Ensure the operation was destructive + expect(@uri.to_s).to eq( + "http://foo:bar@baz:42/path/to/resource?query=x#fragment" + ) + end + + it "should fail to merge with bogus values" do + expect do + @uri.merge(:port => "bogus") + end.to raise_error(Addressable::URI::InvalidURIError) + end + + it "should fail to merge with bogus values" do + expect do + @uri.merge(:authority => "bar@baz:bogus") + end.to raise_error(Addressable::URI::InvalidURIError) + end + + it "should fail to merge with bogus parameters" do + expect do + @uri.merge(42) + end.to raise_error(TypeError) + end + + it "should fail to merge with bogus parameters" do + expect do + @uri.merge("http://example.com/") + end.to raise_error(TypeError) + end + + it "should fail to merge with both authority and subcomponents" do + expect do + @uri.merge(:authority => "foo:bar@baz:42", :port => "42") + end.to raise_error(ArgumentError) + end + + it "should fail to merge with both userinfo and subcomponents" do + expect do + @uri.merge(:userinfo => "foo:bar", :user => "foo") + end.to raise_error(ArgumentError) + end + + it "should be identical to its duplicate" do + expect(@uri).to eq(@uri.dup) + end + + it "should have an origin of 'http://example.com'" do + expect(@uri.origin).to eq('http://example.com') + end +end + +describe Addressable::URI, "when parsed from " + + "'http://example.com/search?q=Q%26A'" do + + before do + @uri = Addressable::URI.parse("http://example.com/search?q=Q%26A") + end + + it "should have a query of 'q=Q%26A'" do + expect(@uri.query).to eq("q=Q%26A") + end + + it "should have query_values of {'q' => 'Q&A'}" do + expect(@uri.query_values).to eq({ 'q' => 'Q&A' }) + end + + it "should normalize to the original uri " + + "(with the ampersand properly percent-encoded)" do + expect(@uri.normalize.to_s).to eq("http://example.com/search?q=Q%26A") + end +end + +describe Addressable::URI, "when parsed from " + + "'http://example.com/?&x=b'" do + before do + @uri = Addressable::URI.parse("http://example.com/?&x=b") + end + + it "should have a query of '&x=b'" do + expect(@uri.query).to eq("&x=b") + end + + it "should have query_values of {'x' => 'b'}" do + expect(@uri.query_values).to eq({'x' => 'b'}) + end +end + +describe Addressable::URI, "when parsed from " + + "'http://example.com/?q='one;two'&x=1'" do + before do + @uri = Addressable::URI.parse("http://example.com/?q='one;two'&x=1") + end + + it "should have a query of 'q='one;two'&x=1'" do + expect(@uri.query).to eq("q='one;two'&x=1") + end + + it "should have query_values of {\"q\" => \"'one;two'\", \"x\" => \"1\"}" do + expect(@uri.query_values).to eq({"q" => "'one;two'", "x" => "1"}) + end + + it "should escape the ';' character when normalizing to avoid ambiguity " + + "with the W3C HTML 4.01 specification" do + # HTML 4.01 Section B.2.2 + expect(@uri.normalize.query).to eq("q='one%3Btwo'&x=1") + end +end + +describe Addressable::URI, "when parsed from " + + "'http://example.com/?&&x=b'" do + before do + @uri = Addressable::URI.parse("http://example.com/?&&x=b") + end + + it "should have a query of '&&x=b'" do + expect(@uri.query).to eq("&&x=b") + end + + it "should have query_values of {'x' => 'b'}" do + expect(@uri.query_values).to eq({'x' => 'b'}) + end +end + +describe Addressable::URI, "when parsed from " + + "'http://example.com/?q=a&&x=b'" do + before do + @uri = Addressable::URI.parse("http://example.com/?q=a&&x=b") + end + + it "should have a query of 'q=a&&x=b'" do + expect(@uri.query).to eq("q=a&&x=b") + end + + it "should have query_values of {'q' => 'a, 'x' => 'b'}" do + expect(@uri.query_values).to eq({'q' => 'a', 'x' => 'b'}) + end +end + +describe Addressable::URI, "when parsed from " + + "'http://example.com/?q&&x=b'" do + before do + @uri = Addressable::URI.parse("http://example.com/?q&&x=b") + end + + it "should have a query of 'q&&x=b'" do + expect(@uri.query).to eq("q&&x=b") + end + + it "should have query_values of {'q' => true, 'x' => 'b'}" do + expect(@uri.query_values).to eq({'q' => nil, 'x' => 'b'}) + end +end + +describe Addressable::URI, "when parsed from " + + "'http://example.com/?q=a+b'" do + before do + @uri = Addressable::URI.parse("http://example.com/?q=a+b") + end + + it "should have a query of 'q=a+b'" do + expect(@uri.query).to eq("q=a+b") + end + + it "should have query_values of {'q' => 'a b'}" do + expect(@uri.query_values).to eq({'q' => 'a b'}) + end + + it "should have a normalized query of 'q=a+b'" do + expect(@uri.normalized_query).to eq("q=a+b") + end +end + +describe Addressable::URI, "when parsed from 'https://example.com/?q=a+b'" do + before do + @uri = Addressable::URI.parse("https://example.com/?q=a+b") + end + + it "should have query_values of {'q' => 'a b'}" do + expect(@uri.query_values).to eq("q" => "a b") + end +end + +describe Addressable::URI, "when parsed from 'example.com?q=a+b'" do + before do + @uri = Addressable::URI.parse("example.com?q=a+b") + end + + it "should have query_values of {'q' => 'a b'}" do + expect(@uri.query_values).to eq("q" => "a b") + end +end + +describe Addressable::URI, "when parsed from 'mailto:?q=a+b'" do + before do + @uri = Addressable::URI.parse("mailto:?q=a+b") + end + + it "should have query_values of {'q' => 'a+b'}" do + expect(@uri.query_values).to eq("q" => "a+b") + end +end + +describe Addressable::URI, "when parsed from " + + "'http://example.com/?q=a%2bb'" do + before do + @uri = Addressable::URI.parse("http://example.com/?q=a%2bb") + end + + it "should have a query of 'q=a+b'" do + expect(@uri.query).to eq("q=a%2bb") + end + + it "should have query_values of {'q' => 'a+b'}" do + expect(@uri.query_values).to eq({'q' => 'a+b'}) + end + + it "should have a normalized query of 'q=a%2Bb'" do + expect(@uri.normalized_query).to eq("q=a%2Bb") + end +end + +describe Addressable::URI, "when parsed from " + + "'http://example.com/?v=%7E&w=%&x=%25&y=%2B&z=C%CC%A7'" do + before do + @uri = Addressable::URI.parse("http://example.com/?v=%7E&w=%&x=%25&y=%2B&z=C%CC%A7") + end + + it "should have a normalized query of 'v=~&w=%25&x=%25&y=%2B&z=%C3%87'" do + expect(@uri.normalized_query).to eq("v=~&w=%25&x=%25&y=%2B&z=%C3%87") + end +end + +describe Addressable::URI, "when parsed from " + + "'http://example.com/?v=%7E&w=%&x=%25&y=+&z=C%CC%A7'" do + before do + @uri = Addressable::URI.parse("http://example.com/?v=%7E&w=%&x=%25&y=+&z=C%CC%A7") + end + + it "should have a normalized query of 'v=~&w=%25&x=%25&y=+&z=%C3%87'" do + expect(@uri.normalized_query).to eq("v=~&w=%25&x=%25&y=+&z=%C3%87") + end +end + +describe Addressable::URI, "when parsed from 'http://example/?b=1&a=2&c=3'" do + before do + @uri = Addressable::URI.parse("http://example/?b=1&a=2&c=3") + end + + it "should have a sorted normalized query of 'a=2&b=1&c=3'" do + expect(@uri.normalized_query(:sorted)).to eq("a=2&b=1&c=3") + end +end + +describe Addressable::URI, "when parsed from 'http://example/?&a&&c&'" do + before do + @uri = Addressable::URI.parse("http://example/?&a&&c&") + end + + it "should have a compacted normalized query of 'a&c'" do + expect(@uri.normalized_query(:compacted)).to eq("a&c") + end +end + +describe Addressable::URI, "when parsed from 'http://example.com/?a=1&a=1'" do + before do + @uri = Addressable::URI.parse("http://example.com/?a=1&a=1") + end + + it "should have a compacted normalized query of 'a=1'" do + expect(@uri.normalized_query(:compacted)).to eq("a=1") + end +end + +describe Addressable::URI, "when parsed from 'http://example.com/?a=1&a=2'" do + before do + @uri = Addressable::URI.parse("http://example.com/?a=1&a=2") + end + + it "should have a compacted normalized query of 'a=1&a=2'" do + expect(@uri.normalized_query(:compacted)).to eq("a=1&a=2") + end +end + +describe Addressable::URI, "when parsed from " + + "'http://example.com/sound%2bvision'" do + before do + @uri = Addressable::URI.parse("http://example.com/sound%2bvision") + end + + it "should have a normalized path of '/sound+vision'" do + expect(@uri.normalized_path).to eq('/sound+vision') + end +end + +describe Addressable::URI, "when parsed from " + + "'http://example.com/?q='" do + before do + @uri = Addressable::URI.parse("http://example.com/?q=") + end + + it "should have a query of 'q='" do + expect(@uri.query).to eq("q=") + end + + it "should have query_values of {'q' => ''}" do + expect(@uri.query_values).to eq({'q' => ''}) + end +end + +describe Addressable::URI, "when parsed from " + + "'http://user@example.com'" do + before do + @uri = Addressable::URI.parse("http://user@example.com") + end + + it "should use the 'http' scheme" do + expect(@uri.scheme).to eq("http") + end + + it "should have a username of 'user'" do + expect(@uri.user).to eq("user") + end + + it "should have no password" do + expect(@uri.password).to eq(nil) + end + + it "should have a userinfo of 'user'" do + expect(@uri.userinfo).to eq("user") + end + + it "should have a normalized userinfo of 'user'" do + expect(@uri.normalized_userinfo).to eq("user") + end + + it "should have a host of 'example.com'" do + expect(@uri.host).to eq("example.com") + end + + it "should have default_port 80" do + expect(@uri.default_port).to eq(80) + end + + it "should use port 80" do + expect(@uri.inferred_port).to eq(80) + end + + it "should have the correct username after assignment" do + @uri.user = "newuser" + expect(@uri.user).to eq("newuser") + expect(@uri.password).to eq(nil) + expect(@uri.to_s).to eq("http://newuser@example.com") + end + + it "should have the correct password after assignment" do + @uri.password = "newpass" + expect(@uri.password).to eq("newpass") + expect(@uri.to_s).to eq("http://user:newpass@example.com") + end + + it "should have the correct userinfo segment after assignment" do + @uri.userinfo = "newuser:newpass" + expect(@uri.userinfo).to eq("newuser:newpass") + expect(@uri.user).to eq("newuser") + expect(@uri.password).to eq("newpass") + expect(@uri.host).to eq("example.com") + expect(@uri.port).to eq(nil) + expect(@uri.inferred_port).to eq(80) + expect(@uri.to_s).to eq("http://newuser:newpass@example.com") + end + + it "should have the correct userinfo segment after nil assignment" do + @uri.userinfo = nil + expect(@uri.userinfo).to eq(nil) + expect(@uri.user).to eq(nil) + expect(@uri.password).to eq(nil) + expect(@uri.host).to eq("example.com") + expect(@uri.port).to eq(nil) + expect(@uri.inferred_port).to eq(80) + expect(@uri.to_s).to eq("http://example.com") + end + + it "should have the correct authority segment after assignment" do + @uri.authority = "newuser@example.com" + expect(@uri.authority).to eq("newuser@example.com") + expect(@uri.user).to eq("newuser") + expect(@uri.password).to eq(nil) + expect(@uri.host).to eq("example.com") + expect(@uri.port).to eq(nil) + expect(@uri.inferred_port).to eq(80) + expect(@uri.to_s).to eq("http://newuser@example.com") + end + + it "should raise an error after nil assignment of authority segment" do + expect do + # This would create an invalid URI + @uri.authority = nil + end.to raise_error(Addressable::URI::InvalidURIError) + end +end + +describe Addressable::URI, "when parsed from " + + "'http://user:@example.com'" do + before do + @uri = Addressable::URI.parse("http://user:@example.com") + end + + it "should use the 'http' scheme" do + expect(@uri.scheme).to eq("http") + end + + it "should have a username of 'user'" do + expect(@uri.user).to eq("user") + end + + it "should have a password of ''" do + expect(@uri.password).to eq("") + end + + it "should have a normalized userinfo of 'user:'" do + expect(@uri.normalized_userinfo).to eq("user:") + end + + it "should have a host of 'example.com'" do + expect(@uri.host).to eq("example.com") + end + + it "should use port 80" do + expect(@uri.inferred_port).to eq(80) + end + + it "should have the correct username after assignment" do + @uri.user = "newuser" + expect(@uri.user).to eq("newuser") + expect(@uri.password).to eq("") + expect(@uri.to_s).to eq("http://newuser:@example.com") + end + + it "should have the correct password after assignment" do + @uri.password = "newpass" + expect(@uri.password).to eq("newpass") + expect(@uri.to_s).to eq("http://user:newpass@example.com") + end + + it "should have the correct authority segment after assignment" do + @uri.authority = "newuser:@example.com" + expect(@uri.authority).to eq("newuser:@example.com") + expect(@uri.user).to eq("newuser") + expect(@uri.password).to eq("") + expect(@uri.host).to eq("example.com") + expect(@uri.port).to eq(nil) + expect(@uri.inferred_port).to eq(80) + expect(@uri.to_s).to eq("http://newuser:@example.com") + end +end + +describe Addressable::URI, "when parsed from " + + "'http://:pass@example.com'" do + before do + @uri = Addressable::URI.parse("http://:pass@example.com") + end + + it "should use the 'http' scheme" do + expect(@uri.scheme).to eq("http") + end + + it "should have a username of ''" do + expect(@uri.user).to eq("") + end + + it "should have a password of 'pass'" do + expect(@uri.password).to eq("pass") + end + + it "should have a userinfo of ':pass'" do + expect(@uri.userinfo).to eq(":pass") + end + + it "should have a normalized userinfo of ':pass'" do + expect(@uri.normalized_userinfo).to eq(":pass") + end + + it "should have a host of 'example.com'" do + expect(@uri.host).to eq("example.com") + end + + it "should use port 80" do + expect(@uri.inferred_port).to eq(80) + end + + it "should have the correct username after assignment" do + @uri.user = "newuser" + expect(@uri.user).to eq("newuser") + expect(@uri.password).to eq("pass") + expect(@uri.to_s).to eq("http://newuser:pass@example.com") + end + + it "should have the correct password after assignment" do + @uri.password = "newpass" + expect(@uri.password).to eq("newpass") + expect(@uri.user).to eq("") + expect(@uri.to_s).to eq("http://:newpass@example.com") + end + + it "should have the correct authority segment after assignment" do + @uri.authority = ":newpass@example.com" + expect(@uri.authority).to eq(":newpass@example.com") + expect(@uri.user).to eq("") + expect(@uri.password).to eq("newpass") + expect(@uri.host).to eq("example.com") + expect(@uri.port).to eq(nil) + expect(@uri.inferred_port).to eq(80) + expect(@uri.to_s).to eq("http://:newpass@example.com") + end +end + +describe Addressable::URI, "when parsed from " + + "'http://:@example.com'" do + before do + @uri = Addressable::URI.parse("http://:@example.com") + end + + it "should use the 'http' scheme" do + expect(@uri.scheme).to eq("http") + end + + it "should have a username of ''" do + expect(@uri.user).to eq("") + end + + it "should have a password of ''" do + expect(@uri.password).to eq("") + end + + it "should have a normalized userinfo of nil" do + expect(@uri.normalized_userinfo).to eq(nil) + end + + it "should have a host of 'example.com'" do + expect(@uri.host).to eq("example.com") + end + + it "should use port 80" do + expect(@uri.inferred_port).to eq(80) + end + + it "should have the correct username after assignment" do + @uri.user = "newuser" + expect(@uri.user).to eq("newuser") + expect(@uri.password).to eq("") + expect(@uri.to_s).to eq("http://newuser:@example.com") + end + + it "should have the correct password after assignment" do + @uri.password = "newpass" + expect(@uri.password).to eq("newpass") + expect(@uri.user).to eq("") + expect(@uri.to_s).to eq("http://:newpass@example.com") + end + + it "should have the correct authority segment after assignment" do + @uri.authority = ":@newexample.com" + expect(@uri.authority).to eq(":@newexample.com") + expect(@uri.user).to eq("") + expect(@uri.password).to eq("") + expect(@uri.host).to eq("newexample.com") + expect(@uri.port).to eq(nil) + expect(@uri.inferred_port).to eq(80) + expect(@uri.to_s).to eq("http://:@newexample.com") + end +end + +describe Addressable::URI, "when parsed from " + + "'#example'" do + before do + @uri = Addressable::URI.parse("#example") + end + + it "should be considered relative" do + expect(@uri).to be_relative + end + + it "should have a host of nil" do + expect(@uri.host).to eq(nil) + end + + it "should have a site of nil" do + expect(@uri.site).to eq(nil) + end + + it "should have a normalized_site of nil" do + expect(@uri.normalized_site).to eq(nil) + end + + it "should have a path of ''" do + expect(@uri.path).to eq("") + end + + it "should have a query string of nil" do + expect(@uri.query).to eq(nil) + end + + it "should have a fragment of 'example'" do + expect(@uri.fragment).to eq("example") + end +end + +describe Addressable::URI, "when parsed from " + + "the network-path reference '//example.com/'" do + before do + @uri = Addressable::URI.parse("//example.com/") + end + + it "should be considered relative" do + expect(@uri).to be_relative + end + + it "should have a host of 'example.com'" do + expect(@uri.host).to eq("example.com") + end + + it "should have a path of '/'" do + expect(@uri.path).to eq("/") + end + + it "should raise an error if routing is attempted" do + expect do + @uri.route_to("http://example.com/") + end.to raise_error(ArgumentError, /\/\/example.com\//) + expect do + @uri.route_from("http://example.com/") + end.to raise_error(ArgumentError, /\/\/example.com\//) + end + + it "should have a 'null' origin" do + expect(@uri.origin).to eq('null') + end +end + +describe Addressable::URI, "when parsed from " + + "'feed://http://example.com/'" do + before do + @uri = Addressable::URI.parse("feed://http://example.com/") + end + + it "should have a host of 'http'" do + expect(@uri.host).to eq("http") + end + + it "should have a path of '//example.com/'" do + expect(@uri.path).to eq("//example.com/") + end +end + +describe Addressable::URI, "when parsed from " + + "'feed:http://example.com/'" do + before do + @uri = Addressable::URI.parse("feed:http://example.com/") + end + + it "should have a path of 'http://example.com/'" do + expect(@uri.path).to eq("http://example.com/") + end + + it "should normalize to 'http://example.com/'" do + expect(@uri.normalize.to_s).to eq("http://example.com/") + expect(@uri.normalize!.to_s).to eq("http://example.com/") + end + + it "should have a 'null' origin" do + expect(@uri.origin).to eq('null') + end +end + +describe Addressable::URI, "when parsed from " + + "'example://a/b/c/%7Bfoo%7D'" do + before do + @uri = Addressable::URI.parse("example://a/b/c/%7Bfoo%7D") + end + + # Section 6.2.2 of RFC 3986 + it "should be equivalent to eXAMPLE://a/./b/../b/%63/%7bfoo%7d" do + expect(@uri).to eq( + Addressable::URI.parse("eXAMPLE://a/./b/../b/%63/%7bfoo%7d") + ) + end + + it "should have an origin of 'example://a'" do + expect(@uri.origin).to eq('example://a') + end +end + +describe Addressable::URI, "when parsed from " + + "'http://example.com/indirect/path/./to/../resource/'" do + before do + @uri = Addressable::URI.parse( + "http://example.com/indirect/path/./to/../resource/") + end + + it "should use the 'http' scheme" do + expect(@uri.scheme).to eq("http") + end + + it "should have a host of 'example.com'" do + expect(@uri.host).to eq("example.com") + end + + it "should use port 80" do + expect(@uri.inferred_port).to eq(80) + end + + it "should have a path of '/indirect/path/./to/../resource/'" do + expect(@uri.path).to eq("/indirect/path/./to/../resource/") + end + + # Section 6.2.2.3 of RFC 3986 + it "should have a normalized path of '/indirect/path/resource/'" do + expect(@uri.normalize.path).to eq("/indirect/path/resource/") + expect(@uri.normalize!.path).to eq("/indirect/path/resource/") + end +end + +describe Addressable::URI, "when parsed from " + + "'http://under_score.example.com/'" do + it "should not cause an error" do + expect do + Addressable::URI.parse("http://under_score.example.com/") + end.not_to raise_error + end +end + +describe Addressable::URI, "when parsed from " + + "'./this:that'" do + before do + @uri = Addressable::URI.parse("./this:that") + end + + it "should be considered relative" do + expect(@uri).to be_relative + end + + it "should have no scheme" do + expect(@uri.scheme).to eq(nil) + end + + it "should have a 'null' origin" do + expect(@uri.origin).to eq('null') + end +end + +describe Addressable::URI, "when parsed from " + + "'this:that'" do + before do + @uri = Addressable::URI.parse("this:that") + end + + it "should be considered absolute" do + expect(@uri).to be_absolute + end + + it "should have a scheme of 'this'" do + expect(@uri.scheme).to eq("this") + end + + it "should have a 'null' origin" do + expect(@uri.origin).to eq('null') + end +end + +describe Addressable::URI, "when parsed from '?'" do + before do + @uri = Addressable::URI.parse("?") + end + + it "should normalize to ''" do + expect(@uri.normalize.to_s).to eq("") + end + + it "should have the correct return type" do + expect(@uri.query_values).to eq({}) + expect(@uri.query_values(Hash)).to eq({}) + expect(@uri.query_values(Array)).to eq([]) + end + + it "should have a 'null' origin" do + expect(@uri.origin).to eq('null') + end +end + +describe Addressable::URI, "when parsed from '?one=1&two=2&three=3'" do + before do + @uri = Addressable::URI.parse("?one=1&two=2&three=3") + end + + it "should have the correct query values" do + expect(@uri.query_values).to eq({"one" => "1", "two" => "2", "three" => "3"}) + end + + it "should raise an error for invalid return type values" do + expect do + @uri.query_values(Integer) + end.to raise_error(ArgumentError) + end + + it "should have the correct array query values" do + expect(@uri.query_values(Array)).to eq([ + ["one", "1"], ["two", "2"], ["three", "3"] + ]) + end + + it "should have a 'null' origin" do + expect(@uri.origin).to eq('null') + end +end + +describe Addressable::URI, "when parsed from '?one=1=uno&two=2=dos'" do + before do + @uri = Addressable::URI.parse("?one=1=uno&two=2=dos") + end + + it "should have the correct query values" do + expect(@uri.query_values).to eq({"one" => "1=uno", "two" => "2=dos"}) + end + + it "should have the correct array query values" do + expect(@uri.query_values(Array)).to eq([ + ["one", "1=uno"], ["two", "2=dos"] + ]) + end +end + +describe Addressable::URI, "when parsed from '?one[two][three]=four'" do + before do + @uri = Addressable::URI.parse("?one[two][three]=four") + end + + it "should have the correct query values" do + expect(@uri.query_values).to eq({"one[two][three]" => "four"}) + end + + it "should have the correct array query values" do + expect(@uri.query_values(Array)).to eq([ + ["one[two][three]", "four"] + ]) + end +end + +describe Addressable::URI, "when parsed from '?one.two.three=four'" do + before do + @uri = Addressable::URI.parse("?one.two.three=four") + end + + it "should have the correct query values" do + expect(@uri.query_values).to eq({ + "one.two.three" => "four" + }) + end + + it "should have the correct array query values" do + expect(@uri.query_values(Array)).to eq([ + ["one.two.three", "four"] + ]) + end +end + +describe Addressable::URI, "when parsed from " + + "'?one[two][three]=four&one[two][five]=six'" do + before do + @uri = Addressable::URI.parse("?one[two][three]=four&one[two][five]=six") + end + + it "should have the correct query values" do + expect(@uri.query_values).to eq({ + "one[two][three]" => "four", "one[two][five]" => "six" + }) + end + + it "should have the correct array query values" do + expect(@uri.query_values(Array)).to eq([ + ["one[two][three]", "four"], ["one[two][five]", "six"] + ]) + end +end + +describe Addressable::URI, "when parsed from " + + "'?one.two.three=four&one.two.five=six'" do + before do + @uri = Addressable::URI.parse("?one.two.three=four&one.two.five=six") + end + + it "should have the correct query values" do + expect(@uri.query_values).to eq({ + "one.two.three" => "four", "one.two.five" => "six" + }) + end + + it "should have the correct array query values" do + expect(@uri.query_values(Array)).to eq([ + ["one.two.three", "four"], ["one.two.five", "six"] + ]) + end +end + +describe Addressable::URI, "when parsed from " + + "'?one=two&one=three'" do + before do + @uri = Addressable::URI.parse( + "?one=two&one=three&one=four" + ) + end + + it "should have correct array query values" do + expect(@uri.query_values(Array)).to eq( + [['one', 'two'], ['one', 'three'], ['one', 'four']] + ) + end + + it "should have correct hash query values" do + skip("This is probably more desirable behavior.") + expect(@uri.query_values(Hash)).to eq( + {'one' => ['two', 'three', 'four']} + ) + end + + it "should handle assignment with keys of mixed type" do + @uri.query_values = @uri.query_values(Hash).merge({:one => 'three'}) + expect(@uri.query_values(Hash)).to eq({'one' => 'three'}) + end +end + +describe Addressable::URI, "when parsed from " + + "'?one[two][three][]=four&one[two][three][]=five'" do + before do + @uri = Addressable::URI.parse( + "?one[two][three][]=four&one[two][three][]=five" + ) + end + + it "should have correct query values" do + expect(@uri.query_values(Hash)).to eq({"one[two][three][]" => "five"}) + end + + it "should have correct array query values" do + expect(@uri.query_values(Array)).to eq([ + ["one[two][three][]", "four"], ["one[two][three][]", "five"] + ]) + end +end + +describe Addressable::URI, "when parsed from " + + "'?one[two][three][0]=four&one[two][three][1]=five'" do + before do + @uri = Addressable::URI.parse( + "?one[two][three][0]=four&one[two][three][1]=five" + ) + end + + it "should have the correct query values" do + expect(@uri.query_values).to eq({ + "one[two][three][0]" => "four", "one[two][three][1]" => "five" + }) + end +end + +describe Addressable::URI, "when parsed from " + + "'?one[two][three][1]=four&one[two][three][0]=five'" do + before do + @uri = Addressable::URI.parse( + "?one[two][three][1]=four&one[two][three][0]=five" + ) + end + + it "should have the correct query values" do + expect(@uri.query_values).to eq({ + "one[two][three][1]" => "four", "one[two][three][0]" => "five" + }) + end +end + +describe Addressable::URI, "when parsed from " + + "'?one[two][three][2]=four&one[two][three][1]=five'" do + before do + @uri = Addressable::URI.parse( + "?one[two][three][2]=four&one[two][three][1]=five" + ) + end + + it "should have the correct query values" do + expect(@uri.query_values).to eq({ + "one[two][three][2]" => "four", "one[two][three][1]" => "five" + }) + end +end + +describe Addressable::URI, "when parsed from " + + "'http://www.詹姆斯.com/'" do + before do + @uri = Addressable::URI.parse("http://www.詹姆斯.com/") + end + + it "should be equivalent to 'http://www.xn--8ws00zhy3a.com/'" do + expect(@uri).to eq( + Addressable::URI.parse("http://www.xn--8ws00zhy3a.com/") + ) + end + + it "should not have domain name encoded during normalization" do + expect(Addressable::URI.normalized_encode(@uri.to_s)).to eq( + "http://www.詹姆斯.com/" + ) + end + + it "should have an origin of 'http://www.xn--8ws00zhy3a.com'" do + expect(@uri.origin).to eq('http://www.xn--8ws00zhy3a.com') + end +end + +describe Addressable::URI, "when parsed from " + + "'http://www.詹姆斯.com/ some spaces /'" do + before do + @uri = Addressable::URI.parse("http://www.詹姆斯.com/ some spaces /") + end + + it "should be equivalent to " + + "'http://www.xn--8ws00zhy3a.com/%20some%20spaces%20/'" do + expect(@uri).to eq( + Addressable::URI.parse( + "http://www.xn--8ws00zhy3a.com/%20some%20spaces%20/") + ) + end + + it "should not have domain name encoded during normalization" do + expect(Addressable::URI.normalized_encode(@uri.to_s)).to eq( + "http://www.詹姆斯.com/%20some%20spaces%20/" + ) + end + + it "should have an origin of 'http://www.xn--8ws00zhy3a.com'" do + expect(@uri.origin).to eq('http://www.xn--8ws00zhy3a.com') + end +end + +describe Addressable::URI, "when parsed from " + + "'http://www.xn--8ws00zhy3a.com/'" do + before do + @uri = Addressable::URI.parse("http://www.xn--8ws00zhy3a.com/") + end + + it "should be displayed as http://www.詹姆斯.com/" do + expect(@uri.display_uri.to_s).to eq("http://www.詹姆斯.com/") + end + + it "should properly force the encoding" do + display_string = @uri.display_uri.to_str + expect(display_string).to eq("http://www.詹姆斯.com/") + if display_string.respond_to?(:encoding) + expect(display_string.encoding.to_s).to eq(Encoding::UTF_8.to_s) + end + end + + it "should have an origin of 'http://www.xn--8ws00zhy3a.com'" do + expect(@uri.origin).to eq('http://www.xn--8ws00zhy3a.com') + end +end + +describe Addressable::URI, "when parsed from " + + "'http://www.詹姆斯.com/atomtests/iri/詹.html'" do + before do + @uri = Addressable::URI.parse("http://www.詹姆斯.com/atomtests/iri/詹.html") + end + + it "should normalize to " + + "http://www.xn--8ws00zhy3a.com/atomtests/iri/%E8%A9%B9.html" do + expect(@uri.normalize.to_s).to eq( + "http://www.xn--8ws00zhy3a.com/atomtests/iri/%E8%A9%B9.html" + ) + expect(@uri.normalize!.to_s).to eq( + "http://www.xn--8ws00zhy3a.com/atomtests/iri/%E8%A9%B9.html" + ) + end +end + +describe Addressable::URI, "when parsed from a percent-encoded IRI" do + before do + @uri = Addressable::URI.parse( + "http://www.%E3%81%BB%E3%82%93%E3%81%A8%E3%81%86%E3%81%AB%E3%81%AA" + + "%E3%81%8C%E3%81%84%E3%82%8F%E3%81%91%E3%81%AE%E3%82%8F%E3%81%8B%E3" + + "%82%89%E3%81%AA%E3%81%84%E3%81%A9%E3%82%81%E3%81%84%E3%82%93%E3%82" + + "%81%E3%81%84%E3%81%AE%E3%82%89%E3%81%B9%E3%82%8B%E3%81%BE%E3%81%A0" + + "%E3%81%AA%E3%81%8C%E3%81%8F%E3%81%97%E3%81%AA%E3%81%84%E3%81%A8%E3" + + "%81%9F%E3%82%8A%E3%81%AA%E3%81%84.w3.mag.keio.ac.jp" + ) + end + + it "should normalize to something sane" do + expect(@uri.normalize.to_s).to eq( + "http://www.xn--n8jaaaaai5bhf7as8fsfk3jnknefdde3f" + + "g11amb5gzdb4wi9bya3kc6lra.w3.mag.keio.ac.jp/" + ) + expect(@uri.normalize!.to_s).to eq( + "http://www.xn--n8jaaaaai5bhf7as8fsfk3jnknefdde3f" + + "g11amb5gzdb4wi9bya3kc6lra.w3.mag.keio.ac.jp/" + ) + end + + it "should have the correct origin" do + expect(@uri.origin).to eq( + "http://www.xn--n8jaaaaai5bhf7as8fsfk3jnknefdde3f" + + "g11amb5gzdb4wi9bya3kc6lra.w3.mag.keio.ac.jp" + ) + end +end + +describe Addressable::URI, "with a base uri of 'http://a/b/c/d;p?q'" do + before do + @uri = Addressable::URI.parse("http://a/b/c/d;p?q") + end + + # Section 5.4.1 of RFC 3986 + it "when joined with 'g:h' should resolve to g:h" do + expect((@uri + "g:h").to_s).to eq("g:h") + expect(Addressable::URI.join(@uri, "g:h").to_s).to eq("g:h") + end + + # Section 5.4.1 of RFC 3986 + it "when joined with 'g' should resolve to http://a/b/c/g" do + expect((@uri + "g").to_s).to eq("http://a/b/c/g") + expect(Addressable::URI.join(@uri.to_s, "g").to_s).to eq("http://a/b/c/g") + end + + # Section 5.4.1 of RFC 3986 + it "when joined with './g' should resolve to http://a/b/c/g" do + expect((@uri + "./g").to_s).to eq("http://a/b/c/g") + expect(Addressable::URI.join(@uri.to_s, "./g").to_s).to eq("http://a/b/c/g") + end + + # Section 5.4.1 of RFC 3986 + it "when joined with 'g/' should resolve to http://a/b/c/g/" do + expect((@uri + "g/").to_s).to eq("http://a/b/c/g/") + expect(Addressable::URI.join(@uri.to_s, "g/").to_s).to eq("http://a/b/c/g/") + end + + # Section 5.4.1 of RFC 3986 + it "when joined with '/g' should resolve to http://a/g" do + expect((@uri + "/g").to_s).to eq("http://a/g") + expect(Addressable::URI.join(@uri.to_s, "/g").to_s).to eq("http://a/g") + end + + # Section 5.4.1 of RFC 3986 + it "when joined with '//g' should resolve to http://g" do + expect((@uri + "//g").to_s).to eq("http://g") + expect(Addressable::URI.join(@uri.to_s, "//g").to_s).to eq("http://g") + end + + # Section 5.4.1 of RFC 3986 + it "when joined with '?y' should resolve to http://a/b/c/d;p?y" do + expect((@uri + "?y").to_s).to eq("http://a/b/c/d;p?y") + expect(Addressable::URI.join(@uri.to_s, "?y").to_s).to eq("http://a/b/c/d;p?y") + end + + # Section 5.4.1 of RFC 3986 + it "when joined with 'g?y' should resolve to http://a/b/c/g?y" do + expect((@uri + "g?y").to_s).to eq("http://a/b/c/g?y") + expect(Addressable::URI.join(@uri.to_s, "g?y").to_s).to eq("http://a/b/c/g?y") + end + + # Section 5.4.1 of RFC 3986 + it "when joined with '#s' should resolve to http://a/b/c/d;p?q#s" do + expect((@uri + "#s").to_s).to eq("http://a/b/c/d;p?q#s") + expect(Addressable::URI.join(@uri.to_s, "#s").to_s).to eq( + "http://a/b/c/d;p?q#s" + ) + end + + # Section 5.4.1 of RFC 3986 + it "when joined with 'g#s' should resolve to http://a/b/c/g#s" do + expect((@uri + "g#s").to_s).to eq("http://a/b/c/g#s") + expect(Addressable::URI.join(@uri.to_s, "g#s").to_s).to eq("http://a/b/c/g#s") + end + + # Section 5.4.1 of RFC 3986 + it "when joined with 'g?y#s' should resolve to http://a/b/c/g?y#s" do + expect((@uri + "g?y#s").to_s).to eq("http://a/b/c/g?y#s") + expect(Addressable::URI.join( + @uri.to_s, "g?y#s").to_s).to eq("http://a/b/c/g?y#s") + end + + # Section 5.4.1 of RFC 3986 + it "when joined with ';x' should resolve to http://a/b/c/;x" do + expect((@uri + ";x").to_s).to eq("http://a/b/c/;x") + expect(Addressable::URI.join(@uri.to_s, ";x").to_s).to eq("http://a/b/c/;x") + end + + # Section 5.4.1 of RFC 3986 + it "when joined with 'g;x' should resolve to http://a/b/c/g;x" do + expect((@uri + "g;x").to_s).to eq("http://a/b/c/g;x") + expect(Addressable::URI.join(@uri.to_s, "g;x").to_s).to eq("http://a/b/c/g;x") + end + + # Section 5.4.1 of RFC 3986 + it "when joined with 'g;x?y#s' should resolve to http://a/b/c/g;x?y#s" do + expect((@uri + "g;x?y#s").to_s).to eq("http://a/b/c/g;x?y#s") + expect(Addressable::URI.join( + @uri.to_s, "g;x?y#s").to_s).to eq("http://a/b/c/g;x?y#s") + end + + # Section 5.4.1 of RFC 3986 + it "when joined with '' should resolve to http://a/b/c/d;p?q" do + expect((@uri + "").to_s).to eq("http://a/b/c/d;p?q") + expect(Addressable::URI.join(@uri.to_s, "").to_s).to eq("http://a/b/c/d;p?q") + end + + # Section 5.4.1 of RFC 3986 + it "when joined with '.' should resolve to http://a/b/c/" do + expect((@uri + ".").to_s).to eq("http://a/b/c/") + expect(Addressable::URI.join(@uri.to_s, ".").to_s).to eq("http://a/b/c/") + end + + # Section 5.4.1 of RFC 3986 + it "when joined with './' should resolve to http://a/b/c/" do + expect((@uri + "./").to_s).to eq("http://a/b/c/") + expect(Addressable::URI.join(@uri.to_s, "./").to_s).to eq("http://a/b/c/") + end + + # Section 5.4.1 of RFC 3986 + it "when joined with '..' should resolve to http://a/b/" do + expect((@uri + "..").to_s).to eq("http://a/b/") + expect(Addressable::URI.join(@uri.to_s, "..").to_s).to eq("http://a/b/") + end + + # Section 5.4.1 of RFC 3986 + it "when joined with '../' should resolve to http://a/b/" do + expect((@uri + "../").to_s).to eq("http://a/b/") + expect(Addressable::URI.join(@uri.to_s, "../").to_s).to eq("http://a/b/") + end + + # Section 5.4.1 of RFC 3986 + it "when joined with '../g' should resolve to http://a/b/g" do + expect((@uri + "../g").to_s).to eq("http://a/b/g") + expect(Addressable::URI.join(@uri.to_s, "../g").to_s).to eq("http://a/b/g") + end + + # Section 5.4.1 of RFC 3986 + it "when joined with '../..' should resolve to http://a/" do + expect((@uri + "../..").to_s).to eq("http://a/") + expect(Addressable::URI.join(@uri.to_s, "../..").to_s).to eq("http://a/") + end + + # Section 5.4.1 of RFC 3986 + it "when joined with '../../' should resolve to http://a/" do + expect((@uri + "../../").to_s).to eq("http://a/") + expect(Addressable::URI.join(@uri.to_s, "../../").to_s).to eq("http://a/") + end + + # Section 5.4.1 of RFC 3986 + it "when joined with '../../g' should resolve to http://a/g" do + expect((@uri + "../../g").to_s).to eq("http://a/g") + expect(Addressable::URI.join(@uri.to_s, "../../g").to_s).to eq("http://a/g") + end + + # Section 5.4.2 of RFC 3986 + it "when joined with '../../../g' should resolve to http://a/g" do + expect((@uri + "../../../g").to_s).to eq("http://a/g") + expect(Addressable::URI.join(@uri.to_s, "../../../g").to_s).to eq("http://a/g") + end + + it "when joined with '../.././../g' should resolve to http://a/g" do + expect((@uri + "../.././../g").to_s).to eq("http://a/g") + expect(Addressable::URI.join(@uri.to_s, "../.././../g").to_s).to eq( + "http://a/g" + ) + end + + # Section 5.4.2 of RFC 3986 + it "when joined with '../../../../g' should resolve to http://a/g" do + expect((@uri + "../../../../g").to_s).to eq("http://a/g") + expect(Addressable::URI.join( + @uri.to_s, "../../../../g").to_s).to eq("http://a/g") + end + + # Section 5.4.2 of RFC 3986 + it "when joined with '/./g' should resolve to http://a/g" do + expect((@uri + "/./g").to_s).to eq("http://a/g") + expect(Addressable::URI.join(@uri.to_s, "/./g").to_s).to eq("http://a/g") + end + + # Section 5.4.2 of RFC 3986 + it "when joined with '/../g' should resolve to http://a/g" do + expect((@uri + "/../g").to_s).to eq("http://a/g") + expect(Addressable::URI.join(@uri.to_s, "/../g").to_s).to eq("http://a/g") + end + + # Section 5.4.2 of RFC 3986 + it "when joined with 'g.' should resolve to http://a/b/c/g." do + expect((@uri + "g.").to_s).to eq("http://a/b/c/g.") + expect(Addressable::URI.join(@uri.to_s, "g.").to_s).to eq("http://a/b/c/g.") + end + + # Section 5.4.2 of RFC 3986 + it "when joined with '.g' should resolve to http://a/b/c/.g" do + expect((@uri + ".g").to_s).to eq("http://a/b/c/.g") + expect(Addressable::URI.join(@uri.to_s, ".g").to_s).to eq("http://a/b/c/.g") + end + + # Section 5.4.2 of RFC 3986 + it "when joined with 'g..' should resolve to http://a/b/c/g.." do + expect((@uri + "g..").to_s).to eq("http://a/b/c/g..") + expect(Addressable::URI.join(@uri.to_s, "g..").to_s).to eq("http://a/b/c/g..") + end + + # Section 5.4.2 of RFC 3986 + it "when joined with '..g' should resolve to http://a/b/c/..g" do + expect((@uri + "..g").to_s).to eq("http://a/b/c/..g") + expect(Addressable::URI.join(@uri.to_s, "..g").to_s).to eq("http://a/b/c/..g") + end + + # Section 5.4.2 of RFC 3986 + it "when joined with './../g' should resolve to http://a/b/g" do + expect((@uri + "./../g").to_s).to eq("http://a/b/g") + expect(Addressable::URI.join(@uri.to_s, "./../g").to_s).to eq("http://a/b/g") + end + + # Section 5.4.2 of RFC 3986 + it "when joined with './g/.' should resolve to http://a/b/c/g/" do + expect((@uri + "./g/.").to_s).to eq("http://a/b/c/g/") + expect(Addressable::URI.join(@uri.to_s, "./g/.").to_s).to eq("http://a/b/c/g/") + end + + # Section 5.4.2 of RFC 3986 + it "when joined with 'g/./h' should resolve to http://a/b/c/g/h" do + expect((@uri + "g/./h").to_s).to eq("http://a/b/c/g/h") + expect(Addressable::URI.join(@uri.to_s, "g/./h").to_s).to eq("http://a/b/c/g/h") + end + + # Section 5.4.2 of RFC 3986 + it "when joined with 'g/../h' should resolve to http://a/b/c/h" do + expect((@uri + "g/../h").to_s).to eq("http://a/b/c/h") + expect(Addressable::URI.join(@uri.to_s, "g/../h").to_s).to eq("http://a/b/c/h") + end + + # Section 5.4.2 of RFC 3986 + it "when joined with 'g;x=1/./y' " + + "should resolve to http://a/b/c/g;x=1/y" do + expect((@uri + "g;x=1/./y").to_s).to eq("http://a/b/c/g;x=1/y") + expect(Addressable::URI.join( + @uri.to_s, "g;x=1/./y").to_s).to eq("http://a/b/c/g;x=1/y") + end + + # Section 5.4.2 of RFC 3986 + it "when joined with 'g;x=1/../y' should resolve to http://a/b/c/y" do + expect((@uri + "g;x=1/../y").to_s).to eq("http://a/b/c/y") + expect(Addressable::URI.join( + @uri.to_s, "g;x=1/../y").to_s).to eq("http://a/b/c/y") + end + + # Section 5.4.2 of RFC 3986 + it "when joined with 'g?y/./x' " + + "should resolve to http://a/b/c/g?y/./x" do + expect((@uri + "g?y/./x").to_s).to eq("http://a/b/c/g?y/./x") + expect(Addressable::URI.join( + @uri.to_s, "g?y/./x").to_s).to eq("http://a/b/c/g?y/./x") + end + + # Section 5.4.2 of RFC 3986 + it "when joined with 'g?y/../x' " + + "should resolve to http://a/b/c/g?y/../x" do + expect((@uri + "g?y/../x").to_s).to eq("http://a/b/c/g?y/../x") + expect(Addressable::URI.join( + @uri.to_s, "g?y/../x").to_s).to eq("http://a/b/c/g?y/../x") + end + + # Section 5.4.2 of RFC 3986 + it "when joined with 'g#s/./x' " + + "should resolve to http://a/b/c/g#s/./x" do + expect((@uri + "g#s/./x").to_s).to eq("http://a/b/c/g#s/./x") + expect(Addressable::URI.join( + @uri.to_s, "g#s/./x").to_s).to eq("http://a/b/c/g#s/./x") + end + + # Section 5.4.2 of RFC 3986 + it "when joined with 'g#s/../x' " + + "should resolve to http://a/b/c/g#s/../x" do + expect((@uri + "g#s/../x").to_s).to eq("http://a/b/c/g#s/../x") + expect(Addressable::URI.join( + @uri.to_s, "g#s/../x").to_s).to eq("http://a/b/c/g#s/../x") + end + + # Section 5.4.2 of RFC 3986 + it "when joined with 'http:g' should resolve to http:g" do + expect((@uri + "http:g").to_s).to eq("http:g") + expect(Addressable::URI.join(@uri.to_s, "http:g").to_s).to eq("http:g") + end + + # Edge case to be sure + it "when joined with '//example.com/' should " + + "resolve to http://example.com/" do + expect((@uri + "//example.com/").to_s).to eq("http://example.com/") + expect(Addressable::URI.join( + @uri.to_s, "//example.com/").to_s).to eq("http://example.com/") + end + + it "when joined with a bogus object a TypeError should be raised" do + expect do + Addressable::URI.join(@uri, 42) + end.to raise_error(TypeError) + end +end + +describe Addressable::URI, "when converting the path " + + "'relative/path/to/something'" do + before do + @path = 'relative/path/to/something' + end + + it "should convert to " + + "\'relative/path/to/something\'" do + @uri = Addressable::URI.convert_path(@path) + expect(@uri.to_str).to eq("relative/path/to/something") + end + + it "should join with an absolute file path correctly" do + @base = Addressable::URI.convert_path("/absolute/path/") + @uri = Addressable::URI.convert_path(@path) + expect((@base + @uri).to_str).to eq( + "file:///absolute/path/relative/path/to/something" + ) + end +end + +describe Addressable::URI, "when converting a bogus path" do + it "should raise a TypeError" do + expect do + Addressable::URI.convert_path(42) + end.to raise_error(TypeError) + end +end + +describe Addressable::URI, "when given a UNIX root directory" do + before do + @path = "/" + end + + it "should convert to \'file:///\'" do + @uri = Addressable::URI.convert_path(@path) + expect(@uri.to_str).to eq("file:///") + end + + it "should have an origin of 'file://'" do + @uri = Addressable::URI.convert_path(@path) + expect(@uri.origin).to eq('file://') + end +end + +describe Addressable::URI, "when given a Windows root directory" do + before do + @path = "C:\\" + end + + it "should convert to \'file:///c:/\'" do + @uri = Addressable::URI.convert_path(@path) + expect(@uri.to_str).to eq("file:///c:/") + end + + it "should have an origin of 'file://'" do + @uri = Addressable::URI.convert_path(@path) + expect(@uri.origin).to eq('file://') + end +end + +describe Addressable::URI, "when given the path '/one/two/'" do + before do + @path = '/one/two/' + end + + it "should convert to " + + "\'file:///one/two/\'" do + @uri = Addressable::URI.convert_path(@path) + expect(@uri.to_str).to eq("file:///one/two/") + end + + it "should have an origin of 'file://'" do + @uri = Addressable::URI.convert_path(@path) + expect(@uri.origin).to eq('file://') + end +end + +describe Addressable::URI, "when given the tld " do + it "'uk' should have a tld of 'uk'" do + uri = Addressable::URI.parse("http://example.com") + uri.tld = "uk" + + expect(uri.tld).to eq("uk") + end + + context "which " do + let (:uri) { Addressable::URI.parse("http://www.comrade.net/path/to/source/") } + + it "contains a subdomain" do + uri.tld = "co.uk" + + expect(uri.to_s).to eq("http://www.comrade.co.uk/path/to/source/") + end + + it "is part of the domain" do + uri.tld = "com" + + expect(uri.to_s).to eq("http://www.comrade.com/path/to/source/") + end + end +end + +describe Addressable::URI, "when given the path " + + "'c:\\windows\\My Documents 100%20\\foo.txt'" do + before do + @path = "c:\\windows\\My Documents 100%20\\foo.txt" + end + + it "should convert to " + + "\'file:///c:/windows/My%20Documents%20100%20/foo.txt\'" do + @uri = Addressable::URI.convert_path(@path) + expect(@uri.to_str).to eq("file:///c:/windows/My%20Documents%20100%20/foo.txt") + end + + it "should have an origin of 'file://'" do + @uri = Addressable::URI.convert_path(@path) + expect(@uri.origin).to eq('file://') + end +end + +describe Addressable::URI, "when given the path " + + "'file://c:\\windows\\My Documents 100%20\\foo.txt'" do + before do + @path = "file://c:\\windows\\My Documents 100%20\\foo.txt" + end + + it "should convert to " + + "\'file:///c:/windows/My%20Documents%20100%20/foo.txt\'" do + @uri = Addressable::URI.convert_path(@path) + expect(@uri.to_str).to eq("file:///c:/windows/My%20Documents%20100%20/foo.txt") + end + + it "should have an origin of 'file://'" do + @uri = Addressable::URI.convert_path(@path) + expect(@uri.origin).to eq('file://') + end +end + +describe Addressable::URI, "when given the path " + + "'file:c:\\windows\\My Documents 100%20\\foo.txt'" do + before do + @path = "file:c:\\windows\\My Documents 100%20\\foo.txt" + end + + it "should convert to " + + "\'file:///c:/windows/My%20Documents%20100%20/foo.txt\'" do + @uri = Addressable::URI.convert_path(@path) + expect(@uri.to_str).to eq("file:///c:/windows/My%20Documents%20100%20/foo.txt") + end + + it "should have an origin of 'file://'" do + @uri = Addressable::URI.convert_path(@path) + expect(@uri.origin).to eq('file://') + end +end + +describe Addressable::URI, "when given the path " + + "'file:/c:\\windows\\My Documents 100%20\\foo.txt'" do + before do + @path = "file:/c:\\windows\\My Documents 100%20\\foo.txt" + end + + it "should convert to " + + "\'file:///c:/windows/My%20Documents%20100%20/foo.txt\'" do + @uri = Addressable::URI.convert_path(@path) + expect(@uri.to_str).to eq("file:///c:/windows/My%20Documents%20100%20/foo.txt") + end + + it "should have an origin of 'file://'" do + @uri = Addressable::URI.convert_path(@path) + expect(@uri.origin).to eq('file://') + end +end + +describe Addressable::URI, "when given the path " + + "'file:///c|/windows/My%20Documents%20100%20/foo.txt'" do + before do + @path = "file:///c|/windows/My%20Documents%20100%20/foo.txt" + end + + it "should convert to " + + "\'file:///c:/windows/My%20Documents%20100%20/foo.txt\'" do + @uri = Addressable::URI.convert_path(@path) + expect(@uri.to_str).to eq("file:///c:/windows/My%20Documents%20100%20/foo.txt") + end + + it "should have an origin of 'file://'" do + @uri = Addressable::URI.convert_path(@path) + expect(@uri.origin).to eq('file://') + end +end + +describe Addressable::URI, "when given an http protocol URI" do + before do + @path = "http://example.com/" + end + + it "should not do any conversion at all" do + @uri = Addressable::URI.convert_path(@path) + expect(@uri.to_str).to eq("http://example.com/") + end +end + +class SuperString + def initialize(string) + @string = string.to_s + end + + def to_str + return @string + end +end + +describe Addressable::URI, "when parsing a non-String object" do + it "should correctly parse anything with a 'to_str' method" do + Addressable::URI.parse(SuperString.new(42)) + end + + it "should raise a TypeError for objects than cannot be converted" do + expect do + Addressable::URI.parse(42) + end.to raise_error(TypeError) + end + + it "should correctly parse heuristically anything with a 'to_str' method" do + Addressable::URI.heuristic_parse(SuperString.new(42)) + end + + it "should raise a TypeError for objects than cannot be converted" do + expect do + Addressable::URI.heuristic_parse(42) + end.to raise_error(TypeError) + end +end + +describe Addressable::URI, "when form encoding a hash" do + it "should result in correct percent encoded sequence" do + expect(Addressable::URI.form_encode( + [["&one", "/1"], ["=two", "?2"], [":three", "#3"]] + )).to eq("%26one=%2F1&%3Dtwo=%3F2&%3Athree=%233") + end + + it "should result in correct percent encoded sequence" do + expect(Addressable::URI.form_encode( + {"q" => "one two three"} + )).to eq("q=one+two+three") + end + + it "should result in correct percent encoded sequence" do + expect(Addressable::URI.form_encode( + {"key" => nil} + )).to eq("key=") + end + + it "should result in correct percent encoded sequence" do + expect(Addressable::URI.form_encode( + {"q" => ["one", "two", "three"]} + )).to eq("q=one&q=two&q=three") + end + + it "should result in correctly encoded newlines" do + expect(Addressable::URI.form_encode( + {"text" => "one\ntwo\rthree\r\nfour\n\r"} + )).to eq("text=one%0D%0Atwo%0D%0Athree%0D%0Afour%0D%0A%0D%0A") + end + + it "should result in a sorted percent encoded sequence" do + expect(Addressable::URI.form_encode( + [["a", "1"], ["dup", "3"], ["dup", "2"]], true + )).to eq("a=1&dup=2&dup=3") + end +end + +describe Addressable::URI, "when form encoding a non-Array object" do + it "should raise a TypeError for objects than cannot be converted" do + expect do + Addressable::URI.form_encode(42) + end.to raise_error(TypeError) + end +end + +# See https://tools.ietf.org/html/rfc6749#appendix-B +describe Addressable::URI, "when form encoding the example value from OAuth 2" do + it "should result in correct values" do + expect(Addressable::URI.form_encode( + {"value" => " %&+£€"} + )).to eq("value=+%25%26%2B%C2%A3%E2%82%AC") + end +end + +# See https://tools.ietf.org/html/rfc6749#appendix-B +describe Addressable::URI, "when form unencoding the example value from OAuth 2" do + it "should result in correct values" do + expect(Addressable::URI.form_unencode( + "value=+%25%26%2B%C2%A3%E2%82%AC" + )).to eq([["value", " %&+£€"]]) + end +end + +describe Addressable::URI, "when form unencoding a string" do + it "should result in correct values" do + expect(Addressable::URI.form_unencode( + "%26one=%2F1&%3Dtwo=%3F2&%3Athree=%233" + )).to eq([["&one", "/1"], ["=two", "?2"], [":three", "#3"]]) + end + + it "should result in correct values" do + expect(Addressable::URI.form_unencode( + "q=one+two+three" + )).to eq([["q", "one two three"]]) + end + + it "should result in correct values" do + expect(Addressable::URI.form_unencode( + "text=one%0D%0Atwo%0D%0Athree%0D%0Afour%0D%0A%0D%0A" + )).to eq([["text", "one\ntwo\nthree\nfour\n\n"]]) + end + + it "should result in correct values" do + expect(Addressable::URI.form_unencode( + "a=1&dup=2&dup=3" + )).to eq([["a", "1"], ["dup", "2"], ["dup", "3"]]) + end + + it "should result in correct values" do + expect(Addressable::URI.form_unencode( + "key" + )).to eq([["key", nil]]) + end + + it "should result in correct values" do + expect(Addressable::URI.form_unencode("GivenName=Ren%C3%A9")).to eq( + [["GivenName", "René"]] + ) + end +end + +describe Addressable::URI, "when form unencoding a non-String object" do + it "should correctly parse anything with a 'to_str' method" do + Addressable::URI.form_unencode(SuperString.new(42)) + end + + it "should raise a TypeError for objects than cannot be converted" do + expect do + Addressable::URI.form_unencode(42) + end.to raise_error(TypeError) + end +end + +describe Addressable::URI, "when normalizing a non-String object" do + it "should correctly parse anything with a 'to_str' method" do + Addressable::URI.normalize_component(SuperString.new(42)) + end + + it "should raise a TypeError for objects than cannot be converted" do + expect do + Addressable::URI.normalize_component(42) + end.to raise_error(TypeError) + end + + it "should raise a TypeError for objects than cannot be converted" do + expect do + Addressable::URI.normalize_component("component", 42) + end.to raise_error(TypeError) + end +end + +describe Addressable::URI, "when normalizing a path with an encoded slash" do + it "should result in correct percent encoded sequence" do + expect(Addressable::URI.parse("/path%2Fsegment/").normalize.path).to eq( + "/path%2Fsegment/" + ) + end +end + +describe Addressable::URI, "when normalizing a partially encoded string" do + it "should result in correct percent encoded sequence" do + expect(Addressable::URI.normalize_component( + "partially % encoded%21" + )).to eq("partially%20%25%20encoded!") + end + + it "should result in correct percent encoded sequence" do + expect(Addressable::URI.normalize_component( + "partially %25 encoded!" + )).to eq("partially%20%25%20encoded!") + end +end + +describe Addressable::URI, "when normalizing a unicode sequence" do + it "should result in correct percent encoded sequence" do + expect(Addressable::URI.normalize_component( + "/C%CC%A7" + )).to eq("/%C3%87") + end + + it "should result in correct percent encoded sequence" do + expect(Addressable::URI.normalize_component( + "/%C3%87" + )).to eq("/%C3%87") + end +end + +describe Addressable::URI, "when normalizing a multibyte string" do + it "should result in correct percent encoded sequence" do + expect(Addressable::URI.normalize_component("günther")).to eq( + "g%C3%BCnther" + ) + end + + it "should result in correct percent encoded sequence" do + expect(Addressable::URI.normalize_component("g%C3%BCnther")).to eq( + "g%C3%BCnther" + ) + end +end + +describe Addressable::URI, "when normalizing a string but leaving some characters encoded" do + it "should result in correct percent encoded sequence" do + expect(Addressable::URI.normalize_component("%58X%59Y%5AZ", "0-9a-zXY", "Y")).to eq( + "XX%59Y%5A%5A" + ) + end + + it "should not modify the character class" do + character_class = "0-9a-zXY" + + character_class_copy = character_class.dup + + Addressable::URI.normalize_component("%58X%59Y%5AZ", character_class, "Y") + + expect(character_class).to eq(character_class_copy) + end +end + +describe Addressable::URI, "when encoding IP literals" do + it "should work for IPv4" do + input = "http://127.0.0.1/" + expect(Addressable::URI.encode(input)).to eq(input) + end + + it "should work for IPv6" do + input = "http://[fe80::200:f8ff:fe21:67cf]/" + expect(Addressable::URI.encode(input)).to eq(input) + end +end + +describe Addressable::URI, "when encoding a string with existing encodings to upcase" do + it "should result in correct percent encoded sequence" do + expect(Addressable::URI.encode_component("JK%4c", "0-9A-IKM-Za-z%", "L")).to eq("%4AK%4C") + end +end + +describe Addressable::URI, "when encoding a multibyte string" do + it "should result in correct percent encoded sequence" do + expect(Addressable::URI.encode_component("günther")).to eq("g%C3%BCnther") + end + + it "should result in correct percent encoded sequence" do + expect(Addressable::URI.encode_component( + "günther", /[^a-zA-Z0-9\:\/\?\#\[\]\@\!\$\&\'\(\)\*\+\,\;\=\-\.\_\~]/ + )).to eq("g%C3%BCnther") + end +end + +describe Addressable::URI, "when form encoding a multibyte string" do + it "should result in correct percent encoded sequence" do + expect(Addressable::URI.form_encode({"GivenName" => "René"})).to eq( + "GivenName=Ren%C3%A9" + ) + end +end + +describe Addressable::URI, "when encoding a string with ASCII chars 0-15" do + it "should result in correct percent encoded sequence" do + expect(Addressable::URI.encode_component("one\ntwo")).to eq("one%0Atwo") + end + + it "should result in correct percent encoded sequence" do + expect(Addressable::URI.encode_component( + "one\ntwo", /[^a-zA-Z0-9\:\/\?\#\[\]\@\!\$\&\'\(\)\*\+\,\;\=\-\.\_\~]/ + )).to eq("one%0Atwo") + end +end + +describe Addressable::URI, "when unencoding a multibyte string" do + it "should result in correct percent encoded sequence" do + expect(Addressable::URI.unencode_component("g%C3%BCnther")).to eq("günther") + end + + it "should consistently use UTF-8 internally" do + expect(Addressable::URI.unencode_component("ski=%BA%DAɫ")).to eq("ski=\xBA\xDAɫ") + end + + it "should result in correct percent encoded sequence as a URI" do + expect(Addressable::URI.unencode( + "/path?g%C3%BCnther", ::Addressable::URI + )).to eq(Addressable::URI.new( + :path => "/path", :query => "günther" + )) + end +end + +describe Addressable::URI, "when partially unencoding a string" do + it "should unencode all characters by default" do + expect(Addressable::URI.unencode('%%25~%7e+%2b', String)).to eq('%%~~++') + end + + it "should unencode characters not in leave_encoded" do + expect(Addressable::URI.unencode('%%25~%7e+%2b', String, '~')).to eq('%%~%7e++') + end + + it "should leave characters in leave_encoded alone" do + expect(Addressable::URI.unencode('%%25~%7e+%2b', String, '%~+')).to eq('%%25~%7e+%2b') + end +end + +describe Addressable::URI, "when unencoding a bogus object" do + it "should raise a TypeError" do + expect do + Addressable::URI.unencode_component(42) + end.to raise_error(TypeError) + end + + it "should raise a TypeError" do + expect do + Addressable::URI.unencode("/path?g%C3%BCnther", Integer) + end.to raise_error(TypeError) + end +end + +describe Addressable::URI, "when encoding a bogus object" do + it "should raise a TypeError" do + expect do + Addressable::URI.encode(Object.new) + end.to raise_error(TypeError) + end + + it "should raise a TypeError" do + expect do + Addressable::URI.normalized_encode(Object.new) + end.to raise_error(TypeError) + end + + it "should raise a TypeError" do + expect do + Addressable::URI.encode_component("günther", Object.new) + end.to raise_error(TypeError) + end + + it "should raise a TypeError" do + expect do + Addressable::URI.encode_component(Object.new) + end.to raise_error(TypeError) + end +end + +describe Addressable::URI, "when given the input " + + "'http://example.com/'" do + before do + @input = "http://example.com/" + end + + it "should heuristically parse to 'http://example.com/'" do + @uri = Addressable::URI.heuristic_parse(@input) + expect(@uri.to_s).to eq("http://example.com/") + end + + it "should not raise error when frozen" do + expect do + Addressable::URI.heuristic_parse(@input).freeze.to_s + end.not_to raise_error + end +end + +describe Addressable::URI, "when given the input " + + "'https://example.com/'" do + before do + @input = "https://example.com/" + end + + it "should heuristically parse to 'https://example.com/'" do + @uri = Addressable::URI.heuristic_parse(@input) + expect(@uri.to_s).to eq("https://example.com/") + end +end + +describe Addressable::URI, "when given the input " + + "'http:example.com/'" do + before do + @input = "http:example.com/" + end + + it "should heuristically parse to 'http://example.com/'" do + @uri = Addressable::URI.heuristic_parse(@input) + expect(@uri.to_s).to eq("http://example.com/") + end + + it "should heuristically parse to 'http://example.com/' " + + "even with a scheme hint of 'ftp'" do + @uri = Addressable::URI.heuristic_parse(@input, {:scheme => 'ftp'}) + expect(@uri.to_s).to eq("http://example.com/") + end +end + +describe Addressable::URI, "when given the input " + + "'https:example.com/'" do + before do + @input = "https:example.com/" + end + + it "should heuristically parse to 'https://example.com/'" do + @uri = Addressable::URI.heuristic_parse(@input) + expect(@uri.to_s).to eq("https://example.com/") + end + + it "should heuristically parse to 'https://example.com/' " + + "even with a scheme hint of 'ftp'" do + @uri = Addressable::URI.heuristic_parse(@input, {:scheme => 'ftp'}) + expect(@uri.to_s).to eq("https://example.com/") + end +end + +describe Addressable::URI, "when given the input " + + "'http://example.com/example.com/'" do + before do + @input = "http://example.com/example.com/" + end + + it "should heuristically parse to 'http://example.com/example.com/'" do + @uri = Addressable::URI.heuristic_parse(@input) + expect(@uri.to_s).to eq("http://example.com/example.com/") + end +end + +describe Addressable::URI, "when given the input " + + "'http://prefix\\.example.com/'" do + before do + @input = "http://prefix\\.example.com/" + end + + it "should heuristically parse to 'http://prefix/.example.com/'" do + @uri = Addressable::URI.heuristic_parse(@input) + expect(@uri.authority).to eq("prefix") + expect(@uri.to_s).to eq("http://prefix/.example.com/") + end + + it "should heuristically parse to 'http://prefix/.example.com/' " + + "even with a scheme hint of 'ftp'" do + @uri = Addressable::URI.heuristic_parse(@input, {:scheme => 'ftp'}) + expect(@uri.to_s).to eq("http://prefix/.example.com/") + end +end + +describe Addressable::URI, "when given the input " + + "'http://p:\\/'" do + before do + @input = "http://p:\\/" + end + + it "should heuristically parse to 'http://p//'" do + @uri = Addressable::URI.heuristic_parse(@input) + expect(@uri.authority).to eq("p") + expect(@uri.to_s).to eq("http://p//") + end + + it "should heuristically parse to 'http://p//' " + + "even with a scheme hint of 'ftp'" do + @uri = Addressable::URI.heuristic_parse(@input, {:scheme => 'ftp'}) + expect(@uri.to_s).to eq("http://p//") + end +end + +describe Addressable::URI, "when given the input " + + "'http://p://'" do + before do + @input = "http://p://" + end + + it "should heuristically parse to 'http://p//'" do + @uri = Addressable::URI.heuristic_parse(@input) + expect(@uri.authority).to eq("p") + expect(@uri.to_s).to eq("http://p//") + end + + it "should heuristically parse to 'http://p//' " + + "even with a scheme hint of 'ftp'" do + @uri = Addressable::URI.heuristic_parse(@input, {:scheme => 'ftp'}) + expect(@uri.to_s).to eq("http://p//") + end +end + +describe Addressable::URI, "when given the input " + + "'http://p://p'" do + before do + @input = "http://p://p" + end + + it "should heuristically parse to 'http://p//p'" do + @uri = Addressable::URI.heuristic_parse(@input) + expect(@uri.authority).to eq("p") + expect(@uri.to_s).to eq("http://p//p") + end + + it "should heuristically parse to 'http://p//p' " + + "even with a scheme hint of 'ftp'" do + @uri = Addressable::URI.heuristic_parse(@input, {:scheme => 'ftp'}) + expect(@uri.to_s).to eq("http://p//p") + end +end + +describe Addressable::URI, "when given the input " + + "'http://prefix .example.com/'" do + before do + @input = "http://prefix .example.com/" + end + + # Justification here being that no browser actually tries to resolve this. + # They all treat this as a web search. + it "should heuristically parse to 'http://prefix%20.example.com/'" do + @uri = Addressable::URI.heuristic_parse(@input) + expect(@uri.authority).to eq("prefix%20.example.com") + expect(@uri.to_s).to eq("http://prefix%20.example.com/") + end + + it "should heuristically parse to 'http://prefix%20.example.com/' " + + "even with a scheme hint of 'ftp'" do + @uri = Addressable::URI.heuristic_parse(@input, {:scheme => 'ftp'}) + expect(@uri.to_s).to eq("http://prefix%20.example.com/") + end +end + +describe Addressable::URI, "when given the input " + + "' http://www.example.com/ '" do + before do + @input = " http://www.example.com/ " + end + + it "should heuristically parse to 'http://prefix%20.example.com/'" do + @uri = Addressable::URI.heuristic_parse(@input) + expect(@uri.scheme).to eq("http") + expect(@uri.path).to eq("/") + expect(@uri.to_s).to eq("http://www.example.com/") + end +end + +describe Addressable::URI, "when given the input " + + "'http://prefix%2F.example.com/'" do + before do + @input = "http://prefix%2F.example.com/" + end + + it "should heuristically parse to 'http://prefix%2F.example.com/'" do + @uri = Addressable::URI.heuristic_parse(@input) + expect(@uri.authority).to eq("prefix%2F.example.com") + expect(@uri.to_s).to eq("http://prefix%2F.example.com/") + end + + it "should heuristically parse to 'http://prefix%2F.example.com/' " + + "even with a scheme hint of 'ftp'" do + @uri = Addressable::URI.heuristic_parse(@input, {:scheme => 'ftp'}) + expect(@uri.to_s).to eq("http://prefix%2F.example.com/") + end +end + +describe Addressable::URI, "when given the input " + + "'/path/to/resource'" do + before do + @input = "/path/to/resource" + end + + it "should heuristically parse to '/path/to/resource'" do + @uri = Addressable::URI.heuristic_parse(@input) + expect(@uri.to_s).to eq("/path/to/resource") + end +end + +describe Addressable::URI, "when given the input " + + "'relative/path/to/resource'" do + before do + @input = "relative/path/to/resource" + end + + it "should heuristically parse to 'relative/path/to/resource'" do + @uri = Addressable::URI.heuristic_parse(@input) + expect(@uri.to_s).to eq("relative/path/to/resource") + end +end + +describe Addressable::URI, "when given the input " + + "'example.com'" do + before do + @input = "example.com" + end + + it "should heuristically parse to 'http://example.com'" do + @uri = Addressable::URI.heuristic_parse(@input) + expect(@uri.to_s).to eq("http://example.com") + end +end + +describe Addressable::URI, "when given the input " + + "'example.com' and a scheme hint of 'ftp'" do + before do + @input = "example.com" + @hints = {:scheme => 'ftp'} + end + + it "should heuristically parse to 'http://example.com'" do + @uri = Addressable::URI.heuristic_parse(@input, @hints) + expect(@uri.to_s).to eq("ftp://example.com") + end +end + +describe Addressable::URI, "when given the input " + + "'example.com:21' and a scheme hint of 'ftp'" do + before do + @input = "example.com:21" + @hints = {:scheme => 'ftp'} + end + + it "should heuristically parse to 'http://example.com:21'" do + @uri = Addressable::URI.heuristic_parse(@input, @hints) + expect(@uri.to_s).to eq("ftp://example.com:21") + end +end + +describe Addressable::URI, "when given the input " + + "'example.com/path/to/resource'" do + before do + @input = "example.com/path/to/resource" + end + + it "should heuristically parse to 'http://example.com/path/to/resource'" do + @uri = Addressable::URI.heuristic_parse(@input) + expect(@uri.to_s).to eq("http://example.com/path/to/resource") + end +end + +describe Addressable::URI, "when given the input " + + "'http:///example.com'" do + before do + @input = "http:///example.com" + end + + it "should heuristically parse to 'http://example.com'" do + @uri = Addressable::URI.heuristic_parse(@input) + expect(@uri.to_s).to eq("http://example.com") + end +end + +describe Addressable::URI, "when given the input which "\ + "start with digits and has specified port" do + before do + @input = "7777.example.org:8089" + end + + it "should heuristically parse to 'http://7777.example.org:8089'" do + uri = Addressable::URI.heuristic_parse(@input) + expect(uri.to_s).to eq("http://7777.example.org:8089") + end +end + +describe Addressable::URI, "when given the input " + + "'feed:///example.com'" do + before do + @input = "feed:///example.com" + end + + it "should heuristically parse to 'feed://example.com'" do + @uri = Addressable::URI.heuristic_parse(@input) + expect(@uri.to_s).to eq("feed://example.com") + end +end + +describe Addressable::URI, "when given the input " + + "'file://localhost/path/to/resource/'" do + before do + @input = "file://localhost/path/to/resource/" + end + + it "should heuristically parse to 'file:///path/to/resource/'" do + @uri = Addressable::URI.heuristic_parse(@input) + expect(@uri.to_s).to eq("file:///path/to/resource/") + end +end + +describe Addressable::URI, "when given the input " + + "'file://path/to/resource/'" do + before do + @input = "file://path/to/resource/" + end + + it "should heuristically parse to 'file:///path/to/resource/'" do + @uri = Addressable::URI.heuristic_parse(@input) + expect(@uri.to_s).to eq("file:///path/to/resource/") + end +end + +describe Addressable::URI, "when given the input " + + "'file://///path/to/resource/'" do + before do + @input = "file:///////path/to/resource/" + end + + it "should heuristically parse to 'file:////path/to/resource/'" do + @uri = Addressable::URI.heuristic_parse(@input) + expect(@uri.to_s).to eq("file:////path/to/resource/") + end +end + +describe Addressable::URI, "when given the input " + + "'feed://http://example.com'" do + before do + @input = "feed://http://example.com" + end + + it "should heuristically parse to 'feed:http://example.com'" do + @uri = Addressable::URI.heuristic_parse(@input) + expect(@uri.to_s).to eq("feed:http://example.com") + end +end + +describe Addressable::URI, "when given the input " + + "::URI.parse('http://example.com')" do + before do + @input = ::URI.parse('http://example.com') + end + + it "should heuristically parse to 'http://example.com'" do + @uri = Addressable::URI.heuristic_parse(@input) + expect(@uri.to_s).to eq("http://example.com") + end +end + +describe Addressable::URI, "when given the input: 'user@domain.com'" do + before do + @input = "user@domain.com" + end + + context "for heuristic parse" do + it "should remain 'mailto:user@domain.com'" do + uri = Addressable::URI.heuristic_parse("mailto:#{@input}") + expect(uri.to_s).to eq("mailto:user@domain.com") + end + + it "should have a scheme of 'mailto'" do + uri = Addressable::URI.heuristic_parse(@input) + expect(uri.to_s).to eq("mailto:user@domain.com") + expect(uri.scheme).to eq("mailto") + end + + it "should remain 'acct:user@domain.com'" do + uri = Addressable::URI.heuristic_parse("acct:#{@input}") + expect(uri.to_s).to eq("acct:user@domain.com") + end + + context "HTTP" do + before do + @uri = Addressable::URI.heuristic_parse("http://#{@input}/") + end + + it "should remain 'http://user@domain.com/'" do + expect(@uri.to_s).to eq("http://user@domain.com/") + end + + it "should have the username 'user' for HTTP basic authentication" do + expect(@uri.user).to eq("user") + end + end + end +end + +describe Addressable::URI, "when assigning query values" do + before do + @uri = Addressable::URI.new + end + + it "should correctly assign {:a => 'a', :b => ['c', 'd', 'e']}" do + @uri.query_values = {:a => "a", :b => ["c", "d", "e"]} + expect(@uri.query).to eq("a=a&b=c&b=d&b=e") + end + + it "should raise an error attempting to assign {'a' => {'b' => ['c']}}" do + expect do + @uri.query_values = { 'a' => {'b' => ['c'] } } + end.to raise_error(TypeError) + end + + it "should raise an error attempting to assign " + + "{:b => '2', :a => {:c => '1'}}" do + expect do + @uri.query_values = {:b => '2', :a => {:c => '1'}} + end.to raise_error(TypeError) + end + + it "should raise an error attempting to assign " + + "{:a => 'a', :b => [{:c => 'c', :d => 'd'}, " + + "{:e => 'e', :f => 'f'}]}" do + expect do + @uri.query_values = { + :a => "a", :b => [{:c => "c", :d => "d"}, {:e => "e", :f => "f"}] + } + end.to raise_error(TypeError) + end + + it "should raise an error attempting to assign " + + "{:a => 'a', :b => [{:c => true, :d => 'd'}, " + + "{:e => 'e', :f => 'f'}]}" do + expect do + @uri.query_values = { + :a => 'a', :b => [{:c => true, :d => 'd'}, {:e => 'e', :f => 'f'}] + } + end.to raise_error(TypeError) + end + + it "should raise an error attempting to assign " + + "{:a => 'a', :b => {:c => true, :d => 'd'}}" do + expect do + @uri.query_values = { + :a => 'a', :b => {:c => true, :d => 'd'} + } + end.to raise_error(TypeError) + end + + it "should raise an error attempting to assign " + + "{:a => 'a', :b => {:c => true, :d => 'd'}}" do + expect do + @uri.query_values = { + :a => 'a', :b => {:c => true, :d => 'd'} + } + end.to raise_error(TypeError) + end + + it "should correctly assign {:a => 1, :b => 1.5}" do + @uri.query_values = { :a => 1, :b => 1.5 } + expect(@uri.query).to eq("a=1&b=1.5") + end + + it "should raise an error attempting to assign " + + "{:z => 1, :f => [2, {999.1 => [3,'4']}, ['h', 'i']], " + + ":a => {:b => ['c', 'd'], :e => true, :y => 0.5}}" do + expect do + @uri.query_values = { + :z => 1, + :f => [ 2, {999.1 => [3,'4']}, ['h', 'i'] ], + :a => { :b => ['c', 'd'], :e => true, :y => 0.5 } + } + end.to raise_error(TypeError) + end + + it "should correctly assign {}" do + @uri.query_values = {} + expect(@uri.query).to eq('') + end + + it "should correctly assign nil" do + @uri.query_values = nil + expect(@uri.query).to eq(nil) + end + + it "should correctly sort {'ab' => 'c', :ab => 'a', :a => 'x'}" do + @uri.query_values = {'ab' => 'c', :ab => 'a', :a => 'x'} + expect(@uri.query).to eq("a=x&ab=a&ab=c") + end + + it "should correctly assign " + + "[['b', 'c'], ['b', 'a'], ['a', 'a']]" do + # Order can be guaranteed in this format, so preserve it. + @uri.query_values = [['b', 'c'], ['b', 'a'], ['a', 'a']] + expect(@uri.query).to eq("b=c&b=a&a=a") + end + + it "should preserve query string order" do + query_string = (('a'..'z').to_a.reverse.map { |e| "#{e}=#{e}" }).join("&") + @uri.query = query_string + original_uri = @uri.to_s + @uri.query_values = @uri.query_values(Array) + expect(@uri.to_s).to eq(original_uri) + end + + describe 'when a hash with mixed types is assigned to query_values' do + it 'should not raise an error' do + skip 'Issue #94' + expect { subject.query_values = { "page" => "1", :page => 2 } }.to_not raise_error + end + end +end + +describe Addressable::URI, "when assigning path values" do + before do + @uri = Addressable::URI.new + end + + it "should correctly assign paths containing colons" do + @uri.path = "acct:bob@sporkmonger.com" + expect(@uri.path).to eq("acct:bob@sporkmonger.com") + expect(@uri.normalize.to_str).to eq("acct%2Fbob@sporkmonger.com") + expect { @uri.to_s }.to raise_error( + Addressable::URI::InvalidURIError + ) + end + + it "should correctly assign paths containing colons" do + @uri.path = "/acct:bob@sporkmonger.com" + @uri.authority = "example.com" + expect(@uri.normalize.to_str).to eq("//example.com/acct:bob@sporkmonger.com") + end + + it "should correctly assign paths containing colons" do + @uri.path = "acct:bob@sporkmonger.com" + @uri.scheme = "something" + expect(@uri.normalize.to_str).to eq("something:acct:bob@sporkmonger.com") + end + + it "should not allow relative paths to be assigned on absolute URIs" do + expect do + @uri.scheme = "http" + @uri.host = "example.com" + @uri.path = "acct:bob@sporkmonger.com" + end.to raise_error(Addressable::URI::InvalidURIError) + end + + it "should not allow relative paths to be assigned on absolute URIs" do + expect do + @uri.path = "acct:bob@sporkmonger.com" + @uri.scheme = "http" + @uri.host = "example.com" + end.to raise_error(Addressable::URI::InvalidURIError) + end + + it "should not allow relative paths to be assigned on absolute URIs" do + expect do + @uri.path = "uuid:0b3ecf60-3f93-11df-a9c3-001f5bfffe12" + @uri.scheme = "urn" + end.not_to raise_error + end +end + +describe Addressable::URI, "when initializing a subclass of Addressable::URI" do + before do + @uri = Class.new(Addressable::URI).new + end + + it "should have the same class after being parsed" do + expect(@uri.class).to eq(Addressable::URI.parse(@uri).class) + end + + it "should have the same class as its duplicate" do + expect(@uri.class).to eq(@uri.dup.class) + end + + it "should have the same class after being normalized" do + expect(@uri.class).to eq(@uri.normalize.class) + end + + it "should have the same class after being merged" do + expect(@uri.class).to eq(@uri.merge(:path => 'path').class) + end + + it "should have the same class after being joined" do + expect(@uri.class).to eq(@uri.join('path').class) + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/addressable-2.8.0/spec/spec_helper.rb b/vendor/bundle/ruby/3.1.0/gems/addressable-2.8.0/spec/spec_helper.rb new file mode 100644 index 000000000..bd8e39588 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/addressable-2.8.0/spec/spec_helper.rb @@ -0,0 +1,33 @@ +# frozen_string_literal: true + +require 'bundler/setup' +require 'rspec/its' + +begin + require 'coveralls' + Coveralls.wear! do + add_filter "spec/" + add_filter "vendor/" + end +rescue LoadError + warn "warning: coveralls gem not found; skipping Coveralls" + require 'simplecov' + SimpleCov.start do + add_filter "spec/" + add_filter "vendor/" + end +end if Gem.loaded_specs.key?("simplecov") + +class TestHelper + def self.native_supported? + mri = RUBY_ENGINE == "ruby" + windows = RUBY_PLATFORM.include?("mingw") + + mri && !windows + end +end + +RSpec.configure do |config| + config.warnings = true + config.filter_run_when_matching :focus +end diff --git a/vendor/bundle/ruby/3.1.0/gems/addressable-2.8.0/tasks/clobber.rake b/vendor/bundle/ruby/3.1.0/gems/addressable-2.8.0/tasks/clobber.rake new file mode 100644 index 000000000..a9e32b347 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/addressable-2.8.0/tasks/clobber.rake @@ -0,0 +1,4 @@ +# frozen_string_literal: true + +desc "Remove all build products" +task "clobber" diff --git a/vendor/bundle/ruby/3.1.0/gems/addressable-2.8.0/tasks/gem.rake b/vendor/bundle/ruby/3.1.0/gems/addressable-2.8.0/tasks/gem.rake new file mode 100644 index 000000000..1f793baf3 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/addressable-2.8.0/tasks/gem.rake @@ -0,0 +1,92 @@ +# frozen_string_literal: true + +require "rubygems/package_task" + +namespace :gem do + GEM_SPEC = Gem::Specification.new do |s| + s.name = PKG_NAME + s.version = PKG_VERSION + s.summary = PKG_SUMMARY + s.description = PKG_DESCRIPTION + + s.files = PKG_FILES.to_a + + s.extra_rdoc_files = %w( README.md ) + s.rdoc_options.concat ["--main", "README.md"] + + if !s.respond_to?(:add_development_dependency) + puts "Cannot build Gem with this version of RubyGems." + exit(1) + end + + s.required_ruby_version = ">= 2.0" + + s.add_runtime_dependency "public_suffix", ">= 2.0.2", "< 5.0" + s.add_development_dependency "bundler", ">= 1.0", "< 3.0" + + s.require_path = "lib" + + s.author = "Bob Aman" + s.email = "bob@sporkmonger.com" + s.homepage = "https://github.com/sporkmonger/addressable" + s.license = "Apache-2.0" + end + + Gem::PackageTask.new(GEM_SPEC) do |p| + p.gem_spec = GEM_SPEC + p.need_tar = true + p.need_zip = true + end + + desc "Generates .gemspec file" + task :gemspec do + spec_string = GEM_SPEC.to_ruby + File.open("#{GEM_SPEC.name}.gemspec", "w") do |file| + file.write spec_string + end + end + + desc "Show information about the gem" + task :debug do + puts GEM_SPEC.to_ruby + end + + desc "Install the gem" + task :install => ["clobber", "gem:package"] do + sh "#{SUDO} gem install --local pkg/#{GEM_SPEC.full_name}" + end + + desc "Uninstall the gem" + task :uninstall do + installed_list = Gem.source_index.find_name(PKG_NAME) + if installed_list && + (installed_list.collect { |s| s.version.to_s}.include?(PKG_VERSION)) + sh( + "#{SUDO} gem uninstall --version '#{PKG_VERSION}' " + + "--ignore-dependencies --executables #{PKG_NAME}" + ) + end + end + + desc "Reinstall the gem" + task :reinstall => [:uninstall, :install] + + desc "Package for release" + task :release => ["gem:package", "gem:gemspec"] do |t| + v = ENV["VERSION"] or abort "Must supply VERSION=x.y.z" + abort "Versions don't match #{v} vs #{PROJ.version}" if v != PKG_VERSION + pkg = "pkg/#{GEM_SPEC.full_name}" + + changelog = File.open("CHANGELOG.md") { |file| file.read } + + puts "Releasing #{PKG_NAME} v. #{PKG_VERSION}" + Rake::Task["git:tag:create"].invoke + end +end + +desc "Alias to gem:package" +task "gem" => "gem:package" + +task "gem:release" => "gem:gemspec" + +task "clobber" => ["gem:clobber_package"] diff --git a/vendor/bundle/ruby/3.1.0/gems/addressable-2.8.0/tasks/git.rake b/vendor/bundle/ruby/3.1.0/gems/addressable-2.8.0/tasks/git.rake new file mode 100644 index 000000000..1238c8d21 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/addressable-2.8.0/tasks/git.rake @@ -0,0 +1,47 @@ +# frozen_string_literal: true + +namespace :git do + namespace :tag do + desc "List tags from the Git repository" + task :list do + tags = `git tag -l` + tags.gsub!("\r", "") + tags = tags.split("\n").sort {|a, b| b <=> a } + puts tags.join("\n") + end + + desc "Create a new tag in the Git repository" + task :create do + changelog = File.open("CHANGELOG.md", "r") { |file| file.read } + puts "-" * 80 + puts changelog + puts "-" * 80 + puts + + v = ENV["VERSION"] or abort "Must supply VERSION=x.y.z" + abort "Versions don't match #{v} vs #{PKG_VERSION}" if v != PKG_VERSION + + git_status = `git status` + if git_status !~ /^nothing to commit/ + abort "Working directory isn't clean." + end + + tag = "#{PKG_NAME}-#{PKG_VERSION}" + msg = "Release #{PKG_NAME}-#{PKG_VERSION}" + + existing_tags = `git tag -l #{PKG_NAME}-*`.split('\n') + if existing_tags.include?(tag) + warn("Tag already exists, deleting...") + unless system "git tag -d #{tag}" + abort "Tag deletion failed." + end + end + puts "Creating git tag '#{tag}'..." + unless system "git tag -a -m \"#{msg}\" #{tag}" + abort "Tag creation failed." + end + end + end +end + +task "gem:release" => "git:tag:create" diff --git a/vendor/bundle/ruby/3.1.0/gems/addressable-2.8.0/tasks/metrics.rake b/vendor/bundle/ruby/3.1.0/gems/addressable-2.8.0/tasks/metrics.rake new file mode 100644 index 000000000..107cc2442 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/addressable-2.8.0/tasks/metrics.rake @@ -0,0 +1,24 @@ +# frozen_string_literal: true + +namespace :metrics do + task :lines do + lines, codelines, total_lines, total_codelines = 0, 0, 0, 0 + for file_name in FileList["lib/**/*.rb"] + f = File.open(file_name) + while line = f.gets + lines += 1 + next if line =~ /^\s*$/ + next if line =~ /^\s*#/ + codelines += 1 + end + puts "L: #{sprintf("%4d", lines)}, " + + "LOC #{sprintf("%4d", codelines)} | #{file_name}" + total_lines += lines + total_codelines += codelines + + lines, codelines = 0, 0 + end + + puts "Total: Lines #{total_lines}, LOC #{total_codelines}" + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/addressable-2.8.0/tasks/profile.rake b/vendor/bundle/ruby/3.1.0/gems/addressable-2.8.0/tasks/profile.rake new file mode 100644 index 000000000..b697d489d --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/addressable-2.8.0/tasks/profile.rake @@ -0,0 +1,72 @@ +# frozen_string_literal: true + +namespace :profile do + desc "Profile Template match memory allocations" + task :template_match_memory do + require "memory_profiler" + require "addressable/template" + + start_at = Time.now.to_f + template = Addressable::Template.new("http://example.com/{?one,two,three}") + report = MemoryProfiler.report do + 30_000.times do + template.match( + "http://example.com/?one=one&two=floo&three=me" + ) + end + end + end_at = Time.now.to_f + print_options = { scale_bytes: true, normalize_paths: true } + puts "\n\n" + + if ENV["CI"] + report.pretty_print(print_options) + else + t_allocated = report.scale_bytes(report.total_allocated_memsize) + t_retained = report.scale_bytes(report.total_retained_memsize) + + puts "Total allocated: #{t_allocated} (#{report.total_allocated} objects)" + puts "Total retained: #{t_retained} (#{report.total_retained} objects)" + puts "Took #{end_at - start_at} seconds" + + FileUtils.mkdir_p("tmp") + report.pretty_print(to_file: "tmp/memprof.txt", **print_options) + end + end + + desc "Profile URI parse memory allocations" + task :memory do + require "memory_profiler" + require "addressable/uri" + if ENV["IDNA_MODE"] == "pure" + Addressable.send(:remove_const, :IDNA) + load "addressable/idna/pure.rb" + end + + start_at = Time.now.to_f + report = MemoryProfiler.report do + 30_000.times do + Addressable::URI.parse( + "http://google.com/stuff/../?with_lots=of¶ms=asdff#!stuff" + ).normalize + end + end + end_at = Time.now.to_f + print_options = { scale_bytes: true, normalize_paths: true } + puts "\n\n" + + if ENV["CI"] + report.pretty_print(**print_options) + else + t_allocated = report.scale_bytes(report.total_allocated_memsize) + t_retained = report.scale_bytes(report.total_retained_memsize) + + puts "Total allocated: #{t_allocated} (#{report.total_allocated} objects)" + puts "Total retained: #{t_retained} (#{report.total_retained} objects)" + puts "Took #{end_at - start_at} seconds" + + FileUtils.mkdir_p("tmp") + report.pretty_print(to_file: "tmp/memprof.txt", **print_options) + end + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/addressable-2.8.0/tasks/rspec.rake b/vendor/bundle/ruby/3.1.0/gems/addressable-2.8.0/tasks/rspec.rake new file mode 100644 index 000000000..e3d9f014c --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/addressable-2.8.0/tasks/rspec.rake @@ -0,0 +1,23 @@ +# frozen_string_literal: true + +require "rspec/core/rake_task" + +namespace :spec do + RSpec::Core::RakeTask.new(:simplecov) do |t| + t.pattern = FileList['spec/**/*_spec.rb'] + t.rspec_opts = %w[--color --format documentation] unless ENV["CI"] + end + + namespace :simplecov do + desc "Browse the code coverage report." + task :browse => "spec:simplecov" do + require "launchy" + Launchy.open("coverage/index.html") + end + end +end + +desc "Alias to spec:simplecov" +task "spec" => "spec:simplecov" + +task "clobber" => ["spec:clobber_simplecov"] diff --git a/vendor/bundle/ruby/3.1.0/gems/addressable-2.8.0/tasks/yard.rake b/vendor/bundle/ruby/3.1.0/gems/addressable-2.8.0/tasks/yard.rake new file mode 100644 index 000000000..515f96030 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/addressable-2.8.0/tasks/yard.rake @@ -0,0 +1,29 @@ +# frozen_string_literal: true + +require "rake" + +begin + require "yard" + require "yard/rake/yardoc_task" + + namespace :doc do + desc "Generate Yardoc documentation" + YARD::Rake::YardocTask.new do |yardoc| + yardoc.name = "yard" + yardoc.options = ["--verbose", "--markup", "markdown"] + yardoc.files = FileList[ + "lib/**/*.rb", "ext/**/*.c", + "README.md", "CHANGELOG.md", "LICENSE.txt" + ].exclude(/idna/) + end + end + + task "clobber" => ["doc:clobber_yard"] + + desc "Alias to doc:yard" + task "doc" => "doc:yard" +rescue LoadError + # If yard isn't available, it's not the end of the world + desc "Alias to doc:rdoc" + task "doc" => "doc:rdoc" +end diff --git a/vendor/bundle/ruby/3.1.0/gems/ast-2.4.2/LICENSE.MIT b/vendor/bundle/ruby/3.1.0/gems/ast-2.4.2/LICENSE.MIT new file mode 100644 index 000000000..7c483cf2c --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/ast-2.4.2/LICENSE.MIT @@ -0,0 +1,20 @@ +Copyright (c) 2011-2013 Peter Zotov + +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/vendor/bundle/ruby/3.1.0/gems/ast-2.4.2/README.YARD.md b/vendor/bundle/ruby/3.1.0/gems/ast-2.4.2/README.YARD.md new file mode 100644 index 000000000..d2616c3d8 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/ast-2.4.2/README.YARD.md @@ -0,0 +1,12 @@ +{AST} is a library for manipulating abstract syntax trees. + +It embraces immutability; each AST node is inherently frozen at +creation, and updating a child node requires recreating that node +and its every parent, recursively. + +This is a design choice. It does create some pressure on +garbage collector, but completely eliminates all concurrency +and aliasing problems. + +See also {AST::Node}, {AST::Processor::Mixin} and {AST::Sexp} for +additional recommendations and design patterns. diff --git a/vendor/bundle/ruby/3.1.0/gems/ast-2.4.2/lib/ast.rb b/vendor/bundle/ruby/3.1.0/gems/ast-2.4.2/lib/ast.rb new file mode 100644 index 000000000..acbcf741d --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/ast-2.4.2/lib/ast.rb @@ -0,0 +1,17 @@ +# {AST} is a library for manipulating abstract syntax trees. +# +# It embraces immutability; each AST node is inherently frozen at +# creation, and updating a child node requires recreating that node +# and its every parent, recursively. +# This is a design choice. It does create some pressure on +# garbage collector, but completely eliminates all concurrency +# and aliasing problems. +# +# See also {AST::Node}, {AST::Processor::Mixin} and {AST::Sexp} for +# additional recommendations and design patterns. +# +module AST + require 'ast/node' + require 'ast/processor' + require 'ast/sexp' +end diff --git a/vendor/bundle/ruby/3.1.0/gems/ast-2.4.2/lib/ast/node.rb b/vendor/bundle/ruby/3.1.0/gems/ast-2.4.2/lib/ast/node.rb new file mode 100644 index 000000000..432d865a4 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/ast-2.4.2/lib/ast/node.rb @@ -0,0 +1,268 @@ +# frozen_string_literal: true + +module AST + # Node is an immutable class, instances of which represent abstract + # syntax tree nodes. It combines semantic information (i.e. anything + # that affects the algorithmic properties of a program) with + # meta-information (line numbers or compiler intermediates). + # + # Notes on inheritance + # ==================== + # + # The distinction between semantics and metadata is important. Complete + # semantic information should be contained within just the {#type} and + # {#children} of a Node instance; in other words, if an AST was to be + # stripped of all meta-information, it should remain a valid AST which + # could be successfully processed to yield a result with the same + # algorithmic properties. + # + # Thus, Node should never be inherited in order to define methods which + # affect or return semantic information, such as getters for `class_name`, + # `superclass` and `body` in the case of a hypothetical `ClassNode`. The + # correct solution is to use a generic Node with a {#type} of `:class` + # and three children. See also {Processor} for tips on working with such + # ASTs. + # + # On the other hand, Node can and should be inherited to define + # application-specific metadata (see also {#initialize}) or customize the + # printing format. It is expected that an application would have one or two + # such classes and use them across the entire codebase. + # + # The rationale for this pattern is extensibility and maintainability. + # Unlike static ones, dynamic languages do not require the presence of a + # predefined, rigid structure, nor does it improve dispatch efficiency, + # and while such a structure can certainly be defined, it does not add + # any value but incurs a maintaining cost. + # For example, extending the AST even with a transformation-local + # temporary node type requires making globally visible changes to + # the codebase. + # + class Node + # Returns the type of this node. + # @return [Symbol] + attr_reader :type + + # Returns the children of this node. + # The returned value is frozen. + # The to_a alias is useful for decomposing nodes concisely. + # For example: + # + # node = s(:gasgn, :$foo, s(:integer, 1)) + # var_name, value = *node + # p var_name # => :$foo + # p value # => (integer 1) + # + # @return [Array] + attr_reader :children + alias to_a children + + # Returns the precomputed hash value for this node + # @return [Fixnum] + attr_reader :hash + + # Constructs a new instance of Node. + # + # The arguments `type` and `children` are converted with `to_sym` and + # `to_a` respectively. Additionally, the result of converting `children` + # is frozen. While mutating the arguments is generally considered harmful, + # the most common case is to pass an array literal to the constructor. If + # your code does not expect the argument to be frozen, use `#dup`. + # + # The `properties` hash is passed to {#assign_properties}. + def initialize(type, children=[], properties={}) + @type, @children = type.to_sym, children.to_a.freeze + + assign_properties(properties) + + @hash = [@type, @children, self.class].hash + + freeze + end + + # Test if other object is equal to + # @param [Object] other + # @return [Boolean] + def eql?(other) + self.class.eql?(other.class) && + @type.eql?(other.type) && + @children.eql?(other.children) + end + + # By default, each entry in the `properties` hash is assigned to + # an instance variable in this instance of Node. A subclass should define + # attribute readers for such variables. The values passed in the hash + # are not frozen or whitelisted; such behavior can also be implemented + # by subclassing Node and overriding this method. + # + # @return [nil] + def assign_properties(properties) + properties.each do |name, value| + instance_variable_set :"@#{name}", value + end + + nil + end + protected :assign_properties + + alias :original_dup :dup + private :original_dup + + # Nodes are already frozen, so there is no harm in returning the + # current node as opposed to initializing from scratch and freezing + # another one. + # + # @return self + def dup + self + end + alias :clone :dup + + # Returns a new instance of Node where non-nil arguments replace the + # corresponding fields of `self`. + # + # For example, `Node.new(:foo, [ 1, 2 ]).updated(:bar)` would yield + # `(bar 1 2)`, and `Node.new(:foo, [ 1, 2 ]).updated(nil, [])` would + # yield `(foo)`. + # + # If the resulting node would be identical to `self`, does nothing. + # + # @param [Symbol, nil] type + # @param [Array, nil] children + # @param [Hash, nil] properties + # @return [AST::Node] + def updated(type=nil, children=nil, properties=nil) + new_type = type || @type + new_children = children || @children + new_properties = properties || {} + + if @type == new_type && + @children == new_children && + properties.nil? + self + else + copy = original_dup + copy.send :initialize, new_type, new_children, new_properties + copy + end + end + + # Compares `self` to `other`, possibly converting with `to_ast`. Only + # `type` and `children` are compared; metadata is deliberately ignored. + # + # @return [Boolean] + def ==(other) + if equal?(other) + true + elsif other.respond_to? :to_ast + other = other.to_ast + other.type == self.type && + other.children == self.children + else + false + end + end + + # Concatenates `array` with `children` and returns the resulting node. + # + # @return [AST::Node] + def concat(array) + updated(nil, @children + array.to_a) + end + + alias + concat + + # Appends `element` to `children` and returns the resulting node. + # + # @return [AST::Node] + def append(element) + updated(nil, @children + [element]) + end + + alias << append + + # Converts `self` to a pretty-printed s-expression. + # + # @param [Integer] indent Base indentation level. + # @return [String] + def to_sexp(indent=0) + indented = " " * indent + sexp = "#{indented}(#{fancy_type}" + + children.each do |child| + if child.is_a?(Node) + sexp += "\n#{child.to_sexp(indent + 1)}" + else + sexp += " #{child.inspect}" + end + end + + sexp += ")" + + sexp + end + + alias to_s to_sexp + + # Converts `self` to a s-expression ruby string. + # The code return will recreate the node, using the sexp module s() + # + # @param [Integer] indent Base indentation level. + # @return [String] + def inspect(indent=0) + indented = " " * indent + sexp = "#{indented}s(:#{@type}" + + children.each do |child| + if child.is_a?(Node) + sexp += ",\n#{child.inspect(indent + 1)}" + else + sexp += ", #{child.inspect}" + end + end + + sexp += ")" + + sexp + end + + # @return [AST::Node] self + def to_ast + self + end + + # Converts `self` to an Array where the first element is the type as a Symbol, + # and subsequent elements are the same representation of its children. + # + # @return [Array] + def to_sexp_array + children_sexp_arrs = children.map do |child| + if child.is_a?(Node) + child.to_sexp_array + else + child + end + end + + [type, *children_sexp_arrs] + end + + # Enables matching for Node, where type is the first element + # and the children are remaining items. + # + # @return [Array] + def deconstruct + [type, *children] + end + + protected + + # Returns `@type` with all underscores replaced by dashes. This allows + # to write symbol literals without quotes in Ruby sources and yet have + # nicely looking s-expressions. + # + # @return [String] + def fancy_type + @type.to_s.gsub('_', '-') + end + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/ast-2.4.2/lib/ast/processor.rb b/vendor/bundle/ruby/3.1.0/gems/ast-2.4.2/lib/ast/processor.rb new file mode 100644 index 000000000..f1910c515 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/ast-2.4.2/lib/ast/processor.rb @@ -0,0 +1,12 @@ +module AST + # This class includes {AST::Processor::Mixin}; however, it is + # deprecated, since the module defines all of the behaviors that + # the processor includes. Any new libraries should use + # {AST::Processor::Mixin} instead of subclassing this. + # + # @deprecated Use {AST::Processor::Mixin} instead. + class Processor + require 'ast/processor/mixin' + include Mixin + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/ast-2.4.2/lib/ast/processor/mixin.rb b/vendor/bundle/ruby/3.1.0/gems/ast-2.4.2/lib/ast/processor/mixin.rb new file mode 100644 index 000000000..6febec879 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/ast-2.4.2/lib/ast/processor/mixin.rb @@ -0,0 +1,288 @@ +module AST + class Processor + # The processor module is a module which helps transforming one + # AST into another. In a nutshell, the {#process} method accepts + # a {Node} and dispatches it to a handler corresponding to its + # type, and returns a (possibly) updated variant of the node. + # + # The processor module has a set of associated design patterns. + # They are best explained with a concrete example. Let's define a + # simple arithmetic language and an AST format for it: + # + # Terminals (AST nodes which do not have other AST nodes inside): + # + # * `(integer )`, + # + # Nonterminals (AST nodes with other nodes as children): + # + # * `(add )`, + # * `(multiply )`, + # * `(divide )`, + # * `(negate )`, + # * `(store )`: stores value of `` + # into a variable named ``, + # * `(load )`: loads value of a variable named + # ``, + # * `(each ...)`: computes each of the ``s and + # prints the result. + # + # All AST nodes have the same Ruby class, and therefore they don't + # know how to traverse themselves. (A solution which dynamically + # checks the type of children is possible, but is slow and + # error-prone.) So, a class including the module which knows how + # to traverse the entire tree should be defined. Such classes + # have a handler for each nonterminal node which recursively + # processes children nodes: + # + # require 'ast' + # + # class ArithmeticsProcessor + # include AST::Processor::Mixin + # # This method traverses any binary operators such as (add) + # # or (multiply). + # def process_binary_op(node) + # # Children aren't decomposed automatically; it is + # # suggested to use Ruby multiple assignment expansion, + # # as it is very convenient here. + # left_expr, right_expr = *node + # + # # AST::Node#updated won't change node type if nil is + # # passed as a first argument, which allows to reuse the + # # same handler for multiple node types using `alias' + # # (below). + # node.updated(nil, [ + # process(left_expr), + # process(right_expr) + # ]) + # end + # alias_method :on_add, :process_binary_op + # alias_method :on_multiply, :process_binary_op + # alias_method :on_divide, :process_binary_op + # + # def on_negate(node) + # # It is also possible to use #process_all for more + # # compact code if every child is a Node. + # node.updated(nil, process_all(node)) + # end + # + # def on_store(node) + # expr, variable_name = *node + # + # # Note that variable_name is not a Node and thus isn't + # # passed to #process. + # node.updated(nil, [ + # process(expr), + # variable_name + # ]) + # end + # + # # (load) is effectively a terminal node, and so it does + # # not need an explicit handler, as the following is the + # # default behavior. Essentially, for any nodes that don't + # # have a defined handler, the node remains unchanged. + # def on_load(node) + # nil + # end + # + # def on_each(node) + # node.updated(nil, process_all(node)) + # end + # end + # + # Let's test our ArithmeticsProcessor: + # + # include AST::Sexp + # expr = s(:add, s(:integer, 2), s(:integer, 2)) + # + # p ArithmeticsProcessor.new.process(expr) == expr # => true + # + # As expected, it does not change anything at all. This isn't + # actually very useful, so let's now define a Calculator, which + # will compute the expression values: + # + # # This Processor folds nonterminal nodes and returns an + # # (integer) terminal node. + # class ArithmeticsCalculator < ArithmeticsProcessor + # def compute_op(node) + # # First, node children are processed and then unpacked + # # to local variables. + # nodes = process_all(node) + # + # if nodes.all? { |node| node.type == :integer } + # # If each of those nodes represents a literal, we can + # # fold this node! + # values = nodes.map { |node| node.children.first } + # AST::Node.new(:integer, [ + # yield(values) + # ]) + # else + # # Otherwise, we can just leave the current node in the + # # tree and only update it with processed children + # # nodes, which can be partially folded. + # node.updated(nil, nodes) + # end + # end + # + # def on_add(node) + # compute_op(node) { |left, right| left + right } + # end + # + # def on_multiply(node) + # compute_op(node) { |left, right| left * right } + # end + # end + # + # Let's check: + # + # p ArithmeticsCalculator.new.process(expr) # => (integer 4) + # + # Excellent, the calculator works! Now, a careful reader could + # notice that the ArithmeticsCalculator does not know how to + # divide numbers. What if we pass an expression with division to + # it? + # + # expr_with_division = \ + # s(:add, + # s(:integer, 1), + # s(:divide, + # s(:add, s(:integer, 8), s(:integer, 4)), + # s(:integer, 3))) # 1 + (8 + 4) / 3 + # + # folded_expr_with_division = ArithmeticsCalculator.new.process(expr_with_division) + # p folded_expr_with_division + # # => (add + # # (integer 1) + # # (divide + # # (integer 12) + # # (integer 3))) + # + # As you can see, the expression was folded _partially_: the inner + # `(add)` node which could be computed was folded to + # `(integer 12)`, the `(divide)` node is left as-is because there + # is no computing handler for it, and the root `(add)` node was + # also left as it is because some of its children were not + # literals. + # + # Note that this partial folding is only possible because the + # _data_ format, i.e. the format in which the computed values of + # the nodes are represented, is the same as the AST itself. + # + # Let's extend our ArithmeticsCalculator class further. + # + # class ArithmeticsCalculator + # def on_divide(node) + # compute_op(node) { |left, right| left / right } + # end + # + # def on_negate(node) + # # Note how #compute_op works regardless of the operator + # # arity. + # compute_op(node) { |value| -value } + # end + # end + # + # Now, let's apply our renewed ArithmeticsCalculator to a partial + # result of previous evaluation: + # + # p ArithmeticsCalculator.new.process(expr_with_division) # => (integer 5) + # + # Five! Excellent. This is also pretty much how CRuby 1.8 executed + # its programs. + # + # Now, let's do some automated bug searching. Division by zero is + # an error, right? So if we could detect that someone has divided + # by zero before the program is even run, that could save some + # debugging time. + # + # class DivisionByZeroVerifier < ArithmeticsProcessor + # class VerificationFailure < Exception; end + # + # def on_divide(node) + # # You need to process the children to handle nested divisions + # # such as: + # # (divide + # # (integer 1) + # # (divide (integer 1) (integer 0)) + # left, right = process_all(node) + # + # if right.type == :integer && + # right.children.first == 0 + # raise VerificationFailure, "Ouch! This code divides by zero." + # end + # end + # + # def divides_by_zero?(ast) + # process(ast) + # false + # rescue VerificationFailure + # true + # end + # end + # + # nice_expr = \ + # s(:divide, + # s(:add, s(:integer, 10), s(:integer, 2)), + # s(:integer, 4)) + # + # p DivisionByZeroVerifier.new.divides_by_zero?(nice_expr) + # # => false. Good. + # + # bad_expr = \ + # s(:add, s(:integer, 10), + # s(:divide, s(:integer, 1), s(:integer, 0))) + # + # p DivisionByZeroVerifier.new.divides_by_zero?(bad_expr) + # # => true. WHOOPS. DO NOT RUN THIS. + # + # Of course, this won't detect more complex cases... unless you + # use some partial evaluation before! The possibilites are + # endless. Have fun. + module Mixin + # Dispatches `node`. If a node has type `:foo`, then a handler + # named `on_foo` is invoked with one argument, the `node`; if + # there isn't such a handler, {#handler_missing} is invoked + # with the same argument. + # + # If the handler returns `nil`, `node` is returned; otherwise, + # the return value of the handler is passed along. + # + # @param [AST::Node, nil] node + # @return [AST::Node, nil] + def process(node) + return if node.nil? + + node = node.to_ast + + # Invoke a specific handler + on_handler = :"on_#{node.type}" + if respond_to? on_handler + new_node = send on_handler, node + else + new_node = handler_missing(node) + end + + node = new_node if new_node + + node + end + + # {#process}es each node from `nodes` and returns an array of + # results. + # + # @param [Array] nodes + # @return [Array] + def process_all(nodes) + nodes.to_a.map do |node| + process node + end + end + + # Default handler. Does nothing. + # + # @param [AST::Node] node + # @return [AST::Node, nil] + def handler_missing(node) + end + end + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/ast-2.4.2/lib/ast/sexp.rb b/vendor/bundle/ruby/3.1.0/gems/ast-2.4.2/lib/ast/sexp.rb new file mode 100644 index 000000000..9b03d26c8 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/ast-2.4.2/lib/ast/sexp.rb @@ -0,0 +1,30 @@ +module AST + # This simple module is very useful in the cases where one needs + # to define deeply nested ASTs from Ruby code, for example, in + # tests. It should be used like this: + # + # describe YourLanguage::AST do + # include Sexp + # + # it "should correctly parse expressions" do + # YourLanguage.parse("1 + 2 * 3").should == + # s(:add, + # s(:integer, 1), + # s(:multiply, + # s(:integer, 2), + # s(:integer, 3))) + # end + # end + # + # This way the amount of boilerplate code is greatly reduced. + module Sexp + # Creates a {Node} with type `type` and children `children`. + # Note that the resulting node is of the type AST::Node and not a + # subclass. + # This would not pose a problem with comparisons, as {Node#==} + # ignores metadata. + def s(type, *children) + Node.new(type, children) + end + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/crack-0.4.5/lib/crack.rb b/vendor/bundle/ruby/3.1.0/gems/crack-0.4.5/lib/crack.rb new file mode 100644 index 000000000..a211d2a13 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/crack-0.4.5/lib/crack.rb @@ -0,0 +1,7 @@ +module Crack + class ParseError < StandardError; end +end + +require 'crack/util' +require 'crack/json' +require 'crack/xml' diff --git a/vendor/bundle/ruby/3.1.0/gems/crack-0.4.5/lib/crack/json.rb b/vendor/bundle/ruby/3.1.0/gems/crack-0.4.5/lib/crack/json.rb new file mode 100644 index 000000000..1a27ac725 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/crack-0.4.5/lib/crack/json.rb @@ -0,0 +1,98 @@ +# Copyright (c) 2004-2008 David Heinemeier Hansson +# 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. + +require 'strscan' + +module Crack + class JSON + def self.parser_exceptions + @parser_exceptions ||= [ArgumentError, Psych::SyntaxError] + end + + def self.parse(json) + yaml = unescape(convert_json_to_yaml(json)) + YAML.safe_load(yaml, [Regexp, Date, Time]) + rescue *parser_exceptions + raise ParseError, "Invalid JSON string" + rescue Psych::DisallowedClass + yaml + end + + protected + def self.unescape(str) + # Force the encoding to be UTF-8 so we can perform regular expressions + # on 1.9.2 without blowing up. + # see http://stackoverflow.com/questions/1224204/ruby-mechanize-getting-force-encoding-exception for a similar issue + str.force_encoding('UTF-8') if defined?(Encoding) && str.respond_to?(:force_encoding) + str.gsub(/\\u0000/, "").gsub(/\\[u|U]([0-9a-fA-F]{4})/) { [$1.hex].pack("U") } + end + + # matches YAML-formatted dates + DATE_REGEX = /^\d{4}-\d{2}-\d{2}$|^\d{4}-\d{1,2}-\d{1,2}[T \t]+\d{1,2}:\d{2}:\d{2}(\.[0-9]*)?(([ \t]*)Z|[-+]\d{2}?(:\d{2})?)$/ + + # Ensure that ":" and "," are always followed by a space + def self.convert_json_to_yaml(json) #:nodoc: + json = String.new(json) #can't modify a frozen string + scanner, quoting, marks, pos, date_starts, date_ends = StringScanner.new(json), false, [], nil, [], [] + while scanner.scan_until(/(\\['"]|['":,\/\\]|\\.)/) + case char = scanner[1] + when '"', "'" + if !quoting + quoting = char + pos = scanner.pos + elsif quoting == char + if json[pos..scanner.pos-2] =~ DATE_REGEX + # found a date, track the exact positions of the quotes so we can remove them later. + # oh, and increment them for each current mark, each one is an extra padded space that bumps + # the position in the final YAML output + total_marks = marks.size + date_starts << pos+total_marks + date_ends << scanner.pos+total_marks + end + quoting = false + end + when "/" + if !quoting + json[scanner.pos - 1] = "!ruby/regexp /" + scanner.pos += 13 + scanner.scan_until(/\/[mix]*/) + end + when ":","," + marks << scanner.pos - 1 unless quoting + when "\\" + scanner.skip(/\\/) + end + end + + if marks.empty? + json.gsub(/\\\//, '/') + else + left_pos = marks.clone.unshift(-1) + right_pos = marks << json.length + output = [] + left_pos.each_with_index do |left, i| + output << json[left.succ..right_pos[i]] + end + output = output * " " + + format_dates(output, date_starts, date_ends) + output.gsub!(/\\\//, '/') + output + end + end + + def self.format_dates(output, date_starts, date_ends) + if YAML.constants.include?('Syck') + (date_starts + date_ends).each { |i| output[i-1] = ' ' } + else + extra_chars_to_be_added = 0 + date_starts.each do |i| + output[i-2+extra_chars_to_be_added] = '!!timestamp ' + extra_chars_to_be_added += 10 + end + end + end + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/crack-0.4.5/lib/crack/util.rb b/vendor/bundle/ruby/3.1.0/gems/crack-0.4.5/lib/crack/util.rb new file mode 100644 index 000000000..60c944283 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/crack-0.4.5/lib/crack/util.rb @@ -0,0 +1,17 @@ +module Crack + module Util + def snake_case(str) + return str.downcase if str =~ /^[A-Z]+$/ + str.gsub(/([A-Z]+)(?=[A-Z][a-z]?)|\B[A-Z]/, '_\&') =~ /_*(.*)/ + return $+.downcase + end + + def to_xml_attributes(hash) + hash.map do |k,v| + %{#{Crack::Util.snake_case(k.to_s).sub(/^(.{1,1})/) { |m| m.downcase }}="#{v.to_s.gsub('"', '"')}"} + end.join(' ') + end + + extend self + end +end \ No newline at end of file diff --git a/vendor/bundle/ruby/3.1.0/gems/crack-0.4.5/lib/crack/version.rb b/vendor/bundle/ruby/3.1.0/gems/crack-0.4.5/lib/crack/version.rb new file mode 100644 index 000000000..1991c2419 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/crack-0.4.5/lib/crack/version.rb @@ -0,0 +1,3 @@ +module Crack + VERSION = "0.4.5" +end diff --git a/vendor/bundle/ruby/3.1.0/gems/crack-0.4.5/lib/crack/xml.rb b/vendor/bundle/ruby/3.1.0/gems/crack-0.4.5/lib/crack/xml.rb new file mode 100644 index 000000000..698568918 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/crack-0.4.5/lib/crack/xml.rb @@ -0,0 +1,238 @@ +require 'rexml/parsers/streamparser' +require 'rexml/parsers/baseparser' +require 'rexml/light/node' +require 'rexml/text' +require "rexml/document" +require 'date' +require 'time' +require 'yaml' +require 'bigdecimal' + +# The Reason behind redefining the String Class for this specific plugin is to +# avoid the dynamic insertion of stuff on it (see version previous to this commit). +# Doing that disables the possibility of efectuating a dump on the structure. This way it goes. +class REXMLUtiliyNodeString < String + attr_accessor :attributes +end + +# This is a slighly modified version of the XMLUtilityNode from +# http://merb.devjavu.com/projects/merb/ticket/95 (has.sox@gmail.com) +# It's mainly just adding vowels, as I ht cd wth n vwls :) +# This represents the hard part of the work, all I did was change the +# underlying parser. +class REXMLUtilityNode #:nodoc: + attr_accessor :name, :attributes, :children, :type + + def self.typecasts + @@typecasts + end + + def self.typecasts=(obj) + @@typecasts = obj + end + + def self.available_typecasts + @@available_typecasts + end + + def self.available_typecasts=(obj) + @@available_typecasts = obj + end + + self.typecasts = {} + self.typecasts["integer"] = lambda{|v| v.nil? ? nil : v.to_i} + self.typecasts["boolean"] = lambda{|v| v.nil? ? nil : (v.strip != "false")} + self.typecasts["datetime"] = lambda{|v| v.nil? ? nil : Time.parse(v).utc} + self.typecasts["date"] = lambda{|v| v.nil? ? nil : Date.parse(v)} + self.typecasts["dateTime"] = lambda{|v| v.nil? ? nil : Time.parse(v).utc} + self.typecasts["decimal"] = lambda{|v| v.nil? ? nil : BigDecimal(v.to_s)} + self.typecasts["double"] = lambda{|v| v.nil? ? nil : v.to_f} + self.typecasts["float"] = lambda{|v| v.nil? ? nil : v.to_f} + self.typecasts["string"] = lambda{|v| v.to_s} + self.typecasts["base64Binary"] = lambda{|v| v.unpack('m').first } + + self.available_typecasts = self.typecasts.keys + + def initialize(name, normalized_attributes = {}) + + # unnormalize attribute values + attributes = Hash[* normalized_attributes.map { |key, value| + [ key, unnormalize_xml_entities(value) ] + }.flatten] + + @name = name.tr("-", "_") + # leave the type alone if we don't know what it is + @type = self.class.available_typecasts.include?(attributes["type"]) ? attributes.delete("type") : attributes["type"] + + @nil_element = attributes.delete("nil") == "true" + @attributes = undasherize_keys(attributes) + @children = [] + @text = false + end + + def add_node(node) + @text = true if node.is_a? String + @children << node + end + + def to_hash + # ACG: Added a check here to prevent an exception a type == "file" tag has nodes within it + if @type == "file" and (@children.first.nil? or @children.first.is_a?(String)) + f = StringIO.new((@children.first || '').unpack('m').first) + class << f + attr_accessor :original_filename, :content_type + end + f.original_filename = attributes['name'] || 'untitled' + f.content_type = attributes['content_type'] || 'application/octet-stream' + return {name => f} + end + + if @text + t = typecast_value( unnormalize_xml_entities( inner_html ) ) + if t.is_a?(String) + t = REXMLUtiliyNodeString.new(t) + t.attributes = attributes + end + return { name => t } + else + #change repeating groups into an array + groups = @children.inject({}) { |s,e| (s[e.name] ||= []) << e; s } + + out = nil + if @type == "array" + out = [] + groups.each do |k, v| + if v.size == 1 + out << v.first.to_hash.entries.first.last + else + out << v.map{|e| e.to_hash[k]} + end + end + out = out.flatten + + else # If Hash + out = {} + groups.each do |k,v| + if v.size == 1 + out.merge!(v.first) + else + out.merge!( k => v.map{|e| e.to_hash[k]}) + end + end + out.merge! attributes unless attributes.empty? + out = out.empty? ? nil : out + end + + if @type && out.nil? + { name => typecast_value(out) } + else + { name => out } + end + end + end + + # Typecasts a value based upon its type. For instance, if + # +node+ has #type == "integer", + # {{[node.typecast_value("12") #=> 12]}} + # + # @param value The value that is being typecast. + # + # @details [:type options] + # "integer":: + # converts +value+ to an integer with #to_i + # "boolean":: + # checks whether +value+, after removing spaces, is the literal + # "true" + # "datetime":: + # Parses +value+ using Time.parse, and returns a UTC Time + # "date":: + # Parses +value+ using Date.parse + # + # @return + # The result of typecasting +value+. + # + # @note + # If +self+ does not have a "type" key, or if it's not one of the + # options specified above, the raw +value+ will be returned. + def typecast_value(value) + return value unless @type + proc = self.class.typecasts[@type] + proc.nil? ? value : proc.call(value) + end + + # Take keys of the form foo-bar and convert them to foo_bar + def undasherize_keys(params) + params.keys.each do |key, value| + params[key.tr("-", "_")] = params.delete(key) + end + params + end + + # Get the inner_html of the REXML node. + def inner_html + @children.join + end + + # Converts the node into a readable HTML node. + # + # @return The HTML node in text form. + def to_html + attributes.merge!(:type => @type ) if @type + "<#{name}#{Crack::Util.to_xml_attributes(attributes)}>#{@nil_element ? '' : inner_html}" + end + + # @alias #to_html #to_s + def to_s + to_html + end + + private + + def unnormalize_xml_entities value + REXML::Text.unnormalize(value) + end +end + +module Crack + class REXMLParser + def self.parse(xml) + stack = [] + parser = REXML::Parsers::BaseParser.new(xml) + + while true + event = parser.pull + case event[0] + when :end_document + break + when :end_doctype, :start_doctype + # do nothing + when :start_element + stack.push REXMLUtilityNode.new(event[1], event[2]) + when :end_element + if stack.size > 1 + temp = stack.pop + stack.last.add_node(temp) + end + when :text, :cdata + stack.last.add_node(event[1]) unless event[1].strip.length == 0 || stack.empty? + end + end + + stack.length > 0 ? stack.pop.to_hash : {} + end + end + + class XML + def self.parser + @@parser ||= REXMLParser + end + + def self.parser=(parser) + @@parser = parser + end + + def self.parse(xml) + parser.parse(xml) + end + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/diff-lcs-1.5.0/.rspec b/vendor/bundle/ruby/3.1.0/gems/diff-lcs-1.5.0/.rspec new file mode 100644 index 000000000..53607ea52 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/diff-lcs-1.5.0/.rspec @@ -0,0 +1 @@ +--colour diff --git a/vendor/bundle/ruby/3.1.0/gems/diff-lcs-1.5.0/Code-of-Conduct.md b/vendor/bundle/ruby/3.1.0/gems/diff-lcs-1.5.0/Code-of-Conduct.md new file mode 100644 index 000000000..d05f4bc06 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/diff-lcs-1.5.0/Code-of-Conduct.md @@ -0,0 +1,74 @@ +# Contributor Covenant Code of Conduct + +## Our Pledge + +In the interest of fostering an open and welcoming environment, we as +contributors and maintainers pledge to making participation in our project and +our community a harassment-free experience for everyone, regardless of age, body +size, disability, ethnicity, gender identity and expression, level of experience, +nationality, personal appearance, race, religion, or sexual identity and +orientation. + +## Our Standards + +Examples of behavior that contributes to creating a positive environment +include: + +* Using welcoming and inclusive language +* Being respectful of differing viewpoints and experiences +* Gracefully accepting constructive criticism +* Focusing on what is best for the community +* Showing empathy towards other community members + +Examples of unacceptable behavior by participants include: + +* The use of sexualized language or imagery and unwelcome sexual attention or +advances +* Trolling, insulting/derogatory comments, and personal or political attacks +* Public or private harassment +* Publishing others' private information, such as a physical or electronic + address, without explicit permission +* Other conduct which could reasonably be considered inappropriate in a + professional setting + +## Our Responsibilities + +Project maintainers are responsible for clarifying the standards of acceptable +behavior and are expected to take appropriate and fair corrective action in +response to any instances of unacceptable behavior. + +Project maintainers have the right and responsibility to remove, edit, or +reject comments, commits, code, wiki edits, issues, and other contributions +that are not aligned to this Code of Conduct, or to ban temporarily or +permanently any contributor for other behaviors that they deem inappropriate, +threatening, offensive, or harmful. + +## Scope + +This Code of Conduct applies both within project spaces and in public spaces +when an individual is representing the project or its community. Examples of +representing a project or community include using an official project e-mail +address, posting via an official social media account, or acting as an appointed +representative at an online or offline event. Representation of a project may be +further defined and clarified by project maintainers. + +## Enforcement + +Instances of abusive, harassing, or otherwise unacceptable behavior may be +reported by contacting the project team at [INSERT EMAIL ADDRESS]. All +complaints will be reviewed and investigated and will result in a response that +is deemed necessary and appropriate to the circumstances. The project team is +obligated to maintain confidentiality with regard to the reporter of an incident. +Further details of specific enforcement policies may be posted separately. + +Project maintainers who do not follow or enforce the Code of Conduct in good +faith may face temporary or permanent repercussions as determined by other +members of the project's leadership. + +## Attribution + +This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4, +available at [http://contributor-covenant.org/version/1/4][version] + +[homepage]: http://contributor-covenant.org +[version]: http://contributor-covenant.org/version/1/4/ diff --git a/vendor/bundle/ruby/3.1.0/gems/diff-lcs-1.5.0/Contributing.md b/vendor/bundle/ruby/3.1.0/gems/diff-lcs-1.5.0/Contributing.md new file mode 100644 index 000000000..425f49f68 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/diff-lcs-1.5.0/Contributing.md @@ -0,0 +1,119 @@ +## Contributing + +I value any contribution to Diff::LCS you can provide: a bug report, a +feature request, or code contributions. Code contributions to Diff::LCS are +especially welcomeencouraged. Because Diff::LCS is a complex +codebase, there are a few guidelines: + +- Code changes _will not_ be accepted without tests. The test suite is + written with [RSpec][]. +- Match my coding style. +- Use a thoughtfully-named topic branch that contains your change. Rebase + your commits into logical chunks as necessary. +- Use [quality commit messages][]. +- Do not change the version number; when your patch is accepted and a release + is made, the version will be updated at that point. +- Submit a GitHub pull request with your changes. +- New or changed behaviours require appropriate documentation. + +### Test Dependencies + +Diff::LCS uses Ryan Davis’s [Hoe][] to manage the release process, and it +adds a number of rake tasks. You will mostly be interested in: + +```sh +$ rake +``` + +which runs the tests the same way that: + +```sh +$ rake spec +``` + +will do. + +To assist with the installation of the development dependencies, I have +provided a Gemfile pointing to the (generated) `diff-lcs.gemspec` file. This +will permit you to do: + +```sh +$ bundle install +``` + +to get the development dependencies. If you aleady have `hoe` installed, you +can accomplish the same thing with: + +```sh +$ rake newb +``` + +This task will install any missing dependencies, run the tests/specs, and +generate the RDoc. + +You can run tests with code coverage analysis by running: + +```sh +$ rake spec:coverage +``` + +### Workflow + +Here's the most direct way to get your work merged into the project: + +- Fork the project. +- Clone down your fork (`git clone git://github.com//diff-lcs.git`). +- Create a topic branch to contain your change (`git checkout -b my_awesome_feature`). +- Hack away, add tests. Not necessarily in that order. +- Make sure everything still passes by running `rake`. +- If necessary, rebase your commits into logical chunks, without errors. +- Push the branch up (`git push origin my_awesome_feature`). +- Create a pull request against halostatue/diff-lcs and describe what your + change does and the why you think it should be merged. + +### Contributors + +- Austin Ziegler created Diff::LCS. + +Thanks to everyone else who has contributed code or bug reports to Diff::LCS: + +- @ginriki +- @joshbronson +- @kevinmook +- @mckaz +- Akinori Musha +- Artem Ignatyev +- Brandon Fish +- Camille Drapier +- Cédric Boutillier +- Gregg Kellogg +- Jagdeep Singh +- Jason Gladish +- Jon Rowe +- Josef Strzibny +- Josep (@apuratepp) +- Josh Bronson +- Jun Aruga +- Kenichi Kamiya +- Kensuke Nagae +- Kevin Ansfield +- Koichi Ito +- Mark Friedgan +- Michael Granger +- Myron Marston +- Nicolas Leger +- Oleg Orlov +- Paul Kunysch +- Pete Higgins +- Peter Wagenet +- Philippe Lafoucrière +- Ryan Lovelett +- Scott Steele +- Simon Courtois +- Tien (@tiendo1011) +- Tomas Jura +- Vít Ondruch + +[rspec]: http://rspec.info/documentation/ +[quality commit messages]: http://tbaggery.com/2008/04/19/a-note-about-git-commit-messages.html +[hoe]: https://github.com/seattlerb/hoe diff --git a/vendor/bundle/ruby/3.1.0/gems/diff-lcs-1.5.0/History.md b/vendor/bundle/ruby/3.1.0/gems/diff-lcs-1.5.0/History.md new file mode 100644 index 000000000..d426e9523 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/diff-lcs-1.5.0/History.md @@ -0,0 +1,400 @@ +# History + +## 1.5.0 / 2021-12-23 + +- Updated the CI configuration and monkey-patch Hoe. + +- Kenichi Kamiya fixed a test configuration deprecation in SimpleCov. [#69] + +- Tien introduced several corrections and code improvements: + + - Removed an off-by-one error when calculating an index value by embracing + Ruby iteration properly. This had a side-effect of fixing a long-standing + bug in `#traverse_sequences` where the traversal would not be transitive. + That is, `LCS(s2, s1)` should produce a sequence that is transitive with + `LCS(s1, s2)` on traversal, and applying the diff computed from those + results would result in equivalent changes that could be played forward or + backward as appropriate. [#71], [#75] + + - The above fix resulted in a changed order of the longest common subsequence + when callbacks were applied. After analysis, it was determined that the + computed subsequence was _equivalent_ to the prior version, so the test was + updated. This also resulted in the clarification of documentation when + traversing the subsequences. [#79] + + - An infinite loop case in the case where Diff::LCS would be included into an + enumerable class has been fixed. [#73] + + - Clarified the purpose of a threshold test in calculation of LCS. [#72], + [#80] + +- Removed autotest directory + +## 1.4.4 / 2020-07-01 + +- Fixed an issue reported by Jun Aruga in the Diff::LCS::Ldiff binary text + detection. [#44] + +- Fixed a theoretical issue reported by Jun Aruga in Diff::LCS::Hunk to raise + a more useful exception. [#43] + +- Added documentation that should address custom object issues as reported in + [#35]. + +- Fixed more diff errors, in part reported in [#65]. + + - The use of `Numeric#abs` is incorrect in `Diff::LCS::Block#diff_size`. The + diff size _must_ be accurate for correct change placement. + + - When selecting @max_diff_size in Diff::LCS::Hunk, choose it based on + `block.diff_size.abs`. + + - Made a number of changes that will, unfortunately, increase allocations at + the cost of being safe with frozen strings. + + - Add some knowledge that when `Diff::LCS::Hunk#diff` is called, that we are + processing the _last_ hunk, so some changes will be made to how the output + is generated. + + - `old`, `ed`, and `reverse_ed` formats have no differences. + + - `unified` format will report `\ No newline at end of file` given the + correct conditions, at most once. Unified range reporting also differs for + the last hunk such that the `length` of the range is reduced by one. + + - `context` format will report `\No newline at end of file` given the + correct conditions, up to once per "file". Context range reporting also + differs for the last hunk such that the `end` part of the range is reduced + by one to a minimum of one. + +- Added a bunch more tests for the cases above, and fixed `hunk_spec.rb` so that + the phrase being compared isn't nonsense French. + +- Updated formatting. + +- Added a Rake task to assist with manual testing on Ruby 1.8. + +## 1.4.3 / 2020-06-29 + +- Fixed several issues with the 1.4 on Rubies older than 2.0. Some of this was + providing useful shim functions to Hoe 3.x (which dropped these older Rubies + a while ago). Specifically: + + - Removed Array#lazy from a method in Diff::LCS::Hunk. + + - Changed some unit tests to use old-style Symbol-keyed hashes. + + - Changed some unit test helper functions to no longer use keyword parameters, + but only a trailing options hash. + + - Made the use of `psych` dependent on `RUBY_VERSION >= 1.9`. + + Resolves [#63]. + +## 1.4.2 / 2020-06-23 + +- Camille Drapier fixed a small issue with RuboCop configuration. [#59] + +- Applied another fix (and unit test) to fix an issue for the Chef team. + [#60], [#61] + +## 1.4.1 / 2020-06-23 + +- Fix an issue where diff sizes could be negative, and they should be. [#57], + [#58] + +## 1.4 / 2020-06-23 + +- Ruby versions lower than 2.4 are soft-deprecated and will not be run as part + of the CI process any longer. + +- Akinora MUSHA (knu) added the ability for Diff::LCS::Change objects to be + implicitly treated arrays. Originally provided as pull request [#47], but it + introduced a number of test failures as documented in [#48], and remediation + of Diff::LCS itself was introduced in [#49]. + +- Resolved [#5] with some tests comparing output from `system` calls to + `bin/ldiff` with some pre-generated output. Resolved [#6] with these tests. + +- Resolved a previously undetected `bin/ldiff` issue with `--context` output not + matching `diff --context` output. + +- Resolved an issue with later versions of Ruby not working with an `OptParse` + specification of `Numeric`; this has been changed to `Integer`. + +- Brandon Fish added truffleruby in [#52]. + +- Fixed two missing classes as reported in [#53]. + +## 1.3 / 2017-01-18 + +- Bugs fixed: + + - Fixed an error for bin/ldiff --version. Fixes issue [#21]. + + - Force Diff::LCS::Change and Diff::LCS::ContextChange to only perform + equality comparisons against themselves. Provided by Kevin Mook in pull + request [#29]. + + - Fix tab expansion in htmldiff, provided by Mark Friedgan in pull request + [#25]. + + - Silence Ruby 2.4 Fixnum deprecation warnings. Fixes issue [#38] and pull + request [#36]. + + - Ensure that test dependencies are loaded properly. Fixes issue [#33] and + pull request [#34]. + + - Fix issue [#1] with incorrect intuition of patch direction. Tentative fix, + but the previous failure cases pass now. + +- Tooling changes: + + - Added SimpleCov and Coveralls support. + + - Change the homepage (temporarily) to the GitHub repo. + + - Updated testing and gem infrastructure. + + - Modernized the specs. + +- Cleaned up documentation. + +- Added a Code of Conduct. + +## 1.2.5 / 2013-11-08 + +- Bugs fixed: + + - Comparing arrays flattened them too far, especially with Diff::LCS.sdiff. + Fixed by Josh Bronson in pull request [#23]. + +## 1.2.4 / 2013-04-20 + +- Bugs fixed: + + - A bug was introduced after 1.1.3 when pruning common sequences at the start + of comparison. Paul Kunysch (@pck) fixed this in pull request [#18]. Thanks! + + - The Rubinius (1.9 mode) bug in [rubinius/rubinius#2268] has been fixed by + the Rubinius team two days after it was filed. Thanks for fixing this so + quickly! + +- Switching to Raggi's hoe-gemspec2 for gemspec generation. + +## 1.2.3 / 2013-04-11 + +- Bugs Fixed: + + - The new encoding detection for diff output generation (added in 1.2.2) + introduced a bug if the left side of the comparison was the empty set. + Originally found in [rspec/rspec-expectations#238] and + [rspec/rspec-expectations#239]. Jon Rowe developed a reasonable heuristic + (left side, right side, empty string literal) to avoid this bug. + + - There is a known issue with Rubinius in 1.9 mode reported in + [rubinius/rubinius#2268] and demonstrated in the Travis CI builds. For all + other tested platforms, diff-lcs is considered stable. As soon as a suitably + small test-case can be created for the Rubinius team to examine, this will + be added to the Rubinius issue around this. + +## 1.2.2 / 2013-03-30 + +- Bugs Fixed: + + - Diff::LCS::Hunk could not properly generate a difference for comparison sets + that are not US-ASCII-compatible because of the use of literal regular + expressions and strings. Jon Rowe found this in + [rspec/rspec-expectations#219] and provided a first pass implementation in + pull request [#15]. I've reworked it because of test failures in Rubinius + when running in Ruby 1.9 mode. This coerces the added values to the encoding + of the old dataset (as determined by the first piece of the old dataset). + + - Adding Travis CI testing for Ruby 2.0. + +## 1.2.1 / 2013-02-09 + +- Bugs Fixed: + + - As seen in [rspec/rspec-expectations#200], the release of Diff::LCS 1.2 + introduced an unnecessary public API change to Diff::LCS::Hunk (see the + change at [rspec/rspec-expectations@3d6fc82c] for details). The new method + name (and behaviour) is more correct, but I should not have renamed the + function or should have at least provided an alias. This release restores + Diff::LCS::Hunk#unshift as an alias to #merge. Note that the old #unshift + behaviour was incorrect and will not be restored. + +## 1.2.0 / 2013-01-21 + +- Minor Enhancements: + + - Added special case handling for Diff::LCS.patch so that it handles patches + that are empty or contain no changes. + + - Added two new methods (#patch_me and #unpatch_me) to the includable module. + +- Bugs Fixed: + + - Fixed issue [#1] patch direction detection. + + - Resolved issue [#2] by handling `string[string.size, 1]` properly (it + returns `""` not `nil`). + + - Michael Granger (ged) fixed an implementation error in Diff::LCS::Change and + added specs in pull request [#8]. Thanks! + + - Made the code auto-testable. + + - Vít Ondruch (voxik) provided the latest version of the GPL2 license file in + pull request [#10]. Thanks! + + - Fixed a documentation issue with the includable versions of #patch! and + #unpatch! where they implied that they would replace the original value. + Given that Diff::LCS.patch always returns a copy, the documentation was + incorrect and has been corrected. To provide the behaviour that was + originally documented, two new methods were added to provide this behaviour. + Found by scooter-dangle in issue [#12]. Thanks! + +- Code Style Changes: + + - Removed trailing spaces. + + - Calling class methods using `.` instead of `::`. + + - Vít Ondruch (voxik) removed unnecessary shebangs in pull request [#9]. + Thanks! + + - Kenichi Kamiya (kachick) removed some warnings of an unused variable in + lucky pull request [#13]. Thanks! + + - Embarked on a major refactoring to make the files a little more manageable + and understand the code on a deeper level. + + - Adding to http://travis-ci.org. + +## 1.1.3 / 2011-08-27 + +- Converted to 'hoe' for release. + +- Converted tests to RSpec 2. + +- Extracted the body of htmldiff into a class available from diff/lcs/htmldiff. + +- Migrated development and issue tracking to GitHub. + +- Bugs fixed: + + - Eliminated the explicit use of RubyGems in both bin/htmldiff and bin/ldiff. + Resolves issue [#4]. + + - Eliminated Ruby warnings. Resolves issue [#3]. + +## 1.1.2 / 2004-10-20 + +- Fixed a problem reported by Mauricio Fernandez in htmldiff. + +## 1.1.1 / 2004-09-25 + +- Fixed bug #891 (Set returned from patch command does not contain last equal + part). + +- Fixed a problem with callback initialisation code (it assumed that all + callbacks passed as classes can be initialised; now, it rescues NoMethodError + in the event of private :new being called). + +- Modified the non-initialisable callbacks to have a private #new method. + +- Moved ldiff core code to Diff::LCS::Ldiff (diff/lcs/ldiff.rb). + +## 1.1.0 + +- Eliminated the need for Diff::LCS::Event and removed it. + +- Added a contextual diff callback, Diff::LCS::ContextDiffCallback. + +- Implemented patching/unpatching for standard Diff callback output formats with + both #diff and #sdiff. + +- Extensive documentation changes. + +## 1.0.4 + +- Fixed a problem with bin/ldiff output, especially for unified format. Newlines + that should have been present weren't. + +- Changed the .tar.gz installer to generate Windows batch files if ones do not + exist already. Removed the existing batch files as they didn't work. + +## 1.0.3 + +- Fixed a problem with #traverse_sequences where the first difference from the + left sequence might not be appropriately captured. + +## 1.0.2 + +- Fixed an issue with ldiff not working because actions were changed from + symbols to strings. + +## 1.0.1 + +- Minor modifications to the gemspec, the README. + +- Renamed the diff program to ldiff (as well as the companion batch file) so as + to not collide with the standard diff program. + +- Fixed issues with RubyGems. Requires RubyGems > 0.6.1 or >= 0.6.1 with the + latest CVS version. + +## 1.0 + +- Initial release based mostly on Perl's Algorithm::Diff. + +[rubinius/rubinius#2268]: https://github.com/rubinius/rubinius/issues/2268 +[rspec/rspec-expectations#239]: https://github.com/rspec/rspec-expectations/issues/239 +[rspec/rspec-expectations#238]: https://github.com/rspec/rspec-expectations/issues/238 +[rspec/rspec-expectations#219]: https://github.com/rspec/rspec-expectations/issues/219 +[rspec/rspec-expectations@3d6fc82c]: https://github.com/rspec/rspec-expectations/commit/3d6fc82c +[rspec/rspec-expectations#200]: https://github.com/rspec/rspec-expectations/pull/200 +[#1]: https://github.com/halostatue/diff-lcs/issues/1 +[#2]: https://github.com/halostatue/diff-lcs/issues/2 +[#3]: https://github.com/halostatue/diff-lcs/issues/3 +[#4]: https://github.com/halostatue/diff-lcs/issues/4 +[#5]: https://github.com/halostatue/diff-lcs/issues/5 +[#6]: https://github.com/halostatue/diff-lcs/issues/6 +[#8]: https://github.com/halostatue/diff-lcs/pull/8 +[#9]: https://github.com/halostatue/diff-lcs/pull/9 +[#10]: https://github.com/halostatue/diff-lcs/pull/10 +[#12]: https://github.com/halostatue/diff-lcs/issues/12 +[#13]: https://github.com/halostatue/diff-lcs/pull/13 +[#15]: https://github.com/halostatue/diff-lcs/pull/15 +[#18]: https://github.com/halostatue/diff-lcs/pull/18 +[#21]: https://github.com/halostatue/diff-lcs/issues/21 +[#23]: https://github.com/halostatue/diff-lcs/pull/23 +[#25]: https://github.com/halostatue/diff-lcs/pull/25 +[#29]: https://github.com/halostatue/diff-lcs/pull/29 +[#33]: https://github.com/halostatue/diff-lcs/issues/33 +[#34]: https://github.com/halostatue/diff-lcs/pull/34 +[#35]: https://github.com/halostatue/diff-lcs/issues/35 +[#36]: https://github.com/halostatue/diff-lcs/pull/36 +[#38]: https://github.com/halostatue/diff-lcs/issues/38 +[#43]: https://github.com/halostatue/diff-lcs/issues/43 +[#44]: https://github.com/halostatue/diff-lcs/issues/44 +[#47]: https://github.com/halostatue/diff-lcs/pull/47 +[#48]: https://github.com/halostatue/diff-lcs/issues/48 +[#49]: https://github.com/halostatue/diff-lcs/pull/49 +[#52]: https://github.com/halostatue/diff-lcs/pull/52 +[#53]: https://github.com/halostatue/diff-lcs/issues/53 +[#57]: https://github.com/halostatue/diff-lcs/issues/57 +[#58]: https://github.com/halostatue/diff-lcs/pull/58 +[#59]: https://github.com/halostatue/diff-lcs/pull/59 +[#60]: https://github.com/halostatue/diff-lcs/issues/60 +[#61]: https://github.com/halostatue/diff-lcs/pull/61 +[#63]: https://github.com/halostatue/diff-lcs/issues/63 +[#65]: https://github.com/halostatue/diff-lcs/issues/65 +[#69]: https://github.com/halostatue/diff-lcs/issues/69 +[#71]: https://github.com/halostatue/diff-lcs/issues/71 +[#72]: https://github.com/halostatue/diff-lcs/issues/72 +[#73]: https://github.com/halostatue/diff-lcs/issues/73 +[#75]: https://github.com/halostatue/diff-lcs/issues/75 +[#79]: https://github.com/halostatue/diff-lcs/issues/79 +[#80]: https://github.com/halostatue/diff-lcs/issues/80 diff --git a/vendor/bundle/ruby/3.1.0/gems/diff-lcs-1.5.0/License.md b/vendor/bundle/ruby/3.1.0/gems/diff-lcs-1.5.0/License.md new file mode 100644 index 000000000..63b763dda --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/diff-lcs-1.5.0/License.md @@ -0,0 +1,39 @@ +== License + +This software is available under three licenses: the GNU GPL version 2 (or at +your option, a later version), the Perl Artistic license, or the MIT license. +Note that my preference for licensing is the MIT license, but Algorithm::Diff +was dually originally licensed with the Perl Artistic and the GNU GPL ("the +same terms as Perl itself") and given that the Ruby implementation originally +hewed pretty closely to the Perl version, I must maintain the additional +licensing terms. + +* Copyright 2004–2013 Austin Ziegler. +* Adapted from Algorithm::Diff (Perl) by Ned Konz and a Smalltalk version by + Mario I. Wolczko. + +=== MIT License + +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. + +=== Perl Artistic License (version 2) +See the file docs/artistic.txt in the main distribution. + +=== GNU GPL version 2 +See the file docs/COPYING.txt in the main distribution. diff --git a/vendor/bundle/ruby/3.1.0/gems/diff-lcs-1.5.0/Manifest.txt b/vendor/bundle/ruby/3.1.0/gems/diff-lcs-1.5.0/Manifest.txt new file mode 100644 index 000000000..0d7dcb368 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/diff-lcs-1.5.0/Manifest.txt @@ -0,0 +1,59 @@ +.rspec +Code-of-Conduct.md +Contributing.md +History.md +License.md +Manifest.txt +README.rdoc +Rakefile +bin/htmldiff +bin/ldiff +docs/COPYING.txt +docs/artistic.txt +lib/diff-lcs.rb +lib/diff/lcs.rb +lib/diff/lcs/array.rb +lib/diff/lcs/backports.rb +lib/diff/lcs/block.rb +lib/diff/lcs/callbacks.rb +lib/diff/lcs/change.rb +lib/diff/lcs/htmldiff.rb +lib/diff/lcs/hunk.rb +lib/diff/lcs/internals.rb +lib/diff/lcs/ldiff.rb +lib/diff/lcs/string.rb +spec/change_spec.rb +spec/diff_spec.rb +spec/fixtures/aX +spec/fixtures/bXaX +spec/fixtures/ds1.csv +spec/fixtures/ds2.csv +spec/fixtures/ldiff/output.diff +spec/fixtures/ldiff/output.diff-c +spec/fixtures/ldiff/output.diff-e +spec/fixtures/ldiff/output.diff-f +spec/fixtures/ldiff/output.diff-u +spec/fixtures/ldiff/output.diff.chef +spec/fixtures/ldiff/output.diff.chef-c +spec/fixtures/ldiff/output.diff.chef-e +spec/fixtures/ldiff/output.diff.chef-f +spec/fixtures/ldiff/output.diff.chef-u +spec/fixtures/ldiff/output.diff.chef2 +spec/fixtures/ldiff/output.diff.chef2-c +spec/fixtures/ldiff/output.diff.chef2-d +spec/fixtures/ldiff/output.diff.chef2-e +spec/fixtures/ldiff/output.diff.chef2-f +spec/fixtures/ldiff/output.diff.chef2-u +spec/fixtures/new-chef +spec/fixtures/new-chef2 +spec/fixtures/old-chef +spec/fixtures/old-chef2 +spec/hunk_spec.rb +spec/issues_spec.rb +spec/lcs_spec.rb +spec/ldiff_spec.rb +spec/patch_spec.rb +spec/sdiff_spec.rb +spec/spec_helper.rb +spec/traverse_balanced_spec.rb +spec/traverse_sequences_spec.rb diff --git a/vendor/bundle/ruby/3.1.0/gems/diff-lcs-1.5.0/README.rdoc b/vendor/bundle/ruby/3.1.0/gems/diff-lcs-1.5.0/README.rdoc new file mode 100644 index 000000000..609242457 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/diff-lcs-1.5.0/README.rdoc @@ -0,0 +1,84 @@ += Diff::LCS + +home :: https://github.com/halostatue/diff-lcs +code :: https://github.com/halostatue/diff-lcs +bugs :: https://github.com/halostatue/diff-lcs/issues +rdoc :: http://rubydoc.info/github/halostatue/diff-lcs +continuous integration :: {}[https://github.com/halostatue/diff-lcs/actions] + +== Description + +Diff::LCS computes the difference between two Enumerable sequences using the +McIlroy-Hunt longest common subsequence (LCS) algorithm. It includes utilities +to create a simple HTML diff output format and a standard diff-like tool. + +This is release 1.4.3, providing a simple extension that allows for +Diff::LCS::Change objects to be treated implicitly as arrays and fixes a +number of formatting issues. + +Ruby versions below 2.5 are soft-deprecated, which means that older versions +are no longer part of the CI test suite. If any changes have been introduced +that break those versions, bug reports and patches will be accepted, but it +will be up to the reporter to verify any fixes prior to release. The next +major release will completely break compatibility. + +== Synopsis + +Using this module is quite simple. By default, Diff::LCS does not extend +objects with the Diff::LCS interface, but will be called as if it were a +function: + + require 'diff/lcs' + + seq1 = %w(a b c e h j l m n p) + seq2 = %w(b c d e f j k l m r s t) + + lcs = Diff::LCS.LCS(seq1, seq2) + diffs = Diff::LCS.diff(seq1, seq2) + sdiff = Diff::LCS.sdiff(seq1, seq2) + seq = Diff::LCS.traverse_sequences(seq1, seq2, callback_obj) + bal = Diff::LCS.traverse_balanced(seq1, seq2, callback_obj) + seq2 == Diff::LCS.patch!(seq1, diffs) + seq1 == Diff::LCS.unpatch!(seq2, diffs) + seq2 == Diff::LCS.patch!(seq1, sdiff) + seq1 == Diff::LCS.unpatch!(seq2, sdiff) + +Objects can be extended with Diff::LCS: + + seq1.extend(Diff::LCS) + lcs = seq1.lcs(seq2) + diffs = seq1.diff(seq2) + sdiff = seq1.sdiff(seq2) + seq = seq1.traverse_sequences(seq2, callback_obj) + bal = seq1.traverse_balanced(seq2, callback_obj) + seq2 == seq1.patch!(diffs) + seq1 == seq2.unpatch!(diffs) + seq2 == seq1.patch!(sdiff) + seq1 == seq2.unpatch!(sdiff) + +By requiring 'diff/lcs/array' or 'diff/lcs/string', Array or String will be +extended for use this way. + +Note that Diff::LCS requires a sequenced enumerable container, which means that +the order of enumeration is both predictable and consistent for the same set of +data. While it is theoretically possible to generate a diff for an unordered +hash, it will only be meaningful if the enumeration of the hashes is +consistent. In general, this will mean that containers that behave like String +or Array will perform best. + +== History + +Diff::LCS is a port of Perl's Algorithm::Diff that uses the McIlroy-Hunt +longest common subsequence (LCS) algorithm to compute intelligent differences +between two sequenced enumerable containers. The implementation is based on +Mario I. Wolczko's +{Smalltalk version 1.2}[ftp://st.cs.uiuc.edu/pub/Smalltalk/MANCHESTER/manchester/4.0/diff.st] +(1993) and Ned Konz's Perl version +{Algorithm::Diff 1.15}[http://search.cpan.org/~nedkonz/Algorithm-Diff-1.15/]. +Diff::LCS#sdiff and Diff::LCS#traverse_balanced were originally written for the +Perl version by Mike Schilli. + +The algorithm is described in A Fast Algorithm for Computing Longest Common +Subsequences, CACM, vol.20, no.5, pp.350-353, May 1977, with a few minor +improvements to improve the speed. A simplified description of the algorithm, +originally written for the Perl version, was written by Mark-Jason Dominus. diff --git a/vendor/bundle/ruby/3.1.0/gems/diff-lcs-1.5.0/Rakefile b/vendor/bundle/ruby/3.1.0/gems/diff-lcs-1.5.0/Rakefile new file mode 100644 index 000000000..fd7ee31cc --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/diff-lcs-1.5.0/Rakefile @@ -0,0 +1,121 @@ +# frozen_string_literal: true + +require 'rubygems' +require 'rspec' +require 'rspec/core/rake_task' +require 'hoe' + +# This is required until https://github.com/seattlerb/hoe/issues/112 is fixed +class Hoe + def with_config + config = Hoe::DEFAULT_CONFIG + + rc = File.expand_path("~/.hoerc") + homeconfig = load_config(rc) + config = config.merge(homeconfig) + + localconfig = load_config(File.expand_path(File.join(Dir.pwd, ".hoerc"))) + config = config.merge(localconfig) + + yield config, rc + end + + def load_config(name) + File.exist?(name) ? safe_load_yaml(name) : {} + end + + def safe_load_yaml(name) + return safe_load_yaml_file(name) if YAML.respond_to?(:safe_load_file) + + data = IO.binread(name) + YAML.safe_load(data, permitted_classes: [Regexp]) + rescue + YAML.safe_load(data, [Regexp]) + end + + def safe_load_yaml_file(name) + YAML.safe_load_file(name, permitted_classes: [Regexp]) + rescue + YAML.safe_load_file(name, [Regexp]) + end +end + +Hoe.plugin :bundler +Hoe.plugin :doofus +Hoe.plugin :gemspec2 +Hoe.plugin :git + +if RUBY_VERSION < '1.9' + class Array #:nodoc: + def to_h + Hash[*flatten(1)] + end + end + + class Gem::Specification #:nodoc: + def metadata=(*); end + + def default_value(*); end + end + + class Object #:nodoc: + def caller_locations(*) + [] + end + end +end + +_spec = Hoe.spec 'diff-lcs' do + developer('Austin Ziegler', 'halostatue@gmail.com') + + require_ruby_version '>= 1.8' + + self.history_file = 'History.md' + self.readme_file = 'README.rdoc' + self.licenses = ['MIT', 'Artistic-2.0', 'GPL-2.0+'] + + extra_dev_deps << ['hoe-doofus', '~> 1.0'] + extra_dev_deps << ['hoe-gemspec2', '~> 1.1'] + extra_dev_deps << ['hoe-git', '~> 1.6'] + extra_dev_deps << ['hoe-rubygems', '~> 1.0'] + extra_dev_deps << ['rspec', '>= 2.0', '< 4'] + extra_dev_deps << ['rake', '>= 10.0', '< 14'] + extra_dev_deps << ['rdoc', '>= 6.3.1', '< 7'] +end + +desc "Run all specifications" +RSpec::Core::RakeTask.new(:spec) do |t| + rspec_dirs = %w(spec lib).join(":") + t.rspec_opts = ["-I#{rspec_dirs}"] +end + +Rake::Task["spec"].actions.uniq! { |a| a.source_location } + +task :default => :spec unless Rake::Task["default"].prereqs.include?("spec") +task :test => :spec unless Rake::Task["test"].prereqs.include?("spec") + +if RUBY_VERSION >= '2.0' && RUBY_ENGINE == 'ruby' + namespace :spec do + desc "Runs test coverage. Only works Ruby 2.0+ and assumes 'simplecov' is installed." + task :coverage do + ENV['COVERAGE'] = 'yes' + Rake::Task['spec'].execute + end + end +end + +task :ruby18 do + puts <<-MESSAGE +You are starting a barebones Ruby 1.8 docker environment. You will need to +do the following: + +- mv Gemfile.lock{,.v2} +- gem install bundler --version 1.17.2 --no-ri --no-rdoc +- ruby -S bundle +- rake + +Don't forget to restore your Gemfile.lock after testing. + + MESSAGE + sh "docker run -it --rm -v #{Dir.pwd}:/root/diff-lcs bellbind/docker-ruby18-rails2 bash -l" +end diff --git a/vendor/bundle/ruby/3.1.0/gems/diff-lcs-1.5.0/bin/htmldiff b/vendor/bundle/ruby/3.1.0/gems/diff-lcs-1.5.0/bin/htmldiff new file mode 100755 index 000000000..14114a763 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/diff-lcs-1.5.0/bin/htmldiff @@ -0,0 +1,35 @@ +#! /usr/bin/env ruby -w +# frozen_string_literal: true + +require 'diff/lcs' +require 'diff/lcs/htmldiff' + +begin + require 'text/format' +rescue LoadError + Diff::LCS::HTMLDiff.can_expand_tabs = false +end + +if ARGV.size < 2 or ARGV.size > 3 + warn "usage: #{File.basename($0)} old new [output.html]" + warn " #{File.basename($0)} old new > output.html" + exit 127 +end + +left = IO.read(ARGV[0]).split($/) +right = IO.read(ARGV[1]).split($/) + +options = { :title => "diff #{ARGV[0]} #{ARGV[1]}" } + +htmldiff = Diff::LCS::HTMLDiff.new(left, right, options) + +if ARGV[2] + File.open(ARGV[2], 'w') do |f| + htmldiff.options[:output] = f + htmldiff.run + end +else + htmldiff.run +end + +# vim: ft=ruby diff --git a/vendor/bundle/ruby/3.1.0/gems/diff-lcs-1.5.0/bin/ldiff b/vendor/bundle/ruby/3.1.0/gems/diff-lcs-1.5.0/bin/ldiff new file mode 100755 index 000000000..f4734f58e --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/diff-lcs-1.5.0/bin/ldiff @@ -0,0 +1,9 @@ +#! /usr/bin/env ruby -w +# frozen_string_literal: true + +require 'diff/lcs' +require 'diff/lcs/ldiff' + +exit Diff::LCS::Ldiff.run(ARGV) + +# vim: ft=ruby diff --git a/vendor/bundle/ruby/3.1.0/gems/diff-lcs-1.5.0/docs/COPYING.txt b/vendor/bundle/ruby/3.1.0/gems/diff-lcs-1.5.0/docs/COPYING.txt new file mode 100644 index 000000000..d159169d1 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/diff-lcs-1.5.0/docs/COPYING.txt @@ -0,0 +1,339 @@ + GNU GENERAL PUBLIC LICENSE + Version 2, June 1991 + + Copyright (C) 1989, 1991 Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +License is intended to guarantee your freedom to share and change free +software--to make sure the software is free for all its users. This +General Public License applies to most of the Free Software +Foundation's software and to any other program whose authors commit to +using it. (Some other Free Software Foundation software is covered by +the GNU Lesser General Public License instead.) You can apply it to +your programs, too. + + 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 +this service 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. + + To protect your rights, we need to make restrictions that forbid +anyone to deny you these rights or to ask you to surrender the rights. +These restrictions translate to certain responsibilities for you if you +distribute copies of the software, or if you modify it. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must give the recipients all the rights that +you have. You must make sure that they, too, receive or can get the +source code. And you must show them these terms so they know their +rights. + + We protect your rights with two steps: (1) copyright the software, and +(2) offer you this license which gives you legal permission to copy, +distribute and/or modify the software. + + Also, for each author's protection and ours, we want to make certain +that everyone understands that there is no warranty for this free +software. If the software is modified by someone else and passed on, we +want its recipients to know that what they have is not the original, so +that any problems introduced by others will not reflect on the original +authors' reputations. + + Finally, any free program is threatened constantly by software +patents. We wish to avoid the danger that redistributors of a free +program will individually obtain patent licenses, in effect making the +program proprietary. To prevent this, we have made it clear that any +patent must be licensed for everyone's free use or not licensed at all. + + The precise terms and conditions for copying, distribution and +modification follow. + + GNU GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License applies to any program or other work which contains +a notice placed by the copyright holder saying it may be distributed +under the terms of this General Public License. The "Program", below, +refers to any such program or work, and a "work based on the Program" +means either the Program or any derivative work under copyright law: +that is to say, a work containing the Program or a portion of it, +either verbatim or with modifications and/or translated into another +language. (Hereinafter, translation is included without limitation in +the term "modification".) Each licensee is addressed as "you". + +Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running the Program is not restricted, and the output from the Program +is covered only if its contents constitute a work based on the +Program (independent of having been made by running the Program). +Whether that is true depends on what the Program does. + + 1. You may copy and distribute 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 and disclaimer of warranty; keep intact all the +notices that refer to this License and to the absence of any warranty; +and give any other recipients of the Program a copy of this License +along with the Program. + +You may charge a fee for the physical act of transferring a copy, and +you may at your option offer warranty protection in exchange for a fee. + + 2. You may modify your copy or copies of the Program or any portion +of it, thus forming a work based on the Program, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) You must cause the modified files to carry prominent notices + stating that you changed the files and the date of any change. + + b) You must cause any work that you distribute or publish, that in + whole or in part contains or is derived from the Program or any + part thereof, to be licensed as a whole at no charge to all third + parties under the terms of this License. + + c) If the modified program normally reads commands interactively + when run, you must cause it, when started running for such + interactive use in the most ordinary way, to print or display an + announcement including an appropriate copyright notice and a + notice that there is no warranty (or else, saying that you provide + a warranty) and that users may redistribute the program under + these conditions, and telling the user how to view a copy of this + License. (Exception: if the Program itself is interactive but + does not normally print such an announcement, your work based on + the Program is not required to print an announcement.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Program, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Program, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Program. + +In addition, mere aggregation of another work not based on the Program +with the Program (or with a work based on the Program) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may copy and distribute the Program (or a work based on it, +under Section 2) in object code or executable form under the terms of +Sections 1 and 2 above provided that you also do one of the following: + + a) Accompany it with the complete corresponding machine-readable + source code, which must be distributed under the terms of Sections + 1 and 2 above on a medium customarily used for software interchange; or, + + b) Accompany it with a written offer, valid for at least three + years, to give any third party, for a charge no more than your + cost of physically performing source distribution, a complete + machine-readable copy of the corresponding source code, to be + distributed under the terms of Sections 1 and 2 above on a medium + customarily used for software interchange; or, + + c) Accompany it with the information you received as to the offer + to distribute corresponding source code. (This alternative is + allowed only for noncommercial distribution and only if you + received the program in object code or executable form with such + an offer, in accord with Subsection b above.) + +The source code for a work means the preferred form of the work for +making modifications to it. For an executable work, complete source +code means all the source code for all modules it contains, plus any +associated interface definition files, plus the scripts used to +control compilation and installation of the executable. However, as a +special exception, the source code distributed need not include +anything that is normally distributed (in either source or binary +form) with the major components (compiler, kernel, and so on) of the +operating system on which the executable runs, unless that component +itself accompanies the executable. + +If distribution of executable or object code is made by offering +access to copy from a designated place, then offering equivalent +access to copy the source code from the same place counts as +distribution of the source code, even though third parties are not +compelled to copy the source along with the object code. + + 4. You may not copy, modify, sublicense, or distribute the Program +except as expressly provided under this License. Any attempt +otherwise to copy, modify, sublicense or distribute the Program is +void, and will automatically terminate your rights under this License. +However, parties who have received copies, or rights, from you under +this License will not have their licenses terminated so long as such +parties remain in full compliance. + + 5. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Program or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Program (or any work based on the +Program), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Program or works based on it. + + 6. Each time you redistribute the Program (or any work based on the +Program), the recipient automatically receives a license from the +original licensor to copy, distribute or modify the Program subject to +these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties to +this License. + + 7. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +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 +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Program at all. For example, if a patent +license would not permit royalty-free redistribution of the Program by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Program. + +If any portion of this section is held invalid or unenforceable under +any particular circumstance, the balance of the section is intended to +apply and the section as a whole is intended to apply in other +circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system, which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 8. If the distribution and/or use of the Program is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Program under this License +may add an explicit geographical distribution limitation excluding +those countries, so that distribution is permitted only in or among +countries not thus excluded. In such case, this License incorporates +the limitation as if written in the body of this License. + + 9. The Free Software Foundation may publish revised and/or new versions +of the 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 a version number of this License which applies to it and "any +later version", you have the option of following the terms and conditions +either of that version or of any later version published by the Free +Software Foundation. If the Program does not specify a version number of +this License, you may choose any version ever published by the Free Software +Foundation. + + 10. If you wish to incorporate parts of the Program into other free +programs whose distribution conditions are different, write to the author +to ask for permission. For software which is copyrighted by the Free +Software Foundation, write to the Free Software Foundation; we sometimes +make exceptions for this. Our decision will be guided by the two goals +of preserving the free status of all derivatives of our free software and +of promoting the sharing and reuse of software generally. + + NO WARRANTY + + 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, 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. + + 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR +REDISTRIBUTE 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. + + 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 +convey 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 General Public License as published by + the Free Software Foundation; either version 2 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 General Public License for more details. + + You should have received a copy of the GNU General Public License along + with this program; if not, write to the Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + +Also add information on how to contact you by electronic and paper mail. + +If the program is interactive, make it output a short notice like this +when it starts in an interactive mode: + + Gnomovision version 69, Copyright (C) year name of author + Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, the commands you use may +be called something other than `show w' and `show c'; they could even be +mouse-clicks or menu items--whatever suits your program. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the program, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the program + `Gnomovision' (which makes passes at compilers) written by James Hacker. + + , 1 April 1989 + Ty Coon, President of Vice + +This General Public License does not permit incorporating your program into +proprietary programs. If your program is a subroutine library, you may +consider it more useful to permit linking proprietary applications with the +library. If this is what you want to do, use the GNU Lesser General +Public License instead of this License. diff --git a/vendor/bundle/ruby/3.1.0/gems/diff-lcs-1.5.0/docs/artistic.txt b/vendor/bundle/ruby/3.1.0/gems/diff-lcs-1.5.0/docs/artistic.txt new file mode 100644 index 000000000..c04639a83 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/diff-lcs-1.5.0/docs/artistic.txt @@ -0,0 +1,127 @@ +The "Artistic License" + + Preamble + +The intent of this document is to state the conditions under which a +Package may be copied, such that the Copyright Holder maintains some +semblance of artistic control over the development of the package, +while giving the users of the package the right to use and distribute +the Package in a more-or-less customary fashion, plus the right to make +reasonable modifications. + +Definitions: + + "Package" refers to the collection of files distributed by the + Copyright Holder, and derivatives of that collection of files + created through textual modification. + + "Standard Version" refers to such a Package if it has not been + modified, or has been modified in accordance with the wishes + of the Copyright Holder as specified below. + + "Copyright Holder" is whoever is named in the copyright or + copyrights for the package. + + "You" is you, if you're thinking about copying or distributing + this Package. + + "Reasonable copying fee" is whatever you can justify on the + basis of media cost, duplication charges, time of people involved, + and so on. (You will not be required to justify it to the + Copyright Holder, but only to the computing community at large + as a market that must bear the fee.) + + "Freely Available" means that no fee is charged for the item + itself, though there may be fees involved in handling the item. + It also means that recipients of the item may redistribute it + under the same conditions they received it. + +1. You may make and give away verbatim copies of the source form of the +Standard Version of this Package without restriction, provided that you +duplicate all of the original copyright notices and associated disclaimers. + +2. You may apply bug fixes, portability fixes and other modifications +derived from the Public Domain or from the Copyright Holder. A Package +modified in such a way shall still be considered the Standard Version. + +3. You may otherwise modify your copy of this Package in any way, provided +that you insert a prominent notice in each changed file stating how and +when you changed that file, and provided that you do at least ONE of the +following: + + a) place your modifications in the Public Domain or otherwise make them + Freely Available, such as by posting said modifications to Usenet or + an equivalent medium, or placing the modifications on a major archive + site such as uunet.uu.net, or by allowing the Copyright Holder to include + your modifications in the Standard Version of the Package. + + b) use the modified Package only within your corporation or organization. + + c) rename any non-standard executables so the names do not conflict + with standard executables, which must also be provided, and provide + a separate manual page for each non-standard executable that clearly + documents how it differs from the Standard Version. + + d) make other distribution arrangements with the Copyright Holder. + +4. You may distribute the programs of this Package in object code or +executable form, provided that you do at least ONE of the following: + + a) distribute a Standard Version of the executables and library files, + together with instructions (in the manual page or equivalent) on where + to get the Standard Version. + + b) accompany the distribution with the machine-readable source of + the Package with your modifications. + + c) give non-standard executables non-standard names, and clearly + document the differences in manual pages (or equivalent), together + with instructions on where to get the Standard Version. + + d) make other distribution arrangements with the Copyright Holder. + +5. You may charge a reasonable copying fee for any distribution of this +Package. You may charge any fee you choose for support of this +Package. You may not charge a fee for this Package itself. However, +you may distribute this Package in aggregate with other (possibly +commercial) programs as part of a larger (possibly commercial) software +distribution provided that you do not advertise this Package as a +product of your own. You may embed this Package's interpreter within +an executable of yours (by linking); this shall be construed as a mere +form of aggregation, provided that the complete Standard Version of the +interpreter is so embedded. + +6. The scripts and library files supplied as input to or produced as +output from the programs of this Package do not automatically fall +under the copyright of this Package, but belong to whoever generated +them, and may be sold commercially, and may be aggregated with this +Package. If such scripts or library files are aggregated with this +Package via the so-called "undump" or "unexec" methods of producing a +binary executable image, then distribution of such an image shall +neither be construed as a distribution of this Package nor shall it +fall under the restrictions of Paragraphs 3 and 4, provided that you do +not represent such an executable image as a Standard Version of this +Package. + +7. C subroutines (or comparably compiled subroutines in other +languages) supplied by you and linked into this Package in order to +emulate subroutines and variables of the language defined by this +Package shall not be considered part of this Package, but are the +equivalent of input as in Paragraph 6, provided these subroutines do +not change the language in any way that would cause it to fail the +regression tests for the language. + +8. Aggregation of this Package with a commercial distribution is always +permitted provided that the use of this Package is embedded; that is, +when no overt attempt is made to make this Package's interfaces visible +to the end user of the commercial distribution. Such use shall not be +construed as a distribution of this Package. + +9. The name of the Copyright Holder may not be used to endorse or promote +products derived from this software without specific prior written permission. + +10. THIS PACKAGE IS PROVIDED "AS IS" AND WITHOUT ANY EXPRESS OR +IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED +WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. + + The End diff --git a/vendor/bundle/ruby/3.1.0/gems/diff-lcs-1.5.0/lib/diff-lcs.rb b/vendor/bundle/ruby/3.1.0/gems/diff-lcs-1.5.0/lib/diff-lcs.rb new file mode 100644 index 000000000..250392f94 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/diff-lcs-1.5.0/lib/diff-lcs.rb @@ -0,0 +1,3 @@ +# frozen_string_literal: true + +require 'diff/lcs' diff --git a/vendor/bundle/ruby/3.1.0/gems/diff-lcs-1.5.0/lib/diff/lcs.rb b/vendor/bundle/ruby/3.1.0/gems/diff-lcs-1.5.0/lib/diff/lcs.rb new file mode 100644 index 000000000..288cfc217 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/diff-lcs-1.5.0/lib/diff/lcs.rb @@ -0,0 +1,739 @@ +# frozen_string_literal: true + +module Diff; end unless defined? Diff # rubocop:disable Style/Documentation + +# == How Diff Works (by Mark-Jason Dominus) +# +# I once read an article written by the authors of +diff+; they said that they +# hard worked very hard on the algorithm until they found the right one. +# +# I think what they ended up using (and I hope someone will correct me, because +# I am not very confident about this) was the `longest common subsequence' +# method. In the LCS problem, you have two sequences of items: +# +# a b c d f g h j q z +# a b c d e f g i j k r x y z +# +# and you want to find the longest sequence of items that is present in both +# original sequences in the same order. That is, you want to find a new +# sequence *S* which can be obtained from the first sequence by deleting some +# items, and from the second sequence by deleting other items. You also want +# *S* to be as long as possible. In this case *S* is: +# +# a b c d f g j z +# +# From there it's only a small step to get diff-like output: +# +# e h i k q r x y +# + - + + - + + + +# +# This module solves the LCS problem. It also includes a canned function to +# generate +diff+-like output. +# +# It might seem from the example above that the LCS of two sequences is always +# pretty obvious, but that's not always the case, especially when the two +# sequences have many repeated elements. For example, consider +# +# a x b y c z p d q +# a b c a x b y c z +# +# A naive approach might start by matching up the +a+ and +b+ that appear at +# the beginning of each sequence, like this: +# +# a x b y c z p d q +# a b c a b y c z +# +# This finds the common subsequence +a b c z+. But actually, the LCS is +a x b +# y c z+: +# +# a x b y c z p d q +# a b c a x b y c z +module Diff::LCS + VERSION = '1.5.0' +end + +require 'diff/lcs/callbacks' +require 'diff/lcs/internals' + +module Diff::LCS # rubocop:disable Style/Documentation + # Returns an Array containing the longest common subsequence(s) between + # +self+ and +other+. See Diff::LCS#lcs. + # + # lcs = seq1.lcs(seq2) + # + # A note when using objects: Diff::LCS only works properly when each object + # can be used as a key in a Hash, which typically means that the objects must + # implement Object#eql? in a way that two identical values compare + # identically for key purposes. That is: + # + # O.new('a').eql?(O.new('a')) == true + def lcs(other, &block) #:yields self[i] if there are matched subsequences: + Diff::LCS.lcs(self, other, &block) + end + + # Returns the difference set between +self+ and +other+. See Diff::LCS#diff. + def diff(other, callbacks = nil, &block) + Diff::LCS.diff(self, other, callbacks, &block) + end + + # Returns the balanced ("side-by-side") difference set between +self+ and + # +other+. See Diff::LCS#sdiff. + def sdiff(other, callbacks = nil, &block) + Diff::LCS.sdiff(self, other, callbacks, &block) + end + + # Traverses the discovered longest common subsequences between +self+ and + # +other+. See Diff::LCS#traverse_sequences. + def traverse_sequences(other, callbacks = nil, &block) + Diff::LCS.traverse_sequences(self, other, callbacks || Diff::LCS::SequenceCallbacks, &block) + end + + # Traverses the discovered longest common subsequences between +self+ and + # +other+ using the alternate, balanced algorithm. See + # Diff::LCS#traverse_balanced. + def traverse_balanced(other, callbacks = nil, &block) + Diff::LCS.traverse_balanced(self, other, callbacks || Diff::LCS::BalancedCallbacks, &block) + end + + # Attempts to patch +self+ with the provided +patchset+. A new sequence based + # on +self+ and the +patchset+ will be created. See Diff::LCS#patch. Attempts + # to autodiscover the direction of the patch. + def patch(patchset) + Diff::LCS.patch(self, patchset) + end + alias unpatch patch + + # Attempts to patch +self+ with the provided +patchset+. A new sequence based + # on +self+ and the +patchset+ will be created. See Diff::LCS#patch. Does no + # patch direction autodiscovery. + def patch!(patchset) + Diff::LCS.patch!(self, patchset) + end + + # Attempts to unpatch +self+ with the provided +patchset+. A new sequence + # based on +self+ and the +patchset+ will be created. See Diff::LCS#unpatch. + # Does no patch direction autodiscovery. + def unpatch!(patchset) + Diff::LCS.unpatch!(self, patchset) + end + + # Attempts to patch +self+ with the provided +patchset+, using #patch!. If + # the sequence this is used on supports #replace, the value of +self+ will be + # replaced. See Diff::LCS#patch. Does no patch direction autodiscovery. + def patch_me(patchset) + if respond_to? :replace + replace(patch!(patchset)) + else + patch!(patchset) + end + end + + # Attempts to unpatch +self+ with the provided +patchset+, using #unpatch!. + # If the sequence this is used on supports #replace, the value of +self+ will + # be replaced. See Diff::LCS#unpatch. Does no patch direction autodiscovery. + def unpatch_me(patchset) + if respond_to? :replace + replace(unpatch!(patchset)) + else + unpatch!(patchset) + end + end +end + +class << Diff::LCS + def lcs(seq1, seq2, &block) #:yields seq1[i] for each matched: + matches = Diff::LCS::Internals.lcs(seq1, seq2) + ret = [] + string = seq1.kind_of? String + matches.each_with_index do |_e, i| + next if matches[i].nil? + + v = string ? seq1[i, 1] : seq1[i] + v = block[v] if block + ret << v + end + ret + end + alias LCS lcs + + # #diff computes the smallest set of additions and deletions necessary to + # turn the first sequence into the second, and returns a description of these + # changes. + # + # See Diff::LCS::DiffCallbacks for the default behaviour. An alternate + # behaviour may be implemented with Diff::LCS::ContextDiffCallbacks. If a + # Class argument is provided for +callbacks+, #diff will attempt to + # initialise it. If the +callbacks+ object (possibly initialised) responds to + # #finish, it will be called. + def diff(seq1, seq2, callbacks = nil, &block) # :yields diff changes: + diff_traversal(:diff, seq1, seq2, callbacks || Diff::LCS::DiffCallbacks, &block) + end + + # #sdiff computes all necessary components to show two sequences and their + # minimized differences side by side, just like the Unix utility + # sdiff does: + # + # old < - + # same same + # before | after + # - > new + # + # See Diff::LCS::SDiffCallbacks for the default behaviour. An alternate + # behaviour may be implemented with Diff::LCS::ContextDiffCallbacks. If a + # Class argument is provided for +callbacks+, #diff will attempt to + # initialise it. If the +callbacks+ object (possibly initialised) responds to + # #finish, it will be called. + # + # Each element of a returned array is a Diff::LCS::ContextChange object, + # which can be implicitly converted to an array. + # + # Diff::LCS.sdiff(a, b).each do |action, (old_pos, old_element), (new_pos, new_element)| + # case action + # when '!' + # # replace + # when '-' + # # delete + # when '+' + # # insert + # end + # end + def sdiff(seq1, seq2, callbacks = nil, &block) #:yields diff changes: + diff_traversal(:sdiff, seq1, seq2, callbacks || Diff::LCS::SDiffCallbacks, &block) + end + + # #traverse_sequences is the most general facility provided by this module; + # #diff and #lcs are implemented as calls to it. + # + # The arguments to #traverse_sequences are the two sequences to traverse, and + # a callback object, like this: + # + # traverse_sequences(seq1, seq2, Diff::LCS::ContextDiffCallbacks.new) + # + # == Callback Methods + # + # Optional callback methods are emphasized. + # + # callbacks#match:: Called when +a+ and +b+ are pointing to + # common elements in +A+ and +B+. + # callbacks#discard_a:: Called when +a+ is pointing to an + # element not in +B+. + # callbacks#discard_b:: Called when +b+ is pointing to an + # element not in +A+. + # callbacks#finished_a:: Called when +a+ has reached the end of + # sequence +A+. + # callbacks#finished_b:: Called when +b+ has reached the end of + # sequence +B+. + # + # == Algorithm + # + # a---+ + # v + # A = a b c e h j l m n p + # B = b c d e f j k l m r s t + # ^ + # b---+ + # + # If there are two arrows (+a+ and +b+) pointing to elements of sequences +A+ + # and +B+, the arrows will initially point to the first elements of their + # respective sequences. #traverse_sequences will advance the arrows through + # the sequences one element at a time, calling a method on the user-specified + # callback object before each advance. It will advance the arrows in such a + # way that if there are elements A[i] and B[j] which are + # both equal and part of the longest common subsequence, there will be some + # moment during the execution of #traverse_sequences when arrow +a+ is + # pointing to A[i] and arrow +b+ is pointing to B[j]. When + # this happens, #traverse_sequences will call callbacks#match and + # then it will advance both arrows. + # + # Otherwise, one of the arrows is pointing to an element of its sequence that + # is not part of the longest common subsequence. #traverse_sequences will + # advance that arrow and will call callbacks#discard_a or + # callbacks#discard_b, depending on which arrow it advanced. If both + # arrows point to elements that are not part of the longest common + # subsequence, then #traverse_sequences will advance arrow +a+ and call the + # appropriate callback, then it will advance arrow +b+ and call the appropriate + # callback. + # + # The methods for callbacks#match, callbacks#discard_a, and + # callbacks#discard_b are invoked with an event comprising the + # action ("=", "+", or "-", respectively), the indicies +i+ and +j+, and the + # elements A[i] and B[j]. Return values are discarded by + # #traverse_sequences. + # + # === End of Sequences + # + # If arrow +a+ reaches the end of its sequence before arrow +b+ does, + # #traverse_sequence will try to call callbacks#finished_a with the + # last index and element of +A+ (A[-1]) and the current index and + # element of +B+ (B[j]). If callbacks#finished_a does not + # exist, then callbacks#discard_b will be called on each element of + # +B+ until the end of the sequence is reached (the call will be done with + # A[-1] and B[j] for each element). + # + # If +b+ reaches the end of +B+ before +a+ reaches the end of +A+, + # callbacks#finished_b will be called with the current index and + # element of +A+ (A[i]) and the last index and element of +B+ + # (A[-1]). Again, if callbacks#finished_b does not exist on + # the callback object, then callbacks#discard_a will be called on + # each element of +A+ until the end of the sequence is reached (A[i] + # and B[-1]). + # + # There is a chance that one additional callbacks#discard_a or + # callbacks#discard_b will be called after the end of the sequence + # is reached, if +a+ has not yet reached the end of +A+ or +b+ has not yet + # reached the end of +B+. + def traverse_sequences(seq1, seq2, callbacks = Diff::LCS::SequenceCallbacks) #:yields change events: + callbacks ||= Diff::LCS::SequenceCallbacks + matches = Diff::LCS::Internals.lcs(seq1, seq2) + + run_finished_a = run_finished_b = false + string = seq1.kind_of?(String) + + a_size = seq1.size + b_size = seq2.size + ai = bj = 0 + + matches.each do |b_line| + if b_line.nil? + unless seq1[ai].nil? + ax = string ? seq1[ai, 1] : seq1[ai] + bx = string ? seq2[bj, 1] : seq2[bj] + + event = Diff::LCS::ContextChange.new('-', ai, ax, bj, bx) + event = yield event if block_given? + callbacks.discard_a(event) + end + else + ax = string ? seq1[ai, 1] : seq1[ai] + + loop do + break unless bj < b_line + + bx = string ? seq2[bj, 1] : seq2[bj] + event = Diff::LCS::ContextChange.new('+', ai, ax, bj, bx) + event = yield event if block_given? + callbacks.discard_b(event) + bj += 1 + end + bx = string ? seq2[bj, 1] : seq2[bj] + event = Diff::LCS::ContextChange.new('=', ai, ax, bj, bx) + event = yield event if block_given? + callbacks.match(event) + bj += 1 + end + ai += 1 + end + + # The last entry (if any) processed was a match. +ai+ and +bj+ point just + # past the last matching lines in their sequences. + while (ai < a_size) or (bj < b_size) + # last A? + if ai == a_size and bj < b_size + if callbacks.respond_to?(:finished_a) and !run_finished_a + ax = string ? seq1[-1, 1] : seq1[-1] + bx = string ? seq2[bj, 1] : seq2[bj] + event = Diff::LCS::ContextChange.new('>', (a_size - 1), ax, bj, bx) + event = yield event if block_given? + callbacks.finished_a(event) + run_finished_a = true + else + ax = string ? seq1[ai, 1] : seq1[ai] + loop do + bx = string ? seq2[bj, 1] : seq2[bj] + event = Diff::LCS::ContextChange.new('+', ai, ax, bj, bx) + event = yield event if block_given? + callbacks.discard_b(event) + bj += 1 + break unless bj < b_size + end + end + end + + # last B? + if bj == b_size and ai < a_size + if callbacks.respond_to?(:finished_b) and !run_finished_b + ax = string ? seq1[ai, 1] : seq1[ai] + bx = string ? seq2[-1, 1] : seq2[-1] + event = Diff::LCS::ContextChange.new('<', ai, ax, (b_size - 1), bx) + event = yield event if block_given? + callbacks.finished_b(event) + run_finished_b = true + else + bx = string ? seq2[bj, 1] : seq2[bj] + loop do + ax = string ? seq1[ai, 1] : seq1[ai] + event = Diff::LCS::ContextChange.new('-', ai, ax, bj, bx) + event = yield event if block_given? + callbacks.discard_a(event) + ai += 1 + break unless bj < b_size + end + end + end + + if ai < a_size + ax = string ? seq1[ai, 1] : seq1[ai] + bx = string ? seq2[bj, 1] : seq2[bj] + event = Diff::LCS::ContextChange.new('-', ai, ax, bj, bx) + event = yield event if block_given? + callbacks.discard_a(event) + ai += 1 + end + + if bj < b_size + ax = string ? seq1[ai, 1] : seq1[ai] + bx = string ? seq2[bj, 1] : seq2[bj] + event = Diff::LCS::ContextChange.new('+', ai, ax, bj, bx) + event = yield event if block_given? + callbacks.discard_b(event) + bj += 1 + end + end + end + + # #traverse_balanced is an alternative to #traverse_sequences. It uses a + # different algorithm to iterate through the entries in the computed longest + # common subsequence. Instead of viewing the changes as insertions or + # deletions from one of the sequences, #traverse_balanced will report + # changes between the sequences. + # + # The arguments to #traverse_balanced are the two sequences to traverse and a + # callback object, like this: + # + # traverse_balanced(seq1, seq2, Diff::LCS::ContextDiffCallbacks.new) + # + # #sdiff is implemented with #traverse_balanced. + # + # == Callback Methods + # + # Optional callback methods are emphasized. + # + # callbacks#match:: Called when +a+ and +b+ are pointing to + # common elements in +A+ and +B+. + # callbacks#discard_a:: Called when +a+ is pointing to an + # element not in +B+. + # callbacks#discard_b:: Called when +b+ is pointing to an + # element not in +A+. + # callbacks#change:: Called when +a+ and +b+ are pointing to + # the same relative position, but + # A[a] and B[b] are not + # the same; a change has + # occurred. + # + # #traverse_balanced might be a bit slower than #traverse_sequences, + # noticable only while processing huge amounts of data. + # + # == Algorithm + # + # a---+ + # v + # A = a b c e h j l m n p + # B = b c d e f j k l m r s t + # ^ + # b---+ + # + # === Matches + # + # If there are two arrows (+a+ and +b+) pointing to elements of sequences +A+ + # and +B+, the arrows will initially point to the first elements of their + # respective sequences. #traverse_sequences will advance the arrows through + # the sequences one element at a time, calling a method on the user-specified + # callback object before each advance. It will advance the arrows in such a + # way that if there are elements A[i] and B[j] which are + # both equal and part of the longest common subsequence, there will be some + # moment during the execution of #traverse_sequences when arrow +a+ is + # pointing to A[i] and arrow +b+ is pointing to B[j]. When + # this happens, #traverse_sequences will call callbacks#match and + # then it will advance both arrows. + # + # === Discards + # + # Otherwise, one of the arrows is pointing to an element of its sequence that + # is not part of the longest common subsequence. #traverse_sequences will + # advance that arrow and will call callbacks#discard_a or + # callbacks#discard_b, depending on which arrow it advanced. + # + # === Changes + # + # If both +a+ and +b+ point to elements that are not part of the longest + # common subsequence, then #traverse_sequences will try to call + # callbacks#change and advance both arrows. If + # callbacks#change is not implemented, then + # callbacks#discard_a and callbacks#discard_b will be + # called in turn. + # + # The methods for callbacks#match, callbacks#discard_a, + # callbacks#discard_b, and callbacks#change are invoked + # with an event comprising the action ("=", "+", "-", or "!", respectively), + # the indicies +i+ and +j+, and the elements A[i] and B[j]. + # Return values are discarded by #traverse_balanced. + # + # === Context + # + # Note that +i+ and +j+ may not be the same index position, even if +a+ and + # +b+ are considered to be pointing to matching or changed elements. + def traverse_balanced(seq1, seq2, callbacks = Diff::LCS::BalancedCallbacks) + matches = Diff::LCS::Internals.lcs(seq1, seq2) + a_size = seq1.size + b_size = seq2.size + ai = bj = mb = 0 + ma = -1 + string = seq1.kind_of?(String) + + # Process all the lines in the match vector. + loop do + # Find next match indices +ma+ and +mb+ + loop do + ma += 1 + break unless ma < matches.size and matches[ma].nil? + end + + break if ma >= matches.size # end of matches? + + mb = matches[ma] + + # Change(seq2) + while (ai < ma) or (bj < mb) + ax = string ? seq1[ai, 1] : seq1[ai] + bx = string ? seq2[bj, 1] : seq2[bj] + + case [(ai < ma), (bj < mb)] + when [true, true] + if callbacks.respond_to?(:change) + event = Diff::LCS::ContextChange.new('!', ai, ax, bj, bx) + event = yield event if block_given? + callbacks.change(event) + ai += 1 + else + event = Diff::LCS::ContextChange.new('-', ai, ax, bj, bx) + event = yield event if block_given? + callbacks.discard_a(event) + ai += 1 + ax = string ? seq1[ai, 1] : seq1[ai] + event = Diff::LCS::ContextChange.new('+', ai, ax, bj, bx) + event = yield event if block_given? + callbacks.discard_b(event) + end + + bj += 1 + when [true, false] + event = Diff::LCS::ContextChange.new('-', ai, ax, bj, bx) + event = yield event if block_given? + callbacks.discard_a(event) + ai += 1 + when [false, true] + event = Diff::LCS::ContextChange.new('+', ai, ax, bj, bx) + event = yield event if block_given? + callbacks.discard_b(event) + bj += 1 + end + end + + # Match + ax = string ? seq1[ai, 1] : seq1[ai] + bx = string ? seq2[bj, 1] : seq2[bj] + event = Diff::LCS::ContextChange.new('=', ai, ax, bj, bx) + event = yield event if block_given? + callbacks.match(event) + ai += 1 + bj += 1 + end + + while (ai < a_size) or (bj < b_size) + ax = string ? seq1[ai, 1] : seq1[ai] + bx = string ? seq2[bj, 1] : seq2[bj] + + case [(ai < a_size), (bj < b_size)] + when [true, true] + if callbacks.respond_to?(:change) + event = Diff::LCS::ContextChange.new('!', ai, ax, bj, bx) + event = yield event if block_given? + callbacks.change(event) + ai += 1 + else + event = Diff::LCS::ContextChange.new('-', ai, ax, bj, bx) + event = yield event if block_given? + callbacks.discard_a(event) + ai += 1 + ax = string ? seq1[ai, 1] : seq1[ai] + event = Diff::LCS::ContextChange.new('+', ai, ax, bj, bx) + event = yield event if block_given? + callbacks.discard_b(event) + end + + bj += 1 + when [true, false] + event = Diff::LCS::ContextChange.new('-', ai, ax, bj, bx) + event = yield event if block_given? + callbacks.discard_a(event) + ai += 1 + when [false, true] + event = Diff::LCS::ContextChange.new('+', ai, ax, bj, bx) + event = yield event if block_given? + callbacks.discard_b(event) + bj += 1 + end + end + end + + PATCH_MAP = { #:nodoc: + :patch => { '+' => '+', '-' => '-', '!' => '!', '=' => '=' }.freeze, + :unpatch => { '+' => '-', '-' => '+', '!' => '!', '=' => '=' }.freeze + }.freeze + + # Applies a +patchset+ to the sequence +src+ according to the +direction+ + # (:patch or :unpatch), producing a new sequence. + # + # If the +direction+ is not specified, Diff::LCS::patch will attempt to + # discover the direction of the +patchset+. + # + # A +patchset+ can be considered to apply forward (:patch) if the + # following expression is true: + # + # patch(s1, diff(s1, s2)) -> s2 + # + # A +patchset+ can be considered to apply backward (:unpatch) if the + # following expression is true: + # + # patch(s2, diff(s1, s2)) -> s1 + # + # If the +patchset+ contains no changes, the +src+ value will be returned as + # either src.dup or +src+. A +patchset+ can be deemed as having no + # changes if the following predicate returns true: + # + # patchset.empty? or + # patchset.flatten(1).all? { |change| change.unchanged? } + # + # === Patchsets + # + # A +patchset+ is always an enumerable sequence of changes, hunks of changes, + # or a mix of the two. A hunk of changes is an enumerable sequence of + # changes: + # + # [ # patchset + # # change + # [ # hunk + # # change + # ] + # ] + # + # The +patch+ method accepts patchsets that are enumerable sequences + # containing either Diff::LCS::Change objects (or a subclass) or the array + # representations of those objects. Prior to application, array + # representations of Diff::LCS::Change objects will be reified. + def patch(src, patchset, direction = nil) + # Normalize the patchset. + has_changes, patchset = Diff::LCS::Internals.analyze_patchset(patchset) + + return src.respond_to?(:dup) ? src.dup : src unless has_changes + + string = src.kind_of?(String) + # Start with a new empty type of the source's class + res = src.class.new + + direction ||= Diff::LCS::Internals.intuit_diff_direction(src, patchset) + + ai = bj = 0 + + patch_map = PATCH_MAP[direction] + + patchset.each do |change| + # Both Change and ContextChange support #action + action = patch_map[change.action] + + case change + when Diff::LCS::ContextChange + case direction + when :patch + el = change.new_element + op = change.old_position + np = change.new_position + when :unpatch + el = change.old_element + op = change.new_position + np = change.old_position + end + + case action + when '-' # Remove details from the old string + while ai < op + res << (string ? src[ai, 1] : src[ai]) + ai += 1 + bj += 1 + end + ai += 1 + when '+' + while bj < np + res << (string ? src[ai, 1] : src[ai]) + ai += 1 + bj += 1 + end + + res << el + bj += 1 + when '=' + # This only appears in sdiff output with the SDiff callback. + # Therefore, we only need to worry about dealing with a single + # element. + res << el + + ai += 1 + bj += 1 + when '!' + while ai < op + res << (string ? src[ai, 1] : src[ai]) + ai += 1 + bj += 1 + end + + bj += 1 + ai += 1 + + res << el + end + when Diff::LCS::Change + case action + when '-' + while ai < change.position + res << (string ? src[ai, 1] : src[ai]) + ai += 1 + bj += 1 + end + ai += 1 + when '+' + while bj < change.position + res << (string ? src[ai, 1] : src[ai]) + ai += 1 + bj += 1 + end + + bj += 1 + + res << change.element + end + end + end + + while ai < src.size + res << (string ? src[ai, 1] : src[ai]) + ai += 1 + bj += 1 + end + + res + end + + # Given a set of patchset, convert the current version to the prior version. + # Does no auto-discovery. + def unpatch!(src, patchset) + patch(src, patchset, :unpatch) + end + + # Given a set of patchset, convert the current version to the next version. + # Does no auto-discovery. + def patch!(src, patchset) + patch(src, patchset, :patch) + end +end + +require 'diff/lcs/backports' diff --git a/vendor/bundle/ruby/3.1.0/gems/diff-lcs-1.5.0/lib/diff/lcs/array.rb b/vendor/bundle/ruby/3.1.0/gems/diff-lcs-1.5.0/lib/diff/lcs/array.rb new file mode 100644 index 000000000..5c250f6b3 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/diff-lcs-1.5.0/lib/diff/lcs/array.rb @@ -0,0 +1,7 @@ +# frozen_string_literal: true + +require 'diff/lcs' + +class Array + include Diff::LCS +end diff --git a/vendor/bundle/ruby/3.1.0/gems/diff-lcs-1.5.0/lib/diff/lcs/backports.rb b/vendor/bundle/ruby/3.1.0/gems/diff-lcs-1.5.0/lib/diff/lcs/backports.rb new file mode 100644 index 000000000..642fc9c97 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/diff-lcs-1.5.0/lib/diff/lcs/backports.rb @@ -0,0 +1,9 @@ +# frozen_string_literal: true + +unless 0.respond_to?(:positive?) + class Fixnum # rubocop:disable Lint/UnifiedInteger, Style/Documentation + def positive? + self > 0 # rubocop:disable Style/NumericPredicate + end + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/diff-lcs-1.5.0/lib/diff/lcs/block.rb b/vendor/bundle/ruby/3.1.0/gems/diff-lcs-1.5.0/lib/diff/lcs/block.rb new file mode 100644 index 000000000..430702dd9 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/diff-lcs-1.5.0/lib/diff/lcs/block.rb @@ -0,0 +1,37 @@ +# frozen_string_literal: true + +# A block is an operation removing, adding, or changing a group of items. +# Basically, this is just a list of changes, where each change adds or +# deletes a single item. Used by bin/ldiff. +class Diff::LCS::Block + attr_reader :changes, :insert, :remove + + def initialize(chunk) + @changes = [] + @insert = [] + @remove = [] + + chunk.each do |item| + @changes << item + @remove << item if item.deleting? + @insert << item if item.adding? + end + end + + def diff_size + @insert.size - @remove.size + end + + def op + case [@remove.empty?, @insert.empty?] + when [false, false] + '!' + when [false, true] + '-' + when [true, false] + '+' + else # [true, true] + '^' + end + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/diff-lcs-1.5.0/lib/diff/lcs/callbacks.rb b/vendor/bundle/ruby/3.1.0/gems/diff-lcs-1.5.0/lib/diff/lcs/callbacks.rb new file mode 100644 index 000000000..2a7665b95 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/diff-lcs-1.5.0/lib/diff/lcs/callbacks.rb @@ -0,0 +1,325 @@ +# frozen_string_literal: true + +require 'diff/lcs/change' + +module Diff::LCS # rubocop:disable Style/Documentation + # This callback object implements the default set of callback events, + # which only returns the event itself. Note that #finished_a and + # #finished_b are not implemented -- I haven't yet figured out where they + # would be useful. + # + # Note that this is intended to be called as is, e.g., + # + # Diff::LCS.LCS(seq1, seq2, Diff::LCS::DefaultCallbacks) + class DefaultCallbacks + class << self + # Called when two items match. + def match(event) + event + end + + # Called when the old value is discarded in favour of the new value. + def discard_a(event) + event + end + + # Called when the new value is discarded in favour of the old value. + def discard_b(event) + event + end + + # Called when both the old and new values have changed. + def change(event) + event + end + + private :new + end + end + + # An alias for DefaultCallbacks that is used in + # Diff::LCS#traverse_sequences. + # + # Diff::LCS.LCS(seq1, seq2, Diff::LCS::SequenceCallbacks) + SequenceCallbacks = DefaultCallbacks + + # An alias for DefaultCallbacks that is used in + # Diff::LCS#traverse_balanced. + # + # Diff::LCS.LCS(seq1, seq2, Diff::LCS::BalancedCallbacks) + BalancedCallbacks = DefaultCallbacks + + def self.callbacks_for(callbacks) + callbacks.new rescue callbacks + end +end + +# This will produce a compound array of simple diff change objects. Each +# element in the #diffs array is a +hunk+ or +hunk+ array, where each +# element in each +hunk+ array is a single Change object representing the +# addition or removal of a single element from one of the two tested +# sequences. The +hunk+ provides the full context for the changes. +# +# diffs = Diff::LCS.diff(seq1, seq2) +# # This example shows a simplified array format. +# # [ [ [ '-', 0, 'a' ] ], # 1 +# # [ [ '+', 2, 'd' ] ], # 2 +# # [ [ '-', 4, 'h' ], # 3 +# # [ '+', 4, 'f' ] ], +# # [ [ '+', 6, 'k' ] ], # 4 +# # [ [ '-', 8, 'n' ], # 5 +# # [ '-', 9, 'p' ], +# # [ '+', 9, 'r' ], +# # [ '+', 10, 's' ], +# # [ '+', 11, 't' ] ] ] +# +# There are five hunks here. The first hunk says that the +a+ at position 0 +# of the first sequence should be deleted ('-'). The second hunk +# says that the +d+ at position 2 of the second sequence should be inserted +# ('+'). The third hunk says that the +h+ at position 4 of the +# first sequence should be removed and replaced with the +f+ from position 4 +# of the second sequence. The other two hunks are described similarly. +# +# === Use +# +# This callback object must be initialised and is used by the Diff::LCS#diff +# method. +# +# cbo = Diff::LCS::DiffCallbacks.new +# Diff::LCS.LCS(seq1, seq2, cbo) +# cbo.finish +# +# Note that the call to #finish is absolutely necessary, or the last set of +# changes will not be visible. Alternatively, can be used as: +# +# cbo = Diff::LCS::DiffCallbacks.new { |tcbo| Diff::LCS.LCS(seq1, seq2, tcbo) } +# +# The necessary #finish call will be made. +# +# === Simplified Array Format +# +# The simplified array format used in the example above can be obtained +# with: +# +# require 'pp' +# pp diffs.map { |e| e.map { |f| f.to_a } } +class Diff::LCS::DiffCallbacks + # Returns the difference set collected during the diff process. + attr_reader :diffs + + def initialize # :yields self: + @hunk = [] + @diffs = [] + + return unless block_given? + + begin + yield self + ensure + finish + end + end + + # Finalizes the diff process. If an unprocessed hunk still exists, then it + # is appended to the diff list. + def finish + finish_hunk + end + + def match(_event) + finish_hunk + end + + def discard_a(event) + @hunk << Diff::LCS::Change.new('-', event.old_position, event.old_element) + end + + def discard_b(event) + @hunk << Diff::LCS::Change.new('+', event.new_position, event.new_element) + end + + def finish_hunk + @diffs << @hunk unless @hunk.empty? + @hunk = [] + end + private :finish_hunk +end + +# This will produce a compound array of contextual diff change objects. Each +# element in the #diffs array is a "hunk" array, where each element in each +# "hunk" array is a single change. Each change is a Diff::LCS::ContextChange +# that contains both the old index and new index values for the change. The +# "hunk" provides the full context for the changes. Both old and new objects +# will be presented for changed objects. +nil+ will be substituted for a +# discarded object. +# +# seq1 = %w(a b c e h j l m n p) +# seq2 = %w(b c d e f j k l m r s t) +# +# diffs = Diff::LCS.diff(seq1, seq2, Diff::LCS::ContextDiffCallbacks) +# # This example shows a simplified array format. +# # [ [ [ '-', [ 0, 'a' ], [ 0, nil ] ] ], # 1 +# # [ [ '+', [ 3, nil ], [ 2, 'd' ] ] ], # 2 +# # [ [ '-', [ 4, 'h' ], [ 4, nil ] ], # 3 +# # [ '+', [ 5, nil ], [ 4, 'f' ] ] ], +# # [ [ '+', [ 6, nil ], [ 6, 'k' ] ] ], # 4 +# # [ [ '-', [ 8, 'n' ], [ 9, nil ] ], # 5 +# # [ '+', [ 9, nil ], [ 9, 'r' ] ], +# # [ '-', [ 9, 'p' ], [ 10, nil ] ], +# # [ '+', [ 10, nil ], [ 10, 's' ] ], +# # [ '+', [ 10, nil ], [ 11, 't' ] ] ] ] +# +# The five hunks shown are comprised of individual changes; if there is a +# related set of changes, they are still shown individually. +# +# This callback can also be used with Diff::LCS#sdiff, which will produce +# results like: +# +# diffs = Diff::LCS.sdiff(seq1, seq2, Diff::LCS::ContextCallbacks) +# # This example shows a simplified array format. +# # [ [ [ "-", [ 0, "a" ], [ 0, nil ] ] ], # 1 +# # [ [ "+", [ 3, nil ], [ 2, "d" ] ] ], # 2 +# # [ [ "!", [ 4, "h" ], [ 4, "f" ] ] ], # 3 +# # [ [ "+", [ 6, nil ], [ 6, "k" ] ] ], # 4 +# # [ [ "!", [ 8, "n" ], [ 9, "r" ] ], # 5 +# # [ "!", [ 9, "p" ], [ 10, "s" ] ], +# # [ "+", [ 10, nil ], [ 11, "t" ] ] ] ] +# +# The five hunks are still present, but are significantly shorter in total +# presentation, because changed items are shown as changes ("!") instead of +# potentially "mismatched" pairs of additions and deletions. +# +# The result of this operation is similar to that of +# Diff::LCS::SDiffCallbacks. They may be compared as: +# +# s = Diff::LCS.sdiff(seq1, seq2).reject { |e| e.action == "=" } +# c = Diff::LCS.sdiff(seq1, seq2, Diff::LCS::ContextDiffCallbacks).flatten(1) +# +# s == c # -> true +# +# === Use +# +# This callback object must be initialised and can be used by the +# Diff::LCS#diff or Diff::LCS#sdiff methods. +# +# cbo = Diff::LCS::ContextDiffCallbacks.new +# Diff::LCS.LCS(seq1, seq2, cbo) +# cbo.finish +# +# Note that the call to #finish is absolutely necessary, or the last set of +# changes will not be visible. Alternatively, can be used as: +# +# cbo = Diff::LCS::ContextDiffCallbacks.new { |tcbo| Diff::LCS.LCS(seq1, seq2, tcbo) } +# +# The necessary #finish call will be made. +# +# === Simplified Array Format +# +# The simplified array format used in the example above can be obtained +# with: +# +# require 'pp' +# pp diffs.map { |e| e.map { |f| f.to_a } } +class Diff::LCS::ContextDiffCallbacks < Diff::LCS::DiffCallbacks + def discard_a(event) + @hunk << Diff::LCS::ContextChange.simplify(event) + end + + def discard_b(event) + @hunk << Diff::LCS::ContextChange.simplify(event) + end + + def change(event) + @hunk << Diff::LCS::ContextChange.simplify(event) + end +end + +# This will produce a simple array of diff change objects. Each element in +# the #diffs array is a single ContextChange. In the set of #diffs provided +# by SDiffCallbacks, both old and new objects will be presented for both +# changed and unchanged objects. +nil+ will be substituted +# for a discarded object. +# +# The diffset produced by this callback, when provided to Diff::LCS#sdiff, +# will compute and display the necessary components to show two sequences +# and their minimized differences side by side, just like the Unix utility +# +sdiff+. +# +# same same +# before | after +# old < - +# - > new +# +# seq1 = %w(a b c e h j l m n p) +# seq2 = %w(b c d e f j k l m r s t) +# +# diffs = Diff::LCS.sdiff(seq1, seq2) +# # This example shows a simplified array format. +# # [ [ "-", [ 0, "a"], [ 0, nil ] ], +# # [ "=", [ 1, "b"], [ 0, "b" ] ], +# # [ "=", [ 2, "c"], [ 1, "c" ] ], +# # [ "+", [ 3, nil], [ 2, "d" ] ], +# # [ "=", [ 3, "e"], [ 3, "e" ] ], +# # [ "!", [ 4, "h"], [ 4, "f" ] ], +# # [ "=", [ 5, "j"], [ 5, "j" ] ], +# # [ "+", [ 6, nil], [ 6, "k" ] ], +# # [ "=", [ 6, "l"], [ 7, "l" ] ], +# # [ "=", [ 7, "m"], [ 8, "m" ] ], +# # [ "!", [ 8, "n"], [ 9, "r" ] ], +# # [ "!", [ 9, "p"], [ 10, "s" ] ], +# # [ "+", [ 10, nil], [ 11, "t" ] ] ] +# +# The result of this operation is similar to that of +# Diff::LCS::ContextDiffCallbacks. They may be compared as: +# +# s = Diff::LCS.sdiff(seq1, seq2).reject { |e| e.action == "=" } +# c = Diff::LCS.sdiff(seq1, seq2, Diff::LCS::ContextDiffCallbacks).flatten(1) +# +# s == c # -> true +# +# === Use +# +# This callback object must be initialised and is used by the Diff::LCS#sdiff +# method. +# +# cbo = Diff::LCS::SDiffCallbacks.new +# Diff::LCS.LCS(seq1, seq2, cbo) +# +# As with the other initialisable callback objects, +# Diff::LCS::SDiffCallbacks can be initialised with a block. As there is no +# "fininishing" to be done, this has no effect on the state of the object. +# +# cbo = Diff::LCS::SDiffCallbacks.new { |tcbo| Diff::LCS.LCS(seq1, seq2, tcbo) } +# +# === Simplified Array Format +# +# The simplified array format used in the example above can be obtained +# with: +# +# require 'pp' +# pp diffs.map { |e| e.to_a } +class Diff::LCS::SDiffCallbacks + # Returns the difference set collected during the diff process. + attr_reader :diffs + + def initialize #:yields self: + @diffs = [] + yield self if block_given? + end + + def match(event) + @diffs << Diff::LCS::ContextChange.simplify(event) + end + + def discard_a(event) + @diffs << Diff::LCS::ContextChange.simplify(event) + end + + def discard_b(event) + @diffs << Diff::LCS::ContextChange.simplify(event) + end + + def change(event) + @diffs << Diff::LCS::ContextChange.simplify(event) + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/diff-lcs-1.5.0/lib/diff/lcs/change.rb b/vendor/bundle/ruby/3.1.0/gems/diff-lcs-1.5.0/lib/diff/lcs/change.rb new file mode 100644 index 000000000..76faf831b --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/diff-lcs-1.5.0/lib/diff/lcs/change.rb @@ -0,0 +1,174 @@ +# frozen_string_literal: true + +# Represents a simplistic (non-contextual) change. Represents the removal or +# addition of an element from either the old or the new sequenced +# enumerable. +class Diff::LCS::Change + IntClass = 1.class # Fixnum is deprecated in Ruby 2.4 # rubocop:disable Naming/ConstantName + + # The only actions valid for changes are '+' (add), '-' (delete), '=' + # (no change), '!' (changed), '<' (tail changes from first sequence), or + # '>' (tail changes from second sequence). The last two ('<>') are only + # found with Diff::LCS::diff and Diff::LCS::sdiff. + VALID_ACTIONS = %w(+ - = ! > <).freeze + + def self.valid_action?(action) + VALID_ACTIONS.include? action + end + + # Returns the action this Change represents. + attr_reader :action + + # Returns the position of the Change. + attr_reader :position + # Returns the sequence element of the Change. + attr_reader :element + + def initialize(*args) + @action, @position, @element = *args + + fail "Invalid Change Action '#{@action}'" unless Diff::LCS::Change.valid_action?(@action) + fail 'Invalid Position Type' unless @position.kind_of? IntClass + end + + def inspect(*_args) + "#<#{self.class}: #{to_a.inspect}>" + end + + def to_a + [@action, @position, @element] + end + + alias to_ary to_a + + def self.from_a(arr) + arr = arr.flatten(1) + case arr.size + when 5 + Diff::LCS::ContextChange.new(*(arr[0...5])) + when 3 + Diff::LCS::Change.new(*(arr[0...3])) + else + fail 'Invalid change array format provided.' + end + end + + include Comparable + + def ==(other) + (self.class == other.class) and + (action == other.action) and + (position == other.position) and + (element == other.element) + end + + def <=>(other) + r = action <=> other.action + r = position <=> other.position if r.zero? + r = element <=> other.element if r.zero? + r + end + + def adding? + @action == '+' + end + + def deleting? + @action == '-' + end + + def unchanged? + @action == '=' + end + + def changed? + @action == '!' + end + + def finished_a? + @action == '>' + end + + def finished_b? + @action == '<' + end +end + +# Represents a contextual change. Contains the position and values of the +# elements in the old and the new sequenced enumerables as well as the action +# taken. +class Diff::LCS::ContextChange < Diff::LCS::Change + # We don't need these two values. + undef :position + undef :element + + # Returns the old position being changed. + attr_reader :old_position + # Returns the new position being changed. + attr_reader :new_position + # Returns the old element being changed. + attr_reader :old_element + # Returns the new element being changed. + attr_reader :new_element + + def initialize(*args) + @action, @old_position, @old_element, @new_position, @new_element = *args + + fail "Invalid Change Action '#{@action}'" unless Diff::LCS::Change.valid_action?(@action) + fail 'Invalid (Old) Position Type' unless @old_position.nil? or @old_position.kind_of? IntClass + fail 'Invalid (New) Position Type' unless @new_position.nil? or @new_position.kind_of? IntClass + end + + def to_a + [ + @action, + [@old_position, @old_element], + [@new_position, @new_element] + ] + end + + alias to_ary to_a + + def self.from_a(arr) + Diff::LCS::Change.from_a(arr) + end + + # Simplifies a context change for use in some diff callbacks. '<' actions + # are converted to '-' and '>' actions are converted to '+'. + def self.simplify(event) + ea = event.to_a + + case ea[0] + when '-' + ea[2][1] = nil + when '<' + ea[0] = '-' + ea[2][1] = nil + when '+' + ea[1][1] = nil + when '>' + ea[0] = '+' + ea[1][1] = nil + end + + Diff::LCS::ContextChange.from_a(ea) + end + + def ==(other) + (self.class == other.class) and + (@action == other.action) and + (@old_position == other.old_position) and + (@new_position == other.new_position) and + (@old_element == other.old_element) and + (@new_element == other.new_element) + end + + def <=>(other) + r = @action <=> other.action + r = @old_position <=> other.old_position if r.zero? + r = @new_position <=> other.new_position if r.zero? + r = @old_element <=> other.old_element if r.zero? + r = @new_element <=> other.new_element if r.zero? + r + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/diff-lcs-1.5.0/lib/diff/lcs/htmldiff.rb b/vendor/bundle/ruby/3.1.0/gems/diff-lcs-1.5.0/lib/diff/lcs/htmldiff.rb new file mode 100644 index 000000000..f12220b3b --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/diff-lcs-1.5.0/lib/diff/lcs/htmldiff.rb @@ -0,0 +1,150 @@ +# frozen_string_literal: true + +require 'cgi' + +# Produce a simple HTML diff view. +class Diff::LCS::HTMLDiff + class << self + attr_accessor :can_expand_tabs #:nodoc: + end + self.can_expand_tabs = true + + class Callbacks #:nodoc: + attr_accessor :output + attr_accessor :match_class + attr_accessor :only_a_class + attr_accessor :only_b_class + + def initialize(output, options = {}) + @output = output + options ||= {} + + @match_class = options[:match_class] || 'match' + @only_a_class = options[:only_a_class] || 'only_a' + @only_b_class = options[:only_b_class] || 'only_b' + end + + def htmlize(element, css_class) + element = ' ' if element.empty? + %Q(
#{element}
\n) + end + private :htmlize + + # This will be called with both lines are the same + def match(event) + @output << htmlize(event.old_element, :match_class) + end + + # This will be called when there is a line in A that isn't in B + def discard_a(event) + @output << htmlize(event.old_element, :only_a_class) + end + + # This will be called when there is a line in B that isn't in A + def discard_b(event) + @output << htmlize(event.new_element, :only_b_class) + end + end + + DEFAULT_OPTIONS = { + :expand_tabs => nil, + :output => nil, + :css => nil, + :title => nil + }.freeze + + DEFAULT_CSS = <<-CSS +body { margin: 0; } +.diff +{ + border: 1px solid black; + margin: 1em 2em; +} +p +{ + margin-left: 2em; +} +pre +{ + padding-left: 1em; + margin: 0; + font-family: Inconsolata, Consolas, Lucida, Courier, monospaced; + white-space: pre; +} +.match { } +.only_a +{ + background-color: #fdd; + color: red; + text-decoration: line-through; +} +.only_b +{ + background-color: #ddf; + color: blue; + border-left: 3px solid blue +} +h1 { margin-left: 2em; } + CSS + + def initialize(left, right, options = nil) + @left = left + @right = right + @options = options + + @options = DEFAULT_OPTIONS.dup if @options.nil? + end + + def verify_options + @options[:expand_tabs] ||= 4 + @options[:expand_tabs] = 4 if @options[:expand_tabs].negative? + + @options[:output] ||= $stdout + + @options[:css] ||= DEFAULT_CSS.dup + + @options[:title] ||= 'diff' + end + private :verify_options + + attr_reader :options + + def run + verify_options + + if @options[:expand_tabs].positive? && self.class.can_expand_tabs + formatter = Text::Format.new + formatter.tabstop = @options[:expand_tabs] + + @left.map! do |line| formatter.expand(line.chomp) end + @right.map! do |line| formatter.expand(line.chomp) end + end + + @left.map! do |line| CGI.escapeHTML(line.chomp) end + @right.map! do |line| CGI.escapeHTML(line.chomp) end + + @options[:output] << <<-OUTPUT + + + #{@options[:title]} + + + +

#{@options[:title]}

+

Legend: Only in Old  + Only in New

+
+ OUTPUT + + callbacks = Callbacks.new(@options[:output]) + Diff::LCS.traverse_sequences(@left, @right, callbacks) + + @options[:output] << <<-OUTPUT +
+ + + OUTPUT + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/diff-lcs-1.5.0/lib/diff/lcs/hunk.rb b/vendor/bundle/ruby/3.1.0/gems/diff-lcs-1.5.0/lib/diff/lcs/hunk.rb new file mode 100644 index 000000000..49b520ead --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/diff-lcs-1.5.0/lib/diff/lcs/hunk.rb @@ -0,0 +1,358 @@ +# frozen_string_literal: true + +require 'diff/lcs/block' + +# A Hunk is a group of Blocks which overlap because of the context surrounding +# each block. (So if we're not using context, every hunk will contain one +# block.) Used in the diff program (bin/ldiff). +class Diff::LCS::Hunk + OLD_DIFF_OP_ACTION = { '+' => 'a', '-' => 'd', '!' => 'c' }.freeze #:nodoc: + ED_DIFF_OP_ACTION = { '+' => 'a', '-' => 'd', '!' => 'c' }.freeze #:nodoc: + + private_constant :OLD_DIFF_OP_ACTION, :ED_DIFF_OP_ACTION if respond_to?(:private_constant) + + # Create a hunk using references to both the old and new data, as well as the + # piece of data. + def initialize(data_old, data_new, piece, flag_context, file_length_difference) + # At first, a hunk will have just one Block in it + @blocks = [Diff::LCS::Block.new(piece)] + + if @blocks[0].remove.empty? && @blocks[0].insert.empty? + fail "Cannot build a hunk from #{piece.inspect}; has no add or remove actions" + end + + if String.method_defined?(:encoding) + @preferred_data_encoding = data_old.fetch(0, data_new.fetch(0, '')).encoding + end + + @data_old = data_old + @data_new = data_new + + before = after = file_length_difference + after += @blocks[0].diff_size + @file_length_difference = after # The caller must get this manually + @max_diff_size = @blocks.map { |e| e.diff_size.abs }.max + + + # Save the start & end of each array. If the array doesn't exist (e.g., + # we're only adding items in this block), then figure out the line number + # based on the line number of the other file and the current difference in + # file lengths. + if @blocks[0].remove.empty? + a1 = a2 = nil + else + a1 = @blocks[0].remove[0].position + a2 = @blocks[0].remove[-1].position + end + + if @blocks[0].insert.empty? + b1 = b2 = nil + else + b1 = @blocks[0].insert[0].position + b2 = @blocks[0].insert[-1].position + end + + @start_old = a1 || (b1 - before) + @start_new = b1 || (a1 + before) + @end_old = a2 || (b2 - after) + @end_new = b2 || (a2 + after) + + self.flag_context = flag_context + end + + attr_reader :blocks + attr_reader :start_old, :start_new + attr_reader :end_old, :end_new + attr_reader :file_length_difference + + # Change the "start" and "end" fields to note that context should be added + # to this hunk. + attr_accessor :flag_context # rubocop:disable Layout/EmptyLinesAroundAttributeAccessor + undef :flag_context= + def flag_context=(context) #:nodoc: # rubocop:disable Lint/DuplicateMethods + return if context.nil? or context.zero? + + add_start = context > @start_old ? @start_old : context + + @start_old -= add_start + @start_new -= add_start + + old_size = @data_old.size + + add_end = + if (@end_old + context) > old_size + old_size - @end_old + else + context + end + + add_end = @max_diff_size if add_end >= old_size + + @end_old += add_end + @end_new += add_end + end + + # Merges this hunk and the provided hunk together if they overlap. Returns + # a truthy value so that if there is no overlap, you can know the merge + # was skipped. + def merge(hunk) + return unless overlaps?(hunk) + + @start_old = hunk.start_old + @start_new = hunk.start_new + blocks.unshift(*hunk.blocks) + end + alias unshift merge + + # Determines whether there is an overlap between this hunk and the + # provided hunk. This will be true if the difference between the two hunks + # start or end positions is within one position of each other. + def overlaps?(hunk) + hunk and (((@start_old - hunk.end_old) <= 1) or + ((@start_new - hunk.end_new) <= 1)) + end + + # Returns a diff string based on a format. + def diff(format, last = false) + case format + when :old + old_diff(last) + when :unified + unified_diff(last) + when :context + context_diff(last) + when :ed + self + when :reverse_ed, :ed_finish + ed_diff(format, last) + else + fail "Unknown diff format #{format}." + end + end + + # Note that an old diff can't have any context. Therefore, we know that + # there's only one block in the hunk. + def old_diff(_last = false) + warn 'Expecting only one block in an old diff hunk!' if @blocks.size > 1 + + block = @blocks[0] + + # Calculate item number range. Old diff range is just like a context + # diff range, except the ranges are on one line with the action between + # them. + s = encode("#{context_range(:old, ',')}#{OLD_DIFF_OP_ACTION[block.op]}#{context_range(:new, ',')}\n") + # If removing anything, just print out all the remove lines in the hunk + # which is just all the remove lines in the block. + unless block.remove.empty? + @data_old[@start_old..@end_old].each { |e| s << encode('< ') + e.chomp + encode("\n") } + end + + s << encode("---\n") if block.op == '!' + + unless block.insert.empty? + @data_new[@start_new..@end_new].each { |e| s << encode('> ') + e.chomp + encode("\n") } + end + + s + end + private :old_diff + + def unified_diff(last = false) + # Calculate item number range. + s = encode("@@ -#{unified_range(:old, last)} +#{unified_range(:new, last)} @@\n") + + # Outlist starts containing the hunk of the old file. Removing an item + # just means putting a '-' in front of it. Inserting an item requires + # getting it from the new file and splicing it in. We splice in + # +num_added+ items. Remove blocks use +num_added+ because splicing + # changed the length of outlist. + # + # We remove +num_removed+ items. Insert blocks use +num_removed+ + # because their item numbers -- corresponding to positions in the NEW + # file -- don't take removed items into account. + lo, hi, num_added, num_removed = @start_old, @end_old, 0, 0 + + outlist = @data_old[lo..hi].map { |e| String.new("#{encode(' ')}#{e.chomp}") } + + last_block = blocks[-1] + + if last + old_missing_newline = missing_last_newline?(@data_old) + new_missing_newline = missing_last_newline?(@data_new) + end + + @blocks.each do |block| + block.remove.each do |item| + op = item.action.to_s # - + offset = item.position - lo + num_added + outlist[offset][0, 1] = encode(op) + num_removed += 1 + end + + if last && block == last_block && old_missing_newline && !new_missing_newline + outlist << encode('\\ No newline at end of file') + num_removed += 1 + end + + block.insert.each do |item| + op = item.action.to_s # + + offset = item.position - @start_new + num_removed + outlist[offset, 0] = encode(op) + @data_new[item.position].chomp + num_added += 1 + end + end + + outlist << encode('\\ No newline at end of file') if last && new_missing_newline + + s << outlist.join(encode("\n")) + + s + end + private :unified_diff + + def context_diff(last = false) + s = encode("***************\n") + s << encode("*** #{context_range(:old, ',', last)} ****\n") + r = context_range(:new, ',', last) + + if last + old_missing_newline = missing_last_newline?(@data_old) + new_missing_newline = missing_last_newline?(@data_new) + end + + # Print out file 1 part for each block in context diff format if there + # are any blocks that remove items + lo, hi = @start_old, @end_old + removes = @blocks.reject { |e| e.remove.empty? } + + unless removes.empty? + outlist = @data_old[lo..hi].map { |e| String.new("#{encode(' ')}#{e.chomp}") } + + last_block = removes[-1] + + removes.each do |block| + block.remove.each do |item| + outlist[item.position - lo][0, 1] = encode(block.op) # - or ! + end + + if last && block == last_block && old_missing_newline + outlist << encode('\\ No newline at end of file') + end + end + + s << outlist.join(encode("\n")) << encode("\n") + end + + s << encode("--- #{r} ----\n") + lo, hi = @start_new, @end_new + inserts = @blocks.reject { |e| e.insert.empty? } + + unless inserts.empty? + outlist = @data_new[lo..hi].map { |e| String.new("#{encode(' ')}#{e.chomp}") } + + last_block = inserts[-1] + + inserts.each do |block| + block.insert.each do |item| + outlist[item.position - lo][0, 1] = encode(block.op) # + or ! + end + + if last && block == last_block && new_missing_newline + outlist << encode('\\ No newline at end of file') + end + end + s << outlist.join(encode("\n")) + end + + s + end + private :context_diff + + def ed_diff(format, _last = false) + warn 'Expecting only one block in an old diff hunk!' if @blocks.size > 1 + + s = + if format == :reverse_ed + encode("#{ED_DIFF_OP_ACTION[@blocks[0].op]}#{context_range(:old, ',')}\n") + else + encode("#{context_range(:old, ' ')}#{ED_DIFF_OP_ACTION[@blocks[0].op]}\n") + end + + unless @blocks[0].insert.empty? + @data_new[@start_new..@end_new].each do |e| + s << e.chomp + encode("\n") + end + s << encode(".\n") + end + s + end + private :ed_diff + + # Generate a range of item numbers to print. Only print 1 number if the + # range has only one item in it. Otherwise, it's 'start,end' + def context_range(mode, op, last = false) + case mode + when :old + s, e = (@start_old + 1), (@end_old + 1) + when :new + s, e = (@start_new + 1), (@end_new + 1) + end + + e -= 1 if last + e = 1 if e.zero? + + s < e ? "#{s}#{op}#{e}" : e.to_s + end + private :context_range + + # Generate a range of item numbers to print for unified diff. Print number + # where block starts, followed by number of lines in the block + # (don't print number of lines if it's 1) + def unified_range(mode, last) + case mode + when :old + s, e = (@start_old + 1), (@end_old + 1) + when :new + s, e = (@start_new + 1), (@end_new + 1) + end + + length = e - s + (last ? 0 : 1) + + first = length < 2 ? e : s # "strange, but correct" + length <= 1 ? first.to_s : "#{first},#{length}" + end + private :unified_range + + def missing_last_newline?(data) + newline = encode("\n") + + if data[-2] + data[-2].end_with?(newline) && !data[-1].end_with?(newline) + elsif data[-1] + !data[-1].end_with?(newline) + else + true + end + end + + if String.method_defined?(:encoding) + def encode(literal, target_encoding = @preferred_data_encoding) + literal.encode target_encoding + end + + def encode_as(string, *args) + args.map { |arg| arg.encode(string.encoding) } + end + else + def encode(literal, _target_encoding = nil) + literal + end + + def encode_as(_string, *args) + args + end + end + + private :encode + private :encode_as +end diff --git a/vendor/bundle/ruby/3.1.0/gems/diff-lcs-1.5.0/lib/diff/lcs/internals.rb b/vendor/bundle/ruby/3.1.0/gems/diff-lcs-1.5.0/lib/diff/lcs/internals.rb new file mode 100644 index 000000000..ef7766743 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/diff-lcs-1.5.0/lib/diff/lcs/internals.rb @@ -0,0 +1,308 @@ +# frozen_string_literal: true + +class << Diff::LCS + def diff_traversal(method, seq1, seq2, callbacks, &block) + callbacks = callbacks_for(callbacks) + case method + when :diff + traverse_sequences(seq1, seq2, callbacks) + when :sdiff + traverse_balanced(seq1, seq2, callbacks) + end + callbacks.finish if callbacks.respond_to? :finish + + if block + callbacks.diffs.map do |hunk| + if hunk.kind_of? Array + hunk.map { |hunk_block| block[hunk_block] } + else + block[hunk] + end + end + else + callbacks.diffs + end + end + private :diff_traversal +end + +module Diff::LCS::Internals # :nodoc: +end + +class << Diff::LCS::Internals + # Compute the longest common subsequence between the sequenced + # Enumerables +a+ and +b+. The result is an array whose contents is such + # that + # + # result = Diff::LCS::Internals.lcs(a, b) + # result.each_with_index do |e, i| + # assert_equal(a[i], b[e]) unless e.nil? + # end + def lcs(a, b) + a_start = b_start = 0 + a_finish = a.size - 1 + b_finish = b.size - 1 + vector = [] + + # Collect any common elements at the beginning... + while (a_start <= a_finish) and (b_start <= b_finish) and (a[a_start] == b[b_start]) + vector[a_start] = b_start + a_start += 1 + b_start += 1 + end + + # Now the end... + while (a_start <= a_finish) and (b_start <= b_finish) and (a[a_finish] == b[b_finish]) + vector[a_finish] = b_finish + a_finish -= 1 + b_finish -= 1 + end + + # Now, compute the equivalence classes of positions of elements. + # An explanation for how this works: https://codeforces.com/topic/92191 + b_matches = position_hash(b, b_start..b_finish) + + thresh = [] + links = [] + string = a.kind_of?(String) + + (a_start..a_finish).each do |i| + ai = string ? a[i, 1] : a[i] + bm = b_matches[ai] + k = nil + bm.reverse_each do |j| + # Although the threshold check is not mandatory for this to work, + # it may have an optimization purpose + # An attempt to remove it: https://github.com/halostatue/diff-lcs/pull/72 + # Why it is reintroduced: https://github.com/halostatue/diff-lcs/issues/78 + if k and (thresh[k] > j) and (thresh[k - 1] < j) + thresh[k] = j + else + k = replace_next_larger(thresh, j, k) + end + links[k] = [k.positive? ? links[k - 1] : nil, i, j] unless k.nil? + end + end + + unless thresh.empty? + link = links[thresh.size - 1] + until link.nil? + vector[link[1]] = link[2] + link = link[0] + end + end + + vector + end + + # This method will analyze the provided patchset to provide a single-pass + # normalization (conversion of the array form of Diff::LCS::Change objects to + # the object form of same) and detection of whether the patchset represents + # changes to be made. + def analyze_patchset(patchset, depth = 0) + fail 'Patchset too complex' if depth > 1 + + has_changes = false + new_patchset = [] + + # Format: + # [ # patchset + # # hunk (change) + # [ # hunk + # # change + # ] + # ] + + patchset.each do |hunk| + case hunk + when Diff::LCS::Change + has_changes ||= !hunk.unchanged? + new_patchset << hunk + when Array + # Detect if the 'hunk' is actually an array-format change object. + if Diff::LCS::Change.valid_action? hunk[0] + hunk = Diff::LCS::Change.from_a(hunk) + has_changes ||= !hunk.unchanged? + new_patchset << hunk + else + with_changes, hunk = analyze_patchset(hunk, depth + 1) + has_changes ||= with_changes + new_patchset.concat(hunk) + end + else + fail ArgumentError, "Cannot normalise a hunk of class #{hunk.class}." + end + end + + [has_changes, new_patchset] + end + + # Examine the patchset and the source to see in which direction the + # patch should be applied. + # + # WARNING: By default, this examines the whole patch, so this could take + # some time. This also works better with Diff::LCS::ContextChange or + # Diff::LCS::Change as its source, as an array will cause the creation + # of one of the above. + def intuit_diff_direction(src, patchset, limit = nil) + string = src.kind_of?(String) + count = left_match = left_miss = right_match = right_miss = 0 + + patchset.each do |change| + count += 1 + + case change + when Diff::LCS::ContextChange + le = string ? src[change.old_position, 1] : src[change.old_position] + re = string ? src[change.new_position, 1] : src[change.new_position] + + case change.action + when '-' # Remove details from the old string + if le == change.old_element + left_match += 1 + else + left_miss += 1 + end + when '+' + if re == change.new_element + right_match += 1 + else + right_miss += 1 + end + when '=' + left_miss += 1 if le != change.old_element + right_miss += 1 if re != change.new_element + when '!' + if le == change.old_element + left_match += 1 + elsif re == change.new_element + right_match += 1 + else + left_miss += 1 + right_miss += 1 + end + end + when Diff::LCS::Change + # With a simplistic change, we can't tell the difference between + # the left and right on '!' actions, so we ignore those. On '=' + # actions, if there's a miss, we miss both left and right. + element = string ? src[change.position, 1] : src[change.position] + + case change.action + when '-' + if element == change.element + left_match += 1 + else + left_miss += 1 + end + when '+' + if element == change.element + right_match += 1 + else + right_miss += 1 + end + when '=' + if element != change.element + left_miss += 1 + right_miss += 1 + end + end + end + + break if !limit.nil? && (count > limit) + end + + no_left = left_match.zero? && left_miss.positive? + no_right = right_match.zero? && right_miss.positive? + + case [no_left, no_right] + when [false, true] + :patch + when [true, false] + :unpatch + else + case left_match <=> right_match + when 1 + if left_miss.zero? + :patch + else + :unpatch + end + when -1 + if right_miss.zero? + :unpatch + else + :patch + end + else + fail "The provided patchset does not appear to apply to the provided \ +enumerable as either source or destination value." + end + end + end + + # Find the place at which +value+ would normally be inserted into the + # Enumerable. If that place is already occupied by +value+, do nothing + # and return +nil+. If the place does not exist (i.e., it is off the end + # of the Enumerable), add it to the end. Otherwise, replace the element + # at that point with +value+. It is assumed that the Enumerable's values + # are numeric. + # + # This operation preserves the sort order. + def replace_next_larger(enum, value, last_index = nil) + # Off the end? + if enum.empty? or (value > enum[-1]) + enum << value + return enum.size - 1 + end + + # Binary search for the insertion point + last_index ||= enum.size - 1 + first_index = 0 + while first_index <= last_index + i = (first_index + last_index) >> 1 + + found = enum[i] + + return nil if value == found + + if value > found + first_index = i + 1 + else + last_index = i - 1 + end + end + + # The insertion point is in first_index; overwrite the next larger + # value. + enum[first_index] = value + first_index + end + private :replace_next_larger + + # If +vector+ maps the matching elements of another collection onto this + # Enumerable, compute the inverse of +vector+ that maps this Enumerable + # onto the collection. (Currently unused.) + def inverse_vector(a, vector) + inverse = a.dup + (0...vector.size).each do |i| + inverse[vector[i]] = i unless vector[i].nil? + end + inverse + end + private :inverse_vector + + # Returns a hash mapping each element of an Enumerable to the set of + # positions it occupies in the Enumerable, optionally restricted to the + # elements specified in the range of indexes specified by +interval+. + def position_hash(enum, interval) + string = enum.kind_of?(String) + hash = Hash.new { |h, k| h[k] = [] } + interval.each do |i| + k = string ? enum[i, 1] : enum[i] + hash[k] << i + end + hash + end + private :position_hash +end diff --git a/vendor/bundle/ruby/3.1.0/gems/diff-lcs-1.5.0/lib/diff/lcs/ldiff.rb b/vendor/bundle/ruby/3.1.0/gems/diff-lcs-1.5.0/lib/diff/lcs/ldiff.rb new file mode 100644 index 000000000..17b374cc3 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/diff-lcs-1.5.0/lib/diff/lcs/ldiff.rb @@ -0,0 +1,171 @@ +# frozen_string_literal: true + +require 'optparse' +require 'ostruct' +require 'diff/lcs/hunk' + +module Diff::LCS::Ldiff #:nodoc: + BANNER = <<-COPYRIGHT +ldiff #{Diff::LCS::VERSION} + Copyright 2004-2019 Austin Ziegler + + Part of Diff::LCS. + https://github.com/halostatue/diff-lcs + + This program is free software. It may be redistributed and/or modified under + the terms of the GPL version 2 (or later), the Perl Artistic licence, or the + MIT licence. + COPYRIGHT +end + +class << Diff::LCS::Ldiff + attr_reader :format, :lines #:nodoc: + attr_reader :file_old, :file_new #:nodoc: + attr_reader :data_old, :data_new #:nodoc: + + def run(args, _input = $stdin, output = $stdout, error = $stderr) #:nodoc: + @binary = nil + + args.options do |o| + o.banner = "Usage: #{File.basename($0)} [options] oldfile newfile" + o.separator '' + o.on( + '-c', '-C', '--context [LINES]', Integer, + 'Displays a context diff with LINES lines', 'of context. Default 3 lines.' + ) do |ctx| + @format = :context + @lines = ctx || 3 + end + o.on( + '-u', '-U', '--unified [LINES]', Integer, + 'Displays a unified diff with LINES lines', 'of context. Default 3 lines.' + ) do |ctx| + @format = :unified + @lines = ctx || 3 + end + o.on('-e', 'Creates an \'ed\' script to change', 'oldfile to newfile.') do |_ctx| + @format = :ed + end + o.on('-f', 'Creates an \'ed\' script to change', 'oldfile to newfile in reverse order.') do |_ctx| + @format = :reverse_ed + end + o.on( + '-a', '--text', + 'Treat the files as text and compare them', 'line-by-line, even if they do not seem', 'to be text.' + ) do |_txt| + @binary = false + end + o.on('--binary', 'Treats the files as binary.') do |_bin| + @binary = true + end + o.on('-q', '--brief', 'Report only whether or not the files', 'differ, not the details.') do |_ctx| + @format = :report + end + o.on_tail('--help', 'Shows this text.') do + error << o + return 0 + end + o.on_tail('--version', 'Shows the version of Diff::LCS.') do + error << Diff::LCS::Ldiff::BANNER + return 0 + end + o.on_tail '' + o.on_tail 'By default, runs produces an "old-style" diff, with output like UNIX diff.' + o.parse! + end + + unless args.size == 2 + error << args.options + return 127 + end + + # Defaults are for old-style diff + @format ||= :old + @lines ||= 0 + + file_old, file_new = *ARGV + + case @format + when :context + char_old = '*' * 3 + char_new = '-' * 3 + when :unified + char_old = '-' * 3 + char_new = '+' * 3 + end + + # After we've read up to a certain point in each file, the number of + # items we've read from each file will differ by FLD (could be 0). + file_length_difference = 0 + + data_old = IO.read(file_old) + data_new = IO.read(file_new) + + # Test binary status + if @binary.nil? + old_txt = data_old[0, 4096].scan(/\0/).empty? + new_txt = data_new[0, 4096].scan(/\0/).empty? + @binary = !old_txt || !new_txt + end + + unless @binary + data_old = data_old.lines.to_a + data_new = data_new.lines.to_a + end + + # diff yields lots of pieces, each of which is basically a Block object + if @binary + diffs = (data_old == data_new) + else + diffs = Diff::LCS.diff(data_old, data_new) + diffs = nil if diffs.empty? + end + + return 0 unless diffs + + if @format == :report + output << "Files #{file_old} and #{file_new} differ\n" + return 1 + end + + if (@format == :unified) or (@format == :context) + ft = File.stat(file_old).mtime.localtime.strftime('%Y-%m-%d %H:%M:%S.000000000 %z') + output << "#{char_old} #{file_old}\t#{ft}\n" + ft = File.stat(file_new).mtime.localtime.strftime('%Y-%m-%d %H:%M:%S.000000000 %z') + output << "#{char_new} #{file_new}\t#{ft}\n" + end + + # Loop over hunks. If a hunk overlaps with the last hunk, join them. + # Otherwise, print out the old one. + oldhunk = hunk = nil + + if @format == :ed + real_output = output + output = [] + end + + diffs.each do |piece| + begin # rubocop:disable Style/RedundantBegin + hunk = Diff::LCS::Hunk.new(data_old, data_new, piece, @lines, file_length_difference) + file_length_difference = hunk.file_length_difference + + next unless oldhunk + next if @lines.positive? and hunk.merge(oldhunk) + + output << oldhunk.diff(@format) + output << "\n" if @format == :unified + ensure + oldhunk = hunk + end + end + + last = oldhunk.diff(@format, true) + last << "\n" if last.respond_to?(:end_with?) && !last.end_with?("\n") + + output << last + + output.reverse_each { |e| real_output << e.diff(:ed_finish) } if @format == :ed + + 1 + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/diff-lcs-1.5.0/lib/diff/lcs/string.rb b/vendor/bundle/ruby/3.1.0/gems/diff-lcs-1.5.0/lib/diff/lcs/string.rb new file mode 100644 index 000000000..9ab32e92b --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/diff-lcs-1.5.0/lib/diff/lcs/string.rb @@ -0,0 +1,5 @@ +# frozen_string_literal: true + +class String + include Diff::LCS +end diff --git a/vendor/bundle/ruby/3.1.0/gems/diff-lcs-1.5.0/spec/change_spec.rb b/vendor/bundle/ruby/3.1.0/gems/diff-lcs-1.5.0/spec/change_spec.rb new file mode 100644 index 000000000..b8d3443e5 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/diff-lcs-1.5.0/spec/change_spec.rb @@ -0,0 +1,89 @@ +# frozen_string_literal: true + +require 'spec_helper' + +describe Diff::LCS::Change do + describe 'an add' do + subject { described_class.new('+', 0, 'element') } + it { should_not be_deleting } + it { should be_adding } + it { should_not be_unchanged } + it { should_not be_changed } + it { should_not be_finished_a } + it { should_not be_finished_b } + end + + describe 'a delete' do + subject { described_class.new('-', 0, 'element') } + it { should be_deleting } + it { should_not be_adding } + it { should_not be_unchanged } + it { should_not be_changed } + it { should_not be_finished_a } + it { should_not be_finished_b } + end + + describe 'an unchanged' do + subject { described_class.new('=', 0, 'element') } + it { should_not be_deleting } + it { should_not be_adding } + it { should be_unchanged } + it { should_not be_changed } + it { should_not be_finished_a } + it { should_not be_finished_b } + end + + describe 'a changed' do + subject { described_class.new('!', 0, 'element') } + it { should_not be_deleting } + it { should_not be_adding } + it { should_not be_unchanged } + it { should be_changed } + it { should_not be_finished_a } + it { should_not be_finished_b } + end + + describe 'a finished_a' do + subject { described_class.new('>', 0, 'element') } + it { should_not be_deleting } + it { should_not be_adding } + it { should_not be_unchanged } + it { should_not be_changed } + it { should be_finished_a } + it { should_not be_finished_b } + end + + describe 'a finished_b' do + subject { described_class.new('<', 0, 'element') } + it { should_not be_deleting } + it { should_not be_adding } + it { should_not be_unchanged } + it { should_not be_changed } + it { should_not be_finished_a } + it { should be_finished_b } + end + + describe 'as array' do + it 'should be converted' do + action, position, element = described_class.new('!', 0, 'element') + expect(action).to eq '!' + expect(position).to eq 0 + expect(element).to eq 'element' + end + end +end + +describe Diff::LCS::ContextChange do + describe 'as array' do + it 'should be converted' do + action, (old_position, old_element), (new_position, new_element) = + described_class.new('!', 1, 'old_element', 2, 'new_element') + + expect(action).to eq '!' + expect(old_position).to eq 1 + expect(old_element).to eq 'old_element' + expect(new_position).to eq 2 + expect(new_element).to eq 'new_element' + end + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/diff-lcs-1.5.0/spec/diff_spec.rb b/vendor/bundle/ruby/3.1.0/gems/diff-lcs-1.5.0/spec/diff_spec.rb new file mode 100644 index 000000000..e7d632aef --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/diff-lcs-1.5.0/spec/diff_spec.rb @@ -0,0 +1,51 @@ +# frozen_string_literal: true + +require 'spec_helper' + +describe Diff::LCS, '.diff' do + include Diff::LCS::SpecHelper::Matchers + + it 'correctly diffs seq1 to seq2' do + diff_s1_s2 = Diff::LCS.diff(seq1, seq2) + expect(change_diff(correct_forward_diff)).to eq(diff_s1_s2) + end + + it 'correctly diffs seq2 to seq1' do + diff_s2_s1 = Diff::LCS.diff(seq2, seq1) + expect(change_diff(correct_backward_diff)).to eq(diff_s2_s1) + end + + it 'correctly diffs against an empty sequence' do + diff = Diff::LCS.diff(word_sequence, []) + correct_diff = [ + [ + ['-', 0, 'abcd'], + ['-', 1, 'efgh'], + ['-', 2, 'ijkl'], + ['-', 3, 'mnopqrstuvwxyz'] + ] + ] + + expect(change_diff(correct_diff)).to eq(diff) + + diff = Diff::LCS.diff([], word_sequence) + correct_diff.each do |hunk| + hunk.each do |change| change[0] = '+' end + end + expect(change_diff(correct_diff)).to eq(diff) + end + + it "correctly diffs 'xx' and 'xaxb'" do + left = 'xx' + right = 'xaxb' + expect(Diff::LCS.patch(left, Diff::LCS.diff(left, right))).to eq(right) + end + + it 'returns an empty diff with (hello, hello)' do + expect(Diff::LCS.diff(hello, hello)).to be_empty + end + + it 'returns an empty diff with (hello_ary, hello_ary)' do + expect(Diff::LCS.diff(hello_ary, hello_ary)).to be_empty + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/diff-lcs-1.5.0/spec/fixtures/aX b/vendor/bundle/ruby/3.1.0/gems/diff-lcs-1.5.0/spec/fixtures/aX new file mode 100644 index 000000000..5765d6a73 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/diff-lcs-1.5.0/spec/fixtures/aX @@ -0,0 +1 @@ +aX diff --git a/vendor/bundle/ruby/3.1.0/gems/diff-lcs-1.5.0/spec/fixtures/bXaX b/vendor/bundle/ruby/3.1.0/gems/diff-lcs-1.5.0/spec/fixtures/bXaX new file mode 100644 index 000000000..a1c813dbd --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/diff-lcs-1.5.0/spec/fixtures/bXaX @@ -0,0 +1 @@ +bXaX diff --git a/vendor/bundle/ruby/3.1.0/gems/diff-lcs-1.5.0/spec/fixtures/ds1.csv b/vendor/bundle/ruby/3.1.0/gems/diff-lcs-1.5.0/spec/fixtures/ds1.csv new file mode 100644 index 000000000..9ac84281d --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/diff-lcs-1.5.0/spec/fixtures/ds1.csv @@ -0,0 +1,50 @@ +1,3 +2,7 +3,13 +4,21 +5,31 +6,43 +7,57 +8,73 +9,91 +10,111 +11,133 +12,157 +13,183 +14,211 +15,241 +16,273 +17,307 +18,343 +19,381 +20,421 +21,463 +22,507 +23,553 +24,601 +25,651 +26,703 +27,757 +28,813 +29,871 +30,931 +31,993 +32,1057 +33,1123 +34,1191 +35,1261 +36,1333 +37,1407 +38,1483 +39,1561 +40,1641 +41,1723 +42,1807 +43,1893 +44,1981 +45,2071 +46,2163 +47,2257 +48,2353 +49,2451 +50,2500 \ No newline at end of file diff --git a/vendor/bundle/ruby/3.1.0/gems/diff-lcs-1.5.0/spec/fixtures/ds2.csv b/vendor/bundle/ruby/3.1.0/gems/diff-lcs-1.5.0/spec/fixtures/ds2.csv new file mode 100644 index 000000000..797de7619 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/diff-lcs-1.5.0/spec/fixtures/ds2.csv @@ -0,0 +1,51 @@ + 1,3 +2,7 +3,13 +4,21 +5,31 +6,42 +7,57 +8,73 +9,91 +10,111 +11,133 +12,157 +13,183 +14,211 +15,241 +16,273 +17,307 +18,343 +19,200 +20,421 +21,463 +22,507 +23,553 +24,601 +25,651 +26,703 +27,757 +28,813 +29,871 +30,931 +31,123 +32,1057 +33,1123 +34,1000 +35,1261 +36,1333 +37,1407 +38,1483 +39,1561 +40,1641 +41,1723 +42,1807 +43,1893 +44,1981 +45,2071 +46,2163 +47,1524 +48,2353 +49,2451 +50,2500 +51,2520 diff --git a/vendor/bundle/ruby/3.1.0/gems/diff-lcs-1.5.0/spec/fixtures/ldiff/output.diff b/vendor/bundle/ruby/3.1.0/gems/diff-lcs-1.5.0/spec/fixtures/ldiff/output.diff new file mode 100644 index 000000000..fa1a34796 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/diff-lcs-1.5.0/spec/fixtures/ldiff/output.diff @@ -0,0 +1,4 @@ +1c1 +< aX +--- +> bXaX diff --git a/vendor/bundle/ruby/3.1.0/gems/diff-lcs-1.5.0/spec/fixtures/ldiff/output.diff-c b/vendor/bundle/ruby/3.1.0/gems/diff-lcs-1.5.0/spec/fixtures/ldiff/output.diff-c new file mode 100644 index 000000000..0e1ad9986 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/diff-lcs-1.5.0/spec/fixtures/ldiff/output.diff-c @@ -0,0 +1,7 @@ +*** spec/fixtures/aX 2020-06-23 11:15:32.000000000 -0400 +--- spec/fixtures/bXaX 2020-06-23 11:15:32.000000000 -0400 +*************** +*** 1 **** +! aX +--- 1 ---- +! bXaX diff --git a/vendor/bundle/ruby/3.1.0/gems/diff-lcs-1.5.0/spec/fixtures/ldiff/output.diff-e b/vendor/bundle/ruby/3.1.0/gems/diff-lcs-1.5.0/spec/fixtures/ldiff/output.diff-e new file mode 100644 index 000000000..13e0f7f05 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/diff-lcs-1.5.0/spec/fixtures/ldiff/output.diff-e @@ -0,0 +1,3 @@ +1c +bXaX +. diff --git a/vendor/bundle/ruby/3.1.0/gems/diff-lcs-1.5.0/spec/fixtures/ldiff/output.diff-f b/vendor/bundle/ruby/3.1.0/gems/diff-lcs-1.5.0/spec/fixtures/ldiff/output.diff-f new file mode 100644 index 000000000..77710c76e --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/diff-lcs-1.5.0/spec/fixtures/ldiff/output.diff-f @@ -0,0 +1,3 @@ +c1 +bXaX +. diff --git a/vendor/bundle/ruby/3.1.0/gems/diff-lcs-1.5.0/spec/fixtures/ldiff/output.diff-u b/vendor/bundle/ruby/3.1.0/gems/diff-lcs-1.5.0/spec/fixtures/ldiff/output.diff-u new file mode 100644 index 000000000..b84f71805 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/diff-lcs-1.5.0/spec/fixtures/ldiff/output.diff-u @@ -0,0 +1,5 @@ +--- spec/fixtures/aX 2020-06-23 11:15:32.000000000 -0400 ++++ spec/fixtures/bXaX 2020-06-23 11:15:32.000000000 -0400 +@@ -1 +1 @@ +-aX ++bXaX diff --git a/vendor/bundle/ruby/3.1.0/gems/diff-lcs-1.5.0/spec/fixtures/ldiff/output.diff.chef b/vendor/bundle/ruby/3.1.0/gems/diff-lcs-1.5.0/spec/fixtures/ldiff/output.diff.chef new file mode 100644 index 000000000..8b98efb1e --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/diff-lcs-1.5.0/spec/fixtures/ldiff/output.diff.chef @@ -0,0 +1,4 @@ +3c3 +< "description": "hi" +--- +> "description": "lo" diff --git a/vendor/bundle/ruby/3.1.0/gems/diff-lcs-1.5.0/spec/fixtures/ldiff/output.diff.chef-c b/vendor/bundle/ruby/3.1.0/gems/diff-lcs-1.5.0/spec/fixtures/ldiff/output.diff.chef-c new file mode 100644 index 000000000..efbfa1957 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/diff-lcs-1.5.0/spec/fixtures/ldiff/output.diff.chef-c @@ -0,0 +1,15 @@ +*** spec/fixtures/old-chef 2020-06-23 23:18:20.000000000 -0400 +--- spec/fixtures/new-chef 2020-06-23 23:18:20.000000000 -0400 +*************** +*** 1,4 **** + { + "name": "x", +! "description": "hi" + } +\ No newline at end of file +--- 1,4 ---- + { + "name": "x", +! "description": "lo" + } +\ No newline at end of file diff --git a/vendor/bundle/ruby/3.1.0/gems/diff-lcs-1.5.0/spec/fixtures/ldiff/output.diff.chef-e b/vendor/bundle/ruby/3.1.0/gems/diff-lcs-1.5.0/spec/fixtures/ldiff/output.diff.chef-e new file mode 100644 index 000000000..775d881c1 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/diff-lcs-1.5.0/spec/fixtures/ldiff/output.diff.chef-e @@ -0,0 +1,3 @@ +3c + "description": "lo" +. diff --git a/vendor/bundle/ruby/3.1.0/gems/diff-lcs-1.5.0/spec/fixtures/ldiff/output.diff.chef-f b/vendor/bundle/ruby/3.1.0/gems/diff-lcs-1.5.0/spec/fixtures/ldiff/output.diff.chef-f new file mode 100644 index 000000000..9bf1e67f0 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/diff-lcs-1.5.0/spec/fixtures/ldiff/output.diff.chef-f @@ -0,0 +1,3 @@ +c3 + "description": "lo" +. diff --git a/vendor/bundle/ruby/3.1.0/gems/diff-lcs-1.5.0/spec/fixtures/ldiff/output.diff.chef-u b/vendor/bundle/ruby/3.1.0/gems/diff-lcs-1.5.0/spec/fixtures/ldiff/output.diff.chef-u new file mode 100644 index 000000000..dbacd8898 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/diff-lcs-1.5.0/spec/fixtures/ldiff/output.diff.chef-u @@ -0,0 +1,9 @@ +--- spec/fixtures/old-chef 2020-06-23 23:18:20.000000000 -0400 ++++ spec/fixtures/new-chef 2020-06-23 23:18:20.000000000 -0400 +@@ -1,4 +1,4 @@ + { + "name": "x", +- "description": "hi" ++ "description": "lo" + } +\ No newline at end of file diff --git a/vendor/bundle/ruby/3.1.0/gems/diff-lcs-1.5.0/spec/fixtures/ldiff/output.diff.chef2 b/vendor/bundle/ruby/3.1.0/gems/diff-lcs-1.5.0/spec/fixtures/ldiff/output.diff.chef2 new file mode 100644 index 000000000..496b3dc8c --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/diff-lcs-1.5.0/spec/fixtures/ldiff/output.diff.chef2 @@ -0,0 +1,7 @@ +2d1 +< recipe[b::default] +14a14,17 +> recipe[o::new] +> recipe[p::new] +> recipe[q::new] +> recipe[r::new] diff --git a/vendor/bundle/ruby/3.1.0/gems/diff-lcs-1.5.0/spec/fixtures/ldiff/output.diff.chef2-c b/vendor/bundle/ruby/3.1.0/gems/diff-lcs-1.5.0/spec/fixtures/ldiff/output.diff.chef2-c new file mode 100644 index 000000000..8349a7a80 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/diff-lcs-1.5.0/spec/fixtures/ldiff/output.diff.chef2-c @@ -0,0 +1,20 @@ +*** spec/fixtures/old-chef2 2020-06-30 09:43:35.000000000 -0400 +--- spec/fixtures/new-chef2 2020-06-30 09:44:32.000000000 -0400 +*************** +*** 1,5 **** + recipe[a::default] +- recipe[b::default] + recipe[c::default] + recipe[d::default] + recipe[e::default] +--- 1,4 ---- +*************** +*** 12,14 **** +--- 11,17 ---- + recipe[l::default] + recipe[m::default] + recipe[n::default] ++ recipe[o::new] ++ recipe[p::new] ++ recipe[q::new] ++ recipe[r::new] diff --git a/vendor/bundle/ruby/3.1.0/gems/diff-lcs-1.5.0/spec/fixtures/ldiff/output.diff.chef2-d b/vendor/bundle/ruby/3.1.0/gems/diff-lcs-1.5.0/spec/fixtures/ldiff/output.diff.chef2-d new file mode 100644 index 000000000..ca32a4903 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/diff-lcs-1.5.0/spec/fixtures/ldiff/output.diff.chef2-d @@ -0,0 +1,7 @@ +d2 +a14 +recipe[o::new] +recipe[p::new] +recipe[q::new] +recipe[r::new] +. diff --git a/vendor/bundle/ruby/3.1.0/gems/diff-lcs-1.5.0/spec/fixtures/ldiff/output.diff.chef2-e b/vendor/bundle/ruby/3.1.0/gems/diff-lcs-1.5.0/spec/fixtures/ldiff/output.diff.chef2-e new file mode 100644 index 000000000..89f3fa07d --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/diff-lcs-1.5.0/spec/fixtures/ldiff/output.diff.chef2-e @@ -0,0 +1,7 @@ +14a +recipe[o::new] +recipe[p::new] +recipe[q::new] +recipe[r::new] +. +2d diff --git a/vendor/bundle/ruby/3.1.0/gems/diff-lcs-1.5.0/spec/fixtures/ldiff/output.diff.chef2-f b/vendor/bundle/ruby/3.1.0/gems/diff-lcs-1.5.0/spec/fixtures/ldiff/output.diff.chef2-f new file mode 100644 index 000000000..ca32a4903 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/diff-lcs-1.5.0/spec/fixtures/ldiff/output.diff.chef2-f @@ -0,0 +1,7 @@ +d2 +a14 +recipe[o::new] +recipe[p::new] +recipe[q::new] +recipe[r::new] +. diff --git a/vendor/bundle/ruby/3.1.0/gems/diff-lcs-1.5.0/spec/fixtures/ldiff/output.diff.chef2-u b/vendor/bundle/ruby/3.1.0/gems/diff-lcs-1.5.0/spec/fixtures/ldiff/output.diff.chef2-u new file mode 100644 index 000000000..ef025c7e4 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/diff-lcs-1.5.0/spec/fixtures/ldiff/output.diff.chef2-u @@ -0,0 +1,16 @@ +--- spec/fixtures/old-chef2 2020-06-30 09:43:35.000000000 -0400 ++++ spec/fixtures/new-chef2 2020-06-30 09:44:32.000000000 -0400 +@@ -1,5 +1,4 @@ + recipe[a::default] +-recipe[b::default] + recipe[c::default] + recipe[d::default] + recipe[e::default] +@@ -12,3 +11,7 @@ + recipe[l::default] + recipe[m::default] + recipe[n::default] ++recipe[o::new] ++recipe[p::new] ++recipe[q::new] ++recipe[r::new] diff --git a/vendor/bundle/ruby/3.1.0/gems/diff-lcs-1.5.0/spec/fixtures/new-chef b/vendor/bundle/ruby/3.1.0/gems/diff-lcs-1.5.0/spec/fixtures/new-chef new file mode 100644 index 000000000..d7babfec1 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/diff-lcs-1.5.0/spec/fixtures/new-chef @@ -0,0 +1,4 @@ +{ + "name": "x", + "description": "lo" +} \ No newline at end of file diff --git a/vendor/bundle/ruby/3.1.0/gems/diff-lcs-1.5.0/spec/fixtures/new-chef2 b/vendor/bundle/ruby/3.1.0/gems/diff-lcs-1.5.0/spec/fixtures/new-chef2 new file mode 100644 index 000000000..8213c73c1 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/diff-lcs-1.5.0/spec/fixtures/new-chef2 @@ -0,0 +1,17 @@ +recipe[a::default] +recipe[c::default] +recipe[d::default] +recipe[e::default] +recipe[f::default] +recipe[g::default] +recipe[h::default] +recipe[i::default] +recipe[j::default] +recipe[k::default] +recipe[l::default] +recipe[m::default] +recipe[n::default] +recipe[o::new] +recipe[p::new] +recipe[q::new] +recipe[r::new] diff --git a/vendor/bundle/ruby/3.1.0/gems/diff-lcs-1.5.0/spec/fixtures/old-chef b/vendor/bundle/ruby/3.1.0/gems/diff-lcs-1.5.0/spec/fixtures/old-chef new file mode 100644 index 000000000..5f9e38b84 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/diff-lcs-1.5.0/spec/fixtures/old-chef @@ -0,0 +1,4 @@ +{ + "name": "x", + "description": "hi" +} \ No newline at end of file diff --git a/vendor/bundle/ruby/3.1.0/gems/diff-lcs-1.5.0/spec/fixtures/old-chef2 b/vendor/bundle/ruby/3.1.0/gems/diff-lcs-1.5.0/spec/fixtures/old-chef2 new file mode 100644 index 000000000..4a23407fd --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/diff-lcs-1.5.0/spec/fixtures/old-chef2 @@ -0,0 +1,14 @@ +recipe[a::default] +recipe[b::default] +recipe[c::default] +recipe[d::default] +recipe[e::default] +recipe[f::default] +recipe[g::default] +recipe[h::default] +recipe[i::default] +recipe[j::default] +recipe[k::default] +recipe[l::default] +recipe[m::default] +recipe[n::default] diff --git a/vendor/bundle/ruby/3.1.0/gems/diff-lcs-1.5.0/spec/hunk_spec.rb b/vendor/bundle/ruby/3.1.0/gems/diff-lcs-1.5.0/spec/hunk_spec.rb new file mode 100644 index 000000000..b3616bf02 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/diff-lcs-1.5.0/spec/hunk_spec.rb @@ -0,0 +1,83 @@ +# frozen_string_literal: true + +require 'spec_helper' + +if String.method_defined?(:encoding) + require 'diff/lcs/hunk' + + describe Diff::LCS::Hunk do + let(:old_data) { ['Tu a un carté avec {count} itéms'.encode('UTF-16LE')] } + let(:new_data) { ['Tu a un carte avec {count} items'.encode('UTF-16LE')] } + let(:pieces) { Diff::LCS.diff old_data, new_data } + let(:hunk) { Diff::LCS::Hunk.new(old_data, new_data, pieces[0], 3, 0) } + + it 'produces a unified diff from the two pieces' do + expected = <<-EXPECTED.gsub(/^\s+/, '').encode('UTF-16LE').chomp + @@ -1 +1 @@ + -Tu a un carté avec {count} itéms + +Tu a un carte avec {count} items + EXPECTED + + expect(hunk.diff(:unified)).to eq(expected) + end + + it 'produces a unified diff from the two pieces (last entry)' do + expected = <<-EXPECTED.gsub(/^\s+/, '').encode('UTF-16LE').chomp + @@ -1 +1 @@ + -Tu a un carté avec {count} itéms + +Tu a un carte avec {count} items + \\ No newline at end of file + EXPECTED + + expect(hunk.diff(:unified, true)).to eq(expected) + end + + it 'produces a context diff from the two pieces' do + expected = <<-EXPECTED.gsub(/^\s+/, '').encode('UTF-16LE').chomp + *************** + *** 1 **** + ! Tu a un carté avec {count} itéms + --- 1 ---- + ! Tu a un carte avec {count} items + EXPECTED + + expect(hunk.diff(:context)).to eq(expected) + end + + it 'produces an old diff from the two pieces' do + expected = <<-EXPECTED.gsub(/^ +/, '').encode('UTF-16LE').chomp + 1c1 + < Tu a un carté avec {count} itéms + --- + > Tu a un carte avec {count} items + + EXPECTED + + expect(hunk.diff(:old)).to eq(expected) + end + + it 'produces a reverse ed diff from the two pieces' do + expected = <<-EXPECTED.gsub(/^ +/, '').encode('UTF-16LE').chomp + c1 + Tu a un carte avec {count} items + . + + EXPECTED + + expect(hunk.diff(:reverse_ed)).to eq(expected) + end + + context 'with empty first data set' do + let(:old_data) { [] } + + it 'produces a unified diff' do + expected = <<-EXPECTED.gsub(/^\s+/, '').encode('UTF-16LE').chomp + @@ -1 +1,2 @@ + +Tu a un carte avec {count} items + EXPECTED + + expect(hunk.diff(:unified)).to eq(expected) + end + end + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/diff-lcs-1.5.0/spec/issues_spec.rb b/vendor/bundle/ruby/3.1.0/gems/diff-lcs-1.5.0/spec/issues_spec.rb new file mode 100644 index 000000000..ad73123cb --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/diff-lcs-1.5.0/spec/issues_spec.rb @@ -0,0 +1,154 @@ +# frozen_string_literal: true + +require 'spec_helper' +require 'diff/lcs/hunk' + +describe 'Diff::LCS Issues' do + include Diff::LCS::SpecHelper::Matchers + + describe 'issue #1' do + shared_examples 'handles simple diffs' do |s1, s2, forward_diff| + before do + @diff_s1_s2 = Diff::LCS.diff(s1, s2) + end + + it 'creates the correct diff' do + expect(change_diff(forward_diff)).to eq(@diff_s1_s2) + end + + it 'creates the correct patch s1->s2' do + expect(Diff::LCS.patch(s1, @diff_s1_s2)).to eq(s2) + end + + it 'creates the correct patch s2->s1' do + expect(Diff::LCS.patch(s2, @diff_s1_s2)).to eq(s1) + end + end + + describe 'string' do + it_has_behavior 'handles simple diffs', 'aX', 'bXaX', [ + [ + ['+', 0, 'b'], + ['+', 1, 'X'] + ] + ] + it_has_behavior 'handles simple diffs', 'bXaX', 'aX', [ + [ + ['-', 0, 'b'], + ['-', 1, 'X'] + ] + ] + end + + describe 'array' do + it_has_behavior 'handles simple diffs', %w(a X), %w(b X a X), [ + [ + ['+', 0, 'b'], + ['+', 1, 'X'] + ] + ] + it_has_behavior 'handles simple diffs', %w(b X a X), %w(a X), [ + [ + ['-', 0, 'b'], + ['-', 1, 'X'] + ] + ] + end + end + + describe 'issue #57' do + it 'should fail with a correct error' do + expect { + actual = { :category => 'app.rack.request' } + expected = { :category => 'rack.middleware', :title => 'Anonymous Middleware' } + expect(actual).to eq(expected) + }.to raise_error(RSpec::Expectations::ExpectationNotMetError) + end + end + + describe 'issue #60' do + it 'should produce unified output with correct context' do + old_data = <<-DATA_OLD.strip.split("\n").map(&:chomp) +{ + "name": "x", + "description": "hi" +} + DATA_OLD + + new_data = <<-DATA_NEW.strip.split("\n").map(&:chomp) +{ + "name": "x", + "description": "lo" +} + DATA_NEW + + diff = ::Diff::LCS.diff(old_data, new_data) + hunk = ::Diff::LCS::Hunk.new(old_data, new_data, diff.first, 3, 0) + + expect(hunk.diff(:unified)).to eq(<<-EXPECTED.chomp) +@@ -1,5 +1,5 @@ + { + "name": "x", +- "description": "hi" ++ "description": "lo" + } + EXPECTED + end + end + + describe 'issue #65' do + def diff_lines(old_lines, new_lines) + file_length_difference = 0 + previous_hunk = nil + output = [] + + Diff::LCS.diff(old_lines, new_lines).each do |piece| + hunk = Diff::LCS::Hunk.new(old_lines, new_lines, piece, 3, file_length_difference) + file_length_difference = hunk.file_length_difference + maybe_contiguous_hunks = (previous_hunk.nil? || hunk.merge(previous_hunk)) + + output << "#{previous_hunk.diff(:unified)}\n" unless maybe_contiguous_hunks + + previous_hunk = hunk + end + output << "#{previous_hunk.diff(:unified, true)}\n" unless previous_hunk.nil? + output.join + end + + it 'should not misplace the new chunk' do + old_data = [ + 'recipe[a::default]', 'recipe[b::default]', 'recipe[c::default]', + 'recipe[d::default]', 'recipe[e::default]', 'recipe[f::default]', + 'recipe[g::default]', 'recipe[h::default]', 'recipe[i::default]', + 'recipe[j::default]', 'recipe[k::default]', 'recipe[l::default]', + 'recipe[m::default]', 'recipe[n::default]' + ] + + new_data = [ + 'recipe[a::default]', 'recipe[c::default]', 'recipe[d::default]', + 'recipe[e::default]', 'recipe[f::default]', 'recipe[g::default]', + 'recipe[h::default]', 'recipe[i::default]', 'recipe[j::default]', + 'recipe[k::default]', 'recipe[l::default]', 'recipe[m::default]', + 'recipe[n::default]', 'recipe[o::new]', 'recipe[p::new]', + 'recipe[q::new]', 'recipe[r::new]' + ] + + expect(diff_lines(old_data, new_data)).to eq(<<-EODIFF) +@@ -1,5 +1,4 @@ + recipe[a::default] +-recipe[b::default] + recipe[c::default] + recipe[d::default] + recipe[e::default] +@@ -12,3 +11,7 @@ + recipe[l::default] + recipe[m::default] + recipe[n::default] ++recipe[o::new] ++recipe[p::new] ++recipe[q::new] ++recipe[r::new] + EODIFF + end + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/diff-lcs-1.5.0/spec/lcs_spec.rb b/vendor/bundle/ruby/3.1.0/gems/diff-lcs-1.5.0/spec/lcs_spec.rb new file mode 100644 index 000000000..94428fd17 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/diff-lcs-1.5.0/spec/lcs_spec.rb @@ -0,0 +1,56 @@ +# frozen_string_literal: true + +require 'spec_helper' + +describe Diff::LCS::Internals, '.lcs' do + include Diff::LCS::SpecHelper::Matchers + + it 'returns a meaningful LCS array with (seq1, seq2)' do + res = Diff::LCS::Internals.lcs(seq1, seq2) + # The result of the LCS (less the +nil+ values) must be as long as the + # correct result. + expect(res.compact.size).to eq(correct_lcs.size) + expect(res).to correctly_map_sequence(seq1).to_other_sequence(seq2) + + # Compact these transformations and they should be the correct LCS. + x_seq1 = (0...res.size).map { |ix| res[ix] ? seq1[ix] : nil }.compact + x_seq2 = (0...res.size).map { |ix| res[ix] ? seq2[res[ix]] : nil }.compact + + expect(x_seq1).to eq(correct_lcs) + expect(x_seq2).to eq(correct_lcs) + end + + it 'returns all indexes with (hello, hello)' do + expect(Diff::LCS::Internals.lcs(hello, hello)).to \ + eq((0...hello.size).to_a) + end + + it 'returns all indexes with (hello_ary, hello_ary)' do + expect(Diff::LCS::Internals.lcs(hello_ary, hello_ary)).to \ + eq((0...hello_ary.size).to_a) + end +end + +describe Diff::LCS, '.LCS' do + include Diff::LCS::SpecHelper::Matchers + + it 'returns the correct compacted values from Diff::LCS.LCS' do + res = Diff::LCS.LCS(seq1, seq2) + expect(res).to eq(correct_lcs) + expect(res.compact).to eq(res) + end + + it 'is transitive' do + res = Diff::LCS.LCS(seq2, seq1) + expect(res).to eq(correct_lcs) + expect(res.compact).to eq(res) + end + + it 'returns %W(h e l l o) with (hello, hello)' do + expect(Diff::LCS.LCS(hello, hello)).to eq(hello.split(//)) + end + + it 'returns hello_ary with (hello_ary, hello_ary)' do + expect(Diff::LCS.LCS(hello_ary, hello_ary)).to eq(hello_ary) + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/diff-lcs-1.5.0/spec/ldiff_spec.rb b/vendor/bundle/ruby/3.1.0/gems/diff-lcs-1.5.0/spec/ldiff_spec.rb new file mode 100644 index 000000000..a2468f811 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/diff-lcs-1.5.0/spec/ldiff_spec.rb @@ -0,0 +1,87 @@ +# frozen_string_literal: true + +require 'spec_helper' + +RSpec.describe 'bin/ldiff' do + include CaptureSubprocessIO + + fixtures = [ + { :name => 'output.diff', :left => 'aX', :right => 'bXaX' }, + { :name => 'output.diff.chef', :left => 'old-chef', :right => 'new-chef' }, + { :name => 'output.diff.chef2', :left => 'old-chef2', :right => 'new-chef2' } + ].product([nil, '-e', '-f', '-c', '-u']).map { |(fixture, flag)| + fixture = fixture.dup + fixture[:flag] = flag + fixture + } + + def self.test_ldiff(fixture) + desc = [ + fixture[:flag], + "spec/fixtures/#{fixture[:left]}", + "spec/fixtures/#{fixture[:right]}", + '#', + '=>', + "spec/fixtures/ldiff/#{fixture[:name]}#{fixture[:flag]}" + ].join(' ') + + it desc do + expect(run_ldiff(fixture)).to eq(read_fixture(fixture)) + end + end + + fixtures.each do |fixture| + test_ldiff(fixture) + end + + def read_fixture(options) + fixture = options.fetch(:name) + flag = options.fetch(:flag) + name = "spec/fixtures/ldiff/#{fixture}#{flag}" + data = IO.__send__(IO.respond_to?(:binread) ? :binread : :read, name) + clean_data(data, flag) + end + + def clean_data(data, flag) + data = + case flag + when '-c', '-u' + clean_output_timestamp(data) + else + data + end + data.gsub(/\r\n?/, "\n") + end + + def clean_output_timestamp(data) + data.gsub( + %r{ + ^ + [-+*]{3} + \s* + spec/fixtures/(\S+) + \s* + \d{4}-\d\d-\d\d + \s* + \d\d:\d\d:\d\d(?:\.\d+) + \s* + (?:[-+]\d{4}|Z) + }x, + '*** spec/fixtures/\1 0000-00-00 :00 =>:00 =>00.000000000 -0000' + ) + end + + def run_ldiff(options) + flag = options.fetch(:flag) + left = options.fetch(:left) + right = options.fetch(:right) + + stdout, stderr = capture_subprocess_io do + system("ruby -Ilib bin/ldiff #{flag} spec/fixtures/#{left} spec/fixtures/#{right}") + end + + expect(stderr).to be_empty if RUBY_VERSION >= '1.9' + expect(stdout).not_to be_empty + clean_data(stdout, flag) + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/diff-lcs-1.5.0/spec/patch_spec.rb b/vendor/bundle/ruby/3.1.0/gems/diff-lcs-1.5.0/spec/patch_spec.rb new file mode 100644 index 000000000..11b098117 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/diff-lcs-1.5.0/spec/patch_spec.rb @@ -0,0 +1,416 @@ +# frozen_string_literal: true + +require 'spec_helper' + +describe 'Diff::LCS.patch' do + include Diff::LCS::SpecHelper::Matchers + + shared_examples 'patch sequences correctly' do + it 'correctly patches left-to-right (patch autodiscovery)' do + expect(Diff::LCS.patch(s1, patch_set)).to eq(s2) + end + + it 'correctly patches left-to-right (explicit patch)' do + expect(Diff::LCS.patch(s1, patch_set, :patch)).to eq(s2) + expect(Diff::LCS.patch!(s1, patch_set)).to eq(s2) + end + + it 'correctly patches right-to-left (unpatch autodiscovery)' do + expect(Diff::LCS.patch(s2, patch_set)).to eq(s1) + end + + it 'correctly patches right-to-left (explicit unpatch)' do + expect(Diff::LCS.patch(s2, patch_set, :unpatch)).to eq(s1) + expect(Diff::LCS.unpatch!(s2, patch_set)).to eq(s1) + end + end + + describe 'using a Diff::LCS.diff patchset' do + describe 'an empty patchset returns the source' do + it 'works on a string (hello)' do + diff = Diff::LCS.diff(hello, hello) + expect(Diff::LCS.patch(hello, diff)).to eq(hello) + end + + it 'works on an array %W(h e l l o)' do + diff = Diff::LCS.diff(hello_ary, hello_ary) + expect(Diff::LCS.patch(hello_ary, diff)).to eq(hello_ary) + end + end + + describe 'with default diff callbacks (DiffCallbacks)' do + describe 'forward (s1 -> s2)' do + it_has_behavior 'patch sequences correctly' do + let(:s1) { seq1 } + let(:s2) { seq2 } + let(:patch_set) { Diff::LCS.diff(seq1, seq2) } + end + end + + describe 'reverse (s2 -> s1)' do + it_has_behavior 'patch sequences correctly' do + let(:s1) { seq2 } + let(:s2) { seq1 } + let(:patch_set) { Diff::LCS.diff(seq2, seq1) } + end + end + end + + describe 'with context diff callbacks (ContextDiffCallbacks)' do + describe 'forward (s1 -> s2)' do + it_has_behavior 'patch sequences correctly' do + let(:s1) { seq1 } + let(:s2) { seq2 } + let(:patch_set) { + Diff::LCS.diff(seq1, seq2, Diff::LCS::ContextDiffCallbacks) + } + end + end + + describe 'reverse (s2 -> s1)' do + it_has_behavior 'patch sequences correctly' do + let(:s1) { seq2 } + let(:s2) { seq1 } + let(:patch_set) { + Diff::LCS.diff(seq2, seq1, Diff::LCS::ContextDiffCallbacks) + } + end + end + end + + describe 'with sdiff callbacks (SDiffCallbacks)' do + describe 'forward (s1 -> s2)' do + it_has_behavior 'patch sequences correctly' do + let(:s1) { seq1 } + let(:s2) { seq2 } + let(:patch_set) { + Diff::LCS.diff(seq1, seq2, Diff::LCS::SDiffCallbacks) + } + end + end + + describe 'reverse (s2 -> s1)' do + it_has_behavior 'patch sequences correctly' do + let(:s1) { seq2 } + let(:s2) { seq1 } + let(:patch_set) { + Diff::LCS.diff(seq2, seq1, Diff::LCS::SDiffCallbacks) + } + end + end + end + end + + describe 'using a Diff::LCS.sdiff patchset' do + describe 'an empty patchset returns the source' do + it 'works on a string (hello)' do + expect(Diff::LCS.patch(hello, Diff::LCS.sdiff(hello, hello))).to eq(hello) + end + + it 'works on an array %W(h e l l o)' do + expect(Diff::LCS.patch(hello_ary, Diff::LCS.sdiff(hello_ary, hello_ary))).to eq(hello_ary) + end + end + + describe 'with default diff callbacks (DiffCallbacks)' do + describe 'forward (s1 -> s2)' do + it_has_behavior 'patch sequences correctly' do + let(:s1) { seq1 } + let(:s2) { seq2 } + let(:patch_set) { + Diff::LCS.sdiff(seq1, seq2, Diff::LCS::DiffCallbacks) + } + end + end + + describe 'reverse (s2 -> s1)' do + it_has_behavior 'patch sequences correctly' do + let(:s1) { seq2 } + let(:s2) { seq1 } + let(:patch_set) { + Diff::LCS.sdiff(seq2, seq1, Diff::LCS::DiffCallbacks) + } + end + end + end + + describe 'with context diff callbacks (DiffCallbacks)' do + describe 'forward (s1 -> s2)' do + it_has_behavior 'patch sequences correctly' do + let(:s1) { seq1 } + let(:s2) { seq2 } + let(:patch_set) { + Diff::LCS.sdiff(seq1, seq2, Diff::LCS::ContextDiffCallbacks) + } + end + end + + describe 'reverse (s2 -> s1)' do + it_has_behavior 'patch sequences correctly' do + let(:s1) { seq2 } + let(:s2) { seq1 } + let(:patch_set) { + Diff::LCS.sdiff(seq2, seq1, Diff::LCS::ContextDiffCallbacks) + } + end + end + end + + describe 'with sdiff callbacks (SDiffCallbacks)' do + describe 'forward (s1 -> s2)' do + it_has_behavior 'patch sequences correctly' do + let(:s1) { seq1 } + let(:s2) { seq2 } + let(:patch_set) { Diff::LCS.sdiff(seq1, seq2) } + end + end + + describe 'reverse (s2 -> s1)' do + it_has_behavior 'patch sequences correctly' do + let(:s1) { seq2 } + let(:s2) { seq1 } + let(:patch_set) { Diff::LCS.sdiff(seq2, seq1) } + end + end + end + end + + # Note: because of the error in autodiscovery ("does not autodiscover s1 + # to s2 patches"), this cannot use the "patch sequences correctly" shared + # set. Once the bug in autodiscovery is fixed, this can be converted as + # above. + describe 'fix bug 891: patchsets do not contain the last equal part' do + before :each do + @s1 = %w(a b c d e f g h i j k) # rubocop:disable Layout/SpaceInsideArrayPercentLiteral + @s2 = %w(a b c d D e f g h i j k) + end + + describe 'using Diff::LCS.diff with default diff callbacks' do + before :each do + @patch_set_s1_s2 = Diff::LCS.diff(@s1, @s2) + @patch_set_s2_s1 = Diff::LCS.diff(@s2, @s1) + end + + it 'autodiscovers s1 to s2 patches' do + expect do + expect(Diff::LCS.patch(@s1, @patch_set_s1_s2)).to eq(@s2) + end.to_not raise_error + end + + it 'autodiscovers s2 to s1 patches' do + expect do + expect(Diff::LCS.patch(@s1, @patch_set_s2_s1)).to eq(@s2) + end.to_not raise_error + end + + it 'autodiscovers s2 to s1 the left-to-right patches' do + expect(Diff::LCS.patch(@s2, @patch_set_s2_s1)).to eq(@s1) + expect(Diff::LCS.patch(@s2, @patch_set_s1_s2)).to eq(@s1) + end + + it 'correctly patches left-to-right (explicit patch)' do + expect(Diff::LCS.patch(@s1, @patch_set_s1_s2, :patch)).to eq(@s2) + expect(Diff::LCS.patch(@s2, @patch_set_s2_s1, :patch)).to eq(@s1) + expect(Diff::LCS.patch!(@s1, @patch_set_s1_s2)).to eq(@s2) + expect(Diff::LCS.patch!(@s2, @patch_set_s2_s1)).to eq(@s1) + end + + it 'correctly patches right-to-left (explicit unpatch)' do + expect(Diff::LCS.patch(@s2, @patch_set_s1_s2, :unpatch)).to eq(@s1) + expect(Diff::LCS.patch(@s1, @patch_set_s2_s1, :unpatch)).to eq(@s2) + expect(Diff::LCS.unpatch!(@s2, @patch_set_s1_s2)).to eq(@s1) + expect(Diff::LCS.unpatch!(@s1, @patch_set_s2_s1)).to eq(@s2) + end + end + + describe 'using Diff::LCS.diff with context diff callbacks' do + before :each do + @patch_set_s1_s2 = Diff::LCS.diff(@s1, @s2, Diff::LCS::ContextDiffCallbacks) + @patch_set_s2_s1 = Diff::LCS.diff(@s2, @s1, Diff::LCS::ContextDiffCallbacks) + end + + it 'autodiscovers s1 to s2 patches' do + expect do + expect(Diff::LCS.patch(@s1, @patch_set_s1_s2)).to eq(@s2) + end.to_not raise_error + end + + it 'autodiscovers s2 to s1 patches' do + expect do + expect(Diff::LCS.patch(@s1, @patch_set_s2_s1)).to eq(@s2) + end.to_not raise_error + end + + it 'autodiscovers s2 to s1 the left-to-right patches' do + expect(Diff::LCS.patch(@s2, @patch_set_s2_s1)).to eq(@s1) + expect(Diff::LCS.patch(@s2, @patch_set_s1_s2)).to eq(@s1) + end + + it 'correctly patches left-to-right (explicit patch)' do + expect(Diff::LCS.patch(@s1, @patch_set_s1_s2, :patch)).to eq(@s2) + expect(Diff::LCS.patch(@s2, @patch_set_s2_s1, :patch)).to eq(@s1) + expect(Diff::LCS.patch!(@s1, @patch_set_s1_s2)).to eq(@s2) + expect(Diff::LCS.patch!(@s2, @patch_set_s2_s1)).to eq(@s1) + end + + it 'correctly patches right-to-left (explicit unpatch)' do + expect(Diff::LCS.patch(@s2, @patch_set_s1_s2, :unpatch)).to eq(@s1) + expect(Diff::LCS.patch(@s1, @patch_set_s2_s1, :unpatch)).to eq(@s2) + expect(Diff::LCS.unpatch!(@s2, @patch_set_s1_s2)).to eq(@s1) + expect(Diff::LCS.unpatch!(@s1, @patch_set_s2_s1)).to eq(@s2) + end + end + + describe 'using Diff::LCS.diff with sdiff callbacks' do + before(:each) do + @patch_set_s1_s2 = Diff::LCS.diff(@s1, @s2, Diff::LCS::SDiffCallbacks) + @patch_set_s2_s1 = Diff::LCS.diff(@s2, @s1, Diff::LCS::SDiffCallbacks) + end + + it 'autodiscovers s1 to s2 patches' do + expect do + expect(Diff::LCS.patch(@s1, @patch_set_s1_s2)).to eq(@s2) + end.to_not raise_error + end + + it 'autodiscovers s2 to s1 patches' do + expect do + expect(Diff::LCS.patch(@s1, @patch_set_s2_s1)).to eq(@s2) + end.to_not raise_error + end + + it 'autodiscovers s2 to s1 the left-to-right patches' do + expect(Diff::LCS.patch(@s2, @patch_set_s2_s1)).to eq(@s1) + expect(Diff::LCS.patch(@s2, @patch_set_s1_s2)).to eq(@s1) + end + + it 'correctly patches left-to-right (explicit patch)' do + expect(Diff::LCS.patch(@s1, @patch_set_s1_s2, :patch)).to eq(@s2) + expect(Diff::LCS.patch(@s2, @patch_set_s2_s1, :patch)).to eq(@s1) + expect(Diff::LCS.patch!(@s1, @patch_set_s1_s2)).to eq(@s2) + expect(Diff::LCS.patch!(@s2, @patch_set_s2_s1)).to eq(@s1) + end + + it 'correctly patches right-to-left (explicit unpatch)' do + expect(Diff::LCS.patch(@s2, @patch_set_s1_s2, :unpatch)).to eq(@s1) + expect(Diff::LCS.patch(@s1, @patch_set_s2_s1, :unpatch)).to eq(@s2) + expect(Diff::LCS.unpatch!(@s2, @patch_set_s1_s2)).to eq(@s1) + expect(Diff::LCS.unpatch!(@s1, @patch_set_s2_s1)).to eq(@s2) + end + end + + describe 'using Diff::LCS.sdiff with default sdiff callbacks' do + before(:each) do + @patch_set_s1_s2 = Diff::LCS.sdiff(@s1, @s2) + @patch_set_s2_s1 = Diff::LCS.sdiff(@s2, @s1) + end + + it 'autodiscovers s1 to s2 patches' do + expect do + expect(Diff::LCS.patch(@s1, @patch_set_s1_s2)).to eq(@s2) + end.to_not raise_error + end + + it 'autodiscovers s2 to s1 patches' do + expect do + expect(Diff::LCS.patch(@s1, @patch_set_s2_s1)).to eq(@s2) + end.to_not raise_error + end + + it 'autodiscovers s2 to s1 the left-to-right patches' do + expect(Diff::LCS.patch(@s2, @patch_set_s2_s1)).to eq(@s1) + expect(Diff::LCS.patch(@s2, @patch_set_s1_s2)).to eq(@s1) + end + + it 'correctly patches left-to-right (explicit patch)' do + expect(Diff::LCS.patch(@s1, @patch_set_s1_s2, :patch)).to eq(@s2) + expect(Diff::LCS.patch(@s2, @patch_set_s2_s1, :patch)).to eq(@s1) + expect(Diff::LCS.patch!(@s1, @patch_set_s1_s2)).to eq(@s2) + expect(Diff::LCS.patch!(@s2, @patch_set_s2_s1)).to eq(@s1) + end + + it 'correctly patches right-to-left (explicit unpatch)' do + expect(Diff::LCS.patch(@s2, @patch_set_s1_s2, :unpatch)).to eq(@s1) + expect(Diff::LCS.patch(@s1, @patch_set_s2_s1, :unpatch)).to eq(@s2) + expect(Diff::LCS.unpatch!(@s2, @patch_set_s1_s2)).to eq(@s1) + expect(Diff::LCS.unpatch!(@s1, @patch_set_s2_s1)).to eq(@s2) + end + end + + describe 'using Diff::LCS.sdiff with context diff callbacks' do + before(:each) do + @patch_set_s1_s2 = Diff::LCS.sdiff(@s1, @s2, Diff::LCS::ContextDiffCallbacks) + @patch_set_s2_s1 = Diff::LCS.sdiff(@s2, @s1, Diff::LCS::ContextDiffCallbacks) + end + + it 'autodiscovers s1 to s2 patches' do + expect do + expect(Diff::LCS.patch(@s1, @patch_set_s1_s2)).to eq(@s2) + end.to_not raise_error + end + + it 'autodiscovers s2 to s1 patches' do + expect do + expect(Diff::LCS.patch(@s1, @patch_set_s2_s1)).to eq(@s2) + end.to_not raise_error + end + + it 'autodiscovers s2 to s1 the left-to-right patches' do + expect(Diff::LCS.patch(@s2, @patch_set_s2_s1)).to eq(@s1) + expect(Diff::LCS.patch(@s2, @patch_set_s1_s2)).to eq(@s1) + end + + it 'correctly patches left-to-right (explicit patch)' do + expect(Diff::LCS.patch(@s1, @patch_set_s1_s2, :patch)).to eq(@s2) + expect(Diff::LCS.patch(@s2, @patch_set_s2_s1, :patch)).to eq(@s1) + expect(Diff::LCS.patch!(@s1, @patch_set_s1_s2)).to eq(@s2) + expect(Diff::LCS.patch!(@s2, @patch_set_s2_s1)).to eq(@s1) + end + + it 'correctly patches right-to-left (explicit unpatch)' do + expect(Diff::LCS.patch(@s2, @patch_set_s1_s2, :unpatch)).to eq(@s1) + expect(Diff::LCS.patch(@s1, @patch_set_s2_s1, :unpatch)).to eq(@s2) + expect(Diff::LCS.unpatch!(@s2, @patch_set_s1_s2)).to eq(@s1) + expect(Diff::LCS.unpatch!(@s1, @patch_set_s2_s1)).to eq(@s2) + end + end + + describe 'using Diff::LCS.sdiff with default diff callbacks' do + before(:each) do + @patch_set_s1_s2 = Diff::LCS.sdiff(@s1, @s2, Diff::LCS::DiffCallbacks) + @patch_set_s2_s1 = Diff::LCS.sdiff(@s2, @s1, Diff::LCS::DiffCallbacks) + end + + it 'autodiscovers s1 to s2 patches' do + expect do + expect(Diff::LCS.patch(@s1, @patch_set_s1_s2)).to eq(@s2) + end.to_not raise_error + end + + it 'autodiscovers s2 to s1 patches' do + expect do + expect(Diff::LCS.patch(@s1, @patch_set_s2_s1)).to eq(@s2) + end.to_not raise_error + end + + it 'autodiscovers s2 to s1 the left-to-right patches' do + expect(Diff::LCS.patch(@s2, @patch_set_s2_s1)).to eq(@s1) + expect(Diff::LCS.patch(@s2, @patch_set_s1_s2)).to eq(@s1) + end + + it 'correctly patches left-to-right (explicit patch)' do + expect(Diff::LCS.patch(@s1, @patch_set_s1_s2, :patch)).to eq(@s2) + expect(Diff::LCS.patch(@s2, @patch_set_s2_s1, :patch)).to eq(@s1) + expect(Diff::LCS.patch!(@s1, @patch_set_s1_s2)).to eq(@s2) + expect(Diff::LCS.patch!(@s2, @patch_set_s2_s1)).to eq(@s1) + end + + it 'correctly patches right-to-left (explicit unpatch)' do + expect(Diff::LCS.patch(@s2, @patch_set_s1_s2, :unpatch)).to eq(@s1) + expect(Diff::LCS.patch(@s1, @patch_set_s2_s1, :unpatch)).to eq(@s2) + expect(Diff::LCS.unpatch!(@s2, @patch_set_s1_s2)).to eq(@s1) + expect(Diff::LCS.unpatch!(@s1, @patch_set_s2_s1)).to eq(@s2) + end + end + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/diff-lcs-1.5.0/spec/sdiff_spec.rb b/vendor/bundle/ruby/3.1.0/gems/diff-lcs-1.5.0/spec/sdiff_spec.rb new file mode 100644 index 000000000..06d39d6a7 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/diff-lcs-1.5.0/spec/sdiff_spec.rb @@ -0,0 +1,214 @@ +# frozen_string_literal: true + +require 'spec_helper' + +describe 'Diff::LCS.sdiff' do + include Diff::LCS::SpecHelper::Matchers + + shared_examples 'compare sequences correctly' do + it 'compares s1 -> s2 correctly' do + expect(Diff::LCS.sdiff(s1, s2)).to eq(context_diff(result)) + end + + it 'compares s2 -> s1 correctly' do + expect(Diff::LCS.sdiff(s2, s1)).to eq(context_diff(reverse_sdiff(result))) + end + end + + describe 'using seq1 & seq2' do + let(:s1) { seq1 } + let(:s2) { seq2 } + let(:result) { correct_forward_sdiff } + + it_has_behavior 'compare sequences correctly' + end + + describe 'using %w(abc def yyy xxx ghi jkl) & %w(abc dxf xxx ghi jkl)' do + let(:s1) { %w(abc def yyy xxx ghi jkl) } + let(:s2) { %w(abc dxf xxx ghi jkl) } + let(:result) { + [ + ['=', [0, 'abc'], [0, 'abc']], + ['!', [1, 'def'], [1, 'dxf']], + ['-', [2, 'yyy'], [2, nil]], + ['=', [3, 'xxx'], [2, 'xxx']], + ['=', [4, 'ghi'], [3, 'ghi']], + ['=', [5, 'jkl'], [4, 'jkl']] + ] + } + + it_has_behavior 'compare sequences correctly' + end + + describe 'using %w(a b c d e) & %w(a e)' do + let(:s1) { %w(a b c d e) } + let(:s2) { %w(a e) } + let(:result) { + [ + ['=', [0, 'a'], [0, 'a']], + ['-', [1, 'b'], [1, nil]], + ['-', [2, 'c'], [1, nil]], + ['-', [3, 'd'], [1, nil]], + ['=', [4, 'e'], [1, 'e']] + ] + } + + it_has_behavior 'compare sequences correctly' + end + + describe 'using %w(a e) & %w(a b c d e)' do + let(:s1) { %w(a e) } + let(:s2) { %w(a b c d e) } + let(:result) { + [ + ['=', [0, 'a'], [0, 'a']], + ['+', [1, nil], [1, 'b']], + ['+', [1, nil], [2, 'c']], + ['+', [1, nil], [3, 'd']], + ['=', [1, 'e'], [4, 'e']] + ] + } + + it_has_behavior 'compare sequences correctly' + end + + describe 'using %w(v x a e) & %w(w y a b c d e)' do + let(:s1) { %w(v x a e) } + let(:s2) { %w(w y a b c d e) } + let(:result) { + [ + ['!', [0, 'v'], [0, 'w']], + ['!', [1, 'x'], [1, 'y']], + ['=', [2, 'a'], [2, 'a']], + ['+', [3, nil], [3, 'b']], + ['+', [3, nil], [4, 'c']], + ['+', [3, nil], [5, 'd']], + ['=', [3, 'e'], [6, 'e']] + ] + } + + it_has_behavior 'compare sequences correctly' + end + + describe 'using %w(x a e) & %w(a b c d e)' do + let(:s1) { %w(x a e) } + let(:s2) { %w(a b c d e) } + let(:result) { + [ + ['-', [0, 'x'], [0, nil]], + ['=', [1, 'a'], [0, 'a']], + ['+', [2, nil], [1, 'b']], + ['+', [2, nil], [2, 'c']], + ['+', [2, nil], [3, 'd']], + ['=', [2, 'e'], [4, 'e']] + ] + } + + it_has_behavior 'compare sequences correctly' + end + + describe 'using %w(a e) & %w(x a b c d e)' do + let(:s1) { %w(a e) } + let(:s2) { %w(x a b c d e) } + let(:result) { + [ + ['+', [0, nil], [0, 'x']], + ['=', [0, 'a'], [1, 'a']], + ['+', [1, nil], [2, 'b']], + ['+', [1, nil], [3, 'c']], + ['+', [1, nil], [4, 'd']], + ['=', [1, 'e'], [5, 'e']] + ] + } + + it_has_behavior 'compare sequences correctly' + end + + describe 'using %w(a e v) & %w(x a b c d e w x)' do + let(:s1) { %w(a e v) } + let(:s2) { %w(x a b c d e w x) } + let(:result) { + [ + ['+', [0, nil], [0, 'x']], + ['=', [0, 'a'], [1, 'a']], + ['+', [1, nil], [2, 'b']], + ['+', [1, nil], [3, 'c']], + ['+', [1, nil], [4, 'd']], + ['=', [1, 'e'], [5, 'e']], + ['!', [2, 'v'], [6, 'w']], + ['+', [3, nil], [7, 'x']] + ] + } + + it_has_behavior 'compare sequences correctly' + end + + describe 'using %w() & %w(a b c)' do + let(:s1) { %w() } + let(:s2) { %w(a b c) } + let(:result) { + [ + ['+', [0, nil], [0, 'a']], + ['+', [0, nil], [1, 'b']], + ['+', [0, nil], [2, 'c']] + ] + } + + it_has_behavior 'compare sequences correctly' + end + + describe 'using %w(a b c) & %w(1)' do + let(:s1) { %w(a b c) } + let(:s2) { %w(1) } + let(:result) { + [ + ['!', [0, 'a'], [0, '1']], + ['-', [1, 'b'], [1, nil]], + ['-', [2, 'c'], [1, nil]] + ] + } + + it_has_behavior 'compare sequences correctly' + end + + describe 'using %w(a b c) & %w(c)' do + let(:s1) { %w(a b c) } + let(:s2) { %w(c) } + let(:result) { + [ + ['-', [0, 'a'], [0, nil]], + ['-', [1, 'b'], [0, nil]], + ['=', [2, 'c'], [0, 'c']] + ] + } + + it_has_behavior 'compare sequences correctly' + end + + describe 'using %w(abcd efgh ijkl mnop) & []' do + let(:s1) { %w(abcd efgh ijkl mnop) } + let(:s2) { [] } + let(:result) { + [ + ['-', [0, 'abcd'], [0, nil]], + ['-', [1, 'efgh'], [0, nil]], + ['-', [2, 'ijkl'], [0, nil]], + ['-', [3, 'mnop'], [0, nil]] + ] + } + + it_has_behavior 'compare sequences correctly' + end + + describe 'using [[1,2]] & []' do + let(:s1) { [[1, 2]] } + let(:s2) { [] } + let(:result) { + [ + ['-', [0, [1, 2]], [0, nil]] + ] + } + + it_has_behavior 'compare sequences correctly' + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/diff-lcs-1.5.0/spec/spec_helper.rb b/vendor/bundle/ruby/3.1.0/gems/diff-lcs-1.5.0/spec/spec_helper.rb new file mode 100644 index 000000000..41e1f8e93 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/diff-lcs-1.5.0/spec/spec_helper.rb @@ -0,0 +1,374 @@ +# frozen_string_literal: true + +require 'rubygems' +require 'pathname' + +require 'psych' if RUBY_VERSION >= '1.9' + +if ENV['COVERAGE'] + require 'simplecov' + + def require_do(resource) + require resource + yield if block_given? + rescue LoadError + nil + end + + formatters = [SimpleCov::Formatter::HTMLFormatter] + + require_do('simplecov-rcov') { + formatters << SimpleCov::Formatter::RcovFormatter + } + require_do('simplecov-vim/formatter') { + formatters << SimpleCov::Formatter::VimFormatter + } + require_do('simplecov-sublime-ruby-coverage') { + formatters << SimpleCov::Formatter::SublimeRubyCoverageFormatter + } + + SimpleCov.start do + formatter SimpleCov::Formatter::MultiFormatter.new(formatters) + end +end + +file = Pathname.new(__FILE__).expand_path +path = file.parent +parent = path.parent + +$:.unshift parent.join('lib') + +module CaptureSubprocessIO + def _synchronize + yield + end + + def capture_subprocess_io + _synchronize { _capture_subprocess_io { yield } } + end + + def _capture_subprocess_io + require 'tempfile' + + captured_stdout, captured_stderr = Tempfile.new('out'), Tempfile.new('err') + + orig_stdout, orig_stderr = $stdout.dup, $stderr.dup + $stdout.reopen captured_stdout + $stderr.reopen captured_stderr + + yield + + $stdout.rewind + $stderr.rewind + + [captured_stdout.read, captured_stderr.read] + ensure + captured_stdout.unlink + captured_stderr.unlink + $stdout.reopen orig_stdout + $stderr.reopen orig_stderr + end + private :_capture_subprocess_io +end + +require 'diff-lcs' + +module Diff::LCS::SpecHelper + def hello + 'hello' + end + + def hello_ary + %w(h e l l o) + end + + def seq1 + %w(a b c e h j l m n p) + end + + def skipped_seq1 + %w(a h n p) + end + + def seq2 + %w(b c d e f j k l m r s t) + end + + def skipped_seq2 + %w(d f k r s t) + end + + def word_sequence + %w(abcd efgh ijkl mnopqrstuvwxyz) + end + + def correct_lcs + %w(b c e j l m) + end + + def correct_forward_diff + [ + [ + ['-', 0, 'a'] + ], + [ + ['+', 2, 'd'] + ], + [ + ['-', 4, 'h'], + ['+', 4, 'f'] + ], + [ + ['+', 6, 'k'] + ], + [ + ['-', 8, 'n'], + ['+', 9, 'r'], + ['-', 9, 'p'], + ['+', 10, 's'], + ['+', 11, 't'] + ] + ] + end + + def correct_backward_diff + [ + [ + ['+', 0, 'a'] + ], + [ + ['-', 2, 'd'] + ], + [ + ['-', 4, 'f'], + ['+', 4, 'h'] + ], + [ + ['-', 6, 'k'] + ], + [ + ['-', 9, 'r'], + ['+', 8, 'n'], + ['-', 10, 's'], + ['+', 9, 'p'], + ['-', 11, 't'] + ] + ] + end + + def correct_forward_sdiff + [ + ['-', [0, 'a'], [0, nil]], + ['=', [1, 'b'], [0, 'b']], + ['=', [2, 'c'], [1, 'c']], + ['+', [3, nil], [2, 'd']], + ['=', [3, 'e'], [3, 'e']], + ['!', [4, 'h'], [4, 'f']], + ['=', [5, 'j'], [5, 'j']], + ['+', [6, nil], [6, 'k']], + ['=', [6, 'l'], [7, 'l']], + ['=', [7, 'm'], [8, 'm']], + ['!', [8, 'n'], [9, 'r']], + ['!', [9, 'p'], [10, 's']], + ['+', [10, nil], [11, 't']] + ] + end + + def reverse_sdiff(forward_sdiff) + forward_sdiff.map { |line| + line[1], line[2] = line[2], line[1] + case line[0] + when '-' then line[0] = '+' + when '+' then line[0] = '-' + end + line + } + end + + def change_diff(diff) + map_diffs(diff, Diff::LCS::Change) + end + + def context_diff(diff) + map_diffs(diff, Diff::LCS::ContextChange) + end + + def format_diffs(diffs) + diffs.map { |e| + if e.kind_of?(Array) + e.map { |f| f.to_a.join }.join(', ') + else + e.to_a.join + end + }.join("\n") + end + + def map_diffs(diffs, klass = Diff::LCS::ContextChange) + diffs.map do |chunks| + if klass == Diff::LCS::ContextChange + klass.from_a(chunks) + else + chunks.map { |changes| klass.from_a(changes) } + end + end + end + + def balanced_traversal(s1, s2, callback_type) + callback = __send__(callback_type) + Diff::LCS.traverse_balanced(s1, s2, callback) + callback + end + + def balanced_reverse(change_result) + new_result = [] + change_result.each do |line| + line = [line[0], line[2], line[1]] + case line[0] + when '<' + line[0] = '>' + when '>' + line[0] = '<' + end + new_result << line + end + new_result.sort_by { |line| [line[1], line[2]] } + end + + def map_to_no_change(change_result) + new_result = [] + change_result.each do |line| + case line[0] + when '!' + new_result << ['<', line[1], line[2]] + new_result << ['>', line[1] + 1, line[2]] + else + new_result << line + end + end + new_result + end + + def simple_callback + callbacks = Object.new + class << callbacks + attr_reader :matched_a + attr_reader :matched_b + attr_reader :discards_a + attr_reader :discards_b + attr_reader :done_a + attr_reader :done_b + + def reset + @matched_a = [] + @matched_b = [] + @discards_a = [] + @discards_b = [] + @done_a = [] + @done_b = [] + end + + def match(event) + @matched_a << event.old_element + @matched_b << event.new_element + end + + def discard_b(event) + @discards_b << event.new_element + end + + def discard_a(event) + @discards_a << event.old_element + end + + def finished_a(event) + @done_a << [ + event.old_element, event.old_position, + event.new_element, event.new_position + ] + end + + def finished_b(event) + @done_b << [ + event.old_element, event.old_position, + event.new_element, event.new_position + ] + end + end + callbacks.reset + callbacks + end + + def simple_callback_no_finishers + simple = simple_callback + class << simple + undef :finished_a + undef :finished_b + end + simple + end + + def balanced_callback + cb = Object.new + class << cb + attr_reader :result + + def reset + @result = [] + end + + def match(event) + @result << ['=', event.old_position, event.new_position] + end + + def discard_a(event) + @result << ['<', event.old_position, event.new_position] + end + + def discard_b(event) + @result << ['>', event.old_position, event.new_position] + end + + def change(event) + @result << ['!', event.old_position, event.new_position] + end + end + cb.reset + cb + end + + def balanced_callback_no_change + balanced = balanced_callback + class << balanced + undef :change + end + balanced + end + + module Matchers + extend RSpec::Matchers::DSL + + matcher :be_nil_or_match_values do |ii, s1, s2| + match do |ee| + expect(ee).to(satisfy { |vee| vee.nil? || s1[ii] == s2[ee] }) + end + end + + matcher :correctly_map_sequence do |s1| + match do |actual| + actual.each_with_index { |ee, ii| + expect(ee).to be_nil_or_match_values(ii, s1, @s2) + } + end + + chain :to_other_sequence do |s2| + @s2 = s2 + end + end + end +end + +RSpec.configure do |conf| + conf.include Diff::LCS::SpecHelper + conf.alias_it_should_behave_like_to :it_has_behavior, 'has behavior:' + conf.filter_run_excluding :broken => true +end diff --git a/vendor/bundle/ruby/3.1.0/gems/diff-lcs-1.5.0/spec/traverse_balanced_spec.rb b/vendor/bundle/ruby/3.1.0/gems/diff-lcs-1.5.0/spec/traverse_balanced_spec.rb new file mode 100644 index 000000000..9ee68ea89 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/diff-lcs-1.5.0/spec/traverse_balanced_spec.rb @@ -0,0 +1,310 @@ +# frozen_string_literal: true + +require 'spec_helper' + +describe 'Diff::LCS.traverse_balanced' do + include Diff::LCS::SpecHelper::Matchers + + shared_examples 'with a #change callback' do |s1, s2, result| + it 'traverses s1 -> s2 correctly' do + traversal = balanced_traversal(s1, s2, :balanced_callback) + expect(traversal.result).to eq(result) + end + + it 'traverses s2 -> s1 correctly' do + traversal = balanced_traversal(s2, s1, :balanced_callback) + expect(traversal.result).to eq(balanced_reverse(result)) + end + end + + shared_examples 'without a #change callback' do |s1, s2, result| + it 'traverses s1 -> s2 correctly' do + traversal = balanced_traversal(s1, s2, :balanced_callback_no_change) + expect(traversal.result).to eq(map_to_no_change(result)) + end + + it 'traverses s2 -> s1 correctly' do + traversal = balanced_traversal(s2, s1, :balanced_callback_no_change) + expect(traversal.result).to eq(map_to_no_change(balanced_reverse(result))) + end + end + + describe "identical string sequences ('abc')" do + s1 = s2 = 'abc' + + result = [ + ['=', 0, 0], + ['=', 1, 1], + ['=', 2, 2] + ] + + it_has_behavior 'with a #change callback', s1, s2, result + it_has_behavior 'without a #change callback', s1, s2, result + end + + describe 'identical array sequences %w(a b c)' do + s1 = s2 = %w(a b c) + + result = [ + ['=', 0, 0], + ['=', 1, 1], + ['=', 2, 2] + ] + + it_has_behavior 'with a #change callback', s1, s2, result + it_has_behavior 'without a #change callback', s1, s2, result + end + + describe 'sequences %w(a b c) & %w(a x c)' do + s1 = %w(a b c) + s2 = %w(a x c) + + result = [ + ['=', 0, 0], + ['!', 1, 1], + ['=', 2, 2] + ] + + it_has_behavior 'with a #change callback', s1, s2, result + it_has_behavior 'without a #change callback', s1, s2, result + end + + describe 'sequences %w(a x y c) & %w(a v w c)' do + s1 = %w(a x y c) + s2 = %w(a v w c) + + result = [ + ['=', 0, 0], + ['!', 1, 1], + ['!', 2, 2], + ['=', 3, 3] + ] + + it_has_behavior 'with a #change callback', s1, s2, result + it_has_behavior 'without a #change callback', s1, s2, result + end + + describe 'sequences %w(x y c) & %w(v w c)' do + s1 = %w(x y c) + s2 = %w(v w c) + result = [ + ['!', 0, 0], + ['!', 1, 1], + ['=', 2, 2] + ] + + it_has_behavior 'with a #change callback', s1, s2, result + it_has_behavior 'without a #change callback', s1, s2, result + end + + describe 'sequences %w(a x y z) & %w(b v w)' do + s1 = %w(a x y z) + s2 = %w(b v w) + result = [ + ['!', 0, 0], + ['!', 1, 1], + ['!', 2, 2], + ['<', 3, 3] + ] + + it_has_behavior 'with a #change callback', s1, s2, result + it_has_behavior 'without a #change callback', s1, s2, result + end + + describe 'sequences %w(a z) & %w(a)' do + s1 = %w(a z) + s2 = %w(a) + result = [ + ['=', 0, 0], + ['<', 1, 1] + ] + + it_has_behavior 'with a #change callback', s1, s2, result + it_has_behavior 'without a #change callback', s1, s2, result + end + + describe 'sequences %w(z a) & %w(a)' do + s1 = %w(z a) + s2 = %w(a) + result = [ + ['<', 0, 0], + ['=', 1, 0] + ] + + it_has_behavior 'with a #change callback', s1, s2, result + it_has_behavior 'without a #change callback', s1, s2, result + end + + describe 'sequences %w(a b c) & %w(x y z)' do + s1 = %w(a b c) + s2 = %w(x y z) + result = [ + ['!', 0, 0], + ['!', 1, 1], + ['!', 2, 2] + ] + + it_has_behavior 'with a #change callback', s1, s2, result + it_has_behavior 'without a #change callback', s1, s2, result + end + + describe 'sequences %w(abcd efgh ijkl mnoopqrstuvwxyz) & []' do + s1 = %w(abcd efgh ijkl mnopqrstuvwxyz) + s2 = [] + result = [ + ['<', 0, 0], + ['<', 1, 0], + ['<', 2, 0], + ['<', 3, 0] + ] + + it_has_behavior 'with a #change callback', s1, s2, result + it_has_behavior 'without a #change callback', s1, s2, result + end + + describe 'strings %q(a b c) & %q(a x c)' do + s1 = 'a b c' + s2 = 'a x c' + + result = [ + ['=', 0, 0], + ['=', 1, 1], + ['!', 2, 2], + ['=', 3, 3], + ['=', 4, 4] + ] + + it_has_behavior 'with a #change callback', s1, s2, result + it_has_behavior 'without a #change callback', s1, s2, result + end + + describe 'strings %q(a x y c) & %q(a v w c)' do + s1 = 'a x y c' + s2 = 'a v w c' + + result = [ + ['=', 0, 0], + ['=', 1, 1], + ['!', 2, 2], + ['=', 3, 3], + ['!', 4, 4], + ['=', 5, 5], + ['=', 6, 6] + ] + + it_has_behavior 'with a #change callback', s1, s2, result + it_has_behavior 'without a #change callback', s1, s2, result + end + + describe 'strings %q(x y c) & %q(v w c)' do + s1 = 'x y c' + s2 = 'v w c' + result = [ + ['!', 0, 0], + ['=', 1, 1], + ['!', 2, 2], + ['=', 3, 3], + ['=', 4, 4] + ] + + it_has_behavior 'with a #change callback', s1, s2, result + it_has_behavior 'without a #change callback', s1, s2, result + end + + describe 'strings %q(a x y z) & %q(b v w)' do + s1 = 'a x y z' + s2 = 'b v w' + result = [ + ['!', 0, 0], + ['=', 1, 1], + ['!', 2, 2], + ['=', 3, 3], + ['!', 4, 4], + ['<', 5, 5], + ['<', 6, 5] + ] + + it_has_behavior 'with a #change callback', s1, s2, result + it_has_behavior 'without a #change callback', s1, s2, result + end + + describe 'strings %q(a z) & %q(a)' do + s1 = 'a z' + s2 = 'a' + result = [ + ['=', 0, 0], + ['<', 1, 1], + ['<', 2, 1] + ] + + it_has_behavior 'with a #change callback', s1, s2, result + it_has_behavior 'without a #change callback', s1, s2, result + end + + describe 'strings %q(z a) & %q(a)' do + s1 = 'z a' + s2 = 'a' + result = [ + ['<', 0, 0], + ['<', 1, 0], + ['=', 2, 0] + ] + + it_has_behavior 'with a #change callback', s1, s2, result + it_has_behavior 'without a #change callback', s1, s2, result + end + + describe 'strings %q(a b c) & %q(x y z)' do + s1 = 'a b c' + s2 = 'x y z' + result = [ + ['!', 0, 0], + ['=', 1, 1], + ['!', 2, 2], + ['=', 3, 3], + ['!', 4, 4] + ] + + it_has_behavior 'with a #change callback', s1, s2, result + it_has_behavior 'without a #change callback', s1, s2, result + end + + describe 'strings %q(abcd efgh ijkl mnopqrstuvwxyz) & %q()' do + s1 = 'abcd efgh ijkl mnopqrstuvwxyz' + s2 = '' + result = [ + ['<', 0, 0], + ['<', 1, 0], + ['<', 2, 0], + ['<', 3, 0], + ['<', 4, 0], + ['<', 5, 0], + ['<', 6, 0], + ['<', 7, 0], + ['<', 8, 0], + ['<', 9, 0], + ['<', 10, 0], + ['<', 11, 0], + ['<', 12, 0], + ['<', 13, 0], + ['<', 14, 0], + ['<', 15, 0], + ['<', 16, 0], + ['<', 17, 0], + ['<', 18, 0], + ['<', 19, 0], + ['<', 20, 0], + ['<', 21, 0], + ['<', 22, 0], + ['<', 23, 0], + ['<', 24, 0], + ['<', 25, 0], + ['<', 26, 0], + ['<', 27, 0], + ['<', 28, 0] + ] + + it_has_behavior 'with a #change callback', s1, s2, result + it_has_behavior 'without a #change callback', s1, s2, result + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/diff-lcs-1.5.0/spec/traverse_sequences_spec.rb b/vendor/bundle/ruby/3.1.0/gems/diff-lcs-1.5.0/spec/traverse_sequences_spec.rb new file mode 100644 index 000000000..b185e1dec --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/diff-lcs-1.5.0/spec/traverse_sequences_spec.rb @@ -0,0 +1,137 @@ +# frozen_string_literal: true + +require 'spec_helper' + +describe 'Diff::LCS.traverse_sequences' do + describe 'callback with no finishers' do + describe 'over (seq1, seq2)' do + before(:each) do + @callback_s1_s2 = simple_callback_no_finishers + Diff::LCS.traverse_sequences(seq1, seq2, @callback_s1_s2) + + @callback_s2_s1 = simple_callback_no_finishers + Diff::LCS.traverse_sequences(seq2, seq1, @callback_s2_s1) + end + + it 'has the correct LCS result on left-matches' do + expect(@callback_s1_s2.matched_a).to eq(correct_lcs) + expect(@callback_s2_s1.matched_a).to eq(correct_lcs) + end + + it 'has the correct LCS result on right-matches' do + expect(@callback_s1_s2.matched_b).to eq(correct_lcs) + expect(@callback_s2_s1.matched_b).to eq(correct_lcs) + end + + it 'has the correct skipped sequences with the left sequence' do + expect(@callback_s1_s2.discards_a).to eq(skipped_seq1) + expect(@callback_s2_s1.discards_a).to eq(skipped_seq2) + end + + it 'has the correct skipped sequences with the right sequence' do + expect(@callback_s1_s2.discards_b).to eq(skipped_seq2) + expect(@callback_s2_s1.discards_b).to eq(skipped_seq1) + end + + it 'does not have anything done markers from the left or right sequences' do + expect(@callback_s1_s2.done_a).to be_empty + expect(@callback_s1_s2.done_b).to be_empty + expect(@callback_s2_s1.done_a).to be_empty + expect(@callback_s2_s1.done_b).to be_empty + end + end + + describe 'over (hello, hello)' do + before(:each) do + @callback = simple_callback_no_finishers + Diff::LCS.traverse_sequences(hello, hello, @callback) + end + + it 'has the correct LCS result on left-matches' do + expect(@callback.matched_a).to eq(hello.split(//)) + end + + it 'has the correct LCS result on right-matches' do + expect(@callback.matched_b).to eq(hello.split(//)) + end + + it 'has the correct skipped sequences with the left sequence', :only => true do + expect(@callback.discards_a).to be_empty + end + + it 'has the correct skipped sequences with the right sequence' do + expect(@callback.discards_b).to be_empty + end + + it 'does not have anything done markers from the left or right sequences' do + expect(@callback.done_a).to be_empty + expect(@callback.done_b).to be_empty + end + end + + describe 'over (hello_ary, hello_ary)' do + before(:each) do + @callback = simple_callback_no_finishers + Diff::LCS.traverse_sequences(hello_ary, hello_ary, @callback) + end + + it 'has the correct LCS result on left-matches' do + expect(@callback.matched_a).to eq(hello_ary) + end + + it 'has the correct LCS result on right-matches' do + expect(@callback.matched_b).to eq(hello_ary) + end + + it 'has the correct skipped sequences with the left sequence' do + expect(@callback.discards_a).to be_empty + end + + it 'has the correct skipped sequences with the right sequence' do + expect(@callback.discards_b).to be_empty + end + + it 'does not have anything done markers from the left or right sequences' do + expect(@callback.done_a).to be_empty + expect(@callback.done_b).to be_empty + end + end + end + + describe 'callback with finisher' do + before(:each) do + @callback_s1_s2 = simple_callback + Diff::LCS.traverse_sequences(seq1, seq2, @callback_s1_s2) + @callback_s2_s1 = simple_callback + Diff::LCS.traverse_sequences(seq2, seq1, @callback_s2_s1) + end + + it 'has the correct LCS result on left-matches' do + expect(@callback_s1_s2.matched_a).to eq(correct_lcs) + expect(@callback_s2_s1.matched_a).to eq(correct_lcs) + end + + it 'has the correct LCS result on right-matches' do + expect(@callback_s1_s2.matched_b).to eq(correct_lcs) + expect(@callback_s2_s1.matched_b).to eq(correct_lcs) + end + + it 'has the correct skipped sequences for the left sequence' do + expect(@callback_s1_s2.discards_a).to eq(skipped_seq1) + expect(@callback_s2_s1.discards_a).to eq(skipped_seq2) + end + + it 'has the correct skipped sequences for the right sequence' do + expect(@callback_s1_s2.discards_b).to eq(skipped_seq2) + expect(@callback_s2_s1.discards_b).to eq(skipped_seq1) + end + + it 'has done markers differently-sized sequences' do + expect(@callback_s1_s2.done_a).to eq([['p', 9, 't', 11]]) + expect(@callback_s1_s2.done_b).to be_empty + + expect(@callback_s2_s1.done_a).to be_empty + expect(@callback_s2_s1.done_b).to eq([['t', 11, 'p', 9]]) + end + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/hashdiff-1.0.1/.gitignore b/vendor/bundle/ruby/3.1.0/gems/hashdiff-1.0.1/.gitignore new file mode 100644 index 000000000..134a8706c --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/hashdiff-1.0.1/.gitignore @@ -0,0 +1,15 @@ +# See http://help.github.com/ignore-files/ for more about ignoring files. +# +# If you find yourself ignoring temporary files generated by your text editor +# or operating system, you probably want to add a global ignore instead: +# git config --global core.excludesfile ~/.gitignore_global + +# Ignore bundler config +/.bundle +/doc +/.yardoc +/Gemfile.lock + +*.swp +*.bak +*.gem diff --git a/vendor/bundle/ruby/3.1.0/gems/hashdiff-1.0.1/.rspec b/vendor/bundle/ruby/3.1.0/gems/hashdiff-1.0.1/.rspec new file mode 100644 index 000000000..4e1e0d2f7 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/hashdiff-1.0.1/.rspec @@ -0,0 +1 @@ +--color diff --git a/vendor/bundle/ruby/3.1.0/gems/hashdiff-1.0.1/.rubocop.yml b/vendor/bundle/ruby/3.1.0/gems/hashdiff-1.0.1/.rubocop.yml new file mode 100644 index 000000000..4f70ab863 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/hashdiff-1.0.1/.rubocop.yml @@ -0,0 +1,32 @@ +require: rubocop-rspec +AllCops: + TargetRubyVersion: 2.0 # always the lowest version we support +Metrics/PerceivedComplexity: + Enabled: false +Metrics/CyclomaticComplexity: + Enabled: false +Metrics/MethodLength: + Enabled: false +Metrics/AbcSize: + Enabled: false +Metrics/LineLength: + Enabled: false +Metrics/ClassLength: + Enabled: false +Metrics/BlockLength: + Enabled: false +Metrics/ModuleLength: + Enabled: false +Style/Documentation: + Enabled: false +Style/FrozenStringLiteralComment: + Enabled: true + EnforcedStyle: always +Style/NumericPredicate: + Enabled: false +Style/RedundantFreeze: + Enabled: false +RSpec/ExampleLength: + Enabled: false +RSpec/DescribeClass: + Enabled: false diff --git a/vendor/bundle/ruby/3.1.0/gems/hashdiff-1.0.1/.travis.yml b/vendor/bundle/ruby/3.1.0/gems/hashdiff-1.0.1/.travis.yml new file mode 100644 index 000000000..3386da203 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/hashdiff-1.0.1/.travis.yml @@ -0,0 +1,11 @@ +sudo: false +language: ruby +cache: bundler +rvm: + - 2.0.0 + - 2.1.10 + - 2.2.8 + - 2.3.4 + - 2.4.2 + - 2.5.3 + - 2.6.0 diff --git a/vendor/bundle/ruby/3.1.0/gems/hashdiff-1.0.1/.yardopts b/vendor/bundle/ruby/3.1.0/gems/hashdiff-1.0.1/.yardopts new file mode 100644 index 000000000..22ce944f6 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/hashdiff-1.0.1/.yardopts @@ -0,0 +1 @@ +--no-private diff --git a/vendor/bundle/ruby/3.1.0/gems/hashdiff-1.0.1/Gemfile b/vendor/bundle/ruby/3.1.0/gems/hashdiff-1.0.1/Gemfile new file mode 100644 index 000000000..4f7b655ba --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/hashdiff-1.0.1/Gemfile @@ -0,0 +1,8 @@ +# frozen_string_literal: true + +source 'http://rubygems.org' +gemspec + +group :test do + gem 'rake', '< 11' +end diff --git a/vendor/bundle/ruby/3.1.0/gems/hashdiff-1.0.1/LICENSE b/vendor/bundle/ruby/3.1.0/gems/hashdiff-1.0.1/LICENSE new file mode 100644 index 000000000..9adfb9dd6 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/hashdiff-1.0.1/LICENSE @@ -0,0 +1,19 @@ +Copyright (c) 2012 Liu Fengyun + +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/vendor/bundle/ruby/3.1.0/gems/hashdiff-1.0.1/README.md b/vendor/bundle/ruby/3.1.0/gems/hashdiff-1.0.1/README.md new file mode 100644 index 000000000..088ed6766 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/hashdiff-1.0.1/README.md @@ -0,0 +1,276 @@ +# Hashdiff [![Build Status](https://secure.travis-ci.org/liufengyun/hashdiff.svg)](http://travis-ci.org/liufengyun/hashdiff) [![Gem Version](https://badge.fury.io/rb/hashdiff.svg)](http://badge.fury.io/rb/hashdiff) + +Hashdiff is a ruby library to compute the smallest difference between two hashes. + +It also supports comparing two arrays. + +Hashdiff does not monkey-patch any existing class. All features are contained inside the `Hashdiff` module. + +**Docs**: [Documentation](http://rubydoc.info/gems/hashdiff) + + +__WARNING__: Don't use the library for comparing large arrays, say ~10K (see #49). + +## Why Hashdiff? + +Given two Hashes A and B, sometimes you face the question: what's the smallest modification that can be made to change A into B? + +An algorithm that responds to this question has to do following: + +* Generate a list of additions, deletions and changes, so that `A + ChangeSet = B` and `B - ChangeSet = A`. +* Compute recursively -- Arrays and Hashes may be nested arbitrarily in A or B. +* Compute the smallest change -- it should recognize similar child Hashes or child Arrays between A and B. + +Hashdiff answers the question above using an opinionated approach: + +* Hash can be represented as a list of (dot-syntax-path, value) pairs. For example, `{a:[{c:2}]}` can be represented as `["a[0].c", 2]`. +* The change set can be represented using the dot-syntax representation. For example, `[['-', 'b.x', 3], ['~', 'b.z', 45, 30], ['+', 'b.y', 3]]`. +* It compares Arrays using the [LCS(longest common subsequence)](http://en.wikipedia.org/wiki/Longest_common_subsequence_problem) algorithm. +* It recognizes similar Hashes in an Array using a similarity value (0 < similarity <= 1). + +## Usage + +To use the gem, add the following to your Gemfile: + +```Ruby +gem 'hashdiff' +``` + +## Quick Start + +### Diff + +Two simple hashes: + +```ruby +a = {a:3, b:2} +b = {} + +diff = Hashdiff.diff(a, b) +diff.should == [['-', 'a', 3], ['-', 'b', 2]] +``` + +More complex hashes: + +```ruby +a = {a:{x:2, y:3, z:4}, b:{x:3, z:45}} +b = {a:{y:3}, b:{y:3, z:30}} + +diff = Hashdiff.diff(a, b) +diff.should == [['-', 'a.x', 2], ['-', 'a.z', 4], ['-', 'b.x', 3], ['~', 'b.z', 45, 30], ['+', 'b.y', 3]] +``` + +Arrays in hashes: + +```ruby +a = {a:[{x:2, y:3, z:4}, {x:11, y:22, z:33}], b:{x:3, z:45}} +b = {a:[{y:3}, {x:11, z:33}], b:{y:22}} + +diff = Hashdiff.best_diff(a, b) +diff.should == [['-', 'a[0].x', 2], ['-', 'a[0].z', 4], ['-', 'a[1].y', 22], ['-', 'b.x', 3], ['-', 'b.z', 45], ['+', 'b.y', 22]] +``` + +### Patch + +patch example: + +```ruby +a = {'a' => 3} +b = {'a' => {'a1' => 1, 'a2' => 2}} + +diff = Hashdiff.diff(a, b) +Hashdiff.patch!(a, diff).should == b +``` + +unpatch example: + +```ruby +a = [{'a' => 1, 'b' => 2, 'c' => 3, 'd' => 4, 'e' => 5}, {'x' => 5, 'y' => 6, 'z' => 3}, 1] +b = [1, {'a' => 1, 'b' => 2, 'c' => 3, 'e' => 5}] + +diff = Hashdiff.diff(a, b) # diff two array is OK +Hashdiff.unpatch!(b, diff).should == a +``` + +### Options + +There are eight options available: `:delimiter`, `:similarity`, +`:strict`, `:indifferent`, `:numeric_tolerance`, `:strip`, `:case_insensitive`, +`:array_path` and `:use_lcs` + +#### `:delimiter` + +You can specify `:delimiter` to be something other than the default dot. For example: + +```ruby +a = {a:{x:2, y:3, z:4}, b:{x:3, z:45}} +b = {a:{y:3}, b:{y:3, z:30}} + +diff = Hashdiff.diff(a, b, delimiter: '\t') +diff.should == [['-', 'a\tx', 2], ['-', 'a\tz', 4], ['-', 'b\tx', 3], ['~', 'b\tz', 45, 30], ['+', 'b\ty', 3]] +``` + +#### `:similarity` + +In cases where you have similar hash objects in arrays, you can pass a custom value for `:similarity` instead of the default `0.8`. This is interpreted as a ratio of similarity (default is 80% similar, whereas `:similarity => 0.5` would look for at least a 50% similarity). + +#### `:strict` + +The `:strict` option, which defaults to `true`, specifies whether numeric types are compared on type as well as value. By default, an Integer will never be equal to a Float (e.g. 4 != 4.0). Setting `:strict` to false makes the comparison looser (e.g. 4 == 4.0). + +#### `:indifferent` + +The `:indifferent` option, which defaults to `false`, specifies whether to treat hash keys indifferently. Setting `:indifferent` to true has the effect of ignoring differences between symbol keys (ie. {a: 1} ~= {'a' => 1}) + +#### `:numeric_tolerance` + +The :numeric_tolerance option allows for a small numeric tolerance. + +```ruby +a = {x:5, y:3.75, z:7} +b = {x:6, y:3.76, z:7} + +diff = Hashdiff.diff(a, b, numeric_tolerance: 0.1) +diff.should == [["~", "x", 5, 6]] +``` + +#### `:strip` + +The :strip option strips all strings before comparing. + +```ruby +a = {x:5, s:'foo '} +b = {x:6, s:'foo'} + +diff = Hashdiff.diff(a, b, numeric_tolerance: 0.1, strip: true) +diff.should == [["~", "x", 5, 6]] +``` + +#### `:case_insensitive` + +The :case_insensitive option makes string comparisons ignore case. + +```ruby +a = {x:5, s:'FooBar'} +b = {x:6, s:'foobar'} + +diff = Hashdiff.diff(a, b, numeric_tolerance: 0.1, case_insensitive: true) +diff.should == [["~", "x", 5, 6]] +``` + +#### `:array_path` + +The :array_path option represents the path of the diff in an array rather than +a string. This can be used to show differences in between hash key types and +is useful for `patch!` when used on hashes without string keys. + +```ruby +a = {x:5} +b = {'x'=>6} + +diff = Hashdiff.diff(a, b, array_path: true) +diff.should == [['-', [:x], 5], ['+', ['x'], 6]] +``` + +For cases where there are arrays in paths their index will be added to the path. +```ruby +a = {x:[0,1]} +b = {x:[0,2]} + +diff = Hashdiff.diff(a, b, array_path: true) +diff.should == [["-", [:x, 1], 1], ["+", [:x, 1], 2]] +``` + +This shouldn't cause problems if you are comparing an array with a hash: + +```ruby +a = {x:{0=>1}} +b = {x:[1]} + +diff = Hashdiff.diff(a, b, array_path: true) +diff.should == [["~", [:x], {0=>1}, [1]]] +``` + +#### `:use_lcs` + +The :use_lcs option is used to specify whether a +[Longest common subsequence](https://en.wikipedia.org/wiki/Longest_common_subsequence_problem) +(LCS) algorithm is used to determine differences in arrays. This defaults to +`true` but can be changed to `false` for significantly faster array comparisons +(O(n) complexity rather than O(n2) for LCS). + +When :use_lcs is false the results of array comparisons have a tendency to +show changes at indexes rather than additions and subtractions when :use_lcs is +true. + +Note, currently the :similarity option has no effect when :use_lcs is false. + +```ruby +a = {x: [0, 1, 2]} +b = {x: [0, 2, 2, 3]} + +diff = Hashdiff.diff(a, b, use_lcs: false) +diff.should == [["~", "x[1]", 1, 2], ["+", "x[3]", 3]] +``` + +#### Specifying a custom comparison method + +It's possible to specify how the values of a key should be compared. + +```ruby +a = {a:'car', b:'boat', c:'plane'} +b = {a:'bus', b:'truck', c:' plan'} + +diff = Hashdiff.diff(a, b) do |path, obj1, obj2| + case path + when /a|b|c/ + obj1.length == obj2.length + end +end + +diff.should == [['~', 'b', 'boat', 'truck']] +``` + +The yielded params of the comparison block is `|path, obj1, obj2|`, in which path is the key (or delimited compound key) to the value being compared. When comparing elements in array, the path is with the format `array[*]`. For example: + +```ruby +a = {a:'car', b:['boat', 'plane'] } +b = {a:'bus', b:['truck', ' plan'] } + +diff = Hashdiff.diff(a, b) do |path, obj1, obj2| + case path + when 'b[*]' + obj1.length == obj2.length + end +end + +diff.should == [["~", "a", "car", "bus"], ["~", "b[1]", "plane", " plan"], ["-", "b[0]", "boat"], ["+", "b[0]", "truck"]] +``` + +When a comparison block is given, it'll be given priority over other specified options. If the block returns value other than `true` or `false`, then the two values will be compared with other specified options. + +When used in conjunction with the `array_path` option, the path passed in as an argument will be an array. When determining the ordering of an array a key of `"*"` will be used in place of the `key[*]` field. It is possible, if you have hashes with integer or `"*"` keys, to have problems distinguishing between arrays and hashes - although this shouldn't be an issue unless your data is very difficult to predict and/or your custom rules are very specific. + +#### Sorting arrays before comparison + +An order difference alone between two arrays can create too many diffs to be useful. Consider sorting them prior to diffing. + +```ruby +a = {a:'car', b:['boat', 'plane'] } +b = {a:'car', b:['plane', 'boat'] } + +Hashdiff.diff(a, b).should == [["+", "b[0]", "plane"], ["-", "b[2]", "plane"]] + +b[:b].sort! + +Hashdiff.diff(a, b).should == [] +``` + +## Maintainers + +- Krzysztof Rybka ([@krzysiek1507](https://github.com/krzysiek1507)) +- Fengyun Liu ([@liufengyun](https://github.com/liufengyun)) + +## License + +Hashdiff is distributed under the MIT-LICENSE. diff --git a/vendor/bundle/ruby/3.1.0/gems/hashdiff-1.0.1/Rakefile b/vendor/bundle/ruby/3.1.0/gems/hashdiff-1.0.1/Rakefile new file mode 100644 index 000000000..b78b4a2bb --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/hashdiff-1.0.1/Rakefile @@ -0,0 +1,18 @@ +# frozen_string_literal: true + +$LOAD_PATH.push File.expand_path('lib', __dir__) + +require 'rubocop/rake_task' + +require 'bundler' +Bundler::GemHelper.install_tasks + +require 'rspec/core/rake_task' + +RuboCop::RakeTask.new + +task default: %w[spec rubocop] + +RSpec::Core::RakeTask.new(:spec) do |spec| + spec.pattern = './spec/**/*_spec.rb' +end diff --git a/vendor/bundle/ruby/3.1.0/gems/hashdiff-1.0.1/changelog.md b/vendor/bundle/ruby/3.1.0/gems/hashdiff-1.0.1/changelog.md new file mode 100644 index 000000000..300d635e9 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/hashdiff-1.0.1/changelog.md @@ -0,0 +1,100 @@ +# Change Log + +## v1.0.1 2020-02-25 + +* Add indifferent option + +## v1.0.0 2019-06-06 + +* Fix typo in readme (#72 @koic) +* Fix Rubocop offence (#73 @koic) +* Bumps version to v1.0.0 (#74 @jfelchner) + +## v1.0.0.beta1 2019-06-06 + +* fix warnings in ci (#69 @y-yagi) +* drop warnings of the constant change (#70 @jfelchner) + +## v0.4.0 2019-05-28 + +* refactoring (#56 #57 #59 #61 krzysiek1507) +* fix typo in README (#64 @pboling) +* change HashDiff to Hashdiff (#65 @jfelchner) + +## v0.3.9 2019-04-22 + +* Performance tweak (thanks @krzysiek1507: #51 #52 #53) + +## v0.3.8 2018-12-30 + +* Add Rubocop and drops Ruby 1.9 support #47 + +## v0.3.7 2017-10-08 + +* remove 1.8.7 support from gemspec #39 + +## v0.3.6 2017-08-22 + +* add option `use_lcs` #35 + +## v0.3.5 2017-08-06 + +* add option `array_path` #34 + +## v0.3.4 2017-05-01 + +* performance improvement of `#similar?` #31 + +## v0.3.2 2016-12-27 + +* replace `Fixnum` by `Integer` #28 + +## v0.3.1 2016-11-24 + +* fix an error when a hash has mixed types #26 + +## v0.3.0 2016-2-11 + +* support `:case_insensitive` option + +## v0.2.3 2015-11-5 + +* improve performance of LCS algorithm #12 + +## v0.2.2 2014-10-6 + +* make library 1.8.7 compatible + +## v0.2.1 2014-7-13 + +* yield added/deleted keys for custom comparison + +## v0.2.0 2014-3-29 + +* support custom comparison blocks +* support `:strip`, `:numeric_tolerance` and `:strict` options + +## v0.1.0 2013-8-25 + +* use options for parameters `:delimiter` and `:similarity` in interfaces + +## v0.0.6 2013-3-2 + +* Add parameter for custom property-path delimiter. + +## v0.0.5 2012-7-1 + +* fix a bug in judging whehter two objects are similiar. +* add more spec test for `.best_diff` + +## v0.0.4 2012-6-24 + +Main changes in this version is to output the whole object in addition & deletion, instead of recursely add/deletes the object. + +For example, `diff({a:2, c:[4, 5]}, {a:2}) will generate following output: + + [['-', 'c', [4, 5]]] + +instead of following: + + [['-', 'c[0]', 4], ['-', 'c[1]', 5], ['-', 'c', []]] diff --git a/vendor/bundle/ruby/3.1.0/gems/hashdiff-1.0.1/hashdiff.gemspec b/vendor/bundle/ruby/3.1.0/gems/hashdiff-1.0.1/hashdiff.gemspec new file mode 100644 index 000000000..d972f3418 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/hashdiff-1.0.1/hashdiff.gemspec @@ -0,0 +1,39 @@ +# frozen_string_literal: true + +$LOAD_PATH << File.expand_path('lib', __dir__) +require 'hashdiff/version' + +Gem::Specification.new do |s| + s.name = 'hashdiff' + s.version = Hashdiff::VERSION + s.license = 'MIT' + s.summary = ' Hashdiff is a diff lib to compute the smallest difference between two hashes. ' + s.description = ' Hashdiff is a diff lib to compute the smallest difference between two hashes. ' + + s.files = `git ls-files`.split("\n") + s.test_files = `git ls-files -- Appraisals {spec}/*`.split("\n") + + s.require_paths = ['lib'] + s.required_ruby_version = Gem::Requirement.new('>= 2.0.0') + + s.authors = ['Liu Fengyun'] + s.email = ['liufengyunchina@gmail.com'] + + s.homepage = 'https://github.com/liufengyun/hashdiff' + + s.add_development_dependency('bluecloth') + s.add_development_dependency('rspec', '~> 2.0') + s.add_development_dependency('rubocop', '~> 0.49.1') # last version that works with ruby 2.0 + s.add_development_dependency('rubocop-rspec') + s.add_development_dependency('yard') + + if s.respond_to?(:metadata) + s.metadata = { + 'bug_tracker_uri' => 'https://github.com/liufengyun/hashdiff/issues', + 'changelog_uri' => 'https://github.com/liufengyun/hashdiff/blob/master/changelog.md', + 'documentation_uri' => 'https://www.rubydoc.info/gems/hashdiff', + 'homepage_uri' => 'https://github.com/liufengyun/hashdiff', + 'source_code_uri' => 'https://github.com/liufengyun/hashdiff' + } + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/hashdiff-1.0.1/lib/hashdiff.rb b/vendor/bundle/ruby/3.1.0/gems/hashdiff-1.0.1/lib/hashdiff.rb new file mode 100644 index 000000000..d44deb381 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/hashdiff-1.0.1/lib/hashdiff.rb @@ -0,0 +1,10 @@ +# frozen_string_literal: true + +require 'hashdiff/util' +require 'hashdiff/compare_hashes' +require 'hashdiff/lcs' +require 'hashdiff/lcs_compare_arrays' +require 'hashdiff/linear_compare_array' +require 'hashdiff/diff' +require 'hashdiff/patch' +require 'hashdiff/version' diff --git a/vendor/bundle/ruby/3.1.0/gems/hashdiff-1.0.1/lib/hashdiff/compare_hashes.rb b/vendor/bundle/ruby/3.1.0/gems/hashdiff-1.0.1/lib/hashdiff/compare_hashes.rb new file mode 100644 index 000000000..4223ac215 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/hashdiff-1.0.1/lib/hashdiff/compare_hashes.rb @@ -0,0 +1,69 @@ +# frozen_string_literal: true + +module Hashdiff + # @private + # Used to compare hashes + class CompareHashes + class << self + def call(obj1, obj2, opts = {}) + return [] if obj1.empty? && obj2.empty? + + obj1_keys = obj1.keys + obj2_keys = obj2.keys + obj1_lookup = {} + obj2_lookup = {} + + if opts[:indifferent] + obj1_lookup = obj1_keys.each_with_object({}) { |k, h| h[k.to_s] = k } + obj2_lookup = obj2_keys.each_with_object({}) { |k, h| h[k.to_s] = k } + obj1_keys = obj1_keys.map { |k| k.is_a?(Symbol) ? k.to_s : k } + obj2_keys = obj2_keys.map { |k| k.is_a?(Symbol) ? k.to_s : k } + end + + added_keys = (obj2_keys - obj1_keys).sort_by(&:to_s) + common_keys = (obj1_keys & obj2_keys).sort_by(&:to_s) + deleted_keys = (obj1_keys - obj2_keys).sort_by(&:to_s) + + result = [] + + # add deleted properties + deleted_keys.each do |k| + k = opts[:indifferent] ? obj1_lookup[k] : k + change_key = Hashdiff.prefix_append_key(opts[:prefix], k, opts) + custom_result = Hashdiff.custom_compare(opts[:comparison], change_key, obj1[k], nil) + + if custom_result + result.concat(custom_result) + else + result << ['-', change_key, obj1[k]] + end + end + + # recursive comparison for common keys + common_keys.each do |k| + prefix = Hashdiff.prefix_append_key(opts[:prefix], k, opts) + + k1 = opts[:indifferent] ? obj1_lookup[k] : k + k2 = opts[:indifferent] ? obj2_lookup[k] : k + result.concat(Hashdiff.diff(obj1[k1], obj2[k2], opts.merge(prefix: prefix))) + end + + # added properties + added_keys.each do |k| + change_key = Hashdiff.prefix_append_key(opts[:prefix], k, opts) + + k = opts[:indifferent] ? obj2_lookup[k] : k + custom_result = Hashdiff.custom_compare(opts[:comparison], change_key, nil, obj2[k]) + + if custom_result + result.concat(custom_result) + else + result << ['+', change_key, obj2[k]] + end + end + + result + end + end + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/hashdiff-1.0.1/lib/hashdiff/diff.rb b/vendor/bundle/ruby/3.1.0/gems/hashdiff-1.0.1/lib/hashdiff/diff.rb new file mode 100644 index 000000000..5a1046277 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/hashdiff-1.0.1/lib/hashdiff/diff.rb @@ -0,0 +1,177 @@ +# frozen_string_literal: true + +module Hashdiff + # Best diff two objects, which tries to generate the smallest change set using different similarity values. + # + # Hashdiff.best_diff is useful in case of comparing two objects which include similar hashes in arrays. + # + # @param [Array, Hash] obj1 + # @param [Array, Hash] obj2 + # @param [Hash] options the options to use when comparing + # * :strict (Boolean) [true] whether numeric values will be compared on type as well as value. Set to false to allow comparing Integer, Float, BigDecimal to each other + # * :indifferent (Boolean) [false] whether to treat hash keys indifferently. Set to true to ignore differences between symbol keys (ie. {a: 1} ~= {'a' => 1}) + # * :delimiter (String) ['.'] the delimiter used when returning nested key references + # * :numeric_tolerance (Numeric) [0] should be a positive numeric value. Value by which numeric differences must be greater than. By default, numeric values are compared exactly; with the :tolerance option, the difference between numeric values must be greater than the given value. + # * :strip (Boolean) [false] whether or not to call #strip on strings before comparing + # * :array_path (Boolean) [false] whether to return the path references for nested values in an array, can be used for patch compatibility with non string keys. + # * :use_lcs (Boolean) [true] whether or not to use an implementation of the Longest common subsequence algorithm for comparing arrays, produces better diffs but is slower. + # + # @yield [path, value1, value2] Optional block is used to compare each value, instead of default #==. If the block returns value other than true of false, then other specified comparison options will be used to do the comparison. + # + # @return [Array] an array of changes. + # e.g. [[ '+', 'a.b', '45' ], [ '-', 'a.c', '5' ], [ '~', 'a.x', '45', '63']] + # + # @example + # a = {'x' => [{'a' => 1, 'c' => 3, 'e' => 5}, {'y' => 3}]} + # b = {'x' => [{'a' => 1, 'b' => 2, 'e' => 5}] } + # diff = Hashdiff.best_diff(a, b) + # diff.should == [['-', 'x[0].c', 3], ['+', 'x[0].b', 2], ['-', 'x[1].y', 3], ['-', 'x[1]', {}]] + # + # @since 0.0.1 + def self.best_diff(obj1, obj2, options = {}, &block) + options[:comparison] = block if block_given? + + opts = { similarity: 0.3 }.merge!(options) + diffs1 = diff(obj1, obj2, opts) + count1 = count_diff diffs1 + + opts = { similarity: 0.5 }.merge!(options) + diffs2 = diff(obj1, obj2, opts) + count2 = count_diff diffs2 + + opts = { similarity: 0.8 }.merge!(options) + diffs3 = diff(obj1, obj2, opts) + count3 = count_diff diffs3 + + count, diffs = count1 < count2 ? [count1, diffs1] : [count2, diffs2] + count < count3 ? diffs : diffs3 + end + + # Compute the diff of two hashes or arrays + # + # @param [Array, Hash] obj1 + # @param [Array, Hash] obj2 + # @param [Hash] options the options to use when comparing + # * :strict (Boolean) [true] whether numeric values will be compared on type as well as value. Set to false to allow comparing Integer, Float, BigDecimal to each other + # * :indifferent (Boolean) [false] whether to treat hash keys indifferently. Set to true to ignore differences between symbol keys (ie. {a: 1} ~= {'a' => 1}) + # * :similarity (Numeric) [0.8] should be between (0, 1]. Meaningful if there are similar hashes in arrays. See {best_diff}. + # * :delimiter (String) ['.'] the delimiter used when returning nested key references + # * :numeric_tolerance (Numeric) [0] should be a positive numeric value. Value by which numeric differences must be greater than. By default, numeric values are compared exactly; with the :tolerance option, the difference between numeric values must be greater than the given value. + # * :strip (Boolean) [false] whether or not to call #strip on strings before comparing + # * :array_path (Boolean) [false] whether to return the path references for nested values in an array, can be used for patch compatibility with non string keys. + # * :use_lcs (Boolean) [true] whether or not to use an implementation of the Longest common subsequence algorithm for comparing arrays, produces better diffs but is slower. + # + # + # @yield [path, value1, value2] Optional block is used to compare each value, instead of default #==. If the block returns value other than true of false, then other specified comparison options will be used to do the comparison. + # + # @return [Array] an array of changes. + # e.g. [[ '+', 'a.b', '45' ], [ '-', 'a.c', '5' ], [ '~', 'a.x', '45', '63']] + # + # @example + # a = {"a" => 1, "b" => {"b1" => 1, "b2" =>2}} + # b = {"a" => 1, "b" => {}} + # + # diff = Hashdiff.diff(a, b) + # diff.should == [['-', 'b.b1', 1], ['-', 'b.b2', 2]] + # + # @since 0.0.1 + def self.diff(obj1, obj2, options = {}, &block) + opts = { + prefix: '', + similarity: 0.8, + delimiter: '.', + strict: true, + indifferent: false, + strip: false, + numeric_tolerance: 0, + array_path: false, + use_lcs: true + }.merge!(options) + + opts[:prefix] = [] if opts[:array_path] && opts[:prefix] == '' + + opts[:comparison] = block if block_given? + + # prefer to compare with provided block + result = custom_compare(opts[:comparison], opts[:prefix], obj1, obj2) + return result if result + + return [] if obj1.nil? && obj2.nil? + + return [['~', opts[:prefix], obj1, obj2]] if obj1.nil? || obj2.nil? + + return [['~', opts[:prefix], obj1, obj2]] unless comparable?(obj1, obj2, opts[:strict]) + + return LcsCompareArrays.call(obj1, obj2, opts) if obj1.is_a?(Array) && opts[:use_lcs] + + return LinearCompareArray.call(obj1, obj2, opts) if obj1.is_a?(Array) && !opts[:use_lcs] + + return CompareHashes.call(obj1, obj2, opts) if obj1.is_a?(Hash) + + return [] if compare_values(obj1, obj2, opts) + + [['~', opts[:prefix], obj1, obj2]] + end + + # @private + # + # diff array using LCS algorithm + def self.diff_array_lcs(arraya, arrayb, options = {}) + return [] if arraya.empty? && arrayb.empty? + + change_set = [] + + if arraya.empty? + arrayb.each_index do |index| + change_set << ['+', index, arrayb[index]] + end + + return change_set + end + + if arrayb.empty? + arraya.each_index do |index| + i = arraya.size - index - 1 + change_set << ['-', i, arraya[i]] + end + + return change_set + end + + opts = { + prefix: '', + similarity: 0.8, + delimiter: '.' + }.merge!(options) + + links = lcs(arraya, arrayb, opts) + + # yield common + yield links if block_given? + + # padding the end + links << [arraya.size, arrayb.size] + + last_x = -1 + last_y = -1 + links.each do |pair| + x, y = pair + + # remove from a, beginning from the end + (x > last_x + 1) && (x - last_x - 2).downto(0).each do |i| + change_set << ['-', last_y + i + 1, arraya[i + last_x + 1]] + end + + # add from b, beginning from the head + (y > last_y + 1) && 0.upto(y - last_y - 2).each do |i| + change_set << ['+', last_y + i + 1, arrayb[i + last_y + 1]] + end + + # update flags + last_x = x + last_y = y + end + + change_set + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/hashdiff-1.0.1/lib/hashdiff/lcs.rb b/vendor/bundle/ruby/3.1.0/gems/hashdiff-1.0.1/lib/hashdiff/lcs.rb new file mode 100644 index 000000000..b23c3e8db --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/hashdiff-1.0.1/lib/hashdiff/lcs.rb @@ -0,0 +1,66 @@ +# frozen_string_literal: true + +module Hashdiff + # @private + # + # caculate array difference using LCS algorithm + # http://en.wikipedia.org/wiki/Longest_common_subsequence_problem + def self.lcs(arraya, arrayb, options = {}) + return [] if arraya.empty? || arrayb.empty? + + opts = { similarity: 0.8 }.merge!(options) + + opts[:prefix] = prefix_append_array_index(opts[:prefix], '*', opts) + + a_start = b_start = 0 + a_finish = arraya.size - 1 + b_finish = arrayb.size - 1 + vector = [] + + lcs = [] + (b_start..b_finish).each do |bi| + lcs[bi] = [] + (a_start..a_finish).each do |ai| + if similar?(arraya[ai], arrayb[bi], opts) + topleft = (ai > 0) && (bi > 0) ? lcs[bi - 1][ai - 1][1] : 0 + lcs[bi][ai] = [:topleft, topleft + 1] + elsif (top = bi > 0 ? lcs[bi - 1][ai][1] : 0) + left = ai > 0 ? lcs[bi][ai - 1][1] : 0 + count = top > left ? top : left + + direction = if top > left + :top + elsif top < left + :left + elsif bi.zero? + :top + elsif ai.zero? + :left + else + :both + end + + lcs[bi][ai] = [direction, count] + end + end + end + + x = a_finish + y = b_finish + while (x >= 0) && (y >= 0) && (lcs[y][x][1] > 0) + if lcs[y][x][0] == :both + x -= 1 + elsif lcs[y][x][0] == :topleft + vector.insert(0, [x, y]) + x -= 1 + y -= 1 + elsif lcs[y][x][0] == :top + y -= 1 + elsif lcs[y][x][0] == :left + x -= 1 + end + end + + vector + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/hashdiff-1.0.1/lib/hashdiff/lcs_compare_arrays.rb b/vendor/bundle/ruby/3.1.0/gems/hashdiff-1.0.1/lib/hashdiff/lcs_compare_arrays.rb new file mode 100644 index 000000000..1bae9127f --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/hashdiff-1.0.1/lib/hashdiff/lcs_compare_arrays.rb @@ -0,0 +1,32 @@ +# frozen_string_literal: true + +module Hashdiff + # @private + # Used to compare arrays using the lcs algorithm + class LcsCompareArrays + class << self + def call(obj1, obj2, opts = {}) + result = [] + + changeset = Hashdiff.diff_array_lcs(obj1, obj2, opts) do |lcs| + # use a's index for similarity + lcs.each do |pair| + prefix = Hashdiff.prefix_append_array_index(opts[:prefix], pair[0], opts) + + result.concat(Hashdiff.diff(obj1[pair[0]], obj2[pair[1]], opts.merge(prefix: prefix))) + end + end + + changeset.each do |change| + next if change[0] != '-' && change[0] != '+' + + change_key = Hashdiff.prefix_append_array_index(opts[:prefix], change[1], opts) + + result << [change[0], change_key, change[2]] + end + + result + end + end + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/hashdiff-1.0.1/lib/hashdiff/linear_compare_array.rb b/vendor/bundle/ruby/3.1.0/gems/hashdiff-1.0.1/lib/hashdiff/linear_compare_array.rb new file mode 100644 index 000000000..0b9623c76 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/hashdiff-1.0.1/lib/hashdiff/linear_compare_array.rb @@ -0,0 +1,159 @@ +# frozen_string_literal: true + +module Hashdiff + # @private + # + # Used to compare arrays in a linear complexity, which produces longer diffs + # than using the lcs algorithm but is considerably faster + class LinearCompareArray + def self.call(old_array, new_array, options = {}) + instance = new(old_array, new_array, options) + instance.call + end + + def call + return [] if old_array.empty? && new_array.empty? + + self.old_index = 0 + self.new_index = 0 + # by comparing the array lengths we can expect that a number of items + # are either added or removed + self.expected_additions = new_array.length - old_array.length + + loop do + if extra_items_in_old_array? + append_deletion(old_array[old_index], old_index) + elsif extra_items_in_new_array? + append_addition(new_array[new_index], new_index) + else + compare_at_index + end + + self.old_index = old_index + 1 + self.new_index = new_index + 1 + break if iterated_through_both_arrays? + end + + changes + end + + private + + attr_reader :old_array, :new_array, :options, :additions, :deletions, :differences + attr_accessor :old_index, :new_index, :expected_additions + + def initialize(old_array, new_array, options) + @old_array = old_array + @new_array = new_array + @options = { prefix: '' }.merge!(options) + + @additions = [] + @deletions = [] + @differences = [] + end + + def extra_items_in_old_array? + old_index < old_array.length && new_index >= new_array.length + end + + def extra_items_in_new_array? + new_index < new_array.length && old_index >= old_array.length + end + + def iterated_through_both_arrays? + old_index >= old_array.length && new_index >= new_array.length + end + + def compare_at_index + difference = item_difference(old_array[old_index], new_array[new_index], old_index) + return if difference.empty? + + index_after_additions = index_of_match_after_additions + append_addititions_before_match(index_after_additions) + + index_after_deletions = index_of_match_after_deletions + append_deletions_before_match(index_after_deletions) + + match = index_after_additions || index_after_deletions + + append_differences(difference) unless match + end + + def item_difference(old_item, new_item, item_index) + prefix = Hashdiff.prefix_append_array_index(options[:prefix], item_index, options) + Hashdiff.diff(old_item, new_item, options.merge(prefix: prefix)) + end + + # look ahead in the new array to see if the current item appears later + # thereby having new items added + def index_of_match_after_additions + return unless expected_additions > 0 + + (1..expected_additions).each do |i| + next_difference = item_difference( + old_array[old_index], + new_array[new_index + i], + old_index + ) + + return new_index + i if next_difference.empty? + end + + nil + end + + # look ahead in the old array to see if the current item appears later + # thereby having items removed + def index_of_match_after_deletions + return unless expected_additions < 0 + + (1..(expected_additions.abs)).each do |i| + next_difference = item_difference( + old_array[old_index + i], + new_array[new_index], + old_index + ) + + return old_index + i if next_difference.empty? + end + + nil + end + + def append_addititions_before_match(match_index) + return unless match_index + + (new_index...match_index).each { |i| append_addition(new_array[i], i) } + self.expected_additions = expected_additions - (match_index - new_index) + self.new_index = match_index + end + + def append_deletions_before_match(match_index) + return unless match_index + + (old_index...match_index).each { |i| append_deletion(old_array[i], i) } + self.expected_additions = expected_additions + (match_index - new_index) + self.old_index = match_index + end + + def append_addition(item, index) + key = Hashdiff.prefix_append_array_index(options[:prefix], index, options) + additions << ['+', key, item] + end + + def append_deletion(item, index) + key = Hashdiff.prefix_append_array_index(options[:prefix], index, options) + deletions << ['-', key, item] + end + + def append_differences(difference) + differences.concat(difference) + end + + def changes + # this algorithm only allows there to be additions or deletions + # deletions are reverse so they don't change the index of earlier items + differences + additions + deletions.reverse + end + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/hashdiff-1.0.1/lib/hashdiff/patch.rb b/vendor/bundle/ruby/3.1.0/gems/hashdiff-1.0.1/lib/hashdiff/patch.rb new file mode 100644 index 000000000..31541f36e --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/hashdiff-1.0.1/lib/hashdiff/patch.rb @@ -0,0 +1,88 @@ +# frozen_string_literal: true + +# +# This module provides methods to diff two hash, patch and unpatch hash +# +module Hashdiff + # Apply patch to object + # + # @param [Hash, Array] obj the object to be patched, can be an Array or a Hash + # @param [Array] changes e.g. [[ '+', 'a.b', '45' ], [ '-', 'a.c', '5' ], [ '~', 'a.x', '45', '63']] + # @param [Hash] options supports following keys: + # * :delimiter (String) ['.'] delimiter string for representing nested keys in changes array + # + # @return the object after patch + # + # @since 0.0.1 + def self.patch!(obj, changes, options = {}) + delimiter = options[:delimiter] || '.' + + changes.each do |change| + parts = change[1] + parts = decode_property_path(parts, delimiter) unless parts.is_a?(Array) + + last_part = parts.last + + parent_node = node(obj, parts[0, parts.size - 1]) + + if change[0] == '+' + if parent_node.is_a?(Array) + parent_node.insert(last_part, change[2]) + else + parent_node[last_part] = change[2] + end + elsif change[0] == '-' + if parent_node.is_a?(Array) + parent_node.delete_at(last_part) + else + parent_node.delete(last_part) + end + elsif change[0] == '~' + parent_node[last_part] = change[3] + end + end + + obj + end + + # Unpatch an object + # + # @param [Hash, Array] obj the object to be unpatched, can be an Array or a Hash + # @param [Array] changes e.g. [[ '+', 'a.b', '45' ], [ '-', 'a.c', '5' ], [ '~', 'a.x', '45', '63']] + # @param [Hash] options supports following keys: + # * :delimiter (String) ['.'] delimiter string for representing nested keys in changes array + # + # @return the object after unpatch + # + # @since 0.0.1 + def self.unpatch!(obj, changes, options = {}) + delimiter = options[:delimiter] || '.' + + changes.reverse_each do |change| + parts = change[1] + parts = decode_property_path(parts, delimiter) unless parts.is_a?(Array) + + last_part = parts.last + + parent_node = node(obj, parts[0, parts.size - 1]) + + if change[0] == '+' + if parent_node.is_a?(Array) + parent_node.delete_at(last_part) + else + parent_node.delete(last_part) + end + elsif change[0] == '-' + if parent_node.is_a?(Array) + parent_node.insert(last_part, change[2]) + else + parent_node[last_part] = change[2] + end + elsif change[0] == '~' + parent_node[last_part] = change[2] + end + end + + obj + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/hashdiff-1.0.1/lib/hashdiff/util.rb b/vendor/bundle/ruby/3.1.0/gems/hashdiff-1.0.1/lib/hashdiff/util.rb new file mode 100644 index 000000000..09ed84b41 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/hashdiff-1.0.1/lib/hashdiff/util.rb @@ -0,0 +1,155 @@ +# frozen_string_literal: true + +module Hashdiff + # @private + # + # judge whether two objects are similar + def self.similar?(obja, objb, options = {}) + return compare_values(obja, objb, options) if !options[:comparison] && !any_hash_or_array?(obja, objb) + + count_a = count_nodes(obja) + count_b = count_nodes(objb) + + return true if (count_a + count_b).zero? + + opts = { similarity: 0.8 }.merge!(options) + + diffs = count_diff diff(obja, objb, opts) + + (1 - diffs / (count_a + count_b).to_f) >= opts[:similarity] + end + + # @private + # + # count node differences + def self.count_diff(diffs) + diffs.inject(0) do |sum, item| + old_change_count = count_nodes(item[2]) + new_change_count = count_nodes(item[3]) + sum + (old_change_count + new_change_count) + end + end + + # @private + # + # count total nodes for an object + def self.count_nodes(obj) + return 0 unless obj + + count = 0 + if obj.is_a?(Array) + obj.each { |e| count += count_nodes(e) } + elsif obj.is_a?(Hash) + obj.each_value { |v| count += count_nodes(v) } + else + return 1 + end + + count + end + + # @private + # + # decode property path into an array + # @param [String] path Property-string + # @param [String] delimiter Property-string delimiter + # + # e.g. "a.b[3].c" => ['a', 'b', 3, 'c'] + def self.decode_property_path(path, delimiter = '.') + path.split(delimiter).inject([]) do |memo, part| + if part =~ /^(.*)\[(\d+)\]$/ + if !Regexp.last_match(1).empty? + memo + [Regexp.last_match(1), Regexp.last_match(2).to_i] + else + memo + [Regexp.last_match(2).to_i] + end + else + memo + [part] + end + end + end + + # @private + # + # get the node of hash by given path parts + def self.node(hash, parts) + temp = hash + parts.each do |part| + temp = temp[part] + end + temp + end + + # @private + # + # check for equality or "closeness" within given tolerance + def self.compare_values(obj1, obj2, options = {}) + if options[:numeric_tolerance].is_a?(Numeric) && + obj1.is_a?(Numeric) && obj2.is_a?(Numeric) + return (obj1 - obj2).abs <= options[:numeric_tolerance] + end + + if options[:strip] == true + obj1 = obj1.strip if obj1.respond_to?(:strip) + obj2 = obj2.strip if obj2.respond_to?(:strip) + end + + if options[:case_insensitive] == true + obj1 = obj1.downcase if obj1.respond_to?(:downcase) + obj2 = obj2.downcase if obj2.respond_to?(:downcase) + end + + obj1 == obj2 + end + + # @private + # + # check if objects are comparable + def self.comparable?(obj1, obj2, strict = true) + return true if (obj1.is_a?(Array) || obj1.is_a?(Hash)) && obj2.is_a?(obj1.class) + return true if (obj2.is_a?(Array) || obj2.is_a?(Hash)) && obj1.is_a?(obj2.class) + return true if !strict && obj1.is_a?(Numeric) && obj2.is_a?(Numeric) + + obj1.is_a?(obj2.class) && obj2.is_a?(obj1.class) + end + + # @private + # + # try custom comparison + def self.custom_compare(method, key, obj1, obj2) + return unless method + + res = method.call(key, obj1, obj2) + + # nil != false here + return [['~', key, obj1, obj2]] if res == false + return [] if res == true + end + + def self.prefix_append_key(prefix, key, opts) + if opts[:array_path] + prefix + [key] + else + prefix.empty? ? key.to_s : "#{prefix}#{opts[:delimiter]}#{key}" + end + end + + def self.prefix_append_array_index(prefix, array_index, opts) + if opts[:array_path] + prefix + [array_index] + else + "#{prefix}[#{array_index}]" + end + end + + class << self + private + + # @private + # + # checks if both objects are Arrays or Hashes + def any_hash_or_array?(obja, objb) + obja.is_a?(Array) || obja.is_a?(Hash) || objb.is_a?(Array) || objb.is_a?(Hash) + end + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/hashdiff-1.0.1/lib/hashdiff/version.rb b/vendor/bundle/ruby/3.1.0/gems/hashdiff-1.0.1/lib/hashdiff/version.rb new file mode 100644 index 000000000..b6f28c466 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/hashdiff-1.0.1/lib/hashdiff/version.rb @@ -0,0 +1,5 @@ +# frozen_string_literal: true + +module Hashdiff + VERSION = '1.0.1'.freeze +end diff --git a/vendor/bundle/ruby/3.1.0/gems/hashdiff-1.0.1/spec/hashdiff/best_diff_spec.rb b/vendor/bundle/ruby/3.1.0/gems/hashdiff-1.0.1/spec/hashdiff/best_diff_spec.rb new file mode 100644 index 000000000..b8dbe6eda --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/hashdiff-1.0.1/spec/hashdiff/best_diff_spec.rb @@ -0,0 +1,75 @@ +# frozen_string_literal: true + +require 'spec_helper' + +describe Hashdiff do + it 'is able to best diff' do + a = { 'x' => [{ 'a' => 1, 'c' => 3, 'e' => 5 }, { 'y' => 3 }] } + b = { 'x' => [{ 'a' => 1, 'b' => 2, 'e' => 5 }] } + + diff = described_class.best_diff(a, b) + diff.should == [['-', 'x[0].c', 3], ['+', 'x[0].b', 2], ['-', 'x[1]', { 'y' => 3 }]] + end + + it 'uses custom delimiter when provided' do + a = { 'x' => [{ 'a' => 1, 'c' => 3, 'e' => 5 }, { 'y' => 3 }] } + b = { 'x' => [{ 'a' => 1, 'b' => 2, 'e' => 5 }] } + + diff = described_class.best_diff(a, b, delimiter: "\t") + diff.should == [['-', "x[0]\tc", 3], ['+', "x[0]\tb", 2], ['-', 'x[1]', { 'y' => 3 }]] + end + + it 'uses custom comparison when provided' do + a = { 'x' => [{ 'a' => 'foo', 'c' => 'goat', 'e' => 'snake' }, { 'y' => 'baz' }] } + b = { 'x' => [{ 'a' => 'bar', 'b' => 'cow', 'e' => 'puppy' }] } + + diff = described_class.best_diff(a, b) do |path, obj1, obj2| + case path + when /^x\[.\]\..$/ + obj1.length == obj2.length if obj1 && obj2 + end + end + + diff.should == [['-', 'x[0].c', 'goat'], ['+', 'x[0].b', 'cow'], ['-', 'x[1]', { 'y' => 'baz' }]] + end + + it 'is able to best diff array in hash' do + a = { 'menu' => { + 'id' => 'file', + 'value' => 'File', + 'popup' => { + 'menuitem' => [ + { 'value' => 'New', 'onclick' => 'CreateNewDoc()' }, + { 'value' => 'Close', 'onclick' => 'CloseDoc()' } + ] + } + } } + + b = { 'menu' => { + 'id' => 'file 2', + 'value' => 'File', + 'popup' => { + 'menuitem' => [ + { 'value' => 'New1', 'onclick' => 'CreateNewDoc()' }, + { 'value' => 'Open', 'onclick' => 'OpenDoc()' }, + { 'value' => 'Close', 'onclick' => 'CloseDoc()' } + ] + } + } } + + diff = described_class.best_diff(a, b) + diff.should == [ + ['~', 'menu.id', 'file', 'file 2'], + ['~', 'menu.popup.menuitem[0].value', 'New', 'New1'], + ['+', 'menu.popup.menuitem[1]', { 'value' => 'Open', 'onclick' => 'OpenDoc()' }] + ] + end + + it 'is able to have an array_path specified' do + a = { 'x' => [{ 'a' => 1, 'c' => 3, 'e' => 5 }, { 'y' => 3 }] } + b = { 'x' => [{ 'a' => 1, 'b' => 2, 'e' => 5 }] } + + diff = described_class.best_diff(a, b, array_path: true) + diff.should == [['-', ['x', 0, 'c'], 3], ['+', ['x', 0, 'b'], 2], ['-', ['x', 1], { 'y' => 3 }]] + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/hashdiff-1.0.1/spec/hashdiff/diff_array_spec.rb b/vendor/bundle/ruby/3.1.0/gems/hashdiff-1.0.1/spec/hashdiff/diff_array_spec.rb new file mode 100644 index 000000000..556132594 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/hashdiff-1.0.1/spec/hashdiff/diff_array_spec.rb @@ -0,0 +1,60 @@ +# frozen_string_literal: true + +require 'spec_helper' + +describe Hashdiff do + it 'is able to diff two equal array' do + a = [1, 2, 3] + b = [1, 2, 3] + + diff = described_class.diff_array_lcs(a, b) + diff.should == [] + end + + it 'is able to diff two arrays with one element in common' do + a = [1, 2, 3] + b = [1, 8, 7] + + diff = described_class.diff_array_lcs(a, b) + diff.should == [['-', 2, 3], ['-', 1, 2], ['+', 1, 8], ['+', 2, 7]] + end + + it 'is able to diff two arrays with nothing in common' do + a = [1, 2] + b = [] + + diff = described_class.diff_array_lcs(a, b) + diff.should == [['-', 1, 2], ['-', 0, 1]] + end + + it 'is able to diff an empty array with an non-empty array' do + a = [] + b = [1, 2] + + diff = described_class.diff_array_lcs(a, b) + diff.should == [['+', 0, 1], ['+', 1, 2]] + end + + it 'is able to diff two arrays with two elements in common' do + a = [1, 3, 5, 7] + b = [2, 3, 7, 5] + + diff = described_class.diff_array_lcs(a, b) + diff.should == [['-', 0, 1], ['+', 0, 2], ['+', 2, 7], ['-', 4, 7]] + end + + it 'is able to test two arrays with two common elements in different order' do + a = [1, 3, 4, 7] + b = [2, 3, 7, 5] + + diff = described_class.diff_array_lcs(a, b) + diff.should == [['-', 0, 1], ['+', 0, 2], ['-', 2, 4], ['+', 3, 5]] + end + + it 'is able to diff two arrays with similar elements' do + a = [{ 'a' => 1, 'b' => 2, 'c' => 3, 'd' => 4, 'e' => 5 }, 3] + b = [1, { 'a' => 1, 'b' => 2, 'c' => 3, 'e' => 5 }] + diff = described_class.diff_array_lcs(a, b) + diff.should == [['+', 0, 1], ['-', 2, 3]] + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/hashdiff-1.0.1/spec/hashdiff/diff_spec.rb b/vendor/bundle/ruby/3.1.0/gems/hashdiff-1.0.1/spec/hashdiff/diff_spec.rb new file mode 100644 index 000000000..c9dfd962d --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/hashdiff-1.0.1/spec/hashdiff/diff_spec.rb @@ -0,0 +1,360 @@ +# frozen_string_literal: true + +require 'spec_helper' + +describe Hashdiff do + it 'is able to diff two empty hashes' do + diff = described_class.diff({}, {}) + diff.should == [] + end + + it 'is able to diff an hash with an empty hash' do + a = { 'a' => 3, 'b' => 2 } + b = {} + + diff = described_class.diff(a, b) + expect(diff).to eq([['-', 'a', 3], ['-', 'b', 2]]) + + diff = described_class.diff(b, a) + diff.should == [['+', 'a', 3], ['+', 'b', 2]] + end + + it 'is able to diff two equal hashes' do + diff = described_class.diff({ 'a' => 2, 'b' => 2 }, 'a' => 2, 'b' => 2) + diff.should == [] + end + + it 'is able to diff two equal hashes with mixed key types' do + a = { 'a' => 1, :b => 1 } + diff = described_class.diff(a, a) + diff.should == [] + end + + it 'is able to diff if mixed key types are removed' do + a = { 'a' => 1, :b => 1 } + b = {} + diff = described_class.diff(a, b) + diff.should == [['-', 'a', 1], ['-', 'b', 1]] + end + + it 'is able to diff if mixed key types are added' do + a = { 'a' => 1, :b => 1 } + b = {} + diff = described_class.diff(b, a) + diff.should == [['+', 'a', 1], ['+', 'b', 1]] + end + + it 'is able to diff two hashes with equivalent numerics, when strict is false' do + diff = described_class.diff({ 'a' => 2.0, 'b' => 2 }, { 'a' => 2, 'b' => 2.0 }, strict: false) + diff.should == [] + end + + it 'ignores string vs symbol differences, when indifferent is true' do + diff = described_class.diff({ 'a' => 2, :b => 2 }, { :a => 2, 'b' => 2, :c => 3 }, indifferent: true) + diff.should == [['+', 'c', 3]] + end + + it 'is able to diff changes in hash value' do + diff = described_class.diff({ 'a' => 2, 'b' => 3, 'c' => ' hello' }, 'a' => 2, 'b' => 4, 'c' => 'hello') + diff.should == [['~', 'b', 3, 4], ['~', 'c', ' hello', 'hello']] + end + + it 'is able to diff changes in hash value which is array' do + diff = described_class.diff({ 'a' => 2, 'b' => [1, 2, 3] }, 'a' => 2, 'b' => [1, 3, 4]) + diff.should == [['-', 'b[1]', 2], ['+', 'b[2]', 4]] + end + + it 'is able to diff changes in hash value which is hash' do + diff = described_class.diff({ 'a' => { 'x' => 2, 'y' => 3, 'z' => 4 }, 'b' => { 'x' => 3, 'z' => 45 } }, + 'a' => { 'y' => 3 }, 'b' => { 'y' => 3, 'z' => 30 }) + diff.should == [['-', 'a.x', 2], ['-', 'a.z', 4], ['-', 'b.x', 3], ['~', 'b.z', 45, 30], ['+', 'b.y', 3]] + end + + it 'is able to best diff similar objects in array' do + diff = described_class.best_diff({ 'a' => [{ 'x' => 2, 'y' => 3, 'z' => 4 }, { 'x' => 11, 'y' => 22, 'z' => 33 }], 'b' => { 'x' => 3, 'z' => 45 } }, + 'a' => [{ 'y' => 3 }, { 'x' => 11, 'z' => 33 }], 'b' => { 'y' => 22 }) + diff.should == [['-', 'a[0].x', 2], ['-', 'a[0].z', 4], ['-', 'a[1].y', 22], ['-', 'b.x', 3], ['-', 'b.z', 45], ['+', 'b.y', 22]] + end + + it 'is able to diff addition of key value pair' do + a = { 'a' => 3, 'c' => 11, 'd' => 45, 'e' => 100, 'f' => 200 } + b = { 'a' => 3, 'c' => 11, 'd' => 45, 'e' => 100, 'f' => 200, 'g' => 300 } + + diff = described_class.diff(a, b) + expect(diff).to eq([['+', 'g', 300]]) + + diff = described_class.diff(b, a) + diff.should == [['-', 'g', 300]] + end + + it 'is able to diff value type changes' do + a = { 'a' => 3 } + b = { 'a' => { 'a1' => 1, 'a2' => 2 } } + + diff = described_class.diff(a, b) + expect(diff).to eq([['~', 'a', 3, { 'a1' => 1, 'a2' => 2 }]]) + + diff = described_class.diff(b, a) + diff.should == [['~', 'a', { 'a1' => 1, 'a2' => 2 }, 3]] + end + + it 'is able to diff value changes: array <=> []' do + a = { 'a' => 1, 'b' => [1, 2] } + b = { 'a' => 1, 'b' => [] } + + diff = described_class.diff(a, b) + diff.should == [['-', 'b[1]', 2], ['-', 'b[0]', 1]] + end + + it 'is able to diff value changes: array <=> nil' do + a = { 'a' => 1, 'b' => [1, 2] } + b = { 'a' => 1, 'b' => nil } + + diff = described_class.diff(a, b) + diff.should == [['~', 'b', [1, 2], nil]] + end + + it 'is able to diff value chagnes: remove array completely' do + a = { 'a' => 1, 'b' => [1, 2] } + b = { 'a' => 1 } + + diff = described_class.diff(a, b) + diff.should == [['-', 'b', [1, 2]]] + end + + it 'is able to diff value changes: remove whole hash' do + a = { 'a' => 1, 'b' => { 'b1' => 1, 'b2' => 2 } } + b = { 'a' => 1 } + + diff = described_class.diff(a, b) + diff.should == [['-', 'b', { 'b1' => 1, 'b2' => 2 }]] + end + + it 'is able to diff value changes: hash <=> {}' do + a = { 'a' => 1, 'b' => { 'b1' => 1, 'b2' => 2 } } + b = { 'a' => 1, 'b' => {} } + + diff = described_class.diff(a, b) + diff.should == [['-', 'b.b1', 1], ['-', 'b.b2', 2]] + end + + it 'is able to diff value changes: hash <=> nil' do + a = { 'a' => 1, 'b' => { 'b1' => 1, 'b2' => 2 } } + b = { 'a' => 1, 'b' => nil } + + diff = described_class.diff(a, b) + diff.should == [['~', 'b', { 'b1' => 1, 'b2' => 2 }, nil]] + end + + it 'is able to diff similar objects in array' do + a = [{ 'a' => 1, 'b' => 2, 'c' => 3, 'd' => 4, 'e' => 5 }, 3] + b = [1, { 'a' => 1, 'b' => 2, 'c' => 3, 'e' => 5 }] + + diff = described_class.diff(a, b) + diff.should == [['-', '[0].d', 4], ['+', '[0]', 1], ['-', '[2]', 3]] + end + + it 'is able to diff similar & equal objects in array' do + a = [{ 'a' => 1, 'b' => 2, 'c' => 3, 'd' => 4, 'e' => 5 }, { 'x' => 5, 'y' => 6, 'z' => 3 }, 3] + b = [{ 'a' => 1, 'b' => 2, 'c' => 3, 'e' => 5 }, 3] + + diff = described_class.diff(a, b) + diff.should == [['-', '[0].d', 4], ['-', '[1]', { 'x' => 5, 'y' => 6, 'z' => 3 }]] + end + + it 'uses custom delimiter when provided' do + a = [{ 'a' => 1, 'b' => 2, 'c' => 3, 'd' => 4, 'e' => 5 }, { 'x' => 5, 'y' => 6, 'z' => 3 }, 3] + b = [{ 'a' => 1, 'b' => 2, 'c' => 3, 'e' => 5 }, 3] + + diff = described_class.diff(a, b, similarity: 0.8, delimiter: "\t") + diff.should == [['-', "[0]\td", 4], ['-', '[1]', { 'x' => 5, 'y' => 6, 'z' => 3 }]] + end + + context 'when :numeric_tolerance requested' do + it 'is able to diff changes in hash value' do + a = { 'a' => 0.558, 'b' => 0.0, 'c' => 0.65, 'd' => 'fin' } + b = { 'a' => 0.557, 'b' => 'hats', 'c' => 0.67, 'd' => 'fin' } + + diff = described_class.diff(a, b, numeric_tolerance: 0.01) + expect(diff).to eq([['~', 'b', 0.0, 'hats'], ['~', 'c', 0.65, 0.67]]) + + diff = described_class.diff(b, a, numeric_tolerance: 0.01) + diff.should == [['~', 'b', 'hats', 0.0], ['~', 'c', 0.67, 0.65]] + end + + it 'is able to diff changes in nested values' do + a = { 'a' => { 'x' => 0.4, 'y' => 0.338 }, 'b' => [13, 68.03] } + b = { 'a' => { 'x' => 0.6, 'y' => 0.341 }, 'b' => [14, 68.025] } + + diff = described_class.diff(a, b, numeric_tolerance: 0.01) + expect(diff).to eq([['~', 'a.x', 0.4, 0.6], ['-', 'b[0]', 13], ['+', 'b[0]', 14]]) + + diff = described_class.diff(b, a, numeric_tolerance: 0.01) + diff.should == [['~', 'a.x', 0.6, 0.4], ['-', 'b[0]', 14], ['+', 'b[0]', 13]] + end + end + + context 'when :strip requested' do + it 'strips strings before comparing' do + a = { 'a' => ' foo', 'b' => 'fizz buzz' } + b = { 'a' => 'foo', 'b' => 'fizzbuzz' } + diff = described_class.diff(a, b, strip: true) + diff.should == [['~', 'b', 'fizz buzz', 'fizzbuzz']] + end + + it 'strips nested strings before comparing' do + a = { 'a' => { 'x' => ' foo' }, 'b' => ['fizz buzz', 'nerf'] } + b = { 'a' => { 'x' => 'foo' }, 'b' => %w[fizzbuzz nerf] } + diff = described_class.diff(a, b, strip: true) + diff.should == [['-', 'b[0]', 'fizz buzz'], ['+', 'b[0]', 'fizzbuzz']] + end + end + + context 'when :case_insensitive requested' do + it 'strips strings before comparing' do + a = { 'a' => 'Foo', 'b' => 'fizz buzz' } + b = { 'a' => 'foo', 'b' => 'fizzBuzz' } + diff = described_class.diff(a, b, case_insensitive: true) + diff.should == [['~', 'b', 'fizz buzz', 'fizzBuzz']] + end + + it 'ignores case on nested strings before comparing' do + a = { 'a' => { 'x' => 'Foo' }, 'b' => ['fizz buzz', 'nerf'] } + b = { 'a' => { 'x' => 'foo' }, 'b' => %w[fizzbuzz nerf] } + diff = described_class.diff(a, b, case_insensitive: true) + diff.should == [['-', 'b[0]', 'fizz buzz'], ['+', 'b[0]', 'fizzbuzz']] + end + end + + context 'when both :strip and :numeric_tolerance requested' do + it 'applies filters to proper object types' do + a = { 'a' => ' foo', 'b' => 35, 'c' => 'bar', 'd' => 'baz' } + b = { 'a' => 'foo', 'b' => 35.005, 'c' => 'bar', 'd' => 18.5 } + diff = described_class.diff(a, b, strict: false, numeric_tolerance: 0.01, strip: true) + diff.should == [['~', 'd', 'baz', 18.5]] + end + end + + context 'when both :strip and :case_insensitive requested' do + it 'applies both filters to strings' do + a = { 'a' => ' Foo', 'b' => 'fizz buzz' } + b = { 'a' => 'foo', 'b' => 'fizzBuzz' } + diff = described_class.diff(a, b, case_insensitive: true, strip: true) + diff.should == [['~', 'b', 'fizz buzz', 'fizzBuzz']] + end + end + + context 'with custom comparison' do + let(:a) { { 'a' => 'car', 'b' => 'boat', 'c' => 'plane' } } + let(:b) { { 'a' => 'bus', 'b' => 'truck', 'c' => ' plan' } } + + it 'compares using proc specified in block' do + diff = described_class.diff(a, b) do |prefix, obj1, obj2| + case prefix + when /a|b|c/ + obj1.length == obj2.length + end + end + diff.should == [['~', 'b', 'boat', 'truck']] + end + + it 'yields added keys' do + x = { 'a' => 'car', 'b' => 'boat' } + y = { 'a' => 'car' } + + diff = described_class.diff(x, y) do |prefix, _obj1, _obj2| + case prefix + when /b/ + true + end + end + diff.should == [] + end + + it 'compares with both proc and :strip when both provided' do + diff = described_class.diff(a, b, strip: true) do |prefix, obj1, obj2| + case prefix + when 'a' + obj1.length == obj2.length + end + end + diff.should == [['~', 'b', 'boat', 'truck'], ['~', 'c', 'plane', ' plan']] + end + + it 'compares nested arrays using proc specified in block' do + a = { a: 'car', b: %w[boat plane] } + b = { a: 'bus', b: ['truck', ' plan'] } + + diff = described_class.diff(a, b) do |path, obj1, obj2| + case path + when 'b[*]' + obj1.length == obj2.length + end + end + + expect(diff).to eq [['~', 'a', 'car', 'bus'], ['~', 'b[1]', 'plane', ' plan'], ['-', 'b[0]', 'boat'], ['+', 'b[0]', 'truck']] + end + end + + context 'when :array_path is true' do + it 'returns the diff path in an array rather than a string' do + x = { 'a' => 'foo' } + y = { 'a' => 'bar' } + diff = described_class.diff(x, y, array_path: true) + + diff.should == [['~', ['a'], 'foo', 'bar']] + end + + it 'shows array indexes in paths' do + x = { 'a' => [0, 1, 2] } + y = { 'a' => [0, 1, 2, 3] } + + diff = described_class.diff(x, y, array_path: true) + + diff.should == [['+', ['a', 3], 3]] + end + + it 'shows differences with string and symbol keys' do + x = { 'a' => 'foo' } + y = { a: 'bar' } + + diff = described_class.diff(x, y, array_path: true) + diff.should == [['-', ['a'], 'foo'], ['+', [:a], 'bar']] + end + + it 'supports other key types' do + time = Time.now + x = { time => 'foo' } + y = { 0 => 'bar' } + + diff = described_class.diff(x, y, array_path: true) + diff.should == [['-', [time], 'foo'], ['+', [0], 'bar']] + end + end + + context 'when :use_lcs is false' do + it 'shows items in an array as changed' do + x = %i[a b] + y = %i[c d] + diff = described_class.diff(x, y, use_lcs: false) + + diff.should == [['~', '[0]', :a, :c], ['~', '[1]', :b, :d]] + end + + it 'shows additions to arrays' do + x = { a: [0] } + y = { a: [0, 1] } + diff = described_class.diff(x, y, use_lcs: false) + + diff.should == [['+', 'a[1]', 1]] + end + + it 'shows changes to nested arrays' do + x = { a: [[0, 1]] } + y = { a: [[1, 2]] } + diff = described_class.diff(x, y, use_lcs: false) + + diff.should == [['~', 'a[0][0]', 0, 1], ['~', 'a[0][1]', 1, 2]] + end + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/hashdiff-1.0.1/spec/hashdiff/lcs_spec.rb b/vendor/bundle/ruby/3.1.0/gems/hashdiff-1.0.1/spec/hashdiff/lcs_spec.rb new file mode 100644 index 000000000..d286b161a --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/hashdiff-1.0.1/spec/hashdiff/lcs_spec.rb @@ -0,0 +1,76 @@ +# frozen_string_literal: true + +require 'spec_helper' + +describe Hashdiff do + it 'is able to find LCS between two equal array' do + a = [1, 2, 3] + b = [1, 2, 3] + + lcs = described_class.lcs(a, b) + lcs.should == [[0, 0], [1, 1], [2, 2]] + end + + it 'is able to find LCS between two close arrays' do + a = [1.05, 2, 3.25] + b = [1.06, 2, 3.24] + + lcs = described_class.lcs(a, b, numeric_tolerance: 0.1) + lcs.should == [[0, 0], [1, 1], [2, 2]] + end + + it 'strips strings when finding LCS if requested' do + a = %w[foo bar baz] + b = [' foo', 'bar', 'zab'] + + lcs = described_class.lcs(a, b, strip: true) + lcs.should == [[0, 0], [1, 1]] + end + + it 'is able to find LCS with one common elements' do + a = [1, 2, 3] + b = [1, 8, 7] + + lcs = described_class.lcs(a, b) + lcs.should == [[0, 0]] + end + + it 'is able to find LCS with two common elements' do + a = [1, 3, 5, 7] + b = [2, 3, 7, 5] + + lcs = described_class.lcs(a, b) + lcs.should == [[1, 1], [2, 3]] + end + + it 'is able to find LCS with two close elements' do + a = [1, 3.05, 5, 7] + b = [2, 3.06, 7, 5] + + lcs = described_class.lcs(a, b, numeric_tolerance: 0.1) + lcs.should == [[1, 1], [2, 3]] + end + + it 'is able to find LCS with two common elements in different ordering' do + a = [1, 3, 4, 7] + b = [2, 3, 7, 5] + + lcs = described_class.lcs(a, b) + lcs.should == [[1, 1], [3, 2]] + end + + it 'is able to find LCS with a similarity value' do + a = [ + { 'value' => 'New', 'onclick' => 'CreateNewDoc()' }, + { 'value' => 'Close', 'onclick' => 'CloseDoc()' } + ] + b = [ + { 'value' => 'New1', 'onclick' => 'CreateNewDoc()' }, + { 'value' => 'Open', 'onclick' => 'OpenDoc()' }, + { 'value' => 'Close', 'onclick' => 'CloseDoc()' } + ] + + lcs = described_class.lcs(a, b, similarity: 0.5) + lcs.should == [[0, 0], [1, 2]] + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/hashdiff-1.0.1/spec/hashdiff/linear_compare_array_spec.rb b/vendor/bundle/ruby/3.1.0/gems/hashdiff-1.0.1/spec/hashdiff/linear_compare_array_spec.rb new file mode 100644 index 000000000..b9490ad4b --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/hashdiff-1.0.1/spec/hashdiff/linear_compare_array_spec.rb @@ -0,0 +1,50 @@ +# frozen_string_literal: true + +require 'spec_helper' + +describe Hashdiff::LinearCompareArray do + it 'finds no differences between two empty arrays' do + difference = described_class.call([], []) + difference.should == [] + end + + it 'finds added items when the old array is empty' do + difference = described_class.call([], %i[a b]) + difference.should == [['+', '[0]', :a], ['+', '[1]', :b]] + end + + it 'finds removed items when the new array is empty' do + difference = described_class.call(%i[a b], []) + difference.should == [['-', '[1]', :b], ['-', '[0]', :a]] + end + + it 'finds no differences between identical arrays' do + difference = described_class.call(%i[a b], %i[a b]) + difference.should == [] + end + + it 'finds added items in an array' do + difference = described_class.call(%i[a d], %i[a b c d]) + difference.should == [['+', '[1]', :b], ['+', '[2]', :c]] + end + + it 'finds removed items in an array' do + difference = described_class.call(%i[a b c d e f], %i[a d f]) + difference.should == [['-', '[4]', :e], ['-', '[2]', :c], ['-', '[1]', :b]] + end + + it 'shows additions and deletions as changed items' do + difference = described_class.call(%i[a b c], %i[c b a]) + difference.should == [['~', '[0]', :a, :c], ['~', '[2]', :c, :a]] + end + + it 'shows changed items in a hash' do + difference = described_class.call([{ a: :b }], [{ a: :c }]) + difference.should == [['~', '[0].a', :b, :c]] + end + + it 'shows changed items and added items' do + difference = described_class.call([{ a: 1, b: 2 }], [{ a: 2, b: 2 }, :item]) + difference.should == [['~', '[0].a', 1, 2], ['+', '[1]', :item]] + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/hashdiff-1.0.1/spec/hashdiff/patch_spec.rb b/vendor/bundle/ruby/3.1.0/gems/hashdiff-1.0.1/spec/hashdiff/patch_spec.rb new file mode 100644 index 000000000..515de1d71 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/hashdiff-1.0.1/spec/hashdiff/patch_spec.rb @@ -0,0 +1,185 @@ +# frozen_string_literal: true + +require 'spec_helper' + +describe Hashdiff do + it 'is able to patch key addition' do + a = { 'a' => 3, 'c' => 11, 'd' => 45, 'e' => 100, 'f' => 200 } + b = { 'a' => 3, 'c' => 11, 'd' => 45, 'e' => 100, 'f' => 200, 'g' => 300 } + diff = described_class.diff(a, b) + + expect(described_class.patch!(a, diff)).to eq(b) + + a = { 'a' => 3, 'c' => 11, 'd' => 45, 'e' => 100, 'f' => 200 } + b = { 'a' => 3, 'c' => 11, 'd' => 45, 'e' => 100, 'f' => 200, 'g' => 300 } + described_class.unpatch!(b, diff).should == a + end + + it 'is able to patch value type changes' do + a = { 'a' => 3 } + b = { 'a' => { 'a1' => 1, 'a2' => 2 } } + diff = described_class.diff(a, b) + + expect(described_class.patch!(a, diff)).to eq(b) + + a = { 'a' => 3 } + b = { 'a' => { 'a1' => 1, 'a2' => 2 } } + described_class.unpatch!(b, diff).should == a + end + + it 'is able to patch value array <=> []' do + a = { 'a' => 1, 'b' => [1, 2] } + b = { 'a' => 1, 'b' => [] } + diff = described_class.diff(a, b) + + expect(described_class.patch!(a, diff)).to eq(b) + + a = { 'a' => 1, 'b' => [1, 2] } + b = { 'a' => 1, 'b' => [] } + described_class.unpatch!(b, diff).should == a + end + + it 'is able to patch value array <=> nil' do + a = { 'a' => 1, 'b' => [1, 2] } + b = { 'a' => 1, 'b' => nil } + diff = described_class.diff(a, b) + + expect(described_class.patch!(a, diff)).to eq(b) + + a = { 'a' => 1, 'b' => [1, 2] } + b = { 'a' => 1, 'b' => nil } + described_class.unpatch!(b, diff).should == a + end + + it 'is able to patch array value removal' do + a = { 'a' => 1, 'b' => [1, 2] } + b = { 'a' => 1 } + diff = described_class.diff(a, b) + + expect(described_class.patch!(a, diff)).to eq(b) + + a = { 'a' => 1, 'b' => [1, 2] } + b = { 'a' => 1 } + described_class.unpatch!(b, diff).should == a + end + + it 'is able to patch array under hash key with non-word characters' do + a = { 'a' => 1, 'b-b' => [1, 2] } + b = { 'a' => 1, 'b-b' => [2, 1] } + diff = described_class.diff(a, b) + + expect(described_class.patch!(a, diff)).to eq(b) + + a = { 'a' => 1, 'b-b' => [1, 2] } + b = { 'a' => 1, 'b-b' => [2, 1] } + described_class.unpatch!(b, diff).should == a + end + + it 'is able to patch hash value removal' do + a = { 'a' => 1, 'b' => { 'b1' => 1, 'b2' => 2 } } + b = { 'a' => 1 } + diff = described_class.diff(a, b) + + expect(described_class.patch!(a, diff)).to eq(b) + + a = { 'a' => 1, 'b' => { 'b1' => 1, 'b2' => 2 } } + b = { 'a' => 1 } + described_class.unpatch!(b, diff).should == a + end + + it 'is able to patch value hash <=> {}' do + a = { 'a' => 1, 'b' => { 'b1' => 1, 'b2' => 2 } } + b = { 'a' => 1, 'b' => {} } + diff = described_class.diff(a, b) + + expect(described_class.patch!(a, diff)).to eq(b) + + a = { 'a' => 1, 'b' => { 'b1' => 1, 'b2' => 2 } } + b = { 'a' => 1, 'b' => {} } + described_class.unpatch!(b, diff).should == a + end + + it 'is able to patch value hash <=> nil' do + a = { 'a' => 1, 'b' => { 'b1' => 1, 'b2' => 2 } } + b = { 'a' => 1, 'b' => nil } + diff = described_class.diff(a, b) + + expect(described_class.patch!(a, diff)).to eq(b) + + a = { 'a' => 1, 'b' => { 'b1' => 1, 'b2' => 2 } } + b = { 'a' => 1, 'b' => nil } + described_class.unpatch!(b, diff).should == a + end + + it 'is able to patch value nil removal' do + a = { 'a' => 1, 'b' => nil } + b = { 'a' => 1 } + diff = described_class.diff(a, b) + + expect(described_class.patch!(a, diff)).to eq(b) + + a = { 'a' => 1, 'b' => nil } + b = { 'a' => 1 } + described_class.unpatch!(b, diff).should == a + end + + it 'is able to patch similar objects between arrays' do + a = [{ 'a' => 1, 'b' => 2, 'c' => 3, 'd' => 4, 'e' => 5 }, 3] + b = [1, { 'a' => 1, 'b' => 2, 'c' => 3, 'e' => 5 }] + + diff = described_class.diff(a, b) + expect(described_class.patch!(a, diff)).to eq(b) + + a = [{ 'a' => 1, 'b' => 2, 'c' => 3, 'd' => 4, 'e' => 5 }, 3] + b = [1, { 'a' => 1, 'b' => 2, 'c' => 3, 'e' => 5 }] + described_class.unpatch!(b, diff).should == a + end + + it 'is able to patch similar & equal objects between arrays' do + a = [{ 'a' => 1, 'b' => 2, 'c' => 3, 'd' => 4, 'e' => 5 }, { 'x' => 5, 'y' => 6, 'z' => 3 }, 1] + b = [1, { 'a' => 1, 'b' => 2, 'c' => 3, 'e' => 5 }] + + diff = described_class.diff(a, b) + expect(described_class.patch!(a, diff)).to eq(b) + + a = [{ 'a' => 1, 'b' => 2, 'c' => 3, 'd' => 4, 'e' => 5 }, { 'x' => 5, 'y' => 6, 'z' => 3 }, 1] + b = [1, { 'a' => 1, 'b' => 2, 'c' => 3, 'e' => 5 }] + described_class.unpatch!(b, diff).should == a + end + + it 'is able to patch hash value removal with custom delimiter' do + a = { 'a' => 1, 'b' => { 'b1' => 1, 'b2' => 2 } } + b = { 'a' => 1, 'b' => { 'b1' => 3 } } + diff = described_class.diff(a, b, delimiter: "\n") + + expect(described_class.patch!(a, diff, delimiter: "\n")).to eq(b) + + a = { 'a' => 1, 'b' => { 'b1' => 1, 'b2' => 2 } } + b = { 'a' => 1, 'b' => { 'b1' => 3 } } + described_class.unpatch!(b, diff, delimiter: "\n").should == a + end + + it 'is able to patch when the diff is generated with an array_path' do + a = { 'a' => 1, 'b' => 1 } + b = { 'a' => 1, 'b' => 2 } + diff = described_class.diff(a, b, array_path: true) + + expect(described_class.patch!(a, diff)).to eq(b) + + a = { 'a' => 1, 'b' => 1 } + b = { 'a' => 1, 'b' => 2 } + described_class.unpatch!(b, diff).should == a + end + + it 'is able to use non string keys when diff is generated with an array_path' do + a = { 'a' => 1, :a => 2, 0 => 3 } + b = { 'a' => 5, :a => 6, 0 => 7 } + diff = described_class.diff(a, b, array_path: true) + + expect(described_class.patch!(a, diff)).to eq(b) + + a = { 'a' => 1, :a => 2, 0 => 3 } + b = { 'a' => 5, :a => 6, 0 => 7 } + described_class.unpatch!(b, diff).should == a + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/hashdiff-1.0.1/spec/hashdiff/readme_spec.rb b/vendor/bundle/ruby/3.1.0/gems/hashdiff-1.0.1/spec/hashdiff/readme_spec.rb new file mode 100644 index 000000000..ee9314bdf --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/hashdiff-1.0.1/spec/hashdiff/readme_spec.rb @@ -0,0 +1,15 @@ +# frozen_string_literal: true + +require 'spec_helper' + +describe 'README.md' do + it 'has correct examples' do + File.read('README.md').scan(/```ruby(.*?)```/m).flatten(1).each do |block| + begin + eval block # rubocop:disable Security/Eval + rescue Exception => e # rubocop:disable Lint/RescueException + raise "README.md code block:\n#{block}\n\nhas error:\n#{e}" + end + end + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/hashdiff-1.0.1/spec/hashdiff/util_spec.rb b/vendor/bundle/ruby/3.1.0/gems/hashdiff-1.0.1/spec/hashdiff/util_spec.rb new file mode 100644 index 000000000..b9db7350a --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/hashdiff-1.0.1/spec/hashdiff/util_spec.rb @@ -0,0 +1,116 @@ +# frozen_string_literal: true + +require 'spec_helper' + +describe Hashdiff do + it 'is able to decode property path' do + decoded = described_class.send(:decode_property_path, 'a.b[0].c.city[5]') + decoded.should == ['a', 'b', 0, 'c', 'city', 5] + end + + it 'is able to decode property path with custom delimiter' do + decoded = described_class.send(:decode_property_path, "a\tb[0]\tc\tcity[5]", "\t") + decoded.should == ['a', 'b', 0, 'c', 'city', 5] + end + + it 'is able to tell similiar hash' do + a = { 'a' => 1, 'b' => 2, 'c' => 3, 'd' => 4, 'e' => 5 } + b = { 'a' => 1, 'b' => 2, 'c' => 3, 'e' => 5 } + described_class.similar?(a, b).should be true + described_class.similar?(a, b, similarity: 1).should be false + end + + it 'is able to tell similiar empty hash' do + described_class.similar?({}, {}, similarity: 1).should be true + end + + it 'is able to tell similiar empty array' do + described_class.similar?([], [], similarity: 1).should be true + end + + it 'is able to tell similiar hash with values within tolerance' do + a = { 'a' => 1.5, 'b' => 2.25, 'c' => 3, 'd' => 4, 'e' => 5 } + b = { 'a' => 1.503, 'b' => 2.22, 'c' => 3, 'e' => 5 } + described_class.similar?(a, b, numeric_tolerance: 0.05).should be true + described_class.similar?(a, b).should be false + end + + it 'is able to tell numbers and strings' do + described_class.similar?(1, 2).should be false + described_class.similar?('a', 'b').should be false + described_class.similar?('a', [1, 2, 3]).should be false + described_class.similar?(1, 'a' => 1, 'b' => 2, 'c' => 3, 'e' => 5).should be false + end + + it 'is able to tell true when similarity == 0.5' do + a = { 'value' => 'New1', 'onclick' => 'CreateNewDoc()' } + b = { 'value' => 'New', 'onclick' => 'CreateNewDoc()' } + + described_class.similar?(a, b, similarity: 0.5).should be true + end + + it 'is able to tell false when similarity == 0.5' do + a = { 'value' => 'New1', 'onclick' => 'open()' } + b = { 'value' => 'New', 'onclick' => 'CreateNewDoc()' } + + described_class.similar?(a, b, similarity: 0.5).should be false + end + + describe '.compare_values' do + it 'compares numeric values exactly when no tolerance' do + expect(described_class.compare_values(10.004, 10.003)).to be false + end + + it 'allows tolerance with numeric values' do + expect(described_class.compare_values(10.004, 10.003, numeric_tolerance: 0.01)).to be true + end + + it 'compares different objects without tolerance' do + expect(described_class.compare_values('hats', 'ninjas')).to be false + end + + it 'compares other objects with tolerance' do + expect(described_class.compare_values('hats', 'ninjas', numeric_tolerance: 0.01)).to be false + end + + it 'compares same objects without tolerance' do + expect(described_class.compare_values('horse', 'horse')).to be true + end + + it 'compares strings for spaces exactly by default' do + expect(described_class.compare_values(' horse', 'horse')).to be false + end + + it 'compares strings for capitalization exactly by default' do + expect(described_class.compare_values('horse', 'Horse')).to be false + end + + it 'strips strings before comparing when requested' do + expect(described_class.compare_values(' horse', 'horse', strip: true)).to be true + end + + it 'ignores string case when requested' do + expect(described_class.compare_values('horse', 'Horse', case_insensitive: true)).to be true + end + end + + describe '.comparable?' do + it 'identifies hashes as comparable' do + expect(described_class.comparable?({}, {})).to be true + end + + it 'identifies a subclass of Hash to be comparable with a Hash' do + other = Class.new(Hash) + expect(described_class.comparable?(other.new, {})).to be true + end + + it 'identifies a Hash to be comparable with a subclass of Hash' do + other = Class.new(Hash) + expect(described_class.comparable?({}, other.new)).to be true + end + + it 'does not identify a Numeric as comparable with a Hash' do + expect(described_class.comparable?(1, {})).to be false + end + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/hashdiff-1.0.1/spec/spec_helper.rb b/vendor/bundle/ruby/3.1.0/gems/hashdiff-1.0.1/spec/spec_helper.rb new file mode 100644 index 000000000..91828cc61 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/hashdiff-1.0.1/spec/spec_helper.rb @@ -0,0 +1,15 @@ +# frozen_string_literal: true + +$LOAD_PATH << File.join(File.dirname(__FILE__), '..', 'lib') + +require 'rubygems' +require 'rspec' +require 'rspec/autorun' + +require 'hashdiff' + +RSpec.configure do |config| + config.mock_framework = :rspec + + config.include RSpec::Matchers +end diff --git a/vendor/bundle/ruby/3.1.0/gems/parallel-1.22.1/MIT-LICENSE.txt b/vendor/bundle/ruby/3.1.0/gems/parallel-1.22.1/MIT-LICENSE.txt new file mode 100644 index 000000000..a8889b2a7 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/parallel-1.22.1/MIT-LICENSE.txt @@ -0,0 +1,20 @@ +Copyright (C) 2013 Michael Grosser + +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/vendor/bundle/ruby/3.1.0/gems/parallel-1.22.1/lib/parallel.rb b/vendor/bundle/ruby/3.1.0/gems/parallel-1.22.1/lib/parallel.rb new file mode 100644 index 000000000..c7f2bf683 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/parallel-1.22.1/lib/parallel.rb @@ -0,0 +1,612 @@ +# frozen_string_literal: true +require 'rbconfig' +require 'parallel/version' +require 'parallel/processor_count' + +module Parallel + extend ProcessorCount + + Stop = Object.new.freeze + + class DeadWorker < StandardError + end + + class Break < StandardError + attr_reader :value + + def initialize(value = nil) + super() + @value = value + end + end + + class Kill < Break + end + + class UndumpableException < StandardError + attr_reader :backtrace + + def initialize(original) + super "#{original.class}: #{original.message}" + @backtrace = original.backtrace + end + end + + class ExceptionWrapper + attr_reader :exception + + def initialize(exception) + # Remove the bindings stack added by the better_errors gem, + # because it cannot be marshalled + if exception.instance_variable_defined? :@__better_errors_bindings_stack + exception.send :remove_instance_variable, :@__better_errors_bindings_stack + end + + @exception = + begin + Marshal.dump(exception) && exception + rescue StandardError + UndumpableException.new(exception) + end + end + end + + class Worker + attr_reader :pid, :read, :write + attr_accessor :thread + + def initialize(read, write, pid) + @read = read + @write = write + @pid = pid + end + + def stop + close_pipes + wait # if it goes zombie, rather wait here to be able to debug + end + + # might be passed to started_processes and simultaneously closed by another thread + # when running in isolation mode, so we have to check if it is closed before closing + def close_pipes + read.close unless read.closed? + write.close unless write.closed? + end + + def work(data) + begin + Marshal.dump(data, write) + rescue Errno::EPIPE + raise DeadWorker + end + + result = begin + Marshal.load(read) + rescue EOFError + raise DeadWorker + end + raise result.exception if result.is_a?(ExceptionWrapper) + result + end + + private + + def wait + Process.wait(pid) + rescue Interrupt + # process died + end + end + + class JobFactory + def initialize(source, mutex) + @lambda = (source.respond_to?(:call) && source) || queue_wrapper(source) + @source = source.to_a unless @lambda # turn Range and other Enumerable-s into an Array + @mutex = mutex + @index = -1 + @stopped = false + end + + def next + if producer? + # - index and item stay in sync + # - do not call lambda after it has returned Stop + item, index = @mutex.synchronize do + return if @stopped + item = @lambda.call + @stopped = (item == Stop) + return if @stopped + [item, @index += 1] + end + else + index = @mutex.synchronize { @index += 1 } + return if index >= size + item = @source[index] + end + [item, index] + end + + def size + if producer? + Float::INFINITY + else + @source.size + end + end + + # generate item that is sent to workers + # just index is faster + less likely to blow up with unserializable errors + def pack(item, index) + producer? ? [item, index] : index + end + + # unpack item that is sent to workers + def unpack(data) + producer? ? data : [@source[data], data] + end + + private + + def producer? + @lambda + end + + def queue_wrapper(array) + array.respond_to?(:num_waiting) && array.respond_to?(:pop) && -> { array.pop(false) } + end + end + + class UserInterruptHandler + INTERRUPT_SIGNAL = :SIGINT + + class << self + # kill all these pids or threads if user presses Ctrl+c + def kill_on_ctrl_c(pids, options) + @to_be_killed ||= [] + old_interrupt = nil + signal = options.fetch(:interrupt_signal, INTERRUPT_SIGNAL) + + if @to_be_killed.empty? + old_interrupt = trap_interrupt(signal) do + warn 'Parallel execution interrupted, exiting ...' + @to_be_killed.flatten.each { |pid| kill(pid) } + end + end + + @to_be_killed << pids + + yield + ensure + @to_be_killed.pop # do not kill pids that could be used for new processes + restore_interrupt(old_interrupt, signal) if @to_be_killed.empty? + end + + def kill(thing) + Process.kill(:KILL, thing) + rescue Errno::ESRCH + # some linux systems already automatically killed the children at this point + # so we just ignore them not being there + end + + private + + def trap_interrupt(signal) + old = Signal.trap signal, 'IGNORE' + + Signal.trap signal do + yield + if !old || old == "DEFAULT" + raise Interrupt + else + old.call + end + end + + old + end + + def restore_interrupt(old, signal) + Signal.trap signal, old + end + end + end + + class << self + def in_threads(options = { count: 2 }) + threads = [] + count, = extract_count_from_options(options) + + Thread.handle_interrupt(Exception => :never) do + Thread.handle_interrupt(Exception => :immediate) do + count.times do |i| + threads << Thread.new { yield(i) } + end + threads.map(&:value) + end + ensure + threads.each(&:kill) + end + end + + def in_processes(options = {}, &block) + count, options = extract_count_from_options(options) + count ||= processor_count + map(0...count, options.merge(in_processes: count), &block) + end + + def each(array, options = {}, &block) + map(array, options.merge(preserve_results: false), &block) + end + + def any?(*args, &block) + raise "You must provide a block when calling #any?" if block.nil? + !each(*args) { |*a| raise Kill if block.call(*a) } + end + + def all?(*args, &block) + raise "You must provide a block when calling #all?" if block.nil? + !!each(*args) { |*a| raise Kill unless block.call(*a) } + end + + def each_with_index(array, options = {}, &block) + each(array, options.merge(with_index: true), &block) + end + + def map(source, options = {}, &block) + options = options.dup + options[:mutex] = Mutex.new + + if options[:in_processes] && options[:in_threads] + raise ArgumentError, "Please specify only one of `in_processes` or `in_threads`." + elsif RUBY_PLATFORM =~ (/java/) && !(options[:in_processes]) + method = :in_threads + size = options[method] || processor_count + elsif options[:in_threads] + method = :in_threads + size = options[method] + elsif options[:in_ractors] + method = :in_ractors + size = options[method] + else + method = :in_processes + if Process.respond_to?(:fork) + size = options[method] || processor_count + else + warn "Process.fork is not supported by this Ruby" + size = 0 + end + end + + job_factory = JobFactory.new(source, options[:mutex]) + size = [job_factory.size, size].min + + options[:return_results] = (options[:preserve_results] != false || !!options[:finish]) + add_progress_bar!(job_factory, options) + + result = + if size == 0 + work_direct(job_factory, options, &block) + elsif method == :in_threads + work_in_threads(job_factory, options.merge(count: size), &block) + elsif method == :in_ractors + work_in_ractors(job_factory, options.merge(count: size), &block) + else + work_in_processes(job_factory, options.merge(count: size), &block) + end + + return result.value if result.is_a?(Break) + raise result if result.is_a?(Exception) + options[:return_results] ? result : source + end + + def map_with_index(array, options = {}, &block) + map(array, options.merge(with_index: true), &block) + end + + def flat_map(*args, &block) + map(*args, &block).flatten(1) + end + + def worker_number + Thread.current[:parallel_worker_number] + end + + # TODO: this does not work when doing threads in forks, so should remove and yield the number instead if needed + def worker_number=(worker_num) + Thread.current[:parallel_worker_number] = worker_num + end + + private + + def add_progress_bar!(job_factory, options) + if progress_options = options[:progress] + raise "Progressbar can only be used with array like items" if job_factory.size == Float::INFINITY + require 'ruby-progressbar' + + if progress_options == true + progress_options = { title: "Progress" } + elsif progress_options.respond_to? :to_str + progress_options = { title: progress_options.to_str } + end + + progress_options = { + total: job_factory.size, + format: '%t |%E | %B | %a' + }.merge(progress_options) + + progress = ProgressBar.create(progress_options) + old_finish = options[:finish] + options[:finish] = lambda do |item, i, result| + old_finish.call(item, i, result) if old_finish + progress.increment + end + end + end + + def work_direct(job_factory, options, &block) + self.worker_number = 0 + results = [] + exception = nil + begin + while set = job_factory.next + item, index = set + results << with_instrumentation(item, index, options) do + call_with_index(item, index, options, &block) + end + end + rescue StandardError + exception = $! + end + exception || results + ensure + self.worker_number = nil + end + + def work_in_threads(job_factory, options, &block) + raise "interrupt_signal is no longer supported for threads" if options[:interrupt_signal] + results = [] + results_mutex = Mutex.new # arrays are not thread-safe on jRuby + exception = nil + + in_threads(options) do |worker_num| + self.worker_number = worker_num + # as long as there are more jobs, work on one of them + while !exception && set = job_factory.next + begin + item, index = set + result = with_instrumentation item, index, options do + call_with_index(item, index, options, &block) + end + results_mutex.synchronize { results[index] = result } + rescue StandardError + exception = $! + end + end + end + + exception || results + end + + def work_in_ractors(job_factory, options) + exception = nil + results = [] + results_mutex = Mutex.new # arrays are not thread-safe on jRuby + + callback = options[:ractor] + if block_given? || !callback + raise ArgumentError, "pass the code you want to execute as `ractor: [ClassName, :method_name]`" + end + + # build + ractors = Array.new(options.fetch(:count)) do + Ractor.new do + loop do + got = receive + (klass, method_name), item, index = got + break if index == :break + begin + Ractor.yield [nil, klass.send(method_name, item), item, index] + rescue StandardError => e + Ractor.yield [e, nil, item, index] + end + end + end + end + + # start + ractors.dup.each do |ractor| + if set = job_factory.next + item, index = set + instrument_start item, index, options + ractor.send [callback, item, index] + else + ractor.send([[nil, nil], nil, :break]) # stop the ractor + ractors.delete ractor + end + end + + # replace with new items + while set = job_factory.next + item_next, index_next = set + done, (exception, result, item, index) = Ractor.select(*ractors) + if exception + ractors.delete done + break + end + instrument_finish item, index, result, options + results_mutex.synchronize { results[index] = (options[:preserve_results] == false ? nil : result) } + + instrument_start item_next, index_next, options + done.send([callback, item_next, index_next]) + end + + # finish + ractors.each do |ractor| + (new_exception, result, item, index) = ractor.take + exception ||= new_exception + next if new_exception + instrument_finish item, index, result, options + results_mutex.synchronize { results[index] = (options[:preserve_results] == false ? nil : result) } + ractor.send([[nil, nil], nil, :break]) # stop the ractor + end + + exception || results + end + + def work_in_processes(job_factory, options, &blk) + workers = create_workers(job_factory, options, &blk) + results = [] + results_mutex = Mutex.new # arrays are not thread-safe + exception = nil + + UserInterruptHandler.kill_on_ctrl_c(workers.map(&:pid), options) do + in_threads(options) do |i| + worker = workers[i] + worker.thread = Thread.current + worked = false + + begin + loop do + break if exception + item, index = job_factory.next + break unless index + + if options[:isolation] + worker = replace_worker(job_factory, workers, i, options, blk) if worked + worked = true + worker.thread = Thread.current + end + + begin + result = with_instrumentation item, index, options do + worker.work(job_factory.pack(item, index)) + end + results_mutex.synchronize { results[index] = result } # arrays are not threads safe on jRuby + rescue StandardError => e + exception = e + if exception.is_a?(Kill) + (workers - [worker]).each do |w| + w.thread&.kill + UserInterruptHandler.kill(w.pid) + end + end + end + end + ensure + worker.stop + end + end + end + + exception || results + end + + def replace_worker(job_factory, workers, index, options, blk) + options[:mutex].synchronize do + # old worker is no longer used ... stop it + worker = workers[index] + worker.stop + + # create a new replacement worker + running = workers - [worker] + workers[index] = worker(job_factory, options.merge(started_workers: running, worker_number: index), &blk) + end + end + + def create_workers(job_factory, options, &block) + workers = [] + Array.new(options[:count]).each_with_index do |_, i| + workers << worker(job_factory, options.merge(started_workers: workers, worker_number: i), &block) + end + workers + end + + def worker(job_factory, options, &block) + child_read, parent_write = IO.pipe + parent_read, child_write = IO.pipe + + pid = Process.fork do + self.worker_number = options[:worker_number] + + begin + options.delete(:started_workers).each(&:close_pipes) + + parent_write.close + parent_read.close + + process_incoming_jobs(child_read, child_write, job_factory, options, &block) + ensure + child_read.close + child_write.close + end + end + + child_read.close + child_write.close + + Worker.new(parent_read, parent_write, pid) + end + + def process_incoming_jobs(read, write, job_factory, options, &block) + until read.eof? + data = Marshal.load(read) + item, index = job_factory.unpack(data) + + result = + begin + call_with_index(item, index, options, &block) + # https://github.com/rspec/rspec-support/blob/673133cdd13b17077b3d88ece8d7380821f8d7dc/lib/rspec/support.rb#L132-L140 + rescue NoMemoryError, SignalException, Interrupt, SystemExit # rubocop:disable Lint/ShadowedException + raise $! + rescue Exception # # rubocop:disable Lint/RescueException + ExceptionWrapper.new($!) + end + + begin + Marshal.dump(result, write) + rescue Errno::EPIPE + return # parent thread already dead + end + end + end + + # options is either a Integer or a Hash with :count + def extract_count_from_options(options) + if options.is_a?(Hash) + count = options[:count] + else + count = options + options = {} + end + [count, options] + end + + def call_with_index(item, index, options, &block) + args = [item] + args << index if options[:with_index] + results = block.call(*args) + if options[:return_results] + results + else + nil # avoid GC overhead of passing large results around + end + end + + def with_instrumentation(item, index, options) + instrument_start(item, index, options) + result = yield + instrument_finish(item, index, result, options) + result unless options[:preserve_results] == false + end + + def instrument_finish(item, index, result, options) + return unless on_finish = options[:finish] + options[:mutex].synchronize { on_finish.call(item, index, result) } + end + + def instrument_start(item, index, options) + return unless on_start = options[:start] + options[:mutex].synchronize { on_start.call(item, index) } + end + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/parallel-1.22.1/lib/parallel/processor_count.rb b/vendor/bundle/ruby/3.1.0/gems/parallel-1.22.1/lib/parallel/processor_count.rb new file mode 100644 index 000000000..3b5ea617e --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/parallel-1.22.1/lib/parallel/processor_count.rb @@ -0,0 +1,44 @@ +# frozen_string_literal: true +module Parallel + # TODO: inline this method into parallel.rb and kill physical_processor_count in next major release + module ProcessorCount + # Number of processors seen by the OS, used for process scheduling + def processor_count + require 'etc' + @processor_count ||= Integer(ENV['PARALLEL_PROCESSOR_COUNT'] || Etc.nprocessors) + end + + # Number of physical processor cores on the current system. + def physical_processor_count + @physical_processor_count ||= begin + ppc = + case RbConfig::CONFIG["target_os"] + when /darwin[12]/ + IO.popen("/usr/sbin/sysctl -n hw.physicalcpu").read.to_i + when /linux/ + cores = {} # unique physical ID / core ID combinations + phy = 0 + File.read("/proc/cpuinfo").scan(/^physical id.*|^core id.*/) do |ln| + if ln.start_with?("physical") + phy = ln[/\d+/] + elsif ln.start_with?("core") + cid = "#{phy}:#{ln[/\d+/]}" + cores[cid] = true unless cores[cid] + end + end + cores.count + when /mswin|mingw/ + require 'win32ole' + result_set = WIN32OLE.connect("winmgmts://").ExecQuery( + "select NumberOfCores from Win32_Processor" + ) + result_set.to_enum.collect(&:NumberOfCores).reduce(:+) + else + processor_count + end + # fall back to logical count if physical info is invalid + ppc > 0 ? ppc : processor_count + end + end + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/parallel-1.22.1/lib/parallel/version.rb b/vendor/bundle/ruby/3.1.0/gems/parallel-1.22.1/lib/parallel/version.rb new file mode 100644 index 000000000..74f115470 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/parallel-1.22.1/lib/parallel/version.rb @@ -0,0 +1,4 @@ +# frozen_string_literal: true +module Parallel + VERSION = Version = '1.22.1' # rubocop:disable Naming/ConstantName +end diff --git a/vendor/bundle/ruby/3.1.0/gems/parser-3.1.2.0/LICENSE.txt b/vendor/bundle/ruby/3.1.0/gems/parser-3.1.2.0/LICENSE.txt new file mode 100644 index 000000000..971310e3d --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/parser-3.1.2.0/LICENSE.txt @@ -0,0 +1,25 @@ +Copyright (c) 2013-2016 whitequark + +Parts of the source are derived from ruby_parser: +Copyright (c) Ryan Davis, seattle.rb + +MIT License + +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/vendor/bundle/ruby/3.1.0/gems/parser-3.1.2.0/bin/ruby-parse b/vendor/bundle/ruby/3.1.0/gems/parser-3.1.2.0/bin/ruby-parse new file mode 100755 index 000000000..e5d30f84d --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/parser-3.1.2.0/bin/ruby-parse @@ -0,0 +1,7 @@ +#! /usr/bin/env ruby +# frozen_string_literal: true + +$LOAD_PATH.unshift(File.expand_path('../../lib', __FILE__)) +require 'parser/runner/ruby_parse' + +Parser::Runner::RubyParse.go(ARGV) diff --git a/vendor/bundle/ruby/3.1.0/gems/parser-3.1.2.0/bin/ruby-rewrite b/vendor/bundle/ruby/3.1.0/gems/parser-3.1.2.0/bin/ruby-rewrite new file mode 100755 index 000000000..10f7d6311 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/parser-3.1.2.0/bin/ruby-rewrite @@ -0,0 +1,7 @@ +#! /usr/bin/env ruby +# frozen_string_literal: true + +$LOAD_PATH.unshift(File.expand_path('../../lib', __FILE__)) +require 'parser/runner/ruby_rewrite' + +Parser::Runner::RubyRewrite.go(ARGV) diff --git a/vendor/bundle/ruby/3.1.0/gems/parser-3.1.2.0/lib/gauntlet_parser.rb b/vendor/bundle/ruby/3.1.0/gems/parser-3.1.2.0/lib/gauntlet_parser.rb new file mode 100644 index 000000000..864fe5b0a --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/parser-3.1.2.0/lib/gauntlet_parser.rb @@ -0,0 +1,123 @@ +# frozen_string_literal: true + +require 'gauntlet' +require 'parser/all' +require 'shellwords' + +class ParserGauntlet < Gauntlet + RUBY20 = 'ruby' + RUBY19 = 'ruby1.9.1' + RUBY18 = '/opt/rubies/ruby-1.8.7-p370/bin/ruby' + + def try(parser, ruby, file, show_ok: false) + try_ruby = lambda do |e| + Process.spawn(%{#{ruby} -c #{Shellwords.escape file}}, + :err => '/dev/null', :out => '/dev/null') + _, status = Process.wait2 + + if status.success? + # Bug in Parser. + puts "Parser bug." + @result[file] = { parser.to_s => "#{e.class}: #{e.to_s}" } + else + # No, this file is not Ruby. + yield if block_given? + end + end + + begin + parser.parse_file(file) + + rescue Parser::SyntaxError => e + if e.diagnostic.location.resize(2).is?('<%') + puts "ERb." + return + end + + try_ruby.call(e) + + rescue ArgumentError, RegexpError, + Encoding::UndefinedConversionError => e + puts "#{file}: #{e.class}: #{e.to_s}" + + try_ruby.call(e) + + rescue Interrupt + raise + + rescue Exception => e + puts "Parser bug: #{file} #{e.class}: #{e.to_s}" + @result[file] = { parser.to_s => "#{e.class}: #{e.to_s}" } + + else + puts "Ok." if show_ok + end + end + + def parse(name) + puts "GEM: #{name}" + + @result = {} + + if ENV.include?('FAST') + total_size = Dir["**/*.rb"].map(&File.method(:size)).reduce(:+) + if total_size > 300_000 + puts "Skip." + return + end + end + + Dir["**/*.rb"].each do |file| + next if File.directory? file + + try(Parser::Ruby20, RUBY20, file) do + puts "Trying 1.9:" + try(Parser::Ruby19, RUBY19, file, show_ok: true) do + puts "Trying 1.8:" + try(Parser::Ruby18, RUBY18, file, show_ok: true) do + puts "Invalid syntax." + end + end + end + end + + @result + end + + def run(name) + data[name] = parse(name) + self.dirty = true + end + + def should_skip?(name) + data[name] == {} + end + + def load_yaml(*) + data = super + @was_errors = data.count { |_name, errs| errs != {} } + + data + end + + def shutdown + super + + errors = data.count { |_name, errs| errs != {} } + total = data.count + percent = "%.5f" % [100 - errors.to_f / total * 100] + puts "!!! was: #{@was_errors} now: #{errors} total: #{total} frac: #{percent}%" + end +end + +filter = ARGV.shift +filter = Regexp.new filter if filter + +gauntlet = ParserGauntlet.new + +if ENV.include? 'UPDATE' + gauntlet.source_index + gauntlet.update_gem_tarballs +end + +gauntlet.run_the_gauntlet filter diff --git a/vendor/bundle/ruby/3.1.0/gems/parser-3.1.2.0/lib/parser.rb b/vendor/bundle/ruby/3.1.0/gems/parser-3.1.2.0/lib/parser.rb new file mode 100644 index 000000000..6aeaa7e1a --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/parser-3.1.2.0/lib/parser.rb @@ -0,0 +1,85 @@ +# frozen_string_literal: true + +if RUBY_VERSION =~ /^1\.[89]\./ + require 'parser/version' + raise LoadError, <<-UNSUPPORTED_VERSION_MSG +parser v#{Parser::VERSION} cannot run on Ruby #{RUBY_VERSION}. +Please upgrade to Ruby 2.0.0 or higher, or use an older version of the parser gem. + UNSUPPORTED_VERSION_MSG +end + +require 'set' +require 'racc/parser' + +require 'ast' + +## +# @api public +# +module Parser + require 'parser/version' + require 'parser/messages' + require 'parser/deprecation' + + module AST + require 'parser/ast/node' + require 'parser/ast/processor' + require 'parser/meta' + end + + module Source + require 'parser/source/buffer' + require 'parser/source/range' + + require 'parser/source/comment' + require 'parser/source/comment/associator' + + require 'parser/source/rewriter' + require 'parser/source/rewriter/action' + require 'parser/source/tree_rewriter' + require 'parser/source/tree_rewriter/action' + + require 'parser/source/map' + require 'parser/source/map/operator' + require 'parser/source/map/collection' + require 'parser/source/map/constant' + require 'parser/source/map/variable' + require 'parser/source/map/keyword' + require 'parser/source/map/definition' + require 'parser/source/map/method_definition' + require 'parser/source/map/send' + require 'parser/source/map/index' + require 'parser/source/map/condition' + require 'parser/source/map/ternary' + require 'parser/source/map/for' + require 'parser/source/map/rescue_body' + require 'parser/source/map/heredoc' + require 'parser/source/map/objc_kwarg' + end + + require 'parser/syntax_error' + require 'parser/clobbering_error' + require 'parser/diagnostic' + require 'parser/diagnostic/engine' + + require 'parser/static_environment' + + require 'parser/lexer' + require 'parser/lexer/literal' + require 'parser/lexer/stack_state' + require 'parser/lexer/dedenter' + + module Builders + require 'parser/builders/default' + end + + require 'parser/context' + require 'parser/max_numparam_stack' + require 'parser/current_arg_stack' + require 'parser/variables_stack' + + require 'parser/base' + + require 'parser/rewriter' + require 'parser/tree_rewriter' +end diff --git a/vendor/bundle/ruby/3.1.0/gems/parser-3.1.2.0/lib/parser/all.rb b/vendor/bundle/ruby/3.1.0/gems/parser-3.1.2.0/lib/parser/all.rb new file mode 100644 index 000000000..87361f499 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/parser-3.1.2.0/lib/parser/all.rb @@ -0,0 +1,15 @@ +# frozen_string_literal: true + +require 'parser/ruby18' +require 'parser/ruby19' +require 'parser/ruby20' +require 'parser/ruby21' +require 'parser/ruby22' +require 'parser/ruby23' +require 'parser/ruby24' +require 'parser/ruby25' +require 'parser/ruby26' +require 'parser/ruby27' +require 'parser/ruby30' +require 'parser/ruby31' +require 'parser/ruby32' diff --git a/vendor/bundle/ruby/3.1.0/gems/parser-3.1.2.0/lib/parser/ast/node.rb b/vendor/bundle/ruby/3.1.0/gems/parser-3.1.2.0/lib/parser/ast/node.rb new file mode 100644 index 000000000..b9cbf3da7 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/parser-3.1.2.0/lib/parser/ast/node.rb @@ -0,0 +1,40 @@ +# frozen_string_literal: true + +module Parser + module AST + + ## + # {Parser::AST::Node} contains information about a single AST node and its + # child nodes. It extends the basic [AST::Node](http://rdoc.info/gems/ast/AST/Node) + # class provided by gem [ast](http://rdoc.info/gems/ast). + # + # @api public + # + # @!attribute [r] location + # Source map for this Node. + # @return [Parser::Source::Map] + # + class Node < ::AST::Node + attr_reader :location + + alias loc location + + ## + # Assigns various properties to this AST node. Currently only the + # location can be set. + # + # @param [Hash] properties + # @option properties [Parser::Source::Map] :location Location information + # of the node. + # + def assign_properties(properties) + if (location = properties[:location]) + location = location.dup if location.frozen? + location.node = self + @location = location + end + end + end + + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/parser-3.1.2.0/lib/parser/ast/processor.rb b/vendor/bundle/ruby/3.1.0/gems/parser-3.1.2.0/lib/parser/ast/processor.rb new file mode 100644 index 000000000..13670e01c --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/parser-3.1.2.0/lib/parser/ast/processor.rb @@ -0,0 +1,288 @@ +# frozen_string_literal: true + +module Parser + module AST + + ## + # @api public + # + class Processor < ::AST::Processor + def process_regular_node(node) + node.updated(nil, process_all(node)) + end + + alias on_dstr process_regular_node + alias on_dsym process_regular_node + alias on_regexp process_regular_node + alias on_xstr process_regular_node + alias on_splat process_regular_node + alias on_kwsplat process_regular_node + alias on_array process_regular_node + alias on_pair process_regular_node + alias on_hash process_regular_node + alias on_kwargs process_regular_node + alias on_irange process_regular_node + alias on_erange process_regular_node + + def on_var(node) + node + end + + # @private + def process_variable_node(node) + on_var(node) + end + + alias on_lvar process_variable_node + alias on_ivar process_variable_node + alias on_gvar process_variable_node + alias on_cvar process_variable_node + alias on_back_ref process_variable_node + alias on_nth_ref process_variable_node + + def on_vasgn(node) + name, value_node = *node + + if !value_node.nil? + node.updated(nil, [ + name, process(value_node) + ]) + else + node + end + end + + # @private + def process_var_asgn_node(node) + on_vasgn(node) + end + + alias on_lvasgn process_var_asgn_node + alias on_ivasgn process_var_asgn_node + alias on_gvasgn process_var_asgn_node + alias on_cvasgn process_var_asgn_node + + alias on_and_asgn process_regular_node + alias on_or_asgn process_regular_node + + def on_op_asgn(node) + var_node, method_name, value_node = *node + + node.updated(nil, [ + process(var_node), method_name, process(value_node) + ]) + end + + alias on_mlhs process_regular_node + alias on_masgn process_regular_node + + def on_const(node) + scope_node, name = *node + + node.updated(nil, [ + process(scope_node), name + ]) + end + + def on_casgn(node) + scope_node, name, value_node = *node + + if !value_node.nil? + node.updated(nil, [ + process(scope_node), name, process(value_node) + ]) + else + node.updated(nil, [ + process(scope_node), name + ]) + end + end + + alias on_args process_regular_node + + def on_argument(node) + arg_name, value_node = *node + + if !value_node.nil? + node.updated(nil, [ + arg_name, process(value_node) + ]) + else + node + end + end + + # @private + def process_argument_node(node) + on_argument(node) + end + + alias on_arg process_argument_node + alias on_optarg process_argument_node + alias on_restarg process_argument_node + alias on_blockarg process_argument_node + alias on_shadowarg process_argument_node + alias on_kwarg process_argument_node + alias on_kwoptarg process_argument_node + alias on_kwrestarg process_argument_node + alias on_forward_arg process_argument_node + + def on_procarg0(node) + if node.children[0].is_a?(Symbol) + # This branch gets executed when the builder + # is not configured to emit and 'arg' inside 'procarg0', i.e. when + # Parser::Builders::Default.emit_arg_inside_procarg0 + # is set to false. + # + # If this flag is set to true this branch is unreachable. + # s(:procarg0, :a) + on_argument(node) + else + # s(:procarg0, s(:arg, :a), s(:arg, :b)) + process_regular_node(node) + end + end + + alias on_arg_expr process_regular_node + alias on_restarg_expr process_regular_node + alias on_blockarg_expr process_regular_node + alias on_block_pass process_regular_node + + alias on_module process_regular_node + alias on_class process_regular_node + alias on_sclass process_regular_node + + def on_def(node) + name, args_node, body_node = *node + + node.updated(nil, [ + name, + process(args_node), process(body_node) + ]) + end + + def on_defs(node) + definee_node, name, args_node, body_node = *node + + node.updated(nil, [ + process(definee_node), name, + process(args_node), process(body_node) + ]) + end + + alias on_undef process_regular_node + alias on_alias process_regular_node + + def on_send(node) + receiver_node, method_name, *arg_nodes = *node + + receiver_node = process(receiver_node) if receiver_node + node.updated(nil, [ + receiver_node, method_name, *process_all(arg_nodes) + ]) + end + + alias on_csend on_send + + alias on_index process_regular_node + alias on_indexasgn process_regular_node + + alias on_block process_regular_node + alias on_lambda process_regular_node + + def on_numblock(node) + method_call, max_numparam, body = *node + + node.updated(nil, [ + process(method_call), max_numparam, process(body) + ]) + end + + alias on_while process_regular_node + alias on_while_post process_regular_node + alias on_until process_regular_node + alias on_until_post process_regular_node + alias on_for process_regular_node + + alias on_return process_regular_node + alias on_break process_regular_node + alias on_next process_regular_node + alias on_redo process_regular_node + alias on_retry process_regular_node + alias on_super process_regular_node + alias on_yield process_regular_node + alias on_defined? process_regular_node + + alias on_not process_regular_node + alias on_and process_regular_node + alias on_or process_regular_node + + alias on_if process_regular_node + + alias on_when process_regular_node + alias on_case process_regular_node + + alias on_iflipflop process_regular_node + alias on_eflipflop process_regular_node + + alias on_match_current_line process_regular_node + alias on_match_with_lvasgn process_regular_node + + alias on_resbody process_regular_node + alias on_rescue process_regular_node + alias on_ensure process_regular_node + + alias on_begin process_regular_node + alias on_kwbegin process_regular_node + + alias on_preexe process_regular_node + alias on_postexe process_regular_node + + alias on_case_match process_regular_node + alias on_in_match process_regular_node + alias on_match_pattern process_regular_node + alias on_match_pattern_p process_regular_node + alias on_in_pattern process_regular_node + alias on_if_guard process_regular_node + alias on_unless_guard process_regular_node + alias on_match_var process_variable_node + alias on_match_rest process_regular_node + alias on_pin process_regular_node + alias on_match_alt process_regular_node + alias on_match_as process_regular_node + alias on_array_pattern process_regular_node + alias on_array_pattern_with_tail process_regular_node + alias on_hash_pattern process_regular_node + alias on_const_pattern process_regular_node + alias on_find_pattern process_regular_node + + # @private + def process_variable_node(node) + warn 'Parser::AST::Processor#process_variable_node is deprecated as a' \ + ' public API and will be removed. Please use ' \ + 'Parser::AST::Processor#on_var instead.' + on_var(node) + end + + # @private + def process_var_asgn_node(node) + warn 'Parser::AST::Processor#process_var_asgn_node is deprecated as a' \ + ' public API and will be removed. Please use ' \ + 'Parser::AST::Processor#on_vasgn instead.' + on_vasgn(node) + end + + # @private + def process_argument_node(node) + warn 'Parser::AST::Processor#process_argument_node is deprecated as a' \ + ' public API and will be removed. Please use ' \ + 'Parser::AST::Processor#on_argument instead.' + on_argument(node) + end + + def on_empty_else(node) + node + end + end + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/parser-3.1.2.0/lib/parser/base.rb b/vendor/bundle/ruby/3.1.0/gems/parser-3.1.2.0/lib/parser/base.rb new file mode 100644 index 000000000..b71562e78 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/parser-3.1.2.0/lib/parser/base.rb @@ -0,0 +1,291 @@ +# frozen_string_literal: true + +module Parser + + ## + # Base class for version-specific parsers. + # + # @api public + # + # @!attribute [r] diagnostics + # @return [Parser::Diagnostic::Engine] + # + # @!attribute [r] static_env + # @return [Parser::StaticEnvironment] + # + class Base < Racc::Parser + ## + # Parses a string of Ruby code and returns the AST. If the source + # cannot be parsed, {SyntaxError} is raised and a diagnostic is + # printed to `stderr`. + # + # @example + # Parser::Base.parse('puts "hello"') + # + # @param [String] string The block of code to parse. + # @param [String] file The name of the file the code originated from. + # @param [Numeric] line The initial line number. + # @return [Parser::AST::Node] + # + def self.parse(string, file='(string)', line=1) + parser = default_parser + source_buffer = setup_source_buffer(file, line, string, parser.default_encoding) + parser.parse(source_buffer) + end + + ## + # Parses a string of Ruby code and returns the AST and comments. If the + # source cannot be parsed, {SyntaxError} is raised and a diagnostic is + # printed to `stderr`. + # + # @example + # Parser::Base.parse_with_comments('puts "hello"') + # + # @param [String] string The block of code to parse. + # @param [String] file The name of the file the code originated from. + # @param [Numeric] line The initial line number. + # @return [Array] + # + def self.parse_with_comments(string, file='(string)', line=1) + parser = default_parser + source_buffer = setup_source_buffer(file, line, string, parser.default_encoding) + parser.parse_with_comments(source_buffer) + end + + ## + # Parses Ruby source code by reading it from a file. If the source + # cannot be parsed, {SyntaxError} is raised and a diagnostic is + # printed to `stderr`. + # + # @param [String] filename Path to the file to parse. + # @return [Parser::AST::Node] + # @see #parse + # + def self.parse_file(filename) + parse(File.read(filename), filename) + end + + ## + # Parses Ruby source code by reading it from a file and returns the AST and + # comments. If the source cannot be parsed, {SyntaxError} is raised and a + # diagnostic is printed to `stderr`. + # + # @param [String] filename Path to the file to parse. + # @return [Array] + # @see #parse + # + def self.parse_file_with_comments(filename) + parse_with_comments(File.read(filename), filename) + end + + ## + # @return [Parser::Base] parser with the default options set. + # + def self.default_parser + parser = new + + parser.diagnostics.all_errors_are_fatal = true + parser.diagnostics.ignore_warnings = true + + parser.diagnostics.consumer = lambda do |diagnostic| + $stderr.puts(diagnostic.render) + end + + parser + end + + def self.setup_source_buffer(file, line, string, encoding) + string = string.dup.force_encoding(encoding) + + source_buffer = Source::Buffer.new(file, line) + + if name == 'Parser::Ruby18' + source_buffer.raw_source = string + else + source_buffer.source = string + end + + source_buffer + end + private_class_method :setup_source_buffer + + attr_reader :lexer + attr_reader :diagnostics + attr_reader :builder + attr_reader :static_env + attr_reader :source_buffer + attr_reader :context + attr_reader :max_numparam_stack + attr_reader :current_arg_stack + attr_reader :pattern_variables + attr_reader :pattern_hash_keys + + ## + # @param [Parser::Builders::Default] builder The AST builder to use. + # + def initialize(builder=Parser::Builders::Default.new) + @diagnostics = Diagnostic::Engine.new + + @static_env = StaticEnvironment.new + + # Stack that holds current parsing context + @context = Context.new + + # Maximum numbered parameters stack + @max_numparam_stack = MaxNumparamStack.new + + # Current argument names stack + @current_arg_stack = CurrentArgStack.new + + # Stack of set of variables used in the current pattern + @pattern_variables = VariablesStack.new + + # Stack of set of keys used in the current hash in pattern matchinig + @pattern_hash_keys = VariablesStack.new + + @lexer = Lexer.new(version) + @lexer.diagnostics = @diagnostics + @lexer.static_env = @static_env + @lexer.context = @context + + @builder = builder + @builder.parser = self + + # Last emitted token + @last_token = nil + + if self.class::Racc_debug_parser && ENV['RACC_DEBUG'] + @yydebug = true + end + + reset + end + + ## + # Resets the state of the parser. + # + def reset + @source_buffer = nil + + @lexer.reset + @static_env.reset + @context.reset + @current_arg_stack.reset + @pattern_variables.reset + @pattern_hash_keys.reset + + self + end + + ## + # Parses a source buffer and returns the AST, or `nil` in case of a non fatal error. + # + # @param [Parser::Source::Buffer] source_buffer The source buffer to parse. + # @return [Parser::AST::Node, nil] + # + def parse(source_buffer) + @lexer.source_buffer = source_buffer + @source_buffer = source_buffer + + do_parse || nil # Force `false` to `nil`, see https://github.com/ruby/racc/pull/136 + ensure + # Don't keep references to the source file. + @source_buffer = nil + @lexer.source_buffer = nil + end + + ## + # Parses a source buffer and returns the AST and the source code comments. + # + # @see #parse + # @see Parser::Source::Comment#associate + # @return [Array] + # + def parse_with_comments(source_buffer) + @lexer.comments = [] + + [ parse(source_buffer), @lexer.comments ] + ensure + @lexer.comments = nil + end + + ## + # Parses a source buffer and returns the AST, the source code comments, + # and the tokens emitted by the lexer. In case of a fatal error, a {SyntaxError} + # is raised, unless `recover` is true. In case of an error + # (non-fatal or recovered), `nil` is returned instead of the AST, and + # comments as well as tokens are only returned up to the location of + # the error. + # + # Currently, token stream format returned by #tokenize is not documented, + # but is considered part of a public API and only changed according + # to Semantic Versioning. + # + # However, note that the exact token composition of various constructs + # might vary. For example, a string `"foo"` is represented equally well + # by `:tSTRING_BEG " :tSTRING_CONTENT foo :tSTRING_END "` and + # `:tSTRING "foo"`; such details must not be relied upon. + # + # @param [Parser::Source::Buffer] source_buffer + # @param [Boolean] recover If true, recover from syntax errors. False by default. + # @return [Array] + # + def tokenize(source_buffer, recover=false) + @lexer.tokens = [] + @lexer.comments = [] + + begin + ast = parse(source_buffer) + rescue Parser::SyntaxError + raise if !recover + end + + [ ast, @lexer.comments, @lexer.tokens ] + ensure + @lexer.tokens = nil + @lexer.comments = nil + end + + private + + def next_token + token = @lexer.advance + @last_token = token + token + end + + def check_kwarg_name(name_t) + case name_t[0] + when /^[a-z_]/ + # OK + when /^[A-Z]/ + diagnostic :error, :argument_const, nil, name_t + end + end + + def diagnostic(level, reason, arguments, location_t, highlights_ts=[]) + _, location = location_t + + highlights = highlights_ts.map do |token| + _, range = token + range + end + + @diagnostics.process( + Diagnostic.new(level, reason, arguments, location, highlights)) + + if level == :error + yyerror + end + end + + def on_error(error_token_id, error_value, value_stack) + token_name = token_to_str(error_token_id) + _, location = error_value + + @diagnostics.process(Diagnostic.new( + :error, :unexpected_token, { :token => token_name }, location)) + end + end + +end diff --git a/vendor/bundle/ruby/3.1.0/gems/parser-3.1.2.0/lib/parser/builders/default.rb b/vendor/bundle/ruby/3.1.0/gems/parser-3.1.2.0/lib/parser/builders/default.rb new file mode 100644 index 000000000..523b51b59 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/parser-3.1.2.0/lib/parser/builders/default.rb @@ -0,0 +1,2309 @@ +# frozen_string_literal: true + +module Parser + + ## + # Default AST builder. Uses {AST::Node}s. + # + class Builders::Default + class << self + ## + # AST compatibility attribute; since `-> {}` is not semantically + # equivalent to `lambda {}`, all new code should set this attribute + # to true. + # + # If set to false (the default), `-> {}` is emitted as + # `s(:block, s(:send, nil, :lambda), s(:args), nil)`. + # + # If set to true, `-> {}` is emitted as + # `s(:block, s(:lambda), s(:args), nil)`. + # + # @return [Boolean] + attr_accessor :emit_lambda + end + + @emit_lambda = false + + class << self + ## + # AST compatibility attribute; block arguments of `m { |a| }` are + # not semantically equivalent to block arguments of `m { |a,| }` or `m { |a, b| }`, + # all new code should set this attribute to true. + # + # If set to false (the default), arguments of `m { |a| }` are emitted as + # `s(:args, s(:arg, :a))`. + # + # If set to true, arguments of `m { |a| }` are emitted as + # `s(:args, s(:procarg0, :a)). + # + # @return [Boolean] + attr_accessor :emit_procarg0 + end + + @emit_procarg0 = false + + class << self + ## + # AST compatibility attribute; locations of `__ENCODING__` are not the same + # as locations of `Encoding::UTF_8` causing problems during rewriting, + # all new code should set this attribute to true. + # + # If set to false (the default), `__ENCODING__` is emitted as + # ` s(:const, s(:const, nil, :Encoding), :UTF_8)`. + # + # If set to true, `__ENCODING__` is emitted as + # `s(:__ENCODING__)`. + # + # @return [Boolean] + attr_accessor :emit_encoding + end + + @emit_encoding = false + + class << self + ## + # AST compatibility attribute; indexed assignment, `x[] = 1`, is not + # semantically equivalent to calling the method directly, `x.[]=(1)`. + # Specifically, in the former case, the expression's value is always 1, + # and in the latter case, the expression's value is the return value + # of the `[]=` method. + # + # If set to false (the default), `self[1]` is emitted as + # `s(:send, s(:self), :[], s(:int, 1))`, and `self[1] = 2` is + # emitted as `s(:send, s(:self), :[]=, s(:int, 1), s(:int, 2))`. + # + # If set to true, `self[1]` is emitted as + # `s(:index, s(:self), s(:int, 1))`, and `self[1] = 2` is + # emitted as `s(:indexasgn, s(:self), s(:int, 1), s(:int, 2))`. + # + # @return [Boolean] + attr_accessor :emit_index + end + + @emit_index = false + + class << self + ## + # AST compatibility attribute; causes a single non-mlhs + # block argument to be wrapped in s(:procarg0). + # + # If set to false (the default), block arguments `|a|` are emitted as + # `s(:args, s(:procarg0, :a))` + # + # If set to true, block arguments `|a|` are emitted as + # `s(:args, s(:procarg0, s(:arg, :a))` + # + # @return [Boolean] + attr_accessor :emit_arg_inside_procarg0 + end + + @emit_arg_inside_procarg0 = false + + class << self + ## + # AST compatibility attribute; arguments forwarding initially + # didn't have support for leading arguments + # (i.e. `def m(a, ...); end` was a syntax error). However, Ruby 3.0 + # added support for any number of arguments in front of the `...`. + # + # If set to false (the default): + # 1. `def m(...) end` is emitted as + # s(:def, :m, s(:forward_args), nil) + # 2. `def m(a, b, ...) end` is emitted as + # s(:def, :m, + # s(:args, s(:arg, :a), s(:arg, :b), s(:forward_arg))) + # + # If set to true it uses a single format: + # 1. `def m(...) end` is emitted as + # s(:def, :m, s(:args, s(:forward_arg))) + # 2. `def m(a, b, ...) end` is emitted as + # s(:def, :m, s(:args, s(:arg, :a), s(:arg, :b), s(:forward_arg))) + # + # It does't matter that much on 2.7 (because there can't be any leading arguments), + # but on 3.0 it should be better enabled to use a single AST format. + # + # @return [Boolean] + attr_accessor :emit_forward_arg + end + + @emit_forward_arg = false + + class << self + ## + # AST compatibility attribute; Starting from Ruby 2.7 keyword arguments + # of method calls that are passed explicitly as a hash (i.e. with curly braces) + # are treated as positional arguments and Ruby 2.7 emits a warning on such method + # call. Ruby 3.0 given an ArgumentError. + # + # If set to false (the default) the last hash argument is emitted as `hash`: + # + # ``` + # (send nil :foo + # (hash + # (pair + # (sym :bar) + # (int 42)))) + # ``` + # + # If set to true it is emitted as `kwargs`: + # + # ``` + # (send nil :foo + # (kwargs + # (pair + # (sym :bar) + # (int 42)))) + # ``` + # + # Note that `kwargs` node is just a replacement for `hash` argument, + # so if there's are multiple arguments (or a `kwsplat`) all of them + # are wrapped into `kwargs` instead of `hash`: + # + # ``` + # (send nil :foo + # (kwargs + # (pair + # (sym :a) + # (int 42)) + # (kwsplat + # (send nil :b)) + # (pair + # (sym :c) + # (int 10)))) + # ``` + attr_accessor :emit_kwargs + end + + @emit_kwargs = false + + class << self + ## + # AST compatibility attribute; Starting from 3.0 Ruby returns + # true/false from single-line pattern matching with `in` keyword. + # + # Before 3.0 there was an exception if given value doesn't match pattern. + # + # NOTE: This attribute affects only Ruby 2.7 grammar. + # 3.0 grammar always emits `match_pattern`/`match_pattern_p` + # + # If compatibility attribute set to false `foo in bar` is emitted as `in_match`: + # + # ``` + # (in-match + # (send nil :foo) + # (match-var :bar)) + # ``` + # + # If set to true it's emitted as `match_pattern_p`: + # ``` + # (match-pattern-p + # (send nil :foo) + # (match-var :bar)) + # ``` + attr_accessor :emit_match_pattern + end + + @emit_match_pattern = false + + class << self + ## + # @api private + def modernize + @emit_lambda = true + @emit_procarg0 = true + @emit_encoding = true + @emit_index = true + @emit_arg_inside_procarg0 = true + @emit_forward_arg = true + @emit_kwargs = true + @emit_match_pattern = true + end + end + + ## + # @api private + attr_accessor :parser + + ## + # If set to true (the default), `__FILE__` and `__LINE__` are transformed to + # literal nodes. For example, `s(:str, "lib/foo.rb")` and `s(:int, 10)`. + # + # If set to false, `__FILE__` and `__LINE__` are emitted as-is, + # i.e. as `s(:__FILE__)` and `s(:__LINE__)` nodes. + # + # Source maps are identical in both cases. + # + # @return [Boolean] + attr_accessor :emit_file_line_as_literals + + ## + # Initializes attributes: + # + # * `emit_file_line_as_literals`: `true` + def initialize + @emit_file_line_as_literals = true + end + + # @!parse private + + # + # Literals + # + + # Singletons + + def nil(nil_t) + n0(:nil, + token_map(nil_t)) + end + + def true(true_t) + n0(:true, + token_map(true_t)) + end + + def false(false_t) + n0(:false, + token_map(false_t)) + end + + # Numerics + + def integer(integer_t) + numeric(:int, integer_t) + end + + def float(float_t) + numeric(:float, float_t) + end + + def rational(rational_t) + numeric(:rational, rational_t) + end + + def complex(complex_t) + numeric(:complex, complex_t) + end + + def numeric(kind, token) + n(kind, [ value(token) ], + Source::Map::Operator.new(nil, loc(token))) + end + private :numeric + + def unary_num(unary_t, numeric) + value, = *numeric + operator_loc = loc(unary_t) + + case value(unary_t) + when '+' + value = +value + when '-' + value = -value + end + + numeric.updated(nil, [ value ], + :location => + Source::Map::Operator.new( + operator_loc, + operator_loc.join(numeric.loc.expression))) + end + + def __LINE__(__LINE__t) + n0(:__LINE__, + token_map(__LINE__t)) + end + + # Strings + + def string(string_t) + n(:str, [ string_value(string_t) ], + delimited_string_map(string_t)) + end + + def string_internal(string_t) + n(:str, [ string_value(string_t) ], + unquoted_map(string_t)) + end + + def string_compose(begin_t, parts, end_t) + if collapse_string_parts?(parts) + if begin_t.nil? && end_t.nil? + parts.first + else + n(:str, parts.first.children, + string_map(begin_t, parts, end_t)) + end + else + n(:dstr, [ *parts ], + string_map(begin_t, parts, end_t)) + end + end + + def character(char_t) + n(:str, [ string_value(char_t) ], + prefix_string_map(char_t)) + end + + def __FILE__(__FILE__t) + n0(:__FILE__, + token_map(__FILE__t)) + end + + # Symbols + + def symbol(symbol_t) + n(:sym, [ string_value(symbol_t).to_sym ], + prefix_string_map(symbol_t)) + end + + def symbol_internal(symbol_t) + n(:sym, [ string_value(symbol_t).to_sym ], + unquoted_map(symbol_t)) + end + + def symbol_compose(begin_t, parts, end_t) + if collapse_string_parts?(parts) + str = parts.first + + n(:sym, [ str.children.first.to_sym ], + collection_map(begin_t, str.loc.expression, end_t)) + elsif @parser.version == 18 && parts.empty? + diagnostic :error, :empty_symbol, nil, loc(begin_t).join(loc(end_t)) + else + n(:dsym, [ *parts ], + collection_map(begin_t, parts, end_t)) + end + end + + # Executable strings + + def xstring_compose(begin_t, parts, end_t) + n(:xstr, [ *parts ], + string_map(begin_t, parts, end_t)) + end + + # Indented (interpolated, noninterpolated, executable) strings + + def dedent_string(node, dedent_level) + if !dedent_level.nil? + dedenter = Lexer::Dedenter.new(dedent_level) + + case node.type + when :str + str = node.children.first + dedenter.dedent(str) + when :dstr, :xstr + children = node.children.map do |str_node| + if str_node.type == :str + str = str_node.children.first + dedenter.dedent(str) + next nil if str.empty? + else + dedenter.interrupt + end + str_node + end + + node = node.updated(nil, children.compact) + end + end + + node + end + + # Regular expressions + + def regexp_options(regopt_t) + options = value(regopt_t). + each_char.sort.uniq. + map(&:to_sym) + + n(:regopt, options, + token_map(regopt_t)) + end + + def regexp_compose(begin_t, parts, end_t, options) + begin + static_regexp(parts, options) + rescue RegexpError => e + diagnostic :error, :invalid_regexp, { :message => e.message }, + loc(begin_t).join(loc(end_t)) + end + + n(:regexp, (parts << options), + regexp_map(begin_t, end_t, options)) + end + + # Arrays + + def array(begin_t, elements, end_t) + n(:array, elements, + collection_map(begin_t, elements, end_t)) + end + + def splat(star_t, arg=nil) + if arg.nil? + n0(:splat, + unary_op_map(star_t)) + else + n(:splat, [ arg ], + unary_op_map(star_t, arg)) + end + end + + def word(parts) + if collapse_string_parts?(parts) + parts.first + else + n(:dstr, [ *parts ], + collection_map(nil, parts, nil)) + end + end + + def words_compose(begin_t, parts, end_t) + n(:array, [ *parts ], + collection_map(begin_t, parts, end_t)) + end + + def symbols_compose(begin_t, parts, end_t) + parts = parts.map do |part| + case part.type + when :str + value, = *part + part.updated(:sym, [ value.to_sym ]) + when :dstr + part.updated(:dsym) + else + part + end + end + + n(:array, [ *parts ], + collection_map(begin_t, parts, end_t)) + end + + # Hashes + + def pair(key, assoc_t, value) + n(:pair, [ key, value ], + binary_op_map(key, assoc_t, value)) + end + + def pair_list_18(list) + if list.size % 2 != 0 + diagnostic :error, :odd_hash, nil, list.last.loc.expression + else + list. + each_slice(2).map do |key, value| + n(:pair, [ key, value ], + binary_op_map(key, nil, value)) + end + end + end + + def pair_keyword(key_t, value) + key_map, pair_map = pair_keyword_map(key_t, value) + + key = n(:sym, [ value(key_t).to_sym ], key_map) + + n(:pair, [ key, value ], pair_map) + end + + def pair_quoted(begin_t, parts, end_t, value) + end_t, pair_map = pair_quoted_map(begin_t, end_t, value) + + key = symbol_compose(begin_t, parts, end_t) + + n(:pair, [ key, value ], pair_map) + end + + def pair_label(key_t) + key_l = loc(key_t) + value_l = key_l.adjust(end_pos: -1) + + label = value(key_t) + value = + if label =~ /\A[[:lower:]]/ + n(:ident, [ label.to_sym ], Source::Map::Variable.new(value_l)) + else + n(:const, [ nil, label.to_sym ], Source::Map::Constant.new(nil, value_l, value_l)) + end + pair_keyword(key_t, accessible(value)) + end + + def kwsplat(dstar_t, arg) + n(:kwsplat, [ arg ], + unary_op_map(dstar_t, arg)) + end + + def associate(begin_t, pairs, end_t) + 0.upto(pairs.length - 1) do |i| + (i + 1).upto(pairs.length - 1) do |j| + key1, = *pairs[i] + key2, = *pairs[j] + + do_warn = false + + # keys have to be simple nodes, MRI ignores equal composite keys like + # `{ a(1) => 1, a(1) => 1 }` + case key1.type + when :sym, :str, :int, :float + if key1 == key2 + do_warn = true + end + when :rational, :complex, :regexp + if @parser.version >= 31 && key1 == key2 + do_warn = true + end + end + + if do_warn + diagnostic :warning, :duplicate_hash_key, nil, key2.loc.expression + end + end + end + + n(:hash, [ *pairs ], + collection_map(begin_t, pairs, end_t)) + end + + # Ranges + + def range_inclusive(lhs, dot2_t, rhs) + n(:irange, [ lhs, rhs ], + range_map(lhs, dot2_t, rhs)) + end + + def range_exclusive(lhs, dot3_t, rhs) + n(:erange, [ lhs, rhs ], + range_map(lhs, dot3_t, rhs)) + end + + # + # Access + # + + def self(token) + n0(:self, + token_map(token)) + end + + def ident(token) + n(:ident, [ value(token).to_sym ], + variable_map(token)) + end + + def ivar(token) + n(:ivar, [ value(token).to_sym ], + variable_map(token)) + end + + def gvar(token) + n(:gvar, [ value(token).to_sym ], + variable_map(token)) + end + + def cvar(token) + n(:cvar, [ value(token).to_sym ], + variable_map(token)) + end + + def back_ref(token) + n(:back_ref, [ value(token).to_sym ], + token_map(token)) + end + + def nth_ref(token) + n(:nth_ref, [ value(token) ], + token_map(token)) + end + + def accessible(node) + case node.type + when :__FILE__ + if @emit_file_line_as_literals + n(:str, [ node.loc.expression.source_buffer.name ], + node.loc.dup) + else + node + end + + when :__LINE__ + if @emit_file_line_as_literals + n(:int, [ node.loc.expression.line ], + node.loc.dup) + else + node + end + + when :__ENCODING__ + if !self.class.emit_encoding + n(:const, [ n(:const, [ nil, :Encoding], nil), :UTF_8 ], + node.loc.dup) + else + node + end + + when :ident + name, = *node + + if %w[? !].any? { |c| name.to_s.end_with?(c) } + diagnostic :error, :invalid_id_to_get, + { :identifier => name.to_s }, node.loc.expression + end + + # Numbered parameters are not declared anywhere, + # so they take precedence over method calls in numblock contexts + if @parser.version >= 27 && @parser.try_declare_numparam(node) + return node.updated(:lvar) + end + + unless @parser.static_env.declared?(name) + return n(:send, [ nil, name ], + var_send_map(node)) + end + + if name.to_s == parser.current_arg_stack.top + diagnostic :error, :circular_argument_reference, + { :var_name => name.to_s }, node.loc.expression + end + + node.updated(:lvar) + + else + node + end + end + + def const(name_t) + n(:const, [ nil, value(name_t).to_sym ], + constant_map(nil, nil, name_t)) + end + + def const_global(t_colon3, name_t) + cbase = n0(:cbase, token_map(t_colon3)) + + n(:const, [ cbase, value(name_t).to_sym ], + constant_map(cbase, t_colon3, name_t)) + end + + def const_fetch(scope, t_colon2, name_t) + n(:const, [ scope, value(name_t).to_sym ], + constant_map(scope, t_colon2, name_t)) + end + + def __ENCODING__(__ENCODING__t) + n0(:__ENCODING__, + token_map(__ENCODING__t)) + end + + # + # Assignment + # + + def assignable(node) + case node.type + when :cvar + node.updated(:cvasgn) + + when :ivar + node.updated(:ivasgn) + + when :gvar + node.updated(:gvasgn) + + when :const + if @parser.context.in_def + diagnostic :error, :dynamic_const, nil, node.loc.expression + end + + node.updated(:casgn) + + when :ident + name, = *node + + var_name = node.children[0].to_s + name_loc = node.loc.expression + + check_assignment_to_numparam(var_name, name_loc) + check_reserved_for_numparam(var_name, name_loc) + + @parser.static_env.declare(name) + + node.updated(:lvasgn) + + when :match_var + name, = *node + + var_name = node.children[0].to_s + name_loc = node.loc.expression + + check_assignment_to_numparam(var_name, name_loc) + check_reserved_for_numparam(var_name, name_loc) + + node + + when :nil, :self, :true, :false, + :__FILE__, :__LINE__, :__ENCODING__ + diagnostic :error, :invalid_assignment, nil, node.loc.expression + + when :back_ref, :nth_ref + diagnostic :error, :backref_assignment, nil, node.loc.expression + end + end + + def const_op_assignable(node) + node.updated(:casgn) + end + + def assign(lhs, eql_t, rhs) + (lhs << rhs).updated(nil, nil, + :location => lhs.loc. + with_operator(loc(eql_t)). + with_expression(join_exprs(lhs, rhs))) + end + + def op_assign(lhs, op_t, rhs) + case lhs.type + when :gvasgn, :ivasgn, :lvasgn, :cvasgn, :casgn, :send, :csend, :index + operator = value(op_t)[0..-1].to_sym + source_map = lhs.loc. + with_operator(loc(op_t)). + with_expression(join_exprs(lhs, rhs)) + + if lhs.type == :index + lhs = lhs.updated(:indexasgn) + end + + case operator + when :'&&' + n(:and_asgn, [ lhs, rhs ], source_map) + when :'||' + n(:or_asgn, [ lhs, rhs ], source_map) + else + n(:op_asgn, [ lhs, operator, rhs ], source_map) + end + + when :back_ref, :nth_ref + diagnostic :error, :backref_assignment, nil, lhs.loc.expression + end + end + + def multi_lhs(begin_t, items, end_t) + n(:mlhs, [ *items ], + collection_map(begin_t, items, end_t)) + end + + def multi_assign(lhs, eql_t, rhs) + n(:masgn, [ lhs, rhs ], + binary_op_map(lhs, eql_t, rhs)) + end + + # + # Class and module definition + # + + def def_class(class_t, name, + lt_t, superclass, + body, end_t) + n(:class, [ name, superclass, body ], + module_definition_map(class_t, name, lt_t, end_t)) + end + + def def_sclass(class_t, lshft_t, expr, + body, end_t) + n(:sclass, [ expr, body ], + module_definition_map(class_t, nil, lshft_t, end_t)) + end + + def def_module(module_t, name, + body, end_t) + n(:module, [ name, body ], + module_definition_map(module_t, name, nil, end_t)) + end + + # + # Method (un)definition + # + + def def_method(def_t, name_t, args, + body, end_t) + check_reserved_for_numparam(value(name_t), loc(name_t)) + + n(:def, [ value(name_t).to_sym, args, body ], + definition_map(def_t, nil, name_t, end_t)) + end + + def def_endless_method(def_t, name_t, args, + assignment_t, body) + check_reserved_for_numparam(value(name_t), loc(name_t)) + + n(:def, [ value(name_t).to_sym, args, body ], + endless_definition_map(def_t, nil, name_t, assignment_t, body)) + end + + def def_singleton(def_t, definee, dot_t, + name_t, args, + body, end_t) + validate_definee(definee) + check_reserved_for_numparam(value(name_t), loc(name_t)) + + n(:defs, [ definee, value(name_t).to_sym, args, body ], + definition_map(def_t, dot_t, name_t, end_t)) + end + + def def_endless_singleton(def_t, definee, dot_t, + name_t, args, + assignment_t, body) + validate_definee(definee) + check_reserved_for_numparam(value(name_t), loc(name_t)) + + n(:defs, [ definee, value(name_t).to_sym, args, body ], + endless_definition_map(def_t, dot_t, name_t, assignment_t, body)) + end + + def undef_method(undef_t, names) + n(:undef, [ *names ], + keyword_map(undef_t, nil, names, nil)) + end + + def alias(alias_t, to, from) + n(:alias, [ to, from ], + keyword_map(alias_t, nil, [to, from], nil)) + end + + # + # Formal arguments + # + + def args(begin_t, args, end_t, check_args=true) + args = check_duplicate_args(args) if check_args + validate_no_forward_arg_after_restarg(args) + + map = collection_map(begin_t, args, end_t) + if !self.class.emit_forward_arg && args.length == 1 && args[0].type == :forward_arg + n(:forward_args, [], map) + else + n(:args, args, map) + end + end + + def numargs(max_numparam) + n(:numargs, [ max_numparam ], nil) + end + + def forward_only_args(begin_t, dots_t, end_t) + if self.class.emit_forward_arg + arg = forward_arg(dots_t) + n(:args, [ arg ], + collection_map(begin_t, [ arg ], end_t)) + else + n(:forward_args, [], collection_map(begin_t, token_map(dots_t), end_t)) + end + end + + def forward_arg(dots_t) + n(:forward_arg, [], token_map(dots_t)) + end + + def arg(name_t) + check_reserved_for_numparam(value(name_t), loc(name_t)) + + n(:arg, [ value(name_t).to_sym ], + variable_map(name_t)) + end + + def optarg(name_t, eql_t, value) + check_reserved_for_numparam(value(name_t), loc(name_t)) + + n(:optarg, [ value(name_t).to_sym, value ], + variable_map(name_t). + with_operator(loc(eql_t)). + with_expression(loc(name_t).join(value.loc.expression))) + end + + def restarg(star_t, name_t=nil) + if name_t + check_reserved_for_numparam(value(name_t), loc(name_t)) + n(:restarg, [ value(name_t).to_sym ], + arg_prefix_map(star_t, name_t)) + else + n0(:restarg, + arg_prefix_map(star_t)) + end + end + + def kwarg(name_t) + check_reserved_for_numparam(value(name_t), loc(name_t)) + + n(:kwarg, [ value(name_t).to_sym ], + kwarg_map(name_t)) + end + + def kwoptarg(name_t, value) + check_reserved_for_numparam(value(name_t), loc(name_t)) + + n(:kwoptarg, [ value(name_t).to_sym, value ], + kwarg_map(name_t, value)) + end + + def kwrestarg(dstar_t, name_t=nil) + if name_t + check_reserved_for_numparam(value(name_t), loc(name_t)) + + n(:kwrestarg, [ value(name_t).to_sym ], + arg_prefix_map(dstar_t, name_t)) + else + n0(:kwrestarg, + arg_prefix_map(dstar_t)) + end + end + + def kwnilarg(dstar_t, nil_t) + n0(:kwnilarg, + arg_prefix_map(dstar_t, nil_t)) + end + + def shadowarg(name_t) + check_reserved_for_numparam(value(name_t), loc(name_t)) + + n(:shadowarg, [ value(name_t).to_sym ], + variable_map(name_t)) + end + + def blockarg(amper_t, name_t) + if !name_t.nil? + check_reserved_for_numparam(value(name_t), loc(name_t)) + end + + arg_name = name_t ? value(name_t).to_sym : nil + n(:blockarg, [ arg_name ], + arg_prefix_map(amper_t, name_t)) + end + + def procarg0(arg) + if self.class.emit_procarg0 + if arg.type == :arg && self.class.emit_arg_inside_procarg0 + n(:procarg0, [ arg ], + Source::Map::Collection.new(nil, nil, arg.location.expression)) + else + arg.updated(:procarg0) + end + else + arg + end + end + + # Ruby 1.8 block arguments + + def arg_expr(expr) + if expr.type == :lvasgn + expr.updated(:arg) + else + n(:arg_expr, [ expr ], + expr.loc.dup) + end + end + + def restarg_expr(star_t, expr=nil) + if expr.nil? + n0(:restarg, token_map(star_t)) + elsif expr.type == :lvasgn + expr.updated(:restarg) + else + n(:restarg_expr, [ expr ], + expr.loc.dup) + end + end + + def blockarg_expr(amper_t, expr) + if expr.type == :lvasgn + expr.updated(:blockarg) + else + n(:blockarg_expr, [ expr ], + expr.loc.dup) + end + end + + # MacRuby Objective-C arguments + + def objc_kwarg(kwname_t, assoc_t, name_t) + kwname_l = loc(kwname_t) + if assoc_t.nil? # a: b, not a => b + kwname_l = kwname_l.resize(kwname_l.size - 1) + operator_l = kwname_l.end.resize(1) + else + operator_l = loc(assoc_t) + end + + n(:objc_kwarg, [ value(kwname_t).to_sym, value(name_t).to_sym ], + Source::Map::ObjcKwarg.new(kwname_l, operator_l, loc(name_t), + kwname_l.join(loc(name_t)))) + end + + def objc_restarg(star_t, name=nil) + if name.nil? + n0(:restarg, arg_prefix_map(star_t)) + elsif name.type == :arg # regular restarg + name.updated(:restarg, nil, + { :location => name.loc.with_operator(loc(star_t)) }) + else # restarg with objc_kwarg inside + n(:objc_restarg, [ name ], + unary_op_map(star_t, name)) + end + end + + # + # Method calls + # + + def call_type_for_dot(dot_t) + if !dot_t.nil? && value(dot_t) == :anddot + :csend + else + # This case is a bit tricky. ruby23.y returns the token tDOT with + # the value :dot, and the token :tANDDOT with the value :anddot. + # + # But, ruby{18..22}.y (which unconditionally expect tDOT) just + # return "." there, since they are to be kept close to the corresponding + # Ruby MRI grammars. + # + # Thankfully, we don't have to care. + :send + end + end + + def forwarded_args(dots_t) + n(:forwarded_args, [], token_map(dots_t)) + end + + def call_method(receiver, dot_t, selector_t, + lparen_t=nil, args=[], rparen_t=nil) + type = call_type_for_dot(dot_t) + + if self.class.emit_kwargs + rewrite_hash_args_to_kwargs(args) + end + + if selector_t.nil? + n(type, [ receiver, :call, *args ], + send_map(receiver, dot_t, nil, lparen_t, args, rparen_t)) + else + n(type, [ receiver, value(selector_t).to_sym, *args ], + send_map(receiver, dot_t, selector_t, lparen_t, args, rparen_t)) + end + end + + def call_lambda(lambda_t) + if self.class.emit_lambda + n0(:lambda, expr_map(loc(lambda_t))) + else + n(:send, [ nil, :lambda ], + send_map(nil, nil, lambda_t)) + end + end + + def block(method_call, begin_t, args, body, end_t) + _receiver, _selector, *call_args = *method_call + + if method_call.type == :yield + diagnostic :error, :block_given_to_yield, nil, method_call.loc.keyword, [loc(begin_t)] + end + + last_arg = call_args.last + if last_arg && (last_arg.type == :block_pass || last_arg.type == :forwarded_args) + diagnostic :error, :block_and_blockarg, nil, last_arg.loc.expression, [loc(begin_t)] + end + + if args.type == :numargs + block_type = :numblock + args = args.children[0] + else + block_type = :block + end + + if [:send, :csend, :index, :super, :zsuper, :lambda].include?(method_call.type) + n(block_type, [ method_call, args, body ], + block_map(method_call.loc.expression, begin_t, end_t)) + else + # Code like "return foo 1 do end" is reduced in a weird sequence. + # Here, method_call is actually (return). + actual_send, = *method_call + block = + n(block_type, [ actual_send, args, body ], + block_map(actual_send.loc.expression, begin_t, end_t)) + + n(method_call.type, [ block ], + method_call.loc.with_expression(join_exprs(method_call, block))) + end + end + + def block_pass(amper_t, arg) + n(:block_pass, [ arg ], + unary_op_map(amper_t, arg)) + end + + def objc_varargs(pair, rest_of_varargs) + value, first_vararg = *pair + vararg_array = array(nil, [ first_vararg, *rest_of_varargs ], nil). + updated(:objc_varargs) + pair.updated(nil, [ value, vararg_array ], + { :location => pair.loc.with_expression( + pair.loc.expression.join(vararg_array.loc.expression)) }) + end + + def attr_asgn(receiver, dot_t, selector_t) + method_name = (value(selector_t) + '=').to_sym + type = call_type_for_dot(dot_t) + + # Incomplete method call. + n(type, [ receiver, method_name ], + send_map(receiver, dot_t, selector_t)) + end + + def index(receiver, lbrack_t, indexes, rbrack_t) + if self.class.emit_kwargs + rewrite_hash_args_to_kwargs(indexes) + end + + if self.class.emit_index + n(:index, [ receiver, *indexes ], + index_map(receiver, lbrack_t, rbrack_t)) + else + n(:send, [ receiver, :[], *indexes ], + send_index_map(receiver, lbrack_t, rbrack_t)) + end + end + + def index_asgn(receiver, lbrack_t, indexes, rbrack_t) + if self.class.emit_index + n(:indexasgn, [ receiver, *indexes ], + index_map(receiver, lbrack_t, rbrack_t)) + else + # Incomplete method call. + n(:send, [ receiver, :[]=, *indexes ], + send_index_map(receiver, lbrack_t, rbrack_t)) + end + end + + def binary_op(receiver, operator_t, arg) + source_map = send_binary_op_map(receiver, operator_t, arg) + + if @parser.version == 18 + operator = value(operator_t) + + if operator == '!=' + method_call = n(:send, [ receiver, :==, arg ], source_map) + elsif operator == '!~' + method_call = n(:send, [ receiver, :=~, arg ], source_map) + end + + if %w(!= !~).include?(operator) + return n(:not, [ method_call ], + expr_map(source_map.expression)) + end + end + + n(:send, [ receiver, value(operator_t).to_sym, arg ], + source_map) + end + + def match_op(receiver, match_t, arg) + source_map = send_binary_op_map(receiver, match_t, arg) + + if (regexp = static_regexp_node(receiver)) + regexp.names.each do |name| + @parser.static_env.declare(name) + end + + n(:match_with_lvasgn, [ receiver, arg ], + source_map) + else + n(:send, [ receiver, :=~, arg ], + source_map) + end + end + + def unary_op(op_t, receiver) + case value(op_t) + when '+', '-' + method = value(op_t) + '@' + else + method = value(op_t) + end + + n(:send, [ receiver, method.to_sym ], + send_unary_op_map(op_t, receiver)) + end + + def not_op(not_t, begin_t=nil, receiver=nil, end_t=nil) + if @parser.version == 18 + n(:not, [ check_condition(receiver) ], + unary_op_map(not_t, receiver)) + else + if receiver.nil? + nil_node = n0(:begin, collection_map(begin_t, nil, end_t)) + + n(:send, [ + nil_node, :'!' + ], send_unary_op_map(not_t, nil_node)) + else + n(:send, [ check_condition(receiver), :'!' ], + send_map(nil, nil, not_t, begin_t, [receiver], end_t)) + end + end + end + + # + # Control flow + # + + # Logical operations: and, or + + def logical_op(type, lhs, op_t, rhs) + n(type, [ lhs, rhs ], + binary_op_map(lhs, op_t, rhs)) + end + + # Conditionals + + def condition(cond_t, cond, then_t, + if_true, else_t, if_false, end_t) + n(:if, [ check_condition(cond), if_true, if_false ], + condition_map(cond_t, cond, then_t, if_true, else_t, if_false, end_t)) + end + + def condition_mod(if_true, if_false, cond_t, cond) + n(:if, [ check_condition(cond), if_true, if_false ], + keyword_mod_map(if_true || if_false, cond_t, cond)) + end + + def ternary(cond, question_t, if_true, colon_t, if_false) + n(:if, [ check_condition(cond), if_true, if_false ], + ternary_map(cond, question_t, if_true, colon_t, if_false)) + end + + # Case matching + + def when(when_t, patterns, then_t, body) + children = patterns << body + n(:when, children, + keyword_map(when_t, then_t, children, nil)) + end + + def case(case_t, expr, when_bodies, else_t, else_body, end_t) + n(:case, [ expr, *(when_bodies << else_body)], + condition_map(case_t, expr, nil, nil, else_t, else_body, end_t)) + end + + # Loops + + def loop(type, keyword_t, cond, do_t, body, end_t) + n(type, [ check_condition(cond), body ], + keyword_map(keyword_t, do_t, nil, end_t)) + end + + def loop_mod(type, body, keyword_t, cond) + if body.type == :kwbegin + type = :"#{type}_post" + end + + n(type, [ check_condition(cond), body ], + keyword_mod_map(body, keyword_t, cond)) + end + + def for(for_t, iterator, in_t, iteratee, + do_t, body, end_t) + n(:for, [ iterator, iteratee, body ], + for_map(for_t, in_t, do_t, end_t)) + end + + # Keywords + + def keyword_cmd(type, keyword_t, lparen_t=nil, args=[], rparen_t=nil) + if type == :yield && args.count > 0 + last_arg = args.last + if last_arg.type == :block_pass + diagnostic :error, :block_given_to_yield, nil, loc(keyword_t), [last_arg.loc.expression] + end + end + + if %i[yield super].include?(type) && self.class.emit_kwargs + rewrite_hash_args_to_kwargs(args) + end + + n(type, args, + keyword_map(keyword_t, lparen_t, args, rparen_t)) + end + + # BEGIN, END + + def preexe(preexe_t, lbrace_t, compstmt, rbrace_t) + n(:preexe, [ compstmt ], + keyword_map(preexe_t, lbrace_t, [], rbrace_t)) + end + + def postexe(postexe_t, lbrace_t, compstmt, rbrace_t) + n(:postexe, [ compstmt ], + keyword_map(postexe_t, lbrace_t, [], rbrace_t)) + end + + # Exception handling + + def rescue_body(rescue_t, + exc_list, assoc_t, exc_var, + then_t, compound_stmt) + n(:resbody, [ exc_list, exc_var, compound_stmt ], + rescue_body_map(rescue_t, exc_list, assoc_t, + exc_var, then_t, compound_stmt)) + end + + def begin_body(compound_stmt, rescue_bodies=[], + else_t=nil, else_=nil, + ensure_t=nil, ensure_=nil) + if rescue_bodies.any? + if else_t + compound_stmt = + n(:rescue, + [ compound_stmt, *(rescue_bodies + [ else_ ]) ], + eh_keyword_map(compound_stmt, nil, rescue_bodies, else_t, else_)) + else + compound_stmt = + n(:rescue, + [ compound_stmt, *(rescue_bodies + [ nil ]) ], + eh_keyword_map(compound_stmt, nil, rescue_bodies, nil, nil)) + end + elsif else_t + statements = [] + if !compound_stmt.nil? + if compound_stmt.type == :begin + statements += compound_stmt.children + else + statements.push(compound_stmt) + end + end + statements.push( + n(:begin, [ else_ ], + collection_map(else_t, [ else_ ], nil))) + compound_stmt = + n(:begin, statements, + collection_map(nil, statements, nil)) + end + + if ensure_t + compound_stmt = + n(:ensure, + [ compound_stmt, ensure_ ], + eh_keyword_map(compound_stmt, ensure_t, [ ensure_ ], nil, nil)) + end + + compound_stmt + end + + # + # Expression grouping + # + + def compstmt(statements) + case + when statements.none? + nil + when statements.one? + statements.first + else + n(:begin, statements, + collection_map(nil, statements, nil)) + end + end + + def begin(begin_t, body, end_t) + if body.nil? + # A nil expression: `()'. + n0(:begin, + collection_map(begin_t, nil, end_t)) + elsif body.type == :mlhs || + (body.type == :begin && + body.loc.begin.nil? && body.loc.end.nil?) + # Synthesized (begin) from compstmt "a; b" or (mlhs) + # from multi_lhs "(a, b) = *foo". + n(body.type, body.children, + collection_map(begin_t, body.children, end_t)) + else + n(:begin, [ body ], + collection_map(begin_t, [ body ], end_t)) + end + end + + def begin_keyword(begin_t, body, end_t) + if body.nil? + # A nil expression: `begin end'. + n0(:kwbegin, + collection_map(begin_t, nil, end_t)) + elsif (body.type == :begin && + body.loc.begin.nil? && body.loc.end.nil?) + # Synthesized (begin) from compstmt "a; b". + n(:kwbegin, body.children, + collection_map(begin_t, body.children, end_t)) + else + n(:kwbegin, [ body ], + collection_map(begin_t, [ body ], end_t)) + end + end + + # + # PATTERN MATCHING + # + + def case_match(case_t, expr, in_bodies, else_t, else_body, end_t) + else_body = n(:empty_else, nil, token_map(else_t)) if else_t && !else_body + n(:case_match, [ expr, *(in_bodies << else_body)], + condition_map(case_t, expr, nil, nil, else_t, else_body, end_t)) + end + + def in_match(lhs, in_t, rhs) + n(:in_match, [lhs, rhs], + binary_op_map(lhs, in_t, rhs)) + end + + def match_pattern(lhs, match_t, rhs) + n(:match_pattern, [lhs, rhs], + binary_op_map(lhs, match_t, rhs)) + end + + def match_pattern_p(lhs, match_t, rhs) + n(:match_pattern_p, [lhs, rhs], + binary_op_map(lhs, match_t, rhs)) + end + + def in_pattern(in_t, pattern, guard, then_t, body) + children = [pattern, guard, body] + n(:in_pattern, children, + keyword_map(in_t, then_t, children.compact, nil)) + end + + def if_guard(if_t, if_body) + n(:if_guard, [if_body], guard_map(if_t, if_body)) + end + + def unless_guard(unless_t, unless_body) + n(:unless_guard, [unless_body], guard_map(unless_t, unless_body)) + end + + def match_var(name_t) + name = value(name_t).to_sym + name_l = loc(name_t) + + check_lvar_name(name, name_l) + check_duplicate_pattern_variable(name, name_l) + @parser.static_env.declare(name) + + n(:match_var, [ name ], + variable_map(name_t)) + end + + def match_hash_var(name_t) + name = value(name_t).to_sym + + expr_l = loc(name_t) + name_l = expr_l.adjust(end_pos: -1) + + check_lvar_name(name, name_l) + check_duplicate_pattern_variable(name, name_l) + @parser.static_env.declare(name) + + n(:match_var, [ name ], + Source::Map::Variable.new(name_l, expr_l)) + end + + def match_hash_var_from_str(begin_t, strings, end_t) + if strings.length > 1 + diagnostic :error, :pm_interp_in_var_name, nil, loc(begin_t).join(loc(end_t)) + end + + string = strings[0] + + case string.type + when :str + # MRI supports plain strings in hash pattern matching + name, = *string + name_l = string.loc.expression + + check_lvar_name(name, name_l) + check_duplicate_pattern_variable(name, name_l) + + @parser.static_env.declare(name) + + if (begin_l = string.loc.begin) + # exclude beginning of the string from the location of the variable + name_l = name_l.adjust(begin_pos: begin_l.length) + end + + if (end_l = string.loc.end) + # exclude end of the string from the location of the variable + name_l = name_l.adjust(end_pos: -end_l.length) + end + + expr_l = loc(begin_t).join(string.loc.expression).join(loc(end_t)) + n(:match_var, [ name.to_sym ], + Source::Map::Variable.new(name_l, expr_l)) + when :begin + match_hash_var_from_str(begin_t, string.children, end_t) + else + # we only can get here if there is an interpolation, e.g., ``in "#{ a }":` + diagnostic :error, :pm_interp_in_var_name, nil, loc(begin_t).join(loc(end_t)) + end + end + + def match_rest(star_t, name_t = nil) + if name_t.nil? + n0(:match_rest, + unary_op_map(star_t)) + else + name = match_var(name_t) + n(:match_rest, [ name ], + unary_op_map(star_t, name)) + end + end + + def hash_pattern(lbrace_t, kwargs, rbrace_t) + args = check_duplicate_args(kwargs) + n(:hash_pattern, args, + collection_map(lbrace_t, args, rbrace_t)) + end + + def array_pattern(lbrack_t, elements, rbrack_t) + return n(:array_pattern, nil, collection_map(lbrack_t, [], rbrack_t)) if elements.nil? + + trailing_comma = false + + node_elements = elements.map do |element| + if element.type == :match_with_trailing_comma + trailing_comma = true + element.children.first + else + trailing_comma = false + element + end + end + + node_type = trailing_comma ? :array_pattern_with_tail : :array_pattern + + n(node_type, node_elements, + collection_map(lbrack_t, elements, rbrack_t)) + end + + def find_pattern(lbrack_t, elements, rbrack_t) + n(:find_pattern, elements, + collection_map(lbrack_t, elements, rbrack_t)) + end + + def match_with_trailing_comma(match, comma_t) + n(:match_with_trailing_comma, [ match ], expr_map(match.loc.expression.join(loc(comma_t)))) + end + + def const_pattern(const, ldelim_t, pattern, rdelim_t) + n(:const_pattern, [const, pattern], + Source::Map::Collection.new( + loc(ldelim_t), loc(rdelim_t), + const.loc.expression.join(loc(rdelim_t)) + ) + ) + end + + def pin(pin_t, var) + n(:pin, [ var ], + send_unary_op_map(pin_t, var)) + end + + def match_alt(left, pipe_t, right) + source_map = binary_op_map(left, pipe_t, right) + + n(:match_alt, [ left, right ], + source_map) + end + + def match_as(value, assoc_t, as) + source_map = binary_op_map(value, assoc_t, as) + + n(:match_as, [ value, as ], + source_map) + end + + def match_nil_pattern(dstar_t, nil_t) + n0(:match_nil_pattern, + arg_prefix_map(dstar_t, nil_t)) + end + + def match_pair(label_type, label, value) + if label_type == :label + check_duplicate_pattern_key(label[0], label[1]) + pair_keyword(label, value) + else + begin_t, parts, end_t = label + label_loc = loc(begin_t).join(loc(end_t)) + + # quoted label like "label": value + if (var_name = static_string(parts)) + check_duplicate_pattern_key(var_name, label_loc) + else + diagnostic :error, :pm_interp_in_var_name, nil, label_loc + end + + pair_quoted(begin_t, parts, end_t, value) + end + end + + def match_label(label_type, label) + if label_type == :label + match_hash_var(label) + else + # quoted label like "label": value + begin_t, strings, end_t = label + match_hash_var_from_str(begin_t, strings, end_t) + end + end + + private + + # + # VERIFICATION + # + + def check_condition(cond) + case cond.type + when :masgn + if @parser.version <= 23 + diagnostic :error, :masgn_as_condition, nil, cond.loc.expression + else + cond + end + + when :begin + if cond.children.count == 1 + cond.updated(nil, [ + check_condition(cond.children.last) + ]) + else + cond + end + + when :and, :or, :irange, :erange + lhs, rhs = *cond + + type = case cond.type + when :irange then :iflipflop + when :erange then :eflipflop + end + + if [:and, :or].include?(cond.type) && + @parser.version == 18 + cond + else + cond.updated(type, [ + check_condition(lhs), + check_condition(rhs) + ]) + end + + when :regexp + n(:match_current_line, [ cond ], expr_map(cond.loc.expression)) + + else + cond + end + end + + def check_duplicate_args(args, map={}) + args.each do |this_arg| + case this_arg.type + when :arg, :optarg, :restarg, :blockarg, + :kwarg, :kwoptarg, :kwrestarg, + :shadowarg + + check_duplicate_arg(this_arg, map) + + when :procarg0 + + if this_arg.children[0].is_a?(Symbol) + # s(:procarg0, :a) + check_duplicate_arg(this_arg, map) + else + # s(:procarg0, s(:arg, :a), ...) + check_duplicate_args(this_arg.children, map) + end + + when :mlhs + check_duplicate_args(this_arg.children, map) + end + end + end + + def check_duplicate_arg(this_arg, map={}) + this_name, = *this_arg + + that_arg = map[this_name] + that_name, = *that_arg + + if that_arg.nil? + map[this_name] = this_arg + elsif arg_name_collides?(this_name, that_name) + diagnostic :error, :duplicate_argument, nil, + this_arg.loc.name, [ that_arg.loc.name ] + end + end + + def validate_no_forward_arg_after_restarg(args) + restarg = nil + forward_arg = nil + args.each do |arg| + case arg.type + when :restarg then restarg = arg + when :forward_arg then forward_arg = arg + end + end + + if !forward_arg.nil? && !restarg.nil? + diagnostic :error, :forward_arg_after_restarg, nil, forward_arg.loc.expression, [restarg.loc.expression] + end + end + + def check_assignment_to_numparam(name, loc) + # MRI < 2.7 treats numbered parameters as regular variables + # and so it's allowed to perform assignments like `_1 = 42`. + return if @parser.version < 27 + + assigning_to_numparam = + @parser.context.in_dynamic_block? && + name =~ /\A_([1-9])\z/ && + @parser.max_numparam_stack.has_numparams? + + if assigning_to_numparam + diagnostic :error, :cant_assign_to_numparam, { :name => name }, loc + end + end + + def check_reserved_for_numparam(name, loc) + # MRI < 3.0 accepts assignemnt to variables like _1 + # if it's not a numbered parameter. MRI 3.0 and newer throws an error. + return if @parser.version < 30 + + if name =~ /\A_([1-9])\z/ + diagnostic :error, :reserved_for_numparam, { :name => name }, loc + end + end + + def arg_name_collides?(this_name, that_name) + case @parser.version + when 18 + this_name == that_name + when 19 + # Ignore underscore. + this_name != :_ && + this_name == that_name + else + # Ignore everything beginning with underscore. + this_name && this_name[0] != '_' && + this_name == that_name + end + end + + def check_lvar_name(name, loc) + if name =~ /\A[[[:lower:]]_][[[:alnum:]]_]*\z/ + # OK + else + diagnostic :error, :lvar_name, { name: name }, loc + end + end + + def check_duplicate_pattern_variable(name, loc) + return if name.to_s.start_with?('_') + + if @parser.pattern_variables.declared?(name) + diagnostic :error, :duplicate_variable_name, { name: name.to_s }, loc + end + + @parser.pattern_variables.declare(name) + end + + def check_duplicate_pattern_key(name, loc) + if @parser.pattern_hash_keys.declared?(name) + diagnostic :error, :duplicate_pattern_key, { name: name.to_s }, loc + end + + @parser.pattern_hash_keys.declare(name) + end + + # + # SOURCE MAPS + # + + def n(type, children, source_map) + AST::Node.new(type, children, :location => source_map) + end + + def n0(type, source_map) + n(type, [], source_map) + end + + def join_exprs(left_expr, right_expr) + left_expr.loc.expression. + join(right_expr.loc.expression) + end + + def token_map(token) + Source::Map.new(loc(token)) + end + + def delimited_string_map(string_t) + str_range = loc(string_t) + + begin_l = str_range.with(end_pos: str_range.begin_pos + 1) + + end_l = str_range.with(begin_pos: str_range.end_pos - 1) + + Source::Map::Collection.new(begin_l, end_l, + loc(string_t)) + end + + def prefix_string_map(symbol) + str_range = loc(symbol) + + begin_l = str_range.with(end_pos: str_range.begin_pos + 1) + + Source::Map::Collection.new(begin_l, nil, + loc(symbol)) + end + + def unquoted_map(token) + Source::Map::Collection.new(nil, nil, + loc(token)) + end + + def pair_keyword_map(key_t, value_e) + key_range = loc(key_t) + + key_l = key_range.adjust(end_pos: -1) + + colon_l = key_range.with(begin_pos: key_range.end_pos - 1) + + [ # key map + Source::Map::Collection.new(nil, nil, + key_l), + # pair map + Source::Map::Operator.new(colon_l, + key_range.join(value_e.loc.expression)) ] + end + + def pair_quoted_map(begin_t, end_t, value_e) + end_l = loc(end_t) + + quote_l = end_l.with(begin_pos: end_l.end_pos - 2, + end_pos: end_l.end_pos - 1) + + colon_l = end_l.with(begin_pos: end_l.end_pos - 1) + + [ # modified end token + [ value(end_t), quote_l ], + # pair map + Source::Map::Operator.new(colon_l, + loc(begin_t).join(value_e.loc.expression)) ] + end + + def expr_map(loc) + Source::Map.new(loc) + end + + def collection_map(begin_t, parts, end_t) + if begin_t.nil? || end_t.nil? + if parts.any? + expr_l = join_exprs(parts.first, parts.last) + elsif !begin_t.nil? + expr_l = loc(begin_t) + elsif !end_t.nil? + expr_l = loc(end_t) + end + else + expr_l = loc(begin_t).join(loc(end_t)) + end + + Source::Map::Collection.new(loc(begin_t), loc(end_t), expr_l) + end + + def string_map(begin_t, parts, end_t) + if begin_t && value(begin_t).start_with?('<<') + if parts.any? + expr_l = join_exprs(parts.first, parts.last) + else + expr_l = loc(end_t).begin + end + + Source::Map::Heredoc.new(loc(begin_t), expr_l, loc(end_t)) + else + collection_map(begin_t, parts, end_t) + end + end + + def regexp_map(begin_t, end_t, options_e) + Source::Map::Collection.new(loc(begin_t), loc(end_t), + loc(begin_t).join(options_e.loc.expression)) + end + + def constant_map(scope, colon2_t, name_t) + if scope.nil? + expr_l = loc(name_t) + else + expr_l = scope.loc.expression.join(loc(name_t)) + end + + Source::Map::Constant.new(loc(colon2_t), loc(name_t), expr_l) + end + + def variable_map(name_t) + Source::Map::Variable.new(loc(name_t)) + end + + def binary_op_map(left_e, op_t, right_e) + Source::Map::Operator.new(loc(op_t), join_exprs(left_e, right_e)) + end + + def unary_op_map(op_t, arg_e=nil) + if arg_e.nil? + expr_l = loc(op_t) + else + expr_l = loc(op_t).join(arg_e.loc.expression) + end + + Source::Map::Operator.new(loc(op_t), expr_l) + end + + def range_map(start_e, op_t, end_e) + if start_e && end_e + expr_l = join_exprs(start_e, end_e) + elsif start_e + expr_l = start_e.loc.expression.join(loc(op_t)) + elsif end_e + expr_l = loc(op_t).join(end_e.loc.expression) + end + + Source::Map::Operator.new(loc(op_t), expr_l) + end + + def arg_prefix_map(op_t, name_t=nil) + if name_t.nil? + expr_l = loc(op_t) + else + expr_l = loc(op_t).join(loc(name_t)) + end + + Source::Map::Variable.new(loc(name_t), expr_l) + end + + def kwarg_map(name_t, value_e=nil) + label_range = loc(name_t) + name_range = label_range.adjust(end_pos: -1) + + if value_e + expr_l = loc(name_t).join(value_e.loc.expression) + else + expr_l = loc(name_t) + end + + Source::Map::Variable.new(name_range, expr_l) + end + + def module_definition_map(keyword_t, name_e, operator_t, end_t) + if name_e + name_l = name_e.loc.expression + end + + Source::Map::Definition.new(loc(keyword_t), + loc(operator_t), name_l, + loc(end_t)) + end + + def definition_map(keyword_t, operator_t, name_t, end_t) + Source::Map::MethodDefinition.new(loc(keyword_t), + loc(operator_t), loc(name_t), + loc(end_t), nil, nil) + end + + def endless_definition_map(keyword_t, operator_t, name_t, assignment_t, body_e) + body_l = body_e.loc.expression + + Source::Map::MethodDefinition.new(loc(keyword_t), + loc(operator_t), loc(name_t), nil, + loc(assignment_t), body_l) + end + + def send_map(receiver_e, dot_t, selector_t, begin_t=nil, args=[], end_t=nil) + if receiver_e + begin_l = receiver_e.loc.expression + elsif selector_t + begin_l = loc(selector_t) + end + + if end_t + end_l = loc(end_t) + elsif args.any? + end_l = args.last.loc.expression + elsif selector_t + end_l = loc(selector_t) + end + + Source::Map::Send.new(loc(dot_t), loc(selector_t), + loc(begin_t), loc(end_t), + begin_l.join(end_l)) + end + + def var_send_map(variable_e) + Source::Map::Send.new(nil, variable_e.loc.expression, + nil, nil, + variable_e.loc.expression) + end + + def send_binary_op_map(lhs_e, selector_t, rhs_e) + Source::Map::Send.new(nil, loc(selector_t), + nil, nil, + join_exprs(lhs_e, rhs_e)) + end + + def send_unary_op_map(selector_t, arg_e) + if arg_e.nil? + expr_l = loc(selector_t) + else + expr_l = loc(selector_t).join(arg_e.loc.expression) + end + + Source::Map::Send.new(nil, loc(selector_t), + nil, nil, + expr_l) + end + + def index_map(receiver_e, lbrack_t, rbrack_t) + Source::Map::Index.new(loc(lbrack_t), loc(rbrack_t), + receiver_e.loc.expression.join(loc(rbrack_t))) + end + + def send_index_map(receiver_e, lbrack_t, rbrack_t) + Source::Map::Send.new(nil, loc(lbrack_t).join(loc(rbrack_t)), + nil, nil, + receiver_e.loc.expression.join(loc(rbrack_t))) + end + + def block_map(receiver_l, begin_t, end_t) + Source::Map::Collection.new(loc(begin_t), loc(end_t), + receiver_l.join(loc(end_t))) + end + + def keyword_map(keyword_t, begin_t, args, end_t) + args ||= [] + + if end_t + end_l = loc(end_t) + elsif args.any? && !args.last.nil? + end_l = args.last.loc.expression + elsif args.any? && args.count > 1 + end_l = args[-2].loc.expression + else + end_l = loc(keyword_t) + end + + Source::Map::Keyword.new(loc(keyword_t), loc(begin_t), loc(end_t), + loc(keyword_t).join(end_l)) + end + + def keyword_mod_map(pre_e, keyword_t, post_e) + Source::Map::Keyword.new(loc(keyword_t), nil, nil, + join_exprs(pre_e, post_e)) + end + + def condition_map(keyword_t, cond_e, begin_t, body_e, else_t, else_e, end_t) + if end_t + end_l = loc(end_t) + elsif else_e && else_e.loc.expression + end_l = else_e.loc.expression + elsif loc(else_t) + end_l = loc(else_t) + elsif body_e && body_e.loc.expression + end_l = body_e.loc.expression + elsif loc(begin_t) + end_l = loc(begin_t) + else + end_l = cond_e.loc.expression + end + + Source::Map::Condition.new(loc(keyword_t), + loc(begin_t), loc(else_t), loc(end_t), + loc(keyword_t).join(end_l)) + end + + def ternary_map(begin_e, question_t, mid_e, colon_t, end_e) + Source::Map::Ternary.new(loc(question_t), loc(colon_t), + join_exprs(begin_e, end_e)) + end + + def for_map(keyword_t, in_t, begin_t, end_t) + Source::Map::For.new(loc(keyword_t), loc(in_t), + loc(begin_t), loc(end_t), + loc(keyword_t).join(loc(end_t))) + end + + def rescue_body_map(keyword_t, exc_list_e, assoc_t, + exc_var_e, then_t, + compstmt_e) + end_l = compstmt_e.loc.expression if compstmt_e + end_l = loc(then_t) if end_l.nil? && then_t + end_l = exc_var_e.loc.expression if end_l.nil? && exc_var_e + end_l = exc_list_e.loc.expression if end_l.nil? && exc_list_e + end_l = loc(keyword_t) if end_l.nil? + + Source::Map::RescueBody.new(loc(keyword_t), loc(assoc_t), loc(then_t), + loc(keyword_t).join(end_l)) + end + + def eh_keyword_map(compstmt_e, keyword_t, body_es, + else_t, else_e) + if compstmt_e.nil? + if keyword_t.nil? + begin_l = body_es.first.loc.expression + else + begin_l = loc(keyword_t) + end + else + begin_l = compstmt_e.loc.expression + end + + if else_t + if else_e.nil? + end_l = loc(else_t) + else + end_l = else_e.loc.expression + end + elsif !body_es.last.nil? + end_l = body_es.last.loc.expression + else + end_l = loc(keyword_t) + end + + Source::Map::Condition.new(loc(keyword_t), nil, loc(else_t), nil, + begin_l.join(end_l)) + end + + def guard_map(keyword_t, guard_body_e) + keyword_l = loc(keyword_t) + guard_body_l = guard_body_e.loc.expression + + Source::Map::Keyword.new(keyword_l, nil, nil, keyword_l.join(guard_body_l)) + end + + # + # HELPERS + # + + # Extract a static string from e.g. a regular expression, + # honoring the fact that MRI expands interpolations like #{""} + # at parse time. + def static_string(nodes) + nodes.map do |node| + case node.type + when :str + node.children[0] + when :begin + if (string = static_string(node.children)) + string + else + return nil + end + else + return nil + end + end.join + end + + def static_regexp(parts, options) + source = static_string(parts) + return nil if source.nil? + + source = case + when options.children.include?(:u) + source.encode(Encoding::UTF_8) + when options.children.include?(:e) + source.encode(Encoding::EUC_JP) + when options.children.include?(:s) + source.encode(Encoding::WINDOWS_31J) + when options.children.include?(:n) + source.encode(Encoding::BINARY) + else + source + end + + Regexp.new(source, (Regexp::EXTENDED if options.children.include?(:x))) + end + + def static_regexp_node(node) + if node.type == :regexp + parts, options = node.children[0..-2], node.children[-1] + static_regexp(parts, options) + end + end + + def collapse_string_parts?(parts) + parts.one? && + [:str, :dstr].include?(parts.first.type) + end + + def value(token) + token[0] + end + + def string_value(token) + unless token[0].valid_encoding? + diagnostic(:error, :invalid_encoding, nil, token[1]) + end + + token[0] + end + + def loc(token) + # Pass through `nil`s and return nil for tNL. + token[1] if token && token[0] + end + + def diagnostic(type, reason, arguments, location, highlights=[]) + @parser.diagnostics.process( + Diagnostic.new(type, reason, arguments, location, highlights)) + + if type == :error + @parser.send :yyerror + end + end + + def validate_definee(definee) + case definee.type + when :int, :str, :dstr, :sym, :dsym, + :regexp, :array, :hash + + diagnostic :error, :singleton_literal, nil, definee.loc.expression + false + else + true + end + end + + def rewrite_hash_args_to_kwargs(args) + if args.any? && kwargs?(args.last) + # foo(..., bar: baz) + args[args.length - 1] = args[args.length - 1].updated(:kwargs) + elsif args.length > 1 && args.last.type == :block_pass && kwargs?(args[args.length - 2]) + # foo(..., bar: baz, &blk) + args[args.length - 2] = args[args.length - 2].updated(:kwargs) + end + end + + def kwargs?(node) + node.type == :hash && node.loc.begin.nil? && node.loc.end.nil? + end + end + +end diff --git a/vendor/bundle/ruby/3.1.0/gems/parser-3.1.2.0/lib/parser/clobbering_error.rb b/vendor/bundle/ruby/3.1.0/gems/parser-3.1.2.0/lib/parser/clobbering_error.rb new file mode 100644 index 000000000..61240c3d1 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/parser-3.1.2.0/lib/parser/clobbering_error.rb @@ -0,0 +1,13 @@ +# frozen_string_literal: true + +module Parser + ## + # {Parser::ClobberingError} is raised when {Parser::Source::Rewriter} + # detects a clobbering rewrite action. This class inherits {RuntimeError} + # rather than {StandardError} for backward compatibility. + # + # @api public + # + class ClobberingError < RuntimeError + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/parser-3.1.2.0/lib/parser/color.rb b/vendor/bundle/ruby/3.1.0/gems/parser-3.1.2.0/lib/parser/color.rb new file mode 100644 index 000000000..d528f79b5 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/parser-3.1.2.0/lib/parser/color.rb @@ -0,0 +1,32 @@ +# frozen_string_literal: true + +module Parser + module Color + def self.color(str, code, bold: false) + return str unless STDOUT.tty? + code = Array(code) + code.unshift(1) if bold + "\e[#{code.join(';')}m#{str}\e[0m" + end + + def self.red(str, bold: false) + color(str, 31, bold: bold) + end + + def self.green(str, bold: false) + color(str, 32, bold: bold) + end + + def self.yellow(str, bold: false) + color(str, 33, bold: bold) + end + + def self.magenta(str, bold: false) + color(str, 35, bold: bold) + end + + def self.underline(str) + color(str, 4) + end + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/parser-3.1.2.0/lib/parser/context.rb b/vendor/bundle/ruby/3.1.0/gems/parser-3.1.2.0/lib/parser/context.rb new file mode 100644 index 000000000..ff5f24dcf --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/parser-3.1.2.0/lib/parser/context.rb @@ -0,0 +1,49 @@ +# frozen_string_literal: true + +module Parser + # Context of parsing that is represented by a stack of scopes. + # + # Supported states: + # + :class - in the class body (class A; end) + # + :module - in the module body (module M; end) + # + :sclass - in the singleton class body (class << obj; end) + # + :def - in the method body (def m; end) + # + :defs - in the singleton method body (def self.m; end) + # + :def_open_args - in the arglist of the method definition + # keep in mind that it's set **only** after reducing the first argument, + # if you need to handle the first argument check `lex_state == expr_fname` + # + :block - in the block body (tap {}) + # + :lambda - in the lambda body (-> {}) + # + class Context + FLAGS = %i[ + in_defined + in_kwarg + in_argdef + in_def + in_class + in_block + in_lambda + ] + + def initialize + reset + end + + def reset + @in_defined = false + @in_kwarg = false + @in_argdef = false + @in_def = false + @in_class = false + @in_block = false + @in_lambda = false + end + + attr_accessor(*FLAGS) + + def in_dynamic_block? + in_block || in_lambda + end + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/parser-3.1.2.0/lib/parser/current.rb b/vendor/bundle/ruby/3.1.0/gems/parser-3.1.2.0/lib/parser/current.rb new file mode 100644 index 000000000..45caf83b3 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/parser-3.1.2.0/lib/parser/current.rb @@ -0,0 +1,119 @@ +# frozen_string_literal: true + +module Parser + class << self + def warn_syntax_deviation(feature, version) + warn "warning: parser/current is loading #{feature}, which recognizes" \ + "#{version}-compliant syntax, but you are running #{RUBY_VERSION}.\n" \ + "Please see https://github.com/whitequark/parser#compatibility-with-ruby-mri." + end + private :warn_syntax_deviation + end + + case RUBY_VERSION + when /^2\.0\./ + current_version = '2.0.0' + if RUBY_VERSION != current_version + warn_syntax_deviation 'parser/ruby20', current_version + end + + require 'parser/ruby20' + CurrentRuby = Ruby20 + + when /^2\.1\./ + current_version = '2.1.10' + if RUBY_VERSION != current_version + warn_syntax_deviation 'parser/ruby21', current_version + end + + require 'parser/ruby21' + CurrentRuby = Ruby21 + + when /^2\.2\./ + current_version = '2.2.10' + if RUBY_VERSION != current_version + warn_syntax_deviation 'parser/ruby22', current_version + end + + require 'parser/ruby22' + CurrentRuby = Ruby22 + + when /^2\.3\./ + current_version = '2.3.8' + if RUBY_VERSION != current_version + warn_syntax_deviation 'parser/ruby23', current_version + end + + require 'parser/ruby23' + CurrentRuby = Ruby23 + + when /^2\.4\./ + current_version = '2.4.10' + if RUBY_VERSION != current_version + warn_syntax_deviation 'parser/ruby24', current_version + end + + require 'parser/ruby24' + CurrentRuby = Ruby24 + + when /^2\.5\./ + current_version = '2.5.9' + if RUBY_VERSION != current_version + warn_syntax_deviation 'parser/ruby25', current_version + end + + require 'parser/ruby25' + CurrentRuby = Ruby25 + + when /^2\.6\./ + current_version = '2.6.10' + if RUBY_VERSION != current_version + warn_syntax_deviation 'parser/ruby26', current_version + end + + require 'parser/ruby26' + CurrentRuby = Ruby26 + + when /^2\.7\./ + current_version = '2.7.6' + if RUBY_VERSION != current_version + warn_syntax_deviation 'parser/ruby27', current_version + end + + require 'parser/ruby27' + CurrentRuby = Ruby27 + + when /^3\.0\./ + current_version = '3.0.4' + if RUBY_VERSION != current_version + warn_syntax_deviation 'parser/ruby30', current_version + end + + require 'parser/ruby30' + CurrentRuby = Ruby30 + + when /^3\.1\./ + current_version = '3.1.2' + if RUBY_VERSION != current_version + warn_syntax_deviation 'parser/ruby31', current_version + end + + require 'parser/ruby31' + CurrentRuby = Ruby31 + + when /^3\.2\./ + current_version = '3.2.0-dev' + if RUBY_VERSION != current_version + warn_syntax_deviation 'parser/ruby32', current_version + end + + require 'parser/ruby32' + CurrentRuby = Ruby32 + + else # :nocov: + # Keep this in sync with released Ruby. + warn_syntax_deviation 'parser/ruby31', '3.1.x' + require 'parser/ruby31' + CurrentRuby = Ruby31 + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/parser-3.1.2.0/lib/parser/current_arg_stack.rb b/vendor/bundle/ruby/3.1.0/gems/parser-3.1.2.0/lib/parser/current_arg_stack.rb new file mode 100644 index 000000000..d0d580274 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/parser-3.1.2.0/lib/parser/current_arg_stack.rb @@ -0,0 +1,46 @@ +# frozen_string_literal: true + +module Parser + # Stack that holds names of current arguments, + # i.e. while parsing + # def m1(a = (def m2(b = def m3(c = 1); end); end)); end + # ^ + # stack is [:a, :b, :c] + # + # Emulates `p->cur_arg` in MRI's parse.y + # + # @api private + # + class CurrentArgStack + attr_reader :stack + + def initialize + @stack = [] + freeze + end + + def empty? + @stack.size == 0 + end + + def push(value) + @stack << value + end + + def set(value) + @stack[@stack.length - 1] = value + end + + def pop + @stack.pop + end + + def reset + @stack.clear + end + + def top + @stack.last + end + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/parser-3.1.2.0/lib/parser/deprecation.rb b/vendor/bundle/ruby/3.1.0/gems/parser-3.1.2.0/lib/parser/deprecation.rb new file mode 100644 index 000000000..0e9b6ed7b --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/parser-3.1.2.0/lib/parser/deprecation.rb @@ -0,0 +1,13 @@ +# frozen_string_literal: true + +module Parser + ## + # @api private + # + module Deprecation + attr_writer :warned_of_deprecation + def warn_of_deprecation + @warned_of_deprecation ||= warn(self::DEPRECATION_WARNING) || true + end + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/parser-3.1.2.0/lib/parser/diagnostic.rb b/vendor/bundle/ruby/3.1.0/gems/parser-3.1.2.0/lib/parser/diagnostic.rb new file mode 100644 index 000000000..e9f1b0a94 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/parser-3.1.2.0/lib/parser/diagnostic.rb @@ -0,0 +1,163 @@ +# frozen_string_literal: true + +module Parser + + ## + # @api public + # + # @!attribute [r] level + # @see LEVELS + # @return [Symbol] diagnostic level + # + # @!attribute [r] reason + # @see Parser::MESSAGES + # @return [Symbol] reason for error + # + # @!attribute [r] arguments + # @see Parser::MESSAGES + # @return [Symbol] extended arguments that describe the error + # + # @!attribute [r] message + # @return [String] error message + # + # @!attribute [r] location + # Main error-related source range. + # @return [Parser::Source::Range] + # + # @!attribute [r] highlights + # Supplementary error-related source ranges. + # @return [Array] + # + class Diagnostic + ## + # Collection of the available diagnostic levels. + # + # @return [Array] + # + LEVELS = [:note, :warning, :error, :fatal].freeze + + attr_reader :level, :reason, :arguments + attr_reader :location, :highlights + + ## + # @param [Symbol] level + # @param [Symbol] reason + # @param [Hash] arguments + # @param [Parser::Source::Range] location + # @param [Array] highlights + # + def initialize(level, reason, arguments, location, highlights=[]) + unless LEVELS.include?(level) + raise ArgumentError, + "Diagnostic#level must be one of #{LEVELS.join(', ')}; " \ + "#{level.inspect} provided." + end + raise 'Expected a location' unless location + + @level = level + @reason = reason + @arguments = (arguments || {}).dup.freeze + @location = location + @highlights = highlights.dup.freeze + + freeze + end + + ## + # @return [String] the rendered message. + # + def message + Messages.compile(@reason, @arguments) + end + + ## + # Renders the diagnostic message as a clang-like diagnostic. + # + # @example + # diagnostic.render # => + # # [ + # # "(fragment:0):1:5: error: unexpected token $end", + # # "foo +", + # # " ^" + # # ] + # + # @return [Array] + # + def render + if @location.line == @location.last_line || @location.is?("\n") + ["#{@location}: #{@level}: #{message}"] + render_line(@location) + else + # multi-line diagnostic + first_line = first_line_only(@location) + last_line = last_line_only(@location) + num_lines = (@location.last_line - @location.line) + 1 + buffer = @location.source_buffer + + last_lineno, last_column = buffer.decompose_position(@location.end_pos) + ["#{@location}-#{last_lineno}:#{last_column}: #{@level}: #{message}"] + + render_line(first_line, num_lines > 2, false) + + render_line(last_line, false, true) + end + end + + private + + ## + # Renders one source line in clang diagnostic style, with highlights. + # + # @return [Array] + # + def render_line(range, ellipsis=false, range_end=false) + source_line = range.source_line + highlight_line = ' ' * source_line.length + + @highlights.each do |highlight| + line_range = range.source_buffer.line_range(range.line) + if highlight = highlight.intersect(line_range) + highlight_line[highlight.column_range] = '~' * highlight.size + end + end + + if range.is?("\n") + highlight_line += "^" + else + if !range_end && range.size >= 1 + highlight_line[range.column_range] = '^' + '~' * (range.size - 1) + else + highlight_line[range.column_range] = '~' * range.size + end + end + + highlight_line += '...' if ellipsis + + [source_line, highlight_line]. + map { |line| "#{range.source_buffer.name}:#{range.line}: #{line}" } + end + + ## + # If necessary, shrink a `Range` so as to include only the first line. + # + # @return [Parser::Source::Range] + # + def first_line_only(range) + if range.line != range.last_line + range.resize(range.source =~ /\n/) + else + range + end + end + + ## + # If necessary, shrink a `Range` so as to include only the last line. + # + # @return [Parser::Source::Range] + # + def last_line_only(range) + if range.line != range.last_line + range.adjust(begin_pos: range.source =~ /[^\n]*\z/) + else + range + end + end + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/parser-3.1.2.0/lib/parser/diagnostic/engine.rb b/vendor/bundle/ruby/3.1.0/gems/parser-3.1.2.0/lib/parser/diagnostic/engine.rb new file mode 100644 index 000000000..a29f61789 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/parser-3.1.2.0/lib/parser/diagnostic/engine.rb @@ -0,0 +1,104 @@ +# frozen_string_literal: true + +module Parser + + ## + # {Parser::Diagnostic::Engine} provides a basic API for dealing with + # diagnostics by delegating them to registered consumers. + # + # @example + # buffer = Parser::Source::Buffer.new(__FILE__, source: 'foobar') + # + # consumer = lambda do |diagnostic| + # puts diagnostic.message + # end + # + # engine = Parser::Diagnostic::Engine.new(consumer) + # diagnostic = Parser::Diagnostic.new( + # :warning, :unexpected_token, { :token => 'abc' }, buffer, 1..2) + # + # engine.process(diagnostic) # => "unexpected token abc" + # + # @api public + # + # @!attribute [rw] consumer + # @return [#call(Diagnostic)] + # + # @!attribute [rw] all_errors_are_fatal + # When set to `true` any error that is encountered will result in + # {Parser::SyntaxError} being raised. + # @return [Boolean] + # + # @!attribute [rw] ignore_warnings + # When set to `true` warnings will be ignored. + # @return [Boolean] + # + class Diagnostic::Engine + attr_accessor :consumer + + attr_accessor :all_errors_are_fatal + attr_accessor :ignore_warnings + + ## + # @param [#call(Diagnostic)] consumer + # + def initialize(consumer=nil) + @consumer = consumer + + @all_errors_are_fatal = false + @ignore_warnings = false + end + + ## + # Processes a `diagnostic`: + # * Passes the diagnostic to the consumer, if it's not a warning when + # `ignore_warnings` is set. + # * After that, raises {Parser::SyntaxError} when `all_errors_are_fatal` + # is set to true. + # + # @param [Parser::Diagnostic] diagnostic + # @return [Parser::Diagnostic::Engine] + # @see ignore? + # @see raise? + # + def process(diagnostic) + if ignore?(diagnostic) + # do nothing + elsif @consumer + @consumer.call(diagnostic) + end + + if raise?(diagnostic) + raise Parser::SyntaxError, diagnostic + end + + self + end + + protected + + ## + # Checks whether `diagnostic` should be ignored. + # + # @param [Parser::Diagnostic] diagnostic + # @return [Boolean] + # + def ignore?(diagnostic) + @ignore_warnings && + diagnostic.level == :warning + end + + ## + # Checks whether `diagnostic` should be raised as an exception. + # + # @param [Parser::Diagnostic] diagnostic + # @return [Boolean] + # + def raise?(diagnostic) + (@all_errors_are_fatal && + diagnostic.level == :error) || + diagnostic.level == :fatal + end + end + +end diff --git a/vendor/bundle/ruby/3.1.0/gems/parser-3.1.2.0/lib/parser/lexer.rb b/vendor/bundle/ruby/3.1.0/gems/parser-3.1.2.0/lib/parser/lexer.rb new file mode 100644 index 000000000..e7e0d4176 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/parser-3.1.2.0/lib/parser/lexer.rb @@ -0,0 +1,25015 @@ +# -*- encoding:utf-8; warn-indent:false; frozen_string_literal: true -*- + +# line 1 "lib/parser/lexer.rl" + +# line 3 "lib/parser/lexer.rl" +# +# === BEFORE YOU START === +# +# Read the Ruby Hacking Guide chapter 11, available in English at +# http://whitequark.org/blog/2013/04/01/ruby-hacking-guide-ch-11-finite-state-lexer/ +# +# Remember two things about Ragel scanners: +# +# 1) Longest match wins. +# +# 2) If two matches have the same length, the first +# in source code wins. +# +# General rules of making Ragel and Bison happy: +# +# * `p` (position) and `@te` contain the index of the character +# they're pointing to ("current"), plus one. `@ts` contains the index +# of the corresponding character. The code for extracting matched token is: +# +# @source_buffer.slice(@ts...@te) +# +# * If your input is `foooooooobar` and the rule is: +# +# 'f' 'o'+ +# +# the result will be: +# +# foooooooobar +# ^ ts=0 ^ p=te=9 +# +# * A Ragel lexer action should not emit more than one token, unless +# you know what you are doing. +# +# * All Ragel commands (fnext, fgoto, ...) end with a semicolon. +# +# * If an action emits the token and transitions to another state, use +# these Ragel commands: +# +# emit($whatever) +# fnext $next_state; fbreak; +# +# If you perform `fgoto` in an action which does not emit a token nor +# rewinds the stream pointer, the parser's side-effectful, +# context-sensitive lookahead actions will break in a hard to detect +# and debug way. +# +# * If an action does not emit a token: +# +# fgoto $next_state; +# +# * If an action features lookbehind, i.e. matches characters with the +# intent of passing them to another action: +# +# p = @ts - 1 +# fgoto $next_state; +# +# or, if the lookbehind consists of a single character: +# +# fhold; fgoto $next_state; +# +# * Ragel merges actions. So, if you have `e_lparen = '(' %act` and +# `c_lparen = '('` and a lexer action `e_lparen | c_lparen`, the result +# _will_ invoke the action `act`. +# +# e_something stands for "something with **e**mbedded action". +# +# * EOF is explicit and is matched by `c_eof`. If you want to introspect +# the state of the lexer, add this rule to the state: +# +# c_eof => do_eof; +# +# * If you proceed past EOF, the lexer will complain: +# +# NoMethodError: undefined method `ord' for nil:NilClass +# + +class Parser::Lexer + + +# line 85 "lib/parser/lexer.rb" +class << self + attr_accessor :_lex_trans_keys + private :_lex_trans_keys, :_lex_trans_keys= +end +self._lex_trans_keys = [ + 0, 0, 101, 101, 103, 103, + 105, 105, 110, 110, 69, + 69, 78, 78, 68, 68, + 95, 95, 95, 95, 0, 26, + 0, 127, 0, 127, 0, + 127, 0, 127, 0, 45, + 0, 120, 0, 120, 0, 92, + 0, 120, 0, 120, 0, + 45, 0, 120, 0, 120, + 67, 99, 45, 45, 0, 92, + 0, 120, 0, 102, 0, + 127, 0, 127, 0, 127, + 0, 127, 0, 45, 0, 120, + 0, 120, 0, 92, 0, + 120, 0, 120, 0, 45, + 0, 120, 0, 120, 67, 99, + 45, 45, 0, 92, 0, + 120, 0, 102, 0, 127, + 0, 127, 0, 127, 0, 127, + 0, 127, 0, 127, 0, + 127, 0, 127, 0, 127, + 0, 127, 0, 127, 0, 127, + 0, 127, 0, 127, 0, + 127, 58, 58, 58, 58, + 46, 46, 0, 127, 58, 58, + 60, 60, 62, 62, 10, + 10, 0, 127, 0, 127, + 0, 127, 0, 127, 0, 127, + 0, 127, 0, 127, 0, + 127, 0, 127, 0, 127, + 0, 127, 0, 127, 0, 127, + 0, 127, 0, 127, 0, + 127, 0, 127, 0, 127, + 115, 115, 99, 99, 117, 117, + 101, 101, 108, 116, 101, + 101, 115, 115, 115, 115, + 105, 105, 108, 108, 105, 105, + 108, 108, 58, 58, 0, + 127, 10, 10, 0, 127, + 9, 92, 10, 10, 9, 92, + 58, 58, 98, 98, 101, + 101, 103, 103, 105, 105, + 110, 110, 0, 127, 61, 61, + 9, 92, 9, 92, 9, + 92, 9, 92, 9, 92, + 10, 10, 0, 127, 0, 127, + 61, 126, 93, 93, 0, + 127, 0, 127, 10, 10, + 34, 34, 10, 10, 39, 39, + 0, 127, 10, 96, 96, + 96, 0, 45, 0, 120, + 0, 120, 0, 92, 0, 120, + 0, 120, 0, 45, 0, + 120, 0, 120, 67, 99, + 45, 45, 0, 92, 0, 120, + 0, 102, 0, 127, 0, + 127, 0, 127, 0, 127, + 0, 127, 0, 127, 58, 58, + 58, 58, 0, 127, 43, + 57, 48, 57, 48, 57, + 48, 57, 48, 57, 115, 115, + 99, 99, 117, 117, 101, + 101, 99, 99, 117, 117, + 101, 101, 0, 127, 58, 58, + 9, 92, 9, 92, 9, + 92, 9, 92, 9, 92, + 9, 92, 60, 60, 10, 10, + 9, 92, 9, 92, 10, + 10, 10, 10, 10, 10, + 10, 10, 46, 46, 0, 95, + 9, 32, 0, 0, 10, + 10, 10, 10, 98, 98, + 9, 32, 10, 10, 95, 95, + 0, 92, 9, 32, 36, + 123, 0, 127, 48, 57, + 0, 127, 0, 120, 0, 0, + 0, 0, 48, 55, 48, + 55, 0, 0, 0, 0, + 0, 92, 0, 0, 0, 0, + 0, 0, 0, 92, 45, + 45, 0, 0, 0, 0, + 0, 0, 0, 92, 48, 102, + 48, 102, 0, 0, 48, + 102, 48, 102, 0, 0, + 0, 45, 0, 92, 0, 92, + 0, 0, 0, 0, 0, + 92, 48, 102, 48, 102, + 0, 0, 0, 45, 10, 10, + 0, 92, 48, 123, 48, + 102, 48, 102, 48, 102, + 0, 0, 0, 125, 0, 125, + 0, 0, 0, 125, 0, + 0, 0, 125, 0, 125, + 0, 125, 0, 125, 0, 0, + 0, 125, 0, 125, 0, + 125, 0, 125, 0, 125, + 0, 125, 0, 0, 0, 0, + 48, 102, 0, 0, 0, + 92, 36, 123, 0, 127, + 48, 57, 0, 127, 0, 120, + 0, 0, 0, 0, 48, + 55, 48, 55, 0, 0, + 0, 0, 0, 92, 0, 0, + 0, 0, 0, 0, 0, + 92, 45, 45, 0, 0, + 0, 0, 0, 0, 0, 92, + 48, 102, 48, 102, 0, + 0, 48, 102, 48, 102, + 0, 0, 0, 45, 0, 92, + 0, 92, 0, 0, 0, + 0, 0, 92, 48, 102, + 48, 102, 0, 0, 0, 45, + 10, 10, 0, 92, 48, + 123, 48, 102, 48, 102, + 48, 102, 0, 0, 0, 125, + 0, 125, 0, 0, 0, + 125, 0, 0, 0, 125, + 0, 125, 0, 125, 0, 125, + 0, 0, 0, 125, 0, + 125, 0, 125, 0, 125, + 0, 125, 0, 125, 0, 0, + 0, 0, 48, 102, 0, + 0, 0, 92, 9, 32, + 0, 26, 0, 92, 0, 26, + 0, 35, 36, 123, 0, + 127, 48, 57, 0, 127, + 0, 26, 0, 35, 9, 32, + 36, 123, 0, 127, 48, + 57, 0, 127, 0, 32, + 9, 32, 65, 122, 65, 122, + 36, 64, 0, 127, 48, + 57, 0, 127, 0, 127, + 0, 127, 0, 127, 9, 32, + 0, 0, 61, 126, 10, + 10, 10, 10, 0, 127, + 0, 127, 48, 57, 115, 115, + 38, 38, 42, 42, 64, + 64, 58, 58, 60, 61, + 62, 62, 61, 126, 61, 61, + 61, 62, 0, 127, 0, + 127, 0, 127, 0, 127, + 0, 127, 0, 127, 0, 127, + 93, 93, 10, 10, 0, + 127, 0, 127, 0, 127, + 0, 127, 0, 127, 0, 127, + 0, 127, 0, 127, 0, + 127, 0, 127, 0, 127, + 0, 127, 0, 127, 0, 127, + 0, 127, 0, 127, 0, + 127, 0, 127, 0, 127, + 0, 127, 0, 127, 0, 127, + 0, 127, 0, 127, 0, + 127, 0, 127, 0, 127, + 0, 127, 0, 127, 0, 127, + 0, 127, 0, 127, 0, + 127, 0, 127, 0, 127, + 0, 127, 0, 127, 0, 127, + 0, 127, 0, 127, 0, + 127, 0, 127, 0, 127, + 0, 127, 0, 127, 0, 127, + 0, 127, 0, 127, 0, + 127, 0, 127, 0, 127, + 0, 127, 0, 127, 0, 127, + 0, 127, 0, 127, 0, + 127, 0, 127, 0, 127, + 0, 127, 0, 127, 0, 127, + 0, 127, 0, 127, 0, + 127, 0, 127, 0, 127, + 0, 127, 0, 127, 0, 127, + 0, 127, 0, 127, 0, + 127, 0, 127, 0, 127, + 0, 127, 0, 127, 0, 127, + 0, 127, 0, 127, 0, + 127, 0, 127, 0, 127, + 124, 124, 0, 127, 0, 127, + 9, 32, 10, 10, 10, + 10, 46, 46, 10, 10, + 0, 0, 0, 127, 0, 127, + 61, 61, 0, 0, 9, + 32, 0, 0, 61, 126, + 10, 10, 10, 10, 38, 38, + 42, 42, 64, 64, 60, + 61, 62, 62, 61, 126, + 61, 61, 61, 62, 0, 127, + 93, 93, 10, 10, 124, + 124, 0, 126, 0, 127, + 0, 61, 9, 61, 9, 61, + 0, 0, 9, 61, 9, + 62, 46, 46, 46, 46, + 58, 58, 9, 32, 0, 0, + 0, 127, 0, 0, 9, + 124, 0, 0, 10, 10, + 10, 10, 0, 0, 9, 61, + 58, 58, 60, 60, 62, + 62, 9, 32, 10, 10, + 0, 127, 102, 102, 101, 101, + 110, 110, 104, 104, 0, + 127, 0, 127, 0, 127, + 0, 0, 0, 127, 10, 10, + 0, 123, 9, 32, 10, + 10, 10, 10, 10, 10, + 0, 0, 111, 111, 0, 0, + 0, 127, 0, 127, 9, + 32, 0, 0, 10, 10, + 10, 10, 10, 10, 0, 0, + 0, 127, 0, 127, 0, + 127, 0, 127, 0, 127, + 0, 127, 0, 127, 0, 127, + 0, 127, 0, 127, 0, + 127, 0, 127, 0, 127, + 0, 127, 0, 127, 0, 127, + 0, 127, 0, 127, 58, + 61, 0, 0, 61, 126, + 61, 61, 0, 0, 0, 0, + 0, 0, 9, 32, 61, + 61, 9, 32, 61, 126, + 10, 10, 10, 10, 0, 127, + 38, 61, 0, 0, 42, + 61, 61, 61, 9, 92, + 9, 92, 9, 92, 46, 46, + 46, 46, 10, 10, 0, + 26, 0, 127, 0, 127, + 61, 61, 0, 0, 61, 126, + 61, 62, 0, 0, 0, + 0, 0, 0, 0, 0, + 61, 126, 0, 127, 48, 57, + 38, 38, 42, 42, 64, + 64, 60, 61, 62, 62, + 61, 61, 61, 62, 0, 127, + 48, 57, 0, 127, 124, + 124, 64, 64, 60, 61, + 0, 0, 10, 34, 10, 39, + 96, 96, 62, 62, 61, + 126, 61, 62, 0, 122, + 0, 0, 0, 127, 0, 127, + 0, 120, 0, 0, 0, + 0, 48, 55, 48, 55, + 0, 0, 0, 0, 0, 92, + 0, 0, 0, 0, 0, + 0, 0, 92, 45, 45, + 0, 0, 0, 0, 0, 0, + 0, 92, 48, 102, 48, + 102, 0, 0, 48, 102, + 48, 102, 0, 0, 0, 45, + 0, 92, 0, 92, 0, + 0, 0, 0, 0, 92, + 48, 102, 48, 102, 0, 0, + 0, 45, 10, 10, 0, + 92, 48, 123, 48, 102, + 48, 102, 48, 102, 0, 0, + 0, 125, 0, 125, 0, + 0, 0, 125, 0, 0, + 0, 125, 0, 125, 0, 125, + 0, 125, 0, 0, 0, + 125, 0, 125, 0, 125, + 0, 125, 0, 125, 0, 125, + 0, 125, 0, 125, 0, + 125, 0, 125, 0, 125, + 0, 125, 0, 125, 0, 125, + 0, 125, 0, 125, 0, + 125, 0, 125, 0, 125, + 0, 0, 0, 0, 48, 102, + 0, 0, 0, 127, 0, + 127, 0, 127, 0, 0, + 10, 10, 0, 0, 0, 127, + 0, 127, 0, 127, 0, + 127, 0, 127, 0, 127, + 0, 127, 0, 127, 0, 127, + 0, 127, 0, 127, 0, + 127, 0, 127, 0, 127, + 0, 127, 0, 127, 0, 127, + 0, 127, 0, 127, 0, + 127, 0, 127, 0, 127, + 0, 127, 0, 127, 0, 127, + 0, 127, 0, 127, 0, + 127, 0, 127, 0, 127, + 0, 127, 0, 127, 0, 127, + 0, 127, 0, 127, 0, + 127, 0, 127, 0, 127, + 0, 127, 0, 127, 0, 127, + 0, 127, 0, 127, 0, + 127, 0, 127, 0, 127, + 0, 127, 0, 127, 0, 127, + 0, 127, 0, 127, 0, + 127, 0, 127, 0, 127, + 0, 127, 0, 127, 0, 127, + 0, 127, 0, 127, 0, + 127, 0, 127, 61, 126, + 0, 127, 0, 127, 0, 127, + 0, 127, 0, 127, 0, + 127, 0, 127, 0, 127, + 0, 127, 0, 127, 0, 127, + 0, 127, 0, 127, 0, + 127, 0, 127, 0, 127, + 0, 127, 0, 127, 0, 127, + 0, 127, 0, 127, 0, + 127, 0, 127, 0, 127, + 0, 127, 0, 0, 61, 124, + 0, 92, 9, 32, 0, + 0, 10, 10, 10, 10, + 10, 10, 0, 0, 0, 127, + 0, 127, 9, 32, 0, + 0, 10, 10, 10, 10, + 10, 10, 0, 0, 0, 127, + 0, 127, 61, 61, 0, + 0, 9, 32, 0, 0, + 61, 126, 10, 10, 10, 10, + 0, 127, 0, 127, 48, + 57, 61, 61, 38, 61, + 0, 0, 0, 0, 42, 61, + 61, 62, 46, 57, 46, + 46, 10, 10, 48, 101, + 48, 95, 46, 120, 48, 114, + 43, 57, 48, 105, 102, + 102, 0, 0, 101, 105, + 0, 0, 0, 0, 48, 114, + 48, 114, 48, 114, 48, + 114, 105, 114, 102, 102, + 0, 0, 101, 105, 115, 115, + 0, 0, 0, 0, 48, + 114, 48, 114, 48, 114, + 48, 114, 48, 114, 48, 114, + 48, 114, 48, 114, 46, + 114, 48, 114, 46, 114, + 48, 114, 58, 58, 60, 61, + 62, 62, 61, 126, 61, + 61, 61, 62, 0, 127, + 0, 127, 0, 0, 0, 127, + 0, 127, 0, 127, 0, + 127, 0, 127, 0, 127, + 0, 0, 10, 10, 0, 0, + 0, 0, 0, 127, 0, + 127, 0, 127, 0, 127, + 0, 127, 0, 127, 0, 127, + 0, 127, 0, 127, 0, + 127, 0, 127, 0, 127, + 0, 127, 0, 127, 0, 127, + 0, 127, 0, 127, 0, + 127, 0, 127, 0, 127, + 0, 127, 0, 127, 0, 127, + 0, 127, 0, 127, 0, + 127, 0, 127, 0, 127, + 0, 127, 0, 127, 0, 127, + 0, 127, 0, 127, 0, + 127, 0, 127, 0, 127, + 0, 127, 9, 92, 0, 127, + 0, 127, 0, 127, 0, + 127, 0, 127, 0, 127, + 0, 127, 0, 127, 0, 127, + 0, 127, 0, 127, 0, + 127, 0, 127, 0, 127, + 0, 127, 0, 127, 0, 127, + 0, 127, 0, 127, 0, + 127, 0, 127, 0, 127, + 0, 127, 0, 127, 0, 127, + 0, 127, 0, 127, 0, + 127, 0, 127, 0, 127, + 0, 127, 0, 127, 0, 127, + 0, 127, 0, 127, 0, + 127, 0, 127, 0, 127, + 0, 127, 0, 127, 0, 127, + 0, 127, 0, 127, 0, + 127, 0, 127, 0, 127, + 0, 127, 0, 127, 0, 127, + 0, 127, 0, 127, 0, + 127, 0, 127, 0, 127, + 0, 127, 0, 127, 0, 127, + 0, 127, 0, 127, 0, + 127, 0, 127, 0, 127, + 0, 127, 0, 127, 0, 127, + 0, 0, 61, 124, 0, + 0, 9, 92, 9, 92, + 9, 92, 46, 46, 46, 46, + 10, 10, 46, 46, 10, + 10, 10, 61, 10, 10, + 10, 101, 10, 110, 10, 100, + 10, 10, 0 +] + +class << self + attr_accessor :_lex_key_spans + private :_lex_key_spans, :_lex_key_spans= +end +self._lex_key_spans = [ + 0, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 27, 128, 128, 128, 128, 46, + 121, 121, 93, 121, 121, 46, 121, 121, + 33, 1, 93, 121, 103, 128, 128, 128, + 128, 46, 121, 121, 93, 121, 121, 46, + 121, 121, 33, 1, 93, 121, 103, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 1, 1, + 1, 128, 1, 1, 1, 1, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 1, 1, 1, 1, 9, 1, 1, 1, + 1, 1, 1, 1, 1, 128, 1, 128, + 84, 1, 84, 1, 1, 1, 1, 1, + 1, 128, 1, 84, 84, 84, 84, 84, + 1, 128, 128, 66, 1, 128, 128, 1, + 1, 1, 1, 128, 87, 1, 46, 121, + 121, 93, 121, 121, 46, 121, 121, 33, + 1, 93, 121, 103, 128, 128, 128, 128, + 128, 128, 1, 1, 128, 15, 10, 10, + 10, 10, 1, 1, 1, 1, 1, 1, + 1, 128, 1, 84, 84, 84, 84, 84, + 84, 1, 1, 84, 84, 1, 1, 1, + 1, 1, 96, 24, 0, 1, 1, 1, + 24, 1, 1, 93, 24, 88, 128, 10, + 128, 121, 0, 0, 8, 8, 0, 0, + 93, 0, 0, 0, 93, 1, 0, 0, + 0, 93, 55, 55, 0, 55, 55, 0, + 46, 93, 93, 0, 0, 93, 55, 55, + 0, 46, 1, 93, 76, 55, 55, 55, + 0, 126, 126, 0, 126, 0, 126, 126, + 126, 126, 0, 126, 126, 126, 126, 126, + 126, 0, 0, 55, 0, 93, 88, 128, + 10, 128, 121, 0, 0, 8, 8, 0, + 0, 93, 0, 0, 0, 93, 1, 0, + 0, 0, 93, 55, 55, 0, 55, 55, + 0, 46, 93, 93, 0, 0, 93, 55, + 55, 0, 46, 1, 93, 76, 55, 55, + 55, 0, 126, 126, 0, 126, 0, 126, + 126, 126, 126, 0, 126, 126, 126, 126, + 126, 126, 0, 0, 55, 0, 93, 24, + 27, 93, 27, 36, 88, 128, 10, 128, + 27, 36, 24, 88, 128, 10, 128, 33, + 24, 58, 58, 29, 128, 10, 128, 128, + 128, 128, 24, 0, 66, 1, 1, 128, + 128, 10, 1, 1, 1, 1, 1, 2, + 1, 66, 1, 2, 128, 128, 128, 128, + 128, 128, 128, 1, 1, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 1, 128, 128, 24, 1, 1, 1, 1, + 0, 128, 128, 1, 0, 24, 0, 66, + 1, 1, 1, 1, 1, 2, 1, 66, + 1, 2, 128, 1, 1, 1, 127, 128, + 62, 53, 53, 0, 53, 54, 1, 1, + 1, 24, 0, 128, 0, 116, 0, 1, + 1, 0, 53, 1, 1, 1, 24, 1, + 128, 1, 1, 1, 1, 128, 128, 128, + 0, 128, 1, 124, 24, 1, 1, 1, + 0, 1, 0, 128, 128, 24, 0, 1, + 1, 1, 0, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 4, 0, 66, + 1, 0, 0, 0, 24, 1, 24, 66, + 1, 1, 128, 24, 0, 20, 1, 84, + 84, 84, 1, 1, 1, 27, 128, 128, + 1, 0, 66, 2, 0, 0, 0, 0, + 66, 128, 10, 1, 1, 1, 2, 1, + 1, 2, 128, 10, 128, 1, 1, 2, + 0, 25, 30, 1, 1, 66, 2, 123, + 0, 128, 128, 121, 0, 0, 8, 8, + 0, 0, 93, 0, 0, 0, 93, 1, + 0, 0, 0, 93, 55, 55, 0, 55, + 55, 0, 46, 93, 93, 0, 0, 93, + 55, 55, 0, 46, 1, 93, 76, 55, + 55, 55, 0, 126, 126, 0, 126, 0, + 126, 126, 126, 126, 0, 126, 126, 126, + 126, 126, 126, 126, 126, 126, 126, 126, + 126, 126, 126, 126, 126, 126, 126, 126, + 0, 0, 55, 0, 128, 128, 128, 0, + 1, 0, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 66, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 0, 64, 93, 24, 0, 1, 1, + 1, 0, 128, 128, 24, 0, 1, 1, + 1, 0, 128, 128, 1, 0, 24, 0, + 66, 1, 1, 128, 128, 10, 1, 24, + 0, 0, 20, 2, 12, 1, 1, 54, + 48, 75, 67, 15, 58, 1, 0, 5, + 0, 0, 67, 67, 67, 67, 10, 1, + 0, 5, 1, 0, 0, 67, 67, 67, + 67, 67, 67, 67, 67, 69, 67, 69, + 67, 1, 2, 1, 66, 1, 2, 128, + 128, 0, 128, 128, 128, 128, 128, 128, + 0, 1, 0, 0, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 84, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 0, 64, 0, 84, 84, + 84, 1, 1, 1, 1, 1, 52, 1, + 92, 101, 91, 1 +] + +class << self + attr_accessor :_lex_index_offsets + private :_lex_index_offsets, :_lex_index_offsets= +end +self._lex_index_offsets = [ + 0, 0, 2, 4, 6, 8, 10, 12, + 14, 16, 18, 46, 175, 304, 433, 562, + 609, 731, 853, 947, 1069, 1191, 1238, 1360, + 1482, 1516, 1518, 1612, 1734, 1838, 1967, 2096, + 2225, 2354, 2401, 2523, 2645, 2739, 2861, 2983, + 3030, 3152, 3274, 3308, 3310, 3404, 3526, 3630, + 3759, 3888, 4017, 4146, 4275, 4404, 4533, 4662, + 4791, 4920, 5049, 5178, 5307, 5436, 5565, 5567, + 5569, 5571, 5700, 5702, 5704, 5706, 5708, 5837, + 5966, 6095, 6224, 6353, 6482, 6611, 6740, 6869, + 6998, 7127, 7256, 7385, 7514, 7643, 7772, 7901, + 8030, 8032, 8034, 8036, 8038, 8048, 8050, 8052, + 8054, 8056, 8058, 8060, 8062, 8064, 8193, 8195, + 8324, 8409, 8411, 8496, 8498, 8500, 8502, 8504, + 8506, 8508, 8637, 8639, 8724, 8809, 8894, 8979, + 9064, 9066, 9195, 9324, 9391, 9393, 9522, 9651, + 9653, 9655, 9657, 9659, 9788, 9876, 9878, 9925, + 10047, 10169, 10263, 10385, 10507, 10554, 10676, 10798, + 10832, 10834, 10928, 11050, 11154, 11283, 11412, 11541, + 11670, 11799, 11928, 11930, 11932, 12061, 12077, 12088, + 12099, 12110, 12121, 12123, 12125, 12127, 12129, 12131, + 12133, 12135, 12264, 12266, 12351, 12436, 12521, 12606, + 12691, 12776, 12778, 12780, 12865, 12950, 12952, 12954, + 12956, 12958, 12960, 13057, 13082, 13083, 13085, 13087, + 13089, 13114, 13116, 13118, 13212, 13237, 13326, 13455, + 13466, 13595, 13717, 13718, 13719, 13728, 13737, 13738, + 13739, 13833, 13834, 13835, 13836, 13930, 13932, 13933, + 13934, 13935, 14029, 14085, 14141, 14142, 14198, 14254, + 14255, 14302, 14396, 14490, 14491, 14492, 14586, 14642, + 14698, 14699, 14746, 14748, 14842, 14919, 14975, 15031, + 15087, 15088, 15215, 15342, 15343, 15470, 15471, 15598, + 15725, 15852, 15979, 15980, 16107, 16234, 16361, 16488, + 16615, 16742, 16743, 16744, 16800, 16801, 16895, 16984, + 17113, 17124, 17253, 17375, 17376, 17377, 17386, 17395, + 17396, 17397, 17491, 17492, 17493, 17494, 17588, 17590, + 17591, 17592, 17593, 17687, 17743, 17799, 17800, 17856, + 17912, 17913, 17960, 18054, 18148, 18149, 18150, 18244, + 18300, 18356, 18357, 18404, 18406, 18500, 18577, 18633, + 18689, 18745, 18746, 18873, 19000, 19001, 19128, 19129, + 19256, 19383, 19510, 19637, 19638, 19765, 19892, 20019, + 20146, 20273, 20400, 20401, 20402, 20458, 20459, 20553, + 20578, 20606, 20700, 20728, 20765, 20854, 20983, 20994, + 21123, 21151, 21188, 21213, 21302, 21431, 21442, 21571, + 21605, 21630, 21689, 21748, 21778, 21907, 21918, 22047, + 22176, 22305, 22434, 22459, 22460, 22527, 22529, 22531, + 22660, 22789, 22800, 22802, 22804, 22806, 22808, 22810, + 22813, 22815, 22882, 22884, 22887, 23016, 23145, 23274, + 23403, 23532, 23661, 23790, 23792, 23794, 23923, 24052, + 24181, 24310, 24439, 24568, 24697, 24826, 24955, 25084, + 25213, 25342, 25471, 25600, 25729, 25858, 25987, 26116, + 26245, 26374, 26503, 26632, 26761, 26890, 27019, 27148, + 27277, 27406, 27535, 27664, 27793, 27922, 28051, 28180, + 28309, 28438, 28567, 28696, 28825, 28954, 29083, 29212, + 29341, 29470, 29599, 29728, 29857, 29986, 30115, 30244, + 30373, 30502, 30631, 30760, 30889, 31018, 31147, 31276, + 31405, 31534, 31663, 31792, 31921, 32050, 32179, 32308, + 32437, 32566, 32695, 32824, 32953, 33082, 33211, 33340, + 33469, 33598, 33727, 33856, 33985, 34114, 34243, 34372, + 34501, 34503, 34632, 34761, 34786, 34788, 34790, 34792, + 34794, 34795, 34924, 35053, 35055, 35056, 35081, 35082, + 35149, 35151, 35153, 35155, 35157, 35159, 35162, 35164, + 35231, 35233, 35236, 35365, 35367, 35369, 35371, 35499, + 35628, 35691, 35745, 35799, 35800, 35854, 35909, 35911, + 35913, 35915, 35940, 35941, 36070, 36071, 36188, 36189, + 36191, 36193, 36194, 36248, 36250, 36252, 36254, 36279, + 36281, 36410, 36412, 36414, 36416, 36418, 36547, 36676, + 36805, 36806, 36935, 36937, 37062, 37087, 37089, 37091, + 37093, 37094, 37096, 37097, 37226, 37355, 37380, 37381, + 37383, 37385, 37387, 37388, 37517, 37646, 37775, 37904, + 38033, 38162, 38291, 38420, 38549, 38678, 38807, 38936, + 39065, 39194, 39323, 39452, 39581, 39710, 39715, 39716, + 39783, 39785, 39786, 39787, 39788, 39813, 39815, 39840, + 39907, 39909, 39911, 40040, 40065, 40066, 40087, 40089, + 40174, 40259, 40344, 40346, 40348, 40350, 40378, 40507, + 40636, 40638, 40639, 40706, 40709, 40710, 40711, 40712, + 40713, 40780, 40909, 40920, 40922, 40924, 40926, 40929, + 40931, 40933, 40936, 41065, 41076, 41205, 41207, 41209, + 41212, 41213, 41239, 41270, 41272, 41274, 41341, 41344, + 41468, 41469, 41598, 41727, 41849, 41850, 41851, 41860, + 41869, 41870, 41871, 41965, 41966, 41967, 41968, 42062, + 42064, 42065, 42066, 42067, 42161, 42217, 42273, 42274, + 42330, 42386, 42387, 42434, 42528, 42622, 42623, 42624, + 42718, 42774, 42830, 42831, 42878, 42880, 42974, 43051, + 43107, 43163, 43219, 43220, 43347, 43474, 43475, 43602, + 43603, 43730, 43857, 43984, 44111, 44112, 44239, 44366, + 44493, 44620, 44747, 44874, 45001, 45128, 45255, 45382, + 45509, 45636, 45763, 45890, 46017, 46144, 46271, 46398, + 46525, 46526, 46527, 46583, 46584, 46713, 46842, 46971, + 46972, 46974, 46975, 47104, 47233, 47362, 47491, 47620, + 47749, 47878, 48007, 48136, 48265, 48394, 48523, 48652, + 48781, 48910, 49039, 49168, 49297, 49426, 49555, 49684, + 49813, 49942, 50071, 50200, 50329, 50458, 50587, 50716, + 50845, 50974, 51103, 51232, 51361, 51490, 51619, 51748, + 51877, 52006, 52135, 52264, 52393, 52522, 52651, 52780, + 52909, 53038, 53167, 53296, 53425, 53554, 53683, 53812, + 53941, 54070, 54199, 54328, 54457, 54586, 54715, 54844, + 54911, 55040, 55169, 55298, 55427, 55556, 55685, 55814, + 55943, 56072, 56201, 56330, 56459, 56588, 56717, 56846, + 56975, 57104, 57233, 57362, 57491, 57620, 57749, 57878, + 58007, 58136, 58137, 58202, 58296, 58321, 58322, 58324, + 58326, 58328, 58329, 58458, 58587, 58612, 58613, 58615, + 58617, 58619, 58620, 58749, 58878, 58880, 58881, 58906, + 58907, 58974, 58976, 58978, 59107, 59236, 59247, 59249, + 59274, 59275, 59276, 59297, 59300, 59313, 59315, 59317, + 59372, 59421, 59497, 59565, 59581, 59640, 59642, 59643, + 59649, 59650, 59651, 59719, 59787, 59855, 59923, 59934, + 59936, 59937, 59943, 59945, 59946, 59947, 60015, 60083, + 60151, 60219, 60287, 60355, 60423, 60491, 60561, 60629, + 60699, 60767, 60769, 60772, 60774, 60841, 60843, 60846, + 60975, 61104, 61105, 61234, 61363, 61492, 61621, 61750, + 61879, 61880, 61882, 61883, 61884, 62013, 62142, 62271, + 62400, 62529, 62658, 62787, 62916, 63045, 63174, 63303, + 63432, 63561, 63690, 63819, 63948, 64077, 64206, 64335, + 64464, 64593, 64722, 64851, 64980, 65109, 65238, 65367, + 65496, 65625, 65754, 65883, 66012, 66141, 66270, 66399, + 66528, 66657, 66742, 66871, 67000, 67129, 67258, 67387, + 67516, 67645, 67774, 67903, 68032, 68161, 68290, 68419, + 68548, 68677, 68806, 68935, 69064, 69193, 69322, 69451, + 69580, 69709, 69838, 69967, 70096, 70225, 70354, 70483, + 70612, 70741, 70870, 70999, 71128, 71257, 71386, 71515, + 71644, 71773, 71902, 72031, 72160, 72289, 72418, 72547, + 72676, 72805, 72934, 73063, 73192, 73321, 73450, 73579, + 73708, 73837, 73966, 74095, 74224, 74353, 74482, 74611, + 74740, 74869, 74998, 75127, 75128, 75193, 75194, 75279, + 75364, 75449, 75451, 75453, 75455, 75457, 75459, 75512, + 75514, 75607, 75709, 75801 +] + +class << self + attr_accessor :_lex_indicies + private :_lex_indicies, :_lex_indicies= +end +self._lex_indicies = [ + 1, 0, 2, 0, 3, 0, 4, 0, + 5, 0, 6, 0, 7, 0, 8, 0, + 9, 0, 10, 0, 0, 0, 10, 0, + 0, 0, 0, 0, 11, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 10, 0, 12, 12, + 12, 12, 12, 12, 12, 12, 12, 12, + 12, 12, 12, 12, 12, 12, 12, 12, + 12, 12, 12, 12, 12, 12, 12, 12, + 12, 12, 12, 12, 12, 12, 12, 14, + 14, 12, 14, 12, 14, 14, 12, 12, + 14, 14, 14, 15, 14, 14, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, + 14, 14, 14, 14, 14, 14, 14, 13, + 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, + 13, 12, 14, 12, 12, 13, 14, 13, + 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, + 13, 12, 12, 12, 14, 12, 13, 12, + 12, 12, 12, 12, 12, 12, 12, 12, + 12, 12, 12, 12, 12, 12, 12, 12, + 12, 12, 12, 12, 12, 12, 12, 12, + 12, 12, 12, 12, 12, 12, 12, 12, + 12, 12, 12, 12, 12, 12, 12, 12, + 12, 12, 12, 12, 12, 12, 12, 14, + 14, 14, 14, 14, 14, 14, 14, 14, + 14, 12, 12, 12, 12, 12, 12, 12, + 14, 14, 14, 14, 14, 14, 14, 14, + 14, 14, 14, 14, 14, 14, 14, 14, + 14, 14, 14, 14, 14, 14, 14, 14, + 14, 14, 12, 12, 12, 12, 14, 12, + 14, 14, 14, 14, 14, 14, 14, 14, + 14, 14, 14, 14, 14, 14, 14, 14, + 14, 14, 14, 14, 14, 14, 14, 14, + 14, 14, 12, 12, 12, 12, 12, 14, + 12, 12, 12, 12, 12, 12, 12, 12, + 12, 12, 12, 12, 12, 12, 12, 12, + 12, 12, 12, 12, 12, 12, 12, 12, + 12, 12, 12, 12, 12, 12, 12, 12, + 12, 12, 12, 12, 12, 12, 12, 12, + 12, 12, 12, 12, 12, 12, 12, 12, + 17, 17, 17, 17, 17, 17, 17, 17, + 17, 17, 12, 12, 12, 12, 12, 12, + 18, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 12, 12, 12, 12, 13, + 12, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 12, 12, 12, 12, 12, + 13, 12, 12, 12, 12, 12, 12, 12, + 12, 12, 12, 12, 12, 12, 12, 12, + 12, 12, 12, 12, 12, 12, 12, 12, + 12, 12, 12, 12, 12, 12, 12, 12, + 12, 12, 12, 12, 12, 12, 12, 12, + 12, 12, 12, 12, 12, 12, 12, 12, + 12, 17, 17, 17, 17, 17, 17, 17, + 17, 17, 17, 12, 12, 12, 12, 12, + 12, 12, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 12, 12, 12, 12, + 13, 12, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 12, 12, 12, 12, + 12, 13, 19, 20, 20, 20, 19, 20, + 20, 20, 20, 20, 20, 20, 20, 20, + 20, 20, 20, 20, 20, 20, 20, 20, + 20, 20, 20, 20, 19, 20, 20, 20, + 20, 20, 20, 20, 20, 20, 20, 20, + 20, 20, 20, 20, 20, 20, 20, 21, + 20, 19, 22, 22, 22, 19, 22, 22, + 22, 22, 22, 23, 22, 22, 22, 22, + 22, 22, 22, 22, 22, 22, 22, 22, + 22, 22, 22, 19, 22, 22, 22, 22, + 22, 22, 22, 22, 22, 22, 22, 22, + 22, 22, 22, 22, 22, 22, 22, 22, + 22, 22, 22, 22, 22, 22, 22, 22, + 22, 22, 22, 22, 22, 22, 22, 22, + 22, 22, 22, 22, 22, 22, 22, 22, + 22, 22, 22, 22, 22, 22, 24, 22, + 22, 22, 22, 22, 22, 22, 22, 22, + 22, 22, 22, 22, 22, 22, 22, 22, + 22, 22, 22, 22, 22, 22, 22, 22, + 22, 22, 22, 22, 22, 22, 22, 22, + 22, 22, 22, 22, 22, 22, 22, 22, + 22, 25, 22, 19, 22, 22, 22, 19, + 22, 22, 22, 22, 22, 22, 22, 22, + 22, 22, 22, 22, 22, 22, 22, 22, + 22, 22, 22, 22, 22, 19, 22, 22, + 22, 22, 22, 22, 22, 22, 22, 22, + 22, 22, 22, 22, 22, 22, 22, 22, + 22, 22, 22, 22, 22, 22, 22, 22, + 22, 22, 22, 22, 22, 22, 22, 22, + 22, 22, 22, 22, 22, 22, 22, 22, + 22, 22, 22, 22, 22, 22, 22, 22, + 26, 22, 22, 22, 22, 22, 22, 22, + 22, 22, 22, 22, 22, 22, 22, 22, + 22, 22, 22, 22, 22, 22, 22, 22, + 22, 22, 22, 22, 22, 22, 22, 22, + 22, 22, 22, 22, 22, 22, 22, 22, + 22, 22, 22, 25, 22, 19, 27, 27, + 27, 19, 27, 27, 27, 27, 27, 27, + 27, 27, 27, 27, 27, 27, 27, 27, + 27, 27, 27, 27, 27, 27, 27, 19, + 27, 27, 27, 27, 27, 27, 27, 27, + 27, 27, 27, 27, 27, 27, 27, 27, + 27, 27, 27, 27, 27, 27, 27, 27, + 27, 27, 27, 27, 27, 27, 27, 27, + 27, 27, 27, 27, 28, 27, 27, 27, + 27, 27, 27, 27, 27, 27, 27, 27, + 27, 27, 27, 27, 27, 27, 27, 27, + 27, 27, 27, 27, 27, 27, 27, 27, + 27, 29, 27, 19, 30, 30, 30, 19, + 30, 30, 30, 30, 30, 31, 30, 30, + 30, 30, 30, 30, 30, 30, 30, 30, + 30, 30, 30, 30, 30, 19, 30, 30, + 30, 30, 30, 30, 30, 30, 30, 30, + 30, 30, 30, 30, 30, 30, 30, 30, + 30, 30, 30, 30, 30, 30, 30, 30, + 30, 30, 30, 30, 30, 30, 30, 30, + 30, 30, 30, 30, 30, 30, 30, 30, + 30, 30, 30, 30, 30, 30, 30, 30, + 30, 30, 30, 30, 30, 30, 30, 30, + 30, 30, 30, 30, 30, 30, 30, 30, + 30, 30, 30, 30, 30, 30, 30, 30, + 30, 30, 30, 30, 30, 30, 30, 30, + 30, 30, 30, 30, 30, 30, 30, 30, + 30, 30, 30, 32, 30, 19, 30, 30, + 30, 19, 30, 30, 30, 30, 30, 30, + 30, 30, 30, 30, 30, 30, 30, 30, + 30, 30, 30, 30, 30, 30, 30, 19, + 30, 30, 30, 30, 30, 30, 30, 30, + 30, 30, 30, 30, 30, 30, 30, 30, + 30, 30, 30, 30, 30, 30, 30, 30, + 30, 30, 30, 30, 30, 30, 30, 30, + 30, 30, 30, 30, 30, 30, 30, 30, + 30, 30, 30, 30, 30, 30, 30, 30, + 30, 30, 30, 30, 30, 30, 30, 30, + 30, 30, 30, 30, 30, 30, 30, 30, + 30, 30, 30, 30, 30, 30, 30, 30, + 30, 30, 30, 30, 30, 30, 30, 30, + 30, 30, 30, 30, 30, 30, 30, 30, + 30, 30, 30, 30, 30, 32, 30, 19, + 20, 20, 20, 19, 20, 20, 20, 20, + 20, 20, 20, 20, 20, 20, 20, 20, + 20, 20, 20, 20, 20, 20, 20, 20, + 20, 19, 20, 20, 20, 20, 20, 20, + 20, 20, 20, 20, 20, 20, 20, 20, + 20, 20, 20, 20, 33, 20, 19, 34, + 34, 34, 19, 34, 34, 34, 34, 34, + 35, 34, 34, 34, 34, 34, 34, 34, + 34, 34, 34, 34, 34, 34, 34, 34, + 19, 34, 34, 34, 34, 34, 34, 34, + 34, 34, 34, 34, 34, 34, 34, 34, + 34, 34, 34, 34, 34, 34, 34, 34, + 34, 34, 34, 34, 34, 34, 34, 34, + 34, 34, 34, 34, 34, 34, 34, 34, + 34, 36, 34, 34, 34, 34, 34, 34, + 34, 34, 34, 34, 34, 34, 34, 34, + 34, 34, 34, 34, 34, 34, 34, 34, + 34, 34, 37, 34, 34, 34, 34, 34, + 34, 38, 34, 34, 34, 34, 34, 34, + 34, 34, 34, 34, 34, 34, 34, 34, + 34, 34, 34, 34, 34, 34, 39, 34, + 19, 34, 34, 34, 19, 34, 34, 34, + 34, 34, 34, 34, 34, 34, 34, 34, + 34, 34, 34, 34, 34, 34, 34, 34, + 34, 34, 19, 34, 34, 34, 34, 34, + 34, 34, 34, 34, 34, 34, 34, 34, + 34, 34, 34, 34, 34, 34, 34, 34, + 34, 34, 34, 34, 34, 34, 34, 34, + 34, 34, 34, 34, 34, 34, 34, 34, + 34, 34, 34, 34, 34, 34, 34, 34, + 34, 34, 34, 34, 34, 34, 34, 34, + 34, 34, 34, 34, 34, 34, 34, 34, + 34, 34, 34, 34, 34, 34, 34, 34, + 34, 34, 34, 34, 34, 34, 34, 34, + 34, 34, 34, 34, 34, 34, 34, 34, + 34, 34, 34, 34, 34, 34, 34, 34, + 39, 34, 40, 19, 19, 19, 19, 19, + 19, 19, 19, 19, 19, 19, 19, 19, + 19, 19, 19, 19, 19, 19, 19, 19, + 19, 19, 19, 19, 19, 19, 19, 19, + 19, 19, 41, 19, 41, 19, 19, 42, + 42, 42, 19, 42, 42, 42, 42, 42, + 42, 42, 42, 42, 42, 42, 42, 42, + 42, 42, 42, 42, 42, 42, 42, 42, + 19, 42, 42, 42, 42, 42, 42, 42, + 42, 42, 42, 42, 42, 42, 42, 42, + 42, 42, 42, 42, 42, 42, 42, 42, + 42, 42, 42, 42, 42, 42, 42, 42, + 42, 42, 42, 42, 42, 43, 42, 42, + 42, 42, 42, 42, 42, 42, 42, 42, + 42, 42, 42, 42, 42, 42, 42, 42, + 42, 42, 42, 42, 42, 42, 42, 42, + 42, 42, 44, 42, 19, 22, 22, 22, + 19, 22, 22, 22, 22, 22, 23, 22, + 22, 22, 22, 22, 22, 22, 22, 22, + 22, 22, 22, 22, 22, 22, 19, 22, + 22, 22, 22, 22, 22, 22, 22, 22, + 22, 22, 22, 22, 22, 22, 22, 22, + 22, 22, 22, 22, 22, 22, 22, 22, + 22, 22, 22, 22, 22, 22, 22, 22, + 22, 22, 22, 22, 22, 22, 22, 22, + 22, 22, 22, 22, 22, 22, 22, 22, + 22, 26, 22, 22, 22, 22, 22, 22, + 22, 22, 22, 22, 22, 22, 22, 22, + 22, 22, 22, 22, 22, 22, 22, 22, + 22, 22, 22, 22, 22, 22, 22, 22, + 22, 22, 22, 22, 22, 22, 22, 22, + 22, 22, 22, 22, 25, 22, 19, 45, + 45, 45, 19, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, + 19, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 46, 46, + 46, 46, 46, 46, 46, 46, 46, 46, + 45, 45, 45, 45, 45, 45, 45, 46, + 46, 46, 46, 46, 46, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 46, + 46, 46, 46, 46, 46, 45, 47, 47, + 47, 47, 47, 47, 47, 47, 47, 47, + 47, 47, 47, 47, 47, 47, 47, 47, + 47, 47, 47, 47, 47, 47, 47, 47, + 47, 47, 47, 47, 47, 47, 47, 49, + 49, 47, 49, 47, 49, 49, 47, 47, + 49, 49, 49, 50, 49, 49, 51, 51, + 51, 51, 51, 51, 51, 51, 51, 51, + 49, 49, 49, 49, 49, 49, 49, 48, + 48, 48, 48, 48, 48, 48, 48, 48, + 48, 48, 48, 48, 48, 48, 48, 48, + 48, 48, 48, 48, 48, 48, 48, 48, + 48, 47, 49, 47, 47, 48, 49, 48, + 48, 48, 48, 48, 48, 48, 48, 48, + 48, 48, 48, 48, 48, 48, 48, 48, + 48, 48, 48, 48, 48, 48, 48, 48, + 48, 47, 47, 47, 49, 47, 48, 47, + 47, 47, 47, 47, 47, 47, 47, 47, + 47, 47, 47, 47, 47, 47, 47, 47, + 47, 47, 47, 47, 47, 47, 47, 47, + 47, 47, 47, 47, 47, 47, 47, 47, + 47, 47, 47, 47, 47, 47, 47, 47, + 47, 47, 47, 47, 47, 47, 47, 49, + 49, 49, 49, 49, 49, 49, 49, 49, + 49, 47, 47, 47, 47, 47, 47, 47, + 49, 49, 49, 49, 49, 49, 49, 49, + 49, 49, 49, 49, 49, 49, 49, 49, + 49, 49, 49, 49, 49, 49, 49, 49, + 49, 49, 47, 47, 47, 47, 49, 47, + 49, 49, 49, 49, 49, 49, 49, 49, + 49, 49, 49, 49, 49, 49, 49, 49, + 49, 49, 49, 49, 49, 49, 49, 49, + 49, 49, 47, 47, 47, 47, 47, 49, + 47, 47, 47, 47, 47, 47, 47, 47, + 47, 47, 47, 47, 47, 47, 47, 47, + 47, 47, 47, 47, 47, 47, 47, 47, + 47, 47, 47, 47, 47, 47, 47, 47, + 47, 47, 47, 47, 47, 47, 47, 47, + 47, 47, 47, 47, 47, 47, 47, 47, + 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 47, 47, 47, 47, 47, 47, + 53, 48, 48, 48, 48, 48, 48, 48, + 48, 48, 48, 48, 48, 48, 48, 48, + 48, 48, 48, 48, 48, 48, 48, 48, + 48, 48, 48, 47, 47, 47, 47, 48, + 47, 48, 48, 48, 48, 48, 48, 48, + 48, 48, 48, 48, 48, 48, 48, 48, + 48, 48, 48, 48, 48, 48, 48, 48, + 48, 48, 48, 47, 47, 47, 47, 47, + 48, 47, 47, 47, 47, 47, 47, 47, + 47, 47, 47, 47, 47, 47, 47, 47, + 47, 47, 47, 47, 47, 47, 47, 47, + 47, 47, 47, 47, 47, 47, 47, 47, + 47, 47, 47, 47, 47, 47, 47, 47, + 47, 47, 47, 47, 47, 47, 47, 47, + 47, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 47, 47, 47, 47, 47, + 47, 47, 48, 48, 48, 48, 48, 48, + 48, 48, 48, 48, 48, 48, 48, 48, + 48, 48, 48, 48, 48, 48, 48, 48, + 48, 48, 48, 48, 47, 47, 47, 47, + 48, 47, 48, 48, 48, 48, 48, 48, + 48, 48, 48, 48, 48, 48, 48, 48, + 48, 48, 48, 48, 48, 48, 48, 48, + 48, 48, 48, 48, 47, 47, 47, 47, + 47, 48, 54, 55, 55, 55, 54, 55, + 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 54, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 56, + 55, 54, 57, 57, 57, 54, 57, 57, + 57, 57, 57, 58, 57, 57, 57, 57, + 57, 57, 57, 57, 57, 57, 57, 57, + 57, 57, 57, 54, 57, 57, 57, 57, + 57, 57, 57, 57, 57, 57, 57, 57, + 57, 57, 57, 57, 57, 57, 57, 57, + 57, 57, 57, 57, 57, 57, 57, 57, + 57, 57, 57, 57, 57, 57, 57, 57, + 57, 57, 57, 57, 57, 57, 57, 57, + 57, 57, 57, 57, 57, 57, 59, 57, + 57, 57, 57, 57, 57, 57, 57, 57, + 57, 57, 57, 57, 57, 57, 57, 57, + 57, 57, 57, 57, 57, 57, 57, 57, + 57, 57, 57, 57, 57, 57, 57, 57, + 57, 57, 57, 57, 57, 57, 57, 57, + 57, 60, 57, 54, 57, 57, 57, 54, + 57, 57, 57, 57, 57, 57, 57, 57, + 57, 57, 57, 57, 57, 57, 57, 57, + 57, 57, 57, 57, 57, 54, 57, 57, + 57, 57, 57, 57, 57, 57, 57, 57, + 57, 57, 57, 57, 57, 57, 57, 57, + 57, 57, 57, 57, 57, 57, 57, 57, + 57, 57, 57, 57, 57, 57, 57, 57, + 57, 57, 57, 57, 57, 57, 57, 57, + 57, 57, 57, 57, 57, 57, 57, 57, + 61, 57, 57, 57, 57, 57, 57, 57, + 57, 57, 57, 57, 57, 57, 57, 57, + 57, 57, 57, 57, 57, 57, 57, 57, + 57, 57, 57, 57, 57, 57, 57, 57, + 57, 57, 57, 57, 57, 57, 57, 57, + 57, 57, 57, 60, 57, 54, 62, 62, + 62, 54, 62, 62, 62, 62, 62, 62, + 62, 62, 62, 62, 62, 62, 62, 62, + 62, 62, 62, 62, 62, 62, 62, 54, + 62, 62, 62, 62, 62, 62, 62, 62, + 62, 62, 62, 62, 62, 62, 62, 62, + 62, 62, 62, 62, 62, 62, 62, 62, + 62, 62, 62, 62, 62, 62, 62, 62, + 62, 62, 62, 62, 63, 62, 62, 62, + 62, 62, 62, 62, 62, 62, 62, 62, + 62, 62, 62, 62, 62, 62, 62, 62, + 62, 62, 62, 62, 62, 62, 62, 62, + 62, 64, 62, 54, 65, 65, 65, 54, + 65, 65, 65, 65, 65, 66, 65, 65, + 65, 65, 65, 65, 65, 65, 65, 65, + 65, 65, 65, 65, 65, 54, 65, 65, + 65, 65, 65, 65, 65, 65, 65, 65, + 65, 65, 65, 65, 65, 65, 65, 65, + 65, 65, 65, 65, 65, 65, 65, 65, + 65, 65, 65, 65, 65, 65, 65, 65, + 65, 65, 65, 65, 65, 65, 65, 65, + 65, 65, 65, 65, 65, 65, 65, 65, + 65, 65, 65, 65, 65, 65, 65, 65, + 65, 65, 65, 65, 65, 65, 65, 65, + 65, 65, 65, 65, 65, 65, 65, 65, + 65, 65, 65, 65, 65, 65, 65, 65, + 65, 65, 65, 65, 65, 65, 65, 65, + 65, 65, 65, 67, 65, 54, 65, 65, + 65, 54, 65, 65, 65, 65, 65, 65, + 65, 65, 65, 65, 65, 65, 65, 65, + 65, 65, 65, 65, 65, 65, 65, 54, + 65, 65, 65, 65, 65, 65, 65, 65, + 65, 65, 65, 65, 65, 65, 65, 65, + 65, 65, 65, 65, 65, 65, 65, 65, + 65, 65, 65, 65, 65, 65, 65, 65, + 65, 65, 65, 65, 65, 65, 65, 65, + 65, 65, 65, 65, 65, 65, 65, 65, + 65, 65, 65, 65, 65, 65, 65, 65, + 65, 65, 65, 65, 65, 65, 65, 65, + 65, 65, 65, 65, 65, 65, 65, 65, + 65, 65, 65, 65, 65, 65, 65, 65, + 65, 65, 65, 65, 65, 65, 65, 65, + 65, 65, 65, 65, 65, 67, 65, 54, + 55, 55, 55, 54, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, + 55, 54, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 68, 55, 54, 69, + 69, 69, 54, 69, 69, 69, 69, 69, + 70, 69, 69, 69, 69, 69, 69, 69, + 69, 69, 69, 69, 69, 69, 69, 69, + 54, 69, 69, 69, 69, 69, 69, 69, + 69, 69, 69, 69, 69, 69, 69, 69, + 69, 69, 69, 69, 69, 69, 69, 69, + 69, 69, 69, 69, 69, 69, 69, 69, + 69, 69, 69, 69, 69, 69, 69, 69, + 69, 71, 69, 69, 69, 69, 69, 69, + 69, 69, 69, 69, 69, 69, 69, 69, + 69, 69, 69, 69, 69, 69, 69, 69, + 69, 69, 72, 69, 69, 69, 69, 69, + 69, 73, 69, 69, 69, 69, 69, 69, + 69, 69, 69, 69, 69, 69, 69, 69, + 69, 69, 69, 69, 69, 69, 74, 69, + 54, 69, 69, 69, 54, 69, 69, 69, + 69, 69, 69, 69, 69, 69, 69, 69, + 69, 69, 69, 69, 69, 69, 69, 69, + 69, 69, 54, 69, 69, 69, 69, 69, + 69, 69, 69, 69, 69, 69, 69, 69, + 69, 69, 69, 69, 69, 69, 69, 69, + 69, 69, 69, 69, 69, 69, 69, 69, + 69, 69, 69, 69, 69, 69, 69, 69, + 69, 69, 69, 69, 69, 69, 69, 69, + 69, 69, 69, 69, 69, 69, 69, 69, + 69, 69, 69, 69, 69, 69, 69, 69, + 69, 69, 69, 69, 69, 69, 69, 69, + 69, 69, 69, 69, 69, 69, 69, 69, + 69, 69, 69, 69, 69, 69, 69, 69, + 69, 69, 69, 69, 69, 69, 69, 69, + 74, 69, 75, 54, 54, 54, 54, 54, + 54, 54, 54, 54, 54, 54, 54, 54, + 54, 54, 54, 54, 54, 54, 54, 54, + 54, 54, 54, 54, 54, 54, 54, 54, + 54, 54, 76, 54, 76, 54, 54, 77, + 77, 77, 54, 77, 77, 77, 77, 77, + 77, 77, 77, 77, 77, 77, 77, 77, + 77, 77, 77, 77, 77, 77, 77, 77, + 54, 77, 77, 77, 77, 77, 77, 77, + 77, 77, 77, 77, 77, 77, 77, 77, + 77, 77, 77, 77, 77, 77, 77, 77, + 77, 77, 77, 77, 77, 77, 77, 77, + 77, 77, 77, 77, 77, 78, 77, 77, + 77, 77, 77, 77, 77, 77, 77, 77, + 77, 77, 77, 77, 77, 77, 77, 77, + 77, 77, 77, 77, 77, 77, 77, 77, + 77, 77, 79, 77, 54, 57, 57, 57, + 54, 57, 57, 57, 57, 57, 58, 57, + 57, 57, 57, 57, 57, 57, 57, 57, + 57, 57, 57, 57, 57, 57, 54, 57, + 57, 57, 57, 57, 57, 57, 57, 57, + 57, 57, 57, 57, 57, 57, 57, 57, + 57, 57, 57, 57, 57, 57, 57, 57, + 57, 57, 57, 57, 57, 57, 57, 57, + 57, 57, 57, 57, 57, 57, 57, 57, + 57, 57, 57, 57, 57, 57, 57, 57, + 57, 61, 57, 57, 57, 57, 57, 57, + 57, 57, 57, 57, 57, 57, 57, 57, + 57, 57, 57, 57, 57, 57, 57, 57, + 57, 57, 57, 57, 57, 57, 57, 57, + 57, 57, 57, 57, 57, 57, 57, 57, + 57, 57, 57, 57, 60, 57, 54, 80, + 80, 80, 54, 80, 80, 80, 80, 80, + 80, 80, 80, 80, 80, 80, 80, 80, + 80, 80, 80, 80, 80, 80, 80, 80, + 54, 80, 80, 80, 80, 80, 80, 80, + 80, 80, 80, 80, 80, 80, 80, 80, + 80, 80, 80, 80, 80, 80, 81, 81, + 81, 81, 81, 81, 81, 81, 81, 81, + 80, 80, 80, 80, 80, 80, 80, 81, + 81, 81, 81, 81, 81, 80, 80, 80, + 80, 80, 80, 80, 80, 80, 80, 80, + 80, 80, 80, 80, 80, 80, 80, 80, + 80, 80, 80, 80, 80, 80, 80, 81, + 81, 81, 81, 81, 81, 80, 82, 82, + 82, 82, 82, 82, 82, 82, 82, 82, + 82, 82, 82, 82, 82, 82, 82, 82, + 82, 82, 82, 82, 82, 82, 82, 82, + 82, 82, 82, 82, 82, 82, 82, 84, + 84, 82, 84, 82, 84, 84, 82, 82, + 84, 84, 84, 85, 84, 84, 86, 86, + 86, 86, 86, 86, 86, 86, 86, 86, + 84, 84, 84, 84, 84, 84, 84, 83, + 83, 83, 83, 83, 83, 83, 83, 83, + 83, 83, 83, 83, 83, 83, 83, 83, + 83, 83, 83, 83, 83, 83, 83, 83, + 83, 82, 84, 82, 82, 83, 84, 83, + 83, 83, 83, 83, 83, 83, 83, 83, + 83, 83, 83, 83, 83, 83, 83, 83, + 83, 83, 83, 83, 83, 83, 83, 83, + 83, 82, 82, 82, 84, 82, 83, 82, + 82, 82, 82, 82, 82, 82, 82, 82, + 82, 82, 82, 82, 82, 82, 82, 82, + 82, 82, 82, 82, 82, 82, 82, 82, + 82, 82, 82, 82, 82, 82, 82, 82, + 82, 82, 82, 82, 82, 82, 82, 82, + 82, 82, 82, 82, 82, 82, 82, 84, + 84, 84, 84, 84, 84, 84, 84, 84, + 84, 82, 82, 82, 82, 82, 82, 82, + 84, 84, 84, 84, 84, 84, 84, 84, + 84, 84, 84, 84, 84, 84, 84, 84, + 84, 84, 84, 84, 84, 84, 84, 84, + 84, 84, 82, 82, 82, 82, 84, 82, + 84, 84, 84, 84, 84, 84, 84, 84, + 84, 84, 84, 84, 84, 84, 84, 84, + 84, 84, 84, 84, 84, 84, 84, 84, + 84, 84, 82, 82, 82, 82, 82, 84, + 82, 82, 82, 82, 82, 82, 82, 82, + 82, 82, 82, 82, 82, 82, 82, 82, + 82, 82, 82, 82, 82, 82, 82, 82, + 82, 82, 82, 82, 82, 82, 82, 82, + 82, 82, 82, 82, 82, 82, 82, 82, + 82, 82, 82, 82, 82, 82, 82, 82, + 87, 87, 87, 87, 87, 87, 87, 87, + 87, 87, 82, 82, 82, 82, 82, 82, + 88, 83, 83, 83, 83, 83, 83, 83, + 83, 83, 83, 83, 83, 83, 83, 83, + 83, 83, 83, 83, 83, 83, 83, 83, + 83, 83, 83, 82, 82, 82, 82, 83, + 82, 83, 83, 83, 83, 83, 83, 83, + 83, 83, 83, 83, 83, 83, 83, 83, + 83, 83, 83, 83, 83, 83, 83, 83, + 83, 83, 83, 82, 82, 82, 82, 82, + 83, 82, 82, 82, 82, 82, 82, 82, + 82, 82, 82, 82, 82, 82, 82, 82, + 82, 82, 82, 82, 82, 82, 82, 82, + 82, 82, 82, 82, 82, 82, 82, 82, + 82, 82, 82, 82, 82, 82, 82, 82, + 82, 82, 82, 82, 82, 82, 82, 82, + 82, 87, 87, 87, 87, 87, 87, 87, + 87, 87, 87, 82, 82, 82, 82, 82, + 82, 82, 83, 83, 83, 83, 83, 83, + 83, 83, 83, 83, 83, 83, 83, 83, + 83, 83, 83, 83, 83, 83, 83, 83, + 83, 83, 83, 83, 82, 82, 82, 82, + 83, 82, 83, 83, 83, 83, 83, 83, + 83, 83, 83, 83, 83, 83, 83, 83, + 83, 83, 83, 83, 83, 83, 83, 83, + 83, 83, 83, 83, 82, 82, 82, 82, + 82, 83, 89, 89, 89, 89, 89, 89, + 89, 89, 89, 89, 89, 89, 89, 89, + 89, 89, 89, 89, 89, 89, 89, 89, + 89, 89, 89, 89, 89, 89, 89, 89, + 89, 89, 89, 91, 91, 89, 91, 89, + 91, 91, 89, 89, 91, 91, 91, 92, + 91, 91, 93, 93, 93, 93, 93, 93, + 93, 93, 93, 93, 91, 91, 91, 91, + 91, 91, 91, 90, 90, 90, 90, 90, + 90, 90, 90, 90, 90, 90, 90, 90, + 90, 90, 90, 90, 90, 90, 90, 90, + 90, 90, 90, 90, 90, 89, 91, 89, + 89, 90, 91, 90, 90, 90, 90, 90, + 90, 90, 90, 90, 90, 90, 90, 90, + 90, 90, 90, 90, 90, 90, 90, 90, + 90, 90, 90, 90, 90, 89, 89, 89, + 91, 89, 90, 89, 89, 89, 89, 89, + 89, 89, 89, 89, 89, 89, 89, 89, + 89, 89, 89, 89, 89, 89, 89, 89, + 89, 89, 89, 89, 89, 89, 89, 89, + 89, 89, 89, 89, 89, 89, 89, 89, + 89, 89, 89, 89, 89, 89, 89, 89, + 89, 89, 89, 91, 91, 91, 91, 91, + 91, 91, 91, 91, 91, 89, 89, 89, + 89, 89, 89, 89, 91, 91, 91, 91, + 91, 91, 91, 91, 91, 91, 91, 91, + 91, 91, 91, 91, 91, 91, 91, 91, + 91, 91, 91, 91, 91, 91, 89, 89, + 89, 89, 91, 89, 91, 91, 91, 91, + 91, 91, 91, 91, 91, 91, 91, 91, + 91, 91, 91, 91, 91, 91, 91, 91, + 91, 91, 91, 91, 91, 91, 89, 89, + 89, 89, 89, 91, 89, 89, 89, 89, + 89, 89, 89, 89, 89, 89, 89, 89, + 89, 89, 89, 89, 89, 89, 89, 89, + 89, 89, 89, 89, 89, 89, 89, 89, + 89, 89, 89, 89, 89, 89, 89, 89, + 89, 89, 89, 89, 89, 89, 89, 89, + 89, 89, 89, 89, 94, 94, 94, 94, + 94, 94, 94, 94, 94, 94, 89, 89, + 89, 89, 89, 89, 95, 90, 90, 90, + 90, 90, 90, 90, 90, 90, 90, 90, + 90, 90, 90, 90, 90, 90, 90, 90, + 90, 90, 90, 90, 90, 90, 90, 89, + 89, 89, 89, 90, 89, 90, 90, 90, + 90, 90, 90, 90, 90, 90, 90, 90, + 90, 90, 90, 90, 90, 90, 90, 90, + 90, 90, 90, 90, 90, 90, 90, 89, + 89, 89, 89, 89, 90, 89, 89, 89, + 89, 89, 89, 89, 89, 89, 89, 89, + 89, 89, 89, 89, 89, 89, 89, 89, + 89, 89, 89, 89, 89, 89, 89, 89, + 89, 89, 89, 89, 89, 89, 89, 89, + 89, 89, 89, 89, 89, 89, 89, 89, + 89, 89, 89, 89, 89, 94, 94, 94, + 94, 94, 94, 94, 94, 94, 94, 89, + 89, 89, 89, 89, 89, 89, 90, 90, + 90, 90, 90, 90, 90, 90, 90, 90, + 90, 90, 90, 90, 90, 90, 90, 90, + 90, 90, 90, 90, 90, 90, 90, 90, + 89, 89, 89, 89, 90, 89, 90, 90, + 90, 90, 90, 90, 90, 90, 90, 90, + 90, 90, 90, 90, 90, 90, 90, 90, + 90, 90, 90, 90, 90, 90, 90, 90, + 89, 89, 89, 89, 89, 90, 98, 98, + 98, 98, 98, 98, 98, 98, 98, 98, + 98, 98, 98, 98, 98, 98, 98, 98, + 98, 98, 98, 98, 98, 98, 98, 98, + 98, 98, 98, 98, 98, 98, 98, 97, + 97, 98, 97, 98, 97, 97, 98, 98, + 97, 97, 97, 99, 97, 97, 100, 100, + 100, 100, 100, 100, 100, 100, 100, 100, + 97, 97, 97, 97, 97, 97, 97, 96, + 96, 96, 96, 96, 96, 96, 96, 96, + 96, 96, 96, 96, 96, 96, 96, 96, + 96, 96, 96, 96, 96, 96, 96, 96, + 96, 98, 97, 98, 98, 96, 97, 96, + 96, 96, 96, 96, 96, 96, 96, 96, + 96, 96, 96, 96, 96, 96, 96, 96, + 96, 96, 96, 96, 96, 96, 96, 96, + 96, 98, 98, 98, 97, 98, 96, 98, + 98, 98, 98, 98, 98, 98, 98, 98, + 98, 98, 98, 98, 98, 98, 98, 98, + 98, 98, 98, 98, 98, 98, 98, 98, + 98, 98, 98, 98, 98, 98, 98, 98, + 98, 98, 98, 98, 98, 98, 98, 98, + 98, 98, 98, 98, 98, 98, 98, 97, + 97, 97, 97, 97, 97, 97, 97, 97, + 97, 98, 98, 98, 98, 98, 98, 98, + 97, 97, 97, 97, 97, 97, 97, 97, + 97, 97, 97, 97, 97, 97, 97, 97, + 97, 97, 97, 97, 97, 97, 97, 97, + 97, 97, 98, 98, 98, 98, 97, 98, + 97, 97, 97, 97, 97, 97, 97, 97, + 97, 97, 97, 97, 97, 97, 97, 97, + 97, 97, 97, 97, 97, 97, 97, 97, + 97, 97, 98, 98, 98, 98, 98, 97, + 98, 98, 98, 98, 98, 98, 98, 98, + 98, 98, 98, 98, 98, 98, 98, 98, + 98, 98, 98, 98, 98, 98, 98, 98, + 98, 98, 98, 98, 98, 98, 98, 98, + 98, 98, 98, 98, 98, 98, 98, 98, + 98, 98, 98, 98, 98, 98, 98, 98, + 101, 101, 101, 101, 101, 101, 101, 101, + 101, 101, 98, 98, 98, 98, 98, 98, + 102, 101, 101, 101, 101, 101, 101, 101, + 101, 101, 101, 101, 101, 101, 101, 101, + 101, 101, 101, 101, 101, 101, 101, 101, + 101, 101, 101, 98, 98, 98, 98, 101, + 98, 101, 101, 101, 101, 101, 101, 101, + 101, 101, 101, 101, 101, 101, 101, 101, + 101, 101, 101, 101, 101, 101, 101, 101, + 101, 101, 101, 98, 98, 98, 98, 98, + 101, 98, 98, 98, 98, 98, 98, 98, + 98, 98, 98, 98, 98, 98, 98, 98, + 98, 98, 98, 98, 98, 98, 98, 98, + 98, 98, 98, 98, 98, 98, 98, 98, + 98, 98, 98, 98, 98, 98, 98, 98, + 98, 98, 98, 98, 98, 98, 98, 98, + 98, 103, 103, 103, 103, 103, 103, 103, + 103, 103, 103, 98, 98, 98, 98, 98, + 98, 98, 103, 103, 103, 103, 103, 103, + 103, 103, 103, 103, 103, 103, 103, 103, + 103, 103, 103, 103, 103, 103, 103, 103, + 103, 103, 103, 103, 98, 98, 98, 98, + 103, 98, 103, 103, 103, 103, 103, 103, + 103, 103, 103, 103, 103, 103, 103, 103, + 103, 103, 103, 103, 103, 103, 103, 103, + 103, 103, 103, 103, 98, 98, 98, 98, + 98, 103, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 105, 105, 105, 105, 105, 105, + 105, 105, 105, 105, 104, 104, 104, 104, + 104, 104, 104, 105, 105, 105, 105, 105, + 105, 105, 105, 105, 105, 105, 105, 105, + 105, 105, 105, 105, 105, 105, 105, 105, + 105, 105, 105, 105, 105, 104, 104, 104, + 104, 105, 104, 105, 105, 105, 105, 105, + 105, 105, 105, 105, 105, 105, 105, 105, + 105, 105, 105, 105, 105, 105, 105, 105, + 105, 105, 105, 105, 105, 104, 104, 104, + 104, 104, 105, 107, 107, 107, 107, 107, + 107, 107, 107, 107, 107, 107, 107, 107, + 107, 107, 107, 107, 107, 107, 107, 107, + 107, 107, 107, 107, 107, 107, 107, 107, + 107, 107, 107, 107, 107, 107, 107, 107, + 107, 107, 107, 107, 107, 107, 107, 107, + 107, 107, 107, 106, 106, 106, 106, 106, + 106, 106, 106, 106, 106, 107, 107, 107, + 107, 107, 107, 107, 106, 106, 106, 106, + 106, 106, 106, 106, 106, 106, 106, 106, + 106, 106, 106, 106, 106, 106, 106, 106, + 106, 106, 106, 106, 106, 106, 107, 107, + 107, 107, 107, 107, 106, 106, 106, 106, + 106, 106, 106, 106, 106, 106, 106, 106, + 106, 106, 106, 106, 106, 106, 106, 106, + 106, 106, 106, 106, 106, 106, 107, 107, + 107, 107, 107, 106, 108, 108, 108, 108, + 108, 108, 108, 108, 108, 108, 108, 108, + 108, 108, 108, 108, 108, 108, 108, 108, + 108, 108, 108, 108, 108, 108, 108, 108, + 108, 108, 108, 108, 108, 110, 108, 108, + 108, 108, 108, 108, 108, 108, 108, 108, + 108, 108, 108, 108, 109, 109, 109, 109, + 109, 109, 109, 109, 109, 109, 111, 108, + 108, 108, 108, 110, 108, 109, 109, 109, + 109, 109, 109, 109, 109, 109, 109, 109, + 109, 109, 109, 109, 109, 109, 109, 109, + 109, 109, 109, 109, 109, 109, 109, 108, + 108, 108, 108, 109, 108, 109, 109, 109, + 109, 109, 109, 109, 109, 109, 109, 109, + 109, 109, 109, 109, 109, 109, 109, 109, + 109, 109, 109, 109, 109, 109, 109, 108, + 108, 108, 108, 108, 109, 111, 108, 108, + 112, 113, 108, 114, 114, 114, 114, 114, + 114, 114, 114, 114, 114, 114, 114, 114, + 114, 114, 114, 114, 114, 114, 114, 114, + 114, 114, 114, 114, 114, 114, 114, 114, + 114, 114, 114, 114, 116, 114, 114, 114, + 114, 114, 114, 114, 114, 114, 114, 114, + 114, 114, 114, 115, 115, 115, 115, 115, + 115, 115, 115, 115, 115, 117, 114, 114, + 114, 114, 116, 114, 115, 115, 115, 115, + 115, 115, 115, 115, 115, 115, 115, 115, + 115, 115, 115, 115, 115, 115, 115, 115, + 115, 115, 115, 115, 115, 115, 114, 114, + 114, 114, 115, 114, 115, 115, 115, 115, + 115, 115, 115, 115, 115, 115, 115, 115, + 115, 115, 115, 115, 115, 115, 115, 115, + 115, 115, 115, 115, 115, 115, 114, 114, + 114, 114, 114, 115, 117, 114, 119, 118, + 120, 118, 121, 118, 118, 118, 118, 118, + 118, 118, 118, 118, 118, 123, 118, 123, + 123, 123, 118, 118, 118, 118, 118, 118, + 118, 118, 118, 118, 118, 118, 118, 118, + 118, 118, 118, 118, 123, 118, 118, 118, + 118, 124, 125, 118, 126, 118, 127, 128, + 129, 130, 131, 124, 118, 118, 118, 118, + 118, 118, 118, 118, 118, 118, 132, 118, + 133, 129, 134, 135, 118, 122, 122, 122, + 122, 122, 122, 122, 122, 122, 122, 122, + 122, 122, 122, 122, 122, 122, 122, 122, + 122, 122, 122, 122, 122, 122, 122, 136, + 137, 129, 138, 122, 118, 122, 122, 122, + 122, 122, 122, 122, 122, 139, 122, 122, + 122, 122, 122, 122, 122, 122, 140, 122, + 122, 141, 122, 142, 122, 122, 122, 143, + 144, 118, 138, 118, 122, 118, 118, 118, + 118, 118, 118, 118, 118, 118, 145, 118, + 145, 145, 145, 118, 118, 118, 118, 118, + 118, 118, 118, 118, 118, 118, 118, 118, + 118, 118, 118, 118, 118, 145, 118, 118, + 118, 118, 146, 147, 118, 148, 118, 149, + 150, 151, 152, 153, 146, 118, 118, 118, + 118, 118, 118, 118, 118, 118, 118, 154, + 118, 155, 151, 156, 157, 118, 115, 115, + 115, 115, 115, 115, 115, 115, 115, 115, + 115, 115, 115, 115, 115, 115, 115, 115, + 115, 115, 115, 115, 115, 115, 115, 115, + 158, 159, 151, 120, 115, 118, 115, 115, + 115, 115, 115, 115, 115, 115, 160, 115, + 115, 115, 115, 115, 115, 115, 115, 161, + 115, 115, 162, 115, 163, 115, 115, 115, + 164, 165, 118, 120, 118, 115, 118, 118, + 118, 118, 118, 118, 118, 118, 118, 118, + 118, 118, 118, 118, 118, 118, 118, 118, + 118, 118, 118, 118, 118, 118, 118, 118, + 118, 118, 118, 118, 118, 118, 118, 116, + 118, 118, 118, 118, 118, 118, 118, 118, + 118, 118, 118, 118, 118, 118, 115, 115, + 115, 115, 115, 115, 115, 115, 115, 115, + 117, 118, 118, 118, 118, 116, 118, 115, + 115, 115, 115, 115, 115, 115, 115, 115, + 115, 115, 115, 115, 115, 115, 115, 115, + 115, 115, 115, 115, 115, 115, 115, 115, + 115, 118, 118, 118, 118, 115, 118, 115, + 115, 115, 115, 115, 166, 115, 115, 115, + 115, 115, 115, 115, 115, 115, 115, 115, + 115, 115, 115, 115, 115, 115, 115, 115, + 115, 118, 118, 118, 118, 118, 115, 118, + 118, 118, 118, 118, 118, 118, 118, 118, + 118, 118, 118, 118, 118, 118, 118, 118, + 118, 118, 118, 118, 118, 118, 118, 118, + 118, 118, 118, 118, 118, 118, 118, 118, + 116, 118, 118, 118, 118, 118, 118, 118, + 118, 118, 118, 118, 118, 118, 118, 115, + 115, 115, 115, 115, 115, 115, 115, 115, + 115, 117, 118, 118, 118, 118, 116, 118, + 115, 115, 115, 115, 115, 115, 115, 115, + 115, 115, 115, 115, 115, 115, 115, 115, + 115, 115, 115, 115, 115, 115, 115, 115, + 115, 115, 118, 118, 118, 118, 115, 118, + 115, 115, 115, 115, 167, 115, 115, 115, + 115, 115, 115, 115, 115, 115, 115, 115, + 115, 115, 115, 115, 115, 115, 115, 115, + 115, 115, 118, 118, 118, 118, 118, 115, + 118, 118, 118, 118, 118, 118, 118, 118, + 118, 118, 118, 118, 118, 118, 118, 118, + 118, 118, 118, 118, 118, 118, 118, 118, + 118, 118, 118, 118, 118, 118, 118, 118, + 118, 116, 118, 118, 118, 118, 118, 118, + 118, 118, 118, 118, 118, 118, 118, 118, + 115, 115, 115, 115, 115, 115, 115, 115, + 115, 115, 117, 118, 118, 118, 118, 116, + 118, 115, 115, 115, 115, 115, 115, 115, + 115, 115, 115, 115, 115, 115, 115, 115, + 115, 115, 115, 115, 115, 115, 115, 115, + 115, 115, 115, 118, 118, 118, 118, 115, + 118, 115, 115, 115, 115, 115, 115, 115, + 115, 115, 115, 115, 115, 115, 115, 115, + 115, 115, 115, 168, 115, 115, 115, 115, + 115, 115, 115, 118, 118, 118, 118, 118, + 115, 118, 118, 118, 118, 118, 118, 118, + 118, 118, 118, 118, 118, 118, 118, 118, + 118, 118, 118, 118, 118, 118, 118, 118, + 118, 118, 118, 118, 118, 118, 118, 118, + 118, 118, 116, 118, 118, 118, 118, 118, + 118, 118, 118, 118, 118, 118, 118, 118, + 118, 115, 115, 115, 115, 115, 115, 115, + 115, 115, 115, 117, 118, 118, 118, 118, + 116, 118, 115, 115, 115, 115, 115, 115, + 115, 115, 115, 115, 115, 115, 115, 115, + 115, 115, 115, 115, 115, 115, 115, 115, + 115, 115, 115, 115, 118, 118, 118, 118, + 115, 118, 115, 115, 169, 115, 115, 115, + 115, 115, 115, 115, 115, 115, 115, 115, + 115, 115, 115, 115, 115, 115, 115, 115, + 115, 115, 115, 115, 118, 118, 118, 118, + 118, 115, 118, 118, 118, 118, 118, 118, + 118, 118, 118, 118, 118, 118, 118, 118, + 118, 118, 118, 118, 118, 118, 118, 118, + 118, 118, 118, 118, 118, 118, 118, 118, + 118, 118, 118, 116, 118, 118, 118, 118, + 118, 118, 118, 118, 118, 118, 118, 118, + 118, 118, 115, 115, 115, 115, 115, 115, + 115, 115, 115, 115, 117, 118, 118, 118, + 118, 116, 118, 115, 115, 115, 115, 115, + 115, 115, 115, 115, 115, 115, 115, 115, + 115, 115, 115, 115, 115, 115, 115, 115, + 115, 115, 115, 115, 115, 118, 118, 118, + 118, 115, 118, 115, 115, 115, 115, 115, + 115, 115, 115, 115, 115, 115, 115, 115, + 115, 115, 115, 115, 115, 115, 115, 170, + 115, 115, 115, 115, 115, 118, 118, 118, + 118, 118, 115, 118, 118, 118, 118, 118, + 118, 118, 118, 118, 118, 118, 118, 118, + 118, 118, 118, 118, 118, 118, 118, 118, + 118, 118, 118, 118, 118, 118, 118, 118, + 118, 118, 118, 118, 116, 118, 118, 118, + 118, 118, 118, 118, 118, 118, 118, 118, + 118, 118, 118, 115, 115, 115, 115, 115, + 115, 115, 115, 115, 115, 117, 118, 118, + 118, 118, 116, 118, 115, 115, 115, 115, + 115, 115, 115, 115, 115, 115, 115, 115, + 115, 115, 115, 115, 115, 115, 115, 115, + 115, 115, 115, 115, 115, 115, 118, 118, + 118, 118, 115, 118, 115, 115, 115, 115, + 166, 115, 115, 115, 115, 115, 115, 115, + 115, 115, 115, 115, 115, 115, 115, 115, + 115, 115, 115, 115, 115, 115, 118, 118, + 118, 118, 118, 115, 118, 118, 118, 118, + 118, 118, 118, 118, 118, 118, 118, 118, + 118, 118, 118, 118, 118, 118, 118, 118, + 118, 118, 118, 118, 118, 118, 118, 118, + 118, 118, 118, 118, 118, 116, 118, 118, + 118, 118, 118, 118, 118, 118, 118, 118, + 118, 118, 118, 118, 115, 115, 115, 115, + 115, 115, 115, 115, 115, 115, 117, 118, + 118, 118, 118, 116, 118, 115, 115, 115, + 115, 115, 115, 115, 115, 115, 115, 115, + 115, 115, 115, 115, 115, 115, 115, 115, + 115, 115, 115, 115, 115, 115, 115, 118, + 118, 118, 118, 115, 118, 115, 115, 115, + 115, 115, 115, 115, 115, 115, 115, 115, + 115, 115, 171, 115, 115, 115, 115, 115, + 115, 115, 115, 115, 115, 115, 115, 118, + 118, 118, 118, 118, 115, 118, 118, 118, + 118, 118, 118, 118, 118, 118, 118, 118, + 118, 118, 118, 118, 118, 118, 118, 118, + 118, 118, 118, 118, 118, 118, 118, 118, + 118, 118, 118, 118, 118, 118, 116, 118, + 118, 118, 118, 118, 118, 118, 118, 118, + 118, 118, 118, 118, 118, 115, 115, 115, + 115, 115, 115, 115, 115, 115, 115, 117, + 118, 118, 118, 118, 116, 118, 115, 115, + 115, 115, 115, 115, 115, 115, 115, 115, + 115, 115, 115, 115, 115, 115, 115, 115, + 115, 115, 115, 115, 115, 115, 115, 115, + 118, 118, 118, 118, 115, 118, 115, 115, + 115, 115, 115, 115, 115, 115, 115, 115, + 115, 172, 115, 115, 115, 115, 115, 115, + 115, 173, 115, 115, 115, 115, 115, 115, + 118, 118, 118, 118, 118, 115, 118, 118, + 118, 118, 118, 118, 118, 118, 118, 118, + 118, 118, 118, 118, 118, 118, 118, 118, + 118, 118, 118, 118, 118, 118, 118, 118, + 118, 118, 118, 118, 118, 118, 118, 116, + 118, 118, 118, 118, 118, 118, 118, 118, + 118, 118, 118, 118, 118, 118, 115, 115, + 115, 115, 115, 115, 115, 115, 115, 115, + 117, 118, 118, 118, 118, 116, 118, 115, + 115, 115, 115, 115, 115, 115, 115, 115, + 115, 115, 115, 115, 115, 115, 115, 115, + 115, 115, 115, 115, 115, 115, 115, 115, + 115, 118, 118, 118, 118, 115, 118, 115, + 115, 115, 115, 174, 115, 115, 115, 115, + 115, 115, 115, 115, 115, 115, 115, 115, + 115, 115, 115, 115, 115, 115, 115, 115, + 115, 118, 118, 118, 118, 118, 115, 118, + 118, 118, 118, 118, 118, 118, 118, 118, + 118, 118, 118, 118, 118, 118, 118, 118, + 118, 118, 118, 118, 118, 118, 118, 118, + 118, 118, 118, 118, 118, 118, 118, 118, + 116, 118, 118, 118, 118, 118, 118, 118, + 118, 118, 118, 118, 118, 118, 118, 115, + 115, 115, 115, 115, 115, 115, 115, 115, + 115, 117, 118, 118, 118, 118, 116, 118, + 115, 115, 115, 115, 115, 115, 115, 115, + 115, 115, 115, 115, 115, 115, 115, 115, + 115, 115, 115, 115, 115, 115, 115, 115, + 115, 115, 118, 118, 118, 118, 115, 118, + 115, 115, 115, 115, 115, 115, 115, 115, + 115, 115, 115, 115, 115, 115, 115, 115, + 115, 115, 175, 115, 115, 115, 115, 115, + 115, 115, 118, 118, 118, 118, 118, 115, + 118, 118, 118, 118, 118, 118, 118, 118, + 118, 118, 118, 118, 118, 118, 118, 118, + 118, 118, 118, 118, 118, 118, 118, 118, + 118, 118, 118, 118, 118, 118, 118, 118, + 118, 116, 118, 118, 118, 118, 118, 118, + 118, 118, 118, 118, 118, 118, 118, 118, + 115, 115, 115, 115, 115, 115, 115, 115, + 115, 115, 117, 118, 118, 118, 118, 116, + 118, 115, 115, 115, 115, 115, 115, 115, + 115, 115, 115, 115, 115, 115, 115, 115, + 115, 115, 115, 115, 115, 115, 115, 115, + 115, 115, 115, 118, 118, 118, 118, 115, + 118, 115, 115, 115, 115, 115, 115, 115, + 115, 115, 115, 115, 115, 115, 115, 115, + 115, 115, 115, 166, 115, 115, 115, 115, + 115, 115, 115, 118, 118, 118, 118, 118, + 115, 118, 118, 118, 118, 118, 118, 118, + 118, 118, 118, 118, 118, 118, 118, 118, + 118, 118, 118, 118, 118, 118, 118, 118, + 118, 118, 118, 118, 118, 118, 118, 118, + 118, 118, 116, 118, 118, 118, 118, 118, + 118, 118, 118, 118, 118, 118, 118, 118, + 118, 115, 115, 115, 115, 115, 115, 115, + 115, 115, 115, 117, 118, 118, 118, 118, + 116, 118, 115, 115, 115, 115, 115, 115, + 115, 115, 115, 115, 115, 115, 115, 115, + 115, 115, 115, 115, 115, 115, 115, 115, + 115, 115, 115, 115, 118, 118, 118, 118, + 115, 118, 115, 115, 115, 115, 115, 115, + 115, 115, 176, 115, 115, 115, 115, 115, + 115, 115, 115, 115, 115, 115, 115, 115, + 115, 115, 115, 115, 118, 118, 118, 118, + 118, 115, 118, 118, 118, 118, 118, 118, + 118, 118, 118, 118, 118, 118, 118, 118, + 118, 118, 118, 118, 118, 118, 118, 118, + 118, 118, 118, 118, 118, 118, 118, 118, + 118, 118, 118, 116, 118, 118, 118, 118, + 118, 118, 118, 118, 118, 118, 118, 118, + 118, 118, 115, 115, 115, 115, 115, 115, + 115, 115, 115, 115, 117, 118, 118, 118, + 118, 116, 118, 115, 115, 115, 115, 115, + 115, 115, 115, 115, 115, 115, 115, 115, + 115, 115, 115, 115, 115, 115, 115, 115, + 115, 115, 115, 115, 115, 118, 118, 118, + 118, 115, 118, 115, 115, 115, 115, 115, + 115, 115, 115, 115, 115, 115, 166, 115, + 115, 115, 115, 115, 115, 115, 115, 115, + 115, 115, 115, 115, 115, 118, 118, 118, + 118, 118, 115, 118, 118, 118, 118, 118, + 118, 118, 118, 118, 118, 118, 118, 118, + 118, 118, 118, 118, 118, 118, 118, 118, + 118, 118, 118, 118, 118, 118, 118, 118, + 118, 118, 118, 118, 116, 118, 118, 118, + 118, 118, 118, 118, 118, 118, 118, 118, + 118, 118, 118, 115, 115, 115, 115, 115, + 115, 115, 115, 115, 115, 117, 118, 118, + 118, 118, 116, 118, 115, 115, 115, 115, + 115, 115, 115, 115, 115, 115, 115, 115, + 115, 115, 115, 115, 115, 115, 115, 115, + 115, 115, 115, 115, 115, 115, 118, 118, + 118, 118, 115, 118, 115, 115, 115, 115, + 115, 115, 115, 177, 115, 115, 115, 115, + 115, 115, 115, 115, 115, 115, 115, 115, + 115, 115, 115, 115, 115, 115, 118, 118, + 118, 118, 118, 115, 118, 118, 118, 118, + 118, 118, 118, 118, 118, 118, 118, 118, + 118, 118, 118, 118, 118, 118, 118, 118, + 118, 118, 118, 118, 118, 118, 118, 118, + 118, 118, 118, 118, 118, 116, 118, 118, + 118, 118, 118, 118, 118, 118, 118, 118, + 118, 118, 118, 118, 115, 115, 115, 115, + 115, 115, 115, 115, 115, 115, 117, 118, + 118, 118, 118, 116, 118, 115, 115, 115, + 115, 115, 115, 115, 115, 115, 115, 115, + 115, 115, 115, 115, 115, 115, 115, 115, + 115, 115, 115, 115, 115, 115, 115, 118, + 118, 118, 118, 115, 118, 115, 115, 115, + 115, 115, 115, 115, 115, 178, 115, 115, + 115, 115, 115, 115, 115, 115, 115, 115, + 115, 115, 115, 115, 115, 115, 115, 118, + 118, 118, 118, 118, 115, 118, 118, 118, + 118, 118, 118, 118, 118, 118, 118, 118, + 118, 118, 118, 118, 118, 118, 118, 118, + 118, 118, 118, 118, 118, 118, 118, 118, + 118, 118, 118, 118, 118, 118, 116, 118, + 118, 118, 118, 118, 118, 118, 118, 118, + 118, 118, 118, 118, 118, 115, 115, 115, + 115, 115, 115, 115, 115, 115, 115, 117, + 118, 118, 118, 118, 116, 118, 115, 115, + 115, 115, 115, 115, 115, 115, 115, 115, + 115, 115, 115, 115, 115, 115, 115, 115, + 115, 115, 115, 115, 115, 115, 115, 115, + 118, 118, 118, 118, 115, 118, 115, 115, + 115, 115, 115, 115, 115, 115, 115, 115, + 115, 170, 115, 115, 115, 115, 115, 115, + 115, 115, 115, 115, 115, 115, 115, 115, + 118, 118, 118, 118, 118, 115, 180, 179, + 181, 179, 182, 179, 151, 179, 183, 179, + 179, 179, 179, 179, 179, 179, 184, 179, + 185, 179, 186, 179, 151, 179, 187, 179, + 151, 179, 188, 179, 182, 179, 190, 189, + 191, 191, 191, 191, 191, 191, 191, 191, + 191, 193, 191, 193, 193, 193, 191, 191, + 191, 191, 191, 191, 191, 191, 191, 191, + 191, 191, 191, 191, 191, 191, 191, 191, + 193, 191, 191, 191, 191, 191, 191, 191, + 194, 191, 191, 191, 191, 191, 191, 191, + 191, 191, 191, 191, 191, 191, 191, 191, + 191, 191, 191, 191, 191, 191, 191, 191, + 191, 192, 192, 192, 192, 192, 192, 192, + 192, 192, 192, 192, 192, 192, 192, 192, + 192, 192, 192, 192, 192, 192, 192, 192, + 192, 192, 192, 191, 195, 191, 191, 192, + 191, 192, 192, 192, 196, 192, 192, 192, + 192, 192, 192, 192, 192, 192, 192, 192, + 192, 192, 192, 192, 192, 192, 192, 192, + 192, 192, 192, 191, 191, 191, 191, 191, + 192, 197, 191, 191, 191, 191, 191, 191, + 191, 191, 191, 191, 199, 191, 199, 199, + 199, 191, 191, 191, 191, 191, 191, 191, + 191, 191, 191, 191, 191, 191, 191, 191, + 191, 191, 191, 199, 191, 191, 191, 191, + 191, 191, 191, 200, 191, 191, 191, 191, + 191, 191, 191, 191, 191, 191, 191, 191, + 191, 191, 191, 191, 191, 191, 191, 191, + 191, 191, 191, 191, 198, 198, 198, 198, + 198, 198, 198, 198, 198, 198, 198, 198, + 198, 198, 198, 198, 198, 198, 198, 198, + 198, 198, 198, 198, 198, 198, 191, 201, + 191, 191, 198, 191, 198, 198, 198, 202, + 198, 198, 198, 198, 198, 198, 198, 198, + 198, 198, 198, 198, 198, 198, 198, 198, + 198, 198, 198, 198, 198, 198, 191, 191, + 191, 191, 191, 198, 204, 203, 204, 204, + 204, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 204, 203, 203, 203, 203, + 203, 203, 203, 205, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 206, + 203, 207, 203, 208, 203, 208, 208, 208, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 208, 203, 203, 203, 203, 203, + 203, 203, 209, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 210, 203, + 211, 212, 214, 213, 215, 213, 216, 213, + 217, 213, 218, 213, 220, 220, 220, 220, + 220, 220, 220, 220, 220, 220, 220, 220, + 220, 220, 220, 220, 220, 220, 220, 220, + 220, 220, 220, 220, 220, 220, 220, 220, + 220, 220, 220, 220, 220, 220, 220, 220, + 220, 220, 220, 220, 220, 220, 220, 220, + 220, 220, 220, 220, 219, 219, 219, 219, + 219, 219, 219, 219, 219, 219, 220, 220, + 220, 220, 220, 220, 220, 219, 219, 219, + 219, 219, 219, 219, 219, 219, 219, 219, + 219, 219, 219, 219, 219, 219, 219, 219, + 219, 219, 219, 219, 219, 219, 219, 220, + 220, 220, 220, 220, 220, 219, 219, 219, + 219, 219, 219, 219, 219, 219, 219, 219, + 219, 219, 219, 219, 219, 219, 219, 219, + 219, 219, 219, 219, 219, 219, 219, 220, + 220, 220, 220, 220, 219, 221, 211, 222, + 223, 222, 222, 222, 211, 211, 211, 211, + 211, 211, 211, 211, 211, 211, 211, 211, + 211, 211, 211, 211, 211, 211, 222, 211, + 211, 224, 211, 211, 211, 211, 211, 211, + 211, 211, 211, 211, 211, 211, 225, 225, + 225, 225, 225, 225, 225, 225, 225, 225, + 211, 211, 211, 211, 211, 211, 211, 211, + 211, 211, 211, 211, 211, 211, 211, 211, + 211, 211, 211, 211, 211, 211, 211, 211, + 211, 211, 211, 211, 211, 211, 211, 211, + 211, 211, 226, 211, 227, 228, 227, 227, + 227, 211, 211, 211, 211, 211, 211, 211, + 211, 211, 211, 211, 211, 211, 211, 211, + 211, 211, 211, 227, 211, 211, 229, 211, + 211, 211, 211, 211, 211, 211, 211, 211, + 211, 211, 211, 230, 230, 230, 230, 230, + 230, 230, 230, 230, 230, 211, 211, 211, + 211, 211, 211, 211, 211, 211, 211, 211, + 211, 211, 211, 211, 211, 211, 211, 211, + 211, 211, 211, 211, 211, 211, 211, 211, + 211, 211, 211, 211, 211, 211, 211, 231, + 211, 233, 234, 233, 233, 233, 232, 232, + 232, 232, 232, 232, 232, 232, 232, 232, + 232, 232, 232, 232, 232, 232, 232, 232, + 233, 232, 232, 235, 232, 232, 232, 232, + 232, 232, 232, 232, 232, 232, 232, 232, + 236, 236, 236, 236, 236, 236, 236, 236, + 236, 236, 232, 232, 232, 232, 232, 232, + 232, 232, 232, 232, 232, 232, 232, 232, + 232, 232, 232, 232, 232, 232, 232, 232, + 232, 232, 232, 232, 232, 232, 232, 232, + 232, 232, 232, 232, 237, 232, 239, 240, + 239, 239, 239, 238, 238, 238, 238, 238, + 238, 238, 238, 238, 238, 238, 238, 238, + 238, 238, 238, 238, 238, 239, 238, 238, + 241, 238, 238, 238, 238, 238, 238, 238, + 238, 238, 238, 238, 238, 242, 242, 242, + 242, 242, 242, 242, 242, 242, 242, 238, + 238, 238, 238, 238, 238, 238, 238, 238, + 238, 238, 238, 238, 238, 238, 238, 238, + 238, 238, 238, 238, 238, 238, 238, 238, + 238, 238, 238, 238, 238, 238, 238, 238, + 238, 243, 238, 239, 244, 239, 239, 239, + 238, 238, 238, 238, 238, 238, 238, 238, + 238, 238, 238, 238, 238, 238, 238, 238, + 238, 238, 239, 238, 238, 241, 238, 238, + 238, 238, 238, 238, 238, 238, 238, 238, + 238, 238, 242, 242, 242, 242, 242, 242, + 242, 242, 242, 242, 238, 238, 238, 238, + 238, 238, 238, 238, 238, 238, 238, 238, + 238, 238, 238, 238, 238, 238, 238, 238, + 238, 238, 238, 238, 238, 238, 238, 238, + 238, 238, 238, 238, 238, 238, 243, 238, + 223, 211, 245, 245, 245, 245, 245, 245, + 245, 245, 245, 245, 245, 245, 245, 245, + 245, 245, 245, 245, 245, 245, 245, 245, + 245, 245, 245, 245, 245, 245, 245, 245, + 245, 245, 245, 247, 247, 245, 247, 245, + 247, 247, 245, 245, 247, 247, 247, 248, + 247, 247, 249, 249, 249, 249, 249, 249, + 249, 249, 249, 249, 247, 247, 247, 247, + 247, 247, 247, 246, 246, 246, 246, 246, + 246, 246, 246, 246, 246, 246, 246, 246, + 246, 246, 246, 246, 246, 246, 246, 246, + 246, 246, 246, 246, 246, 245, 247, 245, + 245, 246, 247, 246, 246, 246, 246, 246, + 246, 246, 246, 246, 246, 246, 246, 246, + 246, 246, 246, 246, 246, 246, 246, 246, + 246, 246, 246, 246, 246, 245, 245, 245, + 247, 245, 246, 245, 245, 245, 245, 245, + 245, 245, 245, 245, 245, 245, 245, 245, + 245, 245, 245, 245, 245, 245, 245, 245, + 245, 245, 245, 245, 245, 245, 245, 245, + 245, 245, 245, 245, 245, 245, 245, 245, + 245, 245, 245, 245, 245, 245, 245, 245, + 245, 245, 245, 247, 247, 247, 247, 247, + 247, 247, 247, 247, 247, 245, 245, 245, + 245, 245, 245, 245, 247, 247, 247, 247, + 247, 247, 247, 247, 247, 247, 247, 247, + 247, 247, 247, 247, 247, 247, 247, 247, + 247, 247, 247, 247, 247, 247, 245, 245, + 245, 245, 247, 245, 247, 247, 247, 247, + 247, 247, 247, 247, 247, 247, 247, 247, + 247, 247, 247, 247, 247, 247, 247, 247, + 247, 247, 247, 247, 247, 247, 245, 245, + 245, 245, 245, 247, 250, 247, 245, 245, + 245, 245, 245, 245, 245, 245, 245, 245, + 245, 245, 245, 245, 245, 245, 245, 245, + 245, 245, 245, 245, 245, 245, 245, 245, + 245, 245, 245, 245, 245, 245, 245, 245, + 245, 245, 245, 245, 245, 245, 245, 245, + 245, 245, 245, 245, 245, 245, 245, 245, + 245, 245, 245, 245, 245, 245, 245, 245, + 245, 245, 245, 245, 245, 247, 245, 250, + 245, 245, 245, 245, 245, 245, 245, 245, + 245, 245, 245, 245, 245, 245, 245, 245, + 245, 245, 245, 245, 245, 245, 245, 245, + 245, 245, 245, 245, 245, 245, 245, 245, + 245, 245, 245, 252, 245, 245, 245, 245, + 253, 245, 245, 245, 245, 245, 254, 245, + 245, 245, 245, 245, 245, 245, 245, 245, + 245, 245, 245, 245, 245, 245, 221, 245, + 245, 245, 251, 251, 251, 251, 251, 251, + 251, 251, 251, 251, 251, 251, 251, 251, + 251, 251, 251, 251, 251, 251, 251, 251, + 251, 251, 251, 251, 245, 245, 245, 245, + 251, 255, 251, 251, 251, 251, 251, 251, + 251, 251, 251, 251, 251, 251, 251, 251, + 251, 251, 251, 251, 251, 251, 251, 251, + 251, 251, 251, 251, 245, 245, 245, 254, + 245, 251, 257, 257, 257, 257, 257, 257, + 257, 257, 257, 257, 258, 257, 257, 257, + 257, 257, 257, 257, 257, 257, 257, 257, + 257, 257, 257, 257, 257, 257, 257, 257, + 257, 257, 257, 257, 257, 257, 257, 257, + 257, 257, 257, 257, 257, 257, 257, 257, + 257, 257, 256, 256, 256, 256, 256, 256, + 256, 256, 256, 256, 257, 257, 257, 257, + 257, 257, 257, 256, 256, 256, 256, 256, + 256, 256, 256, 256, 256, 256, 256, 256, + 256, 256, 256, 256, 256, 256, 256, 256, + 256, 256, 256, 256, 256, 257, 257, 257, + 257, 256, 257, 256, 256, 256, 256, 256, + 256, 256, 256, 256, 256, 256, 256, 256, + 256, 256, 256, 256, 256, 256, 256, 256, + 256, 256, 256, 256, 256, 257, 257, 257, + 257, 257, 256, 260, 259, 263, 262, 258, + 257, 263, 264, 245, 245, 245, 245, 245, + 245, 245, 245, 245, 245, 245, 245, 245, + 245, 245, 245, 245, 245, 245, 245, 245, + 245, 245, 245, 245, 245, 245, 245, 245, + 245, 245, 245, 245, 245, 252, 245, 245, + 245, 245, 253, 245, 245, 245, 245, 245, + 245, 245, 245, 245, 245, 245, 245, 245, + 245, 245, 245, 245, 245, 245, 245, 245, + 245, 245, 245, 245, 251, 251, 251, 251, + 251, 251, 251, 251, 251, 251, 251, 251, + 251, 251, 251, 251, 251, 251, 251, 251, + 251, 251, 251, 251, 251, 251, 245, 245, + 245, 245, 251, 255, 251, 251, 251, 251, + 251, 251, 251, 251, 251, 251, 251, 251, + 251, 251, 251, 251, 251, 251, 251, 251, + 251, 251, 251, 251, 251, 251, 245, 245, + 245, 245, 245, 251, 266, 265, 265, 265, + 265, 265, 265, 265, 265, 265, 265, 265, + 265, 265, 265, 265, 265, 265, 265, 265, + 265, 265, 265, 265, 265, 265, 265, 265, + 265, 265, 265, 265, 265, 265, 265, 265, + 265, 265, 265, 265, 265, 265, 265, 265, + 265, 265, 265, 265, 265, 265, 265, 265, + 265, 265, 265, 265, 265, 265, 265, 265, + 265, 265, 265, 265, 265, 265, 265, 265, + 265, 265, 265, 265, 265, 265, 265, 265, + 265, 265, 265, 265, 265, 265, 265, 265, + 265, 265, 263, 265, 263, 266, 267, 268, + 268, 268, 267, 268, 268, 268, 268, 268, + 268, 268, 268, 268, 268, 268, 268, 268, + 268, 268, 268, 268, 268, 268, 268, 268, + 267, 268, 268, 268, 268, 268, 268, 268, + 268, 268, 268, 268, 268, 268, 268, 268, + 268, 268, 268, 269, 268, 267, 270, 270, + 270, 267, 270, 270, 270, 270, 270, 271, + 270, 270, 270, 270, 270, 270, 270, 270, + 270, 270, 270, 270, 270, 270, 270, 267, + 270, 270, 270, 270, 270, 270, 270, 270, + 270, 270, 270, 270, 270, 270, 270, 270, + 270, 270, 270, 270, 270, 270, 270, 270, + 270, 270, 270, 270, 270, 270, 270, 270, + 270, 270, 270, 270, 270, 270, 270, 270, + 270, 270, 270, 270, 270, 270, 270, 270, + 270, 270, 272, 270, 270, 270, 270, 270, + 270, 270, 270, 270, 270, 270, 270, 270, + 270, 270, 270, 270, 270, 270, 270, 270, + 270, 270, 270, 270, 270, 270, 270, 270, + 270, 270, 270, 270, 270, 270, 270, 270, + 270, 270, 270, 270, 270, 273, 270, 267, + 270, 270, 270, 267, 270, 270, 270, 270, + 270, 270, 270, 270, 270, 270, 270, 270, + 270, 270, 270, 270, 270, 270, 270, 270, + 270, 267, 270, 270, 270, 270, 270, 270, + 270, 270, 270, 270, 270, 270, 270, 270, + 270, 270, 270, 270, 270, 270, 270, 270, + 270, 270, 270, 270, 270, 270, 270, 270, + 270, 270, 270, 270, 270, 270, 270, 270, + 270, 270, 270, 270, 270, 270, 270, 270, + 270, 270, 270, 270, 274, 270, 270, 270, + 270, 270, 270, 270, 270, 270, 270, 270, + 270, 270, 270, 270, 270, 270, 270, 270, + 270, 270, 270, 270, 270, 270, 270, 270, + 270, 270, 270, 270, 270, 270, 270, 270, + 270, 270, 270, 270, 270, 270, 270, 273, + 270, 267, 275, 275, 275, 267, 275, 275, + 275, 275, 275, 275, 275, 275, 275, 275, + 275, 275, 275, 275, 275, 275, 275, 275, + 275, 275, 275, 267, 275, 275, 275, 275, + 275, 275, 275, 275, 275, 275, 275, 275, + 275, 275, 275, 275, 275, 275, 275, 275, + 275, 275, 275, 275, 275, 275, 275, 275, + 275, 275, 275, 275, 275, 275, 275, 275, + 276, 275, 275, 275, 275, 275, 275, 275, + 275, 275, 275, 275, 275, 275, 275, 275, + 275, 275, 275, 275, 275, 275, 275, 275, + 275, 275, 275, 275, 275, 277, 275, 267, + 278, 278, 278, 267, 278, 278, 278, 278, + 278, 279, 278, 278, 278, 278, 278, 278, + 278, 278, 278, 278, 278, 278, 278, 278, + 278, 267, 278, 278, 278, 278, 278, 278, + 278, 278, 278, 278, 278, 278, 278, 278, + 278, 278, 278, 278, 278, 278, 278, 278, + 278, 278, 278, 278, 278, 278, 278, 278, + 278, 278, 278, 278, 278, 278, 278, 278, + 278, 278, 278, 278, 278, 278, 278, 278, + 278, 278, 278, 278, 278, 278, 278, 278, + 278, 278, 278, 278, 278, 278, 278, 278, + 278, 278, 278, 278, 278, 278, 278, 278, + 278, 278, 278, 278, 278, 278, 278, 278, + 278, 278, 278, 278, 278, 278, 278, 278, + 278, 278, 278, 278, 278, 278, 278, 280, + 278, 267, 278, 278, 278, 267, 278, 278, + 278, 278, 278, 278, 278, 278, 278, 278, + 278, 278, 278, 278, 278, 278, 278, 278, + 278, 278, 278, 267, 278, 278, 278, 278, + 278, 278, 278, 278, 278, 278, 278, 278, + 278, 278, 278, 278, 278, 278, 278, 278, + 278, 278, 278, 278, 278, 278, 278, 278, + 278, 278, 278, 278, 278, 278, 278, 278, + 278, 278, 278, 278, 278, 278, 278, 278, + 278, 278, 278, 278, 278, 278, 278, 278, + 278, 278, 278, 278, 278, 278, 278, 278, + 278, 278, 278, 278, 278, 278, 278, 278, + 278, 278, 278, 278, 278, 278, 278, 278, + 278, 278, 278, 278, 278, 278, 278, 278, + 278, 278, 278, 278, 278, 278, 278, 278, + 278, 280, 278, 267, 268, 268, 268, 267, + 268, 268, 268, 268, 268, 268, 268, 268, + 268, 268, 268, 268, 268, 268, 268, 268, + 268, 268, 268, 268, 268, 267, 268, 268, + 268, 268, 268, 268, 268, 268, 268, 268, + 268, 268, 268, 268, 268, 268, 268, 268, + 281, 268, 267, 282, 282, 282, 267, 282, + 282, 282, 282, 282, 283, 282, 282, 282, + 282, 282, 282, 282, 282, 282, 282, 282, + 282, 282, 282, 282, 267, 282, 282, 282, + 282, 282, 282, 282, 282, 282, 282, 282, + 282, 282, 282, 282, 282, 282, 282, 282, + 282, 282, 282, 282, 282, 282, 282, 282, + 282, 282, 282, 282, 282, 282, 282, 282, + 282, 282, 282, 282, 282, 284, 282, 282, + 282, 282, 282, 282, 282, 282, 282, 282, + 282, 282, 282, 282, 282, 282, 282, 282, + 282, 282, 282, 282, 282, 282, 285, 282, + 282, 282, 282, 282, 282, 286, 282, 282, + 282, 282, 282, 282, 282, 282, 282, 282, + 282, 282, 282, 282, 282, 282, 282, 282, + 282, 282, 287, 282, 267, 282, 282, 282, + 267, 282, 282, 282, 282, 282, 282, 282, + 282, 282, 282, 282, 282, 282, 282, 282, + 282, 282, 282, 282, 282, 282, 267, 282, + 282, 282, 282, 282, 282, 282, 282, 282, + 282, 282, 282, 282, 282, 282, 282, 282, + 282, 282, 282, 282, 282, 282, 282, 282, + 282, 282, 282, 282, 282, 282, 282, 282, + 282, 282, 282, 282, 282, 282, 282, 282, + 282, 282, 282, 282, 282, 282, 282, 282, + 282, 282, 282, 282, 282, 282, 282, 282, + 282, 282, 282, 282, 282, 282, 282, 282, + 282, 282, 282, 282, 282, 282, 282, 282, + 282, 282, 282, 282, 282, 282, 282, 282, + 282, 282, 282, 282, 282, 282, 282, 282, + 282, 282, 282, 282, 287, 282, 288, 267, + 267, 267, 267, 267, 267, 267, 267, 267, + 267, 267, 267, 267, 267, 267, 267, 267, + 267, 267, 267, 267, 267, 267, 267, 267, + 267, 267, 267, 267, 267, 267, 289, 267, + 289, 267, 267, 290, 290, 290, 267, 290, + 290, 290, 290, 290, 290, 290, 290, 290, + 290, 290, 290, 290, 290, 290, 290, 290, + 290, 290, 290, 290, 267, 290, 290, 290, + 290, 290, 290, 290, 290, 290, 290, 290, + 290, 290, 290, 290, 290, 290, 290, 290, + 290, 290, 290, 290, 290, 290, 290, 290, + 290, 290, 290, 290, 290, 290, 290, 290, + 290, 291, 290, 290, 290, 290, 290, 290, + 290, 290, 290, 290, 290, 290, 290, 290, + 290, 290, 290, 290, 290, 290, 290, 290, + 290, 290, 290, 290, 290, 290, 292, 290, + 267, 270, 270, 270, 267, 270, 270, 270, + 270, 270, 271, 270, 270, 270, 270, 270, + 270, 270, 270, 270, 270, 270, 270, 270, + 270, 270, 267, 270, 270, 270, 270, 270, + 270, 270, 270, 270, 270, 270, 270, 270, + 270, 270, 270, 270, 270, 270, 270, 270, + 270, 270, 270, 270, 270, 270, 270, 270, + 270, 270, 270, 270, 270, 270, 270, 270, + 270, 270, 270, 270, 270, 270, 270, 270, + 270, 270, 270, 270, 270, 274, 270, 270, + 270, 270, 270, 270, 270, 270, 270, 270, + 270, 270, 270, 270, 270, 270, 270, 270, + 270, 270, 270, 270, 270, 270, 270, 270, + 270, 270, 270, 270, 270, 270, 270, 270, + 270, 270, 270, 270, 270, 270, 270, 270, + 273, 270, 267, 293, 293, 293, 267, 293, + 293, 293, 293, 293, 293, 293, 293, 293, + 293, 293, 293, 293, 293, 293, 293, 293, + 293, 293, 293, 293, 267, 293, 293, 293, + 293, 293, 293, 293, 293, 293, 293, 293, + 293, 293, 293, 293, 293, 293, 293, 293, + 293, 293, 294, 294, 294, 294, 294, 294, + 294, 294, 294, 294, 293, 293, 293, 293, + 293, 293, 293, 294, 294, 294, 294, 294, + 294, 293, 293, 293, 293, 293, 293, 293, + 293, 293, 293, 293, 293, 293, 293, 293, + 293, 293, 293, 293, 293, 293, 293, 293, + 293, 293, 293, 294, 294, 294, 294, 294, + 294, 293, 211, 211, 211, 211, 211, 211, + 211, 211, 211, 211, 211, 211, 211, 211, + 211, 211, 211, 211, 211, 211, 211, 211, + 211, 211, 211, 211, 211, 211, 211, 211, + 211, 211, 211, 296, 211, 211, 211, 211, + 211, 211, 211, 211, 211, 211, 211, 211, + 211, 211, 295, 295, 295, 295, 295, 295, + 295, 295, 295, 295, 297, 211, 211, 298, + 211, 296, 211, 295, 295, 295, 295, 295, + 295, 295, 295, 295, 295, 295, 295, 295, + 295, 295, 295, 295, 295, 295, 295, 295, + 295, 295, 295, 295, 295, 211, 211, 211, + 211, 295, 211, 295, 295, 295, 295, 295, + 295, 295, 295, 295, 295, 295, 295, 295, + 295, 295, 295, 295, 295, 295, 295, 295, + 295, 295, 295, 295, 295, 211, 211, 211, + 211, 211, 295, 245, 245, 245, 245, 245, + 245, 245, 245, 245, 245, 245, 245, 245, + 245, 245, 245, 245, 245, 245, 245, 245, + 245, 245, 245, 245, 245, 245, 245, 245, + 245, 245, 245, 245, 296, 245, 245, 245, + 245, 245, 245, 245, 245, 245, 245, 245, + 245, 245, 245, 295, 295, 295, 295, 295, + 295, 295, 295, 295, 295, 297, 245, 245, + 298, 245, 296, 245, 295, 295, 295, 295, + 295, 295, 299, 295, 295, 295, 295, 295, + 295, 295, 295, 295, 295, 295, 295, 295, + 295, 295, 295, 295, 295, 295, 245, 245, + 245, 245, 295, 245, 295, 295, 295, 295, + 295, 295, 295, 295, 295, 295, 295, 295, + 295, 295, 295, 295, 295, 295, 295, 295, + 295, 295, 295, 295, 295, 295, 245, 245, + 245, 245, 245, 295, 245, 245, 245, 245, + 245, 245, 245, 245, 245, 245, 245, 245, + 245, 245, 245, 245, 245, 245, 245, 245, + 245, 245, 245, 245, 245, 245, 245, 245, + 245, 245, 245, 245, 245, 296, 245, 245, + 245, 245, 245, 245, 245, 245, 245, 245, + 245, 245, 245, 245, 295, 295, 295, 295, + 295, 295, 295, 295, 295, 295, 297, 245, + 245, 298, 245, 296, 245, 295, 295, 295, + 295, 295, 295, 295, 295, 300, 295, 295, + 295, 295, 295, 295, 295, 295, 295, 295, + 295, 295, 295, 295, 295, 295, 295, 245, + 245, 245, 245, 295, 245, 295, 295, 295, + 295, 295, 295, 295, 295, 295, 295, 295, + 295, 295, 295, 295, 295, 295, 295, 295, + 295, 295, 295, 295, 295, 295, 295, 245, + 245, 245, 245, 245, 295, 245, 245, 245, + 245, 245, 245, 245, 245, 245, 245, 245, + 245, 245, 245, 245, 245, 245, 245, 245, + 245, 245, 245, 245, 245, 245, 245, 245, + 245, 245, 245, 245, 245, 245, 296, 245, + 245, 245, 245, 245, 245, 245, 245, 245, + 245, 245, 245, 245, 245, 295, 295, 295, + 295, 295, 295, 295, 295, 295, 295, 297, + 245, 245, 298, 245, 296, 245, 295, 295, + 295, 295, 295, 295, 295, 295, 295, 295, + 295, 295, 295, 301, 295, 295, 295, 295, + 295, 295, 295, 295, 295, 295, 295, 295, + 245, 245, 245, 245, 295, 245, 295, 295, + 295, 295, 295, 295, 295, 295, 295, 295, + 295, 295, 295, 295, 295, 295, 295, 295, + 295, 295, 295, 295, 295, 295, 295, 295, + 245, 245, 245, 245, 245, 295, 245, 245, + 245, 245, 245, 245, 245, 245, 245, 245, + 245, 245, 245, 245, 245, 245, 245, 245, + 245, 245, 245, 245, 245, 245, 245, 245, + 245, 245, 245, 245, 245, 245, 245, 296, + 245, 245, 245, 245, 245, 245, 245, 245, + 245, 245, 245, 245, 245, 245, 295, 295, + 295, 295, 295, 295, 295, 295, 295, 295, + 297, 245, 245, 298, 245, 296, 245, 295, + 295, 295, 301, 295, 295, 295, 295, 295, + 295, 295, 295, 295, 295, 295, 295, 295, + 295, 295, 295, 295, 295, 295, 295, 295, + 295, 245, 245, 245, 245, 295, 245, 295, + 295, 295, 295, 295, 295, 295, 295, 295, + 295, 295, 295, 295, 295, 295, 295, 295, + 295, 295, 295, 295, 295, 295, 295, 295, + 295, 245, 245, 245, 245, 245, 295, 302, + 302, 302, 302, 302, 302, 302, 302, 302, + 302, 302, 302, 302, 302, 302, 302, 302, + 302, 302, 302, 302, 302, 302, 302, 302, + 302, 302, 302, 302, 302, 302, 302, 302, + 304, 302, 302, 302, 302, 302, 302, 302, + 302, 302, 302, 302, 302, 302, 302, 303, + 303, 303, 303, 303, 303, 303, 303, 303, + 303, 305, 302, 302, 302, 302, 304, 302, + 303, 303, 303, 303, 303, 303, 303, 303, + 303, 303, 303, 303, 303, 303, 303, 303, + 303, 303, 303, 303, 303, 303, 303, 303, + 303, 303, 302, 302, 302, 302, 303, 302, + 303, 303, 303, 303, 303, 303, 303, 303, + 303, 303, 303, 303, 303, 303, 303, 303, + 303, 303, 303, 303, 303, 303, 303, 303, + 303, 303, 302, 302, 302, 302, 302, 303, + 305, 302, 302, 306, 307, 307, 307, 307, + 307, 307, 307, 307, 307, 307, 307, 307, + 307, 307, 307, 307, 307, 307, 307, 307, + 307, 307, 307, 307, 307, 307, 307, 307, + 307, 307, 307, 307, 307, 307, 307, 307, + 307, 307, 307, 307, 307, 307, 307, 307, + 307, 307, 307, 307, 308, 308, 308, 308, + 308, 308, 308, 308, 308, 308, 307, 307, + 307, 307, 307, 307, 307, 308, 308, 308, + 308, 308, 308, 308, 308, 308, 308, 308, + 308, 308, 308, 308, 308, 308, 308, 308, + 308, 308, 308, 308, 308, 308, 308, 307, + 307, 307, 307, 308, 307, 308, 308, 308, + 308, 308, 308, 308, 308, 308, 308, 308, + 308, 308, 308, 308, 308, 308, 308, 308, + 308, 308, 308, 308, 308, 308, 308, 307, + 307, 307, 307, 307, 308, 310, 309, 310, + 309, 309, 311, 311, 311, 311, 311, 311, + 311, 311, 311, 311, 309, 311, 311, 311, + 311, 311, 311, 311, 311, 311, 311, 309, + 312, 312, 312, 312, 312, 312, 312, 312, + 312, 312, 309, 314, 314, 314, 314, 314, + 314, 314, 314, 314, 314, 313, 315, 315, + 315, 315, 315, 315, 315, 315, 315, 315, + 313, 317, 316, 318, 316, 319, 316, 320, + 316, 322, 321, 323, 321, 324, 321, 307, + 307, 307, 307, 307, 307, 307, 307, 307, + 307, 307, 307, 307, 307, 307, 307, 307, + 307, 307, 307, 307, 307, 307, 307, 307, + 307, 307, 307, 307, 307, 307, 307, 307, + 307, 307, 307, 307, 307, 307, 307, 307, + 307, 307, 307, 307, 307, 307, 307, 325, + 325, 325, 325, 325, 325, 325, 325, 325, + 325, 307, 307, 307, 307, 307, 307, 307, + 325, 325, 325, 325, 325, 325, 325, 325, + 325, 325, 325, 325, 325, 325, 325, 325, + 325, 325, 325, 325, 325, 325, 325, 325, + 325, 325, 307, 307, 307, 307, 325, 307, + 325, 325, 325, 325, 325, 325, 325, 325, + 325, 325, 325, 325, 325, 325, 325, 325, + 325, 325, 325, 325, 325, 325, 325, 325, + 325, 325, 307, 307, 307, 307, 307, 325, + 326, 313, 327, 328, 327, 327, 327, 313, + 313, 313, 313, 313, 313, 313, 313, 313, + 313, 313, 313, 313, 313, 313, 313, 313, + 313, 327, 313, 313, 329, 313, 313, 313, + 313, 313, 313, 313, 313, 313, 313, 313, + 313, 313, 313, 313, 313, 313, 313, 313, + 313, 313, 313, 313, 313, 330, 313, 313, + 313, 313, 313, 313, 313, 313, 313, 313, + 313, 313, 313, 313, 313, 313, 313, 313, + 313, 313, 313, 313, 313, 313, 313, 313, + 313, 313, 313, 313, 313, 331, 313, 332, + 333, 332, 332, 332, 313, 313, 313, 313, + 313, 313, 313, 313, 313, 313, 313, 313, + 313, 313, 313, 313, 313, 313, 332, 313, + 313, 334, 313, 313, 313, 313, 313, 313, + 313, 313, 313, 313, 313, 313, 313, 313, + 313, 313, 313, 313, 313, 313, 313, 313, + 313, 313, 335, 313, 313, 313, 313, 313, + 313, 313, 313, 313, 313, 313, 313, 313, + 313, 313, 313, 313, 313, 313, 313, 313, + 313, 313, 313, 313, 313, 313, 313, 313, + 313, 313, 336, 313, 338, 339, 338, 338, + 338, 337, 337, 337, 337, 337, 337, 337, + 337, 337, 337, 337, 337, 337, 337, 337, + 337, 337, 337, 338, 337, 337, 340, 337, + 337, 337, 337, 337, 337, 337, 337, 337, + 337, 337, 337, 337, 337, 337, 337, 337, + 337, 337, 337, 337, 337, 337, 337, 341, + 337, 337, 337, 337, 337, 337, 337, 337, + 337, 337, 337, 337, 337, 337, 337, 337, + 337, 337, 337, 337, 337, 337, 337, 337, + 337, 337, 337, 337, 337, 337, 337, 342, + 337, 344, 345, 344, 344, 344, 343, 343, + 343, 343, 343, 343, 343, 343, 343, 343, + 343, 343, 343, 343, 343, 343, 343, 343, + 344, 343, 343, 346, 343, 343, 343, 343, + 343, 343, 343, 343, 343, 343, 343, 343, + 343, 343, 343, 343, 343, 343, 343, 343, + 343, 343, 343, 343, 347, 343, 343, 343, + 343, 343, 343, 343, 343, 343, 343, 343, + 343, 343, 343, 343, 343, 343, 343, 343, + 343, 343, 343, 343, 343, 343, 343, 343, + 343, 343, 343, 343, 348, 343, 344, 345, + 344, 344, 344, 343, 343, 343, 343, 343, + 343, 343, 343, 343, 343, 343, 343, 343, + 343, 343, 343, 343, 343, 344, 343, 343, + 346, 343, 343, 343, 343, 343, 343, 343, + 343, 343, 343, 343, 343, 343, 343, 343, + 343, 343, 343, 343, 343, 343, 343, 343, + 343, 349, 343, 343, 343, 343, 343, 343, + 343, 343, 343, 343, 343, 343, 343, 343, + 343, 343, 343, 343, 343, 343, 343, 343, + 343, 343, 343, 343, 343, 343, 343, 343, + 343, 348, 343, 344, 350, 344, 344, 344, + 343, 343, 343, 343, 343, 343, 343, 343, + 343, 343, 343, 343, 343, 343, 343, 343, + 343, 343, 344, 343, 343, 346, 343, 343, + 343, 343, 343, 343, 343, 343, 343, 343, + 343, 343, 343, 343, 343, 343, 343, 343, + 343, 343, 343, 343, 343, 343, 347, 343, + 343, 343, 343, 343, 343, 343, 343, 343, + 343, 343, 343, 343, 343, 343, 343, 343, + 343, 343, 343, 343, 343, 343, 343, 343, + 343, 343, 343, 343, 343, 343, 348, 343, + 351, 313, 328, 313, 353, 354, 353, 353, + 353, 352, 352, 352, 352, 352, 352, 352, + 352, 352, 352, 352, 352, 352, 352, 352, + 352, 352, 352, 353, 352, 352, 355, 352, + 352, 356, 352, 352, 352, 352, 352, 352, + 352, 357, 352, 352, 352, 352, 352, 352, + 352, 352, 352, 352, 352, 352, 352, 352, + 352, 352, 352, 352, 352, 352, 352, 352, + 352, 352, 352, 352, 352, 352, 352, 352, + 352, 352, 352, 352, 352, 352, 352, 352, + 352, 352, 352, 352, 352, 352, 352, 358, + 352, 360, 354, 360, 360, 360, 359, 359, + 359, 359, 359, 359, 359, 359, 359, 359, + 359, 359, 359, 359, 359, 359, 359, 359, + 360, 359, 359, 355, 359, 359, 359, 359, + 359, 359, 359, 359, 359, 359, 359, 359, + 359, 359, 359, 359, 359, 359, 359, 359, + 359, 359, 359, 359, 359, 359, 359, 359, + 359, 359, 359, 359, 359, 359, 359, 359, + 359, 359, 359, 359, 359, 359, 359, 359, + 359, 359, 359, 359, 359, 359, 359, 359, + 359, 359, 359, 359, 358, 359, 363, 362, + 365, 364, 366, 361, 367, 361, 368, 352, + 370, 369, 369, 369, 370, 369, 369, 369, + 369, 371, 372, 371, 371, 371, 369, 369, + 369, 369, 369, 369, 369, 369, 369, 369, + 369, 369, 370, 369, 369, 369, 369, 369, + 371, 369, 369, 373, 369, 369, 369, 369, + 369, 369, 369, 369, 369, 369, 369, 369, + 369, 369, 369, 369, 369, 369, 369, 369, + 369, 369, 369, 369, 369, 374, 369, 369, + 369, 369, 369, 369, 369, 369, 369, 369, + 369, 369, 369, 369, 369, 369, 369, 369, + 369, 369, 369, 369, 369, 369, 369, 369, + 369, 369, 369, 369, 375, 369, 369, 376, + 369, 371, 377, 371, 371, 371, 377, 377, + 377, 377, 377, 377, 377, 377, 377, 377, + 377, 377, 377, 377, 377, 377, 377, 377, + 371, 377, 378, 379, 380, 381, 382, 384, + 383, 386, 387, 386, 386, 386, 385, 385, + 385, 385, 385, 385, 385, 385, 385, 385, + 385, 385, 385, 385, 385, 385, 385, 385, + 386, 385, 372, 383, 388, 383, 390, 389, + 389, 389, 390, 389, 389, 389, 389, 391, + 392, 391, 391, 391, 389, 389, 389, 389, + 389, 389, 389, 389, 389, 389, 389, 389, + 390, 389, 389, 389, 389, 389, 391, 389, + 389, 393, 389, 389, 389, 389, 389, 389, + 389, 389, 389, 389, 389, 389, 389, 389, + 389, 389, 389, 389, 389, 389, 389, 389, + 389, 389, 389, 389, 389, 389, 389, 389, + 389, 389, 389, 389, 389, 389, 389, 389, + 389, 389, 389, 389, 389, 389, 389, 389, + 389, 389, 389, 389, 389, 389, 389, 389, + 389, 389, 394, 389, 391, 395, 391, 391, + 391, 395, 395, 395, 395, 395, 395, 395, + 395, 395, 395, 395, 395, 395, 395, 395, + 395, 395, 395, 391, 395, 397, 396, 396, + 396, 396, 396, 396, 396, 396, 396, 396, + 396, 396, 396, 396, 396, 396, 396, 396, + 396, 396, 396, 396, 396, 396, 396, 396, + 396, 398, 396, 396, 396, 396, 396, 396, + 396, 396, 396, 396, 396, 396, 396, 396, + 396, 396, 396, 396, 396, 396, 396, 396, + 396, 396, 396, 396, 396, 396, 396, 396, + 396, 396, 396, 396, 396, 396, 396, 396, + 396, 396, 396, 396, 396, 396, 396, 396, + 396, 396, 396, 396, 396, 396, 396, 396, + 396, 396, 396, 396, 399, 396, 400, 400, + 400, 400, 400, 400, 400, 400, 400, 400, + 400, 400, 400, 400, 400, 400, 400, 400, + 400, 400, 400, 400, 400, 400, 400, 400, + 400, 400, 400, 400, 400, 400, 400, 400, + 400, 400, 400, 400, 400, 400, 400, 400, + 400, 400, 400, 400, 400, 400, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, + 400, 400, 400, 400, 400, 400, 400, 13, + 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, + 13, 400, 400, 400, 400, 13, 400, 13, + 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, + 13, 400, 400, 400, 400, 400, 13, 16, + 16, 16, 16, 16, 16, 16, 16, 16, + 16, 400, 401, 401, 401, 401, 401, 401, + 401, 401, 401, 401, 401, 401, 401, 401, + 401, 401, 401, 401, 401, 401, 401, 401, + 401, 401, 401, 401, 401, 401, 401, 401, + 401, 401, 401, 401, 401, 401, 401, 401, + 401, 401, 401, 401, 401, 401, 401, 401, + 401, 401, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 401, 401, 401, 401, + 401, 401, 401, 17, 17, 17, 17, 17, + 17, 17, 17, 17, 17, 17, 17, 17, + 17, 17, 17, 17, 17, 17, 17, 17, + 17, 17, 17, 17, 17, 401, 401, 401, + 401, 17, 401, 17, 17, 17, 17, 17, + 17, 17, 17, 17, 17, 17, 17, 17, + 17, 17, 17, 17, 17, 17, 17, 17, + 17, 17, 17, 17, 17, 401, 401, 401, + 401, 401, 17, 404, 403, 403, 403, 404, + 403, 403, 403, 403, 403, 403, 403, 403, + 403, 403, 403, 403, 403, 403, 403, 403, + 403, 403, 403, 403, 403, 404, 403, 403, + 403, 403, 403, 403, 403, 403, 403, 403, + 403, 403, 403, 403, 403, 403, 403, 403, + 403, 403, 403, 405, 405, 405, 405, 405, + 405, 405, 405, 403, 403, 403, 403, 403, + 403, 403, 403, 403, 403, 403, 406, 403, + 403, 403, 403, 403, 403, 403, 403, 403, + 407, 403, 403, 403, 403, 403, 403, 403, + 403, 403, 403, 403, 403, 403, 403, 403, + 403, 403, 403, 403, 403, 403, 408, 403, + 403, 403, 403, 403, 403, 403, 403, 403, + 403, 403, 403, 403, 403, 403, 403, 403, + 409, 403, 403, 410, 403, 411, 412, 414, + 414, 414, 414, 414, 414, 414, 414, 413, + 415, 415, 415, 415, 415, 415, 415, 415, + 413, 413, 416, 416, 42, 42, 42, 416, + 42, 42, 42, 42, 42, 42, 42, 42, + 42, 42, 42, 42, 42, 42, 42, 42, + 42, 42, 42, 42, 42, 416, 42, 42, + 42, 42, 42, 42, 42, 42, 42, 42, + 42, 42, 42, 42, 42, 42, 42, 42, + 42, 42, 42, 42, 42, 42, 42, 42, + 42, 42, 42, 42, 42, 42, 42, 42, + 42, 42, 43, 42, 42, 42, 42, 42, + 42, 42, 42, 42, 42, 42, 42, 42, + 42, 42, 42, 42, 42, 42, 42, 42, + 42, 42, 42, 42, 42, 42, 42, 417, + 42, 418, 419, 420, 420, 42, 42, 42, + 420, 42, 42, 42, 42, 42, 42, 42, + 42, 42, 42, 42, 42, 42, 42, 42, + 42, 42, 42, 42, 42, 42, 420, 42, + 42, 42, 42, 42, 42, 42, 42, 42, + 42, 42, 42, 42, 42, 42, 42, 42, + 42, 42, 42, 42, 42, 42, 42, 42, + 42, 42, 42, 42, 42, 42, 42, 42, + 42, 42, 42, 43, 42, 42, 42, 42, + 42, 42, 42, 42, 42, 42, 42, 42, + 42, 42, 42, 42, 42, 42, 42, 42, + 42, 42, 42, 42, 42, 42, 42, 42, + 421, 42, 41, 420, 422, 423, 424, 424, + 27, 27, 27, 424, 27, 27, 27, 27, + 27, 27, 27, 27, 27, 27, 27, 27, + 27, 27, 27, 27, 27, 27, 27, 27, + 27, 424, 27, 27, 27, 27, 27, 27, + 27, 27, 27, 27, 27, 27, 27, 27, + 27, 27, 27, 27, 27, 27, 27, 27, + 27, 27, 27, 27, 27, 27, 27, 27, + 27, 27, 27, 27, 27, 27, 28, 27, + 27, 27, 27, 27, 27, 27, 27, 27, + 27, 27, 27, 27, 27, 27, 27, 27, + 27, 27, 27, 27, 27, 27, 27, 27, + 27, 27, 27, 425, 27, 426, 426, 426, + 426, 426, 426, 426, 426, 426, 426, 424, + 424, 424, 424, 424, 424, 424, 426, 426, + 426, 426, 426, 426, 424, 424, 424, 424, + 424, 424, 424, 424, 424, 424, 424, 424, + 424, 424, 424, 424, 424, 424, 424, 424, + 424, 424, 424, 424, 424, 424, 426, 426, + 426, 426, 426, 426, 424, 428, 428, 428, + 428, 428, 428, 428, 428, 428, 428, 427, + 427, 427, 427, 427, 427, 427, 428, 428, + 428, 428, 428, 428, 427, 427, 427, 427, + 427, 427, 427, 427, 427, 427, 427, 427, + 427, 427, 427, 427, 427, 427, 427, 427, + 427, 427, 427, 427, 427, 427, 428, 428, + 428, 428, 428, 428, 427, 427, 429, 429, + 429, 429, 429, 429, 429, 429, 429, 429, + 420, 420, 420, 420, 420, 420, 420, 429, + 429, 429, 429, 429, 429, 420, 420, 420, + 420, 420, 420, 420, 420, 420, 420, 420, + 420, 420, 420, 420, 420, 420, 420, 420, + 420, 420, 420, 420, 420, 420, 420, 429, + 429, 429, 429, 429, 429, 420, 431, 431, + 431, 431, 431, 431, 431, 431, 431, 431, + 430, 430, 430, 430, 430, 430, 430, 431, + 431, 431, 431, 431, 431, 430, 430, 430, + 430, 430, 430, 430, 430, 430, 430, 430, + 430, 430, 430, 430, 430, 430, 430, 430, + 430, 430, 430, 430, 430, 430, 430, 431, + 431, 431, 431, 431, 431, 430, 430, 420, + 20, 20, 20, 420, 20, 20, 20, 20, + 20, 20, 20, 20, 20, 20, 20, 20, + 20, 20, 20, 20, 20, 20, 20, 20, + 20, 420, 20, 20, 20, 20, 20, 20, + 20, 20, 20, 20, 20, 20, 20, 20, + 20, 20, 20, 20, 432, 20, 416, 27, + 27, 27, 416, 27, 27, 27, 27, 27, + 27, 27, 27, 27, 27, 27, 27, 27, + 27, 27, 27, 27, 27, 27, 27, 27, + 416, 27, 27, 27, 27, 27, 27, 27, + 27, 27, 27, 27, 27, 27, 27, 27, + 27, 27, 27, 27, 27, 27, 27, 27, + 27, 27, 27, 27, 27, 27, 27, 27, + 27, 27, 27, 27, 27, 28, 27, 27, + 27, 27, 27, 27, 27, 27, 27, 27, + 27, 27, 27, 27, 27, 27, 27, 27, + 27, 27, 27, 27, 27, 27, 27, 27, + 27, 27, 29, 27, 416, 433, 433, 433, + 416, 433, 433, 433, 433, 433, 433, 433, + 433, 433, 433, 433, 433, 433, 433, 433, + 433, 433, 433, 433, 433, 433, 416, 433, + 433, 433, 433, 433, 433, 433, 433, 433, + 433, 433, 433, 433, 433, 433, 433, 433, + 433, 433, 433, 433, 433, 433, 433, 433, + 433, 433, 433, 433, 433, 433, 433, 433, + 433, 433, 433, 433, 433, 433, 433, 433, + 433, 433, 433, 433, 433, 433, 433, 433, + 433, 433, 433, 433, 433, 433, 433, 433, + 433, 433, 433, 433, 433, 433, 433, 433, + 434, 433, 435, 436, 436, 433, 433, 433, + 436, 433, 433, 433, 433, 433, 433, 433, + 433, 433, 433, 433, 433, 433, 433, 433, + 433, 433, 433, 433, 433, 433, 436, 433, + 433, 433, 433, 433, 433, 433, 433, 433, + 433, 433, 433, 433, 433, 433, 433, 433, + 433, 433, 433, 433, 433, 433, 433, 433, + 433, 433, 433, 433, 433, 433, 433, 433, + 433, 433, 433, 433, 433, 433, 433, 433, + 433, 433, 433, 433, 433, 433, 433, 433, + 433, 433, 433, 433, 433, 433, 433, 433, + 433, 433, 433, 433, 433, 433, 433, 433, + 437, 433, 438, 438, 438, 438, 438, 438, + 438, 438, 438, 438, 436, 436, 436, 436, + 436, 436, 436, 438, 438, 438, 438, 438, + 438, 436, 436, 436, 436, 436, 436, 436, + 436, 436, 436, 436, 436, 436, 436, 436, + 436, 436, 436, 436, 436, 436, 436, 436, + 436, 436, 436, 438, 438, 438, 438, 438, + 438, 436, 440, 440, 440, 440, 440, 440, + 440, 440, 440, 440, 439, 439, 439, 439, + 439, 439, 439, 440, 440, 440, 440, 440, + 440, 439, 439, 439, 439, 439, 439, 439, + 439, 439, 439, 439, 439, 439, 439, 439, + 439, 439, 439, 439, 439, 439, 439, 439, + 439, 439, 439, 440, 440, 440, 440, 440, + 440, 439, 439, 436, 20, 20, 20, 436, + 20, 20, 20, 20, 20, 20, 20, 20, + 20, 20, 20, 20, 20, 20, 20, 20, + 20, 20, 20, 20, 20, 436, 20, 20, + 20, 20, 20, 20, 20, 20, 20, 20, + 20, 20, 20, 20, 20, 20, 20, 20, + 432, 20, 441, 436, 436, 27, 27, 27, + 436, 27, 27, 27, 27, 27, 27, 27, + 27, 27, 27, 27, 27, 27, 27, 27, + 27, 27, 27, 27, 27, 27, 436, 27, + 27, 27, 27, 27, 27, 27, 27, 27, + 27, 27, 27, 27, 27, 27, 27, 27, + 27, 27, 27, 27, 27, 27, 27, 27, + 27, 27, 27, 27, 27, 27, 27, 27, + 27, 27, 27, 28, 27, 27, 27, 27, + 27, 27, 27, 27, 27, 27, 27, 27, + 27, 27, 27, 27, 27, 27, 27, 27, + 27, 27, 27, 27, 27, 27, 27, 27, + 29, 27, 443, 443, 443, 443, 443, 443, + 443, 443, 443, 443, 442, 442, 442, 442, + 442, 442, 442, 443, 443, 443, 443, 443, + 443, 442, 442, 442, 442, 442, 442, 442, + 442, 442, 442, 442, 442, 442, 442, 442, + 442, 442, 442, 442, 442, 442, 442, 442, + 442, 442, 442, 443, 443, 443, 443, 443, + 443, 442, 442, 442, 442, 442, 442, 442, + 442, 442, 442, 442, 442, 442, 442, 442, + 442, 442, 442, 442, 442, 444, 442, 445, + 445, 445, 445, 445, 445, 445, 445, 445, + 445, 442, 442, 442, 442, 442, 442, 442, + 445, 445, 445, 445, 445, 445, 442, 442, + 442, 442, 442, 442, 442, 442, 442, 442, + 442, 442, 442, 442, 442, 442, 442, 442, + 442, 442, 442, 442, 442, 442, 442, 442, + 445, 445, 445, 445, 445, 445, 442, 446, + 446, 446, 446, 446, 446, 446, 446, 446, + 446, 442, 442, 442, 442, 442, 442, 442, + 446, 446, 446, 446, 446, 446, 442, 442, + 442, 442, 442, 442, 442, 442, 442, 442, + 442, 442, 442, 442, 442, 442, 442, 442, + 442, 442, 442, 442, 442, 442, 442, 442, + 446, 446, 446, 446, 446, 446, 442, 447, + 447, 447, 447, 447, 447, 447, 447, 447, + 447, 442, 442, 442, 442, 442, 442, 442, + 447, 447, 447, 447, 447, 447, 442, 442, + 442, 442, 442, 442, 442, 442, 442, 442, + 442, 442, 442, 442, 442, 442, 442, 442, + 442, 442, 442, 442, 442, 442, 442, 442, + 447, 447, 447, 447, 447, 447, 442, 448, + 451, 450, 450, 450, 451, 450, 450, 450, + 450, 452, 450, 450, 450, 450, 450, 450, + 450, 450, 450, 450, 450, 450, 450, 450, + 450, 450, 451, 450, 450, 450, 450, 450, + 452, 450, 450, 450, 450, 450, 450, 450, + 450, 450, 450, 450, 450, 450, 450, 450, + 453, 453, 453, 453, 453, 453, 453, 453, + 453, 453, 450, 450, 450, 450, 450, 450, + 450, 453, 453, 453, 453, 453, 453, 450, + 450, 450, 450, 450, 450, 450, 450, 450, + 450, 450, 450, 450, 450, 450, 450, 450, + 450, 450, 450, 450, 450, 450, 450, 450, + 450, 453, 453, 453, 453, 453, 453, 450, + 450, 450, 450, 450, 450, 450, 450, 450, + 450, 450, 450, 450, 450, 450, 450, 450, + 450, 450, 450, 450, 450, 454, 450, 451, + 450, 450, 450, 451, 450, 450, 450, 450, + 449, 450, 450, 450, 450, 450, 450, 450, + 450, 450, 450, 450, 450, 450, 450, 450, + 450, 451, 450, 450, 450, 450, 450, 449, + 450, 450, 450, 450, 450, 450, 450, 450, + 450, 450, 450, 450, 450, 450, 450, 455, + 455, 455, 455, 455, 455, 455, 455, 455, + 455, 450, 450, 450, 450, 450, 450, 450, + 455, 455, 455, 455, 455, 455, 450, 450, + 450, 450, 450, 450, 450, 450, 450, 450, + 450, 450, 450, 450, 450, 450, 450, 450, + 450, 450, 450, 450, 450, 450, 450, 450, + 455, 455, 455, 455, 455, 455, 450, 450, + 450, 450, 450, 450, 450, 450, 450, 450, + 450, 450, 450, 450, 450, 450, 450, 450, + 450, 450, 450, 450, 456, 450, 449, 451, + 455, 455, 455, 451, 455, 455, 455, 455, + 449, 455, 455, 455, 455, 455, 455, 455, + 455, 455, 455, 455, 455, 455, 455, 455, + 455, 451, 455, 455, 455, 455, 455, 449, + 455, 455, 455, 455, 455, 455, 455, 455, + 455, 455, 455, 455, 455, 455, 455, 455, + 455, 455, 455, 455, 455, 455, 455, 455, + 455, 455, 455, 455, 455, 455, 455, 455, + 455, 455, 455, 455, 455, 455, 455, 455, + 455, 455, 455, 455, 455, 455, 455, 455, + 455, 455, 455, 455, 455, 455, 455, 455, + 455, 455, 455, 455, 455, 455, 455, 455, + 455, 455, 455, 455, 455, 455, 455, 455, + 455, 455, 455, 455, 455, 455, 455, 455, + 455, 455, 455, 455, 455, 455, 455, 455, + 455, 455, 455, 455, 449, 455, 457, 451, + 458, 458, 458, 451, 458, 458, 458, 458, + 452, 458, 458, 458, 458, 458, 458, 458, + 458, 458, 458, 458, 458, 458, 458, 458, + 458, 451, 458, 458, 458, 458, 458, 452, + 458, 458, 458, 458, 458, 458, 458, 458, + 458, 458, 458, 458, 458, 458, 458, 453, + 453, 453, 453, 453, 453, 453, 453, 453, + 453, 458, 458, 458, 458, 458, 458, 458, + 453, 453, 453, 453, 453, 453, 458, 458, + 458, 458, 458, 458, 458, 458, 458, 458, + 458, 458, 458, 458, 458, 458, 458, 458, + 458, 458, 458, 458, 458, 458, 458, 458, + 453, 453, 453, 453, 453, 453, 458, 458, + 458, 458, 458, 458, 458, 458, 458, 458, + 458, 458, 458, 458, 458, 458, 458, 458, + 458, 458, 458, 458, 449, 458, 451, 458, + 458, 458, 451, 458, 458, 458, 458, 449, + 458, 458, 458, 458, 458, 458, 458, 458, + 458, 458, 458, 458, 458, 458, 458, 458, + 451, 458, 458, 458, 458, 458, 449, 458, + 458, 458, 458, 458, 458, 458, 458, 458, + 458, 458, 458, 458, 458, 458, 455, 455, + 455, 455, 455, 455, 455, 455, 455, 455, + 458, 458, 458, 458, 458, 458, 458, 455, + 455, 455, 455, 455, 455, 458, 458, 458, + 458, 458, 458, 458, 458, 458, 458, 458, + 458, 458, 458, 458, 458, 458, 458, 458, + 458, 458, 458, 458, 458, 458, 458, 455, + 455, 455, 455, 455, 455, 458, 458, 458, + 458, 458, 458, 458, 458, 458, 458, 458, + 458, 458, 458, 458, 458, 458, 458, 458, + 458, 458, 458, 451, 458, 451, 458, 458, + 458, 451, 458, 458, 458, 458, 459, 458, + 458, 458, 458, 458, 458, 458, 458, 458, + 458, 458, 458, 458, 458, 458, 458, 451, + 458, 458, 458, 458, 458, 459, 458, 458, + 458, 458, 458, 458, 458, 458, 458, 458, + 458, 458, 458, 458, 458, 460, 460, 460, + 460, 460, 460, 460, 460, 460, 460, 458, + 458, 458, 458, 458, 458, 458, 460, 460, + 460, 460, 460, 460, 458, 458, 458, 458, + 458, 458, 458, 458, 458, 458, 458, 458, + 458, 458, 458, 458, 458, 458, 458, 458, + 458, 458, 458, 458, 458, 458, 460, 460, + 460, 460, 460, 460, 458, 458, 458, 458, + 458, 458, 458, 458, 458, 458, 458, 458, + 458, 458, 458, 458, 458, 458, 458, 458, + 458, 458, 461, 458, 451, 458, 458, 458, + 451, 458, 458, 458, 458, 459, 458, 458, + 458, 458, 458, 458, 458, 458, 458, 458, + 458, 458, 458, 458, 458, 458, 451, 458, + 458, 458, 458, 458, 459, 458, 458, 458, + 458, 458, 458, 458, 458, 458, 458, 458, + 458, 458, 458, 458, 453, 453, 453, 453, + 453, 453, 453, 453, 453, 453, 458, 458, + 458, 458, 458, 458, 458, 453, 453, 453, + 453, 453, 453, 458, 458, 458, 458, 458, + 458, 458, 458, 458, 458, 458, 458, 458, + 458, 458, 458, 458, 458, 458, 458, 458, + 458, 458, 458, 458, 458, 453, 453, 453, + 453, 453, 453, 458, 458, 458, 458, 458, + 458, 458, 458, 458, 458, 458, 458, 458, + 458, 458, 458, 458, 458, 458, 458, 458, + 458, 461, 458, 462, 451, 458, 458, 458, + 451, 458, 458, 458, 458, 459, 458, 458, + 458, 458, 458, 458, 458, 458, 458, 458, + 458, 458, 458, 458, 458, 458, 451, 458, + 458, 458, 458, 458, 459, 458, 458, 458, + 458, 458, 458, 458, 458, 458, 458, 458, + 458, 458, 458, 458, 463, 463, 463, 463, + 463, 463, 463, 463, 463, 463, 458, 458, + 458, 458, 458, 458, 458, 463, 463, 463, + 463, 463, 463, 458, 458, 458, 458, 458, + 458, 458, 458, 458, 458, 458, 458, 458, + 458, 458, 458, 458, 458, 458, 458, 458, + 458, 458, 458, 458, 458, 463, 463, 463, + 463, 463, 463, 458, 458, 458, 458, 458, + 458, 458, 458, 458, 458, 458, 458, 458, + 458, 458, 458, 458, 458, 458, 458, 458, + 458, 461, 458, 451, 458, 458, 458, 451, + 458, 458, 458, 458, 459, 458, 458, 458, + 458, 458, 458, 458, 458, 458, 458, 458, + 458, 458, 458, 458, 458, 451, 458, 458, + 458, 458, 458, 459, 458, 458, 458, 458, + 458, 458, 458, 458, 458, 458, 458, 458, + 458, 458, 458, 464, 464, 464, 464, 464, + 464, 464, 464, 464, 464, 458, 458, 458, + 458, 458, 458, 458, 464, 464, 464, 464, + 464, 464, 458, 458, 458, 458, 458, 458, + 458, 458, 458, 458, 458, 458, 458, 458, + 458, 458, 458, 458, 458, 458, 458, 458, + 458, 458, 458, 458, 464, 464, 464, 464, + 464, 464, 458, 458, 458, 458, 458, 458, + 458, 458, 458, 458, 458, 458, 458, 458, + 458, 458, 458, 458, 458, 458, 458, 458, + 461, 458, 451, 458, 458, 458, 451, 458, + 458, 458, 458, 459, 458, 458, 458, 458, + 458, 458, 458, 458, 458, 458, 458, 458, + 458, 458, 458, 458, 451, 458, 458, 458, + 458, 458, 459, 458, 458, 458, 458, 458, + 458, 458, 458, 458, 458, 458, 458, 458, + 458, 458, 465, 465, 465, 465, 465, 465, + 465, 465, 465, 465, 458, 458, 458, 458, + 458, 458, 458, 465, 465, 465, 465, 465, + 465, 458, 458, 458, 458, 458, 458, 458, + 458, 458, 458, 458, 458, 458, 458, 458, + 458, 458, 458, 458, 458, 458, 458, 458, + 458, 458, 458, 465, 465, 465, 465, 465, + 465, 458, 458, 458, 458, 458, 458, 458, + 458, 458, 458, 458, 458, 458, 458, 458, + 458, 458, 458, 458, 458, 458, 458, 461, + 458, 451, 458, 458, 458, 451, 458, 458, + 458, 458, 459, 458, 458, 458, 458, 458, + 458, 458, 458, 458, 458, 458, 458, 458, + 458, 458, 458, 451, 458, 458, 458, 458, + 458, 459, 458, 458, 458, 458, 458, 458, + 458, 458, 458, 458, 458, 458, 458, 458, + 458, 466, 466, 466, 466, 466, 466, 466, + 466, 466, 466, 458, 458, 458, 458, 458, + 458, 458, 466, 466, 466, 466, 466, 466, + 458, 458, 458, 458, 458, 458, 458, 458, + 458, 458, 458, 458, 458, 458, 458, 458, + 458, 458, 458, 458, 458, 458, 458, 458, + 458, 458, 466, 466, 466, 466, 466, 466, + 458, 458, 458, 458, 458, 458, 458, 458, + 458, 458, 458, 458, 458, 458, 458, 458, + 458, 458, 458, 458, 458, 458, 461, 458, + 451, 458, 458, 458, 451, 458, 458, 458, + 458, 459, 458, 458, 458, 458, 458, 458, + 458, 458, 458, 458, 458, 458, 458, 458, + 458, 458, 451, 458, 458, 458, 458, 458, + 459, 458, 458, 458, 458, 458, 458, 458, + 458, 458, 458, 458, 458, 458, 458, 458, + 467, 467, 467, 467, 467, 467, 467, 467, + 467, 467, 458, 458, 458, 458, 458, 458, + 458, 467, 467, 467, 467, 467, 467, 458, + 458, 458, 458, 458, 458, 458, 458, 458, + 458, 458, 458, 458, 458, 458, 458, 458, + 458, 458, 458, 458, 458, 458, 458, 458, + 458, 467, 467, 467, 467, 467, 467, 458, + 458, 458, 458, 458, 458, 458, 458, 458, + 458, 458, 458, 458, 458, 458, 458, 458, + 458, 458, 458, 458, 458, 461, 458, 451, + 458, 458, 458, 451, 458, 458, 458, 458, + 449, 458, 458, 458, 458, 458, 458, 458, + 458, 458, 458, 458, 458, 458, 458, 458, + 458, 451, 458, 458, 458, 458, 458, 449, + 458, 458, 458, 458, 458, 458, 458, 458, + 458, 458, 458, 458, 458, 458, 458, 467, + 467, 467, 467, 467, 467, 467, 467, 467, + 467, 458, 458, 458, 458, 458, 458, 458, + 467, 467, 467, 467, 467, 467, 458, 458, + 458, 458, 458, 458, 458, 458, 458, 458, + 458, 458, 458, 458, 458, 458, 458, 458, + 458, 458, 458, 458, 458, 458, 458, 458, + 467, 467, 467, 467, 467, 467, 458, 458, + 458, 458, 458, 458, 458, 458, 458, 458, + 458, 458, 458, 458, 458, 458, 458, 458, + 458, 458, 458, 458, 449, 458, 468, 469, + 471, 471, 471, 471, 471, 471, 471, 471, + 471, 471, 470, 470, 470, 470, 470, 470, + 470, 471, 471, 471, 471, 471, 471, 470, + 470, 470, 470, 470, 470, 470, 470, 470, + 470, 470, 470, 470, 470, 470, 470, 470, + 470, 470, 470, 470, 470, 470, 470, 470, + 470, 471, 471, 471, 471, 471, 471, 470, + 470, 473, 472, 472, 472, 473, 472, 472, + 472, 472, 472, 474, 472, 472, 472, 472, + 472, 472, 472, 472, 472, 472, 472, 472, + 472, 472, 472, 473, 472, 472, 472, 472, + 472, 472, 472, 472, 475, 472, 472, 472, + 472, 472, 472, 472, 472, 472, 472, 472, + 472, 472, 472, 472, 472, 472, 472, 472, + 472, 472, 472, 472, 472, 472, 472, 472, + 472, 472, 472, 472, 472, 472, 472, 472, + 472, 472, 472, 472, 472, 472, 472, 472, + 472, 472, 472, 472, 472, 472, 472, 472, + 472, 472, 472, 472, 472, 476, 472, 478, + 477, 477, 477, 477, 477, 477, 477, 477, + 477, 477, 477, 477, 477, 477, 477, 477, + 477, 477, 477, 477, 477, 477, 477, 477, + 477, 477, 477, 479, 477, 477, 477, 477, + 477, 477, 477, 477, 477, 477, 477, 477, + 477, 477, 477, 477, 477, 477, 477, 477, + 477, 477, 477, 477, 477, 477, 477, 477, + 477, 477, 477, 477, 477, 477, 477, 477, + 477, 477, 477, 477, 477, 477, 477, 477, + 477, 477, 477, 477, 477, 477, 477, 477, + 477, 477, 477, 477, 477, 477, 480, 477, + 481, 481, 481, 481, 481, 481, 481, 481, + 481, 481, 481, 481, 481, 481, 481, 481, + 481, 481, 481, 481, 481, 481, 481, 481, + 481, 481, 481, 481, 481, 481, 481, 481, + 481, 481, 481, 481, 481, 481, 481, 481, + 481, 481, 481, 481, 481, 481, 481, 481, + 48, 48, 48, 48, 48, 48, 48, 48, + 48, 48, 481, 481, 481, 481, 481, 481, + 481, 48, 48, 48, 48, 48, 48, 48, + 48, 48, 48, 48, 48, 48, 48, 48, + 48, 48, 48, 48, 48, 48, 48, 48, + 48, 48, 48, 481, 481, 481, 481, 48, + 481, 48, 48, 48, 48, 48, 48, 48, + 48, 48, 48, 48, 48, 48, 48, 48, + 48, 48, 48, 48, 48, 48, 48, 48, + 48, 48, 48, 481, 481, 481, 481, 481, + 48, 51, 51, 51, 51, 51, 51, 51, + 51, 51, 51, 481, 482, 482, 482, 482, + 482, 482, 482, 482, 482, 482, 482, 482, + 482, 482, 482, 482, 482, 482, 482, 482, + 482, 482, 482, 482, 482, 482, 482, 482, + 482, 482, 482, 482, 482, 482, 482, 482, + 482, 482, 482, 482, 482, 482, 482, 482, + 482, 482, 482, 482, 48, 48, 48, 48, + 48, 48, 48, 48, 48, 48, 482, 482, + 482, 482, 482, 482, 482, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 482, + 482, 482, 482, 52, 482, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 482, + 482, 482, 482, 482, 52, 485, 484, 484, + 484, 485, 484, 484, 484, 484, 484, 484, + 484, 484, 484, 484, 484, 484, 484, 484, + 484, 484, 484, 484, 484, 484, 484, 485, + 484, 484, 484, 484, 484, 484, 484, 484, + 484, 484, 484, 484, 484, 484, 484, 484, + 484, 484, 484, 484, 484, 486, 486, 486, + 486, 486, 486, 486, 486, 484, 484, 484, + 484, 484, 484, 484, 484, 484, 484, 484, + 487, 484, 484, 484, 484, 484, 484, 484, + 484, 484, 488, 484, 484, 484, 484, 484, + 484, 484, 484, 484, 484, 484, 484, 484, + 484, 484, 484, 484, 484, 484, 484, 484, + 489, 484, 484, 484, 484, 484, 484, 484, + 484, 484, 484, 484, 484, 484, 484, 484, + 484, 484, 490, 484, 484, 491, 484, 492, + 493, 495, 495, 495, 495, 495, 495, 495, + 495, 494, 496, 496, 496, 496, 496, 496, + 496, 496, 494, 494, 497, 497, 77, 77, + 77, 497, 77, 77, 77, 77, 77, 77, + 77, 77, 77, 77, 77, 77, 77, 77, + 77, 77, 77, 77, 77, 77, 77, 497, + 77, 77, 77, 77, 77, 77, 77, 77, + 77, 77, 77, 77, 77, 77, 77, 77, + 77, 77, 77, 77, 77, 77, 77, 77, + 77, 77, 77, 77, 77, 77, 77, 77, + 77, 77, 77, 77, 78, 77, 77, 77, + 77, 77, 77, 77, 77, 77, 77, 77, + 77, 77, 77, 77, 77, 77, 77, 77, + 77, 77, 77, 77, 77, 77, 77, 77, + 77, 498, 77, 499, 500, 501, 501, 77, + 77, 77, 501, 77, 77, 77, 77, 77, + 77, 77, 77, 77, 77, 77, 77, 77, + 77, 77, 77, 77, 77, 77, 77, 77, + 501, 77, 77, 77, 77, 77, 77, 77, + 77, 77, 77, 77, 77, 77, 77, 77, + 77, 77, 77, 77, 77, 77, 77, 77, + 77, 77, 77, 77, 77, 77, 77, 77, + 77, 77, 77, 77, 77, 78, 77, 77, + 77, 77, 77, 77, 77, 77, 77, 77, + 77, 77, 77, 77, 77, 77, 77, 77, + 77, 77, 77, 77, 77, 77, 77, 77, + 77, 77, 502, 77, 76, 501, 503, 504, + 505, 505, 62, 62, 62, 505, 62, 62, + 62, 62, 62, 62, 62, 62, 62, 62, + 62, 62, 62, 62, 62, 62, 62, 62, + 62, 62, 62, 505, 62, 62, 62, 62, + 62, 62, 62, 62, 62, 62, 62, 62, + 62, 62, 62, 62, 62, 62, 62, 62, + 62, 62, 62, 62, 62, 62, 62, 62, + 62, 62, 62, 62, 62, 62, 62, 62, + 63, 62, 62, 62, 62, 62, 62, 62, + 62, 62, 62, 62, 62, 62, 62, 62, + 62, 62, 62, 62, 62, 62, 62, 62, + 62, 62, 62, 62, 62, 506, 62, 507, + 507, 507, 507, 507, 507, 507, 507, 507, + 507, 505, 505, 505, 505, 505, 505, 505, + 507, 507, 507, 507, 507, 507, 505, 505, + 505, 505, 505, 505, 505, 505, 505, 505, + 505, 505, 505, 505, 505, 505, 505, 505, + 505, 505, 505, 505, 505, 505, 505, 505, + 507, 507, 507, 507, 507, 507, 505, 509, + 509, 509, 509, 509, 509, 509, 509, 509, + 509, 508, 508, 508, 508, 508, 508, 508, + 509, 509, 509, 509, 509, 509, 508, 508, + 508, 508, 508, 508, 508, 508, 508, 508, + 508, 508, 508, 508, 508, 508, 508, 508, + 508, 508, 508, 508, 508, 508, 508, 508, + 509, 509, 509, 509, 509, 509, 508, 508, + 510, 510, 510, 510, 510, 510, 510, 510, + 510, 510, 501, 501, 501, 501, 501, 501, + 501, 510, 510, 510, 510, 510, 510, 501, + 501, 501, 501, 501, 501, 501, 501, 501, + 501, 501, 501, 501, 501, 501, 501, 501, + 501, 501, 501, 501, 501, 501, 501, 501, + 501, 510, 510, 510, 510, 510, 510, 501, + 512, 512, 512, 512, 512, 512, 512, 512, + 512, 512, 511, 511, 511, 511, 511, 511, + 511, 512, 512, 512, 512, 512, 512, 511, + 511, 511, 511, 511, 511, 511, 511, 511, + 511, 511, 511, 511, 511, 511, 511, 511, + 511, 511, 511, 511, 511, 511, 511, 511, + 511, 512, 512, 512, 512, 512, 512, 511, + 511, 501, 55, 55, 55, 501, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 501, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 513, 55, + 497, 62, 62, 62, 497, 62, 62, 62, + 62, 62, 62, 62, 62, 62, 62, 62, + 62, 62, 62, 62, 62, 62, 62, 62, + 62, 62, 497, 62, 62, 62, 62, 62, + 62, 62, 62, 62, 62, 62, 62, 62, + 62, 62, 62, 62, 62, 62, 62, 62, + 62, 62, 62, 62, 62, 62, 62, 62, + 62, 62, 62, 62, 62, 62, 62, 63, + 62, 62, 62, 62, 62, 62, 62, 62, + 62, 62, 62, 62, 62, 62, 62, 62, + 62, 62, 62, 62, 62, 62, 62, 62, + 62, 62, 62, 62, 64, 62, 497, 514, + 514, 514, 497, 514, 514, 514, 514, 514, + 514, 514, 514, 514, 514, 514, 514, 514, + 514, 514, 514, 514, 514, 514, 514, 514, + 497, 514, 514, 514, 514, 514, 514, 514, + 514, 514, 514, 514, 514, 514, 514, 514, + 514, 514, 514, 514, 514, 514, 514, 514, + 514, 514, 514, 514, 514, 514, 514, 514, + 514, 514, 514, 514, 514, 514, 514, 514, + 514, 514, 514, 514, 514, 514, 514, 514, + 514, 514, 514, 514, 514, 514, 514, 514, + 514, 514, 514, 514, 514, 514, 514, 514, + 514, 514, 515, 514, 516, 517, 517, 514, + 514, 514, 517, 514, 514, 514, 514, 514, + 514, 514, 514, 514, 514, 514, 514, 514, + 514, 514, 514, 514, 514, 514, 514, 514, + 517, 514, 514, 514, 514, 514, 514, 514, + 514, 514, 514, 514, 514, 514, 514, 514, + 514, 514, 514, 514, 514, 514, 514, 514, + 514, 514, 514, 514, 514, 514, 514, 514, + 514, 514, 514, 514, 514, 514, 514, 514, + 514, 514, 514, 514, 514, 514, 514, 514, + 514, 514, 514, 514, 514, 514, 514, 514, + 514, 514, 514, 514, 514, 514, 514, 514, + 514, 514, 518, 514, 519, 519, 519, 519, + 519, 519, 519, 519, 519, 519, 517, 517, + 517, 517, 517, 517, 517, 519, 519, 519, + 519, 519, 519, 517, 517, 517, 517, 517, + 517, 517, 517, 517, 517, 517, 517, 517, + 517, 517, 517, 517, 517, 517, 517, 517, + 517, 517, 517, 517, 517, 519, 519, 519, + 519, 519, 519, 517, 521, 521, 521, 521, + 521, 521, 521, 521, 521, 521, 520, 520, + 520, 520, 520, 520, 520, 521, 521, 521, + 521, 521, 521, 520, 520, 520, 520, 520, + 520, 520, 520, 520, 520, 520, 520, 520, + 520, 520, 520, 520, 520, 520, 520, 520, + 520, 520, 520, 520, 520, 521, 521, 521, + 521, 521, 521, 520, 520, 517, 55, 55, + 55, 517, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 517, + 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 513, 55, 522, 517, 517, 62, + 62, 62, 517, 62, 62, 62, 62, 62, + 62, 62, 62, 62, 62, 62, 62, 62, + 62, 62, 62, 62, 62, 62, 62, 62, + 517, 62, 62, 62, 62, 62, 62, 62, + 62, 62, 62, 62, 62, 62, 62, 62, + 62, 62, 62, 62, 62, 62, 62, 62, + 62, 62, 62, 62, 62, 62, 62, 62, + 62, 62, 62, 62, 62, 63, 62, 62, + 62, 62, 62, 62, 62, 62, 62, 62, + 62, 62, 62, 62, 62, 62, 62, 62, + 62, 62, 62, 62, 62, 62, 62, 62, + 62, 62, 64, 62, 524, 524, 524, 524, + 524, 524, 524, 524, 524, 524, 523, 523, + 523, 523, 523, 523, 523, 524, 524, 524, + 524, 524, 524, 523, 523, 523, 523, 523, + 523, 523, 523, 523, 523, 523, 523, 523, + 523, 523, 523, 523, 523, 523, 523, 523, + 523, 523, 523, 523, 523, 524, 524, 524, + 524, 524, 524, 523, 523, 523, 523, 523, + 523, 523, 523, 523, 523, 523, 523, 523, + 523, 523, 523, 523, 523, 523, 523, 525, + 523, 526, 526, 526, 526, 526, 526, 526, + 526, 526, 526, 523, 523, 523, 523, 523, + 523, 523, 526, 526, 526, 526, 526, 526, + 523, 523, 523, 523, 523, 523, 523, 523, + 523, 523, 523, 523, 523, 523, 523, 523, + 523, 523, 523, 523, 523, 523, 523, 523, + 523, 523, 526, 526, 526, 526, 526, 526, + 523, 527, 527, 527, 527, 527, 527, 527, + 527, 527, 527, 523, 523, 523, 523, 523, + 523, 523, 527, 527, 527, 527, 527, 527, + 523, 523, 523, 523, 523, 523, 523, 523, + 523, 523, 523, 523, 523, 523, 523, 523, + 523, 523, 523, 523, 523, 523, 523, 523, + 523, 523, 527, 527, 527, 527, 527, 527, + 523, 528, 528, 528, 528, 528, 528, 528, + 528, 528, 528, 523, 523, 523, 523, 523, + 523, 523, 528, 528, 528, 528, 528, 528, + 523, 523, 523, 523, 523, 523, 523, 523, + 523, 523, 523, 523, 523, 523, 523, 523, + 523, 523, 523, 523, 523, 523, 523, 523, + 523, 523, 528, 528, 528, 528, 528, 528, + 523, 529, 532, 531, 531, 531, 532, 531, + 531, 531, 531, 533, 531, 531, 531, 531, + 531, 531, 531, 531, 531, 531, 531, 531, + 531, 531, 531, 531, 532, 531, 531, 531, + 531, 531, 533, 531, 531, 531, 531, 531, + 531, 531, 531, 531, 531, 531, 531, 531, + 531, 531, 534, 534, 534, 534, 534, 534, + 534, 534, 534, 534, 531, 531, 531, 531, + 531, 531, 531, 534, 534, 534, 534, 534, + 534, 531, 531, 531, 531, 531, 531, 531, + 531, 531, 531, 531, 531, 531, 531, 531, + 531, 531, 531, 531, 531, 531, 531, 531, + 531, 531, 531, 534, 534, 534, 534, 534, + 534, 531, 531, 531, 531, 531, 531, 531, + 531, 531, 531, 531, 531, 531, 531, 531, + 531, 531, 531, 531, 531, 531, 531, 535, + 531, 532, 531, 531, 531, 532, 531, 531, + 531, 531, 530, 531, 531, 531, 531, 531, + 531, 531, 531, 531, 531, 531, 531, 531, + 531, 531, 531, 532, 531, 531, 531, 531, + 531, 530, 531, 531, 531, 531, 531, 531, + 531, 531, 531, 531, 531, 531, 531, 531, + 531, 536, 536, 536, 536, 536, 536, 536, + 536, 536, 536, 531, 531, 531, 531, 531, + 531, 531, 536, 536, 536, 536, 536, 536, + 531, 531, 531, 531, 531, 531, 531, 531, + 531, 531, 531, 531, 531, 531, 531, 531, + 531, 531, 531, 531, 531, 531, 531, 531, + 531, 531, 536, 536, 536, 536, 536, 536, + 531, 531, 531, 531, 531, 531, 531, 531, + 531, 531, 531, 531, 531, 531, 531, 531, + 531, 531, 531, 531, 531, 531, 537, 531, + 530, 532, 536, 536, 536, 532, 536, 536, + 536, 536, 530, 536, 536, 536, 536, 536, + 536, 536, 536, 536, 536, 536, 536, 536, + 536, 536, 536, 532, 536, 536, 536, 536, + 536, 530, 536, 536, 536, 536, 536, 536, + 536, 536, 536, 536, 536, 536, 536, 536, + 536, 536, 536, 536, 536, 536, 536, 536, + 536, 536, 536, 536, 536, 536, 536, 536, + 536, 536, 536, 536, 536, 536, 536, 536, + 536, 536, 536, 536, 536, 536, 536, 536, + 536, 536, 536, 536, 536, 536, 536, 536, + 536, 536, 536, 536, 536, 536, 536, 536, + 536, 536, 536, 536, 536, 536, 536, 536, + 536, 536, 536, 536, 536, 536, 536, 536, + 536, 536, 536, 536, 536, 536, 536, 536, + 536, 536, 536, 536, 536, 536, 530, 536, + 538, 532, 539, 539, 539, 532, 539, 539, + 539, 539, 533, 539, 539, 539, 539, 539, + 539, 539, 539, 539, 539, 539, 539, 539, + 539, 539, 539, 532, 539, 539, 539, 539, + 539, 533, 539, 539, 539, 539, 539, 539, + 539, 539, 539, 539, 539, 539, 539, 539, + 539, 534, 534, 534, 534, 534, 534, 534, + 534, 534, 534, 539, 539, 539, 539, 539, + 539, 539, 534, 534, 534, 534, 534, 534, + 539, 539, 539, 539, 539, 539, 539, 539, + 539, 539, 539, 539, 539, 539, 539, 539, + 539, 539, 539, 539, 539, 539, 539, 539, + 539, 539, 534, 534, 534, 534, 534, 534, + 539, 539, 539, 539, 539, 539, 539, 539, + 539, 539, 539, 539, 539, 539, 539, 539, + 539, 539, 539, 539, 539, 539, 530, 539, + 532, 539, 539, 539, 532, 539, 539, 539, + 539, 530, 539, 539, 539, 539, 539, 539, + 539, 539, 539, 539, 539, 539, 539, 539, + 539, 539, 532, 539, 539, 539, 539, 539, + 530, 539, 539, 539, 539, 539, 539, 539, + 539, 539, 539, 539, 539, 539, 539, 539, + 536, 536, 536, 536, 536, 536, 536, 536, + 536, 536, 539, 539, 539, 539, 539, 539, + 539, 536, 536, 536, 536, 536, 536, 539, + 539, 539, 539, 539, 539, 539, 539, 539, + 539, 539, 539, 539, 539, 539, 539, 539, + 539, 539, 539, 539, 539, 539, 539, 539, + 539, 536, 536, 536, 536, 536, 536, 539, + 539, 539, 539, 539, 539, 539, 539, 539, + 539, 539, 539, 539, 539, 539, 539, 539, + 539, 539, 539, 539, 539, 532, 539, 532, + 539, 539, 539, 532, 539, 539, 539, 539, + 540, 539, 539, 539, 539, 539, 539, 539, + 539, 539, 539, 539, 539, 539, 539, 539, + 539, 532, 539, 539, 539, 539, 539, 540, + 539, 539, 539, 539, 539, 539, 539, 539, + 539, 539, 539, 539, 539, 539, 539, 541, + 541, 541, 541, 541, 541, 541, 541, 541, + 541, 539, 539, 539, 539, 539, 539, 539, + 541, 541, 541, 541, 541, 541, 539, 539, + 539, 539, 539, 539, 539, 539, 539, 539, + 539, 539, 539, 539, 539, 539, 539, 539, + 539, 539, 539, 539, 539, 539, 539, 539, + 541, 541, 541, 541, 541, 541, 539, 539, + 539, 539, 539, 539, 539, 539, 539, 539, + 539, 539, 539, 539, 539, 539, 539, 539, + 539, 539, 539, 539, 542, 539, 532, 539, + 539, 539, 532, 539, 539, 539, 539, 540, + 539, 539, 539, 539, 539, 539, 539, 539, + 539, 539, 539, 539, 539, 539, 539, 539, + 532, 539, 539, 539, 539, 539, 540, 539, + 539, 539, 539, 539, 539, 539, 539, 539, + 539, 539, 539, 539, 539, 539, 534, 534, + 534, 534, 534, 534, 534, 534, 534, 534, + 539, 539, 539, 539, 539, 539, 539, 534, + 534, 534, 534, 534, 534, 539, 539, 539, + 539, 539, 539, 539, 539, 539, 539, 539, + 539, 539, 539, 539, 539, 539, 539, 539, + 539, 539, 539, 539, 539, 539, 539, 534, + 534, 534, 534, 534, 534, 539, 539, 539, + 539, 539, 539, 539, 539, 539, 539, 539, + 539, 539, 539, 539, 539, 539, 539, 539, + 539, 539, 539, 542, 539, 543, 532, 539, + 539, 539, 532, 539, 539, 539, 539, 540, + 539, 539, 539, 539, 539, 539, 539, 539, + 539, 539, 539, 539, 539, 539, 539, 539, + 532, 539, 539, 539, 539, 539, 540, 539, + 539, 539, 539, 539, 539, 539, 539, 539, + 539, 539, 539, 539, 539, 539, 544, 544, + 544, 544, 544, 544, 544, 544, 544, 544, + 539, 539, 539, 539, 539, 539, 539, 544, + 544, 544, 544, 544, 544, 539, 539, 539, + 539, 539, 539, 539, 539, 539, 539, 539, + 539, 539, 539, 539, 539, 539, 539, 539, + 539, 539, 539, 539, 539, 539, 539, 544, + 544, 544, 544, 544, 544, 539, 539, 539, + 539, 539, 539, 539, 539, 539, 539, 539, + 539, 539, 539, 539, 539, 539, 539, 539, + 539, 539, 539, 542, 539, 532, 539, 539, + 539, 532, 539, 539, 539, 539, 540, 539, + 539, 539, 539, 539, 539, 539, 539, 539, + 539, 539, 539, 539, 539, 539, 539, 532, + 539, 539, 539, 539, 539, 540, 539, 539, + 539, 539, 539, 539, 539, 539, 539, 539, + 539, 539, 539, 539, 539, 545, 545, 545, + 545, 545, 545, 545, 545, 545, 545, 539, + 539, 539, 539, 539, 539, 539, 545, 545, + 545, 545, 545, 545, 539, 539, 539, 539, + 539, 539, 539, 539, 539, 539, 539, 539, + 539, 539, 539, 539, 539, 539, 539, 539, + 539, 539, 539, 539, 539, 539, 545, 545, + 545, 545, 545, 545, 539, 539, 539, 539, + 539, 539, 539, 539, 539, 539, 539, 539, + 539, 539, 539, 539, 539, 539, 539, 539, + 539, 539, 542, 539, 532, 539, 539, 539, + 532, 539, 539, 539, 539, 540, 539, 539, + 539, 539, 539, 539, 539, 539, 539, 539, + 539, 539, 539, 539, 539, 539, 532, 539, + 539, 539, 539, 539, 540, 539, 539, 539, + 539, 539, 539, 539, 539, 539, 539, 539, + 539, 539, 539, 539, 546, 546, 546, 546, + 546, 546, 546, 546, 546, 546, 539, 539, + 539, 539, 539, 539, 539, 546, 546, 546, + 546, 546, 546, 539, 539, 539, 539, 539, + 539, 539, 539, 539, 539, 539, 539, 539, + 539, 539, 539, 539, 539, 539, 539, 539, + 539, 539, 539, 539, 539, 546, 546, 546, + 546, 546, 546, 539, 539, 539, 539, 539, + 539, 539, 539, 539, 539, 539, 539, 539, + 539, 539, 539, 539, 539, 539, 539, 539, + 539, 542, 539, 532, 539, 539, 539, 532, + 539, 539, 539, 539, 540, 539, 539, 539, + 539, 539, 539, 539, 539, 539, 539, 539, + 539, 539, 539, 539, 539, 532, 539, 539, + 539, 539, 539, 540, 539, 539, 539, 539, + 539, 539, 539, 539, 539, 539, 539, 539, + 539, 539, 539, 547, 547, 547, 547, 547, + 547, 547, 547, 547, 547, 539, 539, 539, + 539, 539, 539, 539, 547, 547, 547, 547, + 547, 547, 539, 539, 539, 539, 539, 539, + 539, 539, 539, 539, 539, 539, 539, 539, + 539, 539, 539, 539, 539, 539, 539, 539, + 539, 539, 539, 539, 547, 547, 547, 547, + 547, 547, 539, 539, 539, 539, 539, 539, + 539, 539, 539, 539, 539, 539, 539, 539, + 539, 539, 539, 539, 539, 539, 539, 539, + 542, 539, 532, 539, 539, 539, 532, 539, + 539, 539, 539, 540, 539, 539, 539, 539, + 539, 539, 539, 539, 539, 539, 539, 539, + 539, 539, 539, 539, 532, 539, 539, 539, + 539, 539, 540, 539, 539, 539, 539, 539, + 539, 539, 539, 539, 539, 539, 539, 539, + 539, 539, 548, 548, 548, 548, 548, 548, + 548, 548, 548, 548, 539, 539, 539, 539, + 539, 539, 539, 548, 548, 548, 548, 548, + 548, 539, 539, 539, 539, 539, 539, 539, + 539, 539, 539, 539, 539, 539, 539, 539, + 539, 539, 539, 539, 539, 539, 539, 539, + 539, 539, 539, 548, 548, 548, 548, 548, + 548, 539, 539, 539, 539, 539, 539, 539, + 539, 539, 539, 539, 539, 539, 539, 539, + 539, 539, 539, 539, 539, 539, 539, 542, + 539, 532, 539, 539, 539, 532, 539, 539, + 539, 539, 530, 539, 539, 539, 539, 539, + 539, 539, 539, 539, 539, 539, 539, 539, + 539, 539, 539, 532, 539, 539, 539, 539, + 539, 530, 539, 539, 539, 539, 539, 539, + 539, 539, 539, 539, 539, 539, 539, 539, + 539, 548, 548, 548, 548, 548, 548, 548, + 548, 548, 548, 539, 539, 539, 539, 539, + 539, 539, 548, 548, 548, 548, 548, 548, + 539, 539, 539, 539, 539, 539, 539, 539, + 539, 539, 539, 539, 539, 539, 539, 539, + 539, 539, 539, 539, 539, 539, 539, 539, + 539, 539, 548, 548, 548, 548, 548, 548, + 539, 539, 539, 539, 539, 539, 539, 539, + 539, 539, 539, 539, 539, 539, 539, 539, + 539, 539, 539, 539, 539, 539, 530, 539, + 549, 550, 552, 552, 552, 552, 552, 552, + 552, 552, 552, 552, 551, 551, 551, 551, + 551, 551, 551, 552, 552, 552, 552, 552, + 552, 551, 551, 551, 551, 551, 551, 551, + 551, 551, 551, 551, 551, 551, 551, 551, + 551, 551, 551, 551, 551, 551, 551, 551, + 551, 551, 551, 552, 552, 552, 552, 552, + 552, 551, 551, 554, 553, 553, 553, 554, + 553, 553, 553, 553, 555, 556, 555, 555, + 555, 553, 553, 553, 553, 553, 553, 553, + 553, 553, 553, 553, 553, 554, 553, 553, + 553, 553, 553, 555, 553, 553, 553, 553, + 553, 553, 553, 553, 553, 553, 553, 553, + 553, 553, 553, 553, 553, 553, 553, 553, + 553, 553, 553, 553, 553, 553, 553, 553, + 553, 553, 553, 553, 553, 553, 553, 553, + 553, 553, 553, 553, 553, 553, 553, 553, + 553, 553, 553, 553, 553, 553, 553, 553, + 553, 553, 553, 553, 553, 553, 553, 557, + 553, 555, 558, 555, 555, 555, 558, 558, + 558, 558, 558, 558, 558, 558, 558, 558, + 558, 558, 558, 558, 558, 558, 558, 558, + 555, 558, 559, 560, 560, 560, 559, 560, + 560, 560, 560, 560, 560, 560, 560, 560, + 560, 560, 560, 560, 560, 560, 560, 560, + 560, 560, 560, 560, 559, 560, 562, 561, + 561, 561, 562, 561, 561, 561, 561, 561, + 563, 561, 561, 561, 561, 561, 561, 561, + 561, 561, 561, 561, 561, 561, 561, 561, + 562, 561, 561, 561, 561, 561, 561, 561, + 561, 561, 561, 561, 561, 561, 561, 561, + 561, 561, 561, 561, 561, 561, 561, 561, + 561, 561, 561, 561, 561, 561, 561, 561, + 561, 561, 561, 561, 561, 561, 561, 561, + 561, 561, 561, 561, 561, 561, 561, 561, + 561, 561, 561, 561, 561, 561, 561, 561, + 561, 561, 561, 561, 561, 561, 561, 561, + 561, 561, 564, 561, 565, 566, 566, 566, + 565, 566, 566, 566, 566, 566, 567, 566, + 566, 566, 566, 566, 566, 566, 566, 566, + 566, 566, 566, 566, 566, 566, 565, 566, + 569, 568, 568, 568, 569, 568, 568, 568, + 568, 568, 570, 568, 568, 568, 568, 568, + 568, 568, 568, 568, 568, 568, 568, 568, + 568, 568, 569, 568, 568, 568, 568, 568, + 568, 568, 568, 571, 568, 573, 572, 572, + 572, 572, 572, 572, 572, 572, 572, 572, + 572, 572, 572, 572, 572, 572, 572, 572, + 572, 572, 572, 572, 572, 572, 572, 572, + 572, 574, 572, 572, 572, 572, 572, 572, + 572, 572, 572, 572, 572, 572, 572, 572, + 572, 572, 572, 572, 572, 572, 572, 572, + 572, 572, 572, 572, 572, 572, 572, 572, + 572, 572, 572, 572, 572, 572, 572, 572, + 572, 572, 572, 572, 572, 572, 572, 572, + 572, 572, 572, 572, 572, 572, 572, 572, + 572, 572, 572, 572, 575, 572, 576, 576, + 576, 576, 576, 576, 576, 576, 576, 576, + 576, 576, 576, 576, 576, 576, 576, 576, + 576, 576, 576, 576, 576, 576, 576, 576, + 576, 576, 576, 576, 576, 576, 576, 576, + 576, 576, 576, 576, 576, 576, 576, 576, + 576, 576, 576, 576, 576, 576, 83, 83, + 83, 83, 83, 83, 83, 83, 83, 83, + 576, 576, 576, 576, 576, 576, 576, 83, + 83, 83, 83, 83, 83, 83, 83, 83, + 83, 83, 83, 83, 83, 83, 83, 83, + 83, 83, 83, 83, 83, 83, 83, 83, + 83, 576, 576, 576, 576, 83, 576, 83, + 83, 83, 83, 83, 83, 83, 83, 83, + 83, 83, 83, 83, 83, 83, 83, 83, + 83, 83, 83, 83, 83, 83, 83, 83, + 83, 576, 576, 576, 576, 576, 83, 86, + 86, 86, 86, 86, 86, 86, 86, 86, + 86, 576, 577, 577, 577, 577, 577, 577, + 577, 577, 577, 577, 577, 577, 577, 577, + 577, 577, 577, 577, 577, 577, 577, 577, + 577, 577, 577, 577, 577, 577, 577, 577, + 577, 577, 577, 577, 577, 577, 577, 577, + 577, 577, 577, 577, 577, 577, 577, 577, + 577, 577, 83, 83, 83, 83, 83, 83, + 83, 83, 83, 83, 577, 577, 577, 577, + 577, 577, 577, 87, 87, 87, 87, 87, + 87, 87, 87, 87, 87, 87, 87, 87, + 87, 87, 87, 87, 87, 87, 87, 87, + 87, 87, 87, 87, 87, 577, 577, 577, + 577, 87, 577, 87, 87, 87, 87, 87, + 87, 87, 87, 87, 87, 87, 87, 87, + 87, 87, 87, 87, 87, 87, 87, 87, + 87, 87, 87, 87, 87, 577, 577, 577, + 577, 577, 87, 579, 578, 578, 578, 579, + 578, 578, 578, 578, 578, 580, 578, 578, + 578, 578, 578, 578, 578, 578, 578, 578, + 578, 578, 578, 578, 578, 579, 578, 582, + 581, 581, 581, 582, 581, 581, 581, 581, + 583, 584, 583, 583, 583, 581, 581, 581, + 581, 581, 581, 581, 581, 581, 581, 581, + 581, 582, 581, 581, 581, 581, 581, 583, + 581, 581, 585, 581, 583, 586, 583, 583, + 583, 586, 586, 586, 586, 586, 586, 586, + 586, 586, 586, 586, 586, 586, 586, 586, + 586, 586, 586, 583, 586, 588, 587, 587, + 587, 587, 587, 587, 587, 587, 587, 587, + 587, 587, 587, 587, 587, 587, 587, 587, + 587, 587, 587, 587, 587, 587, 587, 587, + 587, 589, 587, 587, 587, 587, 587, 587, + 587, 587, 587, 587, 587, 587, 587, 587, + 587, 587, 587, 587, 587, 587, 587, 587, + 587, 587, 587, 587, 587, 587, 587, 587, + 587, 587, 587, 587, 587, 587, 587, 587, + 587, 587, 587, 587, 587, 587, 587, 587, + 587, 587, 587, 587, 587, 587, 587, 587, + 587, 587, 587, 587, 590, 587, 591, 591, + 591, 591, 591, 591, 591, 591, 591, 591, + 591, 591, 591, 591, 591, 591, 591, 591, + 591, 591, 591, 591, 591, 591, 591, 591, + 591, 591, 591, 591, 591, 591, 591, 591, + 591, 591, 591, 591, 591, 591, 591, 591, + 591, 591, 591, 591, 591, 591, 90, 90, + 90, 90, 90, 90, 90, 90, 90, 90, + 591, 591, 591, 591, 591, 591, 591, 90, + 90, 90, 90, 90, 90, 90, 90, 90, + 90, 90, 90, 90, 90, 90, 90, 90, + 90, 90, 90, 90, 90, 90, 90, 90, + 90, 591, 591, 591, 591, 90, 591, 90, + 90, 90, 90, 90, 90, 90, 90, 90, + 90, 90, 90, 90, 90, 90, 90, 90, + 90, 90, 90, 90, 90, 90, 90, 90, + 90, 591, 591, 591, 591, 591, 90, 93, + 93, 93, 93, 93, 93, 93, 93, 93, + 93, 591, 592, 592, 592, 592, 592, 592, + 592, 592, 592, 592, 592, 592, 592, 592, + 592, 592, 592, 592, 592, 592, 592, 592, + 592, 592, 592, 592, 592, 592, 592, 592, + 592, 592, 592, 592, 592, 592, 592, 592, + 592, 592, 592, 592, 592, 592, 592, 592, + 592, 592, 90, 90, 90, 90, 90, 90, + 90, 90, 90, 90, 592, 592, 592, 592, + 592, 592, 592, 94, 94, 94, 94, 94, + 94, 94, 94, 94, 94, 94, 94, 94, + 94, 94, 94, 94, 94, 94, 94, 94, + 94, 94, 94, 94, 94, 592, 592, 592, + 592, 94, 592, 94, 94, 94, 94, 94, + 94, 94, 94, 94, 94, 94, 94, 94, + 94, 94, 94, 94, 94, 94, 94, 94, + 94, 94, 94, 94, 94, 592, 592, 592, + 592, 592, 94, 594, 593, 593, 593, 594, + 593, 593, 593, 593, 595, 596, 595, 595, + 595, 593, 593, 593, 593, 593, 593, 593, + 593, 593, 593, 593, 593, 594, 593, 593, + 593, 593, 593, 595, 593, 595, 597, 595, + 595, 595, 597, 597, 597, 597, 597, 597, + 597, 597, 597, 597, 597, 597, 597, 597, + 597, 597, 597, 597, 595, 597, 599, 599, + 599, 599, 599, 599, 599, 599, 599, 599, + 599, 599, 599, 599, 599, 599, 599, 599, + 599, 599, 599, 599, 599, 599, 599, 599, + 598, 598, 598, 598, 598, 598, 599, 599, + 599, 599, 599, 599, 599, 599, 599, 599, + 599, 599, 599, 599, 599, 599, 599, 599, + 599, 599, 599, 599, 599, 599, 599, 599, + 598, 599, 599, 599, 599, 599, 599, 599, + 599, 599, 599, 599, 599, 599, 599, 599, + 599, 599, 599, 599, 599, 599, 599, 599, + 599, 599, 599, 600, 600, 600, 600, 600, + 600, 599, 599, 599, 599, 599, 599, 599, + 599, 599, 599, 599, 599, 599, 599, 599, + 599, 599, 599, 599, 599, 599, 599, 599, + 599, 599, 599, 600, 601, 98, 98, 98, + 98, 98, 98, 98, 98, 98, 98, 98, + 98, 98, 98, 98, 98, 98, 98, 98, + 98, 98, 98, 98, 98, 98, 98, 98, + 602, 98, 603, 603, 603, 603, 603, 603, + 603, 603, 603, 603, 603, 603, 603, 603, + 603, 603, 603, 603, 603, 603, 603, 603, + 603, 603, 603, 603, 603, 603, 603, 603, + 603, 603, 603, 603, 603, 603, 603, 603, + 603, 603, 603, 603, 603, 603, 603, 603, + 603, 603, 96, 96, 96, 96, 96, 96, + 96, 96, 96, 96, 603, 603, 603, 603, + 603, 603, 603, 96, 96, 96, 96, 96, + 96, 96, 96, 96, 96, 96, 96, 96, + 96, 96, 96, 96, 96, 96, 96, 96, + 96, 96, 96, 96, 96, 603, 603, 603, + 603, 96, 603, 96, 96, 96, 96, 96, + 96, 96, 96, 96, 96, 96, 96, 96, + 96, 96, 96, 96, 96, 96, 96, 96, + 96, 96, 96, 96, 96, 603, 603, 603, + 603, 603, 96, 100, 100, 100, 100, 100, + 100, 100, 100, 100, 100, 603, 604, 604, + 604, 604, 604, 604, 604, 604, 604, 604, + 604, 604, 604, 604, 604, 604, 604, 604, + 604, 604, 604, 604, 604, 604, 604, 604, + 604, 604, 604, 604, 604, 604, 604, 604, + 604, 604, 604, 604, 604, 604, 604, 604, + 604, 604, 604, 604, 604, 604, 101, 101, + 101, 101, 101, 101, 101, 101, 101, 101, + 604, 604, 604, 604, 604, 604, 604, 101, + 101, 101, 101, 101, 101, 101, 101, 101, + 101, 101, 101, 101, 101, 101, 101, 101, + 101, 101, 101, 101, 101, 101, 101, 101, + 101, 604, 604, 604, 604, 101, 604, 101, + 101, 101, 101, 101, 101, 101, 101, 101, + 101, 101, 101, 101, 101, 101, 101, 101, + 101, 101, 101, 101, 101, 101, 101, 101, + 101, 604, 604, 604, 604, 604, 101, 605, + 605, 605, 605, 605, 605, 605, 605, 605, + 605, 605, 605, 605, 605, 605, 605, 605, + 605, 605, 605, 605, 605, 605, 605, 605, + 605, 605, 605, 605, 605, 605, 605, 605, + 605, 605, 605, 605, 605, 605, 605, 605, + 605, 605, 605, 605, 605, 605, 605, 103, + 103, 103, 103, 103, 103, 103, 103, 103, + 103, 605, 605, 605, 605, 605, 605, 605, + 103, 103, 103, 103, 103, 103, 103, 103, + 103, 103, 103, 103, 103, 103, 103, 103, + 103, 103, 103, 103, 103, 103, 103, 103, + 103, 103, 605, 605, 605, 605, 103, 605, + 103, 103, 103, 103, 103, 103, 103, 103, + 103, 103, 103, 103, 103, 103, 103, 103, + 103, 103, 103, 103, 103, 103, 103, 103, + 103, 103, 605, 605, 605, 605, 605, 103, + 607, 608, 608, 608, 607, 608, 608, 608, + 608, 609, 610, 609, 609, 609, 608, 608, + 608, 608, 608, 608, 608, 608, 608, 608, + 608, 608, 607, 608, 608, 608, 608, 608, + 609, 611, 608, 612, 613, 614, 615, 608, + 608, 608, 616, 617, 608, 617, 608, 618, + 608, 608, 608, 608, 608, 608, 608, 608, + 608, 608, 619, 608, 620, 621, 622, 608, + 608, 623, 624, 623, 623, 625, 623, 623, + 623, 623, 623, 623, 623, 623, 623, 623, + 623, 623, 623, 623, 623, 623, 623, 623, + 623, 623, 623, 626, 627, 608, 618, 628, + 618, 629, 630, 631, 632, 633, 634, 606, + 606, 635, 606, 606, 606, 636, 637, 638, + 606, 606, 639, 640, 641, 642, 606, 643, + 606, 644, 606, 608, 645, 608, 617, 608, + 606, 646, 646, 646, 646, 646, 646, 646, + 646, 646, 646, 646, 646, 646, 646, 646, + 646, 646, 646, 646, 646, 646, 646, 646, + 646, 646, 646, 646, 646, 646, 646, 646, + 646, 646, 647, 646, 646, 646, 646, 646, + 646, 646, 646, 646, 646, 646, 646, 646, + 646, 606, 606, 606, 606, 606, 606, 606, + 606, 606, 606, 646, 646, 646, 647, 646, + 647, 646, 606, 606, 606, 606, 606, 606, + 606, 606, 606, 606, 606, 606, 606, 606, + 606, 606, 606, 606, 606, 606, 606, 606, + 606, 606, 606, 606, 646, 646, 646, 646, + 606, 646, 606, 606, 606, 606, 606, 606, + 606, 606, 606, 606, 606, 606, 606, 606, + 606, 606, 606, 606, 606, 606, 606, 606, + 606, 606, 606, 606, 646, 646, 646, 646, + 646, 606, 609, 648, 609, 609, 609, 648, + 648, 648, 648, 648, 648, 648, 648, 648, + 648, 648, 648, 648, 648, 648, 648, 648, + 648, 609, 648, 649, 618, 650, 650, 618, + 650, 650, 650, 650, 650, 650, 650, 650, + 650, 650, 650, 650, 650, 650, 650, 650, + 650, 650, 650, 650, 650, 650, 650, 650, + 650, 650, 650, 650, 650, 650, 650, 650, + 650, 650, 650, 650, 650, 650, 650, 650, + 650, 650, 650, 650, 650, 650, 650, 650, + 650, 650, 650, 650, 650, 650, 650, 650, + 650, 650, 650, 650, 650, 618, 650, 651, + 652, 653, 654, 655, 655, 655, 655, 655, + 655, 655, 655, 655, 655, 655, 655, 655, + 655, 655, 655, 655, 655, 655, 655, 655, + 655, 655, 655, 655, 655, 655, 655, 655, + 655, 655, 655, 655, 105, 105, 655, 105, + 655, 105, 105, 655, 655, 105, 105, 105, + 657, 105, 105, 658, 658, 658, 658, 658, + 658, 658, 658, 658, 658, 105, 105, 105, + 105, 105, 105, 105, 656, 656, 656, 656, + 656, 656, 656, 656, 656, 656, 656, 656, + 656, 656, 656, 656, 656, 656, 656, 656, + 656, 656, 656, 656, 656, 656, 655, 105, + 655, 655, 656, 105, 656, 656, 656, 656, + 656, 656, 656, 656, 656, 656, 656, 656, + 656, 656, 656, 656, 656, 656, 656, 656, + 656, 656, 656, 656, 656, 656, 655, 655, + 655, 105, 655, 656, 659, 659, 659, 659, + 659, 659, 659, 659, 659, 659, 659, 659, + 659, 659, 659, 659, 659, 659, 659, 659, + 659, 659, 659, 659, 659, 659, 659, 659, + 659, 659, 659, 659, 659, 659, 659, 659, + 659, 659, 659, 659, 659, 659, 659, 659, + 659, 659, 659, 659, 656, 656, 656, 656, + 656, 656, 656, 656, 656, 656, 659, 659, + 659, 659, 659, 659, 659, 656, 656, 656, + 656, 656, 656, 656, 656, 656, 656, 656, + 656, 656, 656, 656, 656, 656, 656, 656, + 656, 656, 656, 656, 656, 656, 656, 659, + 659, 659, 659, 656, 659, 656, 656, 656, + 656, 656, 656, 656, 656, 656, 656, 656, + 656, 656, 656, 656, 656, 656, 656, 656, + 656, 656, 656, 656, 656, 656, 656, 659, + 659, 659, 659, 659, 656, 658, 658, 658, + 658, 658, 658, 658, 658, 658, 658, 659, + 660, 650, 618, 650, 618, 650, 618, 650, + 662, 661, 618, 663, 650, 618, 650, 664, + 618, 655, 655, 655, 655, 655, 655, 655, + 655, 655, 655, 655, 655, 655, 655, 655, + 655, 655, 655, 655, 655, 655, 655, 655, + 655, 655, 655, 655, 655, 655, 655, 655, + 655, 655, 655, 655, 655, 655, 655, 655, + 655, 655, 655, 655, 655, 655, 655, 655, + 655, 655, 655, 655, 655, 655, 655, 655, + 655, 655, 655, 655, 655, 655, 655, 655, + 618, 655, 618, 650, 618, 618, 650, 646, + 646, 646, 646, 646, 646, 646, 646, 646, + 646, 646, 646, 646, 646, 646, 646, 646, + 646, 646, 646, 646, 646, 646, 646, 646, + 646, 646, 646, 646, 646, 646, 646, 646, + 647, 646, 646, 646, 646, 646, 646, 646, + 646, 646, 646, 646, 646, 646, 646, 623, + 623, 623, 623, 623, 623, 623, 623, 623, + 623, 646, 646, 646, 647, 646, 647, 646, + 623, 623, 623, 623, 623, 623, 623, 623, + 623, 623, 623, 623, 623, 623, 623, 623, + 623, 623, 623, 623, 623, 623, 623, 623, + 623, 623, 646, 646, 646, 646, 623, 646, + 623, 623, 623, 623, 623, 623, 623, 623, + 623, 623, 623, 623, 623, 623, 623, 623, + 623, 623, 623, 623, 623, 623, 623, 623, + 623, 623, 646, 646, 646, 646, 646, 623, + 665, 665, 665, 665, 665, 665, 665, 665, + 665, 665, 665, 665, 665, 665, 665, 665, + 665, 665, 665, 665, 665, 665, 665, 665, + 665, 665, 665, 665, 665, 665, 665, 665, + 665, 647, 665, 665, 665, 665, 665, 665, + 665, 665, 665, 665, 665, 665, 665, 665, + 623, 623, 623, 623, 623, 623, 623, 623, + 623, 623, 665, 665, 665, 647, 665, 647, + 665, 623, 623, 623, 623, 666, 623, 623, + 623, 623, 623, 623, 623, 623, 623, 623, + 623, 623, 623, 623, 623, 623, 623, 623, + 623, 623, 623, 665, 665, 665, 665, 623, + 665, 623, 623, 623, 623, 623, 623, 623, + 623, 623, 623, 623, 623, 623, 623, 623, + 623, 623, 623, 623, 623, 623, 623, 623, + 623, 623, 623, 665, 665, 665, 665, 665, + 623, 665, 665, 665, 665, 665, 665, 665, + 665, 665, 665, 665, 665, 665, 665, 665, + 665, 665, 665, 665, 665, 665, 665, 665, + 665, 665, 665, 665, 665, 665, 665, 665, + 665, 665, 647, 665, 665, 665, 665, 665, + 665, 665, 665, 665, 665, 665, 665, 665, + 665, 623, 623, 623, 623, 623, 623, 623, + 623, 623, 623, 665, 665, 665, 647, 665, + 647, 665, 623, 623, 623, 623, 623, 623, + 667, 623, 623, 623, 623, 623, 623, 623, + 623, 623, 623, 623, 623, 623, 623, 623, + 623, 623, 623, 623, 665, 665, 665, 665, + 623, 665, 623, 623, 623, 623, 623, 623, + 623, 623, 623, 623, 623, 623, 623, 623, + 623, 623, 623, 623, 623, 623, 623, 623, + 623, 623, 623, 623, 665, 665, 665, 665, + 665, 623, 665, 665, 665, 665, 665, 665, + 665, 665, 665, 665, 665, 665, 665, 665, + 665, 665, 665, 665, 665, 665, 665, 665, + 665, 665, 665, 665, 665, 665, 665, 665, + 665, 665, 665, 647, 665, 665, 665, 665, + 665, 665, 665, 665, 665, 665, 665, 665, + 665, 665, 623, 623, 623, 623, 623, 623, + 623, 623, 623, 623, 665, 665, 665, 647, + 665, 647, 665, 623, 623, 623, 623, 623, + 623, 623, 623, 668, 623, 623, 623, 623, + 623, 623, 623, 623, 623, 623, 623, 623, + 623, 623, 623, 623, 623, 665, 665, 665, + 665, 623, 665, 623, 623, 623, 623, 623, + 623, 623, 623, 623, 623, 623, 623, 623, + 623, 623, 623, 623, 623, 623, 623, 623, + 623, 623, 623, 623, 623, 665, 665, 665, + 665, 665, 623, 665, 665, 665, 665, 665, + 665, 665, 665, 665, 665, 665, 665, 665, + 665, 665, 665, 665, 665, 665, 665, 665, + 665, 665, 665, 665, 665, 665, 665, 665, + 665, 665, 665, 665, 647, 665, 665, 665, + 665, 665, 665, 665, 665, 665, 665, 665, + 665, 665, 665, 623, 623, 623, 623, 623, + 623, 623, 623, 623, 623, 665, 665, 665, + 647, 665, 647, 665, 623, 623, 623, 623, + 623, 623, 623, 623, 623, 623, 623, 623, + 623, 669, 623, 623, 623, 623, 623, 623, + 623, 623, 623, 623, 623, 623, 665, 665, + 665, 665, 623, 665, 623, 623, 623, 623, + 623, 623, 623, 623, 623, 623, 623, 623, + 623, 623, 623, 623, 623, 623, 623, 623, + 623, 623, 623, 623, 623, 623, 665, 665, + 665, 665, 665, 623, 665, 665, 665, 665, + 665, 665, 665, 665, 665, 665, 665, 665, + 665, 665, 665, 665, 665, 665, 665, 665, + 665, 665, 665, 665, 665, 665, 665, 665, + 665, 665, 665, 665, 665, 647, 665, 665, + 665, 665, 665, 665, 665, 665, 665, 665, + 665, 665, 665, 665, 623, 623, 623, 623, + 623, 623, 623, 623, 623, 623, 665, 665, + 665, 647, 665, 647, 665, 623, 623, 623, + 623, 623, 623, 623, 623, 623, 623, 623, + 623, 623, 670, 623, 623, 623, 623, 623, + 623, 623, 623, 623, 623, 623, 623, 665, + 665, 665, 665, 623, 665, 623, 623, 623, + 623, 623, 623, 623, 623, 623, 623, 623, + 623, 623, 623, 623, 623, 623, 623, 623, + 623, 623, 623, 623, 623, 623, 623, 665, + 665, 665, 665, 665, 623, 665, 665, 665, + 665, 665, 665, 665, 665, 665, 665, 665, + 665, 665, 665, 665, 665, 665, 665, 665, + 665, 665, 665, 665, 665, 665, 665, 665, + 665, 665, 665, 665, 665, 665, 647, 665, + 665, 665, 665, 665, 665, 665, 665, 665, + 665, 665, 665, 665, 665, 623, 623, 623, + 623, 623, 623, 623, 623, 623, 623, 665, + 665, 665, 647, 665, 647, 665, 623, 623, + 623, 669, 623, 623, 623, 623, 623, 623, + 623, 623, 623, 623, 623, 623, 623, 623, + 623, 623, 623, 623, 623, 623, 623, 623, + 665, 665, 665, 665, 623, 665, 623, 623, + 623, 623, 623, 623, 623, 623, 623, 623, + 623, 623, 623, 623, 623, 623, 623, 623, + 623, 623, 623, 623, 623, 623, 623, 623, + 665, 665, 665, 665, 665, 623, 664, 655, + 610, 655, 671, 671, 671, 671, 671, 671, + 671, 671, 671, 671, 671, 671, 671, 671, + 671, 671, 671, 671, 671, 671, 671, 671, + 671, 671, 671, 671, 671, 671, 671, 671, + 671, 671, 671, 647, 671, 671, 671, 671, + 671, 671, 671, 671, 671, 671, 671, 671, + 671, 671, 606, 606, 606, 606, 606, 606, + 606, 606, 606, 606, 671, 671, 671, 647, + 671, 647, 671, 606, 606, 606, 606, 606, + 606, 606, 606, 606, 606, 606, 606, 606, + 606, 606, 606, 606, 606, 606, 606, 606, + 606, 606, 606, 606, 606, 671, 671, 671, + 671, 672, 671, 606, 606, 606, 606, 606, + 606, 606, 606, 606, 606, 606, 606, 606, + 606, 606, 606, 606, 606, 606, 606, 606, + 606, 606, 606, 606, 606, 671, 671, 671, + 671, 671, 606, 671, 671, 671, 671, 671, + 671, 671, 671, 671, 671, 671, 671, 671, + 671, 671, 671, 671, 671, 671, 671, 671, + 671, 671, 671, 671, 671, 671, 671, 671, + 671, 671, 671, 671, 647, 671, 671, 671, + 671, 671, 671, 671, 671, 671, 671, 671, + 671, 671, 671, 606, 606, 606, 606, 606, + 606, 606, 606, 606, 606, 671, 671, 671, + 647, 671, 647, 671, 606, 606, 606, 606, + 673, 674, 606, 606, 606, 606, 606, 675, + 606, 606, 606, 606, 606, 606, 606, 606, + 606, 606, 606, 606, 606, 606, 671, 671, + 671, 671, 606, 671, 606, 606, 606, 606, + 606, 606, 606, 606, 606, 606, 606, 606, + 606, 606, 606, 606, 606, 606, 606, 606, + 606, 606, 606, 606, 606, 606, 671, 671, + 671, 671, 671, 606, 671, 671, 671, 671, + 671, 671, 671, 671, 671, 671, 671, 671, + 671, 671, 671, 671, 671, 671, 671, 671, + 671, 671, 671, 671, 671, 671, 671, 671, + 671, 671, 671, 671, 671, 647, 671, 671, + 671, 671, 671, 671, 671, 671, 671, 671, + 671, 671, 671, 671, 606, 606, 606, 606, + 606, 606, 606, 606, 606, 606, 671, 671, + 671, 647, 671, 647, 671, 606, 606, 606, + 606, 606, 606, 606, 606, 606, 606, 606, + 606, 606, 676, 606, 606, 606, 606, 606, + 606, 606, 606, 606, 606, 606, 606, 671, + 671, 671, 671, 606, 671, 606, 606, 606, + 606, 606, 606, 606, 606, 606, 606, 606, + 606, 606, 606, 606, 606, 606, 606, 606, + 606, 606, 606, 606, 606, 606, 606, 671, + 671, 671, 671, 671, 606, 671, 671, 671, + 671, 671, 671, 671, 671, 671, 671, 671, + 671, 671, 671, 671, 671, 671, 671, 671, + 671, 671, 671, 671, 671, 671, 671, 671, + 671, 671, 671, 671, 671, 671, 647, 671, + 671, 671, 671, 671, 671, 671, 671, 671, + 671, 671, 671, 671, 671, 606, 606, 606, + 606, 606, 606, 606, 606, 606, 606, 671, + 671, 671, 647, 671, 647, 671, 606, 606, + 677, 606, 606, 606, 606, 606, 606, 606, + 606, 606, 606, 606, 606, 606, 606, 606, + 606, 606, 606, 606, 606, 606, 606, 606, + 671, 671, 671, 671, 606, 671, 606, 606, + 606, 606, 606, 606, 606, 606, 606, 606, + 606, 606, 606, 606, 606, 606, 606, 606, + 606, 606, 606, 606, 606, 606, 606, 606, + 671, 671, 671, 671, 671, 606, 671, 671, + 671, 671, 671, 671, 671, 671, 671, 671, + 671, 671, 671, 671, 671, 671, 671, 671, + 671, 671, 671, 671, 671, 671, 671, 671, + 671, 671, 671, 671, 671, 671, 671, 647, + 671, 671, 671, 671, 671, 671, 671, 671, + 671, 671, 671, 671, 671, 671, 606, 606, + 606, 606, 606, 606, 606, 606, 606, 606, + 671, 671, 671, 647, 671, 647, 671, 606, + 606, 606, 606, 606, 606, 606, 606, 606, + 606, 606, 606, 606, 606, 678, 606, 606, + 606, 606, 606, 606, 606, 606, 606, 606, + 606, 671, 671, 671, 671, 606, 671, 606, + 606, 606, 606, 606, 606, 606, 606, 606, + 606, 606, 606, 606, 606, 606, 606, 606, + 606, 606, 606, 606, 606, 606, 606, 606, + 606, 671, 671, 671, 671, 671, 606, 671, + 671, 671, 671, 671, 671, 671, 671, 671, + 671, 671, 671, 671, 671, 671, 671, 671, + 671, 671, 671, 671, 671, 671, 671, 671, + 671, 671, 671, 671, 671, 671, 671, 671, + 647, 671, 671, 671, 671, 671, 671, 671, + 671, 671, 671, 671, 671, 671, 671, 606, + 606, 606, 606, 606, 606, 606, 606, 606, + 606, 671, 671, 671, 647, 671, 647, 671, + 606, 606, 606, 679, 606, 606, 606, 606, + 606, 606, 606, 606, 606, 606, 606, 606, + 606, 606, 606, 606, 606, 606, 606, 606, + 606, 606, 671, 671, 671, 671, 606, 671, + 606, 606, 606, 606, 606, 606, 606, 606, + 606, 606, 606, 606, 606, 606, 606, 606, + 606, 606, 606, 606, 606, 606, 606, 606, + 606, 606, 671, 671, 671, 671, 671, 606, + 671, 671, 671, 671, 671, 671, 671, 671, + 671, 671, 671, 671, 671, 671, 671, 671, + 671, 671, 671, 671, 671, 671, 671, 671, + 671, 671, 671, 671, 671, 671, 671, 671, + 671, 647, 671, 671, 671, 671, 671, 671, + 671, 671, 671, 671, 671, 671, 671, 671, + 606, 606, 606, 606, 606, 606, 606, 606, + 606, 606, 671, 671, 671, 647, 671, 647, + 671, 606, 606, 606, 606, 606, 606, 606, + 606, 680, 606, 606, 606, 606, 606, 606, + 606, 606, 606, 606, 606, 606, 606, 606, + 606, 606, 606, 671, 671, 671, 671, 606, + 671, 606, 606, 606, 606, 606, 606, 606, + 606, 606, 606, 606, 606, 606, 606, 606, + 606, 606, 606, 606, 606, 606, 606, 606, + 606, 606, 606, 671, 671, 671, 671, 671, + 606, 671, 671, 671, 671, 671, 671, 671, + 671, 671, 671, 671, 671, 671, 671, 671, + 671, 671, 671, 671, 671, 671, 671, 671, + 671, 671, 671, 671, 671, 671, 671, 671, + 671, 671, 647, 671, 671, 671, 671, 671, + 671, 671, 671, 671, 671, 671, 671, 671, + 671, 606, 606, 606, 606, 606, 606, 606, + 606, 606, 606, 671, 671, 671, 647, 671, + 647, 671, 606, 606, 606, 606, 606, 606, + 606, 606, 606, 606, 606, 606, 606, 681, + 606, 606, 606, 606, 606, 606, 606, 606, + 606, 606, 606, 606, 671, 671, 671, 671, + 606, 671, 606, 606, 606, 606, 606, 606, + 606, 606, 606, 606, 606, 606, 606, 606, + 606, 606, 606, 606, 606, 606, 606, 606, + 606, 606, 606, 606, 671, 671, 671, 671, + 671, 606, 671, 671, 671, 671, 671, 671, + 671, 671, 671, 671, 671, 671, 671, 671, + 671, 671, 671, 671, 671, 671, 671, 671, + 671, 671, 671, 671, 671, 671, 671, 671, + 671, 671, 671, 647, 671, 671, 671, 671, + 671, 671, 671, 671, 671, 671, 671, 671, + 671, 671, 606, 606, 606, 606, 606, 606, + 606, 606, 606, 606, 671, 671, 671, 647, + 671, 647, 671, 606, 606, 606, 606, 606, + 606, 682, 606, 606, 606, 606, 606, 606, + 606, 606, 606, 606, 606, 606, 606, 606, + 606, 606, 606, 606, 606, 671, 671, 671, + 671, 606, 671, 606, 606, 606, 606, 606, + 606, 606, 606, 606, 606, 606, 606, 606, + 606, 606, 606, 606, 606, 606, 606, 606, + 606, 606, 606, 606, 606, 671, 671, 671, + 671, 671, 606, 671, 671, 671, 671, 671, + 671, 671, 671, 671, 671, 671, 671, 671, + 671, 671, 671, 671, 671, 671, 671, 671, + 671, 671, 671, 671, 671, 671, 671, 671, + 671, 671, 671, 671, 647, 671, 671, 671, + 671, 671, 671, 671, 671, 671, 671, 671, + 671, 671, 671, 606, 606, 606, 606, 606, + 606, 606, 606, 606, 606, 671, 671, 671, + 647, 671, 647, 671, 606, 606, 606, 606, + 606, 606, 606, 606, 606, 606, 606, 606, + 606, 606, 606, 606, 606, 606, 606, 606, + 606, 606, 606, 606, 606, 606, 671, 671, + 671, 671, 683, 671, 606, 606, 606, 606, + 606, 606, 606, 606, 606, 606, 606, 606, + 606, 606, 606, 606, 606, 606, 606, 606, + 606, 606, 606, 606, 606, 606, 671, 671, + 671, 671, 671, 606, 671, 671, 671, 671, + 671, 671, 671, 671, 671, 671, 671, 671, + 671, 671, 671, 671, 671, 671, 671, 671, + 671, 671, 671, 671, 671, 671, 671, 671, + 671, 671, 671, 671, 671, 647, 671, 671, + 671, 671, 671, 671, 671, 671, 671, 671, + 671, 671, 671, 671, 606, 606, 606, 606, + 606, 606, 606, 606, 606, 606, 671, 671, + 671, 647, 671, 647, 671, 606, 606, 606, + 606, 606, 606, 606, 606, 606, 606, 606, + 606, 606, 606, 606, 606, 606, 606, 606, + 606, 606, 606, 606, 606, 606, 606, 671, + 671, 671, 671, 684, 671, 606, 606, 606, + 606, 606, 606, 606, 606, 606, 606, 606, + 606, 606, 606, 606, 606, 606, 606, 606, + 606, 606, 606, 606, 606, 606, 606, 671, + 671, 671, 671, 671, 606, 671, 671, 671, + 671, 671, 671, 671, 671, 671, 671, 671, + 671, 671, 671, 671, 671, 671, 671, 671, + 671, 671, 671, 671, 671, 671, 671, 671, + 671, 671, 671, 671, 671, 671, 647, 671, + 671, 671, 671, 671, 671, 671, 671, 671, + 671, 671, 671, 671, 671, 606, 606, 606, + 606, 606, 606, 606, 606, 606, 606, 671, + 671, 671, 647, 671, 647, 671, 606, 606, + 606, 606, 606, 606, 606, 606, 685, 606, + 606, 606, 606, 606, 606, 606, 606, 606, + 606, 606, 606, 606, 606, 606, 606, 606, + 671, 671, 671, 671, 606, 671, 606, 606, + 606, 606, 606, 606, 606, 606, 606, 606, + 606, 606, 606, 606, 606, 606, 606, 606, + 606, 606, 606, 606, 606, 606, 606, 606, + 671, 671, 671, 671, 671, 606, 671, 671, + 671, 671, 671, 671, 671, 671, 671, 671, + 671, 671, 671, 671, 671, 671, 671, 671, + 671, 671, 671, 671, 671, 671, 671, 671, + 671, 671, 671, 671, 671, 671, 671, 647, + 671, 671, 671, 671, 671, 671, 671, 671, + 671, 671, 671, 671, 671, 671, 606, 606, + 606, 606, 606, 606, 606, 606, 606, 606, + 671, 671, 671, 647, 671, 647, 671, 606, + 606, 606, 606, 606, 606, 606, 606, 606, + 606, 606, 686, 606, 606, 606, 606, 606, + 606, 606, 606, 606, 606, 606, 606, 606, + 606, 671, 671, 671, 671, 606, 671, 606, + 606, 606, 606, 606, 606, 606, 606, 606, + 606, 606, 606, 606, 606, 606, 606, 606, + 606, 606, 606, 606, 606, 606, 606, 606, + 606, 671, 671, 671, 671, 671, 606, 671, + 671, 671, 671, 671, 671, 671, 671, 671, + 671, 671, 671, 671, 671, 671, 671, 671, + 671, 671, 671, 671, 671, 671, 671, 671, + 671, 671, 671, 671, 671, 671, 671, 671, + 647, 671, 671, 671, 671, 671, 671, 671, + 671, 671, 671, 671, 671, 671, 671, 606, + 606, 606, 606, 606, 606, 606, 606, 606, + 606, 671, 671, 671, 647, 671, 647, 671, + 606, 606, 606, 606, 682, 606, 606, 606, + 606, 606, 606, 606, 606, 606, 606, 606, + 606, 606, 606, 606, 606, 606, 606, 606, + 606, 606, 671, 671, 671, 671, 606, 671, + 606, 606, 606, 606, 606, 606, 606, 606, + 606, 606, 606, 606, 606, 606, 606, 606, + 606, 606, 606, 606, 606, 606, 606, 606, + 606, 606, 671, 671, 671, 671, 671, 606, + 671, 671, 671, 671, 671, 671, 671, 671, + 671, 671, 671, 671, 671, 671, 671, 671, + 671, 671, 671, 671, 671, 671, 671, 671, + 671, 671, 671, 671, 671, 671, 671, 671, + 671, 647, 671, 671, 671, 671, 671, 671, + 671, 671, 671, 671, 671, 671, 671, 671, + 606, 606, 606, 606, 606, 606, 606, 606, + 606, 606, 671, 671, 671, 647, 671, 647, + 671, 606, 606, 606, 606, 606, 606, 606, + 606, 687, 606, 606, 606, 606, 606, 606, + 606, 606, 606, 606, 606, 606, 606, 606, + 606, 606, 606, 671, 671, 671, 671, 606, + 671, 606, 606, 606, 606, 606, 606, 606, + 606, 606, 606, 606, 606, 606, 606, 606, + 606, 606, 606, 606, 606, 606, 606, 606, + 606, 606, 606, 671, 671, 671, 671, 671, + 606, 671, 671, 671, 671, 671, 671, 671, + 671, 671, 671, 671, 671, 671, 671, 671, + 671, 671, 671, 671, 671, 671, 671, 671, + 671, 671, 671, 671, 671, 671, 671, 671, + 671, 671, 647, 671, 671, 671, 671, 671, + 671, 671, 671, 671, 671, 671, 671, 671, + 671, 606, 606, 606, 606, 606, 606, 606, + 606, 606, 606, 671, 671, 671, 647, 671, + 647, 671, 606, 606, 606, 606, 606, 606, + 606, 606, 606, 606, 606, 606, 606, 686, + 606, 606, 606, 606, 606, 606, 606, 606, + 606, 606, 606, 606, 671, 671, 671, 671, + 606, 671, 606, 606, 606, 606, 606, 606, + 606, 606, 606, 606, 606, 606, 606, 606, + 606, 606, 606, 606, 606, 606, 606, 606, + 606, 606, 606, 606, 671, 671, 671, 671, + 671, 606, 671, 671, 671, 671, 671, 671, + 671, 671, 671, 671, 671, 671, 671, 671, + 671, 671, 671, 671, 671, 671, 671, 671, + 671, 671, 671, 671, 671, 671, 671, 671, + 671, 671, 671, 647, 671, 671, 671, 671, + 671, 671, 671, 671, 671, 671, 671, 671, + 671, 671, 606, 606, 606, 606, 606, 606, + 606, 606, 606, 606, 671, 671, 671, 647, + 671, 647, 671, 606, 606, 606, 606, 606, + 606, 606, 606, 606, 606, 606, 606, 606, + 606, 606, 606, 606, 606, 606, 606, 606, + 606, 606, 606, 606, 606, 671, 671, 671, + 671, 606, 671, 606, 606, 606, 606, 606, + 606, 606, 606, 606, 606, 606, 688, 606, + 689, 606, 606, 606, 606, 606, 606, 606, + 606, 606, 606, 606, 606, 671, 671, 671, + 671, 671, 606, 671, 671, 671, 671, 671, + 671, 671, 671, 671, 671, 671, 671, 671, + 671, 671, 671, 671, 671, 671, 671, 671, + 671, 671, 671, 671, 671, 671, 671, 671, + 671, 671, 671, 671, 647, 671, 671, 671, + 671, 671, 671, 671, 671, 671, 671, 671, + 671, 671, 671, 606, 606, 606, 606, 606, + 606, 606, 606, 606, 606, 671, 671, 671, + 647, 671, 647, 671, 606, 606, 606, 606, + 606, 606, 606, 606, 606, 606, 606, 606, + 606, 606, 606, 606, 606, 606, 606, 606, + 606, 606, 606, 606, 606, 606, 671, 671, + 671, 671, 606, 671, 606, 606, 606, 606, + 606, 606, 606, 606, 690, 606, 606, 606, + 606, 606, 606, 606, 606, 606, 606, 606, + 606, 606, 606, 606, 606, 606, 671, 671, + 671, 671, 671, 606, 671, 671, 671, 671, + 671, 671, 671, 671, 671, 671, 671, 671, + 671, 671, 671, 671, 671, 671, 671, 671, + 671, 671, 671, 671, 671, 671, 671, 671, + 671, 671, 671, 671, 671, 647, 671, 671, + 671, 671, 671, 671, 671, 671, 671, 671, + 671, 671, 671, 671, 606, 606, 606, 606, + 606, 606, 606, 606, 606, 606, 671, 671, + 671, 647, 671, 647, 671, 606, 606, 606, + 606, 606, 606, 606, 606, 606, 606, 606, + 606, 606, 606, 606, 606, 606, 606, 606, + 606, 606, 606, 606, 606, 606, 606, 671, + 671, 671, 671, 606, 671, 691, 606, 606, + 606, 606, 606, 606, 606, 606, 606, 606, + 606, 606, 606, 606, 606, 606, 606, 606, + 606, 606, 606, 606, 606, 606, 606, 671, + 671, 671, 671, 671, 606, 671, 671, 671, + 671, 671, 671, 671, 671, 671, 671, 671, + 671, 671, 671, 671, 671, 671, 671, 671, + 671, 671, 671, 671, 671, 671, 671, 671, + 671, 671, 671, 671, 671, 671, 647, 671, + 671, 671, 671, 671, 671, 671, 671, 671, + 671, 671, 671, 671, 671, 606, 606, 606, + 606, 606, 606, 606, 606, 606, 606, 671, + 671, 671, 647, 671, 647, 671, 606, 606, + 606, 606, 606, 606, 606, 606, 606, 606, + 606, 606, 606, 606, 606, 606, 606, 606, + 606, 606, 606, 606, 606, 606, 606, 606, + 671, 671, 671, 671, 606, 671, 606, 606, + 606, 606, 606, 606, 606, 606, 606, 606, + 606, 606, 606, 606, 606, 606, 606, 606, + 684, 606, 606, 606, 606, 606, 606, 606, + 671, 671, 671, 671, 671, 606, 671, 671, + 671, 671, 671, 671, 671, 671, 671, 671, + 671, 671, 671, 671, 671, 671, 671, 671, + 671, 671, 671, 671, 671, 671, 671, 671, + 671, 671, 671, 671, 671, 671, 671, 647, + 671, 671, 671, 671, 671, 671, 671, 671, + 671, 671, 671, 671, 671, 671, 606, 606, + 606, 606, 606, 606, 606, 606, 606, 606, + 671, 671, 671, 647, 671, 647, 671, 606, + 606, 606, 606, 606, 606, 606, 606, 606, + 606, 606, 606, 606, 606, 606, 606, 606, + 606, 606, 606, 606, 606, 606, 606, 606, + 606, 671, 671, 671, 671, 606, 671, 606, + 606, 606, 684, 606, 606, 606, 606, 606, + 606, 606, 606, 606, 606, 606, 606, 606, + 606, 606, 606, 606, 606, 606, 606, 606, + 606, 671, 671, 671, 671, 671, 606, 671, + 671, 671, 671, 671, 671, 671, 671, 671, + 671, 671, 671, 671, 671, 671, 671, 671, + 671, 671, 671, 671, 671, 671, 671, 671, + 671, 671, 671, 671, 671, 671, 671, 671, + 647, 671, 671, 671, 671, 671, 671, 671, + 671, 671, 671, 671, 671, 671, 671, 606, + 606, 606, 606, 606, 606, 606, 606, 606, + 606, 671, 671, 671, 647, 671, 647, 671, + 606, 606, 606, 606, 606, 606, 606, 606, + 606, 606, 606, 606, 606, 606, 606, 606, + 606, 606, 606, 606, 606, 606, 606, 606, + 606, 606, 671, 671, 671, 671, 606, 671, + 606, 606, 606, 606, 692, 606, 606, 606, + 606, 606, 606, 606, 606, 606, 606, 606, + 606, 693, 606, 606, 606, 606, 606, 606, + 606, 606, 671, 671, 671, 671, 671, 606, + 671, 671, 671, 671, 671, 671, 671, 671, + 671, 671, 671, 671, 671, 671, 671, 671, + 671, 671, 671, 671, 671, 671, 671, 671, + 671, 671, 671, 671, 671, 671, 671, 671, + 671, 647, 671, 671, 671, 671, 671, 671, + 671, 671, 671, 671, 671, 671, 671, 671, + 606, 606, 606, 606, 606, 606, 606, 606, + 606, 606, 671, 671, 671, 647, 671, 647, + 671, 606, 606, 606, 606, 606, 606, 606, + 606, 606, 606, 606, 606, 606, 606, 606, + 606, 606, 606, 606, 606, 606, 606, 606, + 606, 606, 606, 671, 671, 671, 671, 606, + 671, 606, 606, 606, 606, 606, 606, 694, + 606, 606, 606, 606, 606, 606, 606, 606, + 606, 606, 606, 606, 606, 606, 606, 606, + 606, 606, 606, 671, 671, 671, 671, 671, + 606, 671, 671, 671, 671, 671, 671, 671, + 671, 671, 671, 671, 671, 671, 671, 671, + 671, 671, 671, 671, 671, 671, 671, 671, + 671, 671, 671, 671, 671, 671, 671, 671, + 671, 671, 647, 671, 671, 671, 671, 671, + 671, 671, 671, 671, 671, 671, 671, 671, + 671, 606, 606, 606, 606, 606, 606, 606, + 606, 606, 606, 671, 671, 671, 647, 671, + 647, 671, 606, 606, 606, 606, 606, 606, + 606, 606, 606, 606, 606, 606, 606, 606, + 606, 606, 606, 606, 606, 606, 606, 606, + 606, 606, 606, 606, 671, 671, 671, 671, + 606, 671, 606, 606, 606, 606, 606, 606, + 606, 606, 695, 606, 606, 606, 606, 606, + 606, 606, 606, 606, 606, 606, 606, 606, + 606, 606, 606, 606, 671, 671, 671, 671, + 671, 606, 671, 671, 671, 671, 671, 671, + 671, 671, 671, 671, 671, 671, 671, 671, + 671, 671, 671, 671, 671, 671, 671, 671, + 671, 671, 671, 671, 671, 671, 671, 671, + 671, 671, 671, 647, 671, 671, 671, 671, + 671, 671, 671, 671, 671, 671, 671, 671, + 671, 671, 606, 606, 606, 606, 606, 606, + 606, 606, 606, 606, 671, 671, 671, 647, + 671, 647, 671, 606, 606, 606, 606, 606, + 606, 606, 606, 606, 606, 606, 606, 606, + 606, 606, 606, 606, 606, 606, 606, 606, + 606, 606, 606, 606, 606, 671, 671, 671, + 671, 606, 671, 606, 606, 606, 606, 606, + 606, 606, 606, 606, 606, 606, 606, 606, + 684, 606, 606, 606, 606, 606, 606, 606, + 606, 606, 606, 606, 606, 671, 671, 671, + 671, 671, 606, 671, 671, 671, 671, 671, + 671, 671, 671, 671, 671, 671, 671, 671, + 671, 671, 671, 671, 671, 671, 671, 671, + 671, 671, 671, 671, 671, 671, 671, 671, + 671, 671, 671, 671, 647, 671, 671, 671, + 671, 671, 671, 671, 671, 671, 671, 671, + 671, 671, 671, 606, 606, 606, 606, 606, + 606, 606, 606, 606, 606, 671, 671, 671, + 647, 671, 647, 671, 606, 606, 606, 606, + 606, 606, 606, 606, 606, 606, 606, 606, + 606, 606, 606, 606, 606, 606, 606, 606, + 606, 606, 606, 606, 606, 606, 671, 671, + 671, 671, 606, 671, 606, 606, 606, 606, + 696, 606, 606, 606, 606, 606, 606, 606, + 606, 606, 606, 606, 606, 606, 606, 606, + 606, 606, 606, 606, 606, 606, 671, 671, + 671, 671, 671, 606, 671, 671, 671, 671, + 671, 671, 671, 671, 671, 671, 671, 671, + 671, 671, 671, 671, 671, 671, 671, 671, + 671, 671, 671, 671, 671, 671, 671, 671, + 671, 671, 671, 671, 671, 647, 671, 671, + 671, 671, 671, 671, 671, 671, 671, 671, + 671, 671, 671, 671, 606, 606, 606, 606, + 606, 606, 606, 606, 606, 606, 671, 671, + 671, 647, 671, 647, 671, 606, 606, 606, + 606, 606, 606, 606, 606, 606, 606, 606, + 606, 606, 606, 606, 606, 606, 606, 606, + 606, 606, 606, 606, 606, 606, 606, 671, + 671, 671, 671, 606, 671, 697, 606, 606, + 606, 606, 606, 606, 606, 606, 606, 606, + 606, 606, 606, 606, 606, 606, 606, 606, + 606, 606, 606, 606, 606, 606, 606, 671, + 671, 671, 671, 671, 606, 671, 671, 671, + 671, 671, 671, 671, 671, 671, 671, 671, + 671, 671, 671, 671, 671, 671, 671, 671, + 671, 671, 671, 671, 671, 671, 671, 671, + 671, 671, 671, 671, 671, 671, 647, 671, + 671, 671, 671, 671, 671, 671, 671, 671, + 671, 671, 671, 671, 671, 606, 606, 606, + 606, 606, 606, 606, 606, 606, 606, 671, + 671, 671, 647, 671, 647, 671, 606, 606, + 606, 606, 606, 606, 606, 606, 606, 606, + 606, 606, 606, 606, 606, 606, 606, 606, + 606, 606, 606, 606, 606, 606, 606, 606, + 671, 671, 671, 671, 606, 671, 606, 606, + 606, 606, 606, 606, 606, 606, 606, 606, + 684, 606, 606, 606, 606, 606, 606, 606, + 606, 606, 606, 606, 606, 606, 606, 606, + 671, 671, 671, 671, 671, 606, 671, 671, + 671, 671, 671, 671, 671, 671, 671, 671, + 671, 671, 671, 671, 671, 671, 671, 671, + 671, 671, 671, 671, 671, 671, 671, 671, + 671, 671, 671, 671, 671, 671, 671, 647, + 671, 671, 671, 671, 671, 671, 671, 671, + 671, 671, 671, 671, 671, 671, 606, 606, + 606, 606, 606, 606, 606, 606, 606, 606, + 671, 671, 671, 647, 671, 647, 671, 606, + 606, 606, 606, 606, 606, 606, 606, 606, + 606, 606, 606, 606, 606, 606, 606, 606, + 606, 606, 606, 606, 606, 606, 606, 606, + 606, 671, 671, 671, 671, 606, 671, 698, + 606, 606, 606, 606, 606, 606, 606, 606, + 606, 606, 699, 606, 606, 606, 606, 606, + 606, 606, 606, 606, 606, 606, 606, 606, + 606, 671, 671, 671, 671, 671, 606, 671, + 671, 671, 671, 671, 671, 671, 671, 671, + 671, 671, 671, 671, 671, 671, 671, 671, + 671, 671, 671, 671, 671, 671, 671, 671, + 671, 671, 671, 671, 671, 671, 671, 671, + 647, 671, 671, 671, 671, 671, 671, 671, + 671, 671, 671, 671, 671, 671, 671, 606, + 606, 606, 606, 606, 606, 606, 606, 606, + 606, 671, 671, 671, 647, 671, 647, 671, + 606, 606, 606, 606, 606, 606, 606, 606, + 606, 606, 606, 606, 606, 606, 606, 606, + 606, 606, 606, 606, 606, 606, 606, 606, + 606, 606, 671, 671, 671, 671, 606, 671, + 606, 606, 606, 606, 606, 606, 606, 606, + 606, 606, 606, 606, 606, 606, 606, 606, + 606, 606, 700, 606, 606, 606, 606, 606, + 606, 606, 671, 671, 671, 671, 671, 606, + 671, 671, 671, 671, 671, 671, 671, 671, + 671, 671, 671, 671, 671, 671, 671, 671, + 671, 671, 671, 671, 671, 671, 671, 671, + 671, 671, 671, 671, 671, 671, 671, 671, + 671, 647, 671, 671, 671, 671, 671, 671, + 671, 671, 671, 671, 671, 671, 671, 671, + 606, 606, 606, 606, 606, 606, 606, 606, + 606, 606, 671, 671, 671, 647, 671, 647, + 671, 606, 606, 606, 606, 606, 606, 606, + 606, 606, 606, 606, 606, 606, 606, 606, + 606, 606, 606, 606, 606, 606, 606, 606, + 606, 606, 606, 671, 671, 671, 671, 606, + 671, 606, 606, 606, 606, 684, 606, 606, + 606, 606, 606, 606, 606, 606, 606, 606, + 606, 606, 606, 606, 606, 606, 606, 606, + 606, 606, 606, 671, 671, 671, 671, 671, + 606, 671, 671, 671, 671, 671, 671, 671, + 671, 671, 671, 671, 671, 671, 671, 671, + 671, 671, 671, 671, 671, 671, 671, 671, + 671, 671, 671, 671, 671, 671, 671, 671, + 671, 671, 647, 671, 671, 671, 671, 671, + 671, 671, 671, 671, 671, 671, 671, 671, + 671, 606, 606, 606, 606, 606, 606, 606, + 606, 606, 606, 671, 671, 671, 647, 671, + 647, 671, 606, 606, 606, 606, 606, 606, + 606, 606, 606, 606, 606, 606, 606, 606, + 606, 606, 606, 606, 606, 606, 606, 606, + 606, 606, 606, 606, 671, 671, 671, 671, + 606, 671, 701, 606, 606, 606, 606, 606, + 606, 606, 606, 606, 606, 606, 606, 606, + 606, 606, 606, 606, 606, 606, 606, 606, + 606, 606, 606, 606, 671, 671, 671, 671, + 671, 606, 671, 671, 671, 671, 671, 671, + 671, 671, 671, 671, 671, 671, 671, 671, + 671, 671, 671, 671, 671, 671, 671, 671, + 671, 671, 671, 671, 671, 671, 671, 671, + 671, 671, 671, 647, 671, 671, 671, 671, + 671, 671, 671, 671, 671, 671, 671, 671, + 671, 671, 606, 606, 606, 606, 606, 606, + 606, 606, 606, 606, 671, 671, 671, 647, + 671, 647, 671, 606, 606, 606, 606, 606, + 606, 606, 606, 606, 606, 606, 606, 606, + 606, 606, 606, 606, 606, 606, 606, 606, + 606, 606, 606, 606, 606, 671, 671, 671, + 671, 606, 671, 606, 606, 606, 606, 606, + 606, 606, 606, 606, 606, 606, 606, 606, + 606, 606, 606, 606, 606, 691, 606, 606, + 606, 606, 606, 606, 606, 671, 671, 671, + 671, 671, 606, 671, 671, 671, 671, 671, + 671, 671, 671, 671, 671, 671, 671, 671, + 671, 671, 671, 671, 671, 671, 671, 671, + 671, 671, 671, 671, 671, 671, 671, 671, + 671, 671, 671, 671, 647, 671, 671, 671, + 671, 671, 671, 671, 671, 671, 671, 671, + 671, 671, 671, 606, 606, 606, 606, 606, + 606, 606, 606, 606, 606, 671, 671, 671, + 647, 671, 647, 671, 606, 606, 606, 606, + 606, 606, 606, 606, 606, 606, 606, 606, + 606, 606, 606, 606, 606, 606, 606, 606, + 606, 606, 606, 606, 606, 606, 671, 671, + 671, 671, 606, 671, 606, 606, 606, 606, + 702, 606, 606, 606, 606, 606, 606, 606, + 606, 606, 684, 606, 606, 606, 606, 606, + 606, 606, 606, 606, 606, 606, 671, 671, + 671, 671, 671, 606, 671, 671, 671, 671, + 671, 671, 671, 671, 671, 671, 671, 671, + 671, 671, 671, 671, 671, 671, 671, 671, + 671, 671, 671, 671, 671, 671, 671, 671, + 671, 671, 671, 671, 671, 647, 671, 671, + 671, 671, 671, 671, 671, 671, 671, 671, + 671, 671, 671, 671, 606, 606, 606, 606, + 606, 606, 606, 606, 606, 606, 671, 671, + 671, 647, 671, 647, 671, 606, 606, 606, + 606, 606, 606, 606, 606, 606, 606, 606, + 606, 606, 606, 606, 606, 606, 606, 606, + 606, 606, 606, 606, 606, 606, 606, 671, + 671, 671, 671, 606, 671, 606, 606, 606, + 606, 606, 703, 606, 606, 606, 606, 606, + 606, 606, 606, 606, 606, 606, 606, 606, + 606, 606, 606, 606, 606, 606, 606, 671, + 671, 671, 671, 671, 606, 704, 704, 704, + 704, 704, 704, 704, 704, 704, 704, 704, + 704, 704, 704, 704, 704, 704, 704, 704, + 704, 704, 704, 704, 704, 704, 704, 704, + 704, 704, 704, 704, 704, 704, 647, 704, + 704, 704, 704, 704, 704, 704, 704, 704, + 704, 704, 704, 704, 704, 606, 606, 606, + 606, 606, 606, 606, 606, 606, 606, 704, + 704, 704, 647, 704, 647, 704, 606, 606, + 606, 606, 606, 606, 606, 606, 606, 606, + 606, 606, 606, 606, 606, 606, 606, 606, + 606, 606, 606, 606, 606, 606, 606, 606, + 704, 704, 704, 704, 606, 704, 606, 606, + 606, 606, 606, 606, 606, 606, 705, 606, + 606, 606, 606, 606, 606, 606, 606, 606, + 606, 606, 606, 606, 606, 606, 606, 606, + 704, 704, 704, 704, 704, 606, 671, 671, + 671, 671, 671, 671, 671, 671, 671, 671, + 671, 671, 671, 671, 671, 671, 671, 671, + 671, 671, 671, 671, 671, 671, 671, 671, + 671, 671, 671, 671, 671, 671, 671, 647, + 671, 671, 671, 671, 671, 671, 671, 671, + 671, 671, 671, 671, 671, 671, 606, 606, + 606, 606, 606, 606, 606, 606, 606, 606, + 671, 671, 671, 647, 671, 647, 671, 606, + 606, 606, 606, 606, 606, 606, 606, 606, + 606, 606, 606, 606, 606, 606, 606, 606, + 606, 606, 606, 606, 606, 606, 606, 606, + 606, 671, 671, 671, 671, 606, 671, 606, + 606, 606, 606, 606, 606, 606, 606, 606, + 606, 606, 606, 606, 706, 606, 606, 606, + 606, 606, 606, 606, 606, 606, 606, 606, + 606, 671, 671, 671, 671, 671, 606, 671, + 671, 671, 671, 671, 671, 671, 671, 671, + 671, 671, 671, 671, 671, 671, 671, 671, + 671, 671, 671, 671, 671, 671, 671, 671, + 671, 671, 671, 671, 671, 671, 671, 671, + 647, 671, 671, 671, 671, 671, 671, 671, + 671, 671, 671, 671, 671, 671, 671, 606, + 606, 606, 606, 606, 606, 606, 606, 606, + 606, 671, 671, 671, 647, 671, 647, 671, + 606, 606, 606, 606, 606, 606, 606, 606, + 606, 606, 606, 606, 606, 606, 606, 606, + 606, 606, 606, 606, 606, 606, 606, 606, + 606, 606, 671, 671, 671, 671, 606, 671, + 606, 606, 606, 606, 707, 606, 606, 606, + 606, 606, 606, 606, 606, 606, 606, 606, + 606, 606, 606, 606, 606, 606, 606, 606, + 606, 606, 671, 671, 671, 671, 671, 606, + 671, 671, 671, 671, 671, 671, 671, 671, + 671, 671, 671, 671, 671, 671, 671, 671, + 671, 671, 671, 671, 671, 671, 671, 671, + 671, 671, 671, 671, 671, 671, 671, 671, + 671, 647, 671, 671, 671, 671, 671, 671, + 671, 671, 671, 671, 671, 671, 671, 671, + 606, 606, 606, 606, 606, 606, 606, 606, + 606, 606, 671, 671, 671, 647, 671, 647, + 671, 606, 606, 606, 606, 606, 606, 606, + 606, 606, 606, 606, 606, 606, 606, 606, + 606, 606, 606, 606, 606, 606, 606, 606, + 606, 606, 606, 671, 671, 671, 671, 606, + 671, 606, 606, 606, 708, 606, 606, 606, + 606, 606, 606, 606, 606, 606, 606, 606, + 606, 606, 606, 606, 606, 606, 606, 606, + 606, 606, 606, 671, 671, 671, 671, 671, + 606, 671, 671, 671, 671, 671, 671, 671, + 671, 671, 671, 671, 671, 671, 671, 671, + 671, 671, 671, 671, 671, 671, 671, 671, + 671, 671, 671, 671, 671, 671, 671, 671, + 671, 671, 647, 671, 671, 671, 671, 671, + 671, 671, 671, 671, 671, 671, 671, 671, + 671, 606, 606, 606, 606, 606, 606, 606, + 606, 606, 606, 671, 671, 671, 647, 671, + 709, 671, 606, 606, 606, 606, 606, 606, + 606, 606, 606, 606, 606, 606, 606, 606, + 606, 606, 606, 606, 606, 606, 606, 606, + 606, 606, 606, 606, 671, 671, 671, 671, + 606, 671, 606, 606, 606, 606, 606, 606, + 606, 606, 606, 606, 606, 606, 606, 606, + 606, 606, 606, 606, 606, 606, 606, 606, + 606, 606, 606, 606, 671, 671, 671, 671, + 671, 606, 671, 671, 671, 671, 671, 671, + 671, 671, 671, 671, 671, 671, 671, 671, + 671, 671, 671, 671, 671, 671, 671, 671, + 671, 671, 671, 671, 671, 671, 671, 671, + 671, 671, 671, 647, 671, 671, 671, 671, + 671, 671, 671, 671, 671, 671, 671, 671, + 671, 671, 606, 606, 606, 606, 606, 606, + 606, 606, 606, 606, 671, 671, 671, 647, + 671, 647, 671, 606, 606, 606, 606, 606, + 606, 606, 606, 606, 606, 606, 606, 606, + 606, 606, 606, 606, 606, 606, 606, 606, + 606, 606, 606, 606, 606, 671, 671, 671, + 671, 606, 671, 606, 606, 606, 606, 606, + 606, 606, 606, 606, 606, 606, 710, 606, + 711, 606, 606, 606, 606, 606, 606, 606, + 606, 606, 606, 606, 606, 671, 671, 671, + 671, 671, 606, 671, 671, 671, 671, 671, + 671, 671, 671, 671, 671, 671, 671, 671, + 671, 671, 671, 671, 671, 671, 671, 671, + 671, 671, 671, 671, 671, 671, 671, 671, + 671, 671, 671, 671, 647, 671, 671, 671, + 671, 671, 671, 671, 671, 671, 671, 671, + 671, 671, 671, 606, 606, 606, 606, 606, + 606, 606, 606, 606, 606, 671, 671, 671, + 647, 671, 647, 671, 606, 606, 606, 606, + 606, 606, 606, 606, 606, 606, 606, 606, + 606, 606, 606, 606, 606, 606, 606, 606, + 606, 606, 606, 606, 606, 606, 671, 671, + 671, 671, 606, 671, 606, 606, 606, 606, + 606, 606, 606, 606, 606, 606, 606, 606, + 606, 606, 606, 606, 606, 606, 712, 606, + 606, 606, 606, 606, 606, 606, 671, 671, + 671, 671, 671, 606, 671, 671, 671, 671, + 671, 671, 671, 671, 671, 671, 671, 671, + 671, 671, 671, 671, 671, 671, 671, 671, + 671, 671, 671, 671, 671, 671, 671, 671, + 671, 671, 671, 671, 671, 647, 671, 671, + 671, 671, 671, 671, 671, 671, 671, 671, + 671, 671, 671, 671, 606, 606, 606, 606, + 606, 606, 606, 606, 606, 606, 671, 671, + 671, 647, 671, 647, 671, 606, 606, 606, + 606, 606, 606, 606, 606, 606, 606, 606, + 606, 606, 606, 606, 606, 606, 606, 606, + 606, 606, 606, 606, 606, 606, 606, 671, + 671, 671, 671, 606, 671, 606, 606, 606, + 606, 684, 606, 606, 606, 713, 606, 606, + 606, 606, 606, 606, 606, 606, 606, 606, + 606, 606, 606, 606, 606, 606, 606, 671, + 671, 671, 671, 671, 606, 671, 671, 671, + 671, 671, 671, 671, 671, 671, 671, 671, + 671, 671, 671, 671, 671, 671, 671, 671, + 671, 671, 671, 671, 671, 671, 671, 671, + 671, 671, 671, 671, 671, 671, 647, 671, + 671, 671, 671, 671, 671, 671, 671, 671, + 671, 671, 671, 671, 671, 606, 606, 606, + 606, 606, 606, 606, 606, 606, 606, 671, + 671, 671, 647, 671, 647, 671, 606, 606, + 606, 606, 606, 606, 606, 606, 606, 606, + 606, 606, 606, 606, 606, 606, 606, 606, + 606, 606, 606, 606, 606, 606, 606, 606, + 671, 671, 671, 671, 606, 671, 606, 606, + 606, 606, 606, 684, 606, 606, 606, 606, + 606, 606, 606, 606, 606, 606, 606, 606, + 606, 606, 606, 606, 606, 606, 606, 606, + 671, 671, 671, 671, 671, 606, 671, 671, + 671, 671, 671, 671, 671, 671, 671, 671, + 671, 671, 671, 671, 671, 671, 671, 671, + 671, 671, 671, 671, 671, 671, 671, 671, + 671, 671, 671, 671, 671, 671, 671, 647, + 671, 671, 671, 671, 671, 671, 671, 671, + 671, 671, 671, 671, 671, 671, 606, 606, + 606, 606, 606, 606, 606, 606, 606, 606, + 671, 671, 671, 647, 671, 647, 671, 606, + 606, 606, 606, 606, 606, 606, 606, 606, + 606, 606, 606, 606, 606, 606, 606, 606, + 606, 606, 606, 606, 606, 606, 606, 606, + 606, 671, 671, 671, 671, 606, 671, 606, + 606, 606, 684, 606, 606, 606, 606, 606, + 606, 606, 606, 606, 606, 606, 606, 606, + 606, 714, 606, 606, 606, 606, 606, 606, + 606, 671, 671, 671, 671, 671, 606, 671, + 671, 671, 671, 671, 671, 671, 671, 671, + 671, 671, 671, 671, 671, 671, 671, 671, + 671, 671, 671, 671, 671, 671, 671, 671, + 671, 671, 671, 671, 671, 671, 671, 671, + 647, 671, 671, 671, 671, 671, 671, 671, + 671, 671, 671, 671, 671, 671, 671, 606, + 606, 606, 606, 606, 606, 606, 606, 606, + 606, 671, 671, 671, 647, 671, 647, 671, + 606, 606, 606, 606, 606, 606, 606, 606, + 606, 606, 606, 606, 606, 606, 606, 606, + 606, 606, 606, 606, 606, 606, 606, 606, + 606, 606, 671, 671, 671, 671, 606, 671, + 606, 606, 606, 606, 606, 606, 606, 606, + 606, 606, 606, 606, 606, 606, 606, 606, + 606, 606, 606, 606, 715, 606, 606, 606, + 606, 606, 671, 671, 671, 671, 671, 606, + 671, 671, 671, 671, 671, 671, 671, 671, + 671, 671, 671, 671, 671, 671, 671, 671, + 671, 671, 671, 671, 671, 671, 671, 671, + 671, 671, 671, 671, 671, 671, 671, 671, + 671, 647, 671, 671, 671, 671, 671, 671, + 671, 671, 671, 671, 671, 671, 671, 671, + 606, 606, 606, 606, 606, 606, 606, 606, + 606, 606, 671, 671, 671, 647, 671, 647, + 671, 606, 606, 606, 606, 606, 606, 606, + 606, 606, 606, 606, 606, 606, 606, 606, + 606, 606, 606, 606, 606, 606, 606, 606, + 606, 606, 606, 671, 671, 671, 671, 606, + 671, 606, 606, 606, 606, 606, 606, 606, + 606, 606, 606, 606, 606, 606, 606, 606, + 606, 606, 700, 606, 606, 606, 606, 606, + 606, 606, 606, 671, 671, 671, 671, 671, + 606, 671, 671, 671, 671, 671, 671, 671, + 671, 671, 671, 671, 671, 671, 671, 671, + 671, 671, 671, 671, 671, 671, 671, 671, + 671, 671, 671, 671, 671, 671, 671, 671, + 671, 671, 647, 671, 671, 671, 671, 671, + 671, 671, 671, 671, 671, 671, 671, 671, + 671, 606, 606, 606, 606, 606, 606, 606, + 606, 606, 606, 671, 671, 671, 647, 671, + 647, 671, 606, 606, 606, 606, 606, 606, + 606, 606, 606, 606, 606, 606, 606, 606, + 606, 606, 606, 606, 606, 606, 606, 606, + 606, 606, 606, 606, 671, 671, 671, 671, + 606, 671, 716, 606, 606, 606, 606, 606, + 606, 606, 606, 606, 606, 606, 606, 606, + 638, 606, 606, 606, 606, 606, 606, 606, + 606, 606, 606, 606, 671, 671, 671, 671, + 671, 606, 671, 671, 671, 671, 671, 671, + 671, 671, 671, 671, 671, 671, 671, 671, + 671, 671, 671, 671, 671, 671, 671, 671, + 671, 671, 671, 671, 671, 671, 671, 671, + 671, 671, 671, 647, 671, 671, 671, 671, + 671, 671, 671, 671, 671, 671, 671, 671, + 671, 671, 606, 606, 606, 606, 606, 606, + 606, 606, 606, 606, 671, 671, 671, 647, + 671, 647, 671, 606, 606, 606, 606, 606, + 606, 606, 606, 606, 606, 606, 606, 606, + 606, 606, 606, 606, 606, 606, 606, 606, + 606, 606, 606, 606, 606, 671, 671, 671, + 671, 606, 671, 606, 606, 606, 606, 606, + 606, 606, 606, 606, 606, 606, 698, 606, + 606, 606, 606, 606, 606, 606, 606, 606, + 606, 606, 606, 606, 606, 671, 671, 671, + 671, 671, 606, 671, 671, 671, 671, 671, + 671, 671, 671, 671, 671, 671, 671, 671, + 671, 671, 671, 671, 671, 671, 671, 671, + 671, 671, 671, 671, 671, 671, 671, 671, + 671, 671, 671, 671, 647, 671, 671, 671, + 671, 671, 671, 671, 671, 671, 671, 671, + 671, 671, 671, 606, 606, 606, 606, 606, + 606, 606, 606, 606, 606, 671, 671, 671, + 647, 671, 647, 671, 606, 606, 606, 606, + 606, 606, 606, 606, 606, 606, 606, 606, + 606, 606, 606, 606, 606, 606, 606, 606, + 606, 606, 606, 606, 606, 606, 671, 671, + 671, 671, 606, 671, 606, 606, 606, 606, + 606, 606, 606, 606, 606, 606, 606, 606, + 606, 606, 606, 606, 606, 684, 606, 606, + 606, 606, 606, 606, 606, 606, 671, 671, + 671, 671, 671, 606, 671, 671, 671, 671, + 671, 671, 671, 671, 671, 671, 671, 671, + 671, 671, 671, 671, 671, 671, 671, 671, + 671, 671, 671, 671, 671, 671, 671, 671, + 671, 671, 671, 671, 671, 647, 671, 671, + 671, 671, 671, 671, 671, 671, 671, 671, + 671, 671, 671, 671, 606, 606, 606, 606, + 606, 606, 606, 606, 606, 606, 671, 671, + 671, 647, 671, 647, 671, 606, 606, 606, + 606, 606, 606, 606, 606, 606, 606, 606, + 606, 606, 606, 606, 606, 606, 606, 606, + 606, 606, 606, 606, 606, 606, 606, 671, + 671, 671, 671, 606, 671, 606, 606, 606, + 606, 606, 684, 606, 606, 606, 606, 606, + 606, 606, 684, 606, 606, 606, 606, 606, + 606, 606, 606, 606, 606, 606, 606, 671, + 671, 671, 671, 671, 606, 671, 671, 671, + 671, 671, 671, 671, 671, 671, 671, 671, + 671, 671, 671, 671, 671, 671, 671, 671, + 671, 671, 671, 671, 671, 671, 671, 671, + 671, 671, 671, 671, 671, 671, 647, 671, + 671, 671, 671, 671, 671, 671, 671, 671, + 671, 671, 671, 671, 671, 606, 606, 606, + 606, 606, 606, 606, 606, 606, 606, 671, + 671, 671, 647, 671, 647, 671, 606, 606, + 606, 606, 606, 606, 606, 606, 606, 606, + 606, 606, 606, 606, 606, 606, 606, 606, + 606, 606, 606, 606, 606, 606, 606, 606, + 671, 671, 671, 671, 606, 671, 606, 606, + 606, 606, 606, 606, 606, 606, 606, 606, + 606, 606, 606, 606, 717, 606, 606, 606, + 606, 606, 606, 606, 606, 606, 606, 606, + 671, 671, 671, 671, 671, 606, 671, 671, + 671, 671, 671, 671, 671, 671, 671, 671, + 671, 671, 671, 671, 671, 671, 671, 671, + 671, 671, 671, 671, 671, 671, 671, 671, + 671, 671, 671, 671, 671, 671, 671, 647, + 671, 671, 671, 671, 671, 671, 671, 671, + 671, 671, 671, 671, 671, 671, 606, 606, + 606, 606, 606, 606, 606, 606, 606, 606, + 671, 671, 671, 647, 671, 647, 671, 606, + 606, 606, 606, 606, 606, 606, 606, 606, + 606, 606, 606, 606, 606, 606, 606, 606, + 606, 606, 606, 606, 606, 606, 606, 606, + 606, 671, 671, 671, 671, 606, 671, 606, + 606, 606, 718, 606, 606, 606, 606, 606, + 606, 606, 606, 606, 606, 606, 606, 606, + 606, 606, 606, 606, 606, 606, 606, 606, + 606, 671, 671, 671, 671, 671, 606, 671, + 671, 671, 671, 671, 671, 671, 671, 671, + 671, 671, 671, 671, 671, 671, 671, 671, + 671, 671, 671, 671, 671, 671, 671, 671, + 671, 671, 671, 671, 671, 671, 671, 671, + 647, 671, 671, 671, 671, 671, 671, 671, + 671, 671, 671, 671, 671, 671, 671, 606, + 606, 606, 606, 606, 606, 606, 606, 606, + 606, 671, 671, 671, 647, 671, 647, 671, + 606, 606, 606, 606, 606, 606, 606, 606, + 606, 606, 606, 606, 606, 606, 606, 606, + 606, 606, 606, 606, 606, 606, 606, 606, + 606, 606, 671, 671, 671, 671, 606, 671, + 606, 606, 606, 606, 606, 606, 606, 606, + 606, 606, 606, 606, 606, 606, 606, 606, + 606, 606, 606, 606, 719, 606, 606, 606, + 606, 606, 671, 671, 671, 671, 671, 606, + 671, 671, 671, 671, 671, 671, 671, 671, + 671, 671, 671, 671, 671, 671, 671, 671, + 671, 671, 671, 671, 671, 671, 671, 671, + 671, 671, 671, 671, 671, 671, 671, 671, + 671, 647, 671, 671, 671, 671, 671, 671, + 671, 671, 671, 671, 671, 671, 671, 671, + 606, 606, 606, 606, 606, 606, 606, 606, + 606, 606, 671, 671, 671, 647, 671, 647, + 671, 606, 606, 606, 606, 606, 606, 606, + 606, 606, 606, 606, 606, 606, 606, 606, + 606, 606, 606, 606, 606, 606, 606, 606, + 606, 606, 606, 671, 671, 671, 671, 606, + 671, 606, 606, 606, 606, 606, 606, 606, + 606, 606, 606, 606, 700, 606, 606, 606, + 606, 606, 606, 606, 606, 606, 606, 606, + 606, 606, 606, 671, 671, 671, 671, 671, + 606, 671, 671, 671, 671, 671, 671, 671, + 671, 671, 671, 671, 671, 671, 671, 671, + 671, 671, 671, 671, 671, 671, 671, 671, + 671, 671, 671, 671, 671, 671, 671, 671, + 671, 671, 647, 671, 671, 671, 671, 671, + 671, 671, 671, 671, 671, 671, 671, 671, + 671, 606, 606, 606, 606, 606, 606, 606, + 606, 606, 606, 671, 671, 671, 647, 671, + 647, 671, 606, 606, 606, 606, 606, 606, + 606, 606, 606, 606, 606, 606, 606, 606, + 606, 606, 606, 606, 606, 606, 606, 606, + 606, 606, 606, 606, 671, 671, 671, 671, + 606, 671, 606, 606, 606, 606, 720, 606, + 606, 606, 721, 606, 606, 606, 606, 606, + 722, 606, 606, 606, 606, 606, 606, 606, + 606, 606, 606, 606, 671, 671, 671, 671, + 671, 606, 671, 671, 671, 671, 671, 671, + 671, 671, 671, 671, 671, 671, 671, 671, + 671, 671, 671, 671, 671, 671, 671, 671, + 671, 671, 671, 671, 671, 671, 671, 671, + 671, 671, 671, 647, 671, 671, 671, 671, + 671, 671, 671, 671, 671, 671, 671, 671, + 671, 671, 606, 606, 606, 606, 606, 606, + 606, 606, 606, 606, 671, 671, 671, 647, + 671, 647, 671, 606, 606, 606, 606, 606, + 606, 606, 606, 606, 606, 606, 606, 606, + 606, 606, 606, 606, 606, 606, 606, 606, + 606, 606, 606, 606, 606, 671, 671, 671, + 671, 606, 671, 606, 606, 606, 606, 606, + 606, 606, 606, 606, 606, 606, 606, 606, + 606, 606, 606, 606, 606, 606, 606, 606, + 606, 606, 722, 606, 606, 671, 671, 671, + 671, 671, 606, 671, 671, 671, 671, 671, + 671, 671, 671, 671, 671, 671, 671, 671, + 671, 671, 671, 671, 671, 671, 671, 671, + 671, 671, 671, 671, 671, 671, 671, 671, + 671, 671, 671, 671, 647, 671, 671, 671, + 671, 671, 671, 671, 671, 671, 671, 671, + 671, 671, 671, 606, 606, 606, 606, 606, + 606, 606, 606, 606, 606, 671, 671, 671, + 647, 671, 647, 671, 606, 606, 606, 606, + 606, 606, 606, 606, 606, 606, 606, 606, + 606, 606, 606, 606, 606, 606, 606, 606, + 606, 606, 606, 606, 606, 606, 671, 671, + 671, 671, 606, 671, 606, 606, 606, 606, + 606, 606, 606, 606, 606, 606, 606, 606, + 606, 606, 606, 606, 606, 606, 606, 684, + 606, 606, 606, 606, 606, 606, 671, 671, + 671, 671, 671, 606, 671, 671, 671, 671, + 671, 671, 671, 671, 671, 671, 671, 671, + 671, 671, 671, 671, 671, 671, 671, 671, + 671, 671, 671, 671, 671, 671, 671, 671, + 671, 671, 671, 671, 671, 647, 671, 671, + 671, 671, 671, 671, 671, 671, 671, 671, + 671, 671, 671, 671, 606, 606, 606, 606, + 606, 606, 606, 606, 606, 606, 671, 671, + 671, 647, 671, 647, 671, 606, 606, 606, + 606, 606, 606, 606, 606, 606, 606, 606, + 606, 606, 606, 606, 606, 606, 606, 606, + 606, 606, 606, 606, 606, 606, 606, 671, + 671, 671, 671, 606, 671, 606, 606, 606, + 606, 606, 606, 606, 606, 606, 606, 606, + 684, 606, 606, 606, 606, 606, 606, 606, + 606, 606, 606, 606, 606, 606, 606, 671, + 671, 671, 671, 671, 606, 671, 671, 671, + 671, 671, 671, 671, 671, 671, 671, 671, + 671, 671, 671, 671, 671, 671, 671, 671, + 671, 671, 671, 671, 671, 671, 671, 671, + 671, 671, 671, 671, 671, 671, 647, 671, + 671, 671, 671, 671, 671, 671, 671, 671, + 671, 671, 671, 671, 671, 606, 606, 606, + 606, 606, 606, 606, 606, 606, 606, 671, + 671, 671, 647, 671, 647, 671, 606, 606, + 606, 606, 606, 606, 606, 606, 606, 606, + 606, 606, 606, 606, 606, 606, 606, 606, + 606, 606, 606, 606, 606, 606, 606, 606, + 671, 671, 671, 671, 606, 671, 606, 606, + 606, 606, 723, 606, 606, 606, 606, 606, + 606, 606, 606, 606, 606, 606, 606, 606, + 606, 606, 606, 606, 606, 606, 606, 606, + 671, 671, 671, 671, 671, 606, 671, 671, + 671, 671, 671, 671, 671, 671, 671, 671, + 671, 671, 671, 671, 671, 671, 671, 671, + 671, 671, 671, 671, 671, 671, 671, 671, + 671, 671, 671, 671, 671, 671, 671, 647, + 671, 671, 671, 671, 671, 671, 671, 671, + 671, 671, 671, 671, 671, 671, 606, 606, + 606, 606, 606, 606, 606, 606, 606, 606, + 671, 671, 671, 647, 671, 647, 671, 606, + 606, 606, 606, 606, 606, 606, 606, 606, + 606, 606, 606, 606, 606, 606, 606, 606, + 606, 606, 606, 606, 606, 606, 606, 606, + 606, 671, 671, 671, 671, 606, 671, 606, + 606, 606, 724, 606, 606, 606, 606, 606, + 606, 606, 606, 606, 606, 606, 606, 606, + 606, 725, 726, 606, 606, 606, 606, 606, + 606, 671, 671, 671, 671, 671, 606, 671, + 671, 671, 671, 671, 671, 671, 671, 671, + 671, 671, 671, 671, 671, 671, 671, 671, + 671, 671, 671, 671, 671, 671, 671, 671, + 671, 671, 671, 671, 671, 671, 671, 671, + 647, 671, 671, 671, 671, 671, 671, 671, + 671, 671, 671, 671, 671, 671, 671, 606, + 606, 606, 606, 606, 606, 606, 606, 606, + 606, 671, 671, 671, 647, 671, 647, 671, + 606, 606, 606, 606, 606, 606, 606, 606, + 606, 606, 606, 606, 606, 606, 606, 606, + 606, 606, 606, 606, 606, 606, 606, 606, + 606, 606, 671, 671, 671, 671, 606, 671, + 606, 606, 606, 606, 606, 606, 606, 606, + 606, 606, 606, 606, 606, 606, 684, 606, + 606, 606, 606, 606, 606, 606, 606, 606, + 606, 606, 671, 671, 671, 671, 671, 606, + 671, 671, 671, 671, 671, 671, 671, 671, + 671, 671, 671, 671, 671, 671, 671, 671, + 671, 671, 671, 671, 671, 671, 671, 671, + 671, 671, 671, 671, 671, 671, 671, 671, + 671, 647, 671, 671, 671, 671, 671, 671, + 671, 671, 671, 671, 671, 671, 671, 671, + 606, 606, 606, 606, 606, 606, 606, 606, + 606, 606, 671, 671, 671, 647, 671, 647, + 671, 606, 606, 606, 606, 606, 606, 606, + 606, 606, 606, 606, 606, 606, 606, 606, + 606, 606, 606, 606, 606, 606, 606, 606, + 606, 606, 606, 671, 671, 671, 671, 606, + 671, 606, 606, 727, 606, 606, 606, 606, + 606, 606, 606, 606, 606, 606, 606, 606, + 606, 606, 606, 606, 606, 606, 606, 606, + 606, 606, 606, 671, 671, 671, 671, 671, + 606, 671, 671, 671, 671, 671, 671, 671, + 671, 671, 671, 671, 671, 671, 671, 671, + 671, 671, 671, 671, 671, 671, 671, 671, + 671, 671, 671, 671, 671, 671, 671, 671, + 671, 671, 647, 671, 671, 671, 671, 671, + 671, 671, 671, 671, 671, 671, 671, 671, + 671, 606, 606, 606, 606, 606, 606, 606, + 606, 606, 606, 671, 671, 671, 647, 671, + 647, 671, 606, 606, 606, 606, 606, 606, + 606, 606, 606, 606, 606, 606, 606, 606, + 606, 606, 606, 606, 606, 606, 606, 606, + 606, 606, 606, 606, 671, 671, 671, 671, + 606, 671, 606, 606, 606, 606, 606, 606, + 606, 606, 606, 606, 606, 606, 606, 606, + 606, 606, 606, 606, 606, 606, 700, 606, + 606, 606, 606, 606, 671, 671, 671, 671, + 671, 606, 671, 671, 671, 671, 671, 671, + 671, 671, 671, 671, 671, 671, 671, 671, + 671, 671, 671, 671, 671, 671, 671, 671, + 671, 671, 671, 671, 671, 671, 671, 671, + 671, 671, 671, 647, 671, 671, 671, 671, + 671, 671, 671, 671, 671, 671, 671, 671, + 671, 671, 606, 606, 606, 606, 606, 606, + 606, 606, 606, 606, 671, 671, 671, 647, + 671, 647, 671, 606, 606, 606, 606, 606, + 606, 606, 606, 606, 606, 606, 606, 606, + 606, 606, 606, 606, 606, 606, 606, 606, + 606, 606, 606, 606, 606, 671, 671, 671, + 671, 606, 671, 606, 606, 606, 606, 606, + 606, 606, 606, 606, 606, 606, 606, 606, + 606, 606, 606, 606, 728, 606, 606, 729, + 606, 606, 606, 606, 606, 671, 671, 671, + 671, 671, 606, 671, 671, 671, 671, 671, + 671, 671, 671, 671, 671, 671, 671, 671, + 671, 671, 671, 671, 671, 671, 671, 671, + 671, 671, 671, 671, 671, 671, 671, 671, + 671, 671, 671, 671, 647, 671, 671, 671, + 671, 671, 671, 671, 671, 671, 671, 671, + 671, 671, 671, 606, 606, 606, 606, 606, + 606, 606, 606, 606, 606, 671, 671, 671, + 647, 671, 647, 671, 606, 606, 606, 606, + 606, 606, 606, 606, 606, 606, 606, 606, + 606, 606, 606, 606, 606, 606, 606, 606, + 606, 606, 606, 606, 606, 606, 671, 671, + 671, 671, 606, 671, 606, 606, 606, 606, + 606, 606, 606, 606, 606, 606, 606, 606, + 606, 606, 606, 606, 606, 606, 606, 606, + 606, 606, 606, 606, 684, 606, 671, 671, + 671, 671, 671, 606, 671, 671, 671, 671, + 671, 671, 671, 671, 671, 671, 671, 671, + 671, 671, 671, 671, 671, 671, 671, 671, + 671, 671, 671, 671, 671, 671, 671, 671, + 671, 671, 671, 671, 671, 647, 671, 671, + 671, 671, 671, 671, 671, 671, 671, 671, + 671, 671, 671, 671, 606, 606, 606, 606, + 606, 606, 606, 606, 606, 606, 671, 671, + 671, 647, 671, 647, 671, 606, 606, 606, + 606, 606, 606, 606, 606, 606, 606, 606, + 606, 606, 606, 606, 606, 606, 606, 606, + 606, 606, 606, 606, 606, 606, 606, 671, + 671, 671, 671, 606, 671, 606, 606, 606, + 606, 606, 606, 606, 606, 606, 606, 606, + 606, 606, 606, 606, 606, 606, 695, 606, + 606, 606, 606, 606, 606, 606, 606, 671, + 671, 671, 671, 671, 606, 671, 671, 671, + 671, 671, 671, 671, 671, 671, 671, 671, + 671, 671, 671, 671, 671, 671, 671, 671, + 671, 671, 671, 671, 671, 671, 671, 671, + 671, 671, 671, 671, 671, 671, 647, 671, + 671, 671, 671, 671, 671, 671, 671, 671, + 671, 671, 671, 671, 671, 606, 606, 606, + 606, 606, 606, 606, 606, 606, 606, 671, + 671, 671, 647, 671, 647, 671, 606, 606, + 606, 606, 606, 606, 606, 606, 606, 606, + 606, 606, 606, 606, 606, 606, 606, 606, + 606, 606, 606, 606, 606, 606, 606, 606, + 671, 671, 671, 671, 606, 671, 606, 606, + 606, 606, 730, 606, 606, 606, 606, 606, + 606, 606, 606, 606, 606, 606, 606, 606, + 606, 606, 731, 606, 606, 606, 606, 606, + 671, 671, 671, 671, 671, 606, 671, 671, + 671, 671, 671, 671, 671, 671, 671, 671, + 671, 671, 671, 671, 671, 671, 671, 671, + 671, 671, 671, 671, 671, 671, 671, 671, + 671, 671, 671, 671, 671, 671, 671, 647, + 671, 671, 671, 671, 671, 671, 671, 671, + 671, 671, 671, 671, 671, 671, 606, 606, + 606, 606, 606, 606, 606, 606, 606, 606, + 671, 671, 671, 647, 671, 647, 671, 606, + 606, 606, 606, 606, 606, 606, 606, 606, + 606, 606, 606, 606, 606, 606, 606, 606, + 606, 606, 606, 606, 606, 606, 606, 606, + 606, 671, 671, 671, 671, 606, 671, 606, + 606, 606, 606, 606, 606, 606, 606, 606, + 606, 606, 713, 606, 606, 606, 606, 606, + 606, 606, 606, 606, 606, 606, 606, 606, + 606, 671, 671, 671, 671, 671, 606, 671, + 671, 671, 671, 671, 671, 671, 671, 671, + 671, 671, 671, 671, 671, 671, 671, 671, + 671, 671, 671, 671, 671, 671, 671, 671, + 671, 671, 671, 671, 671, 671, 671, 671, + 647, 671, 671, 671, 671, 671, 671, 671, + 671, 671, 671, 671, 671, 671, 671, 606, + 606, 606, 606, 606, 606, 606, 606, 606, + 606, 671, 671, 671, 647, 671, 647, 671, + 606, 606, 606, 606, 606, 606, 606, 606, + 606, 606, 606, 606, 606, 606, 606, 606, + 606, 606, 606, 606, 606, 606, 606, 606, + 606, 606, 671, 671, 671, 671, 606, 671, + 606, 606, 606, 606, 606, 606, 606, 606, + 606, 606, 606, 606, 606, 606, 606, 732, + 606, 606, 606, 606, 606, 606, 606, 606, + 606, 606, 671, 671, 671, 671, 671, 606, + 671, 671, 671, 671, 671, 671, 671, 671, + 671, 671, 671, 671, 671, 671, 671, 671, + 671, 671, 671, 671, 671, 671, 671, 671, + 671, 671, 671, 671, 671, 671, 671, 671, + 671, 647, 671, 671, 671, 671, 671, 671, + 671, 671, 671, 671, 671, 671, 671, 671, + 606, 606, 606, 606, 606, 606, 606, 606, + 606, 606, 671, 671, 671, 647, 671, 647, + 671, 606, 606, 606, 606, 606, 606, 606, + 606, 606, 606, 606, 606, 606, 606, 606, + 606, 606, 606, 606, 606, 606, 606, 606, + 606, 606, 606, 671, 671, 671, 671, 606, + 671, 606, 606, 606, 606, 638, 606, 606, + 606, 606, 606, 606, 606, 606, 606, 606, + 606, 606, 606, 606, 606, 606, 606, 606, + 606, 606, 606, 671, 671, 671, 671, 671, + 606, 671, 671, 671, 671, 671, 671, 671, + 671, 671, 671, 671, 671, 671, 671, 671, + 671, 671, 671, 671, 671, 671, 671, 671, + 671, 671, 671, 671, 671, 671, 671, 671, + 671, 671, 647, 671, 671, 671, 671, 671, + 671, 671, 671, 671, 671, 671, 671, 671, + 671, 606, 606, 606, 606, 606, 606, 606, + 606, 606, 606, 671, 671, 671, 647, 671, + 647, 671, 606, 606, 606, 606, 606, 606, + 606, 606, 606, 606, 606, 606, 606, 606, + 606, 606, 606, 606, 606, 606, 606, 606, + 606, 606, 606, 606, 671, 671, 671, 671, + 606, 671, 606, 606, 606, 606, 606, 606, + 606, 733, 606, 606, 606, 606, 606, 606, + 606, 606, 606, 727, 606, 606, 606, 606, + 606, 606, 606, 606, 671, 671, 671, 671, + 671, 606, 671, 671, 671, 671, 671, 671, + 671, 671, 671, 671, 671, 671, 671, 671, + 671, 671, 671, 671, 671, 671, 671, 671, + 671, 671, 671, 671, 671, 671, 671, 671, + 671, 671, 671, 647, 671, 671, 671, 671, + 671, 671, 671, 671, 671, 671, 671, 671, + 671, 671, 606, 606, 606, 606, 606, 606, + 606, 606, 606, 606, 671, 671, 671, 647, + 671, 647, 671, 606, 606, 606, 606, 606, + 606, 606, 606, 606, 606, 606, 606, 606, + 606, 606, 606, 606, 606, 606, 606, 606, + 606, 606, 606, 606, 606, 671, 671, 671, + 671, 606, 671, 606, 606, 606, 606, 695, + 606, 606, 606, 606, 606, 606, 606, 606, + 606, 606, 606, 606, 606, 606, 606, 606, + 606, 606, 606, 606, 606, 671, 671, 671, + 671, 671, 606, 671, 671, 671, 671, 671, + 671, 671, 671, 671, 671, 671, 671, 671, + 671, 671, 671, 671, 671, 671, 671, 671, + 671, 671, 671, 671, 671, 671, 671, 671, + 671, 671, 671, 671, 647, 671, 671, 671, + 671, 671, 671, 671, 671, 671, 671, 671, + 671, 671, 671, 606, 606, 606, 606, 606, + 606, 606, 606, 606, 606, 671, 671, 671, + 647, 671, 647, 671, 606, 606, 606, 606, + 606, 606, 606, 606, 606, 606, 606, 606, + 606, 606, 606, 606, 606, 606, 606, 606, + 606, 606, 606, 606, 606, 606, 671, 671, + 671, 671, 606, 671, 606, 606, 606, 606, + 606, 606, 606, 606, 606, 606, 606, 606, + 606, 734, 606, 606, 606, 606, 606, 606, + 606, 606, 606, 606, 606, 606, 671, 671, + 671, 671, 671, 606, 671, 671, 671, 671, + 671, 671, 671, 671, 671, 671, 671, 671, + 671, 671, 671, 671, 671, 671, 671, 671, + 671, 671, 671, 671, 671, 671, 671, 671, + 671, 671, 671, 671, 671, 647, 671, 671, + 671, 671, 671, 671, 671, 671, 671, 671, + 671, 671, 671, 671, 606, 606, 606, 606, + 606, 606, 606, 606, 606, 606, 671, 671, + 671, 647, 671, 647, 671, 606, 606, 606, + 606, 606, 606, 606, 606, 606, 606, 606, + 606, 606, 606, 606, 606, 606, 606, 606, + 606, 606, 606, 606, 606, 606, 606, 671, + 671, 671, 671, 606, 671, 606, 606, 606, + 735, 606, 606, 606, 606, 606, 606, 606, + 736, 606, 606, 606, 606, 606, 606, 606, + 737, 606, 606, 606, 606, 606, 606, 671, + 671, 671, 671, 671, 606, 671, 671, 671, + 671, 671, 671, 671, 671, 671, 671, 671, + 671, 671, 671, 671, 671, 671, 671, 671, + 671, 671, 671, 671, 671, 671, 671, 671, + 671, 671, 671, 671, 671, 671, 647, 671, + 671, 671, 671, 671, 671, 671, 671, 671, + 671, 671, 671, 671, 671, 606, 606, 606, + 606, 606, 606, 606, 606, 606, 606, 671, + 671, 671, 647, 671, 647, 671, 606, 606, + 606, 606, 606, 606, 606, 606, 606, 606, + 606, 606, 606, 606, 606, 606, 606, 606, + 606, 606, 606, 606, 606, 606, 606, 606, + 671, 671, 671, 671, 606, 671, 606, 606, + 606, 606, 713, 606, 606, 606, 606, 606, + 606, 606, 606, 606, 606, 606, 606, 606, + 606, 606, 606, 606, 606, 606, 606, 606, + 671, 671, 671, 671, 671, 606, 671, 671, + 671, 671, 671, 671, 671, 671, 671, 671, + 671, 671, 671, 671, 671, 671, 671, 671, + 671, 671, 671, 671, 671, 671, 671, 671, + 671, 671, 671, 671, 671, 671, 671, 647, + 671, 671, 671, 671, 671, 671, 671, 671, + 671, 671, 671, 671, 671, 671, 606, 606, + 606, 606, 606, 606, 606, 606, 606, 606, + 671, 671, 671, 647, 671, 647, 671, 606, + 606, 606, 606, 606, 606, 606, 606, 606, + 606, 606, 606, 606, 606, 606, 606, 606, + 606, 606, 606, 606, 606, 606, 606, 606, + 606, 671, 671, 671, 671, 606, 671, 606, + 606, 606, 606, 701, 606, 606, 606, 606, + 606, 606, 606, 606, 606, 606, 606, 606, + 606, 606, 606, 606, 606, 606, 606, 606, + 606, 671, 671, 671, 671, 671, 606, 671, + 671, 671, 671, 671, 671, 671, 671, 671, + 671, 671, 671, 671, 671, 671, 671, 671, + 671, 671, 671, 671, 671, 671, 671, 671, + 671, 671, 671, 671, 671, 671, 671, 671, + 647, 671, 671, 671, 671, 671, 671, 671, + 671, 671, 671, 671, 671, 671, 671, 606, + 606, 606, 606, 606, 606, 606, 606, 606, + 606, 671, 671, 671, 647, 671, 647, 671, + 606, 606, 606, 606, 606, 606, 606, 606, + 606, 606, 606, 606, 606, 606, 606, 606, + 606, 606, 606, 606, 606, 606, 606, 606, + 606, 606, 671, 671, 671, 671, 606, 671, + 606, 606, 606, 606, 606, 606, 606, 606, + 721, 606, 606, 606, 606, 606, 606, 606, + 606, 606, 606, 606, 606, 606, 606, 606, + 606, 606, 671, 671, 671, 671, 671, 606, + 671, 671, 671, 671, 671, 671, 671, 671, + 671, 671, 671, 671, 671, 671, 671, 671, + 671, 671, 671, 671, 671, 671, 671, 671, + 671, 671, 671, 671, 671, 671, 671, 671, + 671, 647, 671, 671, 671, 671, 671, 671, + 671, 671, 671, 671, 671, 671, 671, 671, + 606, 606, 606, 606, 606, 606, 606, 606, + 606, 606, 671, 671, 671, 647, 671, 647, + 671, 606, 606, 606, 606, 606, 606, 606, + 606, 606, 606, 606, 606, 606, 606, 606, + 606, 606, 606, 606, 606, 606, 606, 606, + 606, 606, 606, 671, 671, 671, 671, 606, + 671, 606, 606, 606, 606, 606, 606, 606, + 738, 606, 606, 606, 606, 606, 606, 606, + 606, 606, 606, 606, 606, 606, 606, 606, + 606, 606, 606, 671, 671, 671, 671, 671, + 606, 671, 671, 671, 671, 671, 671, 671, + 671, 671, 671, 671, 671, 671, 671, 671, + 671, 671, 671, 671, 671, 671, 671, 671, + 671, 671, 671, 671, 671, 671, 671, 671, + 671, 671, 647, 671, 671, 671, 671, 671, + 671, 671, 671, 671, 671, 671, 671, 671, + 671, 606, 606, 606, 606, 606, 606, 606, + 606, 606, 606, 671, 671, 671, 647, 671, + 647, 671, 606, 606, 606, 606, 606, 606, + 606, 606, 606, 606, 606, 606, 606, 606, + 606, 606, 606, 606, 606, 606, 606, 606, + 606, 606, 606, 606, 671, 671, 671, 671, + 606, 671, 606, 606, 606, 606, 695, 606, + 606, 606, 719, 606, 606, 606, 606, 606, + 606, 606, 606, 606, 606, 606, 606, 606, + 606, 606, 606, 606, 671, 671, 671, 671, + 671, 606, 671, 671, 671, 671, 671, 671, + 671, 671, 671, 671, 671, 671, 671, 671, + 671, 671, 671, 671, 671, 671, 671, 671, + 671, 671, 671, 671, 671, 671, 671, 671, + 671, 671, 671, 647, 671, 671, 671, 671, + 671, 671, 671, 671, 671, 671, 671, 671, + 671, 671, 606, 606, 606, 606, 606, 606, + 606, 606, 606, 606, 671, 671, 671, 647, + 671, 647, 671, 606, 606, 606, 606, 606, + 606, 606, 606, 606, 606, 606, 606, 606, + 606, 606, 606, 606, 606, 606, 606, 606, + 606, 606, 606, 606, 606, 671, 671, 671, + 671, 606, 671, 606, 606, 606, 606, 606, + 606, 606, 606, 739, 606, 606, 606, 606, + 606, 606, 606, 606, 606, 606, 606, 606, + 606, 606, 606, 606, 606, 671, 671, 671, + 671, 671, 606, 671, 671, 671, 671, 671, + 671, 671, 671, 671, 671, 671, 671, 671, + 671, 671, 671, 671, 671, 671, 671, 671, + 671, 671, 671, 671, 671, 671, 671, 671, + 671, 671, 671, 671, 647, 671, 671, 671, + 671, 671, 671, 671, 671, 671, 671, 671, + 671, 671, 671, 606, 606, 606, 606, 606, + 606, 606, 606, 606, 606, 671, 671, 671, + 647, 671, 647, 671, 606, 606, 606, 606, + 606, 606, 606, 606, 606, 606, 606, 606, + 606, 606, 606, 606, 606, 606, 606, 606, + 606, 606, 606, 606, 606, 606, 671, 671, + 671, 671, 606, 671, 606, 606, 606, 606, + 740, 606, 606, 606, 606, 606, 606, 606, + 606, 606, 606, 606, 606, 606, 606, 606, + 606, 606, 606, 606, 606, 606, 671, 671, + 671, 671, 671, 606, 671, 671, 671, 671, + 671, 671, 671, 671, 671, 671, 671, 671, + 671, 671, 671, 671, 671, 671, 671, 671, + 671, 671, 671, 671, 671, 671, 671, 671, + 671, 671, 671, 671, 671, 647, 671, 671, + 671, 671, 671, 671, 671, 671, 671, 671, + 671, 671, 671, 671, 606, 606, 606, 606, + 606, 606, 606, 606, 606, 606, 671, 671, + 671, 647, 671, 647, 671, 606, 606, 606, + 606, 606, 606, 606, 606, 606, 606, 606, + 606, 606, 606, 606, 606, 606, 606, 606, + 606, 606, 606, 606, 606, 606, 606, 671, + 671, 671, 671, 606, 671, 606, 606, 606, + 606, 606, 606, 606, 606, 606, 606, 606, + 689, 606, 606, 606, 606, 606, 606, 606, + 606, 606, 606, 606, 606, 606, 606, 671, + 671, 671, 671, 671, 606, 618, 650, 742, + 743, 743, 743, 742, 743, 743, 743, 743, + 744, 743, 744, 744, 744, 743, 743, 743, + 743, 743, 743, 743, 743, 743, 743, 743, + 743, 742, 743, 743, 743, 743, 743, 744, + 743, 743, 745, 743, 743, 743, 743, 743, + 743, 743, 743, 743, 743, 746, 743, 743, + 743, 743, 743, 743, 743, 743, 743, 743, + 743, 743, 743, 743, 743, 743, 743, 743, + 741, 741, 741, 741, 741, 741, 741, 741, + 741, 741, 741, 741, 741, 741, 741, 741, + 741, 741, 741, 741, 741, 741, 741, 741, + 741, 741, 743, 747, 743, 743, 741, 743, + 741, 741, 741, 741, 741, 741, 741, 741, + 741, 741, 741, 741, 741, 741, 741, 741, + 741, 741, 741, 741, 741, 741, 741, 741, + 741, 741, 743, 743, 743, 743, 743, 741, + 748, 748, 748, 748, 748, 748, 748, 748, + 748, 748, 748, 748, 748, 748, 748, 748, + 748, 748, 748, 748, 748, 748, 748, 748, + 748, 748, 748, 748, 748, 748, 748, 748, + 748, 110, 748, 748, 748, 748, 748, 748, + 748, 748, 748, 748, 748, 748, 748, 748, + 109, 109, 109, 109, 109, 109, 109, 109, + 109, 109, 111, 748, 748, 748, 748, 110, + 748, 109, 109, 109, 109, 109, 109, 109, + 109, 109, 109, 109, 109, 109, 109, 109, + 109, 109, 109, 109, 109, 109, 109, 109, + 109, 109, 109, 748, 748, 748, 748, 109, + 748, 109, 109, 109, 109, 109, 109, 109, + 109, 109, 109, 109, 109, 109, 109, 109, + 109, 109, 109, 109, 109, 109, 109, 109, + 109, 109, 109, 748, 748, 748, 748, 748, + 109, 744, 749, 744, 744, 744, 749, 749, + 749, 749, 749, 749, 749, 749, 749, 749, + 749, 749, 749, 749, 749, 749, 749, 749, + 744, 749, 750, 751, 752, 753, 754, 748, + 755, 748, 756, 758, 759, 759, 759, 758, + 759, 759, 759, 759, 760, 761, 760, 760, + 760, 759, 759, 759, 759, 759, 759, 759, + 759, 759, 759, 759, 759, 758, 759, 759, + 759, 759, 759, 760, 762, 759, 763, 759, + 764, 765, 759, 759, 759, 766, 767, 759, + 767, 759, 764, 759, 759, 759, 759, 759, + 759, 759, 759, 759, 759, 759, 759, 768, + 769, 770, 759, 759, 771, 771, 771, 771, + 771, 771, 771, 771, 771, 771, 771, 771, + 771, 771, 771, 771, 771, 771, 771, 771, + 771, 771, 771, 771, 771, 771, 772, 773, + 759, 764, 757, 764, 757, 757, 757, 757, + 757, 757, 757, 757, 757, 757, 757, 757, + 757, 757, 757, 757, 757, 757, 757, 757, + 757, 757, 757, 757, 757, 757, 759, 774, + 759, 767, 759, 757, 775, 775, 775, 775, + 775, 775, 775, 775, 775, 775, 775, 775, + 775, 775, 775, 775, 775, 775, 775, 775, + 775, 775, 775, 775, 775, 775, 775, 775, + 775, 775, 775, 775, 775, 776, 775, 775, + 775, 775, 775, 775, 775, 775, 775, 775, + 775, 775, 775, 775, 757, 757, 757, 757, + 757, 757, 757, 757, 757, 757, 775, 775, + 775, 775, 775, 776, 775, 757, 757, 757, + 757, 757, 757, 757, 757, 757, 757, 757, + 757, 757, 757, 757, 757, 757, 757, 757, + 757, 757, 757, 757, 757, 757, 757, 775, + 775, 775, 775, 757, 775, 757, 757, 757, + 757, 757, 757, 757, 757, 757, 757, 757, + 757, 757, 757, 757, 757, 757, 757, 757, + 757, 757, 757, 757, 757, 757, 757, 775, + 775, 775, 775, 775, 757, 778, 777, 779, + 760, 780, 760, 760, 760, 780, 780, 780, + 780, 780, 780, 780, 780, 780, 780, 780, + 780, 780, 780, 780, 780, 780, 780, 760, + 780, 781, 764, 782, 782, 764, 782, 782, + 782, 782, 782, 782, 782, 782, 782, 782, + 782, 782, 782, 782, 782, 782, 782, 782, + 782, 782, 782, 782, 782, 782, 782, 782, + 782, 782, 782, 782, 782, 782, 782, 782, + 782, 782, 782, 782, 782, 782, 782, 782, + 782, 782, 782, 782, 782, 782, 782, 782, + 782, 782, 782, 782, 782, 782, 782, 782, + 782, 782, 782, 764, 782, 783, 784, 785, + 786, 764, 782, 764, 782, 764, 782, 764, + 787, 782, 764, 782, 789, 764, 788, 788, + 788, 788, 788, 788, 788, 788, 788, 788, + 788, 788, 788, 788, 788, 788, 788, 788, + 788, 788, 788, 788, 788, 788, 788, 788, + 788, 788, 788, 788, 788, 788, 788, 788, + 788, 788, 788, 788, 788, 788, 788, 788, + 788, 788, 788, 788, 788, 788, 788, 788, + 788, 788, 788, 788, 788, 788, 788, 788, + 788, 788, 788, 788, 788, 764, 788, 764, + 782, 764, 764, 782, 790, 790, 790, 790, + 790, 790, 790, 790, 790, 790, 790, 790, + 790, 790, 790, 790, 790, 790, 790, 790, + 790, 790, 790, 790, 790, 790, 790, 790, + 790, 790, 790, 790, 790, 776, 790, 790, + 790, 790, 790, 790, 790, 790, 790, 790, + 790, 790, 790, 790, 771, 771, 771, 771, + 771, 771, 771, 771, 771, 771, 790, 790, + 790, 790, 790, 776, 790, 771, 771, 771, + 771, 771, 771, 771, 771, 771, 771, 771, + 771, 771, 771, 771, 771, 771, 771, 771, + 771, 771, 771, 771, 771, 771, 771, 790, + 790, 790, 790, 771, 790, 771, 771, 771, + 771, 771, 771, 771, 771, 771, 771, 771, + 771, 771, 771, 771, 771, 771, 771, 771, + 771, 771, 771, 771, 771, 771, 771, 790, + 790, 790, 790, 790, 771, 789, 788, 761, + 788, 764, 782, 792, 791, 791, 791, 792, + 791, 791, 791, 791, 793, 794, 793, 793, + 793, 791, 791, 791, 791, 791, 791, 791, + 791, 791, 791, 791, 791, 792, 791, 791, + 791, 791, 791, 793, 791, 791, 795, 791, + 120, 796, 791, 797, 791, 798, 120, 151, + 799, 153, 120, 791, 791, 791, 791, 791, + 791, 791, 791, 791, 791, 800, 791, 801, + 151, 802, 803, 791, 791, 791, 791, 791, + 791, 791, 791, 791, 791, 791, 791, 791, + 791, 791, 791, 791, 791, 791, 791, 791, + 791, 791, 791, 791, 791, 791, 151, 804, + 151, 120, 791, 791, 791, 791, 791, 791, + 791, 791, 791, 791, 805, 791, 791, 791, + 791, 791, 791, 791, 791, 806, 791, 791, + 807, 791, 808, 791, 791, 791, 164, 165, + 791, 120, 791, 809, 809, 809, 809, 809, + 809, 809, 809, 809, 793, 809, 793, 793, + 793, 809, 809, 809, 809, 809, 809, 809, + 809, 809, 809, 809, 809, 809, 809, 809, + 809, 809, 809, 793, 809, 809, 809, 809, + 146, 147, 809, 148, 809, 149, 150, 151, + 152, 153, 146, 809, 809, 809, 809, 809, + 809, 809, 809, 809, 809, 154, 809, 155, + 151, 156, 157, 809, 115, 115, 115, 115, + 115, 115, 115, 115, 115, 115, 115, 115, + 115, 115, 115, 115, 115, 115, 115, 115, + 115, 115, 115, 115, 115, 115, 158, 159, + 151, 120, 115, 809, 115, 115, 115, 115, + 115, 115, 115, 115, 160, 115, 115, 115, + 115, 115, 115, 115, 115, 161, 115, 115, + 162, 115, 163, 115, 115, 115, 164, 165, + 809, 120, 809, 115, 810, 811, 811, 811, + 810, 811, 811, 811, 811, 151, 812, 151, + 151, 151, 811, 811, 811, 811, 811, 811, + 811, 811, 811, 811, 811, 811, 810, 811, + 811, 811, 811, 811, 151, 811, 811, 811, + 811, 811, 811, 811, 811, 811, 811, 811, + 811, 811, 811, 811, 811, 811, 811, 811, + 811, 811, 811, 811, 811, 811, 811, 811, + 811, 151, 811, 151, 812, 151, 151, 151, + 114, 114, 114, 114, 114, 114, 114, 114, + 114, 114, 114, 114, 114, 114, 114, 114, + 114, 114, 151, 114, 114, 114, 114, 114, + 120, 114, 114, 114, 114, 114, 114, 114, + 151, 114, 114, 114, 114, 114, 114, 114, + 114, 114, 114, 114, 114, 114, 114, 151, + 114, 151, 812, 151, 151, 151, 114, 114, + 114, 114, 114, 114, 114, 114, 114, 114, + 114, 114, 114, 114, 114, 114, 114, 114, + 151, 114, 114, 114, 114, 114, 114, 114, + 114, 114, 114, 114, 114, 114, 114, 114, + 114, 114, 114, 114, 114, 114, 114, 114, + 114, 114, 114, 114, 114, 151, 114, 813, + 151, 812, 151, 151, 151, 814, 814, 814, + 814, 814, 814, 814, 814, 814, 814, 814, + 814, 814, 814, 814, 814, 814, 814, 151, + 814, 814, 814, 814, 814, 814, 814, 814, + 814, 815, 814, 814, 814, 814, 814, 814, + 814, 814, 814, 814, 814, 814, 814, 814, + 814, 814, 814, 814, 151, 814, 151, 812, + 151, 151, 151, 114, 114, 114, 114, 114, + 114, 114, 114, 114, 114, 114, 114, 114, + 114, 114, 114, 114, 114, 151, 114, 114, + 114, 114, 114, 114, 114, 114, 114, 114, + 114, 114, 114, 114, 114, 114, 114, 114, + 114, 114, 114, 114, 114, 114, 114, 114, + 114, 114, 151, 151, 114, 816, 810, 151, + 810, 818, 817, 820, 821, 820, 820, 820, + 819, 819, 819, 819, 819, 819, 819, 819, + 819, 819, 819, 819, 819, 819, 819, 819, + 819, 819, 820, 819, 822, 810, 810, 810, + 810, 810, 810, 810, 810, 810, 810, 810, + 810, 810, 810, 810, 810, 810, 810, 810, + 810, 810, 810, 810, 810, 810, 810, 810, + 810, 810, 810, 810, 810, 810, 116, 810, + 810, 810, 810, 810, 810, 810, 810, 810, + 810, 810, 810, 810, 810, 115, 115, 115, + 115, 115, 115, 115, 115, 115, 115, 117, + 810, 810, 810, 810, 116, 810, 115, 115, + 115, 115, 115, 115, 115, 115, 115, 115, + 115, 115, 115, 115, 115, 115, 115, 115, + 115, 115, 115, 115, 115, 115, 115, 115, + 810, 810, 810, 810, 115, 810, 115, 115, + 115, 115, 115, 115, 115, 115, 115, 115, + 115, 115, 115, 115, 115, 115, 115, 115, + 115, 115, 115, 115, 115, 115, 115, 115, + 810, 810, 810, 810, 810, 115, 823, 151, + 812, 151, 151, 151, 810, 810, 810, 810, + 810, 810, 810, 810, 810, 810, 810, 810, + 810, 810, 810, 810, 810, 810, 151, 810, + 810, 810, 810, 810, 810, 810, 810, 810, + 810, 810, 810, 810, 810, 810, 810, 810, + 810, 810, 810, 810, 810, 810, 810, 810, + 810, 810, 810, 151, 810, 810, 810, 810, + 810, 810, 810, 810, 810, 810, 810, 810, + 810, 810, 810, 810, 810, 810, 810, 810, + 810, 810, 810, 810, 810, 810, 810, 810, + 810, 810, 810, 810, 810, 810, 810, 810, + 810, 810, 810, 810, 810, 810, 810, 810, + 810, 810, 810, 810, 810, 810, 810, 810, + 810, 810, 810, 810, 810, 810, 810, 810, + 810, 810, 120, 810, 824, 825, 826, 827, + 828, 829, 151, 812, 151, 151, 151, 810, + 810, 810, 810, 810, 810, 810, 810, 810, + 810, 810, 810, 810, 810, 810, 810, 810, + 810, 151, 810, 810, 810, 810, 810, 810, + 810, 810, 810, 120, 810, 810, 810, 810, + 810, 810, 810, 810, 810, 810, 810, 810, + 810, 810, 810, 810, 810, 810, 151, 810, + 151, 817, 120, 830, 120, 830, 831, 832, + 831, 831, 831, 819, 819, 819, 819, 819, + 819, 819, 819, 819, 819, 819, 819, 819, + 819, 819, 819, 819, 819, 831, 819, 833, + 830, 834, 834, 834, 834, 834, 834, 834, + 834, 834, 123, 834, 123, 123, 123, 834, + 834, 834, 834, 834, 834, 834, 834, 834, + 834, 834, 834, 834, 834, 834, 834, 834, + 834, 123, 834, 834, 834, 834, 124, 125, + 834, 126, 834, 127, 128, 129, 130, 131, + 124, 834, 834, 834, 834, 834, 834, 834, + 834, 834, 834, 132, 834, 133, 129, 134, + 135, 834, 122, 122, 122, 122, 122, 122, + 122, 122, 122, 122, 122, 122, 122, 122, + 122, 122, 122, 122, 122, 122, 122, 122, + 122, 122, 122, 122, 136, 137, 129, 138, + 122, 834, 122, 122, 122, 122, 122, 122, + 122, 122, 139, 122, 122, 122, 122, 122, + 122, 122, 122, 140, 122, 122, 141, 122, + 142, 122, 122, 122, 143, 144, 834, 138, + 834, 122, 151, 830, 835, 830, 836, 830, + 837, 830, 838, 190, 190, 190, 838, 190, + 190, 190, 190, 839, 190, 839, 839, 839, + 190, 190, 190, 190, 190, 190, 190, 190, + 190, 190, 190, 190, 838, 190, 190, 190, + 190, 190, 839, 190, 190, 190, 190, 190, + 190, 190, 190, 190, 190, 190, 190, 190, + 190, 190, 190, 190, 190, 190, 190, 190, + 190, 190, 190, 190, 190, 190, 190, 190, + 190, 190, 190, 192, 192, 192, 192, 192, + 192, 192, 192, 192, 192, 192, 192, 192, + 192, 192, 192, 192, 192, 192, 192, 192, + 192, 192, 192, 192, 192, 190, 840, 190, + 190, 192, 190, 192, 192, 192, 196, 192, + 192, 192, 192, 192, 192, 192, 192, 192, + 192, 192, 192, 192, 192, 192, 192, 192, + 192, 192, 192, 192, 192, 190, 190, 190, + 190, 190, 192, 189, 189, 189, 189, 189, + 189, 189, 189, 189, 189, 189, 189, 189, + 189, 189, 189, 189, 189, 189, 189, 189, + 189, 189, 189, 189, 189, 189, 189, 189, + 189, 189, 189, 189, 841, 189, 189, 189, + 189, 189, 189, 189, 189, 189, 189, 189, + 189, 189, 189, 192, 192, 192, 192, 192, + 192, 192, 192, 192, 192, 190, 189, 189, + 189, 189, 841, 189, 192, 192, 192, 192, + 192, 192, 192, 192, 192, 192, 192, 192, + 192, 192, 192, 192, 192, 192, 192, 192, + 192, 192, 192, 192, 192, 192, 189, 189, + 189, 189, 192, 189, 192, 192, 192, 192, + 192, 192, 192, 192, 192, 192, 192, 192, + 192, 192, 192, 192, 192, 192, 192, 192, + 192, 192, 192, 192, 192, 192, 189, 189, + 189, 189, 189, 192, 842, 842, 842, 842, + 842, 842, 842, 842, 842, 193, 842, 193, + 193, 193, 842, 842, 842, 842, 842, 842, + 842, 842, 842, 842, 842, 842, 842, 842, + 842, 842, 842, 842, 193, 842, 842, 842, + 842, 842, 842, 842, 194, 842, 842, 842, + 842, 842, 842, 842, 842, 842, 842, 842, + 842, 842, 842, 842, 842, 842, 842, 842, + 842, 842, 842, 842, 842, 192, 192, 192, + 192, 192, 192, 192, 192, 192, 192, 192, + 192, 192, 192, 192, 192, 192, 192, 192, + 192, 192, 192, 192, 192, 192, 192, 842, + 195, 842, 842, 192, 842, 192, 192, 192, + 196, 192, 192, 192, 192, 192, 192, 192, + 192, 192, 192, 192, 192, 192, 192, 192, + 192, 192, 192, 192, 192, 192, 192, 842, + 842, 842, 842, 842, 192, 843, 842, 842, + 842, 842, 842, 842, 842, 842, 842, 842, + 842, 842, 842, 842, 842, 842, 842, 842, + 842, 842, 842, 842, 842, 842, 842, 842, + 842, 842, 842, 842, 842, 842, 842, 841, + 842, 842, 842, 842, 842, 842, 842, 842, + 842, 842, 842, 842, 842, 842, 192, 192, + 192, 192, 192, 192, 192, 192, 192, 192, + 190, 842, 842, 842, 842, 841, 842, 192, + 192, 192, 192, 192, 192, 192, 192, 192, + 192, 192, 192, 192, 192, 192, 192, 192, + 192, 192, 192, 192, 192, 192, 192, 192, + 192, 842, 842, 842, 842, 192, 842, 192, + 192, 192, 192, 192, 192, 192, 192, 192, + 192, 192, 192, 192, 192, 844, 192, 192, + 192, 192, 192, 192, 192, 192, 192, 192, + 192, 842, 842, 842, 842, 842, 192, 197, + 842, 846, 845, 845, 845, 846, 845, 845, + 845, 845, 847, 845, 847, 847, 847, 845, + 845, 845, 845, 845, 845, 845, 845, 845, + 845, 845, 845, 846, 845, 845, 845, 845, + 845, 847, 845, 845, 848, 845, 845, 845, + 845, 845, 845, 845, 845, 845, 845, 845, + 845, 845, 845, 845, 845, 845, 845, 845, + 845, 845, 845, 845, 845, 845, 845, 845, + 845, 845, 845, 845, 845, 845, 845, 845, + 845, 845, 845, 845, 845, 845, 845, 845, + 845, 845, 845, 845, 845, 845, 845, 845, + 845, 845, 845, 845, 845, 849, 845, 845, + 845, 845, 845, 845, 845, 850, 845, 845, + 845, 845, 845, 845, 845, 845, 845, 845, + 845, 845, 845, 845, 845, 845, 845, 845, + 845, 845, 845, 845, 851, 845, 847, 852, + 847, 847, 847, 852, 852, 852, 852, 852, + 852, 852, 852, 852, 852, 852, 852, 852, + 852, 852, 852, 852, 852, 847, 852, 853, + 854, 855, 856, 858, 857, 859, 860, 857, + 861, 863, 864, 864, 864, 863, 864, 864, + 864, 864, 865, 866, 865, 865, 865, 864, + 864, 864, 864, 864, 864, 864, 864, 864, + 864, 864, 864, 863, 864, 864, 864, 864, + 864, 865, 864, 864, 867, 864, 864, 864, + 864, 864, 864, 864, 864, 864, 864, 864, + 864, 864, 864, 864, 864, 864, 864, 864, + 864, 864, 864, 864, 864, 864, 864, 864, + 864, 864, 862, 862, 862, 862, 862, 862, + 862, 862, 862, 862, 862, 862, 862, 862, + 862, 862, 862, 862, 862, 862, 862, 862, + 862, 862, 862, 862, 864, 868, 864, 864, + 862, 864, 862, 862, 862, 862, 862, 862, + 862, 862, 869, 862, 862, 862, 862, 862, + 862, 862, 862, 870, 862, 862, 871, 862, + 872, 862, 862, 862, 864, 864, 864, 864, + 864, 862, 873, 873, 873, 873, 873, 873, + 873, 873, 873, 873, 873, 873, 873, 873, + 873, 873, 873, 873, 873, 873, 873, 873, + 873, 873, 873, 873, 873, 873, 873, 873, + 873, 873, 873, 873, 873, 873, 873, 873, + 873, 873, 873, 873, 873, 873, 873, 873, + 873, 873, 862, 862, 862, 862, 862, 862, + 862, 862, 862, 862, 873, 873, 873, 873, + 873, 873, 873, 862, 862, 862, 862, 862, + 862, 862, 862, 862, 862, 862, 862, 862, + 862, 862, 862, 862, 862, 862, 862, 862, + 862, 862, 862, 862, 862, 873, 873, 873, + 873, 862, 873, 862, 862, 862, 862, 862, + 862, 862, 862, 862, 862, 862, 862, 862, + 862, 862, 862, 862, 862, 862, 862, 862, + 862, 862, 862, 862, 862, 873, 873, 873, + 873, 873, 862, 865, 874, 865, 865, 865, + 874, 874, 874, 874, 874, 874, 874, 874, + 874, 874, 874, 874, 874, 874, 874, 874, + 874, 874, 865, 874, 875, 876, 877, 878, + 879, 881, 880, 882, 883, 883, 883, 883, + 883, 883, 883, 883, 883, 883, 883, 883, + 883, 883, 883, 883, 883, 883, 883, 883, + 883, 883, 883, 883, 883, 883, 883, 883, + 883, 883, 883, 883, 883, 883, 883, 883, + 883, 883, 883, 883, 883, 883, 883, 883, + 883, 883, 883, 883, 862, 862, 862, 862, + 862, 862, 862, 862, 862, 862, 883, 883, + 883, 883, 883, 883, 883, 862, 862, 862, + 862, 862, 862, 862, 862, 862, 862, 862, + 862, 862, 862, 862, 862, 862, 862, 862, + 862, 862, 862, 862, 862, 862, 862, 883, + 883, 883, 883, 862, 883, 862, 862, 862, + 862, 862, 884, 862, 862, 862, 862, 862, + 862, 862, 862, 862, 862, 862, 862, 862, + 862, 862, 862, 862, 862, 862, 862, 883, + 883, 883, 883, 883, 862, 883, 883, 883, + 883, 883, 883, 883, 883, 883, 883, 883, + 883, 883, 883, 883, 883, 883, 883, 883, + 883, 883, 883, 883, 883, 883, 883, 883, + 883, 883, 883, 883, 883, 883, 883, 883, + 883, 883, 883, 883, 883, 883, 883, 883, + 883, 883, 883, 883, 883, 862, 862, 862, + 862, 862, 862, 862, 862, 862, 862, 883, + 883, 883, 883, 883, 883, 883, 862, 862, + 862, 862, 862, 862, 862, 862, 862, 862, + 862, 862, 862, 862, 862, 862, 862, 862, + 862, 862, 862, 862, 862, 862, 862, 862, + 883, 883, 883, 883, 862, 883, 862, 862, + 862, 862, 885, 862, 862, 862, 862, 862, + 862, 862, 862, 862, 862, 862, 862, 862, + 862, 862, 862, 862, 862, 862, 862, 862, + 883, 883, 883, 883, 883, 862, 883, 883, + 883, 883, 883, 883, 883, 883, 883, 883, + 883, 883, 883, 883, 883, 883, 883, 883, + 883, 883, 883, 883, 883, 883, 883, 883, + 883, 883, 883, 883, 883, 883, 883, 883, + 883, 883, 883, 883, 883, 883, 883, 883, + 883, 883, 883, 883, 883, 883, 862, 862, + 862, 862, 862, 862, 862, 862, 862, 862, + 883, 883, 883, 883, 883, 883, 883, 862, + 862, 862, 862, 862, 862, 862, 862, 862, + 862, 862, 862, 862, 862, 862, 862, 862, + 862, 862, 862, 862, 862, 862, 862, 862, + 862, 883, 883, 883, 883, 862, 883, 862, + 862, 862, 862, 862, 862, 862, 862, 862, + 862, 862, 862, 862, 862, 862, 862, 862, + 862, 886, 862, 862, 862, 862, 862, 862, + 862, 883, 883, 883, 883, 883, 862, 883, + 883, 883, 883, 883, 883, 883, 883, 883, + 883, 883, 883, 883, 883, 883, 883, 883, + 883, 883, 883, 883, 883, 883, 883, 883, + 883, 883, 883, 883, 883, 883, 883, 883, + 883, 883, 883, 883, 883, 883, 883, 883, + 883, 883, 883, 883, 883, 883, 883, 862, + 862, 862, 862, 862, 862, 862, 862, 862, + 862, 883, 883, 883, 883, 883, 883, 883, + 862, 862, 862, 862, 862, 862, 862, 862, + 862, 862, 862, 862, 862, 862, 862, 862, + 862, 862, 862, 862, 862, 862, 862, 862, + 862, 862, 883, 883, 883, 883, 862, 883, + 862, 862, 887, 862, 862, 862, 862, 862, + 862, 862, 862, 862, 862, 862, 862, 862, + 862, 862, 862, 862, 862, 862, 862, 862, + 862, 862, 883, 883, 883, 883, 883, 862, + 883, 883, 883, 883, 883, 883, 883, 883, + 883, 883, 883, 883, 883, 883, 883, 883, + 883, 883, 883, 883, 883, 883, 883, 883, + 883, 883, 883, 883, 883, 883, 883, 883, + 883, 883, 883, 883, 883, 883, 883, 883, + 883, 883, 883, 883, 883, 883, 883, 883, + 862, 862, 862, 862, 862, 862, 862, 862, + 862, 862, 883, 883, 883, 883, 883, 883, + 883, 862, 862, 862, 862, 862, 862, 862, + 862, 862, 862, 862, 862, 862, 862, 862, + 862, 862, 862, 862, 862, 862, 862, 862, + 862, 862, 862, 883, 883, 883, 883, 862, + 883, 862, 862, 862, 862, 862, 862, 862, + 862, 862, 862, 862, 862, 862, 862, 862, + 862, 862, 862, 862, 862, 888, 862, 862, + 862, 862, 862, 883, 883, 883, 883, 883, + 862, 883, 883, 883, 883, 883, 883, 883, + 883, 883, 883, 883, 883, 883, 883, 883, + 883, 883, 883, 883, 883, 883, 883, 883, + 883, 883, 883, 883, 883, 883, 883, 883, + 883, 883, 883, 883, 883, 883, 883, 883, + 883, 883, 883, 883, 883, 883, 883, 883, + 883, 862, 862, 862, 862, 862, 862, 862, + 862, 862, 862, 883, 883, 883, 883, 883, + 883, 883, 862, 862, 862, 862, 862, 862, + 862, 862, 862, 862, 862, 862, 862, 862, + 862, 862, 862, 862, 862, 862, 862, 862, + 862, 862, 862, 862, 883, 883, 883, 883, + 862, 883, 862, 862, 862, 862, 884, 862, + 862, 862, 862, 862, 862, 862, 862, 862, + 862, 862, 862, 862, 862, 862, 862, 862, + 862, 862, 862, 862, 883, 883, 883, 883, + 883, 862, 883, 883, 883, 883, 883, 883, + 883, 883, 883, 883, 883, 883, 883, 883, + 883, 883, 883, 883, 883, 883, 883, 883, + 883, 883, 883, 883, 883, 883, 883, 883, + 883, 883, 883, 883, 883, 883, 883, 883, + 883, 883, 883, 883, 883, 883, 883, 883, + 883, 883, 862, 862, 862, 862, 862, 862, + 862, 862, 862, 862, 883, 883, 883, 883, + 883, 883, 883, 862, 862, 862, 862, 862, + 862, 862, 862, 862, 862, 862, 862, 862, + 862, 862, 862, 862, 862, 862, 862, 862, + 862, 862, 862, 862, 862, 883, 883, 883, + 883, 862, 883, 862, 862, 862, 862, 862, + 862, 862, 862, 862, 862, 862, 862, 862, + 889, 862, 862, 862, 862, 862, 862, 862, + 862, 862, 862, 862, 862, 883, 883, 883, + 883, 883, 862, 883, 883, 883, 883, 883, + 883, 883, 883, 883, 883, 883, 883, 883, + 883, 883, 883, 883, 883, 883, 883, 883, + 883, 883, 883, 883, 883, 883, 883, 883, + 883, 883, 883, 883, 883, 883, 883, 883, + 883, 883, 883, 883, 883, 883, 883, 883, + 883, 883, 883, 862, 862, 862, 862, 862, + 862, 862, 862, 862, 862, 883, 883, 883, + 883, 883, 883, 883, 862, 862, 862, 862, + 862, 862, 862, 862, 862, 862, 862, 862, + 862, 862, 862, 862, 862, 862, 862, 862, + 862, 862, 862, 862, 862, 862, 883, 883, + 883, 883, 862, 883, 862, 862, 862, 862, + 862, 862, 862, 862, 862, 862, 862, 890, + 862, 862, 862, 862, 862, 862, 862, 891, + 862, 862, 862, 862, 862, 862, 883, 883, + 883, 883, 883, 862, 883, 883, 883, 883, + 883, 883, 883, 883, 883, 883, 883, 883, + 883, 883, 883, 883, 883, 883, 883, 883, + 883, 883, 883, 883, 883, 883, 883, 883, + 883, 883, 883, 883, 883, 883, 883, 883, + 883, 883, 883, 883, 883, 883, 883, 883, + 883, 883, 883, 883, 862, 862, 862, 862, + 862, 862, 862, 862, 862, 862, 883, 883, + 883, 883, 883, 883, 883, 862, 862, 862, + 862, 862, 862, 862, 862, 862, 862, 862, + 862, 862, 862, 862, 862, 862, 862, 862, + 862, 862, 862, 862, 862, 862, 862, 883, + 883, 883, 883, 862, 883, 862, 862, 862, + 862, 892, 862, 862, 862, 862, 862, 862, + 862, 862, 862, 862, 862, 862, 862, 862, + 862, 862, 862, 862, 862, 862, 862, 883, + 883, 883, 883, 883, 862, 883, 883, 883, + 883, 883, 883, 883, 883, 883, 883, 883, + 883, 883, 883, 883, 883, 883, 883, 883, + 883, 883, 883, 883, 883, 883, 883, 883, + 883, 883, 883, 883, 883, 883, 883, 883, + 883, 883, 883, 883, 883, 883, 883, 883, + 883, 883, 883, 883, 883, 862, 862, 862, + 862, 862, 862, 862, 862, 862, 862, 883, + 883, 883, 883, 883, 883, 883, 862, 862, + 862, 862, 862, 862, 862, 862, 862, 862, + 862, 862, 862, 862, 862, 862, 862, 862, + 862, 862, 862, 862, 862, 862, 862, 862, + 883, 883, 883, 883, 862, 883, 862, 862, + 862, 862, 862, 862, 862, 862, 862, 862, + 862, 862, 862, 862, 862, 862, 862, 862, + 893, 862, 862, 862, 862, 862, 862, 862, + 883, 883, 883, 883, 883, 862, 883, 883, + 883, 883, 883, 883, 883, 883, 883, 883, + 883, 883, 883, 883, 883, 883, 883, 883, + 883, 883, 883, 883, 883, 883, 883, 883, + 883, 883, 883, 883, 883, 883, 883, 883, + 883, 883, 883, 883, 883, 883, 883, 883, + 883, 883, 883, 883, 883, 883, 862, 862, + 862, 862, 862, 862, 862, 862, 862, 862, + 883, 883, 883, 883, 883, 883, 883, 862, + 862, 862, 862, 862, 862, 862, 862, 862, + 862, 862, 862, 862, 862, 862, 862, 862, + 862, 862, 862, 862, 862, 862, 862, 862, + 862, 883, 883, 883, 883, 862, 883, 862, + 862, 862, 862, 862, 862, 862, 862, 862, + 862, 862, 862, 862, 862, 862, 862, 862, + 862, 884, 862, 862, 862, 862, 862, 862, + 862, 883, 883, 883, 883, 883, 862, 883, + 883, 883, 883, 883, 883, 883, 883, 883, + 883, 883, 883, 883, 883, 883, 883, 883, + 883, 883, 883, 883, 883, 883, 883, 883, + 883, 883, 883, 883, 883, 883, 883, 883, + 883, 883, 883, 883, 883, 883, 883, 883, + 883, 883, 883, 883, 883, 883, 883, 862, + 862, 862, 862, 862, 862, 862, 862, 862, + 862, 883, 883, 883, 883, 883, 883, 883, + 862, 862, 862, 862, 862, 862, 862, 862, + 862, 862, 862, 862, 862, 862, 862, 862, + 862, 862, 862, 862, 862, 862, 862, 862, + 862, 862, 883, 883, 883, 883, 862, 883, + 862, 862, 862, 862, 862, 862, 862, 862, + 894, 862, 862, 862, 862, 862, 862, 862, + 862, 862, 862, 862, 862, 862, 862, 862, + 862, 862, 883, 883, 883, 883, 883, 862, + 883, 883, 883, 883, 883, 883, 883, 883, + 883, 883, 883, 883, 883, 883, 883, 883, + 883, 883, 883, 883, 883, 883, 883, 883, + 883, 883, 883, 883, 883, 883, 883, 883, + 883, 883, 883, 883, 883, 883, 883, 883, + 883, 883, 883, 883, 883, 883, 883, 883, + 862, 862, 862, 862, 862, 862, 862, 862, + 862, 862, 883, 883, 883, 883, 883, 883, + 883, 862, 862, 862, 862, 862, 862, 862, + 862, 862, 862, 862, 862, 862, 862, 862, + 862, 862, 862, 862, 862, 862, 862, 862, + 862, 862, 862, 883, 883, 883, 883, 862, + 883, 862, 862, 862, 862, 862, 862, 862, + 862, 862, 862, 862, 884, 862, 862, 862, + 862, 862, 862, 862, 862, 862, 862, 862, + 862, 862, 862, 883, 883, 883, 883, 883, + 862, 883, 883, 883, 883, 883, 883, 883, + 883, 883, 883, 883, 883, 883, 883, 883, + 883, 883, 883, 883, 883, 883, 883, 883, + 883, 883, 883, 883, 883, 883, 883, 883, + 883, 883, 883, 883, 883, 883, 883, 883, + 883, 883, 883, 883, 883, 883, 883, 883, + 883, 862, 862, 862, 862, 862, 862, 862, + 862, 862, 862, 883, 883, 883, 883, 883, + 883, 883, 862, 862, 862, 862, 862, 862, + 862, 862, 862, 862, 862, 862, 862, 862, + 862, 862, 862, 862, 862, 862, 862, 862, + 862, 862, 862, 862, 883, 883, 883, 883, + 862, 883, 862, 862, 862, 862, 862, 862, + 862, 895, 862, 862, 862, 862, 862, 862, + 862, 862, 862, 862, 862, 862, 862, 862, + 862, 862, 862, 862, 883, 883, 883, 883, + 883, 862, 883, 883, 883, 883, 883, 883, + 883, 883, 883, 883, 883, 883, 883, 883, + 883, 883, 883, 883, 883, 883, 883, 883, + 883, 883, 883, 883, 883, 883, 883, 883, + 883, 883, 883, 883, 883, 883, 883, 883, + 883, 883, 883, 883, 883, 883, 883, 883, + 883, 883, 862, 862, 862, 862, 862, 862, + 862, 862, 862, 862, 883, 883, 883, 883, + 883, 883, 883, 862, 862, 862, 862, 862, + 862, 862, 862, 862, 862, 862, 862, 862, + 862, 862, 862, 862, 862, 862, 862, 862, + 862, 862, 862, 862, 862, 883, 883, 883, + 883, 862, 883, 862, 862, 862, 862, 862, + 862, 862, 862, 896, 862, 862, 862, 862, + 862, 862, 862, 862, 862, 862, 862, 862, + 862, 862, 862, 862, 862, 883, 883, 883, + 883, 883, 862, 883, 883, 883, 883, 883, + 883, 883, 883, 883, 883, 883, 883, 883, + 883, 883, 883, 883, 883, 883, 883, 883, + 883, 883, 883, 883, 883, 883, 883, 883, + 883, 883, 883, 883, 883, 883, 883, 883, + 883, 883, 883, 883, 883, 883, 883, 883, + 883, 883, 883, 862, 862, 862, 862, 862, + 862, 862, 862, 862, 862, 883, 883, 883, + 883, 883, 883, 883, 862, 862, 862, 862, + 862, 862, 862, 862, 862, 862, 862, 862, + 862, 862, 862, 862, 862, 862, 862, 862, + 862, 862, 862, 862, 862, 862, 883, 883, + 883, 883, 862, 883, 862, 862, 862, 862, + 862, 862, 862, 862, 862, 862, 862, 888, + 862, 862, 862, 862, 862, 862, 862, 862, + 862, 862, 862, 862, 862, 862, 883, 883, + 883, 883, 883, 862, 898, 221, 221, 221, + 898, 221, 221, 221, 221, 899, 900, 899, + 899, 899, 221, 221, 221, 221, 221, 221, + 221, 221, 221, 221, 221, 221, 898, 221, + 221, 221, 221, 221, 899, 901, 221, 902, + 221, 903, 904, 221, 905, 221, 906, 907, + 221, 908, 909, 910, 221, 221, 221, 221, + 221, 221, 221, 221, 221, 221, 911, 221, + 912, 913, 914, 915, 221, 916, 917, 916, + 916, 918, 916, 916, 916, 916, 916, 916, + 916, 916, 916, 916, 916, 916, 916, 916, + 916, 916, 916, 916, 916, 916, 916, 919, + 920, 221, 921, 922, 221, 923, 924, 925, + 926, 927, 928, 897, 897, 929, 897, 897, + 897, 930, 931, 932, 897, 897, 933, 934, + 935, 936, 897, 937, 897, 938, 897, 939, + 940, 221, 921, 221, 897, 941, 941, 941, + 941, 941, 941, 941, 941, 941, 942, 941, + 942, 942, 942, 941, 941, 941, 941, 941, + 941, 941, 941, 941, 941, 941, 941, 941, + 941, 941, 941, 941, 941, 942, 296, 941, + 941, 941, 941, 941, 941, 941, 941, 941, + 941, 941, 941, 941, 941, 897, 897, 897, + 897, 897, 897, 897, 897, 897, 897, 297, + 941, 941, 298, 941, 296, 941, 897, 897, + 897, 897, 897, 897, 897, 897, 897, 897, + 897, 897, 897, 897, 897, 897, 897, 897, + 897, 897, 897, 897, 897, 897, 897, 897, + 941, 943, 941, 941, 897, 941, 897, 897, + 897, 897, 897, 897, 897, 897, 897, 897, + 897, 897, 897, 897, 897, 897, 897, 897, + 897, 897, 897, 897, 897, 897, 897, 897, + 941, 941, 941, 941, 941, 897, 945, 944, + 944, 946, 944, 947, 949, 950, 948, 948, + 948, 948, 948, 948, 948, 948, 948, 948, + 948, 948, 948, 948, 948, 948, 948, 948, + 948, 948, 948, 948, 948, 948, 948, 948, + 948, 948, 948, 948, 948, 948, 948, 948, + 948, 948, 948, 948, 948, 948, 948, 948, + 948, 948, 948, 948, 948, 948, 948, 948, + 948, 948, 948, 948, 948, 948, 948, 948, + 948, 948, 948, 948, 948, 951, 948, 953, + 952, 954, 955, 956, 899, 957, 899, 899, + 899, 957, 957, 957, 957, 957, 957, 957, + 957, 957, 957, 957, 957, 957, 957, 957, + 957, 957, 957, 899, 957, 959, 958, 961, + 962, 961, 961, 961, 960, 960, 960, 960, + 960, 960, 960, 960, 960, 960, 960, 960, + 960, 960, 960, 960, 960, 960, 961, 960, + 221, 963, 963, 963, 963, 963, 963, 963, + 963, 963, 963, 963, 963, 963, 963, 963, + 963, 963, 963, 963, 963, 963, 963, 963, + 963, 963, 963, 963, 963, 963, 963, 963, + 963, 963, 963, 963, 963, 963, 963, 963, + 963, 963, 963, 963, 963, 963, 963, 963, + 963, 963, 963, 963, 963, 963, 963, 963, + 963, 963, 963, 963, 963, 963, 963, 963, + 963, 221, 963, 964, 965, 966, 967, 969, + 969, 969, 969, 969, 969, 969, 969, 969, + 969, 969, 969, 969, 969, 969, 969, 969, + 969, 969, 969, 969, 969, 969, 969, 969, + 969, 969, 969, 969, 969, 969, 969, 969, + 969, 969, 969, 969, 969, 969, 969, 969, + 969, 969, 969, 969, 969, 969, 969, 968, + 968, 968, 968, 968, 968, 968, 968, 968, + 968, 969, 969, 969, 969, 969, 969, 969, + 970, 970, 970, 970, 970, 970, 970, 970, + 970, 970, 970, 970, 970, 970, 970, 970, + 970, 970, 970, 970, 970, 970, 970, 970, + 970, 970, 969, 969, 969, 969, 969, 969, + 970, 970, 970, 970, 970, 970, 970, 970, + 970, 970, 970, 970, 970, 970, 970, 970, + 970, 970, 970, 970, 970, 970, 970, 970, + 970, 970, 969, 969, 969, 969, 969, 968, + 972, 971, 971, 971, 971, 971, 971, 971, + 971, 971, 971, 971, 971, 971, 971, 971, + 971, 971, 971, 971, 971, 971, 971, 221, + 971, 973, 975, 974, 974, 974, 974, 974, + 974, 974, 974, 974, 974, 974, 974, 974, + 974, 974, 974, 974, 974, 221, 974, 221, + 211, 222, 223, 222, 222, 222, 971, 971, + 971, 971, 971, 971, 971, 971, 971, 971, + 971, 971, 971, 971, 971, 971, 971, 971, + 222, 971, 971, 224, 971, 971, 971, 971, + 971, 971, 971, 971, 971, 971, 971, 971, + 225, 225, 225, 225, 225, 225, 225, 225, + 225, 225, 971, 971, 971, 221, 971, 971, + 971, 971, 971, 971, 971, 971, 971, 971, + 971, 971, 971, 971, 971, 971, 971, 971, + 971, 971, 971, 971, 971, 971, 971, 971, + 971, 971, 971, 971, 226, 971, 239, 240, + 239, 239, 239, 238, 238, 238, 238, 238, + 238, 238, 238, 238, 238, 238, 238, 238, + 238, 238, 238, 238, 238, 239, 238, 238, + 241, 238, 238, 238, 238, 238, 238, 238, + 238, 238, 238, 238, 238, 242, 242, 242, + 242, 242, 242, 242, 242, 242, 242, 238, + 238, 238, 238, 238, 238, 238, 238, 238, + 238, 238, 238, 238, 238, 238, 238, 238, + 238, 238, 238, 238, 238, 238, 238, 238, + 238, 238, 238, 238, 238, 238, 238, 238, + 238, 243, 238, 222, 223, 222, 222, 222, + 971, 971, 971, 971, 971, 971, 971, 971, + 971, 971, 971, 971, 971, 971, 971, 971, + 971, 971, 222, 971, 971, 224, 971, 971, + 971, 971, 971, 971, 971, 971, 971, 971, + 971, 971, 225, 225, 225, 225, 225, 225, + 225, 225, 225, 225, 971, 971, 971, 221, + 221, 971, 971, 971, 971, 971, 971, 971, + 971, 971, 971, 971, 971, 971, 971, 971, + 971, 971, 971, 971, 971, 971, 971, 971, + 971, 971, 971, 971, 971, 971, 226, 971, + 977, 963, 979, 978, 981, 980, 963, 982, + 982, 982, 963, 982, 982, 982, 982, 982, + 982, 982, 982, 982, 982, 982, 982, 982, + 982, 982, 982, 982, 982, 982, 982, 982, + 963, 982, 963, 963, 963, 963, 963, 963, + 963, 963, 963, 963, 963, 963, 963, 963, + 963, 963, 963, 963, 963, 963, 963, 963, + 963, 963, 963, 963, 963, 963, 963, 963, + 963, 963, 963, 984, 985, 963, 986, 247, + 987, 985, 963, 963, 988, 989, 963, 989, + 963, 247, 963, 963, 963, 963, 963, 963, + 963, 963, 963, 963, 990, 963, 991, 992, + 993, 963, 994, 983, 983, 983, 983, 983, + 983, 983, 983, 983, 983, 983, 983, 983, + 983, 983, 983, 983, 983, 983, 983, 983, + 983, 983, 983, 983, 983, 995, 963, 963, + 247, 983, 247, 983, 983, 983, 983, 983, + 983, 983, 983, 983, 983, 983, 983, 983, + 983, 983, 983, 983, 983, 983, 983, 983, + 983, 983, 983, 983, 983, 963, 996, 963, + 997, 963, 983, 998, 998, 998, 998, 998, + 998, 998, 998, 998, 998, 998, 998, 998, + 998, 998, 998, 998, 998, 998, 998, 998, + 998, 998, 998, 998, 998, 998, 998, 998, + 998, 998, 998, 998, 999, 998, 998, 998, + 998, 998, 998, 998, 998, 998, 998, 998, + 998, 998, 998, 983, 983, 983, 983, 983, + 983, 983, 983, 983, 983, 998, 998, 998, + 1000, 998, 999, 998, 983, 983, 983, 983, + 983, 983, 983, 983, 983, 983, 983, 983, + 983, 983, 983, 983, 983, 983, 983, 983, + 983, 983, 983, 983, 983, 983, 998, 998, + 998, 998, 983, 998, 983, 983, 983, 983, + 983, 983, 983, 983, 983, 983, 983, 983, + 983, 983, 983, 983, 983, 983, 983, 983, + 983, 983, 983, 983, 983, 983, 998, 998, + 998, 998, 998, 983, 1002, 1001, 1003, 1005, + 1006, 1004, 1004, 1004, 1004, 1004, 1004, 1004, + 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, + 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, + 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, + 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, + 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, + 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, + 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, + 1007, 1004, 1009, 1010, 1008, 1011, 1012, 1013, + 1014, 247, 998, 998, 1015, 998, 998, 998, + 998, 998, 998, 998, 998, 998, 998, 998, + 998, 998, 998, 998, 998, 998, 998, 998, + 998, 998, 998, 998, 998, 998, 998, 998, + 998, 998, 998, 998, 998, 998, 998, 998, + 998, 998, 998, 998, 998, 998, 998, 998, + 998, 998, 998, 998, 998, 998, 998, 998, + 998, 998, 998, 998, 998, 998, 998, 998, + 998, 998, 247, 998, 998, 998, 998, 998, + 998, 998, 998, 998, 998, 998, 998, 998, + 998, 998, 998, 998, 998, 998, 998, 998, + 998, 998, 998, 998, 998, 998, 998, 998, + 998, 998, 998, 998, 998, 998, 998, 998, + 998, 998, 998, 998, 998, 998, 998, 998, + 998, 998, 998, 998, 246, 246, 246, 246, + 246, 246, 246, 246, 246, 246, 998, 998, + 998, 998, 998, 998, 998, 246, 246, 246, + 246, 246, 246, 246, 246, 246, 246, 246, + 246, 246, 246, 246, 246, 246, 246, 246, + 246, 246, 246, 246, 246, 246, 246, 998, + 998, 998, 998, 246, 998, 246, 246, 246, + 246, 246, 246, 246, 246, 246, 246, 246, + 246, 246, 246, 246, 246, 246, 246, 246, + 246, 246, 246, 246, 246, 246, 246, 998, + 998, 998, 998, 998, 246, 249, 249, 249, + 249, 249, 249, 249, 249, 249, 249, 998, + 1016, 998, 247, 998, 247, 998, 247, 1017, + 998, 247, 998, 247, 998, 247, 247, 998, + 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, + 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, + 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, + 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, + 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, + 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, + 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, + 1020, 1020, 1018, 1018, 1018, 1018, 1018, 1018, + 1021, 1019, 1019, 1019, 1019, 1019, 1019, 1019, + 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, + 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, + 1019, 1019, 1019, 1018, 1018, 1018, 1018, 1019, + 1018, 1019, 1019, 1019, 1019, 1019, 1019, 1019, + 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, + 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, + 1019, 1019, 1019, 1018, 1018, 1018, 1018, 1018, + 1019, 1023, 1023, 1023, 1023, 1023, 1023, 1023, + 1023, 1023, 1023, 1022, 1024, 1024, 1024, 1024, + 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, + 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, + 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, + 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, + 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, + 1024, 1024, 1024, 1024, 1026, 1026, 1026, 1026, + 1026, 1026, 1026, 1026, 1026, 1026, 1024, 1024, + 1024, 1024, 1024, 1024, 1024, 1025, 1025, 1025, + 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, + 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, + 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1024, + 1024, 1024, 1024, 1025, 1024, 1025, 1025, 1025, + 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, + 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, + 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1024, + 1024, 1024, 1024, 1024, 1025, 1016, 998, 1015, + 998, 1027, 1028, 963, 1029, 262, 252, 252, + 252, 252, 252, 252, 252, 252, 252, 252, + 252, 252, 252, 252, 252, 252, 252, 252, + 252, 252, 252, 252, 252, 263, 252, 264, + 253, 253, 253, 253, 253, 253, 253, 253, + 253, 253, 253, 253, 253, 253, 253, 253, + 253, 253, 253, 253, 253, 253, 253, 253, + 253, 253, 253, 253, 263, 253, 263, 266, + 221, 963, 921, 221, 963, 963, 963, 963, + 963, 963, 963, 963, 963, 963, 963, 963, + 963, 963, 963, 963, 963, 963, 963, 963, + 963, 963, 963, 963, 963, 963, 963, 963, + 963, 963, 963, 963, 963, 963, 963, 963, + 963, 963, 963, 963, 963, 963, 963, 963, + 963, 963, 963, 963, 963, 963, 963, 963, + 963, 963, 963, 963, 963, 963, 963, 963, + 963, 963, 963, 221, 963, 221, 972, 963, + 1033, 1032, 1032, 1032, 1033, 1032, 1032, 1032, + 1032, 1034, 1035, 1034, 1034, 1034, 1032, 1032, + 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, + 1032, 1032, 1033, 1032, 1032, 1032, 1032, 1032, + 1034, 1032, 1032, 1032, 1032, 1032, 1032, 1032, + 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, + 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, + 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, + 1032, 1036, 1036, 1036, 1036, 1036, 1036, 1036, + 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, + 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, + 1036, 1036, 1036, 1032, 1037, 1032, 1032, 1036, + 1032, 1036, 1036, 1036, 1036, 1036, 1036, 1036, + 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, + 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, + 1036, 1036, 1036, 1032, 1038, 1038, 1038, 1038, + 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, + 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, + 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, + 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, + 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, + 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, + 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, + 1038, 1038, 1038, 1038, 1038, 1038, 1039, 1039, + 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, + 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, + 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, + 1038, 1038, 1038, 1038, 1039, 1038, 1039, 1039, + 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, + 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, + 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, + 1038, 1038, 1038, 1038, 1038, 1039, 1040, 1040, + 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, + 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, + 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, + 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, + 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, + 1040, 1040, 1040, 1040, 1040, 1040, 1041, 1041, + 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, + 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1041, + 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, + 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, + 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, + 1041, 1040, 1040, 1040, 1040, 1041, 1040, 1041, + 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, + 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, + 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, + 1041, 1040, 1040, 1040, 1040, 1040, 1041, 1044, + 1043, 1043, 1043, 1044, 1043, 1043, 1043, 1043, + 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, + 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, + 1043, 1044, 1043, 1043, 1043, 1043, 1043, 1043, + 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, + 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1045, + 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1043, + 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, + 1043, 1043, 1046, 1043, 1043, 1043, 1043, 1043, + 1043, 1043, 1043, 1043, 1047, 1043, 1043, 1043, + 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, + 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, + 1043, 1043, 1048, 1043, 1043, 1043, 1043, 1043, + 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, + 1043, 1043, 1043, 1043, 1049, 1043, 1043, 1050, + 1043, 1051, 1052, 1054, 1054, 1054, 1054, 1054, + 1054, 1054, 1054, 1053, 1055, 1055, 1055, 1055, + 1055, 1055, 1055, 1055, 1053, 1053, 1056, 1056, + 290, 290, 290, 1056, 290, 290, 290, 290, + 290, 290, 290, 290, 290, 290, 290, 290, + 290, 290, 290, 290, 290, 290, 290, 290, + 290, 1056, 290, 290, 290, 290, 290, 290, + 290, 290, 290, 290, 290, 290, 290, 290, + 290, 290, 290, 290, 290, 290, 290, 290, + 290, 290, 290, 290, 290, 290, 290, 290, + 290, 290, 290, 290, 290, 290, 291, 290, + 290, 290, 290, 290, 290, 290, 290, 290, + 290, 290, 290, 290, 290, 290, 290, 290, + 290, 290, 290, 290, 290, 290, 290, 290, + 290, 290, 290, 1057, 290, 1058, 1059, 1060, + 1060, 290, 290, 290, 1060, 290, 290, 290, + 290, 290, 290, 290, 290, 290, 290, 290, + 290, 290, 290, 290, 290, 290, 290, 290, + 290, 290, 1060, 290, 290, 290, 290, 290, + 290, 290, 290, 290, 290, 290, 290, 290, + 290, 290, 290, 290, 290, 290, 290, 290, + 290, 290, 290, 290, 290, 290, 290, 290, + 290, 290, 290, 290, 290, 290, 290, 291, + 290, 290, 290, 290, 290, 290, 290, 290, + 290, 290, 290, 290, 290, 290, 290, 290, + 290, 290, 290, 290, 290, 290, 290, 290, + 290, 290, 290, 290, 1061, 290, 289, 1060, + 1062, 1063, 1064, 1064, 275, 275, 275, 1064, + 275, 275, 275, 275, 275, 275, 275, 275, + 275, 275, 275, 275, 275, 275, 275, 275, + 275, 275, 275, 275, 275, 1064, 275, 275, + 275, 275, 275, 275, 275, 275, 275, 275, + 275, 275, 275, 275, 275, 275, 275, 275, + 275, 275, 275, 275, 275, 275, 275, 275, + 275, 275, 275, 275, 275, 275, 275, 275, + 275, 275, 276, 275, 275, 275, 275, 275, + 275, 275, 275, 275, 275, 275, 275, 275, + 275, 275, 275, 275, 275, 275, 275, 275, + 275, 275, 275, 275, 275, 275, 275, 1065, + 275, 1066, 1066, 1066, 1066, 1066, 1066, 1066, + 1066, 1066, 1066, 1064, 1064, 1064, 1064, 1064, + 1064, 1064, 1066, 1066, 1066, 1066, 1066, 1066, + 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, + 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, + 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, + 1064, 1064, 1066, 1066, 1066, 1066, 1066, 1066, + 1064, 1068, 1068, 1068, 1068, 1068, 1068, 1068, + 1068, 1068, 1068, 1067, 1067, 1067, 1067, 1067, + 1067, 1067, 1068, 1068, 1068, 1068, 1068, 1068, + 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, + 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, + 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, + 1067, 1067, 1068, 1068, 1068, 1068, 1068, 1068, + 1067, 1067, 1069, 1069, 1069, 1069, 1069, 1069, + 1069, 1069, 1069, 1069, 1060, 1060, 1060, 1060, + 1060, 1060, 1060, 1069, 1069, 1069, 1069, 1069, + 1069, 1060, 1060, 1060, 1060, 1060, 1060, 1060, + 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, + 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, + 1060, 1060, 1060, 1069, 1069, 1069, 1069, 1069, + 1069, 1060, 1071, 1071, 1071, 1071, 1071, 1071, + 1071, 1071, 1071, 1071, 1070, 1070, 1070, 1070, + 1070, 1070, 1070, 1071, 1071, 1071, 1071, 1071, + 1071, 1070, 1070, 1070, 1070, 1070, 1070, 1070, + 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, + 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, + 1070, 1070, 1070, 1071, 1071, 1071, 1071, 1071, + 1071, 1070, 1070, 1060, 268, 268, 268, 1060, + 268, 268, 268, 268, 268, 268, 268, 268, + 268, 268, 268, 268, 268, 268, 268, 268, + 268, 268, 268, 268, 268, 1060, 268, 268, + 268, 268, 268, 268, 268, 268, 268, 268, + 268, 268, 268, 268, 268, 268, 268, 268, + 1072, 268, 1056, 275, 275, 275, 1056, 275, + 275, 275, 275, 275, 275, 275, 275, 275, + 275, 275, 275, 275, 275, 275, 275, 275, + 275, 275, 275, 275, 1056, 275, 275, 275, + 275, 275, 275, 275, 275, 275, 275, 275, + 275, 275, 275, 275, 275, 275, 275, 275, + 275, 275, 275, 275, 275, 275, 275, 275, + 275, 275, 275, 275, 275, 275, 275, 275, + 275, 276, 275, 275, 275, 275, 275, 275, + 275, 275, 275, 275, 275, 275, 275, 275, + 275, 275, 275, 275, 275, 275, 275, 275, + 275, 275, 275, 275, 275, 275, 277, 275, + 1056, 1073, 1073, 1073, 1056, 1073, 1073, 1073, + 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, + 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, + 1073, 1073, 1056, 1073, 1073, 1073, 1073, 1073, + 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, + 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, + 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, + 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, + 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, + 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, + 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, + 1073, 1073, 1073, 1073, 1074, 1073, 1075, 1076, + 1076, 1073, 1073, 1073, 1076, 1073, 1073, 1073, + 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, + 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, + 1073, 1073, 1076, 1073, 1073, 1073, 1073, 1073, + 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, + 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, + 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, + 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, + 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, + 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, + 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, + 1073, 1073, 1073, 1073, 1077, 1073, 1078, 1078, + 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, + 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1078, + 1078, 1078, 1078, 1078, 1078, 1076, 1076, 1076, + 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, + 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, + 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1078, + 1078, 1078, 1078, 1078, 1078, 1076, 1080, 1080, + 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, + 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1080, + 1080, 1080, 1080, 1080, 1080, 1079, 1079, 1079, + 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, + 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, + 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1080, + 1080, 1080, 1080, 1080, 1080, 1079, 1079, 1076, + 268, 268, 268, 1076, 268, 268, 268, 268, + 268, 268, 268, 268, 268, 268, 268, 268, + 268, 268, 268, 268, 268, 268, 268, 268, + 268, 1076, 268, 268, 268, 268, 268, 268, + 268, 268, 268, 268, 268, 268, 268, 268, + 268, 268, 268, 268, 1072, 268, 1081, 1076, + 1076, 275, 275, 275, 1076, 275, 275, 275, + 275, 275, 275, 275, 275, 275, 275, 275, + 275, 275, 275, 275, 275, 275, 275, 275, + 275, 275, 1076, 275, 275, 275, 275, 275, + 275, 275, 275, 275, 275, 275, 275, 275, + 275, 275, 275, 275, 275, 275, 275, 275, + 275, 275, 275, 275, 275, 275, 275, 275, + 275, 275, 275, 275, 275, 275, 275, 276, + 275, 275, 275, 275, 275, 275, 275, 275, + 275, 275, 275, 275, 275, 275, 275, 275, + 275, 275, 275, 275, 275, 275, 275, 275, + 275, 275, 275, 275, 277, 275, 1083, 1083, + 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, + 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1083, + 1083, 1083, 1083, 1083, 1083, 1082, 1082, 1082, + 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, + 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, + 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1083, + 1083, 1083, 1083, 1083, 1083, 1082, 1082, 1082, + 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, + 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, + 1082, 1084, 1082, 1085, 1085, 1085, 1085, 1085, + 1085, 1085, 1085, 1085, 1085, 1082, 1082, 1082, + 1082, 1082, 1082, 1082, 1085, 1085, 1085, 1085, + 1085, 1085, 1082, 1082, 1082, 1082, 1082, 1082, + 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, + 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, + 1082, 1082, 1082, 1082, 1085, 1085, 1085, 1085, + 1085, 1085, 1082, 1086, 1086, 1086, 1086, 1086, + 1086, 1086, 1086, 1086, 1086, 1082, 1082, 1082, + 1082, 1082, 1082, 1082, 1086, 1086, 1086, 1086, + 1086, 1086, 1082, 1082, 1082, 1082, 1082, 1082, + 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, + 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, + 1082, 1082, 1082, 1082, 1086, 1086, 1086, 1086, + 1086, 1086, 1082, 1087, 1087, 1087, 1087, 1087, + 1087, 1087, 1087, 1087, 1087, 1082, 1082, 1082, + 1082, 1082, 1082, 1082, 1087, 1087, 1087, 1087, + 1087, 1087, 1082, 1082, 1082, 1082, 1082, 1082, + 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, + 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, + 1082, 1082, 1082, 1082, 1087, 1087, 1087, 1087, + 1087, 1087, 1082, 1088, 1091, 1090, 1090, 1090, + 1091, 1090, 1090, 1090, 1090, 1092, 1090, 1090, + 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, + 1090, 1090, 1090, 1090, 1090, 1090, 1091, 1090, + 1090, 1090, 1090, 1090, 1092, 1090, 1090, 1090, + 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, + 1090, 1090, 1090, 1090, 1093, 1093, 1093, 1093, + 1093, 1093, 1093, 1093, 1093, 1093, 1090, 1090, + 1090, 1090, 1090, 1090, 1090, 1093, 1093, 1093, + 1093, 1093, 1093, 1090, 1090, 1090, 1090, 1090, + 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, + 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, + 1090, 1090, 1090, 1090, 1090, 1093, 1093, 1093, + 1093, 1093, 1093, 1090, 1090, 1090, 1090, 1090, + 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, + 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, + 1090, 1094, 1090, 1091, 1090, 1090, 1090, 1091, + 1090, 1090, 1090, 1090, 1089, 1090, 1090, 1090, + 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, + 1090, 1090, 1090, 1090, 1090, 1091, 1090, 1090, + 1090, 1090, 1090, 1089, 1090, 1090, 1090, 1090, + 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, + 1090, 1090, 1090, 1095, 1095, 1095, 1095, 1095, + 1095, 1095, 1095, 1095, 1095, 1090, 1090, 1090, + 1090, 1090, 1090, 1090, 1095, 1095, 1095, 1095, + 1095, 1095, 1090, 1090, 1090, 1090, 1090, 1090, + 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, + 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, + 1090, 1090, 1090, 1090, 1095, 1095, 1095, 1095, + 1095, 1095, 1090, 1090, 1090, 1090, 1090, 1090, + 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, + 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, + 1096, 1090, 1089, 1091, 1095, 1095, 1095, 1091, + 1095, 1095, 1095, 1095, 1089, 1095, 1095, 1095, + 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, + 1095, 1095, 1095, 1095, 1095, 1091, 1095, 1095, + 1095, 1095, 1095, 1089, 1095, 1095, 1095, 1095, + 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, + 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, + 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, + 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, + 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, + 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, + 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, + 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, + 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, + 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, + 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, + 1089, 1095, 1097, 1091, 1098, 1098, 1098, 1091, + 1098, 1098, 1098, 1098, 1092, 1098, 1098, 1098, + 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, + 1098, 1098, 1098, 1098, 1098, 1091, 1098, 1098, + 1098, 1098, 1098, 1092, 1098, 1098, 1098, 1098, + 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, + 1098, 1098, 1098, 1099, 1099, 1099, 1099, 1099, + 1099, 1099, 1099, 1099, 1099, 1098, 1098, 1098, + 1098, 1098, 1098, 1098, 1099, 1099, 1099, 1099, + 1099, 1099, 1098, 1098, 1098, 1098, 1098, 1098, + 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, + 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, + 1098, 1098, 1098, 1098, 1099, 1099, 1099, 1099, + 1099, 1099, 1098, 1098, 1098, 1098, 1098, 1098, + 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, + 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, + 1089, 1098, 1091, 1098, 1098, 1098, 1091, 1098, + 1098, 1098, 1098, 1089, 1098, 1098, 1098, 1098, + 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, + 1098, 1098, 1098, 1098, 1091, 1098, 1098, 1098, + 1098, 1098, 1089, 1098, 1098, 1098, 1098, 1098, + 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, + 1098, 1098, 1095, 1095, 1095, 1095, 1095, 1095, + 1095, 1095, 1095, 1095, 1098, 1098, 1098, 1098, + 1098, 1098, 1098, 1095, 1095, 1095, 1095, 1095, + 1095, 1098, 1098, 1098, 1098, 1098, 1098, 1098, + 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, + 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, + 1098, 1098, 1098, 1095, 1095, 1095, 1095, 1095, + 1095, 1098, 1098, 1098, 1098, 1098, 1098, 1098, + 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, + 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1091, + 1098, 1091, 1098, 1098, 1098, 1091, 1098, 1098, + 1098, 1098, 1100, 1098, 1098, 1098, 1098, 1098, + 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, + 1098, 1098, 1098, 1091, 1098, 1098, 1098, 1098, + 1098, 1100, 1098, 1098, 1098, 1098, 1098, 1098, + 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, + 1098, 1101, 1101, 1101, 1101, 1101, 1101, 1101, + 1101, 1101, 1101, 1098, 1098, 1098, 1098, 1098, + 1098, 1098, 1101, 1101, 1101, 1101, 1101, 1101, + 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, + 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, + 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, + 1098, 1098, 1101, 1101, 1101, 1101, 1101, 1101, + 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, + 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, + 1098, 1098, 1098, 1098, 1098, 1098, 1102, 1098, + 1091, 1098, 1098, 1098, 1091, 1098, 1098, 1098, + 1098, 1100, 1098, 1098, 1098, 1098, 1098, 1098, + 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, + 1098, 1098, 1091, 1098, 1098, 1098, 1098, 1098, + 1100, 1098, 1098, 1098, 1098, 1098, 1098, 1098, + 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, + 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, + 1099, 1099, 1098, 1098, 1098, 1098, 1098, 1098, + 1098, 1099, 1099, 1099, 1099, 1099, 1099, 1098, + 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, + 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, + 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, + 1098, 1099, 1099, 1099, 1099, 1099, 1099, 1098, + 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, + 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, + 1098, 1098, 1098, 1098, 1098, 1102, 1098, 1103, + 1091, 1098, 1098, 1098, 1091, 1098, 1098, 1098, + 1098, 1100, 1098, 1098, 1098, 1098, 1098, 1098, + 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, + 1098, 1098, 1091, 1098, 1098, 1098, 1098, 1098, + 1100, 1098, 1098, 1098, 1098, 1098, 1098, 1098, + 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, + 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, + 1104, 1104, 1098, 1098, 1098, 1098, 1098, 1098, + 1098, 1104, 1104, 1104, 1104, 1104, 1104, 1098, + 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, + 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, + 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, + 1098, 1104, 1104, 1104, 1104, 1104, 1104, 1098, + 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, + 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, + 1098, 1098, 1098, 1098, 1098, 1102, 1098, 1091, + 1098, 1098, 1098, 1091, 1098, 1098, 1098, 1098, + 1100, 1098, 1098, 1098, 1098, 1098, 1098, 1098, + 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, + 1098, 1091, 1098, 1098, 1098, 1098, 1098, 1100, + 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, + 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1105, + 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, + 1105, 1098, 1098, 1098, 1098, 1098, 1098, 1098, + 1105, 1105, 1105, 1105, 1105, 1105, 1098, 1098, + 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, + 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, + 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, + 1105, 1105, 1105, 1105, 1105, 1105, 1098, 1098, + 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, + 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, + 1098, 1098, 1098, 1098, 1102, 1098, 1091, 1098, + 1098, 1098, 1091, 1098, 1098, 1098, 1098, 1100, + 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, + 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, + 1091, 1098, 1098, 1098, 1098, 1098, 1100, 1098, + 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, + 1098, 1098, 1098, 1098, 1098, 1098, 1106, 1106, + 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, + 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1106, + 1106, 1106, 1106, 1106, 1106, 1098, 1098, 1098, + 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, + 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, + 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1106, + 1106, 1106, 1106, 1106, 1106, 1098, 1098, 1098, + 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, + 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, + 1098, 1098, 1098, 1102, 1098, 1091, 1098, 1098, + 1098, 1091, 1098, 1098, 1098, 1098, 1100, 1098, + 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, + 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1091, + 1098, 1098, 1098, 1098, 1098, 1100, 1098, 1098, + 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, + 1098, 1098, 1098, 1098, 1098, 1107, 1107, 1107, + 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1098, + 1098, 1098, 1098, 1098, 1098, 1098, 1107, 1107, + 1107, 1107, 1107, 1107, 1098, 1098, 1098, 1098, + 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, + 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, + 1098, 1098, 1098, 1098, 1098, 1098, 1107, 1107, + 1107, 1107, 1107, 1107, 1098, 1098, 1098, 1098, + 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, + 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, + 1098, 1098, 1102, 1098, 1091, 1098, 1098, 1098, + 1091, 1098, 1098, 1098, 1098, 1100, 1098, 1098, + 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, + 1098, 1098, 1098, 1098, 1098, 1098, 1091, 1098, + 1098, 1098, 1098, 1098, 1100, 1098, 1098, 1098, + 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, + 1098, 1098, 1098, 1098, 1108, 1108, 1108, 1108, + 1108, 1108, 1108, 1108, 1108, 1108, 1098, 1098, + 1098, 1098, 1098, 1098, 1098, 1108, 1108, 1108, + 1108, 1108, 1108, 1098, 1098, 1098, 1098, 1098, + 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, + 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, + 1098, 1098, 1098, 1098, 1098, 1108, 1108, 1108, + 1108, 1108, 1108, 1098, 1098, 1098, 1098, 1098, + 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, + 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, + 1098, 1102, 1098, 1091, 1098, 1098, 1098, 1091, + 1098, 1098, 1098, 1098, 1089, 1098, 1098, 1098, + 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, + 1098, 1098, 1098, 1098, 1098, 1091, 1098, 1098, + 1098, 1098, 1098, 1089, 1098, 1098, 1098, 1098, + 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, + 1098, 1098, 1098, 1108, 1108, 1108, 1108, 1108, + 1108, 1108, 1108, 1108, 1108, 1098, 1098, 1098, + 1098, 1098, 1098, 1098, 1108, 1108, 1108, 1108, + 1108, 1108, 1098, 1098, 1098, 1098, 1098, 1098, + 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, + 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, + 1098, 1098, 1098, 1098, 1108, 1108, 1108, 1108, + 1108, 1108, 1098, 1098, 1098, 1098, 1098, 1098, + 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, + 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, + 1089, 1098, 1091, 1098, 1098, 1098, 1091, 1098, + 1098, 1098, 1098, 1109, 1098, 1098, 1098, 1098, + 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, + 1098, 1098, 1098, 1098, 1091, 1098, 1098, 1098, + 1098, 1098, 1109, 1098, 1098, 1098, 1098, 1098, + 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, + 1098, 1098, 1110, 1110, 1110, 1110, 1110, 1110, + 1110, 1110, 1110, 1110, 1098, 1098, 1098, 1098, + 1098, 1098, 1098, 1110, 1110, 1110, 1110, 1110, + 1110, 1098, 1098, 1098, 1098, 1098, 1098, 1098, + 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, + 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, + 1098, 1098, 1098, 1110, 1110, 1110, 1110, 1110, + 1110, 1098, 1098, 1098, 1098, 1098, 1098, 1098, + 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, + 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1102, + 1098, 1091, 1098, 1098, 1098, 1091, 1098, 1098, + 1098, 1098, 1109, 1098, 1098, 1098, 1098, 1098, + 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, + 1098, 1098, 1098, 1091, 1098, 1098, 1098, 1098, + 1098, 1109, 1098, 1098, 1098, 1098, 1098, 1098, + 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, + 1098, 1111, 1111, 1111, 1111, 1111, 1111, 1111, + 1111, 1111, 1111, 1098, 1098, 1098, 1098, 1098, + 1098, 1098, 1111, 1111, 1111, 1111, 1111, 1111, + 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, + 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, + 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, + 1098, 1098, 1111, 1111, 1111, 1111, 1111, 1111, + 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, + 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, + 1098, 1098, 1098, 1098, 1098, 1098, 1102, 1098, + 1091, 1098, 1098, 1098, 1091, 1098, 1098, 1098, + 1098, 1109, 1098, 1098, 1098, 1098, 1098, 1098, + 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, + 1098, 1098, 1091, 1098, 1098, 1098, 1098, 1098, + 1109, 1098, 1098, 1098, 1098, 1098, 1098, 1098, + 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, + 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, + 1112, 1112, 1098, 1098, 1098, 1098, 1098, 1098, + 1098, 1112, 1112, 1112, 1112, 1112, 1112, 1098, + 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, + 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, + 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, + 1098, 1112, 1112, 1112, 1112, 1112, 1112, 1098, + 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, + 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, + 1098, 1098, 1098, 1098, 1098, 1089, 1098, 1091, + 1098, 1098, 1098, 1091, 1098, 1098, 1098, 1098, + 1109, 1098, 1098, 1098, 1098, 1098, 1098, 1098, + 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, + 1098, 1091, 1098, 1098, 1098, 1098, 1098, 1109, + 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, + 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1113, + 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, + 1113, 1098, 1098, 1098, 1098, 1098, 1098, 1098, + 1113, 1113, 1113, 1113, 1113, 1113, 1098, 1098, + 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, + 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, + 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, + 1113, 1113, 1113, 1113, 1113, 1113, 1098, 1098, + 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, + 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, + 1098, 1098, 1098, 1098, 1089, 1098, 1091, 1098, + 1098, 1098, 1091, 1098, 1098, 1098, 1098, 1109, + 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, + 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, + 1091, 1098, 1098, 1098, 1098, 1098, 1109, 1098, + 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, + 1098, 1098, 1098, 1098, 1098, 1098, 1114, 1114, + 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, + 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1114, + 1114, 1114, 1114, 1114, 1114, 1098, 1098, 1098, + 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, + 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, + 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1114, + 1114, 1114, 1114, 1114, 1114, 1098, 1098, 1098, + 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, + 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, + 1098, 1098, 1098, 1089, 1098, 1091, 1098, 1098, + 1098, 1091, 1098, 1098, 1098, 1098, 1109, 1098, + 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, + 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1091, + 1098, 1098, 1098, 1098, 1098, 1109, 1098, 1098, + 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, + 1098, 1098, 1098, 1098, 1098, 1115, 1115, 1115, + 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1098, + 1098, 1098, 1098, 1098, 1098, 1098, 1115, 1115, + 1115, 1115, 1115, 1115, 1098, 1098, 1098, 1098, + 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, + 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, + 1098, 1098, 1098, 1098, 1098, 1098, 1115, 1115, + 1115, 1115, 1115, 1115, 1098, 1098, 1098, 1098, + 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, + 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, + 1098, 1098, 1089, 1098, 1091, 1098, 1098, 1098, + 1091, 1098, 1098, 1098, 1098, 1109, 1098, 1098, + 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, + 1098, 1098, 1098, 1098, 1098, 1098, 1091, 1098, + 1098, 1098, 1098, 1098, 1109, 1098, 1098, 1098, + 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, + 1098, 1098, 1098, 1098, 1116, 1116, 1116, 1116, + 1116, 1116, 1116, 1116, 1116, 1116, 1098, 1098, + 1098, 1098, 1098, 1098, 1098, 1116, 1116, 1116, + 1116, 1116, 1116, 1098, 1098, 1098, 1098, 1098, + 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, + 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, + 1098, 1098, 1098, 1098, 1098, 1116, 1116, 1116, + 1116, 1116, 1116, 1098, 1098, 1098, 1098, 1098, + 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, + 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, + 1098, 1089, 1098, 1091, 1098, 1098, 1098, 1091, + 1098, 1098, 1098, 1098, 1109, 1098, 1098, 1098, + 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, + 1098, 1098, 1098, 1098, 1098, 1091, 1098, 1098, + 1098, 1098, 1098, 1109, 1098, 1098, 1098, 1098, + 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, + 1098, 1098, 1098, 1108, 1108, 1108, 1108, 1108, + 1108, 1108, 1108, 1108, 1108, 1098, 1098, 1098, + 1098, 1098, 1098, 1098, 1108, 1108, 1108, 1108, + 1108, 1108, 1098, 1098, 1098, 1098, 1098, 1098, + 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, + 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, + 1098, 1098, 1098, 1098, 1108, 1108, 1108, 1108, + 1108, 1108, 1098, 1098, 1098, 1098, 1098, 1098, + 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, + 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, + 1089, 1098, 1091, 1098, 1098, 1098, 1091, 1098, + 1098, 1098, 1098, 1109, 1098, 1098, 1098, 1098, + 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, + 1098, 1098, 1098, 1098, 1091, 1098, 1098, 1098, + 1098, 1098, 1109, 1098, 1098, 1098, 1098, 1098, + 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, + 1098, 1098, 1117, 1117, 1117, 1117, 1117, 1117, + 1117, 1117, 1117, 1117, 1098, 1098, 1098, 1098, + 1098, 1098, 1098, 1117, 1117, 1117, 1117, 1117, + 1117, 1098, 1098, 1098, 1098, 1098, 1098, 1098, + 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, + 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, + 1098, 1098, 1098, 1117, 1117, 1117, 1117, 1117, + 1117, 1098, 1098, 1098, 1098, 1098, 1098, 1098, + 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, + 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1102, + 1098, 1091, 1098, 1098, 1098, 1091, 1098, 1098, + 1098, 1098, 1109, 1098, 1098, 1098, 1098, 1098, + 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, + 1098, 1098, 1098, 1091, 1098, 1098, 1098, 1098, + 1098, 1109, 1098, 1098, 1098, 1098, 1098, 1098, + 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, + 1098, 1118, 1118, 1118, 1118, 1118, 1118, 1118, + 1118, 1118, 1118, 1098, 1098, 1098, 1098, 1098, + 1098, 1098, 1118, 1118, 1118, 1118, 1118, 1118, + 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, + 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, + 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, + 1098, 1098, 1118, 1118, 1118, 1118, 1118, 1118, + 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, + 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, + 1098, 1098, 1098, 1098, 1098, 1098, 1102, 1098, + 1091, 1098, 1098, 1098, 1091, 1098, 1098, 1098, + 1098, 1109, 1098, 1098, 1098, 1098, 1098, 1098, + 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, + 1098, 1098, 1091, 1098, 1098, 1098, 1098, 1098, + 1109, 1098, 1098, 1098, 1098, 1098, 1098, 1098, + 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, + 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, + 1119, 1119, 1098, 1098, 1098, 1098, 1098, 1098, + 1098, 1119, 1119, 1119, 1119, 1119, 1119, 1098, + 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, + 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, + 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, + 1098, 1119, 1119, 1119, 1119, 1119, 1119, 1098, + 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, + 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, + 1098, 1098, 1098, 1098, 1098, 1102, 1098, 1091, + 1098, 1098, 1098, 1091, 1098, 1098, 1098, 1098, + 1109, 1098, 1098, 1098, 1098, 1098, 1098, 1098, + 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, + 1098, 1091, 1098, 1098, 1098, 1098, 1098, 1109, + 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, + 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1120, + 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, + 1120, 1098, 1098, 1098, 1098, 1098, 1098, 1098, + 1120, 1120, 1120, 1120, 1120, 1120, 1098, 1098, + 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, + 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, + 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, + 1120, 1120, 1120, 1120, 1120, 1120, 1098, 1098, + 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, + 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, + 1098, 1098, 1098, 1098, 1102, 1098, 1091, 1098, + 1098, 1098, 1091, 1098, 1098, 1098, 1098, 1109, + 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, + 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, + 1091, 1098, 1098, 1098, 1098, 1098, 1109, 1098, + 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, + 1098, 1098, 1098, 1098, 1098, 1098, 1108, 1108, + 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, + 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1108, + 1108, 1108, 1108, 1108, 1108, 1098, 1098, 1098, + 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, + 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, + 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1108, + 1108, 1108, 1108, 1108, 1108, 1098, 1098, 1098, + 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, + 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, + 1098, 1098, 1098, 1102, 1098, 1121, 1122, 1124, + 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, + 1124, 1123, 1123, 1123, 1123, 1123, 1123, 1123, + 1124, 1124, 1124, 1124, 1124, 1124, 1123, 1123, + 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, + 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, + 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, + 1124, 1124, 1124, 1124, 1124, 1124, 1123, 1123, + 211, 211, 211, 211, 211, 211, 211, 211, + 211, 211, 211, 211, 211, 211, 211, 211, + 211, 211, 211, 211, 211, 211, 211, 211, + 211, 211, 211, 211, 211, 211, 211, 211, + 211, 296, 211, 211, 211, 211, 211, 211, + 211, 211, 211, 211, 211, 211, 211, 211, + 295, 295, 295, 295, 295, 295, 295, 295, + 295, 295, 297, 211, 211, 298, 211, 296, + 211, 295, 295, 295, 295, 295, 295, 295, + 295, 295, 295, 295, 295, 295, 295, 295, + 295, 295, 295, 295, 295, 295, 295, 295, + 295, 295, 295, 211, 211, 211, 211, 295, + 211, 295, 295, 295, 295, 295, 295, 295, + 295, 295, 295, 295, 295, 295, 295, 295, + 295, 295, 295, 295, 295, 295, 295, 295, + 295, 295, 295, 211, 211, 211, 211, 211, + 295, 963, 963, 963, 963, 963, 963, 963, + 963, 963, 963, 963, 963, 963, 963, 963, + 963, 963, 963, 963, 963, 963, 963, 963, + 963, 963, 963, 963, 963, 963, 963, 963, + 963, 963, 296, 963, 963, 963, 963, 963, + 963, 963, 963, 963, 963, 963, 963, 963, + 963, 295, 295, 295, 295, 295, 295, 295, + 295, 295, 295, 297, 963, 963, 298, 963, + 296, 963, 295, 295, 295, 295, 1125, 295, + 295, 295, 295, 295, 295, 295, 295, 295, + 295, 295, 295, 295, 295, 295, 295, 295, + 295, 295, 295, 295, 963, 963, 963, 963, + 295, 963, 295, 295, 295, 295, 295, 295, + 295, 295, 295, 295, 295, 295, 295, 295, + 295, 295, 295, 295, 295, 295, 295, 295, + 295, 295, 295, 295, 963, 963, 963, 963, + 963, 295, 963, 963, 963, 963, 963, 963, + 963, 963, 963, 963, 963, 963, 963, 963, + 963, 963, 963, 963, 963, 963, 963, 963, + 963, 963, 963, 963, 963, 963, 963, 963, + 963, 963, 963, 296, 963, 963, 963, 963, + 963, 963, 963, 963, 963, 963, 963, 963, + 963, 963, 295, 295, 295, 295, 295, 295, + 295, 295, 295, 295, 297, 963, 963, 298, + 963, 296, 963, 295, 295, 295, 295, 295, + 295, 295, 295, 295, 295, 295, 295, 295, + 1126, 295, 295, 295, 295, 295, 295, 295, + 295, 295, 295, 295, 295, 963, 963, 963, + 963, 295, 963, 295, 295, 295, 295, 295, + 295, 295, 295, 295, 295, 295, 295, 295, + 295, 295, 295, 295, 295, 295, 295, 295, + 295, 295, 295, 295, 295, 963, 963, 963, + 963, 963, 295, 1127, 1128, 963, 958, 941, + 941, 941, 941, 941, 941, 941, 941, 941, + 942, 941, 942, 942, 942, 941, 941, 941, + 941, 941, 941, 941, 941, 941, 941, 941, + 941, 941, 941, 941, 941, 941, 941, 942, + 296, 941, 941, 941, 941, 941, 941, 941, + 941, 941, 941, 941, 941, 941, 941, 897, + 897, 897, 897, 897, 897, 897, 897, 897, + 897, 297, 941, 941, 298, 941, 296, 941, + 897, 897, 897, 897, 897, 897, 897, 897, + 897, 897, 897, 897, 897, 897, 897, 897, + 897, 897, 897, 897, 897, 897, 897, 897, + 897, 897, 941, 943, 941, 941, 1129, 941, + 897, 897, 897, 897, 897, 897, 897, 897, + 897, 897, 897, 897, 897, 897, 897, 897, + 897, 897, 897, 897, 897, 897, 897, 897, + 897, 897, 941, 941, 941, 941, 941, 897, + 941, 941, 941, 941, 941, 941, 941, 941, + 941, 942, 941, 942, 942, 942, 941, 941, + 941, 941, 941, 941, 941, 941, 941, 941, + 941, 941, 941, 941, 941, 941, 941, 941, + 942, 296, 941, 941, 941, 941, 941, 941, + 941, 941, 941, 941, 941, 941, 941, 941, + 897, 897, 897, 897, 897, 897, 897, 897, + 897, 897, 297, 941, 941, 298, 941, 296, + 941, 897, 897, 897, 897, 1130, 1131, 897, + 897, 897, 897, 897, 1132, 897, 897, 897, + 897, 897, 897, 897, 897, 897, 897, 897, + 897, 897, 897, 941, 943, 941, 941, 897, + 941, 897, 897, 897, 897, 897, 897, 897, + 897, 897, 897, 897, 897, 897, 897, 897, + 897, 897, 897, 897, 897, 897, 897, 897, + 897, 897, 897, 941, 941, 941, 941, 941, + 897, 941, 941, 941, 941, 941, 941, 941, + 941, 941, 942, 941, 942, 942, 942, 941, + 941, 941, 941, 941, 941, 941, 941, 941, + 941, 941, 941, 941, 941, 941, 941, 941, + 941, 942, 296, 941, 941, 941, 941, 941, + 941, 941, 941, 941, 941, 941, 941, 941, + 941, 897, 897, 897, 897, 897, 897, 897, + 897, 897, 897, 297, 941, 941, 298, 941, + 296, 941, 897, 897, 897, 897, 897, 897, + 897, 897, 897, 897, 897, 897, 897, 1133, + 897, 897, 897, 897, 897, 897, 897, 897, + 897, 897, 897, 897, 941, 943, 941, 941, + 897, 941, 897, 897, 897, 897, 897, 897, + 897, 897, 897, 897, 897, 897, 897, 897, + 897, 897, 897, 897, 897, 897, 897, 897, + 897, 897, 897, 897, 941, 941, 941, 941, + 941, 897, 941, 941, 941, 941, 941, 941, + 941, 941, 941, 942, 941, 942, 942, 942, + 941, 941, 941, 941, 941, 941, 941, 941, + 941, 941, 941, 941, 941, 941, 941, 941, + 941, 941, 942, 296, 941, 941, 941, 941, + 941, 941, 941, 941, 941, 941, 941, 941, + 941, 941, 897, 897, 897, 897, 897, 897, + 897, 897, 897, 897, 297, 941, 941, 298, + 941, 296, 941, 897, 897, 1134, 897, 897, + 897, 897, 897, 897, 897, 897, 897, 897, + 897, 897, 897, 897, 897, 897, 897, 897, + 897, 897, 897, 897, 897, 941, 943, 941, + 941, 897, 941, 897, 897, 897, 897, 897, + 897, 897, 897, 897, 897, 897, 897, 897, + 897, 897, 897, 897, 897, 897, 897, 897, + 897, 897, 897, 897, 897, 941, 941, 941, + 941, 941, 897, 941, 941, 941, 941, 941, + 941, 941, 941, 941, 942, 941, 942, 942, + 942, 941, 941, 941, 941, 941, 941, 941, + 941, 941, 941, 941, 941, 941, 941, 941, + 941, 941, 941, 942, 296, 941, 941, 941, + 941, 941, 941, 941, 941, 941, 941, 941, + 941, 941, 941, 897, 897, 897, 897, 897, + 897, 897, 897, 897, 897, 297, 941, 941, + 298, 941, 296, 941, 897, 897, 897, 897, + 897, 897, 897, 897, 897, 897, 897, 897, + 897, 897, 1135, 897, 897, 897, 897, 897, + 897, 897, 897, 897, 897, 897, 941, 943, + 941, 941, 897, 941, 897, 897, 897, 897, + 897, 897, 897, 897, 897, 897, 897, 897, + 897, 897, 897, 897, 897, 897, 897, 897, + 897, 897, 897, 897, 897, 897, 941, 941, + 941, 941, 941, 897, 941, 941, 941, 941, + 941, 941, 941, 941, 941, 942, 941, 942, + 942, 942, 941, 941, 941, 941, 941, 941, + 941, 941, 941, 941, 941, 941, 941, 941, + 941, 941, 941, 941, 942, 296, 941, 941, + 941, 941, 941, 941, 941, 941, 941, 941, + 941, 941, 941, 941, 897, 897, 897, 897, + 897, 897, 897, 897, 897, 897, 297, 941, + 941, 298, 941, 296, 941, 897, 897, 897, + 1136, 897, 897, 897, 897, 897, 897, 897, + 897, 897, 897, 897, 897, 897, 897, 897, + 897, 897, 897, 897, 897, 897, 897, 941, + 943, 941, 941, 897, 941, 897, 897, 897, + 897, 897, 897, 897, 897, 897, 897, 897, + 897, 897, 897, 897, 897, 897, 897, 897, + 897, 897, 897, 897, 897, 897, 897, 941, + 941, 941, 941, 941, 897, 941, 941, 941, + 941, 941, 941, 941, 941, 941, 942, 941, + 942, 942, 942, 941, 941, 941, 941, 941, + 941, 941, 941, 941, 941, 941, 941, 941, + 941, 941, 941, 941, 941, 942, 296, 941, + 941, 941, 941, 941, 941, 941, 941, 941, + 941, 941, 941, 941, 941, 897, 897, 897, + 897, 897, 897, 897, 897, 897, 897, 297, + 941, 941, 298, 941, 296, 941, 897, 897, + 897, 897, 897, 897, 897, 897, 1137, 897, + 897, 897, 897, 897, 897, 897, 897, 897, + 897, 897, 897, 897, 897, 897, 897, 897, + 941, 943, 941, 941, 897, 941, 897, 897, + 897, 897, 897, 897, 897, 897, 897, 897, + 897, 897, 897, 897, 897, 897, 897, 897, + 897, 897, 897, 897, 897, 897, 897, 897, + 941, 941, 941, 941, 941, 897, 941, 941, + 941, 941, 941, 941, 941, 941, 941, 942, + 941, 942, 942, 942, 941, 941, 941, 941, + 941, 941, 941, 941, 941, 941, 941, 941, + 941, 941, 941, 941, 941, 941, 942, 296, + 941, 941, 941, 941, 941, 941, 941, 941, + 941, 941, 941, 941, 941, 941, 897, 897, + 897, 897, 897, 897, 897, 897, 897, 897, + 297, 941, 941, 298, 941, 296, 941, 897, + 897, 897, 897, 897, 897, 897, 897, 897, + 897, 897, 897, 897, 1138, 897, 897, 897, + 897, 897, 897, 897, 897, 897, 897, 897, + 897, 941, 943, 941, 941, 897, 941, 897, + 897, 897, 897, 897, 897, 897, 897, 897, + 897, 897, 897, 897, 897, 897, 897, 897, + 897, 897, 897, 897, 897, 897, 897, 897, + 897, 941, 941, 941, 941, 941, 897, 941, + 941, 941, 941, 941, 941, 941, 941, 941, + 942, 941, 942, 942, 942, 941, 941, 941, + 941, 941, 941, 941, 941, 941, 941, 941, + 941, 941, 941, 941, 941, 941, 941, 942, + 296, 941, 941, 941, 941, 941, 941, 941, + 941, 941, 941, 941, 941, 941, 941, 897, + 897, 897, 897, 897, 897, 897, 897, 897, + 897, 297, 941, 941, 298, 941, 296, 941, + 897, 897, 897, 897, 897, 897, 1139, 897, + 897, 897, 897, 897, 897, 897, 897, 897, + 897, 897, 897, 897, 897, 897, 897, 897, + 897, 897, 941, 943, 941, 941, 897, 941, + 897, 897, 897, 897, 897, 897, 897, 897, + 897, 897, 897, 897, 897, 897, 897, 897, + 897, 897, 897, 897, 897, 897, 897, 897, + 897, 897, 941, 941, 941, 941, 941, 897, + 941, 941, 941, 941, 941, 941, 941, 941, + 941, 942, 941, 942, 942, 942, 941, 941, + 941, 941, 941, 941, 941, 941, 941, 941, + 941, 941, 941, 941, 941, 941, 941, 941, + 942, 296, 941, 941, 941, 941, 941, 941, + 941, 941, 941, 941, 941, 941, 941, 941, + 897, 897, 897, 897, 897, 897, 897, 897, + 897, 897, 297, 941, 941, 298, 941, 296, + 941, 897, 897, 897, 897, 897, 897, 897, + 897, 897, 897, 897, 897, 897, 897, 897, + 897, 897, 897, 897, 897, 897, 897, 897, + 897, 897, 897, 941, 943, 941, 941, 1140, + 941, 897, 897, 897, 897, 897, 897, 897, + 897, 897, 897, 897, 897, 897, 897, 897, + 897, 897, 897, 897, 897, 897, 897, 897, + 897, 897, 897, 941, 941, 941, 941, 941, + 897, 941, 941, 941, 941, 941, 941, 941, + 941, 941, 942, 941, 942, 942, 942, 941, + 941, 941, 941, 941, 941, 941, 941, 941, + 941, 941, 941, 941, 941, 941, 941, 941, + 941, 942, 296, 941, 941, 941, 941, 941, + 941, 941, 941, 941, 941, 941, 941, 941, + 941, 897, 897, 897, 897, 897, 897, 897, + 897, 897, 897, 297, 941, 941, 298, 941, + 296, 941, 897, 897, 897, 897, 897, 897, + 897, 897, 897, 897, 897, 897, 897, 897, + 897, 897, 897, 897, 897, 897, 897, 897, + 897, 897, 897, 897, 941, 943, 941, 941, + 1141, 941, 897, 897, 897, 897, 897, 897, + 897, 897, 897, 897, 897, 897, 897, 897, + 897, 897, 897, 897, 897, 897, 897, 897, + 897, 897, 897, 897, 941, 941, 941, 941, + 941, 897, 211, 211, 211, 211, 211, 211, + 211, 211, 211, 211, 211, 211, 211, 211, + 211, 211, 211, 211, 211, 211, 211, 211, + 211, 211, 211, 211, 211, 211, 211, 211, + 211, 211, 211, 296, 211, 211, 211, 211, + 211, 211, 211, 211, 211, 211, 211, 211, + 211, 211, 897, 897, 897, 897, 897, 897, + 897, 897, 897, 897, 297, 211, 211, 298, + 211, 296, 211, 897, 897, 897, 897, 897, + 897, 897, 897, 897, 897, 897, 897, 897, + 897, 897, 897, 897, 897, 897, 897, 897, + 897, 897, 897, 897, 897, 211, 211, 211, + 211, 897, 211, 897, 897, 897, 897, 897, + 897, 897, 897, 897, 897, 897, 897, 897, + 897, 897, 897, 897, 897, 897, 897, 897, + 897, 897, 897, 897, 897, 211, 211, 211, + 211, 211, 897, 941, 941, 941, 941, 941, + 941, 941, 941, 941, 942, 941, 942, 942, + 942, 941, 941, 941, 941, 941, 941, 941, + 941, 941, 941, 941, 941, 941, 941, 941, + 941, 941, 941, 942, 296, 941, 941, 941, + 941, 941, 941, 941, 941, 941, 941, 941, + 941, 941, 941, 897, 897, 897, 897, 897, + 897, 897, 897, 897, 897, 297, 941, 941, + 298, 941, 296, 941, 897, 897, 897, 897, + 897, 897, 897, 897, 1142, 897, 897, 897, + 897, 897, 897, 897, 897, 897, 897, 897, + 897, 897, 897, 897, 897, 897, 941, 943, + 941, 941, 897, 941, 897, 897, 897, 897, + 897, 897, 897, 897, 897, 897, 897, 897, + 897, 897, 897, 897, 897, 897, 897, 897, + 897, 897, 897, 897, 897, 897, 941, 941, + 941, 941, 941, 897, 941, 941, 941, 941, + 941, 941, 941, 941, 941, 942, 941, 942, + 942, 942, 941, 941, 941, 941, 941, 941, + 941, 941, 941, 941, 941, 941, 941, 941, + 941, 941, 941, 941, 942, 296, 941, 941, + 941, 941, 941, 941, 941, 941, 941, 941, + 941, 941, 941, 941, 897, 897, 897, 897, + 897, 897, 897, 897, 897, 897, 297, 941, + 941, 298, 941, 296, 941, 897, 897, 897, + 897, 897, 897, 897, 897, 897, 897, 897, + 1143, 897, 897, 897, 897, 897, 897, 897, + 897, 897, 897, 897, 897, 897, 897, 941, + 943, 941, 941, 897, 941, 897, 897, 897, + 897, 897, 897, 897, 897, 897, 897, 897, + 897, 897, 897, 897, 897, 897, 897, 897, + 897, 897, 897, 897, 897, 897, 897, 941, + 941, 941, 941, 941, 897, 941, 941, 941, + 941, 941, 941, 941, 941, 941, 942, 941, + 942, 942, 942, 941, 941, 941, 941, 941, + 941, 941, 941, 941, 941, 941, 941, 941, + 941, 941, 941, 941, 941, 942, 296, 941, + 941, 941, 941, 941, 941, 941, 941, 941, + 941, 941, 941, 941, 941, 897, 897, 897, + 897, 897, 897, 897, 897, 897, 897, 297, + 941, 941, 298, 941, 296, 941, 897, 897, + 897, 897, 1139, 897, 897, 897, 897, 897, + 897, 897, 897, 897, 897, 897, 897, 897, + 897, 897, 897, 897, 897, 897, 897, 897, + 941, 943, 941, 941, 897, 941, 897, 897, + 897, 897, 897, 897, 897, 897, 897, 897, + 897, 897, 897, 897, 897, 897, 897, 897, + 897, 897, 897, 897, 897, 897, 897, 897, + 941, 941, 941, 941, 941, 897, 941, 941, + 941, 941, 941, 941, 941, 941, 941, 942, + 941, 942, 942, 942, 941, 941, 941, 941, + 941, 941, 941, 941, 941, 941, 941, 941, + 941, 941, 941, 941, 941, 941, 942, 296, + 941, 941, 941, 941, 941, 941, 941, 941, + 941, 941, 941, 941, 941, 941, 897, 897, + 897, 897, 897, 897, 897, 897, 897, 897, + 297, 941, 941, 298, 941, 296, 941, 897, + 897, 897, 897, 897, 897, 897, 897, 1144, + 897, 897, 897, 897, 897, 897, 897, 897, + 897, 897, 897, 897, 897, 897, 897, 897, + 897, 941, 943, 941, 941, 897, 941, 897, + 897, 897, 897, 897, 897, 897, 897, 897, + 897, 897, 897, 897, 897, 897, 897, 897, + 897, 897, 897, 897, 897, 897, 897, 897, + 897, 941, 941, 941, 941, 941, 897, 941, + 941, 941, 941, 941, 941, 941, 941, 941, + 942, 941, 942, 942, 942, 941, 941, 941, + 941, 941, 941, 941, 941, 941, 941, 941, + 941, 941, 941, 941, 941, 941, 941, 942, + 296, 941, 941, 941, 941, 941, 941, 941, + 941, 941, 941, 941, 941, 941, 941, 897, + 897, 897, 897, 897, 897, 897, 897, 897, + 897, 297, 941, 941, 298, 941, 296, 941, + 897, 897, 897, 897, 897, 897, 897, 897, + 897, 897, 897, 897, 897, 1143, 897, 897, + 897, 897, 897, 897, 897, 897, 897, 897, + 897, 897, 941, 943, 941, 941, 897, 941, + 897, 897, 897, 897, 897, 897, 897, 897, + 897, 897, 897, 897, 897, 897, 897, 897, + 897, 897, 897, 897, 897, 897, 897, 897, + 897, 897, 941, 941, 941, 941, 941, 897, + 941, 941, 941, 941, 941, 941, 941, 941, + 941, 942, 941, 942, 942, 942, 941, 941, + 941, 941, 941, 941, 941, 941, 941, 941, + 941, 941, 941, 941, 941, 941, 941, 941, + 942, 296, 941, 941, 941, 941, 941, 941, + 941, 941, 941, 941, 941, 941, 941, 941, + 897, 897, 897, 897, 897, 897, 897, 897, + 897, 897, 297, 941, 941, 298, 941, 296, + 941, 897, 897, 897, 897, 897, 897, 897, + 897, 897, 897, 897, 897, 897, 897, 897, + 897, 897, 897, 897, 897, 897, 897, 897, + 897, 897, 897, 941, 943, 941, 941, 897, + 941, 897, 897, 897, 897, 897, 897, 897, + 897, 897, 897, 897, 1145, 897, 1146, 897, + 897, 897, 897, 897, 897, 897, 897, 897, + 897, 897, 897, 941, 941, 941, 941, 941, + 897, 941, 941, 941, 941, 941, 941, 941, + 941, 941, 942, 941, 942, 942, 942, 941, + 941, 941, 941, 941, 941, 941, 941, 941, + 941, 941, 941, 941, 941, 941, 941, 941, + 941, 942, 296, 941, 941, 941, 941, 941, + 941, 941, 941, 941, 941, 941, 941, 941, + 941, 897, 897, 897, 897, 897, 897, 897, + 897, 897, 897, 297, 941, 941, 298, 941, + 296, 941, 897, 897, 897, 897, 897, 897, + 897, 897, 897, 897, 897, 897, 897, 897, + 897, 897, 897, 897, 897, 897, 897, 897, + 897, 897, 897, 897, 941, 943, 941, 941, + 897, 941, 897, 897, 897, 897, 897, 897, + 897, 897, 1147, 897, 897, 897, 897, 897, + 897, 897, 897, 897, 897, 897, 897, 897, + 897, 897, 897, 897, 941, 941, 941, 941, + 941, 897, 941, 941, 941, 941, 941, 941, + 941, 941, 941, 942, 941, 942, 942, 942, + 941, 941, 941, 941, 941, 941, 941, 941, + 941, 941, 941, 941, 941, 941, 941, 941, + 941, 941, 942, 296, 941, 941, 941, 941, + 941, 941, 941, 941, 941, 941, 941, 941, + 941, 941, 897, 897, 897, 897, 897, 897, + 897, 897, 897, 897, 297, 941, 941, 298, + 941, 296, 941, 897, 897, 897, 897, 897, + 897, 897, 897, 897, 897, 897, 897, 897, + 897, 897, 897, 897, 897, 897, 897, 897, + 897, 897, 897, 897, 897, 941, 943, 941, + 941, 897, 941, 1148, 897, 897, 897, 897, + 897, 897, 897, 897, 897, 897, 897, 897, + 897, 897, 897, 897, 897, 897, 897, 897, + 897, 897, 897, 897, 897, 941, 941, 941, + 941, 941, 897, 941, 941, 941, 941, 941, + 941, 941, 941, 941, 942, 941, 942, 942, + 942, 941, 941, 941, 941, 941, 941, 941, + 941, 941, 941, 941, 941, 941, 941, 941, + 941, 941, 941, 942, 296, 941, 941, 941, + 941, 941, 941, 941, 941, 941, 941, 941, + 941, 941, 941, 897, 897, 897, 897, 897, + 897, 897, 897, 897, 897, 297, 941, 941, + 298, 941, 296, 941, 897, 897, 897, 897, + 897, 897, 897, 897, 897, 897, 897, 897, + 897, 897, 897, 897, 897, 897, 897, 897, + 897, 897, 897, 897, 897, 897, 941, 943, + 941, 941, 897, 941, 897, 897, 897, 897, + 897, 897, 897, 897, 897, 897, 897, 897, + 897, 897, 897, 897, 897, 897, 1141, 897, + 897, 897, 897, 897, 897, 897, 941, 941, + 941, 941, 941, 897, 941, 941, 941, 941, + 941, 941, 941, 941, 941, 942, 941, 942, + 942, 942, 941, 941, 941, 941, 941, 941, + 941, 941, 941, 941, 941, 941, 941, 941, + 941, 941, 941, 941, 942, 296, 941, 941, + 941, 941, 941, 941, 941, 941, 941, 941, + 941, 941, 941, 941, 897, 897, 897, 897, + 897, 897, 897, 897, 897, 897, 297, 941, + 941, 298, 941, 296, 941, 897, 897, 897, + 897, 897, 897, 897, 897, 897, 897, 897, + 897, 897, 897, 897, 897, 897, 897, 897, + 897, 897, 897, 897, 897, 897, 897, 941, + 943, 941, 941, 897, 941, 897, 897, 897, + 1141, 897, 897, 897, 897, 897, 897, 897, + 897, 897, 897, 897, 897, 897, 897, 897, + 897, 897, 897, 897, 897, 897, 897, 941, + 941, 941, 941, 941, 897, 941, 941, 941, + 941, 941, 941, 941, 941, 941, 942, 941, + 942, 942, 942, 941, 941, 941, 941, 941, + 941, 941, 941, 941, 941, 941, 941, 941, + 941, 941, 941, 941, 941, 942, 296, 941, + 941, 941, 941, 941, 941, 941, 941, 941, + 941, 941, 941, 941, 941, 897, 897, 897, + 897, 897, 897, 897, 897, 897, 897, 297, + 941, 941, 298, 941, 296, 941, 897, 897, + 897, 897, 897, 897, 897, 897, 897, 897, + 897, 897, 897, 897, 897, 897, 897, 897, + 897, 897, 897, 897, 897, 897, 897, 897, + 941, 943, 941, 941, 897, 941, 897, 897, + 897, 897, 1149, 897, 897, 897, 897, 897, + 897, 897, 897, 897, 897, 897, 897, 1150, + 897, 897, 897, 897, 897, 897, 897, 897, + 941, 941, 941, 941, 941, 897, 941, 941, + 941, 941, 941, 941, 941, 941, 941, 942, + 941, 942, 942, 942, 941, 941, 941, 941, + 941, 941, 941, 941, 941, 941, 941, 941, + 941, 941, 941, 941, 941, 941, 942, 296, + 941, 941, 941, 941, 941, 941, 941, 941, + 941, 941, 941, 941, 941, 941, 897, 897, + 897, 897, 897, 897, 897, 897, 897, 897, + 297, 941, 941, 298, 941, 296, 941, 897, + 897, 897, 897, 897, 897, 897, 897, 897, + 897, 897, 897, 897, 897, 897, 897, 897, + 897, 897, 897, 897, 897, 897, 897, 897, + 897, 941, 943, 941, 941, 897, 941, 897, + 897, 897, 897, 897, 897, 1151, 897, 897, + 897, 897, 897, 897, 897, 897, 897, 897, + 897, 897, 897, 897, 897, 897, 897, 897, + 897, 941, 941, 941, 941, 941, 897, 941, + 941, 941, 941, 941, 941, 941, 941, 941, + 942, 941, 942, 942, 942, 941, 941, 941, + 941, 941, 941, 941, 941, 941, 941, 941, + 941, 941, 941, 941, 941, 941, 941, 942, + 296, 941, 941, 941, 941, 941, 941, 941, + 941, 941, 941, 941, 941, 941, 941, 897, + 897, 897, 897, 897, 897, 897, 897, 897, + 897, 297, 941, 941, 298, 941, 296, 941, + 897, 897, 897, 897, 897, 897, 897, 897, + 897, 897, 897, 897, 897, 897, 897, 897, + 897, 897, 897, 897, 897, 897, 897, 897, + 897, 897, 941, 943, 941, 941, 897, 941, + 897, 897, 897, 897, 897, 897, 897, 897, + 1152, 897, 897, 897, 897, 897, 897, 897, + 897, 897, 897, 897, 897, 897, 897, 897, + 897, 897, 941, 941, 941, 941, 941, 897, + 941, 941, 941, 941, 941, 941, 941, 941, + 941, 942, 941, 942, 942, 942, 941, 941, + 941, 941, 941, 941, 941, 941, 941, 941, + 941, 941, 941, 941, 941, 941, 941, 941, + 942, 296, 941, 941, 941, 941, 941, 941, + 941, 941, 941, 941, 941, 941, 941, 941, + 897, 897, 897, 897, 897, 897, 897, 897, + 897, 897, 297, 941, 941, 298, 941, 296, + 941, 897, 897, 897, 897, 897, 897, 897, + 897, 897, 897, 897, 897, 897, 897, 897, + 897, 897, 897, 897, 897, 897, 897, 897, + 897, 897, 897, 941, 943, 941, 941, 897, + 941, 897, 897, 897, 897, 897, 897, 897, + 897, 897, 897, 897, 897, 897, 1141, 897, + 897, 897, 897, 897, 897, 897, 897, 897, + 897, 897, 897, 941, 941, 941, 941, 941, + 897, 941, 941, 941, 941, 941, 941, 941, + 941, 941, 942, 941, 942, 942, 942, 941, + 941, 941, 941, 941, 941, 941, 941, 941, + 941, 941, 941, 941, 941, 941, 941, 941, + 941, 942, 296, 941, 941, 941, 941, 941, + 941, 941, 941, 941, 941, 941, 941, 941, + 941, 897, 897, 897, 897, 897, 897, 897, + 897, 897, 897, 297, 941, 941, 298, 941, + 296, 941, 897, 897, 897, 897, 897, 897, + 897, 897, 897, 897, 897, 897, 897, 897, + 897, 897, 897, 897, 897, 897, 897, 897, + 897, 897, 897, 897, 941, 943, 941, 941, + 897, 941, 897, 897, 897, 897, 1153, 897, + 897, 897, 897, 897, 897, 897, 897, 897, + 897, 897, 897, 897, 897, 897, 897, 897, + 897, 897, 897, 897, 941, 941, 941, 941, + 941, 897, 941, 941, 941, 941, 941, 941, + 941, 941, 941, 942, 941, 942, 942, 942, + 941, 941, 941, 941, 941, 941, 941, 941, + 941, 941, 941, 941, 941, 941, 941, 941, + 941, 941, 942, 296, 941, 941, 941, 941, + 941, 941, 941, 941, 941, 941, 941, 941, + 941, 941, 897, 897, 897, 897, 897, 897, + 897, 897, 897, 897, 297, 941, 941, 298, + 941, 296, 941, 897, 897, 897, 897, 897, + 897, 897, 897, 897, 897, 897, 897, 897, + 897, 897, 897, 897, 897, 897, 897, 897, + 897, 897, 897, 897, 897, 941, 943, 941, + 941, 897, 941, 1154, 897, 897, 897, 897, + 897, 897, 897, 897, 897, 897, 897, 897, + 897, 897, 897, 897, 897, 897, 897, 897, + 897, 897, 897, 897, 897, 941, 941, 941, + 941, 941, 897, 941, 941, 941, 941, 941, + 941, 941, 941, 941, 942, 941, 942, 942, + 942, 941, 941, 941, 941, 941, 941, 941, + 941, 941, 941, 941, 941, 941, 941, 941, + 941, 941, 941, 942, 296, 941, 941, 941, + 941, 941, 941, 941, 941, 941, 941, 941, + 941, 941, 941, 897, 897, 897, 897, 897, + 897, 897, 897, 897, 897, 297, 941, 941, + 298, 941, 296, 941, 897, 897, 897, 897, + 897, 897, 897, 897, 897, 897, 897, 897, + 897, 897, 897, 897, 897, 897, 897, 897, + 897, 897, 897, 897, 897, 897, 941, 943, + 941, 941, 897, 941, 897, 897, 897, 897, + 897, 897, 897, 897, 897, 897, 1141, 897, + 897, 897, 897, 897, 897, 897, 897, 897, + 897, 897, 897, 897, 897, 897, 941, 941, + 941, 941, 941, 897, 941, 941, 941, 941, + 941, 941, 941, 941, 941, 942, 941, 942, + 942, 942, 941, 941, 941, 941, 941, 941, + 941, 941, 941, 941, 941, 941, 941, 941, + 941, 941, 941, 941, 942, 296, 941, 941, + 941, 941, 941, 941, 941, 941, 941, 941, + 941, 941, 941, 941, 897, 897, 897, 897, + 897, 897, 897, 897, 897, 897, 297, 941, + 941, 298, 941, 296, 941, 897, 897, 897, + 897, 897, 897, 897, 897, 897, 897, 897, + 897, 897, 897, 897, 897, 897, 897, 897, + 897, 897, 897, 897, 897, 897, 897, 941, + 943, 941, 941, 897, 941, 1155, 897, 897, + 897, 897, 897, 897, 897, 897, 897, 897, + 1156, 897, 897, 897, 897, 897, 897, 897, + 897, 897, 897, 897, 897, 897, 897, 941, + 941, 941, 941, 941, 897, 941, 941, 941, + 941, 941, 941, 941, 941, 941, 942, 941, + 942, 942, 942, 941, 941, 941, 941, 941, + 941, 941, 941, 941, 941, 941, 941, 941, + 941, 941, 941, 941, 941, 942, 296, 941, + 941, 941, 941, 941, 941, 941, 941, 941, + 941, 941, 941, 941, 941, 897, 897, 897, + 897, 897, 897, 897, 897, 897, 897, 297, + 941, 941, 298, 941, 296, 941, 897, 897, + 897, 897, 897, 897, 897, 897, 897, 897, + 897, 897, 897, 897, 897, 897, 897, 897, + 897, 897, 897, 897, 897, 897, 897, 897, + 941, 943, 941, 941, 897, 941, 897, 897, + 897, 897, 897, 897, 897, 897, 897, 897, + 897, 897, 897, 897, 897, 897, 897, 897, + 1157, 897, 897, 897, 897, 897, 897, 897, + 941, 941, 941, 941, 941, 897, 941, 941, + 941, 941, 941, 941, 941, 941, 941, 942, + 941, 942, 942, 942, 941, 941, 941, 941, + 941, 941, 941, 941, 941, 941, 941, 941, + 941, 941, 941, 941, 941, 941, 942, 296, + 941, 941, 941, 941, 941, 941, 941, 941, + 941, 941, 941, 941, 941, 941, 897, 897, + 897, 897, 897, 897, 897, 897, 897, 897, + 297, 941, 941, 298, 941, 296, 941, 897, + 897, 897, 897, 897, 897, 897, 897, 897, + 897, 897, 897, 897, 897, 897, 897, 897, + 897, 897, 897, 897, 897, 897, 897, 897, + 897, 941, 943, 941, 941, 897, 941, 897, + 897, 897, 897, 1141, 897, 897, 897, 897, + 897, 897, 897, 897, 897, 897, 897, 897, + 897, 897, 897, 897, 897, 897, 897, 897, + 897, 941, 941, 941, 941, 941, 897, 941, + 941, 941, 941, 941, 941, 941, 941, 941, + 942, 941, 942, 942, 942, 941, 941, 941, + 941, 941, 941, 941, 941, 941, 941, 941, + 941, 941, 941, 941, 941, 941, 941, 942, + 296, 941, 941, 941, 941, 941, 941, 941, + 941, 941, 941, 941, 941, 941, 941, 897, + 897, 897, 897, 897, 897, 897, 897, 897, + 897, 297, 941, 941, 298, 941, 296, 941, + 897, 897, 897, 897, 897, 897, 897, 897, + 897, 897, 897, 897, 897, 897, 897, 897, + 897, 897, 897, 897, 897, 897, 897, 897, + 897, 897, 941, 943, 941, 941, 897, 941, + 1158, 897, 897, 897, 897, 897, 897, 897, + 897, 897, 897, 897, 897, 897, 897, 897, + 897, 897, 897, 897, 897, 897, 897, 897, + 897, 897, 941, 941, 941, 941, 941, 897, + 941, 941, 941, 941, 941, 941, 941, 941, + 941, 942, 941, 942, 942, 942, 941, 941, + 941, 941, 941, 941, 941, 941, 941, 941, + 941, 941, 941, 941, 941, 941, 941, 941, + 942, 296, 941, 941, 941, 941, 941, 941, + 941, 941, 941, 941, 941, 941, 941, 941, + 897, 897, 897, 897, 897, 897, 897, 897, + 897, 897, 297, 941, 941, 298, 941, 296, + 941, 897, 897, 897, 897, 897, 897, 897, + 897, 897, 897, 897, 897, 897, 897, 897, + 897, 897, 897, 897, 897, 897, 897, 897, + 897, 897, 897, 941, 943, 941, 941, 897, + 941, 897, 897, 897, 897, 897, 897, 897, + 897, 897, 897, 897, 897, 897, 897, 897, + 897, 897, 897, 1148, 897, 897, 897, 897, + 897, 897, 897, 941, 941, 941, 941, 941, + 897, 941, 941, 941, 941, 941, 941, 941, + 941, 941, 942, 941, 942, 942, 942, 941, + 941, 941, 941, 941, 941, 941, 941, 941, + 941, 941, 941, 941, 941, 941, 941, 941, + 941, 942, 296, 941, 941, 941, 941, 941, + 941, 941, 941, 941, 941, 941, 941, 941, + 941, 897, 897, 897, 897, 897, 897, 897, + 897, 897, 897, 297, 941, 941, 298, 941, + 296, 941, 897, 897, 897, 897, 897, 897, + 897, 897, 897, 897, 897, 897, 897, 897, + 897, 897, 897, 897, 897, 897, 897, 897, + 897, 897, 897, 897, 941, 943, 941, 941, + 897, 941, 897, 897, 897, 897, 1159, 897, + 897, 897, 897, 897, 897, 897, 897, 897, + 1141, 897, 897, 897, 897, 897, 897, 897, + 897, 897, 897, 897, 941, 941, 941, 941, + 941, 897, 941, 941, 941, 941, 941, 941, + 941, 941, 941, 942, 941, 942, 942, 942, + 941, 941, 941, 941, 941, 941, 941, 941, + 941, 941, 941, 941, 941, 941, 941, 941, + 941, 941, 942, 296, 941, 941, 941, 941, + 941, 941, 941, 941, 941, 941, 941, 941, + 941, 941, 897, 897, 897, 897, 897, 897, + 897, 897, 897, 897, 297, 941, 941, 298, + 941, 296, 941, 897, 897, 897, 897, 897, + 897, 897, 897, 897, 897, 897, 897, 897, + 897, 897, 897, 897, 897, 897, 897, 897, + 897, 897, 897, 897, 897, 941, 943, 941, + 941, 897, 941, 897, 897, 897, 897, 897, + 1141, 897, 897, 897, 897, 897, 897, 897, + 897, 897, 897, 897, 897, 897, 897, 897, + 897, 897, 897, 897, 897, 941, 941, 941, + 941, 941, 897, 941, 941, 941, 941, 941, + 941, 941, 941, 941, 942, 941, 942, 942, + 942, 941, 941, 941, 941, 941, 941, 941, + 941, 941, 941, 941, 941, 941, 941, 941, + 941, 941, 941, 942, 296, 941, 941, 941, + 941, 941, 941, 941, 941, 941, 941, 941, + 941, 941, 941, 897, 897, 897, 897, 897, + 897, 897, 897, 897, 897, 297, 941, 941, + 298, 941, 296, 941, 897, 897, 897, 897, + 897, 897, 897, 897, 897, 897, 897, 897, + 897, 897, 897, 897, 897, 897, 897, 897, + 897, 897, 897, 897, 897, 897, 941, 943, + 941, 941, 897, 941, 897, 897, 897, 897, + 897, 897, 897, 897, 897, 897, 897, 1160, + 897, 1161, 897, 897, 897, 897, 897, 897, + 897, 897, 897, 897, 897, 897, 941, 941, + 941, 941, 941, 897, 941, 941, 941, 941, + 941, 941, 941, 941, 941, 942, 941, 942, + 942, 942, 941, 941, 941, 941, 941, 941, + 941, 941, 941, 941, 941, 941, 941, 941, + 941, 941, 941, 941, 942, 296, 941, 941, + 941, 941, 941, 941, 941, 941, 941, 941, + 941, 941, 941, 941, 897, 897, 897, 897, + 897, 897, 897, 897, 897, 897, 297, 941, + 941, 298, 941, 296, 941, 897, 897, 897, + 897, 897, 897, 897, 897, 897, 897, 897, + 897, 897, 897, 897, 897, 897, 897, 897, + 897, 897, 897, 897, 897, 897, 897, 941, + 943, 941, 941, 897, 941, 897, 897, 897, + 897, 897, 897, 897, 897, 897, 897, 897, + 897, 897, 897, 897, 897, 897, 897, 1162, + 897, 897, 897, 897, 897, 897, 897, 941, + 941, 941, 941, 941, 897, 941, 941, 941, + 941, 941, 941, 941, 941, 941, 942, 941, + 942, 942, 942, 941, 941, 941, 941, 941, + 941, 941, 941, 941, 941, 941, 941, 941, + 941, 941, 941, 941, 941, 942, 296, 941, + 941, 941, 941, 941, 941, 941, 941, 941, + 941, 941, 941, 941, 941, 897, 897, 897, + 897, 897, 897, 897, 897, 897, 897, 297, + 941, 941, 298, 941, 296, 941, 897, 897, + 897, 897, 897, 897, 897, 897, 897, 897, + 897, 897, 897, 897, 897, 897, 897, 897, + 897, 897, 897, 897, 897, 897, 897, 897, + 941, 943, 941, 941, 897, 941, 897, 897, + 897, 897, 1141, 897, 897, 897, 1159, 897, + 897, 897, 897, 897, 897, 897, 897, 897, + 897, 897, 897, 897, 897, 897, 897, 897, + 941, 941, 941, 941, 941, 897, 941, 941, + 941, 941, 941, 941, 941, 941, 941, 942, + 941, 942, 942, 942, 941, 941, 941, 941, + 941, 941, 941, 941, 941, 941, 941, 941, + 941, 941, 941, 941, 941, 941, 942, 296, + 941, 941, 941, 941, 941, 941, 941, 941, + 941, 941, 941, 941, 941, 941, 897, 897, + 897, 897, 897, 897, 897, 897, 897, 897, + 297, 941, 941, 298, 941, 296, 941, 897, + 897, 897, 897, 897, 897, 897, 897, 897, + 897, 897, 897, 897, 897, 897, 897, 897, + 897, 897, 897, 897, 897, 897, 897, 897, + 897, 941, 943, 941, 941, 897, 941, 897, + 897, 897, 1141, 897, 897, 897, 897, 897, + 897, 897, 897, 897, 897, 897, 897, 897, + 897, 1163, 897, 897, 897, 897, 897, 897, + 897, 941, 941, 941, 941, 941, 897, 941, + 941, 941, 941, 941, 941, 941, 941, 941, + 942, 941, 942, 942, 942, 941, 941, 941, + 941, 941, 941, 941, 941, 941, 941, 941, + 941, 941, 941, 941, 941, 941, 941, 942, + 296, 941, 941, 941, 941, 941, 941, 941, + 941, 941, 941, 941, 941, 941, 941, 897, + 897, 897, 897, 897, 897, 897, 897, 897, + 897, 297, 941, 941, 298, 941, 296, 941, + 897, 897, 897, 897, 897, 897, 897, 897, + 897, 897, 897, 897, 897, 897, 897, 897, + 897, 897, 897, 897, 897, 897, 897, 897, + 897, 897, 941, 943, 941, 941, 897, 941, + 897, 897, 897, 897, 897, 897, 897, 897, + 897, 897, 897, 897, 897, 897, 897, 897, + 897, 897, 897, 897, 1164, 897, 897, 897, + 897, 897, 941, 941, 941, 941, 941, 897, + 941, 941, 941, 941, 941, 941, 941, 941, + 941, 942, 941, 942, 942, 942, 941, 941, + 941, 941, 941, 941, 941, 941, 941, 941, + 941, 941, 941, 941, 941, 941, 941, 941, + 942, 296, 941, 941, 941, 941, 941, 941, + 941, 941, 941, 941, 941, 941, 941, 941, + 897, 897, 897, 897, 897, 897, 897, 897, + 897, 897, 297, 941, 941, 298, 941, 296, + 941, 897, 897, 897, 897, 897, 897, 897, + 897, 897, 897, 897, 897, 897, 897, 897, + 897, 897, 897, 897, 897, 897, 897, 897, + 897, 897, 897, 941, 943, 941, 941, 897, + 941, 897, 897, 897, 897, 897, 897, 897, + 897, 897, 897, 897, 897, 897, 897, 897, + 897, 897, 1157, 897, 897, 897, 897, 897, + 897, 897, 897, 941, 941, 941, 941, 941, + 897, 941, 941, 941, 941, 941, 941, 941, + 941, 941, 942, 941, 942, 942, 942, 941, + 941, 941, 941, 941, 941, 941, 941, 941, + 941, 941, 941, 941, 941, 941, 941, 941, + 941, 942, 296, 941, 941, 941, 941, 941, + 941, 941, 941, 941, 941, 941, 941, 941, + 941, 897, 897, 897, 897, 897, 897, 897, + 897, 897, 897, 297, 941, 941, 298, 941, + 296, 941, 897, 897, 897, 897, 897, 897, + 897, 897, 897, 897, 897, 897, 897, 897, + 897, 897, 897, 897, 897, 897, 897, 897, + 897, 897, 897, 897, 941, 943, 941, 941, + 897, 941, 1165, 897, 897, 897, 897, 897, + 897, 897, 897, 897, 897, 897, 897, 897, + 932, 897, 897, 897, 897, 897, 897, 897, + 897, 897, 897, 897, 941, 941, 941, 941, + 941, 897, 941, 941, 941, 941, 941, 941, + 941, 941, 941, 942, 941, 942, 942, 942, + 941, 941, 941, 941, 941, 941, 941, 941, + 941, 941, 941, 941, 941, 941, 941, 941, + 941, 941, 942, 296, 941, 941, 941, 941, + 941, 941, 941, 941, 941, 941, 941, 941, + 941, 941, 897, 897, 897, 897, 897, 897, + 897, 897, 897, 897, 297, 941, 941, 298, + 941, 296, 941, 897, 897, 897, 897, 897, + 897, 897, 897, 897, 897, 897, 897, 897, + 897, 897, 897, 897, 897, 897, 897, 897, + 897, 897, 897, 897, 897, 941, 943, 941, + 941, 897, 941, 897, 897, 897, 897, 897, + 897, 897, 897, 897, 897, 897, 1155, 897, + 897, 897, 897, 897, 897, 897, 897, 897, + 897, 897, 897, 897, 897, 941, 941, 941, + 941, 941, 897, 941, 941, 941, 941, 941, + 941, 941, 941, 941, 942, 941, 942, 942, + 942, 941, 941, 941, 941, 941, 941, 941, + 941, 941, 941, 941, 941, 941, 941, 941, + 941, 941, 941, 942, 296, 941, 941, 941, + 941, 941, 941, 941, 941, 941, 941, 941, + 941, 941, 941, 897, 897, 897, 897, 897, + 897, 897, 897, 897, 897, 297, 941, 941, + 298, 941, 296, 941, 897, 897, 897, 897, + 897, 897, 897, 897, 897, 897, 897, 897, + 897, 897, 897, 897, 897, 897, 897, 897, + 897, 897, 897, 897, 897, 897, 941, 943, + 941, 941, 897, 941, 897, 897, 897, 897, + 897, 897, 897, 897, 897, 897, 897, 897, + 897, 897, 897, 897, 897, 1141, 897, 897, + 897, 897, 897, 897, 897, 897, 941, 941, + 941, 941, 941, 897, 941, 941, 941, 941, + 941, 941, 941, 941, 941, 942, 941, 942, + 942, 942, 941, 941, 941, 941, 941, 941, + 941, 941, 941, 941, 941, 941, 941, 941, + 941, 941, 941, 941, 942, 296, 941, 941, + 941, 941, 941, 941, 941, 941, 941, 941, + 941, 941, 941, 941, 897, 897, 897, 897, + 897, 897, 897, 897, 897, 897, 297, 941, + 941, 298, 941, 296, 941, 897, 897, 897, + 897, 897, 897, 897, 897, 897, 897, 897, + 897, 897, 897, 897, 897, 897, 897, 897, + 897, 897, 897, 897, 897, 897, 897, 941, + 943, 941, 941, 897, 941, 897, 897, 897, + 897, 897, 1166, 897, 897, 897, 897, 897, + 897, 897, 1141, 897, 897, 897, 897, 897, + 897, 897, 897, 897, 897, 897, 897, 941, + 941, 941, 941, 941, 897, 941, 941, 941, + 941, 941, 941, 941, 941, 941, 942, 941, + 942, 942, 942, 941, 941, 941, 941, 941, + 941, 941, 941, 941, 941, 941, 941, 941, + 941, 941, 941, 941, 941, 942, 296, 941, + 941, 941, 941, 941, 941, 941, 941, 941, + 941, 941, 941, 941, 941, 897, 897, 897, + 897, 897, 897, 897, 897, 897, 897, 297, + 941, 941, 298, 941, 296, 941, 897, 897, + 897, 897, 897, 897, 897, 897, 897, 897, + 897, 897, 897, 897, 897, 897, 897, 897, + 897, 897, 897, 897, 897, 897, 897, 897, + 941, 943, 941, 941, 897, 941, 897, 897, + 897, 897, 897, 897, 897, 897, 897, 897, + 897, 897, 897, 897, 1167, 897, 897, 897, + 897, 897, 897, 897, 897, 897, 897, 897, + 941, 941, 941, 941, 941, 897, 941, 941, + 941, 941, 941, 941, 941, 941, 941, 942, + 941, 942, 942, 942, 941, 941, 941, 941, + 941, 941, 941, 941, 941, 941, 941, 941, + 941, 941, 941, 941, 941, 941, 942, 296, + 941, 941, 941, 941, 941, 941, 941, 941, + 941, 941, 941, 941, 941, 941, 897, 897, + 897, 897, 897, 897, 897, 897, 897, 897, + 297, 941, 941, 298, 941, 296, 941, 897, + 897, 897, 897, 897, 897, 897, 897, 897, + 897, 897, 897, 897, 897, 897, 897, 897, + 897, 897, 897, 897, 897, 897, 897, 897, + 897, 941, 943, 941, 941, 897, 941, 897, + 897, 897, 1168, 897, 897, 897, 897, 897, + 897, 897, 897, 897, 897, 897, 897, 897, + 897, 897, 897, 897, 897, 897, 897, 897, + 897, 941, 941, 941, 941, 941, 897, 941, + 941, 941, 941, 941, 941, 941, 941, 941, + 942, 941, 942, 942, 942, 941, 941, 941, + 941, 941, 941, 941, 941, 941, 941, 941, + 941, 941, 941, 941, 941, 941, 941, 942, + 296, 941, 941, 941, 941, 941, 941, 941, + 941, 941, 941, 941, 941, 941, 941, 897, + 897, 897, 897, 897, 897, 897, 897, 897, + 897, 297, 941, 941, 298, 941, 296, 941, + 897, 897, 897, 897, 897, 897, 897, 897, + 897, 897, 897, 897, 897, 897, 897, 897, + 897, 897, 897, 897, 897, 897, 897, 897, + 897, 897, 941, 943, 941, 941, 897, 941, + 897, 897, 897, 897, 897, 897, 897, 897, + 897, 897, 897, 897, 897, 897, 897, 897, + 897, 897, 897, 897, 1169, 897, 897, 897, + 897, 897, 941, 941, 941, 941, 941, 897, + 941, 941, 941, 941, 941, 941, 941, 941, + 941, 942, 941, 942, 942, 942, 941, 941, + 941, 941, 941, 941, 941, 941, 941, 941, + 941, 941, 941, 941, 941, 941, 941, 941, + 942, 296, 941, 941, 941, 941, 941, 941, + 941, 941, 941, 941, 941, 941, 941, 941, + 897, 897, 897, 897, 897, 897, 897, 897, + 897, 897, 297, 941, 941, 298, 941, 296, + 941, 897, 897, 897, 897, 897, 897, 897, + 897, 897, 897, 897, 897, 897, 897, 897, + 897, 897, 897, 897, 897, 897, 897, 897, + 897, 897, 897, 941, 943, 941, 941, 897, + 941, 897, 897, 897, 897, 897, 897, 897, + 897, 897, 897, 897, 1157, 897, 897, 897, + 897, 897, 897, 897, 897, 897, 897, 897, + 897, 897, 897, 941, 941, 941, 941, 941, + 897, 941, 941, 941, 941, 941, 941, 941, + 941, 941, 942, 941, 942, 942, 942, 941, + 941, 941, 941, 941, 941, 941, 941, 941, + 941, 941, 941, 941, 941, 941, 941, 941, + 941, 942, 296, 941, 941, 941, 941, 941, + 941, 941, 941, 941, 941, 941, 941, 941, + 941, 897, 897, 897, 897, 897, 897, 897, + 897, 897, 897, 297, 941, 941, 298, 941, + 296, 941, 897, 897, 897, 897, 897, 897, + 897, 897, 897, 897, 897, 897, 897, 897, + 897, 897, 897, 897, 897, 897, 897, 897, + 897, 897, 897, 897, 941, 943, 941, 941, + 897, 941, 897, 897, 897, 897, 1170, 897, + 897, 897, 1171, 897, 897, 897, 897, 897, + 1172, 897, 897, 897, 897, 897, 897, 897, + 897, 897, 897, 897, 941, 941, 941, 941, + 941, 897, 941, 941, 941, 941, 941, 941, + 941, 941, 941, 942, 941, 942, 942, 942, + 941, 941, 941, 941, 941, 941, 941, 941, + 941, 941, 941, 941, 941, 941, 941, 941, + 941, 941, 942, 296, 941, 941, 941, 941, + 941, 941, 941, 941, 941, 941, 941, 941, + 941, 941, 897, 897, 897, 897, 897, 897, + 897, 897, 897, 897, 297, 941, 941, 298, + 941, 296, 941, 897, 897, 897, 897, 897, + 897, 897, 897, 897, 897, 897, 897, 897, + 897, 897, 897, 897, 897, 897, 897, 897, + 897, 897, 897, 897, 897, 941, 943, 941, + 941, 897, 941, 897, 897, 897, 897, 897, + 897, 897, 897, 897, 897, 897, 897, 897, + 897, 897, 897, 897, 897, 897, 897, 897, + 897, 897, 1172, 897, 897, 941, 941, 941, + 941, 941, 897, 941, 941, 941, 941, 941, + 941, 941, 941, 941, 942, 941, 942, 942, + 942, 941, 941, 941, 941, 941, 941, 941, + 941, 941, 941, 941, 941, 941, 941, 941, + 941, 941, 941, 942, 296, 941, 941, 941, + 941, 941, 941, 941, 941, 941, 941, 941, + 941, 941, 941, 897, 897, 897, 897, 897, + 897, 897, 897, 897, 897, 297, 941, 941, + 298, 941, 296, 941, 897, 897, 897, 897, + 897, 897, 897, 897, 897, 897, 897, 897, + 897, 897, 897, 897, 897, 897, 897, 897, + 897, 897, 897, 897, 897, 897, 941, 943, + 941, 941, 897, 941, 897, 897, 897, 897, + 897, 897, 897, 897, 897, 897, 897, 897, + 897, 897, 897, 897, 897, 897, 897, 1141, + 897, 897, 897, 897, 897, 897, 941, 941, + 941, 941, 941, 897, 941, 941, 941, 941, + 941, 941, 941, 941, 941, 942, 941, 942, + 942, 942, 941, 941, 941, 941, 941, 941, + 941, 941, 941, 941, 941, 941, 941, 941, + 941, 941, 941, 941, 942, 296, 941, 941, + 941, 941, 941, 941, 941, 941, 941, 941, + 941, 941, 941, 941, 897, 897, 897, 897, + 897, 897, 897, 897, 897, 897, 297, 941, + 941, 298, 941, 296, 941, 897, 897, 897, + 897, 897, 897, 897, 897, 897, 897, 897, + 897, 897, 897, 897, 897, 897, 897, 897, + 897, 897, 897, 897, 897, 897, 897, 941, + 943, 941, 941, 897, 941, 897, 897, 897, + 897, 897, 897, 897, 897, 897, 897, 897, + 1141, 897, 897, 897, 897, 897, 897, 897, + 897, 897, 897, 897, 897, 897, 897, 941, + 941, 941, 941, 941, 897, 941, 941, 941, + 941, 941, 941, 941, 941, 941, 942, 941, + 942, 942, 942, 941, 941, 941, 941, 941, + 941, 941, 941, 941, 941, 941, 941, 941, + 941, 941, 941, 941, 941, 942, 296, 941, + 941, 941, 941, 941, 941, 941, 941, 941, + 941, 941, 941, 941, 941, 897, 897, 897, + 897, 897, 897, 897, 897, 897, 897, 297, + 941, 941, 298, 941, 296, 941, 897, 897, + 897, 897, 897, 897, 897, 897, 897, 897, + 897, 897, 897, 897, 897, 897, 897, 897, + 897, 897, 897, 897, 897, 897, 897, 897, + 941, 943, 941, 941, 897, 941, 897, 897, + 897, 897, 1173, 897, 897, 897, 897, 897, + 897, 897, 897, 897, 897, 897, 897, 897, + 897, 897, 897, 897, 897, 897, 897, 897, + 941, 941, 941, 941, 941, 897, 941, 941, + 941, 941, 941, 941, 941, 941, 941, 942, + 941, 942, 942, 942, 941, 941, 941, 941, + 941, 941, 941, 941, 941, 941, 941, 941, + 941, 941, 941, 941, 941, 941, 942, 296, + 941, 941, 941, 941, 941, 941, 941, 941, + 941, 941, 941, 941, 941, 941, 897, 897, + 897, 897, 897, 897, 897, 897, 897, 897, + 297, 941, 941, 298, 941, 296, 941, 897, + 897, 897, 897, 897, 897, 897, 897, 897, + 897, 897, 897, 897, 897, 897, 897, 897, + 897, 897, 897, 897, 897, 897, 897, 897, + 897, 941, 943, 941, 941, 897, 941, 897, + 897, 897, 1174, 897, 897, 897, 897, 897, + 897, 897, 897, 897, 897, 897, 897, 897, + 897, 1175, 1176, 897, 897, 897, 897, 897, + 897, 941, 941, 941, 941, 941, 897, 941, + 941, 941, 941, 941, 941, 941, 941, 941, + 942, 941, 942, 942, 942, 941, 941, 941, + 941, 941, 941, 941, 941, 941, 941, 941, + 941, 941, 941, 941, 941, 941, 941, 942, + 296, 941, 941, 941, 941, 941, 941, 941, + 941, 941, 941, 941, 941, 941, 941, 897, + 897, 897, 897, 897, 897, 897, 897, 897, + 897, 297, 941, 941, 298, 941, 296, 941, + 897, 897, 897, 897, 897, 897, 897, 897, + 897, 897, 897, 897, 897, 897, 897, 897, + 897, 897, 897, 897, 897, 897, 897, 897, + 897, 897, 941, 943, 941, 941, 897, 941, + 897, 897, 897, 897, 897, 897, 897, 897, + 897, 897, 897, 897, 897, 897, 1141, 897, + 897, 897, 897, 897, 897, 897, 897, 897, + 897, 897, 941, 941, 941, 941, 941, 897, + 941, 941, 941, 941, 941, 941, 941, 941, + 941, 942, 941, 942, 942, 942, 941, 941, + 941, 941, 941, 941, 941, 941, 941, 941, + 941, 941, 941, 941, 941, 941, 941, 941, + 942, 296, 941, 941, 941, 941, 941, 941, + 941, 941, 941, 941, 941, 941, 941, 941, + 897, 897, 897, 897, 897, 897, 897, 897, + 897, 897, 297, 941, 941, 298, 941, 296, + 941, 897, 897, 897, 897, 897, 897, 897, + 897, 897, 897, 897, 897, 897, 897, 897, + 897, 897, 897, 897, 897, 897, 897, 897, + 897, 897, 897, 941, 943, 941, 941, 897, + 941, 897, 897, 1177, 897, 897, 897, 897, + 897, 897, 897, 897, 897, 897, 897, 897, + 897, 897, 897, 897, 897, 897, 897, 897, + 897, 897, 897, 941, 941, 941, 941, 941, + 897, 941, 941, 941, 941, 941, 941, 941, + 941, 941, 942, 941, 942, 942, 942, 941, + 941, 941, 941, 941, 941, 941, 941, 941, + 941, 941, 941, 941, 941, 941, 941, 941, + 941, 942, 296, 941, 941, 941, 941, 941, + 941, 941, 941, 941, 941, 941, 941, 941, + 941, 897, 897, 897, 897, 897, 897, 897, + 897, 897, 897, 297, 941, 941, 298, 941, + 296, 941, 897, 897, 897, 897, 897, 897, + 897, 897, 897, 897, 897, 897, 897, 897, + 897, 897, 897, 897, 897, 897, 897, 897, + 897, 897, 897, 897, 941, 943, 941, 941, + 897, 941, 897, 897, 897, 897, 897, 897, + 897, 897, 897, 897, 897, 897, 897, 897, + 897, 897, 897, 897, 897, 897, 1178, 897, + 897, 897, 897, 897, 941, 941, 941, 941, + 941, 897, 941, 941, 941, 941, 941, 941, + 941, 941, 941, 942, 941, 942, 942, 942, + 941, 941, 941, 941, 941, 941, 941, 941, + 941, 941, 941, 941, 941, 941, 941, 941, + 941, 941, 942, 296, 941, 941, 941, 941, + 941, 941, 941, 941, 941, 941, 941, 941, + 941, 941, 897, 897, 897, 897, 897, 897, + 897, 897, 897, 897, 297, 941, 941, 298, + 941, 296, 941, 897, 897, 897, 897, 897, + 897, 897, 897, 897, 897, 897, 897, 897, + 897, 897, 897, 897, 897, 897, 897, 897, + 897, 897, 897, 897, 897, 941, 943, 941, + 941, 897, 941, 897, 897, 897, 897, 1179, + 897, 897, 897, 897, 897, 897, 897, 897, + 897, 897, 897, 897, 897, 897, 897, 897, + 897, 897, 897, 897, 897, 941, 941, 941, + 941, 941, 897, 1180, 1180, 1180, 1180, 1180, + 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, + 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, + 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, + 1180, 1180, 1180, 1180, 1182, 1180, 1180, 1180, + 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, + 1180, 1180, 1180, 1181, 1181, 1181, 1181, 1181, + 1181, 1181, 1181, 1181, 1181, 1183, 1180, 1180, + 1184, 1180, 1182, 1180, 1181, 1181, 1181, 1181, + 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, + 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, + 1181, 1181, 1181, 1181, 1181, 1181, 1180, 1180, + 1180, 1180, 1181, 1180, 1181, 1181, 1181, 1181, + 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, + 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, + 1181, 1181, 1181, 1181, 1181, 1181, 1180, 1180, + 1180, 1180, 1180, 1181, 949, 1185, 948, 948, + 948, 948, 948, 948, 948, 948, 948, 948, + 948, 948, 948, 948, 948, 948, 948, 948, + 948, 948, 948, 948, 948, 948, 948, 948, + 948, 948, 948, 948, 948, 948, 948, 948, + 948, 948, 948, 948, 948, 948, 948, 948, + 948, 948, 948, 948, 948, 948, 948, 948, + 948, 948, 948, 948, 948, 948, 948, 948, + 948, 948, 948, 948, 948, 951, 948, 941, + 941, 941, 941, 941, 941, 941, 941, 941, + 942, 941, 942, 942, 942, 941, 941, 941, + 941, 941, 941, 941, 941, 941, 941, 941, + 941, 941, 941, 941, 941, 941, 941, 942, + 296, 941, 941, 941, 941, 941, 941, 941, + 941, 941, 941, 941, 941, 941, 941, 897, + 897, 897, 897, 897, 897, 897, 897, 897, + 897, 297, 941, 941, 298, 941, 296, 941, + 897, 897, 897, 897, 897, 897, 897, 897, + 897, 897, 897, 897, 897, 897, 897, 897, + 897, 897, 897, 897, 897, 897, 897, 897, + 897, 897, 941, 943, 941, 941, 897, 941, + 897, 897, 897, 897, 897, 897, 897, 897, + 897, 897, 897, 897, 897, 897, 897, 897, + 897, 1186, 897, 897, 1187, 897, 897, 897, + 897, 897, 941, 941, 941, 941, 941, 897, + 941, 941, 941, 941, 941, 941, 941, 941, + 941, 942, 941, 942, 942, 942, 941, 941, + 941, 941, 941, 941, 941, 941, 941, 941, + 941, 941, 941, 941, 941, 941, 941, 941, + 942, 296, 941, 941, 941, 941, 941, 941, + 941, 941, 941, 941, 941, 941, 941, 941, + 897, 897, 897, 897, 897, 897, 897, 897, + 897, 897, 297, 941, 941, 298, 941, 296, + 941, 897, 897, 897, 897, 897, 897, 897, + 897, 897, 897, 897, 897, 897, 897, 897, + 897, 897, 897, 897, 897, 897, 897, 897, + 897, 897, 897, 941, 943, 941, 941, 897, + 941, 897, 897, 897, 897, 897, 897, 897, + 897, 897, 897, 897, 897, 897, 897, 897, + 897, 897, 897, 897, 897, 897, 897, 897, + 897, 1141, 897, 941, 941, 941, 941, 941, + 897, 941, 941, 941, 941, 941, 941, 941, + 941, 941, 942, 941, 942, 942, 942, 941, + 941, 941, 941, 941, 941, 941, 941, 941, + 941, 941, 941, 941, 941, 941, 941, 941, + 941, 942, 296, 941, 941, 941, 941, 941, + 941, 941, 941, 941, 941, 941, 941, 941, + 941, 897, 897, 897, 897, 897, 897, 897, + 897, 897, 897, 297, 941, 941, 298, 941, + 296, 941, 897, 897, 897, 897, 897, 897, + 897, 897, 897, 897, 897, 897, 897, 897, + 897, 897, 897, 897, 897, 897, 897, 897, + 897, 897, 897, 897, 941, 943, 941, 941, + 897, 941, 897, 897, 897, 897, 897, 897, + 897, 897, 897, 897, 897, 897, 897, 897, + 897, 897, 897, 1152, 897, 897, 897, 897, + 897, 897, 897, 897, 941, 941, 941, 941, + 941, 897, 941, 941, 941, 941, 941, 941, + 941, 941, 941, 942, 941, 942, 942, 942, + 941, 941, 941, 941, 941, 941, 941, 941, + 941, 941, 941, 941, 941, 941, 941, 941, + 941, 941, 942, 296, 941, 941, 941, 941, + 941, 941, 941, 941, 941, 941, 941, 941, + 941, 941, 897, 897, 897, 897, 897, 897, + 897, 897, 897, 897, 297, 941, 941, 298, + 941, 296, 941, 897, 897, 897, 897, 897, + 897, 897, 897, 897, 897, 897, 897, 897, + 897, 897, 897, 897, 897, 897, 897, 897, + 897, 897, 897, 897, 897, 941, 943, 941, + 941, 897, 941, 897, 897, 897, 897, 1188, + 897, 897, 897, 897, 897, 897, 897, 897, + 897, 897, 897, 897, 897, 897, 897, 1189, + 897, 897, 897, 897, 897, 941, 941, 941, + 941, 941, 897, 941, 941, 941, 941, 941, + 941, 941, 941, 941, 942, 941, 942, 942, + 942, 941, 941, 941, 941, 941, 941, 941, + 941, 941, 941, 941, 941, 941, 941, 941, + 941, 941, 941, 942, 296, 941, 941, 941, + 941, 941, 941, 941, 941, 941, 941, 941, + 941, 941, 941, 897, 897, 897, 897, 897, + 897, 897, 897, 897, 897, 297, 941, 941, + 298, 941, 296, 941, 897, 897, 897, 897, + 897, 897, 897, 897, 897, 897, 897, 897, + 897, 897, 897, 897, 897, 897, 897, 897, + 897, 897, 897, 897, 897, 897, 941, 943, + 941, 941, 897, 941, 897, 897, 897, 897, + 897, 897, 897, 897, 897, 897, 897, 1159, + 897, 897, 897, 897, 897, 897, 897, 897, + 897, 897, 897, 897, 897, 897, 941, 941, + 941, 941, 941, 897, 941, 941, 941, 941, + 941, 941, 941, 941, 941, 942, 941, 942, + 942, 942, 941, 941, 941, 941, 941, 941, + 941, 941, 941, 941, 941, 941, 941, 941, + 941, 941, 941, 941, 942, 296, 941, 941, + 941, 941, 941, 941, 941, 941, 941, 941, + 941, 941, 941, 941, 897, 897, 897, 897, + 897, 897, 897, 897, 897, 897, 297, 941, + 941, 298, 941, 296, 941, 897, 897, 897, + 897, 897, 897, 897, 897, 897, 897, 897, + 897, 897, 897, 897, 897, 897, 897, 897, + 897, 897, 897, 897, 897, 897, 897, 941, + 943, 941, 941, 897, 941, 897, 897, 897, + 897, 897, 897, 897, 897, 897, 897, 897, + 897, 897, 897, 897, 1190, 897, 897, 897, + 897, 897, 897, 897, 897, 897, 897, 941, + 941, 941, 941, 941, 897, 941, 941, 941, + 941, 941, 941, 941, 941, 941, 942, 941, + 942, 942, 942, 941, 941, 941, 941, 941, + 941, 941, 941, 941, 941, 941, 941, 941, + 941, 941, 941, 941, 941, 942, 296, 941, + 941, 941, 941, 941, 941, 941, 941, 941, + 941, 941, 941, 941, 941, 897, 897, 897, + 897, 897, 897, 897, 897, 897, 897, 297, + 941, 941, 298, 941, 296, 941, 897, 897, + 897, 897, 897, 897, 897, 897, 897, 897, + 897, 897, 897, 897, 897, 897, 897, 897, + 897, 897, 897, 897, 897, 897, 897, 897, + 941, 943, 941, 941, 897, 941, 897, 897, + 897, 897, 932, 897, 897, 897, 897, 897, + 897, 897, 897, 897, 897, 897, 897, 897, + 897, 897, 897, 897, 897, 897, 897, 897, + 941, 941, 941, 941, 941, 897, 941, 941, + 941, 941, 941, 941, 941, 941, 941, 942, + 941, 942, 942, 942, 941, 941, 941, 941, + 941, 941, 941, 941, 941, 941, 941, 941, + 941, 941, 941, 941, 941, 941, 942, 296, + 941, 941, 941, 941, 941, 941, 941, 941, + 941, 941, 941, 941, 941, 941, 897, 897, + 897, 897, 897, 897, 897, 897, 897, 897, + 297, 941, 941, 298, 941, 296, 941, 897, + 897, 897, 897, 897, 897, 897, 897, 897, + 897, 897, 897, 897, 897, 897, 897, 897, + 897, 897, 897, 897, 897, 897, 897, 897, + 897, 941, 943, 941, 941, 897, 941, 897, + 897, 897, 897, 897, 897, 897, 1191, 897, + 897, 897, 897, 897, 897, 897, 897, 897, + 1192, 897, 897, 897, 897, 897, 897, 897, + 897, 941, 941, 941, 941, 941, 897, 941, + 941, 941, 941, 941, 941, 941, 941, 941, + 942, 941, 942, 942, 942, 941, 941, 941, + 941, 941, 941, 941, 941, 941, 941, 941, + 941, 941, 941, 941, 941, 941, 941, 942, + 296, 941, 941, 941, 941, 941, 941, 941, + 941, 941, 941, 941, 941, 941, 941, 897, + 897, 897, 897, 897, 897, 897, 897, 897, + 897, 297, 941, 941, 298, 941, 296, 941, + 897, 897, 897, 897, 897, 897, 897, 897, + 897, 897, 897, 897, 897, 897, 897, 897, + 897, 897, 897, 897, 897, 897, 897, 897, + 897, 897, 941, 943, 941, 941, 897, 941, + 897, 897, 897, 897, 1152, 897, 897, 897, + 897, 897, 897, 897, 897, 897, 897, 897, + 897, 897, 897, 897, 897, 897, 897, 897, + 897, 897, 941, 941, 941, 941, 941, 897, + 941, 941, 941, 941, 941, 941, 941, 941, + 941, 942, 941, 942, 942, 942, 941, 941, + 941, 941, 941, 941, 941, 941, 941, 941, + 941, 941, 941, 941, 941, 941, 941, 941, + 942, 296, 941, 941, 941, 941, 941, 941, + 941, 941, 941, 941, 941, 941, 941, 941, + 897, 897, 897, 897, 897, 897, 897, 897, + 897, 897, 297, 941, 941, 298, 941, 296, + 941, 897, 897, 897, 897, 897, 897, 897, + 897, 897, 897, 897, 897, 897, 897, 897, + 897, 897, 897, 897, 897, 897, 897, 897, + 897, 897, 897, 941, 943, 941, 941, 897, + 941, 897, 897, 897, 897, 897, 897, 897, + 897, 897, 897, 897, 897, 897, 897, 897, + 897, 897, 897, 897, 897, 1157, 897, 897, + 897, 897, 897, 941, 941, 941, 941, 941, + 897, 941, 941, 941, 941, 941, 941, 941, + 941, 941, 942, 941, 942, 942, 942, 941, + 941, 941, 941, 941, 941, 941, 941, 941, + 941, 941, 941, 941, 941, 941, 941, 941, + 941, 942, 296, 941, 941, 941, 941, 941, + 941, 941, 941, 941, 941, 941, 941, 941, + 941, 897, 897, 897, 897, 897, 897, 897, + 897, 897, 897, 297, 941, 941, 298, 941, + 296, 941, 897, 897, 897, 897, 897, 897, + 897, 897, 897, 897, 897, 897, 897, 897, + 897, 897, 897, 897, 897, 897, 897, 897, + 897, 897, 897, 897, 941, 943, 941, 941, + 897, 941, 897, 897, 897, 897, 897, 897, + 897, 897, 897, 897, 897, 897, 897, 1193, + 897, 897, 897, 897, 897, 897, 897, 897, + 897, 897, 897, 897, 941, 941, 941, 941, + 941, 897, 941, 941, 941, 941, 941, 941, + 941, 941, 941, 942, 941, 942, 942, 942, + 941, 941, 941, 941, 941, 941, 941, 941, + 941, 941, 941, 941, 941, 941, 941, 941, + 941, 941, 942, 296, 941, 941, 941, 941, + 941, 941, 941, 941, 941, 941, 941, 941, + 941, 941, 897, 897, 897, 897, 897, 897, + 897, 897, 897, 897, 297, 941, 941, 298, + 941, 296, 941, 897, 897, 897, 897, 897, + 897, 897, 897, 897, 897, 897, 897, 897, + 897, 897, 897, 897, 897, 897, 897, 897, + 897, 897, 897, 897, 897, 941, 943, 941, + 941, 897, 941, 897, 897, 897, 1194, 897, + 897, 897, 897, 897, 897, 897, 1195, 897, + 897, 897, 897, 897, 897, 897, 1196, 897, + 897, 897, 897, 897, 897, 941, 941, 941, + 941, 941, 897, 941, 941, 941, 941, 941, + 941, 941, 941, 941, 942, 941, 942, 942, + 942, 941, 941, 941, 941, 941, 941, 941, + 941, 941, 941, 941, 941, 941, 941, 941, + 941, 941, 941, 942, 296, 941, 941, 941, + 941, 941, 941, 941, 941, 941, 941, 941, + 941, 941, 941, 897, 897, 897, 897, 897, + 897, 897, 897, 897, 897, 297, 941, 941, + 298, 941, 296, 941, 897, 897, 897, 897, + 897, 897, 897, 897, 897, 897, 897, 897, + 897, 897, 897, 897, 897, 897, 897, 897, + 897, 897, 897, 897, 897, 897, 941, 943, + 941, 941, 897, 941, 897, 897, 897, 897, + 1159, 897, 897, 897, 897, 897, 897, 897, + 897, 897, 897, 897, 897, 897, 897, 897, + 897, 897, 897, 897, 897, 897, 941, 941, + 941, 941, 941, 897, 941, 941, 941, 941, + 941, 941, 941, 941, 941, 942, 941, 942, + 942, 942, 941, 941, 941, 941, 941, 941, + 941, 941, 941, 941, 941, 941, 941, 941, + 941, 941, 941, 941, 942, 296, 941, 941, + 941, 941, 941, 941, 941, 941, 941, 941, + 941, 941, 941, 941, 897, 897, 897, 897, + 897, 897, 897, 897, 897, 897, 297, 941, + 941, 298, 941, 296, 941, 897, 897, 897, + 897, 897, 897, 897, 897, 897, 897, 897, + 897, 897, 897, 897, 897, 897, 897, 897, + 897, 897, 897, 897, 897, 897, 897, 941, + 943, 941, 941, 897, 941, 897, 897, 897, + 897, 1197, 897, 897, 897, 897, 897, 897, + 897, 897, 897, 897, 897, 897, 897, 897, + 897, 897, 897, 897, 897, 897, 897, 941, + 941, 941, 941, 941, 897, 941, 941, 941, + 941, 941, 941, 941, 941, 941, 942, 941, + 942, 942, 942, 941, 941, 941, 941, 941, + 941, 941, 941, 941, 941, 941, 941, 941, + 941, 941, 941, 941, 941, 942, 296, 941, + 941, 941, 941, 941, 941, 941, 941, 941, + 941, 941, 941, 941, 941, 897, 897, 897, + 897, 897, 897, 897, 897, 897, 897, 297, + 941, 941, 298, 941, 296, 941, 897, 897, + 897, 897, 897, 897, 897, 897, 897, 897, + 897, 897, 897, 897, 897, 897, 897, 897, + 897, 897, 897, 897, 897, 897, 897, 897, + 941, 943, 941, 941, 897, 941, 897, 897, + 897, 897, 897, 897, 897, 897, 897, 897, + 897, 897, 897, 897, 897, 897, 897, 897, + 1198, 897, 897, 897, 897, 897, 897, 897, + 941, 941, 941, 941, 941, 897, 941, 941, + 941, 941, 941, 941, 941, 941, 941, 942, + 941, 942, 942, 942, 941, 941, 941, 941, + 941, 941, 941, 941, 941, 941, 941, 941, + 941, 941, 941, 941, 941, 941, 942, 296, + 941, 941, 941, 941, 941, 941, 941, 941, + 941, 941, 941, 941, 941, 941, 897, 897, + 897, 897, 897, 897, 897, 897, 897, 897, + 297, 941, 941, 298, 941, 296, 941, 897, + 897, 897, 897, 897, 897, 897, 897, 897, + 897, 897, 897, 897, 897, 897, 897, 897, + 897, 897, 897, 897, 897, 897, 897, 897, + 897, 941, 943, 941, 941, 897, 941, 897, + 897, 897, 897, 897, 897, 897, 897, 897, + 897, 897, 897, 897, 897, 897, 897, 897, + 897, 1166, 897, 897, 897, 897, 897, 897, + 897, 941, 941, 941, 941, 941, 897, 941, + 941, 941, 941, 941, 941, 941, 941, 941, + 942, 941, 942, 942, 942, 941, 941, 941, + 941, 941, 941, 941, 941, 941, 941, 941, + 941, 941, 941, 941, 941, 941, 941, 942, + 296, 941, 941, 941, 941, 941, 941, 941, + 941, 941, 941, 941, 941, 941, 941, 897, + 897, 897, 897, 897, 897, 897, 897, 897, + 897, 297, 941, 941, 298, 941, 296, 941, + 897, 897, 897, 897, 897, 897, 897, 897, + 897, 897, 897, 897, 897, 897, 897, 897, + 897, 897, 897, 897, 897, 897, 897, 897, + 897, 897, 941, 943, 941, 941, 897, 941, + 897, 897, 897, 897, 897, 897, 897, 897, + 1199, 897, 897, 897, 897, 897, 897, 897, + 897, 897, 897, 897, 897, 897, 897, 897, + 897, 897, 941, 941, 941, 941, 941, 897, + 941, 941, 941, 941, 941, 941, 941, 941, + 941, 942, 941, 942, 942, 942, 941, 941, + 941, 941, 941, 941, 941, 941, 941, 941, + 941, 941, 941, 941, 941, 941, 941, 941, + 942, 296, 941, 941, 941, 941, 941, 941, + 941, 941, 941, 941, 941, 941, 941, 941, + 897, 897, 897, 897, 897, 897, 897, 897, + 897, 897, 297, 941, 941, 298, 941, 296, + 941, 897, 897, 897, 897, 897, 897, 897, + 897, 897, 897, 897, 897, 897, 897, 897, + 897, 897, 897, 897, 897, 897, 897, 897, + 897, 897, 897, 941, 943, 941, 941, 897, + 941, 897, 897, 897, 897, 897, 897, 897, + 897, 897, 897, 897, 1166, 897, 897, 897, + 897, 897, 897, 897, 897, 897, 897, 897, + 897, 897, 897, 941, 941, 941, 941, 941, + 897, 941, 941, 941, 941, 941, 941, 941, + 941, 941, 942, 941, 942, 942, 942, 941, + 941, 941, 941, 941, 941, 941, 941, 941, + 941, 941, 941, 941, 941, 941, 941, 941, + 941, 942, 296, 941, 941, 941, 941, 941, + 941, 941, 941, 941, 941, 941, 941, 941, + 941, 897, 897, 897, 897, 897, 897, 897, + 897, 897, 897, 297, 941, 941, 298, 941, + 296, 941, 897, 897, 897, 897, 897, 897, + 897, 897, 897, 897, 897, 897, 897, 897, + 897, 897, 897, 897, 897, 897, 897, 897, + 897, 897, 897, 897, 941, 943, 941, 941, + 897, 941, 897, 897, 897, 897, 897, 897, + 897, 1200, 897, 897, 897, 897, 897, 897, + 897, 897, 897, 897, 897, 897, 897, 897, + 897, 897, 897, 897, 941, 941, 941, 941, + 941, 897, 941, 941, 941, 941, 941, 941, + 941, 941, 941, 942, 941, 942, 942, 942, + 941, 941, 941, 941, 941, 941, 941, 941, + 941, 941, 941, 941, 941, 941, 941, 941, + 941, 941, 942, 296, 941, 941, 941, 941, + 941, 941, 941, 941, 941, 941, 941, 941, + 941, 941, 897, 897, 897, 897, 897, 897, + 897, 897, 897, 897, 297, 941, 941, 298, + 941, 296, 941, 897, 897, 897, 897, 897, + 897, 897, 897, 897, 897, 897, 897, 897, + 897, 897, 897, 897, 897, 897, 897, 897, + 897, 897, 897, 897, 897, 941, 943, 941, + 941, 897, 941, 897, 897, 897, 897, 1152, + 897, 897, 897, 1201, 897, 897, 897, 897, + 897, 897, 897, 897, 897, 897, 897, 897, + 897, 897, 897, 897, 897, 941, 941, 941, + 941, 941, 897, 941, 941, 941, 941, 941, + 941, 941, 941, 941, 942, 941, 942, 942, + 942, 941, 941, 941, 941, 941, 941, 941, + 941, 941, 941, 941, 941, 941, 941, 941, + 941, 941, 941, 942, 296, 941, 941, 941, + 941, 941, 941, 941, 941, 941, 941, 941, + 941, 941, 941, 897, 897, 897, 897, 897, + 897, 897, 897, 897, 897, 297, 941, 941, + 298, 941, 296, 941, 897, 897, 897, 897, + 897, 897, 897, 897, 897, 897, 897, 897, + 897, 897, 897, 897, 897, 897, 897, 897, + 897, 897, 897, 897, 897, 897, 941, 943, + 941, 941, 897, 941, 897, 897, 897, 897, + 897, 897, 897, 897, 897, 897, 897, 1202, + 897, 897, 897, 897, 897, 897, 897, 897, + 897, 897, 897, 897, 897, 897, 941, 941, + 941, 941, 941, 897, 941, 941, 941, 941, + 941, 941, 941, 941, 941, 942, 941, 942, + 942, 942, 941, 941, 941, 941, 941, 941, + 941, 941, 941, 941, 941, 941, 941, 941, + 941, 941, 941, 941, 942, 296, 941, 941, + 941, 941, 941, 941, 941, 941, 941, 941, + 941, 941, 941, 941, 897, 897, 897, 897, + 897, 897, 897, 897, 897, 897, 297, 941, + 941, 298, 941, 296, 941, 897, 897, 897, + 897, 897, 897, 897, 897, 897, 897, 897, + 897, 897, 897, 897, 897, 897, 897, 897, + 897, 897, 897, 897, 897, 897, 897, 941, + 943, 941, 941, 897, 941, 897, 897, 897, + 897, 1166, 897, 897, 897, 897, 897, 897, + 897, 897, 897, 897, 897, 897, 897, 897, + 897, 897, 897, 897, 897, 897, 897, 941, + 941, 941, 941, 941, 897, 941, 941, 941, + 941, 941, 941, 941, 941, 941, 942, 941, + 942, 942, 942, 941, 941, 941, 941, 941, + 941, 941, 941, 941, 941, 941, 941, 941, + 941, 941, 941, 941, 941, 942, 296, 941, + 941, 941, 941, 941, 941, 941, 941, 941, + 941, 941, 941, 941, 941, 897, 897, 897, + 897, 897, 897, 897, 897, 897, 897, 297, + 941, 941, 298, 941, 296, 941, 897, 897, + 897, 897, 897, 897, 897, 897, 897, 897, + 897, 897, 897, 897, 897, 897, 897, 897, + 897, 897, 897, 897, 897, 897, 897, 897, + 941, 943, 941, 941, 897, 941, 897, 897, + 897, 897, 897, 897, 897, 897, 1203, 897, + 897, 897, 897, 897, 897, 897, 897, 897, + 897, 897, 897, 897, 897, 897, 897, 897, + 941, 941, 941, 941, 941, 897, 941, 941, + 941, 941, 941, 941, 941, 941, 941, 942, + 941, 942, 942, 942, 941, 941, 941, 941, + 941, 941, 941, 941, 941, 941, 941, 941, + 941, 941, 941, 941, 941, 941, 942, 296, + 941, 941, 941, 941, 941, 941, 941, 941, + 941, 941, 941, 941, 941, 941, 897, 897, + 897, 897, 897, 897, 897, 897, 897, 897, + 297, 941, 941, 298, 941, 296, 941, 897, + 897, 897, 897, 897, 897, 897, 897, 897, + 897, 897, 897, 897, 897, 897, 897, 897, + 897, 897, 897, 897, 897, 897, 897, 897, + 897, 941, 943, 941, 941, 897, 941, 897, + 897, 897, 897, 1204, 897, 897, 897, 897, + 897, 897, 897, 897, 897, 897, 897, 897, + 897, 897, 897, 897, 897, 897, 897, 897, + 897, 941, 941, 941, 941, 941, 897, 941, + 941, 941, 941, 941, 941, 941, 941, 941, + 942, 941, 942, 942, 942, 941, 941, 941, + 941, 941, 941, 941, 941, 941, 941, 941, + 941, 941, 941, 941, 941, 941, 941, 942, + 296, 941, 941, 941, 941, 941, 941, 941, + 941, 941, 941, 941, 941, 941, 941, 897, + 897, 897, 897, 897, 897, 897, 897, 897, + 897, 297, 941, 941, 298, 941, 296, 941, + 897, 897, 897, 897, 897, 897, 897, 897, + 897, 897, 897, 897, 897, 897, 897, 897, + 897, 897, 897, 897, 897, 897, 897, 897, + 897, 897, 941, 943, 941, 941, 897, 941, + 897, 897, 897, 897, 897, 897, 897, 897, + 897, 897, 897, 1146, 897, 897, 897, 897, + 897, 897, 897, 897, 897, 897, 897, 897, + 897, 897, 941, 941, 941, 941, 941, 897, + 1205, 221, 963, 963, 963, 963, 963, 963, + 963, 963, 963, 963, 963, 963, 963, 963, + 963, 963, 963, 963, 963, 963, 963, 963, + 963, 963, 963, 963, 963, 963, 963, 963, + 963, 963, 963, 963, 963, 963, 963, 963, + 963, 963, 963, 963, 963, 963, 963, 963, + 963, 963, 963, 963, 963, 963, 963, 963, + 963, 963, 963, 963, 963, 963, 963, 963, + 1206, 963, 1208, 1207, 1207, 1207, 1208, 1207, + 1207, 1207, 1207, 1209, 1210, 1209, 1209, 1209, + 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, + 1207, 1207, 1207, 1207, 1208, 1207, 1207, 1207, + 1207, 1207, 1209, 1207, 1207, 1211, 1207, 1207, + 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, + 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, + 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, + 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, + 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, + 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, + 1207, 1207, 1207, 1207, 1207, 1207, 1212, 1207, + 1209, 1213, 1209, 1209, 1209, 1213, 1213, 1213, + 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, + 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1209, + 1213, 1214, 1215, 1216, 1217, 1218, 1220, 1219, + 1221, 1223, 1224, 1224, 1224, 1223, 1224, 1224, + 1224, 1224, 1225, 1226, 1225, 1225, 1225, 1224, + 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, + 1224, 1224, 1224, 1223, 1224, 1224, 1224, 1224, + 1224, 1225, 1224, 1227, 1228, 1224, 1224, 1224, + 1227, 1224, 1224, 1224, 1224, 1224, 1224, 1224, + 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, + 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, + 1224, 1224, 1222, 1222, 1222, 1222, 1222, 1222, + 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, + 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, + 1222, 1222, 1222, 1222, 1224, 1229, 1224, 1224, + 1222, 1224, 1222, 1222, 1222, 1222, 1222, 1222, + 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, + 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, + 1222, 1222, 1222, 1222, 1224, 1224, 1224, 1224, + 1224, 1222, 1230, 1230, 1230, 1230, 1230, 1230, + 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, + 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, + 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, + 1230, 1230, 1230, 304, 1230, 1230, 1230, 1230, + 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, + 1230, 1230, 303, 303, 303, 303, 303, 303, + 303, 303, 303, 303, 305, 1230, 1230, 1230, + 1230, 304, 1230, 303, 303, 303, 303, 303, + 303, 303, 303, 303, 303, 303, 303, 303, + 303, 303, 303, 303, 303, 303, 303, 303, + 303, 303, 303, 303, 303, 1230, 1230, 1230, + 1230, 303, 1230, 303, 303, 303, 303, 303, + 303, 303, 303, 303, 303, 303, 303, 303, + 303, 303, 303, 303, 303, 303, 303, 303, + 303, 303, 303, 303, 303, 1230, 1230, 1230, + 1230, 1230, 303, 1225, 1231, 1225, 1225, 1225, + 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, + 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, + 1231, 1231, 1225, 1231, 1232, 1233, 1234, 1235, + 1236, 1237, 1230, 1238, 1240, 1241, 1241, 1241, + 1240, 1241, 1241, 1241, 1241, 1242, 1243, 1242, + 1242, 1242, 1241, 1241, 1241, 1241, 1241, 1241, + 1241, 1241, 1241, 1241, 1241, 1241, 1240, 1241, + 1241, 1241, 1241, 1241, 1242, 1244, 1245, 1246, + 1247, 1248, 1249, 1245, 1250, 1251, 1252, 1248, + 1253, 1254, 1255, 1248, 1256, 1257, 1257, 1257, + 1257, 1257, 1257, 1257, 1257, 1257, 1258, 1259, + 1260, 1261, 1262, 1263, 1264, 1265, 1266, 1265, + 1265, 1267, 1265, 1265, 1265, 1265, 1265, 1265, + 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, + 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1268, + 1269, 1270, 1248, 1271, 1245, 1272, 1273, 1274, + 1275, 1276, 1277, 1239, 1239, 1278, 1239, 1239, + 1239, 1279, 1280, 1281, 1239, 1239, 1282, 1283, + 1284, 1285, 1239, 1286, 1239, 1287, 1239, 1288, + 1289, 1290, 1291, 1241, 1239, 313, 313, 313, + 313, 313, 313, 313, 313, 313, 313, 313, + 313, 313, 313, 313, 313, 313, 313, 313, + 313, 313, 313, 313, 313, 313, 313, 313, + 313, 313, 313, 313, 313, 313, 1292, 313, + 313, 313, 313, 313, 313, 313, 313, 313, + 313, 313, 313, 313, 313, 1239, 1239, 1239, + 1239, 1239, 1239, 1239, 1239, 1239, 1239, 313, + 313, 313, 313, 313, 1292, 313, 1239, 1239, + 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, + 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, + 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, + 313, 313, 313, 313, 1239, 313, 1239, 1239, + 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, + 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, + 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, + 313, 313, 313, 313, 313, 1239, 1294, 1293, + 1295, 1242, 1296, 1242, 1242, 1242, 1296, 1296, + 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, + 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, + 1242, 1296, 1297, 1299, 1298, 1298, 1298, 1298, + 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, + 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, + 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, + 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, + 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, + 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, + 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, + 1298, 1298, 1298, 1298, 1299, 1298, 1300, 1301, + 1302, 1303, 1304, 1304, 1304, 1304, 1304, 1304, + 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, + 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, + 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, + 1304, 1304, 1304, 308, 308, 1304, 308, 1304, + 308, 308, 1304, 1304, 308, 308, 308, 1305, + 308, 308, 1306, 1306, 1306, 1306, 1306, 1306, + 1306, 1306, 1306, 1306, 308, 308, 308, 308, + 308, 308, 308, 325, 325, 325, 325, 325, + 325, 325, 325, 325, 325, 325, 325, 325, + 325, 325, 325, 325, 325, 325, 325, 325, + 325, 325, 325, 325, 325, 1304, 308, 1304, + 1304, 325, 308, 325, 325, 325, 325, 325, + 325, 325, 325, 325, 325, 325, 325, 325, + 325, 325, 325, 325, 325, 325, 325, 325, + 325, 325, 325, 325, 325, 1304, 1304, 1304, + 308, 1304, 325, 1307, 1307, 1307, 1307, 1307, + 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, + 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, + 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, + 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, + 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, + 1307, 1307, 1307, 325, 325, 325, 325, 325, + 325, 325, 325, 325, 325, 1307, 1307, 1307, + 1307, 1307, 1307, 1307, 325, 325, 325, 325, + 325, 325, 325, 325, 325, 325, 325, 325, + 325, 325, 325, 325, 325, 325, 325, 325, + 325, 325, 325, 325, 325, 325, 1307, 1307, + 1307, 1307, 325, 1307, 325, 325, 325, 325, + 325, 325, 325, 325, 325, 325, 325, 325, + 325, 325, 325, 325, 325, 325, 325, 325, + 325, 325, 325, 325, 325, 325, 1307, 1307, + 1307, 1307, 1307, 325, 1306, 1306, 1306, 1306, + 1306, 1306, 1306, 1306, 1306, 1306, 1307, 1308, + 313, 1248, 1309, 1309, 1309, 1309, 1309, 1309, + 1309, 1310, 1309, 1309, 1309, 1309, 1309, 1309, + 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, + 1308, 1309, 1311, 1312, 1248, 1313, 1313, 1313, + 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, + 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1308, + 1313, 1308, 1314, 1309, 1316, 1315, 312, 312, + 312, 312, 312, 312, 312, 312, 312, 312, + 1315, 1318, 1317, 1319, 1317, 312, 312, 312, + 312, 312, 312, 312, 312, 312, 312, 1320, + 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, + 1320, 1320, 1321, 1320, 1320, 1320, 1320, 1320, + 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, + 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, + 1320, 1320, 1320, 1320, 1322, 1320, 1320, 1320, + 1320, 1320, 1321, 1320, 311, 311, 311, 311, + 311, 311, 311, 311, 311, 311, 1320, 1320, + 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, + 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, + 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, + 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, + 1320, 1320, 1320, 310, 1320, 1324, 1323, 1325, + 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, + 1325, 1323, 1323, 1323, 1323, 1323, 1323, 1323, + 1323, 1326, 1323, 1327, 1328, 1323, 1323, 1323, + 1323, 1323, 1323, 1323, 1323, 1323, 1329, 1323, + 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1330, + 1323, 1323, 1323, 1323, 1323, 1323, 1331, 1323, + 1323, 1326, 1323, 1327, 1328, 1323, 1323, 1323, + 1332, 1323, 1323, 1323, 1323, 1323, 1329, 1323, + 1323, 1333, 1323, 1323, 1323, 1323, 1323, 1330, + 1323, 314, 314, 314, 314, 314, 314, 314, + 314, 314, 314, 1334, 1334, 1334, 1334, 1334, + 1334, 1334, 1334, 1334, 1334, 1334, 1335, 1334, + 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, + 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, + 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, + 1336, 1334, 1334, 1334, 1334, 1334, 1335, 1334, + 1334, 1334, 1337, 1334, 1334, 1334, 1334, 1334, + 1334, 1334, 1334, 1338, 1334, 1339, 313, 1339, + 313, 313, 315, 315, 315, 315, 315, 315, + 315, 315, 315, 315, 313, 315, 315, 315, + 315, 315, 315, 315, 315, 315, 315, 1340, + 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, + 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, + 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, + 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, + 1340, 1340, 1340, 1340, 1339, 1340, 1340, 1340, + 1340, 1340, 1340, 1340, 1340, 1340, 1341, 1340, + 1343, 1342, 1344, 1346, 1345, 1345, 1345, 1347, + 1345, 1348, 1349, 1325, 1325, 1325, 1325, 1325, + 1325, 1325, 1325, 1325, 1325, 1323, 1323, 1323, + 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, + 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, + 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, + 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, + 1323, 1323, 1331, 1323, 1323, 1323, 1323, 1323, + 1323, 1323, 1323, 1323, 1332, 1323, 1323, 1323, + 1323, 1323, 1323, 1323, 1323, 1333, 1323, 1350, + 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, + 1350, 1323, 1323, 1323, 1323, 1323, 1323, 1323, + 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, + 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, + 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, + 1323, 1323, 1323, 1323, 1323, 1323, 1351, 1323, + 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, + 1332, 1323, 1323, 1323, 1323, 1323, 1323, 1323, + 1323, 1333, 1323, 1353, 1353, 1353, 1353, 1353, + 1353, 1353, 1353, 1353, 1353, 1352, 1352, 1352, + 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, + 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, + 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, + 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, + 1352, 1352, 1354, 1352, 1352, 1352, 1352, 1352, + 1352, 1352, 1352, 1352, 1355, 1352, 1352, 1352, + 1352, 1352, 1352, 1352, 1352, 1356, 1352, 1353, + 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, + 1353, 1352, 1352, 1352, 1352, 1352, 1352, 1352, + 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, + 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, + 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, + 1352, 1352, 1352, 1352, 1352, 1352, 1357, 1352, + 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, + 1355, 1352, 1352, 1352, 1352, 1352, 1352, 1352, + 1352, 1356, 1352, 1355, 1352, 1352, 1352, 1352, + 1352, 1352, 1352, 1352, 1356, 1352, 1359, 1358, + 1360, 1362, 1361, 1361, 1361, 1363, 1361, 1365, + 1364, 1366, 1367, 1369, 1369, 1368, 1368, 1368, + 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, + 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, + 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, + 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, + 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, + 1368, 1368, 1370, 1368, 1368, 1368, 1368, 1368, + 1368, 1368, 1368, 1368, 1371, 1368, 1368, 1368, + 1368, 1368, 1368, 1368, 1368, 1372, 1368, 1373, + 1373, 1352, 1352, 1352, 1352, 1352, 1352, 1352, + 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, + 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, + 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, + 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, + 1352, 1352, 1352, 1352, 1352, 1352, 1374, 1352, + 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, + 1355, 1352, 1352, 1352, 1352, 1352, 1352, 1352, + 1352, 1356, 1352, 1373, 1373, 1352, 1352, 1352, + 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, + 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, + 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, + 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, + 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, + 1352, 1352, 1357, 1352, 1352, 1352, 1352, 1352, + 1352, 1352, 1352, 1352, 1355, 1352, 1352, 1352, + 1352, 1352, 1352, 1352, 1352, 1356, 1352, 1376, + 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, + 1376, 1375, 1375, 1375, 1375, 1375, 1375, 1375, + 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, + 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, + 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, + 1375, 1375, 1375, 1375, 1375, 1375, 1377, 1375, + 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, + 1378, 1375, 1375, 1375, 1375, 1375, 1375, 1375, + 1375, 1379, 1375, 1381, 1381, 1381, 1381, 1381, + 1381, 1381, 1381, 1381, 1381, 1380, 1380, 1380, + 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, + 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, + 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, + 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, + 1380, 1380, 1382, 1380, 1380, 1380, 1380, 1380, + 1380, 1380, 1380, 1380, 1383, 1380, 1380, 1380, + 1380, 1380, 1380, 1380, 1380, 1384, 1380, 1386, + 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, + 1386, 1385, 1385, 1385, 1385, 1385, 1385, 1385, + 1386, 1386, 1386, 1386, 1386, 1386, 1385, 1385, + 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, + 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, + 1385, 1385, 1385, 1385, 1385, 1385, 1387, 1385, + 1386, 1386, 1386, 1386, 1386, 1386, 1385, 1385, + 1388, 1385, 1385, 1385, 1385, 1385, 1385, 1385, + 1385, 1389, 1385, 1390, 1390, 1390, 1390, 1390, + 1390, 1390, 1390, 1390, 1390, 1352, 1352, 1352, + 1352, 1352, 1352, 1352, 1390, 1390, 1390, 1390, + 1390, 1390, 1352, 1352, 1352, 1352, 1352, 1352, + 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, + 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, + 1352, 1352, 1391, 1352, 1390, 1390, 1390, 1390, + 1390, 1390, 1352, 1352, 1355, 1352, 1352, 1352, + 1352, 1352, 1352, 1352, 1352, 1356, 1352, 1390, + 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, + 1390, 1352, 1352, 1352, 1352, 1352, 1352, 1352, + 1390, 1390, 1390, 1390, 1390, 1390, 1352, 1352, + 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, + 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, + 1352, 1352, 1352, 1352, 1352, 1352, 1357, 1352, + 1390, 1390, 1390, 1390, 1390, 1390, 1352, 1352, + 1355, 1352, 1352, 1352, 1352, 1352, 1352, 1352, + 1352, 1356, 1352, 1393, 1392, 1394, 1394, 1394, + 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1392, + 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, + 1392, 1392, 1395, 1392, 1392, 1392, 1392, 1392, + 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, + 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, + 1392, 1392, 1392, 1392, 1396, 1392, 1392, 1392, + 1392, 1392, 1395, 1392, 1392, 1392, 1397, 1392, + 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1398, + 1392, 1399, 1399, 1399, 1399, 1399, 1399, 1399, + 1399, 1399, 1399, 1392, 1392, 1392, 1392, 1392, + 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, + 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, + 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, + 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, + 1400, 1392, 1392, 1392, 1392, 1392, 1392, 1392, + 1392, 1392, 1397, 1392, 1392, 1392, 1392, 1392, + 1392, 1392, 1392, 1398, 1392, 1401, 1352, 1402, + 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, + 1402, 1352, 1352, 1352, 1352, 1352, 1352, 1352, + 1352, 1352, 1352, 1352, 1403, 1352, 1352, 1352, + 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, + 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, + 1352, 1352, 1352, 1352, 1352, 1352, 1404, 1352, + 1352, 1352, 1352, 1352, 1403, 1352, 1352, 1352, + 1355, 1352, 1352, 1352, 1352, 1352, 1352, 1352, + 1352, 1356, 1352, 1402, 1402, 1402, 1402, 1402, + 1402, 1402, 1402, 1402, 1402, 1352, 1352, 1352, + 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, + 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, + 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, + 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, + 1352, 1352, 1357, 1352, 1352, 1352, 1352, 1352, + 1352, 1352, 1352, 1352, 1355, 1352, 1352, 1352, + 1352, 1352, 1352, 1352, 1352, 1356, 1352, 1310, + 1317, 1248, 1405, 1309, 1299, 1309, 1406, 1407, + 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, + 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, + 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, + 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, + 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, + 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, + 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, + 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1299, + 1317, 1299, 1309, 1299, 1248, 1309, 1304, 1304, + 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, + 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, + 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, + 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, + 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, + 1304, 1304, 1304, 1304, 1304, 1304, 325, 325, + 325, 325, 325, 325, 325, 325, 325, 325, + 1304, 1304, 1304, 1304, 1304, 1304, 1408, 325, + 325, 325, 325, 325, 325, 325, 325, 325, + 325, 325, 325, 325, 325, 325, 325, 325, + 325, 325, 325, 325, 325, 325, 325, 325, + 325, 1304, 1304, 1304, 1304, 325, 1304, 325, + 325, 325, 325, 325, 325, 325, 325, 325, + 325, 325, 325, 325, 325, 325, 325, 325, + 325, 325, 325, 325, 325, 325, 325, 325, + 325, 1304, 1304, 1304, 1304, 1304, 325, 313, + 313, 313, 313, 313, 313, 313, 313, 313, + 313, 313, 313, 313, 313, 313, 313, 313, + 313, 313, 313, 313, 313, 313, 313, 313, + 313, 313, 313, 313, 313, 313, 313, 313, + 1292, 313, 313, 313, 313, 313, 313, 313, + 313, 313, 313, 313, 313, 313, 313, 1265, + 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, + 1265, 1409, 313, 313, 313, 313, 1292, 313, + 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, + 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, + 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, + 1265, 1265, 313, 313, 313, 313, 1265, 313, + 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, + 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, + 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, + 1265, 1265, 313, 313, 313, 313, 313, 1265, + 1410, 1411, 1411, 1411, 1411, 1411, 1411, 1411, + 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, + 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, + 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, + 1411, 1411, 1292, 1411, 1411, 1411, 1411, 1411, + 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, + 1411, 1265, 1265, 1265, 1265, 1265, 1265, 1265, + 1265, 1265, 1265, 1409, 1411, 1411, 1411, 1411, + 1292, 1411, 1265, 1265, 1265, 1265, 1412, 1265, + 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, + 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, + 1265, 1265, 1265, 1265, 1411, 1411, 1411, 1411, + 1265, 1411, 1265, 1265, 1265, 1265, 1265, 1265, + 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, + 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, + 1265, 1265, 1265, 1265, 1411, 1411, 1411, 1411, + 1411, 1265, 1411, 1411, 1411, 1411, 1411, 1411, + 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, + 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, + 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, + 1411, 1411, 1411, 1292, 1411, 1411, 1411, 1411, + 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, + 1411, 1411, 1265, 1265, 1265, 1265, 1265, 1265, + 1265, 1265, 1265, 1265, 1409, 1411, 1411, 1411, + 1411, 1292, 1411, 1265, 1265, 1265, 1265, 1265, + 1265, 1413, 1265, 1265, 1265, 1265, 1265, 1265, + 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, + 1265, 1265, 1265, 1265, 1265, 1411, 1411, 1411, + 1411, 1265, 1411, 1265, 1265, 1265, 1265, 1265, + 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, + 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, + 1265, 1265, 1265, 1265, 1265, 1411, 1411, 1411, + 1411, 1411, 1265, 1411, 1411, 1411, 1411, 1411, + 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, + 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, + 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, + 1411, 1411, 1411, 1411, 1292, 1411, 1411, 1411, + 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, + 1411, 1411, 1411, 1265, 1265, 1265, 1265, 1265, + 1265, 1265, 1265, 1265, 1265, 1409, 1411, 1411, + 1411, 1411, 1292, 1411, 1265, 1265, 1265, 1265, + 1265, 1265, 1265, 1265, 1414, 1265, 1265, 1265, + 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, + 1265, 1265, 1265, 1265, 1265, 1265, 1411, 1411, + 1411, 1411, 1265, 1411, 1265, 1265, 1265, 1265, + 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, + 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, + 1265, 1265, 1265, 1265, 1265, 1265, 1411, 1411, + 1411, 1411, 1411, 1265, 1411, 1411, 1411, 1411, + 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, + 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, + 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, + 1411, 1411, 1411, 1411, 1411, 1292, 1411, 1411, + 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, + 1411, 1411, 1411, 1411, 1265, 1265, 1265, 1265, + 1265, 1265, 1265, 1265, 1265, 1265, 1409, 1411, + 1411, 1411, 1411, 1292, 1411, 1265, 1265, 1265, + 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, + 1265, 1265, 1415, 1265, 1265, 1265, 1265, 1265, + 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1411, + 1411, 1411, 1411, 1265, 1411, 1265, 1265, 1265, + 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, + 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, + 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1411, + 1411, 1411, 1411, 1411, 1265, 1411, 1411, 1411, + 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, + 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, + 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, + 1411, 1411, 1411, 1411, 1411, 1411, 1292, 1411, + 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, + 1411, 1411, 1411, 1411, 1411, 1265, 1265, 1265, + 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1409, + 1411, 1411, 1411, 1411, 1292, 1411, 1265, 1265, + 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, + 1265, 1265, 1265, 1416, 1265, 1265, 1265, 1265, + 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, + 1411, 1411, 1411, 1411, 1265, 1411, 1265, 1265, + 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, + 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, + 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, + 1411, 1411, 1411, 1411, 1411, 1265, 1411, 1411, + 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, + 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, + 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, + 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1292, + 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, + 1411, 1411, 1411, 1411, 1411, 1411, 1265, 1265, + 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, + 1409, 1411, 1411, 1411, 1411, 1292, 1411, 1265, + 1265, 1265, 1415, 1265, 1265, 1265, 1265, 1265, + 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, + 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, + 1265, 1411, 1411, 1411, 1411, 1265, 1411, 1265, + 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, + 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, + 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, + 1265, 1411, 1411, 1411, 1411, 1411, 1265, 1417, + 1419, 1418, 1420, 1421, 1422, 1422, 1422, 1422, + 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, + 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, + 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, + 1422, 1422, 1422, 1422, 1422, 1292, 1422, 1422, + 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, + 1422, 1422, 1422, 1422, 1239, 1239, 1239, 1239, + 1239, 1239, 1239, 1239, 1239, 1239, 1422, 1422, + 1422, 1422, 1422, 1292, 1422, 1239, 1239, 1239, + 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, + 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, + 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1422, + 1422, 1422, 1422, 1423, 1422, 1239, 1239, 1239, + 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, + 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, + 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1422, + 1422, 1422, 1422, 1422, 1239, 1422, 1422, 1422, + 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, + 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, + 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, + 1422, 1422, 1422, 1422, 1422, 1422, 1292, 1422, + 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, + 1422, 1422, 1422, 1422, 1422, 1239, 1239, 1239, + 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1422, + 1422, 1422, 1422, 1422, 1292, 1422, 1239, 1239, + 1239, 1239, 1424, 1425, 1239, 1239, 1239, 1239, + 1239, 1426, 1239, 1239, 1239, 1239, 1239, 1239, + 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, + 1422, 1422, 1422, 1422, 1239, 1422, 1239, 1239, + 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, + 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, + 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, + 1422, 1422, 1422, 1422, 1422, 1239, 1422, 1422, + 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, + 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, + 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, + 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1292, + 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, + 1422, 1422, 1422, 1422, 1422, 1422, 1239, 1239, + 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, + 1422, 1422, 1422, 1422, 1422, 1292, 1422, 1239, + 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, + 1239, 1239, 1239, 1239, 1427, 1239, 1239, 1239, + 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, + 1239, 1422, 1422, 1422, 1422, 1239, 1422, 1239, + 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, + 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, + 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, + 1239, 1422, 1422, 1422, 1422, 1422, 1239, 1422, + 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, + 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, + 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, + 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, + 1292, 1422, 1422, 1422, 1422, 1422, 1422, 1422, + 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1239, + 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, + 1239, 1422, 1422, 1422, 1422, 1422, 1292, 1422, + 1239, 1239, 1428, 1239, 1239, 1239, 1239, 1239, + 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, + 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, + 1239, 1239, 1422, 1422, 1422, 1422, 1239, 1422, + 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, + 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, + 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, + 1239, 1239, 1422, 1422, 1422, 1422, 1422, 1239, + 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, + 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, + 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, + 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, + 1422, 1292, 1422, 1422, 1422, 1422, 1422, 1422, + 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, + 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, + 1239, 1239, 1422, 1422, 1422, 1422, 1422, 1292, + 1422, 1239, 1239, 1239, 1239, 1239, 1239, 1239, + 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1429, + 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, + 1239, 1239, 1239, 1422, 1422, 1422, 1422, 1239, + 1422, 1239, 1239, 1239, 1239, 1239, 1239, 1239, + 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, + 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, + 1239, 1239, 1239, 1422, 1422, 1422, 1422, 1422, + 1239, 1422, 1422, 1422, 1422, 1422, 1422, 1422, + 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, + 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, + 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, + 1422, 1422, 1292, 1422, 1422, 1422, 1422, 1422, + 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, + 1422, 1239, 1239, 1239, 1239, 1239, 1239, 1239, + 1239, 1239, 1239, 1422, 1422, 1422, 1422, 1422, + 1292, 1422, 1239, 1239, 1239, 1430, 1239, 1239, + 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, + 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, + 1239, 1239, 1239, 1239, 1422, 1422, 1422, 1422, + 1239, 1422, 1239, 1239, 1239, 1239, 1239, 1239, + 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, + 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, + 1239, 1239, 1239, 1239, 1422, 1422, 1422, 1422, + 1422, 1239, 1422, 1422, 1422, 1422, 1422, 1422, + 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, + 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, + 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, + 1422, 1422, 1422, 1292, 1422, 1422, 1422, 1422, + 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, + 1422, 1422, 1239, 1239, 1239, 1239, 1239, 1239, + 1239, 1239, 1239, 1239, 1422, 1422, 1422, 1422, + 1422, 1292, 1422, 1239, 1239, 1239, 1239, 1239, + 1239, 1239, 1239, 1431, 1239, 1239, 1239, 1239, + 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, + 1239, 1239, 1239, 1239, 1239, 1422, 1422, 1422, + 1422, 1239, 1422, 1239, 1239, 1239, 1239, 1239, + 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, + 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, + 1239, 1239, 1239, 1239, 1239, 1422, 1422, 1422, + 1422, 1422, 1239, 1422, 1422, 1422, 1422, 1422, + 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, + 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, + 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, + 1422, 1422, 1422, 1422, 1292, 1422, 1422, 1422, + 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, + 1422, 1422, 1422, 1239, 1239, 1239, 1239, 1239, + 1239, 1239, 1239, 1239, 1239, 1422, 1422, 1422, + 1422, 1422, 1292, 1422, 1239, 1239, 1239, 1239, + 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, + 1239, 1432, 1239, 1239, 1239, 1239, 1239, 1239, + 1239, 1239, 1239, 1239, 1239, 1239, 1422, 1422, + 1422, 1422, 1239, 1422, 1239, 1239, 1239, 1239, + 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, + 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, + 1239, 1239, 1239, 1239, 1239, 1239, 1422, 1422, + 1422, 1422, 1422, 1239, 1422, 1422, 1422, 1422, + 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, + 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, + 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, + 1422, 1422, 1422, 1422, 1422, 1292, 1422, 1422, + 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, + 1422, 1422, 1422, 1422, 1239, 1239, 1239, 1239, + 1239, 1239, 1239, 1239, 1239, 1239, 1422, 1422, + 1422, 1422, 1422, 1292, 1422, 1239, 1239, 1239, + 1239, 1239, 1239, 1433, 1239, 1239, 1239, 1239, + 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, + 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1422, + 1422, 1422, 1422, 1239, 1422, 1239, 1239, 1239, + 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, + 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, + 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1422, + 1422, 1422, 1422, 1422, 1239, 1422, 1422, 1422, + 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, + 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, + 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, + 1422, 1422, 1422, 1422, 1422, 1422, 1292, 1422, + 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, + 1422, 1422, 1422, 1422, 1422, 1239, 1239, 1239, + 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1422, + 1422, 1422, 1422, 1422, 1292, 1422, 1239, 1239, + 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, + 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, + 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, + 1422, 1422, 1422, 1422, 1434, 1422, 1239, 1239, + 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, + 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, + 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, + 1422, 1422, 1422, 1422, 1422, 1239, 1422, 1422, + 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, + 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, + 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, + 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1292, + 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, + 1422, 1422, 1422, 1422, 1422, 1422, 1239, 1239, + 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, + 1422, 1422, 1422, 1422, 1422, 1292, 1422, 1239, + 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, + 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, + 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, + 1239, 1422, 1422, 1422, 1422, 1435, 1422, 1239, + 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, + 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, + 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, + 1239, 1422, 1422, 1422, 1422, 1422, 1239, 1422, + 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, + 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, + 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, + 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, + 1292, 1422, 1422, 1422, 1422, 1422, 1422, 1422, + 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1239, + 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, + 1239, 1422, 1422, 1422, 1422, 1422, 1292, 1422, + 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, + 1436, 1239, 1239, 1239, 1239, 1239, 1239, 1239, + 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, + 1239, 1239, 1422, 1422, 1422, 1422, 1239, 1422, + 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, + 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, + 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, + 1239, 1239, 1422, 1422, 1422, 1422, 1422, 1239, + 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, + 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, + 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, + 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, + 1422, 1292, 1422, 1422, 1422, 1422, 1422, 1422, + 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, + 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, + 1239, 1239, 1422, 1422, 1422, 1422, 1422, 1292, + 1422, 1239, 1239, 1239, 1239, 1239, 1239, 1239, + 1239, 1239, 1239, 1239, 1437, 1239, 1239, 1239, + 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, + 1239, 1239, 1239, 1422, 1422, 1422, 1422, 1239, + 1422, 1239, 1239, 1239, 1239, 1239, 1239, 1239, + 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, + 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, + 1239, 1239, 1239, 1422, 1422, 1422, 1422, 1422, + 1239, 1422, 1422, 1422, 1422, 1422, 1422, 1422, + 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, + 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, + 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, + 1422, 1422, 1292, 1422, 1422, 1422, 1422, 1422, + 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, + 1422, 1239, 1239, 1239, 1239, 1239, 1239, 1239, + 1239, 1239, 1239, 1422, 1422, 1422, 1422, 1422, + 1292, 1422, 1239, 1239, 1239, 1239, 1438, 1239, + 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, + 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, + 1239, 1239, 1239, 1239, 1422, 1422, 1422, 1422, + 1239, 1422, 1239, 1239, 1239, 1239, 1239, 1239, + 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, + 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, + 1239, 1239, 1239, 1239, 1422, 1422, 1422, 1422, + 1422, 1239, 1422, 1422, 1422, 1422, 1422, 1422, + 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, + 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, + 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, + 1422, 1422, 1422, 1292, 1422, 1422, 1422, 1422, + 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, + 1422, 1422, 1239, 1239, 1239, 1239, 1239, 1239, + 1239, 1239, 1239, 1239, 1422, 1422, 1422, 1422, + 1422, 1292, 1422, 1239, 1239, 1239, 1239, 1239, + 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, + 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, + 1239, 1239, 1239, 1239, 1239, 1422, 1422, 1422, + 1422, 1439, 1422, 1239, 1239, 1239, 1239, 1239, + 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, + 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, + 1239, 1239, 1239, 1239, 1239, 1422, 1422, 1422, + 1422, 1422, 1239, 1422, 1422, 1422, 1422, 1422, + 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, + 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, + 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, + 1422, 1422, 1422, 1422, 1292, 1422, 1422, 1422, + 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, + 1422, 1422, 1422, 1239, 1239, 1239, 1239, 1239, + 1239, 1239, 1239, 1239, 1239, 1422, 1422, 1422, + 1422, 1422, 1292, 1422, 1239, 1239, 1239, 1239, + 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, + 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, + 1239, 1239, 1239, 1239, 1239, 1239, 1422, 1422, + 1422, 1422, 1440, 1422, 1239, 1239, 1239, 1239, + 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, + 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, + 1239, 1239, 1239, 1239, 1239, 1239, 1422, 1422, + 1422, 1422, 1422, 1239, 1422, 1422, 1422, 1422, + 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, + 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, + 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, + 1422, 1422, 1422, 1422, 1422, 1292, 1422, 1422, + 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, + 1422, 1422, 1422, 1422, 1239, 1239, 1239, 1239, + 1239, 1239, 1239, 1239, 1239, 1239, 1422, 1422, + 1422, 1422, 1422, 1292, 1422, 1239, 1239, 1239, + 1239, 1239, 1239, 1239, 1239, 1441, 1239, 1239, + 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, + 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1422, + 1422, 1422, 1422, 1239, 1422, 1239, 1239, 1239, + 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, + 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, + 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1422, + 1422, 1422, 1422, 1422, 1239, 1422, 1422, 1422, + 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, + 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, + 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, + 1422, 1422, 1422, 1422, 1422, 1422, 1292, 1422, + 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, + 1422, 1422, 1422, 1422, 1422, 1239, 1239, 1239, + 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1422, + 1422, 1422, 1422, 1422, 1292, 1422, 1239, 1239, + 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, + 1239, 1239, 1239, 1437, 1239, 1239, 1239, 1239, + 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, + 1422, 1422, 1422, 1422, 1239, 1422, 1239, 1239, + 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, + 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, + 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, + 1422, 1422, 1422, 1422, 1422, 1239, 1422, 1422, + 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, + 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, + 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, + 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1292, + 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, + 1422, 1422, 1422, 1422, 1422, 1422, 1239, 1239, + 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, + 1422, 1422, 1422, 1422, 1422, 1292, 1422, 1239, + 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, + 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, + 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, + 1239, 1422, 1422, 1422, 1422, 1239, 1422, 1239, + 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, + 1239, 1239, 1442, 1239, 1443, 1239, 1239, 1239, + 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, + 1239, 1422, 1422, 1422, 1422, 1422, 1239, 1422, + 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, + 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, + 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, + 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, + 1292, 1422, 1422, 1422, 1422, 1422, 1422, 1422, + 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1239, + 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, + 1239, 1422, 1422, 1422, 1422, 1422, 1292, 1422, + 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, + 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, + 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, + 1239, 1239, 1422, 1422, 1422, 1422, 1239, 1422, + 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, + 1444, 1239, 1239, 1239, 1239, 1239, 1239, 1239, + 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, + 1239, 1239, 1422, 1422, 1422, 1422, 1422, 1239, + 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, + 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, + 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, + 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, + 1422, 1292, 1422, 1422, 1422, 1422, 1422, 1422, + 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, + 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, + 1239, 1239, 1422, 1422, 1422, 1422, 1422, 1292, + 1422, 1239, 1239, 1239, 1239, 1239, 1239, 1239, + 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, + 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, + 1239, 1239, 1239, 1422, 1422, 1422, 1422, 1239, + 1422, 1445, 1239, 1239, 1239, 1239, 1239, 1239, + 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, + 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, + 1239, 1239, 1239, 1422, 1422, 1422, 1422, 1422, + 1239, 1422, 1422, 1422, 1422, 1422, 1422, 1422, + 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, + 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, + 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, + 1422, 1422, 1292, 1422, 1422, 1422, 1422, 1422, + 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, + 1422, 1239, 1239, 1239, 1239, 1239, 1239, 1239, + 1239, 1239, 1239, 1422, 1422, 1422, 1422, 1422, + 1292, 1422, 1239, 1239, 1239, 1239, 1239, 1239, + 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, + 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, + 1239, 1239, 1239, 1239, 1422, 1422, 1422, 1422, + 1239, 1422, 1239, 1239, 1239, 1239, 1239, 1239, + 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, + 1239, 1239, 1239, 1239, 1446, 1239, 1239, 1239, + 1239, 1239, 1239, 1239, 1422, 1422, 1422, 1422, + 1422, 1239, 1422, 1422, 1422, 1422, 1422, 1422, + 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, + 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, + 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, + 1422, 1422, 1422, 1292, 1422, 1422, 1422, 1422, + 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, + 1422, 1422, 1239, 1239, 1239, 1239, 1239, 1239, + 1239, 1239, 1239, 1239, 1422, 1422, 1422, 1422, + 1422, 1292, 1422, 1239, 1239, 1239, 1239, 1239, + 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, + 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, + 1239, 1239, 1239, 1239, 1239, 1422, 1422, 1422, + 1422, 1239, 1422, 1239, 1239, 1239, 1447, 1239, + 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, + 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, + 1239, 1239, 1239, 1239, 1239, 1422, 1422, 1422, + 1422, 1422, 1239, 1422, 1422, 1422, 1422, 1422, + 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, + 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, + 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, + 1422, 1422, 1422, 1422, 1292, 1422, 1422, 1422, + 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, + 1422, 1422, 1422, 1239, 1239, 1239, 1239, 1239, + 1239, 1239, 1239, 1239, 1239, 1422, 1422, 1422, + 1422, 1422, 1292, 1422, 1239, 1239, 1239, 1239, + 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, + 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, + 1239, 1239, 1239, 1239, 1239, 1239, 1422, 1422, + 1422, 1422, 1239, 1422, 1239, 1239, 1239, 1239, + 1448, 1239, 1239, 1239, 1239, 1239, 1239, 1239, + 1239, 1239, 1239, 1239, 1239, 1449, 1239, 1239, + 1239, 1239, 1239, 1239, 1239, 1239, 1422, 1422, + 1422, 1422, 1422, 1239, 1422, 1422, 1422, 1422, + 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, + 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, + 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, + 1422, 1422, 1422, 1422, 1422, 1292, 1422, 1422, + 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, + 1422, 1422, 1422, 1422, 1239, 1239, 1239, 1239, + 1239, 1239, 1239, 1239, 1239, 1239, 1422, 1422, + 1422, 1422, 1422, 1292, 1422, 1239, 1239, 1239, + 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, + 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, + 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1422, + 1422, 1422, 1422, 1239, 1422, 1239, 1239, 1239, + 1239, 1239, 1239, 1450, 1239, 1239, 1239, 1239, + 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, + 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1422, + 1422, 1422, 1422, 1422, 1239, 1422, 1422, 1422, + 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, + 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, + 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, + 1422, 1422, 1422, 1422, 1422, 1422, 1292, 1422, + 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, + 1422, 1422, 1422, 1422, 1422, 1239, 1239, 1239, + 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1422, + 1422, 1422, 1422, 1422, 1292, 1422, 1239, 1239, + 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, + 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, + 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, + 1422, 1422, 1422, 1422, 1239, 1422, 1239, 1239, + 1239, 1239, 1239, 1239, 1239, 1239, 1451, 1239, + 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, + 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, + 1422, 1422, 1422, 1422, 1422, 1239, 1422, 1422, + 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, + 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, + 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, + 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1292, + 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, + 1422, 1422, 1422, 1422, 1422, 1422, 1239, 1239, + 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, + 1422, 1422, 1422, 1422, 1422, 1292, 1422, 1239, + 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, + 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, + 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, + 1239, 1422, 1422, 1422, 1422, 1239, 1422, 1239, + 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, + 1239, 1239, 1239, 1239, 1447, 1239, 1239, 1239, + 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, + 1239, 1422, 1422, 1422, 1422, 1422, 1239, 1422, + 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, + 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, + 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, + 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, + 1292, 1422, 1422, 1422, 1422, 1422, 1422, 1422, + 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1239, + 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, + 1239, 1422, 1422, 1422, 1422, 1422, 1292, 1422, + 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, + 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, + 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, + 1239, 1239, 1422, 1422, 1422, 1422, 1239, 1422, + 1239, 1239, 1239, 1239, 1452, 1239, 1239, 1239, + 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, + 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, + 1239, 1239, 1422, 1422, 1422, 1422, 1422, 1239, + 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, + 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, + 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, + 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, + 1422, 1292, 1422, 1422, 1422, 1422, 1422, 1422, + 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, + 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, + 1239, 1239, 1422, 1422, 1422, 1422, 1422, 1292, + 1422, 1239, 1239, 1239, 1239, 1239, 1239, 1239, + 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, + 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, + 1239, 1239, 1239, 1422, 1422, 1422, 1422, 1239, + 1422, 1453, 1239, 1239, 1239, 1239, 1239, 1239, + 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, + 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, + 1239, 1239, 1239, 1422, 1422, 1422, 1422, 1422, + 1239, 1422, 1422, 1422, 1422, 1422, 1422, 1422, + 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, + 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, + 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, + 1422, 1422, 1292, 1422, 1422, 1422, 1422, 1422, + 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, + 1422, 1239, 1239, 1239, 1239, 1239, 1239, 1239, + 1239, 1239, 1239, 1422, 1422, 1422, 1422, 1422, + 1292, 1422, 1239, 1239, 1239, 1239, 1239, 1239, + 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, + 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, + 1239, 1239, 1239, 1239, 1422, 1422, 1422, 1422, + 1239, 1422, 1239, 1239, 1239, 1239, 1239, 1239, + 1239, 1239, 1239, 1239, 1454, 1239, 1239, 1239, + 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, + 1239, 1239, 1239, 1239, 1422, 1422, 1422, 1422, + 1422, 1239, 1422, 1422, 1422, 1422, 1422, 1422, + 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, + 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, + 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, + 1422, 1422, 1422, 1292, 1422, 1422, 1422, 1422, + 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, + 1422, 1422, 1239, 1239, 1239, 1239, 1239, 1239, + 1239, 1239, 1239, 1239, 1422, 1422, 1422, 1422, + 1422, 1292, 1422, 1239, 1239, 1239, 1239, 1239, + 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, + 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, + 1239, 1239, 1239, 1239, 1239, 1422, 1422, 1422, + 1422, 1239, 1422, 1455, 1239, 1239, 1239, 1239, + 1239, 1239, 1239, 1239, 1239, 1239, 1456, 1239, + 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, + 1239, 1239, 1239, 1239, 1239, 1422, 1422, 1422, + 1422, 1422, 1239, 1422, 1422, 1422, 1422, 1422, + 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, + 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, + 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, + 1422, 1422, 1422, 1422, 1292, 1422, 1422, 1422, + 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, + 1422, 1422, 1422, 1239, 1239, 1239, 1239, 1239, + 1239, 1239, 1239, 1239, 1239, 1422, 1422, 1422, + 1422, 1422, 1292, 1422, 1239, 1239, 1239, 1239, + 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, + 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, + 1239, 1239, 1239, 1239, 1239, 1239, 1422, 1422, + 1422, 1422, 1239, 1422, 1239, 1239, 1239, 1239, + 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, + 1239, 1239, 1239, 1239, 1239, 1239, 1457, 1239, + 1239, 1239, 1239, 1239, 1239, 1239, 1422, 1422, + 1422, 1422, 1422, 1239, 1422, 1422, 1422, 1422, + 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, + 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, + 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, + 1422, 1422, 1422, 1422, 1422, 1292, 1422, 1422, + 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, + 1422, 1422, 1422, 1422, 1239, 1239, 1239, 1239, + 1239, 1239, 1239, 1239, 1239, 1239, 1422, 1422, + 1422, 1422, 1422, 1292, 1422, 1239, 1239, 1239, + 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, + 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, + 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1422, + 1422, 1422, 1422, 1239, 1422, 1239, 1239, 1239, + 1239, 1447, 1239, 1239, 1239, 1239, 1239, 1239, + 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, + 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1422, + 1422, 1422, 1422, 1422, 1239, 1422, 1422, 1422, + 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, + 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, + 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, + 1422, 1422, 1422, 1422, 1422, 1422, 1292, 1422, + 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, + 1422, 1422, 1422, 1422, 1422, 1239, 1239, 1239, + 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1422, + 1422, 1422, 1422, 1422, 1292, 1422, 1239, 1239, + 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, + 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, + 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, + 1422, 1422, 1422, 1422, 1239, 1422, 1458, 1239, + 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, + 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, + 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, + 1422, 1422, 1422, 1422, 1422, 1239, 1422, 1422, + 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, + 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, + 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, + 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1292, + 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, + 1422, 1422, 1422, 1422, 1422, 1422, 1239, 1239, + 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, + 1422, 1422, 1422, 1422, 1422, 1292, 1422, 1239, + 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, + 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, + 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, + 1239, 1422, 1422, 1422, 1422, 1239, 1422, 1239, + 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, + 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, + 1239, 1459, 1239, 1239, 1239, 1239, 1239, 1239, + 1239, 1422, 1422, 1422, 1422, 1422, 1239, 1422, + 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, + 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, + 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, + 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, + 1292, 1422, 1422, 1422, 1422, 1422, 1422, 1422, + 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1239, + 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, + 1239, 1422, 1422, 1422, 1422, 1422, 1292, 1422, + 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, + 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, + 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, + 1239, 1239, 1422, 1422, 1422, 1422, 1239, 1422, + 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, + 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, + 1239, 1239, 1460, 1239, 1239, 1239, 1239, 1239, + 1239, 1239, 1422, 1422, 1422, 1422, 1422, 1239, + 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, + 1461, 327, 328, 327, 327, 327, 1461, 1461, + 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, + 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, + 327, 1292, 1461, 329, 1461, 1461, 1461, 1461, + 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, + 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, + 1239, 1239, 1461, 1461, 330, 1461, 1461, 1292, + 1461, 1239, 1239, 1239, 1239, 1239, 1239, 1239, + 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, + 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, + 1239, 1239, 1239, 1461, 331, 1461, 1461, 1239, + 1461, 1239, 1239, 1239, 1239, 1239, 1239, 1239, + 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, + 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, + 1239, 1239, 1239, 1461, 1461, 1461, 1461, 1461, + 1239, 344, 345, 344, 344, 344, 343, 343, + 343, 343, 343, 343, 343, 343, 343, 343, + 343, 343, 343, 343, 343, 343, 343, 343, + 344, 343, 343, 346, 343, 343, 343, 343, + 343, 343, 343, 343, 343, 343, 343, 343, + 343, 343, 343, 343, 343, 343, 343, 343, + 343, 343, 343, 343, 349, 343, 343, 343, + 343, 343, 343, 343, 343, 343, 343, 343, + 343, 343, 343, 343, 343, 343, 343, 343, + 343, 343, 343, 343, 343, 343, 343, 343, + 343, 343, 343, 343, 348, 343, 1422, 1422, + 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, + 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, + 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, + 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1292, + 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, + 1422, 1422, 1422, 1422, 1422, 1422, 1239, 1239, + 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, + 1422, 1422, 1422, 1422, 1422, 1292, 1422, 1239, + 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, + 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, + 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, + 1239, 1422, 1422, 1422, 1422, 1239, 1422, 1239, + 1239, 1239, 1239, 1463, 1239, 1239, 1239, 1239, + 1239, 1239, 1239, 1239, 1239, 1464, 1239, 1239, + 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, + 1239, 1422, 1422, 1422, 1422, 1422, 1239, 1422, + 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, + 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, + 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, + 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, + 1292, 1422, 1422, 1422, 1422, 1422, 1422, 1422, + 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1239, + 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, + 1239, 1422, 1422, 1422, 1422, 1422, 1292, 1422, + 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, + 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, + 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, + 1239, 1239, 1422, 1422, 1422, 1422, 1239, 1422, + 1239, 1239, 1239, 1239, 1239, 1465, 1239, 1239, + 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, + 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, + 1239, 1239, 1422, 1422, 1422, 1422, 1422, 1239, + 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, + 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, + 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, + 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, + 1466, 1292, 1466, 1466, 1466, 1466, 1466, 1466, + 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, + 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, + 1239, 1239, 1466, 1466, 1466, 1466, 1466, 1292, + 1466, 1239, 1239, 1239, 1239, 1239, 1239, 1239, + 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, + 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, + 1239, 1239, 1239, 1466, 1466, 1466, 1466, 1239, + 1466, 1239, 1239, 1239, 1239, 1239, 1239, 1239, + 1239, 1467, 1239, 1239, 1239, 1239, 1239, 1239, + 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, + 1239, 1239, 1239, 1466, 1466, 1466, 1466, 1466, + 1239, 1422, 1422, 1422, 1422, 1422, 1422, 1422, + 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, + 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, + 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, + 1422, 1422, 1292, 1422, 1422, 1422, 1422, 1422, + 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, + 1422, 1239, 1239, 1239, 1239, 1239, 1239, 1239, + 1239, 1239, 1239, 1422, 1422, 1422, 1422, 1422, + 1292, 1422, 1239, 1239, 1239, 1239, 1239, 1239, + 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, + 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, + 1239, 1239, 1239, 1239, 1422, 1422, 1422, 1422, + 1239, 1422, 1239, 1239, 1239, 1239, 1239, 1239, + 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1468, + 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, + 1239, 1239, 1239, 1239, 1422, 1422, 1422, 1422, + 1422, 1239, 1422, 1422, 1422, 1422, 1422, 1422, + 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, + 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, + 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, + 1422, 1422, 1422, 1292, 1422, 1422, 1422, 1422, + 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, + 1422, 1422, 1239, 1239, 1239, 1239, 1239, 1239, + 1239, 1239, 1239, 1239, 1422, 1422, 1422, 1422, + 1422, 1292, 1422, 1239, 1239, 1239, 1239, 1239, + 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, + 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, + 1239, 1239, 1239, 1239, 1239, 1422, 1422, 1422, + 1422, 1239, 1422, 1239, 1239, 1239, 1239, 1469, + 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, + 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, + 1239, 1239, 1239, 1239, 1239, 1422, 1422, 1422, + 1422, 1422, 1239, 1422, 1422, 1422, 1422, 1422, + 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, + 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, + 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, + 1422, 1422, 1422, 1422, 1292, 1422, 1422, 1422, + 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, + 1422, 1422, 1422, 1239, 1239, 1239, 1239, 1239, + 1239, 1239, 1239, 1239, 1239, 1422, 1422, 1422, + 1422, 1422, 1292, 1422, 1239, 1239, 1239, 1239, + 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, + 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, + 1239, 1239, 1239, 1239, 1239, 1239, 1422, 1422, + 1422, 1422, 1239, 1422, 1239, 1239, 1239, 1470, + 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, + 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, + 1239, 1239, 1239, 1239, 1239, 1239, 1422, 1422, + 1422, 1422, 1422, 1239, 1422, 1422, 1422, 1422, + 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, + 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, + 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, + 1422, 1422, 1422, 1422, 1422, 1292, 1422, 1422, + 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, + 1422, 1422, 1422, 1422, 1239, 1239, 1239, 1239, + 1239, 1239, 1239, 1239, 1239, 1239, 1422, 1422, + 1422, 1422, 1422, 1471, 1422, 1239, 1239, 1239, + 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, + 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, + 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1422, + 1422, 1422, 1422, 1239, 1422, 1239, 1239, 1239, + 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, + 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, + 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1422, + 1422, 1422, 1422, 1422, 1239, 1422, 1422, 1422, + 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, + 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, + 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, + 1422, 1422, 1422, 1422, 1422, 1422, 1292, 1422, + 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, + 1422, 1422, 1422, 1422, 1422, 1239, 1239, 1239, + 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1422, + 1422, 1422, 1422, 1422, 1292, 1422, 1239, 1239, + 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, + 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, + 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, + 1422, 1422, 1422, 1422, 1239, 1422, 1239, 1239, + 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, + 1239, 1472, 1239, 1473, 1239, 1239, 1239, 1239, + 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, + 1422, 1422, 1422, 1422, 1422, 1239, 1422, 1422, + 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, + 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, + 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, + 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1292, + 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, + 1422, 1422, 1422, 1422, 1422, 1422, 1239, 1239, + 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, + 1422, 1422, 1422, 1422, 1422, 1292, 1422, 1239, + 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, + 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, + 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, + 1239, 1422, 1422, 1422, 1422, 1239, 1422, 1239, + 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, + 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, + 1239, 1474, 1239, 1239, 1239, 1239, 1239, 1239, + 1239, 1422, 1422, 1422, 1422, 1422, 1239, 1422, + 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, + 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, + 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, + 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, + 1292, 1422, 1422, 1422, 1422, 1422, 1422, 1422, + 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1239, + 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, + 1239, 1422, 1422, 1422, 1422, 1422, 1292, 1422, + 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, + 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, + 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, + 1239, 1239, 1422, 1422, 1422, 1422, 1239, 1422, + 1239, 1239, 1239, 1239, 1447, 1239, 1239, 1239, + 1475, 1239, 1239, 1239, 1239, 1239, 1239, 1239, + 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, + 1239, 1239, 1422, 1422, 1422, 1422, 1422, 1239, + 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, + 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, + 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, + 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, + 1422, 1292, 1422, 1422, 1422, 1422, 1422, 1422, + 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, + 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, + 1239, 1239, 1422, 1422, 1422, 1422, 1422, 1292, + 1422, 1239, 1239, 1239, 1239, 1239, 1239, 1239, + 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, + 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, + 1239, 1239, 1239, 1422, 1422, 1422, 1422, 1239, + 1422, 1239, 1239, 1239, 1239, 1239, 1447, 1239, + 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, + 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, + 1239, 1239, 1239, 1422, 1422, 1422, 1422, 1422, + 1239, 1422, 1422, 1422, 1422, 1422, 1422, 1422, + 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, + 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, + 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, + 1422, 1422, 1292, 1422, 1422, 1422, 1422, 1422, + 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, + 1422, 1239, 1239, 1239, 1239, 1239, 1239, 1239, + 1239, 1239, 1239, 1422, 1422, 1422, 1422, 1422, + 1292, 1422, 1239, 1239, 1239, 1239, 1239, 1239, + 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, + 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, + 1239, 1239, 1239, 1239, 1422, 1422, 1422, 1422, + 1239, 1422, 1239, 1239, 1239, 1440, 1239, 1239, + 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, + 1239, 1239, 1239, 1239, 1476, 1239, 1239, 1239, + 1239, 1239, 1239, 1239, 1422, 1422, 1422, 1422, + 1422, 1239, 1422, 1422, 1422, 1422, 1422, 1422, + 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, + 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, + 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, + 1422, 1422, 1422, 1292, 1422, 1422, 1422, 1422, + 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, + 1422, 1422, 1239, 1239, 1239, 1239, 1239, 1239, + 1239, 1239, 1239, 1239, 1422, 1422, 1422, 1422, + 1422, 1292, 1422, 1239, 1239, 1239, 1239, 1239, + 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, + 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, + 1239, 1239, 1239, 1239, 1239, 1422, 1422, 1422, + 1422, 1239, 1422, 1239, 1239, 1239, 1239, 1239, + 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, + 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1477, + 1239, 1239, 1239, 1239, 1239, 1422, 1422, 1422, + 1422, 1422, 1239, 1422, 1422, 1422, 1422, 1422, + 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, + 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, + 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, + 1422, 1422, 1422, 1422, 1292, 1422, 1422, 1422, + 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, + 1422, 1422, 1422, 1239, 1239, 1239, 1239, 1239, + 1239, 1239, 1239, 1239, 1239, 1422, 1422, 1422, + 1422, 1422, 1292, 1422, 1239, 1239, 1239, 1239, + 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, + 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, + 1239, 1239, 1239, 1239, 1239, 1239, 1422, 1422, + 1422, 1422, 1239, 1422, 1239, 1239, 1239, 1239, + 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, + 1239, 1239, 1239, 1239, 1239, 1457, 1239, 1239, + 1239, 1239, 1239, 1239, 1239, 1239, 1422, 1422, + 1422, 1422, 1422, 1239, 1422, 1422, 1422, 1422, + 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, + 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, + 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, + 1422, 1422, 1422, 1422, 1422, 1292, 1422, 1422, + 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, + 1422, 1422, 1422, 1422, 1239, 1239, 1239, 1239, + 1239, 1239, 1239, 1239, 1239, 1239, 1422, 1422, + 1422, 1422, 1422, 1292, 1422, 1239, 1239, 1239, + 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, + 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, + 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1422, + 1422, 1422, 1422, 1239, 1422, 1478, 1239, 1239, + 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, + 1239, 1239, 1239, 1281, 1239, 1239, 1239, 1239, + 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1422, + 1422, 1422, 1422, 1422, 1239, 1422, 1422, 1422, + 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, + 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, + 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, + 1422, 1422, 1422, 1422, 1422, 1422, 1292, 1422, + 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, + 1422, 1422, 1422, 1422, 1422, 1239, 1239, 1239, + 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1422, + 1422, 1422, 1422, 1422, 1292, 1422, 1239, 1239, + 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, + 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, + 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, + 1422, 1422, 1422, 1422, 1239, 1422, 1239, 1239, + 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, + 1239, 1479, 1239, 1239, 1239, 1239, 1239, 1239, + 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, + 1422, 1422, 1422, 1422, 1422, 1239, 1422, 1422, + 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, + 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, + 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, + 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1292, + 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, + 1422, 1422, 1422, 1422, 1422, 1422, 1239, 1239, + 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, + 1422, 1422, 1422, 1422, 1422, 1292, 1422, 1239, + 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, + 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, + 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, + 1239, 1422, 1422, 1422, 1422, 1239, 1422, 1239, + 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, + 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, + 1239, 1480, 1239, 1239, 1239, 1239, 1239, 1239, + 1239, 1422, 1422, 1422, 1422, 1422, 1239, 1422, + 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, + 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, + 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, + 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, + 1292, 1422, 1422, 1422, 1422, 1422, 1422, 1422, + 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1239, + 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, + 1239, 1422, 1422, 1422, 1422, 1422, 1292, 1422, + 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, + 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, + 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, + 1239, 1239, 1422, 1422, 1422, 1422, 1239, 1422, + 1239, 1239, 1239, 1239, 1440, 1239, 1239, 1239, + 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, + 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, + 1239, 1239, 1422, 1422, 1422, 1422, 1422, 1239, + 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, + 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, + 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, + 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, + 1422, 1292, 1422, 1422, 1422, 1422, 1422, 1422, + 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, + 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, + 1239, 1239, 1422, 1422, 1422, 1422, 1422, 1292, + 1422, 1239, 1239, 1239, 1239, 1239, 1239, 1239, + 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, + 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, + 1239, 1239, 1239, 1422, 1422, 1422, 1422, 1239, + 1422, 1239, 1239, 1239, 1239, 1239, 1239, 1239, + 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, + 1239, 1239, 1447, 1239, 1239, 1239, 1239, 1239, + 1239, 1239, 1239, 1422, 1422, 1422, 1422, 1422, + 1239, 1422, 1422, 1422, 1422, 1422, 1422, 1422, + 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, + 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, + 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, + 1422, 1422, 1292, 1422, 1422, 1422, 1422, 1422, + 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, + 1422, 1239, 1239, 1239, 1239, 1239, 1239, 1239, + 1239, 1239, 1239, 1422, 1422, 1422, 1422, 1422, + 1292, 1422, 1239, 1239, 1239, 1239, 1239, 1239, + 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, + 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, + 1239, 1239, 1239, 1239, 1422, 1422, 1422, 1422, + 1239, 1422, 1239, 1239, 1239, 1239, 1239, 1481, + 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1447, + 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, + 1239, 1239, 1239, 1239, 1422, 1422, 1422, 1422, + 1422, 1239, 1422, 1422, 1422, 1422, 1422, 1422, + 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, + 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, + 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, + 1422, 1422, 1422, 1292, 1422, 1422, 1422, 1422, + 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, + 1422, 1422, 1239, 1239, 1239, 1239, 1239, 1239, + 1239, 1239, 1239, 1239, 1422, 1422, 1422, 1422, + 1422, 1292, 1422, 1239, 1239, 1239, 1239, 1239, + 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, + 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, + 1239, 1239, 1239, 1239, 1239, 1422, 1422, 1422, + 1422, 1239, 1422, 1239, 1239, 1239, 1239, 1239, + 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, + 1239, 1482, 1239, 1239, 1239, 1239, 1239, 1239, + 1239, 1239, 1239, 1239, 1239, 1422, 1422, 1422, + 1422, 1422, 1239, 1422, 1422, 1422, 1422, 1422, + 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, + 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, + 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, + 1422, 1422, 1422, 1422, 1292, 1422, 1422, 1422, + 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, + 1422, 1422, 1422, 1239, 1239, 1239, 1239, 1239, + 1239, 1239, 1239, 1239, 1239, 1422, 1422, 1422, + 1422, 1422, 1292, 1422, 1239, 1239, 1239, 1239, + 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, + 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, + 1239, 1239, 1239, 1239, 1239, 1239, 1422, 1422, + 1422, 1422, 1239, 1422, 1239, 1239, 1239, 1483, + 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, + 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, + 1239, 1239, 1239, 1239, 1239, 1239, 1422, 1422, + 1422, 1422, 1422, 1239, 1422, 1422, 1422, 1422, + 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, + 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, + 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, + 1422, 1422, 1422, 1422, 1422, 1292, 1422, 1422, + 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, + 1422, 1422, 1422, 1422, 1239, 1239, 1239, 1239, + 1239, 1239, 1239, 1239, 1239, 1239, 1422, 1422, + 1422, 1422, 1422, 1292, 1422, 1239, 1239, 1239, + 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, + 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, + 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1422, + 1422, 1422, 1422, 1239, 1422, 1239, 1239, 1239, + 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, + 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, + 1239, 1484, 1239, 1239, 1239, 1239, 1239, 1422, + 1422, 1422, 1422, 1422, 1239, 1422, 1422, 1422, + 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, + 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, + 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, + 1422, 1422, 1422, 1422, 1422, 1422, 1292, 1422, + 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, + 1422, 1422, 1422, 1422, 1422, 1239, 1239, 1239, + 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1422, + 1422, 1422, 1422, 1422, 1292, 1422, 1239, 1239, + 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, + 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, + 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, + 1422, 1422, 1422, 1422, 1239, 1422, 1239, 1239, + 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, + 1239, 1457, 1239, 1239, 1239, 1239, 1239, 1239, + 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, + 1422, 1422, 1422, 1422, 1422, 1239, 1422, 1422, + 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, + 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, + 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, + 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1292, + 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, + 1422, 1422, 1422, 1422, 1422, 1422, 1239, 1239, + 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, + 1422, 1422, 1422, 1422, 1422, 1292, 1422, 1239, + 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, + 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, + 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, + 1239, 1422, 1422, 1422, 1422, 1239, 1422, 1239, + 1239, 1239, 1239, 1485, 1239, 1239, 1239, 1486, + 1239, 1239, 1239, 1239, 1239, 1487, 1239, 1239, + 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, + 1239, 1422, 1422, 1422, 1422, 1422, 1239, 1422, + 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, + 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, + 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, + 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, + 1292, 1422, 1422, 1422, 1422, 1422, 1422, 1422, + 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1239, + 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, + 1239, 1422, 1422, 1422, 1422, 1422, 1292, 1422, + 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, + 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, + 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, + 1239, 1239, 1422, 1422, 1422, 1422, 1239, 1422, + 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, + 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, + 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1488, + 1239, 1239, 1422, 1422, 1422, 1422, 1422, 1239, + 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, + 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, + 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, + 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, + 1422, 1292, 1422, 1422, 1422, 1422, 1422, 1422, + 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, + 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, + 1239, 1239, 1422, 1422, 1422, 1422, 1422, 1292, + 1422, 1239, 1239, 1239, 1239, 1239, 1239, 1239, + 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, + 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, + 1239, 1239, 1239, 1422, 1422, 1422, 1422, 1239, + 1422, 1239, 1239, 1239, 1239, 1239, 1239, 1239, + 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, + 1239, 1239, 1239, 1239, 1454, 1239, 1239, 1239, + 1239, 1239, 1239, 1422, 1422, 1422, 1422, 1422, + 1239, 1422, 1422, 1422, 1422, 1422, 1422, 1422, + 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, + 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, + 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, + 1422, 1422, 1292, 1422, 1422, 1422, 1422, 1422, + 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, + 1422, 1239, 1239, 1239, 1239, 1239, 1239, 1239, + 1239, 1239, 1239, 1422, 1422, 1422, 1422, 1422, + 1292, 1422, 1239, 1239, 1239, 1239, 1239, 1239, + 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, + 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, + 1239, 1239, 1239, 1239, 1422, 1422, 1422, 1422, + 1239, 1422, 1239, 1239, 1239, 1239, 1239, 1239, + 1239, 1239, 1239, 1239, 1239, 1440, 1239, 1239, + 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, + 1239, 1239, 1239, 1239, 1422, 1422, 1422, 1422, + 1422, 1239, 1422, 1422, 1422, 1422, 1422, 1422, + 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, + 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, + 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, + 1422, 1422, 1422, 1292, 1422, 1422, 1422, 1422, + 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, + 1422, 1422, 1239, 1239, 1239, 1239, 1239, 1239, + 1239, 1239, 1239, 1239, 1422, 1422, 1422, 1422, + 1422, 1292, 1422, 1239, 1239, 1239, 1239, 1239, + 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, + 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, + 1239, 1239, 1239, 1239, 1239, 1422, 1422, 1422, + 1422, 1239, 1422, 1239, 1239, 1239, 1239, 1239, + 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, + 1239, 1239, 1239, 1239, 1239, 1239, 1489, 1239, + 1239, 1239, 1239, 1239, 1239, 1422, 1422, 1422, + 1422, 1422, 1239, 1422, 1422, 1422, 1422, 1422, + 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, + 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, + 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, + 1422, 1422, 1422, 1422, 1292, 1422, 1422, 1422, + 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, + 1422, 1422, 1422, 1239, 1239, 1239, 1239, 1239, + 1239, 1239, 1239, 1239, 1239, 1422, 1422, 1422, + 1422, 1422, 1292, 1422, 1239, 1239, 1239, 1239, + 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, + 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, + 1239, 1239, 1239, 1239, 1239, 1239, 1422, 1422, + 1422, 1422, 1239, 1422, 1239, 1239, 1239, 1239, + 1490, 1239, 1239, 1239, 1239, 1239, 1239, 1239, + 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, + 1239, 1239, 1239, 1239, 1239, 1239, 1422, 1422, + 1422, 1422, 1422, 1239, 1422, 1422, 1422, 1422, + 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, + 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, + 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, + 1422, 1422, 1422, 1422, 1422, 1292, 1422, 1422, + 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, + 1422, 1422, 1422, 1422, 1239, 1239, 1239, 1239, + 1239, 1239, 1239, 1239, 1239, 1239, 1422, 1422, + 1422, 1422, 1422, 1292, 1422, 1239, 1239, 1239, + 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, + 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, + 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1422, + 1422, 1422, 1422, 1239, 1422, 1239, 1239, 1239, + 1491, 1239, 1239, 1239, 1239, 1239, 1239, 1239, + 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1492, + 1493, 1239, 1239, 1239, 1239, 1239, 1239, 1422, + 1422, 1422, 1422, 1422, 1239, 1422, 1422, 1422, + 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, + 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, + 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, + 1422, 1422, 1422, 1422, 1422, 1422, 1292, 1422, + 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, + 1422, 1422, 1422, 1422, 1422, 1239, 1239, 1239, + 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1422, + 1422, 1422, 1422, 1422, 1292, 1422, 1239, 1239, + 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, + 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, + 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, + 1422, 1422, 1422, 1422, 1239, 1422, 1239, 1239, + 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, + 1239, 1239, 1239, 1239, 1440, 1239, 1239, 1239, + 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, + 1422, 1422, 1422, 1422, 1422, 1239, 1422, 1422, + 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, + 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, + 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, + 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1292, + 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, + 1422, 1422, 1422, 1422, 1422, 1422, 1239, 1239, + 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, + 1422, 1422, 1422, 1422, 1422, 1292, 1422, 1239, + 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, + 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, + 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, + 1239, 1422, 1422, 1422, 1422, 1239, 1422, 1239, + 1239, 1494, 1239, 1239, 1239, 1239, 1239, 1239, + 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, + 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, + 1239, 1422, 1422, 1422, 1422, 1422, 1239, 1422, + 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, + 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, + 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, + 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, + 1292, 1422, 1422, 1422, 1422, 1422, 1422, 1422, + 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1239, + 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, + 1239, 1422, 1422, 1422, 1422, 1422, 1292, 1422, + 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, + 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, + 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, + 1239, 1239, 1422, 1422, 1422, 1422, 1239, 1422, + 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, + 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, + 1239, 1239, 1239, 1239, 1495, 1239, 1239, 1239, + 1239, 1239, 1422, 1422, 1422, 1422, 1422, 1239, + 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, + 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, + 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, + 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, + 1422, 1292, 1422, 1422, 1422, 1422, 1422, 1422, + 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, + 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, + 1239, 1239, 1422, 1422, 1422, 1422, 1422, 1292, + 1422, 1239, 1239, 1239, 1239, 1239, 1239, 1239, + 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, + 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, + 1239, 1239, 1239, 1422, 1422, 1422, 1422, 1239, + 1422, 1239, 1239, 1239, 1239, 1481, 1239, 1239, + 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, + 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, + 1239, 1239, 1239, 1422, 1422, 1422, 1422, 1422, + 1239, 1422, 1422, 1422, 1422, 1422, 1422, 1422, + 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, + 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, + 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, + 1422, 1422, 1292, 1422, 1422, 1422, 1422, 1422, + 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, + 1422, 1239, 1239, 1239, 1239, 1239, 1239, 1239, + 1239, 1239, 1239, 1422, 1422, 1422, 1422, 1422, + 1292, 1422, 1239, 1239, 1239, 1239, 1239, 1239, + 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, + 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, + 1239, 1239, 1239, 1239, 1422, 1422, 1422, 1422, + 1239, 1422, 1239, 1239, 1239, 1239, 1239, 1239, + 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, + 1239, 1239, 1239, 1496, 1239, 1239, 1497, 1239, + 1239, 1239, 1239, 1239, 1422, 1422, 1422, 1422, + 1422, 1239, 1422, 1422, 1422, 1422, 1422, 1422, + 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, + 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, + 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, + 1422, 1422, 1422, 1292, 1422, 1422, 1422, 1422, + 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, + 1422, 1422, 1239, 1239, 1239, 1239, 1239, 1239, + 1239, 1239, 1239, 1239, 1422, 1422, 1422, 1422, + 1422, 1292, 1422, 1239, 1239, 1239, 1239, 1239, + 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, + 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, + 1239, 1239, 1239, 1239, 1239, 1422, 1422, 1422, + 1422, 1239, 1422, 1239, 1239, 1239, 1239, 1239, + 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, + 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, + 1239, 1239, 1239, 1440, 1239, 1422, 1422, 1422, + 1422, 1422, 1239, 1422, 1422, 1422, 1422, 1422, + 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, + 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, + 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, + 1422, 1422, 1422, 1422, 1292, 1422, 1422, 1422, + 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, + 1422, 1422, 1422, 1239, 1239, 1239, 1239, 1239, + 1239, 1239, 1239, 1239, 1239, 1422, 1422, 1422, + 1422, 1422, 1292, 1422, 1239, 1239, 1239, 1239, + 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, + 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, + 1239, 1239, 1239, 1239, 1239, 1239, 1422, 1422, + 1422, 1422, 1239, 1422, 1239, 1239, 1239, 1239, + 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, + 1239, 1239, 1239, 1239, 1239, 1498, 1239, 1239, + 1239, 1239, 1239, 1239, 1239, 1239, 1422, 1422, + 1422, 1422, 1422, 1239, 1422, 1422, 1422, 1422, + 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, + 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, + 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, + 1422, 1422, 1422, 1422, 1422, 1292, 1422, 1422, + 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, + 1422, 1422, 1422, 1422, 1239, 1239, 1239, 1239, + 1239, 1239, 1239, 1239, 1239, 1239, 1422, 1422, + 1422, 1422, 1422, 1292, 1422, 1239, 1239, 1239, + 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, + 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, + 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1422, + 1422, 1422, 1422, 1239, 1422, 1239, 1239, 1239, + 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, + 1239, 1239, 1454, 1239, 1239, 1239, 1239, 1239, + 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1422, + 1422, 1422, 1422, 1422, 1239, 1422, 1422, 1422, + 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, + 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, + 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, + 1422, 1422, 1422, 1422, 1422, 1422, 1292, 1422, + 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, + 1422, 1422, 1422, 1422, 1422, 1239, 1239, 1239, + 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1422, + 1422, 1422, 1422, 1422, 1292, 1422, 1239, 1239, + 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, + 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, + 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, + 1422, 1422, 1422, 1422, 1239, 1422, 1239, 1239, + 1239, 1239, 1499, 1239, 1239, 1239, 1239, 1239, + 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, + 1239, 1239, 1500, 1239, 1239, 1239, 1239, 1239, + 1422, 1422, 1422, 1422, 1422, 1239, 1422, 1422, + 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, + 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, + 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, + 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1292, + 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, + 1422, 1422, 1422, 1422, 1422, 1422, 1239, 1239, + 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, + 1422, 1422, 1422, 1422, 1422, 1292, 1422, 1239, + 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, + 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, + 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, + 1239, 1422, 1422, 1422, 1422, 1239, 1422, 1239, + 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, + 1239, 1239, 1501, 1239, 1239, 1239, 1239, 1239, + 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, + 1239, 1422, 1422, 1422, 1422, 1422, 1239, 1422, + 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, + 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, + 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, + 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, + 1292, 1422, 1422, 1422, 1422, 1422, 1422, 1422, + 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1239, + 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, + 1239, 1422, 1422, 1422, 1422, 1422, 1292, 1422, + 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, + 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, + 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, + 1239, 1239, 1422, 1422, 1422, 1422, 1239, 1422, + 1239, 1239, 1239, 1239, 1239, 1440, 1239, 1239, + 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, + 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, + 1239, 1239, 1422, 1422, 1422, 1422, 1422, 1239, + 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, + 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, + 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, + 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, + 1422, 1292, 1422, 1422, 1422, 1422, 1422, 1422, + 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, + 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, + 1239, 1239, 1422, 1422, 1422, 1422, 1422, 1292, + 1422, 1239, 1239, 1239, 1239, 1239, 1239, 1239, + 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, + 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, + 1239, 1239, 1239, 1422, 1422, 1422, 1422, 1239, + 1422, 1239, 1239, 1239, 1239, 1239, 1239, 1239, + 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, + 1502, 1239, 1239, 1239, 1239, 1239, 1239, 1239, + 1239, 1239, 1239, 1422, 1422, 1422, 1422, 1422, + 1239, 1422, 1422, 1422, 1422, 1422, 1422, 1422, + 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, + 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, + 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, + 1422, 1422, 1292, 1422, 1422, 1422, 1422, 1422, + 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, + 1422, 1239, 1239, 1239, 1239, 1239, 1239, 1239, + 1239, 1239, 1239, 1422, 1422, 1422, 1422, 1422, + 1292, 1422, 1239, 1239, 1239, 1239, 1239, 1239, + 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, + 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, + 1239, 1239, 1239, 1239, 1422, 1422, 1422, 1422, + 1239, 1422, 1239, 1239, 1239, 1239, 1503, 1239, + 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, + 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, + 1239, 1239, 1239, 1239, 1422, 1422, 1422, 1422, + 1422, 1239, 1422, 1422, 1422, 1422, 1422, 1422, + 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, + 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, + 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, + 1422, 1422, 1422, 1292, 1422, 1422, 1422, 1422, + 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, + 1422, 1422, 1239, 1239, 1239, 1239, 1239, 1239, + 1239, 1239, 1239, 1239, 1422, 1422, 1422, 1422, + 1422, 1292, 1422, 1239, 1239, 1239, 1239, 1239, + 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, + 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, + 1239, 1239, 1239, 1239, 1239, 1422, 1422, 1422, + 1422, 1239, 1422, 1239, 1239, 1239, 1239, 1239, + 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, + 1239, 1239, 1239, 1239, 1489, 1239, 1239, 1239, + 1239, 1239, 1239, 1239, 1239, 1422, 1422, 1422, + 1422, 1422, 1239, 1422, 1422, 1422, 1422, 1422, + 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, + 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, + 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, + 1422, 1422, 1422, 1422, 1292, 1422, 1422, 1422, + 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, + 1422, 1422, 1422, 1239, 1239, 1239, 1239, 1239, + 1239, 1239, 1239, 1239, 1239, 1422, 1422, 1422, + 1422, 1422, 1292, 1422, 1239, 1239, 1239, 1239, + 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, + 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, + 1239, 1239, 1239, 1239, 1239, 1239, 1422, 1422, + 1422, 1422, 1239, 1422, 1239, 1239, 1239, 1239, + 1239, 1239, 1239, 1504, 1239, 1239, 1239, 1239, + 1239, 1239, 1239, 1239, 1239, 1505, 1239, 1239, + 1239, 1239, 1239, 1239, 1239, 1239, 1422, 1422, + 1422, 1422, 1422, 1239, 1422, 1422, 1422, 1422, + 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, + 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, + 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, + 1422, 1422, 1422, 1422, 1422, 1292, 1422, 1422, + 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, + 1422, 1422, 1422, 1422, 1239, 1239, 1239, 1239, + 1239, 1239, 1239, 1239, 1239, 1239, 1422, 1422, + 1422, 1422, 1422, 1292, 1422, 1239, 1239, 1239, + 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, + 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, + 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1422, + 1422, 1422, 1422, 1239, 1422, 1239, 1239, 1239, + 1239, 1451, 1239, 1239, 1239, 1239, 1239, 1239, + 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, + 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1422, + 1422, 1422, 1422, 1422, 1239, 1422, 1422, 1422, + 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, + 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, + 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, + 1422, 1422, 1422, 1422, 1422, 1422, 1292, 1422, + 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, + 1422, 1422, 1422, 1422, 1422, 1239, 1239, 1239, + 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1422, + 1422, 1422, 1422, 1422, 1292, 1422, 1239, 1239, + 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, + 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, + 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, + 1422, 1422, 1422, 1422, 1239, 1422, 1239, 1239, + 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, + 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, + 1239, 1239, 1480, 1239, 1239, 1239, 1239, 1239, + 1422, 1422, 1422, 1422, 1422, 1239, 1422, 1422, + 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, + 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, + 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, + 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1292, + 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, + 1422, 1422, 1422, 1422, 1422, 1422, 1239, 1239, + 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, + 1422, 1422, 1422, 1422, 1422, 1292, 1422, 1239, + 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, + 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, + 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, + 1239, 1422, 1422, 1422, 1422, 1239, 1422, 1239, + 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, + 1239, 1239, 1239, 1239, 1506, 1239, 1239, 1239, + 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, + 1239, 1422, 1422, 1422, 1422, 1422, 1239, 1422, + 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, + 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, + 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, + 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, + 1292, 1422, 1422, 1422, 1422, 1422, 1422, 1422, + 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1239, + 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, + 1239, 1422, 1422, 1422, 1422, 1422, 1292, 1422, + 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, + 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, + 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, + 1239, 1239, 1422, 1422, 1422, 1422, 1239, 1422, + 1239, 1239, 1239, 1507, 1239, 1239, 1239, 1239, + 1239, 1239, 1239, 1508, 1239, 1239, 1239, 1239, + 1239, 1239, 1239, 1509, 1239, 1239, 1239, 1239, + 1239, 1239, 1422, 1422, 1422, 1422, 1422, 1239, + 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, + 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, + 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, + 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, + 1422, 1292, 1422, 1422, 1422, 1422, 1422, 1422, + 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, + 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, + 1239, 1239, 1422, 1422, 1422, 1422, 1422, 1292, + 1422, 1239, 1239, 1239, 1239, 1239, 1239, 1239, + 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, + 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, + 1239, 1239, 1239, 1422, 1422, 1422, 1422, 1239, + 1422, 1239, 1239, 1239, 1239, 1510, 1239, 1239, + 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, + 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, + 1239, 1239, 1239, 1422, 1422, 1422, 1422, 1422, + 1239, 1422, 1422, 1422, 1422, 1422, 1422, 1422, + 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, + 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, + 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, + 1422, 1422, 1292, 1422, 1422, 1422, 1422, 1422, + 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, + 1422, 1239, 1239, 1239, 1239, 1239, 1239, 1239, + 1239, 1239, 1239, 1422, 1422, 1422, 1422, 1422, + 1292, 1422, 1239, 1239, 1239, 1239, 1239, 1239, + 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, + 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, + 1239, 1239, 1239, 1239, 1422, 1422, 1422, 1422, + 1239, 1422, 1239, 1239, 1239, 1239, 1239, 1446, + 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, + 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, + 1239, 1239, 1239, 1239, 1422, 1422, 1422, 1422, + 1422, 1239, 1422, 1422, 1422, 1422, 1422, 1422, + 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, + 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, + 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, + 1422, 1422, 1422, 1292, 1422, 1422, 1422, 1422, + 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, + 1422, 1422, 1239, 1239, 1239, 1239, 1239, 1239, + 1239, 1239, 1239, 1239, 1422, 1422, 1422, 1422, + 1422, 1292, 1422, 1239, 1239, 1239, 1239, 1239, + 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, + 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, + 1239, 1239, 1239, 1239, 1239, 1422, 1422, 1422, + 1422, 1239, 1422, 1239, 1239, 1239, 1239, 1511, + 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, + 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, + 1239, 1239, 1239, 1239, 1239, 1422, 1422, 1422, + 1422, 1422, 1239, 1422, 1422, 1422, 1422, 1422, + 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, + 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, + 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, + 1422, 1422, 1422, 1422, 1292, 1422, 1422, 1422, + 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, + 1422, 1422, 1422, 1239, 1239, 1239, 1239, 1239, + 1239, 1239, 1239, 1239, 1239, 1422, 1422, 1422, + 1422, 1422, 1292, 1422, 1239, 1239, 1239, 1239, + 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, + 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, + 1239, 1239, 1239, 1239, 1239, 1239, 1422, 1422, + 1422, 1422, 1239, 1422, 1239, 1239, 1239, 1239, + 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, + 1239, 1239, 1239, 1239, 1239, 1239, 1512, 1239, + 1239, 1239, 1239, 1239, 1239, 1239, 1422, 1422, + 1422, 1422, 1422, 1239, 1422, 1422, 1422, 1422, + 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, + 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, + 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, + 1422, 1422, 1422, 1422, 1422, 1292, 1422, 1422, + 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, + 1422, 1422, 1422, 1422, 1239, 1239, 1239, 1239, + 1239, 1239, 1239, 1239, 1239, 1239, 1422, 1422, + 1422, 1422, 1422, 1292, 1422, 1239, 1239, 1239, + 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, + 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, + 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1422, + 1422, 1422, 1422, 1239, 1422, 1239, 1239, 1239, + 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, + 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1481, + 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1422, + 1422, 1422, 1422, 1422, 1239, 1422, 1422, 1422, + 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, + 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, + 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, + 1422, 1422, 1422, 1422, 1422, 1422, 1292, 1422, + 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, + 1422, 1422, 1422, 1422, 1422, 1239, 1239, 1239, + 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1422, + 1422, 1422, 1422, 1422, 1292, 1422, 1239, 1239, + 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, + 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, + 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, + 1422, 1422, 1422, 1422, 1239, 1422, 1239, 1239, + 1239, 1239, 1239, 1239, 1239, 1239, 1513, 1239, + 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, + 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, + 1422, 1422, 1422, 1422, 1422, 1239, 1422, 1422, + 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, + 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, + 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, + 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1292, + 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, + 1422, 1422, 1422, 1422, 1422, 1422, 1239, 1239, + 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, + 1422, 1422, 1422, 1422, 1422, 1292, 1422, 1239, + 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, + 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, + 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, + 1239, 1422, 1422, 1422, 1422, 1239, 1422, 1239, + 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, + 1239, 1239, 1481, 1239, 1239, 1239, 1239, 1239, + 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, + 1239, 1422, 1422, 1422, 1422, 1422, 1239, 1422, + 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, + 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, + 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, + 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, + 1292, 1422, 1422, 1422, 1422, 1422, 1422, 1422, + 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1239, + 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, + 1239, 1422, 1422, 1422, 1422, 1422, 1292, 1422, + 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, + 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, + 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, + 1239, 1239, 1422, 1422, 1422, 1422, 1239, 1422, + 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1514, + 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, + 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, + 1239, 1239, 1422, 1422, 1422, 1422, 1422, 1239, + 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, + 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, + 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, + 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, + 1422, 1292, 1422, 1422, 1422, 1422, 1422, 1422, + 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, + 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, + 1239, 1239, 1422, 1422, 1422, 1422, 1422, 1292, + 1422, 1239, 1239, 1239, 1239, 1239, 1239, 1239, + 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, + 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, + 1239, 1239, 1239, 1422, 1422, 1422, 1422, 1239, + 1422, 1239, 1239, 1239, 1239, 1451, 1239, 1239, + 1239, 1515, 1239, 1239, 1239, 1239, 1239, 1239, + 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, + 1239, 1239, 1239, 1422, 1422, 1422, 1422, 1422, + 1239, 1422, 1422, 1422, 1422, 1422, 1422, 1422, + 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, + 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, + 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, + 1422, 1422, 1292, 1422, 1422, 1422, 1422, 1422, + 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, + 1422, 1239, 1239, 1239, 1239, 1239, 1239, 1239, + 1239, 1239, 1239, 1422, 1422, 1422, 1422, 1422, + 1292, 1422, 1239, 1239, 1239, 1239, 1239, 1239, + 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, + 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, + 1239, 1239, 1239, 1239, 1422, 1422, 1422, 1422, + 1239, 1422, 1239, 1239, 1239, 1239, 1239, 1239, + 1239, 1239, 1239, 1239, 1239, 1516, 1239, 1239, + 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, + 1239, 1239, 1239, 1239, 1422, 1422, 1422, 1422, + 1422, 1239, 1422, 1422, 1422, 1422, 1422, 1422, + 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, + 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, + 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, + 1422, 1422, 1422, 1292, 1422, 1422, 1422, 1422, + 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, + 1422, 1422, 1239, 1239, 1239, 1239, 1239, 1239, + 1239, 1239, 1239, 1239, 1422, 1422, 1422, 1422, + 1422, 1292, 1422, 1239, 1239, 1239, 1239, 1239, + 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, + 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, + 1239, 1239, 1239, 1239, 1239, 1422, 1422, 1422, + 1422, 1239, 1422, 1239, 1239, 1239, 1239, 1481, + 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, + 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, + 1239, 1239, 1239, 1239, 1239, 1422, 1422, 1422, + 1422, 1422, 1239, 1422, 1422, 1422, 1422, 1422, + 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, + 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, + 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, + 1422, 1422, 1422, 1422, 1292, 1422, 1422, 1422, + 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, + 1422, 1422, 1422, 1239, 1239, 1239, 1239, 1239, + 1239, 1239, 1239, 1239, 1239, 1422, 1422, 1422, + 1422, 1422, 1292, 1422, 1239, 1239, 1239, 1239, + 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, + 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, + 1239, 1239, 1239, 1239, 1239, 1239, 1422, 1422, + 1422, 1422, 1239, 1422, 1239, 1239, 1239, 1239, + 1239, 1239, 1239, 1239, 1517, 1239, 1239, 1239, + 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, + 1239, 1239, 1239, 1239, 1239, 1239, 1422, 1422, + 1422, 1422, 1422, 1239, 1422, 1422, 1422, 1422, + 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, + 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, + 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, + 1422, 1422, 1422, 1422, 1422, 1292, 1422, 1422, + 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, + 1422, 1422, 1422, 1422, 1239, 1239, 1239, 1239, + 1239, 1239, 1239, 1239, 1239, 1239, 1422, 1422, + 1422, 1422, 1422, 1292, 1422, 1239, 1239, 1239, + 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, + 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, + 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1422, + 1422, 1422, 1422, 1239, 1422, 1239, 1239, 1239, + 1239, 1518, 1239, 1239, 1239, 1239, 1239, 1239, + 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, + 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1422, + 1422, 1422, 1422, 1422, 1239, 1422, 1422, 1422, + 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, + 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, + 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, + 1422, 1422, 1422, 1422, 1422, 1422, 1292, 1422, + 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, + 1422, 1422, 1422, 1422, 1422, 1239, 1239, 1239, + 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1422, + 1422, 1422, 1422, 1422, 1292, 1422, 1239, 1239, + 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, + 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, + 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, + 1422, 1422, 1422, 1422, 1239, 1422, 1239, 1239, + 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, + 1239, 1519, 1239, 1239, 1239, 1239, 1239, 1239, + 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, + 1422, 1422, 1422, 1422, 1422, 1239, 1422, 1422, + 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, + 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, + 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, + 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1292, + 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, + 1422, 1422, 1422, 1422, 1422, 1422, 1239, 1239, + 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, + 1422, 1422, 1422, 1422, 1422, 1292, 1422, 1239, + 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, + 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, + 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, + 1239, 1422, 1422, 1422, 1422, 1239, 1422, 1239, + 1239, 1239, 1489, 1239, 1239, 1239, 1239, 1239, + 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, + 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, + 1239, 1422, 1422, 1422, 1422, 1422, 1239, 1520, + 1308, 1298, 1298, 1298, 1298, 1298, 1298, 1298, + 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, + 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, + 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, + 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, + 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, + 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, + 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1248, + 1298, 1521, 1523, 1522, 1523, 1523, 1523, 1522, + 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, + 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, + 1522, 1523, 1522, 1522, 1524, 1522, 1522, 1525, + 1522, 1522, 1522, 1522, 1522, 1522, 1522, 357, + 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, + 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, + 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, + 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, + 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, + 1522, 1522, 1522, 1522, 1522, 1526, 1522, 353, + 354, 353, 353, 353, 1527, 1527, 1527, 1527, + 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, + 1527, 1527, 1527, 1527, 1527, 1527, 353, 1527, + 1527, 355, 1527, 1527, 356, 1527, 1527, 1527, + 1527, 1527, 1527, 1527, 357, 1527, 1527, 1527, + 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, + 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, + 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, + 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, + 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, + 1527, 1527, 358, 1527, 360, 1528, 360, 360, + 360, 1528, 1528, 1528, 1528, 1528, 1528, 1528, + 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, + 1528, 1528, 1528, 360, 1528, 1528, 355, 1528, + 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, + 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, + 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, + 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, + 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, + 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, + 1528, 1528, 1528, 1528, 1528, 1528, 1528, 358, + 1528, 1530, 1529, 1532, 1531, 363, 362, 368, + 1527, 366, 1527, 1534, 1533, 1533, 1533, 1533, + 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, + 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, + 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, + 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, + 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, + 1533, 1533, 1533, 1533, 1533, 1533, 1535, 1533, + 1534, 1533, 1534, 1533, 1533, 1533, 1533, 1533, + 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, + 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, + 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, + 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, + 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, + 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, + 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, + 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, + 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, + 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, + 1533, 1533, 1533, 1533, 1533, 1537, 1533, 1534, + 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, + 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, + 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, + 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, + 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, + 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, + 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, + 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, + 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, + 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, + 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, + 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, + 1533, 1533, 1533, 1538, 1533, 1534, 1533, 1533, + 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, + 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, + 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, + 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, + 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, + 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, + 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, + 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, + 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, + 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, + 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1539, + 1533, 1541, 1539, 0 +] + +class << self + attr_accessor :_lex_trans_targs + private :_lex_trans_targs, :_lex_trans_targs= +end +self._lex_trans_targs = [ + 186, 2, 3, 4, 192, 6, 7, 8, + 9, 10, 186, 186, 195, 198, 195, 12, + 199, 200, 14, 195, 207, 208, 211, 212, + 224, 221, 213, 214, 215, 19, 216, 217, + 218, 226, 228, 229, 233, 234, 235, 230, + 25, 18, 209, 210, 27, 258, 259, 261, + 263, 261, 30, 264, 265, 32, 261, 272, + 273, 276, 277, 289, 286, 278, 279, 280, + 37, 281, 282, 283, 291, 293, 294, 298, + 299, 300, 295, 43, 36, 274, 275, 45, + 323, 324, 331, 333, 331, 48, 334, 335, + 50, 337, 340, 337, 52, 341, 342, 54, + 348, 347, 0, 56, 349, 350, 58, 351, + 352, 352, 352, 352, 465, 61, 62, 63, + 465, 465, 494, 65, 66, 494, 494, 498, + 498, 70, 65, 71, 496, 497, 499, 500, + 498, 494, 501, 502, 504, 67, 68, 505, + 506, 69, 498, 72, 73, 78, 85, 508, + 509, 71, 496, 497, 499, 500, 498, 494, + 501, 502, 504, 67, 68, 505, 506, 69, + 72, 73, 78, 85, 508, 509, 507, 74, + 75, 76, 77, 79, 80, 83, 81, 82, + 84, 86, 87, 494, 89, 90, 91, 93, + 96, 94, 95, 97, 99, 525, 525, 525, + 526, 101, 528, 102, 529, 103, 526, 101, + 528, 102, 529, 563, 104, 563, 105, 106, + 104, 563, 105, 563, 563, 563, 109, 110, + 111, 112, 574, 563, 563, 563, 115, 116, + 117, 563, 120, 115, 116, 117, 563, 120, + 118, 118, 116, 117, 584, 119, 118, 118, + 116, 117, 584, 119, 116, 563, 601, 563, + 122, 602, 608, 126, 617, 618, 131, 132, + 126, 127, 616, 127, 616, 563, 128, 129, + 130, 619, 133, 563, 633, 634, 637, 638, + 650, 647, 639, 640, 641, 138, 642, 643, + 644, 652, 654, 655, 659, 660, 661, 656, + 144, 137, 635, 636, 146, 697, 698, 148, + 565, 107, 567, 150, 151, 700, 802, 153, + 154, 155, 802, 810, 810, 810, 158, 832, + 831, 810, 834, 836, 810, 163, 164, 165, + 840, 810, 167, 168, 851, 820, 873, 171, + 172, 173, 177, 178, 171, 172, 173, 177, + 178, 174, 174, 172, 173, 175, 176, 174, + 174, 172, 173, 175, 176, 921, 172, 810, + 990, 179, 992, 181, 185, 993, 183, 990, + 180, 990, 182, 992, 182, 992, 184, 992, + 990, 186, 186, 187, 188, 189, 191, 193, + 194, 186, 186, 186, 190, 186, 190, 186, + 1, 186, 186, 186, 5, 195, 195, 196, + 195, 197, 201, 195, 195, 11, 13, 195, + 195, 195, 195, 202, 203, 204, 15, 21, + 26, 236, 28, 195, 195, 195, 205, 206, + 195, 16, 195, 195, 195, 17, 195, 195, + 195, 20, 219, 195, 220, 222, 195, 223, + 225, 227, 22, 195, 195, 23, 231, 195, + 232, 24, 195, 237, 241, 238, 239, 240, + 195, 195, 242, 243, 246, 248, 257, 244, + 245, 195, 247, 249, 251, 250, 195, 252, + 253, 254, 255, 256, 195, 195, 195, 260, + 261, 261, 261, 262, 266, 261, 29, 31, + 261, 261, 261, 261, 267, 268, 269, 33, + 39, 44, 301, 46, 261, 261, 261, 270, + 271, 261, 34, 261, 261, 261, 35, 261, + 261, 261, 38, 284, 261, 285, 287, 261, + 288, 290, 292, 40, 261, 261, 41, 296, + 261, 297, 42, 261, 302, 306, 303, 304, + 305, 261, 261, 307, 308, 311, 313, 322, + 309, 310, 261, 312, 314, 316, 315, 261, + 317, 318, 319, 320, 321, 261, 261, 261, + 325, 326, 326, 327, 326, 328, 326, 326, + 326, 329, 329, 329, 330, 329, 329, 329, + 331, 331, 331, 332, 331, 47, 49, 331, + 331, 331, 336, 336, 336, 337, 337, 338, + 337, 339, 337, 337, 51, 53, 337, 337, + 337, 343, 343, 344, 343, 343, 345, 346, + 345, 55, 57, 347, 347, 347, 353, 352, + 352, 354, 355, 356, 357, 359, 362, 363, + 364, 365, 352, 366, 367, 369, 371, 372, + 373, 377, 379, 380, 381, 397, 402, 409, + 414, 421, 428, 431, 432, 436, 430, 440, + 448, 452, 454, 459, 461, 464, 352, 352, + 352, 352, 352, 352, 358, 352, 358, 352, + 360, 59, 361, 352, 60, 352, 352, 368, + 370, 352, 374, 375, 376, 372, 378, 352, + 382, 383, 392, 395, 384, 385, 386, 387, + 388, 389, 390, 391, 353, 393, 394, 396, + 398, 401, 399, 400, 403, 406, 404, 405, + 407, 408, 410, 412, 411, 413, 415, 416, + 352, 417, 418, 419, 420, 352, 422, 425, + 423, 424, 426, 427, 429, 433, 434, 435, + 437, 439, 438, 441, 442, 443, 445, 444, + 446, 447, 449, 450, 451, 453, 455, 456, + 457, 458, 460, 462, 463, 466, 465, 465, + 467, 468, 470, 471, 465, 465, 465, 469, + 465, 469, 64, 472, 465, 474, 473, 473, + 477, 478, 479, 480, 473, 482, 483, 484, + 485, 487, 489, 490, 491, 492, 493, 473, + 475, 473, 476, 473, 473, 473, 473, 473, + 481, 473, 481, 486, 473, 488, 473, 494, + 494, 495, 510, 511, 497, 513, 514, 501, + 515, 516, 517, 518, 519, 521, 522, 523, + 524, 494, 494, 494, 494, 494, 494, 498, + 503, 494, 494, 494, 494, 494, 494, 494, + 494, 494, 512, 494, 512, 494, 494, 494, + 494, 520, 494, 88, 92, 98, 525, 527, + 530, 100, 525, 525, 526, 531, 531, 532, + 533, 535, 537, 538, 531, 531, 534, 531, + 534, 531, 536, 531, 531, 531, 540, 539, + 539, 541, 542, 543, 545, 547, 548, 553, + 560, 539, 539, 539, 539, 544, 539, 544, + 539, 546, 539, 539, 540, 549, 550, 551, + 552, 554, 555, 558, 556, 557, 559, 561, + 562, 564, 563, 572, 573, 575, 576, 578, + 579, 580, 581, 583, 585, 586, 589, 590, + 615, 621, 622, 623, 700, 701, 702, 703, + 704, 582, 706, 723, 728, 735, 740, 742, + 748, 751, 752, 756, 750, 760, 771, 775, + 778, 786, 790, 793, 794, 563, 104, 105, + 563, 107, 566, 563, 563, 568, 570, 571, + 563, 569, 563, 563, 563, 563, 563, 108, + 563, 563, 563, 563, 563, 577, 563, 577, + 563, 563, 113, 563, 114, 563, 563, 582, + 563, 587, 563, 588, 563, 563, 563, 591, + 600, 563, 121, 603, 604, 605, 563, 606, + 123, 609, 610, 124, 613, 614, 563, 592, + 594, 563, 593, 563, 563, 595, 598, 599, + 563, 596, 597, 563, 563, 563, 563, 563, + 563, 607, 563, 601, 611, 612, 563, 611, + 563, 601, 611, 125, 620, 563, 563, 563, + 624, 563, 563, 563, 625, 627, 563, 626, + 563, 626, 563, 628, 629, 630, 134, 140, + 145, 662, 147, 563, 563, 563, 631, 632, + 563, 135, 563, 563, 563, 136, 563, 563, + 563, 139, 645, 563, 646, 648, 563, 649, + 651, 653, 141, 563, 563, 142, 657, 563, + 658, 143, 563, 663, 667, 664, 665, 666, + 563, 563, 668, 669, 672, 683, 696, 670, + 671, 563, 673, 674, 675, 677, 676, 563, + 678, 679, 680, 681, 682, 684, 691, 685, + 686, 687, 688, 689, 690, 692, 693, 694, + 695, 563, 563, 563, 699, 149, 152, 563, + 705, 707, 708, 718, 721, 709, 710, 711, + 712, 713, 714, 715, 716, 717, 719, 720, + 722, 724, 727, 725, 726, 729, 732, 730, + 731, 733, 734, 736, 738, 737, 739, 741, + 743, 745, 744, 746, 747, 749, 717, 753, + 754, 755, 757, 759, 758, 761, 762, 763, + 768, 764, 765, 766, 563, 564, 565, 107, + 767, 570, 769, 770, 772, 773, 774, 776, + 777, 779, 780, 781, 784, 782, 783, 785, + 787, 788, 789, 791, 792, 563, 582, 795, + 795, 796, 797, 798, 800, 795, 795, 795, + 799, 795, 799, 795, 801, 795, 803, 802, + 802, 804, 805, 802, 806, 808, 802, 802, + 802, 802, 807, 802, 807, 809, 802, 811, + 810, 810, 814, 815, 816, 810, 817, 819, + 822, 823, 824, 825, 826, 810, 827, 828, + 833, 861, 865, 810, 866, 868, 870, 810, + 871, 872, 874, 878, 880, 881, 883, 884, + 902, 907, 914, 922, 929, 936, 941, 942, + 946, 940, 951, 961, 967, 970, 979, 983, + 987, 988, 989, 822, 812, 810, 813, 810, + 810, 810, 810, 810, 810, 818, 810, 818, + 810, 156, 821, 810, 810, 810, 810, 810, + 810, 810, 810, 810, 829, 810, 830, 810, + 810, 157, 159, 810, 160, 842, 853, 856, + 835, 857, 858, 843, 847, 849, 810, 835, + 160, 837, 839, 161, 810, 837, 810, 838, + 810, 810, 162, 841, 810, 810, 844, 846, + 810, 844, 845, 847, 849, 846, 810, 848, + 810, 810, 850, 852, 810, 166, 810, 810, + 810, 854, 846, 847, 849, 854, 855, 810, + 844, 846, 847, 849, 810, 844, 846, 847, + 849, 810, 859, 846, 847, 849, 859, 860, + 810, 160, 861, 835, 862, 847, 849, 863, + 846, 160, 863, 835, 864, 867, 869, 810, + 169, 170, 810, 810, 875, 876, 877, 872, + 879, 810, 810, 882, 810, 810, 810, 885, + 886, 895, 900, 887, 888, 889, 890, 891, + 892, 893, 894, 811, 896, 897, 898, 899, + 811, 901, 903, 906, 904, 905, 811, 811, + 908, 911, 909, 910, 912, 913, 811, 915, + 917, 916, 918, 919, 920, 810, 810, 923, + 811, 924, 810, 925, 926, 927, 928, 812, + 930, 933, 931, 932, 934, 935, 937, 938, + 939, 811, 943, 944, 945, 947, 949, 950, + 948, 811, 952, 953, 954, 957, 955, 956, + 958, 959, 960, 962, 964, 963, 965, 966, + 968, 969, 971, 972, 974, 977, 973, 975, + 976, 978, 980, 981, 982, 984, 985, 986, + 810, 810, 990, 991, 995, 996, 997, 990, + 990, 990, 994, 990, 990, 999, 998, 1000, + 998, 1001, 1002, 1003, 998, 998 +] + +class << self + attr_accessor :_lex_trans_actions + private :_lex_trans_actions, :_lex_trans_actions= +end +self._lex_trans_actions = [ + 1, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 2, 3, 4, 0, 5, 0, + 0, 0, 0, 6, 0, 7, 0, 8, + 0, 0, 7, 0, 0, 0, 0, 8, + 0, 7, 0, 8, 0, 7, 7, 0, + 0, 0, 0, 0, 0, 0, 0, 9, + 0, 10, 0, 0, 0, 0, 11, 0, + 7, 0, 8, 0, 0, 7, 0, 0, + 0, 0, 8, 0, 7, 0, 8, 0, + 7, 7, 0, 0, 0, 0, 0, 0, + 0, 0, 12, 0, 13, 0, 0, 0, + 0, 14, 0, 15, 0, 0, 0, 0, + 0, 16, 0, 0, 0, 0, 0, 0, + 17, 18, 19, 20, 21, 0, 0, 0, + 22, 23, 24, 0, 0, 25, 26, 27, + 28, 29, 30, 30, 31, 32, 30, 33, + 32, 34, 32, 30, 30, 31, 30, 35, + 30, 30, 36, 30, 30, 30, 30, 30, + 30, 0, 37, 38, 0, 39, 38, 40, + 38, 0, 0, 37, 0, 41, 0, 0, + 0, 0, 0, 0, 0, 0, 28, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 42, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 43, 44, 45, + 46, 0, 0, 0, 46, 29, 47, 30, + 30, 30, 47, 48, 0, 49, 0, 29, + 30, 50, 30, 51, 52, 53, 0, 0, + 0, 0, 0, 54, 55, 56, 0, 29, + 0, 57, 0, 30, 58, 30, 59, 30, + 60, 61, 62, 61, 63, 61, 0, 64, + 65, 64, 66, 64, 67, 68, 0, 69, + 0, 0, 0, 0, 70, 70, 0, 0, + 71, 71, 72, 0, 29, 73, 0, 0, + 0, 70, 0, 74, 0, 7, 0, 8, + 0, 0, 7, 0, 0, 0, 0, 8, + 0, 7, 0, 8, 0, 7, 7, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 75, 0, 0, 0, 0, 75, 76, 0, + 0, 0, 77, 78, 79, 80, 0, 7, + 7, 81, 82, 82, 83, 0, 0, 0, + 0, 84, 0, 0, 0, 0, 0, 0, + 29, 0, 0, 0, 30, 58, 30, 30, + 30, 60, 61, 62, 61, 61, 61, 0, + 64, 65, 64, 64, 64, 85, 67, 86, + 87, 0, 88, 0, 89, 89, 0, 90, + 0, 91, 60, 92, 0, 93, 29, 94, + 95, 98, 99, 0, 29, 0, 7, 0, + 7, 100, 101, 102, 60, 103, 0, 104, + 0, 105, 106, 107, 0, 108, 109, 0, + 110, 7, 7, 111, 112, 0, 0, 113, + 114, 115, 116, 117, 117, 117, 117, 117, + 117, 117, 117, 118, 119, 120, 0, 0, + 121, 0, 122, 123, 124, 0, 125, 126, + 127, 0, 0, 128, 0, 0, 129, 0, + 7, 0, 0, 130, 131, 0, 0, 132, + 0, 29, 133, 0, 0, 0, 0, 0, + 134, 135, 0, 0, 0, 0, 0, 0, + 0, 136, 0, 0, 0, 0, 137, 0, + 0, 0, 0, 0, 138, 139, 140, 0, + 141, 142, 143, 7, 7, 144, 0, 0, + 145, 146, 147, 148, 117, 117, 117, 117, + 117, 117, 117, 117, 149, 150, 151, 0, + 0, 152, 0, 153, 154, 155, 0, 156, + 157, 158, 0, 0, 159, 0, 0, 160, + 0, 7, 0, 0, 161, 162, 0, 0, + 163, 0, 29, 164, 0, 0, 0, 0, + 0, 165, 166, 0, 0, 0, 0, 0, + 0, 0, 167, 0, 0, 0, 0, 168, + 0, 0, 0, 0, 0, 169, 170, 171, + 0, 172, 173, 0, 174, 0, 175, 176, + 177, 178, 179, 180, 0, 181, 182, 183, + 184, 185, 186, 7, 187, 0, 0, 188, + 189, 190, 191, 192, 193, 194, 195, 0, + 196, 7, 197, 198, 0, 0, 199, 200, + 201, 202, 203, 0, 204, 205, 206, 0, + 207, 0, 0, 208, 209, 210, 211, 212, + 213, 0, 29, 0, 0, 7, 7, 0, + 0, 0, 214, 0, 0, 0, 0, 215, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 216, 217, + 218, 219, 220, 221, 60, 222, 0, 223, + 0, 0, 0, 224, 0, 225, 226, 0, + 0, 227, 0, 0, 0, 228, 0, 229, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 228, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 230, 0, 0, 0, 0, 231, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 7, 232, 233, + 0, 0, 7, 0, 234, 235, 236, 60, + 237, 0, 0, 29, 238, 0, 239, 240, + 0, 29, 0, 0, 241, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 242, + 0, 243, 0, 244, 245, 246, 247, 248, + 60, 249, 0, 0, 250, 0, 251, 252, + 253, 254, 29, 0, 28, 0, 0, 28, + 0, 0, 0, 0, 0, 0, 7, 7, + 7, 255, 256, 257, 258, 259, 260, 261, + 0, 262, 263, 264, 265, 266, 267, 268, + 269, 270, 60, 271, 0, 272, 273, 274, + 275, 276, 277, 0, 0, 0, 278, 7, + 7, 0, 279, 280, 281, 282, 283, 0, + 0, 0, 0, 0, 284, 285, 60, 286, + 0, 287, 29, 288, 289, 290, 291, 292, + 293, 0, 29, 0, 0, 0, 0, 0, + 0, 294, 295, 296, 297, 60, 298, 0, + 299, 29, 300, 301, 302, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 303, 304, 0, 8, 0, 0, 7, + 305, 0, 0, 305, 305, 0, 0, 7, + 306, 0, 306, 0, 306, 306, 306, 0, + 0, 306, 303, 303, 303, 303, 303, 303, + 303, 303, 303, 303, 303, 303, 303, 303, + 303, 303, 303, 0, 0, 307, 308, 308, + 309, 310, 0, 311, 312, 0, 75, 0, + 313, 0, 314, 315, 316, 317, 318, 30, + 319, 320, 321, 322, 323, 60, 324, 0, + 325, 326, 0, 327, 0, 328, 329, 305, + 330, 0, 331, 0, 332, 333, 334, 0, + 0, 335, 0, 0, 0, 0, 336, 0, + 0, 0, 0, 0, 0, 0, 337, 0, + 0, 338, 0, 339, 340, 0, 0, 0, + 341, 0, 0, 342, 343, 344, 345, 346, + 347, 0, 348, 349, 349, 0, 350, 0, + 351, 352, 352, 0, 0, 353, 354, 355, + 0, 356, 357, 358, 0, 7, 359, 360, + 361, 0, 362, 117, 117, 117, 117, 117, + 117, 117, 117, 363, 364, 365, 0, 0, + 366, 0, 367, 368, 369, 0, 370, 371, + 372, 0, 0, 373, 0, 0, 374, 0, + 7, 0, 0, 375, 376, 0, 0, 377, + 0, 29, 378, 0, 0, 0, 0, 0, + 379, 380, 0, 0, 0, 0, 0, 0, + 0, 381, 0, 0, 0, 0, 0, 382, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 383, 384, 385, 0, 0, 0, 386, + 29, 303, 303, 303, 303, 303, 303, 303, + 303, 303, 303, 303, 303, 75, 303, 303, + 303, 303, 303, 303, 303, 303, 303, 303, + 303, 303, 303, 303, 303, 303, 303, 303, + 303, 303, 303, 303, 303, 303, 387, 303, + 303, 303, 303, 303, 303, 303, 303, 303, + 303, 303, 303, 388, 389, 390, 391, 392, + 392, 388, 303, 303, 303, 303, 303, 303, + 303, 303, 303, 303, 303, 303, 303, 303, + 303, 303, 303, 303, 303, 393, 394, 395, + 396, 0, 29, 0, 0, 397, 398, 399, + 60, 400, 0, 401, 29, 402, 7, 403, + 404, 0, 29, 405, 0, 0, 406, 407, + 408, 409, 60, 410, 0, 29, 411, 412, + 413, 414, 0, 29, 0, 415, 0, 7, + 416, 0, 0, 0, 0, 417, 0, 0, + 418, 418, 0, 419, 0, 0, 0, 420, + 7, 421, 421, 421, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 422, 423, 424, 0, 425, + 426, 427, 428, 429, 430, 60, 431, 0, + 432, 0, 0, 433, 434, 435, 436, 437, + 438, 439, 440, 441, 0, 442, 0, 443, + 444, 0, 0, 445, 446, 447, 0, 0, + 448, 0, 0, 447, 449, 449, 450, 451, + 0, 452, 453, 0, 454, 455, 456, 0, + 457, 458, 0, 0, 459, 460, 447, 447, + 461, 0, 0, 462, 462, 0, 463, 0, + 464, 465, 7, 0, 466, 0, 467, 468, + 469, 470, 470, 471, 471, 0, 0, 472, + 473, 473, 474, 474, 475, 476, 476, 477, + 477, 478, 479, 479, 480, 480, 0, 0, + 481, 482, 483, 484, 485, 486, 486, 483, + 485, 487, 418, 488, 0, 0, 0, 489, + 0, 0, 490, 491, 421, 421, 421, 492, + 421, 493, 494, 29, 495, 496, 497, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 498, 0, 0, 0, 0, + 492, 0, 0, 0, 0, 0, 499, 500, + 0, 0, 0, 0, 0, 0, 501, 0, + 0, 0, 0, 0, 500, 502, 503, 0, + 504, 0, 505, 0, 0, 0, 0, 506, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 507, 0, 0, 0, 0, 0, 0, + 0, 506, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 508, 509, 510, 511, 511, 89, 511, 512, + 513, 514, 0, 515, 516, 0, 517, 0, + 518, 0, 0, 0, 519, 520 +] + +class << self + attr_accessor :_lex_to_state_actions + private :_lex_to_state_actions, :_lex_to_state_actions= +end +self._lex_to_state_actions = [ + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 96, 0, 0, 0, 0, 0, + 0, 0, 0, 96, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 96, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 96, 0, + 0, 96, 0, 96, 0, 0, 0, 0, + 96, 96, 0, 0, 0, 0, 0, 96, + 0, 96, 0, 96, 0, 0, 0, 0, + 96, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 96, 0, 0, 0, 0, 0, 0, + 0, 96, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 96, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 96, 0, 0, + 0, 0, 0, 96, 0, 0, 0, 0, + 0, 0, 0, 96, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 96, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 96, 0, 0, 0, 0, + 0, 0, 96, 0, 0, 0, 0, 0, + 0, 0, 96, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 96, 0, + 0, 0, 0, 0, 0, 0, 96, 0, + 0, 0, 0, 0 +] + +class << self + attr_accessor :_lex_from_state_actions + private :_lex_from_state_actions, :_lex_from_state_actions= +end +self._lex_from_state_actions = [ + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 97, 0, 0, 0, 0, 0, + 0, 0, 0, 97, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 97, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 97, 0, + 0, 97, 0, 97, 0, 0, 0, 0, + 97, 97, 0, 0, 0, 0, 0, 97, + 0, 97, 0, 97, 0, 0, 0, 0, + 97, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 97, 0, 0, 0, 0, 0, 0, + 0, 97, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 97, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 97, 0, 0, + 0, 0, 0, 97, 0, 0, 0, 0, + 0, 0, 0, 97, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 97, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 97, 0, 0, 0, 0, + 0, 0, 97, 0, 0, 0, 0, 0, + 0, 0, 97, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 97, 0, + 0, 0, 0, 0, 0, 0, 97, 0, + 0, 0, 0, 0 +] + +class << self + attr_accessor :_lex_eof_trans + private :_lex_eof_trans, :_lex_eof_trans= +end +self._lex_eof_trans = [ + 0, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 13, 13, 13, 13, 20, + 20, 20, 20, 20, 20, 20, 20, 20, + 20, 20, 20, 20, 20, 48, 48, 48, + 48, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 83, + 83, 83, 83, 90, 90, 90, 90, 0, + 0, 0, 0, 105, 107, 109, 109, 109, + 109, 115, 115, 119, 119, 119, 119, 119, + 119, 119, 119, 119, 119, 119, 119, 119, + 119, 119, 119, 119, 119, 119, 119, 119, + 180, 180, 180, 180, 180, 180, 180, 180, + 180, 180, 180, 180, 190, 192, 192, 192, + 204, 204, 204, 212, 214, 214, 214, 214, + 214, 220, 212, 212, 212, 212, 212, 212, + 212, 246, 246, 246, 246, 246, 246, 212, + 262, 212, 262, 246, 246, 212, 268, 268, + 268, 268, 268, 268, 268, 268, 268, 268, + 268, 268, 268, 268, 212, 246, 246, 246, + 246, 303, 303, 303, 308, 310, 310, 310, + 314, 314, 317, 317, 317, 317, 322, 322, + 322, 308, 314, 314, 314, 314, 314, 314, + 314, 314, 314, 353, 360, 362, 362, 362, + 362, 353, 0, 378, 379, 380, 382, 384, + 386, 384, 384, 0, 396, 397, 401, 401, + 402, 403, 412, 413, 414, 414, 414, 417, + 417, 419, 420, 421, 421, 421, 423, 424, + 425, 425, 425, 428, 428, 421, 431, 431, + 421, 417, 417, 436, 437, 437, 437, 440, + 440, 437, 437, 437, 443, 443, 443, 443, + 449, 450, 450, 450, 450, 458, 450, 450, + 450, 450, 463, 450, 450, 450, 450, 450, + 450, 469, 470, 471, 471, 0, 478, 482, + 482, 483, 484, 493, 494, 495, 495, 495, + 498, 498, 500, 501, 502, 502, 502, 504, + 505, 506, 506, 506, 509, 509, 502, 512, + 512, 502, 498, 498, 517, 518, 518, 518, + 521, 521, 518, 518, 518, 524, 524, 524, + 524, 530, 531, 531, 531, 531, 539, 531, + 531, 531, 531, 544, 531, 531, 531, 531, + 531, 531, 550, 551, 552, 552, 0, 559, + 560, 0, 566, 0, 573, 577, 577, 578, + 0, 0, 587, 588, 592, 592, 593, 0, + 598, 0, 601, 0, 604, 604, 605, 606, + 0, 647, 649, 650, 651, 652, 654, 656, + 660, 660, 651, 651, 651, 651, 662, 651, + 651, 656, 651, 651, 647, 666, 666, 666, + 666, 666, 666, 656, 656, 672, 672, 672, + 672, 672, 672, 672, 672, 672, 672, 672, + 672, 672, 672, 672, 672, 672, 672, 672, + 672, 672, 672, 672, 672, 672, 672, 672, + 672, 672, 672, 672, 672, 672, 672, 672, + 705, 672, 672, 672, 672, 672, 672, 672, + 672, 672, 672, 672, 672, 672, 672, 672, + 672, 672, 672, 672, 672, 672, 672, 672, + 672, 672, 672, 672, 672, 672, 672, 672, + 672, 672, 672, 672, 672, 672, 672, 672, + 672, 672, 672, 672, 672, 672, 672, 672, + 651, 0, 749, 750, 751, 753, 749, 749, + 757, 0, 776, 778, 780, 781, 782, 783, + 784, 786, 783, 783, 783, 783, 783, 789, + 783, 783, 791, 789, 789, 783, 0, 810, + 811, 115, 115, 814, 815, 115, 811, 811, + 818, 820, 823, 811, 824, 811, 825, 826, + 828, 830, 811, 818, 831, 831, 820, 831, + 835, 831, 831, 831, 831, 0, 190, 843, + 844, 843, 843, 0, 853, 854, 856, 858, + 860, 858, 862, 0, 874, 875, 876, 877, + 879, 881, 883, 884, 884, 884, 884, 884, + 884, 884, 884, 884, 884, 884, 884, 884, + 884, 884, 884, 0, 942, 945, 948, 949, + 953, 955, 956, 957, 958, 959, 961, 964, + 965, 967, 969, 972, 974, 975, 212, 972, + 977, 972, 964, 979, 981, 964, 964, 999, + 1002, 1004, 1005, 1009, 1012, 1013, 1014, 1015, + 999, 999, 999, 999, 999, 999, 999, 999, + 999, 999, 1019, 1023, 1025, 999, 999, 964, + 1030, 1031, 1031, 1031, 964, 964, 964, 1032, + 1039, 1039, 1041, 1043, 1052, 1053, 1054, 1054, + 1054, 1057, 1057, 1059, 1060, 1061, 1061, 1061, + 1063, 1064, 1065, 1065, 1065, 1068, 1068, 1061, + 1071, 1071, 1061, 1057, 1057, 1076, 1077, 1077, + 1077, 1080, 1080, 1077, 1077, 1077, 1083, 1083, + 1083, 1083, 1089, 1090, 1090, 1090, 1090, 1098, + 1090, 1090, 1090, 1090, 1104, 1090, 1090, 1090, + 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, + 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, + 1122, 1123, 1124, 1124, 212, 964, 964, 1128, + 964, 959, 942, 942, 942, 942, 942, 942, + 942, 942, 942, 942, 942, 212, 942, 942, + 942, 942, 942, 942, 942, 942, 942, 942, + 942, 942, 942, 942, 942, 942, 942, 942, + 942, 942, 942, 942, 942, 942, 942, 942, + 942, 942, 942, 942, 942, 942, 942, 942, + 942, 942, 942, 942, 942, 942, 942, 942, + 942, 942, 942, 942, 942, 942, 1181, 949, + 942, 942, 942, 942, 942, 942, 942, 942, + 942, 942, 942, 942, 942, 942, 942, 942, + 942, 942, 942, 942, 942, 942, 942, 942, + 942, 1206, 964, 0, 1214, 1215, 1216, 1218, + 1220, 1222, 0, 1231, 1232, 1233, 1234, 1236, + 1231, 1239, 0, 314, 1294, 1296, 1297, 1298, + 1299, 1301, 1303, 1305, 1308, 1308, 314, 1310, + 1312, 1313, 1314, 1310, 1316, 1318, 1318, 1321, + 1321, 1324, 1335, 314, 1341, 1343, 1345, 1346, + 1349, 1350, 1324, 1324, 1353, 1353, 1353, 1359, + 1361, 1362, 1365, 1367, 1368, 1369, 1353, 1353, + 1376, 1381, 1386, 1353, 1353, 1393, 1393, 1353, + 1353, 1318, 1310, 1310, 1318, 1310, 1310, 1305, + 314, 1411, 1412, 1412, 1412, 1412, 1412, 1412, + 1418, 1305, 1421, 1422, 1423, 1423, 1423, 1423, + 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, + 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, + 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, + 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, + 1462, 1463, 1423, 1423, 1467, 1423, 1423, 1423, + 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, + 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, + 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, + 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, + 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, + 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, + 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, + 1423, 1423, 1423, 1521, 1299, 1522, 0, 1528, + 1529, 1530, 1532, 1528, 1528, 1528, 0, 1537, + 1537, 1537, 1537, 1541 +] + +class << self + attr_accessor :lex_start +end +self.lex_start = 186; +class << self + attr_accessor :lex_error +end +self.lex_error = 0; + +class << self + attr_accessor :lex_en_interp_words +end +self.lex_en_interp_words = 195; +class << self + attr_accessor :lex_en_interp_string +end +self.lex_en_interp_string = 261; +class << self + attr_accessor :lex_en_plain_words +end +self.lex_en_plain_words = 326; +class << self + attr_accessor :lex_en_plain_string +end +self.lex_en_plain_string = 329; +class << self + attr_accessor :lex_en_interp_backslash_delimited +end +self.lex_en_interp_backslash_delimited = 331; +class << self + attr_accessor :lex_en_plain_backslash_delimited +end +self.lex_en_plain_backslash_delimited = 336; +class << self + attr_accessor :lex_en_interp_backslash_delimited_words +end +self.lex_en_interp_backslash_delimited_words = 337; +class << self + attr_accessor :lex_en_plain_backslash_delimited_words +end +self.lex_en_plain_backslash_delimited_words = 343; +class << self + attr_accessor :lex_en_regexp_modifiers +end +self.lex_en_regexp_modifiers = 345; +class << self + attr_accessor :lex_en_expr_variable +end +self.lex_en_expr_variable = 347; +class << self + attr_accessor :lex_en_expr_fname +end +self.lex_en_expr_fname = 352; +class << self + attr_accessor :lex_en_expr_endfn +end +self.lex_en_expr_endfn = 465; +class << self + attr_accessor :lex_en_expr_dot +end +self.lex_en_expr_dot = 473; +class << self + attr_accessor :lex_en_expr_arg +end +self.lex_en_expr_arg = 494; +class << self + attr_accessor :lex_en_expr_cmdarg +end +self.lex_en_expr_cmdarg = 525; +class << self + attr_accessor :lex_en_expr_endarg +end +self.lex_en_expr_endarg = 531; +class << self + attr_accessor :lex_en_expr_mid +end +self.lex_en_expr_mid = 539; +class << self + attr_accessor :lex_en_expr_beg +end +self.lex_en_expr_beg = 563; +class << self + attr_accessor :lex_en_expr_labelarg +end +self.lex_en_expr_labelarg = 795; +class << self + attr_accessor :lex_en_expr_value +end +self.lex_en_expr_value = 802; +class << self + attr_accessor :lex_en_expr_end +end +self.lex_en_expr_end = 810; +class << self + attr_accessor :lex_en_leading_dot +end +self.lex_en_leading_dot = 990; +class << self + attr_accessor :lex_en_line_comment +end +self.lex_en_line_comment = 998; +class << self + attr_accessor :lex_en_line_begin +end +self.lex_en_line_begin = 186; + + +# line 82 "lib/parser/lexer.rl" + # % + + ESCAPES = { + ?a.ord => "\a", ?b.ord => "\b", ?e.ord => "\e", ?f.ord => "\f", + ?n.ord => "\n", ?r.ord => "\r", ?s.ord => "\s", ?t.ord => "\t", + ?v.ord => "\v", ?\\.ord => "\\" + }.freeze + + REGEXP_META_CHARACTERS = Regexp.union(*"\\$()*+.<>?[]^{|}".chars).freeze + + attr_reader :source_buffer + + attr_accessor :diagnostics + attr_accessor :static_env + attr_accessor :force_utf32 + + attr_accessor :cond, :cmdarg, :context, :command_start + + attr_accessor :tokens, :comments + + attr_reader :paren_nest, :cmdarg_stack, :cond_stack, :lambda_stack + + def initialize(version) + @version = version + @static_env = nil + @context = nil + + @tokens = nil + @comments = nil + + reset + end + + def reset(reset_state=true) + # Ragel state: + if reset_state + # Unit tests set state prior to resetting lexer. + @cs = self.class.lex_en_line_begin + + @cond = StackState.new('cond') + @cmdarg = StackState.new('cmdarg') + @cond_stack = [] + @cmdarg_stack = [] + end + + @force_utf32 = false # Set to true by some tests + + @source_pts = nil # @source as a codepoint array + + @p = 0 # stream position (saved manually in #advance) + @ts = nil # token start + @te = nil # token end + @act = 0 # next action + + @stack = [] # state stack + @top = 0 # state stack top pointer + + # Lexer state: + @token_queue = [] + @literal_stack = [] + + @eq_begin_s = nil # location of last encountered =begin + @sharp_s = nil # location of last encountered # + + @newline_s = nil # location of last encountered newline + + @num_base = nil # last numeric base + @num_digits_s = nil # starting position of numeric digits + @num_suffix_s = nil # starting position of numeric suffix + @num_xfrm = nil # numeric suffix-induced transformation + + @escape_s = nil # starting position of current sequence + @escape = nil # last escaped sequence, as string + + @herebody_s = nil # starting position of current heredoc line + + # Ruby 1.9 ->() lambdas emit a distinct token if do/{ is + # encountered after a matching closing parenthesis. + @paren_nest = 0 + @lambda_stack = [] + + # After encountering the closing line of <<~SQUIGGLY_HEREDOC, + # we store the indentation level and give it out to the parser + # on request. It is not possible to infer indentation level just + # from the AST because escape sequences such as `\ ` or `\t` are + # expanded inside the lexer, but count as non-whitespace for + # indentation purposes. + @dedent_level = nil + + # If the lexer is in `command state' (aka expr_value) + # at the entry to #advance, it will transition to expr_cmdarg + # instead of expr_arg at certain points. + @command_start = true + + # State before =begin / =end block comment + @cs_before_block_comment = self.class.lex_en_line_begin + end + + def source_buffer=(source_buffer) + @source_buffer = source_buffer + + if @source_buffer + source = @source_buffer.source + + if source.encoding == Encoding::UTF_8 + @source_pts = source.unpack('U*') + else + @source_pts = source.unpack('C*') + end + + if @source_pts[0] == 0xfeff + # Skip byte order mark. + @p = 1 + end + else + @source_pts = nil + end + end + + def encoding + @source_buffer.source.encoding + end + + LEX_STATES = { + :line_begin => lex_en_line_begin, + :expr_dot => lex_en_expr_dot, + :expr_fname => lex_en_expr_fname, + :expr_value => lex_en_expr_value, + :expr_beg => lex_en_expr_beg, + :expr_mid => lex_en_expr_mid, + :expr_arg => lex_en_expr_arg, + :expr_cmdarg => lex_en_expr_cmdarg, + :expr_end => lex_en_expr_end, + :expr_endarg => lex_en_expr_endarg, + :expr_endfn => lex_en_expr_endfn, + :expr_labelarg => lex_en_expr_labelarg, + + :interp_string => lex_en_interp_string, + :interp_words => lex_en_interp_words, + :plain_string => lex_en_plain_string, + :plain_words => lex_en_plain_string, + } + + def state + LEX_STATES.invert.fetch(@cs, @cs) + end + + def state=(state) + @cs = LEX_STATES.fetch(state) + end + + def push_cmdarg + @cmdarg_stack.push(@cmdarg) + @cmdarg = StackState.new("cmdarg.#{@cmdarg_stack.count}") + end + + def pop_cmdarg + @cmdarg = @cmdarg_stack.pop + end + + def push_cond + @cond_stack.push(@cond) + @cond = StackState.new("cond.#{@cond_stack.count}") + end + + def pop_cond + @cond = @cond_stack.pop + end + + def dedent_level + # We erase @dedent_level as a precaution to avoid accidentally + # using a stale value. + dedent_level, @dedent_level = @dedent_level, nil + dedent_level + end + + # Return next token: [type, value]. + def advance + if @token_queue.any? + return @token_queue.shift + end + + # Ugly, but dependent on Ragel output. Consider refactoring it somehow. + klass = self.class + _lex_trans_keys = klass.send :_lex_trans_keys + _lex_key_spans = klass.send :_lex_key_spans + _lex_index_offsets = klass.send :_lex_index_offsets + _lex_indicies = klass.send :_lex_indicies + _lex_trans_targs = klass.send :_lex_trans_targs + _lex_trans_actions = klass.send :_lex_trans_actions + _lex_to_state_actions = klass.send :_lex_to_state_actions + _lex_from_state_actions = klass.send :_lex_from_state_actions + _lex_eof_trans = klass.send :_lex_eof_trans + + pe = @source_pts.size + 2 + p, eof = @p, pe + + cmd_state = @command_start + @command_start = false + + +# line 11327 "lib/parser/lexer.rb" +begin + testEof = false + _slen, _trans, _keys, _inds, _acts, _nacts = nil + _goto_level = 0 + _resume = 10 + _eof_trans = 15 + _again = 20 + _test_eof = 30 + _out = 40 + while true + if _goto_level <= 0 + if p == pe + _goto_level = _test_eof + next + end + if @cs == 0 + _goto_level = _out + next + end + end + if _goto_level <= _resume + case _lex_from_state_actions[ @cs] + when 97 then +# line 1 "NONE" + begin + @ts = p + end +# line 11355 "lib/parser/lexer.rb" + end + _keys = @cs << 1 + _inds = _lex_index_offsets[ @cs] + _slen = _lex_key_spans[ @cs] + _wide = ( (@source_pts[p] || 0)) + _trans = if ( _slen > 0 && + _lex_trans_keys[_keys] <= _wide && + _wide <= _lex_trans_keys[_keys + 1] + ) then + _lex_indicies[ _inds + _wide - _lex_trans_keys[_keys] ] + else + _lex_indicies[ _inds + _slen ] + end + end + if _goto_level <= _eof_trans + @cs = _lex_trans_targs[_trans] + if _lex_trans_actions[_trans] != 0 + case _lex_trans_actions[_trans] + when 29 then +# line 498 "lib/parser/lexer.rl" + begin + + # Record position of a newline for precise location reporting on tNL + # tokens. + # + # This action is embedded directly into c_nl, as it is idempotent and + # there are no cases when we need to skip it. + @newline_s = p + end + when 117 then +# line 822 "lib/parser/lexer.rl" + begin + + @escape_s = p + @escape = nil + end + when 30 then +# line 862 "lib/parser/lexer.rl" + begin + + # After every heredoc was parsed, @herebody_s contains the + # position of next token after all heredocs. + if @herebody_s + p = @herebody_s + @herebody_s = nil + end + end + when 60 then +# line 1226 "lib/parser/lexer.rl" + begin + @sharp_s = p - 1 end + when 64 then +# line 1229 "lib/parser/lexer.rl" + begin + emit_comment(@sharp_s, p == pe ? p - 2 : p) end + when 310 then +# line 1270 "lib/parser/lexer.rl" + begin + tm = p end + when 37 then +# line 1563 "lib/parser/lexer.rl" + begin + tm = p end + when 39 then +# line 1583 "lib/parser/lexer.rl" + begin + tm = p end + when 41 then +# line 1611 "lib/parser/lexer.rl" + begin + tm = p end + when 71 then +# line 1803 "lib/parser/lexer.rl" + begin + heredoc_e = p end + when 349 then +# line 1895 "lib/parser/lexer.rl" + begin + tm = p - 1; diag_msg = :ivar_name end + when 352 then +# line 1896 "lib/parser/lexer.rl" + begin + tm = p - 2; diag_msg = :cvar_name end + when 360 then +# line 1916 "lib/parser/lexer.rl" + begin + @escape = nil end + when 392 then +# line 2005 "lib/parser/lexer.rl" + begin + tm = p end + when 308 then +# line 2112 "lib/parser/lexer.rl" + begin + ident_tok = tok; ident_ts = @ts; ident_te = @te; end + when 479 then +# line 2298 "lib/parser/lexer.rl" + begin + @num_base = 16; @num_digits_s = p end + when 473 then +# line 2299 "lib/parser/lexer.rl" + begin + @num_base = 10; @num_digits_s = p end + when 476 then +# line 2300 "lib/parser/lexer.rl" + begin + @num_base = 8; @num_digits_s = p end + when 470 then +# line 2301 "lib/parser/lexer.rl" + begin + @num_base = 2; @num_digits_s = p end + when 485 then +# line 2302 "lib/parser/lexer.rl" + begin + @num_base = 10; @num_digits_s = @ts end + when 447 then +# line 2303 "lib/parser/lexer.rl" + begin + @num_base = 8; @num_digits_s = @ts end + when 462 then +# line 2304 "lib/parser/lexer.rl" + begin + @num_suffix_s = p end + when 455 then +# line 2361 "lib/parser/lexer.rl" + begin + @num_suffix_s = p end + when 452 then +# line 2362 "lib/parser/lexer.rl" + begin + @num_suffix_s = p end + when 89 then +# line 2572 "lib/parser/lexer.rl" + begin + tm = p end + when 7 then +# line 1 "NONE" + begin + @te = p+1 + end + when 113 then +# line 1103 "lib/parser/lexer.rl" + begin + @te = p+1 + begin + current_literal = literal + current_literal.flush_string + current_literal.extend_content + + emit(:tSTRING_DBEG, '#{'.freeze) + + if current_literal.heredoc? + current_literal.saved_herebody_s = @herebody_s + @herebody_s = nil + end + + current_literal.start_interp_brace + @command_start = true + @cs = 802; + begin + p += 1 + _goto_level = _out + next + end + + end + end + when 5 then +# line 1029 "lib/parser/lexer.rl" + begin + @te = p+1 + begin + current_literal = literal + current_literal.flush_string + current_literal.extend_content + + emit(:tSTRING_DVAR, nil, @ts, @ts + 1) + + p = @ts + begin + @stack[ @top] = @cs + @top+= 1 + @cs = 347 + _goto_level = _again + next + end + + end + end + when 109 then +# line 954 "lib/parser/lexer.rl" + begin + @te = p+1 + begin + current_literal = literal + if @te == pe + diagnostic :fatal, :string_eof, nil, + range(current_literal.str_s, current_literal.str_s + 1) + end + + if current_literal.heredoc? + line = tok(@herebody_s, @ts).gsub(/\r+$/, ''.freeze) + + if version?(18, 19, 20) + # See ruby:c48b4209c + line = line.gsub(/\r.*$/, ''.freeze) + end + + # Try ending the heredoc with the complete most recently + # scanned line. @herebody_s always refers to the start of such line. + if current_literal.nest_and_try_closing(line, @herebody_s, @ts) + # Adjust @herebody_s to point to the next line. + @herebody_s = @te + + # Continue regular lexing after the heredoc reference (<= 2.2 + if @version >= 22 && !@cond.active? + lookahead = @source_buffer.slice(@te...@te+2) + end + + current_literal = literal + if !current_literal.heredoc? && + (token = current_literal.nest_and_try_closing(string, @ts, @te, lookahead)) + if token[0] == :tLABEL_END + p += 1 + pop_literal + @cs = 795; + else + @cs = (pop_literal); + end + begin + p += 1 + _goto_level = _out + next + end + + else + current_literal.extend_string(string, @ts, @te) + end + end + end + when 115 then +# line 1045 "lib/parser/lexer.rl" + begin + @te = p +p = p - 1; begin + if @version >= 27 + literal.extend_string(tok, @ts, @te) + else + message = tok.start_with?('#@@') ? :cvar_name : :ivar_name + diagnostic :error, message, { :name => tok(@ts + 1, @te) }, range(@ts + 1, @te) + end + end + end + when 114 then +# line 1029 "lib/parser/lexer.rl" + begin + @te = p +p = p - 1; begin + current_literal = literal + current_literal.flush_string + current_literal.extend_content + + emit(:tSTRING_DVAR, nil, @ts, @ts + 1) + + p = @ts + begin + @stack[ @top] = @cs + @top+= 1 + @cs = 347 + _goto_level = _again + next + end + + end + end + when 111 then +# line 1016 "lib/parser/lexer.rl" + begin + @te = p +p = p - 1; begin + literal.extend_space @ts, @te + end + end + when 112 then +# line 871 "lib/parser/lexer.rl" + begin + @te = p +p = p - 1; begin + string = tok + + # tLABEL_END is only possible in non-cond context on >= 2.2 + if @version >= 22 && !@cond.active? + lookahead = @source_buffer.slice(@te...@te+2) + end + + current_literal = literal + if !current_literal.heredoc? && + (token = current_literal.nest_and_try_closing(string, @ts, @te, lookahead)) + if token[0] == :tLABEL_END + p += 1 + pop_literal + @cs = 795; + else + @cs = (pop_literal); + end + begin + p += 1 + _goto_level = _out + next + end + + else + current_literal.extend_string(string, @ts, @te) + end + end + end + when 6 then +# line 895 "lib/parser/lexer.rl" + begin + begin p = (( @te))-1; end + begin + current_literal = literal + # Get the first character after the backslash. + escaped_char = @source_buffer.slice(@escape_s).chr + + if current_literal.munge_escape? escaped_char + # If this particular literal uses this character as an opening + # or closing delimiter, it is an escape sequence for that + # particular character. Write it without the backslash. + + if current_literal.regexp? && REGEXP_META_CHARACTERS.match(escaped_char) + # Regular expressions should include escaped delimiters in their + # escaped form, except when the escaped character is + # a closing delimiter but not a regexp metacharacter. + # + # The backslash itself cannot be used as a closing delimiter + # at the same time as an escape symbol, but it is always munged, + # so this branch also executes for the non-closing-delimiter case + # for the backslash. + current_literal.extend_string(tok, @ts, @te) + else + current_literal.extend_string(escaped_char, @ts, @te) + end + else + # It does not. So this is an actual escape sequence, yay! + if current_literal.squiggly_heredoc? && escaped_char == "\n".freeze + # Squiggly heredocs like + # <<~-HERE + # 1\ + # 2 + # HERE + # treat '\' as a line continuation, but still dedent the body, so the heredoc above becomes "12\n". + # This information is emitted as is, without escaping, + # later this escape sequence (\\\n) gets handled manually in the Lexer::Dedenter + current_literal.extend_string(tok, @ts, @te) + elsif current_literal.supports_line_continuation_via_slash? && escaped_char == "\n".freeze + # Heredocs, regexp and a few other types of literals support line + # continuation via \\\n sequence. The code like + # "a\ + # b" + # must be parsed as "ab" + current_literal.extend_string(tok.gsub("\\\n".freeze, ''.freeze), @ts, @te) + elsif current_literal.regexp? && @version >= 31 && %w[c C m M].include?(escaped_char) + # Ruby >= 3.1 escapes \c- and \m chars, that's the only escape sequence + # supported by regexes so far, so it needs a separate branch. + current_literal.extend_string(@escape, @ts, @te) + elsif current_literal.regexp? + # Regular expressions should include escape sequences in their + # escaped form. On the other hand, escaped newlines are removed (in cases like "\\C-\\\n\\M-x") + current_literal.extend_string(tok.gsub("\\\n".freeze, ''.freeze), @ts, @te) + else + current_literal.extend_string(@escape || tok, @ts, @te) + end + end + end + end + when 4 then +# line 871 "lib/parser/lexer.rl" + begin + begin p = (( @te))-1; end + begin + string = tok + + # tLABEL_END is only possible in non-cond context on >= 2.2 + if @version >= 22 && !@cond.active? + lookahead = @source_buffer.slice(@te...@te+2) + end + + current_literal = literal + if !current_literal.heredoc? && + (token = current_literal.nest_and_try_closing(string, @ts, @te, lookahead)) + if token[0] == :tLABEL_END + p += 1 + pop_literal + @cs = 795; + else + @cs = (pop_literal); + end + begin + p += 1 + _goto_level = _out + next + end + + else + current_literal.extend_string(string, @ts, @te) + end + end + end + when 145 then +# line 1103 "lib/parser/lexer.rl" + begin + @te = p+1 + begin + current_literal = literal + current_literal.flush_string + current_literal.extend_content + + emit(:tSTRING_DBEG, '#{'.freeze) + + if current_literal.heredoc? + current_literal.saved_herebody_s = @herebody_s + @herebody_s = nil + end + + current_literal.start_interp_brace + @command_start = true + @cs = 802; + begin + p += 1 + _goto_level = _out + next + end + + end + end + when 10 then +# line 1029 "lib/parser/lexer.rl" + begin + @te = p+1 + begin + current_literal = literal + current_literal.flush_string + current_literal.extend_content + + emit(:tSTRING_DVAR, nil, @ts, @ts + 1) + + p = @ts + begin + @stack[ @top] = @cs + @top+= 1 + @cs = 347 + _goto_level = _again + next + end + + end + end + when 142 then +# line 954 "lib/parser/lexer.rl" + begin + @te = p+1 + begin + current_literal = literal + if @te == pe + diagnostic :fatal, :string_eof, nil, + range(current_literal.str_s, current_literal.str_s + 1) + end + + if current_literal.heredoc? + line = tok(@herebody_s, @ts).gsub(/\r+$/, ''.freeze) + + if version?(18, 19, 20) + # See ruby:c48b4209c + line = line.gsub(/\r.*$/, ''.freeze) + end + + # Try ending the heredoc with the complete most recently + # scanned line. @herebody_s always refers to the start of such line. + if current_literal.nest_and_try_closing(line, @herebody_s, @ts) + # Adjust @herebody_s to point to the next line. + @herebody_s = @te + + # Continue regular lexing after the heredoc reference (<= 2.2 + if @version >= 22 && !@cond.active? + lookahead = @source_buffer.slice(@te...@te+2) + end + + current_literal = literal + if !current_literal.heredoc? && + (token = current_literal.nest_and_try_closing(string, @ts, @te, lookahead)) + if token[0] == :tLABEL_END + p += 1 + pop_literal + @cs = 795; + else + @cs = (pop_literal); + end + begin + p += 1 + _goto_level = _out + next + end + + else + current_literal.extend_string(string, @ts, @te) + end + end + end + when 147 then +# line 1045 "lib/parser/lexer.rl" + begin + @te = p +p = p - 1; begin + if @version >= 27 + literal.extend_string(tok, @ts, @te) + else + message = tok.start_with?('#@@') ? :cvar_name : :ivar_name + diagnostic :error, message, { :name => tok(@ts + 1, @te) }, range(@ts + 1, @te) + end + end + end + when 146 then +# line 1029 "lib/parser/lexer.rl" + begin + @te = p +p = p - 1; begin + current_literal = literal + current_literal.flush_string + current_literal.extend_content + + emit(:tSTRING_DVAR, nil, @ts, @ts + 1) + + p = @ts + begin + @stack[ @top] = @cs + @top+= 1 + @cs = 347 + _goto_level = _again + next + end + + end + end + when 144 then +# line 871 "lib/parser/lexer.rl" + begin + @te = p +p = p - 1; begin + string = tok + + # tLABEL_END is only possible in non-cond context on >= 2.2 + if @version >= 22 && !@cond.active? + lookahead = @source_buffer.slice(@te...@te+2) + end + + current_literal = literal + if !current_literal.heredoc? && + (token = current_literal.nest_and_try_closing(string, @ts, @te, lookahead)) + if token[0] == :tLABEL_END + p += 1 + pop_literal + @cs = 795; + else + @cs = (pop_literal); + end + begin + p += 1 + _goto_level = _out + next + end + + else + current_literal.extend_string(string, @ts, @te) + end + end + end + when 11 then +# line 895 "lib/parser/lexer.rl" + begin + begin p = (( @te))-1; end + begin + current_literal = literal + # Get the first character after the backslash. + escaped_char = @source_buffer.slice(@escape_s).chr + + if current_literal.munge_escape? escaped_char + # If this particular literal uses this character as an opening + # or closing delimiter, it is an escape sequence for that + # particular character. Write it without the backslash. + + if current_literal.regexp? && REGEXP_META_CHARACTERS.match(escaped_char) + # Regular expressions should include escaped delimiters in their + # escaped form, except when the escaped character is + # a closing delimiter but not a regexp metacharacter. + # + # The backslash itself cannot be used as a closing delimiter + # at the same time as an escape symbol, but it is always munged, + # so this branch also executes for the non-closing-delimiter case + # for the backslash. + current_literal.extend_string(tok, @ts, @te) + else + current_literal.extend_string(escaped_char, @ts, @te) + end + else + # It does not. So this is an actual escape sequence, yay! + if current_literal.squiggly_heredoc? && escaped_char == "\n".freeze + # Squiggly heredocs like + # <<~-HERE + # 1\ + # 2 + # HERE + # treat '\' as a line continuation, but still dedent the body, so the heredoc above becomes "12\n". + # This information is emitted as is, without escaping, + # later this escape sequence (\\\n) gets handled manually in the Lexer::Dedenter + current_literal.extend_string(tok, @ts, @te) + elsif current_literal.supports_line_continuation_via_slash? && escaped_char == "\n".freeze + # Heredocs, regexp and a few other types of literals support line + # continuation via \\\n sequence. The code like + # "a\ + # b" + # must be parsed as "ab" + current_literal.extend_string(tok.gsub("\\\n".freeze, ''.freeze), @ts, @te) + elsif current_literal.regexp? && @version >= 31 && %w[c C m M].include?(escaped_char) + # Ruby >= 3.1 escapes \c- and \m chars, that's the only escape sequence + # supported by regexes so far, so it needs a separate branch. + current_literal.extend_string(@escape, @ts, @te) + elsif current_literal.regexp? + # Regular expressions should include escape sequences in their + # escaped form. On the other hand, escaped newlines are removed (in cases like "\\C-\\\n\\M-x") + current_literal.extend_string(tok.gsub("\\\n".freeze, ''.freeze), @ts, @te) + else + current_literal.extend_string(@escape || tok, @ts, @te) + end + end + end + end + when 9 then +# line 871 "lib/parser/lexer.rl" + begin + begin p = (( @te))-1; end + begin + string = tok + + # tLABEL_END is only possible in non-cond context on >= 2.2 + if @version >= 22 && !@cond.active? + lookahead = @source_buffer.slice(@te...@te+2) + end + + current_literal = literal + if !current_literal.heredoc? && + (token = current_literal.nest_and_try_closing(string, @ts, @te, lookahead)) + if token[0] == :tLABEL_END + p += 1 + pop_literal + @cs = 795; + else + @cs = (pop_literal); + end + begin + p += 1 + _goto_level = _out + next + end + + else + current_literal.extend_string(string, @ts, @te) + end + end + end + when 173 then +# line 954 "lib/parser/lexer.rl" + begin + @te = p+1 + begin + current_literal = literal + if @te == pe + diagnostic :fatal, :string_eof, nil, + range(current_literal.str_s, current_literal.str_s + 1) + end + + if current_literal.heredoc? + line = tok(@herebody_s, @ts).gsub(/\r+$/, ''.freeze) + + if version?(18, 19, 20) + # See ruby:c48b4209c + line = line.gsub(/\r.*$/, ''.freeze) + end + + # Try ending the heredoc with the complete most recently + # scanned line. @herebody_s always refers to the start of such line. + if current_literal.nest_and_try_closing(line, @herebody_s, @ts) + # Adjust @herebody_s to point to the next line. + @herebody_s = @te + + # Continue regular lexing after the heredoc reference (<= 2.2 + if @version >= 22 && !@cond.active? + lookahead = @source_buffer.slice(@te...@te+2) + end + + current_literal = literal + if !current_literal.heredoc? && + (token = current_literal.nest_and_try_closing(string, @ts, @te, lookahead)) + if token[0] == :tLABEL_END + p += 1 + pop_literal + @cs = 795; + else + @cs = (pop_literal); + end + begin + p += 1 + _goto_level = _out + next + end + + else + current_literal.extend_string(string, @ts, @te) + end + end + end + when 175 then +# line 1016 "lib/parser/lexer.rl" + begin + @te = p +p = p - 1; begin + literal.extend_space @ts, @te + end + end + when 176 then +# line 871 "lib/parser/lexer.rl" + begin + @te = p +p = p - 1; begin + string = tok + + # tLABEL_END is only possible in non-cond context on >= 2.2 + if @version >= 22 && !@cond.active? + lookahead = @source_buffer.slice(@te...@te+2) + end + + current_literal = literal + if !current_literal.heredoc? && + (token = current_literal.nest_and_try_closing(string, @ts, @te, lookahead)) + if token[0] == :tLABEL_END + p += 1 + pop_literal + @cs = 795; + else + @cs = (pop_literal); + end + begin + p += 1 + _goto_level = _out + next + end + + else + current_literal.extend_string(string, @ts, @te) + end + end + end + when 179 then +# line 954 "lib/parser/lexer.rl" + begin + @te = p+1 + begin + current_literal = literal + if @te == pe + diagnostic :fatal, :string_eof, nil, + range(current_literal.str_s, current_literal.str_s + 1) + end + + if current_literal.heredoc? + line = tok(@herebody_s, @ts).gsub(/\r+$/, ''.freeze) + + if version?(18, 19, 20) + # See ruby:c48b4209c + line = line.gsub(/\r.*$/, ''.freeze) + end + + # Try ending the heredoc with the complete most recently + # scanned line. @herebody_s always refers to the start of such line. + if current_literal.nest_and_try_closing(line, @herebody_s, @ts) + # Adjust @herebody_s to point to the next line. + @herebody_s = @te + + # Continue regular lexing after the heredoc reference (<= 2.2 + if @version >= 22 && !@cond.active? + lookahead = @source_buffer.slice(@te...@te+2) + end + + current_literal = literal + if !current_literal.heredoc? && + (token = current_literal.nest_and_try_closing(string, @ts, @te, lookahead)) + if token[0] == :tLABEL_END + p += 1 + pop_literal + @cs = 795; + else + @cs = (pop_literal); + end + begin + p += 1 + _goto_level = _out + next + end + + else + current_literal.extend_string(string, @ts, @te) + end + end + end + when 181 then +# line 871 "lib/parser/lexer.rl" + begin + @te = p +p = p - 1; begin + string = tok + + # tLABEL_END is only possible in non-cond context on >= 2.2 + if @version >= 22 && !@cond.active? + lookahead = @source_buffer.slice(@te...@te+2) + end + + current_literal = literal + if !current_literal.heredoc? && + (token = current_literal.nest_and_try_closing(string, @ts, @te, lookahead)) + if token[0] == :tLABEL_END + p += 1 + pop_literal + @cs = 795; + else + @cs = (pop_literal); + end + begin + p += 1 + _goto_level = _out + next + end + + else + current_literal.extend_string(string, @ts, @te) + end + end + end + when 188 then +# line 1103 "lib/parser/lexer.rl" + begin + @te = p+1 + begin + current_literal = literal + current_literal.flush_string + current_literal.extend_content + + emit(:tSTRING_DBEG, '#{'.freeze) + + if current_literal.heredoc? + current_literal.saved_herebody_s = @herebody_s + @herebody_s = nil + end + + current_literal.start_interp_brace + @command_start = true + @cs = 802; + begin + p += 1 + _goto_level = _out + next + end + + end + end + when 13 then +# line 1029 "lib/parser/lexer.rl" + begin + @te = p+1 + begin + current_literal = literal + current_literal.flush_string + current_literal.extend_content + + emit(:tSTRING_DVAR, nil, @ts, @ts + 1) + + p = @ts + begin + @stack[ @top] = @cs + @top+= 1 + @cs = 347 + _goto_level = _again + next + end + + end + end + when 185 then +# line 954 "lib/parser/lexer.rl" + begin + @te = p+1 + begin + current_literal = literal + if @te == pe + diagnostic :fatal, :string_eof, nil, + range(current_literal.str_s, current_literal.str_s + 1) + end + + if current_literal.heredoc? + line = tok(@herebody_s, @ts).gsub(/\r+$/, ''.freeze) + + if version?(18, 19, 20) + # See ruby:c48b4209c + line = line.gsub(/\r.*$/, ''.freeze) + end + + # Try ending the heredoc with the complete most recently + # scanned line. @herebody_s always refers to the start of such line. + if current_literal.nest_and_try_closing(line, @herebody_s, @ts) + # Adjust @herebody_s to point to the next line. + @herebody_s = @te + + # Continue regular lexing after the heredoc reference (<= 2.2 + if @version >= 22 && !@cond.active? + lookahead = @source_buffer.slice(@te...@te+2) + end + + current_literal = literal + if !current_literal.heredoc? && + (token = current_literal.nest_and_try_closing(string, @ts, @te, lookahead)) + if token[0] == :tLABEL_END + p += 1 + pop_literal + @cs = 795; + else + @cs = (pop_literal); + end + begin + p += 1 + _goto_level = _out + next + end + + else + current_literal.extend_string(string, @ts, @te) + end + end + end + when 190 then +# line 1045 "lib/parser/lexer.rl" + begin + @te = p +p = p - 1; begin + if @version >= 27 + literal.extend_string(tok, @ts, @te) + else + message = tok.start_with?('#@@') ? :cvar_name : :ivar_name + diagnostic :error, message, { :name => tok(@ts + 1, @te) }, range(@ts + 1, @te) + end + end + end + when 189 then +# line 1029 "lib/parser/lexer.rl" + begin + @te = p +p = p - 1; begin + current_literal = literal + current_literal.flush_string + current_literal.extend_content + + emit(:tSTRING_DVAR, nil, @ts, @ts + 1) + + p = @ts + begin + @stack[ @top] = @cs + @top+= 1 + @cs = 347 + _goto_level = _again + next + end + + end + end + when 187 then +# line 871 "lib/parser/lexer.rl" + begin + @te = p +p = p - 1; begin + string = tok + + # tLABEL_END is only possible in non-cond context on >= 2.2 + if @version >= 22 && !@cond.active? + lookahead = @source_buffer.slice(@te...@te+2) + end + + current_literal = literal + if !current_literal.heredoc? && + (token = current_literal.nest_and_try_closing(string, @ts, @te, lookahead)) + if token[0] == :tLABEL_END + p += 1 + pop_literal + @cs = 795; + else + @cs = (pop_literal); + end + begin + p += 1 + _goto_level = _out + next + end + + else + current_literal.extend_string(string, @ts, @te) + end + end + end + when 12 then +# line 871 "lib/parser/lexer.rl" + begin + begin p = (( @te))-1; end + begin + string = tok + + # tLABEL_END is only possible in non-cond context on >= 2.2 + if @version >= 22 && !@cond.active? + lookahead = @source_buffer.slice(@te...@te+2) + end + + current_literal = literal + if !current_literal.heredoc? && + (token = current_literal.nest_and_try_closing(string, @ts, @te, lookahead)) + if token[0] == :tLABEL_END + p += 1 + pop_literal + @cs = 795; + else + @cs = (pop_literal); + end + begin + p += 1 + _goto_level = _out + next + end + + else + current_literal.extend_string(string, @ts, @te) + end + end + end + when 192 then +# line 954 "lib/parser/lexer.rl" + begin + @te = p+1 + begin + current_literal = literal + if @te == pe + diagnostic :fatal, :string_eof, nil, + range(current_literal.str_s, current_literal.str_s + 1) + end + + if current_literal.heredoc? + line = tok(@herebody_s, @ts).gsub(/\r+$/, ''.freeze) + + if version?(18, 19, 20) + # See ruby:c48b4209c + line = line.gsub(/\r.*$/, ''.freeze) + end + + # Try ending the heredoc with the complete most recently + # scanned line. @herebody_s always refers to the start of such line. + if current_literal.nest_and_try_closing(line, @herebody_s, @ts) + # Adjust @herebody_s to point to the next line. + @herebody_s = @te + + # Continue regular lexing after the heredoc reference (<= 2.2 + if @version >= 22 && !@cond.active? + lookahead = @source_buffer.slice(@te...@te+2) + end + + current_literal = literal + if !current_literal.heredoc? && + (token = current_literal.nest_and_try_closing(string, @ts, @te, lookahead)) + if token[0] == :tLABEL_END + p += 1 + pop_literal + @cs = 795; + else + @cs = (pop_literal); + end + begin + p += 1 + _goto_level = _out + next + end + + else + current_literal.extend_string(string, @ts, @te) + end + end + end + when 199 then +# line 1103 "lib/parser/lexer.rl" + begin + @te = p+1 + begin + current_literal = literal + current_literal.flush_string + current_literal.extend_content + + emit(:tSTRING_DBEG, '#{'.freeze) + + if current_literal.heredoc? + current_literal.saved_herebody_s = @herebody_s + @herebody_s = nil + end + + current_literal.start_interp_brace + @command_start = true + @cs = 802; + begin + p += 1 + _goto_level = _out + next + end + + end + end + when 15 then +# line 1029 "lib/parser/lexer.rl" + begin + @te = p+1 + begin + current_literal = literal + current_literal.flush_string + current_literal.extend_content + + emit(:tSTRING_DVAR, nil, @ts, @ts + 1) + + p = @ts + begin + @stack[ @top] = @cs + @top+= 1 + @cs = 347 + _goto_level = _again + next + end + + end + end + when 195 then +# line 954 "lib/parser/lexer.rl" + begin + @te = p+1 + begin + current_literal = literal + if @te == pe + diagnostic :fatal, :string_eof, nil, + range(current_literal.str_s, current_literal.str_s + 1) + end + + if current_literal.heredoc? + line = tok(@herebody_s, @ts).gsub(/\r+$/, ''.freeze) + + if version?(18, 19, 20) + # See ruby:c48b4209c + line = line.gsub(/\r.*$/, ''.freeze) + end + + # Try ending the heredoc with the complete most recently + # scanned line. @herebody_s always refers to the start of such line. + if current_literal.nest_and_try_closing(line, @herebody_s, @ts) + # Adjust @herebody_s to point to the next line. + @herebody_s = @te + + # Continue regular lexing after the heredoc reference (<= 2.2 + if @version >= 22 && !@cond.active? + lookahead = @source_buffer.slice(@te...@te+2) + end + + current_literal = literal + if !current_literal.heredoc? && + (token = current_literal.nest_and_try_closing(string, @ts, @te, lookahead)) + if token[0] == :tLABEL_END + p += 1 + pop_literal + @cs = 795; + else + @cs = (pop_literal); + end + begin + p += 1 + _goto_level = _out + next + end + + else + current_literal.extend_string(string, @ts, @te) + end + end + end + when 201 then +# line 1045 "lib/parser/lexer.rl" + begin + @te = p +p = p - 1; begin + if @version >= 27 + literal.extend_string(tok, @ts, @te) + else + message = tok.start_with?('#@@') ? :cvar_name : :ivar_name + diagnostic :error, message, { :name => tok(@ts + 1, @te) }, range(@ts + 1, @te) + end + end + end + when 200 then +# line 1029 "lib/parser/lexer.rl" + begin + @te = p +p = p - 1; begin + current_literal = literal + current_literal.flush_string + current_literal.extend_content + + emit(:tSTRING_DVAR, nil, @ts, @ts + 1) + + p = @ts + begin + @stack[ @top] = @cs + @top+= 1 + @cs = 347 + _goto_level = _again + next + end + + end + end + when 197 then +# line 1016 "lib/parser/lexer.rl" + begin + @te = p +p = p - 1; begin + literal.extend_space @ts, @te + end + end + when 198 then +# line 871 "lib/parser/lexer.rl" + begin + @te = p +p = p - 1; begin + string = tok + + # tLABEL_END is only possible in non-cond context on >= 2.2 + if @version >= 22 && !@cond.active? + lookahead = @source_buffer.slice(@te...@te+2) + end + + current_literal = literal + if !current_literal.heredoc? && + (token = current_literal.nest_and_try_closing(string, @ts, @te, lookahead)) + if token[0] == :tLABEL_END + p += 1 + pop_literal + @cs = 795; + else + @cs = (pop_literal); + end + begin + p += 1 + _goto_level = _out + next + end + + else + current_literal.extend_string(string, @ts, @te) + end + end + end + when 14 then +# line 871 "lib/parser/lexer.rl" + begin + begin p = (( @te))-1; end + begin + string = tok + + # tLABEL_END is only possible in non-cond context on >= 2.2 + if @version >= 22 && !@cond.active? + lookahead = @source_buffer.slice(@te...@te+2) + end + + current_literal = literal + if !current_literal.heredoc? && + (token = current_literal.nest_and_try_closing(string, @ts, @te, lookahead)) + if token[0] == :tLABEL_END + p += 1 + pop_literal + @cs = 795; + else + @cs = (pop_literal); + end + begin + p += 1 + _goto_level = _out + next + end + + else + current_literal.extend_string(string, @ts, @te) + end + end + end + when 203 then +# line 954 "lib/parser/lexer.rl" + begin + @te = p+1 + begin + current_literal = literal + if @te == pe + diagnostic :fatal, :string_eof, nil, + range(current_literal.str_s, current_literal.str_s + 1) + end + + if current_literal.heredoc? + line = tok(@herebody_s, @ts).gsub(/\r+$/, ''.freeze) + + if version?(18, 19, 20) + # See ruby:c48b4209c + line = line.gsub(/\r.*$/, ''.freeze) + end + + # Try ending the heredoc with the complete most recently + # scanned line. @herebody_s always refers to the start of such line. + if current_literal.nest_and_try_closing(line, @herebody_s, @ts) + # Adjust @herebody_s to point to the next line. + @herebody_s = @te + + # Continue regular lexing after the heredoc reference (<= 2.2 + if @version >= 22 && !@cond.active? + lookahead = @source_buffer.slice(@te...@te+2) + end + + current_literal = literal + if !current_literal.heredoc? && + (token = current_literal.nest_and_try_closing(string, @ts, @te, lookahead)) + if token[0] == :tLABEL_END + p += 1 + pop_literal + @cs = 795; + else + @cs = (pop_literal); + end + begin + p += 1 + _goto_level = _out + next + end + + else + current_literal.extend_string(string, @ts, @te) + end + end + end + when 205 then +# line 1016 "lib/parser/lexer.rl" + begin + @te = p +p = p - 1; begin + literal.extend_space @ts, @te + end + end + when 206 then +# line 1200 "lib/parser/lexer.rl" + begin + @te = p+1 + begin + emit(:tREGEXP_OPT, tok(@ts, @te - 1), @ts, @te - 1) + p = p - 1; + begin + @cs = 810 + _goto_level = _again + next + end + + end + end + when 207 then +# line 1187 "lib/parser/lexer.rl" + begin + @te = p +p = p - 1; begin + unknown_options = tok.scan(/[^imxouesn]/) + if unknown_options.any? + diagnostic :error, :regexp_options, + { :options => unknown_options.join } + end + + emit(:tREGEXP_OPT) + @cs = 810; + begin + p += 1 + _goto_level = _out + next + end + + end + end + when 16 then +# line 1339 "lib/parser/lexer.rl" + begin + @te = p+1 + begin + if tok =~ /^\$([1-9][0-9]*)$/ + emit(:tNTH_REF, tok(@ts + 1).to_i) + elsif tok =~ /^\$([&`'+])$/ + emit(:tBACK_REF) + else + emit(:tGVAR) + end + + @cs = (stack_pop); begin + p += 1 + _goto_level = _out + next + end + + end + end + when 208 then +# line 1339 "lib/parser/lexer.rl" + begin + @te = p +p = p - 1; begin + if tok =~ /^\$([1-9][0-9]*)$/ + emit(:tNTH_REF, tok(@ts + 1).to_i) + elsif tok =~ /^\$([&`'+])$/ + emit(:tBACK_REF) + else + emit(:tGVAR) + end + + @cs = (stack_pop); begin + p += 1 + _goto_level = _out + next + end + + end + end + when 210 then +# line 1352 "lib/parser/lexer.rl" + begin + @te = p +p = p - 1; begin + if tok =~ /^@@[0-9]/ + diagnostic :error, :cvar_name, { :name => tok } + end + + emit(:tCVAR) + @cs = (stack_pop); begin + p += 1 + _goto_level = _out + next + end + + end + end + when 209 then +# line 1362 "lib/parser/lexer.rl" + begin + @te = p +p = p - 1; begin + if tok =~ /^@[0-9]/ + diagnostic :error, :ivar_name, { :name => tok } + end + + emit(:tIVAR) + @cs = (stack_pop); begin + p += 1 + _goto_level = _out + next + end + + end + end + when 231 then +# line 1383 "lib/parser/lexer.rl" + begin + @te = p+1 + begin emit_table(KEYWORDS_BEGIN); + @cs = 465; begin + p += 1 + _goto_level = _out + next + end + end + end + when 217 then +# line 1391 "lib/parser/lexer.rl" + begin + @te = p+1 + begin emit(:tIDENTIFIER) + @cs = 465; begin + p += 1 + _goto_level = _out + next + end + end + end + when 18 then +# line 1395 "lib/parser/lexer.rl" + begin + @te = p+1 + begin p = @ts - 1 + @cs = 810; begin + @stack[ @top] = @cs + @top+= 1 + @cs = 347 + _goto_level = _again + next + end + end + end + when 214 then +# line 1404 "lib/parser/lexer.rl" + begin + @te = p+1 + begin emit_table(PUNCTUATION) + @cs = 465; begin + p += 1 + _goto_level = _out + next + end + end + end + when 226 then +# line 1408 "lib/parser/lexer.rl" + begin + @te = p+1 + begin p = p - 1; p = p - 1; begin + @cs = 810 + _goto_level = _again + next + end + end + end + when 20 then +# line 1414 "lib/parser/lexer.rl" + begin + @te = p+1 + begin + if version?(23) + type, delimiter = tok[0..-2], tok[-1].chr + begin + @cs = (push_literal(type, delimiter, @ts)) + _goto_level = _again + next + end + + else + p = @ts - 1 + begin + @cs = 810 + _goto_level = _again + next + end + + end + end + end + when 213 then +# line 1427 "lib/parser/lexer.rl" + begin + @te = p+1 + begin p = p - 1; begin + @cs = 810 + _goto_level = _again + next + end + end + end + when 212 then +# line 525 "lib/parser/lexer.rl" + begin + @te = p+1 + begin + # Sit at EOF indefinitely. #advance would return $eof each time. + # This allows to feed the lexer more data if needed; this is only used + # in tests. + # + # Note that this action is not embedded into e_eof like e_heredoc_nl and e_bs + # below. This is due to the fact that scanner state at EOF is observed + # by tests, and encapsulating it in a rule would break the introspection. + p = p - 1; begin + p += 1 + _goto_level = _out + next + end + + end + end + when 230 then +# line 1383 "lib/parser/lexer.rl" + begin + @te = p +p = p - 1; begin emit_table(KEYWORDS_BEGIN); + @cs = 465; begin + p += 1 + _goto_level = _out + next + end + end + end + when 227 then +# line 1387 "lib/parser/lexer.rl" + begin + @te = p +p = p - 1; begin emit(:tCONSTANT) + @cs = 465; begin + p += 1 + _goto_level = _out + next + end + end + end + when 229 then +# line 1391 "lib/parser/lexer.rl" + begin + @te = p +p = p - 1; begin emit(:tIDENTIFIER) + @cs = 465; begin + p += 1 + _goto_level = _out + next + end + end + end + when 224 then +# line 1395 "lib/parser/lexer.rl" + begin + @te = p +p = p - 1; begin p = @ts - 1 + @cs = 810; begin + @stack[ @top] = @cs + @top+= 1 + @cs = 347 + _goto_level = _again + next + end + end + end + when 220 then +# line 1404 "lib/parser/lexer.rl" + begin + @te = p +p = p - 1; begin emit_table(PUNCTUATION) + @cs = 465; begin + p += 1 + _goto_level = _out + next + end + end + end + when 225 then +# line 1411 "lib/parser/lexer.rl" + begin + @te = p +p = p - 1; begin p = p - 1; begin + @cs = 563 + _goto_level = _again + next + end + end + end + when 218 then +# line 1424 "lib/parser/lexer.rl" + begin + @te = p +p = p - 1; end + when 223 then +# line 1427 "lib/parser/lexer.rl" + begin + @te = p +p = p - 1; begin p = p - 1; begin + @cs = 810 + _goto_level = _again + next + end + end + end + when 19 then +# line 1404 "lib/parser/lexer.rl" + begin + begin p = (( @te))-1; end + begin emit_table(PUNCTUATION) + @cs = 465; begin + p += 1 + _goto_level = _out + next + end + end + end + when 17 then +# line 1427 "lib/parser/lexer.rl" + begin + begin p = (( @te))-1; end + begin p = p - 1; begin + @cs = 810 + _goto_level = _again + next + end + end + end + when 216 then +# line 1 "NONE" + begin + case @act + when 43 then + begin begin p = (( @te))-1; end + emit_table(KEYWORDS_BEGIN); + @cs = 465; begin + p += 1 + _goto_level = _out + next + end + end + when 44 then + begin begin p = (( @te))-1; end + emit(:tCONSTANT) + @cs = 465; begin + p += 1 + _goto_level = _out + next + end + end + when 45 then + begin begin p = (( @te))-1; end + emit(:tIDENTIFIER) + @cs = 465; begin + p += 1 + _goto_level = _out + next + end + end +end + end + when 22 then +# line 1439 "lib/parser/lexer.rl" + begin + @te = p+1 + begin emit(:tLABEL, tok(@ts, @te - 2), @ts, @te - 1) + p = p - 1; @cs = 795; begin + p += 1 + _goto_level = _out + next + end + end + end + when 23 then +# line 1443 "lib/parser/lexer.rl" + begin + @te = p+1 + begin + if @version >= 31 && @context.in_argdef + emit(:tBDOT3, '...'.freeze) + # emit(:tNL, "\n".freeze, @te - 1, @te) + @cs = 810; begin + p += 1 + _goto_level = _out + next + end + + else + p -= 3; + begin + @cs = 810 + _goto_level = _again + next + end + + end + end + end + when 233 then +# line 1457 "lib/parser/lexer.rl" + begin + @te = p+1 + begin p = p - 1; begin + @cs = 810 + _goto_level = _again + next + end + end + end + when 232 then +# line 525 "lib/parser/lexer.rl" + begin + @te = p+1 + begin + # Sit at EOF indefinitely. #advance would return $eof each time. + # This allows to feed the lexer more data if needed; this is only used + # in tests. + # + # Note that this action is not embedded into e_eof like e_heredoc_nl and e_bs + # below. This is due to the fact that scanner state at EOF is observed + # by tests, and encapsulating it in a rule would break the introspection. + p = p - 1; begin + p += 1 + _goto_level = _out + next + end + + end + end + when 235 then +# line 1454 "lib/parser/lexer.rl" + begin + @te = p +p = p - 1; end + when 234 then +# line 1457 "lib/parser/lexer.rl" + begin + @te = p +p = p - 1; begin p = p - 1; begin + @cs = 810 + _goto_level = _again + next + end + end + end + when 21 then +# line 1457 "lib/parser/lexer.rl" + begin + begin p = (( @te))-1; end + begin p = p - 1; begin + @cs = 810 + _goto_level = _again + next + end + end + end + when 241 then +# line 1483 "lib/parser/lexer.rl" + begin + @te = p+1 + begin emit_table(PUNCTUATION) + @cs = 494; begin + p += 1 + _goto_level = _out + next + end + end + end + when 240 then +# line 1489 "lib/parser/lexer.rl" + begin + @te = p+1 + begin p = p - 1; begin + @cs = 810 + _goto_level = _again + next + end + end + end + when 239 then +# line 525 "lib/parser/lexer.rl" + begin + @te = p+1 + begin + # Sit at EOF indefinitely. #advance would return $eof each time. + # This allows to feed the lexer more data if needed; this is only used + # in tests. + # + # Note that this action is not embedded into e_eof like e_heredoc_nl and e_bs + # below. This is due to the fact that scanner state at EOF is observed + # by tests, and encapsulating it in a rule would break the introspection. + p = p - 1; begin + p += 1 + _goto_level = _out + next + end + + end + end + when 251 then +# line 1468 "lib/parser/lexer.rl" + begin + @te = p +p = p - 1; begin emit(:tCONSTANT) + @cs = (arg_or_cmdarg(cmd_state)); begin + p += 1 + _goto_level = _out + next + end + end + end + when 242 then +# line 1472 "lib/parser/lexer.rl" + begin + @te = p +p = p - 1; begin emit(:tIDENTIFIER) + @cs = (arg_or_cmdarg(cmd_state)); begin + p += 1 + _goto_level = _out + next + end + end + end + when 247 then +# line 1483 "lib/parser/lexer.rl" + begin + @te = p +p = p - 1; begin emit_table(PUNCTUATION) + @cs = 494; begin + p += 1 + _goto_level = _out + next + end + end + end + when 245 then +# line 1486 "lib/parser/lexer.rl" + begin + @te = p +p = p - 1; end + when 250 then +# line 1489 "lib/parser/lexer.rl" + begin + @te = p +p = p - 1; begin p = p - 1; begin + @cs = 810 + _goto_level = _again + next + end + end + end + when 274 then +# line 1549 "lib/parser/lexer.rl" + begin + @te = p+1 + begin + # Unlike expr_beg as invoked in the next rule, do not warn + p = @ts - 1 + begin + @cs = 810 + _goto_level = _again + next + end + + end + end + when 257 then +# line 1567 "lib/parser/lexer.rl" + begin + @te = p+1 + begin + if tok(tm, tm + 1) == '/'.freeze + # Ambiguous regexp literal. + if @version < 30 + diagnostic :warning, :ambiguous_literal, nil, range(tm, tm + 1) + else + diagnostic :warning, :ambiguous_regexp, nil, range(tm, tm + 1) + end + end + + p = tm - 1 + begin + @cs = 563 + _goto_level = _again + next + end + + end + end + when 263 then +# line 1595 "lib/parser/lexer.rl" + begin + @te = p+1 + begin p = p - 1; p = p - 1; begin + @cs = 563 + _goto_level = _again + next + end + end + end + when 25 then +# line 1603 "lib/parser/lexer.rl" + begin + @te = p+1 + begin p = @ts - 1; begin + @cs = 563 + _goto_level = _again + next + end + end + end + when 265 then +# line 1612 "lib/parser/lexer.rl" + begin + @te = p+1 + begin p = tm - 1; begin + @cs = 810 + _goto_level = _again + next + end + end + end + when 40 then +# line 1623 "lib/parser/lexer.rl" + begin + @te = p+1 + begin + p = @ts - 1 + begin + @cs = 810 + _goto_level = _again + next + end + + end + end + when 252 then +# line 1637 "lib/parser/lexer.rl" + begin + @te = p+1 + begin p = p - 1; begin + @cs = 563 + _goto_level = _again + next + end + end + end + when 253 then +# line 525 "lib/parser/lexer.rl" + begin + @te = p+1 + begin + # Sit at EOF indefinitely. #advance would return $eof each time. + # This allows to feed the lexer more data if needed; this is only used + # in tests. + # + # Note that this action is not embedded into e_eof like e_heredoc_nl and e_bs + # below. This is due to the fact that scanner state at EOF is observed + # by tests, and encapsulating it in a rule would break the introspection. + p = p - 1; begin + p += 1 + _goto_level = _out + next + end + + end + end + when 264 then +# line 1558 "lib/parser/lexer.rl" + begin + @te = p +p = p - 1; begin p = p - 1; begin + @cs = 563 + _goto_level = _again + next + end + end + end + when 260 then +# line 1584 "lib/parser/lexer.rl" + begin + @te = p +p = p - 1; begin + diagnostic :warning, :ambiguous_prefix, { :prefix => tok(tm, @te) }, + range(tm, @te) + + p = tm - 1 + begin + @cs = 563 + _goto_level = _again + next + end + + end + end + when 262 then +# line 1600 "lib/parser/lexer.rl" + begin + @te = p +p = p - 1; begin p = p - 1; begin + @cs = 563 + _goto_level = _again + next + end + end + end + when 256 then +# line 1623 "lib/parser/lexer.rl" + begin + @te = p +p = p - 1; begin + p = @ts - 1 + begin + @cs = 810 + _goto_level = _again + next + end + + end + end + when 255 then +# line 1628 "lib/parser/lexer.rl" + begin + @te = p +p = p - 1; end + when 273 then +# line 1637 "lib/parser/lexer.rl" + begin + @te = p +p = p - 1; begin p = p - 1; begin + @cs = 563 + _goto_level = _again + next + end + end + end + when 26 then +# line 1628 "lib/parser/lexer.rl" + begin + begin p = (( @te))-1; end + end + when 42 then +# line 1637 "lib/parser/lexer.rl" + begin + begin p = (( @te))-1; end + begin p = p - 1; begin + @cs = 563 + _goto_level = _again + next + end + end + end + when 24 then +# line 1 "NONE" + begin + case @act + when 72 then + begin begin p = (( @te))-1; end + + if tok(tm, tm + 1) == '/'.freeze + # Ambiguous regexp literal. + if @version < 30 + diagnostic :warning, :ambiguous_literal, nil, range(tm, tm + 1) + else + diagnostic :warning, :ambiguous_regexp, nil, range(tm, tm + 1) + end + end + + p = tm - 1 + begin + @cs = 563 + _goto_level = _again + next + end + + end + when 73 then + begin begin p = (( @te))-1; end + + diagnostic :warning, :ambiguous_prefix, { :prefix => tok(tm, @te) }, + range(tm, @te) + + p = tm - 1 + begin + @cs = 563 + _goto_level = _again + next + end + + end + when 78 then + begin begin p = (( @te))-1; end + + p = @ts - 1 + begin + @cs = 810 + _goto_level = _again + next + end + + end + else + begin begin p = (( @te))-1; end +end +end + end + when 44 then +# line 1673 "lib/parser/lexer.rl" + begin + @te = p+1 + begin p = @ts - 1 + begin + @cs = 494 + _goto_level = _again + next + end + end + end + when 278 then +# line 525 "lib/parser/lexer.rl" + begin + @te = p+1 + begin + # Sit at EOF indefinitely. #advance would return $eof each time. + # This allows to feed the lexer more data if needed; this is only used + # in tests. + # + # Note that this action is not embedded into e_eof like e_heredoc_nl and e_bs + # below. This is due to the fact that scanner state at EOF is observed + # by tests, and encapsulating it in a rule would break the introspection. + p = p - 1; begin + p += 1 + _goto_level = _out + next + end + + end + end + when 279 then +# line 1673 "lib/parser/lexer.rl" + begin + @te = p +p = p - 1; begin p = @ts - 1 + begin + @cs = 494 + _goto_level = _again + next + end + end + end + when 45 then +# line 1673 "lib/parser/lexer.rl" + begin + begin p = (( @te))-1; end + begin p = @ts - 1 + begin + @cs = 494 + _goto_level = _again + next + end + end + end + when 43 then +# line 1 "NONE" + begin + case @act + when 85 then + begin begin p = (( @te))-1; end + + if @cond.active? + emit(:kDO_COND, 'do'.freeze, @te - 2, @te) + else + emit(:kDO, 'do'.freeze, @te - 2, @te) + end + @cs = 802; begin + p += 1 + _goto_level = _out + next + end + + end + when 86 then + begin begin p = (( @te))-1; end + p = @ts - 1 + begin + @cs = 494 + _goto_level = _again + next + end + end +end + end + when 289 then +# line 1709 "lib/parser/lexer.rl" + begin + @te = p+1 + begin emit_do(true) + @cs = 802; begin + p += 1 + _goto_level = _out + next + end + end + end + when 282 then +# line 1715 "lib/parser/lexer.rl" + begin + @te = p+1 + begin p = p - 1; begin + @cs = 810 + _goto_level = _again + next + end + end + end + when 283 then +# line 525 "lib/parser/lexer.rl" + begin + @te = p+1 + begin + # Sit at EOF indefinitely. #advance would return $eof each time. + # This allows to feed the lexer more data if needed; this is only used + # in tests. + # + # Note that this action is not embedded into e_eof like e_heredoc_nl and e_bs + # below. This is due to the fact that scanner state at EOF is observed + # by tests, and encapsulating it in a rule would break the introspection. + p = p - 1; begin + p += 1 + _goto_level = _out + next + end + + end + end + when 284 then +# line 1712 "lib/parser/lexer.rl" + begin + @te = p +p = p - 1; end + when 287 then +# line 1715 "lib/parser/lexer.rl" + begin + @te = p +p = p - 1; begin p = p - 1; begin + @cs = 810 + _goto_level = _again + next + end + end + end + when 293 then +# line 1739 "lib/parser/lexer.rl" + begin + @te = p+1 + begin p = p - 1; begin + @cs = 563 + _goto_level = _again + next + end + end + end + when 292 then +# line 525 "lib/parser/lexer.rl" + begin + @te = p+1 + begin + # Sit at EOF indefinitely. #advance would return $eof each time. + # This allows to feed the lexer more data if needed; this is only used + # in tests. + # + # Note that this action is not embedded into e_eof like e_heredoc_nl and e_bs + # below. This is due to the fact that scanner state at EOF is observed + # by tests, and encapsulating it in a rule would break the introspection. + p = p - 1; begin + p += 1 + _goto_level = _out + next + end + + end + end + when 301 then +# line 1731 "lib/parser/lexer.rl" + begin + @te = p +p = p - 1; begin p = @ts - 1; begin + @cs = 563 + _goto_level = _again + next + end + end + end + when 295 then +# line 1733 "lib/parser/lexer.rl" + begin + @te = p +p = p - 1; end + when 299 then +# line 1739 "lib/parser/lexer.rl" + begin + @te = p +p = p - 1; begin p = p - 1; begin + @cs = 563 + _goto_level = _again + next + end + end + end + when 294 then +# line 1 "NONE" + begin + case @act + when 93 then + begin begin p = (( @te))-1; end + emit_table(KEYWORDS) + @cs = 563; begin + p += 1 + _goto_level = _out + next + end + end + when 94 then + begin begin p = (( @te))-1; end + p = @ts - 1; begin + @cs = 563 + _goto_level = _again + next + end + end +end + end + when 57 then +# line 1754 "lib/parser/lexer.rl" + begin + @te = p+1 + begin + emit(:tUNARY_NUM, tok(@ts, @ts + 1), @ts, @ts + 1) + p = p - 1; @cs = 810; begin + p += 1 + _goto_level = _out + next + end + + end + end + when 334 then +# line 1771 "lib/parser/lexer.rl" + begin + @te = p+1 + begin + type = delimiter = tok[0].chr + p = p - 1; begin + @cs = (push_literal(type, delimiter, @ts)) + _goto_level = _again + next + end + + end + end + when 326 then +# line 1778 "lib/parser/lexer.rl" + begin + @te = p+1 + begin + type, delimiter = @source_buffer.slice(@ts).chr, tok[-1].chr + begin + @cs = (push_literal(type, delimiter, @ts)) + _goto_level = _again + next + end + + end + end + when 55 then +# line 1785 "lib/parser/lexer.rl" + begin + @te = p+1 + begin + type, delimiter = tok[0..-2], tok[-1].chr + begin + @cs = (push_literal(type, delimiter, @ts)) + _goto_level = _again + next + end + + end + end + when 347 then +# line 1860 "lib/parser/lexer.rl" + begin + @te = p+1 + begin + p = p - 1; p = p - 1; + emit(:tSYMBEG, tok(@ts, @ts + 1), @ts, @ts + 1) + begin + @cs = 352 + _goto_level = _again + next + end + + end + end + when 335 then +# line 1868 "lib/parser/lexer.rl" + begin + @te = p+1 + begin + type, delimiter = tok, tok[-1].chr + begin + @cs = (push_literal(type, delimiter, @ts)) + _goto_level = _again + next + end + + end + end + when 346 then +# line 1876 "lib/parser/lexer.rl" + begin + @te = p+1 + begin + emit(:tSYMBOL, tok(@ts + 1, @ts + 2)) + @cs = 810; begin + p += 1 + _goto_level = _out + next + end + + end + end + when 69 then +# line 1890 "lib/parser/lexer.rl" + begin + @te = p+1 + begin + emit(:tSYMBOL, tok(@ts + 1), @ts) + @cs = 810; begin + p += 1 + _goto_level = _out + next + end + + end + end + when 357 then +# line 1931 "lib/parser/lexer.rl" + begin + @te = p+1 + begin + escape = { " " => '\s', "\r" => '\r', "\n" => '\n', "\t" => '\t', + "\v" => '\v', "\f" => '\f' }[@source_buffer.slice(@ts + 1)] + diagnostic :warning, :invalid_escape_use, { :escape => escape }, range + + p = @ts - 1 + begin + @cs = 810 + _goto_level = _again + next + end + + end + end + when 356 then +# line 1941 "lib/parser/lexer.rl" + begin + @te = p+1 + begin + diagnostic :fatal, :incomplete_escape, nil, range(@ts, @ts + 1) + end + end + when 336 then +# line 2000 "lib/parser/lexer.rl" + begin + @te = p+1 + begin emit_table(PUNCTUATION_BEGIN) + begin + p += 1 + _goto_level = _out + next + end + end + end + when 52 then +# line 2021 "lib/parser/lexer.rl" + begin + @te = p+1 + begin + p = p - 1; + + if version?(18) + ident = tok(@ts, @te - 2) + + emit((@source_buffer.slice(@ts) =~ /[A-Z]/) ? :tCONSTANT : :tIDENTIFIER, + ident, @ts, @te - 2) + p = p - 1; # continue as a symbol + + if !@static_env.nil? && @static_env.declared?(ident) + @cs = 810; + else + @cs = (arg_or_cmdarg(cmd_state)); + end + else + emit(:tLABEL, tok(@ts, @te - 2), @ts, @te - 1) + @cs = 795; + end + + begin + p += 1 + _goto_level = _out + next + end + + end + end + when 49 then +# line 2114 "lib/parser/lexer.rl" + begin + @te = p+1 + begin + emit(:tIDENTIFIER, ident_tok, ident_ts, ident_te) + p = ident_te - 1 + + if !@static_env.nil? && @static_env.declared?(ident_tok) && @version < 25 + @cs = 465; + else + @cs = 525; + end + begin + p += 1 + _goto_level = _out + next + end + + end + end + when 320 then +# line 2133 "lib/parser/lexer.rl" + begin + @te = p+1 + begin + p = @ts - 1 + @cs_before_block_comment = @cs + begin + @cs = 186 + _goto_level = _again + next + end + + end + end + when 56 then +# line 2149 "lib/parser/lexer.rl" + begin + @te = p+1 + begin p = @ts - 1; begin + @cs = 810 + _goto_level = _again + next + end + end + end + when 304 then +# line 525 "lib/parser/lexer.rl" + begin + @te = p+1 + begin + # Sit at EOF indefinitely. #advance would return $eof each time. + # This allows to feed the lexer more data if needed; this is only used + # in tests. + # + # Note that this action is not embedded into e_eof like e_heredoc_nl and e_bs + # below. This is due to the fact that scanner state at EOF is observed + # by tests, and encapsulating it in a rule would break the introspection. + p = p - 1; begin + p += 1 + _goto_level = _out + next + end + + end + end + when 330 then +# line 1754 "lib/parser/lexer.rl" + begin + @te = p +p = p - 1; begin + emit(:tUNARY_NUM, tok(@ts, @ts + 1), @ts, @ts + 1) + p = p - 1; @cs = 810; begin + p += 1 + _goto_level = _out + next + end + + end + end + when 329 then +# line 1761 "lib/parser/lexer.rl" + begin + @te = p +p = p - 1; begin emit(:tSTAR, '*'.freeze) + begin + p += 1 + _goto_level = _out + next + end + end + end + when 325 then +# line 1791 "lib/parser/lexer.rl" + begin + @te = p +p = p - 1; begin + diagnostic :fatal, :string_eof, nil, range(@ts, @ts + 1) + end + end + when 354 then +# line 1851 "lib/parser/lexer.rl" + begin + @te = p +p = p - 1; begin + diagnostic :error, :unterminated_heredoc_id, nil, range(@ts, @ts + 1) + end + end + when 337 then +# line 1890 "lib/parser/lexer.rl" + begin + @te = p +p = p - 1; begin + emit(:tSYMBOL, tok(@ts + 1), @ts) + @cs = 810; begin + p += 1 + _goto_level = _out + next + end + + end + end + when 350 then +# line 1898 "lib/parser/lexer.rl" + begin + @te = p +p = p - 1; begin + if @version >= 27 + diagnostic :error, diag_msg, { name: tok(tm, @te) }, range(tm, @te) + else + emit(:tCOLON, tok(@ts, @ts + 1), @ts, @ts + 1) + p = @ts + end + + @cs = 810; begin + p += 1 + _goto_level = _out + next + end + + end + end + when 355 then +# line 1941 "lib/parser/lexer.rl" + begin + @te = p +p = p - 1; begin + diagnostic :fatal, :incomplete_escape, nil, range(@ts, @ts + 1) + end + end + when 361 then +# line 1947 "lib/parser/lexer.rl" + begin + @te = p +p = p - 1; begin + p = @ts - 1 + begin + @cs = 810 + _goto_level = _again + next + end + + end + end + when 327 then +# line 2000 "lib/parser/lexer.rl" + begin + @te = p +p = p - 1; begin emit_table(PUNCTUATION_BEGIN) + begin + p += 1 + _goto_level = _out + next + end + end + end + when 331 then +# line 2048 "lib/parser/lexer.rl" + begin + @te = p +p = p - 1; begin + if @version >= 27 + emit(:tBDOT2) + else + emit(:tDOT2) + end + + @cs = 563; begin + p += 1 + _goto_level = _out + next + end + + end + end + when 332 then +# line 2059 "lib/parser/lexer.rl" + begin + @te = p +p = p - 1; begin + # Here we scan and conditionally emit "\n": + # + if it's there + # + and emitted we do nothing + # + and not emitted we return `p` to "\n" to process it on the next scan + # + if it's not there we do nothing + followed_by_nl = @te - 1 == @newline_s + nl_emitted = false + dots_te = followed_by_nl ? @te - 1 : @te + + if @version >= 30 + if @lambda_stack.any? && @lambda_stack.last + 1 == @paren_nest + # To reject `->(...)` like `->...` + emit(:tDOT3, '...'.freeze, @ts, dots_te) + else + emit(:tBDOT3, '...'.freeze, @ts, dots_te) + + if @version >= 31 && followed_by_nl && @context.in_argdef + emit(:tNL, @te - 1, @te) + nl_emitted = true + end + end + elsif @version >= 27 + emit(:tBDOT3, '...'.freeze, @ts, dots_te) + else + emit(:tDOT3, '...'.freeze, @ts, dots_te) + end + + if followed_by_nl && !nl_emitted + # return "\n" to process it on the next scan + p = p - 1; + end + + @cs = 563; begin + p += 1 + _goto_level = _out + next + end + + end + end + when 307 then +# line 1324 "lib/parser/lexer.rl" + begin + @te = p +p = p - 1; begin + emit(:tIDENTIFIER) + + if !@static_env.nil? && @static_env.declared?(tok) + @cs = 465; begin + p += 1 + _goto_level = _out + next + end + + else + @cs = (arg_or_cmdarg(cmd_state)); begin + p += 1 + _goto_level = _out + next + end + + end + end + end + when 317 then +# line 2130 "lib/parser/lexer.rl" + begin + @te = p +p = p - 1; end + when 319 then +# line 2133 "lib/parser/lexer.rl" + begin + @te = p +p = p - 1; begin + p = @ts - 1 + @cs_before_block_comment = @cs + begin + @cs = 186 + _goto_level = _again + next + end + + end + end + when 322 then +# line 2149 "lib/parser/lexer.rl" + begin + @te = p +p = p - 1; begin p = @ts - 1; begin + @cs = 810 + _goto_level = _again + next + end + end + end + when 54 then +# line 1791 "lib/parser/lexer.rl" + begin + begin p = (( @te))-1; end + begin + diagnostic :fatal, :string_eof, nil, range(@ts, @ts + 1) + end + end + when 73 then +# line 1851 "lib/parser/lexer.rl" + begin + begin p = (( @te))-1; end + begin + diagnostic :error, :unterminated_heredoc_id, nil, range(@ts, @ts + 1) + end + end + when 74 then +# line 1918 "lib/parser/lexer.rl" + begin + begin p = (( @te))-1; end + begin + value = @escape || tok(@ts + 1) + + if version?(18) + emit(:tINTEGER, value.getbyte(0)) + else + emit(:tCHARACTER, value) + end + + @cs = 810; begin + p += 1 + _goto_level = _out + next + end + + end + end + when 48 then +# line 1324 "lib/parser/lexer.rl" + begin + begin p = (( @te))-1; end + begin + emit(:tIDENTIFIER) + + if !@static_env.nil? && @static_env.declared?(tok) + @cs = 465; begin + p += 1 + _goto_level = _out + next + end + + else + @cs = (arg_or_cmdarg(cmd_state)); begin + p += 1 + _goto_level = _out + next + end + + end + end + end + when 53 then +# line 2130 "lib/parser/lexer.rl" + begin + begin p = (( @te))-1; end + end + when 68 then +# line 2149 "lib/parser/lexer.rl" + begin + begin p = (( @te))-1; end + begin p = @ts - 1; begin + @cs = 810 + _goto_level = _again + next + end + end + end + when 51 then +# line 1 "NONE" + begin + case @act + when 99 then + begin begin p = (( @te))-1; end + + emit(:tUNARY_NUM, tok(@ts, @ts + 1), @ts, @ts + 1) + p = p - 1; @cs = 810; begin + p += 1 + _goto_level = _out + next + end + + end + when 106 then + begin begin p = (( @te))-1; end + + diagnostic :error, :unterminated_heredoc_id, nil, range(@ts, @ts + 1) + end + when 117 then + begin begin p = (( @te))-1; end + + if @version >= 27 + emit(:tPIPE, tok(@ts, @ts + 1), @ts, @ts + 1) + p = p - 1; + @cs = 563; begin + p += 1 + _goto_level = _out + next + end + + else + p -= 2 + begin + @cs = 810 + _goto_level = _again + next + end + + end + end + when 121 then + begin begin p = (( @te))-1; end + emit_table(PUNCTUATION_BEGIN) + begin + p += 1 + _goto_level = _out + next + end + end + when 122 then + begin begin p = (( @te))-1; end + emit(:kRESCUE, 'rescue'.freeze, @ts, tm) + p = tm - 1 + @cs = 539; begin + p += 1 + _goto_level = _out + next + end + end + when 123 then + begin begin p = (( @te))-1; end + emit_table(KEYWORDS_BEGIN) + @command_start = true + @cs = 802; begin + p += 1 + _goto_level = _out + next + end + end + when 127 then + begin begin p = (( @te))-1; end + p = @ts - 1 + begin + @cs = 810 + _goto_level = _again + next + end + end + when 128 then + begin begin p = (( @te))-1; end + + emit(:tIDENTIFIER) + + if !@static_env.nil? && @static_env.declared?(tok) + @cs = 465; begin + p += 1 + _goto_level = _out + next + end + + else + @cs = (arg_or_cmdarg(cmd_state)); begin + p += 1 + _goto_level = _out + next + end + + end + end + when 132 then + begin begin p = (( @te))-1; end + p = @ts - 1; begin + @cs = 810 + _goto_level = _again + next + end + end +end + end + when 395 then +# line 2169 "lib/parser/lexer.rl" + begin + @te = p+1 + begin p = p - 1; begin + @cs = 563 + _goto_level = _again + next + end + end + end + when 396 then +# line 525 "lib/parser/lexer.rl" + begin + @te = p+1 + begin + # Sit at EOF indefinitely. #advance would return $eof each time. + # This allows to feed the lexer more data if needed; this is only used + # in tests. + # + # Note that this action is not embedded into e_eof like e_heredoc_nl and e_bs + # below. This is due to the fact that scanner state at EOF is observed + # by tests, and encapsulating it in a rule would break the introspection. + p = p - 1; begin + p += 1 + _goto_level = _out + next + end + + end + end + when 397 then +# line 2157 "lib/parser/lexer.rl" + begin + @te = p +p = p - 1; end + when 401 then +# line 2169 "lib/parser/lexer.rl" + begin + @te = p +p = p - 1; begin p = p - 1; begin + @cs = 563 + _goto_level = _again + next + end + end + end + when 77 then +# line 2179 "lib/parser/lexer.rl" + begin + @te = p+1 + begin p = @ts - 1 + begin + @cs = 810 + _goto_level = _again + next + end + end + end + when 405 then +# line 2184 "lib/parser/lexer.rl" + begin + @te = p+1 + begin + begin + @cs = (push_literal(tok, tok, @ts)) + _goto_level = _again + next + end + + end + end + when 404 then +# line 2194 "lib/parser/lexer.rl" + begin + @te = p+1 + begin p = p - 1; begin + @cs = 563 + _goto_level = _again + next + end + end + end + when 403 then +# line 525 "lib/parser/lexer.rl" + begin + @te = p+1 + begin + # Sit at EOF indefinitely. #advance would return $eof each time. + # This allows to feed the lexer more data if needed; this is only used + # in tests. + # + # Note that this action is not embedded into e_eof like e_heredoc_nl and e_bs + # below. This is due to the fact that scanner state at EOF is observed + # by tests, and encapsulating it in a rule would break the introspection. + p = p - 1; begin + p += 1 + _goto_level = _out + next + end + + end + end + when 407 then +# line 2188 "lib/parser/lexer.rl" + begin + @te = p +p = p - 1; end + when 406 then +# line 2194 "lib/parser/lexer.rl" + begin + @te = p +p = p - 1; begin p = p - 1; begin + @cs = 563 + _goto_level = _again + next + end + end + end + when 76 then +# line 2194 "lib/parser/lexer.rl" + begin + begin p = (( @te))-1; end + begin p = p - 1; begin + @cs = 563 + _goto_level = _again + next + end + end + end + when 440 then +# line 2205 "lib/parser/lexer.rl" + begin + @te = p+1 + begin + emit(:tLAMBDA, '->'.freeze, @ts, @ts + 2) + + @lambda_stack.push @paren_nest + @cs = 465; begin + p += 1 + _goto_level = _out + next + end + + end + end + when 86 then +# line 2246 "lib/parser/lexer.rl" + begin + @te = p+1 + begin emit(:kCLASS, 'class'.freeze, @ts, @ts + 5) + emit(:tLSHFT, '<<'.freeze, @te - 2, @te) + @cs = 802; begin + p += 1 + _goto_level = _out + next + end + end + end + when 415 then +# line 2382 "lib/parser/lexer.rl" + begin + @te = p+1 + begin + type, delimiter = tok, tok[-1].chr + begin + @cs = (push_literal(type, delimiter, @ts, nil, false, false, true)) + _goto_level = _again + next + end + + end + end + when 79 then +# line 2400 "lib/parser/lexer.rl" + begin + @te = p+1 + begin p = @ts - 1; begin + @stack[ @top] = @cs + @top+= 1 + @cs = 347 + _goto_level = _again + next + end + end + end + when 436 then +# line 2407 "lib/parser/lexer.rl" + begin + @te = p+1 + begin emit_table(PUNCTUATION) + @cs = 473; begin + p += 1 + _goto_level = _out + next + end + end + end + when 489 then +# line 2431 "lib/parser/lexer.rl" + begin + @te = p+1 + begin + emit_table(PUNCTUATION) + @cs = 802; begin + p += 1 + _goto_level = _out + next + end + + end + end + when 429 then +# line 2440 "lib/parser/lexer.rl" + begin + @te = p+1 + begin + emit_table(PUNCTUATION); + @cs = 802; begin + p += 1 + _goto_level = _out + next + end + + end + end + when 434 then +# line 2475 "lib/parser/lexer.rl" + begin + @te = p+1 + begin emit(:tOP_ASGN, tok(@ts, @te - 1)) + @cs = 563; begin + p += 1 + _goto_level = _out + next + end + end + end + when 420 then +# line 2479 "lib/parser/lexer.rl" + begin + @te = p+1 + begin emit(:tEH, '?'.freeze) + @cs = 802; begin + p += 1 + _goto_level = _out + next + end + end + end + when 417 then +# line 2498 "lib/parser/lexer.rl" + begin + @te = p+1 + begin emit_table(PUNCTUATION) + @cs = 563; begin + p += 1 + _goto_level = _out + next + end + end + end + when 419 then +# line 2511 "lib/parser/lexer.rl" + begin + @te = p+1 + begin emit(:tSEMI, ';'.freeze) + @command_start = true + @cs = 802; begin + p += 1 + _goto_level = _out + next + end + end + end + when 494 then +# line 2515 "lib/parser/lexer.rl" + begin + @te = p+1 + begin + diagnostic :error, :bare_backslash, nil, range(@ts, @ts + 1) + p = p - 1; + end + end + when 414 then +# line 2521 "lib/parser/lexer.rl" + begin + @te = p+1 + begin + diagnostic :fatal, :unexpected, { :character => tok.inspect[1..-2] } + end + end + when 413 then +# line 525 "lib/parser/lexer.rl" + begin + @te = p+1 + begin + # Sit at EOF indefinitely. #advance would return $eof each time. + # This allows to feed the lexer more data if needed; this is only used + # in tests. + # + # Note that this action is not embedded into e_eof like e_heredoc_nl and e_bs + # below. This is due to the fact that scanner state at EOF is observed + # by tests, and encapsulating it in a rule would break the introspection. + p = p - 1; begin + p += 1 + _goto_level = _out + next + end + + end + end + when 505 then +# line 2242 "lib/parser/lexer.rl" + begin + @te = p +p = p - 1; begin emit_table(KEYWORDS) + @cs = 352; begin + p += 1 + _goto_level = _out + next + end + end + end + when 503 then +# line 2246 "lib/parser/lexer.rl" + begin + @te = p +p = p - 1; begin emit(:kCLASS, 'class'.freeze, @ts, @ts + 5) + emit(:tLSHFT, '<<'.freeze, @te - 2, @te) + @cs = 802; begin + p += 1 + _goto_level = _out + next + end + end + end + when 502 then +# line 2257 "lib/parser/lexer.rl" + begin + @te = p +p = p - 1; begin emit_table(KEYWORDS) + @command_start = true + @cs = 802; begin + p += 1 + _goto_level = _out + next + end + end + end + when 444 then +# line 2332 "lib/parser/lexer.rl" + begin + @te = p +p = p - 1; begin + diagnostic :error, :no_dot_digit_literal + end + end + when 491 then +# line 2392 "lib/parser/lexer.rl" + begin + @te = p +p = p - 1; begin emit(:tCONSTANT) + @cs = (arg_or_cmdarg(cmd_state)); begin + p += 1 + _goto_level = _out + next + end + end + end + when 433 then +# line 2400 "lib/parser/lexer.rl" + begin + @te = p +p = p - 1; begin p = @ts - 1; begin + @stack[ @top] = @cs + @top+= 1 + @cs = 347 + _goto_level = _again + next + end + end + end + when 441 then +# line 2407 "lib/parser/lexer.rl" + begin + @te = p +p = p - 1; begin emit_table(PUNCTUATION) + @cs = 473; begin + p += 1 + _goto_level = _out + next + end + end + end + when 497 then +# line 1324 "lib/parser/lexer.rl" + begin + @te = p +p = p - 1; begin + emit(:tIDENTIFIER) + + if !@static_env.nil? && @static_env.declared?(tok) + @cs = 465; begin + p += 1 + _goto_level = _out + next + end + + else + @cs = (arg_or_cmdarg(cmd_state)); begin + p += 1 + _goto_level = _out + next + end + + end + end + end + when 439 then +# line 2431 "lib/parser/lexer.rl" + begin + @te = p +p = p - 1; begin + emit_table(PUNCTUATION) + @cs = 802; begin + p += 1 + _goto_level = _out + next + end + + end + end + when 435 then +# line 2440 "lib/parser/lexer.rl" + begin + @te = p +p = p - 1; begin + emit_table(PUNCTUATION); + @cs = 802; begin + p += 1 + _goto_level = _out + next + end + + end + end + when 428 then +# line 2446 "lib/parser/lexer.rl" + begin + @te = p +p = p - 1; begin emit_table(PUNCTUATION) + @cs = 563; begin + p += 1 + _goto_level = _out + next + end + end + end + when 442 then +# line 2498 "lib/parser/lexer.rl" + begin + @te = p +p = p - 1; begin emit_table(PUNCTUATION) + @cs = 563; begin + p += 1 + _goto_level = _out + next + end + end + end + when 426 then +# line 2505 "lib/parser/lexer.rl" + begin + @te = p +p = p - 1; end + when 432 then +# line 2521 "lib/parser/lexer.rl" + begin + @te = p +p = p - 1; begin + diagnostic :fatal, :unexpected, { :character => tok.inspect[1..-2] } + end + end + when 84 then +# line 2305 "lib/parser/lexer.rl" + begin + begin p = (( @te))-1; end + begin + digits = tok(@num_digits_s, @num_suffix_s) + + if digits.end_with? '_'.freeze + diagnostic :error, :trailing_in_number, { :character => '_'.freeze }, + range(@te - 1, @te) + elsif digits.empty? && @num_base == 8 && version?(18) + # 1.8 did not raise an error on 0o. + digits = '0'.freeze + elsif digits.empty? + diagnostic :error, :empty_numeric + elsif @num_base == 8 && (invalid_idx = digits.index(/[89]/)) + invalid_s = @num_digits_s + invalid_idx + diagnostic :error, :invalid_octal, nil, + range(invalid_s, invalid_s + 1) + end + + if version?(18, 19, 20) + emit(:tINTEGER, digits.to_i(@num_base), @ts, @num_suffix_s) + p = @num_suffix_s - 1 + else + @num_xfrm.call(digits.to_i(@num_base)) + end + begin + p += 1 + _goto_level = _out + next + end + + end + end + when 80 then +# line 2332 "lib/parser/lexer.rl" + begin + begin p = (( @te))-1; end + begin + diagnostic :error, :no_dot_digit_literal + end + end + when 83 then +# line 2364 "lib/parser/lexer.rl" + begin + begin p = (( @te))-1; end + begin + digits = tok(@ts, @num_suffix_s) + + if version?(18, 19, 20) + emit(:tFLOAT, Float(digits), @ts, @num_suffix_s) + p = @num_suffix_s - 1 + else + @num_xfrm.call(digits) + end + begin + p += 1 + _goto_level = _out + next + end + + end + end + when 78 then +# line 2521 "lib/parser/lexer.rl" + begin + begin p = (( @te))-1; end + begin + diagnostic :fatal, :unexpected, { :character => tok.inspect[1..-2] } + end + end + when 81 then +# line 1 "NONE" + begin + case @act + when 145 then + begin begin p = (( @te))-1; end + + if @lambda_stack.last == @paren_nest + @lambda_stack.pop + + if tok == '{'.freeze + emit(:tLAMBEG, '{'.freeze) + else # 'do' + emit(:kDO_LAMBDA, 'do'.freeze) + end + else + if tok == '{'.freeze + emit(:tLCURLY, '{'.freeze) + else # 'do' + emit_do + end + end + if tok == '{'.freeze + @paren_nest += 1 + end + @command_start = true + + @cs = 802; begin + p += 1 + _goto_level = _out + next + end + + end + when 146 then + begin begin p = (( @te))-1; end + emit_table(KEYWORDS) + @cs = 352; begin + p += 1 + _goto_level = _out + next + end + end + when 147 then + begin begin p = (( @te))-1; end + emit(:kCLASS, 'class'.freeze, @ts, @ts + 5) + emit(:tLSHFT, '<<'.freeze, @te - 2, @te) + @cs = 802; begin + p += 1 + _goto_level = _out + next + end + end + when 148 then + begin begin p = (( @te))-1; end + emit_table(KEYWORDS) + @cs = 563; begin + p += 1 + _goto_level = _out + next + end + end + when 149 then + begin begin p = (( @te))-1; end + emit_table(KEYWORDS) + @command_start = true + @cs = 802; begin + p += 1 + _goto_level = _out + next + end + end + when 150 then + begin begin p = (( @te))-1; end + emit_table(KEYWORDS) + @cs = 539; begin + p += 1 + _goto_level = _out + next + end + end + when 151 then + begin begin p = (( @te))-1; end + + emit_table(KEYWORDS) + + if version?(18) && tok == 'not'.freeze + @cs = 563; begin + p += 1 + _goto_level = _out + next + end + + else + @cs = 494; begin + p += 1 + _goto_level = _out + next + end + + end + end + when 152 then + begin begin p = (( @te))-1; end + + if version?(18) + emit(:tIDENTIFIER) + + unless !@static_env.nil? && @static_env.declared?(tok) + @cs = (arg_or_cmdarg(cmd_state)); + end + else + emit(:k__ENCODING__, '__ENCODING__'.freeze) + end + begin + p += 1 + _goto_level = _out + next + end + + end + when 153 then + begin begin p = (( @te))-1; end + emit_table(KEYWORDS) + begin + p += 1 + _goto_level = _out + next + end + end + when 154 then + begin begin p = (( @te))-1; end + + digits = tok(@num_digits_s, @num_suffix_s) + + if digits.end_with? '_'.freeze + diagnostic :error, :trailing_in_number, { :character => '_'.freeze }, + range(@te - 1, @te) + elsif digits.empty? && @num_base == 8 && version?(18) + # 1.8 did not raise an error on 0o. + digits = '0'.freeze + elsif digits.empty? + diagnostic :error, :empty_numeric + elsif @num_base == 8 && (invalid_idx = digits.index(/[89]/)) + invalid_s = @num_digits_s + invalid_idx + diagnostic :error, :invalid_octal, nil, + range(invalid_s, invalid_s + 1) + end + + if version?(18, 19, 20) + emit(:tINTEGER, digits.to_i(@num_base), @ts, @num_suffix_s) + p = @num_suffix_s - 1 + else + @num_xfrm.call(digits.to_i(@num_base)) + end + begin + p += 1 + _goto_level = _out + next + end + + end + when 156 then + begin begin p = (( @te))-1; end + + if version?(18, 19, 20) + diagnostic :error, + :trailing_in_number, { :character => tok(@te - 1, @te) }, + range(@te - 1, @te) + else + emit(:tINTEGER, tok(@ts, @te - 1).to_i, @ts, @te - 1) + p = p - 1; begin + p += 1 + _goto_level = _out + next + end + + end + end + when 157 then + begin begin p = (( @te))-1; end + + if version?(18, 19, 20) + diagnostic :error, + :trailing_in_number, { :character => tok(@te - 1, @te) }, + range(@te - 1, @te) + else + emit(:tFLOAT, tok(@ts, @te - 1).to_f, @ts, @te - 1) + p = p - 1; begin + p += 1 + _goto_level = _out + next + end + + end + end + when 158 then + begin begin p = (( @te))-1; end + + digits = tok(@ts, @num_suffix_s) + + if version?(18, 19, 20) + emit(:tFLOAT, Float(digits), @ts, @num_suffix_s) + p = @num_suffix_s - 1 + else + @num_xfrm.call(digits) + end + begin + p += 1 + _goto_level = _out + next + end + + end + when 160 then + begin begin p = (( @te))-1; end + emit(:tCONSTANT) + @cs = (arg_or_cmdarg(cmd_state)); begin + p += 1 + _goto_level = _out + next + end + end + when 164 then + begin begin p = (( @te))-1; end + + emit(:tIDENTIFIER) + + if !@static_env.nil? && @static_env.declared?(tok) + @cs = 465; begin + p += 1 + _goto_level = _out + next + end + + else + @cs = (arg_or_cmdarg(cmd_state)); begin + p += 1 + _goto_level = _out + next + end + + end + end + when 165 then + begin begin p = (( @te))-1; end + + if tm == @te + # Suffix was consumed, e.g. foo! + emit(:tFID) + else + # Suffix was not consumed, e.g. foo!= + emit(:tIDENTIFIER, tok(@ts, tm), @ts, tm) + p = tm - 1 + end + @cs = 494; begin + p += 1 + _goto_level = _out + next + end + + end + when 167 then + begin begin p = (( @te))-1; end + + emit_table(PUNCTUATION); + @cs = 802; begin + p += 1 + _goto_level = _out + next + end + + end + when 168 then + begin begin p = (( @te))-1; end + emit_table(PUNCTUATION) + @cs = 563; begin + p += 1 + _goto_level = _out + next + end + end +end + end + when 516 then +# line 2562 "lib/parser/lexer.rl" + begin + @te = p+1 + begin + emit(:tNL, nil, @newline_s, @newline_s + 1) + if @version < 27 + p = p - 1; @cs = 186; begin + p += 1 + _goto_level = _out + next + end + + else + emit(:tBDOT3) + @cs = 563; begin + p += 1 + _goto_level = _out + next + end + + end + end + end + when 95 then +# line 2573 "lib/parser/lexer.rl" + begin + @te = p+1 + begin p = tm - 1; begin + @cs = 810 + _goto_level = _again + next + end + end + end + when 510 then +# line 2576 "lib/parser/lexer.rl" + begin + @te = p+1 + begin emit(:tNL, nil, @newline_s, @newline_s + 1) + p = p - 1; @cs = 186; begin + p += 1 + _goto_level = _out + next + end + end + end + when 513 then +# line 2537 "lib/parser/lexer.rl" + begin + @te = p +p = p - 1; begin + if @version < 27 + # Ruby before 2.7 doesn't support comments before leading dot. + # If a line after "a" starts with a comment then "a" is a self-contained statement. + # So in that case we emit a special tNL token and start reading the + # next line as a separate statement. + # + # Note: block comments before leading dot are not supported on any version of Ruby. + emit(:tNL, nil, @newline_s, @newline_s + 1) + p = p - 1; @cs = 186; begin + p += 1 + _goto_level = _out + next + end + + end + end + end + when 515 then +# line 2551 "lib/parser/lexer.rl" + begin + @te = p +p = p - 1; begin + emit(:tNL, nil, @newline_s, @newline_s + 1) + if @version < 27 + p = p - 1; @cs = 186; begin + p += 1 + _goto_level = _out + next + end + + else + emit(:tBDOT2) + @cs = 563; begin + p += 1 + _goto_level = _out + next + end + + end + end + end + when 514 then +# line 2573 "lib/parser/lexer.rl" + begin + @te = p +p = p - 1; begin p = tm - 1; begin + @cs = 810 + _goto_level = _again + next + end + end + end + when 512 then +# line 2576 "lib/parser/lexer.rl" + begin + @te = p +p = p - 1; begin emit(:tNL, nil, @newline_s, @newline_s + 1) + p = p - 1; @cs = 186; begin + p += 1 + _goto_level = _out + next + end + end + end + when 90 then +# line 2537 "lib/parser/lexer.rl" + begin + begin p = (( @te))-1; end + begin + if @version < 27 + # Ruby before 2.7 doesn't support comments before leading dot. + # If a line after "a" starts with a comment then "a" is a self-contained statement. + # So in that case we emit a special tNL token and start reading the + # next line as a separate statement. + # + # Note: block comments before leading dot are not supported on any version of Ruby. + emit(:tNL, nil, @newline_s, @newline_s + 1) + p = p - 1; @cs = 186; begin + p += 1 + _goto_level = _out + next + end + + end + end + end + when 87 then +# line 2576 "lib/parser/lexer.rl" + begin + begin p = (( @te))-1; end + begin emit(:tNL, nil, @newline_s, @newline_s + 1) + p = p - 1; @cs = 186; begin + p += 1 + _goto_level = _out + next + end + end + end + when 91 then +# line 1 "NONE" + begin + case @act + when 181 then + begin begin p = (( @te))-1; end + + if @version < 27 + # Ruby before 2.7 doesn't support comments before leading dot. + # If a line after "a" starts with a comment then "a" is a self-contained statement. + # So in that case we emit a special tNL token and start reading the + # next line as a separate statement. + # + # Note: block comments before leading dot are not supported on any version of Ruby. + emit(:tNL, nil, @newline_s, @newline_s + 1) + p = p - 1; @cs = 186; begin + p += 1 + _goto_level = _out + next + end + + end + end + when 185 then + begin begin p = (( @te))-1; end + emit(:tNL, nil, @newline_s, @newline_s + 1) + p = p - 1; @cs = 186; begin + p += 1 + _goto_level = _out + next + end + end +end + end + when 519 then +# line 2586 "lib/parser/lexer.rl" + begin + @te = p +p = p - 1; begin + emit_comment(@eq_begin_s, @te) + begin + @cs = (@cs_before_block_comment) + _goto_level = _again + next + end + + end + end + when 518 then +# line 2594 "lib/parser/lexer.rl" + begin + @te = p +p = p - 1; begin + diagnostic :fatal, :embedded_document, nil, + range(@eq_begin_s, @eq_begin_s + '=begin'.length) + end + end + when 106 then +# line 2604 "lib/parser/lexer.rl" + begin + @te = p+1 + begin @eq_begin_s = @ts + begin + @cs = 998 + _goto_level = _again + next + end + end + end + when 2 then +# line 2608 "lib/parser/lexer.rl" + begin + @te = p+1 + begin p = pe - 3 end + end + when 98 then +# line 2611 "lib/parser/lexer.rl" + begin + @te = p+1 + begin cmd_state = true; p = p - 1; begin + @cs = 802 + _goto_level = _again + next + end + end + end + when 99 then +# line 525 "lib/parser/lexer.rl" + begin + @te = p+1 + begin + # Sit at EOF indefinitely. #advance would return $eof each time. + # This allows to feed the lexer more data if needed; this is only used + # in tests. + # + # Note that this action is not embedded into e_eof like e_heredoc_nl and e_bs + # below. This is due to the fact that scanner state at EOF is observed + # by tests, and encapsulating it in a rule would break the introspection. + p = p - 1; begin + p += 1 + _goto_level = _out + next + end + + end + end + when 100 then +# line 2601 "lib/parser/lexer.rl" + begin + @te = p +p = p - 1; end + when 105 then +# line 2604 "lib/parser/lexer.rl" + begin + @te = p +p = p - 1; begin @eq_begin_s = @ts + begin + @cs = 998 + _goto_level = _again + next + end + end + end + when 104 then +# line 2611 "lib/parser/lexer.rl" + begin + @te = p +p = p - 1; begin cmd_state = true; p = p - 1; begin + @cs = 802 + _goto_level = _again + next + end + end + end + when 1 then +# line 2611 "lib/parser/lexer.rl" + begin + begin p = (( @te))-1; end + begin cmd_state = true; p = p - 1; begin + @cs = 802 + _goto_level = _again + next + end + end + end + when 67 then +# line 498 "lib/parser/lexer.rl" + begin + + # Record position of a newline for precise location reporting on tNL + # tokens. + # + # This action is embedded directly into c_nl, as it is idempotent and + # there are no cases when we need to skip it. + @newline_s = p + end +# line 1229 "lib/parser/lexer.rl" + begin + emit_comment(@sharp_s, p == pe ? p - 2 : p) end + when 110 then +# line 498 "lib/parser/lexer.rl" + begin + + # Record position of a newline for precise location reporting on tNL + # tokens. + # + # This action is embedded directly into c_nl, as it is idempotent and + # there are no cases when we need to skip it. + @newline_s = p + end +# line 954 "lib/parser/lexer.rl" + begin + @te = p+1 + begin + current_literal = literal + if @te == pe + diagnostic :fatal, :string_eof, nil, + range(current_literal.str_s, current_literal.str_s + 1) + end + + if current_literal.heredoc? + line = tok(@herebody_s, @ts).gsub(/\r+$/, ''.freeze) + + if version?(18, 19, 20) + # See ruby:c48b4209c + line = line.gsub(/\r.*$/, ''.freeze) + end + + # Try ending the heredoc with the complete most recently + # scanned line. @herebody_s always refers to the start of such line. + if current_literal.nest_and_try_closing(line, @herebody_s, @ts) + # Adjust @herebody_s to point to the next line. + @herebody_s = @te + + # Continue regular lexing after the heredoc reference (< '\s', "\r" => '\r', "\n" => '\n', "\t" => '\t', + "\v" => '\v', "\f" => '\f' }[@source_buffer.slice(@ts + 1)] + diagnostic :warning, :invalid_escape_use, { :escape => escape }, range + + p = @ts - 1 + begin + @cs = 810 + _goto_level = _again + next + end + + end + end + when 333 then +# line 498 "lib/parser/lexer.rl" + begin + + # Record position of a newline for precise location reporting on tNL + # tokens. + # + # This action is embedded directly into c_nl, as it is idempotent and + # there are no cases when we need to skip it. + @newline_s = p + end +# line 2059 "lib/parser/lexer.rl" + begin + @te = p+1 + begin + # Here we scan and conditionally emit "\n": + # + if it's there + # + and emitted we do nothing + # + and not emitted we return `p` to "\n" to process it on the next scan + # + if it's not there we do nothing + followed_by_nl = @te - 1 == @newline_s + nl_emitted = false + dots_te = followed_by_nl ? @te - 1 : @te + + if @version >= 30 + if @lambda_stack.any? && @lambda_stack.last + 1 == @paren_nest + # To reject `->(...)` like `->...` + emit(:tDOT3, '...'.freeze, @ts, dots_te) + else + emit(:tBDOT3, '...'.freeze, @ts, dots_te) + + if @version >= 31 && followed_by_nl && @context.in_argdef + emit(:tNL, @te - 1, @te) + nl_emitted = true + end + end + elsif @version >= 27 + emit(:tBDOT3, '...'.freeze, @ts, dots_te) + else + emit(:tDOT3, '...'.freeze, @ts, dots_te) + end + + if followed_by_nl && !nl_emitted + # return "\n" to process it on the next scan + p = p - 1; + end + + @cs = 563; begin + p += 1 + _goto_level = _out + next + end + + end + end + when 321 then +# line 498 "lib/parser/lexer.rl" + begin + + # Record position of a newline for precise location reporting on tNL + # tokens. + # + # This action is embedded directly into c_nl, as it is idempotent and + # there are no cases when we need to skip it. + @newline_s = p + end +# line 2133 "lib/parser/lexer.rl" + begin + @te = p+1 + begin + p = @ts - 1 + @cs_before_block_comment = @cs + begin + @cs = 186 + _goto_level = _again + next + end + + end + end + when 443 then +# line 498 "lib/parser/lexer.rl" + begin + + # Record position of a newline for precise location reporting on tNL + # tokens. + # + # This action is embedded directly into c_nl, as it is idempotent and + # there are no cases when we need to skip it. + @newline_s = p + end +# line 2487 "lib/parser/lexer.rl" + begin + @te = p+1 + begin + if @paren_nest == 0 + diagnostic :warning, :triple_dot_at_eol, nil, range(@ts, @te - 1) + end + + emit(:tDOT3, '...'.freeze, @ts, @te - 1) + p = p - 1; + @cs = 563; begin + p += 1 + _goto_level = _out + next + end + + end + end + when 520 then +# line 498 "lib/parser/lexer.rl" + begin + + # Record position of a newline for precise location reporting on tNL + # tokens. + # + # This action is embedded directly into c_nl, as it is idempotent and + # there are no cases when we need to skip it. + @newline_s = p + end +# line 2586 "lib/parser/lexer.rl" + begin + @te = p+1 + begin + emit_comment(@eq_begin_s, @te) + begin + @cs = (@cs_before_block_comment) + _goto_level = _again + next + end + + end + end + when 517 then +# line 498 "lib/parser/lexer.rl" + begin + + # Record position of a newline for precise location reporting on tNL + # tokens. + # + # This action is embedded directly into c_nl, as it is idempotent and + # there are no cases when we need to skip it. + @newline_s = p + end +# line 2591 "lib/parser/lexer.rl" + begin + @te = p+1 + end + when 107 then +# line 498 "lib/parser/lexer.rl" + begin + + # Record position of a newline for precise location reporting on tNL + # tokens. + # + # This action is embedded directly into c_nl, as it is idempotent and + # there are no cases when we need to skip it. + @newline_s = p + end +# line 2604 "lib/parser/lexer.rl" + begin + @te = p+1 + begin @eq_begin_s = @ts + begin + @cs = 998 + _goto_level = _again + next + end + end + end + when 3 then +# line 498 "lib/parser/lexer.rl" + begin + + # Record position of a newline for precise location reporting on tNL + # tokens. + # + # This action is embedded directly into c_nl, as it is idempotent and + # there are no cases when we need to skip it. + @newline_s = p + end +# line 2608 "lib/parser/lexer.rl" + begin + @te = p+1 + begin p = pe - 3 end + end + when 465 then +# line 633 "lib/parser/lexer.rl" + begin + @num_xfrm = lambda { |chars| emit(:tRATIONAL, Rational(chars)) } end +# line 2305 "lib/parser/lexer.rl" + begin + @te = p +p = p - 1; begin + digits = tok(@num_digits_s, @num_suffix_s) + + if digits.end_with? '_'.freeze + diagnostic :error, :trailing_in_number, { :character => '_'.freeze }, + range(@te - 1, @te) + elsif digits.empty? && @num_base == 8 && version?(18) + # 1.8 did not raise an error on 0o. + digits = '0'.freeze + elsif digits.empty? + diagnostic :error, :empty_numeric + elsif @num_base == 8 && (invalid_idx = digits.index(/[89]/)) + invalid_s = @num_digits_s + invalid_idx + diagnostic :error, :invalid_octal, nil, + range(invalid_s, invalid_s + 1) + end + + if version?(18, 19, 20) + emit(:tINTEGER, digits.to_i(@num_base), @ts, @num_suffix_s) + p = @num_suffix_s - 1 + else + @num_xfrm.call(digits.to_i(@num_base)) + end + begin + p += 1 + _goto_level = _out + next + end + + end + end + when 463 then +# line 634 "lib/parser/lexer.rl" + begin + @num_xfrm = lambda { |chars| emit(:tIMAGINARY, Complex(0, chars)) } end +# line 2305 "lib/parser/lexer.rl" + begin + @te = p +p = p - 1; begin + digits = tok(@num_digits_s, @num_suffix_s) + + if digits.end_with? '_'.freeze + diagnostic :error, :trailing_in_number, { :character => '_'.freeze }, + range(@te - 1, @te) + elsif digits.empty? && @num_base == 8 && version?(18) + # 1.8 did not raise an error on 0o. + digits = '0'.freeze + elsif digits.empty? + diagnostic :error, :empty_numeric + elsif @num_base == 8 && (invalid_idx = digits.index(/[89]/)) + invalid_s = @num_digits_s + invalid_idx + diagnostic :error, :invalid_octal, nil, + range(invalid_s, invalid_s + 1) + end + + if version?(18, 19, 20) + emit(:tINTEGER, digits.to_i(@num_base), @ts, @num_suffix_s) + p = @num_suffix_s - 1 + else + @num_xfrm.call(digits.to_i(@num_base)) + end + begin + p += 1 + _goto_level = _out + next + end + + end + end + when 468 then +# line 635 "lib/parser/lexer.rl" + begin + @num_xfrm = lambda { |chars| emit(:tIMAGINARY, Complex(0, Rational(chars))) } end +# line 2305 "lib/parser/lexer.rl" + begin + @te = p +p = p - 1; begin + digits = tok(@num_digits_s, @num_suffix_s) + + if digits.end_with? '_'.freeze + diagnostic :error, :trailing_in_number, { :character => '_'.freeze }, + range(@te - 1, @te) + elsif digits.empty? && @num_base == 8 && version?(18) + # 1.8 did not raise an error on 0o. + digits = '0'.freeze + elsif digits.empty? + diagnostic :error, :empty_numeric + elsif @num_base == 8 && (invalid_idx = digits.index(/[89]/)) + invalid_s = @num_digits_s + invalid_idx + diagnostic :error, :invalid_octal, nil, + range(invalid_s, invalid_s + 1) + end + + if version?(18, 19, 20) + emit(:tINTEGER, digits.to_i(@num_base), @ts, @num_suffix_s) + p = @num_suffix_s - 1 + else + @num_xfrm.call(digits.to_i(@num_base)) + end + begin + p += 1 + _goto_level = _out + next + end + + end + end + when 466 then +# line 636 "lib/parser/lexer.rl" + begin + @num_xfrm = lambda { |chars| emit(:tINTEGER, chars, @ts, @te - 2); p -= 2 } end +# line 2305 "lib/parser/lexer.rl" + begin + @te = p +p = p - 1; begin + digits = tok(@num_digits_s, @num_suffix_s) + + if digits.end_with? '_'.freeze + diagnostic :error, :trailing_in_number, { :character => '_'.freeze }, + range(@te - 1, @te) + elsif digits.empty? && @num_base == 8 && version?(18) + # 1.8 did not raise an error on 0o. + digits = '0'.freeze + elsif digits.empty? + diagnostic :error, :empty_numeric + elsif @num_base == 8 && (invalid_idx = digits.index(/[89]/)) + invalid_s = @num_digits_s + invalid_idx + diagnostic :error, :invalid_octal, nil, + range(invalid_s, invalid_s + 1) + end + + if version?(18, 19, 20) + emit(:tINTEGER, digits.to_i(@num_base), @ts, @num_suffix_s) + p = @num_suffix_s - 1 + else + @num_xfrm.call(digits.to_i(@num_base)) + end + begin + p += 1 + _goto_level = _out + next + end + + end + end + when 464 then +# line 637 "lib/parser/lexer.rl" + begin + @num_xfrm = lambda { |chars| emit(:tINTEGER, chars, @ts, @te - 2); p -= 2 } end +# line 2305 "lib/parser/lexer.rl" + begin + @te = p +p = p - 1; begin + digits = tok(@num_digits_s, @num_suffix_s) + + if digits.end_with? '_'.freeze + diagnostic :error, :trailing_in_number, { :character => '_'.freeze }, + range(@te - 1, @te) + elsif digits.empty? && @num_base == 8 && version?(18) + # 1.8 did not raise an error on 0o. + digits = '0'.freeze + elsif digits.empty? + diagnostic :error, :empty_numeric + elsif @num_base == 8 && (invalid_idx = digits.index(/[89]/)) + invalid_s = @num_digits_s + invalid_idx + diagnostic :error, :invalid_octal, nil, + range(invalid_s, invalid_s + 1) + end + + if version?(18, 19, 20) + emit(:tINTEGER, digits.to_i(@num_base), @ts, @num_suffix_s) + p = @num_suffix_s - 1 + else + @num_xfrm.call(digits.to_i(@num_base)) + end + begin + p += 1 + _goto_level = _out + next + end + + end + end + when 467 then +# line 638 "lib/parser/lexer.rl" + begin + @num_xfrm = lambda { |chars| emit(:tINTEGER, chars, @ts, @te - 6); p -= 6 } end +# line 2305 "lib/parser/lexer.rl" + begin + @te = p +p = p - 1; begin + digits = tok(@num_digits_s, @num_suffix_s) + + if digits.end_with? '_'.freeze + diagnostic :error, :trailing_in_number, { :character => '_'.freeze }, + range(@te - 1, @te) + elsif digits.empty? && @num_base == 8 && version?(18) + # 1.8 did not raise an error on 0o. + digits = '0'.freeze + elsif digits.empty? + diagnostic :error, :empty_numeric + elsif @num_base == 8 && (invalid_idx = digits.index(/[89]/)) + invalid_s = @num_digits_s + invalid_idx + diagnostic :error, :invalid_octal, nil, + range(invalid_s, invalid_s + 1) + end + + if version?(18, 19, 20) + emit(:tINTEGER, digits.to_i(@num_base), @ts, @num_suffix_s) + p = @num_suffix_s - 1 + else + @num_xfrm.call(digits.to_i(@num_base)) + end + begin + p += 1 + _goto_level = _out + next + end + + end + end + when 456 then +# line 642 "lib/parser/lexer.rl" + begin + @num_xfrm = lambda { |chars| emit(:tIMAGINARY, Complex(0, Float(chars))) } end +# line 2364 "lib/parser/lexer.rl" + begin + @te = p +p = p - 1; begin + digits = tok(@ts, @num_suffix_s) + + if version?(18, 19, 20) + emit(:tFLOAT, Float(digits), @ts, @num_suffix_s) + p = @num_suffix_s - 1 + else + @num_xfrm.call(digits) + end + begin + p += 1 + _goto_level = _out + next + end + + end + end + when 457 then +# line 643 "lib/parser/lexer.rl" + begin + @num_xfrm = lambda { |chars| emit(:tFLOAT, Float(chars), @ts, @te - 2); p -= 2 } end +# line 2364 "lib/parser/lexer.rl" + begin + @te = p +p = p - 1; begin + digits = tok(@ts, @num_suffix_s) + + if version?(18, 19, 20) + emit(:tFLOAT, Float(digits), @ts, @num_suffix_s) + p = @num_suffix_s - 1 + else + @num_xfrm.call(digits) + end + begin + p += 1 + _goto_level = _out + next + end + + end + end + when 458 then +# line 647 "lib/parser/lexer.rl" + begin + @num_xfrm = lambda { |chars| emit(:tRATIONAL, Rational(chars)) } end +# line 2364 "lib/parser/lexer.rl" + begin + @te = p +p = p - 1; begin + digits = tok(@ts, @num_suffix_s) + + if version?(18, 19, 20) + emit(:tFLOAT, Float(digits), @ts, @num_suffix_s) + p = @num_suffix_s - 1 + else + @num_xfrm.call(digits) + end + begin + p += 1 + _goto_level = _out + next + end + + end + end + when 460 then +# line 648 "lib/parser/lexer.rl" + begin + @num_xfrm = lambda { |chars| emit(:tIMAGINARY, Complex(0, Rational(chars))) } end +# line 2364 "lib/parser/lexer.rl" + begin + @te = p +p = p - 1; begin + digits = tok(@ts, @num_suffix_s) + + if version?(18, 19, 20) + emit(:tFLOAT, Float(digits), @ts, @num_suffix_s) + p = @num_suffix_s - 1 + else + @num_xfrm.call(digits) + end + begin + p += 1 + _goto_level = _out + next + end + + end + end + when 459 then +# line 649 "lib/parser/lexer.rl" + begin + @num_xfrm = lambda { |chars| emit(:tFLOAT, Float(chars), @ts, @te - 6); p -= 6 } end +# line 2364 "lib/parser/lexer.rl" + begin + @te = p +p = p - 1; begin + digits = tok(@ts, @num_suffix_s) + + if version?(18, 19, 20) + emit(:tFLOAT, Float(digits), @ts, @num_suffix_s) + p = @num_suffix_s - 1 + else + @num_xfrm.call(digits) + end + begin + p += 1 + _goto_level = _out + next + end + + end + end + when 137 then +# line 664 "lib/parser/lexer.rl" + begin + + @escape = "" + + codepoints = tok(@escape_s + 2, p - 1) + codepoint_s = @escape_s + 2 + + if @version < 24 + if codepoints.start_with?(" ") || codepoints.start_with?("\t") + diagnostic :fatal, :invalid_unicode_escape, nil, + range(@escape_s + 2, @escape_s + 3) + end + + if spaces_p = codepoints.index(/[ \t]{2}/) + diagnostic :fatal, :invalid_unicode_escape, nil, + range(codepoint_s + spaces_p + 1, codepoint_s + spaces_p + 2) + end + + if codepoints.end_with?(" ") || codepoints.end_with?("\t") + diagnostic :fatal, :invalid_unicode_escape, nil, range(p - 1, p) + end + end + + codepoints.scan(/([0-9a-fA-F]+)|([ \t]+)/).each do |(codepoint_str, spaces)| + if spaces + codepoint_s += spaces.length + else + codepoint = codepoint_str.to_i(16) + + if codepoint >= 0x110000 + diagnostic :error, :unicode_point_too_large, nil, + range(codepoint_s, codepoint_s + codepoint_str.length) + break + end + + @escape += codepoint.chr(Encoding::UTF_8) + codepoint_s += codepoint_str.length + end + end + end +# line 895 "lib/parser/lexer.rl" + begin + @te = p +p = p - 1; begin + current_literal = literal + # Get the first character after the backslash. + escaped_char = @source_buffer.slice(@escape_s).chr + + if current_literal.munge_escape? escaped_char + # If this particular literal uses this character as an opening + # or closing delimiter, it is an escape sequence for that + # particular character. Write it without the backslash. + + if current_literal.regexp? && REGEXP_META_CHARACTERS.match(escaped_char) + # Regular expressions should include escaped delimiters in their + # escaped form, except when the escaped character is + # a closing delimiter but not a regexp metacharacter. + # + # The backslash itself cannot be used as a closing delimiter + # at the same time as an escape symbol, but it is always munged, + # so this branch also executes for the non-closing-delimiter case + # for the backslash. + current_literal.extend_string(tok, @ts, @te) + else + current_literal.extend_string(escaped_char, @ts, @te) + end + else + # It does not. So this is an actual escape sequence, yay! + if current_literal.squiggly_heredoc? && escaped_char == "\n".freeze + # Squiggly heredocs like + # <<~-HERE + # 1\ + # 2 + # HERE + # treat '\' as a line continuation, but still dedent the body, so the heredoc above becomes "12\n". + # This information is emitted as is, without escaping, + # later this escape sequence (\\\n) gets handled manually in the Lexer::Dedenter + current_literal.extend_string(tok, @ts, @te) + elsif current_literal.supports_line_continuation_via_slash? && escaped_char == "\n".freeze + # Heredocs, regexp and a few other types of literals support line + # continuation via \\\n sequence. The code like + # "a\ + # b" + # must be parsed as "ab" + current_literal.extend_string(tok.gsub("\\\n".freeze, ''.freeze), @ts, @te) + elsif current_literal.regexp? && @version >= 31 && %w[c C m M].include?(escaped_char) + # Ruby >= 3.1 escapes \c- and \m chars, that's the only escape sequence + # supported by regexes so far, so it needs a separate branch. + current_literal.extend_string(@escape, @ts, @te) + elsif current_literal.regexp? + # Regular expressions should include escape sequences in their + # escaped form. On the other hand, escaped newlines are removed (in cases like "\\C-\\\n\\M-x") + current_literal.extend_string(tok.gsub("\\\n".freeze, ''.freeze), @ts, @te) + else + current_literal.extend_string(@escape || tok, @ts, @te) + end + end + end + end + when 168 then +# line 664 "lib/parser/lexer.rl" + begin + + @escape = "" + + codepoints = tok(@escape_s + 2, p - 1) + codepoint_s = @escape_s + 2 + + if @version < 24 + if codepoints.start_with?(" ") || codepoints.start_with?("\t") + diagnostic :fatal, :invalid_unicode_escape, nil, + range(@escape_s + 2, @escape_s + 3) + end + + if spaces_p = codepoints.index(/[ \t]{2}/) + diagnostic :fatal, :invalid_unicode_escape, nil, + range(codepoint_s + spaces_p + 1, codepoint_s + spaces_p + 2) + end + + if codepoints.end_with?(" ") || codepoints.end_with?("\t") + diagnostic :fatal, :invalid_unicode_escape, nil, range(p - 1, p) + end + end + + codepoints.scan(/([0-9a-fA-F]+)|([ \t]+)/).each do |(codepoint_str, spaces)| + if spaces + codepoint_s += spaces.length + else + codepoint = codepoint_str.to_i(16) + + if codepoint >= 0x110000 + diagnostic :error, :unicode_point_too_large, nil, + range(codepoint_s, codepoint_s + codepoint_str.length) + break + end + + @escape += codepoint.chr(Encoding::UTF_8) + codepoint_s += codepoint_str.length + end + end + end +# line 895 "lib/parser/lexer.rl" + begin + @te = p +p = p - 1; begin + current_literal = literal + # Get the first character after the backslash. + escaped_char = @source_buffer.slice(@escape_s).chr + + if current_literal.munge_escape? escaped_char + # If this particular literal uses this character as an opening + # or closing delimiter, it is an escape sequence for that + # particular character. Write it without the backslash. + + if current_literal.regexp? && REGEXP_META_CHARACTERS.match(escaped_char) + # Regular expressions should include escaped delimiters in their + # escaped form, except when the escaped character is + # a closing delimiter but not a regexp metacharacter. + # + # The backslash itself cannot be used as a closing delimiter + # at the same time as an escape symbol, but it is always munged, + # so this branch also executes for the non-closing-delimiter case + # for the backslash. + current_literal.extend_string(tok, @ts, @te) + else + current_literal.extend_string(escaped_char, @ts, @te) + end + else + # It does not. So this is an actual escape sequence, yay! + if current_literal.squiggly_heredoc? && escaped_char == "\n".freeze + # Squiggly heredocs like + # <<~-HERE + # 1\ + # 2 + # HERE + # treat '\' as a line continuation, but still dedent the body, so the heredoc above becomes "12\n". + # This information is emitted as is, without escaping, + # later this escape sequence (\\\n) gets handled manually in the Lexer::Dedenter + current_literal.extend_string(tok, @ts, @te) + elsif current_literal.supports_line_continuation_via_slash? && escaped_char == "\n".freeze + # Heredocs, regexp and a few other types of literals support line + # continuation via \\\n sequence. The code like + # "a\ + # b" + # must be parsed as "ab" + current_literal.extend_string(tok.gsub("\\\n".freeze, ''.freeze), @ts, @te) + elsif current_literal.regexp? && @version >= 31 && %w[c C m M].include?(escaped_char) + # Ruby >= 3.1 escapes \c- and \m chars, that's the only escape sequence + # supported by regexes so far, so it needs a separate branch. + current_literal.extend_string(@escape, @ts, @te) + elsif current_literal.regexp? + # Regular expressions should include escape sequences in their + # escaped form. On the other hand, escaped newlines are removed (in cases like "\\C-\\\n\\M-x") + current_literal.extend_string(tok.gsub("\\\n".freeze, ''.freeze), @ts, @te) + else + current_literal.extend_string(@escape || tok, @ts, @te) + end + end + end + end + when 382 then +# line 664 "lib/parser/lexer.rl" + begin + + @escape = "" + + codepoints = tok(@escape_s + 2, p - 1) + codepoint_s = @escape_s + 2 + + if @version < 24 + if codepoints.start_with?(" ") || codepoints.start_with?("\t") + diagnostic :fatal, :invalid_unicode_escape, nil, + range(@escape_s + 2, @escape_s + 3) + end + + if spaces_p = codepoints.index(/[ \t]{2}/) + diagnostic :fatal, :invalid_unicode_escape, nil, + range(codepoint_s + spaces_p + 1, codepoint_s + spaces_p + 2) + end + + if codepoints.end_with?(" ") || codepoints.end_with?("\t") + diagnostic :fatal, :invalid_unicode_escape, nil, range(p - 1, p) + end + end + + codepoints.scan(/([0-9a-fA-F]+)|([ \t]+)/).each do |(codepoint_str, spaces)| + if spaces + codepoint_s += spaces.length + else + codepoint = codepoint_str.to_i(16) + + if codepoint >= 0x110000 + diagnostic :error, :unicode_point_too_large, nil, + range(codepoint_s, codepoint_s + codepoint_str.length) + break + end + + @escape += codepoint.chr(Encoding::UTF_8) + codepoint_s += codepoint_str.length + end + end + end +# line 1918 "lib/parser/lexer.rl" + begin + @te = p +p = p - 1; begin + value = @escape || tok(@ts + 1) + + if version?(18) + emit(:tINTEGER, value.getbyte(0)) + else + emit(:tCHARACTER, value) + end + + @cs = 810; begin + p += 1 + _goto_level = _out + next + end + + end + end + when 118 then +# line 704 "lib/parser/lexer.rl" + begin + + codepoint = @source_pts[p - 1] + + if @version >= 30 && (codepoint == 117 || codepoint == 85) # 'u' or 'U' + diagnostic :fatal, :invalid_escape + end + + if (@escape = ESCAPES[codepoint]).nil? + @escape = encode_escape(@source_buffer.slice(p - 1)) + end + end +# line 895 "lib/parser/lexer.rl" + begin + @te = p +p = p - 1; begin + current_literal = literal + # Get the first character after the backslash. + escaped_char = @source_buffer.slice(@escape_s).chr + + if current_literal.munge_escape? escaped_char + # If this particular literal uses this character as an opening + # or closing delimiter, it is an escape sequence for that + # particular character. Write it without the backslash. + + if current_literal.regexp? && REGEXP_META_CHARACTERS.match(escaped_char) + # Regular expressions should include escaped delimiters in their + # escaped form, except when the escaped character is + # a closing delimiter but not a regexp metacharacter. + # + # The backslash itself cannot be used as a closing delimiter + # at the same time as an escape symbol, but it is always munged, + # so this branch also executes for the non-closing-delimiter case + # for the backslash. + current_literal.extend_string(tok, @ts, @te) + else + current_literal.extend_string(escaped_char, @ts, @te) + end + else + # It does not. So this is an actual escape sequence, yay! + if current_literal.squiggly_heredoc? && escaped_char == "\n".freeze + # Squiggly heredocs like + # <<~-HERE + # 1\ + # 2 + # HERE + # treat '\' as a line continuation, but still dedent the body, so the heredoc above becomes "12\n". + # This information is emitted as is, without escaping, + # later this escape sequence (\\\n) gets handled manually in the Lexer::Dedenter + current_literal.extend_string(tok, @ts, @te) + elsif current_literal.supports_line_continuation_via_slash? && escaped_char == "\n".freeze + # Heredocs, regexp and a few other types of literals support line + # continuation via \\\n sequence. The code like + # "a\ + # b" + # must be parsed as "ab" + current_literal.extend_string(tok.gsub("\\\n".freeze, ''.freeze), @ts, @te) + elsif current_literal.regexp? && @version >= 31 && %w[c C m M].include?(escaped_char) + # Ruby >= 3.1 escapes \c- and \m chars, that's the only escape sequence + # supported by regexes so far, so it needs a separate branch. + current_literal.extend_string(@escape, @ts, @te) + elsif current_literal.regexp? + # Regular expressions should include escape sequences in their + # escaped form. On the other hand, escaped newlines are removed (in cases like "\\C-\\\n\\M-x") + current_literal.extend_string(tok.gsub("\\\n".freeze, ''.freeze), @ts, @te) + else + current_literal.extend_string(@escape || tok, @ts, @te) + end + end + end + end + when 149 then +# line 704 "lib/parser/lexer.rl" + begin + + codepoint = @source_pts[p - 1] + + if @version >= 30 && (codepoint == 117 || codepoint == 85) # 'u' or 'U' + diagnostic :fatal, :invalid_escape + end + + if (@escape = ESCAPES[codepoint]).nil? + @escape = encode_escape(@source_buffer.slice(p - 1)) + end + end +# line 895 "lib/parser/lexer.rl" + begin + @te = p +p = p - 1; begin + current_literal = literal + # Get the first character after the backslash. + escaped_char = @source_buffer.slice(@escape_s).chr + + if current_literal.munge_escape? escaped_char + # If this particular literal uses this character as an opening + # or closing delimiter, it is an escape sequence for that + # particular character. Write it without the backslash. + + if current_literal.regexp? && REGEXP_META_CHARACTERS.match(escaped_char) + # Regular expressions should include escaped delimiters in their + # escaped form, except when the escaped character is + # a closing delimiter but not a regexp metacharacter. + # + # The backslash itself cannot be used as a closing delimiter + # at the same time as an escape symbol, but it is always munged, + # so this branch also executes for the non-closing-delimiter case + # for the backslash. + current_literal.extend_string(tok, @ts, @te) + else + current_literal.extend_string(escaped_char, @ts, @te) + end + else + # It does not. So this is an actual escape sequence, yay! + if current_literal.squiggly_heredoc? && escaped_char == "\n".freeze + # Squiggly heredocs like + # <<~-HERE + # 1\ + # 2 + # HERE + # treat '\' as a line continuation, but still dedent the body, so the heredoc above becomes "12\n". + # This information is emitted as is, without escaping, + # later this escape sequence (\\\n) gets handled manually in the Lexer::Dedenter + current_literal.extend_string(tok, @ts, @te) + elsif current_literal.supports_line_continuation_via_slash? && escaped_char == "\n".freeze + # Heredocs, regexp and a few other types of literals support line + # continuation via \\\n sequence. The code like + # "a\ + # b" + # must be parsed as "ab" + current_literal.extend_string(tok.gsub("\\\n".freeze, ''.freeze), @ts, @te) + elsif current_literal.regexp? && @version >= 31 && %w[c C m M].include?(escaped_char) + # Ruby >= 3.1 escapes \c- and \m chars, that's the only escape sequence + # supported by regexes so far, so it needs a separate branch. + current_literal.extend_string(@escape, @ts, @te) + elsif current_literal.regexp? + # Regular expressions should include escape sequences in their + # escaped form. On the other hand, escaped newlines are removed (in cases like "\\C-\\\n\\M-x") + current_literal.extend_string(tok.gsub("\\\n".freeze, ''.freeze), @ts, @te) + else + current_literal.extend_string(@escape || tok, @ts, @te) + end + end + end + end + when 363 then +# line 704 "lib/parser/lexer.rl" + begin + + codepoint = @source_pts[p - 1] + + if @version >= 30 && (codepoint == 117 || codepoint == 85) # 'u' or 'U' + diagnostic :fatal, :invalid_escape + end + + if (@escape = ESCAPES[codepoint]).nil? + @escape = encode_escape(@source_buffer.slice(p - 1)) + end + end +# line 1918 "lib/parser/lexer.rl" + begin + @te = p +p = p - 1; begin + value = @escape || tok(@ts + 1) + + if version?(18) + emit(:tINTEGER, value.getbyte(0)) + else + emit(:tCHARACTER, value) + end + + @cs = 810; begin + p += 1 + _goto_level = _out + next + end + + end + end + when 121 then +# line 716 "lib/parser/lexer.rl" + begin + + diagnostic :fatal, :invalid_escape + end +# line 895 "lib/parser/lexer.rl" + begin + @te = p +p = p - 1; begin + current_literal = literal + # Get the first character after the backslash. + escaped_char = @source_buffer.slice(@escape_s).chr + + if current_literal.munge_escape? escaped_char + # If this particular literal uses this character as an opening + # or closing delimiter, it is an escape sequence for that + # particular character. Write it without the backslash. + + if current_literal.regexp? && REGEXP_META_CHARACTERS.match(escaped_char) + # Regular expressions should include escaped delimiters in their + # escaped form, except when the escaped character is + # a closing delimiter but not a regexp metacharacter. + # + # The backslash itself cannot be used as a closing delimiter + # at the same time as an escape symbol, but it is always munged, + # so this branch also executes for the non-closing-delimiter case + # for the backslash. + current_literal.extend_string(tok, @ts, @te) + else + current_literal.extend_string(escaped_char, @ts, @te) + end + else + # It does not. So this is an actual escape sequence, yay! + if current_literal.squiggly_heredoc? && escaped_char == "\n".freeze + # Squiggly heredocs like + # <<~-HERE + # 1\ + # 2 + # HERE + # treat '\' as a line continuation, but still dedent the body, so the heredoc above becomes "12\n". + # This information is emitted as is, without escaping, + # later this escape sequence (\\\n) gets handled manually in the Lexer::Dedenter + current_literal.extend_string(tok, @ts, @te) + elsif current_literal.supports_line_continuation_via_slash? && escaped_char == "\n".freeze + # Heredocs, regexp and a few other types of literals support line + # continuation via \\\n sequence. The code like + # "a\ + # b" + # must be parsed as "ab" + current_literal.extend_string(tok.gsub("\\\n".freeze, ''.freeze), @ts, @te) + elsif current_literal.regexp? && @version >= 31 && %w[c C m M].include?(escaped_char) + # Ruby >= 3.1 escapes \c- and \m chars, that's the only escape sequence + # supported by regexes so far, so it needs a separate branch. + current_literal.extend_string(@escape, @ts, @te) + elsif current_literal.regexp? + # Regular expressions should include escape sequences in their + # escaped form. On the other hand, escaped newlines are removed (in cases like "\\C-\\\n\\M-x") + current_literal.extend_string(tok.gsub("\\\n".freeze, ''.freeze), @ts, @te) + else + current_literal.extend_string(@escape || tok, @ts, @te) + end + end + end + end + when 152 then +# line 716 "lib/parser/lexer.rl" + begin + + diagnostic :fatal, :invalid_escape + end +# line 895 "lib/parser/lexer.rl" + begin + @te = p +p = p - 1; begin + current_literal = literal + # Get the first character after the backslash. + escaped_char = @source_buffer.slice(@escape_s).chr + + if current_literal.munge_escape? escaped_char + # If this particular literal uses this character as an opening + # or closing delimiter, it is an escape sequence for that + # particular character. Write it without the backslash. + + if current_literal.regexp? && REGEXP_META_CHARACTERS.match(escaped_char) + # Regular expressions should include escaped delimiters in their + # escaped form, except when the escaped character is + # a closing delimiter but not a regexp metacharacter. + # + # The backslash itself cannot be used as a closing delimiter + # at the same time as an escape symbol, but it is always munged, + # so this branch also executes for the non-closing-delimiter case + # for the backslash. + current_literal.extend_string(tok, @ts, @te) + else + current_literal.extend_string(escaped_char, @ts, @te) + end + else + # It does not. So this is an actual escape sequence, yay! + if current_literal.squiggly_heredoc? && escaped_char == "\n".freeze + # Squiggly heredocs like + # <<~-HERE + # 1\ + # 2 + # HERE + # treat '\' as a line continuation, but still dedent the body, so the heredoc above becomes "12\n". + # This information is emitted as is, without escaping, + # later this escape sequence (\\\n) gets handled manually in the Lexer::Dedenter + current_literal.extend_string(tok, @ts, @te) + elsif current_literal.supports_line_continuation_via_slash? && escaped_char == "\n".freeze + # Heredocs, regexp and a few other types of literals support line + # continuation via \\\n sequence. The code like + # "a\ + # b" + # must be parsed as "ab" + current_literal.extend_string(tok.gsub("\\\n".freeze, ''.freeze), @ts, @te) + elsif current_literal.regexp? && @version >= 31 && %w[c C m M].include?(escaped_char) + # Ruby >= 3.1 escapes \c- and \m chars, that's the only escape sequence + # supported by regexes so far, so it needs a separate branch. + current_literal.extend_string(@escape, @ts, @te) + elsif current_literal.regexp? + # Regular expressions should include escape sequences in their + # escaped form. On the other hand, escaped newlines are removed (in cases like "\\C-\\\n\\M-x") + current_literal.extend_string(tok.gsub("\\\n".freeze, ''.freeze), @ts, @te) + else + current_literal.extend_string(@escape || tok, @ts, @te) + end + end + end + end + when 366 then +# line 716 "lib/parser/lexer.rl" + begin + + diagnostic :fatal, :invalid_escape + end +# line 1918 "lib/parser/lexer.rl" + begin + @te = p +p = p - 1; begin + value = @escape || tok(@ts + 1) + + if version?(18) + emit(:tINTEGER, value.getbyte(0)) + else + emit(:tCHARACTER, value) + end + + @cs = 810; begin + p += 1 + _goto_level = _out + next + end + + end + end + when 123 then +# line 744 "lib/parser/lexer.rl" + begin + @escape = "\x7f" end +# line 895 "lib/parser/lexer.rl" + begin + @te = p +p = p - 1; begin + current_literal = literal + # Get the first character after the backslash. + escaped_char = @source_buffer.slice(@escape_s).chr + + if current_literal.munge_escape? escaped_char + # If this particular literal uses this character as an opening + # or closing delimiter, it is an escape sequence for that + # particular character. Write it without the backslash. + + if current_literal.regexp? && REGEXP_META_CHARACTERS.match(escaped_char) + # Regular expressions should include escaped delimiters in their + # escaped form, except when the escaped character is + # a closing delimiter but not a regexp metacharacter. + # + # The backslash itself cannot be used as a closing delimiter + # at the same time as an escape symbol, but it is always munged, + # so this branch also executes for the non-closing-delimiter case + # for the backslash. + current_literal.extend_string(tok, @ts, @te) + else + current_literal.extend_string(escaped_char, @ts, @te) + end + else + # It does not. So this is an actual escape sequence, yay! + if current_literal.squiggly_heredoc? && escaped_char == "\n".freeze + # Squiggly heredocs like + # <<~-HERE + # 1\ + # 2 + # HERE + # treat '\' as a line continuation, but still dedent the body, so the heredoc above becomes "12\n". + # This information is emitted as is, without escaping, + # later this escape sequence (\\\n) gets handled manually in the Lexer::Dedenter + current_literal.extend_string(tok, @ts, @te) + elsif current_literal.supports_line_continuation_via_slash? && escaped_char == "\n".freeze + # Heredocs, regexp and a few other types of literals support line + # continuation via \\\n sequence. The code like + # "a\ + # b" + # must be parsed as "ab" + current_literal.extend_string(tok.gsub("\\\n".freeze, ''.freeze), @ts, @te) + elsif current_literal.regexp? && @version >= 31 && %w[c C m M].include?(escaped_char) + # Ruby >= 3.1 escapes \c- and \m chars, that's the only escape sequence + # supported by regexes so far, so it needs a separate branch. + current_literal.extend_string(@escape, @ts, @te) + elsif current_literal.regexp? + # Regular expressions should include escape sequences in their + # escaped form. On the other hand, escaped newlines are removed (in cases like "\\C-\\\n\\M-x") + current_literal.extend_string(tok.gsub("\\\n".freeze, ''.freeze), @ts, @te) + else + current_literal.extend_string(@escape || tok, @ts, @te) + end + end + end + end + when 154 then +# line 744 "lib/parser/lexer.rl" + begin + @escape = "\x7f" end +# line 895 "lib/parser/lexer.rl" + begin + @te = p +p = p - 1; begin + current_literal = literal + # Get the first character after the backslash. + escaped_char = @source_buffer.slice(@escape_s).chr + + if current_literal.munge_escape? escaped_char + # If this particular literal uses this character as an opening + # or closing delimiter, it is an escape sequence for that + # particular character. Write it without the backslash. + + if current_literal.regexp? && REGEXP_META_CHARACTERS.match(escaped_char) + # Regular expressions should include escaped delimiters in their + # escaped form, except when the escaped character is + # a closing delimiter but not a regexp metacharacter. + # + # The backslash itself cannot be used as a closing delimiter + # at the same time as an escape symbol, but it is always munged, + # so this branch also executes for the non-closing-delimiter case + # for the backslash. + current_literal.extend_string(tok, @ts, @te) + else + current_literal.extend_string(escaped_char, @ts, @te) + end + else + # It does not. So this is an actual escape sequence, yay! + if current_literal.squiggly_heredoc? && escaped_char == "\n".freeze + # Squiggly heredocs like + # <<~-HERE + # 1\ + # 2 + # HERE + # treat '\' as a line continuation, but still dedent the body, so the heredoc above becomes "12\n". + # This information is emitted as is, without escaping, + # later this escape sequence (\\\n) gets handled manually in the Lexer::Dedenter + current_literal.extend_string(tok, @ts, @te) + elsif current_literal.supports_line_continuation_via_slash? && escaped_char == "\n".freeze + # Heredocs, regexp and a few other types of literals support line + # continuation via \\\n sequence. The code like + # "a\ + # b" + # must be parsed as "ab" + current_literal.extend_string(tok.gsub("\\\n".freeze, ''.freeze), @ts, @te) + elsif current_literal.regexp? && @version >= 31 && %w[c C m M].include?(escaped_char) + # Ruby >= 3.1 escapes \c- and \m chars, that's the only escape sequence + # supported by regexes so far, so it needs a separate branch. + current_literal.extend_string(@escape, @ts, @te) + elsif current_literal.regexp? + # Regular expressions should include escape sequences in their + # escaped form. On the other hand, escaped newlines are removed (in cases like "\\C-\\\n\\M-x") + current_literal.extend_string(tok.gsub("\\\n".freeze, ''.freeze), @ts, @te) + else + current_literal.extend_string(@escape || tok, @ts, @te) + end + end + end + end + when 368 then +# line 744 "lib/parser/lexer.rl" + begin + @escape = "\x7f" end +# line 1918 "lib/parser/lexer.rl" + begin + @te = p +p = p - 1; begin + value = @escape || tok(@ts + 1) + + if version?(18) + emit(:tINTEGER, value.getbyte(0)) + else + emit(:tCHARACTER, value) + end + + @cs = 810; begin + p += 1 + _goto_level = _out + next + end + + end + end + when 120 then +# line 752 "lib/parser/lexer.rl" + begin + @escape = encode_escape(tok(@escape_s, p).to_i(8) % 0x100) end +# line 895 "lib/parser/lexer.rl" + begin + @te = p +p = p - 1; begin + current_literal = literal + # Get the first character after the backslash. + escaped_char = @source_buffer.slice(@escape_s).chr + + if current_literal.munge_escape? escaped_char + # If this particular literal uses this character as an opening + # or closing delimiter, it is an escape sequence for that + # particular character. Write it without the backslash. + + if current_literal.regexp? && REGEXP_META_CHARACTERS.match(escaped_char) + # Regular expressions should include escaped delimiters in their + # escaped form, except when the escaped character is + # a closing delimiter but not a regexp metacharacter. + # + # The backslash itself cannot be used as a closing delimiter + # at the same time as an escape symbol, but it is always munged, + # so this branch also executes for the non-closing-delimiter case + # for the backslash. + current_literal.extend_string(tok, @ts, @te) + else + current_literal.extend_string(escaped_char, @ts, @te) + end + else + # It does not. So this is an actual escape sequence, yay! + if current_literal.squiggly_heredoc? && escaped_char == "\n".freeze + # Squiggly heredocs like + # <<~-HERE + # 1\ + # 2 + # HERE + # treat '\' as a line continuation, but still dedent the body, so the heredoc above becomes "12\n". + # This information is emitted as is, without escaping, + # later this escape sequence (\\\n) gets handled manually in the Lexer::Dedenter + current_literal.extend_string(tok, @ts, @te) + elsif current_literal.supports_line_continuation_via_slash? && escaped_char == "\n".freeze + # Heredocs, regexp and a few other types of literals support line + # continuation via \\\n sequence. The code like + # "a\ + # b" + # must be parsed as "ab" + current_literal.extend_string(tok.gsub("\\\n".freeze, ''.freeze), @ts, @te) + elsif current_literal.regexp? && @version >= 31 && %w[c C m M].include?(escaped_char) + # Ruby >= 3.1 escapes \c- and \m chars, that's the only escape sequence + # supported by regexes so far, so it needs a separate branch. + current_literal.extend_string(@escape, @ts, @te) + elsif current_literal.regexp? + # Regular expressions should include escape sequences in their + # escaped form. On the other hand, escaped newlines are removed (in cases like "\\C-\\\n\\M-x") + current_literal.extend_string(tok.gsub("\\\n".freeze, ''.freeze), @ts, @te) + else + current_literal.extend_string(@escape || tok, @ts, @te) + end + end + end + end + when 151 then +# line 752 "lib/parser/lexer.rl" + begin + @escape = encode_escape(tok(@escape_s, p).to_i(8) % 0x100) end +# line 895 "lib/parser/lexer.rl" + begin + @te = p +p = p - 1; begin + current_literal = literal + # Get the first character after the backslash. + escaped_char = @source_buffer.slice(@escape_s).chr + + if current_literal.munge_escape? escaped_char + # If this particular literal uses this character as an opening + # or closing delimiter, it is an escape sequence for that + # particular character. Write it without the backslash. + + if current_literal.regexp? && REGEXP_META_CHARACTERS.match(escaped_char) + # Regular expressions should include escaped delimiters in their + # escaped form, except when the escaped character is + # a closing delimiter but not a regexp metacharacter. + # + # The backslash itself cannot be used as a closing delimiter + # at the same time as an escape symbol, but it is always munged, + # so this branch also executes for the non-closing-delimiter case + # for the backslash. + current_literal.extend_string(tok, @ts, @te) + else + current_literal.extend_string(escaped_char, @ts, @te) + end + else + # It does not. So this is an actual escape sequence, yay! + if current_literal.squiggly_heredoc? && escaped_char == "\n".freeze + # Squiggly heredocs like + # <<~-HERE + # 1\ + # 2 + # HERE + # treat '\' as a line continuation, but still dedent the body, so the heredoc above becomes "12\n". + # This information is emitted as is, without escaping, + # later this escape sequence (\\\n) gets handled manually in the Lexer::Dedenter + current_literal.extend_string(tok, @ts, @te) + elsif current_literal.supports_line_continuation_via_slash? && escaped_char == "\n".freeze + # Heredocs, regexp and a few other types of literals support line + # continuation via \\\n sequence. The code like + # "a\ + # b" + # must be parsed as "ab" + current_literal.extend_string(tok.gsub("\\\n".freeze, ''.freeze), @ts, @te) + elsif current_literal.regexp? && @version >= 31 && %w[c C m M].include?(escaped_char) + # Ruby >= 3.1 escapes \c- and \m chars, that's the only escape sequence + # supported by regexes so far, so it needs a separate branch. + current_literal.extend_string(@escape, @ts, @te) + elsif current_literal.regexp? + # Regular expressions should include escape sequences in their + # escaped form. On the other hand, escaped newlines are removed (in cases like "\\C-\\\n\\M-x") + current_literal.extend_string(tok.gsub("\\\n".freeze, ''.freeze), @ts, @te) + else + current_literal.extend_string(@escape || tok, @ts, @te) + end + end + end + end + when 365 then +# line 752 "lib/parser/lexer.rl" + begin + @escape = encode_escape(tok(@escape_s, p).to_i(8) % 0x100) end +# line 1918 "lib/parser/lexer.rl" + begin + @te = p +p = p - 1; begin + value = @escape || tok(@ts + 1) + + if version?(18) + emit(:tINTEGER, value.getbyte(0)) + else + emit(:tCHARACTER, value) + end + + @cs = 810; begin + p += 1 + _goto_level = _out + next + end + + end + end + when 140 then +# line 756 "lib/parser/lexer.rl" + begin + @escape = encode_escape(tok(@escape_s + 1, p).to_i(16)) end +# line 895 "lib/parser/lexer.rl" + begin + @te = p +p = p - 1; begin + current_literal = literal + # Get the first character after the backslash. + escaped_char = @source_buffer.slice(@escape_s).chr + + if current_literal.munge_escape? escaped_char + # If this particular literal uses this character as an opening + # or closing delimiter, it is an escape sequence for that + # particular character. Write it without the backslash. + + if current_literal.regexp? && REGEXP_META_CHARACTERS.match(escaped_char) + # Regular expressions should include escaped delimiters in their + # escaped form, except when the escaped character is + # a closing delimiter but not a regexp metacharacter. + # + # The backslash itself cannot be used as a closing delimiter + # at the same time as an escape symbol, but it is always munged, + # so this branch also executes for the non-closing-delimiter case + # for the backslash. + current_literal.extend_string(tok, @ts, @te) + else + current_literal.extend_string(escaped_char, @ts, @te) + end + else + # It does not. So this is an actual escape sequence, yay! + if current_literal.squiggly_heredoc? && escaped_char == "\n".freeze + # Squiggly heredocs like + # <<~-HERE + # 1\ + # 2 + # HERE + # treat '\' as a line continuation, but still dedent the body, so the heredoc above becomes "12\n". + # This information is emitted as is, without escaping, + # later this escape sequence (\\\n) gets handled manually in the Lexer::Dedenter + current_literal.extend_string(tok, @ts, @te) + elsif current_literal.supports_line_continuation_via_slash? && escaped_char == "\n".freeze + # Heredocs, regexp and a few other types of literals support line + # continuation via \\\n sequence. The code like + # "a\ + # b" + # must be parsed as "ab" + current_literal.extend_string(tok.gsub("\\\n".freeze, ''.freeze), @ts, @te) + elsif current_literal.regexp? && @version >= 31 && %w[c C m M].include?(escaped_char) + # Ruby >= 3.1 escapes \c- and \m chars, that's the only escape sequence + # supported by regexes so far, so it needs a separate branch. + current_literal.extend_string(@escape, @ts, @te) + elsif current_literal.regexp? + # Regular expressions should include escape sequences in their + # escaped form. On the other hand, escaped newlines are removed (in cases like "\\C-\\\n\\M-x") + current_literal.extend_string(tok.gsub("\\\n".freeze, ''.freeze), @ts, @te) + else + current_literal.extend_string(@escape || tok, @ts, @te) + end + end + end + end + when 171 then +# line 756 "lib/parser/lexer.rl" + begin + @escape = encode_escape(tok(@escape_s + 1, p).to_i(16)) end +# line 895 "lib/parser/lexer.rl" + begin + @te = p +p = p - 1; begin + current_literal = literal + # Get the first character after the backslash. + escaped_char = @source_buffer.slice(@escape_s).chr + + if current_literal.munge_escape? escaped_char + # If this particular literal uses this character as an opening + # or closing delimiter, it is an escape sequence for that + # particular character. Write it without the backslash. + + if current_literal.regexp? && REGEXP_META_CHARACTERS.match(escaped_char) + # Regular expressions should include escaped delimiters in their + # escaped form, except when the escaped character is + # a closing delimiter but not a regexp metacharacter. + # + # The backslash itself cannot be used as a closing delimiter + # at the same time as an escape symbol, but it is always munged, + # so this branch also executes for the non-closing-delimiter case + # for the backslash. + current_literal.extend_string(tok, @ts, @te) + else + current_literal.extend_string(escaped_char, @ts, @te) + end + else + # It does not. So this is an actual escape sequence, yay! + if current_literal.squiggly_heredoc? && escaped_char == "\n".freeze + # Squiggly heredocs like + # <<~-HERE + # 1\ + # 2 + # HERE + # treat '\' as a line continuation, but still dedent the body, so the heredoc above becomes "12\n". + # This information is emitted as is, without escaping, + # later this escape sequence (\\\n) gets handled manually in the Lexer::Dedenter + current_literal.extend_string(tok, @ts, @te) + elsif current_literal.supports_line_continuation_via_slash? && escaped_char == "\n".freeze + # Heredocs, regexp and a few other types of literals support line + # continuation via \\\n sequence. The code like + # "a\ + # b" + # must be parsed as "ab" + current_literal.extend_string(tok.gsub("\\\n".freeze, ''.freeze), @ts, @te) + elsif current_literal.regexp? && @version >= 31 && %w[c C m M].include?(escaped_char) + # Ruby >= 3.1 escapes \c- and \m chars, that's the only escape sequence + # supported by regexes so far, so it needs a separate branch. + current_literal.extend_string(@escape, @ts, @te) + elsif current_literal.regexp? + # Regular expressions should include escape sequences in their + # escaped form. On the other hand, escaped newlines are removed (in cases like "\\C-\\\n\\M-x") + current_literal.extend_string(tok.gsub("\\\n".freeze, ''.freeze), @ts, @te) + else + current_literal.extend_string(@escape || tok, @ts, @te) + end + end + end + end + when 385 then +# line 756 "lib/parser/lexer.rl" + begin + @escape = encode_escape(tok(@escape_s + 1, p).to_i(16)) end +# line 1918 "lib/parser/lexer.rl" + begin + @te = p +p = p - 1; begin + value = @escape || tok(@ts + 1) + + if version?(18) + emit(:tINTEGER, value.getbyte(0)) + else + emit(:tCHARACTER, value) + end + + @cs = 810; begin + p += 1 + _goto_level = _out + next + end + + end + end + when 139 then +# line 760 "lib/parser/lexer.rl" + begin + + diagnostic :fatal, :invalid_hex_escape, nil, range(@escape_s - 1, p + 2) + end +# line 895 "lib/parser/lexer.rl" + begin + @te = p +p = p - 1; begin + current_literal = literal + # Get the first character after the backslash. + escaped_char = @source_buffer.slice(@escape_s).chr + + if current_literal.munge_escape? escaped_char + # If this particular literal uses this character as an opening + # or closing delimiter, it is an escape sequence for that + # particular character. Write it without the backslash. + + if current_literal.regexp? && REGEXP_META_CHARACTERS.match(escaped_char) + # Regular expressions should include escaped delimiters in their + # escaped form, except when the escaped character is + # a closing delimiter but not a regexp metacharacter. + # + # The backslash itself cannot be used as a closing delimiter + # at the same time as an escape symbol, but it is always munged, + # so this branch also executes for the non-closing-delimiter case + # for the backslash. + current_literal.extend_string(tok, @ts, @te) + else + current_literal.extend_string(escaped_char, @ts, @te) + end + else + # It does not. So this is an actual escape sequence, yay! + if current_literal.squiggly_heredoc? && escaped_char == "\n".freeze + # Squiggly heredocs like + # <<~-HERE + # 1\ + # 2 + # HERE + # treat '\' as a line continuation, but still dedent the body, so the heredoc above becomes "12\n". + # This information is emitted as is, without escaping, + # later this escape sequence (\\\n) gets handled manually in the Lexer::Dedenter + current_literal.extend_string(tok, @ts, @te) + elsif current_literal.supports_line_continuation_via_slash? && escaped_char == "\n".freeze + # Heredocs, regexp and a few other types of literals support line + # continuation via \\\n sequence. The code like + # "a\ + # b" + # must be parsed as "ab" + current_literal.extend_string(tok.gsub("\\\n".freeze, ''.freeze), @ts, @te) + elsif current_literal.regexp? && @version >= 31 && %w[c C m M].include?(escaped_char) + # Ruby >= 3.1 escapes \c- and \m chars, that's the only escape sequence + # supported by regexes so far, so it needs a separate branch. + current_literal.extend_string(@escape, @ts, @te) + elsif current_literal.regexp? + # Regular expressions should include escape sequences in their + # escaped form. On the other hand, escaped newlines are removed (in cases like "\\C-\\\n\\M-x") + current_literal.extend_string(tok.gsub("\\\n".freeze, ''.freeze), @ts, @te) + else + current_literal.extend_string(@escape || tok, @ts, @te) + end + end + end + end + when 170 then +# line 760 "lib/parser/lexer.rl" + begin + + diagnostic :fatal, :invalid_hex_escape, nil, range(@escape_s - 1, p + 2) + end +# line 895 "lib/parser/lexer.rl" + begin + @te = p +p = p - 1; begin + current_literal = literal + # Get the first character after the backslash. + escaped_char = @source_buffer.slice(@escape_s).chr + + if current_literal.munge_escape? escaped_char + # If this particular literal uses this character as an opening + # or closing delimiter, it is an escape sequence for that + # particular character. Write it without the backslash. + + if current_literal.regexp? && REGEXP_META_CHARACTERS.match(escaped_char) + # Regular expressions should include escaped delimiters in their + # escaped form, except when the escaped character is + # a closing delimiter but not a regexp metacharacter. + # + # The backslash itself cannot be used as a closing delimiter + # at the same time as an escape symbol, but it is always munged, + # so this branch also executes for the non-closing-delimiter case + # for the backslash. + current_literal.extend_string(tok, @ts, @te) + else + current_literal.extend_string(escaped_char, @ts, @te) + end + else + # It does not. So this is an actual escape sequence, yay! + if current_literal.squiggly_heredoc? && escaped_char == "\n".freeze + # Squiggly heredocs like + # <<~-HERE + # 1\ + # 2 + # HERE + # treat '\' as a line continuation, but still dedent the body, so the heredoc above becomes "12\n". + # This information is emitted as is, without escaping, + # later this escape sequence (\\\n) gets handled manually in the Lexer::Dedenter + current_literal.extend_string(tok, @ts, @te) + elsif current_literal.supports_line_continuation_via_slash? && escaped_char == "\n".freeze + # Heredocs, regexp and a few other types of literals support line + # continuation via \\\n sequence. The code like + # "a\ + # b" + # must be parsed as "ab" + current_literal.extend_string(tok.gsub("\\\n".freeze, ''.freeze), @ts, @te) + elsif current_literal.regexp? && @version >= 31 && %w[c C m M].include?(escaped_char) + # Ruby >= 3.1 escapes \c- and \m chars, that's the only escape sequence + # supported by regexes so far, so it needs a separate branch. + current_literal.extend_string(@escape, @ts, @te) + elsif current_literal.regexp? + # Regular expressions should include escape sequences in their + # escaped form. On the other hand, escaped newlines are removed (in cases like "\\C-\\\n\\M-x") + current_literal.extend_string(tok.gsub("\\\n".freeze, ''.freeze), @ts, @te) + else + current_literal.extend_string(@escape || tok, @ts, @te) + end + end + end + end + when 384 then +# line 760 "lib/parser/lexer.rl" + begin + + diagnostic :fatal, :invalid_hex_escape, nil, range(@escape_s - 1, p + 2) + end +# line 1918 "lib/parser/lexer.rl" + begin + @te = p +p = p - 1; begin + value = @escape || tok(@ts + 1) + + if version?(18) + emit(:tINTEGER, value.getbyte(0)) + else + emit(:tCHARACTER, value) + end + + @cs = 810; begin + p += 1 + _goto_level = _out + next + end + + end + end + when 134 then +# line 766 "lib/parser/lexer.rl" + begin + @escape = tok(@escape_s + 1, p).to_i(16).chr(Encoding::UTF_8) end +# line 895 "lib/parser/lexer.rl" + begin + @te = p +p = p - 1; begin + current_literal = literal + # Get the first character after the backslash. + escaped_char = @source_buffer.slice(@escape_s).chr + + if current_literal.munge_escape? escaped_char + # If this particular literal uses this character as an opening + # or closing delimiter, it is an escape sequence for that + # particular character. Write it without the backslash. + + if current_literal.regexp? && REGEXP_META_CHARACTERS.match(escaped_char) + # Regular expressions should include escaped delimiters in their + # escaped form, except when the escaped character is + # a closing delimiter but not a regexp metacharacter. + # + # The backslash itself cannot be used as a closing delimiter + # at the same time as an escape symbol, but it is always munged, + # so this branch also executes for the non-closing-delimiter case + # for the backslash. + current_literal.extend_string(tok, @ts, @te) + else + current_literal.extend_string(escaped_char, @ts, @te) + end + else + # It does not. So this is an actual escape sequence, yay! + if current_literal.squiggly_heredoc? && escaped_char == "\n".freeze + # Squiggly heredocs like + # <<~-HERE + # 1\ + # 2 + # HERE + # treat '\' as a line continuation, but still dedent the body, so the heredoc above becomes "12\n". + # This information is emitted as is, without escaping, + # later this escape sequence (\\\n) gets handled manually in the Lexer::Dedenter + current_literal.extend_string(tok, @ts, @te) + elsif current_literal.supports_line_continuation_via_slash? && escaped_char == "\n".freeze + # Heredocs, regexp and a few other types of literals support line + # continuation via \\\n sequence. The code like + # "a\ + # b" + # must be parsed as "ab" + current_literal.extend_string(tok.gsub("\\\n".freeze, ''.freeze), @ts, @te) + elsif current_literal.regexp? && @version >= 31 && %w[c C m M].include?(escaped_char) + # Ruby >= 3.1 escapes \c- and \m chars, that's the only escape sequence + # supported by regexes so far, so it needs a separate branch. + current_literal.extend_string(@escape, @ts, @te) + elsif current_literal.regexp? + # Regular expressions should include escape sequences in their + # escaped form. On the other hand, escaped newlines are removed (in cases like "\\C-\\\n\\M-x") + current_literal.extend_string(tok.gsub("\\\n".freeze, ''.freeze), @ts, @te) + else + current_literal.extend_string(@escape || tok, @ts, @te) + end + end + end + end + when 165 then +# line 766 "lib/parser/lexer.rl" + begin + @escape = tok(@escape_s + 1, p).to_i(16).chr(Encoding::UTF_8) end +# line 895 "lib/parser/lexer.rl" + begin + @te = p +p = p - 1; begin + current_literal = literal + # Get the first character after the backslash. + escaped_char = @source_buffer.slice(@escape_s).chr + + if current_literal.munge_escape? escaped_char + # If this particular literal uses this character as an opening + # or closing delimiter, it is an escape sequence for that + # particular character. Write it without the backslash. + + if current_literal.regexp? && REGEXP_META_CHARACTERS.match(escaped_char) + # Regular expressions should include escaped delimiters in their + # escaped form, except when the escaped character is + # a closing delimiter but not a regexp metacharacter. + # + # The backslash itself cannot be used as a closing delimiter + # at the same time as an escape symbol, but it is always munged, + # so this branch also executes for the non-closing-delimiter case + # for the backslash. + current_literal.extend_string(tok, @ts, @te) + else + current_literal.extend_string(escaped_char, @ts, @te) + end + else + # It does not. So this is an actual escape sequence, yay! + if current_literal.squiggly_heredoc? && escaped_char == "\n".freeze + # Squiggly heredocs like + # <<~-HERE + # 1\ + # 2 + # HERE + # treat '\' as a line continuation, but still dedent the body, so the heredoc above becomes "12\n". + # This information is emitted as is, without escaping, + # later this escape sequence (\\\n) gets handled manually in the Lexer::Dedenter + current_literal.extend_string(tok, @ts, @te) + elsif current_literal.supports_line_continuation_via_slash? && escaped_char == "\n".freeze + # Heredocs, regexp and a few other types of literals support line + # continuation via \\\n sequence. The code like + # "a\ + # b" + # must be parsed as "ab" + current_literal.extend_string(tok.gsub("\\\n".freeze, ''.freeze), @ts, @te) + elsif current_literal.regexp? && @version >= 31 && %w[c C m M].include?(escaped_char) + # Ruby >= 3.1 escapes \c- and \m chars, that's the only escape sequence + # supported by regexes so far, so it needs a separate branch. + current_literal.extend_string(@escape, @ts, @te) + elsif current_literal.regexp? + # Regular expressions should include escape sequences in their + # escaped form. On the other hand, escaped newlines are removed (in cases like "\\C-\\\n\\M-x") + current_literal.extend_string(tok.gsub("\\\n".freeze, ''.freeze), @ts, @te) + else + current_literal.extend_string(@escape || tok, @ts, @te) + end + end + end + end + when 379 then +# line 766 "lib/parser/lexer.rl" + begin + @escape = tok(@escape_s + 1, p).to_i(16).chr(Encoding::UTF_8) end +# line 1918 "lib/parser/lexer.rl" + begin + @te = p +p = p - 1; begin + value = @escape || tok(@ts + 1) + + if version?(18) + emit(:tINTEGER, value.getbyte(0)) + else + emit(:tCHARACTER, value) + end + + @cs = 810; begin + p += 1 + _goto_level = _out + next + end + + end + end + when 133 then +# line 770 "lib/parser/lexer.rl" + begin + + diagnostic :fatal, :invalid_unicode_escape, nil, range(@escape_s - 1, p) + end +# line 895 "lib/parser/lexer.rl" + begin + @te = p +p = p - 1; begin + current_literal = literal + # Get the first character after the backslash. + escaped_char = @source_buffer.slice(@escape_s).chr + + if current_literal.munge_escape? escaped_char + # If this particular literal uses this character as an opening + # or closing delimiter, it is an escape sequence for that + # particular character. Write it without the backslash. + + if current_literal.regexp? && REGEXP_META_CHARACTERS.match(escaped_char) + # Regular expressions should include escaped delimiters in their + # escaped form, except when the escaped character is + # a closing delimiter but not a regexp metacharacter. + # + # The backslash itself cannot be used as a closing delimiter + # at the same time as an escape symbol, but it is always munged, + # so this branch also executes for the non-closing-delimiter case + # for the backslash. + current_literal.extend_string(tok, @ts, @te) + else + current_literal.extend_string(escaped_char, @ts, @te) + end + else + # It does not. So this is an actual escape sequence, yay! + if current_literal.squiggly_heredoc? && escaped_char == "\n".freeze + # Squiggly heredocs like + # <<~-HERE + # 1\ + # 2 + # HERE + # treat '\' as a line continuation, but still dedent the body, so the heredoc above becomes "12\n". + # This information is emitted as is, without escaping, + # later this escape sequence (\\\n) gets handled manually in the Lexer::Dedenter + current_literal.extend_string(tok, @ts, @te) + elsif current_literal.supports_line_continuation_via_slash? && escaped_char == "\n".freeze + # Heredocs, regexp and a few other types of literals support line + # continuation via \\\n sequence. The code like + # "a\ + # b" + # must be parsed as "ab" + current_literal.extend_string(tok.gsub("\\\n".freeze, ''.freeze), @ts, @te) + elsif current_literal.regexp? && @version >= 31 && %w[c C m M].include?(escaped_char) + # Ruby >= 3.1 escapes \c- and \m chars, that's the only escape sequence + # supported by regexes so far, so it needs a separate branch. + current_literal.extend_string(@escape, @ts, @te) + elsif current_literal.regexp? + # Regular expressions should include escape sequences in their + # escaped form. On the other hand, escaped newlines are removed (in cases like "\\C-\\\n\\M-x") + current_literal.extend_string(tok.gsub("\\\n".freeze, ''.freeze), @ts, @te) + else + current_literal.extend_string(@escape || tok, @ts, @te) + end + end + end + end + when 164 then +# line 770 "lib/parser/lexer.rl" + begin + + diagnostic :fatal, :invalid_unicode_escape, nil, range(@escape_s - 1, p) + end +# line 895 "lib/parser/lexer.rl" + begin + @te = p +p = p - 1; begin + current_literal = literal + # Get the first character after the backslash. + escaped_char = @source_buffer.slice(@escape_s).chr + + if current_literal.munge_escape? escaped_char + # If this particular literal uses this character as an opening + # or closing delimiter, it is an escape sequence for that + # particular character. Write it without the backslash. + + if current_literal.regexp? && REGEXP_META_CHARACTERS.match(escaped_char) + # Regular expressions should include escaped delimiters in their + # escaped form, except when the escaped character is + # a closing delimiter but not a regexp metacharacter. + # + # The backslash itself cannot be used as a closing delimiter + # at the same time as an escape symbol, but it is always munged, + # so this branch also executes for the non-closing-delimiter case + # for the backslash. + current_literal.extend_string(tok, @ts, @te) + else + current_literal.extend_string(escaped_char, @ts, @te) + end + else + # It does not. So this is an actual escape sequence, yay! + if current_literal.squiggly_heredoc? && escaped_char == "\n".freeze + # Squiggly heredocs like + # <<~-HERE + # 1\ + # 2 + # HERE + # treat '\' as a line continuation, but still dedent the body, so the heredoc above becomes "12\n". + # This information is emitted as is, without escaping, + # later this escape sequence (\\\n) gets handled manually in the Lexer::Dedenter + current_literal.extend_string(tok, @ts, @te) + elsif current_literal.supports_line_continuation_via_slash? && escaped_char == "\n".freeze + # Heredocs, regexp and a few other types of literals support line + # continuation via \\\n sequence. The code like + # "a\ + # b" + # must be parsed as "ab" + current_literal.extend_string(tok.gsub("\\\n".freeze, ''.freeze), @ts, @te) + elsif current_literal.regexp? && @version >= 31 && %w[c C m M].include?(escaped_char) + # Ruby >= 3.1 escapes \c- and \m chars, that's the only escape sequence + # supported by regexes so far, so it needs a separate branch. + current_literal.extend_string(@escape, @ts, @te) + elsif current_literal.regexp? + # Regular expressions should include escape sequences in their + # escaped form. On the other hand, escaped newlines are removed (in cases like "\\C-\\\n\\M-x") + current_literal.extend_string(tok.gsub("\\\n".freeze, ''.freeze), @ts, @te) + else + current_literal.extend_string(@escape || tok, @ts, @te) + end + end + end + end + when 378 then +# line 770 "lib/parser/lexer.rl" + begin + + diagnostic :fatal, :invalid_unicode_escape, nil, range(@escape_s - 1, p) + end +# line 1918 "lib/parser/lexer.rl" + begin + @te = p +p = p - 1; begin + value = @escape || tok(@ts + 1) + + if version?(18) + emit(:tINTEGER, value.getbyte(0)) + else + emit(:tCHARACTER, value) + end + + @cs = 810; begin + p += 1 + _goto_level = _out + next + end + + end + end + when 138 then +# line 776 "lib/parser/lexer.rl" + begin + + diagnostic :fatal, :invalid_unicode_escape, nil, range(@escape_s - 1, p) + end +# line 895 "lib/parser/lexer.rl" + begin + @te = p +p = p - 1; begin + current_literal = literal + # Get the first character after the backslash. + escaped_char = @source_buffer.slice(@escape_s).chr + + if current_literal.munge_escape? escaped_char + # If this particular literal uses this character as an opening + # or closing delimiter, it is an escape sequence for that + # particular character. Write it without the backslash. + + if current_literal.regexp? && REGEXP_META_CHARACTERS.match(escaped_char) + # Regular expressions should include escaped delimiters in their + # escaped form, except when the escaped character is + # a closing delimiter but not a regexp metacharacter. + # + # The backslash itself cannot be used as a closing delimiter + # at the same time as an escape symbol, but it is always munged, + # so this branch also executes for the non-closing-delimiter case + # for the backslash. + current_literal.extend_string(tok, @ts, @te) + else + current_literal.extend_string(escaped_char, @ts, @te) + end + else + # It does not. So this is an actual escape sequence, yay! + if current_literal.squiggly_heredoc? && escaped_char == "\n".freeze + # Squiggly heredocs like + # <<~-HERE + # 1\ + # 2 + # HERE + # treat '\' as a line continuation, but still dedent the body, so the heredoc above becomes "12\n". + # This information is emitted as is, without escaping, + # later this escape sequence (\\\n) gets handled manually in the Lexer::Dedenter + current_literal.extend_string(tok, @ts, @te) + elsif current_literal.supports_line_continuation_via_slash? && escaped_char == "\n".freeze + # Heredocs, regexp and a few other types of literals support line + # continuation via \\\n sequence. The code like + # "a\ + # b" + # must be parsed as "ab" + current_literal.extend_string(tok.gsub("\\\n".freeze, ''.freeze), @ts, @te) + elsif current_literal.regexp? && @version >= 31 && %w[c C m M].include?(escaped_char) + # Ruby >= 3.1 escapes \c- and \m chars, that's the only escape sequence + # supported by regexes so far, so it needs a separate branch. + current_literal.extend_string(@escape, @ts, @te) + elsif current_literal.regexp? + # Regular expressions should include escape sequences in their + # escaped form. On the other hand, escaped newlines are removed (in cases like "\\C-\\\n\\M-x") + current_literal.extend_string(tok.gsub("\\\n".freeze, ''.freeze), @ts, @te) + else + current_literal.extend_string(@escape || tok, @ts, @te) + end + end + end + end + when 169 then +# line 776 "lib/parser/lexer.rl" + begin + + diagnostic :fatal, :invalid_unicode_escape, nil, range(@escape_s - 1, p) + end +# line 895 "lib/parser/lexer.rl" + begin + @te = p +p = p - 1; begin + current_literal = literal + # Get the first character after the backslash. + escaped_char = @source_buffer.slice(@escape_s).chr + + if current_literal.munge_escape? escaped_char + # If this particular literal uses this character as an opening + # or closing delimiter, it is an escape sequence for that + # particular character. Write it without the backslash. + + if current_literal.regexp? && REGEXP_META_CHARACTERS.match(escaped_char) + # Regular expressions should include escaped delimiters in their + # escaped form, except when the escaped character is + # a closing delimiter but not a regexp metacharacter. + # + # The backslash itself cannot be used as a closing delimiter + # at the same time as an escape symbol, but it is always munged, + # so this branch also executes for the non-closing-delimiter case + # for the backslash. + current_literal.extend_string(tok, @ts, @te) + else + current_literal.extend_string(escaped_char, @ts, @te) + end + else + # It does not. So this is an actual escape sequence, yay! + if current_literal.squiggly_heredoc? && escaped_char == "\n".freeze + # Squiggly heredocs like + # <<~-HERE + # 1\ + # 2 + # HERE + # treat '\' as a line continuation, but still dedent the body, so the heredoc above becomes "12\n". + # This information is emitted as is, without escaping, + # later this escape sequence (\\\n) gets handled manually in the Lexer::Dedenter + current_literal.extend_string(tok, @ts, @te) + elsif current_literal.supports_line_continuation_via_slash? && escaped_char == "\n".freeze + # Heredocs, regexp and a few other types of literals support line + # continuation via \\\n sequence. The code like + # "a\ + # b" + # must be parsed as "ab" + current_literal.extend_string(tok.gsub("\\\n".freeze, ''.freeze), @ts, @te) + elsif current_literal.regexp? && @version >= 31 && %w[c C m M].include?(escaped_char) + # Ruby >= 3.1 escapes \c- and \m chars, that's the only escape sequence + # supported by regexes so far, so it needs a separate branch. + current_literal.extend_string(@escape, @ts, @te) + elsif current_literal.regexp? + # Regular expressions should include escape sequences in their + # escaped form. On the other hand, escaped newlines are removed (in cases like "\\C-\\\n\\M-x") + current_literal.extend_string(tok.gsub("\\\n".freeze, ''.freeze), @ts, @te) + else + current_literal.extend_string(@escape || tok, @ts, @te) + end + end + end + end + when 383 then +# line 776 "lib/parser/lexer.rl" + begin + + diagnostic :fatal, :invalid_unicode_escape, nil, range(@escape_s - 1, p) + end +# line 1918 "lib/parser/lexer.rl" + begin + @te = p +p = p - 1; begin + value = @escape || tok(@ts + 1) + + if version?(18) + emit(:tINTEGER, value.getbyte(0)) + else + emit(:tCHARACTER, value) + end + + @cs = 810; begin + p += 1 + _goto_level = _out + next + end + + end + end + when 135 then +# line 790 "lib/parser/lexer.rl" + begin + + diagnostic :fatal, :unterminated_unicode, nil, range(p - 1, p) + end +# line 895 "lib/parser/lexer.rl" + begin + @te = p +p = p - 1; begin + current_literal = literal + # Get the first character after the backslash. + escaped_char = @source_buffer.slice(@escape_s).chr + + if current_literal.munge_escape? escaped_char + # If this particular literal uses this character as an opening + # or closing delimiter, it is an escape sequence for that + # particular character. Write it without the backslash. + + if current_literal.regexp? && REGEXP_META_CHARACTERS.match(escaped_char) + # Regular expressions should include escaped delimiters in their + # escaped form, except when the escaped character is + # a closing delimiter but not a regexp metacharacter. + # + # The backslash itself cannot be used as a closing delimiter + # at the same time as an escape symbol, but it is always munged, + # so this branch also executes for the non-closing-delimiter case + # for the backslash. + current_literal.extend_string(tok, @ts, @te) + else + current_literal.extend_string(escaped_char, @ts, @te) + end + else + # It does not. So this is an actual escape sequence, yay! + if current_literal.squiggly_heredoc? && escaped_char == "\n".freeze + # Squiggly heredocs like + # <<~-HERE + # 1\ + # 2 + # HERE + # treat '\' as a line continuation, but still dedent the body, so the heredoc above becomes "12\n". + # This information is emitted as is, without escaping, + # later this escape sequence (\\\n) gets handled manually in the Lexer::Dedenter + current_literal.extend_string(tok, @ts, @te) + elsif current_literal.supports_line_continuation_via_slash? && escaped_char == "\n".freeze + # Heredocs, regexp and a few other types of literals support line + # continuation via \\\n sequence. The code like + # "a\ + # b" + # must be parsed as "ab" + current_literal.extend_string(tok.gsub("\\\n".freeze, ''.freeze), @ts, @te) + elsif current_literal.regexp? && @version >= 31 && %w[c C m M].include?(escaped_char) + # Ruby >= 3.1 escapes \c- and \m chars, that's the only escape sequence + # supported by regexes so far, so it needs a separate branch. + current_literal.extend_string(@escape, @ts, @te) + elsif current_literal.regexp? + # Regular expressions should include escape sequences in their + # escaped form. On the other hand, escaped newlines are removed (in cases like "\\C-\\\n\\M-x") + current_literal.extend_string(tok.gsub("\\\n".freeze, ''.freeze), @ts, @te) + else + current_literal.extend_string(@escape || tok, @ts, @te) + end + end + end + end + when 166 then +# line 790 "lib/parser/lexer.rl" + begin + + diagnostic :fatal, :unterminated_unicode, nil, range(p - 1, p) + end +# line 895 "lib/parser/lexer.rl" + begin + @te = p +p = p - 1; begin + current_literal = literal + # Get the first character after the backslash. + escaped_char = @source_buffer.slice(@escape_s).chr + + if current_literal.munge_escape? escaped_char + # If this particular literal uses this character as an opening + # or closing delimiter, it is an escape sequence for that + # particular character. Write it without the backslash. + + if current_literal.regexp? && REGEXP_META_CHARACTERS.match(escaped_char) + # Regular expressions should include escaped delimiters in their + # escaped form, except when the escaped character is + # a closing delimiter but not a regexp metacharacter. + # + # The backslash itself cannot be used as a closing delimiter + # at the same time as an escape symbol, but it is always munged, + # so this branch also executes for the non-closing-delimiter case + # for the backslash. + current_literal.extend_string(tok, @ts, @te) + else + current_literal.extend_string(escaped_char, @ts, @te) + end + else + # It does not. So this is an actual escape sequence, yay! + if current_literal.squiggly_heredoc? && escaped_char == "\n".freeze + # Squiggly heredocs like + # <<~-HERE + # 1\ + # 2 + # HERE + # treat '\' as a line continuation, but still dedent the body, so the heredoc above becomes "12\n". + # This information is emitted as is, without escaping, + # later this escape sequence (\\\n) gets handled manually in the Lexer::Dedenter + current_literal.extend_string(tok, @ts, @te) + elsif current_literal.supports_line_continuation_via_slash? && escaped_char == "\n".freeze + # Heredocs, regexp and a few other types of literals support line + # continuation via \\\n sequence. The code like + # "a\ + # b" + # must be parsed as "ab" + current_literal.extend_string(tok.gsub("\\\n".freeze, ''.freeze), @ts, @te) + elsif current_literal.regexp? && @version >= 31 && %w[c C m M].include?(escaped_char) + # Ruby >= 3.1 escapes \c- and \m chars, that's the only escape sequence + # supported by regexes so far, so it needs a separate branch. + current_literal.extend_string(@escape, @ts, @te) + elsif current_literal.regexp? + # Regular expressions should include escape sequences in their + # escaped form. On the other hand, escaped newlines are removed (in cases like "\\C-\\\n\\M-x") + current_literal.extend_string(tok.gsub("\\\n".freeze, ''.freeze), @ts, @te) + else + current_literal.extend_string(@escape || tok, @ts, @te) + end + end + end + end + when 380 then +# line 790 "lib/parser/lexer.rl" + begin + + diagnostic :fatal, :unterminated_unicode, nil, range(p - 1, p) + end +# line 1918 "lib/parser/lexer.rl" + begin + @te = p +p = p - 1; begin + value = @escape || tok(@ts + 1) + + if version?(18) + emit(:tINTEGER, value.getbyte(0)) + else + emit(:tCHARACTER, value) + end + + @cs = 810; begin + p += 1 + _goto_level = _out + next + end + + end + end + when 119 then +# line 816 "lib/parser/lexer.rl" + begin + + diagnostic :fatal, :escape_eof, nil, range(p - 1, p) + end +# line 895 "lib/parser/lexer.rl" + begin + @te = p +p = p - 1; begin + current_literal = literal + # Get the first character after the backslash. + escaped_char = @source_buffer.slice(@escape_s).chr + + if current_literal.munge_escape? escaped_char + # If this particular literal uses this character as an opening + # or closing delimiter, it is an escape sequence for that + # particular character. Write it without the backslash. + + if current_literal.regexp? && REGEXP_META_CHARACTERS.match(escaped_char) + # Regular expressions should include escaped delimiters in their + # escaped form, except when the escaped character is + # a closing delimiter but not a regexp metacharacter. + # + # The backslash itself cannot be used as a closing delimiter + # at the same time as an escape symbol, but it is always munged, + # so this branch also executes for the non-closing-delimiter case + # for the backslash. + current_literal.extend_string(tok, @ts, @te) + else + current_literal.extend_string(escaped_char, @ts, @te) + end + else + # It does not. So this is an actual escape sequence, yay! + if current_literal.squiggly_heredoc? && escaped_char == "\n".freeze + # Squiggly heredocs like + # <<~-HERE + # 1\ + # 2 + # HERE + # treat '\' as a line continuation, but still dedent the body, so the heredoc above becomes "12\n". + # This information is emitted as is, without escaping, + # later this escape sequence (\\\n) gets handled manually in the Lexer::Dedenter + current_literal.extend_string(tok, @ts, @te) + elsif current_literal.supports_line_continuation_via_slash? && escaped_char == "\n".freeze + # Heredocs, regexp and a few other types of literals support line + # continuation via \\\n sequence. The code like + # "a\ + # b" + # must be parsed as "ab" + current_literal.extend_string(tok.gsub("\\\n".freeze, ''.freeze), @ts, @te) + elsif current_literal.regexp? && @version >= 31 && %w[c C m M].include?(escaped_char) + # Ruby >= 3.1 escapes \c- and \m chars, that's the only escape sequence + # supported by regexes so far, so it needs a separate branch. + current_literal.extend_string(@escape, @ts, @te) + elsif current_literal.regexp? + # Regular expressions should include escape sequences in their + # escaped form. On the other hand, escaped newlines are removed (in cases like "\\C-\\\n\\M-x") + current_literal.extend_string(tok.gsub("\\\n".freeze, ''.freeze), @ts, @te) + else + current_literal.extend_string(@escape || tok, @ts, @te) + end + end + end + end + when 150 then +# line 816 "lib/parser/lexer.rl" + begin + + diagnostic :fatal, :escape_eof, nil, range(p - 1, p) + end +# line 895 "lib/parser/lexer.rl" + begin + @te = p +p = p - 1; begin + current_literal = literal + # Get the first character after the backslash. + escaped_char = @source_buffer.slice(@escape_s).chr + + if current_literal.munge_escape? escaped_char + # If this particular literal uses this character as an opening + # or closing delimiter, it is an escape sequence for that + # particular character. Write it without the backslash. + + if current_literal.regexp? && REGEXP_META_CHARACTERS.match(escaped_char) + # Regular expressions should include escaped delimiters in their + # escaped form, except when the escaped character is + # a closing delimiter but not a regexp metacharacter. + # + # The backslash itself cannot be used as a closing delimiter + # at the same time as an escape symbol, but it is always munged, + # so this branch also executes for the non-closing-delimiter case + # for the backslash. + current_literal.extend_string(tok, @ts, @te) + else + current_literal.extend_string(escaped_char, @ts, @te) + end + else + # It does not. So this is an actual escape sequence, yay! + if current_literal.squiggly_heredoc? && escaped_char == "\n".freeze + # Squiggly heredocs like + # <<~-HERE + # 1\ + # 2 + # HERE + # treat '\' as a line continuation, but still dedent the body, so the heredoc above becomes "12\n". + # This information is emitted as is, without escaping, + # later this escape sequence (\\\n) gets handled manually in the Lexer::Dedenter + current_literal.extend_string(tok, @ts, @te) + elsif current_literal.supports_line_continuation_via_slash? && escaped_char == "\n".freeze + # Heredocs, regexp and a few other types of literals support line + # continuation via \\\n sequence. The code like + # "a\ + # b" + # must be parsed as "ab" + current_literal.extend_string(tok.gsub("\\\n".freeze, ''.freeze), @ts, @te) + elsif current_literal.regexp? && @version >= 31 && %w[c C m M].include?(escaped_char) + # Ruby >= 3.1 escapes \c- and \m chars, that's the only escape sequence + # supported by regexes so far, so it needs a separate branch. + current_literal.extend_string(@escape, @ts, @te) + elsif current_literal.regexp? + # Regular expressions should include escape sequences in their + # escaped form. On the other hand, escaped newlines are removed (in cases like "\\C-\\\n\\M-x") + current_literal.extend_string(tok.gsub("\\\n".freeze, ''.freeze), @ts, @te) + else + current_literal.extend_string(@escape || tok, @ts, @te) + end + end + end + end + when 364 then +# line 816 "lib/parser/lexer.rl" + begin + + diagnostic :fatal, :escape_eof, nil, range(p - 1, p) + end +# line 1918 "lib/parser/lexer.rl" + begin + @te = p +p = p - 1; begin + value = @escape || tok(@ts + 1) + + if version?(18) + emit(:tINTEGER, value.getbyte(0)) + else + emit(:tCHARACTER, value) + end + + @cs = 810; begin + p += 1 + _goto_level = _out + next + end + + end + end + when 177 then +# line 822 "lib/parser/lexer.rl" + begin + + @escape_s = p + @escape = nil + end +# line 895 "lib/parser/lexer.rl" + begin + @te = p+1 + begin + current_literal = literal + # Get the first character after the backslash. + escaped_char = @source_buffer.slice(@escape_s).chr + + if current_literal.munge_escape? escaped_char + # If this particular literal uses this character as an opening + # or closing delimiter, it is an escape sequence for that + # particular character. Write it without the backslash. + + if current_literal.regexp? && REGEXP_META_CHARACTERS.match(escaped_char) + # Regular expressions should include escaped delimiters in their + # escaped form, except when the escaped character is + # a closing delimiter but not a regexp metacharacter. + # + # The backslash itself cannot be used as a closing delimiter + # at the same time as an escape symbol, but it is always munged, + # so this branch also executes for the non-closing-delimiter case + # for the backslash. + current_literal.extend_string(tok, @ts, @te) + else + current_literal.extend_string(escaped_char, @ts, @te) + end + else + # It does not. So this is an actual escape sequence, yay! + if current_literal.squiggly_heredoc? && escaped_char == "\n".freeze + # Squiggly heredocs like + # <<~-HERE + # 1\ + # 2 + # HERE + # treat '\' as a line continuation, but still dedent the body, so the heredoc above becomes "12\n". + # This information is emitted as is, without escaping, + # later this escape sequence (\\\n) gets handled manually in the Lexer::Dedenter + current_literal.extend_string(tok, @ts, @te) + elsif current_literal.supports_line_continuation_via_slash? && escaped_char == "\n".freeze + # Heredocs, regexp and a few other types of literals support line + # continuation via \\\n sequence. The code like + # "a\ + # b" + # must be parsed as "ab" + current_literal.extend_string(tok.gsub("\\\n".freeze, ''.freeze), @ts, @te) + elsif current_literal.regexp? && @version >= 31 && %w[c C m M].include?(escaped_char) + # Ruby >= 3.1 escapes \c- and \m chars, that's the only escape sequence + # supported by regexes so far, so it needs a separate branch. + current_literal.extend_string(@escape, @ts, @te) + elsif current_literal.regexp? + # Regular expressions should include escape sequences in their + # escaped form. On the other hand, escaped newlines are removed (in cases like "\\C-\\\n\\M-x") + current_literal.extend_string(tok.gsub("\\\n".freeze, ''.freeze), @ts, @te) + else + current_literal.extend_string(@escape || tok, @ts, @te) + end + end + end + end + when 182 then +# line 822 "lib/parser/lexer.rl" + begin + + @escape_s = p + @escape = nil + end +# line 895 "lib/parser/lexer.rl" + begin + @te = p+1 + begin + current_literal = literal + # Get the first character after the backslash. + escaped_char = @source_buffer.slice(@escape_s).chr + + if current_literal.munge_escape? escaped_char + # If this particular literal uses this character as an opening + # or closing delimiter, it is an escape sequence for that + # particular character. Write it without the backslash. + + if current_literal.regexp? && REGEXP_META_CHARACTERS.match(escaped_char) + # Regular expressions should include escaped delimiters in their + # escaped form, except when the escaped character is + # a closing delimiter but not a regexp metacharacter. + # + # The backslash itself cannot be used as a closing delimiter + # at the same time as an escape symbol, but it is always munged, + # so this branch also executes for the non-closing-delimiter case + # for the backslash. + current_literal.extend_string(tok, @ts, @te) + else + current_literal.extend_string(escaped_char, @ts, @te) + end + else + # It does not. So this is an actual escape sequence, yay! + if current_literal.squiggly_heredoc? && escaped_char == "\n".freeze + # Squiggly heredocs like + # <<~-HERE + # 1\ + # 2 + # HERE + # treat '\' as a line continuation, but still dedent the body, so the heredoc above becomes "12\n". + # This information is emitted as is, without escaping, + # later this escape sequence (\\\n) gets handled manually in the Lexer::Dedenter + current_literal.extend_string(tok, @ts, @te) + elsif current_literal.supports_line_continuation_via_slash? && escaped_char == "\n".freeze + # Heredocs, regexp and a few other types of literals support line + # continuation via \\\n sequence. The code like + # "a\ + # b" + # must be parsed as "ab" + current_literal.extend_string(tok.gsub("\\\n".freeze, ''.freeze), @ts, @te) + elsif current_literal.regexp? && @version >= 31 && %w[c C m M].include?(escaped_char) + # Ruby >= 3.1 escapes \c- and \m chars, that's the only escape sequence + # supported by regexes so far, so it needs a separate branch. + current_literal.extend_string(@escape, @ts, @te) + elsif current_literal.regexp? + # Regular expressions should include escape sequences in their + # escaped form. On the other hand, escaped newlines are removed (in cases like "\\C-\\\n\\M-x") + current_literal.extend_string(tok.gsub("\\\n".freeze, ''.freeze), @ts, @te) + else + current_literal.extend_string(@escape || tok, @ts, @te) + end + end + end + end + when 58 then +# line 862 "lib/parser/lexer.rl" + begin + + # After every heredoc was parsed, @herebody_s contains the + # position of next token after all heredocs. + if @herebody_s + p = @herebody_s + @herebody_s = nil + end + end +# line 498 "lib/parser/lexer.rl" + begin + + # Record position of a newline for precise location reporting on tNL + # tokens. + # + # This action is embedded directly into c_nl, as it is idempotent and + # there are no cases when we need to skip it. + @newline_s = p + end + when 31 then +# line 862 "lib/parser/lexer.rl" + begin + + # After every heredoc was parsed, @herebody_s contains the + # position of next token after all heredocs. + if @herebody_s + p = @herebody_s + @herebody_s = nil + end + end +# line 1563 "lib/parser/lexer.rl" + begin + tm = p end + when 33 then +# line 862 "lib/parser/lexer.rl" + begin + + # After every heredoc was parsed, @herebody_s contains the + # position of next token after all heredocs. + if @herebody_s + p = @herebody_s + @herebody_s = nil + end + end +# line 1583 "lib/parser/lexer.rl" + begin + tm = p end + when 35 then +# line 862 "lib/parser/lexer.rl" + begin + + # After every heredoc was parsed, @herebody_s contains the + # position of next token after all heredocs. + if @herebody_s + p = @herebody_s + @herebody_s = nil + end + end +# line 1611 "lib/parser/lexer.rl" + begin + tm = p end + when 219 then +# line 862 "lib/parser/lexer.rl" + begin + + # After every heredoc was parsed, @herebody_s contains the + # position of next token after all heredocs. + if @herebody_s + p = @herebody_s + @herebody_s = nil + end + end +# line 1424 "lib/parser/lexer.rl" + begin + @te = p +p = p - 1; end + when 238 then +# line 862 "lib/parser/lexer.rl" + begin + + # After every heredoc was parsed, @herebody_s contains the + # position of next token after all heredocs. + if @herebody_s + p = @herebody_s + @herebody_s = nil + end + end +# line 1454 "lib/parser/lexer.rl" + begin + @te = p +p = p - 1; end + when 246 then +# line 862 "lib/parser/lexer.rl" + begin + + # After every heredoc was parsed, @herebody_s contains the + # position of next token after all heredocs. + if @herebody_s + p = @herebody_s + @herebody_s = nil + end + end +# line 1486 "lib/parser/lexer.rl" + begin + @te = p +p = p - 1; end + when 34 then +# line 862 "lib/parser/lexer.rl" + begin + + # After every heredoc was parsed, @herebody_s contains the + # position of next token after all heredocs. + if @herebody_s + p = @herebody_s + @herebody_s = nil + end + end +# line 1623 "lib/parser/lexer.rl" + begin + @te = p+1 + begin + p = @ts - 1 + begin + @cs = 810 + _goto_level = _again + next + end + + end + end + when 277 then +# line 862 "lib/parser/lexer.rl" + begin + + # After every heredoc was parsed, @herebody_s contains the + # position of next token after all heredocs. + if @herebody_s + p = @herebody_s + @herebody_s = nil + end + end +# line 1628 "lib/parser/lexer.rl" + begin + @te = p +p = p - 1; end + when 269 then +# line 862 "lib/parser/lexer.rl" + begin + + # After every heredoc was parsed, @herebody_s contains the + # position of next token after all heredocs. + if @herebody_s + p = @herebody_s + @herebody_s = nil + end + end +# line 1634 "lib/parser/lexer.rl" + begin + @te = p +p = p - 1; begin p = p - 1; begin + @cs = 810 + _goto_level = _again + next + end + end + end + when 288 then +# line 862 "lib/parser/lexer.rl" + begin + + # After every heredoc was parsed, @herebody_s contains the + # position of next token after all heredocs. + if @herebody_s + p = @herebody_s + @herebody_s = nil + end + end +# line 1712 "lib/parser/lexer.rl" + begin + @te = p +p = p - 1; end + when 300 then +# line 862 "lib/parser/lexer.rl" + begin + + # After every heredoc was parsed, @herebody_s contains the + # position of next token after all heredocs. + if @herebody_s + p = @herebody_s + @herebody_s = nil + end + end +# line 1733 "lib/parser/lexer.rl" + begin + @te = p +p = p - 1; end + when 296 then +# line 862 "lib/parser/lexer.rl" + begin + + # After every heredoc was parsed, @herebody_s contains the + # position of next token after all heredocs. + if @herebody_s + p = @herebody_s + @herebody_s = nil + end + end +# line 1736 "lib/parser/lexer.rl" + begin + @te = p +p = p - 1; begin p = p - 1; begin + @cs = 810 + _goto_level = _again + next + end + end + end + when 59 then +# line 862 "lib/parser/lexer.rl" + begin + + # After every heredoc was parsed, @herebody_s contains the + # position of next token after all heredocs. + if @herebody_s + p = @herebody_s + @herebody_s = nil + end + end +# line 1754 "lib/parser/lexer.rl" + begin + @te = p+1 + begin + emit(:tUNARY_NUM, tok(@ts, @ts + 1), @ts, @ts + 1) + p = p - 1; @cs = 810; begin + p += 1 + _goto_level = _out + next + end + + end + end + when 50 then +# line 862 "lib/parser/lexer.rl" + begin + + # After every heredoc was parsed, @herebody_s contains the + # position of next token after all heredocs. + if @herebody_s + p = @herebody_s + @herebody_s = nil + end + end +# line 2114 "lib/parser/lexer.rl" + begin + @te = p+1 + begin + emit(:tIDENTIFIER, ident_tok, ident_ts, ident_te) + p = ident_te - 1 + + if !@static_env.nil? && @static_env.declared?(ident_tok) && @version < 25 + @cs = 465; + else + @cs = 525; + end + begin + p += 1 + _goto_level = _out + next + end + + end + end + when 318 then +# line 862 "lib/parser/lexer.rl" + begin + + # After every heredoc was parsed, @herebody_s contains the + # position of next token after all heredocs. + if @herebody_s + p = @herebody_s + @herebody_s = nil + end + end +# line 2130 "lib/parser/lexer.rl" + begin + @te = p +p = p - 1; end + when 402 then +# line 862 "lib/parser/lexer.rl" + begin + + # After every heredoc was parsed, @herebody_s contains the + # position of next token after all heredocs. + if @herebody_s + p = @herebody_s + @herebody_s = nil + end + end +# line 2157 "lib/parser/lexer.rl" + begin + @te = p +p = p - 1; end + when 398 then +# line 862 "lib/parser/lexer.rl" + begin + + # After every heredoc was parsed, @herebody_s contains the + # position of next token after all heredocs. + if @herebody_s + p = @herebody_s + @herebody_s = nil + end + end +# line 2160 "lib/parser/lexer.rl" + begin + @te = p +p = p - 1; begin + if @context.in_kwarg + p = p - 1; begin + @cs = 810 + _goto_level = _again + next + end + + else + begin + @cs = 186 + _goto_level = _again + next + end + + end + end + end + when 411 then +# line 862 "lib/parser/lexer.rl" + begin + + # After every heredoc was parsed, @herebody_s contains the + # position of next token after all heredocs. + if @herebody_s + p = @herebody_s + @herebody_s = nil + end + end +# line 2188 "lib/parser/lexer.rl" + begin + @te = p +p = p - 1; end + when 408 then +# line 862 "lib/parser/lexer.rl" + begin + + # After every heredoc was parsed, @herebody_s contains the + # position of next token after all heredocs. + if @herebody_s + p = @herebody_s + @herebody_s = nil + end + end +# line 2191 "lib/parser/lexer.rl" + begin + @te = p +p = p - 1; begin begin + @cs = 186 + _goto_level = _again + next + end + end + end + when 495 then +# line 862 "lib/parser/lexer.rl" + begin + + # After every heredoc was parsed, @herebody_s contains the + # position of next token after all heredocs. + if @herebody_s + p = @herebody_s + @herebody_s = nil + end + end +# line 2505 "lib/parser/lexer.rl" + begin + @te = p +p = p - 1; end + when 427 then +# line 862 "lib/parser/lexer.rl" + begin + + # After every heredoc was parsed, @herebody_s contains the + # position of next token after all heredocs. + if @herebody_s + p = @herebody_s + @herebody_s = nil + end + end +# line 2508 "lib/parser/lexer.rl" + begin + @te = p +p = p - 1; begin begin + @cs = 990 + _goto_level = _again + next + end + end + end + when 101 then +# line 862 "lib/parser/lexer.rl" + begin + + # After every heredoc was parsed, @herebody_s contains the + # position of next token after all heredocs. + if @herebody_s + p = @herebody_s + @herebody_s = nil + end + end +# line 2601 "lib/parser/lexer.rl" + begin + @te = p +p = p - 1; end + when 268 then +# line 1068 "lib/parser/lexer.rl" + begin + + @cond.push(false); @cmdarg.push(false) + + current_literal = literal + if current_literal + current_literal.start_interp_brace + end + end +# line 1530 "lib/parser/lexer.rl" + begin + @te = p +p = p - 1; begin + if @lambda_stack.last == @paren_nest + @lambda_stack.pop + emit(:tLAMBEG, '{'.freeze, @te - 1, @te) + else + emit(:tLCURLY, '{'.freeze, @te - 1, @te) + end + @command_start = true + @paren_nest += 1 + @cs = 802; begin + p += 1 + _goto_level = _out + next + end + + end + end + when 290 then +# line 1068 "lib/parser/lexer.rl" + begin + + @cond.push(false); @cmdarg.push(false) + + current_literal = literal + if current_literal + current_literal.start_interp_brace + end + end +# line 1696 "lib/parser/lexer.rl" + begin + @te = p +p = p - 1; begin + if @lambda_stack.last == @paren_nest + @lambda_stack.pop + emit(:tLAMBEG, '{'.freeze) + else + emit(:tLBRACE_ARG, '{'.freeze) + end + @paren_nest += 1 + @command_start = true + @cs = 802; begin + p += 1 + _goto_level = _out + next + end + + end + end + when 393 then +# line 1068 "lib/parser/lexer.rl" + begin + + @cond.push(false); @cmdarg.push(false) + + current_literal = literal + if current_literal + current_literal.start_interp_brace + end + end +# line 1976 "lib/parser/lexer.rl" + begin + @te = p +p = p - 1; begin + if @lambda_stack.last == @paren_nest + @lambda_stack.pop + @command_start = true + emit(:tLAMBEG, '{'.freeze) + else + emit(:tLBRACE, '{'.freeze) + end + @paren_nest += 1 + begin + p += 1 + _goto_level = _out + next + end + + end + end + when 508 then +# line 1068 "lib/parser/lexer.rl" + begin + + @cond.push(false); @cmdarg.push(false) + + current_literal = literal + if current_literal + current_literal.start_interp_brace + end + end +# line 2213 "lib/parser/lexer.rl" + begin + @te = p +p = p - 1; begin + if @lambda_stack.last == @paren_nest + @lambda_stack.pop + + if tok == '{'.freeze + emit(:tLAMBEG, '{'.freeze) + else # 'do' + emit(:kDO_LAMBDA, 'do'.freeze) + end + else + if tok == '{'.freeze + emit(:tLCURLY, '{'.freeze) + else # 'do' + emit_do + end + end + if tok == '{'.freeze + @paren_nest += 1 + end + @command_start = true + + @cs = 802; begin + p += 1 + _goto_level = _out + next + end + + end + end + when 509 then +# line 1077 "lib/parser/lexer.rl" + begin + + current_literal = literal + if current_literal + if current_literal.end_interp_brace_and_try_closing + if version?(18, 19) + emit(:tRCURLY, '}'.freeze, p - 1, p) + @cond.lexpop + @cmdarg.lexpop + else + emit(:tSTRING_DEND, '}'.freeze, p - 1, p) + end + + if current_literal.saved_herebody_s + @herebody_s = current_literal.saved_herebody_s + end + + + p = p - 1; + @cs = (next_state_for_literal(current_literal)); + begin + p += 1 + _goto_level = _out + next + end + + end + end + + @paren_nest -= 1 + end +# line 2450 "lib/parser/lexer.rl" + begin + @te = p +p = p - 1; begin + emit_table(PUNCTUATION) + + if @version < 24 + @cond.lexpop + @cmdarg.lexpop + else + @cond.pop + @cmdarg.pop + end + + if tok == '}'.freeze || tok == ']'.freeze + if @version >= 25 + @cs = 810; + else + @cs = 531; + end + else # ) + # fnext expr_endfn; ? + end + + begin + p += 1 + _goto_level = _out + next + end + + end + end + when 61 then +# line 1226 "lib/parser/lexer.rl" + begin + @sharp_s = p - 1 end +# line 1229 "lib/parser/lexer.rl" + begin + emit_comment(@sharp_s, p == pe ? p - 2 : p) end + when 65 then +# line 1229 "lib/parser/lexer.rl" + begin + emit_comment(@sharp_s, p == pe ? p - 2 : p) end +# line 498 "lib/parser/lexer.rl" + begin + + # Record position of a newline for precise location reporting on tNL + # tokens. + # + # This action is embedded directly into c_nl, as it is idempotent and + # there are no cases when we need to skip it. + @newline_s = p + end + when 222 then +# line 1229 "lib/parser/lexer.rl" + begin + emit_comment(@sharp_s, p == pe ? p - 2 : p) end +# line 1424 "lib/parser/lexer.rl" + begin + @te = p +p = p - 1; end + when 237 then +# line 1229 "lib/parser/lexer.rl" + begin + emit_comment(@sharp_s, p == pe ? p - 2 : p) end +# line 1454 "lib/parser/lexer.rl" + begin + @te = p +p = p - 1; end + when 249 then +# line 1229 "lib/parser/lexer.rl" + begin + emit_comment(@sharp_s, p == pe ? p - 2 : p) end +# line 1486 "lib/parser/lexer.rl" + begin + @te = p +p = p - 1; end + when 271 then +# line 1229 "lib/parser/lexer.rl" + begin + emit_comment(@sharp_s, p == pe ? p - 2 : p) end +# line 1631 "lib/parser/lexer.rl" + begin + @te = p +p = p - 1; begin begin + @cs = 810 + _goto_level = _again + next + end + end + end + when 286 then +# line 1229 "lib/parser/lexer.rl" + begin + emit_comment(@sharp_s, p == pe ? p - 2 : p) end +# line 1712 "lib/parser/lexer.rl" + begin + @te = p +p = p - 1; end + when 298 then +# line 1229 "lib/parser/lexer.rl" + begin + emit_comment(@sharp_s, p == pe ? p - 2 : p) end +# line 1733 "lib/parser/lexer.rl" + begin + @te = p +p = p - 1; end + when 324 then +# line 1229 "lib/parser/lexer.rl" + begin + emit_comment(@sharp_s, p == pe ? p - 2 : p) end +# line 2130 "lib/parser/lexer.rl" + begin + @te = p +p = p - 1; end + when 400 then +# line 1229 "lib/parser/lexer.rl" + begin + emit_comment(@sharp_s, p == pe ? p - 2 : p) end +# line 2157 "lib/parser/lexer.rl" + begin + @te = p +p = p - 1; end + when 410 then +# line 1229 "lib/parser/lexer.rl" + begin + emit_comment(@sharp_s, p == pe ? p - 2 : p) end +# line 2188 "lib/parser/lexer.rl" + begin + @te = p +p = p - 1; end + when 431 then +# line 1229 "lib/parser/lexer.rl" + begin + emit_comment(@sharp_s, p == pe ? p - 2 : p) end +# line 2505 "lib/parser/lexer.rl" + begin + @te = p +p = p - 1; end + when 103 then +# line 1229 "lib/parser/lexer.rl" + begin + emit_comment(@sharp_s, p == pe ? p - 2 : p) end +# line 2601 "lib/parser/lexer.rl" + begin + @te = p +p = p - 1; end + when 243 then +# line 1270 "lib/parser/lexer.rl" + begin + tm = p end +# line 1476 "lib/parser/lexer.rl" + begin + @te = p +p = p - 1; begin emit(:tFID, tok(@ts, tm), @ts, tm) + @cs = (arg_or_cmdarg(cmd_state)); p = tm - 1; begin + p += 1 + _goto_level = _out + next + end + end + end + when 338 then +# line 1270 "lib/parser/lexer.rl" + begin + tm = p end +# line 1882 "lib/parser/lexer.rl" + begin + @te = p +p = p - 1; begin + emit(:tSYMBOL, tok(@ts + 1, tm), @ts, tm) + p = tm - 1 + @cs = 810; begin + p += 1 + _goto_level = _out + next + end + + end + end + when 309 then +# line 1270 "lib/parser/lexer.rl" + begin + tm = p end +# line 2103 "lib/parser/lexer.rl" + begin + @te = p +p = p - 1; begin p = @ts - 1 + begin + @cs = 810 + _goto_level = _again + next + end + end + end + when 424 then +# line 1270 "lib/parser/lexer.rl" + begin + tm = p end +# line 1 "NONE" + begin + case @act + when 145 then + begin begin p = (( @te))-1; end + + if @lambda_stack.last == @paren_nest + @lambda_stack.pop + + if tok == '{'.freeze + emit(:tLAMBEG, '{'.freeze) + else # 'do' + emit(:kDO_LAMBDA, 'do'.freeze) + end + else + if tok == '{'.freeze + emit(:tLCURLY, '{'.freeze) + else # 'do' + emit_do + end + end + if tok == '{'.freeze + @paren_nest += 1 + end + @command_start = true + + @cs = 802; begin + p += 1 + _goto_level = _out + next + end + + end + when 146 then + begin begin p = (( @te))-1; end + emit_table(KEYWORDS) + @cs = 352; begin + p += 1 + _goto_level = _out + next + end + end + when 147 then + begin begin p = (( @te))-1; end + emit(:kCLASS, 'class'.freeze, @ts, @ts + 5) + emit(:tLSHFT, '<<'.freeze, @te - 2, @te) + @cs = 802; begin + p += 1 + _goto_level = _out + next + end + end + when 148 then + begin begin p = (( @te))-1; end + emit_table(KEYWORDS) + @cs = 563; begin + p += 1 + _goto_level = _out + next + end + end + when 149 then + begin begin p = (( @te))-1; end + emit_table(KEYWORDS) + @command_start = true + @cs = 802; begin + p += 1 + _goto_level = _out + next + end + end + when 150 then + begin begin p = (( @te))-1; end + emit_table(KEYWORDS) + @cs = 539; begin + p += 1 + _goto_level = _out + next + end + end + when 151 then + begin begin p = (( @te))-1; end + + emit_table(KEYWORDS) + + if version?(18) && tok == 'not'.freeze + @cs = 563; begin + p += 1 + _goto_level = _out + next + end + + else + @cs = 494; begin + p += 1 + _goto_level = _out + next + end + + end + end + when 152 then + begin begin p = (( @te))-1; end + + if version?(18) + emit(:tIDENTIFIER) + + unless !@static_env.nil? && @static_env.declared?(tok) + @cs = (arg_or_cmdarg(cmd_state)); + end + else + emit(:k__ENCODING__, '__ENCODING__'.freeze) + end + begin + p += 1 + _goto_level = _out + next + end + + end + when 153 then + begin begin p = (( @te))-1; end + emit_table(KEYWORDS) + begin + p += 1 + _goto_level = _out + next + end + end + when 154 then + begin begin p = (( @te))-1; end + + digits = tok(@num_digits_s, @num_suffix_s) + + if digits.end_with? '_'.freeze + diagnostic :error, :trailing_in_number, { :character => '_'.freeze }, + range(@te - 1, @te) + elsif digits.empty? && @num_base == 8 && version?(18) + # 1.8 did not raise an error on 0o. + digits = '0'.freeze + elsif digits.empty? + diagnostic :error, :empty_numeric + elsif @num_base == 8 && (invalid_idx = digits.index(/[89]/)) + invalid_s = @num_digits_s + invalid_idx + diagnostic :error, :invalid_octal, nil, + range(invalid_s, invalid_s + 1) + end + + if version?(18, 19, 20) + emit(:tINTEGER, digits.to_i(@num_base), @ts, @num_suffix_s) + p = @num_suffix_s - 1 + else + @num_xfrm.call(digits.to_i(@num_base)) + end + begin + p += 1 + _goto_level = _out + next + end + + end + when 156 then + begin begin p = (( @te))-1; end + + if version?(18, 19, 20) + diagnostic :error, + :trailing_in_number, { :character => tok(@te - 1, @te) }, + range(@te - 1, @te) + else + emit(:tINTEGER, tok(@ts, @te - 1).to_i, @ts, @te - 1) + p = p - 1; begin + p += 1 + _goto_level = _out + next + end + + end + end + when 157 then + begin begin p = (( @te))-1; end + + if version?(18, 19, 20) + diagnostic :error, + :trailing_in_number, { :character => tok(@te - 1, @te) }, + range(@te - 1, @te) + else + emit(:tFLOAT, tok(@ts, @te - 1).to_f, @ts, @te - 1) + p = p - 1; begin + p += 1 + _goto_level = _out + next + end + + end + end + when 158 then + begin begin p = (( @te))-1; end + + digits = tok(@ts, @num_suffix_s) + + if version?(18, 19, 20) + emit(:tFLOAT, Float(digits), @ts, @num_suffix_s) + p = @num_suffix_s - 1 + else + @num_xfrm.call(digits) + end + begin + p += 1 + _goto_level = _out + next + end + + end + when 160 then + begin begin p = (( @te))-1; end + emit(:tCONSTANT) + @cs = (arg_or_cmdarg(cmd_state)); begin + p += 1 + _goto_level = _out + next + end + end + when 164 then + begin begin p = (( @te))-1; end + + emit(:tIDENTIFIER) + + if !@static_env.nil? && @static_env.declared?(tok) + @cs = 465; begin + p += 1 + _goto_level = _out + next + end + + else + @cs = (arg_or_cmdarg(cmd_state)); begin + p += 1 + _goto_level = _out + next + end + + end + end + when 165 then + begin begin p = (( @te))-1; end + + if tm == @te + # Suffix was consumed, e.g. foo! + emit(:tFID) + else + # Suffix was not consumed, e.g. foo!= + emit(:tIDENTIFIER, tok(@ts, tm), @ts, tm) + p = tm - 1 + end + @cs = 494; begin + p += 1 + _goto_level = _out + next + end + + end + when 167 then + begin begin p = (( @te))-1; end + + emit_table(PUNCTUATION); + @cs = 802; begin + p += 1 + _goto_level = _out + next + end + + end + when 168 then + begin begin p = (( @te))-1; end + emit_table(PUNCTUATION) + @cs = 563; begin + p += 1 + _goto_level = _out + next + end + end +end + end + when 244 then +# line 1271 "lib/parser/lexer.rl" + begin + tm = p - 2 end +# line 1476 "lib/parser/lexer.rl" + begin + @te = p +p = p - 1; begin emit(:tFID, tok(@ts, tm), @ts, tm) + @cs = (arg_or_cmdarg(cmd_state)); p = tm - 1; begin + p += 1 + _goto_level = _out + next + end + end + end + when 339 then +# line 1271 "lib/parser/lexer.rl" + begin + tm = p - 2 end +# line 1882 "lib/parser/lexer.rl" + begin + @te = p +p = p - 1; begin + emit(:tSYMBOL, tok(@ts + 1, tm), @ts, tm) + p = tm - 1 + @cs = 810; begin + p += 1 + _goto_level = _out + next + end + + end + end + when 311 then +# line 1271 "lib/parser/lexer.rl" + begin + tm = p - 2 end +# line 2103 "lib/parser/lexer.rl" + begin + @te = p +p = p - 1; begin p = @ts - 1 + begin + @cs = 810 + _goto_level = _again + next + end + end + end + when 425 then +# line 1271 "lib/parser/lexer.rl" + begin + tm = p - 2 end +# line 2414 "lib/parser/lexer.rl" + begin + @te = p +p = p - 1; begin + if tm == @te + # Suffix was consumed, e.g. foo! + emit(:tFID) + else + # Suffix was not consumed, e.g. foo!= + emit(:tIDENTIFIER, tok(@ts, tm), @ts, tm) + p = tm - 1 + end + @cs = 494; begin + p += 1 + _goto_level = _out + next + end + + end + end + when 340 then +# line 1276 "lib/parser/lexer.rl" + begin + tm = p end +# line 1882 "lib/parser/lexer.rl" + begin + @te = p +p = p - 1; begin + emit(:tSYMBOL, tok(@ts + 1, tm), @ts, tm) + p = tm - 1 + @cs = 810; begin + p += 1 + _goto_level = _out + next + end + + end + end + when 312 then +# line 1276 "lib/parser/lexer.rl" + begin + tm = p end +# line 2103 "lib/parser/lexer.rl" + begin + @te = p +p = p - 1; begin p = @ts - 1 + begin + @cs = 810 + _goto_level = _again + next + end + end + end + when 341 then +# line 1277 "lib/parser/lexer.rl" + begin + tm = p - 2 end +# line 1882 "lib/parser/lexer.rl" + begin + @te = p +p = p - 1; begin + emit(:tSYMBOL, tok(@ts + 1, tm), @ts, tm) + p = tm - 1 + @cs = 810; begin + p += 1 + _goto_level = _out + next + end + + end + end + when 313 then +# line 1277 "lib/parser/lexer.rl" + begin + tm = p - 2 end +# line 2103 "lib/parser/lexer.rl" + begin + @te = p +p = p - 1; begin p = @ts - 1 + begin + @cs = 810 + _goto_level = _again + next + end + end + end + when 345 then +# line 1278 "lib/parser/lexer.rl" + begin + tm = p - 2 end +# line 1882 "lib/parser/lexer.rl" + begin + @te = p +p = p - 1; begin + emit(:tSYMBOL, tok(@ts + 1, tm), @ts, tm) + p = tm - 1 + @cs = 810; begin + p += 1 + _goto_level = _out + next + end + + end + end + when 316 then +# line 1278 "lib/parser/lexer.rl" + begin + tm = p - 2 end +# line 2103 "lib/parser/lexer.rl" + begin + @te = p +p = p - 1; begin p = @ts - 1 + begin + @cs = 810 + _goto_level = _again + next + end + end + end + when 344 then +# line 1279 "lib/parser/lexer.rl" + begin + tm = p - 2 end +# line 1882 "lib/parser/lexer.rl" + begin + @te = p +p = p - 1; begin + emit(:tSYMBOL, tok(@ts + 1, tm), @ts, tm) + p = tm - 1 + @cs = 810; begin + p += 1 + _goto_level = _out + next + end + + end + end + when 315 then +# line 1279 "lib/parser/lexer.rl" + begin + tm = p - 2 end +# line 1 "NONE" + begin + case @act + when 99 then + begin begin p = (( @te))-1; end + + emit(:tUNARY_NUM, tok(@ts, @ts + 1), @ts, @ts + 1) + p = p - 1; @cs = 810; begin + p += 1 + _goto_level = _out + next + end + + end + when 106 then + begin begin p = (( @te))-1; end + + diagnostic :error, :unterminated_heredoc_id, nil, range(@ts, @ts + 1) + end + when 117 then + begin begin p = (( @te))-1; end + + if @version >= 27 + emit(:tPIPE, tok(@ts, @ts + 1), @ts, @ts + 1) + p = p - 1; + @cs = 563; begin + p += 1 + _goto_level = _out + next + end + + else + p -= 2 + begin + @cs = 810 + _goto_level = _again + next + end + + end + end + when 121 then + begin begin p = (( @te))-1; end + emit_table(PUNCTUATION_BEGIN) + begin + p += 1 + _goto_level = _out + next + end + end + when 122 then + begin begin p = (( @te))-1; end + emit(:kRESCUE, 'rescue'.freeze, @ts, tm) + p = tm - 1 + @cs = 539; begin + p += 1 + _goto_level = _out + next + end + end + when 123 then + begin begin p = (( @te))-1; end + emit_table(KEYWORDS_BEGIN) + @command_start = true + @cs = 802; begin + p += 1 + _goto_level = _out + next + end + end + when 127 then + begin begin p = (( @te))-1; end + p = @ts - 1 + begin + @cs = 810 + _goto_level = _again + next + end + end + when 128 then + begin begin p = (( @te))-1; end + + emit(:tIDENTIFIER) + + if !@static_env.nil? && @static_env.declared?(tok) + @cs = 465; begin + p += 1 + _goto_level = _out + next + end + + else + @cs = (arg_or_cmdarg(cmd_state)); begin + p += 1 + _goto_level = _out + next + end + + end + end + when 132 then + begin begin p = (( @te))-1; end + p = @ts - 1; begin + @cs = 810 + _goto_level = _again + next + end + end +end + end + when 342 then +# line 1280 "lib/parser/lexer.rl" + begin + tm = p - 3 end +# line 1882 "lib/parser/lexer.rl" + begin + @te = p +p = p - 1; begin + emit(:tSYMBOL, tok(@ts + 1, tm), @ts, tm) + p = tm - 1 + @cs = 810; begin + p += 1 + _goto_level = _out + next + end + + end + end + when 314 then +# line 1280 "lib/parser/lexer.rl" + begin + tm = p - 3 end +# line 2103 "lib/parser/lexer.rl" + begin + @te = p +p = p - 1; begin p = @ts - 1 + begin + @cs = 810 + _goto_level = _again + next + end + end + end + when 343 then +# line 1285 "lib/parser/lexer.rl" + begin + tm = p - 2 end +# line 1882 "lib/parser/lexer.rl" + begin + @te = p +p = p - 1; begin + emit(:tSYMBOL, tok(@ts + 1, tm), @ts, tm) + p = tm - 1 + @cs = 810; begin + p += 1 + _goto_level = _out + next + end + + end + end + when 490 then +# line 1290 "lib/parser/lexer.rl" + begin + tm = p - 2 end +# line 2396 "lib/parser/lexer.rl" + begin + @te = p +p = p - 1; begin emit(:tCONSTANT, tok(@ts, tm), @ts, tm) + p = tm - 1; begin + p += 1 + _goto_level = _out + next + end + end + end + when 267 then +# line 1296 "lib/parser/lexer.rl" + begin + + @cond.push(false); @cmdarg.push(false) + + @paren_nest += 1 + end +# line 1524 "lib/parser/lexer.rl" + begin + @te = p +p = p - 1; begin emit(:tLBRACK, '['.freeze, @te - 1, @te) + @cs = 563; begin + p += 1 + _goto_level = _out + next + end + end + end + when 386 then +# line 1296 "lib/parser/lexer.rl" + begin + + @cond.push(false); @cmdarg.push(false) + + @paren_nest += 1 + end +# line 1990 "lib/parser/lexer.rl" + begin + @te = p +p = p - 1; begin emit(:tLBRACK, '['.freeze) + begin + p += 1 + _goto_level = _out + next + end + end + end + when 493 then +# line 1296 "lib/parser/lexer.rl" + begin + + @cond.push(false); @cmdarg.push(false) + + @paren_nest += 1 + end +# line 2483 "lib/parser/lexer.rl" + begin + @te = p +p = p - 1; begin emit(:tLBRACK2, '['.freeze) + @cs = 563; begin + p += 1 + _goto_level = _out + next + end + end + end + when 496 then +# line 1302 "lib/parser/lexer.rl" + begin + + @paren_nest -= 1 + end +# line 2450 "lib/parser/lexer.rl" + begin + @te = p +p = p - 1; begin + emit_table(PUNCTUATION) + + if @version < 24 + @cond.lexpop + @cmdarg.lexpop + else + @cond.pop + @cmdarg.pop + end + + if tok == '}'.freeze || tok == ']'.freeze + if @version >= 25 + @cs = 810; + else + @cs = 531; + end + else # ) + # fnext expr_endfn; ? + end + + begin + p += 1 + _goto_level = _out + next + end + + end + end + when 259 then +# line 1309 "lib/parser/lexer.rl" + begin + + @cond.push(false); @cmdarg.push(false) + + @paren_nest += 1 + + if version?(18) + @command_start = true + end + end +# line 1505 "lib/parser/lexer.rl" + begin + @te = p +p = p - 1; begin + if version?(18) + emit(:tLPAREN2, '('.freeze, @te - 1, @te) + @cs = 802; begin + p += 1 + _goto_level = _out + next + end + + else + emit(:tLPAREN_ARG, '('.freeze, @te - 1, @te) + @cs = 563; begin + p += 1 + _goto_level = _out + next + end + + end + end + end + when 272 then +# line 1309 "lib/parser/lexer.rl" + begin + + @cond.push(false); @cmdarg.push(false) + + @paren_nest += 1 + + if version?(18) + @command_start = true + end + end +# line 1518 "lib/parser/lexer.rl" + begin + @te = p +p = p - 1; begin emit(:tLPAREN2, '('.freeze) + @cs = 563; begin + p += 1 + _goto_level = _out + next + end + end + end + when 280 then +# line 1309 "lib/parser/lexer.rl" + begin + + @cond.push(false); @cmdarg.push(false) + + @paren_nest += 1 + + if version?(18) + @command_start = true + end + end +# line 1650 "lib/parser/lexer.rl" + begin + @te = p +p = p - 1; begin + emit(:tLPAREN_ARG, '('.freeze, @te - 1, @te) + if version?(18) + @cs = 802; begin + p += 1 + _goto_level = _out + next + end + + else + @cs = 563; begin + p += 1 + _goto_level = _out + next + end + + end + end + end + when 328 then +# line 1309 "lib/parser/lexer.rl" + begin + + @cond.push(false); @cmdarg.push(false) + + @paren_nest += 1 + + if version?(18) + @command_start = true + end + end +# line 1995 "lib/parser/lexer.rl" + begin + @te = p +p = p - 1; begin emit(:tLPAREN, '('.freeze) + begin + p += 1 + _goto_level = _out + next + end + end + end + when 437 then +# line 1309 "lib/parser/lexer.rl" + begin + + @cond.push(false); @cmdarg.push(false) + + @paren_nest += 1 + + if version?(18) + @command_start = true + end + end +# line 2446 "lib/parser/lexer.rl" + begin + @te = p +p = p - 1; begin emit_table(PUNCTUATION) + @cs = 563; begin + p += 1 + _goto_level = _out + next + end + end + end + when 438 then +# line 1319 "lib/parser/lexer.rl" + begin + + @paren_nest -= 1 + end +# line 2450 "lib/parser/lexer.rl" + begin + @te = p +p = p - 1; begin + emit_table(PUNCTUATION) + + if @version < 24 + @cond.lexpop + @cmdarg.lexpop + else + @cond.pop + @cmdarg.pop + end + + if tok == '}'.freeze || tok == ']'.freeze + if @version >= 25 + @cs = 810; + else + @cs = 531; + end + else # ) + # fnext expr_endfn; ? + end + + begin + p += 1 + _goto_level = _out + next + end + + end + end + when 72 then +# line 1803 "lib/parser/lexer.rl" + begin + heredoc_e = p end +# line 498 "lib/parser/lexer.rl" + begin + + # Record position of a newline for precise location reporting on tNL + # tokens. + # + # This action is embedded directly into c_nl, as it is idempotent and + # there are no cases when we need to skip it. + @newline_s = p + end + when 353 then +# line 1804 "lib/parser/lexer.rl" + begin + new_herebody_s = p end +# line 1805 "lib/parser/lexer.rl" + begin + @te = p +p = p - 1; begin + tok(@ts, heredoc_e) =~ /^<<(-?)(~?)(["'`]?)(.*)\3$/m + + indent = !$1.empty? || !$2.empty? + dedent_body = !$2.empty? + type = $3.empty? ? '<<"'.freeze : ('<<'.freeze + $3) + delimiter = $4 + + if @version >= 27 + if delimiter.count("\n") > 0 || delimiter.count("\r") > 0 + diagnostic :error, :unterminated_heredoc_id, nil, range(@ts, @ts + 1) + end + elsif @version >= 24 + if delimiter.count("\n") > 0 + if delimiter.end_with?("\n") + diagnostic :warning, :heredoc_id_ends_with_nl, nil, range(@ts, @ts + 1) + delimiter = delimiter.rstrip + else + diagnostic :fatal, :heredoc_id_has_newline, nil, range(@ts, @ts + 1) + end + end + end + + if dedent_body && version?(18, 19, 20, 21, 22) + emit(:tLSHFT, '<<'.freeze, @ts, @ts + 2) + p = @ts + 1 + @cs = 563; begin + p += 1 + _goto_level = _out + next + end + + else + @cs = (push_literal(type, delimiter, @ts, heredoc_e, indent, dedent_body)); + + @herebody_s ||= new_herebody_s + p = @herebody_s - 1 + end + end + end + when 348 then +# line 1895 "lib/parser/lexer.rl" + begin + tm = p - 1; diag_msg = :ivar_name end +# line 1898 "lib/parser/lexer.rl" + begin + @te = p +p = p - 1; begin + if @version >= 27 + diagnostic :error, diag_msg, { name: tok(tm, @te) }, range(tm, @te) + else + emit(:tCOLON, tok(@ts, @ts + 1), @ts, @ts + 1) + p = @ts + end + + @cs = 810; begin + p += 1 + _goto_level = _out + next + end + + end + end + when 351 then +# line 1896 "lib/parser/lexer.rl" + begin + tm = p - 2; diag_msg = :cvar_name end +# line 1898 "lib/parser/lexer.rl" + begin + @te = p +p = p - 1; begin + if @version >= 27 + diagnostic :error, diag_msg, { name: tok(tm, @te) }, range(tm, @te) + else + emit(:tCOLON, tok(@ts, @ts + 1), @ts, @ts + 1) + p = @ts + end + + @cs = 810; begin + p += 1 + _goto_level = _out + next + end + + end + end + when 359 then +# line 1916 "lib/parser/lexer.rl" + begin + @escape = nil end +# line 1918 "lib/parser/lexer.rl" + begin + @te = p +p = p - 1; begin + value = @escape || tok(@ts + 1) + + if version?(18) + emit(:tINTEGER, value.getbyte(0)) + else + emit(:tCHARACTER, value) + end + + @cs = 810; begin + p += 1 + _goto_level = _out + next + end + + end + end + when 389 then +# line 2005 "lib/parser/lexer.rl" + begin + tm = p end +# line 2006 "lib/parser/lexer.rl" + begin + @te = p +p = p - 1; begin emit(:kRESCUE, 'rescue'.freeze, @ts, tm) + p = tm - 1 + @cs = 539; begin + p += 1 + _goto_level = _out + next + end + end + end + when 480 then +# line 2298 "lib/parser/lexer.rl" + begin + @num_base = 16; @num_digits_s = p end +# line 2304 "lib/parser/lexer.rl" + begin + @num_suffix_s = p end + when 474 then +# line 2299 "lib/parser/lexer.rl" + begin + @num_base = 10; @num_digits_s = p end +# line 2304 "lib/parser/lexer.rl" + begin + @num_suffix_s = p end + when 477 then +# line 2300 "lib/parser/lexer.rl" + begin + @num_base = 8; @num_digits_s = p end +# line 2304 "lib/parser/lexer.rl" + begin + @num_suffix_s = p end + when 471 then +# line 2301 "lib/parser/lexer.rl" + begin + @num_base = 2; @num_digits_s = p end +# line 2304 "lib/parser/lexer.rl" + begin + @num_suffix_s = p end + when 486 then +# line 2302 "lib/parser/lexer.rl" + begin + @num_base = 10; @num_digits_s = @ts end +# line 2304 "lib/parser/lexer.rl" + begin + @num_suffix_s = p end + when 449 then +# line 2303 "lib/parser/lexer.rl" + begin + @num_base = 8; @num_digits_s = @ts end +# line 2304 "lib/parser/lexer.rl" + begin + @num_suffix_s = p end + when 487 then +# line 2304 "lib/parser/lexer.rl" + begin + @num_suffix_s = p end +# line 632 "lib/parser/lexer.rl" + begin + @num_xfrm = lambda { |chars| emit(:tINTEGER, chars) } end + when 8 then +# line 1 "NONE" + begin + @te = p+1 + end +# line 498 "lib/parser/lexer.rl" + begin + + # Record position of a newline for precise location reporting on tNL + # tokens. + # + # This action is embedded directly into c_nl, as it is idempotent and + # there are no cases when we need to skip it. + @newline_s = p + end + when 453 then +# line 1 "NONE" + begin + @te = p+1 + end +# line 2362 "lib/parser/lexer.rl" + begin + @num_suffix_s = p end + when 228 then +# line 1 "NONE" + begin + @te = p+1 + end +# line 1383 "lib/parser/lexer.rl" + begin + @act = 43; end + when 215 then +# line 1 "NONE" + begin + @te = p+1 + end +# line 1387 "lib/parser/lexer.rl" + begin + @act = 44; end + when 211 then +# line 1 "NONE" + begin + @te = p+1 + end +# line 1391 "lib/parser/lexer.rl" + begin + @act = 45; end + when 27 then +# line 1 "NONE" + begin + @te = p+1 + end +# line 1567 "lib/parser/lexer.rl" + begin + @act = 72; end + when 261 then +# line 1 "NONE" + begin + @te = p+1 + end +# line 1584 "lib/parser/lexer.rl" + begin + @act = 73; end + when 28 then +# line 1 "NONE" + begin + @te = p+1 + end +# line 1623 "lib/parser/lexer.rl" + begin + @act = 78; end + when 254 then +# line 1 "NONE" + begin + @te = p+1 + end +# line 1628 "lib/parser/lexer.rl" + begin + @act = 79; end + when 281 then +# line 1 "NONE" + begin + @te = p+1 + end +# line 1660 "lib/parser/lexer.rl" + begin + @act = 85; end + when 46 then +# line 1 "NONE" + begin + @te = p+1 + end +# line 1673 "lib/parser/lexer.rl" + begin + @act = 86; end + when 302 then +# line 1 "NONE" + begin + @te = p+1 + end +# line 1727 "lib/parser/lexer.rl" + begin + @act = 93; end + when 291 then +# line 1 "NONE" + begin + @te = p+1 + end +# line 1731 "lib/parser/lexer.rl" + begin + @act = 94; end + when 70 then +# line 1 "NONE" + begin + @te = p+1 + end +# line 1851 "lib/parser/lexer.rl" + begin + @act = 106; end + when 394 then +# line 1 "NONE" + begin + @te = p+1 + end +# line 1959 "lib/parser/lexer.rl" + begin + @act = 117; end + when 305 then +# line 1 "NONE" + begin + @te = p+1 + end +# line 2000 "lib/parser/lexer.rl" + begin + @act = 121; end + when 388 then +# line 1 "NONE" + begin + @te = p+1 + end +# line 2006 "lib/parser/lexer.rl" + begin + @act = 122; end + when 387 then +# line 1 "NONE" + begin + @te = p+1 + end +# line 2012 "lib/parser/lexer.rl" + begin + @act = 123; end + when 75 then +# line 1 "NONE" + begin + @te = p+1 + end +# line 2103 "lib/parser/lexer.rl" + begin + @act = 127; end + when 303 then +# line 1 "NONE" + begin + @te = p+1 + end +# line 1324 "lib/parser/lexer.rl" + begin + @act = 128; end + when 306 then +# line 1 "NONE" + begin + @te = p+1 + end +# line 2149 "lib/parser/lexer.rl" + begin + @act = 132; end + when 504 then +# line 1 "NONE" + begin + @te = p+1 + end +# line 2213 "lib/parser/lexer.rl" + begin + @act = 145; end + when 499 then +# line 1 "NONE" + begin + @te = p+1 + end +# line 2242 "lib/parser/lexer.rl" + begin + @act = 146; end + when 507 then +# line 1 "NONE" + begin + @te = p+1 + end +# line 2252 "lib/parser/lexer.rl" + begin + @act = 148; end + when 500 then +# line 1 "NONE" + begin + @te = p+1 + end +# line 2257 "lib/parser/lexer.rl" + begin + @act = 149; end + when 501 then +# line 1 "NONE" + begin + @te = p+1 + end +# line 2262 "lib/parser/lexer.rl" + begin + @act = 150; end + when 506 then +# line 1 "NONE" + begin + @te = p+1 + end +# line 2266 "lib/parser/lexer.rl" + begin + @act = 151; end + when 498 then +# line 1 "NONE" + begin + @te = p+1 + end +# line 2277 "lib/parser/lexer.rl" + begin + @act = 152; end + when 492 then +# line 1 "NONE" + begin + @te = p+1 + end +# line 2291 "lib/parser/lexer.rl" + begin + @act = 153; end + when 418 then +# line 1 "NONE" + begin + @te = p+1 + end +# line 2305 "lib/parser/lexer.rl" + begin + @act = 154; end + when 451 then +# line 1 "NONE" + begin + @te = p+1 + end +# line 2349 "lib/parser/lexer.rl" + begin + @act = 157; end + when 82 then +# line 1 "NONE" + begin + @te = p+1 + end +# line 2364 "lib/parser/lexer.rl" + begin + @act = 158; end + when 421 then +# line 1 "NONE" + begin + @te = p+1 + end +# line 2392 "lib/parser/lexer.rl" + begin + @act = 160; end + when 412 then +# line 1 "NONE" + begin + @te = p+1 + end +# line 1324 "lib/parser/lexer.rl" + begin + @act = 164; end + when 423 then +# line 1 "NONE" + begin + @te = p+1 + end +# line 2414 "lib/parser/lexer.rl" + begin + @act = 165; end + when 416 then +# line 1 "NONE" + begin + @te = p+1 + end +# line 2440 "lib/parser/lexer.rl" + begin + @act = 167; end + when 422 then +# line 1 "NONE" + begin + @te = p+1 + end +# line 2446 "lib/parser/lexer.rl" + begin + @act = 168; end + when 88 then +# line 1 "NONE" + begin + @te = p+1 + end +# line 2537 "lib/parser/lexer.rl" + begin + @act = 181; end + when 511 then +# line 1 "NONE" + begin + @te = p+1 + end +# line 2576 "lib/parser/lexer.rl" + begin + @act = 185; end + when 183 then +# line 498 "lib/parser/lexer.rl" + begin + + # Record position of a newline for precise location reporting on tNL + # tokens. + # + # This action is embedded directly into c_nl, as it is idempotent and + # there are no cases when we need to skip it. + @newline_s = p + end +# line 954 "lib/parser/lexer.rl" + begin + @te = p+1 + begin + current_literal = literal + if @te == pe + diagnostic :fatal, :string_eof, nil, + range(current_literal.str_s, current_literal.str_s + 1) + end + + if current_literal.heredoc? + line = tok(@herebody_s, @ts).gsub(/\r+$/, ''.freeze) + + if version?(18, 19, 20) + # See ruby:c48b4209c + line = line.gsub(/\r.*$/, ''.freeze) + end + + # Try ending the heredoc with the complete most recently + # scanned line. @herebody_s always refers to the start of such line. + if current_literal.nest_and_try_closing(line, @herebody_s, @ts) + # Adjust @herebody_s to point to the next line. + @herebody_s = @te + + # Continue regular lexing after the heredoc reference (<= 30 && (codepoint == 117 || codepoint == 85) # 'u' or 'U' + diagnostic :fatal, :invalid_escape + end + + if (@escape = ESCAPES[codepoint]).nil? + @escape = encode_escape(@source_buffer.slice(p - 1)) + end + end +# line 728 "lib/parser/lexer.rl" + begin + + @escape = encode_escape(@escape[0].ord & 0x9f) + end +# line 895 "lib/parser/lexer.rl" + begin + @te = p +p = p - 1; begin + current_literal = literal + # Get the first character after the backslash. + escaped_char = @source_buffer.slice(@escape_s).chr + + if current_literal.munge_escape? escaped_char + # If this particular literal uses this character as an opening + # or closing delimiter, it is an escape sequence for that + # particular character. Write it without the backslash. + + if current_literal.regexp? && REGEXP_META_CHARACTERS.match(escaped_char) + # Regular expressions should include escaped delimiters in their + # escaped form, except when the escaped character is + # a closing delimiter but not a regexp metacharacter. + # + # The backslash itself cannot be used as a closing delimiter + # at the same time as an escape symbol, but it is always munged, + # so this branch also executes for the non-closing-delimiter case + # for the backslash. + current_literal.extend_string(tok, @ts, @te) + else + current_literal.extend_string(escaped_char, @ts, @te) + end + else + # It does not. So this is an actual escape sequence, yay! + if current_literal.squiggly_heredoc? && escaped_char == "\n".freeze + # Squiggly heredocs like + # <<~-HERE + # 1\ + # 2 + # HERE + # treat '\' as a line continuation, but still dedent the body, so the heredoc above becomes "12\n". + # This information is emitted as is, without escaping, + # later this escape sequence (\\\n) gets handled manually in the Lexer::Dedenter + current_literal.extend_string(tok, @ts, @te) + elsif current_literal.supports_line_continuation_via_slash? && escaped_char == "\n".freeze + # Heredocs, regexp and a few other types of literals support line + # continuation via \\\n sequence. The code like + # "a\ + # b" + # must be parsed as "ab" + current_literal.extend_string(tok.gsub("\\\n".freeze, ''.freeze), @ts, @te) + elsif current_literal.regexp? && @version >= 31 && %w[c C m M].include?(escaped_char) + # Ruby >= 3.1 escapes \c- and \m chars, that's the only escape sequence + # supported by regexes so far, so it needs a separate branch. + current_literal.extend_string(@escape, @ts, @te) + elsif current_literal.regexp? + # Regular expressions should include escape sequences in their + # escaped form. On the other hand, escaped newlines are removed (in cases like "\\C-\\\n\\M-x") + current_literal.extend_string(tok.gsub("\\\n".freeze, ''.freeze), @ts, @te) + else + current_literal.extend_string(@escape || tok, @ts, @te) + end + end + end + end + when 155 then +# line 704 "lib/parser/lexer.rl" + begin + + codepoint = @source_pts[p - 1] + + if @version >= 30 && (codepoint == 117 || codepoint == 85) # 'u' or 'U' + diagnostic :fatal, :invalid_escape + end + + if (@escape = ESCAPES[codepoint]).nil? + @escape = encode_escape(@source_buffer.slice(p - 1)) + end + end +# line 728 "lib/parser/lexer.rl" + begin + + @escape = encode_escape(@escape[0].ord & 0x9f) + end +# line 895 "lib/parser/lexer.rl" + begin + @te = p +p = p - 1; begin + current_literal = literal + # Get the first character after the backslash. + escaped_char = @source_buffer.slice(@escape_s).chr + + if current_literal.munge_escape? escaped_char + # If this particular literal uses this character as an opening + # or closing delimiter, it is an escape sequence for that + # particular character. Write it without the backslash. + + if current_literal.regexp? && REGEXP_META_CHARACTERS.match(escaped_char) + # Regular expressions should include escaped delimiters in their + # escaped form, except when the escaped character is + # a closing delimiter but not a regexp metacharacter. + # + # The backslash itself cannot be used as a closing delimiter + # at the same time as an escape symbol, but it is always munged, + # so this branch also executes for the non-closing-delimiter case + # for the backslash. + current_literal.extend_string(tok, @ts, @te) + else + current_literal.extend_string(escaped_char, @ts, @te) + end + else + # It does not. So this is an actual escape sequence, yay! + if current_literal.squiggly_heredoc? && escaped_char == "\n".freeze + # Squiggly heredocs like + # <<~-HERE + # 1\ + # 2 + # HERE + # treat '\' as a line continuation, but still dedent the body, so the heredoc above becomes "12\n". + # This information is emitted as is, without escaping, + # later this escape sequence (\\\n) gets handled manually in the Lexer::Dedenter + current_literal.extend_string(tok, @ts, @te) + elsif current_literal.supports_line_continuation_via_slash? && escaped_char == "\n".freeze + # Heredocs, regexp and a few other types of literals support line + # continuation via \\\n sequence. The code like + # "a\ + # b" + # must be parsed as "ab" + current_literal.extend_string(tok.gsub("\\\n".freeze, ''.freeze), @ts, @te) + elsif current_literal.regexp? && @version >= 31 && %w[c C m M].include?(escaped_char) + # Ruby >= 3.1 escapes \c- and \m chars, that's the only escape sequence + # supported by regexes so far, so it needs a separate branch. + current_literal.extend_string(@escape, @ts, @te) + elsif current_literal.regexp? + # Regular expressions should include escape sequences in their + # escaped form. On the other hand, escaped newlines are removed (in cases like "\\C-\\\n\\M-x") + current_literal.extend_string(tok.gsub("\\\n".freeze, ''.freeze), @ts, @te) + else + current_literal.extend_string(@escape || tok, @ts, @te) + end + end + end + end + when 369 then +# line 704 "lib/parser/lexer.rl" + begin + + codepoint = @source_pts[p - 1] + + if @version >= 30 && (codepoint == 117 || codepoint == 85) # 'u' or 'U' + diagnostic :fatal, :invalid_escape + end + + if (@escape = ESCAPES[codepoint]).nil? + @escape = encode_escape(@source_buffer.slice(p - 1)) + end + end +# line 728 "lib/parser/lexer.rl" + begin + + @escape = encode_escape(@escape[0].ord & 0x9f) + end +# line 1918 "lib/parser/lexer.rl" + begin + @te = p +p = p - 1; begin + value = @escape || tok(@ts + 1) + + if version?(18) + emit(:tINTEGER, value.getbyte(0)) + else + emit(:tCHARACTER, value) + end + + @cs = 810; begin + p += 1 + _goto_level = _out + next + end + + end + end + when 131 then +# line 704 "lib/parser/lexer.rl" + begin + + codepoint = @source_pts[p - 1] + + if @version >= 30 && (codepoint == 117 || codepoint == 85) # 'u' or 'U' + diagnostic :fatal, :invalid_escape + end + + if (@escape = ESCAPES[codepoint]).nil? + @escape = encode_escape(@source_buffer.slice(p - 1)) + end + end +# line 732 "lib/parser/lexer.rl" + begin + + @escape = encode_escape(@escape[0].ord | 0x80) + end +# line 895 "lib/parser/lexer.rl" + begin + @te = p +p = p - 1; begin + current_literal = literal + # Get the first character after the backslash. + escaped_char = @source_buffer.slice(@escape_s).chr + + if current_literal.munge_escape? escaped_char + # If this particular literal uses this character as an opening + # or closing delimiter, it is an escape sequence for that + # particular character. Write it without the backslash. + + if current_literal.regexp? && REGEXP_META_CHARACTERS.match(escaped_char) + # Regular expressions should include escaped delimiters in their + # escaped form, except when the escaped character is + # a closing delimiter but not a regexp metacharacter. + # + # The backslash itself cannot be used as a closing delimiter + # at the same time as an escape symbol, but it is always munged, + # so this branch also executes for the non-closing-delimiter case + # for the backslash. + current_literal.extend_string(tok, @ts, @te) + else + current_literal.extend_string(escaped_char, @ts, @te) + end + else + # It does not. So this is an actual escape sequence, yay! + if current_literal.squiggly_heredoc? && escaped_char == "\n".freeze + # Squiggly heredocs like + # <<~-HERE + # 1\ + # 2 + # HERE + # treat '\' as a line continuation, but still dedent the body, so the heredoc above becomes "12\n". + # This information is emitted as is, without escaping, + # later this escape sequence (\\\n) gets handled manually in the Lexer::Dedenter + current_literal.extend_string(tok, @ts, @te) + elsif current_literal.supports_line_continuation_via_slash? && escaped_char == "\n".freeze + # Heredocs, regexp and a few other types of literals support line + # continuation via \\\n sequence. The code like + # "a\ + # b" + # must be parsed as "ab" + current_literal.extend_string(tok.gsub("\\\n".freeze, ''.freeze), @ts, @te) + elsif current_literal.regexp? && @version >= 31 && %w[c C m M].include?(escaped_char) + # Ruby >= 3.1 escapes \c- and \m chars, that's the only escape sequence + # supported by regexes so far, so it needs a separate branch. + current_literal.extend_string(@escape, @ts, @te) + elsif current_literal.regexp? + # Regular expressions should include escape sequences in their + # escaped form. On the other hand, escaped newlines are removed (in cases like "\\C-\\\n\\M-x") + current_literal.extend_string(tok.gsub("\\\n".freeze, ''.freeze), @ts, @te) + else + current_literal.extend_string(@escape || tok, @ts, @te) + end + end + end + end + when 162 then +# line 704 "lib/parser/lexer.rl" + begin + + codepoint = @source_pts[p - 1] + + if @version >= 30 && (codepoint == 117 || codepoint == 85) # 'u' or 'U' + diagnostic :fatal, :invalid_escape + end + + if (@escape = ESCAPES[codepoint]).nil? + @escape = encode_escape(@source_buffer.slice(p - 1)) + end + end +# line 732 "lib/parser/lexer.rl" + begin + + @escape = encode_escape(@escape[0].ord | 0x80) + end +# line 895 "lib/parser/lexer.rl" + begin + @te = p +p = p - 1; begin + current_literal = literal + # Get the first character after the backslash. + escaped_char = @source_buffer.slice(@escape_s).chr + + if current_literal.munge_escape? escaped_char + # If this particular literal uses this character as an opening + # or closing delimiter, it is an escape sequence for that + # particular character. Write it without the backslash. + + if current_literal.regexp? && REGEXP_META_CHARACTERS.match(escaped_char) + # Regular expressions should include escaped delimiters in their + # escaped form, except when the escaped character is + # a closing delimiter but not a regexp metacharacter. + # + # The backslash itself cannot be used as a closing delimiter + # at the same time as an escape symbol, but it is always munged, + # so this branch also executes for the non-closing-delimiter case + # for the backslash. + current_literal.extend_string(tok, @ts, @te) + else + current_literal.extend_string(escaped_char, @ts, @te) + end + else + # It does not. So this is an actual escape sequence, yay! + if current_literal.squiggly_heredoc? && escaped_char == "\n".freeze + # Squiggly heredocs like + # <<~-HERE + # 1\ + # 2 + # HERE + # treat '\' as a line continuation, but still dedent the body, so the heredoc above becomes "12\n". + # This information is emitted as is, without escaping, + # later this escape sequence (\\\n) gets handled manually in the Lexer::Dedenter + current_literal.extend_string(tok, @ts, @te) + elsif current_literal.supports_line_continuation_via_slash? && escaped_char == "\n".freeze + # Heredocs, regexp and a few other types of literals support line + # continuation via \\\n sequence. The code like + # "a\ + # b" + # must be parsed as "ab" + current_literal.extend_string(tok.gsub("\\\n".freeze, ''.freeze), @ts, @te) + elsif current_literal.regexp? && @version >= 31 && %w[c C m M].include?(escaped_char) + # Ruby >= 3.1 escapes \c- and \m chars, that's the only escape sequence + # supported by regexes so far, so it needs a separate branch. + current_literal.extend_string(@escape, @ts, @te) + elsif current_literal.regexp? + # Regular expressions should include escape sequences in their + # escaped form. On the other hand, escaped newlines are removed (in cases like "\\C-\\\n\\M-x") + current_literal.extend_string(tok.gsub("\\\n".freeze, ''.freeze), @ts, @te) + else + current_literal.extend_string(@escape || tok, @ts, @te) + end + end + end + end + when 376 then +# line 704 "lib/parser/lexer.rl" + begin + + codepoint = @source_pts[p - 1] + + if @version >= 30 && (codepoint == 117 || codepoint == 85) # 'u' or 'U' + diagnostic :fatal, :invalid_escape + end + + if (@escape = ESCAPES[codepoint]).nil? + @escape = encode_escape(@source_buffer.slice(p - 1)) + end + end +# line 732 "lib/parser/lexer.rl" + begin + + @escape = encode_escape(@escape[0].ord | 0x80) + end +# line 1918 "lib/parser/lexer.rl" + begin + @te = p +p = p - 1; begin + value = @escape || tok(@ts + 1) + + if version?(18) + emit(:tINTEGER, value.getbyte(0)) + else + emit(:tCHARACTER, value) + end + + @cs = 810; begin + p += 1 + _goto_level = _out + next + end + + end + end + when 122 then +# line 720 "lib/parser/lexer.rl" + begin + + @escape = @source_buffer.slice(p - 1).chr + + if @version >= 27 && ((0..8).include?(@escape.ord) || (14..31).include?(@escape.ord)) + diagnostic :fatal, :invalid_escape + end + end +# line 728 "lib/parser/lexer.rl" + begin + + @escape = encode_escape(@escape[0].ord & 0x9f) + end +# line 895 "lib/parser/lexer.rl" + begin + @te = p +p = p - 1; begin + current_literal = literal + # Get the first character after the backslash. + escaped_char = @source_buffer.slice(@escape_s).chr + + if current_literal.munge_escape? escaped_char + # If this particular literal uses this character as an opening + # or closing delimiter, it is an escape sequence for that + # particular character. Write it without the backslash. + + if current_literal.regexp? && REGEXP_META_CHARACTERS.match(escaped_char) + # Regular expressions should include escaped delimiters in their + # escaped form, except when the escaped character is + # a closing delimiter but not a regexp metacharacter. + # + # The backslash itself cannot be used as a closing delimiter + # at the same time as an escape symbol, but it is always munged, + # so this branch also executes for the non-closing-delimiter case + # for the backslash. + current_literal.extend_string(tok, @ts, @te) + else + current_literal.extend_string(escaped_char, @ts, @te) + end + else + # It does not. So this is an actual escape sequence, yay! + if current_literal.squiggly_heredoc? && escaped_char == "\n".freeze + # Squiggly heredocs like + # <<~-HERE + # 1\ + # 2 + # HERE + # treat '\' as a line continuation, but still dedent the body, so the heredoc above becomes "12\n". + # This information is emitted as is, without escaping, + # later this escape sequence (\\\n) gets handled manually in the Lexer::Dedenter + current_literal.extend_string(tok, @ts, @te) + elsif current_literal.supports_line_continuation_via_slash? && escaped_char == "\n".freeze + # Heredocs, regexp and a few other types of literals support line + # continuation via \\\n sequence. The code like + # "a\ + # b" + # must be parsed as "ab" + current_literal.extend_string(tok.gsub("\\\n".freeze, ''.freeze), @ts, @te) + elsif current_literal.regexp? && @version >= 31 && %w[c C m M].include?(escaped_char) + # Ruby >= 3.1 escapes \c- and \m chars, that's the only escape sequence + # supported by regexes so far, so it needs a separate branch. + current_literal.extend_string(@escape, @ts, @te) + elsif current_literal.regexp? + # Regular expressions should include escape sequences in their + # escaped form. On the other hand, escaped newlines are removed (in cases like "\\C-\\\n\\M-x") + current_literal.extend_string(tok.gsub("\\\n".freeze, ''.freeze), @ts, @te) + else + current_literal.extend_string(@escape || tok, @ts, @te) + end + end + end + end + when 153 then +# line 720 "lib/parser/lexer.rl" + begin + + @escape = @source_buffer.slice(p - 1).chr + + if @version >= 27 && ((0..8).include?(@escape.ord) || (14..31).include?(@escape.ord)) + diagnostic :fatal, :invalid_escape + end + end +# line 728 "lib/parser/lexer.rl" + begin + + @escape = encode_escape(@escape[0].ord & 0x9f) + end +# line 895 "lib/parser/lexer.rl" + begin + @te = p +p = p - 1; begin + current_literal = literal + # Get the first character after the backslash. + escaped_char = @source_buffer.slice(@escape_s).chr + + if current_literal.munge_escape? escaped_char + # If this particular literal uses this character as an opening + # or closing delimiter, it is an escape sequence for that + # particular character. Write it without the backslash. + + if current_literal.regexp? && REGEXP_META_CHARACTERS.match(escaped_char) + # Regular expressions should include escaped delimiters in their + # escaped form, except when the escaped character is + # a closing delimiter but not a regexp metacharacter. + # + # The backslash itself cannot be used as a closing delimiter + # at the same time as an escape symbol, but it is always munged, + # so this branch also executes for the non-closing-delimiter case + # for the backslash. + current_literal.extend_string(tok, @ts, @te) + else + current_literal.extend_string(escaped_char, @ts, @te) + end + else + # It does not. So this is an actual escape sequence, yay! + if current_literal.squiggly_heredoc? && escaped_char == "\n".freeze + # Squiggly heredocs like + # <<~-HERE + # 1\ + # 2 + # HERE + # treat '\' as a line continuation, but still dedent the body, so the heredoc above becomes "12\n". + # This information is emitted as is, without escaping, + # later this escape sequence (\\\n) gets handled manually in the Lexer::Dedenter + current_literal.extend_string(tok, @ts, @te) + elsif current_literal.supports_line_continuation_via_slash? && escaped_char == "\n".freeze + # Heredocs, regexp and a few other types of literals support line + # continuation via \\\n sequence. The code like + # "a\ + # b" + # must be parsed as "ab" + current_literal.extend_string(tok.gsub("\\\n".freeze, ''.freeze), @ts, @te) + elsif current_literal.regexp? && @version >= 31 && %w[c C m M].include?(escaped_char) + # Ruby >= 3.1 escapes \c- and \m chars, that's the only escape sequence + # supported by regexes so far, so it needs a separate branch. + current_literal.extend_string(@escape, @ts, @te) + elsif current_literal.regexp? + # Regular expressions should include escape sequences in their + # escaped form. On the other hand, escaped newlines are removed (in cases like "\\C-\\\n\\M-x") + current_literal.extend_string(tok.gsub("\\\n".freeze, ''.freeze), @ts, @te) + else + current_literal.extend_string(@escape || tok, @ts, @te) + end + end + end + end + when 367 then +# line 720 "lib/parser/lexer.rl" + begin + + @escape = @source_buffer.slice(p - 1).chr + + if @version >= 27 && ((0..8).include?(@escape.ord) || (14..31).include?(@escape.ord)) + diagnostic :fatal, :invalid_escape + end + end +# line 728 "lib/parser/lexer.rl" + begin + + @escape = encode_escape(@escape[0].ord & 0x9f) + end +# line 1918 "lib/parser/lexer.rl" + begin + @te = p +p = p - 1; begin + value = @escape || tok(@ts + 1) + + if version?(18) + emit(:tINTEGER, value.getbyte(0)) + else + emit(:tCHARACTER, value) + end + + @cs = 810; begin + p += 1 + _goto_level = _out + next + end + + end + end + when 130 then +# line 720 "lib/parser/lexer.rl" + begin + + @escape = @source_buffer.slice(p - 1).chr + + if @version >= 27 && ((0..8).include?(@escape.ord) || (14..31).include?(@escape.ord)) + diagnostic :fatal, :invalid_escape + end + end +# line 732 "lib/parser/lexer.rl" + begin + + @escape = encode_escape(@escape[0].ord | 0x80) + end +# line 895 "lib/parser/lexer.rl" + begin + @te = p +p = p - 1; begin + current_literal = literal + # Get the first character after the backslash. + escaped_char = @source_buffer.slice(@escape_s).chr + + if current_literal.munge_escape? escaped_char + # If this particular literal uses this character as an opening + # or closing delimiter, it is an escape sequence for that + # particular character. Write it without the backslash. + + if current_literal.regexp? && REGEXP_META_CHARACTERS.match(escaped_char) + # Regular expressions should include escaped delimiters in their + # escaped form, except when the escaped character is + # a closing delimiter but not a regexp metacharacter. + # + # The backslash itself cannot be used as a closing delimiter + # at the same time as an escape symbol, but it is always munged, + # so this branch also executes for the non-closing-delimiter case + # for the backslash. + current_literal.extend_string(tok, @ts, @te) + else + current_literal.extend_string(escaped_char, @ts, @te) + end + else + # It does not. So this is an actual escape sequence, yay! + if current_literal.squiggly_heredoc? && escaped_char == "\n".freeze + # Squiggly heredocs like + # <<~-HERE + # 1\ + # 2 + # HERE + # treat '\' as a line continuation, but still dedent the body, so the heredoc above becomes "12\n". + # This information is emitted as is, without escaping, + # later this escape sequence (\\\n) gets handled manually in the Lexer::Dedenter + current_literal.extend_string(tok, @ts, @te) + elsif current_literal.supports_line_continuation_via_slash? && escaped_char == "\n".freeze + # Heredocs, regexp and a few other types of literals support line + # continuation via \\\n sequence. The code like + # "a\ + # b" + # must be parsed as "ab" + current_literal.extend_string(tok.gsub("\\\n".freeze, ''.freeze), @ts, @te) + elsif current_literal.regexp? && @version >= 31 && %w[c C m M].include?(escaped_char) + # Ruby >= 3.1 escapes \c- and \m chars, that's the only escape sequence + # supported by regexes so far, so it needs a separate branch. + current_literal.extend_string(@escape, @ts, @te) + elsif current_literal.regexp? + # Regular expressions should include escape sequences in their + # escaped form. On the other hand, escaped newlines are removed (in cases like "\\C-\\\n\\M-x") + current_literal.extend_string(tok.gsub("\\\n".freeze, ''.freeze), @ts, @te) + else + current_literal.extend_string(@escape || tok, @ts, @te) + end + end + end + end + when 161 then +# line 720 "lib/parser/lexer.rl" + begin + + @escape = @source_buffer.slice(p - 1).chr + + if @version >= 27 && ((0..8).include?(@escape.ord) || (14..31).include?(@escape.ord)) + diagnostic :fatal, :invalid_escape + end + end +# line 732 "lib/parser/lexer.rl" + begin + + @escape = encode_escape(@escape[0].ord | 0x80) + end +# line 895 "lib/parser/lexer.rl" + begin + @te = p +p = p - 1; begin + current_literal = literal + # Get the first character after the backslash. + escaped_char = @source_buffer.slice(@escape_s).chr + + if current_literal.munge_escape? escaped_char + # If this particular literal uses this character as an opening + # or closing delimiter, it is an escape sequence for that + # particular character. Write it without the backslash. + + if current_literal.regexp? && REGEXP_META_CHARACTERS.match(escaped_char) + # Regular expressions should include escaped delimiters in their + # escaped form, except when the escaped character is + # a closing delimiter but not a regexp metacharacter. + # + # The backslash itself cannot be used as a closing delimiter + # at the same time as an escape symbol, but it is always munged, + # so this branch also executes for the non-closing-delimiter case + # for the backslash. + current_literal.extend_string(tok, @ts, @te) + else + current_literal.extend_string(escaped_char, @ts, @te) + end + else + # It does not. So this is an actual escape sequence, yay! + if current_literal.squiggly_heredoc? && escaped_char == "\n".freeze + # Squiggly heredocs like + # <<~-HERE + # 1\ + # 2 + # HERE + # treat '\' as a line continuation, but still dedent the body, so the heredoc above becomes "12\n". + # This information is emitted as is, without escaping, + # later this escape sequence (\\\n) gets handled manually in the Lexer::Dedenter + current_literal.extend_string(tok, @ts, @te) + elsif current_literal.supports_line_continuation_via_slash? && escaped_char == "\n".freeze + # Heredocs, regexp and a few other types of literals support line + # continuation via \\\n sequence. The code like + # "a\ + # b" + # must be parsed as "ab" + current_literal.extend_string(tok.gsub("\\\n".freeze, ''.freeze), @ts, @te) + elsif current_literal.regexp? && @version >= 31 && %w[c C m M].include?(escaped_char) + # Ruby >= 3.1 escapes \c- and \m chars, that's the only escape sequence + # supported by regexes so far, so it needs a separate branch. + current_literal.extend_string(@escape, @ts, @te) + elsif current_literal.regexp? + # Regular expressions should include escape sequences in their + # escaped form. On the other hand, escaped newlines are removed (in cases like "\\C-\\\n\\M-x") + current_literal.extend_string(tok.gsub("\\\n".freeze, ''.freeze), @ts, @te) + else + current_literal.extend_string(@escape || tok, @ts, @te) + end + end + end + end + when 375 then +# line 720 "lib/parser/lexer.rl" + begin + + @escape = @source_buffer.slice(p - 1).chr + + if @version >= 27 && ((0..8).include?(@escape.ord) || (14..31).include?(@escape.ord)) + diagnostic :fatal, :invalid_escape + end + end +# line 732 "lib/parser/lexer.rl" + begin + + @escape = encode_escape(@escape[0].ord | 0x80) + end +# line 1918 "lib/parser/lexer.rl" + begin + @te = p +p = p - 1; begin + value = @escape || tok(@ts + 1) + + if version?(18) + emit(:tINTEGER, value.getbyte(0)) + else + emit(:tCHARACTER, value) + end + + @cs = 810; begin + p += 1 + _goto_level = _out + next + end + + end + end + when 126 then +# line 744 "lib/parser/lexer.rl" + begin + @escape = "\x7f" end +# line 732 "lib/parser/lexer.rl" + begin + + @escape = encode_escape(@escape[0].ord | 0x80) + end +# line 895 "lib/parser/lexer.rl" + begin + @te = p +p = p - 1; begin + current_literal = literal + # Get the first character after the backslash. + escaped_char = @source_buffer.slice(@escape_s).chr + + if current_literal.munge_escape? escaped_char + # If this particular literal uses this character as an opening + # or closing delimiter, it is an escape sequence for that + # particular character. Write it without the backslash. + + if current_literal.regexp? && REGEXP_META_CHARACTERS.match(escaped_char) + # Regular expressions should include escaped delimiters in their + # escaped form, except when the escaped character is + # a closing delimiter but not a regexp metacharacter. + # + # The backslash itself cannot be used as a closing delimiter + # at the same time as an escape symbol, but it is always munged, + # so this branch also executes for the non-closing-delimiter case + # for the backslash. + current_literal.extend_string(tok, @ts, @te) + else + current_literal.extend_string(escaped_char, @ts, @te) + end + else + # It does not. So this is an actual escape sequence, yay! + if current_literal.squiggly_heredoc? && escaped_char == "\n".freeze + # Squiggly heredocs like + # <<~-HERE + # 1\ + # 2 + # HERE + # treat '\' as a line continuation, but still dedent the body, so the heredoc above becomes "12\n". + # This information is emitted as is, without escaping, + # later this escape sequence (\\\n) gets handled manually in the Lexer::Dedenter + current_literal.extend_string(tok, @ts, @te) + elsif current_literal.supports_line_continuation_via_slash? && escaped_char == "\n".freeze + # Heredocs, regexp and a few other types of literals support line + # continuation via \\\n sequence. The code like + # "a\ + # b" + # must be parsed as "ab" + current_literal.extend_string(tok.gsub("\\\n".freeze, ''.freeze), @ts, @te) + elsif current_literal.regexp? && @version >= 31 && %w[c C m M].include?(escaped_char) + # Ruby >= 3.1 escapes \c- and \m chars, that's the only escape sequence + # supported by regexes so far, so it needs a separate branch. + current_literal.extend_string(@escape, @ts, @te) + elsif current_literal.regexp? + # Regular expressions should include escape sequences in their + # escaped form. On the other hand, escaped newlines are removed (in cases like "\\C-\\\n\\M-x") + current_literal.extend_string(tok.gsub("\\\n".freeze, ''.freeze), @ts, @te) + else + current_literal.extend_string(@escape || tok, @ts, @te) + end + end + end + end + when 157 then +# line 744 "lib/parser/lexer.rl" + begin + @escape = "\x7f" end +# line 732 "lib/parser/lexer.rl" + begin + + @escape = encode_escape(@escape[0].ord | 0x80) + end +# line 895 "lib/parser/lexer.rl" + begin + @te = p +p = p - 1; begin + current_literal = literal + # Get the first character after the backslash. + escaped_char = @source_buffer.slice(@escape_s).chr + + if current_literal.munge_escape? escaped_char + # If this particular literal uses this character as an opening + # or closing delimiter, it is an escape sequence for that + # particular character. Write it without the backslash. + + if current_literal.regexp? && REGEXP_META_CHARACTERS.match(escaped_char) + # Regular expressions should include escaped delimiters in their + # escaped form, except when the escaped character is + # a closing delimiter but not a regexp metacharacter. + # + # The backslash itself cannot be used as a closing delimiter + # at the same time as an escape symbol, but it is always munged, + # so this branch also executes for the non-closing-delimiter case + # for the backslash. + current_literal.extend_string(tok, @ts, @te) + else + current_literal.extend_string(escaped_char, @ts, @te) + end + else + # It does not. So this is an actual escape sequence, yay! + if current_literal.squiggly_heredoc? && escaped_char == "\n".freeze + # Squiggly heredocs like + # <<~-HERE + # 1\ + # 2 + # HERE + # treat '\' as a line continuation, but still dedent the body, so the heredoc above becomes "12\n". + # This information is emitted as is, without escaping, + # later this escape sequence (\\\n) gets handled manually in the Lexer::Dedenter + current_literal.extend_string(tok, @ts, @te) + elsif current_literal.supports_line_continuation_via_slash? && escaped_char == "\n".freeze + # Heredocs, regexp and a few other types of literals support line + # continuation via \\\n sequence. The code like + # "a\ + # b" + # must be parsed as "ab" + current_literal.extend_string(tok.gsub("\\\n".freeze, ''.freeze), @ts, @te) + elsif current_literal.regexp? && @version >= 31 && %w[c C m M].include?(escaped_char) + # Ruby >= 3.1 escapes \c- and \m chars, that's the only escape sequence + # supported by regexes so far, so it needs a separate branch. + current_literal.extend_string(@escape, @ts, @te) + elsif current_literal.regexp? + # Regular expressions should include escape sequences in their + # escaped form. On the other hand, escaped newlines are removed (in cases like "\\C-\\\n\\M-x") + current_literal.extend_string(tok.gsub("\\\n".freeze, ''.freeze), @ts, @te) + else + current_literal.extend_string(@escape || tok, @ts, @te) + end + end + end + end + when 371 then +# line 744 "lib/parser/lexer.rl" + begin + @escape = "\x7f" end +# line 732 "lib/parser/lexer.rl" + begin + + @escape = encode_escape(@escape[0].ord | 0x80) + end +# line 1918 "lib/parser/lexer.rl" + begin + @te = p +p = p - 1; begin + value = @escape || tok(@ts + 1) + + if version?(18) + emit(:tINTEGER, value.getbyte(0)) + else + emit(:tCHARACTER, value) + end + + @cs = 810; begin + p += 1 + _goto_level = _out + next + end + + end + end + when 129 then +# line 745 "lib/parser/lexer.rl" + begin + @escape = encode_escape(tok(p - 2, p).to_i(16)) end +# line 728 "lib/parser/lexer.rl" + begin + + @escape = encode_escape(@escape[0].ord & 0x9f) + end +# line 895 "lib/parser/lexer.rl" + begin + @te = p +p = p - 1; begin + current_literal = literal + # Get the first character after the backslash. + escaped_char = @source_buffer.slice(@escape_s).chr + + if current_literal.munge_escape? escaped_char + # If this particular literal uses this character as an opening + # or closing delimiter, it is an escape sequence for that + # particular character. Write it without the backslash. + + if current_literal.regexp? && REGEXP_META_CHARACTERS.match(escaped_char) + # Regular expressions should include escaped delimiters in their + # escaped form, except when the escaped character is + # a closing delimiter but not a regexp metacharacter. + # + # The backslash itself cannot be used as a closing delimiter + # at the same time as an escape symbol, but it is always munged, + # so this branch also executes for the non-closing-delimiter case + # for the backslash. + current_literal.extend_string(tok, @ts, @te) + else + current_literal.extend_string(escaped_char, @ts, @te) + end + else + # It does not. So this is an actual escape sequence, yay! + if current_literal.squiggly_heredoc? && escaped_char == "\n".freeze + # Squiggly heredocs like + # <<~-HERE + # 1\ + # 2 + # HERE + # treat '\' as a line continuation, but still dedent the body, so the heredoc above becomes "12\n". + # This information is emitted as is, without escaping, + # later this escape sequence (\\\n) gets handled manually in the Lexer::Dedenter + current_literal.extend_string(tok, @ts, @te) + elsif current_literal.supports_line_continuation_via_slash? && escaped_char == "\n".freeze + # Heredocs, regexp and a few other types of literals support line + # continuation via \\\n sequence. The code like + # "a\ + # b" + # must be parsed as "ab" + current_literal.extend_string(tok.gsub("\\\n".freeze, ''.freeze), @ts, @te) + elsif current_literal.regexp? && @version >= 31 && %w[c C m M].include?(escaped_char) + # Ruby >= 3.1 escapes \c- and \m chars, that's the only escape sequence + # supported by regexes so far, so it needs a separate branch. + current_literal.extend_string(@escape, @ts, @te) + elsif current_literal.regexp? + # Regular expressions should include escape sequences in their + # escaped form. On the other hand, escaped newlines are removed (in cases like "\\C-\\\n\\M-x") + current_literal.extend_string(tok.gsub("\\\n".freeze, ''.freeze), @ts, @te) + else + current_literal.extend_string(@escape || tok, @ts, @te) + end + end + end + end + when 160 then +# line 745 "lib/parser/lexer.rl" + begin + @escape = encode_escape(tok(p - 2, p).to_i(16)) end +# line 728 "lib/parser/lexer.rl" + begin + + @escape = encode_escape(@escape[0].ord & 0x9f) + end +# line 895 "lib/parser/lexer.rl" + begin + @te = p +p = p - 1; begin + current_literal = literal + # Get the first character after the backslash. + escaped_char = @source_buffer.slice(@escape_s).chr + + if current_literal.munge_escape? escaped_char + # If this particular literal uses this character as an opening + # or closing delimiter, it is an escape sequence for that + # particular character. Write it without the backslash. + + if current_literal.regexp? && REGEXP_META_CHARACTERS.match(escaped_char) + # Regular expressions should include escaped delimiters in their + # escaped form, except when the escaped character is + # a closing delimiter but not a regexp metacharacter. + # + # The backslash itself cannot be used as a closing delimiter + # at the same time as an escape symbol, but it is always munged, + # so this branch also executes for the non-closing-delimiter case + # for the backslash. + current_literal.extend_string(tok, @ts, @te) + else + current_literal.extend_string(escaped_char, @ts, @te) + end + else + # It does not. So this is an actual escape sequence, yay! + if current_literal.squiggly_heredoc? && escaped_char == "\n".freeze + # Squiggly heredocs like + # <<~-HERE + # 1\ + # 2 + # HERE + # treat '\' as a line continuation, but still dedent the body, so the heredoc above becomes "12\n". + # This information is emitted as is, without escaping, + # later this escape sequence (\\\n) gets handled manually in the Lexer::Dedenter + current_literal.extend_string(tok, @ts, @te) + elsif current_literal.supports_line_continuation_via_slash? && escaped_char == "\n".freeze + # Heredocs, regexp and a few other types of literals support line + # continuation via \\\n sequence. The code like + # "a\ + # b" + # must be parsed as "ab" + current_literal.extend_string(tok.gsub("\\\n".freeze, ''.freeze), @ts, @te) + elsif current_literal.regexp? && @version >= 31 && %w[c C m M].include?(escaped_char) + # Ruby >= 3.1 escapes \c- and \m chars, that's the only escape sequence + # supported by regexes so far, so it needs a separate branch. + current_literal.extend_string(@escape, @ts, @te) + elsif current_literal.regexp? + # Regular expressions should include escape sequences in their + # escaped form. On the other hand, escaped newlines are removed (in cases like "\\C-\\\n\\M-x") + current_literal.extend_string(tok.gsub("\\\n".freeze, ''.freeze), @ts, @te) + else + current_literal.extend_string(@escape || tok, @ts, @te) + end + end + end + end + when 374 then +# line 745 "lib/parser/lexer.rl" + begin + @escape = encode_escape(tok(p - 2, p).to_i(16)) end +# line 728 "lib/parser/lexer.rl" + begin + + @escape = encode_escape(@escape[0].ord & 0x9f) + end +# line 1918 "lib/parser/lexer.rl" + begin + @te = p +p = p - 1; begin + value = @escape || tok(@ts + 1) + + if version?(18) + emit(:tINTEGER, value.getbyte(0)) + else + emit(:tCHARACTER, value) + end + + @cs = 810; begin + p += 1 + _goto_level = _out + next + end + + end + end + when 136 then +# line 776 "lib/parser/lexer.rl" + begin + + diagnostic :fatal, :invalid_unicode_escape, nil, range(@escape_s - 1, p) + end +# line 790 "lib/parser/lexer.rl" + begin + + diagnostic :fatal, :unterminated_unicode, nil, range(p - 1, p) + end +# line 895 "lib/parser/lexer.rl" + begin + @te = p +p = p - 1; begin + current_literal = literal + # Get the first character after the backslash. + escaped_char = @source_buffer.slice(@escape_s).chr + + if current_literal.munge_escape? escaped_char + # If this particular literal uses this character as an opening + # or closing delimiter, it is an escape sequence for that + # particular character. Write it without the backslash. + + if current_literal.regexp? && REGEXP_META_CHARACTERS.match(escaped_char) + # Regular expressions should include escaped delimiters in their + # escaped form, except when the escaped character is + # a closing delimiter but not a regexp metacharacter. + # + # The backslash itself cannot be used as a closing delimiter + # at the same time as an escape symbol, but it is always munged, + # so this branch also executes for the non-closing-delimiter case + # for the backslash. + current_literal.extend_string(tok, @ts, @te) + else + current_literal.extend_string(escaped_char, @ts, @te) + end + else + # It does not. So this is an actual escape sequence, yay! + if current_literal.squiggly_heredoc? && escaped_char == "\n".freeze + # Squiggly heredocs like + # <<~-HERE + # 1\ + # 2 + # HERE + # treat '\' as a line continuation, but still dedent the body, so the heredoc above becomes "12\n". + # This information is emitted as is, without escaping, + # later this escape sequence (\\\n) gets handled manually in the Lexer::Dedenter + current_literal.extend_string(tok, @ts, @te) + elsif current_literal.supports_line_continuation_via_slash? && escaped_char == "\n".freeze + # Heredocs, regexp and a few other types of literals support line + # continuation via \\\n sequence. The code like + # "a\ + # b" + # must be parsed as "ab" + current_literal.extend_string(tok.gsub("\\\n".freeze, ''.freeze), @ts, @te) + elsif current_literal.regexp? && @version >= 31 && %w[c C m M].include?(escaped_char) + # Ruby >= 3.1 escapes \c- and \m chars, that's the only escape sequence + # supported by regexes so far, so it needs a separate branch. + current_literal.extend_string(@escape, @ts, @te) + elsif current_literal.regexp? + # Regular expressions should include escape sequences in their + # escaped form. On the other hand, escaped newlines are removed (in cases like "\\C-\\\n\\M-x") + current_literal.extend_string(tok.gsub("\\\n".freeze, ''.freeze), @ts, @te) + else + current_literal.extend_string(@escape || tok, @ts, @te) + end + end + end + end + when 167 then +# line 776 "lib/parser/lexer.rl" + begin + + diagnostic :fatal, :invalid_unicode_escape, nil, range(@escape_s - 1, p) + end +# line 790 "lib/parser/lexer.rl" + begin + + diagnostic :fatal, :unterminated_unicode, nil, range(p - 1, p) + end +# line 895 "lib/parser/lexer.rl" + begin + @te = p +p = p - 1; begin + current_literal = literal + # Get the first character after the backslash. + escaped_char = @source_buffer.slice(@escape_s).chr + + if current_literal.munge_escape? escaped_char + # If this particular literal uses this character as an opening + # or closing delimiter, it is an escape sequence for that + # particular character. Write it without the backslash. + + if current_literal.regexp? && REGEXP_META_CHARACTERS.match(escaped_char) + # Regular expressions should include escaped delimiters in their + # escaped form, except when the escaped character is + # a closing delimiter but not a regexp metacharacter. + # + # The backslash itself cannot be used as a closing delimiter + # at the same time as an escape symbol, but it is always munged, + # so this branch also executes for the non-closing-delimiter case + # for the backslash. + current_literal.extend_string(tok, @ts, @te) + else + current_literal.extend_string(escaped_char, @ts, @te) + end + else + # It does not. So this is an actual escape sequence, yay! + if current_literal.squiggly_heredoc? && escaped_char == "\n".freeze + # Squiggly heredocs like + # <<~-HERE + # 1\ + # 2 + # HERE + # treat '\' as a line continuation, but still dedent the body, so the heredoc above becomes "12\n". + # This information is emitted as is, without escaping, + # later this escape sequence (\\\n) gets handled manually in the Lexer::Dedenter + current_literal.extend_string(tok, @ts, @te) + elsif current_literal.supports_line_continuation_via_slash? && escaped_char == "\n".freeze + # Heredocs, regexp and a few other types of literals support line + # continuation via \\\n sequence. The code like + # "a\ + # b" + # must be parsed as "ab" + current_literal.extend_string(tok.gsub("\\\n".freeze, ''.freeze), @ts, @te) + elsif current_literal.regexp? && @version >= 31 && %w[c C m M].include?(escaped_char) + # Ruby >= 3.1 escapes \c- and \m chars, that's the only escape sequence + # supported by regexes so far, so it needs a separate branch. + current_literal.extend_string(@escape, @ts, @te) + elsif current_literal.regexp? + # Regular expressions should include escape sequences in their + # escaped form. On the other hand, escaped newlines are removed (in cases like "\\C-\\\n\\M-x") + current_literal.extend_string(tok.gsub("\\\n".freeze, ''.freeze), @ts, @te) + else + current_literal.extend_string(@escape || tok, @ts, @te) + end + end + end + end + when 381 then +# line 776 "lib/parser/lexer.rl" + begin + + diagnostic :fatal, :invalid_unicode_escape, nil, range(@escape_s - 1, p) + end +# line 790 "lib/parser/lexer.rl" + begin + + diagnostic :fatal, :unterminated_unicode, nil, range(p - 1, p) + end +# line 1918 "lib/parser/lexer.rl" + begin + @te = p +p = p - 1; begin + value = @escape || tok(@ts + 1) + + if version?(18) + emit(:tINTEGER, value.getbyte(0)) + else + emit(:tCHARACTER, value) + end + + @cs = 810; begin + p += 1 + _goto_level = _out + next + end + + end + end + when 116 then +# line 822 "lib/parser/lexer.rl" + begin + + @escape_s = p + @escape = nil + end +# line 816 "lib/parser/lexer.rl" + begin + + diagnostic :fatal, :escape_eof, nil, range(p - 1, p) + end +# line 895 "lib/parser/lexer.rl" + begin + @te = p +p = p - 1; begin + current_literal = literal + # Get the first character after the backslash. + escaped_char = @source_buffer.slice(@escape_s).chr + + if current_literal.munge_escape? escaped_char + # If this particular literal uses this character as an opening + # or closing delimiter, it is an escape sequence for that + # particular character. Write it without the backslash. + + if current_literal.regexp? && REGEXP_META_CHARACTERS.match(escaped_char) + # Regular expressions should include escaped delimiters in their + # escaped form, except when the escaped character is + # a closing delimiter but not a regexp metacharacter. + # + # The backslash itself cannot be used as a closing delimiter + # at the same time as an escape symbol, but it is always munged, + # so this branch also executes for the non-closing-delimiter case + # for the backslash. + current_literal.extend_string(tok, @ts, @te) + else + current_literal.extend_string(escaped_char, @ts, @te) + end + else + # It does not. So this is an actual escape sequence, yay! + if current_literal.squiggly_heredoc? && escaped_char == "\n".freeze + # Squiggly heredocs like + # <<~-HERE + # 1\ + # 2 + # HERE + # treat '\' as a line continuation, but still dedent the body, so the heredoc above becomes "12\n". + # This information is emitted as is, without escaping, + # later this escape sequence (\\\n) gets handled manually in the Lexer::Dedenter + current_literal.extend_string(tok, @ts, @te) + elsif current_literal.supports_line_continuation_via_slash? && escaped_char == "\n".freeze + # Heredocs, regexp and a few other types of literals support line + # continuation via \\\n sequence. The code like + # "a\ + # b" + # must be parsed as "ab" + current_literal.extend_string(tok.gsub("\\\n".freeze, ''.freeze), @ts, @te) + elsif current_literal.regexp? && @version >= 31 && %w[c C m M].include?(escaped_char) + # Ruby >= 3.1 escapes \c- and \m chars, that's the only escape sequence + # supported by regexes so far, so it needs a separate branch. + current_literal.extend_string(@escape, @ts, @te) + elsif current_literal.regexp? + # Regular expressions should include escape sequences in their + # escaped form. On the other hand, escaped newlines are removed (in cases like "\\C-\\\n\\M-x") + current_literal.extend_string(tok.gsub("\\\n".freeze, ''.freeze), @ts, @te) + else + current_literal.extend_string(@escape || tok, @ts, @te) + end + end + end + end + when 148 then +# line 822 "lib/parser/lexer.rl" + begin + + @escape_s = p + @escape = nil + end +# line 816 "lib/parser/lexer.rl" + begin + + diagnostic :fatal, :escape_eof, nil, range(p - 1, p) + end +# line 895 "lib/parser/lexer.rl" + begin + @te = p +p = p - 1; begin + current_literal = literal + # Get the first character after the backslash. + escaped_char = @source_buffer.slice(@escape_s).chr + + if current_literal.munge_escape? escaped_char + # If this particular literal uses this character as an opening + # or closing delimiter, it is an escape sequence for that + # particular character. Write it without the backslash. + + if current_literal.regexp? && REGEXP_META_CHARACTERS.match(escaped_char) + # Regular expressions should include escaped delimiters in their + # escaped form, except when the escaped character is + # a closing delimiter but not a regexp metacharacter. + # + # The backslash itself cannot be used as a closing delimiter + # at the same time as an escape symbol, but it is always munged, + # so this branch also executes for the non-closing-delimiter case + # for the backslash. + current_literal.extend_string(tok, @ts, @te) + else + current_literal.extend_string(escaped_char, @ts, @te) + end + else + # It does not. So this is an actual escape sequence, yay! + if current_literal.squiggly_heredoc? && escaped_char == "\n".freeze + # Squiggly heredocs like + # <<~-HERE + # 1\ + # 2 + # HERE + # treat '\' as a line continuation, but still dedent the body, so the heredoc above becomes "12\n". + # This information is emitted as is, without escaping, + # later this escape sequence (\\\n) gets handled manually in the Lexer::Dedenter + current_literal.extend_string(tok, @ts, @te) + elsif current_literal.supports_line_continuation_via_slash? && escaped_char == "\n".freeze + # Heredocs, regexp and a few other types of literals support line + # continuation via \\\n sequence. The code like + # "a\ + # b" + # must be parsed as "ab" + current_literal.extend_string(tok.gsub("\\\n".freeze, ''.freeze), @ts, @te) + elsif current_literal.regexp? && @version >= 31 && %w[c C m M].include?(escaped_char) + # Ruby >= 3.1 escapes \c- and \m chars, that's the only escape sequence + # supported by regexes so far, so it needs a separate branch. + current_literal.extend_string(@escape, @ts, @te) + elsif current_literal.regexp? + # Regular expressions should include escape sequences in their + # escaped form. On the other hand, escaped newlines are removed (in cases like "\\C-\\\n\\M-x") + current_literal.extend_string(tok.gsub("\\\n".freeze, ''.freeze), @ts, @te) + else + current_literal.extend_string(@escape || tok, @ts, @te) + end + end + end + end + when 362 then +# line 822 "lib/parser/lexer.rl" + begin + + @escape_s = p + @escape = nil + end +# line 816 "lib/parser/lexer.rl" + begin + + diagnostic :fatal, :escape_eof, nil, range(p - 1, p) + end +# line 1918 "lib/parser/lexer.rl" + begin + @te = p +p = p - 1; begin + value = @escape || tok(@ts + 1) + + if version?(18) + emit(:tINTEGER, value.getbyte(0)) + else + emit(:tCHARACTER, value) + end + + @cs = 810; begin + p += 1 + _goto_level = _out + next + end + + end + end + when 62 then +# line 1226 "lib/parser/lexer.rl" + begin + @sharp_s = p - 1 end +# line 1229 "lib/parser/lexer.rl" + begin + emit_comment(@sharp_s, p == pe ? p - 2 : p) end +# line 498 "lib/parser/lexer.rl" + begin + + # Record position of a newline for precise location reporting on tNL + # tokens. + # + # This action is embedded directly into c_nl, as it is idempotent and + # there are no cases when we need to skip it. + @newline_s = p + end + when 221 then +# line 1226 "lib/parser/lexer.rl" + begin + @sharp_s = p - 1 end +# line 1229 "lib/parser/lexer.rl" + begin + emit_comment(@sharp_s, p == pe ? p - 2 : p) end +# line 1424 "lib/parser/lexer.rl" + begin + @te = p +p = p - 1; end + when 236 then +# line 1226 "lib/parser/lexer.rl" + begin + @sharp_s = p - 1 end +# line 1229 "lib/parser/lexer.rl" + begin + emit_comment(@sharp_s, p == pe ? p - 2 : p) end +# line 1454 "lib/parser/lexer.rl" + begin + @te = p +p = p - 1; end + when 248 then +# line 1226 "lib/parser/lexer.rl" + begin + @sharp_s = p - 1 end +# line 1229 "lib/parser/lexer.rl" + begin + emit_comment(@sharp_s, p == pe ? p - 2 : p) end +# line 1486 "lib/parser/lexer.rl" + begin + @te = p +p = p - 1; end + when 270 then +# line 1226 "lib/parser/lexer.rl" + begin + @sharp_s = p - 1 end +# line 1229 "lib/parser/lexer.rl" + begin + emit_comment(@sharp_s, p == pe ? p - 2 : p) end +# line 1631 "lib/parser/lexer.rl" + begin + @te = p +p = p - 1; begin begin + @cs = 810 + _goto_level = _again + next + end + end + end + when 285 then +# line 1226 "lib/parser/lexer.rl" + begin + @sharp_s = p - 1 end +# line 1229 "lib/parser/lexer.rl" + begin + emit_comment(@sharp_s, p == pe ? p - 2 : p) end +# line 1712 "lib/parser/lexer.rl" + begin + @te = p +p = p - 1; end + when 297 then +# line 1226 "lib/parser/lexer.rl" + begin + @sharp_s = p - 1 end +# line 1229 "lib/parser/lexer.rl" + begin + emit_comment(@sharp_s, p == pe ? p - 2 : p) end +# line 1733 "lib/parser/lexer.rl" + begin + @te = p +p = p - 1; end + when 323 then +# line 1226 "lib/parser/lexer.rl" + begin + @sharp_s = p - 1 end +# line 1229 "lib/parser/lexer.rl" + begin + emit_comment(@sharp_s, p == pe ? p - 2 : p) end +# line 2130 "lib/parser/lexer.rl" + begin + @te = p +p = p - 1; end + when 399 then +# line 1226 "lib/parser/lexer.rl" + begin + @sharp_s = p - 1 end +# line 1229 "lib/parser/lexer.rl" + begin + emit_comment(@sharp_s, p == pe ? p - 2 : p) end +# line 2157 "lib/parser/lexer.rl" + begin + @te = p +p = p - 1; end + when 409 then +# line 1226 "lib/parser/lexer.rl" + begin + @sharp_s = p - 1 end +# line 1229 "lib/parser/lexer.rl" + begin + emit_comment(@sharp_s, p == pe ? p - 2 : p) end +# line 2188 "lib/parser/lexer.rl" + begin + @te = p +p = p - 1; end + when 430 then +# line 1226 "lib/parser/lexer.rl" + begin + @sharp_s = p - 1 end +# line 1229 "lib/parser/lexer.rl" + begin + emit_comment(@sharp_s, p == pe ? p - 2 : p) end +# line 2505 "lib/parser/lexer.rl" + begin + @te = p +p = p - 1; end + when 102 then +# line 1226 "lib/parser/lexer.rl" + begin + @sharp_s = p - 1 end +# line 1229 "lib/parser/lexer.rl" + begin + emit_comment(@sharp_s, p == pe ? p - 2 : p) end +# line 2601 "lib/parser/lexer.rl" + begin + @te = p +p = p - 1; end + when 482 then +# line 2302 "lib/parser/lexer.rl" + begin + @num_base = 10; @num_digits_s = @ts end +# line 2304 "lib/parser/lexer.rl" + begin + @num_suffix_s = p end +# line 632 "lib/parser/lexer.rl" + begin + @num_xfrm = lambda { |chars| emit(:tINTEGER, chars) } end + when 446 then +# line 2303 "lib/parser/lexer.rl" + begin + @num_base = 8; @num_digits_s = @ts end +# line 2304 "lib/parser/lexer.rl" + begin + @num_suffix_s = p end +# line 632 "lib/parser/lexer.rl" + begin + @num_xfrm = lambda { |chars| emit(:tINTEGER, chars) } end + when 461 then +# line 2304 "lib/parser/lexer.rl" + begin + @num_suffix_s = p end +# line 632 "lib/parser/lexer.rl" + begin + @num_xfrm = lambda { |chars| emit(:tINTEGER, chars) } end +# line 2305 "lib/parser/lexer.rl" + begin + @te = p +p = p - 1; begin + digits = tok(@num_digits_s, @num_suffix_s) + + if digits.end_with? '_'.freeze + diagnostic :error, :trailing_in_number, { :character => '_'.freeze }, + range(@te - 1, @te) + elsif digits.empty? && @num_base == 8 && version?(18) + # 1.8 did not raise an error on 0o. + digits = '0'.freeze + elsif digits.empty? + diagnostic :error, :empty_numeric + elsif @num_base == 8 && (invalid_idx = digits.index(/[89]/)) + invalid_s = @num_digits_s + invalid_idx + diagnostic :error, :invalid_octal, nil, + range(invalid_s, invalid_s + 1) + end + + if version?(18, 19, 20) + emit(:tINTEGER, digits.to_i(@num_base), @ts, @num_suffix_s) + p = @num_suffix_s - 1 + else + @num_xfrm.call(digits.to_i(@num_base)) + end + begin + p += 1 + _goto_level = _out + next + end + + end + end + when 454 then +# line 2361 "lib/parser/lexer.rl" + begin + @num_suffix_s = p end +# line 641 "lib/parser/lexer.rl" + begin + @num_xfrm = lambda { |chars| emit(:tFLOAT, Float(chars)) } end +# line 2364 "lib/parser/lexer.rl" + begin + @te = p +p = p - 1; begin + digits = tok(@ts, @num_suffix_s) + + if version?(18, 19, 20) + emit(:tFLOAT, Float(digits), @ts, @num_suffix_s) + p = @num_suffix_s - 1 + else + @num_xfrm.call(digits) + end + begin + p += 1 + _goto_level = _out + next + end + + end + end + when 450 then +# line 2362 "lib/parser/lexer.rl" + begin + @num_suffix_s = p end +# line 641 "lib/parser/lexer.rl" + begin + @num_xfrm = lambda { |chars| emit(:tFLOAT, Float(chars)) } end +# line 2364 "lib/parser/lexer.rl" + begin + @te = p +p = p - 1; begin + digits = tok(@ts, @num_suffix_s) + + if version?(18, 19, 20) + emit(:tFLOAT, Float(digits), @ts, @num_suffix_s) + p = @num_suffix_s - 1 + else + @num_xfrm.call(digits) + end + begin + p += 1 + _goto_level = _out + next + end + + end + end + when 276 then +# line 1 "NONE" + begin + @te = p+1 + end +# line 498 "lib/parser/lexer.rl" + begin + + # Record position of a newline for precise location reporting on tNL + # tokens. + # + # This action is embedded directly into c_nl, as it is idempotent and + # there are no cases when we need to skip it. + @newline_s = p + end +# line 1628 "lib/parser/lexer.rl" + begin + @act = 79; end + when 36 then +# line 1 "NONE" + begin + @te = p+1 + end +# line 862 "lib/parser/lexer.rl" + begin + + # After every heredoc was parsed, @herebody_s contains the + # position of next token after all heredocs. + if @herebody_s + p = @herebody_s + @herebody_s = nil + end + end +# line 1623 "lib/parser/lexer.rl" + begin + @act = 78; end + when 47 then +# line 1 "NONE" + begin + @te = p+1 + end +# line 862 "lib/parser/lexer.rl" + begin + + # After every heredoc was parsed, @herebody_s contains the + # position of next token after all heredocs. + if @herebody_s + p = @herebody_s + @herebody_s = nil + end + end +# line 1673 "lib/parser/lexer.rl" + begin + @act = 86; end + when 94 then +# line 1 "NONE" + begin + @te = p+1 + end +# line 862 "lib/parser/lexer.rl" + begin + + # After every heredoc was parsed, @herebody_s contains the + # position of next token after all heredocs. + if @herebody_s + p = @herebody_s + @herebody_s = nil + end + end +# line 2537 "lib/parser/lexer.rl" + begin + @act = 181; end + when 66 then +# line 1 "NONE" + begin + @te = p+1 + end +# line 1229 "lib/parser/lexer.rl" + begin + emit_comment(@sharp_s, p == pe ? p - 2 : p) end +# line 1754 "lib/parser/lexer.rl" + begin + @act = 99; end + when 85 then +# line 1 "NONE" + begin + @te = p+1 + end +# line 1229 "lib/parser/lexer.rl" + begin + emit_comment(@sharp_s, p == pe ? p - 2 : p) end +# line 2246 "lib/parser/lexer.rl" + begin + @act = 147; end + when 93 then +# line 1 "NONE" + begin + @te = p+1 + end +# line 1229 "lib/parser/lexer.rl" + begin + emit_comment(@sharp_s, p == pe ? p - 2 : p) end +# line 2537 "lib/parser/lexer.rl" + begin + @act = 181; end + when 38 then +# line 1 "NONE" + begin + @te = p+1 + end +# line 1583 "lib/parser/lexer.rl" + begin + tm = p end +# line 1584 "lib/parser/lexer.rl" + begin + @act = 73; end + when 391 then +# line 1 "NONE" + begin + @te = p+1 + end +# line 2005 "lib/parser/lexer.rl" + begin + tm = p end +# line 2103 "lib/parser/lexer.rl" + begin + @act = 127; end + when 390 then +# line 1 "NONE" + begin + @te = p+1 + end +# line 2005 "lib/parser/lexer.rl" + begin + tm = p end +# line 1324 "lib/parser/lexer.rl" + begin + @act = 128; end + when 483 then +# line 1 "NONE" + begin + @te = p+1 + end +# line 2302 "lib/parser/lexer.rl" + begin + @num_base = 10; @num_digits_s = @ts end +# line 2305 "lib/parser/lexer.rl" + begin + @act = 154; end + when 127 then +# line 704 "lib/parser/lexer.rl" + begin + + codepoint = @source_pts[p - 1] + + if @version >= 30 && (codepoint == 117 || codepoint == 85) # 'u' or 'U' + diagnostic :fatal, :invalid_escape + end + + if (@escape = ESCAPES[codepoint]).nil? + @escape = encode_escape(@source_buffer.slice(p - 1)) + end + end +# line 728 "lib/parser/lexer.rl" + begin + + @escape = encode_escape(@escape[0].ord & 0x9f) + end +# line 732 "lib/parser/lexer.rl" + begin + + @escape = encode_escape(@escape[0].ord | 0x80) + end +# line 895 "lib/parser/lexer.rl" + begin + @te = p +p = p - 1; begin + current_literal = literal + # Get the first character after the backslash. + escaped_char = @source_buffer.slice(@escape_s).chr + + if current_literal.munge_escape? escaped_char + # If this particular literal uses this character as an opening + # or closing delimiter, it is an escape sequence for that + # particular character. Write it without the backslash. + + if current_literal.regexp? && REGEXP_META_CHARACTERS.match(escaped_char) + # Regular expressions should include escaped delimiters in their + # escaped form, except when the escaped character is + # a closing delimiter but not a regexp metacharacter. + # + # The backslash itself cannot be used as a closing delimiter + # at the same time as an escape symbol, but it is always munged, + # so this branch also executes for the non-closing-delimiter case + # for the backslash. + current_literal.extend_string(tok, @ts, @te) + else + current_literal.extend_string(escaped_char, @ts, @te) + end + else + # It does not. So this is an actual escape sequence, yay! + if current_literal.squiggly_heredoc? && escaped_char == "\n".freeze + # Squiggly heredocs like + # <<~-HERE + # 1\ + # 2 + # HERE + # treat '\' as a line continuation, but still dedent the body, so the heredoc above becomes "12\n". + # This information is emitted as is, without escaping, + # later this escape sequence (\\\n) gets handled manually in the Lexer::Dedenter + current_literal.extend_string(tok, @ts, @te) + elsif current_literal.supports_line_continuation_via_slash? && escaped_char == "\n".freeze + # Heredocs, regexp and a few other types of literals support line + # continuation via \\\n sequence. The code like + # "a\ + # b" + # must be parsed as "ab" + current_literal.extend_string(tok.gsub("\\\n".freeze, ''.freeze), @ts, @te) + elsif current_literal.regexp? && @version >= 31 && %w[c C m M].include?(escaped_char) + # Ruby >= 3.1 escapes \c- and \m chars, that's the only escape sequence + # supported by regexes so far, so it needs a separate branch. + current_literal.extend_string(@escape, @ts, @te) + elsif current_literal.regexp? + # Regular expressions should include escape sequences in their + # escaped form. On the other hand, escaped newlines are removed (in cases like "\\C-\\\n\\M-x") + current_literal.extend_string(tok.gsub("\\\n".freeze, ''.freeze), @ts, @te) + else + current_literal.extend_string(@escape || tok, @ts, @te) + end + end + end + end + when 158 then +# line 704 "lib/parser/lexer.rl" + begin + + codepoint = @source_pts[p - 1] + + if @version >= 30 && (codepoint == 117 || codepoint == 85) # 'u' or 'U' + diagnostic :fatal, :invalid_escape + end + + if (@escape = ESCAPES[codepoint]).nil? + @escape = encode_escape(@source_buffer.slice(p - 1)) + end + end +# line 728 "lib/parser/lexer.rl" + begin + + @escape = encode_escape(@escape[0].ord & 0x9f) + end +# line 732 "lib/parser/lexer.rl" + begin + + @escape = encode_escape(@escape[0].ord | 0x80) + end +# line 895 "lib/parser/lexer.rl" + begin + @te = p +p = p - 1; begin + current_literal = literal + # Get the first character after the backslash. + escaped_char = @source_buffer.slice(@escape_s).chr + + if current_literal.munge_escape? escaped_char + # If this particular literal uses this character as an opening + # or closing delimiter, it is an escape sequence for that + # particular character. Write it without the backslash. + + if current_literal.regexp? && REGEXP_META_CHARACTERS.match(escaped_char) + # Regular expressions should include escaped delimiters in their + # escaped form, except when the escaped character is + # a closing delimiter but not a regexp metacharacter. + # + # The backslash itself cannot be used as a closing delimiter + # at the same time as an escape symbol, but it is always munged, + # so this branch also executes for the non-closing-delimiter case + # for the backslash. + current_literal.extend_string(tok, @ts, @te) + else + current_literal.extend_string(escaped_char, @ts, @te) + end + else + # It does not. So this is an actual escape sequence, yay! + if current_literal.squiggly_heredoc? && escaped_char == "\n".freeze + # Squiggly heredocs like + # <<~-HERE + # 1\ + # 2 + # HERE + # treat '\' as a line continuation, but still dedent the body, so the heredoc above becomes "12\n". + # This information is emitted as is, without escaping, + # later this escape sequence (\\\n) gets handled manually in the Lexer::Dedenter + current_literal.extend_string(tok, @ts, @te) + elsif current_literal.supports_line_continuation_via_slash? && escaped_char == "\n".freeze + # Heredocs, regexp and a few other types of literals support line + # continuation via \\\n sequence. The code like + # "a\ + # b" + # must be parsed as "ab" + current_literal.extend_string(tok.gsub("\\\n".freeze, ''.freeze), @ts, @te) + elsif current_literal.regexp? && @version >= 31 && %w[c C m M].include?(escaped_char) + # Ruby >= 3.1 escapes \c- and \m chars, that's the only escape sequence + # supported by regexes so far, so it needs a separate branch. + current_literal.extend_string(@escape, @ts, @te) + elsif current_literal.regexp? + # Regular expressions should include escape sequences in their + # escaped form. On the other hand, escaped newlines are removed (in cases like "\\C-\\\n\\M-x") + current_literal.extend_string(tok.gsub("\\\n".freeze, ''.freeze), @ts, @te) + else + current_literal.extend_string(@escape || tok, @ts, @te) + end + end + end + end + when 372 then +# line 704 "lib/parser/lexer.rl" + begin + + codepoint = @source_pts[p - 1] + + if @version >= 30 && (codepoint == 117 || codepoint == 85) # 'u' or 'U' + diagnostic :fatal, :invalid_escape + end + + if (@escape = ESCAPES[codepoint]).nil? + @escape = encode_escape(@source_buffer.slice(p - 1)) + end + end +# line 728 "lib/parser/lexer.rl" + begin + + @escape = encode_escape(@escape[0].ord & 0x9f) + end +# line 732 "lib/parser/lexer.rl" + begin + + @escape = encode_escape(@escape[0].ord | 0x80) + end +# line 1918 "lib/parser/lexer.rl" + begin + @te = p +p = p - 1; begin + value = @escape || tok(@ts + 1) + + if version?(18) + emit(:tINTEGER, value.getbyte(0)) + else + emit(:tCHARACTER, value) + end + + @cs = 810; begin + p += 1 + _goto_level = _out + next + end + + end + end + when 125 then +# line 720 "lib/parser/lexer.rl" + begin + + @escape = @source_buffer.slice(p - 1).chr + + if @version >= 27 && ((0..8).include?(@escape.ord) || (14..31).include?(@escape.ord)) + diagnostic :fatal, :invalid_escape + end + end +# line 728 "lib/parser/lexer.rl" + begin + + @escape = encode_escape(@escape[0].ord & 0x9f) + end +# line 732 "lib/parser/lexer.rl" + begin + + @escape = encode_escape(@escape[0].ord | 0x80) + end +# line 895 "lib/parser/lexer.rl" + begin + @te = p +p = p - 1; begin + current_literal = literal + # Get the first character after the backslash. + escaped_char = @source_buffer.slice(@escape_s).chr + + if current_literal.munge_escape? escaped_char + # If this particular literal uses this character as an opening + # or closing delimiter, it is an escape sequence for that + # particular character. Write it without the backslash. + + if current_literal.regexp? && REGEXP_META_CHARACTERS.match(escaped_char) + # Regular expressions should include escaped delimiters in their + # escaped form, except when the escaped character is + # a closing delimiter but not a regexp metacharacter. + # + # The backslash itself cannot be used as a closing delimiter + # at the same time as an escape symbol, but it is always munged, + # so this branch also executes for the non-closing-delimiter case + # for the backslash. + current_literal.extend_string(tok, @ts, @te) + else + current_literal.extend_string(escaped_char, @ts, @te) + end + else + # It does not. So this is an actual escape sequence, yay! + if current_literal.squiggly_heredoc? && escaped_char == "\n".freeze + # Squiggly heredocs like + # <<~-HERE + # 1\ + # 2 + # HERE + # treat '\' as a line continuation, but still dedent the body, so the heredoc above becomes "12\n". + # This information is emitted as is, without escaping, + # later this escape sequence (\\\n) gets handled manually in the Lexer::Dedenter + current_literal.extend_string(tok, @ts, @te) + elsif current_literal.supports_line_continuation_via_slash? && escaped_char == "\n".freeze + # Heredocs, regexp and a few other types of literals support line + # continuation via \\\n sequence. The code like + # "a\ + # b" + # must be parsed as "ab" + current_literal.extend_string(tok.gsub("\\\n".freeze, ''.freeze), @ts, @te) + elsif current_literal.regexp? && @version >= 31 && %w[c C m M].include?(escaped_char) + # Ruby >= 3.1 escapes \c- and \m chars, that's the only escape sequence + # supported by regexes so far, so it needs a separate branch. + current_literal.extend_string(@escape, @ts, @te) + elsif current_literal.regexp? + # Regular expressions should include escape sequences in their + # escaped form. On the other hand, escaped newlines are removed (in cases like "\\C-\\\n\\M-x") + current_literal.extend_string(tok.gsub("\\\n".freeze, ''.freeze), @ts, @te) + else + current_literal.extend_string(@escape || tok, @ts, @te) + end + end + end + end + when 156 then +# line 720 "lib/parser/lexer.rl" + begin + + @escape = @source_buffer.slice(p - 1).chr + + if @version >= 27 && ((0..8).include?(@escape.ord) || (14..31).include?(@escape.ord)) + diagnostic :fatal, :invalid_escape + end + end +# line 728 "lib/parser/lexer.rl" + begin + + @escape = encode_escape(@escape[0].ord & 0x9f) + end +# line 732 "lib/parser/lexer.rl" + begin + + @escape = encode_escape(@escape[0].ord | 0x80) + end +# line 895 "lib/parser/lexer.rl" + begin + @te = p +p = p - 1; begin + current_literal = literal + # Get the first character after the backslash. + escaped_char = @source_buffer.slice(@escape_s).chr + + if current_literal.munge_escape? escaped_char + # If this particular literal uses this character as an opening + # or closing delimiter, it is an escape sequence for that + # particular character. Write it without the backslash. + + if current_literal.regexp? && REGEXP_META_CHARACTERS.match(escaped_char) + # Regular expressions should include escaped delimiters in their + # escaped form, except when the escaped character is + # a closing delimiter but not a regexp metacharacter. + # + # The backslash itself cannot be used as a closing delimiter + # at the same time as an escape symbol, but it is always munged, + # so this branch also executes for the non-closing-delimiter case + # for the backslash. + current_literal.extend_string(tok, @ts, @te) + else + current_literal.extend_string(escaped_char, @ts, @te) + end + else + # It does not. So this is an actual escape sequence, yay! + if current_literal.squiggly_heredoc? && escaped_char == "\n".freeze + # Squiggly heredocs like + # <<~-HERE + # 1\ + # 2 + # HERE + # treat '\' as a line continuation, but still dedent the body, so the heredoc above becomes "12\n". + # This information is emitted as is, without escaping, + # later this escape sequence (\\\n) gets handled manually in the Lexer::Dedenter + current_literal.extend_string(tok, @ts, @te) + elsif current_literal.supports_line_continuation_via_slash? && escaped_char == "\n".freeze + # Heredocs, regexp and a few other types of literals support line + # continuation via \\\n sequence. The code like + # "a\ + # b" + # must be parsed as "ab" + current_literal.extend_string(tok.gsub("\\\n".freeze, ''.freeze), @ts, @te) + elsif current_literal.regexp? && @version >= 31 && %w[c C m M].include?(escaped_char) + # Ruby >= 3.1 escapes \c- and \m chars, that's the only escape sequence + # supported by regexes so far, so it needs a separate branch. + current_literal.extend_string(@escape, @ts, @te) + elsif current_literal.regexp? + # Regular expressions should include escape sequences in their + # escaped form. On the other hand, escaped newlines are removed (in cases like "\\C-\\\n\\M-x") + current_literal.extend_string(tok.gsub("\\\n".freeze, ''.freeze), @ts, @te) + else + current_literal.extend_string(@escape || tok, @ts, @te) + end + end + end + end + when 370 then +# line 720 "lib/parser/lexer.rl" + begin + + @escape = @source_buffer.slice(p - 1).chr + + if @version >= 27 && ((0..8).include?(@escape.ord) || (14..31).include?(@escape.ord)) + diagnostic :fatal, :invalid_escape + end + end +# line 728 "lib/parser/lexer.rl" + begin + + @escape = encode_escape(@escape[0].ord & 0x9f) + end +# line 732 "lib/parser/lexer.rl" + begin + + @escape = encode_escape(@escape[0].ord | 0x80) + end +# line 1918 "lib/parser/lexer.rl" + begin + @te = p +p = p - 1; begin + value = @escape || tok(@ts + 1) + + if version?(18) + emit(:tINTEGER, value.getbyte(0)) + else + emit(:tCHARACTER, value) + end + + @cs = 810; begin + p += 1 + _goto_level = _out + next + end + + end + end + when 132 then +# line 738 "lib/parser/lexer.rl" + begin + @escape = encode_escape(tok(p - 2, p).to_i(16)) end +# line 728 "lib/parser/lexer.rl" + begin + + @escape = encode_escape(@escape[0].ord & 0x9f) + end +# line 732 "lib/parser/lexer.rl" + begin + + @escape = encode_escape(@escape[0].ord | 0x80) + end +# line 895 "lib/parser/lexer.rl" + begin + @te = p +p = p - 1; begin + current_literal = literal + # Get the first character after the backslash. + escaped_char = @source_buffer.slice(@escape_s).chr + + if current_literal.munge_escape? escaped_char + # If this particular literal uses this character as an opening + # or closing delimiter, it is an escape sequence for that + # particular character. Write it without the backslash. + + if current_literal.regexp? && REGEXP_META_CHARACTERS.match(escaped_char) + # Regular expressions should include escaped delimiters in their + # escaped form, except when the escaped character is + # a closing delimiter but not a regexp metacharacter. + # + # The backslash itself cannot be used as a closing delimiter + # at the same time as an escape symbol, but it is always munged, + # so this branch also executes for the non-closing-delimiter case + # for the backslash. + current_literal.extend_string(tok, @ts, @te) + else + current_literal.extend_string(escaped_char, @ts, @te) + end + else + # It does not. So this is an actual escape sequence, yay! + if current_literal.squiggly_heredoc? && escaped_char == "\n".freeze + # Squiggly heredocs like + # <<~-HERE + # 1\ + # 2 + # HERE + # treat '\' as a line continuation, but still dedent the body, so the heredoc above becomes "12\n". + # This information is emitted as is, without escaping, + # later this escape sequence (\\\n) gets handled manually in the Lexer::Dedenter + current_literal.extend_string(tok, @ts, @te) + elsif current_literal.supports_line_continuation_via_slash? && escaped_char == "\n".freeze + # Heredocs, regexp and a few other types of literals support line + # continuation via \\\n sequence. The code like + # "a\ + # b" + # must be parsed as "ab" + current_literal.extend_string(tok.gsub("\\\n".freeze, ''.freeze), @ts, @te) + elsif current_literal.regexp? && @version >= 31 && %w[c C m M].include?(escaped_char) + # Ruby >= 3.1 escapes \c- and \m chars, that's the only escape sequence + # supported by regexes so far, so it needs a separate branch. + current_literal.extend_string(@escape, @ts, @te) + elsif current_literal.regexp? + # Regular expressions should include escape sequences in their + # escaped form. On the other hand, escaped newlines are removed (in cases like "\\C-\\\n\\M-x") + current_literal.extend_string(tok.gsub("\\\n".freeze, ''.freeze), @ts, @te) + else + current_literal.extend_string(@escape || tok, @ts, @te) + end + end + end + end + when 163 then +# line 738 "lib/parser/lexer.rl" + begin + @escape = encode_escape(tok(p - 2, p).to_i(16)) end +# line 728 "lib/parser/lexer.rl" + begin + + @escape = encode_escape(@escape[0].ord & 0x9f) + end +# line 732 "lib/parser/lexer.rl" + begin + + @escape = encode_escape(@escape[0].ord | 0x80) + end +# line 895 "lib/parser/lexer.rl" + begin + @te = p +p = p - 1; begin + current_literal = literal + # Get the first character after the backslash. + escaped_char = @source_buffer.slice(@escape_s).chr + + if current_literal.munge_escape? escaped_char + # If this particular literal uses this character as an opening + # or closing delimiter, it is an escape sequence for that + # particular character. Write it without the backslash. + + if current_literal.regexp? && REGEXP_META_CHARACTERS.match(escaped_char) + # Regular expressions should include escaped delimiters in their + # escaped form, except when the escaped character is + # a closing delimiter but not a regexp metacharacter. + # + # The backslash itself cannot be used as a closing delimiter + # at the same time as an escape symbol, but it is always munged, + # so this branch also executes for the non-closing-delimiter case + # for the backslash. + current_literal.extend_string(tok, @ts, @te) + else + current_literal.extend_string(escaped_char, @ts, @te) + end + else + # It does not. So this is an actual escape sequence, yay! + if current_literal.squiggly_heredoc? && escaped_char == "\n".freeze + # Squiggly heredocs like + # <<~-HERE + # 1\ + # 2 + # HERE + # treat '\' as a line continuation, but still dedent the body, so the heredoc above becomes "12\n". + # This information is emitted as is, without escaping, + # later this escape sequence (\\\n) gets handled manually in the Lexer::Dedenter + current_literal.extend_string(tok, @ts, @te) + elsif current_literal.supports_line_continuation_via_slash? && escaped_char == "\n".freeze + # Heredocs, regexp and a few other types of literals support line + # continuation via \\\n sequence. The code like + # "a\ + # b" + # must be parsed as "ab" + current_literal.extend_string(tok.gsub("\\\n".freeze, ''.freeze), @ts, @te) + elsif current_literal.regexp? && @version >= 31 && %w[c C m M].include?(escaped_char) + # Ruby >= 3.1 escapes \c- and \m chars, that's the only escape sequence + # supported by regexes so far, so it needs a separate branch. + current_literal.extend_string(@escape, @ts, @te) + elsif current_literal.regexp? + # Regular expressions should include escape sequences in their + # escaped form. On the other hand, escaped newlines are removed (in cases like "\\C-\\\n\\M-x") + current_literal.extend_string(tok.gsub("\\\n".freeze, ''.freeze), @ts, @te) + else + current_literal.extend_string(@escape || tok, @ts, @te) + end + end + end + end + when 377 then +# line 738 "lib/parser/lexer.rl" + begin + @escape = encode_escape(tok(p - 2, p).to_i(16)) end +# line 728 "lib/parser/lexer.rl" + begin + + @escape = encode_escape(@escape[0].ord & 0x9f) + end +# line 732 "lib/parser/lexer.rl" + begin + + @escape = encode_escape(@escape[0].ord | 0x80) + end +# line 1918 "lib/parser/lexer.rl" + begin + @te = p +p = p - 1; begin + value = @escape || tok(@ts + 1) + + if version?(18) + emit(:tINTEGER, value.getbyte(0)) + else + emit(:tCHARACTER, value) + end + + @cs = 810; begin + p += 1 + _goto_level = _out + next + end + + end + end + when 128 then +# line 745 "lib/parser/lexer.rl" + begin + @escape = encode_escape(tok(p - 2, p).to_i(16)) end +# line 728 "lib/parser/lexer.rl" + begin + + @escape = encode_escape(@escape[0].ord & 0x9f) + end +# line 732 "lib/parser/lexer.rl" + begin + + @escape = encode_escape(@escape[0].ord | 0x80) + end +# line 895 "lib/parser/lexer.rl" + begin + @te = p +p = p - 1; begin + current_literal = literal + # Get the first character after the backslash. + escaped_char = @source_buffer.slice(@escape_s).chr + + if current_literal.munge_escape? escaped_char + # If this particular literal uses this character as an opening + # or closing delimiter, it is an escape sequence for that + # particular character. Write it without the backslash. + + if current_literal.regexp? && REGEXP_META_CHARACTERS.match(escaped_char) + # Regular expressions should include escaped delimiters in their + # escaped form, except when the escaped character is + # a closing delimiter but not a regexp metacharacter. + # + # The backslash itself cannot be used as a closing delimiter + # at the same time as an escape symbol, but it is always munged, + # so this branch also executes for the non-closing-delimiter case + # for the backslash. + current_literal.extend_string(tok, @ts, @te) + else + current_literal.extend_string(escaped_char, @ts, @te) + end + else + # It does not. So this is an actual escape sequence, yay! + if current_literal.squiggly_heredoc? && escaped_char == "\n".freeze + # Squiggly heredocs like + # <<~-HERE + # 1\ + # 2 + # HERE + # treat '\' as a line continuation, but still dedent the body, so the heredoc above becomes "12\n". + # This information is emitted as is, without escaping, + # later this escape sequence (\\\n) gets handled manually in the Lexer::Dedenter + current_literal.extend_string(tok, @ts, @te) + elsif current_literal.supports_line_continuation_via_slash? && escaped_char == "\n".freeze + # Heredocs, regexp and a few other types of literals support line + # continuation via \\\n sequence. The code like + # "a\ + # b" + # must be parsed as "ab" + current_literal.extend_string(tok.gsub("\\\n".freeze, ''.freeze), @ts, @te) + elsif current_literal.regexp? && @version >= 31 && %w[c C m M].include?(escaped_char) + # Ruby >= 3.1 escapes \c- and \m chars, that's the only escape sequence + # supported by regexes so far, so it needs a separate branch. + current_literal.extend_string(@escape, @ts, @te) + elsif current_literal.regexp? + # Regular expressions should include escape sequences in their + # escaped form. On the other hand, escaped newlines are removed (in cases like "\\C-\\\n\\M-x") + current_literal.extend_string(tok.gsub("\\\n".freeze, ''.freeze), @ts, @te) + else + current_literal.extend_string(@escape || tok, @ts, @te) + end + end + end + end + when 159 then +# line 745 "lib/parser/lexer.rl" + begin + @escape = encode_escape(tok(p - 2, p).to_i(16)) end +# line 728 "lib/parser/lexer.rl" + begin + + @escape = encode_escape(@escape[0].ord & 0x9f) + end +# line 732 "lib/parser/lexer.rl" + begin + + @escape = encode_escape(@escape[0].ord | 0x80) + end +# line 895 "lib/parser/lexer.rl" + begin + @te = p +p = p - 1; begin + current_literal = literal + # Get the first character after the backslash. + escaped_char = @source_buffer.slice(@escape_s).chr + + if current_literal.munge_escape? escaped_char + # If this particular literal uses this character as an opening + # or closing delimiter, it is an escape sequence for that + # particular character. Write it without the backslash. + + if current_literal.regexp? && REGEXP_META_CHARACTERS.match(escaped_char) + # Regular expressions should include escaped delimiters in their + # escaped form, except when the escaped character is + # a closing delimiter but not a regexp metacharacter. + # + # The backslash itself cannot be used as a closing delimiter + # at the same time as an escape symbol, but it is always munged, + # so this branch also executes for the non-closing-delimiter case + # for the backslash. + current_literal.extend_string(tok, @ts, @te) + else + current_literal.extend_string(escaped_char, @ts, @te) + end + else + # It does not. So this is an actual escape sequence, yay! + if current_literal.squiggly_heredoc? && escaped_char == "\n".freeze + # Squiggly heredocs like + # <<~-HERE + # 1\ + # 2 + # HERE + # treat '\' as a line continuation, but still dedent the body, so the heredoc above becomes "12\n". + # This information is emitted as is, without escaping, + # later this escape sequence (\\\n) gets handled manually in the Lexer::Dedenter + current_literal.extend_string(tok, @ts, @te) + elsif current_literal.supports_line_continuation_via_slash? && escaped_char == "\n".freeze + # Heredocs, regexp and a few other types of literals support line + # continuation via \\\n sequence. The code like + # "a\ + # b" + # must be parsed as "ab" + current_literal.extend_string(tok.gsub("\\\n".freeze, ''.freeze), @ts, @te) + elsif current_literal.regexp? && @version >= 31 && %w[c C m M].include?(escaped_char) + # Ruby >= 3.1 escapes \c- and \m chars, that's the only escape sequence + # supported by regexes so far, so it needs a separate branch. + current_literal.extend_string(@escape, @ts, @te) + elsif current_literal.regexp? + # Regular expressions should include escape sequences in their + # escaped form. On the other hand, escaped newlines are removed (in cases like "\\C-\\\n\\M-x") + current_literal.extend_string(tok.gsub("\\\n".freeze, ''.freeze), @ts, @te) + else + current_literal.extend_string(@escape || tok, @ts, @te) + end + end + end + end + when 373 then +# line 745 "lib/parser/lexer.rl" + begin + @escape = encode_escape(tok(p - 2, p).to_i(16)) end +# line 728 "lib/parser/lexer.rl" + begin + + @escape = encode_escape(@escape[0].ord & 0x9f) + end +# line 732 "lib/parser/lexer.rl" + begin + + @escape = encode_escape(@escape[0].ord | 0x80) + end +# line 1918 "lib/parser/lexer.rl" + begin + @te = p +p = p - 1; begin + value = @escape || tok(@ts + 1) + + if version?(18) + emit(:tINTEGER, value.getbyte(0)) + else + emit(:tCHARACTER, value) + end + + @cs = 810; begin + p += 1 + _goto_level = _out + next + end + + end + end + when 478 then +# line 2298 "lib/parser/lexer.rl" + begin + @num_base = 16; @num_digits_s = p end +# line 2304 "lib/parser/lexer.rl" + begin + @num_suffix_s = p end +# line 632 "lib/parser/lexer.rl" + begin + @num_xfrm = lambda { |chars| emit(:tINTEGER, chars) } end +# line 2305 "lib/parser/lexer.rl" + begin + @te = p +p = p - 1; begin + digits = tok(@num_digits_s, @num_suffix_s) + + if digits.end_with? '_'.freeze + diagnostic :error, :trailing_in_number, { :character => '_'.freeze }, + range(@te - 1, @te) + elsif digits.empty? && @num_base == 8 && version?(18) + # 1.8 did not raise an error on 0o. + digits = '0'.freeze + elsif digits.empty? + diagnostic :error, :empty_numeric + elsif @num_base == 8 && (invalid_idx = digits.index(/[89]/)) + invalid_s = @num_digits_s + invalid_idx + diagnostic :error, :invalid_octal, nil, + range(invalid_s, invalid_s + 1) + end + + if version?(18, 19, 20) + emit(:tINTEGER, digits.to_i(@num_base), @ts, @num_suffix_s) + p = @num_suffix_s - 1 + else + @num_xfrm.call(digits.to_i(@num_base)) + end + begin + p += 1 + _goto_level = _out + next + end + + end + end + when 472 then +# line 2299 "lib/parser/lexer.rl" + begin + @num_base = 10; @num_digits_s = p end +# line 2304 "lib/parser/lexer.rl" + begin + @num_suffix_s = p end +# line 632 "lib/parser/lexer.rl" + begin + @num_xfrm = lambda { |chars| emit(:tINTEGER, chars) } end +# line 2305 "lib/parser/lexer.rl" + begin + @te = p +p = p - 1; begin + digits = tok(@num_digits_s, @num_suffix_s) + + if digits.end_with? '_'.freeze + diagnostic :error, :trailing_in_number, { :character => '_'.freeze }, + range(@te - 1, @te) + elsif digits.empty? && @num_base == 8 && version?(18) + # 1.8 did not raise an error on 0o. + digits = '0'.freeze + elsif digits.empty? + diagnostic :error, :empty_numeric + elsif @num_base == 8 && (invalid_idx = digits.index(/[89]/)) + invalid_s = @num_digits_s + invalid_idx + diagnostic :error, :invalid_octal, nil, + range(invalid_s, invalid_s + 1) + end + + if version?(18, 19, 20) + emit(:tINTEGER, digits.to_i(@num_base), @ts, @num_suffix_s) + p = @num_suffix_s - 1 + else + @num_xfrm.call(digits.to_i(@num_base)) + end + begin + p += 1 + _goto_level = _out + next + end + + end + end + when 475 then +# line 2300 "lib/parser/lexer.rl" + begin + @num_base = 8; @num_digits_s = p end +# line 2304 "lib/parser/lexer.rl" + begin + @num_suffix_s = p end +# line 632 "lib/parser/lexer.rl" + begin + @num_xfrm = lambda { |chars| emit(:tINTEGER, chars) } end +# line 2305 "lib/parser/lexer.rl" + begin + @te = p +p = p - 1; begin + digits = tok(@num_digits_s, @num_suffix_s) + + if digits.end_with? '_'.freeze + diagnostic :error, :trailing_in_number, { :character => '_'.freeze }, + range(@te - 1, @te) + elsif digits.empty? && @num_base == 8 && version?(18) + # 1.8 did not raise an error on 0o. + digits = '0'.freeze + elsif digits.empty? + diagnostic :error, :empty_numeric + elsif @num_base == 8 && (invalid_idx = digits.index(/[89]/)) + invalid_s = @num_digits_s + invalid_idx + diagnostic :error, :invalid_octal, nil, + range(invalid_s, invalid_s + 1) + end + + if version?(18, 19, 20) + emit(:tINTEGER, digits.to_i(@num_base), @ts, @num_suffix_s) + p = @num_suffix_s - 1 + else + @num_xfrm.call(digits.to_i(@num_base)) + end + begin + p += 1 + _goto_level = _out + next + end + + end + end + when 469 then +# line 2301 "lib/parser/lexer.rl" + begin + @num_base = 2; @num_digits_s = p end +# line 2304 "lib/parser/lexer.rl" + begin + @num_suffix_s = p end +# line 632 "lib/parser/lexer.rl" + begin + @num_xfrm = lambda { |chars| emit(:tINTEGER, chars) } end +# line 2305 "lib/parser/lexer.rl" + begin + @te = p +p = p - 1; begin + digits = tok(@num_digits_s, @num_suffix_s) + + if digits.end_with? '_'.freeze + diagnostic :error, :trailing_in_number, { :character => '_'.freeze }, + range(@te - 1, @te) + elsif digits.empty? && @num_base == 8 && version?(18) + # 1.8 did not raise an error on 0o. + digits = '0'.freeze + elsif digits.empty? + diagnostic :error, :empty_numeric + elsif @num_base == 8 && (invalid_idx = digits.index(/[89]/)) + invalid_s = @num_digits_s + invalid_idx + diagnostic :error, :invalid_octal, nil, + range(invalid_s, invalid_s + 1) + end + + if version?(18, 19, 20) + emit(:tINTEGER, digits.to_i(@num_base), @ts, @num_suffix_s) + p = @num_suffix_s - 1 + else + @num_xfrm.call(digits.to_i(@num_base)) + end + begin + p += 1 + _goto_level = _out + next + end + + end + end + when 481 then +# line 2302 "lib/parser/lexer.rl" + begin + @num_base = 10; @num_digits_s = @ts end +# line 2304 "lib/parser/lexer.rl" + begin + @num_suffix_s = p end +# line 632 "lib/parser/lexer.rl" + begin + @num_xfrm = lambda { |chars| emit(:tINTEGER, chars) } end +# line 2305 "lib/parser/lexer.rl" + begin + @te = p +p = p - 1; begin + digits = tok(@num_digits_s, @num_suffix_s) + + if digits.end_with? '_'.freeze + diagnostic :error, :trailing_in_number, { :character => '_'.freeze }, + range(@te - 1, @te) + elsif digits.empty? && @num_base == 8 && version?(18) + # 1.8 did not raise an error on 0o. + digits = '0'.freeze + elsif digits.empty? + diagnostic :error, :empty_numeric + elsif @num_base == 8 && (invalid_idx = digits.index(/[89]/)) + invalid_s = @num_digits_s + invalid_idx + diagnostic :error, :invalid_octal, nil, + range(invalid_s, invalid_s + 1) + end + + if version?(18, 19, 20) + emit(:tINTEGER, digits.to_i(@num_base), @ts, @num_suffix_s) + p = @num_suffix_s - 1 + else + @num_xfrm.call(digits.to_i(@num_base)) + end + begin + p += 1 + _goto_level = _out + next + end + + end + end + when 445 then +# line 2303 "lib/parser/lexer.rl" + begin + @num_base = 8; @num_digits_s = @ts end +# line 2304 "lib/parser/lexer.rl" + begin + @num_suffix_s = p end +# line 632 "lib/parser/lexer.rl" + begin + @num_xfrm = lambda { |chars| emit(:tINTEGER, chars) } end +# line 2305 "lib/parser/lexer.rl" + begin + @te = p +p = p - 1; begin + digits = tok(@num_digits_s, @num_suffix_s) + + if digits.end_with? '_'.freeze + diagnostic :error, :trailing_in_number, { :character => '_'.freeze }, + range(@te - 1, @te) + elsif digits.empty? && @num_base == 8 && version?(18) + # 1.8 did not raise an error on 0o. + digits = '0'.freeze + elsif digits.empty? + diagnostic :error, :empty_numeric + elsif @num_base == 8 && (invalid_idx = digits.index(/[89]/)) + invalid_s = @num_digits_s + invalid_idx + diagnostic :error, :invalid_octal, nil, + range(invalid_s, invalid_s + 1) + end + + if version?(18, 19, 20) + emit(:tINTEGER, digits.to_i(@num_base), @ts, @num_suffix_s) + p = @num_suffix_s - 1 + else + @num_xfrm.call(digits.to_i(@num_base)) + end + begin + p += 1 + _goto_level = _out + next + end + + end + end + when 32 then +# line 1 "NONE" + begin + @te = p+1 + end +# line 862 "lib/parser/lexer.rl" + begin + + # After every heredoc was parsed, @herebody_s contains the + # position of next token after all heredocs. + if @herebody_s + p = @herebody_s + @herebody_s = nil + end + end +# line 1583 "lib/parser/lexer.rl" + begin + tm = p end +# line 1584 "lib/parser/lexer.rl" + begin + @act = 73; end + when 63 then +# line 1 "NONE" + begin + @te = p+1 + end +# line 1226 "lib/parser/lexer.rl" + begin + @sharp_s = p - 1 end +# line 1229 "lib/parser/lexer.rl" + begin + emit_comment(@sharp_s, p == pe ? p - 2 : p) end +# line 1754 "lib/parser/lexer.rl" + begin + @act = 99; end + when 92 then +# line 1 "NONE" + begin + @te = p+1 + end +# line 1226 "lib/parser/lexer.rl" + begin + @sharp_s = p - 1 end +# line 1229 "lib/parser/lexer.rl" + begin + emit_comment(@sharp_s, p == pe ? p - 2 : p) end +# line 2537 "lib/parser/lexer.rl" + begin + @act = 181; end + when 488 then +# line 1 "NONE" + begin + @te = p+1 + end +# line 2304 "lib/parser/lexer.rl" + begin + @num_suffix_s = p end +# line 632 "lib/parser/lexer.rl" + begin + @num_xfrm = lambda { |chars| emit(:tINTEGER, chars) } end +# line 2337 "lib/parser/lexer.rl" + begin + @act = 156; end + when 484 then +# line 1 "NONE" + begin + @te = p+1 + end +# line 2302 "lib/parser/lexer.rl" + begin + @num_base = 10; @num_digits_s = @ts end +# line 2304 "lib/parser/lexer.rl" + begin + @num_suffix_s = p end +# line 632 "lib/parser/lexer.rl" + begin + @num_xfrm = lambda { |chars| emit(:tINTEGER, chars) } end +# line 2337 "lib/parser/lexer.rl" + begin + @act = 156; end + when 448 then +# line 1 "NONE" + begin + @te = p+1 + end +# line 2303 "lib/parser/lexer.rl" + begin + @num_base = 8; @num_digits_s = @ts end +# line 2304 "lib/parser/lexer.rl" + begin + @num_suffix_s = p end +# line 632 "lib/parser/lexer.rl" + begin + @num_xfrm = lambda { |chars| emit(:tINTEGER, chars) } end +# line 2337 "lib/parser/lexer.rl" + begin + @act = 156; end +# line 24769 "lib/parser/lexer.rb" + end + end + end + if _goto_level <= _again + case _lex_to_state_actions[ @cs] + when 96 then +# line 1 "NONE" + begin + @ts = nil; end +# line 24779 "lib/parser/lexer.rb" + end + + if @cs == 0 + _goto_level = _out + next + end + p += 1 + if p != pe + _goto_level = _resume + next + end + end + if _goto_level <= _test_eof + if p == eof + if _lex_eof_trans[ @cs] > 0 + _trans = _lex_eof_trans[ @cs] - 1; + _goto_level = _eof_trans + next; + end + end + + end + if _goto_level <= _out + break + end +end + end + +# line 283 "lib/parser/lexer.rl" + # % + + # Ragel creates a local variable called `testEof` but it doesn't use + # it in any assignment. This dead code is here to swallow the warning. + # It has no runtime cost because Ruby doesn't produce any instructions from it. + if false + testEof + end + + @p = p + + if @token_queue.any? + @token_queue.shift + elsif @cs == klass.lex_error + [ false, [ '$error'.freeze, range(p - 1, p) ] ] + else + eof = @source_pts.size + [ false, [ '$eof'.freeze, range(eof, eof) ] ] + end + end + + protected + + def eof_codepoint?(point) + [0x04, 0x1a, 0x00].include? point + end + + def version?(*versions) + versions.include?(@version) + end + + def stack_pop + @top -= 1 + @stack[@top] + end + + def encode_escape(ord) + ord.chr.force_encoding(@source_buffer.source.encoding) + end + + def tok(s = @ts, e = @te) + @source_buffer.slice(s...e) + end + + def range(s = @ts, e = @te) + Parser::Source::Range.new(@source_buffer, s, e) + end + + def emit(type, value = tok, s = @ts, e = @te) + token = [ type, [ value, range(s, e) ] ] + + @token_queue.push(token) + + @tokens.push(token) if @tokens + + token + end + + def emit_table(table, s = @ts, e = @te) + value = tok(s, e) + + emit(table[value], value, s, e) + end + + def emit_do(do_block=false) + if @cond.active? + emit(:kDO_COND, 'do'.freeze) + elsif @cmdarg.active? || do_block + emit(:kDO_BLOCK, 'do'.freeze) + else + emit(:kDO, 'do'.freeze) + end + end + + def arg_or_cmdarg(cmd_state) + if cmd_state + self.class.lex_en_expr_cmdarg + else + self.class.lex_en_expr_arg + end + end + + def emit_comment(s = @ts, e = @te) + if @comments + @comments.push(Parser::Source::Comment.new(range(s, e))) + end + + if @tokens + @tokens.push([ :tCOMMENT, [ tok(s, e), range(s, e) ] ]) + end + + nil + end + + def diagnostic(type, reason, arguments=nil, location=range, highlights=[]) + @diagnostics.process( + Parser::Diagnostic.new(type, reason, arguments, location, highlights)) + end + + # + # === LITERAL STACK === + # + + def push_literal(*args) + new_literal = Literal.new(self, *args) + @literal_stack.push(new_literal) + next_state_for_literal(new_literal) + end + + def next_state_for_literal(literal) + if literal.words? && literal.backslash_delimited? + if literal.interpolate? + self.class.lex_en_interp_backslash_delimited_words + else + self.class.lex_en_plain_backslash_delimited_words + end + elsif literal.words? && !literal.backslash_delimited? + if literal.interpolate? + self.class.lex_en_interp_words + else + self.class.lex_en_plain_words + end + elsif !literal.words? && literal.backslash_delimited? + if literal.interpolate? + self.class.lex_en_interp_backslash_delimited + else + self.class.lex_en_plain_backslash_delimited + end + else + if literal.interpolate? + self.class.lex_en_interp_string + else + self.class.lex_en_plain_string + end + end + end + + def literal + @literal_stack.last + end + + def pop_literal + old_literal = @literal_stack.pop + + @dedent_level = old_literal.dedent_level + + if old_literal.type == :tREGEXP_BEG + # Fetch modifiers. + self.class.lex_en_regexp_modifiers + else + self.class.lex_en_expr_end + end + end + + # Mapping of strings to parser tokens. + + PUNCTUATION = { + '=' => :tEQL, '&' => :tAMPER2, '|' => :tPIPE, + '!' => :tBANG, '^' => :tCARET, '+' => :tPLUS, + '-' => :tMINUS, '*' => :tSTAR2, '/' => :tDIVIDE, + '%' => :tPERCENT, '~' => :tTILDE, ',' => :tCOMMA, + ';' => :tSEMI, '.' => :tDOT, '..' => :tDOT2, + '...' => :tDOT3, '[' => :tLBRACK2, ']' => :tRBRACK, + '(' => :tLPAREN2, ')' => :tRPAREN, '?' => :tEH, + ':' => :tCOLON, '&&' => :tANDOP, '||' => :tOROP, + '-@' => :tUMINUS, '+@' => :tUPLUS, '~@' => :tTILDE, + '**' => :tPOW, '->' => :tLAMBDA, '=~' => :tMATCH, + '!~' => :tNMATCH, '==' => :tEQ, '!=' => :tNEQ, + '>' => :tGT, '>>' => :tRSHFT, '>=' => :tGEQ, + '<' => :tLT, '<<' => :tLSHFT, '<=' => :tLEQ, + '=>' => :tASSOC, '::' => :tCOLON2, '===' => :tEQQ, + '<=>' => :tCMP, '[]' => :tAREF, '[]=' => :tASET, + '{' => :tLCURLY, '}' => :tRCURLY, '`' => :tBACK_REF2, + '!@' => :tBANG, '&.' => :tANDDOT, + } + + PUNCTUATION_BEGIN = { + '&' => :tAMPER, '*' => :tSTAR, '**' => :tDSTAR, + '+' => :tUPLUS, '-' => :tUMINUS, '::' => :tCOLON3, + '(' => :tLPAREN, '{' => :tLBRACE, '[' => :tLBRACK, + } + + KEYWORDS = { + 'if' => :kIF_MOD, 'unless' => :kUNLESS_MOD, + 'while' => :kWHILE_MOD, 'until' => :kUNTIL_MOD, + 'rescue' => :kRESCUE_MOD, 'defined?' => :kDEFINED, + 'BEGIN' => :klBEGIN, 'END' => :klEND, + } + + KEYWORDS_BEGIN = { + 'if' => :kIF, 'unless' => :kUNLESS, + 'while' => :kWHILE, 'until' => :kUNTIL, + 'rescue' => :kRESCUE, 'defined?' => :kDEFINED, + 'BEGIN' => :klBEGIN, 'END' => :klEND, + } + + %w(class module def undef begin end then elsif else ensure case when + for break next redo retry in do return yield super self nil true + false and or not alias __FILE__ __LINE__ __ENCODING__).each do |keyword| + KEYWORDS_BEGIN[keyword] = KEYWORDS[keyword] = :"k#{keyword.upcase}" + end + + +# line 2616 "lib/parser/lexer.rl" + + # % +end diff --git a/vendor/bundle/ruby/3.1.0/gems/parser-3.1.2.0/lib/parser/lexer/dedenter.rb b/vendor/bundle/ruby/3.1.0/gems/parser-3.1.2.0/lib/parser/lexer/dedenter.rb new file mode 100644 index 000000000..5746cff64 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/parser-3.1.2.0/lib/parser/lexer/dedenter.rb @@ -0,0 +1,88 @@ +# frozen_string_literal: true + +module Parser + + class Lexer::Dedenter + # Tab (\t) counts as 8 spaces + TAB_WIDTH = 8 + + def initialize(dedent_level) + @dedent_level = dedent_level + @at_line_begin = true + @indent_level = 0 + end + + # For a heredoc like + # <<-HERE + # a + # b + # HERE + # this method gets called with " a\n" and " b\n" + # + # However, the following heredoc: + # + # <<-HERE + # a\ + # b + # HERE + # calls this method only once with a string " a\\\n b\n" + # + # This is important because technically it's a single line, + # but it has to be concatenated __after__ dedenting. + # + # It has no effect for non-squiggly heredocs, i.e. it simply removes "\\\n" + # Of course, lexer could do it but once again: it's all because of dedenting. + # + def dedent(string) + original_encoding = string.encoding + # Prevent the following error when processing binary encoded source. + # "\xC0".split # => ArgumentError (invalid byte sequence in UTF-8) + lines = string.force_encoding(Encoding::BINARY).split("\\\n") + if lines.length == 1 + # If the line continuation sequence was found but there is no second + # line, it was not really a line continuation and must be ignored. + lines = [string.force_encoding(original_encoding)] + else + lines.map! {|s| s.force_encoding(original_encoding) } + end + + if @at_line_begin + lines_to_dedent = lines + else + _first, *lines_to_dedent = lines + end + + lines_to_dedent.each do |line| + left_to_remove = @dedent_level + remove = 0 + + line.each_char do |char| + break if left_to_remove <= 0 + case char + when ?\s + remove += 1 + left_to_remove -= 1 + when ?\t + break if TAB_WIDTH * (remove / TAB_WIDTH + 1) > @dedent_level + remove += 1 + left_to_remove -= TAB_WIDTH + else + # no more spaces or tabs + break + end + end + + line.slice!(0, remove) + end + + string.replace(lines.join) + + @at_line_begin = string.end_with?("\n") + end + + def interrupt + @at_line_begin = false + end + end + +end diff --git a/vendor/bundle/ruby/3.1.0/gems/parser-3.1.2.0/lib/parser/lexer/explanation.rb b/vendor/bundle/ruby/3.1.0/gems/parser-3.1.2.0/lib/parser/lexer/explanation.rb new file mode 100644 index 000000000..2ca384c57 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/parser-3.1.2.0/lib/parser/lexer/explanation.rb @@ -0,0 +1,55 @@ +# frozen_string_literal: true + +module Parser + + module Lexer::Explanation + + def self.included(klass) + klass.class_exec do + alias_method :state_before_explanation=, :state= + alias_method :advance_before_explanation, :advance + + remove_method :state=, :advance + end + end + + # Like #advance, but also pretty-print the token and its position + # in the stream to `stdout`. + def advance + type, (val, range) = advance_before_explanation + + more = "(in-kwarg)" if @context.in_kwarg + + puts decorate(range, + Color.green("#{type} #{val.inspect}"), + "#{state.to_s.ljust(12)} #{@cond} #{@cmdarg} #{more}") + + [ type, [val, range] ] + end + + def state=(new_state) + puts " #{Color.yellow(">>> STATE SET <<<", bold: true)} " + + "#{new_state.to_s.ljust(12)} #{@cond} #{@cmdarg}".rjust(66) + + self.state_before_explanation = new_state + end + + private + + def decorate(range, token, info) + from, to = range.begin.column, range.end.column + + line = range.source_line + ' ' + line[from...to] = Color.underline(line[from...to]) + + tail_len = to - from - 1 + tail = '~' * (tail_len >= 0 ? tail_len : 0) + decoration = "#{" " * from}#{Color.red("^#{tail}", bold: true)} #{token} ". + ljust(68) + info + + [ line, decoration ] + end + + end + +end diff --git a/vendor/bundle/ruby/3.1.0/gems/parser-3.1.2.0/lib/parser/lexer/literal.rb b/vendor/bundle/ruby/3.1.0/gems/parser-3.1.2.0/lib/parser/lexer/literal.rb new file mode 100644 index 000000000..ea47b46c3 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/parser-3.1.2.0/lib/parser/lexer/literal.rb @@ -0,0 +1,269 @@ +# encoding: binary +# frozen_string_literal: true + +module Parser + + class Lexer::Literal + DELIMITERS = { '(' => ')', '[' => ']', '{' => '}', '<' => '>' } + + TYPES = { + # type start token interpolate? + "'" => [ :tSTRING_BEG, false ], + "<<'" => [ :tSTRING_BEG, false ], + '%q' => [ :tSTRING_BEG, false ], + '"' => [ :tSTRING_BEG, true ], + '<<"' => [ :tSTRING_BEG, true ], + '%' => [ :tSTRING_BEG, true ], + '%Q' => [ :tSTRING_BEG, true ], + + '%w' => [ :tQWORDS_BEG, false ], + '%W' => [ :tWORDS_BEG, true ], + + '%i' => [ :tQSYMBOLS_BEG, false ], + '%I' => [ :tSYMBOLS_BEG, true ], + + ":'" => [ :tSYMBEG, false ], + '%s' => [ :tSYMBEG, false ], + ':"' => [ :tSYMBEG, true ], + + '/' => [ :tREGEXP_BEG, true ], + '%r' => [ :tREGEXP_BEG, true ], + + '%x' => [ :tXSTRING_BEG, true ], + '`' => [ :tXSTRING_BEG, true ], + '<<`' => [ :tXSTRING_BEG, true ], + } + + attr_reader :heredoc_e, :str_s, :dedent_level + attr_accessor :saved_herebody_s + + def initialize(lexer, str_type, delimiter, str_s, heredoc_e = nil, + indent = false, dedent_body = false, label_allowed = false) + @lexer = lexer + @nesting = 1 + + # DELIMITERS and TYPES are hashes with keys encoded in binary. + # Coerce incoming data to the same encoding. + str_type = coerce_encoding(str_type) + delimiter = coerce_encoding(delimiter) + + unless TYPES.include?(str_type) + lexer.send(:diagnostic, :error, :unexpected_percent_str, + { :type => str_type }, @lexer.send(:range, str_s, str_s + 2)) + end + + # String type. For :'foo', it is :' + @str_type = str_type + # Start of the string type specifier. + @str_s = str_s + + @start_tok, @interpolate = TYPES[str_type] + @start_delim = DELIMITERS.include?(delimiter) ? delimiter : nil + @end_delim = DELIMITERS.fetch(delimiter, delimiter) + + @heredoc_e = heredoc_e + @indent = indent + @label_allowed = label_allowed + + @dedent_body = dedent_body + @dedent_level = nil + + @interp_braces = 0 + + @space_emitted = true + + # Monolithic strings are glued into a single token, e.g. + # tSTRING_BEG tSTRING_CONTENT tSTRING_END -> tSTRING. + @monolithic = (@start_tok == :tSTRING_BEG && + %w(' ").include?(str_type) && + !heredoc?) + + # Capture opening delimiter in percent-literals. + @str_type += delimiter if @str_type.start_with?('%'.freeze) + + clear_buffer + + emit_start_tok unless @monolithic + end + + def interpolate? + @interpolate + end + + def words? + type == :tWORDS_BEG || type == :tQWORDS_BEG || + type == :tSYMBOLS_BEG || type == :tQSYMBOLS_BEG + end + + def regexp? + type == :tREGEXP_BEG + end + + def heredoc? + !!@heredoc_e + end + + def plain_heredoc? + heredoc? && !@dedent_body + end + + def squiggly_heredoc? + heredoc? && @dedent_body + end + + def backslash_delimited? + @end_delim == '\\'.freeze + end + + def type + @start_tok + end + + def munge_escape?(character) + character = coerce_encoding(character) + + if words? && character =~ /[ \t\v\r\f\n]/ + true + else + ['\\'.freeze, @start_delim, @end_delim].include?(character) + end + end + + def nest_and_try_closing(delimiter, ts, te, lookahead=nil) + delimiter = coerce_encoding(delimiter) + + if @start_delim && @start_delim == delimiter + @nesting += 1 + elsif delimiter?(delimiter) + @nesting -= 1 + end + + # Finalize if last matching delimiter is closed. + if @nesting == 0 + if words? + extend_space(ts, ts) + end + + if lookahead && @label_allowed && lookahead[0] == ?: && + lookahead[1] != ?: && @start_tok == :tSTRING_BEG + # This is a quoted label. + flush_string + emit(:tLABEL_END, @end_delim, ts, te + 1) + elsif @monolithic + # Emit the string as a single token. + emit(:tSTRING, @buffer, @str_s, te) + else + # If this is a heredoc, @buffer contains the sentinel now. + # Just throw it out. Lexer flushes the heredoc after each + # non-heredoc-terminating \n anyway, so no data will be lost. + flush_string unless heredoc? + + emit(:tSTRING_END, @end_delim, ts, te) + end + end + end + + def infer_indent_level(line) + return if !@dedent_body + + indent_level = 0 + line.each_char do |char| + case char + when ?\s + indent_level += 1 + when ?\t + indent_level += (8 - indent_level % 8) + else + if @dedent_level.nil? || @dedent_level > indent_level + @dedent_level = indent_level + end + break + end + end + end + + def start_interp_brace + @interp_braces += 1 + end + + def end_interp_brace_and_try_closing + @interp_braces -= 1 + + (@interp_braces == 0) + end + + def extend_string(string, ts, te) + @buffer_s ||= ts + @buffer_e = te + + @buffer << string + end + + def flush_string + if @monolithic + emit_start_tok + @monolithic = false + end + + unless @buffer.empty? + emit(:tSTRING_CONTENT, @buffer, @buffer_s, @buffer_e) + + clear_buffer + extend_content + end + end + + def extend_content + @space_emitted = false + end + + def extend_space(ts, te) + flush_string + + unless @space_emitted + emit(:tSPACE, nil, ts, te) + + @space_emitted = true + end + end + + def supports_line_continuation_via_slash? + !words? && @interpolate + end + + protected + + def delimiter?(delimiter) + if @indent + @end_delim == delimiter.lstrip + else + @end_delim == delimiter + end + end + + def coerce_encoding(string) + string.b + end + + def clear_buffer + @buffer = ''.dup + + # Prime the buffer with lexer encoding; otherwise, + # concatenation will produce varying results. + @buffer.force_encoding(@lexer.source_buffer.source.encoding) + + @buffer_s = nil + @buffer_e = nil + end + + def emit_start_tok + str_e = @heredoc_e || @str_s + @str_type.length + emit(@start_tok, @str_type, @str_s, str_e) + end + + def emit(token, type, s, e) + @lexer.send(:emit, token, type, s, e) + end + end + +end diff --git a/vendor/bundle/ruby/3.1.0/gems/parser-3.1.2.0/lib/parser/lexer/stack_state.rb b/vendor/bundle/ruby/3.1.0/gems/parser-3.1.2.0/lib/parser/lexer/stack_state.rb new file mode 100644 index 000000000..d97114f15 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/parser-3.1.2.0/lib/parser/lexer/stack_state.rb @@ -0,0 +1,49 @@ +# frozen_string_literal: true + +module Parser + + class Lexer::StackState + def initialize(name) + @name = name.freeze + clear + end + + def clear + @stack = 0 + end + + def push(bit) + bit_value = bit ? 1 : 0 + @stack = (@stack << 1) | bit_value + + bit + end + + def pop + bit_value = @stack & 1 + @stack >>= 1 + + bit_value == 1 + end + + def lexpop + @stack = ((@stack >> 1) | (@stack & 1)) + @stack[0] == 1 + end + + def active? + @stack[0] == 1 + end + + def empty? + @stack == 0 + end + + def to_s + "[#{@stack.to_s(2)} <= #{@name}]" + end + + alias inspect to_s + end + +end diff --git a/vendor/bundle/ruby/3.1.0/gems/parser-3.1.2.0/lib/parser/macruby.rb b/vendor/bundle/ruby/3.1.0/gems/parser-3.1.2.0/lib/parser/macruby.rb new file mode 100644 index 000000000..e490e4198 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/parser-3.1.2.0/lib/parser/macruby.rb @@ -0,0 +1,6177 @@ +# -*- encoding:utf-8; warn-indent:false; frozen_string_literal: true -*- +# +# DO NOT MODIFY!!!! +# This file is automatically generated by Racc 1.4.15 +# from Racc grammer file "". +# + +require 'racc/parser.rb' + + +require 'parser' + +module Parser + class MacRuby < Parser::Base + + + def version + 19 # closest released match: v1_9_0_2 + end + + def default_encoding + Encoding::BINARY + end + + def local_push + @static_env.extend_static + @lexer.cmdarg.push(false) + @lexer.cond.push(false) + end + + def local_pop + @static_env.unextend + @lexer.cmdarg.pop + @lexer.cond.pop + end +##### State transition tables begin ### + +clist = [ +'-286,-97,205,206,419,-94,-94,-286,-286,-286,257,205,206,-286,-286,-80', +'-286,556,514,468,588,-66,514,208,514,-97,-470,-468,535,486,487,205,206', +'-470,-468,-95,-286,-286,707,-286,-286,-286,-286,-286,897,-95,720,514', +'514,759,719,-96,-93,-100,587,667,504,205,206,506,209,736,897,667,-99', +'491,-286,-286,-286,-286,-286,-286,-286,-286,-286,-286,-286,-286,-286', +'-286,555,-86,-286,-286,-286,-100,573,-94,923,667,-286,-98,105,-286,499', +'-97,256,104,-286,-95,-286,209,-286,-286,-286,-286,-286,-286,-286,-538', +'-286,-86,-286,897,-99,-97,-538,-538,-538,-94,-97,209,-538,-538,-94,-538', +'-286,-286,-534,-90,-89,-286,105,534,-538,-98,105,104,105,786,-87,104', +'257,104,257,-538,-538,209,-538,-538,-538,-538,-538,105,758,105,-535', +'-85,104,-95,104,105,105,105,-95,-96,104,104,104,-91,-96,588,940,-473', +'-96,-538,-538,-538,-538,-538,-538,-538,-538,-538,-538,-538,-538,-538', +'-538,105,-92,-538,-538,-538,104,574,-90,-404,504,-538,-538,503,-538', +'767,803,587,252,-538,252,-538,931,-538,-538,-538,-538,-538,-538,-538', +'76,-538,-538,-538,-93,569,-87,932,105,77,256,-538,256,104,767,545,-463', +'-538,-538,78,-88,-534,-538,-463,-463,-463,-96,200,-463,-463,-463,-404', +'-463,768,-538,-94,504,228,-404,506,-463,-538,-463,-463,-463,526,-534', +'-404,-89,527,-538,199,-463,-463,-97,-463,-463,-463,-463,-463,198,-88', +'817,-538,-89,-404,197,588,-538,225,-538,588,-87,227,226,-534,547,546', +'557,-538,781,631,-463,-463,-463,-463,-463,-463,-463,-463,-463,-463,-463', +'-463,-463,-463,897,-538,-463,-463,-463,587,-463,-463,466,587,-463,-473', +'-87,-463,-463,-87,-463,631,-463,520,-463,-87,-463,-463,-463,-463,-463', +'-463,-463,-465,-463,491,-463,209,-89,732,-465,647,646,645,651,648,205', +'206,-532,-531,-463,-463,-463,-463,-538,-463,204,-463,-85,-463,568,-538', +'-538,-538,-93,-466,-538,-538,-538,113,-538,953,-466,897,-89,897,653', +'-89,-91,-538,-538,-538,-538,-89,-99,657,656,660,659,504,-538,-538,506', +'-538,-538,-538,-538,-538,897,-92,-463,-460,957,-87,540,-100,940,-463', +'-460,-95,105,541,-532,-531,545,104,-463,-460,960,731,-538,-538,-538', +'-538,-538,-538,-538,-538,-538,-538,-538,-538,-538,-538,-532,-531,-538', +'-538,-538,-287,721,-538,-463,961,-538,963,-287,-538,-538,-463,-538,897', +'-538,545,-538,-287,-538,-538,-538,-538,-538,-538,-538,897,-538,-538', +'-538,775,545,647,646,645,651,648,545,547,546,550,545,530,-538,-538,-538', +'-538,-286,-538,922,-538,940,-96,209,-286,-286,-286,105,531,-286,-286', +'-286,104,-286,775,522,647,646,645,651,648,105,523,-286,-286,-286,104', +'547,546,543,105,521,209,-286,-286,104,-286,-286,-286,-286,-286,376,547', +'546,205,206,378,377,547,546,552,699,547,546,548,-467,105,228,850,302', +'303,104,-467,-286,-286,-286,-286,-286,-286,-286,-286,-286,-286,-286', +'-286,-286,-286,228,-472,-286,-286,-286,482,722,-286,-472,228,-286,228', +'483,-286,-286,938,-286,-472,-286,209,-286,481,-286,-286,-286,-286,-286', +'-286,-286,-80,-286,775,-286,647,646,645,651,648,775,613,647,646,645', +'651,648,202,-286,-286,-286,-286,-460,-286,203,-286,209,-98,897,-460', +'-460,-460,-535,201,-460,-460,-460,497,-460,775,653,647,646,645,651,648', +'-460,771,-460,-460,-460,660,659,249,781,631,774,624,-460,-460,250,-460', +'-460,-460,-460,-460,775,-469,647,646,645,651,648,578,-469,-534,771,775', +'101,647,646,645,651,648,631,774,205,206,-460,-460,-460,-460,-460,-460', +'-460,-460,-460,-460,-460,-460,-460,-460,252,771,-460,-460,-460,209,-460', +'-460,228,209,-460,663,771,-460,-460,-266,-460,564,-460,561,-460,901', +'-460,-460,-460,-460,-460,-460,-460,520,-460,775,-460,647,646,645,651', +'648,670,558,225,940,698,-471,227,226,-460,-460,-460,-460,-471,-460,701', +'-460,-267,-460,277,69,70,66,9,52,-460,708,525,58,59,524,653,-460,62', +'453,60,61,63,28,29,67,68,660,659,368,453,520,27,26,25,93,92,94,95,209', +'775,18,647,646,645,651,648,8,42,724,10,97,96,98,87,51,89,88,90,468,91', +'99,100,508,85,86,39,40,38,775,466,647,646,645,651,648,775,771,647,646', +'645,651,648,-280,209,-286,-472,507,37,743,-280,31,-286,-472,53,54,468', +'-535,55,-280,33,-286,-472,624,41,775,771,647,646,645,651,648,19,653', +'209,500,499,84,76,79,80,252,81,82,660,659,228,77,83,5,69,70,66,9,52', +'57,252,78,58,59,624,228,653,62,228,60,61,63,28,29,67,68,493,660,659', +'750,492,27,26,25,93,92,94,95,-266,775,18,647,646,645,651,648,8,42,7', +'10,97,96,98,87,51,89,88,90,754,91,99,100,761,85,86,39,40,38,775,763', +'647,646,645,651,648,775,771,647,646,645,651,648,-287,766,884,-280,769', +'37,777,-287,31,885,-280,53,54,778,631,55,-287,33,883,-280,785,41,775', +'771,647,646,645,651,648,19,653,488,209,252,84,76,79,80,209,81,82,660', +'659,261,77,83,277,69,70,66,9,52,57,484,78,58,59,209,794,653,62,477,60', +'61,63,28,29,67,68,476,660,659,-268,209,27,26,25,93,92,94,95,-65,815', +'18,647,646,645,468,648,8,42,466,10,97,96,98,87,51,89,88,90,464,91,99', +'100,805,85,86,39,40,38,815,494,647,646,645,807,648,775,495,647,646,645', +'651,648,-330,810,530,417,811,37,731,-330,31,529,818,53,54,453,209,55', +'-330,33,531,824,825,41,775,208,647,646,645,651,648,19,653,624,421,420', +'84,76,79,80,418,81,82,660,659,731,77,83,277,69,70,66,9,52,57,845,78', +'58,59,848,767,653,62,209,60,61,63,28,29,67,68,852,660,659,379,854,27', +'26,25,93,92,94,95,693,694,18,366,695,99,100,209,8,42,860,10,97,96,98', +'87,51,89,88,90,301,91,99,100,862,85,86,39,40,38,228,108,109,110,111', +'112,209,775,-286,647,646,645,651,648,-287,-286,865,-269,872,37,-535', +'-287,31,873,-286,53,54,300,876,55,-287,33,225,878,466,41,227,226,223', +'224,881,886,247,19,653,209,890,893,84,76,79,80,895,81,82,660,659,897', +'77,83,277,69,70,66,9,52,57,897,78,58,59,209,902,905,62,906,60,61,63', +'28,29,67,68,108,109,110,111,112,27,26,25,93,92,94,95,911,913,18,916', +'918,228,,,8,42,,10,97,96,98,87,51,89,88,90,,91,99,100,,85,86,39,40,38', +'228,-557,-557,-557,-557,234,236,225,-286,-557,-557,227,226,223,224,-286', +'242,243,,37,-535,,31,,-286,53,54,,,55,,33,225,,231,41,227,226,223,224', +'235,233,229,19,230,,,,84,76,79,80,,81,82,,,,77,83,277,69,70,66,9,52', +'57,,78,58,59,,,,62,,60,61,63,28,29,67,68,108,109,110,111,112,27,26,25', +'93,92,94,95,,,18,108,109,110,111,112,8,42,,10,97,96,98,87,51,89,88,90', +',91,99,100,,85,86,39,40,38,228,232,237,238,239,234,236,244,415,240,241', +',,,,416,242,243,,37,,,31,,417,53,54,,,55,,33,225,,231,41,227,226,223', +'224,235,233,229,19,230,,,,84,76,79,80,,81,82,,,,77,83,277,69,70,66,9', +'52,57,,78,58,59,,,,62,,60,61,63,28,29,67,68,,,,,,27,26,25,93,92,94,95', +',,18,,,,,562,8,42,,10,97,96,98,87,51,89,88,90,,91,99,100,,85,86,39,40', +'38,228,232,237,238,239,234,236,244,245,240,241,,221,222,,,242,243,,37', +',,31,,,53,54,,,55,,33,225,,231,41,227,226,223,224,235,233,229,19,230', +',,,84,76,79,80,,81,82,,,,77,83,,246,-281,-233,,,57,,78,-281,-281,-281', +',,-281,-281,-281,732,-281,647,646,645,651,648,,,,,-281,-281,-281,,,', +',,,,-281,-281,,-281,-281,-281,-281,-281,,,,,,,,,653,,,,,,,,,657,656', +'660,659,,-281,-281,-281,-281,-281,-281,-281,-281,-281,-281,-281,-281', +'-281,-281,,,-281,-281,-281,,,-281,,,-281,,,-281,-281,,-281,,-281,,-281', +',-281,-281,-281,-281,-281,-281,-281,,-281,,-281,,,,,,,,,,,,,,-281,-281', +'-281,-281,,-281,,-281,5,69,70,66,9,52,,,,58,59,,,,62,,60,61,63,28,29', +'67,68,,,,,,27,26,25,93,92,94,95,,,18,,,,,,8,42,7,10,97,96,98,87,51,89', +'88,90,,91,99,100,,85,86,39,40,38,228,,,,,,,,,,,,,,,,242,243,,37,,,31', +',,53,54,,,55,,33,225,,231,41,227,226,223,224,,,229,19,230,,,,84,76,79', +'80,,81,82,,,,77,83,277,69,70,66,9,52,57,,78,58,59,,,,62,,60,61,63,28', +'29,67,68,,,,,,27,26,25,93,92,94,95,,,18,,,,,,8,42,,10,97,96,98,87,51', +'89,88,90,,91,99,100,,85,86,39,40,38,228,,,,,,,,,,,,,,,,242,243,,37,', +',31,,,53,54,,,55,,33,225,,231,41,227,226,223,224,,,229,19,230,,,,84', +'76,79,80,,81,82,,,,77,83,277,69,70,66,9,52,57,,78,58,59,,,,62,,60,61', +'63,28,29,67,68,,,,,,27,26,25,93,92,94,95,,,18,,,,,,8,42,,10,97,96,98', +'87,51,89,88,90,,91,99,100,,85,86,39,40,38,228,,,,,,,,,,,,,,,,242,243', +',37,,,31,,,53,54,,,55,,33,225,,231,41,227,226,223,224,,,229,19,230,', +',,84,76,79,80,,81,82,,,,77,83,277,69,70,66,9,52,57,,78,58,59,,,,62,', +'60,61,63,28,29,67,68,,,,,,27,26,25,93,92,94,95,,,18,,,,,,8,42,,10,97', +'96,98,87,51,89,88,90,,91,99,100,,85,86,39,40,38,228,232,237,238,239', +'234,236,244,245,240,241,,-557,-557,,,242,243,,37,,,31,,,53,54,,,55,', +'33,225,,231,41,227,226,223,224,235,233,229,19,230,,,,84,76,79,80,,81', +'82,,,,77,83,277,69,70,66,9,52,57,,78,58,59,,,,62,,60,61,63,28,29,67', +'68,,,,,,27,26,25,93,92,94,95,,,18,,,,,,8,42,,10,97,96,98,87,51,89,88', +'90,,91,99,100,,85,86,39,40,38,228,232,237,238,239,234,236,244,245,240', +'241,,-557,-557,,,242,243,,37,,,31,,,53,54,,,55,,33,225,,231,41,227,226', +'223,224,235,233,229,19,230,,,,84,76,79,80,,81,82,,,,77,83,277,69,70', +'66,9,52,57,,78,58,59,,,,62,,60,61,63,28,29,67,68,,,,,,27,26,25,93,92', +'94,95,,,18,,,,,,8,42,,10,97,96,98,87,51,89,88,90,,91,99,100,,85,86,39', +'40,38,228,-557,-557,-557,-557,234,236,,,-557,-557,,,,,,242,243,,37,', +',279,,,53,54,,,55,,33,225,,231,41,227,226,223,224,235,233,229,19,230', +',,,84,76,79,80,,81,82,,,,77,83,277,69,70,66,9,52,57,,78,58,59,,,,62', +',60,61,63,28,29,67,68,,,,,,27,26,25,93,92,94,95,,,18,,,,,,8,42,,10,97', +'96,98,87,51,89,88,90,,91,99,100,,85,86,39,40,38,228,,,,,,,,,,,,,,,,242', +'243,,37,,,31,,,53,54,,,55,,33,225,,231,41,227,226,223,224,,,229,19,230', +',,,84,76,79,80,,81,82,,,,77,83,277,69,70,66,9,52,57,,78,58,59,,,,62', +',60,61,63,28,29,67,68,,,,,,27,26,25,93,92,94,95,,,18,,,,,,8,42,,10,97', +'96,98,87,51,89,88,90,,91,99,100,,85,86,39,40,38,228,-557,-557,-557,-557', +'234,236,,,-557,-557,,,,,,242,243,,37,,,31,,,53,54,,,55,,33,225,,231', +'41,227,226,223,224,235,233,229,19,230,,,,84,76,79,80,,81,82,,,,77,83', +'277,69,70,66,9,52,57,,78,58,59,,,,62,,60,61,63,28,29,67,68,,,,,,27,26', +'25,93,92,94,95,,,18,,,,,,8,42,,10,97,96,98,87,51,89,88,90,,91,99,100', +',85,86,39,40,38,228,-557,-557,-557,-557,234,236,,,-557,-557,,,,,,242', +'243,,37,,,31,,,53,54,,,55,,33,225,,231,41,227,226,223,224,235,233,229', +'19,230,,,,84,76,79,80,,81,82,,,,77,83,277,69,70,66,9,52,57,,78,58,59', +',,,62,,60,61,63,28,29,67,68,,,,,,27,26,25,93,92,94,95,,,18,,,,,,8,42', +',10,97,96,98,87,51,89,88,90,,91,99,100,,85,86,39,40,38,228,-557,-557', +'-557,-557,234,236,,,-557,-557,,,,,,242,243,,37,,,31,,,53,54,,,55,,33', +'225,,231,41,227,226,223,224,235,233,229,19,230,,,,84,76,79,80,,81,82', +',,,77,83,277,69,70,66,9,52,57,,78,58,59,,,,62,,60,61,63,28,29,67,68', +',,,,,27,26,25,93,92,94,95,,,18,,,,,,8,42,,10,97,96,98,87,51,89,88,90', +',91,99,100,,85,86,39,40,38,228,232,237,238,239,234,236,,,240,241,,,', +',,242,243,,37,,,279,,,53,54,,,55,,33,225,,231,41,227,226,223,224,235', +'233,229,19,230,,,,84,76,79,80,,81,82,,,,77,83,277,69,70,66,9,52,57,', +'78,58,59,,,,62,,60,61,63,28,29,67,68,,,,,,27,26,25,93,92,94,95,,,18', +',,,,,8,42,,10,97,96,98,87,51,89,88,90,,91,99,100,,85,86,39,40,38,228', +'-557,-557,-557,-557,234,236,,,-557,-557,,,,,,242,243,,37,,,31,,,53,54', +',,55,,33,225,,231,41,227,226,223,224,235,233,229,19,230,,,,84,76,79', +'80,,81,82,,,,77,83,277,69,70,66,9,52,57,,78,58,59,,,,62,,60,61,63,28', +'29,67,68,,,,,,27,26,25,93,92,94,95,,,18,,,,,,8,42,,10,97,96,98,87,51', +'89,88,90,,91,99,100,,85,86,39,40,38,228,,,,,,,,,,,,,,,,242,243,,37,', +',31,,,53,54,,,55,,33,225,,,41,227,226,223,224,,,,19,,,,,84,76,79,80', +',81,82,,,,77,83,277,69,70,66,9,52,57,,78,58,59,,,,62,,60,61,63,28,29', +'67,68,,,,,,27,26,25,93,92,94,95,,,18,,,,,,8,42,,10,97,96,98,87,51,89', +'88,90,,91,99,100,,85,86,39,40,38,228,,,,,,,,,,,,,,,,242,243,,37,,,31', +',,53,54,,,55,,33,225,,231,41,227,226,223,224,,,,19,,,,,84,76,79,80,', +'81,82,,,,77,83,277,69,70,66,9,52,57,,78,58,59,,,,62,,60,61,63,28,29', +'67,68,,,,,,27,26,25,93,92,94,95,,,18,,,,,,8,42,,10,97,96,98,87,51,89', +'88,90,,91,99,100,,85,86,39,40,38,228,,,,,,,,,,,,,,,,242,243,,37,,,31', +',,53,54,,,55,,33,225,,231,41,227,226,223,224,,,,19,,,,,84,76,79,80,', +'81,82,,,,77,83,277,69,70,66,9,52,57,,78,58,59,,,,62,,60,61,63,28,29', +'67,68,,,,,,27,26,25,93,92,94,95,,,18,,,,,,8,42,,10,97,96,98,87,51,89', +'88,90,,91,99,100,,85,86,39,40,38,,,,,,,,,,,,,,,,,,,,37,,,31,,,53,54', +',,55,,33,,,,41,,,,,,,,19,,,,,84,76,79,80,,81,82,,,,77,83,277,69,70,66', +'9,52,57,,78,58,59,,,,62,,60,61,63,28,29,67,68,,,,,,27,26,25,93,92,94', +'95,,,18,,,,,,8,42,,10,97,96,98,87,51,89,88,90,,91,99,100,,85,86,39,40', +'38,,,,,,,,,,,,,,,,,,,,37,,,31,,,53,54,,,55,,33,,,,41,,,,,,,,19,,,,,84', +'76,79,80,,81,82,,,,77,83,277,69,70,66,9,52,57,,78,58,59,,,,62,,60,61', +'63,28,29,67,68,,,,,,27,26,25,93,92,94,95,,,18,,,,,,8,42,,10,97,96,98', +'87,51,89,88,90,,91,99,100,,85,86,39,40,38,,,,,,,,,,,,,,,,,,,,37,,,279', +',,53,54,,,55,,33,,,,41,,,,,,,,19,,,,,84,76,79,80,,81,82,,,,77,83,277', +'69,70,66,9,52,57,,78,58,59,,,,62,,60,61,63,28,29,67,68,,,,,,27,26,25', +'93,92,94,95,,,18,,,,,,8,42,,10,97,96,98,87,51,89,88,90,,91,99,100,,85', +'86,39,40,38,,,,,,,,,,,,,,,,,,,,37,,,31,,,53,54,,,55,,33,,,,41,,,,,,', +',19,,,,,84,76,79,80,,81,82,,,,77,83,277,69,70,66,9,52,57,,78,58,59,', +',,62,,60,61,63,28,29,67,68,,,,,,27,26,25,93,92,94,95,,,18,,,,,,8,42', +',10,97,96,98,87,51,89,88,90,,91,99,100,,85,86,39,40,38,,,,,,,,,,,,,', +',,,,,,37,,,31,,,53,54,,,55,,33,,,,41,,,,,,,,19,,,,,84,76,79,80,,81,82', +',,,77,83,277,69,70,66,9,52,57,,78,58,59,,,,62,,60,61,63,28,29,67,68', +',,,,,27,26,25,93,92,94,95,,,18,,,,,565,8,42,,10,97,96,98,87,51,89,88', +'90,,91,99,100,,85,86,39,40,38,228,232,237,238,239,234,236,244,245,240', +'241,,221,222,,,242,243,,37,,,31,,,53,54,,,55,,33,225,,231,41,227,226', +'223,224,235,233,229,19,230,,,,84,76,79,80,,81,82,,,,77,83,,246,-540', +',,,57,,78,-540,-540,-540,,,-540,-540,-540,732,-540,647,646,645,651,648', +',,,-540,-540,-540,-540,,,,,,,,-540,-540,,-540,-540,-540,-540,-540,,', +',,,,,,653,,,,,,,,,657,656,660,659,,-540,-540,-540,-540,-540,-540,-540', +'-540,-540,-540,-540,-540,-540,-540,,,-540,-540,-540,,,-540,,,-540,,', +'-540,-540,,-540,,-540,,-540,,-540,-540,-540,-540,-540,-540,-540,-539', +'-540,-540,-540,,,,-539,-539,-539,,,-539,-539,-539,,-539,-540,-540,-540', +'-540,,-540,,-540,-539,-539,-539,-539,,,,,,,,-539,-539,,-539,-539,-539', +'-539,-539,,,,,,,,,,,,,,,,,,,,,,,-539,-539,-539,-539,-539,-539,-539,-539', +'-539,-539,-539,-539,-539,-539,,,-539,-539,-539,,,-539,,,-539,,,-539', +'-539,,-539,,-539,,-539,,-539,-539,-539,-539,-539,-539,-539,,-539,-539', +'-539,,,,,,,,,,,,,,-539,-539,-539,-539,,-539,,-539,277,69,70,66,9,52', +',,,58,59,,,,62,,60,61,63,28,29,67,68,,,,,,27,26,25,93,92,94,95,,,18', +',,,,,8,42,,10,97,96,98,87,51,89,88,90,,91,99,100,,85,86,39,40,38,,,', +',,,,,,,,,,,,,,,,37,,,31,,,53,54,,,55,,33,,,,41,,,,,,,,19,,,,,84,76,79', +'80,,81,82,,,,77,83,277,69,70,66,9,52,57,,78,58,59,,,,62,,60,61,63,28', +'29,67,68,,,,,,27,26,25,93,92,94,95,,,18,,,,,,8,42,,10,97,96,98,87,51', +'89,88,90,,91,99,100,,85,86,39,40,38,,,,,,,,,,,,,,,,,,,,37,,,31,,,53', +'54,,,55,,33,,,,41,,,,,,,,19,,,,,84,76,79,80,,81,82,,,,77,83,,69,70,66', +',52,57,,78,58,59,,,,62,,60,61,63,28,29,67,68,,,,,,27,26,25,93,92,94', +'95,,,220,,,,,,,42,,,97,96,98,87,51,89,88,90,,91,99,100,,85,86,39,40', +'38,,,,,,,,,,,,,,,,,,,,213,,,219,,,53,54,,,55,,,,,,41,,,,,,,,218,,,,', +'84,76,79,80,,81,82,,,,77,83,,69,70,66,,52,57,,78,58,59,,,,62,,60,61', +'63,28,29,67,68,,,,,,27,26,25,93,92,94,95,,,18,,,,,,,42,,,97,96,98,87', +'51,89,88,90,,91,99,100,,85,86,39,40,38,,,,,,,,,,,,,,,,,,,,213,,,219', +',,53,54,,,55,,,,,,41,,,,,,,,19,,,,,84,76,79,80,,81,82,,,,77,83,,69,70', +'66,,52,57,,78,58,59,,,,62,,60,61,63,28,29,67,68,,,,,,27,26,25,93,92', +'94,95,,,18,,,,,,,42,,,97,96,98,87,51,89,88,90,,91,99,100,,85,86,39,40', +'38,,,,,,,,,,,,,,,,,,,,213,,,219,,,53,54,,,55,,,,,,41,,,,,,,,19,,,,,84', +'76,79,80,,81,82,,,,77,83,,69,70,66,,52,57,,78,58,59,,,,62,,60,61,63', +'28,29,67,68,,,,,,27,26,25,93,92,94,95,,,18,,,,,,,42,,,97,96,98,87,51', +'89,88,90,,91,99,100,,85,86,39,40,38,,,,,,,,,,,,,,,,,,,,213,,,219,,,53', +'54,,,55,,,,,,41,,,,,,,,19,,,,,84,76,79,80,,81,82,,,,77,83,,69,70,66', +',52,57,,78,58,59,,,,62,,60,61,63,28,29,67,68,,,,,,27,26,25,93,92,94', +'95,,,18,,,,,,,42,,,97,96,98,87,51,89,88,90,,91,99,100,,85,86,39,40,38', +',,,,,,,,,,,,,,,,,,,213,,,219,,,53,54,,,55,,,,,,41,,,,,,,,19,,,,,84,76', +'79,80,,81,82,,,,77,83,209,69,70,66,,52,57,,78,58,59,,,,62,,60,61,63', +'293,294,67,68,,,,,,289,290,296,93,92,94,95,,,220,,,,,,,42,,,97,96,98', +'87,51,89,88,90,,91,99,100,,85,86,39,40,38,,,,,,,,,,,,,,,,,,,,213,,,219', +',,53,54,,,55,,,,,,41,,,,,,,,218,,,,,84,76,79,80,,81,82,,,,77,83,,69', +'70,66,,52,57,,78,58,59,,,,62,,60,61,63,293,294,67,68,,,,,,289,290,296', +'93,92,94,95,,,220,,,,,,,291,,,97,96,98,87,51,89,88,90,,91,99,100,,85', +'86,,732,297,647,646,645,651,648,,,,,,,,,,,,,,,831,,,219,,,53,54,,,55', +',,,,,653,,,,,,,,,657,656,660,659,84,76,79,80,,81,82,,,,77,83,,69,70', +'66,,52,57,,78,58,59,,,,62,,60,61,63,293,294,67,68,,,,,,289,290,296,93', +'92,94,95,,,220,,,,,,,42,,,97,96,98,87,51,89,88,90,,91,99,100,,85,86', +'39,40,38,,,,,,,,,,,,,,,,,,,,213,,,219,,,53,54,,,55,,,,,,41,,,,,,,,218', +',,,,84,76,79,80,,81,82,,,,77,83,,69,70,66,,52,57,,78,58,59,,,,62,,60', +'61,63,293,294,67,68,,,,,,289,290,296,93,92,94,95,,,220,,,,,,,42,,,97', +'96,98,87,51,89,88,90,272,91,99,100,,85,86,39,40,38,,,,,,,,,,,,,,,,,', +',,213,,,219,,,53,54,,,55,,270,,268,,41,,,,,,,,218,,,,,84,76,79,80,,81', +'82,,,,77,83,,69,70,66,,52,57,,78,58,59,,,,62,,60,61,63,293,294,67,68', +',,,,,289,290,296,93,92,94,95,,,220,,,,,,,42,,,97,96,98,87,51,89,88,90', +',91,99,100,,85,86,39,40,38,,,,,,,,,,,,,,,,,,,,213,,,219,,,53,54,,,55', +',,,,,41,,,,,,,,218,,,,,84,76,79,80,,81,82,,,,77,83,,69,70,66,,52,57', +',78,58,59,,,,62,,60,61,63,293,294,67,68,,,,,,289,290,296,93,92,94,95', +',,220,,,,,,,42,,,97,96,98,87,51,89,88,90,,91,99,100,,85,86,39,40,38', +',,,,,,,,,,,,,,,,,,,213,,,219,,,53,54,,,55,,,,,,41,,,,,,,,218,,,,,84', +'76,79,80,,81,82,,,,77,83,,69,70,66,,52,57,,78,58,59,,,,62,,60,61,63', +'293,294,67,68,,,,,,289,290,296,93,92,94,95,,,220,,,,,,,42,,,97,96,98', +'87,51,89,88,90,,91,99,100,,85,86,39,40,38,,,,,,,,,,,,,,,,,,,,213,,,219', +',,53,54,,,55,,,,,,41,,,,,,,,218,,,,,84,76,79,80,,81,82,,,,77,83,,69', +'70,66,,52,57,,78,58,59,,,,62,,60,61,63,293,294,67,68,,,,,,289,290,296', +'93,92,94,95,,,220,,,,,,,42,,,97,96,98,87,51,89,88,90,,91,99,100,,85', +'86,39,40,38,,,,,,,,,,,,,,,,,,,,213,,,219,,,53,54,,,55,,,,,,41,,,,,,', +',218,,,,,84,76,79,80,,81,82,,,,77,83,,69,70,66,,52,57,,78,58,59,,,,62', +',60,61,63,293,294,67,68,,,,,,289,290,296,93,92,94,95,,,220,,,,,,,42', +',,97,96,98,87,51,89,88,90,,91,99,100,,85,86,39,40,38,,,,,,,,,,,,,,,', +',,,,213,,,219,,,53,54,,,55,,,,,,41,,,,,,,,218,,,,,84,76,79,80,,81,82', +',,,77,83,,69,70,66,,52,57,,78,58,59,,,,62,,60,61,63,293,294,67,68,,', +',,,289,290,296,93,92,94,95,,,220,,,,,,,42,,,97,96,98,87,51,89,88,90', +',91,99,100,,85,86,39,40,38,,,,,,,,,,,,,,,,,,,,213,,,219,,,53,54,,,55', +',,,,,41,,,,,,,,218,,,,,84,76,79,80,,81,82,,,,77,83,,69,70,66,,52,57', +',78,58,59,,,,62,,60,61,63,293,294,67,68,,,,,,289,290,296,93,92,94,95', +',,220,,,,,,,42,,,97,96,98,87,51,89,88,90,,91,99,100,,85,86,39,40,38', +',,,,,,,,,,,,,,,,,,,213,,,219,,,53,54,,,55,,,,,,41,,,,,,,,218,,,,,84', +'76,79,80,,81,82,,,,77,83,,69,70,66,,52,57,,78,58,59,,,,62,,60,61,63', +'293,294,67,68,,,,,,289,290,296,93,92,94,95,,,220,,,,,,,42,,,97,96,98', +'87,51,89,88,90,,91,99,100,,85,86,39,40,38,,,,,,,,,,,,,,,,,,,,213,,,219', +',,53,54,,,55,,,,,,41,,,,,,,,218,,,,,84,76,79,80,,81,82,,,,77,83,,69', +'70,66,,52,57,,78,58,59,,,,62,,60,61,63,293,294,67,68,,,,,,289,290,296', +'93,92,94,95,,,220,,,,,,,42,,,97,96,98,87,51,89,88,90,,91,99,100,,85', +'86,39,40,38,,,,,,,,,,,,,,,,,,,,213,,,219,,,53,54,,,55,,,,,,41,,,,,,', +',218,,,,,84,76,79,80,,81,82,,,,77,83,,69,70,66,,52,57,,78,58,59,,,,62', +',60,61,63,293,294,67,68,,,,,,289,290,296,93,92,94,95,,,220,,,,,,,42', +',,97,96,98,87,51,89,88,90,,91,99,100,,85,86,39,40,38,,,,,,,,,,,,,,,', +',,,,213,,,219,,,53,54,,,55,,,,,,41,,,,,,,,218,,,,,84,76,79,80,,81,82', +',,,77,83,,69,70,66,,52,57,,78,58,59,,,,62,,60,61,63,293,294,67,68,,', +',,,289,290,296,93,92,94,95,,,220,,,,,,,42,,,97,96,98,87,51,89,88,90', +',91,99,100,,85,86,39,40,38,,,,,,,,,,,,,,,,,,,,213,,,219,,,53,54,,,55', +',,,,,41,,,,,,,,218,,,,,84,76,79,80,,81,82,,,,77,83,,69,70,66,,52,57', +',78,58,59,,,,62,,60,61,63,293,294,67,68,,,,,,289,290,296,93,92,94,95', +',,220,,,,,,,42,,,97,96,98,87,51,89,88,90,,91,99,100,,85,86,39,40,38', +',,,,,,,,,,,,,,,,,,,213,,,219,,,53,54,,,55,,,,,,41,,,,,,,,218,,,,,84', +'76,79,80,,81,82,,,,77,83,,69,70,66,,52,57,,78,58,59,,,,62,,60,61,63', +'293,294,67,68,,,,,,289,290,296,93,92,94,95,,,220,,,,,,,42,,,97,96,98', +'87,51,89,88,90,,91,99,100,,85,86,39,40,38,,,,,,,,,,,,,,,,,,,,213,,,219', +',,53,54,,,55,,,,,,41,,,,,,,,218,,,,,84,76,79,80,,81,82,,,,77,83,,69', +'70,66,,52,57,,78,58,59,,,,62,,60,61,63,293,294,67,68,,,,,,289,290,296', +'93,92,94,95,,,220,,,,,,,42,,,97,96,98,87,51,89,88,90,,91,99,100,,85', +'86,39,40,38,,,,,,,,,,,,,,,,,,,,213,,,219,,,53,54,,,55,,,,,,41,,,,,,', +',218,,,,,84,76,79,80,,81,82,,,,77,83,,69,70,66,,52,57,,78,58,59,,,,62', +',60,61,63,293,294,67,68,,,,,,289,290,296,93,92,94,95,,,220,,,,,,,42', +',,97,96,98,87,51,89,88,90,,91,99,100,,85,86,39,40,38,,,,,,,,,,,,,,,', +',,,,213,,,219,,,53,54,,,55,,,,,,41,,,,,,,,218,,,,,84,76,79,80,,81,82', +',,,77,83,,69,70,66,,52,57,,78,58,59,,,,62,,60,61,63,293,294,67,68,,', +',,,289,290,296,93,92,94,95,,,220,,,,,,,42,,,97,96,98,87,51,89,88,90', +',91,99,100,,85,86,39,40,38,,,,,,,,,,,,,,,,,,,,213,,,219,,,53,54,,,55', +',,,,,41,,,,,,,,218,,,,,84,76,79,80,,81,82,,,,77,83,,69,70,66,,52,57', +',78,58,59,,,,62,,60,61,63,293,294,67,68,,,,,,289,290,296,93,92,94,95', +',,220,,,,,,,42,,,97,96,98,87,51,89,88,90,,91,99,100,,85,86,39,40,38', +',,,,,,,,,,,,,,,,,,,213,,,219,,,53,54,,,55,,,,,,41,,,,,,,,218,,,,,84', +'76,79,80,,81,82,,,,77,83,,69,70,66,,52,57,,78,58,59,,,,62,,60,61,63', +'293,294,67,68,,,,,,289,290,296,93,92,94,95,,,220,,,,,,,42,,,97,96,98', +'87,51,89,88,90,,91,99,100,,85,86,39,40,38,,,,,,,,,,,,,,,,,,,,213,,,219', +',,53,54,,,55,,,,,,41,,,,,,,,218,,,,,84,76,79,80,,81,82,,,,77,83,,69', +'70,66,,52,57,,78,58,59,,,,62,,60,61,63,293,294,67,68,,,,,,289,290,296', +'93,92,94,95,,,220,,,,,,,42,,,97,96,98,87,51,89,88,90,,91,99,100,,85', +'86,39,40,38,,,,,,,,,,,,,,,,,,,,213,,,219,,,53,54,,,55,,,,,,41,,,,,,', +',218,,,,,84,76,79,80,,81,82,,,,77,83,,69,70,66,,52,57,,78,58,59,,,,62', +',60,61,63,293,294,67,68,,,,,,289,290,296,93,92,94,95,,,220,,,,,,,42', +',,97,96,98,87,51,89,88,90,,91,99,100,,85,86,39,40,38,,,,,,,,,,,,,,,', +',,,,213,,,219,,,53,54,,,55,,,,,,41,,,,,,,,218,,,,,84,76,79,80,,81,82', +',,,77,83,,69,70,66,,52,57,,78,58,59,,,,62,,60,61,63,293,294,67,68,,', +',,,289,290,296,93,92,94,95,,,220,,,,,,,42,,,97,96,98,87,51,89,88,90', +',91,99,100,,85,86,39,40,38,,,,,,,,,,,,,,,,,,,,213,,,219,,,53,54,,,55', +',,,,,41,,,,,,,,218,,,,,84,76,79,80,,81,82,,,,77,83,,69,70,66,,52,57', +',78,58,59,,,,62,,60,61,63,293,294,67,68,,,,,,289,290,296,93,92,94,95', +',,220,,,,,,,42,,,97,96,98,87,51,89,88,90,,91,99,100,,85,86,39,40,38', +',,,,,,,,,,,,,,,,,,,213,,,219,,,53,54,,,55,,,,,,41,,,,,,,,218,,,,,84', +'76,79,80,,81,82,,,,77,83,,69,70,66,,52,57,,78,58,59,,,,62,,60,61,63', +'293,294,67,68,,,,,,289,290,296,93,92,94,95,,,220,,,,,,,42,,,97,96,98', +'87,51,89,88,90,,91,99,100,,85,86,39,40,38,,,,,,,,,,,,,,,,,,,,213,,,219', +',,53,54,,,55,,,,,,41,,,,,,,,218,,,,,84,76,79,80,,81,82,,,,77,83,,69', +'70,66,,52,57,,78,58,59,,,,62,,60,61,63,293,294,67,68,,,,,,289,290,296', +'93,92,94,95,,,220,,,,,,,42,,,97,96,98,87,51,89,88,90,,91,99,100,,85', +'86,39,40,38,,,,,,,,,,,,,,,,,,,,213,,,219,,,53,54,,,55,,,,,,41,,,,,,', +',218,,,,,84,76,79,80,,81,82,,,,77,83,,69,70,66,,52,57,,78,58,59,,,,62', +',60,61,63,293,294,67,68,,,,,,289,290,296,93,92,94,95,,,220,,,,,,,42', +',,97,96,98,87,51,89,88,90,,91,99,100,,85,86,39,40,38,,,,,,,,,,,,,,,', +',,,,213,,,219,,,53,54,,,55,,,,,,41,,,,,,,,218,,,,,84,76,79,80,,81,82', +',,,77,83,,69,70,66,,52,57,,78,58,59,,,,62,,60,61,63,293,294,67,68,,', +',,,289,290,296,93,92,94,95,,,220,,,,,,,42,,,97,96,98,87,51,89,88,90', +',91,99,100,,85,86,39,40,38,,,,,,,,,,,,,,,,,,,,213,,,219,,,53,54,,,55', +',,,,,41,,,,,,,,218,,,,,84,76,79,80,,81,82,,,,77,83,,69,70,66,9,52,57', +',78,58,59,,,,62,,60,61,63,28,29,67,68,,,,,,27,26,25,93,92,94,95,,,18', +',,,,,8,42,7,10,97,96,98,87,51,89,88,90,,91,99,100,,85,86,39,40,38,,', +',,,,,,,,,,,,,,,,,37,,,31,,,53,54,,,55,,33,,,,41,,,,,,,,19,,,,,84,76', +'79,80,,81,82,,,,77,83,,69,70,66,,52,57,,78,58,59,,,,62,,60,61,63,293', +'294,67,68,,,,,,289,290,296,93,92,94,95,,,220,,,,,,,42,,,97,96,98,87', +'51,89,88,90,272,91,99,100,,85,86,39,40,38,,,,,,,,,,,,,,,,,,,,213,,,219', +',,53,54,,,55,,270,,268,,41,,,,,,,,218,,,,,84,76,79,80,,81,82,,,,77,83', +',69,70,66,,52,57,,78,58,59,,,,62,,60,61,63,28,29,67,68,,,,,,27,26,25', +'93,92,94,95,,,220,,,,,,,42,,,97,96,98,87,51,89,88,90,272,91,99,100,', +'85,86,39,40,38,,,,,,,,,,,,,,,,,,,,213,,,219,,,53,54,,,55,,270,,268,', +'41,,,,,,,,218,,,,,84,76,79,80,,81,82,,,,77,83,,69,70,66,,52,57,,78,58', +'59,,,,62,,60,61,63,28,29,67,68,,,,,,27,26,25,93,92,94,95,,,220,,,,,', +',42,,,97,96,98,87,51,89,88,90,272,91,99,100,,85,86,39,40,38,,,,,,,,', +',,,,,,,,,,,213,,,219,,,458,54,,,55,,270,,268,,41,,,,,,,,218,,,,,84,76', +'79,80,,81,82,,,,77,83,,69,70,66,,52,57,,78,58,59,,,,62,,60,61,63,28', +'29,67,68,,,,,,27,26,25,93,92,94,95,,,220,,,,,,,42,,,97,96,98,87,51,89', +'88,90,272,91,99,100,,85,86,39,40,38,,,,,,,,,,,,,,,,,,,,213,,,219,,,53', +'54,,,55,,270,,268,,41,,,,,,,,218,,,,,84,76,79,80,,81,82,,,,77,83,209', +'69,70,66,,52,57,,78,58,59,,,,62,,60,61,63,293,294,67,68,,,,,,289,290', +'296,93,92,94,95,,,220,,,,,,,42,,,97,96,98,87,51,89,88,90,,91,99,100', +',85,86,39,40,38,,,,,,,,,,,,,,,,,,,,213,,,219,,,53,54,,,55,,,,,,41,,', +',,,,,218,,,,,84,76,79,80,,81,82,,,,77,83,,69,70,66,,52,57,,78,58,59', +',,,62,,60,61,63,293,294,67,68,,,,,,289,290,296,93,92,94,95,,,220,,,', +',,,42,,,97,96,98,87,51,89,88,90,,91,99,100,,85,86,39,40,38,,,,,,,,,', +',,,,,,,,,,213,,,219,,,53,54,,,55,,,,,,41,,,,,,,,218,,,,,84,76,79,80', +',81,82,,,,77,83,,69,70,66,,52,57,,78,58,59,,,,62,,60,61,63,293,294,67', +'68,,,,,,289,290,296,93,92,94,95,,,220,,,,,,,42,,,97,96,98,87,51,89,88', +'90,,91,99,100,,85,86,39,40,38,,,,,,,,,,,,,,,,,,,,213,,,219,,,53,54,', +',55,,,,,,41,,,,,,,,218,,,,,84,76,79,80,,81,82,,,,77,83,,69,70,66,,52', +'57,,78,58,59,,,,62,,60,61,63,293,294,67,68,,,,,,289,290,296,93,92,94', +'95,,,220,,,,,,,42,,,97,96,98,87,51,89,88,90,,91,99,100,,85,86,39,40', +'38,,,,,,,,,,,,,,,,,,,,213,,,219,,,53,54,,,55,,,,,,41,,,,,,,,218,,,,', +'84,76,79,80,,81,82,,,,77,83,,69,70,66,,52,57,,78,58,59,,,,62,,60,61', +'63,293,294,67,68,,,,,,289,290,296,93,92,94,95,,,220,,,,,,,42,,,97,96', +'98,87,51,89,88,90,,91,99,100,,85,86,39,40,38,,,,,,,,,,,,,,,,,,,,213', +',,219,,,53,54,,,55,,,,,,41,,,,,,,,218,,,,,84,76,79,80,,81,82,,,,77,83', +',69,70,66,,52,57,,78,58,59,,,,62,,60,61,63,293,294,67,68,,,,,,289,290', +'296,93,92,94,95,,,220,,,,,,,42,,,97,96,98,87,51,89,88,90,,91,99,100', +',85,86,39,40,38,,,,,,,,,,,,,,,,,,,,213,,,219,,,53,54,,,55,,,,,,41,,', +',,,,,218,,,,,84,76,79,80,,81,82,,,,77,83,,69,70,66,,52,57,,78,58,59', +',,,62,,60,61,63,293,294,67,68,,,,,,289,290,296,93,92,94,95,,,220,,,', +',,,42,,,97,96,98,87,51,89,88,90,,91,99,100,,85,86,39,40,38,,,,,,,,,', +',,,,,,,,,,213,,,219,,,53,54,,,55,,,,,,41,,,,,,,,218,,,,,84,76,79,80', +',81,82,,,,77,83,,69,70,66,,52,57,,78,58,59,,,,62,,60,61,63,293,294,67', +'68,,,,,,289,290,296,93,92,94,95,,,220,,,,,,,42,,,97,96,98,87,51,89,88', +'90,,91,99,100,,85,86,39,40,38,,,,,,,,,,,,,,,,,,,,213,,,219,,,53,54,', +',55,,,,,,41,,,,,,,,218,,,,,84,76,79,80,,81,82,,,,77,83,,69,70,66,9,52', +'57,,78,58,59,,,,62,,60,61,63,28,29,67,68,,,,,,27,26,25,93,92,94,95,', +',18,,,,,,8,42,,10,97,96,98,87,51,89,88,90,,91,99,100,,85,86,39,40,38', +',,,,,,,,,,,,,,,,,,,37,,,31,,,53,54,,,55,,33,,,,41,,,,,,,,19,,,,,84,76', +'79,80,,81,82,,,,77,83,,69,70,66,,52,57,,78,58,59,,,,62,,60,61,63,28', +'29,67,68,,,,,,27,26,25,93,92,94,95,,,220,,,,,,,42,,,97,96,98,87,51,89', +'88,90,,91,99,100,,85,86,39,40,38,,,,,,,,,,,,,,,,,,,,213,,,219,,,53,54', +',,55,,,,,,41,,,,,,,,218,,,,,84,76,79,80,,81,82,,,,77,83,,69,70,66,,52', +'57,,78,58,59,,,,62,,60,61,63,28,29,67,68,,,,,,27,26,25,93,92,94,95,', +',18,,,,,,,42,,,97,96,98,87,51,89,88,90,,91,99,100,,85,86,39,40,38,,', +',,,,,,,,,,,,,,,,,213,,,219,,,53,54,,,55,,,,,,41,,,,,,,,19,,,,,84,76', +'79,80,,81,82,,,,77,83,,69,70,66,,52,57,,78,58,59,,,,62,,60,61,63,293', +'294,67,68,,,,,,289,290,296,93,92,94,95,,,220,,,,,,,42,,,97,96,98,87', +'51,89,88,90,272,91,99,100,,85,86,39,40,38,,,,,,,,,,,,,,,,,,,,213,,,219', +',,53,54,,,55,,,,268,,41,,,,,,,,218,,,,,84,76,79,80,,81,82,,,,77,83,', +'69,70,66,,52,57,,78,58,59,,,,62,,60,61,63,293,294,67,68,,,,,,289,290', +'296,93,92,94,95,,,220,,,,,,,42,,,97,96,98,87,51,89,88,90,272,91,99,100', +',85,86,39,40,38,,,,,,,,,,,,,,,,,,,,213,,,219,,,53,54,,,55,,608,,268', +',41,,,,,,,,218,,,,,84,76,79,80,,81,82,,,,77,83,,69,70,66,,52,57,,78', +'58,59,,,,62,,60,61,63,28,29,67,68,,,,,,27,26,25,93,92,94,95,,,18,,,', +',,,42,,,97,96,98,87,51,89,88,90,272,91,99,100,,85,86,39,40,38,,,,,,', +',,,,,,,,,,,,,213,,,219,,,53,54,,,55,,,,268,,41,,,,,,,,19,,,,,84,76,79', +'80,,81,82,,,,77,83,,69,70,66,,52,57,,78,58,59,,,,62,,60,61,63,28,29', +'67,68,,,,,,27,26,25,93,92,94,95,,,220,,,,,,,42,,,97,96,98,87,51,89,88', +'90,272,91,99,100,,85,86,39,40,38,,,,,,,,,,,,,,,,,,,,213,,,219,,,53,54', +',,55,,270,,268,,41,,,,,,,,218,,,,,84,76,79,80,,81,82,,,,77,83,,69,70', +'66,,52,57,,78,58,59,,,,62,,60,61,63,293,294,67,68,,,,,,289,290,296,93', +'92,94,95,,,220,,,,,,,42,,,97,96,98,87,51,89,88,90,,91,99,100,,85,86', +'39,40,38,,,,,,,,,,,,,,,,,,,,213,,,219,,,53,54,,,55,,608,,268,,41,,,', +',,,,218,,,,,84,76,79,80,,81,82,,,,77,83,,69,70,66,,52,57,,78,58,59,', +',,62,,60,61,63,293,294,67,68,,,,,,289,290,296,93,92,94,95,,,220,,,,', +',,42,,,97,96,98,87,51,89,88,90,272,91,99,100,,85,86,39,40,38,,,,,,,', +',,,,,,,,,,,,213,,,219,,,53,54,,,55,,608,,268,,41,,,,,,,,218,,,,,84,76', +'79,80,,81,82,,,,77,83,,69,70,66,,52,57,,78,58,59,,,,62,,60,61,63,28', +'29,67,68,,,,,,27,26,25,93,92,94,95,,,220,,,,,,,42,,,97,96,98,87,51,89', +'88,90,,91,99,100,,85,86,39,40,38,,,,,,,,,,,,,,,,,,,,213,,,219,,,53,54', +',,55,,,,,,41,,,,,,,,218,,,,,84,76,79,80,,81,82,,,,77,83,,69,70,66,,52', +'57,,78,58,59,,,,62,,60,61,63,28,29,67,68,,,,,,27,26,25,93,92,94,95,', +',220,,,,,,,42,,,97,96,98,87,51,89,88,90,272,91,99,100,,85,86,39,40,38', +',,,,,,,,,,,,,,,,,,,213,,,219,,,53,54,,,55,,270,,268,,41,,,,,,,,218,', +',,,84,76,79,80,,81,82,,,,77,83,,69,70,66,,52,57,,78,58,59,,,,62,,60', +'61,63,28,29,67,68,,,,,,27,26,25,93,92,94,95,,,220,,,,,,,42,,,97,96,98', +'87,51,89,88,90,272,91,99,100,,85,86,39,40,38,,,,,,,,,,,,,,,,,,,,213', +',,219,,,53,54,,,55,,270,,268,,41,,,,,,,,218,,,,,84,76,79,80,,81,82,', +',,77,83,,69,70,66,,52,57,,78,58,59,,,,62,,60,61,63,28,29,67,68,,,,,', +'27,26,25,93,92,94,95,,,220,,,,,,,42,,,97,96,98,87,51,89,88,90,272,91', +'99,100,,85,86,39,40,38,,,,,,,,,,,,,,,,,,,,213,,,219,,,53,54,,,55,,270', +',268,,41,,,,,,,,218,,,,,84,76,79,80,,81,82,,,,77,83,,69,70,66,,52,57', +',78,58,59,,,,62,,60,61,63,293,294,67,68,,,,,,289,290,296,93,92,94,95', +',,220,,,,,,,291,,,97,96,98,87,51,89,88,90,,91,99,100,,85,86,,650,297', +'647,646,645,651,648,,,,,,,,,,,,,,,287,,,284,,,53,54,,,55,,283,,,,653', +'688,,,,,,,,657,656,660,659,84,76,79,80,,81,82,,,,77,83,,69,70,66,,52', +'57,,78,58,59,,,,62,,60,61,63,293,294,67,68,,,,,,289,290,296,93,92,94', +'95,,,220,,,,,562,,291,,,97,96,98,87,51,89,88,90,,91,99,100,,85,86,,', +'297,228,232,237,238,239,234,236,244,245,240,241,,221,222,,,242,243,', +'287,,,219,,,53,54,,,55,,,225,,231,,227,226,223,224,235,233,229,,230', +',,,84,76,79,80,,81,82,,,,77,83,,246,,299,,,57,,78,69,70,66,,52,,,,58', +'59,,,,62,,60,61,63,293,294,67,68,,,,,,289,290,296,93,92,94,95,,,220', +',,,,,,291,,,97,96,98,87,51,89,88,90,,91,99,100,,85,86,,650,297,647,646', +'645,651,648,,,,,,,,,,,,,,,875,,,219,,,53,54,,,55,,,,,,653,,,,,,,,,657', +'656,660,659,84,76,79,80,,81,82,,,,77,83,,69,70,66,,52,57,,78,58,59,', +',,62,,60,61,63,293,294,67,68,,,,,,289,290,296,93,92,94,95,,,220,,,,', +',,42,,,97,96,98,87,51,89,88,90,,91,99,100,,85,86,39,40,38,,,,,,,,,,', +',,,,,,,,,213,,,219,,,53,54,,,55,,,,,,41,,,,,,,,218,,,,,84,76,79,80,', +'81,82,,,,77,83,,69,70,66,,52,57,,78,58,59,,,,62,,60,61,63,293,294,67', +'68,,,,,,289,290,296,93,92,94,95,,,220,,,,,,,42,,,97,96,98,87,51,89,88', +'90,,91,99,100,,85,86,39,40,38,,,,,,,,,,,,,,,,,,,,213,,,219,,,53,54,', +',55,,,,,,41,,,,,,,,218,,,,,84,76,79,80,,81,82,,,,77,83,,69,70,66,,52', +'57,,78,58,59,,,,62,,60,61,63,293,294,67,68,,,,,,289,290,296,93,92,94', +'95,,,220,,,,,,,42,,,97,96,98,87,51,89,88,90,,91,99,100,,85,86,39,40', +'38,,,,,,,,,,,,,,,,,,,,213,,,219,,,53,54,,,55,,,,,,41,,,,,,,,218,,,,', +'84,76,79,80,,81,82,,,,77,83,,69,70,66,,52,57,,78,58,59,,,,62,,60,61', +'63,293,294,67,68,,,,,,289,290,296,93,92,94,95,,,220,,,,,,,42,,,97,96', +'98,87,51,89,88,90,,91,99,100,,85,86,39,40,38,,,,,,,,,,,,,,,,,,,,213', +',,219,,,53,54,,,55,,,,,,41,,,,,,,,218,,,,,84,76,79,80,,81,82,,,,77,83', +',69,70,66,,52,57,,78,58,59,,,,62,,60,61,63,28,29,67,68,,,,,,27,26,25', +'93,92,94,95,,,18,,,,,,,42,,,97,96,98,87,51,89,88,90,,91,99,100,,85,86', +'39,40,38,,,,,,,,,,,,,,,,,,,,213,,,219,,,53,54,,,55,,,,,,41,,,,,,,,19', +',,,,84,76,79,80,,81,82,,,,77,83,,69,70,66,,52,57,,78,58,59,,,,62,,60', +'61,63,293,294,67,68,,,,,,289,290,296,93,92,94,95,,,220,,,,,,,42,,,97', +'96,98,87,51,89,88,90,272,91,99,100,,85,86,39,40,38,,,,,,,,,,,,,,,,,', +',,213,,,219,,,53,54,,,55,,270,,,,41,,,,,,,,218,,,,,84,76,79,80,,81,82', +',,,77,83,,69,70,66,,52,57,,78,58,59,,,,62,,60,61,63,293,294,67,68,,', +',,,289,290,296,93,92,94,95,,,220,,,,,,,42,,,97,96,98,87,51,89,88,90', +'272,91,99,100,,85,86,39,40,38,,,,,,,,,,,,,,,,,,,,213,,,219,,,53,54,', +',55,,,,,,41,,,,,,,,218,,,,,84,76,79,80,,81,82,,,,77,83,,69,70,66,,52', +'57,,78,58,59,,,,62,,60,61,63,28,29,67,68,,,,,,27,26,25,93,92,94,95,', +',18,,,,,,,42,,,97,96,98,87,51,89,88,90,,91,99,100,,85,86,39,40,38,,', +',,,,,,,,,,,,,,,,,213,,,219,,,53,54,,,55,,,,,,41,,,,,,,,19,,,,,84,76', +'79,80,,81,82,,,,77,83,,69,70,66,,52,57,,78,58,59,,,,62,,60,61,63,28', +'29,67,68,,,,,,27,26,25,93,92,94,95,,,18,,,,,,,42,,,97,96,98,87,51,89', +'88,90,,91,99,100,,85,86,39,40,38,,,,,,,,,,,,,,,,,,,,213,,,219,,,53,54', +',,55,,,,,,41,,,,,,,,19,,,,,84,76,79,80,,81,82,,,,77,83,,69,70,66,,52', +'57,,78,58,59,,,,62,,60,61,63,28,29,67,68,,,,,,27,26,25,93,92,94,95,', +',18,,,,,,,42,,,97,96,98,87,51,89,88,90,,91,99,100,,85,86,39,40,38,228', +'232,237,238,239,234,236,244,245,240,241,,221,222,,,242,243,,213,,-233', +'219,,,53,54,,,55,,,225,,231,41,227,226,223,224,235,233,229,19,230,,', +',84,76,79,80,,81,82,,,,77,83,105,246,,-233,,104,57,,78,69,70,66,,52', +',,,58,59,,,,62,,60,61,63,293,294,67,68,,,,,,289,290,296,93,92,94,95', +',,220,,,,,,,291,,,97,96,98,87,51,89,88,90,,91,99,100,,85,86,,650,297', +'647,646,645,651,648,,,,,,,,,,,,,,,331,,,31,,,53,54,,,55,,33,,,,653,', +',,,,,,,657,656,660,659,84,76,79,80,,81,82,,,,77,83,,69,70,66,,52,57', +',78,58,59,,,,62,,60,61,63,293,294,67,68,,,,,,289,290,296,93,92,94,95', +',,220,,,,,,,291,,,97,96,98,336,51,89,88,337,,91,99,100,,85,86,,650,297', +'647,646,645,651,648,,,,,,,,,,,,343,,,338,,,219,,,53,54,,,55,,,,,,653', +',,,,,,,,657,656,660,659,84,76,79,80,,81,82,,,,77,83,,69,70,66,,52,57', +',78,58,59,,,,62,,60,61,63,293,294,67,68,,,,,,289,290,296,93,92,94,95', +',,220,,,,,,,291,,,97,96,98,336,51,89,88,337,,91,99,100,,85,86,,650,297', +'647,646,645,651,648,,,,,,,,,,,,,,,338,,,219,,,53,54,,,55,,,,,,653,688', +',,,,,,,657,656,660,659,84,76,79,80,,81,82,,,,77,83,,69,70,66,,52,57', +',78,58,59,,,,62,,60,61,63,293,294,67,68,,,,,,289,290,296,93,92,94,95', +',,220,,,,,,,42,,,97,96,98,87,51,89,88,90,,91,99,100,,85,86,39,40,38', +',,,,,,,,,,,,,,,,,,,213,,,219,,,53,54,,,55,,608,,,,41,,,,,,,,218,,,,', +'84,76,79,80,,81,82,,,,77,83,,69,70,66,9,52,57,,78,58,59,,,,62,,60,61', +'63,28,29,67,68,,,,,,27,26,25,93,92,94,95,,,18,,,,,,8,42,7,10,97,96,98', +'87,51,89,88,90,,91,99,100,,85,86,39,40,38,228,232,237,238,239,234,236', +'244,245,240,241,,221,222,,,242,243,,37,,,31,,,53,54,,,55,,33,225,,231', +'41,227,226,223,224,235,233,229,19,230,,,,84,76,79,80,,81,82,,,,77,83', +',246,,,,368,57,,78,69,70,66,,52,,,,58,59,,,,62,,60,61,63,293,294,67', +'68,,,,,,289,290,296,93,92,94,95,,,220,,,,,,,42,,,97,96,98,87,51,89,88', +'90,,91,99,100,,85,86,39,40,38,,,,,,,,,,,,,,,,,,,,213,,,219,,,53,54,', +',55,,,,,,41,,,,,,,,218,,,,,84,76,79,80,,81,82,,,,77,83,,69,70,66,,52', +'57,,78,58,59,,,,62,,60,61,63,28,29,67,68,,,,,,27,26,25,93,92,94,95,', +',18,,,,,,,42,,,97,96,98,87,51,89,88,90,,91,99,100,,85,86,39,40,38,,', +',,,,,,,,,,,,,,,,,213,,,219,,,53,54,,,55,,,,,,41,,,,,,,,19,,,,,84,76', +'79,80,,81,82,,,,77,83,,69,70,66,,52,57,,78,58,59,,,,62,,60,61,63,28', +'29,67,68,,,,,,27,26,25,93,92,94,95,,,18,,,,,,,42,,,97,96,98,87,51,89', +'88,90,,91,99,100,,85,86,39,40,38,,,,,,,,,,,,,,,,,,,,213,,,219,,,53,54', +',,55,,,,,,41,,,,,,,,19,,,,,84,76,79,80,,81,82,,,,77,83,,69,70,66,,52', +'57,,78,58,59,,,,62,,60,61,63,28,29,67,68,,,,,,27,26,25,93,92,94,95,', +',18,,,,,,,42,,,97,96,98,87,51,89,88,90,,91,99,100,,85,86,39,40,38,,', +',,,,,,,,,,,,,,,,,213,,,219,,,53,54,,,55,,,,,,41,,,,,,,,19,,,,,84,76', +'79,80,,81,82,,,,77,83,,69,70,66,9,52,57,,78,58,59,,,,62,,60,61,63,28', +'29,67,68,,,,,,27,26,25,93,92,94,95,,,18,,,,,,8,42,,10,97,96,98,87,51', +'89,88,90,,91,99,100,,85,86,39,40,38,,,,,,,,,,,,,,,,,,,,37,,,31,,,53', +'54,,,55,,33,,,,41,,,,,,,,19,,,,,84,76,79,80,,81,82,,,,77,83,,69,70,66', +',52,57,,78,58,59,,,,62,,60,61,63,28,29,67,68,,,,,,27,26,25,93,92,94', +'95,,,18,,,,,,,42,,,97,96,98,87,51,89,88,90,,91,99,100,,85,86,39,40,38', +',,,,,,,,,,,,,,,,,,,213,,,219,,,53,54,,,55,,,,,,41,,,,,,,,19,,,,,84,76', +'79,80,,81,82,,,,77,83,,69,70,66,,52,57,,78,58,59,,,,62,,60,61,63,28', +'29,67,68,,,,,,27,26,25,93,92,94,95,,,220,,,,,,,42,,,97,96,98,87,51,89', +'88,90,,91,99,100,,85,86,39,40,38,,,,,,,,,,,,,,,,,,,,213,,,219,,,53,54', +',,55,,385,,,,41,,,,,,,,218,,,,,84,76,79,80,,81,82,,,,77,83,,69,70,66', +',52,57,,78,58,59,,,,62,,60,61,63,28,29,67,68,,,,,,27,26,25,93,92,94', +'95,,,220,,,,,,,42,,,97,96,98,87,51,89,88,90,,91,99,100,,85,86,39,40', +'38,,,,,,,,,,,,,,,,,,,,213,,,219,,,53,54,,,55,,385,,,,41,,,,,,,,218,', +',,,84,76,79,80,,81,82,,,,77,83,,69,70,66,,52,57,,78,58,59,,,,62,,60', +'61,63,28,29,67,68,,,,,,27,26,25,93,92,94,95,,,220,,,,,,,42,,,97,96,98', +'87,51,89,88,90,,91,99,100,,85,86,39,40,38,,,,,,,,,,,,,,,,,,,,213,,,219', +',,53,54,,,55,,,,,,41,,,,,,,,218,,,,,84,76,79,80,,81,82,,,,77,83,,69', +'70,66,,52,57,,78,58,59,,,,62,,60,61,63,28,29,67,68,,,,,,27,26,25,93', +'92,94,95,,,220,,,,,,,42,,,97,96,98,87,51,89,88,90,272,91,99,100,,85', +'86,39,40,38,,,,,,,,,,,,,,,,,,,,213,,,219,,,53,54,,,55,,270,,268,,41', +',,,,,,,218,,,,,84,76,79,80,,81,82,,,,77,83,,69,70,66,,52,57,,78,58,59', +',,,62,,60,61,63,293,294,67,68,,,,,,289,290,296,93,92,94,95,,,220,,,', +',,,42,,,97,96,98,87,51,89,88,90,,91,99,100,,85,86,39,40,38,,,,,,,,,', +',,,,,,,,,,213,,,219,,,53,54,,,55,,,,,,41,,,,,,,,218,,,,,84,76,79,80', +',81,82,,,,77,83,,69,70,66,,52,57,,78,58,59,,,,62,,60,61,63,293,294,67', +'68,,,,,,289,290,296,93,92,94,95,,,220,,,,,,,291,,,97,96,98,87,51,89', +'88,90,,91,99,100,,85,86,,,297,228,232,237,238,239,234,236,244,245,240', +'241,,221,222,,,242,243,,287,,,219,,,53,54,,,55,,,225,,231,,227,226,223', +'224,235,233,229,,230,,,,84,76,79,80,,81,82,,,,77,83,,246,,479,,,57,', +'78,69,70,66,,52,,,,58,59,,,,62,,60,61,63,28,29,67,68,,,,,,27,26,25,93', +'92,94,95,,,18,,,,,,,42,,,97,96,98,87,51,89,88,90,,91,99,100,,85,86,39', +'40,38,,,,,,,,,,,,,,,,,,,,213,,,219,,,53,54,,,55,,,,,,41,,,,,,,,19,,', +',,84,76,79,80,,81,82,,,,77,83,,69,70,66,,52,57,,78,58,59,,,,62,,60,61', +'63,293,294,67,68,,,,,,289,290,296,93,92,94,95,,,220,,,,,,,291,,,97,96', +'98,87,51,89,88,90,,91,99,100,,85,86,,650,297,647,646,645,651,648,,,', +',,,,,,,,,,,287,,,284,,,53,54,,,55,,,,,,653,,,,,,,,,657,656,660,659,84', +'76,79,80,,81,82,,,,77,83,,69,70,66,,52,57,,78,58,59,,,,62,,60,61,63', +'293,294,67,68,,,,,,289,290,296,93,92,94,95,,,220,,,,,,,291,,,97,96,98', +'87,51,89,88,90,,91,99,100,,85,86,,650,297,647,646,645,651,648,,,,,,', +',,,,,,,,287,,,284,,,53,54,,,55,,,,,,653,,,,,,,,,657,656,660,659,84,76', +'79,80,,81,82,,,,77,83,,69,70,66,,52,57,,78,58,59,,,,62,,60,61,63,293', +'294,67,68,,,,,,289,290,296,93,92,94,95,,,220,,,,,,,42,,,97,96,98,87', +'51,89,88,90,,91,99,100,,85,86,39,40,38,,,,,,,,,,,,,,,,,,,,213,,,219', +'497,,53,54,,,55,,,,,,41,,,,,,,,218,,,,,84,76,79,80,,81,82,,,,77,83,', +'69,70,66,,52,57,,78,58,59,,,,62,,60,61,63,293,294,67,68,,,,,,289,290', +'296,93,92,94,95,,,220,,,,,,,291,,,97,96,98,87,51,89,88,90,,91,99,100', +',85,86,,650,297,647,646,645,651,648,,,,,,,,,,,,,,,287,,,284,,,53,54', +',,55,,,,,,653,639,,,,,,,,657,656,660,659,84,76,79,80,,81,82,,,,77,83', +',69,70,66,,52,57,,78,58,59,,,,62,,60,61,63,293,294,67,68,,,,,,289,290', +'296,93,92,94,95,,,220,,,,,,,42,,,97,96,98,87,51,89,88,90,,91,99,100', +',85,86,39,40,38,,,,,,,,,,,,,,,,,,,,213,,,219,,,53,54,,,55,,,,,,41,,', +',,,,,218,,,,,84,76,79,80,,81,82,,,,77,83,,69,70,66,,52,57,,78,58,59', +',,,62,,60,61,63,28,29,67,68,,,,,,27,26,25,93,92,94,95,,,18,,,,,,,42', +',,97,96,98,87,51,89,88,90,,91,99,100,,85,86,39,40,38,,,,,,,,,,,,,,,', +',,,,213,,,219,,,53,54,,,55,,,,,,41,,,,,,,,19,,,,,84,76,79,80,,81,82', +',,,77,83,,69,70,66,,52,57,,78,58,59,,,,62,,60,61,63,28,29,67,68,,,,', +',27,26,25,93,92,94,95,,,18,,,,,,,42,,,97,96,98,87,51,89,88,90,,91,99', +'100,,85,86,39,40,38,,,,,,,,,,,,,,,,,,,,213,,,219,,,53,54,,,55,,,,,,41', +',,,,,,,19,,,,,84,76,79,80,,81,82,,,,77,83,,69,70,66,,52,57,,78,58,59', +',,,62,,60,61,63,28,29,67,68,,,,,,27,26,25,93,92,94,95,,,220,,,,,,,42', +',,97,96,98,87,51,89,88,90,,91,99,100,,85,86,39,40,38,,,,,,,,,,,,,,,', +',,,,213,,,219,,,53,54,,,55,,,,,,41,,,,,,,,218,,,,,84,76,79,80,,81,82', +',,,77,83,,69,70,66,,52,57,,78,58,59,,,,62,,60,61,63,28,29,67,68,,,,', +',27,26,25,93,92,94,95,,,220,,,,,,,42,,,97,96,98,87,51,89,88,90,,91,99', +'100,,85,86,39,40,38,,,,,,,,,,,,,,,,,,,,213,,,219,,,53,54,,,55,,,,,,41', +',,,,,,,218,,,,,84,76,79,80,,81,82,,,,77,83,,69,70,66,,52,57,,78,58,59', +',,,62,,60,61,63,28,29,67,68,,,,,,27,26,25,93,92,94,95,,,220,,,,,,,42', +',,97,96,98,87,51,89,88,90,,91,99,100,,85,86,39,40,38,,,,,,,,,,,,,,,', +',,,,213,,,219,,,53,54,,,55,,,,,,41,,,,,,,,218,,,,,84,76,79,80,,81,82', +',,,77,83,,69,70,66,,52,57,,78,58,59,,,,62,,60,61,63,28,29,67,68,,,,', +',27,26,25,93,92,94,95,,,220,,,,,,,42,,,97,96,98,87,51,89,88,90,,91,99', +'100,,85,86,39,40,38,,,,,,,,,,,,,,,,,,,,213,,,219,,,53,54,,,55,,,,,,41', +',,,,,,,218,,,,,84,76,79,80,,81,82,,,,77,83,,69,70,66,,52,57,,78,58,59', +',,,62,,60,61,63,293,294,67,68,,,,,,289,290,296,93,92,94,95,,,220,,,', +',,,42,,,97,96,98,87,51,89,88,90,,91,99,100,,85,86,39,40,38,,,,,,,,,', +',,,,,,,,,,213,,,219,,,53,54,,,55,,,,,,41,,,,,,,,218,,,,,84,76,79,80', +',81,82,,,,77,83,,69,70,66,,52,57,,78,58,59,,,,62,,60,61,63,293,294,67', +'68,,,,,,289,290,296,93,92,94,95,,,220,,,,,,,42,,,97,96,98,87,51,89,88', +'90,,91,99,100,,85,86,39,40,38,,,,,,,,,,,,,,,,,,,,213,,,219,,,53,54,', +',55,,705,,,,41,,,,,,,,218,,,,,84,76,79,80,,81,82,,,,77,83,,69,70,66', +',52,57,,78,58,59,,,,62,,60,61,63,28,29,67,68,,,,,,27,26,25,93,92,94', +'95,,,18,,,,,,,42,,,97,96,98,87,51,89,88,90,,91,99,100,,85,86,39,40,38', +',,,,,,,,,,,,,,,,,,,213,,,219,,,53,54,,,55,,,,,,41,,,,,,,,19,,,,,84,76', +'79,80,,81,82,,,,77,83,,69,70,66,,52,57,,78,58,59,,,,62,,60,61,63,293', +'294,67,68,,,,,,289,290,296,93,92,94,95,,,220,,,,,,,42,,,97,96,98,87', +'51,89,88,90,,91,99,100,,85,86,39,40,38,,,,,,,,,,,,,,,,,,,,213,,,219', +',,53,54,,,55,,,,,,41,,,,,,,,218,,,,,84,76,79,80,,81,82,,,,77,83,,69', +'70,66,,52,57,,78,58,59,,,,62,,60,61,63,28,29,67,68,,,,,,27,26,25,93', +'92,94,95,,,18,,,,,,,42,,,97,96,98,87,51,89,88,90,,91,99,100,,85,86,39', +'40,38,,,,,,,,,,,,,,,,,,,,213,,,219,,,53,54,,,55,,,,,,41,,,,,,,,19,,', +',,84,76,79,80,,81,82,,,,77,83,,69,70,66,,52,57,,78,58,59,,,,62,,60,61', +'63,28,29,67,68,,,,,,27,26,25,93,92,94,95,,,220,,,,,,,42,,,97,96,98,87', +'51,89,88,90,272,91,99,100,,85,86,39,40,38,,,,,,,,,,,,,,,,,,,,213,,,219', +',,53,54,,,55,,270,,268,,41,,,,,,,,218,,,,,84,76,79,80,,81,82,,,,77,83', +',69,70,66,,52,57,,78,58,59,,,,62,,60,61,63,28,29,67,68,,,,,,27,26,25', +'93,92,94,95,,,220,,,,,,,42,,,97,96,98,87,51,89,88,90,272,91,99,100,', +'85,86,39,40,38,,,,,,,,,,,,,,,,,,,,213,,,219,,,53,54,,,55,,270,,268,', +'41,,,,,,,,218,,,,,84,76,79,80,,81,82,,,,77,83,,69,70,66,,52,57,,78,58', +'59,,,,62,,60,61,63,28,29,67,68,,,,,,27,26,25,93,92,94,95,,,18,,,,,,', +'42,,,97,96,98,87,51,89,88,90,,91,99,100,,85,86,39,40,38,,,,,,,,,,,,', +',,,,,,,213,,,219,,,53,54,,,55,,,,,,41,,,,,,,,19,,,,,84,76,79,80,,81', +'82,,,,77,83,,69,70,66,,52,57,,78,58,59,,,,62,,60,61,63,293,294,67,68', +',,,,,289,290,296,93,92,94,95,,,220,,,,,,,42,,,97,96,98,87,51,89,88,90', +',91,99,100,,85,86,39,40,38,,,,,,,,,,,,,,,,,,,,213,,,219,,,53,54,,,55', +',270,,,,41,,,,,,,,218,,,,,84,76,79,80,,81,82,,,,77,83,,69,70,66,,52', +'57,,78,58,59,,,,62,,60,61,63,293,294,67,68,,,,,,289,290,296,93,92,94', +'95,,,220,,,,,,,42,,,97,96,98,87,51,89,88,90,,91,99,100,,85,86,39,40', +'38,,,,,,,,,,,,,,,,,,,,213,,,219,,,53,54,,,55,,,,,,41,,,,,,,,218,,,,', +'84,76,79,80,,81,82,,,,77,83,,69,70,66,,52,57,,78,58,59,,,,62,,60,61', +'63,293,294,67,68,,,,,,289,290,296,93,92,94,95,,,220,,,,,,,42,,,97,96', +'98,87,51,89,88,90,272,91,99,100,,85,86,39,40,38,,,,,,,,,,,,,,,,,,,,213', +',,219,,,53,54,,,55,,,,,,41,,,,,,,,218,,,,,84,76,79,80,,81,82,,,,77,83', +',69,70,66,,52,57,,78,58,59,,,,62,,60,61,63,293,294,67,68,,,,,,289,290', +'296,93,92,94,95,,,220,,,,,,,42,,,97,96,98,87,51,89,88,90,272,91,99,100', +',85,86,39,40,38,,,,,,,,,,,,,,,,,,,,213,,,219,,,53,54,,,55,,608,,,,41', +',,,,,,,218,,,,,84,76,79,80,,81,82,,,,77,83,,69,70,66,,52,57,,78,58,59', +',,,62,,60,61,63,293,294,67,68,,,,,,289,290,296,93,92,94,95,,,220,,,', +',,,42,,,97,96,98,87,51,89,88,90,,91,99,100,,85,86,39,40,38,,,,,,,,,', +',,,,,,,,,,213,,,219,,,53,54,,,55,,385,,,,41,,,,,,,,218,,,,,84,76,79', +'80,,81,82,,,,77,83,,69,70,66,,52,57,,78,58,59,,,,62,,60,61,63,28,29', +'67,68,,,,,,27,26,25,93,92,94,95,,,18,,,,,,,42,,,97,96,98,87,51,89,88', +'90,,91,99,100,,85,86,39,40,38,,,,,,,,,,,,,,,,,,,,213,,,219,,,53,54,', +',55,,,,,,41,,,,,,,,19,,,,,84,76,79,80,,81,82,,,,77,83,,69,70,66,,52', +'57,,78,58,59,,,,62,,60,61,63,293,294,67,68,,,,,,289,290,296,93,92,94', +'95,,,220,,,,,,,42,,,97,96,98,87,51,89,88,90,,91,99,100,,85,86,39,40', +'38,,,,,,,,,,,,,,,,,,,,213,,,219,,,53,54,,,55,,,,,,41,,,,,,,,218,,,,', +'84,76,79,80,,81,82,,,,77,83,,69,70,66,,52,57,,78,58,59,,,,62,,60,61', +'63,28,29,67,68,,,,,,27,26,25,93,92,94,95,,,220,,,,,,,42,,,97,96,98,87', +'51,89,88,90,272,91,99,100,,85,86,39,40,38,,,,,,,,,,,,,,,,,,,,213,,,219', +',,53,54,,,55,,270,,268,,41,,,,,,,,218,,,,,84,76,79,80,,81,82,,,,77,83', +',69,70,66,,52,57,,78,58,59,,,,62,,60,61,63,293,294,67,68,,,,,,289,290', +'296,93,92,94,95,,,220,,,,,,,42,,,97,96,98,87,51,89,88,90,,91,99,100', +',85,86,39,40,38,,,,,,,,,,,,,,,,,,,,213,,,219,,,53,54,,,55,,,,,,41,,', +',,,,,218,,,,,84,76,79,80,,81,82,,,,77,83,,69,70,66,,52,57,,78,58,59', +',,,62,,60,61,63,293,294,67,68,,,,,,289,290,296,93,92,94,95,,,220,,,', +',,,42,,,97,96,98,87,51,89,88,90,,91,99,100,,85,86,39,40,38,,,,,,,,,', +',,,,,,,,,,213,,,219,,,53,54,,,55,,,,,,41,,,,,,,,218,,,,,84,76,79,80', +',81,82,,,,77,83,,69,70,66,,52,57,,78,58,59,,,,62,,60,61,63,293,294,67', +'68,,,,,,289,290,296,93,92,94,95,,,220,,,,,,,42,,,97,96,98,87,51,89,88', +'90,,91,99,100,,85,86,39,40,38,,,,,,,,,,,,,,,,,,,,213,,,219,,,53,54,', +',55,,,,,,41,,,,,,,,218,,,,,84,76,79,80,,81,82,,,,77,83,,69,70,66,,52', +'57,,78,58,59,,,,62,,60,61,63,293,294,67,68,,,,,,289,290,296,93,92,94', +'95,,,220,,,,,,,42,,,97,96,98,87,51,89,88,90,,91,99,100,,85,86,39,40', +'38,,,,,,,,,,,,,,,,,,,,213,,,219,,,53,54,,,55,,,,,,41,,,,,,,,218,,,,', +'84,76,79,80,,81,82,,,,77,83,,69,70,66,,52,57,,78,58,59,,,,62,,60,61', +'63,293,294,67,68,,,,,,289,290,296,93,92,94,95,,,220,,,,,,,42,,,97,96', +'98,87,51,89,88,90,,91,99,100,,85,86,39,40,38,,,,,,,,,,,,,,,,,,,,213', +',,219,,,53,54,,,55,,,,,,41,,,,,,,,218,,,,,84,76,79,80,,81,82,,,,77,83', +',69,70,66,,52,57,,78,58,59,,,,62,,60,61,63,293,294,67,68,,,,,,289,290', +'296,93,92,94,95,,,220,,,,,,,291,,,97,96,98,87,51,89,88,90,,91,99,100', +',85,86,,,297,,,,,,,,,,,,,,,,,,,,287,,,284,,,53,54,,,55,,,,,,,,,,,,,', +',,,,,84,76,79,80,,81,82,,,,77,83,,69,70,66,,52,57,,78,58,59,,,,62,,60', +'61,63,28,29,67,68,,,,,,27,26,25,93,92,94,95,,,220,,,,,,,42,,,97,96,98', +'87,51,89,88,90,272,91,99,100,,85,86,39,40,38,,,,,,,,,,,,,,,,,,,,213', +',,219,,,53,54,,,55,,270,,268,,41,,,,,,,,218,,,,,84,76,79,80,,81,82,', +',,77,83,,69,70,66,,52,57,,78,58,59,,,,62,,60,61,63,293,294,67,68,,,', +',,289,290,296,93,92,94,95,,,220,,,,,,,291,,,97,96,98,87,51,89,88,90', +',91,99,100,,85,86,,,297,,,,,,,,,,,,,,,,,,,,287,,,284,,,53,54,,,55,,', +',,,,,,,,,,,,,,,,84,76,79,80,,81,82,,,,77,83,,69,70,66,9,52,57,,78,58', +'59,,,,62,,60,61,63,28,29,67,68,,,,,,27,26,25,93,92,94,95,,,18,,,,,,8', +'42,,10,97,96,98,87,51,89,88,90,,91,99,100,,85,86,39,40,38,228,232,237', +'238,239,234,236,244,245,240,241,,221,222,,,242,243,,37,,,31,,,53,54', +',,55,,33,225,,231,41,227,226,223,224,235,233,229,19,230,,,,84,76,79', +'80,,81,82,,,,77,83,,246,-239,,,368,57,,78,-239,-239,-239,,,-239,-239', +'-239,,-239,,,,,,,,,,-239,,,,,,,,,,-239,-239,,-239,-239,-239,-239,-239', +',,,,,,,,,,,-239,,,,,,,-239,-239,-239,,,-239,-239,-239,,-239,,,,,,-239', +',,,-239,,,-239,,,,,252,-239,-239,-239,,-239,-239,-239,-239,-239,,,,', +',,,,,,,,,-239,,,,,,,,,-293,,,,,-239,,-293,-293,-293,-239,-239,-293,-293', +'-293,,-293,,-239,,,,,252,-239,,-293,-293,,,,,,,,,-293,-293,,-293,-293', +'-293,-293,-293,,,-239,,,,,,,,,,,,,,-239,,,,,-239,-293,-293,-293,-293', +'-293,-293,-293,-293,-293,-293,-293,-293,-293,-293,,,-293,-293,-293,', +',-293,,261,-293,,,-293,-293,,-293,,-293,,-293,,-293,-293,-293,-293,-293', +'-293,-293,-403,-293,,-293,,,,-403,-403,-403,,,-403,-403,-403,,-403,-293', +'-293,,-293,,-293,,,-403,-403,-403,,,,,,,,,-403,-403,,-403,-403,-403', +'-403,-403,,,,,,,,,,,,,,,,,,,,,,,-403,-403,-403,-403,-403,-403,-403,-403', +'-403,-403,-403,-403,-403,-403,,,-403,-403,-403,,,-403,,252,-403,,,-403', +'-403,,-403,,-403,,-403,,-403,-403,-403,-403,-403,-403,-403,-239,-403', +'-403,-403,,,,-239,-239,-239,,,-239,-239,-239,,-239,-403,-403,,-403,', +'-403,,,-239,-239,-239,,,,,,,,,-239,-239,,-239,-239,-239,-239,-239,,', +',,,,,,,,,,,,,,,,,,,,-239,-239,-239,-239,-239,-239,-239,-239,-239,-239', +'-239,-239,-239,-239,,,-239,-239,-239,,,-239,,252,-239,,,-239,-239,,-239', +',-239,,-239,,-239,-239,-239,-239,-239,-239,-239,,-239,-239,-239,,,,', +',,,,,,,,,-239,-239,,-239,,-239,164,175,165,188,161,181,171,170,191,192', +'186,169,168,163,189,193,194,173,162,176,180,182,174,167,,,,183,190,185', +'184,177,187,172,160,179,178,,,,,,159,166,157,158,154,155,156,116,118', +',,117,,,,,,,,149,150,,146,128,129,130,137,134,136,,,131,132,,,,151,152', +'138,139,,,,,,,,,,,,,,143,142,,127,148,145,144,140,141,135,133,125,147', +'126,,,153,84,,,,,,,,,,,83,164,175,165,188,161,181,171,170,191,192,186', +'169,168,163,189,193,194,173,162,176,180,182,174,167,,,,183,190,185,184', +'177,187,172,160,179,178,,,,,,159,166,157,158,154,155,156,116,118,,,117', +',,,,,,,149,150,,146,128,129,130,137,134,136,,,131,132,,,,151,152,138', +'139,,,,,,,,,,,,,,143,142,,127,148,145,144,140,141,135,133,125,147,126', +',,153,84,,,,,,,,,,,83,164,175,165,188,161,181,171,170,191,192,186,169', +'168,163,189,193,194,173,162,176,180,182,174,167,,,,183,190,185,184,177', +'187,172,160,179,178,,,,,,159,166,157,158,154,155,156,116,118,,,117,', +',,,,,,149,150,,146,128,129,130,137,134,136,,,131,132,,,,151,152,138', +'139,,,,,,,,,,,,,,143,142,,127,148,145,144,140,141,135,133,125,147,126', +',,153,84,,,,,,,,,,,83,164,175,165,188,161,181,171,170,191,192,186,169', +'168,163,189,193,194,173,162,176,180,182,174,167,,,,183,190,185,184,177', +'187,172,160,179,178,,,,,,159,166,157,158,154,155,156,116,118,115,,117', +',,,,,,,149,150,,146,128,129,130,137,134,136,,,131,132,,,,151,152,138', +'139,,,,,,,,,,,,,,143,142,,127,148,145,144,140,141,135,133,125,147,126', +',,153,84,,,,,,,,,,,83,164,175,165,188,161,181,171,170,191,192,186,169', +'168,163,189,193,194,173,162,176,180,182,174,167,,,,183,190,185,184,177', +'187,172,160,179,178,,,,,,159,166,157,158,154,155,156,116,118,,,117,', +',,,,,,149,150,,146,128,129,130,137,134,136,,,131,132,,,,151,152,138', +'139,,,,,,,,,,,,,,143,142,,127,148,145,144,140,141,135,133,125,147,126', +',,153,164,175,165,188,161,181,171,170,191,192,186,169,168,163,189,193', +'194,173,162,176,180,182,174,167,,,,183,190,185,353,352,354,351,160,179', +'178,,,,,,159,166,157,158,348,349,350,346,118,89,88,347,,91,,,,,,149', +'150,,146,128,129,130,137,134,136,,,131,132,,,,151,152,138,139,,,,,,358', +',,,,,,,143,142,,127,148,145,144,140,141,135,133,125,147,126,394,398', +'153,,395,,,,,,,,149,150,,146,128,129,130,137,134,136,,,131,132,,,,151', +'152,138,139,,,,,,252,,,,,,,,143,142,,127,148,145,144,140,141,135,133', +'125,147,126,401,405,153,,400,,,,,,,,149,150,,146,128,129,130,137,134', +'136,,,131,132,,,,151,152,138,139,,,,,,252,,,,,,,,143,142,,127,148,145', +'144,140,141,135,133,125,147,126,450,398,153,,451,,,,,,,,149,150,,146', +'128,129,130,137,134,136,,,131,132,,,,151,152,138,139,,,,,,,,,,,,,,143', +'142,,127,148,145,144,140,141,135,133,125,147,126,450,398,153,,451,,', +',,,,,149,150,,146,128,129,130,137,134,136,,,131,132,,,,151,152,138,139', +',,,,,,,,,,,,,143,142,,127,148,145,144,140,141,135,133,125,147,126,579', +'398,153,,580,,,,,,,,149,150,,146,128,129,130,137,134,136,,,131,132,', +',,151,152,138,139,,,,,,252,,,,,,,,143,142,,127,148,145,144,140,141,135', +'133,125,147,126,581,405,153,,582,,,,,,,,149,150,,146,128,129,130,137', +'134,136,,,131,132,,,,151,152,138,139,,,,,,252,,,,,,,,143,142,,127,148', +'145,144,140,141,135,133,125,147,126,617,398,153,,618,,,,,,,,149,150', +',146,128,129,130,137,134,136,,,131,132,,,,151,152,138,139,,,,,,252,', +',,,,,,143,142,,127,148,145,144,140,141,135,133,125,147,126,620,405,153', +',621,,,,,,,,149,150,,146,128,129,130,137,134,136,,,131,132,,,,151,152', +'138,139,,,,,,252,,,,,,,,143,142,,127,148,145,144,140,141,135,133,125', +'147,126,579,398,153,,580,,,,,,,,149,150,,146,128,129,130,137,134,136', +',,131,132,,,,151,152,138,139,,,,,,252,,,,,,,,143,142,,127,148,145,144', +'140,141,135,133,125,147,126,581,405,153,,582,,,,,,,,149,150,,146,128', +'129,130,137,134,136,,,131,132,,,,151,152,138,139,,,,,,252,,,,,,,,143', +'142,,127,148,145,144,140,141,135,133,125,147,126,673,398,153,,674,,', +',,,,,149,150,,146,128,129,130,137,134,136,,,131,132,,,,151,152,138,139', +',,,,,252,,,,,,,,143,142,,127,148,145,144,140,141,135,133,125,147,126', +'675,405,153,,676,,,,,,,,149,150,,146,128,129,130,137,134,136,,,131,132', +',,,151,152,138,139,,,,,,252,,,,,,,,143,142,,127,148,145,144,140,141', +'135,133,125,147,126,678,405,153,,679,,,,,,,,149,150,,146,128,129,130', +'137,134,136,,,131,132,,,,151,152,138,139,,,,,,252,,,,,,,,143,142,,127', +'148,145,144,140,141,135,133,125,147,126,450,398,153,,451,,,,,,,,149', +'150,,146,128,129,130,137,134,136,,,131,132,,,,151,152,138,139,,,,,,252', +',,,,,,,143,142,,127,148,145,144,140,141,135,133,125,147,126,927,398', +'153,,928,,,,,,,,149,150,,146,128,129,130,137,134,136,,,131,132,,,,151', +'152,138,139,,,,,,252,,,,,,,,143,142,,127,148,145,144,140,141,135,133', +'125,147,126,929,405,153,,930,,,,,,,,149,150,,146,128,129,130,137,134', +'136,,,131,132,,,,151,152,138,139,,,,,,252,,,,,,,,143,142,,127,148,145', +'144,140,141,135,133,125,147,126,949,405,153,,948,,,,,,,,149,150,,146', +'128,129,130,137,134,136,,,131,132,,,,151,152,138,139,,,,,,252,,,,,,', +',143,142,,127,148,145,144,140,141,135,133,125,147,126,,,153,228,232', +'237,238,239,234,236,244,245,240,241,,221,222,,,242,243,,,,,,,,,,,,,', +',225,,231,,227,226,223,224,235,233,229,,230,,228,232,237,238,239,234', +'236,244,245,240,241,,221,222,,246,242,243,,,,,,,,,,,,,,,225,,231,,227', +'226,223,224,235,233,229,,230,,228,232,237,238,239,234,236,244,245,240', +'241,,221,222,,246,242,243,,,,,,,,,,,,,,,225,,231,,227,226,223,224,235', +'233,229,,230,,228,232,237,238,239,234,236,244,245,240,241,,221,222,', +'246,242,243,,,,,,,,,,,,,,,225,,231,,227,226,223,224,235,233,229,,230', +',228,232,237,238,239,234,236,244,245,240,241,,221,222,,246,242,243,', +',,,,,,,,,,,,,225,,231,,227,226,223,224,235,233,229,,230,,228,232,237', +'238,239,234,236,244,245,240,241,,221,222,,246,242,243,,,,,,,,,,,,,,', +'225,,231,,227,226,223,224,235,233,229,,230,,228,232,237,238,239,234', +'236,244,245,240,241,,221,222,209,246,242,243,,,,,,,,,,,,,,,225,,231', +',227,226,223,224,235,233,229,,230,,228,232,237,238,239,234,236,244,245', +'240,241,,221,222,,246,242,243,,,,,,,,,,,,,,,225,,231,,227,226,223,224', +'235,233,229,,230,,228,232,237,238,239,234,236,244,245,240,241,,221,222', +',246,242,243,,,,,,,,,,,,,,,225,,231,,227,226,223,224,235,233,229,,230', +',228,232,237,238,239,234,236,244,245,240,241,,221,222,,246,242,243,', +',,,,,,,,,,,,,225,,231,,227,226,223,224,235,233,229,,230,,228,232,237', +'238,239,234,236,244,245,240,241,,221,222,,246,242,243,,,,,,,,,,,,,,', +'225,,231,,227,226,223,224,235,233,229,,230,,,,,,,,,,,,,,,,,246' ] + racc_action_table = arr = ::Array.new(23658, nil) + idx = 0 + clist.each do |str| + str.split(',', -1).each do |i| + arr[idx] = i.to_i unless i.empty? + idx += 1 + end + end + +clist = [ +'400,928,536,536,214,951,788,400,400,400,56,628,628,400,400,612,400,364', +'853,597,459,612,671,18,753,674,348,351,342,297,297,412,412,348,351,673', +'400,400,566,400,400,400,400,400,869,927,580,322,323,638,579,929,329', +'214,459,516,637,542,542,637,18,597,871,789,524,418,400,400,400,400,400', +'400,400,400,400,400,400,400,400,400,364,566,400,400,400,332,400,566', +'875,517,400,676,536,400,882,580,56,536,400,579,400,628,400,400,400,400', +'400,400,400,401,400,788,400,967,418,928,401,401,401,951,928,412,401', +'401,951,401,400,400,929,400,674,400,853,342,401,400,671,853,753,671', +'673,671,24,753,292,401,401,542,401,401,401,401,401,342,638,516,676,329', +'342,927,516,322,323,789,927,929,322,323,789,524,929,460,968,212,675', +'401,401,401,401,401,401,401,401,401,401,401,401,401,401,517,332,401', +'401,401,517,401,676,746,313,401,678,313,401,650,723,460,24,401,292,401', +'887,401,401,401,401,401,401,401,74,401,401,401,212,395,617,888,683,74', +'24,620,292,683,732,365,90,401,401,74,401,675,401,90,90,90,401,13,90', +'90,90,746,90,650,678,723,317,424,746,317,90,678,90,90,90,338,678,746', +'395,338,678,12,90,90,395,90,90,90,90,90,11,675,732,620,618,746,10,448', +'678,424,620,594,617,424,424,620,365,365,365,620,941,941,90,90,90,90', +'90,90,90,90,90,90,90,90,90,90,969,620,90,90,90,448,90,90,924,594,90', +'36,617,90,90,617,90,858,90,858,90,617,90,90,90,90,90,90,90,352,90,301', +'90,926,618,587,352,587,587,587,587,587,321,321,337,336,90,90,90,90,581', +'90,15,90,36,90,394,581,581,581,36,353,581,581,581,7,581,933,353,934', +'618,935,587,618,301,581,581,581,581,618,301,587,587,587,587,314,581', +'581,314,581,581,581,581,581,936,15,337,336,937,394,356,15,939,337,336', +'394,275,356,337,336,362,275,337,336,942,587,581,581,581,581,581,581', +'581,581,581,581,581,581,581,581,337,336,581,581,581,886,581,581,347', +'943,581,944,886,581,581,347,581,945,581,360,581,886,581,581,581,581', +'581,581,581,946,581,581,581,774,553,774,774,774,774,774,363,362,362', +'362,361,874,581,581,581,581,582,581,874,581,903,581,455,582,582,582', +'535,874,582,582,582,535,582,901,330,901,901,901,901,901,326,330,582', +'582,582,326,360,360,360,3,330,461,582,582,3,582,582,582,582,582,115', +'553,553,311,311,115,115,363,363,363,553,361,361,361,354,689,429,774', +'38,38,689,354,582,582,582,582,582,582,582,582,582,582,582,582,582,582', +'428,829,582,582,582,286,582,582,829,427,582,426,286,582,582,901,582', +'829,582,474,582,286,582,582,582,582,582,582,582,475,582,810,582,810', +'810,810,810,810,653,478,653,653,653,653,653,14,582,582,582,582,87,582', +'14,582,480,582,947,87,87,87,948,14,87,87,87,485,87,771,810,771,771,771', +'771,771,87,653,87,87,87,810,810,23,662,662,653,489,87,87,23,87,87,87', +'87,87,957,349,957,957,957,957,957,414,349,949,771,848,1,848,848,848', +'848,848,498,771,16,16,87,87,87,87,87,87,87,87,87,87,87,87,87,87,402', +'957,87,87,87,501,87,87,425,392,87,513,848,87,87,388,87,386,87,380,87', +'848,87,87,87,87,87,87,87,518,87,918,87,918,918,918,918,918,519,374,425', +'958,550,350,425,425,87,87,87,87,350,87,556,87,563,87,515,515,515,515', +'515,515,346,567,333,515,515,331,918,346,515,570,515,515,515,515,515', +'515,515,918,918,328,575,327,515,515,515,515,515,515,515,583,940,515', +'940,940,940,940,940,515,515,585,515,515,515,515,515,515,515,515,515', +'318,515,515,515,316,515,515,515,515,515,902,598,902,902,902,902,902', +'916,940,916,916,916,916,916,288,600,679,285,315,515,605,288,515,679', +'285,515,515,607,679,515,288,515,679,285,614,515,897,902,897,897,897', +'897,897,515,916,616,310,309,515,515,515,515,619,515,515,916,916,306', +'515,515,113,113,113,113,113,113,515,622,515,113,113,623,626,897,113', +'627,113,113,113,113,113,113,113,303,897,897,629,302,113,113,113,113', +'113,113,113,632,938,113,938,938,938,938,938,113,113,113,113,113,113', +'113,113,113,113,113,113,633,113,113,113,641,113,113,113,113,113,850', +'642,850,850,850,850,850,895,938,895,895,895,895,895,484,643,830,832', +'651,113,658,484,113,830,832,113,113,661,664,113,484,113,830,832,669', +'113,893,850,893,893,893,893,893,113,895,298,672,296,113,113,113,113', +'291,113,113,895,895,290,113,113,783,783,783,783,783,783,113,287,113', +'783,783,681,686,893,783,282,783,783,783,783,783,783,783,281,893,893', +'704,280,783,783,783,783,783,783,783,278,731,783,731,731,731,269,731', +'783,783,266,783,783,783,783,783,783,783,783,783,265,783,783,783,725', +'783,783,783,783,783,873,304,873,873,873,726,873,766,304,766,766,766', +'766,766,43,727,340,304,729,783,730,43,783,340,734,783,783,251,739,783', +'43,783,340,740,741,783,953,220,953,953,953,953,953,783,766,745,216,215', +'783,783,783,783,213,783,783,766,766,760,783,783,197,197,197,197,197', +'197,783,767,783,197,197,773,775,953,197,776,197,197,197,197,197,197', +'197,779,953,953,195,782,197,197,197,197,197,197,197,546,546,197,101', +'546,546,546,42,197,197,791,197,197,197,197,197,197,197,197,197,37,197', +'197,197,795,197,197,197,197,197,443,611,611,611,611,611,796,963,930', +'963,963,963,963,963,527,930,799,800,812,197,930,527,197,813,930,197', +'197,35,819,197,527,197,443,820,822,197,443,443,443,443,826,831,21,197', +'963,836,837,838,197,197,197,197,841,197,197,963,963,842,197,197,835', +'835,835,835,835,835,197,844,197,835,835,847,849,855,835,856,835,835', +'835,835,835,835,835,6,6,6,6,6,835,835,835,835,835,835,835,861,866,835', +'867,868,444,,,835,835,,835,835,835,835,835,835,835,835,835,,835,835', +'835,,835,835,835,835,835,441,441,441,441,441,441,441,444,621,441,441', +'444,444,444,444,621,441,441,,835,621,,835,,621,835,835,,,835,,835,441', +',441,835,441,441,441,441,441,441,441,835,441,,,,835,835,835,835,,835', +'835,,,,835,835,602,602,602,602,602,602,835,,835,602,602,,,,602,,602', +'602,602,602,602,602,602,276,276,276,276,276,602,602,602,602,602,602', +'602,,,602,473,473,473,473,473,602,602,,602,602,602,602,602,602,602,602', +'602,,602,602,602,,602,602,602,602,602,446,446,446,446,446,446,446,446', +'211,446,446,,,,,211,446,446,,602,,,602,,211,602,602,,,602,,602,446,', +'446,602,446,446,446,446,446,446,446,602,446,,,,602,602,602,602,,602', +'602,,,,602,602,787,787,787,787,787,787,602,,602,787,787,,,,787,,787', +'787,787,787,787,787,787,,,,,,787,787,787,787,787,787,787,,,787,,,,,383', +'787,787,,787,787,787,787,787,787,787,787,787,,787,787,787,,787,787,787', +'787,787,383,383,383,383,383,383,383,383,383,383,383,,383,383,,,383,383', +',787,,,787,,,787,787,,,787,,787,383,,383,787,383,383,383,383,383,383', +'383,787,383,,,,787,787,787,787,,787,787,,,,787,787,,383,51,383,,,787', +',787,51,51,51,,,51,51,51,913,51,913,913,913,913,913,,,,,51,51,51,,,', +',,,,51,51,,51,51,51,51,51,,,,,,,,,913,,,,,,,,,913,913,913,913,,51,51', +'51,51,51,51,51,51,51,51,51,51,51,51,,,51,51,51,,,51,,,51,,,51,51,,51', +',51,,51,,51,51,51,51,51,51,51,,51,,51,,,,,,,,,,,,,,51,51,51,51,,51,', +'51,0,0,0,0,0,0,,,,0,0,,,,0,,0,0,0,0,0,0,0,,,,,,0,0,0,0,0,0,0,,,0,,,', +',,0,0,0,0,0,0,0,0,0,0,0,0,,0,0,0,,0,0,0,0,0,434,,,,,,,,,,,,,,,,434,434', +',0,,,0,,,0,0,,,0,,0,434,,434,0,434,434,434,434,,,434,0,434,,,,0,0,0', +'0,,0,0,,,,0,0,682,682,682,682,682,682,0,,0,682,682,,,,682,,682,682,682', +'682,682,682,682,,,,,,682,682,682,682,682,682,682,,,682,,,,,,682,682', +',682,682,682,682,682,682,682,682,682,,682,682,682,,682,682,682,682,682', +'435,,,,,,,,,,,,,,,,435,435,,682,,,682,,,682,682,,,682,,682,435,,435', +'682,435,435,435,435,,,435,682,435,,,,682,682,682,682,,682,682,,,,682', +'682,52,52,52,52,52,52,682,,682,52,52,,,,52,,52,52,52,52,52,52,52,,,', +',,52,52,52,52,52,52,52,,,52,,,,,,52,52,,52,52,52,52,52,52,52,52,52,', +'52,52,52,,52,52,52,52,52,436,,,,,,,,,,,,,,,,436,436,,52,,,52,,,52,52', +',,52,,52,436,,436,52,436,436,436,436,,,436,52,436,,,,52,52,52,52,,52', +'52,,,,52,52,834,834,834,834,834,834,52,,52,834,834,,,,834,,834,834,834', +'834,834,834,834,,,,,,834,834,834,834,834,834,834,,,834,,,,,,834,834', +',834,834,834,834,834,834,834,834,834,,834,834,834,,834,834,834,834,834', +'422,422,422,422,422,422,422,422,422,422,422,,422,422,,,422,422,,834', +',,834,,,834,834,,,834,,834,422,,422,834,422,422,422,422,422,422,422', +'834,422,,,,834,834,834,834,,834,834,,,,834,834,828,828,828,828,828,828', +'834,,834,828,828,,,,828,,828,828,828,828,828,828,828,,,,,,828,828,828', +'828,828,828,828,,,828,,,,,,828,828,,828,828,828,828,828,828,828,828', +'828,,828,828,828,,828,828,828,828,828,423,423,423,423,423,423,423,423', +'423,423,423,,423,423,,,423,423,,828,,,828,,,828,828,,,828,,828,423,', +'423,828,423,423,423,423,423,423,423,828,423,,,,828,828,828,828,,828', +'828,,,,828,828,279,279,279,279,279,279,828,,828,279,279,,,,279,,279', +'279,279,279,279,279,279,,,,,,279,279,279,279,279,279,279,,,279,,,,,', +'279,279,,279,279,279,279,279,279,279,279,279,,279,279,279,,279,279,279', +'279,279,440,440,440,440,440,440,440,,,440,440,,,,,,440,440,,279,,,279', +',,279,279,,,279,,279,440,,440,279,440,440,440,440,440,440,440,279,440', +',,,279,279,279,279,,279,279,,,,279,279,537,537,537,537,537,537,279,', +'279,537,537,,,,537,,537,537,537,537,537,537,537,,,,,,537,537,537,537', +'537,537,537,,,537,,,,,,537,537,,537,537,537,537,537,537,537,537,537', +',537,537,537,,537,537,537,537,537,437,,,,,,,,,,,,,,,,437,437,,537,,', +'537,,,537,537,,,537,,537,437,,437,537,437,437,437,437,,,437,537,437', +',,,537,537,537,537,,537,537,,,,537,537,603,603,603,603,603,603,537,', +'537,603,603,,,,603,,603,603,603,603,603,603,603,,,,,,603,603,603,603', +'603,603,603,,,603,,,,,,603,603,,603,603,603,603,603,603,603,603,603', +',603,603,603,,603,603,603,603,603,433,433,433,433,433,433,433,,,433', +'433,,,,,,433,433,,603,,,603,,,603,603,,,603,,603,433,,433,603,433,433', +'433,433,433,433,433,603,433,,,,603,603,603,603,,603,603,,,,603,603,687', +'687,687,687,687,687,603,,603,687,687,,,,687,,687,687,687,687,687,687', +'687,,,,,,687,687,687,687,687,687,687,,,687,,,,,,687,687,,687,687,687', +'687,687,687,687,687,687,,687,687,687,,687,687,687,687,687,442,442,442', +'442,442,442,442,,,442,442,,,,,,442,442,,687,,,687,,,687,687,,,687,,687', +'442,,442,687,442,442,442,442,442,442,442,687,442,,,,687,687,687,687', +',687,687,,,,687,687,735,735,735,735,735,735,687,,687,735,735,,,,735', +',735,735,735,735,735,735,735,,,,,,735,735,735,735,735,735,735,,,735', +',,,,,735,735,,735,735,735,735,735,735,735,735,735,,735,735,735,,735', +'735,735,735,735,438,438,438,438,438,438,438,,,438,438,,,,,,438,438,', +'735,,,735,,,735,735,,,735,,735,438,,438,735,438,438,438,438,438,438', +'438,735,438,,,,735,735,735,735,,735,735,,,,735,735,284,284,284,284,284', +'284,735,,735,284,284,,,,284,,284,284,284,284,284,284,284,,,,,,284,284', +'284,284,284,284,284,,,284,,,,,,284,284,,284,284,284,284,284,284,284', +'284,284,,284,284,284,,284,284,284,284,284,445,445,445,445,445,445,445', +',,445,445,,,,,,445,445,,284,,,284,,,284,284,,,284,,284,445,,445,284', +'445,445,445,445,445,445,445,284,445,,,,284,284,284,284,,284,284,,,,284', +'284,750,750,750,750,750,750,284,,284,750,750,,,,750,,750,750,750,750', +'750,750,750,,,,,,750,750,750,750,750,750,750,,,750,,,,,,750,750,,750', +'750,750,750,750,750,750,750,750,,750,750,750,,750,750,750,750,750,439', +'439,439,439,439,439,439,,,439,439,,,,,,439,439,,750,,,750,,,750,750', +',,750,,750,439,,439,750,439,439,439,439,439,439,439,750,439,,,,750,750', +'750,750,,750,750,,,,750,750,697,697,697,697,697,697,750,,750,697,697', +',,,697,,697,697,697,697,697,697,697,,,,,,697,697,697,697,697,697,697', +',,697,,,,,,697,697,,697,697,697,697,697,697,697,697,697,,697,697,697', +',697,697,697,697,697,432,,,,,,,,,,,,,,,,432,432,,697,,,697,,,697,697', +',,697,,697,432,,,697,432,432,432,432,,,,697,,,,,697,697,697,697,,697', +'697,,,,697,697,912,912,912,912,912,912,697,,697,912,912,,,,912,,912', +'912,912,912,912,912,912,,,,,,912,912,912,912,912,912,912,,,912,,,,,', +'912,912,,912,912,912,912,912,912,912,912,912,,912,912,912,,912,912,912', +'912,912,431,,,,,,,,,,,,,,,,431,431,,912,,,912,,,912,912,,,912,,912,431', +',431,912,431,431,431,431,,,,912,,,,,912,912,912,912,,912,912,,,,912', +'912,219,219,219,219,219,219,912,,912,219,219,,,,219,,219,219,219,219', +'219,219,219,,,,,,219,219,219,219,219,219,219,,,219,,,,,,219,219,,219', +'219,219,219,219,219,219,219,219,,219,219,219,,219,219,219,219,219,430', +',,,,,,,,,,,,,,,430,430,,219,,,219,,,219,219,,,219,,219,430,,430,219', +'430,430,430,430,,,,219,,,,,219,219,219,219,,219,219,,,,219,219,910,910', +'910,910,910,910,219,,219,910,910,,,,910,,910,910,910,910,910,910,910', +',,,,,910,910,910,910,910,910,910,,,910,,,,,,910,910,,910,910,910,910', +'910,910,910,910,910,,910,910,910,,910,910,910,910,910,,,,,,,,,,,,,,', +',,,,,910,,,910,,,910,910,,,910,,910,,,,910,,,,,,,,910,,,,,910,910,910', +'910,,910,910,,,,910,910,904,904,904,904,904,904,910,,910,904,904,,,', +'904,,904,904,904,904,904,904,904,,,,,,904,904,904,904,904,904,904,,', +'904,,,,,,904,904,,904,904,904,904,904,904,904,904,904,,904,904,904,', +'904,904,904,904,904,,,,,,,,,,,,,,,,,,,,904,,,904,,,904,904,,,904,,904', +',,,904,,,,,,,,904,,,,,904,904,904,904,,904,904,,,,904,904,31,31,31,31', +'31,31,904,,904,31,31,,,,31,,31,31,31,31,31,31,31,,,,,,31,31,31,31,31', +'31,31,,,31,,,,,,31,31,,31,31,31,31,31,31,31,31,31,,31,31,31,,31,31,31', +'31,31,,,,,,,,,,,,,,,,,,,,31,,,31,,,31,31,,,31,,31,,,,31,,,,,,,,31,,', +',,31,31,31,31,,31,31,,,,31,31,631,631,631,631,631,631,31,,31,631,631', +',,,631,,631,631,631,631,631,631,631,,,,,,631,631,631,631,631,631,631', +',,631,,,,,,631,631,,631,631,631,631,631,631,631,631,631,,631,631,631', +',631,631,631,631,631,,,,,,,,,,,,,,,,,,,,631,,,631,,,631,631,,,631,,631', +',,,631,,,,,,,,631,,,,,631,631,631,631,,631,631,,,,631,631,512,512,512', +'512,512,512,631,,631,512,512,,,,512,,512,512,512,512,512,512,512,,,', +',,512,512,512,512,512,512,512,,,512,,,,,,512,512,,512,512,512,512,512', +'512,512,512,512,,512,512,512,,512,512,512,512,512,,,,,,,,,,,,,,,,,,', +',512,,,512,,,512,512,,,512,,512,,,,512,,,,,,,,512,,,,,512,512,512,512', +',512,512,,,,512,512,784,784,784,784,784,784,512,,512,784,784,,,,784', +',784,784,784,784,784,784,784,,,,,,784,784,784,784,784,784,784,,,784', +',,,,391,784,784,,784,784,784,784,784,784,784,784,784,,784,784,784,,784', +'784,784,784,784,391,391,391,391,391,391,391,391,391,391,391,,391,391', +',,391,391,,784,,,784,,,784,784,,,784,,784,391,,391,784,391,391,391,391', +'391,391,391,784,391,,,,784,784,784,784,,784,784,,,,784,784,,391,406', +',,,784,,784,406,406,406,,,406,406,406,805,406,805,805,805,805,805,,', +',406,406,406,406,,,,,,,,406,406,,406,406,406,406,406,,,,,,,,,805,,,', +',,,,,805,805,805,805,,406,406,406,406,406,406,406,406,406,406,406,406', +'406,406,,,406,406,406,,,406,,,406,,,406,406,,406,,406,,406,,406,406', +'406,406,406,406,406,405,406,406,406,,,,405,405,405,,,405,405,405,,405', +'406,406,406,406,,406,,406,405,405,405,405,,,,,,,,405,405,,405,405,405', +'405,405,,,,,,,,,,,,,,,,,,,,,,,405,405,405,405,405,405,405,405,405,405', +'405,405,405,405,,,405,405,405,,,405,,,405,,,405,405,,405,,405,,405,', +'405,405,405,405,405,405,405,,405,405,405,,,,,,,,,,,,,,405,405,405,405', +',405,,405,793,793,793,793,793,793,,,,793,793,,,,793,,793,793,793,793', +'793,793,793,,,,,,793,793,793,793,793,793,793,,,793,,,,,,793,793,,793', +'793,793,793,793,793,793,793,793,,793,793,793,,793,793,793,793,793,,', +',,,,,,,,,,,,,,,,,793,,,793,,,793,793,,,793,,793,,,,793,,,,,,,,793,,', +',,793,793,793,793,,793,793,,,,793,793,589,589,589,589,589,589,793,,793', +'589,589,,,,589,,589,589,589,589,589,589,589,,,,,,589,589,589,589,589', +'589,589,,,589,,,,,,589,589,,589,589,589,589,589,589,589,589,589,,589', +'589,589,,589,589,589,589,589,,,,,,,,,,,,,,,,,,,,589,,,589,,,589,589', +',,589,,589,,,,589,,,,,,,,589,,,,,589,589,589,589,,589,589,,,,589,589', +',204,204,204,,204,589,,589,204,204,,,,204,,204,204,204,204,204,204,204', +',,,,,204,204,204,204,204,204,204,,,204,,,,,,,204,,,204,204,204,204,204', +'204,204,204,,204,204,204,,204,204,204,204,204,,,,,,,,,,,,,,,,,,,,204', +',,204,,,204,204,,,204,,,,,,204,,,,,,,,204,,,,,204,204,204,204,,204,204', +',,,204,204,,205,205,205,,205,204,,204,205,205,,,,205,,205,205,205,205', +'205,205,205,,,,,,205,205,205,205,205,205,205,,,205,,,,,,,205,,,205,205', +'205,205,205,205,205,205,,205,205,205,,205,205,205,205,205,,,,,,,,,,', +',,,,,,,,,205,,,205,,,205,205,,,205,,,,,,205,,,,,,,,205,,,,,205,205,205', +'205,,205,205,,,,205,205,,206,206,206,,206,205,,205,206,206,,,,206,,206', +'206,206,206,206,206,206,,,,,,206,206,206,206,206,206,206,,,206,,,,,', +',206,,,206,206,206,206,206,206,206,206,,206,206,206,,206,206,206,206', +'206,,,,,,,,,,,,,,,,,,,,206,,,206,,,206,206,,,206,,,,,,206,,,,,,,,206', +',,,,206,206,206,206,,206,206,,,,206,206,,207,207,207,,207,206,,206,207', +'207,,,,207,,207,207,207,207,207,207,207,,,,,,207,207,207,207,207,207', +'207,,,207,,,,,,,207,,,207,207,207,207,207,207,207,207,,207,207,207,', +'207,207,207,207,207,,,,,,,,,,,,,,,,,,,,207,,,207,,,207,207,,,207,,,', +',,207,,,,,,,,207,,,,,207,207,207,207,,207,207,,,,207,207,,208,208,208', +',208,207,,207,208,208,,,,208,,208,208,208,208,208,208,208,,,,,,208,208', +'208,208,208,208,208,,,208,,,,,,,208,,,208,208,208,208,208,208,208,208', +',208,208,208,,208,208,208,208,208,,,,,,,,,,,,,,,,,,,,208,,,208,,,208', +'208,,,208,,,,,,208,,,,,,,,208,,,,,208,208,208,208,,208,208,,,,208,208', +'208,768,768,768,,768,208,,208,768,768,,,,768,,768,768,768,768,768,768', +'768,,,,,,768,768,768,768,768,768,768,,,768,,,,,,,768,,,768,768,768,768', +'768,768,768,768,,768,768,768,,768,768,768,768,768,,,,,,,,,,,,,,,,,,', +',768,,,768,,,768,768,,,768,,,,,,768,,,,,,,,768,,,,,768,768,768,768,', +'768,768,,,,768,768,,754,754,754,,754,768,,768,754,754,,,,754,,754,754', +'754,754,754,754,754,,,,,,754,754,754,754,754,754,754,,,754,,,,,,,754', +',,754,754,754,754,754,754,754,754,,754,754,754,,754,754,,807,754,807', +'807,807,807,807,,,,,,,,,,,,,,,754,,,754,,,754,754,,,754,,,,,,807,,,', +',,,,,807,807,807,807,754,754,754,754,,754,754,,,,754,754,,218,218,218', +',218,754,,754,218,218,,,,218,,218,218,218,218,218,218,218,,,,,,218,218', +'218,218,218,218,218,,,218,,,,,,,218,,,218,218,218,218,218,218,218,218', +',218,218,218,,218,218,218,218,218,,,,,,,,,,,,,,,,,,,,218,,,218,,,218', +'218,,,218,,,,,,218,,,,,,,,218,,,,,218,218,218,218,,218,218,,,,218,218', +',743,743,743,,743,218,,218,743,743,,,,743,,743,743,743,743,743,743,743', +',,,,,743,743,743,743,743,743,743,,,743,,,,,,,743,,,743,743,743,743,743', +'743,743,743,743,743,743,743,,743,743,743,743,743,,,,,,,,,,,,,,,,,,,', +'743,,,743,,,743,743,,,743,,743,,743,,743,,,,,,,,743,,,,,743,743,743', +'743,,743,743,,,,743,743,,221,221,221,,221,743,,743,221,221,,,,221,,221', +'221,221,221,221,221,221,,,,,,221,221,221,221,221,221,221,,,221,,,,,', +',221,,,221,221,221,221,221,221,221,221,,221,221,221,,221,221,221,221', +'221,,,,,,,,,,,,,,,,,,,,221,,,221,,,221,221,,,221,,,,,,221,,,,,,,,221', +',,,,221,221,221,221,,221,221,,,,221,221,,222,222,222,,222,221,,221,222', +'222,,,,222,,222,222,222,222,222,222,222,,,,,,222,222,222,222,222,222', +'222,,,222,,,,,,,222,,,222,222,222,222,222,222,222,222,,222,222,222,', +'222,222,222,222,222,,,,,,,,,,,,,,,,,,,,222,,,222,,,222,222,,,222,,,', +',,222,,,,,,,,222,,,,,222,222,222,222,,222,222,,,,222,222,,223,223,223', +',223,222,,222,223,223,,,,223,,223,223,223,223,223,223,223,,,,,,223,223', +'223,223,223,223,223,,,223,,,,,,,223,,,223,223,223,223,223,223,223,223', +',223,223,223,,223,223,223,223,223,,,,,,,,,,,,,,,,,,,,223,,,223,,,223', +'223,,,223,,,,,,223,,,,,,,,223,,,,,223,223,223,223,,223,223,,,,223,223', +',224,224,224,,224,223,,223,224,224,,,,224,,224,224,224,224,224,224,224', +',,,,,224,224,224,224,224,224,224,,,224,,,,,,,224,,,224,224,224,224,224', +'224,224,224,,224,224,224,,224,224,224,224,224,,,,,,,,,,,,,,,,,,,,224', +',,224,,,224,224,,,224,,,,,,224,,,,,,,,224,,,,,224,224,224,224,,224,224', +',,,224,224,,225,225,225,,225,224,,224,225,225,,,,225,,225,225,225,225', +'225,225,225,,,,,,225,225,225,225,225,225,225,,,225,,,,,,,225,,,225,225', +'225,225,225,225,225,225,,225,225,225,,225,225,225,225,225,,,,,,,,,,', +',,,,,,,,,225,,,225,,,225,225,,,225,,,,,,225,,,,,,,,225,,,,,225,225,225', +'225,,225,225,,,,225,225,,226,226,226,,226,225,,225,226,226,,,,226,,226', +'226,226,226,226,226,226,,,,,,226,226,226,226,226,226,226,,,226,,,,,', +',226,,,226,226,226,226,226,226,226,226,,226,226,226,,226,226,226,226', +'226,,,,,,,,,,,,,,,,,,,,226,,,226,,,226,226,,,226,,,,,,226,,,,,,,,226', +',,,,226,226,226,226,,226,226,,,,226,226,,227,227,227,,227,226,,226,227', +'227,,,,227,,227,227,227,227,227,227,227,,,,,,227,227,227,227,227,227', +'227,,,227,,,,,,,227,,,227,227,227,227,227,227,227,227,,227,227,227,', +'227,227,227,227,227,,,,,,,,,,,,,,,,,,,,227,,,227,,,227,227,,,227,,,', +',,227,,,,,,,,227,,,,,227,227,227,227,,227,227,,,,227,227,,228,228,228', +',228,227,,227,228,228,,,,228,,228,228,228,228,228,228,228,,,,,,228,228', +'228,228,228,228,228,,,228,,,,,,,228,,,228,228,228,228,228,228,228,228', +',228,228,228,,228,228,228,228,228,,,,,,,,,,,,,,,,,,,,228,,,228,,,228', +'228,,,228,,,,,,228,,,,,,,,228,,,,,228,228,228,228,,228,228,,,,228,228', +',229,229,229,,229,228,,228,229,229,,,,229,,229,229,229,229,229,229,229', +',,,,,229,229,229,229,229,229,229,,,229,,,,,,,229,,,229,229,229,229,229', +'229,229,229,,229,229,229,,229,229,229,229,229,,,,,,,,,,,,,,,,,,,,229', +',,229,,,229,229,,,229,,,,,,229,,,,,,,,229,,,,,229,229,229,229,,229,229', +',,,229,229,,230,230,230,,230,229,,229,230,230,,,,230,,230,230,230,230', +'230,230,230,,,,,,230,230,230,230,230,230,230,,,230,,,,,,,230,,,230,230', +'230,230,230,230,230,230,,230,230,230,,230,230,230,230,230,,,,,,,,,,', +',,,,,,,,,230,,,230,,,230,230,,,230,,,,,,230,,,,,,,,230,,,,,230,230,230', +'230,,230,230,,,,230,230,,231,231,231,,231,230,,230,231,231,,,,231,,231', +'231,231,231,231,231,231,,,,,,231,231,231,231,231,231,231,,,231,,,,,', +',231,,,231,231,231,231,231,231,231,231,,231,231,231,,231,231,231,231', +'231,,,,,,,,,,,,,,,,,,,,231,,,231,,,231,231,,,231,,,,,,231,,,,,,,,231', +',,,,231,231,231,231,,231,231,,,,231,231,,232,232,232,,232,231,,231,232', +'232,,,,232,,232,232,232,232,232,232,232,,,,,,232,232,232,232,232,232', +'232,,,232,,,,,,,232,,,232,232,232,232,232,232,232,232,,232,232,232,', +'232,232,232,232,232,,,,,,,,,,,,,,,,,,,,232,,,232,,,232,232,,,232,,,', +',,232,,,,,,,,232,,,,,232,232,232,232,,232,232,,,,232,232,,233,233,233', +',233,232,,232,233,233,,,,233,,233,233,233,233,233,233,233,,,,,,233,233', +'233,233,233,233,233,,,233,,,,,,,233,,,233,233,233,233,233,233,233,233', +',233,233,233,,233,233,233,233,233,,,,,,,,,,,,,,,,,,,,233,,,233,,,233', +'233,,,233,,,,,,233,,,,,,,,233,,,,,233,233,233,233,,233,233,,,,233,233', +',234,234,234,,234,233,,233,234,234,,,,234,,234,234,234,234,234,234,234', +',,,,,234,234,234,234,234,234,234,,,234,,,,,,,234,,,234,234,234,234,234', +'234,234,234,,234,234,234,,234,234,234,234,234,,,,,,,,,,,,,,,,,,,,234', +',,234,,,234,234,,,234,,,,,,234,,,,,,,,234,,,,,234,234,234,234,,234,234', +',,,234,234,,235,235,235,,235,234,,234,235,235,,,,235,,235,235,235,235', +'235,235,235,,,,,,235,235,235,235,235,235,235,,,235,,,,,,,235,,,235,235', +'235,235,235,235,235,235,,235,235,235,,235,235,235,235,235,,,,,,,,,,', +',,,,,,,,,235,,,235,,,235,235,,,235,,,,,,235,,,,,,,,235,,,,,235,235,235', +'235,,235,235,,,,235,235,,236,236,236,,236,235,,235,236,236,,,,236,,236', +'236,236,236,236,236,236,,,,,,236,236,236,236,236,236,236,,,236,,,,,', +',236,,,236,236,236,236,236,236,236,236,,236,236,236,,236,236,236,236', +'236,,,,,,,,,,,,,,,,,,,,236,,,236,,,236,236,,,236,,,,,,236,,,,,,,,236', +',,,,236,236,236,236,,236,236,,,,236,236,,237,237,237,,237,236,,236,237', +'237,,,,237,,237,237,237,237,237,237,237,,,,,,237,237,237,237,237,237', +'237,,,237,,,,,,,237,,,237,237,237,237,237,237,237,237,,237,237,237,', +'237,237,237,237,237,,,,,,,,,,,,,,,,,,,,237,,,237,,,237,237,,,237,,,', +',,237,,,,,,,,237,,,,,237,237,237,237,,237,237,,,,237,237,,238,238,238', +',238,237,,237,238,238,,,,238,,238,238,238,238,238,238,238,,,,,,238,238', +'238,238,238,238,238,,,238,,,,,,,238,,,238,238,238,238,238,238,238,238', +',238,238,238,,238,238,238,238,238,,,,,,,,,,,,,,,,,,,,238,,,238,,,238', +'238,,,238,,,,,,238,,,,,,,,238,,,,,238,238,238,238,,238,238,,,,238,238', +',239,239,239,,239,238,,238,239,239,,,,239,,239,239,239,239,239,239,239', +',,,,,239,239,239,239,239,239,239,,,239,,,,,,,239,,,239,239,239,239,239', +'239,239,239,,239,239,239,,239,239,239,239,239,,,,,,,,,,,,,,,,,,,,239', +',,239,,,239,239,,,239,,,,,,239,,,,,,,,239,,,,,239,239,239,239,,239,239', +',,,239,239,,240,240,240,,240,239,,239,240,240,,,,240,,240,240,240,240', +'240,240,240,,,,,,240,240,240,240,240,240,240,,,240,,,,,,,240,,,240,240', +'240,240,240,240,240,240,,240,240,240,,240,240,240,240,240,,,,,,,,,,', +',,,,,,,,,240,,,240,,,240,240,,,240,,,,,,240,,,,,,,,240,,,,,240,240,240', +'240,,240,240,,,,240,240,,241,241,241,,241,240,,240,241,241,,,,241,,241', +'241,241,241,241,241,241,,,,,,241,241,241,241,241,241,241,,,241,,,,,', +',241,,,241,241,241,241,241,241,241,241,,241,241,241,,241,241,241,241', +'241,,,,,,,,,,,,,,,,,,,,241,,,241,,,241,241,,,241,,,,,,241,,,,,,,,241', +',,,,241,241,241,241,,241,241,,,,241,241,,242,242,242,,242,241,,241,242', +'242,,,,242,,242,242,242,242,242,242,242,,,,,,242,242,242,242,242,242', +'242,,,242,,,,,,,242,,,242,242,242,242,242,242,242,242,,242,242,242,', +'242,242,242,242,242,,,,,,,,,,,,,,,,,,,,242,,,242,,,242,242,,,242,,,', +',,242,,,,,,,,242,,,,,242,242,242,242,,242,242,,,,242,242,,243,243,243', +',243,242,,242,243,243,,,,243,,243,243,243,243,243,243,243,,,,,,243,243', +'243,243,243,243,243,,,243,,,,,,,243,,,243,243,243,243,243,243,243,243', +',243,243,243,,243,243,243,243,243,,,,,,,,,,,,,,,,,,,,243,,,243,,,243', +'243,,,243,,,,,,243,,,,,,,,243,,,,,243,243,243,243,,243,243,,,,243,243', +',244,244,244,,244,243,,243,244,244,,,,244,,244,244,244,244,244,244,244', +',,,,,244,244,244,244,244,244,244,,,244,,,,,,,244,,,244,244,244,244,244', +'244,244,244,,244,244,244,,244,244,244,244,244,,,,,,,,,,,,,,,,,,,,244', +',,244,,,244,244,,,244,,,,,,244,,,,,,,,244,,,,,244,244,244,244,,244,244', +',,,244,244,,245,245,245,,245,244,,244,245,245,,,,245,,245,245,245,245', +'245,245,245,,,,,,245,245,245,245,245,245,245,,,245,,,,,,,245,,,245,245', +'245,245,245,245,245,245,,245,245,245,,245,245,245,245,245,,,,,,,,,,', +',,,,,,,,,245,,,245,,,245,245,,,245,,,,,,245,,,,,,,,245,,,,,245,245,245', +'245,,245,245,,,,245,245,,246,246,246,,246,245,,245,246,246,,,,246,,246', +'246,246,246,246,246,246,,,,,,246,246,246,246,246,246,246,,,246,,,,,', +',246,,,246,246,246,246,246,246,246,246,,246,246,246,,246,246,246,246', +'246,,,,,,,,,,,,,,,,,,,,246,,,246,,,246,246,,,246,,,,,,246,,,,,,,,246', +',,,,246,246,246,246,,246,246,,,,246,246,,5,5,5,5,5,246,,246,5,5,,,,5', +',5,5,5,5,5,5,5,,,,,,5,5,5,5,5,5,5,,,5,,,,,,5,5,5,5,5,5,5,5,5,5,5,5,', +'5,5,5,,5,5,5,5,5,,,,,,,,,,,,,,,,,,,,5,,,5,,,5,5,,,5,,5,,,,5,,,,,,,,5', +',,,,5,5,5,5,,5,5,,,,5,5,,736,736,736,,736,5,,5,736,736,,,,736,,736,736', +'736,736,736,736,736,,,,,,736,736,736,736,736,736,736,,,736,,,,,,,736', +',,736,736,736,736,736,736,736,736,736,736,736,736,,736,736,736,736,736', +',,,,,,,,,,,,,,,,,,,736,,,736,,,736,736,,,736,,736,,736,,736,,,,,,,,736', +',,,,736,736,736,736,,736,736,,,,736,736,,252,252,252,,252,736,,736,252', +'252,,,,252,,252,252,252,252,252,252,252,,,,,,252,252,252,252,252,252', +'252,,,252,,,,,,,252,,,252,252,252,252,252,252,252,252,252,252,252,252', +',252,252,252,252,252,,,,,,,,,,,,,,,,,,,,252,,,252,,,252,252,,,252,,252', +',252,,252,,,,,,,,252,,,,,252,252,252,252,,252,252,,,,252,252,,253,253', +'253,,253,252,,252,253,253,,,,253,,253,253,253,253,253,253,253,,,,,,253', +'253,253,253,253,253,253,,,253,,,,,,,253,,,253,253,253,253,253,253,253', +'253,253,253,253,253,,253,253,253,253,253,,,,,,,,,,,,,,,,,,,,253,,,253', +',,253,253,,,253,,253,,253,,253,,,,,,,,253,,,,,253,253,253,253,,253,253', +',,,253,253,,261,261,261,,261,253,,253,261,261,,,,261,,261,261,261,261', +'261,261,261,,,,,,261,261,261,261,261,261,261,,,261,,,,,,,261,,,261,261', +'261,261,261,261,261,261,261,261,261,261,,261,261,261,261,261,,,,,,,', +',,,,,,,,,,,,261,,,261,,,261,261,,,261,,261,,261,,261,,,,,,,,261,,,,', +'261,261,261,261,,261,261,,,,261,261,261,724,724,724,,724,261,,261,724', +'724,,,,724,,724,724,724,724,724,724,724,,,,,,724,724,724,724,724,724', +'724,,,724,,,,,,,724,,,724,724,724,724,724,724,724,724,,724,724,724,', +'724,724,724,724,724,,,,,,,,,,,,,,,,,,,,724,,,724,,,724,724,,,724,,,', +',,724,,,,,,,,724,,,,,724,724,724,724,,724,724,,,,724,724,,722,722,722', +',722,724,,724,722,722,,,,722,,722,722,722,722,722,722,722,,,,,,722,722', +'722,722,722,722,722,,,722,,,,,,,722,,,722,722,722,722,722,722,722,722', +',722,722,722,,722,722,722,722,722,,,,,,,,,,,,,,,,,,,,722,,,722,,,722', +'722,,,722,,,,,,722,,,,,,,,722,,,,,722,722,722,722,,722,722,,,,722,722', +',268,268,268,,268,722,,722,268,268,,,,268,,268,268,268,268,268,268,268', +',,,,,268,268,268,268,268,268,268,,,268,,,,,,,268,,,268,268,268,268,268', +'268,268,268,,268,268,268,,268,268,268,268,268,,,,,,,,,,,,,,,,,,,,268', +',,268,,,268,268,,,268,,,,,,268,,,,,,,,268,,,,,268,268,268,268,,268,268', +',,,268,268,,721,721,721,,721,268,,268,721,721,,,,721,,721,721,721,721', +'721,721,721,,,,,,721,721,721,721,721,721,721,,,721,,,,,,,721,,,721,721', +'721,721,721,721,721,721,,721,721,721,,721,721,721,721,721,,,,,,,,,,', +',,,,,,,,,721,,,721,,,721,721,,,721,,,,,,721,,,,,,,,721,,,,,721,721,721', +'721,,721,721,,,,721,721,,270,270,270,,270,721,,721,270,270,,,,270,,270', +'270,270,270,270,270,270,,,,,,270,270,270,270,270,270,270,,,270,,,,,', +',270,,,270,270,270,270,270,270,270,270,,270,270,270,,270,270,270,270', +'270,,,,,,,,,,,,,,,,,,,,270,,,270,,,270,270,,,270,,,,,,270,,,,,,,,270', +',,,,270,270,270,270,,270,270,,,,270,270,,272,272,272,,272,270,,270,272', +'272,,,,272,,272,272,272,272,272,272,272,,,,,,272,272,272,272,272,272', +'272,,,272,,,,,,,272,,,272,272,272,272,272,272,272,272,,272,272,272,', +'272,272,272,272,272,,,,,,,,,,,,,,,,,,,,272,,,272,,,272,272,,,272,,,', +',,272,,,,,,,,272,,,,,272,272,272,272,,272,272,,,,272,272,,720,720,720', +',720,272,,272,720,720,,,,720,,720,720,720,720,720,720,720,,,,,,720,720', +'720,720,720,720,720,,,720,,,,,,,720,,,720,720,720,720,720,720,720,720', +',720,720,720,,720,720,720,720,720,,,,,,,,,,,,,,,,,,,,720,,,720,,,720', +'720,,,720,,,,,,720,,,,,,,,720,,,,,720,720,720,720,,720,720,,,,720,720', +',719,719,719,,719,720,,720,719,719,,,,719,,719,719,719,719,719,719,719', +',,,,,719,719,719,719,719,719,719,,,719,,,,,,,719,,,719,719,719,719,719', +'719,719,719,,719,719,719,,719,719,719,719,719,,,,,,,,,,,,,,,,,,,,719', +',,719,,,719,719,,,719,,,,,,719,,,,,,,,719,,,,,719,719,719,719,,719,719', +',,,719,719,,277,277,277,277,277,719,,719,277,277,,,,277,,277,277,277', +'277,277,277,277,,,,,,277,277,277,277,277,277,277,,,277,,,,,,277,277', +',277,277,277,277,277,277,277,277,277,,277,277,277,,277,277,277,277,277', +',,,,,,,,,,,,,,,,,,,277,,,277,,,277,277,,,277,,277,,,,277,,,,,,,,277', +',,,,277,277,277,277,,277,277,,,,277,277,,707,707,707,,707,277,,277,707', +'707,,,,707,,707,707,707,707,707,707,707,,,,,,707,707,707,707,707,707', +'707,,,707,,,,,,,707,,,707,707,707,707,707,707,707,707,,707,707,707,', +'707,707,707,707,707,,,,,,,,,,,,,,,,,,,,707,,,707,,,707,707,,,707,,,', +',,707,,,,,,,,707,,,,,707,707,707,707,,707,707,,,,707,707,,108,108,108', +',108,707,,707,108,108,,,,108,,108,108,108,108,108,108,108,,,,,,108,108', +'108,108,108,108,108,,,108,,,,,,,108,,,108,108,108,108,108,108,108,108', +',108,108,108,,108,108,108,108,108,,,,,,,,,,,,,,,,,,,,108,,,108,,,108', +'108,,,108,,,,,,108,,,,,,,,108,,,,,108,108,108,108,,108,108,,,,108,108', +',466,466,466,,466,108,,108,466,466,,,,466,,466,466,466,466,466,466,466', +',,,,,466,466,466,466,466,466,466,,,466,,,,,,,466,,,466,466,466,466,466', +'466,466,466,466,466,466,466,,466,466,466,466,466,,,,,,,,,,,,,,,,,,,', +'466,,,466,,,466,466,,,466,,,,466,,466,,,,,,,,466,,,,,466,466,466,466', +',466,466,,,,466,466,,464,464,464,,464,466,,466,464,464,,,,464,,464,464', +'464,464,464,464,464,,,,,,464,464,464,464,464,464,464,,,464,,,,,,,464', +',,464,464,464,464,464,464,464,464,464,464,464,464,,464,464,464,464,464', +',,,,,,,,,,,,,,,,,,,464,,,464,,,464,464,,,464,,464,,464,,464,,,,,,,,464', +',,,,464,464,464,464,,464,464,,,,464,464,,458,458,458,,458,464,,464,458', +'458,,,,458,,458,458,458,458,458,458,458,,,,,,458,458,458,458,458,458', +'458,,,458,,,,,,,458,,,458,458,458,458,458,458,458,458,458,458,458,458', +',458,458,458,458,458,,,,,,,,,,,,,,,,,,,,458,,,458,,,458,458,,,458,,', +',458,,458,,,,,,,,458,,,,,458,458,458,458,,458,458,,,,458,458,,883,883', +'883,,883,458,,458,883,883,,,,883,,883,883,883,883,883,883,883,,,,,,883', +'883,883,883,883,883,883,,,883,,,,,,,883,,,883,883,883,883,883,883,883', +'883,883,883,883,883,,883,883,883,883,883,,,,,,,,,,,,,,,,,,,,883,,,883', +',,883,883,,,883,,883,,883,,883,,,,,,,,883,,,,,883,883,883,883,,883,883', +',,,883,883,,881,881,881,,881,883,,883,881,881,,,,881,,881,881,881,881', +'881,881,881,,,,,,881,881,881,881,881,881,881,,,881,,,,,,,881,,,881,881', +'881,881,881,881,881,881,,881,881,881,,881,881,881,881,881,,,,,,,,,,', +',,,,,,,,,881,,,881,,,881,881,,,881,,881,,881,,881,,,,,,,,881,,,,,881', +'881,881,881,,881,881,,,,881,881,,878,878,878,,878,881,,881,878,878,', +',,878,,878,878,878,878,878,878,878,,,,,,878,878,878,878,878,878,878', +',,878,,,,,,,878,,,878,878,878,878,878,878,878,878,878,878,878,878,,878', +'878,878,878,878,,,,,,,,,,,,,,,,,,,,878,,,878,,,878,878,,,878,,878,,878', +',878,,,,,,,,878,,,,,878,878,878,878,,878,878,,,,878,878,,19,19,19,,19', +'878,,878,19,19,,,,19,,19,19,19,19,19,19,19,,,,,,19,19,19,19,19,19,19', +',,19,,,,,,,19,,,19,19,19,19,19,19,19,19,,19,19,19,,19,19,19,19,19,,', +',,,,,,,,,,,,,,,,,19,,,19,,,19,19,,,19,,,,,,19,,,,,,,,19,,,,,19,19,19', +'19,,19,19,,,,19,19,,27,27,27,,27,19,,19,27,27,,,,27,,27,27,27,27,27', +'27,27,,,,,,27,27,27,27,27,27,27,,,27,,,,,,,27,,,27,27,27,27,27,27,27', +'27,27,27,27,27,,27,27,27,27,27,,,,,,,,,,,,,,,,,,,,27,,,27,,,27,27,,', +'27,,27,,27,,27,,,,,,,,27,,,,,27,27,27,27,,27,27,,,,27,27,,28,28,28,', +'28,27,,27,28,28,,,,28,,28,28,28,28,28,28,28,,,,,,28,28,28,28,28,28,28', +',,28,,,,,,,28,,,28,28,28,28,28,28,28,28,28,28,28,28,,28,28,28,28,28', +',,,,,,,,,,,,,,,,,,,28,,,28,,,28,28,,,28,,28,,28,,28,,,,,,,,28,,,,,28', +'28,28,28,,28,28,,,,28,28,,29,29,29,,29,28,,28,29,29,,,,29,,29,29,29', +'29,29,29,29,,,,,,29,29,29,29,29,29,29,,,29,,,,,,,29,,,29,29,29,29,29', +'29,29,29,29,29,29,29,,29,29,29,29,29,,,,,,,,,,,,,,,,,,,,29,,,29,,,29', +'29,,,29,,29,,29,,29,,,,,,,,29,,,,,29,29,29,29,,29,29,,,,29,29,,32,32', +'32,,32,29,,29,32,32,,,,32,,32,32,32,32,32,32,32,,,,,,32,32,32,32,32', +'32,32,,,32,,,,,,,32,,,32,32,32,32,32,32,32,32,,32,32,32,,32,32,,538', +'32,538,538,538,538,538,,,,,,,,,,,,,,,32,,,32,,,32,32,,,32,,32,,,,538', +'538,,,,,,,,538,538,538,538,32,32,32,32,,32,32,,,,32,32,,33,33,33,,33', +'32,,32,33,33,,,,33,,33,33,33,33,33,33,33,,,,,,33,33,33,33,33,33,33,', +',33,,,,,584,,33,,,33,33,33,33,33,33,33,33,,33,33,33,,33,33,,,33,584', +'584,584,584,584,584,584,584,584,584,584,,584,584,,,584,584,,33,,,33', +',,33,33,,,33,,,584,,584,,584,584,584,584,584,584,584,,584,,,,33,33,33', +'33,,33,33,,,,33,33,,584,,33,,,33,,33,817,817,817,,817,,,,817,817,,,', +'817,,817,817,817,817,817,817,817,,,,,,817,817,817,817,817,817,817,,', +'817,,,,,,,817,,,817,817,817,817,817,817,817,817,,817,817,817,,817,817', +',639,817,639,639,639,639,639,,,,,,,,,,,,,,,817,,,817,,,817,817,,,817', +',,,,,639,,,,,,,,,639,639,639,639,817,817,817,817,,817,817,,,,817,817', +',803,803,803,,803,817,,817,803,803,,,,803,,803,803,803,803,803,803,803', +',,,,,803,803,803,803,803,803,803,,,803,,,,,,,803,,,803,803,803,803,803', +'803,803,803,,803,803,803,,803,803,803,803,803,,,,,,,,,,,,,,,,,,,,803', +',,803,,,803,803,,,803,,,,,,803,,,,,,,,803,,,,,803,803,803,803,,803,803', +',,,803,803,,39,39,39,,39,803,,803,39,39,,,,39,,39,39,39,39,39,39,39', +',,,,,39,39,39,39,39,39,39,,,39,,,,,,,39,,,39,39,39,39,39,39,39,39,,39', +'39,39,,39,39,39,39,39,,,,,,,,,,,,,,,,,,,,39,,,39,,,39,39,,,39,,,,,,39', +',,,,,,,39,,,,,39,39,39,39,,39,39,,,,39,39,,40,40,40,,40,39,,39,40,40', +',,,40,,40,40,40,40,40,40,40,,,,,,40,40,40,40,40,40,40,,,40,,,,,,,40', +',,40,40,40,40,40,40,40,40,,40,40,40,,40,40,40,40,40,,,,,,,,,,,,,,,,', +',,,40,,,40,,,40,40,,,40,,,,,,40,,,,,,,,40,,,,,40,40,40,40,,40,40,,,', +'40,40,,41,41,41,,41,40,,40,41,41,,,,41,,41,41,41,41,41,41,41,,,,,,41', +'41,41,41,41,41,41,,,41,,,,,,,41,,,41,41,41,41,41,41,41,41,,41,41,41', +',41,41,41,41,41,,,,,,,,,,,,,,,,,,,,41,,,41,,,41,41,,,41,,,,,,41,,,,', +',,,41,,,,,41,41,41,41,,41,41,,,,41,41,,53,53,53,,53,41,,41,53,53,,,', +'53,,53,53,53,53,53,53,53,,,,,,53,53,53,53,53,53,53,,,53,,,,,,,53,,,53', +'53,53,53,53,53,53,53,,53,53,53,,53,53,53,53,53,,,,,,,,,,,,,,,,,,,,53', +',,53,,,53,53,,,53,,,,,,53,,,,,,,,53,,,,,53,53,53,53,,53,53,,,,53,53', +',54,54,54,,54,53,,53,54,54,,,,54,,54,54,54,54,54,54,54,,,,,,54,54,54', +'54,54,54,54,,,54,,,,,,,54,,,54,54,54,54,54,54,54,54,54,54,54,54,,54', +'54,54,54,54,,,,,,,,,,,,,,,,,,,,54,,,54,,,54,54,,,54,,54,,,,54,,,,,,', +',54,,,,,54,54,54,54,,54,54,,,,54,54,,55,55,55,,55,54,,54,55,55,,,,55', +',55,55,55,55,55,55,55,,,,,,55,55,55,55,55,55,55,,,55,,,,,,,55,,,55,55', +'55,55,55,55,55,55,55,55,55,55,,55,55,55,55,55,,,,,,,,,,,,,,,,,,,,55', +',,55,,,55,55,,,55,,,,,,55,,,,,,,,55,,,,,55,55,55,55,,55,55,,,,55,55', +',58,58,58,,58,55,,55,58,58,,,,58,,58,58,58,58,58,58,58,,,,,,58,58,58', +'58,58,58,58,,,58,,,,,,,58,,,58,58,58,58,58,58,58,58,,58,58,58,,58,58', +'58,58,58,,,,,,,,,,,,,,,,,,,,58,,,58,,,58,58,,,58,,,,,,58,,,,,,,,58,', +',,,58,58,58,58,,58,58,,,,58,58,,59,59,59,,59,58,,58,59,59,,,,59,,59', +'59,59,59,59,59,59,,,,,,59,59,59,59,59,59,59,,,59,,,,,,,59,,,59,59,59', +'59,59,59,59,59,,59,59,59,,59,59,59,59,59,,,,,,,,,,,,,,,,,,,,59,,,59', +',,59,59,,,59,,,,,,59,,,,,,,,59,,,,,59,59,59,59,,59,59,,,,59,59,,62,62', +'62,,62,59,,59,62,62,,,,62,,62,62,62,62,62,62,62,,,,,,62,62,62,62,62', +'62,62,,,62,,,,,,,62,,,62,62,62,62,62,62,62,62,,62,62,62,,62,62,62,62', +'62,596,596,596,596,596,596,596,596,596,596,596,,596,596,,,596,596,,62', +',596,62,,,62,62,,,62,,,596,,596,62,596,596,596,596,596,596,596,62,596', +',,,62,62,62,62,,62,62,,,,62,62,62,596,,596,,62,62,,62,63,63,63,,63,', +',,63,63,,,,63,,63,63,63,63,63,63,63,,,,,,63,63,63,63,63,63,63,,,63,', +',,,,,63,,,63,63,63,63,63,63,63,63,,63,63,63,,63,63,,890,63,890,890,890', +'890,890,,,,,,,,,,,,,,,63,,,63,,,63,63,,,63,,63,,,,890,,,,,,,,,890,890', +'890,890,63,63,63,63,,63,63,,,,63,63,,64,64,64,,64,63,,63,64,64,,,,64', +',64,64,64,64,64,64,64,,,,,,64,64,64,64,64,64,64,,,64,,,,,,,64,,,64,64', +'64,64,64,64,64,64,,64,64,64,,64,64,,688,64,688,688,688,688,688,,,,,', +',,,,,,64,,,64,,,64,,,64,64,,,64,,,,,,688,,,,,,,,,688,688,688,688,64', +'64,64,64,,64,64,,,,64,64,,65,65,65,,65,64,,64,65,65,,,,65,,65,65,65', +'65,65,65,65,,,,,,65,65,65,65,65,65,65,,,65,,,,,,,65,,,65,65,65,65,65', +'65,65,65,,65,65,65,,65,65,,864,65,864,864,864,864,864,,,,,,,,,,,,,,', +'65,,,65,,,65,65,,,65,,,,,,864,864,,,,,,,,864,864,864,864,65,65,65,65', +',65,65,,,,65,65,,786,786,786,,786,65,,65,786,786,,,,786,,786,786,786', +'786,786,786,786,,,,,,786,786,786,786,786,786,786,,,786,,,,,,,786,,,786', +'786,786,786,786,786,786,786,,786,786,786,,786,786,786,786,786,,,,,,', +',,,,,,,,,,,,,786,,,786,,,786,786,,,786,,786,,,,786,,,,,,,,786,,,,,786', +'786,786,786,,786,786,,,,786,786,,103,103,103,103,103,786,,786,103,103', +',,,103,,103,103,103,103,103,103,103,,,,,,103,103,103,103,103,103,103', +',,103,,,,,,103,103,103,103,103,103,103,103,103,103,103,103,,103,103', +'103,,103,103,103,103,103,712,712,712,712,712,712,712,712,712,712,712', +',712,712,,,712,712,,103,,,103,,,103,103,,,103,,103,712,,712,103,712', +'712,712,712,712,712,712,103,712,,,,103,103,103,103,,103,103,,,,103,103', +',712,,,,103,103,,103,468,468,468,,468,,,,468,468,,,,468,,468,468,468', +'468,468,468,468,,,,,,468,468,468,468,468,468,468,,,468,,,,,,,468,,,468', +'468,468,468,468,468,468,468,,468,468,468,,468,468,468,468,468,,,,,,', +',,,,,,,,,,,,,468,,,468,,,468,468,,,468,,,,,,468,,,,,,,,468,,,,,468,468', +'468,468,,468,468,,,,468,468,,109,109,109,,109,468,,468,109,109,,,,109', +',109,109,109,109,109,109,109,,,,,,109,109,109,109,109,109,109,,,109', +',,,,,,109,,,109,109,109,109,109,109,109,109,,109,109,109,,109,109,109', +'109,109,,,,,,,,,,,,,,,,,,,,109,,,109,,,109,109,,,109,,,,,,109,,,,,,', +',109,,,,,109,109,109,109,,109,109,,,,109,109,,110,110,110,,110,109,', +'109,110,110,,,,110,,110,110,110,110,110,110,110,,,,,,110,110,110,110', +'110,110,110,,,110,,,,,,,110,,,110,110,110,110,110,110,110,110,,110,110', +'110,,110,110,110,110,110,,,,,,,,,,,,,,,,,,,,110,,,110,,,110,110,,,110', +',,,,,110,,,,,,,,110,,,,,110,110,110,110,,110,110,,,,110,110,,111,111', +'111,,111,110,,110,111,111,,,,111,,111,111,111,111,111,111,111,,,,,,111', +'111,111,111,111,111,111,,,111,,,,,,,111,,,111,111,111,111,111,111,111', +'111,,111,111,111,,111,111,111,111,111,,,,,,,,,,,,,,,,,,,,111,,,111,', +',111,111,,,111,,,,,,111,,,,,,,,111,,,,,111,111,111,111,,111,111,,,,111', +'111,,112,112,112,112,112,111,,111,112,112,,,,112,,112,112,112,112,112', +'112,112,,,,,,112,112,112,112,112,112,112,,,112,,,,,,112,112,,112,112', +'112,112,112,112,112,112,112,,112,112,112,,112,112,112,112,112,,,,,,', +',,,,,,,,,,,,,112,,,112,,,112,112,,,112,,112,,,,112,,,,,,,,112,,,,,112', +'112,112,112,,112,112,,,,112,112,,781,781,781,,781,112,,112,781,781,', +',,781,,781,781,781,781,781,781,781,,,,,,781,781,781,781,781,781,781', +',,781,,,,,,,781,,,781,781,781,781,781,781,781,781,,781,781,781,,781', +'781,781,781,781,,,,,,,,,,,,,,,,,,,,781,,,781,,,781,781,,,781,,,,,,781', +',,,,,,,781,,,,,781,781,781,781,,781,781,,,,781,781,,198,198,198,,198', +'781,,781,198,198,,,,198,,198,198,198,198,198,198,198,,,,,,198,198,198', +'198,198,198,198,,,198,,,,,,,198,,,198,198,198,198,198,198,198,198,,198', +'198,198,,198,198,198,198,198,,,,,,,,,,,,,,,,,,,,198,,,198,,,198,198', +',,198,,198,,,,198,,,,,,,,198,,,,,198,198,198,198,,198,198,,,,198,198', +',199,199,199,,199,198,,198,199,199,,,,199,,199,199,199,199,199,199,199', +',,,,,199,199,199,199,199,199,199,,,199,,,,,,,199,,,199,199,199,199,199', +'199,199,199,,199,199,199,,199,199,199,199,199,,,,,,,,,,,,,,,,,,,,199', +',,199,,,199,199,,,199,,199,,,,199,,,,,,,,199,,,,,199,199,199,199,,199', +'199,,,,199,199,,200,200,200,,200,199,,199,200,200,,,,200,,200,200,200', +'200,200,200,200,,,,,,200,200,200,200,200,200,200,,,200,,,,,,,200,,,200', +'200,200,200,200,200,200,200,,200,200,200,,200,200,200,200,200,,,,,,', +',,,,,,,,,,,,,200,,,200,,,200,200,,,200,,,,,,200,,,,,,,,200,,,,,200,200', +'200,200,,200,200,,,,200,200,,201,201,201,,201,200,,200,201,201,,,,201', +',201,201,201,201,201,201,201,,,,,,201,201,201,201,201,201,201,,,201', +',,,,,,201,,,201,201,201,201,201,201,201,201,201,201,201,201,,201,201', +'201,201,201,,,,,,,,,,,,,,,,,,,,201,,,201,,,201,201,,,201,,201,,201,', +'201,,,,,,,,201,,,,,201,201,201,201,,201,201,,,,201,201,,705,705,705', +',705,201,,201,705,705,,,,705,,705,705,705,705,705,705,705,,,,,,705,705', +'705,705,705,705,705,,,705,,,,,,,705,,,705,705,705,705,705,705,705,705', +',705,705,705,,705,705,705,705,705,,,,,,,,,,,,,,,,,,,,705,,,705,,,705', +'705,,,705,,,,,,705,,,,,,,,705,,,,,705,705,705,705,,705,705,,,,705,705', +',283,283,283,,283,705,,705,283,283,,,,283,,283,283,283,283,283,283,283', +',,,,,283,283,283,283,283,283,283,,,283,,,,,,,283,,,283,283,283,283,283', +'283,283,283,,283,283,283,,283,283,,,283,717,717,717,717,717,717,717', +'717,717,717,717,,717,717,,,717,717,,283,,,283,,,283,283,,,283,,,717', +',717,,717,717,717,717,717,717,717,,717,,,,283,283,283,283,,283,283,', +',,283,283,,717,,283,,,283,,283,677,677,677,,677,,,,677,677,,,,677,,677', +'677,677,677,677,677,677,,,,,,677,677,677,677,677,677,677,,,677,,,,,', +',677,,,677,677,677,677,677,677,677,677,,677,677,677,,677,677,677,677', +'677,,,,,,,,,,,,,,,,,,,,677,,,677,,,677,677,,,677,,,,,,677,,,,,,,,677', +',,,,677,677,677,677,,677,677,,,,677,677,,299,299,299,,299,677,,677,299', +'299,,,,299,,299,299,299,299,299,299,299,,,,,,299,299,299,299,299,299', +'299,,,299,,,,,,,299,,,299,299,299,299,299,299,299,299,,299,299,299,', +'299,299,,761,299,761,761,761,761,761,,,,,,,,,,,,,,,299,,,299,,,299,299', +',,299,,,,,,761,,,,,,,,,761,761,761,761,299,299,299,299,,299,299,,,,299', +'299,,624,624,624,,624,299,,299,624,624,,,,624,,624,624,624,624,624,624', +'624,,,,,,624,624,624,624,624,624,624,,,624,,,,,,,624,,,624,624,624,624', +'624,624,624,624,,624,624,624,,624,624,,763,624,763,763,763,763,763,', +',,,,,,,,,,,,,624,,,624,,,624,624,,,624,,,,,,763,,,,,,,,,763,763,763', +'763,624,624,624,624,,624,624,,,,624,624,,308,308,308,,308,624,,624,308', +'308,,,,308,,308,308,308,308,308,308,308,,,,,,308,308,308,308,308,308', +'308,,,308,,,,,,,308,,,308,308,308,308,308,308,308,308,,308,308,308,', +'308,308,308,308,308,,,,,,,,,,,,,,,,,,,,308,,,308,308,,308,308,,,308', +',,,,,308,,,,,,,,308,,,,,308,308,308,308,,308,308,,,,308,308,,613,613', +'613,,613,308,,308,613,613,,,,613,,613,613,613,613,613,613,613,,,,,,613', +'613,613,613,613,613,613,,,613,,,,,,,613,,,613,613,613,613,613,613,613', +'613,,613,613,613,,613,613,,511,613,511,511,511,511,511,,,,,,,,,,,,,', +',613,,,613,,,613,613,,,613,,,,,,511,511,,,,,,,,511,511,511,511,613,613', +'613,613,,613,613,,,,613,613,,608,608,608,,608,613,,613,608,608,,,,608', +',608,608,608,608,608,608,608,,,,,,608,608,608,608,608,608,608,,,608', +',,,,,,608,,,608,608,608,608,608,608,608,608,,608,608,608,,608,608,608', +'608,608,,,,,,,,,,,,,,,,,,,,608,,,608,,,608,608,,,608,,,,,,608,,,,,,', +',608,,,,,608,608,608,608,,608,608,,,,608,608,,324,324,324,,324,608,', +'608,324,324,,,,324,,324,324,324,324,324,324,324,,,,,,324,324,324,324', +'324,324,324,,,324,,,,,,,324,,,324,324,324,324,324,324,324,324,,324,324', +'324,,324,324,324,324,324,,,,,,,,,,,,,,,,,,,,324,,,324,,,324,324,,,324', +',,,,,324,,,,,,,,324,,,,,324,324,324,324,,324,324,,,,324,324,,325,325', +'325,,325,324,,324,325,325,,,,325,,325,325,325,325,325,325,325,,,,,,325', +'325,325,325,325,325,325,,,325,,,,,,,325,,,325,325,325,325,325,325,325', +'325,,325,325,325,,325,325,325,325,325,,,,,,,,,,,,,,,,,,,,325,,,325,', +',325,325,,,325,,,,,,325,,,,,,,,325,,,,,325,325,325,325,,325,325,,,,325', +'325,,574,574,574,,574,325,,325,574,574,,,,574,,574,574,574,574,574,574', +'574,,,,,,574,574,574,574,574,574,574,,,574,,,,,,,574,,,574,574,574,574', +'574,574,574,574,,574,574,574,,574,574,574,574,574,,,,,,,,,,,,,,,,,,', +',574,,,574,,,574,574,,,574,,,,,,574,,,,,,,,574,,,,,574,574,574,574,', +'574,574,,,,574,574,,573,573,573,,573,574,,574,573,573,,,,573,,573,573', +'573,573,573,573,573,,,,,,573,573,573,573,573,573,573,,,573,,,,,,,573', +',,573,573,573,573,573,573,573,573,,573,573,573,,573,573,573,573,573', +',,,,,,,,,,,,,,,,,,,573,,,573,,,573,573,,,573,,,,,,573,,,,,,,,573,,,', +',573,573,573,573,,573,573,,,,573,573,,569,569,569,,569,573,,573,569', +'569,,,,569,,569,569,569,569,569,569,569,,,,,,569,569,569,569,569,569', +'569,,,569,,,,,,,569,,,569,569,569,569,569,569,569,569,,569,569,569,', +'569,569,569,569,569,,,,,,,,,,,,,,,,,,,,569,,,569,,,569,569,,,569,,,', +',,569,,,,,,,,569,,,,,569,569,569,569,,569,569,,,,569,569,,568,568,568', +',568,569,,569,568,568,,,,568,,568,568,568,568,568,568,568,,,,,,568,568', +'568,568,568,568,568,,,568,,,,,,,568,,,568,568,568,568,568,568,568,568', +',568,568,568,,568,568,568,568,568,,,,,,,,,,,,,,,,,,,,568,,,568,,,568', +'568,,,568,,,,,,568,,,,,,,,568,,,,,568,568,568,568,,568,568,,,,568,568', +',565,565,565,,565,568,,568,565,565,,,,565,,565,565,565,565,565,565,565', +',,,,,565,565,565,565,565,565,565,,,565,,,,,,,565,,,565,565,565,565,565', +'565,565,565,,565,565,565,,565,565,565,565,565,,,,,,,,,,,,,,,,,,,,565', +',,565,,,565,565,,,565,,,,,,565,,,,,,,,565,,,,,565,565,565,565,,565,565', +',,,565,565,,564,564,564,,564,565,,565,564,564,,,,564,,564,564,564,564', +'564,564,564,,,,,,564,564,564,564,564,564,564,,,564,,,,,,,564,,,564,564', +'564,564,564,564,564,564,,564,564,564,,564,564,564,564,564,,,,,,,,,,', +',,,,,,,,,564,,,564,,,564,564,,,564,,564,,,,564,,,,,,,,564,,,,,564,564', +'564,564,,564,564,,,,564,564,,343,343,343,,343,564,,564,343,343,,,,343', +',343,343,343,343,343,343,343,,,,,,343,343,343,343,343,343,343,,,343', +',,,,,,343,,,343,343,343,343,343,343,343,343,,343,343,343,,343,343,343', +'343,343,,,,,,,,,,,,,,,,,,,,343,,,343,,,343,343,,,343,,,,,,343,,,,,,', +',343,,,,,343,343,343,343,,343,343,,,,343,343,,562,562,562,,562,343,', +'343,562,562,,,,562,,562,562,562,562,562,562,562,,,,,,562,562,562,562', +'562,562,562,,,562,,,,,,,562,,,562,562,562,562,562,562,562,562,,562,562', +'562,,562,562,562,562,562,,,,,,,,,,,,,,,,,,,,562,,,562,,,562,562,,,562', +',,,,,562,,,,,,,,562,,,,,562,562,562,562,,562,562,,,,562,562,,534,534', +'534,,534,562,,562,534,534,,,,534,,534,534,534,534,534,534,534,,,,,,534', +'534,534,534,534,534,534,,,534,,,,,,,534,,,534,534,534,534,534,534,534', +'534,,534,534,534,,534,534,534,534,534,,,,,,,,,,,,,,,,,,,,534,,,534,', +',534,534,,,534,,,,,,534,,,,,,,,534,,,,,534,534,534,534,,534,534,,,,534', +'534,,531,531,531,,531,534,,534,531,531,,,,531,,531,531,531,531,531,531', +'531,,,,,,531,531,531,531,531,531,531,,,531,,,,,,,531,,,531,531,531,531', +'531,531,531,531,531,531,531,531,,531,531,531,531,531,,,,,,,,,,,,,,,', +',,,,531,,,531,,,531,531,,,531,,531,,531,,531,,,,,,,,531,,,,,531,531', +'531,531,,531,531,,,,531,531,,521,521,521,,521,531,,531,521,521,,,,521', +',521,521,521,521,521,521,521,,,,,,521,521,521,521,521,521,521,,,521', +',,,,,,521,,,521,521,521,521,521,521,521,521,521,521,521,521,,521,521', +'521,521,521,,,,,,,,,,,,,,,,,,,,521,,,521,,,521,521,,,521,,521,,521,', +'521,,,,,,,,521,,,,,521,521,521,521,,521,521,,,,521,521,,358,358,358', +',358,521,,521,358,358,,,,358,,358,358,358,358,358,358,358,,,,,,358,358', +'358,358,358,358,358,,,358,,,,,,,358,,,358,358,358,358,358,358,358,358', +',358,358,358,,358,358,358,358,358,,,,,,,,,,,,,,,,,,,,358,,,358,,,358', +'358,,,358,,,,,,358,,,,,,,,358,,,,,358,358,358,358,,358,358,,,,358,358', +',520,520,520,,520,358,,358,520,520,,,,520,,520,520,520,520,520,520,520', +',,,,,520,520,520,520,520,520,520,,,520,,,,,,,520,,,520,520,520,520,520', +'520,520,520,,520,520,520,,520,520,520,520,520,,,,,,,,,,,,,,,,,,,,520', +',,520,,,520,520,,,520,,520,,,,520,,,,,,,,520,,,,,520,520,520,520,,520', +'520,,,,520,520,,385,385,385,,385,520,,520,385,385,,,,385,,385,385,385', +'385,385,385,385,,,,,,385,385,385,385,385,385,385,,,385,,,,,,,385,,,385', +'385,385,385,385,385,385,385,,385,385,385,,385,385,385,385,385,,,,,,', +',,,,,,,,,,,,,385,,,385,,,385,385,,,385,,,,,,385,,,,,,,,385,,,,,385,385', +'385,385,,385,385,,,,385,385,,506,506,506,,506,385,,385,506,506,,,,506', +',506,506,506,506,506,506,506,,,,,,506,506,506,506,506,506,506,,,506', +',,,,,,506,,,506,506,506,506,506,506,506,506,506,506,506,506,,506,506', +'506,506,506,,,,,,,,,,,,,,,,,,,,506,,,506,,,506,506,,,506,,,,,,506,,', +',,,,,506,,,,,506,506,506,506,,506,506,,,,506,506,,503,503,503,,503,506', +',506,503,503,,,,503,,503,503,503,503,503,503,503,,,,,,503,503,503,503', +'503,503,503,,,503,,,,,,,503,,,503,503,503,503,503,503,503,503,503,503', +'503,503,,503,503,503,503,503,,,,,,,,,,,,,,,,,,,,503,,,503,,,503,503', +',,503,,503,,,,503,,,,,,,,503,,,,,503,503,503,503,,503,503,,,,503,503', +',499,499,499,,499,503,,503,499,499,,,,499,,499,499,499,499,499,499,499', +',,,,,499,499,499,499,499,499,499,,,499,,,,,,,499,,,499,499,499,499,499', +'499,499,499,,499,499,499,,499,499,499,499,499,,,,,,,,,,,,,,,,,,,,499', +',,499,,,499,499,,,499,,499,,,,499,,,,,,,,499,,,,,499,499,499,499,,499', +'499,,,,499,499,,497,497,497,,497,499,,499,497,497,,,,497,,497,497,497', +'497,497,497,497,,,,,,497,497,497,497,497,497,497,,,497,,,,,,,497,,,497', +'497,497,497,497,497,497,497,,497,497,497,,497,497,497,497,497,,,,,,', +',,,,,,,,,,,,,497,,,497,,,497,497,,,497,,,,,,497,,,,,,,,497,,,,,497,497', +'497,497,,497,497,,,,497,497,,493,493,493,,493,497,,497,493,493,,,,493', +',493,493,493,493,493,493,493,,,,,,493,493,493,493,493,493,493,,,493', +',,,,,,493,,,493,493,493,493,493,493,493,493,,493,493,493,,493,493,493', +'493,493,,,,,,,,,,,,,,,,,,,,493,,,493,,,493,493,,,493,,,,,,493,,,,,,', +',493,,,,,493,493,493,493,,493,493,,,,493,493,,417,417,417,,417,493,', +'493,417,417,,,,417,,417,417,417,417,417,417,417,,,,,,417,417,417,417', +'417,417,417,,,417,,,,,,,417,,,417,417,417,417,417,417,417,417,417,417', +'417,417,,417,417,417,417,417,,,,,,,,,,,,,,,,,,,,417,,,417,,,417,417', +',,417,,417,,417,,417,,,,,,,,417,,,,,417,417,417,417,,417,417,,,,417', +'417,,492,492,492,,492,417,,417,492,492,,,,492,,492,492,492,492,492,492', +'492,,,,,,492,492,492,492,492,492,492,,,492,,,,,,,492,,,492,492,492,492', +'492,492,492,492,,492,492,492,,492,492,492,492,492,,,,,,,,,,,,,,,,,,', +',492,,,492,,,492,492,,,492,,,,,,492,,,,,,,,492,,,,,492,492,492,492,', +'492,492,,,,492,492,,419,419,419,,419,492,,492,419,419,,,,419,,419,419', +'419,419,419,419,419,,,,,,419,419,419,419,419,419,419,,,419,,,,,,,419', +',,419,419,419,419,419,419,419,419,,419,419,419,,419,419,419,419,419', +',,,,,,,,,,,,,,,,,,,419,,,419,,,419,419,,,419,,,,,,419,,,,,,,,419,,,', +',419,419,419,419,,419,419,,,,419,419,,420,420,420,,420,419,,419,420', +'420,,,,420,,420,420,420,420,420,420,420,,,,,,420,420,420,420,420,420', +'420,,,420,,,,,,,420,,,420,420,420,420,420,420,420,420,,420,420,420,', +'420,420,420,420,420,,,,,,,,,,,,,,,,,,,,420,,,420,,,420,420,,,420,,,', +',,420,,,,,,,,420,,,,,420,420,420,420,,420,420,,,,420,420,,421,421,421', +',421,420,,420,421,421,,,,421,,421,421,421,421,421,421,421,,,,,,421,421', +'421,421,421,421,421,,,421,,,,,,,421,,,421,421,421,421,421,421,421,421', +',421,421,421,,421,421,421,421,421,,,,,,,,,,,,,,,,,,,,421,,,421,,,421', +'421,,,421,,,,,,421,,,,,,,,421,,,,,421,421,421,421,,421,421,,,,421,421', +',491,491,491,,491,421,,421,491,491,,,,491,,491,491,491,491,491,491,491', +',,,,,491,491,491,491,491,491,491,,,491,,,,,,,491,,,491,491,491,491,491', +'491,491,491,,491,491,491,,491,491,491,491,491,,,,,,,,,,,,,,,,,,,,491', +',,491,,,491,491,,,491,,,,,,491,,,,,,,,491,,,,,491,491,491,491,,491,491', +',,,491,491,,488,488,488,,488,491,,491,488,488,,,,488,,488,488,488,488', +'488,488,488,,,,,,488,488,488,488,488,488,488,,,488,,,,,,,488,,,488,488', +'488,488,488,488,488,488,,488,488,488,,488,488,,,488,,,,,,,,,,,,,,,,', +',,,488,,,488,,,488,488,,,488,,,,,,,,,,,,,,,,,,,488,488,488,488,,488', +'488,,,,488,488,,481,481,481,,481,488,,488,481,481,,,,481,,481,481,481', +'481,481,481,481,,,,,,481,481,481,481,481,481,481,,,481,,,,,,,481,,,481', +'481,481,481,481,481,481,481,481,481,481,481,,481,481,481,481,481,,,', +',,,,,,,,,,,,,,,,481,,,481,,,481,481,,,481,,481,,481,,481,,,,,,,,481', +',,,,481,481,481,481,,481,481,,,,481,481,,479,479,479,,479,481,,481,479', +'479,,,,479,,479,479,479,479,479,479,479,,,,,,479,479,479,479,479,479', +'479,,,479,,,,,,,479,,,479,479,479,479,479,479,479,479,,479,479,479,', +'479,479,,,479,,,,,,,,,,,,,,,,,,,,479,,,479,,,479,479,,,479,,,,,,,,,', +',,,,,,,,,479,479,479,479,,479,479,,,,479,479,,472,472,472,472,472,479', +',479,472,472,,,,472,,472,472,472,472,472,472,472,,,,,,472,472,472,472', +'472,472,472,,,472,,,,,,472,472,,472,472,472,472,472,472,472,472,472', +',472,472,472,,472,472,472,472,472,20,20,20,20,20,20,20,20,20,20,20,', +'20,20,,,20,20,,472,,,472,,,472,472,,,472,,472,20,,20,472,20,20,20,20', +'20,20,20,472,20,,,,472,472,472,472,,472,472,,,,472,472,,20,449,,,472', +'472,,472,449,449,449,,,449,449,449,,449,,,,,,,,,,449,,,,,,,,,,449,449', +',449,449,449,449,449,,,,,,,,,,,,452,,,,,,,452,452,452,,,452,452,452', +',452,,,,,,449,,,,452,,,449,,,,,449,449,452,452,,452,452,452,452,452', +',,,,,,,,,,,,,449,,,,,,,,,26,,,,,449,,26,26,26,449,452,26,26,26,,26,', +'452,,,,,452,452,,26,26,,,,,,,,,26,26,,26,26,26,26,26,,,452,,,,,,,,,', +',,,,452,,,,,452,26,26,26,26,26,26,26,26,26,26,26,26,26,26,,,26,26,26', +',,26,,26,26,,,26,26,,26,,26,,26,,26,26,26,26,26,26,26,25,26,,26,,,,25', +'25,25,,,25,25,25,,25,26,26,,26,,26,,,25,25,25,,,,,,,,,25,25,,25,25,25', +'25,25,,,,,,,,,,,,,,,,,,,,,,,25,25,25,25,25,25,25,25,25,25,25,25,25,25', +',,25,25,25,,,25,,25,25,,,25,25,,25,,25,,25,,25,25,25,25,25,25,25,396', +'25,25,25,,,,396,396,396,,,396,396,396,,396,25,25,,25,,25,,,396,396,396', +',,,,,,,,396,396,,396,396,396,396,396,,,,,,,,,,,,,,,,,,,,,,,396,396,396', +'396,396,396,396,396,396,396,396,396,396,396,,,396,396,396,,,396,,396', +'396,,,396,396,,396,,396,,396,,396,396,396,396,396,396,396,,396,396,396', +',,,,,,,,,,,,,396,396,,396,,396,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9', +'9,9,9,9,9,,,,9,9,9,9,9,9,9,9,9,9,,,,,,9,9,9,9,9,9,9,9,9,,,9,,,,,,,,9', +'9,,9,9,9,9,9,9,9,,,9,9,,,,9,9,9,9,,,,,,,,,,,,,,9,9,,9,9,9,9,9,9,9,9', +'9,9,9,,,9,9,,,,,,,,,,,9,375,375,375,375,375,375,375,375,375,375,375', +'375,375,375,375,375,375,375,375,375,375,375,375,375,,,,375,375,375,375', +'375,375,375,375,375,375,,,,,,375,375,375,375,375,375,375,375,375,,,375', +',,,,,,,375,375,,375,375,375,375,375,375,375,,,375,375,,,,375,375,375', +'375,,,,,,,,,,,,,,375,375,,375,375,375,375,375,375,375,375,375,375,375', +',,375,375,,,,,,,,,,,375,560,560,560,560,560,560,560,560,560,560,560', +'560,560,560,560,560,560,560,560,560,560,560,560,560,,,,560,560,560,560', +'560,560,560,560,560,560,,,,,,560,560,560,560,560,560,560,560,560,,,560', +',,,,,,,560,560,,560,560,560,560,560,560,560,,,560,560,,,,560,560,560', +'560,,,,,,,,,,,,,,560,560,,560,560,560,560,560,560,560,560,560,560,560', +',,560,560,,,,,,,,,,,560,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8', +'8,8,,,,8,8,8,8,8,8,8,8,8,8,,,,,,8,8,8,8,8,8,8,8,8,8,,8,,,,,,,,8,8,,8', +'8,8,8,8,8,8,,,8,8,,,,8,8,8,8,,,,,,,,,,,,,,8,8,,8,8,8,8,8,8,8,8,8,8,8', +',,8,8,,,,,,,,,,,8,690,690,690,690,690,690,690,690,690,690,690,690,690', +'690,690,690,690,690,690,690,690,690,690,690,,,,690,690,690,690,690,690', +'690,690,690,690,,,,,,690,690,690,690,690,690,690,690,690,,,690,,,,,', +',,690,690,,690,690,690,690,690,690,690,,,690,690,,,,690,690,690,690', +',,,,,,,,,,,,,690,690,,690,690,690,690,690,690,690,690,690,690,690,,', +'690,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66', +'66,66,,,,66,66,66,66,66,66,66,66,66,66,,,,,,66,66,66,66,66,66,66,66', +'66,66,66,66,,66,,,,,,66,66,,66,66,66,66,66,66,66,,,66,66,,,,66,66,66', +'66,,,,,,66,,,,,,,,66,66,,66,66,66,66,66,66,66,66,66,66,66,202,202,66', +',202,,,,,,,,202,202,,202,202,202,202,202,202,202,,,202,202,,,,202,202', +'202,202,,,,,,202,,,,,,,,202,202,,202,202,202,202,202,202,202,202,202', +'202,202,203,203,202,,203,,,,,,,,203,203,,203,203,203,203,203,203,203', +',,203,203,,,,203,203,203,203,,,,,,203,,,,,,,,203,203,,203,203,203,203', +'203,203,203,203,203,203,203,249,249,203,,249,,,,,,,,249,249,,249,249', +'249,249,249,249,249,,,249,249,,,,249,249,249,249,,,,,,,,,,,,,,249,249', +',249,249,249,249,249,249,249,249,249,249,249,250,250,249,,250,,,,,,', +',250,250,,250,250,250,250,250,250,250,,,250,250,,,,250,250,250,250,', +',,,,,,,,,,,,250,250,,250,250,250,250,250,250,250,250,250,250,250,415', +'415,250,,415,,,,,,,,415,415,,415,415,415,415,415,415,415,,,415,415,', +',,415,415,415,415,,,,,,415,,,,,,,,415,415,,415,415,415,415,415,415,415', +'415,415,415,415,416,416,415,,416,,,,,,,,416,416,,416,416,416,416,416', +'416,416,,,416,416,,,,416,416,416,416,,,,,,416,,,,,,,,416,416,,416,416', +'416,416,416,416,416,416,416,416,416,482,482,416,,482,,,,,,,,482,482', +',482,482,482,482,482,482,482,,,482,482,,,,482,482,482,482,,,,,,482,', +',,,,,,482,482,,482,482,482,482,482,482,482,482,482,482,482,483,483,482', +',483,,,,,,,,483,483,,483,483,483,483,483,483,483,,,483,483,,,,483,483', +'483,483,,,,,,483,,,,,,,,483,483,,483,483,483,483,483,483,483,483,483', +'483,483,494,494,483,,494,,,,,,,,494,494,,494,494,494,494,494,494,494', +',,494,494,,,,494,494,494,494,,,,,,494,,,,,,,,494,494,,494,494,494,494', +'494,494,494,494,494,494,494,495,495,494,,495,,,,,,,,495,495,,495,495', +'495,495,495,495,495,,,495,495,,,,495,495,495,495,,,,,,495,,,,,,,,495', +'495,,495,495,495,495,495,495,495,495,495,495,495,522,522,495,,522,,', +',,,,,522,522,,522,522,522,522,522,522,522,,,522,522,,,,522,522,522,522', +',,,,,522,,,,,,,,522,522,,522,522,522,522,522,522,522,522,522,522,522', +'523,523,522,,523,,,,,,,,523,523,,523,523,523,523,523,523,523,,,523,523', +',,,523,523,523,523,,,,,,523,,,,,,,,523,523,,523,523,523,523,523,523', +'523,523,523,523,523,529,529,523,,529,,,,,,,,529,529,,529,529,529,529', +'529,529,529,,,529,529,,,,529,529,529,529,,,,,,529,,,,,,,,529,529,,529', +'529,529,529,529,529,529,529,529,529,529,530,530,529,,530,,,,,,,,530', +'530,,530,530,530,530,530,530,530,,,530,530,,,,530,530,530,530,,,,,,530', +',,,,,,,530,530,,530,530,530,530,530,530,530,530,530,530,530,884,884', +'530,,884,,,,,,,,884,884,,884,884,884,884,884,884,884,,,884,884,,,,884', +'884,884,884,,,,,,884,,,,,,,,884,884,,884,884,884,884,884,884,884,884', +'884,884,884,885,885,884,,885,,,,,,,,885,885,,885,885,885,885,885,885', +'885,,,885,885,,,,885,885,885,885,,,,,,885,,,,,,,,885,885,,885,885,885', +'885,885,885,885,885,885,885,885,922,922,885,,922,,,,,,,,922,922,,922', +'922,922,922,922,922,922,,,922,922,,,,922,922,922,922,,,,,,922,,,,,,', +',922,922,,922,922,922,922,922,922,922,922,922,922,922,,,922,496,496', +'496,496,496,496,496,496,496,496,496,,496,496,,,496,496,,,,,,,,,,,,,', +',496,,496,,496,496,496,496,496,496,496,,496,,408,408,408,408,408,408', +'408,408,408,408,408,,408,408,,496,408,408,,,,,,,,,,,,,,,408,,408,,408', +'408,408,408,408,408,408,,408,,804,804,804,804,804,804,804,804,804,804', +'804,,804,804,,408,804,804,,,,,,,,,,,,,,,804,,804,,804,804,804,804,804', +'804,804,,804,,802,802,802,802,802,802,802,802,802,802,802,,802,802,', +'804,802,802,,,,,,,,,,,,,,,802,,802,,802,802,802,802,802,802,802,,802', +',263,263,263,263,263,263,263,263,263,263,263,,263,263,,802,263,263,', +',,,,,,,,,,,,,263,,263,,263,263,263,263,263,263,263,,263,,447,447,447', +'447,447,447,447,447,447,447,447,,447,447,,263,447,447,,,,,,,,,,,,,,', +'447,,447,,447,447,447,447,447,447,447,,447,,703,703,703,703,703,703', +'703,703,703,703,703,,703,703,447,447,703,703,,,,,,,,,,,,,,,703,,703', +',703,703,703,703,703,703,703,,703,,625,625,625,625,625,625,625,625,625', +'625,625,,625,625,,703,625,625,,,,,,,,,,,,,,,625,,625,,625,625,625,625', +'625,625,625,,625,,706,706,706,706,706,706,706,706,706,706,706,,706,706', +',625,706,706,,,,,,,,,,,,,,,706,,706,,706,706,706,706,706,706,706,,706', +',710,710,710,710,710,710,710,710,710,710,710,,710,710,,706,710,710,', +',,,,,,,,,,,,,710,,710,,710,710,710,710,710,710,710,,710,,715,715,715', +'715,715,715,715,715,715,715,715,,715,715,,710,715,715,,,,,,,,,,,,,,', +'715,,715,,715,715,715,715,715,715,715,,715,,,,,,,,,,,,,,,,,715' ] + racc_action_check = arr = ::Array.new(23658, nil) + idx = 0 + clist.each do |str| + str.split(',', -1).each do |i| + arr[idx] = i.to_i unless i.empty? + idx += 1 + end + end + +racc_action_pointer = [ + 1770, 680, nil, 401, nil, 9265, 1244, 268, 21766, 21394, + 173, 143, 134, 159, 542, 280, 652, nil, -66, 12015, + 20797, 1215, nil, 578, 117, 21155, 21046, 12140, 12265, 12390, + nil, 3895, 12515, 12640, nil, 1098, 239, 1135, 495, 13023, + 13148, 13273, 1051, 1012, nil, nil, nil, nil, nil, nil, + nil, 1637, 2020, 13398, 13523, 13648, -15, nil, 13773, 13898, + nil, nil, 14023, 14156, 14281, 14406, 22002, nil, nil, nil, + nil, nil, nil, nil, 103, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 624, nil, nil, + 234, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 1173, nil, 14656, nil, nil, nil, nil, 11140, 14914, + 15039, 15164, 15289, 884, nil, 485, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 1032, nil, 1134, 15539, 15664, + 15789, 15914, 22062, 22122, 4890, 5015, 5140, 5265, 5390, nil, + nil, 1381, 87, 1072, -82, 987, 1035, nil, 5765, 3520, + 1023, 6015, 6140, 6265, 6390, 6515, 6640, 6765, 6890, 7015, + 7140, 7265, 7390, 7515, 7640, 7765, 7890, 8015, 8140, 8265, + 8390, 8515, 8640, 8765, 8890, 9015, 9140, nil, nil, 22182, + 22242, 1006, 9515, 9640, nil, nil, nil, nil, nil, nil, + nil, 9765, nil, 23254, nil, 936, 926, nil, 10140, 964, + 10390, nil, 10515, nil, nil, 294, 1369, 10890, 910, 2395, + 911, 943, 896, 16164, 3020, 765, 502, 962, 762, nil, + 918, 876, 119, nil, nil, nil, 908, -32, 866, 16422, + nil, 259, 846, 842, 999, nil, 816, nil, 16672, 865, + 862, 505, nil, 72, 273, 749, 707, 128, 728, nil, + nil, 320, 35, 36, 17047, 17172, 392, 771, 654, 28, + 435, 716, 61, 744, nil, nil, 334, 333, 212, nil, + 1014, nil, 27, 18047, nil, nil, 689, 375, -51, 592, + 670, -50, 266, 298, 475, nil, 337, nil, 18672, nil, + 403, 428, 364, 424, -43, 173, nil, nil, nil, nil, + nil, nil, nil, nil, 631, 21518, nil, nil, nil, nil, + 611, nil, nil, 1509, nil, 18922, 592, nil, 590, nil, + nil, 4270, 587, nil, 284, 137, 21264, nil, nil, nil, + 0, 109, 615, nil, nil, 4507, 4398, nil, 23116, nil, + nil, nil, -5, nil, 585, 22302, 22362, 19672, -21, 19922, + 20047, 20172, 2145, 2270, 189, 646, 519, 517, 508, 488, + 3520, 3395, 3270, 2645, 1770, 1895, 2020, 2520, 2895, 3145, + 2395, 1259, 2770, 1134, 1234, 3020, 1384, 23300, 211, 20925, + nil, nil, 20980, nil, nil, 374, nil, nil, 11515, -54, + 97, 403, nil, nil, 11390, nil, 11265, nil, 14789, nil, + nil, nil, 20797, 1384, 467, 474, nil, nil, 484, 20672, + 502, 20547, 22422, 22482, 887, 550, nil, nil, 20422, 530, + nil, 20297, 19797, 19547, 22542, 22602, 23070, 19422, 672, 19297, + nil, 583, nil, 19172, nil, nil, 19047, nil, nil, nil, + nil, 16810, 4145, 703, nil, 759, 29, 63, 717, 733, + 18797, 18547, 22662, 22722, 40, nil, nil, 1137, nil, 22782, + 22842, 18422, nil, nil, 18297, 378, -34, 2520, 12528, nil, + nil, nil, 21, nil, nil, nil, 1117, nil, nil, nil, + 628, nil, nil, 418, nil, nil, 626, nil, nil, nil, + 21642, nil, 18172, 629, 17922, 17797, -48, 673, 17672, 17547, + 679, nil, nil, 17422, 17297, 690, nil, nil, nil, -36, + -40, 364, 494, 669, 12640, 677, nil, 298, nil, 4765, + nil, nil, nil, nil, 215, nil, 14023, -68, 697, nil, + 714, nil, 1384, 2645, nil, 716, nil, 765, 16922, nil, + nil, 1162, -114, 16797, 730, nil, 744, 200, 258, 788, + 204, 1256, 803, 767, 16547, 23392, 831, 834, -25, 903, + nil, 4020, 791, 853, nil, nil, nil, -70, 21, 12786, + nil, 815, 822, 836, nil, nil, nil, nil, nil, nil, + 116, 917, nil, 561, nil, nil, nil, nil, 919, nil, + nil, 926, 643, nil, 964, nil, nil, nil, nil, 975, + nil, 10, 870, 11, 1, 150, 67, 16297, 175, 764, + nil, 895, 1895, 100, nil, nil, 1013, 2770, 14294, 427, + 21890, nil, nil, nil, nil, nil, nil, 3270, nil, nil, + nil, nil, nil, 23346, 907, 16039, 23438, 11015, nil, nil, + 23484, nil, 14656, nil, nil, 23530, nil, 16164, nil, 10765, + 10640, 10265, 10015, 118, 9890, 940, 951, 961, nil, 985, + 964, 995, 145, nil, 1090, 2895, 9390, nil, nil, 977, + 996, 1100, nil, 5890, nil, 991, 172, nil, nil, nil, + 3145, nil, nil, 12, 5640, nil, nil, nil, nil, nil, + 1001, 16435, nil, 16560, nil, nil, 1031, 1091, 5515, nil, + nil, 590, nil, 1017, 426, 1060, 1024, nil, nil, 1149, + nil, 15414, 1153, 1009, 4270, nil, 14531, 1509, -18, 37, + nil, 1171, nil, 4640, nil, 1185, 1080, nil, nil, 1104, + 1088, nil, 23208, 12898, 23162, 4362, nil, 5653, nil, nil, + 554, nil, 1110, 1094, nil, nil, nil, 12773, nil, 1116, + 1104, nil, 1105, nil, nil, nil, 1111, nil, 2270, 498, + 889, 1186, 890, nil, 2145, 1259, 1119, 1117, 1118, nil, + nil, 1123, 1128, nil, 1138, nil, nil, 1145, 628, 1143, + 899, nil, nil, 6, nil, 1264, 1266, nil, 317, nil, + nil, 1286, nil, nil, 14419, nil, 1167, 1169, 1170, -85, + nil, -67, nil, 1024, 412, 33, nil, nil, 11890, nil, + nil, 11765, 87, 11640, 22902, 22962, 372, 98, 216, nil, + 14169, nil, nil, 935, nil, 906, nil, 810, nil, nil, + nil, 460, 774, 369, 3770, nil, nil, nil, nil, nil, + 3645, nil, 3395, 1601, nil, nil, 781, nil, 684, nil, + nil, nil, 23022, nil, 193, nil, 221, 33, -11, 39, + 1131, nil, nil, 252, 254, 256, 279, 283, 870, 287, + 745, 285, 419, 444, 326, 332, 344, 501, 545, 588, + nil, -7, nil, 1060, nil, nil, nil, 617, 616, nil, + nil, nil, nil, 1156, nil, nil, nil, -16, 43, 185, + nil, nil ] + +racc_action_default = [ + -3, -557, -1, -543, -4, -557, -7, -557, -557, -557, + -557, -557, -557, -557, -557, -280, -39, -40, -545, -557, + -45, -47, -48, -49, -255, -255, -255, -290, -326, -327, + -65, -11, -69, -77, -79, -557, -472, -557, -557, -557, + -557, -557, -545, -232, -273, -274, -275, -276, -277, -278, + -279, -533, -11, -557, -556, -525, -298, -300, -557, -557, + -304, -307, -543, -557, -557, -557, -557, -328, -329, -331, + -332, -421, -422, -423, -424, -425, -440, -428, -429, -442, + -444, -433, -438, -454, -442, -456, -457, -531, -461, -462, + -532, -464, -465, -466, -467, -468, -469, -470, -471, -474, + -475, -557, -2, -544, -552, -553, -554, -6, -557, -557, + -557, -557, -557, -3, -15, -557, -106, -107, -108, -109, + -110, -111, -112, -113, -114, -118, -119, -120, -121, -122, + -123, -124, -125, -126, -127, -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, -164, -165, -166, -167, -168, -169, -170, -171, -172, + -173, -174, -175, -176, -177, -178, -179, -180, -181, -182, + -183, -184, -185, -186, -187, -20, -115, -11, -557, -557, + -557, -241, -557, -557, -557, -557, -557, -557, -545, -546, + -44, -557, -472, -557, -280, -557, -557, -224, -557, -11, + -557, -557, -557, -557, -557, -557, -557, -557, -557, -557, + -557, -557, -557, -557, -557, -557, -557, -557, -557, -557, + -557, -557, -557, -557, -557, -557, -557, -391, -393, -557, + -557, -54, -241, -557, -297, -396, -405, -407, -60, -402, + -61, -545, -62, -233, -243, -265, -265, -248, -557, -266, + -557, -527, -557, -63, -64, -543, -12, -557, -67, -11, + -545, -557, -70, -73, -11, -85, -557, -557, -92, -290, + -293, -545, -557, -326, -327, -330, -403, -557, -75, -557, + -81, -287, -458, -459, -557, -209, -210, -225, -557, -413, + -557, -283, -234, -549, -549, -557, -557, -549, -557, -299, + -383, -46, -557, -557, -557, -557, -543, -557, -544, -472, + -557, -557, -280, -557, -342, -343, -101, -102, -557, -104, + -557, -280, -557, -557, -472, -319, -106, -107, -147, -148, + -149, -165, -170, -177, -180, -321, -557, -523, -557, -426, + -557, -557, -557, -557, -557, -557, 972, -5, -555, -21, + -22, -23, -24, -25, -557, -557, -17, -18, -19, -116, + -557, -27, -36, -188, -266, -557, -557, -28, -37, -38, + -29, -190, -545, -242, -534, -535, -255, -400, -536, -537, + -535, -534, -255, -399, -401, -536, -537, -35, -198, -41, + -42, -43, -545, -296, -557, -557, -557, -241, -287, -557, + -557, -557, -199, -200, -201, -202, -203, -204, -205, -206, + -211, -212, -213, -214, -215, -216, -217, -218, -219, -220, + -221, -222, -223, -226, -227, -228, -229, -545, -372, -255, + -534, -535, -255, -52, -55, -545, -256, -257, -258, -372, + -372, -545, -292, -244, -264, -245, -264, -262, -557, -267, + -530, -10, -544, -14, -545, -66, -285, -82, -71, -557, + -545, -241, -557, -557, -91, -557, -458, -459, -557, -78, + -83, -557, -557, -557, -557, -557, -230, -557, -556, -556, + -282, -545, -235, -551, -550, -237, -551, -288, -289, -526, + -301, -495, -11, -333, -334, -11, -557, -557, -557, -557, + -557, -241, -557, -557, -287, -312, -101, -102, -103, -557, + -557, -241, -315, -476, -557, -557, -557, -11, -495, -323, + -541, -542, -545, -427, -441, -446, -557, -448, -430, -443, + -557, -445, -432, -557, -435, -437, -557, -455, -8, -16, + -557, -26, -557, -272, -557, -557, -404, -557, -557, -557, + -56, -240, -397, -557, -557, -58, -398, -295, -547, -534, + -535, -534, -535, -545, -188, -557, -373, -377, -375, -11, + -50, -394, -51, -395, -372, -238, -45, -557, -265, -254, + -545, -260, -11, -11, -291, -265, -263, -268, -557, -528, + -529, -13, -68, -557, -74, -80, -545, -534, -535, -239, + -88, -90, -557, -76, -557, -197, -207, -208, -545, -556, + -340, -11, -414, -556, -415, -416, -284, -549, -557, -495, + -386, -522, -522, -522, -494, -496, -497, -498, -499, -500, + -501, -557, -504, -557, -506, -512, -514, -515, -517, -518, + -519, -557, -556, -335, -556, -305, -336, -337, -308, -557, + -311, -557, -545, -534, -535, -538, -286, -557, -101, -102, + -105, -545, -11, -557, -478, -317, -557, -11, -495, -557, + -557, -524, -447, -450, -451, -452, -453, -11, -431, -434, + -436, -439, -117, -189, -270, -557, -191, -557, -548, -31, + -193, -32, -194, -57, -33, -196, -34, -195, -59, -557, + -557, -557, -557, -404, -557, -522, -522, -522, -371, -557, + -377, -557, -501, -510, -557, -11, -557, -251, -259, -545, + -557, -557, -246, -264, -269, -72, -86, -84, -294, -9, + -11, -420, -341, -557, -557, -418, -236, -384, -387, -389, + -377, -557, -487, -557, -490, -492, -557, -557, -557, -503, + -344, -557, -346, -348, -355, -501, -545, -516, -520, -557, + -338, -557, -557, -11, -11, -310, -557, -11, -404, -557, + -404, -557, -477, -11, -320, -557, -545, -480, -324, -557, + -271, -30, -192, -557, -231, -362, -364, -557, -367, -369, + -557, -374, -557, -378, -379, -381, -382, -557, -392, -557, + -265, -250, -265, -261, -406, -408, -265, -419, -11, -93, + -557, -557, -100, -417, -11, -11, -545, -522, -522, -507, + -521, -522, -522, -513, -522, -502, -508, -545, -557, -353, + -557, -505, -302, -557, -303, -557, -557, -268, -556, -313, + -316, -557, -322, -479, -495, -449, -522, -522, -522, -522, + -511, -522, -376, -557, -509, -557, -53, -249, -264, -252, + -247, -264, -413, -241, -557, -557, -99, -557, -557, -385, + -557, -483, -485, -557, -488, -557, -491, -557, -493, -345, + -347, -351, -557, -356, -11, -306, -309, -409, -410, -411, + -11, -318, -11, -557, -359, -361, -557, -365, -557, -368, + -370, -380, -557, -287, -265, -412, -545, -534, -535, -538, + -98, -388, -390, -522, -522, -522, -522, -349, -557, -354, + -557, -556, -557, -557, -522, -522, -522, -522, -286, -538, + -253, -404, -481, -557, -484, -486, -489, -557, -352, -339, + -314, -325, -357, -557, -360, -363, -366, -522, -350, -522, + -482, -358 ] + +clist = [ +'119,119,313,207,355,36,282,310,314,317,36,295,295,392,312,264,264,264', +'498,519,114,196,629,106,489,454,210,308,15,566,396,402,278,15,124,124', +'36,285,285,512,515,779,295,295,295,463,465,687,322,323,280,102,326,255', +'259,609,644,36,119,15,288,288,6,727,455,103,298,6,329,344,344,344,726', +'122,122,382,389,449,452,528,15,640,106,644,665,668,502,505,816,843,509', +'332,341,341,544,609,551,554,369,370,371,372,251,258,260,599,814,900', +'36,839,327,606,903,606,589,2,776,36,36,262,273,274,361,729,107,602,603', +'365,784,870,591,15,728,593,342,345,749,195,335,375,15,15,594,560,315', +'601,386,386,456,600,739,357,316,839,319,510,333,532,356,539,501,320', +'13,324,939,6,783,13,325,1,677,910,682,793,373,6,537,538,690,864,730', +'813,638,757,644,511,248,834,782,264,835,448,459,13,460,406,907,633,753', +'900,958,359,36,360,614,381,387,390,362,760,669,407,363,623,13,553,843', +'364,692,968,723,697,367,837,36,15,,,374,583,816,397,,644,847,870,,838', +',841,264,264,,396,402,839,,15,921,264,,,,746,,281,,,796,,735,,295,,', +'13,812,,,,680,,,490,13,13,485,,295,,278,867,36,868,36,278,,700,285,36', +'866,,,616,,106,836,,474,,,,,480,285,15,,15,,788,619,288,15,,516,517', +'478,,790,,959,255,619,471,,259,,288,,,,,609,672,,,,472,745,473,,,311', +'681,713,457,106,321,321,718,619,321,,461,,,,859,619,13,,,533,,,,933', +'119,,,,,,912,518,,634,567,737,,,13,908,821,,742,11,559,787,944,606,11', +',,,,,321,321,321,321,124,,,,264,,,406,644,756,,598,,,,,11,605,,,380', +',,,571,,,,,,576,585,,,,,,11,13,122,13,,281,397,,13,386,,334,,,,490,', +',,637,295,635,,,490,,,,,295,671,264,828,,,,570,406,,36,571,,575,571', +',,285,,,406,,11,,,686,285,409,410,411,412,11,11,15,,,281,,,,288,281', +'264,,397,,,,406,288,36,,264,36,406,,397,683,606,,590,606,,592,,,,611', +',666,666,,,15,,36,15,,,,,,,909,397,119,,,684,685,,,397,,,,951,,15,,', +'567,,904,,702,,696,709,711,,,,714,716,,11,,,124,490,,751,,925,295,755', +'36,,,,747,,877,567,879,295,,11,880,36,36,,,,,321,321,,,15,285,,,,,,', +'122,,,798,285,15,15,536,,13,,36,791,,,,288,795,,,,,542,571,,,576,288', +',,,,567,,15,,,,11,,11,567,789,,,11,,,,13,,318,13,,,,,119,,820,,,36,', +',822,826,36,,,926,,,,13,,,36,792,950,,,,,797,15,,619,,801,15,,,,,,,', +',,15,,,,,,,,295,,,662,,,664,36,,,,,,,311,861,,,13,,,,36,,,,829,,,,15', +'13,13,,,,,,853,14,,,,,14,15,,,,832,,,,628,,36,36,,211,36,13,,,295,,36', +'211,211,211,,14,286,286,,,,666,,15,15,734,,15,413,,,384,388,15,344,321', +'14,211,740,741,,,211,211,924,36,211,330,340,340,,36,36,,,,13,341,,,', +'13,,,,,,752,15,,11,13,,,15,15,,,,943,,462,,264,,,,14,,406,,,211,211', +'211,211,14,14,,,475,467,,469,,470,,770,,13,11,,,11,,,,,,,,36,,567,13', +'397,406,36,,36,,,,799,,11,,,,,,,,,15,,,,,,15,,15,,,,,13,13,,,13,,,,', +',13,,,,819,,,,,,,321,,,14,211,211,211,211,827,11,211,211,211,211,211', +',,,,,725,,11,11,13,14,,,,,13,13,,,,,,,,,563,855,856,,,858,,770,,,849', +'11,,,577,,,,211,211,,,,,,,,211,,,,,,,,,,,,,,,,14,,14,882,,,286,14,,887', +'888,,,,595,,,13,,11,604,321,286,13,11,13,,,,,597,,,612,11,,607,,318', +'615,610,770,,770,,,,211,211,,,,,,,,,,,,636,,,,,,211,,,,,632,11,,,607', +',,318,941,,211,,,,942,,11,,,,833,384,,937,770,,,,,,691,,,,,,,,,,,,842', +',,844,,,,11,11,,,11,,,,,,11,770,,770,,,704,,,,211,,,,,,,,,,770,,,,,', +',869,,738,871,,,,,11,,,,,24,11,11,,,24,,,,,744,211,,,,,,748,,24,,,,', +',14,,24,24,24,,24,286,,211,,,,,,,286,,,,,,,,,211,,24,24,,,,,24,24,,', +'24,,,14,,,14,,934,11,,935,211,936,,11,,11,,,,,211,,,211,,,14,,,945,', +',946,,947,,,,,24,,,,800,24,24,24,24,24,24,,,,,,,,211,211,,,,211,211', +'823,,,,,967,,,,,,,,,14,969,,,,,762,764,765,,,,,14,14,,,,,,,,,851,286', +',,,846,,,,,,,286,,,,,,,14,863,,,857,,,,,,,,,24,24,24,24,24,,,24,24,24', +'24,24,,,,,,,,,,,24,,,,,,889,,,,,211,,806,808,809,14,899,,,,14,,,,,,', +',,,14,,24,24,,,,,,,211,24,,,,,,,,,,,,,,,,24,,24,607,,,857,24,,,,14,', +',,,,,,,,,,,,,14,,,,830,,,,,,,,,,,,,,,,,24,24,,,,,,,,,211,,14,14,,,14', +',,24,891,892,14,,894,896,,898,,,,,,,24,,,,,,,,,,,,874,,,914,915,917', +'919,,920,,,14,,,,,,14,14,,,,,,,,,,,,,,,,,,,,,,,,,,,,,24,,,,,,,,,,,,', +',,,,,,211,,,,952,954,955,956,,,,,,,,962,964,965,966,,,14,24,,,,,14,', +'14,,,,,,,24,,970,,971,,,,,24,,,,,,,,,,,,,,,,24,,,,,,,,,,,,,,,24,,,24', +',,,,,24,,,,,,,,,,24,,,24,,,24,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,24,24,,', +',24,24,,,,,,,,,,,,,,,24,,,,,,,,217,,,,,24,24,,263,263,263,,,,,,,,,,305', +'306,307,,,,,,,,,,,,24,263,263,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,', +',,,,,24,,,,,24,,,,,24,,,,,,,,,,24,,,,,,,,,,24,,,,,,,,,,,,,,,,,,,,,,', +',,,,,24,,,,,,,,,,,,,,,24,,,,,,,,,,,,,,,,,,,,,,,,,,383,263,391,263,,24', +'408,24,24,,,24,,,,,,24,,,217,,,422,423,424,425,426,427,428,429,430,431', +'432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,,,,24', +',263,263,,,24,24,,,,263,,,,,,,263,,263,,263,,,,,,,,,,,,,,,,,,,,,,,,', +',,,,,,,,24,,,496,,,,,,,,,,,,,,,,,,24,,,,,,24,,24,,,,,,,,,,,,,,,,,,,', +',,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,263,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,263', +',408,584,391,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,596,,,,,,263,,263,', +'263,,,,,,,,,,,,,263,,,,,,,,,,625,626,627,,,,,,263,,,,263,,,263,,,,,', +',,,,,,,,263,263,,,,,,,,,,263,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,703,,263', +'706,,,710,712,,,,715,717,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,263,,,,,,', +',,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,', +',,,,,,,,,,,,,,,,,,,,,,263,,802,,,,,,,,,,,,710,712,717,715,,804,,,,,', +',,,,,,263,,,,,,,263,,,,,,,,,,,,,,,,,,,,,,,,,263,,,,,,,,,,,,,,,,,,263', +',,,,,,,,,,,,,,,,802,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,', +',,,,,,,,,,,,,,,,,,,,,,,,,,263,,,263,,263' ] + racc_goto_table = arr = ::Array.new(2681, nil) + idx = 0 + clist.each do |str| + str.split(',', -1).each do |i| + arr[idx] = i.to_i unless i.empty? + idx += 1 + end + end + +clist = [ +'52,52,61,29,51,48,45,8,63,63,48,58,58,22,60,31,31,31,10,87,14,14,11', +'91,47,36,18,29,24,23,34,34,41,24,56,56,48,48,48,84,84,85,58,58,58,66', +'66,93,16,16,42,4,16,64,64,157,119,48,52,24,24,24,7,117,22,6,46,7,48', +'48,48,48,116,55,55,25,25,34,34,49,24,128,91,119,86,86,62,62,124,153', +'62,24,24,24,147,157,147,147,16,16,16,16,35,35,35,67,123,110,48,152,4', +'67,113,67,37,2,112,48,48,40,40,40,143,121,5,37,37,143,101,154,65,24', +'119,65,50,50,12,15,19,28,24,24,38,57,59,68,61,61,69,71,72,79,80,152', +'81,83,88,90,94,95,96,97,20,98,113,7,99,20,100,1,102,103,104,105,7,7', +'106,107,108,109,114,122,125,126,119,127,129,130,11,31,131,132,134,20', +'135,52,136,137,138,110,113,141,48,142,47,18,18,18,144,128,87,18,145', +'47,20,146,153,148,149,113,23,150,5,151,48,24,,,2,22,124,64,,119,112', +'154,,117,,117,31,31,,34,34,152,,24,123,31,,,,23,,9,,,128,,37,,58,,,20', +'121,,,,49,,,45,20,20,29,,58,,41,117,48,117,48,41,,147,48,48,116,,,22', +',91,121,,42,,,,,42,48,24,,24,,23,34,24,24,,16,16,46,,23,,85,64,34,4', +',64,,24,,,,,157,22,,,,6,47,7,,,27,22,36,40,91,27,27,36,34,27,,40,,,', +'86,34,20,,,91,,,,117,52,,,,,,93,4,,25,29,66,,,20,11,67,,66,17,14,84', +'117,67,17,,,,,,27,27,27,27,56,,,,31,,,52,119,62,,63,,,,,17,63,,,9,,', +',64,,,,,,64,29,,,,,,17,20,55,20,,9,64,,20,61,,17,,,,45,,,,63,58,60,', +',45,,,,,58,61,31,84,,,,35,52,,48,64,,35,64,,,48,,,52,,17,,,8,48,27,27', +'27,27,17,17,24,,,9,,,,24,9,31,,64,,,,52,24,48,,31,48,52,,64,16,67,,35', +'67,,35,,,,7,,91,91,,,24,,48,24,,,,,,,87,64,52,,,91,91,,,64,,,,23,,24', +',,29,,84,,14,,24,18,18,,,,18,18,,17,,,56,45,,60,,10,58,60,48,,,,45,', +'66,29,66,58,,17,66,48,48,,,,,27,27,,,24,48,,,,,,,55,,,51,48,24,24,27', +',20,,48,8,,,,24,8,,,,,27,64,,,64,24,,,,,29,,24,,,,17,,17,29,16,,,17', +',,,20,,26,20,,,,,52,,61,,,48,,,63,61,48,,,22,,,,20,,,48,91,66,,,,,91', +'24,,34,,18,24,,,,,,,,,,24,,,,,,,,58,,,9,,,9,48,,,,,,,27,8,,,20,,,,48', +',,,48,,,,24,20,20,,,,,,16,21,,,,,21,24,,,,24,,,,27,,48,48,,21,48,20', +',,58,,48,21,21,21,,21,21,21,,,,91,,24,24,9,,24,43,,,26,26,24,48,27,21', +'21,9,9,,,21,21,63,48,21,21,21,21,,48,48,,,,20,24,,,,20,,,,,,9,24,,17', +'20,,,24,24,,,,8,,43,,31,,,,21,,52,,,21,21,21,21,21,21,,,43,26,,26,,26', +',111,,20,17,,,17,,,,,,,,48,,29,20,64,52,48,,48,,,,9,,17,,,,,,,,,24,', +',,,,24,,24,,,,,20,20,,,20,,,,,,20,,,,9,,,,,,,27,,,21,21,21,21,21,9,17', +'21,21,21,21,21,,,,,,115,,17,17,20,21,,,,,20,20,,,,,,,,,26,9,9,,,9,,111', +',,111,17,,,43,,,,21,21,,,,,,,,21,,,,,,,,,,,,,,,,21,,21,9,,,21,21,,9', +'9,,,,43,,,20,,17,43,27,21,20,17,20,,,,,26,,,43,17,,26,,26,43,26,111', +',111,,,,21,21,,,,,,,,,,,,43,,,,,,21,,,,,26,17,,,26,,,26,9,,21,,,,9,', +'17,,,,17,26,,111,111,,,,,,43,,,,,,,,,,,,115,,,115,,,,17,17,,,17,,,,', +',17,111,,111,,,26,,,,21,,,,,,,,,,111,,,,,,,115,,43,115,,,,,17,,,,,39', +'17,17,,,39,,,,,26,21,,,,,,43,,39,,,,,,21,,39,39,39,,39,21,,21,,,,,,', +'21,,,,,,,,,21,,39,39,,,,,39,39,,,39,,,21,,,21,,115,17,,115,21,115,,17', +',17,,,,,21,,,21,,,21,,,115,,,115,,115,,,,,39,,,,26,39,39,39,39,39,39', +',,,,,,,21,21,,,,21,21,43,,,,,115,,,,,,,,,21,115,,,,,118,118,118,,,,', +'21,21,,,,,,,,,43,21,,,,26,,,,,,,21,,,,,,,21,43,,,26,,,,,,,,,39,39,39', +'39,39,,,39,39,39,39,39,,,,,,,,,,,39,,,,,,43,,,,,21,,118,118,118,21,43', +',,,21,,,,,,,,,,21,,39,39,,,,,,,21,39,,,,,,,,,,,,,,,,39,,39,26,,,26,39', +',,,21,,,,,,,,,,,,,,,21,,,,21,,,,,,,,,,,,,,,,,39,39,,,,,,,,,21,,21,21', +',,21,,,39,118,118,21,,118,118,,118,,,,,,,39,,,,,,,,,,,,21,,,118,118', +'118,118,,118,,,21,,,,,,21,21,,,,,,,,,,,,,,,,,,,,,,,,,,,,,39,,,,,,,,', +',,,,,,,,,,21,,,,118,118,118,118,,,,,,,,118,118,118,118,,,21,39,,,,,21', +',21,,,,,,,39,,118,,118,,,,,39,,,,,,,,,,,,,,,,39,,,,,,,,,,,,,,,39,,,39', +',,,,,39,,,,,,,,,,39,,,39,,,39,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,39,39,,', +',39,39,,,,,,,,,,,,,,,39,,,,,,,,30,,,,,39,39,,30,30,30,,,,,,,,,,30,30', +'30,,,,,,,,,,,,39,30,30,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,39', +',,,,39,,,,,39,,,,,,,,,,39,,,,,,,,,,39,,,,,,,,,,,,,,,,,,,,,,,,,,,,39', +',,,,,,,,,,,,,,39,,,,,,,,,,,,,,,,,,,,,,,,,,30,30,30,30,,39,30,39,39,', +',39,,,,,,39,,,30,,,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30', +'30,30,30,30,30,30,30,30,30,,,,39,,30,30,,,39,39,,,,30,,,,,,,30,,30,', +'30,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,39,,,30,,,,,,,,,,,,,,,,,,39,,,,,', +'39,,39,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,30,,,,,,,,', +',,,,,,,,,,,,,,,,,,,,,,,30,,30,30,30,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,', +',,,,30,,,,,,30,,30,,30,,,,,,,,,,,,,30,,,,,,,,,,30,30,30,,,,,,30,,,,30', +',,30,,,,,,,,,,,,,,30,30,,,,,,,,,,30,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,30', +',30,30,,,30,30,,,,30,30,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,30,,,,,,,,', +',,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,', +',,,,,,,,,,,,,,,,,,,,30,,30,,,,,,,,,,,,30,30,30,30,,30,,,,,,,,,,,,30', +',,,,,,30,,,,,,,,,,,,,,,,,,,,,,,,,30,,,,,,,,,,,,,,,,,,30,,,,,,,,,,,,', +',,,,30,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,', +',,,,,,,,,,,,,30,,,30,,30' ] + racc_goto_check = arr = ::Array.new(2681, nil) + idx = 0 + clist.each do |str| + str.split(',', -1).each do |i| + arr[idx] = i.to_i unless i.empty? + idx += 1 + end + end + +racc_goto_pointer = [ + nil, 169, 115, nil, 48, 119, 62, 62, -45, 224, + -291, -476, -493, nil, 12, 128, -10, 386, 7, 75, + 162, 772, -188, -363, 28, -123, 621, 289, 25, -15, + 1797, -12, nil, nil, -172, 78, -226, -334, -311, 1219, + 92, 1, 19, 608, nil, -26, 33, -275, 5, -259, + 70, -62, -8, nil, nil, 65, 26, -236, -21, 90, + -40, -52, -227, -46, 29, -319, -220, -353, -313, -105, + nil, -309, -451, nil, nil, nil, nil, nil, nil, 85, + 97, 98, nil, -165, -283, -621, -432, -308, 93, nil, + -185, 20, nil, -491, 92, -197, -151, 104, 103, -499, + 107, -540, -355, -688, -360, -512, -169, -178, -361, -619, + -741, 242, -537, -738, -407, 399, -515, -524, 726, -455, + nil, -464, -550, -625, -643, -329, -455, -135, -430, 165, + -571, -569, -56, nil, -64, -63, -662, -302, -435, nil, + nil, 127, 127, 43, 128, 131, -148, -266, 135, -328, + -326, -538, -652, -674, -678, nil, nil, -411 ] + +racc_goto_default = [ + nil, nil, nil, 3, nil, 4, 328, 276, nil, 309, + nil, 780, nil, 275, nil, nil, nil, 215, 17, 12, + 216, 304, nil, nil, 214, nil, 269, 16, nil, 414, + 20, 21, 22, 23, 622, nil, nil, nil, nil, 292, + 393, 30, nil, nil, 32, 35, 34, nil, 212, 339, + nil, 121, 399, 120, 123, 72, 73, nil, 43, nil, + 630, 265, nil, 266, 404, 572, nil, 267, nil, nil, + 253, nil, nil, 44, 45, 46, 47, 48, 49, 50, + nil, 254, 56, nil, nil, nil, nil, nil, nil, 64, + nil, 513, 65, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 772, 652, nil, 773, nil, 641, nil, 643, nil, 840, + 586, nil, nil, nil, 649, nil, nil, nil, 689, nil, + nil, nil, nil, 403, nil, nil, nil, nil, nil, 71, + 74, 75, nil, nil, nil, nil, nil, 549, nil, nil, + nil, 642, 654, 655, 733, 658, 661, 271 ] + +racc_reduce_table = [ + 0, 0, :racc_error, + 1, 138, :_reduce_none, + 2, 139, :_reduce_2, + 0, 140, :_reduce_3, + 1, 140, :_reduce_4, + 3, 140, :_reduce_5, + 2, 140, :_reduce_6, + 1, 142, :_reduce_none, + 4, 142, :_reduce_8, + 4, 145, :_reduce_9, + 2, 146, :_reduce_10, + 0, 150, :_reduce_11, + 1, 150, :_reduce_12, + 3, 150, :_reduce_13, + 2, 150, :_reduce_14, + 0, 165, :_reduce_15, + 4, 144, :_reduce_16, + 3, 144, :_reduce_17, + 3, 144, :_reduce_18, + 3, 144, :_reduce_19, + 2, 144, :_reduce_20, + 3, 144, :_reduce_21, + 3, 144, :_reduce_22, + 3, 144, :_reduce_23, + 3, 144, :_reduce_24, + 3, 144, :_reduce_25, + 4, 144, :_reduce_26, + 3, 144, :_reduce_27, + 3, 144, :_reduce_28, + 3, 144, :_reduce_29, + 6, 144, :_reduce_30, + 5, 144, :_reduce_31, + 5, 144, :_reduce_32, + 5, 144, :_reduce_33, + 5, 144, :_reduce_34, + 3, 144, :_reduce_35, + 3, 144, :_reduce_36, + 3, 144, :_reduce_37, + 3, 144, :_reduce_38, + 1, 144, :_reduce_none, + 1, 164, :_reduce_none, + 3, 164, :_reduce_41, + 3, 164, :_reduce_42, + 3, 164, :_reduce_43, + 2, 164, :_reduce_44, + 1, 164, :_reduce_none, + 1, 153, :_reduce_none, + 1, 155, :_reduce_none, + 1, 155, :_reduce_none, + 1, 169, :_reduce_none, + 4, 169, :_reduce_50, + 4, 169, :_reduce_51, + 0, 175, :_reduce_52, + 5, 173, :_reduce_53, + 2, 168, :_reduce_54, + 3, 168, :_reduce_55, + 4, 168, :_reduce_56, + 5, 168, :_reduce_57, + 4, 168, :_reduce_58, + 5, 168, :_reduce_59, + 2, 168, :_reduce_60, + 2, 168, :_reduce_61, + 2, 168, :_reduce_62, + 2, 168, :_reduce_63, + 2, 168, :_reduce_64, + 1, 156, :_reduce_65, + 3, 156, :_reduce_66, + 1, 179, :_reduce_67, + 3, 179, :_reduce_68, + 1, 178, :_reduce_none, + 2, 178, :_reduce_70, + 3, 178, :_reduce_71, + 5, 178, :_reduce_72, + 2, 178, :_reduce_73, + 4, 178, :_reduce_74, + 2, 178, :_reduce_75, + 4, 178, :_reduce_76, + 1, 178, :_reduce_77, + 3, 178, :_reduce_78, + 1, 182, :_reduce_none, + 3, 182, :_reduce_80, + 2, 181, :_reduce_81, + 3, 181, :_reduce_82, + 1, 184, :_reduce_83, + 3, 184, :_reduce_84, + 1, 183, :_reduce_85, + 4, 183, :_reduce_86, + 3, 183, :_reduce_87, + 3, 183, :_reduce_88, + 3, 183, :_reduce_89, + 3, 183, :_reduce_90, + 2, 183, :_reduce_91, + 1, 183, :_reduce_92, + 1, 154, :_reduce_93, + 4, 154, :_reduce_94, + 3, 154, :_reduce_95, + 3, 154, :_reduce_96, + 3, 154, :_reduce_97, + 3, 154, :_reduce_98, + 2, 154, :_reduce_99, + 1, 154, :_reduce_100, + 1, 186, :_reduce_101, + 1, 186, :_reduce_none, + 2, 187, :_reduce_103, + 1, 187, :_reduce_104, + 3, 187, :_reduce_105, + 1, 188, :_reduce_none, + 1, 188, :_reduce_none, + 1, 188, :_reduce_none, + 1, 188, :_reduce_none, + 1, 188, :_reduce_none, + 1, 191, :_reduce_111, + 1, 191, :_reduce_none, + 1, 151, :_reduce_none, + 1, 151, :_reduce_none, + 1, 152, :_reduce_115, + 0, 194, :_reduce_116, + 4, 152, :_reduce_117, + 1, 189, :_reduce_none, + 1, 189, :_reduce_none, + 1, 189, :_reduce_none, + 1, 189, :_reduce_none, + 1, 189, :_reduce_none, + 1, 189, :_reduce_none, + 1, 189, :_reduce_none, + 1, 189, :_reduce_none, + 1, 189, :_reduce_none, + 1, 189, :_reduce_none, + 1, 189, :_reduce_none, + 1, 189, :_reduce_none, + 1, 189, :_reduce_none, + 1, 189, :_reduce_none, + 1, 189, :_reduce_none, + 1, 189, :_reduce_none, + 1, 189, :_reduce_none, + 1, 189, :_reduce_none, + 1, 189, :_reduce_none, + 1, 189, :_reduce_none, + 1, 189, :_reduce_none, + 1, 189, :_reduce_none, + 1, 189, :_reduce_none, + 1, 189, :_reduce_none, + 1, 189, :_reduce_none, + 1, 189, :_reduce_none, + 1, 189, :_reduce_none, + 1, 189, :_reduce_none, + 1, 189, :_reduce_none, + 1, 190, :_reduce_none, + 1, 190, :_reduce_none, + 1, 190, :_reduce_none, + 1, 190, :_reduce_none, + 1, 190, :_reduce_none, + 1, 190, :_reduce_none, + 1, 190, :_reduce_none, + 1, 190, :_reduce_none, + 1, 190, :_reduce_none, + 1, 190, :_reduce_none, + 1, 190, :_reduce_none, + 1, 190, :_reduce_none, + 1, 190, :_reduce_none, + 1, 190, :_reduce_none, + 1, 190, :_reduce_none, + 1, 190, :_reduce_none, + 1, 190, :_reduce_none, + 1, 190, :_reduce_none, + 1, 190, :_reduce_none, + 1, 190, :_reduce_none, + 1, 190, :_reduce_none, + 1, 190, :_reduce_none, + 1, 190, :_reduce_none, + 1, 190, :_reduce_none, + 1, 190, :_reduce_none, + 1, 190, :_reduce_none, + 1, 190, :_reduce_none, + 1, 190, :_reduce_none, + 1, 190, :_reduce_none, + 1, 190, :_reduce_none, + 1, 190, :_reduce_none, + 1, 190, :_reduce_none, + 1, 190, :_reduce_none, + 1, 190, :_reduce_none, + 1, 190, :_reduce_none, + 1, 190, :_reduce_none, + 1, 190, :_reduce_none, + 1, 190, :_reduce_none, + 1, 190, :_reduce_none, + 1, 190, :_reduce_none, + 1, 190, :_reduce_none, + 3, 167, :_reduce_188, + 5, 167, :_reduce_189, + 3, 167, :_reduce_190, + 5, 167, :_reduce_191, + 6, 167, :_reduce_192, + 5, 167, :_reduce_193, + 5, 167, :_reduce_194, + 5, 167, :_reduce_195, + 5, 167, :_reduce_196, + 4, 167, :_reduce_197, + 3, 167, :_reduce_198, + 3, 167, :_reduce_199, + 3, 167, :_reduce_200, + 3, 167, :_reduce_201, + 3, 167, :_reduce_202, + 3, 167, :_reduce_203, + 3, 167, :_reduce_204, + 3, 167, :_reduce_205, + 3, 167, :_reduce_206, + 4, 167, :_reduce_207, + 4, 167, :_reduce_208, + 2, 167, :_reduce_209, + 2, 167, :_reduce_210, + 3, 167, :_reduce_211, + 3, 167, :_reduce_212, + 3, 167, :_reduce_213, + 3, 167, :_reduce_214, + 3, 167, :_reduce_215, + 3, 167, :_reduce_216, + 3, 167, :_reduce_217, + 3, 167, :_reduce_218, + 3, 167, :_reduce_219, + 3, 167, :_reduce_220, + 3, 167, :_reduce_221, + 3, 167, :_reduce_222, + 3, 167, :_reduce_223, + 2, 167, :_reduce_224, + 2, 167, :_reduce_225, + 3, 167, :_reduce_226, + 3, 167, :_reduce_227, + 3, 167, :_reduce_228, + 3, 167, :_reduce_229, + 3, 167, :_reduce_230, + 6, 167, :_reduce_231, + 1, 167, :_reduce_none, + 1, 163, :_reduce_none, + 1, 196, :_reduce_none, + 2, 196, :_reduce_none, + 4, 196, :_reduce_236, + 2, 196, :_reduce_237, + 3, 201, :_reduce_238, + 0, 202, :_reduce_239, + 1, 202, :_reduce_none, + 0, 159, :_reduce_241, + 1, 159, :_reduce_none, + 1, 177, :_reduce_243, + 2, 177, :_reduce_244, + 2, 177, :_reduce_245, + 4, 177, :_reduce_246, + 6, 177, :_reduce_247, + 1, 177, :_reduce_248, + 4, 205, :_reduce_249, + 3, 205, :_reduce_250, + 2, 205, :_reduce_251, + 4, 205, :_reduce_252, + 6, 205, :_reduce_253, + 1, 205, :_reduce_254, + 0, 207, :_reduce_255, + 2, 172, :_reduce_256, + 1, 206, :_reduce_257, + 0, 208, :_reduce_258, + 3, 206, :_reduce_259, + 0, 209, :_reduce_260, + 4, 206, :_reduce_261, + 2, 204, :_reduce_262, + 2, 203, :_reduce_263, + 1, 203, :_reduce_264, + 0, 203, :_reduce_265, + 1, 198, :_reduce_266, + 2, 198, :_reduce_267, + 3, 198, :_reduce_268, + 4, 198, :_reduce_269, + 3, 162, :_reduce_270, + 4, 162, :_reduce_271, + 2, 162, :_reduce_272, + 1, 195, :_reduce_none, + 1, 195, :_reduce_none, + 1, 195, :_reduce_none, + 1, 195, :_reduce_none, + 1, 195, :_reduce_none, + 1, 195, :_reduce_none, + 1, 195, :_reduce_none, + 1, 195, :_reduce_none, + 1, 195, :_reduce_281, + 3, 195, :_reduce_282, + 0, 233, :_reduce_283, + 4, 195, :_reduce_284, + 3, 195, :_reduce_285, + 3, 195, :_reduce_286, + 2, 195, :_reduce_287, + 3, 195, :_reduce_288, + 3, 195, :_reduce_289, + 1, 195, :_reduce_290, + 4, 195, :_reduce_291, + 3, 195, :_reduce_292, + 1, 195, :_reduce_293, + 5, 195, :_reduce_294, + 4, 195, :_reduce_295, + 3, 195, :_reduce_296, + 2, 195, :_reduce_297, + 1, 195, :_reduce_none, + 2, 195, :_reduce_299, + 0, 234, :_reduce_300, + 3, 195, :_reduce_301, + 6, 195, :_reduce_302, + 6, 195, :_reduce_303, + 0, 235, :_reduce_304, + 0, 236, :_reduce_305, + 7, 195, :_reduce_306, + 0, 237, :_reduce_307, + 0, 238, :_reduce_308, + 7, 195, :_reduce_309, + 5, 195, :_reduce_310, + 4, 195, :_reduce_311, + 0, 239, :_reduce_312, + 0, 240, :_reduce_313, + 9, 195, :_reduce_314, + 0, 241, :_reduce_315, + 6, 195, :_reduce_316, + 0, 242, :_reduce_317, + 7, 195, :_reduce_318, + 0, 243, :_reduce_319, + 5, 195, :_reduce_320, + 0, 244, :_reduce_321, + 6, 195, :_reduce_322, + 0, 245, :_reduce_323, + 0, 246, :_reduce_324, + 9, 195, :_reduce_325, + 1, 195, :_reduce_326, + 1, 195, :_reduce_327, + 1, 195, :_reduce_328, + 1, 195, :_reduce_329, + 1, 158, :_reduce_none, + 1, 226, :_reduce_331, + 1, 229, :_reduce_332, + 1, 221, :_reduce_none, + 1, 221, :_reduce_none, + 2, 221, :_reduce_335, + 1, 223, :_reduce_none, + 1, 223, :_reduce_none, + 1, 222, :_reduce_none, + 5, 222, :_reduce_339, + 1, 148, :_reduce_none, + 2, 148, :_reduce_341, + 1, 225, :_reduce_none, + 1, 225, :_reduce_none, + 1, 247, :_reduce_none, + 3, 247, :_reduce_345, + 1, 250, :_reduce_346, + 3, 250, :_reduce_347, + 1, 249, :_reduce_none, + 4, 249, :_reduce_349, + 6, 249, :_reduce_350, + 3, 249, :_reduce_351, + 5, 249, :_reduce_352, + 2, 249, :_reduce_353, + 4, 249, :_reduce_354, + 1, 249, :_reduce_355, + 3, 249, :_reduce_356, + 6, 251, :_reduce_357, + 8, 251, :_reduce_358, + 4, 251, :_reduce_359, + 6, 251, :_reduce_360, + 4, 251, :_reduce_361, + 2, 251, :_reduce_none, + 6, 251, :_reduce_363, + 2, 251, :_reduce_364, + 4, 251, :_reduce_365, + 6, 251, :_reduce_366, + 2, 251, :_reduce_367, + 4, 251, :_reduce_368, + 2, 251, :_reduce_369, + 4, 251, :_reduce_370, + 1, 251, :_reduce_371, + 0, 174, :_reduce_372, + 1, 174, :_reduce_373, + 3, 257, :_reduce_374, + 1, 257, :_reduce_375, + 4, 257, :_reduce_376, + 0, 258, :_reduce_377, + 2, 258, :_reduce_378, + 1, 259, :_reduce_379, + 3, 259, :_reduce_380, + 1, 260, :_reduce_381, + 1, 260, :_reduce_none, + 0, 264, :_reduce_383, + 3, 220, :_reduce_384, + 4, 262, :_reduce_385, + 1, 262, :_reduce_386, + 0, 267, :_reduce_387, + 4, 263, :_reduce_388, + 0, 268, :_reduce_389, + 4, 263, :_reduce_390, + 0, 269, :_reduce_391, + 5, 266, :_reduce_392, + 2, 170, :_reduce_393, + 4, 170, :_reduce_394, + 4, 170, :_reduce_395, + 2, 219, :_reduce_396, + 4, 219, :_reduce_397, + 4, 219, :_reduce_398, + 3, 219, :_reduce_399, + 3, 219, :_reduce_400, + 3, 219, :_reduce_401, + 2, 219, :_reduce_402, + 1, 219, :_reduce_403, + 4, 219, :_reduce_404, + 0, 271, :_reduce_405, + 5, 218, :_reduce_406, + 0, 272, :_reduce_407, + 5, 218, :_reduce_408, + 5, 224, :_reduce_409, + 1, 273, :_reduce_410, + 1, 273, :_reduce_none, + 6, 147, :_reduce_412, + 0, 147, :_reduce_413, + 1, 274, :_reduce_414, + 1, 274, :_reduce_none, + 1, 274, :_reduce_none, + 2, 275, :_reduce_417, + 1, 275, :_reduce_none, + 2, 149, :_reduce_419, + 1, 149, :_reduce_none, + 1, 210, :_reduce_none, + 1, 210, :_reduce_none, + 1, 210, :_reduce_none, + 1, 211, :_reduce_424, + 1, 277, :_reduce_425, + 2, 277, :_reduce_426, + 3, 278, :_reduce_427, + 1, 278, :_reduce_428, + 1, 278, :_reduce_429, + 3, 212, :_reduce_430, + 4, 213, :_reduce_431, + 3, 214, :_reduce_432, + 0, 282, :_reduce_433, + 3, 282, :_reduce_434, + 1, 283, :_reduce_435, + 2, 283, :_reduce_436, + 3, 215, :_reduce_437, + 0, 285, :_reduce_438, + 3, 285, :_reduce_439, + 0, 279, :_reduce_440, + 2, 279, :_reduce_441, + 0, 280, :_reduce_442, + 2, 280, :_reduce_443, + 0, 281, :_reduce_444, + 2, 281, :_reduce_445, + 1, 284, :_reduce_446, + 2, 284, :_reduce_447, + 0, 287, :_reduce_448, + 4, 284, :_reduce_449, + 1, 286, :_reduce_450, + 1, 286, :_reduce_451, + 1, 286, :_reduce_452, + 1, 286, :_reduce_none, + 1, 192, :_reduce_454, + 3, 193, :_reduce_455, + 1, 276, :_reduce_456, + 1, 276, :_reduce_457, + 2, 276, :_reduce_458, + 2, 276, :_reduce_459, + 1, 185, :_reduce_460, + 1, 185, :_reduce_461, + 1, 185, :_reduce_462, + 1, 185, :_reduce_463, + 1, 185, :_reduce_464, + 1, 185, :_reduce_465, + 1, 185, :_reduce_466, + 1, 185, :_reduce_467, + 1, 185, :_reduce_468, + 1, 185, :_reduce_469, + 1, 185, :_reduce_470, + 1, 185, :_reduce_471, + 1, 216, :_reduce_472, + 1, 157, :_reduce_473, + 1, 161, :_reduce_474, + 1, 161, :_reduce_475, + 1, 227, :_reduce_476, + 3, 227, :_reduce_477, + 2, 227, :_reduce_478, + 3, 230, :_reduce_479, + 2, 230, :_reduce_480, + 6, 265, :_reduce_481, + 8, 265, :_reduce_482, + 4, 265, :_reduce_483, + 6, 265, :_reduce_484, + 4, 265, :_reduce_485, + 6, 265, :_reduce_486, + 2, 265, :_reduce_487, + 4, 265, :_reduce_488, + 6, 265, :_reduce_489, + 2, 265, :_reduce_490, + 4, 265, :_reduce_491, + 2, 265, :_reduce_492, + 4, 265, :_reduce_493, + 1, 265, :_reduce_494, + 0, 265, :_reduce_495, + 1, 261, :_reduce_496, + 1, 261, :_reduce_497, + 1, 261, :_reduce_498, + 1, 261, :_reduce_499, + 1, 248, :_reduce_none, + 1, 248, :_reduce_501, + 3, 248, :_reduce_502, + 2, 248, :_reduce_503, + 1, 289, :_reduce_none, + 3, 289, :_reduce_505, + 1, 252, :_reduce_506, + 3, 252, :_reduce_507, + 3, 290, :_reduce_508, + 3, 291, :_reduce_509, + 1, 253, :_reduce_510, + 3, 253, :_reduce_511, + 1, 288, :_reduce_512, + 3, 288, :_reduce_513, + 1, 292, :_reduce_none, + 1, 292, :_reduce_none, + 2, 254, :_reduce_516, + 1, 254, :_reduce_517, + 1, 293, :_reduce_none, + 1, 293, :_reduce_none, + 2, 256, :_reduce_520, + 2, 255, :_reduce_521, + 0, 255, :_reduce_522, + 1, 231, :_reduce_none, + 3, 231, :_reduce_524, + 0, 217, :_reduce_525, + 2, 217, :_reduce_none, + 1, 200, :_reduce_527, + 3, 200, :_reduce_528, + 3, 294, :_reduce_529, + 2, 294, :_reduce_530, + 1, 176, :_reduce_none, + 1, 176, :_reduce_none, + 1, 176, :_reduce_none, + 1, 171, :_reduce_none, + 1, 171, :_reduce_none, + 1, 171, :_reduce_none, + 1, 171, :_reduce_none, + 1, 270, :_reduce_none, + 1, 270, :_reduce_none, + 1, 270, :_reduce_none, + 1, 232, :_reduce_none, + 1, 232, :_reduce_none, + 0, 141, :_reduce_none, + 1, 141, :_reduce_none, + 0, 166, :_reduce_none, + 1, 166, :_reduce_none, + 2, 180, :_reduce_547, + 2, 160, :_reduce_548, + 0, 199, :_reduce_none, + 1, 199, :_reduce_none, + 1, 199, :_reduce_none, + 1, 228, :_reduce_552, + 1, 228, :_reduce_none, + 1, 143, :_reduce_none, + 2, 143, :_reduce_none, + 0, 197, :_reduce_556 ] + +racc_reduce_n = 557 + +racc_shift_n = 972 + +racc_token_table = { + false => 0, + :error => 1, + :kCLASS => 2, + :kMODULE => 3, + :kDEF => 4, + :kUNDEF => 5, + :kBEGIN => 6, + :kRESCUE => 7, + :kENSURE => 8, + :kEND => 9, + :kIF => 10, + :kUNLESS => 11, + :kTHEN => 12, + :kELSIF => 13, + :kELSE => 14, + :kCASE => 15, + :kWHEN => 16, + :kWHILE => 17, + :kUNTIL => 18, + :kFOR => 19, + :kBREAK => 20, + :kNEXT => 21, + :kREDO => 22, + :kRETRY => 23, + :kIN => 24, + :kDO => 25, + :kDO_COND => 26, + :kDO_BLOCK => 27, + :kDO_LAMBDA => 28, + :kRETURN => 29, + :kYIELD => 30, + :kSUPER => 31, + :kSELF => 32, + :kNIL => 33, + :kTRUE => 34, + :kFALSE => 35, + :kAND => 36, + :kOR => 37, + :kNOT => 38, + :kIF_MOD => 39, + :kUNLESS_MOD => 40, + :kWHILE_MOD => 41, + :kUNTIL_MOD => 42, + :kRESCUE_MOD => 43, + :kALIAS => 44, + :kDEFINED => 45, + :klBEGIN => 46, + :klEND => 47, + :k__LINE__ => 48, + :k__FILE__ => 49, + :k__ENCODING__ => 50, + :tIDENTIFIER => 51, + :tFID => 52, + :tGVAR => 53, + :tIVAR => 54, + :tCONSTANT => 55, + :tLABEL => 56, + :tCVAR => 57, + :tNTH_REF => 58, + :tBACK_REF => 59, + :tSTRING_CONTENT => 60, + :tINTEGER => 61, + :tFLOAT => 62, + :tUPLUS => 63, + :tUMINUS => 64, + :tUNARY_NUM => 65, + :tPOW => 66, + :tCMP => 67, + :tEQ => 68, + :tEQQ => 69, + :tNEQ => 70, + :tGEQ => 71, + :tLEQ => 72, + :tANDOP => 73, + :tOROP => 74, + :tMATCH => 75, + :tNMATCH => 76, + :tDOT => 77, + :tDOT2 => 78, + :tDOT3 => 79, + :tAREF => 80, + :tASET => 81, + :tLSHFT => 82, + :tRSHFT => 83, + :tCOLON2 => 84, + :tCOLON3 => 85, + :tOP_ASGN => 86, + :tASSOC => 87, + :tLPAREN => 88, + :tLPAREN2 => 89, + :tRPAREN => 90, + :tLPAREN_ARG => 91, + :tLBRACK => 92, + :tLBRACK2 => 93, + :tRBRACK => 94, + :tLBRACE => 95, + :tLBRACE_ARG => 96, + :tSTAR => 97, + :tSTAR2 => 98, + :tAMPER => 99, + :tAMPER2 => 100, + :tTILDE => 101, + :tPERCENT => 102, + :tDIVIDE => 103, + :tPLUS => 104, + :tMINUS => 105, + :tLT => 106, + :tGT => 107, + :tPIPE => 108, + :tBANG => 109, + :tCARET => 110, + :tLCURLY => 111, + :tRCURLY => 112, + :tBACK_REF2 => 113, + :tSYMBEG => 114, + :tSTRING_BEG => 115, + :tXSTRING_BEG => 116, + :tREGEXP_BEG => 117, + :tREGEXP_OPT => 118, + :tWORDS_BEG => 119, + :tQWORDS_BEG => 120, + :tSTRING_DBEG => 121, + :tSTRING_DVAR => 122, + :tSTRING_END => 123, + :tSTRING => 124, + :tSYMBOL => 125, + :tNL => 126, + :tEH => 127, + :tCOLON => 128, + :tCOMMA => 129, + :tSPACE => 130, + :tSEMI => 131, + :tLAMBDA => 132, + :tLAMBEG => 133, + :tCHARACTER => 134, + :tEQL => 135, + :tLOWEST => 136 } + +racc_nt_base = 137 + +racc_use_result_var = true + +Racc_arg = [ + racc_action_table, + racc_action_check, + racc_action_default, + racc_action_pointer, + racc_goto_table, + racc_goto_check, + racc_goto_default, + racc_goto_pointer, + racc_nt_base, + racc_reduce_table, + racc_token_table, + racc_shift_n, + racc_reduce_n, + racc_use_result_var ] + +Racc_token_to_s_table = [ + "$end", + "error", + "kCLASS", + "kMODULE", + "kDEF", + "kUNDEF", + "kBEGIN", + "kRESCUE", + "kENSURE", + "kEND", + "kIF", + "kUNLESS", + "kTHEN", + "kELSIF", + "kELSE", + "kCASE", + "kWHEN", + "kWHILE", + "kUNTIL", + "kFOR", + "kBREAK", + "kNEXT", + "kREDO", + "kRETRY", + "kIN", + "kDO", + "kDO_COND", + "kDO_BLOCK", + "kDO_LAMBDA", + "kRETURN", + "kYIELD", + "kSUPER", + "kSELF", + "kNIL", + "kTRUE", + "kFALSE", + "kAND", + "kOR", + "kNOT", + "kIF_MOD", + "kUNLESS_MOD", + "kWHILE_MOD", + "kUNTIL_MOD", + "kRESCUE_MOD", + "kALIAS", + "kDEFINED", + "klBEGIN", + "klEND", + "k__LINE__", + "k__FILE__", + "k__ENCODING__", + "tIDENTIFIER", + "tFID", + "tGVAR", + "tIVAR", + "tCONSTANT", + "tLABEL", + "tCVAR", + "tNTH_REF", + "tBACK_REF", + "tSTRING_CONTENT", + "tINTEGER", + "tFLOAT", + "tUPLUS", + "tUMINUS", + "tUNARY_NUM", + "tPOW", + "tCMP", + "tEQ", + "tEQQ", + "tNEQ", + "tGEQ", + "tLEQ", + "tANDOP", + "tOROP", + "tMATCH", + "tNMATCH", + "tDOT", + "tDOT2", + "tDOT3", + "tAREF", + "tASET", + "tLSHFT", + "tRSHFT", + "tCOLON2", + "tCOLON3", + "tOP_ASGN", + "tASSOC", + "tLPAREN", + "tLPAREN2", + "tRPAREN", + "tLPAREN_ARG", + "tLBRACK", + "tLBRACK2", + "tRBRACK", + "tLBRACE", + "tLBRACE_ARG", + "tSTAR", + "tSTAR2", + "tAMPER", + "tAMPER2", + "tTILDE", + "tPERCENT", + "tDIVIDE", + "tPLUS", + "tMINUS", + "tLT", + "tGT", + "tPIPE", + "tBANG", + "tCARET", + "tLCURLY", + "tRCURLY", + "tBACK_REF2", + "tSYMBEG", + "tSTRING_BEG", + "tXSTRING_BEG", + "tREGEXP_BEG", + "tREGEXP_OPT", + "tWORDS_BEG", + "tQWORDS_BEG", + "tSTRING_DBEG", + "tSTRING_DVAR", + "tSTRING_END", + "tSTRING", + "tSYMBOL", + "tNL", + "tEH", + "tCOLON", + "tCOMMA", + "tSPACE", + "tSEMI", + "tLAMBDA", + "tLAMBEG", + "tCHARACTER", + "tEQL", + "tLOWEST", + "$start", + "program", + "top_compstmt", + "top_stmts", + "opt_terms", + "top_stmt", + "terms", + "stmt", + "bodystmt", + "compstmt", + "opt_rescue", + "opt_else", + "opt_ensure", + "stmts", + "fitem", + "undef_list", + "expr_value", + "lhs", + "command_call", + "mlhs", + "var_lhs", + "primary_value", + "opt_call_args", + "rbracket", + "backref", + "mrhs", + "arg_value", + "expr", + "@1", + "opt_nl", + "arg", + "command", + "block_command", + "block_call", + "operation2", + "command_args", + "cmd_brace_block", + "opt_block_param", + "@2", + "operation", + "call_args", + "mlhs_basic", + "mlhs_inner", + "rparen", + "mlhs_head", + "mlhs_item", + "mlhs_node", + "mlhs_post", + "variable", + "cname", + "cpath", + "fname", + "op", + "reswords", + "fsym", + "symbol", + "dsym", + "@3", + "primary", + "aref_args", + "none", + "args", + "trailer", + "assocs", + "paren_args", + "opt_paren_args", + "opt_block_arg", + "block_arg", + "call_args2", + "open_args", + "@4", + "@5", + "@6", + "literal", + "strings", + "xstring", + "regexp", + "words", + "qwords", + "var_ref", + "assoc_list", + "brace_block", + "method_call", + "lambda", + "then", + "if_tail", + "do", + "case_body", + "for_var", + "k_class", + "superclass", + "term", + "k_module", + "f_arglist", + "singleton", + "dot_or_colon", + "@7", + "@8", + "@9", + "@10", + "@11", + "@12", + "@13", + "@14", + "@15", + "@16", + "@17", + "@18", + "@19", + "@20", + "f_marg", + "f_norm_arg", + "f_margs", + "f_marg_list", + "block_param", + "f_arg", + "f_block_optarg", + "f_rest_arg", + "opt_f_block_arg", + "f_block_arg", + "block_param_def", + "opt_bv_decl", + "bv_decls", + "bvar", + "f_bad_arg", + "f_larglist", + "lambda_body", + "@21", + "f_args", + "do_block", + "@22", + "@23", + "@24", + "operation3", + "@25", + "@26", + "cases", + "exc_list", + "exc_var", + "numeric", + "string", + "string1", + "string_contents", + "xstring_contents", + "regexp_contents", + "word_list", + "word", + "string_content", + "qword_list", + "string_dvar", + "@27", + "f_optarg", + "f_arg_item", + "f_opt", + "f_block_opt", + "restarg_mark", + "blkarg_mark", + "assoc" ] + +Racc_debug_parser = false + +##### State transition tables end ##### + +# reduce 0 omitted + +# reduce 1 omitted + +def _reduce_2(val, _values, result) + result = @builder.compstmt(val[0]) + + result +end + +def _reduce_3(val, _values, result) + result = [] + + result +end + +def _reduce_4(val, _values, result) + result = [ val[0] ] + + result +end + +def _reduce_5(val, _values, result) + result = val[0] << val[2] + + result +end + +def _reduce_6(val, _values, result) + result = [ val[1] ] + + result +end + +# reduce 7 omitted + +def _reduce_8(val, _values, result) + result = @builder.preexe(val[0], val[1], val[2], val[3]) + + result +end + +def _reduce_9(val, _values, result) + rescue_bodies = val[1] + else_t, else_ = val[2] + ensure_t, ensure_ = val[3] + + if rescue_bodies.empty? && !else_t.nil? + diagnostic :warning, :useless_else, nil, else_t + end + + result = @builder.begin_body(val[0], + rescue_bodies, + else_t, else_, + ensure_t, ensure_) + + result +end + +def _reduce_10(val, _values, result) + result = @builder.compstmt(val[0]) + + result +end + +def _reduce_11(val, _values, result) + result = [] + + result +end + +def _reduce_12(val, _values, result) + result = [ val[0] ] + + result +end + +def _reduce_13(val, _values, result) + result = val[0] << val[2] + + result +end + +def _reduce_14(val, _values, result) + result = [ val[1] ] + + result +end + +def _reduce_15(val, _values, result) + @lexer.state = :expr_fname + + result +end + +def _reduce_16(val, _values, result) + result = @builder.alias(val[0], val[1], val[3]) + + result +end + +def _reduce_17(val, _values, result) + result = @builder.alias(val[0], + @builder.gvar(val[1]), + @builder.gvar(val[2])) + + result +end + +def _reduce_18(val, _values, result) + result = @builder.alias(val[0], + @builder.gvar(val[1]), + @builder.back_ref(val[2])) + + result +end + +def _reduce_19(val, _values, result) + diagnostic :error, :nth_ref_alias, nil, val[2] + + result +end + +def _reduce_20(val, _values, result) + result = @builder.undef_method(val[0], val[1]) + + result +end + +def _reduce_21(val, _values, result) + result = @builder.condition_mod(val[0], nil, + val[1], val[2]) + + result +end + +def _reduce_22(val, _values, result) + result = @builder.condition_mod(nil, val[0], + val[1], val[2]) + + result +end + +def _reduce_23(val, _values, result) + result = @builder.loop_mod(:while, val[0], val[1], val[2]) + + result +end + +def _reduce_24(val, _values, result) + result = @builder.loop_mod(:until, val[0], val[1], val[2]) + + result +end + +def _reduce_25(val, _values, result) + rescue_body = @builder.rescue_body(val[1], + nil, nil, nil, + nil, val[2]) + + result = @builder.begin_body(val[0], [ rescue_body ]) + + result +end + +def _reduce_26(val, _values, result) + result = @builder.postexe(val[0], val[1], val[2], val[3]) + + result +end + +def _reduce_27(val, _values, result) + result = @builder.assign(val[0], val[1], val[2]) + + result +end + +def _reduce_28(val, _values, result) + result = @builder.multi_assign(val[0], val[1], val[2]) + + result +end + +def _reduce_29(val, _values, result) + result = @builder.op_assign(val[0], val[1], val[2]) + + result +end + +def _reduce_30(val, _values, result) + result = @builder.op_assign( + @builder.index( + val[0], val[1], val[2], val[3]), + val[4], val[5]) + + result +end + +def _reduce_31(val, _values, result) + result = @builder.op_assign( + @builder.call_method( + val[0], val[1], val[2]), + val[3], val[4]) + + result +end + +def _reduce_32(val, _values, result) + result = @builder.op_assign( + @builder.call_method( + val[0], val[1], val[2]), + val[3], val[4]) + + result +end + +def _reduce_33(val, _values, result) + diagnostic :error, :const_reassignment, nil, val[3] + + result +end + +def _reduce_34(val, _values, result) + result = @builder.op_assign( + @builder.call_method( + val[0], val[1], val[2]), + val[3], val[4]) + + result +end + +def _reduce_35(val, _values, result) + @builder.op_assign(val[0], val[1], val[2]) + + result +end + +def _reduce_36(val, _values, result) + result = @builder.assign(val[0], val[1], + @builder.array(nil, val[2], nil)) + + result +end + +def _reduce_37(val, _values, result) + result = @builder.multi_assign(val[0], val[1], val[2]) + + result +end + +def _reduce_38(val, _values, result) + result = @builder.multi_assign(val[0], val[1], + @builder.array(nil, val[2], nil)) + + result +end + +# reduce 39 omitted + +# reduce 40 omitted + +def _reduce_41(val, _values, result) + result = @builder.logical_op(:and, val[0], val[1], val[2]) + + result +end + +def _reduce_42(val, _values, result) + result = @builder.logical_op(:or, val[0], val[1], val[2]) + + result +end + +def _reduce_43(val, _values, result) + result = @builder.not_op(val[0], nil, val[2], nil) + + result +end + +def _reduce_44(val, _values, result) + result = @builder.not_op(val[0], nil, val[1], nil) + + result +end + +# reduce 45 omitted + +# reduce 46 omitted + +# reduce 47 omitted + +# reduce 48 omitted + +# reduce 49 omitted + +def _reduce_50(val, _values, result) + result = @builder.call_method(val[0], val[1], val[2], + *val[3]) + + result +end + +def _reduce_51(val, _values, result) + result = @builder.call_method(val[0], val[1], val[2], + *val[3]) + + result +end + +def _reduce_52(val, _values, result) + @static_env.extend_dynamic + result = @context.dup + @context.in_block = true + + result +end + +def _reduce_53(val, _values, result) + result = [ val[0], val[2], val[3], val[4] ] + + @static_env.unextend + @context.in_block = val[1].in_block + + result +end + +def _reduce_54(val, _values, result) + result = @builder.call_method(nil, nil, val[0], + *val[1]) + + result +end + +def _reduce_55(val, _values, result) + method_call = @builder.call_method(nil, nil, val[0], + *val[1]) + + begin_t, args, body, end_t = val[2] + result = @builder.block(method_call, + begin_t, args, body, end_t) + + result +end + +def _reduce_56(val, _values, result) + result = @builder.call_method(val[0], val[1], val[2], + *val[3]) + + result +end + +def _reduce_57(val, _values, result) + method_call = @builder.call_method(val[0], val[1], val[2], + *val[3]) + + begin_t, args, body, end_t = val[4] + result = @builder.block(method_call, + begin_t, args, body, end_t) + + result +end + +def _reduce_58(val, _values, result) + result = @builder.call_method(val[0], val[1], val[2], + *val[3]) + + result +end + +def _reduce_59(val, _values, result) + method_call = @builder.call_method(val[0], val[1], val[2], + *val[3]) + + begin_t, args, body, end_t = val[4] + result = @builder.block(method_call, + begin_t, args, body, end_t) + + result +end + +def _reduce_60(val, _values, result) + result = @builder.keyword_cmd(:super, val[0], + *val[1]) + + result +end + +def _reduce_61(val, _values, result) + result = @builder.keyword_cmd(:yield, val[0], + *val[1]) + + result +end + +def _reduce_62(val, _values, result) + result = @builder.keyword_cmd(:return, val[0], + nil, val[1], nil) + + result +end + +def _reduce_63(val, _values, result) + result = @builder.keyword_cmd(:break, val[0], + nil, val[1], nil) + + result +end + +def _reduce_64(val, _values, result) + result = @builder.keyword_cmd(:next, val[0], + nil, val[1], nil) + + result +end + +def _reduce_65(val, _values, result) + result = @builder.multi_lhs(nil, val[0], nil) + + result +end + +def _reduce_66(val, _values, result) + result = @builder.begin(val[0], val[1], val[2]) + + result +end + +def _reduce_67(val, _values, result) + result = @builder.multi_lhs(nil, val[0], nil) + + result +end + +def _reduce_68(val, _values, result) + result = @builder.multi_lhs(val[0], val[1], val[2]) + + result +end + +# reduce 69 omitted + +def _reduce_70(val, _values, result) + result = val[0]. + push(val[1]) + + result +end + +def _reduce_71(val, _values, result) + result = val[0]. + push(@builder.splat(val[1], val[2])) + + result +end + +def _reduce_72(val, _values, result) + result = val[0]. + push(@builder.splat(val[1], val[2])). + concat(val[4]) + + result +end + +def _reduce_73(val, _values, result) + result = val[0]. + push(@builder.splat(val[1])) + + result +end + +def _reduce_74(val, _values, result) + result = val[0]. + push(@builder.splat(val[1])). + concat(val[3]) + + result +end + +def _reduce_75(val, _values, result) + result = [ @builder.splat(val[0], val[1]) ] + + result +end + +def _reduce_76(val, _values, result) + result = [ @builder.splat(val[0], val[1]), + *val[3] ] + + result +end + +def _reduce_77(val, _values, result) + result = [ @builder.splat(val[0]) ] + + result +end + +def _reduce_78(val, _values, result) + result = [ @builder.splat(val[0]), + *val[2] ] + + result +end + +# reduce 79 omitted + +def _reduce_80(val, _values, result) + result = @builder.begin(val[0], val[1], val[2]) + + result +end + +def _reduce_81(val, _values, result) + result = [ val[0] ] + + result +end + +def _reduce_82(val, _values, result) + result = val[0] << val[1] + + result +end + +def _reduce_83(val, _values, result) + result = [ val[0] ] + + result +end + +def _reduce_84(val, _values, result) + result = val[0] << val[2] + + result +end + +def _reduce_85(val, _values, result) + result = @builder.assignable(val[0]) + + result +end + +def _reduce_86(val, _values, result) + result = @builder.index_asgn(val[0], val[1], val[2], val[3]) + + result +end + +def _reduce_87(val, _values, result) + result = @builder.attr_asgn(val[0], val[1], val[2]) + + result +end + +def _reduce_88(val, _values, result) + result = @builder.attr_asgn(val[0], val[1], val[2]) + + result +end + +def _reduce_89(val, _values, result) + result = @builder.attr_asgn(val[0], val[1], val[2]) + + result +end + +def _reduce_90(val, _values, result) + result = @builder.assignable( + @builder.const_fetch(val[0], val[1], val[2])) + + result +end + +def _reduce_91(val, _values, result) + result = @builder.assignable( + @builder.const_global(val[0], val[1])) + + result +end + +def _reduce_92(val, _values, result) + result = @builder.assignable(val[0]) + + result +end + +def _reduce_93(val, _values, result) + result = @builder.assignable(val[0]) + + result +end + +def _reduce_94(val, _values, result) + result = @builder.index_asgn(val[0], val[1], val[2], val[3]) + + result +end + +def _reduce_95(val, _values, result) + result = @builder.attr_asgn(val[0], val[1], val[2]) + + result +end + +def _reduce_96(val, _values, result) + result = @builder.attr_asgn(val[0], val[1], val[2]) + + result +end + +def _reduce_97(val, _values, result) + result = @builder.attr_asgn(val[0], val[1], val[2]) + + result +end + +def _reduce_98(val, _values, result) + result = @builder.assignable( + @builder.const_fetch(val[0], val[1], val[2])) + + result +end + +def _reduce_99(val, _values, result) + result = @builder.assignable( + @builder.const_global(val[0], val[1])) + + result +end + +def _reduce_100(val, _values, result) + result = @builder.assignable(val[0]) + + result +end + +def _reduce_101(val, _values, result) + diagnostic :error, :module_name_const, nil, val[0] + + result +end + +# reduce 102 omitted + +def _reduce_103(val, _values, result) + result = @builder.const_global(val[0], val[1]) + + result +end + +def _reduce_104(val, _values, result) + result = @builder.const(val[0]) + + result +end + +def _reduce_105(val, _values, result) + result = @builder.const_fetch(val[0], val[1], val[2]) + + result +end + +# reduce 106 omitted + +# reduce 107 omitted + +# reduce 108 omitted + +# reduce 109 omitted + +# reduce 110 omitted + +def _reduce_111(val, _values, result) + result = @builder.symbol_internal(val[0]) + + result +end + +# reduce 112 omitted + +# reduce 113 omitted + +# reduce 114 omitted + +def _reduce_115(val, _values, result) + result = [ val[0] ] + + result +end + +def _reduce_116(val, _values, result) + @lexer.state = :expr_fname + + result +end + +def _reduce_117(val, _values, result) + result = val[0] << val[3] + + result +end + +# reduce 118 omitted + +# reduce 119 omitted + +# reduce 120 omitted + +# reduce 121 omitted + +# reduce 122 omitted + +# reduce 123 omitted + +# reduce 124 omitted + +# reduce 125 omitted + +# reduce 126 omitted + +# reduce 127 omitted + +# reduce 128 omitted + +# reduce 129 omitted + +# reduce 130 omitted + +# reduce 131 omitted + +# reduce 132 omitted + +# reduce 133 omitted + +# reduce 134 omitted + +# reduce 135 omitted + +# reduce 136 omitted + +# reduce 137 omitted + +# reduce 138 omitted + +# reduce 139 omitted + +# reduce 140 omitted + +# reduce 141 omitted + +# reduce 142 omitted + +# reduce 143 omitted + +# reduce 144 omitted + +# reduce 145 omitted + +# reduce 146 omitted + +# reduce 147 omitted + +# reduce 148 omitted + +# reduce 149 omitted + +# reduce 150 omitted + +# reduce 151 omitted + +# reduce 152 omitted + +# reduce 153 omitted + +# reduce 154 omitted + +# reduce 155 omitted + +# reduce 156 omitted + +# reduce 157 omitted + +# reduce 158 omitted + +# reduce 159 omitted + +# reduce 160 omitted + +# reduce 161 omitted + +# reduce 162 omitted + +# reduce 163 omitted + +# reduce 164 omitted + +# reduce 165 omitted + +# reduce 166 omitted + +# reduce 167 omitted + +# reduce 168 omitted + +# reduce 169 omitted + +# reduce 170 omitted + +# reduce 171 omitted + +# reduce 172 omitted + +# reduce 173 omitted + +# reduce 174 omitted + +# reduce 175 omitted + +# reduce 176 omitted + +# reduce 177 omitted + +# reduce 178 omitted + +# reduce 179 omitted + +# reduce 180 omitted + +# reduce 181 omitted + +# reduce 182 omitted + +# reduce 183 omitted + +# reduce 184 omitted + +# reduce 185 omitted + +# reduce 186 omitted + +# reduce 187 omitted + +def _reduce_188(val, _values, result) + result = @builder.assign(val[0], val[1], val[2]) + + result +end + +def _reduce_189(val, _values, result) + rescue_body = @builder.rescue_body(val[3], + nil, nil, nil, + nil, val[4]) + + rescue_ = @builder.begin_body(val[2], [ rescue_body ]) + + result = @builder.assign(val[0], val[1], rescue_) + + result +end + +def _reduce_190(val, _values, result) + result = @builder.op_assign(val[0], val[1], val[2]) + + result +end + +def _reduce_191(val, _values, result) + rescue_body = @builder.rescue_body(val[3], + nil, nil, nil, + nil, val[4]) + + rescue_ = @builder.begin_body(val[2], [ rescue_body ]) + + result = @builder.op_assign(val[0], val[1], rescue_) + + result +end + +def _reduce_192(val, _values, result) + result = @builder.op_assign( + @builder.index( + val[0], val[1], val[2], val[3]), + val[4], val[5]) + + result +end + +def _reduce_193(val, _values, result) + result = @builder.op_assign( + @builder.call_method( + val[0], val[1], val[2]), + val[3], val[4]) + + result +end + +def _reduce_194(val, _values, result) + result = @builder.op_assign( + @builder.call_method( + val[0], val[1], val[2]), + val[3], val[4]) + + result +end + +def _reduce_195(val, _values, result) + result = @builder.op_assign( + @builder.call_method( + val[0], val[1], val[2]), + val[3], val[4]) + + result +end + +def _reduce_196(val, _values, result) + diagnostic :error, :dynamic_const, nil, val[2], [ val[3] ] + + result +end + +def _reduce_197(val, _values, result) + diagnostic :error, :dynamic_const, nil, val[1], [ val[2] ] + + result +end + +def _reduce_198(val, _values, result) + result = @builder.op_assign(val[0], val[1], val[2]) + + result +end + +def _reduce_199(val, _values, result) + result = @builder.range_inclusive(val[0], val[1], val[2]) + + result +end + +def _reduce_200(val, _values, result) + result = @builder.range_exclusive(val[0], val[1], val[2]) + + result +end + +def _reduce_201(val, _values, result) + result = @builder.binary_op(val[0], val[1], val[2]) + + result +end + +def _reduce_202(val, _values, result) + result = @builder.binary_op(val[0], val[1], val[2]) + + result +end + +def _reduce_203(val, _values, result) + result = @builder.binary_op(val[0], val[1], val[2]) + + result +end + +def _reduce_204(val, _values, result) + result = @builder.binary_op(val[0], val[1], val[2]) + + result +end + +def _reduce_205(val, _values, result) + result = @builder.binary_op(val[0], val[1], val[2]) + + result +end + +def _reduce_206(val, _values, result) + result = @builder.binary_op(val[0], val[1], val[2]) + + result +end + +def _reduce_207(val, _values, result) + result = @builder.unary_op(val[0], + @builder.binary_op( + @builder.integer(val[1]), + val[2], val[3])) + + result +end + +def _reduce_208(val, _values, result) + result = @builder.unary_op(val[0], + @builder.binary_op( + @builder.float(val[1]), + val[2], val[3])) + + result +end + +def _reduce_209(val, _values, result) + result = @builder.unary_op(val[0], val[1]) + + result +end + +def _reduce_210(val, _values, result) + result = @builder.unary_op(val[0], val[1]) + + result +end + +def _reduce_211(val, _values, result) + result = @builder.binary_op(val[0], val[1], val[2]) + + result +end + +def _reduce_212(val, _values, result) + result = @builder.binary_op(val[0], val[1], val[2]) + + result +end + +def _reduce_213(val, _values, result) + result = @builder.binary_op(val[0], val[1], val[2]) + + result +end + +def _reduce_214(val, _values, result) + result = @builder.binary_op(val[0], val[1], val[2]) + + result +end + +def _reduce_215(val, _values, result) + result = @builder.binary_op(val[0], val[1], val[2]) + + result +end + +def _reduce_216(val, _values, result) + result = @builder.binary_op(val[0], val[1], val[2]) + + result +end + +def _reduce_217(val, _values, result) + result = @builder.binary_op(val[0], val[1], val[2]) + + result +end + +def _reduce_218(val, _values, result) + result = @builder.binary_op(val[0], val[1], val[2]) + + result +end + +def _reduce_219(val, _values, result) + result = @builder.binary_op(val[0], val[1], val[2]) + + result +end + +def _reduce_220(val, _values, result) + result = @builder.binary_op(val[0], val[1], val[2]) + + result +end + +def _reduce_221(val, _values, result) + result = @builder.binary_op(val[0], val[1], val[2]) + + result +end + +def _reduce_222(val, _values, result) + result = @builder.match_op(val[0], val[1], val[2]) + + result +end + +def _reduce_223(val, _values, result) + result = @builder.binary_op(val[0], val[1], val[2]) + + result +end + +def _reduce_224(val, _values, result) + result = @builder.not_op(val[0], nil, val[1], nil) + + result +end + +def _reduce_225(val, _values, result) + result = @builder.unary_op(val[0], val[1]) + + result +end + +def _reduce_226(val, _values, result) + result = @builder.binary_op(val[0], val[1], val[2]) + + result +end + +def _reduce_227(val, _values, result) + result = @builder.binary_op(val[0], val[1], val[2]) + + result +end + +def _reduce_228(val, _values, result) + result = @builder.logical_op(:and, val[0], val[1], val[2]) + + result +end + +def _reduce_229(val, _values, result) + result = @builder.logical_op(:or, val[0], val[1], val[2]) + + result +end + +def _reduce_230(val, _values, result) + result = @builder.keyword_cmd(:defined?, val[0], nil, [ val[2] ], nil) + + result +end + +def _reduce_231(val, _values, result) + result = @builder.ternary(val[0], val[1], + val[2], val[4], val[5]) + + result +end + +# reduce 232 omitted + +# reduce 233 omitted + +# reduce 234 omitted + +# reduce 235 omitted + +def _reduce_236(val, _values, result) + result = val[0] << @builder.associate(nil, val[2], nil) + + result +end + +def _reduce_237(val, _values, result) + result = [ @builder.associate(nil, val[0], nil) ] + + result +end + +def _reduce_238(val, _values, result) + result = val + + result +end + +def _reduce_239(val, _values, result) + result = [ nil, [], nil ] + + result +end + +# reduce 240 omitted + +def _reduce_241(val, _values, result) + result = [] + + result +end + +# reduce 242 omitted + +def _reduce_243(val, _values, result) + result = [ val[0] ] + + result +end + +def _reduce_244(val, _values, result) + result = val[0].concat(val[1]) + + result +end + +def _reduce_245(val, _values, result) + result = [ @builder.associate(nil, val[0], nil) ] + result.concat(val[1]) + + result +end + +def _reduce_246(val, _values, result) + assocs = @builder.associate(nil, val[2], nil) + result = val[0] << assocs + result.concat(val[3]) + + result +end + +def _reduce_247(val, _values, result) + val[2][-1] = @builder.objc_varargs(val[2][-1], val[4]) + assocs = @builder.associate(nil, val[2], nil) + result = val[0] << assocs + result.concat(val[5]) + + result +end + +def _reduce_248(val, _values, result) + result = [ val[0] ] + + result +end + +def _reduce_249(val, _values, result) + result = [ val[0], *val[2].concat(val[3]) ] + + result +end + +def _reduce_250(val, _values, result) + result = [ val[0], val[2] ] + + result +end + +def _reduce_251(val, _values, result) + result = [ @builder.associate(nil, val[0], nil), + *val[1] ] + + result +end + +def _reduce_252(val, _values, result) + result = [ val[0], + @builder.associate(nil, val[2], nil), + *val[3] ] + + result +end + +def _reduce_253(val, _values, result) + result = [ val[0], + *val[2]. + push(@builder.associate(nil, val[4], nil)). + concat(val[5]) ] + + result +end + +def _reduce_254(val, _values, result) + result = [ val[0] ] + + result +end + +def _reduce_255(val, _values, result) + result = @lexer.cmdarg.dup + @lexer.cmdarg.push(true) + + result +end + +def _reduce_256(val, _values, result) + @lexer.cmdarg = val[0] + + result = val[1] + + result +end + +def _reduce_257(val, _values, result) + result = [ nil, val[0], nil ] + + result +end + +def _reduce_258(val, _values, result) + @lexer.state = :expr_endarg + + result +end + +def _reduce_259(val, _values, result) + result = [ val[0], [], val[2] ] + + result +end + +def _reduce_260(val, _values, result) + @lexer.state = :expr_endarg + + result +end + +def _reduce_261(val, _values, result) + result = [ val[0], val[1], val[3] ] + + result +end + +def _reduce_262(val, _values, result) + result = @builder.block_pass(val[0], val[1]) + + result +end + +def _reduce_263(val, _values, result) + result = [ val[1] ] + + result +end + +def _reduce_264(val, _values, result) + result = [] + + result +end + +def _reduce_265(val, _values, result) + result = [] + + result +end + +def _reduce_266(val, _values, result) + result = [ val[0] ] + + result +end + +def _reduce_267(val, _values, result) + result = [ @builder.splat(val[0], val[1]) ] + + result +end + +def _reduce_268(val, _values, result) + result = val[0] << val[2] + + result +end + +def _reduce_269(val, _values, result) + result = val[0] << @builder.splat(val[2], val[3]) + + result +end + +def _reduce_270(val, _values, result) + result = val[0] << val[2] + + result +end + +def _reduce_271(val, _values, result) + result = val[0] << @builder.splat(val[2], val[3]) + + result +end + +def _reduce_272(val, _values, result) + result = [ @builder.splat(val[0], val[1]) ] + + result +end + +# reduce 273 omitted + +# reduce 274 omitted + +# reduce 275 omitted + +# reduce 276 omitted + +# reduce 277 omitted + +# reduce 278 omitted + +# reduce 279 omitted + +# reduce 280 omitted + +def _reduce_281(val, _values, result) + result = @builder.call_method(nil, nil, val[0]) + + result +end + +def _reduce_282(val, _values, result) + result = @builder.begin_keyword(val[0], val[1], val[2]) + + result +end + +def _reduce_283(val, _values, result) + @lexer.state = :expr_endarg + + result +end + +def _reduce_284(val, _values, result) + result = @builder.begin(val[0], val[1], val[3]) + + result +end + +def _reduce_285(val, _values, result) + result = @builder.begin(val[0], val[1], val[2]) + + result +end + +def _reduce_286(val, _values, result) + result = @builder.const_fetch(val[0], val[1], val[2]) + + result +end + +def _reduce_287(val, _values, result) + result = @builder.const_global(val[0], val[1]) + + result +end + +def _reduce_288(val, _values, result) + result = @builder.array(val[0], val[1], val[2]) + + result +end + +def _reduce_289(val, _values, result) + result = @builder.associate(val[0], val[1], val[2]) + + result +end + +def _reduce_290(val, _values, result) + result = @builder.keyword_cmd(:return, val[0]) + + result +end + +def _reduce_291(val, _values, result) + result = @builder.keyword_cmd(:yield, val[0], val[1], val[2], val[3]) + + result +end + +def _reduce_292(val, _values, result) + result = @builder.keyword_cmd(:yield, val[0], val[1], [], val[2]) + + result +end + +def _reduce_293(val, _values, result) + result = @builder.keyword_cmd(:yield, val[0]) + + result +end + +def _reduce_294(val, _values, result) + result = @builder.keyword_cmd(:defined?, val[0], + val[2], [ val[3] ], val[4]) + + result +end + +def _reduce_295(val, _values, result) + result = @builder.not_op(val[0], val[1], val[2], val[3]) + + result +end + +def _reduce_296(val, _values, result) + result = @builder.not_op(val[0], val[1], nil, val[2]) + + result +end + +def _reduce_297(val, _values, result) + method_call = @builder.call_method(nil, nil, val[0]) + + begin_t, args, body, end_t = val[1] + result = @builder.block(method_call, + begin_t, args, body, end_t) + + result +end + +# reduce 298 omitted + +def _reduce_299(val, _values, result) + begin_t, args, body, end_t = val[1] + result = @builder.block(val[0], + begin_t, args, body, end_t) + + result +end + +def _reduce_300(val, _values, result) + result = @context.dup + @context.in_lambda = true + + result +end + +def _reduce_301(val, _values, result) + lambda_call = @builder.call_lambda(val[0]) + + args, (begin_t, body, end_t) = val[2] + result = @builder.block(lambda_call, + begin_t, args, body, end_t) + + @context.in_lambda = val[1].in_lambda + + result +end + +def _reduce_302(val, _values, result) + else_t, else_ = val[4] + result = @builder.condition(val[0], val[1], val[2], + val[3], else_t, + else_, val[5]) + + result +end + +def _reduce_303(val, _values, result) + else_t, else_ = val[4] + result = @builder.condition(val[0], val[1], val[2], + else_, else_t, + val[3], val[5]) + + result +end + +def _reduce_304(val, _values, result) + @lexer.cond.push(true) + + result +end + +def _reduce_305(val, _values, result) + @lexer.cond.pop + + result +end + +def _reduce_306(val, _values, result) + result = @builder.loop(:while, val[0], val[2], val[3], + val[5], val[6]) + + result +end + +def _reduce_307(val, _values, result) + @lexer.cond.push(true) + + result +end + +def _reduce_308(val, _values, result) + @lexer.cond.pop + + result +end + +def _reduce_309(val, _values, result) + result = @builder.loop(:until, val[0], val[2], val[3], + val[5], val[6]) + + result +end + +def _reduce_310(val, _values, result) + *when_bodies, (else_t, else_body) = *val[3] + + result = @builder.case(val[0], val[1], + when_bodies, else_t, else_body, + val[4]) + + result +end + +def _reduce_311(val, _values, result) + *when_bodies, (else_t, else_body) = *val[2] + + result = @builder.case(val[0], nil, + when_bodies, else_t, else_body, + val[3]) + + result +end + +def _reduce_312(val, _values, result) + @lexer.cond.push(true) + + result +end + +def _reduce_313(val, _values, result) + @lexer.cond.pop + + result +end + +def _reduce_314(val, _values, result) + result = @builder.for(val[0], val[1], + val[2], val[4], + val[5], val[7], val[8]) + + result +end + +def _reduce_315(val, _values, result) + local_push + @context.in_class = true + + result +end + +def _reduce_316(val, _values, result) + k_class, ctx = val[0] + if @context.in_def + diagnostic :error, :class_in_def, nil, k_class + end + + lt_t, superclass = val[2] + result = @builder.def_class(k_class, val[1], + lt_t, superclass, + val[4], val[5]) + + local_pop + @context.in_class = ctx.in_class + + result +end + +def _reduce_317(val, _values, result) + @context.in_def = false + @context.in_class = false + local_push + + result +end + +def _reduce_318(val, _values, result) + k_class, ctx = val[0] + result = @builder.def_sclass(k_class, val[1], val[2], + val[5], val[6]) + + local_pop + @context.in_def = ctx.in_def + @context.in_class = ctx.in_class + + result +end + +def _reduce_319(val, _values, result) + @context.in_class = true + local_push + + result +end + +def _reduce_320(val, _values, result) + k_mod, ctx = val[0] + if @context.in_def + diagnostic :error, :module_in_def, nil, k_mod + end + + result = @builder.def_module(k_mod, val[1], + val[3], val[4]) + + local_pop + @context.in_class = ctx.in_class + + result +end + +def _reduce_321(val, _values, result) + local_push + result = context.dup + @context.in_def = true + + result +end + +def _reduce_322(val, _values, result) + result = @builder.def_method(val[0], val[1], + val[3], val[4], val[5]) + + local_pop + @context.in_def = val[2].in_def + + result +end + +def _reduce_323(val, _values, result) + @lexer.state = :expr_fname + + result +end + +def _reduce_324(val, _values, result) + local_push + result = context.dup + @context.in_def = true + + result +end + +def _reduce_325(val, _values, result) + result = @builder.def_singleton(val[0], val[1], val[2], + val[4], val[6], val[7], val[8]) + + local_pop + @context.in_def = val[5].in_def + + result +end + +def _reduce_326(val, _values, result) + result = @builder.keyword_cmd(:break, val[0]) + + result +end + +def _reduce_327(val, _values, result) + result = @builder.keyword_cmd(:next, val[0]) + + result +end + +def _reduce_328(val, _values, result) + result = @builder.keyword_cmd(:redo, val[0]) + + result +end + +def _reduce_329(val, _values, result) + result = @builder.keyword_cmd(:retry, val[0]) + + result +end + +# reduce 330 omitted + +def _reduce_331(val, _values, result) + result = [ val[0], @context.dup ] + + result +end + +def _reduce_332(val, _values, result) + result = [ val[0], @context.dup ] + + result +end + +# reduce 333 omitted + +# reduce 334 omitted + +def _reduce_335(val, _values, result) + result = val[1] + + result +end + +# reduce 336 omitted + +# reduce 337 omitted + +# reduce 338 omitted + +def _reduce_339(val, _values, result) + else_t, else_ = val[4] + result = [ val[0], + @builder.condition(val[0], val[1], val[2], + val[3], else_t, + else_, nil), + ] + + result +end + +# reduce 340 omitted + +def _reduce_341(val, _values, result) + result = val + + result +end + +# reduce 342 omitted + +# reduce 343 omitted + +# reduce 344 omitted + +def _reduce_345(val, _values, result) + result = @builder.multi_lhs(val[0], val[1], val[2]) + + result +end + +def _reduce_346(val, _values, result) + result = [ val[0] ] + + result +end + +def _reduce_347(val, _values, result) + result = val[0] << val[2] + + result +end + +# reduce 348 omitted + +def _reduce_349(val, _values, result) + result = val[0]. + push(@builder.objc_restarg(val[2], val[3])) + + result +end + +def _reduce_350(val, _values, result) + result = val[0]. + push(@builder.objc_restarg(val[2], val[3])). + concat(val[5]) + + result +end + +def _reduce_351(val, _values, result) + result = val[0]. + push(@builder.objc_restarg(val[2])) + + result +end + +def _reduce_352(val, _values, result) + result = val[0]. + push(@builder.objc_restarg(val[2])). + concat(val[4]) + + result +end + +def _reduce_353(val, _values, result) + result = [ @builder.objc_restarg(val[0], val[1]) ] + + result +end + +def _reduce_354(val, _values, result) + result = [ @builder.objc_restarg(val[0], val[1]), + *val[3] ] + + result +end + +def _reduce_355(val, _values, result) + result = [ @builder.objc_restarg(val[0]) ] + + result +end + +def _reduce_356(val, _values, result) + result = [ @builder.objc_restarg(val[0]), + *val[2] ] + + result +end + +def _reduce_357(val, _values, result) + result = val[0]. + concat(val[2]). + concat(val[4]). + concat(val[5]) + + result +end + +def _reduce_358(val, _values, result) + result = val[0]. + concat(val[2]). + concat(val[4]). + concat(val[6]). + concat(val[7]) + + result +end + +def _reduce_359(val, _values, result) + result = val[0]. + concat(val[2]). + concat(val[3]) + + result +end + +def _reduce_360(val, _values, result) + result = val[0]. + concat(val[2]). + concat(val[4]). + concat(val[5]) + + result +end + +def _reduce_361(val, _values, result) + result = val[0]. + concat(val[2]). + concat(val[3]) + + result +end + +# reduce 362 omitted + +def _reduce_363(val, _values, result) + result = val[0]. + concat(val[2]). + concat(val[4]). + concat(val[5]) + + result +end + +def _reduce_364(val, _values, result) + if val[1].empty? && val[0].size == 1 + result = [@builder.procarg0(val[0][0])] + else + result = val[0].concat(val[1]) + end + + result +end + +def _reduce_365(val, _values, result) + result = val[0]. + concat(val[2]). + concat(val[3]) + + result +end + +def _reduce_366(val, _values, result) + result = val[0]. + concat(val[2]). + concat(val[4]). + concat(val[5]) + + result +end + +def _reduce_367(val, _values, result) + result = val[0]. + concat(val[1]) + + result +end + +def _reduce_368(val, _values, result) + result = val[0]. + concat(val[2]). + concat(val[3]) + + result +end + +def _reduce_369(val, _values, result) + result = val[0]. + concat(val[1]) + + result +end + +def _reduce_370(val, _values, result) + result = val[0]. + concat(val[2]). + concat(val[3]) + + result +end + +def _reduce_371(val, _values, result) + result = [ val[0] ] + + result +end + +def _reduce_372(val, _values, result) + result = @builder.args(nil, [], nil) + + result +end + +def _reduce_373(val, _values, result) + @lexer.state = :expr_value + + result +end + +def _reduce_374(val, _values, result) + result = @builder.args(val[0], val[1], val[2]) + + result +end + +def _reduce_375(val, _values, result) + result = @builder.args(val[0], [], val[0]) + + result +end + +def _reduce_376(val, _values, result) + result = @builder.args(val[0], val[1].concat(val[2]), val[3]) + + result +end + +def _reduce_377(val, _values, result) + result = [] + + result +end + +def _reduce_378(val, _values, result) + result = val[1] + + result +end + +def _reduce_379(val, _values, result) + result = [ val[0] ] + + result +end + +def _reduce_380(val, _values, result) + result = val[0] << val[2] + + result +end + +def _reduce_381(val, _values, result) + @static_env.declare val[0][0] + result = @builder.shadowarg(val[0]) + + result +end + +# reduce 382 omitted + +def _reduce_383(val, _values, result) + @static_env.extend_dynamic + + result +end + +def _reduce_384(val, _values, result) + result = [ val[1], val[2] ] + + @static_env.unextend + + result +end + +def _reduce_385(val, _values, result) + result = @builder.args(val[0], val[1].concat(val[2]), val[3]) + + result +end + +def _reduce_386(val, _values, result) + result = @builder.args(nil, val[0], nil) + + result +end + +def _reduce_387(val, _values, result) + result = @context.dup + @context.in_lambda = true + + result +end + +def _reduce_388(val, _values, result) + result = [ val[0], val[2], val[3] ] + @context.in_lambda = val[1].in_lambda + + result +end + +def _reduce_389(val, _values, result) + result = @context.dup + @context.in_lambda = true + + result +end + +def _reduce_390(val, _values, result) + result = [ val[0], val[2], val[3] ] + @context.in_lambda = val[1].in_lambda + + result +end + +def _reduce_391(val, _values, result) + @static_env.extend_dynamic + result = @context.dup + @context.in_block = true + + result +end + +def _reduce_392(val, _values, result) + result = [ val[0], val[2], val[3], val[4] ] + + @static_env.unextend + @context.in_block = val[1].in_block + + result +end + +def _reduce_393(val, _values, result) + begin_t, block_args, body, end_t = val[1] + result = @builder.block(val[0], + begin_t, block_args, body, end_t) + + result +end + +def _reduce_394(val, _values, result) + lparen_t, args, rparen_t = val[3] + result = @builder.call_method(val[0], val[1], val[2], + lparen_t, args, rparen_t) + + result +end + +def _reduce_395(val, _values, result) + lparen_t, args, rparen_t = val[3] + result = @builder.call_method(val[0], val[1], val[2], + lparen_t, args, rparen_t) + + result +end + +def _reduce_396(val, _values, result) + lparen_t, args, rparen_t = val[1] + result = @builder.call_method(nil, nil, val[0], + lparen_t, args, rparen_t) + + result +end + +def _reduce_397(val, _values, result) + lparen_t, args, rparen_t = val[3] + result = @builder.call_method(val[0], val[1], val[2], + lparen_t, args, rparen_t) + + result +end + +def _reduce_398(val, _values, result) + lparen_t, args, rparen_t = val[3] + result = @builder.call_method(val[0], val[1], val[2], + lparen_t, args, rparen_t) + + result +end + +def _reduce_399(val, _values, result) + result = @builder.call_method(val[0], val[1], val[2]) + + result +end + +def _reduce_400(val, _values, result) + lparen_t, args, rparen_t = val[2] + result = @builder.call_method(val[0], val[1], nil, + lparen_t, args, rparen_t) + + result +end + +def _reduce_401(val, _values, result) + lparen_t, args, rparen_t = val[2] + result = @builder.call_method(val[0], val[1], nil, + lparen_t, args, rparen_t) + + result +end + +def _reduce_402(val, _values, result) + lparen_t, args, rparen_t = val[1] + result = @builder.keyword_cmd(:super, val[0], + lparen_t, args, rparen_t) + + result +end + +def _reduce_403(val, _values, result) + result = @builder.keyword_cmd(:zsuper, val[0]) + + result +end + +def _reduce_404(val, _values, result) + result = @builder.index(val[0], val[1], val[2], val[3]) + + result +end + +def _reduce_405(val, _values, result) + @static_env.extend_dynamic + result = @context.dup + @context.in_block = true + + result +end + +def _reduce_406(val, _values, result) + result = [ val[0], val[2], val[3], val[4] ] + + @static_env.unextend + @context.in_block = val[1].in_block + + result +end + +def _reduce_407(val, _values, result) + @static_env.extend_dynamic + result = @context.dup + @context.in_block = true + + result +end + +def _reduce_408(val, _values, result) + result = [ val[0], val[2], val[3], val[4] ] + + @static_env.unextend + @context.in_block = val[1].in_block + + result +end + +def _reduce_409(val, _values, result) + result = [ @builder.when(val[0], val[1], val[2], val[3]), + *val[4] ] + + result +end + +def _reduce_410(val, _values, result) + result = [ val[0] ] + + result +end + +# reduce 411 omitted + +def _reduce_412(val, _values, result) + assoc_t, exc_var = val[2] + + if val[1] + exc_list = @builder.array(nil, val[1], nil) + end + + result = [ @builder.rescue_body(val[0], + exc_list, assoc_t, exc_var, + val[3], val[4]), + *val[5] ] + + result +end + +def _reduce_413(val, _values, result) + result = [] + + result +end + +def _reduce_414(val, _values, result) + result = [ val[0] ] + + result +end + +# reduce 415 omitted + +# reduce 416 omitted + +def _reduce_417(val, _values, result) + result = [ val[0], val[1] ] + + result +end + +# reduce 418 omitted + +def _reduce_419(val, _values, result) + result = [ val[0], val[1] ] + + result +end + +# reduce 420 omitted + +# reduce 421 omitted + +# reduce 422 omitted + +# reduce 423 omitted + +def _reduce_424(val, _values, result) + result = @builder.string_compose(nil, val[0], nil) + + result +end + +def _reduce_425(val, _values, result) + result = [ val[0] ] + + result +end + +def _reduce_426(val, _values, result) + result = val[0] << val[1] + + result +end + +def _reduce_427(val, _values, result) + result = @builder.string_compose(val[0], val[1], val[2]) + + result +end + +def _reduce_428(val, _values, result) + result = @builder.string(val[0]) + + result +end + +def _reduce_429(val, _values, result) + result = @builder.character(val[0]) + + result +end + +def _reduce_430(val, _values, result) + result = @builder.xstring_compose(val[0], val[1], val[2]) + + result +end + +def _reduce_431(val, _values, result) + opts = @builder.regexp_options(val[3]) + result = @builder.regexp_compose(val[0], val[1], val[2], opts) + + result +end + +def _reduce_432(val, _values, result) + result = @builder.words_compose(val[0], val[1], val[2]) + + result +end + +def _reduce_433(val, _values, result) + result = [] + + result +end + +def _reduce_434(val, _values, result) + result = val[0] << @builder.word(val[1]) + + result +end + +def _reduce_435(val, _values, result) + result = [ val[0] ] + + result +end + +def _reduce_436(val, _values, result) + result = val[0] << val[1] + + result +end + +def _reduce_437(val, _values, result) + result = @builder.words_compose(val[0], val[1], val[2]) + + result +end + +def _reduce_438(val, _values, result) + result = [] + + result +end + +def _reduce_439(val, _values, result) + result = val[0] << @builder.string_internal(val[1]) + + result +end + +def _reduce_440(val, _values, result) + result = [] + + result +end + +def _reduce_441(val, _values, result) + result = val[0] << val[1] + + result +end + +def _reduce_442(val, _values, result) + result = [] + + result +end + +def _reduce_443(val, _values, result) + result = val[0] << val[1] + + result +end + +def _reduce_444(val, _values, result) + result = [] + + result +end + +def _reduce_445(val, _values, result) + result = val[0] << val[1] + + result +end + +def _reduce_446(val, _values, result) + result = @builder.string_internal(val[0]) + + result +end + +def _reduce_447(val, _values, result) + result = val[1] + + result +end + +def _reduce_448(val, _values, result) + @lexer.cond.push(false) + @lexer.cmdarg.push(false) + + result +end + +def _reduce_449(val, _values, result) + @lexer.cond.lexpop + @lexer.cmdarg.lexpop + + result = @builder.begin(val[0], val[2], val[3]) + + result +end + +def _reduce_450(val, _values, result) + result = @builder.gvar(val[0]) + + result +end + +def _reduce_451(val, _values, result) + result = @builder.ivar(val[0]) + + result +end + +def _reduce_452(val, _values, result) + result = @builder.cvar(val[0]) + + result +end + +# reduce 453 omitted + +def _reduce_454(val, _values, result) + result = @builder.symbol(val[0]) + + result +end + +def _reduce_455(val, _values, result) + result = @builder.symbol_compose(val[0], val[1], val[2]) + + result +end + +def _reduce_456(val, _values, result) + result = @builder.integer(val[0]) + + result +end + +def _reduce_457(val, _values, result) + result = @builder.float(val[0]) + + result +end + +def _reduce_458(val, _values, result) + num = @builder.integer(val[1]) + if @builder.respond_to? :negate + # AST builder interface compatibility + result = @builder.negate(val[0], num) + else + result = @builder.unary_num(val[0], num) + end + + result +end + +def _reduce_459(val, _values, result) + num = @builder.float(val[1]) + if @builder.respond_to? :negate + # AST builder interface compatibility + result = @builder.negate(val[0], num) + else + result = @builder.unary_num(val[0], num) + end + + result +end + +def _reduce_460(val, _values, result) + result = @builder.ident(val[0]) + + result +end + +def _reduce_461(val, _values, result) + result = @builder.ivar(val[0]) + + result +end + +def _reduce_462(val, _values, result) + result = @builder.gvar(val[0]) + + result +end + +def _reduce_463(val, _values, result) + result = @builder.const(val[0]) + + result +end + +def _reduce_464(val, _values, result) + result = @builder.cvar(val[0]) + + result +end + +def _reduce_465(val, _values, result) + result = @builder.nil(val[0]) + + result +end + +def _reduce_466(val, _values, result) + result = @builder.self(val[0]) + + result +end + +def _reduce_467(val, _values, result) + result = @builder.true(val[0]) + + result +end + +def _reduce_468(val, _values, result) + result = @builder.false(val[0]) + + result +end + +def _reduce_469(val, _values, result) + result = @builder.__FILE__(val[0]) + + result +end + +def _reduce_470(val, _values, result) + result = @builder.__LINE__(val[0]) + + result +end + +def _reduce_471(val, _values, result) + result = @builder.__ENCODING__(val[0]) + + result +end + +def _reduce_472(val, _values, result) + result = @builder.accessible(val[0]) + + result +end + +def _reduce_473(val, _values, result) + result = @builder.assignable(val[0]) + + result +end + +def _reduce_474(val, _values, result) + result = @builder.nth_ref(val[0]) + + result +end + +def _reduce_475(val, _values, result) + result = @builder.back_ref(val[0]) + + result +end + +def _reduce_476(val, _values, result) + result = nil + + result +end + +def _reduce_477(val, _values, result) + result = [ val[0], val[1] ] + + result +end + +def _reduce_478(val, _values, result) + yyerrok + result = nil + + result +end + +def _reduce_479(val, _values, result) + result = @builder.args(val[0], val[1], val[2]) + + @lexer.state = :expr_value + + result +end + +def _reduce_480(val, _values, result) + result = @builder.args(nil, val[0], nil) + + result +end + +def _reduce_481(val, _values, result) + result = val[0]. + concat(val[2]). + concat(val[4]). + concat(val[5]) + + result +end + +def _reduce_482(val, _values, result) + result = val[0]. + concat(val[2]). + concat(val[4]). + concat(val[6]). + concat(val[7]) + + result +end + +def _reduce_483(val, _values, result) + result = val[0]. + concat(val[2]). + concat(val[3]) + + result +end + +def _reduce_484(val, _values, result) + result = val[0]. + concat(val[2]). + concat(val[4]). + concat(val[5]) + + result +end + +def _reduce_485(val, _values, result) + result = val[0]. + concat(val[2]). + concat(val[3]) + + result +end + +def _reduce_486(val, _values, result) + result = val[0]. + concat(val[2]). + concat(val[4]). + concat(val[5]) + + result +end + +def _reduce_487(val, _values, result) + result = val[0]. + concat(val[1]) + + result +end + +def _reduce_488(val, _values, result) + result = val[0]. + concat(val[2]). + concat(val[3]) + + result +end + +def _reduce_489(val, _values, result) + result = val[0]. + concat(val[2]). + concat(val[4]). + concat(val[5]) + + result +end + +def _reduce_490(val, _values, result) + result = val[0]. + concat(val[1]) + + result +end + +def _reduce_491(val, _values, result) + result = val[0]. + concat(val[2]). + concat(val[3]) + + result +end + +def _reduce_492(val, _values, result) + result = val[0]. + concat(val[1]) + + result +end + +def _reduce_493(val, _values, result) + result = val[0]. + concat(val[2]). + concat(val[3]) + + result +end + +def _reduce_494(val, _values, result) + result = [ val[0] ] + + result +end + +def _reduce_495(val, _values, result) + result = [] + + result +end + +def _reduce_496(val, _values, result) + diagnostic :error, :argument_const, nil, val[0] + + result +end + +def _reduce_497(val, _values, result) + diagnostic :error, :argument_ivar, nil, val[0] + + result +end + +def _reduce_498(val, _values, result) + diagnostic :error, :argument_gvar, nil, val[0] + + result +end + +def _reduce_499(val, _values, result) + diagnostic :error, :argument_cvar, nil, val[0] + + result +end + +# reduce 500 omitted + +def _reduce_501(val, _values, result) + @static_env.declare val[0][0] + + result = @builder.arg(val[0]) + + result +end + +def _reduce_502(val, _values, result) + @static_env.declare val[2][0] + + result = @builder.objc_kwarg(val[0], val[1], val[2]) + + result +end + +def _reduce_503(val, _values, result) + @static_env.declare val[1][0] + + result = @builder.objc_kwarg(val[0], nil, val[1]) + + result +end + +# reduce 504 omitted + +def _reduce_505(val, _values, result) + result = @builder.multi_lhs(val[0], val[1], val[2]) + + result +end + +def _reduce_506(val, _values, result) + result = [ val[0] ] + + result +end + +def _reduce_507(val, _values, result) + result = val[0] << val[2] + + result +end + +def _reduce_508(val, _values, result) + @static_env.declare val[0][0] + + result = @builder.optarg(val[0], val[1], val[2]) + + result +end + +def _reduce_509(val, _values, result) + @static_env.declare val[0][0] + + result = @builder.optarg(val[0], val[1], val[2]) + + result +end + +def _reduce_510(val, _values, result) + result = [ val[0] ] + + result +end + +def _reduce_511(val, _values, result) + result = val[0] << val[2] + + result +end + +def _reduce_512(val, _values, result) + result = [ val[0] ] + + result +end + +def _reduce_513(val, _values, result) + result = val[0] << val[2] + + result +end + +# reduce 514 omitted + +# reduce 515 omitted + +def _reduce_516(val, _values, result) + @static_env.declare val[1][0] + + result = [ @builder.restarg(val[0], val[1]) ] + + result +end + +def _reduce_517(val, _values, result) + result = [ @builder.restarg(val[0]) ] + + result +end + +# reduce 518 omitted + +# reduce 519 omitted + +def _reduce_520(val, _values, result) + @static_env.declare val[1][0] + + result = @builder.blockarg(val[0], val[1]) + + result +end + +def _reduce_521(val, _values, result) + result = [ val[1] ] + + result +end + +def _reduce_522(val, _values, result) + result = [] + + result +end + +# reduce 523 omitted + +def _reduce_524(val, _values, result) + result = val[1] + + result +end + +def _reduce_525(val, _values, result) + result = [] + + result +end + +# reduce 526 omitted + +def _reduce_527(val, _values, result) + result = [ val[0] ] + + result +end + +def _reduce_528(val, _values, result) + result = val[0] << val[2] + + result +end + +def _reduce_529(val, _values, result) + result = @builder.pair(val[0], val[1], val[2]) + + result +end + +def _reduce_530(val, _values, result) + result = @builder.pair_keyword(val[0], val[1]) + + result +end + +# reduce 531 omitted + +# reduce 532 omitted + +# reduce 533 omitted + +# reduce 534 omitted + +# reduce 535 omitted + +# reduce 536 omitted + +# reduce 537 omitted + +# reduce 538 omitted + +# reduce 539 omitted + +# reduce 540 omitted + +# reduce 541 omitted + +# reduce 542 omitted + +# reduce 543 omitted + +# reduce 544 omitted + +# reduce 545 omitted + +# reduce 546 omitted + +def _reduce_547(val, _values, result) + result = val[1] + + result +end + +def _reduce_548(val, _values, result) + result = val[1] + + result +end + +# reduce 549 omitted + +# reduce 550 omitted + +# reduce 551 omitted + +def _reduce_552(val, _values, result) + yyerrok + + result +end + +# reduce 553 omitted + +# reduce 554 omitted + +# reduce 555 omitted + +def _reduce_556(val, _values, result) + result = nil + + result +end + +def _reduce_none(val, _values, result) + val[0] +end + + end # class MacRuby + end # module Parser diff --git a/vendor/bundle/ruby/3.1.0/gems/parser-3.1.2.0/lib/parser/max_numparam_stack.rb b/vendor/bundle/ruby/3.1.0/gems/parser-3.1.2.0/lib/parser/max_numparam_stack.rb new file mode 100644 index 000000000..9a741c72a --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/parser-3.1.2.0/lib/parser/max_numparam_stack.rb @@ -0,0 +1,56 @@ +# frozen_string_literal: true + +module Parser + + # Holds p->max_numparam from parse.y + # + # @api private + class MaxNumparamStack + attr_reader :stack + + ORDINARY_PARAMS = -1 + + def initialize + @stack = [] + end + + def empty? + @stack.size == 0 + end + + def has_ordinary_params! + set(ORDINARY_PARAMS) + end + + def has_ordinary_params? + top == ORDINARY_PARAMS + end + + def has_numparams? + top && top > 0 + end + + def register(numparam) + set( [top, numparam].max ) + end + + def top + @stack.last[:value] + end + + def push(static:) + @stack.push(value: 0, static: static) + end + + def pop + @stack.pop[:value] + end + + private + + def set(value) + @stack.last[:value] = value + end + end + +end diff --git a/vendor/bundle/ruby/3.1.0/gems/parser-3.1.2.0/lib/parser/messages.rb b/vendor/bundle/ruby/3.1.0/gems/parser-3.1.2.0/lib/parser/messages.rb new file mode 100644 index 000000000..7d59d8a3b --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/parser-3.1.2.0/lib/parser/messages.rb @@ -0,0 +1,118 @@ +# frozen_string_literal: true + +module Parser + ## + # Diagnostic messages (errors, warnings and notices) that can be generated. + # + # @see Diagnostic + # + # @api public + # + MESSAGES = { + # Lexer errors + :unicode_point_too_large => 'invalid Unicode codepoint (too large)', + :invalid_escape => 'invalid escape character syntax', + :incomplete_escape => 'incomplete character syntax', + :invalid_hex_escape => 'invalid hex escape', + :invalid_unicode_escape => 'invalid Unicode escape', + :unterminated_unicode => 'unterminated Unicode escape', + :escape_eof => 'escape sequence meets end of file', + :string_eof => 'unterminated string meets end of file', + :regexp_options => 'unknown regexp options: %{options}', + :cvar_name => "`%{name}' is not allowed as a class variable name", + :ivar_name => "`%{name}' is not allowed as an instance variable name", + :trailing_in_number => "trailing `%{character}' in number", + :empty_numeric => 'numeric literal without digits', + :invalid_octal => 'invalid octal digit', + :no_dot_digit_literal => 'no . floating literal anymore; put 0 before dot', + :bare_backslash => 'bare backslash only allowed before newline', + :unexpected => "unexpected `%{character}'", + :embedded_document => 'embedded document meets end of file (and they embark on a romantic journey)', + :heredoc_id_has_newline => 'here document identifier across newlines, never match', + :heredoc_id_ends_with_nl => 'here document identifier ends with a newline', + :unterminated_heredoc_id => 'unterminated heredoc id', + + # Lexer warnings + :invalid_escape_use => 'invalid character syntax; use ?%{escape}', + :ambiguous_literal => 'ambiguous first argument; put parentheses or a space even after the operator', + :ambiguous_regexp => "ambiguity between regexp and two divisions: wrap regexp in parentheses or add a space after `/' operator", + :ambiguous_prefix => "`%{prefix}' interpreted as argument prefix", + :triple_dot_at_eol => '... at EOL, should be parenthesized', + + # Parser errors + :nth_ref_alias => 'cannot define an alias for a back-reference variable', + :begin_in_method => 'BEGIN in method', + :backref_assignment => 'cannot assign to a back-reference variable', + :invalid_assignment => 'cannot assign to a keyword', + :module_name_const => 'class or module name must be a constant literal', + :unexpected_token => 'unexpected token %{token}', + :argument_const => 'formal argument cannot be a constant', + :argument_ivar => 'formal argument cannot be an instance variable', + :argument_gvar => 'formal argument cannot be a global variable', + :argument_cvar => 'formal argument cannot be a class variable', + :duplicate_argument => 'duplicate argument name', + :empty_symbol => 'empty symbol literal', + :odd_hash => 'odd number of entries for a hash', + :singleton_literal => 'cannot define a singleton method for a literal', + :dynamic_const => 'dynamic constant assignment', + :const_reassignment => 'constant re-assignment', + :module_in_def => 'module definition in method body', + :class_in_def => 'class definition in method body', + :unexpected_percent_str => '%{type}: unknown type of percent-literal', + :block_and_blockarg => 'both block argument and literal block are passed', + :masgn_as_condition => 'multiple assignment in conditional context', + :block_given_to_yield => 'block given to yield', + :invalid_regexp => '%{message}', + :invalid_return => 'Invalid return in class/module body', + :csend_in_lhs_of_masgn => '&. inside multiple assignment destination', + :cant_assign_to_numparam => 'cannot assign to numbered parameter %{name}', + :reserved_for_numparam => '%{name} is reserved for numbered parameter', + :ordinary_param_defined => 'ordinary parameter is defined', + :numparam_used_in_outer_scope => 'numbered parameter is already used in an outer scope', + :circular_argument_reference => 'circular argument reference %{var_name}', + :pm_interp_in_var_name => 'symbol literal with interpolation is not allowed', + :lvar_name => "`%{name}' is not allowed as a local variable name", + :undefined_lvar => "no such local variable: `%{name}'", + :duplicate_variable_name => 'duplicate variable name %{name}', + :duplicate_pattern_key => 'duplicate hash pattern key %{name}', + :endless_setter => 'setter method cannot be defined in an endless method definition', + :invalid_id_to_get => 'identifier %{identifier} is not valid to get', + :forward_arg_after_restarg => '... after rest argument', + :no_anonymous_blockarg => 'no anonymous block parameter', + + # Parser warnings + :useless_else => 'else without rescue is useless', + :duplicate_hash_key => 'key is duplicated and overwritten', + + # Parser errors that are not Ruby errors + :invalid_encoding => 'literal contains escape sequences incompatible with UTF-8', + + # Rewriter diagnostics + :invalid_action => 'cannot %{action}', + :clobbered => 'clobbered by: %{action}', + + # Rewriter diagnostics + :different_replacements => 'different replacements: %{replacement} vs %{other_replacement}', + :swallowed_insertions => 'this replacement:', + :swallowed_insertions_conflict => 'swallows some inner rewriting actions:', + :crossing_deletions => 'the deletion of:', + :crossing_deletions_conflict => 'is crossing:', + :crossing_insertions => 'the rewriting action on:', + :crossing_insertions_conflict => 'is crossing that on:', + }.freeze + + # @api private + module Messages + # Formats the message, returns a raw template if there's nothing to interpolate + # + # Code like `format("", {})` gives a warning, and so this method tries interpolating + # only if `arguments` hash is not empty. + # + # @api private + def self.compile(reason, arguments) + template = MESSAGES[reason] + return template if Hash === arguments && arguments.empty? + format(template, arguments) + end + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/parser-3.1.2.0/lib/parser/meta.rb b/vendor/bundle/ruby/3.1.0/gems/parser-3.1.2.0/lib/parser/meta.rb new file mode 100644 index 000000000..b2c18b5bb --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/parser-3.1.2.0/lib/parser/meta.rb @@ -0,0 +1,39 @@ +# frozen_string_literal: true + +module Parser + # Parser metadata + module Meta + + # All node types that parser can produce. Not all parser versions + # will be able to produce every possible node. + NODE_TYPES = + %i( + true false nil int float str dstr + sym dsym xstr regopt regexp array splat + pair kwsplat hash irange erange self + lvar ivar cvar gvar const defined? lvasgn + ivasgn cvasgn gvasgn casgn mlhs masgn + op_asgn and_asgn ensure rescue arg_expr + or_asgn back_ref nth_ref + match_with_lvasgn match_current_line + module class sclass def defs undef alias args + cbase arg optarg restarg blockarg block_pass kwarg kwoptarg + kwrestarg kwnilarg send csend super zsuper yield block + and not or if when case while until while_post + until_post for break next redo return resbody + kwbegin begin retry preexe postexe iflipflop eflipflop + shadowarg complex rational __FILE__ __LINE__ __ENCODING__ + ident lambda indexasgn index procarg0 + restarg_expr blockarg_expr + objc_kwarg objc_restarg objc_varargs + numargs numblock forward_args forwarded_args forward_arg + case_match in_match in_pattern + match_var pin match_alt match_as match_rest + array_pattern match_with_trailing_comma array_pattern_with_tail + hash_pattern const_pattern if_guard unless_guard match_nil_pattern + empty_else find_pattern kwargs + match_pattern_p match_pattern + ).to_set.freeze + + end # Meta +end # Parser diff --git a/vendor/bundle/ruby/3.1.0/gems/parser-3.1.2.0/lib/parser/rewriter.rb b/vendor/bundle/ruby/3.1.0/gems/parser-3.1.2.0/lib/parser/rewriter.rb new file mode 100644 index 000000000..f81ebb18a --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/parser-3.1.2.0/lib/parser/rewriter.rb @@ -0,0 +1,105 @@ +# frozen_string_literal: true + +module Parser + + ## + # {Parser::Rewriter} is deprecated. Use {Parser::TreeRewriter} instead. + # It has a backwards compatible API and uses {Parser::Source::TreeRewriter} + # instead of {Parser::Source::Rewriter}. + # Please check the documentation for {Parser::Source::Rewriter} for details. + # + # @api public + # @deprecated Use {Parser::TreeRewriter} + # + class Rewriter < Parser::AST::Processor + ## + # Rewrites the AST/source buffer and returns a String containing the new + # version. + # + # @param [Parser::Source::Buffer] source_buffer + # @param [Parser::AST::Node] ast + # @return [String] + # + def rewrite(source_buffer, ast) + @source_rewriter = Source::Rewriter.new(source_buffer) + + process(ast) + + @source_rewriter.process + end + + ## + # Returns `true` if the specified node is an assignment node, returns false + # otherwise. + # + # @param [Parser::AST::Node] node + # @return [Boolean] + # + def assignment?(node) + [:lvasgn, :ivasgn, :gvasgn, :cvasgn, :casgn].include?(node.type) + end + + ## + # Removes the source range. + # + # @param [Parser::Source::Range] range + # + def remove(range) + @source_rewriter.remove(range) + end + + ## + # Wraps the given source range with the given values. + # + # @param [Parser::Source::Range] range + # @param [String] content + # + def wrap(range, before, after) + @source_rewriter.wrap(range, before, after) + end + + ## + # Inserts new code before the given source range. + # + # @param [Parser::Source::Range] range + # @param [String] content + # + def insert_before(range, content) + @source_rewriter.insert_before(range, content) + end + + ## + # Inserts new code after the given source range. + # + # @param [Parser::Source::Range] range + # @param [String] content + # + def insert_after(range, content) + @source_rewriter.insert_after(range, content) + end + + ## + # Replaces the code of the source range `range` with `content`. + # + # @param [Parser::Source::Range] range + # @param [String] content + # + def replace(range, content) + @source_rewriter.replace(range, content) + end + + DEPRECATION_WARNING = [ + 'Parser::Rewriter is deprecated.', + 'Please update your code to use Parser::TreeRewriter instead' + ].join("\n").freeze + + extend Deprecation + + def initialize(*) + self.class.warn_of_deprecation + Source::Rewriter.warned_of_deprecation = true + super + end + end + +end diff --git a/vendor/bundle/ruby/3.1.0/gems/parser-3.1.2.0/lib/parser/ruby18.rb b/vendor/bundle/ruby/3.1.0/gems/parser-3.1.2.0/lib/parser/ruby18.rb new file mode 100644 index 000000000..7130db531 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/parser-3.1.2.0/lib/parser/ruby18.rb @@ -0,0 +1,5708 @@ +# -*- encoding:utf-8; warn-indent:false; frozen_string_literal: true -*- +# +# DO NOT MODIFY!!!! +# This file is automatically generated by Racc 1.4.15 +# from Racc grammer file "". +# + +require 'racc/parser.rb' + + +require 'parser' + +module Parser + class Ruby18 < Parser::Base + + + def version + 18 + end + + def default_encoding + Encoding::BINARY + end + + def local_push + @static_env.extend_static + @lexer.cmdarg.push(false) + @lexer.cond.push(false) + end + + def local_pop + @static_env.unextend + @lexer.cmdarg.pop + @lexer.cond.pop + end +##### State transition tables begin ### + +clist = [ +'-277,197,198,197,198,491,-87,-277,-277,-277,513,544,580,-277,-277,-85', +'-277,-61,74,581,533,560,491,491,523,-80,75,-427,-84,504,-428,736,608', +'505,-427,-277,-277,-428,-277,-277,-277,-277,-277,491,491,570,692,-82', +'-83,-81,-86,-429,693,537,-76,559,-69,-84,-429,197,198,293,-74,-277,-277', +'-277,-277,-277,-277,-277,-277,-277,-277,-277,-277,-277,-277,-479,261', +'-277,-277,-277,532,551,525,524,528,-277,538,101,-277,293,-82,623,100', +'-277,540,-277,-84,-277,-277,-277,-277,-277,-277,-277,-482,-277,-79,-277', +'-478,724,512,-482,-482,-482,101,-77,490,-482,-482,100,-482,-277,-277', +'-74,-77,-72,-277,-85,-76,-482,101,101,101,490,490,100,100,100,623,-482', +'-482,-74,-482,-482,-482,-482,-482,-74,-75,-73,-78,397,101,101,490,490', +'623,100,100,260,261,497,-74,498,560,-74,-76,-482,-482,-482,-482,-482', +'-482,-482,-482,-482,-482,-482,-482,-482,-482,261,580,-482,-482,-482', +'-259,548,101,581,622,-482,-431,100,-482,465,523,-87,559,-482,523,-482', +'542,-482,-482,-482,-482,-482,-482,-482,-226,-482,-482,-482,608,256,498', +'-226,-226,-226,-479,256,-226,-226,-226,433,-226,-482,-482,-76,-75,293', +'-482,-83,363,101,-226,622,-80,560,100,-86,256,260,523,-226,-226,-76', +'-226,-226,-226,-226,-226,101,523,622,525,524,100,827,525,524,529,816', +'260,217,675,715,-76,-479,523,-76,770,559,465,-423,-479,197,198,217,-482', +'-479,-423,-419,-226,-479,-272,101,217,560,-419,-226,100,-272,-272,-272', +'256,-226,-272,-272,-272,196,-272,-479,525,524,526,217,661,660,664,663', +'-272,-272,525,524,521,-78,-81,-226,-86,-272,-272,559,-272,-272,-272', +'-272,-272,-482,525,524,534,-226,828,-226,-482,101,-226,-424,829,-478', +'100,101,-79,-482,-424,-87,100,-272,-272,-272,-272,-272,-272,-272,-272', +'-272,-272,-272,-272,-272,-272,-482,-482,-272,-272,-272,-271,101,-272', +'286,287,-272,100,-271,-272,-272,-431,-272,570,-272,570,-272,-271,-272', +'-272,-272,-272,-272,-272,-272,-226,-272,-475,-272,682,-476,543,-226', +'-226,-226,736,608,-226,-226,-226,-478,-226,-272,-272,-272,-272,-482', +'-272,253,518,577,-226,293,-482,-72,254,519,-80,-478,-482,-226,-226,-482', +'-226,-226,-226,-226,-226,101,463,464,816,-73,100,-74,-81,-419,-82,-278', +'-423,-482,479,582,-419,478,-278,-423,236,-475,-478,217,-476,-419,-279', +'-278,-423,-478,-426,360,-226,-279,-478,362,361,-426,-478,-226,831,-482', +'-279,-475,256,-226,-476,194,-482,661,660,664,663,-478,195,214,-478,-482', +'-319,216,215,212,213,193,592,-319,657,-226,655,654,653,656,-430,593', +'-319,-482,-479,-479,-479,-430,-479,-226,-69,-226,-479,-479,-226,479', +'-430,-479,481,-479,-479,-479,-479,-479,-479,-479,479,664,663,484,-479', +'-479,-479,-479,-479,-479,-479,217,594,661,660,664,663,832,479,217,-479', +'481,471,-479,-479,-479,-479,-479,-479,-479,-479,-479,-479,-425,-479', +'-479,-479,-479,-479,834,-425,669,670,214,671,95,96,216,215,212,213,214', +'197,198,882,216,215,837,-479,551,570,-479,-479,608,-479,-479,197,198', +'-479,-277,-479,189,-479,293,-479,657,-277,655,654,653,656,-479,-479', +'841,842,-277,351,-479,-479,-479,-479,-479,-479,618,498,626,-479,-479', +'-478,-478,-478,217,-478,848,849,-85,-478,-478,674,677,850,-478,760,-478', +'-478,-478,-478,-478,-478,-478,661,660,664,663,-478,-478,-478,-478,-478', +'-478,-478,760,761,214,438,885,438,216,215,188,-478,293,695,-478,-478', +'-478,-478,-478,-478,-478,-478,-478,-478,-277,-478,-478,-478,-478,-478', +'459,-277,-271,760,706,-279,-479,460,468,-271,-277,433,-279,433,245,469', +'458,709,-271,-478,694,-279,-478,-478,395,-478,-478,710,863,-478,-278', +'-478,717,-478,887,-478,657,-278,655,654,653,656,719,-478,285,723,-278', +'256,-478,-478,-478,-478,-478,-478,256,500,217,-478,-478,67,68,64,501', +'51,217,726,-83,56,57,284,-259,499,60,647,58,59,61,23,24,65,66,661,660', +'664,663,22,28,27,90,89,91,92,730,732,17,608,740,741,742,539,888,41,745', +'570,94,93,84,50,86,85,88,87,95,96,747,82,83,38,39,37,217,221,226,227', +'228,223,225,233,234,229,230,-430,210,211,509,751,231,232,-430,202,755', +'507,206,757,760,52,53,-430,761,54,508,762,214,763,220,40,216,215,212', +'213,224,222,218,18,219,765,236,-260,81,74,76,77,78,79,820,393,570,75', +'80,473,101,235,394,-215,771,100,67,68,64,7,51,395,398,825,56,57,399', +'779,780,60,826,58,59,61,23,24,65,66,570,824,97,570,22,28,27,90,89,91', +'92,256,256,17,103,104,105,106,107,6,41,8,9,94,93,84,50,86,85,88,87,95', +'96,-277,82,83,38,39,37,-278,-277,236,876,877,570,-479,-278,792,793,-277', +'103,104,105,106,107,-278,794,878,36,799,801,30,192,428,52,53,430,191', +'54,433,32,438,807,-60,40,657,396,655,654,653,656,453,18,454,455,190', +'461,81,74,76,77,78,79,265,293,256,75,80,67,68,64,466,51,467,353,217', +'56,57,809,473,474,60,647,58,59,61,248,249,65,66,661,660,664,663,247', +'277,281,90,89,91,92,103,104,105,106,107,293,293,483,486,278,353,502', +'94,93,84,50,86,85,88,87,95,96,503,82,83,,,282,217,221,226,227,228,223', +'225,233,,229,230,,,,,,231,232,,774,,,206,,,52,53,,,54,,,214,,220,,216', +'215,212,213,224,222,218,,219,,,,81,74,76,77,78,79,,,,75,80,,67,68,64', +'857,51,,,,56,57,,,,60,,58,59,61,248,249,65,66,,,,,247,277,281,90,89', +'91,92,,,,,,,,539,,278,,,94,93,84,50,86,85,88,87,95,96,,82,83,,,282,217', +'221,226,227,228,223,225,233,234,229,230,,210,211,,,231,232,,774,,,206', +',,52,53,,,54,,,214,,220,,216,215,212,213,224,222,218,,219,,,,81,74,76', +'77,78,79,,,,75,80,,,235,,777,5,67,68,64,7,51,,,,56,57,,,,60,,58,59,61', +'23,24,65,66,,,,,22,28,27,90,89,91,92,,,17,,,,,,6,41,8,9,94,93,84,50', +'86,85,88,87,95,96,,82,83,38,39,37,217,-499,-499,-499,-499,223,225,,', +'-499,-499,,,,,,231,232,,36,,,267,,,52,53,,,54,,32,214,,220,40,216,215', +'212,213,224,222,218,18,219,,,,81,74,76,77,78,79,,,,75,80,5,67,68,64', +'7,51,,,,56,57,,,,60,,58,59,61,23,24,65,66,,,,,22,28,27,90,89,91,92,', +',17,,,,,,6,41,8,9,94,93,84,50,86,85,88,87,95,96,,82,83,38,39,37,217', +'-499,-499,-499,-499,223,225,,,-499,-499,,,,,,231,232,,36,,,30,,,52,53', +',,54,,32,214,,220,40,216,215,212,213,224,222,218,18,219,,,,81,74,76', +'77,78,79,,,,75,80,5,67,68,64,7,51,,,,56,57,,,,60,,58,59,61,23,24,65', +'66,,,,,22,28,27,90,89,91,92,,,17,,,,,,6,41,8,9,94,93,84,50,86,85,88', +'87,95,96,,82,83,38,39,37,217,-499,-499,-499,-499,223,225,,,-499,-499', +',,,,,231,232,,36,,,30,,,52,53,,,54,,32,214,,220,40,216,215,212,213,224', +'222,218,18,219,,,,81,74,76,77,78,79,,,,75,80,5,67,68,64,7,51,,,,56,57', +',,,60,,58,59,61,23,24,65,66,,,,,22,28,27,90,89,91,92,,,17,,,,,,6,41', +'8,9,94,93,84,50,86,85,88,87,95,96,,82,83,38,39,37,217,221,226,227,228', +'223,225,233,234,229,230,,-499,-499,,,231,232,,36,,,30,,,52,53,,,54,', +'32,214,,220,40,216,215,212,213,224,222,218,18,219,,,,81,74,76,77,78', +'79,,,,75,80,5,67,68,64,7,51,,,,56,57,,,,60,,58,59,61,23,24,65,66,,,', +',22,28,27,90,89,91,92,,,17,,,,,,6,41,8,9,94,93,84,50,86,85,88,87,95', +'96,,82,83,38,39,37,217,-499,-499,-499,-499,223,225,,,-499,-499,,,,,', +'231,232,,36,,,30,,,52,53,,,54,,32,214,,220,40,216,215,212,213,224,222', +'218,18,219,,,,81,74,76,77,78,79,,,,75,80,5,67,68,64,7,51,,,,56,57,,', +',60,,58,59,61,23,24,65,66,,,,,22,28,27,90,89,91,92,,,17,,,,,,6,41,8', +'9,94,93,84,50,86,85,88,87,95,96,,82,83,38,39,37,217,,,,,,,,,,,,,,,,231', +'232,,36,,,30,,,52,53,,,54,,32,214,,220,40,216,215,212,213,,,218,18,219', +',,,81,74,76,77,78,79,,,,75,80,5,67,68,64,7,51,,,,56,57,,,,60,,58,59', +'61,23,24,65,66,,,,,22,28,27,90,89,91,92,,,17,,,,,,6,41,8,9,94,93,84', +'50,86,85,88,87,95,96,,82,83,38,39,37,217,-499,-499,-499,-499,223,225', +',,-499,-499,,,,,,231,232,,36,,,30,,,52,53,,,54,,32,214,,220,40,216,215', +'212,213,224,222,218,18,219,,,,81,74,76,77,78,79,,,,75,80,5,67,68,64', +'7,51,,,,56,57,,,,60,,58,59,61,23,24,65,66,,,,,22,28,27,90,89,91,92,', +',17,,,,,,6,41,8,9,94,93,84,50,86,85,88,87,95,96,,82,83,38,39,37,217', +'221,226,227,228,223,225,233,234,229,230,,-499,-499,,,231,232,,36,,,30', +',,52,53,,,54,,32,214,,220,40,216,215,212,213,224,222,218,18,219,,,,81', +'74,76,77,78,79,,,,75,80,5,67,68,64,7,51,,,,56,57,,,,60,,58,59,61,23', +'24,65,66,,,,,22,28,27,90,89,91,92,,,17,,,,,,6,41,8,9,94,93,84,50,86', +'85,88,87,95,96,,82,83,38,39,37,217,,,,,,,,,,,,,,,,231,232,,36,,,30,', +',52,53,,,54,,32,214,,220,40,216,215,212,213,,,218,18,219,,,,81,74,76', +'77,78,79,,,,75,80,5,67,68,64,7,51,,,,56,57,,,,60,,58,59,61,23,24,65', +'66,,,,,22,28,27,90,89,91,92,,,17,,,,,,6,41,8,9,94,93,84,50,86,85,88', +'87,95,96,,82,83,38,39,37,217,221,226,227,228,223,225,,,229,230,,,,,', +'231,232,,36,,,30,,,52,53,,,54,,32,214,,220,40,216,215,212,213,224,222', +'218,18,219,,,,81,74,76,77,78,79,,,,75,80,5,67,68,64,7,51,,,,56,57,,', +',60,,58,59,61,23,24,65,66,,,,,22,28,27,90,89,91,92,,,17,,,,,,6,41,8', +'9,94,93,84,50,86,85,88,87,95,96,,82,83,38,39,37,217,,,,,,,,,,,,,,,,231', +'232,,36,,,30,,,52,53,,,54,,32,214,,220,40,216,215,212,213,,,218,18,219', +',,,81,74,76,77,78,79,,,,75,80,5,67,68,64,7,51,,,,56,57,,,,60,,58,59', +'61,23,24,65,66,,,,,22,28,27,90,89,91,92,,,17,,,,,,6,41,8,9,94,93,84', +'50,86,85,88,87,95,96,,82,83,38,39,37,217,-499,-499,-499,-499,223,225', +',,-499,-499,,,,,,231,232,,36,,,30,,,52,53,,,54,,32,214,,220,40,216,215', +'212,213,224,222,218,18,219,,,,81,74,76,77,78,79,,,,75,80,5,67,68,64', +'7,51,,,,56,57,,,,60,,58,59,61,23,24,65,66,,,,,22,28,27,90,89,91,92,', +',17,,,,,,6,41,8,9,94,93,84,50,86,85,88,87,95,96,,82,83,38,39,37,217', +',,,,,,,,,,,,,,,231,232,,36,,,30,,,52,53,,,54,,32,214,,220,40,216,215', +'212,213,,,218,18,219,,,,81,74,76,77,78,79,,,,75,80,5,67,68,64,7,51,', +',,56,57,,,,60,,58,59,61,23,24,65,66,,,,,22,28,27,90,89,91,92,,,17,,', +',,,6,41,8,9,94,93,84,50,86,85,88,87,95,96,,82,83,38,39,37,217,,,,,,', +',,,,,,,,,231,232,,36,,,267,,,52,53,,,54,,32,214,,220,40,216,215,212', +'213,,,,18,,,,,81,74,76,77,78,79,,,,75,80,5,67,68,64,7,51,,,,56,57,,', +',60,,58,59,61,23,24,65,66,,,,,22,28,27,90,89,91,92,,,17,,,,,,6,41,8', +'9,94,93,84,50,86,85,88,87,95,96,,82,83,38,39,37,217,,,,,,,,,,,,,,,,231', +'232,,36,,,267,,,52,53,,,54,,32,214,,220,40,216,215,212,213,,,,18,,,', +',81,74,76,77,78,79,,,,75,80,5,67,68,64,7,51,,,,56,57,,,,60,,58,59,61', +'23,24,65,66,,,,,22,28,27,90,89,91,92,,,17,,,,,,6,41,8,9,94,93,84,50', +'86,85,88,87,95,96,,82,83,38,39,37,217,,,,,,,,,,,,,,,,231,232,,36,,,30', +',,52,53,,,54,,32,214,,,40,216,215,212,213,,,,18,,,,,81,74,76,77,78,79', +',,,75,80,5,67,68,64,7,51,,,,56,57,,,,60,,58,59,61,23,24,65,66,,,,,22', +'28,27,90,89,91,92,,,17,,,,,,6,41,8,9,94,93,84,50,86,85,88,87,95,96,', +'82,83,38,39,37,,,,,,,,,,,,,,,,,,,,36,,,30,,,52,53,,,54,,32,,,,40,,,', +',,,,18,,,,,81,74,76,77,78,79,,,,75,80,5,67,68,64,7,51,,,,56,57,,,,60', +',58,59,61,23,24,65,66,,,,,22,28,27,90,89,91,92,,,17,,,,,,6,41,8,9,94', +'93,84,50,86,85,88,87,95,96,,82,83,38,39,37,,,,,,,,,,,,,,,,,,,,36,,,30', +',,52,53,,,54,,32,,,,40,,,,,,,,18,,,,,81,74,76,77,78,79,,,,75,80,5,67', +'68,64,7,51,,,,56,57,,,,60,,58,59,61,23,24,65,66,,,,,22,28,27,90,89,91', +'92,,,17,,,,,,6,41,8,9,94,93,84,50,86,85,88,87,95,96,,82,83,38,39,37', +',,,,,,,,,,,,,,,,,,,36,,,30,,,52,53,,,54,,32,,,,40,,,,,,,,18,,,,,81,74', +'76,77,78,79,,,,75,80,5,67,68,64,7,51,,,,56,57,,,,60,,58,59,61,23,24', +'65,66,,,,,22,28,27,90,89,91,92,,,17,,,,,,6,41,8,9,94,93,84,50,86,85', +'88,87,95,96,,82,83,38,39,37,,,,,,,,,,,,,,,,,,,,36,,,30,,,52,53,,,54', +',32,,,,40,,,,,,,,18,,,,,81,74,76,77,78,79,,,,75,80,5,67,68,64,7,51,', +',,56,57,,,,60,,58,59,61,23,24,65,66,,,,,22,28,27,90,89,91,92,,,17,,', +',,,6,41,8,9,94,93,84,50,86,85,88,87,95,96,,82,83,38,39,37,,,,,,,,,,', +',,,,,,,,,36,,,30,,,52,53,,,54,,32,,,,40,,,,,,,,18,,,,,81,74,76,77,78', +'79,,,,75,80,5,67,68,64,7,51,,,,56,57,,,,60,,58,59,61,23,24,65,66,,,', +',22,28,27,90,89,91,92,,,17,,,,,,6,41,8,9,94,93,84,50,86,85,88,87,95', +'96,,82,83,38,39,37,,,,,,,,,,,,,,,,,,,,36,,,30,,,52,53,,,54,,32,,,,40', +',,,,,,,18,,,,,81,74,76,77,78,79,,,,75,80,5,67,68,64,7,51,,,,56,57,,', +',60,,58,59,61,23,24,65,66,,,,,22,28,27,90,89,91,92,,,17,,,,,,6,41,8', +'9,94,93,84,50,86,85,88,87,95,96,,82,83,38,39,37,,,,,,,,,,,,,,,,,,,,36', +',,30,,,52,53,,,54,,32,,,,40,,,,,,,,18,,,,,81,74,76,77,78,79,,,,75,80', +'5,67,68,64,7,51,,,,56,57,,,,60,,58,59,61,23,24,65,66,,,,,22,28,27,90', +'89,91,92,,,17,,,,,,6,41,8,9,94,93,84,50,86,85,88,87,95,96,,82,83,38', +'39,37,,,,,,,,,,,,,,,,,,,,36,,,30,,,52,53,,,54,,32,,,,40,,,,,,,,18,,', +',,81,74,76,77,78,79,,,,75,80,5,67,68,64,7,51,,,,56,57,,,,60,,58,59,61', +'23,24,65,66,,,,,22,28,27,90,89,91,92,,,17,,,,,,6,41,8,9,94,93,84,50', +'86,85,88,87,95,96,,82,83,38,39,37,,,,,,,,,,,,,,,,,,,,36,,,30,,,52,53', +',,54,,32,,,,40,,,,,,,,18,,,,,81,74,76,77,78,79,,,,75,80,5,67,68,64,7', +'51,,,,56,57,,,,60,,58,59,61,23,24,65,66,,,,,22,28,27,90,89,91,92,,,17', +',,,,,6,41,8,9,94,93,84,50,86,85,88,87,95,96,,82,83,38,39,37,,,,,,,,', +',,,,,,,,,,,36,,,30,,,52,53,,,54,,32,,,,40,,,,,,,,18,,,,,81,74,76,77', +'78,79,,,,75,80,5,67,68,64,7,51,,,,56,57,,,,60,,58,59,61,23,24,65,66', +',,,,22,28,27,90,89,91,92,,,17,,,,,,6,41,8,9,94,93,84,50,86,85,88,87', +'95,96,,82,83,38,39,37,,,,,,,,,,,,,,,,,,,,36,,,30,,,52,53,,,54,,32,,', +',40,,,,,,,,18,,,,,81,74,76,77,78,79,,,,75,80,5,67,68,64,7,51,,,,56,57', +',,,60,,58,59,61,23,24,65,66,,,,,22,28,27,90,89,91,92,,,17,,,,,,6,41', +'8,9,94,93,84,50,86,85,88,87,95,96,,82,83,38,39,37,,,,,,,,,,,,,,,,,,', +',36,,,30,,,52,53,,,54,,32,,,,40,,,,,,,,18,,,,,81,74,76,77,78,79,,,,75', +'80,5,67,68,64,7,51,,,,56,57,,,,60,,58,59,61,23,24,65,66,,,,,22,28,27', +'90,89,91,92,,,17,,,,,,6,41,8,9,94,93,84,50,86,85,88,87,95,96,,82,83', +'38,39,37,,,,,,,,,,,,,,,,,,,,36,,,30,,,52,53,,,54,,32,,,,40,,,,,,,,18', +',,,,81,74,76,77,78,79,,,,75,80,67,68,64,,51,,,,56,57,,,,60,,58,59,61', +'248,249,65,66,,,,,247,277,281,90,89,91,92,,,,,,,,,,41,,,94,93,84,50', +'86,85,88,87,95,96,,82,83,38,39,37,,,,,,,,,,,,,,,,,,,,202,,,206,,,52', +'53,,,54,,,,,,40,,,,,,,,209,,,,,81,74,76,77,78,79,,,,75,80,67,68,64,7', +'51,,,,56,57,,,,60,,58,59,61,23,24,65,66,,,,,22,28,27,90,89,91,92,,,17', +',,,,,6,41,8,9,94,93,84,50,86,85,88,87,95,96,,82,83,38,39,37,,,,,,,,', +',,,,,,,,,,,36,,,30,,,52,53,,,54,,32,,,,40,,,,,,,,18,,,,,81,74,76,77', +'78,79,,,,75,80,155,166,156,179,152,172,162,161,182,183,177,160,159,154', +'180,184,185,164,153,167,171,173,165,158,,,174,181,176,175,168,178,163', +'151,170,169,,,,,,150,157,148,149,146,147,111,113,110,,112,,,,,,,141', +'142,,139,123,124,125,,128,130,,,126,,,,,143,144,131,132,,,,,,,,,,,,', +',136,135,,122,140,138,137,133,134,129,127,120,,121,,,145,81,,,,,,,,', +',80,155,166,156,179,152,172,162,161,182,183,177,160,159,154,180,184', +'185,164,153,167,171,173,165,158,,,174,181,176,175,168,178,163,151,170', +'169,,,,,,150,157,148,149,146,147,111,113,,,112,,,,,,,141,142,,139,123', +'124,125,,128,130,,,126,,,,,143,144,131,132,,,,,,,,,,,,,,136,135,,122', +'140,138,137,133,134,129,127,120,,121,,,145,81,,,67,68,64,,51,,,80,56', +'57,,,,60,,58,59,61,23,24,65,66,,,,,22,28,27,90,89,91,92,,,17,,,,,,,41', +',,94,93,84,50,86,85,88,87,95,96,,82,83,38,39,37,,,,,,,,,,,,,,,,,,,,202', +',,206,,,52,53,,,54,,,,,,40,,,,,,,,18,,,,,81,74,76,77,78,79,,,,75,80', +'67,68,64,,51,,,,56,57,,,,60,,58,59,61,23,24,65,66,,,,,22,28,27,90,89', +'91,92,,,,,,,,,,41,,,94,93,84,50,86,85,88,87,95,96,,82,83,38,39,37,,', +',,,,,,,,,,,,,,,,,202,,,206,,,52,53,,,54,,,,,,40,,,,,,,,209,,,,,81,74', +'76,77,78,79,,,,75,80,67,68,64,,51,,,,56,57,,,,60,,58,59,61,248,249,65', +'66,,,,,247,28,27,90,89,91,92,,,,,,,,,,41,,,94,93,84,50,86,85,88,87,95', +'96,,82,83,38,39,37,,,,,,,,,,,,,,,,,,,,202,,,206,,,52,53,,,54,,243,,245', +',40,,,,,,,,209,,,,,81,74,76,77,78,79,,,,75,80,67,68,64,,51,,,,56,57', +',,,60,,58,59,61,248,249,65,66,,,,,247,28,27,90,89,91,92,,,,,,,,,,41', +',,94,93,84,50,86,85,88,87,95,96,,82,83,38,39,37,,,,,,,,,,,,,,,,,,,,202', +',,206,,,52,53,,,54,,243,,245,,40,,,,,,,,209,,,,,81,74,76,77,78,79,,', +',75,80,67,68,64,,51,,,,56,57,,,,60,,58,59,61,248,249,65,66,,,,,247,28', +'27,90,89,91,92,,,,,,,,,,41,,,94,93,84,50,86,85,88,87,95,96,,82,83,38', +'39,37,,,,,,,,,,,,,,,,,,,,202,,,206,,,52,53,,,54,,243,,245,,40,,,,,,', +',209,,,,,81,74,76,77,78,79,,,,75,80,-249,-249,-249,,-249,,,,-249,-249', +',,,-249,,-249,-249,-249,-249,-249,-249,-249,,,,,-249,-249,-249,-249', +'-249,-249,-249,,,,,,,,,,-249,,,-249,-249,-249,-249,-249,-249,-249,-249', +'-249,-249,,-249,-249,-249,-249,-249,,,,,,,,,,,,,,,,,,,,-249,,,-249,256', +',-249,-249,,,-249,,-249,,-249,,-249,,,,,,,,-249,,,,,-249,-249,-249,-249', +'-249,-249,,,,-249,-249,-249,-249,-249,,-249,,,,-249,-249,,,,-249,,-249', +'-249,-249,-249,-249,-249,-249,,,,,-249,-249,-249,-249,-249,-249,-249', +',,,,,,,,,-249,,,-249,-249,-249,-249,-249,-249,-249,-249,-249,-249,,-249', +'-249,-249,-249,-249,,,,,,,,,,,,,,,,,,,,-249,,,-249,265,,-249,-249,,', +'-249,,-249,,-249,,-249,,,,,,,,-249,,,,,-249,-249,-249,-249,-249,-249', +',,,-249,-249,67,68,64,,51,,,,56,57,,,,60,,58,59,61,248,249,65,66,,,', +',247,277,281,90,89,91,92,,,,,,,,,,278,,,94,93,84,50,86,85,88,87,95,96', +',82,83,,,282,,217,221,226,227,228,223,225,233,234,229,230,,210,211,', +',231,232,275,,,272,,,52,53,,,54,,271,,214,,220,,216,215,212,213,224', +'222,218,,219,,,81,74,76,77,78,79,,,,75,80,67,68,64,235,51,570,,,56,57', +',,,60,,58,59,61,248,249,65,66,,,,,247,277,281,90,89,91,92,,,,,,,,,,278', +',,94,93,84,50,86,85,88,87,95,96,,82,83,,,282,,217,221,226,227,228,223', +'225,233,234,229,230,,210,211,,,231,232,275,,,206,,,52,53,,,54,,,,214', +',220,,216,215,212,213,224,222,218,,219,,,81,74,76,77,78,79,,,,75,80', +'67,68,64,235,51,,,,56,57,,,,60,,58,59,61,248,249,65,66,,,,,247,277,281', +'90,89,91,92,,,,,,,,,,41,,,94,93,84,50,86,85,88,87,95,96,,82,83,38,39', +'37,,,,,,,,,,,,,,,,,,,,202,,,206,,,52,53,,,54,,,,,,40,,,,,,,,209,,,,', +'81,74,76,77,78,79,,,,75,80,67,68,64,,51,,,,56,57,,,,60,,58,59,61,248', +'249,65,66,,,,,247,277,281,90,89,91,92,,,,,,,,,,41,,,94,93,84,50,86,85', +'88,87,95,96,,82,83,38,39,37,,,,,,,,,,,,,,,,,,,,202,,,206,,,52,53,,,54', +',,,,,40,,,,,,,,209,,,,,81,74,76,77,78,79,,,,75,80,67,68,64,,51,,,,56', +'57,,,,60,,58,59,61,248,249,65,66,,,,,247,277,281,90,89,91,92,,,,,,,', +',,41,,,94,93,84,50,86,85,88,87,95,96,,82,83,38,39,37,,,,,,,,,,,,,,,', +',,,,202,,,206,,,52,53,,,54,,,,,,40,,,,,,,,209,,,,,81,74,76,77,78,79', +',,,75,80,67,68,64,,51,,,,56,57,,,,60,,58,59,61,23,24,65,66,,,,,22,28', +'27,90,89,91,92,,,17,,,,,,,41,,,94,93,84,50,86,85,88,87,95,96,,82,83', +'38,39,37,,,,,,,,,,,,,,,,,,,,202,,,206,,,52,53,,,54,,,,,,40,,,,,,,,18', +',,,,81,74,76,77,78,79,,,,75,80,67,68,64,,51,,,,56,57,,,,60,,58,59,61', +'248,249,65,66,,,,,247,28,27,90,89,91,92,,,,,,,,,,41,,,94,93,84,50,86', +'85,88,87,95,96,,82,83,38,39,37,,,,,,,,,,,,,,,,,,,,202,,,206,,,52,53', +',,54,,301,,,,40,,,,,,,,209,,,,,81,74,76,77,78,79,,,,75,80,67,68,64,', +'51,,,,56,57,,,,60,,58,59,61,248,249,65,66,,,,,247,277,281,90,89,91,92', +',,,,,,,,,41,,,94,93,84,50,86,85,88,87,95,96,,82,83,38,39,37,,,,,,,,', +',,,,,,,,,,,202,,,206,,,52,53,,,54,,,,,,40,,,,,,,,209,,,,,81,74,76,77', +'78,79,,,,75,80,67,68,64,,51,,,,56,57,,,,60,,58,59,61,23,24,65,66,,,', +',22,28,27,90,89,91,92,,,17,,,,,,,41,,,94,93,84,50,86,85,88,87,95,96', +',82,83,38,39,37,,,,,,,,,,,,,,,,,,,,202,,,206,,,52,53,,,54,,,,,,40,,', +',,,,,18,,,,,81,74,76,77,78,79,,,,75,80,67,68,64,,51,,,,56,57,,,,60,', +'58,59,61,23,24,65,66,,,,,22,28,27,90,89,91,92,,,17,,,,,,,41,,,94,93', +'84,50,86,85,88,87,95,96,,82,83,38,39,37,,,,,,,,,,,,,,,,,,,,202,,,206', +',,52,53,,,54,,,,,,40,,,,,,,,18,,,,,81,74,76,77,78,79,,,,75,80,67,68', +'64,,51,,,,56,57,,,,60,,58,59,61,248,249,65,66,,,,,247,277,281,90,89', +'91,92,,,,,,,,,,278,,,94,93,84,50,86,85,88,87,95,96,,82,83,,,282,,217', +'221,226,227,228,223,225,233,234,229,230,,210,211,,,231,232,317,,,30', +',,52,53,,,54,,32,,214,,220,,216,215,212,213,224,222,218,,219,,,81,74', +'76,77,78,79,,,,75,80,67,68,64,235,51,,,,56,57,,,,60,,58,59,61,248,249', +'65,66,,,,,247,277,281,90,89,91,92,,,,,,,,,,278,,,94,93,322,50,86,85', +'323,87,95,96,,82,83,,,282,,217,221,226,227,228,223,225,233,234,229,230', +',210,211,,329,231,232,324,,,206,,,52,53,,,54,,,,214,,220,,216,215,212', +'213,224,222,218,,219,,,81,74,76,77,78,79,,,,75,80,67,68,64,235,51,,', +',56,57,,,,60,,58,59,61,248,249,65,66,,,,,247,277,281,90,89,91,92,,,', +',,,,,,278,,,94,93,322,50,86,85,323,87,95,96,,82,83,,,282,,217,221,226', +'227,228,223,225,233,234,229,230,,210,211,,,231,232,324,,,206,,,52,53', +',,54,,,,214,,220,,216,215,212,213,224,222,218,,219,,,81,74,76,77,78', +'79,,,,75,80,-475,-475,-475,235,-475,,,,-475,-475,,,,-475,,-475,-475', +'-475,-475,-475,-475,-475,,-475,,,-475,-475,-475,-475,-475,-475,-475', +',,,,,,,,,-475,,,-475,-475,-475,-475,-475,-475,-475,-475,-475,-475,,-475', +'-475,-475,-475,-475,,,,,,,,,,,,,,,,,,,,-475,,,-475,-475,,-475,-475,', +',-475,,-475,,-475,,-475,,,,,,,,-475,,-475,,,-475,-475,-475,-475,-475', +'-475,,,,-475,-475,-476,-476,-476,,-476,,,,-476,-476,,,,-476,,-476,-476', +'-476,-476,-476,-476,-476,,-476,,,-476,-476,-476,-476,-476,-476,-476', +',,,,,,,,,-476,,,-476,-476,-476,-476,-476,-476,-476,-476,-476,-476,,-476', +'-476,-476,-476,-476,,,,,,,,,,,,,,,,,,,,-476,,,-476,-476,,-476,-476,', +',-476,,-476,,-476,,-476,,,,,,,,-476,,-476,,,-476,-476,-476,-476,-476', +'-476,,,,-476,-476,67,68,64,,51,,,,56,57,,,,60,,58,59,61,23,24,65,66', +',,,,22,28,27,90,89,91,92,,,17,,,,,,,41,,,94,93,84,50,86,85,88,87,95', +'96,,82,83,38,39,37,,,,,,,,,,,,,,,,,,,,202,,,206,,,52,53,,,54,,,,,,40', +',,,,,,,18,,,,,81,74,76,77,78,79,,,,75,80,67,68,64,,51,,,,56,57,,,,60', +',58,59,61,23,24,65,66,,,,,22,28,27,90,89,91,92,,,17,,,,,,,41,,,94,93', +'84,50,86,85,88,87,95,96,,82,83,38,39,37,,,,,,,,,,,,,,,,,,,,202,,,206', +',,52,53,,,54,,,,,,40,,,,,,,,18,,,,,81,74,76,77,78,79,,,,75,80,67,68', +'64,,51,,,,56,57,,,,60,,58,59,61,23,24,65,66,,,,,22,28,27,90,89,91,92', +',,17,,,,,,,41,,,94,93,84,50,86,85,88,87,95,96,,82,83,38,39,37,,,,,,', +',,,,,,,,,,,,,202,,,206,,,52,53,,,54,,,,,,40,,,,,,,,18,,,,,81,74,76,77', +'78,79,,,,75,80,67,68,64,,51,,,,56,57,,,,60,,58,59,61,23,24,65,66,,,', +',22,28,27,90,89,91,92,,,17,,,,,,,41,,,94,93,84,50,86,85,88,87,95,96', +',82,83,38,39,37,,,,,,,,,,,,,,,,,,,,202,,,206,,,52,53,,,54,,,,,,40,,', +',,,,,18,,,,,81,74,76,77,78,79,,,,75,80,67,68,64,7,51,,,,56,57,,,,60', +',58,59,61,23,24,65,66,,,,,22,28,27,90,89,91,92,,,17,,,,,,6,41,8,9,94', +'93,84,50,86,85,88,87,95,96,,82,83,38,39,37,,,,,,,,,,,,,,,,,,,,36,,,30', +',,52,53,,,54,,32,,,,40,,,,,,,,18,,,,,81,74,76,77,78,79,,,,75,80,67,68', +'64,,51,,,,56,57,,,,60,,58,59,61,23,24,65,66,,,,,22,28,27,90,89,91,92', +',,,,,,,,,41,,,94,93,84,50,86,85,88,87,95,96,,82,83,38,39,37,,,,,,,,', +',,,,,,,,,,,202,,,206,,,52,53,,,54,,371,,,,40,,,,,,,,209,,,,,81,74,76', +'77,78,79,,,,75,80,67,68,64,,51,,,,56,57,,,,60,,58,59,61,23,24,65,66', +',,,,22,28,27,90,89,91,92,,,,,,,,,,41,,,94,93,84,50,86,85,88,87,95,96', +',82,83,38,39,37,,,,,,,,,,,,,,,,,,,,202,,,206,,,52,53,,,54,,371,,,,40', +',,,,,,,209,,,,,81,74,76,77,78,79,,,,75,80,67,68,64,,51,,,,56,57,,,,60', +',58,59,61,23,24,65,66,,,,,22,28,27,90,89,91,92,,,,,,,,,,41,,,94,93,84', +'50,86,85,88,87,95,96,,82,83,38,39,37,,,,,,,,,,,,,,,,,,,,202,,,206,,', +'52,53,,,54,,,,,,40,,,,,,,,209,,,,,81,74,76,77,78,79,,,,75,80,67,68,64', +',51,,,,56,57,,,,60,,58,59,61,248,249,65,66,,,,,247,28,27,90,89,91,92', +',,,,,,,,,41,,,94,93,84,50,86,85,88,87,95,96,,82,83,38,39,37,,,,,,,,', +',,,,,,,,,,,202,,,206,,,52,53,,,54,,301,,,,40,,,,,,,,209,,,,,81,74,76', +'77,78,79,,,,75,80,67,68,64,,51,,,,56,57,,,,60,,58,59,61,23,24,65,66', +',,,,22,28,27,90,89,91,92,,,,,,,,,,41,,,94,93,84,50,86,85,88,87,95,96', +',82,83,38,39,37,,,,,,,,,,,,,,,,,,,,202,,,206,,,52,53,,,54,,,,,,40,,', +',,,,,209,,,,,81,74,76,77,78,79,,,,75,80,67,68,64,,51,,,,56,57,,,,60', +',58,59,61,23,24,65,66,,,,,22,28,27,90,89,91,92,,,17,,,,,,,41,,,94,93', +'84,50,86,85,88,87,95,96,,82,83,38,39,37,,,,,,,,,,,,,,,,,,,,202,,,206', +',,52,53,,,54,,,,,,40,,,,,,,,18,,,,,81,74,76,77,78,79,,,,75,80,67,68', +'64,,51,,,,56,57,,,,60,,58,59,61,23,24,65,66,,,,,22,28,27,90,89,91,92', +',,17,,,,,,,41,,,94,93,84,50,86,85,88,87,95,96,,82,83,38,39,37,,,,,,', +',,,,,,,,,,,,,202,,,206,,,52,53,,,54,,,,,,40,,,,,,,,18,,,,,81,74,76,77', +'78,79,,,,75,80,67,68,64,,51,,,,56,57,,,,60,,58,59,61,248,249,65,66,', +',,,247,277,281,90,89,91,92,,,,,,,,,,41,,,94,93,84,50,86,85,88,87,95', +'96,,82,83,38,39,37,,,,,,,,,,,,,,,,,,,,202,,,206,,,52,53,,,54,,,,,,40', +',,,,,,,209,,,,,81,74,76,77,78,79,,,,75,80,67,68,64,,51,,,,56,57,,,,60', +',58,59,61,248,249,65,66,,,,,247,277,281,90,89,91,92,,,,,,,,,,41,,,94', +'93,84,50,86,85,88,87,95,96,,82,83,38,39,37,,,,,,,,,,,,,,,,,,,,202,,', +'206,,,52,53,,,54,,,,,,40,,,,,,,,209,,,,,81,74,76,77,78,79,,,,75,80,67', +'68,64,,51,,,,56,57,,,,60,,58,59,61,248,249,65,66,,,,,247,277,281,90', +'89,91,92,,,,,,,,,,41,,,94,93,84,50,86,85,88,87,95,96,,82,83,38,39,37', +',,,,,,,,,,,,,,,,,,,202,,,206,,,52,53,,,54,,,,,,40,,,,,,,,209,,,,,81', +'74,76,77,78,79,,,,75,80,67,68,64,,51,,,,56,57,,,,60,,58,59,61,248,249', +'65,66,,,,,247,277,281,90,89,91,92,,,,,,,,,,41,,,94,93,84,50,86,85,88', +'87,95,96,,82,83,38,39,37,,,,,,,,,,,,,,,,,,,,202,,,206,,,52,53,,,54,', +',,,,40,,,,,,,,209,,,,,81,74,76,77,78,79,,,,75,80,67,68,64,,51,,,,56', +'57,,,,60,,58,59,61,248,249,65,66,,,,,247,277,281,90,89,91,92,,,,,,,', +',,41,,,94,93,84,50,86,85,88,87,95,96,,82,83,38,39,37,,,,,,,,,,,,,,,', +',,,,202,,,206,,,52,53,,,54,,,,,,40,,,,,,,,209,,,,,81,74,76,77,78,79', +',,,75,80,67,68,64,,51,,,,56,57,,,,60,,58,59,61,248,249,65,66,,,,,247', +'277,281,90,89,91,92,,,,,,,,,,41,,,94,93,84,50,86,85,88,87,95,96,,82', +'83,38,39,37,,,,,,,,,,,,,,,,,,,,202,,,206,,,52,53,,,54,,,,,,40,,,,,,', +',209,,,,,81,74,76,77,78,79,,,,75,80,67,68,64,,51,,,,56,57,,,,60,,58', +'59,61,248,249,65,66,,,,,247,277,281,90,89,91,92,,,,,,,,,,41,,,94,93', +'84,50,86,85,88,87,95,96,,82,83,38,39,37,,,,,,,,,,,,,,,,,,,,202,,,206', +',,52,53,,,54,,,,,,40,,,,,,,,209,,,,,81,74,76,77,78,79,,,,75,80,67,68', +'64,,51,,,,56,57,,,,60,,58,59,61,248,249,65,66,,,,,247,277,281,90,89', +'91,92,,,,,,,,,,41,,,94,93,84,50,86,85,88,87,95,96,,82,83,38,39,37,,', +',,,,,,,,,,,,,,,,,202,,,206,,,52,53,,,54,,,,,,40,,,,,,,,209,,,,,81,74', +'76,77,78,79,,,,75,80,67,68,64,,51,,,,56,57,,,,60,,58,59,61,248,249,65', +'66,,,,,247,277,281,90,89,91,92,,,,,,,,,,41,,,94,93,84,50,86,85,88,87', +'95,96,,82,83,38,39,37,,,,,,,,,,,,,,,,,,,,202,,,206,,,52,53,,,54,,,,', +',40,,,,,,,,209,,,,,81,74,76,77,78,79,,,,75,80,67,68,64,,51,,,,56,57', +',,,60,,58,59,61,248,249,65,66,,,,,247,277,281,90,89,91,92,,,,,,,,,,41', +',,94,93,84,50,86,85,88,87,95,96,,82,83,38,39,37,,,,,,,,,,,,,,,,,,,,202', +',,206,,,52,53,,,54,,,,,,40,,,,,,,,209,,,,,81,74,76,77,78,79,,,,75,80', +'67,68,64,,51,,,,56,57,,,,60,,58,59,61,248,249,65,66,,,,,247,277,281', +'90,89,91,92,,,,,,,,,,41,,,94,93,84,50,86,85,88,87,95,96,,82,83,38,39', +'37,,,,,,,,,,,,,,,,,,,,202,,,206,,,52,53,,,54,,,,,,40,,,,,,,,209,,,,', +'81,74,76,77,78,79,,,,75,80,67,68,64,,51,,,,56,57,,,,60,,58,59,61,248', +'249,65,66,,,,,247,277,281,90,89,91,92,,,,,,,,,,41,,,94,93,84,50,86,85', +'88,87,95,96,,82,83,38,39,37,,,,,,,,,,,,,,,,,,,,202,,,206,,,52,53,,,54', +',,,,,40,,,,,,,,209,,,,,81,74,76,77,78,79,,,,75,80,67,68,64,,51,,,,56', +'57,,,,60,,58,59,61,248,249,65,66,,,,,247,277,281,90,89,91,92,,,,,,,', +',,41,,,94,93,84,50,86,85,88,87,95,96,,82,83,38,39,37,,,,,,,,,,,,,,,', +',,,,202,,,206,,,52,53,,,54,,,,,,40,,,,,,,,209,,,,,81,74,76,77,78,79', +',,,75,80,67,68,64,,51,,,,56,57,,,,60,,58,59,61,248,249,65,66,,,,,247', +'277,281,90,89,91,92,,,,,,,,,,41,,,94,93,84,50,86,85,88,87,95,96,,82', +'83,38,39,37,,,,,,,,,,,,,,,,,,,,202,,,206,,,52,53,,,54,,,,,,40,,,,,,', +',209,,,,,81,74,76,77,78,79,,,,75,80,67,68,64,,51,,,,56,57,,,,60,,58', +'59,61,248,249,65,66,,,,,247,277,281,90,89,91,92,,,,,,,,,,41,,,94,93', +'84,50,86,85,88,87,95,96,,82,83,38,39,37,,,,,,,,,,,,,,,,,,,,202,,,206', +',,52,53,,,54,,,,,,40,,,,,,,,209,,,,,81,74,76,77,78,79,,,,75,80,67,68', +'64,,51,,,,56,57,,,,60,,58,59,61,248,249,65,66,,,,,247,277,281,90,89', +'91,92,,,,,,,,,,41,,,94,93,84,50,86,85,88,87,95,96,,82,83,38,39,37,,', +',,,,,,,,,,,,,,,,,202,,,206,,,52,53,,,54,,,,,,40,,,,,,,,209,,,,,81,74', +'76,77,78,79,,,,75,80,67,68,64,,51,,,,56,57,,,,60,,58,59,61,248,249,65', +'66,,,,,247,277,281,90,89,91,92,,,,,,,,,,41,,,94,93,84,50,86,85,88,87', +'95,96,,82,83,38,39,37,,,,,,,,,,,,,,,,,,,,202,,,206,,,52,53,,,54,,,,', +',40,,,,,,,,209,,,,,81,74,76,77,78,79,,,,75,80,67,68,64,,51,,,,56,57', +',,,60,,58,59,61,248,249,65,66,,,,,247,277,281,90,89,91,92,,,,,,,,,,41', +',,94,93,84,50,86,85,88,87,95,96,,82,83,38,39,37,,,,,,,,,,,,,,,,,,,,202', +',,206,,,52,53,,,54,,,,,,40,,,,,,,,209,,,,,81,74,76,77,78,79,,,,75,80', +'67,68,64,,51,,,,56,57,,,,60,,58,59,61,248,249,65,66,,,,,247,277,281', +'90,89,91,92,,,,,,,,,,41,,,94,93,84,50,86,85,88,87,95,96,,82,83,38,39', +'37,,,,,,,,,,,,,,,,,,,,202,,,206,,,52,53,,,54,,,,,,40,,,,,,,,209,,,,', +'81,74,76,77,78,79,,,,75,80,67,68,64,,51,,,,56,57,,,,60,,58,59,61,248', +'249,65,66,,,,,247,277,281,90,89,91,92,,,,,,,,,,41,,,94,93,84,50,86,85', +'88,87,95,96,,82,83,38,39,37,,,,,,,,,,,,,,,,,,,,202,,,206,,,52,53,,,54', +',,,,,40,,,,,,,,209,,,,,81,74,76,77,78,79,,,,75,80,67,68,64,,51,,,,56', +'57,,,,60,,58,59,61,248,249,65,66,,,,,247,277,281,90,89,91,92,,,,,,,', +',,41,,,94,93,84,50,86,85,88,87,95,96,,82,83,38,39,37,,,,,,,,,,,,,,,', +',,,,202,,,206,,,52,53,,,54,,,,,,40,,,,,,,,209,,,,,81,74,76,77,78,79', +',,,75,80,67,68,64,,51,,,,56,57,,,,60,,58,59,61,248,249,65,66,,,,,247', +'277,281,90,89,91,92,,,,,,,,,,41,,,94,93,84,50,86,85,88,87,95,96,,82', +'83,38,39,37,,,,,,,,,,,,,,,,,,,,202,,,206,,,52,53,,,54,,,,,,40,,,,,,', +',209,,,,,81,74,76,77,78,79,,,,75,80,67,68,64,,51,,,,56,57,,,,60,,58', +'59,61,248,249,65,66,,,,,247,277,281,90,89,91,92,,,,,,,,,,41,,,94,93', +'84,50,86,85,88,87,95,96,,82,83,38,39,37,,,,,,,,,,,,,,,,,,,,202,,,206', +',,52,53,,,54,,,,,,40,,,,,,,,209,,,,,81,74,76,77,78,79,,,,75,80,67,68', +'64,,51,,,,56,57,,,,60,,58,59,61,248,249,65,66,,,,,247,277,281,90,89', +'91,92,,,,,,,,,,41,,,94,93,84,50,86,85,88,87,95,96,,82,83,38,39,37,,', +',,,,,,,,,,,,,,,,,202,,,206,,,52,53,,,54,,,,,,40,,,,,,,,209,,,,,81,74', +'76,77,78,79,,,,75,80,67,68,64,,51,,,,56,57,,,,60,,58,59,61,248,249,65', +'66,,,,,247,277,281,90,89,91,92,,,,,,,,,,41,,,94,93,84,50,86,85,88,87', +'95,96,,82,83,38,39,37,,,,,,,,,,,,,,,,,,,,202,,,206,,,52,53,,,54,,,,', +',40,,,,,,,,209,,,,,81,74,76,77,78,79,,,,75,80,67,68,64,,51,,,,56,57', +',,,60,,58,59,61,248,249,65,66,,,,,247,277,281,90,89,91,92,,,,,,,,,,41', +',,94,93,84,50,86,85,88,87,95,96,,82,83,38,39,37,,,,,,,,,,,,,,,,,,,,202', +',,206,,,52,53,,,54,,,,,,40,,,,,,,,209,,,,,81,74,76,77,78,79,,,,75,80', +'67,68,64,,51,,,,56,57,,,,60,,58,59,61,248,249,65,66,,,,,247,277,281', +'90,89,91,92,,,,,,,,,,41,,,94,93,84,50,86,85,88,87,95,96,,82,83,38,39', +'37,,,,,,,,,,,,,,,,,,,,202,,,206,,,52,53,,,54,,,,,,40,,,,,,,,209,,,,', +'81,74,76,77,78,79,,,,75,80,67,68,64,,51,,,,56,57,,,,60,,58,59,61,248', +'249,65,66,,,,,247,277,281,90,89,91,92,,,,,,,,,,41,,,94,93,84,50,86,85', +'88,87,95,96,,82,83,38,39,37,,,,,,,,,,,,,,,,,,,,202,,,206,,,52,53,,,54', +',,,,,40,,,,,,,,209,,,,,81,74,76,77,78,79,,,,75,80,67,68,64,,51,,,,56', +'57,,,,60,,58,59,61,248,249,65,66,,,,,247,277,281,90,89,91,92,,,,,,,', +',,41,,,94,93,84,50,86,85,88,87,95,96,,82,83,38,39,37,,,,,,,,,,,,,,,', +',,,,202,,,206,,,52,53,,,54,,,,,,40,,,,,,,,209,,,,,81,74,76,77,78,79', +',,,75,80,67,68,64,,51,,,,56,57,,,,60,,58,59,61,248,249,65,66,,,,,247', +'28,27,90,89,91,92,,,,,,,,,,41,,,94,93,84,50,86,85,88,87,95,96,,82,83', +'38,39,37,,,,,,,,,,,,,,,,,,,,202,,,206,,,52,53,,,54,,243,,245,,40,,,', +',,,,209,,,,,81,74,76,77,78,79,,,,75,80,67,68,64,,51,,,,56,57,,,,60,', +'58,59,61,248,249,65,66,,,,,247,28,27,90,89,91,92,,,,,,,,,,41,,,94,93', +'84,50,86,85,88,87,95,96,,82,83,38,39,37,,,,,,,,,,,,,,,,,,,,202,,,206', +',,447,53,,,54,,243,,245,,40,,,,,,,,209,,,,,81,74,76,77,78,79,,,,75,80', +'67,68,64,,51,,,,56,57,,,,60,,58,59,61,248,249,65,66,,,,,247,28,27,90', +'89,91,92,,,,,,,,,,41,,,94,93,84,50,86,85,88,87,95,96,,82,83,38,39,37', +',,,,,,,,,,,,,,,,,,,202,,,206,,451,52,53,,,54,,243,,245,,40,,,,,,,,209', +',,,,81,74,76,77,78,79,,,,75,80,67,68,64,,51,,,,56,57,,,,60,,58,59,61', +'248,249,65,66,,,,,247,277,281,90,89,91,92,,,,,,,,,,278,,,94,93,84,50', +'86,85,88,87,95,96,,82,83,,,282,,217,221,226,227,228,223,225,233,234', +'229,230,,210,211,,,231,232,275,,,206,,,52,53,,,54,,,,214,,220,,216,215', +'212,213,224,222,218,,219,,,81,74,76,77,78,79,,,,75,80,67,68,64,235,51', +',,,56,57,,,,60,,58,59,61,248,249,65,66,,,,,247,277,281,90,89,91,92,', +',,,,,,,,41,,,94,93,84,50,86,85,88,87,95,96,,82,83,38,39,37,,,,,,,,,', +',,,,,,,,,,202,,,206,471,,52,53,,,54,,,,,,40,,,,,,,,209,,,,,81,74,76', +'77,78,79,,,,75,80,67,68,64,,51,,,,56,57,,,,60,,58,59,61,248,249,65,66', +',,,,247,277,281,90,89,91,92,,,,,,,,,,41,,,94,93,84,50,86,85,88,87,95', +'96,,82,83,38,39,37,,,,,,,,,,,,,,,,,,,,202,,,206,,,52,53,,,54,,,,,,40', +',,,,,,,209,,,,,81,74,76,77,78,79,,,,75,80,67,68,64,,51,,,,56,57,,,,60', +',58,59,61,23,24,65,66,,,,,22,28,27,90,89,91,92,,,17,,,,,,,41,,,94,93', +'84,50,86,85,88,87,95,96,,82,83,38,39,37,,,,,,,,,,,,,,,,,,,,202,,,206', +',,52,53,,,54,,,,,,40,,,,,,,,18,,,,,81,74,76,77,78,79,,,,75,80,67,68', +'64,,51,,,,56,57,,,,60,,58,59,61,23,24,65,66,,,,,22,28,27,90,89,91,92', +',,17,,,,,,,41,,,94,93,84,50,86,85,88,87,95,96,,82,83,38,39,37,,,,,,', +',,,,,,,,,,,,,202,,,206,,,52,53,,,54,,,,,,40,,,,,,,,18,,,,,81,74,76,77', +'78,79,,,,75,80,67,68,64,,51,,,,56,57,,,,60,,58,59,61,23,24,65,66,,,', +',22,28,27,90,89,91,92,,,17,,,,,,,41,,,94,93,84,50,86,85,88,87,95,96', +',82,83,38,39,37,,,,,,,,,,,,,,,,,,,,202,,,206,,,52,53,,,54,,,,,,40,,', +',,,,,18,,,,,81,74,76,77,78,79,,,,75,80,67,68,64,,51,,,,56,57,,,,60,', +'58,59,61,23,24,65,66,,,,,22,28,27,90,89,91,92,,,17,,,,,,,41,,,94,93', +'84,50,86,85,88,87,95,96,,82,83,38,39,37,,,,,,,,,,,,,,,,,,,,202,,,206', +',,52,53,,,54,,,,,,40,,,,,,,,18,,,,,81,74,76,77,78,79,,,,75,80,155,166', +'156,179,152,172,162,161,182,183,177,160,159,154,180,184,185,164,153', +'167,171,173,165,158,,,174,181,176,175,168,178,163,151,170,169,,,,,,150', +'157,148,149,146,147,111,113,,,112,,,,,,,141,142,,139,123,124,125,,128', +'130,,,126,,,,,143,144,131,132,,,,,,,,,,,,,,136,135,,122,140,138,137', +'133,134,129,127,120,,121,,,145,81,,,-249,-249,-249,,-249,,,80,-249,-249', +',,,-249,,-249,-249,-249,-249,-249,-249,-249,,,,,-249,-249,-249,-249', +'-249,-249,-249,,,,,,,,,,-249,,,-249,-249,-249,-249,-249,-249,-249,-249', +'-249,-249,,-249,-249,-249,-249,-249,,,,,,,,,,,,,,,,,,,,-249,,,-249,256', +',-249,-249,,,-249,,-249,,-249,,-249,,,,,,,,-249,,,,,-249,-249,-249,-249', +'-249,-249,,,,-249,-249,-480,-480,-480,,-480,,,,-480,-480,,,,-480,,-480', +'-480,-480,-480,-480,-480,-480,,,,,-480,-480,-480,-480,-480,-480,-480', +',,,,,,,,,-480,,,-480,-480,-480,-480,-480,-480,-480,-480,-480,-480,,-480', +'-480,-480,-480,-480,,,,,,,,,,,,,,,,,,,,-480,,,-480,-480,,-480,-480,', +',-480,,-480,,-480,,-480,,,,,,,,-480,,,,,-480,-480,-480,-480,-480,-480', +',,,-480,-480,-481,-481,-481,,-481,,,,-481,-481,,,,-481,,-481,-481,-481', +'-481,-481,-481,-481,,,,,-481,-481,-481,-481,-481,-481,-481,,,,,,,,,', +'-481,,,-481,-481,-481,-481,-481,-481,-481,-481,-481,-481,,-481,-481', +'-481,-481,-481,,,,,,,,,,,,,,,,,,,,-481,,,-481,-481,,-481,-481,,,-481', +',-481,,-481,,-481,,,,,,,,-481,,,,,-481,-481,-481,-481,-481,-481,,,,-481', +'-481,67,68,64,,51,,,,56,57,,,,60,,58,59,61,248,249,65,66,,,,,247,28', +'27,90,89,91,92,,,,,,,,,,41,,,94,93,84,50,86,85,88,87,95,96,,82,83,38', +'39,37,,,,,,,,,,,,,,,,,,,,202,,,206,,,52,53,,,54,,301,,,,40,,,,,,,,209', +',,,,81,74,76,77,78,79,,,,75,80,67,68,64,,51,,,,56,57,,,,60,,58,59,61', +'248,249,65,66,,,,,247,277,281,90,89,91,92,,,,,,,,,,41,,,94,93,84,50', +'86,85,88,87,95,96,,82,83,38,39,37,,,,,,,,,,,,,,,,,,,,202,,,206,,,52', +'53,,,54,,,,,,40,,,,,,,,209,,,,,81,74,76,77,78,79,,,,75,80,67,68,64,', +'51,,,,56,57,,,,60,,58,59,61,248,249,65,66,,,,,247,277,281,90,89,91,92', +',,,,,,,,,41,,,94,93,84,50,86,85,88,87,95,96,,82,83,38,39,37,,,,,,,,', +',,,,,,,,,,,202,,,206,,,52,53,,,54,,,,,,40,,,,,,,,209,,,,,81,74,76,77', +'78,79,,,,75,80,67,68,64,,51,,,,56,57,,,,60,,58,59,61,248,249,65,66,', +',,,247,277,281,90,89,91,92,,,,,,,,,,41,,,94,93,84,50,86,85,88,87,95', +'96,,82,83,38,39,37,,,,,,,,,,,,,,,,,,,,202,,,206,,,52,53,,,54,,,,,,40', +',,,,,,,209,,,,,81,74,76,77,78,79,,,,75,80,67,68,64,,51,,,,56,57,,,,60', +',58,59,61,248,249,65,66,,,,,247,277,281,90,89,91,92,,,,,,,,,,41,,,94', +'93,84,50,86,85,88,87,95,96,,82,83,38,39,37,,,,,,,,,,,,,,,,,,,,202,,', +'206,,,52,53,,,54,,562,,245,,40,,,,,,,,209,,,,,81,74,76,77,78,79,,,,75', +'80,67,68,64,,51,,,,56,57,,,,60,,58,59,61,248,249,65,66,,,,,247,277,281', +'90,89,91,92,,,,,,,,,,41,,,94,93,84,50,86,85,88,87,95,96,,82,83,38,39', +'37,,,,,,,,,,,,,,,,,,,,202,,,206,,,52,53,,,54,,566,,245,,40,,,,,,,,209', +',,,,81,74,76,77,78,79,,,,75,80,67,68,64,,51,,,,56,57,,,,60,,58,59,61', +'248,249,65,66,,,,,247,277,281,90,89,91,92,,,,,,,,,,41,,,94,93,84,50', +'86,85,88,87,95,96,,82,83,38,39,37,,,,,,,,,,,,,,,,,,,,202,,,206,,,52', +'53,,,54,,,,,,40,,,,,,,,209,,,,,81,74,76,77,78,79,,,,75,80,67,68,64,', +'51,,,,56,57,,,,60,,58,59,61,23,24,65,66,,,,,22,28,27,90,89,91,92,,,17', +',,,,,,41,,,94,93,84,50,86,85,88,87,95,96,,82,83,38,39,37,,,,,,,,,,,', +',,,,,,,,202,,,206,,,52,53,,,54,,586,,245,,40,,,,,,,,18,,,,,81,74,76', +'77,78,79,,,,75,80,67,68,64,,51,,,,56,57,,,,60,,58,59,61,248,249,65,66', +',,,,247,28,27,90,89,91,92,,,,,,,,,,41,,,94,93,84,50,86,85,88,87,95,96', +',82,83,38,39,37,,,,,,,,,,,,,,,,,,,,202,,,206,,,52,53,,,54,,301,,,,40', +',,,,,,,209,,,,,81,74,76,77,78,79,,,,75,80,67,68,64,,51,,,,56,57,,,,60', +',58,59,61,248,249,65,66,,,,,247,277,281,90,89,91,92,,,,,,,,,,41,,,94', +'93,84,50,86,85,88,87,95,96,,82,83,38,39,37,,,,,,,,,,,,,,,,,,,,202,,', +'206,,,52,53,,,54,,,,,,40,,,,,,,,209,,,,,81,74,76,77,78,79,,,,75,80,67', +'68,64,,51,,,,56,57,,,,60,,58,59,61,248,249,65,66,,,,,247,277,281,90', +'89,91,92,,,,,,,,,,41,,,94,93,84,50,86,85,88,87,95,96,,82,83,38,39,37', +',,,,,,,,,,,,,,,,,,,202,,,206,,,52,53,,,54,,,,,,40,,,,,,,,209,,,,,81', +'74,76,77,78,79,,,,75,80,67,68,64,,51,,,,56,57,,,,60,,58,59,61,248,249', +'65,66,,,,,247,277,281,90,89,91,92,,,,,,,,,,41,,,94,93,84,50,86,85,88', +'87,95,96,,82,83,38,39,37,,,,,,,,,,,,,,,,,,,,202,,,206,,,52,53,,,54,', +',,,,40,,,,,,,,209,,,,,81,74,76,77,78,79,,,,75,80,67,68,64,,51,,,,56', +'57,,,,60,,58,59,61,23,24,65,66,,,,,22,28,27,90,89,91,92,,,17,,,,,,,41', +',,94,93,84,50,86,85,88,87,95,96,,82,83,38,39,37,,,,,,,,,,,,,,,,,,,,202', +',,206,,,52,53,,,54,,,,,,40,,,,,,,,18,,,,,81,74,76,77,78,79,,,,75,80', +'67,68,64,,51,,,,56,57,,,,60,,58,59,61,248,249,65,66,,,,,247,277,281', +'90,89,91,92,,,,,,,,,,41,,,94,93,84,50,86,85,88,87,95,96,,82,83,38,39', +'37,,,,,,,,,,,,,,,,,,,,202,,,206,,,52,53,,,54,,371,,,,40,,,,,,,,209,', +',,,81,74,76,77,78,79,,,,75,80,67,68,64,,51,,,,56,57,,,,60,,58,59,61', +'248,249,65,66,,,,,247,277,281,90,89,91,92,,,,,,,,,,41,,,94,93,84,50', +'86,85,88,87,95,96,,82,83,38,39,37,,,,,,,,,,,,,,,,,,,,202,,,206,,,52', +'53,,,54,,614,,,,40,,,,,,,,209,,,,,81,74,76,77,78,79,,,,75,80,67,68,64', +',51,,,,56,57,,,,60,,58,59,61,248,249,65,66,,,,,247,277,281,90,89,91', +'92,,,,,,,,,,41,,,94,93,84,50,86,85,88,87,95,96,,82,83,38,39,37,,,,,', +',,,,,,,,,,,,,,202,,,206,,,52,53,,,54,,,,,,40,,,,,,,,209,,,,,81,74,76', +'77,78,79,,,,75,80,67,68,64,,51,,,,56,57,,,,60,,58,59,61,248,249,65,66', +',,,,247,277,281,90,89,91,92,,,,,,,,,,41,,,94,93,84,50,86,85,88,87,95', +'96,,82,83,38,39,37,,,,,,,,,,,,,,,,,,,,202,,,206,,,52,53,,,54,,,,,,40', +',,,,,,,209,,,,,81,74,76,77,78,79,,,,75,80,67,68,64,,51,,,,56,57,,,,60', +',58,59,61,248,249,65,66,,,,,247,277,281,90,89,91,92,,,,,,,,,,41,,,94', +'93,84,50,86,85,88,87,95,96,,82,83,38,39,37,,,,,,,,,,,,,,,,,,,,202,,', +'206,,,52,53,,,54,,630,,,,40,,,,,,,,209,,,,,81,74,76,77,78,79,,,,75,80', +'67,68,64,,51,,,,56,57,,,,60,,58,59,61,248,249,65,66,,,,,247,28,27,90', +'89,91,92,,,,,,,,,,41,,,94,93,84,50,86,85,88,87,95,96,,82,83,38,39,37', +',,,,,,,,,,,,,,,,,,,202,,,206,,,52,53,,,54,,301,,,,40,,,,,,,,209,,,,', +'81,74,76,77,78,79,,,,75,80,67,68,64,,51,,,,56,57,,,,60,,58,59,61,248', +'249,65,66,,,,,247,28,27,90,89,91,92,,,,,,,,,,41,,,94,93,84,50,86,85', +'88,87,95,96,,82,83,38,39,37,,,,,,,,,,,,,,,,,,,,202,,,206,,,52,53,,,54', +',301,,,,40,,,,,,,,209,,,,,81,74,76,77,78,79,,,,75,80,67,68,64,,51,,', +',56,57,,,,60,,58,59,61,23,24,65,66,,,,,22,28,27,90,89,91,92,,,17,,,', +',,,41,,,94,93,84,50,86,85,88,87,95,96,,82,83,38,39,37,,,,,,,,,,,,,,', +',,,,,202,,,206,,,52,53,,,54,,,,,,40,,,,,,,,18,,,,,81,74,76,77,78,79', +',,,75,80,155,166,156,179,152,172,162,161,182,183,177,160,159,154,180', +'184,185,164,153,167,171,173,165,158,,,174,181,176,175,168,178,163,151', +'170,169,,,,,,150,157,148,149,146,147,111,113,,,112,,,,,,,141,142,,139', +'123,124,125,,128,130,,,126,,,,,143,144,131,132,,,,,,,,,,,,,,136,135', +',122,140,138,137,133,134,129,127,120,,121,,,145,81,,,67,68,64,,51,,', +'80,56,57,,,,60,,58,59,61,248,249,65,66,,,,,247,277,281,90,89,91,92,', +',,,,,,,,41,,,94,93,84,50,86,85,88,87,95,96,,82,83,38,39,37,,,,,,,,,', +',,,,,,,,,,202,,,206,,,52,53,,,54,,,,,,40,,,,,,,,209,,,,,81,74,76,77', +'78,79,,,,75,80,67,68,64,,51,,,,56,57,,,,60,,58,59,61,248,249,65,66,', +',,,247,277,281,90,89,91,92,,,,,,,,,,41,,,94,93,84,50,86,85,88,87,95', +'96,,82,83,38,39,37,,,,,,,,,,,,,,,,,,,,202,,,206,,,52,53,,,54,,681,,', +',40,,,,,,,,209,,,,,81,74,76,77,78,79,,,,75,80,67,68,64,,51,,,,56,57', +',,,60,,58,59,61,23,24,65,66,,,,,22,28,27,90,89,91,92,,,,,,,,,,41,,,94', +'93,84,50,86,85,88,87,95,96,,82,83,38,39,37,,,,,,,,,,,,,,,,,,,,202,,', +'206,,,52,53,,,54,,,,,,40,,,,,,,,209,,,,,81,74,76,77,78,79,,,,75,80,67', +'68,64,,51,,,,56,57,,,,60,,58,59,61,23,24,65,66,,,,,22,28,27,90,89,91', +'92,,,,,,,,,,41,,,94,93,84,50,86,85,88,87,95,96,,82,83,38,39,37,,,,,', +',,,,,,,,,,,,,,202,,,206,,,52,53,,,54,,,,,,40,,,,,,,,209,,,,,81,74,76', +'77,78,79,,,,75,80,67,68,64,,51,,,,56,57,,,,60,,58,59,61,23,24,65,66', +',,,,22,28,27,90,89,91,92,,,,,,,,,,41,,,94,93,84,50,86,85,88,87,95,96', +',82,83,38,39,37,,,,,,,,,,,,,,,,,,,,202,,,206,,,52,53,,,54,,,,,,40,,', +',,,,,209,,,,,81,74,76,77,78,79,,,,75,80,67,68,64,,51,,,,56,57,,,,60', +',58,59,61,248,249,65,66,,,,,247,277,281,90,89,91,92,,,,,,,,,,41,,,94', +'93,84,50,86,85,88,87,95,96,,82,83,38,39,37,,,,,,,,,,,,,,,,,,,,202,,', +'206,,,52,53,,,54,,,,,,40,,,,,,,,209,,,,,81,74,76,77,78,79,,,,75,80,67', +'68,64,,51,,,,56,57,,,,60,,58,59,61,248,249,65,66,,,,,247,277,281,90', +'89,91,92,,,,,,,,,,41,,,94,93,84,50,86,85,88,87,95,96,,82,83,38,39,37', +',,,,,,,,,,,,,,,,,,,202,,,206,,,52,53,,,54,,,,,,40,,,,,,,,209,,,,,81', +'74,76,77,78,79,,,,75,80,67,68,64,,51,,,,56,57,,,,60,,58,59,61,248,249', +'65,66,,,,,247,277,281,90,89,91,92,,,,,,,,,,278,,,94,93,84,50,86,85,88', +'87,95,96,,82,83,,,282,,,,,,,,,,,,,,,,,,,,275,,,272,,,52,53,,,54,,699', +',700,,,,,,,,,701,,,,,,81,74,76,77,78,79,,,,75,80,67,68,64,,51,,,,56', +'57,,,,60,,58,59,61,248,249,65,66,,,,,247,277,281,90,89,91,92,,,,,,,', +',,41,,,94,93,84,50,86,85,88,87,95,96,,82,83,38,39,37,,,,,,,,,,,,,,,', +',,,,202,,,206,,,52,53,,,54,,,,,,40,,,,,,,,209,,,,,81,74,76,77,78,79', +',,,75,80,67,68,64,,51,,,,56,57,,,,60,,58,59,61,248,249,65,66,,,,,247', +'277,281,90,89,91,92,,,,,,,,,,41,,,94,93,84,50,86,85,88,87,95,96,,82', +'83,38,39,37,,,,,,,,,,,,,,,,,,,,202,,,206,,,52,53,,,54,,,,,,40,,,,,,', +',209,,,,,81,74,76,77,78,79,,,,75,80,67,68,64,,51,,,,56,57,,,,60,,58', +'59,61,248,249,65,66,,,,,247,28,27,90,89,91,92,,,,,,,,,,41,,,94,93,84', +'50,86,85,88,87,95,96,,82,83,38,39,37,,,,,,,,,,,,,,,,,,,,202,,,206,,', +'52,53,,,54,,562,,245,,40,,,,,,,,209,,,,,81,74,76,77,78,79,,,,75,80,67', +'68,64,,51,,,,56,57,,,,60,,58,59,61,248,249,65,66,,,,,247,277,281,90', +'89,91,92,,,,,,,,,,41,,,94,93,84,50,86,85,88,87,95,96,,82,83,38,39,37', +',,,,,,,,,,,,,,,,,,,202,,,206,,,52,53,,,54,,,,,,40,,,,,,,,209,,,,,81', +'74,76,77,78,79,,,,75,80,67,68,64,,51,,,,56,57,,,,60,,58,59,61,248,249', +'65,66,,,,,247,277,281,90,89,91,92,,,,,,,,,,41,,,94,93,84,50,86,85,88', +'87,95,96,,82,83,38,39,37,,,,,,,,,,,,,,,,,,,,202,,,206,,,52,53,,,54,', +',,,,40,,,,,,,,209,,,,,81,74,76,77,78,79,,,,75,80,67,68,64,,51,,,,56', +'57,,,,60,,58,59,61,248,249,65,66,,,,,247,277,281,90,89,91,92,,,,,,,', +',,41,,,94,93,84,50,86,85,88,87,95,96,,82,83,38,39,37,,,,,,,,,,,,,,,', +',,,,202,,,206,,,52,53,,,54,,,,,,40,,,,,,,,209,,,,,81,74,76,77,78,79', +',,,75,80,67,68,64,,51,,,,56,57,,,,60,,58,59,61,23,24,65,66,,,,,22,28', +'27,90,89,91,92,,,17,,,,,,,41,,,94,93,84,50,86,85,88,87,95,96,,82,83', +'38,39,37,,,,,,,,,,,,,,,,,,,,202,,,206,,,52,53,,,54,,,,,,40,,,,,,,,18', +',,,,81,74,76,77,78,79,,,,75,80,67,68,64,,51,,,,56,57,,,,60,,58,59,61', +'248,249,65,66,,,,,247,277,281,90,89,91,92,,,,,,,,,,41,,,94,93,84,50', +'86,85,88,87,95,96,,82,83,38,39,37,,,,,,,,,,,,,,,,,,,,202,,,206,,,52', +'53,,,54,,,,,,40,,,,,,,,209,,,,,81,74,76,77,78,79,,,,75,80,67,68,64,', +'51,,,,56,57,,,,60,,58,59,61,23,24,65,66,,,,,22,28,27,90,89,91,92,,,', +',,,,,,41,,,94,93,84,50,86,85,88,87,95,96,,82,83,38,39,37,,,,,,,,,,,', +',,,,,,,,202,,,206,,,52,53,,,54,,,,,,40,,,,,,,,209,,,,,81,74,76,77,78', +'79,,,,75,80,67,68,64,,51,,,,56,57,,,,60,,58,59,61,248,249,65,66,,,,', +'247,277,281,90,89,91,92,,,,,,,,,,41,,,94,93,84,50,86,85,88,87,95,96', +',82,83,38,39,37,,,,,,,,,,,,,,,,,,,,202,,,206,,,52,53,,,54,,,,,,40,,', +',,,,,209,,,,,81,74,76,77,78,79,,,,75,80,67,68,64,,51,,,,56,57,,,,60', +',58,59,61,248,249,65,66,,,,,247,277,281,90,89,91,92,,,,,,,,,,41,,,94', +'93,84,50,86,85,88,87,95,96,,82,83,38,39,37,,,,,,,,,,,,,,,,,,,,202,,', +'206,,,52,53,,,54,,,,,,40,,,,,,,,209,,,,,81,74,76,77,78,79,,,,75,80,67', +'68,64,,51,,,,56,57,,,,60,,58,59,61,248,249,65,66,,,,,247,277,281,90', +'89,91,92,,,,,,,,,,41,,,94,93,84,50,86,85,88,87,95,96,,82,83,38,39,37', +',,,,,,,,,,,,,,,,,,,202,,,206,,,52,53,,,54,,,,,,40,,,,,,,,209,,,,,81', +'74,76,77,78,79,,,,75,80,67,68,64,,51,,,,56,57,,,,60,,58,59,61,248,249', +'65,66,,,,,247,277,281,90,89,91,92,,,,,,,,,,278,,,94,93,84,50,86,85,88', +'87,95,96,,82,83,,,282,,217,221,226,227,228,223,225,233,234,229,230,', +'210,211,,,231,232,774,,,206,,,52,53,,,54,,,,214,,220,,216,215,212,213', +'224,222,218,,219,,,81,74,76,77,78,79,,,,75,80,67,68,64,235,51,,,,56', +'57,,,,60,,58,59,61,248,249,65,66,,,,,247,277,281,90,89,91,92,,,,,,,', +',,41,,,94,93,84,50,86,85,88,87,95,96,,82,83,38,39,37,,,,,,,,,,,,,,,', +',,,,202,,,206,,,52,53,,,54,,782,,245,,40,,,,,,,,209,,,,,81,74,76,77', +'78,79,,,,75,80,67,68,64,,51,,,,56,57,,,,60,,58,59,61,248,249,65,66,', +',,,247,277,281,90,89,91,92,,,,,,,,,,41,,,94,93,84,50,86,85,88,87,95', +'96,,82,83,38,39,37,,,,,,,,,,,,,,,,,,,,202,,,206,,,52,53,,,54,,788,,245', +',40,,,,,,,,209,,,,,81,74,76,77,78,79,,,,75,80,67,68,64,,51,,,,56,57', +',,,60,,58,59,61,248,249,65,66,,,,,247,277,281,90,89,91,92,,,,,,,,,,41', +',,94,93,84,50,86,85,88,87,95,96,,82,83,38,39,37,,,,,,,,,,,,,,,,,,,,202', +',,206,,,52,53,,,54,,790,,245,,40,,,,,,,,209,,,,,81,74,76,77,78,79,,', +',75,80,67,68,64,,51,,,,56,57,,,,60,,58,59,61,248,249,65,66,,,,,247,277', +'281,90,89,91,92,,,,,,,,,,278,,,94,93,84,50,86,85,88,87,95,96,,82,83', +',,282,,217,221,226,227,228,223,225,233,234,229,230,,210,211,,,231,232', +'774,,,206,,,52,53,,,54,,,,214,,220,,216,215,212,213,224,222,218,,219', +',,81,74,76,77,78,79,,,,75,80,67,68,64,235,51,,,,56,57,,,,60,,58,59,61', +'23,24,65,66,,,,,22,28,27,90,89,91,92,,,17,,,,,,,41,,,94,93,84,50,86', +'85,88,87,95,96,,82,83,38,39,37,,,,,,,,,,,,,,,,,,,,202,,,206,,,52,53', +',,54,,,,,,40,,,,,,,,18,,,,,81,74,76,77,78,79,,,,75,80,67,68,64,,51,', +',,56,57,,,,60,,58,59,61,248,249,65,66,,,,,247,277,281,90,89,91,92,,', +',,,,,,,41,,,94,93,84,50,86,85,88,87,95,96,,82,83,38,39,37,,,,,,,,,,', +',,,,,,,,,202,,,206,,,52,53,,,54,,804,,,,40,,,,,,,,209,,,,,81,74,76,77', +'78,79,,,,75,80,67,68,64,,51,,,,56,57,,,,60,,58,59,61,248,249,65,66,', +',,,247,277,281,90,89,91,92,,,,,,,,,,41,,,94,93,84,50,86,85,88,87,95', +'96,,82,83,38,39,37,,,,,,,,,,,,,,,,,,,,202,,,206,,,52,53,,,54,,,,,,40', +',,,,,,,209,,,,,81,74,76,77,78,79,,,,75,80,67,68,64,,51,,,,56,57,,,,60', +',58,59,61,248,249,65,66,,,,,247,277,281,90,89,91,92,,,,,,,,,,41,,,94', +'93,84,50,86,85,88,87,95,96,,82,83,38,39,37,,,,,,,,,,,,,,,,,,,,202,,', +'206,,,52,53,,,54,,,,,,40,,,,,,,,209,,,,,81,74,76,77,78,79,,,,75,80,67', +'68,64,,51,,,,56,57,,,,60,,58,59,61,248,249,65,66,,,,,247,277,281,90', +'89,91,92,,,,,,,,,,278,,,94,93,84,50,86,85,88,87,95,96,,82,83,,,282,', +',,,,,,,,,,,,,,,,,,275,,,272,,,52,53,,,54,,823,,822,,,,,,,,,,,,,,,81', +'74,76,77,78,79,,,,75,80,67,68,64,,51,,,,56,57,,,,60,,58,59,61,248,249', +'65,66,,,,,247,277,281,90,89,91,92,,,,,,,,,,41,,,94,93,84,50,86,85,88', +'87,95,96,,82,83,38,39,37,,,,,,,,,,,,,,,,,,,,202,,,206,,,52,53,,,54,', +',,,,40,,,,,,,,209,,,,,81,74,76,77,78,79,,,,75,80,67,68,64,,51,,,,56', +'57,,,,60,,58,59,61,248,249,65,66,,,,,247,277,281,90,89,91,92,,,,,,,', +',,41,,,94,93,84,50,86,85,88,87,95,96,,82,83,38,39,37,,,,,,,,,,,,,,,', +',,,,202,,,206,,,52,53,,,54,,,,,,40,,,,,,,,209,,,,,81,74,76,77,78,79', +',,,75,80,67,68,64,,51,,,,56,57,,,,60,,58,59,61,248,249,65,66,,,,,247', +'277,281,90,89,91,92,,,,,,,,,,41,,,94,93,84,50,86,85,88,87,95,96,,82', +'83,38,39,37,,,,,,,,,,,,,,,,,,,,202,,,206,,,52,53,,,54,,,,,,40,,,,,,', +',209,,,,,81,74,76,77,78,79,,,,75,80,67,68,64,,51,,,,56,57,,,,60,,58', +'59,61,248,249,65,66,,,,,247,277,281,90,89,91,92,,,,,,,,,,41,,,94,93', +'84,50,86,85,88,87,95,96,,82,83,38,39,37,,,,,,,,,,,,,,,,,,,,202,,,206', +',,52,53,,,54,,,,,,40,,,,,,,,209,,,,,81,74,76,77,78,79,,,,75,80,67,68', +'64,,51,,,,56,57,,,,60,,58,59,61,248,249,65,66,,,,,247,277,281,90,89', +'91,92,,,,,,,,,,278,,,94,93,84,50,86,85,88,87,95,96,,82,83,,,282,,217', +'221,226,227,228,223,225,233,234,229,230,,210,211,,,231,232,774,,,206', +',,52,53,,,54,,,,214,,220,,216,215,212,213,224,222,218,,219,,,81,74,76', +'77,78,79,,,,75,80,67,68,64,235,51,,,,56,57,,,,60,,58,59,61,248,249,65', +'66,,,,,247,28,27,90,89,91,92,,,,,,,,,,41,,,94,93,84,50,86,85,88,87,95', +'96,,82,83,38,39,37,,,,,,,,,,,,,,,,,,,,202,,,206,,,52,53,,,54,,301,,', +',40,,,,,,,,209,,,,,81,74,76,77,78,79,,,,75,80,67,68,64,,51,,,,56,57', +',,,60,,58,59,61,248,249,65,66,,,,,247,277,281,90,89,91,92,,,,,,,,,,278', +',,94,93,84,50,86,85,88,87,95,96,,82,83,,,282,,217,221,226,227,228,223', +'225,233,234,229,230,,210,211,,,231,232,774,,,206,,,52,53,,,54,,,,214', +',220,,216,215,212,213,224,222,218,,219,,,81,74,76,77,78,79,,,,75,80', +'67,68,64,235,51,,,,56,57,,,,60,,58,59,61,248,249,65,66,,,,,247,277,281', +'90,89,91,92,,,,,,,,,,41,,,94,93,84,50,86,85,88,87,95,96,,82,83,38,39', +'37,,,,,,,,,,,,,,,,,,,,202,,,206,,,52,53,,,54,,866,,245,,40,,,,,,,,209', +',,,,81,74,76,77,78,79,,,,75,80,67,68,64,,51,,,,56,57,,,,60,,58,59,61', +'248,249,65,66,,,,,247,277,281,90,89,91,92,,,,,,,,,,41,,,94,93,84,50', +'86,85,88,87,95,96,,82,83,38,39,37,,,,,,,,,,,,,,,,,,,,202,,,206,,,52', +'53,,,54,,869,,245,,40,,,,,,,,209,,,,,81,74,76,77,78,79,,,,75,80,67,68', +'64,,51,,,,56,57,,,,60,,58,59,61,248,249,65,66,,,,,247,277,281,90,89', +'91,92,,,,,,,,,,278,,,94,93,84,50,86,85,88,87,95,96,,82,83,,,282,,217', +'221,226,227,228,223,225,233,234,229,230,,210,211,,,231,232,774,,,206', +',,52,53,,,54,,,,214,,220,,216,215,212,213,224,222,218,,219,,,81,74,76', +'77,78,79,,,,75,80,67,68,64,235,51,,,,56,57,,,,60,,58,59,61,248,249,65', +'66,,,,,247,277,281,90,89,91,92,,,,,,,,,,41,,,94,93,84,50,86,85,88,87', +'95,96,,82,83,38,39,37,,,,,,,,,,,,,,,,,,,,202,,,206,,,52,53,,,54,,,,', +',40,,,,,,,,209,,,,,81,74,76,77,78,79,,,,75,80,67,68,64,,51,,,,56,57', +',,,60,,58,59,61,248,249,65,66,,,,,247,277,281,90,89,91,92,,,,,,,,,,41', +',,94,93,84,50,86,85,88,87,95,96,,82,83,38,39,37,,,,,,,,,,,,,,,,,,,,202', +',,206,,,52,53,,,54,,,,,,40,,,,,,,,209,,,,,81,74,76,77,78,79,,,,75,80', +'67,68,64,,51,,,,56,57,,,,60,,58,59,61,248,249,65,66,,,,,247,277,281', +'90,89,91,92,,,,,,,,,,278,,,94,93,84,50,86,85,88,87,95,96,,82,83,,,282', +',217,221,226,227,228,223,225,233,234,229,230,,210,211,,,231,232,774', +',,206,,,52,53,,,54,,,,214,,220,,216,215,212,213,224,222,218,,219,,,81', +'74,76,77,78,79,,,,75,80,67,68,64,235,51,,,,56,57,,,,60,,58,59,61,248', +'249,65,66,,,,,247,277,281,90,89,91,92,,,,,,,,,,41,,,94,93,84,50,86,85', +'88,87,95,96,,82,83,38,39,37,,,,,,,,,,,,,,,,,,,,202,,,206,,,52,53,,,54', +',891,,245,,40,,,,,,,,209,,,,,81,74,76,77,78,79,,,,75,80,67,68,64,,51', +',,,56,57,,,,60,,58,59,61,248,249,65,66,,,,,247,277,281,90,89,91,92,', +',,,,,,,,278,,,94,93,84,50,86,85,88,87,95,96,,82,83,,,282,,217,221,226', +'227,228,223,225,233,234,229,230,,210,211,,,231,232,774,,,206,,,52,53', +',,54,,,,214,,220,,216,215,212,213,224,222,218,,219,,,81,74,76,77,78', +'79,,,,75,80,67,68,64,235,51,,,,56,57,,,,60,,58,59,61,248,249,65,66,', +',,,247,277,281,90,89,91,92,,,,,,,,,,41,,,94,93,84,50,86,85,88,87,95', +'96,,82,83,38,39,37,,,,,,,,,,,,,,,,,,,,202,,,206,,,52,53,,,54,,,,,,40', +',,,,,,,209,,,,,81,74,76,77,78,79,,,,75,80,155,166,156,179,152,172,162', +'161,182,183,177,160,159,154,180,184,185,164,153,167,171,173,165,158', +',,174,181,176,338,337,339,336,151,170,169,,,,,,150,157,148,149,334,335', +'332,113,86,85,333,87,,,,,,141,142,,139,123,124,125,,128,130,,,126,,', +',,143,144,131,132,,,,,,343,,,,,,,,136,135,,122,140,138,137,133,134,129', +'127,120,,121,,,145,155,166,156,179,152,172,162,161,182,183,177,160,159', +'154,180,184,185,164,153,167,171,173,165,158,,,174,181,176,175,168,178', +'163,151,170,169,,,,,,150,157,148,149,146,147,111,113,,,112,,,,,,,141', +'142,,139,123,124,125,,128,130,,,126,,,,,143,144,131,132,,,,,,,,,,,,', +',136,135,,122,140,138,137,133,134,129,127,120,,121,,,145,217,221,226', +'227,228,223,225,233,234,229,230,,210,211,,,231,232,,,,-215,,,,,,,,,', +',214,,220,,216,215,212,213,224,222,218,,219,,,,,,,,,,,,,,,,,235,,-215', +'217,221,226,227,228,223,225,233,234,229,230,,210,211,,,231,232,,,,,', +',,,,,,,,,214,,220,,216,215,212,213,224,222,218,,219,,,,,,,,552,381,', +',553,,,,,235,558,141,142,,139,123,124,125,,128,130,,,126,,,,,143,144', +'131,132,,,,,,,,,,,,,,136,135,,122,140,138,137,133,134,129,127,120,,121', +'634,387,145,,635,,,,,,,141,142,,139,123,124,125,,128,130,,,126,,,,,143', +'144,131,132,,,,,,,,,,,,,,136,135,,122,140,138,137,133,134,129,127,120', +',121,637,387,145,,638,,,,,,,141,142,,139,123,124,125,,128,130,,,126', +',,,,143,144,131,132,,,,,,,,,,,,,,136,135,,122,140,138,137,133,134,129', +'127,120,,121,435,381,145,,436,,,,,,,141,142,,139,123,124,125,,128,130', +',,126,,,,,143,144,131,132,,,,,,,,,,,,,,136,135,,122,140,138,137,133', +'134,129,127,120,,121,552,381,145,,553,,,,,,,141,142,,139,123,124,125', +',128,130,,,126,,,,,143,144,131,132,,,,,,,,,,,,,,136,135,,122,140,138', +'137,133,134,129,127,120,,121,554,387,145,,555,,,,,,,141,142,,139,123', +'124,125,,128,130,,,126,,,,,143,144,131,132,,,,,,,,,,,,,,136,135,,122', +'140,138,137,133,134,129,127,120,,121,,,145,217,221,226,227,228,223,225', +'233,234,229,230,,210,211,,,231,232,,,,,,,,,,,,,,,214,,220,,216,215,212', +'213,224,222,218,,219,,,,,,,435,381,,,436,,,,,293,235,141,142,,139,123', +'124,125,,128,130,,,126,,,,,143,144,131,132,,,,,,,,,,,,,,136,135,,122', +'140,138,137,133,134,129,127,120,,121,435,381,145,,436,,,,,,,141,142', +',139,123,124,125,,128,130,,,126,,,,,143,144,131,132,,,,,,,,,,,,,,136', +'135,,122,140,138,137,133,134,129,127,120,,121,378,381,145,,379,,,,,', +',141,142,,139,123,124,125,,128,130,,,126,,,,,143,144,131,132,,,,,,,', +',,,,,,136,135,,122,140,138,137,133,134,129,127,120,,121,859,381,145', +',860,,,,,,,141,142,,139,123,124,125,,128,130,,,126,,,,,143,144,131,132', +',,,,,,,,,,,,,136,135,,122,140,138,137,133,134,129,127,120,,121,599,387', +'145,,600,,,,,,,141,142,,139,123,124,125,,128,130,,,126,,,,,143,144,131', +'132,,,,,,,,,,,,,,136,135,,122,140,138,137,133,134,129,127,120,,121,861', +'387,145,,862,,,,,,,141,142,,139,123,124,125,,128,130,,,126,,,,,143,144', +'131,132,,,,,,,,,,,,,,136,135,,122,140,138,137,133,134,129,127,120,,121', +'596,381,145,,597,,,,,,,141,142,,139,123,124,125,,128,130,,,126,,,,,143', +'144,131,132,,,,,,,,,,,,,,136,135,,122,140,138,137,133,134,129,127,120', +',121,632,381,145,,633,,,,,,,141,142,,139,123,124,125,,128,130,,,126', +',,,,143,144,131,132,,,,,,,,,,,,,,136,135,,122,140,138,137,133,134,129', +'127,120,,121,554,387,145,,555,,,,,,,141,142,,139,123,124,125,,128,130', +',,126,,,,,143,144,131,132,,,,,,,,,,,,,,136,135,,122,140,138,137,133', +'134,129,127,120,,121,435,381,145,,436,,,,,,,141,142,,139,123,124,125', +',128,130,,,126,,,,,143,144,131,132,,,,,,,,,,,,,,136,135,,122,140,138', +'137,133,134,129,127,120,,121,383,387,145,,385,,,,,,,141,142,,139,123', +'124,125,,128,130,,,126,,,,,143,144,131,132,,,,,,,,,,,,,,136,135,,122', +'140,138,137,133,134,129,127,120,,121,435,381,145,,436,,,,,,,141,142', +',139,123,124,125,,128,130,,,126,,,,,143,144,131,132,,,,,,,,,,,,,,136', +'135,,122,140,138,137,133,134,129,127,120,,121,,,145,217,221,226,227', +'228,223,225,233,234,229,230,,210,211,,,231,232,,,,,,,,,,,,,,,214,,220', +',216,215,212,213,224,222,218,,219,,217,221,226,227,228,223,225,233,234', +'229,230,,210,211,293,235,231,232,,,,,,,,,,,,,,,214,,220,,216,215,212', +'213,224,222,218,,219,,,,,,,,,,,,,,,,,235' ] + racc_action_table = arr = ::Array.new(24171, nil) + idx = 0 + clist.each do |str| + str.split(',', -1).each do |i| + arr[idx] = i.to_i unless i.empty? + idx += 1 + end + end + +clist = [ +'385,514,514,520,520,308,318,385,385,385,328,379,442,385,385,635,385', +'593,72,442,349,576,309,629,347,315,72,336,633,324,335,617,617,324,336', +'385,385,335,385,385,385,385,385,800,729,883,552,632,634,745,502,334', +'553,364,379,576,593,379,334,605,605,442,596,385,385,385,385,385,385', +'385,385,385,385,385,385,385,385,635,55,385,385,385,349,385,347,347,347', +'385,365,514,385,520,552,493,514,385,370,385,553,385,385,385,385,385', +'385,385,383,385,318,385,634,605,328,383,383,383,308,635,308,383,383', +'308,383,385,385,596,385,315,385,385,633,383,328,309,629,309,629,328', +'309,629,494,383,383,596,383,383,383,383,383,632,634,745,502,203,800', +'729,800,729,746,800,729,55,279,313,596,313,448,596,597,383,383,383,383', +'383,383,383,383,383,383,383,383,383,383,26,713,383,383,383,373,383,493', +'713,493,383,201,493,383,396,530,203,448,383,348,383,377,383,383,383', +'383,383,383,383,434,383,383,383,805,384,805,434,434,434,860,279,434', +'434,434,584,434,383,383,597,383,713,383,383,186,494,434,494,201,449', +'494,396,26,279,346,434,434,597,434,434,434,434,434,746,345,746,530,530', +'746,774,348,348,348,757,26,404,530,584,597,860,350,597,695,449,285,333', +'860,15,15,405,637,860,333,332,434,860,50,3,406,426,332,434,3,50,50,50', +'434,434,50,50,50,14,50,860,346,346,346,407,757,757,757,757,50,50,345', +'345,345,285,695,434,285,50,50,426,50,50,50,50,50,637,350,350,350,434', +'776,434,637,312,434,337,777,637,312,648,14,637,337,14,648,50,50,50,50', +'50,50,50,50,50,50,50,50,50,50,637,599,50,50,50,775,642,50,37,37,50,642', +'775,50,50,35,50,431,50,880,50,775,50,50,50,50,50,50,50,437,50,322,50', +'542,323,378,437,437,437,872,872,437,437,437,859,437,50,50,50,50,599', +'50,25,341,440,437,441,599,35,25,341,35,599,861,437,437,599,437,437,437', +'437,437,513,282,282,850,542,513,378,542,322,378,505,323,599,299,443', +'322,299,505,323,444,322,859,421,323,322,723,505,323,859,339,110,437', +'723,859,110,110,339,859,437,784,861,723,322,437,437,323,13,861,850,850', +'850,850,861,13,421,859,861,42,421,421,421,421,13,450,42,755,437,755', +'755,755,755,273,452,42,861,555,555,555,273,555,437,453,437,555,555,437', +'305,273,555,305,555,555,555,555,555,555,555,303,760,760,303,555,555', +'555,555,555,555,555,422,457,755,755,755,755,785,300,403,555,300,462', +'555,555,555,555,555,555,555,555,555,555,338,555,555,555,555,555,786', +'338,524,524,422,524,524,524,422,422,422,422,403,296,296,867,403,403', +'789,555,555,894,555,555,472,555,555,307,307,555,638,555,9,555,475,555', +'647,638,647,647,647,647,638,555,802,803,638,97,555,555,555,555,555,555', +'489,495,496,555,555,554,554,554,402,554,808,810,555,554,554,528,533', +'811,554,812,554,554,554,554,554,554,554,647,647,647,647,554,554,554', +'554,554,554,554,815,816,402,545,873,549,402,402,8,554,41,556,554,554', +'554,554,554,554,554,554,554,554,862,554,554,554,554,554,274,862,276', +'874,563,878,862,274,288,276,862,565,878,568,570,288,274,578,276,554', +'554,878,554,554,288,554,554,579,828,554,827,554,585,554,875,554,819', +'827,819,819,819,819,588,554,36,595,827,598,554,554,554,554,554,554,601', +'316,603,554,554,60,60,60,316,60,604,606,554,60,60,34,609,316,60,819', +'60,60,60,60,60,60,60,819,819,819,819,60,60,60,60,60,60,60,610,613,60', +'619,625,627,628,368,876,60,631,835,60,60,60,60,60,60,60,60,60,60,640', +'60,60,60,60,60,368,368,368,368,368,368,368,368,368,368,368,772,368,368', +'326,645,368,368,772,60,649,326,60,650,651,60,60,772,657,60,326,662,368', +'665,368,60,368,368,368,368,368,368,368,60,368,667,20,680,60,60,60,60', +'60,60,766,200,838,60,60,839,60,368,200,368,698,60,99,99,99,99,99,200', +'204,773,99,99,205,702,703,99,773,99,99,99,99,99,99,99,704,773,1,707', +'99,99,99,99,99,99,99,711,712,99,4,4,4,4,4,99,99,99,99,99,99,99,99,99', +'99,99,99,99,99,600,99,99,99,99,99,461,600,714,856,857,718,600,461,720', +'721,600,352,352,352,352,352,461,722,858,99,734,737,99,12,241,99,99,242', +'11,99,246,99,255,748,266,99,516,202,516,516,516,516,268,99,269,270,10', +'275,99,99,99,99,99,99,277,278,281,99,99,823,823,823,286,823,287,99,290', +'823,823,752,294,295,823,516,823,823,823,823,823,823,823,516,516,516', +'516,823,823,823,823,823,823,823,108,108,108,108,108,298,753,302,304', +'823,314,317,823,823,823,823,823,823,823,823,823,823,319,823,823,,,823', +'424,424,424,424,424,424,424,424,,424,424,,,,,,424,424,,823,,,823,,,823', +'823,,,823,,,424,,424,,424,424,424,424,424,424,424,,424,,,,823,823,823', +'823,823,823,,,,823,823,,699,699,699,823,699,,,,699,699,,,,699,,699,699', +'699,699,699,699,699,,,,,699,699,699,699,699,699,699,,,,,,,,557,,699', +',,699,699,699,699,699,699,699,699,699,699,,699,699,,,699,557,557,557', +'557,557,557,557,557,557,557,557,,557,557,,,557,557,,699,,,699,,,699', +'699,,,699,,,557,,557,,557,557,557,557,557,557,557,,557,,,,699,699,699', +'699,699,699,,,,699,699,,,557,,699,30,30,30,30,30,30,,,,30,30,,,,30,', +'30,30,30,30,30,30,30,,,,,30,30,30,30,30,30,30,,,30,,,,,,30,30,30,30', +'30,30,30,30,30,30,30,30,30,30,,30,30,30,30,30,416,416,416,416,416,416', +'416,,,416,416,,,,,,416,416,,30,,,30,,,30,30,,,30,,30,416,,416,30,416', +'416,416,416,416,416,416,30,416,,,,30,30,30,30,30,30,,,,30,30,739,739', +'739,739,739,739,,,,739,739,,,,739,,739,739,739,739,739,739,739,,,,,739', +'739,739,739,739,739,739,,,739,,,,,,739,739,739,739,739,739,739,739,739', +'739,739,739,739,739,,739,739,739,739,739,417,417,417,417,417,417,417', +',,417,417,,,,,,417,417,,739,,,739,,,739,739,,,739,,739,417,,417,739', +'417,417,417,417,417,417,417,739,417,,,,739,739,739,739,739,739,,,,739', +'739,738,738,738,738,738,738,,,,738,738,,,,738,,738,738,738,738,738,738', +'738,,,,,738,738,738,738,738,738,738,,,738,,,,,,738,738,738,738,738,738', +'738,738,738,738,738,738,738,738,,738,738,738,738,738,418,418,418,418', +'418,418,418,,,418,418,,,,,,418,418,,738,,,738,,,738,738,,,738,,738,418', +',418,738,418,418,418,418,418,418,418,738,418,,,,738,738,738,738,738', +'738,,,,738,738,608,608,608,608,608,608,,,,608,608,,,,608,,608,608,608', +'608,608,608,608,,,,,608,608,608,608,608,608,608,,,608,,,,,,608,608,608', +'608,608,608,608,608,608,608,608,608,608,608,,608,608,608,608,608,400', +'400,400,400,400,400,400,400,400,400,400,,400,400,,,400,400,,608,,,608', +',,608,608,,,608,,608,400,,400,608,400,400,400,400,400,400,400,608,400', +',,,608,608,608,608,608,608,,,,608,608,591,591,591,591,591,591,,,,591', +'591,,,,591,,591,591,591,591,591,591,591,,,,,591,591,591,591,591,591', +'591,,,591,,,,,,591,591,591,591,591,591,591,591,591,591,591,591,591,591', +',591,591,591,591,591,419,419,419,419,419,419,419,,,419,419,,,,,,419', +'419,,591,,,591,,,591,591,,,591,,591,419,,419,591,419,419,419,419,419', +'419,419,591,419,,,,591,591,591,591,591,591,,,,591,591,188,188,188,188', +'188,188,,,,188,188,,,,188,,188,188,188,188,188,188,188,,,,,188,188,188', +'188,188,188,188,,,188,,,,,,188,188,188,188,188,188,188,188,188,188,188', +'188,188,188,,188,188,188,188,188,413,,,,,,,,,,,,,,,,413,413,,188,,,188', +',,188,188,,,188,,188,413,,413,188,413,413,413,413,,,413,188,413,,,,188', +'188,188,188,188,188,,,,188,188,189,189,189,189,189,189,,,,189,189,,', +',189,,189,189,189,189,189,189,189,,,,,189,189,189,189,189,189,189,,', +'189,,,,,,189,189,189,189,189,189,189,189,189,189,189,189,189,189,,189', +'189,189,189,189,420,420,420,420,420,420,420,,,420,420,,,,,,420,420,', +'189,,,189,,,189,189,,,189,,189,420,,420,189,420,420,420,420,420,420', +'420,189,420,,,,189,189,189,189,189,189,,,,189,189,590,590,590,590,590', +'590,,,,590,590,,,,590,,590,590,590,590,590,590,590,,,,,590,590,590,590', +'590,590,590,,,590,,,,,,590,590,590,590,590,590,590,590,590,590,590,590', +'590,590,,590,590,590,590,590,401,401,401,401,401,401,401,401,401,401', +'401,,401,401,,,401,401,,590,,,590,,,590,590,,,590,,590,401,,401,590', +'401,401,401,401,401,401,401,590,401,,,,590,590,590,590,590,590,,,,590', +'590,561,561,561,561,561,561,,,,561,561,,,,561,,561,561,561,561,561,561', +'561,,,,,561,561,561,561,561,561,561,,,561,,,,,,561,561,561,561,561,561', +'561,561,561,561,561,561,561,561,,561,561,561,561,561,415,,,,,,,,,,,', +',,,,415,415,,561,,,561,,,561,561,,,561,,561,415,,415,561,415,415,415', +'415,,,415,561,415,,,,561,561,561,561,561,561,,,,561,561,726,726,726', +'726,726,726,,,,726,726,,,,726,,726,726,726,726,726,726,726,,,,,726,726', +'726,726,726,726,726,,,726,,,,,,726,726,726,726,726,726,726,726,726,726', +'726,726,726,726,,726,726,726,726,726,423,423,423,423,423,423,423,,,423', +'423,,,,,,423,423,,726,,,726,,,726,726,,,726,,726,423,,423,726,423,423', +'423,423,423,423,423,726,423,,,,726,726,726,726,726,726,,,,726,726,708', +'708,708,708,708,708,,,,708,708,,,,708,,708,708,708,708,708,708,708,', +',,,708,708,708,708,708,708,708,,,708,,,,,,708,708,708,708,708,708,708', +'708,708,708,708,708,708,708,,708,708,708,708,708,412,,,,,,,,,,,,,,,', +'412,412,,708,,,708,,,708,708,,,708,,708,412,,412,708,412,412,412,412', +',,412,708,412,,,,708,708,708,708,708,708,,,,708,708,0,0,0,0,0,0,,,,0', +'0,,,,0,,0,0,0,0,0,0,0,,,,,0,0,0,0,0,0,0,,,0,,,,,,0,0,0,0,0,0,0,0,0,0', +'0,0,0,0,,0,0,0,0,0,411,411,411,411,411,411,411,,,411,411,,,,,,411,411', +',0,,,0,,,0,0,,,0,,0,411,,411,0,411,411,411,411,411,411,411,0,411,,,', +'0,0,0,0,0,0,,,,0,0,854,854,854,854,854,854,,,,854,854,,,,854,,854,854', +'854,854,854,854,854,,,,,854,854,854,854,854,854,854,,,854,,,,,,854,854', +'854,854,854,854,854,854,854,854,854,854,854,854,,854,854,854,854,854', +'414,,,,,,,,,,,,,,,,414,414,,854,,,854,,,854,854,,,854,,854,414,,414', +'854,414,414,414,414,,,414,854,414,,,,854,854,854,854,854,854,,,,854', +'854,272,272,272,272,272,272,,,,272,272,,,,272,,272,272,272,272,272,272', +'272,,,,,272,272,272,272,272,272,272,,,272,,,,,,272,272,272,272,272,272', +'272,272,272,272,272,272,272,272,,272,272,272,272,272,408,,,,,,,,,,,', +',,,,408,408,,272,,,272,,,272,272,,,272,,272,408,,408,272,408,408,408', +'408,,,,272,,,,,272,272,272,272,272,272,,,,272,272,267,267,267,267,267', +'267,,,,267,267,,,,267,,267,267,267,267,267,267,267,,,,,267,267,267,267', +'267,267,267,,,267,,,,,,267,267,267,267,267,267,267,267,267,267,267,267', +'267,267,,267,267,267,267,267,409,,,,,,,,,,,,,,,,409,409,,267,,,267,', +',267,267,,,267,,267,409,,409,267,409,409,409,409,,,,267,,,,,267,267', +'267,267,267,267,,,,267,267,206,206,206,206,206,206,,,,206,206,,,,206', +',206,206,206,206,206,206,206,,,,,206,206,206,206,206,206,206,,,206,', +',,,,206,206,206,206,206,206,206,206,206,206,206,206,206,206,,206,206', +'206,206,206,410,,,,,,,,,,,,,,,,410,410,,206,,,206,,,206,206,,,206,,206', +'410,,,206,410,410,410,410,,,,206,,,,,206,206,206,206,206,206,,,,206', +'206,51,51,51,51,51,51,,,,51,51,,,,51,,51,51,51,51,51,51,51,,,,,51,51', +'51,51,51,51,51,,,51,,,,,,51,51,51,51,51,51,51,51,51,51,51,51,51,51,', +'51,51,51,51,51,,,,,,,,,,,,,,,,,,,,51,,,51,,,51,51,,,51,,51,,,,51,,,', +',,,,51,,,,,51,51,51,51,51,51,,,,51,51,847,847,847,847,847,847,,,,847', +'847,,,,847,,847,847,847,847,847,847,847,,,,,847,847,847,847,847,847', +'847,,,847,,,,,,847,847,847,847,847,847,847,847,847,847,847,847,847,847', +',847,847,847,847,847,,,,,,,,,,,,,,,,,,,,847,,,847,,,847,847,,,847,,847', +',,,847,,,,,,,,847,,,,,847,847,847,847,847,847,,,,847,847,673,673,673', +'673,673,673,,,,673,673,,,,673,,673,673,673,673,673,673,673,,,,,673,673', +'673,673,673,673,673,,,673,,,,,,673,673,673,673,673,673,673,673,673,673', +'673,673,673,673,,673,673,673,673,673,,,,,,,,,,,,,,,,,,,,673,,,673,,', +'673,673,,,673,,673,,,,673,,,,,,,,673,,,,,673,673,673,673,673,673,,,', +'673,673,515,515,515,515,515,515,,,,515,515,,,,515,,515,515,515,515,515', +'515,515,,,,,515,515,515,515,515,515,515,,,515,,,,,,515,515,515,515,515', +'515,515,515,515,515,515,515,515,515,,515,515,515,515,515,,,,,,,,,,,', +',,,,,,,,515,,,515,,,515,515,,,515,,515,,,,515,,,,,,,,515,,,,,515,515', +'515,515,515,515,,,,515,515,840,840,840,840,840,840,,,,840,840,,,,840', +',840,840,840,840,840,840,840,,,,,840,840,840,840,840,840,840,,,840,', +',,,,840,840,840,840,840,840,840,840,840,840,840,840,840,840,,840,840', +'840,840,840,,,,,,,,,,,,,,,,,,,,840,,,840,,,840,840,,,840,,840,,,,840', +',,,,,,,840,,,,,840,840,840,840,840,840,,,,840,840,796,796,796,796,796', +'796,,,,796,796,,,,796,,796,796,796,796,796,796,796,,,,,796,796,796,796', +'796,796,796,,,796,,,,,,796,796,796,796,796,796,796,796,796,796,796,796', +'796,796,,796,796,796,796,796,,,,,,,,,,,,,,,,,,,,796,,,796,,,796,796', +',,796,,796,,,,796,,,,,,,,796,,,,,796,796,796,796,796,796,,,,796,796', +'646,646,646,646,646,646,,,,646,646,,,,646,,646,646,646,646,646,646,646', +',,,,646,646,646,646,646,646,646,,,646,,,,,,646,646,646,646,646,646,646', +'646,646,646,646,646,646,646,,646,646,646,646,646,,,,,,,,,,,,,,,,,,,', +'646,,,646,,,646,646,,,646,,646,,,,646,,,,,,,,646,,,,,646,646,646,646', +'646,646,,,,646,646,641,641,641,641,641,641,,,,641,641,,,,641,,641,641', +'641,641,641,641,641,,,,,641,641,641,641,641,641,641,,,641,,,,,,641,641', +'641,641,641,641,641,641,641,641,641,641,641,641,,641,641,641,641,641', +',,,,,,,,,,,,,,,,,,,641,,,641,,,641,641,,,641,,641,,,,641,,,,,,,,641', +',,,,641,641,641,641,641,641,,,,641,641,497,497,497,497,497,497,,,,497', +'497,,,,497,,497,497,497,497,497,497,497,,,,,497,497,497,497,497,497', +'497,,,497,,,,,,497,497,497,497,497,497,497,497,497,497,497,497,497,497', +',497,497,497,497,497,,,,,,,,,,,,,,,,,,,,497,,,497,,,497,497,,,497,,497', +',,,497,,,,,,,,497,,,,,497,497,497,497,497,497,,,,497,497,492,492,492', +'492,492,492,,,,492,492,,,,492,,492,492,492,492,492,492,492,,,,,492,492', +'492,492,492,492,492,,,492,,,,,,492,492,492,492,492,492,492,492,492,492', +'492,492,492,492,,492,492,492,492,492,,,,,,,,,,,,,,,,,,,,492,,,492,,', +'492,492,,,492,,492,,,,492,,,,,,,,492,,,,,492,492,492,492,492,492,,,', +'492,492,750,750,750,750,750,750,,,,750,750,,,,750,,750,750,750,750,750', +'750,750,,,,,750,750,750,750,750,750,750,,,750,,,,,,750,750,750,750,750', +'750,750,750,750,750,750,750,750,750,,750,750,750,750,750,,,,,,,,,,,', +',,,,,,,,750,,,750,,,750,750,,,750,,750,,,,750,,,,,,,,750,,,,,750,750', +'750,750,750,750,,,,750,750,743,743,743,743,743,743,,,,743,743,,,,743', +',743,743,743,743,743,743,743,,,,,743,743,743,743,743,743,743,,,743,', +',,,,743,743,743,743,743,743,743,743,743,743,743,743,743,743,,743,743', +'743,743,743,,,,,,,,,,,,,,,,,,,,743,,,743,,,743,743,,,743,,743,,,,743', +',,,,,,,743,,,,,743,743,743,743,743,743,,,,743,743,488,488,488,488,488', +'488,,,,488,488,,,,488,,488,488,488,488,488,488,488,,,,,488,488,488,488', +'488,488,488,,,488,,,,,,488,488,488,488,488,488,488,488,488,488,488,488', +'488,488,,488,488,488,488,488,,,,,,,,,,,,,,,,,,,,488,,,488,,,488,488', +',,488,,488,,,,488,,,,,,,,488,,,,,488,488,488,488,488,488,,,,488,488', +'371,371,371,,371,,,,371,371,,,,371,,371,371,371,371,371,371,371,,,,', +'371,371,371,371,371,371,371,,,,,,,,,,371,,,371,371,371,371,371,371,371', +'371,371,371,,371,371,371,371,371,,,,,,,,,,,,,,,,,,,,371,,,371,,,371', +'371,,,371,,,,,,371,,,,,,,,371,,,,,371,371,371,371,371,371,,,,371,371', +'5,5,5,5,5,,,,5,5,,,,5,,5,5,5,5,5,5,5,,,,,5,5,5,5,5,5,5,,,5,,,,,,5,5', +'5,5,5,5,5,5,5,5,5,5,5,5,,5,5,5,5,5,,,,,,,,,,,,,,,,,,,,5,,,5,,,5,5,,', +'5,,5,,,,5,,,,,,,,5,,,,,5,5,5,5,5,5,,,,5,5,6,6,6,6,6,6,6,6,6,6,6,6,6', +'6,6,6,6,6,6,6,6,6,6,6,,,6,6,6,6,6,6,6,6,6,6,,,,,,6,6,6,6,6,6,6,6,6,', +'6,,,,,,,6,6,,6,6,6,6,,6,6,,,6,,,,,6,6,6,6,,,,,,,,,,,,,,6,6,,6,6,6,6', +'6,6,6,6,6,,6,,,6,6,,,,,,,,,,6,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7', +'7,7,7,7,7,,,7,7,7,7,7,7,7,7,7,7,,,,,,7,7,7,7,7,7,7,7,,,7,,,,,,,7,7,', +'7,7,7,7,,7,7,,,7,,,,,7,7,7,7,,,,,,,,,,,,,,7,7,,7,7,7,7,7,7,7,7,7,,7', +',,7,7,,,17,17,17,,17,,,7,17,17,,,,17,,17,17,17,17,17,17,17,,,,,17,17', +'17,17,17,17,17,,,17,,,,,,,17,,,17,17,17,17,17,17,17,17,17,17,,17,17', +'17,17,17,,,,,,,,,,,,,,,,,,,,17,,,17,,,17,17,,,17,,,,,,17,,,,,,,,17,', +',,,17,17,17,17,17,17,,,,17,17,18,18,18,,18,,,,18,18,,,,18,,18,18,18', +'18,18,18,18,,,,,18,18,18,18,18,18,18,,,,,,,,,,18,,,18,18,18,18,18,18', +'18,18,18,18,,18,18,18,18,18,,,,,,,,,,,,,,,,,,,,18,,,18,,,18,18,,,18', +',,,,,18,,,,,,,,18,,,,,18,18,18,18,18,18,,,,18,18,22,22,22,,22,,,,22', +'22,,,,22,,22,22,22,22,22,22,22,,,,,22,22,22,22,22,22,22,,,,,,,,,,22', +',,22,22,22,22,22,22,22,22,22,22,,22,22,22,22,22,,,,,,,,,,,,,,,,,,,,22', +',,22,,,22,22,,,22,,22,,22,,22,,,,,,,,22,,,,,22,22,22,22,22,22,,,,22', +'22,23,23,23,,23,,,,23,23,,,,23,,23,23,23,23,23,23,23,,,,,23,23,23,23', +'23,23,23,,,,,,,,,,23,,,23,23,23,23,23,23,23,23,23,23,,23,23,23,23,23', +',,,,,,,,,,,,,,,,,,,23,,,23,,,23,23,,,23,,23,,23,,23,,,,,,,,23,,,,,23', +'23,23,23,23,23,,,,23,23,24,24,24,,24,,,,24,24,,,,24,,24,24,24,24,24', +'24,24,,,,,24,24,24,24,24,24,24,,,,,,,,,,24,,,24,24,24,24,24,24,24,24', +'24,24,,24,24,24,24,24,,,,,,,,,,,,,,,,,,,,24,,,24,,,24,24,,,24,,24,,24', +',24,,,,,,,,24,,,,,24,24,24,24,24,24,,,,24,24,27,27,27,,27,,,,27,27,', +',,27,,27,27,27,27,27,27,27,,,,,27,27,27,27,27,27,27,,,,,,,,,,27,,,27', +'27,27,27,27,27,27,27,27,27,,27,27,27,27,27,,,,,,,,,,,,,,,,,,,,27,,,27', +'27,,27,27,,,27,,27,,27,,27,,,,,,,,27,,,,,27,27,27,27,27,27,,,,27,27', +'28,28,28,,28,,,,28,28,,,,28,,28,28,28,28,28,28,28,,,,,28,28,28,28,28', +'28,28,,,,,,,,,,28,,,28,28,28,28,28,28,28,28,28,28,,28,28,28,28,28,,', +',,,,,,,,,,,,,,,,,28,,,28,28,,28,28,,,28,,28,,28,,28,,,,,,,,28,,,,,28', +'28,28,28,28,28,,,,28,28,31,31,31,,31,,,,31,31,,,,31,,31,31,31,31,31', +'31,31,,,,,31,31,31,31,31,31,31,,,,,,,,,,31,,,31,31,31,31,31,31,31,31', +'31,31,,31,31,,,31,,830,830,830,830,830,830,830,830,830,830,830,,830', +'830,,,830,830,31,,,31,,,31,31,,,31,,31,,830,,830,,830,830,830,830,830', +'830,830,,830,,,31,31,31,31,31,31,,,,31,31,32,32,32,830,32,830,,,32,32', +',,,32,,32,32,32,32,32,32,32,,,,,32,32,32,32,32,32,32,,,,,,,,,,32,,,32', +'32,32,32,32,32,32,32,32,32,,32,32,,,32,,696,696,696,696,696,696,696', +'696,696,696,696,,696,696,,,696,696,32,,,32,,,32,32,,,32,,,,696,,696', +',696,696,696,696,696,696,696,,696,,,32,32,32,32,32,32,,,,32,32,38,38', +'38,696,38,,,,38,38,,,,38,,38,38,38,38,38,38,38,,,,,38,38,38,38,38,38', +'38,,,,,,,,,,38,,,38,38,38,38,38,38,38,38,38,38,,38,38,38,38,38,,,,,', +',,,,,,,,,,,,,,38,,,38,,,38,38,,,38,,,,,,38,,,,,,,,38,,,,,38,38,38,38', +'38,38,,,,38,38,39,39,39,,39,,,,39,39,,,,39,,39,39,39,39,39,39,39,,,', +',39,39,39,39,39,39,39,,,,,,,,,,39,,,39,39,39,39,39,39,39,39,39,39,,39', +'39,39,39,39,,,,,,,,,,,,,,,,,,,,39,,,39,,,39,39,,,39,,,,,,39,,,,,,,,39', +',,,,39,39,39,39,39,39,,,,39,39,40,40,40,,40,,,,40,40,,,,40,,40,40,40', +'40,40,40,40,,,,,40,40,40,40,40,40,40,,,,,,,,,,40,,,40,40,40,40,40,40', +'40,40,40,40,,40,40,40,40,40,,,,,,,,,,,,,,,,,,,,40,,,40,,,40,40,,,40', +',,,,,40,,,,,,,,40,,,,,40,40,40,40,40,40,,,,40,40,52,52,52,,52,,,,52', +'52,,,,52,,52,52,52,52,52,52,52,,,,,52,52,52,52,52,52,52,,,52,,,,,,,52', +',,52,52,52,52,52,52,52,52,52,52,,52,52,52,52,52,,,,,,,,,,,,,,,,,,,,52', +',,52,,,52,52,,,52,,,,,,52,,,,,,,,52,,,,,52,52,52,52,52,52,,,,52,52,53', +'53,53,,53,,,,53,53,,,,53,,53,53,53,53,53,53,53,,,,,53,53,53,53,53,53', +'53,,,,,,,,,,53,,,53,53,53,53,53,53,53,53,53,53,,53,53,53,53,53,,,,,', +',,,,,,,,,,,,,,53,,,53,,,53,53,,,53,,53,,,,53,,,,,,,,53,,,,,53,53,53', +'53,53,53,,,,53,53,54,54,54,,54,,,,54,54,,,,54,,54,54,54,54,54,54,54', +',,,,54,54,54,54,54,54,54,,,,,,,,,,54,,,54,54,54,54,54,54,54,54,54,54', +',54,54,54,54,54,,,,,,,,,,,,,,,,,,,,54,,,54,,,54,54,,,54,,,,,,54,,,,', +',,,54,,,,,54,54,54,54,54,54,,,,54,54,56,56,56,,56,,,,56,56,,,,56,,56', +'56,56,56,56,56,56,,,,,56,56,56,56,56,56,56,,,56,,,,,,,56,,,56,56,56', +'56,56,56,56,56,56,56,,56,56,56,56,56,,,,,,,,,,,,,,,,,,,,56,,,56,,,56', +'56,,,56,,,,,,56,,,,,,,,56,,,,,56,56,56,56,56,56,,,,56,56,57,57,57,,57', +',,,57,57,,,,57,,57,57,57,57,57,57,57,,,,,57,57,57,57,57,57,57,,,57,', +',,,,,57,,,57,57,57,57,57,57,57,57,57,57,,57,57,57,57,57,,,,,,,,,,,,', +',,,,,,,57,,,57,,,57,57,,,57,,,,,,57,,,,,,,,57,,,,,57,57,57,57,57,57', +',,,57,57,61,61,61,,61,,,,61,61,,,,61,,61,61,61,61,61,61,61,,,,,61,61', +'61,61,61,61,61,,,,,,,,,,61,,,61,61,61,61,61,61,61,61,61,61,,61,61,,', +'61,,470,470,470,470,470,470,470,470,470,470,470,,470,470,,,470,470,61', +',,61,,,61,61,,,61,,61,,470,,470,,470,470,470,470,470,470,470,,470,,', +'61,61,61,61,61,61,,,,61,61,62,62,62,470,62,,,,62,62,,,,62,,62,62,62', +'62,62,62,62,,,,,62,62,62,62,62,62,62,,,,,,,,,,62,,,62,62,62,62,62,62', +'62,62,62,62,,62,62,,,62,,691,691,691,691,691,691,691,691,691,691,691', +',691,691,,62,691,691,62,,,62,,,62,62,,,62,,,,691,,691,,691,691,691,691', +'691,691,691,,691,,,62,62,62,62,62,62,,,,62,62,63,63,63,691,63,,,,63', +'63,,,,63,,63,63,63,63,63,63,63,,,,,63,63,63,63,63,63,63,,,,,,,,,,63', +',,63,63,63,63,63,63,63,63,63,63,,63,63,,,63,,689,689,689,689,689,689', +'689,689,689,689,689,,689,689,,,689,689,63,,,63,,,63,63,,,63,,,,689,', +'689,,689,689,689,689,689,689,689,,689,,,63,63,63,63,63,63,,,,63,63,84', +'84,84,689,84,,,,84,84,,,,84,,84,84,84,84,84,84,84,,84,,,84,84,84,84', +'84,84,84,,,,,,,,,,84,,,84,84,84,84,84,84,84,84,84,84,,84,84,84,84,84', +',,,,,,,,,,,,,,,,,,,84,,,84,84,,84,84,,,84,,84,,84,,84,,,,,,,,84,,84', +',,84,84,84,84,84,84,,,,84,84,88,88,88,,88,,,,88,88,,,,88,,88,88,88,88', +'88,88,88,,88,,,88,88,88,88,88,88,88,,,,,,,,,,88,,,88,88,88,88,88,88', +'88,88,88,88,,88,88,88,88,88,,,,,,,,,,,,,,,,,,,,88,,,88,88,,88,88,,,88', +',88,,88,,88,,,,,,,,88,,88,,,88,88,88,88,88,88,,,,88,88,103,103,103,', +'103,,,,103,103,,,,103,,103,103,103,103,103,103,103,,,,,103,103,103,103', +'103,103,103,,,103,,,,,,,103,,,103,103,103,103,103,103,103,103,103,103', +',103,103,103,103,103,,,,,,,,,,,,,,,,,,,,103,,,103,,,103,103,,,103,,', +',,,103,,,,,,,,103,,,,,103,103,103,103,103,103,,,,103,103,104,104,104', +',104,,,,104,104,,,,104,,104,104,104,104,104,104,104,,,,,104,104,104', +'104,104,104,104,,,104,,,,,,,104,,,104,104,104,104,104,104,104,104,104', +'104,,104,104,104,104,104,,,,,,,,,,,,,,,,,,,,104,,,104,,,104,104,,,104', +',,,,,104,,,,,,,,104,,,,,104,104,104,104,104,104,,,,104,104,105,105,105', +',105,,,,105,105,,,,105,,105,105,105,105,105,105,105,,,,,105,105,105', +'105,105,105,105,,,105,,,,,,,105,,,105,105,105,105,105,105,105,105,105', +'105,,105,105,105,105,105,,,,,,,,,,,,,,,,,,,,105,,,105,,,105,105,,,105', +',,,,,105,,,,,,,,105,,,,,105,105,105,105,105,105,,,,105,105,106,106,106', +',106,,,,106,106,,,,106,,106,106,106,106,106,106,106,,,,,106,106,106', +'106,106,106,106,,,106,,,,,,,106,,,106,106,106,106,106,106,106,106,106', +'106,,106,106,106,106,106,,,,,,,,,,,,,,,,,,,,106,,,106,,,106,106,,,106', +',,,,,106,,,,,,,,106,,,,,106,106,106,106,106,106,,,,106,106,107,107,107', +'107,107,,,,107,107,,,,107,,107,107,107,107,107,107,107,,,,,107,107,107', +'107,107,107,107,,,107,,,,,,107,107,107,107,107,107,107,107,107,107,107', +'107,107,107,,107,107,107,107,107,,,,,,,,,,,,,,,,,,,,107,,,107,,,107', +'107,,,107,,107,,,,107,,,,,,,,107,,,,,107,107,107,107,107,107,,,,107', +'107,190,190,190,,190,,,,190,190,,,,190,,190,190,190,190,190,190,190', +',,,,190,190,190,190,190,190,190,,,,,,,,,,190,,,190,190,190,190,190,190', +'190,190,190,190,,190,190,190,190,190,,,,,,,,,,,,,,,,,,,,190,,,190,,', +'190,190,,,190,,190,,,,190,,,,,,,,190,,,,,190,190,190,190,190,190,,,', +'190,190,191,191,191,,191,,,,191,191,,,,191,,191,191,191,191,191,191', +'191,,,,,191,191,191,191,191,191,191,,,,,,,,,,191,,,191,191,191,191,191', +'191,191,191,191,191,,191,191,191,191,191,,,,,,,,,,,,,,,,,,,,191,,,191', +',,191,191,,,191,,191,,,,191,,,,,,,,191,,,,,191,191,191,191,191,191,', +',,191,191,192,192,192,,192,,,,192,192,,,,192,,192,192,192,192,192,192', +'192,,,,,192,192,192,192,192,192,192,,,,,,,,,,192,,,192,192,192,192,192', +'192,192,192,192,192,,192,192,192,192,192,,,,,,,,,,,,,,,,,,,,192,,,192', +',,192,192,,,192,,,,,,192,,,,,,,,192,,,,,192,192,192,192,192,192,,,,192', +'192,193,193,193,,193,,,,193,193,,,,193,,193,193,193,193,193,193,193', +',,,,193,193,193,193,193,193,193,,,,,,,,,,193,,,193,193,193,193,193,193', +'193,193,193,193,,193,193,193,193,193,,,,,,,,,,,,,,,,,,,,193,,,193,,', +'193,193,,,193,,193,,,,193,,,,,,,,193,,,,,193,193,193,193,193,193,,,', +'193,193,196,196,196,,196,,,,196,196,,,,196,,196,196,196,196,196,196', +'196,,,,,196,196,196,196,196,196,196,,,,,,,,,,196,,,196,196,196,196,196', +'196,196,196,196,196,,196,196,196,196,196,,,,,,,,,,,,,,,,,,,,196,,,196', +',,196,196,,,196,,,,,,196,,,,,,,,196,,,,,196,196,196,196,196,196,,,,196', +'196,197,197,197,,197,,,,197,197,,,,197,,197,197,197,197,197,197,197', +',,,,197,197,197,197,197,197,197,,,197,,,,,,,197,,,197,197,197,197,197', +'197,197,197,197,197,,197,197,197,197,197,,,,,,,,,,,,,,,,,,,,197,,,197', +',,197,197,,,197,,,,,,197,,,,,,,,197,,,,,197,197,197,197,197,197,,,,197', +'197,198,198,198,,198,,,,198,198,,,,198,,198,198,198,198,198,198,198', +',,,,198,198,198,198,198,198,198,,,198,,,,,,,198,,,198,198,198,198,198', +'198,198,198,198,198,,198,198,198,198,198,,,,,,,,,,,,,,,,,,,,198,,,198', +',,198,198,,,198,,,,,,198,,,,,,,,198,,,,,198,198,198,198,198,198,,,,198', +'198,209,209,209,,209,,,,209,209,,,,209,,209,209,209,209,209,209,209', +',,,,209,209,209,209,209,209,209,,,,,,,,,,209,,,209,209,209,209,209,209', +'209,209,209,209,,209,209,209,209,209,,,,,,,,,,,,,,,,,,,,209,,,209,,', +'209,209,,,209,,,,,,209,,,,,,,,209,,,,,209,209,209,209,209,209,,,,209', +'209,210,210,210,,210,,,,210,210,,,,210,,210,210,210,210,210,210,210', +',,,,210,210,210,210,210,210,210,,,,,,,,,,210,,,210,210,210,210,210,210', +'210,210,210,210,,210,210,210,210,210,,,,,,,,,,,,,,,,,,,,210,,,210,,', +'210,210,,,210,,,,,,210,,,,,,,,210,,,,,210,210,210,210,210,210,,,,210', +'210,211,211,211,,211,,,,211,211,,,,211,,211,211,211,211,211,211,211', +',,,,211,211,211,211,211,211,211,,,,,,,,,,211,,,211,211,211,211,211,211', +'211,211,211,211,,211,211,211,211,211,,,,,,,,,,,,,,,,,,,,211,,,211,,', +'211,211,,,211,,,,,,211,,,,,,,,211,,,,,211,211,211,211,211,211,,,,211', +'211,212,212,212,,212,,,,212,212,,,,212,,212,212,212,212,212,212,212', +',,,,212,212,212,212,212,212,212,,,,,,,,,,212,,,212,212,212,212,212,212', +'212,212,212,212,,212,212,212,212,212,,,,,,,,,,,,,,,,,,,,212,,,212,,', +'212,212,,,212,,,,,,212,,,,,,,,212,,,,,212,212,212,212,212,212,,,,212', +'212,213,213,213,,213,,,,213,213,,,,213,,213,213,213,213,213,213,213', +',,,,213,213,213,213,213,213,213,,,,,,,,,,213,,,213,213,213,213,213,213', +'213,213,213,213,,213,213,213,213,213,,,,,,,,,,,,,,,,,,,,213,,,213,,', +'213,213,,,213,,,,,,213,,,,,,,,213,,,,,213,213,213,213,213,213,,,,213', +'213,214,214,214,,214,,,,214,214,,,,214,,214,214,214,214,214,214,214', +',,,,214,214,214,214,214,214,214,,,,,,,,,,214,,,214,214,214,214,214,214', +'214,214,214,214,,214,214,214,214,214,,,,,,,,,,,,,,,,,,,,214,,,214,,', +'214,214,,,214,,,,,,214,,,,,,,,214,,,,,214,214,214,214,214,214,,,,214', +'214,215,215,215,,215,,,,215,215,,,,215,,215,215,215,215,215,215,215', +',,,,215,215,215,215,215,215,215,,,,,,,,,,215,,,215,215,215,215,215,215', +'215,215,215,215,,215,215,215,215,215,,,,,,,,,,,,,,,,,,,,215,,,215,,', +'215,215,,,215,,,,,,215,,,,,,,,215,,,,,215,215,215,215,215,215,,,,215', +'215,216,216,216,,216,,,,216,216,,,,216,,216,216,216,216,216,216,216', +',,,,216,216,216,216,216,216,216,,,,,,,,,,216,,,216,216,216,216,216,216', +'216,216,216,216,,216,216,216,216,216,,,,,,,,,,,,,,,,,,,,216,,,216,,', +'216,216,,,216,,,,,,216,,,,,,,,216,,,,,216,216,216,216,216,216,,,,216', +'216,217,217,217,,217,,,,217,217,,,,217,,217,217,217,217,217,217,217', +',,,,217,217,217,217,217,217,217,,,,,,,,,,217,,,217,217,217,217,217,217', +'217,217,217,217,,217,217,217,217,217,,,,,,,,,,,,,,,,,,,,217,,,217,,', +'217,217,,,217,,,,,,217,,,,,,,,217,,,,,217,217,217,217,217,217,,,,217', +'217,218,218,218,,218,,,,218,218,,,,218,,218,218,218,218,218,218,218', +',,,,218,218,218,218,218,218,218,,,,,,,,,,218,,,218,218,218,218,218,218', +'218,218,218,218,,218,218,218,218,218,,,,,,,,,,,,,,,,,,,,218,,,218,,', +'218,218,,,218,,,,,,218,,,,,,,,218,,,,,218,218,218,218,218,218,,,,218', +'218,219,219,219,,219,,,,219,219,,,,219,,219,219,219,219,219,219,219', +',,,,219,219,219,219,219,219,219,,,,,,,,,,219,,,219,219,219,219,219,219', +'219,219,219,219,,219,219,219,219,219,,,,,,,,,,,,,,,,,,,,219,,,219,,', +'219,219,,,219,,,,,,219,,,,,,,,219,,,,,219,219,219,219,219,219,,,,219', +'219,220,220,220,,220,,,,220,220,,,,220,,220,220,220,220,220,220,220', +',,,,220,220,220,220,220,220,220,,,,,,,,,,220,,,220,220,220,220,220,220', +'220,220,220,220,,220,220,220,220,220,,,,,,,,,,,,,,,,,,,,220,,,220,,', +'220,220,,,220,,,,,,220,,,,,,,,220,,,,,220,220,220,220,220,220,,,,220', +'220,221,221,221,,221,,,,221,221,,,,221,,221,221,221,221,221,221,221', +',,,,221,221,221,221,221,221,221,,,,,,,,,,221,,,221,221,221,221,221,221', +'221,221,221,221,,221,221,221,221,221,,,,,,,,,,,,,,,,,,,,221,,,221,,', +'221,221,,,221,,,,,,221,,,,,,,,221,,,,,221,221,221,221,221,221,,,,221', +'221,222,222,222,,222,,,,222,222,,,,222,,222,222,222,222,222,222,222', +',,,,222,222,222,222,222,222,222,,,,,,,,,,222,,,222,222,222,222,222,222', +'222,222,222,222,,222,222,222,222,222,,,,,,,,,,,,,,,,,,,,222,,,222,,', +'222,222,,,222,,,,,,222,,,,,,,,222,,,,,222,222,222,222,222,222,,,,222', +'222,223,223,223,,223,,,,223,223,,,,223,,223,223,223,223,223,223,223', +',,,,223,223,223,223,223,223,223,,,,,,,,,,223,,,223,223,223,223,223,223', +'223,223,223,223,,223,223,223,223,223,,,,,,,,,,,,,,,,,,,,223,,,223,,', +'223,223,,,223,,,,,,223,,,,,,,,223,,,,,223,223,223,223,223,223,,,,223', +'223,224,224,224,,224,,,,224,224,,,,224,,224,224,224,224,224,224,224', +',,,,224,224,224,224,224,224,224,,,,,,,,,,224,,,224,224,224,224,224,224', +'224,224,224,224,,224,224,224,224,224,,,,,,,,,,,,,,,,,,,,224,,,224,,', +'224,224,,,224,,,,,,224,,,,,,,,224,,,,,224,224,224,224,224,224,,,,224', +'224,225,225,225,,225,,,,225,225,,,,225,,225,225,225,225,225,225,225', +',,,,225,225,225,225,225,225,225,,,,,,,,,,225,,,225,225,225,225,225,225', +'225,225,225,225,,225,225,225,225,225,,,,,,,,,,,,,,,,,,,,225,,,225,,', +'225,225,,,225,,,,,,225,,,,,,,,225,,,,,225,225,225,225,225,225,,,,225', +'225,226,226,226,,226,,,,226,226,,,,226,,226,226,226,226,226,226,226', +',,,,226,226,226,226,226,226,226,,,,,,,,,,226,,,226,226,226,226,226,226', +'226,226,226,226,,226,226,226,226,226,,,,,,,,,,,,,,,,,,,,226,,,226,,', +'226,226,,,226,,,,,,226,,,,,,,,226,,,,,226,226,226,226,226,226,,,,226', +'226,227,227,227,,227,,,,227,227,,,,227,,227,227,227,227,227,227,227', +',,,,227,227,227,227,227,227,227,,,,,,,,,,227,,,227,227,227,227,227,227', +'227,227,227,227,,227,227,227,227,227,,,,,,,,,,,,,,,,,,,,227,,,227,,', +'227,227,,,227,,,,,,227,,,,,,,,227,,,,,227,227,227,227,227,227,,,,227', +'227,228,228,228,,228,,,,228,228,,,,228,,228,228,228,228,228,228,228', +',,,,228,228,228,228,228,228,228,,,,,,,,,,228,,,228,228,228,228,228,228', +'228,228,228,228,,228,228,228,228,228,,,,,,,,,,,,,,,,,,,,228,,,228,,', +'228,228,,,228,,,,,,228,,,,,,,,228,,,,,228,228,228,228,228,228,,,,228', +'228,229,229,229,,229,,,,229,229,,,,229,,229,229,229,229,229,229,229', +',,,,229,229,229,229,229,229,229,,,,,,,,,,229,,,229,229,229,229,229,229', +'229,229,229,229,,229,229,229,229,229,,,,,,,,,,,,,,,,,,,,229,,,229,,', +'229,229,,,229,,,,,,229,,,,,,,,229,,,,,229,229,229,229,229,229,,,,229', +'229,230,230,230,,230,,,,230,230,,,,230,,230,230,230,230,230,230,230', +',,,,230,230,230,230,230,230,230,,,,,,,,,,230,,,230,230,230,230,230,230', +'230,230,230,230,,230,230,230,230,230,,,,,,,,,,,,,,,,,,,,230,,,230,,', +'230,230,,,230,,,,,,230,,,,,,,,230,,,,,230,230,230,230,230,230,,,,230', +'230,231,231,231,,231,,,,231,231,,,,231,,231,231,231,231,231,231,231', +',,,,231,231,231,231,231,231,231,,,,,,,,,,231,,,231,231,231,231,231,231', +'231,231,231,231,,231,231,231,231,231,,,,,,,,,,,,,,,,,,,,231,,,231,,', +'231,231,,,231,,,,,,231,,,,,,,,231,,,,,231,231,231,231,231,231,,,,231', +'231,232,232,232,,232,,,,232,232,,,,232,,232,232,232,232,232,232,232', +',,,,232,232,232,232,232,232,232,,,,,,,,,,232,,,232,232,232,232,232,232', +'232,232,232,232,,232,232,232,232,232,,,,,,,,,,,,,,,,,,,,232,,,232,,', +'232,232,,,232,,,,,,232,,,,,,,,232,,,,,232,232,232,232,232,232,,,,232', +'232,233,233,233,,233,,,,233,233,,,,233,,233,233,233,233,233,233,233', +',,,,233,233,233,233,233,233,233,,,,,,,,,,233,,,233,233,233,233,233,233', +'233,233,233,233,,233,233,233,233,233,,,,,,,,,,,,,,,,,,,,233,,,233,,', +'233,233,,,233,,,,,,233,,,,,,,,233,,,,,233,233,233,233,233,233,,,,233', +'233,234,234,234,,234,,,,234,234,,,,234,,234,234,234,234,234,234,234', +',,,,234,234,234,234,234,234,234,,,,,,,,,,234,,,234,234,234,234,234,234', +'234,234,234,234,,234,234,234,234,234,,,,,,,,,,,,,,,,,,,,234,,,234,,', +'234,234,,,234,,,,,,234,,,,,,,,234,,,,,234,234,234,234,234,234,,,,234', +'234,235,235,235,,235,,,,235,235,,,,235,,235,235,235,235,235,235,235', +',,,,235,235,235,235,235,235,235,,,,,,,,,,235,,,235,235,235,235,235,235', +'235,235,235,235,,235,235,235,235,235,,,,,,,,,,,,,,,,,,,,235,,,235,,', +'235,235,,,235,,,,,,235,,,,,,,,235,,,,,235,235,235,235,235,235,,,,235', +'235,243,243,243,,243,,,,243,243,,,,243,,243,243,243,243,243,243,243', +',,,,243,243,243,243,243,243,243,,,,,,,,,,243,,,243,243,243,243,243,243', +'243,243,243,243,,243,243,243,243,243,,,,,,,,,,,,,,,,,,,,243,,,243,,', +'243,243,,,243,,,,,,243,,,,,,,,243,,,,,243,243,243,243,243,243,,,,243', +'243,245,245,245,,245,,,,245,245,,,,245,,245,245,245,245,245,245,245', +',,,,245,245,245,245,245,245,245,,,,,,,,,,245,,,245,245,245,245,245,245', +'245,245,245,245,,245,245,245,245,245,,,,,,,,,,,,,,,,,,,,245,,,245,,', +'245,245,,,245,,,,,,245,,,,,,,,245,,,,,245,245,245,245,245,245,,,,245', +'245,256,256,256,,256,,,,256,256,,,,256,,256,256,256,256,256,256,256', +',,,,256,256,256,256,256,256,256,,,,,,,,,,256,,,256,256,256,256,256,256', +'256,256,256,256,,256,256,256,256,256,,,,,,,,,,,,,,,,,,,,256,,,256,,', +'256,256,,,256,,256,,256,,256,,,,,,,,256,,,,,256,256,256,256,256,256', +',,,256,256,257,257,257,,257,,,,257,257,,,,257,,257,257,257,257,257,257', +'257,,,,,257,257,257,257,257,257,257,,,,,,,,,,257,,,257,257,257,257,257', +'257,257,257,257,257,,257,257,257,257,257,,,,,,,,,,,,,,,,,,,,257,,,257', +',,257,257,,,257,,257,,257,,257,,,,,,,,257,,,,,257,257,257,257,257,257', +',,,257,257,265,265,265,,265,,,,265,265,,,,265,,265,265,265,265,265,265', +'265,,,,,265,265,265,265,265,265,265,,,,,,,,,,265,,,265,265,265,265,265', +'265,265,265,265,265,,265,265,265,265,265,,,,,,,,,,,,,,,,,,,,265,,,265', +',265,265,265,,,265,,265,,265,,265,,,,,,,,265,,,,,265,265,265,265,265', +'265,,,,265,265,271,271,271,,271,,,,271,271,,,,271,,271,271,271,271,271', +'271,271,,,,,271,271,271,271,271,271,271,,,,,,,,,,271,,,271,271,271,271', +'271,271,271,271,271,271,,271,271,,,271,,686,686,686,686,686,686,686', +'686,686,686,686,,686,686,,,686,686,271,,,271,,,271,271,,,271,,,,686', +',686,,686,686,686,686,686,686,686,,686,,,271,271,271,271,271,271,,,', +'271,271,292,292,292,686,292,,,,292,292,,,,292,,292,292,292,292,292,292', +'292,,,,,292,292,292,292,292,292,292,,,,,,,,,,292,,,292,292,292,292,292', +'292,292,292,292,292,,292,292,292,292,292,,,,,,,,,,,,,,,,,,,,292,,,292', +'292,,292,292,,,292,,,,,,292,,,,,,,,292,,,,,292,292,292,292,292,292,', +',,292,292,301,301,301,,301,,,,301,301,,,,301,,301,301,301,301,301,301', +'301,,,,,301,301,301,301,301,301,301,,,,,,,,,,301,,,301,301,301,301,301', +'301,301,301,301,301,,301,301,301,301,301,,,,,,,,,,,,,,,,,,,,301,,,301', +',,301,301,,,301,,,,,,301,,,,,,,,301,,,,,301,301,301,301,301,301,,,,301', +'301,310,310,310,,310,,,,310,310,,,,310,,310,310,310,310,310,310,310', +',,,,310,310,310,310,310,310,310,,,310,,,,,,,310,,,310,310,310,310,310', +'310,310,310,310,310,,310,310,310,310,310,,,,,,,,,,,,,,,,,,,,310,,,310', +',,310,310,,,310,,,,,,310,,,,,,,,310,,,,,310,310,310,310,310,310,,,,310', +'310,311,311,311,,311,,,,311,311,,,,311,,311,311,311,311,311,311,311', +',,,,311,311,311,311,311,311,311,,,311,,,,,,,311,,,311,311,311,311,311', +'311,311,311,311,311,,311,311,311,311,311,,,,,,,,,,,,,,,,,,,,311,,,311', +',,311,311,,,311,,,,,,311,,,,,,,,311,,,,,311,311,311,311,311,311,,,,311', +'311,329,329,329,,329,,,,329,329,,,,329,,329,329,329,329,329,329,329', +',,,,329,329,329,329,329,329,329,,,329,,,,,,,329,,,329,329,329,329,329', +'329,329,329,329,329,,329,329,329,329,329,,,,,,,,,,,,,,,,,,,,329,,,329', +',,329,329,,,329,,,,,,329,,,,,,,,329,,,,,329,329,329,329,329,329,,,,329', +'329,343,343,343,,343,,,,343,343,,,,343,,343,343,343,343,343,343,343', +',,,,343,343,343,343,343,343,343,,,343,,,,,,,343,,,343,343,343,343,343', +'343,343,343,343,343,,343,343,343,343,343,,,,,,,,,,,,,,,,,,,,343,,,343', +',,343,343,,,343,,,,,,343,,,,,,,,343,,,,,343,343,343,343,343,343,,,,343', +'343,359,359,359,359,359,359,359,359,359,359,359,359,359,359,359,359', +'359,359,359,359,359,359,359,359,,,359,359,359,359,359,359,359,359,359', +'359,,,,,,359,359,359,359,359,359,359,359,,,359,,,,,,,359,359,,359,359', +'359,359,,359,359,,,359,,,,,359,359,359,359,,,,,,,,,,,,,,359,359,,359', +'359,359,359,359,359,359,359,359,,359,,,359,359,,,380,380,380,,380,,', +'359,380,380,,,,380,,380,380,380,380,380,380,380,,,,,380,380,380,380', +'380,380,380,,,,,,,,,,380,,,380,380,380,380,380,380,380,380,380,380,', +'380,380,380,380,380,,,,,,,,,,,,,,,,,,,,380,,,380,380,,380,380,,,380', +',380,,380,,380,,,,,,,,380,,,,,380,380,380,380,380,380,,,,380,380,387', +'387,387,,387,,,,387,387,,,,387,,387,387,387,387,387,387,387,,,,,387', +'387,387,387,387,387,387,,,,,,,,,,387,,,387,387,387,387,387,387,387,387', +'387,387,,387,387,387,387,387,,,,,,,,,,,,,,,,,,,,387,,,387,387,,387,387', +',,387,,387,,387,,387,,,,,,,,387,,,,,387,387,387,387,387,387,,,,387,387', +'388,388,388,,388,,,,388,388,,,,388,,388,388,388,388,388,388,388,,,,', +'388,388,388,388,388,388,388,,,,,,,,,,388,,,388,388,388,388,388,388,388', +'388,388,388,,388,388,388,388,388,,,,,,,,,,,,,,,,,,,,388,,,388,388,,388', +'388,,,388,,388,,388,,388,,,,,,,,388,,,,,388,388,388,388,388,388,,,,388', +'388,395,395,395,,395,,,,395,395,,,,395,,395,395,395,395,395,395,395', +',,,,395,395,395,395,395,395,395,,,,,,,,,,395,,,395,395,395,395,395,395', +'395,395,395,395,,395,395,395,395,395,,,,,,,,,,,,,,,,,,,,395,,,395,,', +'395,395,,,395,,395,,,,395,,,,,,,,395,,,,,395,395,395,395,395,395,,,', +'395,395,397,397,397,,397,,,,397,397,,,,397,,397,397,397,397,397,397', +'397,,,,,397,397,397,397,397,397,397,,,,,,,,,,397,,,397,397,397,397,397', +'397,397,397,397,397,,397,397,397,397,397,,,,,,,,,,,,,,,,,,,,397,,,397', +',,397,397,,,397,,,,,,397,,,,,,,,397,,,,,397,397,397,397,397,397,,,,397', +'397,398,398,398,,398,,,,398,398,,,,398,,398,398,398,398,398,398,398', +',,,,398,398,398,398,398,398,398,,,,,,,,,,398,,,398,398,398,398,398,398', +'398,398,398,398,,398,398,398,398,398,,,,,,,,,,,,,,,,,,,,398,,,398,,', +'398,398,,,398,,,,,,398,,,,,,,,398,,,,,398,398,398,398,398,398,,,,398', +'398,399,399,399,,399,,,,399,399,,,,399,,399,399,399,399,399,399,399', +',,,,399,399,399,399,399,399,399,,,,,,,,,,399,,,399,399,399,399,399,399', +'399,399,399,399,,399,399,399,399,399,,,,,,,,,,,,,,,,,,,,399,,,399,,', +'399,399,,,399,,,,,,399,,,,,,,,399,,,,,399,399,399,399,399,399,,,,399', +'399,428,428,428,,428,,,,428,428,,,,428,,428,428,428,428,428,428,428', +',,,,428,428,428,428,428,428,428,,,,,,,,,,428,,,428,428,428,428,428,428', +'428,428,428,428,,428,428,428,428,428,,,,,,,,,,,,,,,,,,,,428,,,428,,', +'428,428,,,428,,428,,428,,428,,,,,,,,428,,,,,428,428,428,428,428,428', +',,,428,428,430,430,430,,430,,,,430,430,,,,430,,430,430,430,430,430,430', +'430,,,,,430,430,430,430,430,430,430,,,,,,,,,,430,,,430,430,430,430,430', +'430,430,430,430,430,,430,430,430,430,430,,,,,,,,,,,,,,,,,,,,430,,,430', +',,430,430,,,430,,430,,430,,430,,,,,,,,430,,,,,430,430,430,430,430,430', +',,,430,430,433,433,433,,433,,,,433,433,,,,433,,433,433,433,433,433,433', +'433,,,,,433,433,433,433,433,433,433,,,,,,,,,,433,,,433,433,433,433,433', +'433,433,433,433,433,,433,433,433,433,433,,,,,,,,,,,,,,,,,,,,433,,,433', +',,433,433,,,433,,,,,,433,,,,,,,,433,,,,,433,433,433,433,433,433,,,,433', +'433,447,447,447,,447,,,,447,447,,,,447,,447,447,447,447,447,447,447', +',,,,447,447,447,447,447,447,447,,,447,,,,,,,447,,,447,447,447,447,447', +'447,447,447,447,447,,447,447,447,447,447,,,,,,,,,,,,,,,,,,,,447,,,447', +',,447,447,,,447,,447,,447,,447,,,,,,,,447,,,,,447,447,447,447,447,447', +',,,447,447,458,458,458,,458,,,,458,458,,,,458,,458,458,458,458,458,458', +'458,,,,,458,458,458,458,458,458,458,,,,,,,,,,458,,,458,458,458,458,458', +'458,458,458,458,458,,458,458,458,458,458,,,,,,,,,,,,,,,,,,,,458,,,458', +',,458,458,,,458,,458,,,,458,,,,,,,,458,,,,,458,458,458,458,458,458,', +',,458,458,465,465,465,,465,,,,465,465,,,,465,,465,465,465,465,465,465', +'465,,,,,465,465,465,465,465,465,465,,,,,,,,,,465,,,465,465,465,465,465', +'465,465,465,465,465,,465,465,465,465,465,,,,,,,,,,,,,,,,,,,,465,,,465', +',,465,465,,,465,,,,,,465,,,,,,,,465,,,,,465,465,465,465,465,465,,,,465', +'465,466,466,466,,466,,,,466,466,,,,466,,466,466,466,466,466,466,466', +',,,,466,466,466,466,466,466,466,,,,,,,,,,466,,,466,466,466,466,466,466', +'466,466,466,466,,466,466,466,466,466,,,,,,,,,,,,,,,,,,,,466,,,466,,', +'466,466,,,466,,,,,,466,,,,,,,,466,,,,,466,466,466,466,466,466,,,,466', +'466,467,467,467,,467,,,,467,467,,,,467,,467,467,467,467,467,467,467', +',,,,467,467,467,467,467,467,467,,,,,,,,,,467,,,467,467,467,467,467,467', +'467,467,467,467,,467,467,467,467,467,,,,,,,,,,,,,,,,,,,,467,,,467,,', +'467,467,,,467,,,,,,467,,,,,,,,467,,,,,467,467,467,467,467,467,,,,467', +'467,471,471,471,,471,,,,471,471,,,,471,,471,471,471,471,471,471,471', +',,,,471,471,471,471,471,471,471,,,471,,,,,,,471,,,471,471,471,471,471', +'471,471,471,471,471,,471,471,471,471,471,,,,,,,,,,,,,,,,,,,,471,,,471', +',,471,471,,,471,,,,,,471,,,,,,,,471,,,,,471,471,471,471,471,471,,,,471', +'471,473,473,473,,473,,,,473,473,,,,473,,473,473,473,473,473,473,473', +',,,,473,473,473,473,473,473,473,,,,,,,,,,473,,,473,473,473,473,473,473', +'473,473,473,473,,473,473,473,473,473,,,,,,,,,,,,,,,,,,,,473,,,473,,', +'473,473,,,473,,473,,,,473,,,,,,,,473,,,,,473,473,473,473,473,473,,,', +'473,473,478,478,478,,478,,,,478,478,,,,478,,478,478,478,478,478,478', +'478,,,,,478,478,478,478,478,478,478,,,,,,,,,,478,,,478,478,478,478,478', +'478,478,478,478,478,,478,478,478,478,478,,,,,,,,,,,,,,,,,,,,478,,,478', +',,478,478,,,478,,478,,,,478,,,,,,,,478,,,,,478,478,478,478,478,478,', +',,478,478,481,481,481,,481,,,,481,481,,,,481,,481,481,481,481,481,481', +'481,,,,,481,481,481,481,481,481,481,,,,,,,,,,481,,,481,481,481,481,481', +'481,481,481,481,481,,481,481,481,481,481,,,,,,,,,,,,,,,,,,,,481,,,481', +',,481,481,,,481,,,,,,481,,,,,,,,481,,,,,481,481,481,481,481,481,,,,481', +'481,484,484,484,,484,,,,484,484,,,,484,,484,484,484,484,484,484,484', +',,,,484,484,484,484,484,484,484,,,,,,,,,,484,,,484,484,484,484,484,484', +'484,484,484,484,,484,484,484,484,484,,,,,,,,,,,,,,,,,,,,484,,,484,,', +'484,484,,,484,,,,,,484,,,,,,,,484,,,,,484,484,484,484,484,484,,,,484', +'484,498,498,498,,498,,,,498,498,,,,498,,498,498,498,498,498,498,498', +',,,,498,498,498,498,498,498,498,,,,,,,,,,498,,,498,498,498,498,498,498', +'498,498,498,498,,498,498,498,498,498,,,,,,,,,,,,,,,,,,,,498,,,498,,', +'498,498,,,498,,498,,,,498,,,,,,,,498,,,,,498,498,498,498,498,498,,,', +'498,498,499,499,499,,499,,,,499,499,,,,499,,499,499,499,499,499,499', +'499,,,,,499,499,499,499,499,499,499,,,,,,,,,,499,,,499,499,499,499,499', +'499,499,499,499,499,,499,499,499,499,499,,,,,,,,,,,,,,,,,,,,499,,,499', +',,499,499,,,499,,499,,,,499,,,,,,,,499,,,,,499,499,499,499,499,499,', +',,499,499,508,508,508,,508,,,,508,508,,,,508,,508,508,508,508,508,508', +'508,,,,,508,508,508,508,508,508,508,,,,,,,,,,508,,,508,508,508,508,508', +'508,508,508,508,508,,508,508,508,508,508,,,,,,,,,,,,,,,,,,,,508,,,508', +',,508,508,,,508,,508,,,,508,,,,,,,,508,,,,,508,508,508,508,508,508,', +',,508,508,512,512,512,,512,,,,512,512,,,,512,,512,512,512,512,512,512', +'512,,,,,512,512,512,512,512,512,512,,,512,,,,,,,512,,,512,512,512,512', +'512,512,512,512,512,512,,512,512,512,512,512,,,,,,,,,,,,,,,,,,,,512', +',,512,,,512,512,,,512,,,,,,512,,,,,,,,512,,,,,512,512,512,512,512,512', +',,,512,512,536,536,536,536,536,536,536,536,536,536,536,536,536,536,536', +'536,536,536,536,536,536,536,536,536,,,536,536,536,536,536,536,536,536', +'536,536,,,,,,536,536,536,536,536,536,536,536,,,536,,,,,,,536,536,,536', +'536,536,536,,536,536,,,536,,,,,536,536,536,536,,,,,,,,,,,,,,536,536', +',536,536,536,536,536,536,536,536,536,,536,,,536,536,,,539,539,539,,539', +',,536,539,539,,,,539,,539,539,539,539,539,539,539,,,,,539,539,539,539', +'539,539,539,,,,,,,,,,539,,,539,539,539,539,539,539,539,539,539,539,', +'539,539,539,539,539,,,,,,,,,,,,,,,,,,,,539,,,539,,,539,539,,,539,,,', +',,539,,,,,,,,539,,,,,539,539,539,539,539,539,,,,539,539,540,540,540', +',540,,,,540,540,,,,540,,540,540,540,540,540,540,540,,,,,540,540,540', +'540,540,540,540,,,,,,,,,,540,,,540,540,540,540,540,540,540,540,540,540', +',540,540,540,540,540,,,,,,,,,,,,,,,,,,,,540,,,540,,,540,540,,,540,,540', +',,,540,,,,,,,,540,,,,,540,540,540,540,540,540,,,,540,540,543,543,543', +',543,,,,543,543,,,,543,,543,543,543,543,543,543,543,,,,,543,543,543', +'543,543,543,543,,,,,,,,,,543,,,543,543,543,543,543,543,543,543,543,543', +',543,543,543,543,543,,,,,,,,,,,,,,,,,,,,543,,,543,,,543,543,,,543,,', +',,,543,,,,,,,,543,,,,,543,543,543,543,543,543,,,,543,543,544,544,544', +',544,,,,544,544,,,,544,,544,544,544,544,544,544,544,,,,,544,544,544', +'544,544,544,544,,,,,,,,,,544,,,544,544,544,544,544,544,544,544,544,544', +',544,544,544,544,544,,,,,,,,,,,,,,,,,,,,544,,,544,,,544,544,,,544,,', +',,,544,,,,,,,,544,,,,,544,544,544,544,544,544,,,,544,544,548,548,548', +',548,,,,548,548,,,,548,,548,548,548,548,548,548,548,,,,,548,548,548', +'548,548,548,548,,,,,,,,,,548,,,548,548,548,548,548,548,548,548,548,548', +',548,548,548,548,548,,,,,,,,,,,,,,,,,,,,548,,,548,,,548,548,,,548,,', +',,,548,,,,,,,,548,,,,,548,548,548,548,548,548,,,,548,548,551,551,551', +',551,,,,551,551,,,,551,,551,551,551,551,551,551,551,,,,,551,551,551', +'551,551,551,551,,,,,,,,,,551,,,551,551,551,551,551,551,551,551,551,551', +',551,551,551,551,551,,,,,,,,,,,,,,,,,,,,551,,,551,,,551,551,,,551,,', +',,,551,,,,,,,,551,,,,,551,551,551,551,551,551,,,,551,551,558,558,558', +',558,,,,558,558,,,,558,,558,558,558,558,558,558,558,,,,,558,558,558', +'558,558,558,558,,,,,,,,,,558,,,558,558,558,558,558,558,558,558,558,558', +',558,558,558,558,558,,,,,,,,,,,,,,,,,,,,558,,,558,,,558,558,,,558,,', +',,,558,,,,,,,,558,,,,,558,558,558,558,558,558,,,,558,558,559,559,559', +',559,,,,559,559,,,,559,,559,559,559,559,559,559,559,,,,,559,559,559', +'559,559,559,559,,,,,,,,,,559,,,559,559,559,559,559,559,559,559,559,559', +',559,559,,,559,,,,,,,,,,,,,,,,,,,,559,,,559,,,559,559,,,559,,559,,559', +',,,,,,,,559,,,,,,559,559,559,559,559,559,,,,559,559,562,562,562,,562', +',,,562,562,,,,562,,562,562,562,562,562,562,562,,,,,562,562,562,562,562', +'562,562,,,,,,,,,,562,,,562,562,562,562,562,562,562,562,562,562,,562', +'562,562,562,562,,,,,,,,,,,,,,,,,,,,562,,,562,,,562,562,,,562,,,,,,562', +',,,,,,,562,,,,,562,562,562,562,562,562,,,,562,562,566,566,566,,566,', +',,566,566,,,,566,,566,566,566,566,566,566,566,,,,,566,566,566,566,566', +'566,566,,,,,,,,,,566,,,566,566,566,566,566,566,566,566,566,566,,566', +'566,566,566,566,,,,,,,,,,,,,,,,,,,,566,,,566,,,566,566,,,566,,,,,,566', +',,,,,,,566,,,,,566,566,566,566,566,566,,,,566,566,582,582,582,,582,', +',,582,582,,,,582,,582,582,582,582,582,582,582,,,,,582,582,582,582,582', +'582,582,,,,,,,,,,582,,,582,582,582,582,582,582,582,582,582,582,,582', +'582,582,582,582,,,,,,,,,,,,,,,,,,,,582,,,582,,,582,582,,,582,,582,,582', +',582,,,,,,,,582,,,,,582,582,582,582,582,582,,,,582,582,586,586,586,', +'586,,,,586,586,,,,586,,586,586,586,586,586,586,586,,,,,586,586,586,586', +'586,586,586,,,,,,,,,,586,,,586,586,586,586,586,586,586,586,586,586,', +'586,586,586,586,586,,,,,,,,,,,,,,,,,,,,586,,,586,,,586,586,,,586,,,', +',,586,,,,,,,,586,,,,,586,586,586,586,586,586,,,,586,586,614,614,614', +',614,,,,614,614,,,,614,,614,614,614,614,614,614,614,,,,,614,614,614', +'614,614,614,614,,,,,,,,,,614,,,614,614,614,614,614,614,614,614,614,614', +',614,614,614,614,614,,,,,,,,,,,,,,,,,,,,614,,,614,,,614,614,,,614,,', +',,,614,,,,,,,,614,,,,,614,614,614,614,614,614,,,,614,614,630,630,630', +',630,,,,630,630,,,,630,,630,630,630,630,630,630,630,,,,,630,630,630', +'630,630,630,630,,,,,,,,,,630,,,630,630,630,630,630,630,630,630,630,630', +',630,630,630,630,630,,,,,,,,,,,,,,,,,,,,630,,,630,,,630,630,,,630,,', +',,,630,,,,,,,,630,,,,,630,630,630,630,630,630,,,,630,630,636,636,636', +',636,,,,636,636,,,,636,,636,636,636,636,636,636,636,,,,,636,636,636', +'636,636,636,636,,,636,,,,,,,636,,,636,636,636,636,636,636,636,636,636', +'636,,636,636,636,636,636,,,,,,,,,,,,,,,,,,,,636,,,636,,,636,636,,,636', +',,,,,636,,,,,,,,636,,,,,636,636,636,636,636,636,,,,636,636,681,681,681', +',681,,,,681,681,,,,681,,681,681,681,681,681,681,681,,,,,681,681,681', +'681,681,681,681,,,,,,,,,,681,,,681,681,681,681,681,681,681,681,681,681', +',681,681,681,681,681,,,,,,,,,,,,,,,,,,,,681,,,681,,,681,681,,,681,,', +',,,681,,,,,,,,681,,,,,681,681,681,681,681,681,,,,681,681,682,682,682', +',682,,,,682,682,,,,682,,682,682,682,682,682,682,682,,,,,682,682,682', +'682,682,682,682,,,,,,,,,,682,,,682,682,682,682,682,682,682,682,682,682', +',682,682,682,682,682,,,,,,,,,,,,,,,,,,,,682,,,682,,,682,682,,,682,,', +',,,682,,,,,,,,682,,,,,682,682,682,682,682,682,,,,682,682,692,692,692', +',692,,,,692,692,,,,692,,692,692,692,692,692,692,692,,,,,692,692,692', +'692,692,692,692,,,,,,,,,,692,,,692,692,692,692,692,692,692,692,692,692', +',692,692,692,692,692,,,,,,,,,,,,,,,,,,,,692,,,692,,,692,692,,,692,,', +',,,692,,,,,,,,692,,,,,692,692,692,692,692,692,,,,692,692,693,693,693', +',693,,,,693,693,,,,693,,693,693,693,693,693,693,693,,,,,693,693,693', +'693,693,693,693,,,,,,,,,,693,,,693,693,693,693,693,693,693,693,693,693', +',693,693,693,693,693,,,,,,,,,,,,,,,,,,,,693,,,693,,,693,693,,,693,,', +',,,693,,,,,,,,693,,,,,693,693,693,693,693,693,,,,693,693,694,694,694', +',694,,,,694,694,,,,694,,694,694,694,694,694,694,694,,,,,694,694,694', +'694,694,694,694,,,,,,,,,,694,,,694,694,694,694,694,694,694,694,694,694', +',694,694,694,694,694,,,,,,,,,,,,,,,,,,,,694,,,694,,,694,694,,,694,,', +',,,694,,,,,,,,694,,,,,694,694,694,694,694,694,,,,694,694,700,700,700', +',700,,,,700,700,,,,700,,700,700,700,700,700,700,700,,,,,700,700,700', +'700,700,700,700,,,,,,,,,,700,,,700,700,700,700,700,700,700,700,700,700', +',700,700,,,700,,239,239,239,239,239,239,239,239,239,239,239,,239,239', +',,239,239,700,,,700,,,700,700,,,700,,,,239,,239,,239,239,239,239,239', +'239,239,,239,,,700,700,700,700,700,700,,,,700,700,706,706,706,239,706', +',,,706,706,,,,706,,706,706,706,706,706,706,706,,,,,706,706,706,706,706', +'706,706,,,,,,,,,,706,,,706,706,706,706,706,706,706,706,706,706,,706', +'706,706,706,706,,,,,,,,,,,,,,,,,,,,706,,,706,,,706,706,,,706,,706,,706', +',706,,,,,,,,706,,,,,706,706,706,706,706,706,,,,706,706,715,715,715,', +'715,,,,715,715,,,,715,,715,715,715,715,715,715,715,,,,,715,715,715,715', +'715,715,715,,,,,,,,,,715,,,715,715,715,715,715,715,715,715,715,715,', +'715,715,715,715,715,,,,,,,,,,,,,,,,,,,,715,,,715,,,715,715,,,715,,715', +',715,,715,,,,,,,,715,,,,,715,715,715,715,715,715,,,,715,715,717,717', +'717,,717,,,,717,717,,,,717,,717,717,717,717,717,717,717,,,,,717,717', +'717,717,717,717,717,,,,,,,,,,717,,,717,717,717,717,717,717,717,717,717', +'717,,717,717,717,717,717,,,,,,,,,,,,,,,,,,,,717,,,717,,,717,717,,,717', +',717,,717,,717,,,,,,,,717,,,,,717,717,717,717,717,717,,,,717,717,730', +'730,730,,730,,,,730,730,,,,730,,730,730,730,730,730,730,730,,,,,730', +'730,730,730,730,730,730,,,,,,,,,,730,,,730,730,730,730,730,730,730,730', +'730,730,,730,730,,,730,,684,684,684,684,684,684,684,684,684,684,684', +',684,684,,,684,684,730,,,730,,,730,730,,,730,,,,684,,684,,684,684,684', +'684,684,684,684,,684,,,730,730,730,730,730,730,,,,730,730,736,736,736', +'684,736,,,,736,736,,,,736,,736,736,736,736,736,736,736,,,,,736,736,736', +'736,736,736,736,,,736,,,,,,,736,,,736,736,736,736,736,736,736,736,736', +'736,,736,736,736,736,736,,,,,,,,,,,,,,,,,,,,736,,,736,,,736,736,,,736', +',,,,,736,,,,,,,,736,,,,,736,736,736,736,736,736,,,,736,736,742,742,742', +',742,,,,742,742,,,,742,,742,742,742,742,742,742,742,,,,,742,742,742', +'742,742,742,742,,,,,,,,,,742,,,742,742,742,742,742,742,742,742,742,742', +',742,742,742,742,742,,,,,,,,,,,,,,,,,,,,742,,,742,,,742,742,,,742,,742', +',,,742,,,,,,,,742,,,,,742,742,742,742,742,742,,,,742,742,761,761,761', +',761,,,,761,761,,,,761,,761,761,761,761,761,761,761,,,,,761,761,761', +'761,761,761,761,,,,,,,,,,761,,,761,761,761,761,761,761,761,761,761,761', +',761,761,761,761,761,,,,,,,,,,,,,,,,,,,,761,,,761,,,761,761,,,761,,', +',,,761,,,,,,,,761,,,,,761,761,761,761,761,761,,,,761,761,770,770,770', +',770,,,,770,770,,,,770,,770,770,770,770,770,770,770,,,,,770,770,770', +'770,770,770,770,,,,,,,,,,770,,,770,770,770,770,770,770,770,770,770,770', +',770,770,770,770,770,,,,,,,,,,,,,,,,,,,,770,,,770,,,770,770,,,770,,', +',,,770,,,,,,,,770,,,,,770,770,770,770,770,770,,,,770,770,771,771,771', +',771,,,,771,771,,,,771,,771,771,771,771,771,771,771,,,,,771,771,771', +'771,771,771,771,,,,,,,,,,771,,,771,771,771,771,771,771,771,771,771,771', +',771,771,,,771,,,,,,,,,,,,,,,,,,,,771,,,771,,,771,771,,,771,,771,,771', +',,,,,,,,,,,,,,771,771,771,771,771,771,,,,771,771,782,782,782,,782,,', +',782,782,,,,782,,782,782,782,782,782,782,782,,,,,782,782,782,782,782', +'782,782,,,,,,,,,,782,,,782,782,782,782,782,782,782,782,782,782,,782', +'782,782,782,782,,,,,,,,,,,,,,,,,,,,782,,,782,,,782,782,,,782,,,,,,782', +',,,,,,,782,,,,,782,782,782,782,782,782,,,,782,782,788,788,788,,788,', +',,788,788,,,,788,,788,788,788,788,788,788,788,,,,,788,788,788,788,788', +'788,788,,,,,,,,,,788,,,788,788,788,788,788,788,788,788,788,788,,788', +'788,788,788,788,,,,,,,,,,,,,,,,,,,,788,,,788,,,788,788,,,788,,,,,,788', +',,,,,,,788,,,,,788,788,788,788,788,788,,,,788,788,790,790,790,,790,', +',,790,790,,,,790,,790,790,790,790,790,790,790,,,,,790,790,790,790,790', +'790,790,,,,,,,,,,790,,,790,790,790,790,790,790,790,790,790,790,,790', +'790,790,790,790,,,,,,,,,,,,,,,,,,,,790,,,790,,,790,790,,,790,,,,,,790', +',,,,,,,790,,,,,790,790,790,790,790,790,,,,790,790,804,804,804,,804,', +',,804,804,,,,804,,804,804,804,804,804,804,804,,,,,804,804,804,804,804', +'804,804,,,,,,,,,,804,,,804,804,804,804,804,804,804,804,804,804,,804', +'804,804,804,804,,,,,,,,,,,,,,,,,,,,804,,,804,,,804,804,,,804,,,,,,804', +',,,,,,,804,,,,,804,804,804,804,804,804,,,,804,804,822,822,822,,822,', +',,822,822,,,,822,,822,822,822,822,822,822,822,,,,,822,822,822,822,822', +'822,822,,,,,,,,,,822,,,822,822,822,822,822,822,822,822,822,822,,822', +'822,,,822,,679,679,679,679,679,679,679,679,679,679,679,,679,679,,,679', +'679,822,,,822,,,822,822,,,822,,,,679,,679,,679,679,679,679,679,679,679', +',679,,,822,822,822,822,822,822,,,,822,822,824,824,824,679,824,,,,824', +'824,,,,824,,824,824,824,824,824,824,824,,,,,824,824,824,824,824,824', +'824,,,,,,,,,,824,,,824,824,824,824,824,824,824,824,824,824,,824,824', +'824,824,824,,,,,,,,,,,,,,,,,,,,824,,,824,,,824,824,,,824,,824,,,,824', +',,,,,,,824,,,,,824,824,824,824,824,824,,,,824,824,829,829,829,,829,', +',,829,829,,,,829,,829,829,829,829,829,829,829,,,,,829,829,829,829,829', +'829,829,,,,,,,,,,829,,,829,829,829,829,829,829,829,829,829,829,,829', +'829,,,829,,376,376,376,376,376,376,376,376,376,376,376,,376,376,,,376', +'376,829,,,829,,,829,829,,,829,,,,376,,376,,376,376,376,376,376,376,376', +',376,,,829,829,829,829,829,829,,,,829,829,834,834,834,376,834,,,,834', +'834,,,,834,,834,834,834,834,834,834,834,,,,,834,834,834,834,834,834', +'834,,,,,,,,,,834,,,834,834,834,834,834,834,834,834,834,834,,834,834', +'834,834,834,,,,,,,,,,,,,,,,,,,,834,,,834,,,834,834,,,834,,834,,834,', +'834,,,,,,,,834,,,,,834,834,834,834,834,834,,,,834,834,837,837,837,,837', +',,,837,837,,,,837,,837,837,837,837,837,837,837,,,,,837,837,837,837,837', +'837,837,,,,,,,,,,837,,,837,837,837,837,837,837,837,837,837,837,,837', +'837,837,837,837,,,,,,,,,,,,,,,,,,,,837,,,837,,,837,837,,,837,,837,,837', +',837,,,,,,,,837,,,,,837,837,837,837,837,837,,,,837,837,863,863,863,', +'863,,,,863,863,,,,863,,863,863,863,863,863,863,863,,,,,863,863,863,863', +'863,863,863,,,,,,,,,,863,,,863,863,863,863,863,863,863,863,863,863,', +'863,863,,,863,,769,769,769,769,769,769,769,769,769,769,769,,769,769', +',,769,769,863,,,863,,,863,863,,,863,,,,769,,769,,769,769,769,769,769', +'769,769,,769,,,863,863,863,863,863,863,,,,863,863,866,866,866,769,866', +',,,866,866,,,,866,,866,866,866,866,866,866,866,,,,,866,866,866,866,866', +'866,866,,,,,,,,,,866,,,866,866,866,866,866,866,866,866,866,866,,866', +'866,866,866,866,,,,,,,,,,,,,,,,,,,,866,,,866,,,866,866,,,866,,,,,,866', +',,,,,,,866,,,,,866,866,866,866,866,866,,,,866,866,869,869,869,,869,', +',,869,869,,,,869,,869,869,869,869,869,869,869,,,,,869,869,869,869,869', +'869,869,,,,,,,,,,869,,,869,869,869,869,869,869,869,869,869,869,,869', +'869,869,869,869,,,,,,,,,,,,,,,,,,,,869,,,869,,,869,869,,,869,,,,,,869', +',,,,,,,869,,,,,869,869,869,869,869,869,,,,869,869,877,877,877,,877,', +',,877,877,,,,877,,877,877,877,877,877,877,877,,,,,877,877,877,877,877', +'877,877,,,,,,,,,,877,,,877,877,877,877,877,877,877,877,877,877,,877', +'877,,,877,,390,390,390,390,390,390,390,390,390,390,390,,390,390,,,390', +'390,877,,,877,,,877,877,,,877,,,,390,,390,,390,390,390,390,390,390,390', +',390,,,877,877,877,877,877,877,,,,877,877,882,882,882,390,882,,,,882', +'882,,,,882,,882,882,882,882,882,882,882,,,,,882,882,882,882,882,882', +'882,,,,,,,,,,882,,,882,882,882,882,882,882,882,882,882,882,,882,882', +'882,882,882,,,,,,,,,,,,,,,,,,,,882,,,882,,,882,882,,,882,,882,,882,', +'882,,,,,,,,882,,,,,882,882,882,882,882,882,,,,882,882,888,888,888,,888', +',,,888,888,,,,888,,888,888,888,888,888,888,888,,,,,888,888,888,888,888', +'888,888,,,,,,,,,,888,,,888,888,888,888,888,888,888,888,888,888,,888', +'888,,,888,,602,602,602,602,602,602,602,602,602,602,602,,602,602,,,602', +'602,888,,,888,,,888,888,,,888,,,,602,,602,,602,602,602,602,602,602,602', +',602,,,888,888,888,888,888,888,,,,888,888,891,891,891,602,891,,,,891', +'891,,,,891,,891,891,891,891,891,891,891,,,,,891,891,891,891,891,891', +'891,,,,,,,,,,891,,,891,891,891,891,891,891,891,891,891,891,,891,891', +'891,891,891,,,,,,,,,,,,,,,,,,,,891,,,891,,,891,891,,,891,,,,,,891,,', +',,,,,891,,,,,891,891,891,891,891,891,,,,891,891,64,64,64,64,64,64,64', +'64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,,,64,64,64,64,64', +'64,64,64,64,64,,,,,,64,64,64,64,64,64,64,64,64,64,64,64,,,,,,64,64,', +'64,64,64,64,,64,64,,,64,,,,,64,64,64,64,,,,,,64,,,,,,,,64,64,,64,64', +'64,64,64,64,64,64,64,,64,,,64,666,666,666,666,666,666,666,666,666,666', +'666,666,666,666,666,666,666,666,666,666,666,666,666,666,,,666,666,666', +'666,666,666,666,666,666,666,,,,,,666,666,666,666,666,666,666,666,,,666', +',,,,,,666,666,,666,666,666,666,,666,666,,,666,,,,,666,666,666,666,,', +',,,,,,,,,,,666,666,,666,666,666,666,666,666,666,666,666,,666,,,666,583', +'583,583,583,583,583,583,583,583,583,583,,583,583,,,583,583,,,,583,,', +',,,,,,,,583,,583,,583,583,583,583,583,583,583,,583,,,,,,,,,,,,,,,,,583', +',583,425,425,425,425,425,425,425,425,425,425,425,,425,425,,,425,425', +',,,,,,,,,,,,,,425,,425,,425,425,425,425,425,425,425,,425,,,,,,,,393', +'393,,,393,,,,,425,425,393,393,,393,393,393,393,,393,393,,,393,,,,,393', +'393,393,393,,,,,,,,,,,,,,393,393,,393,393,393,393,393,393,393,393,393', +',393,501,501,393,,501,,,,,,,501,501,,501,501,501,501,,501,501,,,501', +',,,,501,501,501,501,,,,,,,,,,,,,,501,501,,501,501,501,501,501,501,501', +'501,501,,501,507,507,501,,507,,,,,,,507,507,,507,507,507,507,,507,507', +',,507,,,,,507,507,507,507,,,,,,,,,,,,,,507,507,,507,507,507,507,507', +'507,507,507,507,,507,509,509,507,,509,,,,,,,509,509,,509,509,509,509', +',509,509,,,509,,,,,509,509,509,509,,,,,,,,,,,,,,509,509,,509,509,509', +'509,509,509,509,509,509,,509,468,468,509,,468,,,,,,,468,468,,468,468', +'468,468,,468,468,,,468,,,,,468,468,468,468,,,,,,,,,,,,,,468,468,,468', +'468,468,468,468,468,468,468,468,,468,469,469,468,,469,,,,,,,469,469', +',469,469,469,469,,469,469,,,469,,,,,469,469,469,469,,,,,,,,,,,,,,469', +'469,,469,469,469,469,469,469,469,469,469,,469,,,469,733,733,733,733', +'733,733,733,733,733,733,733,,733,733,,,733,733,,,,,,,,,,,,,,,733,,733', +',733,733,733,733,733,733,733,,733,,,,,,,253,253,,,253,,,,,733,733,253', +'253,,253,253,253,253,,253,253,,,253,,,,,253,253,253,253,,,,,,,,,,,,', +',253,253,,253,253,253,253,253,253,253,253,253,,253,254,254,253,,254', +',,,,,,254,254,,254,254,254,254,,254,254,,,254,,,,,254,254,254,254,,', +',,,,,,,,,,,254,254,,254,254,254,254,254,254,254,254,254,,254,194,194', +'254,,194,,,,,,,194,194,,194,194,194,194,,194,194,,,194,,,,,194,194,194', +'194,,,,,,,,,,,,,,194,194,,194,194,194,194,194,194,194,194,194,,194,825', +'825,194,,825,,,,,,,825,825,,825,825,825,825,,825,825,,,825,,,,,825,825', +'825,825,,,,,,,,,,,,,,825,825,,825,825,825,825,825,825,825,825,825,,825', +'460,460,825,,460,,,,,,,460,460,,460,460,460,460,,460,460,,,460,,,,,460', +'460,460,460,,,,,,,,,,,,,,460,460,,460,460,460,460,460,460,460,460,460', +',460,826,826,460,,826,,,,,,,826,826,,826,826,826,826,,826,826,,,826', +',,,,826,826,826,826,,,,,,,,,,,,,,826,826,,826,826,826,826,826,826,826', +'826,826,,826,459,459,826,,459,,,,,,,459,459,,459,459,459,459,,459,459', +',,459,,,,,459,459,459,459,,,,,,,,,,,,,,459,459,,459,459,459,459,459', +'459,459,459,459,,459,500,500,459,,500,,,,,,,500,500,,500,500,500,500', +',500,500,,,500,,,,,500,500,500,500,,,,,,,,,,,,,,500,500,,500,500,500', +'500,500,500,500,500,500,,500,394,394,500,,394,,,,,,,394,394,,394,394', +'394,394,,394,394,,,394,,,,,394,394,394,394,,,,,,,,,,,,,,394,394,,394', +'394,394,394,394,394,394,394,394,,394,580,580,394,,580,,,,,,,580,580', +',580,580,580,580,,580,580,,,580,,,,,580,580,580,580,,,,,,,,,,,,,,580', +'580,,580,580,580,580,580,580,580,580,580,,580,195,195,580,,195,,,,,', +',195,195,,195,195,195,195,,195,195,,,195,,,,,195,195,195,195,,,,,,,', +',,,,,,195,195,,195,195,195,195,195,195,195,195,195,,195,581,581,195', +',581,,,,,,,581,581,,581,581,581,581,,581,581,,,581,,,,,581,581,581,581', +',,,,,,,,,,,,,581,581,,581,581,581,581,581,581,581,581,581,,581,,,581', +'482,482,482,482,482,482,482,482,482,482,482,,482,482,,,482,482,,,,,', +',,,,,,,,,482,,482,,482,482,482,482,482,482,482,,482,,19,19,19,19,19', +'19,19,19,19,19,19,,19,19,482,482,19,19,,,,,,,,,,,,,,,19,,19,,19,19,19', +'19,19,19,19,,19,,,,,,,,,,,,,,,,,19' ] + racc_action_check = arr = ::Array.new(24171, nil) + idx = 0 + clist.each do |str| + str.split(',', -1).each do |i| + arr[idx] = i.to_i unless i.empty? + idx += 1 + end + end + +racc_action_pointer = [ + 2575, 903, nil, 166, 877, 4872, 4992, 5112, 565, 497, + 857, 839, 880, 409, 220, 244, nil, 5224, 5344, 24046, + 832, nil, 5464, 5584, 5704, 343, 158, 5824, 5944, nil, + 1244, 6064, 6184, nil, 636, 297, 684, 315, 6304, 6424, + 6544, 552, 420, nil, nil, nil, nil, nil, nil, nil, + 288, 3180, 6664, 6784, 6904, 53, 7024, 7144, nil, nil, + 750, 7264, 7384, 7504, 22608, nil, nil, nil, nil, nil, + nil, nil, -94, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 7624, nil, nil, nil, 7744, nil, + nil, nil, nil, nil, nil, nil, nil, 620, nil, 877, + nil, nil, nil, 7864, 7984, 8104, 8224, 8344, 994, nil, + 416, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 110, nil, 1849, 1970, + 8464, 8584, 8704, 8824, 23421, 23893, 8944, 9064, 9184, nil, + 794, 111, 924, 70, 756, 806, 3059, nil, nil, 9304, + 9424, 9544, 9664, 9784, 9904, 10024, 10144, 10264, 10384, 10504, + 10624, 10744, 10864, 10984, 11104, 11224, 11344, 11464, 11584, 11704, + 11824, 11944, 12064, 12184, 12304, 12424, nil, nil, nil, 19489, + nil, 838, 841, 12544, nil, 12664, 886, nil, nil, nil, + nil, nil, nil, 23303, 23362, 879, 12784, 12904, nil, nil, + nil, nil, nil, nil, nil, 13024, 887, 2938, 895, 897, + 859, 13144, 2817, 434, 619, 934, 621, 908, 872, 137, + nil, 910, 380, nil, nil, 193, 939, 941, 627, nil, + 943, nil, 13264, nil, 1003, 1002, 551, nil, 914, 327, + 429, 13384, 948, 411, 931, 400, nil, 565, -7, 10, + 13504, 13624, 216, 149, 914, 1, 674, 990, -18, 1030, + nil, nil, 371, 374, -20, nil, 753, nil, 9, 13744, + nil, nil, 211, 203, -23, -44, -47, 267, 493, 392, + nil, 344, nil, 13864, nil, 199, 189, -33, 145, -37, + 215, nil, 913, nil, nil, nil, nil, nil, nil, 13984, + nil, nil, nil, nil, -56, -21, nil, nil, 750, nil, + -30, 4752, nil, 62, nil, nil, 21409, 113, 317, -72, + 14096, nil, nil, 106, 131, 0, nil, 14216, 14336, nil, + 22129, nil, nil, 22895, 23775, 14456, 114, 14576, 14696, 14816, + 1607, 2091, 572, 490, 204, 218, 227, 246, 2817, 2938, + 3059, 2575, 2454, 1849, 2696, 2212, 1244, 1365, 1486, 1728, + 1970, 396, 482, 2333, 997, 22829, 220, nil, 14936, nil, + 15056, 256, nil, 15176, 212, nil, nil, 394, nil, nil, + 332, 298, -62, 325, 429, nil, nil, 15296, 95, 170, + 413, nil, 422, 392, nil, nil, nil, 459, 15416, 23657, + 23539, 866, 470, nil, nil, 15536, 15656, 15776, 23131, 23190, + 7265, 15896, 583, 16016, nil, 484, nil, nil, 16136, nil, + nil, 16256, 24000, nil, 16376, nil, nil, nil, 4632, 615, + nil, nil, 4269, 67, 114, 612, 620, 4148, 16496, 16616, + 23716, 22954, 26, nil, nil, 373, nil, 23013, 16736, 23072, + nil, nil, 16856, 314, -34, 3543, 927, nil, nil, nil, + -32, nil, nil, nil, 524, nil, nil, nil, 520, nil, + 141, nil, nil, 516, nil, nil, 16976, nil, nil, 17088, + 17208, nil, 315, 17328, 17448, 575, nil, nil, 17568, 577, + nil, 17688, -37, -31, 630, 510, 585, 1118, 17808, 17928, + nil, 2212, 18048, 571, nil, 620, 18168, nil, 622, nil, + 611, nil, nil, nil, nil, nil, -50, nil, 623, 633, + 23834, 23952, 18288, 22765, 143, 599, 18408, nil, 648, nil, + 2091, 1728, nil, -70, nil, 647, 38, 144, 654, 341, + 860, 661, 22369, 686, 694, 24, 750, nil, 1607, 637, + 701, nil, nil, 699, 18528, nil, nil, 18, nil, 774, + nil, nil, nil, nil, nil, 780, nil, 781, 665, 11, + 18648, 704, 23, 4, 24, -9, 18768, 257, 529, nil, + 716, 4027, 248, nil, nil, 819, 3906, 560, 222, 707, + 710, 711, nil, nil, nil, nil, nil, 712, nil, nil, + nil, nil, 795, nil, nil, 797, 22717, 771, nil, nil, + nil, nil, nil, 3422, nil, nil, nil, nil, nil, 21169, + 734, 18888, 19008, nil, 19969, nil, 13145, nil, nil, 7505, + nil, 7385, 19128, 19248, 19368, 191, 6185, nil, 751, 1118, + 19488, nil, 785, 882, 775, nil, 19608, 778, 2454, nil, + nil, 826, 827, 110, 915, 19728, nil, 19848, 819, nil, + 861, 840, 948, 388, nil, nil, 2333, nil, nil, 32, + 19968, nil, nil, 23238, 951, nil, 20088, 952, 1486, 1365, + nil, nil, 20208, 4511, nil, 25, 132, nil, 964, nil, + 4390, nil, 1000, 915, nil, 453, nil, 216, nil, nil, + 439, 20328, nil, nil, nil, nil, 758, nil, nil, 21769, + 20448, 20568, 750, 812, 208, 296, 210, 246, nil, nil, + nil, nil, 20688, nil, 367, 464, 447, nil, 20808, 465, + 20928, nil, nil, nil, nil, nil, 3785, nil, nil, nil, + 31, nil, 608, 609, 21048, 202, nil, nil, 628, nil, + 551, 518, 520, nil, nil, 539, 537, nil, nil, 680, + nil, nil, 21168, 997, 21288, 23480, 23598, 649, 625, 21408, + 6065, nil, nil, nil, 21528, 670, nil, 21648, 743, 865, + 3664, nil, nil, nil, nil, nil, nil, 3301, nil, nil, + 391, nil, nil, nil, 2696, nil, 817, 848, 867, 384, + 197, 403, 613, 21768, nil, nil, 21888, 462, nil, 22008, + nil, nil, 391, 660, 570, 718, 697, 22128, 624, nil, + 258, nil, 22248, -81, nil, nil, nil, nil, 22368, nil, + nil, 22488, nil, nil, 468, nil ] + +racc_action_default = [ + -4, -499, -1, -487, -5, -499, -499, -499, -499, -499, + -499, -499, -499, -499, -271, -32, -33, -499, -499, -38, + -40, -41, -282, -315, -316, -45, -249, -363, -285, -58, + -4, -62, -67, -68, -499, -430, -499, -499, -499, -499, + -499, -489, -214, -264, -265, -266, -267, -268, -269, -270, + -477, -4, -499, -498, -469, -288, -499, -499, -292, -295, + -487, -499, -499, -499, -499, -317, -318, -320, -321, -383, + -384, -385, -386, -387, -401, -390, -403, -403, -394, -399, + -413, -403, -415, -416, -419, -420, -421, -422, -423, -424, + -425, -426, -427, -428, -429, -432, -433, -499, -3, -488, + -494, -495, -496, -499, -499, -499, -499, -499, -6, -8, + -499, -93, -94, -95, -96, -97, -98, -99, -100, -101, + -105, -106, -107, -108, -109, -110, -111, -112, -113, -114, + -115, -116, -117, -118, -119, -120, -121, -122, -123, -124, + -125, -126, -127, -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, -164, + -165, -166, -167, -168, -169, -170, -13, -102, -4, -4, + -499, -499, -499, -498, -499, -499, -499, -499, -499, -36, + -499, -430, -499, -271, -499, -499, -4, -37, -206, -499, + -499, -499, -499, -499, -499, -499, -499, -499, -499, -499, + -499, -499, -499, -499, -499, -499, -499, -499, -499, -499, + -499, -499, -499, -499, -499, -499, -353, -355, -42, -215, + -228, -258, -258, -499, -236, -499, -259, -282, -315, -316, + -472, -43, -44, -499, -499, -50, -498, -499, -287, -358, + -364, -366, -56, -362, -57, -499, -58, -4, -499, -499, + -63, -65, -4, -72, -499, -499, -79, -285, -489, -499, + -319, -363, -499, -66, -70, -278, -417, -418, -499, -191, + -192, -207, -499, -490, -375, -499, -274, -216, -489, -491, + -491, -499, -499, -491, -499, -491, -289, -39, -499, -499, + -499, -499, -487, -499, -488, -430, -499, -499, -271, -499, + -333, -334, -88, -89, -499, -91, -499, -271, -499, -499, + -430, -308, -93, -94, -131, -132, -148, -153, -160, -163, + -310, -499, -467, -499, -388, -499, -499, -499, -499, -499, + -499, 896, -7, -497, -14, -15, -16, -17, -18, -499, + -10, -11, -12, -103, -499, -499, -21, -29, -171, -259, + -499, -499, -22, -30, -31, -23, -173, -499, -478, -479, + -226, -480, -481, -478, -249, -479, -361, -483, -484, -28, + -180, -34, -35, -499, -499, -498, -278, -499, -499, -499, + -181, -182, -183, -184, -185, -186, -187, -188, -193, -194, + -195, -196, -197, -198, -199, -200, -201, -202, -203, -204, + -205, -208, -209, -210, -211, -499, -349, -229, -499, -231, + -499, -258, -256, -499, -249, -478, -479, -249, -48, -51, + -499, -489, -489, -258, -228, -250, -251, -252, -349, -349, + -499, -284, -499, -59, -276, -71, -64, -499, -498, -499, + -499, -78, -499, -417, -418, -499, -499, -499, -499, -499, + -212, -499, -498, -498, -273, -489, -217, -218, -493, -492, + -220, -493, -489, -280, -493, -471, -281, -470, -4, -322, + -323, -324, -4, -499, -499, -499, -499, -4, -499, -498, + -499, -499, -278, -301, -88, -89, -90, -499, -498, -499, + -304, -434, -499, -499, -499, -4, -447, -312, -485, -486, + -489, -389, -402, -405, -499, -407, -391, -404, -499, -393, + -499, -396, -398, -499, -414, -9, -499, -19, -20, -499, + -499, -263, -279, -499, -499, -52, -227, -359, -499, -54, + -360, -499, -478, -479, -482, -277, -499, -171, -499, -499, + -351, -4, -499, -258, -257, -260, -499, -473, -499, -235, + -499, -474, -46, -356, -47, -357, -349, -222, -499, -499, + -499, -499, -499, -38, -499, -258, -499, -248, -499, -254, + -4, -4, -283, -59, -69, -499, -478, -479, -226, -75, + -77, -499, -179, -189, -190, -499, -498, -331, -4, -376, + -498, -377, -378, -499, -499, -260, -221, -498, -325, -498, + -293, -326, -327, -328, -296, -499, -299, -499, -369, -499, + -499, -499, -478, -479, -482, -277, -499, -88, -89, -92, + -499, -4, -499, -436, -306, -499, -4, -447, -499, -466, + -466, -466, -446, -448, -449, -450, -451, -452, -453, -456, + -458, -459, -461, -462, -463, -499, -499, -499, -406, -409, + -410, -411, -412, -4, -392, -395, -397, -400, -104, -172, + -261, -499, -499, -25, -175, -26, -176, -53, -27, -177, + -55, -178, -499, -499, -499, -279, -213, -335, -337, -347, + -499, -350, -499, -499, -258, -233, -499, -258, -4, -223, + -224, -226, -226, -489, -499, -499, -241, -499, -258, -253, + -499, -499, -499, -73, -286, -2, -4, -382, -332, -499, + -499, -380, -275, -489, -499, -329, -499, -499, -4, -4, + -298, -300, -499, -4, -371, -279, -499, -279, -499, -435, + -4, -309, -499, -489, -438, -499, -442, -499, -444, -445, + -499, -499, -460, -464, -313, -468, -499, -262, -24, -174, + -499, -338, -80, -499, -499, -87, -346, -499, -348, -352, + -354, -230, -499, -232, -499, -499, -258, -238, -499, -258, + -499, -247, -255, -365, -367, -381, -4, -379, -219, -290, + -499, -291, -499, -499, -499, -498, -302, -305, -499, -311, + -499, -466, -466, -454, -465, -466, -499, -457, -455, -447, + -408, -336, -499, -343, -498, -499, -499, -86, -499, -499, + -258, -49, -225, -237, -499, -258, -243, -499, -258, -375, + -4, -294, -297, -370, -368, -372, -373, -4, -307, -437, + -499, -440, -441, -443, -4, -339, -342, -499, -499, -82, + -84, -83, -85, -499, -345, -234, -499, -258, -239, -499, + -242, -374, -498, -499, -466, -499, -499, -499, -81, -344, + -258, -244, -499, -258, -330, -303, -439, -314, -499, -341, + -240, -499, -245, -340, -258, -246 ] + +clist = [ +'35,340,302,295,270,35,472,280,280,442,114,114,488,492,606,10,439,98', +'102,283,10,646,567,207,734,2,244,244,244,440,35,273,273,496,652,259', +'263,280,280,280,506,240,240,240,268,10,817,109,187,119,119,35,266,380', +'384,269,522,117,117,531,311,315,330,330,330,108,10,739,114,367,374,636', +'298,567,313,102,320,242,242,242,573,620,624,575,847,292,346,347,756', +'758,759,350,812,199,815,241,241,241,561,35,308,309,477,480,312,641,485', +'35,487,305,328,331,434,437,10,750,238,251,252,515,590,591,10,516,666', +'819,698,303,296,702,426,448,307,307,449,629,307,844,610,817,729,344', +'377,345,348,530,349,354,355,356,357,668,255,262,264,673,753,811,813', +'352,725,737,576,536,1,652,359,358,321,186,589,445,588,720,342,304,306', +'99,319,307,307,307,307,510,341,517,475,874,35,35,310,738,,,,366,372', +'375,,388,,389,,10,10,,35,,,,,,298,364,365,625,,,,,,10,,639,,,,,,,,269', +',,,,,,,,,676,,,,607,612,280,708,,851,852,380,384,853,,,,456,,244,244', +',370,370,,,35,,244,,273,35,391,392,444,240,,,884,,452,10,,240,,457,10', +'259,266,263,,269,,266,,,269,567,,,,,,,,687,,,567,690,242,242,886,,,', +',,601,242,,462,,854,,495,102,601,443,241,,,743,806,713,,652,241,,,,476', +'511,556,,,845,,,441,446,611,,493,494,,573,575,450,601,,,114,,,601,,', +',,,,,,,,,,727,,,,731,,,307,307,,,607,,607,550,,,,,388,,535,,119,,,514', +',595,,,117,,,,298,,,,,520,,,,,,,,,,567,,,,796,,,,,13,711,712,,,13,,', +',,631,,,587,,,,200,200,640,,,200,200,200,,388,,,645,13,274,274,429,', +'388,567,,,298,,,,,,563,,578,579,,35,13,200,200,35,,200,200,,35,200,316', +'326,326,585,10,840,388,545,10,621,621,549,388,10,617,,35,,619,298,613', +',,627,296,,846,616,298,643,644,10,,697,,,280,,13,,,114,200,200,200,200', +'13,370,605,683,685,,871,,688,,,642,,,273,572,35,,574,667,,,,,,,628,', +',,,10,678,607,119,,,,,,,703,117,307,,35,35,,748,,,,,752,,,714,,764,', +'10,10,,35,,550,,,,,721,722,,,,,,,10,,,13,13,200,200,200,200,,728,200', +'200,200,563,,,,35,,,13,607,35,,,,,,,,,,10,749,,,569,10,,754,,,,,,,114', +',,35,,280,280,,,,746,,,,,601,,768,10,,,,,,200,200,,,766,772,772,,808', +'200,,13,280,,35,274,13,,307,,776,778,,,,787,,,,10,,,35,,,,772,,,784', +',,,,35,35,,10,,35,821,797,,280,200,200,35,795,,10,10,,,785,10,,,621', +',802,803,10,,200,805,,789,273,,858,,,,798,,,800,200,,,,,,,786,,,,705', +',,,35,810,280,280,,,,,,280,875,,,,,10,307,,716,,,,,,14,839,772,772,', +'14,,,,772,388,,,200,,,,855,856,280,35,,,298,864,,,35,,,14,276,276,280', +'35,10,,,,,,,10,772,280,872,,,,10,,14,873,,,,,772,879,,,318,327,327,', +'200,,,772,867,,,889,,,,200,,,,,,,893,,,,,,200,,,,,,,,,,14,,,,,,,13,14', +',,13,,,781,,13,783,200,,,,,,,,,200,791,,,200,,,13,,,,,,,,,,,,,,,,,,', +',,,,,,,,,200,200,,,,200,,,,,,,,,,,274,,13,,,,,,,,,14,14,,,,,,833,,,836', +',200,,,,,,14,,13,13,,,,,,,,,,,,,,,,,13,,,,,,,,,,,,,865,,,,,868,,,870', +',,,,,,200,,,,,13,,,,,13,,,14,,,,276,14,,,,881,,12,,,,,12,,,,,,890,,13', +'892,,,,,,,,200,,,895,,,,,12,,,,,,,,,773,773,,,,,,,,13,,,12,,,,,,,,,', +',,,,,13,,,,773,,,,,,200,,13,13,,,,13,,,,,,,13,,,,,,,,,12,,,,,,,,12,', +',,274,,,,,,,,,,,,,,,,,,,,,,,,,13,,,,,,,,,,,,,,,,,,,,,,,,,,773,773,200', +',,,,773,,,,,,,,,,,13,,,,,,,13,12,12,,,,,13,,,,,,,,,773,,,12,,,,14,,', +',14,,,773,,14,,,,,,,,,773,,,,,,,,,14,,,,,,,,,672,,,,,,,,,,,,,,,,,,,', +',12,,,,,12,,,,,,,,,276,,14,,,,,,,,,,,,,,,,,,,,,,,,,,,,,14,14,,,,,,,', +',,,,,,,,,14,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,14,,,,,14,,,,,,,,,,,,,,', +',,,,,,,,,,,,14,,,,,,,,,,,,,,,,,,,,,,,,,208,775,775,,239,239,239,,,,14', +',,,,,,,,,289,290,291,,,,,,14,,,,775,,,239,239,,,,14,14,,,,14,,,,,,,14', +',,,,,,,,,,,,,,,12,,,,12,276,,,,12,,,,,,,,,,,,,,,,,,12,,,14,,,,,,,,,', +',,,,,,,,,,,,,,,,775,775,,,,,,775,,,,,,,,,,12,14,,,,,,,14,,,,,,,14,,', +',,,,,,775,,,,,12,12,368,239,376,239,,,390,775,,,,,,,,,12,,775,208,400', +'401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417', +'418,419,420,421,422,423,424,425,,,,12,,,,239,12,239,,,,,,,,,,,239,239', +',,,,,,,239,,,,,,12,,,,,,,,,,,,,,,,,,,,,470,,,,,,,,,482,,,,,12,,,,,,', +',,,,,,,,,,,12,,,,,,,,,,,,12,12,,,,12,,,,,,,12,,,,,,,,,,,,,,,,,,,,,,', +'239,,,,,,,,,,,,,,,,,,,,,,,12,239,,390,557,376,,,,,,,,,,,,,,,,,,,,,,', +',,,,,,239,,239,,,239,,,,,12,,,,,,,12,,583,,,,,12,,,,,,239,,,,,,,602', +'603,604,,,,,,239,,,,,239,,,239,,,239,,,,,,,,,,,,,,239,239,,,,,,,,,239', +',,,26,,,,,26,,,,,,,,,,,,26,26,,,,26,26,26,,,679,239,,26,684,686,,,,689', +',,691,,,,,,,696,,,,239,26,26,26,239,,26,26,,,26,,,,,,,,,,239,,,,239', +',,,369,373,,,,,,,,,,,,,,,,,,,,26,,,733,26,26,26,26,26,,,,,,,,,,,239', +',,,,,,,,,,,,431,,432,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,239,769,,,,', +',,,,,684,686,689,,,,,,26,26,26,26,26,26,239,,26,26,26,,,,,239,,239,26', +',,,,,,,,,,,,,,,,,,,,,,,239,,,,,,,,,,,,,,,,,,,239,,,,,,,26,26,769,541', +',,,,,26,,26,,,830,,26,,,,239,,239,,,,,,,,,,,,,,239,,,,,,,,,,,,,,,,,', +'26,26,239,,,,565,,568,,,571,239,,,239,,,,26,,,,,,584,,,,,,,,26,,,,,', +',,,,,239,,,239,,,,609,,,,,615,,,568,239,,615,,,,,,,239,,,,,,,369,,,', +',,,,,26,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,680,,,,,,,,,,,,,,,,,,,26,,,704', +',,,707,,,,26,,,,,,,,,,,,565,26,,,718,,,,,,,,,,,,,,26,,,,26,,,,,26,,26', +',,,,,,,,26,,,,26,,,26,,,744,,,,,,,,,,,,,,,,,,,,,,,,,26,26,,,,26,,,,', +',,,,,,,,26,,,,,,,,767,,,,,,,,,,,,,26,,,,,,,,26,26,,,568,,,,,,,,,,,568', +',,26,,,,,,,,,,,,,,,,,,,,,,615,,,,,,26,,,,,26,,,,,26,,,818,,,,,,,,,,', +',,,,,,,,,,,,,26,,,835,,838,,,,26,,,,,,,,,,843,,,,,,,,,,,,,,,,26,,,,', +',,,,,,,,,565,,,568,26,,,,,,,,,,26,,26,26,,,,26,,,,,,,26,,,,880,,,883', +',,,,,,,,,,,,568,,,,,,,,,894,,,,,,,,,,,,,,,,,26,,,,,,,,,,,,,,,,,,,,,', +',,,,,,26,,,,,,,,,,,,,,,,26,,,,,,,26,,,,,,,26' ] + racc_goto_table = arr = ::Array.new(2867, nil) + idx = 0 + clist.each do |str| + str.split(',', -1).each do |i| + arr[idx] = i.to_i unless i.empty? + idx += 1 + end + end + +clist = [ +'41,44,19,3,39,41,4,52,52,29,45,45,76,76,5,14,32,8,83,40,14,85,133,15', +'77,2,60,60,60,53,41,41,41,79,128,57,57,52,52,52,42,26,26,26,37,14,130', +'11,11,49,49,41,36,30,30,2,119,48,48,119,91,41,41,41,41,9,14,92,45,21', +'21,93,26,133,8,83,14,56,56,56,58,78,78,58,94,51,116,116,127,127,127', +'116,126,23,126,54,54,54,33,41,13,13,55,55,13,95,55,41,55,56,43,43,30', +'30,14,96,28,28,28,97,33,33,14,98,99,100,101,54,23,102,104,106,23,23', +'107,108,23,109,110,130,111,114,19,115,117,118,120,13,13,13,13,121,31', +'31,31,122,123,125,129,9,6,5,34,50,1,128,24,9,16,12,61,62,64,65,72,73', +'74,10,80,23,23,23,23,82,86,87,88,126,41,41,89,90,,,,15,15,15,,45,,15', +',14,14,,41,,,,,,26,2,2,79,,,,,,14,,42,,,,,,,,2,,,,,,,,,,119,,,,53,53', +'52,33,,127,127,30,30,127,,,,40,,60,60,,54,54,,,41,,60,,41,41,23,23,26', +'26,,,77,,37,14,,26,,37,14,57,36,57,,2,,36,,,2,133,,,,,,,,32,,,133,32', +'56,56,127,,,,,,30,56,,51,,85,,8,83,30,54,54,,,76,78,29,,128,54,,,,51', +'83,19,,,5,,,28,28,21,,13,13,,58,58,28,30,,,45,,,30,,,,,,,,,,,,,53,,', +',53,,,23,23,,,53,,53,57,,,,,45,,11,,49,,,23,,19,,,48,,,,26,,,,,23,,', +',,,,,,,133,,,,76,,,,,18,30,30,,,18,,,,,19,,,60,,,,18,18,19,,,18,18,18', +',45,,,3,18,18,18,59,,45,133,,,26,,,,,,56,,51,51,,41,18,18,18,41,,18', +'18,,41,18,18,18,18,56,14,76,45,31,14,83,83,31,45,14,2,,41,,2,26,51,', +',2,23,,79,51,26,83,83,14,,39,,,52,,18,,,45,18,18,18,18,18,54,23,15,15', +',4,,15,,,13,,,41,31,41,,31,51,,,,,,,54,,,,,14,11,53,49,,,,,,,2,48,23', +',41,41,,3,,,,,3,,,26,,44,,14,14,,41,,57,,,,,2,2,,,,,,,14,,,18,18,18', +'18,18,18,,2,18,18,18,56,,,,41,,,18,53,41,,,,,,,,,,14,83,,,59,14,,83', +',,,,,,45,,,41,,52,52,,,,13,,,,,30,,15,14,,,,,,18,18,,,2,41,41,,3,18', +',18,52,,41,18,18,,23,,14,14,,,,60,,,,14,,,41,,,,41,,,2,,,,,41,41,,14', +',41,39,14,,52,18,18,41,2,,14,14,,,51,14,,,83,,2,2,14,,18,2,,56,41,,19', +',,,51,,,13,18,,,,,,,54,,,,59,,,,41,51,52,52,,,,,,52,3,,,,,14,23,,59', +',,,,,20,2,41,41,,20,,,,41,45,,,18,,,,14,14,52,41,,,26,14,,,41,,,20,20', +'20,52,41,14,,,,,,,14,41,52,2,,,,14,,20,2,,,,,41,14,,,20,20,20,,18,,', +'41,56,,,14,,,,18,,,,,,,14,,,,,,18,,,,,,,,,,20,,,,,,,18,20,,,18,,,59', +',18,59,18,,,,,,,,,18,59,,,18,,,18,,,,,,,,,,,,,,,,,,,,,,,,,,,,18,18,', +',,18,,,,,,,,,,,18,,18,,,,,,,,,20,20,,,,,,59,,,59,,18,,,,,,20,,18,18', +',,,,,,,,,,,,,,,,18,,,,,,,,,,,,,59,,,,,59,,,59,,,,,,,18,,,,,18,,,,,18', +',,20,,,,20,20,,,,59,,17,,,,,17,,,,,,59,,18,59,,,,,,,,18,,,59,,,,,17', +',,,,,,,,18,18,,,,,,,,18,,,17,,,,,,,,,,,,,,,18,,,,18,,,,,,18,,18,18,', +',,18,,,,,,,18,,,,,,,,,17,,,,,,,,17,,,,18,,,,,,,,,,,,,,,,,,,,,,,,,18', +',,,,,,,,,,,,,,,,,,,,,,,,,18,18,18,,,,,18,,,,,,,,,,,18,,,,,,,18,17,17', +',,,,18,,,,,,,,,18,,,17,,,,20,,,,20,,,18,,20,,,,,,,,,18,,,,,,,,,20,,', +',,,,,,20,,,,,,,,,,,,,,,,,,,,,17,,,,,17,,,,,,,,,20,,20,,,,,,,,,,,,,,', +',,,,,,,,,,,,,,20,20,,,,,,,,,,,,,,,,,20,,,,,,,,,,,,,,,,,,,,,,,,,,,,,', +',,,20,,,,,20,,,,,,,,,,,,,,,,,,,,,,,,,,,20,,,,,,,,,,,,,,,,,,,,,,,,,25', +'20,20,,25,25,25,,,,20,,,,,,,,,,25,25,25,,,,,,20,,,,20,,,25,25,,,,20', +'20,,,,20,,,,,,,20,,,,,,,,,,,,,,,,17,,,,17,20,,,,17,,,,,,,,,,,,,,,,,', +'17,,,20,,,,,,,,,,,,,,,,,,,,,,,,,,20,20,,,,,,20,,,,,,,,,,17,20,,,,,,', +'20,,,,,,,20,,,,,,,,,20,,,,,17,17,25,25,25,25,,,25,20,,,,,,,,,17,,20', +'25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25', +'25,25,25,25,,,,17,,,,25,17,25,,,,,,,,,,,25,25,,,,,,,,25,,,,,,17,,,,', +',,,,,,,,,,,,,,,,25,,,,,,,,,25,,,,,17,,,,,,,,,,,,,,,,,,17,,,,,,,,,,,', +'17,17,,,,17,,,,,,,17,,,,,,,,,,,,,,,,,,,,,,,25,,,,,,,,,,,,,,,,,,,,,,', +'17,25,,25,25,25,,,,,,,,,,,,,,,,,,,,,,,,,,,,,25,,25,,,25,,,,,17,,,,,', +',17,,25,,,,,17,,,,,,25,,,,,,,25,25,25,,,,,,25,,,,,25,,,25,,,25,,,,,', +',,,,,,,,25,25,,,,,,,,,25,,,,35,,,,,35,,,,,,,,,,,,35,35,,,,35,35,35,', +',25,25,,35,25,25,,,,25,,,25,,,,,,,25,,,,25,35,35,35,25,,35,35,,,35,', +',,,,,,,,25,,,,25,,,,22,22,,,,,,,,,,,,,,,,,,,,35,,,25,35,35,35,35,35', +',,,,,,,,,,25,,,,,,,,,,,,,22,,22,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,25', +'25,,,,,,,,,,25,25,25,,,,,,35,35,35,35,35,35,25,,35,35,35,,,,,25,,25', +'35,,,,,,,,,,,,,,,,,,,,,,,,25,,,,,,,,,,,,,,,,,,,25,,,,,,,35,35,25,22', +',,,,,35,,35,,,25,,35,,,,25,,25,,,,,,,,,,,,,,25,,,,,,,,,,,,,,,,,,35,35', +'25,,,,22,,22,,,22,25,,,25,,,,35,,,,,,22,,,,,,,,35,,,,,,,,,,,25,,,25', +',,,22,,,,,22,,,22,25,,22,,,,,,,25,,,,,,,22,,,,,,,,,35,,,,,,,,,,,,,,', +',,,,,,,,,,,,,,,,,,22,,,,,,,,,,,,,,,,,,,35,,,22,,,,22,,,,35,,,,,,,,,', +',,22,35,,,22,,,,,,,,,,,,,,35,,,,35,,,,,35,,35,,,,,,,,,35,,,,35,,,35', +',,22,,,,,,,,,,,,,,,,,,,,,,,,,35,35,,,,35,,,,,,,,,,,,,35,,,,,,,,22,,', +',,,,,,,,,,35,,,,,,,,35,35,,,22,,,,,,,,,,,22,,,35,,,,,,,,,,,,,,,,,,,', +',,22,,,,,,35,,,,,35,,,,,35,,,22,,,,,,,,,,,,,,,,,,,,,,,,35,,,22,,22,', +',,35,,,,,,,,,,22,,,,,,,,,,,,,,,,35,,,,,,,,,,,,,,22,,,22,35,,,,,,,,,', +'35,,35,35,,,,35,,,,,,,35,,,,22,,,22,,,,,,,,,,,,,22,,,,,,,,,22,,,,,,', +',,,,,,,,,,35,,,,,,,,,,,,,,,,,,,,,,,,,,,,35,,,,,,,,,,,,,,,,35,,,,,,,35', +',,,,,,35' ] + racc_goto_check = arr = ::Array.new(2867, nil) + idx = 0 + clist.each do |str| + str.split(',', -1).each do |i| + arr[idx] = i.to_i unless i.empty? + idx += 1 + end + end + +racc_goto_pointer = [ + nil, 164, 25, -48, -288, -458, -446, nil, 14, 60, + 174, 41, 162, 44, 15, 5, 107, 1098, 438, -51, + 820, -121, 1900, 76, 57, 1500, 19, nil, 94, -247, + -141, 126, -239, -328, -276, 2012, 22, 14, nil, -27, + -13, 0, -284, 48, -63, 4, nil, nil, 51, 43, + -200, 44, -24, -227, 73, -197, 55, 9, -354, 229, + 4, -277, -86, nil, -275, -416, nil, nil, nil, nil, + nil, nil, 110, 121, 121, nil, -296, -593, -412, -280, + 117, nil, -145, 15, nil, -495, 120, -156, -110, 132, + -429, 1, -557, -432, -722, -405, -529, -212, -217, -393, + -639, -433, -430, nil, -106, nil, -129, -127, -363, -668, + -335, -470, nil, nil, 69, 69, 10, 66, -203, -289, + 67, -373, -370, -491, nil, -598, -663, -561, -482, -597, + -711, nil, nil, -408 ] + +racc_goto_default = [ + nil, nil, 294, nil, nil, 735, nil, 3, nil, 4, + 314, nil, nil, nil, 204, 16, 11, 205, 288, nil, + 203, nil, 246, 15, nil, 19, 20, 21, nil, 25, + 598, nil, nil, nil, nil, 279, 29, nil, 31, 34, + 33, 201, 325, nil, 116, 382, 115, 118, 70, 71, + nil, nil, 42, 297, 299, nil, 300, 546, 547, 427, + 564, nil, nil, 257, nil, nil, 43, 44, 45, 46, + 47, 48, 49, nil, 258, 55, nil, nil, nil, nil, + nil, 62, nil, 489, 63, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 237, nil, 386, nil, nil, nil, nil, + nil, nil, 69, 72, 73, nil, nil, nil, nil, 527, + nil, nil, nil, 648, 649, 650, 651, nil, 814, 658, + 659, 662, 665, 250 ] + +racc_reduce_table = [ + 0, 0, :racc_error, + 1, 132, :_reduce_1, + 4, 134, :_reduce_2, + 2, 133, :_reduce_3, + 0, 138, :_reduce_4, + 1, 138, :_reduce_5, + 2, 138, :_reduce_6, + 3, 138, :_reduce_7, + 0, 155, :_reduce_8, + 4, 140, :_reduce_9, + 3, 140, :_reduce_10, + 3, 140, :_reduce_11, + 3, 140, :_reduce_12, + 2, 140, :_reduce_13, + 3, 140, :_reduce_14, + 3, 140, :_reduce_15, + 3, 140, :_reduce_16, + 3, 140, :_reduce_17, + 3, 140, :_reduce_18, + 4, 140, :_reduce_19, + 4, 140, :_reduce_20, + 3, 140, :_reduce_21, + 3, 140, :_reduce_22, + 3, 140, :_reduce_23, + 6, 140, :_reduce_24, + 5, 140, :_reduce_25, + 5, 140, :_reduce_26, + 5, 140, :_reduce_27, + 3, 140, :_reduce_28, + 3, 140, :_reduce_29, + 3, 140, :_reduce_30, + 3, 140, :_reduce_31, + 1, 140, :_reduce_none, + 1, 154, :_reduce_none, + 3, 154, :_reduce_34, + 3, 154, :_reduce_35, + 2, 154, :_reduce_36, + 2, 154, :_reduce_37, + 1, 154, :_reduce_none, + 1, 144, :_reduce_none, + 1, 146, :_reduce_none, + 1, 146, :_reduce_none, + 2, 146, :_reduce_42, + 2, 146, :_reduce_43, + 2, 146, :_reduce_44, + 1, 158, :_reduce_none, + 4, 158, :_reduce_46, + 4, 158, :_reduce_47, + 0, 165, :_reduce_48, + 5, 163, :_reduce_49, + 2, 157, :_reduce_50, + 3, 157, :_reduce_51, + 4, 157, :_reduce_52, + 5, 157, :_reduce_53, + 4, 157, :_reduce_54, + 5, 157, :_reduce_55, + 2, 157, :_reduce_56, + 2, 157, :_reduce_57, + 1, 147, :_reduce_58, + 3, 147, :_reduce_59, + 1, 168, :_reduce_60, + 3, 168, :_reduce_61, + 1, 167, :_reduce_62, + 2, 167, :_reduce_63, + 3, 167, :_reduce_64, + 2, 167, :_reduce_65, + 2, 167, :_reduce_66, + 1, 167, :_reduce_67, + 1, 170, :_reduce_none, + 3, 170, :_reduce_69, + 2, 169, :_reduce_70, + 3, 169, :_reduce_71, + 1, 171, :_reduce_72, + 4, 171, :_reduce_73, + 3, 171, :_reduce_74, + 3, 171, :_reduce_75, + 3, 171, :_reduce_76, + 3, 171, :_reduce_77, + 2, 171, :_reduce_78, + 1, 171, :_reduce_79, + 1, 145, :_reduce_80, + 4, 145, :_reduce_81, + 3, 145, :_reduce_82, + 3, 145, :_reduce_83, + 3, 145, :_reduce_84, + 3, 145, :_reduce_85, + 2, 145, :_reduce_86, + 1, 145, :_reduce_87, + 1, 173, :_reduce_88, + 1, 173, :_reduce_none, + 2, 174, :_reduce_90, + 1, 174, :_reduce_91, + 3, 174, :_reduce_92, + 1, 175, :_reduce_none, + 1, 175, :_reduce_none, + 1, 175, :_reduce_none, + 1, 175, :_reduce_none, + 1, 175, :_reduce_none, + 1, 178, :_reduce_98, + 1, 178, :_reduce_none, + 1, 142, :_reduce_none, + 1, 142, :_reduce_none, + 1, 143, :_reduce_102, + 0, 181, :_reduce_103, + 4, 143, :_reduce_104, + 1, 176, :_reduce_none, + 1, 176, :_reduce_none, + 1, 176, :_reduce_none, + 1, 176, :_reduce_none, + 1, 176, :_reduce_none, + 1, 176, :_reduce_none, + 1, 176, :_reduce_none, + 1, 176, :_reduce_none, + 1, 176, :_reduce_none, + 1, 176, :_reduce_none, + 1, 176, :_reduce_none, + 1, 176, :_reduce_none, + 1, 176, :_reduce_none, + 1, 176, :_reduce_none, + 1, 176, :_reduce_none, + 1, 176, :_reduce_none, + 1, 176, :_reduce_none, + 1, 176, :_reduce_none, + 1, 176, :_reduce_none, + 1, 176, :_reduce_none, + 1, 176, :_reduce_none, + 1, 176, :_reduce_none, + 1, 176, :_reduce_none, + 1, 176, :_reduce_none, + 1, 176, :_reduce_none, + 1, 176, :_reduce_none, + 1, 177, :_reduce_none, + 1, 177, :_reduce_none, + 1, 177, :_reduce_none, + 1, 177, :_reduce_none, + 1, 177, :_reduce_none, + 1, 177, :_reduce_none, + 1, 177, :_reduce_none, + 1, 177, :_reduce_none, + 1, 177, :_reduce_none, + 1, 177, :_reduce_none, + 1, 177, :_reduce_none, + 1, 177, :_reduce_none, + 1, 177, :_reduce_none, + 1, 177, :_reduce_none, + 1, 177, :_reduce_none, + 1, 177, :_reduce_none, + 1, 177, :_reduce_none, + 1, 177, :_reduce_none, + 1, 177, :_reduce_none, + 1, 177, :_reduce_none, + 1, 177, :_reduce_none, + 1, 177, :_reduce_none, + 1, 177, :_reduce_none, + 1, 177, :_reduce_none, + 1, 177, :_reduce_none, + 1, 177, :_reduce_none, + 1, 177, :_reduce_none, + 1, 177, :_reduce_none, + 1, 177, :_reduce_none, + 1, 177, :_reduce_none, + 1, 177, :_reduce_none, + 1, 177, :_reduce_none, + 1, 177, :_reduce_none, + 1, 177, :_reduce_none, + 1, 177, :_reduce_none, + 1, 177, :_reduce_none, + 1, 177, :_reduce_none, + 1, 177, :_reduce_none, + 1, 177, :_reduce_none, + 1, 177, :_reduce_none, + 3, 156, :_reduce_171, + 5, 156, :_reduce_172, + 3, 156, :_reduce_173, + 6, 156, :_reduce_174, + 5, 156, :_reduce_175, + 5, 156, :_reduce_176, + 5, 156, :_reduce_177, + 5, 156, :_reduce_178, + 4, 156, :_reduce_179, + 3, 156, :_reduce_180, + 3, 156, :_reduce_181, + 3, 156, :_reduce_182, + 3, 156, :_reduce_183, + 3, 156, :_reduce_184, + 3, 156, :_reduce_185, + 3, 156, :_reduce_186, + 3, 156, :_reduce_187, + 3, 156, :_reduce_188, + 4, 156, :_reduce_189, + 4, 156, :_reduce_190, + 2, 156, :_reduce_191, + 2, 156, :_reduce_192, + 3, 156, :_reduce_193, + 3, 156, :_reduce_194, + 3, 156, :_reduce_195, + 3, 156, :_reduce_196, + 3, 156, :_reduce_197, + 3, 156, :_reduce_198, + 3, 156, :_reduce_199, + 3, 156, :_reduce_200, + 3, 156, :_reduce_201, + 3, 156, :_reduce_202, + 3, 156, :_reduce_203, + 3, 156, :_reduce_204, + 3, 156, :_reduce_205, + 2, 156, :_reduce_206, + 2, 156, :_reduce_207, + 3, 156, :_reduce_208, + 3, 156, :_reduce_209, + 3, 156, :_reduce_210, + 3, 156, :_reduce_211, + 3, 156, :_reduce_212, + 5, 156, :_reduce_213, + 1, 156, :_reduce_none, + 1, 153, :_reduce_none, + 1, 150, :_reduce_216, + 2, 150, :_reduce_217, + 2, 150, :_reduce_218, + 5, 150, :_reduce_219, + 2, 150, :_reduce_220, + 3, 150, :_reduce_221, + 3, 188, :_reduce_222, + 4, 188, :_reduce_223, + 4, 188, :_reduce_224, + 6, 188, :_reduce_225, + 0, 189, :_reduce_226, + 1, 189, :_reduce_none, + 1, 159, :_reduce_228, + 2, 159, :_reduce_229, + 5, 159, :_reduce_230, + 2, 159, :_reduce_231, + 5, 159, :_reduce_232, + 4, 159, :_reduce_233, + 7, 159, :_reduce_234, + 3, 159, :_reduce_235, + 1, 159, :_reduce_236, + 4, 192, :_reduce_237, + 3, 192, :_reduce_238, + 5, 192, :_reduce_239, + 7, 192, :_reduce_240, + 2, 192, :_reduce_241, + 5, 192, :_reduce_242, + 4, 192, :_reduce_243, + 6, 192, :_reduce_244, + 7, 192, :_reduce_245, + 9, 192, :_reduce_246, + 3, 192, :_reduce_247, + 1, 192, :_reduce_248, + 0, 194, :_reduce_249, + 2, 162, :_reduce_250, + 1, 193, :_reduce_251, + 0, 195, :_reduce_252, + 3, 193, :_reduce_253, + 0, 196, :_reduce_254, + 4, 193, :_reduce_255, + 2, 191, :_reduce_256, + 2, 190, :_reduce_257, + 0, 190, :_reduce_258, + 1, 185, :_reduce_259, + 3, 185, :_reduce_260, + 3, 152, :_reduce_261, + 4, 152, :_reduce_262, + 2, 152, :_reduce_263, + 1, 183, :_reduce_none, + 1, 183, :_reduce_none, + 1, 183, :_reduce_none, + 1, 183, :_reduce_none, + 1, 183, :_reduce_none, + 1, 183, :_reduce_none, + 1, 183, :_reduce_none, + 1, 183, :_reduce_none, + 1, 183, :_reduce_272, + 3, 183, :_reduce_273, + 0, 219, :_reduce_274, + 5, 183, :_reduce_275, + 3, 183, :_reduce_276, + 3, 183, :_reduce_277, + 2, 183, :_reduce_278, + 4, 183, :_reduce_279, + 3, 183, :_reduce_280, + 3, 183, :_reduce_281, + 1, 183, :_reduce_282, + 4, 183, :_reduce_283, + 3, 183, :_reduce_284, + 1, 183, :_reduce_285, + 5, 183, :_reduce_286, + 2, 183, :_reduce_287, + 1, 183, :_reduce_none, + 2, 183, :_reduce_289, + 6, 183, :_reduce_290, + 6, 183, :_reduce_291, + 0, 220, :_reduce_292, + 0, 221, :_reduce_293, + 7, 183, :_reduce_294, + 0, 222, :_reduce_295, + 0, 223, :_reduce_296, + 7, 183, :_reduce_297, + 5, 183, :_reduce_298, + 4, 183, :_reduce_299, + 5, 183, :_reduce_300, + 0, 224, :_reduce_301, + 0, 225, :_reduce_302, + 9, 183, :_reduce_303, + 0, 226, :_reduce_304, + 6, 183, :_reduce_305, + 0, 227, :_reduce_306, + 7, 183, :_reduce_307, + 0, 228, :_reduce_308, + 5, 183, :_reduce_309, + 0, 229, :_reduce_310, + 6, 183, :_reduce_311, + 0, 230, :_reduce_312, + 0, 231, :_reduce_313, + 9, 183, :_reduce_314, + 1, 183, :_reduce_315, + 1, 183, :_reduce_316, + 1, 183, :_reduce_317, + 1, 183, :_reduce_318, + 1, 149, :_reduce_none, + 1, 212, :_reduce_320, + 1, 215, :_reduce_321, + 1, 207, :_reduce_none, + 1, 207, :_reduce_none, + 1, 207, :_reduce_none, + 2, 207, :_reduce_325, + 1, 209, :_reduce_none, + 1, 209, :_reduce_none, + 1, 209, :_reduce_none, + 1, 208, :_reduce_none, + 5, 208, :_reduce_330, + 1, 136, :_reduce_none, + 2, 136, :_reduce_332, + 1, 211, :_reduce_none, + 1, 211, :_reduce_none, + 1, 232, :_reduce_335, + 3, 232, :_reduce_336, + 1, 233, :_reduce_none, + 2, 233, :_reduce_none, + 4, 233, :_reduce_339, + 7, 233, :_reduce_340, + 6, 233, :_reduce_341, + 4, 233, :_reduce_342, + 3, 233, :_reduce_343, + 5, 233, :_reduce_344, + 4, 233, :_reduce_345, + 2, 233, :_reduce_346, + 1, 233, :_reduce_347, + 2, 233, :_reduce_348, + 0, 164, :_reduce_349, + 2, 164, :_reduce_350, + 1, 164, :_reduce_351, + 3, 164, :_reduce_352, + 0, 235, :_reduce_353, + 5, 234, :_reduce_354, + 2, 160, :_reduce_355, + 4, 160, :_reduce_356, + 4, 160, :_reduce_357, + 2, 206, :_reduce_358, + 4, 206, :_reduce_359, + 4, 206, :_reduce_360, + 3, 206, :_reduce_361, + 2, 206, :_reduce_362, + 1, 206, :_reduce_363, + 0, 237, :_reduce_364, + 5, 205, :_reduce_365, + 0, 238, :_reduce_366, + 5, 205, :_reduce_367, + 5, 210, :_reduce_368, + 1, 239, :_reduce_none, + 4, 239, :_reduce_370, + 2, 239, :_reduce_371, + 1, 240, :_reduce_372, + 1, 240, :_reduce_none, + 6, 135, :_reduce_374, + 0, 135, :_reduce_375, + 1, 241, :_reduce_376, + 1, 241, :_reduce_none, + 1, 241, :_reduce_none, + 2, 242, :_reduce_379, + 1, 242, :_reduce_none, + 2, 137, :_reduce_381, + 1, 137, :_reduce_none, + 1, 197, :_reduce_none, + 1, 197, :_reduce_none, + 1, 197, :_reduce_none, + 1, 198, :_reduce_386, + 1, 244, :_reduce_387, + 2, 244, :_reduce_388, + 3, 245, :_reduce_389, + 1, 245, :_reduce_390, + 3, 199, :_reduce_391, + 4, 200, :_reduce_392, + 3, 201, :_reduce_393, + 0, 248, :_reduce_394, + 3, 248, :_reduce_395, + 1, 249, :_reduce_396, + 2, 249, :_reduce_397, + 3, 202, :_reduce_398, + 0, 251, :_reduce_399, + 3, 251, :_reduce_400, + 0, 246, :_reduce_401, + 2, 246, :_reduce_402, + 0, 247, :_reduce_403, + 2, 247, :_reduce_404, + 1, 250, :_reduce_405, + 2, 250, :_reduce_406, + 0, 253, :_reduce_407, + 4, 250, :_reduce_408, + 1, 252, :_reduce_409, + 1, 252, :_reduce_410, + 1, 252, :_reduce_411, + 1, 252, :_reduce_none, + 1, 179, :_reduce_413, + 3, 180, :_reduce_414, + 1, 243, :_reduce_415, + 1, 243, :_reduce_416, + 2, 243, :_reduce_417, + 2, 243, :_reduce_418, + 1, 172, :_reduce_419, + 1, 172, :_reduce_420, + 1, 172, :_reduce_421, + 1, 172, :_reduce_422, + 1, 172, :_reduce_423, + 1, 172, :_reduce_424, + 1, 172, :_reduce_425, + 1, 172, :_reduce_426, + 1, 172, :_reduce_427, + 1, 172, :_reduce_428, + 1, 172, :_reduce_429, + 1, 203, :_reduce_430, + 1, 148, :_reduce_431, + 1, 151, :_reduce_432, + 1, 151, :_reduce_433, + 1, 213, :_reduce_434, + 3, 213, :_reduce_435, + 2, 213, :_reduce_436, + 4, 216, :_reduce_437, + 2, 216, :_reduce_438, + 6, 254, :_reduce_439, + 4, 254, :_reduce_440, + 4, 254, :_reduce_441, + 2, 254, :_reduce_442, + 4, 254, :_reduce_443, + 2, 254, :_reduce_444, + 2, 254, :_reduce_445, + 1, 254, :_reduce_446, + 0, 254, :_reduce_447, + 1, 260, :_reduce_448, + 1, 260, :_reduce_449, + 1, 260, :_reduce_450, + 1, 260, :_reduce_451, + 1, 260, :_reduce_452, + 1, 255, :_reduce_453, + 3, 255, :_reduce_454, + 3, 261, :_reduce_455, + 1, 256, :_reduce_456, + 3, 256, :_reduce_457, + 1, 262, :_reduce_none, + 1, 262, :_reduce_none, + 2, 257, :_reduce_460, + 1, 257, :_reduce_461, + 1, 263, :_reduce_none, + 1, 263, :_reduce_none, + 2, 259, :_reduce_464, + 2, 258, :_reduce_465, + 0, 258, :_reduce_466, + 1, 217, :_reduce_none, + 4, 217, :_reduce_468, + 0, 204, :_reduce_469, + 2, 204, :_reduce_470, + 2, 204, :_reduce_471, + 1, 187, :_reduce_472, + 3, 187, :_reduce_473, + 3, 264, :_reduce_474, + 1, 166, :_reduce_none, + 1, 166, :_reduce_none, + 1, 166, :_reduce_none, + 1, 161, :_reduce_none, + 1, 161, :_reduce_none, + 1, 161, :_reduce_none, + 1, 161, :_reduce_none, + 1, 236, :_reduce_none, + 1, 236, :_reduce_none, + 1, 236, :_reduce_none, + 1, 218, :_reduce_none, + 1, 218, :_reduce_none, + 0, 139, :_reduce_none, + 1, 139, :_reduce_none, + 0, 182, :_reduce_none, + 1, 182, :_reduce_none, + 0, 186, :_reduce_none, + 1, 186, :_reduce_none, + 1, 186, :_reduce_none, + 1, 214, :_reduce_494, + 1, 214, :_reduce_none, + 1, 141, :_reduce_none, + 2, 141, :_reduce_none, + 0, 184, :_reduce_498 ] + +racc_reduce_n = 499 + +racc_shift_n = 896 + +racc_token_table = { + false => 0, + :error => 1, + :kCLASS => 2, + :kMODULE => 3, + :kDEF => 4, + :kUNDEF => 5, + :kBEGIN => 6, + :kRESCUE => 7, + :kENSURE => 8, + :kEND => 9, + :kIF => 10, + :kUNLESS => 11, + :kTHEN => 12, + :kELSIF => 13, + :kELSE => 14, + :kCASE => 15, + :kWHEN => 16, + :kWHILE => 17, + :kUNTIL => 18, + :kFOR => 19, + :kBREAK => 20, + :kNEXT => 21, + :kREDO => 22, + :kRETRY => 23, + :kIN => 24, + :kDO => 25, + :kDO_COND => 26, + :kDO_BLOCK => 27, + :kRETURN => 28, + :kYIELD => 29, + :kSUPER => 30, + :kSELF => 31, + :kNIL => 32, + :kTRUE => 33, + :kFALSE => 34, + :kAND => 35, + :kOR => 36, + :kNOT => 37, + :kIF_MOD => 38, + :kUNLESS_MOD => 39, + :kWHILE_MOD => 40, + :kUNTIL_MOD => 41, + :kRESCUE_MOD => 42, + :kALIAS => 43, + :kDEFINED => 44, + :klBEGIN => 45, + :klEND => 46, + :k__LINE__ => 47, + :k__FILE__ => 48, + :tIDENTIFIER => 49, + :tFID => 50, + :tGVAR => 51, + :tIVAR => 52, + :tCONSTANT => 53, + :tCVAR => 54, + :tNTH_REF => 55, + :tBACK_REF => 56, + :tSTRING_CONTENT => 57, + :tINTEGER => 58, + :tFLOAT => 59, + :tUPLUS => 60, + :tUMINUS => 61, + :tUNARY_NUM => 62, + :tPOW => 63, + :tCMP => 64, + :tEQ => 65, + :tEQQ => 66, + :tNEQ => 67, + :tGEQ => 68, + :tLEQ => 69, + :tANDOP => 70, + :tOROP => 71, + :tMATCH => 72, + :tNMATCH => 73, + :tDOT => 74, + :tDOT2 => 75, + :tDOT3 => 76, + :tAREF => 77, + :tASET => 78, + :tLSHFT => 79, + :tRSHFT => 80, + :tCOLON2 => 81, + :tCOLON3 => 82, + :tOP_ASGN => 83, + :tASSOC => 84, + :tLPAREN => 85, + :tLPAREN2 => 86, + :tRPAREN => 87, + :tLPAREN_ARG => 88, + :tLBRACK => 89, + :tLBRACK2 => 90, + :tRBRACK => 91, + :tLBRACE => 92, + :tLBRACE_ARG => 93, + :tSTAR => 94, + :tSTAR2 => 95, + :tAMPER => 96, + :tAMPER2 => 97, + :tTILDE => 98, + :tPERCENT => 99, + :tDIVIDE => 100, + :tPLUS => 101, + :tMINUS => 102, + :tLT => 103, + :tGT => 104, + :tPIPE => 105, + :tBANG => 106, + :tCARET => 107, + :tLCURLY => 108, + :tRCURLY => 109, + :tBACK_REF2 => 110, + :tSYMBEG => 111, + :tSTRING_BEG => 112, + :tXSTRING_BEG => 113, + :tREGEXP_BEG => 114, + :tWORDS_BEG => 115, + :tQWORDS_BEG => 116, + :tSTRING_DBEG => 117, + :tSTRING_DVAR => 118, + :tSTRING_END => 119, + :tSTRING => 120, + :tSYMBOL => 121, + :tREGEXP_OPT => 122, + :tNL => 123, + :tEH => 124, + :tCOLON => 125, + :tCOMMA => 126, + :tSPACE => 127, + :tSEMI => 128, + :tEQL => 129, + :tLOWEST => 130 } + +racc_nt_base = 131 + +racc_use_result_var = true + +Racc_arg = [ + racc_action_table, + racc_action_check, + racc_action_default, + racc_action_pointer, + racc_goto_table, + racc_goto_check, + racc_goto_default, + racc_goto_pointer, + racc_nt_base, + racc_reduce_table, + racc_token_table, + racc_shift_n, + racc_reduce_n, + racc_use_result_var ] + +Racc_token_to_s_table = [ + "$end", + "error", + "kCLASS", + "kMODULE", + "kDEF", + "kUNDEF", + "kBEGIN", + "kRESCUE", + "kENSURE", + "kEND", + "kIF", + "kUNLESS", + "kTHEN", + "kELSIF", + "kELSE", + "kCASE", + "kWHEN", + "kWHILE", + "kUNTIL", + "kFOR", + "kBREAK", + "kNEXT", + "kREDO", + "kRETRY", + "kIN", + "kDO", + "kDO_COND", + "kDO_BLOCK", + "kRETURN", + "kYIELD", + "kSUPER", + "kSELF", + "kNIL", + "kTRUE", + "kFALSE", + "kAND", + "kOR", + "kNOT", + "kIF_MOD", + "kUNLESS_MOD", + "kWHILE_MOD", + "kUNTIL_MOD", + "kRESCUE_MOD", + "kALIAS", + "kDEFINED", + "klBEGIN", + "klEND", + "k__LINE__", + "k__FILE__", + "tIDENTIFIER", + "tFID", + "tGVAR", + "tIVAR", + "tCONSTANT", + "tCVAR", + "tNTH_REF", + "tBACK_REF", + "tSTRING_CONTENT", + "tINTEGER", + "tFLOAT", + "tUPLUS", + "tUMINUS", + "tUNARY_NUM", + "tPOW", + "tCMP", + "tEQ", + "tEQQ", + "tNEQ", + "tGEQ", + "tLEQ", + "tANDOP", + "tOROP", + "tMATCH", + "tNMATCH", + "tDOT", + "tDOT2", + "tDOT3", + "tAREF", + "tASET", + "tLSHFT", + "tRSHFT", + "tCOLON2", + "tCOLON3", + "tOP_ASGN", + "tASSOC", + "tLPAREN", + "tLPAREN2", + "tRPAREN", + "tLPAREN_ARG", + "tLBRACK", + "tLBRACK2", + "tRBRACK", + "tLBRACE", + "tLBRACE_ARG", + "tSTAR", + "tSTAR2", + "tAMPER", + "tAMPER2", + "tTILDE", + "tPERCENT", + "tDIVIDE", + "tPLUS", + "tMINUS", + "tLT", + "tGT", + "tPIPE", + "tBANG", + "tCARET", + "tLCURLY", + "tRCURLY", + "tBACK_REF2", + "tSYMBEG", + "tSTRING_BEG", + "tXSTRING_BEG", + "tREGEXP_BEG", + "tWORDS_BEG", + "tQWORDS_BEG", + "tSTRING_DBEG", + "tSTRING_DVAR", + "tSTRING_END", + "tSTRING", + "tSYMBOL", + "tREGEXP_OPT", + "tNL", + "tEH", + "tCOLON", + "tCOMMA", + "tSPACE", + "tSEMI", + "tEQL", + "tLOWEST", + "$start", + "program", + "compstmt", + "bodystmt", + "opt_rescue", + "opt_else", + "opt_ensure", + "stmts", + "opt_terms", + "stmt", + "terms", + "fitem", + "undef_list", + "expr_value", + "lhs", + "command_call", + "mlhs", + "var_lhs", + "primary_value", + "aref_args", + "backref", + "mrhs", + "arg_value", + "expr", + "@1", + "arg", + "command", + "block_command", + "call_args", + "block_call", + "operation2", + "command_args", + "cmd_brace_block", + "opt_block_var", + "@2", + "operation", + "mlhs_basic", + "mlhs_entry", + "mlhs_head", + "mlhs_item", + "mlhs_node", + "variable", + "cname", + "cpath", + "fname", + "op", + "reswords", + "fsym", + "symbol", + "dsym", + "@3", + "opt_nl", + "primary", + "none", + "args", + "trailer", + "assocs", + "paren_args", + "opt_paren_args", + "opt_block_arg", + "block_arg", + "call_args2", + "open_args", + "@4", + "@5", + "@6", + "literal", + "strings", + "xstring", + "regexp", + "words", + "qwords", + "var_ref", + "assoc_list", + "brace_block", + "method_call", + "then", + "if_tail", + "do", + "case_body", + "for_var", + "k_class", + "superclass", + "term", + "k_module", + "f_arglist", + "singleton", + "dot_or_colon", + "@7", + "@8", + "@9", + "@10", + "@11", + "@12", + "@13", + "@14", + "@15", + "@16", + "@17", + "@18", + "@19", + "block_par", + "block_var", + "do_block", + "@20", + "operation3", + "@21", + "@22", + "when_args", + "cases", + "exc_list", + "exc_var", + "numeric", + "string", + "string1", + "string_contents", + "xstring_contents", + "word_list", + "word", + "string_content", + "qword_list", + "string_dvar", + "@23", + "f_args", + "f_arg", + "f_optarg", + "f_rest_arg", + "opt_f_block_arg", + "f_block_arg", + "f_norm_arg", + "f_opt", + "restarg_mark", + "blkarg_mark", + "assoc" ] + +Racc_debug_parser = false + +##### State transition tables end ##### + +# reduce 0 omitted + +def _reduce_1(val, _values, result) + result = val[0] + + result +end + +def _reduce_2(val, _values, result) + rescue_bodies = val[1] + else_t, else_ = val[2] + ensure_t, ensure_ = val[3] + + if rescue_bodies.empty? && !else_t.nil? + diagnostic :warning, :useless_else, nil, else_t + end + + result = @builder.begin_body(val[0], + rescue_bodies, + else_t, else_, + ensure_t, ensure_) + + result +end + +def _reduce_3(val, _values, result) + result = @builder.compstmt(val[0]) + + result +end + +def _reduce_4(val, _values, result) + result = [] + + result +end + +def _reduce_5(val, _values, result) + result = [ val[0] ] + + result +end + +def _reduce_6(val, _values, result) + result = [ val[1] ] + + result +end + +def _reduce_7(val, _values, result) + result = val[0] << val[2] + + result +end + +def _reduce_8(val, _values, result) + @lexer.state = :expr_fname + + result +end + +def _reduce_9(val, _values, result) + result = @builder.alias(val[0], val[1], val[3]) + + result +end + +def _reduce_10(val, _values, result) + result = @builder.alias(val[0], + @builder.gvar(val[1]), + @builder.gvar(val[2])) + + result +end + +def _reduce_11(val, _values, result) + result = @builder.alias(val[0], + @builder.gvar(val[1]), + @builder.back_ref(val[2])) + + result +end + +def _reduce_12(val, _values, result) + diagnostic :error, :nth_ref_alias, nil, val[2] + + result +end + +def _reduce_13(val, _values, result) + result = @builder.undef_method(val[0], val[1]) + + result +end + +def _reduce_14(val, _values, result) + result = @builder.condition_mod(val[0], nil, + val[1], val[2]) + + result +end + +def _reduce_15(val, _values, result) + result = @builder.condition_mod(nil, val[0], + val[1], val[2]) + + result +end + +def _reduce_16(val, _values, result) + result = @builder.loop_mod(:while, val[0], val[1], val[2]) + + result +end + +def _reduce_17(val, _values, result) + result = @builder.loop_mod(:until, val[0], val[1], val[2]) + + result +end + +def _reduce_18(val, _values, result) + rescue_body = @builder.rescue_body(val[1], + nil, nil, nil, + nil, val[2]) + + result = @builder.begin_body(val[0], [ rescue_body ]) + + result +end + +def _reduce_19(val, _values, result) + if @context.in_def + diagnostic :error, :begin_in_method, nil, val[0] + end + + result = @builder.preexe(val[0], val[1], val[2], val[3]) + + result +end + +def _reduce_20(val, _values, result) + result = @builder.postexe(val[0], val[1], val[2], val[3]) + + result +end + +def _reduce_21(val, _values, result) + result = @builder.assign(val[0], val[1], val[2]) + + result +end + +def _reduce_22(val, _values, result) + result = @builder.multi_assign(val[0], val[1], val[2]) + + result +end + +def _reduce_23(val, _values, result) + result = @builder.op_assign(val[0], val[1], val[2]) + + result +end + +def _reduce_24(val, _values, result) + result = @builder.op_assign( + @builder.index( + val[0], val[1], val[2], val[3]), + val[4], val[5]) + + result +end + +def _reduce_25(val, _values, result) + result = @builder.op_assign( + @builder.call_method( + val[0], val[1], val[2]), + val[3], val[4]) + + result +end + +def _reduce_26(val, _values, result) + result = @builder.op_assign( + @builder.call_method( + val[0], val[1], val[2]), + val[3], val[4]) + + result +end + +def _reduce_27(val, _values, result) + result = @builder.op_assign( + @builder.call_method( + val[0], val[1], val[2]), + val[3], val[4]) + + result +end + +def _reduce_28(val, _values, result) + @builder.op_assign(val[0], val[1], val[2]) + + result +end + +def _reduce_29(val, _values, result) + result = @builder.assign(val[0], val[1], + @builder.array(nil, val[2], nil)) + + result +end + +def _reduce_30(val, _values, result) + result = @builder.multi_assign(val[0], val[1], val[2]) + + result +end + +def _reduce_31(val, _values, result) + result = @builder.multi_assign(val[0], val[1], + @builder.array(nil, val[2], nil)) + + result +end + +# reduce 32 omitted + +# reduce 33 omitted + +def _reduce_34(val, _values, result) + result = @builder.logical_op(:and, val[0], val[1], val[2]) + + result +end + +def _reduce_35(val, _values, result) + result = @builder.logical_op(:or, val[0], val[1], val[2]) + + result +end + +def _reduce_36(val, _values, result) + result = @builder.not_op(val[0], nil, val[1], nil) + + result +end + +def _reduce_37(val, _values, result) + result = @builder.not_op(val[0], nil, val[1], nil) + + result +end + +# reduce 38 omitted + +# reduce 39 omitted + +# reduce 40 omitted + +# reduce 41 omitted + +def _reduce_42(val, _values, result) + result = @builder.keyword_cmd(:return, val[0], + nil, val[1], nil) + + result +end + +def _reduce_43(val, _values, result) + result = @builder.keyword_cmd(:break, val[0], + nil, val[1], nil) + + result +end + +def _reduce_44(val, _values, result) + result = @builder.keyword_cmd(:next, val[0], + nil, val[1], nil) + + result +end + +# reduce 45 omitted + +def _reduce_46(val, _values, result) + lparen_t, args, rparen_t = val[3] + result = @builder.call_method(val[0], val[1], val[2], + lparen_t, args, rparen_t) + + result +end + +def _reduce_47(val, _values, result) + lparen_t, args, rparen_t = val[3] + result = @builder.call_method(val[0], val[1], val[2], + lparen_t, args, rparen_t) + + result +end + +def _reduce_48(val, _values, result) + @static_env.extend_dynamic + result = @context.dup + @context.in_block = true + + result +end + +def _reduce_49(val, _values, result) + result = [ val[0], val[2], val[3], val[4] ] + + @static_env.unextend + @context.in_block = val[1].in_block + + result +end + +def _reduce_50(val, _values, result) + lparen_t, args, rparen_t = val[1] + result = @builder.call_method(nil, nil, val[0], + lparen_t, args, rparen_t) + + result +end + +def _reduce_51(val, _values, result) + lparen_t, args, rparen_t = val[1] + method_call = @builder.call_method(nil, nil, val[0], + lparen_t, args, rparen_t) + + begin_t, block_args, body, end_t = val[2] + result = @builder.block(method_call, + begin_t, block_args, body, end_t) + + result +end + +def _reduce_52(val, _values, result) + lparen_t, args, rparen_t = val[3] + result = @builder.call_method(val[0], val[1], val[2], + lparen_t, args, rparen_t) + + + result +end + +def _reduce_53(val, _values, result) + lparen_t, args, rparen_t = val[3] + method_call = @builder.call_method(val[0], val[1], val[2], + lparen_t, args, rparen_t) + + begin_t, block_args, body, end_t = val[4] + result = @builder.block(method_call, + begin_t, block_args, body, end_t) + + result +end + +def _reduce_54(val, _values, result) + lparen_t, args, rparen_t = val[3] + result = @builder.call_method(val[0], val[1], val[2], + lparen_t, args, rparen_t) + + result +end + +def _reduce_55(val, _values, result) + lparen_t, args, rparen_t = val[3] + method_call = @builder.call_method(val[0], val[1], val[2], + lparen_t, args, rparen_t) + + begin_t, block_args, body, end_t = val[4] + result = @builder.block(method_call, + begin_t, block_args, body, end_t) + + result +end + +def _reduce_56(val, _values, result) + lparen_t, args, rparen_t = val[1] + result = @builder.keyword_cmd(:super, val[0], + lparen_t, args, rparen_t) + + result +end + +def _reduce_57(val, _values, result) + lparen_t, args, rparen_t = val[1] + result = @builder.keyword_cmd(:yield, val[0], + lparen_t, args, rparen_t) + + result +end + +def _reduce_58(val, _values, result) + result = @builder.multi_lhs(nil, val[0], nil) + + result +end + +def _reduce_59(val, _values, result) + result = @builder.begin(val[0], val[1], val[2]) + + result +end + +def _reduce_60(val, _values, result) + result = @builder.multi_lhs(nil, val[0], nil) + + result +end + +def _reduce_61(val, _values, result) + result = @builder.multi_lhs(val[0], val[1], val[2]) + + result +end + +def _reduce_62(val, _values, result) + result = val[0] + + result +end + +def _reduce_63(val, _values, result) + result = val[0] << val[1] + + result +end + +def _reduce_64(val, _values, result) + result = val[0] << @builder.splat(val[1], val[2]) + + result +end + +def _reduce_65(val, _values, result) + result = val[0] << @builder.splat(val[1]) + + result +end + +def _reduce_66(val, _values, result) + result = [ @builder.splat(val[0], val[1]) ] + + result +end + +def _reduce_67(val, _values, result) + result = [ @builder.splat(val[0]) ] + + result +end + +# reduce 68 omitted + +def _reduce_69(val, _values, result) + result = @builder.begin(val[0], val[1], val[2]) + + result +end + +def _reduce_70(val, _values, result) + result = [ val[0] ] + + result +end + +def _reduce_71(val, _values, result) + result = val[0] << val[1] + + result +end + +def _reduce_72(val, _values, result) + result = @builder.assignable(val[0]) + + result +end + +def _reduce_73(val, _values, result) + result = @builder.index_asgn(val[0], val[1], val[2], val[3]) + + result +end + +def _reduce_74(val, _values, result) + result = @builder.attr_asgn(val[0], val[1], val[2]) + + result +end + +def _reduce_75(val, _values, result) + result = @builder.attr_asgn(val[0], val[1], val[2]) + + result +end + +def _reduce_76(val, _values, result) + result = @builder.attr_asgn(val[0], val[1], val[2]) + + result +end + +def _reduce_77(val, _values, result) + result = @builder.assignable( + @builder.const_fetch(val[0], val[1], val[2])) + + result +end + +def _reduce_78(val, _values, result) + result = @builder.assignable( + @builder.const_global(val[0], val[1])) + + result +end + +def _reduce_79(val, _values, result) + result = @builder.assignable(val[0]) + + result +end + +def _reduce_80(val, _values, result) + result = @builder.assignable(val[0]) + + result +end + +def _reduce_81(val, _values, result) + result = @builder.index_asgn(val[0], val[1], val[2], val[3]) + + result +end + +def _reduce_82(val, _values, result) + result = @builder.attr_asgn(val[0], val[1], val[2]) + + result +end + +def _reduce_83(val, _values, result) + result = @builder.attr_asgn(val[0], val[1], val[2]) + + result +end + +def _reduce_84(val, _values, result) + result = @builder.attr_asgn(val[0], val[1], val[2]) + + result +end + +def _reduce_85(val, _values, result) + result = @builder.assignable( + @builder.const_fetch(val[0], val[1], val[2])) + + result +end + +def _reduce_86(val, _values, result) + result = @builder.assignable( + @builder.const_global(val[0], val[1])) + + result +end + +def _reduce_87(val, _values, result) + result = @builder.assignable(val[0]) + + result +end + +def _reduce_88(val, _values, result) + diagnostic :error, :module_name_const, nil, val[0] + + result +end + +# reduce 89 omitted + +def _reduce_90(val, _values, result) + result = @builder.const_global(val[0], val[1]) + + result +end + +def _reduce_91(val, _values, result) + result = @builder.const(val[0]) + + result +end + +def _reduce_92(val, _values, result) + result = @builder.const_fetch(val[0], val[1], val[2]) + + result +end + +# reduce 93 omitted + +# reduce 94 omitted + +# reduce 95 omitted + +# reduce 96 omitted + +# reduce 97 omitted + +def _reduce_98(val, _values, result) + result = @builder.symbol_internal(val[0]) + + result +end + +# reduce 99 omitted + +# reduce 100 omitted + +# reduce 101 omitted + +def _reduce_102(val, _values, result) + result = [ val[0] ] + + result +end + +def _reduce_103(val, _values, result) + @lexer.state = :expr_fname + + result +end + +def _reduce_104(val, _values, result) + result = val[0] << val[3] + + result +end + +# reduce 105 omitted + +# reduce 106 omitted + +# reduce 107 omitted + +# reduce 108 omitted + +# reduce 109 omitted + +# reduce 110 omitted + +# reduce 111 omitted + +# reduce 112 omitted + +# reduce 113 omitted + +# reduce 114 omitted + +# reduce 115 omitted + +# reduce 116 omitted + +# reduce 117 omitted + +# reduce 118 omitted + +# reduce 119 omitted + +# reduce 120 omitted + +# reduce 121 omitted + +# reduce 122 omitted + +# reduce 123 omitted + +# reduce 124 omitted + +# reduce 125 omitted + +# reduce 126 omitted + +# reduce 127 omitted + +# reduce 128 omitted + +# reduce 129 omitted + +# reduce 130 omitted + +# reduce 131 omitted + +# reduce 132 omitted + +# reduce 133 omitted + +# reduce 134 omitted + +# reduce 135 omitted + +# reduce 136 omitted + +# reduce 137 omitted + +# reduce 138 omitted + +# reduce 139 omitted + +# reduce 140 omitted + +# reduce 141 omitted + +# reduce 142 omitted + +# reduce 143 omitted + +# reduce 144 omitted + +# reduce 145 omitted + +# reduce 146 omitted + +# reduce 147 omitted + +# reduce 148 omitted + +# reduce 149 omitted + +# reduce 150 omitted + +# reduce 151 omitted + +# reduce 152 omitted + +# reduce 153 omitted + +# reduce 154 omitted + +# reduce 155 omitted + +# reduce 156 omitted + +# reduce 157 omitted + +# reduce 158 omitted + +# reduce 159 omitted + +# reduce 160 omitted + +# reduce 161 omitted + +# reduce 162 omitted + +# reduce 163 omitted + +# reduce 164 omitted + +# reduce 165 omitted + +# reduce 166 omitted + +# reduce 167 omitted + +# reduce 168 omitted + +# reduce 169 omitted + +# reduce 170 omitted + +def _reduce_171(val, _values, result) + result = @builder.assign(val[0], val[1], val[2]) + + result +end + +def _reduce_172(val, _values, result) + rescue_body = @builder.rescue_body(val[3], + nil, nil, nil, + nil, val[4]) + + rescue_ = @builder.begin_body(val[2], [ rescue_body ]) + + result = @builder.assign(val[0], val[1], rescue_) + + result +end + +def _reduce_173(val, _values, result) + result = @builder.op_assign(val[0], val[1], val[2]) + + result +end + +def _reduce_174(val, _values, result) + result = @builder.op_assign( + @builder.index( + val[0], val[1], val[2], val[3]), + val[4], val[5]) + + result +end + +def _reduce_175(val, _values, result) + result = @builder.op_assign( + @builder.call_method( + val[0], val[1], val[2]), + val[3], val[4]) + + result +end + +def _reduce_176(val, _values, result) + result = @builder.op_assign( + @builder.call_method( + val[0], val[1], val[2]), + val[3], val[4]) + + result +end + +def _reduce_177(val, _values, result) + result = @builder.op_assign( + @builder.call_method( + val[0], val[1], val[2]), + val[3], val[4]) + + result +end + +def _reduce_178(val, _values, result) + diagnostic :error, :dynamic_const, nil, val[2], [ val[3] ] + + result +end + +def _reduce_179(val, _values, result) + diagnostic :error, :dynamic_const, nil, val[1], [ val[2] ] + + result +end + +def _reduce_180(val, _values, result) + result = @builder.op_assign(val[0], val[1], val[2]) + + result +end + +def _reduce_181(val, _values, result) + result = @builder.range_inclusive(val[0], val[1], val[2]) + + result +end + +def _reduce_182(val, _values, result) + result = @builder.range_exclusive(val[0], val[1], val[2]) + + result +end + +def _reduce_183(val, _values, result) + result = @builder.binary_op(val[0], val[1], val[2]) + + result +end + +def _reduce_184(val, _values, result) + result = @builder.binary_op(val[0], val[1], val[2]) + + result +end + +def _reduce_185(val, _values, result) + result = @builder.binary_op(val[0], val[1], val[2]) + + result +end + +def _reduce_186(val, _values, result) + result = @builder.binary_op(val[0], val[1], val[2]) + + result +end + +def _reduce_187(val, _values, result) + result = @builder.binary_op(val[0], val[1], val[2]) + + result +end + +def _reduce_188(val, _values, result) + result = @builder.binary_op(val[0], val[1], val[2]) + + result +end + +def _reduce_189(val, _values, result) + result = @builder.unary_op(val[0], + @builder.binary_op( + @builder.integer(val[1]), + val[2], val[3])) + + result +end + +def _reduce_190(val, _values, result) + result = @builder.unary_op(val[0], + @builder.binary_op( + @builder.float(val[1]), + val[2], val[3])) + + result +end + +def _reduce_191(val, _values, result) + result = @builder.unary_op(val[0], val[1]) + + result +end + +def _reduce_192(val, _values, result) + result = @builder.unary_op(val[0], val[1]) + + result +end + +def _reduce_193(val, _values, result) + result = @builder.binary_op(val[0], val[1], val[2]) + + result +end + +def _reduce_194(val, _values, result) + result = @builder.binary_op(val[0], val[1], val[2]) + + result +end + +def _reduce_195(val, _values, result) + result = @builder.binary_op(val[0], val[1], val[2]) + + result +end + +def _reduce_196(val, _values, result) + result = @builder.binary_op(val[0], val[1], val[2]) + + result +end + +def _reduce_197(val, _values, result) + result = @builder.binary_op(val[0], val[1], val[2]) + + result +end + +def _reduce_198(val, _values, result) + result = @builder.binary_op(val[0], val[1], val[2]) + + result +end + +def _reduce_199(val, _values, result) + result = @builder.binary_op(val[0], val[1], val[2]) + + result +end + +def _reduce_200(val, _values, result) + result = @builder.binary_op(val[0], val[1], val[2]) + + result +end + +def _reduce_201(val, _values, result) + result = @builder.binary_op(val[0], val[1], val[2]) + + result +end + +def _reduce_202(val, _values, result) + result = @builder.binary_op(val[0], val[1], val[2]) + + result +end + +def _reduce_203(val, _values, result) + result = @builder.binary_op(val[0], val[1], val[2]) + + result +end + +def _reduce_204(val, _values, result) + result = @builder.binary_op(val[0], val[1], val[2]) + + result +end + +def _reduce_205(val, _values, result) + result = @builder.binary_op(val[0], val[1], val[2]) + + result +end + +def _reduce_206(val, _values, result) + result = @builder.not_op(val[0], nil, val[1], nil) + + result +end + +def _reduce_207(val, _values, result) + result = @builder.unary_op(val[0], val[1]) + + result +end + +def _reduce_208(val, _values, result) + result = @builder.binary_op(val[0], val[1], val[2]) + + result +end + +def _reduce_209(val, _values, result) + result = @builder.binary_op(val[0], val[1], val[2]) + + result +end + +def _reduce_210(val, _values, result) + result = @builder.logical_op(:and, val[0], val[1], val[2]) + + result +end + +def _reduce_211(val, _values, result) + result = @builder.logical_op(:or, val[0], val[1], val[2]) + + result +end + +def _reduce_212(val, _values, result) + result = @builder.keyword_cmd(:defined?, val[0], nil, [ val[2] ], nil) + + result +end + +def _reduce_213(val, _values, result) + result = @builder.ternary(val[0], val[1], + val[2], val[3], val[4]) + + result +end + +# reduce 214 omitted + +# reduce 215 omitted + +def _reduce_216(val, _values, result) + result = [] + + result +end + +def _reduce_217(val, _values, result) + result = [ val[0] ] + + result +end + +def _reduce_218(val, _values, result) + result = val[0] + + result +end + +def _reduce_219(val, _values, result) + result = val[0] << @builder.splat(val[2], val[3]) + + result +end + +def _reduce_220(val, _values, result) + result = [ @builder.associate(nil, val[0], nil) ] + + result +end + +def _reduce_221(val, _values, result) + result = [ @builder.splat(val[0], val[1]) ] + + result +end + +def _reduce_222(val, _values, result) + result = [ val[0], [], val[2] ] + + result +end + +def _reduce_223(val, _values, result) + result = [ val[0], val[1], val[3] ] + + result +end + +def _reduce_224(val, _values, result) + result = [ val[0], [ val[1] ], val[3] ] + + result +end + +def _reduce_225(val, _values, result) + result = [ val[0], val[1] << val[3], val[5] ] + + result +end + +def _reduce_226(val, _values, result) + result = [ nil, [], nil ] + + result +end + +# reduce 227 omitted + +def _reduce_228(val, _values, result) + result = [ val[0] ] + + result +end + +def _reduce_229(val, _values, result) + result = val[0].concat(val[1]) + + result +end + +def _reduce_230(val, _values, result) + result = val[0].concat( + [ @builder.splat(val[2], val[3]), + *val[4] ]) + + result +end + +def _reduce_231(val, _values, result) + result = [ @builder.associate(nil, val[0], nil), + *val[1] ] + + result +end + +def _reduce_232(val, _values, result) + result = [ @builder.associate(nil, val[0], nil), + @builder.splat(val[2], val[3]), + *val[4] ] + + result +end + +def _reduce_233(val, _values, result) + result = val[0].concat( + [ @builder.associate(nil, val[2], nil), + *val[3] ]) + + result +end + +def _reduce_234(val, _values, result) + result = val[0].concat( + [ @builder.associate(nil, val[2], nil), + @builder.splat(val[4], val[5]), + *val[6] ]) + + result +end + +def _reduce_235(val, _values, result) + result = [ @builder.splat(val[0], val[1]), + *val[2] ] + + result +end + +def _reduce_236(val, _values, result) + result = [ val[0] ] + + result +end + +def _reduce_237(val, _values, result) + result = [ val[0], *val[2].concat(val[3]) ] + + result +end + +def _reduce_238(val, _values, result) + result = [ val[0], val[2] ] + + result +end + +def _reduce_239(val, _values, result) + result = [ val[0], + @builder.splat(val[2], val[3]), + *val[4] ] + + result +end + +def _reduce_240(val, _values, result) + result = [ val[0], + *val[2]. + push(@builder.splat(val[4], val[5])). + concat(val[6]) ] + + result +end + +def _reduce_241(val, _values, result) + result = [ @builder.associate(nil, val[0], nil), + *val[1] ] + + result +end + +def _reduce_242(val, _values, result) + result = [ @builder.associate(nil, val[0], nil), + @builder.splat(val[2], val[3]), + *val[4] ] + + result +end + +def _reduce_243(val, _values, result) + result = [ val[0], + @builder.associate(nil, val[2], nil), + *val[3] ] + + result +end + +def _reduce_244(val, _values, result) + result = [ val[0], + *val[2]. + push(@builder.associate(nil, val[4], nil)). + concat(val[5]) ] + + result +end + +def _reduce_245(val, _values, result) + result = [ val[0], + @builder.associate(nil, val[2], nil), + @builder.splat(val[4], val[5]), + *val[6] ] + + result +end + +def _reduce_246(val, _values, result) + result = [ val[0], + *val[2]. + push(@builder.associate(nil, val[4], nil)). + push(@builder.splat(val[6], val[7])). + concat(val[8]) ] + + result +end + +def _reduce_247(val, _values, result) + result = [ @builder.splat(val[0], val[1]), + *val[2] ] + + result +end + +def _reduce_248(val, _values, result) + result = [ val[0] ] + + result +end + +def _reduce_249(val, _values, result) + result = @lexer.cmdarg.dup + @lexer.cmdarg.push(true) + + result +end + +def _reduce_250(val, _values, result) + @lexer.cmdarg = val[0] + + result = val[1] + + result +end + +def _reduce_251(val, _values, result) + result = [ nil, val[0], nil ] + + result +end + +def _reduce_252(val, _values, result) + @lexer.state = :expr_endarg + + result +end + +def _reduce_253(val, _values, result) + result = [ val[0], [], val[2] ] + + result +end + +def _reduce_254(val, _values, result) + @lexer.state = :expr_endarg + + result +end + +def _reduce_255(val, _values, result) + result = [ val[0], val[1], val[3] ] + + result +end + +def _reduce_256(val, _values, result) + result = @builder.block_pass(val[0], val[1]) + + result +end + +def _reduce_257(val, _values, result) + result = [ val[1] ] + + result +end + +def _reduce_258(val, _values, result) + result = [] + + result +end + +def _reduce_259(val, _values, result) + result = [ val[0] ] + + result +end + +def _reduce_260(val, _values, result) + result = val[0] << val[2] + + result +end + +def _reduce_261(val, _values, result) + result = val[0] << val[2] + + result +end + +def _reduce_262(val, _values, result) + result = val[0] << @builder.splat(val[2], val[3]) + + result +end + +def _reduce_263(val, _values, result) + result = [ @builder.splat(val[0], val[1]) ] + + result +end + +# reduce 264 omitted + +# reduce 265 omitted + +# reduce 266 omitted + +# reduce 267 omitted + +# reduce 268 omitted + +# reduce 269 omitted + +# reduce 270 omitted + +# reduce 271 omitted + +def _reduce_272(val, _values, result) + result = @builder.call_method(nil, nil, val[0]) + + result +end + +def _reduce_273(val, _values, result) + result = @builder.begin_keyword(val[0], val[1], val[2]) + + result +end + +def _reduce_274(val, _values, result) + @lexer.state = :expr_endarg + + result +end + +def _reduce_275(val, _values, result) + result = @builder.begin(val[0], val[1], val[4]) + + result +end + +def _reduce_276(val, _values, result) + result = @builder.begin(val[0], val[1], val[2]) + + result +end + +def _reduce_277(val, _values, result) + result = @builder.const_fetch(val[0], val[1], val[2]) + + result +end + +def _reduce_278(val, _values, result) + result = @builder.const_global(val[0], val[1]) + + result +end + +def _reduce_279(val, _values, result) + result = @builder.index(val[0], val[1], val[2], val[3]) + + result +end + +def _reduce_280(val, _values, result) + result = @builder.array(val[0], val[1], val[2]) + + result +end + +def _reduce_281(val, _values, result) + result = @builder.associate(val[0], val[1], val[2]) + + result +end + +def _reduce_282(val, _values, result) + result = @builder.keyword_cmd(:return, val[0]) + + result +end + +def _reduce_283(val, _values, result) + result = @builder.keyword_cmd(:yield, val[0], val[1], val[2], val[3]) + + result +end + +def _reduce_284(val, _values, result) + result = @builder.keyword_cmd(:yield, val[0], val[1], [], val[2]) + + result +end + +def _reduce_285(val, _values, result) + result = @builder.keyword_cmd(:yield, val[0]) + + result +end + +def _reduce_286(val, _values, result) + result = @builder.keyword_cmd(:defined?, val[0], + val[2], [ val[3] ], val[4]) + + result +end + +def _reduce_287(val, _values, result) + method_call = @builder.call_method(nil, nil, val[0]) + + begin_t, args, body, end_t = val[1] + result = @builder.block(method_call, + begin_t, args, body, end_t) + + result +end + +# reduce 288 omitted + +def _reduce_289(val, _values, result) + begin_t, args, body, end_t = val[1] + result = @builder.block(val[0], + begin_t, args, body, end_t) + + result +end + +def _reduce_290(val, _values, result) + else_t, else_ = val[4] + result = @builder.condition(val[0], val[1], val[2], + val[3], else_t, + else_, val[5]) + + result +end + +def _reduce_291(val, _values, result) + else_t, else_ = val[4] + result = @builder.condition(val[0], val[1], val[2], + else_, else_t, + val[3], val[5]) + + result +end + +def _reduce_292(val, _values, result) + @lexer.cond.push(true) + + result +end + +def _reduce_293(val, _values, result) + @lexer.cond.pop + + result +end + +def _reduce_294(val, _values, result) + result = @builder.loop(:while, val[0], val[2], val[3], + val[5], val[6]) + + result +end + +def _reduce_295(val, _values, result) + @lexer.cond.push(true) + + result +end + +def _reduce_296(val, _values, result) + @lexer.cond.pop + + result +end + +def _reduce_297(val, _values, result) + result = @builder.loop(:until, val[0], val[2], val[3], + val[5], val[6]) + + result +end + +def _reduce_298(val, _values, result) + when_bodies = val[3][0..-2] + else_t, else_body = val[3][-1] + + result = @builder.case(val[0], val[1], + when_bodies, else_t, else_body, + val[4]) + + result +end + +def _reduce_299(val, _values, result) + when_bodies = val[2][0..-2] + else_t, else_body = val[2][-1] + + result = @builder.case(val[0], nil, + when_bodies, else_t, else_body, + val[3]) + + result +end + +def _reduce_300(val, _values, result) + result = @builder.case(val[0], nil, + [], val[2], val[3], + val[4]) + + result +end + +def _reduce_301(val, _values, result) + @lexer.cond.push(true) + + result +end + +def _reduce_302(val, _values, result) + @lexer.cond.pop + + result +end + +def _reduce_303(val, _values, result) + result = @builder.for(val[0], val[1], + val[2], val[4], + val[5], val[7], val[8]) + + result +end + +def _reduce_304(val, _values, result) + local_push + @context.in_class = true + + result +end + +def _reduce_305(val, _values, result) + k_class, ctx = val[0] + if @context.in_def + diagnostic :error, :class_in_def, nil, k_class + end + + lt_t, superclass = val[2] + result = @builder.def_class(k_class, val[1], + lt_t, superclass, + val[4], val[5]) + + local_pop + @context.in_class = ctx.in_class + + result +end + +def _reduce_306(val, _values, result) + @context.in_def = false + @context.in_class = false + local_push + + result +end + +def _reduce_307(val, _values, result) + k_class, ctx = val[0] + result = @builder.def_sclass(k_class, val[1], val[2], + val[5], val[6]) + + local_pop + @context.in_def = ctx.in_def + @context.in_class = ctx.in_class + + result +end + +def _reduce_308(val, _values, result) + @context.in_class = true + local_push + + result +end + +def _reduce_309(val, _values, result) + k_mod, ctx = val[0] + if @context.in_def + diagnostic :error, :module_in_def, nil, k_mod + end + + result = @builder.def_module(k_mod, val[1], + val[3], val[4]) + + local_pop + @context.in_class = ctx.in_class + + result +end + +def _reduce_310(val, _values, result) + local_push + result = context.dup + @context.in_def = true + + result +end + +def _reduce_311(val, _values, result) + result = @builder.def_method(val[0], val[1], + val[3], val[4], val[5]) + + local_pop + @context.in_def = val[2].in_def + + result +end + +def _reduce_312(val, _values, result) + @lexer.state = :expr_fname + + result +end + +def _reduce_313(val, _values, result) + local_push + result = context.dup + @context.in_def = true + + result +end + +def _reduce_314(val, _values, result) + result = @builder.def_singleton(val[0], val[1], val[2], + val[4], val[6], val[7], val[8]) + + local_pop + @context.in_def = val[5].in_def + + result +end + +def _reduce_315(val, _values, result) + result = @builder.keyword_cmd(:break, val[0]) + + result +end + +def _reduce_316(val, _values, result) + result = @builder.keyword_cmd(:next, val[0]) + + result +end + +def _reduce_317(val, _values, result) + result = @builder.keyword_cmd(:redo, val[0]) + + result +end + +def _reduce_318(val, _values, result) + result = @builder.keyword_cmd(:retry, val[0]) + + result +end + +# reduce 319 omitted + +def _reduce_320(val, _values, result) + result = [ val[0], @context.dup ] + + result +end + +def _reduce_321(val, _values, result) + result = [ val[0], @context.dup ] + + result +end + +# reduce 322 omitted + +# reduce 323 omitted + +# reduce 324 omitted + +def _reduce_325(val, _values, result) + result = val[1] + + result +end + +# reduce 326 omitted + +# reduce 327 omitted + +# reduce 328 omitted + +# reduce 329 omitted + +def _reduce_330(val, _values, result) + else_t, else_ = val[4] + result = [ val[0], + @builder.condition(val[0], val[1], val[2], + val[3], else_t, + else_, nil), + ] + + result +end + +# reduce 331 omitted + +def _reduce_332(val, _values, result) + result = val + + result +end + +# reduce 333 omitted + +# reduce 334 omitted + +def _reduce_335(val, _values, result) + result = [ @builder.arg_expr(val[0]) ] + + result +end + +def _reduce_336(val, _values, result) + result = val[0] << @builder.arg_expr(val[2]) + + result +end + +# reduce 337 omitted + +# reduce 338 omitted + +def _reduce_339(val, _values, result) + result = val[0]. + push(@builder.blockarg_expr(val[2], val[3])) + + result +end + +def _reduce_340(val, _values, result) + result = val[0]. + push(@builder.restarg_expr(val[2], val[3])). + push(@builder.blockarg_expr(val[5], val[6])) + + result +end + +def _reduce_341(val, _values, result) + result = val[0]. + push(@builder.restarg_expr(val[2])). + push(@builder.blockarg_expr(val[4], val[5])) + + result +end + +def _reduce_342(val, _values, result) + result = val[0]. + push(@builder.restarg_expr(val[2], val[3])) + + result +end + +def _reduce_343(val, _values, result) + result = val[0]. + push(@builder.restarg_expr(val[2])) + + result +end + +def _reduce_344(val, _values, result) + result = [ @builder.restarg_expr(val[0], val[1]), + @builder.blockarg_expr(val[3], val[4]) ] + + result +end + +def _reduce_345(val, _values, result) + result = [ @builder.restarg_expr(val[0]), + @builder.blockarg_expr(val[2], val[3]) ] + + result +end + +def _reduce_346(val, _values, result) + result = [ @builder.restarg_expr(val[0], val[1]) ] + + result +end + +def _reduce_347(val, _values, result) + result = [ @builder.restarg_expr(val[0]) ] + + result +end + +def _reduce_348(val, _values, result) + result = [ @builder.blockarg_expr(val[0], val[1]) ] + + result +end + +def _reduce_349(val, _values, result) + result = @builder.args(nil, [], nil) + + result +end + +def _reduce_350(val, _values, result) + result = @builder.args(val[0], [], val[1]) + + result +end + +def _reduce_351(val, _values, result) + result = @builder.args(val[0], [], val[0]) + + result +end + +def _reduce_352(val, _values, result) + result = @builder.args(val[0], val[1], val[2], false) + + result +end + +def _reduce_353(val, _values, result) + @static_env.extend_dynamic + result = @context.dup + @context.in_block = true + + result +end + +def _reduce_354(val, _values, result) + result = [ val[0], val[2], val[3], val[4] ] + + @static_env.unextend + @context.in_block = val[1].in_block + + result +end + +def _reduce_355(val, _values, result) + begin_t, block_args, body, end_t = val[1] + result = @builder.block(val[0], + begin_t, block_args, body, end_t) + + result +end + +def _reduce_356(val, _values, result) + lparen_t, args, rparen_t = val[3] + result = @builder.call_method(val[0], val[1], val[2], + lparen_t, args, rparen_t) + + result +end + +def _reduce_357(val, _values, result) + lparen_t, args, rparen_t = val[3] + result = @builder.call_method(val[0], val[1], val[2], + lparen_t, args, rparen_t) + + result +end + +def _reduce_358(val, _values, result) + lparen_t, args, rparen_t = val[1] + result = @builder.call_method(nil, nil, val[0], + lparen_t, args, rparen_t) + + result +end + +def _reduce_359(val, _values, result) + lparen_t, args, rparen_t = val[3] + result = @builder.call_method(val[0], val[1], val[2], + lparen_t, args, rparen_t) + + result +end + +def _reduce_360(val, _values, result) + lparen_t, args, rparen_t = val[3] + result = @builder.call_method(val[0], val[1], val[2], + lparen_t, args, rparen_t) + + result +end + +def _reduce_361(val, _values, result) + result = @builder.call_method(val[0], val[1], val[2]) + + result +end + +def _reduce_362(val, _values, result) + lparen_t, args, rparen_t = val[1] + result = @builder.keyword_cmd(:super, val[0], + lparen_t, args, rparen_t) + + result +end + +def _reduce_363(val, _values, result) + result = @builder.keyword_cmd(:zsuper, val[0]) + + result +end + +def _reduce_364(val, _values, result) + @static_env.extend_dynamic + result = @context.dup + @context.in_block = true + + result +end + +def _reduce_365(val, _values, result) + result = [ val[0], val[2], val[3], val[4] ] + + @static_env.unextend + @context.in_block = val[1].in_block + + result +end + +def _reduce_366(val, _values, result) + @static_env.extend_dynamic + result = @context.dup + @context.in_block = true + + result +end + +def _reduce_367(val, _values, result) + result = [ val[0], val[2], val[3], val[4] ] + + @static_env.unextend + @context.in_block = val[1].in_block + + result +end + +def _reduce_368(val, _values, result) + result = [ @builder.when(val[0], val[1], val[2], val[3]), + *val[4] ] + + result +end + +# reduce 369 omitted + +def _reduce_370(val, _values, result) + result = val[0] << @builder.splat(val[2], val[3]) + + result +end + +def _reduce_371(val, _values, result) + result = [ @builder.splat(val[0], val[1]) ] + + result +end + +def _reduce_372(val, _values, result) + result = [ val[0] ] + + result +end + +# reduce 373 omitted + +def _reduce_374(val, _values, result) + assoc_t, exc_var = val[2] + + if val[1] + exc_list = @builder.array(nil, val[1], nil) + end + + result = [ @builder.rescue_body(val[0], + exc_list, assoc_t, exc_var, + val[3], val[4]), + *val[5] ] + + result +end + +def _reduce_375(val, _values, result) + result = [] + + result +end + +def _reduce_376(val, _values, result) + result = [ val[0] ] + + result +end + +# reduce 377 omitted + +# reduce 378 omitted + +def _reduce_379(val, _values, result) + result = [ val[0], val[1] ] + + result +end + +# reduce 380 omitted + +def _reduce_381(val, _values, result) + result = [ val[0], val[1] ] + + result +end + +# reduce 382 omitted + +# reduce 383 omitted + +# reduce 384 omitted + +# reduce 385 omitted + +def _reduce_386(val, _values, result) + result = @builder.string_compose(nil, val[0], nil) + + result +end + +def _reduce_387(val, _values, result) + result = [ val[0] ] + + result +end + +def _reduce_388(val, _values, result) + result = val[0] << val[1] + + result +end + +def _reduce_389(val, _values, result) + result = @builder.string_compose(val[0], val[1], val[2]) + + result +end + +def _reduce_390(val, _values, result) + result = @builder.string(val[0]) + + result +end + +def _reduce_391(val, _values, result) + result = @builder.xstring_compose(val[0], val[1], val[2]) + + result +end + +def _reduce_392(val, _values, result) + opts = @builder.regexp_options(val[3]) + result = @builder.regexp_compose(val[0], val[1], val[2], opts) + + result +end + +def _reduce_393(val, _values, result) + result = @builder.words_compose(val[0], val[1], val[2]) + + result +end + +def _reduce_394(val, _values, result) + result = [] + + result +end + +def _reduce_395(val, _values, result) + result = val[0] << @builder.word(val[1]) + + result +end + +def _reduce_396(val, _values, result) + result = [ val[0] ] + + result +end + +def _reduce_397(val, _values, result) + result = val[0] << val[1] + + result +end + +def _reduce_398(val, _values, result) + result = @builder.words_compose(val[0], val[1], val[2]) + + result +end + +def _reduce_399(val, _values, result) + result = [] + + result +end + +def _reduce_400(val, _values, result) + result = val[0] << @builder.string_internal(val[1]) + + result +end + +def _reduce_401(val, _values, result) + result = [] + + result +end + +def _reduce_402(val, _values, result) + result = val[0] << val[1] + + result +end + +def _reduce_403(val, _values, result) + result = [] + + result +end + +def _reduce_404(val, _values, result) + result = val[0] << val[1] + + result +end + +def _reduce_405(val, _values, result) + result = @builder.string_internal(val[0]) + + result +end + +def _reduce_406(val, _values, result) + result = val[1] + + result +end + +def _reduce_407(val, _values, result) + @lexer.cond.push(false) + @lexer.cmdarg.push(false) + + result +end + +def _reduce_408(val, _values, result) + @lexer.cond.lexpop + @lexer.cmdarg.lexpop + + result = @builder.begin(val[0], val[2], val[3]) + + result +end + +def _reduce_409(val, _values, result) + result = @builder.gvar(val[0]) + + result +end + +def _reduce_410(val, _values, result) + result = @builder.ivar(val[0]) + + result +end + +def _reduce_411(val, _values, result) + result = @builder.cvar(val[0]) + + result +end + +# reduce 412 omitted + +def _reduce_413(val, _values, result) + result = @builder.symbol(val[0]) + + result +end + +def _reduce_414(val, _values, result) + result = @builder.symbol_compose(val[0], val[1], val[2]) + + result +end + +def _reduce_415(val, _values, result) + result = @builder.integer(val[0]) + + result +end + +def _reduce_416(val, _values, result) + result = @builder.float(val[0]) + + result +end + +def _reduce_417(val, _values, result) + num = @builder.integer(val[1]) + if @builder.respond_to? :negate + # AST builder interface compatibility + result = @builder.negate(val[0], num) + else + result = @builder.unary_num(val[0], num) + end + + result +end + +def _reduce_418(val, _values, result) + num = @builder.float(val[1]) + if @builder.respond_to? :negate + # AST builder interface compatibility + result = @builder.negate(val[0], num) + else + result = @builder.unary_num(val[0], num) + end + + result +end + +def _reduce_419(val, _values, result) + result = @builder.ident(val[0]) + + result +end + +def _reduce_420(val, _values, result) + result = @builder.ivar(val[0]) + + result +end + +def _reduce_421(val, _values, result) + result = @builder.gvar(val[0]) + + result +end + +def _reduce_422(val, _values, result) + result = @builder.cvar(val[0]) + + result +end + +def _reduce_423(val, _values, result) + result = @builder.const(val[0]) + + result +end + +def _reduce_424(val, _values, result) + result = @builder.nil(val[0]) + + result +end + +def _reduce_425(val, _values, result) + result = @builder.self(val[0]) + + result +end + +def _reduce_426(val, _values, result) + result = @builder.true(val[0]) + + result +end + +def _reduce_427(val, _values, result) + result = @builder.false(val[0]) + + result +end + +def _reduce_428(val, _values, result) + result = @builder.__FILE__(val[0]) + + result +end + +def _reduce_429(val, _values, result) + result = @builder.__LINE__(val[0]) + + result +end + +def _reduce_430(val, _values, result) + result = @builder.accessible(val[0]) + + result +end + +def _reduce_431(val, _values, result) + result = @builder.assignable(val[0]) + + result +end + +def _reduce_432(val, _values, result) + result = @builder.nth_ref(val[0]) + + result +end + +def _reduce_433(val, _values, result) + result = @builder.back_ref(val[0]) + + result +end + +def _reduce_434(val, _values, result) + result = nil + + result +end + +def _reduce_435(val, _values, result) + result = [ val[0], val[1] ] + + result +end + +def _reduce_436(val, _values, result) + yyerrok + result = nil + + result +end + +def _reduce_437(val, _values, result) + result = @builder.args(val[0], val[1], val[3]) + + @lexer.state = :expr_beg + + result +end + +def _reduce_438(val, _values, result) + result = @builder.args(nil, val[0], nil) + + result +end + +def _reduce_439(val, _values, result) + result = val[0]. + concat(val[2]). + concat(val[4]). + concat(val[5]) + + result +end + +def _reduce_440(val, _values, result) + result = val[0]. + concat(val[2]). + concat(val[3]) + + result +end + +def _reduce_441(val, _values, result) + result = val[0]. + concat(val[2]). + concat(val[3]) + + result +end + +def _reduce_442(val, _values, result) + result = val[0]. + concat(val[1]) + + result +end + +def _reduce_443(val, _values, result) + result = val[0]. + concat(val[2]). + concat(val[3]) + + result +end + +def _reduce_444(val, _values, result) + result = val[0]. + concat(val[1]) + + result +end + +def _reduce_445(val, _values, result) + result = val[0]. + concat(val[1]) + + result +end + +def _reduce_446(val, _values, result) + result = [ val[0] ] + + result +end + +def _reduce_447(val, _values, result) + result = [] + + result +end + +def _reduce_448(val, _values, result) + diagnostic :error, :argument_const, nil, val[0] + + result +end + +def _reduce_449(val, _values, result) + diagnostic :error, :argument_ivar, nil, val[0] + + result +end + +def _reduce_450(val, _values, result) + diagnostic :error, :argument_gvar, nil, val[0] + + result +end + +def _reduce_451(val, _values, result) + diagnostic :error, :argument_cvar, nil, val[0] + + result +end + +def _reduce_452(val, _values, result) + @static_env.declare val[0][0] + + result = @builder.arg(val[0]) + + result +end + +def _reduce_453(val, _values, result) + result = [ val[0] ] + + result +end + +def _reduce_454(val, _values, result) + result = val[0] << val[2] + + result +end + +def _reduce_455(val, _values, result) + @static_env.declare val[0][0] + + result = @builder.optarg(val[0], val[1], val[2]) + + result +end + +def _reduce_456(val, _values, result) + result = [ val[0] ] + + result +end + +def _reduce_457(val, _values, result) + result = val[0] << val[2] + + result +end + +# reduce 458 omitted + +# reduce 459 omitted + +def _reduce_460(val, _values, result) + @static_env.declare val[1][0] + + result = [ @builder.restarg(val[0], val[1]) ] + + result +end + +def _reduce_461(val, _values, result) + result = [ @builder.restarg(val[0]) ] + + result +end + +# reduce 462 omitted + +# reduce 463 omitted + +def _reduce_464(val, _values, result) + @static_env.declare val[1][0] + + result = @builder.blockarg(val[0], val[1]) + + result +end + +def _reduce_465(val, _values, result) + result = [ val[1] ] + + result +end + +def _reduce_466(val, _values, result) + result = [] + + result +end + +# reduce 467 omitted + +def _reduce_468(val, _values, result) + result = val[1] + + result +end + +def _reduce_469(val, _values, result) + result = [] + + result +end + +def _reduce_470(val, _values, result) + result = val[0] + + result +end + +def _reduce_471(val, _values, result) + result = @builder.pair_list_18(val[0]) + + result +end + +def _reduce_472(val, _values, result) + result = [ val[0] ] + + result +end + +def _reduce_473(val, _values, result) + result = val[0] << val[2] + + result +end + +def _reduce_474(val, _values, result) + result = @builder.pair(val[0], val[1], val[2]) + + result +end + +# reduce 475 omitted + +# reduce 476 omitted + +# reduce 477 omitted + +# reduce 478 omitted + +# reduce 479 omitted + +# reduce 480 omitted + +# reduce 481 omitted + +# reduce 482 omitted + +# reduce 483 omitted + +# reduce 484 omitted + +# reduce 485 omitted + +# reduce 486 omitted + +# reduce 487 omitted + +# reduce 488 omitted + +# reduce 489 omitted + +# reduce 490 omitted + +# reduce 491 omitted + +# reduce 492 omitted + +# reduce 493 omitted + +def _reduce_494(val, _values, result) + yyerrok + + result +end + +# reduce 495 omitted + +# reduce 496 omitted + +# reduce 497 omitted + +def _reduce_498(val, _values, result) + result = nil + + result +end + +def _reduce_none(val, _values, result) + val[0] +end + + end # class Ruby18 + end # module Parser diff --git a/vendor/bundle/ruby/3.1.0/gems/parser-3.1.2.0/lib/parser/ruby19.rb b/vendor/bundle/ruby/3.1.0/gems/parser-3.1.2.0/lib/parser/ruby19.rb new file mode 100644 index 000000000..7920c2c67 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/parser-3.1.2.0/lib/parser/ruby19.rb @@ -0,0 +1,6126 @@ +# -*- encoding:utf-8; warn-indent:false; frozen_string_literal: true -*- +# +# DO NOT MODIFY!!!! +# This file is automatically generated by Racc 1.4.15 +# from Racc grammer file "". +# + +require 'racc/parser.rb' + + +require 'parser' + +module Parser + class Ruby19 < Parser::Base + + + def version + 19 + end + + def default_encoding + Encoding::BINARY + end + + def local_push + @static_env.extend_static + @lexer.cmdarg.push(false) + @lexer.cond.push(false) + end + + def local_pop + @static_env.unextend + @lexer.cmdarg.pop + @lexer.cond.pop + end +##### State transition tables begin ### + +clist = [ +'-455,280,71,72,68,9,54,-455,-455,-455,60,61,-455,-455,-455,64,-455,62', +'63,65,29,30,69,70,-455,260,-455,-455,-455,28,27,26,95,94,96,97,-455', +'-455,19,-455,-455,-455,-455,-455,8,44,-99,10,99,98,100,89,53,91,90,92', +'543,93,101,102,522,87,88,41,42,40,-455,-455,-455,-455,-455,-455,-455', +'-455,-455,-455,-455,-455,-455,-455,-101,210,-455,-455,-455,39,-455,-455', +'32,-100,-455,55,56,-455,-455,57,-455,34,-455,564,-455,43,-455,-455,-455', +'-455,-455,-455,-455,20,-455,259,-455,-102,86,78,81,82,211,83,84,553', +'-98,888,79,85,-455,-455,-455,-455,-533,-455,59,-455,80,-455,522,-533', +'-533,-533,-96,-97,-533,-533,-533,-82,-533,671,-104,671,512,-68,522,514', +'-529,-533,-533,-533,-533,-103,-99,542,563,522,522,-99,-533,-533,103', +'-533,-533,-533,-533,-533,107,-98,-101,785,-530,106,671,107,555,554,565', +'-92,106,760,-99,207,208,207,208,-100,-91,499,-533,-533,-533,-533,-533', +'-533,-533,-533,-533,-533,-533,-533,-533,-533,78,534,-533,-533,-533,535', +'726,-533,-93,79,-533,207,208,-533,-533,115,-533,-89,-533,80,-533,199', +'-533,-533,-533,-533,-533,-533,-533,200,-533,-533,-533,107,-103,-87,-88', +'107,106,107,107,201,106,-95,106,106,-533,-533,-533,-533,-458,-533,206', +'-533,-94,-100,107,-458,-458,-458,-529,106,-458,-458,-458,250,-458,107', +'107,211,107,211,106,106,-458,106,-458,-458,-458,-98,-101,260,759,-90', +'-98,-101,-458,-458,304,-458,-458,-458,-458,-458,207,208,599,-100,-92', +'-90,724,107,-100,305,260,599,106,599,774,211,652,651,650,599,653,372', +'-458,-458,-458,-458,-458,-458,-458,-458,-458,-458,-458,-458,-458,-458', +'598,-466,-458,-458,-458,385,-458,-458,-466,598,-458,598,725,-458,-458', +'255,-458,598,-458,-99,-458,428,-458,-458,-458,-458,-458,-458,-458,636', +'-458,528,-458,430,-92,-90,-469,259,255,577,553,306,307,431,-526,-533', +'-458,-458,-458,-458,-281,-458,210,-458,211,-458,846,-281,-281,-281,259', +'-101,-281,-281,-281,-470,-281,107,502,463,-92,-90,106,-92,-90,503,-281', +'-281,-281,-92,-90,472,-90,-533,427,-96,-281,-281,-99,-281,-281,-281', +'-281,-281,780,636,-455,-533,-458,-462,429,555,554,-455,-533,-458,-462', +'474,-526,-529,703,476,-455,-533,-97,803,-281,-281,-281,-281,-281,-281', +'-281,-281,-281,-281,-281,-281,-281,-281,-526,-533,-281,-281,-281,-533', +'727,-281,-399,578,-281,-67,-533,-281,-281,211,-281,-529,-281,-104,-281', +'-533,-281,-281,-281,-281,-281,-281,-281,-281,-281,-470,-281,484,-98', +'485,-281,-281,-281,-533,205,-469,-281,-281,492,-281,-281,-281,-281,-281', +'264,-281,-92,-281,-460,-102,231,-527,-101,107,-399,-460,207,208,106', +'-281,-281,-399,-281,-281,-281,-281,-281,211,-88,774,-399,652,651,650', +'-97,653,512,-95,-87,514,107,553,228,-104,-96,106,230,229,-399,-281,-281', +'-281,-281,-281,-281,-281,-281,-281,-281,-281,-281,-281,-281,-458,553', +'-281,-281,-281,255,582,-458,-455,499,-281,496,-527,-281,-463,-455,-458', +'500,-281,501,-281,-463,-281,-281,-281,-281,-281,-281,-281,-533,-281', +'553,-281,231,-527,710,-533,-533,-533,555,554,558,-533,-533,928,-533', +'-281,-281,507,-93,-464,-281,-94,231,-533,-102,107,-464,-103,508,530', +'106,555,554,560,-533,-533,531,-533,-533,-533,-533,-533,780,636,515,529', +'737,-89,652,651,650,553,653,-98,228,107,207,208,230,229,106,555,554', +'556,-533,-533,-533,-533,-533,-533,-533,-533,-533,-533,-533,-533,-533', +'-533,-465,231,-533,-533,-533,657,583,-465,512,516,-533,511,252,-533', +'661,660,664,663,-533,253,-533,476,-533,-533,-533,-533,-533,-533,-533', +'528,-533,-533,-533,228,555,554,551,230,229,226,227,512,374,-461,514', +'548,-533,-533,736,-91,-461,-533,549,207,208,-100,280,71,72,68,9,54,382', +'532,-282,60,61,384,383,533,64,-282,62,63,65,29,30,69,70,566,-282,494', +'495,569,28,27,26,95,94,96,97,-260,774,19,652,651,650,571,653,8,44,211', +'10,99,98,100,89,53,91,90,92,575,93,101,102,576,87,88,41,42,40,774,255', +'652,651,650,-282,653,774,770,652,651,650,-282,653,586,589,-281,892,231', +'39,231,-282,32,-281,231,55,56,231,-530,57,211,34,-281,211,211,43,774', +'770,652,651,650,-82,653,20,657,618,773,211,86,78,81,82,505,83,84,664', +'663,629,79,85,280,71,72,68,9,54,59,636,80,60,61,667,528,657,64,674,62', +'63,65,29,30,69,70,702,664,663,705,-261,28,27,26,95,94,96,97,711,774', +'19,652,651,650,463,653,8,44,463,10,99,98,100,89,53,91,90,92,211,93,101', +'102,729,87,88,41,42,40,774,474,652,651,650,538,653,774,770,652,651,650', +'913,653,476,629,-281,773,211,39,255,539,32,-281,255,55,56,629,-530,57', +'231,34,-281,231,750,43,774,770,652,651,650,-260,653,20,657,754,211,762', +'86,78,81,82,764,83,84,664,663,767,79,85,280,71,72,68,9,54,59,768,80', +'60,61,776,777,657,64,636,62,63,65,29,30,69,70,784,664,663,211,211,28', +'27,26,95,94,96,97,697,698,19,793,699,101,102,587,8,44,-262,10,99,98', +'100,89,53,91,90,92,802,93,101,102,805,87,88,41,42,40,231,235,240,241', +'242,237,239,247,248,243,244,-274,224,225,538,807,245,246,-274,39,810', +'537,282,811,736,55,56,-274,817,57,539,34,228,818,234,43,230,229,226', +'227,238,236,232,20,233,820,821,629,86,78,81,82,830,83,84,736,844,490', +'79,85,211,249,-534,-237,491,848,59,850,80,-534,-534,-534,856,489,-534', +'-534,-534,774,-534,652,651,650,858,653,231,211,861,-534,-534,-534,-534', +'815,-263,652,651,650,868,653,-534,-534,869,-534,-534,-534,-534,-534', +'774,872,652,651,650,-468,653,877,657,211,228,881,-468,884,230,229,226', +'227,886,664,663,-468,-534,-534,-534,-534,-534,-534,-534,-534,-534,-534', +'-534,-534,-534,-534,888,770,-534,-534,-534,-467,888,-534,211,893,-534', +'896,-467,-534,-534,897,-534,902,-534,904,-534,-467,-534,-534,-534,-534', +'-534,-534,-534,-274,-534,-534,-534,907,875,909,-274,888,888,914,507', +'876,921,922,930,-274,-534,-534,-534,-534,874,-534,211,-534,5,71,72,68', +'9,54,942,888,-468,60,61,888,888,946,64,-468,62,63,65,29,30,69,70,930', +'-468,949,950,952,28,27,26,95,94,96,97,888,815,19,652,651,650,888,653', +'8,44,7,10,99,98,100,89,53,91,90,92,888,93,101,102,-530,87,88,41,42,40', +'774,-529,652,651,650,930,653,888,774,930,652,651,650,,653,,,,,39,,,32', +',,55,56,,,57,774,34,652,651,650,43,653,770,737,-467,652,651,650,20,653', +'657,-467,,86,78,81,82,,83,84,-467,664,663,79,85,280,71,72,68,9,54,59', +'770,80,60,61,,,,64,657,62,63,65,29,30,69,70,,661,660,664,663,28,27,26', +'95,94,96,97,,774,19,652,651,650,,653,8,44,,10,99,98,100,89,53,91,90', +'92,,93,101,102,,87,88,41,42,40,110,111,112,113,114,425,,774,770,652', +'651,650,426,653,,,203,-325,,39,,427,32,204,-325,55,56,,,57,-282,34,202', +'-325,,43,774,-282,652,651,650,,653,20,657,,-282,,86,78,81,82,,83,84', +'664,663,,79,85,280,71,72,68,9,54,59,,80,60,61,,,657,64,,62,63,65,29', +'30,69,70,,664,663,,,28,27,26,95,94,96,97,,,19,110,111,112,113,114,8', +'44,,10,99,98,100,89,53,91,90,92,,93,101,102,,87,88,41,42,40,110,111', +'112,113,114,,,,774,,652,651,650,,653,,-281,,,39,,,32,-281,,55,56,,-530', +'57,,34,-281,,,43,,,655,,652,651,650,20,653,657,,,86,78,81,82,,83,84', +',664,663,79,85,280,71,72,68,9,54,59,,80,60,61,,,,64,657,62,63,65,29', +'30,69,70,,661,660,664,663,28,27,26,95,94,96,97,,,19,110,111,112,113', +'114,8,44,,10,99,98,100,89,53,91,90,92,,93,101,102,,87,88,41,42,40,,', +',,,,,,,,,,,,,,,,,39,,,32,,,55,56,,,57,,34,,,,43,,,655,,652,651,650,20', +'653,,,,86,78,81,82,,83,84,,,,79,85,280,71,72,68,9,54,59,,80,60,61,,', +',64,657,62,63,65,29,30,69,70,,661,660,664,663,28,27,26,95,94,96,97,', +',19,,,,,,8,44,,10,99,98,100,89,53,91,90,92,,93,101,102,,87,88,41,42', +'40,,,,,,,,,,,,,,,,,,,,39,,,32,,,55,56,,,57,,34,,,,43,,,737,,652,651', +'650,20,653,,,,86,78,81,82,,83,84,,,,79,85,280,71,72,68,9,54,59,,80,60', +'61,,,,64,657,62,63,65,29,30,69,70,,661,660,664,663,28,27,26,95,94,96', +'97,,,19,,,,,,8,44,,10,99,98,100,89,53,91,90,92,,93,101,102,,87,88,41', +'42,40,,,,,,,,,,,,,,,,,,,,39,,,32,,,55,56,,,57,,34,,,,43,,,737,,652,651', +'650,20,653,,,,86,78,81,82,,83,84,,,,79,85,280,71,72,68,9,54,59,,80,60', +'61,,,,64,657,62,63,65,29,30,69,70,,661,660,664,663,28,27,26,95,94,96', +'97,,,19,,,,,,8,44,,10,99,98,100,89,53,91,90,92,,93,101,102,,87,88,41', +'42,40,,,,,,,,,,,,,,,,,,,,39,,,32,,,55,56,,,57,,34,,,,43,,,655,,652,651', +'650,20,653,,,,86,78,81,82,,83,84,,,,79,85,280,71,72,68,9,54,59,,80,60', +'61,,,,64,657,62,63,65,29,30,69,70,,661,660,664,663,28,27,26,95,94,96', +'97,,,19,,,,,,8,44,,10,99,98,100,89,53,91,90,92,,93,101,102,,87,88,41', +'42,40,,,,,,,,,,,,,,,,,,,,39,,,32,,,55,56,,,57,,34,,,,43,,,655,,652,651', +'650,20,653,,,,86,78,81,82,,83,84,,,,79,85,280,71,72,68,9,54,59,,80,60', +'61,,,,64,657,62,63,65,29,30,69,70,,661,660,664,663,28,27,26,95,94,96', +'97,,,19,,,,,,8,44,,10,99,98,100,89,53,91,90,92,,93,101,102,,87,88,41', +'42,40,,,,,,,,,,,,,,,,,,,,39,,,32,,,55,56,,,57,,34,,,,43,,,655,,652,651', +'650,20,653,,,,86,78,81,82,,83,84,,,,79,85,280,71,72,68,9,54,59,,80,60', +'61,,,,64,657,62,63,65,29,30,69,70,,661,660,664,663,28,27,26,95,94,96', +'97,,,19,,,,,,8,44,,10,99,98,100,89,53,91,90,92,,93,101,102,,87,88,41', +'42,40,231,,,,,,,,,,,,,,,,245,246,,39,,,32,,,55,56,,,57,,34,228,,234', +'43,230,229,226,227,,,232,20,233,,,,86,78,81,82,,83,84,,,,79,85,280,71', +'72,68,9,54,59,,80,60,61,,,,64,,62,63,65,29,30,69,70,,,,,,28,27,26,95', +'94,96,97,,,19,,,,,,8,44,,10,99,98,100,89,53,91,90,92,,93,101,102,,87', +'88,41,42,40,231,,,,,,,,,,,,,,,,245,246,,39,,,32,,,55,56,,,57,,34,228', +',234,43,230,229,226,227,,,232,20,233,,,,86,78,81,82,,83,84,,,,79,85', +'280,71,72,68,9,54,59,,80,60,61,,,,64,,62,63,65,29,30,69,70,,,,,,28,27', +'26,95,94,96,97,,,19,,,,,,8,44,,10,99,98,100,89,53,91,90,92,,93,101,102', +',87,88,41,42,40,231,235,240,241,242,237,239,247,,243,244,,,,,,245,246', +',39,,,32,,,55,56,,,57,,34,228,,234,43,230,229,226,227,238,236,232,20', +'233,,,,86,78,81,82,,83,84,,,,79,85,280,71,72,68,9,54,59,,80,60,61,,', +',64,,62,63,65,29,30,69,70,,,,,,28,27,26,95,94,96,97,,,19,,,,,,8,44,', +'10,99,98,100,89,53,91,90,92,,93,101,102,,87,88,41,42,40,231,-552,-552', +'-552,-552,237,239,,,-552,-552,,,,,,245,246,,39,,,32,,,55,56,,,57,,34', +'228,,234,43,230,229,226,227,238,236,232,20,233,,,,86,78,81,82,,83,84', +',,,79,85,280,71,72,68,9,54,59,,80,60,61,,,,64,,62,63,65,29,30,69,70', +',,,,,28,27,26,95,94,96,97,,,19,,,,,587,8,44,,10,99,98,100,89,53,91,90', +'92,,93,101,102,,87,88,41,42,40,231,235,240,241,242,237,239,247,248,243', +'244,,224,225,,,245,246,,39,,,32,,,55,56,,,57,,34,228,,234,43,230,229', +'226,227,238,236,232,20,233,,,,86,78,81,82,,83,84,,,,79,85,,249,-535', +',,,59,,80,-535,-535,-535,,,-535,-535,-535,655,-535,652,651,650,,653', +',,,-535,-535,-535,-535,,,,,,,,-535,-535,,-535,-535,-535,-535,-535,,', +',,,,,,657,644,,,,,,,,661,660,664,663,,-535,-535,-535,-535,-535,-535', +'-535,-535,-535,-535,-535,-535,-535,-535,,,-535,-535,-535,,,-535,,,-535', +',,-535,-535,,-535,,-535,,-535,,-535,-535,-535,-535,-535,-535,-535,,-535', +'-535,-535,,,,,,,,,,,,,,-535,-535,-535,-535,,-535,,-535,280,71,72,68', +'9,54,,,,60,61,,,,64,,62,63,65,29,30,69,70,,,,,,28,27,26,95,94,96,97', +',,19,,,,,,8,44,,10,99,98,100,89,53,91,90,92,,93,101,102,,87,88,41,42', +'40,231,-552,-552,-552,-552,237,239,,,-552,-552,,,,,,245,246,,39,,,282', +',,55,56,,,57,,34,228,,234,43,230,229,226,227,238,236,232,20,233,,,,86', +'78,81,82,,83,84,,,,79,85,280,71,72,68,9,54,59,,80,60,61,,,,64,,62,63', +'65,29,30,69,70,,,,,,28,27,26,95,94,96,97,,,19,,,,,,8,44,,10,99,98,100', +'89,53,91,90,92,,93,101,102,,87,88,41,42,40,231,-552,-552,-552,-552,237', +'239,,,-552,-552,,,,,,245,246,,39,,,32,,,55,56,,,57,,34,228,,234,43,230', +'229,226,227,238,236,232,20,233,,,,86,78,81,82,,83,84,,,,79,85,280,71', +'72,68,9,54,59,,80,60,61,,,,64,,62,63,65,29,30,69,70,,,,,,28,27,26,95', +'94,96,97,,,19,,,,,,8,44,,10,99,98,100,89,53,91,90,92,,93,101,102,,87', +'88,41,42,40,231,,,,,,,,,,,,,,,,245,246,,39,,,32,,,55,56,,,57,,34,228', +',234,43,230,229,226,227,,,232,20,233,,,,86,78,81,82,,83,84,,,,79,85', +'280,71,72,68,9,54,59,,80,60,61,,,,64,,62,63,65,29,30,69,70,,,,,,28,27', +'26,95,94,96,97,,,19,,,,,,8,44,,10,99,98,100,89,53,91,90,92,,93,101,102', +',87,88,41,42,40,231,-552,-552,-552,-552,237,239,,,-552,-552,,,,,,245', +'246,,39,,,32,,,55,56,,,57,,34,228,,234,43,230,229,226,227,238,236,232', +'20,233,,,,86,78,81,82,,83,84,,,,79,85,280,71,72,68,9,54,59,,80,60,61', +',,,64,,62,63,65,29,30,69,70,,,,,,28,27,26,95,94,96,97,,,19,,,,,,8,44', +',10,99,98,100,89,53,91,90,92,,93,101,102,,87,88,41,42,40,231,-552,-552', +'-552,-552,237,239,,,-552,-552,,,,,,245,246,,39,,,32,,,55,56,,,57,,34', +'228,,234,43,230,229,226,227,238,236,232,20,233,,,,86,78,81,82,,83,84', +',,,79,85,280,71,72,68,9,54,59,,80,60,61,,,,64,,62,63,65,29,30,69,70', +',,,,,28,27,26,95,94,96,97,,,19,,,,,572,8,44,,10,99,98,100,89,53,91,90', +'92,,93,101,102,,87,88,41,42,40,231,235,240,241,242,237,239,247,248,243', +'244,,224,225,,,245,246,,39,,,32,,,55,56,,,57,,34,228,,234,43,230,229', +'226,227,238,236,232,20,233,,,,86,78,81,82,,83,84,,,,79,85,,249,-275', +',,,59,,80,-275,-275,-275,,,-275,-275,-275,655,-275,652,651,650,,653', +',,,,-275,-275,-275,,,,,,,,-275,-275,,-275,-275,-275,-275,-275,,,,,,', +',,657,692,,,,,,,,661,660,664,663,,-275,-275,-275,-275,-275,-275,-275', +'-275,-275,-275,-275,-275,-275,-275,,,-275,-275,-275,,,-275,,,-275,,', +'-275,-275,,-275,,-275,,-275,,-275,-275,-275,-275,-275,-275,-275,,-275', +',-275,,,,,,,,,,,,,,-275,-275,-275,-275,,-275,,-275,280,71,72,68,9,54', +',,,60,61,,,,64,,62,63,65,29,30,69,70,,,,,,28,27,26,95,94,96,97,,,19', +',,,,,8,44,,10,99,98,100,89,53,91,90,92,,93,101,102,,87,88,41,42,40,231', +'235,240,241,242,237,239,,,243,244,,,,,,245,246,,39,,,32,,,55,56,,,57', +',34,228,,234,43,230,229,226,227,238,236,232,20,233,,,,86,78,81,82,,83', +'84,,,,79,85,280,71,72,68,9,54,59,,80,60,61,,,,64,,62,63,65,29,30,69', +'70,,,,,,28,27,26,95,94,96,97,,,19,,,,,,8,44,,10,99,98,100,89,53,91,90', +'92,,93,101,102,,87,88,41,42,40,231,235,240,241,242,237,239,247,248,243', +'244,,-552,-552,,,245,246,,39,,,282,,,55,56,,,57,,34,228,,234,43,230', +'229,226,227,238,236,232,20,233,,,,86,78,81,82,,83,84,,,,79,85,280,71', +'72,68,9,54,59,,80,60,61,,,,64,,62,63,65,29,30,69,70,,,,,,28,27,26,95', +'94,96,97,,,19,,,,,,8,44,,10,99,98,100,89,53,91,90,92,,93,101,102,,87', +'88,41,42,40,231,235,240,241,242,237,239,247,248,243,244,,-552,-552,', +',245,246,,39,,,32,,,55,56,,,57,,34,228,,234,43,230,229,226,227,238,236', +'232,20,233,,,,86,78,81,82,,83,84,,,,79,85,5,71,72,68,9,54,59,,80,60', +'61,,,,64,,62,63,65,29,30,69,70,,,,,,28,27,26,95,94,96,97,,,19,,,,,,8', +'44,7,10,99,98,100,89,53,91,90,92,,93,101,102,,87,88,41,42,40,231,,,', +',,,,,,,,,,,,245,246,,39,,,32,,,55,56,,,57,,34,228,,234,43,230,229,226', +'227,,,232,20,233,,,,86,78,81,82,,83,84,,,,79,85,280,71,72,68,9,54,59', +',80,60,61,,,,64,,62,63,65,29,30,69,70,,,,,,28,27,26,95,94,96,97,,,19', +',,,,,8,44,,10,99,98,100,89,53,91,90,92,,93,101,102,,87,88,41,42,40,231', +'-552,-552,-552,-552,237,239,,,-552,-552,,,,,,245,246,,39,,,32,,,55,56', +',,57,,34,228,,234,43,230,229,226,227,238,236,232,20,233,,,,86,78,81', +'82,,83,84,,,,79,85,280,71,72,68,9,54,59,,80,60,61,,,,64,,62,63,65,29', +'30,69,70,,,,,,28,27,26,95,94,96,97,,,19,,,,,,8,44,,10,99,98,100,89,53', +'91,90,92,,93,101,102,,87,88,41,42,40,231,,,,,,,,,,,,,,,,245,246,,39', +',,32,,,55,56,,,57,,34,228,,234,43,230,229,226,227,,,,20,,,,,86,78,81', +'82,,83,84,,,,79,85,,71,72,68,,54,59,,80,60,61,,,,64,,62,63,65,29,30', +'69,70,,,,,,28,27,26,95,94,96,97,,,223,,,,,,,44,,,99,98,100,89,53,91', +'90,92,,93,101,102,,87,88,41,42,40,231,,,,,,,,,,,,,,,,245,246,,216,,', +'222,,,55,56,,,57,,,228,,234,43,230,229,226,227,,,,221,,,,,86,78,81,82', +',83,84,,,,79,85,,71,72,68,,54,59,,80,60,61,,,,64,,62,63,65,297,298,69', +'70,,,,,,293,294,300,95,94,96,97,,,223,,,,,,,44,,,99,98,100,89,53,91', +'90,92,,93,101,102,,87,88,41,42,40,231,,,,,,,,,,,,,,,,245,246,,216,,', +'222,,,55,56,,,57,,,228,,,43,230,229,226,227,,,,221,,,,,86,78,81,82,', +'83,84,,,,79,85,,71,72,68,,54,59,,80,60,61,,,,64,,62,63,65,297,298,69', +'70,,,,,,293,294,300,95,94,96,97,,,223,,,,,,,295,,,99,98,100,89,53,91', +'90,92,,93,101,102,,87,88,,655,301,652,651,650,,653,,,,,,,,,,,,,,,291', +',,287,,,55,56,,,57,,,,,,657,692,,,,,,,,661,660,664,663,86,78,81,82,', +'83,84,,,,79,85,,71,72,68,,54,59,,80,60,61,,,,64,,62,63,65,297,298,69', +'70,,,,,,293,294,300,95,94,96,97,,,223,,,,,,,44,,,99,98,100,89,53,91', +'90,92,,93,101,102,,87,88,41,42,40,,,,,,,,,,,,,,,,,,,,216,,,222,,,55', +'56,,,57,,,,,,43,,,,,,,,221,,,,,86,78,81,82,,83,84,,,,79,85,,71,72,68', +',54,59,,80,60,61,,,,64,,62,63,65,297,298,69,70,,,,,,293,294,300,95,94', +'96,97,,,223,,,,,,,295,,,99,98,100,89,53,91,90,92,,93,101,102,,87,88', +',,301,,,,,,,,,,,,,,,,,,,,291,,,287,,,55,56,,,57,,,,,,,,,,,,,,,,,,,86', +'78,81,82,,83,84,,,,79,85,,71,72,68,,54,59,,80,60,61,,,,64,,62,63,65', +'29,30,69,70,,,,,,28,27,26,95,94,96,97,,,223,,,,,,,44,,,99,98,100,89', +'53,91,90,92,275,93,101,102,,87,88,41,42,40,,,,,,,,,,,,,,,,,,,,216,,', +'222,,,55,56,,,57,,273,,271,,43,,,,,,,,221,,,,,86,78,81,82,,83,84,,,', +'79,85,,71,72,68,,54,59,,80,60,61,,,,64,,62,63,65,29,30,69,70,,,,,,28', +'27,26,95,94,96,97,,,223,,,,,,,44,,,99,98,100,89,53,91,90,92,275,93,101', +'102,,87,88,41,42,40,,,,,,,,,,,,,,,,,,,,216,,,222,,,55,56,,,57,,273,', +'271,,43,,,,,,,,221,,,,,86,78,81,82,,83,84,,,,79,85,,71,72,68,,54,59', +',80,60,61,,,,64,,62,63,65,29,30,69,70,,,,,,28,27,26,95,94,96,97,,,19', +',,,,,,44,,,99,98,100,89,53,91,90,92,,93,101,102,,87,88,41,42,40,,,,', +',,,,,,,,,,,,,,,216,,,222,,,55,56,,,57,,,,,,43,,,,,,,,20,,,,,86,78,81', +'82,,83,84,,,,79,85,,71,72,68,,54,59,,80,60,61,,,,64,,62,63,65,29,30', +'69,70,,,,,,28,27,26,95,94,96,97,,,223,,,,,,,44,,,99,98,100,89,53,91', +'90,92,275,93,101,102,,87,88,41,42,40,,,,,,,,,,,,,,,,,,,,216,,,222,,', +'55,56,,,57,,273,,271,,43,,,,,,,,221,,,,,86,78,81,82,,83,84,,,,79,85', +'211,71,72,68,,54,59,,80,60,61,,,,64,,62,63,65,297,298,69,70,,,,,,293', +'294,300,95,94,96,97,,,223,,,,,,,44,,,99,98,100,89,53,91,90,92,,93,101', +'102,,87,88,41,42,40,,,,,,,,,,,,,,,,,,,,216,,,222,,,55,56,,,57,,613,', +',,43,,,,,,,,221,,,,,86,78,81,82,,83,84,,,,79,85,,71,72,68,,54,59,,80', +'60,61,,,,64,,62,63,65,29,30,69,70,,,,,,28,27,26,95,94,96,97,,,19,,,', +',,,44,,,99,98,100,89,53,91,90,92,,93,101,102,,87,88,41,42,40,,,,,,,', +',,,,,,,,,,,,216,,,222,,,55,56,,,57,,,,,,43,,,,,,,,20,,,,,86,78,81,82', +',83,84,,,,79,85,,71,72,68,,54,59,,80,60,61,,,,64,,62,63,65,297,298,69', +'70,,,,,,293,294,300,95,94,96,97,,,223,,,,,,,44,,,99,98,100,89,53,91', +'90,92,,93,101,102,,87,88,41,42,40,,,,,,,,,,,,,,,,,,,,216,,,222,,,55', +'56,,,57,,,,,,43,,,,,,,,221,,,,,86,78,81,82,,83,84,,,,79,85,,71,72,68', +',54,59,,80,60,61,,,,64,,62,63,65,297,298,69,70,,,,,,293,294,300,95,94', +'96,97,,,223,,,,,,,44,,,99,98,100,89,53,91,90,92,,93,101,102,,87,88,41', +'42,40,,,,,,,,,,,,,,,,,,,,216,,,222,,,55,56,,,57,,,,,,43,,,,,,,,221,', +',,,86,78,81,82,,83,84,,,,79,85,,71,72,68,,54,59,,80,60,61,,,,64,,62', +'63,65,297,298,69,70,,,,,,293,294,300,95,94,96,97,,,223,,,,,,,44,,,99', +'98,100,89,53,91,90,92,,93,101,102,,87,88,41,42,40,,,,,,,,,,,,,,,,,,', +',216,,,222,,,55,56,,,57,,,,,,43,,,,,,,,221,,,,,86,78,81,82,,83,84,,', +',79,85,,71,72,68,,54,59,,80,60,61,,,,64,,62,63,65,297,298,69,70,,,,', +',293,294,300,95,94,96,97,,,223,,,,,,,44,,,99,98,100,89,53,91,90,92,275', +'93,101,102,,87,88,41,42,40,,,,,,,,,,,,,,,,,,,,216,,,222,,,55,56,,,57', +',,,271,,43,,,,,,,,221,,,,,86,78,81,82,,83,84,,,,79,85,,71,72,68,,54', +'59,,80,60,61,,,,64,,62,63,65,297,298,69,70,,,,,,293,294,300,95,94,96', +'97,,,223,,,,,,,44,,,99,98,100,89,53,91,90,92,,93,101,102,,87,88,41,42', +'40,,,,,,,,,,,,,,,,,,,,216,,,222,,,55,56,,,57,,,,,,43,,,,,,,,221,,,,', +'86,78,81,82,,83,84,,,,79,85,,71,72,68,,54,59,,80,60,61,,,,64,,62,63', +'65,29,30,69,70,,,,,,28,27,26,95,94,96,97,,,19,,,,,,,44,,,99,98,100,89', +'53,91,90,92,,93,101,102,,87,88,41,42,40,,,,,,,,,,,,,,,,,,,,216,,,222', +',,55,56,,,57,,,,,,43,,,,,,,,20,,,,,86,78,81,82,,83,84,,,,79,85,211,71', +'72,68,,54,59,,80,60,61,,,,64,,62,63,65,29,30,69,70,,,,,,28,27,26,95', +'94,96,97,,,19,,,,,,,44,,,99,98,100,89,53,91,90,92,,93,101,102,,87,88', +'41,42,40,,,,,,,,,,,,,,,,,,,,216,,,222,,,55,56,,,57,,,,,,43,,,,,,,,20', +',,,,86,78,81,82,,83,84,,,,79,85,,71,72,68,,54,59,,80,60,61,,,,64,,62', +'63,65,297,298,69,70,,,,,,293,294,300,95,94,96,97,,,223,,,,,,,44,,,99', +'98,100,89,53,91,90,92,,93,101,102,,87,88,41,42,40,,,,,,,,,,,,,,,,,,', +',216,,,222,,,55,56,,,57,,,,,,43,,,,,,,,221,,,,,86,78,81,82,,83,84,,', +',79,85,,71,72,68,,54,59,,80,60,61,,,,64,,62,63,65,297,298,69,70,,,,', +',293,294,300,95,94,96,97,,,223,,,,,,,44,,,99,98,100,89,53,91,90,92,', +'93,101,102,,87,88,41,42,40,,,,,,,,,,,,,,,,,,,,216,,,222,,,55,56,,,57', +',,,,,43,,,,,,,,221,,,,,86,78,81,82,,83,84,,,,79,85,,71,72,68,,54,59', +',80,60,61,,,,64,,62,63,65,297,298,69,70,,,,,,293,294,300,95,94,96,97', +',,223,,,,,,,295,,,99,98,100,89,53,91,90,92,,93,101,102,,87,88,,,301', +',,,,,,,,,,,,,,,,,,,871,,,222,,,55,56,,,57,,,,,,,,,,,,,,,,,,,86,78,81', +'82,,83,84,,,,79,85,,71,72,68,,54,59,,80,60,61,,,,64,,62,63,65,297,298', +'69,70,,,,,,293,294,300,95,94,96,97,,,223,,,,,,,44,,,99,98,100,89,53', +'91,90,92,,93,101,102,,87,88,41,42,40,,,,,,,,,,,,,,,,,,,,216,,,222,,', +'55,56,,,57,,,,,,43,,,,,,,,221,,,,,86,78,81,82,,83,84,,,,79,85,,71,72', +'68,,54,59,,80,60,61,,,,64,,62,63,65,29,30,69,70,,,,,,28,27,26,95,94', +'96,97,,,223,,,,,,,44,,,99,98,100,89,53,91,90,92,,93,101,102,,87,88,41', +'42,40,,,,,,,,,,,,,,,,,,,,216,,,222,,,55,56,,,57,,,,,,43,,,,,,,,221,', +',,,86,78,81,82,,83,84,,,,79,85,,71,72,68,,54,59,,80,60,61,,,,64,,62', +'63,65,29,30,69,70,,,,,,28,27,26,95,94,96,97,,,19,,,,,,,44,,,99,98,100', +'89,53,91,90,92,,93,101,102,,87,88,41,42,40,,,,,,,,,,,,,,,,,,,,216,,', +'222,,,55,56,,,57,,,,,,43,,,,,,,,20,,,,,86,78,81,82,,83,84,,,,79,85,', +'71,72,68,,54,59,,80,60,61,,,,64,,62,63,65,29,30,69,70,,,,,,28,27,26', +'95,94,96,97,,,223,,,,,,,44,,,99,98,100,89,53,91,90,92,,93,101,102,,87', +'88,41,42,40,,,,,,,,,,,,,,,,,,,,216,,,222,,,55,56,,,57,,,,,,43,,,,,,', +',221,,,,,86,78,81,82,,83,84,,,,79,85,,71,72,68,,54,59,,80,60,61,,,,64', +',62,63,65,29,30,69,70,,,,,,28,27,26,95,94,96,97,,,223,,,,,,,44,,,99', +'98,100,89,53,91,90,92,,93,101,102,,87,88,41,42,40,,,,,,,,,,,,,,,,,,', +',216,,,222,,,55,56,,,57,,,,,,43,,,,,,,,221,,,,,86,78,81,82,,83,84,,', +',79,85,,71,72,68,,54,59,,80,60,61,,,,64,,62,63,65,29,30,69,70,,,,,,28', +'27,26,95,94,96,97,,,19,,,,,,,44,,,99,98,100,89,53,91,90,92,,93,101,102', +',87,88,41,42,40,,,,,,,,,,,,,,,,,,,,216,,,222,,,55,56,,,57,,,,,,43,,', +',,,,,20,,,,,86,78,81,82,,83,84,,,,79,85,,71,72,68,9,54,59,,80,60,61', +',,,64,,62,63,65,29,30,69,70,,,,,,28,27,26,95,94,96,97,,,19,,,,,,8,44', +',10,99,98,100,89,53,91,90,92,,93,101,102,,87,88,41,42,40,,,,,,,,,,,', +',,,,,,,,39,,,32,,,55,56,,,57,,34,,,,43,,,,,,,,20,,,,,86,78,81,82,,83', +'84,,,,79,85,,71,72,68,,54,59,,80,60,61,,,,64,,62,63,65,29,30,69,70,', +',,,,28,27,26,95,94,96,97,,,223,,,,,,,44,,,99,98,100,89,53,91,90,92,275', +'93,101,102,,87,88,41,42,40,,,,,,,,,,,,,,,,,,,,216,,,222,,,55,56,,,57', +',273,,271,,43,,,,,,,,221,,,,,86,78,81,82,,83,84,,,,79,85,,71,72,68,', +'54,59,,80,60,61,,,,64,,62,63,65,29,30,69,70,,,,,,28,27,26,95,94,96,97', +',,223,,,,,,,44,,,99,98,100,89,53,91,90,92,275,93,101,102,,87,88,41,42', +'40,,,,,,,,,,,,,,,,,,,,216,,,222,,,55,56,,,57,,273,,271,,43,,,,,,,,221', +',,,,86,78,81,82,,83,84,,,,79,85,,71,72,68,,54,59,,80,60,61,,,,64,,62', +'63,65,297,298,69,70,,,,,,293,294,300,95,94,96,97,,,223,,,,,,,295,,,99', +'98,100,89,53,91,90,92,,93,101,102,,87,88,,,301,231,235,240,241,242,237', +'239,247,248,243,244,,224,225,,,245,246,,291,,,222,,,55,56,,,57,,,228', +',234,,230,229,226,227,238,236,232,,233,,,,86,78,81,82,,83,84,,,,79,85', +',249,,487,,,59,,80,71,72,68,,54,,,,60,61,,,,64,,62,63,65,29,30,69,70', +',,,,,28,27,26,95,94,96,97,,,223,,,,,,,44,,,99,98,100,89,53,91,90,92', +',93,101,102,,87,88,41,42,40,,,,,,,,,,,,,,,,,,,,216,,,222,,,55,56,,,57', +',,,,,43,,,,,,,,221,,,,,86,78,81,82,,83,84,,,,79,85,,71,72,68,,54,59', +',80,60,61,,,,64,,62,63,65,29,30,69,70,,,,,,28,27,26,95,94,96,97,,,223', +',,,,,,44,,,99,98,100,89,53,91,90,92,,93,101,102,,87,88,41,42,40,,,,', +',,,,,,,,,,,,,,,216,,,222,,,55,56,,,57,,,,,,43,,,,,,,,221,,,,,86,78,81', +'82,,83,84,,,,79,85,,71,72,68,,54,59,,80,60,61,,,,64,,62,63,65,297,298', +'69,70,,,,,,293,294,300,95,94,96,97,,,223,,,,,,,44,,,99,98,100,89,53', +'91,90,92,275,93,101,102,,87,88,41,42,40,,,,,,,,,,,,,,,,,,,,216,,,222', +',,55,56,,,57,,,,271,,43,,,,,,,,221,,,,,86,78,81,82,,83,84,,,,79,85,', +'71,72,68,,54,59,,80,60,61,,,,64,,62,63,65,297,298,69,70,,,,,,293,294', +'300,95,94,96,97,,,223,,,,,,,44,,,99,98,100,89,53,91,90,92,275,93,101', +'102,,87,88,41,42,40,,,,,,,,,,,,,,,,,,,,216,,,222,,,55,56,,,57,,613,', +'271,,43,,,,,,,,221,,,,,86,78,81,82,,83,84,,,,79,85,,71,72,68,,54,59', +',80,60,61,,,,64,,62,63,65,29,30,69,70,,,,,,28,27,26,95,94,96,97,,,223', +',,,,,,44,,,99,98,100,89,53,91,90,92,,93,101,102,,87,88,41,42,40,,,,', +',,,,,,,,,,,,,,,216,,,222,,,55,56,,,57,,390,,,,43,,,,,,,,221,,,,,86,78', +'81,82,,83,84,,,,79,85,,71,72,68,,54,59,,80,60,61,,,,64,,62,63,65,297', +'298,69,70,,,,,,293,294,300,95,94,96,97,,,223,,,,,,,44,,,99,98,100,89', +'53,91,90,92,,93,101,102,,87,88,41,42,40,,,,,,,,,,,,,,,,,,,,216,,,222', +',,55,56,,,57,,,,,,43,,,,,,,,221,,,,,86,78,81,82,,83,84,,,,79,85,,71', +'72,68,,54,59,,80,60,61,,,,64,,62,63,65,297,298,69,70,,,,,,293,294,300', +'95,94,96,97,,,223,,,,,,,44,,,99,98,100,89,53,91,90,92,,93,101,102,,87', +'88,41,42,40,,,,,,,,,,,,,,,,,,,,216,,,222,,,55,56,,,57,,708,,,,43,,,', +',,,,221,,,,,86,78,81,82,,83,84,,,,79,85,,71,72,68,,54,59,,80,60,61,', +',,64,,62,63,65,29,30,69,70,,,,,,28,27,26,95,94,96,97,,,223,,,,,,,44', +',,99,98,100,89,53,91,90,92,275,93,101,102,,87,88,41,42,40,,,,,,,,,,', +',,,,,,,,,216,,,222,,,55,56,,,57,,273,,271,,43,,,,,,,,221,,,,,86,78,81', +'82,,83,84,,,,79,85,,71,72,68,,54,59,,80,60,61,,,,64,,62,63,65,29,30', +'69,70,,,,,,28,27,26,95,94,96,97,,,223,,,,,,,44,,,99,98,100,89,53,91', +'90,92,,93,101,102,,87,88,41,42,40,,,,,,,,,,,,,,,,,,,,216,,,222,,,55', +'56,,,57,,,,,,43,,,,,,,,221,,,,,86,78,81,82,,83,84,,,,79,85,,71,72,68', +',54,59,,80,60,61,,,,64,,62,63,65,297,298,69,70,,,,,,293,294,300,95,94', +'96,97,,,223,,,,,,,295,,,99,98,100,89,53,91,90,92,,93,101,102,,87,88', +',,301,,,,,,,,,,,,,,,,,,,,291,,,287,,,55,56,,,57,,286,,,,,,,,,,,,,,,', +',86,78,81,82,,83,84,,,,79,85,,71,72,68,,54,59,,80,60,61,,,,64,,62,63', +'65,29,30,69,70,,,,,,28,27,26,95,94,96,97,,,19,,,,,,,44,,,99,98,100,89', +'53,91,90,92,,93,101,102,,87,88,41,42,40,,,,,,,,,,,,,,,,,,,,216,,,222', +',,55,56,,,57,,,,,,43,,,,,,,,20,,,,,86,78,81,82,,83,84,,,,79,85,,71,72', +'68,,54,59,,80,60,61,,,,64,,62,63,65,297,298,69,70,,,,,,293,294,300,95', +'94,96,97,,,223,,,,,,,295,,,99,98,100,89,53,91,90,92,,93,101,102,,87', +'88,,,301,231,235,240,241,242,237,239,247,248,243,244,,224,225,,,245', +'246,,291,,,222,,,55,56,,,57,,,228,,234,,230,229,226,227,238,236,232', +',233,,,,86,78,81,82,,83,84,,,,79,85,,249,,303,,,59,,80,71,72,68,,54', +',,,60,61,,,,64,,62,63,65,29,30,69,70,,,,,,28,27,26,95,94,96,97,,,223', +',,,,,,44,,,99,98,100,89,53,91,90,92,275,93,101,102,,87,88,41,42,40,', +',,,,,,,,,,,,,,,,,,216,,,222,,,55,56,,,57,,273,,271,,43,,,,,,,,221,,', +',,86,78,81,82,,83,84,,,,79,85,,71,72,68,,54,59,,80,60,61,,,,64,,62,63', +'65,29,30,69,70,,,,,,28,27,26,95,94,96,97,,,223,,,,,,,44,,,99,98,100', +'89,53,91,90,92,275,93,101,102,,87,88,41,42,40,,,,,,,,,,,,,,,,,,,,216', +',,222,,,55,56,,,57,,273,,271,,43,,,,,,,,221,,,,,86,78,81,82,,83,84,', +',,79,85,,71,72,68,,54,59,,80,60,61,,,,64,,62,63,65,297,298,69,70,,,', +',,293,294,300,95,94,96,97,,,223,,,,,,,295,,,99,98,100,89,53,91,90,92', +',93,101,102,,87,88,,,301,,,,,,,,,,,,,,,,,,,,336,,,32,,,55,56,,,57,,34', +',,,,,,,,,,,,,,,,86,78,81,82,,83,84,,,,79,85,,71,72,68,,54,59,,80,60', +'61,,,,64,,62,63,65,297,298,69,70,,,,,,293,294,300,95,94,96,97,,,223', +',,,,,,44,,,99,98,100,89,53,91,90,92,,93,101,102,,87,88,41,42,40,,,,', +',,,,,,,,,,,,,,,216,,,222,,,55,56,,,57,,273,,,,43,,,,,,,,221,,,,,86,78', +'81,82,,83,84,,,,79,85,,71,72,68,,54,59,,80,60,61,,,,64,,62,63,65,29', +'30,69,70,,,,,,28,27,26,95,94,96,97,,,223,,,,,,,44,,,99,98,100,89,53', +'91,90,92,275,93,101,102,,87,88,41,42,40,,,,,,,,,,,,,,,,,,,,216,,,222', +',,55,56,,,57,,273,,271,,43,,,,,,,,221,,,,,86,78,81,82,,83,84,,,,79,85', +',71,72,68,9,54,59,,80,60,61,,,,64,,62,63,65,29,30,69,70,,,,,,28,27,26', +'95,94,96,97,,,19,,,,,,8,44,7,10,99,98,100,89,53,91,90,92,,93,101,102', +',87,88,41,42,40,,,,,,,,,,,,,,,,,,,,39,,,32,,,55,56,,,57,,34,,,,43,,', +',,,,,20,,,,,86,78,81,82,,83,84,,,,79,85,,71,72,68,,54,59,,80,60,61,', +',,64,,62,63,65,297,298,69,70,,,,,,293,294,300,95,94,96,97,,,223,,,,', +',,295,,,99,98,100,89,53,91,90,92,,93,101,102,,87,88,,,301,,,,,,,,,,', +',,,,,,,,,291,,,287,,,55,56,,,57,,,,,,,,,,,,,,,,,,,86,78,81,82,,83,84', +',,,79,85,,71,72,68,,54,59,,80,60,61,,,,64,,62,63,65,29,30,69,70,,,,', +',28,27,26,95,94,96,97,,,223,,,,,,,44,,,99,98,100,89,53,91,90,92,,93', +'101,102,,87,88,41,42,40,,,,,,,,,,,,,,,,,,,,216,,,222,,,55,56,,,57,,', +',,,43,,,,,,,,221,,,,,86,78,81,82,,83,84,,,,79,85,,71,72,68,,54,59,,80', +'60,61,,,,64,,62,63,65,29,30,69,70,,,,,,28,27,26,95,94,96,97,,,223,,', +',,,,44,,,99,98,100,89,53,91,90,92,,93,101,102,,87,88,41,42,40,,,,,,', +',,,,,,,,,,,,,216,,,222,,,55,56,,,57,,390,,,,43,,,,,,,,221,,,,,86,78', +'81,82,,83,84,,,,79,85,,71,72,68,,54,59,,80,60,61,,,,64,,62,63,65,297', +'298,69,70,,,,,,293,294,300,95,94,96,97,,,223,,,,,,,44,,,99,98,100,89', +'53,91,90,92,275,93,101,102,,87,88,41,42,40,,,,,,,,,,,,,,,,,,,,216,,', +'222,,,55,56,,,57,,,,,,43,,,,,,,,221,,,,,86,78,81,82,,83,84,,,,79,85', +',71,72,68,,54,59,,80,60,61,,,,64,,62,63,65,297,298,69,70,,,,,,293,294', +'300,95,94,96,97,,,223,,,,,,,44,,,99,98,100,89,53,91,90,92,275,93,101', +'102,,87,88,41,42,40,,,,,,,,,,,,,,,,,,,,216,,,222,,,55,56,,,57,,613,', +',,43,,,,,,,,221,,,,,86,78,81,82,,83,84,,,,79,85,,71,72,68,,54,59,,80', +'60,61,,,,64,,62,63,65,297,298,69,70,,,,,,293,294,300,95,94,96,97,,,223', +',,,,,,44,,,99,98,100,89,53,91,90,92,,93,101,102,,87,88,41,42,40,,,,', +',,,,,,,,,,,,,,,216,,,222,,,55,56,,,57,,390,,,,43,,,,,,,,221,,,,,86,78', +'81,82,,83,84,,,,79,85,,71,72,68,,54,59,,80,60,61,,,,64,,62,63,65,29', +'30,69,70,,,,,,28,27,26,95,94,96,97,,,19,,,,,,,44,,,99,98,100,89,53,91', +'90,92,,93,101,102,,87,88,41,42,40,,,,,,,,,,,,,,,,,,,,216,,,222,,,55', +'56,,,57,,,,,,43,,,,,,,,20,,,,,86,78,81,82,,83,84,,,,79,85,,71,72,68', +',54,59,,80,60,61,,,,64,,62,63,65,297,298,69,70,,,,,,293,294,300,95,94', +'96,97,,,223,,,,,,,44,,,99,98,100,89,53,91,90,92,,93,101,102,,87,88,41', +'42,40,,,,,,,,,,,,,,,,,,,,216,,,222,,,55,56,,,57,,,,,,43,,,,,,,,221,', +',,,86,78,81,82,,83,84,,,,79,85,,71,72,68,,54,59,,80,60,61,,,,64,,62', +'63,65,297,298,69,70,,,,,,293,294,300,95,94,96,97,,,223,,,,,,,44,,,99', +'98,100,89,53,91,90,92,,93,101,102,,87,88,41,42,40,,,,,,,,,,,,,,,,,,', +',216,,,222,,,55,56,,,57,,,,,,43,,,,,,,,221,,,,,86,78,81,82,,83,84,,', +',79,85,,71,72,68,,54,59,,80,60,61,,,,64,,62,63,65,297,298,69,70,,,,', +',293,294,300,95,94,96,97,,,223,,,,,,,44,,,99,98,100,89,53,91,90,92,', +'93,101,102,,87,88,41,42,40,,,,,,,,,,,,,,,,,,,,216,,,222,,,55,56,,,57', +',,,,,43,,,,,,,,221,,,,,86,78,81,82,,83,84,,,,79,85,,71,72,68,,54,59', +',80,60,61,,,,64,,62,63,65,29,30,69,70,,,,,,28,27,26,95,94,96,97,,,223', +',,,,,,44,,,99,98,100,89,53,91,90,92,275,93,101,102,,87,88,41,42,40,', +',,,,,,,,,,,,,,,,,,216,,,222,,,55,56,,,57,,273,,271,,43,,,,,,,,221,,', +',,86,78,81,82,,83,84,,,,79,85,,71,72,68,,54,59,,80,60,61,,,,64,,62,63', +'65,29,30,69,70,,,,,,28,27,26,95,94,96,97,,,19,,,,,,,44,,,99,98,100,89', +'53,91,90,92,,93,101,102,,87,88,41,42,40,231,235,240,241,242,237,239', +'247,248,243,244,,224,225,,,245,246,,216,,,222,,,55,56,,,57,,,228,,234', +'43,230,229,226,227,238,236,232,20,233,,,,86,78,81,82,,83,84,,,,79,85', +'107,249,,,,106,59,,80,71,72,68,,54,,,,60,61,,,,64,,62,63,65,29,30,69', +'70,,,,,,28,27,26,95,94,96,97,,,19,,,,,,,44,,,99,98,100,89,53,91,90,92', +',93,101,102,,87,88,41,42,40,,,,,,,,,,,,,,,,,,,,216,,,222,,,55,56,,,57', +',,,,,43,,,,,,,,20,,,,,86,78,81,82,,83,84,,,,79,85,,71,72,68,,54,59,', +'80,60,61,,,,64,,62,63,65,29,30,69,70,,,,,,28,27,26,95,94,96,97,,,19', +',,,,,,44,,,99,98,100,89,53,91,90,92,,93,101,102,,87,88,41,42,40,,,,', +',,,,,,,,,,,,,,,216,,,222,,,55,56,,,57,,,,,,43,,,,,,,,20,,,,,86,78,81', +'82,,83,84,,,,79,85,,71,72,68,,54,59,,80,60,61,,,,64,,62,63,65,297,298', +'69,70,,,,,,293,294,300,95,94,96,97,,,223,,,,,,,44,,,99,98,100,89,53', +'91,90,92,,93,101,102,,87,88,41,42,40,,,,,,,,,,,,,,,,,,,,216,,,222,,', +'55,56,,,57,,,,,,43,,,,,,,,221,,,,,86,78,81,82,,83,84,,,,79,85,,71,72', +'68,,54,59,,80,60,61,,,,64,,62,63,65,29,30,69,70,,,,,,28,27,26,95,94', +'96,97,,,19,,,,,,,44,,,99,98,100,89,53,91,90,92,,93,101,102,,87,88,41', +'42,40,,,,,,,,,,,,,,,,,,,,216,,,222,,,55,56,,,57,,,,,,43,,,,,,,,20,,', +',,86,78,81,82,,83,84,,,,79,85,,71,72,68,,54,59,,80,60,61,,,,64,,62,63', +'65,297,298,69,70,,,,,,293,294,300,95,94,96,97,,,223,,,,,,,44,,,99,98', +'100,89,53,91,90,92,275,93,101,102,,87,88,41,42,40,,,,,,,,,,,,,,,,,,', +',216,,,222,,,55,56,,,57,,,,,,43,,,,,,,,221,,,,,86,78,81,82,,83,84,,', +',79,85,,71,72,68,,54,59,,80,60,61,,,,64,,62,63,65,297,298,69,70,,,,', +',293,294,300,95,94,96,97,,,223,,,,,,,44,,,99,98,100,89,53,91,90,92,', +'93,101,102,,87,88,41,42,40,,,,,,,,,,,,,,,,,,,,216,,,222,,,55,56,,,57', +',,,,,43,,,,,,,,221,,,,,86,78,81,82,,83,84,,,,79,85,,71,72,68,,54,59', +',80,60,61,,,,64,,62,63,65,297,298,69,70,,,,,,293,294,300,95,94,96,97', +',,223,,,,,,,44,,,99,98,100,89,53,91,90,92,,93,101,102,,87,88,41,42,40', +',,,,,,,,,,,,,,,,,,,216,,,222,,,55,56,,,57,,,,,,43,,,,,,,,221,,,,,86', +'78,81,82,,83,84,,,,79,85,,71,72,68,,54,59,,80,60,61,,,,64,,62,63,65', +'297,298,69,70,,,,,,293,294,300,95,94,96,97,,,223,,,,,,,44,,,99,98,100', +'89,53,91,90,92,,93,101,102,,87,88,41,42,40,,,,,,,,,,,,,,,,,,,,216,,', +'222,,,55,56,,,57,,,,,,43,,,,,,,,221,,,,,86,78,81,82,,83,84,,,,79,85', +',71,72,68,,54,59,,80,60,61,,,,64,,62,63,65,297,298,69,70,,,,,,293,294', +'300,95,94,96,97,,,223,,,,,,,44,,,99,98,100,89,53,91,90,92,,93,101,102', +',87,88,41,42,40,,,,,,,,,,,,,,,,,,,,216,,,222,,,55,56,,,57,,,,,,43,,', +',,,,,221,,,,,86,78,81,82,,83,84,,,,79,85,,71,72,68,,54,59,,80,60,61', +',,,64,,62,63,65,297,298,69,70,,,,,,293,294,300,95,94,96,97,,,223,,,', +',,,44,,,99,98,100,89,53,91,90,92,,93,101,102,,87,88,41,42,40,,,,,,,', +',,,,,,,,,,,,216,,,222,,,55,56,,,57,,,,,,43,,,,,,,,221,,,,,86,78,81,82', +',83,84,,,,79,85,,71,72,68,,54,59,,80,60,61,,,,64,,62,63,65,297,298,69', +'70,,,,,,293,294,300,95,94,96,97,,,223,,,,,,,44,,,99,98,100,89,53,91', +'90,92,,93,101,102,,87,88,41,42,40,,,,,,,,,,,,,,,,,,,,216,,,222,,,55', +'56,,,57,,,,,,43,,,,,,,,221,,,,,86,78,81,82,,83,84,,,,79,85,,71,72,68', +',54,59,,80,60,61,,,,64,,62,63,65,297,298,69,70,,,,,,293,294,300,95,94', +'96,97,,,223,,,,,,,44,,,99,98,100,89,53,91,90,92,,93,101,102,,87,88,41', +'42,40,,,,,,,,,,,,,,,,,,,,216,,,222,,,55,56,,,57,,,,,,43,,,,,,,,221,', +',,,86,78,81,82,,83,84,,,,79,85,,71,72,68,,54,59,,80,60,61,,,,64,,62', +'63,65,29,30,69,70,,,,,,28,27,26,95,94,96,97,,,223,,,,,,,44,,,99,98,100', +'89,53,91,90,92,,93,101,102,,87,88,41,42,40,,,,,,,,,,,,,,,,,,,,216,,', +'222,,,55,56,,,57,,,,,,43,,,,,,,,221,,,,,86,78,81,82,,83,84,,,,79,85', +',71,72,68,,54,59,,80,60,61,,,,64,,62,63,65,297,298,69,70,,,,,,293,294', +'300,95,94,96,97,,,223,,,,,,,44,,,99,98,100,89,53,91,90,92,,93,101,102', +',87,88,41,42,40,,,,,,,,,,,,,,,,,,,,216,,,222,,,55,56,,,57,,,,,,43,,', +',,,,,221,,,,,86,78,81,82,,83,84,,,,79,85,,71,72,68,,54,59,,80,60,61', +',,,64,,62,63,65,297,298,69,70,,,,,,293,294,300,95,94,96,97,,,223,,,', +',,,44,,,99,98,100,89,53,91,90,92,,93,101,102,,87,88,41,42,40,,,,,,,', +',,,,,,,,,,,,216,,,222,,,55,56,,,57,,,,,,43,,,,,,,,221,,,,,86,78,81,82', +',83,84,,,,79,85,,71,72,68,,54,59,,80,60,61,,,,64,,62,63,65,297,298,69', +'70,,,,,,293,294,300,95,94,96,97,,,223,,,,,,,44,,,99,98,100,89,53,91', +'90,92,,93,101,102,,87,88,41,42,40,,,,,,,,,,,,,,,,,,,,216,,,222,,,55', +'56,,,57,,,,,,43,,,,,,,,221,,,,,86,78,81,82,,83,84,,,,79,85,,71,72,68', +',54,59,,80,60,61,,,,64,,62,63,65,297,298,69,70,,,,,,293,294,300,95,94', +'96,97,,,223,,,,,,,44,,,99,98,100,89,53,91,90,92,,93,101,102,,87,88,41', +'42,40,,,,,,,,,,,,,,,,,,,,216,,,222,,,55,56,,,57,,,,,,43,,,,,,,,221,', +',,,86,78,81,82,,83,84,,,,79,85,,71,72,68,,54,59,,80,60,61,,,,64,,62', +'63,65,297,298,69,70,,,,,,293,294,300,95,94,96,97,,,223,,,,,,,44,,,99', +'98,100,89,53,91,90,92,,93,101,102,,87,88,41,42,40,,,,,,,,,,,,,,,,,,', +',216,,,222,,,55,56,,,57,,,,,,43,,,,,,,,221,,,,,86,78,81,82,,83,84,,', +',79,85,,71,72,68,,54,59,,80,60,61,,,,64,,62,63,65,297,298,69,70,,,,', +',293,294,300,95,94,96,97,,,223,,,,,,,44,,,99,98,100,89,53,91,90,92,', +'93,101,102,,87,88,41,42,40,,,,,,,,,,,,,,,,,,,,216,,,222,,,55,56,,,57', +',,,,,43,,,,,,,,221,,,,,86,78,81,82,,83,84,,,,79,85,,71,72,68,,54,59', +',80,60,61,,,,64,,62,63,65,297,298,69,70,,,,,,293,294,300,95,94,96,97', +',,223,,,,,,,44,,,99,98,100,89,53,91,90,92,,93,101,102,,87,88,41,42,40', +',,,,,,,,,,,,,,,,,,,216,,,222,,,55,56,,,57,,,,,,43,,,,,,,,221,,,,,86', +'78,81,82,,83,84,,,,79,85,,71,72,68,,54,59,,80,60,61,,,,64,,62,63,65', +'297,298,69,70,,,,,,293,294,300,95,94,96,97,,,223,,,,,,,44,,,99,98,100', +'89,53,91,90,92,,93,101,102,,87,88,41,42,40,,,,,,,,,,,,,,,,,,,,216,,', +'222,,,55,56,,,57,,,,,,43,,,,,,,,221,,,,,86,78,81,82,,83,84,,,,79,85', +',71,72,68,,54,59,,80,60,61,,,,64,,62,63,65,297,298,69,70,,,,,,293,294', +'300,95,94,96,97,,,223,,,,,,,44,,,99,98,100,89,53,91,90,92,,93,101,102', +',87,88,41,42,40,,,,,,,,,,,,,,,,,,,,216,,,222,,,55,56,,,57,,,,,,43,,', +',,,,,221,,,,,86,78,81,82,,83,84,,,,79,85,,71,72,68,,54,59,,80,60,61', +',,,64,,62,63,65,297,298,69,70,,,,,,293,294,300,95,94,96,97,,,223,,,', +',,,44,,,99,98,100,89,53,91,90,92,,93,101,102,,87,88,41,42,40,,,,,,,', +',,,,,,,,,,,,216,,,222,,,55,56,,,57,,,,,,43,,,,,,,,221,,,,,86,78,81,82', +',83,84,,,,79,85,,71,72,68,,54,59,,80,60,61,,,,64,,62,63,65,297,298,69', +'70,,,,,,293,294,300,95,94,96,97,,,223,,,,,,,44,,,99,98,100,89,53,91', +'90,92,,93,101,102,,87,88,41,42,40,,,,,,,,,,,,,,,,,,,,216,,,222,,,55', +'56,,,57,,,,,,43,,,,,,,,221,,,,,86,78,81,82,,83,84,,,,79,85,,71,72,68', +',54,59,,80,60,61,,,,64,,62,63,65,297,298,69,70,,,,,,293,294,300,95,94', +'96,97,,,223,,,,,,,44,,,99,98,100,89,53,91,90,92,,93,101,102,,87,88,41', +'42,40,,,,,,,,,,,,,,,,,,,,216,,,222,,,55,56,,,57,,,,,,43,,,,,,,,221,', +',,,86,78,81,82,,83,84,,,,79,85,,71,72,68,,54,59,,80,60,61,,,,64,,62', +'63,65,297,298,69,70,,,,,,293,294,300,95,94,96,97,,,223,,,,,,,44,,,99', +'98,100,89,53,91,90,92,,93,101,102,,87,88,41,42,40,,,,,,,,,,,,,,,,,,', +',216,,,222,,,55,56,,,57,,,,,,43,,,,,,,,221,,,,,86,78,81,82,,83,84,,', +',79,85,,71,72,68,,54,59,,80,60,61,,,,64,,62,63,65,297,298,69,70,,,,', +',293,294,300,95,94,96,97,,,223,,,,,,,44,,,99,98,100,89,53,91,90,92,', +'93,101,102,,87,88,41,42,40,,,,,,,,,,,,,,,,,,,,216,,,222,,,55,56,,,57', +',,,,,43,,,,,,,,221,,,,,86,78,81,82,,83,84,,,,79,85,,71,72,68,,54,59', +',80,60,61,,,,64,,62,63,65,297,298,69,70,,,,,,293,294,300,95,94,96,97', +',,223,,,,,,,44,,,99,98,100,89,53,91,90,92,,93,101,102,,87,88,41,42,40', +',,,,,,,,,,,,,,,,,,,216,,,222,,,55,56,,,57,,,,,,43,,,,,,,,221,,,,,86', +'78,81,82,,83,84,,,,79,85,,71,72,68,,54,59,,80,60,61,,,,64,,62,63,65', +'297,298,69,70,,,,,,293,294,300,95,94,96,97,,,223,,,,,,,44,,,99,98,100', +'89,53,91,90,92,,93,101,102,,87,88,41,42,40,,,,,,,,,,,,,,,,,,,,216,,', +'222,,,55,56,,,57,,,,,,43,,,,,,,,221,,,,,86,78,81,82,,83,84,,,,79,85', +',71,72,68,,54,59,,80,60,61,,,,64,,62,63,65,297,298,69,70,,,,,,293,294', +'300,95,94,96,97,,,223,,,,,,,44,,,99,98,100,89,53,91,90,92,,93,101,102', +',87,88,41,42,40,,,,,,,,,,,,,,,,,,,,216,,,222,,,55,56,,,57,,,,,,43,,', +',,,,,221,,,,,86,78,81,82,,83,84,,,,79,85,,71,72,68,,54,59,,80,60,61', +',,,64,,62,63,65,297,298,69,70,,,,,,293,294,300,95,94,96,97,,,223,,,', +',,,44,,,99,98,100,89,53,91,90,92,,93,101,102,,87,88,41,42,40,,,,,,,', +',,,,,,,,,,,,216,,,222,,,55,56,,,57,,,,,,43,,,,,,,,221,,,,,86,78,81,82', +',83,84,,,,79,85,,71,72,68,,54,59,,80,60,61,,,,64,,62,63,65,297,298,69', +'70,,,,,,293,294,300,95,94,96,97,,,223,,,,,,,44,,,99,98,100,89,53,91', +'90,92,,93,101,102,,87,88,41,42,40,,,,,,,,,,,,,,,,,,,,216,,,222,,,55', +'56,,,57,,,,,,43,,,,,,,,221,,,,,86,78,81,82,,83,84,,,,79,85,,71,72,68', +',54,59,,80,60,61,,,,64,,62,63,65,297,298,69,70,,,,,,293,294,300,95,94', +'96,97,,,223,,,,,,,44,,,99,98,100,89,53,91,90,92,,93,101,102,,87,88,41', +'42,40,,,,,,,,,,,,,,,,,,,,216,,,222,,,55,56,,,57,,,,,,43,,,,,,,,221,', +',,,86,78,81,82,,83,84,,,,79,85,,71,72,68,,54,59,,80,60,61,,,,64,,62', +'63,65,297,298,69,70,,,,,,293,294,300,95,94,96,97,,,223,,,,,,,44,,,99', +'98,100,89,53,91,90,92,,93,101,102,,87,88,41,42,40,,,,,,,,,,,,,,,,,,', +',216,,,222,,,55,56,,,57,,,,,,43,,,,,,,,221,,,,,86,78,81,82,,83,84,,', +',79,85,,71,72,68,,54,59,,80,60,61,,,,64,,62,63,65,297,298,69,70,,,,', +',293,294,300,95,94,96,97,,,223,,,,,,,44,,,99,98,100,89,53,91,90,92,', +'93,101,102,,87,88,41,42,40,,,,,,,,,,,,,,,,,,,,216,,,222,,,55,56,,,57', +',,,,,43,,,,,,,,221,,,,,86,78,81,82,,83,84,,,,79,85,,71,72,68,,54,59', +',80,60,61,,,,64,,62,63,65,297,298,69,70,,,,,,293,294,300,95,94,96,97', +',,223,,,,,,,44,,,99,98,100,89,53,91,90,92,,93,101,102,,87,88,41,42,40', +',,,,,,,,,,,,,,,,,,,216,,,222,,,55,56,,,57,,,,,,43,,,,,,,,221,,,,,86', +'78,81,82,,83,84,,,,79,85,,71,72,68,,54,59,,80,60,61,,,,64,,62,63,65', +'297,298,69,70,,,,,,293,294,300,95,94,96,97,,,223,,,,,,,295,,,99,98,100', +'89,53,91,90,92,,93,101,102,,87,88,,,301,,,,,,,,,,,,,,,,,,,,827,,,222', +',,55,56,,,57,,,,,,,,,,,,,,,,,,,86,78,81,82,,83,84,,,,79,85,,71,72,68', +',54,59,,80,60,61,,,,64,,62,63,65,297,298,69,70,,,,,,293,294,300,95,94', +'96,97,,,223,,,,,,,44,,,99,98,100,89,53,91,90,92,,93,101,102,,87,88,41', +'42,40,,,,,,,,,,,,,,,,,,,,216,,,222,,,55,56,,,57,,,,,,43,,,,,,,,221,', +',,,86,78,81,82,,83,84,,,,79,85,,71,72,68,,54,59,,80,60,61,,,,64,,62', +'63,65,29,30,69,70,,,,,,28,27,26,95,94,96,97,,,19,,,,,,,44,,,99,98,100', +'89,53,91,90,92,,93,101,102,,87,88,41,42,40,,,,,,,,,,,,,,,,,,,,216,,', +'222,,,55,56,,,57,,,,,,43,,,,,,,,20,,,,,86,78,81,82,,83,84,,,,79,85,', +'71,72,68,9,54,59,,80,60,61,,,,64,,62,63,65,29,30,69,70,,,,,,28,27,26', +'95,94,96,97,,,19,,,,,,8,44,,10,99,98,100,89,53,91,90,92,,93,101,102', +',87,88,41,42,40,231,235,240,241,242,237,239,247,248,243,244,,224,225', +',,245,246,,39,,,32,,,55,56,,,57,,34,228,,234,43,230,229,226,227,238', +'236,232,20,233,,,,86,78,81,82,,83,84,,,,79,85,,249,,,,374,59,,80,71', +'72,68,,54,,,,60,61,,,,64,,62,63,65,29,30,69,70,,,,,,28,27,26,95,94,96', +'97,,,19,,,,,,,44,,,99,98,100,89,53,91,90,92,,93,101,102,,87,88,41,42', +'40,,,,,,,,,,,,,,,,,,,,216,,,222,,,55,56,,,57,,,,,,43,,,,,,,,20,,,,,86', +'78,81,82,,83,84,,,,79,85,,71,72,68,,54,59,,80,60,61,,,,64,,62,63,65', +'297,298,69,70,,,,,,293,294,300,95,94,96,97,,,223,,,,,,,44,,,99,98,100', +'89,53,91,90,92,,93,101,102,,87,88,41,42,40,,,,,,,,,,,,,,,,,,,,216,,', +'222,,,55,56,,,57,,,,,,43,,,,,,,,221,,,,,86,78,81,82,,83,84,,,,79,85', +',71,72,68,,54,59,,80,60,61,,,,64,,62,63,65,297,298,69,70,,,,,,293,294', +'300,95,94,96,97,,,223,,,,,,,44,,,99,98,100,89,53,91,90,92,275,93,101', +'102,,87,88,41,42,40,,,,,,,,,,,,,,,,,,,,216,,,222,,,55,56,,,57,,,,271', +',43,,,,,,,,221,,,,,86,78,81,82,,83,84,,,,79,85,,71,72,68,,54,59,,80', +'60,61,,,,64,,62,63,65,297,298,69,70,,,,,,293,294,300,95,94,96,97,,,223', +',,,,,,44,,,99,98,100,89,53,91,90,92,,93,101,102,,87,88,41,42,40,,,,', +',,,,,,,,,,,,,,,216,,,222,,,55,56,,,57,,,,,,43,,,,,,,,221,,,,,86,78,81', +'82,,83,84,,,,79,85,,71,72,68,,54,59,,80,60,61,,,,64,,62,63,65,297,298', +'69,70,,,,,,293,294,300,95,94,96,97,,,223,,,,,,,44,,,99,98,100,89,53', +'91,90,92,,93,101,102,,87,88,41,42,40,,,,,,,,,,,,,,,,,,,,216,,,222,,', +'55,56,,,57,,,,,,43,,,,,,,,221,,,,,86,78,81,82,,83,84,,,,79,85,,71,72', +'68,,54,59,,80,60,61,,,,64,,62,63,65,297,298,69,70,,,,,,293,294,300,95', +'94,96,97,,,223,,,,,,,44,,,99,98,100,89,53,91,90,92,275,93,101,102,,87', +'88,41,42,40,,,,,,,,,,,,,,,,,,,,216,,,222,,,55,56,,,57,,613,,271,,43', +',,,,,,,221,,,,,86,78,81,82,,83,84,,,,79,85,,71,72,68,,54,59,,80,60,61', +',,,64,,62,63,65,29,30,69,70,,,,,,28,27,26,95,94,96,97,,,19,,,,,,,44', +',,99,98,100,89,53,91,90,92,,93,101,102,,87,88,41,42,40,,,,,,,,,,,,,', +',,,,,,216,,,222,,,55,56,,,57,,,,,,43,,,,,,,,20,,,,,86,78,81,82,,83,84', +',,,79,85,,71,72,68,,54,59,,80,60,61,,,,64,,62,63,65,29,30,69,70,,,,', +',28,27,26,95,94,96,97,,,19,,,,,,,44,,,99,98,100,89,53,91,90,92,,93,101', +'102,,87,88,41,42,40,,,,,,,,,,,,,,,,,,,,216,,,222,,,55,56,,,57,,,,,,43', +',,,,,,,20,,,,,86,78,81,82,,83,84,,,,79,85,,71,72,68,9,54,59,,80,60,61', +',,,64,,62,63,65,29,30,69,70,,,,,,28,27,26,95,94,96,97,,,19,,,,,,8,44', +'7,10,99,98,100,89,53,91,90,92,,93,101,102,,87,88,41,42,40,231,235,240', +'241,242,237,239,247,248,243,244,,224,225,,,245,246,,39,,,32,,,55,56', +',,57,,34,228,,234,43,230,229,226,227,238,236,232,20,233,,,,86,78,81', +'82,,83,84,,,,79,85,,249,,,,374,59,,80,71,72,68,,54,,,,60,61,,,,64,,62', +'63,65,29,30,69,70,,,,,,28,27,26,95,94,96,97,,,19,,,,,,,44,,,99,98,100', +'89,53,91,90,92,,93,101,102,,87,88,41,42,40,,,,,,,,,,,,,,,,,,,,216,,', +'222,,,55,56,,,57,,,,,,43,,,,,,,,20,,,,,86,78,81,82,,83,84,,,,79,85,', +'71,72,68,,54,59,,80,60,61,,,,64,,62,63,65,29,30,69,70,,,,,,28,27,26', +'95,94,96,97,,,19,,,,,,,44,,,99,98,100,89,53,91,90,92,,93,101,102,,87', +'88,41,42,40,,,,,,,,,,,,,,,,,,,,216,,,222,,,55,56,,,57,,,,,,43,,,,,,', +',20,,,,,86,78,81,82,,83,84,,,,79,85,,71,72,68,,54,59,,80,60,61,,,,64', +',62,63,65,297,298,69,70,,,,,,293,294,300,95,94,96,97,,,223,,,,,,,44', +',,99,98,100,89,53,91,90,92,,93,101,102,,87,88,41,42,40,,,,,,,,,,,,,', +',,,,,,216,,,222,,,55,56,,,57,,,,,,43,,,,,,,,221,,,,,86,78,81,82,,83', +'84,,,,79,85,,71,72,68,,54,59,,80,60,61,,,,64,,62,63,65,297,298,69,70', +',,,,,293,294,300,95,94,96,97,,,223,,,,,,,44,,,99,98,100,89,53,91,90', +'92,,93,101,102,,87,88,41,42,40,,,,,,,,,,,,,,,,,,,,216,,,222,,,55,56', +',,57,,,,,,43,,,,,,,,221,,,,,86,78,81,82,,83,84,,,,79,85,,71,72,68,,54', +'59,,80,60,61,,,,64,,62,63,65,297,298,69,70,,,,,,293,294,300,95,94,96', +'97,,,223,,,,,,,44,,,99,98,100,89,53,91,90,92,275,93,101,102,,87,88,41', +'42,40,,,,,,,,,,,,,,,,,,,,216,,,222,,,55,56,,,57,,273,,,,43,,,,,,,,221', +',,,,86,78,81,82,,83,84,,,,79,85,,71,72,68,,54,59,,80,60,61,,,,64,,62', +'63,65,297,298,69,70,,,,,,293,294,300,95,94,96,97,,,223,,,,,,,44,,,99', +'98,100,89,53,91,90,92,,93,101,102,,87,88,41,42,40,,,,,,,,,,,,,,,,,,', +',216,,,222,,,55,56,,,57,,,,,,43,,,,,,,,221,,,,,86,78,81,82,,83,84,,', +',79,85,,71,72,68,,54,59,,80,60,61,,,,64,,62,63,65,297,298,69,70,,,,', +',293,294,300,95,94,96,97,,,223,,,,,,,44,,,99,98,100,89,53,91,90,92,', +'93,101,102,,87,88,41,42,40,,,,,,,,,,,,,,,,,,,,216,,,222,,,55,56,,,57', +',,,,,43,,,,,,,,221,,,,,86,78,81,82,,83,84,,,,79,85,,71,72,68,,54,59', +',80,60,61,,,,64,,62,63,65,29,30,69,70,,,,,,28,27,26,95,94,96,97,,,223', +',,,,,,44,,,99,98,100,89,53,91,90,92,275,93,101,102,,87,88,41,42,40,', +',,,,,,,,,,,,,,,,,,216,,,222,,,55,56,,,57,,273,,271,,43,,,,,,,,221,,', +',,86,78,81,82,,83,84,,,,79,85,,71,72,68,,54,59,,80,60,61,,,,64,,62,63', +'65,29,30,69,70,,,,,,28,27,26,95,94,96,97,,,19,,,,,,,44,,,99,98,100,89', +'53,91,90,92,,93,101,102,,87,88,41,42,40,,,,,,,,,,,,,,,,,,,,216,,,222', +',,55,56,,,57,,,,,,43,,,,,,,,20,,,,,86,78,81,82,,83,84,,,,79,85,,71,72', +'68,,54,59,,80,60,61,,,,64,,62,63,65,297,298,69,70,,,,,,293,294,300,95', +'94,96,97,,,223,,,,,,,295,,,99,98,100,341,53,91,90,342,,93,101,102,,87', +'88,,,301,,,,,,,,,,,,,,,,,,,,343,,,222,,,55,56,,,57,,,,,,,,,,,,,,,,,', +',86,78,81,82,,83,84,,,,79,85,,71,72,68,,54,59,,80,60,61,,,,64,,62,63', +'65,297,298,69,70,,,,,,293,294,300,95,94,96,97,,,223,,,,,,,295,,,99,98', +'100,341,53,91,90,342,,93,101,102,,87,88,,,301,,,,,,,,,,,,,,,,,348,,', +'343,,,222,,,55,56,,,57,,,,,,,,,,,,,,,,,,,86,78,81,82,,83,84,,,,79,85', +',71,72,68,,54,59,,80,60,61,,,,64,,62,63,65,297,298,69,70,,,,,,293,294', +'300,95,94,96,97,,,223,,,,,,,295,,,99,98,100,89,53,91,90,92,,93,101,102', +',87,88,,,301,,,,,,,,,,,,,,,,,,,,291,,,287,,,55,56,,,57,,,,,,,,,,,,,', +',,,,,86,78,81,82,,83,84,,,,79,85,,71,72,68,,54,59,,80,60,61,,,,64,,62', +'63,65,29,30,69,70,,,,,,28,27,26,95,94,96,97,,,223,,,,,,,44,,,99,98,100', +'89,53,91,90,92,275,93,101,102,,87,88,41,42,40,,,,,,,,,,,,,,,,,,,,216', +',,222,,,55,56,,,57,,273,,271,,43,,,,,,,,221,,,,,86,78,81,82,,83,84,', +',,79,85,,71,72,68,,54,59,,80,60,61,,,,64,,62,63,65,297,298,69,70,,,', +',,293,294,300,95,94,96,97,,,223,,,,,,,295,,,99,98,100,89,53,91,90,92', +',93,101,102,,87,88,,,301,,,,,,,,,,,,,,,,,,,,291,,,287,,,55,56,,,57,', +',,,,,,,,,,,,,,,,,86,78,81,82,,83,84,,,,79,85,,71,72,68,,54,59,,80,60', +'61,,,,64,,62,63,65,297,298,69,70,,,,,,293,294,300,95,94,96,97,,,223', +',,,,,,44,,,99,98,100,89,53,91,90,92,,93,101,102,,87,88,41,42,40,,,,', +',,,,,,,,,,,,,,,216,,,222,505,,55,56,,,57,,,,,,43,,,,,,,,221,,,,,86,78', +'81,82,,83,84,,,,79,85,,71,72,68,9,54,59,,80,60,61,,,,64,,62,63,65,29', +'30,69,70,,,,,,28,27,26,95,94,96,97,,,19,,,,,,8,44,,10,99,98,100,89,53', +'91,90,92,,93,101,102,,87,88,41,42,40,,,,,,,,,,,,,,,,,,,,39,,,32,,,55', +'56,,,57,,34,,,,43,,,,,,,,20,,,,,86,78,81,82,,83,84,,,,79,85,,71,72,68', +',54,59,,80,60,61,,,,64,,62,63,65,29,30,69,70,,,,,,28,27,26,95,94,96', +'97,,,19,,,,,,,44,,,99,98,100,89,53,91,90,92,,93,101,102,,87,88,41,42', +'40,231,235,240,241,242,237,239,247,248,243,244,,224,225,,,245,246,,216', +',,222,,,55,56,,,57,,,228,,234,43,230,229,226,227,238,236,232,20,233', +',,,86,78,81,82,,83,84,,,,79,85,211,249,-243,,,,59,,80,-243,-243,-243', +',,-243,-243,-243,,-243,,,,,,,,,,-243,,,,,,,,,,-243,-243,,-243,-243,-243', +'-243,-243,,,,,,,,,,,,-243,,,,,,,-243,-243,-243,,,-243,-243,-243,,-243', +',,,,,-243,,,,-243,,,-243,,,,,255,-243,-243,-243,,-243,-243,-243,-243', +'-243,,,,,,,,,,,,,,-243,,,,,,,,,-243,,,,,-243,,-243,-243,-243,-243,-243', +'-243,-243,-243,,-243,,-243,,,,,255,-243,-243,-243,-243,,,,,,,,,-243', +'-243,,-243,-243,-243,-243,-243,,,-243,,,,,,,,,,,,,,-243,,,,,-243,-243', +'-243,-243,-243,-243,-243,-243,-243,-243,-243,-243,-243,-243,-243,,,-243', +'-243,-243,,,-243,,255,-243,,,-243,-243,,-243,,-243,,-243,,-243,-243', +'-243,-243,-243,-243,-243,-288,-243,-243,-243,,,,-288,-288,-288,,,-288', +'-288,-288,,-288,-243,-243,,-243,,-243,,,,-288,-288,,,,,,,,,-288,-288', +',-288,-288,-288,-288,-288,,,,,,,,,,,,,,,,,,,,,,,-288,-288,-288,-288', +'-288,-288,-288,-288,-288,-288,-288,-288,-288,-288,,,-288,-288,-288,', +',-288,,264,-288,,,-288,-288,,-288,,-288,,-288,,-288,-288,-288,-288,-288', +'-288,-288,-398,-288,,-288,,,,-398,-398,-398,,,-398,-398,-398,,-398,-288', +'-288,,-288,,-288,,,-398,-398,-398,,,,,,,,,-398,-398,,-398,-398,-398', +'-398,-398,,,,,,,,,,,,,,,,,,,,,,,-398,-398,-398,-398,-398,-398,-398,-398', +'-398,-398,-398,-398,-398,-398,,,-398,-398,-398,,,-398,,255,-398,,,-398', +'-398,,-398,,-398,,-398,,-398,-398,-398,-398,-398,-398,-398,,-398,-398', +'-398,,,,,,,,,,,,,,-398,-398,,-398,,-398,166,177,167,190,163,183,173', +'172,193,194,188,171,170,165,191,195,196,175,164,178,182,184,176,169', +',,,185,192,187,186,179,189,174,162,181,180,,,,,,161,168,159,160,156', +'157,158,118,120,117,,119,,,,,,,,151,152,,148,130,131,132,139,136,138', +',,133,134,,,,153,154,140,141,,,,,,,,,,,,,,145,144,,129,150,147,146,142', +'143,137,135,127,149,128,,,155,86,,,,,,,,,,,85,166,177,167,190,163,183', +'173,172,193,194,188,171,170,165,191,195,196,175,164,178,182,184,176', +'169,,,,185,192,187,186,179,189,174,162,181,180,,,,,,161,168,159,160', +'156,157,158,118,120,,,119,,,,,,,,151,152,,148,130,131,132,139,136,138', +',,133,134,,,,153,154,140,141,,,,,,,,,,,,,,145,144,,129,150,147,146,142', +'143,137,135,127,149,128,,,155,86,,,,,,,,,,,85,166,177,167,190,163,183', +'173,172,193,194,188,171,170,165,191,195,196,175,164,178,182,184,176', +'169,,,,185,192,187,186,179,189,174,162,181,180,,,,,,161,168,159,160', +'156,157,158,118,120,,,119,,,,,,,,151,152,,148,130,131,132,139,136,138', +',,133,134,,,,153,154,140,141,,,,,,,,,,,,,,145,144,,129,150,147,146,142', +'143,137,135,127,149,128,,,155,86,,,,,,,,,,,85,166,177,167,190,163,183', +'173,172,193,194,188,171,170,165,191,195,196,175,164,178,182,184,176', +'169,,,,185,192,187,186,179,189,174,162,181,180,,,,,,161,168,159,160', +'156,157,158,118,120,,,119,,,,,,,,151,152,,148,130,131,132,139,136,138', +',,133,134,,,,153,154,140,141,,,,,,,,,,,,,,145,144,,129,150,147,146,142', +'143,137,135,127,149,128,,,155,86,,,,,,,,,,,85,166,177,167,190,163,183', +'173,172,193,194,188,171,170,165,191,195,196,175,164,178,182,184,176', +'169,,,,185,192,187,186,179,189,174,162,181,180,,,,,,161,168,159,160', +'156,157,158,118,120,,,119,,,,,,,,151,152,,148,130,131,132,139,136,138', +',,133,134,,,,153,154,140,141,,,,,,,,,,,,,,145,144,,129,150,147,146,142', +'143,137,135,127,149,128,,,155,166,177,167,190,163,183,173,172,193,194', +'188,171,170,165,191,195,196,175,164,178,182,184,176,169,,,,185,192,187', +'359,358,360,357,162,181,180,,,,,,161,168,159,160,354,355,356,352,120', +'91,90,353,,93,,,,,,151,152,,148,130,131,132,139,136,138,,,133,134,,', +',153,154,140,141,,,,,,364,,,,,,,,145,144,,129,150,147,146,142,143,137', +'135,127,149,128,679,409,155,,680,,,,,,,,151,152,,148,130,131,132,139', +'136,138,,,133,134,,,,153,154,140,141,,,,,,255,,,,,,,,145,144,,129,150', +'147,146,142,143,137,135,127,149,128,592,409,155,,593,,,,,,,,151,152', +',148,130,131,132,139,136,138,,,133,134,,,,153,154,140,141,,,,,,255,', +',,,,,,145,144,,129,150,147,146,142,143,137,135,127,149,128,590,402,155', +',591,,,,,,,,151,152,,148,130,131,132,139,136,138,,,133,134,,,,153,154', +'140,141,,,,,,255,,,,,,,,145,144,,129,150,147,146,142,143,137,135,127', +'149,128,939,409,155,,938,,,,,,,,151,152,,148,130,131,132,139,136,138', +',,133,134,,,,153,154,140,141,,,,,,255,,,,,,,,145,144,,129,150,147,146', +'142,143,137,135,127,149,128,625,409,155,,626,,,,,,,,151,152,,148,130', +'131,132,139,136,138,,,133,134,,,,153,154,140,141,,,,,,255,,,,,,,,145', +'144,,129,150,147,146,142,143,137,135,127,149,128,622,402,155,,623,,', +',,,,,151,152,,148,130,131,132,139,136,138,,,133,134,,,,153,154,140,141', +',,,,,255,,,,,,,,145,144,,129,150,147,146,142,143,137,135,127,149,128', +'590,402,155,,591,,,,,,,,151,152,,148,130,131,132,139,136,138,,,133,134', +',,,153,154,140,141,,,,,,255,,,,,,,,145,144,,129,150,147,146,142,143', +'137,135,127,149,128,592,409,155,,593,,,,,,,,151,152,,148,130,131,132', +'139,136,138,,,133,134,,,,153,154,140,141,,,,,,255,,,,,,,,145,144,,129', +'150,147,146,142,143,137,135,127,149,128,460,402,155,,461,,,,,,,,151', +'152,,148,130,131,132,139,136,138,,,133,134,,,,153,154,140,141,,,,,,', +',,,,,,,145,144,,129,150,147,146,142,143,137,135,127,149,128,460,402', +'155,,461,,,,,,,,151,152,,148,130,131,132,139,136,138,,,133,134,,,,153', +'154,140,141,,,,,,,,,,,,,,145,144,,129,150,147,146,142,143,137,135,127', +'149,128,405,409,155,,404,,,,,,,,151,152,,148,130,131,132,139,136,138', +',,133,134,,,,153,154,140,141,,,,,,255,,,,,,,,145,144,,129,150,147,146', +'142,143,137,135,127,149,128,398,402,155,,399,,,,,,,,151,152,,148,130', +'131,132,139,136,138,,,133,134,,,,153,154,140,141,,,,,,255,,,,,,,,145', +'144,,129,150,147,146,142,143,137,135,127,149,128,460,402,155,,461,,', +',,,,,151,152,,148,130,131,132,139,136,138,,,133,134,,,,153,154,140,141', +',,,,,255,,,,,,,,145,144,,129,150,147,146,142,143,137,135,127,149,128', +'682,409,155,,683,,,,,,,,151,152,,148,130,131,132,139,136,138,,,133,134', +',,,153,154,140,141,,,,,,255,,,,,,,,145,144,,129,150,147,146,142,143', +'137,135,127,149,128,677,402,155,,678,,,,,,,,151,152,,148,130,131,132', +'139,136,138,,,133,134,,,,153,154,140,141,,,,,,255,,,,,,,,145,144,,129', +'150,147,146,142,143,137,135,127,149,128,917,402,155,,918,,,,,,,,151', +'152,,148,130,131,132,139,136,138,,,133,134,,,,153,154,140,141,,,,,,255', +',,,,,,,145,144,,129,150,147,146,142,143,137,135,127,149,128,919,409', +'155,,920,,,,,,,,151,152,,148,130,131,132,139,136,138,,,133,134,,,,153', +'154,140,141,,,,,,255,,,,,,,,145,144,,129,150,147,146,142,143,137,135', +'127,149,128,,,155,231,235,240,241,242,237,239,247,248,243,244,,224,225', +',,245,246,,,,,,,,,,,,,,,228,,234,,230,229,226,227,238,236,232,,233,', +'231,235,240,241,242,237,239,247,248,243,244,,224,225,,249,245,246,,', +',,,,,,,,,,,,228,,234,,230,229,226,227,238,236,232,,233,,231,235,240', +'241,242,237,239,247,248,243,244,,224,225,,249,245,246,,,,,,,,,,,,,,', +'228,,234,,230,229,226,227,238,236,232,,233,,231,235,240,241,242,237', +'239,247,248,243,244,,224,225,,249,245,246,,,,,,,,,,,,,,,228,,234,,230', +'229,226,227,238,236,232,,233,,231,235,240,241,242,237,239,247,248,243', +'244,,224,225,,249,245,246,,,,,,,,,,,,,,,228,,234,,230,229,226,227,238', +'236,232,,233,,231,235,240,241,242,237,239,247,248,243,244,,224,225,', +'249,245,246,,,,,,,,,,,,,,,228,,234,,230,229,226,227,238,236,232,,233', +',231,235,240,241,242,237,239,247,248,243,244,,224,225,,249,245,246,', +',,,,,,,,,,,,,228,,234,,230,229,226,227,238,236,232,,233,,231,235,240', +'241,242,237,239,247,248,243,244,,224,225,,249,245,246,,,,,,,,,,,,,,', +'228,,234,,230,229,226,227,238,236,232,,233,,,,,,,,,,,,,,,,,249' ] + racc_action_table = arr = ::Array.new(23289, nil) + idx = 0 + clist.each do |str| + str.split(',', -1).each do |i| + arr[idx] = i.to_i unless i.empty? + idx += 1 + end + end + +clist = [ +'89,54,54,54,54,54,54,89,89,89,54,54,89,89,89,54,89,54,54,54,54,54,54', +'54,89,58,89,89,89,54,54,54,54,54,54,54,89,89,54,89,89,89,89,89,54,54', +'917,54,54,54,54,54,54,54,54,54,347,54,54,54,675,54,54,54,54,54,89,89', +'89,89,89,89,89,89,89,89,89,89,89,89,678,19,89,89,89,54,89,89,54,679', +'89,54,54,89,89,54,89,54,89,370,89,54,89,89,89,89,89,89,89,54,89,58,89', +'680,54,54,54,54,19,54,54,371,787,958,54,54,89,89,89,89,592,89,54,89', +'54,89,326,592,592,592,333,334,592,592,592,617,592,788,337,524,318,617', +'753,318,679,592,592,592,592,532,917,347,370,327,849,917,592,592,1,592', +'592,592,592,592,675,940,918,675,680,675,525,347,371,371,371,678,347', +'643,677,550,550,633,633,919,679,428,592,592,592,592,592,592,592,592', +'592,592,592,592,592,592,76,343,592,592,592,343,592,592,680,76,592,544', +'544,592,592,7,592,787,592,76,592,10,592,592,592,592,592,592,592,12,592', +'592,592,693,428,333,334,788,693,524,326,13,788,337,524,326,592,592,592', +'592,92,592,16,592,532,592,753,92,92,92,919,753,92,92,92,22,92,327,849', +'550,525,633,327,849,92,525,92,92,92,940,918,25,643,677,940,918,92,92', +'36,92,92,92,92,92,422,422,468,919,623,622,590,544,919,39,296,467,544', +'458,773,44,773,773,773,605,773,103,92,92,92,92,92,92,92,92,92,92,92', +'92,92,92,468,356,92,92,92,197,92,92,356,467,92,458,591,92,92,25,92,605', +'92,590,92,216,92,92,92,92,92,92,92,854,92,854,92,218,623,622,214,25', +'296,398,561,40,40,219,341,625,92,92,92,92,593,92,223,92,422,92,773,593', +'593,593,296,591,593,593,593,215,593,687,308,254,623,622,687,623,622', +'308,593,593,593,623,622,268,398,682,308,214,593,593,398,593,593,593', +'593,593,666,666,341,625,353,360,217,561,561,341,625,353,360,269,341', +'625,561,272,341,625,215,728,593,593,593,593,593,593,593,593,593,593', +'593,593,593,593,341,625,593,593,593,682,593,593,746,399,593,281,682', +'593,593,283,593,682,593,217,593,682,593,593,593,593,593,593,593,404', +'593,38,593,284,728,285,404,404,404,682,15,37,404,404,291,404,593,593', +'593,593,294,593,399,593,358,593,434,342,399,543,746,358,509,509,543', +'404,404,746,404,404,404,404,404,295,38,892,746,892,892,892,38,892,642', +'15,37,642,278,368,434,15,37,278,434,434,746,404,404,404,404,404,404', +'404,404,404,404,404,404,404,404,342,369,404,404,404,300,404,342,352', +'305,404,302,342,404,357,352,342,306,404,307,404,357,404,404,404,404', +'404,404,404,405,404,367,404,310,342,573,405,405,405,368,368,368,405', +'405,892,405,404,404,313,404,355,404,305,435,405,404,3,355,305,314,335', +'3,369,369,369,405,405,335,405,405,405,405,405,931,931,319,335,598,573', +'598,598,598,366,598,573,435,330,17,17,435,435,330,367,367,367,405,405', +'405,405,405,405,405,405,405,405,405,405,405,405,354,454,405,405,405', +'598,405,354,317,320,405,317,24,405,598,598,598,598,405,24,405,322,405', +'405,405,405,405,405,405,331,405,405,405,454,366,366,366,454,454,454', +'454,321,332,359,321,362,405,405,598,405,359,405,362,325,325,405,636', +'636,636,636,636,636,117,336,877,636,636,117,117,338,636,877,636,636', +'636,636,636,636,636,380,877,301,301,386,636,636,636,636,636,636,636', +'388,844,636,844,844,844,391,844,636,636,394,636,636,636,636,636,636', +'636,636,636,396,636,636,636,397,636,636,636,636,636,770,406,770,770', +'770,535,770,884,844,884,884,884,535,884,414,424,626,844,436,636,437', +'535,636,626,438,636,636,439,626,636,465,636,626,469,482,636,952,770', +'952,952,952,483,952,636,884,486,770,488,636,636,636,636,493,636,636', +'884,884,497,636,636,750,750,750,750,750,750,636,506,636,750,750,521', +'526,952,750,527,750,750,750,750,750,750,750,558,952,952,564,570,750', +'750,750,750,750,750,750,574,657,750,657,657,657,579,657,750,750,584', +'750,750,750,750,750,750,750,750,750,594,750,750,750,596,750,750,750', +'750,750,846,610,846,846,846,870,846,942,657,942,942,942,870,942,612', +'619,683,657,621,750,624,870,750,683,627,750,750,628,683,750,631,750', +'683,632,634,750,909,846,909,909,909,637,909,750,942,638,641,646,750', +'750,750,750,647,750,750,942,942,648,750,750,32,32,32,32,32,32,750,655', +'750,32,32,662,665,909,32,668,32,32,32,32,32,32,32,673,909,909,676,685', +'32,32,32,32,32,32,32,554,554,32,690,554,554,554,417,32,32,707,32,32', +'32,32,32,32,32,32,32,712,32,32,32,730,32,32,32,32,32,417,417,417,417', +'417,417,417,417,417,417,417,292,417,417,345,731,417,417,292,32,732,345', +'32,734,735,32,32,292,737,32,345,32,417,739,417,32,417,417,417,417,417', +'417,417,32,417,741,742,745,32,32,32,32,756,32,32,761,772,290,32,32,775', +'417,409,417,290,778,32,781,32,409,409,409,790,290,409,409,409,907,409', +'907,907,907,794,907,453,795,798,409,409,409,409,736,799,736,736,736', +'812,736,409,409,813,409,409,409,409,409,946,819,946,946,946,289,946', +'827,907,833,453,834,289,835,453,453,453,453,838,907,907,289,409,409', +'409,409,409,409,409,409,409,409,409,409,409,409,839,946,409,409,409', +'288,841,409,843,845,409,851,288,409,409,852,409,857,409,862,409,288', +'409,409,409,409,409,409,409,828,409,409,409,863,826,864,828,865,867', +'871,873,826,878,879,894,828,409,409,409,409,826,409,916,409,115,115', +'115,115,115,115,923,924,825,115,115,925,926,927,115,825,115,115,115', +'115,115,115,115,929,825,932,933,934,115,115,115,115,115,115,115,935', +'869,115,869,869,869,936,869,115,115,115,115,115,115,115,115,115,115', +'115,115,937,115,115,115,938,115,115,115,115,115,930,939,930,930,930', +'947,930,956,888,957,888,888,888,,888,,,,,115,,,115,,,115,115,,,115,893', +'115,893,893,893,115,893,930,904,824,904,904,904,115,904,888,824,,115', +'115,115,115,,115,115,824,888,888,115,115,545,545,545,545,545,545,115', +'893,115,545,545,,,,545,904,545,545,545,545,545,545,545,,904,904,904', +'904,545,545,545,545,545,545,545,,928,545,928,928,928,,928,545,545,,545', +'545,545,545,545,545,545,545,545,,545,545,545,,545,545,545,545,545,481', +'481,481,481,481,213,,886,928,886,886,886,213,886,,,14,45,,545,,213,545', +'14,45,545,545,,,545,492,545,14,45,,545,810,492,810,810,810,,810,545', +'886,,492,,545,545,545,545,,545,545,886,886,,545,545,701,701,701,701', +'701,701,545,,545,701,701,,,810,701,,701,701,701,701,701,701,701,,810', +'810,,,701,701,701,701,701,701,701,,,701,6,6,6,6,6,701,701,,701,701,701', +'701,701,701,701,701,701,,701,701,701,,701,701,701,701,701,616,616,616', +'616,616,,,,767,,767,767,767,,767,,920,,,701,,,701,920,,701,701,,920', +'701,,701,920,,,701,,,692,,692,692,692,701,692,767,,,701,701,701,701', +',701,701,,767,767,701,701,740,740,740,740,740,740,701,,701,740,740,', +',,740,692,740,740,740,740,740,740,740,,692,692,692,692,740,740,740,740', +'740,740,740,,,740,279,279,279,279,279,740,740,,740,740,740,740,740,740', +'740,740,740,,740,740,740,,740,740,740,740,740,,,,,,,,,,,,,,,,,,,,740', +',,740,,,740,740,,,740,,740,,,,740,,,881,,881,881,881,740,881,,,,740', +'740,740,740,,740,740,,,,740,740,782,782,782,782,782,782,740,,740,782', +'782,,,,782,881,782,782,782,782,782,782,782,,881,881,881,881,782,782', +'782,782,782,782,782,,,782,,,,,,782,782,,782,782,782,782,782,782,782', +'782,782,,782,782,782,,782,782,782,782,782,,,,,,,,,,,,,,,,,,,,782,,,782', +',,782,782,,,782,,782,,,,782,,,807,,807,807,807,782,807,,,,782,782,782', +'782,,782,782,,,,782,782,823,823,823,823,823,823,782,,782,823,823,,,', +'823,807,823,823,823,823,823,823,823,,807,807,807,807,823,823,823,823', +'823,823,823,,,823,,,,,,823,823,,823,823,823,823,823,823,823,823,823', +',823,823,823,,823,823,823,823,823,,,,,,,,,,,,,,,,,,,,823,,,823,,,823', +'823,,,823,,823,,,,823,,,805,,805,805,805,823,805,,,,823,823,823,823', +',823,823,,,,823,823,783,783,783,783,783,783,823,,823,783,783,,,,783', +'805,783,783,783,783,783,783,783,,805,805,805,805,783,783,783,783,783', +'783,783,,,783,,,,,,783,783,,783,783,783,783,783,783,783,783,783,,783', +'783,783,,783,783,783,783,783,,,,,,,,,,,,,,,,,,,,783,,,783,,,783,783', +',,783,,783,,,,783,,,764,,764,764,764,783,764,,,,783,783,783,783,,783', +'783,,,,783,783,222,222,222,222,222,222,783,,783,222,222,,,,222,764,222', +'222,222,222,222,222,222,,764,764,764,764,222,222,222,222,222,222,222', +',,222,,,,,,222,222,,222,222,222,222,222,222,222,222,222,,222,222,222', +',222,222,222,222,222,,,,,,,,,,,,,,,,,,,,222,,,222,,,222,222,,,222,,222', +',,,222,,,762,,762,762,762,222,762,,,,222,222,222,222,,222,222,,,,222', +'222,786,786,786,786,786,786,222,,222,786,786,,,,786,762,786,786,786', +'786,786,786,786,,762,762,762,762,786,786,786,786,786,786,786,,,786,', +',,,,786,786,,786,786,786,786,786,786,786,786,786,,786,786,786,,786,786', +'786,786,786,,,,,,,,,,,,,,,,,,,,786,,,786,,,786,786,,,786,,786,,,,786', +',,644,,644,644,644,786,644,,,,786,786,786,786,,786,786,,,,786,786,691', +'691,691,691,691,691,786,,786,691,691,,,,691,644,691,691,691,691,691', +'691,691,,644,644,644,644,691,691,691,691,691,691,691,,,691,,,,,,691', +'691,,691,691,691,691,691,691,691,691,691,,691,691,691,,691,691,691,691', +'691,446,,,,,,,,,,,,,,,,446,446,,691,,,691,,,691,691,,,691,,691,446,', +'446,691,446,446,446,446,,,446,691,446,,,,691,691,691,691,,691,691,,', +',691,691,831,831,831,831,831,831,691,,691,831,831,,,,831,,831,831,831', +'831,831,831,831,,,,,,831,831,831,831,831,831,831,,,831,,,,,,831,831', +',831,831,831,831,831,831,831,831,831,,831,831,831,,831,831,831,831,831', +'445,,,,,,,,,,,,,,,,445,445,,831,,,831,,,831,831,,,831,,831,445,,445', +'831,445,445,445,445,,,445,831,445,,,,831,831,831,831,,831,831,,,,831', +'831,523,523,523,523,523,523,831,,831,523,523,,,,523,,523,523,523,523', +'523,523,523,,,,,,523,523,523,523,523,523,523,,,523,,,,,,523,523,,523', +'523,523,523,523,523,523,523,523,,523,523,523,,523,523,523,523,523,456', +'456,456,456,456,456,456,456,,456,456,,,,,,456,456,,523,,,523,,,523,523', +',,523,,523,456,,456,523,456,456,456,456,456,456,456,523,456,,,,523,523', +'523,523,,523,523,,,,523,523,832,832,832,832,832,832,523,,523,832,832', +',,,832,,832,832,832,832,832,832,832,,,,,,832,832,832,832,832,832,832', +',,832,,,,,,832,832,,832,832,832,832,832,832,832,832,832,,832,832,832', +',832,832,832,832,832,452,452,452,452,452,452,452,,,452,452,,,,,,452', +'452,,832,,,832,,,832,832,,,832,,832,452,,452,832,452,452,452,452,452', +'452,452,832,452,,,,832,832,832,832,,832,832,,,,832,832,520,520,520,520', +'520,520,832,,832,520,520,,,,520,,520,520,520,520,520,520,520,,,,,,520', +'520,520,520,520,520,520,,,520,,,,,595,520,520,,520,520,520,520,520,520', +'520,520,520,,520,520,520,,520,520,520,520,520,595,595,595,595,595,595', +'595,595,595,595,595,,595,595,,,595,595,,520,,,520,,,520,520,,,520,,520', +'595,,595,520,595,595,595,595,595,595,595,520,595,,,,520,520,520,520', +',520,520,,,,520,520,,595,410,,,,520,,520,410,410,410,,,410,410,410,519', +'410,519,519,519,,519,,,,410,410,410,410,,,,,,,,410,410,,410,410,410', +'410,410,,,,,,,,,519,519,,,,,,,,519,519,519,519,,410,410,410,410,410', +'410,410,410,410,410,410,410,410,410,,,410,410,410,,,410,,,410,,,410', +'410,,410,,410,,410,,410,410,410,410,410,410,410,,410,410,410,,,,,,,', +',,,,,,410,410,410,410,,410,,410,282,282,282,282,282,282,,,,282,282,', +',,282,,282,282,282,282,282,282,282,,,,,,282,282,282,282,282,282,282', +',,282,,,,,,282,282,,282,282,282,282,282,282,282,282,282,,282,282,282', +',282,282,282,282,282,449,449,449,449,449,449,449,,,449,449,,,,,,449', +'449,,282,,,282,,,282,282,,,282,,282,449,,449,282,449,449,449,449,449', +'449,449,282,449,,,,282,282,282,282,,282,282,,,,282,282,895,895,895,895', +'895,895,282,,282,895,895,,,,895,,895,895,895,895,895,895,895,,,,,,895', +'895,895,895,895,895,895,,,895,,,,,,895,895,,895,895,895,895,895,895', +'895,895,895,,895,895,895,,895,895,895,895,895,448,448,448,448,448,448', +'448,,,448,448,,,,,,448,448,,895,,,895,,,895,895,,,895,,895,448,,448', +'895,448,448,448,448,448,448,448,895,448,,,,895,895,895,895,,895,895', +',,,895,895,901,901,901,901,901,901,895,,895,901,901,,,,901,,901,901', +'901,901,901,901,901,,,,,,901,901,901,901,901,901,901,,,901,,,,,,901', +'901,,901,901,901,901,901,901,901,901,901,,901,901,901,,901,901,901,901', +'901,447,,,,,,,,,,,,,,,,447,447,,901,,,901,,,901,901,,,901,,901,447,', +'447,901,447,447,447,447,,,447,901,447,,,,901,901,901,901,,901,901,,', +',901,901,903,903,903,903,903,903,901,,901,903,903,,,,903,,903,903,903', +'903,903,903,903,,,,,,903,903,903,903,903,903,903,,,903,,,,,,903,903', +',903,903,903,903,903,903,903,903,903,,903,903,903,,903,903,903,903,903', +'451,451,451,451,451,451,451,,,451,451,,,,,,451,451,,903,,,903,,,903', +'903,,,903,,903,451,,451,903,451,451,451,451,451,451,451,903,451,,,,903', +'903,903,903,,903,903,,,,903,903,199,199,199,199,199,199,903,,903,199', +'199,,,,199,,199,199,199,199,199,199,199,,,,,,199,199,199,199,199,199', +'199,,,199,,,,,,199,199,,199,199,199,199,199,199,199,199,199,,199,199', +'199,,199,199,199,199,199,450,450,450,450,450,450,450,,,450,450,,,,,', +'450,450,,199,,,199,,,199,199,,,199,,199,450,,450,199,450,450,450,450', +'450,450,450,199,450,,,,199,199,199,199,,199,199,,,,199,199,792,792,792', +'792,792,792,199,,199,792,792,,,,792,,792,792,792,792,792,792,792,,,', +',,792,792,792,792,792,792,792,,,792,,,,,393,792,792,,792,792,792,792', +'792,792,792,792,792,,792,792,792,,792,792,792,792,792,393,393,393,393', +'393,393,393,393,393,393,393,,393,393,,,393,393,,792,,,792,,,792,792', +',,792,,792,393,,393,792,393,393,393,393,393,393,393,792,393,,,,792,792', +'792,792,,792,792,,,,792,792,,393,53,,,,792,,792,53,53,53,,,53,53,53', +'546,53,546,546,546,,546,,,,,53,53,53,,,,,,,,53,53,,53,53,53,53,53,,', +',,,,,,546,546,,,,,,,,546,546,546,546,,53,53,53,53,53,53,53,53,53,53', +'53,53,53,53,,,53,53,53,,,53,,,53,,,53,53,,53,,53,,53,,53,53,53,53,53', +'53,53,,53,,53,,,,,,,,,,,,,,53,53,53,53,,53,,53,608,608,608,608,608,608', +',,,608,608,,,,608,,608,608,608,608,608,608,608,,,,,,608,608,608,608', +'608,608,608,,,608,,,,,,608,608,,608,608,608,608,608,608,608,608,608', +',608,608,608,,608,608,608,608,608,455,455,455,455,455,455,455,,,455', +'455,,,,,,455,455,,608,,,608,,,608,608,,,608,,608,455,,455,608,455,455', +'455,455,455,455,455,608,455,,,,608,608,608,608,,608,608,,,,608,608,287', +'287,287,287,287,287,608,,608,287,287,,,,287,,287,287,287,287,287,287', +'287,,,,,,287,287,287,287,287,287,287,,,287,,,,,,287,287,,287,287,287', +'287,287,287,287,287,287,,287,287,287,,287,287,287,287,287,432,432,432', +'432,432,432,432,432,432,432,432,,432,432,,,432,432,,287,,,287,,,287', +'287,,,287,,287,432,,432,287,432,432,432,432,432,432,432,287,432,,,,287', +'287,287,287,,287,287,,,,287,287,607,607,607,607,607,607,287,,287,607', +'607,,,,607,,607,607,607,607,607,607,607,,,,,,607,607,607,607,607,607', +'607,,,607,,,,,,607,607,,607,607,607,607,607,607,607,607,607,,607,607', +'607,,607,607,607,607,607,433,433,433,433,433,433,433,433,433,433,433', +',433,433,,,433,433,,607,,,607,,,607,607,,,607,,607,433,,433,607,433', +'433,433,433,433,433,433,607,433,,,,607,607,607,607,,607,607,,,,607,607', +'0,0,0,0,0,0,607,,607,0,0,,,,0,,0,0,0,0,0,0,0,,,,,,0,0,0,0,0,0,0,,,0', +',,,,,0,0,0,0,0,0,0,0,0,0,0,0,,0,0,0,,0,0,0,0,0,444,,,,,,,,,,,,,,,,444', +'444,,0,,,0,,,0,0,,,0,,0,444,,444,0,444,444,444,444,,,444,0,444,,,,0', +'0,0,0,,0,0,,,,0,0,600,600,600,600,600,600,0,,0,600,600,,,,600,,600,600', +'600,600,600,600,600,,,,,,600,600,600,600,600,600,600,,,600,,,,,,600', +'600,,600,600,600,600,600,600,600,600,600,,600,600,600,,600,600,600,600', +'600,443,443,443,443,443,443,443,,,443,443,,,,,,443,443,,600,,,600,,', +'600,600,,,600,,600,443,,443,600,443,443,443,443,443,443,443,600,443', +',,,600,600,600,600,,600,600,,,,600,600,686,686,686,686,686,686,600,', +'600,686,686,,,,686,,686,686,686,686,686,686,686,,,,,,686,686,686,686', +'686,686,686,,,686,,,,,,686,686,,686,686,686,686,686,686,686,686,686', +',686,686,686,,686,686,686,686,686,440,,,,,,,,,,,,,,,,440,440,,686,,', +'686,,,686,686,,,686,,686,440,,440,686,440,440,440,440,,,,686,,,,,686', +'686,686,686,,686,686,,,,686,686,,20,20,20,,20,686,,686,20,20,,,,20,', +'20,20,20,20,20,20,20,,,,,,20,20,20,20,20,20,20,,,20,,,,,,,20,,,20,20', +'20,20,20,20,20,20,,20,20,20,,20,20,20,20,20,441,,,,,,,,,,,,,,,,441,441', +',20,,,20,,,20,20,,,20,,,441,,441,20,441,441,441,441,,,,20,,,,,20,20', +'20,20,,20,20,,,,20,20,,221,221,221,,221,20,,20,221,221,,,,221,,221,221', +'221,221,221,221,221,,,,,,221,221,221,221,221,221,221,,,221,,,,,,,221', +',,221,221,221,221,221,221,221,221,,221,221,221,,221,221,221,221,221', +'442,,,,,,,,,,,,,,,,442,442,,221,,,221,,,221,221,,,221,,,442,,,221,442', +'442,442,442,,,,221,,,,,221,221,221,221,,221,221,,,,221,221,,629,629', +'629,,629,221,,221,629,629,,,,629,,629,629,629,629,629,629,629,,,,,,629', +'629,629,629,629,629,629,,,629,,,,,,,629,,,629,629,629,629,629,629,629', +'629,,629,629,629,,629,629,,860,629,860,860,860,,860,,,,,,,,,,,,,,,629', +',,629,,,629,629,,,629,,,,,,860,860,,,,,,,,860,860,860,860,629,629,629', +'629,,629,629,,,,629,629,,768,768,768,,768,629,,629,768,768,,,,768,,768', +'768,768,768,768,768,768,,,,,,768,768,768,768,768,768,768,,,768,,,,,', +',768,,,768,768,768,768,768,768,768,768,,768,768,768,,768,768,768,768', +'768,,,,,,,,,,,,,,,,,,,,768,,,768,,,768,768,,,768,,,,,,768,,,,,,,,768', +',,,,768,768,768,768,,768,768,,,,768,768,,618,618,618,,618,768,,768,618', +'618,,,,618,,618,618,618,618,618,618,618,,,,,,618,618,618,618,618,618', +'618,,,618,,,,,,,618,,,618,618,618,618,618,618,618,618,,618,618,618,', +'618,618,,,618,,,,,,,,,,,,,,,,,,,,618,,,618,,,618,618,,,618,,,,,,,,,', +',,,,,,,,,618,618,618,618,,618,618,,,,618,618,,255,255,255,,255,618,', +'618,255,255,,,,255,,255,255,255,255,255,255,255,,,,,,255,255,255,255', +'255,255,255,,,255,,,,,,,255,,,255,255,255,255,255,255,255,255,255,255', +'255,255,,255,255,255,255,255,,,,,,,,,,,,,,,,,,,,255,,,255,,,255,255', +',,255,,255,,255,,255,,,,,,,,255,,,,,255,255,255,255,,255,255,,,,255', +'255,,256,256,256,,256,255,,255,256,256,,,,256,,256,256,256,256,256,256', +'256,,,,,,256,256,256,256,256,256,256,,,256,,,,,,,256,,,256,256,256,256', +'256,256,256,256,256,256,256,256,,256,256,256,256,256,,,,,,,,,,,,,,,', +',,,,256,,,256,,,256,256,,,256,,256,,256,,256,,,,,,,,256,,,,,256,256', +'256,256,,256,256,,,,256,256,,780,780,780,,780,256,,256,780,780,,,,780', +',780,780,780,780,780,780,780,,,,,,780,780,780,780,780,780,780,,,780', +',,,,,,780,,,780,780,780,780,780,780,780,780,,780,780,780,,780,780,780', +'780,780,,,,,,,,,,,,,,,,,,,,780,,,780,,,780,780,,,780,,,,,,780,,,,,,', +',780,,,,,780,780,780,780,,780,780,,,,780,780,,264,264,264,,264,780,', +'780,264,264,,,,264,,264,264,264,264,264,264,264,,,,,,264,264,264,264', +'264,264,264,,,264,,,,,,,264,,,264,264,264,264,264,264,264,264,264,264', +'264,264,,264,264,264,264,264,,,,,,,,,,,,,,,,,,,,264,,,264,,,264,264', +',,264,,264,,264,,264,,,,,,,,264,,,,,264,264,264,264,,264,264,,,,264', +'264,264,785,785,785,,785,264,,264,785,785,,,,785,,785,785,785,785,785', +'785,785,,,,,,785,785,785,785,785,785,785,,,785,,,,,,,785,,,785,785,785', +'785,785,785,785,785,,785,785,785,,785,785,785,785,785,,,,,,,,,,,,,,', +',,,,,785,,,785,,,785,785,,,785,,785,,,,785,,,,,,,,785,,,,,785,785,785', +'785,,785,785,,,,785,785,,681,681,681,,681,785,,785,681,681,,,,681,,681', +'681,681,681,681,681,681,,,,,,681,681,681,681,681,681,681,,,681,,,,,', +',681,,,681,681,681,681,681,681,681,681,,681,681,681,,681,681,681,681', +'681,,,,,,,,,,,,,,,,,,,,681,,,681,,,681,681,,,681,,,,,,681,,,,,,,,681', +',,,,681,681,681,681,,681,681,,,,681,681,,235,235,235,,235,681,,681,235', +'235,,,,235,,235,235,235,235,235,235,235,,,,,,235,235,235,235,235,235', +'235,,,235,,,,,,,235,,,235,235,235,235,235,235,235,235,,235,235,235,', +'235,235,235,235,235,,,,,,,,,,,,,,,,,,,,235,,,235,,,235,235,,,235,,,', +',,235,,,,,,,,235,,,,,235,235,235,235,,235,235,,,,235,235,,613,613,613', +',613,235,,235,613,613,,,,613,,613,613,613,613,613,613,613,,,,,,613,613', +'613,613,613,613,613,,,613,,,,,,,613,,,613,613,613,613,613,613,613,613', +',613,613,613,,613,613,613,613,613,,,,,,,,,,,,,,,,,,,,613,,,613,,,613', +'613,,,613,,,,,,613,,,,,,,,613,,,,,613,613,613,613,,613,613,,,,613,613', +',271,271,271,,271,613,,613,271,271,,,,271,,271,271,271,271,271,271,271', +',,,,,271,271,271,271,271,271,271,,,271,,,,,,,271,,,271,271,271,271,271', +'271,271,271,,271,271,271,,271,271,271,271,271,,,,,,,,,,,,,,,,,,,,271', +',,271,,,271,271,,,271,,,,,,271,,,,,,,,271,,,,,271,271,271,271,,271,271', +',,,271,271,,802,802,802,,802,271,,271,802,802,,,,802,,802,802,802,802', +'802,802,802,,,,,,802,802,802,802,802,802,802,,,802,,,,,,,802,,,802,802', +'802,802,802,802,802,802,802,802,802,802,,802,802,802,802,802,,,,,,,', +',,,,,,,,,,,,802,,,802,,,802,802,,,802,,,,802,,802,,,,,,,,802,,,,,802', +'802,802,802,,802,802,,,,802,802,,803,803,803,,803,802,,802,803,803,', +',,803,,803,803,803,803,803,803,803,,,,,,803,803,803,803,803,803,803', +',,803,,,,,,,803,,,803,803,803,803,803,803,803,803,,803,803,803,,803', +'803,803,803,803,,,,,,,,,,,,,,,,,,,,803,,,803,,,803,803,,,803,,,,,,803', +',,,,,,,803,,,,,803,803,803,803,,803,803,,,,803,803,,210,210,210,,210', +'803,,803,210,210,,,,210,,210,210,210,210,210,210,210,,,,,,210,210,210', +'210,210,210,210,,,210,,,,,,,210,,,210,210,210,210,210,210,210,210,,210', +'210,210,,210,210,210,210,210,,,,,,,,,,,,,,,,,,,,210,,,210,,,210,210', +',,210,,,,,,210,,,,,,,,210,,,,,210,210,210,210,,210,210,,,,210,210,210', +'209,209,209,,209,210,,210,209,209,,,,209,,209,209,209,209,209,209,209', +',,,,,209,209,209,209,209,209,209,,,209,,,,,,,209,,,209,209,209,209,209', +'209,209,209,,209,209,209,,209,209,209,209,209,,,,,,,,,,,,,,,,,,,,209', +',,209,,,209,209,,,209,,,,,,209,,,,,,,,209,,,,,209,209,209,209,,209,209', +',,,209,209,,273,273,273,,273,209,,209,273,273,,,,273,,273,273,273,273', +'273,273,273,,,,,,273,273,273,273,273,273,273,,,273,,,,,,,273,,,273,273', +'273,273,273,273,273,273,,273,273,273,,273,273,273,273,273,,,,,,,,,,', +',,,,,,,,,273,,,273,,,273,273,,,273,,,,,,273,,,,,,,,273,,,,,273,273,273', +'273,,273,273,,,,273,273,,275,275,275,,275,273,,273,275,275,,,,275,,275', +'275,275,275,275,275,275,,,,,,275,275,275,275,275,275,275,,,275,,,,,', +',275,,,275,275,275,275,275,275,275,275,,275,275,275,,275,275,275,275', +'275,,,,,,,,,,,,,,,,,,,,275,,,275,,,275,275,,,275,,,,,,275,,,,,,,,275', +',,,,275,275,275,275,,275,275,,,,275,275,,817,817,817,,817,275,,275,817', +'817,,,,817,,817,817,817,817,817,817,817,,,,,,817,817,817,817,817,817', +'817,,,817,,,,,,,817,,,817,817,817,817,817,817,817,817,,817,817,817,', +'817,817,,,817,,,,,,,,,,,,,,,,,,,,817,,,817,,,817,817,,,817,,,,,,,,,', +',,,,,,,,,817,817,817,817,,817,817,,,,817,817,,587,587,587,,587,817,', +'817,587,587,,,,587,,587,587,587,587,587,587,587,,,,,,587,587,587,587', +'587,587,587,,,587,,,,,,,587,,,587,587,587,587,587,587,587,587,,587,587', +'587,,587,587,587,587,587,,,,,,,,,,,,,,,,,,,,587,,,587,,,587,587,,,587', +',,,,,587,,,,,,,,587,,,,,587,587,587,587,,587,587,,,,587,587,,586,586', +'586,,586,587,,587,586,586,,,,586,,586,586,586,586,586,586,586,,,,,,586', +'586,586,586,586,586,586,,,586,,,,,,,586,,,586,586,586,586,586,586,586', +'586,,586,586,586,,586,586,586,586,586,,,,,,,,,,,,,,,,,,,,586,,,586,', +',586,586,,,586,,,,,,586,,,,,,,,586,,,,,586,586,586,586,,586,586,,,,586', +'586,,208,208,208,,208,586,,586,208,208,,,,208,,208,208,208,208,208,208', +'208,,,,,,208,208,208,208,208,208,208,,,208,,,,,,,208,,,208,208,208,208', +'208,208,208,208,,208,208,208,,208,208,208,208,208,,,,,,,,,,,,,,,,,,', +',208,,,208,,,208,208,,,208,,,,,,208,,,,,,,,208,,,,,208,208,208,208,', +'208,208,,,,208,208,,583,583,583,,583,208,,208,583,583,,,,583,,583,583', +'583,583,583,583,583,,,,,,583,583,583,583,583,583,583,,,583,,,,,,,583', +',,583,583,583,583,583,583,583,583,,583,583,583,,583,583,583,583,583', +',,,,,,,,,,,,,,,,,,,583,,,583,,,583,583,,,583,,,,,,583,,,,,,,,583,,,', +',583,583,583,583,,583,583,,,,583,583,,582,582,582,,582,583,,583,582', +'582,,,,582,,582,582,582,582,582,582,582,,,,,,582,582,582,582,582,582', +'582,,,582,,,,,,,582,,,582,582,582,582,582,582,582,582,,582,582,582,', +'582,582,582,582,582,,,,,,,,,,,,,,,,,,,,582,,,582,,,582,582,,,582,,,', +',,582,,,,,,,,582,,,,,582,582,582,582,,582,582,,,,582,582,,207,207,207', +',207,582,,582,207,207,,,,207,,207,207,207,207,207,207,207,,,,,,207,207', +'207,207,207,207,207,,,207,,,,,,,207,,,207,207,207,207,207,207,207,207', +',207,207,207,,207,207,207,207,207,,,,,,,,,,,,,,,,,,,,207,,,207,,,207', +'207,,,207,,,,,,207,,,,,,,,207,,,,,207,207,207,207,,207,207,,,,207,207', +',280,280,280,280,280,207,,207,280,280,,,,280,,280,280,280,280,280,280', +'280,,,,,,280,280,280,280,280,280,280,,,280,,,,,,280,280,,280,280,280', +'280,280,280,280,280,280,,280,280,280,,280,280,280,280,280,,,,,,,,,,', +',,,,,,,,,280,,,280,,,280,280,,,280,,280,,,,280,,,,,,,,280,,,,,280,280', +'280,280,,280,280,,,,280,280,,28,28,28,,28,280,,280,28,28,,,,28,,28,28', +'28,28,28,28,28,,,,,,28,28,28,28,28,28,28,,,28,,,,,,,28,,,28,28,28,28', +'28,28,28,28,28,28,28,28,,28,28,28,28,28,,,,,,,,,,,,,,,,,,,,28,,,28,', +',28,28,,,28,,28,,28,,28,,,,,,,,28,,,,,28,28,28,28,,28,28,,,,28,28,,29', +'29,29,,29,28,,28,29,29,,,,29,,29,29,29,29,29,29,29,,,,,,29,29,29,29', +'29,29,29,,,29,,,,,,,29,,,29,29,29,29,29,29,29,29,29,29,29,29,,29,29', +'29,29,29,,,,,,,,,,,,,,,,,,,,29,,,29,,,29,29,,,29,,29,,29,,29,,,,,,,', +'29,,,,,29,29,29,29,,29,29,,,,29,29,,286,286,286,,286,29,,29,286,286', +',,,286,,286,286,286,286,286,286,286,,,,,,286,286,286,286,286,286,286', +',,286,,,,,,,286,,,286,286,286,286,286,286,286,286,,286,286,286,,286', +'286,,,286,716,716,716,716,716,716,716,716,716,716,716,,716,716,,,716', +'716,,286,,,286,,,286,286,,,286,,,716,,716,,716,716,716,716,716,716,716', +',716,,,,286,286,286,286,,286,286,,,,286,286,,716,,286,,,286,,286,578', +'578,578,,578,,,,578,578,,,,578,,578,578,578,578,578,578,578,,,,,,578', +'578,578,578,578,578,578,,,578,,,,,,,578,,,578,578,578,578,578,578,578', +'578,,578,578,578,,578,578,578,578,578,,,,,,,,,,,,,,,,,,,,578,,,578,', +',578,578,,,578,,,,,,578,,,,,,,,578,,,,,578,578,578,578,,578,578,,,,578', +'578,,577,577,577,,577,578,,578,577,577,,,,577,,577,577,577,577,577,577', +'577,,,,,,577,577,577,577,577,577,577,,,577,,,,,,,577,,,577,577,577,577', +'577,577,577,577,,577,577,577,,577,577,577,577,577,,,,,,,,,,,,,,,,,,', +',577,,,577,,,577,577,,,577,,,,,,577,,,,,,,,577,,,,,577,577,577,577,', +'577,577,,,,577,577,,576,576,576,,576,577,,577,576,576,,,,576,,576,576', +'576,576,576,576,576,,,,,,576,576,576,576,576,576,576,,,576,,,,,,,576', +',,576,576,576,576,576,576,576,576,576,576,576,576,,576,576,576,576,576', +',,,,,,,,,,,,,,,,,,,576,,,576,,,576,576,,,576,,,,576,,576,,,,,,,,576', +',,,,576,576,576,576,,576,576,,,,576,576,,575,575,575,,575,576,,576,575', +'575,,,,575,,575,575,575,575,575,575,575,,,,,,575,575,575,575,575,575', +'575,,,575,,,,,,,575,,,575,575,575,575,575,575,575,575,575,575,575,575', +',575,575,575,575,575,,,,,,,,,,,,,,,,,,,,575,,,575,,,575,575,,,575,,575', +',575,,575,,,,,,,,575,,,,,575,575,575,575,,575,575,,,,575,575,,206,206', +'206,,206,575,,575,206,206,,,,206,,206,206,206,206,206,206,206,,,,,,206', +'206,206,206,206,206,206,,,206,,,,,,,206,,,206,206,206,206,206,206,206', +'206,,206,206,206,,206,206,206,206,206,,,,,,,,,,,,,,,,,,,,206,,,206,', +',206,206,,,206,,206,,,,206,,,,,,,,206,,,,,206,206,206,206,,206,206,', +',,206,206,,572,572,572,,572,206,,206,572,572,,,,572,,572,572,572,572', +'572,572,572,,,,,,572,572,572,572,572,572,572,,,572,,,,,,,572,,,572,572', +'572,572,572,572,572,572,,572,572,572,,572,572,572,572,572,,,,,,,,,,', +',,,,,,,,,572,,,572,,,572,572,,,572,,,,,,572,,,,,,,,572,,,,,572,572,572', +'572,,572,572,,,,572,572,,571,571,571,,571,572,,572,571,571,,,,571,,571', +'571,571,571,571,571,571,,,,,,571,571,571,571,571,571,571,,,571,,,,,', +',571,,,571,571,571,571,571,571,571,571,,571,571,571,,571,571,571,571', +'571,,,,,,,,,,,,,,,,,,,,571,,,571,,,571,571,,,571,,571,,,,571,,,,,,,', +'571,,,,,571,571,571,571,,571,571,,,,571,571,,30,30,30,,30,571,,571,30', +'30,,,,30,,30,30,30,30,30,30,30,,,,,,30,30,30,30,30,30,30,,,30,,,,,,', +'30,,,30,30,30,30,30,30,30,30,30,30,30,30,,30,30,30,30,30,,,,,,,,,,,', +',,,,,,,,30,,,30,,,30,30,,,30,,30,,30,,30,,,,,,,,30,,,,,30,30,30,30,', +'30,30,,,,30,30,,205,205,205,,205,30,,30,205,205,,,,205,,205,205,205', +'205,205,205,205,,,,,,205,205,205,205,205,205,205,,,205,,,,,,,205,,,205', +'205,205,205,205,205,205,205,,205,205,205,,205,205,205,205,205,,,,,,', +',,,,,,,,,,,,,205,,,205,,,205,205,,,205,,,,,,205,,,,,,,,205,,,,,205,205', +'205,205,,205,205,,,,205,205,,33,33,33,,33,205,,205,33,33,,,,33,,33,33', +'33,33,33,33,33,,,,,,33,33,33,33,33,33,33,,,33,,,,,,,33,,,33,33,33,33', +'33,33,33,33,,33,33,33,,33,33,,,33,,,,,,,,,,,,,,,,,,,,33,,,33,,,33,33', +',,33,,33,,,,,,,,,,,,,,,,,33,33,33,33,,33,33,,,,33,33,,542,542,542,,542', +'33,,33,542,542,,,,542,,542,542,542,542,542,542,542,,,,,,542,542,542', +'542,542,542,542,,,542,,,,,,,542,,,542,542,542,542,542,542,542,542,,542', +'542,542,,542,542,542,542,542,,,,,,,,,,,,,,,,,,,,542,,,542,,,542,542', +',,542,,,,,,542,,,,,,,,542,,,,,542,542,542,542,,542,542,,,,542,542,,34', +'34,34,,34,542,,542,34,34,,,,34,,34,34,34,34,34,34,34,,,,,,34,34,34,34', +'34,34,34,,,34,,,,,,,34,,,34,34,34,34,34,34,34,34,,34,34,34,,34,34,,', +'34,714,714,714,714,714,714,714,714,714,714,714,,714,714,,,714,714,,34', +',,34,,,34,34,,,34,,,714,,714,,714,714,714,714,714,714,714,,714,,,,34', +'34,34,34,,34,34,,,,34,34,,714,,34,,,34,,34,539,539,539,,539,,,,539,539', +',,,539,,539,539,539,539,539,539,539,,,,,,539,539,539,539,539,539,539', +',,539,,,,,,,539,,,539,539,539,539,539,539,539,539,539,539,539,539,,539', +'539,539,539,539,,,,,,,,,,,,,,,,,,,,539,,,539,,,539,539,,,539,,539,,539', +',539,,,,,,,,539,,,,,539,539,539,539,,539,539,,,,539,539,,874,874,874', +',874,539,,539,874,874,,,,874,,874,874,874,874,874,874,874,,,,,,874,874', +'874,874,874,874,874,,,874,,,,,,,874,,,874,874,874,874,874,874,874,874', +'874,874,874,874,,874,874,874,874,874,,,,,,,,,,,,,,,,,,,,874,,,874,,', +'874,874,,,874,,874,,874,,874,,,,,,,,874,,,,,874,874,874,874,,874,874', +',,,874,874,,65,65,65,,65,874,,874,65,65,,,,65,,65,65,65,65,65,65,65', +',,,,,65,65,65,65,65,65,65,,,65,,,,,,,65,,,65,65,65,65,65,65,65,65,,65', +'65,65,,65,65,,,65,,,,,,,,,,,,,,,,,,,,65,,,65,,,65,65,,,65,,65,,,,,,', +',,,,,,,,,,65,65,65,65,,65,65,,,,65,65,,528,528,528,,528,65,,65,528,528', +',,,528,,528,528,528,528,528,528,528,,,,,,528,528,528,528,528,528,528', +',,528,,,,,,,528,,,528,528,528,528,528,528,528,528,,528,528,528,,528', +'528,528,528,528,,,,,,,,,,,,,,,,,,,,528,,,528,,,528,528,,,528,,528,,', +',528,,,,,,,,528,,,,,528,528,528,528,,528,528,,,,528,528,,202,202,202', +',202,528,,528,202,202,,,,202,,202,202,202,202,202,202,202,,,,,,202,202', +'202,202,202,202,202,,,202,,,,,,,202,,,202,202,202,202,202,202,202,202', +'202,202,202,202,,202,202,202,202,202,,,,,,,,,,,,,,,,,,,,202,,,202,,', +'202,202,,,202,,202,,202,,202,,,,,,,,202,,,,,202,202,202,202,,202,202', +',,,202,202,,5,5,5,5,5,202,,202,5,5,,,,5,,5,5,5,5,5,5,5,,,,,,5,5,5,5', +'5,5,5,,,5,,,,,,5,5,5,5,5,5,5,5,5,5,5,5,,5,5,5,,5,5,5,5,5,,,,,,,,,,,', +',,,,,,,,5,,,5,,,5,5,,,5,,5,,,,5,,,,,,,,5,,,,,5,5,5,5,,5,5,,,,5,5,,303', +'303,303,,303,5,,5,303,303,,,,303,,303,303,303,303,303,303,303,,,,,,303', +'303,303,303,303,303,303,,,303,,,,,,,303,,,303,303,303,303,303,303,303', +'303,,303,303,303,,303,303,,,303,,,,,,,,,,,,,,,,,,,,303,,,303,,,303,303', +',,303,,,,,,,,,,,,,,,,,,,303,303,303,303,,303,303,,,,303,303,,201,201', +'201,,201,303,,303,201,201,,,,201,,201,201,201,201,201,201,201,,,,,,201', +'201,201,201,201,201,201,,,201,,,,,,,201,,,201,201,201,201,201,201,201', +'201,,201,201,201,,201,201,201,201,201,,,,,,,,,,,,,,,,,,,,201,,,201,', +',201,201,,,201,,,,,,201,,,,,,,,201,,,,,201,201,201,201,,201,201,,,,201', +'201,,200,200,200,,200,201,,201,200,200,,,,200,,200,200,200,200,200,200', +'200,,,,,,200,200,200,200,200,200,200,,,200,,,,,,,200,,,200,200,200,200', +'200,200,200,200,,200,200,200,,200,200,200,200,200,,,,,,,,,,,,,,,,,,', +',200,,,200,,,200,200,,,200,,200,,,,200,,,,,,,,200,,,,,200,200,200,200', +',200,200,,,,200,200,,514,514,514,,514,200,,200,514,514,,,,514,,514,514', +'514,514,514,514,514,,,,,,514,514,514,514,514,514,514,,,514,,,,,,,514', +',,514,514,514,514,514,514,514,514,514,514,514,514,,514,514,514,514,514', +',,,,,,,,,,,,,,,,,,,514,,,514,,,514,514,,,514,,,,,,514,,,,,,,,514,,,', +',514,514,514,514,,514,514,,,,514,514,,511,511,511,,511,514,,514,511', +'511,,,,511,,511,511,511,511,511,511,511,,,,,,511,511,511,511,511,511', +'511,,,511,,,,,,,511,,,511,511,511,511,511,511,511,511,511,511,511,511', +',511,511,511,511,511,,,,,,,,,,,,,,,,,,,,511,,,511,,,511,511,,,511,,511', +',,,511,,,,,,,,511,,,,,511,511,511,511,,511,511,,,,511,511,,507,507,507', +',507,511,,511,507,507,,,,507,,507,507,507,507,507,507,507,,,,,,507,507', +'507,507,507,507,507,,,507,,,,,,,507,,,507,507,507,507,507,507,507,507', +',507,507,507,,507,507,507,507,507,,,,,,,,,,,,,,,,,,,,507,,,507,,,507', +'507,,,507,,507,,,,507,,,,,,,,507,,,,,507,507,507,507,,507,507,,,,507', +'507,,505,505,505,,505,507,,507,505,505,,,,505,,505,505,505,505,505,505', +'505,,,,,,505,505,505,505,505,505,505,,,505,,,,,,,505,,,505,505,505,505', +'505,505,505,505,,505,505,505,,505,505,505,505,505,,,,,,,,,,,,,,,,,,', +',505,,,505,,,505,505,,,505,,,,,,505,,,,,,,,505,,,,,505,505,505,505,', +'505,505,,,,505,505,,501,501,501,,501,505,,505,501,501,,,,501,,501,501', +'501,501,501,501,501,,,,,,501,501,501,501,501,501,501,,,501,,,,,,,501', +',,501,501,501,501,501,501,501,501,,501,501,501,,501,501,501,501,501', +',,,,,,,,,,,,,,,,,,,501,,,501,,,501,501,,,501,,,,,,501,,,,,,,,501,,,', +',501,501,501,501,,501,501,,,,501,501,,500,500,500,,500,501,,501,500', +'500,,,,500,,500,500,500,500,500,500,500,,,,,,500,500,500,500,500,500', +'500,,,500,,,,,,,500,,,500,500,500,500,500,500,500,500,,500,500,500,', +'500,500,500,500,500,,,,,,,,,,,,,,,,,,,,500,,,500,,,500,500,,,500,,,', +',,500,,,,,,,,500,,,,,500,500,500,500,,500,500,,,,500,500,,499,499,499', +',499,500,,500,499,499,,,,499,,499,499,499,499,499,499,499,,,,,,499,499', +'499,499,499,499,499,,,499,,,,,,,499,,,499,499,499,499,499,499,499,499', +',499,499,499,,499,499,499,499,499,,,,,,,,,,,,,,,,,,,,499,,,499,,,499', +'499,,,499,,,,,,499,,,,,,,,499,,,,,499,499,499,499,,499,499,,,,499,499', +',529,529,529,,529,499,,499,529,529,,,,529,,529,529,529,529,529,529,529', +',,,,,529,529,529,529,529,529,529,,,529,,,,,,,529,,,529,529,529,529,529', +'529,529,529,529,529,529,529,,529,529,529,529,529,,,,,,,,,,,,,,,,,,,', +'529,,,529,,,529,529,,,529,,529,,529,,529,,,,,,,,529,,,,,529,529,529', +'529,,529,529,,,,529,529,,64,64,64,,64,529,,529,64,64,,,,64,,64,64,64', +'64,64,64,64,,,,,,64,64,64,64,64,64,64,,,64,,,,,,,64,,,64,64,64,64,64', +'64,64,64,,64,64,64,,64,64,64,64,64,721,721,721,721,721,721,721,721,721', +'721,721,,721,721,,,721,721,,64,,,64,,,64,64,,,64,,,721,,721,64,721,721', +'721,721,721,721,721,64,721,,,,64,64,64,64,,64,64,,,,64,64,64,721,,,', +'64,64,,64,61,61,61,,61,,,,61,61,,,,61,,61,61,61,61,61,61,61,,,,,,61', +'61,61,61,61,61,61,,,61,,,,,,,61,,,61,61,61,61,61,61,61,61,,61,61,61', +',61,61,61,61,61,,,,,,,,,,,,,,,,,,,,61,,,61,,,61,61,,,61,,,,,,61,,,,', +',,,61,,,,,61,61,61,61,,61,61,,,,61,61,,364,364,364,,364,61,,61,364,364', +',,,364,,364,364,364,364,364,364,364,,,,,,364,364,364,364,364,364,364', +',,364,,,,,,,364,,,364,364,364,364,364,364,364,364,,364,364,364,,364', +'364,364,364,364,,,,,,,,,,,,,,,,,,,,364,,,364,,,364,364,,,364,,,,,,364', +',,,,,,,364,,,,,364,364,364,364,,364,364,,,,364,364,,390,390,390,,390', +'364,,364,390,390,,,,390,,390,390,390,390,390,390,390,,,,,,390,390,390', +'390,390,390,390,,,390,,,,,,,390,,,390,390,390,390,390,390,390,390,,390', +'390,390,,390,390,390,390,390,,,,,,,,,,,,,,,,,,,,390,,,390,,,390,390', +',,390,,,,,,390,,,,,,,,390,,,,,390,390,390,390,,390,390,,,,390,390,,60', +'60,60,,60,390,,390,60,60,,,,60,,60,60,60,60,60,60,60,,,,,,60,60,60,60', +'60,60,60,,,60,,,,,,,60,,,60,60,60,60,60,60,60,60,,60,60,60,,60,60,60', +'60,60,,,,,,,,,,,,,,,,,,,,60,,,60,,,60,60,,,60,,,,,,60,,,,,,,,60,,,,', +'60,60,60,60,,60,60,,,,60,60,,57,57,57,,57,60,,60,57,57,,,,57,,57,57', +'57,57,57,57,57,,,,,,57,57,57,57,57,57,57,,,57,,,,,,,57,,,57,57,57,57', +'57,57,57,57,57,57,57,57,,57,57,57,57,57,,,,,,,,,,,,,,,,,,,,57,,,57,', +',57,57,,,57,,,,,,57,,,,,,,,57,,,,,57,57,57,57,,57,57,,,,57,57,,234,234', +'234,,234,57,,57,234,234,,,,234,,234,234,234,234,234,234,234,,,,,,234', +'234,234,234,234,234,234,,,234,,,,,,,234,,,234,234,234,234,234,234,234', +'234,,234,234,234,,234,234,234,234,234,,,,,,,,,,,,,,,,,,,,234,,,234,', +',234,234,,,234,,,,,,234,,,,,,,,234,,,,,234,234,234,234,,234,234,,,,234', +'234,,237,237,237,,237,234,,234,237,237,,,,237,,237,237,237,237,237,237', +'237,,,,,,237,237,237,237,237,237,237,,,237,,,,,,,237,,,237,237,237,237', +'237,237,237,237,,237,237,237,,237,237,237,237,237,,,,,,,,,,,,,,,,,,', +',237,,,237,,,237,237,,,237,,,,,,237,,,,,,,,237,,,,,237,237,237,237,', +'237,237,,,,237,237,,233,233,233,,233,237,,237,233,233,,,,233,,233,233', +'233,233,233,233,233,,,,,,233,233,233,233,233,233,233,,,233,,,,,,,233', +',,233,233,233,233,233,233,233,233,,233,233,233,,233,233,233,233,233', +',,,,,,,,,,,,,,,,,,,233,,,233,,,233,233,,,233,,,,,,233,,,,,,,,233,,,', +',233,233,233,233,,233,233,,,,233,233,,232,232,232,,232,233,,233,232', +'232,,,,232,,232,232,232,232,232,232,232,,,,,,232,232,232,232,232,232', +'232,,,232,,,,,,,232,,,232,232,232,232,232,232,232,232,,232,232,232,', +'232,232,232,232,232,,,,,,,,,,,,,,,,,,,,232,,,232,,,232,232,,,232,,,', +',,232,,,,,,,,232,,,,,232,232,232,232,,232,232,,,,232,232,,238,238,238', +',238,232,,232,238,238,,,,238,,238,238,238,238,238,238,238,,,,,,238,238', +'238,238,238,238,238,,,238,,,,,,,238,,,238,238,238,238,238,238,238,238', +',238,238,238,,238,238,238,238,238,,,,,,,,,,,,,,,,,,,,238,,,238,,,238', +'238,,,238,,,,,,238,,,,,,,,238,,,,,238,238,238,238,,238,238,,,,238,238', +',708,708,708,,708,238,,238,708,708,,,,708,,708,708,708,708,708,708,708', +',,,,,708,708,708,708,708,708,708,,,708,,,,,,,708,,,708,708,708,708,708', +'708,708,708,,708,708,708,,708,708,708,708,708,,,,,,,,,,,,,,,,,,,,708', +',,708,,,708,708,,,708,,,,,,708,,,,,,,,708,,,,,708,708,708,708,,708,708', +',,,708,708,,231,231,231,,231,708,,708,231,231,,,,231,,231,231,231,231', +'231,231,231,,,,,,231,231,231,231,231,231,231,,,231,,,,,,,231,,,231,231', +'231,231,231,231,231,231,,231,231,231,,231,231,231,231,231,,,,,,,,,,', +',,,,,,,,,231,,,231,,,231,231,,,231,,,,,,231,,,,,,,,231,,,,,231,231,231', +'231,,231,231,,,,231,231,,710,710,710,,710,231,,231,710,710,,,,710,,710', +'710,710,710,710,710,710,,,,,,710,710,710,710,710,710,710,,,710,,,,,', +',710,,,710,710,710,710,710,710,710,710,,710,710,710,,710,710,710,710', +'710,,,,,,,,,,,,,,,,,,,,710,,,710,,,710,710,,,710,,,,,,710,,,,,,,,710', +',,,,710,710,710,710,,710,710,,,,710,710,,239,239,239,,239,710,,710,239', +'239,,,,239,,239,239,239,239,239,239,239,,,,,,239,239,239,239,239,239', +'239,,,239,,,,,,,239,,,239,239,239,239,239,239,239,239,,239,239,239,', +'239,239,239,239,239,,,,,,,,,,,,,,,,,,,,239,,,239,,,239,239,,,239,,,', +',,239,,,,,,,,239,,,,,239,239,239,239,,239,239,,,,239,239,,230,230,230', +',230,239,,239,230,230,,,,230,,230,230,230,230,230,230,230,,,,,,230,230', +'230,230,230,230,230,,,230,,,,,,,230,,,230,230,230,230,230,230,230,230', +',230,230,230,,230,230,230,230,230,,,,,,,,,,,,,,,,,,,,230,,,230,,,230', +'230,,,230,,,,,,230,,,,,,,,230,,,,,230,230,230,230,,230,230,,,,230,230', +',229,229,229,,229,230,,230,229,229,,,,229,,229,229,229,229,229,229,229', +',,,,,229,229,229,229,229,229,229,,,229,,,,,,,229,,,229,229,229,229,229', +'229,229,229,,229,229,229,,229,229,229,229,229,,,,,,,,,,,,,,,,,,,,229', +',,229,,,229,229,,,229,,,,,,229,,,,,,,,229,,,,,229,229,229,229,,229,229', +',,,229,229,,228,228,228,,228,229,,229,228,228,,,,228,,228,228,228,228', +'228,228,228,,,,,,228,228,228,228,228,228,228,,,228,,,,,,,228,,,228,228', +'228,228,228,228,228,228,,228,228,228,,228,228,228,228,228,,,,,,,,,,', +',,,,,,,,,228,,,228,,,228,228,,,228,,,,,,228,,,,,,,,228,,,,,228,228,228', +'228,,228,228,,,,228,228,,227,227,227,,227,228,,228,227,227,,,,227,,227', +'227,227,227,227,227,227,,,,,,227,227,227,227,227,227,227,,,227,,,,,', +',227,,,227,227,227,227,227,227,227,227,,227,227,227,,227,227,227,227', +'227,,,,,,,,,,,,,,,,,,,,227,,,227,,,227,227,,,227,,,,,,227,,,,,,,,227', +',,,,227,227,227,227,,227,227,,,,227,227,,226,226,226,,226,227,,227,226', +'226,,,,226,,226,226,226,226,226,226,226,,,,,,226,226,226,226,226,226', +'226,,,226,,,,,,,226,,,226,226,226,226,226,226,226,226,,226,226,226,', +'226,226,226,226,226,,,,,,,,,,,,,,,,,,,,226,,,226,,,226,226,,,226,,,', +',,226,,,,,,,,226,,,,,226,226,226,226,,226,226,,,,226,226,,724,724,724', +',724,226,,226,724,724,,,,724,,724,724,724,724,724,724,724,,,,,,724,724', +'724,724,724,724,724,,,724,,,,,,,724,,,724,724,724,724,724,724,724,724', +',724,724,724,,724,724,724,724,724,,,,,,,,,,,,,,,,,,,,724,,,724,,,724', +'724,,,724,,,,,,724,,,,,,,,724,,,,,724,724,724,724,,724,724,,,,724,724', +',725,725,725,,725,724,,724,725,725,,,,725,,725,725,725,725,725,725,725', +',,,,,725,725,725,725,725,725,725,,,725,,,,,,,725,,,725,725,725,725,725', +'725,725,725,,725,725,725,,725,725,725,725,725,,,,,,,,,,,,,,,,,,,,725', +',,725,,,725,725,,,725,,,,,,725,,,,,,,,725,,,,,725,725,725,725,,725,725', +',,,725,725,,726,726,726,,726,725,,725,726,726,,,,726,,726,726,726,726', +'726,726,726,,,,,,726,726,726,726,726,726,726,,,726,,,,,,,726,,,726,726', +'726,726,726,726,726,726,,726,726,726,,726,726,726,726,726,,,,,,,,,,', +',,,,,,,,,726,,,726,,,726,726,,,726,,,,,,726,,,,,,,,726,,,,,726,726,726', +'726,,726,726,,,,726,726,,727,727,727,,727,726,,726,727,727,,,,727,,727', +'727,727,727,727,727,727,,,,,,727,727,727,727,727,727,727,,,727,,,,,', +',727,,,727,727,727,727,727,727,727,727,,727,727,727,,727,727,727,727', +'727,,,,,,,,,,,,,,,,,,,,727,,,727,,,727,727,,,727,,,,,,727,,,,,,,,727', +',,,,727,727,727,727,,727,727,,,,727,727,,225,225,225,,225,727,,727,225', +'225,,,,225,,225,225,225,225,225,225,225,,,,,,225,225,225,225,225,225', +'225,,,225,,,,,,,225,,,225,225,225,225,225,225,225,225,,225,225,225,', +'225,225,225,225,225,,,,,,,,,,,,,,,,,,,,225,,,225,,,225,225,,,225,,,', +',,225,,,,,,,,225,,,,,225,225,225,225,,225,225,,,,225,225,,729,729,729', +',729,225,,225,729,729,,,,729,,729,729,729,729,729,729,729,,,,,,729,729', +'729,729,729,729,729,,,729,,,,,,,729,,,729,729,729,729,729,729,729,729', +',729,729,729,,729,729,729,729,729,,,,,,,,,,,,,,,,,,,,729,,,729,,,729', +'729,,,729,,,,,,729,,,,,,,,729,,,,,729,729,729,729,,729,729,,,,729,729', +',240,240,240,,240,729,,729,240,240,,,,240,,240,240,240,240,240,240,240', +',,,,,240,240,240,240,240,240,240,,,240,,,,,,,240,,,240,240,240,240,240', +'240,240,240,,240,240,240,,240,240,240,240,240,,,,,,,,,,,,,,,,,,,,240', +',,240,,,240,240,,,240,,,,,,240,,,,,,,,240,,,,,240,240,240,240,,240,240', +',,,240,240,,241,241,241,,241,240,,240,241,241,,,,241,,241,241,241,241', +'241,241,241,,,,,,241,241,241,241,241,241,241,,,241,,,,,,,241,,,241,241', +'241,241,241,241,241,241,,241,241,241,,241,241,241,241,241,,,,,,,,,,', +',,,,,,,,,241,,,241,,,241,241,,,241,,,,,,241,,,,,,,,241,,,,,241,241,241', +'241,,241,241,,,,241,241,,242,242,242,,242,241,,241,242,242,,,,242,,242', +'242,242,242,242,242,242,,,,,,242,242,242,242,242,242,242,,,242,,,,,', +',242,,,242,242,242,242,242,242,242,242,,242,242,242,,242,242,242,242', +'242,,,,,,,,,,,,,,,,,,,,242,,,242,,,242,242,,,242,,,,,,242,,,,,,,,242', +',,,,242,242,242,242,,242,242,,,,242,242,,243,243,243,,243,242,,242,243', +'243,,,,243,,243,243,243,243,243,243,243,,,,,,243,243,243,243,243,243', +'243,,,243,,,,,,,243,,,243,243,243,243,243,243,243,243,,243,243,243,', +'243,243,243,243,243,,,,,,,,,,,,,,,,,,,,243,,,243,,,243,243,,,243,,,', +',,243,,,,,,,,243,,,,,243,243,243,243,,243,243,,,,243,243,,244,244,244', +',244,243,,243,244,244,,,,244,,244,244,244,244,244,244,244,,,,,,244,244', +'244,244,244,244,244,,,244,,,,,,,244,,,244,244,244,244,244,244,244,244', +',244,244,244,,244,244,244,244,244,,,,,,,,,,,,,,,,,,,,244,,,244,,,244', +'244,,,244,,,,,,244,,,,,,,,244,,,,,244,244,244,244,,244,244,,,,244,244', +',224,224,224,,224,244,,244,224,224,,,,224,,224,224,224,224,224,224,224', +',,,,,224,224,224,224,224,224,224,,,224,,,,,,,224,,,224,224,224,224,224', +'224,224,224,,224,224,224,,224,224,224,224,224,,,,,,,,,,,,,,,,,,,,224', +',,224,,,224,224,,,224,,,,,,224,,,,,,,,224,,,,,224,224,224,224,,224,224', +',,,224,224,,245,245,245,,245,224,,224,245,245,,,,245,,245,245,245,245', +'245,245,245,,,,,,245,245,245,245,245,245,245,,,245,,,,,,,245,,,245,245', +'245,245,245,245,245,245,,245,245,245,,245,245,245,245,245,,,,,,,,,,', +',,,,,,,,,245,,,245,,,245,245,,,245,,,,,,245,,,,,,,,245,,,,,245,245,245', +'245,,245,245,,,,245,245,,246,246,246,,246,245,,245,246,246,,,,246,,246', +'246,246,246,246,246,246,,,,,,246,246,246,246,246,246,246,,,246,,,,,', +',246,,,246,246,246,246,246,246,246,246,,246,246,246,,246,246,246,246', +'246,,,,,,,,,,,,,,,,,,,,246,,,246,,,246,246,,,246,,,,,,246,,,,,,,,246', +',,,,246,246,246,246,,246,246,,,,246,246,,247,247,247,,247,246,,246,247', +'247,,,,247,,247,247,247,247,247,247,247,,,,,,247,247,247,247,247,247', +'247,,,247,,,,,,,247,,,247,247,247,247,247,247,247,247,,247,247,247,', +'247,247,247,247,247,,,,,,,,,,,,,,,,,,,,247,,,247,,,247,247,,,247,,,', +',,247,,,,,,,,247,,,,,247,247,247,247,,247,247,,,,247,247,,248,248,248', +',248,247,,247,248,248,,,,248,,248,248,248,248,248,248,248,,,,,,248,248', +'248,248,248,248,248,,,248,,,,,,,248,,,248,248,248,248,248,248,248,248', +',248,248,248,,248,248,248,248,248,,,,,,,,,,,,,,,,,,,,248,,,248,,,248', +'248,,,248,,,,,,248,,,,,,,,248,,,,,248,248,248,248,,248,248,,,,248,248', +',249,249,249,,249,248,,248,249,249,,,,249,,249,249,249,249,249,249,249', +',,,,,249,249,249,249,249,249,249,,,249,,,,,,,249,,,249,249,249,249,249', +'249,249,249,,249,249,249,,249,249,249,249,249,,,,,,,,,,,,,,,,,,,,249', +',,249,,,249,249,,,249,,,,,,249,,,,,,,,249,,,,,249,249,249,249,,249,249', +',,,249,249,,754,754,754,,754,249,,249,754,754,,,,754,,754,754,754,754', +'754,754,754,,,,,,754,754,754,754,754,754,754,,,754,,,,,,,754,,,754,754', +'754,754,754,754,754,754,,754,754,754,,754,754,,,754,,,,,,,,,,,,,,,,', +',,,754,,,754,,,754,754,,,754,,,,,,,,,,,,,,,,,,,754,754,754,754,,754', +'754,,,,754,754,,41,41,41,,41,754,,754,41,41,,,,41,,41,41,41,41,41,41', +'41,,,,,,41,41,41,41,41,41,41,,,41,,,,,,,41,,,41,41,41,41,41,41,41,41', +',41,41,41,,41,41,41,41,41,,,,,,,,,,,,,,,,,,,,41,,,41,,,41,41,,,41,,', +',,,41,,,,,,,,41,,,,,41,41,41,41,,41,41,,,,41,41,,112,112,112,,112,41', +',41,112,112,,,,112,,112,112,112,112,112,112,112,,,,,,112,112,112,112', +'112,112,112,,,112,,,,,,,112,,,112,112,112,112,112,112,112,112,,112,112', +'112,,112,112,112,112,112,,,,,,,,,,,,,,,,,,,,112,,,112,,,112,112,,,112', +',,,,,112,,,,,,,,112,,,,,112,112,112,112,,112,112,,,,112,112,,480,480', +'480,480,480,112,,112,480,480,,,,480,,480,480,480,480,480,480,480,,,', +',,480,480,480,480,480,480,480,,,480,,,,,,480,480,,480,480,480,480,480', +'480,480,480,480,,480,480,480,,480,480,480,480,480,719,719,719,719,719', +'719,719,719,719,719,719,,719,719,,,719,719,,480,,,480,,,480,480,,,480', +',480,719,,719,480,719,719,719,719,719,719,719,480,719,,,,480,480,480', +'480,,480,480,,,,480,480,,719,,,,480,480,,480,315,315,315,,315,,,,315', +'315,,,,315,,315,315,315,315,315,315,315,,,,,,315,315,315,315,315,315', +'315,,,315,,,,,,,315,,,315,315,315,315,315,315,315,315,,315,315,315,', +'315,315,315,315,315,,,,,,,,,,,,,,,,,,,,315,,,315,,,315,315,,,315,,,', +',,315,,,,,,,,315,,,,,315,315,315,315,,315,315,,,,315,315,,476,476,476', +',476,315,,315,476,476,,,,476,,476,476,476,476,476,476,476,,,,,,476,476', +'476,476,476,476,476,,,476,,,,,,,476,,,476,476,476,476,476,476,476,476', +',476,476,476,,476,476,476,476,476,,,,,,,,,,,,,,,,,,,,476,,,476,,,476', +'476,,,476,,,,,,476,,,,,,,,476,,,,,476,476,476,476,,476,476,,,,476,476', +',474,474,474,,474,476,,476,474,474,,,,474,,474,474,474,474,474,474,474', +',,,,,474,474,474,474,474,474,474,,,474,,,,,,,474,,,474,474,474,474,474', +'474,474,474,474,474,474,474,,474,474,474,474,474,,,,,,,,,,,,,,,,,,,', +'474,,,474,,,474,474,,,474,,,,474,,474,,,,,,,,474,,,,,474,474,474,474', +',474,474,,,,474,474,,42,42,42,,42,474,,474,42,42,,,,42,,42,42,42,42', +'42,42,42,,,,,,42,42,42,42,42,42,42,,,42,,,,,,,42,,,42,42,42,42,42,42', +'42,42,,42,42,42,,42,42,42,42,42,,,,,,,,,,,,,,,,,,,,42,,,42,,,42,42,', +',42,,,,,,42,,,,,,,,42,,,,,42,42,42,42,,42,42,,,,42,42,,43,43,43,,43', +'42,,42,43,43,,,,43,,43,43,43,43,43,43,43,,,,,,43,43,43,43,43,43,43,', +',43,,,,,,,43,,,43,43,43,43,43,43,43,43,,43,43,43,,43,43,43,43,43,,,', +',,,,,,,,,,,,,,,,43,,,43,,,43,43,,,43,,,,,,43,,,,,,,,43,,,,,43,43,43', +'43,,43,43,,,,43,43,,472,472,472,,472,43,,43,472,472,,,,472,,472,472', +'472,472,472,472,472,,,,,,472,472,472,472,472,472,472,,,472,,,,,,,472', +',,472,472,472,472,472,472,472,472,472,472,472,472,,472,472,472,472,472', +',,,,,,,,,,,,,,,,,,,472,,,472,,,472,472,,,472,,472,,472,,472,,,,,,,,472', +',,,,472,472,472,472,,472,472,,,,472,472,,111,111,111,,111,472,,472,111', +'111,,,,111,,111,111,111,111,111,111,111,,,,,,111,111,111,111,111,111', +'111,,,111,,,,,,,111,,,111,111,111,111,111,111,111,111,,111,111,111,', +'111,111,111,111,111,,,,,,,,,,,,,,,,,,,,111,,,111,,,111,111,,,111,,,', +',,111,,,,,,,,111,,,,,111,111,111,111,,111,111,,,,111,111,,110,110,110', +',110,111,,111,110,110,,,,110,,110,110,110,110,110,110,110,,,,,,110,110', +'110,110,110,110,110,,,110,,,,,,,110,,,110,110,110,110,110,110,110,110', +',110,110,110,,110,110,110,110,110,,,,,,,,,,,,,,,,,,,,110,,,110,,,110', +'110,,,110,,,,,,110,,,,,,,,110,,,,,110,110,110,110,,110,110,,,,110,110', +',105,105,105,105,105,110,,110,105,105,,,,105,,105,105,105,105,105,105', +'105,,,,,,105,105,105,105,105,105,105,,,105,,,,,,105,105,105,105,105', +'105,105,105,105,105,105,105,,105,105,105,,105,105,105,105,105,709,709', +'709,709,709,709,709,709,709,709,709,,709,709,,,709,709,,105,,,105,,', +'105,105,,,105,,105,709,,709,105,709,709,709,709,709,709,709,105,709', +',,,105,105,105,105,,105,105,,,,105,105,,709,,,,105,105,,105,328,328', +'328,,328,,,,328,328,,,,328,,328,328,328,328,328,328,328,,,,,,328,328', +'328,328,328,328,328,,,328,,,,,,,328,,,328,328,328,328,328,328,328,328', +',328,328,328,,328,328,328,328,328,,,,,,,,,,,,,,,,,,,,328,,,328,,,328', +'328,,,328,,,,,,328,,,,,,,,328,,,,,328,328,328,328,,328,328,,,,328,328', +',329,329,329,,329,328,,328,329,329,,,,329,,329,329,329,329,329,329,329', +',,,,,329,329,329,329,329,329,329,,,329,,,,,,,329,,,329,329,329,329,329', +'329,329,329,,329,329,329,,329,329,329,329,329,,,,,,,,,,,,,,,,,,,,329', +',,329,,,329,329,,,329,,,,,,329,,,,,,,,329,,,,,329,329,329,329,,329,329', +',,,329,329,,236,236,236,,236,329,,329,236,236,,,,236,,236,236,236,236', +'236,236,236,,,,,,236,236,236,236,236,236,236,,,236,,,,,,,236,,,236,236', +'236,236,236,236,236,236,,236,236,236,,236,236,236,236,236,,,,,,,,,,', +',,,,,,,,,236,,,236,,,236,236,,,236,,,,,,236,,,,,,,,236,,,,,236,236,236', +'236,,236,236,,,,236,236,,431,431,431,,431,236,,236,431,431,,,,431,,431', +'431,431,431,431,431,431,,,,,,431,431,431,431,431,431,431,,,431,,,,,', +',431,,,431,431,431,431,431,431,431,431,,431,431,431,,431,431,431,431', +'431,,,,,,,,,,,,,,,,,,,,431,,,431,,,431,431,,,431,,,,,,431,,,,,,,,431', +',,,,431,431,431,431,,431,431,,,,431,431,,56,56,56,,56,431,,431,56,56', +',,,56,,56,56,56,56,56,56,56,,,,,,56,56,56,56,56,56,56,,,56,,,,,,,56', +',,56,56,56,56,56,56,56,56,56,56,56,56,,56,56,56,56,56,,,,,,,,,,,,,,', +',,,,,56,,,56,,,56,56,,,56,,56,,,,56,,,,,,,,56,,,,,56,56,56,56,,56,56', +',,,56,56,,430,430,430,,430,56,,56,430,430,,,,430,,430,430,430,430,430', +'430,430,,,,,,430,430,430,430,430,430,430,,,430,,,,,,,430,,,430,430,430', +'430,430,430,430,430,,430,430,430,,430,430,430,430,430,,,,,,,,,,,,,,', +',,,,,430,,,430,,,430,430,,,430,,,,,,430,,,,,,,,430,,,,,430,430,430,430', +',430,430,,,,430,430,,429,429,429,,429,430,,430,429,429,,,,429,,429,429', +'429,429,429,429,429,,,,,,429,429,429,429,429,429,429,,,429,,,,,,,429', +',,429,429,429,429,429,429,429,429,,429,429,429,,429,429,429,429,429', +',,,,,,,,,,,,,,,,,,,429,,,429,,,429,429,,,429,,,,,,429,,,,,,,,429,,,', +',429,429,429,429,,429,429,,,,429,429,,427,427,427,,427,429,,429,427', +'427,,,,427,,427,427,427,427,427,427,427,,,,,,427,427,427,427,427,427', +'427,,,427,,,,,,,427,,,427,427,427,427,427,427,427,427,427,427,427,427', +',427,427,427,427,427,,,,,,,,,,,,,,,,,,,,427,,,427,,,427,427,,,427,,427', +',427,,427,,,,,,,,427,,,,,427,427,427,427,,427,427,,,,427,427,,348,348', +'348,,348,427,,427,348,348,,,,348,,348,348,348,348,348,348,348,,,,,,348', +'348,348,348,348,348,348,,,348,,,,,,,348,,,348,348,348,348,348,348,348', +'348,,348,348,348,,348,348,348,348,348,,,,,,,,,,,,,,,,,,,,348,,,348,', +',348,348,,,348,,,,,,348,,,,,,,,348,,,,,348,348,348,348,,348,348,,,,348', +'348,,67,67,67,,67,348,,348,67,67,,,,67,,67,67,67,67,67,67,67,,,,,,67', +'67,67,67,67,67,67,,,67,,,,,,,67,,,67,67,67,67,67,67,67,67,,67,67,67', +',67,67,,,67,,,,,,,,,,,,,,,,,,,,67,,,67,,,67,67,,,67,,,,,,,,,,,,,,,,', +',,67,67,67,67,,67,67,,,,67,67,,66,66,66,,66,67,,67,66,66,,,,66,,66,66', +'66,66,66,66,66,,,,,,66,66,66,66,66,66,66,,,66,,,,,,,66,,,66,66,66,66', +'66,66,66,66,,66,66,66,,66,66,,,66,,,,,,,,,,,,,,,,,66,,,66,,,66,,,66', +'66,,,66,,,,,,,,,,,,,,,,,,,66,66,66,66,,66,66,,,,66,66,,496,496,496,', +'496,66,,66,496,496,,,,496,,496,496,496,496,496,496,496,,,,,,496,496', +'496,496,496,496,496,,,496,,,,,,,496,,,496,496,496,496,496,496,496,496', +',496,496,496,,496,496,,,496,,,,,,,,,,,,,,,,,,,,496,,,496,,,496,496,', +',496,,,,,,,,,,,,,,,,,,,496,496,496,496,,496,496,,,,496,496,,489,489', +'489,,489,496,,496,489,489,,,,489,,489,489,489,489,489,489,489,,,,,,489', +'489,489,489,489,489,489,,,489,,,,,,,489,,,489,489,489,489,489,489,489', +'489,489,489,489,489,,489,489,489,489,489,,,,,,,,,,,,,,,,,,,,489,,,489', +',,489,489,,,489,,489,,489,,489,,,,,,,,489,,,,,489,489,489,489,,489,489', +',,,489,489,,487,487,487,,487,489,,489,487,487,,,,487,,487,487,487,487', +'487,487,487,,,,,,487,487,487,487,487,487,487,,,487,,,,,,,487,,,487,487', +'487,487,487,487,487,487,,487,487,487,,487,487,,,487,,,,,,,,,,,,,,,,', +',,,487,,,487,,,487,487,,,487,,,,,,,,,,,,,,,,,,,487,487,487,487,,487', +'487,,,,487,487,,312,312,312,,312,487,,487,312,312,,,,312,,312,312,312', +'312,312,312,312,,,,,,312,312,312,312,312,312,312,,,312,,,,,,,312,,,312', +'312,312,312,312,312,312,312,,312,312,312,,312,312,312,312,312,,,,,,', +',,,,,,,,,,,,,312,,,312,312,,312,312,,,312,,,,,,312,,,,,,,,312,,,,,312', +'312,312,312,,312,312,,,,312,312,,114,114,114,114,114,312,,312,114,114', +',,,114,,114,114,114,114,114,114,114,,,,,,114,114,114,114,114,114,114', +',,114,,,,,,114,114,,114,114,114,114,114,114,114,114,114,,114,114,114', +',114,114,114,114,114,,,,,,,,,,,,,,,,,,,,114,,,114,,,114,114,,,114,,114', +',,,114,,,,,,,,114,,,,,114,114,114,114,,114,114,,,,114,114,,113,113,113', +',113,114,,114,113,113,,,,113,,113,113,113,113,113,113,113,,,,,,113,113', +'113,113,113,113,113,,,113,,,,,,,113,,,113,113,113,113,113,113,113,113', +',113,113,113,,113,113,113,113,113,457,457,457,457,457,457,457,457,457', +'457,457,,457,457,,,457,457,,113,,,113,,,113,113,,,113,,,457,,457,113', +'457,457,457,457,457,457,457,113,457,,,,113,113,113,113,,113,113,,,,113', +'113,457,457,462,,,,113,,113,462,462,462,,,462,462,462,,462,,,,,,,,,', +'462,,,,,,,,,,462,462,,462,462,462,462,462,,,,,,,,,,,,459,,,,,,,459,459', +'459,,,459,459,459,,459,,,,,,462,,,,459,,,462,,,,,462,462,459,459,,459', +'459,459,459,459,,,,,,,,,,,,,,462,,,,,,,,,400,,,,,462,,400,400,400,462', +'459,400,400,400,,400,,459,,,,,459,459,400,400,400,,,,,,,,,400,400,,400', +'400,400,400,400,,,459,,,,,,,,,,,,,,459,,,,,459,400,400,400,400,400,400', +'400,400,400,400,400,400,400,400,,,400,400,400,,,400,,400,400,,,400,400', +',400,,400,,400,,400,400,400,400,400,400,400,27,400,400,400,,,,27,27', +'27,,,27,27,27,,27,400,400,,400,,400,,,,27,27,,,,,,,,,27,27,,27,27,27', +'27,27,,,,,,,,,,,,,,,,,,,,,,,27,27,27,27,27,27,27,27,27,27,27,27,27,27', +',,27,27,27,,,27,,27,27,,,27,27,,27,,27,,27,,27,27,27,27,27,27,27,26', +'27,,27,,,,26,26,26,,,26,26,26,,26,27,27,,27,,27,,,26,26,26,,,,,,,,,26', +'26,,26,26,26,26,26,,,,,,,,,,,,,,,,,,,,,,,26,26,26,26,26,26,26,26,26', +'26,26,26,26,26,,,26,26,26,,,26,,26,26,,,26,26,,26,,26,,26,,26,26,26', +'26,26,26,26,,26,26,26,,,,,,,,,,,,,,26,26,,26,,26,8,8,8,8,8,8,8,8,8,8', +'8,8,8,8,8,8,8,8,8,8,8,8,8,8,,,,8,8,8,8,8,8,8,8,8,8,,,,,,8,8,8,8,8,8', +'8,8,8,8,,8,,,,,,,,8,8,,8,8,8,8,8,8,8,,,8,8,,,,8,8,8,8,,,,,,,,,,,,,,8', +'8,,8,8,8,8,8,8,8,8,8,8,8,,,8,8,,,,,,,,,,,8,9,9,9,9,9,9,9,9,9,9,9,9,9', +'9,9,9,9,9,9,9,9,9,9,9,,,,9,9,9,9,9,9,9,9,9,9,,,,,,9,9,9,9,9,9,9,9,9', +',,9,,,,,,,,9,9,,9,9,9,9,9,9,9,,,9,9,,,,9,9,9,9,,,,,,,,,,,,,,9,9,,9,9', +'9,9,9,9,9,9,9,9,9,,,9,9,,,,,,,,,,,9,568,568,568,568,568,568,568,568', +'568,568,568,568,568,568,568,568,568,568,568,568,568,568,568,568,,,,568', +'568,568,568,568,568,568,568,568,568,,,,,,568,568,568,568,568,568,568', +'568,568,,,568,,,,,,,,568,568,,568,568,568,568,568,568,568,,,568,568', +',,,568,568,568,568,,,,,,,,,,,,,,568,568,,568,568,568,568,568,568,568', +'568,568,568,568,,,568,568,,,,,,,,,,,568,381,381,381,381,381,381,381', +'381,381,381,381,381,381,381,381,381,381,381,381,381,381,381,381,381', +',,,381,381,381,381,381,381,381,381,381,381,,,,,,381,381,381,381,381', +'381,381,381,381,,,381,,,,,,,,381,381,,381,381,381,381,381,381,381,,', +'381,381,,,,381,381,381,381,,,,,,,,,,,,,,381,381,,381,381,381,381,381', +'381,381,381,381,381,381,,,381,381,,,,,,,,,,,381,694,694,694,694,694', +'694,694,694,694,694,694,694,694,694,694,694,694,694,694,694,694,694', +'694,694,,,,694,694,694,694,694,694,694,694,694,694,,,,,,694,694,694', +'694,694,694,694,694,694,,,694,,,,,,,,694,694,,694,694,694,694,694,694', +'694,,,694,694,,,,694,694,694,694,,,,,,,,,,,,,,694,694,,694,694,694,694', +'694,694,694,694,694,694,694,,,694,68,68,68,68,68,68,68,68,68,68,68,68', +'68,68,68,68,68,68,68,68,68,68,68,68,,,,68,68,68,68,68,68,68,68,68,68', +',,,,,68,68,68,68,68,68,68,68,68,68,68,68,,68,,,,,,68,68,,68,68,68,68', +'68,68,68,,,68,68,,,,68,68,68,68,,,,,,68,,,,,,,,68,68,,68,68,68,68,68', +'68,68,68,68,68,68,531,531,68,,531,,,,,,,,531,531,,531,531,531,531,531', +'531,531,,,531,531,,,,531,531,531,531,,,,,,531,,,,,,,,531,531,,531,531', +'531,531,531,531,531,531,531,531,531,503,503,531,,503,,,,,,,,503,503', +',503,503,503,503,503,503,503,,,503,503,,,,503,503,503,503,,,,,,503,', +',,,,,,503,503,,503,503,503,503,503,503,503,503,503,503,503,502,502,503', +',502,,,,,,,,502,502,,502,502,502,502,502,502,502,,,502,502,,,,502,502', +'502,502,,,,,,502,,,,,,,,502,502,,502,502,502,502,502,502,502,502,502', +'502,502,913,913,502,,913,,,,,,,,913,913,,913,913,913,913,913,913,913', +',,913,913,,,,913,913,913,913,,,,,,913,,,,,,,,913,913,,913,913,913,913', +'913,913,913,913,913,913,913,491,491,913,,491,,,,,,,,491,491,,491,491', +'491,491,491,491,491,,,491,491,,,,491,491,491,491,,,,,,491,,,,,,,,491', +'491,,491,491,491,491,491,491,491,491,491,491,491,490,490,491,,490,,', +',,,,,490,490,,490,490,490,490,490,490,490,,,490,490,,,,490,490,490,490', +',,,,,490,,,,,,,,490,490,,490,490,490,490,490,490,490,490,490,490,490', +'425,425,490,,425,,,,,,,,425,425,,425,425,425,425,425,425,425,,,425,425', +',,,425,425,425,425,,,,,,425,,,,,,,,425,425,,425,425,425,425,425,425', +'425,425,425,425,425,426,426,425,,426,,,,,,,,426,426,,426,426,426,426', +'426,426,426,,,426,426,,,,426,426,426,426,,,,,,426,,,,,,,,426,426,,426', +'426,426,426,426,426,426,426,426,426,426,252,252,426,,252,,,,,,,,252', +'252,,252,252,252,252,252,252,252,,,252,252,,,,252,252,252,252,,,,,,', +',,,,,,,252,252,,252,252,252,252,252,252,252,252,252,252,252,253,253', +'252,,253,,,,,,,,253,253,,253,253,253,253,253,253,253,,,253,253,,,,253', +'253,253,253,,,,,,,,,,,,,,253,253,,253,253,253,253,253,253,253,253,253', +'253,253,204,204,253,,204,,,,,,,,204,204,,204,204,204,204,204,204,204', +',,204,204,,,,204,204,204,204,,,,,,204,,,,,,,,204,204,,204,204,204,204', +'204,204,204,204,204,204,204,203,203,204,,203,,,,,,,,203,203,,203,203', +'203,203,203,203,203,,,203,203,,,,203,203,203,203,,,,,,203,,,,,,,,203', +'203,,203,203,203,203,203,203,203,203,203,203,203,538,538,203,,538,,', +',,,,,538,538,,538,538,538,538,538,538,538,,,538,538,,,,538,538,538,538', +',,,,,538,,,,,,,,538,538,,538,538,538,538,538,538,538,538,538,538,538', +'537,537,538,,537,,,,,,,,537,537,,537,537,537,537,537,537,537,,,537,537', +',,,537,537,537,537,,,,,,537,,,,,,,,537,537,,537,537,537,537,537,537', +'537,537,537,537,537,530,530,537,,530,,,,,,,,530,530,,530,530,530,530', +'530,530,530,,,530,530,,,,530,530,530,530,,,,,,530,,,,,,,,530,530,,530', +'530,530,530,530,530,530,530,530,530,530,875,875,530,,875,,,,,,,,875', +'875,,875,875,875,875,875,875,875,,,875,875,,,,875,875,875,875,,,,,,875', +',,,,,,,875,875,,875,875,875,875,875,875,875,875,875,875,875,876,876', +'875,,876,,,,,,,,876,876,,876,876,876,876,876,876,876,,,876,876,,,,876', +'876,876,876,,,,,,876,,,,,,,,876,876,,876,876,876,876,876,876,876,876', +'876,876,876,,,876,504,504,504,504,504,504,504,504,504,504,504,,504,504', +',,504,504,,,,,,,,,,,,,,,504,,504,,504,504,504,504,504,504,504,,504,', +'266,266,266,266,266,266,266,266,266,266,266,,266,266,,504,266,266,,', +',,,,,,,,,,,,266,,266,,266,266,266,266,266,266,266,,266,,801,801,801', +'801,801,801,801,801,801,801,801,,801,801,,266,801,801,,,,,,,,,,,,,,', +'801,,801,,801,801,801,801,801,801,801,,801,,21,21,21,21,21,21,21,21', +'21,21,21,,21,21,,801,21,21,,,,,,,,,,,,,,,21,,21,,21,21,21,21,21,21,21', +',21,,804,804,804,804,804,804,804,804,804,804,804,,804,804,,21,804,804', +',,,,,,,,,,,,,,804,,804,,804,804,804,804,804,804,804,,804,,630,630,630', +'630,630,630,630,630,630,630,630,,630,630,,804,630,630,,,,,,,,,,,,,,', +'630,,630,,630,630,630,630,630,630,630,,630,,723,723,723,723,723,723', +'723,723,723,723,723,,723,723,,630,723,723,,,,,,,,,,,,,,,723,,723,,723', +'723,723,723,723,723,723,,723,,412,412,412,412,412,412,412,412,412,412', +'412,,412,412,,723,412,412,,,,,,,,,,,,,,,412,,412,,412,412,412,412,412', +'412,412,,412,,,,,,,,,,,,,,,,,412' ] + racc_action_check = arr = ::Array.new(23289, nil) + idx = 0 + clist.each do |str| + str.split(',', -1).each do |i| + arr[idx] = i.to_i unless i.empty? + idx += 1 + end + end + +racc_action_pointer = [ + 4401, 168, nil, 509, nil, 10792, 1504, 114, 21163, 21287, + 120, nil, 104, 165, 1384, 424, 127, 630, nil, -8, + 4776, 22977, 248, nil, 623, 266, 21033, 20924, 8276, 8401, + 9534, nil, 993, 9784, 10034, nil, 169, 425, 415, 258, + 320, 17050, 17808, 17933, 193, 1385, nil, nil, nil, nil, + nil, nil, nil, 3893, 0, nil, 19066, 12925, 0, nil, + 12800, 12425, nil, nil, 12292, 10417, 19816, 19691, 21771, nil, + nil, nil, nil, nil, nil, nil, 95, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 0, + nil, nil, 260, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 325, nil, 18433, nil, nil, nil, nil, + 18308, 18183, 17175, 20566, 20441, 1254, nil, 697, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 216, nil, 3640, + 11167, 11042, 10667, 22491, 22431, 9659, 9159, 8026, 7651, 6901, + 6776, nil, nil, 1373, 290, 319, 306, 354, 238, 297, + nil, 4901, 2129, 303, 16175, 15300, 14675, 14550, 14425, 14300, + 14175, 13800, 13425, 13300, 13050, 6151, 18816, 13175, 13550, 14050, + 15550, 15675, 15800, 15925, 16050, 16300, 16425, 16550, 16675, 16800, + nil, nil, 22311, 22371, 313, 5401, 5526, nil, nil, nil, + nil, nil, nil, nil, 5776, nil, 22885, nil, 292, 318, + nil, 6401, 364, 7026, nil, 7151, nil, nil, 430, 1629, + 8151, 346, 3140, 359, 413, 376, 8526, 4151, 1129, 1093, + 1039, 459, 993, nil, 431, 417, 289, nil, nil, nil, + 495, 708, 461, 10917, nil, 502, 530, 532, 331, nil, + 546, nil, 20316, 620, 629, 17433, nil, 570, 24, 560, + 585, 603, 622, nil, nil, 705, 124, 151, 18566, 18691, + 539, 701, 599, 116, 117, 562, 696, 124, 733, nil, + nil, 359, 502, 160, nil, 996, nil, 55, 19566, nil, + nil, nil, 510, 361, 611, 552, 264, 516, 447, 654, + 362, nil, 656, nil, 12550, nil, 601, 550, 497, 520, + 39, 61, nil, nil, nil, nil, nil, nil, nil, nil, + 655, 21535, nil, nil, nil, nil, 659, nil, 650, nil, + 12675, 656, nil, 3765, 663, nil, 670, 674, 293, 393, + 20815, nil, nil, nil, 499, 608, 721, nil, nil, 1121, + 3007, nil, 23161, nil, 688, nil, nil, 993, nil, nil, + nil, nil, 268, nil, 734, 22191, 22251, 19441, 109, 19316, + 19191, 18941, 4151, 4276, 460, 566, 761, 763, 767, 770, + 4651, 4776, 4901, 4526, 4401, 2504, 2379, 3390, 3265, 3140, + 3640, 3515, 2754, 1077, 623, 4026, 2629, 20566, 243, 20749, + nil, nil, 20694, nil, nil, 713, nil, 241, 232, 716, + nil, nil, 18058, nil, 17683, nil, 17558, nil, nil, nil, + 17300, 1406, 717, 721, nil, nil, 725, 20191, 730, 20066, + 22131, 22071, 1398, 772, nil, nil, 19941, 737, nil, 12042, + 11917, 11792, 21951, 21891, 22839, 11667, 862, 11542, nil, 496, + nil, 11417, nil, nil, 11292, nil, nil, nil, nil, 2971, + 2879, 868, nil, 2629, 123, 154, 865, 875, 10542, 12167, + 22671, 21831, 135, nil, nil, 737, nil, 22611, 22551, 10167, + nil, nil, 9909, 403, 185, 1379, 3857, nil, nil, nil, + 153, nil, nil, nil, 976, nil, nil, nil, 774, nil, + nil, 320, nil, nil, 765, nil, nil, nil, 21411, nil, + 767, 9409, 9284, 528, 810, 9034, 8909, 8784, 8659, 814, + nil, nil, 7901, 7776, 818, nil, 7526, 7401, nil, nil, + 224, 266, 130, 390, 798, 2879, 800, nil, 605, nil, + 4526, nil, nil, nil, nil, 249, nil, 4276, 4026, nil, + 806, nil, 861, 6276, nil, nil, 1531, 16, 5276, 820, + nil, 826, 285, 284, 865, 360, 748, 869, 832, 5026, + 23069, 898, 901, 155, 960, nil, 743, 846, 892, nil, + nil, 854, 426, 159, 2307, nil, 852, 857, 862, nil, + nil, nil, nil, nil, nil, 866, nil, 854, nil, nil, + nil, nil, 954, nil, nil, 955, 421, nil, 995, nil, + nil, nil, nil, 1008, nil, 48, 894, 164, 56, 65, + 89, 6026, 398, 873, nil, 895, 4651, 281, nil, nil, + 1023, 2379, 1557, 117, 21659, nil, nil, nil, nil, nil, + nil, 1504, nil, nil, nil, nil, nil, 910, 13675, 18433, + 13925, nil, 920, nil, 10034, nil, 8526, nil, nil, 17300, + nil, 12292, nil, 23115, 14800, 14925, 15050, 15175, 369, 15425, + 924, 945, 950, nil, 974, 952, 1099, 952, nil, 1083, + 1629, 992, 1096, nil, nil, 977, 453, nil, nil, nil, + 868, nil, nil, 140, 16925, nil, 1021, nil, nil, nil, + nil, 983, 2182, nil, 2057, nil, nil, 1527, 5151, nil, + 758, nil, 986, 267, nil, 993, nil, nil, 1115, nil, + 5651, 1117, 1754, 2004, nil, 5901, 2254, 98, 121, nil, + 1122, nil, 3765, nil, 1132, 1018, nil, nil, 1033, 1022, + nil, 22931, 6526, 6651, 23023, 1932, nil, 1807, nil, nil, + 1430, nil, 1047, 1030, nil, nil, nil, 7276, nil, 1054, + nil, nil, nil, 1879, 1282, 1186, 1158, 1117, 1153, nil, + nil, 2504, 2754, 1048, 1047, 1049, nil, nil, 1054, 1072, + nil, 1078, nil, 1083, 729, 1081, 883, nil, nil, 152, + nil, 1203, 1207, nil, 355, nil, nil, 1209, nil, nil, + 5039, nil, 1091, 1105, 1107, 1109, nil, 1110, nil, 1240, + 862, 1185, nil, 1234, 10292, 22731, 22791, 675, 1131, 1235, + nil, 1682, nil, nil, 765, nil, 1401, nil, 1277, nil, + nil, nil, 494, 1299, 1116, 3265, nil, nil, nil, nil, + nil, 3390, nil, 3515, 1307, nil, nil, 1085, nil, 919, + nil, nil, nil, 22011, nil, nil, 1127, 34, 164, 181, + 1509, nil, nil, 1132, 1133, 1137, 1138, 1139, 1365, 1149, + 1269, 639, 1271, 1272, 1153, 1161, 1167, 1181, 1225, 1232, + 163, nil, 890, nil, nil, nil, 1114, 1196, nil, nil, + nil, nil, 794, nil, nil, nil, 1198, 1200, -6, nil, + nil ] + +racc_action_default = [ + -3, -552, -1, -538, -4, -552, -7, -552, -552, -552, + -552, -27, -552, -552, -552, -274, -552, -39, -42, -540, + -552, -47, -49, -50, -51, -255, -255, -255, -285, -321, + -322, -67, -11, -71, -79, -81, -552, -467, -468, -552, + -552, -552, -552, -552, -540, -236, -267, -268, -269, -270, + -271, -272, -273, -528, -11, -277, -551, -520, -293, -295, + -552, -552, -299, -302, -538, -552, -552, -552, -552, -323, + -324, -326, -327, -416, -417, -418, -419, -420, -435, -423, + -424, -437, -439, -428, -433, -449, -437, -451, -452, -526, + -456, -457, -527, -459, -460, -461, -462, -463, -464, -465, + -466, -471, -472, -552, -2, -539, -547, -548, -549, -6, + -552, -552, -552, -552, -552, -3, -15, -552, -110, -111, + -112, -113, -114, -115, -116, -117, -118, -122, -123, -124, + -125, -126, -127, -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, -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, -20, -119, -11, + -552, -552, -245, -552, -552, -552, -552, -552, -552, -552, + -540, -541, -46, -552, -467, -468, -552, -274, -552, -552, + -228, -552, -11, -552, -552, -552, -552, -552, -552, -552, + -552, -552, -552, -552, -552, -552, -552, -552, -552, -552, + -552, -552, -552, -552, -552, -552, -552, -552, -552, -552, + -386, -388, -552, -552, -56, -245, -552, -292, -391, -400, + -402, -62, -397, -63, -540, -64, -237, -250, -259, -259, + -254, -552, -260, -552, -522, -552, -65, -66, -538, -12, + -552, -69, -11, -540, -552, -72, -75, -11, -87, -88, + -552, -552, -95, -285, -288, -540, -552, -321, -322, -325, + -398, -552, -77, -552, -83, -282, -453, -454, -552, -213, + -214, -229, -552, -408, -552, -552, -238, -544, -544, -552, + -552, -544, -552, -294, -378, -48, -552, -552, -552, -552, + -538, -552, -539, -467, -468, -552, -552, -274, -552, -337, + -338, -105, -106, -552, -108, -552, -274, -552, -552, -467, + -468, -314, -110, -111, -151, -152, -153, -169, -174, -181, + -184, -316, -552, -518, -552, -421, -552, -552, -552, -552, + -552, -552, 961, -5, -550, -21, -22, -23, -24, -25, + -552, -552, -17, -18, -19, -120, -552, -28, -37, -38, + -552, -552, -29, -194, -540, -246, -259, -259, -529, -530, + -255, -395, -531, -532, -530, -529, -255, -394, -396, -531, + -532, -35, -202, -36, -552, -40, -41, -192, -260, -43, + -44, -45, -540, -291, -552, -552, -552, -245, -282, -552, + -552, -552, -203, -204, -205, -206, -207, -208, -209, -210, + -215, -216, -217, -218, -219, -220, -221, -222, -223, -224, + -225, -226, -227, -230, -231, -232, -233, -540, -367, -255, + -529, -530, -255, -54, -57, -540, -256, -367, -367, -540, + -287, -251, -552, -252, -552, -257, -552, -261, -525, -10, + -539, -14, -540, -68, -280, -84, -73, -552, -540, -245, + -552, -552, -94, -552, -453, -454, -552, -80, -85, -552, + -552, -552, -552, -552, -234, -552, -551, -551, -276, -278, + -239, -546, -545, -241, -546, -283, -284, -521, -296, -492, + -11, -328, -329, -11, -552, -552, -552, -552, -552, -245, + -552, -552, -282, -307, -105, -106, -107, -552, -552, -245, + -310, -473, -552, -552, -552, -11, -492, -318, -536, -537, + -540, -422, -436, -441, -552, -443, -425, -438, -552, -440, + -427, -552, -430, -432, -552, -450, -8, -16, -552, -26, + -266, -552, -552, -399, -552, -247, -249, -552, -552, -58, + -244, -392, -552, -552, -60, -393, -552, -552, -290, -542, + -529, -530, -529, -530, -540, -192, -552, -368, -372, -370, + -11, -52, -389, -53, -390, -367, -242, -11, -11, -286, + -259, -258, -262, -552, -523, -524, -13, -70, -552, -76, + -82, -540, -529, -530, -243, -91, -93, -552, -78, -552, + -201, -211, -212, -540, -551, -335, -11, -409, -551, -410, + -411, -540, -544, -552, -492, -381, -517, -517, -517, -491, + -493, -494, -495, -496, -497, -498, -499, -552, -501, -507, + -509, -510, -512, -513, -514, -552, -551, -330, -551, -300, + -331, -332, -303, -552, -306, -552, -540, -529, -530, -533, + -281, -552, -105, -106, -109, -540, -11, -552, -475, -312, + -552, -11, -492, -552, -552, -519, -442, -445, -446, -447, + -448, -11, -426, -429, -431, -434, -121, -264, -552, -195, + -552, -543, -259, -31, -197, -32, -198, -59, -33, -200, + -34, -199, -61, -193, -552, -552, -552, -552, -399, -552, + -517, -517, -517, -366, -552, -372, -552, -498, -505, -552, + -11, -552, -552, -253, -263, -74, -89, -86, -289, -9, + -11, -415, -336, -552, -552, -413, -552, -240, -379, -382, + -384, -372, -552, -484, -552, -487, -489, -552, -552, -339, + -552, -341, -343, -350, -498, -540, -511, -515, -552, -333, + -552, -552, -11, -11, -305, -552, -11, -399, -552, -399, + -552, -474, -11, -315, -552, -540, -477, -319, -552, -265, + -30, -196, -248, -552, -235, -357, -359, -552, -362, -364, + -552, -369, -552, -373, -374, -376, -377, -552, -387, -552, + -401, -403, -414, -11, -96, -97, -552, -552, -104, -412, + -279, -11, -11, -540, -517, -517, -502, -516, -517, -517, + -508, -517, -503, -540, -552, -348, -552, -500, -297, -552, + -298, -552, -552, -262, -551, -308, -311, -552, -317, -476, + -492, -444, -517, -517, -517, -517, -506, -517, -371, -552, + -504, -552, -55, -408, -245, -552, -552, -103, -552, -552, + -380, -552, -480, -482, -552, -485, -552, -488, -552, -490, + -340, -342, -346, -552, -351, -11, -301, -304, -404, -405, + -406, -11, -313, -11, -552, -354, -356, -552, -360, -552, + -363, -365, -375, -552, -282, -407, -540, -529, -530, -533, + -102, -383, -385, -517, -517, -517, -517, -344, -552, -349, + -552, -551, -552, -552, -517, -517, -517, -517, -281, -533, + -399, -478, -552, -481, -483, -486, -552, -347, -334, -309, + -320, -352, -552, -355, -358, -361, -517, -345, -517, -479, + -353 ] + +clist = [ +'121,121,314,400,406,361,209,14,506,285,394,473,14,316,267,267,267,212', +'520,523,6,258,262,416,527,6,464,213,124,124,691,312,302,778,573,213', +'213,213,497,14,290,290,116,198,126,126,326,327,299,299,330,105,459,462', +'611,536,611,731,389,816,121,14,634,465,413,836,840,213,213,614,645,213', +'335,345,345,269,269,269,281,2,299,299,299,734,254,261,263,104,814,108', +'325,325,775,109,325,758,375,376,377,378,891,347,351,318,321,649,510', +'513,836,614,517,283,14,669,672,519,251,213,213,213,213,14,14,831,832', +'6,552,423,559,562,866,458,649,367,379,6,600,467,371,473,325,325,325', +'325,602,607,608,604,331,468,108,898,638,753,894,365,366,611,611,265', +'276,277,369,561,370,696,701,834,368,605,568,614,319,1,381,340,268,268', +'268,197,363,470,320,840,733,323,891,518,267,749,338,836,816,373,380', +'761,410,387,392,401,483,929,411,415,317,843,14,213,213,213,540,362,213', +'213,213,213,213,213,547,673,812,912,619,315,781,400,406,866,641,14,649', +'628,324,769,728,594,947,419,420,421,422,267,267,795,328,782,833,329', +'783,684,267,681,901,686,957,792,545,546,694,860,735,746,213,213,862', +'813,643,,,,,213,,,,15,,,649,498,15,,493,740,486,,,14,,14,624,,258,290', +'14,,262,621,948,,481,299,624,269,,,,15,292,292,290,269,,,524,525,787', +',299,,,704,213,,,789,480,,281,15,624,,,281,,213,213,676,624,588,337', +'346,346,,903,509,769,685,391,845,,717,743,745,391,213,722,,325,325,', +'482,479,,108,639,488,786,,,,213,,121,38,,,855,544,38,15,574,606,,611', +',609,466,,15,15,,,,550,469,580,614,,617,,124,585,416,268,620,38,289', +'289,,899,,268,267,526,567,108,126,410,,769,401,769,,,,,,38,,,757,,541', +'213,,,,,334,350,350,350,,596,823,649,,,,,,,,743,580,,,580,579,,,,498', +'640,584,,695,927,769,,,498,,15,267,732,,,38,,,,410,,,401,14,38,38,,', +',690,290,410,213,15,401,,616,,299,290,769,,769,,322,,,299,213,,,267', +',,601,610,,603,769,410,,267,401,14,687,410,14,,37,,401,633,213,37,,', +',895,,,,,213,900,,213,748,,14,,,15,940,15,642,,121,292,15,,37,288,288', +',915,,,,325,38,713,715,,,292,718,720,574,,415,213,213,37,,124,213,213', +'751,,213,498,755,38,333,349,349,349,,706,,126,747,,14,574,,670,670,', +',14,14,,,,,580,,712,585,,290,,,756,688,689,797,,299,790,,290,37,,794', +'835,,838,14,299,,37,37,,,,388,,,38,391,38,418,,,289,38,,574,,,,788,', +',,,574,,,624,675,289,,,,,916,863,,864,121,,213,,,,847,14,,,,,14,,,,', +',,,,800,14,,,325,859,,,,,213,,,,,475,,477,,478,,,,730,37,,,,,,,,,857', +',,,,,,14,,,880,16,,,37,15,16,14,,923,890,826,292,,,,849,,,299,,292,', +'791,,,,,,796,,,934,16,,,,213,,14,14,,,14,,15,,,15,14,,,,,,16,,,,,325', +',37,,37,,339,,288,37,15,,,,870,,,,,700,14,,299,,,288,,,14,14,,570,,', +',,,,,,284,933,,,38,,16,,,,267,289,,,,16,16,,410,,289,401,,,670,15,,', +',,,213,15,15,,,,,,,,,,292,38,,839,38,,841,,,14,574,292,410,,,14,,14', +'15,,,,,,,,38,,,,612,,322,,615,,,,,,,,,,,,865,,,867,,,,,,,,16,,,,,,,414', +'637,,,15,612,,,322,15,,,,,,,16,38,,15,,,418,,38,38,,,,,,,,,,289,,,,', +',,,,,,289,,,,,,,38,,37,924,,15,925,386,926,288,,,707,,,15,612,322,288', +'828,,16,,16,,,935,,16,936,284,937,,,,,,,,,,,37,,,37,,15,15,,38,15,,', +'744,38,,15,,,,,,,956,38,,37,,,,,,,958,,,,,,,,346,,,,,,15,,284,,,,,284', +'15,15,,,,,,,38,,,,,,,,,,38,,,,825,,,,37,,,,,,,37,37,,,,,,,,,,288,,,', +',,38,38,,799,38,288,,,,,38,,37,,15,,,,,13,15,,15,,13,,,,,,,,,,,350,', +',,,,38,,,,,,,,38,38,13,,,,,,,,,,,37,842,,,,37,,,,,,13,,16,,37,,,853', +',,,,,,,,,,,,,,,,322,,,,,,,,,,,,25,,,,38,25,16,37,,16,38,,38,,,13,,37', +',,25,824,,,13,13,,,25,25,25,16,25,,,,,,,,,,763,765,766,,,,,37,37,,,37', +'25,,,,,37,25,25,,,25,,,,,,,,414,666,,,668,,,,,,,,349,,16,,,,37,,,16', +'16,,,,37,37,,,,,,25,,,,13,25,25,25,25,25,25,,,,,,,16,,,,806,808,809', +',,,13,,,,,,,,,,,,,,,,,,,,,739,,,,,,,741,742,37,,,,,,37,,37,,16,,,,,16', +',,,,,,,,,16,,752,13,,13,,,,,13,,25,25,25,25,,,25,25,25,25,25,25,,,,', +',,,,,,,25,,,,16,,,,882,883,,,885,887,16,889,,,829,,,,,,,,,,,,,,798,25', +'25,,905,906,908,910,,911,25,,,,16,16,,,16,,,,,,16,,25,,25,,,,,25,,,', +',,819,,,,,,,,,,822,,,,,,16,,,,,,25,,16,16,941,943,944,945,,,,,,25,25', +'951,953,954,955,,851,852,,,854,,,,,,,,,25,,,,959,,960,,,,,,,,,,25,,', +',,,,,,,,,873,,,,,16,,,878,879,,16,,16,13,,,,,,,,,,,,,,,,,,,,,,,,,,,', +',,,,,,,,,25,,,13,,,13,,,,,,,,,,,,,,,931,,,,,,932,13,,,,,,,,,,,,,,,,', +',,,,,,,,25,,,,,,,,,25,,,,,,,,,,,,,,,,25,,,,,13,,,,,,,13,13,,25,,,25', +',,,,,25,,,,,,,,,,25,,,25,,,25,13,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,25,25', +',,,25,25,,,25,,,,,,,,,,13,,,,25,13,,,,,,25,25,,,13,,,,,,,,,,,,,,,,,', +',,,,,220,,25,,,,,,266,266,266,,,,,,13,,,,,309,310,311,,,13,,,,,,,,,', +'266,266,,,,,,,,,,25,,,,,25,,,,,25,13,13,,,13,,,,,25,13,,,,,,,,25,,,', +',,,,,,,,,,,,,,,,,,,13,,,,,,,25,13,13,,,,,,,,25,,,,,,,,,,,,,,,,,,,,,', +',,,,,,,,25,,25,25,,,25,,,,,,25,,,,,,,,,,,,,13,,,,,,13,,13,266,393,266', +',,412,417,,,25,,,,,,,,25,25,,,220,,,432,433,434,435,436,437,438,439', +'440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,456', +'457,,,,,,266,266,,,,25,,,,266,,,,,,,266,,266,,266,,,,,,25,,,,,,25,,25', +',,,,,,,,,,,,,,,,,,,,,,504,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,', +',,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,266,,,,,,,,,,,,,,,,,,,,,,,,,,,,,', +',,,,,,,266,,412,595,393,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,266', +',266,,266,,,,,,,,,,,,,266,,,,,,,,,,630,631,632,,,,,,266,,,,266,,,266', +',,,,,,,,,,,,,266,266,,,,,,,,,,266,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,266', +'709,,,266,266,714,716,,,,719,721,,,595,723,,,,,,,,,,,,,,,,,,,,,,,,,', +'266,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,', +',,,,,,,,,,,,,,,,,,,,,,,,,,,,,,266,,801,,,,,,,,,,,,,,714,716,721,719', +',804,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,266,,,,,,,,,,,,,,,,,266,', +',,,,,,,,,,,,,,,266,801,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,', +',,,,,,,,,,,,,,,,,,,,,,,,,266' ] + racc_goto_table = arr = ::Array.new(2754, nil) + idx = 0 + clist.each do |str| + str.split(',', -1).each do |i| + arr[idx] = i.to_i unless i.empty? + idx += 1 + end + end + +clist = [ +'54,54,8,35,35,53,30,21,10,46,22,68,21,62,32,32,32,19,82,82,7,66,66,17', +'85,7,37,21,57,57,91,30,47,83,23,21,21,21,48,21,21,21,14,14,58,58,16', +'16,60,60,16,6,35,35,69,51,69,115,26,123,54,21,11,22,26,151,152,21,21', +'156,127,21,21,21,21,65,65,65,42,2,60,60,60,120,36,36,36,4,122,89,28', +'28,111,5,28,125,16,16,16,16,109,52,52,65,65,118,64,64,151,156,64,43', +'21,84,84,126,128,21,21,21,21,21,21,129,130,7,146,44,146,146,153,131', +'118,142,7,7,38,133,142,68,28,28,28,28,67,38,38,67,4,134,89,135,136,137', +'112,140,141,69,69,41,41,41,144,145,147,148,149,150,143,39,59,156,61', +'1,29,18,63,63,63,15,77,44,78,152,118,79,109,81,32,12,86,151,123,5,2', +'127,54,19,19,66,44,112,19,19,63,111,21,21,21,21,88,92,21,21,21,21,21', +'21,93,85,120,122,48,94,11,35,35,153,95,21,118,48,96,110,23,22,112,28', +'28,28,28,32,32,127,97,98,120,99,100,51,32,101,102,103,112,104,105,106', +'107,108,113,23,21,21,115,121,124,,,,,21,,,,24,,,118,46,24,,30,38,47', +',,21,,21,35,,66,21,21,,66,22,83,,7,60,35,65,,,,24,24,24,21,65,,,16,16', +'23,,60,,,146,21,,,23,6,,42,24,35,,,42,,21,21,22,35,44,24,24,24,,91,28', +'110,22,63,110,,37,68,48,63,21,37,,28,28,,43,4,,89,26,43,82,,,,21,,54', +'50,,,84,28,50,24,30,44,,69,,44,41,,24,24,,,,28,41,66,156,,44,,57,66', +'17,63,44,50,50,50,,11,,63,32,4,14,89,58,54,,110,66,110,,,,,,50,,,64', +',89,21,,,,,50,50,50,50,,30,82,118,,,,,,,,68,66,,,66,36,,,,46,62,36,', +'44,110,110,,,46,,24,32,116,,,50,,,,54,,,66,21,50,50,,,,8,21,54,21,24', +'66,,7,,60,21,110,,110,,27,,,60,21,,,32,,,36,65,,36,110,54,,32,66,21', +'16,54,21,,49,,66,28,21,49,,,,82,,,,,21,85,,21,44,,21,,,24,23,24,65,', +'54,24,24,,49,49,49,,10,,,,28,50,19,19,,,24,19,19,30,,19,21,21,49,,57', +'21,21,62,,21,46,62,50,49,49,49,49,,14,,58,46,,21,30,,89,89,,,21,21,', +',,,66,,65,66,,21,,,30,89,89,53,,60,8,,21,49,,8,116,,116,21,60,,49,49', +',,,27,,,50,63,50,27,,,50,50,,30,,,,16,,,,,30,,,35,63,50,,,,,22,116,', +'116,54,,21,,,,44,21,,,,,21,,,,,,,,,19,21,,,28,44,,,,,21,,,,,27,,27,', +'27,,,,114,49,,,,,,,,,8,,,,,,,21,,,44,25,,,49,24,25,21,,116,44,21,24', +',,,16,,,60,,24,,89,,,,,,89,,,116,25,,,,21,,21,21,,,21,,24,,,24,21,,', +',,,25,,,,,28,,49,,49,,25,,49,49,24,,,,21,,,,,24,21,,60,,,49,,,21,21', +',27,,,,,,,,,9,8,,,50,,25,,,,32,50,,,,25,25,,54,,50,66,,,89,24,,,,,,21', +'24,24,,,,,,,,,,24,50,,114,50,,114,,,21,30,24,54,,,21,,21,24,,,,,,,,50', +',,,27,,27,,27,,,,,,,,,,,,114,,,114,,,,,,,,25,,,,,,,25,27,,,24,27,,,27', +'24,,,,,,,25,50,,24,,,27,,50,50,,,,,,,,,,50,,,,,,,,,,,50,,,,,,,50,,49', +'114,,24,114,9,114,49,,,27,,,24,27,27,49,24,,25,,25,,,114,,25,114,9,114', +',,,,,,,,,,49,,,49,,24,24,,50,24,,,27,50,,24,,,,,,,114,50,,49,,,,,,,114', +',,,,,,,24,,,,,,24,,9,,,,,9,24,24,,,,,,,50,,,,,,,,,,50,,,,50,,,,49,,', +',,,,49,49,,,,,,,,,,49,,,,,,50,50,,27,50,49,,,,,50,,49,,24,,,,,20,24', +',24,,20,,,,,,,,,,,50,,,,,,50,,,,,,,,50,50,20,,,,,,,,,,,49,27,,,,49,', +',,,,20,,25,,49,,,27,,,,,,,,,,,,,,,,,27,,,,,,,,,,,,40,,,,50,40,25,49', +',25,50,,50,,,20,,49,,,40,49,,,20,20,,,40,40,40,25,40,,,,,,,,,,117,117', +'117,,,,,49,49,,,49,40,,,,,49,40,40,,,40,,,,,,,,25,9,,,9,,,,,,,,49,,25', +',,,49,,,25,25,,,,49,49,,,,,,40,,,,20,40,40,40,40,40,40,,,,,,,25,,,,117', +'117,117,,,,20,,,,,,,,,,,,,,,,,,,,,9,,,,,,,9,9,49,,,,,,49,,49,,25,,,', +',25,,,,,,,,,,25,,9,20,,20,,,,,20,,40,40,40,40,,,40,40,40,40,40,40,,', +',,,,,,,,,40,,,,25,,,,117,117,,,117,117,25,117,,,25,,,,,,,,,,,,,,9,40', +'40,,117,117,117,117,,117,40,,,,25,25,,,25,,,,,,25,,40,,40,,,,,40,,,', +',,9,,,,,,,,,,9,,,,,,25,,,,,,40,,25,25,117,117,117,117,,,,,,40,40,117', +'117,117,117,,9,9,,,9,,,,,,,,,40,,,,117,,117,,,,,,,,,,40,,,,,,,,,,,,9', +',,,,25,,,9,9,,25,,25,20,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,40,,,20', +',,20,,,,,,,,,,,,,,,9,,,,,,9,20,,,,,,,,,,,,,,,,,,,,,,,,,40,,,,,,,,,40', +',,,,,,,,,,,,,,,40,,,,,20,,,,,,,20,20,,40,,,40,,,,,,40,,,,,,,,,,40,,', +'40,,,40,20,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,40,40,,,,40,40,,,40,,,,,,,', +',,20,,,,40,20,,,,,,40,40,,,20,,,,,,,,,,,,,,,,,,,,,,,31,,40,,,,,,31,31', +'31,,,,,,20,,,,,31,31,31,,,20,,,,,,,,,,31,31,,,,,,,,,,40,,,,,40,,,,,40', +'20,20,,,20,,,,,40,20,,,,,,,,40,,,,,,,,,,,,,,,,,,,,,,,20,,,,,,,40,20', +'20,,,,,,,,40,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,40,,40,40,,,40,,,,,,40,,,', +',,,,,,,,,20,,,,,,20,,20,31,31,31,,,31,31,,,40,,,,,,,,40,40,,,31,,,31', +'31,31,31,31,31,31,31,31,31,31,31,31,31,31,31,31,31,31,31,31,31,31,31', +'31,31,,,,,,31,31,,,,40,,,,31,,,,,,,31,,31,,31,,,,,,40,,,,,,40,,40,,', +',,,,,,,,,,,,,,,,,,,,31,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,', +',,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,31,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,', +',,,31,,31,31,31,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,31,,31,,31,', +',,,,,,,,,,,31,,,,,,,,,,31,31,31,,,,,,31,,,,31,,,31,,,,,,,,,,,,,,31,31', +',,,,,,,,,31,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,31,31,,,31,31,31,31,,,,31', +'31,,,31,31,,,,,,,,,,,,,,,,,,,,,,,,,,31,,,,,,,,,,,,,,,,,,,,,,,,,,,,,', +',,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,31', +',31,,,,,,,,,,,,,,31,31,31,31,,31,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,', +',,,31,,,,,,,,,,,,,,,,,31,,,,,,,,,,,,,,,,,31,31,,,,,,,,,,,,,,,,,,,,,', +',,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,31' ] + racc_goto_check = arr = ::Array.new(2754, nil) + idx = 0 + clist.each do |str| + str.split(',', -1).each do |i| + arr[idx] = i.to_i unless i.empty? + idx += 1 + end + end + +racc_goto_pointer = [ + nil, 173, 79, nil, 84, 88, 48, 20, -52, 818, + -305, -444, -445, nil, 34, 170, -14, -183, 110, -3, + 1175, 7, -192, -360, 275, 751, -142, 451, 30, 58, + -13, 1879, -14, nil, nil, -200, 59, -228, -322, -294, + 1265, 131, 46, 79, -83, nil, -24, -2, -265, 532, + 374, -288, 35, -63, -8, nil, nil, 20, 36, -215, + 15, 116, -43, 148, -211, 47, -4, -315, -258, -418, + nil, nil, nil, nil, nil, nil, nil, 112, 125, 127, + nil, -137, -308, -633, -411, -307, 125, nil, -137, 86, + nil, -516, 143, -144, 168, -281, 173, 182, -424, 184, + -424, -282, -603, -287, -434, -95, -104, -289, -538, -744, + -424, -565, -692, -338, 132, -541, -122, 661, -414, nil, + -515, -471, -648, -677, -253, -548, -209, -449, 94, -636, + -636, -119, nil, -122, -111, -703, -355, -485, nil, nil, + 79, 78, 52, 86, 79, -206, -240, 80, -389, -389, + -595, -697, -698, -677, nil, nil, -405 ] + +racc_goto_default = [ + nil, nil, nil, 3, nil, 4, 332, 279, nil, 313, + nil, 779, nil, 278, nil, nil, nil, 11, 12, 18, + 219, 308, nil, nil, 217, 218, nil, 272, 17, nil, + 424, 21, 22, 23, 24, 627, nil, nil, nil, nil, + 296, 395, 31, nil, nil, 33, 36, 35, nil, 214, + 215, 344, nil, 123, 403, 122, 125, 74, 75, nil, + 45, nil, 635, 396, nil, 397, 408, 581, 471, 270, + 256, 46, 47, 48, 49, 50, 51, 52, nil, 257, + 58, nil, nil, nil, nil, nil, nil, 66, nil, 521, + 67, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 771, + 656, nil, 772, nil, 646, nil, 648, nil, 837, 597, + nil, nil, nil, 654, nil, nil, nil, 693, nil, nil, + nil, nil, 407, nil, nil, nil, nil, nil, 73, 76, + 77, nil, nil, nil, nil, nil, 557, nil, nil, nil, + 647, 658, 659, 738, 662, 665, 274 ] + +racc_reduce_table = [ + 0, 0, :racc_error, + 1, 138, :_reduce_none, + 2, 139, :_reduce_2, + 0, 140, :_reduce_3, + 1, 140, :_reduce_4, + 3, 140, :_reduce_5, + 2, 140, :_reduce_6, + 1, 142, :_reduce_none, + 4, 142, :_reduce_8, + 4, 145, :_reduce_9, + 2, 146, :_reduce_10, + 0, 150, :_reduce_11, + 1, 150, :_reduce_12, + 3, 150, :_reduce_13, + 2, 150, :_reduce_14, + 0, 166, :_reduce_15, + 4, 144, :_reduce_16, + 3, 144, :_reduce_17, + 3, 144, :_reduce_18, + 3, 144, :_reduce_19, + 2, 144, :_reduce_20, + 3, 144, :_reduce_21, + 3, 144, :_reduce_22, + 3, 144, :_reduce_23, + 3, 144, :_reduce_24, + 3, 144, :_reduce_25, + 4, 144, :_reduce_26, + 1, 144, :_reduce_none, + 3, 144, :_reduce_28, + 3, 144, :_reduce_29, + 6, 144, :_reduce_30, + 5, 144, :_reduce_31, + 5, 144, :_reduce_32, + 5, 144, :_reduce_33, + 5, 144, :_reduce_34, + 3, 144, :_reduce_35, + 3, 144, :_reduce_36, + 3, 144, :_reduce_37, + 3, 144, :_reduce_38, + 1, 144, :_reduce_none, + 3, 154, :_reduce_40, + 3, 154, :_reduce_41, + 1, 165, :_reduce_none, + 3, 165, :_reduce_43, + 3, 165, :_reduce_44, + 3, 165, :_reduce_45, + 2, 165, :_reduce_46, + 1, 165, :_reduce_none, + 1, 153, :_reduce_none, + 1, 156, :_reduce_none, + 1, 156, :_reduce_none, + 1, 170, :_reduce_none, + 4, 170, :_reduce_52, + 4, 170, :_reduce_53, + 0, 176, :_reduce_54, + 5, 174, :_reduce_55, + 2, 169, :_reduce_56, + 3, 169, :_reduce_57, + 4, 169, :_reduce_58, + 5, 169, :_reduce_59, + 4, 169, :_reduce_60, + 5, 169, :_reduce_61, + 2, 169, :_reduce_62, + 2, 169, :_reduce_63, + 2, 169, :_reduce_64, + 2, 169, :_reduce_65, + 2, 169, :_reduce_66, + 1, 155, :_reduce_67, + 3, 155, :_reduce_68, + 1, 180, :_reduce_69, + 3, 180, :_reduce_70, + 1, 179, :_reduce_none, + 2, 179, :_reduce_72, + 3, 179, :_reduce_73, + 5, 179, :_reduce_74, + 2, 179, :_reduce_75, + 4, 179, :_reduce_76, + 2, 179, :_reduce_77, + 4, 179, :_reduce_78, + 1, 179, :_reduce_79, + 3, 179, :_reduce_80, + 1, 183, :_reduce_none, + 3, 183, :_reduce_82, + 2, 182, :_reduce_83, + 3, 182, :_reduce_84, + 1, 185, :_reduce_85, + 3, 185, :_reduce_86, + 1, 184, :_reduce_87, + 1, 184, :_reduce_88, + 4, 184, :_reduce_89, + 3, 184, :_reduce_90, + 3, 184, :_reduce_91, + 3, 184, :_reduce_92, + 3, 184, :_reduce_93, + 2, 184, :_reduce_94, + 1, 184, :_reduce_95, + 1, 162, :_reduce_96, + 1, 162, :_reduce_97, + 4, 162, :_reduce_98, + 3, 162, :_reduce_99, + 3, 162, :_reduce_100, + 3, 162, :_reduce_101, + 3, 162, :_reduce_102, + 2, 162, :_reduce_103, + 1, 162, :_reduce_104, + 1, 188, :_reduce_105, + 1, 188, :_reduce_none, + 2, 189, :_reduce_107, + 1, 189, :_reduce_108, + 3, 189, :_reduce_109, + 1, 190, :_reduce_none, + 1, 190, :_reduce_none, + 1, 190, :_reduce_none, + 1, 190, :_reduce_none, + 1, 190, :_reduce_none, + 1, 193, :_reduce_115, + 1, 193, :_reduce_none, + 1, 151, :_reduce_none, + 1, 151, :_reduce_none, + 1, 152, :_reduce_119, + 0, 196, :_reduce_120, + 4, 152, :_reduce_121, + 1, 191, :_reduce_none, + 1, 191, :_reduce_none, + 1, 191, :_reduce_none, + 1, 191, :_reduce_none, + 1, 191, :_reduce_none, + 1, 191, :_reduce_none, + 1, 191, :_reduce_none, + 1, 191, :_reduce_none, + 1, 191, :_reduce_none, + 1, 191, :_reduce_none, + 1, 191, :_reduce_none, + 1, 191, :_reduce_none, + 1, 191, :_reduce_none, + 1, 191, :_reduce_none, + 1, 191, :_reduce_none, + 1, 191, :_reduce_none, + 1, 191, :_reduce_none, + 1, 191, :_reduce_none, + 1, 191, :_reduce_none, + 1, 191, :_reduce_none, + 1, 191, :_reduce_none, + 1, 191, :_reduce_none, + 1, 191, :_reduce_none, + 1, 191, :_reduce_none, + 1, 191, :_reduce_none, + 1, 191, :_reduce_none, + 1, 191, :_reduce_none, + 1, 191, :_reduce_none, + 1, 191, :_reduce_none, + 1, 192, :_reduce_none, + 1, 192, :_reduce_none, + 1, 192, :_reduce_none, + 1, 192, :_reduce_none, + 1, 192, :_reduce_none, + 1, 192, :_reduce_none, + 1, 192, :_reduce_none, + 1, 192, :_reduce_none, + 1, 192, :_reduce_none, + 1, 192, :_reduce_none, + 1, 192, :_reduce_none, + 1, 192, :_reduce_none, + 1, 192, :_reduce_none, + 1, 192, :_reduce_none, + 1, 192, :_reduce_none, + 1, 192, :_reduce_none, + 1, 192, :_reduce_none, + 1, 192, :_reduce_none, + 1, 192, :_reduce_none, + 1, 192, :_reduce_none, + 1, 192, :_reduce_none, + 1, 192, :_reduce_none, + 1, 192, :_reduce_none, + 1, 192, :_reduce_none, + 1, 192, :_reduce_none, + 1, 192, :_reduce_none, + 1, 192, :_reduce_none, + 1, 192, :_reduce_none, + 1, 192, :_reduce_none, + 1, 192, :_reduce_none, + 1, 192, :_reduce_none, + 1, 192, :_reduce_none, + 1, 192, :_reduce_none, + 1, 192, :_reduce_none, + 1, 192, :_reduce_none, + 1, 192, :_reduce_none, + 1, 192, :_reduce_none, + 1, 192, :_reduce_none, + 1, 192, :_reduce_none, + 1, 192, :_reduce_none, + 1, 192, :_reduce_none, + 3, 168, :_reduce_192, + 5, 168, :_reduce_193, + 3, 168, :_reduce_194, + 5, 168, :_reduce_195, + 6, 168, :_reduce_196, + 5, 168, :_reduce_197, + 5, 168, :_reduce_198, + 5, 168, :_reduce_199, + 5, 168, :_reduce_200, + 4, 168, :_reduce_201, + 3, 168, :_reduce_202, + 3, 168, :_reduce_203, + 3, 168, :_reduce_204, + 3, 168, :_reduce_205, + 3, 168, :_reduce_206, + 3, 168, :_reduce_207, + 3, 168, :_reduce_208, + 3, 168, :_reduce_209, + 3, 168, :_reduce_210, + 4, 168, :_reduce_211, + 4, 168, :_reduce_212, + 2, 168, :_reduce_213, + 2, 168, :_reduce_214, + 3, 168, :_reduce_215, + 3, 168, :_reduce_216, + 3, 168, :_reduce_217, + 3, 168, :_reduce_218, + 3, 168, :_reduce_219, + 3, 168, :_reduce_220, + 3, 168, :_reduce_221, + 3, 168, :_reduce_222, + 3, 168, :_reduce_223, + 3, 168, :_reduce_224, + 3, 168, :_reduce_225, + 3, 168, :_reduce_226, + 3, 168, :_reduce_227, + 2, 168, :_reduce_228, + 2, 168, :_reduce_229, + 3, 168, :_reduce_230, + 3, 168, :_reduce_231, + 3, 168, :_reduce_232, + 3, 168, :_reduce_233, + 3, 168, :_reduce_234, + 6, 168, :_reduce_235, + 1, 168, :_reduce_none, + 1, 164, :_reduce_none, + 1, 198, :_reduce_none, + 2, 198, :_reduce_none, + 4, 198, :_reduce_240, + 2, 198, :_reduce_241, + 3, 203, :_reduce_242, + 0, 204, :_reduce_243, + 1, 204, :_reduce_none, + 0, 159, :_reduce_245, + 1, 159, :_reduce_none, + 2, 159, :_reduce_none, + 4, 159, :_reduce_248, + 2, 159, :_reduce_249, + 1, 178, :_reduce_250, + 2, 178, :_reduce_251, + 2, 178, :_reduce_252, + 4, 178, :_reduce_253, + 1, 178, :_reduce_254, + 0, 207, :_reduce_255, + 2, 173, :_reduce_256, + 2, 206, :_reduce_257, + 2, 205, :_reduce_258, + 0, 205, :_reduce_259, + 1, 200, :_reduce_260, + 2, 200, :_reduce_261, + 3, 200, :_reduce_262, + 4, 200, :_reduce_263, + 3, 163, :_reduce_264, + 4, 163, :_reduce_265, + 2, 163, :_reduce_266, + 1, 197, :_reduce_none, + 1, 197, :_reduce_none, + 1, 197, :_reduce_none, + 1, 197, :_reduce_none, + 1, 197, :_reduce_none, + 1, 197, :_reduce_none, + 1, 197, :_reduce_none, + 1, 197, :_reduce_none, + 1, 197, :_reduce_275, + 3, 197, :_reduce_276, + 0, 231, :_reduce_277, + 0, 232, :_reduce_278, + 6, 197, :_reduce_279, + 3, 197, :_reduce_280, + 3, 197, :_reduce_281, + 2, 197, :_reduce_282, + 3, 197, :_reduce_283, + 3, 197, :_reduce_284, + 1, 197, :_reduce_285, + 4, 197, :_reduce_286, + 3, 197, :_reduce_287, + 1, 197, :_reduce_288, + 5, 197, :_reduce_289, + 4, 197, :_reduce_290, + 3, 197, :_reduce_291, + 2, 197, :_reduce_292, + 1, 197, :_reduce_none, + 2, 197, :_reduce_294, + 0, 233, :_reduce_295, + 3, 197, :_reduce_296, + 6, 197, :_reduce_297, + 6, 197, :_reduce_298, + 0, 234, :_reduce_299, + 0, 235, :_reduce_300, + 7, 197, :_reduce_301, + 0, 236, :_reduce_302, + 0, 237, :_reduce_303, + 7, 197, :_reduce_304, + 5, 197, :_reduce_305, + 4, 197, :_reduce_306, + 0, 238, :_reduce_307, + 0, 239, :_reduce_308, + 9, 197, :_reduce_309, + 0, 240, :_reduce_310, + 6, 197, :_reduce_311, + 0, 241, :_reduce_312, + 7, 197, :_reduce_313, + 0, 242, :_reduce_314, + 5, 197, :_reduce_315, + 0, 243, :_reduce_316, + 6, 197, :_reduce_317, + 0, 244, :_reduce_318, + 0, 245, :_reduce_319, + 9, 197, :_reduce_320, + 1, 197, :_reduce_321, + 1, 197, :_reduce_322, + 1, 197, :_reduce_323, + 1, 197, :_reduce_324, + 1, 158, :_reduce_none, + 1, 224, :_reduce_326, + 1, 227, :_reduce_327, + 1, 219, :_reduce_none, + 1, 219, :_reduce_none, + 2, 219, :_reduce_330, + 1, 221, :_reduce_none, + 1, 221, :_reduce_none, + 1, 220, :_reduce_none, + 5, 220, :_reduce_334, + 1, 148, :_reduce_none, + 2, 148, :_reduce_336, + 1, 223, :_reduce_none, + 1, 223, :_reduce_none, + 1, 246, :_reduce_339, + 3, 246, :_reduce_340, + 1, 249, :_reduce_341, + 3, 249, :_reduce_342, + 1, 248, :_reduce_none, + 4, 248, :_reduce_344, + 6, 248, :_reduce_345, + 3, 248, :_reduce_346, + 5, 248, :_reduce_347, + 2, 248, :_reduce_348, + 4, 248, :_reduce_349, + 1, 248, :_reduce_350, + 3, 248, :_reduce_351, + 6, 250, :_reduce_352, + 8, 250, :_reduce_353, + 4, 250, :_reduce_354, + 6, 250, :_reduce_355, + 4, 250, :_reduce_356, + 2, 250, :_reduce_none, + 6, 250, :_reduce_358, + 2, 250, :_reduce_359, + 4, 250, :_reduce_360, + 6, 250, :_reduce_361, + 2, 250, :_reduce_362, + 4, 250, :_reduce_363, + 2, 250, :_reduce_364, + 4, 250, :_reduce_365, + 1, 250, :_reduce_366, + 0, 175, :_reduce_367, + 1, 175, :_reduce_368, + 3, 256, :_reduce_369, + 1, 256, :_reduce_370, + 4, 256, :_reduce_371, + 0, 257, :_reduce_372, + 2, 257, :_reduce_373, + 1, 258, :_reduce_374, + 3, 258, :_reduce_375, + 1, 259, :_reduce_376, + 1, 259, :_reduce_none, + 0, 263, :_reduce_378, + 3, 218, :_reduce_379, + 4, 261, :_reduce_380, + 1, 261, :_reduce_381, + 0, 266, :_reduce_382, + 4, 262, :_reduce_383, + 0, 267, :_reduce_384, + 4, 262, :_reduce_385, + 0, 268, :_reduce_386, + 5, 265, :_reduce_387, + 2, 171, :_reduce_388, + 4, 171, :_reduce_389, + 4, 171, :_reduce_390, + 2, 217, :_reduce_391, + 4, 217, :_reduce_392, + 4, 217, :_reduce_393, + 3, 217, :_reduce_394, + 3, 217, :_reduce_395, + 3, 217, :_reduce_396, + 2, 217, :_reduce_397, + 1, 217, :_reduce_398, + 4, 217, :_reduce_399, + 0, 270, :_reduce_400, + 5, 216, :_reduce_401, + 0, 271, :_reduce_402, + 5, 216, :_reduce_403, + 5, 222, :_reduce_404, + 1, 272, :_reduce_405, + 1, 272, :_reduce_none, + 6, 147, :_reduce_407, + 0, 147, :_reduce_408, + 1, 273, :_reduce_409, + 1, 273, :_reduce_none, + 1, 273, :_reduce_none, + 2, 274, :_reduce_412, + 1, 274, :_reduce_none, + 2, 149, :_reduce_414, + 1, 149, :_reduce_none, + 1, 208, :_reduce_none, + 1, 208, :_reduce_none, + 1, 208, :_reduce_none, + 1, 209, :_reduce_419, + 1, 276, :_reduce_420, + 2, 276, :_reduce_421, + 3, 277, :_reduce_422, + 1, 277, :_reduce_423, + 1, 277, :_reduce_424, + 3, 210, :_reduce_425, + 4, 211, :_reduce_426, + 3, 212, :_reduce_427, + 0, 281, :_reduce_428, + 3, 281, :_reduce_429, + 1, 282, :_reduce_430, + 2, 282, :_reduce_431, + 3, 213, :_reduce_432, + 0, 284, :_reduce_433, + 3, 284, :_reduce_434, + 0, 278, :_reduce_435, + 2, 278, :_reduce_436, + 0, 279, :_reduce_437, + 2, 279, :_reduce_438, + 0, 280, :_reduce_439, + 2, 280, :_reduce_440, + 1, 283, :_reduce_441, + 2, 283, :_reduce_442, + 0, 286, :_reduce_443, + 4, 283, :_reduce_444, + 1, 285, :_reduce_445, + 1, 285, :_reduce_446, + 1, 285, :_reduce_447, + 1, 285, :_reduce_none, + 1, 194, :_reduce_449, + 3, 195, :_reduce_450, + 1, 275, :_reduce_451, + 1, 275, :_reduce_452, + 2, 275, :_reduce_453, + 2, 275, :_reduce_454, + 1, 186, :_reduce_455, + 1, 186, :_reduce_456, + 1, 186, :_reduce_457, + 1, 186, :_reduce_458, + 1, 186, :_reduce_459, + 1, 187, :_reduce_460, + 1, 187, :_reduce_461, + 1, 187, :_reduce_462, + 1, 187, :_reduce_463, + 1, 187, :_reduce_464, + 1, 187, :_reduce_465, + 1, 187, :_reduce_466, + 1, 214, :_reduce_467, + 1, 214, :_reduce_468, + 1, 157, :_reduce_469, + 1, 157, :_reduce_470, + 1, 161, :_reduce_471, + 1, 161, :_reduce_472, + 1, 225, :_reduce_473, + 3, 225, :_reduce_474, + 2, 225, :_reduce_475, + 3, 228, :_reduce_476, + 2, 228, :_reduce_477, + 6, 264, :_reduce_478, + 8, 264, :_reduce_479, + 4, 264, :_reduce_480, + 6, 264, :_reduce_481, + 4, 264, :_reduce_482, + 6, 264, :_reduce_483, + 2, 264, :_reduce_484, + 4, 264, :_reduce_485, + 6, 264, :_reduce_486, + 2, 264, :_reduce_487, + 4, 264, :_reduce_488, + 2, 264, :_reduce_489, + 4, 264, :_reduce_490, + 1, 264, :_reduce_491, + 0, 264, :_reduce_492, + 1, 260, :_reduce_493, + 1, 260, :_reduce_494, + 1, 260, :_reduce_495, + 1, 260, :_reduce_496, + 1, 247, :_reduce_none, + 1, 247, :_reduce_none, + 1, 288, :_reduce_499, + 3, 288, :_reduce_500, + 1, 251, :_reduce_501, + 3, 251, :_reduce_502, + 3, 289, :_reduce_503, + 3, 290, :_reduce_504, + 1, 252, :_reduce_505, + 3, 252, :_reduce_506, + 1, 287, :_reduce_507, + 3, 287, :_reduce_508, + 1, 291, :_reduce_none, + 1, 291, :_reduce_none, + 2, 253, :_reduce_511, + 1, 253, :_reduce_512, + 1, 292, :_reduce_none, + 1, 292, :_reduce_none, + 2, 255, :_reduce_515, + 2, 254, :_reduce_516, + 0, 254, :_reduce_517, + 1, 229, :_reduce_none, + 3, 229, :_reduce_519, + 0, 215, :_reduce_520, + 2, 215, :_reduce_none, + 1, 202, :_reduce_522, + 3, 202, :_reduce_523, + 3, 293, :_reduce_524, + 2, 293, :_reduce_525, + 1, 177, :_reduce_none, + 1, 177, :_reduce_none, + 1, 177, :_reduce_none, + 1, 172, :_reduce_none, + 1, 172, :_reduce_none, + 1, 172, :_reduce_none, + 1, 172, :_reduce_none, + 1, 269, :_reduce_none, + 1, 269, :_reduce_none, + 1, 269, :_reduce_none, + 1, 230, :_reduce_none, + 1, 230, :_reduce_none, + 0, 141, :_reduce_none, + 1, 141, :_reduce_none, + 0, 167, :_reduce_none, + 1, 167, :_reduce_none, + 2, 181, :_reduce_542, + 2, 160, :_reduce_543, + 0, 201, :_reduce_none, + 1, 201, :_reduce_none, + 1, 201, :_reduce_none, + 1, 226, :_reduce_547, + 1, 226, :_reduce_none, + 1, 143, :_reduce_none, + 2, 143, :_reduce_none, + 0, 199, :_reduce_551 ] + +racc_reduce_n = 552 + +racc_shift_n = 961 + +racc_token_table = { + false => 0, + :error => 1, + :kCLASS => 2, + :kMODULE => 3, + :kDEF => 4, + :kUNDEF => 5, + :kBEGIN => 6, + :kRESCUE => 7, + :kENSURE => 8, + :kEND => 9, + :kIF => 10, + :kUNLESS => 11, + :kTHEN => 12, + :kELSIF => 13, + :kELSE => 14, + :kCASE => 15, + :kWHEN => 16, + :kWHILE => 17, + :kUNTIL => 18, + :kFOR => 19, + :kBREAK => 20, + :kNEXT => 21, + :kREDO => 22, + :kRETRY => 23, + :kIN => 24, + :kDO => 25, + :kDO_COND => 26, + :kDO_BLOCK => 27, + :kDO_LAMBDA => 28, + :kRETURN => 29, + :kYIELD => 30, + :kSUPER => 31, + :kSELF => 32, + :kNIL => 33, + :kTRUE => 34, + :kFALSE => 35, + :kAND => 36, + :kOR => 37, + :kNOT => 38, + :kIF_MOD => 39, + :kUNLESS_MOD => 40, + :kWHILE_MOD => 41, + :kUNTIL_MOD => 42, + :kRESCUE_MOD => 43, + :kALIAS => 44, + :kDEFINED => 45, + :klBEGIN => 46, + :klEND => 47, + :k__LINE__ => 48, + :k__FILE__ => 49, + :k__ENCODING__ => 50, + :tIDENTIFIER => 51, + :tFID => 52, + :tGVAR => 53, + :tIVAR => 54, + :tCONSTANT => 55, + :tLABEL => 56, + :tCVAR => 57, + :tNTH_REF => 58, + :tBACK_REF => 59, + :tSTRING_CONTENT => 60, + :tINTEGER => 61, + :tFLOAT => 62, + :tUPLUS => 63, + :tUMINUS => 64, + :tUNARY_NUM => 65, + :tPOW => 66, + :tCMP => 67, + :tEQ => 68, + :tEQQ => 69, + :tNEQ => 70, + :tGEQ => 71, + :tLEQ => 72, + :tANDOP => 73, + :tOROP => 74, + :tMATCH => 75, + :tNMATCH => 76, + :tDOT => 77, + :tDOT2 => 78, + :tDOT3 => 79, + :tAREF => 80, + :tASET => 81, + :tLSHFT => 82, + :tRSHFT => 83, + :tCOLON2 => 84, + :tCOLON3 => 85, + :tOP_ASGN => 86, + :tASSOC => 87, + :tLPAREN => 88, + :tLPAREN2 => 89, + :tRPAREN => 90, + :tLPAREN_ARG => 91, + :tLBRACK => 92, + :tLBRACK2 => 93, + :tRBRACK => 94, + :tLBRACE => 95, + :tLBRACE_ARG => 96, + :tSTAR => 97, + :tSTAR2 => 98, + :tAMPER => 99, + :tAMPER2 => 100, + :tTILDE => 101, + :tPERCENT => 102, + :tDIVIDE => 103, + :tPLUS => 104, + :tMINUS => 105, + :tLT => 106, + :tGT => 107, + :tPIPE => 108, + :tBANG => 109, + :tCARET => 110, + :tLCURLY => 111, + :tRCURLY => 112, + :tBACK_REF2 => 113, + :tSYMBEG => 114, + :tSTRING_BEG => 115, + :tXSTRING_BEG => 116, + :tREGEXP_BEG => 117, + :tREGEXP_OPT => 118, + :tWORDS_BEG => 119, + :tQWORDS_BEG => 120, + :tSTRING_DBEG => 121, + :tSTRING_DVAR => 122, + :tSTRING_END => 123, + :tSTRING => 124, + :tSYMBOL => 125, + :tNL => 126, + :tEH => 127, + :tCOLON => 128, + :tCOMMA => 129, + :tSPACE => 130, + :tSEMI => 131, + :tLAMBDA => 132, + :tLAMBEG => 133, + :tCHARACTER => 134, + :tEQL => 135, + :tLOWEST => 136 } + +racc_nt_base = 137 + +racc_use_result_var = true + +Racc_arg = [ + racc_action_table, + racc_action_check, + racc_action_default, + racc_action_pointer, + racc_goto_table, + racc_goto_check, + racc_goto_default, + racc_goto_pointer, + racc_nt_base, + racc_reduce_table, + racc_token_table, + racc_shift_n, + racc_reduce_n, + racc_use_result_var ] + +Racc_token_to_s_table = [ + "$end", + "error", + "kCLASS", + "kMODULE", + "kDEF", + "kUNDEF", + "kBEGIN", + "kRESCUE", + "kENSURE", + "kEND", + "kIF", + "kUNLESS", + "kTHEN", + "kELSIF", + "kELSE", + "kCASE", + "kWHEN", + "kWHILE", + "kUNTIL", + "kFOR", + "kBREAK", + "kNEXT", + "kREDO", + "kRETRY", + "kIN", + "kDO", + "kDO_COND", + "kDO_BLOCK", + "kDO_LAMBDA", + "kRETURN", + "kYIELD", + "kSUPER", + "kSELF", + "kNIL", + "kTRUE", + "kFALSE", + "kAND", + "kOR", + "kNOT", + "kIF_MOD", + "kUNLESS_MOD", + "kWHILE_MOD", + "kUNTIL_MOD", + "kRESCUE_MOD", + "kALIAS", + "kDEFINED", + "klBEGIN", + "klEND", + "k__LINE__", + "k__FILE__", + "k__ENCODING__", + "tIDENTIFIER", + "tFID", + "tGVAR", + "tIVAR", + "tCONSTANT", + "tLABEL", + "tCVAR", + "tNTH_REF", + "tBACK_REF", + "tSTRING_CONTENT", + "tINTEGER", + "tFLOAT", + "tUPLUS", + "tUMINUS", + "tUNARY_NUM", + "tPOW", + "tCMP", + "tEQ", + "tEQQ", + "tNEQ", + "tGEQ", + "tLEQ", + "tANDOP", + "tOROP", + "tMATCH", + "tNMATCH", + "tDOT", + "tDOT2", + "tDOT3", + "tAREF", + "tASET", + "tLSHFT", + "tRSHFT", + "tCOLON2", + "tCOLON3", + "tOP_ASGN", + "tASSOC", + "tLPAREN", + "tLPAREN2", + "tRPAREN", + "tLPAREN_ARG", + "tLBRACK", + "tLBRACK2", + "tRBRACK", + "tLBRACE", + "tLBRACE_ARG", + "tSTAR", + "tSTAR2", + "tAMPER", + "tAMPER2", + "tTILDE", + "tPERCENT", + "tDIVIDE", + "tPLUS", + "tMINUS", + "tLT", + "tGT", + "tPIPE", + "tBANG", + "tCARET", + "tLCURLY", + "tRCURLY", + "tBACK_REF2", + "tSYMBEG", + "tSTRING_BEG", + "tXSTRING_BEG", + "tREGEXP_BEG", + "tREGEXP_OPT", + "tWORDS_BEG", + "tQWORDS_BEG", + "tSTRING_DBEG", + "tSTRING_DVAR", + "tSTRING_END", + "tSTRING", + "tSYMBOL", + "tNL", + "tEH", + "tCOLON", + "tCOMMA", + "tSPACE", + "tSEMI", + "tLAMBDA", + "tLAMBEG", + "tCHARACTER", + "tEQL", + "tLOWEST", + "$start", + "program", + "top_compstmt", + "top_stmts", + "opt_terms", + "top_stmt", + "terms", + "stmt", + "bodystmt", + "compstmt", + "opt_rescue", + "opt_else", + "opt_ensure", + "stmts", + "fitem", + "undef_list", + "expr_value", + "command_asgn", + "mlhs", + "command_call", + "var_lhs", + "primary_value", + "opt_call_args", + "rbracket", + "backref", + "lhs", + "mrhs", + "arg_value", + "expr", + "@1", + "opt_nl", + "arg", + "command", + "block_command", + "block_call", + "operation2", + "command_args", + "cmd_brace_block", + "opt_block_param", + "@2", + "operation", + "call_args", + "mlhs_basic", + "mlhs_inner", + "rparen", + "mlhs_head", + "mlhs_item", + "mlhs_node", + "mlhs_post", + "user_variable", + "keyword_variable", + "cname", + "cpath", + "fname", + "op", + "reswords", + "fsym", + "symbol", + "dsym", + "@3", + "primary", + "aref_args", + "none", + "args", + "trailer", + "assocs", + "paren_args", + "opt_paren_args", + "opt_block_arg", + "block_arg", + "@4", + "literal", + "strings", + "xstring", + "regexp", + "words", + "qwords", + "var_ref", + "assoc_list", + "brace_block", + "method_call", + "lambda", + "then", + "if_tail", + "do", + "case_body", + "for_var", + "k_class", + "superclass", + "term", + "k_module", + "f_arglist", + "singleton", + "dot_or_colon", + "@5", + "@6", + "@7", + "@8", + "@9", + "@10", + "@11", + "@12", + "@13", + "@14", + "@15", + "@16", + "@17", + "@18", + "@19", + "f_marg", + "f_norm_arg", + "f_margs", + "f_marg_list", + "block_param", + "f_arg", + "f_block_optarg", + "f_rest_arg", + "opt_f_block_arg", + "f_block_arg", + "block_param_def", + "opt_bv_decl", + "bv_decls", + "bvar", + "f_bad_arg", + "f_larglist", + "lambda_body", + "@20", + "f_args", + "do_block", + "@21", + "@22", + "@23", + "operation3", + "@24", + "@25", + "cases", + "exc_list", + "exc_var", + "numeric", + "string", + "string1", + "string_contents", + "xstring_contents", + "regexp_contents", + "word_list", + "word", + "string_content", + "qword_list", + "string_dvar", + "@26", + "f_optarg", + "f_arg_item", + "f_opt", + "f_block_opt", + "restarg_mark", + "blkarg_mark", + "assoc" ] + +Racc_debug_parser = false + +##### State transition tables end ##### + +# reduce 0 omitted + +# reduce 1 omitted + +def _reduce_2(val, _values, result) + result = @builder.compstmt(val[0]) + + result +end + +def _reduce_3(val, _values, result) + result = [] + + result +end + +def _reduce_4(val, _values, result) + result = [ val[0] ] + + result +end + +def _reduce_5(val, _values, result) + result = val[0] << val[2] + + result +end + +def _reduce_6(val, _values, result) + result = [ val[1] ] + + result +end + +# reduce 7 omitted + +def _reduce_8(val, _values, result) + result = @builder.preexe(val[0], val[1], val[2], val[3]) + + result +end + +def _reduce_9(val, _values, result) + rescue_bodies = val[1] + else_t, else_ = val[2] + ensure_t, ensure_ = val[3] + + if rescue_bodies.empty? && !else_t.nil? + diagnostic :warning, :useless_else, nil, else_t + end + + result = @builder.begin_body(val[0], + rescue_bodies, + else_t, else_, + ensure_t, ensure_) + + result +end + +def _reduce_10(val, _values, result) + result = @builder.compstmt(val[0]) + + result +end + +def _reduce_11(val, _values, result) + result = [] + + result +end + +def _reduce_12(val, _values, result) + result = [ val[0] ] + + result +end + +def _reduce_13(val, _values, result) + result = val[0] << val[2] + + result +end + +def _reduce_14(val, _values, result) + result = [ val[1] ] + + result +end + +def _reduce_15(val, _values, result) + @lexer.state = :expr_fname + + result +end + +def _reduce_16(val, _values, result) + result = @builder.alias(val[0], val[1], val[3]) + + result +end + +def _reduce_17(val, _values, result) + result = @builder.alias(val[0], + @builder.gvar(val[1]), + @builder.gvar(val[2])) + + result +end + +def _reduce_18(val, _values, result) + result = @builder.alias(val[0], + @builder.gvar(val[1]), + @builder.back_ref(val[2])) + + result +end + +def _reduce_19(val, _values, result) + diagnostic :error, :nth_ref_alias, nil, val[2] + + result +end + +def _reduce_20(val, _values, result) + result = @builder.undef_method(val[0], val[1]) + + result +end + +def _reduce_21(val, _values, result) + result = @builder.condition_mod(val[0], nil, + val[1], val[2]) + + result +end + +def _reduce_22(val, _values, result) + result = @builder.condition_mod(nil, val[0], + val[1], val[2]) + + result +end + +def _reduce_23(val, _values, result) + result = @builder.loop_mod(:while, val[0], val[1], val[2]) + + result +end + +def _reduce_24(val, _values, result) + result = @builder.loop_mod(:until, val[0], val[1], val[2]) + + result +end + +def _reduce_25(val, _values, result) + rescue_body = @builder.rescue_body(val[1], + nil, nil, nil, + nil, val[2]) + + result = @builder.begin_body(val[0], [ rescue_body ]) + + result +end + +def _reduce_26(val, _values, result) + result = @builder.postexe(val[0], val[1], val[2], val[3]) + + result +end + +# reduce 27 omitted + +def _reduce_28(val, _values, result) + result = @builder.multi_assign(val[0], val[1], val[2]) + + result +end + +def _reduce_29(val, _values, result) + result = @builder.op_assign(val[0], val[1], val[2]) + + result +end + +def _reduce_30(val, _values, result) + result = @builder.op_assign( + @builder.index( + val[0], val[1], val[2], val[3]), + val[4], val[5]) + + result +end + +def _reduce_31(val, _values, result) + result = @builder.op_assign( + @builder.call_method( + val[0], val[1], val[2]), + val[3], val[4]) + + result +end + +def _reduce_32(val, _values, result) + result = @builder.op_assign( + @builder.call_method( + val[0], val[1], val[2]), + val[3], val[4]) + + result +end + +def _reduce_33(val, _values, result) + diagnostic :error, :const_reassignment, nil, val[3] + + result +end + +def _reduce_34(val, _values, result) + result = @builder.op_assign( + @builder.call_method( + val[0], val[1], val[2]), + val[3], val[4]) + + result +end + +def _reduce_35(val, _values, result) + @builder.op_assign(val[0], val[1], val[2]) + + result +end + +def _reduce_36(val, _values, result) + result = @builder.assign(val[0], val[1], + @builder.array(nil, val[2], nil)) + + result +end + +def _reduce_37(val, _values, result) + result = @builder.multi_assign(val[0], val[1], val[2]) + + result +end + +def _reduce_38(val, _values, result) + result = @builder.multi_assign(val[0], val[1], + @builder.array(nil, val[2], nil)) + + result +end + +# reduce 39 omitted + +def _reduce_40(val, _values, result) + result = @builder.assign(val[0], val[1], val[2]) + + result +end + +def _reduce_41(val, _values, result) + result = @builder.assign(val[0], val[1], val[2]) + + result +end + +# reduce 42 omitted + +def _reduce_43(val, _values, result) + result = @builder.logical_op(:and, val[0], val[1], val[2]) + + result +end + +def _reduce_44(val, _values, result) + result = @builder.logical_op(:or, val[0], val[1], val[2]) + + result +end + +def _reduce_45(val, _values, result) + result = @builder.not_op(val[0], nil, val[2], nil) + + result +end + +def _reduce_46(val, _values, result) + result = @builder.not_op(val[0], nil, val[1], nil) + + result +end + +# reduce 47 omitted + +# reduce 48 omitted + +# reduce 49 omitted + +# reduce 50 omitted + +# reduce 51 omitted + +def _reduce_52(val, _values, result) + result = @builder.call_method(val[0], val[1], val[2], + nil, val[3], nil) + + result +end + +def _reduce_53(val, _values, result) + result = @builder.call_method(val[0], val[1], val[2], + nil, val[3], nil) + + result +end + +def _reduce_54(val, _values, result) + @static_env.extend_dynamic + result = @context.dup + @context.in_block = true + + result +end + +def _reduce_55(val, _values, result) + result = [ val[0], val[2], val[3], val[4] ] + + @static_env.unextend + @context.in_block = val[1].in_block + + result +end + +def _reduce_56(val, _values, result) + result = @builder.call_method(nil, nil, val[0], + nil, val[1], nil) + + result +end + +def _reduce_57(val, _values, result) + method_call = @builder.call_method(nil, nil, val[0], + nil, val[1], nil) + + begin_t, args, body, end_t = val[2] + result = @builder.block(method_call, + begin_t, args, body, end_t) + + result +end + +def _reduce_58(val, _values, result) + result = @builder.call_method(val[0], val[1], val[2], + nil, val[3], nil) + + result +end + +def _reduce_59(val, _values, result) + method_call = @builder.call_method(val[0], val[1], val[2], + nil, val[3], nil) + + begin_t, args, body, end_t = val[4] + result = @builder.block(method_call, + begin_t, args, body, end_t) + + result +end + +def _reduce_60(val, _values, result) + result = @builder.call_method(val[0], val[1], val[2], + nil, val[3], nil) + + result +end + +def _reduce_61(val, _values, result) + method_call = @builder.call_method(val[0], val[1], val[2], + nil, val[3], nil) + + begin_t, args, body, end_t = val[4] + result = @builder.block(method_call, + begin_t, args, body, end_t) + + result +end + +def _reduce_62(val, _values, result) + result = @builder.keyword_cmd(:super, val[0], + nil, val[1], nil) + + result +end + +def _reduce_63(val, _values, result) + result = @builder.keyword_cmd(:yield, val[0], + nil, val[1], nil) + + result +end + +def _reduce_64(val, _values, result) + result = @builder.keyword_cmd(:return, val[0], + nil, val[1], nil) + + result +end + +def _reduce_65(val, _values, result) + result = @builder.keyword_cmd(:break, val[0], + nil, val[1], nil) + + result +end + +def _reduce_66(val, _values, result) + result = @builder.keyword_cmd(:next, val[0], + nil, val[1], nil) + + result +end + +def _reduce_67(val, _values, result) + result = @builder.multi_lhs(nil, val[0], nil) + + result +end + +def _reduce_68(val, _values, result) + result = @builder.begin(val[0], val[1], val[2]) + + result +end + +def _reduce_69(val, _values, result) + result = @builder.multi_lhs(nil, val[0], nil) + + result +end + +def _reduce_70(val, _values, result) + result = @builder.multi_lhs(val[0], val[1], val[2]) + + result +end + +# reduce 71 omitted + +def _reduce_72(val, _values, result) + result = val[0]. + push(val[1]) + + result +end + +def _reduce_73(val, _values, result) + result = val[0]. + push(@builder.splat(val[1], val[2])) + + result +end + +def _reduce_74(val, _values, result) + result = val[0]. + push(@builder.splat(val[1], val[2])). + concat(val[4]) + + result +end + +def _reduce_75(val, _values, result) + result = val[0]. + push(@builder.splat(val[1])) + + result +end + +def _reduce_76(val, _values, result) + result = val[0]. + push(@builder.splat(val[1])). + concat(val[3]) + + result +end + +def _reduce_77(val, _values, result) + result = [ @builder.splat(val[0], val[1]) ] + + result +end + +def _reduce_78(val, _values, result) + result = [ @builder.splat(val[0], val[1]), + *val[3] ] + + result +end + +def _reduce_79(val, _values, result) + result = [ @builder.splat(val[0]) ] + + result +end + +def _reduce_80(val, _values, result) + result = [ @builder.splat(val[0]), + *val[2] ] + + result +end + +# reduce 81 omitted + +def _reduce_82(val, _values, result) + result = @builder.begin(val[0], val[1], val[2]) + + result +end + +def _reduce_83(val, _values, result) + result = [ val[0] ] + + result +end + +def _reduce_84(val, _values, result) + result = val[0] << val[1] + + result +end + +def _reduce_85(val, _values, result) + result = [ val[0] ] + + result +end + +def _reduce_86(val, _values, result) + result = val[0] << val[2] + + result +end + +def _reduce_87(val, _values, result) + result = @builder.assignable(val[0]) + + result +end + +def _reduce_88(val, _values, result) + result = @builder.assignable(val[0]) + + result +end + +def _reduce_89(val, _values, result) + result = @builder.index_asgn(val[0], val[1], val[2], val[3]) + + result +end + +def _reduce_90(val, _values, result) + result = @builder.attr_asgn(val[0], val[1], val[2]) + + result +end + +def _reduce_91(val, _values, result) + result = @builder.attr_asgn(val[0], val[1], val[2]) + + result +end + +def _reduce_92(val, _values, result) + result = @builder.attr_asgn(val[0], val[1], val[2]) + + result +end + +def _reduce_93(val, _values, result) + result = @builder.assignable( + @builder.const_fetch(val[0], val[1], val[2])) + + result +end + +def _reduce_94(val, _values, result) + result = @builder.assignable( + @builder.const_global(val[0], val[1])) + + result +end + +def _reduce_95(val, _values, result) + result = @builder.assignable(val[0]) + + result +end + +def _reduce_96(val, _values, result) + result = @builder.assignable(val[0]) + + result +end + +def _reduce_97(val, _values, result) + result = @builder.assignable(val[0]) + + result +end + +def _reduce_98(val, _values, result) + result = @builder.index_asgn(val[0], val[1], val[2], val[3]) + + result +end + +def _reduce_99(val, _values, result) + result = @builder.attr_asgn(val[0], val[1], val[2]) + + result +end + +def _reduce_100(val, _values, result) + result = @builder.attr_asgn(val[0], val[1], val[2]) + + result +end + +def _reduce_101(val, _values, result) + result = @builder.attr_asgn(val[0], val[1], val[2]) + + result +end + +def _reduce_102(val, _values, result) + result = @builder.assignable( + @builder.const_fetch(val[0], val[1], val[2])) + + result +end + +def _reduce_103(val, _values, result) + result = @builder.assignable( + @builder.const_global(val[0], val[1])) + + result +end + +def _reduce_104(val, _values, result) + result = @builder.assignable(val[0]) + + result +end + +def _reduce_105(val, _values, result) + diagnostic :error, :module_name_const, nil, val[0] + + result +end + +# reduce 106 omitted + +def _reduce_107(val, _values, result) + result = @builder.const_global(val[0], val[1]) + + result +end + +def _reduce_108(val, _values, result) + result = @builder.const(val[0]) + + result +end + +def _reduce_109(val, _values, result) + result = @builder.const_fetch(val[0], val[1], val[2]) + + result +end + +# reduce 110 omitted + +# reduce 111 omitted + +# reduce 112 omitted + +# reduce 113 omitted + +# reduce 114 omitted + +def _reduce_115(val, _values, result) + result = @builder.symbol_internal(val[0]) + + result +end + +# reduce 116 omitted + +# reduce 117 omitted + +# reduce 118 omitted + +def _reduce_119(val, _values, result) + result = [ val[0] ] + + result +end + +def _reduce_120(val, _values, result) + @lexer.state = :expr_fname + + result +end + +def _reduce_121(val, _values, result) + result = val[0] << val[3] + + result +end + +# reduce 122 omitted + +# reduce 123 omitted + +# reduce 124 omitted + +# reduce 125 omitted + +# reduce 126 omitted + +# reduce 127 omitted + +# reduce 128 omitted + +# reduce 129 omitted + +# reduce 130 omitted + +# reduce 131 omitted + +# reduce 132 omitted + +# reduce 133 omitted + +# reduce 134 omitted + +# reduce 135 omitted + +# reduce 136 omitted + +# reduce 137 omitted + +# reduce 138 omitted + +# reduce 139 omitted + +# reduce 140 omitted + +# reduce 141 omitted + +# reduce 142 omitted + +# reduce 143 omitted + +# reduce 144 omitted + +# reduce 145 omitted + +# reduce 146 omitted + +# reduce 147 omitted + +# reduce 148 omitted + +# reduce 149 omitted + +# reduce 150 omitted + +# reduce 151 omitted + +# reduce 152 omitted + +# reduce 153 omitted + +# reduce 154 omitted + +# reduce 155 omitted + +# reduce 156 omitted + +# reduce 157 omitted + +# reduce 158 omitted + +# reduce 159 omitted + +# reduce 160 omitted + +# reduce 161 omitted + +# reduce 162 omitted + +# reduce 163 omitted + +# reduce 164 omitted + +# reduce 165 omitted + +# reduce 166 omitted + +# reduce 167 omitted + +# reduce 168 omitted + +# reduce 169 omitted + +# reduce 170 omitted + +# reduce 171 omitted + +# reduce 172 omitted + +# reduce 173 omitted + +# reduce 174 omitted + +# reduce 175 omitted + +# reduce 176 omitted + +# reduce 177 omitted + +# reduce 178 omitted + +# reduce 179 omitted + +# reduce 180 omitted + +# reduce 181 omitted + +# reduce 182 omitted + +# reduce 183 omitted + +# reduce 184 omitted + +# reduce 185 omitted + +# reduce 186 omitted + +# reduce 187 omitted + +# reduce 188 omitted + +# reduce 189 omitted + +# reduce 190 omitted + +# reduce 191 omitted + +def _reduce_192(val, _values, result) + result = @builder.assign(val[0], val[1], val[2]) + + result +end + +def _reduce_193(val, _values, result) + rescue_body = @builder.rescue_body(val[3], + nil, nil, nil, + nil, val[4]) + + rescue_ = @builder.begin_body(val[2], [ rescue_body ]) + + result = @builder.assign(val[0], val[1], rescue_) + + result +end + +def _reduce_194(val, _values, result) + result = @builder.op_assign(val[0], val[1], val[2]) + + result +end + +def _reduce_195(val, _values, result) + rescue_body = @builder.rescue_body(val[3], + nil, nil, nil, + nil, val[4]) + + rescue_ = @builder.begin_body(val[2], [ rescue_body ]) + + result = @builder.op_assign(val[0], val[1], rescue_) + + result +end + +def _reduce_196(val, _values, result) + result = @builder.op_assign( + @builder.index( + val[0], val[1], val[2], val[3]), + val[4], val[5]) + + result +end + +def _reduce_197(val, _values, result) + result = @builder.op_assign( + @builder.call_method( + val[0], val[1], val[2]), + val[3], val[4]) + + result +end + +def _reduce_198(val, _values, result) + result = @builder.op_assign( + @builder.call_method( + val[0], val[1], val[2]), + val[3], val[4]) + + result +end + +def _reduce_199(val, _values, result) + result = @builder.op_assign( + @builder.call_method( + val[0], val[1], val[2]), + val[3], val[4]) + + result +end + +def _reduce_200(val, _values, result) + diagnostic :error, :dynamic_const, nil, val[2], [ val[3] ] + + result +end + +def _reduce_201(val, _values, result) + diagnostic :error, :dynamic_const, nil, val[1], [ val[2] ] + + result +end + +def _reduce_202(val, _values, result) + result = @builder.op_assign(val[0], val[1], val[2]) + + result +end + +def _reduce_203(val, _values, result) + result = @builder.range_inclusive(val[0], val[1], val[2]) + + result +end + +def _reduce_204(val, _values, result) + result = @builder.range_exclusive(val[0], val[1], val[2]) + + result +end + +def _reduce_205(val, _values, result) + result = @builder.binary_op(val[0], val[1], val[2]) + + result +end + +def _reduce_206(val, _values, result) + result = @builder.binary_op(val[0], val[1], val[2]) + + result +end + +def _reduce_207(val, _values, result) + result = @builder.binary_op(val[0], val[1], val[2]) + + result +end + +def _reduce_208(val, _values, result) + result = @builder.binary_op(val[0], val[1], val[2]) + + result +end + +def _reduce_209(val, _values, result) + result = @builder.binary_op(val[0], val[1], val[2]) + + result +end + +def _reduce_210(val, _values, result) + result = @builder.binary_op(val[0], val[1], val[2]) + + result +end + +def _reduce_211(val, _values, result) + result = @builder.unary_op(val[0], + @builder.binary_op( + @builder.integer(val[1]), + val[2], val[3])) + + result +end + +def _reduce_212(val, _values, result) + result = @builder.unary_op(val[0], + @builder.binary_op( + @builder.float(val[1]), + val[2], val[3])) + + result +end + +def _reduce_213(val, _values, result) + result = @builder.unary_op(val[0], val[1]) + + result +end + +def _reduce_214(val, _values, result) + result = @builder.unary_op(val[0], val[1]) + + result +end + +def _reduce_215(val, _values, result) + result = @builder.binary_op(val[0], val[1], val[2]) + + result +end + +def _reduce_216(val, _values, result) + result = @builder.binary_op(val[0], val[1], val[2]) + + result +end + +def _reduce_217(val, _values, result) + result = @builder.binary_op(val[0], val[1], val[2]) + + result +end + +def _reduce_218(val, _values, result) + result = @builder.binary_op(val[0], val[1], val[2]) + + result +end + +def _reduce_219(val, _values, result) + result = @builder.binary_op(val[0], val[1], val[2]) + + result +end + +def _reduce_220(val, _values, result) + result = @builder.binary_op(val[0], val[1], val[2]) + + result +end + +def _reduce_221(val, _values, result) + result = @builder.binary_op(val[0], val[1], val[2]) + + result +end + +def _reduce_222(val, _values, result) + result = @builder.binary_op(val[0], val[1], val[2]) + + result +end + +def _reduce_223(val, _values, result) + result = @builder.binary_op(val[0], val[1], val[2]) + + result +end + +def _reduce_224(val, _values, result) + result = @builder.binary_op(val[0], val[1], val[2]) + + result +end + +def _reduce_225(val, _values, result) + result = @builder.binary_op(val[0], val[1], val[2]) + + result +end + +def _reduce_226(val, _values, result) + result = @builder.match_op(val[0], val[1], val[2]) + + result +end + +def _reduce_227(val, _values, result) + result = @builder.binary_op(val[0], val[1], val[2]) + + result +end + +def _reduce_228(val, _values, result) + result = @builder.not_op(val[0], nil, val[1], nil) + + result +end + +def _reduce_229(val, _values, result) + result = @builder.unary_op(val[0], val[1]) + + result +end + +def _reduce_230(val, _values, result) + result = @builder.binary_op(val[0], val[1], val[2]) + + result +end + +def _reduce_231(val, _values, result) + result = @builder.binary_op(val[0], val[1], val[2]) + + result +end + +def _reduce_232(val, _values, result) + result = @builder.logical_op(:and, val[0], val[1], val[2]) + + result +end + +def _reduce_233(val, _values, result) + result = @builder.logical_op(:or, val[0], val[1], val[2]) + + result +end + +def _reduce_234(val, _values, result) + result = @builder.keyword_cmd(:defined?, val[0], nil, [ val[2] ], nil) + + result +end + +def _reduce_235(val, _values, result) + result = @builder.ternary(val[0], val[1], + val[2], val[4], val[5]) + + result +end + +# reduce 236 omitted + +# reduce 237 omitted + +# reduce 238 omitted + +# reduce 239 omitted + +def _reduce_240(val, _values, result) + result = val[0] << @builder.associate(nil, val[2], nil) + + result +end + +def _reduce_241(val, _values, result) + result = [ @builder.associate(nil, val[0], nil) ] + + result +end + +def _reduce_242(val, _values, result) + result = val + + result +end + +def _reduce_243(val, _values, result) + result = [ nil, [], nil ] + + result +end + +# reduce 244 omitted + +def _reduce_245(val, _values, result) + result = [] + + result +end + +# reduce 246 omitted + +# reduce 247 omitted + +def _reduce_248(val, _values, result) + result = val[0] << @builder.associate(nil, val[2], nil) + + result +end + +def _reduce_249(val, _values, result) + result = [ @builder.associate(nil, val[0], nil) ] + + result +end + +def _reduce_250(val, _values, result) + result = [ val[0] ] + + result +end + +def _reduce_251(val, _values, result) + result = val[0].concat(val[1]) + + result +end + +def _reduce_252(val, _values, result) + result = [ @builder.associate(nil, val[0], nil) ] + result.concat(val[1]) + + result +end + +def _reduce_253(val, _values, result) + assocs = @builder.associate(nil, val[2], nil) + result = val[0] << assocs + result.concat(val[3]) + + result +end + +def _reduce_254(val, _values, result) + result = [ val[0] ] + + result +end + +def _reduce_255(val, _values, result) + result = @lexer.cmdarg.dup + @lexer.cmdarg.push(true) + + result +end + +def _reduce_256(val, _values, result) + @lexer.cmdarg = val[0] + + result = val[1] + + result +end + +def _reduce_257(val, _values, result) + result = @builder.block_pass(val[0], val[1]) + + result +end + +def _reduce_258(val, _values, result) + result = [ val[1] ] + + result +end + +def _reduce_259(val, _values, result) + result = [] + + result +end + +def _reduce_260(val, _values, result) + result = [ val[0] ] + + result +end + +def _reduce_261(val, _values, result) + result = [ @builder.splat(val[0], val[1]) ] + + result +end + +def _reduce_262(val, _values, result) + result = val[0] << val[2] + + result +end + +def _reduce_263(val, _values, result) + result = val[0] << @builder.splat(val[2], val[3]) + + result +end + +def _reduce_264(val, _values, result) + result = val[0] << val[2] + + result +end + +def _reduce_265(val, _values, result) + result = val[0] << @builder.splat(val[2], val[3]) + + result +end + +def _reduce_266(val, _values, result) + result = [ @builder.splat(val[0], val[1]) ] + + result +end + +# reduce 267 omitted + +# reduce 268 omitted + +# reduce 269 omitted + +# reduce 270 omitted + +# reduce 271 omitted + +# reduce 272 omitted + +# reduce 273 omitted + +# reduce 274 omitted + +def _reduce_275(val, _values, result) + result = @builder.call_method(nil, nil, val[0]) + + result +end + +def _reduce_276(val, _values, result) + result = @builder.begin_keyword(val[0], val[1], val[2]) + + result +end + +def _reduce_277(val, _values, result) + result = @lexer.cmdarg.dup + @lexer.cmdarg.clear + + result +end + +def _reduce_278(val, _values, result) + @lexer.state = :expr_endarg + + result +end + +def _reduce_279(val, _values, result) + @lexer.cmdarg = val[1] + + result = @builder.begin(val[0], val[2], val[5]) + + result +end + +def _reduce_280(val, _values, result) + result = @builder.begin(val[0], val[1], val[2]) + + result +end + +def _reduce_281(val, _values, result) + result = @builder.const_fetch(val[0], val[1], val[2]) + + result +end + +def _reduce_282(val, _values, result) + result = @builder.const_global(val[0], val[1]) + + result +end + +def _reduce_283(val, _values, result) + result = @builder.array(val[0], val[1], val[2]) + + result +end + +def _reduce_284(val, _values, result) + result = @builder.associate(val[0], val[1], val[2]) + + result +end + +def _reduce_285(val, _values, result) + result = @builder.keyword_cmd(:return, val[0]) + + result +end + +def _reduce_286(val, _values, result) + result = @builder.keyword_cmd(:yield, val[0], val[1], val[2], val[3]) + + result +end + +def _reduce_287(val, _values, result) + result = @builder.keyword_cmd(:yield, val[0], val[1], [], val[2]) + + result +end + +def _reduce_288(val, _values, result) + result = @builder.keyword_cmd(:yield, val[0]) + + result +end + +def _reduce_289(val, _values, result) + result = @builder.keyword_cmd(:defined?, val[0], + val[2], [ val[3] ], val[4]) + + result +end + +def _reduce_290(val, _values, result) + result = @builder.not_op(val[0], val[1], val[2], val[3]) + + result +end + +def _reduce_291(val, _values, result) + result = @builder.not_op(val[0], val[1], nil, val[2]) + + result +end + +def _reduce_292(val, _values, result) + method_call = @builder.call_method(nil, nil, val[0]) + + begin_t, args, body, end_t = val[1] + result = @builder.block(method_call, + begin_t, args, body, end_t) + + result +end + +# reduce 293 omitted + +def _reduce_294(val, _values, result) + begin_t, args, body, end_t = val[1] + result = @builder.block(val[0], + begin_t, args, body, end_t) + + result +end + +def _reduce_295(val, _values, result) + result = @context.dup + @context.in_lambda = true + + result +end + +def _reduce_296(val, _values, result) + lambda_call = @builder.call_lambda(val[0]) + + args, (begin_t, body, end_t) = val[2] + result = @builder.block(lambda_call, + begin_t, args, body, end_t) + + @context.in_lambda = val[1].in_lambda + + result +end + +def _reduce_297(val, _values, result) + else_t, else_ = val[4] + result = @builder.condition(val[0], val[1], val[2], + val[3], else_t, + else_, val[5]) + + result +end + +def _reduce_298(val, _values, result) + else_t, else_ = val[4] + result = @builder.condition(val[0], val[1], val[2], + else_, else_t, + val[3], val[5]) + + result +end + +def _reduce_299(val, _values, result) + @lexer.cond.push(true) + + result +end + +def _reduce_300(val, _values, result) + @lexer.cond.pop + + result +end + +def _reduce_301(val, _values, result) + result = @builder.loop(:while, val[0], val[2], val[3], + val[5], val[6]) + + result +end + +def _reduce_302(val, _values, result) + @lexer.cond.push(true) + + result +end + +def _reduce_303(val, _values, result) + @lexer.cond.pop + + result +end + +def _reduce_304(val, _values, result) + result = @builder.loop(:until, val[0], val[2], val[3], + val[5], val[6]) + + result +end + +def _reduce_305(val, _values, result) + *when_bodies, (else_t, else_body) = *val[3] + + result = @builder.case(val[0], val[1], + when_bodies, else_t, else_body, + val[4]) + + result +end + +def _reduce_306(val, _values, result) + *when_bodies, (else_t, else_body) = *val[2] + + result = @builder.case(val[0], nil, + when_bodies, else_t, else_body, + val[3]) + + result +end + +def _reduce_307(val, _values, result) + @lexer.cond.push(true) + + result +end + +def _reduce_308(val, _values, result) + @lexer.cond.pop + + result +end + +def _reduce_309(val, _values, result) + result = @builder.for(val[0], val[1], + val[2], val[4], + val[5], val[7], val[8]) + + result +end + +def _reduce_310(val, _values, result) + local_push + @context.in_class = true + + result +end + +def _reduce_311(val, _values, result) + k_class, ctx = val[0] + if @context.in_def + diagnostic :error, :class_in_def, nil, k_class + end + + lt_t, superclass = val[2] + result = @builder.def_class(k_class, val[1], + lt_t, superclass, + val[4], val[5]) + + local_pop + @context.in_class = ctx.in_class + + result +end + +def _reduce_312(val, _values, result) + @context.in_def = false + @context.in_class = false + local_push + + result +end + +def _reduce_313(val, _values, result) + k_class, ctx = val[0] + result = @builder.def_sclass(k_class, val[1], val[2], + val[5], val[6]) + + local_pop + @context.in_def = ctx.in_def + @context.in_class = ctx.in_class + + result +end + +def _reduce_314(val, _values, result) + @context.in_class = true + local_push + + result +end + +def _reduce_315(val, _values, result) + k_mod, ctx = val[0] + if @context.in_def + diagnostic :error, :module_in_def, nil, k_mod + end + + result = @builder.def_module(k_mod, val[1], + val[3], val[4]) + + local_pop + @context.in_class = ctx.in_class + + result +end + +def _reduce_316(val, _values, result) + local_push + result = context.dup + @context.in_def = true + + result +end + +def _reduce_317(val, _values, result) + result = @builder.def_method(val[0], val[1], + val[3], val[4], val[5]) + + local_pop + @context.in_def = val[2].in_def + + result +end + +def _reduce_318(val, _values, result) + @lexer.state = :expr_fname + + result +end + +def _reduce_319(val, _values, result) + local_push + result = context.dup + @context.in_def = true + + result +end + +def _reduce_320(val, _values, result) + result = @builder.def_singleton(val[0], val[1], val[2], + val[4], val[6], val[7], val[8]) + + local_pop + @context.in_def = val[5].in_def + + result +end + +def _reduce_321(val, _values, result) + result = @builder.keyword_cmd(:break, val[0]) + + result +end + +def _reduce_322(val, _values, result) + result = @builder.keyword_cmd(:next, val[0]) + + result +end + +def _reduce_323(val, _values, result) + result = @builder.keyword_cmd(:redo, val[0]) + + result +end + +def _reduce_324(val, _values, result) + result = @builder.keyword_cmd(:retry, val[0]) + + result +end + +# reduce 325 omitted + +def _reduce_326(val, _values, result) + result = [ val[0], @context.dup ] + + result +end + +def _reduce_327(val, _values, result) + result = [ val[0], @context.dup ] + + result +end + +# reduce 328 omitted + +# reduce 329 omitted + +def _reduce_330(val, _values, result) + result = val[1] + + result +end + +# reduce 331 omitted + +# reduce 332 omitted + +# reduce 333 omitted + +def _reduce_334(val, _values, result) + else_t, else_ = val[4] + result = [ val[0], + @builder.condition(val[0], val[1], val[2], + val[3], else_t, + else_, nil), + ] + + result +end + +# reduce 335 omitted + +def _reduce_336(val, _values, result) + result = val + + result +end + +# reduce 337 omitted + +# reduce 338 omitted + +def _reduce_339(val, _values, result) + @static_env.declare val[0][0] + + result = @builder.arg(val[0]) + + result +end + +def _reduce_340(val, _values, result) + result = @builder.multi_lhs(val[0], val[1], val[2]) + + result +end + +def _reduce_341(val, _values, result) + result = [ val[0] ] + + result +end + +def _reduce_342(val, _values, result) + result = val[0] << val[2] + + result +end + +# reduce 343 omitted + +def _reduce_344(val, _values, result) + @static_env.declare val[3][0] + + result = val[0]. + push(@builder.restarg(val[2], val[3])) + + result +end + +def _reduce_345(val, _values, result) + @static_env.declare val[3][0] + + result = val[0]. + push(@builder.restarg(val[2], val[3])). + concat(val[5]) + + result +end + +def _reduce_346(val, _values, result) + result = val[0]. + push(@builder.restarg(val[2])) + + result +end + +def _reduce_347(val, _values, result) + result = val[0]. + push(@builder.restarg(val[2])). + concat(val[4]) + + result +end + +def _reduce_348(val, _values, result) + @static_env.declare val[1][0] + + result = [ @builder.restarg(val[0], val[1]) ] + + result +end + +def _reduce_349(val, _values, result) + @static_env.declare val[1][0] + + result = [ @builder.restarg(val[0], val[1]), + *val[3] ] + + result +end + +def _reduce_350(val, _values, result) + result = [ @builder.restarg(val[0]) ] + + result +end + +def _reduce_351(val, _values, result) + result = [ @builder.restarg(val[0]), + *val[2] ] + + result +end + +def _reduce_352(val, _values, result) + result = val[0]. + concat(val[2]). + concat(val[4]). + concat(val[5]) + + result +end + +def _reduce_353(val, _values, result) + result = val[0]. + concat(val[2]). + concat(val[4]). + concat(val[6]). + concat(val[7]) + + result +end + +def _reduce_354(val, _values, result) + result = val[0]. + concat(val[2]). + concat(val[3]) + + result +end + +def _reduce_355(val, _values, result) + result = val[0]. + concat(val[2]). + concat(val[4]). + concat(val[5]) + + result +end + +def _reduce_356(val, _values, result) + result = val[0]. + concat(val[2]). + concat(val[3]) + + result +end + +# reduce 357 omitted + +def _reduce_358(val, _values, result) + result = val[0]. + concat(val[2]). + concat(val[4]). + concat(val[5]) + + result +end + +def _reduce_359(val, _values, result) + if val[1].empty? && val[0].size == 1 + result = [@builder.procarg0(val[0][0])] + else + result = val[0].concat(val[1]) + end + + result +end + +def _reduce_360(val, _values, result) + result = val[0]. + concat(val[2]). + concat(val[3]) + + result +end + +def _reduce_361(val, _values, result) + result = val[0]. + concat(val[2]). + concat(val[4]). + concat(val[5]) + + result +end + +def _reduce_362(val, _values, result) + result = val[0]. + concat(val[1]) + + result +end + +def _reduce_363(val, _values, result) + result = val[0]. + concat(val[2]). + concat(val[3]) + + result +end + +def _reduce_364(val, _values, result) + result = val[0]. + concat(val[1]) + + result +end + +def _reduce_365(val, _values, result) + result = val[0]. + concat(val[2]). + concat(val[3]) + + result +end + +def _reduce_366(val, _values, result) + result = [ val[0] ] + + result +end + +def _reduce_367(val, _values, result) + result = @builder.args(nil, [], nil) + + result +end + +def _reduce_368(val, _values, result) + @lexer.state = :expr_value + + result +end + +def _reduce_369(val, _values, result) + result = @builder.args(val[0], val[1], val[2]) + + result +end + +def _reduce_370(val, _values, result) + result = @builder.args(val[0], [], val[0]) + + result +end + +def _reduce_371(val, _values, result) + result = @builder.args(val[0], val[1].concat(val[2]), val[3]) + + result +end + +def _reduce_372(val, _values, result) + result = [] + + result +end + +def _reduce_373(val, _values, result) + result = val[1] + + result +end + +def _reduce_374(val, _values, result) + result = [ val[0] ] + + result +end + +def _reduce_375(val, _values, result) + result = val[0] << val[2] + + result +end + +def _reduce_376(val, _values, result) + @static_env.declare val[0][0] + result = @builder.shadowarg(val[0]) + + result +end + +# reduce 377 omitted + +def _reduce_378(val, _values, result) + @static_env.extend_dynamic + + result +end + +def _reduce_379(val, _values, result) + result = [ val[1], val[2] ] + + @static_env.unextend + + result +end + +def _reduce_380(val, _values, result) + result = @builder.args(val[0], val[1].concat(val[2]), val[3]) + + result +end + +def _reduce_381(val, _values, result) + result = @builder.args(nil, val[0], nil) + + result +end + +def _reduce_382(val, _values, result) + result = @context.dup + @context.in_lambda = true + + result +end + +def _reduce_383(val, _values, result) + result = [ val[0], val[2], val[3] ] + @context.in_lambda = val[1].in_lambda + + result +end + +def _reduce_384(val, _values, result) + result = @context.dup + @context.in_lambda = true + + result +end + +def _reduce_385(val, _values, result) + result = [ val[0], val[2], val[3] ] + @context.in_lambda = val[1].in_lambda + + result +end + +def _reduce_386(val, _values, result) + @static_env.extend_dynamic + result = @context.dup + @context.in_block = true + + result +end + +def _reduce_387(val, _values, result) + result = [ val[0], val[2], val[3], val[4] ] + + @static_env.unextend + @context.in_block = val[1].in_block + + result +end + +def _reduce_388(val, _values, result) + begin_t, block_args, body, end_t = val[1] + result = @builder.block(val[0], + begin_t, block_args, body, end_t) + + result +end + +def _reduce_389(val, _values, result) + lparen_t, args, rparen_t = val[3] + result = @builder.call_method(val[0], val[1], val[2], + lparen_t, args, rparen_t) + + result +end + +def _reduce_390(val, _values, result) + lparen_t, args, rparen_t = val[3] + result = @builder.call_method(val[0], val[1], val[2], + lparen_t, args, rparen_t) + + result +end + +def _reduce_391(val, _values, result) + lparen_t, args, rparen_t = val[1] + result = @builder.call_method(nil, nil, val[0], + lparen_t, args, rparen_t) + + result +end + +def _reduce_392(val, _values, result) + lparen_t, args, rparen_t = val[3] + result = @builder.call_method(val[0], val[1], val[2], + lparen_t, args, rparen_t) + + result +end + +def _reduce_393(val, _values, result) + lparen_t, args, rparen_t = val[3] + result = @builder.call_method(val[0], val[1], val[2], + lparen_t, args, rparen_t) + + result +end + +def _reduce_394(val, _values, result) + result = @builder.call_method(val[0], val[1], val[2]) + + result +end + +def _reduce_395(val, _values, result) + lparen_t, args, rparen_t = val[2] + result = @builder.call_method(val[0], val[1], nil, + lparen_t, args, rparen_t) + + result +end + +def _reduce_396(val, _values, result) + lparen_t, args, rparen_t = val[2] + result = @builder.call_method(val[0], val[1], nil, + lparen_t, args, rparen_t) + + result +end + +def _reduce_397(val, _values, result) + lparen_t, args, rparen_t = val[1] + result = @builder.keyword_cmd(:super, val[0], + lparen_t, args, rparen_t) + + result +end + +def _reduce_398(val, _values, result) + result = @builder.keyword_cmd(:zsuper, val[0]) + + result +end + +def _reduce_399(val, _values, result) + result = @builder.index(val[0], val[1], val[2], val[3]) + + result +end + +def _reduce_400(val, _values, result) + @static_env.extend_dynamic + result = @context.dup + @context.in_block = true + + result +end + +def _reduce_401(val, _values, result) + result = [ val[0], val[2], val[3], val[4] ] + + @static_env.unextend + @context.in_block = val[1].in_block + + result +end + +def _reduce_402(val, _values, result) + @static_env.extend_dynamic + result = @context.dup + @context.in_block = true + + result +end + +def _reduce_403(val, _values, result) + result = [ val[0], val[2], val[3], val[4] ] + + @static_env.unextend + @context.in_block = val[1].in_block + + result +end + +def _reduce_404(val, _values, result) + result = [ @builder.when(val[0], val[1], val[2], val[3]), + *val[4] ] + + result +end + +def _reduce_405(val, _values, result) + result = [ val[0] ] + + result +end + +# reduce 406 omitted + +def _reduce_407(val, _values, result) + assoc_t, exc_var = val[2] + + if val[1] + exc_list = @builder.array(nil, val[1], nil) + end + + result = [ @builder.rescue_body(val[0], + exc_list, assoc_t, exc_var, + val[3], val[4]), + *val[5] ] + + result +end + +def _reduce_408(val, _values, result) + result = [] + + result +end + +def _reduce_409(val, _values, result) + result = [ val[0] ] + + result +end + +# reduce 410 omitted + +# reduce 411 omitted + +def _reduce_412(val, _values, result) + result = [ val[0], val[1] ] + + result +end + +# reduce 413 omitted + +def _reduce_414(val, _values, result) + result = [ val[0], val[1] ] + + result +end + +# reduce 415 omitted + +# reduce 416 omitted + +# reduce 417 omitted + +# reduce 418 omitted + +def _reduce_419(val, _values, result) + result = @builder.string_compose(nil, val[0], nil) + + result +end + +def _reduce_420(val, _values, result) + result = [ val[0] ] + + result +end + +def _reduce_421(val, _values, result) + result = val[0] << val[1] + + result +end + +def _reduce_422(val, _values, result) + result = @builder.string_compose(val[0], val[1], val[2]) + + result +end + +def _reduce_423(val, _values, result) + result = @builder.string(val[0]) + + result +end + +def _reduce_424(val, _values, result) + result = @builder.character(val[0]) + + result +end + +def _reduce_425(val, _values, result) + result = @builder.xstring_compose(val[0], val[1], val[2]) + + result +end + +def _reduce_426(val, _values, result) + opts = @builder.regexp_options(val[3]) + result = @builder.regexp_compose(val[0], val[1], val[2], opts) + + result +end + +def _reduce_427(val, _values, result) + result = @builder.words_compose(val[0], val[1], val[2]) + + result +end + +def _reduce_428(val, _values, result) + result = [] + + result +end + +def _reduce_429(val, _values, result) + result = val[0] << @builder.word(val[1]) + + result +end + +def _reduce_430(val, _values, result) + result = [ val[0] ] + + result +end + +def _reduce_431(val, _values, result) + result = val[0] << val[1] + + result +end + +def _reduce_432(val, _values, result) + result = @builder.words_compose(val[0], val[1], val[2]) + + result +end + +def _reduce_433(val, _values, result) + result = [] + + result +end + +def _reduce_434(val, _values, result) + result = val[0] << @builder.string_internal(val[1]) + + result +end + +def _reduce_435(val, _values, result) + result = [] + + result +end + +def _reduce_436(val, _values, result) + result = val[0] << val[1] + + result +end + +def _reduce_437(val, _values, result) + result = [] + + result +end + +def _reduce_438(val, _values, result) + result = val[0] << val[1] + + result +end + +def _reduce_439(val, _values, result) + result = [] + + result +end + +def _reduce_440(val, _values, result) + result = val[0] << val[1] + + result +end + +def _reduce_441(val, _values, result) + result = @builder.string_internal(val[0]) + + result +end + +def _reduce_442(val, _values, result) + result = val[1] + + result +end + +def _reduce_443(val, _values, result) + @lexer.cond.push(false) + @lexer.cmdarg.push(false) + + result +end + +def _reduce_444(val, _values, result) + @lexer.cond.lexpop + @lexer.cmdarg.lexpop + + result = @builder.begin(val[0], val[2], val[3]) + + result +end + +def _reduce_445(val, _values, result) + result = @builder.gvar(val[0]) + + result +end + +def _reduce_446(val, _values, result) + result = @builder.ivar(val[0]) + + result +end + +def _reduce_447(val, _values, result) + result = @builder.cvar(val[0]) + + result +end + +# reduce 448 omitted + +def _reduce_449(val, _values, result) + result = @builder.symbol(val[0]) + + result +end + +def _reduce_450(val, _values, result) + result = @builder.symbol_compose(val[0], val[1], val[2]) + + result +end + +def _reduce_451(val, _values, result) + result = @builder.integer(val[0]) + + result +end + +def _reduce_452(val, _values, result) + result = @builder.float(val[0]) + + result +end + +def _reduce_453(val, _values, result) + num = @builder.integer(val[1]) + if @builder.respond_to? :negate + # AST builder interface compatibility + result = @builder.negate(val[0], num) + else + result = @builder.unary_num(val[0], num) + end + + result +end + +def _reduce_454(val, _values, result) + num = @builder.float(val[1]) + if @builder.respond_to? :negate + # AST builder interface compatibility + result = @builder.negate(val[0], num) + else + result = @builder.unary_num(val[0], num) + end + + result +end + +def _reduce_455(val, _values, result) + result = @builder.ident(val[0]) + + result +end + +def _reduce_456(val, _values, result) + result = @builder.ivar(val[0]) + + result +end + +def _reduce_457(val, _values, result) + result = @builder.gvar(val[0]) + + result +end + +def _reduce_458(val, _values, result) + result = @builder.const(val[0]) + + result +end + +def _reduce_459(val, _values, result) + result = @builder.cvar(val[0]) + + result +end + +def _reduce_460(val, _values, result) + result = @builder.nil(val[0]) + + result +end + +def _reduce_461(val, _values, result) + result = @builder.self(val[0]) + + result +end + +def _reduce_462(val, _values, result) + result = @builder.true(val[0]) + + result +end + +def _reduce_463(val, _values, result) + result = @builder.false(val[0]) + + result +end + +def _reduce_464(val, _values, result) + result = @builder.__FILE__(val[0]) + + result +end + +def _reduce_465(val, _values, result) + result = @builder.__LINE__(val[0]) + + result +end + +def _reduce_466(val, _values, result) + result = @builder.__ENCODING__(val[0]) + + result +end + +def _reduce_467(val, _values, result) + result = @builder.accessible(val[0]) + + result +end + +def _reduce_468(val, _values, result) + result = @builder.accessible(val[0]) + + result +end + +def _reduce_469(val, _values, result) + result = @builder.assignable(val[0]) + + result +end + +def _reduce_470(val, _values, result) + result = @builder.assignable(val[0]) + + result +end + +def _reduce_471(val, _values, result) + result = @builder.nth_ref(val[0]) + + result +end + +def _reduce_472(val, _values, result) + result = @builder.back_ref(val[0]) + + result +end + +def _reduce_473(val, _values, result) + result = nil + + result +end + +def _reduce_474(val, _values, result) + result = [ val[0], val[1] ] + + result +end + +def _reduce_475(val, _values, result) + yyerrok + result = nil + + result +end + +def _reduce_476(val, _values, result) + result = @builder.args(val[0], val[1], val[2]) + + @lexer.state = :expr_value + + result +end + +def _reduce_477(val, _values, result) + result = @builder.args(nil, val[0], nil) + + result +end + +def _reduce_478(val, _values, result) + result = val[0]. + concat(val[2]). + concat(val[4]). + concat(val[5]) + + result +end + +def _reduce_479(val, _values, result) + result = val[0]. + concat(val[2]). + concat(val[4]). + concat(val[6]). + concat(val[7]) + + result +end + +def _reduce_480(val, _values, result) + result = val[0]. + concat(val[2]). + concat(val[3]) + + result +end + +def _reduce_481(val, _values, result) + result = val[0]. + concat(val[2]). + concat(val[4]). + concat(val[5]) + + result +end + +def _reduce_482(val, _values, result) + result = val[0]. + concat(val[2]). + concat(val[3]) + + result +end + +def _reduce_483(val, _values, result) + result = val[0]. + concat(val[2]). + concat(val[4]). + concat(val[5]) + + result +end + +def _reduce_484(val, _values, result) + result = val[0]. + concat(val[1]) + + result +end + +def _reduce_485(val, _values, result) + result = val[0]. + concat(val[2]). + concat(val[3]) + + result +end + +def _reduce_486(val, _values, result) + result = val[0]. + concat(val[2]). + concat(val[4]). + concat(val[5]) + + result +end + +def _reduce_487(val, _values, result) + result = val[0]. + concat(val[1]) + + result +end + +def _reduce_488(val, _values, result) + result = val[0]. + concat(val[2]). + concat(val[3]) + + result +end + +def _reduce_489(val, _values, result) + result = val[0]. + concat(val[1]) + + result +end + +def _reduce_490(val, _values, result) + result = val[0]. + concat(val[2]). + concat(val[3]) + + result +end + +def _reduce_491(val, _values, result) + result = [ val[0] ] + + result +end + +def _reduce_492(val, _values, result) + result = [] + + result +end + +def _reduce_493(val, _values, result) + diagnostic :error, :argument_const, nil, val[0] + + result +end + +def _reduce_494(val, _values, result) + diagnostic :error, :argument_ivar, nil, val[0] + + result +end + +def _reduce_495(val, _values, result) + diagnostic :error, :argument_gvar, nil, val[0] + + result +end + +def _reduce_496(val, _values, result) + diagnostic :error, :argument_cvar, nil, val[0] + + result +end + +# reduce 497 omitted + +# reduce 498 omitted + +def _reduce_499(val, _values, result) + @static_env.declare val[0][0] + + result = @builder.arg(val[0]) + + result +end + +def _reduce_500(val, _values, result) + result = @builder.multi_lhs(val[0], val[1], val[2]) + + result +end + +def _reduce_501(val, _values, result) + result = [ val[0] ] + + result +end + +def _reduce_502(val, _values, result) + result = val[0] << val[2] + + result +end + +def _reduce_503(val, _values, result) + @static_env.declare val[0][0] + + result = @builder.optarg(val[0], val[1], val[2]) + + result +end + +def _reduce_504(val, _values, result) + @static_env.declare val[0][0] + + result = @builder.optarg(val[0], val[1], val[2]) + + result +end + +def _reduce_505(val, _values, result) + result = [ val[0] ] + + result +end + +def _reduce_506(val, _values, result) + result = val[0] << val[2] + + result +end + +def _reduce_507(val, _values, result) + result = [ val[0] ] + + result +end + +def _reduce_508(val, _values, result) + result = val[0] << val[2] + + result +end + +# reduce 509 omitted + +# reduce 510 omitted + +def _reduce_511(val, _values, result) + @static_env.declare val[1][0] + + result = [ @builder.restarg(val[0], val[1]) ] + + result +end + +def _reduce_512(val, _values, result) + result = [ @builder.restarg(val[0]) ] + + result +end + +# reduce 513 omitted + +# reduce 514 omitted + +def _reduce_515(val, _values, result) + @static_env.declare val[1][0] + + result = @builder.blockarg(val[0], val[1]) + + result +end + +def _reduce_516(val, _values, result) + result = [ val[1] ] + + result +end + +def _reduce_517(val, _values, result) + result = [] + + result +end + +# reduce 518 omitted + +def _reduce_519(val, _values, result) + result = val[1] + + result +end + +def _reduce_520(val, _values, result) + result = [] + + result +end + +# reduce 521 omitted + +def _reduce_522(val, _values, result) + result = [ val[0] ] + + result +end + +def _reduce_523(val, _values, result) + result = val[0] << val[2] + + result +end + +def _reduce_524(val, _values, result) + result = @builder.pair(val[0], val[1], val[2]) + + result +end + +def _reduce_525(val, _values, result) + result = @builder.pair_keyword(val[0], val[1]) + + result +end + +# reduce 526 omitted + +# reduce 527 omitted + +# reduce 528 omitted + +# reduce 529 omitted + +# reduce 530 omitted + +# reduce 531 omitted + +# reduce 532 omitted + +# reduce 533 omitted + +# reduce 534 omitted + +# reduce 535 omitted + +# reduce 536 omitted + +# reduce 537 omitted + +# reduce 538 omitted + +# reduce 539 omitted + +# reduce 540 omitted + +# reduce 541 omitted + +def _reduce_542(val, _values, result) + result = val[1] + + result +end + +def _reduce_543(val, _values, result) + result = val[1] + + result +end + +# reduce 544 omitted + +# reduce 545 omitted + +# reduce 546 omitted + +def _reduce_547(val, _values, result) + yyerrok + + result +end + +# reduce 548 omitted + +# reduce 549 omitted + +# reduce 550 omitted + +def _reduce_551(val, _values, result) + result = nil + + result +end + +def _reduce_none(val, _values, result) + val[0] +end + + end # class Ruby19 + end # module Parser diff --git a/vendor/bundle/ruby/3.1.0/gems/parser-3.1.2.0/lib/parser/ruby20.rb b/vendor/bundle/ruby/3.1.0/gems/parser-3.1.2.0/lib/parser/ruby20.rb new file mode 100644 index 000000000..e5481be08 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/parser-3.1.2.0/lib/parser/ruby20.rb @@ -0,0 +1,6563 @@ +# -*- encoding:utf-8; warn-indent:false; frozen_string_literal: true -*- +# +# DO NOT MODIFY!!!! +# This file is automatically generated by Racc 1.4.15 +# from Racc grammer file "". +# + +require 'racc/parser.rb' + + +require 'parser' + +module Parser + class Ruby20 < Parser::Base + + + def version + 20 + end + + def default_encoding + Encoding::UTF_8 + end + + def local_push + @static_env.extend_static + @lexer.cmdarg.push(false) + @lexer.cond.push(false) + end + + def local_pop + @static_env.unextend + @lexer.cmdarg.pop + @lexer.cond.pop + end +##### State transition tables begin ### + +clist = [ +'-476,5,74,75,71,9,57,-476,-476,-476,63,64,-476,-476,-476,67,-476,65', +'66,68,30,31,72,73,-476,267,-476,-476,-476,29,28,27,100,99,101,102,-476', +'-476,19,-476,-476,-476,-476,-476,8,45,7,10,104,103,105,94,56,96,95,97', +'962,98,106,107,556,92,93,42,43,41,-476,-476,-476,-476,-476,-476,-476', +'-476,-476,-476,-476,-476,-476,-476,108,690,-476,-476,-476,40,-476,-476', +'33,-100,-476,58,59,-476,-476,60,-476,35,-476,267,-476,44,-476,-476,216', +'-476,-476,-476,-476,-476,20,-476,266,-476,-98,91,81,84,85,614,86,88', +'87,89,-286,745,-101,-476,82,90,-476,-476,-476,-476,-572,-476,62,-476', +'83,-476,-103,-572,-572,-572,690,217,-572,-572,-572,577,-572,-99,614', +'-106,613,120,-102,213,214,-572,-572,-572,-572,-105,-286,535,555,-100', +'535,535,-572,-572,579,-572,-572,-572,-572,-572,-101,535,535,259,213', +'214,789,112,266,613,260,112,111,-101,525,205,111,527,614,690,-91,512', +'-572,-572,-572,-572,-572,-572,-572,-572,-572,-572,-572,-572,-572,-572', +'-103,576,-572,-572,-572,206,747,-572,614,-89,-572,213,214,-572,-572', +'207,-572,613,-572,-568,-572,267,-572,-572,578,-572,-572,-572,-572,-572', +'-101,-572,-572,-572,112,-101,-94,112,-105,111,-92,212,111,613,-103,441', +'-90,-572,-97,-103,-572,-572,-572,-572,-289,-572,256,-572,-96,-102,-102', +'-289,-289,-289,-491,-102,-289,-289,-289,112,-289,-100,112,112,111,820', +'-100,111,111,788,-289,-289,-289,112,112,262,-92,112,111,111,-289,-289', +'111,-289,-289,-289,-289,-289,-106,-102,314,-104,-94,209,564,217,-92', +'267,266,-94,210,213,214,213,214,525,315,-99,524,208,-289,-289,-289,-289', +'-289,-289,-289,-289,-289,-289,-289,-289,-289,-289,217,564,-289,-289', +'-289,-490,748,-289,-94,384,-289,-94,-92,-289,-289,-92,-289,-94,-289', +'564,-289,-92,-289,-289,746,-289,-289,-289,-289,-289,-568,-289,-569,-289', +'566,565,807,262,666,665,664,780,667,541,722,564,838,-289,-565,564,-289', +'-289,-289,-289,-572,-289,397,-289,-98,-104,266,-572,-572,-572,440,566', +'565,-572,-572,237,-572,217,-84,217,-93,724,-95,-103,-70,-572,-485,-479', +'-566,566,565,567,81,-485,-479,442,-572,-572,731,-572,-572,-572,-572', +'-572,82,-100,-476,234,507,508,443,236,235,-476,83,566,565,562,-565,566', +'565,575,-476,216,885,474,-572,-572,-572,-572,-572,-572,-572,-572,-572', +'-572,-572,-572,-572,-572,-479,-565,-572,-572,-572,-91,598,-479,-476', +'512,-572,-100,-566,-572,564,-476,-479,483,-572,485,-572,564,-572,-572', +'-572,-572,-572,-572,-572,-572,-289,-572,-572,-572,487,-566,547,-289', +'-289,-289,548,551,-490,-289,-289,237,-289,-572,917,525,-572,-572,527', +'-93,-481,-572,-96,552,-414,-102,112,-481,-105,-572,494,111,-289,-289', +'515,-289,-289,-289,-289,-289,-69,516,-572,234,566,565,580,236,235,-572', +'439,566,565,571,-568,-89,217,525,-572,966,527,-98,-289,-289,-289,-289', +'-289,-289,-289,-289,-289,-289,-289,-289,-289,-289,-414,-572,-289,-289', +'-289,-572,597,-414,217,112,-289,497,-572,-289,111,211,-414,-568,-289', +'564,-289,-572,-289,-289,498,-289,-289,-289,-289,-289,-479,-289,505,-289', +'-491,-414,271,-479,-479,-479,-572,592,-479,-479,-479,-489,-479,-289', +'213,214,-289,-289,-489,-95,-479,-289,-479,-479,-479,-104,112,-489,-97', +'815,780,111,-479,-479,-106,-479,-479,-479,-479,-479,807,-482,666,665', +'664,-289,667,-90,-482,566,565,569,-289,-99,-92,683,682,-569,217,593', +'-101,-289,-479,-479,-479,-479,-479,-479,-479,-479,-479,-479,-479,-479', +'-479,-479,262,762,-479,-479,-479,-290,-479,-479,437,509,-479,675,-290', +'-479,-479,438,-479,513,-479,514,-479,-290,-479,-479,439,-479,-479,-479', +'-479,-479,-94,-479,-489,-479,-487,-486,-103,237,112,-489,217,-487,-486', +'111,683,682,981,-479,-489,676,-479,-479,-479,-479,-574,-479,528,-479', +'259,-479,529,-574,-574,-574,673,260,-574,-574,-574,807,-574,666,665', +'664,675,667,-488,237,-483,-574,-574,-574,-574,-488,112,-483,815,780', +'487,111,-574,-574,-488,-574,-574,-574,-574,-574,-484,112,213,214,541', +'237,111,-484,803,683,682,234,316,317,676,236,235,806,232,233,386,545', +'-574,-574,-574,-574,-574,-574,-574,-574,-574,-574,-574,-574,-574,-574', +'546,234,-574,-574,-574,236,235,-574,232,233,-574,581,584,-574,-574,-263', +'-574,586,-574,217,-574,590,-574,-574,591,-574,-574,-574,-574,-574,543', +'-574,-574,-574,262,601,807,544,666,665,664,604,667,237,237,237,542,-574', +'237,551,-574,-574,-574,-574,217,-574,550,-574,5,74,75,71,9,57,394,552', +'217,63,64,396,395,217,67,803,65,66,68,30,31,72,73,-84,943,632,217,518', +'29,28,27,100,99,101,102,643,807,19,666,665,664,649,667,8,45,7,10,104', +'103,105,94,56,96,95,97,650,98,106,107,551,92,93,42,43,41,807,917,666', +'665,664,652,667,-290,803,807,552,666,665,664,-290,667,686,806,541,40', +'-279,693,33,-290,721,58,59,-279,725,60,726,35,-264,732,474,44,-279,803', +'474,807,217,666,665,664,20,667,803,750,256,91,81,84,85,485,86,88,87', +'89,487,773,643,217,82,90,288,74,75,71,9,57,62,262,83,63,64,262,803,643', +'67,237,65,66,68,30,31,72,73,115,116,117,118,119,29,28,27,100,99,101', +'102,237,807,19,666,665,664,780,667,8,45,290,10,104,103,105,94,56,96', +'95,97,217,98,106,107,791,92,93,42,43,41,237,807,-289,666,665,664,794', +'667,803,-289,795,797,799,801,-569,810,251,252,-289,40,811,812,33,780', +'819,58,59,217,217,60,828,35,234,-265,240,44,236,235,803,232,233,837', +'840,238,20,239,794,843,845,91,81,84,85,847,86,88,87,89,849,217,851,852', +'82,90,288,74,75,71,9,57,62,855,83,63,64,857,858,643,67,860,65,66,68', +'30,31,72,73,115,116,117,118,119,29,28,27,100,99,101,102,-263,914,19', +'666,665,664,864,667,8,45,290,10,104,103,105,94,56,96,95,97,866,98,106', +'107,217,92,93,42,43,41,237,-591,-591,-591,-591,243,245,-488,-289,-591', +'-591,971,883,217,-488,-289,251,252,972,40,-569,887,33,-488,-289,58,59', +'970,889,60,895,35,234,898,240,44,236,235,217,232,233,244,242,238,20', +'239,901,-266,911,91,81,84,85,918,86,88,87,89,919,930,794,932,82,90,288', +'74,75,71,9,57,62,934,83,63,64,936,938,938,67,217,65,66,68,30,31,72,73', +'115,116,117,118,119,29,28,27,100,99,101,102,716,717,19,944,718,106,107', +'947,8,45,290,10,104,103,105,94,56,96,95,97,948,98,106,107,953,92,93', +'42,43,41,237,241,246,247,248,243,245,253,254,249,250,-279,-591,-591', +'-333,794,251,252,-279,40,956,-333,33,958,960,58,59,-279,962,60,-333', +'35,234,962,240,44,236,235,973,232,233,244,242,238,20,239,974,975,983', +'91,81,84,85,-569,86,88,87,89,-568,649,998,938,82,90,288,74,75,71,9,57', +'62,938,83,63,64,938,1003,983,67,1006,65,66,68,30,31,72,73,1007,1008', +'962,962,962,29,28,27,100,99,101,102,217,914,19,666,665,664,983,667,8', +'45,290,10,104,103,105,94,56,96,95,97,938,98,106,107,983,92,93,42,43', +'41,237,241,246,247,248,243,245,253,-290,249,250,503,,,,-290,251,252', +'504,40,,,33,,-290,58,59,502,,60,,35,234,,240,44,236,235,,232,233,244', +'242,238,20,239,,,,91,81,84,85,,86,88,87,89,,,,,82,90,288,74,75,71,9', +'57,62,,83,63,64,,,,67,,65,66,68,30,31,72,73,,,,,,29,28,27,100,99,101', +'102,,,19,,,,,602,8,45,290,10,104,103,105,94,56,96,95,97,,98,106,107', +',92,93,42,43,41,237,241,246,247,248,243,245,253,254,249,250,,230,231', +',,251,252,,40,,,33,,,58,59,,,60,,35,234,,240,44,236,235,,232,233,244', +'242,238,20,239,,,,91,81,84,85,,86,88,87,89,,,,,82,90,,255,-280,-240', +',,62,,83,-280,-280,-280,,,-280,-280,-280,237,-280,,,,,,,,,,-280,-280', +'-280,,,251,252,,,,-280,-280,,-280,-280,-280,-280,-280,,,,234,,240,,236', +'235,,232,233,,,238,,239,,,,,,-280,-280,-280,-280,-280,-280,-280,-280', +'-280,-280,-280,-280,-280,-280,,,-280,-280,-280,,,-280,,,-280,,,-280', +'-280,,-280,,-280,,-280,,-280,-280,,-280,-280,-280,-280,-280,,-280,,-280', +',,,,,,,,,,,,,-280,,,-280,-280,-280,-280,,-280,,-280,288,74,75,71,9,57', +',,,63,64,,,,67,,65,66,68,30,31,72,73,,,,,,29,28,27,100,99,101,102,,', +'19,,,,,,8,45,290,10,104,103,105,94,56,96,95,97,,98,106,107,,92,93,42', +'43,41,237,241,246,247,248,243,245,,,249,250,,,,,,251,252,,40,,,33,,', +'58,59,,,60,,35,234,,240,44,236,235,,232,233,244,242,238,20,239,,,,91', +'81,84,85,,86,88,87,89,,,,,82,90,288,74,75,71,9,57,62,,83,63,64,,,,67', +',65,66,68,30,31,72,73,,,,,,29,28,27,100,99,101,102,,,19,,,,,,8,45,290', +'10,104,103,105,94,56,96,95,97,,98,106,107,,92,93,42,43,41,237,-591,-591', +'-591,-591,243,245,,,-591,-591,,,,,,251,252,,40,,,33,,,58,59,,,60,,35', +'234,,240,44,236,235,,232,233,244,242,238,20,239,,,,91,81,84,85,,86,88', +'87,89,,,,,82,90,288,74,75,71,9,57,62,,83,63,64,,,,67,,65,66,68,30,31', +'72,73,,,,,,29,28,27,100,99,101,102,,,19,,,,,,8,45,290,10,104,103,105', +'94,56,96,95,97,,98,106,107,,92,93,42,43,41,237,-591,-591,-591,-591,243', +'245,,,-591,-591,,,,,,251,252,,40,,,292,,,58,59,,,60,,35,234,,240,44', +'236,235,,232,233,244,242,238,20,239,,,,91,81,84,85,,86,88,87,89,,,,', +'82,90,288,74,75,71,9,57,62,,83,63,64,,,,67,,65,66,68,30,31,72,73,,,', +',,29,28,27,100,99,101,102,,,19,,,,,,8,45,290,10,104,103,105,94,56,96', +'95,97,,98,106,107,,92,93,42,43,41,237,241,246,247,248,243,245,253,254', +'249,250,,-591,-591,,,251,252,,40,,,33,,,58,59,,,60,,35,234,,240,44,236', +'235,,232,233,244,242,238,20,239,,,,91,81,84,85,,86,88,87,89,,,,,82,90', +'288,74,75,71,9,57,62,,83,63,64,,,,67,,65,66,68,30,31,72,73,,,,,,29,28', +'27,100,99,101,102,,,19,,,,,,8,45,290,10,104,103,105,94,56,96,95,97,', +'98,106,107,,92,93,42,43,41,237,-591,-591,-591,-591,243,245,,,-591,-591', +',,,,,251,252,,40,,,33,,,58,59,,,60,,35,234,,240,44,236,235,,232,233', +'244,242,238,20,239,,,,91,81,84,85,,86,88,87,89,,,,,82,90,288,74,75,71', +'9,57,62,,83,63,64,,,,67,,65,66,68,30,31,72,73,,,,,,29,28,27,100,99,101', +'102,,,19,,,,,,8,45,290,10,104,103,105,94,56,96,95,97,,98,106,107,,92', +'93,42,43,41,237,,,,,,,,,,,,,,,,251,252,,40,,,33,,,58,59,,,60,,35,234', +',240,44,236,235,,232,233,,,238,20,239,,,,91,81,84,85,,86,88,87,89,,', +',,82,90,288,74,75,71,9,57,62,,83,63,64,,,,67,,65,66,68,30,31,72,73,', +',,,,29,28,27,100,99,101,102,,,19,,,,,,8,45,290,10,104,103,105,94,56', +'96,95,97,,98,106,107,,92,93,42,43,41,237,,,,,,,,,,,,,,,,251,252,,40', +',,33,,,58,59,,,60,,35,234,,240,44,236,235,,232,233,,,238,20,239,,,,91', +'81,84,85,,86,88,87,89,,,,,82,90,288,74,75,71,9,57,62,,83,63,64,,,,67', +',65,66,68,30,31,72,73,,,,,,29,28,27,100,99,101,102,,,19,,,,,,8,45,290', +'10,104,103,105,94,56,96,95,97,,98,106,107,,92,93,42,43,41,237,-591,-591', +'-591,-591,243,245,,,-591,-591,,,,,,251,252,,40,,,33,,,58,59,,,60,,35', +'234,,240,44,236,235,,232,233,244,242,238,20,239,,,,91,81,84,85,,86,88', +'87,89,,,,,82,90,288,74,75,71,9,57,62,,83,63,64,,,,67,,65,66,68,30,31', +'72,73,,,,,,29,28,27,100,99,101,102,,,19,,,,,,8,45,290,10,104,103,105', +'94,56,96,95,97,,98,106,107,,92,93,42,43,41,237,-591,-591,-591,-591,243', +'245,,,-591,-591,,,,,,251,252,,40,,,33,,,58,59,,,60,,35,234,,240,44,236', +'235,,232,233,244,242,238,20,239,,,,91,81,84,85,,86,88,87,89,,,,,82,90', +'5,74,75,71,9,57,62,,83,63,64,,,,67,,65,66,68,30,31,72,73,,,,,,29,28', +'27,100,99,101,102,,,19,,,,,,8,45,7,10,104,103,105,94,56,96,95,97,,98', +'106,107,,92,93,42,43,41,237,,,,,,,,,,,,,,,,251,252,,40,,,33,,,58,59', +',,60,,35,234,,240,44,236,235,,232,233,,,,20,,,,,91,81,84,85,,86,88,87', +'89,,,,,82,90,288,74,75,71,9,57,62,,83,63,64,,,,67,,65,66,68,30,31,72', +'73,,,,,,29,28,27,100,99,101,102,,,19,,,,,,8,45,290,10,104,103,105,94', +'56,96,95,97,,98,106,107,,92,93,42,43,41,237,,,,,,,,,,,,,,,,251,252,', +'40,,,33,,,58,59,,,60,,35,234,,240,44,236,235,,232,233,,,,20,,,,,91,81', +'84,85,,86,88,87,89,,,,,82,90,288,74,75,71,9,57,62,,83,63,64,,,,67,,65', +'66,68,30,31,72,73,,,,,,29,28,27,100,99,101,102,,,19,,,,,,8,45,290,10', +'104,103,105,94,56,96,95,97,,98,106,107,,92,93,42,43,41,237,,,,,,,,,', +',,,,,,251,252,,40,,,33,,,58,59,,,60,,35,234,,,44,236,235,,232,233,,', +',20,,,,,91,81,84,85,,86,88,87,89,,,,,82,90,288,74,75,71,9,57,62,,83', +'63,64,,,,67,,65,66,68,30,31,72,73,,,,,,29,28,27,100,99,101,102,,,19', +',,,,,8,45,290,10,104,103,105,94,56,96,95,97,,98,106,107,,92,93,42,43', +'41,,,,,,,,,,,,,,,,,,,,40,,,33,,,58,59,,,60,,35,,,,44,,,,,,,,,20,,,,', +'91,81,84,85,,86,88,87,89,,,,,82,90,288,74,75,71,9,57,62,,83,63,64,,', +',67,,65,66,68,30,31,72,73,,,,,,29,28,27,100,99,101,102,,,19,,,,,,8,45', +'290,10,104,103,105,94,56,96,95,97,,98,106,107,,92,93,42,43,41,,,,,,', +',,,,,,,,,,,,,40,,,33,,,58,59,,,60,,35,,,,44,,,,,,,,,20,,,,,91,81,84', +'85,,86,88,87,89,,,,,82,90,288,74,75,71,9,57,62,,83,63,64,,,,67,,65,66', +'68,30,31,72,73,,,,,,29,28,27,100,99,101,102,,,19,,,,,,8,45,290,10,104', +'103,105,94,56,96,95,97,,98,106,107,,92,93,42,43,41,,,,,,,,,,,,,,,,,', +',,40,,,33,,,58,59,,,60,,35,,,,44,,,,,,,,,20,,,,,91,81,84,85,,86,88,87', +'89,,,,,82,90,288,74,75,71,9,57,62,,83,63,64,,,,67,,65,66,68,30,31,72', +'73,,,,,,29,28,27,100,99,101,102,,,19,,,,,,8,45,290,10,104,103,105,94', +'56,96,95,97,,98,106,107,,92,93,42,43,41,,,,,,,,,,,,,,,,,,,,40,,,292', +',,58,59,,,60,,35,,,,44,,,,,,,,,20,,,,,91,81,84,85,,86,88,87,89,,,,,82', +'90,288,74,75,71,9,57,62,,83,63,64,,,,67,,65,66,68,30,31,72,73,,,,,,29', +'28,27,100,99,101,102,,,19,,,,,,8,45,290,10,104,103,105,94,56,96,95,97', +',98,106,107,,92,93,42,43,41,,,,,,,,,,,,,,,,,,,,40,,,33,,,58,59,,,60', +',35,,,,44,,,,,,,,,20,,,,,91,81,84,85,,86,88,87,89,,,,,82,90,288,74,75', +'71,9,57,62,,83,63,64,,,,67,,65,66,68,30,31,72,73,,,,,,29,28,27,100,99', +'101,102,,,19,,,,,,8,45,290,10,104,103,105,94,56,96,95,97,,98,106,107', +',92,93,42,43,41,,,,,,,,,,,,,,,,,,,,40,,,33,,,58,59,,,60,,35,,,,44,,', +',,,,,,20,,,,,91,81,84,85,,86,88,87,89,,,,,82,90,288,74,75,71,9,57,62', +',83,63,64,,,,67,,65,66,68,30,31,72,73,,,,,,29,28,27,100,99,101,102,', +',19,,,,,,8,45,290,10,104,103,105,94,56,96,95,97,,98,106,107,,92,93,42', +'43,41,,,,,,,,,,,,,,,,,,,,40,,,33,,,58,59,,,60,,35,,,,44,,,,,,,,,20,', +',,,91,81,84,85,,86,88,87,89,,,,,82,90,288,74,75,71,9,57,62,,83,63,64', +',,,67,,65,66,68,30,31,72,73,,,,,,29,28,27,100,99,101,102,,,19,,,,,,8', +'45,290,10,104,103,105,94,56,96,95,97,,98,106,107,,92,93,42,43,41,,,', +',,,,,,,,,,,,,,,,40,,,33,,,58,59,,,60,,35,,,,44,,,,,,,,,20,,,,,91,81', +'84,85,,86,88,87,89,,,,,82,90,288,74,75,71,9,57,62,,83,63,64,,,,67,,65', +'66,68,30,31,72,73,,,,,,29,28,27,100,99,101,102,,,19,,,,,,8,45,290,10', +'104,103,105,94,56,96,95,97,,98,106,107,,92,93,42,43,41,,,,,,,,,,,,,', +',,,,,,40,,,292,,,58,59,,,60,,35,,,,44,,,,,,,,,20,,,,,91,81,84,85,,86', +'88,87,89,,,,,82,90,288,74,75,71,9,57,62,,83,63,64,,,,67,,65,66,68,30', +'31,72,73,,,,,,29,28,27,100,99,101,102,,,19,,,,,,8,45,290,10,104,103', +'105,94,56,96,95,97,,98,106,107,,92,93,42,43,41,,,,,,,,,,,,,,,,,,,,40', +',,33,,,58,59,,,60,,35,,,,44,,,,,,,,,20,,,,,91,81,84,85,,86,88,87,89', +',,,,82,90,288,74,75,71,9,57,62,,83,63,64,,,,67,,65,66,68,30,31,72,73', +',,,,,29,28,27,100,99,101,102,,,19,,,,,602,8,45,290,10,104,103,105,94', +'56,96,95,97,,98,106,107,,92,93,42,43,41,237,241,246,247,248,243,245', +'253,254,249,250,,230,231,,,251,252,,40,,,33,,,58,59,,,60,,35,234,,240', +'44,236,235,,232,233,244,242,238,20,239,,,,91,81,84,85,,86,88,87,89,', +',,,82,90,,255,-573,,,,62,,83,-573,-573,-573,,,-573,-573,-573,,-573,', +',,,,,,,-573,-573,-573,-573,,,,,,,,-573,-573,,-573,-573,-573,-573,-573', +',,,,,,,,,,,,,,,,,,,,,,-573,-573,-573,-573,-573,-573,-573,-573,-573,-573', +'-573,-573,-573,-573,,,-573,-573,-573,,,-573,,,-573,,,-573,-573,,-573', +',-573,,-573,,-573,-573,,-573,-573,-573,-573,-573,,-573,-573,-573,,,', +',,,,,,,,,,-573,,,-573,-573,-573,-573,,-573,,-573,288,74,75,71,9,57,', +',,63,64,,,,67,,65,66,68,30,31,72,73,,,,,,29,28,27,100,99,101,102,,,19', +',,,,,8,45,290,10,104,103,105,94,56,96,95,97,,98,106,107,,92,93,42,43', +'41,,,,,,,,,,,,,,,,,,,,40,,,33,,,58,59,,,60,,35,,,,44,,,,,,,,,20,,,,', +'91,81,84,85,,86,88,87,89,,,,,82,90,,74,75,71,,57,62,,83,63,64,,,,67', +',65,66,68,307,308,72,73,,,,,,303,304,310,100,99,101,102,,,229,,,,,,', +'45,,,104,103,105,94,56,96,95,97,,98,106,107,,92,93,42,43,41,,,,,,,,', +',,,,,,,,,,,222,,,228,,,58,59,,,60,,,,,,44,,,,,,,,,227,,,,,91,81,84,85', +',86,88,87,89,,,,,82,90,,74,75,71,,57,62,,83,63,64,,,,67,,65,66,68,307', +'308,72,73,,,,,,303,304,310,100,99,101,102,,,229,,,,,,,45,,,104,103,105', +'94,56,96,95,97,,98,106,107,,92,93,42,43,41,,,,,,,,,,,,,,,,,,,,222,,', +'228,,,58,59,,,60,,,,,,44,,,,,,,,,227,,,,,91,81,84,85,,86,88,87,89,,', +',,82,90,,74,75,71,,57,62,,83,63,64,,,,67,,65,66,68,307,308,72,73,,,', +',,303,304,310,100,99,101,102,,,229,,,,,,,45,,,104,103,105,94,56,96,95', +'97,,98,106,107,,92,93,42,43,41,,,,,,,,,,,,,,,,,,,,222,,,228,,,58,59', +',,60,,,,,,44,,,,,,,,,227,,,,,91,81,84,85,,86,88,87,89,,,,,82,90,,74', +'75,71,,57,62,,83,63,64,,,,67,,65,66,68,307,308,72,73,,,,,,303,304,310', +'100,99,101,102,,,229,,,,,,,45,,,104,103,105,94,56,96,95,97,,98,106,107', +',92,93,42,43,41,,,,,,,,,,,,,,,,,,,,222,,,228,,,58,59,,,60,,,,,,44,,', +',,,,,,227,,,,,91,81,84,85,,86,88,87,89,,,,,82,90,,74,75,71,,57,62,,83', +'63,64,,,,67,,65,66,68,307,308,72,73,,,,,,303,304,310,100,99,101,102', +',,229,,,,,,,305,,,104,103,105,94,56,96,95,97,,98,106,107,,92,93,,,311', +',,,,,,,,,,,,,,,,,,,301,,,297,,,58,59,,,60,,,,,,,,,,,,,,,,,,,,91,81,84', +'85,,86,88,87,89,,,,,82,90,,74,75,71,,57,62,,83,63,64,,,,67,,65,66,68', +'307,308,72,73,,,,,,303,304,310,100,99,101,102,,,229,,,,,,,45,,,104,103', +'105,94,56,96,95,97,,98,106,107,,92,93,42,43,41,,,,,,,,,,,,,,,,,,,,222', +',,228,,,58,59,,,60,,,,,,44,,,,,,,,,227,,,,,91,81,84,85,,86,88,87,89', +',,,,82,90,,74,75,71,,57,62,,83,63,64,,,,67,,65,66,68,307,308,72,73,', +',,,,303,304,310,100,99,101,102,,,229,,,,,,,45,,,104,103,105,94,56,96', +'95,97,,98,106,107,,92,93,42,43,41,,,,,,,,,,,,,,,,,,,,222,,,228,,,58', +'59,,,60,,,,,,44,,,,,,,,,227,,,,,91,81,84,85,,86,88,87,89,,,,,82,90,', +'74,75,71,,57,62,,83,63,64,,,,67,,65,66,68,30,31,72,73,,,,,,29,28,27', +'100,99,101,102,,,229,,,,,,,45,,,104,103,105,94,56,96,95,97,,98,106,107', +',92,93,42,43,41,,,,,,,,,,,,,,,,,,,,222,,,228,,,58,59,,,60,,,,,,44,,', +',,,,,,227,,,,,91,81,84,85,,86,88,87,89,,,,,82,90,,74,75,71,,57,62,,83', +'63,64,,,,67,,65,66,68,307,308,72,73,,,,,,303,304,310,100,99,101,102', +',,229,,,,,,,45,,,104,103,105,94,56,96,95,97,,98,106,107,,92,93,42,43', +'41,,,,,,,,,,,,,,,,,,,,222,,,228,,,58,59,,,60,,,,,,44,,,,,,,,,227,,,', +',91,81,84,85,,86,88,87,89,,,,,82,90,,74,75,71,9,57,62,,83,63,64,,,,67', +',65,66,68,30,31,72,73,,,,,,29,28,27,100,99,101,102,,,19,,,,,,8,45,,10', +'104,103,105,94,56,96,95,97,,98,106,107,,92,93,42,43,41,,,,,,,,,,,,,', +',,,,,,40,,,33,,,58,59,,,60,,35,,,,44,,,,,,,,,20,,,,,91,81,84,85,,86', +'88,87,89,,,,,82,90,,74,75,71,,57,62,,83,63,64,,,,67,,65,66,68,30,31', +'72,73,,,,,,29,28,27,100,99,101,102,,,19,,,,,,,45,,,104,103,105,94,56', +'96,95,97,,98,106,107,,92,93,42,43,41,,,,,,,,,,,,,,,,,,,,222,,,228,,', +'58,59,,,60,,,,,,44,,,,,,,,,20,,,,,91,81,84,85,,86,88,87,89,,,,,82,90', +',74,75,71,,57,62,,83,63,64,,,,67,,65,66,68,307,308,72,73,,,,,,303,304', +'310,100,99,101,102,,,229,,,,,,,45,,,104,103,105,94,56,96,95,97,,98,106', +'107,,92,93,42,43,41,,,,,,,,,,,,,,,,,,,,222,,,228,,,58,59,,,60,,626,', +',,44,,,,,,,,,227,,,,,91,81,84,85,,86,88,87,89,,,,,82,90,,74,75,71,,57', +'62,,83,63,64,,,,67,,65,66,68,307,308,72,73,,,,,,303,304,310,100,99,101', +'102,,,229,,,,,,,45,,,104,103,105,94,56,96,95,97,,98,106,107,,92,93,42', +'43,41,,,,,,,,,,,,,,,,,,,,222,,,228,,,58,59,,,60,,,,,,44,,,,,,,,,227', +',,,,91,81,84,85,,86,88,87,89,,,,,82,90,,74,75,71,,57,62,,83,63,64,,', +',67,,65,66,68,307,308,72,73,,,,,,303,304,310,100,99,101,102,,,229,,', +',,,,45,,,104,103,105,94,56,96,95,97,,98,106,107,,92,93,42,43,41,,,,', +',,,,,,,,,,,,,,,222,,,228,,,58,59,,,60,,,,,,44,,,,,,,,,227,,,,,91,81', +'84,85,,86,88,87,89,,,,,82,90,,74,75,71,,57,62,,83,63,64,,,,67,,65,66', +'68,30,31,72,73,,,,,,29,28,27,100,99,101,102,,,229,,,,,,,45,,,104,103', +'105,94,56,96,95,97,282,98,106,107,,92,93,42,43,41,,,,,,,,,,,,,,,,,,', +',222,,,228,,,58,59,,,60,,280,,278,,44,,,283,,,,,,227,,,,,91,81,84,85', +',86,88,87,89,,,,,82,90,,74,75,71,,57,62,,83,63,64,,,,67,,65,66,68,30', +'31,72,73,,,,,,29,28,27,100,99,101,102,,,229,,,,,,,45,,,104,103,105,94', +'56,96,95,97,282,98,106,107,,92,93,42,43,41,,,,,,,,,,,,,,,,,,,,222,,', +'228,,,58,59,,,60,,280,,278,,44,,,283,,,,,,227,,,,,91,81,84,85,,86,88', +'87,89,,,,,82,90,,74,75,71,,57,62,,83,63,64,,,,67,,65,66,68,30,31,72', +'73,,,,,,29,28,27,100,99,101,102,,,229,,,,,,,45,,,104,103,105,94,56,96', +'95,97,282,98,106,107,,92,93,42,43,41,,,,,,,,,,,,,,,,,,,,222,,,228,,', +'58,59,,,60,,280,,278,,44,,,283,,,,,,227,,,,,91,81,84,85,,86,88,87,89', +',,,,82,90,,74,75,71,,57,62,,83,63,64,,,,67,,65,66,68,307,308,72,73,', +',,,,303,304,310,100,99,101,102,,,229,,,,,587,,305,,,104,103,105,94,56', +'96,95,97,,98,106,107,,92,93,,,311,237,241,246,247,248,243,245,253,254', +'249,250,,230,231,,,251,252,,301,,,228,,,58,59,,,60,,,234,,240,,236,235', +',232,233,244,242,238,,239,,,,91,81,84,85,,86,88,87,89,,,,,82,90,,255', +',500,,,62,,83,74,75,71,,57,,,,63,64,,,,67,,65,66,68,307,308,72,73,,', +',,,303,304,310,100,99,101,102,,,229,,,,,,,305,,,104,103,105,94,56,96', +'95,97,,98,106,107,,92,93,,,311,,,,,,,,,,,,,,,,,,,,301,,,297,,,58,59', +',,60,,,,,,,,,,,,,,,,,,,,91,81,84,85,,86,88,87,89,,,,,82,90,,74,75,71', +',57,62,,83,63,64,,,,67,,65,66,68,307,308,72,73,,,,,,303,304,310,100', +'99,101,102,,,229,,,,,,,45,,,104,103,105,94,56,96,95,97,282,98,106,107', +',92,93,42,43,41,,,,,,,,,,,,,,,,,,,,222,,,228,,,58,59,,,60,,,,278,,44', +',,283,,,,,,227,,,,,91,81,84,85,,86,88,87,89,,,,,82,90,,74,75,71,,57', +'62,,83,63,64,,,,67,,65,66,68,307,308,72,73,,,,,,303,304,310,100,99,101', +'102,,,229,,,,,,,45,,,104,103,105,94,56,96,95,97,,98,106,107,,92,93,42', +'43,41,,,,,,,,,,,,,,,,,,,,222,,,228,,,58,59,,,60,,,,,,44,,,,,,,,,227', +',,,,91,81,84,85,,86,88,87,89,,,,,82,90,,74,75,71,,57,62,,83,63,64,,', +',67,,65,66,68,307,308,72,73,,,,,,303,304,310,100,99,101,102,,,229,,', +',,,,45,,,104,103,105,94,56,96,95,97,,98,106,107,,92,93,42,43,41,,,,', +',,,,,,,,,,,,,,,222,,,228,,,58,59,,,60,,,,,,44,,,,,,,,,227,,,,,91,81', +'84,85,,86,88,87,89,,,,,82,90,,74,75,71,,57,62,,83,63,64,,,,67,,65,66', +'68,307,308,72,73,,,,,,303,304,310,100,99,101,102,,,229,,,,,,,305,,,104', +'103,105,94,56,96,95,97,,98,106,107,,92,93,,,311,,,,,,,,,,,,,,,,,,,,854', +',,228,,,58,59,,,60,,,,,,,,,,,,,,,,,,,,91,81,84,85,,86,88,87,89,,,,,82', +'90,,74,75,71,,57,62,,83,63,64,,,,67,,65,66,68,307,308,72,73,,,,,,303', +'304,310,100,99,101,102,,,229,,,,,,,45,,,104,103,105,94,56,96,95,97,', +'98,106,107,,92,93,42,43,41,,,,,,,,,,,,,,,,,,,,222,,,228,,,58,59,,,60', +',,,,,44,,,,,,,,,227,,,,,91,81,84,85,,86,88,87,89,,,,,82,90,,74,75,71', +',57,62,,83,63,64,,,,67,,65,66,68,30,31,72,73,,,,,,29,28,27,100,99,101', +'102,,,229,,,,,,,45,,,104,103,105,94,56,96,95,97,,98,106,107,,92,93,42', +'43,41,,,,,,,,,,,,,,,,,,,,222,,,228,,,58,59,,,60,,,,,,44,,,,,,,,,227', +',,,,91,81,84,85,,86,88,87,89,,,,,82,90,,74,75,71,,57,62,,83,63,64,,', +',67,,65,66,68,307,308,72,73,,,,,,303,304,310,100,99,101,102,,,229,,', +',,,,305,,,104,103,105,94,56,96,95,97,,98,106,107,,92,93,,,311,,,,,,', +',,,,,,,,,,,,,925,,,228,,,58,59,,,60,,,,,,,,,,,,,,,,,,,,91,81,84,85,', +'86,88,87,89,,,,,82,90,,74,75,71,,57,62,,83,63,64,,,,67,,65,66,68,30', +'31,72,73,,,,,,29,28,27,100,99,101,102,,,229,,,,,,,45,,,104,103,105,94', +'56,96,95,97,,98,106,107,,92,93,42,43,41,,,,,,,,,,,,,,,,,,,,222,,,228', +',,58,59,,,60,,,,,,44,,,,,,,,,227,,,,,91,81,84,85,,86,88,87,89,,,,,82', +'90,,74,75,71,,57,62,,83,63,64,,,,67,,65,66,68,30,31,72,73,,,,,,29,28', +'27,100,99,101,102,,,229,,,,,,,45,,,104,103,105,94,56,96,95,97,,98,106', +'107,,92,93,42,43,41,,,,,,,,,,,,,,,,,,,,222,,,228,,,58,59,,,60,,,,,,44', +',,,,,,,,227,,,,,91,81,84,85,,86,88,87,89,,,,,82,90,,74,75,71,,57,62', +',83,63,64,,,,67,,65,66,68,307,308,72,73,,,,,,303,304,310,100,99,101', +'102,,,229,,,,,,,305,,,104,103,105,94,56,96,95,97,,98,106,107,,92,93', +',,311,,,,,,,,,,,,,,,,,,,,301,,,297,,,58,59,,,60,,296,,,,,,,,,,,,,,,', +',,91,81,84,85,,86,88,87,89,,,,,82,90,,74,75,71,,57,62,,83,63,64,,,,67', +',65,66,68,307,308,72,73,,,,,,303,304,310,100,99,101,102,,,229,,,,,,', +'305,,,104,103,105,94,56,96,95,97,,98,106,107,,92,93,,,311,237,241,246', +'247,248,243,245,253,254,249,250,,230,231,,,251,252,,301,,,228,,,58,59', +',,60,,,234,,240,,236,235,,232,233,244,242,238,,239,,,,91,81,84,85,,86', +'88,87,89,,,,,82,90,,255,,313,,,62,,83,74,75,71,,57,,,,63,64,,,,67,,65', +'66,68,30,31,72,73,,,,,,29,28,27,100,99,101,102,,,19,,,,,,,45,,,104,103', +'105,94,56,96,95,97,,98,106,107,,92,93,42,43,41,,,,,,,,,,,,,,,,,,,,222', +',,228,,,58,59,,,60,,,,,,44,,,,,,,,,20,,,,,91,81,84,85,,86,88,87,89,', +',,,82,90,217,74,75,71,9,57,62,,83,63,64,,,,67,,65,66,68,30,31,72,73', +',,,,,29,28,27,100,99,101,102,,,19,,,,,,8,45,7,10,104,103,105,94,56,96', +'95,97,,98,106,107,,92,93,42,43,41,,,,,,,,,,,,,,,,,,,,40,,,33,,,58,59', +',,60,,35,,,,44,,,,,,,,,20,,,,,91,81,84,85,,86,88,87,89,,,,,82,90,,74', +'75,71,,57,62,,83,63,64,,,,67,,65,66,68,30,31,72,73,,,,,,29,28,27,100', +'99,101,102,,,229,,,,,,,45,,,104,103,105,94,56,96,95,97,,98,106,107,', +'92,93,42,43,41,,,,,,,,,,,,,,,,,,,,222,,,228,,,58,59,,,60,,,,,,44,,,', +',,,,,227,,,,,91,81,84,85,,86,88,87,89,,,,,82,90,,74,75,71,,57,62,,83', +'63,64,,,,67,,65,66,68,30,31,72,73,,,,,,29,28,27,100,99,101,102,,,229', +',,,,,,45,,,104,103,105,94,56,96,95,97,,98,106,107,,92,93,42,43,41,,', +',,,,,,,,,,,,,,,,,222,,,228,,,58,59,,,60,,,,,,44,,,,,,,,,227,,,,,91,81', +'84,85,,86,88,87,89,,,,,82,90,,74,75,71,,57,62,,83,63,64,,,,67,,65,66', +'68,307,308,72,73,,,,,,303,304,310,100,99,101,102,,,229,,,,,,,45,,,104', +'103,105,94,56,96,95,97,282,98,106,107,,92,93,42,43,41,,,,,,,,,,,,,,', +',,,,,222,,,228,,,58,59,,,60,,,,278,,44,,,283,,,,,,227,,,,,91,81,84,85', +',86,88,87,89,,,,,82,90,,74,75,71,,57,62,,83,63,64,,,,67,,65,66,68,307', +'308,72,73,,,,,,303,304,310,100,99,101,102,,,229,,,,,,,45,,,104,103,105', +'94,56,96,95,97,282,98,106,107,,92,93,42,43,41,,,,,,,,,,,,,,,,,,,,222', +',,228,,,58,59,,,60,,626,,278,,44,,,283,,,,,,227,,,,,91,81,84,85,,86', +'88,87,89,,,,,82,90,,74,75,71,,57,62,,83,63,64,,,,67,,65,66,68,307,308', +'72,73,,,,,,303,304,310,100,99,101,102,,,229,,,,,,,305,,,104,103,105', +'94,56,96,95,97,,98,106,107,,92,93,,,311,,,,,,,,,,,,,,,,,,,,301,,,297', +',,58,59,,,60,,,,,,,,,,,,,,,,,,,,91,81,84,85,,86,88,87,89,,,,,82,90,', +'74,75,71,,57,62,,83,63,64,,,,67,,65,66,68,30,31,72,73,,,,,,29,28,27', +'100,99,101,102,,,19,,,,,,,45,,,104,103,105,94,56,96,95,97,,98,106,107', +',92,93,42,43,41,,,,,,,,,,,,,,,,,,,,222,,,228,,,58,59,,,60,,,,,,44,,', +',,,,,,20,,,,,91,81,84,85,,86,88,87,89,,,,,82,90,,74,75,71,,57,62,,83', +'63,64,,,,67,,65,66,68,307,308,72,73,,,,,,303,304,310,100,99,101,102', +',,229,,,,,,,45,,,104,103,105,94,56,96,95,97,,98,106,107,,92,93,42,43', +'41,,,,,,,,,,,,,,,,,,,,222,,,228,,,58,59,,,60,,,,,,44,,,,,,,,,227,,,', +',91,81,84,85,,86,88,87,89,,,,,82,90,,74,75,71,,57,62,,83,63,64,,,,67', +',65,66,68,307,308,72,73,,,,,,303,304,310,100,99,101,102,,,229,,,,,,', +'45,,,104,103,105,94,56,96,95,97,,98,106,107,,92,93,42,43,41,,,,,,,,', +',,,,,,,,,,,222,,,228,,,58,59,,,60,,729,,,,44,,,,,,,,,227,,,,,91,81,84', +'85,,86,88,87,89,,,,,82,90,,74,75,71,,57,62,,83,63,64,,,,67,,65,66,68', +'30,31,72,73,,,,,,29,28,27,100,99,101,102,,,19,,,,,,,45,,,104,103,105', +'94,56,96,95,97,,98,106,107,,92,93,42,43,41,,,,,,,,,,,,,,,,,,,,222,,', +'228,,,58,59,,,60,,,,,,44,,,,,,,,,20,,,,,91,81,84,85,,86,88,87,89,,,', +',82,90,,74,75,71,,57,62,,83,63,64,,,,67,,65,66,68,30,31,72,73,,,,,,29', +'28,27,100,99,101,102,,,19,,,,,,,45,,,104,103,105,94,56,96,95,97,,98', +'106,107,,92,93,42,43,41,,,,,,,,,,,,,,,,,,,,222,,,228,,,58,59,,,60,,', +',,,44,,,,,,,,,20,,,,,91,81,84,85,,86,88,87,89,,,,,82,90,,74,75,71,,57', +'62,,83,63,64,,,,67,,65,66,68,30,31,72,73,,,,,,29,28,27,100,99,101,102', +',,229,,,,,,,45,,,104,103,105,94,56,96,95,97,,98,106,107,,92,93,42,43', +'41,,,,,,,,,,,,,,,,,,,,222,,,228,,,58,59,,,60,,402,,,,44,,,,,,,,,227', +',,,,91,81,84,85,,86,88,87,89,,,,,82,90,,74,75,71,,57,62,,83,63,64,,', +',67,,65,66,68,307,308,72,73,,,,,,303,304,310,100,99,101,102,,,229,,', +',,,,45,,,104,103,105,94,56,96,95,97,,98,106,107,,92,93,42,43,41,,,,', +',,,,,,,,,,,,,,,222,,,228,518,,58,59,,,60,,,,,,44,,,,,,,,,227,,,,,91', +'81,84,85,,86,88,87,89,,,,,82,90,,74,75,71,,57,62,,83,63,64,,,,67,,65', +'66,68,30,31,72,73,,,,,,29,28,27,100,99,101,102,,,19,,,,,,,45,,,104,103', +'105,94,56,96,95,97,,98,106,107,,92,93,42,43,41,,,,,,,,,,,,,,,,,,,,222', +',,228,,,58,59,,,60,,,,,,44,,,,,,,,,20,,,,,91,81,84,85,,86,88,87,89,', +',,,82,90,,74,75,71,,57,62,,83,63,64,,,,67,,65,66,68,30,31,72,73,,,,', +',29,28,27,100,99,101,102,,,229,,,,,,,45,,,104,103,105,94,56,96,95,97', +',98,106,107,,92,93,42,43,41,,,,,,,,,,,,,,,,,,,,222,,,228,,,58,59,,,60', +',,,,,44,,,,,,,,,227,,,,,91,81,84,85,,86,88,87,89,,,,,82,90,,74,75,71', +',57,62,,83,63,64,,,,67,,65,66,68,30,31,72,73,,,,,,29,28,27,100,99,101', +'102,,,229,,,,,,,45,,,104,103,105,94,56,96,95,97,282,98,106,107,,92,93', +'42,43,41,,,,,,,,,,,,,,,,,,,,222,,,228,,,58,59,,,60,,280,,278,,44,,,283', +',,,,,227,,,,,91,81,84,85,,86,88,87,89,,,,,82,90,,74,75,71,,57,62,,83', +'63,64,,,,67,,65,66,68,30,31,72,73,,,,,,29,28,27,100,99,101,102,,,229', +',,,,,,45,,,104,103,105,94,56,96,95,97,282,98,106,107,,92,93,42,43,41', +',,,,,,,,,,,,,,,,,,,222,,,228,,,58,59,,,60,,280,,278,,44,,,283,,,,,,227', +',,,,91,81,84,85,,86,88,87,89,,,,,82,90,,74,75,71,,57,62,,83,63,64,,', +',67,,65,66,68,307,308,72,73,,,,,,303,304,310,100,99,101,102,,,229,,', +',,,,45,,,104,103,105,94,56,96,95,97,,98,106,107,,92,93,42,43,41,,,,', +',,,,,,,,,,,,,,,222,,,228,,,58,59,,,60,,280,,,,44,,,,,,,,,227,,,,,91', +'81,84,85,,86,88,87,89,,,,,82,90,,74,75,71,,57,62,,83,63,64,,,,67,,65', +'66,68,30,31,72,73,,,,,,29,28,27,100,99,101,102,,,19,,,,,,,45,,,104,103', +'105,94,56,96,95,97,,98,106,107,,92,93,42,43,41,,,,,,,,,,,,,,,,,,,,222', +',,228,,,58,59,,,60,,,,,,44,,,,,,,,,20,,,,,91,81,84,85,,86,88,87,89,', +',,,82,90,,74,75,71,,57,62,,83,63,64,,,,67,,65,66,68,307,308,72,73,,', +',,,303,304,310,100,99,101,102,,,229,,,,,,,45,,,104,103,105,94,56,96', +'95,97,,98,106,107,,92,93,42,43,41,,,,,,,,,,,,,,,,,,,,222,,,228,,,58', +'59,,,60,,,,,,44,,,,,,,,,227,,,,,91,81,84,85,,86,88,87,89,,,,,82,90,', +'74,75,71,,57,62,,83,63,64,,,,67,,65,66,68,30,31,72,73,,,,,,29,28,27', +'100,99,101,102,,,229,,,,,,,45,,,104,103,105,94,56,96,95,97,282,98,106', +'107,,92,93,42,43,41,,,,,,,,,,,,,,,,,,,,222,,,228,,,58,59,,,60,,280,', +'278,,44,,,283,,,,,,227,,,,,91,81,84,85,,86,88,87,89,,,,,82,90,,74,75', +'71,,57,62,,83,63,64,,,,67,,65,66,68,307,308,72,73,,,,,,303,304,310,100', +'99,101,102,,,229,,,,,,,45,,,104,103,105,94,56,96,95,97,282,98,106,107', +',92,93,42,43,41,,,,,,,,,,,,,,,,,,,,222,,,228,,,58,59,,,60,,,,,,44,,', +'283,,,,,,227,,,,,91,81,84,85,,86,88,87,89,,,,,82,90,,74,75,71,,57,62', +',83,63,64,,,,67,,65,66,68,307,308,72,73,,,,,,303,304,310,100,99,101', +'102,,,229,,,,,,,45,,,104,103,105,94,56,96,95,97,282,98,106,107,,92,93', +'42,43,41,,,,,,,,,,,,,,,,,,,,222,,,228,,,58,59,,,60,,626,,,,44,,,283', +',,,,,227,,,,,91,81,84,85,,86,88,87,89,,,,,82,90,,74,75,71,,57,62,,83', +'63,64,,,,67,,65,66,68,30,31,72,73,,,,,,29,28,27,100,99,101,102,,,229', +',,,,,,45,,,104,103,105,94,56,96,95,97,,98,106,107,,92,93,42,43,41,,', +',,,,,,,,,,,,,,,,,222,,,228,,,58,59,,,60,,,,,,44,,,,,,,,,227,,,,,91,81', +'84,85,,86,88,87,89,,,,,82,90,,74,75,71,,57,62,,83,63,64,,,,67,,65,66', +'68,30,31,72,73,,,,,,29,28,27,100,99,101,102,,,229,,,,,,,45,,,104,103', +'105,94,56,96,95,97,,98,106,107,,92,93,42,43,41,,,,,,,,,,,,,,,,,,,,222', +',,228,,,58,59,,,60,,402,,,,44,,,,,,,,,227,,,,,91,81,84,85,,86,88,87', +'89,,,,,82,90,,74,75,71,,57,62,,83,63,64,,,,67,,65,66,68,30,31,72,73', +',,,,,29,28,27,100,99,101,102,,,19,,,,,,,45,,,104,103,105,94,56,96,95', +'97,,98,106,107,,92,93,42,43,41,,,,,,,,,,,,,,,,,,,,222,,,228,,,58,59', +',,60,,,,,,44,,,,,,,,,20,,,,,91,81,84,85,,86,88,87,89,,,,,82,90,,74,75', +'71,,57,62,,83,63,64,,,,67,,65,66,68,307,308,72,73,,,,,,303,304,310,100', +'99,101,102,,,229,,,,,,,45,,,104,103,105,94,56,96,95,97,,98,106,107,', +'92,93,42,43,41,,,,,,,,,,,,,,,,,,,,222,,,228,,,58,59,,,60,,,,,,44,,,', +',,,,,227,,,,,91,81,84,85,,86,88,87,89,,,,,82,90,,74,75,71,,57,62,,83', +'63,64,,,,67,,65,66,68,30,31,72,73,,,,,,29,28,27,100,99,101,102,,,229', +',,,,,,45,,,104,103,105,94,56,96,95,97,282,98,106,107,,92,93,42,43,41', +',,,,,,,,,,,,,,,,,,,222,,,228,,,58,59,,,60,,280,,278,,44,,,283,,,,,,227', +',,,,91,81,84,85,,86,88,87,89,,,,,82,90,,74,75,71,,57,62,,83,63,64,,', +',67,,65,66,68,30,31,72,73,,,,,,29,28,27,100,99,101,102,,,19,,,,,,,45', +',,104,103,105,94,56,96,95,97,,98,106,107,,92,93,42,43,41,,,,,,,,,,,', +',,,,,,,,222,,,228,,,58,59,,,60,,,,,,44,,,,,,,,,20,,,,,91,81,84,85,,86', +'88,87,89,,,,,82,90,,74,75,71,,57,62,,83,63,64,,,,67,,65,66,68,307,308', +'72,73,,,,,,303,304,310,100,99,101,102,,,229,,,,,,,45,,,104,103,105,94', +'56,96,95,97,,98,106,107,,92,93,42,43,41,,,,,,,,,,,,,,,,,,,,222,,,228', +',,58,59,,,60,,,,,,44,,,,,,,,,227,,,,,91,81,84,85,,86,88,87,89,,,,,82', +'90,,74,75,71,,57,62,,83,63,64,,,,67,,65,66,68,30,31,72,73,,,,,,29,28', +'27,100,99,101,102,,,19,,,,,,,45,,,104,103,105,94,56,96,95,97,,98,106', +'107,,92,93,42,43,41,,,,,,,,,,,,,,,,,,,,222,,,228,,,58,59,,,60,,,,,,44', +',,,,,,,,20,,,,,91,81,84,85,,86,88,87,89,,,,,82,90,,74,75,71,,57,62,', +'83,63,64,,,,67,,65,66,68,307,308,72,73,,,,,,303,304,310,100,99,101,102', +',,229,,,,,,,45,,,104,103,105,94,56,96,95,97,282,98,106,107,,92,93,42', +'43,41,,,,,,,,,,,,,,,,,,,,222,,,228,,,58,59,,,60,,,,,,44,,,283,,,,,,227', +',,,,91,81,84,85,,86,88,87,89,,,,,82,90,,74,75,71,,57,62,,83,63,64,,', +',67,,65,66,68,307,308,72,73,,,,,,303,304,310,100,99,101,102,,,229,,', +',,,,45,,,104,103,105,94,56,96,95,97,,98,106,107,,92,93,42,43,41,,,,', +',,,,,,,,,,,,,,,222,,,228,,,58,59,,,60,,,,,,44,,,,,,,,,227,,,,,91,81', +'84,85,,86,88,87,89,,,,,82,90,,74,75,71,,57,62,,83,63,64,,,,67,,65,66', +'68,307,308,72,73,,,,,,303,304,310,100,99,101,102,,,229,,,,,,,45,,,104', +'103,105,94,56,96,95,97,,98,106,107,,92,93,42,43,41,,,,,,,,,,,,,,,,,', +',,222,,,228,,,58,59,,,60,,,,,,44,,,,,,,,,227,,,,,91,81,84,85,,86,88', +'87,89,,,,,82,90,,74,75,71,,57,62,,83,63,64,,,,67,,65,66,68,307,308,72', +'73,,,,,,303,304,310,100,99,101,102,,,229,,,,,,,45,,,104,103,105,94,56', +'96,95,97,,98,106,107,,92,93,42,43,41,,,,,,,,,,,,,,,,,,,,222,,,228,,', +'58,59,,,60,,,,,,44,,,,,,,,,227,,,,,91,81,84,85,,86,88,87,89,,,,,82,90', +',74,75,71,,57,62,,83,63,64,,,,67,,65,66,68,307,308,72,73,,,,,,303,304', +'310,100,99,101,102,,,229,,,,,,,45,,,104,103,105,94,56,96,95,97,,98,106', +'107,,92,93,42,43,41,,,,,,,,,,,,,,,,,,,,222,,,228,,,58,59,,,60,,,,,,44', +',,,,,,,,227,,,,,91,81,84,85,,86,88,87,89,,,,,82,90,,74,75,71,,57,62', +',83,63,64,,,,67,,65,66,68,307,308,72,73,,,,,,303,304,310,100,99,101', +'102,,,229,,,,,,,45,,,104,103,105,94,56,96,95,97,,98,106,107,,92,93,42', +'43,41,,,,,,,,,,,,,,,,,,,,222,,,228,,,58,59,,,60,,,,,,44,,,,,,,,,227', +',,,,91,81,84,85,,86,88,87,89,,,,,82,90,,74,75,71,,57,62,,83,63,64,,', +',67,,65,66,68,307,308,72,73,,,,,,303,304,310,100,99,101,102,,,229,,', +',,,,45,,,104,103,105,94,56,96,95,97,,98,106,107,,92,93,42,43,41,,,,', +',,,,,,,,,,,,,,,222,,,228,,,58,59,,,60,,,,,,44,,,,,,,,,227,,,,,91,81', +'84,85,,86,88,87,89,,,,,82,90,,74,75,71,,57,62,,83,63,64,,,,67,,65,66', +'68,30,31,72,73,,,,,,29,28,27,100,99,101,102,,,229,,,,,,,45,,,104,103', +'105,94,56,96,95,97,,98,106,107,,92,93,42,43,41,,,,,,,,,,,,,,,,,,,,222', +',,228,,,58,59,,,60,,,,,,44,,,,,,,,,227,,,,,91,81,84,85,,86,88,87,89', +',,,,82,90,,74,75,71,,57,62,,83,63,64,,,,67,,65,66,68,307,308,72,73,', +',,,,303,304,310,100,99,101,102,,,229,,,,,,,45,,,104,103,105,94,56,96', +'95,97,,98,106,107,,92,93,42,43,41,,,,,,,,,,,,,,,,,,,,222,,,228,,,58', +'59,,,60,,,,,,44,,,,,,,,,227,,,,,91,81,84,85,,86,88,87,89,,,,,82,90,', +'74,75,71,,57,62,,83,63,64,,,,67,,65,66,68,307,308,72,73,,,,,,303,304', +'310,100,99,101,102,,,229,,,,,,,45,,,104,103,105,94,56,96,95,97,,98,106', +'107,,92,93,42,43,41,,,,,,,,,,,,,,,,,,,,222,,,228,,,58,59,,,60,,,,,,44', +',,,,,,,,227,,,,,91,81,84,85,,86,88,87,89,,,,,82,90,,74,75,71,,57,62', +',83,63,64,,,,67,,65,66,68,307,308,72,73,,,,,,303,304,310,100,99,101', +'102,,,229,,,,,,,45,,,104,103,105,94,56,96,95,97,,98,106,107,,92,93,42', +'43,41,,,,,,,,,,,,,,,,,,,,222,,,228,,,58,59,,,60,,,,,,44,,,,,,,,,227', +',,,,91,81,84,85,,86,88,87,89,,,,,82,90,,74,75,71,,57,62,,83,63,64,,', +',67,,65,66,68,307,308,72,73,,,,,,303,304,310,100,99,101,102,,,229,,', +',,,,45,,,104,103,105,94,56,96,95,97,,98,106,107,,92,93,42,43,41,,,,', +',,,,,,,,,,,,,,,222,,,228,,,58,59,,,60,,,,,,44,,,,,,,,,227,,,,,91,81', +'84,85,,86,88,87,89,,,,,82,90,,74,75,71,,57,62,,83,63,64,,,,67,,65,66', +'68,307,308,72,73,,,,,,303,304,310,100,99,101,102,,,229,,,,,,,45,,,104', +'103,105,94,56,96,95,97,,98,106,107,,92,93,42,43,41,,,,,,,,,,,,,,,,,', +',,222,,,228,,,58,59,,,60,,,,,,44,,,,,,,,,227,,,,,91,81,84,85,,86,88', +'87,89,,,,,82,90,,74,75,71,,57,62,,83,63,64,,,,67,,65,66,68,307,308,72', +'73,,,,,,303,304,310,100,99,101,102,,,229,,,,,,,45,,,104,103,105,94,56', +'96,95,97,,98,106,107,,92,93,42,43,41,,,,,,,,,,,,,,,,,,,,222,,,228,,', +'58,59,,,60,,,,,,44,,,,,,,,,227,,,,,91,81,84,85,,86,88,87,89,,,,,82,90', +',74,75,71,,57,62,,83,63,64,,,,67,,65,66,68,307,308,72,73,,,,,,303,304', +'310,100,99,101,102,,,229,,,,,,,45,,,104,103,105,94,56,96,95,97,,98,106', +'107,,92,93,42,43,41,,,,,,,,,,,,,,,,,,,,222,,,228,,,58,59,,,60,,,,,,44', +',,,,,,,,227,,,,,91,81,84,85,,86,88,87,89,,,,,82,90,,74,75,71,,57,62', +',83,63,64,,,,67,,65,66,68,307,308,72,73,,,,,,303,304,310,100,99,101', +'102,,,229,,,,,,,45,,,104,103,105,94,56,96,95,97,,98,106,107,,92,93,42', +'43,41,,,,,,,,,,,,,,,,,,,,222,,,228,,,58,59,,,60,,,,,,44,,,,,,,,,227', +',,,,91,81,84,85,,86,88,87,89,,,,,82,90,,74,75,71,,57,62,,83,63,64,,', +',67,,65,66,68,307,308,72,73,,,,,,303,304,310,100,99,101,102,,,229,,', +',,,,45,,,104,103,105,94,56,96,95,97,,98,106,107,,92,93,42,43,41,,,,', +',,,,,,,,,,,,,,,222,,,228,,,58,59,,,60,,,,,,44,,,,,,,,,227,,,,,91,81', +'84,85,,86,88,87,89,,,,,82,90,,74,75,71,,57,62,,83,63,64,,,,67,,65,66', +'68,307,308,72,73,,,,,,303,304,310,100,99,101,102,,,229,,,,,,,45,,,104', +'103,105,94,56,96,95,97,,98,106,107,,92,93,42,43,41,,,,,,,,,,,,,,,,,', +',,222,,,228,,,58,59,,,60,,,,,,44,,,,,,,,,227,,,,,91,81,84,85,,86,88', +'87,89,,,,,82,90,,74,75,71,,57,62,,83,63,64,,,,67,,65,66,68,307,308,72', +'73,,,,,,303,304,310,100,99,101,102,,,229,,,,,,,45,,,104,103,105,94,56', +'96,95,97,,98,106,107,,92,93,42,43,41,,,,,,,,,,,,,,,,,,,,222,,,228,,', +'58,59,,,60,,,,,,44,,,,,,,,,227,,,,,91,81,84,85,,86,88,87,89,,,,,82,90', +',74,75,71,,57,62,,83,63,64,,,,67,,65,66,68,307,308,72,73,,,,,,303,304', +'310,100,99,101,102,,,229,,,,,,,45,,,104,103,105,94,56,96,95,97,,98,106', +'107,,92,93,42,43,41,,,,,,,,,,,,,,,,,,,,222,,,228,,,58,59,,,60,,,,,,44', +',,,,,,,,227,,,,,91,81,84,85,,86,88,87,89,,,,,82,90,,74,75,71,,57,62', +',83,63,64,,,,67,,65,66,68,307,308,72,73,,,,,,303,304,310,100,99,101', +'102,,,229,,,,,,,45,,,104,103,105,94,56,96,95,97,,98,106,107,,92,93,42', +'43,41,,,,,,,,,,,,,,,,,,,,222,,,228,,,58,59,,,60,,,,,,44,,,,,,,,,227', +',,,,91,81,84,85,,86,88,87,89,,,,,82,90,,74,75,71,,57,62,,83,63,64,,', +',67,,65,66,68,307,308,72,73,,,,,,303,304,310,100,99,101,102,,,229,,', +',,,,45,,,104,103,105,94,56,96,95,97,,98,106,107,,92,93,42,43,41,,,,', +',,,,,,,,,,,,,,,222,,,228,,,58,59,,,60,,,,,,44,,,,,,,,,227,,,,,91,81', +'84,85,,86,88,87,89,,,,,82,90,,74,75,71,,57,62,,83,63,64,,,,67,,65,66', +'68,307,308,72,73,,,,,,303,304,310,100,99,101,102,,,229,,,,,,,45,,,104', +'103,105,94,56,96,95,97,,98,106,107,,92,93,42,43,41,,,,,,,,,,,,,,,,,', +',,222,,,228,,,58,59,,,60,,,,,,44,,,,,,,,,227,,,,,91,81,84,85,,86,88', +'87,89,,,,,82,90,,74,75,71,,57,62,,83,63,64,,,,67,,65,66,68,307,308,72', +'73,,,,,,303,304,310,100,99,101,102,,,229,,,,,,,45,,,104,103,105,94,56', +'96,95,97,,98,106,107,,92,93,42,43,41,,,,,,,,,,,,,,,,,,,,222,,,228,,', +'58,59,,,60,,,,,,44,,,,,,,,,227,,,,,91,81,84,85,,86,88,87,89,,,,,82,90', +',74,75,71,,57,62,,83,63,64,,,,67,,65,66,68,307,308,72,73,,,,,,303,304', +'310,100,99,101,102,,,229,,,,,,,45,,,104,103,105,94,56,96,95,97,,98,106', +'107,,92,93,42,43,41,,,,,,,,,,,,,,,,,,,,222,,,228,,,58,59,,,60,,,,,,44', +',,,,,,,,227,,,,,91,81,84,85,,86,88,87,89,,,,,82,90,,74,75,71,,57,62', +',83,63,64,,,,67,,65,66,68,307,308,72,73,,,,,,303,304,310,100,99,101', +'102,,,229,,,,,,,45,,,104,103,105,94,56,96,95,97,,98,106,107,,92,93,42', +'43,41,,,,,,,,,,,,,,,,,,,,222,,,228,,,58,59,,,60,,,,,,44,,,,,,,,,227', +',,,,91,81,84,85,,86,88,87,89,,,,,82,90,,74,75,71,,57,62,,83,63,64,,', +',67,,65,66,68,30,31,72,73,,,,,,29,28,27,100,99,101,102,,,229,,,,,,,45', +',,104,103,105,94,56,96,95,97,282,98,106,107,,92,93,42,43,41,,,,,,,,', +',,,,,,,,,,,222,,,228,,,58,59,,,60,,280,,278,,44,,,283,,,,,,227,,,,,91', +'81,84,85,,86,88,87,89,,,,,82,90,,74,75,71,,57,62,,83,63,64,,,,67,,65', +'66,68,30,31,72,73,,,,,,29,28,27,100,99,101,102,,,229,,,,,,,45,,,104', +'103,105,94,56,96,95,97,282,98,106,107,,92,93,42,43,41,,,,,,,,,,,,,,', +',,,,,222,,,228,,,58,59,,,60,,280,,278,,44,,,283,,,,,,227,,,,,91,81,84', +'85,,86,88,87,89,,,,,82,90,,74,75,71,,57,62,,83,63,64,,,,67,,65,66,68', +'30,31,72,73,,,,,,29,28,27,100,99,101,102,,,229,,,,,,,45,,,104,103,105', +'94,56,96,95,97,282,98,106,107,,92,93,42,43,41,,,,,,,,,,,,,,,,,,,,222', +',,228,,,58,59,,,60,,280,,278,,44,,,283,,,,,,227,,,,,91,81,84,85,,86', +'88,87,89,,,,,82,90,217,74,75,71,,57,62,,83,63,64,,,,67,,65,66,68,307', +'308,72,73,,,,,,303,304,310,100,99,101,102,,,229,,,,,,,305,,,104,103', +'105,94,56,96,95,97,,98,106,107,,92,93,,,311,,,,,,,,,,,,,,,,,,,,854,', +',228,,,58,59,,,60,,,,,,,,,,,,,,,,,,,,91,81,84,85,,86,88,87,89,,,,,82', +'90,,74,75,71,,57,62,,83,63,64,,,,67,,65,66,68,307,308,72,73,,,,,,303', +'304,310,100,99,101,102,,,229,,,,,,,45,,,104,103,105,94,56,96,95,97,', +'98,106,107,,92,93,42,43,41,,,,,,,,,,,,,,,,,,,,222,,,228,,,58,59,,,60', +',,,,,44,,,,,,,,,227,,,,,91,81,84,85,,86,88,87,89,,,,,82,90,,74,75,71', +',57,62,,83,63,64,,,,67,,65,66,68,307,308,72,73,,,,,,303,304,310,100', +'99,101,102,,,229,,,,,,,45,,,104,103,105,94,56,96,95,97,,98,106,107,', +'92,93,42,43,41,,,,,,,,,,,,,,,,,,,,222,,,228,,,58,59,,,60,,,,,,44,,,', +',,,,,227,,,,,91,81,84,85,,86,88,87,89,,,,,82,90,,74,75,71,,57,62,,83', +'63,64,,,,67,,65,66,68,307,308,72,73,,,,,,303,304,310,100,99,101,102', +',,229,,,,,,,45,,,104,103,105,94,56,96,95,97,,98,106,107,,92,93,42,43', +'41,,,,,,,,,,,,,,,,,,,,222,,,228,,,58,59,,,60,,,,,,44,,,,,,,,,227,,,', +',91,81,84,85,,86,88,87,89,,,,,82,90,,74,75,71,,57,62,,83,63,64,,,,67', +',65,66,68,307,308,72,73,,,,,,303,304,310,100,99,101,102,,,229,,,,,,', +'45,,,104,103,105,94,56,96,95,97,,98,106,107,,92,93,42,43,41,,,,,,,,', +',,,,,,,,,,,222,,,228,,,58,59,,,60,,402,,,,44,,,,,,,,,227,,,,,91,81,84', +'85,,86,88,87,89,,,,,82,90,,74,75,71,,57,62,,83,63,64,,,,67,,65,66,68', +'307,308,72,73,,,,,,303,304,310,100,99,101,102,,,229,,,,,,,45,,,104,103', +'105,94,56,96,95,97,,98,106,107,,92,93,42,43,41,,,,,,,,,,,,,,,,,,,,222', +',,228,,,58,59,,,60,,,,,,44,,,,,,,,,227,,,,,91,81,84,85,,86,88,87,89', +',,,,82,90,,74,75,71,,57,62,,83,63,64,,,,67,,65,66,68,307,308,72,73,', +',,,,303,304,310,100,99,101,102,,,229,,,,,,,45,,,104,103,105,94,56,96', +'95,97,,98,106,107,,92,93,42,43,41,,,,,,,,,,,,,,,,,,,,222,,,228,,,58', +'59,,,60,,,,,,44,,,,,,,,,227,,,,,91,81,84,85,,86,88,87,89,,,,,82,90,', +'74,75,71,,57,62,,83,63,64,,,,67,,65,66,68,30,31,72,73,,,,,,29,28,27', +'100,99,101,102,,,19,,,,,,,45,,,104,103,105,94,56,96,95,97,,98,106,107', +',92,93,42,43,41,,,,,,,,,,,,,,,,,,,,222,,,228,,,58,59,,,60,,,,,,44,,', +',,,,,,20,,,,,91,81,84,85,,86,88,87,89,,,,,82,90,,74,75,71,,57,62,,83', +'63,64,,,,67,,65,66,68,30,31,72,73,,,,,,29,28,27,100,99,101,102,,,19', +',,,,,,45,,,104,103,105,94,56,96,95,97,,98,106,107,,92,93,42,43,41,,', +',,,,,,,,,,,,,,,,,222,,,228,,,58,59,,,60,,,,,,44,,,,,,,,,20,,,,,91,81', +'84,85,,86,88,87,89,,,,,82,90,,74,75,71,,57,62,,83,63,64,,,,67,,65,66', +'68,30,31,72,73,,,,,,29,28,27,100,99,101,102,,,19,,,,,,,45,,,104,103', +'105,94,56,96,95,97,,98,106,107,,92,93,42,43,41,,,,,,,,,,,,,,,,,,,,222', +',,228,,,58,59,,,60,,,,,,44,,,,,,,,,20,,,,,91,81,84,85,,86,88,87,89,', +',,,82,90,,74,75,71,9,57,62,,83,63,64,,,,67,,65,66,68,30,31,72,73,,,', +',,29,28,27,100,99,101,102,,,19,,,,,,8,45,290,10,104,103,105,94,56,96', +'95,97,,98,106,107,,92,93,42,43,41,237,241,246,247,248,243,245,253,254', +'249,250,,230,231,,,251,252,,40,,,33,,,58,59,,,60,,35,234,,240,44,236', +'235,,232,233,244,242,238,20,239,,,,91,81,84,85,,86,88,87,89,,,,,82,90', +',255,,,,386,62,,83,74,75,71,,57,,,,63,64,,,,67,,65,66,68,307,308,72', +'73,,,,,,303,304,310,100,99,101,102,,,229,,,,,,,45,,,104,103,105,94,56', +'96,95,97,,98,106,107,,92,93,42,43,41,,,,,,,,,,,,,,,,,,,,222,,,228,,', +'58,59,,,60,,,,,,44,,,,,,,,,227,,,,,91,81,84,85,,86,88,87,89,,,,,82,90', +',74,75,71,,57,62,,83,63,64,,,,67,,65,66,68,307,308,72,73,,,,,,303,304', +'310,100,99,101,102,,,229,,,,,,,45,,,104,103,105,94,56,96,95,97,282,98', +'106,107,,92,93,42,43,41,,,,,,,,,,,,,,,,,,,,222,,,228,,,58,59,,,60,,', +',278,,44,,,283,,,,,,227,,,,,91,81,84,85,,86,88,87,89,,,,,82,90,,74,75', +'71,,57,62,,83,63,64,,,,67,,65,66,68,307,308,72,73,,,,,,303,304,310,100', +'99,101,102,,,229,,,,,,,45,,,104,103,105,94,56,96,95,97,282,98,106,107', +',92,93,42,43,41,,,,,,,,,,,,,,,,,,,,222,,,228,,,58,59,,,60,,626,,278', +',44,,,283,,,,,,227,,,,,91,81,84,85,,86,88,87,89,,,,,82,90,,74,75,71', +',57,62,,83,63,64,,,,67,,65,66,68,30,31,72,73,,,,,,29,28,27,100,99,101', +'102,,,19,,,,,,,45,,,104,103,105,94,56,96,95,97,,98,106,107,,92,93,42', +'43,41,,,,,,,,,,,,,,,,,,,,222,,,228,,,58,59,,,60,,,,,,44,,,,,,,,,20,', +',,,91,81,84,85,,86,88,87,89,,,,,82,90,,74,75,71,,57,62,,83,63,64,,,', +'67,,65,66,68,307,308,72,73,,,,,,303,304,310,100,99,101,102,,,229,,,', +',,,45,,,104,103,105,94,56,96,95,97,,98,106,107,,92,93,42,43,41,,,,,', +',,,,,,,,,,,,,,222,,,228,,,58,59,,,60,,,,,,44,,,,,,,,,227,,,,,91,81,84', +'85,,86,88,87,89,,,,,82,90,,74,75,71,,57,62,,83,63,64,,,,67,,65,66,68', +'30,31,72,73,,,,,,29,28,27,100,99,101,102,,,19,,,,,,,45,,,104,103,105', +'94,56,96,95,97,,98,106,107,,92,93,42,43,41,,,,,,,,,,,,,,,,,,,,222,,', +'228,,,58,59,,,60,,,,,,44,,,,,,,,,20,,,,,91,81,84,85,,86,88,87,89,,,', +',82,90,,74,75,71,,57,62,,83,63,64,,,,67,,65,66,68,30,31,72,73,,,,,,29', +'28,27,100,99,101,102,,,19,,,,,,,45,,,104,103,105,94,56,96,95,97,,98', +'106,107,,92,93,42,43,41,,,,,,,,,,,,,,,,,,,,222,,,228,,,58,59,,,60,,', +',,,44,,,,,,,,,20,,,,,91,81,84,85,,86,88,87,89,,,,,82,90,,74,75,71,9', +'57,62,,83,63,64,,,,67,,65,66,68,30,31,72,73,,,,,,29,28,27,100,99,101', +'102,,,19,,,,,,8,45,7,10,104,103,105,94,56,96,95,97,,98,106,107,,92,93', +'42,43,41,237,241,246,247,248,243,245,253,254,249,250,,230,231,,,251', +'252,,40,,,33,,,58,59,,,60,,35,234,,240,44,236,235,,232,233,244,242,238', +'20,239,,,,91,81,84,85,,86,88,87,89,,,,,82,90,,255,,,,386,62,,83,74,75', +'71,,57,,,,63,64,,,,67,,65,66,68,307,308,72,73,,,,,,303,304,310,100,99', +'101,102,,,229,,,,,,,45,,,104,103,105,94,56,96,95,97,282,98,106,107,', +'92,93,42,43,41,,,,,,,,,,,,,,,,,,,,222,,,228,,,58,59,,,60,,280,,,,44', +',,283,,,,,,227,,,,,91,81,84,85,,86,88,87,89,,,,,82,90,,74,75,71,,57', +'62,,83,63,64,,,,67,,65,66,68,307,308,72,73,,,,,,303,304,310,100,99,101', +'102,,,229,,,,,,,45,,,104,103,105,94,56,96,95,97,,98,106,107,,92,93,42', +'43,41,,,,,,,,,,,,,,,,,,,,222,,,228,,,58,59,,,60,,,,,,44,,,,,,,,,227', +',,,,91,81,84,85,,86,88,87,89,,,,,82,90,,74,75,71,,57,62,,83,63,64,,', +',67,,65,66,68,307,308,72,73,,,,,,303,304,310,100,99,101,102,,,229,,', +',,,,45,,,104,103,105,94,56,96,95,97,,98,106,107,,92,93,42,43,41,,,,', +',,,,,,,,,,,,,,,222,,,228,,,58,59,,,60,,,,,,44,,,,,,,,,227,,,,,91,81', +'84,85,,86,88,87,89,,,,,82,90,,74,75,71,,57,62,,83,63,64,,,,67,,65,66', +'68,307,308,72,73,,,,,,303,304,310,100,99,101,102,,,229,,,,,,,45,,,104', +'103,105,94,56,96,95,97,,98,106,107,,92,93,42,43,41,,,,,,,,,,,,,,,,,', +',,222,,,228,,,58,59,,,60,,,,,,44,,,,,,,,,227,,,,,91,81,84,85,,86,88', +'87,89,,,,,82,90,,74,75,71,,57,62,,83,63,64,,,,67,,65,66,68,30,31,72', +'73,,,,,,29,28,27,100,99,101,102,,,229,,,,,,,45,,,104,103,105,94,56,96', +'95,97,282,98,106,107,,92,93,42,43,41,,,,,,,,,,,,,,,,,,,,222,,,228,,', +'58,59,,,60,,280,,278,,44,,,283,,,,,,227,,,,,91,81,84,85,,86,88,87,89', +',,,,82,90,,74,75,71,,57,62,,83,63,64,,,,67,,65,66,68,30,31,72,73,,,', +',,29,28,27,100,99,101,102,,,19,,,,,,,45,,,104,103,105,94,56,96,95,97', +',98,106,107,,92,93,42,43,41,,,,,,,,,,,,,,,,,,,,222,,,228,,,58,59,,,60', +',,,,,44,,,,,,,,,20,,,,,91,81,84,85,,86,88,87,89,,,,,82,90,,74,75,71', +',57,62,,83,63,64,,,,67,,65,66,68,307,308,72,73,,,,,,303,304,310,100', +'99,101,102,,,229,,,,,,,305,,,104,103,105,351,56,96,95,352,,98,106,107', +',92,93,,,311,,,,,,,,,,,,,,,,,,,,353,,,228,,,58,59,,,60,,,,,,,,,,,,,', +',,,,,,91,81,84,85,,86,88,87,89,,,,,82,90,,74,75,71,,57,62,,83,63,64', +',,,67,,65,66,68,307,308,72,73,,,,,,303,304,310,100,99,101,102,,,229', +',,,,,,305,,,104,103,105,351,56,96,95,352,,98,106,107,,92,93,,,311,,', +',,,,,,,,,,,,,,358,,,353,,,228,,,58,59,,,60,,,,,,,,,,,,,,,,,,,,91,81', +'84,85,,86,88,87,89,,,,,82,90,,74,75,71,,57,62,,83,63,64,,,,67,,65,66', +'68,307,308,72,73,,,,,,303,304,310,100,99,101,102,,,229,,,,,,,305,,,104', +'103,105,94,56,96,95,97,,98,106,107,,92,93,,,311,,,,,,,,,,,,,,,,,,,,346', +',,33,,,58,59,,,60,,35,,,,,,,,,,,,,,,,,,91,81,84,85,,86,88,87,89,,,,', +'82,90,,74,75,71,,57,62,,83,63,64,,,,67,,65,66,68,30,31,72,73,,,,,,29', +'28,27,100,99,101,102,,,19,,,,,,,45,,,104,103,105,94,56,96,95,97,,98', +'106,107,,92,93,42,43,41,237,241,246,247,248,243,245,253,254,249,250', +',230,231,,,251,252,,222,,,228,,,58,59,,,60,,,234,,240,44,236,235,,232', +'233,244,242,238,20,239,,,,91,81,84,85,,86,88,87,89,,,,,82,90,112,255', +',,,111,62,,83,74,75,71,,57,,,,63,64,,,,67,,65,66,68,307,308,72,73,,', +',,,303,304,310,100,99,101,102,,,229,,,,,,,45,,,104,103,105,94,56,96', +'95,97,,98,106,107,,92,93,42,43,41,,,,,,,,,,,,,,,,,,,,222,,,228,,,58', +'59,,,60,,,,,,44,,,,,,,,,227,,,,,91,81,84,85,,86,88,87,89,,,,,82,90,', +'74,75,71,,57,62,,83,63,64,,,,67,,65,66,68,307,308,72,73,,,,,,303,304', +'310,100,99,101,102,,,229,,,,,,,45,,,104,103,105,94,56,96,95,97,,98,106', +'107,,92,93,42,43,41,,,,,,,,,,,,,,,,,,,,222,,,228,,,58,59,,,60,,,,,,44', +',,,,,,,,227,,,,,91,81,84,85,,86,88,87,89,,,,,82,90,,74,75,71,,57,62', +',83,63,64,,,,67,,65,66,68,307,308,72,73,,,,,,303,304,310,100,99,101', +'102,,,229,,,,,,,45,,,104,103,105,94,56,96,95,97,,98,106,107,,92,93,42', +'43,41,,,,,,,,,,,,,,,,,,,,222,,,228,,,58,59,,,60,,,,,,44,,,,,,,,,227', +',,,,91,81,84,85,,86,88,87,89,,,,,82,90,,74,75,71,,57,62,,83,63,64,,', +',67,,65,66,68,307,308,72,73,,,,,,303,304,310,100,99,101,102,,,229,,', +',,,,305,,,104,103,105,94,56,96,95,97,,98,106,107,,92,93,,,311,,,,,,', +',,,,,,,,,,,,,301,,,297,,,58,59,,,60,,,,,,,,,,,,,,,,,,,,91,81,84,85,', +'86,88,87,89,,,,,82,90,,74,75,71,,57,62,,83,63,64,,,,67,,65,66,68,30', +'31,72,73,,,,,,29,28,27,100,99,101,102,,,19,,,,,,,45,,,104,103,105,94', +'56,96,95,97,,98,106,107,,92,93,42,43,41,,,,,,,,,,,,,,,,,,,,222,,,228', +',,58,59,,,60,,,,,,44,,,,,,,,,20,,,,,91,81,84,85,,86,88,87,89,,,,,82', +'90,,74,75,71,,57,62,,83,63,64,,,,67,,65,66,68,307,308,72,73,,,,,,303', +'304,310,100,99,101,102,,,229,,,,,,,45,,,104,103,105,94,56,96,95,97,', +'98,106,107,,92,93,42,43,41,,,,,,,,,,,,,,,,,,,,222,,,228,,,58,59,,,60', +',,,,,44,,,,,,,,,227,,,,,91,81,84,85,,86,88,87,89,,,,,82,90,,74,75,71', +',57,62,,83,63,64,,,,67,,65,66,68,307,308,72,73,,,,,,303,304,310,100', +'99,101,102,,,229,,,,,,,305,,,104,103,105,94,56,96,95,97,,98,106,107', +',92,93,,,311,,,,,,,,,,,,,,,,,,,,301,,,297,,,58,59,,,60,,,,,,,,,,,,,', +',,,,,,91,81,84,85,,86,88,87,89,,,,,82,90,,74,75,71,,57,62,,83,63,64', +',,,67,,65,66,68,30,31,72,73,,,,,,29,28,27,100,99,101,102,,,229,,,,,', +',45,,,104,103,105,94,56,96,95,97,282,98,106,107,,92,93,42,43,41,,,,', +',,,,,,,,,,,,,,,222,,,228,,,58,59,,,60,,280,,278,,44,,,283,,,,,,227,', +',,,91,81,84,85,,86,88,87,89,,,,,82,90,,74,75,71,9,57,62,,83,63,64,,', +',67,,65,66,68,30,31,72,73,,,,,,29,28,27,100,99,101,102,,,19,,,,,,8,45', +',10,104,103,105,94,56,96,95,97,,98,106,107,,92,93,42,43,41,,,,,,,,,', +',,,,,,,,,,40,,,33,,,58,59,,,60,,35,,,,44,,,,,,,,,20,,,,,91,81,84,85', +',86,88,87,89,,,,,82,90,,74,75,71,,57,62,,83,63,64,,,,67,,65,66,68,30', +'31,72,73,,,,,,29,28,27,100,99,101,102,,,19,,,,,,,45,,,104,103,105,94', +'56,96,95,97,,98,106,107,,92,93,42,43,41,237,241,246,247,248,243,245', +'253,254,249,250,,230,231,,,251,252,,222,,,228,,,58,59,,,60,,,234,,240', +'44,236,235,,232,233,244,242,238,20,239,,,,91,81,84,85,,86,88,87,89,', +',,,82,90,,255,-246,,,,62,,83,-246,-246,-246,,,-246,-246,-246,761,-246', +'666,665,664,762,667,,,,-246,-246,,,,675,,,,,,-246,-246,,-246,-246,-246', +'-246,-246,,,,,,,,,671,,,,,,,,,680,679,683,682,,,,676,,,,,,,,,-246,,-246', +',,,,-246,,-246,-246,-246,262,-246,-246,-246,-246,217,-246,,,,,,,,,-246', +'-246,-246,,,,,,-246,-246,,-246,-246,,-246,-246,-246,-246,-246,,,,,-246', +',,-246,,,,,-246,,,,,,,,,,-246,-246,-246,-246,-246,-246,-246,-246,-246', +'-246,-246,-246,-246,-246,,,-246,-246,-246,,,-246,,262,-246,,,-246,-246', +',-246,,-246,,-246,,-246,-246,,-246,-246,-246,-246,-246,,-246,-246,-246', +',,,,,,,,,,,,,-246,,-413,-246,-246,,-246,,-246,-413,-413,-413,,,-413', +'-413,-413,,-413,,,,,,,,,-413,-413,-413,,,,,,,,,-413,-413,,-413,-413', +'-413,-413,-413,,,,,,,,,,,,,,,,,,,,,,,-413,-413,-413,-413,-413,-413,-413', +'-413,-413,-413,-413,-413,-413,-413,,,-413,-413,-413,,,-413,,262,-413', +',,-413,-413,,-413,,-413,,-413,,-413,-413,,-413,-413,-413,-413,-413,-296', +'-413,-413,-413,,,,-296,-296,-296,,,-296,-296,-296,,-296,-413,,,-413', +'-413,,-413,,-413,-296,-296,,,,,,,,,-296,-296,,-296,-296,-296,-296,-296', +',,,,,,,,,,,,,,,,,,,,,,-296,-296,-296,-296,-296,-296,-296,-296,-296,-296', +'-296,-296,-296,-296,,,-296,-296,-296,,,-296,,271,-296,,,-296,-296,,-296', +',-296,,-296,,-296,-296,,-296,-296,-296,-296,-296,,-296,,-296,,,,,,,', +',,,,,,-296,,,-296,-296,,-296,,-296,172,183,173,196,169,189,179,178,199', +'200,194,177,176,171,197,201,202,181,170,184,188,190,182,175,,,,191,198', +'193,192,185,195,180,168,187,186,,,,,,167,174,165,166,162,163,164,123', +'125,,,124,,,,,,,,156,157,,153,135,136,137,144,141,143,,,138,139,,,,158', +'159,145,146,,,,,,,,,,,,,,150,149,,134,155,152,151,160,147,148,142,140', +'132,154,133,,,161,91,,,,,,,,,,,,,,90,172,183,173,196,169,189,179,178', +'199,200,194,177,176,171,197,201,202,181,170,184,188,190,182,175,,,,191', +'198,193,192,185,195,180,168,187,186,,,,,,167,174,165,166,162,163,164', +'123,125,122,,124,,,,,,,,156,157,,153,135,136,137,144,141,143,,,138,139', +',,,158,159,145,146,,,,,,,,,,,,,,150,149,,134,155,152,151,160,147,148', +'142,140,132,154,133,,,161,91,,,,,,,,,,,,,,90,172,183,173,196,169,189', +'179,178,199,200,194,177,176,171,197,201,202,181,170,184,188,190,182', +'175,,,,191,198,193,192,185,195,180,168,187,186,,,,,,167,174,165,166', +'162,163,164,123,125,,,124,,,,,,,,156,157,,153,135,136,137,144,141,143', +',,138,139,,,,158,159,145,146,,,,,,,,,,,,,,150,149,,134,155,152,151,160', +'147,148,142,140,132,154,133,,,161,91,,,,,,,,,,,,,,90,172,183,173,196', +'169,189,179,178,199,200,194,177,176,171,197,201,202,181,170,184,188', +'190,182,175,,,,191,198,193,192,185,195,180,168,187,186,,,,,,167,174', +'165,166,162,163,164,123,125,,,124,,,,,,,,156,157,,153,135,136,137,144', +'141,143,,,138,139,,,,158,159,145,146,,,,,,,,,,,,,,150,149,,134,155,152', +'151,160,147,148,142,140,132,154,133,,,161,91,,,,,,,,,,,,,,90,172,183', +'173,196,169,189,179,178,199,200,194,177,176,171,197,201,202,181,170', +'184,188,190,182,175,,,,191,198,193,192,185,195,180,168,187,186,,,,,', +'167,174,165,166,162,163,164,123,125,,,124,,,,,,,,156,157,,153,135,136', +'137,144,141,143,,,138,139,,,,158,159,145,146,,,,,,,,,,,,,,150,149,,134', +'155,152,151,160,147,148,142,140,132,154,133,,,161,172,183,173,196,169', +'189,179,178,199,200,194,177,176,171,197,201,202,181,170,184,188,190', +'182,175,,,,191,198,193,369,368,370,367,168,187,186,,,,,,167,174,165', +'166,364,365,366,362,125,96,95,363,,98,,,,,,156,157,,153,135,136,137', +'144,141,143,,,138,139,,,,158,159,145,146,,,,,,374,,,,,,,,150,149,,134', +'155,152,151,160,147,148,142,140,132,154,133,,,161,237,241,246,247,248', +'243,245,253,254,249,250,,230,231,,,251,252,,,807,,666,665,664,673,667', +',,,,,234,,240,675,236,235,,232,233,244,242,238,,239,237,241,246,247', +'248,243,245,253,254,249,250,671,230,231,,,251,252,,255,,,683,682,,,', +'676,,,,,234,,240,,236,235,,232,233,244,242,238,,239,237,241,246,247', +'248,243,245,253,254,249,250,,230,231,,,251,252,,255,807,,666,665,664', +'762,667,,,,,,234,,240,675,236,235,,232,233,244,242,238,,239,237,241', +'246,247,248,243,245,253,254,249,250,671,230,231,,,251,252,,255,,,683', +'682,,,,676,,,,,234,,240,,236,235,,232,233,244,242,238,,239,237,241,246', +'247,248,243,245,253,254,249,250,,230,231,,,251,252,217,255,807,,666', +'665,664,673,667,,,,,,234,,240,675,236,235,,232,233,244,242,238,,239', +'237,241,246,247,248,243,245,253,254,249,250,671,230,231,,,251,252,,255', +',,683,682,,,,676,,,,,234,,240,,236,235,,232,233,244,242,238,,239,237', +'241,246,247,248,243,245,253,254,249,250,,230,231,,,251,252,,255,669', +',666,665,664,673,667,,,,,,234,,240,675,236,235,,232,233,244,242,238', +',239,237,241,246,247,248,243,245,253,254,249,250,671,230,231,,,251,252', +',255,680,679,683,682,,,,676,,,,,234,,240,,236,235,,232,233,244,242,238', +',239,237,241,246,247,248,243,245,253,254,249,250,,230,231,,,251,252', +',255,,,,,,,,,,,,,234,,240,,236,235,,232,233,244,242,238,,239,,,,,,417', +'421,,,416,,,,,,,,156,157,255,153,135,136,137,144,141,143,,,138,139,', +',,158,159,145,146,,,,,,262,,,,,,,,150,149,,134,155,152,151,160,147,148', +'142,140,132,154,133,639,421,161,,640,,,,,,,,156,157,,153,135,136,137', +'144,141,143,,,138,139,,,,158,159,145,146,,,,,,262,,,,,,,,150,149,,134', +'155,152,151,160,147,148,142,140,132,154,133,605,414,161,,606,,,,,,,', +'156,157,,153,135,136,137,144,141,143,,,138,139,,,,158,159,145,146,,', +',,,262,,,,,,,,150,149,,134,155,152,151,160,147,148,142,140,132,154,133', +'968,421,161,,967,,,,,,,,156,157,,153,135,136,137,144,141,143,,,138,139', +',,,158,159,145,146,,,,,,262,,,,,,,,150,149,,134,155,152,151,160,147', +'148,142,140,132,154,133,636,414,161,,637,,,,,,,,156,157,,153,135,136', +'137,144,141,143,,,138,139,,,,158,159,145,146,,,,,,262,,,,,,,,150,149', +',134,155,152,151,160,147,148,142,140,132,154,133,472,414,161,,473,,', +',,,,,156,157,,153,135,136,137,144,141,143,,,138,139,,,,158,159,145,146', +',,,,,,,,,,,,,150,149,,134,155,152,151,160,147,148,142,140,132,154,133', +'994,414,161,,995,,,,,,,,156,157,,153,135,136,137,144,141,143,,,138,139', +',,,158,159,145,146,,,,,,262,,,,,,,,150,149,,134,155,152,151,160,147', +'148,142,140,132,154,133,607,421,161,,608,,,,,,,,156,157,,153,135,136', +'137,144,141,143,,,138,139,,,,158,159,145,146,,,,,,262,,,,,,,,150,149', +',134,155,152,151,160,147,148,142,140,132,154,133,605,414,161,,606,,', +',,,,,156,157,,153,135,136,137,144,141,143,,,138,139,,,,158,159,145,146', +',,,,,262,,,,,,,,150,149,,134,155,152,151,160,147,148,142,140,132,154', +'133,996,421,161,,997,,,,,,,,156,157,,153,135,136,137,144,141,143,,,138', +'139,,,,158,159,145,146,,,,,,262,,,,,,,,150,149,,134,155,152,151,160', +'147,148,142,140,132,154,133,472,414,161,,473,,,,,,,,156,157,,153,135', +'136,137,144,141,143,,,138,139,,,,158,159,145,146,,,,,,262,,,,,,,,150', +'149,,134,155,152,151,160,147,148,142,140,132,154,133,701,421,161,,702', +',,,,,,,156,157,,153,135,136,137,144,141,143,,,138,139,,,,158,159,145', +'146,,,,,,262,,,,,,,,150,149,,134,155,152,151,160,147,148,142,140,132', +'154,133,607,421,161,,608,,,,,,,,156,157,,153,135,136,137,144,141,143', +',,138,139,,,,158,159,145,146,,,,,,262,,,,,,,,150,149,,134,155,152,151', +'160,147,148,142,140,132,154,133,698,421,161,,699,,,,,,,,156,157,,153', +'135,136,137,144,141,143,,,138,139,,,,158,159,145,146,,,,,,262,,,,,,', +',150,149,,134,155,152,151,160,147,148,142,140,132,154,133,696,414,161', +',697,,,,,,,,156,157,,153,135,136,137,144,141,143,,,138,139,,,,158,159', +'145,146,,,,,,262,,,,,,,,150,149,,134,155,152,151,160,147,148,142,140', +'132,154,133,410,414,161,,411,,,,,,,,156,157,,153,135,136,137,144,141', +'143,,,138,139,,,,158,159,145,146,,,,,,262,,,,,,,,150,149,,134,155,152', +'151,160,147,148,142,140,132,154,133,,807,161,666,665,664,762,667,807', +',666,665,664,762,667,807,675,666,665,664,762,667,,675,,,,,,761,675,666', +'665,664,762,667,,,671,,,,,,675,671,,,,683,682,,671,,676,,683,682,,,', +'676,,683,682,,671,,676,,,,,,,680,679,683,682,,,807,676,666,665,664,673', +'667,807,,666,665,664,673,667,,675,,,,,,669,675,666,665,664,673,667,', +',,,,,,,675,671,,,,,,,671,,,,683,682,,,,676,,683,682,,671,,676,,,,,,', +'680,679,683,682,,,669,676,666,665,664,673,667,,669,,666,665,664,673', +'667,675,,,,,,,,675,,669,,666,665,664,673,667,,,,,,671,655,,675,,,,,671', +'680,679,683,682,,,,676,680,679,683,682,,,,676,671,,669,,666,665,664', +'673,667,680,679,683,682,,,,676,675,,807,,666,665,664,673,667,,669,,666', +'665,664,673,667,675,,,,,671,,,675,,,,,,680,679,683,682,,,,676,671,,', +',,,,,671,711,,683,682,,,,676,680,679,683,682,,,761,676,666,665,664,762', +'667,,761,,666,665,664,762,667,675,,,,,,,,675,,807,,666,665,664,762,667', +',,,,,671,,,675,,,,,671,680,679,683,682,,,,676,680,679,683,682,,,,676', +'671,,669,,666,665,664,673,667,,,683,682,,,,676,675,,,,,,,,,,,,,,,,,', +',,,,671,711,,,,,,,,680,679,683,682,,,,676' ] + racc_action_table = arr = ::Array.new(24856, nil) + idx = 0 + clist.each do |str| + str.split(',', -1).each do |i| + arr[idx] = i.to_i unless i.empty? + idx += 1 + end + end + +clist = [ +'94,120,120,120,120,120,120,94,94,94,120,120,94,94,94,120,94,120,120', +'120,120,120,120,120,94,617,94,94,94,120,120,120,120,120,120,120,94,94', +'120,94,94,94,94,94,120,120,120,120,120,120,120,120,120,120,120,120,1016', +'120,120,120,357,120,120,120,120,120,94,94,94,94,94,94,94,94,94,94,94', +'94,94,94,1,538,94,94,94,120,94,94,120,822,94,120,120,94,94,120,94,120', +'94,61,94,120,94,94,19,94,94,94,94,94,120,94,617,94,343,120,120,120,120', +'478,120,120,120,120,58,605,994,94,120,120,94,94,94,94,607,94,120,94', +'120,94,995,607,607,607,823,19,607,607,607,381,607,344,479,347,478,7', +'996,557,557,607,607,607,607,545,58,337,357,1013,694,888,607,607,382', +'607,607,607,607,607,605,863,336,24,521,521,654,538,61,479,24,357,538', +'696,331,10,357,331,618,537,822,440,607,607,607,607,607,607,607,607,607', +'607,607,607,607,607,697,381,607,607,607,12,607,607,470,343,607,647,647', +'607,607,13,607,618,607,996,607,306,607,607,382,607,607,607,607,607,994', +'607,607,607,823,994,637,557,440,823,636,16,557,470,995,223,344,607,347', +'995,607,607,607,607,608,607,22,607,545,607,996,608,608,608,221,996,608', +'608,608,337,608,1013,694,888,337,694,1013,694,888,654,608,608,608,863', +'336,306,696,537,863,336,608,608,537,608,608,608,608,608,223,698,37,699', +'637,14,572,647,636,26,306,697,14,434,434,561,561,327,40,221,327,14,608', +'608,608,608,608,608,608,608,608,608,608,608,608,608,45,574,608,608,608', +'220,608,608,637,108,608,637,636,608,608,636,608,637,608,377,608,636', +'608,608,606,608,608,608,608,608,698,608,699,608,572,572,806,26,806,806', +'806,893,806,893,572,376,749,608,351,380,608,608,608,608,417,608,203', +'608,220,608,26,417,417,417,222,574,574,417,417,446,417,434,631,561,698', +'574,699,606,631,417,365,363,352,377,377,377,79,365,363,224,417,417,588', +'417,417,417,417,417,79,749,351,446,311,311,225,446,446,351,79,376,376', +'376,351,380,380,380,351,229,806,261,417,417,417,417,417,417,417,417', +'417,417,417,417,417,417,352,351,417,417,417,588,417,352,362,315,417', +'588,352,417,383,362,352,275,417,276,417,379,417,417,701,417,417,417', +'417,417,416,417,417,417,279,352,353,416,416,416,353,853,38,416,416,447', +'416,417,853,328,417,417,328,417,368,417,315,853,775,417,3,368,315,639', +'290,3,416,416,318,416,416,416,416,416,291,318,701,447,383,383,383,447', +'447,701,318,379,379,379,701,38,912,653,701,912,653,38,416,416,416,416', +'416,416,416,416,416,416,416,416,416,416,775,701,416,416,416,639,416', +'775,293,556,416,294,639,416,556,15,775,639,416,378,416,639,416,416,295', +'416,416,416,416,416,97,416,301,416,39,775,304,97,97,97,639,410,97,97', +'97,923,97,416,335,335,416,416,923,416,97,416,97,97,97,416,826,923,15', +'984,984,826,97,97,15,97,97,97,97,97,943,369,943,943,943,997,943,39,369', +'378,378,378,997,39,410,794,794,997,305,411,410,997,97,97,97,97,97,97', +'97,97,97,97,97,97,97,97,310,840,97,97,97,505,97,97,219,312,97,840,505', +'97,97,219,97,316,97,317,97,505,97,97,219,97,97,97,97,97,411,97,299,97', +'366,364,411,320,286,299,325,366,364,286,840,840,943,97,299,840,97,97', +'97,97,422,97,329,97,372,97,330,422,422,422,791,372,422,422,422,803,422', +'803,803,803,791,803,298,465,370,422,422,422,422,298,340,370,685,685', +'332,340,422,422,298,422,422,422,422,422,367,712,17,17,341,466,712,367', +'803,791,791,465,41,41,791,465,465,803,465,465,342,346,422,422,422,422', +'422,422,422,422,422,422,422,422,422,422,348,466,422,422,422,466,466', +'422,466,466,422,392,398,422,422,400,422,403,422,406,422,408,422,422', +'409,422,422,422,422,422,345,422,422,422,418,426,883,345,883,883,883', +'436,883,448,449,450,345,422,451,355,422,422,422,422,476,422,355,422', +'0,0,0,0,0,0,122,355,480,0,0,122,122,495,0,883,0,0,0,0,0,0,0,496,883', +'499,501,506,0,0,0,0,0,0,0,510,671,0,671,671,671,519,671,0,0,0,0,0,0', +'0,0,0,0,0,0,520,0,0,0,916,0,0,0,0,0,1003,916,1003,1003,1003,522,1003', +'548,671,983,916,983,983,983,548,983,534,671,539,0,302,540,0,548,569', +'0,0,302,577,0,579,0,585,589,594,0,302,1003,599,981,609,981,981,981,0', +'981,983,611,616,0,0,0,0,623,0,0,0,0,625,630,633,635,0,0,228,228,228', +'228,228,228,0,638,0,228,228,641,981,642,228,645,228,228,228,228,228', +'228,228,6,6,6,6,6,228,228,228,228,228,228,228,646,944,228,944,944,944', +'648,944,228,228,228,228,228,228,228,228,228,228,228,228,651,228,228', +'228,657,228,228,228,228,228,459,885,702,885,885,885,658,885,944,702', +'660,661,662,669,702,677,459,459,702,228,681,684,228,687,692,228,228', +'695,704,228,709,228,459,728,459,228,459,459,885,459,459,733,751,459', +'228,459,752,754,755,228,228,228,228,756,228,228,228,228,758,759,760', +'761,228,228,710,710,710,710,710,710,228,765,228,710,710,769,770,774', +'710,778,710,710,710,710,710,710,710,289,289,289,289,289,710,710,710', +'710,710,710,710,781,966,710,966,966,966,782,966,710,710,710,710,710', +'710,710,710,710,710,710,710,785,710,710,710,790,710,710,710,710,710', +'461,461,461,461,461,461,461,922,640,461,461,924,805,808,922,640,461', +'461,924,710,640,813,710,922,640,710,710,924,816,710,825,710,461,829', +'461,710,461,461,830,461,461,461,461,461,710,461,833,834,850,710,710', +'710,710,854,710,710,710,710,856,869,870,874,710,710,621,621,621,621', +'621,621,710,875,710,621,621,877,878,880,621,882,621,621,621,621,621', +'621,621,493,493,493,493,493,621,621,621,621,621,621,621,565,565,621', +'884,565,565,565,890,621,621,621,621,621,621,621,621,621,621,621,621', +'891,621,621,621,897,621,621,621,621,621,445,445,445,445,445,445,445', +'445,445,445,445,926,445,445,46,902,445,445,926,621,905,46,621,906,907', +'621,621,926,908,621,46,621,445,910,445,621,445,445,925,445,445,445,445', +'445,621,445,928,929,945,621,621,621,621,967,621,621,621,621,968,969', +'976,977,621,621,954,954,954,954,954,954,621,978,621,954,954,979,980', +'982,954,985,954,954,954,954,954,954,954,986,987,988,989,990,954,954', +'954,954,954,954,954,993,851,954,851,851,851,1004,851,954,954,954,954', +'954,954,954,954,954,954,954,954,1014,954,954,954,1015,954,954,954,954', +'954,468,468,468,468,468,468,468,468,973,468,468,300,,,,973,468,468,300', +'954,,,954,,973,954,954,300,,954,,954,468,,468,954,468,468,,468,468,468', +'468,468,954,468,,,,954,954,954,954,,954,954,954,954,,,,,954,954,620', +'620,620,620,620,620,954,,954,620,620,,,,620,,620,620,620,620,620,620', +'620,,,,,,620,620,620,620,620,620,620,,,620,,,,,429,620,620,620,620,620', +'620,620,620,620,620,620,620,,620,620,620,,620,620,620,620,620,429,429', +'429,429,429,429,429,429,429,429,429,,429,429,,,429,429,,620,,,620,,', +'620,620,,,620,,620,429,,429,620,429,429,,429,429,429,429,429,620,429', +',,,620,620,620,620,,620,620,620,620,,,,,620,620,,429,56,429,,,620,,620', +'56,56,56,,,56,56,56,458,56,,,,,,,,,,56,56,56,,,458,458,,,,56,56,,56', +'56,56,56,56,,,,458,,458,,458,458,,458,458,,,458,,458,,,,,,56,56,56,56', +'56,56,56,56,56,56,56,56,56,56,,,56,56,56,,,56,,,56,,,56,56,,56,,56,', +'56,,56,56,,56,56,56,56,56,,56,,56,,,,,,,,,,,,,,56,,,56,56,56,56,,56', +',56,615,615,615,615,615,615,,,,615,615,,,,615,,615,615,615,615,615,615', +'615,,,,,,615,615,615,615,615,615,615,,,615,,,,,,615,615,615,615,615', +'615,615,615,615,615,615,615,,615,615,615,,615,615,615,615,615,467,467', +'467,467,467,467,467,,,467,467,,,,,,467,467,,615,,,615,,,615,615,,,615', +',615,467,,467,615,467,467,,467,467,467,467,467,615,467,,,,615,615,615', +'615,,615,615,615,615,,,,,615,615,323,323,323,323,323,323,615,,615,323', +'323,,,,323,,323,323,323,323,323,323,323,,,,,,323,323,323,323,323,323', +'323,,,323,,,,,,323,323,323,323,323,323,323,323,323,323,323,323,,323', +'323,323,,323,323,323,323,323,460,460,460,460,460,460,460,,,460,460,', +',,,,460,460,,323,,,323,,,323,323,,,323,,323,460,,460,323,460,460,,460', +'460,460,460,460,323,460,,,,323,323,323,323,,323,323,323,323,,,,,323', +'323,297,297,297,297,297,297,323,,323,297,297,,,,297,,297,297,297,297', +'297,297,297,,,,,,297,297,297,297,297,297,297,,,297,,,,,,297,297,297', +'297,297,297,297,297,297,297,297,297,,297,297,297,,297,297,297,297,297', +'463,463,463,463,463,463,463,,,463,463,,,,,,463,463,,297,,,297,,,297', +'297,,,297,,297,463,,463,297,463,463,,463,463,463,463,463,297,463,,,', +'297,297,297,297,,297,297,297,297,,,,,297,297,558,558,558,558,558,558', +'297,,297,558,558,,,,558,,558,558,558,558,558,558,558,,,,,,558,558,558', +'558,558,558,558,,,558,,,,,,558,558,558,558,558,558,558,558,558,558,558', +'558,,558,558,558,,558,558,558,558,558,444,444,444,444,444,444,444,444', +'444,444,444,,444,444,,,444,444,,558,,,558,,,558,558,,,558,,558,444,', +'444,558,444,444,,444,444,444,444,444,558,444,,,,558,558,558,558,,558', +'558,558,558,,,,,558,558,921,921,921,921,921,921,558,,558,921,921,,,', +'921,,921,921,921,921,921,921,921,,,,,,921,921,921,921,921,921,921,,', +'921,,,,,,921,921,921,921,921,921,921,921,921,921,921,921,,921,921,921', +',921,921,921,921,921,462,462,462,462,462,462,462,,,462,462,,,,,,462', +'462,,921,,,921,,,921,921,,,921,,921,462,,462,921,462,462,,462,462,462', +'462,462,921,462,,,,921,921,921,921,,921,921,921,921,,,,,921,921,817', +'817,817,817,817,817,921,,921,817,817,,,,817,,817,817,817,817,817,817', +'817,,,,,,817,817,817,817,817,817,817,,,817,,,,,,817,817,817,817,817', +'817,817,817,817,817,817,817,,817,817,817,,817,817,817,817,817,457,,', +',,,,,,,,,,,,,457,457,,817,,,817,,,817,817,,,817,,817,457,,457,817,457', +'457,,457,457,,,457,817,457,,,,817,817,817,817,,817,817,817,817,,,,,817', +'817,818,818,818,818,818,818,817,,817,818,818,,,,818,,818,818,818,818', +'818,818,818,,,,,,818,818,818,818,818,818,818,,,818,,,,,,818,818,818', +'818,818,818,818,818,818,818,818,818,,818,818,818,,818,818,818,818,818', +'456,,,,,,,,,,,,,,,,456,456,,818,,,818,,,818,818,,,818,,818,456,,456', +'818,456,456,,456,456,,,456,818,456,,,,818,818,818,818,,818,818,818,818', +',,,,818,818,860,860,860,860,860,860,818,,818,860,860,,,,860,,860,860', +'860,860,860,860,860,,,,,,860,860,860,860,860,860,860,,,860,,,,,,860', +'860,860,860,860,860,860,860,860,860,860,860,,860,860,860,,860,860,860', +'860,860,455,455,455,455,455,455,455,,,455,455,,,,,,455,455,,860,,,860', +',,860,860,,,860,,860,455,,455,860,455,455,,455,455,455,455,455,860,455', +',,,860,860,860,860,,860,860,860,860,,,,,860,860,536,536,536,536,536', +'536,860,,860,536,536,,,,536,,536,536,536,536,536,536,536,,,,,,536,536', +'536,536,536,536,536,,,536,,,,,,536,536,536,536,536,536,536,536,536,536', +'536,536,,536,536,536,,536,536,536,536,536,464,464,464,464,464,464,464', +',,464,464,,,,,,464,464,,536,,,536,,,536,536,,,536,,536,464,,464,536', +'464,464,,464,464,464,464,464,536,464,,,,536,536,536,536,,536,536,536', +'536,,,,,536,536,494,494,494,494,494,494,536,,536,494,494,,,,494,,494', +'494,494,494,494,494,494,,,,,,494,494,494,494,494,494,494,,,494,,,,,', +'494,494,494,494,494,494,494,494,494,494,494,494,,494,494,494,,494,494', +'494,494,494,452,,,,,,,,,,,,,,,,452,452,,494,,,494,,,494,494,,,494,,494', +'452,,452,494,452,452,,452,452,,,,494,,,,,494,494,494,494,,494,494,494', +'494,,,,,494,494,533,533,533,533,533,533,494,,494,533,533,,,,533,,533', +'533,533,533,533,533,533,,,,,,533,533,533,533,533,533,533,,,533,,,,,', +'533,533,533,533,533,533,533,533,533,533,533,533,,533,533,533,,533,533', +'533,533,533,453,,,,,,,,,,,,,,,,453,453,,533,,,533,,,533,533,,,533,,533', +'453,,453,533,453,453,,453,453,,,,533,,,,,533,533,533,533,,533,533,533', +'533,,,,,533,533,867,867,867,867,867,867,533,,533,867,867,,,,867,,867', +'867,867,867,867,867,867,,,,,,867,867,867,867,867,867,867,,,867,,,,,', +'867,867,867,867,867,867,867,867,867,867,867,867,,867,867,867,,867,867', +'867,867,867,454,,,,,,,,,,,,,,,,454,454,,867,,,867,,,867,867,,,867,,867', +'454,,,867,454,454,,454,454,,,,867,,,,,867,867,867,867,,867,867,867,867', +',,,,867,867,868,868,868,868,868,868,867,,867,868,868,,,,868,,868,868', +'868,868,868,868,868,,,,,,868,868,868,868,868,868,868,,,868,,,,,,868', +'868,868,868,868,868,868,868,868,868,868,868,,868,868,868,,868,868,868', +'868,868,,,,,,,,,,,,,,,,,,,,868,,,868,,,868,868,,,868,,868,,,,868,,,', +',,,,,868,,,,,868,868,868,868,,868,868,868,868,,,,,868,868,821,821,821', +'821,821,821,868,,868,821,821,,,,821,,821,821,821,821,821,821,821,,,', +',,821,821,821,821,821,821,821,,,821,,,,,,821,821,821,821,821,821,821', +'821,821,821,821,821,,821,821,821,,821,821,821,821,821,,,,,,,,,,,,,,', +',,,,,821,,,821,,,821,821,,,821,,821,,,,821,,,,,,,,,821,,,,,821,821,821', +'821,,821,821,821,821,,,,,821,821,205,205,205,205,205,205,821,,821,205', +'205,,,,205,,205,205,205,205,205,205,205,,,,,,205,205,205,205,205,205', +'205,,,205,,,,,,205,205,205,205,205,205,205,205,205,205,205,205,,205', +'205,205,,205,205,205,205,205,,,,,,,,,,,,,,,,,,,,205,,,205,,,205,205', +',,205,,205,,,,205,,,,,,,,,205,,,,,205,205,205,205,,205,205,205,205,', +',,,205,205,33,33,33,33,33,33,205,,205,33,33,,,,33,,33,33,33,33,33,33', +'33,,,,,,33,33,33,33,33,33,33,,,33,,,,,,33,33,33,33,33,33,33,33,33,33', +'33,33,,33,33,33,,33,33,33,33,33,,,,,,,,,,,,,,,,,,,,33,,,33,,,33,33,', +',33,,33,,,,33,,,,,,,,,33,,,,,33,33,33,33,,33,33,33,33,,,,,33,33,780', +'780,780,780,780,780,33,,33,780,780,,,,780,,780,780,780,780,780,780,780', +',,,,,780,780,780,780,780,780,780,,,780,,,,,,780,780,780,780,780,780', +'780,780,780,780,780,780,,780,780,780,,780,780,780,780,780,,,,,,,,,,', +',,,,,,,,,780,,,780,,,780,780,,,780,,780,,,,780,,,,,,,,,780,,,,,780,780', +'780,780,,780,780,780,780,,,,,780,780,946,946,946,946,946,946,780,,780', +'946,946,,,,946,,946,946,946,946,946,946,946,,,,,,946,946,946,946,946', +'946,946,,,946,,,,,,946,946,946,946,946,946,946,946,946,946,946,946,', +'946,946,946,,946,946,946,946,946,,,,,,,,,,,,,,,,,,,,946,,,946,,,946', +'946,,,946,,946,,,,946,,,,,,,,,946,,,,,946,946,946,946,,946,946,946,946', +',,,,946,946,705,705,705,705,705,705,946,,946,705,705,,,,705,,705,705', +'705,705,705,705,705,,,,,,705,705,705,705,705,705,705,,,705,,,,,,705', +'705,705,705,705,705,705,705,705,705,705,705,,705,705,705,,705,705,705', +'705,705,,,,,,,,,,,,,,,,,,,,705,,,705,,,705,705,,,705,,705,,,,705,,,', +',,,,,705,,,,,705,705,705,705,,705,705,705,705,,,,,705,705,952,952,952', +'952,952,952,705,,705,952,952,,,,952,,952,952,952,952,952,952,952,,,', +',,952,952,952,952,952,952,952,,,952,,,,,,952,952,952,952,952,952,952', +'952,952,952,952,952,,952,952,952,,952,952,952,952,952,,,,,,,,,,,,,,', +',,,,,952,,,952,,,952,952,,,952,,952,,,,952,,,,,,,,,952,,,,,952,952,952', +'952,,952,952,952,952,,,,,952,952,292,292,292,292,292,292,952,,952,292', +'292,,,,292,,292,292,292,292,292,292,292,,,,,,292,292,292,292,292,292', +'292,,,292,,,,,,292,292,292,292,292,292,292,292,292,292,292,292,,292', +'292,292,,292,292,292,292,292,,,,,,,,,,,,,,,,,,,,292,,,292,,,292,292', +',,292,,292,,,,292,,,,,,,,,292,,,,,292,292,292,292,,292,292,292,292,', +',,,292,292,768,768,768,768,768,768,292,,292,768,768,,,,768,,768,768', +'768,768,768,768,768,,,,,,768,768,768,768,768,768,768,,,768,,,,,,768', +'768,768,768,768,768,768,768,768,768,768,768,,768,768,768,,768,768,768', +'768,768,,,,,,,,,,,,,,,,,,,,768,,,768,,,768,768,,,768,,768,,,,768,,,', +',,,,,768,,,,,768,768,768,768,,768,768,768,768,,,,,768,768,827,827,827', +'827,827,827,768,,768,827,827,,,,827,,827,827,827,827,827,827,827,,,', +',,827,827,827,827,827,827,827,,,827,,,,,610,827,827,827,827,827,827', +'827,827,827,827,827,827,,827,827,827,,827,827,827,827,827,610,610,610', +'610,610,610,610,610,610,610,610,,610,610,,,610,610,,827,,,827,,,827', +'827,,,827,,827,610,,610,827,610,610,,610,610,610,610,610,827,610,,,', +'827,827,827,827,,827,827,827,827,,,,,827,827,,610,421,,,,827,,827,421', +'421,421,,,421,421,421,,421,,,,,,,,,421,421,421,421,,,,,,,,421,421,,421', +'421,421,421,421,,,,,,,,,,,,,,,,,,,,,,,421,421,421,421,421,421,421,421', +'421,421,421,421,421,421,,,421,421,421,,,421,,,421,,,421,421,,421,,421', +',421,,421,421,,421,421,421,421,421,,421,421,421,,,,,,,,,,,,,,421,,,421', +'421,421,421,,421,,421,720,720,720,720,720,720,,,,720,720,,,,720,,720', +'720,720,720,720,720,720,,,,,,720,720,720,720,720,720,720,,,720,,,,,', +'720,720,720,720,720,720,720,720,720,720,720,720,,720,720,720,,720,720', +'720,720,720,,,,,,,,,,,,,,,,,,,,720,,,720,,,720,720,,,720,,720,,,,720', +',,,,,,,,720,,,,,720,720,720,720,,720,720,720,720,,,,,720,720,,282,282', +'282,,282,720,,720,282,282,,,,282,,282,282,282,282,282,282,282,,,,,,282', +'282,282,282,282,282,282,,,282,,,,,,,282,,,282,282,282,282,282,282,282', +'282,,282,282,282,,282,282,282,282,282,,,,,,,,,,,,,,,,,,,,282,,,282,', +',282,282,,,282,,,,,,282,,,,,,,,,282,,,,,282,282,282,282,,282,282,282', +'282,,,,,282,282,,283,283,283,,283,282,,282,283,283,,,,283,,283,283,283', +'283,283,283,283,,,,,,283,283,283,283,283,283,283,,,283,,,,,,,283,,,283', +'283,283,283,283,283,283,283,,283,283,283,,283,283,283,283,283,,,,,,', +',,,,,,,,,,,,,283,,,283,,,283,283,,,283,,,,,,283,,,,,,,,,283,,,,,283', +'283,283,283,,283,283,283,283,,,,,283,283,,233,233,233,,233,283,,283', +'233,233,,,,233,,233,233,233,233,233,233,233,,,,,,233,233,233,233,233', +'233,233,,,233,,,,,,,233,,,233,233,233,233,233,233,233,233,,233,233,233', +',233,233,233,233,233,,,,,,,,,,,,,,,,,,,,233,,,233,,,233,233,,,233,,', +',,,233,,,,,,,,,233,,,,,233,233,233,233,,233,233,233,233,,,,,233,233', +',232,232,232,,232,233,,233,232,232,,,,232,,232,232,232,232,232,232,232', +',,,,,232,232,232,232,232,232,232,,,232,,,,,,,232,,,232,232,232,232,232', +'232,232,232,,232,232,232,,232,232,232,232,232,,,,,,,,,,,,,,,,,,,,232', +',,232,,,232,232,,,232,,,,,,232,,,,,,,,,232,,,,,232,232,232,232,,232', +'232,232,232,,,,,232,232,,643,643,643,,643,232,,232,643,643,,,,643,,643', +'643,643,643,643,643,643,,,,,,643,643,643,643,643,643,643,,,643,,,,,', +',643,,,643,643,643,643,643,643,643,643,,643,643,643,,643,643,,,643,', +',,,,,,,,,,,,,,,,,,643,,,643,,,643,643,,,643,,,,,,,,,,,,,,,,,,,,643,643', +'643,643,,643,643,643,643,,,,,643,643,,231,231,231,,231,643,,643,231', +'231,,,,231,,231,231,231,231,231,231,231,,,,,,231,231,231,231,231,231', +'231,,,231,,,,,,,231,,,231,231,231,231,231,231,231,231,,231,231,231,', +'231,231,231,231,231,,,,,,,,,,,,,,,,,,,,231,,,231,,,231,231,,,231,,,', +',,231,,,,,,,,,231,,,,,231,231,231,231,,231,231,231,231,,,,,231,231,', +'230,230,230,,230,231,,231,230,230,,,,230,,230,230,230,230,230,230,230', +',,,,,230,230,230,230,230,230,230,,,230,,,,,,,230,,,230,230,230,230,230', +'230,230,230,,230,230,230,,230,230,230,230,230,,,,,,,,,,,,,,,,,,,,230', +',,230,,,230,230,,,230,,,,,,230,,,,,,,,,230,,,,,230,230,230,230,,230', +'230,230,230,,,,,230,230,,20,20,20,,20,230,,230,20,20,,,,20,,20,20,20', +'20,20,20,20,,,,,,20,20,20,20,20,20,20,,,20,,,,,,,20,,,20,20,20,20,20', +'20,20,20,,20,20,20,,20,20,20,20,20,,,,,,,,,,,,,,,,,,,,20,,,20,,,20,20', +',,20,,,,,,20,,,,,,,,,20,,,,,20,20,20,20,,20,20,20,20,,,,,20,20,,801', +'801,801,,801,20,,20,801,801,,,,801,,801,801,801,801,801,801,801,,,,', +',801,801,801,801,801,801,801,,,801,,,,,,,801,,,801,801,801,801,801,801', +'801,801,,801,801,801,,801,801,801,801,801,,,,,,,,,,,,,,,,,,,,801,,,801', +',,801,801,,,801,,,,,,801,,,,,,,,,801,,,,,801,801,801,801,,801,801,801', +'801,,,,,801,801,,288,288,288,288,288,801,,801,288,288,,,,288,,288,288', +'288,288,288,288,288,,,,,,288,288,288,288,288,288,288,,,288,,,,,,288', +'288,,288,288,288,288,288,288,288,288,288,,288,288,288,,288,288,288,288', +'288,,,,,,,,,,,,,,,,,,,,288,,,288,,,288,288,,,288,,288,,,,288,,,,,,,', +',288,,,,,288,288,288,288,,288,288,288,288,,,,,288,288,,815,815,815,', +'815,288,,288,815,815,,,,815,,815,815,815,815,815,815,815,,,,,,815,815', +'815,815,815,815,815,,,815,,,,,,,815,,,815,815,815,815,815,815,815,815', +',815,815,815,,815,815,815,815,815,,,,,,,,,,,,,,,,,,,,815,,,815,,,815', +'815,,,815,,,,,,815,,,,,,,,,815,,,,,815,815,815,815,,815,815,815,815', +',,,,815,815,,820,820,820,,820,815,,815,820,820,,,,820,,820,820,820,820', +'820,820,820,,,,,,820,820,820,820,820,820,820,,,820,,,,,,,820,,,820,820', +'820,820,820,820,820,820,,820,820,820,,820,820,820,820,820,,,,,,,,,,', +',,,,,,,,,820,,,820,,,820,820,,,820,,820,,,,820,,,,,,,,,820,,,,,820,820', +'820,820,,820,820,820,820,,,,,820,820,,247,247,247,,247,820,,820,247', +'247,,,,247,,247,247,247,247,247,247,247,,,,,,247,247,247,247,247,247', +'247,,,247,,,,,,,247,,,247,247,247,247,247,247,247,247,,247,247,247,', +'247,247,247,247,247,,,,,,,,,,,,,,,,,,,,247,,,247,,,247,247,,,247,,,', +',,247,,,,,,,,,247,,,,,247,247,247,247,,247,247,247,247,,,,,247,247,', +'227,227,227,,227,247,,247,227,227,,,,227,,227,227,227,227,227,227,227', +',,,,,227,227,227,227,227,227,227,,,227,,,,,,,227,,,227,227,227,227,227', +'227,227,227,,227,227,227,,227,227,227,227,227,,,,,,,,,,,,,,,,,,,,227', +',,227,,,227,227,,,227,,,,,,227,,,,,,,,,227,,,,,227,227,227,227,,227', +'227,227,227,,,,,227,227,,29,29,29,,29,227,,227,29,29,,,,29,,29,29,29', +'29,29,29,29,,,,,,29,29,29,29,29,29,29,,,29,,,,,,,29,,,29,29,29,29,29', +'29,29,29,29,29,29,29,,29,29,29,29,29,,,,,,,,,,,,,,,,,,,,29,,,29,,,29', +'29,,,29,,29,,29,,29,,,29,,,,,,29,,,,,29,29,29,29,,29,29,29,29,,,,,29', +'29,,30,30,30,,30,29,,29,30,30,,,,30,,30,30,30,30,30,30,30,,,,,,30,30', +'30,30,30,30,30,,,30,,,,,,,30,,,30,30,30,30,30,30,30,30,30,30,30,30,', +'30,30,30,30,30,,,,,,,,,,,,,,,,,,,,30,,,30,,,30,30,,,30,,30,,30,,30,', +',30,,,,,,30,,,,,30,30,30,30,,30,30,30,30,,,,,30,30,,31,31,31,,31,30', +',30,31,31,,,,31,,31,31,31,31,31,31,31,,,,,,31,31,31,31,31,31,31,,,31', +',,,,,,31,,,31,31,31,31,31,31,31,31,31,31,31,31,,31,31,31,31,31,,,,,', +',,,,,,,,,,,,,,31,,,31,,,31,31,,,31,,31,,31,,31,,,31,,,,,,31,,,,,31,31', +'31,31,,31,31,31,31,,,,,31,31,,296,296,296,,296,31,,31,296,296,,,,296', +',296,296,296,296,296,296,296,,,,,,296,296,296,296,296,296,296,,,296', +',,,,405,,296,,,296,296,296,296,296,296,296,296,,296,296,296,,296,296', +',,296,405,405,405,405,405,405,405,405,405,405,405,,405,405,,,405,405', +',296,,,296,,,296,296,,,296,,,405,,405,,405,405,,405,405,405,405,405', +',405,,,,296,296,296,296,,296,296,296,296,,,,,296,296,,405,,296,,,296', +',296,632,632,632,,632,,,,632,632,,,,632,,632,632,632,632,632,632,632', +',,,,,632,632,632,632,632,632,632,,,632,,,,,,,632,,,632,632,632,632,632', +'632,632,632,,632,632,632,,632,632,,,632,,,,,,,,,,,,,,,,,,,,632,,,632', +',,632,632,,,632,,,,,,,,,,,,,,,,,,,,632,632,632,632,,632,632,632,632', +',,,,632,632,,837,837,837,,837,632,,632,837,837,,,,837,,837,837,837,837', +'837,837,837,,,,,,837,837,837,837,837,837,837,,,837,,,,,,,837,,,837,837', +'837,837,837,837,837,837,837,837,837,837,,837,837,837,837,837,,,,,,,', +',,,,,,,,,,,,837,,,837,,,837,837,,,837,,,,837,,837,,,837,,,,,,837,,,', +',837,837,837,837,,837,837,837,837,,,,,837,837,,838,838,838,,838,837', +',837,838,838,,,,838,,838,838,838,838,838,838,838,,,,,,838,838,838,838', +'838,838,838,,,838,,,,,,,838,,,838,838,838,838,838,838,838,838,,838,838', +'838,,838,838,838,838,838,,,,,,,,,,,,,,,,,,,,838,,,838,,,838,838,,,838', +',,,,,838,,,,,,,,,838,,,,,838,838,838,838,,838,838,838,838,,,,,838,838', +',626,626,626,,626,838,,838,626,626,,,,626,,626,626,626,626,626,626,626', +',,,,,626,626,626,626,626,626,626,,,626,,,,,,,626,,,626,626,626,626,626', +'626,626,626,,626,626,626,,626,626,626,626,626,,,,,,,,,,,,,,,,,,,,626', +',,626,,,626,626,,,626,,,,,,626,,,,,,,,,626,,,,,626,626,626,626,,626', +'626,626,626,,,,,626,626,,852,852,852,,852,626,,626,852,852,,,,852,,852', +'852,852,852,852,852,852,,,,,,852,852,852,852,852,852,852,,,852,,,,,', +',852,,,852,852,852,852,852,852,852,852,,852,852,852,,852,852,,,852,', +',,,,,,,,,,,,,,,,,,852,,,852,,,852,852,,,852,,,,,,,,,,,,,,,,,,,,852,852', +'852,852,,852,852,852,852,,,,,852,852,,602,602,602,,602,852,,852,602', +'602,,,,602,,602,602,602,602,602,602,602,,,,,,602,602,602,602,602,602', +'602,,,602,,,,,,,602,,,602,602,602,602,602,602,602,602,,602,602,602,', +'602,602,602,602,602,,,,,,,,,,,,,,,,,,,,602,,,602,,,602,602,,,602,,,', +',,602,,,,,,,,,602,,,,,602,602,602,602,,602,602,602,602,,,,,602,602,', +'601,601,601,,601,602,,602,601,601,,,,601,,601,601,601,601,601,601,601', +',,,,,601,601,601,601,601,601,601,,,601,,,,,,,601,,,601,601,601,601,601', +'601,601,601,,601,601,601,,601,601,601,601,601,,,,,,,,,,,,,,,,,,,,601', +',,601,,,601,601,,,601,,,,,,601,,,,,,,,,601,,,,,601,601,601,601,,601', +'601,601,601,,,,,601,601,,864,864,864,,864,601,,601,864,864,,,,864,,864', +'864,864,864,864,864,864,,,,,,864,864,864,864,864,864,864,,,864,,,,,', +',864,,,864,864,864,864,864,864,864,864,,864,864,864,,864,864,,,864,', +',,,,,,,,,,,,,,,,,,864,,,864,,,864,864,,,864,,,,,,,,,,,,,,,,,,,,864,864', +'864,864,,864,864,864,864,,,,,864,864,,598,598,598,,598,864,,864,598', +'598,,,,598,,598,598,598,598,598,598,598,,,,,,598,598,598,598,598,598', +'598,,,598,,,,,,,598,,,598,598,598,598,598,598,598,598,,598,598,598,', +'598,598,598,598,598,,,,,,,,,,,,,,,,,,,,598,,,598,,,598,598,,,598,,,', +',,598,,,,,,,,,598,,,,,598,598,598,598,,598,598,598,598,,,,,598,598,', +'597,597,597,,597,598,,598,597,597,,,,597,,597,597,597,597,597,597,597', +',,,,,597,597,597,597,597,597,597,,,597,,,,,,,597,,,597,597,597,597,597', +'597,597,597,,597,597,597,,597,597,597,597,597,,,,,,,,,,,,,,,,,,,,597', +',,597,,,597,597,,,597,,,,,,597,,,,,,,,,597,,,,,597,597,597,597,,597', +'597,597,597,,,,,597,597,,34,34,34,,34,597,,597,34,34,,,,34,,34,34,34', +'34,34,34,34,,,,,,34,34,34,34,34,34,34,,,34,,,,,,,34,,,34,34,34,34,34', +'34,34,34,,34,34,34,,34,34,,,34,,,,,,,,,,,,,,,,,,,,34,,,34,,,34,34,,', +'34,,34,,,,,,,,,,,,,,,,,,34,34,34,34,,34,34,34,34,,,,,34,34,,35,35,35', +',35,34,,34,35,35,,,,35,,35,35,35,35,35,35,35,,,,,,35,35,35,35,35,35', +'35,,,35,,,,,,,35,,,35,35,35,35,35,35,35,35,,35,35,35,,35,35,,,35,735', +'735,735,735,735,735,735,735,735,735,735,,735,735,,,735,735,,35,,,35', +',,35,35,,,35,,,735,,735,,735,735,,735,735,735,735,735,,735,,,,35,35', +'35,35,,35,35,35,35,,,,,35,35,,735,,35,,,35,,35,216,216,216,,216,,,,216', +'216,,,,216,,216,216,216,216,216,216,216,,,,,,216,216,216,216,216,216', +'216,,,216,,,,,,,216,,,216,216,216,216,216,216,216,216,,216,216,216,', +'216,216,216,216,216,,,,,,,,,,,,,,,,,,,,216,,,216,,,216,216,,,216,,,', +',,216,,,,,,,,,216,,,,,216,216,216,216,,216,216,216,216,,,,,216,216,216', +'5,5,5,5,5,216,,216,5,5,,,,5,,5,5,5,5,5,5,5,,,,,,5,5,5,5,5,5,5,,,5,,', +',,,5,5,5,5,5,5,5,5,5,5,5,5,,5,5,5,,5,5,5,5,5,,,,,,,,,,,,,,,,,,,,5,,', +'5,,,5,5,,,5,,5,,,,5,,,,,,,,,5,,,,,5,5,5,5,,5,5,5,5,,,,,5,5,,593,593', +'593,,593,5,,5,593,593,,,,593,,593,593,593,593,593,593,593,,,,,,593,593', +'593,593,593,593,593,,,593,,,,,,,593,,,593,593,593,593,593,593,593,593', +',593,593,593,,593,593,593,593,593,,,,,,,,,,,,,,,,,,,,593,,,593,,,593', +'593,,,593,,,,,,593,,,,,,,,,593,,,,,593,593,593,593,,593,593,593,593', +',,,,593,593,,592,592,592,,592,593,,593,592,592,,,,592,,592,592,592,592', +'592,592,592,,,,,,592,592,592,592,592,592,592,,,592,,,,,,,592,,,592,592', +'592,592,592,592,592,592,,592,592,592,,592,592,592,592,592,,,,,,,,,,', +',,,,,,,,,592,,,592,,,592,592,,,592,,,,,,592,,,,,,,,,592,,,,,592,592', +'592,592,,592,592,592,592,,,,,592,592,,591,591,591,,591,592,,592,591', +'591,,,,591,,591,591,591,591,591,591,591,,,,,,591,591,591,591,591,591', +'591,,,591,,,,,,,591,,,591,591,591,591,591,591,591,591,591,591,591,591', +',591,591,591,591,591,,,,,,,,,,,,,,,,,,,,591,,,591,,,591,591,,,591,,', +',591,,591,,,591,,,,,,591,,,,,591,591,591,591,,591,591,591,591,,,,,591', +'591,,590,590,590,,590,591,,591,590,590,,,,590,,590,590,590,590,590,590', +'590,,,,,,590,590,590,590,590,590,590,,,590,,,,,,,590,,,590,590,590,590', +'590,590,590,590,590,590,590,590,,590,590,590,590,590,,,,,,,,,,,,,,,', +',,,,590,,,590,,,590,590,,,590,,590,,590,,590,,,590,,,,,,590,,,,,590', +'590,590,590,,590,590,590,590,,,,,590,590,,313,313,313,,313,590,,590', +'313,313,,,,313,,313,313,313,313,313,313,313,,,,,,313,313,313,313,313', +'313,313,,,313,,,,,,,313,,,313,313,313,313,313,313,313,313,,313,313,313', +',313,313,,,313,,,,,,,,,,,,,,,,,,,,313,,,313,,,313,313,,,313,,,,,,,,', +',,,,,,,,,,,313,313,313,313,,313,313,313,313,,,,,313,313,,215,215,215', +',215,313,,313,215,215,,,,215,,215,215,215,215,215,215,215,,,,,,215,215', +'215,215,215,215,215,,,215,,,,,,,215,,,215,215,215,215,215,215,215,215', +',215,215,215,,215,215,215,215,215,,,,,,,,,,,,,,,,,,,,215,,,215,,,215', +'215,,,215,,,,,,215,,,,,,,,,215,,,,,215,215,215,215,,215,215,215,215', +',,,,215,215,,587,587,587,,587,215,,215,587,587,,,,587,,587,587,587,587', +'587,587,587,,,,,,587,587,587,587,587,587,587,,,587,,,,,,,587,,,587,587', +'587,587,587,587,587,587,,587,587,587,,587,587,587,587,587,,,,,,,,,,', +',,,,,,,,,587,,,587,,,587,587,,,587,,,,,,587,,,,,,,,,587,,,,,587,587', +'587,587,,587,587,587,587,,,,,587,587,,586,586,586,,586,587,,587,586', +'586,,,,586,,586,586,586,586,586,586,586,,,,,,586,586,586,586,586,586', +'586,,,586,,,,,,,586,,,586,586,586,586,586,586,586,586,,586,586,586,', +'586,586,586,586,586,,,,,,,,,,,,,,,,,,,,586,,,586,,,586,586,,,586,,586', +',,,586,,,,,,,,,586,,,,,586,586,586,586,,586,586,586,586,,,,,586,586', +',214,214,214,,214,586,,586,214,214,,,,214,,214,214,214,214,214,214,214', +',,,,,214,214,214,214,214,214,214,,,214,,,,,,,214,,,214,214,214,214,214', +'214,214,214,,214,214,214,,214,214,214,214,214,,,,,,,,,,,,,,,,,,,,214', +',,214,,,214,214,,,214,,,,,,214,,,,,,,,,214,,,,,214,214,214,214,,214', +'214,214,214,,,,,214,214,,213,213,213,,213,214,,214,213,213,,,,213,,213', +'213,213,213,213,213,213,,,,,,213,213,213,213,213,213,213,,,213,,,,,', +',213,,,213,213,213,213,213,213,213,213,,213,213,213,,213,213,213,213', +'213,,,,,,,,,,,,,,,,,,,,213,,,213,,,213,213,,,213,,,,,,213,,,,,,,,,213', +',,,,213,213,213,213,,213,213,213,213,,,,,213,213,,212,212,212,,212,213', +',213,212,212,,,,212,,212,212,212,212,212,212,212,,,,,,212,212,212,212', +'212,212,212,,,212,,,,,,,212,,,212,212,212,212,212,212,212,212,,212,212', +'212,,212,212,212,212,212,,,,,,,,,,,,,,,,,,,,212,,,212,,,212,212,,,212', +',212,,,,212,,,,,,,,,212,,,,,212,212,212,212,,212,212,212,212,,,,,212', +'212,,322,322,322,,322,212,,212,322,322,,,,322,,322,322,322,322,322,322', +'322,,,,,,322,322,322,322,322,322,322,,,322,,,,,,,322,,,322,322,322,322', +'322,322,322,322,,322,322,322,,322,322,322,322,322,,,,,,,,,,,,,,,,,,', +',322,,,322,322,,322,322,,,322,,,,,,322,,,,,,,,,322,,,,,322,322,322,322', +',322,322,322,322,,,,,322,322,,324,324,324,,324,322,,322,324,324,,,,324', +',324,324,324,324,324,324,324,,,,,,324,324,324,324,324,324,324,,,324', +',,,,,,324,,,324,324,324,324,324,324,324,324,,324,324,324,,324,324,324', +'324,324,,,,,,,,,,,,,,,,,,,,324,,,324,,,324,324,,,324,,,,,,324,,,,,,', +',,324,,,,,324,324,324,324,,324,324,324,324,,,,,324,324,,211,211,211', +',211,324,,324,211,211,,,,211,,211,211,211,211,211,211,211,,,,,,211,211', +'211,211,211,211,211,,,211,,,,,,,211,,,211,211,211,211,211,211,211,211', +',211,211,211,,211,211,211,211,211,,,,,,,,,,,,,,,,,,,,211,,,211,,,211', +'211,,,211,,,,,,211,,,,,,,,,211,,,,,211,211,211,211,,211,211,211,211', +',,,,211,211,,552,552,552,,552,211,,211,552,552,,,,552,,552,552,552,552', +'552,552,552,,,,,,552,552,552,552,552,552,552,,,552,,,,,,,552,,,552,552', +'552,552,552,552,552,552,552,552,552,552,,552,552,552,552,552,,,,,,,', +',,,,,,,,,,,,552,,,552,,,552,552,,,552,,552,,552,,552,,,552,,,,,,552', +',,,,552,552,552,552,,552,552,552,552,,,,,552,552,,542,542,542,,542,552', +',552,542,542,,,,542,,542,542,542,542,542,542,542,,,,,,542,542,542,542', +'542,542,542,,,542,,,,,,,542,,,542,542,542,542,542,542,542,542,542,542', +'542,542,,542,542,542,542,542,,,,,,,,,,,,,,,,,,,,542,,,542,,,542,542', +',,542,,542,,542,,542,,,542,,,,,,542,,,,,542,542,542,542,,542,542,542', +'542,,,,,542,542,,541,541,541,,541,542,,542,541,541,,,,541,,541,541,541', +'541,541,541,541,,,,,,541,541,541,541,541,541,541,,,541,,,,,,,541,,,541', +'541,541,541,541,541,541,541,,541,541,541,,541,541,541,541,541,,,,,,', +',,,,,,,,,,,,,541,,,541,,,541,541,,,541,,541,,,,541,,,,,,,,,541,,,,,541', +'541,541,541,,541,541,541,541,,,,,541,541,,700,700,700,,700,541,,541', +'700,700,,,,700,,700,700,700,700,700,700,700,,,,,,700,700,700,700,700', +'700,700,,,700,,,,,,,700,,,700,700,700,700,700,700,700,700,,700,700,700', +',700,700,700,700,700,,,,,,,,,,,,,,,,,,,,700,,,700,,,700,700,,,700,,', +',,,700,,,,,,,,,700,,,,,700,700,700,700,,700,700,700,700,,,,,700,700', +',42,42,42,,42,700,,700,42,42,,,,42,,42,42,42,42,42,42,42,,,,,,42,42', +'42,42,42,42,42,,,42,,,,,,,42,,,42,42,42,42,42,42,42,42,,42,42,42,,42', +'42,42,42,42,,,,,,,,,,,,,,,,,,,,42,,,42,,,42,42,,,42,,,,,,42,,,,,,,,', +'42,,,,,42,42,42,42,,42,42,42,42,,,,,42,42,,208,208,208,,208,42,,42,208', +'208,,,,208,,208,208,208,208,208,208,208,,,,,,208,208,208,208,208,208', +'208,,,208,,,,,,,208,,,208,208,208,208,208,208,208,208,208,208,208,208', +',208,208,208,208,208,,,,,,,,,,,,,,,,,,,,208,,,208,,,208,208,,,208,,208', +',208,,208,,,208,,,,,,208,,,,,208,208,208,208,,208,208,208,208,,,,,208', +'208,,527,527,527,,527,208,,208,527,527,,,,527,,527,527,527,527,527,527', +'527,,,,,,527,527,527,527,527,527,527,,,527,,,,,,,527,,,527,527,527,527', +'527,527,527,527,527,527,527,527,,527,527,527,527,527,,,,,,,,,,,,,,,', +',,,,527,,,527,,,527,527,,,527,,,,,,527,,,527,,,,,,527,,,,,527,527,527', +'527,,527,527,527,527,,,,,527,527,,524,524,524,,524,527,,527,524,524', +',,,524,,524,524,524,524,524,524,524,,,,,,524,524,524,524,524,524,524', +',,524,,,,,,,524,,,524,524,524,524,524,524,524,524,524,524,524,524,,524', +'524,524,524,524,,,,,,,,,,,,,,,,,,,,524,,,524,,,524,524,,,524,,524,,', +',524,,,524,,,,,,524,,,,,524,524,524,524,,524,524,524,524,,,,,524,524', +',207,207,207,,207,524,,524,207,207,,,,207,,207,207,207,207,207,207,207', +',,,,,207,207,207,207,207,207,207,,,207,,,,,,,207,,,207,207,207,207,207', +'207,207,207,,207,207,207,,207,207,207,207,207,,,,,,,,,,,,,,,,,,,,207', +',,207,,,207,207,,,207,,,,,,207,,,,,,,,,207,,,,,207,207,207,207,,207', +'207,207,207,,,,,207,207,,206,206,206,,206,207,,207,206,206,,,,206,,206', +'206,206,206,206,206,206,,,,,,206,206,206,206,206,206,206,,,206,,,,,', +',206,,,206,206,206,206,206,206,206,206,,206,206,206,,206,206,206,206', +'206,,,,,,,,,,,,,,,,,,,,206,,,206,,,206,206,,,206,,206,,,,206,,,,,,,', +',206,,,,,206,206,206,206,,206,206,206,206,,,,,206,206,,518,518,518,', +'518,206,,206,518,518,,,,518,,518,518,518,518,518,518,518,,,,,,518,518', +'518,518,518,518,518,,,518,,,,,,,518,,,518,518,518,518,518,518,518,518', +',518,518,518,,518,518,518,518,518,,,,,,,,,,,,,,,,,,,,518,,,518,,,518', +'518,,,518,,,,,,518,,,,,,,,,518,,,,,518,518,518,518,,518,518,518,518', +',,,,518,518,,43,43,43,,43,518,,518,43,43,,,,43,,43,43,43,43,43,43,43', +',,,,,43,43,43,43,43,43,43,,,43,,,,,,,43,,,43,43,43,43,43,43,43,43,,43', +'43,43,,43,43,43,43,43,,,,,,,,,,,,,,,,,,,,43,,,43,,,43,43,,,43,,,,,,43', +',,,,,,,,43,,,,,43,43,43,43,,43,43,43,43,,,,,43,43,,502,502,502,,502', +'43,,43,502,502,,,,502,,502,502,502,502,502,502,502,,,,,,502,502,502', +'502,502,502,502,,,502,,,,,,,502,,,502,502,502,502,502,502,502,502,502', +'502,502,502,,502,502,502,502,502,,,,,,,,,,,,,,,,,,,,502,,,502,,,502', +'502,,,502,,502,,502,,502,,,502,,,,,,502,,,,,502,502,502,502,,502,502', +'502,502,,,,,502,502,,374,374,374,,374,502,,502,374,374,,,,374,,374,374', +'374,374,374,374,374,,,,,,374,374,374,374,374,374,374,,,374,,,,,,,374', +',,374,374,374,374,374,374,374,374,,374,374,374,,374,374,374,374,374', +',,,,,,,,,,,,,,,,,,,374,,,374,,,374,374,,,374,,,,,,374,,,,,,,,,374,,', +',,374,374,374,374,,374,374,374,374,,,,,374,374,,402,402,402,,402,374', +',374,402,402,,,,402,,402,402,402,402,402,402,402,,,,,,402,402,402,402', +'402,402,402,,,402,,,,,,,402,,,402,402,402,402,402,402,402,402,,402,402', +'402,,402,402,402,402,402,,,,,,,,,,,,,,,,,,,,402,,,402,,,402,402,,,402', +',,,,,402,,,,,,,,,402,,,,,402,402,402,402,,402,402,402,402,,,,,402,402', +',63,63,63,,63,402,,402,63,63,,,,63,,63,63,63,63,63,63,63,,,,,,63,63', +'63,63,63,63,63,,,63,,,,,,,63,,,63,63,63,63,63,63,63,63,,63,63,63,,63', +'63,63,63,63,,,,,,,,,,,,,,,,,,,,63,,,63,,,63,63,,,63,,,,,,63,,,,,,,,', +'63,,,,,63,63,63,63,,63,63,63,63,,,,,63,63,,60,60,60,,60,63,,63,60,60', +',,,60,,60,60,60,60,60,60,60,,,,,,60,60,60,60,60,60,60,,,60,,,,,,,60', +',,60,60,60,60,60,60,60,60,60,60,60,60,,60,60,60,60,60,,,,,,,,,,,,,,', +',,,,,60,,,60,,,60,60,,,60,,,,,,60,,,60,,,,,,60,,,,,60,60,60,60,,60,60', +'60,60,,,,,60,60,,249,249,249,,249,60,,60,249,249,,,,249,,249,249,249', +'249,249,249,249,,,,,,249,249,249,249,249,249,249,,,249,,,,,,,249,,,249', +'249,249,249,249,249,249,249,,249,249,249,,249,249,249,249,249,,,,,,', +',,,,,,,,,,,,,249,,,249,,,249,249,,,249,,,,,,249,,,,,,,,,249,,,,,249', +'249,249,249,,249,249,249,249,,,,,249,249,,246,246,246,,246,249,,249', +'246,246,,,,246,,246,246,246,246,246,246,246,,,,,,246,246,246,246,246', +'246,246,,,246,,,,,,,246,,,246,246,246,246,246,246,246,246,,246,246,246', +',246,246,246,246,246,,,,,,,,,,,,,,,,,,,,246,,,246,,,246,246,,,246,,', +',,,246,,,,,,,,,246,,,,,246,246,246,246,,246,246,246,246,,,,,246,246', +',245,245,245,,245,246,,246,245,245,,,,245,,245,245,245,245,245,245,245', +',,,,,245,245,245,245,245,245,245,,,245,,,,,,,245,,,245,245,245,245,245', +'245,245,245,,245,245,245,,245,245,245,245,245,,,,,,,,,,,,,,,,,,,,245', +',,245,,,245,245,,,245,,,,,,245,,,,,,,,,245,,,,,245,245,245,245,,245', +'245,245,245,,,,,245,245,,250,250,250,,250,245,,245,250,250,,,,250,,250', +'250,250,250,250,250,250,,,,,,250,250,250,250,250,250,250,,,250,,,,,', +',250,,,250,250,250,250,250,250,250,250,,250,250,250,,250,250,250,250', +'250,,,,,,,,,,,,,,,,,,,,250,,,250,,,250,250,,,250,,,,,,250,,,,,,,,,250', +',,,,250,250,250,250,,250,250,250,250,,,,,250,250,,729,729,729,,729,250', +',250,729,729,,,,729,,729,729,729,729,729,729,729,,,,,,729,729,729,729', +'729,729,729,,,729,,,,,,,729,,,729,729,729,729,729,729,729,729,,729,729', +'729,,729,729,729,729,729,,,,,,,,,,,,,,,,,,,,729,,,729,,,729,729,,,729', +',,,,,729,,,,,,,,,729,,,,,729,729,729,729,,729,729,729,729,,,,,729,729', +',244,244,244,,244,729,,729,244,244,,,,244,,244,244,244,244,244,244,244', +',,,,,244,244,244,244,244,244,244,,,244,,,,,,,244,,,244,244,244,244,244', +'244,244,244,,244,244,244,,244,244,244,244,244,,,,,,,,,,,,,,,,,,,,244', +',,244,,,244,244,,,244,,,,,,244,,,,,,,,,244,,,,,244,244,244,244,,244', +'244,244,244,,,,,244,244,,731,731,731,,731,244,,244,731,731,,,,731,,731', +'731,731,731,731,731,731,,,,,,731,731,731,731,731,731,731,,,731,,,,,', +',731,,,731,731,731,731,731,731,731,731,,731,731,731,,731,731,731,731', +'731,,,,,,,,,,,,,,,,,,,,731,,,731,,,731,731,,,731,,,,,,731,,,,,,,,,731', +',,,,731,731,731,731,,731,731,731,731,,,,,731,731,,251,251,251,,251,731', +',731,251,251,,,,251,,251,251,251,251,251,251,251,,,,,,251,251,251,251', +'251,251,251,,,251,,,,,,,251,,,251,251,251,251,251,251,251,251,,251,251', +'251,,251,251,251,251,251,,,,,,,,,,,,,,,,,,,,251,,,251,,,251,251,,,251', +',,,,,251,,,,,,,,,251,,,,,251,251,251,251,,251,251,251,251,,,,,251,251', +',243,243,243,,243,251,,251,243,243,,,,243,,243,243,243,243,243,243,243', +',,,,,243,243,243,243,243,243,243,,,243,,,,,,,243,,,243,243,243,243,243', +'243,243,243,,243,243,243,,243,243,243,243,243,,,,,,,,,,,,,,,,,,,,243', +',,243,,,243,243,,,243,,,,,,243,,,,,,,,,243,,,,,243,243,243,243,,243', +'243,243,243,,,,,243,243,,242,242,242,,242,243,,243,242,242,,,,242,,242', +'242,242,242,242,242,242,,,,,,242,242,242,242,242,242,242,,,242,,,,,', +',242,,,242,242,242,242,242,242,242,242,,242,242,242,,242,242,242,242', +'242,,,,,,,,,,,,,,,,,,,,242,,,242,,,242,242,,,242,,,,,,242,,,,,,,,,242', +',,,,242,242,242,242,,242,242,242,242,,,,,242,242,,673,673,673,,673,242', +',242,673,673,,,,673,,673,673,673,673,673,673,673,,,,,,673,673,673,673', +'673,673,673,,,673,,,,,,,673,,,673,673,673,673,673,673,673,673,,673,673', +'673,,673,673,673,673,673,,,,,,,,,,,,,,,,,,,,673,,,673,,,673,673,,,673', +',,,,,673,,,,,,,,,673,,,,,673,673,673,673,,673,673,673,673,,,,,673,673', +',241,241,241,,241,673,,673,241,241,,,,241,,241,241,241,241,241,241,241', +',,,,,241,241,241,241,241,241,241,,,241,,,,,,,241,,,241,241,241,241,241', +'241,241,241,,241,241,241,,241,241,241,241,241,,,,,,,,,,,,,,,,,,,,241', +',,241,,,241,241,,,241,,,,,,241,,,,,,,,,241,,,,,241,241,241,241,,241', +'241,241,241,,,,,241,241,,240,240,240,,240,241,,241,240,240,,,,240,,240', +'240,240,240,240,240,240,,,,,,240,240,240,240,240,240,240,,,240,,,,,', +',240,,,240,240,240,240,240,240,240,240,,240,240,240,,240,240,240,240', +'240,,,,,,,,,,,,,,,,,,,,240,,,240,,,240,240,,,240,,,,,,240,,,,,,,,,240', +',,,,240,240,240,240,,240,240,240,240,,,,,240,240,,745,745,745,,745,240', +',240,745,745,,,,745,,745,745,745,745,745,745,745,,,,,,745,745,745,745', +'745,745,745,,,745,,,,,,,745,,,745,745,745,745,745,745,745,745,,745,745', +'745,,745,745,745,745,745,,,,,,,,,,,,,,,,,,,,745,,,745,,,745,745,,,745', +',,,,,745,,,,,,,,,745,,,,,745,745,745,745,,745,745,745,745,,,,,745,745', +',746,746,746,,746,745,,745,746,746,,,,746,,746,746,746,746,746,746,746', +',,,,,746,746,746,746,746,746,746,,,746,,,,,,,746,,,746,746,746,746,746', +'746,746,746,,746,746,746,,746,746,746,746,746,,,,,,,,,,,,,,,,,,,,746', +',,746,,,746,746,,,746,,,,,,746,,,,,,,,,746,,,,,746,746,746,746,,746', +'746,746,746,,,,,746,746,,747,747,747,,747,746,,746,747,747,,,,747,,747', +'747,747,747,747,747,747,,,,,,747,747,747,747,747,747,747,,,747,,,,,', +',747,,,747,747,747,747,747,747,747,747,,747,747,747,,747,747,747,747', +'747,,,,,,,,,,,,,,,,,,,,747,,,747,,,747,747,,,747,,,,,,747,,,,,,,,,747', +',,,,747,747,747,747,,747,747,747,747,,,,,747,747,,748,748,748,,748,747', +',747,748,748,,,,748,,748,748,748,748,748,748,748,,,,,,748,748,748,748', +'748,748,748,,,748,,,,,,,748,,,748,748,748,748,748,748,748,748,,748,748', +'748,,748,748,748,748,748,,,,,,,,,,,,,,,,,,,,748,,,748,,,748,748,,,748', +',,,,,748,,,,,,,,,748,,,,,748,748,748,748,,748,748,748,748,,,,,748,748', +',239,239,239,,239,748,,748,239,239,,,,239,,239,239,239,239,239,239,239', +',,,,,239,239,239,239,239,239,239,,,239,,,,,,,239,,,239,239,239,239,239', +'239,239,239,,239,239,239,,239,239,239,239,239,,,,,,,,,,,,,,,,,,,,239', +',,239,,,239,239,,,239,,,,,,239,,,,,,,,,239,,,,,239,239,239,239,,239', +'239,239,239,,,,,239,239,,750,750,750,,750,239,,239,750,750,,,,750,,750', +'750,750,750,750,750,750,,,,,,750,750,750,750,750,750,750,,,750,,,,,', +',750,,,750,750,750,750,750,750,750,750,,750,750,750,,750,750,750,750', +'750,,,,,,,,,,,,,,,,,,,,750,,,750,,,750,750,,,750,,,,,,750,,,,,,,,,750', +',,,,750,750,750,750,,750,750,750,750,,,,,750,750,,252,252,252,,252,750', +',750,252,252,,,,252,,252,252,252,252,252,252,252,,,,,,252,252,252,252', +'252,252,252,,,252,,,,,,,252,,,252,252,252,252,252,252,252,252,,252,252', +'252,,252,252,252,252,252,,,,,,,,,,,,,,,,,,,,252,,,252,,,252,252,,,252', +',,,,,252,,,,,,,,,252,,,,,252,252,252,252,,252,252,252,252,,,,,252,252', +',253,253,253,,253,252,,252,253,253,,,,253,,253,253,253,253,253,253,253', +',,,,,253,253,253,253,253,253,253,,,253,,,,,,,253,,,253,253,253,253,253', +'253,253,253,,253,253,253,,253,253,253,253,253,,,,,,,,,,,,,,,,,,,,253', +',,253,,,253,253,,,253,,,,,,253,,,,,,,,,253,,,,,253,253,253,253,,253', +'253,253,253,,,,,253,253,,254,254,254,,254,253,,253,254,254,,,,254,,254', +'254,254,254,254,254,254,,,,,,254,254,254,254,254,254,254,,,254,,,,,', +',254,,,254,254,254,254,254,254,254,254,,254,254,254,,254,254,254,254', +'254,,,,,,,,,,,,,,,,,,,,254,,,254,,,254,254,,,254,,,,,,254,,,,,,,,,254', +',,,,254,254,254,254,,254,254,254,254,,,,,254,254,,255,255,255,,255,254', +',254,255,255,,,,255,,255,255,255,255,255,255,255,,,,,,255,255,255,255', +'255,255,255,,,255,,,,,,,255,,,255,255,255,255,255,255,255,255,,255,255', +'255,,255,255,255,255,255,,,,,,,,,,,,,,,,,,,,255,,,255,,,255,255,,,255', +',,,,,255,,,,,,,,,255,,,,,255,255,255,255,,255,255,255,255,,,,,255,255', +',238,238,238,,238,255,,255,238,238,,,,238,,238,238,238,238,238,238,238', +',,,,,238,238,238,238,238,238,238,,,238,,,,,,,238,,,238,238,238,238,238', +'238,238,238,,238,238,238,,238,238,238,238,238,,,,,,,,,,,,,,,,,,,,238', +',,238,,,238,238,,,238,,,,,,238,,,,,,,,,238,,,,,238,238,238,238,,238', +'238,238,238,,,,,238,238,,237,237,237,,237,238,,238,237,237,,,,237,,237', +'237,237,237,237,237,237,,,,,,237,237,237,237,237,237,237,,,237,,,,,', +',237,,,237,237,237,237,237,237,237,237,,237,237,237,,237,237,237,237', +'237,,,,,,,,,,,,,,,,,,,,237,,,237,,,237,237,,,237,,,,,,237,,,,,,,,,237', +',,,,237,237,237,237,,237,237,237,237,,,,,237,237,,262,262,262,,262,237', +',237,262,262,,,,262,,262,262,262,262,262,262,262,,,,,,262,262,262,262', +'262,262,262,,,262,,,,,,,262,,,262,262,262,262,262,262,262,262,262,262', +'262,262,,262,262,262,262,262,,,,,,,,,,,,,,,,,,,,262,,,262,,,262,262', +',,262,,262,,262,,262,,,262,,,,,,262,,,,,262,262,262,262,,262,262,262', +'262,,,,,262,262,,263,263,263,,263,262,,262,263,263,,,,263,,263,263,263', +'263,263,263,263,,,,,,263,263,263,263,263,263,263,,,263,,,,,,,263,,,263', +'263,263,263,263,263,263,263,263,263,263,263,,263,263,263,263,263,,,', +',,,,,,,,,,,,,,,,263,,,263,,,263,263,,,263,,263,,263,,263,,,263,,,,,', +'263,,,,,263,263,263,263,,263,263,263,263,,,,,263,263,,271,271,271,,271', +'263,,263,271,271,,,,271,,271,271,271,271,271,271,271,,,,,,271,271,271', +'271,271,271,271,,,271,,,,,,,271,,,271,271,271,271,271,271,271,271,271', +'271,271,271,,271,271,271,271,271,,,,,,,,,,,,,,,,,,,,271,,,271,,,271', +'271,,,271,,271,,271,,271,,,271,,,,,,271,,,,,271,271,271,271,,271,271', +'271,271,,,,,271,271,271,762,762,762,,762,271,,271,762,762,,,,762,,762', +'762,762,762,762,762,762,,,,,,762,762,762,762,762,762,762,,,762,,,,,', +',762,,,762,762,762,762,762,762,762,762,,762,762,762,,762,762,,,762,', +',,,,,,,,,,,,,,,,,,762,,,762,,,762,762,,,762,,,,,,,,,,,,,,,,,,,,762,762', +'762,762,,762,762,762,762,,,,,762,762,,236,236,236,,236,762,,762,236', +'236,,,,236,,236,236,236,236,236,236,236,,,,,,236,236,236,236,236,236', +'236,,,236,,,,,,,236,,,236,236,236,236,236,236,236,236,,236,236,236,', +'236,236,236,236,236,,,,,,,,,,,,,,,,,,,,236,,,236,,,236,236,,,236,,,', +',,236,,,,,,,,,236,,,,,236,236,236,236,,236,236,236,236,,,,,236,236,', +'235,235,235,,235,236,,236,235,235,,,,235,,235,235,235,235,235,235,235', +',,,,,235,235,235,235,235,235,235,,,235,,,,,,,235,,,235,235,235,235,235', +'235,235,235,,235,235,235,,235,235,235,235,235,,,,,,,,,,,,,,,,,,,,235', +',,235,,,235,235,,,235,,,,,,235,,,,,,,,,235,,,,,235,235,235,235,,235', +'235,235,235,,,,,235,235,,278,278,278,,278,235,,235,278,278,,,,278,,278', +'278,278,278,278,278,278,,,,,,278,278,278,278,278,278,278,,,278,,,,,', +',278,,,278,278,278,278,278,278,278,278,,278,278,278,,278,278,278,278', +'278,,,,,,,,,,,,,,,,,,,,278,,,278,,,278,278,,,278,,,,,,278,,,,,,,,,278', +',,,,278,278,278,278,,278,278,278,278,,,,,278,278,,649,649,649,,649,278', +',278,649,649,,,,649,,649,649,649,649,649,649,649,,,,,,649,649,649,649', +'649,649,649,,,649,,,,,,,649,,,649,649,649,649,649,649,649,649,,649,649', +'649,,649,649,649,649,649,,,,,,,,,,,,,,,,,,,,649,,,649,,,649,649,,,649', +',649,,,,649,,,,,,,,,649,,,,,649,649,649,649,,649,649,649,649,,,,,649', +'649,,234,234,234,,234,649,,649,234,234,,,,234,,234,234,234,234,234,234', +'234,,,,,,234,234,234,234,234,234,234,,,234,,,,,,,234,,,234,234,234,234', +'234,234,234,234,,234,234,234,,234,234,234,234,234,,,,,,,,,,,,,,,,,,', +',234,,,234,,,234,234,,,234,,,,,,234,,,,,,,,,234,,,,,234,234,234,234', +',234,234,234,234,,,,,234,234,,280,280,280,,280,234,,234,280,280,,,,280', +',280,280,280,280,280,280,280,,,,,,280,280,280,280,280,280,280,,,280', +',,,,,,280,,,280,280,280,280,280,280,280,280,,280,280,280,,280,280,280', +'280,280,,,,,,,,,,,,,,,,,,,,280,,,280,,,280,280,,,280,,,,,,280,,,,,,', +',,280,,,,,280,280,280,280,,280,280,280,280,,,,,280,280,,117,117,117', +',117,280,,280,117,117,,,,117,,117,117,117,117,117,117,117,,,,,,117,117', +'117,117,117,117,117,,,117,,,,,,,117,,,117,117,117,117,117,117,117,117', +',117,117,117,,117,117,117,117,117,,,,,,,,,,,,,,,,,,,,117,,,117,,,117', +'117,,,117,,,,,,117,,,,,,,,,117,,,,,117,117,117,117,,117,117,117,117', +',,,,117,117,,338,338,338,,338,117,,117,338,338,,,,338,,338,338,338,338', +'338,338,338,,,,,,338,338,338,338,338,338,338,,,338,,,,,,,338,,,338,338', +'338,338,338,338,338,338,,338,338,338,,338,338,338,338,338,,,,,,,,,,', +',,,,,,,,,338,,,338,,,338,338,,,338,,,,,,338,,,,,,,,,338,,,,,338,338', +'338,338,,338,338,338,338,,,,,338,338,,339,339,339,,339,338,,338,339', +'339,,,,339,,339,339,339,339,339,339,339,,,,,,339,339,339,339,339,339', +'339,,,339,,,,,,,339,,,339,339,339,339,339,339,339,339,,339,339,339,', +'339,339,339,339,339,,,,,,,,,,,,,,,,,,,,339,,,339,,,339,339,,,339,,,', +',,339,,,,,,,,,339,,,,,339,339,339,339,,339,339,339,339,,,,,339,339,', +'492,492,492,492,492,339,,339,492,492,,,,492,,492,492,492,492,492,492', +'492,,,,,,492,492,492,492,492,492,492,,,492,,,,,,492,492,492,492,492', +'492,492,492,492,492,492,492,,492,492,492,,492,492,492,492,492,740,740', +'740,740,740,740,740,740,740,740,740,,740,740,,,740,740,,492,,,492,,', +'492,492,,,492,,492,740,,740,492,740,740,,740,740,740,740,740,492,740', +',,,492,492,492,492,,492,492,492,492,,,,,492,492,,740,,,,492,492,,492', +'487,487,487,,487,,,,487,487,,,,487,,487,487,487,487,487,487,487,,,,', +',487,487,487,487,487,487,487,,,487,,,,,,,487,,,487,487,487,487,487,487', +'487,487,,487,487,487,,487,487,487,487,487,,,,,,,,,,,,,,,,,,,,487,,,487', +',,487,487,,,487,,,,,,487,,,,,,,,,487,,,,,487,487,487,487,,487,487,487', +'487,,,,,487,487,,485,485,485,,485,487,,487,485,485,,,,485,,485,485,485', +'485,485,485,485,,,,,,485,485,485,485,485,485,485,,,485,,,,,,,485,,,485', +'485,485,485,485,485,485,485,485,485,485,485,,485,485,485,485,485,,,', +',,,,,,,,,,,,,,,,485,,,485,,,485,485,,,485,,,,485,,485,,,485,,,,,,485', +',,,,485,485,485,485,,485,485,485,485,,,,,485,485,,483,483,483,,483,485', +',485,483,483,,,,483,,483,483,483,483,483,483,483,,,,,,483,483,483,483', +'483,483,483,,,483,,,,,,,483,,,483,483,483,483,483,483,483,483,483,483', +'483,483,,483,483,483,483,483,,,,,,,,,,,,,,,,,,,,483,,,483,,,483,483', +',,483,,483,,483,,483,,,483,,,,,,483,,,,,483,483,483,483,,483,483,483', +'483,,,,,483,483,,116,116,116,,116,483,,483,116,116,,,,116,,116,116,116', +'116,116,116,116,,,,,,116,116,116,116,116,116,116,,,116,,,,,,,116,,,116', +'116,116,116,116,116,116,116,,116,116,116,,116,116,116,116,116,,,,,,', +',,,,,,,,,,,,,116,,,116,,,116,116,,,116,,,,,,116,,,,,,,,,116,,,,,116', +'116,116,116,,116,116,116,116,,,,,116,116,,248,248,248,,248,116,,116', +'248,248,,,,248,,248,248,248,248,248,248,248,,,,,,248,248,248,248,248', +'248,248,,,248,,,,,,,248,,,248,248,248,248,248,248,248,248,,248,248,248', +',248,248,248,248,248,,,,,,,,,,,,,,,,,,,,248,,,248,,,248,248,,,248,,', +',,,248,,,,,,,,,248,,,,,248,248,248,248,,248,248,248,248,,,,,248,248', +',115,115,115,,115,248,,248,115,115,,,,115,,115,115,115,115,115,115,115', +',,,,,115,115,115,115,115,115,115,,,115,,,,,,,115,,,115,115,115,115,115', +'115,115,115,,115,115,115,,115,115,115,115,115,,,,,,,,,,,,,,,,,,,,115', +',,115,,,115,115,,,115,,,,,,115,,,,,,,,,115,,,,,115,115,115,115,,115', +'115,115,115,,,,,115,115,,706,706,706,,706,115,,115,706,706,,,,706,,706', +'706,706,706,706,706,706,,,,,,706,706,706,706,706,706,706,,,706,,,,,', +',706,,,706,706,706,706,706,706,706,706,,706,706,706,,706,706,706,706', +'706,,,,,,,,,,,,,,,,,,,,706,,,706,,,706,706,,,706,,,,,,706,,,,,,,,,706', +',,,,706,706,706,706,,706,706,706,706,,,,,706,706,,110,110,110,110,110', +'706,,706,110,110,,,,110,,110,110,110,110,110,110,110,,,,,,110,110,110', +'110,110,110,110,,,110,,,,,,110,110,110,110,110,110,110,110,110,110,110', +'110,,110,110,110,,110,110,110,110,110,742,742,742,742,742,742,742,742', +'742,742,742,,742,742,,,742,742,,110,,,110,,,110,110,,,110,,110,742,', +'742,110,742,742,,742,742,742,742,742,110,742,,,,110,110,110,110,,110', +'110,110,110,,,,,110,110,,742,,,,110,110,,110,59,59,59,,59,,,,59,59,', +',,59,,59,59,59,59,59,59,59,,,,,,59,59,59,59,59,59,59,,,59,,,,,,,59,', +',59,59,59,59,59,59,59,59,59,59,59,59,,59,59,59,59,59,,,,,,,,,,,,,,,', +',,,,59,,,59,,,59,59,,,59,,59,,,,59,,,59,,,,,,59,,,,,59,59,59,59,,59', +'59,59,59,,,,,59,59,,443,443,443,,443,59,,59,443,443,,,,443,,443,443', +'443,443,443,443,443,,,,,,443,443,443,443,443,443,443,,,443,,,,,,,443', +',,443,443,443,443,443,443,443,443,,443,443,443,,443,443,443,443,443', +',,,,,,,,,,,,,,,,,,,443,,,443,,,443,443,,,443,,,,,,443,,,,,,,,,443,,', +',,443,443,443,443,,443,443,443,443,,,,,443,443,,442,442,442,,442,443', +',443,442,442,,,,442,,442,442,442,442,442,442,442,,,,,,442,442,442,442', +'442,442,442,,,442,,,,,,,442,,,442,442,442,442,442,442,442,442,,442,442', +'442,,442,442,442,442,442,,,,,,,,,,,,,,,,,,,,442,,,442,,,442,442,,,442', +',,,,,442,,,,,,,,,442,,,,,442,442,442,442,,442,442,442,442,,,,,442,442', +',441,441,441,,441,442,,442,441,441,,,,441,,441,441,441,441,441,441,441', +',,,,,441,441,441,441,441,441,441,,,441,,,,,,,441,,,441,441,441,441,441', +'441,441,441,,441,441,441,,441,441,441,441,441,,,,,,,,,,,,,,,,,,,,441', +',,441,,,441,441,,,441,,,,,,441,,,,,,,,,441,,,,,441,441,441,441,,441', +'441,441,441,,,,,441,441,,439,439,439,,439,441,,441,439,439,,,,439,,439', +'439,439,439,439,439,439,,,,,,439,439,439,439,439,439,439,,,439,,,,,', +',439,,,439,439,439,439,439,439,439,439,439,439,439,439,,439,439,439', +'439,439,,,,,,,,,,,,,,,,,,,,439,,,439,,,439,439,,,439,,439,,439,,439', +',,439,,,,,,439,,,,,439,439,439,439,,439,439,439,439,,,,,439,439,,358', +'358,358,,358,439,,439,358,358,,,,358,,358,358,358,358,358,358,358,,', +',,,358,358,358,358,358,358,358,,,358,,,,,,,358,,,358,358,358,358,358', +'358,358,358,,358,358,358,,358,358,358,358,358,,,,,,,,,,,,,,,,,,,,358', +',,358,,,358,358,,,358,,,,,,358,,,,,,,,,358,,,,,358,358,358,358,,358', +'358,358,358,,,,,358,358,,70,70,70,,70,358,,358,70,70,,,,70,,70,70,70', +'70,70,70,70,,,,,,70,70,70,70,70,70,70,,,70,,,,,,,70,,,70,70,70,70,70', +'70,70,70,,70,70,70,,70,70,,,70,,,,,,,,,,,,,,,,,,,,70,,,70,,,70,70,,', +'70,,,,,,,,,,,,,,,,,,,,70,70,70,70,,70,70,70,70,,,,,70,70,,69,69,69,', +'69,70,,70,69,69,,,,69,,69,69,69,69,69,69,69,,,,,,69,69,69,69,69,69,69', +',,69,,,,,,,69,,,69,69,69,69,69,69,69,69,,69,69,69,,69,69,,,69,,,,,,', +',,,,,,,,,,69,,,69,,,69,,,69,69,,,69,,,,,,,,,,,,,,,,,,,,69,69,69,69,', +'69,69,69,69,,,,,69,69,,68,68,68,,68,69,,69,68,68,,,,68,,68,68,68,68', +'68,68,68,,,,,,68,68,68,68,68,68,68,,,68,,,,,,,68,,,68,68,68,68,68,68', +'68,68,,68,68,68,,68,68,,,68,,,,,,,,,,,,,,,,,,,,68,,,68,,,68,68,,,68', +',68,,,,,,,,,,,,,,,,,,68,68,68,68,,68,68,68,68,,,,,68,68,,67,67,67,,67', +'68,,68,67,67,,,,67,,67,67,67,67,67,67,67,,,,,,67,67,67,67,67,67,67,', +',67,,,,,,,67,,,67,67,67,67,67,67,67,67,,67,67,67,,67,67,67,67,67,744', +'744,744,744,744,744,744,744,744,744,744,,744,744,,,744,744,,67,,,67', +',,67,67,,,67,,,744,,744,67,744,744,,744,744,744,744,744,67,744,,,,67', +'67,67,67,,67,67,67,67,,,,,67,67,67,744,,,,67,67,,67,514,514,514,,514', +',,,514,514,,,,514,,514,514,514,514,514,514,514,,,,,,514,514,514,514', +'514,514,514,,,514,,,,,,,514,,,514,514,514,514,514,514,514,514,,514,514', +'514,,514,514,514,514,514,,,,,,,,,,,,,,,,,,,,514,,,514,,,514,514,,,514', +',,,,,514,,,,,,,,,514,,,,,514,514,514,514,,514,514,514,514,,,,,514,514', +',513,513,513,,513,514,,514,513,513,,,,513,,513,513,513,513,513,513,513', +',,,,,513,513,513,513,513,513,513,,,513,,,,,,,513,,,513,513,513,513,513', +'513,513,513,,513,513,513,,513,513,513,513,513,,,,,,,,,,,,,,,,,,,,513', +',,513,,,513,513,,,513,,,,,,513,,,,,,,,,513,,,,,513,513,513,513,,513', +'513,513,513,,,,,513,513,,512,512,512,,512,513,,513,512,512,,,,512,,512', +'512,512,512,512,512,512,,,,,,512,512,512,512,512,512,512,,,512,,,,,', +',512,,,512,512,512,512,512,512,512,512,,512,512,512,,512,512,512,512', +'512,,,,,,,,,,,,,,,,,,,,512,,,512,,,512,512,,,512,,,,,,512,,,,,,,,,512', +',,,,512,512,512,512,,512,512,512,512,,,,,512,512,,509,509,509,,509,512', +',512,509,509,,,,509,,509,509,509,509,509,509,509,,,,,,509,509,509,509', +'509,509,509,,,509,,,,,,,509,,,509,509,509,509,509,509,509,509,,509,509', +'509,,509,509,,,509,,,,,,,,,,,,,,,,,,,,509,,,509,,,509,509,,,509,,,,', +',,,,,,,,,,,,,,,509,509,509,509,,509,509,509,509,,,,,509,509,,64,64,64', +',64,509,,509,64,64,,,,64,,64,64,64,64,64,64,64,,,,,,64,64,64,64,64,64', +'64,,,64,,,,,,,64,,,64,64,64,64,64,64,64,64,,64,64,64,,64,64,64,64,64', +',,,,,,,,,,,,,,,,,,,64,,,64,,,64,64,,,64,,,,,,64,,,,,,,,,64,,,,,64,64', +'64,64,,64,64,64,64,,,,,64,64,,44,44,44,,44,64,,64,44,44,,,,44,,44,44', +'44,44,44,44,44,,,,,,44,44,44,44,44,44,44,,,44,,,,,,,44,,,44,44,44,44', +'44,44,44,44,,44,44,44,,44,44,44,44,44,,,,,,,,,,,,,,,,,,,,44,,,44,,,44', +'44,,,44,,,,,,44,,,,,,,,,44,,,,,44,44,44,44,,44,44,44,44,,,,,44,44,,500', +'500,500,,500,44,,44,500,500,,,,500,,500,500,500,500,500,500,500,,,,', +',500,500,500,500,500,500,500,,,500,,,,,,,500,,,500,500,500,500,500,500', +'500,500,,500,500,500,,500,500,,,500,,,,,,,,,,,,,,,,,,,,500,,,500,,,500', +'500,,,500,,,,,,,,,,,,,,,,,,,,500,500,500,500,,500,500,500,500,,,,,500', +'500,,970,970,970,,970,500,,500,970,970,,,,970,,970,970,970,970,970,970', +'970,,,,,,970,970,970,970,970,970,970,,,970,,,,,,,970,,,970,970,970,970', +'970,970,970,970,970,970,970,970,,970,970,970,970,970,,,,,,,,,,,,,,,', +',,,,970,,,970,,,970,970,,,970,,970,,970,,970,,,970,,,,,,970,,,,,970', +'970,970,970,,970,970,970,970,,,,,970,970,,119,119,119,119,119,970,,970', +'119,119,,,,119,,119,119,119,119,119,119,119,,,,,,119,119,119,119,119', +'119,119,,,119,,,,,,119,119,,119,119,119,119,119,119,119,119,119,,119', +'119,119,,119,119,119,119,119,,,,,,,,,,,,,,,,,,,,119,,,119,,,119,119', +',,119,,119,,,,119,,,,,,,,,119,,,,,119,119,119,119,,119,119,119,119,', +',,,119,119,,118,118,118,,118,119,,119,118,118,,,,118,,118,118,118,118', +'118,118,118,,,,,,118,118,118,118,118,118,118,,,118,,,,,,,118,,,118,118', +'118,118,118,118,118,118,,118,118,118,,118,118,118,118,118,836,836,836', +'836,836,836,836,836,836,836,836,,836,836,,,836,836,,118,,,118,,,118', +'118,,,118,,,836,,836,118,836,836,,836,836,836,836,836,118,836,,,,118', +'118,118,118,,118,118,118,118,,,,,118,118,,836,471,,,,118,,118,471,471', +'471,,,471,471,471,613,471,613,613,613,613,613,,,,471,471,,,,613,,,,', +',471,471,,471,471,471,471,471,,,,,,,,,613,,,,,,,,,613,613,613,613,,', +',613,,,,,,,,,471,,412,,,,,471,,412,412,412,471,471,412,412,412,613,412', +',,,,,,,,412,412,412,,,,,,471,471,,412,412,,412,412,412,412,412,,,,,471', +',,471,,,,,471,,,,,,,,,,412,412,412,412,412,412,412,412,412,412,412,412', +'412,412,,,412,412,412,,,412,,412,412,,,412,412,,412,,412,,412,,412,412', +',412,412,412,412,412,,412,412,412,,,,,,,,,,,,,,412,,27,412,412,,412', +',412,27,27,27,,,27,27,27,,27,,,,,,,,,27,27,27,,,,,,,,,27,27,,27,27,27', +'27,27,,,,,,,,,,,,,,,,,,,,,,,27,27,27,27,27,27,27,27,27,27,27,27,27,27', +',,27,27,27,,,27,,27,27,,,27,27,,27,,27,,27,,27,27,,27,27,27,27,27,28', +'27,27,27,,,,28,28,28,,,28,28,28,,28,27,,,27,27,,27,,27,28,28,,,,,,,', +',28,28,,28,28,28,28,28,,,,,,,,,,,,,,,,,,,,,,,28,28,28,28,28,28,28,28', +'28,28,28,28,28,28,,,28,28,28,,,28,,28,28,,,28,28,,28,,28,,28,,28,28', +',28,28,28,28,28,,28,,28,,,,,,,,,,,,,,28,,,28,28,,28,,28,583,583,583', +'583,583,583,583,583,583,583,583,583,583,583,583,583,583,583,583,583', +'583,583,583,583,,,,583,583,583,583,583,583,583,583,583,583,,,,,,583', +'583,583,583,583,583,583,583,583,,,583,,,,,,,,583,583,,583,583,583,583', +'583,583,583,,,583,583,,,,583,583,583,583,,,,,,,,,,,,,,583,583,,583,583', +'583,583,583,583,583,583,583,583,583,583,,,583,583,,,,,,,,,,,,,,583,8', +'8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,,,,8,8,8,8,8,8,8,8,8,8', +',,,,,8,8,8,8,8,8,8,8,8,8,,8,,,,,,,,8,8,,8,8,8,8,8,8,8,,,8,8,,,,8,8,8', +'8,,,,,,,,,,,,,,8,8,,8,8,8,8,8,8,8,8,8,8,8,8,,,8,8,,,,,,,,,,,,,,8,393', +'393,393,393,393,393,393,393,393,393,393,393,393,393,393,393,393,393', +'393,393,393,393,393,393,,,,393,393,393,393,393,393,393,393,393,393,', +',,,,393,393,393,393,393,393,393,393,393,,,393,,,,,,,,393,393,,393,393', +'393,393,393,393,393,,,393,393,,,,393,393,393,393,,,,,,,,,,,,,,393,393', +',393,393,393,393,393,393,393,393,393,393,393,393,,,393,393,,,,,,,,,', +',,,,393,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,,,,9,9,9,9,9', +'9,9,9,9,9,,,,,,9,9,9,9,9,9,9,9,9,,,9,,,,,,,,9,9,,9,9,9,9,9,9,9,,,9,9', +',,,9,9,9,9,,,,,,,,,,,,,,9,9,,9,9,9,9,9,9,9,9,9,9,9,9,,,9,9,,,,,,,,,', +',,,,9,713,713,713,713,713,713,713,713,713,713,713,713,713,713,713,713', +'713,713,713,713,713,713,713,713,,,,713,713,713,713,713,713,713,713,713', +'713,,,,,,713,713,713,713,713,713,713,713,713,,,713,,,,,,,,713,713,,713', +'713,713,713,713,713,713,,,713,713,,,,713,713,713,713,,,,,,,,,,,,,,713', +'713,,713,713,713,713,713,713,713,713,713,713,713,713,,,713,71,71,71', +'71,71,71,71,71,71,71,71,71,71,71,71,71,71,71,71,71,71,71,71,71,,,,71', +'71,71,71,71,71,71,71,71,71,,,,,,71,71,71,71,71,71,71,71,71,71,71,71', +',71,,,,,,71,71,,71,71,71,71,71,71,71,,,71,71,,,,71,71,71,71,,,,,,71', +',,,,,,,71,71,,71,71,71,71,71,71,71,71,71,71,71,71,,,71,644,644,644,644', +'644,644,644,644,644,644,644,,644,644,,,644,644,,,938,,938,938,938,938', +'938,,,,,,644,,644,938,644,644,,644,644,644,644,644,,644,517,517,517', +'517,517,517,517,517,517,517,517,938,517,517,,,517,517,,644,,,938,938', +',,,938,,,,,517,,517,,517,517,,517,517,517,517,517,,517,273,273,273,273', +'273,273,273,273,273,273,273,,273,273,,,273,273,,517,1008,,1008,1008', +'1008,1008,1008,,,,,,273,,273,1008,273,273,,273,273,273,273,273,,273', +'469,469,469,469,469,469,469,469,469,469,469,1008,469,469,,,469,469,', +'273,,,1008,1008,,,,1008,,,,,469,,469,,469,469,,469,469,469,469,469,', +'469,424,424,424,424,424,424,424,424,424,424,424,,424,424,,,424,424,469', +'469,998,,998,998,998,998,998,,,,,,424,,424,998,424,424,,424,424,424', +'424,424,,424,21,21,21,21,21,21,21,21,21,21,21,998,21,21,,,21,21,,424', +',,998,998,,,,998,,,,,21,,21,,21,21,,21,21,21,21,21,,21,839,839,839,839', +'839,839,839,839,839,839,839,,839,839,,,839,839,,21,655,,655,655,655', +'655,655,,,,,,839,,839,655,839,839,,839,839,839,839,839,,839,730,730', +'730,730,730,730,730,730,730,730,730,655,730,730,,,730,730,,839,655,655', +'655,655,,,,655,,,,,730,,730,,730,730,,730,730,730,730,730,,730,737,737', +'737,737,737,737,737,737,737,737,737,,737,737,,,737,737,,730,,,,,,,,', +',,,,737,,737,,737,737,,737,737,737,737,737,,737,,,,,,210,210,,,210,', +',,,,,,210,210,737,210,210,210,210,210,210,210,,,210,210,,,,210,210,210', +'210,,,,,,210,,,,,,,,210,210,,210,210,210,210,210,210,210,210,210,210', +'210,210,504,504,210,,504,,,,,,,,504,504,,504,504,504,504,504,504,504', +',,504,504,,,,504,504,504,504,,,,,,504,,,,,,,,504,504,,504,504,504,504', +'504,504,504,504,504,504,504,504,437,437,504,,437,,,,,,,,437,437,,437', +'437,437,437,437,437,437,,,437,437,,,,437,437,437,437,,,,,,437,,,,,,', +',437,437,,437,437,437,437,437,437,437,437,437,437,437,437,917,917,437', +',917,,,,,,,,917,917,,917,917,917,917,917,917,917,,,917,917,,,,917,917', +'917,917,,,,,,917,,,,,,,,917,917,,917,917,917,917,917,917,917,917,917', +'917,917,917,503,503,917,,503,,,,,,,,503,503,,503,503,503,503,503,503', +'503,,,503,503,,,,503,503,503,503,,,,,,503,,,,,,,,503,503,,503,503,503', +'503,503,503,503,503,503,503,503,503,258,258,503,,258,,,,,,,,258,258', +',258,258,258,258,258,258,258,,,258,258,,,,258,258,258,258,,,,,,,,,,', +',,,258,258,,258,258,258,258,258,258,258,258,258,258,258,258,971,971', +'258,,971,,,,,,,,971,971,,971,971,971,971,971,971,971,,,971,971,,,,971', +'971,971,971,,,,,,971,,,,,,,,971,971,,971,971,971,971,971,971,971,971', +'971,971,971,971,516,516,971,,516,,,,,,,,516,516,,516,516,516,516,516', +'516,516,,,516,516,,,,516,516,516,516,,,,,,516,,,,,,,,516,516,,516,516', +'516,516,516,516,516,516,516,516,516,516,515,515,516,,515,,,,,,,,515', +'515,,515,515,515,515,515,515,515,,,515,515,,,,515,515,515,515,,,,,,515', +',,,,,,,515,515,,515,515,515,515,515,515,515,515,515,515,515,515,972', +'972,515,,972,,,,,,,,972,972,,972,972,972,972,972,972,972,,,972,972,', +',,972,972,972,972,,,,,,972,,,,,,,,972,972,,972,972,972,972,972,972,972', +'972,972,972,972,972,551,551,972,,551,,,,,,,,551,551,,551,551,551,551', +'551,551,551,,,551,551,,,,551,551,551,551,,,,,,551,,,,,,,,551,551,,551', +'551,551,551,551,551,551,551,551,551,551,551,550,550,551,,550,,,,,,,', +'550,550,,550,550,550,550,550,550,550,,,550,550,,,,550,550,550,550,,', +',,,550,,,,,,,,550,550,,550,550,550,550,550,550,550,550,550,550,550,550', +'438,438,550,,438,,,,,,,,438,438,,438,438,438,438,438,438,438,,,438,438', +',,,438,438,438,438,,,,,,438,,,,,,,,438,438,,438,438,438,438,438,438', +'438,438,438,438,438,438,544,544,438,,544,,,,,,,,544,544,,544,544,544', +'544,544,544,544,,,544,544,,,,544,544,544,544,,,,,,544,,,,,,,,544,544', +',544,544,544,544,544,544,544,544,544,544,544,544,543,543,544,,543,,', +',,,,,543,543,,543,543,543,543,543,543,543,,,543,543,,,,543,543,543,543', +',,,,,543,,,,,,,,543,543,,543,543,543,543,543,543,543,543,543,543,543', +'543,209,209,543,,209,,,,,,,,209,209,,209,209,209,209,209,209,209,,,209', +'209,,,,209,209,209,209,,,,,,209,,,,,,,,209,209,,209,209,209,209,209', +'209,209,209,209,209,209,209,,962,209,962,962,962,962,962,960,,960,960', +'960,960,960,958,962,958,958,958,958,958,,960,,,,,,956,958,956,956,956', +'956,956,,,962,,,,,,956,960,,,,962,962,,958,,962,,960,960,,,,960,,958', +'958,,956,,958,,,,,,,956,956,956,956,,,936,956,936,936,936,936,936,934', +',934,934,934,934,934,,936,,,,,,932,934,932,932,932,932,932,,,,,,,,,932', +'936,,,,,,,934,,,,936,936,,,,936,,934,934,,932,,934,,,,,,,932,932,932', +'932,,,532,932,532,532,532,532,532,,795,,795,795,795,795,795,532,,,,', +',,,795,,711,,711,711,711,711,711,,,,,,532,532,,711,,,,,795,532,532,532', +'532,,,,532,795,795,795,795,,,,795,711,,797,,797,797,797,797,797,711', +'711,711,711,,,,711,797,,799,,799,799,799,799,799,,559,,559,559,559,559', +'559,799,,,,,797,,,559,,,,,,797,797,797,797,,,,797,799,,,,,,,,559,559', +',799,799,,,,799,559,559,559,559,,,843,559,843,843,843,843,843,,845,', +'845,845,845,845,845,843,,,,,,,,845,,847,,847,847,847,847,847,,,,,,843', +',,847,,,,,845,843,843,843,843,,,,843,845,845,845,845,,,,845,847,,900', +',900,900,900,900,900,,,847,847,,,,847,900,,,,,,,,,,,,,,,,,,,,,,900,900', +',,,,,,,900,900,900,900,,,,900' ] + racc_action_check = arr = ::Array.new(24856, nil) + idx = 0 + clist.each do |str| + str.split(',', -1).each do |i| + arr[idx] = i.to_i unless i.empty? + idx += 1 + end + end + +racc_action_pointer = [ + 893, 80, nil, 412, nil, 9058, 1007, 43, 22436, 22692, + 81, nil, 80, 143, 240, 521, 116, 766, nil, 15, + 5946, 23212, 243, nil, 104, nil, 296, 22064, 22174, 6849, + 6978, 7107, nil, 3742, 8663, 8792, nil, 181, 438, 540, + 275, 751, 11509, 12412, 21208, 218, 1283, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 1670, nil, 34, 19265, + 13057, 74, nil, 12928, 21079, nil, nil, 20426, 20297, 20168, + 20039, 22933, nil, nil, nil, nil, nil, nil, nil, 318, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 0, nil, nil, 622, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 357, nil, + 19128, nil, nil, nil, nil, 18870, 18612, 17701, 21724, 21595, + 0, nil, 847, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 271, nil, 3613, 12154, 12025, 11638, 24331, + 23416, 10864, 10477, 10348, 10219, 9832, 8929, nil, nil, 633, + 267, 192, 357, 173, 298, 366, nil, 6720, 1022, 376, + 5817, 5688, 5430, 5301, 17443, 17056, 16927, 16282, 16153, 15379, + 14734, 14605, 14347, 14218, 13831, 13444, 13315, 6591, 18741, 13186, + 13573, 14089, 15637, 15766, 15895, 16024, nil, nil, 23721, nil, + nil, 371, 16411, 16540, nil, nil, nil, nil, nil, nil, + nil, 16669, nil, 23074, nil, 366, 368, nil, 17185, 429, + 17572, nil, 5043, 5172, nil, nil, 610, nil, 6204, 1136, + 434, 417, 4387, 470, 513, 483, 7236, 2065, 701, 657, + 1409, 569, 902, nil, 539, 554, 210, nil, nil, nil, + 613, 389, 578, 9703, nil, 405, 653, 655, 473, nil, + 673, nil, 10606, 1936, 10735, 612, nil, 199, 401, 664, + 649, 62, 703, nil, nil, 604, 168, 153, 17830, 17959, + 656, 788, 685, 90, 127, 789, 766, 129, 812, nil, + nil, 371, 405, 467, nil, 808, nil, 59, 19910, nil, + nil, nil, 413, 352, 660, 351, 659, 723, 459, 590, + 703, nil, 683, nil, 12670, nil, 333, 307, 551, 443, + 337, 89, 112, 436, nil, nil, nil, nil, nil, nil, + nil, nil, 734, 22564, nil, nil, nil, nil, 735, nil, + 718, nil, 12799, 720, nil, 7236, 725, nil, 724, 727, + 547, 599, 21935, nil, nil, nil, 512, 402, 781, nil, + nil, 4777, 756, nil, 23166, nil, 732, nil, nil, 1538, + nil, nil, nil, nil, 289, nil, 787, 23538, 24148, 19781, + 113, 19652, 19523, 19394, 2194, 1280, 351, 461, 813, 814, + 815, 818, 2968, 3097, 3226, 2710, 2581, 2452, 1619, 1022, + 1936, 1151, 2323, 2065, 2839, 713, 739, 1807, 1409, 23120, + 148, 21856, nil, nil, nil, nil, 760, nil, 45, 78, + 772, nil, nil, 18483, nil, 18354, nil, 18225, nil, nil, + nil, nil, 18088, 1265, 2968, 777, 784, nil, nil, 786, + 21337, 790, 12541, 23660, 23477, 630, 832, nil, nil, 20950, + 796, nil, 20821, 20692, 20563, 23904, 23843, 23028, 12283, 928, + 940, 146, 874, nil, 11896, nil, nil, 11767, nil, nil, + nil, nil, 24546, 3097, 963, nil, 2839, 171, 55, 961, + 971, 11251, 11122, 24270, 24209, 139, nil, nil, 889, nil, + 24087, 24026, 10993, nil, nil, nil, 471, 121, 2194, 24635, + nil, 291, nil, nil, nil, 1263, nil, nil, nil, 864, + nil, nil, 258, nil, 289, nil, nil, 853, nil, 855, + nil, nil, nil, 22308, nil, 858, 10090, 9961, 354, 898, + 9574, 9445, 9316, 9187, 897, nil, nil, 8534, 8405, 901, + nil, 8147, 8018, nil, nil, 39, 286, 134, 268, 869, + 4645, 874, nil, 21820, nil, 1807, 980, 0, 122, nil, + 1538, 1280, nil, 879, nil, 930, 7760, nil, nil, nil, + 905, 287, 7373, 886, nil, 890, 230, 226, 941, 520, + 1148, 945, 903, 5559, 22982, 972, 992, 189, 1050, 17314, + nil, 948, nil, 443, 156, 23293, nil, 949, 961, nil, + 965, 966, 967, nil, nil, nil, nil, nil, nil, 962, + nil, 879, nil, 14476, nil, nil, nil, 1052, nil, nil, + nil, 1057, nil, nil, 1058, 775, nil, 1097, nil, nil, + nil, nil, 1103, nil, 156, 985, 167, 190, 289, 291, + 11380, 481, 1013, nil, 986, 4129, 18999, nil, nil, 1109, + 1151, 24571, 671, 22820, nil, nil, nil, nil, nil, nil, + 4914, nil, nil, nil, nil, nil, nil, nil, 988, 13702, + 23304, 13960, nil, 996, nil, 8792, nil, 23350, nil, nil, + 18088, nil, 19128, nil, 20426, 14863, 14992, 15121, 15250, 308, + 15508, 997, 1001, nil, 1002, 1003, 1008, nil, 1037, 1017, + 1013, 1010, 16798, nil, nil, 1150, nil, nil, 4516, 1050, + 1155, nil, nil, nil, 1032, 515, nil, nil, 1159, nil, + 3871, 1054, 1106, nil, nil, 1117, nil, nil, nil, nil, + 1081, 710, nil, nil, 582, 24554, nil, 24610, nil, 24627, + nil, 6075, nil, 720, nil, 1096, 333, nil, 1100, nil, + nil, nil, nil, 1229, nil, 6333, 1236, 2452, 2581, nil, + 6462, 3484, 65, 118, nil, 1238, 522, 4645, nil, 1241, + 1125, nil, nil, 1136, 1131, nil, 21724, 7502, 7631, 23258, + 647, nil, nil, 24687, nil, 24695, nil, 24712, nil, nil, + 1156, 1395, 7889, 446, 1215, nil, 1162, nil, nil, nil, + 2710, nil, nil, 167, 8276, nil, nil, 3226, 3355, 1186, + 1144, nil, nil, nil, 1145, 1155, nil, 1159, 1160, nil, + 1161, nil, 1166, 821, 1186, 1038, nil, nil, 157, nil, + 1314, 1327, nil, 375, nil, nil, nil, 1331, nil, nil, + 24751, nil, 1228, nil, nil, 1233, 1236, 1237, 1241, nil, + 1246, nil, 442, nil, nil, nil, 876, 23599, nil, nil, + nil, 2323, 1147, 560, 1151, 1329, 1280, nil, 1279, 1384, + nil, nil, 24494, nil, 24480, nil, 24473, nil, 23017, nil, + nil, nil, nil, 615, 1008, 1261, 4000, nil, nil, nil, + nil, nil, 4258, nil, 1409, nil, 24421, nil, 24407, nil, + 24400, nil, 24393, nil, nil, nil, 1137, 1310, 1315, 1398, + 21466, 23782, 23965, 1406, nil, nil, 1273, 1274, 1284, 1288, + 1289, 947, 1290, 917, 642, 1416, 1424, 1301, 1302, 1303, + 1304, nil, nil, 1315, 114, 128, 144, 594, 23201, nil, + nil, nil, nil, 908, 1318, nil, nil, nil, 23109, nil, + nil, nil, nil, 155, 1332, 1336, -77, nil, nil ] + +racc_action_default = [ + -3, -591, -1, -577, -4, -591, -7, -591, -591, -591, + -591, -29, -591, -591, -591, -279, -591, -41, -44, -579, + -591, -49, -51, -52, -53, -57, -258, -258, -258, -293, + -329, -330, -69, -11, -73, -81, -83, -591, -488, -489, + -591, -591, -591, -591, -591, -579, -239, -270, -271, -272, + -273, -274, -275, -276, -277, -278, -567, -281, -283, -590, + -558, -301, -303, -591, -591, -307, -310, -577, -591, -591, + -591, -591, -331, -332, -334, -335, -431, -432, -433, -434, + -435, -456, -438, -439, -458, -460, -443, -448, -452, -454, + -470, -458, -472, -473, -565, -477, -478, -566, -480, -481, + -482, -483, -484, -485, -486, -487, -492, -493, -591, -2, + -578, -586, -587, -588, -6, -591, -591, -591, -591, -591, + -3, -17, -591, -112, -113, -114, -115, -116, -117, -118, + -119, -120, -124, -125, -126, -127, -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, -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, -22, -121, -11, -591, -591, -248, -591, + -591, -591, -591, -591, -591, -591, -579, -580, -48, -591, + -488, -489, -591, -279, -591, -591, -231, -591, -11, -591, + -591, -591, -591, -591, -591, -591, -591, -591, -591, -591, + -591, -591, -591, -591, -591, -591, -591, -591, -591, -591, + -591, -591, -591, -591, -591, -591, -400, -402, -591, -575, + -576, -58, -248, -591, -300, -406, -415, -417, -64, -412, + -65, -579, -66, -240, -253, -262, -262, -257, -591, -263, + -591, -560, -591, -591, -67, -68, -577, -12, -591, -15, + -591, -71, -11, -579, -591, -74, -77, -11, -89, -90, + -591, -591, -97, -293, -296, -579, -591, -329, -330, -333, + -413, -591, -79, -591, -85, -290, -474, -475, -591, -216, + -217, -232, -591, -11, -591, -579, -241, -583, -583, -591, + -591, -583, -591, -302, -392, -50, -591, -591, -591, -591, + -577, -591, -578, -488, -489, -591, -591, -279, -591, -345, + -346, -107, -108, -591, -110, -591, -279, -591, -591, -488, + -489, -322, -112, -113, -154, -155, -156, -172, -177, -184, + -187, -324, -591, -556, -591, -436, -591, -591, -591, -591, + -591, -591, -591, -591, 1019, -5, -589, -23, -24, -25, + -26, -27, -591, -591, -19, -20, -21, -122, -591, -30, + -39, -40, -591, -591, -31, -197, -579, -249, -262, -262, + -568, -569, -258, -410, -570, -571, -569, -568, -258, -409, + -411, -570, -571, -37, -205, -38, -591, -42, -43, -195, + -263, -45, -46, -47, -579, -299, -591, -591, -591, -248, + -290, -591, -591, -591, -206, -207, -208, -209, -210, -211, + -212, -213, -218, -219, -220, -221, -222, -223, -224, -225, + -226, -227, -228, -229, -230, -233, -234, -235, -236, -579, + -381, -258, -568, -569, -55, -59, -579, -259, -381, -381, + -579, -295, -254, -591, -255, -591, -260, -591, -264, -563, + -564, -10, -578, -14, -3, -579, -70, -288, -86, -75, + -591, -579, -248, -591, -591, -96, -591, -474, -475, -591, + -82, -87, -591, -591, -591, -591, -591, -237, -591, -423, + -591, -284, -591, -242, -585, -584, -244, -585, -291, -292, + -559, -304, -520, -11, -336, -337, -11, -591, -591, -591, + -591, -591, -248, -591, -591, -290, -315, -107, -108, -109, + -591, -591, -248, -318, -494, -495, -591, -591, -11, -520, + -326, -579, -437, -457, -462, -591, -464, -440, -459, -591, + -461, -442, -591, -445, -591, -447, -450, -591, -451, -591, + -471, -8, -18, -591, -28, -269, -591, -591, -414, -591, + -250, -252, -591, -591, -60, -247, -407, -591, -591, -62, + -408, -591, -591, -298, -581, -568, -569, -568, -569, -579, + -195, -591, -382, -579, -384, -11, -54, -403, -381, -245, + -11, -11, -294, -262, -261, -265, -591, -561, -562, -13, + -591, -72, -591, -78, -84, -579, -568, -569, -246, -93, + -95, -591, -80, -591, -204, -214, -215, -579, -590, -590, + -282, -579, -287, -583, -591, -520, -395, -555, -555, -503, + -505, -505, -505, -519, -521, -522, -523, -524, -525, -526, + -527, -591, -529, -591, -535, -537, -538, -540, -545, -547, + -548, -550, -551, -552, -591, -590, -338, -590, -308, -339, + -340, -311, -591, -314, -591, -579, -568, -569, -572, -289, + -591, -107, -108, -111, -579, -11, -591, -497, -320, -591, + -11, -520, -591, -591, -557, -463, -466, -467, -468, -469, + -11, -441, -444, -446, -449, -453, -455, -123, -267, -591, + -198, -591, -582, -262, -33, -200, -34, -201, -61, -35, + -203, -36, -202, -63, -196, -591, -591, -591, -591, -414, + -591, -555, -555, -363, -365, -365, -365, -380, -591, -579, + -386, -526, -591, -533, -543, -591, -405, -404, -11, -591, + -591, -256, -266, -16, -76, -91, -88, -297, -590, -343, + -11, -424, -590, -425, -426, -591, -243, -393, -396, -398, + -579, -591, -501, -502, -591, -591, -512, -591, -515, -591, + -517, -591, -347, -591, -349, -351, -358, -526, -579, -531, + -539, -549, -553, -591, -341, -591, -591, -11, -11, -313, + -591, -11, -414, -591, -414, -591, -591, -11, -323, -591, + -579, -499, -327, -591, -268, -32, -199, -251, -591, -238, + -591, -361, -362, -371, -373, -591, -376, -591, -378, -383, + -591, -591, -591, -532, -591, -401, -591, -416, -418, -9, + -11, -430, -344, -591, -591, -428, -285, -11, -11, -591, + -555, -536, -554, -504, -505, -505, -530, -505, -505, -546, + -505, -541, -579, -591, -356, -591, -528, -305, -591, -306, + -591, -591, -265, -590, -316, -319, -496, -591, -325, -498, + -520, -465, -555, -534, -364, -365, -365, -365, -365, -544, + -365, -385, -579, -388, -390, -391, -542, -591, -290, -56, + -429, -11, -98, -99, -591, -591, -106, -427, -591, -591, + -394, -500, -591, -508, -591, -510, -591, -513, -591, -516, + -518, -348, -350, -354, -591, -359, -11, -309, -312, -419, + -420, -421, -11, -321, -11, -360, -591, -368, -591, -370, + -591, -374, -591, -377, -379, -387, -591, -289, -572, -423, + -248, -591, -591, -105, -397, -399, -505, -505, -505, -505, + -352, -591, -357, -591, -590, -591, -591, -365, -365, -365, + -365, -389, -422, -579, -568, -569, -572, -104, -591, -506, + -509, -511, -514, -591, -355, -342, -317, -328, -591, -366, + -369, -372, -375, -414, -505, -353, -365, -507, -367 ] + +clist = [ +'215,406,295,265,269,14,333,126,126,326,14,274,274,274,412,418,257,113', +'2,648,371,520,484,533,536,219,322,540,258,428,121,204,129,129,219,219', +'219,710,14,300,300,336,337,510,588,340,335,335,131,131,335,110,6,475', +'813,476,656,6,663,261,268,270,752,471,627,401,549,109,219,219,126,425', +'219,345,355,355,312,275,275,275,624,113,624,218,755,663,913,435,688', +'691,808,778,915,387,388,389,390,909,335,335,335,335,758,615,357,361', +'627,327,700,523,526,620,621,530,563,14,570,573,573,114,219,219,219,219', +'14,14,276,276,276,293,816,341,377,952,942,705,879,876,392,383,572,574', +'481,756,827,558,559,713,900,324,323,372,757,553,348,484,328,331,531', +'330,291,759,6,373,496,617,329,792,793,583,627,391,6,912,1,654,787,532', +'618,790,867,663,868,470,478,876,413,624,624,479,274,949,309,309,782', +'863,431,432,433,434,375,991,376,378,272,284,285,915,909,422,14,219,219', +'219,379,393,219,219,219,219,219,219,882,380,385,692,309,309,309,381', +'633,382,609,14,942,830,715,663,720,642,870,706,412,418,274,274,350,749', +'850,203,874,768,629,274,403,871,709,903,859,325,403,841,842,703,802', +'945,651,219,219,399,404,879,334,775,423,427,219,338,817,869,876,511', +'339,265,818,,506,269,,902,,,752,14,752,635,752,14,,,113,300,14,,876', +'603,522,521,638,,723,275,723,,905,,537,538,300,275,638,335,335,,982', +'875,,877,14,219,,,,822,492,695,950,499,,,493,557,824,219,219,704,,619', +'638,,491,622,,1005,113,,638,561,,,276,1004,774,219,,,631,,276,771,,554', +'634,906,894,907,560,,954,219,931,821,294,1015,,,738,589,495,595,,743', +'126,501,,600,802,,,884,,,,825,539,752,,752,829,752,,752,955,,413,582', +'627,129,428,291,,274,,,291,38,663,,,,38,,714,131,624,786,,422,477,,', +',,,219,594,480,,595,,611,599,,,309,,,752,38,298,298,,976,,753,,,,511', +'992,,309,,,,,802,511,802,771,413,,,,274,,987,,,,,,413,343,359,359,359', +'14,,14,,647,,422,616,300,,219,783,,,,630,,300,422,,,777,,413,,,219,274', +'897,,,413,,,,,,274,38,980,802,14,,,14,,422,38,38,6,219,,422,921,689', +'689,,398,,,219,,,,,767,14,,,,,,,707,708,,,802,946,802,294,,951,623,', +'126,,,,,,,694,589,,,,760,,802,219,219,784,511,,219,219,,727,219,129', +',,766,776,,,,595,589,,600,,14,653,,131,,14,14,844,846,848,38,1013,785', +',,,,300,,26,,294,872,,26,872,294,,300,,,,986,38,,734,736,,309,26,739', +'741,832,,427,,,309,26,26,26,,26,,,,589,,823,886,,,,335,826,589,,733', +',335,,872,,,753,,753,403,753,,,899,26,26,,219,26,,,,14,219,126,38,,14', +',38,,,,298,38,,,14,831,,861,,,,865,,,,219,,298,,760,,,,,,,,38,26,,,', +'941,26,26,26,26,26,26,,,,993,,,,853,,,,760,,14,,,638,,957,959,961,963', +',964,,14,,,,,309,,,888,835,,,,335,,,309,,,,754,,753,,753,,753,,753,', +',,,,,219,,14,14,,,14,,,,,,14,,,,,689,,,896,,,,26,26,26,26,,,26,26,26', +'26,26,26,,916,,753,1009,1010,1011,1012,,14,,26,,924,,,14,14,,,,,,,,', +'685,,,687,,,,1018,,,,965,,,,,,,,26,26,,,,,,,,26,,,,,,422,38,,38,309', +',,,,298,14,26,,,,26,39,,298,,26,39,,,,,,,,,,,413,,,14,274,,,,,14,38', +'14,,38,26,26,765,39,299,299,,769,770,422,,,589,219,,26,26,,,,,38,,,', +'16,332,878,,880,16,,,,,26,,,344,360,360,360,,,,,,,309,,,26,,,,,,,16', +',309,,,,,,,,,,,,,,,908,,910,38,,39,,,38,38,796,798,800,,39,39,,,349', +',298,,,,,,,,,,,298,833,,,,,,,,,26,,,,,,,,,,,,,,,,,,,16,,,,,,,,,16,16', +',,,,,,,,,856,,,,,,,977,,978,,979,862,38,26,,26,400,38,,39,,,430,26,', +',,38,,,988,,989,,990,,,,,26,,,39,,,,,,890,891,,,893,,26,,,26,,,,,,26', +',,,,,359,,,1014,26,16,38,,,,26,,426,1016,,,,,38,486,,488,920,489,490', +',,,16,928,929,,,39,,,,39,,,,299,39,,26,26,,,,26,26,,,26,,38,38,,299', +'38,,,,,,38,,26,39,,,,26,26,933,935,,937,939,,940,,,969,,,,,16,,359,', +'16,,,,,16,38,,,,922,,,38,38,,984,,,,,,985,,,,,,,,,16,,,,,,,,,,,,,15', +',,,,15,,585,,,,,,,,,26,,,,13,26,26,38,,13,26,,,,,,,15,302,302,26,,,', +'999,1000,1001,1002,,,,26,38,,,,,13,38,,38,,,,,,,,,,,,347,356,356,,,', +',,,,1017,,,,,,26,,,,625,,332,,628,,,,26,,,,,39,,39,,,,,,299,15,,,,,', +',,299,15,15,,,,,,,,,625,13,26,332,26,26,,,26,,13,13,,39,26,,39,430,', +',,,,,,,,16,,16,,,,,,,,,39,,,,,,,,,26,,,,,,,26,26,,,,,,,728,,,,625,332', +'16,,,16,,,,,15,,,,,,,,,,,,,,,,,16,,39,13,,,15,39,39,772,,,,,,26,,,,299', +',,,,,,13,,,,299,,781,,,,,,,,26,,,426,,,26,,26,,,,,,,,809,16,,,,,16,16', +'26,,15,,,,15,,,,302,15,,,,,,,,,,,13,,,,13,302,39,,,13,,39,,,,15,,,,', +',39,,,,,834,,,,,,,,,13,,,,,,,,,,,,,,,,,,,,,,,,,,16,,360,,,16,,,39,,', +',,,,16,,,,,39,,,,,,,,,,,,,,,,,881,,,,,,,,,,,,,,,,,,,892,39,39,,,39,', +'16,,,,39,,,,,,332,,16,,,,,,,,,,,,,,,,,360,,,,,,,,39,,,,923,,,39,39,', +',,16,16,,,16,,,,,,16,15,,15,,,,,,302,,,,,,,,,302,,,13,,13,,,,,,,,,,16', +',,,927,,39,16,16,15,,,15,,,,,,,,,,,,,,,,,13,,39,13,,15,,,39,,39,,719', +',,,,,,,,,,,,13,,,,,,,16,,,,,,,,,,,,,,,,,,,,,,,,,16,,,,,15,16,,16,,15', +'15,,,,,,,,,,,302,,,13,,,,,13,13,,302,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,', +',,,,,,,,,,,,,,,,,,,,,,,,,,,,,,15,,,,,15,,,,,,,,,,15,,,,,13,,,,,13,,', +',,,,,,,13,,,,,,,,,,,,,,,,,,,,,,356,,,,,,15,,,,226,,,,,,,,15,273,273', +'273,,,,,13,,,,,,319,320,321,,,,13,,,,,,,,,,,273,273,,,,,15,15,,,15,', +',,,,15,,,,,,,,,,13,13,,,13,,,,,,13,,,,,356,,,,,,,,15,,,,926,,,15,15', +',,,,,,,,,,,13,,,,,,,13,13,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,15,,,,,,,', +',,,,,,,,,,,,13,,,,,15,,,,,,15,,15,,,,273,405,273,,,424,429,,13,,,,,', +'13,,13,,,,,226,,,444,445,446,447,448,449,450,451,452,453,454,455,456', +'457,458,459,460,461,462,463,464,465,466,467,468,469,,,,,,,273,273,,', +',,,,,273,,,,,,,273,,273,,273,273,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,', +',,,517,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,', +',,,,,,,,,,,,,,,,,,273,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,273,,424,610', +'405,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,273,,273,,273,,,,,,,,,,,', +',,,273,,,,,,,,,,644,645,646,,,,,,,,,,273,,,273,,,,,,,,,,,,,,273,273', +',,,,,,,,,273,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,273,730,,,273,273,735', +'737,,,,740,742,,,610,744,,,,,,,,,,,,,,,,,,,,,,,,273,,,,,,,,,,,,,,,,', +',,,,,,273,,,,,,,,,,,,,,,,,,,,,,,,273,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,', +',,,,,,,,,,,,,,,,,,,,,,,,273,,836,,,,,,,,,,,,,,735,737,742,740,,839,', +',,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,273,,,,,,,,,,,,,,,', +',,,273,,,,,,,,,,,,,,,,,273,836,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,', +',,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,', +',,,,,,,,,,,,,,,,,,,,,,,,,,273' ] + racc_goto_table = arr = ::Array.new(3046, nil) + idx = 0 + clist.each do |str| + str.split(',', -1).each do |i| + arr[idx] = i.to_i unless i.empty? + idx += 1 + end + end + +clist = [ +'31,23,49,69,69,22,84,57,57,65,22,33,33,33,37,37,138,94,2,10,56,8,71', +'87,87,22,31,90,36,18,15,15,60,60,22,22,22,96,22,22,22,17,17,51,24,17', +'29,29,61,61,29,6,7,39,88,23,137,7,163,38,38,38,121,37,175,27,54,4,22', +'22,57,27,22,22,22,22,50,66,66,66,72,94,72,20,127,163,132,47,89,89,117', +'11,133,17,17,17,17,172,29,29,29,29,130,40,55,55,175,66,107,67,67,40', +'40,67,156,22,156,156,156,5,22,22,22,22,22,22,68,68,68,46,11,4,152,108', +'115,109,171,167,2,152,155,155,47,128,110,111,112,113,114,99,98,97,119', +'93,91,71,68,68,86,83,45,125,7,82,47,70,64,122,122,62,175,7,7,131,1,134', +'135,136,42,137,139,163,140,141,143,167,69,72,72,144,33,145,63,63,146', +'147,29,29,29,29,150,132,151,153,44,44,44,133,172,57,22,22,22,22,154', +'30,22,22,22,22,22,22,117,157,5,90,63,63,63,158,51,159,23,22,115,137', +'160,163,161,51,121,162,37,37,33,33,19,24,130,16,166,40,14,33,66,168', +'8,169,12,101,66,122,122,54,116,118,100,22,22,20,20,171,102,24,20,20', +'22,103,104,130,167,49,105,69,106,,31,69,,121,,,121,22,121,23,121,22', +',,94,22,22,,167,47,31,29,37,,156,66,156,,127,,17,17,22,66,37,29,29,', +'118,128,,128,22,22,,,,24,6,23,11,50,,,7,29,24,22,22,23,,47,37,,4,47', +',88,94,,37,29,,,68,118,51,22,,,47,,68,71,,94,47,128,89,128,36,,96,22', +'122,87,9,118,,,39,31,46,69,,39,57,46,,69,116,,,116,,,,8,4,121,,121,8', +'121,,121,122,,69,15,175,60,18,45,,33,,,45,52,163,,,,52,,47,61,72,67', +',57,44,,,,,,22,38,44,,69,,31,38,,,63,,,121,52,52,52,,128,,123,,,,49', +'10,,63,,,,,116,49,116,71,69,,,,33,,128,,,,,,69,52,52,52,52,22,,22,,29', +',57,38,22,,22,27,,,,2,,22,57,,,47,,69,,,22,33,8,,,69,,,,,,33,52,116', +'116,22,,,22,,57,52,52,7,22,,57,87,94,94,,9,,,22,,,,,84,22,,,,,,,94,94', +',,116,87,116,9,,90,68,,57,,,,,,,66,31,,,,31,,116,22,22,65,49,,22,22', +',15,22,60,,,138,49,,,,69,31,,69,,22,68,,61,,22,22,124,124,124,52,24', +'31,,,,,22,,41,,9,123,,41,123,9,,22,,,,8,52,,20,20,,63,41,20,20,56,,20', +',,63,41,41,41,,41,,,,31,,17,47,,,,29,17,31,,68,,29,,123,,,123,,123,66', +'123,,,47,41,41,,22,41,,,,22,22,57,52,,22,,52,,,,52,52,,,22,94,,65,,', +',65,,,,22,,52,,31,,,,,,,,52,41,,,,47,41,41,41,41,41,41,,,,23,,,,22,', +',,31,,22,,,37,,124,124,124,124,,124,,22,,,,,63,,,17,20,,,,29,,,63,,', +',126,,123,,123,,123,,123,,,,,,,22,,22,22,,,22,,,,,,22,,,,,94,,,94,,', +',41,41,41,41,,,41,41,41,41,41,41,,22,,123,124,124,124,124,,22,,41,,22', +',,22,22,,,,,,,,,9,,,9,,,,124,,,,31,,,,,,,,41,41,,,,,,,,41,,,,,,57,52', +',52,63,,,,,52,22,41,,,,41,53,,52,,41,53,,,,,,,,,,,69,,,22,33,,,,,22', +'52,22,,52,41,41,9,53,53,53,,9,9,57,,,31,22,,41,41,,,,,52,,,,26,28,126', +',126,26,,,,,41,,,53,53,53,53,,,,,,,63,,,41,,,,,,,26,,63,,,,,,,,,,,,', +',,126,,126,52,,53,,,52,52,165,165,165,,53,53,,,26,,52,,,,,,,,,,,52,9', +',,,,,,,,41,,,,,,,,,,,,,,,,,,,26,,,,,,,,,26,26,,,,,,,,,,9,,,,,,,126,', +'126,,126,9,52,41,,41,28,52,,53,,,28,41,,,,52,,,126,,126,,126,,,,,41', +',,53,,,,,,9,9,,,9,,41,,,41,,,,,,41,,,,,,52,,,126,41,26,52,,,,41,,26', +'126,,,,,52,28,,28,9,28,28,,,,26,9,9,,,53,,,,53,,,,53,53,,41,41,,,,41', +'41,,,41,,52,52,,53,52,,,,,,52,,41,53,,,,41,41,165,165,,165,165,,165', +',,9,,,,,26,,52,,26,,,,,26,52,,,,52,,,52,52,,9,,,,,,9,,,,,,,,,26,,,,', +',,,,,,,,25,,,,,25,,28,,,,,,,,,41,,,,21,41,41,52,,21,41,,,,,,,25,25,25', +'41,,,,165,165,165,165,,,,41,52,,,,,21,52,,52,,,,,,,,,,,,25,25,25,,,', +',,,,165,,,,,,41,,,,28,,28,,28,,,,41,,,,,53,,53,,,,,,53,25,,,,,,,,53', +'25,25,,,,,,,,,28,21,41,28,41,41,,,41,,21,21,,53,41,,53,28,,,,,,,,,,26', +',26,,,,,,,,,53,,,,,,,,,41,,,,,,,41,41,,,,,,,28,,,,28,28,26,,,26,,,,', +'25,,,,,,,,,,,,,,,,,26,,53,21,,,25,53,53,28,,,,,,41,,,,53,,,,,,,21,,', +',53,,28,,,,,,,,41,,,26,,,41,,41,,,,,,,,28,26,,,,,26,26,41,,25,,,,25', +',,,25,25,,,,,,,,,,,21,,,,21,25,53,,,21,,53,,,,25,,,,,,53,,,,,28,,,,', +',,,,21,,,,,,,,,,,,,,,,,,,,,,,,,,26,,53,,,26,,,53,,,,,,,26,,,,,53,,,', +',,,,,,,,,,,,,28,,,,,,,,,,,,,,,,,,,28,53,53,,,53,,26,,,,53,,,,,,28,,26', +',,,,,,,,,,,,,,,,53,,,,,,,,53,,,,53,,,53,53,,,,26,26,,,26,,,,,,26,25', +',25,,,,,,25,,,,,,,,,25,,,21,,21,,,,,,,,,,26,,,,26,,53,26,26,25,,,25', +',,,,,,,,,,,,,,,,21,,53,21,,25,,,53,,53,,25,,,,,,,,,,,,,21,,,,,,,26,', +',,,,,,,,,,,,,,,,,,,,,,,26,,,,,25,26,,26,,25,25,,,,,,,,,,,25,,,21,,,', +',21,21,,25,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,', +',,,,25,,,,,25,,,,,,,,,,25,,,,,21,,,,,21,,,,,,,,,,21,,,,,,,,,,,,,,,,', +',,,,,25,,,,,,25,,,,32,,,,,,,,25,32,32,32,,,,,21,,,,,,32,32,32,,,,21', +',,,,,,,,,,32,32,,,,,25,25,,,25,,,,,,25,,,,,,,,,,21,21,,,21,,,,,,21,', +',,,25,,,,,,,,25,,,,25,,,25,25,,,,,,,,,,,,21,,,,,,,21,21,,,,,,,,,,,,', +',,,,,,,,,,,,,,,,,,,,25,,,,,,,,,,,,,,,,,,,,21,,,,,25,,,,,,25,,25,,,,32', +'32,32,,,32,32,,21,,,,,,21,,21,,,,,32,,,32,32,32,32,32,32,32,32,32,32', +'32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,,,,,,,32,32,,,,,,,,32', +',,,,,,32,,32,,32,32,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,32,,,,,,,', +',,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,', +',,,,32,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,32,,32,32,32,,,,,,,,,,,,', +',,,,,,,,,,,,,,,,,,,,,,,,,,,32,,32,,32,,,,,,,,,,,,,,,32,,,,,,,,,,32,32', +'32,,,,,,,,,,32,,,32,,,,,,,,,,,,,,32,32,,,,,,,,,,32,,,,,,,,,,,,,,,,,', +',,,,,,,,,,,,,,,,32,32,,,32,32,32,32,,,,32,32,,,32,32,,,,,,,,,,,,,,,', +',,,,,,,,32,,,,,,,,,,,,,,,,,,,,,,,32,,,,,,,,,,,,,,,,,,,,,,,,32,,,,,,', +',,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,32,,32,,,,,,,,,,,,', +',32,32,32,32,,32,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,32', +',,,,,,,,,,,,,,,,,,32,,,,,,,,,,,,,,,,,32,32,,,,,,,,,,,,,,,,,,,,,,,,,', +',,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,', +',,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,32' ] + racc_goto_check = arr = ::Array.new(3046, nil) + idx = 0 + clist.each do |str| + str.split(',', -1).each do |i| + arr[idx] = i.to_i unless i.empty? + idx += 1 + end + end + +racc_goto_pointer = [ + nil, 174, 18, nil, 64, 114, 48, 52, -302, 349, + -500, -557, -520, nil, -240, 22, 240, -22, -183, 178, + 63, 1343, 5, -207, -362, 1323, 987, -141, 928, -17, + 94, -19, 2075, -18, nil, nil, 4, -195, 33, -208, + -367, 639, -296, nil, 175, 127, 96, -129, nil, -32, + 41, -270, 425, 932, -287, 35, -51, -1, nil, nil, + 24, 40, -228, 158, 107, -50, 48, -218, 97, -23, + -306, -254, -403, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 92, 99, -55, nil, -176, -313, -631, -449, + -314, 86, nil, -204, 14, nil, -522, 80, 93, 91, + -255, 201, 210, 212, -410, 216, -407, -438, -761, -418, + -564, -216, -225, -413, -684, -749, -407, -581, -620, -461, + nil, -551, -490, -149, -127, -452, 192, -529, -470, nil, + -511, -678, -765, -759, -357, -478, -157, -476, -6, -608, + -607, -73, nil, -82, -78, -702, -455, -587, nil, nil, + 121, 121, 48, 118, 128, -239, -262, 136, 141, 142, + -329, -328, -314, -474, nil, 387, -545, -658, -536, -583, + nil, -661, -748, nil, nil, -421 ] + +racc_goto_default = [ + nil, nil, nil, 3, nil, 4, 342, 289, nil, 519, + nil, 814, nil, 286, 287, nil, nil, nil, 11, 12, + 18, 225, 318, nil, nil, 223, 224, nil, 279, 17, + nil, 436, 21, 22, 23, 24, nil, 641, nil, nil, + nil, 306, nil, 25, 407, 32, nil, nil, 34, 37, + 36, nil, 220, 221, 354, nil, 128, 415, 127, 130, + 77, 78, nil, 46, nil, 779, 408, nil, 409, 420, + 596, 482, 277, 263, 47, 48, 49, 50, 51, 52, + 53, 54, 55, nil, 264, 61, nil, nil, nil, nil, + nil, nil, 69, nil, 534, 70, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 804, 670, nil, 805, 904, + 751, 658, nil, 659, nil, nil, 660, nil, 662, 612, + nil, nil, nil, 668, nil, nil, nil, 712, nil, nil, + nil, nil, 419, nil, nil, nil, nil, nil, 76, 79, + 80, nil, nil, nil, nil, nil, 568, nil, nil, nil, + nil, nil, nil, 873, 657, nil, 661, 672, 674, 763, + 677, 678, 764, 681, 684, 281 ] + +racc_reduce_table = [ + 0, 0, :racc_error, + 1, 142, :_reduce_none, + 2, 143, :_reduce_2, + 0, 144, :_reduce_3, + 1, 144, :_reduce_4, + 3, 144, :_reduce_5, + 2, 144, :_reduce_6, + 1, 146, :_reduce_none, + 4, 146, :_reduce_8, + 4, 149, :_reduce_9, + 2, 150, :_reduce_10, + 0, 154, :_reduce_11, + 1, 154, :_reduce_12, + 3, 154, :_reduce_13, + 2, 154, :_reduce_14, + 1, 155, :_reduce_none, + 4, 155, :_reduce_16, + 0, 171, :_reduce_17, + 4, 148, :_reduce_18, + 3, 148, :_reduce_19, + 3, 148, :_reduce_20, + 3, 148, :_reduce_21, + 2, 148, :_reduce_22, + 3, 148, :_reduce_23, + 3, 148, :_reduce_24, + 3, 148, :_reduce_25, + 3, 148, :_reduce_26, + 3, 148, :_reduce_27, + 4, 148, :_reduce_28, + 1, 148, :_reduce_none, + 3, 148, :_reduce_30, + 3, 148, :_reduce_31, + 6, 148, :_reduce_32, + 5, 148, :_reduce_33, + 5, 148, :_reduce_34, + 5, 148, :_reduce_35, + 5, 148, :_reduce_36, + 3, 148, :_reduce_37, + 3, 148, :_reduce_38, + 3, 148, :_reduce_39, + 3, 148, :_reduce_40, + 1, 148, :_reduce_none, + 3, 159, :_reduce_42, + 3, 159, :_reduce_43, + 1, 170, :_reduce_none, + 3, 170, :_reduce_45, + 3, 170, :_reduce_46, + 3, 170, :_reduce_47, + 2, 170, :_reduce_48, + 1, 170, :_reduce_none, + 1, 158, :_reduce_none, + 1, 161, :_reduce_none, + 1, 161, :_reduce_none, + 1, 175, :_reduce_none, + 4, 175, :_reduce_54, + 0, 183, :_reduce_55, + 5, 180, :_reduce_56, + 1, 182, :_reduce_none, + 2, 174, :_reduce_58, + 3, 174, :_reduce_59, + 4, 174, :_reduce_60, + 5, 174, :_reduce_61, + 4, 174, :_reduce_62, + 5, 174, :_reduce_63, + 2, 174, :_reduce_64, + 2, 174, :_reduce_65, + 2, 174, :_reduce_66, + 2, 174, :_reduce_67, + 2, 174, :_reduce_68, + 1, 160, :_reduce_69, + 3, 160, :_reduce_70, + 1, 187, :_reduce_71, + 3, 187, :_reduce_72, + 1, 186, :_reduce_none, + 2, 186, :_reduce_74, + 3, 186, :_reduce_75, + 5, 186, :_reduce_76, + 2, 186, :_reduce_77, + 4, 186, :_reduce_78, + 2, 186, :_reduce_79, + 4, 186, :_reduce_80, + 1, 186, :_reduce_81, + 3, 186, :_reduce_82, + 1, 190, :_reduce_none, + 3, 190, :_reduce_84, + 2, 189, :_reduce_85, + 3, 189, :_reduce_86, + 1, 192, :_reduce_87, + 3, 192, :_reduce_88, + 1, 191, :_reduce_89, + 1, 191, :_reduce_90, + 4, 191, :_reduce_91, + 3, 191, :_reduce_92, + 3, 191, :_reduce_93, + 3, 191, :_reduce_94, + 3, 191, :_reduce_95, + 2, 191, :_reduce_96, + 1, 191, :_reduce_97, + 1, 167, :_reduce_98, + 1, 167, :_reduce_99, + 4, 167, :_reduce_100, + 3, 167, :_reduce_101, + 3, 167, :_reduce_102, + 3, 167, :_reduce_103, + 3, 167, :_reduce_104, + 2, 167, :_reduce_105, + 1, 167, :_reduce_106, + 1, 195, :_reduce_107, + 1, 195, :_reduce_none, + 2, 196, :_reduce_109, + 1, 196, :_reduce_110, + 3, 196, :_reduce_111, + 1, 197, :_reduce_none, + 1, 197, :_reduce_none, + 1, 197, :_reduce_none, + 1, 197, :_reduce_none, + 1, 197, :_reduce_none, + 1, 200, :_reduce_117, + 1, 200, :_reduce_none, + 1, 156, :_reduce_none, + 1, 156, :_reduce_none, + 1, 157, :_reduce_121, + 0, 203, :_reduce_122, + 4, 157, :_reduce_123, + 1, 198, :_reduce_none, + 1, 198, :_reduce_none, + 1, 198, :_reduce_none, + 1, 198, :_reduce_none, + 1, 198, :_reduce_none, + 1, 198, :_reduce_none, + 1, 198, :_reduce_none, + 1, 198, :_reduce_none, + 1, 198, :_reduce_none, + 1, 198, :_reduce_none, + 1, 198, :_reduce_none, + 1, 198, :_reduce_none, + 1, 198, :_reduce_none, + 1, 198, :_reduce_none, + 1, 198, :_reduce_none, + 1, 198, :_reduce_none, + 1, 198, :_reduce_none, + 1, 198, :_reduce_none, + 1, 198, :_reduce_none, + 1, 198, :_reduce_none, + 1, 198, :_reduce_none, + 1, 198, :_reduce_none, + 1, 198, :_reduce_none, + 1, 198, :_reduce_none, + 1, 198, :_reduce_none, + 1, 198, :_reduce_none, + 1, 198, :_reduce_none, + 1, 198, :_reduce_none, + 1, 198, :_reduce_none, + 1, 198, :_reduce_none, + 1, 199, :_reduce_none, + 1, 199, :_reduce_none, + 1, 199, :_reduce_none, + 1, 199, :_reduce_none, + 1, 199, :_reduce_none, + 1, 199, :_reduce_none, + 1, 199, :_reduce_none, + 1, 199, :_reduce_none, + 1, 199, :_reduce_none, + 1, 199, :_reduce_none, + 1, 199, :_reduce_none, + 1, 199, :_reduce_none, + 1, 199, :_reduce_none, + 1, 199, :_reduce_none, + 1, 199, :_reduce_none, + 1, 199, :_reduce_none, + 1, 199, :_reduce_none, + 1, 199, :_reduce_none, + 1, 199, :_reduce_none, + 1, 199, :_reduce_none, + 1, 199, :_reduce_none, + 1, 199, :_reduce_none, + 1, 199, :_reduce_none, + 1, 199, :_reduce_none, + 1, 199, :_reduce_none, + 1, 199, :_reduce_none, + 1, 199, :_reduce_none, + 1, 199, :_reduce_none, + 1, 199, :_reduce_none, + 1, 199, :_reduce_none, + 1, 199, :_reduce_none, + 1, 199, :_reduce_none, + 1, 199, :_reduce_none, + 1, 199, :_reduce_none, + 1, 199, :_reduce_none, + 1, 199, :_reduce_none, + 1, 199, :_reduce_none, + 1, 199, :_reduce_none, + 1, 199, :_reduce_none, + 1, 199, :_reduce_none, + 1, 199, :_reduce_none, + 3, 173, :_reduce_195, + 5, 173, :_reduce_196, + 3, 173, :_reduce_197, + 5, 173, :_reduce_198, + 6, 173, :_reduce_199, + 5, 173, :_reduce_200, + 5, 173, :_reduce_201, + 5, 173, :_reduce_202, + 5, 173, :_reduce_203, + 4, 173, :_reduce_204, + 3, 173, :_reduce_205, + 3, 173, :_reduce_206, + 3, 173, :_reduce_207, + 3, 173, :_reduce_208, + 3, 173, :_reduce_209, + 3, 173, :_reduce_210, + 3, 173, :_reduce_211, + 3, 173, :_reduce_212, + 3, 173, :_reduce_213, + 4, 173, :_reduce_214, + 4, 173, :_reduce_215, + 2, 173, :_reduce_216, + 2, 173, :_reduce_217, + 3, 173, :_reduce_218, + 3, 173, :_reduce_219, + 3, 173, :_reduce_220, + 3, 173, :_reduce_221, + 3, 173, :_reduce_222, + 3, 173, :_reduce_223, + 3, 173, :_reduce_224, + 3, 173, :_reduce_225, + 3, 173, :_reduce_226, + 3, 173, :_reduce_227, + 3, 173, :_reduce_228, + 3, 173, :_reduce_229, + 3, 173, :_reduce_230, + 2, 173, :_reduce_231, + 2, 173, :_reduce_232, + 3, 173, :_reduce_233, + 3, 173, :_reduce_234, + 3, 173, :_reduce_235, + 3, 173, :_reduce_236, + 3, 173, :_reduce_237, + 6, 173, :_reduce_238, + 1, 173, :_reduce_none, + 1, 169, :_reduce_none, + 1, 205, :_reduce_none, + 2, 205, :_reduce_none, + 4, 205, :_reduce_243, + 2, 205, :_reduce_244, + 3, 210, :_reduce_245, + 0, 211, :_reduce_246, + 1, 211, :_reduce_none, + 0, 164, :_reduce_248, + 1, 164, :_reduce_none, + 2, 164, :_reduce_none, + 4, 164, :_reduce_251, + 2, 164, :_reduce_252, + 1, 185, :_reduce_253, + 2, 185, :_reduce_254, + 2, 185, :_reduce_255, + 4, 185, :_reduce_256, + 1, 185, :_reduce_257, + 0, 214, :_reduce_258, + 2, 179, :_reduce_259, + 2, 213, :_reduce_260, + 2, 212, :_reduce_261, + 0, 212, :_reduce_262, + 1, 207, :_reduce_263, + 2, 207, :_reduce_264, + 3, 207, :_reduce_265, + 4, 207, :_reduce_266, + 3, 168, :_reduce_267, + 4, 168, :_reduce_268, + 2, 168, :_reduce_269, + 1, 204, :_reduce_none, + 1, 204, :_reduce_none, + 1, 204, :_reduce_none, + 1, 204, :_reduce_none, + 1, 204, :_reduce_none, + 1, 204, :_reduce_none, + 1, 204, :_reduce_none, + 1, 204, :_reduce_none, + 1, 204, :_reduce_none, + 1, 204, :_reduce_none, + 1, 204, :_reduce_280, + 0, 239, :_reduce_281, + 4, 204, :_reduce_282, + 0, 240, :_reduce_283, + 0, 241, :_reduce_284, + 6, 204, :_reduce_285, + 0, 242, :_reduce_286, + 4, 204, :_reduce_287, + 3, 204, :_reduce_288, + 3, 204, :_reduce_289, + 2, 204, :_reduce_290, + 3, 204, :_reduce_291, + 3, 204, :_reduce_292, + 1, 204, :_reduce_293, + 4, 204, :_reduce_294, + 3, 204, :_reduce_295, + 1, 204, :_reduce_296, + 5, 204, :_reduce_297, + 4, 204, :_reduce_298, + 3, 204, :_reduce_299, + 2, 204, :_reduce_300, + 1, 204, :_reduce_none, + 2, 204, :_reduce_302, + 0, 243, :_reduce_303, + 3, 204, :_reduce_304, + 6, 204, :_reduce_305, + 6, 204, :_reduce_306, + 0, 244, :_reduce_307, + 0, 245, :_reduce_308, + 7, 204, :_reduce_309, + 0, 246, :_reduce_310, + 0, 247, :_reduce_311, + 7, 204, :_reduce_312, + 5, 204, :_reduce_313, + 4, 204, :_reduce_314, + 0, 248, :_reduce_315, + 0, 249, :_reduce_316, + 9, 204, :_reduce_317, + 0, 250, :_reduce_318, + 6, 204, :_reduce_319, + 0, 251, :_reduce_320, + 7, 204, :_reduce_321, + 0, 252, :_reduce_322, + 5, 204, :_reduce_323, + 0, 253, :_reduce_324, + 6, 204, :_reduce_325, + 0, 254, :_reduce_326, + 0, 255, :_reduce_327, + 9, 204, :_reduce_328, + 1, 204, :_reduce_329, + 1, 204, :_reduce_330, + 1, 204, :_reduce_331, + 1, 204, :_reduce_332, + 1, 163, :_reduce_none, + 1, 233, :_reduce_334, + 1, 236, :_reduce_335, + 1, 228, :_reduce_none, + 1, 228, :_reduce_none, + 2, 228, :_reduce_338, + 1, 230, :_reduce_none, + 1, 230, :_reduce_none, + 1, 229, :_reduce_none, + 5, 229, :_reduce_342, + 1, 152, :_reduce_none, + 2, 152, :_reduce_344, + 1, 232, :_reduce_none, + 1, 232, :_reduce_none, + 1, 256, :_reduce_347, + 3, 256, :_reduce_348, + 1, 259, :_reduce_349, + 3, 259, :_reduce_350, + 1, 258, :_reduce_none, + 4, 258, :_reduce_352, + 6, 258, :_reduce_353, + 3, 258, :_reduce_354, + 5, 258, :_reduce_355, + 2, 258, :_reduce_356, + 4, 258, :_reduce_357, + 1, 258, :_reduce_358, + 3, 258, :_reduce_359, + 4, 260, :_reduce_360, + 2, 260, :_reduce_361, + 2, 260, :_reduce_362, + 1, 260, :_reduce_363, + 2, 265, :_reduce_364, + 0, 265, :_reduce_365, + 6, 266, :_reduce_366, + 8, 266, :_reduce_367, + 4, 266, :_reduce_368, + 6, 266, :_reduce_369, + 4, 266, :_reduce_370, + 2, 266, :_reduce_none, + 6, 266, :_reduce_372, + 2, 266, :_reduce_373, + 4, 266, :_reduce_374, + 6, 266, :_reduce_375, + 2, 266, :_reduce_376, + 4, 266, :_reduce_377, + 2, 266, :_reduce_378, + 4, 266, :_reduce_379, + 1, 266, :_reduce_none, + 0, 181, :_reduce_381, + 1, 181, :_reduce_382, + 3, 270, :_reduce_383, + 1, 270, :_reduce_384, + 4, 270, :_reduce_385, + 1, 271, :_reduce_386, + 4, 271, :_reduce_387, + 1, 272, :_reduce_388, + 3, 272, :_reduce_389, + 1, 273, :_reduce_390, + 1, 273, :_reduce_none, + 0, 277, :_reduce_392, + 3, 227, :_reduce_393, + 4, 275, :_reduce_394, + 1, 275, :_reduce_395, + 0, 280, :_reduce_396, + 4, 276, :_reduce_397, + 0, 281, :_reduce_398, + 4, 276, :_reduce_399, + 0, 282, :_reduce_400, + 5, 279, :_reduce_401, + 2, 176, :_reduce_402, + 4, 176, :_reduce_403, + 5, 176, :_reduce_404, + 5, 176, :_reduce_405, + 2, 226, :_reduce_406, + 4, 226, :_reduce_407, + 4, 226, :_reduce_408, + 3, 226, :_reduce_409, + 3, 226, :_reduce_410, + 3, 226, :_reduce_411, + 2, 226, :_reduce_412, + 1, 226, :_reduce_413, + 4, 226, :_reduce_414, + 0, 284, :_reduce_415, + 5, 225, :_reduce_416, + 0, 285, :_reduce_417, + 5, 225, :_reduce_418, + 5, 231, :_reduce_419, + 1, 286, :_reduce_420, + 1, 286, :_reduce_none, + 6, 151, :_reduce_422, + 0, 151, :_reduce_423, + 1, 287, :_reduce_424, + 1, 287, :_reduce_none, + 1, 287, :_reduce_none, + 2, 288, :_reduce_427, + 1, 288, :_reduce_none, + 2, 153, :_reduce_429, + 1, 153, :_reduce_none, + 1, 215, :_reduce_none, + 1, 215, :_reduce_none, + 1, 215, :_reduce_none, + 1, 216, :_reduce_434, + 1, 290, :_reduce_435, + 2, 290, :_reduce_436, + 3, 291, :_reduce_437, + 1, 291, :_reduce_438, + 1, 291, :_reduce_439, + 3, 217, :_reduce_440, + 4, 218, :_reduce_441, + 3, 219, :_reduce_442, + 0, 295, :_reduce_443, + 3, 295, :_reduce_444, + 1, 296, :_reduce_445, + 2, 296, :_reduce_446, + 3, 221, :_reduce_447, + 0, 298, :_reduce_448, + 3, 298, :_reduce_449, + 3, 220, :_reduce_450, + 3, 222, :_reduce_451, + 0, 299, :_reduce_452, + 3, 299, :_reduce_453, + 0, 300, :_reduce_454, + 3, 300, :_reduce_455, + 0, 292, :_reduce_456, + 2, 292, :_reduce_457, + 0, 293, :_reduce_458, + 2, 293, :_reduce_459, + 0, 294, :_reduce_460, + 2, 294, :_reduce_461, + 1, 297, :_reduce_462, + 2, 297, :_reduce_463, + 0, 302, :_reduce_464, + 4, 297, :_reduce_465, + 1, 301, :_reduce_466, + 1, 301, :_reduce_467, + 1, 301, :_reduce_468, + 1, 301, :_reduce_none, + 1, 201, :_reduce_470, + 3, 202, :_reduce_471, + 1, 289, :_reduce_472, + 1, 289, :_reduce_473, + 2, 289, :_reduce_474, + 2, 289, :_reduce_475, + 1, 193, :_reduce_476, + 1, 193, :_reduce_477, + 1, 193, :_reduce_478, + 1, 193, :_reduce_479, + 1, 193, :_reduce_480, + 1, 194, :_reduce_481, + 1, 194, :_reduce_482, + 1, 194, :_reduce_483, + 1, 194, :_reduce_484, + 1, 194, :_reduce_485, + 1, 194, :_reduce_486, + 1, 194, :_reduce_487, + 1, 223, :_reduce_488, + 1, 223, :_reduce_489, + 1, 162, :_reduce_490, + 1, 162, :_reduce_491, + 1, 166, :_reduce_492, + 1, 166, :_reduce_493, + 1, 234, :_reduce_494, + 0, 303, :_reduce_495, + 4, 234, :_reduce_496, + 2, 234, :_reduce_497, + 3, 237, :_reduce_498, + 2, 237, :_reduce_499, + 4, 304, :_reduce_500, + 2, 304, :_reduce_501, + 2, 304, :_reduce_502, + 1, 304, :_reduce_503, + 2, 306, :_reduce_504, + 0, 306, :_reduce_505, + 6, 278, :_reduce_506, + 8, 278, :_reduce_507, + 4, 278, :_reduce_508, + 6, 278, :_reduce_509, + 4, 278, :_reduce_510, + 6, 278, :_reduce_511, + 2, 278, :_reduce_512, + 4, 278, :_reduce_513, + 6, 278, :_reduce_514, + 2, 278, :_reduce_515, + 4, 278, :_reduce_516, + 2, 278, :_reduce_517, + 4, 278, :_reduce_518, + 1, 278, :_reduce_519, + 0, 278, :_reduce_520, + 1, 274, :_reduce_521, + 1, 274, :_reduce_522, + 1, 274, :_reduce_523, + 1, 274, :_reduce_524, + 1, 257, :_reduce_none, + 1, 257, :_reduce_none, + 1, 308, :_reduce_527, + 3, 308, :_reduce_528, + 1, 267, :_reduce_529, + 3, 267, :_reduce_530, + 2, 309, :_reduce_531, + 2, 310, :_reduce_532, + 1, 261, :_reduce_533, + 3, 261, :_reduce_534, + 1, 305, :_reduce_535, + 3, 305, :_reduce_536, + 1, 311, :_reduce_none, + 1, 311, :_reduce_none, + 2, 262, :_reduce_539, + 1, 262, :_reduce_540, + 3, 312, :_reduce_541, + 3, 313, :_reduce_542, + 1, 268, :_reduce_543, + 3, 268, :_reduce_544, + 1, 307, :_reduce_545, + 3, 307, :_reduce_546, + 1, 314, :_reduce_none, + 1, 314, :_reduce_none, + 2, 269, :_reduce_549, + 1, 269, :_reduce_550, + 1, 315, :_reduce_none, + 1, 315, :_reduce_none, + 2, 264, :_reduce_553, + 2, 263, :_reduce_554, + 0, 263, :_reduce_555, + 1, 238, :_reduce_none, + 3, 238, :_reduce_557, + 0, 224, :_reduce_558, + 2, 224, :_reduce_none, + 1, 209, :_reduce_560, + 3, 209, :_reduce_561, + 3, 316, :_reduce_562, + 2, 316, :_reduce_563, + 2, 316, :_reduce_564, + 1, 184, :_reduce_none, + 1, 184, :_reduce_none, + 1, 184, :_reduce_none, + 1, 178, :_reduce_none, + 1, 178, :_reduce_none, + 1, 178, :_reduce_none, + 1, 178, :_reduce_none, + 1, 283, :_reduce_none, + 1, 283, :_reduce_none, + 1, 283, :_reduce_none, + 1, 177, :_reduce_none, + 1, 177, :_reduce_none, + 0, 145, :_reduce_none, + 1, 145, :_reduce_none, + 0, 172, :_reduce_none, + 1, 172, :_reduce_none, + 2, 188, :_reduce_581, + 2, 165, :_reduce_582, + 0, 208, :_reduce_none, + 1, 208, :_reduce_none, + 1, 208, :_reduce_none, + 1, 235, :_reduce_586, + 1, 235, :_reduce_none, + 1, 147, :_reduce_none, + 2, 147, :_reduce_none, + 0, 206, :_reduce_590 ] + +racc_reduce_n = 591 + +racc_shift_n = 1019 + +racc_token_table = { + false => 0, + :error => 1, + :kCLASS => 2, + :kMODULE => 3, + :kDEF => 4, + :kUNDEF => 5, + :kBEGIN => 6, + :kRESCUE => 7, + :kENSURE => 8, + :kEND => 9, + :kIF => 10, + :kUNLESS => 11, + :kTHEN => 12, + :kELSIF => 13, + :kELSE => 14, + :kCASE => 15, + :kWHEN => 16, + :kWHILE => 17, + :kUNTIL => 18, + :kFOR => 19, + :kBREAK => 20, + :kNEXT => 21, + :kREDO => 22, + :kRETRY => 23, + :kIN => 24, + :kDO => 25, + :kDO_COND => 26, + :kDO_BLOCK => 27, + :kDO_LAMBDA => 28, + :kRETURN => 29, + :kYIELD => 30, + :kSUPER => 31, + :kSELF => 32, + :kNIL => 33, + :kTRUE => 34, + :kFALSE => 35, + :kAND => 36, + :kOR => 37, + :kNOT => 38, + :kIF_MOD => 39, + :kUNLESS_MOD => 40, + :kWHILE_MOD => 41, + :kUNTIL_MOD => 42, + :kRESCUE_MOD => 43, + :kALIAS => 44, + :kDEFINED => 45, + :klBEGIN => 46, + :klEND => 47, + :k__LINE__ => 48, + :k__FILE__ => 49, + :k__ENCODING__ => 50, + :tIDENTIFIER => 51, + :tFID => 52, + :tGVAR => 53, + :tIVAR => 54, + :tCONSTANT => 55, + :tLABEL => 56, + :tCVAR => 57, + :tNTH_REF => 58, + :tBACK_REF => 59, + :tSTRING_CONTENT => 60, + :tINTEGER => 61, + :tFLOAT => 62, + :tUPLUS => 63, + :tUMINUS => 64, + :tUNARY_NUM => 65, + :tPOW => 66, + :tCMP => 67, + :tEQ => 68, + :tEQQ => 69, + :tNEQ => 70, + :tGEQ => 71, + :tLEQ => 72, + :tANDOP => 73, + :tOROP => 74, + :tMATCH => 75, + :tNMATCH => 76, + :tDOT => 77, + :tDOT2 => 78, + :tDOT3 => 79, + :tAREF => 80, + :tASET => 81, + :tLSHFT => 82, + :tRSHFT => 83, + :tCOLON2 => 84, + :tCOLON3 => 85, + :tOP_ASGN => 86, + :tASSOC => 87, + :tLPAREN => 88, + :tLPAREN2 => 89, + :tRPAREN => 90, + :tLPAREN_ARG => 91, + :tLBRACK => 92, + :tLBRACK2 => 93, + :tRBRACK => 94, + :tLBRACE => 95, + :tLBRACE_ARG => 96, + :tSTAR => 97, + :tSTAR2 => 98, + :tAMPER => 99, + :tAMPER2 => 100, + :tTILDE => 101, + :tPERCENT => 102, + :tDIVIDE => 103, + :tDSTAR => 104, + :tPLUS => 105, + :tMINUS => 106, + :tLT => 107, + :tGT => 108, + :tPIPE => 109, + :tBANG => 110, + :tCARET => 111, + :tLCURLY => 112, + :tRCURLY => 113, + :tBACK_REF2 => 114, + :tSYMBEG => 115, + :tSTRING_BEG => 116, + :tXSTRING_BEG => 117, + :tREGEXP_BEG => 118, + :tREGEXP_OPT => 119, + :tWORDS_BEG => 120, + :tQWORDS_BEG => 121, + :tSYMBOLS_BEG => 122, + :tQSYMBOLS_BEG => 123, + :tSTRING_DBEG => 124, + :tSTRING_DVAR => 125, + :tSTRING_END => 126, + :tSTRING_DEND => 127, + :tSTRING => 128, + :tSYMBOL => 129, + :tNL => 130, + :tEH => 131, + :tCOLON => 132, + :tCOMMA => 133, + :tSPACE => 134, + :tSEMI => 135, + :tLAMBDA => 136, + :tLAMBEG => 137, + :tCHARACTER => 138, + :tEQL => 139, + :tLOWEST => 140 } + +racc_nt_base = 141 + +racc_use_result_var = true + +Racc_arg = [ + racc_action_table, + racc_action_check, + racc_action_default, + racc_action_pointer, + racc_goto_table, + racc_goto_check, + racc_goto_default, + racc_goto_pointer, + racc_nt_base, + racc_reduce_table, + racc_token_table, + racc_shift_n, + racc_reduce_n, + racc_use_result_var ] + +Racc_token_to_s_table = [ + "$end", + "error", + "kCLASS", + "kMODULE", + "kDEF", + "kUNDEF", + "kBEGIN", + "kRESCUE", + "kENSURE", + "kEND", + "kIF", + "kUNLESS", + "kTHEN", + "kELSIF", + "kELSE", + "kCASE", + "kWHEN", + "kWHILE", + "kUNTIL", + "kFOR", + "kBREAK", + "kNEXT", + "kREDO", + "kRETRY", + "kIN", + "kDO", + "kDO_COND", + "kDO_BLOCK", + "kDO_LAMBDA", + "kRETURN", + "kYIELD", + "kSUPER", + "kSELF", + "kNIL", + "kTRUE", + "kFALSE", + "kAND", + "kOR", + "kNOT", + "kIF_MOD", + "kUNLESS_MOD", + "kWHILE_MOD", + "kUNTIL_MOD", + "kRESCUE_MOD", + "kALIAS", + "kDEFINED", + "klBEGIN", + "klEND", + "k__LINE__", + "k__FILE__", + "k__ENCODING__", + "tIDENTIFIER", + "tFID", + "tGVAR", + "tIVAR", + "tCONSTANT", + "tLABEL", + "tCVAR", + "tNTH_REF", + "tBACK_REF", + "tSTRING_CONTENT", + "tINTEGER", + "tFLOAT", + "tUPLUS", + "tUMINUS", + "tUNARY_NUM", + "tPOW", + "tCMP", + "tEQ", + "tEQQ", + "tNEQ", + "tGEQ", + "tLEQ", + "tANDOP", + "tOROP", + "tMATCH", + "tNMATCH", + "tDOT", + "tDOT2", + "tDOT3", + "tAREF", + "tASET", + "tLSHFT", + "tRSHFT", + "tCOLON2", + "tCOLON3", + "tOP_ASGN", + "tASSOC", + "tLPAREN", + "tLPAREN2", + "tRPAREN", + "tLPAREN_ARG", + "tLBRACK", + "tLBRACK2", + "tRBRACK", + "tLBRACE", + "tLBRACE_ARG", + "tSTAR", + "tSTAR2", + "tAMPER", + "tAMPER2", + "tTILDE", + "tPERCENT", + "tDIVIDE", + "tDSTAR", + "tPLUS", + "tMINUS", + "tLT", + "tGT", + "tPIPE", + "tBANG", + "tCARET", + "tLCURLY", + "tRCURLY", + "tBACK_REF2", + "tSYMBEG", + "tSTRING_BEG", + "tXSTRING_BEG", + "tREGEXP_BEG", + "tREGEXP_OPT", + "tWORDS_BEG", + "tQWORDS_BEG", + "tSYMBOLS_BEG", + "tQSYMBOLS_BEG", + "tSTRING_DBEG", + "tSTRING_DVAR", + "tSTRING_END", + "tSTRING_DEND", + "tSTRING", + "tSYMBOL", + "tNL", + "tEH", + "tCOLON", + "tCOMMA", + "tSPACE", + "tSEMI", + "tLAMBDA", + "tLAMBEG", + "tCHARACTER", + "tEQL", + "tLOWEST", + "$start", + "program", + "top_compstmt", + "top_stmts", + "opt_terms", + "top_stmt", + "terms", + "stmt", + "bodystmt", + "compstmt", + "opt_rescue", + "opt_else", + "opt_ensure", + "stmts", + "stmt_or_begin", + "fitem", + "undef_list", + "expr_value", + "command_asgn", + "mlhs", + "command_call", + "var_lhs", + "primary_value", + "opt_call_args", + "rbracket", + "backref", + "lhs", + "mrhs", + "arg_value", + "expr", + "@1", + "opt_nl", + "arg", + "command", + "block_command", + "block_call", + "dot_or_colon", + "operation2", + "command_args", + "cmd_brace_block", + "opt_block_param", + "fcall", + "@2", + "operation", + "call_args", + "mlhs_basic", + "mlhs_inner", + "rparen", + "mlhs_head", + "mlhs_item", + "mlhs_node", + "mlhs_post", + "user_variable", + "keyword_variable", + "cname", + "cpath", + "fname", + "op", + "reswords", + "fsym", + "symbol", + "dsym", + "@3", + "primary", + "aref_args", + "none", + "args", + "trailer", + "assocs", + "paren_args", + "opt_paren_args", + "opt_block_arg", + "block_arg", + "@4", + "literal", + "strings", + "xstring", + "regexp", + "words", + "qwords", + "symbols", + "qsymbols", + "var_ref", + "assoc_list", + "brace_block", + "method_call", + "lambda", + "then", + "if_tail", + "do", + "case_body", + "for_var", + "k_class", + "superclass", + "term", + "k_module", + "f_arglist", + "singleton", + "@5", + "@6", + "@7", + "@8", + "@9", + "@10", + "@11", + "@12", + "@13", + "@14", + "@15", + "@16", + "@17", + "@18", + "@19", + "@20", + "@21", + "f_marg", + "f_norm_arg", + "f_margs", + "f_marg_list", + "block_args_tail", + "f_block_kwarg", + "f_kwrest", + "opt_f_block_arg", + "f_block_arg", + "opt_block_args_tail", + "block_param", + "f_arg", + "f_block_optarg", + "f_rest_arg", + "block_param_def", + "opt_bv_decl", + "bv_decls", + "bvar", + "f_bad_arg", + "f_larglist", + "lambda_body", + "@22", + "f_args", + "do_block", + "@23", + "@24", + "@25", + "operation3", + "@26", + "@27", + "cases", + "exc_list", + "exc_var", + "numeric", + "string", + "string1", + "string_contents", + "xstring_contents", + "regexp_contents", + "word_list", + "word", + "string_content", + "symbol_list", + "qword_list", + "qsym_list", + "string_dvar", + "@28", + "@29", + "args_tail", + "f_kwarg", + "opt_args_tail", + "f_optarg", + "f_arg_item", + "f_kw", + "f_block_kw", + "kwrest_mark", + "f_opt", + "f_block_opt", + "restarg_mark", + "blkarg_mark", + "assoc" ] + +Racc_debug_parser = false + +##### State transition tables end ##### + +# reduce 0 omitted + +# reduce 1 omitted + +def _reduce_2(val, _values, result) + result = @builder.compstmt(val[0]) + + result +end + +def _reduce_3(val, _values, result) + result = [] + + result +end + +def _reduce_4(val, _values, result) + result = [ val[0] ] + + result +end + +def _reduce_5(val, _values, result) + result = val[0] << val[2] + + result +end + +def _reduce_6(val, _values, result) + result = [ val[1] ] + + result +end + +# reduce 7 omitted + +def _reduce_8(val, _values, result) + result = @builder.preexe(val[0], val[1], val[2], val[3]) + + result +end + +def _reduce_9(val, _values, result) + rescue_bodies = val[1] + else_t, else_ = val[2] + ensure_t, ensure_ = val[3] + + if rescue_bodies.empty? && !else_t.nil? + diagnostic :warning, :useless_else, nil, else_t + end + + result = @builder.begin_body(val[0], + rescue_bodies, + else_t, else_, + ensure_t, ensure_) + + result +end + +def _reduce_10(val, _values, result) + result = @builder.compstmt(val[0]) + + result +end + +def _reduce_11(val, _values, result) + result = [] + + result +end + +def _reduce_12(val, _values, result) + result = [ val[0] ] + + result +end + +def _reduce_13(val, _values, result) + result = val[0] << val[2] + + result +end + +def _reduce_14(val, _values, result) + result = [ val[1] ] + + result +end + +# reduce 15 omitted + +def _reduce_16(val, _values, result) + if @context.in_def + diagnostic :error, :begin_in_method, nil, val[0] + end + + result = @builder.preexe(val[0], val[1], val[2], val[3]) + + result +end + +def _reduce_17(val, _values, result) + @lexer.state = :expr_fname + + result +end + +def _reduce_18(val, _values, result) + result = @builder.alias(val[0], val[1], val[3]) + + result +end + +def _reduce_19(val, _values, result) + result = @builder.alias(val[0], + @builder.gvar(val[1]), + @builder.gvar(val[2])) + + result +end + +def _reduce_20(val, _values, result) + result = @builder.alias(val[0], + @builder.gvar(val[1]), + @builder.back_ref(val[2])) + + result +end + +def _reduce_21(val, _values, result) + diagnostic :error, :nth_ref_alias, nil, val[2] + + result +end + +def _reduce_22(val, _values, result) + result = @builder.undef_method(val[0], val[1]) + + result +end + +def _reduce_23(val, _values, result) + result = @builder.condition_mod(val[0], nil, + val[1], val[2]) + + result +end + +def _reduce_24(val, _values, result) + result = @builder.condition_mod(nil, val[0], + val[1], val[2]) + + result +end + +def _reduce_25(val, _values, result) + result = @builder.loop_mod(:while, val[0], val[1], val[2]) + + result +end + +def _reduce_26(val, _values, result) + result = @builder.loop_mod(:until, val[0], val[1], val[2]) + + result +end + +def _reduce_27(val, _values, result) + rescue_body = @builder.rescue_body(val[1], + nil, nil, nil, + nil, val[2]) + + result = @builder.begin_body(val[0], [ rescue_body ]) + + result +end + +def _reduce_28(val, _values, result) + result = @builder.postexe(val[0], val[1], val[2], val[3]) + + result +end + +# reduce 29 omitted + +def _reduce_30(val, _values, result) + result = @builder.multi_assign(val[0], val[1], val[2]) + + result +end + +def _reduce_31(val, _values, result) + result = @builder.op_assign(val[0], val[1], val[2]) + + result +end + +def _reduce_32(val, _values, result) + result = @builder.op_assign( + @builder.index( + val[0], val[1], val[2], val[3]), + val[4], val[5]) + + result +end + +def _reduce_33(val, _values, result) + result = @builder.op_assign( + @builder.call_method( + val[0], val[1], val[2]), + val[3], val[4]) + + result +end + +def _reduce_34(val, _values, result) + result = @builder.op_assign( + @builder.call_method( + val[0], val[1], val[2]), + val[3], val[4]) + + result +end + +def _reduce_35(val, _values, result) + const = @builder.const_op_assignable( + @builder.const_fetch(val[0], val[1], val[2])) + result = @builder.op_assign(const, val[3], val[4]) + + result +end + +def _reduce_36(val, _values, result) + result = @builder.op_assign( + @builder.call_method( + val[0], val[1], val[2]), + val[3], val[4]) + + result +end + +def _reduce_37(val, _values, result) + @builder.op_assign(val[0], val[1], val[2]) + + result +end + +def _reduce_38(val, _values, result) + result = @builder.assign(val[0], val[1], + @builder.array(nil, val[2], nil)) + + result +end + +def _reduce_39(val, _values, result) + result = @builder.multi_assign(val[0], val[1], val[2]) + + result +end + +def _reduce_40(val, _values, result) + result = @builder.multi_assign(val[0], val[1], + @builder.array(nil, val[2], nil)) + + result +end + +# reduce 41 omitted + +def _reduce_42(val, _values, result) + result = @builder.assign(val[0], val[1], val[2]) + + result +end + +def _reduce_43(val, _values, result) + result = @builder.assign(val[0], val[1], val[2]) + + result +end + +# reduce 44 omitted + +def _reduce_45(val, _values, result) + result = @builder.logical_op(:and, val[0], val[1], val[2]) + + result +end + +def _reduce_46(val, _values, result) + result = @builder.logical_op(:or, val[0], val[1], val[2]) + + result +end + +def _reduce_47(val, _values, result) + result = @builder.not_op(val[0], nil, val[2], nil) + + result +end + +def _reduce_48(val, _values, result) + result = @builder.not_op(val[0], nil, val[1], nil) + + result +end + +# reduce 49 omitted + +# reduce 50 omitted + +# reduce 51 omitted + +# reduce 52 omitted + +# reduce 53 omitted + +def _reduce_54(val, _values, result) + result = @builder.call_method(val[0], val[1], val[2], + nil, val[3], nil) + + result +end + +def _reduce_55(val, _values, result) + @static_env.extend_dynamic + result = @context.dup + @context.in_block = true + + result +end + +def _reduce_56(val, _values, result) + result = [ val[0], val[2], val[3], val[4] ] + + @static_env.unextend + @context.in_block = val[1].in_block + + result +end + +# reduce 57 omitted + +def _reduce_58(val, _values, result) + result = @builder.call_method(nil, nil, val[0], + nil, val[1], nil) + + result +end + +def _reduce_59(val, _values, result) + method_call = @builder.call_method(nil, nil, val[0], + nil, val[1], nil) + + begin_t, args, body, end_t = val[2] + result = @builder.block(method_call, + begin_t, args, body, end_t) + + result +end + +def _reduce_60(val, _values, result) + result = @builder.call_method(val[0], val[1], val[2], + nil, val[3], nil) + + result +end + +def _reduce_61(val, _values, result) + method_call = @builder.call_method(val[0], val[1], val[2], + nil, val[3], nil) + + begin_t, args, body, end_t = val[4] + result = @builder.block(method_call, + begin_t, args, body, end_t) + + result +end + +def _reduce_62(val, _values, result) + result = @builder.call_method(val[0], val[1], val[2], + nil, val[3], nil) + + result +end + +def _reduce_63(val, _values, result) + method_call = @builder.call_method(val[0], val[1], val[2], + nil, val[3], nil) + + begin_t, args, body, end_t = val[4] + result = @builder.block(method_call, + begin_t, args, body, end_t) + + result +end + +def _reduce_64(val, _values, result) + result = @builder.keyword_cmd(:super, val[0], + nil, val[1], nil) + + result +end + +def _reduce_65(val, _values, result) + result = @builder.keyword_cmd(:yield, val[0], + nil, val[1], nil) + + result +end + +def _reduce_66(val, _values, result) + result = @builder.keyword_cmd(:return, val[0], + nil, val[1], nil) + + result +end + +def _reduce_67(val, _values, result) + result = @builder.keyword_cmd(:break, val[0], + nil, val[1], nil) + + result +end + +def _reduce_68(val, _values, result) + result = @builder.keyword_cmd(:next, val[0], + nil, val[1], nil) + + result +end + +def _reduce_69(val, _values, result) + result = @builder.multi_lhs(nil, val[0], nil) + + result +end + +def _reduce_70(val, _values, result) + result = @builder.begin(val[0], val[1], val[2]) + + result +end + +def _reduce_71(val, _values, result) + result = @builder.multi_lhs(nil, val[0], nil) + + result +end + +def _reduce_72(val, _values, result) + result = @builder.multi_lhs(val[0], val[1], val[2]) + + result +end + +# reduce 73 omitted + +def _reduce_74(val, _values, result) + result = val[0]. + push(val[1]) + + result +end + +def _reduce_75(val, _values, result) + result = val[0]. + push(@builder.splat(val[1], val[2])) + + result +end + +def _reduce_76(val, _values, result) + result = val[0]. + push(@builder.splat(val[1], val[2])). + concat(val[4]) + + result +end + +def _reduce_77(val, _values, result) + result = val[0]. + push(@builder.splat(val[1])) + + result +end + +def _reduce_78(val, _values, result) + result = val[0]. + push(@builder.splat(val[1])). + concat(val[3]) + + result +end + +def _reduce_79(val, _values, result) + result = [ @builder.splat(val[0], val[1]) ] + + result +end + +def _reduce_80(val, _values, result) + result = [ @builder.splat(val[0], val[1]), + *val[3] ] + + result +end + +def _reduce_81(val, _values, result) + result = [ @builder.splat(val[0]) ] + + result +end + +def _reduce_82(val, _values, result) + result = [ @builder.splat(val[0]), + *val[2] ] + + result +end + +# reduce 83 omitted + +def _reduce_84(val, _values, result) + result = @builder.begin(val[0], val[1], val[2]) + + result +end + +def _reduce_85(val, _values, result) + result = [ val[0] ] + + result +end + +def _reduce_86(val, _values, result) + result = val[0] << val[1] + + result +end + +def _reduce_87(val, _values, result) + result = [ val[0] ] + + result +end + +def _reduce_88(val, _values, result) + result = val[0] << val[2] + + result +end + +def _reduce_89(val, _values, result) + result = @builder.assignable(val[0]) + + result +end + +def _reduce_90(val, _values, result) + result = @builder.assignable(val[0]) + + result +end + +def _reduce_91(val, _values, result) + result = @builder.index_asgn(val[0], val[1], val[2], val[3]) + + result +end + +def _reduce_92(val, _values, result) + result = @builder.attr_asgn(val[0], val[1], val[2]) + + result +end + +def _reduce_93(val, _values, result) + result = @builder.attr_asgn(val[0], val[1], val[2]) + + result +end + +def _reduce_94(val, _values, result) + result = @builder.attr_asgn(val[0], val[1], val[2]) + + result +end + +def _reduce_95(val, _values, result) + result = @builder.assignable( + @builder.const_fetch(val[0], val[1], val[2])) + + result +end + +def _reduce_96(val, _values, result) + result = @builder.assignable( + @builder.const_global(val[0], val[1])) + + result +end + +def _reduce_97(val, _values, result) + result = @builder.assignable(val[0]) + + result +end + +def _reduce_98(val, _values, result) + result = @builder.assignable(val[0]) + + result +end + +def _reduce_99(val, _values, result) + result = @builder.assignable(val[0]) + + result +end + +def _reduce_100(val, _values, result) + result = @builder.index_asgn(val[0], val[1], val[2], val[3]) + + result +end + +def _reduce_101(val, _values, result) + result = @builder.attr_asgn(val[0], val[1], val[2]) + + result +end + +def _reduce_102(val, _values, result) + result = @builder.attr_asgn(val[0], val[1], val[2]) + + result +end + +def _reduce_103(val, _values, result) + result = @builder.attr_asgn(val[0], val[1], val[2]) + + result +end + +def _reduce_104(val, _values, result) + result = @builder.assignable( + @builder.const_fetch(val[0], val[1], val[2])) + + result +end + +def _reduce_105(val, _values, result) + result = @builder.assignable( + @builder.const_global(val[0], val[1])) + + result +end + +def _reduce_106(val, _values, result) + result = @builder.assignable(val[0]) + + result +end + +def _reduce_107(val, _values, result) + diagnostic :error, :module_name_const, nil, val[0] + + result +end + +# reduce 108 omitted + +def _reduce_109(val, _values, result) + result = @builder.const_global(val[0], val[1]) + + result +end + +def _reduce_110(val, _values, result) + result = @builder.const(val[0]) + + result +end + +def _reduce_111(val, _values, result) + result = @builder.const_fetch(val[0], val[1], val[2]) + + result +end + +# reduce 112 omitted + +# reduce 113 omitted + +# reduce 114 omitted + +# reduce 115 omitted + +# reduce 116 omitted + +def _reduce_117(val, _values, result) + result = @builder.symbol_internal(val[0]) + + result +end + +# reduce 118 omitted + +# reduce 119 omitted + +# reduce 120 omitted + +def _reduce_121(val, _values, result) + result = [ val[0] ] + + result +end + +def _reduce_122(val, _values, result) + @lexer.state = :expr_fname + + result +end + +def _reduce_123(val, _values, result) + result = val[0] << val[3] + + result +end + +# reduce 124 omitted + +# reduce 125 omitted + +# reduce 126 omitted + +# reduce 127 omitted + +# reduce 128 omitted + +# reduce 129 omitted + +# reduce 130 omitted + +# reduce 131 omitted + +# reduce 132 omitted + +# reduce 133 omitted + +# reduce 134 omitted + +# reduce 135 omitted + +# reduce 136 omitted + +# reduce 137 omitted + +# reduce 138 omitted + +# reduce 139 omitted + +# reduce 140 omitted + +# reduce 141 omitted + +# reduce 142 omitted + +# reduce 143 omitted + +# reduce 144 omitted + +# reduce 145 omitted + +# reduce 146 omitted + +# reduce 147 omitted + +# reduce 148 omitted + +# reduce 149 omitted + +# reduce 150 omitted + +# reduce 151 omitted + +# reduce 152 omitted + +# reduce 153 omitted + +# reduce 154 omitted + +# reduce 155 omitted + +# reduce 156 omitted + +# reduce 157 omitted + +# reduce 158 omitted + +# reduce 159 omitted + +# reduce 160 omitted + +# reduce 161 omitted + +# reduce 162 omitted + +# reduce 163 omitted + +# reduce 164 omitted + +# reduce 165 omitted + +# reduce 166 omitted + +# reduce 167 omitted + +# reduce 168 omitted + +# reduce 169 omitted + +# reduce 170 omitted + +# reduce 171 omitted + +# reduce 172 omitted + +# reduce 173 omitted + +# reduce 174 omitted + +# reduce 175 omitted + +# reduce 176 omitted + +# reduce 177 omitted + +# reduce 178 omitted + +# reduce 179 omitted + +# reduce 180 omitted + +# reduce 181 omitted + +# reduce 182 omitted + +# reduce 183 omitted + +# reduce 184 omitted + +# reduce 185 omitted + +# reduce 186 omitted + +# reduce 187 omitted + +# reduce 188 omitted + +# reduce 189 omitted + +# reduce 190 omitted + +# reduce 191 omitted + +# reduce 192 omitted + +# reduce 193 omitted + +# reduce 194 omitted + +def _reduce_195(val, _values, result) + result = @builder.assign(val[0], val[1], val[2]) + + result +end + +def _reduce_196(val, _values, result) + rescue_body = @builder.rescue_body(val[3], + nil, nil, nil, + nil, val[4]) + + rescue_ = @builder.begin_body(val[2], [ rescue_body ]) + + result = @builder.assign(val[0], val[1], rescue_) + + result +end + +def _reduce_197(val, _values, result) + result = @builder.op_assign(val[0], val[1], val[2]) + + result +end + +def _reduce_198(val, _values, result) + rescue_body = @builder.rescue_body(val[3], + nil, nil, nil, + nil, val[4]) + + rescue_ = @builder.begin_body(val[2], [ rescue_body ]) + + result = @builder.op_assign(val[0], val[1], rescue_) + + result +end + +def _reduce_199(val, _values, result) + result = @builder.op_assign( + @builder.index( + val[0], val[1], val[2], val[3]), + val[4], val[5]) + + result +end + +def _reduce_200(val, _values, result) + result = @builder.op_assign( + @builder.call_method( + val[0], val[1], val[2]), + val[3], val[4]) + + result +end + +def _reduce_201(val, _values, result) + result = @builder.op_assign( + @builder.call_method( + val[0], val[1], val[2]), + val[3], val[4]) + + result +end + +def _reduce_202(val, _values, result) + result = @builder.op_assign( + @builder.call_method( + val[0], val[1], val[2]), + val[3], val[4]) + + result +end + +def _reduce_203(val, _values, result) + const = @builder.const_op_assignable( + @builder.const_fetch(val[0], val[1], val[2])) + result = @builder.op_assign(const, val[3], val[4]) + + result +end + +def _reduce_204(val, _values, result) + const = @builder.const_op_assignable( + @builder.const_global(val[0], val[1])) + result = @builder.op_assign(const, val[2], val[3]) + + result +end + +def _reduce_205(val, _values, result) + result = @builder.op_assign(val[0], val[1], val[2]) + + result +end + +def _reduce_206(val, _values, result) + result = @builder.range_inclusive(val[0], val[1], val[2]) + + result +end + +def _reduce_207(val, _values, result) + result = @builder.range_exclusive(val[0], val[1], val[2]) + + result +end + +def _reduce_208(val, _values, result) + result = @builder.binary_op(val[0], val[1], val[2]) + + result +end + +def _reduce_209(val, _values, result) + result = @builder.binary_op(val[0], val[1], val[2]) + + result +end + +def _reduce_210(val, _values, result) + result = @builder.binary_op(val[0], val[1], val[2]) + + result +end + +def _reduce_211(val, _values, result) + result = @builder.binary_op(val[0], val[1], val[2]) + + result +end + +def _reduce_212(val, _values, result) + result = @builder.binary_op(val[0], val[1], val[2]) + + result +end + +def _reduce_213(val, _values, result) + result = @builder.binary_op(val[0], val[1], val[2]) + + result +end + +def _reduce_214(val, _values, result) + result = @builder.unary_op(val[0], + @builder.binary_op( + @builder.integer(val[1]), + val[2], val[3])) + + result +end + +def _reduce_215(val, _values, result) + result = @builder.unary_op(val[0], + @builder.binary_op( + @builder.float(val[1]), + val[2], val[3])) + + result +end + +def _reduce_216(val, _values, result) + result = @builder.unary_op(val[0], val[1]) + + result +end + +def _reduce_217(val, _values, result) + result = @builder.unary_op(val[0], val[1]) + + result +end + +def _reduce_218(val, _values, result) + result = @builder.binary_op(val[0], val[1], val[2]) + + result +end + +def _reduce_219(val, _values, result) + result = @builder.binary_op(val[0], val[1], val[2]) + + result +end + +def _reduce_220(val, _values, result) + result = @builder.binary_op(val[0], val[1], val[2]) + + result +end + +def _reduce_221(val, _values, result) + result = @builder.binary_op(val[0], val[1], val[2]) + + result +end + +def _reduce_222(val, _values, result) + result = @builder.binary_op(val[0], val[1], val[2]) + + result +end + +def _reduce_223(val, _values, result) + result = @builder.binary_op(val[0], val[1], val[2]) + + result +end + +def _reduce_224(val, _values, result) + result = @builder.binary_op(val[0], val[1], val[2]) + + result +end + +def _reduce_225(val, _values, result) + result = @builder.binary_op(val[0], val[1], val[2]) + + result +end + +def _reduce_226(val, _values, result) + result = @builder.binary_op(val[0], val[1], val[2]) + + result +end + +def _reduce_227(val, _values, result) + result = @builder.binary_op(val[0], val[1], val[2]) + + result +end + +def _reduce_228(val, _values, result) + result = @builder.binary_op(val[0], val[1], val[2]) + + result +end + +def _reduce_229(val, _values, result) + result = @builder.match_op(val[0], val[1], val[2]) + + result +end + +def _reduce_230(val, _values, result) + result = @builder.binary_op(val[0], val[1], val[2]) + + result +end + +def _reduce_231(val, _values, result) + result = @builder.not_op(val[0], nil, val[1], nil) + + result +end + +def _reduce_232(val, _values, result) + result = @builder.unary_op(val[0], val[1]) + + result +end + +def _reduce_233(val, _values, result) + result = @builder.binary_op(val[0], val[1], val[2]) + + result +end + +def _reduce_234(val, _values, result) + result = @builder.binary_op(val[0], val[1], val[2]) + + result +end + +def _reduce_235(val, _values, result) + result = @builder.logical_op(:and, val[0], val[1], val[2]) + + result +end + +def _reduce_236(val, _values, result) + result = @builder.logical_op(:or, val[0], val[1], val[2]) + + result +end + +def _reduce_237(val, _values, result) + result = @builder.keyword_cmd(:defined?, val[0], nil, [ val[2] ], nil) + + result +end + +def _reduce_238(val, _values, result) + result = @builder.ternary(val[0], val[1], + val[2], val[4], val[5]) + + result +end + +# reduce 239 omitted + +# reduce 240 omitted + +# reduce 241 omitted + +# reduce 242 omitted + +def _reduce_243(val, _values, result) + result = val[0] << @builder.associate(nil, val[2], nil) + + result +end + +def _reduce_244(val, _values, result) + result = [ @builder.associate(nil, val[0], nil) ] + + result +end + +def _reduce_245(val, _values, result) + result = val + + result +end + +def _reduce_246(val, _values, result) + result = [ nil, [], nil ] + + result +end + +# reduce 247 omitted + +def _reduce_248(val, _values, result) + result = [] + + result +end + +# reduce 249 omitted + +# reduce 250 omitted + +def _reduce_251(val, _values, result) + result = val[0] << @builder.associate(nil, val[2], nil) + + result +end + +def _reduce_252(val, _values, result) + result = [ @builder.associate(nil, val[0], nil) ] + + result +end + +def _reduce_253(val, _values, result) + result = [ val[0] ] + + result +end + +def _reduce_254(val, _values, result) + result = val[0].concat(val[1]) + + result +end + +def _reduce_255(val, _values, result) + result = [ @builder.associate(nil, val[0], nil) ] + result.concat(val[1]) + + result +end + +def _reduce_256(val, _values, result) + assocs = @builder.associate(nil, val[2], nil) + result = val[0] << assocs + result.concat(val[3]) + + result +end + +def _reduce_257(val, _values, result) + result = [ val[0] ] + + result +end + +def _reduce_258(val, _values, result) + result = @lexer.cmdarg.dup + @lexer.cmdarg.push(true) + + result +end + +def _reduce_259(val, _values, result) + @lexer.cmdarg = val[0] + + result = val[1] + + result +end + +def _reduce_260(val, _values, result) + result = @builder.block_pass(val[0], val[1]) + + result +end + +def _reduce_261(val, _values, result) + result = [ val[1] ] + + result +end + +def _reduce_262(val, _values, result) + result = [] + + result +end + +def _reduce_263(val, _values, result) + result = [ val[0] ] + + result +end + +def _reduce_264(val, _values, result) + result = [ @builder.splat(val[0], val[1]) ] + + result +end + +def _reduce_265(val, _values, result) + result = val[0] << val[2] + + result +end + +def _reduce_266(val, _values, result) + result = val[0] << @builder.splat(val[2], val[3]) + + result +end + +def _reduce_267(val, _values, result) + result = val[0] << val[2] + + result +end + +def _reduce_268(val, _values, result) + result = val[0] << @builder.splat(val[2], val[3]) + + result +end + +def _reduce_269(val, _values, result) + result = [ @builder.splat(val[0], val[1]) ] + + result +end + +# reduce 270 omitted + +# reduce 271 omitted + +# reduce 272 omitted + +# reduce 273 omitted + +# reduce 274 omitted + +# reduce 275 omitted + +# reduce 276 omitted + +# reduce 277 omitted + +# reduce 278 omitted + +# reduce 279 omitted + +def _reduce_280(val, _values, result) + result = @builder.call_method(nil, nil, val[0]) + + result +end + +def _reduce_281(val, _values, result) + result = @lexer.cmdarg.dup + @lexer.cmdarg.clear + + result +end + +def _reduce_282(val, _values, result) + @lexer.cmdarg = val[1] + + result = @builder.begin_keyword(val[0], val[2], val[3]) + + result +end + +def _reduce_283(val, _values, result) + result = @lexer.cmdarg.dup + @lexer.cmdarg.clear + + result +end + +def _reduce_284(val, _values, result) + @lexer.state = :expr_endarg + + result +end + +def _reduce_285(val, _values, result) + @lexer.cmdarg = val[1] + + result = @builder.begin(val[0], val[2], val[5]) + + result +end + +def _reduce_286(val, _values, result) + @lexer.state = :expr_endarg + + result +end + +def _reduce_287(val, _values, result) + result = @builder.begin(val[0], nil, val[3]) + + result +end + +def _reduce_288(val, _values, result) + result = @builder.begin(val[0], val[1], val[2]) + + result +end + +def _reduce_289(val, _values, result) + result = @builder.const_fetch(val[0], val[1], val[2]) + + result +end + +def _reduce_290(val, _values, result) + result = @builder.const_global(val[0], val[1]) + + result +end + +def _reduce_291(val, _values, result) + result = @builder.array(val[0], val[1], val[2]) + + result +end + +def _reduce_292(val, _values, result) + result = @builder.associate(val[0], val[1], val[2]) + + result +end + +def _reduce_293(val, _values, result) + result = @builder.keyword_cmd(:return, val[0]) + + result +end + +def _reduce_294(val, _values, result) + result = @builder.keyword_cmd(:yield, val[0], val[1], val[2], val[3]) + + result +end + +def _reduce_295(val, _values, result) + result = @builder.keyword_cmd(:yield, val[0], val[1], [], val[2]) + + result +end + +def _reduce_296(val, _values, result) + result = @builder.keyword_cmd(:yield, val[0]) + + result +end + +def _reduce_297(val, _values, result) + result = @builder.keyword_cmd(:defined?, val[0], + val[2], [ val[3] ], val[4]) + + result +end + +def _reduce_298(val, _values, result) + result = @builder.not_op(val[0], val[1], val[2], val[3]) + + result +end + +def _reduce_299(val, _values, result) + result = @builder.not_op(val[0], val[1], nil, val[2]) + + result +end + +def _reduce_300(val, _values, result) + method_call = @builder.call_method(nil, nil, val[0]) + + begin_t, args, body, end_t = val[1] + result = @builder.block(method_call, + begin_t, args, body, end_t) + + result +end + +# reduce 301 omitted + +def _reduce_302(val, _values, result) + begin_t, args, body, end_t = val[1] + result = @builder.block(val[0], + begin_t, args, body, end_t) + + result +end + +def _reduce_303(val, _values, result) + result = @context.dup + @context.in_lambda = true + + result +end + +def _reduce_304(val, _values, result) + lambda_call = @builder.call_lambda(val[0]) + + args, (begin_t, body, end_t) = val[2] + result = @builder.block(lambda_call, + begin_t, args, body, end_t) + + @context.in_lambda = val[1].in_lambda + + result +end + +def _reduce_305(val, _values, result) + else_t, else_ = val[4] + result = @builder.condition(val[0], val[1], val[2], + val[3], else_t, + else_, val[5]) + + result +end + +def _reduce_306(val, _values, result) + else_t, else_ = val[4] + result = @builder.condition(val[0], val[1], val[2], + else_, else_t, + val[3], val[5]) + + result +end + +def _reduce_307(val, _values, result) + @lexer.cond.push(true) + + result +end + +def _reduce_308(val, _values, result) + @lexer.cond.pop + + result +end + +def _reduce_309(val, _values, result) + result = @builder.loop(:while, val[0], val[2], val[3], + val[5], val[6]) + + result +end + +def _reduce_310(val, _values, result) + @lexer.cond.push(true) + + result +end + +def _reduce_311(val, _values, result) + @lexer.cond.pop + + result +end + +def _reduce_312(val, _values, result) + result = @builder.loop(:until, val[0], val[2], val[3], + val[5], val[6]) + + result +end + +def _reduce_313(val, _values, result) + *when_bodies, (else_t, else_body) = *val[3] + + result = @builder.case(val[0], val[1], + when_bodies, else_t, else_body, + val[4]) + + result +end + +def _reduce_314(val, _values, result) + *when_bodies, (else_t, else_body) = *val[2] + + result = @builder.case(val[0], nil, + when_bodies, else_t, else_body, + val[3]) + + result +end + +def _reduce_315(val, _values, result) + @lexer.cond.push(true) + + result +end + +def _reduce_316(val, _values, result) + @lexer.cond.pop + + result +end + +def _reduce_317(val, _values, result) + result = @builder.for(val[0], val[1], + val[2], val[4], + val[5], val[7], val[8]) + + result +end + +def _reduce_318(val, _values, result) + local_push + @context.in_class = true + + result +end + +def _reduce_319(val, _values, result) + k_class, ctx = val[0] + if @context.in_def + diagnostic :error, :class_in_def, nil, k_class + end + + lt_t, superclass = val[2] + result = @builder.def_class(k_class, val[1], + lt_t, superclass, + val[4], val[5]) + + local_pop + @context.in_class = ctx.in_class + + result +end + +def _reduce_320(val, _values, result) + @context.in_def = false + @context.in_class = false + local_push + + result +end + +def _reduce_321(val, _values, result) + k_class, ctx = val[0] + result = @builder.def_sclass(k_class, val[1], val[2], + val[5], val[6]) + + local_pop + @context.in_def = ctx.in_def + @context.in_class = ctx.in_class + + result +end + +def _reduce_322(val, _values, result) + @context.in_class = true + local_push + + result +end + +def _reduce_323(val, _values, result) + k_mod, ctx = val[0] + if @context.in_def + diagnostic :error, :module_in_def, nil, k_mod + end + + result = @builder.def_module(k_mod, val[1], + val[3], val[4]) + + local_pop + @context.in_class = ctx.in_class + + result +end + +def _reduce_324(val, _values, result) + local_push + result = context.dup + @context.in_def = true + + result +end + +def _reduce_325(val, _values, result) + result = @builder.def_method(val[0], val[1], + val[3], val[4], val[5]) + + local_pop + @context.in_def = val[2].in_def + + result +end + +def _reduce_326(val, _values, result) + @lexer.state = :expr_fname + + result +end + +def _reduce_327(val, _values, result) + local_push + result = context.dup + @context.in_def = true + + result +end + +def _reduce_328(val, _values, result) + result = @builder.def_singleton(val[0], val[1], val[2], + val[4], val[6], val[7], val[8]) + + local_pop + @context.in_def = val[5].in_def + + result +end + +def _reduce_329(val, _values, result) + result = @builder.keyword_cmd(:break, val[0]) + + result +end + +def _reduce_330(val, _values, result) + result = @builder.keyword_cmd(:next, val[0]) + + result +end + +def _reduce_331(val, _values, result) + result = @builder.keyword_cmd(:redo, val[0]) + + result +end + +def _reduce_332(val, _values, result) + result = @builder.keyword_cmd(:retry, val[0]) + + result +end + +# reduce 333 omitted + +def _reduce_334(val, _values, result) + result = [ val[0], @context.dup ] + + result +end + +def _reduce_335(val, _values, result) + result = [ val[0], @context.dup ] + + result +end + +# reduce 336 omitted + +# reduce 337 omitted + +def _reduce_338(val, _values, result) + result = val[1] + + result +end + +# reduce 339 omitted + +# reduce 340 omitted + +# reduce 341 omitted + +def _reduce_342(val, _values, result) + else_t, else_ = val[4] + result = [ val[0], + @builder.condition(val[0], val[1], val[2], + val[3], else_t, + else_, nil), + ] + + result +end + +# reduce 343 omitted + +def _reduce_344(val, _values, result) + result = val + + result +end + +# reduce 345 omitted + +# reduce 346 omitted + +def _reduce_347(val, _values, result) + @static_env.declare val[0][0] + + result = @builder.arg(val[0]) + + result +end + +def _reduce_348(val, _values, result) + result = @builder.multi_lhs(val[0], val[1], val[2]) + + result +end + +def _reduce_349(val, _values, result) + result = [ val[0] ] + + result +end + +def _reduce_350(val, _values, result) + result = val[0] << val[2] + + result +end + +# reduce 351 omitted + +def _reduce_352(val, _values, result) + @static_env.declare val[3][0] + + result = val[0]. + push(@builder.restarg(val[2], val[3])) + + result +end + +def _reduce_353(val, _values, result) + @static_env.declare val[3][0] + + result = val[0]. + push(@builder.restarg(val[2], val[3])). + concat(val[5]) + + result +end + +def _reduce_354(val, _values, result) + result = val[0]. + push(@builder.restarg(val[2])) + + result +end + +def _reduce_355(val, _values, result) + result = val[0]. + push(@builder.restarg(val[2])). + concat(val[4]) + + result +end + +def _reduce_356(val, _values, result) + @static_env.declare val[1][0] + + result = [ @builder.restarg(val[0], val[1]) ] + + result +end + +def _reduce_357(val, _values, result) + @static_env.declare val[1][0] + + result = [ @builder.restarg(val[0], val[1]), + *val[3] ] + + result +end + +def _reduce_358(val, _values, result) + result = [ @builder.restarg(val[0]) ] + + result +end + +def _reduce_359(val, _values, result) + result = [ @builder.restarg(val[0]), + *val[2] ] + + result +end + +def _reduce_360(val, _values, result) + result = val[0].concat(val[2]).concat(val[3]) + + result +end + +def _reduce_361(val, _values, result) + result = val[0].concat(val[1]) + + result +end + +def _reduce_362(val, _values, result) + result = val[0].concat(val[1]) + + result +end + +def _reduce_363(val, _values, result) + result = [ val[0] ] + + result +end + +def _reduce_364(val, _values, result) + result = val[1] + + result +end + +def _reduce_365(val, _values, result) + result = [] + + result +end + +def _reduce_366(val, _values, result) + result = val[0]. + concat(val[2]). + concat(val[4]). + concat(val[5]) + + result +end + +def _reduce_367(val, _values, result) + result = val[0]. + concat(val[2]). + concat(val[4]). + concat(val[6]). + concat(val[7]) + + result +end + +def _reduce_368(val, _values, result) + result = val[0]. + concat(val[2]). + concat(val[3]) + + result +end + +def _reduce_369(val, _values, result) + result = val[0]. + concat(val[2]). + concat(val[4]). + concat(val[5]) + + result +end + +def _reduce_370(val, _values, result) + result = val[0]. + concat(val[2]). + concat(val[3]) + + result +end + +# reduce 371 omitted + +def _reduce_372(val, _values, result) + result = val[0]. + concat(val[2]). + concat(val[4]). + concat(val[5]) + + result +end + +def _reduce_373(val, _values, result) + if val[1].empty? && val[0].size == 1 + result = [@builder.procarg0(val[0][0])] + else + result = val[0].concat(val[1]) + end + + result +end + +def _reduce_374(val, _values, result) + result = val[0]. + concat(val[2]). + concat(val[3]) + + result +end + +def _reduce_375(val, _values, result) + result = val[0]. + concat(val[2]). + concat(val[4]). + concat(val[5]) + + result +end + +def _reduce_376(val, _values, result) + result = val[0]. + concat(val[1]) + + result +end + +def _reduce_377(val, _values, result) + result = val[0]. + concat(val[2]). + concat(val[3]) + + result +end + +def _reduce_378(val, _values, result) + result = val[0]. + concat(val[1]) + + result +end + +def _reduce_379(val, _values, result) + result = val[0]. + concat(val[2]). + concat(val[3]) + + result +end + +# reduce 380 omitted + +def _reduce_381(val, _values, result) + result = @builder.args(nil, [], nil) + + result +end + +def _reduce_382(val, _values, result) + @lexer.state = :expr_value + + result +end + +def _reduce_383(val, _values, result) + result = @builder.args(val[0], val[1], val[2]) + + result +end + +def _reduce_384(val, _values, result) + result = @builder.args(val[0], [], val[0]) + + result +end + +def _reduce_385(val, _values, result) + result = @builder.args(val[0], val[1].concat(val[2]), val[3]) + + result +end + +def _reduce_386(val, _values, result) + result = [] + + result +end + +def _reduce_387(val, _values, result) + result = val[2] + + result +end + +def _reduce_388(val, _values, result) + result = [ val[0] ] + + result +end + +def _reduce_389(val, _values, result) + result = val[0] << val[2] + + result +end + +def _reduce_390(val, _values, result) + @static_env.declare val[0][0] + result = @builder.shadowarg(val[0]) + + result +end + +# reduce 391 omitted + +def _reduce_392(val, _values, result) + @static_env.extend_dynamic + + result +end + +def _reduce_393(val, _values, result) + result = [ val[1], val[2] ] + + @static_env.unextend + + result +end + +def _reduce_394(val, _values, result) + result = @builder.args(val[0], val[1].concat(val[2]), val[3]) + + result +end + +def _reduce_395(val, _values, result) + result = @builder.args(nil, val[0], nil) + + result +end + +def _reduce_396(val, _values, result) + result = @context.dup + @context.in_lambda = true + + result +end + +def _reduce_397(val, _values, result) + result = [ val[0], val[2], val[3] ] + @context.in_lambda = val[1].in_lambda + + result +end + +def _reduce_398(val, _values, result) + result = @context.dup + @context.in_lambda = true + + result +end + +def _reduce_399(val, _values, result) + result = [ val[0], val[2], val[3] ] + @context.in_lambda = val[1].in_lambda + + result +end + +def _reduce_400(val, _values, result) + @static_env.extend_dynamic + result = @context.dup + @context.in_block = true + + result +end + +def _reduce_401(val, _values, result) + result = [ val[0], val[2], val[3], val[4] ] + + @static_env.unextend + @context.in_block = val[1].in_block + + result +end + +def _reduce_402(val, _values, result) + begin_t, block_args, body, end_t = val[1] + result = @builder.block(val[0], + begin_t, block_args, body, end_t) + + result +end + +def _reduce_403(val, _values, result) + lparen_t, args, rparen_t = val[3] + result = @builder.call_method(val[0], val[1], val[2], + lparen_t, args, rparen_t) + + result +end + +def _reduce_404(val, _values, result) + lparen_t, args, rparen_t = val[3] + method_call = @builder.call_method(val[0], val[1], val[2], + lparen_t, args, rparen_t) + + begin_t, args, body, end_t = val[4] + result = @builder.block(method_call, + begin_t, args, body, end_t) + + result +end + +def _reduce_405(val, _values, result) + method_call = @builder.call_method(val[0], val[1], val[2], + nil, val[3], nil) + + begin_t, args, body, end_t = val[4] + result = @builder.block(method_call, + begin_t, args, body, end_t) + + result +end + +def _reduce_406(val, _values, result) + lparen_t, args, rparen_t = val[1] + result = @builder.call_method(nil, nil, val[0], + lparen_t, args, rparen_t) + + result +end + +def _reduce_407(val, _values, result) + lparen_t, args, rparen_t = val[3] + result = @builder.call_method(val[0], val[1], val[2], + lparen_t, args, rparen_t) + + result +end + +def _reduce_408(val, _values, result) + lparen_t, args, rparen_t = val[3] + result = @builder.call_method(val[0], val[1], val[2], + lparen_t, args, rparen_t) + + result +end + +def _reduce_409(val, _values, result) + result = @builder.call_method(val[0], val[1], val[2]) + + result +end + +def _reduce_410(val, _values, result) + lparen_t, args, rparen_t = val[2] + result = @builder.call_method(val[0], val[1], nil, + lparen_t, args, rparen_t) + + result +end + +def _reduce_411(val, _values, result) + lparen_t, args, rparen_t = val[2] + result = @builder.call_method(val[0], val[1], nil, + lparen_t, args, rparen_t) + + result +end + +def _reduce_412(val, _values, result) + lparen_t, args, rparen_t = val[1] + result = @builder.keyword_cmd(:super, val[0], + lparen_t, args, rparen_t) + + result +end + +def _reduce_413(val, _values, result) + result = @builder.keyword_cmd(:zsuper, val[0]) + + result +end + +def _reduce_414(val, _values, result) + result = @builder.index(val[0], val[1], val[2], val[3]) + + result +end + +def _reduce_415(val, _values, result) + @static_env.extend_dynamic + result = @context.dup + @context.in_block = true + + result +end + +def _reduce_416(val, _values, result) + result = [ val[0], val[2], val[3], val[4] ] + + @static_env.unextend + @context.in_block = val[1].in_block + + result +end + +def _reduce_417(val, _values, result) + @static_env.extend_dynamic + result = @context.dup + @context.in_block = true + + result +end + +def _reduce_418(val, _values, result) + result = [ val[0], val[2], val[3], val[4] ] + + @static_env.unextend + @context.in_block = val[1].in_block + + result +end + +def _reduce_419(val, _values, result) + result = [ @builder.when(val[0], val[1], val[2], val[3]), + *val[4] ] + + result +end + +def _reduce_420(val, _values, result) + result = [ val[0] ] + + result +end + +# reduce 421 omitted + +def _reduce_422(val, _values, result) + assoc_t, exc_var = val[2] + + if val[1] + exc_list = @builder.array(nil, val[1], nil) + end + + result = [ @builder.rescue_body(val[0], + exc_list, assoc_t, exc_var, + val[3], val[4]), + *val[5] ] + + result +end + +def _reduce_423(val, _values, result) + result = [] + + result +end + +def _reduce_424(val, _values, result) + result = [ val[0] ] + + result +end + +# reduce 425 omitted + +# reduce 426 omitted + +def _reduce_427(val, _values, result) + result = [ val[0], val[1] ] + + result +end + +# reduce 428 omitted + +def _reduce_429(val, _values, result) + result = [ val[0], val[1] ] + + result +end + +# reduce 430 omitted + +# reduce 431 omitted + +# reduce 432 omitted + +# reduce 433 omitted + +def _reduce_434(val, _values, result) + result = @builder.string_compose(nil, val[0], nil) + + result +end + +def _reduce_435(val, _values, result) + result = [ val[0] ] + + result +end + +def _reduce_436(val, _values, result) + result = val[0] << val[1] + + result +end + +def _reduce_437(val, _values, result) + result = @builder.string_compose(val[0], val[1], val[2]) + + result +end + +def _reduce_438(val, _values, result) + result = @builder.string(val[0]) + + result +end + +def _reduce_439(val, _values, result) + result = @builder.character(val[0]) + + result +end + +def _reduce_440(val, _values, result) + result = @builder.xstring_compose(val[0], val[1], val[2]) + + result +end + +def _reduce_441(val, _values, result) + opts = @builder.regexp_options(val[3]) + result = @builder.regexp_compose(val[0], val[1], val[2], opts) + + result +end + +def _reduce_442(val, _values, result) + result = @builder.words_compose(val[0], val[1], val[2]) + + result +end + +def _reduce_443(val, _values, result) + result = [] + + result +end + +def _reduce_444(val, _values, result) + result = val[0] << @builder.word(val[1]) + + result +end + +def _reduce_445(val, _values, result) + result = [ val[0] ] + + result +end + +def _reduce_446(val, _values, result) + result = val[0] << val[1] + + result +end + +def _reduce_447(val, _values, result) + result = @builder.symbols_compose(val[0], val[1], val[2]) + + result +end + +def _reduce_448(val, _values, result) + result = [] + + result +end + +def _reduce_449(val, _values, result) + result = val[0] << @builder.word(val[1]) + + result +end + +def _reduce_450(val, _values, result) + result = @builder.words_compose(val[0], val[1], val[2]) + + result +end + +def _reduce_451(val, _values, result) + result = @builder.symbols_compose(val[0], val[1], val[2]) + + result +end + +def _reduce_452(val, _values, result) + result = [] + + result +end + +def _reduce_453(val, _values, result) + result = val[0] << @builder.string_internal(val[1]) + + result +end + +def _reduce_454(val, _values, result) + result = [] + + result +end + +def _reduce_455(val, _values, result) + result = val[0] << @builder.symbol_internal(val[1]) + + result +end + +def _reduce_456(val, _values, result) + result = [] + + result +end + +def _reduce_457(val, _values, result) + result = val[0] << val[1] + + result +end + +def _reduce_458(val, _values, result) + result = [] + + result +end + +def _reduce_459(val, _values, result) + result = val[0] << val[1] + + result +end + +def _reduce_460(val, _values, result) + result = [] + + result +end + +def _reduce_461(val, _values, result) + result = val[0] << val[1] + + result +end + +def _reduce_462(val, _values, result) + result = @builder.string_internal(val[0]) + + result +end + +def _reduce_463(val, _values, result) + result = val[1] + + result +end + +def _reduce_464(val, _values, result) + @lexer.cond.push(false) + @lexer.cmdarg.push(false) + + result +end + +def _reduce_465(val, _values, result) + @lexer.cond.lexpop + @lexer.cmdarg.lexpop + + result = @builder.begin(val[0], val[2], val[3]) + + result +end + +def _reduce_466(val, _values, result) + result = @builder.gvar(val[0]) + + result +end + +def _reduce_467(val, _values, result) + result = @builder.ivar(val[0]) + + result +end + +def _reduce_468(val, _values, result) + result = @builder.cvar(val[0]) + + result +end + +# reduce 469 omitted + +def _reduce_470(val, _values, result) + result = @builder.symbol(val[0]) + + result +end + +def _reduce_471(val, _values, result) + result = @builder.symbol_compose(val[0], val[1], val[2]) + + result +end + +def _reduce_472(val, _values, result) + result = @builder.integer(val[0]) + + result +end + +def _reduce_473(val, _values, result) + result = @builder.float(val[0]) + + result +end + +def _reduce_474(val, _values, result) + num = @builder.integer(val[1]) + if @builder.respond_to? :negate + # AST builder interface compatibility + result = @builder.negate(val[0], num) + else + result = @builder.unary_num(val[0], num) + end + + result +end + +def _reduce_475(val, _values, result) + num = @builder.float(val[1]) + if @builder.respond_to? :negate + # AST builder interface compatibility + result = @builder.negate(val[0], num) + else + result = @builder.unary_num(val[0], num) + end + + result +end + +def _reduce_476(val, _values, result) + result = @builder.ident(val[0]) + + result +end + +def _reduce_477(val, _values, result) + result = @builder.ivar(val[0]) + + result +end + +def _reduce_478(val, _values, result) + result = @builder.gvar(val[0]) + + result +end + +def _reduce_479(val, _values, result) + result = @builder.const(val[0]) + + result +end + +def _reduce_480(val, _values, result) + result = @builder.cvar(val[0]) + + result +end + +def _reduce_481(val, _values, result) + result = @builder.nil(val[0]) + + result +end + +def _reduce_482(val, _values, result) + result = @builder.self(val[0]) + + result +end + +def _reduce_483(val, _values, result) + result = @builder.true(val[0]) + + result +end + +def _reduce_484(val, _values, result) + result = @builder.false(val[0]) + + result +end + +def _reduce_485(val, _values, result) + result = @builder.__FILE__(val[0]) + + result +end + +def _reduce_486(val, _values, result) + result = @builder.__LINE__(val[0]) + + result +end + +def _reduce_487(val, _values, result) + result = @builder.__ENCODING__(val[0]) + + result +end + +def _reduce_488(val, _values, result) + result = @builder.accessible(val[0]) + + result +end + +def _reduce_489(val, _values, result) + result = @builder.accessible(val[0]) + + result +end + +def _reduce_490(val, _values, result) + result = @builder.assignable(val[0]) + + result +end + +def _reduce_491(val, _values, result) + result = @builder.assignable(val[0]) + + result +end + +def _reduce_492(val, _values, result) + result = @builder.nth_ref(val[0]) + + result +end + +def _reduce_493(val, _values, result) + result = @builder.back_ref(val[0]) + + result +end + +def _reduce_494(val, _values, result) + result = nil + + result +end + +def _reduce_495(val, _values, result) + @lexer.state = :expr_value + + result +end + +def _reduce_496(val, _values, result) + result = [ val[0], val[2] ] + + result +end + +def _reduce_497(val, _values, result) + yyerrok + result = nil + + result +end + +def _reduce_498(val, _values, result) + result = @builder.args(val[0], val[1], val[2]) + + @lexer.state = :expr_value + + result +end + +def _reduce_499(val, _values, result) + result = @builder.args(nil, val[0], nil) + + result +end + +def _reduce_500(val, _values, result) + result = val[0].concat(val[2]).concat(val[3]) + + result +end + +def _reduce_501(val, _values, result) + result = val[0].concat(val[1]) + + result +end + +def _reduce_502(val, _values, result) + result = val[0].concat(val[1]) + + result +end + +def _reduce_503(val, _values, result) + result = [ val[0] ] + + result +end + +def _reduce_504(val, _values, result) + result = val[1] + + result +end + +def _reduce_505(val, _values, result) + result = [] + + result +end + +def _reduce_506(val, _values, result) + result = val[0]. + concat(val[2]). + concat(val[4]). + concat(val[5]) + + result +end + +def _reduce_507(val, _values, result) + result = val[0]. + concat(val[2]). + concat(val[4]). + concat(val[6]). + concat(val[7]) + + result +end + +def _reduce_508(val, _values, result) + result = val[0]. + concat(val[2]). + concat(val[3]) + + result +end + +def _reduce_509(val, _values, result) + result = val[0]. + concat(val[2]). + concat(val[4]). + concat(val[5]) + + result +end + +def _reduce_510(val, _values, result) + result = val[0]. + concat(val[2]). + concat(val[3]) + + result +end + +def _reduce_511(val, _values, result) + result = val[0]. + concat(val[2]). + concat(val[4]). + concat(val[5]) + + result +end + +def _reduce_512(val, _values, result) + result = val[0]. + concat(val[1]) + + result +end + +def _reduce_513(val, _values, result) + result = val[0]. + concat(val[2]). + concat(val[3]) + + result +end + +def _reduce_514(val, _values, result) + result = val[0]. + concat(val[2]). + concat(val[4]). + concat(val[5]) + + result +end + +def _reduce_515(val, _values, result) + result = val[0]. + concat(val[1]) + + result +end + +def _reduce_516(val, _values, result) + result = val[0]. + concat(val[2]). + concat(val[3]) + + result +end + +def _reduce_517(val, _values, result) + result = val[0]. + concat(val[1]) + + result +end + +def _reduce_518(val, _values, result) + result = val[0]. + concat(val[2]). + concat(val[3]) + + result +end + +def _reduce_519(val, _values, result) + result = val[0] + + result +end + +def _reduce_520(val, _values, result) + result = [] + + result +end + +def _reduce_521(val, _values, result) + diagnostic :error, :argument_const, nil, val[0] + + result +end + +def _reduce_522(val, _values, result) + diagnostic :error, :argument_ivar, nil, val[0] + + result +end + +def _reduce_523(val, _values, result) + diagnostic :error, :argument_gvar, nil, val[0] + + result +end + +def _reduce_524(val, _values, result) + diagnostic :error, :argument_cvar, nil, val[0] + + result +end + +# reduce 525 omitted + +# reduce 526 omitted + +def _reduce_527(val, _values, result) + @static_env.declare val[0][0] + + result = @builder.arg(val[0]) + + result +end + +def _reduce_528(val, _values, result) + result = @builder.multi_lhs(val[0], val[1], val[2]) + + result +end + +def _reduce_529(val, _values, result) + result = [ val[0] ] + + result +end + +def _reduce_530(val, _values, result) + result = val[0] << val[2] + + result +end + +def _reduce_531(val, _values, result) + check_kwarg_name(val[0]) + + @static_env.declare val[0][0] + + result = @builder.kwoptarg(val[0], val[1]) + + result +end + +def _reduce_532(val, _values, result) + check_kwarg_name(val[0]) + + @static_env.declare val[0][0] + + result = @builder.kwoptarg(val[0], val[1]) + + result +end + +def _reduce_533(val, _values, result) + result = [ val[0] ] + + result +end + +def _reduce_534(val, _values, result) + result = val[0] << val[2] + + result +end + +def _reduce_535(val, _values, result) + result = [ val[0] ] + + result +end + +def _reduce_536(val, _values, result) + result = val[0] << val[2] + + result +end + +# reduce 537 omitted + +# reduce 538 omitted + +def _reduce_539(val, _values, result) + @static_env.declare val[1][0] + + result = [ @builder.kwrestarg(val[0], val[1]) ] + + result +end + +def _reduce_540(val, _values, result) + result = [ @builder.kwrestarg(val[0]) ] + + result +end + +def _reduce_541(val, _values, result) + @static_env.declare val[0][0] + + result = @builder.optarg(val[0], val[1], val[2]) + + result +end + +def _reduce_542(val, _values, result) + @static_env.declare val[0][0] + + result = @builder.optarg(val[0], val[1], val[2]) + + result +end + +def _reduce_543(val, _values, result) + result = [ val[0] ] + + result +end + +def _reduce_544(val, _values, result) + result = val[0] << val[2] + + result +end + +def _reduce_545(val, _values, result) + result = [ val[0] ] + + result +end + +def _reduce_546(val, _values, result) + result = val[0] << val[2] + + result +end + +# reduce 547 omitted + +# reduce 548 omitted + +def _reduce_549(val, _values, result) + @static_env.declare val[1][0] + + result = [ @builder.restarg(val[0], val[1]) ] + + result +end + +def _reduce_550(val, _values, result) + result = [ @builder.restarg(val[0]) ] + + result +end + +# reduce 551 omitted + +# reduce 552 omitted + +def _reduce_553(val, _values, result) + @static_env.declare val[1][0] + + result = @builder.blockarg(val[0], val[1]) + + result +end + +def _reduce_554(val, _values, result) + result = [ val[1] ] + + result +end + +def _reduce_555(val, _values, result) + result = [] + + result +end + +# reduce 556 omitted + +def _reduce_557(val, _values, result) + result = val[1] + + result +end + +def _reduce_558(val, _values, result) + result = [] + + result +end + +# reduce 559 omitted + +def _reduce_560(val, _values, result) + result = [ val[0] ] + + result +end + +def _reduce_561(val, _values, result) + result = val[0] << val[2] + + result +end + +def _reduce_562(val, _values, result) + result = @builder.pair(val[0], val[1], val[2]) + + result +end + +def _reduce_563(val, _values, result) + result = @builder.pair_keyword(val[0], val[1]) + + result +end + +def _reduce_564(val, _values, result) + result = @builder.kwsplat(val[0], val[1]) + + result +end + +# reduce 565 omitted + +# reduce 566 omitted + +# reduce 567 omitted + +# reduce 568 omitted + +# reduce 569 omitted + +# reduce 570 omitted + +# reduce 571 omitted + +# reduce 572 omitted + +# reduce 573 omitted + +# reduce 574 omitted + +# reduce 575 omitted + +# reduce 576 omitted + +# reduce 577 omitted + +# reduce 578 omitted + +# reduce 579 omitted + +# reduce 580 omitted + +def _reduce_581(val, _values, result) + result = val[1] + + result +end + +def _reduce_582(val, _values, result) + result = val[1] + + result +end + +# reduce 583 omitted + +# reduce 584 omitted + +# reduce 585 omitted + +def _reduce_586(val, _values, result) + yyerrok + + result +end + +# reduce 587 omitted + +# reduce 588 omitted + +# reduce 589 omitted + +def _reduce_590(val, _values, result) + result = nil + + result +end + +def _reduce_none(val, _values, result) + val[0] +end + + end # class Ruby20 + end # module Parser diff --git a/vendor/bundle/ruby/3.1.0/gems/parser-3.1.2.0/lib/parser/ruby21.rb b/vendor/bundle/ruby/3.1.0/gems/parser-3.1.2.0/lib/parser/ruby21.rb new file mode 100644 index 000000000..f6a875367 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/parser-3.1.2.0/lib/parser/ruby21.rb @@ -0,0 +1,6611 @@ +# -*- encoding:utf-8; warn-indent:false; frozen_string_literal: true -*- +# +# DO NOT MODIFY!!!! +# This file is automatically generated by Racc 1.4.15 +# from Racc grammer file "". +# + +require 'racc/parser.rb' + + +require 'parser' + +module Parser + class Ruby21 < Parser::Base + + + def version + 21 + end + + def default_encoding + Encoding::UTF_8 + end + + def local_push + @static_env.extend_static + @lexer.cmdarg.push(false) + @lexer.cond.push(false) + end + + def local_pop + @static_env.unextend + @lexer.cmdarg.pop + @lexer.cond.pop + end +##### State transition tables begin ### + +clist = [ +'-579,444,536,594,270,216,217,-579,-579,-579,557,536,-105,-579,-579,-83', +'-579,-286,219,536,-99,578,536,-69,-482,-579,580,-102,216,217,-494,-482', +'526,216,217,528,-579,-579,-100,-579,-579,-579,-579,-579,536,-102,836', +'-490,-93,-91,-93,-101,963,-488,-490,691,-105,-286,-102,220,-488,-99', +'867,-100,813,781,-579,-579,-579,-579,-579,-579,-579,-579,-579,-579,-579', +'-579,-579,-579,111,-104,-579,-579,-579,-98,599,577,-97,-98,-579,269', +'579,-579,781,691,542,691,-579,115,-579,-99,-579,-579,114,-579,-579,-579', +'-579,-579,-289,-579,-579,-579,-93,-91,556,-289,-289,-289,115,-96,220', +'-289,-289,114,-289,-579,-575,115,-579,-579,818,-92,114,-579,-93,115', +'-99,115,115,-101,114,-99,114,114,-289,-289,270,-289,-289,-289,-289,-289', +'-93,-91,-100,-93,-91,115,-101,-100,115,-102,114,-93,-91,114,-102,-101', +'-90,866,-91,-103,-101,123,-289,-289,-289,-289,-289,-289,-289,-289,-289', +'-289,-289,-289,-289,-289,-95,270,-289,-289,-289,208,598,-88,-89,115', +'-289,115,565,-289,114,209,114,565,-289,565,-289,526,-289,-289,525,-289', +'-289,-289,-289,-289,-289,-289,514,-289,-493,-575,210,-289,-289,-289', +'216,217,-289,-289,-289,269,-289,-289,-576,115,-289,-289,215,-94,114', +'-289,-289,-289,-289,216,217,-103,259,747,-493,265,-289,-289,-489,-289', +'-289,-289,-289,-289,548,-489,567,566,549,-92,565,567,566,567,566,563', +'723,-104,269,-97,615,725,-94,746,93,94,-289,-289,-289,-289,-289,-289', +'-289,-289,-289,-289,-289,-289,-289,-289,270,-88,-289,-289,-289,317,749', +'-289,-102,-97,-289,93,94,-289,-289,614,-289,318,-289,565,-289,220,-289', +'-289,220,-289,-289,-289,-289,-289,565,-289,-482,-289,567,566,568,386', +'-100,-482,-482,-482,615,220,-482,-482,-482,-289,-482,115,-289,-289,-289', +'-289,114,-289,-482,-289,-482,-482,-482,-103,95,96,265,-573,593,526,-482', +'-482,528,-482,-482,-482,-482,-482,669,614,666,665,664,552,667,567,566', +'570,-487,269,918,95,96,399,-572,-487,567,566,572,553,-482,-482,-482', +'-482,-482,-482,-482,-482,-482,-482,-482,-482,-482,-482,615,-91,-482', +'-482,-482,-482,-482,-482,615,-100,-482,514,-482,-482,-482,443,-482,-573', +'-482,-415,-482,-482,-482,-482,445,-482,-482,-482,-482,-482,262,-482', +'-479,-482,-479,614,446,263,565,-479,-573,-479,219,614,-572,565,885,-482', +'-479,-579,-482,-482,-482,-482,115,-482,-579,-482,-95,114,-494,-482,477', +'-579,-579,-579,-104,-572,-579,-579,-579,-415,-579,669,486,666,665,664', +'-415,667,396,-579,-579,-579,-579,398,397,-415,220,-579,214,967,-579', +'-579,488,-579,-579,-579,-579,-579,490,-579,567,566,576,-290,-415,-89', +'-579,567,566,581,-290,-575,497,-98,-68,-579,220,732,500,-290,-579,-579', +'-579,-579,-579,-579,-579,-579,-579,-579,-579,-579,-579,-579,-579,-96', +'-579,-579,-579,-579,748,-579,262,-105,-579,501,-579,-579,-579,263,-579', +'-575,-579,982,-579,-579,-579,-579,81,-579,-579,-579,-579,-579,-90,-579', +'-579,-579,-486,-485,82,-484,-99,508,-579,-486,-485,115,-484,274,83,-579', +'114,115,-579,-579,-579,-579,114,-579,-479,-579,74,75,71,-101,57,-479', +'-479,-479,63,64,-479,-479,-479,67,-479,65,66,68,310,311,72,73,-479,220', +'-479,-479,-479,306,307,313,103,102,104,105,-479,-479,232,-479,-479,-479', +'-479,-479,526,45,265,528,107,106,108,97,56,99,98,100,511,101,109,110', +'515,93,94,42,43,41,-479,-479,-479,-479,-479,-479,-479,-479,-479,-479', +'-479,-479,-479,-479,216,217,-479,-479,-479,225,-479,-479,231,240,-479', +'58,59,-479,-479,60,-479,220,-479,115,-479,44,-479,-479,114,-479,-479', +'-479,-479,-479,230,-479,529,-479,530,91,81,84,85,490,86,88,87,89,813', +'781,542,-479,82,90,-479,-479,-479,-479,388,-479,62,-479,83,95,96,-479', +'5,74,75,71,9,57,216,217,-333,63,64,684,683,546,67,-333,65,66,68,30,31', +'72,73,547,-333,582,585,-261,29,28,27,103,102,104,105,717,718,19,587', +'719,109,110,603,8,45,7,10,107,106,108,97,56,99,98,100,220,101,109,110', +'591,93,94,42,43,41,240,244,249,250,251,246,248,256,257,252,253,544,233', +'234,-290,592,254,255,545,40,265,-290,33,602,605,58,59,543,240,60,-290', +'35,237,240,243,44,239,238,673,235,236,247,245,241,20,242,240,240,676', +'91,81,84,85,552,86,88,87,89,220,220,551,220,82,90,-83,258,633,-238,220', +'553,62,519,83,95,96,291,74,75,71,9,57,684,683,-279,63,64,677,644,649', +'67,-279,65,66,68,30,31,72,73,650,-279,652,687,542,29,28,27,103,102,104', +'105,694,712,19,722,726,727,-262,588,8,45,293,10,107,106,108,97,56,99', +'98,100,733,101,109,110,477,93,94,42,43,41,240,244,249,250,251,246,248', +'256,257,252,253,972,233,234,-492,477,254,255,973,40,220,-492,33,673', +'751,58,59,971,259,60,-492,35,237,676,243,44,239,238,488,235,236,247', +'245,241,20,242,490,774,644,91,81,84,85,440,86,88,87,89,220,265,441,265', +'82,90,644,258,684,683,240,442,62,677,83,95,96,291,74,75,71,9,57,781', +'220,-491,63,64,790,793,794,67,-491,65,66,68,30,31,72,73,796,-491,798', +'800,808,29,28,27,103,102,104,105,809,810,19,781,817,220,220,603,8,45', +'293,10,107,106,108,97,56,99,98,100,826,101,109,110,-263,93,94,42,43', +'41,240,244,249,250,251,246,248,256,257,252,253,-289,233,234,-290,835', +'254,255,-289,40,838,-290,33,-576,793,58,59,-289,841,60,-290,35,237,843', +'243,44,239,238,845,235,236,247,245,241,20,242,847,220,849,91,81,84,85', +'516,86,88,87,89,850,853,517,855,82,90,856,258,644,858,-261,442,62,862', +'83,95,96,291,74,75,71,9,57,864,220,-279,63,64,883,220,887,67,-279,65', +'66,68,30,31,72,73,889,-279,895,898,220,29,28,27,103,102,104,105,902', +'915,19,666,665,664,-264,667,8,45,293,10,107,106,108,97,56,99,98,100', +'912,101,109,110,919,93,94,42,43,41,240,244,249,250,251,246,248,256,257', +'252,253,-289,233,234,506,920,254,255,-289,40,931,507,33,-576,793,58', +'59,-289,933,60,505,35,237,935,243,44,239,238,937,235,236,247,245,241', +'20,242,939,939,220,91,81,84,85,-492,86,88,87,89,945,948,-492,949,82', +'90,954,258,712,793,957,-492,62,959,83,95,96,291,74,75,71,9,57,961,963', +'-491,63,64,963,974,984,67,-491,65,66,68,30,31,72,73,-576,-491,-575,649', +'999,29,28,27,103,102,104,105,1000,915,19,666,665,664,1001,667,8,45,293', +'10,107,106,108,97,56,99,98,100,939,101,109,110,939,93,94,42,43,41,240', +'244,249,250,251,246,248,256,257,252,253,552,233,234,212,939,254,255', +'918,40,1006,213,33,984,1009,58,59,553,1010,60,211,35,237,1011,243,44', +'239,238,963,235,236,247,245,241,20,242,963,963,220,91,81,84,85,984,86', +'88,87,89,939,984,,,82,90,,258,,,,,62,,83,95,96,5,74,75,71,9,57,,,,63', +'64,,,,67,,65,66,68,30,31,72,73,118,119,120,121,122,29,28,27,103,102', +'104,105,,,19,118,119,120,121,122,8,45,7,10,107,106,108,97,56,99,98,100', +',101,109,110,,93,94,42,43,41,240,244,249,250,251,246,248,256,257,252', +'253,-289,233,234,,,254,255,-289,40,,,33,-576,,58,59,-289,,60,,35,237', +',243,44,239,238,,235,236,247,245,241,20,242,,,,91,81,84,85,,86,88,87', +'89,,,,,82,90,,258,,,,,62,,83,95,96,5,74,75,71,9,57,,,,63,64,,,,67,,65', +'66,68,30,31,72,73,118,119,120,121,122,29,28,27,103,102,104,105,,,19', +',,,,,8,45,7,10,107,106,108,97,56,99,98,100,,101,109,110,,93,94,42,43', +'41,240,244,249,250,251,246,248,256,257,252,253,,233,234,,,254,255,,40', +',,33,,,58,59,,,60,,35,237,,243,44,239,238,,235,236,247,245,241,20,242', +',,,91,81,84,85,,86,88,87,89,,,,,82,90,,258,,,,,62,,83,95,96,291,74,75', +'71,9,57,,,,63,64,,,,67,,65,66,68,30,31,72,73,,,,,,29,28,27,103,102,104', +'105,,,19,,,,,,8,45,293,10,107,106,108,97,56,99,98,100,,101,109,110,', +'93,94,42,43,41,240,244,249,250,251,246,248,256,257,252,253,,233,234', +',,254,255,,40,,,33,,,58,59,,,60,,35,237,,243,44,239,238,,235,236,247', +'245,241,20,242,,,,91,81,84,85,,86,88,87,89,,,,,82,90,,258,,,,,62,,83', +'95,96,291,74,75,71,9,57,,,,63,64,,,,67,,65,66,68,30,31,72,73,,,,,,29', +'28,27,103,102,104,105,,,19,,,,,,8,45,293,10,107,106,108,97,56,99,98', +'100,,101,109,110,,93,94,42,43,41,240,244,249,250,251,246,248,256,257', +'252,253,,233,234,,,254,255,,40,,,33,,,58,59,,,60,,35,237,,243,44,239', +'238,,235,236,247,245,241,20,242,,,,91,81,84,85,,86,88,87,89,,,,,82,90', +',258,,,,,62,,83,95,96,291,74,75,71,9,57,,,,63,64,,,,67,,65,66,68,30', +'31,72,73,,,,,,29,28,27,103,102,104,105,,,19,,,,,,8,45,293,10,107,106', +'108,97,56,99,98,100,,101,109,110,,93,94,42,43,41,240,244,249,250,251', +'246,248,256,257,252,253,,233,234,,,254,255,,40,,,33,,,58,59,,,60,,35', +'237,,243,44,239,238,,235,236,247,245,241,20,242,,,,91,81,84,85,,86,88', +'87,89,,,,,82,90,,258,,,,,62,,83,95,96,291,74,75,71,9,57,,,,63,64,,,', +'67,,65,66,68,30,31,72,73,,,,,,29,28,27,103,102,104,105,,,19,,,,,,8,45', +'293,10,107,106,108,97,56,99,98,100,,101,109,110,,93,94,42,43,41,240', +'244,249,250,251,246,248,256,257,252,253,,233,234,,,254,255,,40,,,295', +',,58,59,,,60,,35,237,,243,44,239,238,,235,236,247,245,241,20,242,,,', +'91,81,84,85,,86,88,87,89,,,,,82,90,,258,,,,,62,,83,95,96,291,74,75,71', +'9,57,,,,63,64,,,,67,,65,66,68,30,31,72,73,,,,,,29,28,27,103,102,104', +'105,,,19,,,,,,8,45,293,10,107,106,108,97,56,99,98,100,,101,109,110,', +'93,94,42,43,41,240,244,249,250,251,246,248,256,257,252,253,,233,234', +',,254,255,,40,,,33,,,58,59,,,60,,35,237,,243,44,239,238,,235,236,247', +'245,241,20,242,,,,91,81,84,85,,86,88,87,89,,,,,82,90,,258,,,,,62,,83', +'95,96,291,74,75,71,9,57,,,,63,64,,,,67,,65,66,68,30,31,72,73,,,,,,29', +'28,27,103,102,104,105,,,19,,,,,,8,45,293,10,107,106,108,97,56,99,98', +'100,,101,109,110,,93,94,42,43,41,240,244,249,250,251,246,248,256,257', +'252,253,,233,234,,,254,255,,40,,,33,,,58,59,,,60,,35,237,,243,44,239', +'238,,235,236,247,245,241,20,242,,,,91,81,84,85,,86,88,87,89,,,,,82,90', +'220,258,,,,,62,,83,95,96,291,74,75,71,9,57,,,,63,64,,,,67,,65,66,68', +'30,31,72,73,,,,,,29,28,27,103,102,104,105,,,19,,,,,,8,45,293,10,107', +'106,108,97,56,99,98,100,,101,109,110,,93,94,42,43,41,240,244,249,250', +'251,246,248,256,257,252,253,,233,234,,,254,255,,40,,,33,,,58,59,,,60', +',35,237,,243,44,239,238,,235,236,247,245,241,20,242,,,,91,81,84,85,', +'86,88,87,89,,,,,82,90,,258,,,,,62,,83,95,96,291,74,75,71,9,57,,,,63', +'64,,,,67,,65,66,68,30,31,72,73,,,,,,29,28,27,103,102,104,105,,,19,,', +',,,8,45,293,10,107,106,108,97,56,99,98,100,,101,109,110,,93,94,42,43', +'41,240,244,249,250,251,246,248,256,257,252,253,,233,234,,,254,255,,40', +',,33,,,58,59,,,60,,35,237,,243,44,239,238,,235,236,247,245,241,20,242', +',,,91,81,84,85,,86,88,87,89,,,,,82,90,,258,,,,,62,,83,95,96,291,74,75', +'71,9,57,,,,63,64,,,,67,,65,66,68,30,31,72,73,,,,,,29,28,27,103,102,104', +'105,,,19,,,,,,8,45,293,10,107,106,108,97,56,99,98,100,,101,109,110,', +'93,94,42,43,41,240,244,249,250,251,246,248,256,257,252,253,,233,234', +',,254,255,,40,,,33,,,58,59,,,60,,35,237,,243,44,239,238,,235,236,247', +'245,241,20,242,,,,91,81,84,85,,86,88,87,89,,,,,82,90,,258,,,,,62,,83', +'95,96,291,74,75,71,9,57,,,,63,64,,,,67,,65,66,68,30,31,72,73,,,,,,29', +'28,27,103,102,104,105,,,19,,,,,,8,45,293,10,107,106,108,97,56,99,98', +'100,,101,109,110,,93,94,42,43,41,240,244,249,250,251,246,248,256,257', +'252,253,,233,234,,,254,255,,40,,,33,,,58,59,,,60,,35,237,,243,44,239', +'238,,235,236,247,245,241,20,242,,,,91,81,84,85,,86,88,87,89,,,,,82,90', +',258,,,,,62,,83,95,96,291,74,75,71,9,57,,,,63,64,,,,67,,65,66,68,30', +'31,72,73,,,,,,29,28,27,103,102,104,105,,669,19,666,665,664,,667,8,45', +'293,10,107,106,108,97,56,99,98,100,,101,109,110,,93,94,42,43,41,669', +',666,665,664,,667,,802,,,240,,,,,,805,,40,,,295,,,58,59,,,60,,35,,,', +'44,,802,,,,,,237,20,,944,239,238,91,81,84,85,,86,88,87,89,,,,,82,90', +',669,,666,665,664,62,667,83,95,96,291,74,75,71,9,57,,,,63,64,,,,67,', +'65,66,68,30,31,72,73,,,,,802,29,28,27,103,102,104,105,240,805,19,,,', +'240,,8,45,293,10,107,106,108,97,56,99,98,100,,101,109,110,,93,94,42', +'43,41,240,,237,,,,239,238,237,235,236,,239,238,,,254,255,,40,,,33,,', +'58,59,,240,60,,35,237,,243,44,239,238,,235,236,,,241,20,242,,,,91,81', +'84,85,,86,88,87,89,,,237,,82,90,239,238,,235,236,,62,,83,95,96,291,74', +'75,71,9,57,,,,63,64,,,,67,,65,66,68,30,31,72,73,,,,,,29,28,27,103,102', +'104,105,,669,19,666,665,664,,667,8,45,293,10,107,106,108,97,56,99,98', +'100,,101,109,110,,93,94,42,43,41,240,669,,666,665,664,,667,802,669,', +'666,665,664,,667,254,255,,40,,,33,,,58,59,,,60,,35,237,,243,44,239,238', +'802,235,236,,,241,20,242,802,,,91,81,84,85,,86,88,87,89,,,,,82,90,,669', +',666,665,664,62,667,83,95,96,291,74,75,71,9,57,,,,63,64,,,,67,,65,66', +'68,30,31,72,73,,,,,802,29,28,27,103,102,104,105,,669,19,666,665,664', +',667,8,45,293,10,107,106,108,97,56,99,98,100,,101,109,110,,93,94,42', +'43,41,240,244,249,250,251,246,248,,802,252,253,,,,,,254,255,,40,,,33', +',,58,59,,,60,,35,237,,243,44,239,238,,235,236,247,245,241,20,242,,,', +'91,81,84,85,,86,88,87,89,,,,,82,90,,,,,,,62,,83,95,96,291,74,75,71,9', +'57,,,,63,64,,,,67,,65,66,68,30,31,72,73,,,,,,29,28,27,103,102,104,105', +',,19,,,,,,8,45,293,10,107,106,108,97,56,99,98,100,,101,109,110,,93,94', +'42,43,41,240,244,249,250,251,246,248,256,,252,253,,,,,,254,255,,40,', +',33,,,58,59,,,60,,35,237,,243,44,239,238,,235,236,247,245,241,20,242', +',,,91,81,84,85,,86,88,87,89,,,,,82,90,,,,,,,62,,83,95,96,291,74,75,71', +'9,57,,,,63,64,,,,67,,65,66,68,30,31,72,73,,,,,,29,28,27,103,102,104', +'105,,,19,,,,,,8,45,293,10,107,106,108,97,56,99,98,100,,101,109,110,', +'93,94,42,43,41,240,-598,-598,-598,-598,246,248,,,-598,-598,,,,,,254', +'255,,40,,,33,,,58,59,,,60,,35,237,,243,44,239,238,,235,236,247,245,241', +'20,242,,,,91,81,84,85,,86,88,87,89,,,,,82,90,,,,,,,62,,83,95,96,291', +'74,75,71,9,57,,,,63,64,,,,67,,65,66,68,30,31,72,73,,,,,,29,28,27,103', +'102,104,105,,,19,,,,,,8,45,293,10,107,106,108,97,56,99,98,100,,101,109', +'110,,93,94,42,43,41,240,244,249,250,251,246,248,256,257,252,253,,-598', +'-598,,,254,255,,40,,,33,,,58,59,,,60,,35,237,,243,44,239,238,,235,236', +'247,245,241,20,242,,,,91,81,84,85,,86,88,87,89,,,,,82,90,,,,,,,62,,83', +'95,96,291,74,75,71,9,57,,,,63,64,,,,67,,65,66,68,30,31,72,73,,,,,,29', +'28,27,103,102,104,105,,,19,,,,,,8,45,293,10,107,106,108,97,56,99,98', +'100,,101,109,110,,93,94,42,43,41,240,244,249,250,251,246,248,256,257', +'252,253,,-598,-598,,,254,255,,40,,,33,,,58,59,,,60,,35,237,,243,44,239', +'238,,235,236,247,245,241,20,242,,,,91,81,84,85,,86,88,87,89,,,,,82,90', +',,,,,,62,,83,95,96,291,74,75,71,9,57,,,,63,64,,,,67,,65,66,68,30,31', +'72,73,,,,,,29,28,27,103,102,104,105,,,19,,,,,,8,45,293,10,107,106,108', +'97,56,99,98,100,,101,109,110,,93,94,42,43,41,240,-598,-598,-598,-598', +'246,248,,,-598,-598,,,,,,254,255,,40,,,33,,,58,59,,,60,,35,237,,243', +'44,239,238,,235,236,247,245,241,20,242,,,,91,81,84,85,,86,88,87,89,', +',,,82,90,,,,,,,62,,83,95,96,291,74,75,71,9,57,,,,63,64,,,,67,,65,66', +'68,30,31,72,73,,,,,,29,28,27,103,102,104,105,,,19,,,,,,8,45,293,10,107', +'106,108,97,56,99,98,100,,101,109,110,,93,94,42,43,41,240,-598,-598,-598', +'-598,246,248,,,-598,-598,,,,,,254,255,,40,,,33,,,58,59,,,60,,35,237', +',243,44,239,238,,235,236,247,245,241,20,242,,,,91,81,84,85,,86,88,87', +'89,,,,,82,90,,,,,,,62,,83,95,96,291,74,75,71,9,57,,,,63,64,,,,67,,65', +'66,68,30,31,72,73,,,,,,29,28,27,103,102,104,105,,,19,,,,,,8,45,293,10', +'107,106,108,97,56,99,98,100,,101,109,110,,93,94,42,43,41,240,,,,,,,', +',,,,,,,,254,255,,40,,,33,,,58,59,,,60,,35,237,,243,44,239,238,,235,236', +',,241,20,242,,,,91,81,84,85,,86,88,87,89,,,,,82,90,,,,,,,62,,83,95,96', +'291,74,75,71,9,57,,,,63,64,,,,67,,65,66,68,30,31,72,73,,,,,,29,28,27', +'103,102,104,105,,,19,,,,,,8,45,293,10,107,106,108,97,56,99,98,100,,101', +'109,110,,93,94,42,43,41,240,,,,,,,,,,,,,,,,254,255,,40,,,33,,,58,59', +',,60,,35,237,,243,44,239,238,,235,236,,,241,20,242,,,,91,81,84,85,,86', +'88,87,89,,,,,82,90,,,,,,,62,,83,95,96,291,74,75,71,9,57,,,,63,64,,,', +'67,,65,66,68,30,31,72,73,,,,,,29,28,27,103,102,104,105,,,19,,,,,,8,45', +'293,10,107,106,108,97,56,99,98,100,,101,109,110,,93,94,42,43,41,240', +'-598,-598,-598,-598,246,248,,,-598,-598,,,,,,254,255,,40,,,295,,,58', +'59,,,60,,35,237,,243,44,239,238,,235,236,247,245,241,20,242,,,,91,81', +'84,85,,86,88,87,89,,,,,82,90,,,,,,,62,,83,95,96,291,74,75,71,9,57,,', +',63,64,,,,67,,65,66,68,30,31,72,73,,,,,,29,28,27,103,102,104,105,,,19', +',,,,,8,45,293,10,107,106,108,97,56,99,98,100,,101,109,110,,93,94,42', +'43,41,240,-598,-598,-598,-598,246,248,,,-598,-598,,,,,,254,255,,40,', +',33,,,58,59,,,60,,35,237,,243,44,239,238,,235,236,247,245,241,20,242', +',,,91,81,84,85,,86,88,87,89,,,,,82,90,,,,74,75,71,62,57,83,95,96,63', +'64,,,,67,,65,66,68,310,311,72,73,,,,,,306,307,313,103,102,104,105,,', +'232,,,,,,,45,,,107,106,108,97,56,99,98,100,,101,109,110,,93,94,42,43', +'41,240,-598,-598,-598,-598,246,248,,,-598,-598,,,,,,254,255,,225,,,231', +',,58,59,,,60,,,237,,243,44,239,238,,235,236,247,245,241,230,242,,,,91', +'81,84,85,,86,88,87,89,,,,,82,90,,,,74,75,71,62,57,83,95,96,63,64,,,', +'67,,65,66,68,310,311,72,73,,,,,,306,307,313,103,102,104,105,,,232,,', +',,,,45,,,107,106,108,97,56,99,98,100,,101,109,110,,93,94,42,43,41,240', +',,,,,,,,,,,,,,,254,255,,225,,,231,,,58,59,,,60,,,237,,243,44,239,238', +',235,236,,,,230,,,,,91,81,84,85,,86,88,87,89,,,,,82,90,,,,74,75,71,62', +'57,83,95,96,63,64,,,,67,,65,66,68,310,311,72,73,,,,,,306,307,313,103', +'102,104,105,,,232,,,,,,,45,,,107,106,108,97,56,99,98,100,,101,109,110', +',93,94,42,43,41,240,,,,,,,,,,,,,,,,254,255,,225,,,231,,,58,59,,,60,', +',237,,243,44,239,238,,235,236,,,,230,,,,,91,81,84,85,,86,88,87,89,,', +',,82,90,,,,,,,62,,83,95,96,74,75,71,9,57,,,,63,64,,,,67,,65,66,68,30', +'31,72,73,,,,,,29,28,27,103,102,104,105,,,19,,,,,,8,45,,10,107,106,108', +'97,56,99,98,100,,101,109,110,,93,94,42,43,41,240,,,,,,,,,,,,,,,,254', +'255,,40,,,33,,,58,59,,,60,,35,237,,,44,239,238,,235,236,,,,20,,,,,91', +'81,84,85,,86,88,87,89,,,,,82,90,,,,74,75,71,62,57,83,95,96,63,64,,,', +'67,,65,66,68,310,311,72,73,,,,,,306,307,313,103,102,104,105,,,232,,', +',,,,45,,,107,106,108,97,56,99,98,100,,101,109,110,,93,94,42,43,41,,', +',,,,,,,,,,,,,,,,,225,,,231,,,58,59,,,60,,,,,,44,,,,,,,,,230,,,,,91,81', +'84,85,,86,88,87,89,,,,,82,90,,,,74,75,71,62,57,83,95,96,63,64,,,,67', +',65,66,68,30,31,72,73,,,,,,29,28,27,103,102,104,105,,,19,,,,,,,45,,', +'107,106,108,97,56,99,98,100,,101,109,110,,93,94,42,43,41,,,,,,,,,,,', +',,,,,,,,225,,,231,,,58,59,,,60,,,,,,44,,,,,,,,,20,,,,,91,81,84,85,,86', +'88,87,89,,,,,82,90,,,,74,75,71,62,57,83,95,96,63,64,,,,67,,65,66,68', +'310,311,72,73,,,,,,306,307,313,103,102,104,105,,,232,,,,,,,45,,,107', +'106,108,97,56,99,98,100,,101,109,110,,93,94,42,43,41,,,,,,,,,,,,,,,', +',,,,225,,,231,,,58,59,,,60,,627,,,,44,,,,,,,,,230,,,,,91,81,84,85,,86', +'88,87,89,,,,,82,90,,,,74,75,71,62,57,83,95,96,63,64,,,,67,,65,66,68', +'310,311,72,73,,,,,,306,307,313,103,102,104,105,,,232,,,,,,,45,,,107', +'106,108,97,56,99,98,100,,101,109,110,,93,94,42,43,41,,,,,,,,,,,,,,,', +',,,,225,,,231,,,58,59,,,60,,404,,,,44,,,,,,,,,230,,,,,91,81,84,85,,86', +'88,87,89,,,,,82,90,,,,74,75,71,62,57,83,95,96,63,64,,,,67,,65,66,68', +'30,31,72,73,,,,,,29,28,27,103,102,104,105,,,232,,,,,,,45,,,107,106,108', +'97,56,99,98,100,285,101,109,110,,93,94,42,43,41,,,,,,,,,,,,,,,,,,,,225', +',,231,,,58,59,,,60,,283,,281,,44,,,286,,,,,,230,,,,,91,81,84,85,,86', +'88,87,89,,,,,82,90,,,,74,75,71,62,57,83,95,96,63,64,,,,67,,65,66,68', +'310,311,72,73,,,,,,306,307,313,103,102,104,105,,,232,,,,,,,45,,,107', +'106,108,97,56,99,98,100,,101,109,110,,93,94,42,43,41,,,,,,,,,,,,,,,', +',,,,225,,,231,,,58,59,,,60,,,,,,44,,,,,,,,,230,,,,,91,81,84,85,,86,88', +'87,89,,,,,82,90,,,,74,75,71,62,57,83,95,96,63,64,,,,67,,65,66,68,30', +'31,72,73,,,,,,29,28,27,103,102,104,105,,,232,,,,,,,45,,,107,106,108', +'97,56,99,98,100,285,101,109,110,,93,94,42,43,41,,,,,,,,,,,,,,,,,,,,225', +',,231,,,58,59,,,60,,283,,281,,44,,,286,,,,,,230,,,,,91,81,84,85,,86', +'88,87,89,,,,,82,90,,,,74,75,71,62,57,83,95,96,63,64,,,,67,,65,66,68', +'30,31,72,73,,,,,,29,28,27,103,102,104,105,,,232,,,,,,,45,,,107,106,108', +'97,56,99,98,100,285,101,109,110,,93,94,42,43,41,,,,,,,,,,,,,,,,,,,,225', +',,231,,,58,59,,,60,,283,,281,,44,,,286,,,,,,230,,,,,91,81,84,85,,86', +'88,87,89,,,,,82,90,,,,74,75,71,62,57,83,95,96,63,64,,,,67,,65,66,68', +'310,311,72,73,,,,,,306,307,313,103,102,104,105,,,232,,,,,,,45,,,107', +'106,108,97,56,99,98,100,285,101,109,110,,93,94,42,43,41,,,,,,,,,,,,', +',,,,,,,225,,,231,,,58,59,,,60,,,,281,,44,,,286,,,,,,230,,,,,91,81,84', +'85,,86,88,87,89,,,,,82,90,,,,74,75,71,62,57,83,95,96,63,64,,,,67,,65', +'66,68,310,311,72,73,,,,,,306,307,313,103,102,104,105,,,232,,,,,,,45', +',,107,106,108,97,56,99,98,100,,101,109,110,,93,94,42,43,41,,,,,,,,,', +',,,,,,,,,,225,,,231,,,58,59,,,60,,,,,,44,,,,,,,,,230,,,,,91,81,84,85', +',86,88,87,89,,,,,82,90,,,,74,75,71,62,57,83,95,96,63,64,,,,67,,65,66', +'68,310,311,72,73,,,,,,306,307,313,103,102,104,105,,,232,,,,,,,45,,,107', +'106,108,97,56,99,98,100,,101,109,110,,93,94,42,43,41,,,,,,,,,,,,,,,', +',,,,225,,,231,,,58,59,,,60,,,,,,44,,,,,,,,,230,,,,,91,81,84,85,,86,88', +'87,89,,,,,82,90,,,,74,75,71,62,57,83,95,96,63,64,,,,67,,65,66,68,310', +'311,72,73,,,,,,306,307,313,103,102,104,105,,,232,,,,,,,308,,,107,106', +'108,97,56,99,98,100,,101,109,110,,93,94,,,314,,,,,,,,,,,,,,,,,,,,304', +',,300,,,58,59,,,60,,,,,,,,,,,,,,,,,,,,91,81,84,85,,86,88,87,89,,,,,82', +'90,,,,74,75,71,62,57,83,95,96,63,64,,,,67,,65,66,68,310,311,72,73,,', +',,,306,307,313,103,102,104,105,,,232,,,,,,,45,,,107,106,108,97,56,99', +'98,100,,101,109,110,,93,94,42,43,41,,,,,,,,,,,,,,,,,,,,225,,,231,,,58', +'59,,,60,,,,,,44,,,,,,,,,230,,,,,91,81,84,85,,86,88,87,89,,,,,82,90,', +',,74,75,71,62,57,83,95,96,63,64,,,,67,,65,66,68,310,311,72,73,,,,,,306', +'307,313,103,102,104,105,,,232,,,,,,,45,,,107,106,108,97,56,99,98,100', +',101,109,110,,93,94,42,43,41,,,,,,,,,,,,,,,,,,,,225,,,231,,,58,59,,', +'60,,,,,,44,,,,,,,,,230,,,,,91,81,84,85,,86,88,87,89,,,,,82,90,,,,74', +'75,71,62,57,83,95,96,63,64,,,,67,,65,66,68,310,311,72,73,,,,,,306,307', +'313,103,102,104,105,,,232,,,,,,,308,,,107,106,108,97,56,99,98,100,,101', +'109,110,,93,94,,,314,,,,,,,,,,,,,,,,,,,,304,,,231,,,58,59,,,60,,,669', +',666,665,664,673,667,,,,,,,,,676,,91,81,84,85,,86,88,87,89,,,,,82,90', +',,,503,,671,62,,83,95,96,74,75,71,,57,684,683,,63,64,677,,,67,,65,66', +'68,30,31,72,73,,,,,,29,28,27,103,102,104,105,,,232,,,,,,,45,,,107,106', +'108,97,56,99,98,100,,101,109,110,,93,94,42,43,41,,,,,,,,,,,,,,,,,,,', +'225,,,231,,,58,59,,,60,,,,,,44,,,,,,,,,230,,,,,91,81,84,85,,86,88,87', +'89,,,,,82,90,,,,74,75,71,62,57,83,95,96,63,64,,,,67,,65,66,68,310,311', +'72,73,,,,,,306,307,313,103,102,104,105,,,232,,,,,,,308,,,107,106,108', +'97,56,99,98,100,,101,109,110,,93,94,,,314,,,,,,,,,,,,,,,,,,,,852,,,231', +',,58,59,,,60,,,,,,,,,,,,,,,,,,,,91,81,84,85,,86,88,87,89,,,,,82,90,', +',,74,75,71,62,57,83,95,96,63,64,,,,67,,65,66,68,310,311,72,73,,,,,,306', +'307,313,103,102,104,105,,,232,,,,,,,308,,,107,106,108,97,56,99,98,100', +',101,109,110,,93,94,,,314,,,,,,,,,,,,,,,,,,,,926,,,231,,,58,59,,,60', +',,,,,,,,,,,,,,,,,,,91,81,84,85,,86,88,87,89,,,,,82,90,,,,74,75,71,62', +'57,83,95,96,63,64,,,,67,,65,66,68,310,311,72,73,,,,,,306,307,313,103', +'102,104,105,,,232,,,,,,,45,,,107,106,108,97,56,99,98,100,,101,109,110', +',93,94,42,43,41,,,,,,,,,,,,,,,,,,,,225,,,231,,,58,59,,,60,,,,,,44,,', +',,,,,,230,,,,,91,81,84,85,,86,88,87,89,,,,,82,90,,,,74,75,71,62,57,83', +'95,96,63,64,,,,67,,65,66,68,310,311,72,73,,,,,,306,307,313,103,102,104', +'105,,,232,,,,,,,308,,,107,106,108,97,56,99,98,100,,101,109,110,,93,94', +',,314,,,,,,,,,,,,,,,,,,,,304,,,300,,,58,59,,,60,,,,,,,,,,,,,,,,,,,,91', +'81,84,85,,86,88,87,89,,,,,82,90,,,,74,75,71,62,57,83,95,96,63,64,,,', +'67,,65,66,68,310,311,72,73,,,,,,306,307,313,103,102,104,105,,,232,,', +',,,,308,,,107,106,108,97,56,99,98,100,,101,109,110,,93,94,,,314,,,,', +',,,,,,,,,,,,,,,304,,,300,,,58,59,,,60,,299,,,,,,,,,,,,,,,,,,91,81,84', +'85,,86,88,87,89,,,,,82,90,,,,74,75,71,62,57,83,95,96,63,64,,,,67,,65', +'66,68,310,311,72,73,,,,,,306,307,313,103,102,104,105,,,232,,,,,,,308', +',,107,106,108,97,56,99,98,100,,101,109,110,,93,94,,,314,,,,,,,,,,,,', +',,,,,,,304,,,231,,,58,59,,,60,,,669,,666,665,664,673,667,,,,,,,,,676', +',91,81,84,85,,86,88,87,89,,,,,82,90,,,,316,,671,62,,83,95,96,74,75,71', +'9,57,684,683,,63,64,677,,,67,,65,66,68,30,31,72,73,,,,,,29,28,27,103', +'102,104,105,,,19,,,,,,8,45,7,10,107,106,108,97,56,99,98,100,,101,109', +'110,,93,94,42,43,41,,,,,,,,,,,,,,,,,,,,40,,,33,,,58,59,,,60,,35,,,,44', +',,,,,,,,20,,,,,91,81,84,85,,86,88,87,89,,,,,82,90,,,,74,75,71,62,57', +'83,95,96,63,64,,,,67,,65,66,68,310,311,72,73,,,,,,306,307,313,103,102', +'104,105,,,232,,,,,,,45,,,107,106,108,97,56,99,98,100,,101,109,110,,93', +'94,42,43,41,,,,,,,,,,,,,,,,,,,,225,,,231,,,58,59,,,60,,,,,,44,,,,,,', +',,230,,,,,91,81,84,85,,86,88,87,89,,,,,82,90,,,,74,75,71,62,57,83,95', +'96,63,64,,,,67,,65,66,68,30,31,72,73,,,,,,29,28,27,103,102,104,105,', +',232,,,,,,,45,,,107,106,108,97,56,99,98,100,285,101,109,110,,93,94,42', +'43,41,,,,,,,,,,,,,,,,,,,,225,,,231,,,58,59,,,60,,283,,281,,44,,,286', +',,,,,230,,,,,91,81,84,85,,86,88,87,89,,,,,82,90,,,,74,75,71,62,57,83', +'95,96,63,64,,,,67,,65,66,68,310,311,72,73,,,,,,306,307,313,103,102,104', +'105,,,232,,,,,,,45,,,107,106,108,97,56,99,98,100,,101,109,110,,93,94', +'42,43,41,,,,,,,,,,,,,,,,,,,,225,,,231,,,58,59,,,60,,,,,,44,,,,,,,,,230', +',,,,91,81,84,85,,86,88,87,89,,,,,82,90,,,,74,75,71,62,57,83,95,96,63', +'64,,,,67,,65,66,68,310,311,72,73,,,,,,306,307,313,103,102,104,105,,', +'232,,,,,,,45,,,107,106,108,97,56,99,98,100,,101,109,110,,93,94,42,43', +'41,,,,,,,,,,,,,,,,,,,,225,,,231,,,58,59,,,60,,,,,,44,,,,,,,,,230,,,', +',91,81,84,85,,86,88,87,89,,,,,82,90,,,,74,75,71,62,57,83,95,96,63,64', +',,,67,,65,66,68,310,311,72,73,,,,,,306,307,313,103,102,104,105,,,232', +',,,,,,45,,,107,106,108,97,56,99,98,100,,101,109,110,,93,94,42,43,41', +',,,,,,,,,,,,,,,,,,,225,,,231,,,58,59,,,60,,,,,,44,,,,,,,,,230,,,,,91', +'81,84,85,,86,88,87,89,,,,,82,90,,,,,,,62,,83,95,96,74,75,71,9,57,,,', +'63,64,,,,67,,65,66,68,30,31,72,73,,,,,,29,28,27,103,102,104,105,,,19', +',,,,,8,45,7,10,107,106,108,97,56,99,98,100,,101,109,110,,93,94,42,43', +'41,,,,,,,,,,,,,,,,,,,,40,,,33,,,58,59,,,60,,35,,,,44,,,,,,,,,20,,,,', +'91,81,84,85,,86,88,87,89,,,,,82,90,,,,,,388,62,,83,95,96,74,75,71,,57', +',,,63,64,,,,67,,65,66,68,310,311,72,73,,,,,,306,307,313,103,102,104', +'105,,,232,,,,,,,45,,,107,106,108,97,56,99,98,100,,101,109,110,,93,94', +'42,43,41,,,,,,,,,,,,,,,,,,,,225,,,231,,,58,59,,,60,,,,,,44,,,,,,,,,230', +',,,,91,81,84,85,,86,88,87,89,,,,,82,90,,,,74,75,71,62,57,83,95,96,63', +'64,,,,67,,65,66,68,310,311,72,73,,,,,,306,307,313,103,102,104,105,,', +'232,,,,,,,45,,,107,106,108,97,56,99,98,100,,101,109,110,,93,94,42,43', +'41,,,,,,,,,,,,,,,,,,,,225,,,231,,,58,59,,,60,,,,,,44,,,,,,,,,230,,,', +',91,81,84,85,,86,88,87,89,,,,,82,90,,,,74,75,71,62,57,83,95,96,63,64', +',,,67,,65,66,68,30,31,72,73,,,,,,29,28,27,103,102,104,105,,,232,,,,', +',,45,,,107,106,108,97,56,99,98,100,,101,109,110,,93,94,42,43,41,,,,', +',,,,,,,,,,,,,,,225,,,231,,,58,59,,,60,,,,,,44,,,,,,,,,230,,,,,91,81', +'84,85,,86,88,87,89,,,,,82,90,,,,74,75,71,62,57,83,95,96,63,64,,,,67', +',65,66,68,310,311,72,73,,,,,,306,307,313,103,102,104,105,,,232,,,,,', +',45,,,107,106,108,97,56,99,98,100,,101,109,110,,93,94,42,43,41,,,,,', +',,,,,,,,,,,,,,225,,,231,,,58,59,,,60,,,,,,44,,,,,,,,,230,,,,,91,81,84', +'85,,86,88,87,89,,,,,82,90,,,,74,75,71,62,57,83,95,96,63,64,,,,67,,65', +'66,68,310,311,72,73,,,,,,306,307,313,103,102,104,105,,,232,,,,,,,45', +',,107,106,108,97,56,99,98,100,,101,109,110,,93,94,42,43,41,,,,,,,,,', +',,,,,,,,,,225,,,231,,,58,59,,,60,,,,,,44,,,,,,,,,230,,,,,91,81,84,85', +',86,88,87,89,,,,,82,90,,,,74,75,71,62,57,83,95,96,63,64,,,,67,,65,66', +'68,310,311,72,73,,,,,,306,307,313,103,102,104,105,,,232,,,,,,,45,,,107', +'106,108,97,56,99,98,100,,101,109,110,,93,94,42,43,41,,,,,,,,,,,,,,,', +',,,,225,,,231,,,58,59,,,60,,,,,,44,,,,,,,,,230,,,,,91,81,84,85,,86,88', +'87,89,,,,,82,90,,,,74,75,71,62,57,83,95,96,63,64,,,,67,,65,66,68,310', +'311,72,73,,,,,,306,307,313,103,102,104,105,,,232,,,,,,,45,,,107,106', +'108,97,56,99,98,100,,101,109,110,,93,94,42,43,41,,,,,,,,,,,,,,,,,,,', +'225,,,231,,,58,59,,,60,,,,,,44,,,,,,,,,230,,,,,91,81,84,85,,86,88,87', +'89,,,,,82,90,,,,74,75,71,62,57,83,95,96,63,64,,,,67,,65,66,68,310,311', +'72,73,,,,,,306,307,313,103,102,104,105,,,232,,,,,,,45,,,107,106,108', +'97,56,99,98,100,,101,109,110,,93,94,42,43,41,,,,,,,,,,,,,,,,,,,,225', +',,231,,,58,59,,,60,,,,,,44,,,,,,,,,230,,,,,91,81,84,85,,86,88,87,89', +',,,,82,90,,,,74,75,71,62,57,83,95,96,63,64,,,,67,,65,66,68,310,311,72', +'73,,,,,,306,307,313,103,102,104,105,,,232,,,,,,,45,,,107,106,108,97', +'56,99,98,100,,101,109,110,,93,94,42,43,41,,,,,,,,,,,,,,,,,,,,225,,,231', +',,58,59,,,60,,,,,,44,,,,,,,,,230,,,,,91,81,84,85,,86,88,87,89,,,,,82', +'90,,,,74,75,71,62,57,83,95,96,63,64,,,,67,,65,66,68,310,311,72,73,,', +',,,306,307,313,103,102,104,105,,,232,,,,,,,45,,,107,106,108,97,56,99', +'98,100,,101,109,110,,93,94,42,43,41,,,,,,,,,,,,,,,,,,,,225,,,231,,,58', +'59,,,60,,,,,,44,,,,,,,,,230,,,,,91,81,84,85,,86,88,87,89,,,,,82,90,', +',,74,75,71,62,57,83,95,96,63,64,,,,67,,65,66,68,310,311,72,73,,,,,,306', +'307,313,103,102,104,105,,,232,,,,,,,45,,,107,106,108,97,56,99,98,100', +',101,109,110,,93,94,42,43,41,,,,,,,,,,,,,,,,,,,,225,,,231,,,58,59,,', +'60,,,,,,44,,,,,,,,,230,,,,,91,81,84,85,,86,88,87,89,,,,,82,90,,,,74', +'75,71,62,57,83,95,96,63,64,,,,67,,65,66,68,310,311,72,73,,,,,,306,307', +'313,103,102,104,105,,,232,,,,,,,45,,,107,106,108,97,56,99,98,100,,101', +'109,110,,93,94,42,43,41,,,,,,,,,,,,,,,,,,,,225,,,231,,,58,59,,,60,,', +',,,44,,,,,,,,,230,,,,,91,81,84,85,,86,88,87,89,,,,,82,90,,,,74,75,71', +'62,57,83,95,96,63,64,,,,67,,65,66,68,310,311,72,73,,,,,,306,307,313', +'103,102,104,105,,,232,,,,,,,45,,,107,106,108,97,56,99,98,100,,101,109', +'110,,93,94,42,43,41,,,,,,,,,,,,,,,,,,,,225,,,231,,,58,59,,,60,,,,,,44', +',,,,,,,,230,,,,,91,81,84,85,,86,88,87,89,,,,,82,90,,,,74,75,71,62,57', +'83,95,96,63,64,,,,67,,65,66,68,310,311,72,73,,,,,,306,307,313,103,102', +'104,105,,,232,,,,,,,45,,,107,106,108,97,56,99,98,100,,101,109,110,,93', +'94,42,43,41,,,,,,,,,,,,,,,,,,,,225,,,231,,,58,59,,,60,,,,,,44,,,,,,', +',,230,,,,,91,81,84,85,,86,88,87,89,,,,,82,90,,,,74,75,71,62,57,83,95', +'96,63,64,,,,67,,65,66,68,310,311,72,73,,,,,,306,307,313,103,102,104', +'105,,,232,,,,,,,45,,,107,106,108,97,56,99,98,100,,101,109,110,,93,94', +'42,43,41,,,,,,,,,,,,,,,,,,,,225,,,231,,,58,59,,,60,,,,,,44,,,,,,,,,230', +',,,,91,81,84,85,,86,88,87,89,,,,,82,90,,,,74,75,71,62,57,83,95,96,63', +'64,,,,67,,65,66,68,310,311,72,73,,,,,,306,307,313,103,102,104,105,,', +'232,,,,,,,45,,,107,106,108,97,56,99,98,100,,101,109,110,,93,94,42,43', +'41,,,,,,,,,,,,,,,,,,,,225,,,231,,,58,59,,,60,,,,,,44,,,,,,,,,230,,,', +',91,81,84,85,,86,88,87,89,,,,,82,90,,,,74,75,71,62,57,83,95,96,63,64', +',,,67,,65,66,68,310,311,72,73,,,,,,306,307,313,103,102,104,105,,,232', +',,,,,,45,,,107,106,108,97,56,99,98,100,,101,109,110,,93,94,42,43,41', +',,,,,,,,,,,,,,,,,,,225,,,231,,,58,59,,,60,,,,,,44,,,,,,,,,230,,,,,91', +'81,84,85,,86,88,87,89,,,,,82,90,,,,74,75,71,62,57,83,95,96,63,64,,,', +'67,,65,66,68,310,311,72,73,,,,,,306,307,313,103,102,104,105,,,232,,', +',,,,45,,,107,106,108,97,56,99,98,100,,101,109,110,,93,94,42,43,41,,', +',,,,,,,,,,,,,,,,,225,,,231,,,58,59,,,60,,,,,,44,,,,,,,,,230,,,,,91,81', +'84,85,,86,88,87,89,,,,,82,90,,,,74,75,71,62,57,83,95,96,63,64,,,,67', +',65,66,68,30,31,72,73,,,,,,29,28,27,103,102,104,105,,,232,,,,,,,45,', +',107,106,108,97,56,99,98,100,285,101,109,110,,93,94,42,43,41,,,,,,,', +',,,,,,,,,,,,225,,,231,,,58,59,,,60,,283,,281,,44,,,286,,,,,,230,,,,', +'91,81,84,85,,86,88,87,89,,,,,82,90,,,,74,75,71,62,57,83,95,96,63,64', +',,,67,,65,66,68,30,31,72,73,,,,,,29,28,27,103,102,104,105,,,232,,,,', +',,45,,,107,106,108,97,56,99,98,100,285,101,109,110,,93,94,42,43,41,', +',,,,,,,,,,,,,,,,,,225,,,231,,,58,59,,,60,,283,,281,,44,,,286,,,,,,230', +',,,,91,81,84,85,,86,88,87,89,,,,,82,90,,,,74,75,71,62,57,83,95,96,63', +'64,,,,67,,65,66,68,310,311,72,73,,,,,,306,307,313,103,102,104,105,,', +'232,,,,,,,308,,,107,106,108,97,56,99,98,100,,101,109,110,,93,94,,,314', +',,,,,,,,,,,,,,,,,,,852,,,231,,,58,59,,,60,,,,,,,,,,,,,,,,,,,,91,81,84', +'85,,86,88,87,89,,,,,82,90,,,,74,75,71,62,57,83,95,96,63,64,,,,67,,65', +'66,68,30,31,72,73,,,,,,29,28,27,103,102,104,105,,,232,,,,,,,45,,,107', +'106,108,97,56,99,98,100,285,101,109,110,,93,94,42,43,41,,,,,,,,,,,,', +',,,,,,,225,,,231,,,58,59,,,60,,283,,281,,44,,,286,,,,,,230,,,,,91,81', +'84,85,,86,88,87,89,,,,,82,90,220,,,74,75,71,62,57,83,95,96,63,64,,,', +'67,,65,66,68,310,311,72,73,,,,,,306,307,313,103,102,104,105,,,232,,', +',,,,45,,,107,106,108,97,56,99,98,100,,101,109,110,,93,94,42,43,41,,', +',,,,,,,,,,,,,,,,,225,,,231,,,58,59,,,60,,,,,,44,,,,,,,,,230,,,,,91,81', +'84,85,,86,88,87,89,,,,,82,90,,,,74,75,71,62,57,83,95,96,63,64,,,,67', +',65,66,68,310,311,72,73,,,,,,306,307,313,103,102,104,105,,,232,,,,,', +',45,,,107,106,108,97,56,99,98,100,,101,109,110,,93,94,42,43,41,,,,,', +',,,,,,,,,,,,,,225,,,231,,,58,59,,,60,,,,,,44,,,,,,,,,230,,,,,91,81,84', +'85,,86,88,87,89,,,,,82,90,,,,74,75,71,62,57,83,95,96,63,64,,,,67,,65', +'66,68,310,311,72,73,,,,,,306,307,313,103,102,104,105,,,232,,,,,,,45', +',,107,106,108,97,56,99,98,100,,101,109,110,,93,94,42,43,41,,,,,,,,,', +',,,,,,,,,,225,,,231,,,58,59,,,60,,,,,,44,,,,,,,,,230,,,,,91,81,84,85', +',86,88,87,89,,,,,82,90,,,,74,75,71,62,57,83,95,96,63,64,,,,67,,65,66', +'68,310,311,72,73,,,,,,306,307,313,103,102,104,105,,,232,,,,,,,45,,,107', +'106,108,97,56,99,98,100,,101,109,110,,93,94,42,43,41,,,,,,,,,,,,,,,', +',,,,225,,,231,,,58,59,,,60,,,,,,44,,,,,,,,,230,,,,,91,81,84,85,,86,88', +'87,89,,,,,82,90,,,,74,75,71,62,57,83,95,96,63,64,,,,67,,65,66,68,310', +'311,72,73,,,,,,306,307,313,103,102,104,105,,,232,,,,,,,45,,,107,106', +'108,97,56,99,98,100,,101,109,110,,93,94,42,43,41,,,,,,,,,,,,,,,,,,,', +'225,,,231,,,58,59,,,60,,,,,,44,,,,,,,,,230,,,,,91,81,84,85,,86,88,87', +'89,,,,,82,90,,,,74,75,71,62,57,83,95,96,63,64,,,,67,,65,66,68,310,311', +'72,73,,,,,,306,307,313,103,102,104,105,,,232,,,,,,,45,,,107,106,108', +'97,56,99,98,100,,101,109,110,,93,94,42,43,41,,,,,,,,,,,,,,,,,,,,225', +',,231,,,58,59,,,60,,,,,,44,,,,,,,,,230,,,,,91,81,84,85,,86,88,87,89', +',,,,82,90,,,,74,75,71,62,57,83,95,96,63,64,,,,67,,65,66,68,310,311,72', +'73,,,,,,306,307,313,103,102,104,105,,,232,,,,,,,45,,,107,106,108,97', +'56,99,98,100,,101,109,110,,93,94,42,43,41,,,,,,,,,,,,,,,,,,,,225,,,231', +',,58,59,,,60,,,,,,44,,,,,,,,,230,,,,,91,81,84,85,,86,88,87,89,,,,,82', +'90,,,,74,75,71,62,57,83,95,96,63,64,,,,67,,65,66,68,310,311,72,73,,', +',,,306,307,313,103,102,104,105,,,232,,,,,,,45,,,107,106,108,97,56,99', +'98,100,,101,109,110,,93,94,42,43,41,,,,,,,,,,,,,,,,,,,,225,,,231,,,58', +'59,,,60,,,,,,44,,,,,,,,,230,,,,,91,81,84,85,,86,88,87,89,,,,,82,90,', +',,74,75,71,62,57,83,95,96,63,64,,,,67,,65,66,68,310,311,72,73,,,,,,306', +'307,313,103,102,104,105,,,232,,,,,,,45,,,107,106,108,97,56,99,98,100', +',101,109,110,,93,94,42,43,41,,,,,,,,,,,,,,,,,,,,225,,,231,,,58,59,,', +'60,,,,,,44,,,,,,,,,230,,,,,91,81,84,85,,86,88,87,89,,,,,82,90,,,,74', +'75,71,62,57,83,95,96,63,64,,,,67,,65,66,68,310,311,72,73,,,,,,306,307', +'313,103,102,104,105,,,232,,,,,,,45,,,107,106,108,97,56,99,98,100,,101', +'109,110,,93,94,42,43,41,,,,,,,,,,,,,,,,,,,,225,,,231,,,58,59,,,60,,', +',,,44,,,,,,,,,230,,,,,91,81,84,85,,86,88,87,89,,,,,82,90,,,,74,75,71', +'62,57,83,95,96,63,64,,,,67,,65,66,68,30,31,72,73,,,,,,29,28,27,103,102', +'104,105,,,19,,,,,,,45,,,107,106,108,97,56,99,98,100,,101,109,110,,93', +'94,42,43,41,,,,,,,,,,,,,,,,,,,,225,,,231,,,58,59,,,60,,,,,,44,,,,,,', +',,20,,,,,91,81,84,85,,86,88,87,89,,,,,82,90,,,,74,75,71,62,57,83,95', +'96,63,64,,,,67,,65,66,68,310,311,72,73,,,,,,306,307,313,103,102,104', +'105,,,232,,,,,,,45,,,107,106,108,97,56,99,98,100,,101,109,110,,93,94', +'42,43,41,,,,,,,,,,,,,,,,,,,,225,,,231,,,58,59,,,60,,,,,,44,,,,,,,,,230', +',,,,91,81,84,85,,86,88,87,89,,,,,82,90,,,,74,75,71,62,57,83,95,96,63', +'64,,,,67,,65,66,68,30,31,72,73,,,,,,29,28,27,103,102,104,105,,,232,', +',,,,,45,,,107,106,108,97,56,99,98,100,,101,109,110,,93,94,42,43,41,', +',,,,,,,,,,,,,,,,,,225,,,231,,,58,59,,,60,,,,,,44,,,,,,,,,230,,,,,91', +'81,84,85,,86,88,87,89,,,,,82,90,,,,74,75,71,62,57,83,95,96,63,64,,,', +'67,,65,66,68,30,31,72,73,,,,,,29,28,27,103,102,104,105,,,232,,,,,,,45', +',,107,106,108,97,56,99,98,100,,101,109,110,,93,94,42,43,41,,,,,,,,,', +',,,,,,,,,,225,,,231,,,58,59,,,60,,,,,,44,,,,,,,,,230,,,,,91,81,84,85', +',86,88,87,89,,,,,82,90,,,,74,75,71,62,57,83,95,96,63,64,,,,67,,65,66', +'68,30,31,72,73,,,,,,29,28,27,103,102,104,105,,,232,,,,,,,45,,,107,106', +'108,97,56,99,98,100,,101,109,110,,93,94,42,43,41,,,,,,,,,,,,,,,,,,,', +'225,,,231,,,58,59,,,60,,,,,,44,,,,,,,,,230,,,,,91,81,84,85,,86,88,87', +'89,,,,,82,90,,,,74,75,71,62,57,83,95,96,63,64,,,,67,,65,66,68,30,31', +'72,73,,,,,,29,28,27,103,102,104,105,,,19,,,,,,,45,,,107,106,108,97,56', +'99,98,100,,101,109,110,,93,94,42,43,41,,,,,,,,,,,,,,,,,,,,225,,,231', +',,58,59,,,60,,,,,,44,,,,,,,,,20,,,,,91,81,84,85,,86,88,87,89,,,,,82', +'90,220,,,74,75,71,62,57,83,95,96,63,64,,,,67,,65,66,68,30,31,72,73,', +',,,,29,28,27,103,102,104,105,,,232,,,,,,,45,,,107,106,108,97,56,99,98', +'100,,101,109,110,,93,94,42,43,41,,,,,,,,,,,,,,,,,,,,225,,,231,,,58,59', +',,60,,,,,,44,,,,,,,,,230,,,,,91,81,84,85,,86,88,87,89,,,,,82,90,,,,74', +'75,71,62,57,83,95,96,63,64,,,,67,,65,66,68,30,31,72,73,,,,,,29,28,27', +'103,102,104,105,,,232,,,,,,,45,,,107,106,108,97,56,99,98,100,,101,109', +'110,,93,94,42,43,41,,,,,,,,,,,,,,,,,,,,225,,,231,,,58,59,,,60,,,,,,44', +',,,,,,,,230,,,,,91,81,84,85,,86,88,87,89,,,,,82,90,,,,74,75,71,62,57', +'83,95,96,63,64,,,,67,,65,66,68,310,311,72,73,,,,,,306,307,313,103,102', +'104,105,,,232,,,,,,,45,,,107,106,108,97,56,99,98,100,285,101,109,110', +',93,94,42,43,41,,,,,,,,,,,,,,,,,,,,225,,,231,,,58,59,,,60,,,,281,,44', +',,286,,,,,,230,,,,,91,81,84,85,,86,88,87,89,,,,,82,90,,,,74,75,71,62', +'57,83,95,96,63,64,,,,67,,65,66,68,310,311,72,73,,,,,,306,307,313,103', +'102,104,105,,,232,,,,,,,45,,,107,106,108,97,56,99,98,100,285,101,109', +'110,,93,94,42,43,41,,,,,,,,,,,,,,,,,,,,225,,,231,,,58,59,,,60,,627,', +'281,,44,,,286,,,,,,230,,,,,91,81,84,85,,86,88,87,89,,,,,82,90,,,,74', +'75,71,62,57,83,95,96,63,64,,,,67,,65,66,68,30,31,72,73,,,,,,29,28,27', +'103,102,104,105,,,19,,,,,,,45,,,107,106,108,97,56,99,98,100,,101,109', +'110,,93,94,42,43,41,,,,,,,,,,,,,,,,,,,,225,,,231,,,58,59,,,60,,,,,,44', +',,,,,,,,20,,,,,91,81,84,85,,86,88,87,89,,,,,82,90,,,,74,75,71,62,57', +'83,95,96,63,64,,,,67,,65,66,68,310,311,72,73,,,,,,306,307,313,103,102', +'104,105,,,232,,,,,,,45,,,107,106,108,97,56,99,98,100,,101,109,110,,93', +'94,42,43,41,,,,,,,,,,,,,,,,,,,,225,,,231,,,58,59,,,60,,,,,,44,,,,,,', +',,230,,,,,91,81,84,85,,86,88,87,89,,,,,82,90,,,,74,75,71,62,57,83,95', +'96,63,64,,,,67,,65,66,68,310,311,72,73,,,,,,306,307,313,103,102,104', +'105,,,232,,,,,,,45,,,107,106,108,97,56,99,98,100,,101,109,110,,93,94', +'42,43,41,,,,,,,,,,,,,,,,,,,,225,,,231,,,58,59,,,60,,730,,,,44,,,,,,', +',,230,,,,,91,81,84,85,,86,88,87,89,,,,,82,90,,,,74,75,71,62,57,83,95', +'96,63,64,,,,67,,65,66,68,30,31,72,73,,,,,,29,28,27,103,102,104,105,', +',19,,,,,,,45,,,107,106,108,97,56,99,98,100,,101,109,110,,93,94,42,43', +'41,,,,,,,,,,,,,,,,,,,,225,,,231,,,58,59,,,60,,,,,,44,,,,,,,,,20,,,,', +'91,81,84,85,,86,88,87,89,,,,,82,90,,,,74,75,71,62,57,83,95,96,63,64', +',,,67,,65,66,68,30,31,72,73,,,,,,29,28,27,103,102,104,105,,,19,,,,,', +',45,,,107,106,108,97,56,99,98,100,,101,109,110,,93,94,42,43,41,,,,,', +',,,,,,,,,,,,,,225,,,231,,,58,59,,,60,,,,,,44,,,,,,,,,20,,,,,91,81,84', +'85,,86,88,87,89,,,,,82,90,,,,74,75,71,62,57,83,95,96,63,64,,,,67,,65', +'66,68,30,31,72,73,,,,,,29,28,27,103,102,104,105,,,232,,,,,,,45,,,107', +'106,108,97,56,99,98,100,,101,109,110,,93,94,42,43,41,,,,,,,,,,,,,,,', +',,,,225,,,231,,,58,59,,,60,,404,,,,44,,,,,,,,,230,,,,,91,81,84,85,,86', +'88,87,89,,,,,82,90,,,,74,75,71,62,57,83,95,96,63,64,,,,67,,65,66,68', +'310,311,72,73,,,,,,306,307,313,103,102,104,105,,,232,,,,,,,45,,,107', +'106,108,97,56,99,98,100,,101,109,110,,93,94,42,43,41,,,,,,,,,,,,,,,', +',,,,225,,,231,,,58,59,,,60,,,,,,44,,,,,,,,,230,,,,,91,81,84,85,,86,88', +'87,89,,,,,82,90,,,,74,75,71,62,57,83,95,96,63,64,,,,67,,65,66,68,310', +'311,72,73,,,,,,306,307,313,103,102,104,105,,,232,,,,,,,45,,,107,106', +'108,97,56,99,98,100,,101,109,110,,93,94,42,43,41,,,,,,,,,,,,,,,,,,,', +'225,,,231,,,58,59,,,60,,,,,,44,,,,,,,,,230,,,,,91,81,84,85,,86,88,87', +'89,,,,,82,90,,,,74,75,71,62,57,83,95,96,63,64,,,,67,,65,66,68,30,31', +'72,73,,,,,,29,28,27,103,102,104,105,,,232,,,,,,,45,,,107,106,108,97', +'56,99,98,100,285,101,109,110,,93,94,42,43,41,,,,,,,,,,,,,,,,,,,,225', +',,231,,,58,59,,,60,,283,,281,,44,,,286,,,,,,230,,,,,91,81,84,85,,86', +'88,87,89,,,,,82,90,,,,74,75,71,62,57,83,95,96,63,64,,,,67,,65,66,68', +'30,31,72,73,,,,,,29,28,27,103,102,104,105,,,232,,,,,,,45,,,107,106,108', +'97,56,99,98,100,,101,109,110,,93,94,42,43,41,,,,,,,,,,,,,,,,,,,,225', +',,231,,,58,59,,,60,,,,,,44,,,,,,,,,230,,,,,91,81,84,85,,86,88,87,89', +',,,,82,90,,,,74,75,71,62,57,83,95,96,63,64,,,,67,,65,66,68,310,311,72', +'73,,,,,,306,307,313,103,102,104,105,,,232,,,,,,,45,,,107,106,108,97', +'56,99,98,100,,101,109,110,,93,94,42,43,41,,,,,,,,,,,,,,,,,,,,225,,,231', +',,58,59,,,60,,,,,,44,,,,,,,,,230,,,,,91,81,84,85,,86,88,87,89,,,,,82', +'90,,,,74,75,71,62,57,83,95,96,63,64,,,,67,,65,66,68,30,31,72,73,,,,', +',29,28,27,103,102,104,105,,,19,,,,,,,45,,,107,106,108,97,56,99,98,100', +',101,109,110,,93,94,42,43,41,,,,,,,,,,,,,,,,,,,,225,,,231,,,58,59,,', +'60,,,,,,44,,,,,,,,,20,,,,,91,81,84,85,,86,88,87,89,,,,,82,90,,,,74,75', +'71,62,57,83,95,96,63,64,,,,67,,65,66,68,30,31,72,73,,,,,,29,28,27,103', +'102,104,105,,,19,,,,,,,45,,,107,106,108,97,56,99,98,100,,101,109,110', +',93,94,42,43,41,,,,,,,,,,,,,,,,,,,,225,,,231,,,58,59,,,60,,,,,,44,,', +',,,,,,20,,,,,91,81,84,85,,86,88,87,89,,,,,82,90,,,,74,75,71,62,57,83', +'95,96,63,64,,,,67,,65,66,68,30,31,72,73,,,,,,29,28,27,103,102,104,105', +',,232,,,,,,,45,,,107,106,108,97,56,99,98,100,285,101,109,110,,93,94', +'42,43,41,,,,,,,,,,,,,,,,,,,,225,,,231,,,58,59,,,60,,283,,281,,44,,,286', +',,,,,230,,,,,91,81,84,85,,86,88,87,89,,,,,82,90,,,,74,75,71,62,57,83', +'95,96,63,64,,,,67,,65,66,68,30,31,72,73,,,,,,29,28,27,103,102,104,105', +',,232,,,,,,,45,,,107,106,108,97,56,99,98,100,285,101,109,110,,93,94', +'42,43,41,,,,,,,,,,,,,,,,,,,,225,,,231,,,58,59,,,60,,283,,281,,44,,,286', +',,,,,230,,,,,91,81,84,85,,86,88,87,89,,,,,82,90,,,,74,75,71,62,57,83', +'95,96,63,64,,,,67,,65,66,68,310,311,72,73,,,,,,306,307,313,103,102,104', +'105,,,232,,,,,,,45,,,107,106,108,97,56,99,98,100,,101,109,110,,93,94', +'42,43,41,,,,,,,,,,,,,,,,,,,,225,,,231,,,58,59,,,60,,283,,,,44,,,,,,', +',,230,,,,,91,81,84,85,,86,88,87,89,,,,,82,90,,,,74,75,71,62,57,83,95', +'96,63,64,,,,67,,65,66,68,30,31,72,73,,,,,,29,28,27,103,102,104,105,', +',232,,,,,,,45,,,107,106,108,97,56,99,98,100,285,101,109,110,,93,94,42', +'43,41,,,,,,,,,,,,,,,,,,,,225,,,231,,,58,59,,,60,,283,,281,,44,,,286', +',,,,,230,,,,,91,81,84,85,,86,88,87,89,,,,,82,90,,,,74,75,71,62,57,83', +'95,96,63,64,,,,67,,65,66,68,30,31,72,73,,,,,,29,28,27,103,102,104,105', +',,232,,,,,,,45,,,107,106,108,97,56,99,98,100,,101,109,110,,93,94,42', +'43,41,,,,,,,,,,,,,,,,,,,,225,,,231,,,58,59,,,60,,,,,,44,,,,,,,,,230', +',,,,91,81,84,85,,86,88,87,89,,,,,82,90,,,,74,75,71,62,57,83,95,96,63', +'64,,,,67,,65,66,68,310,311,72,73,,,,,,306,307,313,103,102,104,105,,', +'232,,,,,,,45,,,107,106,108,97,56,99,98,100,285,101,109,110,,93,94,42', +'43,41,,,,,,,,,,,,,,,,,,,,225,,,231,,,58,59,,,60,,,,,,44,,,286,,,,,,230', +',,,,91,81,84,85,,86,88,87,89,,,,,82,90,,,,74,75,71,62,57,83,95,96,63', +'64,,,,67,,65,66,68,310,311,72,73,,,,,,306,307,313,103,102,104,105,,', +'232,,,,,,,45,,,107,106,108,97,56,99,98,100,285,101,109,110,,93,94,42', +'43,41,,,,,,,,,,,,,,,,,,,,225,,,231,,,58,59,,,60,,627,,,,44,,,286,,,', +',,230,,,,,91,81,84,85,,86,88,87,89,,,,,82,90,,,,74,75,71,62,57,83,95', +'96,63,64,,,,67,,65,66,68,30,31,72,73,,,,,,29,28,27,103,102,104,105,', +',232,,,,,,,45,,,107,106,108,97,56,99,98,100,,101,109,110,,93,94,42,43', +'41,,,,,,,,,,,,,,,,,,,,225,,,231,,,58,59,,,60,,404,,,,44,,,,,,,,,230', +',,,,91,81,84,85,,86,88,87,89,,,,,82,90,,,,74,75,71,62,57,83,95,96,63', +'64,,,,67,,65,66,68,30,31,72,73,,,,,,29,28,27,103,102,104,105,,,19,,', +',,,,45,,,107,106,108,97,56,99,98,100,,101,109,110,,93,94,42,43,41,,', +',,,,,,,,,,,,,,,,,225,,,231,,,58,59,,,60,,,,,,44,,,,,,,,,20,,,,,91,81', +'84,85,,86,88,87,89,,,,,82,90,,,,74,75,71,62,57,83,95,96,63,64,,,,67', +',65,66,68,30,31,72,73,,,,,,29,28,27,103,102,104,105,,,19,,,,,,,45,,', +'107,106,108,97,56,99,98,100,,101,109,110,,93,94,42,43,41,,,,,,,,,,,', +',,,,,,,,225,,,231,,,58,59,,,60,,,,,,44,,,,,,,,,20,,,,,91,81,84,85,,86', +'88,87,89,,,,,82,90,,,,74,75,71,62,57,83,95,96,63,64,,,,67,,65,66,68', +'310,311,72,73,,,,,,306,307,313,103,102,104,105,,,232,,,,,,,45,,,107', +'106,108,97,56,99,98,100,,101,109,110,,93,94,42,43,41,,,,,,,,,,,,,,,', +',,,,225,,,231,,,58,59,,,60,,,,,,44,,,,,,,,,230,,,,,91,81,84,85,,86,88', +'87,89,,,,,82,90,,,,74,75,71,62,57,83,95,96,63,64,,,,67,,65,66,68,310', +'311,72,73,,,,,,306,307,313,103,102,104,105,,,232,,,,,,,45,,,107,106', +'108,97,56,99,98,100,,101,109,110,,93,94,42,43,41,,,,,,,,,,,,,,,,,,,', +'225,,,231,,,58,59,,,60,,,,,,44,,,,,,,,,230,,,,,91,81,84,85,,86,88,87', +'89,,,,,82,90,,,,74,75,71,62,57,83,95,96,63,64,,,,67,,65,66,68,310,311', +'72,73,,,,,,306,307,313,103,102,104,105,,,232,,,,,,,308,,,107,106,108', +'97,56,99,98,100,,101,109,110,,93,94,,,314,,,,,,,,,,,,,,,,,,,,304,,,300', +',,58,59,,,60,,,,,,,,,,,,,,,,,,,,91,81,84,85,,86,88,87,89,,,,,82,90,', +',,74,75,71,62,57,83,95,96,63,64,,,,67,,65,66,68,30,31,72,73,,,,,,29', +'28,27,103,102,104,105,,,232,,,,,,,45,,,107,106,108,97,56,99,98,100,285', +'101,109,110,,93,94,42,43,41,,,,,,,,,,,,,,,,,,,,225,,,231,,,58,59,,,60', +',283,,281,,44,,,286,,,,,,230,,,,,91,81,84,85,,86,88,87,89,,,,,82,90', +',,,,,,62,,83,95,96,74,75,71,9,57,,,,63,64,,,,67,,65,66,68,30,31,72,73', +',,,,,29,28,27,103,102,104,105,,,19,,,,,,8,45,,10,107,106,108,97,56,99', +'98,100,,101,109,110,,93,94,42,43,41,,,,,,,,,,,,,,,,,,,,40,,,33,,,58', +'59,,,60,,35,,,,44,,,,,,,,,20,,,,,91,81,84,85,,86,88,87,89,,,,,82,90', +',,,74,75,71,62,57,83,95,96,63,64,,,,67,,65,66,68,310,311,72,73,,,,,', +'306,307,313,103,102,104,105,,,232,,,,,,,308,,,107,106,108,97,56,99,98', +'100,,101,109,110,,93,94,,,314,,,,,,,,,,,,,,,,,,,,304,,,300,,,58,59,', +',60,,,,,,,,,,,,,,,,,,,,91,81,84,85,,86,88,87,89,,,,,82,90,,,,74,75,71', +'62,57,83,95,96,63,64,,,,67,,65,66,68,30,31,72,73,,,,,,29,28,27,103,102', +'104,105,,,19,,,,,,,45,,,107,106,108,97,56,99,98,100,,101,109,110,,93', +'94,42,43,41,,,,,,,,,,,,,,,,,,,,225,,,231,,,58,59,,,60,,,,,,44,,,,,,', +',,20,,,,,91,81,84,85,,86,88,87,89,,,,,82,90,,,,74,75,71,62,57,83,95', +'96,63,64,,,,67,,65,66,68,30,31,72,73,,,,,,29,28,27,103,102,104,105,', +',19,,,,,,,45,,,107,106,108,97,56,99,98,100,,101,109,110,,93,94,42,43', +'41,,,,,,,,,,,,,,,,,,,,225,,,231,,,58,59,,,60,,,,,,44,,,,,,,,,20,,,,', +'91,81,84,85,,86,88,87,89,,,,,82,90,,,,74,75,71,62,57,83,95,96,63,64', +',,,67,,65,66,68,30,31,72,73,,,,,,29,28,27,103,102,104,105,,,19,,,,,', +',45,,,107,106,108,97,56,99,98,100,,101,109,110,,93,94,42,43,41,,,,,', +',,,,,,,,,,,,,,225,,,231,,,58,59,,,60,,,,,,44,,,,,,,,,20,,,,,91,81,84', +'85,,86,88,87,89,,,,,82,90,,,,74,75,71,62,57,83,95,96,63,64,,,,67,,65', +'66,68,310,311,72,73,,,,,,306,307,313,103,102,104,105,,,232,,,,,,,45', +',,107,106,108,97,56,99,98,100,,101,109,110,,93,94,42,43,41,,,,,,,,,', +',,,,,,,,,,225,,,231,,,58,59,,,60,,,,,,44,,,,,,,,,230,,,,,91,81,84,85', +',86,88,87,89,,,,,82,90,,,,74,75,71,62,57,83,95,96,63,64,,,,67,,65,66', +'68,30,31,72,73,,,,,,29,28,27,103,102,104,105,,,19,,,,,,,45,,,107,106', +'108,97,56,99,98,100,,101,109,110,,93,94,42,43,41,,,,,,,,,,,,,,,,,,,', +'225,,,231,,,58,59,,,60,,,,,,44,,,,,,,,,20,,,,,91,81,84,85,,86,88,87', +'89,,,,,82,90,,,,74,75,71,62,57,83,95,96,63,64,,,,67,,65,66,68,310,311', +'72,73,,,,,,306,307,313,103,102,104,105,,,232,,,,,,,45,,,107,106,108', +'97,56,99,98,100,,101,109,110,,93,94,42,43,41,,,,,,,,,,,,,,,,,,,,225', +',,231,,,58,59,,,60,,,,,,44,,,,,,,,,230,,,,,91,81,84,85,,86,88,87,89', +',,,,82,90,,,,74,75,71,62,57,83,95,96,63,64,,,,67,,65,66,68,30,31,72', +'73,,,,,,29,28,27,103,102,104,105,,,19,,,,,,,45,,,107,106,108,97,56,99', +'98,100,,101,109,110,,93,94,42,43,41,,,,,,,,,,,,,,,,,,,,225,,,231,,,58', +'59,,,60,,,,,,44,,,,,,,,,20,,,,,91,81,84,85,,86,88,87,89,,,,,82,90,,', +',74,75,71,62,57,83,95,96,63,64,,,,67,,65,66,68,30,31,72,73,,,,,,29,28', +'27,103,102,104,105,,,19,,,,,,,45,,,107,106,108,97,56,99,98,100,,101', +'109,110,,93,94,42,43,41,,,,,,,,,,,,,,,,,,,,225,,,231,,,58,59,,,60,,', +',,,44,,,,,,,,,20,,,,,91,81,84,85,,86,88,87,89,,,,,82,90,,,,74,75,71', +'62,57,83,95,96,63,64,,,,67,,65,66,68,310,311,72,73,,,,,,306,307,313', +'103,102,104,105,,,232,,,,,,,45,,,107,106,108,97,56,99,98,100,285,101', +'109,110,,93,94,42,43,41,,,,,,,,,,,,,,,,,,,,225,,,231,,,58,59,,,60,,283', +',,,44,,,286,,,,,,230,,,,,91,81,84,85,,86,88,87,89,,,,,82,90,,,,74,75', +'71,62,57,83,95,96,63,64,,,,67,,65,66,68,310,311,72,73,,,,,,306,307,313', +'103,102,104,105,,,232,,,,,,,45,,,107,106,108,97,56,99,98,100,285,101', +'109,110,,93,94,42,43,41,,,,,,,,,,,,,,,,,,,,225,,,231,,,58,59,,,60,,', +',,,44,,,286,,,,,,230,,,,,91,81,84,85,,86,88,87,89,,,,,82,90,,,,74,75', +'71,62,57,83,95,96,63,64,,,,67,,65,66,68,310,311,72,73,,,,,,306,307,313', +'103,102,104,105,,,232,,,,,,,45,,,107,106,108,97,56,99,98,100,,101,109', +'110,,93,94,42,43,41,,,,,,,,,,,,,,,,,,,,225,,,231,,,58,59,,,60,,,,,,44', +',,,,,,,,230,,,,,91,81,84,85,,86,88,87,89,,,,,82,90,,,,74,75,71,62,57', +'83,95,96,63,64,,,,67,,65,66,68,30,31,72,73,,,,,,29,28,27,103,102,104', +'105,,,19,,,,,,,45,,,107,106,108,97,56,99,98,100,,101,109,110,,93,94', +'42,43,41,,,,,,,,,,,,,,,,,,,,225,,,231,,,58,59,,,60,,,,,,44,,,,,,,,,20', +',,,,91,81,84,85,,86,88,87,89,,,,,82,90,,,,74,75,71,62,57,83,95,96,63', +'64,,,,67,,65,66,68,30,31,72,73,,,,,,29,28,27,103,102,104,105,,,19,,', +',,,,45,,,107,106,108,97,56,99,98,100,,101,109,110,,93,94,42,43,41,,', +',,,,,,,,,,,,,,,,,225,,,231,,,58,59,,,60,,,,,,44,,,,,,,,,20,,,,,91,81', +'84,85,,86,88,87,89,,,,,82,90,,,,74,75,71,62,57,83,95,96,63,64,,,,67', +',65,66,68,30,31,72,73,,,,,,29,28,27,103,102,104,105,,,19,,,,,,,45,,', +'107,106,108,97,56,99,98,100,,101,109,110,,93,94,42,43,41,,,,,,,,,,,', +',,,,,,,,225,,,231,,,58,59,,,60,,,,,,44,,,,,,,,,20,,,,,91,81,84,85,,86', +'88,87,89,,,,,82,90,115,,,,,114,62,,83,95,96,74,75,71,,57,,,,63,64,,', +',67,,65,66,68,310,311,72,73,,,,,,306,307,313,103,102,104,105,,,232,', +',,,,,308,,,107,106,108,97,56,99,98,100,,101,109,110,,93,94,,,314,,,', +',,,,,,,,,,,,,,,,348,,,33,,,58,59,,,60,,35,669,,666,665,664,673,667,', +',,,,,,,676,,91,81,84,85,,86,88,87,89,,,,,82,90,,,,,,671,62,,83,95,96', +'74,75,71,9,57,684,683,,63,64,677,,,67,,65,66,68,30,31,72,73,,,,,,29', +'28,27,103,102,104,105,,,19,,,,,,8,45,293,10,107,106,108,97,56,99,98', +'100,,101,109,110,,93,94,42,43,41,,,,,,,,,,,,,,,,,,,,40,,,33,,,58,59', +',,60,,35,,,,44,,,,,,,,,20,,,,,91,81,84,85,,86,88,87,89,,,,,82,90,,,', +',,388,62,,83,95,96,74,75,71,,57,,,,63,64,,,,67,,65,66,68,310,311,72', +'73,,,,,,306,307,313,103,102,104,105,,,232,,,,,,,308,,,107,106,108,353', +'56,99,98,354,,101,109,110,,93,94,,,314,,,,,,,,,,,,,,,,,360,,,355,,,231', +',,58,59,,,60,,,,,,,,,,,,,,,,,,,,91,81,84,85,,86,88,87,89,,,,,82,90,', +',,74,75,71,62,57,83,95,96,63,64,,,,67,,65,66,68,310,311,72,73,,,,,,306', +'307,313,103,102,104,105,,,232,,,,,,,45,,,107,106,108,97,56,99,98,100', +',101,109,110,,93,94,42,43,41,,,,,,,,,,,,,,,,,,,,225,,,231,,,58,59,,', +'60,,,,,,44,,,,,,,,,230,,,,,91,81,84,85,,86,88,87,89,,,,,82,90,,,,74', +'75,71,62,57,83,95,96,63,64,,,,67,,65,66,68,310,311,72,73,,,,,,306,307', +'313,103,102,104,105,,,232,,,,,,,308,,,107,106,108,353,56,99,98,354,', +'101,109,110,,93,94,,,314,,,,,,,,,,,,,,,,,,,,355,,,231,,,58,59,,,60,', +',,,,,,,,,,,,,,,,,,91,81,84,85,,86,88,87,89,,,,,82,90,,,,74,75,71,62', +'57,83,95,96,63,64,,,,67,,65,66,68,310,311,72,73,,,,,,306,307,313,103', +'102,104,105,,,232,,,,,,,45,,,107,106,108,97,56,99,98,100,285,101,109', +'110,,93,94,42,43,41,,,,,,,,,,,,,,,,,,,,225,,,231,,,58,59,,,60,,,,281', +',44,,,286,,,,,,230,,,,,91,81,84,85,,86,88,87,89,,,,,82,90,,,,74,75,71', +'62,57,83,95,96,63,64,,,,67,,65,66,68,310,311,72,73,,,,,,306,307,313', +'103,102,104,105,,,232,,,,,,,45,,,107,106,108,97,56,99,98,100,285,101', +'109,110,,93,94,42,43,41,,,,,,,,,,,,,,,,,,,,225,,,231,,,58,59,,,60,,627', +',281,,44,,,286,,,,,,230,,,,,91,81,84,85,,86,88,87,89,,,,,82,90,,,,74', +'75,71,62,57,83,95,96,63,64,,,,67,,65,66,68,30,31,72,73,,,,,,29,28,27', +'103,102,104,105,,,19,,,,,,,45,,,107,106,108,97,56,99,98,100,,101,109', +'110,,93,94,42,43,41,,,,,,,,,,,,,,,,,,,,225,,,231,,,58,59,,,60,,,,,,44', +',,,,,,,,20,,,,,91,81,84,85,,86,88,87,89,,,,,82,90,,,,74,75,71,62,57', +'83,95,96,63,64,,,,67,,65,66,68,310,311,72,73,,,,,,306,307,313,103,102', +'104,105,,,232,,,,,,,308,,,107,106,108,97,56,99,98,100,,101,109,110,', +'93,94,,,314,,,,,,,,,,,,,,,,,,,,304,,,300,,,58,59,,,60,,,,,,,,,,,,,,', +',,,,,91,81,84,85,,86,88,87,89,,,,,82,90,,,,74,75,71,62,57,83,95,96,63', +'64,,,,67,,65,66,68,310,311,72,73,,,,,,306,307,313,103,102,104,105,,', +'232,,,,,,,45,,,107,106,108,97,56,99,98,100,,101,109,110,,93,94,42,43', +'41,,,,,,,,,,,,,,,,,,,,225,,,231,519,,58,59,,,60,,,,,,44,,,,,,,,,230', +',,,,91,81,84,85,,86,88,87,89,,,,,82,90,,,,,-580,,62,,83,95,96,-580,-580', +'-580,,,-580,-580,-580,,-580,,,,,,,,,-580,-580,-580,-580,,,,,,,,-580', +'-580,,-580,-580,-580,-580,-580,,,,,,,,,,,,,,,,,,,,,,,-580,-580,-580', +'-580,-580,-580,-580,-580,-580,-580,-580,-580,-580,-580,,,-580,-580,-580', +',,-580,,,-580,,,-580,-580,,-580,,-580,,-580,,-580,-580,,-580,-580,-580', +'-580,-580,,-580,-580,-580,,,,,,,,,,,,,,-580,,,-580,-580,-580,-580,-581', +'-580,,-580,,,,-581,-581,-581,,,-581,-581,-581,,-581,,,,,,,,,-581,-581', +'-581,-581,,,,,,,,-581,-581,,-581,-581,-581,-581,-581,,,,,,,,,,,,,,,', +',,,,,,,-581,-581,-581,-581,-581,-581,-581,-581,-581,-581,-581,-581,-581', +'-581,,,-581,-581,-581,,,-581,,,-581,,,-581,-581,,-581,,-581,,-581,,-581', +'-581,,-581,-581,-581,-581,-581,,-581,-581,-581,,,,,,,,,,,,,,-581,,,-581', +'-581,-581,-581,-280,-581,,-581,,,,-280,-280,-280,,,-280,-280,-280,,-280', +',,,,,,,,,-280,-280,-280,,,,,,,,-280,-280,,-280,-280,-280,-280,-280,', +',,,,,,,,,,,,,,,,,,,,,-280,-280,-280,-280,-280,-280,-280,-280,-280,-280', +'-280,-280,-280,-280,,,-280,-280,-280,,,-280,,,-280,,,-280,-280,,-280', +',-280,,-280,,-280,-280,,-280,-280,-280,-280,-280,,-280,,-280,669,,666', +'665,664,673,667,,,,,,,-280,,676,-280,-280,-280,-280,-244,-280,,-280', +',,,-244,-244,-244,,,-244,-244,-244,,-244,671,,,,,,,,-244,-244,-244,684', +'683,,,,677,,,-244,-244,,-244,-244,-244,-244,-244,,,,,,,,,,,,,,,,,,,', +',,,-244,-244,-244,-244,-244,-244,-244,-244,-244,-244,-244,-244,-244', +'-244,,,-244,-244,-244,,,-244,,265,-244,,,-244,-244,,-244,,-244,,-244', +',-244,-244,,-244,-244,-244,-244,-244,,-244,-244,-244,,,,,,,,,,,,,,-244', +',-414,-244,-244,,-244,,-244,-414,-414,-414,,,-414,-414,-414,,-414,,', +',,,,,,-414,-414,-414,,,,,,,,,-414,-414,,-414,-414,-414,-414,-414,,,', +',,,,,,,,,,,,,,,,,,,-414,-414,-414,-414,-414,-414,-414,-414,-414,-414', +'-414,-414,-414,-414,,,-414,-414,-414,,,-414,,265,-414,,,-414,-414,,-414', +',-414,,-414,,-414,-414,,-414,-414,-414,-414,-414,,-414,-414,-414,,,', +',,,,,,,,,,-414,,-244,-414,-414,,-414,,-414,-244,-244,-244,,,-244,-244', +'-244,669,-244,666,665,664,673,667,,,,-244,-244,,,,676,,,,,,-244,-244', +',-244,-244,-244,-244,-244,,,,,,,,,671,,,,,,,,,681,680,684,683,,,,677', +',,,,,,,,-244,,-296,,,,,-244,,-296,-296,-296,265,-244,-296,-296,-296', +'220,-296,,,,,,,,,,-296,-296,,,,,,-244,-244,,-296,-296,,-296,-296,-296', +'-296,-296,,,,,-244,,,-244,,,,,-244,,,,,,,,,,-296,-296,-296,-296,-296', +'-296,-296,-296,-296,-296,-296,-296,-296,-296,,,-296,-296,-296,,,-296', +',274,-296,,,-296,-296,,-296,,-296,,-296,,-296,-296,,-296,-296,-296,-296', +'-296,,-296,,-296,,,,,,,,,,,,,,-296,,,-296,-296,,-296,,-296,175,186,176', +'199,172,192,182,181,202,203,197,180,179,174,200,204,205,184,173,187', +'191,193,185,178,,,,194,201,196,195,188,198,183,171,190,189,,,,,,170', +'177,168,169,165,166,167,126,128,,,127,,,,,,,,159,160,,156,138,139,140', +'147,144,146,,,141,142,,,,161,162,148,149,,,,,,,,,,,,,,153,152,,137,158', +'155,154,163,150,151,145,143,135,157,136,,,164,91,,,,,,,,,,,,,,90,175', +'186,176,199,172,192,182,181,202,203,197,180,179,174,200,204,205,184', +'173,187,191,193,185,178,,,,194,201,196,195,188,198,183,171,190,189,', +',,,,170,177,168,169,165,166,167,126,128,,,127,,,,,,,,159,160,,156,138', +'139,140,147,144,146,,,141,142,,,,161,162,148,149,,,,,,,,,,,,,,153,152', +',137,158,155,154,163,150,151,145,143,135,157,136,,,164,91,,,,,,,,,,', +',,,90,175,186,176,199,172,192,182,181,202,203,197,180,179,174,200,204', +'205,184,173,187,191,193,185,178,,,,194,201,196,195,188,198,183,171,190', +'189,,,,,,170,177,168,169,165,166,167,126,128,,,127,,,,,,,,159,160,,156', +'138,139,140,147,144,146,,,141,142,,,,161,162,148,149,,,,,,,,,,,,,,153', +'152,,137,158,155,154,163,150,151,145,143,135,157,136,,,164,91,,,,,,', +',,,,,,,90,175,186,176,199,172,192,182,181,202,203,197,180,179,174,200', +'204,205,184,173,187,191,193,185,178,,,,194,201,196,195,188,198,183,171', +'190,189,,,,,,170,177,168,169,165,166,167,126,128,125,,127,,,,,,,,159', +'160,,156,138,139,140,147,144,146,,,141,142,,,,161,162,148,149,,,,,,', +',,,,,,,153,152,,137,158,155,154,163,150,151,145,143,135,157,136,,,164', +'91,,,,,,,,,,,,,,90,175,186,176,199,172,192,182,181,202,203,197,180,179', +'174,200,204,205,184,173,187,191,193,185,178,,,,194,201,196,371,370,372', +'369,171,190,189,,,,,,170,177,168,169,366,367,368,364,128,99,98,365,', +'101,,,,,,159,160,,156,138,139,140,147,144,146,,,141,142,,,,161,162,148', +'149,,,,,,376,,,,,,,,153,152,,137,158,155,154,163,150,151,145,143,135', +'157,136,,,164,175,186,176,199,172,192,182,181,202,203,197,180,179,174', +'200,204,205,184,173,187,191,193,185,178,,,,194,201,196,195,188,198,183', +'171,190,189,,,,,,170,177,168,169,165,166,167,126,128,,,127,,,,,,,,159', +'160,,156,138,139,140,147,144,146,,,141,142,,,,161,162,148,149,,,,,,', +',,,,,,,153,152,,137,158,155,154,163,150,151,145,143,135,157,136,697', +'417,164,,698,,,,,,,,159,160,,156,138,139,140,147,144,146,,,141,142,', +',,161,162,148,149,,,,,,265,,,,,,,,153,152,,137,158,155,154,163,150,151', +'145,143,135,157,136,475,417,164,,476,,,,,,,,159,160,,156,138,139,140', +'147,144,146,,,141,142,,,,161,162,148,149,,,,,,,,,,,,,,153,152,,137,158', +'155,154,163,150,151,145,143,135,157,136,608,424,164,,609,,,,,,,,159', +'160,,156,138,139,140,147,144,146,,,141,142,,,,161,162,148,149,,,,,,265', +',,,,,,,153,152,,137,158,155,154,163,150,151,145,143,135,157,136,606', +'417,164,,607,,,,,,,,159,160,,156,138,139,140,147,144,146,,,141,142,', +',,161,162,148,149,,,,,,265,,,,,,,,153,152,,137,158,155,154,163,150,151', +'145,143,135,157,136,637,417,164,,638,,,,,,,,159,160,,156,138,139,140', +'147,144,146,,,141,142,,,,161,162,148,149,,,,,,265,,,,,,,,153,152,,137', +'158,155,154,163,150,151,145,143,135,157,136,640,424,164,,641,,,,,,,', +'159,160,,156,138,139,140,147,144,146,,,141,142,,,,161,162,148,149,,', +',,,265,,,,,,,,153,152,,137,158,155,154,163,150,151,145,143,135,157,136', +'969,424,164,,968,,,,,,,,159,160,,156,138,139,140,147,144,146,,,141,142', +',,,161,162,148,149,,,,,,265,,,,,,,,153,152,,137,158,155,154,163,150', +'151,145,143,135,157,136,606,417,164,,607,,,,,,,,159,160,,156,138,139', +'140,147,144,146,,,141,142,,,,161,162,148,149,,,,,,265,,,,,,,,153,152', +',137,158,155,154,163,150,151,145,143,135,157,136,608,424,164,,609,,', +',,,,,159,160,,156,138,139,140,147,144,146,,,141,142,,,,161,162,148,149', +',,,,,265,,,,,,,,153,152,,137,158,155,154,163,150,151,145,143,135,157', +'136,995,417,164,,996,,,,,,,,159,160,,156,138,139,140,147,144,146,,,141', +'142,,,,161,162,148,149,,,,,,265,,,,,,,,153,152,,137,158,155,154,163', +'150,151,145,143,135,157,136,997,424,164,,998,,,,,,,,159,160,,156,138', +'139,140,147,144,146,,,141,142,,,,161,162,148,149,,,,,,265,,,,,,,,153', +'152,,137,158,155,154,163,150,151,145,143,135,157,136,420,424,164,,419', +',,,,,,,159,160,,156,138,139,140,147,144,146,,,141,142,,,,161,162,148', +'149,,,,,,265,,,,,,,,153,152,,137,158,155,154,163,150,151,145,143,135', +'157,136,475,417,164,,476,,,,,,,,159,160,,156,138,139,140,147,144,146', +',,141,142,,,,161,162,148,149,,,,,,265,,,,,,,,153,152,,137,158,155,154', +'163,150,151,145,143,135,157,136,702,424,164,,703,,,,,,,,159,160,,156', +'138,139,140,147,144,146,,,141,142,,,,161,162,148,149,,,,,,265,,,,,,', +',153,152,,137,158,155,154,163,150,151,145,143,135,157,136,699,424,164', +',700,,,,,,,,159,160,,156,138,139,140,147,144,146,,,141,142,,,,161,162', +'148,149,,,,,,265,,,,,,,,153,152,,137,158,155,154,163,150,151,145,143', +'135,157,136,413,417,164,,414,,,,,,,,159,160,,156,138,139,140,147,144', +'146,,,141,142,,,,161,162,148,149,,,,,,265,,,,,,,,153,152,,137,158,155', +'154,163,150,151,145,143,135,157,136,,669,164,666,665,664,673,667,,669', +',666,665,664,673,667,676,,,,,,,,676,,669,,666,665,664,673,667,,,,,,671', +',,676,,,,,671,681,680,684,683,,,,677,681,680,684,683,,,,677,671,,669', +',666,665,664,673,667,681,680,684,683,,,,677,676,,669,,666,665,664,673', +'667,,669,,666,665,664,673,667,676,,,,,671,,,676,,,,,,681,680,684,683', +',,,677,671,,,,,,,,671,,,684,683,,,,677,681,680,684,683,,,669,677,666', +'665,664,673,667,669,,666,665,664,673,667,669,676,666,665,664,673,667', +'669,676,666,665,664,673,667,,676,,,,,,,676,671,,,,,,,671,,,,684,683', +',671,,677,,684,683,,671,,677,,684,683,,,,677,,684,683,,,669,677,666', +'665,664,673,667,,669,,666,665,664,673,667,676,,,,,,,,676,,669,,666,665', +'664,673,667,,,,,,671,655,,676,,,,,671,681,680,684,683,,,,677,681,680', +'684,683,,,,677,671,,669,,666,665,664,673,667,681,680,684,683,,,,677', +'676,,669,,666,665,664,673,667,,669,,666,665,664,673,667,676,,,,,671', +',,676,,,,,,,,684,683,,,,677,671,,,,,,,,671,681,680,684,683,,,,677,681', +'680,684,683,,,,677' ] + racc_action_table = arr = ::Array.new(24863, nil) + idx = 0 + clist.each do |str| + str.split(',', -1).each do |i| + arr[idx] = i.to_i unless i.empty? + idx += 1 + end + end + +clist = [ +'420,226,338,414,618,558,558,420,420,420,359,695,349,420,420,632,420', +'58,19,861,1016,383,888,632,365,420,384,698,647,647,224,365,330,337,337', +'330,420,420,995,420,420,420,420,420,339,996,750,368,638,637,414,997', +'1019,367,368,538,226,58,414,19,367,820,788,697,686,686,420,420,420,420', +'420,420,420,420,420,420,420,420,420,420,1,546,420,420,420,224,420,383', +'345,346,420,618,384,420,893,821,893,539,420,558,420,750,420,420,558', +'420,420,420,420,420,419,420,420,420,638,637,359,419,419,419,338,349', +'647,419,419,338,419,420,997,695,420,420,695,420,695,420,698,861,1016', +'359,888,420,861,1016,359,888,419,419,61,419,419,419,419,419,638,637', +'995,638,637,538,699,995,339,996,538,638,637,339,996,997,820,788,697', +'700,997,7,419,419,419,419,419,419,419,419,419,419,419,419,419,419,546', +'309,419,419,419,10,419,345,346,821,419,539,573,419,821,12,539,575,419', +'378,419,329,419,419,329,419,419,419,419,419,609,419,443,419,223,699', +'13,609,609,609,562,562,609,609,609,61,609,419,700,557,419,419,16,419', +'557,419,609,609,609,437,437,419,22,607,38,309,609,609,366,609,609,609', +'609,609,355,366,573,573,355,699,379,575,575,378,378,378,573,443,309', +'223,619,575,700,606,314,314,609,609,609,609,609,609,609,609,609,609', +'609,609,609,609,26,38,609,609,609,37,609,609,607,38,609,41,41,609,609', +'619,609,40,609,380,609,45,609,609,562,609,609,609,609,609,381,609,100', +'609,379,379,379,111,606,100,100,100,481,437,100,100,100,609,100,342', +'609,609,609,609,342,609,100,609,100,100,100,609,314,314,26,354,413,653', +'100,100,653,100,100,100,100,100,805,481,805,805,805,917,805,380,380', +'380,369,26,917,41,41,206,353,369,381,381,381,917,100,100,100,100,100', +'100,100,100,100,100,100,100,100,100,473,413,100,100,100,354,100,100', +'482,413,100,318,354,100,100,225,100,354,100,776,100,354,100,100,227', +'100,100,100,100,100,374,100,353,100,364,473,228,374,382,353,354,364', +'232,482,353,385,805,100,353,640,100,100,100,100,3,100,608,100,318,3', +'39,100,264,608,608,608,318,353,608,608,608,776,608,944,278,944,944,944', +'776,944,125,608,608,608,608,125,125,776,913,702,15,913,608,608,279,608', +'608,608,608,608,282,640,382,382,382,549,776,39,640,385,385,385,549,640', +'293,39,294,640,296,589,297,549,608,608,608,608,608,608,608,608,608,608', +'608,608,608,608,640,15,608,608,608,702,608,608,24,15,608,298,702,608', +'608,24,608,702,608,944,608,702,608,608,79,608,608,608,608,608,589,608', +'608,608,372,371,79,370,589,304,702,372,371,829,370,307,79,608,829,824', +'608,608,608,608,824,608,97,608,240,240,240,608,240,97,97,97,240,240', +'97,97,97,240,97,240,240,240,240,240,240,240,97,308,97,97,97,240,240', +'240,240,240,240,240,97,97,240,97,97,97,97,97,333,240,313,333,240,240', +'240,240,240,240,240,240,315,240,240,240,319,240,240,240,240,240,97,97', +'97,97,97,97,97,97,97,97,97,97,97,97,522,522,97,97,97,240,97,97,240,322', +'97,240,240,97,97,240,97,327,97,289,97,240,97,97,289,97,97,97,97,97,240', +'97,331,97,332,240,240,240,240,334,240,240,240,240,985,985,343,97,240', +'240,97,97,97,97,344,97,240,97,240,240,240,97,497,497,497,497,497,497', +'17,17,46,497,497,793,793,348,497,46,497,497,497,497,497,497,497,350', +'46,394,400,403,497,497,497,497,497,497,497,566,566,497,405,566,566,566', +'432,497,497,497,497,497,497,497,497,497,497,497,497,409,497,497,497', +'411,497,497,497,497,497,432,432,432,432,432,432,432,432,432,432,432', +'347,432,432,974,412,432,432,347,497,421,974,497,429,439,497,497,347', +'451,497,974,497,432,452,432,497,432,432,790,432,432,432,432,432,497', +'432,453,454,790,497,497,497,497,357,497,497,497,497,479,483,357,498', +'497,497,499,432,502,432,504,357,497,509,497,497,497,922,922,922,922', +'922,922,790,790,927,922,922,790,512,520,922,927,922,922,922,922,922', +'922,922,521,927,523,535,540,922,922,922,922,922,922,922,541,560,922', +'570,578,580,586,408,922,922,922,922,922,922,922,922,922,922,922,922', +'590,922,922,922,595,922,922,922,922,922,408,408,408,408,408,408,408', +'408,408,408,408,925,408,408,924,600,408,408,925,922,610,924,922,838', +'612,922,922,925,617,922,924,922,408,838,408,922,408,408,624,408,408', +'408,408,408,922,408,626,631,634,922,922,922,922,222,922,922,922,922', +'636,639,222,642,922,922,643,408,838,838,646,222,922,838,922,922,922', +'711,711,711,711,711,711,648,651,923,711,711,657,658,660,711,923,711', +'711,711,711,711,711,711,661,923,662,670,678,711,711,711,711,711,711', +'711,682,685,711,688,693,696,705,611,711,711,711,711,711,711,711,711', +'711,711,711,711,710,711,711,711,729,711,711,711,711,711,611,611,611', +'611,611,611,611,611,611,611,611,998,611,611,508,734,611,611,998,711', +'752,508,711,998,753,711,711,998,755,711,508,711,611,756,611,711,611', +'611,757,611,611,611,611,611,711,611,759,760,761,711,711,711,711,320', +'711,711,711,711,762,766,320,770,711,711,771,611,775,779,782,320,711', +'783,711,711,711,706,706,706,706,706,706,786,789,305,706,706,804,806', +'811,706,305,706,706,706,706,706,706,706,814,305,823,827,828,706,706', +'706,706,706,706,706,831,849,706,849,849,849,832,849,706,706,706,706', +'706,706,706,706,706,706,706,706,848,706,706,706,852,706,706,706,706', +'706,645,645,645,645,645,645,645,645,645,645,645,703,645,645,303,854', +'645,645,703,706,868,303,706,703,869,706,706,703,873,706,303,706,645', +'874,645,706,645,645,876,645,645,645,645,645,706,645,877,879,882,706', +'706,706,706,302,706,706,706,706,884,890,302,891,706,706,897,645,901', +'903,906,302,706,907,706,706,706,769,769,769,769,769,769,908,909,301', +'769,769,911,926,946,769,301,769,769,769,769,769,769,769,968,301,969', +'970,975,769,769,769,769,769,769,769,976,967,769,967,967,967,977,967', +'769,769,769,769,769,769,769,769,769,769,769,769,978,769,769,769,979', +'769,769,769,769,769,834,834,834,834,834,834,834,834,834,834,834,851', +'834,834,14,980,834,834,851,769,981,14,769,983,986,769,769,851,987,769', +'14,769,834,988,834,769,834,834,989,834,834,834,834,834,769,834,990,991', +'994,769,769,769,769,1007,769,769,769,769,1017,1018,,,769,769,,834,,', +',,769,,769,769,769,123,123,123,123,123,123,,,,123,123,,,,123,,123,123', +'123,123,123,123,123,496,496,496,496,496,123,123,123,123,123,123,123', +',,123,6,6,6,6,6,123,123,123,123,123,123,123,123,123,123,123,123,,123', +'123,123,,123,123,123,123,123,427,427,427,427,427,427,427,427,427,427', +'427,641,427,427,,,427,427,641,123,,,123,641,,123,123,641,,123,,123,427', +',427,123,427,427,,427,427,427,427,427,123,427,,,,123,123,123,123,,123', +'123,123,123,,,,,123,123,,427,,,,,123,,123,123,123,0,0,0,0,0,0,,,,0,0', +',,,0,,0,0,0,0,0,0,0,292,292,292,292,292,0,0,0,0,0,0,0,,,0,,,,,,0,0,0', +'0,0,0,0,0,0,0,0,0,,0,0,0,,0,0,0,0,0,731,731,731,731,731,731,731,731', +'731,731,731,,731,731,,,731,731,,0,,,0,,,0,0,,,0,,0,731,,731,0,731,731', +',731,731,731,731,731,0,731,,,,0,0,0,0,,0,0,0,0,,,,,0,0,,731,,,,,0,,0', +'0,0,721,721,721,721,721,721,,,,721,721,,,,721,,721,721,721,721,721,721', +'721,,,,,,721,721,721,721,721,721,721,,,721,,,,,,721,721,721,721,721', +'721,721,721,721,721,721,721,,721,721,721,,721,721,721,721,721,736,736', +'736,736,736,736,736,736,736,736,736,,736,736,,,736,736,,721,,,721,,', +'721,721,,,721,,721,736,,736,721,736,736,,736,736,736,736,736,721,736', +',,,721,721,721,721,,721,721,721,721,,,,,721,721,,736,,,,,721,,721,721', +'721,955,955,955,955,955,955,,,,955,955,,,,955,,955,955,955,955,955,955', +'955,,,,,,955,955,955,955,955,955,955,,,955,,,,,,955,955,955,955,955', +'955,955,955,955,955,955,955,,955,955,955,,955,955,955,955,955,738,738', +'738,738,738,738,738,738,738,738,738,,738,738,,,738,738,,955,,,955,,', +'955,955,,,955,,955,738,,738,955,738,738,,738,738,738,738,738,955,738', +',,,955,955,955,955,,955,955,955,955,,,,,955,955,,738,,,,,955,,955,955', +'955,534,534,534,534,534,534,,,,534,534,,,,534,,534,534,534,534,534,534', +'534,,,,,,534,534,534,534,534,534,534,,,534,,,,,,534,534,534,534,534', +'534,534,534,534,534,534,534,,534,534,534,,534,534,534,534,534,741,741', +'741,741,741,741,741,741,741,741,741,,741,741,,,741,741,,534,,,534,,', +'534,534,,,534,,534,741,,741,534,741,741,,741,741,741,741,741,534,741', +',,,534,534,534,534,,534,534,534,534,,,,,534,534,,741,,,,,534,,534,534', +'534,300,300,300,300,300,300,,,,300,300,,,,300,,300,300,300,300,300,300', +'300,,,,,,300,300,300,300,300,300,300,,,300,,,,,,300,300,300,300,300', +'300,300,300,300,300,300,300,,300,300,300,,300,300,300,300,300,743,743', +'743,743,743,743,743,743,743,743,743,,743,743,,,743,743,,300,,,300,,', +'300,300,,,300,,300,743,,743,300,743,743,,743,743,743,743,743,300,743', +',,,300,300,300,300,,300,300,300,300,,,,,300,300,,743,,,,,300,,300,300', +'300,325,325,325,325,325,325,,,,325,325,,,,325,,325,325,325,325,325,325', +'325,,,,,,325,325,325,325,325,325,325,,,325,,,,,,325,325,325,325,325', +'325,325,325,325,325,325,325,,325,325,325,,325,325,325,325,325,745,745', +'745,745,745,745,745,745,745,745,745,,745,745,,,745,745,,325,,,325,,', +'325,325,,,325,,325,745,,745,325,745,745,,745,745,745,745,745,325,745', +',,,325,325,325,325,,325,325,325,325,,,,,325,325,,745,,,,,325,,325,325', +'325,858,858,858,858,858,858,,,,858,858,,,,858,,858,858,858,858,858,858', +'858,,,,,,858,858,858,858,858,858,858,,,858,,,,,,858,858,858,858,858', +'858,858,858,858,858,858,858,,858,858,858,,858,858,858,858,858,472,472', +'472,472,472,472,472,472,472,472,472,,472,472,,,472,472,,858,,,858,,', +'858,858,,,858,,858,472,,472,858,472,472,,472,472,472,472,472,858,472', +',,,858,858,858,858,,858,858,858,858,,,,,858,858,472,472,,,,,858,,858', +'858,858,616,616,616,616,616,616,,,,616,616,,,,616,,616,616,616,616,616', +'616,616,,,,,,616,616,616,616,616,616,616,,,616,,,,,,616,616,616,616', +'616,616,616,616,616,616,616,616,,616,616,616,,616,616,616,616,616,518', +'518,518,518,518,518,518,518,518,518,518,,518,518,,,518,518,,616,,,616', +',,616,616,,,616,,616,518,,518,616,518,518,,518,518,518,518,518,616,518', +',,,616,616,616,616,,616,616,616,616,,,,,616,616,,518,,,,,616,,616,616', +'616,208,208,208,208,208,208,,,,208,208,,,,208,,208,208,208,208,208,208', +'208,,,,,,208,208,208,208,208,208,208,,,208,,,,,,208,208,208,208,208', +'208,208,208,208,208,208,208,,208,208,208,,208,208,208,208,208,21,21', +'21,21,21,21,21,21,21,21,21,,21,21,,,21,21,,208,,,208,,,208,208,,,208', +',208,21,,21,208,21,21,,21,21,21,21,21,208,21,,,,208,208,208,208,,208', +'208,208,208,,,,,208,208,,21,,,,,208,,208,208,208,231,231,231,231,231', +'231,,,,231,231,,,,231,,231,231,231,231,231,231,231,,,,,,231,231,231', +'231,231,231,231,,,231,,,,,,231,231,231,231,231,231,231,231,231,231,231', +'231,,231,231,231,,231,231,231,231,231,276,276,276,276,276,276,276,276', +'276,276,276,,276,276,,,276,276,,231,,,231,,,231,231,,,231,,231,276,', +'276,231,276,276,,276,276,276,276,276,231,276,,,,231,231,231,231,,231', +'231,231,231,,,,,231,231,,276,,,,,231,,231,231,231,781,781,781,781,781', +'781,,,,781,781,,,,781,,781,781,781,781,781,781,781,,,,,,781,781,781', +'781,781,781,781,,,781,,,,,,781,781,781,781,781,781,781,781,781,781,781', +'781,,781,781,781,,781,781,781,781,781,837,837,837,837,837,837,837,837', +'837,837,837,,837,837,,,837,837,,781,,,781,,,781,781,,,781,,781,837,', +'837,781,837,837,,837,837,837,837,837,781,837,,,,781,781,781,781,,781', +'781,781,781,,,,,781,781,,837,,,,,781,,781,781,781,33,33,33,33,33,33', +',,,33,33,,,,33,,33,33,33,33,33,33,33,,,,,,33,33,33,33,33,33,33,,802', +'33,802,802,802,,802,33,33,33,33,33,33,33,33,33,33,33,33,,33,33,33,,33', +'33,33,33,33,883,,883,883,883,,883,,802,,,449,,,,,,802,,33,,,33,,,33', +'33,,,33,,33,,,,33,,883,,,,,,449,33,,883,449,449,33,33,33,33,,33,33,33', +'33,,,,,33,33,,671,,671,671,671,33,671,33,33,33,953,953,953,953,953,953', +',,,953,953,,,,953,,953,953,953,953,953,953,953,,,,,671,953,953,953,953', +'953,953,953,468,671,953,,,,450,,953,953,953,953,953,953,953,953,953', +'953,953,953,,953,953,953,,953,953,953,953,953,462,,468,,,,468,468,450', +'468,468,,450,450,,,462,462,,953,,,953,,,953,953,,469,953,,953,462,,462', +'953,462,462,,462,462,,,462,953,462,,,,953,953,953,953,,953,953,953,953', +',,469,,953,953,469,469,,469,469,,953,,953,953,953,815,815,815,815,815', +'815,,,,815,815,,,,815,,815,815,815,815,815,815,815,,,,,,815,815,815', +'815,815,815,815,,984,815,984,984,984,,984,815,815,815,815,815,815,815', +'815,815,815,815,815,,815,815,815,,815,815,815,815,815,461,982,,982,982', +'982,,982,984,1006,,1006,1006,1006,,1006,461,461,,815,,,815,,,815,815', +',,815,,815,461,,461,815,461,461,982,461,461,,,461,815,461,1006,,,815', +'815,815,815,,815,815,815,815,,,,,815,815,,885,,885,885,885,815,885,815', +'815,815,816,816,816,816,816,816,,,,816,816,,,,816,,816,816,816,816,816', +'816,816,,,,,885,816,816,816,816,816,816,816,,945,816,945,945,945,,945', +'816,816,816,816,816,816,816,816,816,816,816,816,,816,816,816,,816,816', +'816,816,816,470,470,470,470,470,470,470,,945,470,470,,,,,,470,470,,816', +',,816,,,816,816,,,816,,816,470,,470,816,470,470,,470,470,470,470,470', +'816,470,,,,816,816,816,816,,816,816,816,816,,,,,816,816,,,,,,,816,,816', +'816,816,621,621,621,621,621,621,,,,621,621,,,,621,,621,621,621,621,621', +'621,621,,,,,,621,621,621,621,621,621,621,,,621,,,,,,621,621,621,621', +'621,621,621,621,621,621,621,621,,621,621,621,,621,621,621,621,621,471', +'471,471,471,471,471,471,471,,471,471,,,,,,471,471,,621,,,621,,,621,621', +',,621,,621,471,,471,621,471,471,,471,471,471,471,471,621,471,,,,621', +'621,621,621,,621,621,621,621,,,,,621,621,,,,,,,621,,621,621,621,537', +'537,537,537,537,537,,,,537,537,,,,537,,537,537,537,537,537,537,537,', +',,,,537,537,537,537,537,537,537,,,537,,,,,,537,537,537,537,537,537,537', +'537,537,537,537,537,,537,537,537,,537,537,537,537,537,467,467,467,467', +'467,467,467,,,467,467,,,,,,467,467,,537,,,537,,,537,537,,,537,,537,467', +',467,537,467,467,,467,467,467,467,467,537,467,,,,537,537,537,537,,537', +'537,537,537,,,,,537,537,,,,,,,537,,537,537,537,819,819,819,819,819,819', +',,,819,819,,,,819,,819,819,819,819,819,819,819,,,,,,819,819,819,819', +'819,819,819,,,819,,,,,,819,819,819,819,819,819,819,819,819,819,819,819', +',819,819,819,,819,819,819,819,819,448,448,448,448,448,448,448,448,448', +'448,448,,448,448,,,448,448,,819,,,819,,,819,819,,,819,,819,448,,448', +'819,448,448,,448,448,448,448,448,819,448,,,,819,819,819,819,,819,819', +'819,819,,,,,819,819,,,,,,,819,,819,819,819,947,947,947,947,947,947,', +',,947,947,,,,947,,947,947,947,947,947,947,947,,,,,,947,947,947,947,947', +'947,947,,,947,,,,,,947,947,947,947,947,947,947,947,947,947,947,947,', +'947,947,947,,947,947,947,947,947,447,447,447,447,447,447,447,447,447', +'447,447,,447,447,,,447,447,,947,,,947,,,947,947,,,947,,947,447,,447', +'947,447,447,,447,447,447,447,447,947,447,,,,947,947,947,947,,947,947', +'947,947,,,,,947,947,,,,,,,947,,947,947,947,622,622,622,622,622,622,', +',,622,622,,,,622,,622,622,622,622,622,622,622,,,,,,622,622,622,622,622', +'622,622,,,622,,,,,,622,622,622,622,622,622,622,622,622,622,622,622,', +'622,622,622,,622,622,622,622,622,458,458,458,458,458,458,458,,,458,458', +',,,,,458,458,,622,,,622,,,622,622,,,622,,622,458,,458,622,458,458,,458', +'458,458,458,458,622,458,,,,622,622,622,622,,622,622,622,622,,,,,622', +'622,,,,,,,622,,622,622,622,930,930,930,930,930,930,,,,930,930,,,,930', +',930,930,930,930,930,930,930,,,,,,930,930,930,930,930,930,930,,,930', +',,,,,930,930,930,930,930,930,930,930,930,930,930,930,,930,930,930,,930', +'930,930,930,930,466,466,466,466,466,466,466,,,466,466,,,,,,466,466,', +'930,,,930,,,930,930,,,930,,930,466,,466,930,466,466,,466,466,466,466', +'466,930,466,,,,930,930,930,930,,930,930,930,930,,,,,930,930,,,,,,,930', +',930,930,930,929,929,929,929,929,929,,,,929,929,,,,929,,929,929,929', +'929,929,929,929,,,,,,929,929,929,929,929,929,929,,,929,,,,,,929,929', +'929,929,929,929,929,929,929,929,929,929,,929,929,929,,929,929,929,929', +'929,459,,,,,,,,,,,,,,,,459,459,,929,,,929,,,929,929,,,929,,929,459,', +'459,929,459,459,,459,459,,,459,929,459,,,,929,929,929,929,,929,929,929', +'929,,,,,929,929,,,,,,,929,,929,929,929,825,825,825,825,825,825,,,,825', +'825,,,,825,,825,825,825,825,825,825,825,,,,,,825,825,825,825,825,825', +'825,,,825,,,,,,825,825,825,825,825,825,825,825,825,825,825,825,,825', +'825,825,,825,825,825,825,825,460,,,,,,,,,,,,,,,,460,460,,825,,,825,', +',825,825,,,825,,825,460,,460,825,460,460,,460,460,,,460,825,460,,,,825', +'825,825,825,,825,825,825,825,,,,,825,825,,,,,,,825,,825,825,825,295', +'295,295,295,295,295,,,,295,295,,,,295,,295,295,295,295,295,295,295,', +',,,,295,295,295,295,295,295,295,,,295,,,,,,295,295,295,295,295,295,295', +'295,295,295,295,295,,295,295,295,,295,295,295,295,295,465,465,465,465', +'465,465,465,,,465,465,,,,,,465,465,,295,,,295,,,295,295,,,295,,295,465', +',465,295,465,465,,465,465,465,465,465,295,465,,,,295,295,295,295,,295', +'295,295,295,,,,,295,295,,,,,,,295,,295,295,295,559,559,559,559,559,559', +',,,559,559,,,,559,,559,559,559,559,559,559,559,,,,,,559,559,559,559', +'559,559,559,,,559,,,,,,559,559,559,559,559,559,559,559,559,559,559,559', +',559,559,559,,559,559,559,559,559,464,464,464,464,464,464,464,,,464', +'464,,,,,,464,464,,559,,,559,,,559,559,,,559,,559,464,,464,559,464,464', +',464,464,464,464,464,559,464,,,,559,559,559,559,,559,559,559,559,,,', +',559,559,,,,800,800,800,559,800,559,559,559,800,800,,,,800,,800,800', +'800,800,800,800,800,,,,,,800,800,800,800,800,800,800,,,800,,,,,,,800', +',,800,800,800,800,800,800,800,800,,800,800,800,,800,800,800,800,800', +'463,463,463,463,463,463,463,,,463,463,,,,,,463,463,,800,,,800,,,800', +'800,,,800,,,463,,463,800,463,463,,463,463,463,463,463,800,463,,,,800', +'800,800,800,,800,800,800,800,,,,,800,800,,,,239,239,239,800,239,800', +'800,800,239,239,,,,239,,239,239,239,239,239,239,239,,,,,,239,239,239', +'239,239,239,239,,,239,,,,,,,239,,,239,239,239,239,239,239,239,239,,239', +'239,239,,239,239,239,239,239,455,,,,,,,,,,,,,,,,455,455,,239,,,239,', +',239,239,,,239,,,455,,455,239,455,455,,455,455,,,,239,,,,,239,239,239', +'239,,239,239,239,239,,,,,239,239,,,,238,238,238,239,238,239,239,239', +'238,238,,,,238,,238,238,238,238,238,238,238,,,,,,238,238,238,238,238', +'238,238,,,238,,,,,,,238,,,238,238,238,238,238,238,238,238,,238,238,238', +',238,238,238,238,238,456,,,,,,,,,,,,,,,,456,456,,238,,,238,,,238,238', +',,238,,,456,,456,238,456,456,,456,456,,,,238,,,,,238,238,238,238,,238', +'238,238,238,,,,,238,238,,,,,,,238,,238,238,238,291,291,291,291,291,', +',,291,291,,,,291,,291,291,291,291,291,291,291,,,,,,291,291,291,291,291', +'291,291,,,291,,,,,,291,291,,291,291,291,291,291,291,291,291,291,,291', +'291,291,,291,291,291,291,291,457,,,,,,,,,,,,,,,,457,457,,291,,,291,', +',291,291,,,291,,291,457,,,291,457,457,,457,457,,,,291,,,,,291,291,291', +'291,,291,291,291,291,,,,,291,291,,,,237,237,237,291,237,291,291,291', +'237,237,,,,237,,237,237,237,237,237,237,237,,,,,,237,237,237,237,237', +'237,237,,,237,,,,,,,237,,,237,237,237,237,237,237,237,237,,237,237,237', +',237,237,237,237,237,,,,,,,,,,,,,,,,,,,,237,,,237,,,237,237,,,237,,', +',,,237,,,,,,,,,237,,,,,237,237,237,237,,237,237,237,237,,,,,237,237', +',,,813,813,813,237,813,237,237,237,813,813,,,,813,,813,813,813,813,813', +'813,813,,,,,,813,813,813,813,813,813,813,,,813,,,,,,,813,,,813,813,813', +'813,813,813,813,813,,813,813,813,,813,813,813,813,813,,,,,,,,,,,,,,', +',,,,,813,,,813,,,813,813,,,813,,,,,,813,,,,,,,,,813,,,,,813,813,813', +'813,,813,813,813,813,,,,,813,813,,,,818,818,818,813,818,813,813,813', +'818,818,,,,818,,818,818,818,818,818,818,818,,,,,,818,818,818,818,818', +'818,818,,,818,,,,,,,818,,,818,818,818,818,818,818,818,818,,818,818,818', +',818,818,818,818,818,,,,,,,,,,,,,,,,,,,,818,,,818,,,818,818,,,818,,818', +',,,818,,,,,,,,,818,,,,,818,818,818,818,,818,818,818,818,,,,,818,818', +',,,649,649,649,818,649,818,818,818,649,649,,,,649,,649,649,649,649,649', +'649,649,,,,,,649,649,649,649,649,649,649,,,649,,,,,,,649,,,649,649,649', +'649,649,649,649,649,,649,649,649,,649,649,649,649,649,,,,,,,,,,,,,,', +',,,,,649,,,649,,,649,649,,,649,,649,,,,649,,,,,,,,,649,,,,,649,649,649', +'649,,649,649,649,649,,,,,649,649,,,,29,29,29,649,29,649,649,649,29,29', +',,,29,,29,29,29,29,29,29,29,,,,,,29,29,29,29,29,29,29,,,29,,,,,,,29', +',,29,29,29,29,29,29,29,29,29,29,29,29,,29,29,29,29,29,,,,,,,,,,,,,,', +',,,,,29,,,29,,,29,29,,,29,,29,,29,,29,,,29,,,,,,29,,,,,29,29,29,29,', +'29,29,29,29,,,,,29,29,,,,236,236,236,29,236,29,29,29,236,236,,,,236', +',236,236,236,236,236,236,236,,,,,,236,236,236,236,236,236,236,,,236', +',,,,,,236,,,236,236,236,236,236,236,236,236,,236,236,236,,236,236,236', +'236,236,,,,,,,,,,,,,,,,,,,,236,,,236,,,236,236,,,236,,,,,,236,,,,,,', +',,236,,,,,236,236,236,236,,236,236,236,236,,,,,236,236,,,,30,30,30,236', +'30,236,236,236,30,30,,,,30,,30,30,30,30,30,30,30,,,,,,30,30,30,30,30', +'30,30,,,30,,,,,,,30,,,30,30,30,30,30,30,30,30,30,30,30,30,,30,30,30', +'30,30,,,,,,,,,,,,,,,,,,,,30,,,30,,,30,30,,,30,,30,,30,,30,,,30,,,,,', +'30,,,,,30,30,30,30,,30,30,30,30,,,,,30,30,,,,31,31,31,30,31,30,30,30', +'31,31,,,,31,,31,31,31,31,31,31,31,,,,,,31,31,31,31,31,31,31,,,31,,,', +',,,31,,,31,31,31,31,31,31,31,31,31,31,31,31,,31,31,31,31,31,,,,,,,,', +',,,,,,,,,,,31,,,31,,,31,31,,,31,,31,,31,,31,,,31,,,,,,31,,,,,31,31,31', +'31,,31,31,31,31,,,,,31,31,,,,835,835,835,31,835,31,31,31,835,835,,,', +'835,,835,835,835,835,835,835,835,,,,,,835,835,835,835,835,835,835,,', +'835,,,,,,,835,,,835,835,835,835,835,835,835,835,835,835,835,835,,835', +'835,835,835,835,,,,,,,,,,,,,,,,,,,,835,,,835,,,835,835,,,835,,,,835', +',835,,,835,,,,,,835,,,,,835,835,835,835,,835,835,835,835,,,,,835,835', +',,,836,836,836,835,836,835,835,835,836,836,,,,836,,836,836,836,836,836', +'836,836,,,,,,836,836,836,836,836,836,836,,,836,,,,,,,836,,,836,836,836', +'836,836,836,836,836,,836,836,836,,836,836,836,836,836,,,,,,,,,,,,,,', +',,,,,836,,,836,,,836,836,,,836,,,,,,836,,,,,,,,,836,,,,,836,836,836', +'836,,836,836,836,836,,,,,836,836,,,,235,235,235,836,235,836,836,836', +'235,235,,,,235,,235,235,235,235,235,235,235,,,,,,235,235,235,235,235', +'235,235,,,235,,,,,,,235,,,235,235,235,235,235,235,235,235,,235,235,235', +',235,235,235,235,235,,,,,,,,,,,,,,,,,,,,235,,,235,,,235,235,,,235,,', +',,,235,,,,,,,,,235,,,,,235,235,235,235,,235,235,235,235,,,,,235,235', +',,,644,644,644,235,644,235,235,235,644,644,,,,644,,644,644,644,644,644', +'644,644,,,,,,644,644,644,644,644,644,644,,,644,,,,,,,644,,,644,644,644', +'644,644,644,644,644,,644,644,644,,644,644,,,644,,,,,,,,,,,,,,,,,,,,644', +',,644,,,644,644,,,644,,,,,,,,,,,,,,,,,,,,644,644,644,644,,644,644,644', +'644,,,,,644,644,,,,234,234,234,644,234,644,644,644,234,234,,,,234,,234', +'234,234,234,234,234,234,,,,,,234,234,234,234,234,234,234,,,234,,,,,', +',234,,,234,234,234,234,234,234,234,234,,234,234,234,,234,234,234,234', +'234,,,,,,,,,,,,,,,,,,,,234,,,234,,,234,234,,,234,,,,,,234,,,,,,,,,234', +',,,,234,234,234,234,,234,234,234,234,,,,,234,234,,,,233,233,233,234', +'233,234,234,234,233,233,,,,233,,233,233,233,233,233,233,233,,,,,,233', +'233,233,233,233,233,233,,,233,,,,,,,233,,,233,233,233,233,233,233,233', +'233,,233,233,233,,233,233,233,233,233,,,,,,,,,,,,,,,,,,,,233,,,233,', +',233,233,,,233,,,,,,233,,,,,,,,,233,,,,,233,233,233,233,,233,233,233', +'233,,,,,233,233,,,,299,299,299,233,299,233,233,233,299,299,,,,299,,299', +'299,299,299,299,299,299,,,,,,299,299,299,299,299,299,299,,,299,,,,,', +',299,,,299,299,299,299,299,299,299,299,,299,299,299,,299,299,,,299,', +',,,,,,,,,,,,,,,,,,299,,,299,,,299,299,,,299,,,845,,845,845,845,845,845', +',,,,,,,,845,,299,299,299,299,,299,299,299,299,,,,,299,299,,,,299,,845', +'299,,299,299,299,20,20,20,,20,845,845,,20,20,845,,,20,,20,20,20,20,20', +'20,20,,,,,,20,20,20,20,20,20,20,,,20,,,,,,,20,,,20,20,20,20,20,20,20', +'20,,20,20,20,,20,20,20,20,20,,,,,,,,,,,,,,,,,,,,20,,,20,,,20,20,,,20', +',,,,,20,,,,,,,,,20,,,,,20,20,20,20,,20,20,20,20,,,,,20,20,,,,850,850', +'850,20,850,20,20,20,850,850,,,,850,,850,850,850,850,850,850,850,,,,', +',850,850,850,850,850,850,850,,,850,,,,,,,850,,,850,850,850,850,850,850', +'850,850,,850,850,850,,850,850,,,850,,,,,,,,,,,,,,,,,,,,850,,,850,,,850', +'850,,,850,,,,,,,,,,,,,,,,,,,,850,850,850,850,,850,850,850,850,,,,,850', +'850,,,,862,862,862,850,862,850,850,850,862,862,,,,862,,862,862,862,862', +'862,862,862,,,,,,862,862,862,862,862,862,862,,,862,,,,,,,862,,,862,862', +'862,862,862,862,862,862,,862,862,862,,862,862,,,862,,,,,,,,,,,,,,,,', +',,,862,,,862,,,862,862,,,862,,,,,,,,,,,,,,,,,,,,862,862,862,862,,862', +'862,862,862,,,,,862,862,,,,230,230,230,862,230,862,862,862,230,230,', +',,230,,230,230,230,230,230,230,230,,,,,,230,230,230,230,230,230,230', +',,230,,,,,,,230,,,230,230,230,230,230,230,230,230,,230,230,230,,230', +'230,230,230,230,,,,,,,,,,,,,,,,,,,,230,,,230,,,230,230,,,230,,,,,,230', +',,,,,,,,230,,,,,230,230,230,230,,230,230,230,230,,,,,230,230,,,,633', +'633,633,230,633,230,230,230,633,633,,,,633,,633,633,633,633,633,633', +'633,,,,,,633,633,633,633,633,633,633,,,633,,,,,,,633,,,633,633,633,633', +'633,633,633,633,,633,633,633,,633,633,,,633,,,,,,,,,,,,,,,,,,,,633,', +',633,,,633,633,,,633,,,,,,,,,,,,,,,,,,,,633,633,633,633,,633,633,633', +'633,,,,,633,633,,,,34,34,34,633,34,633,633,633,34,34,,,,34,,34,34,34', +'34,34,34,34,,,,,,34,34,34,34,34,34,34,,,34,,,,,,,34,,,34,34,34,34,34', +'34,34,34,,34,34,34,,34,34,,,34,,,,,,,,,,,,,,,,,,,,34,,,34,,,34,34,,', +'34,,34,,,,,,,,,,,,,,,,,,34,34,34,34,,34,34,34,34,,,,,34,34,,,,35,35', +'35,34,35,34,34,34,35,35,,,,35,,35,35,35,35,35,35,35,,,,,,35,35,35,35', +'35,35,35,,,35,,,,,,,35,,,35,35,35,35,35,35,35,35,,35,35,35,,35,35,,', +'35,,,,,,,,,,,,,,,,,,,,35,,,35,,,35,35,,,35,,,959,,959,959,959,959,959', +',,,,,,,,959,,35,35,35,35,,35,35,35,35,,,,,35,35,,,,35,,959,35,,35,35', +'35,5,5,5,5,5,959,959,,5,5,959,,,5,,5,5,5,5,5,5,5,,,,,,5,5,5,5,5,5,5', +',,5,,,,,,5,5,5,5,5,5,5,5,5,5,5,5,,5,5,5,,5,5,5,5,5,,,,,,,,,,,,,,,,,', +',,5,,,5,,,5,5,,,5,,5,,,,5,,,,,,,,,5,,,,,5,5,5,5,,5,5,5,5,,,,,5,5,,,', +'627,627,627,5,627,5,5,5,627,627,,,,627,,627,627,627,627,627,627,627', +',,,,,627,627,627,627,627,627,627,,,627,,,,,,,627,,,627,627,627,627,627', +'627,627,627,,627,627,627,,627,627,627,627,627,,,,,,,,,,,,,,,,,,,,627', +',,627,,,627,627,,,627,,,,,,627,,,,,,,,,627,,,,,627,627,627,627,,627', +'627,627,627,,,,,627,627,,,,442,442,442,627,442,627,627,627,442,442,', +',,442,,442,442,442,442,442,442,442,,,,,,442,442,442,442,442,442,442', +',,442,,,,,,,442,,,442,442,442,442,442,442,442,442,442,442,442,442,,442', +'442,442,442,442,,,,,,,,,,,,,,,,,,,,442,,,442,,,442,442,,,442,,442,,442', +',442,,,442,,,,,,442,,,,,442,442,442,442,,442,442,442,442,,,,,442,442', +',,,444,444,444,442,444,442,442,442,444,444,,,,444,,444,444,444,444,444', +'444,444,,,,,,444,444,444,444,444,444,444,,,444,,,,,,,444,,,444,444,444', +'444,444,444,444,444,,444,444,444,,444,444,444,444,444,,,,,,,,,,,,,,', +',,,,,444,,,444,,,444,444,,,444,,,,,,444,,,,,,,,,444,,,,,444,444,444', +'444,,444,444,444,444,,,,,444,444,,,,445,445,445,444,445,444,444,444', +'445,445,,,,445,,445,445,445,445,445,445,445,,,,,,445,445,445,445,445', +'445,445,,,445,,,,,,,445,,,445,445,445,445,445,445,445,445,,445,445,445', +',445,445,445,445,445,,,,,,,,,,,,,,,,,,,,445,,,445,,,445,445,,,445,,', +',,,445,,,,,,,,,445,,,,,445,445,445,445,,445,445,445,445,,,,,445,445', +',,,446,446,446,445,446,445,445,445,446,446,,,,446,,446,446,446,446,446', +'446,446,,,,,,446,446,446,446,446,446,446,,,446,,,,,,,446,,,446,446,446', +'446,446,446,446,446,,446,446,446,,446,446,446,446,446,,,,,,,,,,,,,,', +',,,,,446,,,446,,,446,446,,,446,,,,,,446,,,,,,,,,446,,,,,446,446,446', +'446,,446,446,446,446,,,,,446,446,,,,,,,446,,446,446,446,113,113,113', +'113,113,,,,113,113,,,,113,,113,113,113,113,113,113,113,,,,,,113,113', +'113,113,113,113,113,,,113,,,,,,113,113,113,113,113,113,113,113,113,113', +'113,113,,113,113,113,,113,113,113,113,113,,,,,,,,,,,,,,,,,,,,113,,,113', +',,113,113,,,113,,113,,,,113,,,,,,,,,113,,,,,113,113,113,113,,113,113', +'113,113,,,,,113,113,,,,,,113,113,,113,113,113,252,252,252,,252,,,,252', +'252,,,,252,,252,252,252,252,252,252,252,,,,,,252,252,252,252,252,252', +'252,,,252,,,,,,,252,,,252,252,252,252,252,252,252,252,,252,252,252,', +'252,252,252,252,252,,,,,,,,,,,,,,,,,,,,252,,,252,,,252,252,,,252,,,', +',,252,,,,,,,,,252,,,,,252,252,252,252,,252,252,252,252,,,,,252,252,', +',,730,730,730,252,730,252,252,252,730,730,,,,730,,730,730,730,730,730', +'730,730,,,,,,730,730,730,730,730,730,730,,,730,,,,,,,730,,,730,730,730', +'730,730,730,730,730,,730,730,730,,730,730,730,730,730,,,,,,,,,,,,,,', +',,,,,730,,,730,,,730,730,,,730,,,,,,730,,,,,,,,,730,,,,,730,730,730', +'730,,730,730,730,730,,,,,730,730,,,,732,732,732,730,732,730,730,730', +'732,732,,,,732,,732,732,732,732,732,732,732,,,,,,732,732,732,732,732', +'732,732,,,732,,,,,,,732,,,732,732,732,732,732,732,732,732,,732,732,732', +',732,732,732,732,732,,,,,,,,,,,,,,,,,,,,732,,,732,,,732,732,,,732,,', +',,,732,,,,,,,,,732,,,,,732,732,732,732,,732,732,732,732,,,,,732,732', +',,,253,253,253,732,253,732,732,732,253,253,,,,253,,253,253,253,253,253', +'253,253,,,,,,253,253,253,253,253,253,253,,,253,,,,,,,253,,,253,253,253', +'253,253,253,253,253,,253,253,253,,253,253,253,253,253,,,,,,,,,,,,,,', +',,,,,253,,,253,,,253,253,,,253,,,,,,253,,,,,,,,,253,,,,,253,253,253', +'253,,253,253,253,253,,,,,253,253,,,,249,249,249,253,249,253,253,253', +'249,249,,,,249,,249,249,249,249,249,249,249,,,,,,249,249,249,249,249', +'249,249,,,249,,,,,,,249,,,249,249,249,249,249,249,249,249,,249,249,249', +',249,249,249,249,249,,,,,,,,,,,,,,,,,,,,249,,,249,,,249,249,,,249,,', +',,,249,,,,,,,,,249,,,,,249,249,249,249,,249,249,249,249,,,,,249,249', +',,,746,746,746,249,746,249,249,249,746,746,,,,746,,746,746,746,746,746', +'746,746,,,,,,746,746,746,746,746,746,746,,,746,,,,,,,746,,,746,746,746', +'746,746,746,746,746,,746,746,746,,746,746,746,746,746,,,,,,,,,,,,,,', +',,,,,746,,,746,,,746,746,,,746,,,,,,746,,,,,,,,,746,,,,,746,746,746', +'746,,746,746,746,746,,,,,746,746,,,,747,747,747,746,747,746,746,746', +'747,747,,,,747,,747,747,747,747,747,747,747,,,,,,747,747,747,747,747', +'747,747,,,747,,,,,,,747,,,747,747,747,747,747,747,747,747,,747,747,747', +',747,747,747,747,747,,,,,,,,,,,,,,,,,,,,747,,,747,,,747,747,,,747,,', +',,,747,,,,,,,,,747,,,,,747,747,747,747,,747,747,747,747,,,,,747,747', +',,,748,748,748,747,748,747,747,747,748,748,,,,748,,748,748,748,748,748', +'748,748,,,,,,748,748,748,748,748,748,748,,,748,,,,,,,748,,,748,748,748', +'748,748,748,748,748,,748,748,748,,748,748,748,748,748,,,,,,,,,,,,,,', +',,,,,748,,,748,,,748,748,,,748,,,,,,748,,,,,,,,,748,,,,,748,748,748', +'748,,748,748,748,748,,,,,748,748,,,,749,749,749,748,749,748,748,748', +'749,749,,,,749,,749,749,749,749,749,749,749,,,,,,749,749,749,749,749', +'749,749,,,749,,,,,,,749,,,749,749,749,749,749,749,749,749,,749,749,749', +',749,749,749,749,749,,,,,,,,,,,,,,,,,,,,749,,,749,,,749,749,,,749,,', +',,,749,,,,,,,,,749,,,,,749,749,749,749,,749,749,749,749,,,,,749,749', +',,,248,248,248,749,248,749,749,749,248,248,,,,248,,248,248,248,248,248', +'248,248,,,,,,248,248,248,248,248,248,248,,,248,,,,,,,248,,,248,248,248', +'248,248,248,248,248,,248,248,248,,248,248,248,248,248,,,,,,,,,,,,,,', +',,,,,248,,,248,,,248,248,,,248,,,,,,248,,,,,,,,,248,,,,,248,248,248', +'248,,248,248,248,248,,,,,248,248,,,,751,751,751,248,751,248,248,248', +'751,751,,,,751,,751,751,751,751,751,751,751,,,,,,751,751,751,751,751', +'751,751,,,751,,,,,,,751,,,751,751,751,751,751,751,751,751,,751,751,751', +',751,751,751,751,751,,,,,,,,,,,,,,,,,,,,751,,,751,,,751,751,,,751,,', +',,,751,,,,,,,,,751,,,,,751,751,751,751,,751,751,751,751,,,,,751,751', +',,,254,254,254,751,254,751,751,751,254,254,,,,254,,254,254,254,254,254', +'254,254,,,,,,254,254,254,254,254,254,254,,,254,,,,,,,254,,,254,254,254', +'254,254,254,254,254,,254,254,254,,254,254,254,254,254,,,,,,,,,,,,,,', +',,,,,254,,,254,,,254,254,,,254,,,,,,254,,,,,,,,,254,,,,,254,254,254', +'254,,254,254,254,254,,,,,254,254,,,,255,255,255,254,255,254,254,254', +'255,255,,,,255,,255,255,255,255,255,255,255,,,,,,255,255,255,255,255', +'255,255,,,255,,,,,,,255,,,255,255,255,255,255,255,255,255,,255,255,255', +',255,255,255,255,255,,,,,,,,,,,,,,,,,,,,255,,,255,,,255,255,,,255,,', +',,,255,,,,,,,,,255,,,,,255,255,255,255,,255,255,255,255,,,,,255,255', +',,,256,256,256,255,256,255,255,255,256,256,,,,256,,256,256,256,256,256', +'256,256,,,,,,256,256,256,256,256,256,256,,,256,,,,,,,256,,,256,256,256', +'256,256,256,256,256,,256,256,256,,256,256,256,256,256,,,,,,,,,,,,,,', +',,,,,256,,,256,,,256,256,,,256,,,,,,256,,,,,,,,,256,,,,,256,256,256', +'256,,256,256,256,256,,,,,256,256,,,,257,257,257,256,257,256,256,256', +'257,257,,,,257,,257,257,257,257,257,257,257,,,,,,257,257,257,257,257', +'257,257,,,257,,,,,,,257,,,257,257,257,257,257,257,257,257,,257,257,257', +',257,257,257,257,257,,,,,,,,,,,,,,,,,,,,257,,,257,,,257,257,,,257,,', +',,,257,,,,,,,,,257,,,,,257,257,257,257,,257,257,257,257,,,,,257,257', +',,,258,258,258,257,258,257,257,257,258,258,,,,258,,258,258,258,258,258', +'258,258,,,,,,258,258,258,258,258,258,258,,,258,,,,,,,258,,,258,258,258', +'258,258,258,258,258,,258,258,258,,258,258,258,258,258,,,,,,,,,,,,,,', +',,,,,258,,,258,,,258,258,,,258,,,,,,258,,,,,,,,,258,,,,,258,258,258', +'258,,258,258,258,258,,,,,258,258,,,,247,247,247,258,247,258,258,258', +'247,247,,,,247,,247,247,247,247,247,247,247,,,,,,247,247,247,247,247', +'247,247,,,247,,,,,,,247,,,247,247,247,247,247,247,247,247,,247,247,247', +',247,247,247,247,247,,,,,,,,,,,,,,,,,,,,247,,,247,,,247,247,,,247,,', +',,,247,,,,,,,,,247,,,,,247,247,247,247,,247,247,247,247,,,,,247,247', +',,,246,246,246,247,246,247,247,247,246,246,,,,246,,246,246,246,246,246', +'246,246,,,,,,246,246,246,246,246,246,246,,,246,,,,,,,246,,,246,246,246', +'246,246,246,246,246,,246,246,246,,246,246,246,246,246,,,,,,,,,,,,,,', +',,,,,246,,,246,,,246,246,,,246,,,,,,246,,,,,,,,,246,,,,,246,246,246', +'246,,246,246,246,246,,,,,246,246,,,,265,265,265,246,265,246,246,246', +'265,265,,,,265,,265,265,265,265,265,265,265,,,,,,265,265,265,265,265', +'265,265,,,265,,,,,,,265,,,265,265,265,265,265,265,265,265,265,265,265', +'265,,265,265,265,265,265,,,,,,,,,,,,,,,,,,,,265,,,265,,,265,265,,,265', +',265,,265,,265,,,265,,,,,,265,,,,,265,265,265,265,,265,265,265,265,', +',,,265,265,,,,266,266,266,265,266,265,265,265,266,266,,,,266,,266,266', +'266,266,266,266,266,,,,,,266,266,266,266,266,266,266,,,266,,,,,,,266', +',,266,266,266,266,266,266,266,266,266,266,266,266,,266,266,266,266,266', +',,,,,,,,,,,,,,,,,,,266,,,266,,,266,266,,,266,,266,,266,,266,,,266,,', +',,,266,,,,,266,266,266,266,,266,266,266,266,,,,,266,266,,,,763,763,763', +'266,763,266,266,266,763,763,,,,763,,763,763,763,763,763,763,763,,,,', +',763,763,763,763,763,763,763,,,763,,,,,,,763,,,763,763,763,763,763,763', +'763,763,,763,763,763,,763,763,,,763,,,,,,,,,,,,,,,,,,,,763,,,763,,,763', +'763,,,763,,,,,,,,,,,,,,,,,,,,763,763,763,763,,763,763,763,763,,,,,763', +'763,,,,274,274,274,763,274,763,763,763,274,274,,,,274,,274,274,274,274', +'274,274,274,,,,,,274,274,274,274,274,274,274,,,274,,,,,,,274,,,274,274', +'274,274,274,274,274,274,274,274,274,274,,274,274,274,274,274,,,,,,,', +',,,,,,,,,,,,274,,,274,,,274,274,,,274,,274,,274,,274,,,274,,,,,,274', +',,,,274,274,274,274,,274,274,274,274,,,,,274,274,274,,,245,245,245,274', +'245,274,274,274,245,245,,,,245,,245,245,245,245,245,245,245,,,,,,245', +'245,245,245,245,245,245,,,245,,,,,,,245,,,245,245,245,245,245,245,245', +'245,,245,245,245,,245,245,245,245,245,,,,,,,,,,,,,,,,,,,,245,,,245,', +',245,245,,,245,,,,,,245,,,,,,,,,245,,,,,245,245,245,245,,245,245,245', +'245,,,,,245,245,,,,244,244,244,245,244,245,245,245,244,244,,,,244,,244', +'244,244,244,244,244,244,,,,,,244,244,244,244,244,244,244,,,244,,,,,', +',244,,,244,244,244,244,244,244,244,244,,244,244,244,,244,244,244,244', +'244,,,,,,,,,,,,,,,,,,,,244,,,244,,,244,244,,,244,,,,,,244,,,,,,,,,244', +',,,,244,244,244,244,,244,244,244,244,,,,,244,244,,,,281,281,281,244', +'281,244,244,244,281,281,,,,281,,281,281,281,281,281,281,281,,,,,,281', +'281,281,281,281,281,281,,,281,,,,,,,281,,,281,281,281,281,281,281,281', +'281,,281,281,281,,281,281,281,281,281,,,,,,,,,,,,,,,,,,,,281,,,281,', +',281,281,,,281,,,,,,281,,,,,,,,,281,,,,,281,281,281,281,,281,281,281', +'281,,,,,281,281,,,,283,283,283,281,283,281,281,281,283,283,,,,283,,283', +'283,283,283,283,283,283,,,,,,283,283,283,283,283,283,283,,,283,,,,,', +',283,,,283,283,283,283,283,283,283,283,,283,283,283,,283,283,283,283', +'283,,,,,,,,,,,,,,,,,,,,283,,,283,,,283,283,,,283,,,,,,283,,,,,,,,,283', +',,,,283,283,283,283,,283,283,283,283,,,,,283,283,,,,285,285,285,283', +'285,283,283,283,285,285,,,,285,,285,285,285,285,285,285,285,,,,,,285', +'285,285,285,285,285,285,,,285,,,,,,,285,,,285,285,285,285,285,285,285', +'285,,285,285,285,,285,285,285,285,285,,,,,,,,,,,,,,,,,,,,285,,,285,', +',285,285,,,285,,,,,,285,,,,,,,,,285,,,,,285,285,285,285,,285,285,285', +'285,,,,,285,285,,,,286,286,286,285,286,285,285,285,286,286,,,,286,,286', +'286,286,286,286,286,286,,,,,,286,286,286,286,286,286,286,,,286,,,,,', +',286,,,286,286,286,286,286,286,286,286,,286,286,286,,286,286,286,286', +'286,,,,,,,,,,,,,,,,,,,,286,,,286,,,286,286,,,286,,,,,,286,,,,,,,,,286', +',,,,286,286,286,286,,286,286,286,286,,,,,286,286,,,,674,674,674,286', +'674,286,286,286,674,674,,,,674,,674,674,674,674,674,674,674,,,,,,674', +'674,674,674,674,674,674,,,674,,,,,,,674,,,674,674,674,674,674,674,674', +'674,,674,674,674,,674,674,674,674,674,,,,,,,,,,,,,,,,,,,,674,,,674,', +',674,674,,,674,,,,,,674,,,,,,,,,674,,,,,674,674,674,674,,674,674,674', +'674,,,,,674,674,,,,243,243,243,674,243,674,674,674,243,243,,,,243,,243', +'243,243,243,243,243,243,,,,,,243,243,243,243,243,243,243,,,243,,,,,', +',243,,,243,243,243,243,243,243,243,243,,243,243,243,,243,243,243,243', +'243,,,,,,,,,,,,,,,,,,,,243,,,243,,,243,243,,,243,,,,,,243,,,,,,,,,243', +',,,,243,243,243,243,,243,243,243,243,,,,,243,243,,,,242,242,242,243', +'242,243,243,243,242,242,,,,242,,242,242,242,242,242,242,242,,,,,,242', +'242,242,242,242,242,242,,,242,,,,,,,242,,,242,242,242,242,242,242,242', +'242,,242,242,242,,242,242,242,242,242,,,,,,,,,,,,,,,,,,,,242,,,242,', +',242,242,,,242,,,,,,242,,,,,,,,,242,,,,,242,242,242,242,,242,242,242', +'242,,,,,242,242,,,,241,241,241,242,241,242,242,242,241,241,,,,241,,241', +'241,241,241,241,241,241,,,,,,241,241,241,241,241,241,241,,,241,,,,,', +',241,,,241,241,241,241,241,241,241,241,,241,241,241,,241,241,241,241', +'241,,,,,,,,,,,,,,,,,,,,241,,,241,,,241,241,,,241,,,,,,241,,,,,,,,,241', +',,,,241,241,241,241,,241,241,241,241,,,,,241,241,,,,326,326,326,241', +'326,241,241,241,326,326,,,,326,,326,326,326,326,326,326,326,,,,,,326', +'326,326,326,326,326,326,,,326,,,,,,,326,,,326,326,326,326,326,326,326', +'326,,326,326,326,,326,326,326,326,326,,,,,,,,,,,,,,,,,,,,326,,,326,', +',326,326,,,326,,,,,,326,,,,,,,,,326,,,,,326,326,326,326,,326,326,326', +'326,,,,,326,326,,,,603,603,603,326,603,326,326,326,603,603,,,,603,,603', +'603,603,603,603,603,603,,,,,,603,603,603,603,603,603,603,,,603,,,,,', +',603,,,603,603,603,603,603,603,603,603,,603,603,603,,603,603,603,603', +'603,,,,,,,,,,,,,,,,,,,,603,,,603,,,603,603,,,603,,,,,,603,,,,,,,,,603', +',,,,603,603,603,603,,603,603,603,603,,,,,603,603,,,,602,602,602,603', +'602,603,603,603,602,602,,,,602,,602,602,602,602,602,602,602,,,,,,602', +'602,602,602,602,602,602,,,602,,,,,,,602,,,602,602,602,602,602,602,602', +'602,,602,602,602,,602,602,602,602,602,,,,,,,,,,,,,,,,,,,,602,,,602,', +',602,602,,,602,,,,,,602,,,,,,,,,602,,,,,602,602,602,602,,602,602,602', +'602,,,,,602,602,,,,599,599,599,602,599,602,602,602,599,599,,,,599,,599', +'599,599,599,599,599,599,,,,,,599,599,599,599,599,599,599,,,599,,,,,', +',599,,,599,599,599,599,599,599,599,599,,599,599,599,,599,599,599,599', +'599,,,,,,,,,,,,,,,,,,,,599,,,599,,,599,599,,,599,,,,,,599,,,,,,,,,599', +',,,,599,599,599,599,,599,599,599,599,,,,,599,599,,,,598,598,598,599', +'598,599,599,599,598,598,,,,598,,598,598,598,598,598,598,598,,,,,,598', +'598,598,598,598,598,598,,,598,,,,,,,598,,,598,598,598,598,598,598,598', +'598,,598,598,598,,598,598,598,598,598,,,,,,,,,,,,,,,,,,,,598,,,598,', +',598,598,,,598,,,,,,598,,,,,,,,,598,,,,,598,598,598,598,,598,598,598', +'598,,,,,598,598,,,,219,219,219,598,219,598,598,598,219,219,,,,219,,219', +'219,219,219,219,219,219,,,,,,219,219,219,219,219,219,219,,,219,,,,,', +',219,,,219,219,219,219,219,219,219,219,,219,219,219,,219,219,219,219', +'219,,,,,,,,,,,,,,,,,,,,219,,,219,,,219,219,,,219,,,,,,219,,,,,,,,,219', +',,,,219,219,219,219,,219,219,219,219,,,,,219,219,219,,,594,594,594,219', +'594,219,219,219,594,594,,,,594,,594,594,594,594,594,594,594,,,,,,594', +'594,594,594,594,594,594,,,594,,,,,,,594,,,594,594,594,594,594,594,594', +'594,,594,594,594,,594,594,594,594,594,,,,,,,,,,,,,,,,,,,,594,,,594,', +',594,594,,,594,,,,,,594,,,,,,,,,594,,,,,594,594,594,594,,594,594,594', +'594,,,,,594,594,,,,593,593,593,594,593,594,594,594,593,593,,,,593,,593', +'593,593,593,593,593,593,,,,,,593,593,593,593,593,593,593,,,593,,,,,', +',593,,,593,593,593,593,593,593,593,593,,593,593,593,,593,593,593,593', +'593,,,,,,,,,,,,,,,,,,,,593,,,593,,,593,593,,,593,,,,,,593,,,,,,,,,593', +',,,,593,593,593,593,,593,593,593,593,,,,,593,593,,,,592,592,592,593', +'592,593,593,593,592,592,,,,592,,592,592,592,592,592,592,592,,,,,,592', +'592,592,592,592,592,592,,,592,,,,,,,592,,,592,592,592,592,592,592,592', +'592,592,592,592,592,,592,592,592,592,592,,,,,,,,,,,,,,,,,,,,592,,,592', +',,592,592,,,592,,,,592,,592,,,592,,,,,,592,,,,,592,592,592,592,,592', +'592,592,592,,,,,592,592,,,,591,591,591,592,591,592,592,592,591,591,', +',,591,,591,591,591,591,591,591,591,,,,,,591,591,591,591,591,591,591', +',,591,,,,,,,591,,,591,591,591,591,591,591,591,591,591,591,591,591,,591', +'591,591,591,591,,,,,,,,,,,,,,,,,,,,591,,,591,,,591,591,,,591,,591,,591', +',591,,,591,,,,,,591,,,,,591,591,591,591,,591,591,591,591,,,,,591,591', +',,,218,218,218,591,218,591,591,591,218,218,,,,218,,218,218,218,218,218', +'218,218,,,,,,218,218,218,218,218,218,218,,,218,,,,,,,218,,,218,218,218', +'218,218,218,218,218,,218,218,218,,218,218,218,218,218,,,,,,,,,,,,,,', +',,,,,218,,,218,,,218,218,,,218,,,,,,218,,,,,,,,,218,,,,,218,218,218', +'218,,218,218,218,218,,,,,218,218,,,,588,588,588,218,588,218,218,218', +'588,588,,,,588,,588,588,588,588,588,588,588,,,,,,588,588,588,588,588', +'588,588,,,588,,,,,,,588,,,588,588,588,588,588,588,588,588,,588,588,588', +',588,588,588,588,588,,,,,,,,,,,,,,,,,,,,588,,,588,,,588,588,,,588,,', +',,,588,,,,,,,,,588,,,,,588,588,588,588,,588,588,588,588,,,,,588,588', +',,,587,587,587,588,587,588,588,588,587,587,,,,587,,587,587,587,587,587', +'587,587,,,,,,587,587,587,587,587,587,587,,,587,,,,,,,587,,,587,587,587', +'587,587,587,587,587,,587,587,587,,587,587,587,587,587,,,,,,,,,,,,,,', +',,,,,587,,,587,,,587,587,,,587,,587,,,,587,,,,,,,,,587,,,,,587,587,587', +'587,,587,587,587,587,,,,,587,587,,,,217,217,217,587,217,587,587,587', +'217,217,,,,217,,217,217,217,217,217,217,217,,,,,,217,217,217,217,217', +'217,217,,,217,,,,,,,217,,,217,217,217,217,217,217,217,217,,217,217,217', +',217,217,217,217,217,,,,,,,,,,,,,,,,,,,,217,,,217,,,217,217,,,217,,', +',,,217,,,,,,,,,217,,,,,217,217,217,217,,217,217,217,217,,,,,217,217', +',,,216,216,216,217,216,217,217,217,216,216,,,,216,,216,216,216,216,216', +'216,216,,,,,,216,216,216,216,216,216,216,,,216,,,,,,,216,,,216,216,216', +'216,216,216,216,216,,216,216,216,,216,216,216,216,216,,,,,,,,,,,,,,', +',,,,,216,,,216,,,216,216,,,216,,,,,,216,,,,,,,,,216,,,,,216,216,216', +'216,,216,216,216,216,,,,,216,216,,,,215,215,215,216,215,216,216,216', +'215,215,,,,215,,215,215,215,215,215,215,215,,,,,,215,215,215,215,215', +'215,215,,,215,,,,,,,215,,,215,215,215,215,215,215,215,215,,215,215,215', +',215,215,215,215,215,,,,,,,,,,,,,,,,,,,,215,,,215,,,215,215,,,215,,215', +',,,215,,,,,,,,,215,,,,,215,215,215,215,,215,215,215,215,,,,,215,215', +',,,42,42,42,215,42,215,215,215,42,42,,,,42,,42,42,42,42,42,42,42,,,', +',,42,42,42,42,42,42,42,,,42,,,,,,,42,,,42,42,42,42,42,42,42,42,,42,42', +'42,,42,42,42,42,42,,,,,,,,,,,,,,,,,,,,42,,,42,,,42,42,,,42,,,,,,42,', +',,,,,,,42,,,,,42,42,42,42,,42,42,42,42,,,,,42,42,,,,43,43,43,42,43,42', +'42,42,43,43,,,,43,,43,43,43,43,43,43,43,,,,,,43,43,43,43,43,43,43,,', +'43,,,,,,,43,,,43,43,43,43,43,43,43,43,,43,43,43,,43,43,43,43,43,,,,', +',,,,,,,,,,,,,,,43,,,43,,,43,43,,,43,,,,,,43,,,,,,,,,43,,,,,43,43,43', +'43,,43,43,43,43,,,,,43,43,,,,971,971,971,43,971,43,43,43,971,971,,,', +'971,,971,971,971,971,971,971,971,,,,,,971,971,971,971,971,971,971,,', +'971,,,,,,,971,,,971,971,971,971,971,971,971,971,971,971,971,971,,971', +'971,971,971,971,,,,,,,,,,,,,,,,,,,,971,,,971,,,971,971,,,971,,971,,971', +',971,,,971,,,,,,971,,,,,971,971,971,971,,971,971,971,971,,,,,971,971', +',,,214,214,214,971,214,971,971,971,214,214,,,,214,,214,214,214,214,214', +'214,214,,,,,,214,214,214,214,214,214,214,,,214,,,,,,,214,,,214,214,214', +'214,214,214,214,214,,214,214,214,,214,214,214,214,214,,,,,,,,,,,,,,', +',,,,,214,,,214,,,214,214,,,214,,,,,,214,,,,,,,,,214,,,,,214,214,214', +'214,,214,214,214,214,,,,,214,214,,,,44,44,44,214,44,214,214,214,44,44', +',,,44,,44,44,44,44,44,44,44,,,,,,44,44,44,44,44,44,44,,,44,,,,,,,44', +',,44,44,44,44,44,44,44,44,,44,44,44,,44,44,44,44,44,,,,,,,,,,,,,,,,', +',,,44,,,44,,,44,44,,,44,,,,,,44,,,,,,,,,44,,,,,44,44,44,44,,44,44,44', +'44,,,,,44,44,,,,340,340,340,44,340,44,44,44,340,340,,,,340,,340,340', +'340,340,340,340,340,,,,,,340,340,340,340,340,340,340,,,340,,,,,,,340', +',,340,340,340,340,340,340,340,340,,340,340,340,,340,340,340,340,340', +',,,,,,,,,,,,,,,,,,,340,,,340,,,340,340,,,340,,,,,,340,,,,,,,,,340,,', +',,340,340,340,340,,340,340,340,340,,,,,340,340,,,,341,341,341,340,341', +'340,340,340,341,341,,,,341,,341,341,341,341,341,341,341,,,,,,341,341', +'341,341,341,341,341,,,341,,,,,,,341,,,341,341,341,341,341,341,341,341', +',341,341,341,,341,341,341,341,341,,,,,,,,,,,,,,,,,,,,341,,,341,,,341', +'341,,,341,,,,,,341,,,,,,,,,341,,,,,341,341,341,341,,341,341,341,341', +',,,,341,341,,,,553,553,553,341,553,341,341,341,553,553,,,,553,,553,553', +'553,553,553,553,553,,,,,,553,553,553,553,553,553,553,,,553,,,,,,,553', +',,553,553,553,553,553,553,553,553,553,553,553,553,,553,553,553,553,553', +',,,,,,,,,,,,,,,,,,,553,,,553,,,553,553,,,553,,553,,553,,553,,,553,,', +',,,553,,,,,553,553,553,553,,553,553,553,553,,,,,553,553,,,,543,543,543', +'553,543,553,553,553,543,543,,,,543,,543,543,543,543,543,543,543,,,,', +',543,543,543,543,543,543,543,,,543,,,,,,,543,,,543,543,543,543,543,543', +'543,543,543,543,543,543,,543,543,543,543,543,,,,,,,,,,,,,,,,,,,,543', +',,543,,,543,543,,,543,,543,,543,,543,,,543,,,,,,543,,,,,543,543,543', +'543,,543,543,543,543,,,,,543,543,,,,542,542,542,543,542,543,543,543', +'542,542,,,,542,,542,542,542,542,542,542,542,,,,,,542,542,542,542,542', +'542,542,,,542,,,,,,,542,,,542,542,542,542,542,542,542,542,,542,542,542', +',542,542,542,542,542,,,,,,,,,,,,,,,,,,,,542,,,542,,,542,542,,,542,,542', +',,,542,,,,,,,,,542,,,,,542,542,542,542,,542,542,542,542,,,,,542,542', +',,,211,211,211,542,211,542,542,542,211,211,,,,211,,211,211,211,211,211', +'211,211,,,,,,211,211,211,211,211,211,211,,,211,,,,,,,211,,,211,211,211', +'211,211,211,211,211,211,211,211,211,,211,211,211,211,211,,,,,,,,,,,', +',,,,,,,,211,,,211,,,211,211,,,211,,211,,211,,211,,,211,,,,,,211,,,,', +'211,211,211,211,,211,211,211,211,,,,,211,211,,,,210,210,210,211,210', +'211,211,211,210,210,,,,210,,210,210,210,210,210,210,210,,,,,,210,210', +'210,210,210,210,210,,,210,,,,,,,210,,,210,210,210,210,210,210,210,210', +',210,210,210,,210,210,210,210,210,,,,,,,,,,,,,,,,,,,,210,,,210,,,210', +'210,,,210,,,,,,210,,,,,,,,,210,,,,,210,210,210,210,,210,210,210,210', +',,,,210,210,,,,528,528,528,210,528,210,210,210,528,528,,,,528,,528,528', +'528,528,528,528,528,,,,,,528,528,528,528,528,528,528,,,528,,,,,,,528', +',,528,528,528,528,528,528,528,528,528,528,528,528,,528,528,528,528,528', +',,,,,,,,,,,,,,,,,,,528,,,528,,,528,528,,,528,,,,,,528,,,528,,,,,,528', +',,,,528,528,528,528,,528,528,528,528,,,,,528,528,,,,525,525,525,528', +'525,528,528,528,525,525,,,,525,,525,525,525,525,525,525,525,,,,,,525', +'525,525,525,525,525,525,,,525,,,,,,,525,,,525,525,525,525,525,525,525', +'525,525,525,525,525,,525,525,525,525,525,,,,,,,,,,,,,,,,,,,,525,,,525', +',,525,525,,,525,,525,,,,525,,,525,,,,,,525,,,,,525,525,525,525,,525', +'525,525,525,,,,,525,525,,,,209,209,209,525,209,525,525,525,209,209,', +',,209,,209,209,209,209,209,209,209,,,,,,209,209,209,209,209,209,209', +',,209,,,,,,,209,,,209,209,209,209,209,209,209,209,,209,209,209,,209', +'209,209,209,209,,,,,,,,,,,,,,,,,,,,209,,,209,,,209,209,,,209,,209,,', +',209,,,,,,,,,209,,,,,209,209,209,209,,209,209,209,209,,,,,209,209,,', +',360,360,360,209,360,209,209,209,360,360,,,,360,,360,360,360,360,360', +'360,360,,,,,,360,360,360,360,360,360,360,,,360,,,,,,,360,,,360,360,360', +'360,360,360,360,360,,360,360,360,,360,360,360,360,360,,,,,,,,,,,,,,', +',,,,,360,,,360,,,360,360,,,360,,,,,,360,,,,,,,,,360,,,,,360,360,360', +'360,,360,360,360,360,,,,,360,360,,,,519,519,519,360,519,360,360,360', +'519,519,,,,519,,519,519,519,519,519,519,519,,,,,,519,519,519,519,519', +'519,519,,,519,,,,,,,519,,,519,519,519,519,519,519,519,519,,519,519,519', +',519,519,519,519,519,,,,,,,,,,,,,,,,,,,,519,,,519,,,519,519,,,519,,', +',,,519,,,,,,,,,519,,,,,519,519,519,519,,519,519,519,519,,,,,519,519', +',,,515,515,515,519,515,519,519,519,515,515,,,,515,,515,515,515,515,515', +'515,515,,,,,,515,515,515,515,515,515,515,,,515,,,,,,,515,,,515,515,515', +'515,515,515,515,515,,515,515,515,,515,515,515,515,515,,,,,,,,,,,,,,', +',,,,,515,,,515,,,515,515,,,515,,,,,,515,,,,,,,,,515,,,,,515,515,515', +'515,,515,515,515,515,,,,,515,515,,,,514,514,514,515,514,515,515,515', +'514,514,,,,514,,514,514,514,514,514,514,514,,,,,,514,514,514,514,514', +'514,514,,,514,,,,,,,514,,,514,514,514,514,514,514,514,514,,514,514,514', +',514,514,514,514,514,,,,,,,,,,,,,,,,,,,,514,,,514,,,514,514,,,514,,', +',,,514,,,,,,,,,514,,,,,514,514,514,514,,514,514,514,514,,,,,514,514', +',,,511,511,511,514,511,514,514,514,511,511,,,,511,,511,511,511,511,511', +'511,511,,,,,,511,511,511,511,511,511,511,,,511,,,,,,,511,,,511,511,511', +'511,511,511,511,511,,511,511,511,,511,511,,,511,,,,,,,,,,,,,,,,,,,,511', +',,511,,,511,511,,,511,,,,,,,,,,,,,,,,,,,,511,511,511,511,,511,511,511', +'511,,,,,511,511,,,,505,505,505,511,505,511,511,511,505,505,,,,505,,505', +'505,505,505,505,505,505,,,,,,505,505,505,505,505,505,505,,,505,,,,,', +',505,,,505,505,505,505,505,505,505,505,505,505,505,505,,505,505,505', +'505,505,,,,,,,,,,,,,,,,,,,,505,,,505,,,505,505,,,505,,505,,505,,505', +',,505,,,,,,505,,,,,505,505,505,505,,505,505,505,505,,,,,505,505,,,,', +',,505,,505,505,505,122,122,122,122,122,,,,122,122,,,,122,,122,122,122', +'122,122,122,122,,,,,,122,122,122,122,122,122,122,,,122,,,,,,122,122', +',122,122,122,122,122,122,122,122,122,,122,122,122,,122,122,122,122,122', +',,,,,,,,,,,,,,,,,,,122,,,122,,,122,122,,,122,,122,,,,122,,,,,,,,,122', +',,,,122,122,122,122,,122,122,122,122,,,,,122,122,,,,503,503,503,122', +'503,122,122,122,503,503,,,,503,,503,503,503,503,503,503,503,,,,,,503', +'503,503,503,503,503,503,,,503,,,,,,,503,,,503,503,503,503,503,503,503', +'503,,503,503,503,,503,503,,,503,,,,,,,,,,,,,,,,,,,,503,,,503,,,503,503', +',,503,,,,,,,,,,,,,,,,,,,,503,503,503,503,,503,503,503,503,,,,,503,503', +',,,121,121,121,503,121,503,503,503,121,121,,,,121,,121,121,121,121,121', +'121,121,,,,,,121,121,121,121,121,121,121,,,121,,,,,,,121,,,121,121,121', +'121,121,121,121,121,,121,121,121,,121,121,121,121,121,,,,,,,,,,,,,,', +',,,,,121,,,121,,,121,121,,,121,,,,,,121,,,,,,,,,121,,,,,121,121,121', +'121,,121,121,121,121,,,,,121,121,,,,120,120,120,121,120,121,121,121', +'120,120,,,,120,,120,120,120,120,120,120,120,,,,,,120,120,120,120,120', +'120,120,,,120,,,,,,,120,,,120,120,120,120,120,120,120,120,,120,120,120', +',120,120,120,120,120,,,,,,,,,,,,,,,,,,,,120,,,120,,,120,120,,,120,,', +',,,120,,,,,,,,,120,,,,,120,120,120,120,,120,120,120,120,,,,,120,120', +',,,376,376,376,120,376,120,120,120,376,376,,,,376,,376,376,376,376,376', +'376,376,,,,,,376,376,376,376,376,376,376,,,376,,,,,,,376,,,376,376,376', +'376,376,376,376,376,,376,376,376,,376,376,376,376,376,,,,,,,,,,,,,,', +',,,,,376,,,376,,,376,376,,,376,,,,,,376,,,,,,,,,376,,,,,376,376,376', +'376,,376,376,376,376,,,,,376,376,,,,250,250,250,376,250,376,376,376', +'250,250,,,,250,,250,250,250,250,250,250,250,,,,,,250,250,250,250,250', +'250,250,,,250,,,,,,,250,,,250,250,250,250,250,250,250,250,,250,250,250', +',250,250,250,250,250,,,,,,,,,,,,,,,,,,,,250,,,250,,,250,250,,,250,,', +',,,250,,,,,,,,,250,,,,,250,250,250,250,,250,250,250,250,,,,,250,250', +',,,707,707,707,250,707,250,250,250,707,707,,,,707,,707,707,707,707,707', +'707,707,,,,,,707,707,707,707,707,707,707,,,707,,,,,,,707,,,707,707,707', +'707,707,707,707,707,,707,707,707,,707,707,707,707,707,,,,,,,,,,,,,,', +',,,,,707,,,707,,,707,707,,,707,,,,,,707,,,,,,,,,707,,,,,707,707,707', +'707,,707,707,707,707,,,,,707,707,,,,251,251,251,707,251,707,707,707', +'251,251,,,,251,,251,251,251,251,251,251,251,,,,,,251,251,251,251,251', +'251,251,,,251,,,,,,,251,,,251,251,251,251,251,251,251,251,,251,251,251', +',251,251,251,251,251,,,,,,,,,,,,,,,,,,,,251,,,251,,,251,251,,,251,,', +',,,251,,,,,,,,,251,,,,,251,251,251,251,,251,251,251,251,,,,,251,251', +',,,119,119,119,251,119,251,251,251,119,119,,,,119,,119,119,119,119,119', +'119,119,,,,,,119,119,119,119,119,119,119,,,119,,,,,,,119,,,119,119,119', +'119,119,119,119,119,,119,119,119,,119,119,119,119,119,,,,,,,,,,,,,,', +',,,,,119,,,119,,,119,119,,,119,,,,,,119,,,,,,,,,119,,,,,119,119,119', +'119,,119,119,119,119,,,,,119,119,,,,701,701,701,119,701,119,119,119', +'701,701,,,,701,,701,701,701,701,701,701,701,,,,,,701,701,701,701,701', +'701,701,,,701,,,,,,,701,,,701,701,701,701,701,701,701,701,,701,701,701', +',701,701,701,701,701,,,,,,,,,,,,,,,,,,,,701,,,701,,,701,701,,,701,,', +',,,701,,,,,,,,,701,,,,,701,701,701,701,,701,701,701,701,,,,,701,701', +',,,59,59,59,701,59,701,701,701,59,59,,,,59,,59,59,59,59,59,59,59,,,', +',,59,59,59,59,59,59,59,,,59,,,,,,,59,,,59,59,59,59,59,59,59,59,59,59', +'59,59,,59,59,59,59,59,,,,,,,,,,,,,,,,,,,,59,,,59,,,59,59,,,59,,59,,', +',59,,,59,,,,,,59,,,,,59,59,59,59,,59,59,59,59,,,,,59,59,,,,60,60,60', +'59,60,59,59,59,60,60,,,,60,,60,60,60,60,60,60,60,,,,,,60,60,60,60,60', +'60,60,,,60,,,,,,,60,,,60,60,60,60,60,60,60,60,60,60,60,60,,60,60,60', +'60,60,,,,,,,,,,,,,,,,,,,,60,,,60,,,60,60,,,60,,,,,,60,,,60,,,,,,60,', +',,,60,60,60,60,,60,60,60,60,,,,,60,60,,,,404,404,404,60,404,60,60,60', +'404,404,,,,404,,404,404,404,404,404,404,404,,,,,,404,404,404,404,404', +'404,404,,,404,,,,,,,404,,,404,404,404,404,404,404,404,404,,404,404,404', +',404,404,404,404,404,,,,,,,,,,,,,,,,,,,,404,,,404,,,404,404,,,404,,', +',,,404,,,,,,,,,404,,,,,404,404,404,404,,404,404,404,404,,,,,404,404', +',,,63,63,63,404,63,404,404,404,63,63,,,,63,,63,63,63,63,63,63,63,,,', +',,63,63,63,63,63,63,63,,,63,,,,,,,63,,,63,63,63,63,63,63,63,63,,63,63', +'63,,63,63,63,63,63,,,,,,,,,,,,,,,,,,,,63,,,63,,,63,63,,,63,,,,,,63,', +',,,,,,,63,,,,,63,63,63,63,,63,63,63,63,,,,,63,63,,,,64,64,64,63,64,63', +'63,63,64,64,,,,64,,64,64,64,64,64,64,64,,,,,,64,64,64,64,64,64,64,,', +'64,,,,,,,64,,,64,64,64,64,64,64,64,64,,64,64,64,,64,64,64,64,64,,,,', +',,,,,,,,,,,,,,,64,,,64,,,64,64,,,64,,,,,,64,,,,,,,,,64,,,,,64,64,64', +'64,,64,64,64,64,,,,,64,64,,,,67,67,67,64,67,64,64,64,67,67,,,,67,,67', +'67,67,67,67,67,67,,,,,,67,67,67,67,67,67,67,,,67,,,,,,,67,,,67,67,67', +'67,67,67,67,67,,67,67,67,,67,67,67,67,67,,,,,,,,,,,,,,,,,,,,67,,,67', +',,67,67,,,67,,,,,,67,,,,,,,,,67,,,,,67,67,67,67,,67,67,67,67,,,,,67', +'67,67,,,,,67,67,,67,67,67,68,68,68,,68,,,,68,68,,,,68,,68,68,68,68,68', +'68,68,,,,,,68,68,68,68,68,68,68,,,68,,,,,,,68,,,68,68,68,68,68,68,68', +'68,,68,68,68,,68,68,,,68,,,,,,,,,,,,,,,,,,,,68,,,68,,,68,68,,,68,,68', +'961,,961,961,961,961,961,,,,,,,,,961,,68,68,68,68,,68,68,68,68,,,,,68', +'68,,,,,,961,68,,68,68,68,495,495,495,495,495,961,961,,495,495,961,,', +'495,,495,495,495,495,495,495,495,,,,,,495,495,495,495,495,495,495,,', +'495,,,,,,495,495,495,495,495,495,495,495,495,495,495,495,,495,495,495', +',495,495,495,495,495,,,,,,,,,,,,,,,,,,,,495,,,495,,,495,495,,,495,,495', +',,,495,,,,,,,,,495,,,,,495,495,495,495,,495,495,495,495,,,,,495,495', +',,,,,495,495,,495,495,495,69,69,69,,69,,,,69,69,,,,69,,69,69,69,69,69', +'69,69,,,,,,69,69,69,69,69,69,69,,,69,,,,,,,69,,,69,69,69,69,69,69,69', +'69,,69,69,69,,69,69,,,69,,,,,,,,,,,,,,,,,69,,,69,,,69,,,69,69,,,69,', +',,,,,,,,,,,,,,,,,,69,69,69,69,,69,69,69,69,,,,,69,69,,,,490,490,490', +'69,490,69,69,69,490,490,,,,490,,490,490,490,490,490,490,490,,,,,,490', +'490,490,490,490,490,490,,,490,,,,,,,490,,,490,490,490,490,490,490,490', +'490,,490,490,490,,490,490,490,490,490,,,,,,,,,,,,,,,,,,,,490,,,490,', +',490,490,,,490,,,,,,490,,,,,,,,,490,,,,,490,490,490,490,,490,490,490', +'490,,,,,490,490,,,,70,70,70,490,70,490,490,490,70,70,,,,70,,70,70,70', +'70,70,70,70,,,,,,70,70,70,70,70,70,70,,,70,,,,,,,70,,,70,70,70,70,70', +'70,70,70,,70,70,70,,70,70,,,70,,,,,,,,,,,,,,,,,,,,70,,,70,,,70,70,,', +'70,,,,,,,,,,,,,,,,,,,,70,70,70,70,,70,70,70,70,,,,,70,70,,,,488,488', +'488,70,488,70,70,70,488,488,,,,488,,488,488,488,488,488,488,488,,,,', +',488,488,488,488,488,488,488,,,488,,,,,,,488,,,488,488,488,488,488,488', +'488,488,488,488,488,488,,488,488,488,488,488,,,,,,,,,,,,,,,,,,,,488', +',,488,,,488,488,,,488,,,,488,,488,,,488,,,,,,488,,,,,488,488,488,488', +',488,488,488,488,,,,,488,488,,,,486,486,486,488,486,488,488,488,486', +'486,,,,486,,486,486,486,486,486,486,486,,,,,,486,486,486,486,486,486', +'486,,,486,,,,,,,486,,,486,486,486,486,486,486,486,486,486,486,486,486', +',486,486,486,486,486,,,,,,,,,,,,,,,,,,,,486,,,486,,,486,486,,,486,,486', +',486,,486,,,486,,,,,,486,,,,,486,486,486,486,,486,486,486,486,,,,,486', +'486,,,,118,118,118,486,118,486,486,486,118,118,,,,118,,118,118,118,118', +'118,118,118,,,,,,118,118,118,118,118,118,118,,,118,,,,,,,118,,,118,118', +'118,118,118,118,118,118,,118,118,118,,118,118,118,118,118,,,,,,,,,,', +',,,,,,,,,118,,,118,,,118,118,,,118,,,,,,118,,,,,,,,,118,,,,,118,118', +'118,118,,118,118,118,118,,,,,118,118,,,,316,316,316,118,316,118,118', +'118,316,316,,,,316,,316,316,316,316,316,316,316,,,,,,316,316,316,316', +'316,316,316,,,316,,,,,,,316,,,316,316,316,316,316,316,316,316,,316,316', +'316,,316,316,,,316,,,,,,,,,,,,,,,,,,,,316,,,316,,,316,316,,,316,,,,', +',,,,,,,,,,,,,,,316,316,316,316,,316,316,316,316,,,,,316,316,,,,324,324', +'324,316,324,316,316,316,324,324,,,,324,,324,324,324,324,324,324,324', +',,,,,324,324,324,324,324,324,324,,,324,,,,,,,324,,,324,324,324,324,324', +'324,324,324,,324,324,324,,324,324,324,324,324,,,,,,,,,,,,,,,,,,,,324', +',,324,324,,324,324,,,324,,,,,,324,,,,,,,,,324,,,,,324,324,324,324,,324', +'324,324,324,,,,,324,324,,,,,424,,324,,324,324,324,424,424,424,,,424', +'424,424,,424,,,,,,,,,424,424,424,424,,,,,,,,424,424,,424,424,424,424', +'424,,,,,,,,,,,,,,,,,,,,,,,424,424,424,424,424,424,424,424,424,424,424', +'424,424,424,,,424,424,424,,,424,,,424,,,424,424,,424,,424,,424,,424', +'424,,424,424,424,424,424,,424,424,424,,,,,,,,,,,,,,424,,,424,424,424', +'424,425,424,,424,,,,425,425,425,,,425,425,425,,425,,,,,,,,,425,425,425', +'425,,,,,,,,425,425,,425,425,425,425,425,,,,,,,,,,,,,,,,,,,,,,,425,425', +'425,425,425,425,425,425,425,425,425,425,425,425,,,425,425,425,,,425', +',,425,,,425,425,,425,,425,,425,,425,425,,425,425,425,425,425,,425,425', +'425,,,,,,,,,,,,,,425,,,425,425,425,425,56,425,,425,,,,56,56,56,,,56', +'56,56,,56,,,,,,,,,,56,56,56,,,,,,,,56,56,,56,56,56,56,56,,,,,,,,,,,', +',,,,,,,,,,,56,56,56,56,56,56,56,56,56,56,56,56,56,56,,,56,56,56,,,56', +',,56,,,56,56,,56,,56,,56,,56,56,,56,56,56,56,56,,56,,56,963,,963,963', +'963,963,963,,,,,,,56,,963,56,56,56,56,415,56,,56,,,,415,415,415,,,415', +'415,415,,415,963,,,,,,,,415,415,415,963,963,,,,963,,,415,415,,415,415', +'415,415,415,,,,,,,,,,,,,,,,,,,,,,,415,415,415,415,415,415,415,415,415', +'415,415,415,415,415,,,415,415,415,,,415,,415,415,,,415,415,,415,,415', +',415,,415,415,,415,415,415,415,415,,415,415,415,,,,,,,,,,,,,,415,,27', +'415,415,,415,,415,27,27,27,,,27,27,27,,27,,,,,,,,,27,27,27,,,,,,,,,27', +'27,,27,27,27,27,27,,,,,,,,,,,,,,,,,,,,,,,27,27,27,27,27,27,27,27,27', +'27,27,27,27,27,,,27,27,27,,,27,,27,27,,,27,27,,27,,27,,27,,27,27,,27', +'27,27,27,27,,27,27,27,,,,,,,,,,,,,,27,,474,27,27,,27,,27,474,474,474', +',,474,474,474,614,474,614,614,614,614,614,,,,474,474,,,,614,,,,,,474', +'474,,474,474,474,474,474,,,,,,,,,614,,,,,,,,,614,614,614,614,,,,614', +',,,,,,,,474,,28,,,,,474,,28,28,28,474,474,28,28,28,614,28,,,,,,,,,,28', +'28,,,,,,474,474,,28,28,,28,28,28,28,28,,,,,474,,,474,,,,,474,,,,,,,', +',,28,28,28,28,28,28,28,28,28,28,28,28,28,28,,,28,28,28,,,28,,28,28,', +',28,28,,28,,28,,28,,28,28,,28,28,28,28,28,,28,,28,,,,,,,,,,,,,,28,,', +'28,28,,28,,28,395,395,395,395,395,395,395,395,395,395,395,395,395,395', +'395,395,395,395,395,395,395,395,395,395,,,,395,395,395,395,395,395,395', +'395,395,395,,,,,,395,395,395,395,395,395,395,395,395,,,395,,,,,,,,395', +'395,,395,395,395,395,395,395,395,,,395,395,,,,395,395,395,395,,,,,,', +',,,,,,,395,395,,395,395,395,395,395,395,395,395,395,395,395,395,,,395', +'395,,,,,,,,,,,,,,395,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9', +',,,9,9,9,9,9,9,9,9,9,9,,,,,,9,9,9,9,9,9,9,9,9,,,9,,,,,,,,9,9,,9,9,9', +'9,9,9,9,,,9,9,,,,9,9,9,9,,,,,,,,,,,,,,9,9,,9,9,9,9,9,9,9,9,9,9,9,9,', +',9,9,,,,,,,,,,,,,,9,584,584,584,584,584,584,584,584,584,584,584,584', +'584,584,584,584,584,584,584,584,584,584,584,584,,,,584,584,584,584,584', +'584,584,584,584,584,,,,,,584,584,584,584,584,584,584,584,584,,,584,', +',,,,,,584,584,,584,584,584,584,584,584,584,,,584,584,,,,584,584,584', +'584,,,,,,,,,,,,,,584,584,,584,584,584,584,584,584,584,584,584,584,584', +'584,,,584,584,,,,,,,,,,,,,,584,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8', +'8,8,8,8,8,,,,8,8,8,8,8,8,8,8,8,8,,,,,,8,8,8,8,8,8,8,8,8,8,,8,,,,,,,', +'8,8,,8,8,8,8,8,8,8,,,8,8,,,,8,8,8,8,,,,,,,,,,,,,,8,8,,8,8,8,8,8,8,8', +'8,8,8,8,8,,,8,8,,,,,,,,,,,,,,8,71,71,71,71,71,71,71,71,71,71,71,71,71', +'71,71,71,71,71,71,71,71,71,71,71,,,,71,71,71,71,71,71,71,71,71,71,,', +',,,71,71,71,71,71,71,71,71,71,71,71,71,,71,,,,,,71,71,,71,71,71,71,71', +'71,71,,,71,71,,,,71,71,71,71,,,,,,71,,,,,,,,71,71,,71,71,71,71,71,71', +'71,71,71,71,71,71,,,71,714,714,714,714,714,714,714,714,714,714,714,714', +'714,714,714,714,714,714,714,714,714,714,714,714,,,,714,714,714,714,714', +'714,714,714,714,714,,,,,,714,714,714,714,714,714,714,714,714,,,714,', +',,,,,,714,714,,714,714,714,714,714,714,714,,,714,714,,,,714,714,714', +'714,,,,,,,,,,,,,,714,714,,714,714,714,714,714,714,714,714,714,714,714', +'714,544,544,714,,544,,,,,,,,544,544,,544,544,544,544,544,544,544,,,544', +'544,,,,544,544,544,544,,,,,,544,,,,,,,,544,544,,544,544,544,544,544', +'544,544,544,544,544,544,544,261,261,544,,261,,,,,,,,261,261,,261,261', +'261,261,261,261,261,,,261,261,,,,261,261,261,261,,,,,,,,,,,,,,261,261', +',261,261,261,261,261,261,261,261,261,261,261,261,441,441,261,,441,,', +',,,,,441,441,,441,441,441,441,441,441,441,,,441,441,,,,441,441,441,441', +',,,,,441,,,,,,,,441,441,,441,441,441,441,441,441,441,441,441,441,441', +'441,440,440,441,,440,,,,,,,,440,440,,440,440,440,440,440,440,440,,,440', +'440,,,,440,440,440,440,,,,,,440,,,,,,,,440,440,,440,440,440,440,440', +'440,440,440,440,440,440,440,506,506,440,,506,,,,,,,,506,506,,506,506', +'506,506,506,506,506,,,506,506,,,,506,506,506,506,,,,,,506,,,,,,,,506', +'506,,506,506,506,506,506,506,506,506,506,506,506,506,507,507,506,,507', +',,,,,,,507,507,,507,507,507,507,507,507,507,,,507,507,,,,507,507,507', +'507,,,,,,507,,,,,,,,507,507,,507,507,507,507,507,507,507,507,507,507', +'507,507,918,918,507,,918,,,,,,,,918,918,,918,918,918,918,918,918,918', +',,918,918,,,,918,918,918,918,,,,,,918,,,,,,,,918,918,,918,918,918,918', +'918,918,918,918,918,918,918,918,516,516,918,,516,,,,,,,,516,516,,516', +'516,516,516,516,516,516,,,516,516,,,,516,516,516,516,,,,,,516,,,,,,', +',516,516,,516,516,516,516,516,516,516,516,516,516,516,516,517,517,516', +',517,,,,,,,,517,517,,517,517,517,517,517,517,517,,,517,517,,,,517,517', +'517,517,,,,,,517,,,,,,,,517,517,,517,517,517,517,517,517,517,517,517', +'517,517,517,972,972,517,,972,,,,,,,,972,972,,972,972,972,972,972,972', +'972,,,972,972,,,,972,972,972,972,,,,,,972,,,,,,,,972,972,,972,972,972', +'972,972,972,972,972,972,972,972,972,973,973,972,,973,,,,,,,,973,973', +',973,973,973,973,973,973,973,,,973,973,,,,973,973,973,973,,,,,,973,', +',,,,,,973,973,,973,973,973,973,973,973,973,973,973,973,973,973,213,213', +'973,,213,,,,,,,,213,213,,213,213,213,213,213,213,213,,,213,213,,,,213', +'213,213,213,,,,,,213,,,,,,,,213,213,,213,213,213,213,213,213,213,213', +'213,213,213,213,552,552,213,,552,,,,,,,,552,552,,552,552,552,552,552', +'552,552,,,552,552,,,,552,552,552,552,,,,,,552,,,,,,,,552,552,,552,552', +'552,552,552,552,552,552,552,552,552,552,551,551,552,,551,,,,,,,,551', +'551,,551,551,551,551,551,551,551,,,551,551,,,,551,551,551,551,,,,,,551', +',,,,,,,551,551,,551,551,551,551,551,551,551,551,551,551,551,551,545', +'545,551,,545,,,,,,,,545,545,,545,545,545,545,545,545,545,,,545,545,', +',,545,545,545,545,,,,,,545,,,,,,,,545,545,,545,545,545,545,545,545,545', +'545,545,545,545,545,212,212,545,,212,,,,,,,,212,212,,212,212,212,212', +'212,212,212,,,212,212,,,,212,212,212,212,,,,,,212,,,,,,,,212,212,,212', +'212,212,212,212,212,212,212,212,212,212,212,,796,212,796,796,796,796', +'796,,794,,794,794,794,794,794,796,,,,,,,,794,,841,,841,841,841,841,841', +',,,,,796,,,841,,,,,794,796,796,796,796,,,,796,794,794,794,794,,,,794', +'841,,843,,843,843,843,843,843,841,841,841,841,,,,841,843,,1011,,1011', +'1011,1011,1011,1011,,933,,933,933,933,933,933,1011,,,,,843,,,933,,,', +',,843,843,843,843,,,,843,1011,,,,,,,,933,,,1011,1011,,,,1011,933,933', +'933,933,,,935,933,935,935,935,935,935,937,,937,937,937,937,937,939,935', +'939,939,939,939,939,1001,937,1001,1001,1001,1001,1001,,939,,,,,,,1001', +'935,,,,,,,937,,,,935,935,,939,,935,,937,937,,1001,,937,,939,939,,,,939', +',1001,1001,,,533,1001,533,533,533,533,533,,712,,712,712,712,712,712', +'533,,,,,,,,712,,957,,957,957,957,957,957,,,,,,533,533,,957,,,,,712,533', +'533,533,533,,,,533,712,712,712,712,,,,712,957,,798,,798,798,798,798', +'798,957,957,957,957,,,,957,798,,655,,655,655,655,655,655,,713,,713,713', +'713,713,713,655,,,,,798,,,713,,,,,,,,798,798,,,,798,655,,,,,,,,713,655', +'655,655,655,,,,655,713,713,713,713,,,,713' ] + racc_action_check = arr = ::Array.new(24863, nil) + idx = 0 + clist.each do |str| + str.split(',', -1).each do |i| + arr[idx] = i.to_i unless i.empty? + idx += 1 + end + end + +racc_action_pointer = [ + 1585, 80, nil, 336, nil, 8506, 1445, 63, 23176, 22920, + 83, nil, 64, 140, 1308, 416, 101, 716, nil, -71, + 7581, 2705, 225, nil, 479, nil, 275, 22450, 22658, 6132, + 6394, 6525, nil, 3125, 8236, 8367, nil, 172, 168, 386, + 262, 250, 15727, 15858, 16251, 191, 677, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 22187, nil, -73, 19796, + 19927, 123, nil, 20189, 20320, nil, nil, 20451, 20590, 20868, + 21130, 23304, nil, nil, nil, nil, nil, nil, nil, 456, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 604, nil, nil, + 332, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 337, nil, 9300, nil, nil, nil, nil, 21523, 19534, + 18879, 18748, 18486, 1445, nil, 439, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 258, nil, 2705, 17561, + 17168, 17037, 24393, 24149, 16120, 15596, 15465, 15334, 14941, 14286, + nil, nil, 927, 138, -56, 372, -85, 295, 362, nil, + 7974, 2845, 365, 7311, 7180, 6918, 6263, 5608, 5338, 5207, + 604, 13500, 13369, 13238, 12452, 12321, 11666, 11535, 10618, 9963, + 19141, 19403, 9439, 9832, 10880, 11011, 11142, 11273, 11404, nil, + nil, 23539, nil, nil, 378, 11797, 11928, nil, nil, nil, + nil, nil, nil, nil, 12190, nil, 2845, nil, 353, 373, + nil, 12583, 425, 12714, nil, 12845, 12976, nil, nil, 573, + nil, 5477, 1570, 414, 387, 4805, 400, 442, 426, 7442, + 2145, 1237, 1207, 1168, 532, 1097, nil, 504, 499, 166, + nil, nil, nil, 561, 223, 527, 21654, nil, 337, 598, + 1067, nil, 627, nil, 21785, 2285, 13631, 571, nil, 81, + -98, 622, 605, 518, 636, nil, nil, -3, -10, 32, + 16382, 16513, 219, 714, 603, 64, 65, 745, 704, -12, + 745, nil, nil, 367, 340, 213, nil, 787, nil, 9, + 17692, nil, nil, nil, 369, -53, 181, -24, -30, 309, + 508, 506, 505, nil, 365, nil, 19010, nil, 149, 210, + 259, 270, 390, -39, -34, 397, nil, nil, nil, nil, + nil, nil, nil, nil, 658, 22792, nil, nil, nil, nil, + 659, nil, nil, 640, 20058, 651, nil, nil, 885, 671, + nil, 672, 693, 280, -83, 22321, nil, nil, nil, 110, + 0, 742, nil, nil, 21919, 22053, nil, 1445, nil, 693, + nil, nil, 745, nil, nil, nil, nil, 213, nil, 745, + 23661, 23600, 8768, 136, 8899, 9030, 9161, 4105, 3965, 3136, + 3241, 773, 778, 791, 792, 5207, 5338, 5477, 4245, 4525, + 4665, 3405, 3265, 5076, 4945, 4805, 4385, 3825, 3235, 3293, + 3545, 3685, 2425, 338, 22579, nil, nil, nil, nil, 739, + nil, 268, 346, 740, nil, nil, 21392, nil, 21261, nil, + 20999, nil, nil, nil, nil, 20729, 1430, 745, 742, 742, + nil, nil, 744, 18617, 749, 18347, 23722, 23783, 1028, 793, + nil, 18216, 765, nil, 18085, 17954, 23905, 23966, 2565, 17823, + 892, 900, 648, 821, nil, 17430, nil, nil, 17299, nil, + nil, nil, nil, 24669, 2005, 900, nil, 3825, 29, 71, + 897, 912, 16906, 16775, 23478, 24332, 57, nil, nil, 440, + nil, 24271, 24210, 16644, nil, nil, nil, 109, -31, 4945, + 833, nil, 194, nil, nil, nil, 728, nil, nil, nil, + 805, nil, nil, 142, nil, 147, nil, nil, 791, nil, + 792, nil, nil, nil, 23048, nil, 794, 15203, 15072, 445, + 847, 14810, 14679, 14548, 14417, 849, nil, nil, 14155, 14024, + 870, nil, 13893, 13762, nil, nil, 197, 167, 468, 220, + 841, 1025, 843, nil, 22543, nil, 2565, 952, -21, 206, + nil, 3685, 4245, nil, 856, nil, 910, 8637, nil, nil, + nil, 885, -118, 8105, 866, nil, 879, 25, 24, 921, + 436, 1445, 923, 882, 7049, 1165, 953, -8, 1018, 6001, + nil, 903, nil, 237, nil, 24750, nil, 904, 905, nil, + 906, 916, 918, nil, nil, nil, nil, nil, nil, nil, + 911, 3205, nil, nil, 13107, nil, nil, nil, 1002, nil, + nil, nil, 1010, nil, nil, 1011, 51, nil, 1050, nil, + nil, nil, nil, 1056, nil, -1, 936, 39, 3, 136, + 149, 19665, 476, 1165, nil, 937, 1165, 19272, nil, nil, + 1072, 1025, 24677, 24758, 23417, nil, nil, nil, nil, nil, + nil, 1725, nil, nil, nil, nil, nil, nil, nil, 952, + 9570, 1585, 9701, nil, 973, nil, 1725, nil, 1865, nil, + nil, 2005, nil, 2145, nil, 2285, 10094, 10225, 10356, 10487, + -40, 10749, 978, 982, nil, 986, 991, 996, nil, 1028, + 1008, 1004, 1008, 12059, nil, nil, 1141, nil, nil, 1305, + 1039, 1146, nil, nil, nil, 1024, 406, nil, nil, 1150, + nil, 2985, 1026, 1075, nil, nil, 1082, nil, 34, 1043, + 793, nil, nil, 658, 24463, nil, 24455, nil, 24733, nil, + 5076, nil, 3111, nil, 1044, 325, 1048, nil, nil, nil, + nil, 1170, nil, 5739, 1180, 3405, 3545, nil, 5870, 3965, + 37, 69, nil, 1182, 467, 4665, nil, 1183, 1063, 461, + nil, 1074, 1074, nil, 1305, 6656, 6787, 2985, 918, nil, + nil, 24480, nil, 24519, nil, 7489, nil, nil, 1112, 1151, + 7712, 1305, 1170, nil, 1133, nil, nil, nil, 2425, nil, + nil, 7, 7843, nil, nil, nil, nil, nil, 1161, 1122, + nil, nil, nil, 1126, 1131, nil, 1136, 1144, nil, 1145, + nil, nil, 1149, 3140, 1156, 3485, nil, nil, 10, nil, + 1281, 1283, nil, 80, nil, nil, nil, 1286, nil, nil, + nil, 1208, nil, 1165, nil, nil, 1166, 1169, 1179, 1180, + nil, 1184, nil, 370, nil, nil, nil, 304, 23844, nil, + nil, nil, 885, 957, 888, 885, 1263, 817, nil, 4525, + 4385, nil, nil, 24544, nil, 24596, nil, 24603, nil, 24610, + nil, nil, nil, nil, 434, 3531, 1186, 4105, nil, nil, + nil, nil, nil, 3265, nil, 1865, nil, 24694, nil, 8414, + nil, 20637, nil, 22250, nil, nil, nil, 1291, 1240, 1242, + 1325, 15989, 24027, 24088, 748, 1220, 1332, 1214, 1228, 1232, + 1253, 1258, 3421, 1261, 3391, 715, 1386, 1390, 1271, 1276, + 1284, 1285, nil, nil, 1289, 26, 33, 39, 1025, nil, + nil, 24617, nil, nil, nil, nil, 3429, 1291, nil, nil, + nil, 24536, nil, nil, nil, nil, 8, 1296, 1297, -81, + nil, nil ] + +racc_action_default = [ + -3, -598, -1, -584, -4, -598, -7, -598, -598, -598, + -598, -29, -598, -598, -598, -279, -598, -40, -43, -586, + -598, -48, -50, -51, -52, -56, -256, -256, -256, -293, + -329, -330, -68, -11, -72, -80, -82, -598, -491, -492, + -598, -598, -598, -598, -598, -586, -237, -270, -271, -272, + -273, -274, -275, -276, -277, -278, -574, -281, -283, -597, + -565, -301, -303, -598, -598, -307, -310, -584, -598, -598, + -598, -598, -331, -332, -334, -335, -432, -433, -434, -435, + -436, -457, -439, -440, -459, -461, -444, -449, -453, -455, + -471, -459, -473, -475, -476, -477, -478, -572, -480, -481, + -573, -483, -484, -485, -486, -487, -488, -489, -490, -495, + -496, -598, -2, -585, -593, -594, -595, -6, -598, -598, + -598, -598, -598, -3, -17, -598, -111, -112, -113, -114, + -115, -116, -117, -118, -119, -123, -124, -125, -126, -127, + -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, -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, -22, -120, -11, -598, + -598, -246, -598, -598, -598, -598, -598, -598, -598, -586, + -587, -47, -598, -491, -492, -598, -279, -598, -598, -229, + -598, -11, -598, -598, -598, -598, -598, -598, -598, -598, + -598, -598, -598, -598, -598, -598, -598, -598, -598, -598, + -598, -598, -598, -598, -598, -598, -598, -598, -598, -401, + -403, -598, -582, -583, -57, -246, -598, -300, -407, -416, + -418, -63, -413, -64, -586, -65, -238, -251, -260, -260, + -255, -598, -261, -598, -567, -598, -598, -66, -67, -584, + -12, -598, -15, -598, -70, -11, -586, -598, -73, -76, + -11, -88, -89, -598, -598, -96, -293, -296, -586, -598, + -329, -330, -333, -414, -598, -78, -598, -84, -290, -474, + -598, -214, -215, -230, -598, -11, -598, -586, -239, -590, + -590, -598, -598, -590, -598, -302, -392, -49, -598, -598, + -598, -598, -584, -598, -585, -491, -492, -598, -598, -279, + -598, -345, -346, -106, -107, -598, -109, -598, -279, -598, + -598, -491, -492, -322, -111, -112, -153, -154, -155, -171, + -176, -183, -186, -324, -598, -563, -598, -437, -598, -598, + -598, -598, -598, -598, -598, -598, 1022, -5, -596, -23, + -24, -25, -26, -27, -598, -598, -19, -20, -21, -121, + -598, -30, -39, -266, -598, -598, -265, -31, -196, -586, + -247, -260, -260, -575, -576, -256, -411, -577, -578, -576, + -575, -256, -410, -412, -577, -578, -37, -204, -38, -598, + -41, -42, -194, -261, -44, -45, -46, -586, -299, -598, + -598, -598, -246, -290, -598, -598, -598, -205, -206, -207, + -208, -209, -210, -211, -212, -216, -217, -218, -219, -220, + -221, -222, -223, -224, -225, -226, -227, -228, -231, -232, + -233, -234, -586, -381, -256, -575, -576, -54, -58, -586, + -257, -381, -381, -586, -295, -252, -598, -253, -598, -258, + -598, -262, -570, -571, -10, -585, -14, -3, -586, -69, + -288, -85, -74, -598, -586, -246, -598, -598, -95, -598, + -474, -598, -81, -86, -598, -598, -598, -598, -235, -598, + -424, -598, -284, -598, -240, -592, -591, -242, -592, -291, + -292, -566, -304, -524, -11, -336, -337, -11, -598, -598, + -598, -598, -598, -246, -598, -598, -290, -315, -106, -107, + -108, -598, -598, -246, -318, -497, -498, -598, -598, -11, + -502, -326, -586, -438, -458, -463, -598, -465, -441, -460, + -598, -462, -443, -598, -446, -598, -448, -451, -598, -452, + -598, -472, -8, -18, -598, -28, -269, -598, -598, -415, + -598, -248, -250, -598, -598, -59, -245, -408, -598, -598, + -61, -409, -598, -598, -298, -588, -575, -576, -575, -576, + -586, -194, -598, -382, -586, -384, -11, -53, -404, -381, + -243, -11, -11, -294, -260, -259, -263, -598, -568, -569, + -13, -598, -71, -598, -77, -83, -586, -575, -576, -244, + -92, -94, -598, -79, -598, -203, -213, -586, -597, -597, + -282, -586, -287, -590, -393, -524, -396, -562, -562, -507, + -509, -509, -509, -523, -525, -526, -527, -528, -529, -530, + -531, -598, -533, -535, -537, -542, -544, -545, -547, -552, + -554, -555, -557, -558, -559, -598, -597, -338, -597, -308, + -339, -340, -311, -598, -314, -598, -586, -575, -576, -579, + -289, -598, -106, -107, -110, -586, -11, -598, -500, -320, + -598, -11, -524, -524, -598, -564, -464, -467, -468, -469, + -470, -11, -442, -445, -447, -450, -454, -456, -122, -267, + -598, -197, -598, -589, -260, -33, -199, -34, -200, -60, + -35, -202, -36, -201, -62, -195, -598, -598, -598, -598, + -415, -598, -562, -562, -363, -365, -365, -365, -380, -598, + -586, -386, -531, -539, -540, -550, -598, -406, -405, -11, + -598, -598, -254, -264, -16, -75, -90, -87, -297, -597, + -343, -11, -425, -597, -426, -427, -598, -241, -598, -586, + -598, -505, -506, -598, -598, -516, -598, -519, -598, -521, + -598, -347, -598, -349, -351, -358, -586, -536, -546, -556, + -560, -598, -341, -598, -598, -11, -11, -313, -598, -11, + -415, -598, -415, -598, -598, -11, -323, -598, -586, -598, + -327, -598, -268, -32, -198, -249, -598, -236, -598, -361, + -362, -371, -373, -598, -376, -598, -378, -383, -598, -598, + -598, -538, -598, -402, -598, -417, -419, -9, -11, -431, + -344, -598, -598, -429, -285, -394, -397, -399, -598, -562, + -543, -561, -508, -509, -509, -534, -509, -509, -553, -509, + -531, -548, -586, -598, -356, -598, -532, -305, -598, -306, + -598, -598, -263, -597, -316, -319, -499, -598, -325, -501, + -503, -502, -466, -562, -541, -364, -365, -365, -365, -365, + -551, -365, -385, -586, -388, -390, -391, -549, -598, -290, + -55, -430, -11, -97, -98, -598, -598, -105, -428, -11, + -11, -395, -504, -598, -512, -598, -514, -598, -517, -598, + -520, -522, -348, -350, -354, -598, -359, -11, -309, -312, + -420, -421, -422, -11, -321, -11, -360, -598, -368, -598, + -370, -598, -374, -598, -377, -379, -387, -598, -289, -579, + -424, -246, -598, -598, -104, -598, -598, -509, -509, -509, + -509, -352, -598, -357, -598, -597, -598, -598, -365, -365, + -365, -365, -389, -423, -586, -575, -576, -579, -103, -398, + -400, -598, -510, -513, -515, -518, -598, -355, -342, -317, + -328, -598, -366, -369, -372, -375, -415, -509, -353, -365, + -511, -367 ] + +clist = [ +'218,335,328,14,260,373,2,409,14,541,277,277,277,132,132,6,487,278,278', +'278,6,261,648,222,129,129,324,431,312,312,756,521,222,222,222,711,14', +'303,303,124,207,811,415,421,113,338,339,329,406,342,134,134,298,319', +'428,589,534,537,625,878,625,479,312,312,312,296,222,222,806,315,222', +'347,357,357,628,779,112,550,943,656,524,527,755,875,531,763,759,129', +'910,512,916,474,294,381,946,337,337,221,914,337,389,390,391,392,268', +'272,264,271,273,116,478,279,279,279,628,814,14,663,117,689,692,222,222', +'222,222,14,14,857,6,394,875,630,275,287,288,616,206,393,6,379,343,330', +'333,621,622,352,385,573,575,487,337,337,337,337,983,359,363,402,395', +'619,584,331,618,625,625,375,332,532,350,554,757,374,325,116,326,651', +'438,327,628,943,336,340,815,564,341,571,574,574,816,701,953,1007,277', +'706,825,559,878,405,560,882,714,789,910,405,791,792,693,901,916,758', +'760,14,222,222,222,1018,992,222,222,222,222,222,222,913,654,865,387', +'533,875,425,788,484,848,929,14,930,473,481,610,663,482,950,783,861,377', +'378,277,277,434,435,436,437,875,499,278,277,750,906,828,829,380,868', +'278,1,877,710,879,382,222,222,415,421,383,704,384,716,634,222,721,707', +'873,769,776,870,643,904,401,407,,509,416,426,430,312,14,,663,663,14', +'839,840,636,303,14,,,496,,523,763,312,909,763,911,763,,763,,,303,951', +',538,539,,,510,498,14,222,495,,504,502,513,,639,,,696,1008,,820,222', +'222,,639,,279,705,874,822,876,,294,26,279,,522,294,26,772,494,222,,', +',,,480,,561,337,337,639,26,955,483,724,222,724,,639,,26,26,26,268,26', +',590,272,558,,604,116,,907,,908,132,978,894,979,787,980,775,625,562', +',,129,823,819,431,540,932,827,26,26,,628,26,277,,989,583,990,763,991', +'763,,763,,763,,620,134,,,623,739,,,,222,744,,116,,956,,,612,,632,,425', +',,,635,,,,555,,,26,1017,,772,993,26,26,26,26,26,26,1019,,,763,,,,277', +',784,977,,,,596,,595,,312,14,601,14,600,,631,,312,303,,222,,,,6,988', +'303,,,,416,715,,513,222,425,277,,,,,513,695,897,,425,277,,,14,,,14,', +',39,,,222,,39,,,647,596,,617,,222,,768,952,,425,14,26,26,26,26,425,624', +'26,26,26,26,26,26,16,39,302,302,922,16,,,,416,,26,,,132,,590,785,,416', +'761,222,222,,767,129,222,222,,778,222,947,653,16,,,346,362,362,362,728', +',590,,14,26,26,416,,14,14,134,312,,26,416,,786,,,,303,405,312,,1016', +',,351,690,690,26,303,830,,26,513,,,,26,39,,,,,987,777,708,709,39,39', +',,,735,737,,734,,740,742,590,,430,26,26,,821,,,590,,16,824,,,,,,26,26', +'16,16,,,,,,222,,,,,14,222,,,,14,26,,596,,,601,,859,,14,,863,,,,129,26', +',337,,222,,,,337,,761,,,,,,,,670,,39,,,,,,312,,,13,753,,886,,13,851', +'994,,,761,,14,,39,,,,,,,,,16,14,899,,,,,429,,,13,,888,,26,,,,,639,,', +',16,,754,833,,,795,797,799,,222,,14,14,,,14,,,,,,14,,762,,,,39,,,,39', +'942,,,302,39,312,337,,,,,26,,26,917,,,312,,,302,26,14,,,,925,16,,39', +',16,670,,13,26,16,,,,,,,13,13,,,,801,,26,,,26,,966,,,,26,,16,,,,,,,', +'26,,,15,,,26,,15,,,,,,,,,14,,690,670,670,896,,14,14,425,900,,869,,,', +',,,15,305,305,,26,26,14,,277,26,26,,14,26,14,,,,,,,,,,13,,,26,,,222', +'590,26,26,,349,358,358,,,871,903,,871,753,425,753,13,753,,,,,,,,,,,', +',,,,,,670,,670,,,,,,801,,,884,,,15,934,936,,938,940,,941,871,15,15,754', +',754,39,754,39,,,,,,302,,,,416,13,,,302,13,26,762,,762,13,26,26,,,,26', +',,,16,,16,,,,26,39,,,39,842,844,846,,13,,26,,,,,,,,,,,,801,,801,39,', +'753,,753,,753,16,753,,16,,,,,,,15,,,,,26,,,,,1002,1003,1004,1005,,16', +',26,,,,,,15,,,,,,,670,,754,,754,,754,,754,753,39,981,801,,297,39,39', +',,26,1020,26,26,,762,26,,302,429,,,26,,,,,,,302,,,,16,,,,,16,16,801', +',801,,15,,,754,15,,,,305,15,,26,,,,,,,,,801,,,,,305,,,,,958,960,962', +'964,15,965,,,,,,,,,,,,39,,,,,39,13,,13,,,,,,,39,,,,,,,,,,,,,26,,,,16', +',,26,26,16,,,,,,,,13,,16,13,,,,,26,,,,362,,26,,26,,39,,1012,1013,1014', +'1015,,13,,,,,39,,26,,,,,,,,,,,,400,,,,,,16,1021,,,,,,,,,,,16,,39,39', +',297,39,,,,,,39,,,,,,,,13,,,,,13,13,,,,,,,,16,16,,362,16,,,,,,16,39', +',,,924,15,,15,,,,,,305,,,,,,,,305,38,,297,,,38,,297,,,16,,,,928,,,,', +',,,15,,,15,,,,,,,,38,301,301,,,,,,,39,13,,,,15,13,39,39,,,,720,,,,13', +',,,,,,,,39,345,361,361,361,,39,16,39,,,,,,16,16,,,,,,,,,,,,,,,,,16,', +',,,15,16,13,16,,15,15,,,38,,,,,13,,,305,38,38,,,,,,,,,305,,,,,,334,', +',,,,,,,,,,,,13,13,,,13,,229,,,,13,,,,,276,276,276,,,,,,,,,,,321,322', +'323,,,,,,,,,,,,15,13,,276,276,15,,,,,,,,,38,15,,,,,,,,,,,,,,,,,,,,,', +'38,,,,,,,,,,686,,,688,,,,,,,358,,,,,,15,,13,,,,,,,13,13,,15,,,,,,,,', +',,,,,,13,,,403,,,13,38,13,433,,38,,,,301,38,,,15,15,,,15,,,,,,15,,,301', +',,,,,,766,,38,,,770,771,,,,,,,,,358,,,,,,,,15,276,408,276,927,,427,432', +',,,,,489,,491,,492,493,,,,229,,,447,448,449,450,451,452,453,454,455', +'456,457,458,459,460,461,462,463,464,465,466,467,468,469,470,471,472', +',,,,,,276,276,,,,,,15,,276,,,,,15,15,276,,276,,276,276,,,,831,,,,,,', +'15,,,,,,15,,15,,,,,,,,,,,,,,,,,,,518,,,,,,,,,,,,,,854,,,,,,586,,,,,', +'860,,,,,,,38,,38,,,,,,301,,,,,,,,301,,,,,,,,,,,890,891,,,893,,,,,,,', +'38,,,38,,,,,276,,,,,,,,,,,,,,,,,38,,,,,626,921,334,,629,,,,,,,,,,,,276', +',427,611,408,,,,,,,,,,,,,,,,,,,626,,,334,,,,,,,,,,38,,,,433,38,38,,276', +',276,,276,970,,,,301,,,975,976,,,,,,276,301,,,,,,,,645,646,985,,,,,', +'986,,,276,,729,276,,,626,334,,,,,,,,,,276,276,,,,,,,,,,276,,,,,,,,,', +',,,,773,38,,,,,38,,,,,,,,,,38,,,,276,731,782,,276,276,736,738,,,,741', +'743,,,611,745,,,,,,,,,,,807,,,,,,,,,,,361,,276,,,,38,,,,,,,,,,,,38,', +',,,,276,,,,,,,,,,,,,,,,,,,,,832,,,,276,,,38,38,,,38,,,,,,38,,,,,,,,', +',,,,,,,,,,,,,,,,361,,,,,,,,38,,,,923,,,,,,276,,834,,,,,,,,881,,,,,,736', +'738,743,741,,837,,,,,,,892,,,,,,,,,,,,,,,,,334,,,,,,,,,38,,,,,,,38,38', +',,,,,,,276,,,,,,,,,38,,,,,,38,,38,276,,,,,,,,,,,,,,,,,276,834,,,,,,', +',,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,', +',,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,276' ] + racc_goto_table = arr = ::Array.new(2533, nil) + idx = 0 + clist.each do |str| + str.split(',', -1).each do |i| + arr[idx] = i.to_i unless i.empty? + idx += 1 + end + end + +clist = [ +'31,86,67,22,141,56,2,23,22,92,33,33,33,60,60,7,73,68,68,68,7,36,10,22', +'57,57,31,18,64,64,129,8,22,22,22,98,22,22,22,15,15,90,37,37,6,17,17', +'68,27,17,61,61,49,63,27,24,89,89,74,176,74,23,64,64,64,46,22,22,119', +'50,22,22,22,22,180,11,4,54,117,140,69,69,128,171,69,172,132,57,177,51', +'135,37,45,157,120,29,29,20,134,29,17,17,17,17,71,71,38,38,38,96,39,70', +'70,70,180,11,22,166,5,91,91,22,22,22,22,22,22,12,7,2,171,14,44,44,44', +'40,16,7,7,155,4,70,70,40,40,19,155,158,158,73,29,29,29,29,120,55,55', +'28,30,42,62,66,72,74,74,84,85,88,93,95,130,99,100,96,101,102,47,103', +'180,117,104,105,106,159,107,159,159,159,108,109,110,120,33,111,112,113', +'176,68,114,119,115,140,177,68,124,124,92,116,135,121,127,22,22,22,22', +'120,134,22,22,22,22,22,22,133,136,137,5,138,171,57,139,47,132,142,22', +'143,144,146,23,166,147,148,149,150,153,154,33,33,29,29,29,29,171,47', +'68,33,24,129,140,140,156,132,68,1,128,8,128,160,22,22,37,37,161,54,162', +'163,51,22,164,165,170,40,24,173,51,174,20,20,,31,71,20,20,64,22,,166', +'166,22,124,124,23,22,22,,,7,,31,172,64,128,172,128,172,,172,,,22,11', +',17,17,,,63,46,22,22,6,,46,50,49,,37,,,23,90,,24,22,22,,37,,70,23,130', +'24,130,,45,41,70,,29,45,41,73,4,22,,,,,,44,,36,29,29,37,41,98,44,159', +'22,159,,37,,41,41,41,71,41,,31,71,29,,47,96,,130,,130,60,128,91,128', +'69,128,51,74,29,,,57,8,89,18,4,124,8,41,41,,180,41,33,,128,15,128,172', +'128,172,,172,,172,,47,61,,,47,39,,,,22,39,,96,,124,,,31,,47,,57,,,,47', +',,,96,,,41,128,,73,10,41,41,41,41,41,41,128,,,172,,,,33,,27,130,,,,71', +',38,,64,22,71,22,38,,2,,64,22,,22,,,,7,130,22,,,,71,47,,49,22,57,33', +',,,,49,68,8,,57,33,,,22,,,22,,,53,,,22,,53,,,29,71,,38,,22,,86,92,,57', +'22,41,41,41,41,57,70,41,41,41,41,41,41,26,53,53,53,89,26,,,,71,,41,', +',60,,31,67,,71,31,22,22,,141,57,22,22,,47,22,89,70,26,,,53,53,53,53', +'15,,31,,22,41,41,71,,22,22,61,64,,41,71,,31,,,,22,68,64,,24,,,26,96', +'96,41,22,56,,41,49,,,,41,53,,,,,8,49,96,96,53,53,,,,20,20,,70,,20,20', +'31,,20,41,41,,17,,,31,,26,17,,,,,,41,41,26,26,,,,,,22,,,,,22,22,,,,22', +'41,,71,,,71,,67,,22,,67,,,,57,41,,29,,22,,,,29,,31,,,,,,,,118,,53,,', +',,,64,,,21,123,,47,,21,22,23,,,31,,22,,53,,,,,,,,,26,22,47,,,,,26,,', +'21,,17,,41,,,,,37,,,,26,,125,20,,,169,169,169,,22,,22,22,,,22,,,,,,22', +',118,,,,53,,,,53,47,,,53,53,64,29,,,,,41,,41,22,,,64,,,53,41,22,,,,22', +'26,,53,,26,118,,21,41,26,,,,,,,21,21,,,,118,,41,,,41,,31,,,,41,,26,', +',,,,,,41,,,25,,,41,,25,,,,,,,,,22,,96,118,118,96,,22,22,57,96,,123,', +',,,,,25,25,25,,41,41,22,,33,41,41,,22,41,22,,,,,,,,,,21,,,41,,,22,31', +'41,41,,25,25,25,,,125,123,,125,123,57,123,21,123,,,,,,,,,,,,,,,,,,118', +',118,,,,,,118,,,118,,,25,169,169,,169,169,,169,125,25,25,125,,125,53', +'125,53,,,,,,53,,,,71,21,,,53,21,41,118,,118,21,41,41,,,,41,,,,26,,26', +',,,41,53,,,53,126,126,126,,21,,41,,,,,,,,,,,,118,,118,53,,123,,123,', +'123,26,123,,26,,,,,,,25,,,,,41,,,,,169,169,169,169,,26,,41,,,,,,25,', +',,,,,118,,125,,125,,125,,125,123,53,118,118,,9,53,53,,,41,169,41,41', +',118,41,,53,26,,,41,,,,,,,53,,,,26,,,,,26,26,118,,118,,25,,,125,25,', +',,25,25,,41,,,,,,,,,118,,,,,25,,,,,126,126,126,126,25,126,,,,,,,,,,', +',53,,,,,53,21,,21,,,,,,,53,,,,,,,,,,,,,41,,,,26,,,41,41,26,,,,,,,,21', +',26,21,,,,,41,,,,53,,41,,41,,53,,126,126,126,126,,21,,,,,53,,41,,,,', +',,,,,,,9,,,,,,26,126,,,,,,,,,,,26,,53,53,,9,53,,,,,,53,,,,,,,,21,,,', +',21,21,,,,,,,,26,26,,53,26,,,,,,26,53,,,,53,25,,25,,,,,,25,,,,,,,,25', +'52,,9,,,52,,9,,,26,,,,26,,,,,,,,25,,,25,,,,,,,,52,52,52,,,,,,,53,21', +',,,25,21,53,53,,,,25,,,,21,,,,,,,,,53,52,52,52,52,,53,26,53,,,,,,26', +'26,,,,,,,,,,,,,,,,,26,,,,,25,26,21,26,,25,25,,,52,,,,,21,,,25,52,52', +',,,,,,,,25,,,,,,65,,,,,,,,,,,,,,21,21,,,21,,32,,,,21,,,,,32,32,32,,', +',,,,,,,,32,32,32,,,,,,,,,,,,25,21,,32,32,25,,,,,,,,,52,25,,,,,,,,,,', +',,,,,,,,,,,52,,,,,,,,,,9,,,9,,,,,,,25,,,,,,25,,21,,,,,,,21,21,,25,,', +',,,,,,,,,,,,21,,,65,,,21,52,21,65,,52,,,,52,52,,,25,25,,,25,,,,,,25', +',,52,,,,,,,9,,52,,,9,9,,,,,,,,,25,,,,,,,,25,32,32,32,25,,32,32,,,,,', +'65,,65,,65,65,,,,32,,,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32', +'32,32,32,32,32,32,32,32,32,32,,,,,,,32,32,,,,,,25,,32,,,,,25,25,32,', +'32,,32,32,,,,9,,,,,,,25,,,,,,25,,25,,,,,,,,,,,,,,,,,,,32,,,,,,,,,,,', +',,9,,,,,,65,,,,,,9,,,,,,,52,,52,,,,,,52,,,,,,,,52,,,,,,,,,,,9,9,,,9', +',,,,,,,52,,,52,,,,,32,,,,,,,,,,,,,,,,,52,,,,,65,9,65,,65,,,,,,,,,,,', +'32,,32,32,32,,,,,,,,,,,,,,,,,,,65,,,65,,,,,,,,,,52,,,,65,52,52,,32,', +'32,,32,9,,,,52,,,9,9,,,,,,32,52,,,,,,,,32,32,9,,,,,,9,,,32,,65,32,,', +'65,65,,,,,,,,,,32,32,,,,,,,,,,32,,,,,,,,,,,,,,65,52,,,,,52,,,,,,,,,', +'52,,,,32,32,65,,32,32,32,32,,,,32,32,,,32,32,,,,,,,,,,,65,,,,,,,,,,', +'52,,32,,,,52,,,,,,,,,,,,52,,,,,,32,,,,,,,,,,,,,,,,,,,,,65,,,,32,,,52', +'52,,,52,,,,,,52,,,,,,,,,,,,,,,,,,,,,,,,,52,,,,,,,,52,,,,52,,,,,,32,', +'32,,,,,,,,65,,,,,,32,32,32,32,,32,,,,,,,65,,,,,,,,,,,,,,,,,65,,,,,,', +',,52,,,,,,,52,52,,,,,,,,32,,,,,,,,,52,,,,,,52,,52,32,,,,,,,,,,,,,,,', +',32,32,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,', +',,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,', +',,,,,32' ] + racc_goto_check = arr = ::Array.new(2533, nil) + idx = 0 + clist.each do |str| + str.split(',', -1).each do |i| + arr[idx] = i.to_i unless i.empty? + idx += 1 + end + end + +racc_goto_pointer = [ + nil, 263, 6, nil, 73, 113, 41, 15, -294, 1130, + -498, -573, -652, nil, -364, 31, 127, -18, -188, 77, + 77, 760, 3, -204, -354, 911, 575, -161, -52, 32, + 34, -19, 1561, -19, nil, nil, -3, -170, 80, -154, + -338, 355, -318, nil, 103, 59, 32, -43, nil, 18, + 34, -227, 1423, 543, -278, 86, -66, 16, nil, nil, + 5, 42, -239, 12, -6, 1501, 102, -57, -12, -249, + 82, 78, -312, -263, -428, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 94, 106, -60, nil, -169, -282, + -645, -419, -334, 100, nil, -190, 106, nil, -525, 100, + 115, 116, -347, 119, 118, 116, -507, 118, -504, -358, + -704, -361, -515, -168, -175, -361, -623, -805, 216, -603, + -791, -405, nil, 147, -453, 194, 326, -404, -532, -584, + -444, nil, -528, -626, -751, -759, -309, -563, -109, -424, + -454, -18, -633, -632, -23, nil, -32, -30, -652, -407, + -540, nil, nil, 165, 164, 55, 175, 7, -234, -195, + 180, 184, 185, -291, -289, -277, -416, nil, nil, 152, + -514, -711, -529, -507, -553, nil, -737, -755, nil, nil, + -414 ] + +racc_goto_default = [ + nil, nil, nil, 3, nil, 4, 344, 292, nil, 520, + nil, 812, nil, 289, 290, nil, nil, nil, 11, 12, + 18, 228, 320, nil, nil, 226, 227, nil, nil, 17, + nil, 439, 21, 22, 23, 24, nil, 642, nil, nil, + nil, 309, nil, 25, 410, 32, nil, nil, 34, 37, + 36, nil, 223, 224, 356, nil, 131, 418, 130, 133, + 77, 78, nil, 92, 46, 282, nil, 780, 411, nil, + 412, 423, 597, 485, 280, 266, 47, 48, 49, 50, + 51, 52, 53, 54, 55, nil, 267, 61, nil, nil, + nil, nil, nil, nil, 69, nil, 535, 70, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 803, 880, nil, + 804, 905, 752, 658, nil, 659, nil, nil, 660, nil, + 662, 613, nil, nil, nil, 668, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 422, nil, nil, nil, nil, + nil, 76, 79, 80, nil, nil, nil, nil, nil, 569, + nil, nil, nil, nil, nil, nil, 872, 713, 657, nil, + 661, 672, 674, 675, 764, 678, 679, 765, 682, 685, + 284 ] + +racc_reduce_table = [ + 0, 0, :racc_error, + 1, 144, :_reduce_none, + 2, 145, :_reduce_2, + 0, 146, :_reduce_3, + 1, 146, :_reduce_4, + 3, 146, :_reduce_5, + 2, 146, :_reduce_6, + 1, 148, :_reduce_none, + 4, 148, :_reduce_8, + 4, 151, :_reduce_9, + 2, 152, :_reduce_10, + 0, 156, :_reduce_11, + 1, 156, :_reduce_12, + 3, 156, :_reduce_13, + 2, 156, :_reduce_14, + 1, 157, :_reduce_none, + 4, 157, :_reduce_16, + 0, 173, :_reduce_17, + 4, 150, :_reduce_18, + 3, 150, :_reduce_19, + 3, 150, :_reduce_20, + 3, 150, :_reduce_21, + 2, 150, :_reduce_22, + 3, 150, :_reduce_23, + 3, 150, :_reduce_24, + 3, 150, :_reduce_25, + 3, 150, :_reduce_26, + 3, 150, :_reduce_27, + 4, 150, :_reduce_28, + 1, 150, :_reduce_none, + 3, 150, :_reduce_30, + 3, 150, :_reduce_31, + 6, 150, :_reduce_32, + 5, 150, :_reduce_33, + 5, 150, :_reduce_34, + 5, 150, :_reduce_35, + 5, 150, :_reduce_36, + 3, 150, :_reduce_37, + 3, 150, :_reduce_38, + 3, 150, :_reduce_39, + 1, 150, :_reduce_none, + 3, 161, :_reduce_41, + 3, 161, :_reduce_42, + 1, 172, :_reduce_none, + 3, 172, :_reduce_44, + 3, 172, :_reduce_45, + 3, 172, :_reduce_46, + 2, 172, :_reduce_47, + 1, 172, :_reduce_none, + 1, 160, :_reduce_none, + 1, 163, :_reduce_none, + 1, 163, :_reduce_none, + 1, 177, :_reduce_none, + 4, 177, :_reduce_53, + 0, 185, :_reduce_54, + 5, 182, :_reduce_55, + 1, 184, :_reduce_none, + 2, 176, :_reduce_57, + 3, 176, :_reduce_58, + 4, 176, :_reduce_59, + 5, 176, :_reduce_60, + 4, 176, :_reduce_61, + 5, 176, :_reduce_62, + 2, 176, :_reduce_63, + 2, 176, :_reduce_64, + 2, 176, :_reduce_65, + 2, 176, :_reduce_66, + 2, 176, :_reduce_67, + 1, 162, :_reduce_68, + 3, 162, :_reduce_69, + 1, 189, :_reduce_70, + 3, 189, :_reduce_71, + 1, 188, :_reduce_none, + 2, 188, :_reduce_73, + 3, 188, :_reduce_74, + 5, 188, :_reduce_75, + 2, 188, :_reduce_76, + 4, 188, :_reduce_77, + 2, 188, :_reduce_78, + 4, 188, :_reduce_79, + 1, 188, :_reduce_80, + 3, 188, :_reduce_81, + 1, 192, :_reduce_none, + 3, 192, :_reduce_83, + 2, 191, :_reduce_84, + 3, 191, :_reduce_85, + 1, 194, :_reduce_86, + 3, 194, :_reduce_87, + 1, 193, :_reduce_88, + 1, 193, :_reduce_89, + 4, 193, :_reduce_90, + 3, 193, :_reduce_91, + 3, 193, :_reduce_92, + 3, 193, :_reduce_93, + 3, 193, :_reduce_94, + 2, 193, :_reduce_95, + 1, 193, :_reduce_96, + 1, 169, :_reduce_97, + 1, 169, :_reduce_98, + 4, 169, :_reduce_99, + 3, 169, :_reduce_100, + 3, 169, :_reduce_101, + 3, 169, :_reduce_102, + 3, 169, :_reduce_103, + 2, 169, :_reduce_104, + 1, 169, :_reduce_105, + 1, 197, :_reduce_106, + 1, 197, :_reduce_none, + 2, 198, :_reduce_108, + 1, 198, :_reduce_109, + 3, 198, :_reduce_110, + 1, 199, :_reduce_none, + 1, 199, :_reduce_none, + 1, 199, :_reduce_none, + 1, 199, :_reduce_none, + 1, 199, :_reduce_none, + 1, 202, :_reduce_116, + 1, 202, :_reduce_none, + 1, 158, :_reduce_none, + 1, 158, :_reduce_none, + 1, 159, :_reduce_120, + 0, 205, :_reduce_121, + 4, 159, :_reduce_122, + 1, 200, :_reduce_none, + 1, 200, :_reduce_none, + 1, 200, :_reduce_none, + 1, 200, :_reduce_none, + 1, 200, :_reduce_none, + 1, 200, :_reduce_none, + 1, 200, :_reduce_none, + 1, 200, :_reduce_none, + 1, 200, :_reduce_none, + 1, 200, :_reduce_none, + 1, 200, :_reduce_none, + 1, 200, :_reduce_none, + 1, 200, :_reduce_none, + 1, 200, :_reduce_none, + 1, 200, :_reduce_none, + 1, 200, :_reduce_none, + 1, 200, :_reduce_none, + 1, 200, :_reduce_none, + 1, 200, :_reduce_none, + 1, 200, :_reduce_none, + 1, 200, :_reduce_none, + 1, 200, :_reduce_none, + 1, 200, :_reduce_none, + 1, 200, :_reduce_none, + 1, 200, :_reduce_none, + 1, 200, :_reduce_none, + 1, 200, :_reduce_none, + 1, 200, :_reduce_none, + 1, 200, :_reduce_none, + 1, 200, :_reduce_none, + 1, 201, :_reduce_none, + 1, 201, :_reduce_none, + 1, 201, :_reduce_none, + 1, 201, :_reduce_none, + 1, 201, :_reduce_none, + 1, 201, :_reduce_none, + 1, 201, :_reduce_none, + 1, 201, :_reduce_none, + 1, 201, :_reduce_none, + 1, 201, :_reduce_none, + 1, 201, :_reduce_none, + 1, 201, :_reduce_none, + 1, 201, :_reduce_none, + 1, 201, :_reduce_none, + 1, 201, :_reduce_none, + 1, 201, :_reduce_none, + 1, 201, :_reduce_none, + 1, 201, :_reduce_none, + 1, 201, :_reduce_none, + 1, 201, :_reduce_none, + 1, 201, :_reduce_none, + 1, 201, :_reduce_none, + 1, 201, :_reduce_none, + 1, 201, :_reduce_none, + 1, 201, :_reduce_none, + 1, 201, :_reduce_none, + 1, 201, :_reduce_none, + 1, 201, :_reduce_none, + 1, 201, :_reduce_none, + 1, 201, :_reduce_none, + 1, 201, :_reduce_none, + 1, 201, :_reduce_none, + 1, 201, :_reduce_none, + 1, 201, :_reduce_none, + 1, 201, :_reduce_none, + 1, 201, :_reduce_none, + 1, 201, :_reduce_none, + 1, 201, :_reduce_none, + 1, 201, :_reduce_none, + 1, 201, :_reduce_none, + 1, 201, :_reduce_none, + 3, 175, :_reduce_194, + 5, 175, :_reduce_195, + 3, 175, :_reduce_196, + 5, 175, :_reduce_197, + 6, 175, :_reduce_198, + 5, 175, :_reduce_199, + 5, 175, :_reduce_200, + 5, 175, :_reduce_201, + 5, 175, :_reduce_202, + 4, 175, :_reduce_203, + 3, 175, :_reduce_204, + 3, 175, :_reduce_205, + 3, 175, :_reduce_206, + 3, 175, :_reduce_207, + 3, 175, :_reduce_208, + 3, 175, :_reduce_209, + 3, 175, :_reduce_210, + 3, 175, :_reduce_211, + 3, 175, :_reduce_212, + 4, 175, :_reduce_213, + 2, 175, :_reduce_214, + 2, 175, :_reduce_215, + 3, 175, :_reduce_216, + 3, 175, :_reduce_217, + 3, 175, :_reduce_218, + 3, 175, :_reduce_219, + 3, 175, :_reduce_220, + 3, 175, :_reduce_221, + 3, 175, :_reduce_222, + 3, 175, :_reduce_223, + 3, 175, :_reduce_224, + 3, 175, :_reduce_225, + 3, 175, :_reduce_226, + 3, 175, :_reduce_227, + 3, 175, :_reduce_228, + 2, 175, :_reduce_229, + 2, 175, :_reduce_230, + 3, 175, :_reduce_231, + 3, 175, :_reduce_232, + 3, 175, :_reduce_233, + 3, 175, :_reduce_234, + 3, 175, :_reduce_235, + 6, 175, :_reduce_236, + 1, 175, :_reduce_none, + 1, 208, :_reduce_none, + 1, 209, :_reduce_none, + 2, 209, :_reduce_none, + 4, 209, :_reduce_241, + 2, 209, :_reduce_242, + 3, 214, :_reduce_243, + 0, 215, :_reduce_244, + 1, 215, :_reduce_none, + 0, 166, :_reduce_246, + 1, 166, :_reduce_none, + 2, 166, :_reduce_none, + 4, 166, :_reduce_249, + 2, 166, :_reduce_250, + 1, 187, :_reduce_251, + 2, 187, :_reduce_252, + 2, 187, :_reduce_253, + 4, 187, :_reduce_254, + 1, 187, :_reduce_255, + 0, 218, :_reduce_256, + 2, 181, :_reduce_257, + 2, 217, :_reduce_258, + 2, 216, :_reduce_259, + 0, 216, :_reduce_260, + 1, 211, :_reduce_261, + 2, 211, :_reduce_262, + 3, 211, :_reduce_263, + 4, 211, :_reduce_264, + 1, 171, :_reduce_265, + 1, 171, :_reduce_none, + 3, 170, :_reduce_267, + 4, 170, :_reduce_268, + 2, 170, :_reduce_269, + 1, 207, :_reduce_none, + 1, 207, :_reduce_none, + 1, 207, :_reduce_none, + 1, 207, :_reduce_none, + 1, 207, :_reduce_none, + 1, 207, :_reduce_none, + 1, 207, :_reduce_none, + 1, 207, :_reduce_none, + 1, 207, :_reduce_none, + 1, 207, :_reduce_none, + 1, 207, :_reduce_280, + 0, 243, :_reduce_281, + 4, 207, :_reduce_282, + 0, 244, :_reduce_283, + 0, 245, :_reduce_284, + 6, 207, :_reduce_285, + 0, 246, :_reduce_286, + 4, 207, :_reduce_287, + 3, 207, :_reduce_288, + 3, 207, :_reduce_289, + 2, 207, :_reduce_290, + 3, 207, :_reduce_291, + 3, 207, :_reduce_292, + 1, 207, :_reduce_293, + 4, 207, :_reduce_294, + 3, 207, :_reduce_295, + 1, 207, :_reduce_296, + 5, 207, :_reduce_297, + 4, 207, :_reduce_298, + 3, 207, :_reduce_299, + 2, 207, :_reduce_300, + 1, 207, :_reduce_none, + 2, 207, :_reduce_302, + 0, 247, :_reduce_303, + 3, 207, :_reduce_304, + 6, 207, :_reduce_305, + 6, 207, :_reduce_306, + 0, 248, :_reduce_307, + 0, 249, :_reduce_308, + 7, 207, :_reduce_309, + 0, 250, :_reduce_310, + 0, 251, :_reduce_311, + 7, 207, :_reduce_312, + 5, 207, :_reduce_313, + 4, 207, :_reduce_314, + 0, 252, :_reduce_315, + 0, 253, :_reduce_316, + 9, 207, :_reduce_317, + 0, 254, :_reduce_318, + 6, 207, :_reduce_319, + 0, 255, :_reduce_320, + 7, 207, :_reduce_321, + 0, 256, :_reduce_322, + 5, 207, :_reduce_323, + 0, 257, :_reduce_324, + 6, 207, :_reduce_325, + 0, 258, :_reduce_326, + 0, 259, :_reduce_327, + 9, 207, :_reduce_328, + 1, 207, :_reduce_329, + 1, 207, :_reduce_330, + 1, 207, :_reduce_331, + 1, 207, :_reduce_332, + 1, 165, :_reduce_none, + 1, 237, :_reduce_334, + 1, 240, :_reduce_335, + 1, 232, :_reduce_none, + 1, 232, :_reduce_none, + 2, 232, :_reduce_338, + 1, 234, :_reduce_none, + 1, 234, :_reduce_none, + 1, 233, :_reduce_none, + 5, 233, :_reduce_342, + 1, 154, :_reduce_none, + 2, 154, :_reduce_344, + 1, 236, :_reduce_none, + 1, 236, :_reduce_none, + 1, 260, :_reduce_347, + 3, 260, :_reduce_348, + 1, 263, :_reduce_349, + 3, 263, :_reduce_350, + 1, 262, :_reduce_none, + 4, 262, :_reduce_352, + 6, 262, :_reduce_353, + 3, 262, :_reduce_354, + 5, 262, :_reduce_355, + 2, 262, :_reduce_356, + 4, 262, :_reduce_357, + 1, 262, :_reduce_358, + 3, 262, :_reduce_359, + 4, 264, :_reduce_360, + 2, 264, :_reduce_361, + 2, 264, :_reduce_362, + 1, 264, :_reduce_363, + 2, 269, :_reduce_364, + 0, 269, :_reduce_365, + 6, 270, :_reduce_366, + 8, 270, :_reduce_367, + 4, 270, :_reduce_368, + 6, 270, :_reduce_369, + 4, 270, :_reduce_370, + 2, 270, :_reduce_none, + 6, 270, :_reduce_372, + 2, 270, :_reduce_373, + 4, 270, :_reduce_374, + 6, 270, :_reduce_375, + 2, 270, :_reduce_376, + 4, 270, :_reduce_377, + 2, 270, :_reduce_378, + 4, 270, :_reduce_379, + 1, 270, :_reduce_none, + 0, 183, :_reduce_381, + 1, 183, :_reduce_382, + 3, 274, :_reduce_383, + 1, 274, :_reduce_384, + 4, 274, :_reduce_385, + 1, 275, :_reduce_386, + 4, 275, :_reduce_387, + 1, 276, :_reduce_388, + 3, 276, :_reduce_389, + 1, 277, :_reduce_390, + 1, 277, :_reduce_none, + 0, 281, :_reduce_392, + 0, 282, :_reduce_393, + 4, 231, :_reduce_394, + 4, 279, :_reduce_395, + 1, 279, :_reduce_396, + 0, 285, :_reduce_397, + 4, 280, :_reduce_398, + 0, 286, :_reduce_399, + 4, 280, :_reduce_400, + 0, 287, :_reduce_401, + 5, 284, :_reduce_402, + 2, 178, :_reduce_403, + 4, 178, :_reduce_404, + 5, 178, :_reduce_405, + 5, 178, :_reduce_406, + 2, 230, :_reduce_407, + 4, 230, :_reduce_408, + 4, 230, :_reduce_409, + 3, 230, :_reduce_410, + 3, 230, :_reduce_411, + 3, 230, :_reduce_412, + 2, 230, :_reduce_413, + 1, 230, :_reduce_414, + 4, 230, :_reduce_415, + 0, 289, :_reduce_416, + 5, 229, :_reduce_417, + 0, 290, :_reduce_418, + 5, 229, :_reduce_419, + 5, 235, :_reduce_420, + 1, 291, :_reduce_421, + 1, 291, :_reduce_none, + 6, 153, :_reduce_423, + 0, 153, :_reduce_424, + 1, 292, :_reduce_425, + 1, 292, :_reduce_none, + 1, 292, :_reduce_none, + 2, 293, :_reduce_428, + 1, 293, :_reduce_none, + 2, 155, :_reduce_430, + 1, 155, :_reduce_none, + 1, 219, :_reduce_none, + 1, 219, :_reduce_none, + 1, 219, :_reduce_none, + 1, 220, :_reduce_435, + 1, 295, :_reduce_436, + 2, 295, :_reduce_437, + 3, 296, :_reduce_438, + 1, 296, :_reduce_439, + 1, 296, :_reduce_440, + 3, 221, :_reduce_441, + 4, 222, :_reduce_442, + 3, 223, :_reduce_443, + 0, 300, :_reduce_444, + 3, 300, :_reduce_445, + 1, 301, :_reduce_446, + 2, 301, :_reduce_447, + 3, 225, :_reduce_448, + 0, 303, :_reduce_449, + 3, 303, :_reduce_450, + 3, 224, :_reduce_451, + 3, 226, :_reduce_452, + 0, 304, :_reduce_453, + 3, 304, :_reduce_454, + 0, 305, :_reduce_455, + 3, 305, :_reduce_456, + 0, 297, :_reduce_457, + 2, 297, :_reduce_458, + 0, 298, :_reduce_459, + 2, 298, :_reduce_460, + 0, 299, :_reduce_461, + 2, 299, :_reduce_462, + 1, 302, :_reduce_463, + 2, 302, :_reduce_464, + 0, 307, :_reduce_465, + 4, 302, :_reduce_466, + 1, 306, :_reduce_467, + 1, 306, :_reduce_468, + 1, 306, :_reduce_469, + 1, 306, :_reduce_none, + 1, 203, :_reduce_471, + 3, 204, :_reduce_472, + 1, 294, :_reduce_473, + 2, 294, :_reduce_474, + 1, 206, :_reduce_475, + 1, 206, :_reduce_476, + 1, 206, :_reduce_477, + 1, 206, :_reduce_478, + 1, 195, :_reduce_479, + 1, 195, :_reduce_480, + 1, 195, :_reduce_481, + 1, 195, :_reduce_482, + 1, 195, :_reduce_483, + 1, 196, :_reduce_484, + 1, 196, :_reduce_485, + 1, 196, :_reduce_486, + 1, 196, :_reduce_487, + 1, 196, :_reduce_488, + 1, 196, :_reduce_489, + 1, 196, :_reduce_490, + 1, 227, :_reduce_491, + 1, 227, :_reduce_492, + 1, 164, :_reduce_493, + 1, 164, :_reduce_494, + 1, 168, :_reduce_495, + 1, 168, :_reduce_496, + 1, 238, :_reduce_497, + 0, 308, :_reduce_498, + 4, 238, :_reduce_499, + 2, 238, :_reduce_500, + 3, 241, :_reduce_501, + 0, 310, :_reduce_502, + 3, 241, :_reduce_503, + 4, 309, :_reduce_504, + 2, 309, :_reduce_505, + 2, 309, :_reduce_506, + 1, 309, :_reduce_507, + 2, 312, :_reduce_508, + 0, 312, :_reduce_509, + 6, 283, :_reduce_510, + 8, 283, :_reduce_511, + 4, 283, :_reduce_512, + 6, 283, :_reduce_513, + 4, 283, :_reduce_514, + 6, 283, :_reduce_515, + 2, 283, :_reduce_516, + 4, 283, :_reduce_517, + 6, 283, :_reduce_518, + 2, 283, :_reduce_519, + 4, 283, :_reduce_520, + 2, 283, :_reduce_521, + 4, 283, :_reduce_522, + 1, 283, :_reduce_523, + 0, 283, :_reduce_524, + 1, 278, :_reduce_525, + 1, 278, :_reduce_526, + 1, 278, :_reduce_527, + 1, 278, :_reduce_528, + 1, 261, :_reduce_none, + 1, 261, :_reduce_530, + 1, 314, :_reduce_531, + 3, 314, :_reduce_532, + 1, 271, :_reduce_533, + 3, 271, :_reduce_534, + 1, 315, :_reduce_535, + 2, 316, :_reduce_536, + 1, 316, :_reduce_537, + 2, 317, :_reduce_538, + 1, 317, :_reduce_539, + 1, 265, :_reduce_540, + 3, 265, :_reduce_541, + 1, 311, :_reduce_542, + 3, 311, :_reduce_543, + 1, 318, :_reduce_none, + 1, 318, :_reduce_none, + 2, 266, :_reduce_546, + 1, 266, :_reduce_547, + 3, 319, :_reduce_548, + 3, 320, :_reduce_549, + 1, 272, :_reduce_550, + 3, 272, :_reduce_551, + 1, 313, :_reduce_552, + 3, 313, :_reduce_553, + 1, 321, :_reduce_none, + 1, 321, :_reduce_none, + 2, 273, :_reduce_556, + 1, 273, :_reduce_557, + 1, 322, :_reduce_none, + 1, 322, :_reduce_none, + 2, 268, :_reduce_560, + 2, 267, :_reduce_561, + 0, 267, :_reduce_562, + 1, 242, :_reduce_none, + 3, 242, :_reduce_564, + 0, 228, :_reduce_565, + 2, 228, :_reduce_none, + 1, 213, :_reduce_567, + 3, 213, :_reduce_568, + 3, 323, :_reduce_569, + 2, 323, :_reduce_570, + 2, 323, :_reduce_571, + 1, 186, :_reduce_none, + 1, 186, :_reduce_none, + 1, 186, :_reduce_none, + 1, 180, :_reduce_none, + 1, 180, :_reduce_none, + 1, 180, :_reduce_none, + 1, 180, :_reduce_none, + 1, 288, :_reduce_none, + 1, 288, :_reduce_none, + 1, 288, :_reduce_none, + 1, 179, :_reduce_none, + 1, 179, :_reduce_none, + 0, 147, :_reduce_none, + 1, 147, :_reduce_none, + 0, 174, :_reduce_none, + 1, 174, :_reduce_none, + 2, 190, :_reduce_588, + 2, 167, :_reduce_589, + 0, 212, :_reduce_none, + 1, 212, :_reduce_none, + 1, 212, :_reduce_none, + 1, 239, :_reduce_593, + 1, 239, :_reduce_none, + 1, 149, :_reduce_none, + 2, 149, :_reduce_none, + 0, 210, :_reduce_597 ] + +racc_reduce_n = 598 + +racc_shift_n = 1022 + +racc_token_table = { + false => 0, + :error => 1, + :kCLASS => 2, + :kMODULE => 3, + :kDEF => 4, + :kUNDEF => 5, + :kBEGIN => 6, + :kRESCUE => 7, + :kENSURE => 8, + :kEND => 9, + :kIF => 10, + :kUNLESS => 11, + :kTHEN => 12, + :kELSIF => 13, + :kELSE => 14, + :kCASE => 15, + :kWHEN => 16, + :kWHILE => 17, + :kUNTIL => 18, + :kFOR => 19, + :kBREAK => 20, + :kNEXT => 21, + :kREDO => 22, + :kRETRY => 23, + :kIN => 24, + :kDO => 25, + :kDO_COND => 26, + :kDO_BLOCK => 27, + :kDO_LAMBDA => 28, + :kRETURN => 29, + :kYIELD => 30, + :kSUPER => 31, + :kSELF => 32, + :kNIL => 33, + :kTRUE => 34, + :kFALSE => 35, + :kAND => 36, + :kOR => 37, + :kNOT => 38, + :kIF_MOD => 39, + :kUNLESS_MOD => 40, + :kWHILE_MOD => 41, + :kUNTIL_MOD => 42, + :kRESCUE_MOD => 43, + :kALIAS => 44, + :kDEFINED => 45, + :klBEGIN => 46, + :klEND => 47, + :k__LINE__ => 48, + :k__FILE__ => 49, + :k__ENCODING__ => 50, + :tIDENTIFIER => 51, + :tFID => 52, + :tGVAR => 53, + :tIVAR => 54, + :tCONSTANT => 55, + :tLABEL => 56, + :tCVAR => 57, + :tNTH_REF => 58, + :tBACK_REF => 59, + :tSTRING_CONTENT => 60, + :tINTEGER => 61, + :tFLOAT => 62, + :tUPLUS => 63, + :tUMINUS => 64, + :tUNARY_NUM => 65, + :tPOW => 66, + :tCMP => 67, + :tEQ => 68, + :tEQQ => 69, + :tNEQ => 70, + :tGEQ => 71, + :tLEQ => 72, + :tANDOP => 73, + :tOROP => 74, + :tMATCH => 75, + :tNMATCH => 76, + :tDOT => 77, + :tDOT2 => 78, + :tDOT3 => 79, + :tAREF => 80, + :tASET => 81, + :tLSHFT => 82, + :tRSHFT => 83, + :tCOLON2 => 84, + :tCOLON3 => 85, + :tOP_ASGN => 86, + :tASSOC => 87, + :tLPAREN => 88, + :tLPAREN2 => 89, + :tRPAREN => 90, + :tLPAREN_ARG => 91, + :tLBRACK => 92, + :tLBRACK2 => 93, + :tRBRACK => 94, + :tLBRACE => 95, + :tLBRACE_ARG => 96, + :tSTAR => 97, + :tSTAR2 => 98, + :tAMPER => 99, + :tAMPER2 => 100, + :tTILDE => 101, + :tPERCENT => 102, + :tDIVIDE => 103, + :tDSTAR => 104, + :tPLUS => 105, + :tMINUS => 106, + :tLT => 107, + :tGT => 108, + :tPIPE => 109, + :tBANG => 110, + :tCARET => 111, + :tLCURLY => 112, + :tRCURLY => 113, + :tBACK_REF2 => 114, + :tSYMBEG => 115, + :tSTRING_BEG => 116, + :tXSTRING_BEG => 117, + :tREGEXP_BEG => 118, + :tREGEXP_OPT => 119, + :tWORDS_BEG => 120, + :tQWORDS_BEG => 121, + :tSYMBOLS_BEG => 122, + :tQSYMBOLS_BEG => 123, + :tSTRING_DBEG => 124, + :tSTRING_DVAR => 125, + :tSTRING_END => 126, + :tSTRING_DEND => 127, + :tSTRING => 128, + :tSYMBOL => 129, + :tNL => 130, + :tEH => 131, + :tCOLON => 132, + :tCOMMA => 133, + :tSPACE => 134, + :tSEMI => 135, + :tLAMBDA => 136, + :tLAMBEG => 137, + :tCHARACTER => 138, + :tRATIONAL => 139, + :tIMAGINARY => 140, + :tEQL => 141, + :tLOWEST => 142 } + +racc_nt_base = 143 + +racc_use_result_var = true + +Racc_arg = [ + racc_action_table, + racc_action_check, + racc_action_default, + racc_action_pointer, + racc_goto_table, + racc_goto_check, + racc_goto_default, + racc_goto_pointer, + racc_nt_base, + racc_reduce_table, + racc_token_table, + racc_shift_n, + racc_reduce_n, + racc_use_result_var ] + +Racc_token_to_s_table = [ + "$end", + "error", + "kCLASS", + "kMODULE", + "kDEF", + "kUNDEF", + "kBEGIN", + "kRESCUE", + "kENSURE", + "kEND", + "kIF", + "kUNLESS", + "kTHEN", + "kELSIF", + "kELSE", + "kCASE", + "kWHEN", + "kWHILE", + "kUNTIL", + "kFOR", + "kBREAK", + "kNEXT", + "kREDO", + "kRETRY", + "kIN", + "kDO", + "kDO_COND", + "kDO_BLOCK", + "kDO_LAMBDA", + "kRETURN", + "kYIELD", + "kSUPER", + "kSELF", + "kNIL", + "kTRUE", + "kFALSE", + "kAND", + "kOR", + "kNOT", + "kIF_MOD", + "kUNLESS_MOD", + "kWHILE_MOD", + "kUNTIL_MOD", + "kRESCUE_MOD", + "kALIAS", + "kDEFINED", + "klBEGIN", + "klEND", + "k__LINE__", + "k__FILE__", + "k__ENCODING__", + "tIDENTIFIER", + "tFID", + "tGVAR", + "tIVAR", + "tCONSTANT", + "tLABEL", + "tCVAR", + "tNTH_REF", + "tBACK_REF", + "tSTRING_CONTENT", + "tINTEGER", + "tFLOAT", + "tUPLUS", + "tUMINUS", + "tUNARY_NUM", + "tPOW", + "tCMP", + "tEQ", + "tEQQ", + "tNEQ", + "tGEQ", + "tLEQ", + "tANDOP", + "tOROP", + "tMATCH", + "tNMATCH", + "tDOT", + "tDOT2", + "tDOT3", + "tAREF", + "tASET", + "tLSHFT", + "tRSHFT", + "tCOLON2", + "tCOLON3", + "tOP_ASGN", + "tASSOC", + "tLPAREN", + "tLPAREN2", + "tRPAREN", + "tLPAREN_ARG", + "tLBRACK", + "tLBRACK2", + "tRBRACK", + "tLBRACE", + "tLBRACE_ARG", + "tSTAR", + "tSTAR2", + "tAMPER", + "tAMPER2", + "tTILDE", + "tPERCENT", + "tDIVIDE", + "tDSTAR", + "tPLUS", + "tMINUS", + "tLT", + "tGT", + "tPIPE", + "tBANG", + "tCARET", + "tLCURLY", + "tRCURLY", + "tBACK_REF2", + "tSYMBEG", + "tSTRING_BEG", + "tXSTRING_BEG", + "tREGEXP_BEG", + "tREGEXP_OPT", + "tWORDS_BEG", + "tQWORDS_BEG", + "tSYMBOLS_BEG", + "tQSYMBOLS_BEG", + "tSTRING_DBEG", + "tSTRING_DVAR", + "tSTRING_END", + "tSTRING_DEND", + "tSTRING", + "tSYMBOL", + "tNL", + "tEH", + "tCOLON", + "tCOMMA", + "tSPACE", + "tSEMI", + "tLAMBDA", + "tLAMBEG", + "tCHARACTER", + "tRATIONAL", + "tIMAGINARY", + "tEQL", + "tLOWEST", + "$start", + "program", + "top_compstmt", + "top_stmts", + "opt_terms", + "top_stmt", + "terms", + "stmt", + "bodystmt", + "compstmt", + "opt_rescue", + "opt_else", + "opt_ensure", + "stmts", + "stmt_or_begin", + "fitem", + "undef_list", + "expr_value", + "command_asgn", + "mlhs", + "command_call", + "var_lhs", + "primary_value", + "opt_call_args", + "rbracket", + "backref", + "lhs", + "mrhs", + "mrhs_arg", + "expr", + "@1", + "opt_nl", + "arg", + "command", + "block_command", + "block_call", + "dot_or_colon", + "operation2", + "command_args", + "cmd_brace_block", + "opt_block_param", + "fcall", + "@2", + "operation", + "call_args", + "mlhs_basic", + "mlhs_inner", + "rparen", + "mlhs_head", + "mlhs_item", + "mlhs_node", + "mlhs_post", + "user_variable", + "keyword_variable", + "cname", + "cpath", + "fname", + "op", + "reswords", + "fsym", + "symbol", + "dsym", + "@3", + "simple_numeric", + "primary", + "arg_value", + "aref_args", + "none", + "args", + "trailer", + "assocs", + "paren_args", + "opt_paren_args", + "opt_block_arg", + "block_arg", + "@4", + "literal", + "strings", + "xstring", + "regexp", + "words", + "qwords", + "symbols", + "qsymbols", + "var_ref", + "assoc_list", + "brace_block", + "method_call", + "lambda", + "then", + "if_tail", + "do", + "case_body", + "for_var", + "k_class", + "superclass", + "term", + "k_module", + "f_arglist", + "singleton", + "@5", + "@6", + "@7", + "@8", + "@9", + "@10", + "@11", + "@12", + "@13", + "@14", + "@15", + "@16", + "@17", + "@18", + "@19", + "@20", + "@21", + "f_marg", + "f_norm_arg", + "f_margs", + "f_marg_list", + "block_args_tail", + "f_block_kwarg", + "f_kwrest", + "opt_f_block_arg", + "f_block_arg", + "opt_block_args_tail", + "block_param", + "f_arg", + "f_block_optarg", + "f_rest_arg", + "block_param_def", + "opt_bv_decl", + "bv_decls", + "bvar", + "f_bad_arg", + "f_larglist", + "lambda_body", + "@22", + "@23", + "f_args", + "do_block", + "@24", + "@25", + "@26", + "operation3", + "@27", + "@28", + "cases", + "exc_list", + "exc_var", + "numeric", + "string", + "string1", + "string_contents", + "xstring_contents", + "regexp_contents", + "word_list", + "word", + "string_content", + "symbol_list", + "qword_list", + "qsym_list", + "string_dvar", + "@29", + "@30", + "args_tail", + "@31", + "f_kwarg", + "opt_args_tail", + "f_optarg", + "f_arg_item", + "f_label", + "f_kw", + "f_block_kw", + "kwrest_mark", + "f_opt", + "f_block_opt", + "restarg_mark", + "blkarg_mark", + "assoc" ] + +Racc_debug_parser = false + +##### State transition tables end ##### + +# reduce 0 omitted + +# reduce 1 omitted + +def _reduce_2(val, _values, result) + result = @builder.compstmt(val[0]) + + result +end + +def _reduce_3(val, _values, result) + result = [] + + result +end + +def _reduce_4(val, _values, result) + result = [ val[0] ] + + result +end + +def _reduce_5(val, _values, result) + result = val[0] << val[2] + + result +end + +def _reduce_6(val, _values, result) + result = [ val[1] ] + + result +end + +# reduce 7 omitted + +def _reduce_8(val, _values, result) + result = @builder.preexe(val[0], val[1], val[2], val[3]) + + result +end + +def _reduce_9(val, _values, result) + rescue_bodies = val[1] + else_t, else_ = val[2] + ensure_t, ensure_ = val[3] + + if rescue_bodies.empty? && !else_t.nil? + diagnostic :warning, :useless_else, nil, else_t + end + + result = @builder.begin_body(val[0], + rescue_bodies, + else_t, else_, + ensure_t, ensure_) + + result +end + +def _reduce_10(val, _values, result) + result = @builder.compstmt(val[0]) + + result +end + +def _reduce_11(val, _values, result) + result = [] + + result +end + +def _reduce_12(val, _values, result) + result = [ val[0] ] + + result +end + +def _reduce_13(val, _values, result) + result = val[0] << val[2] + + result +end + +def _reduce_14(val, _values, result) + result = [ val[1] ] + + result +end + +# reduce 15 omitted + +def _reduce_16(val, _values, result) + diagnostic :error, :begin_in_method, nil, val[0] + + result +end + +def _reduce_17(val, _values, result) + @lexer.state = :expr_fname + + result +end + +def _reduce_18(val, _values, result) + result = @builder.alias(val[0], val[1], val[3]) + + result +end + +def _reduce_19(val, _values, result) + result = @builder.alias(val[0], + @builder.gvar(val[1]), + @builder.gvar(val[2])) + + result +end + +def _reduce_20(val, _values, result) + result = @builder.alias(val[0], + @builder.gvar(val[1]), + @builder.back_ref(val[2])) + + result +end + +def _reduce_21(val, _values, result) + diagnostic :error, :nth_ref_alias, nil, val[2] + + result +end + +def _reduce_22(val, _values, result) + result = @builder.undef_method(val[0], val[1]) + + result +end + +def _reduce_23(val, _values, result) + result = @builder.condition_mod(val[0], nil, + val[1], val[2]) + + result +end + +def _reduce_24(val, _values, result) + result = @builder.condition_mod(nil, val[0], + val[1], val[2]) + + result +end + +def _reduce_25(val, _values, result) + result = @builder.loop_mod(:while, val[0], val[1], val[2]) + + result +end + +def _reduce_26(val, _values, result) + result = @builder.loop_mod(:until, val[0], val[1], val[2]) + + result +end + +def _reduce_27(val, _values, result) + rescue_body = @builder.rescue_body(val[1], + nil, nil, nil, + nil, val[2]) + + result = @builder.begin_body(val[0], [ rescue_body ]) + + result +end + +def _reduce_28(val, _values, result) + result = @builder.postexe(val[0], val[1], val[2], val[3]) + + result +end + +# reduce 29 omitted + +def _reduce_30(val, _values, result) + result = @builder.multi_assign(val[0], val[1], val[2]) + + result +end + +def _reduce_31(val, _values, result) + result = @builder.op_assign(val[0], val[1], val[2]) + + result +end + +def _reduce_32(val, _values, result) + result = @builder.op_assign( + @builder.index( + val[0], val[1], val[2], val[3]), + val[4], val[5]) + + result +end + +def _reduce_33(val, _values, result) + result = @builder.op_assign( + @builder.call_method( + val[0], val[1], val[2]), + val[3], val[4]) + + result +end + +def _reduce_34(val, _values, result) + result = @builder.op_assign( + @builder.call_method( + val[0], val[1], val[2]), + val[3], val[4]) + + result +end + +def _reduce_35(val, _values, result) + const = @builder.const_op_assignable( + @builder.const_fetch(val[0], val[1], val[2])) + result = @builder.op_assign(const, val[3], val[4]) + + result +end + +def _reduce_36(val, _values, result) + result = @builder.op_assign( + @builder.call_method( + val[0], val[1], val[2]), + val[3], val[4]) + + result +end + +def _reduce_37(val, _values, result) + @builder.op_assign(val[0], val[1], val[2]) + + result +end + +def _reduce_38(val, _values, result) + result = @builder.assign(val[0], val[1], + @builder.array(nil, val[2], nil)) + + result +end + +def _reduce_39(val, _values, result) + result = @builder.multi_assign(val[0], val[1], val[2]) + + result +end + +# reduce 40 omitted + +def _reduce_41(val, _values, result) + result = @builder.assign(val[0], val[1], val[2]) + + result +end + +def _reduce_42(val, _values, result) + result = @builder.assign(val[0], val[1], val[2]) + + result +end + +# reduce 43 omitted + +def _reduce_44(val, _values, result) + result = @builder.logical_op(:and, val[0], val[1], val[2]) + + result +end + +def _reduce_45(val, _values, result) + result = @builder.logical_op(:or, val[0], val[1], val[2]) + + result +end + +def _reduce_46(val, _values, result) + result = @builder.not_op(val[0], nil, val[2], nil) + + result +end + +def _reduce_47(val, _values, result) + result = @builder.not_op(val[0], nil, val[1], nil) + + result +end + +# reduce 48 omitted + +# reduce 49 omitted + +# reduce 50 omitted + +# reduce 51 omitted + +# reduce 52 omitted + +def _reduce_53(val, _values, result) + result = @builder.call_method(val[0], val[1], val[2], + nil, val[3], nil) + + result +end + +def _reduce_54(val, _values, result) + @static_env.extend_dynamic + result = @context.dup + @context.in_block = true + + result +end + +def _reduce_55(val, _values, result) + result = [ val[0], val[2], val[3], val[4] ] + + @static_env.unextend + @context.in_block = val[1].in_block + + result +end + +# reduce 56 omitted + +def _reduce_57(val, _values, result) + result = @builder.call_method(nil, nil, val[0], + nil, val[1], nil) + + result +end + +def _reduce_58(val, _values, result) + method_call = @builder.call_method(nil, nil, val[0], + nil, val[1], nil) + + begin_t, args, body, end_t = val[2] + result = @builder.block(method_call, + begin_t, args, body, end_t) + + result +end + +def _reduce_59(val, _values, result) + result = @builder.call_method(val[0], val[1], val[2], + nil, val[3], nil) + + result +end + +def _reduce_60(val, _values, result) + method_call = @builder.call_method(val[0], val[1], val[2], + nil, val[3], nil) + + begin_t, args, body, end_t = val[4] + result = @builder.block(method_call, + begin_t, args, body, end_t) + + result +end + +def _reduce_61(val, _values, result) + result = @builder.call_method(val[0], val[1], val[2], + nil, val[3], nil) + + result +end + +def _reduce_62(val, _values, result) + method_call = @builder.call_method(val[0], val[1], val[2], + nil, val[3], nil) + + begin_t, args, body, end_t = val[4] + result = @builder.block(method_call, + begin_t, args, body, end_t) + + result +end + +def _reduce_63(val, _values, result) + result = @builder.keyword_cmd(:super, val[0], + nil, val[1], nil) + + result +end + +def _reduce_64(val, _values, result) + result = @builder.keyword_cmd(:yield, val[0], + nil, val[1], nil) + + result +end + +def _reduce_65(val, _values, result) + result = @builder.keyword_cmd(:return, val[0], + nil, val[1], nil) + + result +end + +def _reduce_66(val, _values, result) + result = @builder.keyword_cmd(:break, val[0], + nil, val[1], nil) + + result +end + +def _reduce_67(val, _values, result) + result = @builder.keyword_cmd(:next, val[0], + nil, val[1], nil) + + result +end + +def _reduce_68(val, _values, result) + result = @builder.multi_lhs(nil, val[0], nil) + + result +end + +def _reduce_69(val, _values, result) + result = @builder.begin(val[0], val[1], val[2]) + + result +end + +def _reduce_70(val, _values, result) + result = @builder.multi_lhs(nil, val[0], nil) + + result +end + +def _reduce_71(val, _values, result) + result = @builder.multi_lhs(val[0], val[1], val[2]) + + result +end + +# reduce 72 omitted + +def _reduce_73(val, _values, result) + result = val[0]. + push(val[1]) + + result +end + +def _reduce_74(val, _values, result) + result = val[0]. + push(@builder.splat(val[1], val[2])) + + result +end + +def _reduce_75(val, _values, result) + result = val[0]. + push(@builder.splat(val[1], val[2])). + concat(val[4]) + + result +end + +def _reduce_76(val, _values, result) + result = val[0]. + push(@builder.splat(val[1])) + + result +end + +def _reduce_77(val, _values, result) + result = val[0]. + push(@builder.splat(val[1])). + concat(val[3]) + + result +end + +def _reduce_78(val, _values, result) + result = [ @builder.splat(val[0], val[1]) ] + + result +end + +def _reduce_79(val, _values, result) + result = [ @builder.splat(val[0], val[1]), + *val[3] ] + + result +end + +def _reduce_80(val, _values, result) + result = [ @builder.splat(val[0]) ] + + result +end + +def _reduce_81(val, _values, result) + result = [ @builder.splat(val[0]), + *val[2] ] + + result +end + +# reduce 82 omitted + +def _reduce_83(val, _values, result) + result = @builder.begin(val[0], val[1], val[2]) + + result +end + +def _reduce_84(val, _values, result) + result = [ val[0] ] + + result +end + +def _reduce_85(val, _values, result) + result = val[0] << val[1] + + result +end + +def _reduce_86(val, _values, result) + result = [ val[0] ] + + result +end + +def _reduce_87(val, _values, result) + result = val[0] << val[2] + + result +end + +def _reduce_88(val, _values, result) + result = @builder.assignable(val[0]) + + result +end + +def _reduce_89(val, _values, result) + result = @builder.assignable(val[0]) + + result +end + +def _reduce_90(val, _values, result) + result = @builder.index_asgn(val[0], val[1], val[2], val[3]) + + result +end + +def _reduce_91(val, _values, result) + result = @builder.attr_asgn(val[0], val[1], val[2]) + + result +end + +def _reduce_92(val, _values, result) + result = @builder.attr_asgn(val[0], val[1], val[2]) + + result +end + +def _reduce_93(val, _values, result) + result = @builder.attr_asgn(val[0], val[1], val[2]) + + result +end + +def _reduce_94(val, _values, result) + result = @builder.assignable( + @builder.const_fetch(val[0], val[1], val[2])) + + result +end + +def _reduce_95(val, _values, result) + result = @builder.assignable( + @builder.const_global(val[0], val[1])) + + result +end + +def _reduce_96(val, _values, result) + result = @builder.assignable(val[0]) + + result +end + +def _reduce_97(val, _values, result) + result = @builder.assignable(val[0]) + + result +end + +def _reduce_98(val, _values, result) + result = @builder.assignable(val[0]) + + result +end + +def _reduce_99(val, _values, result) + result = @builder.index_asgn(val[0], val[1], val[2], val[3]) + + result +end + +def _reduce_100(val, _values, result) + result = @builder.attr_asgn(val[0], val[1], val[2]) + + result +end + +def _reduce_101(val, _values, result) + result = @builder.attr_asgn(val[0], val[1], val[2]) + + result +end + +def _reduce_102(val, _values, result) + result = @builder.attr_asgn(val[0], val[1], val[2]) + + result +end + +def _reduce_103(val, _values, result) + result = @builder.assignable( + @builder.const_fetch(val[0], val[1], val[2])) + + result +end + +def _reduce_104(val, _values, result) + result = @builder.assignable( + @builder.const_global(val[0], val[1])) + + result +end + +def _reduce_105(val, _values, result) + result = @builder.assignable(val[0]) + + result +end + +def _reduce_106(val, _values, result) + diagnostic :error, :module_name_const, nil, val[0] + + result +end + +# reduce 107 omitted + +def _reduce_108(val, _values, result) + result = @builder.const_global(val[0], val[1]) + + result +end + +def _reduce_109(val, _values, result) + result = @builder.const(val[0]) + + result +end + +def _reduce_110(val, _values, result) + result = @builder.const_fetch(val[0], val[1], val[2]) + + result +end + +# reduce 111 omitted + +# reduce 112 omitted + +# reduce 113 omitted + +# reduce 114 omitted + +# reduce 115 omitted + +def _reduce_116(val, _values, result) + result = @builder.symbol_internal(val[0]) + + result +end + +# reduce 117 omitted + +# reduce 118 omitted + +# reduce 119 omitted + +def _reduce_120(val, _values, result) + result = [ val[0] ] + + result +end + +def _reduce_121(val, _values, result) + @lexer.state = :expr_fname + + result +end + +def _reduce_122(val, _values, result) + result = val[0] << val[3] + + result +end + +# reduce 123 omitted + +# reduce 124 omitted + +# reduce 125 omitted + +# reduce 126 omitted + +# reduce 127 omitted + +# reduce 128 omitted + +# reduce 129 omitted + +# reduce 130 omitted + +# reduce 131 omitted + +# reduce 132 omitted + +# reduce 133 omitted + +# reduce 134 omitted + +# reduce 135 omitted + +# reduce 136 omitted + +# reduce 137 omitted + +# reduce 138 omitted + +# reduce 139 omitted + +# reduce 140 omitted + +# reduce 141 omitted + +# reduce 142 omitted + +# reduce 143 omitted + +# reduce 144 omitted + +# reduce 145 omitted + +# reduce 146 omitted + +# reduce 147 omitted + +# reduce 148 omitted + +# reduce 149 omitted + +# reduce 150 omitted + +# reduce 151 omitted + +# reduce 152 omitted + +# reduce 153 omitted + +# reduce 154 omitted + +# reduce 155 omitted + +# reduce 156 omitted + +# reduce 157 omitted + +# reduce 158 omitted + +# reduce 159 omitted + +# reduce 160 omitted + +# reduce 161 omitted + +# reduce 162 omitted + +# reduce 163 omitted + +# reduce 164 omitted + +# reduce 165 omitted + +# reduce 166 omitted + +# reduce 167 omitted + +# reduce 168 omitted + +# reduce 169 omitted + +# reduce 170 omitted + +# reduce 171 omitted + +# reduce 172 omitted + +# reduce 173 omitted + +# reduce 174 omitted + +# reduce 175 omitted + +# reduce 176 omitted + +# reduce 177 omitted + +# reduce 178 omitted + +# reduce 179 omitted + +# reduce 180 omitted + +# reduce 181 omitted + +# reduce 182 omitted + +# reduce 183 omitted + +# reduce 184 omitted + +# reduce 185 omitted + +# reduce 186 omitted + +# reduce 187 omitted + +# reduce 188 omitted + +# reduce 189 omitted + +# reduce 190 omitted + +# reduce 191 omitted + +# reduce 192 omitted + +# reduce 193 omitted + +def _reduce_194(val, _values, result) + result = @builder.assign(val[0], val[1], val[2]) + + result +end + +def _reduce_195(val, _values, result) + rescue_body = @builder.rescue_body(val[3], + nil, nil, nil, + nil, val[4]) + + rescue_ = @builder.begin_body(val[2], [ rescue_body ]) + + result = @builder.assign(val[0], val[1], rescue_) + + result +end + +def _reduce_196(val, _values, result) + result = @builder.op_assign(val[0], val[1], val[2]) + + result +end + +def _reduce_197(val, _values, result) + rescue_body = @builder.rescue_body(val[3], + nil, nil, nil, + nil, val[4]) + + rescue_ = @builder.begin_body(val[2], [ rescue_body ]) + + result = @builder.op_assign(val[0], val[1], rescue_) + + result +end + +def _reduce_198(val, _values, result) + result = @builder.op_assign( + @builder.index( + val[0], val[1], val[2], val[3]), + val[4], val[5]) + + result +end + +def _reduce_199(val, _values, result) + result = @builder.op_assign( + @builder.call_method( + val[0], val[1], val[2]), + val[3], val[4]) + + result +end + +def _reduce_200(val, _values, result) + result = @builder.op_assign( + @builder.call_method( + val[0], val[1], val[2]), + val[3], val[4]) + + result +end + +def _reduce_201(val, _values, result) + result = @builder.op_assign( + @builder.call_method( + val[0], val[1], val[2]), + val[3], val[4]) + + result +end + +def _reduce_202(val, _values, result) + const = @builder.const_op_assignable( + @builder.const_fetch(val[0], val[1], val[2])) + result = @builder.op_assign(const, val[3], val[4]) + + result +end + +def _reduce_203(val, _values, result) + const = @builder.const_op_assignable( + @builder.const_global(val[0], val[1])) + result = @builder.op_assign(const, val[2], val[3]) + + result +end + +def _reduce_204(val, _values, result) + result = @builder.op_assign(val[0], val[1], val[2]) + + result +end + +def _reduce_205(val, _values, result) + result = @builder.range_inclusive(val[0], val[1], val[2]) + + result +end + +def _reduce_206(val, _values, result) + result = @builder.range_exclusive(val[0], val[1], val[2]) + + result +end + +def _reduce_207(val, _values, result) + result = @builder.binary_op(val[0], val[1], val[2]) + + result +end + +def _reduce_208(val, _values, result) + result = @builder.binary_op(val[0], val[1], val[2]) + + result +end + +def _reduce_209(val, _values, result) + result = @builder.binary_op(val[0], val[1], val[2]) + + result +end + +def _reduce_210(val, _values, result) + result = @builder.binary_op(val[0], val[1], val[2]) + + result +end + +def _reduce_211(val, _values, result) + result = @builder.binary_op(val[0], val[1], val[2]) + + result +end + +def _reduce_212(val, _values, result) + result = @builder.binary_op(val[0], val[1], val[2]) + + result +end + +def _reduce_213(val, _values, result) + result = @builder.unary_op(val[0], + @builder.binary_op( + val[1], val[2], val[3])) + + result +end + +def _reduce_214(val, _values, result) + result = @builder.unary_op(val[0], val[1]) + + result +end + +def _reduce_215(val, _values, result) + result = @builder.unary_op(val[0], val[1]) + + result +end + +def _reduce_216(val, _values, result) + result = @builder.binary_op(val[0], val[1], val[2]) + + result +end + +def _reduce_217(val, _values, result) + result = @builder.binary_op(val[0], val[1], val[2]) + + result +end + +def _reduce_218(val, _values, result) + result = @builder.binary_op(val[0], val[1], val[2]) + + result +end + +def _reduce_219(val, _values, result) + result = @builder.binary_op(val[0], val[1], val[2]) + + result +end + +def _reduce_220(val, _values, result) + result = @builder.binary_op(val[0], val[1], val[2]) + + result +end + +def _reduce_221(val, _values, result) + result = @builder.binary_op(val[0], val[1], val[2]) + + result +end + +def _reduce_222(val, _values, result) + result = @builder.binary_op(val[0], val[1], val[2]) + + result +end + +def _reduce_223(val, _values, result) + result = @builder.binary_op(val[0], val[1], val[2]) + + result +end + +def _reduce_224(val, _values, result) + result = @builder.binary_op(val[0], val[1], val[2]) + + result +end + +def _reduce_225(val, _values, result) + result = @builder.binary_op(val[0], val[1], val[2]) + + result +end + +def _reduce_226(val, _values, result) + result = @builder.binary_op(val[0], val[1], val[2]) + + result +end + +def _reduce_227(val, _values, result) + result = @builder.match_op(val[0], val[1], val[2]) + + result +end + +def _reduce_228(val, _values, result) + result = @builder.binary_op(val[0], val[1], val[2]) + + result +end + +def _reduce_229(val, _values, result) + result = @builder.not_op(val[0], nil, val[1], nil) + + result +end + +def _reduce_230(val, _values, result) + result = @builder.unary_op(val[0], val[1]) + + result +end + +def _reduce_231(val, _values, result) + result = @builder.binary_op(val[0], val[1], val[2]) + + result +end + +def _reduce_232(val, _values, result) + result = @builder.binary_op(val[0], val[1], val[2]) + + result +end + +def _reduce_233(val, _values, result) + result = @builder.logical_op(:and, val[0], val[1], val[2]) + + result +end + +def _reduce_234(val, _values, result) + result = @builder.logical_op(:or, val[0], val[1], val[2]) + + result +end + +def _reduce_235(val, _values, result) + result = @builder.keyword_cmd(:defined?, val[0], nil, [ val[2] ], nil) + + result +end + +def _reduce_236(val, _values, result) + result = @builder.ternary(val[0], val[1], + val[2], val[4], val[5]) + + result +end + +# reduce 237 omitted + +# reduce 238 omitted + +# reduce 239 omitted + +# reduce 240 omitted + +def _reduce_241(val, _values, result) + result = val[0] << @builder.associate(nil, val[2], nil) + + result +end + +def _reduce_242(val, _values, result) + result = [ @builder.associate(nil, val[0], nil) ] + + result +end + +def _reduce_243(val, _values, result) + result = val + + result +end + +def _reduce_244(val, _values, result) + result = [ nil, [], nil ] + + result +end + +# reduce 245 omitted + +def _reduce_246(val, _values, result) + result = [] + + result +end + +# reduce 247 omitted + +# reduce 248 omitted + +def _reduce_249(val, _values, result) + result = val[0] << @builder.associate(nil, val[2], nil) + + result +end + +def _reduce_250(val, _values, result) + result = [ @builder.associate(nil, val[0], nil) ] + + result +end + +def _reduce_251(val, _values, result) + result = [ val[0] ] + + result +end + +def _reduce_252(val, _values, result) + result = val[0].concat(val[1]) + + result +end + +def _reduce_253(val, _values, result) + result = [ @builder.associate(nil, val[0], nil) ] + result.concat(val[1]) + + result +end + +def _reduce_254(val, _values, result) + assocs = @builder.associate(nil, val[2], nil) + result = val[0] << assocs + result.concat(val[3]) + + result +end + +def _reduce_255(val, _values, result) + result = [ val[0] ] + + result +end + +def _reduce_256(val, _values, result) + result = @lexer.cmdarg.dup + @lexer.cmdarg.push(true) + + result +end + +def _reduce_257(val, _values, result) + @lexer.cmdarg = val[0] + + result = val[1] + + result +end + +def _reduce_258(val, _values, result) + result = @builder.block_pass(val[0], val[1]) + + result +end + +def _reduce_259(val, _values, result) + result = [ val[1] ] + + result +end + +def _reduce_260(val, _values, result) + result = [] + + result +end + +def _reduce_261(val, _values, result) + result = [ val[0] ] + + result +end + +def _reduce_262(val, _values, result) + result = [ @builder.splat(val[0], val[1]) ] + + result +end + +def _reduce_263(val, _values, result) + result = val[0] << val[2] + + result +end + +def _reduce_264(val, _values, result) + result = val[0] << @builder.splat(val[2], val[3]) + + result +end + +def _reduce_265(val, _values, result) + result = @builder.array(nil, val[0], nil) + + result +end + +# reduce 266 omitted + +def _reduce_267(val, _values, result) + result = val[0] << val[2] + + result +end + +def _reduce_268(val, _values, result) + result = val[0] << @builder.splat(val[2], val[3]) + + result +end + +def _reduce_269(val, _values, result) + result = [ @builder.splat(val[0], val[1]) ] + + result +end + +# reduce 270 omitted + +# reduce 271 omitted + +# reduce 272 omitted + +# reduce 273 omitted + +# reduce 274 omitted + +# reduce 275 omitted + +# reduce 276 omitted + +# reduce 277 omitted + +# reduce 278 omitted + +# reduce 279 omitted + +def _reduce_280(val, _values, result) + result = @builder.call_method(nil, nil, val[0]) + + result +end + +def _reduce_281(val, _values, result) + result = @lexer.cmdarg.dup + @lexer.cmdarg.clear + + result +end + +def _reduce_282(val, _values, result) + @lexer.cmdarg = val[1] + + result = @builder.begin_keyword(val[0], val[2], val[3]) + + result +end + +def _reduce_283(val, _values, result) + result = @lexer.cmdarg.dup + @lexer.cmdarg.clear + + result +end + +def _reduce_284(val, _values, result) + @lexer.state = :expr_endarg + + result +end + +def _reduce_285(val, _values, result) + @lexer.cmdarg = val[1] + + result = @builder.begin(val[0], val[2], val[5]) + + result +end + +def _reduce_286(val, _values, result) + @lexer.state = :expr_endarg + + result +end + +def _reduce_287(val, _values, result) + result = @builder.begin(val[0], nil, val[3]) + + result +end + +def _reduce_288(val, _values, result) + result = @builder.begin(val[0], val[1], val[2]) + + result +end + +def _reduce_289(val, _values, result) + result = @builder.const_fetch(val[0], val[1], val[2]) + + result +end + +def _reduce_290(val, _values, result) + result = @builder.const_global(val[0], val[1]) + + result +end + +def _reduce_291(val, _values, result) + result = @builder.array(val[0], val[1], val[2]) + + result +end + +def _reduce_292(val, _values, result) + result = @builder.associate(val[0], val[1], val[2]) + + result +end + +def _reduce_293(val, _values, result) + result = @builder.keyword_cmd(:return, val[0]) + + result +end + +def _reduce_294(val, _values, result) + result = @builder.keyword_cmd(:yield, val[0], val[1], val[2], val[3]) + + result +end + +def _reduce_295(val, _values, result) + result = @builder.keyword_cmd(:yield, val[0], val[1], [], val[2]) + + result +end + +def _reduce_296(val, _values, result) + result = @builder.keyword_cmd(:yield, val[0]) + + result +end + +def _reduce_297(val, _values, result) + result = @builder.keyword_cmd(:defined?, val[0], + val[2], [ val[3] ], val[4]) + + result +end + +def _reduce_298(val, _values, result) + result = @builder.not_op(val[0], val[1], val[2], val[3]) + + result +end + +def _reduce_299(val, _values, result) + result = @builder.not_op(val[0], val[1], nil, val[2]) + + result +end + +def _reduce_300(val, _values, result) + method_call = @builder.call_method(nil, nil, val[0]) + + begin_t, args, body, end_t = val[1] + result = @builder.block(method_call, + begin_t, args, body, end_t) + + result +end + +# reduce 301 omitted + +def _reduce_302(val, _values, result) + begin_t, args, body, end_t = val[1] + result = @builder.block(val[0], + begin_t, args, body, end_t) + + result +end + +def _reduce_303(val, _values, result) + result = @context.dup + @context.in_lambda = true + + result +end + +def _reduce_304(val, _values, result) + lambda_call = @builder.call_lambda(val[0]) + + args, (begin_t, body, end_t) = val[2] + result = @builder.block(lambda_call, + begin_t, args, body, end_t) + + @context.in_lambda = val[1].in_lambda + + result +end + +def _reduce_305(val, _values, result) + else_t, else_ = val[4] + result = @builder.condition(val[0], val[1], val[2], + val[3], else_t, + else_, val[5]) + + result +end + +def _reduce_306(val, _values, result) + else_t, else_ = val[4] + result = @builder.condition(val[0], val[1], val[2], + else_, else_t, + val[3], val[5]) + + result +end + +def _reduce_307(val, _values, result) + @lexer.cond.push(true) + + result +end + +def _reduce_308(val, _values, result) + @lexer.cond.pop + + result +end + +def _reduce_309(val, _values, result) + result = @builder.loop(:while, val[0], val[2], val[3], + val[5], val[6]) + + result +end + +def _reduce_310(val, _values, result) + @lexer.cond.push(true) + + result +end + +def _reduce_311(val, _values, result) + @lexer.cond.pop + + result +end + +def _reduce_312(val, _values, result) + result = @builder.loop(:until, val[0], val[2], val[3], + val[5], val[6]) + + result +end + +def _reduce_313(val, _values, result) + *when_bodies, (else_t, else_body) = *val[3] + + result = @builder.case(val[0], val[1], + when_bodies, else_t, else_body, + val[4]) + + result +end + +def _reduce_314(val, _values, result) + *when_bodies, (else_t, else_body) = *val[2] + + result = @builder.case(val[0], nil, + when_bodies, else_t, else_body, + val[3]) + + result +end + +def _reduce_315(val, _values, result) + @lexer.cond.push(true) + + result +end + +def _reduce_316(val, _values, result) + @lexer.cond.pop + + result +end + +def _reduce_317(val, _values, result) + result = @builder.for(val[0], val[1], + val[2], val[4], + val[5], val[7], val[8]) + + result +end + +def _reduce_318(val, _values, result) + local_push + @context.in_class = true + + result +end + +def _reduce_319(val, _values, result) + k_class, ctx = val[0] + if @context.in_def + diagnostic :error, :class_in_def, nil, k_class + end + + lt_t, superclass = val[2] + result = @builder.def_class(k_class, val[1], + lt_t, superclass, + val[4], val[5]) + + local_pop + @context.in_class = ctx.in_class + + result +end + +def _reduce_320(val, _values, result) + @context.in_def = false + @context.in_class = false + local_push + + result +end + +def _reduce_321(val, _values, result) + k_class, ctx = val[0] + result = @builder.def_sclass(k_class, val[1], val[2], + val[5], val[6]) + + local_pop + @context.in_def = ctx.in_def + @context.in_class = ctx.in_class + + result +end + +def _reduce_322(val, _values, result) + @context.in_class = true + local_push + + result +end + +def _reduce_323(val, _values, result) + k_mod, ctx = val[0] + if @context.in_def + diagnostic :error, :module_in_def, nil, k_mod + end + + result = @builder.def_module(k_mod, val[1], + val[3], val[4]) + + local_pop + @context.in_class = ctx.in_class + + result +end + +def _reduce_324(val, _values, result) + local_push + result = context.dup + @context.in_def = true + + result +end + +def _reduce_325(val, _values, result) + result = @builder.def_method(val[0], val[1], + val[3], val[4], val[5]) + + local_pop + @context.in_def = val[2].in_def + + result +end + +def _reduce_326(val, _values, result) + @lexer.state = :expr_fname + + result +end + +def _reduce_327(val, _values, result) + local_push + result = context.dup + @context.in_def = true + + result +end + +def _reduce_328(val, _values, result) + result = @builder.def_singleton(val[0], val[1], val[2], + val[4], val[6], val[7], val[8]) + + local_pop + @context.in_def = val[5].in_def + + result +end + +def _reduce_329(val, _values, result) + result = @builder.keyword_cmd(:break, val[0]) + + result +end + +def _reduce_330(val, _values, result) + result = @builder.keyword_cmd(:next, val[0]) + + result +end + +def _reduce_331(val, _values, result) + result = @builder.keyword_cmd(:redo, val[0]) + + result +end + +def _reduce_332(val, _values, result) + result = @builder.keyword_cmd(:retry, val[0]) + + result +end + +# reduce 333 omitted + +def _reduce_334(val, _values, result) + result = [ val[0], @context.dup ] + + result +end + +def _reduce_335(val, _values, result) + result = [ val[0], @context.dup ] + + result +end + +# reduce 336 omitted + +# reduce 337 omitted + +def _reduce_338(val, _values, result) + result = val[1] + + result +end + +# reduce 339 omitted + +# reduce 340 omitted + +# reduce 341 omitted + +def _reduce_342(val, _values, result) + else_t, else_ = val[4] + result = [ val[0], + @builder.condition(val[0], val[1], val[2], + val[3], else_t, + else_, nil), + ] + + result +end + +# reduce 343 omitted + +def _reduce_344(val, _values, result) + result = val + + result +end + +# reduce 345 omitted + +# reduce 346 omitted + +def _reduce_347(val, _values, result) + result = @builder.arg(val[0]) + + result +end + +def _reduce_348(val, _values, result) + result = @builder.multi_lhs(val[0], val[1], val[2]) + + result +end + +def _reduce_349(val, _values, result) + result = [ val[0] ] + + result +end + +def _reduce_350(val, _values, result) + result = val[0] << val[2] + + result +end + +# reduce 351 omitted + +def _reduce_352(val, _values, result) + result = val[0]. + push(@builder.restarg(val[2], val[3])) + + result +end + +def _reduce_353(val, _values, result) + result = val[0]. + push(@builder.restarg(val[2], val[3])). + concat(val[5]) + + result +end + +def _reduce_354(val, _values, result) + result = val[0]. + push(@builder.restarg(val[2])) + + result +end + +def _reduce_355(val, _values, result) + result = val[0]. + push(@builder.restarg(val[2])). + concat(val[4]) + + result +end + +def _reduce_356(val, _values, result) + result = [ @builder.restarg(val[0], val[1]) ] + + result +end + +def _reduce_357(val, _values, result) + result = [ @builder.restarg(val[0], val[1]), + *val[3] ] + + result +end + +def _reduce_358(val, _values, result) + result = [ @builder.restarg(val[0]) ] + + result +end + +def _reduce_359(val, _values, result) + result = [ @builder.restarg(val[0]), + *val[2] ] + + result +end + +def _reduce_360(val, _values, result) + result = val[0].concat(val[2]).concat(val[3]) + + result +end + +def _reduce_361(val, _values, result) + result = val[0].concat(val[1]) + + result +end + +def _reduce_362(val, _values, result) + result = val[0].concat(val[1]) + + result +end + +def _reduce_363(val, _values, result) + result = [ val[0] ] + + result +end + +def _reduce_364(val, _values, result) + result = val[1] + + result +end + +def _reduce_365(val, _values, result) + result = [] + + result +end + +def _reduce_366(val, _values, result) + result = val[0]. + concat(val[2]). + concat(val[4]). + concat(val[5]) + + result +end + +def _reduce_367(val, _values, result) + result = val[0]. + concat(val[2]). + concat(val[4]). + concat(val[6]). + concat(val[7]) + + result +end + +def _reduce_368(val, _values, result) + result = val[0]. + concat(val[2]). + concat(val[3]) + + result +end + +def _reduce_369(val, _values, result) + result = val[0]. + concat(val[2]). + concat(val[4]). + concat(val[5]) + + result +end + +def _reduce_370(val, _values, result) + result = val[0]. + concat(val[2]). + concat(val[3]) + + result +end + +# reduce 371 omitted + +def _reduce_372(val, _values, result) + result = val[0]. + concat(val[2]). + concat(val[4]). + concat(val[5]) + + result +end + +def _reduce_373(val, _values, result) + if val[1].empty? && val[0].size == 1 + result = [@builder.procarg0(val[0][0])] + else + result = val[0].concat(val[1]) + end + + result +end + +def _reduce_374(val, _values, result) + result = val[0]. + concat(val[2]). + concat(val[3]) + + result +end + +def _reduce_375(val, _values, result) + result = val[0]. + concat(val[2]). + concat(val[4]). + concat(val[5]) + + result +end + +def _reduce_376(val, _values, result) + result = val[0]. + concat(val[1]) + + result +end + +def _reduce_377(val, _values, result) + result = val[0]. + concat(val[2]). + concat(val[3]) + + result +end + +def _reduce_378(val, _values, result) + result = val[0]. + concat(val[1]) + + result +end + +def _reduce_379(val, _values, result) + result = val[0]. + concat(val[2]). + concat(val[3]) + + result +end + +# reduce 380 omitted + +def _reduce_381(val, _values, result) + result = @builder.args(nil, [], nil) + + result +end + +def _reduce_382(val, _values, result) + @lexer.state = :expr_value + + result +end + +def _reduce_383(val, _values, result) + result = @builder.args(val[0], val[1], val[2]) + + result +end + +def _reduce_384(val, _values, result) + result = @builder.args(val[0], [], val[0]) + + result +end + +def _reduce_385(val, _values, result) + result = @builder.args(val[0], val[1].concat(val[2]), val[3]) + + result +end + +def _reduce_386(val, _values, result) + result = [] + + result +end + +def _reduce_387(val, _values, result) + result = val[2] + + result +end + +def _reduce_388(val, _values, result) + result = [ val[0] ] + + result +end + +def _reduce_389(val, _values, result) + result = val[0] << val[2] + + result +end + +def _reduce_390(val, _values, result) + @static_env.declare val[0][0] + result = @builder.shadowarg(val[0]) + + result +end + +# reduce 391 omitted + +def _reduce_392(val, _values, result) + @static_env.extend_dynamic + + result +end + +def _reduce_393(val, _values, result) + result = @lexer.cmdarg.dup + @lexer.cmdarg.clear + + result +end + +def _reduce_394(val, _values, result) + @lexer.cmdarg = val[2] + @lexer.cmdarg.lexpop + + result = [ val[1], val[3] ] + + @static_env.unextend + + result +end + +def _reduce_395(val, _values, result) + result = @builder.args(val[0], val[1].concat(val[2]), val[3]) + + result +end + +def _reduce_396(val, _values, result) + result = @builder.args(nil, val[0], nil) + + result +end + +def _reduce_397(val, _values, result) + result = @context.dup + @context.in_lambda = true + + result +end + +def _reduce_398(val, _values, result) + result = [ val[0], val[2], val[3] ] + @context.in_lambda = val[1].in_lambda + + result +end + +def _reduce_399(val, _values, result) + result = @context.dup + @context.in_lambda = true + + result +end + +def _reduce_400(val, _values, result) + result = [ val[0], val[2], val[3] ] + @context.in_lambda = val[1].in_lambda + + result +end + +def _reduce_401(val, _values, result) + @static_env.extend_dynamic + result = @context.dup + @context.in_block = true + + result +end + +def _reduce_402(val, _values, result) + result = [ val[0], val[2], val[3], val[4] ] + + @static_env.unextend + @context.in_block = val[1].in_block + + result +end + +def _reduce_403(val, _values, result) + begin_t, block_args, body, end_t = val[1] + result = @builder.block(val[0], + begin_t, block_args, body, end_t) + + result +end + +def _reduce_404(val, _values, result) + lparen_t, args, rparen_t = val[3] + result = @builder.call_method(val[0], val[1], val[2], + lparen_t, args, rparen_t) + + result +end + +def _reduce_405(val, _values, result) + lparen_t, args, rparen_t = val[3] + method_call = @builder.call_method(val[0], val[1], val[2], + lparen_t, args, rparen_t) + + begin_t, args, body, end_t = val[4] + result = @builder.block(method_call, + begin_t, args, body, end_t) + + result +end + +def _reduce_406(val, _values, result) + method_call = @builder.call_method(val[0], val[1], val[2], + nil, val[3], nil) + + begin_t, args, body, end_t = val[4] + result = @builder.block(method_call, + begin_t, args, body, end_t) + + result +end + +def _reduce_407(val, _values, result) + lparen_t, args, rparen_t = val[1] + result = @builder.call_method(nil, nil, val[0], + lparen_t, args, rparen_t) + + result +end + +def _reduce_408(val, _values, result) + lparen_t, args, rparen_t = val[3] + result = @builder.call_method(val[0], val[1], val[2], + lparen_t, args, rparen_t) + + result +end + +def _reduce_409(val, _values, result) + lparen_t, args, rparen_t = val[3] + result = @builder.call_method(val[0], val[1], val[2], + lparen_t, args, rparen_t) + + result +end + +def _reduce_410(val, _values, result) + result = @builder.call_method(val[0], val[1], val[2]) + + result +end + +def _reduce_411(val, _values, result) + lparen_t, args, rparen_t = val[2] + result = @builder.call_method(val[0], val[1], nil, + lparen_t, args, rparen_t) + + result +end + +def _reduce_412(val, _values, result) + lparen_t, args, rparen_t = val[2] + result = @builder.call_method(val[0], val[1], nil, + lparen_t, args, rparen_t) + + result +end + +def _reduce_413(val, _values, result) + lparen_t, args, rparen_t = val[1] + result = @builder.keyword_cmd(:super, val[0], + lparen_t, args, rparen_t) + + result +end + +def _reduce_414(val, _values, result) + result = @builder.keyword_cmd(:zsuper, val[0]) + + result +end + +def _reduce_415(val, _values, result) + result = @builder.index(val[0], val[1], val[2], val[3]) + + result +end + +def _reduce_416(val, _values, result) + @static_env.extend_dynamic + result = @context.dup + @context.in_block = true + + result +end + +def _reduce_417(val, _values, result) + result = [ val[0], val[2], val[3], val[4] ] + + @static_env.unextend + @context.in_block = val[1].in_block + + result +end + +def _reduce_418(val, _values, result) + @static_env.extend_dynamic + result = @context.dup + @context.in_block = true + + result +end + +def _reduce_419(val, _values, result) + result = [ val[0], val[2], val[3], val[4] ] + + @static_env.unextend + @context.in_block = val[1].in_block + + result +end + +def _reduce_420(val, _values, result) + result = [ @builder.when(val[0], val[1], val[2], val[3]), + *val[4] ] + + result +end + +def _reduce_421(val, _values, result) + result = [ val[0] ] + + result +end + +# reduce 422 omitted + +def _reduce_423(val, _values, result) + assoc_t, exc_var = val[2] + + if val[1] + exc_list = @builder.array(nil, val[1], nil) + end + + result = [ @builder.rescue_body(val[0], + exc_list, assoc_t, exc_var, + val[3], val[4]), + *val[5] ] + + result +end + +def _reduce_424(val, _values, result) + result = [] + + result +end + +def _reduce_425(val, _values, result) + result = [ val[0] ] + + result +end + +# reduce 426 omitted + +# reduce 427 omitted + +def _reduce_428(val, _values, result) + result = [ val[0], val[1] ] + + result +end + +# reduce 429 omitted + +def _reduce_430(val, _values, result) + result = [ val[0], val[1] ] + + result +end + +# reduce 431 omitted + +# reduce 432 omitted + +# reduce 433 omitted + +# reduce 434 omitted + +def _reduce_435(val, _values, result) + result = @builder.string_compose(nil, val[0], nil) + + result +end + +def _reduce_436(val, _values, result) + result = [ val[0] ] + + result +end + +def _reduce_437(val, _values, result) + result = val[0] << val[1] + + result +end + +def _reduce_438(val, _values, result) + result = @builder.string_compose(val[0], val[1], val[2]) + + result +end + +def _reduce_439(val, _values, result) + result = @builder.string(val[0]) + + result +end + +def _reduce_440(val, _values, result) + result = @builder.character(val[0]) + + result +end + +def _reduce_441(val, _values, result) + result = @builder.xstring_compose(val[0], val[1], val[2]) + + result +end + +def _reduce_442(val, _values, result) + opts = @builder.regexp_options(val[3]) + result = @builder.regexp_compose(val[0], val[1], val[2], opts) + + result +end + +def _reduce_443(val, _values, result) + result = @builder.words_compose(val[0], val[1], val[2]) + + result +end + +def _reduce_444(val, _values, result) + result = [] + + result +end + +def _reduce_445(val, _values, result) + result = val[0] << @builder.word(val[1]) + + result +end + +def _reduce_446(val, _values, result) + result = [ val[0] ] + + result +end + +def _reduce_447(val, _values, result) + result = val[0] << val[1] + + result +end + +def _reduce_448(val, _values, result) + result = @builder.symbols_compose(val[0], val[1], val[2]) + + result +end + +def _reduce_449(val, _values, result) + result = [] + + result +end + +def _reduce_450(val, _values, result) + result = val[0] << @builder.word(val[1]) + + result +end + +def _reduce_451(val, _values, result) + result = @builder.words_compose(val[0], val[1], val[2]) + + result +end + +def _reduce_452(val, _values, result) + result = @builder.symbols_compose(val[0], val[1], val[2]) + + result +end + +def _reduce_453(val, _values, result) + result = [] + + result +end + +def _reduce_454(val, _values, result) + result = val[0] << @builder.string_internal(val[1]) + + result +end + +def _reduce_455(val, _values, result) + result = [] + + result +end + +def _reduce_456(val, _values, result) + result = val[0] << @builder.symbol_internal(val[1]) + + result +end + +def _reduce_457(val, _values, result) + result = [] + + result +end + +def _reduce_458(val, _values, result) + result = val[0] << val[1] + + result +end + +def _reduce_459(val, _values, result) + result = [] + + result +end + +def _reduce_460(val, _values, result) + result = val[0] << val[1] + + result +end + +def _reduce_461(val, _values, result) + result = [] + + result +end + +def _reduce_462(val, _values, result) + result = val[0] << val[1] + + result +end + +def _reduce_463(val, _values, result) + result = @builder.string_internal(val[0]) + + result +end + +def _reduce_464(val, _values, result) + result = val[1] + + result +end + +def _reduce_465(val, _values, result) + @lexer.cond.push(false) + @lexer.cmdarg.push(false) + + result +end + +def _reduce_466(val, _values, result) + @lexer.cond.lexpop + @lexer.cmdarg.lexpop + + result = @builder.begin(val[0], val[2], val[3]) + + result +end + +def _reduce_467(val, _values, result) + result = @builder.gvar(val[0]) + + result +end + +def _reduce_468(val, _values, result) + result = @builder.ivar(val[0]) + + result +end + +def _reduce_469(val, _values, result) + result = @builder.cvar(val[0]) + + result +end + +# reduce 470 omitted + +def _reduce_471(val, _values, result) + result = @builder.symbol(val[0]) + + result +end + +def _reduce_472(val, _values, result) + result = @builder.symbol_compose(val[0], val[1], val[2]) + + result +end + +def _reduce_473(val, _values, result) + result = val[0] + + result +end + +def _reduce_474(val, _values, result) + if @builder.respond_to? :negate + # AST builder interface compatibility + result = @builder.negate(val[0], val[1]) + else + result = @builder.unary_num(val[0], val[1]) + end + + result +end + +def _reduce_475(val, _values, result) + result = @builder.integer(val[0]) + + result +end + +def _reduce_476(val, _values, result) + result = @builder.float(val[0]) + + result +end + +def _reduce_477(val, _values, result) + result = @builder.rational(val[0]) + + result +end + +def _reduce_478(val, _values, result) + result = @builder.complex(val[0]) + + result +end + +def _reduce_479(val, _values, result) + result = @builder.ident(val[0]) + + result +end + +def _reduce_480(val, _values, result) + result = @builder.ivar(val[0]) + + result +end + +def _reduce_481(val, _values, result) + result = @builder.gvar(val[0]) + + result +end + +def _reduce_482(val, _values, result) + result = @builder.const(val[0]) + + result +end + +def _reduce_483(val, _values, result) + result = @builder.cvar(val[0]) + + result +end + +def _reduce_484(val, _values, result) + result = @builder.nil(val[0]) + + result +end + +def _reduce_485(val, _values, result) + result = @builder.self(val[0]) + + result +end + +def _reduce_486(val, _values, result) + result = @builder.true(val[0]) + + result +end + +def _reduce_487(val, _values, result) + result = @builder.false(val[0]) + + result +end + +def _reduce_488(val, _values, result) + result = @builder.__FILE__(val[0]) + + result +end + +def _reduce_489(val, _values, result) + result = @builder.__LINE__(val[0]) + + result +end + +def _reduce_490(val, _values, result) + result = @builder.__ENCODING__(val[0]) + + result +end + +def _reduce_491(val, _values, result) + result = @builder.accessible(val[0]) + + result +end + +def _reduce_492(val, _values, result) + result = @builder.accessible(val[0]) + + result +end + +def _reduce_493(val, _values, result) + result = @builder.assignable(val[0]) + + result +end + +def _reduce_494(val, _values, result) + result = @builder.assignable(val[0]) + + result +end + +def _reduce_495(val, _values, result) + result = @builder.nth_ref(val[0]) + + result +end + +def _reduce_496(val, _values, result) + result = @builder.back_ref(val[0]) + + result +end + +def _reduce_497(val, _values, result) + result = nil + + result +end + +def _reduce_498(val, _values, result) + @lexer.state = :expr_value + + result +end + +def _reduce_499(val, _values, result) + result = [ val[0], val[2] ] + + result +end + +def _reduce_500(val, _values, result) + yyerrok + result = nil + + result +end + +def _reduce_501(val, _values, result) + result = @builder.args(val[0], val[1], val[2]) + + @lexer.state = :expr_value + + result +end + +def _reduce_502(val, _values, result) + result = @context.in_kwarg + @context.in_kwarg = true + + result +end + +def _reduce_503(val, _values, result) + @context.in_kwarg = val[0] + result = @builder.args(nil, val[1], nil) + + result +end + +def _reduce_504(val, _values, result) + result = val[0].concat(val[2]).concat(val[3]) + + result +end + +def _reduce_505(val, _values, result) + result = val[0].concat(val[1]) + + result +end + +def _reduce_506(val, _values, result) + result = val[0].concat(val[1]) + + result +end + +def _reduce_507(val, _values, result) + result = [ val[0] ] + + result +end + +def _reduce_508(val, _values, result) + result = val[1] + + result +end + +def _reduce_509(val, _values, result) + result = [] + + result +end + +def _reduce_510(val, _values, result) + result = val[0]. + concat(val[2]). + concat(val[4]). + concat(val[5]) + + result +end + +def _reduce_511(val, _values, result) + result = val[0]. + concat(val[2]). + concat(val[4]). + concat(val[6]). + concat(val[7]) + + result +end + +def _reduce_512(val, _values, result) + result = val[0]. + concat(val[2]). + concat(val[3]) + + result +end + +def _reduce_513(val, _values, result) + result = val[0]. + concat(val[2]). + concat(val[4]). + concat(val[5]) + + result +end + +def _reduce_514(val, _values, result) + result = val[0]. + concat(val[2]). + concat(val[3]) + + result +end + +def _reduce_515(val, _values, result) + result = val[0]. + concat(val[2]). + concat(val[4]). + concat(val[5]) + + result +end + +def _reduce_516(val, _values, result) + result = val[0]. + concat(val[1]) + + result +end + +def _reduce_517(val, _values, result) + result = val[0]. + concat(val[2]). + concat(val[3]) + + result +end + +def _reduce_518(val, _values, result) + result = val[0]. + concat(val[2]). + concat(val[4]). + concat(val[5]) + + result +end + +def _reduce_519(val, _values, result) + result = val[0]. + concat(val[1]) + + result +end + +def _reduce_520(val, _values, result) + result = val[0]. + concat(val[2]). + concat(val[3]) + + result +end + +def _reduce_521(val, _values, result) + result = val[0]. + concat(val[1]) + + result +end + +def _reduce_522(val, _values, result) + result = val[0]. + concat(val[2]). + concat(val[3]) + + result +end + +def _reduce_523(val, _values, result) + result = val[0] + + result +end + +def _reduce_524(val, _values, result) + result = [] + + result +end + +def _reduce_525(val, _values, result) + diagnostic :error, :argument_const, nil, val[0] + + result +end + +def _reduce_526(val, _values, result) + diagnostic :error, :argument_ivar, nil, val[0] + + result +end + +def _reduce_527(val, _values, result) + diagnostic :error, :argument_gvar, nil, val[0] + + result +end + +def _reduce_528(val, _values, result) + diagnostic :error, :argument_cvar, nil, val[0] + + result +end + +# reduce 529 omitted + +def _reduce_530(val, _values, result) + @static_env.declare val[0][0] + + result = val[0] + + result +end + +def _reduce_531(val, _values, result) + result = @builder.arg(val[0]) + + result +end + +def _reduce_532(val, _values, result) + result = @builder.multi_lhs(val[0], val[1], val[2]) + + result +end + +def _reduce_533(val, _values, result) + result = [ val[0] ] + + result +end + +def _reduce_534(val, _values, result) + result = val[0] << val[2] + + result +end + +def _reduce_535(val, _values, result) + check_kwarg_name(val[0]) + + @static_env.declare val[0][0] + + result = val[0] + + result +end + +def _reduce_536(val, _values, result) + result = @builder.kwoptarg(val[0], val[1]) + + result +end + +def _reduce_537(val, _values, result) + result = @builder.kwarg(val[0]) + + result +end + +def _reduce_538(val, _values, result) + result = @builder.kwoptarg(val[0], val[1]) + + result +end + +def _reduce_539(val, _values, result) + result = @builder.kwarg(val[0]) + + result +end + +def _reduce_540(val, _values, result) + result = [ val[0] ] + + result +end + +def _reduce_541(val, _values, result) + result = val[0] << val[2] + + result +end + +def _reduce_542(val, _values, result) + result = [ val[0] ] + + result +end + +def _reduce_543(val, _values, result) + result = val[0] << val[2] + + result +end + +# reduce 544 omitted + +# reduce 545 omitted + +def _reduce_546(val, _values, result) + @static_env.declare val[1][0] + + result = [ @builder.kwrestarg(val[0], val[1]) ] + + result +end + +def _reduce_547(val, _values, result) + result = [ @builder.kwrestarg(val[0]) ] + + result +end + +def _reduce_548(val, _values, result) + result = @builder.optarg(val[0], val[1], val[2]) + + result +end + +def _reduce_549(val, _values, result) + result = @builder.optarg(val[0], val[1], val[2]) + + result +end + +def _reduce_550(val, _values, result) + result = [ val[0] ] + + result +end + +def _reduce_551(val, _values, result) + result = val[0] << val[2] + + result +end + +def _reduce_552(val, _values, result) + result = [ val[0] ] + + result +end + +def _reduce_553(val, _values, result) + result = val[0] << val[2] + + result +end + +# reduce 554 omitted + +# reduce 555 omitted + +def _reduce_556(val, _values, result) + @static_env.declare val[1][0] + + result = [ @builder.restarg(val[0], val[1]) ] + + result +end + +def _reduce_557(val, _values, result) + result = [ @builder.restarg(val[0]) ] + + result +end + +# reduce 558 omitted + +# reduce 559 omitted + +def _reduce_560(val, _values, result) + @static_env.declare val[1][0] + + result = @builder.blockarg(val[0], val[1]) + + result +end + +def _reduce_561(val, _values, result) + result = [ val[1] ] + + result +end + +def _reduce_562(val, _values, result) + result = [] + + result +end + +# reduce 563 omitted + +def _reduce_564(val, _values, result) + result = val[1] + + result +end + +def _reduce_565(val, _values, result) + result = [] + + result +end + +# reduce 566 omitted + +def _reduce_567(val, _values, result) + result = [ val[0] ] + + result +end + +def _reduce_568(val, _values, result) + result = val[0] << val[2] + + result +end + +def _reduce_569(val, _values, result) + result = @builder.pair(val[0], val[1], val[2]) + + result +end + +def _reduce_570(val, _values, result) + result = @builder.pair_keyword(val[0], val[1]) + + result +end + +def _reduce_571(val, _values, result) + result = @builder.kwsplat(val[0], val[1]) + + result +end + +# reduce 572 omitted + +# reduce 573 omitted + +# reduce 574 omitted + +# reduce 575 omitted + +# reduce 576 omitted + +# reduce 577 omitted + +# reduce 578 omitted + +# reduce 579 omitted + +# reduce 580 omitted + +# reduce 581 omitted + +# reduce 582 omitted + +# reduce 583 omitted + +# reduce 584 omitted + +# reduce 585 omitted + +# reduce 586 omitted + +# reduce 587 omitted + +def _reduce_588(val, _values, result) + result = val[1] + + result +end + +def _reduce_589(val, _values, result) + result = val[1] + + result +end + +# reduce 590 omitted + +# reduce 591 omitted + +# reduce 592 omitted + +def _reduce_593(val, _values, result) + yyerrok + + result +end + +# reduce 594 omitted + +# reduce 595 omitted + +# reduce 596 omitted + +def _reduce_597(val, _values, result) + result = nil + + result +end + +def _reduce_none(val, _values, result) + val[0] +end + + end # class Ruby21 + end # module Parser diff --git a/vendor/bundle/ruby/3.1.0/gems/parser-3.1.2.0/lib/parser/ruby22.rb b/vendor/bundle/ruby/3.1.0/gems/parser-3.1.2.0/lib/parser/ruby22.rb new file mode 100644 index 000000000..64158b9a9 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/parser-3.1.2.0/lib/parser/ruby22.rb @@ -0,0 +1,6655 @@ +# -*- encoding:utf-8; warn-indent:false; frozen_string_literal: true -*- +# +# DO NOT MODIFY!!!! +# This file is automatically generated by Racc 1.4.15 +# from Racc grammer file "". +# + +require 'racc/parser.rb' + + +require 'parser' + +module Parser + class Ruby22 < Parser::Base + + + def version + 22 + end + + def default_encoding + Encoding::UTF_8 + end + + def local_push + @static_env.extend_static + @lexer.cmdarg.push(false) + @lexer.cond.push(false) + end + + def local_pop + @static_env.unextend + @lexer.cmdarg.pop + @lexer.cond.pop + end +##### State transition tables begin ### + +clist = [ +'-581,270,538,216,217,270,-100,-581,-581,-581,559,538,-98,-581,-581,219', +'-581,270,-286,-105,617,582,-101,-99,-494,-581,617,240,115,-493,567,447', +'-104,114,-97,580,-581,-581,-100,-581,-581,-581,-581,-581,-99,-102,538', +'538,-91,-102,872,-83,115,216,217,616,220,114,-286,237,-69,616,528,239', +'238,530,-581,-581,-581,-581,-581,-581,-581,-581,-581,-581,-581,-581', +'-581,-581,-98,265,-581,-581,-581,-97,601,581,269,-93,-581,446,269,-581', +'569,568,574,220,-581,-577,-581,579,-581,-581,269,-581,-581,-581,-581', +'-581,-289,-581,-581,-581,-91,-91,558,-289,-289,-289,115,-89,-289,-289', +'-289,114,-289,-581,-96,115,-581,-581,-90,-92,114,-581,-289,-289,-289', +'115,-101,-95,-101,-88,114,-101,-289,-289,538,-289,-289,-289,-289,-289', +'-91,-93,-100,-91,-93,871,831,-100,-99,-102,115,115,-91,-99,-102,114', +'114,695,695,695,-101,491,-289,-289,-289,-289,-289,-289,-289,-289,-289', +'-289,-289,-289,-289,-289,216,217,-289,-289,-289,-93,753,-289,-93,751', +'-289,750,-103,-289,-289,489,-289,-93,-289,617,-289,444,-289,-289,841', +'-289,-289,-289,-289,-289,550,-289,-479,-289,551,216,217,216,217,-479', +'-479,-479,-263,617,-479,-479,-479,-289,-479,-577,-289,-289,-289,-289', +'616,-289,-479,-289,-479,-479,-479,445,-103,270,516,-102,499,-100,-479', +'-479,-68,-479,-479,-479,-479,-479,115,-578,616,823,-99,114,567,818,786', +'115,115,115,-486,262,114,114,114,-92,220,-486,263,259,-479,-479,-479', +'-479,-479,-479,-479,-479,-479,-479,-479,-479,-479,-479,567,840,-479', +'-479,-479,-105,-479,-479,-104,-94,-479,216,217,-479,-479,265,-479,220', +'-479,115,-479,220,-479,-479,114,-479,-479,-479,-479,-479,-484,-479,-482', +'-479,569,568,570,-484,269,-482,-482,-482,-487,755,-482,-482,-482,-479', +'-482,-487,-479,-479,-479,-479,220,-479,-482,-479,-482,-482,-482,-415', +'-479,554,569,568,565,502,-482,-482,923,-482,-482,-482,-482,-482,-490', +'503,672,555,669,668,667,-490,670,786,672,544,669,668,667,115,670,93', +'94,478,114,516,-482,-482,-482,-482,-482,-482,-482,-482,-482,-482,-482', +'-482,-482,-482,567,-415,-482,-482,-482,510,-482,-482,-415,478,-482,93', +'94,-482,-482,567,-482,-415,-482,400,-482,567,-482,-482,-581,-482,-482', +'-482,-482,-482,-289,-482,-95,-482,274,-488,-415,-289,-289,-289,115,-104', +'-488,-289,-289,114,-289,-482,890,115,-482,-482,-482,-482,114,-482,987', +'-482,-581,95,96,-290,-482,843,569,568,-289,-289,-290,-289,-289,-289', +'-289,-289,727,798,-581,-290,214,569,568,583,567,-581,595,569,568,-489', +'-577,95,96,846,-581,848,-489,729,-289,-289,-289,-289,-289,-289,-289', +'-289,-289,-289,-289,-289,-289,-289,-581,-581,-289,-289,-289,596,600', +'-581,220,850,-289,972,-577,-289,567,-96,-581,567,-289,852,-289,-91,-289', +'-289,-105,-289,-289,-289,-289,-289,-100,-289,-581,-289,220,-581,569', +'568,578,-581,-581,-581,81,854,-581,-581,-581,-289,-581,-482,-289,-289', +'-93,-94,82,-289,-482,-581,-581,-581,-581,-102,-103,528,83,-575,530,855', +'-581,-581,518,-581,-581,-581,-581,-581,387,519,569,568,565,569,568,572', +'-479,528,443,858,530,220,672,-479,669,668,667,632,670,860,-581,-581', +'-581,-581,-581,-581,-581,-581,-581,-581,-581,-581,-581,-581,861,677', +'-581,-581,-581,-482,752,-581,216,217,-581,680,-482,-581,-581,807,-581', +'-575,-581,647,-581,-482,-581,-581,810,-581,-581,-581,-581,-581,-333', +'-581,-581,-581,262,737,528,-333,240,527,-575,263,736,-493,688,687,-333', +'-581,863,681,-581,-581,-581,-581,-485,-581,265,-581,818,786,-261,-485', +'-101,292,74,75,71,9,57,867,237,115,63,64,239,238,114,67,869,65,66,68', +'30,31,72,73,-262,-574,220,-90,-88,29,28,27,103,102,104,105,-99,-97,19', +'513,-494,688,687,605,8,45,294,10,107,106,108,97,56,99,98,100,731,101', +'109,110,730,93,94,42,43,41,240,244,249,250,251,246,248,256,257,252,253', +'-479,233,234,726,716,254,255,-479,40,888,-89,33,-574,220,58,59,-479', +'892,60,-98,35,237,517,243,44,239,238,677,235,236,247,245,241,20,242', +'-574,894,680,91,81,84,85,212,86,88,87,89,240,220,213,698,82,90,319,258', +'544,-238,220,211,62,900,83,95,96,292,74,75,71,9,57,688,687,554,63,64', +'681,691,903,67,923,65,66,68,30,31,72,73,220,555,907,-264,318,29,28,27', +'103,102,104,105,397,531,19,655,653,399,398,590,8,45,294,10,107,106,108', +'97,56,99,98,100,652,101,109,110,917,93,94,42,43,41,240,244,249,250,251', +'246,248,256,257,252,253,-289,233,234,-279,532,254,255,-289,40,924,-279', +'33,-578,925,58,59,-289,989,60,-279,35,237,259,243,44,239,238,491,235', +'236,247,245,241,20,242,936,798,938,91,81,84,85,508,86,88,87,89,940,942', +'509,944,82,90,944,258,220,647,950,507,62,521,83,95,96,5,74,75,71,9,57', +'953,954,441,63,64,959,716,798,67,442,65,66,68,30,31,72,73,962,443,964', +'966,968,29,28,27,103,102,104,105,721,722,19,968,723,109,110,605,8,45', +'7,10,107,106,108,97,56,99,98,100,220,101,109,110,544,93,94,42,43,41', +'240,244,249,250,251,246,248,256,257,252,253,-289,233,234,-492,636,254', +'255,-289,40,-83,-492,33,-578,979,58,59,-289,220,60,-492,35,237,215,243', +'44,239,238,389,235,236,247,245,241,20,242,548,220,220,91,81,84,85,-491', +'86,88,87,89,240,240,-491,989,82,90,240,258,210,209,240,-491,62,549,83', +'95,96,292,74,75,71,9,57,607,-578,554,63,64,-577,652,208,67,553,65,66', +'68,30,31,72,73,604,555,265,594,1004,29,28,27,103,102,104,105,1005,920', +'19,669,668,667,1006,670,8,45,294,10,107,106,108,97,56,99,98,100,944', +'101,109,110,944,93,94,42,43,41,240,244,249,250,251,246,248,256,257,252', +'253,-290,233,234,-290,944,254,255,-290,40,1011,-290,296,593,989,58,59', +'-290,220,60,-290,35,237,1014,243,44,239,238,1015,235,236,247,245,241', +'20,242,1016,968,968,91,81,84,85,-491,86,88,87,89,968,220,-491,123,82', +'90,589,258,-261,587,989,-491,62,584,83,95,96,292,74,75,71,9,57,111,944', +'-492,63,64,240,487,786,67,-492,65,66,68,30,31,72,73,220,-492,647,795', +'798,29,28,27,103,102,104,105,799,920,19,669,668,667,801,670,8,45,294', +'10,107,106,108,97,56,99,98,100,803,101,109,110,805,93,94,42,43,41,240', +'244,249,250,251,246,248,256,257,252,253,-289,233,234,977,265,254,255', +'-289,40,478,978,33,-578,813,58,59,-289,814,60,976,35,237,815,243,44', +'239,238,786,235,236,247,245,241,20,242,822,265,220,91,81,84,85,-279', +'86,88,87,89,968,489,-279,220,82,90,647,258,219,491,779,-279,62,220,83', +'95,96,292,74,75,71,9,57,,,546,63,64,,,,67,547,65,66,68,30,31,72,73,', +'545,,,,29,28,27,103,102,104,105,,,19,118,119,120,121,122,8,45,294,10', +'107,106,108,97,56,99,98,100,,101,109,110,,93,94,42,43,41,240,244,249', +'250,251,246,248,256,257,252,253,,233,234,,,254,255,,40,,,33,,,58,59', +',,60,,35,237,,243,44,239,238,,235,236,247,245,241,20,242,,,,91,81,84', +'85,,86,88,87,89,,,,,82,90,,258,,,,,62,,83,95,96,292,74,75,71,9,57,,', +',63,64,,,,67,,65,66,68,30,31,72,73,118,119,120,121,122,29,28,27,103', +'102,104,105,,,19,118,119,120,121,122,8,45,294,10,107,106,108,97,56,99', +'98,100,,101,109,110,,93,94,42,43,41,240,244,249,250,251,246,248,256', +'257,252,253,,233,234,,,254,255,,40,,,33,,,58,59,,,60,,35,237,,243,44', +'239,238,,235,236,247,245,241,20,242,,,,91,81,84,85,,86,88,87,89,,,,', +'82,90,,258,,,,,62,,83,95,96,292,74,75,71,9,57,,,,63,64,,,,67,,65,66', +'68,30,31,72,73,,,,,,29,28,27,103,102,104,105,,,19,,,,,,8,45,294,10,107', +'106,108,97,56,99,98,100,,101,109,110,,93,94,42,43,41,240,244,249,250', +'251,246,248,256,257,252,253,,233,234,,,254,255,,40,,,33,,,58,59,,,60', +',35,237,,243,44,239,238,,235,236,247,245,241,20,242,,,,91,81,84,85,', +'86,88,87,89,,,,,82,90,,258,,,,,62,,83,95,96,292,74,75,71,9,57,,,,63', +'64,,,,67,,65,66,68,30,31,72,73,,,,,,29,28,27,103,102,104,105,,,19,,', +',,,8,45,294,10,107,106,108,97,56,99,98,100,,101,109,110,,93,94,42,43', +'41,240,244,249,250,251,246,248,256,257,252,253,,233,234,,,254,255,,40', +',,296,,,58,59,,,60,,35,237,,243,44,239,238,,235,236,247,245,241,20,242', +',,,91,81,84,85,,86,88,87,89,,,,,82,90,,258,,,,,62,,83,95,96,292,74,75', +'71,9,57,,,,63,64,,,,67,,65,66,68,30,31,72,73,,,,,,29,28,27,103,102,104', +'105,,,19,,,,,,8,45,294,10,107,106,108,97,56,99,98,100,,101,109,110,', +'93,94,42,43,41,240,244,249,250,251,246,248,256,257,252,253,,233,234', +',,254,255,,40,,,296,,,58,59,,,60,,35,237,,243,44,239,238,,235,236,247', +'245,241,20,242,,,,91,81,84,85,,86,88,87,89,,,,,82,90,,258,,,,,62,,83', +'95,96,292,74,75,71,9,57,,,,63,64,,,,67,,65,66,68,30,31,72,73,,,,,,29', +'28,27,103,102,104,105,,,19,,,,,,8,45,294,10,107,106,108,97,56,99,98', +'100,,101,109,110,,93,94,42,43,41,240,244,249,250,251,246,248,256,257', +'252,253,,233,234,,,254,255,,40,,,33,,,58,59,,,60,,35,237,,243,44,239', +'238,,235,236,247,245,241,20,242,,,,91,81,84,85,,86,88,87,89,,,,,82,90', +'220,258,,,,,62,,83,95,96,292,74,75,71,9,57,,,,63,64,,,,67,,65,66,68', +'30,31,72,73,,,,,,29,28,27,103,102,104,105,,,19,,,,,,8,45,294,10,107', +'106,108,97,56,99,98,100,,101,109,110,,93,94,42,43,41,240,244,249,250', +'251,246,248,256,257,252,253,,233,234,,,254,255,,40,,,33,,,58,59,,,60', +',35,237,,243,44,239,238,,235,236,247,245,241,20,242,,,,91,81,84,85,', +'86,88,87,89,,,,,82,90,,258,,,,,62,,83,95,96,292,74,75,71,9,57,,,,63', +'64,,,,67,,65,66,68,30,31,72,73,,,,,,29,28,27,103,102,104,105,,,19,,', +',,,8,45,294,10,107,106,108,97,56,99,98,100,,101,109,110,,93,94,42,43', +'41,240,244,249,250,251,246,248,256,257,252,253,,233,234,,,254,255,,40', +',,33,,,58,59,,,60,,35,237,,243,44,239,238,,235,236,247,245,241,20,242', +',,,91,81,84,85,,86,88,87,89,,,,,82,90,,258,,,,,62,,83,95,96,292,74,75', +'71,9,57,,,,63,64,,,,67,,65,66,68,30,31,72,73,,,,,,29,28,27,103,102,104', +'105,,,19,,,,,,8,45,294,10,107,106,108,97,56,99,98,100,,101,109,110,', +'93,94,42,43,41,240,244,249,250,251,246,248,256,257,252,253,,233,234', +',,254,255,,40,,,33,,,58,59,,,60,,35,237,,243,44,239,238,,235,236,247', +'245,241,20,242,,,,91,81,84,85,,86,88,87,89,,,,,82,90,,258,,,,,62,,83', +'95,96,292,74,75,71,9,57,,,,63,64,,,,67,,65,66,68,30,31,72,73,,,,,,29', +'28,27,103,102,104,105,,,19,,,,,,8,45,294,10,107,106,108,97,56,99,98', +'100,,101,109,110,,93,94,42,43,41,240,244,249,250,251,246,248,256,257', +'252,253,,233,234,,,254,255,,40,,,33,,,58,59,,,60,,35,237,,243,44,239', +'238,,235,236,247,245,241,20,242,,,,91,81,84,85,,86,88,87,89,,,,,82,90', +',258,,,,,62,,83,95,96,292,74,75,71,9,57,,,,63,64,,,,67,,65,66,68,30', +'31,72,73,,,,,,29,28,27,103,102,104,105,,,19,,,,,,8,45,294,10,107,106', +'108,97,56,99,98,100,,101,109,110,,93,94,42,43,41,240,244,249,250,251', +'246,248,256,257,252,253,,233,234,,,254,255,,40,,,33,,,58,59,,,60,,35', +'237,,243,44,239,238,,235,236,247,245,241,20,242,,,,91,81,84,85,,86,88', +'87,89,,,,,82,90,,258,,,,,62,,83,95,96,5,74,75,71,9,57,,,,63,64,,,,67', +',65,66,68,30,31,72,73,,,,,,29,28,27,103,102,104,105,,,19,,,,,,8,45,7', +'10,107,106,108,97,56,99,98,100,,101,109,110,,93,94,42,43,41,240,244', +'249,250,251,246,248,256,257,252,253,,233,234,,,254,255,,40,,,33,,,58', +'59,,,60,,35,237,,243,44,239,238,,235,236,247,245,241,20,242,,,,91,81', +'84,85,,86,88,87,89,,,,,82,90,,258,,,,,62,,83,95,96,292,74,75,71,9,57', +',,,63,64,,,,67,,65,66,68,30,31,72,73,,,,,,29,28,27,103,102,104,105,', +'672,19,669,668,667,,670,8,45,294,10,107,106,108,97,56,99,98,100,,101', +'109,110,,93,94,42,43,41,672,,669,668,667,,670,,807,,672,,669,668,667', +',670,949,,40,,,33,,,58,59,,240,60,,35,,,,44,,807,,,,,,,20,,810,807,', +'91,81,84,85,,86,88,87,89,,,237,,82,90,239,238,,235,236,,62,,83,95,96', +'292,74,75,71,9,57,,,,63,64,,,,67,,65,66,68,30,31,72,73,,,,,,29,28,27', +'103,102,104,105,,,19,,,240,,,8,45,294,10,107,106,108,97,56,99,98,100', +',101,109,110,,93,94,42,43,41,240,-600,-600,-600,-600,246,248,237,,-600', +'-600,239,238,,235,236,254,255,,40,,,33,,,58,59,,,60,,35,237,,243,44', +'239,238,,235,236,247,245,241,20,242,,,,91,81,84,85,,86,88,87,89,,,,', +'82,90,,672,,669,668,667,62,670,83,95,96,292,74,75,71,9,57,,,,63,64,', +',,67,,65,66,68,30,31,72,73,,,,,807,29,28,27,103,102,104,105,,672,19', +'669,668,667,,670,8,45,294,10,107,106,108,97,56,99,98,100,,101,109,110', +',93,94,42,43,41,240,-600,-600,-600,-600,246,248,,807,-600,-600,,,,,', +'254,255,,40,,,33,,,58,59,,,60,,35,237,,243,44,239,238,,235,236,247,245', +'241,20,242,,,,91,81,84,85,,86,88,87,89,,,,,82,90,,672,,669,668,667,62', +'670,83,95,96,292,74,75,71,9,57,,,,63,64,,,,67,,65,66,68,30,31,72,73', +',,,,807,29,28,27,103,102,104,105,,,19,,,,,,8,45,294,10,107,106,108,97', +'56,99,98,100,,101,109,110,,93,94,42,43,41,240,244,249,250,251,246,248', +'256,257,252,253,,-600,-600,,,254,255,,40,,,33,,,58,59,,,60,,35,237,', +'243,44,239,238,,235,236,247,245,241,20,242,,,,91,81,84,85,,86,88,87', +'89,,,,,82,90,,672,,669,668,667,62,670,83,95,96,292,74,75,71,9,57,,,', +'63,64,,,,67,,65,66,68,30,31,72,73,,,,,807,29,28,27,103,102,104,105,', +',19,,,,,,8,45,294,10,107,106,108,97,56,99,98,100,,101,109,110,,93,94', +'42,43,41,240,-600,-600,-600,-600,246,248,,,-600,-600,,,,,,254,255,,40', +',,33,,,58,59,,,60,,35,237,,243,44,239,238,,235,236,247,245,241,20,242', +',,,91,81,84,85,,86,88,87,89,,,,,82,90,,,,,,,62,,83,95,96,292,74,75,71', +'9,57,,,,63,64,,,,67,,65,66,68,30,31,72,73,,,,,,29,28,27,103,102,104', +'105,,,19,,,,,,8,45,294,10,107,106,108,97,56,99,98,100,,101,109,110,', +'93,94,42,43,41,240,244,249,250,251,246,248,256,,252,253,,,,,,254,255', +',40,,,33,,,58,59,,,60,,35,237,,243,44,239,238,,235,236,247,245,241,20', +'242,,,,91,81,84,85,,86,88,87,89,,,,,82,90,,,,,,,62,,83,95,96,292,74', +'75,71,9,57,,,,63,64,,,,67,,65,66,68,30,31,72,73,,,,,,29,28,27,103,102', +'104,105,,,19,,,,,,8,45,294,10,107,106,108,97,56,99,98,100,,101,109,110', +',93,94,42,43,41,240,244,249,250,251,246,248,256,257,252,253,,-600,-600', +',,254,255,,40,,,33,,,58,59,,,60,,35,237,,243,44,239,238,,235,236,247', +'245,241,20,242,,,,91,81,84,85,,86,88,87,89,,,,,82,90,,,,,,,62,,83,95', +'96,292,74,75,71,9,57,,,,63,64,,,,67,,65,66,68,30,31,72,73,,,,,,29,28', +'27,103,102,104,105,,,19,,,,,,8,45,294,10,107,106,108,97,56,99,98,100', +',101,109,110,,93,94,42,43,41,240,,,,,,,,,,,,,,,,254,255,,40,,,33,,,58', +'59,,,60,,35,237,,243,44,239,238,,235,236,,,241,20,242,,,,91,81,84,85', +',86,88,87,89,,,,,82,90,,,,,,,62,,83,95,96,292,74,75,71,9,57,,,,63,64', +',,,67,,65,66,68,30,31,72,73,,,,,,29,28,27,103,102,104,105,,,19,,,,,', +'8,45,294,10,107,106,108,97,56,99,98,100,,101,109,110,,93,94,42,43,41', +'240,-600,-600,-600,-600,246,248,,,-600,-600,,,,,,254,255,,40,,,33,,', +'58,59,,,60,,35,237,,243,44,239,238,,235,236,247,245,241,20,242,,,,91', +'81,84,85,,86,88,87,89,,,,,82,90,,,,,,,62,,83,95,96,5,74,75,71,9,57,', +',,63,64,,,,67,,65,66,68,30,31,72,73,,,,,,29,28,27,103,102,104,105,,', +'19,,,,,,8,45,7,10,107,106,108,97,56,99,98,100,,101,109,110,,93,94,42', +'43,41,240,244,249,250,251,246,248,,,252,253,,,,,,254,255,,40,,,33,,', +'58,59,,,60,,35,237,,243,44,239,238,,235,236,247,245,241,20,242,,,,91', +'81,84,85,,86,88,87,89,,,,,82,90,,,,,,,62,,83,95,96,292,74,75,71,9,57', +',,,63,64,,,,67,,65,66,68,30,31,72,73,,,,,,29,28,27,103,102,104,105,', +',19,,,,,,8,45,294,10,107,106,108,97,56,99,98,100,,101,109,110,,93,94', +'42,43,41,240,,,,,,,,,,,,,,,,254,255,,40,,,33,,,58,59,,,60,,35,237,,243', +'44,239,238,,235,236,,,241,20,242,,,,91,81,84,85,,86,88,87,89,,,,,82', +'90,,,,,,,62,,83,95,96,292,74,75,71,9,57,,,,63,64,,,,67,,65,66,68,30', +'31,72,73,,,,,,29,28,27,103,102,104,105,,,19,,,,,,8,45,294,10,107,106', +'108,97,56,99,98,100,,101,109,110,,93,94,42,43,41,240,,,,,,,,,,,,,,,', +'254,255,,40,,,33,,,58,59,,,60,,35,237,,243,44,239,238,,235,236,,,241', +'20,242,,,,91,81,84,85,,86,88,87,89,,,,,82,90,,,,,,,62,,83,95,96,292', +'74,75,71,9,57,,,,63,64,,,,67,,65,66,68,30,31,72,73,,,,,,29,28,27,103', +'102,104,105,,,19,,,,,,8,45,294,10,107,106,108,97,56,99,98,100,,101,109', +'110,,93,94,42,43,41,240,,,,,,,,,,,,,,,,254,255,,40,,,33,,,58,59,,,60', +',35,237,,243,44,239,238,,235,236,,,241,20,242,,,,91,81,84,85,,86,88', +'87,89,,,,,82,90,,,,,,,62,,83,95,96,292,74,75,71,9,57,,,,63,64,,,,67', +',65,66,68,30,31,72,73,,,,,,29,28,27,103,102,104,105,,,19,,,,,,8,45,294', +'10,107,106,108,97,56,99,98,100,,101,109,110,,93,94,42,43,41,240,-600', +'-600,-600,-600,246,248,,,-600,-600,,,,,,254,255,,40,,,33,,,58,59,,,60', +',35,237,,243,44,239,238,,235,236,247,245,241,20,242,,,,91,81,84,85,', +'86,88,87,89,,,,,82,90,,,,74,75,71,62,57,83,95,96,63,64,,,,67,,65,66', +'68,30,31,72,73,,,,,,29,28,27,103,102,104,105,,,232,,,,,,,45,,,107,106', +'108,97,56,99,98,100,,101,109,110,,93,94,42,43,41,240,-600,-600,-600', +'-600,246,248,,,-600,-600,,,,,,254,255,,225,,,231,,,58,59,,,60,,,237', +',243,44,239,238,,235,236,247,245,241,230,242,,,,91,81,84,85,,86,88,87', +'89,,,,,82,90,,,,74,75,71,62,57,83,95,96,63,64,,,,67,,65,66,68,30,31', +'72,73,,,,,,29,28,27,103,102,104,105,,,232,,,,,,,45,,,107,106,108,97', +'56,99,98,100,286,101,109,110,,93,94,42,43,41,240,,,,,,,,,,,,,,,,254', +'255,,225,,,231,,,58,59,,,60,,283,237,281,243,44,239,238,287,235,236', +',,,230,,,,,91,284,84,85,,86,88,87,89,,,,,82,90,,,,74,75,71,62,57,83', +'95,96,63,64,,,,67,,65,66,68,311,312,72,73,,,,,,307,308,314,103,102,104', +'105,,,232,,,,,,,45,,,107,106,108,97,56,99,98,100,,101,109,110,,93,94', +'42,43,41,240,,,,,,,,,,,,,,,,254,255,,225,,,231,,,58,59,,,60,,,237,,', +'44,239,238,,235,236,,,,230,,,,,91,81,84,85,,86,88,87,89,,,,,82,90,,', +',74,75,71,62,57,83,95,96,63,64,,,,67,,65,66,68,311,312,72,73,,,,,,307', +'308,314,103,102,104,105,,,232,,,,,,,45,,,107,106,108,97,56,99,98,100', +',101,109,110,,93,94,42,43,41,240,,,,,,,,,,,,,,,,254,255,,225,,,231,', +',58,59,,,60,,,237,,243,44,239,238,,235,236,,,,230,,,,,91,81,84,85,,86', +'88,87,89,,,,,82,90,,,,74,75,71,62,57,83,95,96,63,64,,,,67,,65,66,68', +'30,31,72,73,,,,,,29,28,27,103,102,104,105,,,232,,,,,,,45,,,107,106,108', +'97,56,99,98,100,,101,109,110,,93,94,42,43,41,,,,,,,,,,,,,,,,,,,,225', +',,231,,,58,59,,,60,,,,,,44,,,,,,,,,230,,,,,91,81,84,85,,86,88,87,89', +',,,,82,90,,,,74,75,71,62,57,83,95,96,63,64,,,,67,,65,66,68,30,31,72', +'73,,,,,,29,28,27,103,102,104,105,,,232,,,,,,,45,,,107,106,108,97,56', +'99,98,100,,101,109,110,,93,94,42,43,41,,,,,,,,,,,,,,,,,,,,225,,,231', +',,58,59,,,60,,405,,,,44,,,,,,,,,230,,,,,91,81,84,85,,86,88,87,89,,,', +',82,90,,,,74,75,71,62,57,83,95,96,63,64,,,,67,,65,66,68,30,31,72,73', +',,,,,29,28,27,103,102,104,105,,,19,,,,,,,45,,,107,106,108,97,56,99,98', +'100,,101,109,110,,93,94,42,43,41,,,,,,,,,,,,,,,,,,,,225,,,231,,,58,59', +',,60,,,,,,44,,,,,,,,,20,,,,,91,81,84,85,,86,88,87,89,,,,,82,90,,,,74', +'75,71,62,57,83,95,96,63,64,,,,67,,65,66,68,30,31,72,73,,,,,,29,28,27', +'103,102,104,105,,,19,,,,,,,45,,,107,106,108,97,56,99,98,100,,101,109', +'110,,93,94,42,43,41,,,,,,,,,,,,,,,,,,,,225,,,231,,,58,59,,,60,,,,,,44', +',,,,,,,,20,,,,,91,81,84,85,,86,88,87,89,,,,,82,90,,,,74,75,71,62,57', +'83,95,96,63,64,,,,67,,65,66,68,30,31,72,73,,,,,,29,28,27,103,102,104', +'105,,,19,,,,,,,45,,,107,106,108,97,56,99,98,100,,101,109,110,,93,94', +'42,43,41,,,,,,,,,,,,,,,,,,,,225,,,231,,,58,59,,,60,,,,,,44,,,,,,,,,20', +',,,,91,81,84,85,,86,88,87,89,,,,,82,90,,,,74,75,71,62,57,83,95,96,63', +'64,,,,67,,65,66,68,30,31,72,73,,,,,,29,28,27,103,102,104,105,,,19,,', +',,,,45,,,107,106,108,97,56,99,98,100,,101,109,110,,93,94,42,43,41,,', +',,,,,,,,,,,,,,,,,225,,,231,,,58,59,,,60,,,,,,44,,,,,,,,,20,,,,,91,81', +'84,85,,86,88,87,89,,,,,82,90,220,,,74,75,71,62,57,83,95,96,63,64,,,', +'67,,65,66,68,311,312,72,73,,,,,,307,308,314,103,102,104,105,,,232,,', +',,,,45,,,107,106,108,97,56,99,98,100,,101,109,110,,93,94,42,43,41,,', +',,,,,,,,,,,,,,,,,225,,,231,,,58,59,,,60,,,,,,44,,,,,,,,,230,,,,,91,81', +'84,85,,86,88,87,89,,,,,82,90,,,,74,75,71,62,57,83,95,96,63,64,,,,67', +',65,66,68,30,31,72,73,,,,,,29,28,27,103,102,104,105,,,232,,,,,,,45,', +',107,106,108,97,56,99,98,100,,101,109,110,,93,94,42,43,41,,,,,,,,,,', +',,,,,,,,,225,,,231,,,58,59,,,60,,,,,,44,,,,,,,,,230,,,,,91,81,84,85', +',86,88,87,89,,,,,82,90,,,,74,75,71,62,57,83,95,96,63,64,,,,67,,65,66', +'68,311,312,72,73,,,,,,307,308,314,103,102,104,105,,,232,,,,,,,45,,,107', +'106,108,97,56,99,98,100,,101,109,110,,93,94,42,43,41,,,,,,,,,,,,,,,', +',,,,225,,,231,,,58,59,,,60,,,,,,44,,,,,,,,,230,,,,,91,81,84,85,,86,88', +'87,89,,,,,82,90,,,,74,75,71,62,57,83,95,96,63,64,,,,67,,65,66,68,30', +'31,72,73,,,,,,29,28,27,103,102,104,105,,,19,,,,,,,45,,,107,106,108,97', +'56,99,98,100,,101,109,110,,93,94,42,43,41,,,,,,,,,,,,,,,,,,,,225,,,231', +',,58,59,,,60,,,,,,44,,,,,,,,,20,,,,,91,81,84,85,,86,88,87,89,,,,,82', +'90,,,,74,75,71,62,57,83,95,96,63,64,,,,67,,65,66,68,311,312,72,73,,', +',,,307,308,314,103,102,104,105,,,232,,,,,,,45,,,107,106,108,97,56,99', +'98,100,,101,109,110,,93,94,42,43,41,,,,,,,,,,,,,,,,,,,,225,,,231,,,58', +'59,,,60,,,,,,44,,,,,,,,,230,,,,,91,81,84,85,,86,88,87,89,,,,,82,90,', +',,74,75,71,62,57,83,95,96,63,64,,,,67,,65,66,68,30,31,72,73,,,,,,29', +'28,27,103,102,104,105,,,19,,,,,,,45,,,107,106,108,97,56,99,98,100,,101', +'109,110,,93,94,42,43,41,,,,,,,,,,,,,,,,,,,,225,,,231,,,58,59,,,60,,', +',,,44,,,,,,,,,20,,,,,91,81,84,85,,86,88,87,89,,,,,82,90,,,,74,75,71', +'62,57,83,95,96,63,64,,,,67,,65,66,68,311,312,72,73,,,,,,307,308,314', +'103,102,104,105,,,232,,,,,,,45,,,107,106,108,97,56,99,98,100,,101,109', +'110,,93,94,42,43,41,,,,,,,,,,,,,,,,,,,,225,,,231,,,58,59,,,60,,,,,,44', +',,,,,,,,230,,,,,91,81,84,85,,86,88,87,89,,,,,82,90,,,,74,75,71,62,57', +'83,95,96,63,64,,,,67,,65,66,68,311,312,72,73,,,,,,307,308,314,103,102', +'104,105,,,232,,,,,,,45,,,107,106,108,97,56,99,98,100,,101,109,110,,93', +'94,42,43,41,,,,,,,,,,,,,,,,,,,,225,,,231,,,58,59,,,60,,,,,,44,,,,,,', +',,230,,,,,91,81,84,85,,86,88,87,89,,,,,82,90,,,,74,75,71,62,57,83,95', +'96,63,64,,,,67,,65,66,68,311,312,72,73,,,,,,307,308,314,103,102,104', +'105,,,232,,,,,,,45,,,107,106,108,97,56,99,98,100,,101,109,110,,93,94', +'42,43,41,,,,,,,,,,,,,,,,,,,,225,,,231,,,58,59,,,60,,,,,,44,,,,,,,,,230', +',,,,91,81,84,85,,86,88,87,89,,,,,82,90,,,,74,75,71,62,57,83,95,96,63', +'64,,,,67,,65,66,68,311,312,72,73,,,,,,307,308,314,103,102,104,105,,', +'232,,,,,,,45,,,107,106,108,97,56,99,98,100,,101,109,110,,93,94,42,43', +'41,,,,,,,,,,,,,,,,,,,,225,,,231,,,58,59,,,60,,,,,,44,,,,,,,,,230,,,', +',91,81,84,85,,86,88,87,89,,,,,82,90,,,,74,75,71,62,57,83,95,96,63,64', +',,,67,,65,66,68,311,312,72,73,,,,,,307,308,314,103,102,104,105,,,232', +',,,,,,45,,,107,106,108,97,56,99,98,100,,101,109,110,,93,94,42,43,41', +',,,,,,,,,,,,,,,,,,,225,,,231,,,58,59,,,60,,,,,,44,,,,,,,,,230,,,,,91', +'81,84,85,,86,88,87,89,,,,,82,90,,,,74,75,71,62,57,83,95,96,63,64,,,', +'67,,65,66,68,311,312,72,73,,,,,,307,308,314,103,102,104,105,,,232,,', +',,,,45,,,107,106,108,97,56,99,98,100,,101,109,110,,93,94,42,43,41,,', +',,,,,,,,,,,,,,,,,225,,,231,,,58,59,,,60,,,,,,44,,,,,,,,,230,,,,,91,81', +'84,85,,86,88,87,89,,,,,82,90,,,,74,75,71,62,57,83,95,96,63,64,,,,67', +',65,66,68,311,312,72,73,,,,,,307,308,314,103,102,104,105,,,232,,,,,', +',45,,,107,106,108,97,56,99,98,100,,101,109,110,,93,94,42,43,41,,,,,', +',,,,,,,,,,,,,,225,,,231,,,58,59,,,60,,,,,,44,,,,,,,,,230,,,,,91,81,84', +'85,,86,88,87,89,,,,,82,90,,,,74,75,71,62,57,83,95,96,63,64,,,,67,,65', +'66,68,311,312,72,73,,,,,,307,308,314,103,102,104,105,,,232,,,,,,,45', +',,107,106,108,97,56,99,98,100,,101,109,110,,93,94,42,43,41,,,,,,,,,', +',,,,,,,,,,225,,,231,,,58,59,,,60,,,,,,44,,,,,,,,,230,,,,,91,81,84,85', +',86,88,87,89,,,,,82,90,,,,74,75,71,62,57,83,95,96,63,64,,,,67,,65,66', +'68,311,312,72,73,,,,,,307,308,314,103,102,104,105,,,232,,,,,,,45,,,107', +'106,108,97,56,99,98,100,,101,109,110,,93,94,42,43,41,,,,,,,,,,,,,,,', +',,,,225,,,231,,,58,59,,,60,,,,,,44,,,,,,,,,230,,,,,91,81,84,85,,86,88', +'87,89,,,,,82,90,,,,74,75,71,62,57,83,95,96,63,64,,,,67,,65,66,68,311', +'312,72,73,,,,,,307,308,314,103,102,104,105,,,232,,,,,,,45,,,107,106', +'108,97,56,99,98,100,,101,109,110,,93,94,42,43,41,,,,,,,,,,,,,,,,,,,', +'225,,,231,,,58,59,,,60,,,,,,44,,,,,,,,,230,,,,,91,81,84,85,,86,88,87', +'89,,,,,82,90,,,,74,75,71,62,57,83,95,96,63,64,,,,67,,65,66,68,311,312', +'72,73,,,,,,307,308,314,103,102,104,105,,,232,,,,,,,45,,,107,106,108', +'97,56,99,98,100,,101,109,110,,93,94,42,43,41,,,,,,,,,,,,,,,,,,,,225', +',,231,,,58,59,,,60,,,,,,44,,,,,,,,,230,,,,,91,81,84,85,,86,88,87,89', +',,,,82,90,,,,74,75,71,62,57,83,95,96,63,64,,,,67,,65,66,68,311,312,72', +'73,,,,,,307,308,314,103,102,104,105,,,232,,,,,,,45,,,107,106,108,97', +'56,99,98,100,,101,109,110,,93,94,42,43,41,,,,,,,,,,,,,,,,,,,,225,,,231', +',,58,59,,,60,,,,,,44,,,,,,,,,230,,,,,91,81,84,85,,86,88,87,89,,,,,82', +'90,,,,74,75,71,62,57,83,95,96,63,64,,,,67,,65,66,68,311,312,72,73,,', +',,,307,308,314,103,102,104,105,,,232,,,,,,,45,,,107,106,108,97,56,99', +'98,100,,101,109,110,,93,94,42,43,41,,,,,,,,,,,,,,,,,,,,225,,,231,,,58', +'59,,,60,,,,,,44,,,,,,,,,230,,,,,91,81,84,85,,86,88,87,89,,,,,82,90,', +',,74,75,71,62,57,83,95,96,63,64,,,,67,,65,66,68,311,312,72,73,,,,,,307', +'308,314,103,102,104,105,,,232,,,,,,,45,,,107,106,108,97,56,99,98,100', +',101,109,110,,93,94,42,43,41,,,,,,,,,,,,,,,,,,,,225,,,231,,,58,59,,', +'60,,,,,,44,,,,,,,,,230,,,,,91,81,84,85,,86,88,87,89,,,,,82,90,,,,74', +'75,71,62,57,83,95,96,63,64,,,,67,,65,66,68,311,312,72,73,,,,,,307,308', +'314,103,102,104,105,,,232,,,,,,,45,,,107,106,108,97,56,99,98,100,,101', +'109,110,,93,94,42,43,41,,,,,,,,,,,,,,,,,,,,225,,,231,,,58,59,,,60,,', +',,,44,,,,,,,,,230,,,,,91,81,84,85,,86,88,87,89,,,,,82,90,,,,74,75,71', +'62,57,83,95,96,63,64,,,,67,,65,66,68,311,312,72,73,,,,,,307,308,314', +'103,102,104,105,,,232,,,,,,,45,,,107,106,108,97,56,99,98,100,,101,109', +'110,,93,94,42,43,41,,,,,,,,,,,,,,,,,,,,225,,,231,,,58,59,,,60,,,,,,44', +',,,,,,,,230,,,,,91,81,84,85,,86,88,87,89,,,,,82,90,,,,74,75,71,62,57', +'83,95,96,63,64,,,,67,,65,66,68,311,312,72,73,,,,,,307,308,314,103,102', +'104,105,,,232,,,,,,,45,,,107,106,108,97,56,99,98,100,,101,109,110,,93', +'94,42,43,41,,,,,,,,,,,,,,,,,,,,225,,,231,,,58,59,,,60,,,,,,44,,,,,,', +',,230,,,,,91,81,84,85,,86,88,87,89,,,,,82,90,,,,74,75,71,62,57,83,95', +'96,63,64,,,,67,,65,66,68,311,312,72,73,,,,,,307,308,314,103,102,104', +'105,,,232,,,,,,,45,,,107,106,108,97,56,99,98,100,,101,109,110,,93,94', +'42,43,41,,,,,,,,,,,,,,,,,,,,225,,,231,,,58,59,,,60,,,,,,44,,,,,,,,,230', +',,,,91,81,84,85,,86,88,87,89,,,,,82,90,,,,74,75,71,62,57,83,95,96,63', +'64,,,,67,,65,66,68,311,312,72,73,,,,,,307,308,314,103,102,104,105,,', +'232,,,,,,,45,,,107,106,108,97,56,99,98,100,,101,109,110,,93,94,42,43', +'41,,,,,,,,,,,,,,,,,,,,225,,,231,,,58,59,,,60,,,,,,44,,,,,,,,,230,,,', +',91,81,84,85,,86,88,87,89,,,,,82,90,,,,74,75,71,62,57,83,95,96,63,64', +',,,67,,65,66,68,311,312,72,73,,,,,,307,308,314,103,102,104,105,,,232', +',,,,,,45,,,107,106,108,97,56,99,98,100,,101,109,110,,93,94,42,43,41', +',,,,,,,,,,,,,,,,,,,225,,,231,,,58,59,,,60,,,,,,44,,,,,,,,,230,,,,,91', +'81,84,85,,86,88,87,89,,,,,82,90,,,,74,75,71,62,57,83,95,96,63,64,,,', +'67,,65,66,68,311,312,72,73,,,,,,307,308,314,103,102,104,105,,,232,,', +',,,,45,,,107,106,108,97,56,99,98,100,,101,109,110,,93,94,42,43,41,,', +',,,,,,,,,,,,,,,,,225,,,231,,,58,59,,,60,,,,,,44,,,,,,,,,230,,,,,91,81', +'84,85,,86,88,87,89,,,,,82,90,,,,74,75,71,62,57,83,95,96,63,64,,,,67', +',65,66,68,311,312,72,73,,,,,,307,308,314,103,102,104,105,,,232,,,,,', +',45,,,107,106,108,97,56,99,98,100,,101,109,110,,93,94,42,43,41,,,,,', +',,,,,,,,,,,,,,225,,,231,,,58,59,,,60,,,,,,44,,,,,,,,,230,,,,,91,81,84', +'85,,86,88,87,89,,,,,82,90,,,,74,75,71,62,57,83,95,96,63,64,,,,67,,65', +'66,68,311,312,72,73,,,,,,307,308,314,103,102,104,105,,,232,,,,,,,45', +',,107,106,108,97,56,99,98,100,,101,109,110,,93,94,42,43,41,,,,,,,,,', +',,,,,,,,,,225,,,231,,,58,59,,,60,,,,,,44,,,,,,,,,230,,,,,91,81,84,85', +',86,88,87,89,,,,,82,90,,,,74,75,71,62,57,83,95,96,63,64,,,,67,,65,66', +'68,311,312,72,73,,,,,,307,308,314,103,102,104,105,,,232,,,,,,,45,,,107', +'106,108,97,56,99,98,100,,101,109,110,,93,94,42,43,41,,,,,,,,,,,,,,,', +',,,,225,,,231,,,58,59,,,60,,,,,,44,,,,,,,,,230,,,,,91,81,84,85,,86,88', +'87,89,,,,,82,90,,,,74,75,71,62,57,83,95,96,63,64,,,,67,,65,66,68,311', +'312,72,73,,,,,,307,308,314,103,102,104,105,,,232,,,,,,,45,,,107,106', +'108,97,56,99,98,100,,101,109,110,,93,94,42,43,41,,,,,,,,,,,,,,,,,,,', +'225,,,231,,,58,59,,,60,,,,,,44,,,,,,,,,230,,,,,91,81,84,85,,86,88,87', +'89,,,,,82,90,,,,74,75,71,62,57,83,95,96,63,64,,,,67,,65,66,68,311,312', +'72,73,,,,,,307,308,314,103,102,104,105,,,232,,,,,,,45,,,107,106,108', +'97,56,99,98,100,,101,109,110,,93,94,42,43,41,,,,,,,,,,,,,,,,,,,,225', +',,231,,,58,59,,,60,,,,,,44,,,,,,,,,230,,,,,91,81,84,85,,86,88,87,89', +',,,,82,90,,,,74,75,71,62,57,83,95,96,63,64,,,,67,,65,66,68,311,312,72', +'73,,,,,,307,308,314,103,102,104,105,,,232,,,,,,,45,,,107,106,108,97', +'56,99,98,100,,101,109,110,,93,94,42,43,41,,,,,,,,,,,,,,,,,,,,225,,,231', +',,58,59,,,60,,,,,,44,,,,,,,,,230,,,,,91,81,84,85,,86,88,87,89,,,,,82', +'90,,,,74,75,71,62,57,83,95,96,63,64,,,,67,,65,66,68,30,31,72,73,,,,', +',29,28,27,103,102,104,105,,,232,,,,,,,45,,,107,106,108,97,56,99,98,100', +'286,101,109,110,,93,94,42,43,41,,,,,,,,,,,,,,,,,,,,225,,,231,,,58,59', +',,60,,283,,281,,44,,,287,,,,,,230,,,,,91,284,84,85,,86,88,87,89,,,,', +'82,90,,,,74,75,71,62,57,83,95,96,63,64,,,,67,,65,66,68,30,31,72,73,', +',,,,29,28,27,103,102,104,105,,,232,,,,,,,45,,,107,106,108,97,56,99,98', +'100,286,101,109,110,,93,94,42,43,41,,,,,,,,,,,,,,,,,,,,225,,,231,,,58', +'59,,,60,,283,,281,,44,,,287,,,,,,230,,,,,91,284,84,85,,86,88,87,89,', +',,,82,90,,,,74,75,71,62,57,83,95,96,63,64,,,,67,,65,66,68,30,31,72,73', +',,,,,29,28,27,103,102,104,105,,,232,,,,,,,45,,,107,106,108,97,56,99', +'98,100,286,101,109,110,,93,94,42,43,41,,,,,,,,,,,,,,,,,,,,225,,,231', +',,58,59,,,60,,283,,281,,44,,,287,,,,,,230,,,,,91,284,84,85,,86,88,87', +'89,,,,,82,90,220,,,74,75,71,62,57,83,95,96,63,64,,,,67,,65,66,68,311', +'312,72,73,,,,,,307,308,314,103,102,104,105,,,232,,,,,,,45,,,107,106', +'108,97,56,99,98,100,,101,109,110,,93,94,42,43,41,,,,,,,,,,,,,,,,,,,', +'225,,,231,,,58,59,,,60,,405,,,,44,,,,,,,,,230,,,,,91,81,84,85,,86,88', +'87,89,,,,,82,90,,,,74,75,71,62,57,83,95,96,63,64,,,,67,,65,66,68,311', +'312,72,73,,,,,,307,308,314,103,102,104,105,,,232,,,,,,,309,,,107,106', +'108,97,56,99,98,100,,101,109,110,,93,94,,,315,,,,,,,,,,,,,,,,,,,,305', +',,301,,,58,59,,,60,,,,,,,,,,,,,,,,,,,,91,81,84,85,,86,88,87,89,,,,,82', +'90,,,,74,75,71,62,57,83,95,96,63,64,,,,67,,65,66,68,311,312,72,73,,', +',,,307,308,314,103,102,104,105,,,232,,,,,,,45,,,107,106,108,97,56,99', +'98,100,,101,109,110,,93,94,42,43,41,,,,,,,,,,,,,,,,,,,,225,,,231,,,58', +'59,,,60,,,,,,44,,,,,,,,,230,,,,,91,81,84,85,,86,88,87,89,,,,,82,90,', +',,74,75,71,62,57,83,95,96,63,64,,,,67,,65,66,68,311,312,72,73,,,,,,307', +'308,314,103,102,104,105,,,232,,,,,,,309,,,107,106,108,97,56,99,98,100', +',101,109,110,,93,94,,,315,,,,,,,,,,,,,,,,,,,,305,,,301,,,58,59,,,60', +',,,,,,,,,,,,,,,,,,,91,81,84,85,,86,88,87,89,,,,,82,90,,,,74,75,71,62', +'57,83,95,96,63,64,,,,67,,65,66,68,311,312,72,73,,,,,,307,308,314,103', +'102,104,105,,,232,,,,,,,45,,,107,106,108,97,56,99,98,100,,101,109,110', +',93,94,42,43,41,,,,,,,,,,,,,,,,,,,,225,,,231,,,58,59,,,60,,,,,,44,,', +',,,,,,230,,,,,91,81,84,85,,86,88,87,89,,,,,82,90,,,,74,75,71,62,57,83', +'95,96,63,64,,,,67,,65,66,68,311,312,72,73,,,,,,307,308,314,103,102,104', +'105,,,232,,,,,,,45,,,107,106,108,97,56,99,98,100,,101,109,110,,93,94', +'42,43,41,,,,,,,,,,,,,,,,,,,,225,,,231,,,58,59,,,60,,,,,,44,,,,,,,,,230', +',,,,91,81,84,85,,86,88,87,89,,,,,82,90,,,,74,75,71,62,57,83,95,96,63', +'64,,,,67,,65,66,68,311,312,72,73,,,,,,307,308,314,103,102,104,105,,', +'232,,,,,,,45,,,107,106,108,97,56,99,98,100,,101,109,110,,93,94,42,43', +'41,,,,,,,,,,,,,,,,,,,,225,,,231,,,58,59,,,60,,,,,,44,,,,,,,,,230,,,', +',91,81,84,85,,86,88,87,89,,,,,82,90,,,,74,75,71,62,57,83,95,96,63,64', +',,,67,,65,66,68,311,312,72,73,,,,,,307,308,314,103,102,104,105,,,232', +',,,,,,45,,,107,106,108,97,56,99,98,100,,101,109,110,,93,94,42,43,41', +',,,,,,,,,,,,,,,,,,,225,,,231,,,58,59,,,60,,,,,,44,,,,,,,,,230,,,,,91', +'81,84,85,,86,88,87,89,,,,,82,90,,,,,,,62,,83,95,96,74,75,71,9,57,,,', +'63,64,,,,67,,65,66,68,30,31,72,73,,,,,,29,28,27,103,102,104,105,,,19', +',,,,,8,45,,10,107,106,108,97,56,99,98,100,,101,109,110,,93,94,42,43', +'41,,,,,,,,,,,,,,,,,,,,40,,,33,,,58,59,,,60,,35,,,,44,,,,,,,,,20,,,,', +'91,81,84,85,,86,88,87,89,,,,,82,90,,,,74,75,71,62,57,83,95,96,63,64', +',,,67,,65,66,68,311,312,72,73,,,,,,307,308,314,103,102,104,105,,,232', +',,,,,,45,,,107,106,108,97,56,99,98,100,,101,109,110,,93,94,42,43,41', +',,,,,,,,,,,,,,,,,,,225,,,231,,,58,59,,,60,,,,,,44,,,,,,,,,230,,,,,91', +'81,84,85,,86,88,87,89,,,,,82,90,,,,74,75,71,62,57,83,95,96,63,64,,,', +'67,,65,66,68,30,31,72,73,,,,,,29,28,27,103,102,104,105,,,19,,,,,,,45', +',,107,106,108,97,56,99,98,100,,101,109,110,,93,94,42,43,41,,,,,,,,,', +',,,,,,,,,,225,,,231,,,58,59,,,60,,,,,,44,,,,,,,,,20,,,,,91,81,84,85', +',86,88,87,89,,,,,82,90,115,,,,,114,62,,83,95,96,74,75,71,9,57,,,,63', +'64,,,,67,,65,66,68,30,31,72,73,,,,,,29,28,27,103,102,104,105,,,19,,', +',,,8,45,7,10,107,106,108,97,56,99,98,100,,101,109,110,,93,94,42,43,41', +',,,,,,,,,,,,,,,,,,,40,,,33,,,58,59,,,60,,35,,,,44,,,,,,,,,20,,,,,91', +'81,84,85,,86,88,87,89,,,,,82,90,,,,74,75,71,62,57,83,95,96,63,64,,,', +'67,,65,66,68,30,31,72,73,,,,,,29,28,27,103,102,104,105,,,232,,,,,,,45', +',,107,106,108,97,56,99,98,100,286,101,109,110,,93,94,42,43,41,,,,,,', +',,,,,,,,,,,,,225,,,231,,,58,59,,,60,,283,,281,,44,,,287,,,,,,230,,,', +',91,284,84,85,,86,88,87,89,,,,,82,90,,,,74,75,71,62,57,83,95,96,63,64', +',,,67,,65,66,68,30,31,72,73,,,,,,29,28,27,103,102,104,105,,,232,,,,', +',,45,,,107,106,108,97,56,99,98,100,,101,109,110,,93,94,42,43,41,,,,', +',,,,,,,,,,,,,,,225,,,231,,,58,59,,,60,,,,,,44,,,,,,,,,230,,,,,91,81', +'84,85,,86,88,87,89,,,,,82,90,,,,74,75,71,62,57,83,95,96,63,64,,,,67', +',65,66,68,311,312,72,73,,,,,,307,308,314,103,102,104,105,,,232,,,,,', +',309,,,107,106,108,97,56,99,98,100,,101,109,110,,93,94,,,315,,,,,,,', +',,,,,,,,,,,,931,,,231,,,58,59,,,60,,,,,,,,,,,,,,,,,,,,91,81,84,85,,86', +'88,87,89,,,,,82,90,,,,74,75,71,62,57,83,95,96,63,64,,,,67,,65,66,68', +'311,312,72,73,,,,,,307,308,314,103,102,104,105,,,232,,,,,,,309,,,107', +'106,108,97,56,99,98,100,,101,109,110,,93,94,,,315,,,,,,,,,,,,,,,,,,', +',857,,,231,,,58,59,,,60,,,,,,,,,,,,,,,,,,,,91,81,84,85,,86,88,87,89', +',,,,82,90,,,,74,75,71,62,57,83,95,96,63,64,,,,67,,65,66,68,30,31,72', +'73,,,,,,29,28,27,103,102,104,105,,,232,,,,,,,45,,,107,106,108,97,56', +'99,98,100,286,101,109,110,,93,94,42,43,41,,,,,,,,,,,,,,,,,,,,225,,,231', +',,58,59,,,60,,283,,281,,44,,,287,,,,,,230,,,,,91,284,84,85,,86,88,87', +'89,,,,,82,90,,,,74,75,71,62,57,83,95,96,63,64,,,,67,,65,66,68,30,31', +'72,73,,,,,,29,28,27,103,102,104,105,,,232,,,,,,,45,,,107,106,108,97', +'56,99,98,100,286,101,109,110,,93,94,42,43,41,,,,,,,,,,,,,,,,,,,,225', +',,231,,,58,59,,,60,,283,,281,,44,,,287,,,,,,230,,,,,91,284,84,85,,86', +'88,87,89,,,,,82,90,,,,74,75,71,62,57,83,95,96,63,64,,,,67,,65,66,68', +'30,31,72,73,,,,,,29,28,27,103,102,104,105,,,232,,,,,,,45,,,107,106,108', +'97,56,99,98,100,286,101,109,110,,93,94,42,43,41,,,,,,,,,,,,,,,,,,,,225', +',,231,,,58,59,,,60,,283,,281,,44,,,287,,,,,,230,,,,,91,284,84,85,,86', +'88,87,89,,,,,82,90,,,,74,75,71,62,57,83,95,96,63,64,,,,67,,65,66,68', +'311,312,72,73,,,,,,307,308,314,103,102,104,105,,,232,,,,,,,309,,,107', +'106,108,97,56,99,98,100,,101,109,110,,93,94,,,315,,,,,,,,,,,,,,,,,,', +',305,,,301,,,58,59,,,60,,300,,,,,,,,,,,,,,,,,,91,81,84,85,,86,88,87', +'89,,,,,82,90,,,,74,75,71,62,57,83,95,96,63,64,,,,67,,65,66,68,311,312', +'72,73,,,,,,307,308,314,103,102,104,105,,,232,,,,,,,309,,,107,106,108', +'97,56,99,98,100,,101,109,110,,93,94,,,315,,,,,,,,,,,,,,,,,,,,305,,,231', +',,58,59,,,60,,,672,,669,668,667,677,670,,,,,,,,,680,,91,81,84,85,,86', +'88,87,89,,,,,82,90,,,,317,,675,62,,83,95,96,74,75,71,,57,688,687,,63', +'64,681,,,67,,65,66,68,311,312,72,73,,,,,,307,308,314,103,102,104,105', +',,232,,,,,,,45,,,107,106,108,97,56,99,98,100,,101,109,110,,93,94,42', +'43,41,,,,,,,,,,,,,,,,,,,,225,,,231,,,58,59,,,60,,,,,,44,,,,,,,,,230', +',,,,91,81,84,85,,86,88,87,89,,,,,82,90,,,,74,75,71,62,57,83,95,96,63', +'64,,,,67,,65,66,68,311,312,72,73,,,,,,307,308,314,103,102,104,105,,', +'232,,,,,,,45,,,107,106,108,97,56,99,98,100,286,101,109,110,,93,94,42', +'43,41,,,,,,,,,,,,,,,,,,,,225,,,231,,,58,59,,,60,,,,281,,44,,,287,,,', +',,230,,,,,91,284,84,85,,86,88,87,89,,,,,82,90,,,,74,75,71,62,57,83,95', +'96,63,64,,,,67,,65,66,68,311,312,72,73,,,,,,307,308,314,103,102,104', +'105,,,232,,,,,,,45,,,107,106,108,97,56,99,98,100,,101,109,110,,93,94', +'42,43,41,,,,,,,,,,,,,,,,,,,,225,,,231,,,58,59,,,60,,629,,,,44,,,,,,', +',,230,,,,,91,81,84,85,,86,88,87,89,,,,,82,90,,,,74,75,71,62,57,83,95', +'96,63,64,,,,67,,65,66,68,311,312,72,73,,,,,,307,308,314,103,102,104', +'105,,,232,,,,,,,45,,,107,106,108,97,56,99,98,100,,101,109,110,,93,94', +'42,43,41,,,,,,,,,,,,,,,,,,,,225,,,231,,,58,59,,,60,,,,,,44,,,,,,,,,230', +',,,,91,81,84,85,,86,88,87,89,,,,,82,90,,,,74,75,71,62,57,83,95,96,63', +'64,,,,67,,65,66,68,311,312,72,73,,,,,,307,308,314,103,102,104,105,,', +'232,,,,,,,45,,,107,106,108,97,56,99,98,100,,101,109,110,,93,94,42,43', +'41,,,,,,,,,,,,,,,,,,,,225,,,231,,,58,59,,,60,,,,,,44,,,,,,,,,230,,,', +',91,81,84,85,,86,88,87,89,,,,,82,90,,,,74,75,71,62,57,83,95,96,63,64', +',,,67,,65,66,68,311,312,72,73,,,,,,307,308,314,103,102,104,105,,,232', +',,,,,,45,,,107,106,108,97,56,99,98,100,,101,109,110,,93,94,42,43,41', +',,,,,,,,,,,,,,,,,,,225,,,231,,,58,59,,,60,,,,,,44,,,,,,,,,230,,,,,91', +'81,84,85,,86,88,87,89,,,,,82,90,,,,74,75,71,62,57,83,95,96,63,64,,,', +'67,,65,66,68,30,31,72,73,,,,,,29,28,27,103,102,104,105,,,19,,,,,,,45', +',,107,106,108,97,56,99,98,100,,101,109,110,,93,94,42,43,41,,,,,,,,,', +',,,,,,,,,,225,,,231,,,58,59,,,60,,,,,,44,,,,,,,,,20,,,,,91,81,84,85', +',86,88,87,89,,,,,82,90,,,,74,75,71,62,57,83,95,96,63,64,,,,67,,65,66', +'68,311,312,72,73,,,,,,307,308,314,103,102,104,105,,,232,,,,,,,45,,,107', +'106,108,97,56,99,98,100,286,101,109,110,,93,94,42,43,41,,,,,,,,,,,,', +',,,,,,,225,,,231,,,58,59,,,60,,283,,,,44,,,287,,,,,,230,,,,,91,284,84', +'85,,86,88,87,89,,,,,82,90,,,,74,75,71,62,57,83,95,96,63,64,,,,67,,65', +'66,68,311,312,72,73,,,,,,307,308,314,103,102,104,105,,,232,,,,,,,45', +',,107,106,108,97,56,99,98,100,286,101,109,110,,93,94,42,43,41,,,,,,', +',,,,,,,,,,,,,225,,,231,,,58,59,,,60,,,,,,44,,,287,,,,,,230,,,,,91,284', +'84,85,,86,88,87,89,,,,,82,90,,,,74,75,71,62,57,83,95,96,63,64,,,,67', +',65,66,68,311,312,72,73,,,,,,307,308,314,103,102,104,105,,,232,,,,,', +',45,,,107,106,108,97,56,99,98,100,,101,109,110,,93,94,42,43,41,,,,,', +',,,,,,,,,,,,,,225,,,231,,,58,59,,,60,,,,,,44,,,,,,,,,230,,,,,91,81,84', +'85,,86,88,87,89,,,,,82,90,,,,74,75,71,62,57,83,95,96,63,64,,,,67,,65', +'66,68,30,31,72,73,,,,,,29,28,27,103,102,104,105,,,19,,,,,,,45,,,107', +'106,108,97,56,99,98,100,,101,109,110,,93,94,42,43,41,,,,,,,,,,,,,,,', +',,,,225,,,231,,,58,59,,,60,,,,,,44,,,,,,,,,20,,,,,91,81,84,85,,86,88', +'87,89,,,,,82,90,,,,74,75,71,62,57,83,95,96,63,64,,,,67,,65,66,68,30', +'31,72,73,,,,,,29,28,27,103,102,104,105,,,19,,,,,,,45,,,107,106,108,97', +'56,99,98,100,,101,109,110,,93,94,42,43,41,,,,,,,,,,,,,,,,,,,,225,,,231', +',,58,59,,,60,,,,,,44,,,,,,,,,20,,,,,91,81,84,85,,86,88,87,89,,,,,82', +'90,,,,74,75,71,62,57,83,95,96,63,64,,,,67,,65,66,68,30,31,72,73,,,,', +',29,28,27,103,102,104,105,,,19,,,,,,,45,,,107,106,108,97,56,99,98,100', +',101,109,110,,93,94,42,43,41,,,,,,,,,,,,,,,,,,,,225,,,231,,,58,59,,', +'60,,,,,,44,,,,,,,,,20,,,,,91,81,84,85,,86,88,87,89,,,,,82,90,,,,74,75', +'71,62,57,83,95,96,63,64,,,,67,,65,66,68,311,312,72,73,,,,,,307,308,314', +'103,102,104,105,,,232,,,,,,,309,,,107,106,108,97,56,99,98,100,,101,109', +'110,,93,94,,,315,,,,,,,,,,,,,,,,,,,,349,,,33,,,58,59,,,60,,35,,,,,,', +',,,,,,,,,,,91,81,84,85,,86,88,87,89,,,,,82,90,,,,74,75,71,62,57,83,95', +'96,63,64,,,,67,,65,66,68,311,312,72,73,,,,,,307,308,314,103,102,104', +'105,,,232,,,,,,,309,,,107,106,108,354,56,99,98,355,,101,109,110,,93', +'94,,,315,,,,,,,,,,,,,,,,,361,,,356,,,231,,,58,59,,,60,,,,,,,,,,,,,,', +',,,,,91,81,84,85,,86,88,87,89,,,,,82,90,,,,74,75,71,62,57,83,95,96,63', +'64,,,,67,,65,66,68,311,312,72,73,,,,,,307,308,314,103,102,104,105,,', +'232,,,,,,,309,,,107,106,108,354,56,99,98,355,,101,109,110,,93,94,,,315', +',,,,,,,,,,,,,,,,,,,356,,,231,,,58,59,,,60,,,,,,,,,,,,,,,,,,,,91,81,84', +'85,,86,88,87,89,,,,,82,90,,,,74,75,71,62,57,83,95,96,63,64,,,,67,,65', +'66,68,311,312,72,73,,,,,,307,308,314,103,102,104,105,,,232,,,,,,,309', +',,107,106,108,97,56,99,98,100,,101,109,110,,93,94,,,315,,,,,,,,,,,,', +',,,,,,,857,,,231,,,58,59,,,60,,,672,,669,668,667,677,670,,,,,,,,,680', +',91,81,84,85,,86,88,87,89,,,,,82,90,,,,,,675,62,,83,95,96,74,75,71,9', +'57,688,687,,63,64,681,,,67,,65,66,68,30,31,72,73,,,,,,29,28,27,103,102', +'104,105,,,19,,,,,,8,45,7,10,107,106,108,97,56,99,98,100,,101,109,110', +',93,94,42,43,41,,,,,,,,,,,,,,,,,,,,40,,,33,,,58,59,,,60,,35,,,,44,,', +',,,,,,20,,,,,91,81,84,85,,86,88,87,89,,,,,82,90,,,,,,389,62,,83,95,96', +'74,75,71,,57,,,,63,64,,,,67,,65,66,68,30,31,72,73,,,,,,29,28,27,103', +'102,104,105,,,19,,,,,,,45,,,107,106,108,97,56,99,98,100,,101,109,110', +',93,94,42,43,41,,,,,,,,,,,,,,,,,,,,225,,,231,,,58,59,,,60,,,,,,44,,', +',,,,,,20,,,,,91,81,84,85,,86,88,87,89,,,,,82,90,,,,74,75,71,62,57,83', +'95,96,63,64,,,,67,,65,66,68,30,31,72,73,,,,,,29,28,27,103,102,104,105', +',,19,,,,,,,45,,,107,106,108,97,56,99,98,100,,101,109,110,,93,94,42,43', +'41,,,,,,,,,,,,,,,,,,,,225,,,231,,,58,59,,,60,,,,,,44,,,,,,,,,20,,,,', +'91,81,84,85,,86,88,87,89,,,,,82,90,,,,74,75,71,62,57,83,95,96,63,64', +',,,67,,65,66,68,30,31,72,73,,,,,,29,28,27,103,102,104,105,,,19,,,,,', +',45,,,107,106,108,97,56,99,98,100,,101,109,110,,93,94,42,43,41,,,,,', +',,,,,,,,,,,,,,225,,,231,,,58,59,,,60,,,,,,44,,,,,,,,,20,,,,,91,81,84', +'85,,86,88,87,89,,,,,82,90,,,,74,75,71,62,57,83,95,96,63,64,,,,67,,65', +'66,68,30,31,72,73,,,,,,29,28,27,103,102,104,105,,,19,,,,,,,45,,,107', +'106,108,97,56,99,98,100,,101,109,110,,93,94,42,43,41,,,,,,,,,,,,,,,', +',,,,225,,,231,,,58,59,,,60,,,,,,44,,,,,,,,,20,,,,,91,81,84,85,,86,88', +'87,89,,,,,82,90,,,,,,,62,,83,95,96,74,75,71,9,57,,,,63,64,,,,67,,65', +'66,68,30,31,72,73,,,,,,29,28,27,103,102,104,105,,,19,,,,,,8,45,,10,107', +'106,108,97,56,99,98,100,,101,109,110,,93,94,42,43,41,,,,,,,,,,,,,,,', +',,,,40,,,33,,,58,59,,,60,,35,,,,44,,,,,,,,,20,,,,,91,81,84,85,,86,88', +'87,89,,,,,82,90,,,,74,75,71,62,57,83,95,96,63,64,,,,67,,65,66,68,311', +'312,72,73,,,,,,307,308,314,103,102,104,105,,,232,,,,,,,45,,,107,106', +'108,97,56,99,98,100,,101,109,110,,93,94,42,43,41,,,,,,,,,,,,,,,,,,,', +'225,,,231,,,58,59,,,60,,,,,,44,,,,,,,,,230,,,,,91,81,84,85,,86,88,87', +'89,,,,,82,90,,,,74,75,71,62,57,83,95,96,63,64,,,,67,,65,66,68,311,312', +'72,73,,,,,,307,308,314,103,102,104,105,,,232,,,,,,,45,,,107,106,108', +'97,56,99,98,100,,101,109,110,,93,94,42,43,41,,,,,,,,,,,,,,,,,,,,225', +',,231,,,58,59,,,60,,,,,,44,,,,,,,,,230,,,,,91,81,84,85,,86,88,87,89', +',,,,82,90,,,,74,75,71,62,57,83,95,96,63,64,,,,67,,65,66,68,30,31,72', +'73,,,,,,29,28,27,103,102,104,105,,,232,,,,,,,45,,,107,106,108,97,56', +'99,98,100,,101,109,110,,93,94,42,43,41,,,,,,,,,,,,,,,,,,,,225,,,231', +',,58,59,,,60,,405,,,,44,,,,,,,,,230,,,,,91,81,84,85,,86,88,87,89,,,', +',82,90,,,,74,75,71,62,57,83,95,96,63,64,,,,67,,65,66,68,30,31,72,73', +',,,,,29,28,27,103,102,104,105,,,19,,,,,,,45,,,107,106,108,97,56,99,98', +'100,,101,109,110,,93,94,42,43,41,,,,,,,,,,,,,,,,,,,,225,,,231,,,58,59', +',,60,,,,,,44,,,,,,,,,20,,,,,91,81,84,85,,86,88,87,89,,,,,82,90,,,,74', +'75,71,62,57,83,95,96,63,64,,,,67,,65,66,68,311,312,72,73,,,,,,307,308', +'314,103,102,104,105,,,232,,,,,,,45,,,107,106,108,97,56,99,98,100,286', +'101,109,110,,93,94,42,43,41,,,,,,,,,,,,,,,,,,,,225,,,231,,,58,59,,,60', +',,,,,44,,,287,,,,,,230,,,,,91,284,84,85,,86,88,87,89,,,,,82,90,,,,74', +'75,71,62,57,83,95,96,63,64,,,,67,,65,66,68,311,312,72,73,,,,,,307,308', +'314,103,102,104,105,,,232,,,,,,,45,,,107,106,108,97,56,99,98,100,286', +'101,109,110,,93,94,42,43,41,,,,,,,,,,,,,,,,,,,,225,,,231,,,58,59,,,60', +',629,,,,44,,,287,,,,,,230,,,,,91,284,84,85,,86,88,87,89,,,,,82,90,,', +',74,75,71,62,57,83,95,96,63,64,,,,67,,65,66,68,30,31,72,73,,,,,,29,28', +'27,103,102,104,105,,,19,,,,,,,45,,,107,106,108,97,56,99,98,100,,101', +'109,110,,93,94,42,43,41,,,,,,,,,,,,,,,,,,,,225,,,231,,,58,59,,,60,,', +',,,44,,,,,,,,,20,,,,,91,81,84,85,,86,88,87,89,,,,,82,90,,,,74,75,71', +'62,57,83,95,96,63,64,,,,67,,65,66,68,311,312,72,73,,,,,,307,308,314', +'103,102,104,105,,,232,,,,,,,45,,,107,106,108,97,56,99,98,100,,101,109', +'110,,93,94,42,43,41,,,,,,,,,,,,,,,,,,,,225,,,231,,,58,59,,,60,,,,,,44', +',,,,,,,,230,,,,,91,81,84,85,,86,88,87,89,,,,,82,90,,,,74,75,71,62,57', +'83,95,96,63,64,,,,67,,65,66,68,311,312,72,73,,,,,,307,308,314,103,102', +'104,105,,,232,,,,,,,45,,,107,106,108,97,56,99,98,100,,101,109,110,,93', +'94,42,43,41,,,,,,,,,,,,,,,,,,,,225,,,231,,,58,59,,,60,,,,,,44,,,,,,', +',,230,,,,,91,81,84,85,,86,88,87,89,,,,,82,90,,,,74,75,71,62,57,83,95', +'96,63,64,,,,67,,65,66,68,311,312,72,73,,,,,,307,308,314,103,102,104', +'105,,,232,,,,,,,309,,,107,106,108,97,56,99,98,100,,101,109,110,,93,94', +',,315,,,,,,,,,,,,,,,,,,,,305,,,301,,,58,59,,,60,,,,,,,,,,,,,,,,,,,,91', +'81,84,85,,86,88,87,89,,,,,82,90,,,,74,75,71,62,57,83,95,96,63,64,,,', +'67,,65,66,68,30,31,72,73,,,,,,29,28,27,103,102,104,105,,,19,,,,,,,45', +',,107,106,108,97,56,99,98,100,,101,109,110,,93,94,42,43,41,,,,,,,,,', +',,,,,,,,,,225,,,231,,,58,59,,,60,,,,,,44,,,,,,,,,20,,,,,91,81,84,85', +',86,88,87,89,,,,,82,90,,,,74,75,71,62,57,83,95,96,63,64,,,,67,,65,66', +'68,30,31,72,73,,,,,,29,28,27,103,102,104,105,,,19,,,,,,,45,,,107,106', +'108,97,56,99,98,100,,101,109,110,,93,94,42,43,41,,,,,,,,,,,,,,,,,,,', +'225,,,231,,,58,59,,,60,,,,,,44,,,,,,,,,20,,,,,91,81,84,85,,86,88,87', +'89,,,,,82,90,,,,74,75,71,62,57,83,95,96,63,64,,,,67,,65,66,68,30,31', +'72,73,,,,,,29,28,27,103,102,104,105,,,232,,,,,,,45,,,107,106,108,97', +'56,99,98,100,286,101,109,110,,93,94,42,43,41,,,,,,,,,,,,,,,,,,,,225', +',,231,,,58,59,,,60,,283,,281,,44,,,287,,,,,,230,,,,,91,284,84,85,,86', +'88,87,89,,,,,82,90,,,,74,75,71,62,57,83,95,96,63,64,,,,67,,65,66,68', +'311,312,72,73,,,,,,307,308,314,103,102,104,105,,,232,,,,,,,309,,,107', +'106,108,97,56,99,98,100,,101,109,110,,93,94,,,315,,,,,,,,,,,,,,,,,,', +',305,,,301,,,58,59,,,60,,,672,,669,668,667,677,670,,,,,,,,,680,,91,81', +'84,85,,86,88,87,89,,,,,82,90,,,,,,675,62,,83,95,96,74,75,71,9,57,688', +'687,,63,64,681,,,67,,65,66,68,30,31,72,73,,,,,,29,28,27,103,102,104', +'105,,,19,,,,,,8,45,294,10,107,106,108,97,56,99,98,100,,101,109,110,', +'93,94,42,43,41,,,,,,,,,,,,,,,,,,,,40,,,33,,,58,59,,,60,,35,,,,44,,,', +',,,,,20,,,,,91,81,84,85,,86,88,87,89,,,,,82,90,,,,,,389,62,,83,95,96', +'74,75,71,,57,,,,63,64,,,,67,,65,66,68,311,312,72,73,,,,,,307,308,314', +'103,102,104,105,,,232,,,,,,,45,,,107,106,108,97,56,99,98,100,,101,109', +'110,,93,94,42,43,41,,,,,,,,,,,,,,,,,,,,225,,,231,,,58,59,,,60,,,,,,44', +',,,,,,,,230,,,,,91,81,84,85,,86,88,87,89,,,,,82,90,,,,74,75,71,62,57', +'83,95,96,63,64,,,,67,,65,66,68,311,312,72,73,,,,,,307,308,314,103,102', +'104,105,,,232,,,,,,,45,,,107,106,108,97,56,99,98,100,286,101,109,110', +',93,94,42,43,41,,,,,,,,,,,,,,,,,,,,225,,,231,,,58,59,,,60,,,,281,,44', +',,287,,,,,,230,,,,,91,284,84,85,,86,88,87,89,,,,,82,90,,,,74,75,71,62', +'57,83,95,96,63,64,,,,67,,65,66,68,311,312,72,73,,,,,,307,308,314,103', +'102,104,105,,,232,,,,,,,45,,,107,106,108,97,56,99,98,100,286,101,109', +'110,,93,94,42,43,41,,,,,,,,,,,,,,,,,,,,225,,,231,,,58,59,,,60,,629,', +'281,,44,,,287,,,,,,230,,,,,91,284,84,85,,86,88,87,89,,,,,82,90,,,,74', +'75,71,62,57,83,95,96,63,64,,,,67,,65,66,68,311,312,72,73,,,,,,307,308', +'314,103,102,104,105,,,232,,,,,,,45,,,107,106,108,97,56,99,98,100,,101', +'109,110,,93,94,42,43,41,,,,,,,,,,,,,,,,,,,,225,,,231,,,58,59,,,60,,', +',,,44,,,,,,,,,230,,,,,91,81,84,85,,86,88,87,89,,,,,82,90,,,,74,75,71', +'62,57,83,95,96,63,64,,,,67,,65,66,68,311,312,72,73,,,,,,307,308,314', +'103,102,104,105,,,232,,,,,,,45,,,107,106,108,97,56,99,98,100,,101,109', +'110,,93,94,42,43,41,,,,,,,,,,,,,,,,,,,,225,,,231,,,58,59,,,60,,,,,,44', +',,,,,,,,230,,,,,91,81,84,85,,86,88,87,89,,,,,82,90,,,,74,75,71,62,57', +'83,95,96,63,64,,,,67,,65,66,68,311,312,72,73,,,,,,307,308,314,103,102', +'104,105,,,232,,,,,,,45,,,107,106,108,97,56,99,98,100,,101,109,110,,93', +'94,42,43,41,,,,,,,,,,,,,,,,,,,,225,,,231,,,58,59,,,60,,,,,,44,,,,,,', +',,230,,,,,91,81,84,85,,86,88,87,89,,,,,82,90,,,,74,75,71,62,57,83,95', +'96,63,64,,,,67,,65,66,68,30,31,72,73,,,,,,29,28,27,103,102,104,105,', +',232,,,,,,,45,,,107,106,108,97,56,99,98,100,286,101,109,110,,93,94,42', +'43,41,,,,,,,,,,,,,,,,,,,,225,,,231,,,58,59,,,60,,283,,281,,44,,,287', +',,,,,230,,,,,91,284,84,85,,86,88,87,89,,,,,82,90,,,,74,75,71,62,57,83', +'95,96,63,64,,,,67,,65,66,68,30,31,72,73,,,,,,29,28,27,103,102,104,105', +',,19,,,,,,,45,,,107,106,108,97,56,99,98,100,,101,109,110,,93,94,42,43', +'41,,,,,,,,,,,,,,,,,,,,225,,,231,,,58,59,,,60,,,,,,44,,,,,,,,,20,,,,', +'91,81,84,85,,86,88,87,89,,,,,82,90,,,,74,75,71,62,57,83,95,96,63,64', +',,,67,,65,66,68,311,312,72,73,,,,,,307,308,314,103,102,104,105,,,232', +',,,,,,45,,,107,106,108,97,56,99,98,100,,101,109,110,,93,94,42,43,41', +',,,,,,,,,,,,,,,,,,,225,,,231,,,58,59,,,60,,,,,,44,,,,,,,,,230,,,,,91', +'81,84,85,,86,88,87,89,,,,,82,90,,,,74,75,71,62,57,83,95,96,63,64,,,', +'67,,65,66,68,311,312,72,73,,,,,,307,308,314,103,102,104,105,,,232,,', +',,,,309,,,107,106,108,97,56,99,98,100,,101,109,110,,93,94,,,315,,,,', +',,,,,,,,,,,,,,,305,,,231,,,58,59,,,60,,,672,,669,668,667,677,670,,,', +',,,,,680,,91,81,84,85,,86,88,87,89,,,,,82,90,,,,505,,675,62,,83,95,96', +'74,75,71,,57,688,687,,63,64,681,,,67,,65,66,68,311,312,72,73,,,,,,307', +'308,314,103,102,104,105,,,232,,,,,,,45,,,107,106,108,97,56,99,98,100', +',101,109,110,,93,94,42,43,41,,,,,,,,,,,,,,,,,,,,225,,,231,,,58,59,,', +'60,,,,,,44,,,,,,,,,230,,,,,91,81,84,85,,86,88,87,89,,,,,82,90,,,,74', +'75,71,62,57,83,95,96,63,64,,,,67,,65,66,68,30,31,72,73,,,,,,29,28,27', +'103,102,104,105,,,232,,,,,,,45,,,107,106,108,97,56,99,98,100,,101,109', +'110,,93,94,42,43,41,,,,,,,,,,,,,,,,,,,,225,,,231,,,58,59,,,60,,,,,,44', +',,,,,,,,230,,,,,91,81,84,85,,86,88,87,89,,,,,82,90,,,,74,75,71,62,57', +'83,95,96,63,64,,,,67,,65,66,68,30,31,72,73,,,,,,29,28,27,103,102,104', +'105,,,232,,,,,,,45,,,107,106,108,97,56,99,98,100,,101,109,110,,93,94', +'42,43,41,,,,,,,,,,,,,,,,,,,,225,,,231,,,58,59,,,60,,,,,,44,,,,,,,,,230', +',,,,91,81,84,85,,86,88,87,89,,,,,82,90,,,,74,75,71,62,57,83,95,96,63', +'64,,,,67,,65,66,68,30,31,72,73,,,,,,29,28,27,103,102,104,105,,,232,', +',,,,,45,,,107,106,108,97,56,99,98,100,,101,109,110,,93,94,42,43,41,', +',,,,,,,,,,,,,,,,,,225,,,231,,,58,59,,,60,,,,,,44,,,,,,,,,230,,,,,91', +'81,84,85,,86,88,87,89,,,,,82,90,,,,74,75,71,62,57,83,95,96,63,64,,,', +'67,,65,66,68,30,31,72,73,,,,,,29,28,27,103,102,104,105,,,232,,,,,,,45', +',,107,106,108,97,56,99,98,100,,101,109,110,,93,94,42,43,41,,,,,,,,,', +',,,,,,,,,,225,,,231,,,58,59,,,60,,,,,,44,,,,,,,,,230,,,,,91,81,84,85', +',86,88,87,89,,,,,82,90,,,,74,75,71,62,57,83,95,96,63,64,,,,67,,65,66', +'68,30,31,72,73,,,,,,29,28,27,103,102,104,105,,,232,,,,,,,45,,,107,106', +'108,97,56,99,98,100,,101,109,110,,93,94,42,43,41,,,,,,,,,,,,,,,,,,,', +'225,,,231,,,58,59,,,60,,,,,,44,,,,,,,,,230,,,,,91,81,84,85,,86,88,87', +'89,,,,,82,90,,,,74,75,71,62,57,83,95,96,63,64,,,,67,,65,66,68,311,312', +'72,73,,,,,,307,308,314,103,102,104,105,,,232,,,,,,,45,,,107,106,108', +'97,56,99,98,100,286,101,109,110,,93,94,42,43,41,,,,,,,,,,,,,,,,,,,,225', +',,231,,,58,59,,,60,,,,281,,44,,,287,,,,,,230,,,,,91,284,84,85,,86,88', +'87,89,,,,,82,90,,,,74,75,71,62,57,83,95,96,63,64,,,,67,,65,66,68,311', +'312,72,73,,,,,,307,308,314,103,102,104,105,,,232,,,,,,,45,,,107,106', +'108,97,56,99,98,100,286,101,109,110,,93,94,42,43,41,,,,,,,,,,,,,,,,', +',,,225,,,231,,,58,59,,,60,,629,,281,,44,,,287,,,,,,230,,,,,91,284,84', +'85,,86,88,87,89,,,,,82,90,,,,74,75,71,62,57,83,95,96,63,64,,,,67,,65', +'66,68,311,312,72,73,,,,,,307,308,314,103,102,104,105,,,232,,,,,,,45', +',,107,106,108,97,56,99,98,100,,101,109,110,,93,94,42,43,41,,,,,,,,,', +',,,,,,,,,,225,,,231,,,58,59,,,60,,,,,,44,,,,,,,,,230,,,,,91,81,84,85', +',86,88,87,89,,,,,82,90,,,,74,75,71,62,57,83,95,96,63,64,,,,67,,65,66', +'68,311,312,72,73,,,,,,307,308,314,103,102,104,105,,,232,,,,,,,45,,,107', +'106,108,97,56,99,98,100,,101,109,110,,93,94,42,43,41,,,,,,,,,,,,,,,', +',,,,225,,,231,,,58,59,,,60,,734,,,,44,,,,,,,,,230,,,,,91,81,84,85,,86', +'88,87,89,,,,,82,90,,,,74,75,71,62,57,83,95,96,63,64,,,,67,,65,66,68', +'311,312,72,73,,,,,,307,308,314,103,102,104,105,,,232,,,,,,,309,,,107', +'106,108,97,56,99,98,100,,101,109,110,,93,94,,,315,,,,,,,,,,,,,,,,,,', +',305,,,301,,,58,59,,,60,,,,,,,,,,,,,,,,,,,,91,81,84,85,,86,88,87,89', +',,,,82,90,,,,74,75,71,62,57,83,95,96,63,64,,,,67,,65,66,68,30,31,72', +'73,,,,,,29,28,27,103,102,104,105,,,232,,,,,,,45,,,107,106,108,97,56', +'99,98,100,286,101,109,110,,93,94,42,43,41,,,,,,,,,,,,,,,,,,,,225,,,231', +',,58,59,,,60,,283,,281,,44,,,287,,,,,,230,,,,,91,284,84,85,,86,88,87', +'89,,,,,82,90,,,,74,75,71,62,57,83,95,96,63,64,,,,67,,65,66,68,30,31', +'72,73,,,,,,29,28,27,103,102,104,105,,,232,,,,,,,45,,,107,106,108,97', +'56,99,98,100,286,101,109,110,,93,94,42,43,41,,,,,,,,,,,,,,,,,,,,225', +',,231,,,58,59,,,60,,283,,281,,44,,,287,,,,,,230,,,,,91,284,84,85,,86', +'88,87,89,,,,,82,90,,,,74,75,71,62,57,83,95,96,63,64,,,,67,,65,66,68', +'311,312,72,73,,,,,,307,308,314,103,102,104,105,,,232,,,,,,,45,,,107', +'106,108,97,56,99,98,100,,101,109,110,,93,94,42,43,41,,,,,,,,,,,,,,,', +',,,,225,,,231,,,58,59,,,60,,283,,,,44,,,,,,,,,230,,,,,91,81,84,85,,86', +'88,87,89,,,,,82,90,,,,74,75,71,62,57,83,95,96,63,64,,,,67,,65,66,68', +'311,312,72,73,,,,,,307,308,314,103,102,104,105,,,232,,,,,,,45,,,107', +'106,108,97,56,99,98,100,,101,109,110,,93,94,42,43,41,,,,,,,,,,,,,,,', +',,,,225,,,231,521,,58,59,,,60,,,,,,44,,,,,,,,,230,,,,,91,81,84,85,,86', +'88,87,89,,,,,82,90,,,,,-280,,62,,83,95,96,-280,-280,-280,,,-280,-280', +'-280,,-280,,,,,,,,,,-280,-280,-280,,,,,,,,-280,-280,,-280,-280,-280', +'-280,-280,,,,,,,,,,,,,,,,,,,,,,,-280,-280,-280,-280,-280,-280,-280,-280', +'-280,-280,-280,-280,-280,-280,,,-280,-280,-280,,,-280,,,-280,,,-280', +'-280,,-280,,-280,,-280,,-280,-280,,-280,-280,-280,-280,-280,,-280,,-280', +',,,,,,,,,,,,,-280,,,-280,-280,-280,-280,-583,-280,,-280,,,,-583,-583', +'-583,,,-583,-583,-583,,-583,,,,,,,,,-583,-583,-583,-583,,,,,,,,-583', +'-583,,-583,-583,-583,-583,-583,,,,,,,,,,,,,,,,,,,,,,,-583,-583,-583', +'-583,-583,-583,-583,-583,-583,-583,-583,-583,-583,-583,,,-583,-583,-583', +',,-583,,,-583,,,-583,-583,,-583,,-583,,-583,,-583,-583,,-583,-583,-583', +'-583,-583,,-583,-583,-583,,,,,,,,,,,,,,-583,,,-583,-583,-583,-583,-582', +'-583,,-583,,,,-582,-582,-582,,,-582,-582,-582,,-582,,,,,,,,,-582,-582', +'-582,-582,,,,,,,,-582,-582,,-582,-582,-582,-582,-582,,,,,,,,,,,,,,,', +',,,,,,,-582,-582,-582,-582,-582,-582,-582,-582,-582,-582,-582,-582,-582', +'-582,,,-582,-582,-582,,,-582,,,-582,,,-582,-582,,-582,,-582,,-582,,-582', +'-582,,-582,-582,-582,-582,-582,,-582,-582,-582,672,,669,668,667,677', +'670,,,,,,,-582,,680,-582,-582,-582,-582,-296,-582,,-582,,,,-296,-296', +'-296,,,-296,-296,-296,,-296,675,,,,,,,,,-296,-296,688,687,,,,681,,,-296', +'-296,,-296,-296,-296,-296,-296,,,,,,,,,,,,,,,,,,,,,,,-296,-296,-296', +'-296,-296,-296,-296,-296,-296,-296,-296,-296,-296,-296,,,-296,-296,-296', +',,-296,,274,-296,,,-296,-296,,-296,,-296,,-296,,-296,-296,,-296,-296', +'-296,-296,-296,,-296,-414,-296,,,,,,-414,-414,-414,,,-414,-414,-414', +'-296,-414,,-296,-296,,-296,,-296,,-414,-414,-414,,,,,,,,,-414,-414,', +'-414,-414,-414,-414,-414,,,,,,,,,,,,,,,,,,,,,,,-414,-414,-414,-414,-414', +'-414,-414,-414,-414,-414,-414,-414,-414,-414,,,-414,-414,-414,,,-414', +',265,-414,,,-414,-414,,-414,,-414,,-414,,-414,-414,,-414,-414,-414,-414', +'-414,,-414,-414,-414,,,,,,,,,,,,,,-414,,-244,-414,-414,,-414,,-414,-244', +'-244,-244,,,-244,-244,-244,,-244,,,,,,,,,-244,-244,-244,,,,,,,,,-244', +'-244,,-244,-244,-244,-244,-244,,,,,,,,,,,,,,,,,,,,,,,-244,-244,-244', +'-244,-244,-244,-244,-244,-244,-244,-244,-244,-244,-244,,,-244,-244,-244', +',,-244,,265,-244,,,-244,-244,,-244,,-244,,-244,,-244,-244,,-244,-244', +'-244,-244,-244,,-244,-244,-244,,,,,,,,,,,,,,-244,,-244,-244,-244,,-244', +',-244,-244,-244,-244,,,-244,-244,-244,672,-244,669,668,667,677,670,', +',,-244,-244,,,,680,,,,,,-244,-244,,-244,-244,-244,-244,-244,,,,,,,,672', +'675,669,668,667,677,670,,,,685,684,688,687,,680,,681,,672,,669,668,667', +'677,670,-244,,,,,,,-244,680,,,675,265,-244,,,,220,,,685,684,688,687', +',,,681,,,675,,,,,-244,-244,,,685,684,688,687,,,,681,,,,-244,,,-244,', +',,,-244,175,186,176,199,172,192,182,181,202,203,197,180,179,174,200', +'204,205,184,173,187,191,193,185,178,,,,194,201,196,195,188,198,183,171', +'190,189,,,,,,170,177,168,169,165,166,167,126,128,,,127,,,,,,,,159,160', +',156,138,139,140,147,144,146,,,141,142,,,,161,162,148,149,,,,,,,,,,', +',,,153,152,,137,158,155,154,163,150,151,145,143,135,157,136,,,164,91', +',,,,,,,,,,,,,90,175,186,176,199,172,192,182,181,202,203,197,180,179', +'174,200,204,205,184,173,187,191,193,185,178,,,,194,201,196,195,188,198', +'183,171,190,189,,,,,,170,177,168,169,165,166,167,126,128,125,,127,,', +',,,,,159,160,,156,138,139,140,147,144,146,,,141,142,,,,161,162,148,149', +',,,,,,,,,,,,,153,152,,137,158,155,154,163,150,151,145,143,135,157,136', +',,164,91,,,,,,,,,,,,,,90,175,186,176,199,172,192,182,181,202,203,197', +'180,179,174,200,204,205,184,173,187,191,193,185,178,,,,194,201,196,195', +'188,198,183,171,190,189,,,,,,170,177,168,169,165,166,167,126,128,,,127', +',,,,,,,159,160,,156,138,139,140,147,144,146,,,141,142,,,,161,162,148', +'149,,,,,,,,,,,,,,153,152,,137,158,155,154,163,150,151,145,143,135,157', +'136,,,164,91,,,,,,,,,,,,,,90,175,186,176,199,172,192,182,181,202,203', +'197,180,179,174,200,204,205,184,173,187,191,193,185,178,,,,194,201,196', +'195,188,198,183,171,190,189,,,,,,170,177,168,169,165,166,167,126,128', +',,127,,,,,,,,159,160,,156,138,139,140,147,144,146,,,141,142,,,,161,162', +'148,149,,,,,,,,,,,,,,153,152,,137,158,155,154,163,150,151,145,143,135', +'157,136,,,164,91,,,,,,,,,,,,,,90,175,186,176,199,172,192,182,181,202', +'203,197,180,179,174,200,204,205,184,173,187,191,193,185,178,,,,194,201', +'196,195,188,198,183,171,190,189,,,,,,170,177,168,169,165,166,167,126', +'128,,,127,,,,,,,,159,160,,156,138,139,140,147,144,146,,,141,142,,,,161', +'162,148,149,,,,,,,,,,,,,,153,152,,137,158,155,154,163,150,151,145,143', +'135,157,136,,,164,175,186,176,199,172,192,182,181,202,203,197,180,179', +'174,200,204,205,184,173,187,191,193,185,178,,,,194,201,196,372,371,373', +'370,171,190,189,,,,,,170,177,168,169,367,368,369,365,128,99,98,366,', +'101,,,,,,159,160,,156,138,139,140,147,144,146,,,141,142,,,,161,162,148', +'149,,,,,,377,,,,,,,,153,152,,137,158,155,154,163,150,151,145,143,135', +'157,136,640,418,164,,641,,,,,,,,159,160,,156,138,139,140,147,144,146', +',,141,142,,,,161,162,148,149,,,,,,265,,,,,,,,153,152,,137,158,155,154', +'163,150,151,145,143,135,157,136,476,418,164,,477,,,,,,,,159,160,,156', +'138,139,140,147,144,146,,,141,142,,,,161,162,148,149,,,,,,,,,,,,,,153', +'152,,137,158,155,154,163,150,151,145,143,135,157,136,1002,425,164,,1003', +',,,,,,,159,160,,156,138,139,140,147,144,146,,,141,142,,,,161,162,148', +'149,,,,,,265,,,,,,,,153,152,,137,158,155,154,163,150,151,145,143,135', +'157,136,1000,418,164,,1001,,,,,,,,159,160,,156,138,139,140,147,144,146', +',,141,142,,,,161,162,148,149,,,,,,265,,,,,,,,153,152,,137,158,155,154', +'163,150,151,145,143,135,157,136,608,418,164,,609,,,,,,,,159,160,,156', +'138,139,140,147,144,146,,,141,142,,,,161,162,148,149,,,,,,265,,,,,,', +',153,152,,137,158,155,154,163,150,151,145,143,135,157,136,610,425,164', +',611,,,,,,,,159,160,,156,138,139,140,147,144,146,,,141,142,,,,161,162', +'148,149,,,,,,265,,,,,,,,153,152,,137,158,155,154,163,150,151,145,143', +'135,157,136,974,425,164,,973,,,,,,,,159,160,,156,138,139,140,147,144', +'146,,,141,142,,,,161,162,148,149,,,,,,265,,,,,,,,153,152,,137,158,155', +'154,163,150,151,145,143,135,157,136,643,425,164,,644,,,,,,,,159,160', +',156,138,139,140,147,144,146,,,141,142,,,,161,162,148,149,,,,,,265,', +',,,,,,153,152,,137,158,155,154,163,150,151,145,143,135,157,136,608,418', +'164,,609,,,,,,,,159,160,,156,138,139,140,147,144,146,,,141,142,,,,161', +'162,148,149,,,,,,265,,,,,,,,153,152,,137,158,155,154,163,150,151,145', +'143,135,157,136,610,425,164,,611,,,,,,,,159,160,,156,138,139,140,147', +'144,146,,,141,142,,,,161,162,148,149,,,,,,265,,,,,,,,153,152,,137,158', +'155,154,163,150,151,145,143,135,157,136,701,418,164,,702,,,,,,,,159', +'160,,156,138,139,140,147,144,146,,,141,142,,,,161,162,148,149,,,,,,265', +',,,,,,,153,152,,137,158,155,154,163,150,151,145,143,135,157,136,703', +'425,164,,704,,,,,,,,159,160,,156,138,139,140,147,144,146,,,141,142,', +',,161,162,148,149,,,,,,265,,,,,,,,153,152,,137,158,155,154,163,150,151', +'145,143,135,157,136,706,425,164,,707,,,,,,,,159,160,,156,138,139,140', +'147,144,146,,,141,142,,,,161,162,148,149,,,,,,265,,,,,,,,153,152,,137', +'158,155,154,163,150,151,145,143,135,157,136,476,418,164,,477,,,,,,,', +'159,160,,156,138,139,140,147,144,146,,,141,142,,,,161,162,148,149,,', +',,,265,,,,,,,,153,152,,137,158,155,154,163,150,151,145,143,135,157,136', +'414,418,164,,415,,,,,,,,159,160,,156,138,139,140,147,144,146,,,141,142', +',,,161,162,148,149,,,,,,265,,,,,,,,153,152,,137,158,155,154,163,150', +'151,145,143,135,157,136,421,425,164,,420,,,,,,,,159,160,,156,138,139', +'140,147,144,146,,,141,142,,,,161,162,148,149,,,,,,265,,,,,,,,153,152', +',137,158,155,154,163,150,151,145,143,135,157,136,,672,164,669,668,667', +'677,670,,672,,669,668,667,677,670,680,,,,,,,,680,,672,,669,668,667,677', +'670,,,,,,675,,,680,,,,,675,685,684,688,687,,,,681,685,684,688,687,,', +',681,675,,672,,669,668,667,677,670,685,684,688,687,,,,681,680,,672,', +'669,668,667,677,670,672,,669,668,667,677,670,,680,,,,,675,,680,,,,,', +',685,684,688,687,,,,681,675,,,,,,,675,,685,684,688,687,,,,681,,688,687', +',,672,681,669,668,667,677,670,672,,669,668,667,677,670,672,680,669,668', +'667,677,670,672,680,669,668,667,677,670,,680,,,,,,,680,675,,,,,,,675', +',,,688,687,,675,,681,,688,687,,675,,681,,688,687,,,,681,,688,687,,,672', +'681,669,668,667,677,670,,672,,669,668,667,677,670,680,,,,,,,,680,,672', +',669,668,667,677,670,,,,,,675,,,680,,,,,675,685,684,688,687,,,,681,685', +'684,688,687,,,,681,675,658,,,,,,,,685,684,688,687,,,,681' ] + racc_action_table = arr = ::Array.new(25046, nil) + idx = 0 + clist.each do |str| + str.split(',', -1).each do |i| + arr[idx] = i.to_i unless i.empty? + idx += 1 + end + end + +clist = [ +'421,620,340,438,438,61,701,421,421,421,360,866,347,421,421,19,421,310', +'58,350,483,385,1002,825,224,421,482,450,834,223,382,228,548,834,346', +'384,421,421,1000,421,421,421,421,421,1021,1001,893,339,640,702,793,635', +'343,338,338,483,19,343,58,450,635,482,331,450,450,331,421,421,421,421', +'421,421,421,421,421,421,421,421,421,421,224,310,421,421,421,223,421', +'385,620,641,421,227,61,421,382,382,382,438,421,1002,421,384,421,421', +'310,421,421,421,421,421,611,421,421,421,640,701,360,611,611,611,340', +'347,611,611,611,340,611,421,350,866,421,421,825,421,866,421,611,611', +'611,360,1002,548,421,346,360,1002,611,611,699,611,611,611,611,611,640', +'641,1000,640,702,793,714,1000,1021,1001,893,339,640,1021,1001,893,339', +'540,541,826,703,628,611,611,611,611,611,611,611,611,611,611,611,611', +'611,611,650,650,611,611,611,641,611,611,641,609,611,608,704,611,611', +'626,611,641,611,474,611,225,611,611,754,611,611,611,611,611,356,611', +'97,611,356,564,564,560,560,97,97,97,733,621,97,97,97,611,97,703,611', +'611,611,611,474,611,97,611,97,97,97,226,611,26,444,609,294,608,97,97', +'295,97,97,97,97,97,699,704,621,699,754,699,380,990,990,540,541,826,373', +'375,540,541,826,703,650,373,375,619,97,97,97,97,97,97,97,97,97,97,97', +'97,97,97,379,738,97,97,97,226,97,97,444,704,97,524,524,97,97,26,97,564', +'97,560,97,297,97,97,560,97,97,97,97,97,371,97,100,97,380,380,380,371', +'26,100,100,100,370,614,100,100,100,97,100,370,97,97,97,97,612,97,100', +'97,100,100,100,781,97,922,379,379,379,298,100,100,922,100,100,100,100', +'100,369,299,810,922,810,810,810,369,810,898,949,898,949,949,949,3,949', +'315,315,602,3,319,100,100,100,100,100,100,100,100,100,100,100,100,100', +'100,575,781,100,100,100,305,100,100,781,597,100,41,41,100,100,386,100', +'781,100,206,100,577,100,100,706,100,100,100,100,100,420,100,319,100', +'308,368,781,420,420,420,290,319,368,420,420,290,420,100,810,559,100', +'100,100,100,559,100,949,100,643,315,315,551,100,756,575,575,420,420', +'551,420,420,420,420,420,575,757,706,551,15,386,386,386,383,706,414,577', +'577,367,706,41,41,759,706,760,367,577,420,420,420,420,420,420,420,420', +'420,420,420,420,420,420,643,706,420,420,420,415,420,643,918,761,420', +'918,643,420,493,15,643,381,420,763,420,414,420,420,15,420,420,420,420', +'420,414,420,610,420,764,643,383,383,383,610,610,610,79,765,610,610,610', +'420,610,366,420,420,415,420,79,420,366,610,610,610,610,415,420,334,79', +'355,334,766,610,610,321,610,610,610,610,610,111,321,493,493,493,381', +'381,381,365,656,321,770,656,309,807,365,807,807,807,493,807,774,610', +'610,610,610,610,610,610,610,610,610,610,610,610,610,775,795,610,610', +'610,355,610,610,17,17,610,795,355,610,610,807,610,355,610,780,610,355', +'610,610,807,610,610,610,610,610,46,610,610,610,24,592,330,46,451,330', +'355,24,591,38,795,795,46,610,784,795,610,610,610,610,372,610,314,610', +'690,690,787,372,610,820,820,820,820,820,820,788,451,829,820,820,451', +'451,829,820,791,820,820,820,820,820,820,820,588,354,794,591,38,820,820', +'820,820,820,820,820,591,38,820,316,39,798,798,433,820,820,820,820,820', +'820,820,820,820,820,820,820,582,820,820,820,580,820,820,820,820,820', +'433,433,433,433,433,433,433,433,433,433,433,354,433,433,572,562,433', +'433,354,820,809,39,820,354,811,820,820,354,816,820,39,820,433,320,433', +'820,433,433,843,433,433,433,433,433,820,433,354,819,843,820,820,820', +'820,14,820,820,820,820,323,45,14,543,820,820,40,433,542,433,328,14,820', +'828,820,820,820,618,618,618,618,618,618,843,843,856,618,618,843,537', +'832,618,856,618,618,618,618,618,618,618,833,856,836,837,37,618,618,618', +'618,618,618,618,125,332,618,525,523,125,125,409,618,618,618,618,618', +'618,618,618,618,618,618,618,522,618,618,618,853,618,618,618,618,618', +'409,409,409,409,409,409,409,409,409,409,409,707,409,409,306,333,409', +'409,707,618,857,306,618,707,859,618,618,707,1023,618,306,618,409,22', +'409,618,409,409,335,409,409,409,409,409,618,409,873,874,878,618,618', +'618,618,304,618,618,618,618,879,881,304,882,618,618,884,409,887,514', +'889,304,618,511,618,618,618,499,499,499,499,499,499,895,896,222,499', +'499,902,906,908,499,222,499,499,499,499,499,499,499,911,222,912,913', +'914,499,499,499,499,499,499,499,568,568,499,916,568,568,568,613,499', +'499,499,499,499,499,499,499,499,499,499,499,506,499,499,499,344,499', +'499,499,499,499,613,613,613,613,613,613,613,613,613,613,613,644,613', +'613,303,504,613,613,644,499,501,303,499,644,931,499,499,644,500,499', +'303,499,613,16,613,499,613,613,345,613,613,613,613,613,499,613,349,484', +'480,499,499,499,499,302,499,499,499,499,455,454,302,951,499,499,453', +'613,13,12,452,302,499,351,499,499,499,301,301,301,301,301,301,440,973', +'358,301,301,974,975,10,301,358,301,301,301,301,301,301,301,430,358,422', +'413,980,301,301,301,301,301,301,301,981,972,301,972,972,972,982,972', +'301,301,301,301,301,301,301,301,301,301,301,301,983,301,301,301,984', +'301,301,301,301,301,747,747,747,747,747,747,747,747,747,747,747,510', +'747,747,979,985,747,747,510,301,986,979,301,412,988,301,301,510,410', +'301,979,301,747,991,747,301,747,747,992,747,747,747,747,747,301,747', +'993,994,995,301,301,301,301,928,301,301,301,301,996,999,928,7,301,301', +'406,747,404,401,1012,928,301,395,301,301,301,863,863,863,863,863,863', +'1,1022,929,863,863,649,278,651,863,929,863,863,863,863,863,863,863,654', +'929,646,660,661,863,863,863,863,863,863,863,663,854,863,854,854,854', +'664,854,863,863,863,863,863,863,863,863,863,863,863,863,665,863,863', +'863,674,863,863,863,863,863,839,839,839,839,839,839,839,839,839,839', +'839,1003,839,839,930,645,839,839,1003,863,264,930,863,1003,682,863,863', +'1003,686,863,930,863,839,689,839,863,839,839,692,839,839,839,839,839', +'863,839,697,642,700,863,863,863,863,932,863,863,863,863,1024,279,932', +'639,863,863,637,839,232,282,634,932,863,709,863,863,863,536,536,536', +'536,536,536,,,348,536,536,,,,536,348,536,536,536,536,536,536,536,,348', +',,,536,536,536,536,536,536,536,,,536,498,498,498,498,498,536,536,536', +'536,536,536,536,536,536,536,536,536,,536,536,536,,536,536,536,536,536', +'742,742,742,742,742,742,742,742,742,742,742,,742,742,,,742,742,,536', +',,536,,,536,536,,,536,,536,742,,742,536,742,742,,742,742,742,742,742', +'536,742,,,,536,536,536,536,,536,536,536,536,,,,,536,536,,742,,,,,536', +',536,536,536,539,539,539,539,539,539,,,,539,539,,,,539,,539,539,539', +'539,539,539,539,293,293,293,293,293,539,539,539,539,539,539,539,,,539', +'6,6,6,6,6,539,539,539,539,539,539,539,539,539,539,539,539,,539,539,539', +',539,539,539,539,539,428,428,428,428,428,428,428,428,428,428,428,,428', +'428,,,428,428,,539,,,539,,,539,539,,,539,,539,428,,428,539,428,428,', +'428,428,428,428,428,539,428,,,,539,539,539,539,,539,539,539,539,,,,', +'539,539,,428,,,,,539,,539,539,539,326,326,326,326,326,326,,,,326,326', +',,,326,,326,326,326,326,326,326,326,,,,,,326,326,326,326,326,326,326', +',,326,,,,,,326,326,326,326,326,326,326,326,326,326,326,326,,326,326', +'326,,326,326,326,326,326,749,749,749,749,749,749,749,749,749,749,749', +',749,749,,,749,749,,326,,,326,,,326,326,,,326,,326,749,,749,326,749', +'749,,749,749,749,749,749,326,749,,,,326,326,326,326,,326,326,326,326', +',,,,326,326,,749,,,,,326,,326,326,326,33,33,33,33,33,33,,,,33,33,,,', +'33,,33,33,33,33,33,33,33,,,,,,33,33,33,33,33,33,33,,,33,,,,,,33,33,33', +'33,33,33,33,33,33,33,33,33,,33,33,33,,33,33,33,33,33,648,648,648,648', +'648,648,648,648,648,648,648,,648,648,,,648,648,,33,,,33,,,33,33,,,33', +',33,648,,648,33,648,648,,648,648,648,648,648,33,648,,,,33,33,33,33,', +'33,33,33,33,,,,,33,33,,648,,,,,33,,33,33,33,296,296,296,296,296,296', +',,,296,296,,,,296,,296,296,296,296,296,296,296,,,,,,296,296,296,296', +'296,296,296,,,296,,,,,,296,296,296,296,296,296,296,296,296,296,296,296', +',296,296,296,,296,296,296,296,296,276,276,276,276,276,276,276,276,276', +'276,276,,276,276,,,276,276,,296,,,296,,,296,296,,,296,,296,276,,276', +'296,276,276,,276,276,276,276,276,296,276,,,,296,296,296,296,,296,296', +'296,296,,,,,296,296,,276,,,,,296,,296,296,296,725,725,725,725,725,725', +',,,725,725,,,,725,,725,725,725,725,725,725,725,,,,,,725,725,725,725', +'725,725,725,,,725,,,,,,725,725,725,725,725,725,725,725,725,725,725,725', +',725,725,725,,725,725,725,725,725,473,473,473,473,473,473,473,473,473', +'473,473,,473,473,,,473,473,,725,,,725,,,725,725,,,725,,725,473,,473', +'725,473,473,,473,473,473,473,473,725,473,,,,725,725,725,725,,725,725', +'725,725,,,,,725,725,473,473,,,,,725,,725,725,725,715,715,715,715,715', +'715,,,,715,715,,,,715,,715,715,715,715,715,715,715,,,,,,715,715,715', +'715,715,715,715,,,715,,,,,,715,715,715,715,715,715,715,715,715,715,715', +'715,,715,715,715,,715,715,715,715,715,21,21,21,21,21,21,21,21,21,21', +'21,,21,21,,,21,21,,715,,,715,,,715,715,,,715,,715,21,,21,715,21,21,', +'21,21,21,21,21,715,21,,,,715,715,715,715,,715,715,715,715,,,,,715,715', +',21,,,,,715,,715,715,715,786,786,786,786,786,786,,,,786,786,,,,786,', +'786,786,786,786,786,786,786,,,,,,786,786,786,786,786,786,786,,,786,', +',,,,786,786,786,786,786,786,786,786,786,786,786,786,,786,786,786,,786', +'786,786,786,786,735,735,735,735,735,735,735,735,735,735,735,,735,735', +',,735,735,,786,,,786,,,786,786,,,786,,786,735,,735,786,735,735,,735', +'735,735,735,735,786,735,,,,786,786,786,786,,786,786,786,786,,,,,786', +'786,,735,,,,,786,,786,786,786,710,710,710,710,710,710,,,,710,710,,,', +'710,,710,710,710,710,710,710,710,,,,,,710,710,710,710,710,710,710,,', +'710,,,,,,710,710,710,710,710,710,710,710,710,710,710,710,,710,710,710', +',710,710,710,710,710,842,842,842,842,842,842,842,842,842,842,842,,842', +'842,,,842,842,,710,,,710,,,710,710,,,710,,710,842,,842,710,842,842,', +'842,842,842,842,842,710,842,,,,710,710,710,710,,710,710,710,710,,,,', +'710,710,,842,,,,,710,,710,710,710,773,773,773,773,773,773,,,,773,773', +',,,773,,773,773,773,773,773,773,773,,,,,,773,773,773,773,773,773,773', +',,773,,,,,,773,773,773,773,773,773,773,773,773,773,773,773,,773,773', +'773,,773,773,773,773,773,740,740,740,740,740,740,740,740,740,740,740', +',740,740,,,740,740,,773,,,773,,,773,773,,,773,,773,740,,740,773,740', +'740,,740,740,740,740,740,773,740,,,,773,773,773,773,,773,773,773,773', +',,,,773,773,,740,,,,,773,,773,773,773,231,231,231,231,231,231,,,,231', +'231,,,,231,,231,231,231,231,231,231,231,,,,,,231,231,231,231,231,231', +'231,,,231,,,,,,231,231,231,231,231,231,231,231,231,231,231,231,,231', +'231,231,,231,231,231,231,231,520,520,520,520,520,520,520,520,520,520', +'520,,520,520,,,520,520,,231,,,231,,,231,231,,,231,,231,520,,520,231', +'520,520,,520,520,520,520,520,231,520,,,,231,231,231,231,,231,231,231', +'231,,,,,231,231,,520,,,,,231,,231,231,231,0,0,0,0,0,0,,,,0,0,,,,0,,0', +'0,0,0,0,0,0,,,,,,0,0,0,0,0,0,0,,,0,,,,,,0,0,0,0,0,0,0,0,0,0,0,0,,0,0', +'0,,0,0,0,0,0,745,745,745,745,745,745,745,745,745,745,745,,745,745,,', +'745,745,,0,,,0,,,0,0,,,0,,0,745,,745,0,745,745,,745,745,745,745,745', +'0,745,,,,0,0,0,0,,0,0,0,0,,,,,0,0,,745,,,,,0,,0,0,0,960,960,960,960', +'960,960,,,,960,960,,,,960,,960,960,960,960,960,960,960,,,,,,960,960', +'960,960,960,960,960,,888,960,888,888,888,,888,960,960,960,960,960,960', +'960,960,960,960,960,960,,960,960,960,,960,960,960,960,960,675,,675,675', +'675,,675,,888,,890,,890,890,890,,890,888,,960,,,960,,,960,960,,469,960', +',960,,,,960,,675,,,,,,,960,,675,890,,960,960,960,960,,960,960,960,960', +',,469,,960,960,469,469,,469,469,,960,,960,960,960,958,958,958,958,958', +'958,,,,958,958,,,,958,,958,958,958,958,958,958,958,,,,,,958,958,958', +'958,958,958,958,,,958,,,470,,,958,958,958,958,958,958,958,958,958,958', +'958,958,,958,958,958,,958,958,958,958,958,465,465,465,465,465,465,465', +'470,,465,465,470,470,,470,470,465,465,,958,,,958,,,958,958,,,958,,958', +'465,,465,958,465,465,,465,465,465,465,465,958,465,,,,958,958,958,958', +',958,958,958,958,,,,,958,958,,987,,987,987,987,958,987,958,958,958,952', +'952,952,952,952,952,,,,952,952,,,,952,,952,952,952,952,952,952,952,', +',,,987,952,952,952,952,952,952,952,,989,952,989,989,989,,989,952,952', +'952,952,952,952,952,952,952,952,952,952,,952,952,952,,952,952,952,952', +'952,466,466,466,466,466,466,466,,989,466,466,,,,,,466,466,,952,,,952', +',,952,952,,,952,,952,466,,466,952,466,466,,466,466,466,466,466,952,466', +',,,952,952,952,952,,952,952,952,952,,,,,952,952,,1011,,1011,1011,1011', +'952,1011,952,952,952,935,935,935,935,935,935,,,,935,935,,,,935,,935', +'935,935,935,935,935,935,,,,,1011,935,935,935,935,935,935,935,,,935,', +',,,,935,935,935,935,935,935,935,935,935,935,935,935,,935,935,935,,935', +'935,935,935,935,449,449,449,449,449,449,449,449,449,449,449,,449,449', +',,449,449,,935,,,935,,,935,935,,,935,,935,449,,449,935,449,449,,449', +'449,449,449,449,935,449,,,,935,935,935,935,,935,935,935,935,,,,,935', +'935,,950,,950,950,950,935,950,935,935,935,830,830,830,830,830,830,,', +',830,830,,,,830,,830,830,830,830,830,830,830,,,,,950,830,830,830,830', +'830,830,830,,,830,,,,,,830,830,830,830,830,830,830,830,830,830,830,830', +',830,830,830,,830,830,830,830,830,459,459,459,459,459,459,459,,,459', +'459,,,,,,459,459,,830,,,830,,,830,830,,,830,,830,459,,459,830,459,459', +',459,459,459,459,459,830,459,,,,830,830,830,830,,830,830,830,830,,,', +',830,830,,,,,,,830,,830,830,830,824,824,824,824,824,824,,,,824,824,', +',,824,,824,824,824,824,824,824,824,,,,,,824,824,824,824,824,824,824', +',,824,,,,,,824,824,824,824,824,824,824,824,824,824,824,824,,824,824', +'824,,824,824,824,824,824,472,472,472,472,472,472,472,472,,472,472,,', +',,,472,472,,824,,,824,,,824,824,,,824,,824,472,,472,824,472,472,,472', +'472,472,472,472,824,472,,,,824,824,824,824,,824,824,824,824,,,,,824', +'824,,,,,,,824,,824,824,824,624,624,624,624,624,624,,,,624,624,,,,624', +',624,624,624,624,624,624,624,,,,,,624,624,624,624,624,624,624,,,624', +',,,,,624,624,624,624,624,624,624,624,624,624,624,624,,624,624,624,,624', +'624,624,624,624,448,448,448,448,448,448,448,448,448,448,448,,448,448', +',,448,448,,624,,,624,,,624,624,,,624,,624,448,,448,624,448,448,,448', +'448,448,448,448,624,448,,,,624,624,624,624,,624,624,624,624,,,,,624', +'624,,,,,,,624,,624,624,624,934,934,934,934,934,934,,,,934,934,,,,934', +',934,934,934,934,934,934,934,,,,,,934,934,934,934,934,934,934,,,934', +',,,,,934,934,934,934,934,934,934,934,934,934,934,934,,934,934,934,,934', +'934,934,934,934,463,,,,,,,,,,,,,,,,463,463,,934,,,934,,,934,934,,,934', +',934,463,,463,934,463,463,,463,463,,,463,934,463,,,,934,934,934,934', +',934,934,934,934,,,,,934,934,,,,,,,934,,934,934,934,623,623,623,623', +'623,623,,,,623,623,,,,623,,623,623,623,623,623,623,623,,,,,,623,623', +'623,623,623,623,623,,,623,,,,,,623,623,623,623,623,623,623,623,623,623', +'623,623,,623,623,623,,623,623,623,623,623,464,464,464,464,464,464,464', +',,464,464,,,,,,464,464,,623,,,623,,,623,623,,,623,,623,464,,464,623', +'464,464,,464,464,464,464,464,623,464,,,,623,623,623,623,,623,623,623', +'623,,,,,623,623,,,,,,,623,,623,623,623,123,123,123,123,123,123,,,,123', +'123,,,,123,,123,123,123,123,123,123,123,,,,,,123,123,123,123,123,123', +'123,,,123,,,,,,123,123,123,123,123,123,123,123,123,123,123,123,,123', +'123,123,,123,123,123,123,123,471,471,471,471,471,471,471,,,471,471,', +',,,,471,471,,123,,,123,,,123,123,,,123,,123,471,,471,123,471,471,,471', +'471,471,471,471,123,471,,,,123,123,123,123,,123,123,123,123,,,,,123', +'123,,,,,,,123,,123,123,123,927,927,927,927,927,927,,,,927,927,,,,927', +',927,927,927,927,927,927,927,,,,,,927,927,927,927,927,927,927,,,927', +',,,,,927,927,927,927,927,927,927,927,927,927,927,927,,927,927,927,,927', +'927,927,927,927,461,,,,,,,,,,,,,,,,461,461,,927,,,927,,,927,927,,,927', +',927,461,,461,927,461,461,,461,461,,,461,927,461,,,,927,927,927,927', +',927,927,927,927,,,,,927,927,,,,,,,927,,927,927,927,561,561,561,561', +'561,561,,,,561,561,,,,561,,561,561,561,561,561,561,561,,,,,,561,561', +'561,561,561,561,561,,,561,,,,,,561,561,561,561,561,561,561,561,561,561', +'561,561,,561,561,561,,561,561,561,561,561,460,,,,,,,,,,,,,,,,460,460', +',561,,,561,,,561,561,,,561,,561,460,,460,561,460,460,,460,460,,,460', +'561,460,,,,561,561,561,561,,561,561,561,561,,,,,561,561,,,,,,,561,,561', +'561,561,208,208,208,208,208,208,,,,208,208,,,,208,,208,208,208,208,208', +'208,208,,,,,,208,208,208,208,208,208,208,,,208,,,,,,208,208,208,208', +'208,208,208,208,208,208,208,208,,208,208,208,,208,208,208,208,208,462', +',,,,,,,,,,,,,,,462,462,,208,,,208,,,208,208,,,208,,208,462,,462,208', +'462,462,,462,462,,,462,208,462,,,,208,208,208,208,,208,208,208,208,', +',,,208,208,,,,,,,208,,208,208,208,821,821,821,821,821,821,,,,821,821', +',,,821,,821,821,821,821,821,821,821,,,,,,821,821,821,821,821,821,821', +',,821,,,,,,821,821,821,821,821,821,821,821,821,821,821,821,,821,821', +'821,,821,821,821,821,821,467,467,467,467,467,467,467,,,467,467,,,,,', +'467,467,,821,,,821,,,821,821,,,821,,821,467,,467,821,467,467,,467,467', +'467,467,467,821,467,,,,821,821,821,821,,821,821,821,821,,,,,821,821', +',,,210,210,210,821,210,821,821,821,210,210,,,,210,,210,210,210,210,210', +'210,210,,,,,,210,210,210,210,210,210,210,,,210,,,,,,,210,,,210,210,210', +'210,210,210,210,210,,210,210,210,,210,210,210,210,210,468,468,468,468', +'468,468,468,,,468,468,,,,,,468,468,,210,,,210,,,210,210,,,210,,,468', +',468,210,468,468,,468,468,468,468,468,210,468,,,,210,210,210,210,,210', +'210,210,210,,,,,210,210,,,,211,211,211,210,211,210,210,210,211,211,', +',,211,,211,211,211,211,211,211,211,,,,,,211,211,211,211,211,211,211', +',,211,,,,,,,211,,,211,211,211,211,211,211,211,211,211,211,211,211,,211', +'211,211,211,211,456,,,,,,,,,,,,,,,,456,456,,211,,,211,,,211,211,,,211', +',211,456,211,456,211,456,456,211,456,456,,,,211,,,,,211,211,211,211', +',211,211,211,211,,,,,211,211,,,,752,752,752,211,752,211,211,211,752', +'752,,,,752,,752,752,752,752,752,752,752,,,,,,752,752,752,752,752,752', +'752,,,752,,,,,,,752,,,752,752,752,752,752,752,752,752,,752,752,752,', +'752,752,752,752,752,458,,,,,,,,,,,,,,,,458,458,,752,,,752,,,752,752', +',,752,,,458,,,752,458,458,,458,458,,,,752,,,,,752,752,752,752,,752,752', +'752,752,,,,,752,752,,,,751,751,751,752,751,752,752,752,751,751,,,,751', +',751,751,751,751,751,751,751,,,,,,751,751,751,751,751,751,751,,,751', +',,,,,,751,,,751,751,751,751,751,751,751,751,,751,751,751,,751,751,751', +'751,751,457,,,,,,,,,,,,,,,,457,457,,751,,,751,,,751,751,,,751,,,457', +',457,751,457,457,,457,457,,,,751,,,,,751,751,751,751,,751,751,751,751', +',,,,751,751,,,,214,214,214,751,214,751,751,751,214,214,,,,214,,214,214', +'214,214,214,214,214,,,,,,214,214,214,214,214,214,214,,,214,,,,,,,214', +',,214,214,214,214,214,214,214,214,,214,214,214,,214,214,214,214,214', +',,,,,,,,,,,,,,,,,,,214,,,214,,,214,214,,,214,,,,,,214,,,,,,,,,214,,', +',,214,214,214,214,,214,214,214,214,,,,,214,214,,,,215,215,215,214,215', +'214,214,214,215,215,,,,215,,215,215,215,215,215,215,215,,,,,,215,215', +'215,215,215,215,215,,,215,,,,,,,215,,,215,215,215,215,215,215,215,215', +',215,215,215,,215,215,215,215,215,,,,,,,,,,,,,,,,,,,,215,,,215,,,215', +'215,,,215,,215,,,,215,,,,,,,,,215,,,,,215,215,215,215,,215,215,215,215', +',,,,215,215,,,,216,216,216,215,216,215,215,215,216,216,,,,216,,216,216', +'216,216,216,216,216,,,,,,216,216,216,216,216,216,216,,,216,,,,,,,216', +',,216,216,216,216,216,216,216,216,,216,216,216,,216,216,216,216,216', +',,,,,,,,,,,,,,,,,,,216,,,216,,,216,216,,,216,,,,,,216,,,,,,,,,216,,', +',,216,216,216,216,,216,216,216,216,,,,,216,216,,,,217,217,217,216,217', +'216,216,216,217,217,,,,217,,217,217,217,217,217,217,217,,,,,,217,217', +'217,217,217,217,217,,,217,,,,,,,217,,,217,217,217,217,217,217,217,217', +',217,217,217,,217,217,217,217,217,,,,,,,,,,,,,,,,,,,,217,,,217,,,217', +'217,,,217,,,,,,217,,,,,,,,,217,,,,,217,217,217,217,,217,217,217,217', +',,,,217,217,,,,218,218,218,217,218,217,217,217,218,218,,,,218,,218,218', +'218,218,218,218,218,,,,,,218,218,218,218,218,218,218,,,218,,,,,,,218', +',,218,218,218,218,218,218,218,218,,218,218,218,,218,218,218,218,218', +',,,,,,,,,,,,,,,,,,,218,,,218,,,218,218,,,218,,,,,,218,,,,,,,,,218,,', +',,218,218,218,218,,218,218,218,218,,,,,218,218,,,,219,219,219,218,219', +'218,218,218,219,219,,,,219,,219,219,219,219,219,219,219,,,,,,219,219', +'219,219,219,219,219,,,219,,,,,,,219,,,219,219,219,219,219,219,219,219', +',219,219,219,,219,219,219,219,219,,,,,,,,,,,,,,,,,,,,219,,,219,,,219', +'219,,,219,,,,,,219,,,,,,,,,219,,,,,219,219,219,219,,219,219,219,219', +',,,,219,219,219,,,750,750,750,219,750,219,219,219,750,750,,,,750,,750', +'750,750,750,750,750,750,,,,,,750,750,750,750,750,750,750,,,750,,,,,', +',750,,,750,750,750,750,750,750,750,750,,750,750,750,,750,750,750,750', +'750,,,,,,,,,,,,,,,,,,,,750,,,750,,,750,750,,,750,,,,,,750,,,,,,,,,750', +',,,,750,750,750,750,,750,750,750,750,,,,,750,750,,,,736,736,736,750', +'736,750,750,750,736,736,,,,736,,736,736,736,736,736,736,736,,,,,,736', +'736,736,736,736,736,736,,,736,,,,,,,736,,,736,736,736,736,736,736,736', +'736,,736,736,736,,736,736,736,736,736,,,,,,,,,,,,,,,,,,,,736,,,736,', +',736,736,,,736,,,,,,736,,,,,,,,,736,,,,,736,736,736,736,,736,736,736', +'736,,,,,736,736,,,,734,734,734,736,734,736,736,736,734,734,,,,734,,734', +'734,734,734,734,734,734,,,,,,734,734,734,734,734,734,734,,,734,,,,,', +',734,,,734,734,734,734,734,734,734,734,,734,734,734,,734,734,734,734', +'734,,,,,,,,,,,,,,,,,,,,734,,,734,,,734,734,,,734,,,,,,734,,,,,,,,,734', +',,,,734,734,734,734,,734,734,734,734,,,,,734,734,,,,711,711,711,734', +'711,734,734,734,711,711,,,,711,,711,711,711,711,711,711,711,,,,,,711', +'711,711,711,711,711,711,,,711,,,,,,,711,,,711,711,711,711,711,711,711', +'711,,711,711,711,,711,711,711,711,711,,,,,,,,,,,,,,,,,,,,711,,,711,', +',711,711,,,711,,,,,,711,,,,,,,,,711,,,,,711,711,711,711,,711,711,711', +'711,,,,,711,711,,,,230,230,230,711,230,711,711,711,230,230,,,,230,,230', +'230,230,230,230,230,230,,,,,,230,230,230,230,230,230,230,,,230,,,,,', +',230,,,230,230,230,230,230,230,230,230,,230,230,230,,230,230,230,230', +'230,,,,,,,,,,,,,,,,,,,,230,,,230,,,230,230,,,230,,,,,,230,,,,,,,,,230', +',,,,230,230,230,230,,230,230,230,230,,,,,230,230,,,,705,705,705,230', +'705,230,230,230,705,705,,,,705,,705,705,705,705,705,705,705,,,,,,705', +'705,705,705,705,705,705,,,705,,,,,,,705,,,705,705,705,705,705,705,705', +'705,,705,705,705,,705,705,705,705,705,,,,,,,,,,,,,,,,,,,,705,,,705,', +',705,705,,,705,,,,,,705,,,,,,,,,705,,,,,705,705,705,705,,705,705,705', +'705,,,,,705,705,,,,233,233,233,705,233,705,705,705,233,233,,,,233,,233', +'233,233,233,233,233,233,,,,,,233,233,233,233,233,233,233,,,233,,,,,', +',233,,,233,233,233,233,233,233,233,233,,233,233,233,,233,233,233,233', +'233,,,,,,,,,,,,,,,,,,,,233,,,233,,,233,233,,,233,,,,,,233,,,,,,,,,233', +',,,,233,233,233,233,,233,233,233,233,,,,,233,233,,,,234,234,234,233', +'234,233,233,233,234,234,,,,234,,234,234,234,234,234,234,234,,,,,,234', +'234,234,234,234,234,234,,,234,,,,,,,234,,,234,234,234,234,234,234,234', +'234,,234,234,234,,234,234,234,234,234,,,,,,,,,,,,,,,,,,,,234,,,234,', +',234,234,,,234,,,,,,234,,,,,,,,,234,,,,,234,234,234,234,,234,234,234', +'234,,,,,234,234,,,,235,235,235,234,235,234,234,234,235,235,,,,235,,235', +'235,235,235,235,235,235,,,,,,235,235,235,235,235,235,235,,,235,,,,,', +',235,,,235,235,235,235,235,235,235,235,,235,235,235,,235,235,235,235', +'235,,,,,,,,,,,,,,,,,,,,235,,,235,,,235,235,,,235,,,,,,235,,,,,,,,,235', +',,,,235,235,235,235,,235,235,235,235,,,,,235,235,,,,236,236,236,235', +'236,235,235,235,236,236,,,,236,,236,236,236,236,236,236,236,,,,,,236', +'236,236,236,236,236,236,,,236,,,,,,,236,,,236,236,236,236,236,236,236', +'236,,236,236,236,,236,236,236,236,236,,,,,,,,,,,,,,,,,,,,236,,,236,', +',236,236,,,236,,,,,,236,,,,,,,,,236,,,,,236,236,236,236,,236,236,236', +'236,,,,,236,236,,,,237,237,237,236,237,236,236,236,237,237,,,,237,,237', +'237,237,237,237,237,237,,,,,,237,237,237,237,237,237,237,,,237,,,,,', +',237,,,237,237,237,237,237,237,237,237,,237,237,237,,237,237,237,237', +'237,,,,,,,,,,,,,,,,,,,,237,,,237,,,237,237,,,237,,,,,,237,,,,,,,,,237', +',,,,237,237,237,237,,237,237,237,237,,,,,237,237,,,,238,238,238,237', +'238,237,237,237,238,238,,,,238,,238,238,238,238,238,238,238,,,,,,238', +'238,238,238,238,238,238,,,238,,,,,,,238,,,238,238,238,238,238,238,238', +'238,,238,238,238,,238,238,238,238,238,,,,,,,,,,,,,,,,,,,,238,,,238,', +',238,238,,,238,,,,,,238,,,,,,,,,238,,,,,238,238,238,238,,238,238,238', +'238,,,,,238,238,,,,239,239,239,238,239,238,238,238,239,239,,,,239,,239', +'239,239,239,239,239,239,,,,,,239,239,239,239,239,239,239,,,239,,,,,', +',239,,,239,239,239,239,239,239,239,239,,239,239,239,,239,239,239,239', +'239,,,,,,,,,,,,,,,,,,,,239,,,239,,,239,239,,,239,,,,,,239,,,,,,,,,239', +',,,,239,239,239,239,,239,239,239,239,,,,,239,239,,,,240,240,240,239', +'240,239,239,239,240,240,,,,240,,240,240,240,240,240,240,240,,,,,,240', +'240,240,240,240,240,240,,,240,,,,,,,240,,,240,240,240,240,240,240,240', +'240,,240,240,240,,240,240,240,240,240,,,,,,,,,,,,,,,,,,,,240,,,240,', +',240,240,,,240,,,,,,240,,,,,,,,,240,,,,,240,240,240,240,,240,240,240', +'240,,,,,240,240,,,,241,241,241,240,241,240,240,240,241,241,,,,241,,241', +'241,241,241,241,241,241,,,,,,241,241,241,241,241,241,241,,,241,,,,,', +',241,,,241,241,241,241,241,241,241,241,,241,241,241,,241,241,241,241', +'241,,,,,,,,,,,,,,,,,,,,241,,,241,,,241,241,,,241,,,,,,241,,,,,,,,,241', +',,,,241,241,241,241,,241,241,241,241,,,,,241,241,,,,242,242,242,241', +'242,241,241,241,242,242,,,,242,,242,242,242,242,242,242,242,,,,,,242', +'242,242,242,242,242,242,,,242,,,,,,,242,,,242,242,242,242,242,242,242', +'242,,242,242,242,,242,242,242,242,242,,,,,,,,,,,,,,,,,,,,242,,,242,', +',242,242,,,242,,,,,,242,,,,,,,,,242,,,,,242,242,242,242,,242,242,242', +'242,,,,,242,242,,,,243,243,243,242,243,242,242,242,243,243,,,,243,,243', +'243,243,243,243,243,243,,,,,,243,243,243,243,243,243,243,,,243,,,,,', +',243,,,243,243,243,243,243,243,243,243,,243,243,243,,243,243,243,243', +'243,,,,,,,,,,,,,,,,,,,,243,,,243,,,243,243,,,243,,,,,,243,,,,,,,,,243', +',,,,243,243,243,243,,243,243,243,243,,,,,243,243,,,,244,244,244,243', +'244,243,243,243,244,244,,,,244,,244,244,244,244,244,244,244,,,,,,244', +'244,244,244,244,244,244,,,244,,,,,,,244,,,244,244,244,244,244,244,244', +'244,,244,244,244,,244,244,244,244,244,,,,,,,,,,,,,,,,,,,,244,,,244,', +',244,244,,,244,,,,,,244,,,,,,,,,244,,,,,244,244,244,244,,244,244,244', +'244,,,,,244,244,,,,245,245,245,244,245,244,244,244,245,245,,,,245,,245', +'245,245,245,245,245,245,,,,,,245,245,245,245,245,245,245,,,245,,,,,', +',245,,,245,245,245,245,245,245,245,245,,245,245,245,,245,245,245,245', +'245,,,,,,,,,,,,,,,,,,,,245,,,245,,,245,245,,,245,,,,,,245,,,,,,,,,245', +',,,,245,245,245,245,,245,245,245,245,,,,,245,245,,,,246,246,246,245', +'246,245,245,245,246,246,,,,246,,246,246,246,246,246,246,246,,,,,,246', +'246,246,246,246,246,246,,,246,,,,,,,246,,,246,246,246,246,246,246,246', +'246,,246,246,246,,246,246,246,246,246,,,,,,,,,,,,,,,,,,,,246,,,246,', +',246,246,,,246,,,,,,246,,,,,,,,,246,,,,,246,246,246,246,,246,246,246', +'246,,,,,246,246,,,,247,247,247,246,247,246,246,246,247,247,,,,247,,247', +'247,247,247,247,247,247,,,,,,247,247,247,247,247,247,247,,,247,,,,,', +',247,,,247,247,247,247,247,247,247,247,,247,247,247,,247,247,247,247', +'247,,,,,,,,,,,,,,,,,,,,247,,,247,,,247,247,,,247,,,,,,247,,,,,,,,,247', +',,,,247,247,247,247,,247,247,247,247,,,,,247,247,,,,248,248,248,247', +'248,247,247,247,248,248,,,,248,,248,248,248,248,248,248,248,,,,,,248', +'248,248,248,248,248,248,,,248,,,,,,,248,,,248,248,248,248,248,248,248', +'248,,248,248,248,,248,248,248,248,248,,,,,,,,,,,,,,,,,,,,248,,,248,', +',248,248,,,248,,,,,,248,,,,,,,,,248,,,,,248,248,248,248,,248,248,248', +'248,,,,,248,248,,,,249,249,249,248,249,248,248,248,249,249,,,,249,,249', +'249,249,249,249,249,249,,,,,,249,249,249,249,249,249,249,,,249,,,,,', +',249,,,249,249,249,249,249,249,249,249,,249,249,249,,249,249,249,249', +'249,,,,,,,,,,,,,,,,,,,,249,,,249,,,249,249,,,249,,,,,,249,,,,,,,,,249', +',,,,249,249,249,249,,249,249,249,249,,,,,249,249,,,,250,250,250,249', +'250,249,249,249,250,250,,,,250,,250,250,250,250,250,250,250,,,,,,250', +'250,250,250,250,250,250,,,250,,,,,,,250,,,250,250,250,250,250,250,250', +'250,,250,250,250,,250,250,250,250,250,,,,,,,,,,,,,,,,,,,,250,,,250,', +',250,250,,,250,,,,,,250,,,,,,,,,250,,,,,250,250,250,250,,250,250,250', +'250,,,,,250,250,,,,251,251,251,250,251,250,250,250,251,251,,,,251,,251', +'251,251,251,251,251,251,,,,,,251,251,251,251,251,251,251,,,251,,,,,', +',251,,,251,251,251,251,251,251,251,251,,251,251,251,,251,251,251,251', +'251,,,,,,,,,,,,,,,,,,,,251,,,251,,,251,251,,,251,,,,,,251,,,,,,,,,251', +',,,,251,251,251,251,,251,251,251,251,,,,,251,251,,,,252,252,252,251', +'252,251,251,251,252,252,,,,252,,252,252,252,252,252,252,252,,,,,,252', +'252,252,252,252,252,252,,,252,,,,,,,252,,,252,252,252,252,252,252,252', +'252,,252,252,252,,252,252,252,252,252,,,,,,,,,,,,,,,,,,,,252,,,252,', +',252,252,,,252,,,,,,252,,,,,,,,,252,,,,,252,252,252,252,,252,252,252', +'252,,,,,252,252,,,,253,253,253,252,253,252,252,252,253,253,,,,253,,253', +'253,253,253,253,253,253,,,,,,253,253,253,253,253,253,253,,,253,,,,,', +',253,,,253,253,253,253,253,253,253,253,,253,253,253,,253,253,253,253', +'253,,,,,,,,,,,,,,,,,,,,253,,,253,,,253,253,,,253,,,,,,253,,,,,,,,,253', +',,,,253,253,253,253,,253,253,253,253,,,,,253,253,,,,254,254,254,253', +'254,253,253,253,254,254,,,,254,,254,254,254,254,254,254,254,,,,,,254', +'254,254,254,254,254,254,,,254,,,,,,,254,,,254,254,254,254,254,254,254', +'254,,254,254,254,,254,254,254,254,254,,,,,,,,,,,,,,,,,,,,254,,,254,', +',254,254,,,254,,,,,,254,,,,,,,,,254,,,,,254,254,254,254,,254,254,254', +'254,,,,,254,254,,,,255,255,255,254,255,254,254,254,255,255,,,,255,,255', +'255,255,255,255,255,255,,,,,,255,255,255,255,255,255,255,,,255,,,,,', +',255,,,255,255,255,255,255,255,255,255,,255,255,255,,255,255,255,255', +'255,,,,,,,,,,,,,,,,,,,,255,,,255,,,255,255,,,255,,,,,,255,,,,,,,,,255', +',,,,255,255,255,255,,255,255,255,255,,,,,255,255,,,,256,256,256,255', +'256,255,255,255,256,256,,,,256,,256,256,256,256,256,256,256,,,,,,256', +'256,256,256,256,256,256,,,256,,,,,,,256,,,256,256,256,256,256,256,256', +'256,,256,256,256,,256,256,256,256,256,,,,,,,,,,,,,,,,,,,,256,,,256,', +',256,256,,,256,,,,,,256,,,,,,,,,256,,,,,256,256,256,256,,256,256,256', +'256,,,,,256,256,,,,257,257,257,256,257,256,256,256,257,257,,,,257,,257', +'257,257,257,257,257,257,,,,,,257,257,257,257,257,257,257,,,257,,,,,', +',257,,,257,257,257,257,257,257,257,257,,257,257,257,,257,257,257,257', +'257,,,,,,,,,,,,,,,,,,,,257,,,257,,,257,257,,,257,,,,,,257,,,,,,,,,257', +',,,,257,257,257,257,,257,257,257,257,,,,,257,257,,,,258,258,258,257', +'258,257,257,257,258,258,,,,258,,258,258,258,258,258,258,258,,,,,,258', +'258,258,258,258,258,258,,,258,,,,,,,258,,,258,258,258,258,258,258,258', +'258,,258,258,258,,258,258,258,258,258,,,,,,,,,,,,,,,,,,,,258,,,258,', +',258,258,,,258,,,,,,258,,,,,,,,,258,,,,,258,258,258,258,,258,258,258', +'258,,,,,258,258,,,,678,678,678,258,678,258,258,258,678,678,,,,678,,678', +'678,678,678,678,678,678,,,,,,678,678,678,678,678,678,678,,,678,,,,,', +',678,,,678,678,678,678,678,678,678,678,,678,678,678,,678,678,678,678', +'678,,,,,,,,,,,,,,,,,,,,678,,,678,,,678,678,,,678,,,,,,678,,,,,,,,,678', +',,,,678,678,678,678,,678,678,678,678,,,,,678,678,,,,265,265,265,678', +'265,678,678,678,265,265,,,,265,,265,265,265,265,265,265,265,,,,,,265', +'265,265,265,265,265,265,,,265,,,,,,,265,,,265,265,265,265,265,265,265', +'265,265,265,265,265,,265,265,265,265,265,,,,,,,,,,,,,,,,,,,,265,,,265', +',,265,265,,,265,,265,,265,,265,,,265,,,,,,265,,,,,265,265,265,265,,265', +'265,265,265,,,,,265,265,,,,266,266,266,265,266,265,265,265,266,266,', +',,266,,266,266,266,266,266,266,266,,,,,,266,266,266,266,266,266,266', +',,266,,,,,,,266,,,266,266,266,266,266,266,266,266,266,266,266,266,,266', +'266,266,266,266,,,,,,,,,,,,,,,,,,,,266,,,266,,,266,266,,,266,,266,,266', +',266,,,266,,,,,,266,,,,,266,266,266,266,,266,266,266,266,,,,,266,266', +',,,274,274,274,266,274,266,266,266,274,274,,,,274,,274,274,274,274,274', +'274,274,,,,,,274,274,274,274,274,274,274,,,274,,,,,,,274,,,274,274,274', +'274,274,274,274,274,274,274,274,274,,274,274,274,274,274,,,,,,,,,,,', +',,,,,,,,274,,,274,,,274,274,,,274,,274,,274,,274,,,274,,,,,,274,,,,', +'274,274,274,274,,274,274,274,274,,,,,274,274,274,,,652,652,652,274,652', +'274,274,274,652,652,,,,652,,652,652,652,652,652,652,652,,,,,,652,652', +'652,652,652,652,652,,,652,,,,,,,652,,,652,652,652,652,652,652,652,652', +',652,652,652,,652,652,652,652,652,,,,,,,,,,,,,,,,,,,,652,,,652,,,652', +'652,,,652,,652,,,,652,,,,,,,,,652,,,,,652,652,652,652,,652,652,652,652', +',,,,652,652,,,,647,647,647,652,647,652,652,652,647,647,,,,647,,647,647', +'647,647,647,647,647,,,,,,647,647,647,647,647,647,647,,,647,,,,,,,647', +',,647,647,647,647,647,647,647,647,,647,647,647,,647,647,,,647,,,,,,', +',,,,,,,,,,,,,647,,,647,,,647,647,,,647,,,,,,,,,,,,,,,,,,,,647,647,647', +'647,,647,647,647,647,,,,,647,647,,,,281,281,281,647,281,647,647,647', +'281,281,,,,281,,281,281,281,281,281,281,281,,,,,,281,281,281,281,281', +'281,281,,,281,,,,,,,281,,,281,281,281,281,281,281,281,281,,281,281,281', +',281,281,281,281,281,,,,,,,,,,,,,,,,,,,,281,,,281,,,281,281,,,281,,', +',,,281,,,,,,,,,281,,,,,281,281,281,281,,281,281,281,281,,,,,281,281', +',,,636,636,636,281,636,281,281,281,636,636,,,,636,,636,636,636,636,636', +'636,636,,,,,,636,636,636,636,636,636,636,,,636,,,,,,,636,,,636,636,636', +'636,636,636,636,636,,636,636,636,,636,636,,,636,,,,,,,,,,,,,,,,,,,,636', +',,636,,,636,636,,,636,,,,,,,,,,,,,,,,,,,,636,636,636,636,,636,636,636', +'636,,,,,636,636,,,,283,283,283,636,283,636,636,636,283,283,,,,283,,283', +'283,283,283,283,283,283,,,,,,283,283,283,283,283,283,283,,,283,,,,,', +',283,,,283,283,283,283,283,283,283,283,,283,283,283,,283,283,283,283', +'283,,,,,,,,,,,,,,,,,,,,283,,,283,,,283,283,,,283,,,,,,283,,,,,,,,,283', +',,,,283,283,283,283,,283,283,283,283,,,,,283,283,,,,286,286,286,283', +'286,283,283,283,286,286,,,,286,,286,286,286,286,286,286,286,,,,,,286', +'286,286,286,286,286,286,,,286,,,,,,,286,,,286,286,286,286,286,286,286', +'286,,286,286,286,,286,286,286,286,286,,,,,,,,,,,,,,,,,,,,286,,,286,', +',286,286,,,286,,,,,,286,,,,,,,,,286,,,,,286,286,286,286,,286,286,286', +'286,,,,,286,286,,,,287,287,287,286,287,286,286,286,287,287,,,,287,,287', +'287,287,287,287,287,287,,,,,,287,287,287,287,287,287,287,,,287,,,,,', +',287,,,287,287,287,287,287,287,287,287,,287,287,287,,287,287,287,287', +'287,,,,,,,,,,,,,,,,,,,,287,,,287,,,287,287,,,287,,,,,,287,,,,,,,,,287', +',,,,287,287,287,287,,287,287,287,287,,,,,287,287,,,,632,632,632,287', +'632,287,287,287,632,632,,,,632,,632,632,632,632,632,632,632,,,,,,632', +'632,632,632,632,632,632,,,632,,,,,,,632,,,632,632,632,632,632,632,632', +'632,,632,632,632,,632,632,632,632,632,,,,,,,,,,,,,,,,,,,,632,,,632,', +',632,632,,,632,,,,,,632,,,,,,,,,632,,,,,632,632,632,632,,632,632,632', +'632,,,,,632,632,,,,,,,632,,632,632,632,292,292,292,292,292,,,,292,292', +',,,292,,292,292,292,292,292,292,292,,,,,,292,292,292,292,292,292,292', +',,292,,,,,,292,292,,292,292,292,292,292,292,292,292,292,,292,292,292', +',292,292,292,292,292,,,,,,,,,,,,,,,,,,,,292,,,292,,,292,292,,,292,,292', +',,,292,,,,,,,,,292,,,,,292,292,292,292,,292,292,292,292,,,,,292,292', +',,,629,629,629,292,629,292,292,292,629,629,,,,629,,629,629,629,629,629', +'629,629,,,,,,629,629,629,629,629,629,629,,,629,,,,,,,629,,,629,629,629', +'629,629,629,629,629,,629,629,629,,629,629,629,629,629,,,,,,,,,,,,,,', +',,,,,629,,,629,,,629,629,,,629,,,,,,629,,,,,,,,,629,,,,,629,629,629', +'629,,629,629,629,629,,,,,629,629,,,,67,67,67,629,67,629,629,629,67,67', +',,,67,,67,67,67,67,67,67,67,,,,,,67,67,67,67,67,67,67,,,67,,,,,,,67', +',,67,67,67,67,67,67,67,67,,67,67,67,,67,67,67,67,67,,,,,,,,,,,,,,,,', +',,,67,,,67,,,67,67,,,67,,,,,,67,,,,,,,,,67,,,,,67,67,67,67,,67,67,67', +'67,,,,,67,67,67,,,,,67,67,,67,67,67,5,5,5,5,5,,,,5,5,,,,5,,5,5,5,5,5', +'5,5,,,,,,5,5,5,5,5,5,5,,,5,,,,,,5,5,5,5,5,5,5,5,5,5,5,5,,5,5,5,,5,5', +'5,5,5,,,,,,,,,,,,,,,,,,,,5,,,5,,,5,5,,,5,,5,,,,5,,,,,,,,,5,,,,,5,5,5', +'5,,5,5,5,5,,,,,5,5,,,,976,976,976,5,976,5,5,5,976,976,,,,976,,976,976', +'976,976,976,976,976,,,,,,976,976,976,976,976,976,976,,,976,,,,,,,976', +',,976,976,976,976,976,976,976,976,976,976,976,976,,976,976,976,976,976', +',,,,,,,,,,,,,,,,,,,976,,,976,,,976,976,,,976,,976,,976,,976,,,976,,', +',,,976,,,,,976,976,976,976,,976,976,976,976,,,,,976,976,,,,20,20,20', +'976,20,976,976,976,20,20,,,,20,,20,20,20,20,20,20,20,,,,,,20,20,20,20', +'20,20,20,,,20,,,,,,,20,,,20,20,20,20,20,20,20,20,,20,20,20,,20,20,20', +'20,20,,,,,,,,,,,,,,,,,,,,20,,,20,,,20,20,,,20,,,,,,20,,,,,,,,,20,,,', +',20,20,20,20,,20,20,20,20,,,,,20,20,,,,867,867,867,20,867,20,20,20,867', +'867,,,,867,,867,867,867,867,867,867,867,,,,,,867,867,867,867,867,867', +'867,,,867,,,,,,,867,,,867,867,867,867,867,867,867,867,,867,867,867,', +'867,867,,,867,,,,,,,,,,,,,,,,,,,,867,,,867,,,867,867,,,867,,,,,,,,,', +',,,,,,,,,,867,867,867,867,,867,867,867,867,,,,,867,867,,,,855,855,855', +'867,855,867,867,867,855,855,,,,855,,855,855,855,855,855,855,855,,,,', +',855,855,855,855,855,855,855,,,855,,,,,,,855,,,855,855,855,855,855,855', +'855,855,,855,855,855,,855,855,,,855,,,,,,,,,,,,,,,,,,,,855,,,855,,,855', +'855,,,855,,,,,,,,,,,,,,,,,,,,855,855,855,855,,855,855,855,855,,,,,855', +'855,,,,29,29,29,855,29,855,855,855,29,29,,,,29,,29,29,29,29,29,29,29', +',,,,,29,29,29,29,29,29,29,,,29,,,,,,,29,,,29,29,29,29,29,29,29,29,29', +'29,29,29,,29,29,29,29,29,,,,,,,,,,,,,,,,,,,,29,,,29,,,29,29,,,29,,29', +',29,,29,,,29,,,,,,29,,,,,29,29,29,29,,29,29,29,29,,,,,29,29,,,,30,30', +'30,29,30,29,29,29,30,30,,,,30,,30,30,30,30,30,30,30,,,,,,30,30,30,30', +'30,30,30,,,30,,,,,,,30,,,30,30,30,30,30,30,30,30,30,30,30,30,,30,30', +'30,30,30,,,,,,,,,,,,,,,,,,,,30,,,30,,,30,30,,,30,,30,,30,,30,,,30,,', +',,,30,,,,,30,30,30,30,,30,30,30,30,,,,,30,30,,,,31,31,31,30,31,30,30', +'30,31,31,,,,31,,31,31,31,31,31,31,31,,,,,,31,31,31,31,31,31,31,,,31', +',,,,,,31,,,31,31,31,31,31,31,31,31,31,31,31,31,,31,31,31,31,31,,,,,', +',,,,,,,,,,,,,,31,,,31,,,31,31,,,31,,31,,31,,31,,,31,,,,,,31,,,,,31,31', +'31,31,,31,31,31,31,,,,,31,31,,,,34,34,34,31,34,31,31,31,34,34,,,,34', +',34,34,34,34,34,34,34,,,,,,34,34,34,34,34,34,34,,,34,,,,,,,34,,,34,34', +'34,34,34,34,34,34,,34,34,34,,34,34,,,34,,,,,,,,,,,,,,,,,,,,34,,,34,', +',34,34,,,34,,34,,,,,,,,,,,,,,,,,,34,34,34,34,,34,34,34,34,,,,,34,34', +',,,35,35,35,34,35,34,34,34,35,35,,,,35,,35,35,35,35,35,35,35,,,,,,35', +'35,35,35,35,35,35,,,35,,,,,,,35,,,35,35,35,35,35,35,35,35,,35,35,35', +',35,35,,,35,,,,,,,,,,,,,,,,,,,,35,,,35,,,35,35,,,35,,,964,,964,964,964', +'964,964,,,,,,,,,964,,35,35,35,35,,35,35,35,35,,,,,35,35,,,,35,,964,35', +',35,35,35,841,841,841,,841,964,964,,841,841,964,,,841,,841,841,841,841', +'841,841,841,,,,,,841,841,841,841,841,841,841,,,841,,,,,,,841,,,841,841', +'841,841,841,841,841,841,,841,841,841,,841,841,841,841,841,,,,,,,,,,', +',,,,,,,,,841,,,841,,,841,841,,,841,,,,,,841,,,,,,,,,841,,,,,841,841', +'841,841,,841,841,841,841,,,,,841,841,,,,840,840,840,841,840,841,841', +'841,840,840,,,,840,,840,840,840,840,840,840,840,,,,,,840,840,840,840', +'840,840,840,,,840,,,,,,,840,,,840,840,840,840,840,840,840,840,840,840', +'840,840,,840,840,840,840,840,,,,,,,,,,,,,,,,,,,,840,,,840,,,840,840', +',,840,,,,840,,840,,,840,,,,,,840,,,,,840,840,840,840,,840,840,840,840', +',,,,840,840,,,,823,823,823,840,823,840,840,840,823,823,,,,823,,823,823', +'823,823,823,823,823,,,,,,823,823,823,823,823,823,823,,,823,,,,,,,823', +',,823,823,823,823,823,823,823,823,,823,823,823,,823,823,823,823,823', +',,,,,,,,,,,,,,,,,,,823,,,823,,,823,823,,,823,,823,,,,823,,,,,,,,,823', +',,,,823,823,823,823,,823,823,823,823,,,,,823,823,,,,42,42,42,823,42', +'823,823,823,42,42,,,,42,,42,42,42,42,42,42,42,,,,,,42,42,42,42,42,42', +'42,,,42,,,,,,,42,,,42,42,42,42,42,42,42,42,,42,42,42,,42,42,42,42,42', +',,,,,,,,,,,,,,,,,,,42,,,42,,,42,42,,,42,,,,,,42,,,,,,,,,42,,,,,42,42', +'42,42,,42,42,42,42,,,,,42,42,,,,43,43,43,42,43,42,42,42,43,43,,,,43', +',43,43,43,43,43,43,43,,,,,,43,43,43,43,43,43,43,,,43,,,,,,,43,,,43,43', +'43,43,43,43,43,43,,43,43,43,,43,43,43,43,43,,,,,,,,,,,,,,,,,,,,43,,', +'43,,,43,43,,,43,,,,,,43,,,,,,,,,43,,,,,43,43,43,43,,43,43,43,43,,,,', +'43,43,,,,44,44,44,43,44,43,43,43,44,44,,,,44,,44,44,44,44,44,44,44,', +',,,,44,44,44,44,44,44,44,,,44,,,,,,,44,,,44,44,44,44,44,44,44,44,,44', +'44,44,,44,44,44,44,44,,,,,,,,,,,,,,,,,,,,44,,,44,,,44,44,,,44,,,,,,44', +',,,,,,,,44,,,,,44,44,44,44,,44,44,44,44,,,,,44,44,,,,818,818,818,44', +'818,44,44,44,818,818,,,,818,,818,818,818,818,818,818,818,,,,,,818,818', +'818,818,818,818,818,,,818,,,,,,,818,,,818,818,818,818,818,818,818,818', +',818,818,818,,818,818,818,818,818,,,,,,,,,,,,,,,,,,,,818,,,818,,,818', +'818,,,818,,,,,,818,,,,,,,,,818,,,,,818,818,818,818,,818,818,818,818', +',,,,818,818,,,,59,59,59,818,59,818,818,818,59,59,,,,59,,59,59,59,59', +'59,59,59,,,,,,59,59,59,59,59,59,59,,,59,,,,,,,59,,,59,59,59,59,59,59', +'59,59,59,59,59,59,,59,59,59,59,59,,,,,,,,,,,,,,,,,,,,59,,,59,,,59,59', +',,59,,59,,,,59,,,59,,,,,,59,,,,,59,59,59,59,,59,59,59,59,,,,,59,59,', +',,60,60,60,59,60,59,59,59,60,60,,,,60,,60,60,60,60,60,60,60,,,,,,60', +'60,60,60,60,60,60,,,60,,,,,,,60,,,60,60,60,60,60,60,60,60,60,60,60,60', +',60,60,60,60,60,,,,,,,,,,,,,,,,,,,,60,,,60,,,60,60,,,60,,,,,,60,,,60', +',,,,,60,,,,,60,60,60,60,,60,60,60,60,,,,,60,60,,,,805,805,805,60,805', +'60,60,60,805,805,,,,805,,805,805,805,805,805,805,805,,,,,,805,805,805', +'805,805,805,805,,,805,,,,,,,805,,,805,805,805,805,805,805,805,805,,805', +'805,805,,805,805,805,805,805,,,,,,,,,,,,,,,,,,,,805,,,805,,,805,805', +',,805,,,,,,805,,,,,,,,,805,,,,,805,805,805,805,,805,805,805,805,,,,', +'805,805,,,,63,63,63,805,63,805,805,805,63,63,,,,63,,63,63,63,63,63,63', +'63,,,,,,63,63,63,63,63,63,63,,,63,,,,,,,63,,,63,63,63,63,63,63,63,63', +',63,63,63,,63,63,63,63,63,,,,,,,,,,,,,,,,,,,,63,,,63,,,63,63,,,63,,', +',,,63,,,,,,,,,63,,,,,63,63,63,63,,63,63,63,63,,,,,63,63,,,,64,64,64', +'63,64,63,63,63,64,64,,,,64,,64,64,64,64,64,64,64,,,,,,64,64,64,64,64', +'64,64,,,64,,,,,,,64,,,64,64,64,64,64,64,64,64,,64,64,64,,64,64,64,64', +'64,,,,,,,,,,,,,,,,,,,,64,,,64,,,64,64,,,64,,,,,,64,,,,,,,,,64,,,,,64', +'64,64,64,,64,64,64,64,,,,,64,64,,,,377,377,377,64,377,64,64,64,377,377', +',,,377,,377,377,377,377,377,377,377,,,,,,377,377,377,377,377,377,377', +',,377,,,,,,,377,,,377,377,377,377,377,377,377,377,,377,377,377,,377', +'377,377,377,377,,,,,,,,,,,,,,,,,,,,377,,,377,,,377,377,,,377,,,,,,377', +',,,,,,,,377,,,,,377,377,377,377,,377,377,377,377,,,,,377,377,,,,68,68', +'68,377,68,377,377,377,68,68,,,,68,,68,68,68,68,68,68,68,,,,,,68,68,68', +'68,68,68,68,,,68,,,,,,,68,,,68,68,68,68,68,68,68,68,,68,68,68,,68,68', +',,68,,,,,,,,,,,,,,,,,,,,68,,,68,,,68,68,,,68,,68,,,,,,,,,,,,,,,,,,68', +'68,68,68,,68,68,68,68,,,,,68,68,,,,69,69,69,68,69,68,68,68,69,69,,,', +'69,,69,69,69,69,69,69,69,,,,,,69,69,69,69,69,69,69,,,69,,,,,,,69,,,69', +'69,69,69,69,69,69,69,,69,69,69,,69,69,,,69,,,,,,,,,,,,,,,,,69,,,69,', +',69,,,69,69,,,69,,,,,,,,,,,,,,,,,,,,69,69,69,69,,69,69,69,69,,,,,69', +'69,,,,70,70,70,69,70,69,69,69,70,70,,,,70,,70,70,70,70,70,70,70,,,,', +',70,70,70,70,70,70,70,,,70,,,,,,,70,,,70,70,70,70,70,70,70,70,,70,70', +'70,,70,70,,,70,,,,,,,,,,,,,,,,,,,,70,,,70,,,70,70,,,70,,,,,,,,,,,,,', +',,,,,,70,70,70,70,,70,70,70,70,,,,,70,70,,,,767,767,767,70,767,70,70', +'70,767,767,,,,767,,767,767,767,767,767,767,767,,,,,,767,767,767,767', +'767,767,767,,,767,,,,,,,767,,,767,767,767,767,767,767,767,767,,767,767', +'767,,767,767,,,767,,,,,,,,,,,,,,,,,,,,767,,,767,,,767,767,,,767,,,968', +',968,968,968,968,968,,,,,,,,,968,,767,767,767,767,,767,767,767,767,', +',,,767,767,,,,,,968,767,,767,767,767,113,113,113,113,113,968,968,,113', +'113,968,,,113,,113,113,113,113,113,113,113,,,,,,113,113,113,113,113', +'113,113,,,113,,,,,,113,113,113,113,113,113,113,113,113,113,113,113,', +'113,113,113,,113,113,113,113,113,,,,,,,,,,,,,,,,,,,,113,,,113,,,113', +'113,,,113,,113,,,,113,,,,,,,,,113,,,,,113,113,113,113,,113,113,113,113', +',,,,113,113,,,,,,113,113,,113,113,113,118,118,118,,118,,,,118,118,,', +',118,,118,118,118,118,118,118,118,,,,,,118,118,118,118,118,118,118,', +',118,,,,,,,118,,,118,118,118,118,118,118,118,118,,118,118,118,,118,118', +'118,118,118,,,,,,,,,,,,,,,,,,,,118,,,118,,,118,118,,,118,,,,,,118,,', +',,,,,,118,,,,,118,118,118,118,,118,118,118,118,,,,,118,118,,,,119,119', +'119,118,119,118,118,118,119,119,,,,119,,119,119,119,119,119,119,119', +',,,,,119,119,119,119,119,119,119,,,119,,,,,,,119,,,119,119,119,119,119', +'119,119,119,,119,119,119,,119,119,119,119,119,,,,,,,,,,,,,,,,,,,,119', +',,119,,,119,119,,,119,,,,,,119,,,,,,,,,119,,,,,119,119,119,119,,119', +'119,119,119,,,,,119,119,,,,120,120,120,119,120,119,119,119,120,120,', +',,120,,120,120,120,120,120,120,120,,,,,,120,120,120,120,120,120,120', +',,120,,,,,,,120,,,120,120,120,120,120,120,120,120,,120,120,120,,120', +'120,120,120,120,,,,,,,,,,,,,,,,,,,,120,,,120,,,120,120,,,120,,,,,,120', +',,,,,,,,120,,,,,120,120,120,120,,120,120,120,120,,,,,120,120,,,,121', +'121,121,120,121,120,120,120,121,121,,,,121,,121,121,121,121,121,121', +'121,,,,,,121,121,121,121,121,121,121,,,121,,,,,,,121,,,121,121,121,121', +'121,121,121,121,,121,121,121,,121,121,121,121,121,,,,,,,,,,,,,,,,,,', +',121,,,121,,,121,121,,,121,,,,,,121,,,,,,,,,121,,,,,121,121,121,121', +',121,121,121,121,,,,,121,121,,,,,,,121,,121,121,121,122,122,122,122', +'122,,,,122,122,,,,122,,122,122,122,122,122,122,122,,,,,,122,122,122', +'122,122,122,122,,,122,,,,,,122,122,,122,122,122,122,122,122,122,122', +'122,,122,122,122,,122,122,122,122,122,,,,,,,,,,,,,,,,,,,,122,,,122,', +',122,122,,,122,,122,,,,122,,,,,,,,,122,,,,,122,122,122,122,,122,122', +'122,122,,,,,122,122,,,,755,755,755,122,755,122,122,122,755,755,,,,755', +',755,755,755,755,755,755,755,,,,,,755,755,755,755,755,755,755,,,755', +',,,,,,755,,,755,755,755,755,755,755,755,755,,755,755,755,,755,755,755', +'755,755,,,,,,,,,,,,,,,,,,,,755,,,755,,,755,755,,,755,,,,,,755,,,,,,', +',,755,,,,,755,755,755,755,,755,755,755,755,,,,,755,755,,,,753,753,753', +'755,753,755,755,755,753,753,,,,753,,753,753,753,753,753,753,753,,,,', +',753,753,753,753,753,753,753,,,753,,,,,,,753,,,753,753,753,753,753,753', +'753,753,,753,753,753,,753,753,753,753,753,,,,,,,,,,,,,,,,,,,,753,,,753', +',,753,753,,,753,,,,,,753,,,,,,,,,753,,,,,753,753,753,753,,753,753,753', +'753,,,,,753,753,,,,209,209,209,753,209,753,753,753,209,209,,,,209,,209', +'209,209,209,209,209,209,,,,,,209,209,209,209,209,209,209,,,209,,,,,', +',209,,,209,209,209,209,209,209,209,209,,209,209,209,,209,209,209,209', +'209,,,,,,,,,,,,,,,,,,,,209,,,209,,,209,209,,,209,,209,,,,209,,,,,,,', +',209,,,,,209,209,209,209,,209,209,209,209,,,,,209,209,,,,327,327,327', +'209,327,209,209,209,327,327,,,,327,,327,327,327,327,327,327,327,,,,', +',327,327,327,327,327,327,327,,,327,,,,,,,327,,,327,327,327,327,327,327', +'327,327,,327,327,327,,327,327,327,327,327,,,,,,,,,,,,,,,,,,,,327,,,327', +',,327,327,,,327,,,,,,327,,,,,,,,,327,,,,,327,327,327,327,,327,327,327', +'327,,,,,327,327,,,,530,530,530,327,530,327,327,327,530,530,,,,530,,530', +'530,530,530,530,530,530,,,,,,530,530,530,530,530,530,530,,,530,,,,,', +',530,,,530,530,530,530,530,530,530,530,530,530,530,530,,530,530,530', +'530,530,,,,,,,,,,,,,,,,,,,,530,,,530,,,530,530,,,530,,,,,,530,,,530', +',,,,,530,,,,,530,530,530,530,,530,530,530,530,,,,,530,530,,,,527,527', +'527,530,527,530,530,530,527,527,,,,527,,527,527,527,527,527,527,527', +',,,,,527,527,527,527,527,527,527,,,527,,,,,,,527,,,527,527,527,527,527', +'527,527,527,527,527,527,527,,527,527,527,527,527,,,,,,,,,,,,,,,,,,,', +'527,,,527,,,527,527,,,527,,527,,,,527,,,527,,,,,,527,,,,,527,527,527', +'527,,527,527,527,527,,,,,527,527,,,,521,521,521,527,521,527,527,527', +'521,521,,,,521,,521,521,521,521,521,521,521,,,,,,521,521,521,521,521', +'521,521,,,521,,,,,,,521,,,521,521,521,521,521,521,521,521,,521,521,521', +',521,521,521,521,521,,,,,,,,,,,,,,,,,,,,521,,,521,,,521,521,,,521,,', +',,,521,,,,,,,,,521,,,,,521,521,521,521,,521,521,521,521,,,,,521,521', +',,,517,517,517,521,517,521,521,521,517,517,,,,517,,517,517,517,517,517', +'517,517,,,,,,517,517,517,517,517,517,517,,,517,,,,,,,517,,,517,517,517', +'517,517,517,517,517,,517,517,517,,517,517,517,517,517,,,,,,,,,,,,,,', +',,,,,517,,,517,,,517,517,,,517,,,,,,517,,,,,,,,,517,,,,,517,517,517', +'517,,517,517,517,517,,,,,517,517,,,,516,516,516,517,516,517,517,517', +'516,516,,,,516,,516,516,516,516,516,516,516,,,,,,516,516,516,516,516', +'516,516,,,516,,,,,,,516,,,516,516,516,516,516,516,516,516,,516,516,516', +',516,516,516,516,516,,,,,,,,,,,,,,,,,,,,516,,,516,,,516,516,,,516,,', +',,,516,,,,,,,,,516,,,,,516,516,516,516,,516,516,516,516,,,,,516,516', +',,,513,513,513,516,513,516,516,516,513,513,,,,513,,513,513,513,513,513', +'513,513,,,,,,513,513,513,513,513,513,513,,,513,,,,,,,513,,,513,513,513', +'513,513,513,513,513,,513,513,513,,513,513,,,513,,,,,,,,,,,,,,,,,,,,513', +',,513,,,513,513,,,513,,,,,,,,,,,,,,,,,,,,513,513,513,513,,513,513,513', +'513,,,,,513,513,,,,341,341,341,513,341,513,513,513,341,341,,,,341,,341', +'341,341,341,341,341,341,,,,,,341,341,341,341,341,341,341,,,341,,,,,', +',341,,,341,341,341,341,341,341,341,341,,341,341,341,,341,341,341,341', +'341,,,,,,,,,,,,,,,,,,,,341,,,341,,,341,341,,,341,,,,,,341,,,,,,,,,341', +',,,,341,341,341,341,,341,341,341,341,,,,,341,341,,,,342,342,342,341', +'342,341,341,341,342,342,,,,342,,342,342,342,342,342,342,342,,,,,,342', +'342,342,342,342,342,342,,,342,,,,,,,342,,,342,342,342,342,342,342,342', +'342,,342,342,342,,342,342,342,342,342,,,,,,,,,,,,,,,,,,,,342,,,342,', +',342,342,,,342,,,,,,342,,,,,,,,,342,,,,,342,342,342,342,,342,342,342', +'342,,,,,342,342,,,,507,507,507,342,507,342,342,342,507,507,,,,507,,507', +'507,507,507,507,507,507,,,,,,507,507,507,507,507,507,507,,,507,,,,,', +',507,,,507,507,507,507,507,507,507,507,507,507,507,507,,507,507,507', +'507,507,,,,,,,,,,,,,,,,,,,,507,,,507,,,507,507,,,507,,507,,507,,507', +',,507,,,,,,507,,,,,507,507,507,507,,507,507,507,507,,,,,507,507,,,,505', +'505,505,507,505,507,507,507,505,505,,,,505,,505,505,505,505,505,505', +'505,,,,,,505,505,505,505,505,505,505,,,505,,,,,,,505,,,505,505,505,505', +'505,505,505,505,,505,505,505,,505,505,,,505,,,,,,,,,,,,,,,,,,,,505,', +',505,,,505,505,,,505,,,966,,966,966,966,966,966,,,,,,,,,966,,505,505', +'505,505,,505,505,505,505,,,,,505,505,,,,,,966,505,,505,505,505,497,497', +'497,497,497,966,966,,497,497,966,,,497,,497,497,497,497,497,497,497', +',,,,,497,497,497,497,497,497,497,,,497,,,,,,497,497,497,497,497,497', +'497,497,497,497,497,497,,497,497,497,,497,497,497,497,497,,,,,,,,,,', +',,,,,,,,,497,,,497,,,497,497,,,497,,497,,,,497,,,,,,,,,497,,,,,497,497', +'497,497,,497,497,497,497,,,,,497,497,,,,,,497,497,,497,497,497,491,491', +'491,,491,,,,491,491,,,,491,,491,491,491,491,491,491,491,,,,,,491,491', +'491,491,491,491,491,,,491,,,,,,,491,,,491,491,491,491,491,491,491,491', +',491,491,491,,491,491,491,491,491,,,,,,,,,,,,,,,,,,,,491,,,491,,,491', +'491,,,491,,,,,,491,,,,,,,,,491,,,,,491,491,491,491,,491,491,491,491', +',,,,491,491,,,,489,489,489,491,489,491,491,491,489,489,,,,489,,489,489', +'489,489,489,489,489,,,,,,489,489,489,489,489,489,489,,,489,,,,,,,489', +',,489,489,489,489,489,489,489,489,489,489,489,489,,489,489,489,489,489', +',,,,,,,,,,,,,,,,,,,489,,,489,,,489,489,,,489,,,,489,,489,,,489,,,,,', +'489,,,,,489,489,489,489,,489,489,489,489,,,,,489,489,,,,487,487,487', +'489,487,489,489,489,487,487,,,,487,,487,487,487,487,487,487,487,,,,', +',487,487,487,487,487,487,487,,,487,,,,,,,487,,,487,487,487,487,487,487', +'487,487,487,487,487,487,,487,487,487,487,487,,,,,,,,,,,,,,,,,,,,487', +',,487,,,487,487,,,487,,487,,487,,487,,,487,,,,,,487,,,,,487,487,487', +'487,,487,487,487,487,,,,,487,487,,,,447,447,447,487,447,487,487,487', +'447,447,,,,447,,447,447,447,447,447,447,447,,,,,,447,447,447,447,447', +'447,447,,,447,,,,,,,447,,,447,447,447,447,447,447,447,447,,447,447,447', +',447,447,447,447,447,,,,,,,,,,,,,,,,,,,,447,,,447,,,447,447,,,447,,', +',,,447,,,,,,,,,447,,,,,447,447,447,447,,447,447,447,447,,,,,447,447', +',,,446,446,446,447,446,447,447,447,446,446,,,,446,,446,446,446,446,446', +'446,446,,,,,,446,446,446,446,446,446,446,,,446,,,,,,,446,,,446,446,446', +'446,446,446,446,446,,446,446,446,,446,446,446,446,446,,,,,,,,,,,,,,', +',,,,,446,,,446,,,446,446,,,446,,,,,,446,,,,,,,,,446,,,,,446,446,446', +'446,,446,446,446,446,,,,,446,446,,,,445,445,445,446,445,446,446,446', +'445,445,,,,445,,445,445,445,445,445,445,445,,,,,,445,445,445,445,445', +'445,445,,,445,,,,,,,445,,,445,445,445,445,445,445,445,445,,445,445,445', +',445,445,445,445,445,,,,,,,,,,,,,,,,,,,,445,,,445,,,445,445,,,445,,', +',,,445,,,,,,,,,445,,,,,445,445,445,445,,445,445,445,445,,,,,445,445', +',,,443,443,443,445,443,445,445,445,443,443,,,,443,,443,443,443,443,443', +'443,443,,,,,,443,443,443,443,443,443,443,,,443,,,,,,,443,,,443,443,443', +'443,443,443,443,443,443,443,443,443,,443,443,443,443,443,,,,,,,,,,,', +',,,,,,,,443,,,443,,,443,443,,,443,,443,,443,,443,,,443,,,,,,443,,,,', +'443,443,443,443,,443,443,443,443,,,,,443,443,,,,361,361,361,443,361', +'443,443,443,361,361,,,,361,,361,361,361,361,361,361,361,,,,,,361,361', +'361,361,361,361,361,,,361,,,,,,,361,,,361,361,361,361,361,361,361,361', +',361,361,361,,361,361,361,361,361,,,,,,,,,,,,,,,,,,,,361,,,361,,,361', +'361,,,361,,,,,,361,,,,,,,,,361,,,,,361,361,361,361,,361,361,361,361', +',,,,361,361,,,,405,405,405,361,405,361,361,361,405,405,,,,405,,405,405', +'405,405,405,405,405,,,,,,405,405,405,405,405,405,405,,,405,,,,,,,405', +',,405,405,405,405,405,405,405,405,,405,405,405,,405,405,405,405,405', +',,,,,,,,,,,,,,,,,,,405,,,405,,,405,405,,,405,,,,,,405,,,,,,,,,405,,', +',,405,405,405,405,,405,405,405,405,,,,,405,405,,,,300,300,300,405,300', +'405,405,405,300,300,,,,300,,300,300,300,300,300,300,300,,,,,,300,300', +'300,300,300,300,300,,,300,,,,,,,300,,,300,300,300,300,300,300,300,300', +',300,300,300,,300,300,,,300,,,,,,,,,,,,,,,,,,,,300,,,300,,,300,300,', +',300,,,850,,850,850,850,850,850,,,,,,,,,850,,300,300,300,300,,300,300', +'300,300,,,,,300,300,,,,300,,850,300,,300,300,300,605,605,605,,605,850', +'850,,605,605,850,,,605,,605,605,605,605,605,605,605,,,,,,605,605,605', +'605,605,605,605,,,605,,,,,,,605,,,605,605,605,605,605,605,605,605,,605', +'605,605,,605,605,605,605,605,,,,,,,,,,,,,,,,,,,,605,,,605,,,605,605', +',,605,,,,,,605,,,,,,,,,605,,,,,605,605,605,605,,605,605,605,605,,,,', +'605,605,,,,604,604,604,605,604,605,605,605,604,604,,,,604,,604,604,604', +'604,604,604,604,,,,,,604,604,604,604,604,604,604,,,604,,,,,,,604,,,604', +'604,604,604,604,604,604,604,,604,604,604,,604,604,604,604,604,,,,,,', +',,,,,,,,,,,,,604,,,604,,,604,604,,,604,,,,,,604,,,,,,,,,604,,,,,604', +'604,604,604,,604,604,604,604,,,,,604,604,,,,601,601,601,604,601,604', +'604,604,601,601,,,,601,,601,601,601,601,601,601,601,,,,,,601,601,601', +'601,601,601,601,,,601,,,,,,,601,,,601,601,601,601,601,601,601,601,,601', +'601,601,,601,601,601,601,601,,,,,,,,,,,,,,,,,,,,601,,,601,,,601,601', +',,601,,,,,,601,,,,,,,,,601,,,,,601,601,601,601,,601,601,601,601,,,,', +'601,601,,,,600,600,600,601,600,601,601,601,600,600,,,,600,,600,600,600', +'600,600,600,600,,,,,,600,600,600,600,600,600,600,,,600,,,,,,,600,,,600', +'600,600,600,600,600,600,600,,600,600,600,,600,600,600,600,600,,,,,,', +',,,,,,,,,,,,,600,,,600,,,600,600,,,600,,,,,,600,,,,,,,,,600,,,,,600', +'600,600,600,,600,600,600,600,,,,,600,600,,,,596,596,596,600,596,600', +'600,600,596,596,,,,596,,596,596,596,596,596,596,596,,,,,,596,596,596', +'596,596,596,596,,,596,,,,,,,596,,,596,596,596,596,596,596,596,596,,596', +'596,596,,596,596,596,596,596,,,,,,,,,,,,,,,,,,,,596,,,596,,,596,596', +',,596,,,,,,596,,,,,,,,,596,,,,,596,596,596,596,,596,596,596,596,,,,', +'596,596,,,,595,595,595,596,595,596,596,596,595,595,,,,595,,595,595,595', +'595,595,595,595,,,,,,595,595,595,595,595,595,595,,,595,,,,,,,595,,,595', +'595,595,595,595,595,595,595,,595,595,595,,595,595,595,595,595,,,,,,', +',,,,,,,,,,,,,595,,,595,,,595,595,,,595,,,,,,595,,,,,,,,,595,,,,,595', +'595,595,595,,595,595,595,595,,,,,595,595,,,,594,594,594,595,594,595', +'595,595,594,594,,,,594,,594,594,594,594,594,594,594,,,,,,594,594,594', +'594,594,594,594,,,594,,,,,,,594,,,594,594,594,594,594,594,594,594,594', +'594,594,594,,594,594,594,594,594,,,,,,,,,,,,,,,,,,,,594,,,594,,,594', +'594,,,594,,,,594,,594,,,594,,,,,,594,,,,,594,594,594,594,,594,594,594', +'594,,,,,594,594,,,,593,593,593,594,593,594,594,594,593,593,,,,593,,593', +'593,593,593,593,593,593,,,,,,593,593,593,593,593,593,593,,,593,,,,,', +',593,,,593,593,593,593,593,593,593,593,593,593,593,593,,593,593,593', +'593,593,,,,,,,,,,,,,,,,,,,,593,,,593,,,593,593,,,593,,593,,593,,593', +',,593,,,,,,593,,,,,593,593,593,593,,593,593,593,593,,,,,593,593,,,,590', +'590,590,593,590,593,593,593,590,590,,,,590,,590,590,590,590,590,590', +'590,,,,,,590,590,590,590,590,590,590,,,590,,,,,,,590,,,590,590,590,590', +'590,590,590,590,,590,590,590,,590,590,590,590,590,,,,,,,,,,,,,,,,,,', +',590,,,590,,,590,590,,,590,,,,,,590,,,,,,,,,590,,,,,590,590,590,590', +',590,590,590,590,,,,,590,590,,,,589,589,589,590,589,590,590,590,589', +'589,,,,589,,589,589,589,589,589,589,589,,,,,,589,589,589,589,589,589', +'589,,,589,,,,,,,589,,,589,589,589,589,589,589,589,589,,589,589,589,', +'589,589,589,589,589,,,,,,,,,,,,,,,,,,,,589,,,589,,,589,589,,,589,,589', +',,,589,,,,,,,,,589,,,,,589,589,589,589,,589,589,589,589,,,,,589,589', +',,,317,317,317,589,317,589,589,589,317,317,,,,317,,317,317,317,317,317', +'317,317,,,,,,317,317,317,317,317,317,317,,,317,,,,,,,317,,,317,317,317', +'317,317,317,317,317,,317,317,317,,317,317,,,317,,,,,,,,,,,,,,,,,,,,317', +',,317,,,317,317,,,317,,,,,,,,,,,,,,,,,,,,317,317,317,317,,317,317,317', +'317,,,,,317,317,,,,555,555,555,317,555,317,317,317,555,555,,,,555,,555', +'555,555,555,555,555,555,,,,,,555,555,555,555,555,555,555,,,555,,,,,', +',555,,,555,555,555,555,555,555,555,555,555,555,555,555,,555,555,555', +'555,555,,,,,,,,,,,,,,,,,,,,555,,,555,,,555,555,,,555,,555,,555,,555', +',,555,,,,,,555,,,,,555,555,555,555,,555,555,555,555,,,,,555,555,,,,545', +'545,545,555,545,555,555,555,545,545,,,,545,,545,545,545,545,545,545', +'545,,,,,,545,545,545,545,545,545,545,,,545,,,,,,,545,,,545,545,545,545', +'545,545,545,545,545,545,545,545,,545,545,545,545,545,,,,,,,,,,,,,,,', +',,,,545,,,545,,,545,545,,,545,,545,,545,,545,,,545,,,,,,545,,,,,545', +'545,545,545,,545,545,545,545,,,,,545,545,,,,544,544,544,545,544,545', +'545,545,544,544,,,,544,,544,544,544,544,544,544,544,,,,,,544,544,544', +'544,544,544,544,,,544,,,,,,,544,,,544,544,544,544,544,544,544,544,,544', +'544,544,,544,544,544,544,544,,,,,,,,,,,,,,,,,,,,544,,,544,,,544,544', +',,544,,544,,,,544,,,,,,,,,544,,,,,544,544,544,544,,544,544,544,544,', +',,,544,544,,,,325,325,325,544,325,544,544,544,325,325,,,,325,,325,325', +'325,325,325,325,325,,,,,,325,325,325,325,325,325,325,,,325,,,,,,,325', +',,325,325,325,325,325,325,325,325,,325,325,325,,325,325,325,325,325', +',,,,,,,,,,,,,,,,,,,325,,,325,325,,325,325,,,325,,,,,,325,,,,,,,,,325', +',,,,325,325,325,325,,325,325,325,325,,,,,325,325,,,,,56,,325,,325,325', +'325,56,56,56,,,56,56,56,,56,,,,,,,,,,56,56,56,,,,,,,,56,56,,56,56,56', +'56,56,,,,,,,,,,,,,,,,,,,,,,,56,56,56,56,56,56,56,56,56,56,56,56,56,56', +',,56,56,56,,,56,,,56,,,56,56,,56,,56,,56,,56,56,,56,56,56,56,56,,56', +',56,,,,,,,,,,,,,,56,,,56,56,56,56,426,56,,56,,,,426,426,426,,,426,426', +'426,,426,,,,,,,,,426,426,426,426,,,,,,,,426,426,,426,426,426,426,426', +',,,,,,,,,,,,,,,,,,,,,,426,426,426,426,426,426,426,426,426,426,426,426', +'426,426,,,426,426,426,,,426,,,426,,,426,426,,426,,426,,426,,426,426', +',426,426,426,426,426,,426,426,426,,,,,,,,,,,,,,426,,,426,426,426,426', +'425,426,,426,,,,425,425,425,,,425,425,425,,425,,,,,,,,,425,425,425,425', +',,,,,,,425,425,,425,425,425,425,425,,,,,,,,,,,,,,,,,,,,,,,425,425,425', +'425,425,425,425,425,425,425,425,425,425,425,,,425,425,425,,,425,,,425', +',,425,425,,425,,425,,425,,425,425,,425,425,425,425,425,,425,425,425', +'1016,,1016,1016,1016,1016,1016,,,,,,,425,,1016,425,425,425,425,28,425', +',425,,,,28,28,28,,,28,28,28,,28,1016,,,,,,,,,28,28,1016,1016,,,,1016', +',,28,28,,28,28,28,28,28,,,,,,,,,,,,,,,,,,,,,,,28,28,28,28,28,28,28,28', +'28,28,28,28,28,28,,,28,28,28,,,28,,28,28,,,28,28,,28,,28,,28,,28,28', +',28,28,28,28,28,,28,27,28,,,,,,27,27,27,,,27,27,27,28,27,,28,28,,28', +',28,,27,27,27,,,,,,,,,27,27,,27,27,27,27,27,,,,,,,,,,,,,,,,,,,,,,,27', +'27,27,27,27,27,27,27,27,27,27,27,27,27,,,27,27,27,,,27,,27,27,,,27,27', +',27,,27,,27,,27,27,,27,27,27,27,27,,27,27,27,,,,,,,,,,,,,,27,,416,27', +'27,,27,,27,416,416,416,,,416,416,416,,416,,,,,,,,,416,416,416,,,,,,', +',,416,416,,416,416,416,416,416,,,,,,,,,,,,,,,,,,,,,,,416,416,416,416', +'416,416,416,416,416,416,416,416,416,416,,,416,416,416,,,416,,416,416', +',,416,416,,416,,416,,416,,416,416,,416,416,416,416,416,,416,416,416', +',,,,,,,,,,,,,416,,475,416,416,,416,,416,475,475,475,,,475,475,475,616', +'475,616,616,616,616,616,,,,475,475,,,,616,,,,,,475,475,,475,475,475', +'475,475,,,,,,,,658,616,658,658,658,658,658,,,,616,616,616,616,,658,', +'616,,938,,938,938,938,938,938,475,,,,,,,475,938,,,658,475,475,,,,616', +',,658,658,658,658,,,,658,,,938,,,,,475,475,,,938,938,938,938,,,,938', +',,,475,,,475,,,,,475,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9', +',,,9,9,9,9,9,9,9,9,9,9,,,,,,9,9,9,9,9,9,9,9,9,,,9,,,,,,,,9,9,,9,9,9', +'9,9,9,9,,,9,9,,,,9,9,9,9,,,,,,,,,,,,,,9,9,,9,9,9,9,9,9,9,9,9,9,9,9,', +',9,9,,,,,,,,,,,,,,9,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8', +',,,8,8,8,8,8,8,8,8,8,8,,,,,,8,8,8,8,8,8,8,8,8,8,,8,,,,,,,,8,8,,8,8,8', +'8,8,8,8,,,8,8,,,,8,8,8,8,,,,,,,,,,,,,,8,8,,8,8,8,8,8,8,8,8,8,8,8,8,', +',8,8,,,,,,,,,,,,,,8,396,396,396,396,396,396,396,396,396,396,396,396', +'396,396,396,396,396,396,396,396,396,396,396,396,,,,396,396,396,396,396', +'396,396,396,396,396,,,,,,396,396,396,396,396,396,396,396,396,,,396,', +',,,,,,396,396,,396,396,396,396,396,396,396,,,396,396,,,,396,396,396', +'396,,,,,,,,,,,,,,396,396,,396,396,396,396,396,396,396,396,396,396,396', +'396,,,396,396,,,,,,,,,,,,,,396,586,586,586,586,586,586,586,586,586,586', +'586,586,586,586,586,586,586,586,586,586,586,586,586,586,,,,586,586,586', +'586,586,586,586,586,586,586,,,,,,586,586,586,586,586,586,586,586,586', +',,586,,,,,,,,586,586,,586,586,586,586,586,586,586,,,586,586,,,,586,586', +'586,586,,,,,,,,,,,,,,586,586,,586,586,586,586,586,586,586,586,586,586', +'586,586,,,586,586,,,,,,,,,,,,,,586,718,718,718,718,718,718,718,718,718', +'718,718,718,718,718,718,718,718,718,718,718,718,718,718,718,,,,718,718', +'718,718,718,718,718,718,718,718,,,,,,718,718,718,718,718,718,718,718', +'718,,,718,,,,,,,,718,718,,718,718,718,718,718,718,718,,,718,718,,,,718', +'718,718,718,,,,,,,,,,,,,,718,718,,718,718,718,718,718,718,718,718,718', +'718,718,718,,,718,71,71,71,71,71,71,71,71,71,71,71,71,71,71,71,71,71', +'71,71,71,71,71,71,71,,,,71,71,71,71,71,71,71,71,71,71,,,,,,71,71,71', +'71,71,71,71,71,71,71,71,71,,71,,,,,,71,71,,71,71,71,71,71,71,71,,,71', +'71,,,,71,71,71,71,,,,,,71,,,,,,,,71,71,,71,71,71,71,71,71,71,71,71,71', +'71,71,508,508,71,,508,,,,,,,,508,508,,508,508,508,508,508,508,508,,', +'508,508,,,,508,508,508,508,,,,,,508,,,,,,,,508,508,,508,508,508,508', +'508,508,508,508,508,508,508,508,261,261,508,,261,,,,,,,,261,261,,261', +'261,261,261,261,261,261,,,261,261,,,,261,261,261,261,,,,,,,,,,,,,,261', +'261,,261,261,261,261,261,261,261,261,261,261,261,261,978,978,261,,978', +',,,,,,,978,978,,978,978,978,978,978,978,978,,,978,978,,,,978,978,978', +'978,,,,,,978,,,,,,,,978,978,,978,978,978,978,978,978,978,978,978,978', +'978,978,977,977,978,,977,,,,,,,,977,977,,977,977,977,977,977,977,977', +',,977,977,,,,977,977,977,977,,,,,,977,,,,,,,,977,977,,977,977,977,977', +'977,977,977,977,977,977,977,977,441,441,977,,441,,,,,,,,441,441,,441', +'441,441,441,441,441,441,,,441,441,,,,441,441,441,441,,,,,,441,,,,,,', +',441,441,,441,441,441,441,441,441,441,441,441,441,441,441,442,442,441', +',442,,,,,,,,442,442,,442,442,442,442,442,442,442,,,442,442,,,,442,442', +'442,442,,,,,,442,,,,,,,,442,442,,442,442,442,442,442,442,442,442,442', +'442,442,442,923,923,442,,923,,,,,,,,923,923,,923,923,923,923,923,923', +'923,,,923,923,,,,923,923,923,923,,,,,,923,,,,,,,,923,923,,923,923,923', +'923,923,923,923,923,923,923,923,923,509,509,923,,509,,,,,,,,509,509', +',509,509,509,509,509,509,509,,,509,509,,,,509,509,509,509,,,,,,509,', +',,,,,,509,509,,509,509,509,509,509,509,509,509,509,509,509,509,518,518', +'509,,518,,,,,,,,518,518,,518,518,518,518,518,518,518,,,518,518,,,,518', +'518,518,518,,,,,,518,,,,,,,,518,518,,518,518,518,518,518,518,518,518', +'518,518,518,518,519,519,518,,519,,,,,,,,519,519,,519,519,519,519,519', +'519,519,,,519,519,,,,519,519,519,519,,,,,,519,,,,,,,,519,519,,519,519', +'519,519,519,519,519,519,519,519,519,519,546,546,519,,546,,,,,,,,546', +'546,,546,546,546,546,546,546,546,,,546,546,,,,546,546,546,546,,,,,,546', +',,,,,,,546,546,,546,546,546,546,546,546,546,546,546,546,546,546,547', +'547,546,,547,,,,,,,,547,547,,547,547,547,547,547,547,547,,,547,547,', +',,547,547,547,547,,,,,,547,,,,,,,,547,547,,547,547,547,547,547,547,547', +'547,547,547,547,547,553,553,547,,553,,,,,,,,553,553,,553,553,553,553', +'553,553,553,,,553,553,,,,553,553,553,553,,,,,,553,,,,,,,,553,553,,553', +'553,553,553,553,553,553,553,553,553,553,553,554,554,553,,554,,,,,,,', +'554,554,,554,554,554,554,554,554,554,,,554,554,,,,554,554,554,554,,', +',,,554,,,,,,,,554,554,,554,554,554,554,554,554,554,554,554,554,554,554', +'212,212,554,,212,,,,,,,,212,212,,212,212,212,212,212,212,212,,,212,212', +',,,212,212,212,212,,,,,,212,,,,,,,,212,212,,212,212,212,212,212,212', +'212,212,212,212,212,212,213,213,212,,213,,,,,,,,213,213,,213,213,213', +'213,213,213,213,,,213,213,,,,213,213,213,213,,,,,,213,,,,,,,,213,213', +',213,213,213,213,213,213,213,213,213,213,213,213,,716,213,716,716,716', +'716,716,,799,,799,799,799,799,799,716,,,,,,,,799,,801,,801,801,801,801', +'801,,,,,,716,,,801,,,,,799,716,716,716,716,,,,716,799,799,799,799,,', +',799,801,,848,,848,848,848,848,848,801,801,801,801,,,,801,848,,846,', +'846,846,846,846,846,940,,940,940,940,940,940,,846,,,,,848,,940,,,,,', +',848,848,848,848,,,,848,846,,,,,,,940,,846,846,846,846,,,,846,,940,940', +',,942,940,942,942,942,942,942,944,,944,944,944,944,944,1006,942,1006', +'1006,1006,1006,1006,803,944,803,803,803,803,803,,1006,,,,,,,803,942', +',,,,,,944,,,,942,942,,1006,,942,,944,944,,803,,944,,1006,1006,,,,1006', +',803,803,,,962,803,962,962,962,962,962,,717,,717,717,717,717,717,962', +',,,,,,,717,,535,,535,535,535,535,535,,,,,,962,,,535,,,,,717,962,962', +'962,962,,,,962,717,717,717,717,,,,717,535,535,,,,,,,,535,535,535,535', +',,,535' ] + racc_action_check = arr = ::Array.new(25046, nil) + idx = 0 + clist.each do |str| + str.split(',', -1).each do |i| + arr[idx] = i.to_i unless i.empty? + idx += 1 + end + end + +racc_action_pointer = [ + 2938, 1265, nil, 263, nil, 12512, 1538, 1133, 23168, 23040, + 1020, nil, 969, 1024, 740, 406, 935, 608, nil, -74, + 12774, 2238, 910, nil, 593, nil, 228, 22648, 22536, 13167, + 13298, 13429, nil, 1818, 13560, 13691, nil, 733, 593, 652, + 773, 364, 14223, 14354, 14485, 693, 589, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 22134, nil, -72, 14747, + 14878, -20, nil, 15140, 15271, nil, nil, 12373, 15533, 15664, + 15795, 23665, nil, nil, nil, nil, nil, nil, nil, 450, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 222, nil, nil, + 334, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 600, nil, 16065, nil, nil, nil, nil, 16204, 16335, + 16466, 16597, 16736, 4338, nil, 821, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 300, nil, 4758, 17129, + 5029, 5160, 24580, 24641, 5553, 5684, 5815, 5946, 6077, 6208, + nil, nil, 910, -57, -62, 156, 165, -51, -55, nil, + 6863, 2798, 1301, 7125, 7256, 7387, 7518, 7649, 7780, 7911, + 8042, 8173, 8304, 8435, 8566, 8697, 8828, 8959, 9090, 9221, + 9352, 9483, 9614, 9745, 9876, 10007, 10138, 10269, 10400, nil, + nil, 23787, nil, nil, 1248, 10662, 10793, nil, nil, nil, + nil, nil, nil, nil, 10924, nil, 1958, nil, 1138, 1250, + nil, 11317, 1304, 11579, nil, nil, 11710, 11841, nil, nil, + 324, nil, 12111, 1523, 144, 118, 1958, 193, 279, 246, + 20027, 1118, 1020, 981, 880, 364, 841, nil, 359, 483, + -8, nil, nil, nil, 603, 334, 604, 21476, nil, 313, + 731, 517, nil, 756, nil, 22000, 1678, 17260, 702, nil, + 542, -68, 781, 806, 457, 855, nil, nil, 17, 35, + -10, 18177, 18308, -78, 1022, 947, 10, -12, 1330, 1035, + -5, 1091, nil, nil, 698, 564, 169, nil, 1050, nil, + 9, 19765, nil, nil, nil, 531, 496, 424, 372, 301, + 267, 255, 613, 201, nil, 202, nil, 15402, nil, 242, + 212, 481, -30, 436, -25, -39, 369, nil, nil, nil, + nil, nil, nil, nil, nil, 1142, 23296, nil, nil, nil, + nil, 1138, nil, nil, 1117, 19896, 1115, nil, nil, 838, + 1082, nil, 1074, 1012, 412, 443, 22777, nil, nil, nil, + 444, 0, 1055, nil, nil, 22402, 22268, nil, 1538, nil, + 1000, nil, nil, 698, nil, nil, nil, nil, -33, nil, + 1035, 23970, 24031, 19634, 168, 19503, 19372, 19241, 3918, 3498, + -39, 608, 1046, 1042, 1037, 1036, 5160, 5422, 5291, 3638, + 4618, 4478, 4758, 4058, 4198, 3218, 3358, 4898, 5029, 3106, + 3193, 4338, 3778, 2098, 135, 22906, nil, nil, nil, nil, + 962, nil, -48, -54, 961, nil, nil, 19110, nil, 18979, + nil, 18848, nil, 478, nil, nil, nil, 18709, 1398, 978, + 942, 931, nil, nil, 926, 18570, 904, 18439, 23726, 24153, + 1118, 886, nil, 18046, 838, nil, 17915, 17784, 24214, 24275, + 2798, 17653, 887, 869, 277, 787, nil, 17522, nil, nil, + 17391, nil, nil, nil, nil, 24941, 1398, 839, nil, 1538, + 145, 146, 814, 816, 21869, 21738, 24336, 24397, 8, nil, + nil, 398, nil, 24458, 24519, 21607, nil, nil, nil, 333, + 191, 4618, 690, nil, 189, nil, nil, nil, 961, nil, + nil, nil, 659, nil, nil, 354, nil, 375, nil, nil, + 624, nil, 620, nil, nil, nil, 23424, nil, 589, 21345, + 21214, 592, 577, 21083, 20952, 20821, 20690, 327, nil, nil, + 20559, 20428, 301, nil, 20297, 20166, nil, nil, 115, 113, + 556, 110, 226, 978, 213, nil, 22870, nil, 838, 260, + -24, 159, nil, 4198, 3918, nil, 72, nil, 88, 12242, + nil, nil, 11972, nil, 1279, -82, 11448, 1255, nil, 1255, + 24, 65, 1282, 447, 978, 1250, 1151, 11186, 1818, 1204, + 154, 1258, 11055, nil, 1152, nil, 479, nil, 22906, nil, + 1152, 1153, nil, 1161, 1167, 1181, nil, nil, nil, nil, + nil, nil, nil, nil, 1176, 3093, nil, nil, 10531, nil, + nil, nil, 1297, nil, nil, nil, 1301, nil, nil, 1306, + 681, nil, 1348, nil, nil, nil, nil, 1361, nil, 136, + 1242, -18, 25, 150, 178, 6994, 413, 838, nil, 1265, + 2518, 6732, nil, nil, 151, 2238, 24703, 24924, 23552, nil, + nil, nil, nil, nil, nil, 2098, nil, nil, nil, nil, + nil, nil, nil, 99, 6601, 2378, 6470, nil, 170, nil, + 2658, nil, 1398, nil, nil, 2938, nil, 1118, nil, 1678, + 6339, 5422, 5291, 16998, 128, 16867, 344, 356, nil, 372, + 374, 400, nil, 434, 428, 432, 449, 15926, nil, nil, + 602, nil, nil, 2658, 508, 627, nil, nil, nil, nil, + 522, 338, nil, nil, 676, nil, 2378, 563, 618, nil, + nil, 624, nil, 22, 594, 581, nil, nil, 640, 24711, + nil, 24728, nil, 24864, nil, 15009, nil, 563, nil, 651, + 329, 658, nil, nil, nil, nil, 783, nil, 14616, 802, + 698, 4898, nil, 14092, 3778, -1, 147, nil, 826, 577, + 3638, nil, 843, 732, -102, nil, 737, 732, nil, 1258, + 13961, 13830, 2518, 746, nil, nil, 24784, nil, 24767, nil, + 20074, nil, nil, 789, 1244, 13036, 770, 869, nil, 815, + nil, nil, nil, 1258, nil, nil, -1, 12905, nil, nil, + nil, nil, nil, 860, 818, nil, nil, nil, 819, 829, + nil, 830, 832, nil, 835, nil, nil, 840, 3064, 839, + 3103, nil, nil, 34, nil, 976, 977, nil, 373, nil, + nil, nil, 981, nil, nil, nil, 902, nil, 859, nil, + nil, 869, 871, 872, 873, nil, 884, nil, 402, nil, + nil, nil, 288, 24092, nil, nil, nil, 4478, 1160, 1190, + 1261, 1013, 1300, nil, 4058, 3498, nil, nil, 22925, nil, + 24791, nil, 24843, nil, 24850, nil, nil, nil, nil, 337, + 3578, 972, 3358, nil, nil, nil, nil, nil, 3218, nil, + 3078, nil, 24916, nil, 13738, nil, 18617, nil, 15973, nil, + nil, nil, 1104, 1037, 1041, 1124, 12643, 23909, 23848, 1121, + 1033, 1145, 1027, 1041, 1045, 1066, 1071, 3298, 1075, 3344, + 260, 1208, 1213, 1097, 1098, 1099, 1109, nil, nil, 1113, + 26, 33, 10, 1258, nil, nil, 24857, nil, nil, nil, + nil, 3438, 1119, nil, nil, nil, 22465, nil, nil, nil, + nil, 32, 1133, 799, 1249, nil, nil ] + +racc_action_default = [ + -3, -600, -1, -586, -4, -600, -7, -600, -600, -600, + -600, -29, -600, -600, -600, -279, -600, -40, -43, -588, + -600, -48, -50, -51, -52, -56, -256, -256, -256, -293, + -329, -330, -68, -11, -72, -80, -82, -600, -491, -492, + -600, -600, -600, -600, -600, -588, -237, -270, -271, -272, + -273, -274, -275, -276, -277, -278, -576, -281, -283, -599, + -566, -301, -303, -600, -600, -307, -310, -586, -600, -600, + -600, -600, -331, -332, -334, -335, -432, -433, -434, -435, + -436, -457, -439, -440, -459, -461, -444, -449, -453, -455, + -471, -459, -473, -475, -476, -477, -478, -574, -480, -481, + -575, -483, -484, -485, -486, -487, -488, -489, -490, -495, + -496, -600, -2, -587, -595, -596, -597, -6, -600, -600, + -600, -600, -600, -3, -17, -600, -111, -112, -113, -114, + -115, -116, -117, -118, -119, -123, -124, -125, -126, -127, + -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, -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, -22, -120, -11, -600, + -600, -246, -600, -600, -600, -600, -600, -600, -600, -588, + -589, -47, -600, -491, -492, -600, -279, -600, -600, -229, + -600, -11, -600, -600, -600, -600, -600, -600, -600, -600, + -600, -600, -600, -600, -600, -600, -600, -600, -600, -600, + -600, -600, -600, -600, -600, -600, -600, -600, -600, -401, + -403, -600, -584, -585, -57, -246, -600, -300, -407, -416, + -418, -63, -413, -64, -588, -65, -238, -251, -260, -260, + -255, -600, -261, -600, -457, -568, -600, -600, -66, -67, + -586, -12, -600, -15, -600, -70, -11, -588, -600, -73, + -76, -11, -88, -89, -600, -600, -96, -293, -296, -588, + -600, -329, -330, -333, -414, -600, -78, -600, -84, -290, + -474, -600, -214, -215, -230, -600, -11, -600, -588, -239, + -592, -592, -600, -600, -592, -600, -302, -392, -49, -600, + -600, -600, -600, -586, -600, -587, -491, -492, -600, -600, + -279, -600, -345, -346, -106, -107, -600, -109, -600, -279, + -600, -600, -491, -492, -322, -111, -112, -153, -154, -155, + -171, -176, -183, -186, -324, -600, -564, -600, -437, -600, + -600, -600, -600, -600, -600, -600, -600, 1027, -5, -598, + -23, -24, -25, -26, -27, -600, -600, -19, -20, -21, + -121, -600, -30, -39, -266, -600, -600, -265, -31, -196, + -588, -247, -260, -260, -577, -578, -256, -411, -579, -580, + -578, -577, -256, -410, -412, -579, -580, -37, -204, -38, + -600, -41, -42, -194, -261, -44, -45, -46, -588, -299, + -600, -600, -600, -246, -290, -600, -600, -600, -205, -206, + -207, -208, -209, -210, -211, -212, -216, -217, -218, -219, + -220, -221, -222, -223, -224, -225, -226, -227, -228, -231, + -232, -233, -234, -588, -381, -256, -577, -578, -54, -58, + -588, -257, -381, -381, -588, -295, -252, -600, -253, -600, + -258, -600, -262, -600, -571, -573, -10, -587, -14, -3, + -588, -69, -288, -85, -74, -600, -588, -246, -600, -600, + -95, -600, -474, -600, -81, -86, -600, -600, -600, -600, + -235, -600, -424, -600, -284, -600, -240, -594, -593, -242, + -594, -291, -292, -567, -304, -524, -11, -336, -337, -11, + -600, -600, -600, -600, -600, -246, -600, -600, -290, -315, + -106, -107, -108, -600, -600, -246, -318, -497, -498, -600, + -600, -11, -502, -326, -588, -438, -458, -463, -600, -465, + -441, -460, -600, -462, -443, -600, -446, -600, -448, -451, + -600, -452, -600, -472, -8, -18, -600, -28, -269, -600, + -600, -415, -600, -248, -250, -600, -600, -59, -245, -408, + -600, -600, -61, -409, -600, -600, -298, -590, -577, -578, + -577, -578, -588, -194, -600, -382, -588, -384, -11, -53, + -404, -381, -243, -11, -11, -294, -260, -259, -263, -600, + -569, -570, -600, -13, -600, -71, -600, -77, -83, -588, + -577, -578, -244, -92, -94, -600, -79, -600, -203, -213, + -588, -599, -599, -282, -588, -287, -592, -393, -524, -396, + -563, -563, -507, -509, -509, -509, -523, -525, -526, -527, + -528, -529, -530, -531, -532, -600, -534, -536, -538, -543, + -545, -546, -548, -553, -555, -556, -558, -559, -560, -600, + -599, -338, -599, -308, -339, -340, -311, -600, -314, -600, + -588, -577, -578, -581, -289, -600, -106, -107, -110, -588, + -11, -600, -500, -320, -600, -11, -524, -524, -600, -565, + -464, -467, -468, -469, -470, -11, -442, -445, -447, -450, + -454, -456, -122, -267, -600, -197, -600, -591, -260, -33, + -199, -34, -200, -60, -35, -202, -36, -201, -62, -195, + -600, -600, -600, -600, -415, -600, -563, -563, -363, -365, + -365, -365, -380, -600, -588, -386, -532, -540, -541, -551, + -600, -406, -405, -11, -600, -600, -254, -264, -572, -16, + -75, -90, -87, -297, -599, -343, -11, -425, -599, -426, + -427, -600, -241, -600, -588, -600, -505, -506, -600, -600, + -516, -600, -519, -600, -521, -600, -347, -600, -349, -351, + -358, -588, -537, -547, -557, -561, -600, -341, -600, -600, + -11, -11, -313, -600, -11, -415, -600, -415, -600, -600, + -11, -323, -600, -588, -600, -327, -600, -268, -32, -198, + -249, -600, -236, -600, -361, -362, -371, -373, -600, -376, + -600, -378, -383, -600, -600, -600, -539, -600, -402, -600, + -417, -419, -9, -11, -431, -344, -600, -600, -429, -285, + -394, -397, -399, -600, -563, -544, -562, -508, -509, -509, + -535, -509, -509, -554, -509, -532, -549, -588, -600, -356, + -600, -533, -305, -600, -306, -600, -600, -263, -599, -316, + -319, -499, -600, -325, -501, -503, -502, -466, -563, -542, + -364, -365, -365, -365, -365, -552, -365, -385, -588, -388, + -390, -391, -550, -600, -290, -55, -430, -11, -97, -98, + -600, -600, -105, -428, -11, -11, -395, -504, -600, -512, + -600, -514, -600, -517, -600, -520, -522, -348, -350, -354, + -600, -359, -11, -309, -312, -420, -421, -422, -11, -321, + -11, -360, -600, -368, -600, -370, -600, -374, -600, -377, + -379, -387, -600, -289, -581, -424, -246, -600, -600, -104, + -600, -600, -509, -509, -509, -509, -352, -600, -357, -600, + -599, -600, -600, -365, -365, -365, -365, -389, -423, -588, + -577, -578, -581, -103, -398, -400, -600, -510, -513, -515, + -518, -600, -355, -342, -317, -328, -600, -366, -369, -372, + -375, -415, -509, -353, -365, -511, -367 ] + +clist = [ +'218,329,374,26,410,129,129,651,26,268,272,523,277,277,277,416,422,543', +'2,278,278,278,260,26,134,134,325,132,132,336,124,207,26,26,26,488,26', +'407,264,271,273,313,313,429,339,340,536,539,343,330,6,591,432,338,338', +'6,261,338,480,715,627,316,627,479,475,630,26,26,129,112,26,113,221,816', +'116,313,313,313,320,693,696,379,439,514,526,529,760,784,533,299,552', +'883,295,659,763,811,618,948,862,390,391,392,393,761,623,624,630,297', +'338,338,338,338,921,919,880,915,26,117,575,577,380,26,26,26,26,26,26', +'386,819,275,288,289,666,344,279,279,279,485,116,360,364,395,571,573', +'576,576,830,561,571,562,718,906,958,705,821,342,762,820,341,337,501', +'880,328,6,331,334,627,627,764,488,630,654,394,6,327,326,375,918,556', +'351,657,951,870,535,793,534,333,934,935,474,482,483,955,788,277,417', +'866,378,948,406,376,620,381,382,1,406,435,436,437,438,426,26,26,26,26', +'697,794,26,26,26,26,26,26,796,797,388,332,887,883,915,921,997,383,384', +'26,385,612,720,725,711,586,988,853,773,416,422,714,621,277,277,878,396', +'403,754,353,666,278,277,875,880,909,402,408,206,278,633,427,431,26,26', +'710,637,873,,833,834,,26,1012,646,781,,,880,493,,879,708,881,,511,,', +'268,,26,,272,,26,639,606,1023,,26,,,313,,525,,642,,666,666,,911,524', +',844,845,642,540,541,313,767,504,,298,26,26,338,338,912,956,913,,728', +'700,728,,825,498,622,26,26,,625,709,642,827,560,512,,16,295,496,642', +'497,16,295,116,,635,26,899,481,564,,638,500,279,515,1013,484,506,,,', +'279,26,,776,,,,,16,,,,592,,129,,828,743,,,598,832,748,780,960,,603,824', +'563,,542,792,,134,627,116,132,630,,585,,,,352,,417,982,277,719,597,', +',557,,,602,,,937,,426,,432,,,,,26,,,993,,,,,614,674,,,598,,998,,,,,', +',16,,,,961,,,,,16,16,,,789,,,,,,,619,,,277,417,,,776,,,,,,26,417,26', +'401,757,,426,,,,26,650,313,783,,902,426,634,,,313,,,,26,,298,,277,417', +',,,,699,,766,417,277,26,,,26,,426,,14,,26,6,426,14,767,,,767,,767,26', +'767,515,,16,,26,,222,,515,430,,957,,927,,222,222,222,674,14,304,304', +',129,,16,,,772,,,298,626,592,790,,298,765,26,26,952,,134,26,26,132,', +'26,732,222,222,694,694,222,348,358,358,,,771,592,26,,,,598,26,26,603', +',712,713,656,,,791,674,674,,,1021,,406,313,,992,16,739,741,835,16,,744', +'746,313,16,431,,,14,,,,,222,222,222,222,14,14,,767,,767,891,767,,767', +',,16,592,,874,,,826,,,,592,515,829,,,338,904,,738,,,338,782,,,,,,26', +',,,,26,26,129,,,26,674,,674,,,,767,864,,26,,868,908,,,757,,757,,757', +'26,,,,,,765,,,,,947,806,,,14,222,222,222,,,222,222,222,222,222,222,766', +',766,999,,,758,,313,765,26,14,,,642,,,,,,,,838,26,,,800,802,804,,,,', +'893,,,,,13,,,759,338,13,,222,222,,,,,,,,222,26,,26,26,,,26,,,,690,,26', +'692,,,13,14,,,,14,,,,304,14,,,757,16,757,16,757,,757,,674,,,,313,304', +',,26,,,,,,14,222,313,,,,,,,,766,806,,,889,222,222,,16,,,16,,,,694,,971', +'901,,,,757,905,,222,,,,,,770,,16,,13,774,775,426,,,222,,,13,13,,,26', +',,,,,,26,26,,,,,,,,,,15,,,876,,15,876,26,,,430,277,417,26,,26,806,,806', +',,,,,16,,,426,,16,16,26,592,15,306,306,,,,,,222,,,882,,884,,,,,876,', +',758,,758,,758,939,941,,943,945,13,946,,,350,359,359,,836,,,,,986,806', +',,,,,,,,13,,,,914,,916,,14,,14,,,,,,304,,222,,,847,849,851,304,,15,', +'806,16,806,,222,859,16,15,15,,,,,,,,16,,865,14,,,14,,806,,,,222,,,,', +'13,,,,13,222,,,,13,,14,,,,1007,1008,1009,1010,895,896,,758,898,758,', +'758,,758,,,16,,983,13,984,,985,,,,,,,16,222,222,,,,222,222,,,222,1025', +',994,,995,15,996,926,,,,,,14,,,,,14,14,,758,,16,16,,,16,15,,,304,,16', +',,,,,,,,304,,,,1022,,,,,,,,,,1024,963,965,967,969,,970,335,,,16,,,,933', +'975,,,,,,,980,981,,,,,,,,,,15,,,,15,,,990,306,15,,222,,991,,,14,222', +',,,14,,,,306,,,,,,14,,,15,,,,,,,16,222,,,,,,16,16,1017,1018,1019,1020', +',,,,,,,13,,13,,,16,,,,,,16,856,16,,,,,14,39,1026,,,,39,,,,,,,14,,,,', +',,,13,,,13,,,,,,,,,,39,303,303,,,,,,,,404,222,13,14,14,,434,14,,,,,', +'14,,,,,,,,,,,,347,363,363,363,,,,,,,,,,922,,,,,,,,14,,,,930,,,,,,,,', +'13,,,,,13,13,,,,,39,,490,,492,,,494,495,39,39,,15,,15,,,,,,306,,,,,', +',,306,,,,,,,,,,,,14,,,,,,,14,14,,,15,,,15,,,,,,,,,,,14,,,,,,14,,14,', +',15,,,,,13,,724,,,13,,,222,,,,,,39,13,,,,,38,,,,,38,,,,,,,,,,,,39,,', +',,,,,588,,,,,,,15,38,302,302,,15,15,,,,,13,,,,,,,306,,,,,,13,,,,,306', +',,,,,,346,362,362,362,,,,,,,39,,,,39,,,,303,39,,,13,13,,,13,,,,,,13', +',,303,,,,628,,335,,631,39,38,,,,,,,,,38,38,15,,,,,15,,,,13,,,,,,15,', +',,,,,,628,,,335,,,,,,,,,,,,,,434,,,,,,,,,,,,,,,,,359,,,,,,15,,,,,,,', +',,13,,,15,,,,13,13,,,38,733,,,,628,335,,,,,,,,13,,,,,,13,,13,38,,,15', +'15,,,15,,,,,,15,,,,,777,,,778,,,,,,,,,,,,,,,,,359,,,787,,,,,15,,,,932', +',39,,39,,,,,,303,38,,,,38,,812,303,302,38,,,,,,,,,,,,,,,,302,,,,,39', +',,39,38,,,,,,,,,,,,,,,15,,,,,,39,15,15,,,,,837,,,,,,,,,,,,15,,,,,,15', +',15,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,39,,,,,39,39,,,,,,,,,,,,303,,,886,', +',,,,,,303,,,,,,,,,,897,,,,,,,,,,,,,,,,,335,,,,,,,,,,,,,,,,,,,,,,,,,', +',,,,,,,,,,39,38,,38,,39,,,,302,,,,,,39,,302,,,,,,,,,,,,,,,,,,,,,,,38', +',,38,,,,,,,,,,,,,,363,,,,,,39,,38,,,,,,,,,,,39,,,,,,,,229,,,,,,,,,276', +'276,276,,,,,,,,,,,322,323,324,,39,39,,,39,,,,,,39,,38,276,276,,,38,38', +',,,,,,,,,,,302,,,,,363,,,,,,302,,39,,,,929,,,,,,,,,,,,,,,,,,,,,,,,,', +',,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,38,,,39,,38,,,,,39,39,,,,38,,,,,,,,,', +',,,39,,,,,,39,,39,,,,,,,,,,,,,,,,,,,,,362,,276,409,276,,38,428,433,', +',,,,,,,,,38,,,,229,,,448,449,450,451,452,453,454,455,456,457,458,459', +'460,461,462,463,464,465,466,467,468,469,470,471,472,473,,38,38,,,38', +'276,276,,,,38,,,,276,,,,,,,276,,276,,,276,276,,,,,,,,362,,,,,,,,38,', +',,928,,,,,,,,,,,,,,,,,,520,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,', +'38,,,,,,,38,38,,,,,,,,,,,,,,,,,38,,,,,,38,,38,,,,,276,,,,,,,,,,,,,,', +',,,,,,,,,,,,,,,,,,,,,,,276,,428,613,409,,,,,,,,,,,,,,,,,,,,,,,,,,,,', +',,,,,,,,,,,276,,276,,276,,,,,,,,,,,,,,,,276,,,,,,,,,648,649,,,,,,,,', +',276,,,276,,,,,,,,,,,,,,276,276,,,,,,,,,,276,,,,,,,,,,,,,,,,,,,,,,,', +',,,,,,,,,,276,735,,,276,276,740,742,,,,745,747,,,613,749,,,,,,,,,,,', +',,,,,,,,,,,,276,,,276,,,,,,,,,,,,,,,,,,,,276,,,,,,,,,,,,,,,,,,,,,,,', +',,276,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,276,,839', +',,,,,,,,,,,,,740,742,747,745,,842,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,', +',,,,,,,,,,,,,,,276,,,,,,,,,,,,,,,,,,276,,,,,,,,,,,,,,,,,276,839,,,,', +',,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,', +',,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,276' ] + racc_goto_table = arr = ::Array.new(3071, nil) + idx = 0 + clist.each do |str| + str.split(',', -1).each do |i| + arr[idx] = i.to_i unless i.empty? + idx += 1 + end + end + +clist = [ +'31,67,56,41,23,57,57,10,41,71,71,8,33,33,33,37,37,92,2,68,68,68,141', +'41,61,61,31,60,60,86,15,15,41,41,41,73,41,27,38,38,38,64,64,27,17,17', +'89,89,17,68,7,24,18,29,29,7,36,29,23,98,74,50,74,39,37,181,41,41,57', +'4,41,6,20,90,96,64,64,64,63,91,91,154,47,51,69,69,129,11,69,49,54,177', +'45,140,132,119,40,117,12,17,17,17,17,130,40,40,181,46,29,29,29,29,135', +'134,172,178,41,5,158,158,155,41,41,41,41,41,41,155,11,44,44,44,166,4', +'70,70,70,47,96,55,55,2,159,159,159,159,112,113,159,114,115,116,110,109', +'108,107,121,106,105,104,47,172,103,7,70,70,74,74,127,73,181,102,7,7', +'101,100,99,133,95,93,136,120,137,138,139,88,85,142,143,144,146,147,148', +'149,33,71,150,153,117,68,84,72,156,157,1,68,29,29,29,29,57,41,41,41', +'41,92,140,41,41,41,41,41,41,124,124,5,66,119,177,178,135,134,160,161', +'41,162,23,163,164,165,62,120,132,40,37,37,8,42,33,33,170,30,28,24,19', +'166,68,33,174,172,175,20,20,16,68,14,20,20,41,41,111,51,132,,140,140', +',41,120,51,24,,,172,154,,130,54,130,,31,,,71,,41,,71,,41,23,47,120,', +'41,,,64,,31,,37,,166,166,,129,29,,124,124,37,17,17,64,173,50,,9,41,41', +'29,29,130,11,130,,159,23,159,,24,7,47,41,41,,47,23,37,24,29,63,,26,45', +'4,37,6,26,45,96,,47,41,91,44,29,,47,46,70,49,90,44,46,,,,70,41,,73,', +',,,26,,,,31,,57,,8,39,,,71,8,39,51,98,,71,89,36,,4,69,,61,74,96,60,181', +',15,,,,26,,71,130,33,47,38,,,96,,,38,,,124,,57,,18,,,,,41,,,130,,,,', +'31,171,,,71,,10,,,,,,,26,,,,124,,,,,26,26,,,27,,,,,,,38,,,33,71,,,73', +',,,,,41,71,41,9,123,,57,,,,41,29,64,47,,8,57,2,,,64,,,,41,,9,,33,71', +',,,,68,,171,71,33,41,,,41,,57,,22,,41,7,57,22,173,,,173,,173,41,173', +'49,,26,,41,,22,,49,26,,92,,89,,22,22,22,171,22,22,22,,57,,26,,,86,,', +'9,70,31,67,,9,31,41,41,89,,61,41,41,60,,41,15,22,22,96,96,22,22,22,22', +',,141,31,41,,,,71,41,41,71,,96,96,70,,,31,171,171,,,24,,68,64,,8,26', +'20,20,56,26,,20,20,64,26,20,,,22,,,,,22,22,22,22,22,22,,173,,173,47', +'173,,173,,,26,31,,123,,,17,,,,31,49,17,,,29,47,,70,,,29,49,,,,,,41,', +',,,41,41,57,,,41,171,,171,,,,173,67,,41,,67,123,,,123,,123,,123,41,', +',,,,31,,,,,47,118,,,22,22,22,22,,,22,22,22,22,22,22,171,,171,23,,,125', +',64,31,41,22,,,37,,,,,,,,20,41,,,169,169,169,,,,,17,,,,,21,,,128,29', +'21,,22,22,,,,,,,,22,41,,41,41,,,41,,,,9,,41,9,,,21,22,,,,22,,,,22,22', +',,123,26,123,26,123,,123,,171,,,,64,22,,,41,,,,,,22,22,64,,,,,,,,171', +'118,,,118,22,22,,26,,,26,,,,96,,31,96,,,,123,96,,22,,,,,,9,,26,,21,9', +'9,57,,,22,,,21,21,,,41,,,,,,,41,41,,,,,,,,,,25,,,125,,25,125,41,,,26', +'33,71,41,,41,118,,118,,,,,,26,,,57,,26,26,41,31,25,25,25,,,,,,22,,,128', +',128,,,,,125,,,125,,125,,125,169,169,,169,169,21,169,,,25,25,25,,9,', +',,,118,118,,,,,,,,,21,,,,128,,128,,22,,22,,,,,,22,,22,,,126,126,126', +'22,,25,,118,26,118,,22,9,26,25,25,,,,,,,,26,,9,22,,,22,,118,,,,22,,', +',,21,,,,21,22,,,,21,,22,,,,169,169,169,169,9,9,,125,9,125,,125,,125', +',,26,,128,21,128,,128,,,,,,,26,22,22,,,,22,22,,,22,169,,128,,128,25', +'128,9,,,,,,22,,,,,22,22,,125,,26,26,,,26,25,,,22,,26,,,,,,,,,22,,,,128', +',,,,,,,,,128,126,126,126,126,,126,65,,,26,,,,26,9,,,,,,,9,9,,,,,,,,', +',25,,,,25,,,9,25,25,,22,,9,,,22,22,,,,22,,,,25,,,,,,22,,,25,,,,,,,26', +'22,,,,,,26,26,126,126,126,126,,,,,,,,21,,21,,,26,,,,,,26,22,26,,,,,22', +'53,126,,,,53,,,,,,,22,,,,,,,,21,,,21,,,,,,,,,,53,53,53,,,,,,,,65,22', +'21,22,22,,65,22,,,,,,22,,,,,,,,,,,,53,53,53,53,,,,,,,,,,22,,,,,,,,22', +',,,22,,,,,,,,,21,,,,,21,21,,,,,53,,65,,65,,,65,65,53,53,,25,,25,,,,', +',25,,,,,,,,25,,,,,,,,,,,,22,,,,,,,22,22,,,25,,,25,,,,,,,,,,,22,,,,,', +'22,,22,,,25,,,,,21,,25,,,21,,,22,,,,,,53,21,,,,,52,,,,,52,,,,,,,,,,', +',53,,,,,,,,65,,,,,,,25,52,52,52,,25,25,,,,,21,,,,,,,25,,,,,,21,,,,,25', +',,,,,,52,52,52,52,,,,,,,53,,,,53,,,,53,53,,,21,21,,,21,,,,,,21,,,53', +',,,65,,65,,65,53,52,,,,,,,,,52,52,25,,,,,25,,,,21,,,,,,25,,,,,,,,65', +',,65,,,,,,,,,,,,,,65,,,,,,,,,,,,,,,,,25,,,,,,25,,,,,,,,,,21,,,25,,,', +'21,21,,,52,65,,,,65,65,,,,,,,,21,,,,,,21,,21,52,,,25,25,,,25,,,,,,25', +',,,,65,,,65,,,,,,,,,,,,,,,,,25,,,65,,,,,25,,,,25,,53,,53,,,,,,53,52', +',,,52,,65,53,52,52,,,,,,,,,,,,,,,,52,,,,,53,,,53,52,,,,,,,,,,,,,,,25', +',,,,,53,25,25,,,,,65,,,,,,,,,,,,25,,,,,,25,,25,,,,,,,,,,,,,,,,,,,,,', +',,,,,,,,53,,,,,53,53,,,,,,,,,,,,53,,,65,,,,,,,,53,,,,,,,,,,65,,,,,,', +',,,,,,,,,,65,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,53,52,,52,,53,,,,52', +',,,,,53,,52,,,,,,,,,,,,,,,,,,,,,,,52,,,52,,,,,,,,,,,,,,53,,,,,,53,,52', +',,,,,,,,,,53,,,,,,,,32,,,,,,,,,32,32,32,,,,,,,,,,,32,32,32,,53,53,,', +'53,,,,,,53,,52,32,32,,,52,52,,,,,,,,,,,,52,,,,,53,,,,,,52,,53,,,,53', +',,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,52,,,53,,52', +',,,,53,53,,,,52,,,,,,,,,,,,,53,,,,,,53,,53,,,,,,,,,,,,,,,,,,,,,52,,32', +'32,32,,52,32,32,,,,,,,,,,,52,,,,32,,,32,32,32,32,32,32,32,32,32,32,32', +'32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,,52,52,,,52,32,32,,,,52', +',,,32,,,,,,,32,,32,,,32,32,,,,,,,,52,,,,,,,,52,,,,52,,,,,,,,,,,,,,,', +',,32,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,52,,,,,,,52,52,,,,,,,', +',,,,,,,,,52,,,,,,52,,52,,,,,32,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,', +'32,,32,32,32,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,32,,32,,32,,,,,', +',,,,,,,,,,32,,,,,,,,,32,32,,,,,,,,,,32,,,32,,,,,,,,,,,,,,32,32,,,,,', +',,,,32,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,32,32,,,32,32,32,32,,,,32,32', +',,32,32,,,,,,,,,,,,,,,,,,,,,,,,32,,,32,,,,,,,,,,,,,,,,,,,,32,,,,,,,', +',,,,,,,,,,,,,,,,,,32,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,', +',,,,,,,,32,,32,,,,,,,,,,,,,,32,32,32,32,,32,,,,,,,,,,,,,,,,,,,,,,,,', +',,,,,,,,,,,,,,,,,,,,,,,,,32,,,,,,,,,,,,,,,,,,32,,,,,,,,,,,,,,,,,32,32', +',,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,', +',,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,32' ] + racc_goto_check = arr = ::Array.new(3071, nil) + idx = 0 + clist.each do |str| + str.split(',', -1).each do |i| + arr[idx] = i.to_i unless i.empty? + idx += 1 + end + end + +racc_goto_pointer = [ + nil, 204, 18, nil, 66, 112, 68, 50, -315, 295, + -515, -564, -686, nil, -232, 22, 254, -19, -163, 186, + 52, 804, 546, -207, -359, 948, 354, -172, 43, -10, + 127, -19, 2094, -17, nil, nil, 32, -197, 12, -201, + -378, 3, -231, nil, 100, 59, 74, -137, nil, 55, + 26, -234, 1534, 1320, -266, 70, -69, -3, nil, nil, + 19, 16, -160, 37, 7, 1154, 167, -58, -10, -246, + 105, -17, -274, -244, -427, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 129, 126, -32, nil, -152, -293, + -617, -461, -327, 111, nil, -182, 71, nil, -503, 105, + 118, 116, -353, 104, 97, 93, -536, 89, -542, -396, + -747, -286, -567, -217, -225, -413, -684, -791, 76, -580, + -709, -460, nil, -112, -437, 156, 297, -448, 191, -530, + -513, nil, -522, -677, -741, -742, -355, -611, -154, -473, + -442, 0, -684, -684, -70, nil, -79, -79, -706, -459, + -592, nil, nil, 118, 0, 36, 117, 117, -264, -238, + 145, 145, 146, -331, -331, -319, -403, nil, nil, 129, + -549, -80, -685, -291, -537, -583, nil, -710, -733, nil, + nil, -424 ] + +racc_goto_default = [ + nil, nil, nil, 3, nil, 4, 345, 293, nil, 522, + nil, 817, nil, 290, 291, nil, nil, nil, 11, 12, + 18, 228, 321, nil, nil, 226, 227, nil, nil, 17, + nil, 440, 21, 22, 23, 24, nil, 645, nil, nil, + nil, 310, nil, 25, 411, 32, nil, nil, 34, 37, + 36, nil, 223, 224, 357, nil, 131, 419, 130, 133, + 77, 78, nil, 92, 46, 282, nil, 785, 412, nil, + 413, 424, 599, 486, 280, 266, 47, 48, 49, 50, + 51, 52, 53, 54, 55, nil, 267, 61, nil, nil, + nil, nil, nil, nil, 69, nil, 537, 70, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 808, 673, nil, + 809, 910, 756, 661, nil, 662, nil, nil, 663, nil, + 665, 615, nil, nil, nil, 671, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 423, nil, nil, nil, nil, + nil, 76, 79, 80, nil, nil, nil, nil, nil, 566, + nil, nil, nil, nil, nil, nil, 877, 717, 660, nil, + 664, 885, 676, 678, 679, 768, 682, 683, 769, 686, + 689, 285 ] + +racc_reduce_table = [ + 0, 0, :racc_error, + 1, 145, :_reduce_none, + 2, 146, :_reduce_2, + 0, 147, :_reduce_3, + 1, 147, :_reduce_4, + 3, 147, :_reduce_5, + 2, 147, :_reduce_6, + 1, 149, :_reduce_none, + 4, 149, :_reduce_8, + 4, 152, :_reduce_9, + 2, 153, :_reduce_10, + 0, 157, :_reduce_11, + 1, 157, :_reduce_12, + 3, 157, :_reduce_13, + 2, 157, :_reduce_14, + 1, 158, :_reduce_none, + 4, 158, :_reduce_16, + 0, 174, :_reduce_17, + 4, 151, :_reduce_18, + 3, 151, :_reduce_19, + 3, 151, :_reduce_20, + 3, 151, :_reduce_21, + 2, 151, :_reduce_22, + 3, 151, :_reduce_23, + 3, 151, :_reduce_24, + 3, 151, :_reduce_25, + 3, 151, :_reduce_26, + 3, 151, :_reduce_27, + 4, 151, :_reduce_28, + 1, 151, :_reduce_none, + 3, 151, :_reduce_30, + 3, 151, :_reduce_31, + 6, 151, :_reduce_32, + 5, 151, :_reduce_33, + 5, 151, :_reduce_34, + 5, 151, :_reduce_35, + 5, 151, :_reduce_36, + 3, 151, :_reduce_37, + 3, 151, :_reduce_38, + 3, 151, :_reduce_39, + 1, 151, :_reduce_none, + 3, 162, :_reduce_41, + 3, 162, :_reduce_42, + 1, 173, :_reduce_none, + 3, 173, :_reduce_44, + 3, 173, :_reduce_45, + 3, 173, :_reduce_46, + 2, 173, :_reduce_47, + 1, 173, :_reduce_none, + 1, 161, :_reduce_none, + 1, 164, :_reduce_none, + 1, 164, :_reduce_none, + 1, 178, :_reduce_none, + 4, 178, :_reduce_53, + 0, 186, :_reduce_54, + 5, 183, :_reduce_55, + 1, 185, :_reduce_none, + 2, 177, :_reduce_57, + 3, 177, :_reduce_58, + 4, 177, :_reduce_59, + 5, 177, :_reduce_60, + 4, 177, :_reduce_61, + 5, 177, :_reduce_62, + 2, 177, :_reduce_63, + 2, 177, :_reduce_64, + 2, 177, :_reduce_65, + 2, 177, :_reduce_66, + 2, 177, :_reduce_67, + 1, 163, :_reduce_68, + 3, 163, :_reduce_69, + 1, 190, :_reduce_70, + 3, 190, :_reduce_71, + 1, 189, :_reduce_none, + 2, 189, :_reduce_73, + 3, 189, :_reduce_74, + 5, 189, :_reduce_75, + 2, 189, :_reduce_76, + 4, 189, :_reduce_77, + 2, 189, :_reduce_78, + 4, 189, :_reduce_79, + 1, 189, :_reduce_80, + 3, 189, :_reduce_81, + 1, 193, :_reduce_none, + 3, 193, :_reduce_83, + 2, 192, :_reduce_84, + 3, 192, :_reduce_85, + 1, 195, :_reduce_86, + 3, 195, :_reduce_87, + 1, 194, :_reduce_88, + 1, 194, :_reduce_89, + 4, 194, :_reduce_90, + 3, 194, :_reduce_91, + 3, 194, :_reduce_92, + 3, 194, :_reduce_93, + 3, 194, :_reduce_94, + 2, 194, :_reduce_95, + 1, 194, :_reduce_96, + 1, 170, :_reduce_97, + 1, 170, :_reduce_98, + 4, 170, :_reduce_99, + 3, 170, :_reduce_100, + 3, 170, :_reduce_101, + 3, 170, :_reduce_102, + 3, 170, :_reduce_103, + 2, 170, :_reduce_104, + 1, 170, :_reduce_105, + 1, 198, :_reduce_106, + 1, 198, :_reduce_none, + 2, 199, :_reduce_108, + 1, 199, :_reduce_109, + 3, 199, :_reduce_110, + 1, 200, :_reduce_none, + 1, 200, :_reduce_none, + 1, 200, :_reduce_none, + 1, 200, :_reduce_none, + 1, 200, :_reduce_none, + 1, 203, :_reduce_116, + 1, 203, :_reduce_none, + 1, 159, :_reduce_none, + 1, 159, :_reduce_none, + 1, 160, :_reduce_120, + 0, 206, :_reduce_121, + 4, 160, :_reduce_122, + 1, 201, :_reduce_none, + 1, 201, :_reduce_none, + 1, 201, :_reduce_none, + 1, 201, :_reduce_none, + 1, 201, :_reduce_none, + 1, 201, :_reduce_none, + 1, 201, :_reduce_none, + 1, 201, :_reduce_none, + 1, 201, :_reduce_none, + 1, 201, :_reduce_none, + 1, 201, :_reduce_none, + 1, 201, :_reduce_none, + 1, 201, :_reduce_none, + 1, 201, :_reduce_none, + 1, 201, :_reduce_none, + 1, 201, :_reduce_none, + 1, 201, :_reduce_none, + 1, 201, :_reduce_none, + 1, 201, :_reduce_none, + 1, 201, :_reduce_none, + 1, 201, :_reduce_none, + 1, 201, :_reduce_none, + 1, 201, :_reduce_none, + 1, 201, :_reduce_none, + 1, 201, :_reduce_none, + 1, 201, :_reduce_none, + 1, 201, :_reduce_none, + 1, 201, :_reduce_none, + 1, 201, :_reduce_none, + 1, 201, :_reduce_none, + 1, 202, :_reduce_none, + 1, 202, :_reduce_none, + 1, 202, :_reduce_none, + 1, 202, :_reduce_none, + 1, 202, :_reduce_none, + 1, 202, :_reduce_none, + 1, 202, :_reduce_none, + 1, 202, :_reduce_none, + 1, 202, :_reduce_none, + 1, 202, :_reduce_none, + 1, 202, :_reduce_none, + 1, 202, :_reduce_none, + 1, 202, :_reduce_none, + 1, 202, :_reduce_none, + 1, 202, :_reduce_none, + 1, 202, :_reduce_none, + 1, 202, :_reduce_none, + 1, 202, :_reduce_none, + 1, 202, :_reduce_none, + 1, 202, :_reduce_none, + 1, 202, :_reduce_none, + 1, 202, :_reduce_none, + 1, 202, :_reduce_none, + 1, 202, :_reduce_none, + 1, 202, :_reduce_none, + 1, 202, :_reduce_none, + 1, 202, :_reduce_none, + 1, 202, :_reduce_none, + 1, 202, :_reduce_none, + 1, 202, :_reduce_none, + 1, 202, :_reduce_none, + 1, 202, :_reduce_none, + 1, 202, :_reduce_none, + 1, 202, :_reduce_none, + 1, 202, :_reduce_none, + 1, 202, :_reduce_none, + 1, 202, :_reduce_none, + 1, 202, :_reduce_none, + 1, 202, :_reduce_none, + 1, 202, :_reduce_none, + 1, 202, :_reduce_none, + 3, 176, :_reduce_194, + 5, 176, :_reduce_195, + 3, 176, :_reduce_196, + 5, 176, :_reduce_197, + 6, 176, :_reduce_198, + 5, 176, :_reduce_199, + 5, 176, :_reduce_200, + 5, 176, :_reduce_201, + 5, 176, :_reduce_202, + 4, 176, :_reduce_203, + 3, 176, :_reduce_204, + 3, 176, :_reduce_205, + 3, 176, :_reduce_206, + 3, 176, :_reduce_207, + 3, 176, :_reduce_208, + 3, 176, :_reduce_209, + 3, 176, :_reduce_210, + 3, 176, :_reduce_211, + 3, 176, :_reduce_212, + 4, 176, :_reduce_213, + 2, 176, :_reduce_214, + 2, 176, :_reduce_215, + 3, 176, :_reduce_216, + 3, 176, :_reduce_217, + 3, 176, :_reduce_218, + 3, 176, :_reduce_219, + 3, 176, :_reduce_220, + 3, 176, :_reduce_221, + 3, 176, :_reduce_222, + 3, 176, :_reduce_223, + 3, 176, :_reduce_224, + 3, 176, :_reduce_225, + 3, 176, :_reduce_226, + 3, 176, :_reduce_227, + 3, 176, :_reduce_228, + 2, 176, :_reduce_229, + 2, 176, :_reduce_230, + 3, 176, :_reduce_231, + 3, 176, :_reduce_232, + 3, 176, :_reduce_233, + 3, 176, :_reduce_234, + 3, 176, :_reduce_235, + 6, 176, :_reduce_236, + 1, 176, :_reduce_none, + 1, 209, :_reduce_none, + 1, 210, :_reduce_none, + 2, 210, :_reduce_none, + 4, 210, :_reduce_241, + 2, 210, :_reduce_242, + 3, 215, :_reduce_243, + 0, 216, :_reduce_244, + 1, 216, :_reduce_none, + 0, 167, :_reduce_246, + 1, 167, :_reduce_none, + 2, 167, :_reduce_none, + 4, 167, :_reduce_249, + 2, 167, :_reduce_250, + 1, 188, :_reduce_251, + 2, 188, :_reduce_252, + 2, 188, :_reduce_253, + 4, 188, :_reduce_254, + 1, 188, :_reduce_255, + 0, 219, :_reduce_256, + 2, 182, :_reduce_257, + 2, 218, :_reduce_258, + 2, 217, :_reduce_259, + 0, 217, :_reduce_260, + 1, 212, :_reduce_261, + 2, 212, :_reduce_262, + 3, 212, :_reduce_263, + 4, 212, :_reduce_264, + 1, 172, :_reduce_265, + 1, 172, :_reduce_none, + 3, 171, :_reduce_267, + 4, 171, :_reduce_268, + 2, 171, :_reduce_269, + 1, 208, :_reduce_none, + 1, 208, :_reduce_none, + 1, 208, :_reduce_none, + 1, 208, :_reduce_none, + 1, 208, :_reduce_none, + 1, 208, :_reduce_none, + 1, 208, :_reduce_none, + 1, 208, :_reduce_none, + 1, 208, :_reduce_none, + 1, 208, :_reduce_none, + 1, 208, :_reduce_280, + 0, 244, :_reduce_281, + 4, 208, :_reduce_282, + 0, 245, :_reduce_283, + 0, 246, :_reduce_284, + 6, 208, :_reduce_285, + 0, 247, :_reduce_286, + 4, 208, :_reduce_287, + 3, 208, :_reduce_288, + 3, 208, :_reduce_289, + 2, 208, :_reduce_290, + 3, 208, :_reduce_291, + 3, 208, :_reduce_292, + 1, 208, :_reduce_293, + 4, 208, :_reduce_294, + 3, 208, :_reduce_295, + 1, 208, :_reduce_296, + 5, 208, :_reduce_297, + 4, 208, :_reduce_298, + 3, 208, :_reduce_299, + 2, 208, :_reduce_300, + 1, 208, :_reduce_none, + 2, 208, :_reduce_302, + 0, 248, :_reduce_303, + 3, 208, :_reduce_304, + 6, 208, :_reduce_305, + 6, 208, :_reduce_306, + 0, 249, :_reduce_307, + 0, 250, :_reduce_308, + 7, 208, :_reduce_309, + 0, 251, :_reduce_310, + 0, 252, :_reduce_311, + 7, 208, :_reduce_312, + 5, 208, :_reduce_313, + 4, 208, :_reduce_314, + 0, 253, :_reduce_315, + 0, 254, :_reduce_316, + 9, 208, :_reduce_317, + 0, 255, :_reduce_318, + 6, 208, :_reduce_319, + 0, 256, :_reduce_320, + 7, 208, :_reduce_321, + 0, 257, :_reduce_322, + 5, 208, :_reduce_323, + 0, 258, :_reduce_324, + 6, 208, :_reduce_325, + 0, 259, :_reduce_326, + 0, 260, :_reduce_327, + 9, 208, :_reduce_328, + 1, 208, :_reduce_329, + 1, 208, :_reduce_330, + 1, 208, :_reduce_331, + 1, 208, :_reduce_332, + 1, 166, :_reduce_none, + 1, 238, :_reduce_334, + 1, 241, :_reduce_335, + 1, 233, :_reduce_none, + 1, 233, :_reduce_none, + 2, 233, :_reduce_338, + 1, 235, :_reduce_none, + 1, 235, :_reduce_none, + 1, 234, :_reduce_none, + 5, 234, :_reduce_342, + 1, 155, :_reduce_none, + 2, 155, :_reduce_344, + 1, 237, :_reduce_none, + 1, 237, :_reduce_none, + 1, 261, :_reduce_347, + 3, 261, :_reduce_348, + 1, 264, :_reduce_349, + 3, 264, :_reduce_350, + 1, 263, :_reduce_none, + 4, 263, :_reduce_352, + 6, 263, :_reduce_353, + 3, 263, :_reduce_354, + 5, 263, :_reduce_355, + 2, 263, :_reduce_356, + 4, 263, :_reduce_357, + 1, 263, :_reduce_358, + 3, 263, :_reduce_359, + 4, 265, :_reduce_360, + 2, 265, :_reduce_361, + 2, 265, :_reduce_362, + 1, 265, :_reduce_363, + 2, 270, :_reduce_364, + 0, 270, :_reduce_365, + 6, 271, :_reduce_366, + 8, 271, :_reduce_367, + 4, 271, :_reduce_368, + 6, 271, :_reduce_369, + 4, 271, :_reduce_370, + 2, 271, :_reduce_none, + 6, 271, :_reduce_372, + 2, 271, :_reduce_373, + 4, 271, :_reduce_374, + 6, 271, :_reduce_375, + 2, 271, :_reduce_376, + 4, 271, :_reduce_377, + 2, 271, :_reduce_378, + 4, 271, :_reduce_379, + 1, 271, :_reduce_none, + 0, 184, :_reduce_381, + 1, 184, :_reduce_382, + 3, 275, :_reduce_383, + 1, 275, :_reduce_384, + 4, 275, :_reduce_385, + 1, 276, :_reduce_386, + 4, 276, :_reduce_387, + 1, 277, :_reduce_388, + 3, 277, :_reduce_389, + 1, 278, :_reduce_390, + 1, 278, :_reduce_none, + 0, 282, :_reduce_392, + 0, 283, :_reduce_393, + 4, 232, :_reduce_394, + 4, 280, :_reduce_395, + 1, 280, :_reduce_396, + 0, 286, :_reduce_397, + 4, 281, :_reduce_398, + 0, 287, :_reduce_399, + 4, 281, :_reduce_400, + 0, 288, :_reduce_401, + 5, 285, :_reduce_402, + 2, 179, :_reduce_403, + 4, 179, :_reduce_404, + 5, 179, :_reduce_405, + 5, 179, :_reduce_406, + 2, 231, :_reduce_407, + 4, 231, :_reduce_408, + 4, 231, :_reduce_409, + 3, 231, :_reduce_410, + 3, 231, :_reduce_411, + 3, 231, :_reduce_412, + 2, 231, :_reduce_413, + 1, 231, :_reduce_414, + 4, 231, :_reduce_415, + 0, 290, :_reduce_416, + 5, 230, :_reduce_417, + 0, 291, :_reduce_418, + 5, 230, :_reduce_419, + 5, 236, :_reduce_420, + 1, 292, :_reduce_421, + 1, 292, :_reduce_none, + 6, 154, :_reduce_423, + 0, 154, :_reduce_424, + 1, 293, :_reduce_425, + 1, 293, :_reduce_none, + 1, 293, :_reduce_none, + 2, 294, :_reduce_428, + 1, 294, :_reduce_none, + 2, 156, :_reduce_430, + 1, 156, :_reduce_none, + 1, 220, :_reduce_none, + 1, 220, :_reduce_none, + 1, 220, :_reduce_none, + 1, 221, :_reduce_435, + 1, 296, :_reduce_436, + 2, 296, :_reduce_437, + 3, 297, :_reduce_438, + 1, 297, :_reduce_439, + 1, 297, :_reduce_440, + 3, 222, :_reduce_441, + 4, 223, :_reduce_442, + 3, 224, :_reduce_443, + 0, 301, :_reduce_444, + 3, 301, :_reduce_445, + 1, 302, :_reduce_446, + 2, 302, :_reduce_447, + 3, 226, :_reduce_448, + 0, 304, :_reduce_449, + 3, 304, :_reduce_450, + 3, 225, :_reduce_451, + 3, 227, :_reduce_452, + 0, 305, :_reduce_453, + 3, 305, :_reduce_454, + 0, 306, :_reduce_455, + 3, 306, :_reduce_456, + 0, 298, :_reduce_457, + 2, 298, :_reduce_458, + 0, 299, :_reduce_459, + 2, 299, :_reduce_460, + 0, 300, :_reduce_461, + 2, 300, :_reduce_462, + 1, 303, :_reduce_463, + 2, 303, :_reduce_464, + 0, 308, :_reduce_465, + 4, 303, :_reduce_466, + 1, 307, :_reduce_467, + 1, 307, :_reduce_468, + 1, 307, :_reduce_469, + 1, 307, :_reduce_none, + 1, 204, :_reduce_471, + 3, 205, :_reduce_472, + 1, 295, :_reduce_473, + 2, 295, :_reduce_474, + 1, 207, :_reduce_475, + 1, 207, :_reduce_476, + 1, 207, :_reduce_477, + 1, 207, :_reduce_478, + 1, 196, :_reduce_479, + 1, 196, :_reduce_480, + 1, 196, :_reduce_481, + 1, 196, :_reduce_482, + 1, 196, :_reduce_483, + 1, 197, :_reduce_484, + 1, 197, :_reduce_485, + 1, 197, :_reduce_486, + 1, 197, :_reduce_487, + 1, 197, :_reduce_488, + 1, 197, :_reduce_489, + 1, 197, :_reduce_490, + 1, 228, :_reduce_491, + 1, 228, :_reduce_492, + 1, 165, :_reduce_493, + 1, 165, :_reduce_494, + 1, 169, :_reduce_495, + 1, 169, :_reduce_496, + 1, 239, :_reduce_497, + 0, 309, :_reduce_498, + 4, 239, :_reduce_499, + 2, 239, :_reduce_500, + 3, 242, :_reduce_501, + 0, 311, :_reduce_502, + 3, 242, :_reduce_503, + 4, 310, :_reduce_504, + 2, 310, :_reduce_505, + 2, 310, :_reduce_506, + 1, 310, :_reduce_507, + 2, 313, :_reduce_508, + 0, 313, :_reduce_509, + 6, 284, :_reduce_510, + 8, 284, :_reduce_511, + 4, 284, :_reduce_512, + 6, 284, :_reduce_513, + 4, 284, :_reduce_514, + 6, 284, :_reduce_515, + 2, 284, :_reduce_516, + 4, 284, :_reduce_517, + 6, 284, :_reduce_518, + 2, 284, :_reduce_519, + 4, 284, :_reduce_520, + 2, 284, :_reduce_521, + 4, 284, :_reduce_522, + 1, 284, :_reduce_523, + 0, 284, :_reduce_524, + 1, 279, :_reduce_525, + 1, 279, :_reduce_526, + 1, 279, :_reduce_527, + 1, 279, :_reduce_528, + 1, 262, :_reduce_none, + 1, 262, :_reduce_530, + 1, 315, :_reduce_531, + 1, 316, :_reduce_532, + 3, 316, :_reduce_533, + 1, 272, :_reduce_534, + 3, 272, :_reduce_535, + 1, 317, :_reduce_536, + 2, 318, :_reduce_537, + 1, 318, :_reduce_538, + 2, 319, :_reduce_539, + 1, 319, :_reduce_540, + 1, 266, :_reduce_541, + 3, 266, :_reduce_542, + 1, 312, :_reduce_543, + 3, 312, :_reduce_544, + 1, 320, :_reduce_none, + 1, 320, :_reduce_none, + 2, 267, :_reduce_547, + 1, 267, :_reduce_548, + 3, 321, :_reduce_549, + 3, 322, :_reduce_550, + 1, 273, :_reduce_551, + 3, 273, :_reduce_552, + 1, 314, :_reduce_553, + 3, 314, :_reduce_554, + 1, 323, :_reduce_none, + 1, 323, :_reduce_none, + 2, 274, :_reduce_557, + 1, 274, :_reduce_558, + 1, 324, :_reduce_none, + 1, 324, :_reduce_none, + 2, 269, :_reduce_561, + 2, 268, :_reduce_562, + 0, 268, :_reduce_563, + 1, 243, :_reduce_none, + 3, 243, :_reduce_565, + 0, 229, :_reduce_566, + 2, 229, :_reduce_none, + 1, 214, :_reduce_568, + 3, 214, :_reduce_569, + 3, 325, :_reduce_570, + 2, 325, :_reduce_571, + 4, 325, :_reduce_572, + 2, 325, :_reduce_573, + 1, 187, :_reduce_none, + 1, 187, :_reduce_none, + 1, 187, :_reduce_none, + 1, 181, :_reduce_none, + 1, 181, :_reduce_none, + 1, 181, :_reduce_none, + 1, 181, :_reduce_none, + 1, 289, :_reduce_none, + 1, 289, :_reduce_none, + 1, 289, :_reduce_none, + 1, 180, :_reduce_none, + 1, 180, :_reduce_none, + 0, 148, :_reduce_none, + 1, 148, :_reduce_none, + 0, 175, :_reduce_none, + 1, 175, :_reduce_none, + 2, 191, :_reduce_590, + 2, 168, :_reduce_591, + 0, 213, :_reduce_none, + 1, 213, :_reduce_none, + 1, 213, :_reduce_none, + 1, 240, :_reduce_595, + 1, 240, :_reduce_none, + 1, 150, :_reduce_none, + 2, 150, :_reduce_none, + 0, 211, :_reduce_599 ] + +racc_reduce_n = 600 + +racc_shift_n = 1027 + +racc_token_table = { + false => 0, + :error => 1, + :kCLASS => 2, + :kMODULE => 3, + :kDEF => 4, + :kUNDEF => 5, + :kBEGIN => 6, + :kRESCUE => 7, + :kENSURE => 8, + :kEND => 9, + :kIF => 10, + :kUNLESS => 11, + :kTHEN => 12, + :kELSIF => 13, + :kELSE => 14, + :kCASE => 15, + :kWHEN => 16, + :kWHILE => 17, + :kUNTIL => 18, + :kFOR => 19, + :kBREAK => 20, + :kNEXT => 21, + :kREDO => 22, + :kRETRY => 23, + :kIN => 24, + :kDO => 25, + :kDO_COND => 26, + :kDO_BLOCK => 27, + :kDO_LAMBDA => 28, + :kRETURN => 29, + :kYIELD => 30, + :kSUPER => 31, + :kSELF => 32, + :kNIL => 33, + :kTRUE => 34, + :kFALSE => 35, + :kAND => 36, + :kOR => 37, + :kNOT => 38, + :kIF_MOD => 39, + :kUNLESS_MOD => 40, + :kWHILE_MOD => 41, + :kUNTIL_MOD => 42, + :kRESCUE_MOD => 43, + :kALIAS => 44, + :kDEFINED => 45, + :klBEGIN => 46, + :klEND => 47, + :k__LINE__ => 48, + :k__FILE__ => 49, + :k__ENCODING__ => 50, + :tIDENTIFIER => 51, + :tFID => 52, + :tGVAR => 53, + :tIVAR => 54, + :tCONSTANT => 55, + :tLABEL => 56, + :tCVAR => 57, + :tNTH_REF => 58, + :tBACK_REF => 59, + :tSTRING_CONTENT => 60, + :tINTEGER => 61, + :tFLOAT => 62, + :tUPLUS => 63, + :tUMINUS => 64, + :tUNARY_NUM => 65, + :tPOW => 66, + :tCMP => 67, + :tEQ => 68, + :tEQQ => 69, + :tNEQ => 70, + :tGEQ => 71, + :tLEQ => 72, + :tANDOP => 73, + :tOROP => 74, + :tMATCH => 75, + :tNMATCH => 76, + :tDOT => 77, + :tDOT2 => 78, + :tDOT3 => 79, + :tAREF => 80, + :tASET => 81, + :tLSHFT => 82, + :tRSHFT => 83, + :tCOLON2 => 84, + :tCOLON3 => 85, + :tOP_ASGN => 86, + :tASSOC => 87, + :tLPAREN => 88, + :tLPAREN2 => 89, + :tRPAREN => 90, + :tLPAREN_ARG => 91, + :tLBRACK => 92, + :tLBRACK2 => 93, + :tRBRACK => 94, + :tLBRACE => 95, + :tLBRACE_ARG => 96, + :tSTAR => 97, + :tSTAR2 => 98, + :tAMPER => 99, + :tAMPER2 => 100, + :tTILDE => 101, + :tPERCENT => 102, + :tDIVIDE => 103, + :tDSTAR => 104, + :tPLUS => 105, + :tMINUS => 106, + :tLT => 107, + :tGT => 108, + :tPIPE => 109, + :tBANG => 110, + :tCARET => 111, + :tLCURLY => 112, + :tRCURLY => 113, + :tBACK_REF2 => 114, + :tSYMBEG => 115, + :tSTRING_BEG => 116, + :tXSTRING_BEG => 117, + :tREGEXP_BEG => 118, + :tREGEXP_OPT => 119, + :tWORDS_BEG => 120, + :tQWORDS_BEG => 121, + :tSYMBOLS_BEG => 122, + :tQSYMBOLS_BEG => 123, + :tSTRING_DBEG => 124, + :tSTRING_DVAR => 125, + :tSTRING_END => 126, + :tSTRING_DEND => 127, + :tSTRING => 128, + :tSYMBOL => 129, + :tNL => 130, + :tEH => 131, + :tCOLON => 132, + :tCOMMA => 133, + :tSPACE => 134, + :tSEMI => 135, + :tLAMBDA => 136, + :tLAMBEG => 137, + :tCHARACTER => 138, + :tRATIONAL => 139, + :tIMAGINARY => 140, + :tLABEL_END => 141, + :tEQL => 142, + :tLOWEST => 143 } + +racc_nt_base = 144 + +racc_use_result_var = true + +Racc_arg = [ + racc_action_table, + racc_action_check, + racc_action_default, + racc_action_pointer, + racc_goto_table, + racc_goto_check, + racc_goto_default, + racc_goto_pointer, + racc_nt_base, + racc_reduce_table, + racc_token_table, + racc_shift_n, + racc_reduce_n, + racc_use_result_var ] + +Racc_token_to_s_table = [ + "$end", + "error", + "kCLASS", + "kMODULE", + "kDEF", + "kUNDEF", + "kBEGIN", + "kRESCUE", + "kENSURE", + "kEND", + "kIF", + "kUNLESS", + "kTHEN", + "kELSIF", + "kELSE", + "kCASE", + "kWHEN", + "kWHILE", + "kUNTIL", + "kFOR", + "kBREAK", + "kNEXT", + "kREDO", + "kRETRY", + "kIN", + "kDO", + "kDO_COND", + "kDO_BLOCK", + "kDO_LAMBDA", + "kRETURN", + "kYIELD", + "kSUPER", + "kSELF", + "kNIL", + "kTRUE", + "kFALSE", + "kAND", + "kOR", + "kNOT", + "kIF_MOD", + "kUNLESS_MOD", + "kWHILE_MOD", + "kUNTIL_MOD", + "kRESCUE_MOD", + "kALIAS", + "kDEFINED", + "klBEGIN", + "klEND", + "k__LINE__", + "k__FILE__", + "k__ENCODING__", + "tIDENTIFIER", + "tFID", + "tGVAR", + "tIVAR", + "tCONSTANT", + "tLABEL", + "tCVAR", + "tNTH_REF", + "tBACK_REF", + "tSTRING_CONTENT", + "tINTEGER", + "tFLOAT", + "tUPLUS", + "tUMINUS", + "tUNARY_NUM", + "tPOW", + "tCMP", + "tEQ", + "tEQQ", + "tNEQ", + "tGEQ", + "tLEQ", + "tANDOP", + "tOROP", + "tMATCH", + "tNMATCH", + "tDOT", + "tDOT2", + "tDOT3", + "tAREF", + "tASET", + "tLSHFT", + "tRSHFT", + "tCOLON2", + "tCOLON3", + "tOP_ASGN", + "tASSOC", + "tLPAREN", + "tLPAREN2", + "tRPAREN", + "tLPAREN_ARG", + "tLBRACK", + "tLBRACK2", + "tRBRACK", + "tLBRACE", + "tLBRACE_ARG", + "tSTAR", + "tSTAR2", + "tAMPER", + "tAMPER2", + "tTILDE", + "tPERCENT", + "tDIVIDE", + "tDSTAR", + "tPLUS", + "tMINUS", + "tLT", + "tGT", + "tPIPE", + "tBANG", + "tCARET", + "tLCURLY", + "tRCURLY", + "tBACK_REF2", + "tSYMBEG", + "tSTRING_BEG", + "tXSTRING_BEG", + "tREGEXP_BEG", + "tREGEXP_OPT", + "tWORDS_BEG", + "tQWORDS_BEG", + "tSYMBOLS_BEG", + "tQSYMBOLS_BEG", + "tSTRING_DBEG", + "tSTRING_DVAR", + "tSTRING_END", + "tSTRING_DEND", + "tSTRING", + "tSYMBOL", + "tNL", + "tEH", + "tCOLON", + "tCOMMA", + "tSPACE", + "tSEMI", + "tLAMBDA", + "tLAMBEG", + "tCHARACTER", + "tRATIONAL", + "tIMAGINARY", + "tLABEL_END", + "tEQL", + "tLOWEST", + "$start", + "program", + "top_compstmt", + "top_stmts", + "opt_terms", + "top_stmt", + "terms", + "stmt", + "bodystmt", + "compstmt", + "opt_rescue", + "opt_else", + "opt_ensure", + "stmts", + "stmt_or_begin", + "fitem", + "undef_list", + "expr_value", + "command_asgn", + "mlhs", + "command_call", + "var_lhs", + "primary_value", + "opt_call_args", + "rbracket", + "backref", + "lhs", + "mrhs", + "mrhs_arg", + "expr", + "@1", + "opt_nl", + "arg", + "command", + "block_command", + "block_call", + "dot_or_colon", + "operation2", + "command_args", + "cmd_brace_block", + "opt_block_param", + "fcall", + "@2", + "operation", + "call_args", + "mlhs_basic", + "mlhs_inner", + "rparen", + "mlhs_head", + "mlhs_item", + "mlhs_node", + "mlhs_post", + "user_variable", + "keyword_variable", + "cname", + "cpath", + "fname", + "op", + "reswords", + "fsym", + "symbol", + "dsym", + "@3", + "simple_numeric", + "primary", + "arg_value", + "aref_args", + "none", + "args", + "trailer", + "assocs", + "paren_args", + "opt_paren_args", + "opt_block_arg", + "block_arg", + "@4", + "literal", + "strings", + "xstring", + "regexp", + "words", + "qwords", + "symbols", + "qsymbols", + "var_ref", + "assoc_list", + "brace_block", + "method_call", + "lambda", + "then", + "if_tail", + "do", + "case_body", + "for_var", + "k_class", + "superclass", + "term", + "k_module", + "f_arglist", + "singleton", + "@5", + "@6", + "@7", + "@8", + "@9", + "@10", + "@11", + "@12", + "@13", + "@14", + "@15", + "@16", + "@17", + "@18", + "@19", + "@20", + "@21", + "f_marg", + "f_norm_arg", + "f_margs", + "f_marg_list", + "block_args_tail", + "f_block_kwarg", + "f_kwrest", + "opt_f_block_arg", + "f_block_arg", + "opt_block_args_tail", + "block_param", + "f_arg", + "f_block_optarg", + "f_rest_arg", + "block_param_def", + "opt_bv_decl", + "bv_decls", + "bvar", + "f_bad_arg", + "f_larglist", + "lambda_body", + "@22", + "@23", + "f_args", + "do_block", + "@24", + "@25", + "@26", + "operation3", + "@27", + "@28", + "cases", + "exc_list", + "exc_var", + "numeric", + "string", + "string1", + "string_contents", + "xstring_contents", + "regexp_contents", + "word_list", + "word", + "string_content", + "symbol_list", + "qword_list", + "qsym_list", + "string_dvar", + "@29", + "@30", + "args_tail", + "@31", + "f_kwarg", + "opt_args_tail", + "f_optarg", + "f_arg_asgn", + "f_arg_item", + "f_label", + "f_kw", + "f_block_kw", + "kwrest_mark", + "f_opt", + "f_block_opt", + "restarg_mark", + "blkarg_mark", + "assoc" ] + +Racc_debug_parser = false + +##### State transition tables end ##### + +# reduce 0 omitted + +# reduce 1 omitted + +def _reduce_2(val, _values, result) + result = @builder.compstmt(val[0]) + + result +end + +def _reduce_3(val, _values, result) + result = [] + + result +end + +def _reduce_4(val, _values, result) + result = [ val[0] ] + + result +end + +def _reduce_5(val, _values, result) + result = val[0] << val[2] + + result +end + +def _reduce_6(val, _values, result) + result = [ val[1] ] + + result +end + +# reduce 7 omitted + +def _reduce_8(val, _values, result) + result = @builder.preexe(val[0], val[1], val[2], val[3]) + + result +end + +def _reduce_9(val, _values, result) + rescue_bodies = val[1] + else_t, else_ = val[2] + ensure_t, ensure_ = val[3] + + if rescue_bodies.empty? && !else_t.nil? + diagnostic :warning, :useless_else, nil, else_t + end + + result = @builder.begin_body(val[0], + rescue_bodies, + else_t, else_, + ensure_t, ensure_) + + result +end + +def _reduce_10(val, _values, result) + result = @builder.compstmt(val[0]) + + result +end + +def _reduce_11(val, _values, result) + result = [] + + result +end + +def _reduce_12(val, _values, result) + result = [ val[0] ] + + result +end + +def _reduce_13(val, _values, result) + result = val[0] << val[2] + + result +end + +def _reduce_14(val, _values, result) + result = [ val[1] ] + + result +end + +# reduce 15 omitted + +def _reduce_16(val, _values, result) + diagnostic :error, :begin_in_method, nil, val[0] + + result +end + +def _reduce_17(val, _values, result) + @lexer.state = :expr_fname + + result +end + +def _reduce_18(val, _values, result) + result = @builder.alias(val[0], val[1], val[3]) + + result +end + +def _reduce_19(val, _values, result) + result = @builder.alias(val[0], + @builder.gvar(val[1]), + @builder.gvar(val[2])) + + result +end + +def _reduce_20(val, _values, result) + result = @builder.alias(val[0], + @builder.gvar(val[1]), + @builder.back_ref(val[2])) + + result +end + +def _reduce_21(val, _values, result) + diagnostic :error, :nth_ref_alias, nil, val[2] + + result +end + +def _reduce_22(val, _values, result) + result = @builder.undef_method(val[0], val[1]) + + result +end + +def _reduce_23(val, _values, result) + result = @builder.condition_mod(val[0], nil, + val[1], val[2]) + + result +end + +def _reduce_24(val, _values, result) + result = @builder.condition_mod(nil, val[0], + val[1], val[2]) + + result +end + +def _reduce_25(val, _values, result) + result = @builder.loop_mod(:while, val[0], val[1], val[2]) + + result +end + +def _reduce_26(val, _values, result) + result = @builder.loop_mod(:until, val[0], val[1], val[2]) + + result +end + +def _reduce_27(val, _values, result) + rescue_body = @builder.rescue_body(val[1], + nil, nil, nil, + nil, val[2]) + + result = @builder.begin_body(val[0], [ rescue_body ]) + + result +end + +def _reduce_28(val, _values, result) + result = @builder.postexe(val[0], val[1], val[2], val[3]) + + result +end + +# reduce 29 omitted + +def _reduce_30(val, _values, result) + result = @builder.multi_assign(val[0], val[1], val[2]) + + result +end + +def _reduce_31(val, _values, result) + result = @builder.op_assign(val[0], val[1], val[2]) + + result +end + +def _reduce_32(val, _values, result) + result = @builder.op_assign( + @builder.index( + val[0], val[1], val[2], val[3]), + val[4], val[5]) + + result +end + +def _reduce_33(val, _values, result) + result = @builder.op_assign( + @builder.call_method( + val[0], val[1], val[2]), + val[3], val[4]) + + result +end + +def _reduce_34(val, _values, result) + result = @builder.op_assign( + @builder.call_method( + val[0], val[1], val[2]), + val[3], val[4]) + + result +end + +def _reduce_35(val, _values, result) + const = @builder.const_op_assignable( + @builder.const_fetch(val[0], val[1], val[2])) + result = @builder.op_assign(const, val[3], val[4]) + + result +end + +def _reduce_36(val, _values, result) + result = @builder.op_assign( + @builder.call_method( + val[0], val[1], val[2]), + val[3], val[4]) + + result +end + +def _reduce_37(val, _values, result) + @builder.op_assign(val[0], val[1], val[2]) + + result +end + +def _reduce_38(val, _values, result) + result = @builder.assign(val[0], val[1], + @builder.array(nil, val[2], nil)) + + result +end + +def _reduce_39(val, _values, result) + result = @builder.multi_assign(val[0], val[1], val[2]) + + result +end + +# reduce 40 omitted + +def _reduce_41(val, _values, result) + result = @builder.assign(val[0], val[1], val[2]) + + result +end + +def _reduce_42(val, _values, result) + result = @builder.assign(val[0], val[1], val[2]) + + result +end + +# reduce 43 omitted + +def _reduce_44(val, _values, result) + result = @builder.logical_op(:and, val[0], val[1], val[2]) + + result +end + +def _reduce_45(val, _values, result) + result = @builder.logical_op(:or, val[0], val[1], val[2]) + + result +end + +def _reduce_46(val, _values, result) + result = @builder.not_op(val[0], nil, val[2], nil) + + result +end + +def _reduce_47(val, _values, result) + result = @builder.not_op(val[0], nil, val[1], nil) + + result +end + +# reduce 48 omitted + +# reduce 49 omitted + +# reduce 50 omitted + +# reduce 51 omitted + +# reduce 52 omitted + +def _reduce_53(val, _values, result) + result = @builder.call_method(val[0], val[1], val[2], + nil, val[3], nil) + + result +end + +def _reduce_54(val, _values, result) + @static_env.extend_dynamic + result = @context.dup + @context.in_block = true + + result +end + +def _reduce_55(val, _values, result) + result = [ val[0], val[2], val[3], val[4] ] + + @static_env.unextend + @context.in_block = val[1].in_block + + result +end + +# reduce 56 omitted + +def _reduce_57(val, _values, result) + result = @builder.call_method(nil, nil, val[0], + nil, val[1], nil) + + result +end + +def _reduce_58(val, _values, result) + method_call = @builder.call_method(nil, nil, val[0], + nil, val[1], nil) + + begin_t, args, body, end_t = val[2] + result = @builder.block(method_call, + begin_t, args, body, end_t) + + result +end + +def _reduce_59(val, _values, result) + result = @builder.call_method(val[0], val[1], val[2], + nil, val[3], nil) + + result +end + +def _reduce_60(val, _values, result) + method_call = @builder.call_method(val[0], val[1], val[2], + nil, val[3], nil) + + begin_t, args, body, end_t = val[4] + result = @builder.block(method_call, + begin_t, args, body, end_t) + + result +end + +def _reduce_61(val, _values, result) + result = @builder.call_method(val[0], val[1], val[2], + nil, val[3], nil) + + result +end + +def _reduce_62(val, _values, result) + method_call = @builder.call_method(val[0], val[1], val[2], + nil, val[3], nil) + + begin_t, args, body, end_t = val[4] + result = @builder.block(method_call, + begin_t, args, body, end_t) + + result +end + +def _reduce_63(val, _values, result) + result = @builder.keyword_cmd(:super, val[0], + nil, val[1], nil) + + result +end + +def _reduce_64(val, _values, result) + result = @builder.keyword_cmd(:yield, val[0], + nil, val[1], nil) + + result +end + +def _reduce_65(val, _values, result) + result = @builder.keyword_cmd(:return, val[0], + nil, val[1], nil) + + result +end + +def _reduce_66(val, _values, result) + result = @builder.keyword_cmd(:break, val[0], + nil, val[1], nil) + + result +end + +def _reduce_67(val, _values, result) + result = @builder.keyword_cmd(:next, val[0], + nil, val[1], nil) + + result +end + +def _reduce_68(val, _values, result) + result = @builder.multi_lhs(nil, val[0], nil) + + result +end + +def _reduce_69(val, _values, result) + result = @builder.begin(val[0], val[1], val[2]) + + result +end + +def _reduce_70(val, _values, result) + result = @builder.multi_lhs(nil, val[0], nil) + + result +end + +def _reduce_71(val, _values, result) + result = @builder.multi_lhs(val[0], val[1], val[2]) + + result +end + +# reduce 72 omitted + +def _reduce_73(val, _values, result) + result = val[0]. + push(val[1]) + + result +end + +def _reduce_74(val, _values, result) + result = val[0]. + push(@builder.splat(val[1], val[2])) + + result +end + +def _reduce_75(val, _values, result) + result = val[0]. + push(@builder.splat(val[1], val[2])). + concat(val[4]) + + result +end + +def _reduce_76(val, _values, result) + result = val[0]. + push(@builder.splat(val[1])) + + result +end + +def _reduce_77(val, _values, result) + result = val[0]. + push(@builder.splat(val[1])). + concat(val[3]) + + result +end + +def _reduce_78(val, _values, result) + result = [ @builder.splat(val[0], val[1]) ] + + result +end + +def _reduce_79(val, _values, result) + result = [ @builder.splat(val[0], val[1]), + *val[3] ] + + result +end + +def _reduce_80(val, _values, result) + result = [ @builder.splat(val[0]) ] + + result +end + +def _reduce_81(val, _values, result) + result = [ @builder.splat(val[0]), + *val[2] ] + + result +end + +# reduce 82 omitted + +def _reduce_83(val, _values, result) + result = @builder.begin(val[0], val[1], val[2]) + + result +end + +def _reduce_84(val, _values, result) + result = [ val[0] ] + + result +end + +def _reduce_85(val, _values, result) + result = val[0] << val[1] + + result +end + +def _reduce_86(val, _values, result) + result = [ val[0] ] + + result +end + +def _reduce_87(val, _values, result) + result = val[0] << val[2] + + result +end + +def _reduce_88(val, _values, result) + result = @builder.assignable(val[0]) + + result +end + +def _reduce_89(val, _values, result) + result = @builder.assignable(val[0]) + + result +end + +def _reduce_90(val, _values, result) + result = @builder.index_asgn(val[0], val[1], val[2], val[3]) + + result +end + +def _reduce_91(val, _values, result) + result = @builder.attr_asgn(val[0], val[1], val[2]) + + result +end + +def _reduce_92(val, _values, result) + result = @builder.attr_asgn(val[0], val[1], val[2]) + + result +end + +def _reduce_93(val, _values, result) + result = @builder.attr_asgn(val[0], val[1], val[2]) + + result +end + +def _reduce_94(val, _values, result) + result = @builder.assignable( + @builder.const_fetch(val[0], val[1], val[2])) + + result +end + +def _reduce_95(val, _values, result) + result = @builder.assignable( + @builder.const_global(val[0], val[1])) + + result +end + +def _reduce_96(val, _values, result) + result = @builder.assignable(val[0]) + + result +end + +def _reduce_97(val, _values, result) + result = @builder.assignable(val[0]) + + result +end + +def _reduce_98(val, _values, result) + result = @builder.assignable(val[0]) + + result +end + +def _reduce_99(val, _values, result) + result = @builder.index_asgn(val[0], val[1], val[2], val[3]) + + result +end + +def _reduce_100(val, _values, result) + result = @builder.attr_asgn(val[0], val[1], val[2]) + + result +end + +def _reduce_101(val, _values, result) + result = @builder.attr_asgn(val[0], val[1], val[2]) + + result +end + +def _reduce_102(val, _values, result) + result = @builder.attr_asgn(val[0], val[1], val[2]) + + result +end + +def _reduce_103(val, _values, result) + result = @builder.assignable( + @builder.const_fetch(val[0], val[1], val[2])) + + result +end + +def _reduce_104(val, _values, result) + result = @builder.assignable( + @builder.const_global(val[0], val[1])) + + result +end + +def _reduce_105(val, _values, result) + result = @builder.assignable(val[0]) + + result +end + +def _reduce_106(val, _values, result) + diagnostic :error, :module_name_const, nil, val[0] + + result +end + +# reduce 107 omitted + +def _reduce_108(val, _values, result) + result = @builder.const_global(val[0], val[1]) + + result +end + +def _reduce_109(val, _values, result) + result = @builder.const(val[0]) + + result +end + +def _reduce_110(val, _values, result) + result = @builder.const_fetch(val[0], val[1], val[2]) + + result +end + +# reduce 111 omitted + +# reduce 112 omitted + +# reduce 113 omitted + +# reduce 114 omitted + +# reduce 115 omitted + +def _reduce_116(val, _values, result) + result = @builder.symbol_internal(val[0]) + + result +end + +# reduce 117 omitted + +# reduce 118 omitted + +# reduce 119 omitted + +def _reduce_120(val, _values, result) + result = [ val[0] ] + + result +end + +def _reduce_121(val, _values, result) + @lexer.state = :expr_fname + + result +end + +def _reduce_122(val, _values, result) + result = val[0] << val[3] + + result +end + +# reduce 123 omitted + +# reduce 124 omitted + +# reduce 125 omitted + +# reduce 126 omitted + +# reduce 127 omitted + +# reduce 128 omitted + +# reduce 129 omitted + +# reduce 130 omitted + +# reduce 131 omitted + +# reduce 132 omitted + +# reduce 133 omitted + +# reduce 134 omitted + +# reduce 135 omitted + +# reduce 136 omitted + +# reduce 137 omitted + +# reduce 138 omitted + +# reduce 139 omitted + +# reduce 140 omitted + +# reduce 141 omitted + +# reduce 142 omitted + +# reduce 143 omitted + +# reduce 144 omitted + +# reduce 145 omitted + +# reduce 146 omitted + +# reduce 147 omitted + +# reduce 148 omitted + +# reduce 149 omitted + +# reduce 150 omitted + +# reduce 151 omitted + +# reduce 152 omitted + +# reduce 153 omitted + +# reduce 154 omitted + +# reduce 155 omitted + +# reduce 156 omitted + +# reduce 157 omitted + +# reduce 158 omitted + +# reduce 159 omitted + +# reduce 160 omitted + +# reduce 161 omitted + +# reduce 162 omitted + +# reduce 163 omitted + +# reduce 164 omitted + +# reduce 165 omitted + +# reduce 166 omitted + +# reduce 167 omitted + +# reduce 168 omitted + +# reduce 169 omitted + +# reduce 170 omitted + +# reduce 171 omitted + +# reduce 172 omitted + +# reduce 173 omitted + +# reduce 174 omitted + +# reduce 175 omitted + +# reduce 176 omitted + +# reduce 177 omitted + +# reduce 178 omitted + +# reduce 179 omitted + +# reduce 180 omitted + +# reduce 181 omitted + +# reduce 182 omitted + +# reduce 183 omitted + +# reduce 184 omitted + +# reduce 185 omitted + +# reduce 186 omitted + +# reduce 187 omitted + +# reduce 188 omitted + +# reduce 189 omitted + +# reduce 190 omitted + +# reduce 191 omitted + +# reduce 192 omitted + +# reduce 193 omitted + +def _reduce_194(val, _values, result) + result = @builder.assign(val[0], val[1], val[2]) + + result +end + +def _reduce_195(val, _values, result) + rescue_body = @builder.rescue_body(val[3], + nil, nil, nil, + nil, val[4]) + + rescue_ = @builder.begin_body(val[2], [ rescue_body ]) + + result = @builder.assign(val[0], val[1], rescue_) + + result +end + +def _reduce_196(val, _values, result) + result = @builder.op_assign(val[0], val[1], val[2]) + + result +end + +def _reduce_197(val, _values, result) + rescue_body = @builder.rescue_body(val[3], + nil, nil, nil, + nil, val[4]) + + rescue_ = @builder.begin_body(val[2], [ rescue_body ]) + + result = @builder.op_assign(val[0], val[1], rescue_) + + result +end + +def _reduce_198(val, _values, result) + result = @builder.op_assign( + @builder.index( + val[0], val[1], val[2], val[3]), + val[4], val[5]) + + result +end + +def _reduce_199(val, _values, result) + result = @builder.op_assign( + @builder.call_method( + val[0], val[1], val[2]), + val[3], val[4]) + + result +end + +def _reduce_200(val, _values, result) + result = @builder.op_assign( + @builder.call_method( + val[0], val[1], val[2]), + val[3], val[4]) + + result +end + +def _reduce_201(val, _values, result) + result = @builder.op_assign( + @builder.call_method( + val[0], val[1], val[2]), + val[3], val[4]) + + result +end + +def _reduce_202(val, _values, result) + const = @builder.const_op_assignable( + @builder.const_fetch(val[0], val[1], val[2])) + result = @builder.op_assign(const, val[3], val[4]) + + result +end + +def _reduce_203(val, _values, result) + const = @builder.const_op_assignable( + @builder.const_global(val[0], val[1])) + result = @builder.op_assign(const, val[2], val[3]) + + result +end + +def _reduce_204(val, _values, result) + result = @builder.op_assign(val[0], val[1], val[2]) + + result +end + +def _reduce_205(val, _values, result) + result = @builder.range_inclusive(val[0], val[1], val[2]) + + result +end + +def _reduce_206(val, _values, result) + result = @builder.range_exclusive(val[0], val[1], val[2]) + + result +end + +def _reduce_207(val, _values, result) + result = @builder.binary_op(val[0], val[1], val[2]) + + result +end + +def _reduce_208(val, _values, result) + result = @builder.binary_op(val[0], val[1], val[2]) + + result +end + +def _reduce_209(val, _values, result) + result = @builder.binary_op(val[0], val[1], val[2]) + + result +end + +def _reduce_210(val, _values, result) + result = @builder.binary_op(val[0], val[1], val[2]) + + result +end + +def _reduce_211(val, _values, result) + result = @builder.binary_op(val[0], val[1], val[2]) + + result +end + +def _reduce_212(val, _values, result) + result = @builder.binary_op(val[0], val[1], val[2]) + + result +end + +def _reduce_213(val, _values, result) + result = @builder.unary_op(val[0], + @builder.binary_op( + val[1], val[2], val[3])) + + result +end + +def _reduce_214(val, _values, result) + result = @builder.unary_op(val[0], val[1]) + + result +end + +def _reduce_215(val, _values, result) + result = @builder.unary_op(val[0], val[1]) + + result +end + +def _reduce_216(val, _values, result) + result = @builder.binary_op(val[0], val[1], val[2]) + + result +end + +def _reduce_217(val, _values, result) + result = @builder.binary_op(val[0], val[1], val[2]) + + result +end + +def _reduce_218(val, _values, result) + result = @builder.binary_op(val[0], val[1], val[2]) + + result +end + +def _reduce_219(val, _values, result) + result = @builder.binary_op(val[0], val[1], val[2]) + + result +end + +def _reduce_220(val, _values, result) + result = @builder.binary_op(val[0], val[1], val[2]) + + result +end + +def _reduce_221(val, _values, result) + result = @builder.binary_op(val[0], val[1], val[2]) + + result +end + +def _reduce_222(val, _values, result) + result = @builder.binary_op(val[0], val[1], val[2]) + + result +end + +def _reduce_223(val, _values, result) + result = @builder.binary_op(val[0], val[1], val[2]) + + result +end + +def _reduce_224(val, _values, result) + result = @builder.binary_op(val[0], val[1], val[2]) + + result +end + +def _reduce_225(val, _values, result) + result = @builder.binary_op(val[0], val[1], val[2]) + + result +end + +def _reduce_226(val, _values, result) + result = @builder.binary_op(val[0], val[1], val[2]) + + result +end + +def _reduce_227(val, _values, result) + result = @builder.match_op(val[0], val[1], val[2]) + + result +end + +def _reduce_228(val, _values, result) + result = @builder.binary_op(val[0], val[1], val[2]) + + result +end + +def _reduce_229(val, _values, result) + result = @builder.not_op(val[0], nil, val[1], nil) + + result +end + +def _reduce_230(val, _values, result) + result = @builder.unary_op(val[0], val[1]) + + result +end + +def _reduce_231(val, _values, result) + result = @builder.binary_op(val[0], val[1], val[2]) + + result +end + +def _reduce_232(val, _values, result) + result = @builder.binary_op(val[0], val[1], val[2]) + + result +end + +def _reduce_233(val, _values, result) + result = @builder.logical_op(:and, val[0], val[1], val[2]) + + result +end + +def _reduce_234(val, _values, result) + result = @builder.logical_op(:or, val[0], val[1], val[2]) + + result +end + +def _reduce_235(val, _values, result) + result = @builder.keyword_cmd(:defined?, val[0], nil, [ val[2] ], nil) + + result +end + +def _reduce_236(val, _values, result) + result = @builder.ternary(val[0], val[1], + val[2], val[4], val[5]) + + result +end + +# reduce 237 omitted + +# reduce 238 omitted + +# reduce 239 omitted + +# reduce 240 omitted + +def _reduce_241(val, _values, result) + result = val[0] << @builder.associate(nil, val[2], nil) + + result +end + +def _reduce_242(val, _values, result) + result = [ @builder.associate(nil, val[0], nil) ] + + result +end + +def _reduce_243(val, _values, result) + result = val + + result +end + +def _reduce_244(val, _values, result) + result = [ nil, [], nil ] + + result +end + +# reduce 245 omitted + +def _reduce_246(val, _values, result) + result = [] + + result +end + +# reduce 247 omitted + +# reduce 248 omitted + +def _reduce_249(val, _values, result) + result = val[0] << @builder.associate(nil, val[2], nil) + + result +end + +def _reduce_250(val, _values, result) + result = [ @builder.associate(nil, val[0], nil) ] + + result +end + +def _reduce_251(val, _values, result) + result = [ val[0] ] + + result +end + +def _reduce_252(val, _values, result) + result = val[0].concat(val[1]) + + result +end + +def _reduce_253(val, _values, result) + result = [ @builder.associate(nil, val[0], nil) ] + result.concat(val[1]) + + result +end + +def _reduce_254(val, _values, result) + assocs = @builder.associate(nil, val[2], nil) + result = val[0] << assocs + result.concat(val[3]) + + result +end + +def _reduce_255(val, _values, result) + result = [ val[0] ] + + result +end + +def _reduce_256(val, _values, result) + result = @lexer.cmdarg.dup + @lexer.cmdarg.push(true) + + result +end + +def _reduce_257(val, _values, result) + @lexer.cmdarg = val[0] + + result = val[1] + + result +end + +def _reduce_258(val, _values, result) + result = @builder.block_pass(val[0], val[1]) + + result +end + +def _reduce_259(val, _values, result) + result = [ val[1] ] + + result +end + +def _reduce_260(val, _values, result) + result = [] + + result +end + +def _reduce_261(val, _values, result) + result = [ val[0] ] + + result +end + +def _reduce_262(val, _values, result) + result = [ @builder.splat(val[0], val[1]) ] + + result +end + +def _reduce_263(val, _values, result) + result = val[0] << val[2] + + result +end + +def _reduce_264(val, _values, result) + result = val[0] << @builder.splat(val[2], val[3]) + + result +end + +def _reduce_265(val, _values, result) + result = @builder.array(nil, val[0], nil) + + result +end + +# reduce 266 omitted + +def _reduce_267(val, _values, result) + result = val[0] << val[2] + + result +end + +def _reduce_268(val, _values, result) + result = val[0] << @builder.splat(val[2], val[3]) + + result +end + +def _reduce_269(val, _values, result) + result = [ @builder.splat(val[0], val[1]) ] + + result +end + +# reduce 270 omitted + +# reduce 271 omitted + +# reduce 272 omitted + +# reduce 273 omitted + +# reduce 274 omitted + +# reduce 275 omitted + +# reduce 276 omitted + +# reduce 277 omitted + +# reduce 278 omitted + +# reduce 279 omitted + +def _reduce_280(val, _values, result) + result = @builder.call_method(nil, nil, val[0]) + + result +end + +def _reduce_281(val, _values, result) + result = @lexer.cmdarg.dup + @lexer.cmdarg.clear + + result +end + +def _reduce_282(val, _values, result) + @lexer.cmdarg = val[1] + + result = @builder.begin_keyword(val[0], val[2], val[3]) + + result +end + +def _reduce_283(val, _values, result) + result = @lexer.cmdarg.dup + @lexer.cmdarg.clear + + result +end + +def _reduce_284(val, _values, result) + @lexer.state = :expr_endarg + + result +end + +def _reduce_285(val, _values, result) + @lexer.cmdarg = val[1] + + result = @builder.begin(val[0], val[2], val[5]) + + result +end + +def _reduce_286(val, _values, result) + @lexer.state = :expr_endarg + + result +end + +def _reduce_287(val, _values, result) + result = @builder.begin(val[0], nil, val[3]) + + result +end + +def _reduce_288(val, _values, result) + result = @builder.begin(val[0], val[1], val[2]) + + result +end + +def _reduce_289(val, _values, result) + result = @builder.const_fetch(val[0], val[1], val[2]) + + result +end + +def _reduce_290(val, _values, result) + result = @builder.const_global(val[0], val[1]) + + result +end + +def _reduce_291(val, _values, result) + result = @builder.array(val[0], val[1], val[2]) + + result +end + +def _reduce_292(val, _values, result) + result = @builder.associate(val[0], val[1], val[2]) + + result +end + +def _reduce_293(val, _values, result) + result = @builder.keyword_cmd(:return, val[0]) + + result +end + +def _reduce_294(val, _values, result) + result = @builder.keyword_cmd(:yield, val[0], val[1], val[2], val[3]) + + result +end + +def _reduce_295(val, _values, result) + result = @builder.keyword_cmd(:yield, val[0], val[1], [], val[2]) + + result +end + +def _reduce_296(val, _values, result) + result = @builder.keyword_cmd(:yield, val[0]) + + result +end + +def _reduce_297(val, _values, result) + result = @builder.keyword_cmd(:defined?, val[0], + val[2], [ val[3] ], val[4]) + + result +end + +def _reduce_298(val, _values, result) + result = @builder.not_op(val[0], val[1], val[2], val[3]) + + result +end + +def _reduce_299(val, _values, result) + result = @builder.not_op(val[0], val[1], nil, val[2]) + + result +end + +def _reduce_300(val, _values, result) + method_call = @builder.call_method(nil, nil, val[0]) + + begin_t, args, body, end_t = val[1] + result = @builder.block(method_call, + begin_t, args, body, end_t) + + result +end + +# reduce 301 omitted + +def _reduce_302(val, _values, result) + begin_t, args, body, end_t = val[1] + result = @builder.block(val[0], + begin_t, args, body, end_t) + + result +end + +def _reduce_303(val, _values, result) + result = @context.dup + @context.in_lambda = true + + result +end + +def _reduce_304(val, _values, result) + lambda_call = @builder.call_lambda(val[0]) + + args, (begin_t, body, end_t) = val[2] + result = @builder.block(lambda_call, + begin_t, args, body, end_t) + + @context.in_lambda = val[1].in_lambda + + result +end + +def _reduce_305(val, _values, result) + else_t, else_ = val[4] + result = @builder.condition(val[0], val[1], val[2], + val[3], else_t, + else_, val[5]) + + result +end + +def _reduce_306(val, _values, result) + else_t, else_ = val[4] + result = @builder.condition(val[0], val[1], val[2], + else_, else_t, + val[3], val[5]) + + result +end + +def _reduce_307(val, _values, result) + @lexer.cond.push(true) + + result +end + +def _reduce_308(val, _values, result) + @lexer.cond.pop + + result +end + +def _reduce_309(val, _values, result) + result = @builder.loop(:while, val[0], val[2], val[3], + val[5], val[6]) + + result +end + +def _reduce_310(val, _values, result) + @lexer.cond.push(true) + + result +end + +def _reduce_311(val, _values, result) + @lexer.cond.pop + + result +end + +def _reduce_312(val, _values, result) + result = @builder.loop(:until, val[0], val[2], val[3], + val[5], val[6]) + + result +end + +def _reduce_313(val, _values, result) + *when_bodies, (else_t, else_body) = *val[3] + + result = @builder.case(val[0], val[1], + when_bodies, else_t, else_body, + val[4]) + + result +end + +def _reduce_314(val, _values, result) + *when_bodies, (else_t, else_body) = *val[2] + + result = @builder.case(val[0], nil, + when_bodies, else_t, else_body, + val[3]) + + result +end + +def _reduce_315(val, _values, result) + @lexer.cond.push(true) + + result +end + +def _reduce_316(val, _values, result) + @lexer.cond.pop + + result +end + +def _reduce_317(val, _values, result) + result = @builder.for(val[0], val[1], + val[2], val[4], + val[5], val[7], val[8]) + + result +end + +def _reduce_318(val, _values, result) + local_push + @context.in_class = true + + result +end + +def _reduce_319(val, _values, result) + k_class, ctx = val[0] + if @context.in_def + diagnostic :error, :class_in_def, nil, k_class + end + + lt_t, superclass = val[2] + result = @builder.def_class(k_class, val[1], + lt_t, superclass, + val[4], val[5]) + + local_pop + @context.in_class = ctx.in_class + + result +end + +def _reduce_320(val, _values, result) + @context.in_def = false + @context.in_class = false + local_push + + result +end + +def _reduce_321(val, _values, result) + k_class, ctx = val[0] + result = @builder.def_sclass(k_class, val[1], val[2], + val[5], val[6]) + + local_pop + @context.in_def = ctx.in_def + @context.in_class = ctx.in_class + + result +end + +def _reduce_322(val, _values, result) + @context.in_class = true + local_push + + result +end + +def _reduce_323(val, _values, result) + k_mod, ctx = val[0] + if @context.in_def + diagnostic :error, :module_in_def, nil, k_mod + end + + result = @builder.def_module(k_mod, val[1], + val[3], val[4]) + + local_pop + @context.in_class = ctx.in_class + + result +end + +def _reduce_324(val, _values, result) + local_push + result = context.dup + @context.in_def = true + + result +end + +def _reduce_325(val, _values, result) + result = @builder.def_method(val[0], val[1], + val[3], val[4], val[5]) + + local_pop + @context.in_def = val[2].in_def + + result +end + +def _reduce_326(val, _values, result) + @lexer.state = :expr_fname + + result +end + +def _reduce_327(val, _values, result) + local_push + result = context.dup + @context.in_def = true + + result +end + +def _reduce_328(val, _values, result) + result = @builder.def_singleton(val[0], val[1], val[2], + val[4], val[6], val[7], val[8]) + + local_pop + @context.in_def = val[5].in_def + + result +end + +def _reduce_329(val, _values, result) + result = @builder.keyword_cmd(:break, val[0]) + + result +end + +def _reduce_330(val, _values, result) + result = @builder.keyword_cmd(:next, val[0]) + + result +end + +def _reduce_331(val, _values, result) + result = @builder.keyword_cmd(:redo, val[0]) + + result +end + +def _reduce_332(val, _values, result) + result = @builder.keyword_cmd(:retry, val[0]) + + result +end + +# reduce 333 omitted + +def _reduce_334(val, _values, result) + result = [ val[0], @context.dup ] + + result +end + +def _reduce_335(val, _values, result) + result = [ val[0], @context.dup ] + + result +end + +# reduce 336 omitted + +# reduce 337 omitted + +def _reduce_338(val, _values, result) + result = val[1] + + result +end + +# reduce 339 omitted + +# reduce 340 omitted + +# reduce 341 omitted + +def _reduce_342(val, _values, result) + else_t, else_ = val[4] + result = [ val[0], + @builder.condition(val[0], val[1], val[2], + val[3], else_t, + else_, nil), + ] + + result +end + +# reduce 343 omitted + +def _reduce_344(val, _values, result) + result = val + + result +end + +# reduce 345 omitted + +# reduce 346 omitted + +def _reduce_347(val, _values, result) + result = @builder.arg(val[0]) + + result +end + +def _reduce_348(val, _values, result) + result = @builder.multi_lhs(val[0], val[1], val[2]) + + result +end + +def _reduce_349(val, _values, result) + result = [ val[0] ] + + result +end + +def _reduce_350(val, _values, result) + result = val[0] << val[2] + + result +end + +# reduce 351 omitted + +def _reduce_352(val, _values, result) + result = val[0]. + push(@builder.restarg(val[2], val[3])) + + result +end + +def _reduce_353(val, _values, result) + result = val[0]. + push(@builder.restarg(val[2], val[3])). + concat(val[5]) + + result +end + +def _reduce_354(val, _values, result) + result = val[0]. + push(@builder.restarg(val[2])) + + result +end + +def _reduce_355(val, _values, result) + result = val[0]. + push(@builder.restarg(val[2])). + concat(val[4]) + + result +end + +def _reduce_356(val, _values, result) + result = [ @builder.restarg(val[0], val[1]) ] + + result +end + +def _reduce_357(val, _values, result) + result = [ @builder.restarg(val[0], val[1]), + *val[3] ] + + result +end + +def _reduce_358(val, _values, result) + result = [ @builder.restarg(val[0]) ] + + result +end + +def _reduce_359(val, _values, result) + result = [ @builder.restarg(val[0]), + *val[2] ] + + result +end + +def _reduce_360(val, _values, result) + result = val[0].concat(val[2]).concat(val[3]) + + result +end + +def _reduce_361(val, _values, result) + result = val[0].concat(val[1]) + + result +end + +def _reduce_362(val, _values, result) + result = val[0].concat(val[1]) + + result +end + +def _reduce_363(val, _values, result) + result = [ val[0] ] + + result +end + +def _reduce_364(val, _values, result) + result = val[1] + + result +end + +def _reduce_365(val, _values, result) + result = [] + + result +end + +def _reduce_366(val, _values, result) + result = val[0]. + concat(val[2]). + concat(val[4]). + concat(val[5]) + + result +end + +def _reduce_367(val, _values, result) + result = val[0]. + concat(val[2]). + concat(val[4]). + concat(val[6]). + concat(val[7]) + + result +end + +def _reduce_368(val, _values, result) + result = val[0]. + concat(val[2]). + concat(val[3]) + + result +end + +def _reduce_369(val, _values, result) + result = val[0]. + concat(val[2]). + concat(val[4]). + concat(val[5]) + + result +end + +def _reduce_370(val, _values, result) + result = val[0]. + concat(val[2]). + concat(val[3]) + + result +end + +# reduce 371 omitted + +def _reduce_372(val, _values, result) + result = val[0]. + concat(val[2]). + concat(val[4]). + concat(val[5]) + + result +end + +def _reduce_373(val, _values, result) + if val[1].empty? && val[0].size == 1 + result = [@builder.procarg0(val[0][0])] + else + result = val[0].concat(val[1]) + end + + result +end + +def _reduce_374(val, _values, result) + result = val[0]. + concat(val[2]). + concat(val[3]) + + result +end + +def _reduce_375(val, _values, result) + result = val[0]. + concat(val[2]). + concat(val[4]). + concat(val[5]) + + result +end + +def _reduce_376(val, _values, result) + result = val[0]. + concat(val[1]) + + result +end + +def _reduce_377(val, _values, result) + result = val[0]. + concat(val[2]). + concat(val[3]) + + result +end + +def _reduce_378(val, _values, result) + result = val[0]. + concat(val[1]) + + result +end + +def _reduce_379(val, _values, result) + result = val[0]. + concat(val[2]). + concat(val[3]) + + result +end + +# reduce 380 omitted + +def _reduce_381(val, _values, result) + result = @builder.args(nil, [], nil) + + result +end + +def _reduce_382(val, _values, result) + @lexer.state = :expr_value + + result +end + +def _reduce_383(val, _values, result) + result = @builder.args(val[0], val[1], val[2]) + + result +end + +def _reduce_384(val, _values, result) + result = @builder.args(val[0], [], val[0]) + + result +end + +def _reduce_385(val, _values, result) + result = @builder.args(val[0], val[1].concat(val[2]), val[3]) + + result +end + +def _reduce_386(val, _values, result) + result = [] + + result +end + +def _reduce_387(val, _values, result) + result = val[2] + + result +end + +def _reduce_388(val, _values, result) + result = [ val[0] ] + + result +end + +def _reduce_389(val, _values, result) + result = val[0] << val[2] + + result +end + +def _reduce_390(val, _values, result) + @static_env.declare val[0][0] + result = @builder.shadowarg(val[0]) + + result +end + +# reduce 391 omitted + +def _reduce_392(val, _values, result) + @static_env.extend_dynamic + + result +end + +def _reduce_393(val, _values, result) + result = @lexer.cmdarg.dup + @lexer.cmdarg.clear + + result +end + +def _reduce_394(val, _values, result) + @lexer.cmdarg = val[2] + @lexer.cmdarg.lexpop + + result = [ val[1], val[3] ] + + @static_env.unextend + + result +end + +def _reduce_395(val, _values, result) + result = @builder.args(val[0], val[1].concat(val[2]), val[3]) + + result +end + +def _reduce_396(val, _values, result) + result = @builder.args(nil, val[0], nil) + + result +end + +def _reduce_397(val, _values, result) + result = @context.dup + @context.in_lambda = true + + result +end + +def _reduce_398(val, _values, result) + result = [ val[0], val[2], val[3] ] + @context.in_lambda = val[1].in_lambda + + result +end + +def _reduce_399(val, _values, result) + result = @context.dup + @context.in_lambda = true + + result +end + +def _reduce_400(val, _values, result) + result = [ val[0], val[2], val[3] ] + @context.in_lambda = val[1].in_lambda + + result +end + +def _reduce_401(val, _values, result) + @static_env.extend_dynamic + result = @context.dup + @context.in_block = true + + result +end + +def _reduce_402(val, _values, result) + result = [ val[0], val[2], val[3], val[4] ] + + @static_env.unextend + @context.in_block = val[1].in_block + + result +end + +def _reduce_403(val, _values, result) + begin_t, block_args, body, end_t = val[1] + result = @builder.block(val[0], + begin_t, block_args, body, end_t) + + result +end + +def _reduce_404(val, _values, result) + lparen_t, args, rparen_t = val[3] + result = @builder.call_method(val[0], val[1], val[2], + lparen_t, args, rparen_t) + + result +end + +def _reduce_405(val, _values, result) + lparen_t, args, rparen_t = val[3] + method_call = @builder.call_method(val[0], val[1], val[2], + lparen_t, args, rparen_t) + + begin_t, args, body, end_t = val[4] + result = @builder.block(method_call, + begin_t, args, body, end_t) + + result +end + +def _reduce_406(val, _values, result) + method_call = @builder.call_method(val[0], val[1], val[2], + nil, val[3], nil) + + begin_t, args, body, end_t = val[4] + result = @builder.block(method_call, + begin_t, args, body, end_t) + + result +end + +def _reduce_407(val, _values, result) + lparen_t, args, rparen_t = val[1] + result = @builder.call_method(nil, nil, val[0], + lparen_t, args, rparen_t) + + result +end + +def _reduce_408(val, _values, result) + lparen_t, args, rparen_t = val[3] + result = @builder.call_method(val[0], val[1], val[2], + lparen_t, args, rparen_t) + + result +end + +def _reduce_409(val, _values, result) + lparen_t, args, rparen_t = val[3] + result = @builder.call_method(val[0], val[1], val[2], + lparen_t, args, rparen_t) + + result +end + +def _reduce_410(val, _values, result) + result = @builder.call_method(val[0], val[1], val[2]) + + result +end + +def _reduce_411(val, _values, result) + lparen_t, args, rparen_t = val[2] + result = @builder.call_method(val[0], val[1], nil, + lparen_t, args, rparen_t) + + result +end + +def _reduce_412(val, _values, result) + lparen_t, args, rparen_t = val[2] + result = @builder.call_method(val[0], val[1], nil, + lparen_t, args, rparen_t) + + result +end + +def _reduce_413(val, _values, result) + lparen_t, args, rparen_t = val[1] + result = @builder.keyword_cmd(:super, val[0], + lparen_t, args, rparen_t) + + result +end + +def _reduce_414(val, _values, result) + result = @builder.keyword_cmd(:zsuper, val[0]) + + result +end + +def _reduce_415(val, _values, result) + result = @builder.index(val[0], val[1], val[2], val[3]) + + result +end + +def _reduce_416(val, _values, result) + @static_env.extend_dynamic + result = @context.dup + @context.in_block = true + + result +end + +def _reduce_417(val, _values, result) + result = [ val[0], val[2], val[3], val[4] ] + + @static_env.unextend + @context.in_block = val[1].in_block + + result +end + +def _reduce_418(val, _values, result) + @static_env.extend_dynamic + result = @context.dup + @context.in_block = true + + result +end + +def _reduce_419(val, _values, result) + result = [ val[0], val[2], val[3], val[4] ] + + @static_env.unextend + @context.in_block = val[1].in_block + + result +end + +def _reduce_420(val, _values, result) + result = [ @builder.when(val[0], val[1], val[2], val[3]), + *val[4] ] + + result +end + +def _reduce_421(val, _values, result) + result = [ val[0] ] + + result +end + +# reduce 422 omitted + +def _reduce_423(val, _values, result) + assoc_t, exc_var = val[2] + + if val[1] + exc_list = @builder.array(nil, val[1], nil) + end + + result = [ @builder.rescue_body(val[0], + exc_list, assoc_t, exc_var, + val[3], val[4]), + *val[5] ] + + result +end + +def _reduce_424(val, _values, result) + result = [] + + result +end + +def _reduce_425(val, _values, result) + result = [ val[0] ] + + result +end + +# reduce 426 omitted + +# reduce 427 omitted + +def _reduce_428(val, _values, result) + result = [ val[0], val[1] ] + + result +end + +# reduce 429 omitted + +def _reduce_430(val, _values, result) + result = [ val[0], val[1] ] + + result +end + +# reduce 431 omitted + +# reduce 432 omitted + +# reduce 433 omitted + +# reduce 434 omitted + +def _reduce_435(val, _values, result) + result = @builder.string_compose(nil, val[0], nil) + + result +end + +def _reduce_436(val, _values, result) + result = [ val[0] ] + + result +end + +def _reduce_437(val, _values, result) + result = val[0] << val[1] + + result +end + +def _reduce_438(val, _values, result) + result = @builder.string_compose(val[0], val[1], val[2]) + + result +end + +def _reduce_439(val, _values, result) + result = @builder.string(val[0]) + + result +end + +def _reduce_440(val, _values, result) + result = @builder.character(val[0]) + + result +end + +def _reduce_441(val, _values, result) + result = @builder.xstring_compose(val[0], val[1], val[2]) + + result +end + +def _reduce_442(val, _values, result) + opts = @builder.regexp_options(val[3]) + result = @builder.regexp_compose(val[0], val[1], val[2], opts) + + result +end + +def _reduce_443(val, _values, result) + result = @builder.words_compose(val[0], val[1], val[2]) + + result +end + +def _reduce_444(val, _values, result) + result = [] + + result +end + +def _reduce_445(val, _values, result) + result = val[0] << @builder.word(val[1]) + + result +end + +def _reduce_446(val, _values, result) + result = [ val[0] ] + + result +end + +def _reduce_447(val, _values, result) + result = val[0] << val[1] + + result +end + +def _reduce_448(val, _values, result) + result = @builder.symbols_compose(val[0], val[1], val[2]) + + result +end + +def _reduce_449(val, _values, result) + result = [] + + result +end + +def _reduce_450(val, _values, result) + result = val[0] << @builder.word(val[1]) + + result +end + +def _reduce_451(val, _values, result) + result = @builder.words_compose(val[0], val[1], val[2]) + + result +end + +def _reduce_452(val, _values, result) + result = @builder.symbols_compose(val[0], val[1], val[2]) + + result +end + +def _reduce_453(val, _values, result) + result = [] + + result +end + +def _reduce_454(val, _values, result) + result = val[0] << @builder.string_internal(val[1]) + + result +end + +def _reduce_455(val, _values, result) + result = [] + + result +end + +def _reduce_456(val, _values, result) + result = val[0] << @builder.symbol_internal(val[1]) + + result +end + +def _reduce_457(val, _values, result) + result = [] + + result +end + +def _reduce_458(val, _values, result) + result = val[0] << val[1] + + result +end + +def _reduce_459(val, _values, result) + result = [] + + result +end + +def _reduce_460(val, _values, result) + result = val[0] << val[1] + + result +end + +def _reduce_461(val, _values, result) + result = [] + + result +end + +def _reduce_462(val, _values, result) + result = val[0] << val[1] + + result +end + +def _reduce_463(val, _values, result) + result = @builder.string_internal(val[0]) + + result +end + +def _reduce_464(val, _values, result) + result = val[1] + + result +end + +def _reduce_465(val, _values, result) + @lexer.cond.push(false) + @lexer.cmdarg.push(false) + + result +end + +def _reduce_466(val, _values, result) + @lexer.cond.lexpop + @lexer.cmdarg.lexpop + + result = @builder.begin(val[0], val[2], val[3]) + + result +end + +def _reduce_467(val, _values, result) + result = @builder.gvar(val[0]) + + result +end + +def _reduce_468(val, _values, result) + result = @builder.ivar(val[0]) + + result +end + +def _reduce_469(val, _values, result) + result = @builder.cvar(val[0]) + + result +end + +# reduce 470 omitted + +def _reduce_471(val, _values, result) + result = @builder.symbol(val[0]) + + result +end + +def _reduce_472(val, _values, result) + result = @builder.symbol_compose(val[0], val[1], val[2]) + + result +end + +def _reduce_473(val, _values, result) + result = val[0] + + result +end + +def _reduce_474(val, _values, result) + if @builder.respond_to? :negate + # AST builder interface compatibility + result = @builder.negate(val[0], val[1]) + else + result = @builder.unary_num(val[0], val[1]) + end + + result +end + +def _reduce_475(val, _values, result) + result = @builder.integer(val[0]) + + result +end + +def _reduce_476(val, _values, result) + result = @builder.float(val[0]) + + result +end + +def _reduce_477(val, _values, result) + result = @builder.rational(val[0]) + + result +end + +def _reduce_478(val, _values, result) + result = @builder.complex(val[0]) + + result +end + +def _reduce_479(val, _values, result) + result = @builder.ident(val[0]) + + result +end + +def _reduce_480(val, _values, result) + result = @builder.ivar(val[0]) + + result +end + +def _reduce_481(val, _values, result) + result = @builder.gvar(val[0]) + + result +end + +def _reduce_482(val, _values, result) + result = @builder.const(val[0]) + + result +end + +def _reduce_483(val, _values, result) + result = @builder.cvar(val[0]) + + result +end + +def _reduce_484(val, _values, result) + result = @builder.nil(val[0]) + + result +end + +def _reduce_485(val, _values, result) + result = @builder.self(val[0]) + + result +end + +def _reduce_486(val, _values, result) + result = @builder.true(val[0]) + + result +end + +def _reduce_487(val, _values, result) + result = @builder.false(val[0]) + + result +end + +def _reduce_488(val, _values, result) + result = @builder.__FILE__(val[0]) + + result +end + +def _reduce_489(val, _values, result) + result = @builder.__LINE__(val[0]) + + result +end + +def _reduce_490(val, _values, result) + result = @builder.__ENCODING__(val[0]) + + result +end + +def _reduce_491(val, _values, result) + result = @builder.accessible(val[0]) + + result +end + +def _reduce_492(val, _values, result) + result = @builder.accessible(val[0]) + + result +end + +def _reduce_493(val, _values, result) + result = @builder.assignable(val[0]) + + result +end + +def _reduce_494(val, _values, result) + result = @builder.assignable(val[0]) + + result +end + +def _reduce_495(val, _values, result) + result = @builder.nth_ref(val[0]) + + result +end + +def _reduce_496(val, _values, result) + result = @builder.back_ref(val[0]) + + result +end + +def _reduce_497(val, _values, result) + result = nil + + result +end + +def _reduce_498(val, _values, result) + @lexer.state = :expr_value + + result +end + +def _reduce_499(val, _values, result) + result = [ val[0], val[2] ] + + result +end + +def _reduce_500(val, _values, result) + yyerrok + result = nil + + result +end + +def _reduce_501(val, _values, result) + result = @builder.args(val[0], val[1], val[2]) + + @lexer.state = :expr_value + + result +end + +def _reduce_502(val, _values, result) + result = @context.in_kwarg + @context.in_kwarg = true + + result +end + +def _reduce_503(val, _values, result) + @context.in_kwarg = val[0] + result = @builder.args(nil, val[1], nil) + + result +end + +def _reduce_504(val, _values, result) + result = val[0].concat(val[2]).concat(val[3]) + + result +end + +def _reduce_505(val, _values, result) + result = val[0].concat(val[1]) + + result +end + +def _reduce_506(val, _values, result) + result = val[0].concat(val[1]) + + result +end + +def _reduce_507(val, _values, result) + result = [ val[0] ] + + result +end + +def _reduce_508(val, _values, result) + result = val[1] + + result +end + +def _reduce_509(val, _values, result) + result = [] + + result +end + +def _reduce_510(val, _values, result) + result = val[0]. + concat(val[2]). + concat(val[4]). + concat(val[5]) + + result +end + +def _reduce_511(val, _values, result) + result = val[0]. + concat(val[2]). + concat(val[4]). + concat(val[6]). + concat(val[7]) + + result +end + +def _reduce_512(val, _values, result) + result = val[0]. + concat(val[2]). + concat(val[3]) + + result +end + +def _reduce_513(val, _values, result) + result = val[0]. + concat(val[2]). + concat(val[4]). + concat(val[5]) + + result +end + +def _reduce_514(val, _values, result) + result = val[0]. + concat(val[2]). + concat(val[3]) + + result +end + +def _reduce_515(val, _values, result) + result = val[0]. + concat(val[2]). + concat(val[4]). + concat(val[5]) + + result +end + +def _reduce_516(val, _values, result) + result = val[0]. + concat(val[1]) + + result +end + +def _reduce_517(val, _values, result) + result = val[0]. + concat(val[2]). + concat(val[3]) + + result +end + +def _reduce_518(val, _values, result) + result = val[0]. + concat(val[2]). + concat(val[4]). + concat(val[5]) + + result +end + +def _reduce_519(val, _values, result) + result = val[0]. + concat(val[1]) + + result +end + +def _reduce_520(val, _values, result) + result = val[0]. + concat(val[2]). + concat(val[3]) + + result +end + +def _reduce_521(val, _values, result) + result = val[0]. + concat(val[1]) + + result +end + +def _reduce_522(val, _values, result) + result = val[0]. + concat(val[2]). + concat(val[3]) + + result +end + +def _reduce_523(val, _values, result) + result = val[0] + + result +end + +def _reduce_524(val, _values, result) + result = [] + + result +end + +def _reduce_525(val, _values, result) + diagnostic :error, :argument_const, nil, val[0] + + result +end + +def _reduce_526(val, _values, result) + diagnostic :error, :argument_ivar, nil, val[0] + + result +end + +def _reduce_527(val, _values, result) + diagnostic :error, :argument_gvar, nil, val[0] + + result +end + +def _reduce_528(val, _values, result) + diagnostic :error, :argument_cvar, nil, val[0] + + result +end + +# reduce 529 omitted + +def _reduce_530(val, _values, result) + @static_env.declare val[0][0] + + result = val[0] + + result +end + +def _reduce_531(val, _values, result) + result = val[0] + + result +end + +def _reduce_532(val, _values, result) + result = @builder.arg(val[0]) + + result +end + +def _reduce_533(val, _values, result) + result = @builder.multi_lhs(val[0], val[1], val[2]) + + result +end + +def _reduce_534(val, _values, result) + result = [ val[0] ] + + result +end + +def _reduce_535(val, _values, result) + result = val[0] << val[2] + + result +end + +def _reduce_536(val, _values, result) + check_kwarg_name(val[0]) + + @static_env.declare val[0][0] + + result = val[0] + + result +end + +def _reduce_537(val, _values, result) + result = @builder.kwoptarg(val[0], val[1]) + + result +end + +def _reduce_538(val, _values, result) + result = @builder.kwarg(val[0]) + + result +end + +def _reduce_539(val, _values, result) + result = @builder.kwoptarg(val[0], val[1]) + + result +end + +def _reduce_540(val, _values, result) + result = @builder.kwarg(val[0]) + + result +end + +def _reduce_541(val, _values, result) + result = [ val[0] ] + + result +end + +def _reduce_542(val, _values, result) + result = val[0] << val[2] + + result +end + +def _reduce_543(val, _values, result) + result = [ val[0] ] + + result +end + +def _reduce_544(val, _values, result) + result = val[0] << val[2] + + result +end + +# reduce 545 omitted + +# reduce 546 omitted + +def _reduce_547(val, _values, result) + @static_env.declare val[1][0] + + result = [ @builder.kwrestarg(val[0], val[1]) ] + + result +end + +def _reduce_548(val, _values, result) + result = [ @builder.kwrestarg(val[0]) ] + + result +end + +def _reduce_549(val, _values, result) + result = @builder.optarg(val[0], val[1], val[2]) + + result +end + +def _reduce_550(val, _values, result) + result = @builder.optarg(val[0], val[1], val[2]) + + result +end + +def _reduce_551(val, _values, result) + result = [ val[0] ] + + result +end + +def _reduce_552(val, _values, result) + result = val[0] << val[2] + + result +end + +def _reduce_553(val, _values, result) + result = [ val[0] ] + + result +end + +def _reduce_554(val, _values, result) + result = val[0] << val[2] + + result +end + +# reduce 555 omitted + +# reduce 556 omitted + +def _reduce_557(val, _values, result) + @static_env.declare val[1][0] + + result = [ @builder.restarg(val[0], val[1]) ] + + result +end + +def _reduce_558(val, _values, result) + result = [ @builder.restarg(val[0]) ] + + result +end + +# reduce 559 omitted + +# reduce 560 omitted + +def _reduce_561(val, _values, result) + @static_env.declare val[1][0] + + result = @builder.blockarg(val[0], val[1]) + + result +end + +def _reduce_562(val, _values, result) + result = [ val[1] ] + + result +end + +def _reduce_563(val, _values, result) + result = [] + + result +end + +# reduce 564 omitted + +def _reduce_565(val, _values, result) + result = val[1] + + result +end + +def _reduce_566(val, _values, result) + result = [] + + result +end + +# reduce 567 omitted + +def _reduce_568(val, _values, result) + result = [ val[0] ] + + result +end + +def _reduce_569(val, _values, result) + result = val[0] << val[2] + + result +end + +def _reduce_570(val, _values, result) + result = @builder.pair(val[0], val[1], val[2]) + + result +end + +def _reduce_571(val, _values, result) + result = @builder.pair_keyword(val[0], val[1]) + + result +end + +def _reduce_572(val, _values, result) + result = @builder.pair_quoted(val[0], val[1], val[2], val[3]) + + result +end + +def _reduce_573(val, _values, result) + result = @builder.kwsplat(val[0], val[1]) + + result +end + +# reduce 574 omitted + +# reduce 575 omitted + +# reduce 576 omitted + +# reduce 577 omitted + +# reduce 578 omitted + +# reduce 579 omitted + +# reduce 580 omitted + +# reduce 581 omitted + +# reduce 582 omitted + +# reduce 583 omitted + +# reduce 584 omitted + +# reduce 585 omitted + +# reduce 586 omitted + +# reduce 587 omitted + +# reduce 588 omitted + +# reduce 589 omitted + +def _reduce_590(val, _values, result) + result = val[1] + + result +end + +def _reduce_591(val, _values, result) + result = val[1] + + result +end + +# reduce 592 omitted + +# reduce 593 omitted + +# reduce 594 omitted + +def _reduce_595(val, _values, result) + yyerrok + + result +end + +# reduce 596 omitted + +# reduce 597 omitted + +# reduce 598 omitted + +def _reduce_599(val, _values, result) + result = nil + + result +end + +def _reduce_none(val, _values, result) + val[0] +end + + end # class Ruby22 + end # module Parser diff --git a/vendor/bundle/ruby/3.1.0/gems/parser-3.1.2.0/lib/parser/ruby23.rb b/vendor/bundle/ruby/3.1.0/gems/parser-3.1.2.0/lib/parser/ruby23.rb new file mode 100644 index 000000000..c0430f00c --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/parser-3.1.2.0/lib/parser/ruby23.rb @@ -0,0 +1,6669 @@ +# -*- encoding:utf-8; warn-indent:false; frozen_string_literal: true -*- +# +# DO NOT MODIFY!!!! +# This file is automatically generated by Racc 1.4.15 +# from Racc grammer file "". +# + +require 'racc/parser.rb' + + +require 'parser' + +module Parser + class Ruby23 < Parser::Base + + + def version + 23 + end + + def default_encoding + Encoding::UTF_8 + end + + def local_push + @static_env.extend_static + @lexer.cmdarg.push(false) + @lexer.cond.push(false) + end + + def local_pop + @static_env.unextend + @lexer.cmdarg.pop + @lexer.cond.pop + end +##### State transition tables begin ### + +clist = [ +'-580,-98,540,-101,518,-104,695,-580,-580,-580,272,-103,-580,-580,-580', +'115,-580,272,540,582,114,221,218,219,-83,-580,-580,-580,-580,580,540', +'785,967,546,-69,871,-580,-580,540,-580,-580,-580,-580,-580,-493,-105', +'-99,817,785,-97,-97,-91,399,540,111,218,219,401,400,-286,-98,-104,222', +'123,-100,-102,-580,-580,-580,-580,-580,-580,-580,-580,-580,-580,-580', +'-580,-580,-580,-576,695,-580,-580,-580,581,751,-580,-577,-105,-580,695', +'-104,-580,-580,579,-580,271,-580,-286,-580,-97,-580,-580,271,-580,-580', +'-580,-580,-580,115,-580,-580,-580,-100,114,222,-91,-102,-98,115,-101', +'208,-104,-98,114,-101,-580,-104,-103,-580,-580,-580,-580,-103,-580,115', +'-580,-482,822,-99,114,-580,-101,870,-482,-482,-482,115,222,-482,-482', +'-482,114,-482,-90,115,-91,209,-88,-91,114,-482,-105,-482,-482,-482,-97', +'-105,-89,-91,115,-97,-90,-482,-482,114,-482,-482,-482,-482,-482,-100', +'-102,210,115,217,-100,-102,-101,114,617,218,219,-92,115,749,261,-96', +'552,114,-95,-103,553,-482,-482,-482,-482,-482,-482,-482,-482,-482,-482', +'-482,-482,-482,-482,320,272,-482,-482,-482,-91,-482,-482,616,-93,-482', +'321,-93,-482,-482,222,-482,389,-482,402,-482,-90,-482,-482,750,-482', +'-482,-482,-482,-482,-289,-482,-494,-482,446,-100,-576,-289,-289,-289', +'-99,-576,-92,-289,-289,-99,-289,-482,617,-577,-482,-482,-482,-482,447', +'-482,448,-482,-580,617,449,-90,-482,-482,-90,267,-289,-289,222,-289', +'-289,-289,-289,-289,-90,218,219,-479,-93,214,-92,-102,-92,616,-479,-92', +'265,530,271,-98,532,272,617,-94,616,-92,-289,-289,-289,-289,-289,-289', +'-289,-289,-289,-289,-289,-289,-289,-289,-580,-105,-289,-289,-289,221', +'600,-580,-93,480,-289,-93,-576,-289,93,94,-580,616,-289,840,-289,-93', +'-289,-289,489,-289,-289,-289,-289,-289,-479,-289,-479,-289,215,-580', +'491,-479,-479,-479,93,94,-479,-479,-479,267,-479,-289,493,530,-289,-289', +'532,-94,-479,-289,-479,-479,-479,115,688,687,-289,-103,114,-580,-479', +'-479,271,-479,-479,-479,-479,-479,-494,530,-99,672,529,669,668,667,672', +'670,669,668,667,-486,670,501,115,-68,95,96,-486,114,-479,-479,-479,-479', +'-479,-479,-479,-479,-479,-479,-479,-479,-479,-479,115,222,-479,-479', +'-479,114,-479,-479,95,96,-479,-89,567,-479,-479,567,-479,567,-479,567', +'-479,-98,-479,-479,504,-479,-479,-479,-479,-479,567,-479,-289,-479,222', +'218,219,971,115,-289,-289,-289,-486,114,-289,-289,-289,-479,-289,986', +'-479,-479,-479,-479,889,-479,115,-479,-289,-289,-289,114,-479,-479,530', +'-573,216,532,-289,-289,505,-289,-289,-289,-289,-289,569,568,565,569', +'568,569,568,569,568,565,817,785,512,728,276,726,222,632,569,568,570', +'267,-289,-289,-289,-289,-289,-289,-289,-289,-289,-289,-289,-289,-289', +'-289,242,-96,-289,-289,-289,-479,752,-289,218,219,-289,-105,-479,-289', +'-289,567,-289,-573,-289,515,-289,-479,-289,-289,519,-289,-289,-289,-289', +'-289,242,-289,239,-289,218,219,241,240,567,672,-573,669,668,667,677', +'670,567,-289,222,567,-289,-289,-289,-289,680,-289,81,-289,-580,533,735', +'534,-289,-103,493,-580,-580,-580,82,546,-479,-580,-580,391,-580,550', +'675,551,83,569,568,572,559,-580,584,685,684,688,687,-491,587,-574,681', +'-261,-580,-580,-491,-580,-580,-580,-580,-580,569,568,578,-491,589,-90', +'222,-485,569,568,574,569,568,583,-485,-99,222,118,119,120,121,122,-580', +'-580,-580,-580,-580,-580,-580,-580,-580,-580,-580,-580,-580,-580,593', +'594,-580,-580,-580,-482,601,-484,214,267,-580,604,-482,-580,-484,555', +'-491,-574,-580,607,-580,-482,-580,-580,557,-580,-580,-580,-580,-580', +'242,-580,-580,-580,242,242,-485,-487,-492,518,-574,214,-279,-493,-487', +'-492,242,-580,511,-279,-580,-580,-582,-92,-492,-580,222,509,-279,-582', +'-582,-582,-580,-101,-582,-582,-582,214,-582,222,-482,222,-484,215,549', +'-83,636,-582,-582,-582,-582,222,523,547,647,652,-95,653,-582,-582,-88', +'-582,-582,-582,-582,-582,-104,214,655,691,-97,-333,-487,-492,444,546', +'215,-279,-333,-490,698,715,725,445,729,730,-490,-333,-582,-582,-582', +'-582,-582,-582,-582,-582,-582,-582,-582,-582,-582,-582,215,214,-582', +'-582,-582,-262,736,-582,521,480,-582,480,-488,-582,-582,222,-582,445', +'-582,-488,-582,754,-582,-582,261,-582,-582,-582,-582,-582,215,-582,-582', +'-582,-333,491,214,-489,-290,-482,493,778,-490,265,-489,-290,-482,-582', +'242,647,-582,-582,-582,-582,-290,-582,-414,-582,222,595,267,596,-582', +'-414,-414,-414,215,267,-414,-414,-414,214,-414,647,242,785,222,-488', +'213,794,239,-414,-414,-414,241,240,797,211,798,800,802,804,-414,-414', +'812,-414,-414,-414,-414,-414,813,215,-489,-290,-482,-289,-91,672,-93', +'669,668,667,-289,670,814,785,-100,-577,-102,821,222,-289,-414,-414,-414', +'-414,-414,-414,-414,-414,-414,-414,-414,-414,-414,-414,215,222,-414', +'-414,-414,830,-263,-414,806,267,-414,839,842,-414,-414,797,-414,809', +'-414,845,-414,847,-414,-414,849,-414,-414,-414,-414,-414,-296,-414,-414', +'-414,-289,851,222,-296,-296,-296,853,854,-296,-296,-296,214,-296,-414', +'242,857,-414,-414,922,-414,859,-414,-296,-296,860,720,721,557,-414,722', +'109,110,-296,-296,647,-296,-296,-296,-296,-296,862,214,-261,866,868', +'214,239,222,922,887,241,240,977,237,238,222,891,557,893,899,902,975', +'-296,-296,-296,-296,-296,-296,-296,-296,-296,-296,-296,-296,-296,-296', +'215,-290,-296,-296,-296,222,906,-296,-290,276,-296,-264,916,-296,-296', +'923,-296,-290,-296,924,-296,935,-296,-296,797,-296,-296,-296,-296,-296', +'215,-296,-581,-296,215,937,939,941,943,-581,-581,-581,677,943,-581,-581', +'-581,-296,-581,222,-296,-296,680,-296,949,-296,952,-581,-581,-581,-581', +'919,-296,669,668,667,-290,670,-581,-581,953,-581,-581,-581,-581,-581', +'919,-289,669,668,667,958,670,715,-289,688,687,797,961,-577,681,963,965', +'-289,967,967,978,988,-581,-581,-581,-581,-581,-581,-581,-581,-581,-581', +'-581,-581,-581,-581,-577,677,-581,-581,-581,-576,652,-581,1003,1004', +'-581,680,1005,-581,-581,943,-581,943,-581,943,-581,1010,-581,-581,988', +'-581,-581,-581,-581,-581,-289,-581,-581,-581,118,119,120,121,122,118', +'119,120,121,122,688,687,1013,-581,1014,681,-581,-581,-581,-581,1015', +'-581,-244,-581,967,967,967,222,-581,-244,-244,-244,988,943,-244,-244', +'-244,672,-244,669,668,667,677,670,242,988,,-244,-244,,,672,680,669,668', +'667,,670,-244,-244,,-244,-244,-244,-244,-244,672,,669,668,667,,670,', +'675,,239,,,,241,240,,237,238,688,687,,806,672,681,669,668,667,,670,', +'948,,-244,,-280,,806,,,-244,,-280,-280,-280,267,-244,-280,-280,-280', +'672,-280,669,668,667,,670,,,,806,-280,-280,-280,,,,,-244,-244,,-280', +'-280,,-280,-280,-280,-280,-280,,,,,-244,,,-244,806,,,,-244,,,,,809,', +'-244,,,-280,-280,-280,-280,-280,-280,-280,-280,-280,-280,-280,-280,-280', +'-280,,,-280,-280,-280,,,-280,,,-280,,,-280,-280,,-280,,-280,,-280,,-280', +'-280,,-280,-280,-280,-280,-280,,-280,,-280,,,672,,669,668,667,,670,', +',,,-280,,,-280,-280,-280,-280,,-280,-244,-280,,,,,-280,-244,-244,-244', +',,-244,-244,-244,242,-244,806,,,,,,,,-244,-244,-244,,,,256,257,,,,-244', +'-244,,-244,-244,-244,-244,-244,,,,239,,245,,241,240,,237,238,,,243,', +'244,,,,,,-244,-244,-244,-244,-244,-244,-244,-244,-244,-244,-244,-244', +'-244,-244,,,-244,-244,-244,,,-244,,267,-244,,,-244,-244,,-244,,-244', +',-244,,-244,-244,,-244,-244,-244,-244,-244,,-244,-244,-244,672,,669', +'668,667,,670,,672,,669,668,667,-244,670,,-244,-244,,-244,,-244,294,74', +'75,71,9,57,-244,,,63,64,,,,67,806,65,66,68,30,31,72,73,806,,,,,29,28', +'27,103,102,104,105,,,19,,,,,605,8,45,296,10,107,106,108,97,56,99,98', +'100,,101,109,110,,93,94,42,43,41,242,246,251,252,253,248,250,258,259', +'254,255,,235,236,,,256,257,,40,,,33,,,58,59,,,60,,35,239,,245,44,241', +'240,,237,238,249,247,243,20,244,,,,91,81,84,85,,86,88,87,89,,,,,82,90', +',260,,-238,,,62,,83,95,96,294,74,75,71,9,57,,,,63,64,,,,67,,65,66,68', +'30,31,72,73,,,,,,29,28,27,103,102,104,105,,,19,,,,,605,8,45,296,10,107', +'106,108,97,56,99,98,100,,101,109,110,,93,94,42,43,41,242,246,251,252', +'253,248,250,258,259,254,255,,235,236,,,256,257,,40,,,33,,,58,59,,,60', +',35,239,,245,44,241,240,,237,238,249,247,243,20,244,,,,91,81,84,85,', +'86,88,87,89,,,,,82,90,,260,,,,,62,,83,95,96,5,74,75,71,9,57,,,,63,64', +',,,67,,65,66,68,30,31,72,73,,,,,,29,28,27,103,102,104,105,,,19,,,,,590', +'8,45,7,10,107,106,108,97,56,99,98,100,,101,109,110,,93,94,42,43,41,242', +'246,251,252,253,248,250,258,259,254,255,,235,236,,,256,257,,40,,,33', +',,58,59,,,60,,35,239,,245,44,241,240,,237,238,249,247,243,20,244,,,', +'91,81,84,85,,86,88,87,89,,,,,82,90,,260,,,,,62,,83,95,96,294,74,75,71', +'9,57,,,,63,64,,,,67,,65,66,68,30,31,72,73,,,,,,29,28,27,103,102,104', +'105,,,19,,,,,,8,45,296,10,107,106,108,97,56,99,98,100,,101,109,110,', +'93,94,42,43,41,242,246,251,252,253,248,250,258,259,254,255,,235,236', +',,256,257,,40,,,33,,,58,59,,,60,,35,239,,245,44,241,240,,237,238,249', +'247,243,20,244,,,,91,81,84,85,,86,88,87,89,,,,,82,90,,260,,,,,62,,83', +'95,96,294,74,75,71,9,57,,,,63,64,,,,67,,65,66,68,30,31,72,73,,,,,,29', +'28,27,103,102,104,105,,,19,,,,,,8,45,296,10,107,106,108,97,56,99,98', +'100,,101,109,110,,93,94,42,43,41,242,246,251,252,253,248,250,258,259', +'254,255,,235,236,,,256,257,,40,,,33,,,58,59,,,60,,35,239,,245,44,241', +'240,,237,238,249,247,243,20,244,,,,91,81,84,85,,86,88,87,89,,,,,82,90', +',260,,,,,62,,83,95,96,294,74,75,71,9,57,,,,63,64,,,,67,,65,66,68,30', +'31,72,73,,,,,,29,28,27,103,102,104,105,,,19,,,,,,8,45,296,10,107,106', +'108,97,56,99,98,100,,101,109,110,,93,94,42,43,41,242,246,251,252,253', +'248,250,258,259,254,255,,235,236,,,256,257,,40,,,33,,,58,59,,,60,,35', +'239,,245,44,241,240,,237,238,249,247,243,20,244,,,,91,81,84,85,,86,88', +'87,89,,,,,82,90,,260,,,,,62,,83,95,96,294,74,75,71,9,57,,,,63,64,,,', +'67,,65,66,68,30,31,72,73,,,,,,29,28,27,103,102,104,105,,,19,,,,,,8,45', +'296,10,107,106,108,97,56,99,98,100,,101,109,110,,93,94,42,43,41,242', +'246,251,252,253,248,250,258,259,254,255,,235,236,,,256,257,,40,,,33', +',,58,59,,,60,,35,239,,245,44,241,240,,237,238,249,247,243,20,244,,,', +'91,81,84,85,,86,88,87,89,,,,,82,90,,260,,,,,62,,83,95,96,294,74,75,71', +'9,57,,,,63,64,,,,67,,65,66,68,30,31,72,73,,,,,,29,28,27,103,102,104', +'105,,,19,,,,,,8,45,296,10,107,106,108,97,56,99,98,100,,101,109,110,', +'93,94,42,43,41,242,246,251,252,253,248,250,258,259,254,255,,235,236', +',,256,257,,40,,,33,,,58,59,,,60,,35,239,,245,44,241,240,,237,238,249', +'247,243,20,244,,,,91,81,84,85,,86,88,87,89,,,,,82,90,,260,,,,,62,,83', +'95,96,294,74,75,71,9,57,,,,63,64,,,,67,,65,66,68,30,31,72,73,,,,,,29', +'28,27,103,102,104,105,,,19,,,,,,8,45,296,10,107,106,108,97,56,99,98', +'100,,101,109,110,,93,94,42,43,41,242,246,251,252,253,248,250,258,259', +'254,255,,235,236,,,256,257,,40,,,33,,,58,59,,,60,,35,239,,245,44,241', +'240,,237,238,249,247,243,20,244,,,,91,81,84,85,,86,88,87,89,,,,,82,90', +',260,,,,,62,,83,95,96,294,74,75,71,9,57,,,,63,64,,,,67,,65,66,68,30', +'31,72,73,,,,,,29,28,27,103,102,104,105,,,19,,,,,,8,45,296,10,107,106', +'108,97,56,99,98,100,,101,109,110,,93,94,42,43,41,242,246,251,252,253', +'248,250,258,259,254,255,,235,236,,,256,257,,40,,,33,,,58,59,,,60,,35', +'239,,245,44,241,240,,237,238,249,247,243,20,244,,,,91,81,84,85,,86,88', +'87,89,,,,,82,90,,260,,,,,62,,83,95,96,294,74,75,71,9,57,,,,63,64,,,', +'67,,65,66,68,30,31,72,73,,,,,,29,28,27,103,102,104,105,,,19,,,,,,8,45', +'296,10,107,106,108,97,56,99,98,100,,101,109,110,,93,94,42,43,41,242', +'246,251,252,253,248,250,258,259,254,255,,235,236,,,256,257,,40,,,33', +',,58,59,,,60,,35,239,,245,44,241,240,,237,238,249,247,243,20,244,,,', +'91,81,84,85,,86,88,87,89,,,,,82,90,,260,,,,,62,,83,95,96,5,74,75,71', +'9,57,,,,63,64,,,,67,,65,66,68,30,31,72,73,,,,,,29,28,27,103,102,104', +'105,,,19,,,,,,8,45,7,10,107,106,108,97,56,99,98,100,,101,109,110,,93', +'94,42,43,41,242,246,251,252,253,248,250,258,259,254,255,,235,236,,,256', +'257,,40,,,33,,,58,59,,,60,,35,239,,245,44,241,240,,237,238,249,247,243', +'20,244,,,,91,81,84,85,,86,88,87,89,,,,,82,90,,260,,,,,62,,83,95,96,294', +'74,75,71,9,57,,,,63,64,,,,67,,65,66,68,30,31,72,73,,,,,,29,28,27,103', +'102,104,105,,,19,,,,,,8,45,296,10,107,106,108,97,56,99,98,100,,101,109', +'110,,93,94,42,43,41,242,246,251,252,253,248,250,258,259,254,255,,235', +'236,,,256,257,,40,,,33,,,58,59,,,60,,35,239,,245,44,241,240,,237,238', +'249,247,243,20,244,,,,91,81,84,85,,86,88,87,89,,,,,82,90,,260,,,,,62', +',83,95,96,294,74,75,71,9,57,,,,63,64,,,,67,,65,66,68,30,31,72,73,,,', +',,29,28,27,103,102,104,105,,,19,,,,,,8,45,296,10,107,106,108,97,56,99', +'98,100,,101,109,110,,93,94,42,43,41,242,246,251,252,253,248,250,258', +'259,254,255,,235,236,,,256,257,,40,,,33,,,58,59,,,60,,35,239,,245,44', +'241,240,,237,238,249,247,243,20,244,,,,91,81,84,85,,86,88,87,89,,,,', +'82,90,,260,,,,,62,,83,95,96,294,74,75,71,9,57,,,,63,64,,,,67,,65,66', +'68,30,31,72,73,,,,,,29,28,27,103,102,104,105,,,19,,,,,,8,45,296,10,107', +'106,108,97,56,99,98,100,,101,109,110,,93,94,42,43,41,242,246,251,252', +'253,248,250,258,259,254,255,,235,236,,,256,257,,40,,,33,,,58,59,,,60', +',35,239,,245,44,241,240,,237,238,249,247,243,20,244,,,,91,81,84,85,', +'86,88,87,89,,,,,82,90,,260,,,,,62,,83,95,96,5,74,75,71,9,57,,,,63,64', +',,,67,,65,66,68,30,31,72,73,,,,,,29,28,27,103,102,104,105,,,19,,,,,', +'8,45,7,10,107,106,108,97,56,99,98,100,,101,109,110,,93,94,42,43,41,242', +'246,251,252,253,248,250,258,259,254,255,,235,236,,,256,257,,40,,,33', +',,58,59,,,60,,35,239,,245,44,241,240,,237,238,249,247,243,20,244,,,', +'91,81,84,85,,86,88,87,89,,,,,82,90,222,260,,,,,62,,83,95,96,294,74,75', +'71,9,57,,,,63,64,,,,67,,65,66,68,30,31,72,73,,,,,,29,28,27,103,102,104', +'105,,,19,,,,,,8,45,296,10,107,106,108,97,56,99,98,100,,101,109,110,', +'93,94,42,43,41,242,246,251,252,253,248,250,258,259,254,255,,235,236', +',,256,257,,40,,,33,,,58,59,,,60,,35,239,,245,44,241,240,,237,238,249', +'247,243,20,244,,,,91,81,84,85,,86,88,87,89,,,,,82,90,,260,,,,,62,,83', +'95,96,294,74,75,71,9,57,,,,63,64,,,,67,,65,66,68,30,31,72,73,,,,,,29', +'28,27,103,102,104,105,,,19,,,,,,8,45,296,10,107,106,108,97,56,99,98', +'100,,101,109,110,,93,94,42,43,41,242,246,251,252,253,248,250,,,254,255', +',,,,,256,257,,40,,,33,,,58,59,,,60,,35,239,,245,44,241,240,,237,238', +'249,247,243,20,244,,,,91,81,84,85,,86,88,87,89,,,,,82,90,,,,,,,62,,83', +'95,96,294,74,75,71,9,57,,,,63,64,,,,67,,65,66,68,30,31,72,73,,,,,,29', +'28,27,103,102,104,105,,,19,,,,,,8,45,296,10,107,106,108,97,56,99,98', +'100,,101,109,110,,93,94,42,43,41,242,-601,-601,-601,-601,248,250,,,-601', +'-601,,,,,,256,257,,40,,,33,,,58,59,,,60,,35,239,,245,44,241,240,,237', +'238,249,247,243,20,244,,,,91,81,84,85,,86,88,87,89,,,,,82,90,,,,,,,62', +',83,95,96,294,74,75,71,9,57,,,,63,64,,,,67,,65,66,68,30,31,72,73,,,', +',,29,28,27,103,102,104,105,,,19,,,,,,8,45,296,10,107,106,108,97,56,99', +'98,100,,101,109,110,,93,94,42,43,41,242,-601,-601,-601,-601,248,250', +',,-601,-601,,,,,,256,257,,40,,,298,,,58,59,,,60,,35,239,,245,44,241', +'240,,237,238,249,247,243,20,244,,,,91,81,84,85,,86,88,87,89,,,,,82,90', +',,,,,,62,,83,95,96,294,74,75,71,9,57,,,,63,64,,,,67,,65,66,68,30,31', +'72,73,,,,,,29,28,27,103,102,104,105,,,19,,,,,,8,45,296,10,107,106,108', +'97,56,99,98,100,,101,109,110,,93,94,42,43,41,242,246,251,252,253,248', +'250,258,,254,255,,,,,,256,257,,40,,,33,,,58,59,,,60,,35,239,,245,44', +'241,240,,237,238,249,247,243,20,244,,,,91,81,84,85,,86,88,87,89,,,,', +'82,90,,,,,,,62,,83,95,96,294,74,75,71,9,57,,,,63,64,,,,67,,65,66,68', +'30,31,72,73,,,,,,29,28,27,103,102,104,105,,,19,,,,,,8,45,296,10,107', +'106,108,97,56,99,98,100,,101,109,110,,93,94,42,43,41,242,,,,,,,,,,,', +',,,,256,257,,40,,,298,,,58,59,,,60,,35,239,,245,44,241,240,,237,238', +',,243,20,244,,,,91,81,84,85,,86,88,87,89,,,,,82,90,,,,,,,62,,83,95,96', +'294,74,75,71,9,57,,,,63,64,,,,67,,65,66,68,30,31,72,73,,,,,,29,28,27', +'103,102,104,105,,,19,,,,,,8,45,296,10,107,106,108,97,56,99,98,100,,101', +'109,110,,93,94,42,43,41,242,-601,-601,-601,-601,248,250,,,-601,-601', +',,,,,256,257,,40,,,33,,,58,59,,,60,,35,239,,245,44,241,240,,237,238', +'249,247,243,20,244,,,,91,81,84,85,,86,88,87,89,,,,,82,90,,,,,,,62,,83', +'95,96,294,74,75,71,9,57,,,,63,64,,,,67,,65,66,68,30,31,72,73,,,,,,29', +'28,27,103,102,104,105,,,19,,,,,,8,45,296,10,107,106,108,97,56,99,98', +'100,,101,109,110,,93,94,42,43,41,242,-601,-601,-601,-601,248,250,,,-601', +'-601,,,,,,256,257,,40,,,33,,,58,59,,,60,,35,239,,245,44,241,240,,237', +'238,249,247,243,20,244,,,,91,81,84,85,,86,88,87,89,,,,,82,90,,,,,,,62', +',83,95,96,294,74,75,71,9,57,,,,63,64,,,,67,,65,66,68,30,31,72,73,,,', +',,29,28,27,103,102,104,105,,,19,,,,,,8,45,296,10,107,106,108,97,56,99', +'98,100,,101,109,110,,93,94,42,43,41,242,246,251,252,253,248,250,258', +'259,254,255,,-601,-601,,,256,257,,40,,,33,,,58,59,,,60,,35,239,,245', +'44,241,240,,237,238,249,247,243,20,244,,,,91,81,84,85,,86,88,87,89,', +',,,82,90,,,,,,,62,,83,95,96,294,74,75,71,9,57,,,,63,64,,,,67,,65,66', +'68,30,31,72,73,,,,,,29,28,27,103,102,104,105,,,19,,,,,,8,45,296,10,107', +'106,108,97,56,99,98,100,,101,109,110,,93,94,42,43,41,242,-601,-601,-601', +'-601,248,250,,,-601,-601,,,,,,256,257,,40,,,33,,,58,59,,,60,,35,239', +',245,44,241,240,,237,238,249,247,243,20,244,,,,91,81,84,85,,86,88,87', +'89,,,,,82,90,,,,,,,62,,83,95,96,294,74,75,71,9,57,,,,63,64,,,,67,,65', +'66,68,30,31,72,73,,,,,,29,28,27,103,102,104,105,,,19,,,,,,8,45,296,10', +'107,106,108,97,56,99,98,100,,101,109,110,,93,94,42,43,41,242,-601,-601', +'-601,-601,248,250,,,-601,-601,,,,,,256,257,,40,,,33,,,58,59,,,60,,35', +'239,,245,44,241,240,,237,238,249,247,243,20,244,,,,91,81,84,85,,86,88', +'87,89,,,,,82,90,,,,,,,62,,83,95,96,294,74,75,71,9,57,,,,63,64,,,,67', +',65,66,68,30,31,72,73,,,,,,29,28,27,103,102,104,105,,,19,,,,,,8,45,296', +'10,107,106,108,97,56,99,98,100,,101,109,110,,93,94,42,43,41,242,,,,', +',,,,,,,,,,,256,257,,40,,,33,,,58,59,,,60,,35,239,,245,44,241,240,,237', +'238,,,243,20,244,,,,91,81,84,85,,86,88,87,89,,,,,82,90,,,,,,,62,,83', +'95,96,294,74,75,71,9,57,,,,63,64,,,,67,,65,66,68,30,31,72,73,,,,,,29', +'28,27,103,102,104,105,,,19,,,,,,8,45,296,10,107,106,108,97,56,99,98', +'100,,101,109,110,,93,94,42,43,41,242,246,251,252,253,248,250,258,259', +'254,255,,-601,-601,,,256,257,,40,,,33,,,58,59,,,60,,35,239,,245,44,241', +'240,,237,238,249,247,243,20,244,,,,91,81,84,85,,86,88,87,89,,,,,82,90', +',,,,,,62,,83,95,96,294,74,75,71,9,57,,,,63,64,,,,67,,65,66,68,30,31', +'72,73,,,,,,29,28,27,103,102,104,105,,,19,,,,,,8,45,296,10,107,106,108', +'97,56,99,98,100,,101,109,110,,93,94,42,43,41,242,,,,,,,,,,,,,,,,256', +'257,,40,,,33,,,58,59,,,60,,35,239,,245,44,241,240,,237,238,,,243,20', +'244,,,,91,81,84,85,,86,88,87,89,,,,,82,90,,,,,,,62,,83,95,96,294,74', +'75,71,9,57,,,,63,64,,,,67,,65,66,68,30,31,72,73,,,,,,29,28,27,103,102', +'104,105,,,19,,,,,,8,45,296,10,107,106,108,97,56,99,98,100,,101,109,110', +',93,94,42,43,41,242,,,,,,,,,,,,,,,,256,257,,40,,,298,,,58,59,,,60,,35', +'239,,,44,241,240,,237,238,,,,20,,,,,91,81,84,85,,86,88,87,89,,,,,82', +'90,,,,74,75,71,62,57,83,95,96,63,64,,,,67,,65,66,68,313,314,72,73,,', +',,,309,310,316,103,102,104,105,,,234,,,,,,,45,,,107,106,108,97,56,99', +'98,100,,101,109,110,,93,94,42,43,41,242,,,,,,,,,,,,,,,,256,257,,227', +',,233,,,58,59,,,60,,,239,,245,44,241,240,,237,238,,,,232,,,,,91,81,84', +'85,,86,88,87,89,,,,,82,90,,,,74,75,71,62,57,83,95,96,63,64,,,,67,,65', +'66,68,313,314,72,73,,,,,,309,310,316,103,102,104,105,,,234,,,,,,,311', +',242,107,106,108,97,56,99,98,100,,101,109,110,,93,94,256,257,317,,,', +',,,,,,,,,,239,,245,,241,240,307,237,238,303,,,58,59,,,60,,,,,,,,,,,', +',,,,,,,,91,81,84,85,,86,88,87,89,,,,,82,90,,,,74,75,71,62,57,83,95,96', +'63,64,,,,67,,65,66,68,313,314,72,73,,,,,,309,310,316,103,102,104,105', +',,234,,,,,,,45,,,107,106,108,97,56,99,98,100,,101,109,110,,93,94,42', +'43,41,,,,,,,,,,,,,,,,,,,,227,,,233,,,58,59,,,60,,,,,,44,,,,,,,,,232', +',,,,91,81,84,85,,86,88,87,89,,,,,82,90,,,,74,75,71,62,57,83,95,96,63', +'64,,,,67,,65,66,68,313,314,72,73,,,,,,309,310,316,103,102,104,105,,', +'234,,,,,,,45,,,107,106,108,97,56,99,98,100,,101,109,110,,93,94,42,43', +'41,,,,,,,,,,,,,,,,,,,,227,,,233,,,58,59,,,60,,,,,,44,,,,,,,,,232,,,', +',91,81,84,85,,86,88,87,89,,,,,82,90,,,,74,75,71,62,57,83,95,96,63,64', +',,,67,,65,66,68,313,314,72,73,,,,,,309,310,316,103,102,104,105,,,234', +',,,,,,45,,,107,106,108,97,56,99,98,100,,101,109,110,,93,94,42,43,41', +',,,,,,,,,,,,,,,,,,,227,,,233,,,58,59,,,60,,,,,,44,,,,,,,,,232,,,,,91', +'81,84,85,,86,88,87,89,,,,,82,90,,,,,,,62,,83,95,96,74,75,71,9,57,,,', +'63,64,,,,67,,65,66,68,30,31,72,73,,,,,,29,28,27,103,102,104,105,,,19', +',,,,,8,45,,10,107,106,108,97,56,99,98,100,,101,109,110,,93,94,42,43', +'41,,,,,,,,,,,,,,,,,,,,40,,,33,,,58,59,,,60,,35,,,,44,,,,,,,,,20,,,,', +'91,81,84,85,,86,88,87,89,,,,,82,90,,,,74,75,71,62,57,83,95,96,63,64', +',,,67,,65,66,68,313,314,72,73,,,,,,309,310,316,103,102,104,105,,,234', +',,,,,,45,,,107,106,108,97,56,99,98,100,,101,109,110,,93,94,42,43,41', +',,,,,,,,,,,,,,,,,,,227,,,233,,,58,59,,,60,,,,,,44,,,,,,,,,232,,,,,91', +'81,84,85,,86,88,87,89,,,,,82,90,,,,74,75,71,62,57,83,95,96,63,64,,,', +'67,,65,66,68,30,31,72,73,,,,,,29,28,27,103,102,104,105,,,19,,,,,,,45', +',,107,106,108,97,56,99,98,100,,101,109,110,,93,94,42,43,41,,,,,,,,,', +',,,,,,,,,,227,,,233,,,58,59,,,60,,,,,,44,,,,,,,,,20,,,,,91,81,84,85', +',86,88,87,89,,,,,82,90,,,,74,75,71,62,57,83,95,96,63,64,,,,67,,65,66', +'68,313,314,72,73,,,,,,309,310,316,103,102,104,105,,,234,,,,,,,45,,,107', +'106,108,97,56,99,98,100,,101,109,110,,93,94,42,43,41,,,,,,,,,,,,,,,', +',,,,227,,,233,,,58,59,,,60,,629,,,,44,,,,,,,,,232,,,,,91,81,84,85,,86', +'88,87,89,,,,,82,90,,,,74,75,71,62,57,83,95,96,63,64,,,,67,,65,66,68', +'313,314,72,73,,,,,,309,310,316,103,102,104,105,,,234,,,,,,,45,,,107', +'106,108,97,56,99,98,100,,101,109,110,,93,94,42,43,41,,,,,,,,,,,,,,,', +',,,,227,,,233,,,58,59,,,60,,,,,,44,,,,,,,,,232,,,,,91,81,84,85,,86,88', +'87,89,,,,,82,90,,,,74,75,71,62,57,83,95,96,63,64,,,,67,,65,66,68,30', +'31,72,73,,,,,,29,28,27,103,102,104,105,,,234,,,,,,,45,,,107,106,108', +'97,56,99,98,100,288,101,109,110,,93,94,42,43,41,,,,,,,,,,,,,,,,,,,,227', +',,233,,,58,59,,,60,,285,,283,,44,,,289,,,,,,232,,,,,91,286,84,85,,86', +'88,87,89,,,,,82,90,,,,74,75,71,62,57,83,95,96,63,64,,,,67,,65,66,68', +'30,31,72,73,,,,,,29,28,27,103,102,104,105,,,234,,,,,,,45,,,107,106,108', +'97,56,99,98,100,288,101,109,110,,93,94,42,43,41,,,,,,,,,,,,,,,,,,,,227', +',,233,,,58,59,,,60,,285,,283,,44,,,289,,,,,,232,,,,,91,286,84,85,,86', +'88,87,89,,,,,82,90,,,,74,75,71,62,57,83,95,96,63,64,,,,67,,65,66,68', +'30,31,72,73,,,,,,29,28,27,103,102,104,105,,,234,,,,,,,45,,,107,106,108', +'97,56,99,98,100,288,101,109,110,,93,94,42,43,41,,,,,,,,,,,,,,,,,,,,227', +',,233,,,58,59,,,60,,285,,283,,44,,,289,,,,,,232,,,,,91,286,84,85,,86', +'88,87,89,,,,,82,90,,,,74,75,71,62,57,83,95,96,63,64,,,,67,,65,66,68', +'313,314,72,73,,,,,,309,310,316,103,102,104,105,,,234,,,,,,,311,,,107', +'106,108,97,56,99,98,100,,101,109,110,,93,94,,,317,,,,,,,,,,,,,,,,,,', +',307,,,233,,,58,59,,,60,,,672,,669,668,667,677,670,,,,,,,,,680,,91,81', +'84,85,,86,88,87,89,,,,,82,90,,,,507,,675,62,,83,95,96,74,75,71,,57,688', +'687,,63,64,681,,,67,,65,66,68,30,31,72,73,,,,,,29,28,27,103,102,104', +'105,,,234,,,,,,,45,,,107,106,108,97,56,99,98,100,,101,109,110,,93,94', +'42,43,41,,,,,,,,,,,,,,,,,,,,227,,,233,,,58,59,,,60,,,,,,44,,,,,,,,,232', +',,,,91,81,84,85,,86,88,87,89,,,,,82,90,,,,74,75,71,62,57,83,95,96,63', +'64,,,,67,,65,66,68,313,314,72,73,,,,,,309,310,316,103,102,104,105,,', +'234,,,,,,,45,,,107,106,108,97,56,99,98,100,288,101,109,110,,93,94,42', +'43,41,,,,,,,,,,,,,,,,,,,,227,,,233,,,58,59,,,60,,,,283,,44,,,289,,,', +',,232,,,,,91,286,84,85,,86,88,87,89,,,,,82,90,,,,74,75,71,62,57,83,95', +'96,63,64,,,,67,,65,66,68,313,314,72,73,,,,,,309,310,316,103,102,104', +'105,,,234,,,,,,,45,,,107,106,108,97,56,99,98,100,,101,109,110,,93,94', +'42,43,41,,,,,,,,,,,,,,,,,,,,227,,,233,,,58,59,,,60,,,,,,44,,,,,,,,,232', +',,,,91,81,84,85,,86,88,87,89,,,,,82,90,,,,74,75,71,62,57,83,95,96,63', +'64,,,,67,,65,66,68,313,314,72,73,,,,,,309,310,316,103,102,104,105,,', +'234,,,,,,,311,,,107,106,108,97,56,99,98,100,,101,109,110,,93,94,,,317', +',,,,,,,,,,,,,,,,,,,307,,,303,,,58,59,,,60,,,,,,,,,,,,,,,,,,,,91,81,84', +'85,,86,88,87,89,,,,,82,90,,,,74,75,71,62,57,83,95,96,63,64,,,,67,,65', +'66,68,313,314,72,73,,,,,,309,310,316,103,102,104,105,,,234,,,,,,,45', +',,107,106,108,97,56,99,98,100,,101,109,110,,93,94,42,43,41,,,,,,,,,', +',,,,,,,,,,227,,,233,,,58,59,,,60,,,,,,44,,,,,,,,,232,,,,,91,81,84,85', +',86,88,87,89,,,,,82,90,,,,74,75,71,62,57,83,95,96,63,64,,,,67,,65,66', +'68,313,314,72,73,,,,,,309,310,316,103,102,104,105,,,234,,,,,,,45,,,107', +'106,108,97,56,99,98,100,,101,109,110,,93,94,42,43,41,,,,,,,,,,,,,,,', +',,,,227,,,233,,,58,59,,,60,,,,,,44,,,,,,,,,232,,,,,91,81,84,85,,86,88', +'87,89,,,,,82,90,,,,74,75,71,62,57,83,95,96,63,64,,,,67,,65,66,68,313', +'314,72,73,,,,,,309,310,316,103,102,104,105,,,234,,,,,,,45,,,107,106', +'108,97,56,99,98,100,,101,109,110,,93,94,42,43,41,,,,,,,,,,,,,,,,,,,', +'227,,,233,,,58,59,,,60,,,,,,44,,,,,,,,,232,,,,,91,81,84,85,,86,88,87', +'89,,,,,82,90,,,,74,75,71,62,57,83,95,96,63,64,,,,67,,65,66,68,313,314', +'72,73,,,,,,309,310,316,103,102,104,105,,,234,,,,,,,311,,,107,106,108', +'97,56,99,98,100,,101,109,110,,93,94,,,317,,,,,,,,,,,,,,,,,,,,856,,,233', +',,58,59,,,60,,,,,,,,,,,,,,,,,,,,91,81,84,85,,86,88,87,89,,,,,82,90,', +',,74,75,71,62,57,83,95,96,63,64,,,,67,,65,66,68,313,314,72,73,,,,,,309', +'310,316,103,102,104,105,,,234,,,,,,,311,,,107,106,108,97,56,99,98,100', +',101,109,110,,93,94,,,317,,,,,,,,,,,,,,,,,,,,930,,,233,,,58,59,,,60', +',,,,,,,,,,,,,,,,,,,91,81,84,85,,86,88,87,89,,,,,82,90,,,,74,75,71,62', +'57,83,95,96,63,64,,,,67,,65,66,68,313,314,72,73,,,,,,309,310,316,103', +'102,104,105,,,234,,,,,,,311,,,107,106,108,97,56,99,98,100,,101,109,110', +',93,94,,,317,,,,,,,,,,,,,,,,,,,,307,,,303,,,58,59,,,60,,302,,,,,,,,', +',,,,,,,,,91,81,84,85,,86,88,87,89,,,,,82,90,,,,74,75,71,62,57,83,95', +'96,63,64,,,,67,,65,66,68,313,314,72,73,,,,,,309,310,316,103,102,104', +'105,,,234,,,,,,,311,,,107,106,108,97,56,99,98,100,,101,109,110,,93,94', +',,317,,,,,,,,,,,,,,,,,,,,307,,,233,,,58,59,,,60,,,672,,669,668,667,677', +'670,,,,,,,,,680,,91,81,84,85,,86,88,87,89,,,,,82,90,,,,319,,675,62,', +'83,95,96,74,75,71,,57,688,687,,63,64,681,,,67,,65,66,68,313,314,72,73', +',,,,,309,310,316,103,102,104,105,,,234,,,,,,,45,,,107,106,108,97,56', +'99,98,100,,101,109,110,,93,94,42,43,41,,,,,,,,,,,,,,,,,,,,227,,,233', +',,58,59,,,60,,,,,,44,,,,,,,,,232,,,,,91,81,84,85,,86,88,87,89,,,,,82', +'90,,,,,,,62,,83,95,96,74,75,71,9,57,,,,63,64,,,,67,,65,66,68,30,31,72', +'73,,,,,,29,28,27,103,102,104,105,,,19,,,,,,8,45,7,10,107,106,108,97', +'56,99,98,100,,101,109,110,,93,94,42,43,41,,,,,,,,,,,,,,,,,,,,40,,,33', +',,58,59,,,60,,35,,,,44,,,,,,,,,20,,,,,91,81,84,85,,86,88,87,89,,,,,82', +'90,,,,74,75,71,62,57,83,95,96,63,64,,,,67,,65,66,68,30,31,72,73,,,,', +',29,28,27,103,102,104,105,,,234,,,,,,,45,,,107,106,108,97,56,99,98,100', +',101,109,110,,93,94,42,43,41,,,,,,,,,,,,,,,,,,,,227,,,233,,,58,59,,', +'60,,,,,,44,,,,,,,,,232,,,,,91,81,84,85,,86,88,87,89,,,,,82,90,,,,74', +'75,71,62,57,83,95,96,63,64,,,,67,,65,66,68,30,31,72,73,,,,,,29,28,27', +'103,102,104,105,,,234,,,,,,,45,,,107,106,108,97,56,99,98,100,,101,109', +'110,,93,94,42,43,41,,,,,,,,,,,,,,,,,,,,227,,,233,,,58,59,,,60,,,,,,44', +',,,,,,,,232,,,,,91,81,84,85,,86,88,87,89,,,,,82,90,,,,74,75,71,62,57', +'83,95,96,63,64,,,,67,,65,66,68,30,31,72,73,,,,,,29,28,27,103,102,104', +'105,,,234,,,,,,,45,,,107,106,108,97,56,99,98,100,,101,109,110,,93,94', +'42,43,41,,,,,,,,,,,,,,,,,,,,227,,,233,,,58,59,,,60,,,,,,44,,,,,,,,,232', +',,,,91,81,84,85,,86,88,87,89,,,,,82,90,,,,74,75,71,62,57,83,95,96,63', +'64,,,,67,,65,66,68,30,31,72,73,,,,,,29,28,27,103,102,104,105,,,234,', +',,,,,45,,,107,106,108,97,56,99,98,100,,101,109,110,,93,94,42,43,41,', +',,,,,,,,,,,,,,,,,,227,,,233,,,58,59,,,60,,,,,,44,,,,,,,,,232,,,,,91', +'81,84,85,,86,88,87,89,,,,,82,90,,,,74,75,71,62,57,83,95,96,63,64,,,', +'67,,65,66,68,313,314,72,73,,,,,,309,310,316,103,102,104,105,,,234,,', +',,,,311,,,107,106,108,97,56,99,98,100,,101,109,110,,93,94,,,317,,,,', +',,,,,,,,,,,,,,,307,,,303,,,58,59,,,60,,,,,,,,,,,,,,,,,,,,91,81,84,85', +',86,88,87,89,,,,,82,90,,,,74,75,71,62,57,83,95,96,63,64,,,,67,,65,66', +'68,30,31,72,73,,,,,,29,28,27,103,102,104,105,,,234,,,,,,,45,,,107,106', +'108,97,56,99,98,100,,101,109,110,,93,94,42,43,41,,,,,,,,,,,,,,,,,,,', +'227,,,233,,,58,59,,,60,,,,,,44,,,,,,,,,232,,,,,91,81,84,85,,86,88,87', +'89,,,,,82,90,,,,74,75,71,62,57,83,95,96,63,64,,,,67,,65,66,68,313,314', +'72,73,,,,,,309,310,316,103,102,104,105,,,234,,,,,,,45,,,107,106,108', +'97,56,99,98,100,288,101,109,110,,93,94,42,43,41,,,,,,,,,,,,,,,,,,,,227', +',,233,,,58,59,,,60,,,,283,,44,,,289,,,,,,232,,,,,91,286,84,85,,86,88', +'87,89,,,,,82,90,,,,74,75,71,62,57,83,95,96,63,64,,,,67,,65,66,68,313', +'314,72,73,,,,,,309,310,316,103,102,104,105,,,234,,,,,,,45,,,107,106', +'108,97,56,99,98,100,288,101,109,110,,93,94,42,43,41,,,,,,,,,,,,,,,,', +',,,227,,,233,,,58,59,,,60,,629,,283,,44,,,289,,,,,,232,,,,,91,286,84', +'85,,86,88,87,89,,,,,82,90,,,,74,75,71,62,57,83,95,96,63,64,,,,67,,65', +'66,68,30,31,72,73,,,,,,29,28,27,103,102,104,105,,,19,,,,,,,45,,,107', +'106,108,97,56,99,98,100,,101,109,110,,93,94,42,43,41,,,,,,,,,,,,,,,', +',,,,227,,,233,,,58,59,,,60,,,,,,44,,,,,,,,,20,,,,,91,81,84,85,,86,88', +'87,89,,,,,82,90,222,,,74,75,71,62,57,83,95,96,63,64,,,,67,,65,66,68', +'313,314,72,73,,,,,,309,310,316,103,102,104,105,,,234,,,,,,,45,,,107', +'106,108,97,56,99,98,100,,101,109,110,,93,94,42,43,41,,,,,,,,,,,,,,,', +',,,,227,,,233,,,58,59,,,60,,,,,,44,,,,,,,,,232,,,,,91,81,84,85,,86,88', +'87,89,,,,,82,90,,,,74,75,71,62,57,83,95,96,63,64,,,,67,,65,66,68,313', +'314,72,73,,,,,,309,310,316,103,102,104,105,,,234,,,,,,,45,,,107,106', +'108,97,56,99,98,100,,101,109,110,,93,94,42,43,41,,,,,,,,,,,,,,,,,,,', +'227,,,233,523,,58,59,,,60,,,,,,44,,,,,,,,,232,,,,,91,81,84,85,,86,88', +'87,89,,,,,82,90,,,,74,75,71,62,57,83,95,96,63,64,,,,67,,65,66,68,30', +'31,72,73,,,,,,29,28,27,103,102,104,105,,,19,,,,,,,45,,,107,106,108,97', +'56,99,98,100,,101,109,110,,93,94,42,43,41,,,,,,,,,,,,,,,,,,,,227,,,233', +',,58,59,,,60,,,,,,44,,,,,,,,,20,,,,,91,81,84,85,,86,88,87,89,,,,,82', +'90,,,,74,75,71,62,57,83,95,96,63,64,,,,67,,65,66,68,313,314,72,73,,', +',,,309,310,316,103,102,104,105,,,234,,,,,,,45,,,107,106,108,97,56,99', +'98,100,,101,109,110,,93,94,42,43,41,,,,,,,,,,,,,,,,,,,,227,,,233,,,58', +'59,,,60,,733,,,,44,,,,,,,,,232,,,,,91,81,84,85,,86,88,87,89,,,,,82,90', +',,,74,75,71,62,57,83,95,96,63,64,,,,67,,65,66,68,30,31,72,73,,,,,,29', +'28,27,103,102,104,105,,,19,,,,,,,45,,,107,106,108,97,56,99,98,100,,101', +'109,110,,93,94,42,43,41,,,,,,,,,,,,,,,,,,,,227,,,233,,,58,59,,,60,,', +',,,44,,,,,,,,,20,,,,,91,81,84,85,,86,88,87,89,,,,,82,90,,,,74,75,71', +'62,57,83,95,96,63,64,,,,67,,65,66,68,30,31,72,73,,,,,,29,28,27,103,102', +'104,105,,,19,,,,,,,45,,,107,106,108,97,56,99,98,100,,101,109,110,,93', +'94,42,43,41,,,,,,,,,,,,,,,,,,,,227,,,233,,,58,59,,,60,,,,,,44,,,,,,', +',,20,,,,,91,81,84,85,,86,88,87,89,,,,,82,90,,,,74,75,71,62,57,83,95', +'96,63,64,,,,67,,65,66,68,30,31,72,73,,,,,,29,28,27,103,102,104,105,', +',19,,,,,,,45,,,107,106,108,97,56,99,98,100,,101,109,110,,93,94,42,43', +'41,,,,,,,,,,,,,,,,,,,,227,,,233,,,58,59,,,60,,,,,,44,,,,,,,,,20,,,,', +'91,81,84,85,,86,88,87,89,,,,,82,90,,,,74,75,71,62,57,83,95,96,63,64', +',,,67,,65,66,68,30,31,72,73,,,,,,29,28,27,103,102,104,105,,,234,,,,', +',,45,,,107,106,108,97,56,99,98,100,,101,109,110,,93,94,42,43,41,,,,', +',,,,,,,,,,,,,,,227,,,233,,,58,59,,,60,,407,,,,44,,,,,,,,,232,,,,,91', +'81,84,85,,86,88,87,89,,,,,82,90,,,,74,75,71,62,57,83,95,96,63,64,,,', +'67,,65,66,68,30,31,72,73,,,,,,29,28,27,103,102,104,105,,,234,,,,,,,45', +',,107,106,108,97,56,99,98,100,,101,109,110,,93,94,42,43,41,,,,,,,,,', +',,,,,,,,,,227,,,233,,,58,59,,,60,,,,,,44,,,,,,,,,232,,,,,91,81,84,85', +',86,88,87,89,,,,,82,90,,,,74,75,71,62,57,83,95,96,63,64,,,,67,,65,66', +'68,30,31,72,73,,,,,,29,28,27,103,102,104,105,,,234,,,,,,,45,,,107,106', +'108,97,56,99,98,100,288,101,109,110,,93,94,42,43,41,,,,,,,,,,,,,,,,', +',,,227,,,233,,,58,59,,,60,,285,,283,,44,,,289,,,,,,232,,,,,91,286,84', +'85,,86,88,87,89,,,,,82,90,,,,74,75,71,62,57,83,95,96,63,64,,,,67,,65', +'66,68,30,31,72,73,,,,,,29,28,27,103,102,104,105,,,234,,,,,,,45,,,107', +'106,108,97,56,99,98,100,288,101,109,110,,93,94,42,43,41,,,,,,,,,,,,', +',,,,,,,227,,,233,,,58,59,,,60,,285,,283,,44,,,289,,,,,,232,,,,,91,286', +'84,85,,86,88,87,89,,,,,82,90,,,,74,75,71,62,57,83,95,96,63,64,,,,67', +',65,66,68,313,314,72,73,,,,,,309,310,316,103,102,104,105,,,234,,,,,', +',45,,,107,106,108,97,56,99,98,100,,101,109,110,,93,94,42,43,41,,,,,', +',,,,,,,,,,,,,,227,,,233,,,58,59,,,60,,285,,,,44,,,,,,,,,232,,,,,91,81', +'84,85,,86,88,87,89,,,,,82,90,,,,74,75,71,62,57,83,95,96,63,64,,,,67', +',65,66,68,313,314,72,73,,,,,,309,310,316,103,102,104,105,,,234,,,,,', +',45,,,107,106,108,97,56,99,98,100,,101,109,110,,93,94,42,43,41,,,,,', +',,,,,,,,,,,,,,227,,,233,,,58,59,,,60,,,,,,44,,,,,,,,,232,,,,,91,81,84', +'85,,86,88,87,89,,,,,82,90,,,,74,75,71,62,57,83,95,96,63,64,,,,67,,65', +'66,68,313,314,72,73,,,,,,309,310,316,103,102,104,105,,,234,,,,,,,311', +',,107,106,108,356,56,99,98,357,,101,109,110,,93,94,,,317,,,,,,,,,,,', +',,,,,363,,,358,,,233,,,58,59,,,60,,,,,,,,,,,,,,,,,,,,91,81,84,85,,86', +'88,87,89,,,,,82,90,,,,74,75,71,62,57,83,95,96,63,64,,,,67,,65,66,68', +'313,314,72,73,,,,,,309,310,316,103,102,104,105,,,234,,,,,,,311,,,107', +'106,108,97,56,99,98,100,,101,109,110,,93,94,,,317,,,,,,,,,,,,,,,,,,', +',351,,,33,,,58,59,,,60,,35,,,,,,,,,,,,,,,,,,91,81,84,85,,86,88,87,89', +',,,,82,90,,,,74,75,71,62,57,83,95,96,63,64,,,,67,,65,66,68,30,31,72', +'73,,,,,,29,28,27,103,102,104,105,,,19,,,,,,,45,,,107,106,108,97,56,99', +'98,100,,101,109,110,,93,94,42,43,41,,,,,,,,,,,,,,,,,,,,227,,,233,,,58', +'59,,,60,,,,,,44,,,,,,,,,20,,,,,91,81,84,85,,86,88,87,89,,,,,82,90,,', +',74,75,71,62,57,83,95,96,63,64,,,,67,,65,66,68,313,314,72,73,,,,,,309', +'310,316,103,102,104,105,,,234,,,,,,,45,,,107,106,108,97,56,99,98,100', +',101,109,110,,93,94,42,43,41,,,,,,,,,,,,,,,,,,,,227,,,233,,,58,59,,', +'60,,,,,,44,,,,,,,,,232,,,,,91,81,84,85,,86,88,87,89,,,,,82,90,,,,74', +'75,71,62,57,83,95,96,63,64,,,,67,,65,66,68,30,31,72,73,,,,,,29,28,27', +'103,102,104,105,,,19,,,,,,,45,,,107,106,108,97,56,99,98,100,,101,109', +'110,,93,94,42,43,41,,,,,,,,,,,,,,,,,,,,227,,,233,,,58,59,,,60,,,,,,44', +',,,,,,,,20,,,,,91,81,84,85,,86,88,87,89,,,,,82,90,,,,74,75,71,62,57', +'83,95,96,63,64,,,,67,,65,66,68,30,31,72,73,,,,,,29,28,27,103,102,104', +'105,,,19,,,,,,,45,,,107,106,108,97,56,99,98,100,,101,109,110,,93,94', +'42,43,41,,,,,,,,,,,,,,,,,,,,227,,,233,,,58,59,,,60,,,,,,44,,,,,,,,,20', +',,,,91,81,84,85,,86,88,87,89,,,,,82,90,115,,,,,114,62,,83,95,96,74,75', +'71,,57,,,,63,64,,,,67,,65,66,68,313,314,72,73,,,,,,309,310,316,103,102', +'104,105,,,234,,,,,,,45,,,107,106,108,97,56,99,98,100,,101,109,110,,93', +'94,42,43,41,,,,,,,,,,,,,,,,,,,,227,,,233,,,58,59,,,60,,,,,,44,,,,,,', +',,232,,,,,91,81,84,85,,86,88,87,89,,,,,82,90,,,,74,75,71,62,57,83,95', +'96,63,64,,,,67,,65,66,68,313,314,72,73,,,,,,309,310,316,103,102,104', +'105,,,234,,,,,,,45,,,107,106,108,97,56,99,98,100,,101,109,110,,93,94', +'42,43,41,,,,,,,,,,,,,,,,,,,,227,,,233,,,58,59,,,60,,,,,,44,,,,,,,,,232', +',,,,91,81,84,85,,86,88,87,89,,,,,82,90,,,,74,75,71,62,57,83,95,96,63', +'64,,,,67,,65,66,68,313,314,72,73,,,,,,309,310,316,103,102,104,105,,', +'234,,,,,,,45,,,107,106,108,97,56,99,98,100,,101,109,110,,93,94,42,43', +'41,,,,,,,,,,,,,,,,,,,,227,,,233,,,58,59,,,60,,,,,,44,,,,,,,,,232,,,', +',91,81,84,85,,86,88,87,89,,,,,82,90,,,,74,75,71,62,57,83,95,96,63,64', +',,,67,,65,66,68,313,314,72,73,,,,,,309,310,316,103,102,104,105,,,234', +',,,,,,45,,,107,106,108,97,56,99,98,100,,101,109,110,,93,94,42,43,41', +',,,,,,,,,,,,,,,,,,,227,,,233,,,58,59,,,60,,,,,,44,,,,,,,,,232,,,,,91', +'81,84,85,,86,88,87,89,,,,,82,90,,,,74,75,71,62,57,83,95,96,63,64,,,', +'67,,65,66,68,30,31,72,73,,,,,,29,28,27,103,102,104,105,,,234,,,,,,,45', +',,107,106,108,97,56,99,98,100,,101,109,110,,93,94,42,43,41,,,,,,,,,', +',,,,,,,,,,227,,,233,,,58,59,,,60,,,,,,44,,,,,,,,,232,,,,,91,81,84,85', +',86,88,87,89,,,,,82,90,,,,74,75,71,62,57,83,95,96,63,64,,,,67,,65,66', +'68,313,314,72,73,,,,,,309,310,316,103,102,104,105,,,234,,,,,,,45,,,107', +'106,108,97,56,99,98,100,,101,109,110,,93,94,42,43,41,,,,,,,,,,,,,,,', +',,,,227,,,233,,,58,59,,,60,,,,,,44,,,,,,,,,232,,,,,91,81,84,85,,86,88', +'87,89,,,,,82,90,,,,74,75,71,62,57,83,95,96,63,64,,,,67,,65,66,68,313', +'314,72,73,,,,,,309,310,316,103,102,104,105,,,234,,,,,,,45,,,107,106', +'108,97,56,99,98,100,,101,109,110,,93,94,42,43,41,,,,,,,,,,,,,,,,,,,', +'227,,,233,,,58,59,,,60,,,,,,44,,,,,,,,,232,,,,,91,81,84,85,,86,88,87', +'89,,,,,82,90,,,,74,75,71,62,57,83,95,96,63,64,,,,67,,65,66,68,313,314', +'72,73,,,,,,309,310,316,103,102,104,105,,,234,,,,,,,45,,,107,106,108', +'97,56,99,98,100,,101,109,110,,93,94,42,43,41,,,,,,,,,,,,,,,,,,,,227', +',,233,,,58,59,,,60,,,,,,44,,,,,,,,,232,,,,,91,81,84,85,,86,88,87,89', +',,,,82,90,,,,74,75,71,62,57,83,95,96,63,64,,,,67,,65,66,68,313,314,72', +'73,,,,,,309,310,316,103,102,104,105,,,234,,,,,,,45,,,107,106,108,97', +'56,99,98,100,,101,109,110,,93,94,42,43,41,,,,,,,,,,,,,,,,,,,,227,,,233', +',,58,59,,,60,,,,,,44,,,,,,,,,232,,,,,91,81,84,85,,86,88,87,89,,,,,82', +'90,,,,74,75,71,62,57,83,95,96,63,64,,,,67,,65,66,68,313,314,72,73,,', +',,,309,310,316,103,102,104,105,,,234,,,,,,,45,,,107,106,108,97,56,99', +'98,100,,101,109,110,,93,94,42,43,41,,,,,,,,,,,,,,,,,,,,227,,,233,,,58', +'59,,,60,,,,,,44,,,,,,,,,232,,,,,91,81,84,85,,86,88,87,89,,,,,82,90,', +',,74,75,71,62,57,83,95,96,63,64,,,,67,,65,66,68,313,314,72,73,,,,,,309', +'310,316,103,102,104,105,,,234,,,,,,,45,,,107,106,108,97,56,99,98,100', +',101,109,110,,93,94,42,43,41,,,,,,,,,,,,,,,,,,,,227,,,233,,,58,59,,', +'60,,,,,,44,,,,,,,,,232,,,,,91,81,84,85,,86,88,87,89,,,,,82,90,,,,74', +'75,71,62,57,83,95,96,63,64,,,,67,,65,66,68,313,314,72,73,,,,,,309,310', +'316,103,102,104,105,,,234,,,,,,,45,,,107,106,108,97,56,99,98,100,,101', +'109,110,,93,94,42,43,41,,,,,,,,,,,,,,,,,,,,227,,,233,,,58,59,,,60,,', +',,,44,,,,,,,,,232,,,,,91,81,84,85,,86,88,87,89,,,,,82,90,,,,74,75,71', +'62,57,83,95,96,63,64,,,,67,,65,66,68,313,314,72,73,,,,,,309,310,316', +'103,102,104,105,,,234,,,,,,,45,,,107,106,108,97,56,99,98,100,,101,109', +'110,,93,94,42,43,41,,,,,,,,,,,,,,,,,,,,227,,,233,,,58,59,,,60,,,,,,44', +',,,,,,,,232,,,,,91,81,84,85,,86,88,87,89,,,,,82,90,,,,74,75,71,62,57', +'83,95,96,63,64,,,,67,,65,66,68,313,314,72,73,,,,,,309,310,316,103,102', +'104,105,,,234,,,,,,,45,,,107,106,108,97,56,99,98,100,,101,109,110,,93', +'94,42,43,41,,,,,,,,,,,,,,,,,,,,227,,,233,,,58,59,,,60,,,,,,44,,,,,,', +',,232,,,,,91,81,84,85,,86,88,87,89,,,,,82,90,,,,74,75,71,62,57,83,95', +'96,63,64,,,,67,,65,66,68,313,314,72,73,,,,,,309,310,316,103,102,104', +'105,,,234,,,,,,,45,,,107,106,108,97,56,99,98,100,,101,109,110,,93,94', +'42,43,41,,,,,,,,,,,,,,,,,,,,227,,,233,,,58,59,,,60,,,,,,44,,,,,,,,,232', +',,,,91,81,84,85,,86,88,87,89,,,,,82,90,,,,74,75,71,62,57,83,95,96,63', +'64,,,,67,,65,66,68,313,314,72,73,,,,,,309,310,316,103,102,104,105,,', +'234,,,,,,,45,,,107,106,108,97,56,99,98,100,,101,109,110,,93,94,42,43', +'41,,,,,,,,,,,,,,,,,,,,227,,,233,,,58,59,,,60,,,,,,44,,,,,,,,,232,,,', +',91,81,84,85,,86,88,87,89,,,,,82,90,,,,74,75,71,62,57,83,95,96,63,64', +',,,67,,65,66,68,313,314,72,73,,,,,,309,310,316,103,102,104,105,,,234', +',,,,,,45,,,107,106,108,97,56,99,98,100,,101,109,110,,93,94,42,43,41', +',,,,,,,,,,,,,,,,,,,227,,,233,,,58,59,,,60,,,,,,44,,,,,,,,,232,,,,,91', +'81,84,85,,86,88,87,89,,,,,82,90,,,,74,75,71,62,57,83,95,96,63,64,,,', +'67,,65,66,68,313,314,72,73,,,,,,309,310,316,103,102,104,105,,,234,,', +',,,,45,,,107,106,108,97,56,99,98,100,,101,109,110,,93,94,42,43,41,,', +',,,,,,,,,,,,,,,,,227,,,233,,,58,59,,,60,,,,,,44,,,,,,,,,232,,,,,91,81', +'84,85,,86,88,87,89,,,,,82,90,,,,74,75,71,62,57,83,95,96,63,64,,,,67', +',65,66,68,313,314,72,73,,,,,,309,310,316,103,102,104,105,,,234,,,,,', +',45,,,107,106,108,97,56,99,98,100,,101,109,110,,93,94,42,43,41,,,,,', +',,,,,,,,,,,,,,227,,,233,,,58,59,,,60,,,,,,44,,,,,,,,,232,,,,,91,81,84', +'85,,86,88,87,89,,,,,82,90,,,,74,75,71,62,57,83,95,96,63,64,,,,67,,65', +'66,68,313,314,72,73,,,,,,309,310,316,103,102,104,105,,,234,,,,,,,45', +',,107,106,108,97,56,99,98,100,,101,109,110,,93,94,42,43,41,,,,,,,,,', +',,,,,,,,,,227,,,233,,,58,59,,,60,,,,,,44,,,,,,,,,232,,,,,91,81,84,85', +',86,88,87,89,,,,,82,90,,,,74,75,71,62,57,83,95,96,63,64,,,,67,,65,66', +'68,313,314,72,73,,,,,,309,310,316,103,102,104,105,,,234,,,,,,,45,,,107', +'106,108,97,56,99,98,100,,101,109,110,,93,94,42,43,41,,,,,,,,,,,,,,,', +',,,,227,,,233,,,58,59,,,60,,,,,,44,,,,,,,,,232,,,,,91,81,84,85,,86,88', +'87,89,,,,,82,90,,,,74,75,71,62,57,83,95,96,63,64,,,,67,,65,66,68,313', +'314,72,73,,,,,,309,310,316,103,102,104,105,,,234,,,,,,,45,,,107,106', +'108,97,56,99,98,100,,101,109,110,,93,94,42,43,41,,,,,,,,,,,,,,,,,,,', +'227,,,233,,,58,59,,,60,,,,,,44,,,,,,,,,232,,,,,91,81,84,85,,86,88,87', +'89,,,,,82,90,,,,74,75,71,62,57,83,95,96,63,64,,,,67,,65,66,68,313,314', +'72,73,,,,,,309,310,316,103,102,104,105,,,234,,,,,,,45,,,107,106,108', +'97,56,99,98,100,,101,109,110,,93,94,42,43,41,,,,,,,,,,,,,,,,,,,,227', +',,233,,,58,59,,,60,,,,,,44,,,,,,,,,232,,,,,91,81,84,85,,86,88,87,89', +',,,,82,90,,,,74,75,71,62,57,83,95,96,63,64,,,,67,,65,66,68,30,31,72', +'73,,,,,,29,28,27,103,102,104,105,,,234,,,,,,,45,,,107,106,108,97,56', +'99,98,100,288,101,109,110,,93,94,42,43,41,,,,,,,,,,,,,,,,,,,,227,,,233', +',,58,59,,,60,,285,,283,,44,,,289,,,,,,232,,,,,91,286,84,85,,86,88,87', +'89,,,,,82,90,,,,74,75,71,62,57,83,95,96,63,64,,,,67,,65,66,68,30,31', +'72,73,,,,,,29,28,27,103,102,104,105,,,234,,,,,,,45,,,107,106,108,97', +'56,99,98,100,288,101,109,110,,93,94,42,43,41,,,,,,,,,,,,,,,,,,,,227', +',,233,,,58,59,,,60,,285,,283,,44,,,289,,,,,,232,,,,,91,286,84,85,,86', +'88,87,89,,,,,82,90,,,,74,75,71,62,57,83,95,96,63,64,,,,67,,65,66,68', +'30,31,72,73,,,,,,29,28,27,103,102,104,105,,,234,,,,,,,45,,,107,106,108', +'97,56,99,98,100,288,101,109,110,,93,94,42,43,41,,,,,,,,,,,,,,,,,,,,227', +',,233,,,58,59,,,60,,285,,283,,44,,,289,,,,,,232,,,,,91,286,84,85,,86', +'88,87,89,,,,,82,90,222,,,74,75,71,62,57,83,95,96,63,64,,,,67,,65,66', +'68,313,314,72,73,,,,,,309,310,316,103,102,104,105,,,234,,,,,,,311,,', +'107,106,108,97,56,99,98,100,,101,109,110,,93,94,,,317,,,,,,,,,,,,,,', +',,,,,856,,,233,,,58,59,,,60,,,,,,,,,,,,,,,,,,,,91,81,84,85,,86,88,87', +'89,,,,,82,90,,,,74,75,71,62,57,83,95,96,63,64,,,,67,,65,66,68,313,314', +'72,73,,,,,,309,310,316,103,102,104,105,,,234,,,,,,,45,,,107,106,108', +'97,56,99,98,100,,101,109,110,,93,94,42,43,41,,,,,,,,,,,,,,,,,,,,227', +',,233,,,58,59,,,60,,,,,,44,,,,,,,,,232,,,,,91,81,84,85,,86,88,87,89', +',,,,82,90,,,,74,75,71,62,57,83,95,96,63,64,,,,67,,65,66,68,313,314,72', +'73,,,,,,309,310,316,103,102,104,105,,,234,,,,,,,45,,,107,106,108,97', +'56,99,98,100,,101,109,110,,93,94,42,43,41,,,,,,,,,,,,,,,,,,,,227,,,233', +',,58,59,,,60,,,,,,44,,,,,,,,,232,,,,,91,81,84,85,,86,88,87,89,,,,,82', +'90,,,,74,75,71,62,57,83,95,96,63,64,,,,67,,65,66,68,313,314,72,73,,', +',,,309,310,316,103,102,104,105,,,234,,,,,,,45,,,107,106,108,97,56,99', +'98,100,,101,109,110,,93,94,42,43,41,,,,,,,,,,,,,,,,,,,,227,,,233,,,58', +'59,,,60,,,,,,44,,,,,,,,,232,,,,,91,81,84,85,,86,88,87,89,,,,,82,90,', +',,74,75,71,62,57,83,95,96,63,64,,,,67,,65,66,68,313,314,72,73,,,,,,309', +'310,316,103,102,104,105,,,234,,,,,,,45,,,107,106,108,97,56,99,98,100', +',101,109,110,,93,94,42,43,41,,,,,,,,,,,,,,,,,,,,227,,,233,,,58,59,,', +'60,,,,,,44,,,,,,,,,232,,,,,91,81,84,85,,86,88,87,89,,,,,82,90,,,,74', +'75,71,62,57,83,95,96,63,64,,,,67,,65,66,68,313,314,72,73,,,,,,309,310', +'316,103,102,104,105,,,234,,,,,,,45,,,107,106,108,97,56,99,98,100,,101', +'109,110,,93,94,42,43,41,,,,,,,,,,,,,,,,,,,,227,,,233,,,58,59,,,60,,', +',,,44,,,,,,,,,232,,,,,91,81,84,85,,86,88,87,89,,,,,82,90,,,,74,75,71', +'62,57,83,95,96,63,64,,,,67,,65,66,68,313,314,72,73,,,,,,309,310,316', +'103,102,104,105,,,234,,,,,,,45,,,107,106,108,97,56,99,98,100,,101,109', +'110,,93,94,42,43,41,,,,,,,,,,,,,,,,,,,,227,,,233,,,58,59,,,60,,,,,,44', +',,,,,,,,232,,,,,91,81,84,85,,86,88,87,89,,,,,82,90,,,,74,75,71,62,57', +'83,95,96,63,64,,,,67,,65,66,68,313,314,72,73,,,,,,309,310,316,103,102', +'104,105,,,234,,,,,,,45,,,107,106,108,97,56,99,98,100,,101,109,110,,93', +'94,42,43,41,,,,,,,,,,,,,,,,,,,,227,,,233,,,58,59,,,60,,,,,,44,,,,,,', +',,232,,,,,91,81,84,85,,86,88,87,89,,,,,82,90,,,,74,75,71,62,57,83,95', +'96,63,64,,,,67,,65,66,68,30,31,72,73,,,,,,29,28,27,103,102,104,105,', +',19,,,,,,,45,,,107,106,108,97,56,99,98,100,,101,109,110,,93,94,42,43', +'41,,,,,,,,,,,,,,,,,,,,227,,,233,,,58,59,,,60,,,,,,44,,,,,,,,,20,,,,', +'91,81,84,85,,86,88,87,89,,,,,82,90,,,,74,75,71,62,57,83,95,96,63,64', +',,,67,,65,66,68,313,314,72,73,,,,,,309,310,316,103,102,104,105,,,234', +',,,,,,45,,,107,106,108,97,56,99,98,100,,101,109,110,,93,94,42,43,41', +',,,,,,,,,,,,,,,,,,,227,,,233,,,58,59,,,60,,,,,,44,,,,,,,,,232,,,,,91', +'81,84,85,,86,88,87,89,,,,,82,90,,,,74,75,71,62,57,83,95,96,63,64,,,', +'67,,65,66,68,313,314,72,73,,,,,,309,310,316,103,102,104,105,,,234,,', +',,,,45,,,107,106,108,97,56,99,98,100,,101,109,110,,93,94,42,43,41,,', +',,,,,,,,,,,,,,,,,227,,,233,,,58,59,,,60,,407,,,,44,,,,,,,,,232,,,,,91', +'81,84,85,,86,88,87,89,,,,,82,90,,,,74,75,71,62,57,83,95,96,63,64,,,', +'67,,65,66,68,313,314,72,73,,,,,,309,310,316,103,102,104,105,,,234,,', +',,,,45,,,107,106,108,97,56,99,98,100,,101,109,110,,93,94,42,43,41,,', +',,,,,,,,,,,,,,,,,227,,,233,,,58,59,,,60,,,,,,44,,,,,,,,,232,,,,,91,81', +'84,85,,86,88,87,89,,,,,82,90,,,,74,75,71,62,57,83,95,96,63,64,,,,67', +',65,66,68,30,31,72,73,,,,,,29,28,27,103,102,104,105,,,19,,,,,,,45,,', +'107,106,108,97,56,99,98,100,,101,109,110,,93,94,42,43,41,,,,,,,,,,,', +',,,,,,,,227,,,233,,,58,59,,,60,,,,,,44,,,,,,,,,20,,,,,91,81,84,85,,86', +'88,87,89,,,,,82,90,,,,74,75,71,62,57,83,95,96,63,64,,,,67,,65,66,68', +'30,31,72,73,,,,,,29,28,27,103,102,104,105,,,19,,,,,,,45,,,107,106,108', +'97,56,99,98,100,,101,109,110,,93,94,42,43,41,,,,,,,,,,,,,,,,,,,,227', +',,233,,,58,59,,,60,,,,,,44,,,,,,,,,20,,,,,91,81,84,85,,86,88,87,89,', +',,,82,90,,,,74,75,71,62,57,83,95,96,63,64,,,,67,,65,66,68,313,314,72', +'73,,,,,,309,310,316,103,102,104,105,,,234,,,,,,,45,,,107,106,108,97', +'56,99,98,100,,101,109,110,,93,94,42,43,41,,,,,,,,,,,,,,,,,,,,227,,,233', +',,58,59,,,60,,,,,,44,,,,,,,,,232,,,,,91,81,84,85,,86,88,87,89,,,,,82', +'90,,,,74,75,71,62,57,83,95,96,63,64,,,,67,,65,66,68,313,314,72,73,,', +',,,309,310,316,103,102,104,105,,,234,,,,,,,311,,,107,106,108,97,56,99', +'98,100,,101,109,110,,93,94,,,317,,,,,,,,,,,,,,,,,,,,307,,,303,,,58,59', +',,60,,,,,,,,,,,,,,,,,,,,91,81,84,85,,86,88,87,89,,,,,82,90,,,,74,75', +'71,62,57,83,95,96,63,64,,,,67,,65,66,68,30,31,72,73,,,,,,29,28,27,103', +'102,104,105,,,234,,,,,,,45,,,107,106,108,97,56,99,98,100,288,101,109', +'110,,93,94,42,43,41,,,,,,,,,,,,,,,,,,,,227,,,233,,,58,59,,,60,,285,', +'283,,44,,,289,,,,,,232,,,,,91,286,84,85,,86,88,87,89,,,,,82,90,,,,74', +'75,71,62,57,83,95,96,63,64,,,,67,,65,66,68,313,314,72,73,,,,,,309,310', +'316,103,102,104,105,,,234,,,,,,,311,,,107,106,108,97,56,99,98,100,,101', +'109,110,,93,94,,,317,,,,,,,,,,,,,,,,,,,,307,,,303,,,58,59,,,60,,,672', +',669,668,667,677,670,,,,,,,,,680,,91,81,84,85,,86,88,87,89,,,,,82,90', +',,,,,675,62,,83,95,96,74,75,71,9,57,688,687,,63,64,681,,,67,,65,66,68', +'30,31,72,73,,,,,,29,28,27,103,102,104,105,,,19,,,,,,8,45,,10,107,106', +'108,97,56,99,98,100,,101,109,110,,93,94,42,43,41,,,,,,,,,,,,,,,,,,,', +'40,,,33,,,58,59,,,60,,35,,,,44,,,,,,,,,20,,,,,91,81,84,85,,86,88,87', +'89,,,,,82,90,,,,74,75,71,62,57,83,95,96,63,64,,,,67,,65,66,68,30,31', +'72,73,,,,,,29,28,27,103,102,104,105,,,19,,,,,,,45,,,107,106,108,97,56', +'99,98,100,,101,109,110,,93,94,42,43,41,,,,,,,,,,,,,,,,,,,,227,,,233', +',,58,59,,,60,,,,,,44,,,,,,,,,20,,,,,91,81,84,85,,86,88,87,89,,,,,82', +'90,,,,74,75,71,62,57,83,95,96,63,64,,,,67,,65,66,68,313,314,72,73,,', +',,,309,310,316,103,102,104,105,,,234,,,,,,,45,,,107,106,108,97,56,99', +'98,100,,101,109,110,,93,94,42,43,41,,,,,,,,,,,,,,,,,,,,227,,,233,,,58', +'59,,,60,,,,,,44,,,,,,,,,232,,,,,91,81,84,85,,86,88,87,89,,,,,82,90,', +',,74,75,71,62,57,83,95,96,63,64,,,,67,,65,66,68,30,31,72,73,,,,,,29', +'28,27,103,102,104,105,,,19,,,,,,,45,,,107,106,108,97,56,99,98,100,,101', +'109,110,,93,94,42,43,41,,,,,,,,,,,,,,,,,,,,227,,,233,,,58,59,,,60,,', +',,,44,,,,,,,,,20,,,,,91,81,84,85,,86,88,87,89,,,,,82,90,,,,74,75,71', +'62,57,83,95,96,63,64,,,,67,,65,66,68,30,31,72,73,,,,,,29,28,27,103,102', +'104,105,,,19,,,,,,,45,,,107,106,108,97,56,99,98,100,,101,109,110,,93', +'94,42,43,41,,,,,,,,,,,,,,,,,,,,227,,,233,,,58,59,,,60,,,,,,44,,,,,,', +',,20,,,,,91,81,84,85,,86,88,87,89,,,,,82,90,,,,,,,62,,83,95,96,74,75', +'71,9,57,,,,63,64,,,,67,,65,66,68,30,31,72,73,,,,,,29,28,27,103,102,104', +'105,,,19,,,,,,8,45,296,10,107,106,108,97,56,99,98,100,,101,109,110,', +'93,94,42,43,41,,,,,,,,,,,,,,,,,,,,40,,,33,,,58,59,,,60,,35,,,,44,,,', +',,,,,20,,,,,91,81,84,85,,86,88,87,89,,,,,82,90,,,,,,391,62,,83,95,96', +'74,75,71,,57,,,,63,64,,,,67,,65,66,68,313,314,72,73,,,,,,309,310,316', +'103,102,104,105,,,234,,,,,,,45,,,107,106,108,97,56,99,98,100,,101,109', +'110,,93,94,42,43,41,,,,,,,,,,,,,,,,,,,,227,,,233,,,58,59,,,60,,,,,,44', +',,,,,,,,232,,,,,91,81,84,85,,86,88,87,89,,,,,82,90,,,,74,75,71,62,57', +'83,95,96,63,64,,,,67,,65,66,68,313,314,72,73,,,,,,309,310,316,103,102', +'104,105,,,234,,,,,,,45,,,107,106,108,97,56,99,98,100,288,101,109,110', +',93,94,42,43,41,,,,,,,,,,,,,,,,,,,,227,,,233,,,58,59,,,60,,,,283,,44', +',,289,,,,,,232,,,,,91,286,84,85,,86,88,87,89,,,,,82,90,,,,74,75,71,62', +'57,83,95,96,63,64,,,,67,,65,66,68,313,314,72,73,,,,,,309,310,316,103', +'102,104,105,,,234,,,,,,,45,,,107,106,108,97,56,99,98,100,288,101,109', +'110,,93,94,42,43,41,,,,,,,,,,,,,,,,,,,,227,,,233,,,58,59,,,60,,629,', +'283,,44,,,289,,,,,,232,,,,,91,286,84,85,,86,88,87,89,,,,,82,90,,,,74', +'75,71,62,57,83,95,96,63,64,,,,67,,65,66,68,313,314,72,73,,,,,,309,310', +'316,103,102,104,105,,,234,,,,,,,45,,,107,106,108,97,56,99,98,100,288', +'101,109,110,,93,94,42,43,41,,,,,,,,,,,,,,,,,,,,227,,,233,,,58,59,,,60', +',285,,,,44,,,289,,,,,,232,,,,,91,286,84,85,,86,88,87,89,,,,,82,90,,', +',74,75,71,62,57,83,95,96,63,64,,,,67,,65,66,68,30,31,72,73,,,,,,29,28', +'27,103,102,104,105,,,19,,,,,,,45,,,107,106,108,97,56,99,98,100,,101', +'109,110,,93,94,42,43,41,,,,,,,,,,,,,,,,,,,,227,,,233,,,58,59,,,60,,', +',,,44,,,,,,,,,20,,,,,91,81,84,85,,86,88,87,89,,,,,82,90,,,,74,75,71', +'62,57,83,95,96,63,64,,,,67,,65,66,68,30,31,72,73,,,,,,29,28,27,103,102', +'104,105,,,19,,,,,,,45,,,107,106,108,97,56,99,98,100,,101,109,110,,93', +'94,42,43,41,,,,,,,,,,,,,,,,,,,,227,,,233,,,58,59,,,60,,,,,,44,,,,,,', +',,20,,,,,91,81,84,85,,86,88,87,89,,,,,82,90,,,,74,75,71,62,57,83,95', +'96,63,64,,,,67,,65,66,68,30,31,72,73,,,,,,29,28,27,103,102,104,105,', +',19,,,,,,,45,,,107,106,108,97,56,99,98,100,,101,109,110,,93,94,42,43', +'41,,,,,,,,,,,,,,,,,,,,227,,,233,,,58,59,,,60,,,,,,44,,,,,,,,,20,,,,', +'91,81,84,85,,86,88,87,89,,,,,82,90,,,,,,,62,,83,95,96,74,75,71,9,57', +',,,63,64,,,,67,,65,66,68,30,31,72,73,,,,,,29,28,27,103,102,104,105,', +',19,,,,,,8,45,7,10,107,106,108,97,56,99,98,100,,101,109,110,,93,94,42', +'43,41,,,,,,,,,,,,,,,,,,,,40,,,33,,,58,59,,,60,,35,,,,44,,,,,,,,,20,', +',,,91,81,84,85,,86,88,87,89,,,,,82,90,,,,,,391,62,,83,95,96,74,75,71', +',57,,,,63,64,,,,67,,65,66,68,313,314,72,73,,,,,,309,310,316,103,102', +'104,105,,,234,,,,,,,45,,,107,106,108,97,56,99,98,100,,101,109,110,,93', +'94,42,43,41,,,,,,,,,,,,,,,,,,,,227,,,233,,,58,59,,,60,,,,,,44,,,,,,', +',,232,,,,,91,81,84,85,,86,88,87,89,,,,,82,90,,,,74,75,71,62,57,83,95', +'96,63,64,,,,67,,65,66,68,313,314,72,73,,,,,,309,310,316,103,102,104', +'105,,,234,,,,,,,45,,,107,106,108,97,56,99,98,100,,101,109,110,,93,94', +'42,43,41,,,,,,,,,,,,,,,,,,,,227,,,233,,,58,59,,,60,,,,,,44,,,,,,,,,232', +',,,,91,81,84,85,,86,88,87,89,,,,,82,90,,,,74,75,71,62,57,83,95,96,63', +'64,,,,67,,65,66,68,313,314,72,73,,,,,,309,310,316,103,102,104,105,,', +'234,,,,,,,45,,,107,106,108,97,56,99,98,100,,101,109,110,,93,94,42,43', +'41,,,,,,,,,,,,,,,,,,,,227,,,233,,,58,59,,,60,,,,,,44,,,,,,,,,232,,,', +',91,81,84,85,,86,88,87,89,,,,,82,90,,,,74,75,71,62,57,83,95,96,63,64', +',,,67,,65,66,68,30,31,72,73,,,,,,29,28,27,103,102,104,105,,,234,,,,', +',,45,,,107,106,108,97,56,99,98,100,288,101,109,110,,93,94,42,43,41,', +',,,,,,,,,,,,,,,,,,227,,,233,,,58,59,,,60,,285,,283,,44,,,289,,,,,,232', +',,,,91,286,84,85,,86,88,87,89,,,,,82,90,,,,74,75,71,62,57,83,95,96,63', +'64,,,,67,,65,66,68,30,31,72,73,,,,,,29,28,27,103,102,104,105,,,19,,', +',,,,45,,,107,106,108,97,56,99,98,100,,101,109,110,,93,94,42,43,41,,', +',,,,,,,,,,,,,,,,,227,,,233,,,58,59,,,60,,,,,,44,,,,,,,,,20,,,,,91,81', +'84,85,,86,88,87,89,,,,,82,90,,,,74,75,71,62,57,83,95,96,63,64,,,,67', +',65,66,68,313,314,72,73,,,,,,309,310,316,103,102,104,105,,,234,,,,,', +',311,,,107,106,108,356,56,99,98,357,,101,109,110,,93,94,,,317,,,,,,', +',,,,,,,,,,,,,358,,,233,,,58,59,,,60,,,,,,,,,,,,,,,,,,,,91,81,84,85,', +'86,88,87,89,,,,,82,90,,,,74,75,71,62,57,83,95,96,63,64,,,,67,,65,66', +'68,313,314,72,73,,,,,,309,310,316,103,102,104,105,,,234,,,,,,,45,,,107', +'106,108,97,56,99,98,100,288,101,109,110,,93,94,42,43,41,,,,,,,,,,,,', +',,,,,,,227,,,233,,,58,59,,,60,,,,,,44,,,289,,,,,,232,,,,,91,286,84,85', +',86,88,87,89,,,,,82,90,,,,74,75,71,62,57,83,95,96,63,64,,,,67,,65,66', +'68,30,31,72,73,,,,,,29,28,27,103,102,104,105,,,234,,,,,,,45,,,107,106', +'108,97,56,99,98,100,288,101,109,110,,93,94,42,43,41,,,,,,,,,,,,,,,,', +',,,227,,,233,,,58,59,,,60,,285,,283,,44,,,289,,,,,,232,,,,,91,286,84', +'85,,86,88,87,89,,,,,82,90,,,,74,75,71,62,57,83,95,96,63,64,,,,67,,65', +'66,68,313,314,72,73,,,,,,309,310,316,103,102,104,105,,,234,,,,,,,45', +',,107,106,108,97,56,99,98,100,288,101,109,110,,93,94,42,43,41,,,,,,', +',,,,,,,,,,,,,227,,,233,,,58,59,,,60,,,,,,44,,,289,,,,,,232,,,,,91,286', +'84,85,,86,88,87,89,,,,,82,90,,,,74,75,71,62,57,83,95,96,63,64,,,,67', +',65,66,68,313,314,72,73,,,,,,309,310,316,103,102,104,105,,,234,,,,,', +',45,,,107,106,108,97,56,99,98,100,288,101,109,110,,93,94,42,43,41,,', +',,,,,,,,,,,,,,,,,227,,,233,,,58,59,,,60,,629,,,,44,,,289,,,,,,232,,', +',,91,286,84,85,,86,88,87,89,,,,,82,90,,,,74,75,71,62,57,83,95,96,63', +'64,,,,67,,65,66,68,30,31,72,73,,,,,,29,28,27,103,102,104,105,,,234,', +',,,,,45,,,107,106,108,97,56,99,98,100,,101,109,110,,93,94,42,43,41,', +',,,,,,,,,,,,,,,,,,227,,,233,,,58,59,,,60,,,,,,44,,,,,,,,,232,,,,,91', +'81,84,85,,86,88,87,89,,,,,82,90,,,,74,75,71,62,57,83,95,96,63,64,,,', +'67,,65,66,68,313,314,72,73,,,,,,309,310,316,103,102,104,105,,,234,,', +',,,,45,,,107,106,108,97,56,99,98,100,,101,109,110,,93,94,42,43,41,,', +',,,,,,,,,,,,,,,,,227,,,233,,,58,59,,,60,,,,,,44,,,,,,,,,232,,,,,91,81', +'84,85,,86,88,87,89,,,,,82,90,,,,74,75,71,62,57,83,95,96,63,64,,,,67', +',65,66,68,30,31,72,73,,,,,,29,28,27,103,102,104,105,,,234,,,,,,,45,', +',107,106,108,97,56,99,98,100,,101,109,110,,93,94,42,43,41,,,,,,,,,,', +',,,,,,,,,227,,,233,,,58,59,,,60,,407,,,,44,,,,,,,,,232,,,,,91,81,84', +'85,,86,88,87,89,,,,,82,90,,,,74,75,71,62,57,83,95,96,63,64,,,,67,,65', +'66,68,313,314,72,73,,,,,,309,310,316,103,102,104,105,,,234,,,,,,,45', +',,107,106,108,97,56,99,98,100,,101,109,110,,93,94,42,43,41,,,,,,,,,', +',,,,,,,,,,227,,,233,,,58,59,,,60,,,,,,44,,,,,,,,,232,,,,,91,81,84,85', +',86,88,87,89,,,,,82,90,,,,74,75,71,62,57,83,95,96,63,64,,,,67,,65,66', +'68,30,31,72,73,,,,,,29,28,27,103,102,104,105,,,234,,,,,,,45,,,107,106', +'108,97,56,99,98,100,288,101,109,110,,93,94,42,43,41,,,,,,,,,,,,,,,,', +',,,227,,,233,,,58,59,,,60,,285,,283,,44,,,289,,,,,,232,,,,,91,286,84', +'85,,86,88,87,89,,,,,82,90,,,,74,75,71,62,57,83,95,96,63,64,,,,67,,65', +'66,68,30,31,72,73,,,,,,29,28,27,103,102,104,105,,,19,,,,,,,45,,,107', +'106,108,97,56,99,98,100,,101,109,110,,93,94,42,43,41,,,,,,,,,,,,,,,', +',,,,227,,,233,,,58,59,,,60,,,,,,44,,,,,,,,,20,,,,,91,81,84,85,,86,88', +'87,89,,,,,82,90,,,,74,75,71,62,57,83,95,96,63,64,,,,67,,65,66,68,313', +'314,72,73,,,,,,309,310,316,103,102,104,105,,,234,,,,,,,45,,,107,106', +'108,97,56,99,98,100,,101,109,110,,93,94,42,43,41,,,,,,,,,,,,,,,,,,,', +'227,,,233,,,58,59,,,60,,,,,,44,,,,,,,,,232,,,,,91,81,84,85,,86,88,87', +'89,,,,,82,90,,,,,,,62,,83,95,96,175,186,176,199,172,192,182,181,202', +'203,197,180,179,174,200,204,205,184,173,187,191,193,185,178,,,,194,201', +'196,195,188,198,183,171,190,189,,,,,,170,177,168,169,165,166,167,126', +'128,,,127,,,,,,,,159,160,,156,138,139,140,147,144,146,,,141,142,,,,161', +'162,148,149,,,,,,,,,,,,,,153,152,,137,158,155,154,163,150,151,145,143', +'135,157,136,,,164,91,,,,,,,,,,,,,,90,175,186,176,199,172,192,182,181', +'202,203,197,180,179,174,200,204,205,184,173,187,191,193,185,178,,,,194', +'201,196,195,188,198,183,171,190,189,,,,,,170,177,168,169,165,166,167', +'126,128,,,127,,,,,,,,159,160,,156,138,139,140,147,144,146,,,141,142', +',,,161,162,148,149,,,,,,,,,,,,,,153,152,,137,158,155,154,163,150,151', +'145,143,135,157,136,,,164,91,,,,,,,,,,,,,,90,175,186,176,199,172,192', +'182,181,202,203,197,180,179,174,200,204,205,184,173,187,191,193,185', +'178,,,,194,201,196,195,188,198,183,171,190,189,,,,,,170,177,168,169', +'165,166,167,126,128,,,127,,,,,,,,159,160,,156,138,139,140,147,144,146', +',,141,142,,,,161,162,148,149,,,,,,,,,,,,,,153,152,,137,158,155,154,163', +'150,151,145,143,135,157,136,,,164,91,,,,,,,,,,,,,,90,175,186,176,199', +'172,192,182,181,202,203,197,180,179,174,200,204,205,184,173,187,191', +'193,185,178,,,,194,201,196,195,188,198,183,171,190,189,,,,,,170,177', +'168,169,165,166,167,126,128,125,,127,,,,,,,,159,160,,156,138,139,140', +'147,144,146,,,141,142,,,,161,162,148,149,,,,,,,,,,,,,,153,152,,137,158', +'155,154,163,150,151,145,143,135,157,136,,,164,91,,,,,,,,,,,,,,90,175', +'186,176,199,172,192,182,181,202,203,197,180,179,174,200,204,205,184', +'173,187,191,193,185,178,,,,194,201,196,195,188,198,183,171,190,189,', +',,,,170,177,168,169,165,166,167,126,128,,,127,,,,,,,,159,160,,156,138', +'139,140,147,144,146,,,141,142,,,,161,162,148,149,,,,,,,,,,,,,,153,152', +',137,158,155,154,163,150,151,145,143,135,157,136,,,164,175,186,176,199', +'172,192,182,181,202,203,197,180,179,174,200,204,205,184,173,187,191', +'193,185,178,,,,194,201,196,374,373,375,372,171,190,189,,,,,,170,177', +'168,169,369,370,371,367,128,99,98,368,,101,,,,,,159,160,,156,138,139', +'140,147,144,146,,,141,142,,,,161,162,148,149,,,,,,379,,,,,,,,153,152', +',137,158,155,154,163,150,151,145,143,135,157,136,973,427,164,,972,,', +',,,,,159,160,,156,138,139,140,147,144,146,,,141,142,,,,161,162,148,149', +',,,,,267,,,,,,,,153,152,,137,158,155,154,163,150,151,145,143,135,157', +'136,608,420,164,,609,,,,,,,,159,160,,156,138,139,140,147,144,146,,,141', +'142,,,,161,162,148,149,,,,,,267,,,,,,,,153,152,,137,158,155,154,163', +'150,151,145,143,135,157,136,610,427,164,,611,,,,,,,,159,160,,156,138', +'139,140,147,144,146,,,141,142,,,,161,162,148,149,,,,,,267,,,,,,,,153', +'152,,137,158,155,154,163,150,151,145,143,135,157,136,703,427,164,,704', +',,,,,,,159,160,,156,138,139,140,147,144,146,,,141,142,,,,161,162,148', +'149,,,,,,267,,,,,,,,153,152,,137,158,155,154,163,150,151,145,143,135', +'157,136,1001,427,164,,1002,,,,,,,,159,160,,156,138,139,140,147,144,146', +',,141,142,,,,161,162,148,149,,,,,,267,,,,,,,,153,152,,137,158,155,154', +'163,150,151,145,143,135,157,136,999,420,164,,1000,,,,,,,,159,160,,156', +'138,139,140,147,144,146,,,141,142,,,,161,162,148,149,,,,,,267,,,,,,', +',153,152,,137,158,155,154,163,150,151,145,143,135,157,136,610,427,164', +',611,,,,,,,,159,160,,156,138,139,140,147,144,146,,,141,142,,,,161,162', +'148,149,,,,,,267,,,,,,,,153,152,,137,158,155,154,163,150,151,145,143', +'135,157,136,416,420,164,,417,,,,,,,,159,160,,156,138,139,140,147,144', +'146,,,141,142,,,,161,162,148,149,,,,,,267,,,,,,,,153,152,,137,158,155', +'154,163,150,151,145,143,135,157,136,608,420,164,,609,,,,,,,,159,160', +',156,138,139,140,147,144,146,,,141,142,,,,161,162,148,149,,,,,,267,', +',,,,,,153,152,,137,158,155,154,163,150,151,145,143,135,157,136,423,427', +'164,,422,,,,,,,,159,160,,156,138,139,140,147,144,146,,,141,142,,,,161', +'162,148,149,,,,,,267,,,,,,,,153,152,,137,158,155,154,163,150,151,145', +'143,135,157,136,478,420,164,,479,,,,,,,,159,160,,156,138,139,140,147', +'144,146,,,141,142,,,,161,162,148,149,,,,,,267,,,,,,,,153,152,,137,158', +'155,154,163,150,151,145,143,135,157,136,701,420,164,,702,,,,,,,,159', +'160,,156,138,139,140,147,144,146,,,141,142,,,,161,162,148,149,,,,,,267', +',,,,,,,153,152,,137,158,155,154,163,150,151,145,143,135,157,136,643', +'427,164,,644,,,,,,,,159,160,,156,138,139,140,147,144,146,,,141,142,', +',,161,162,148,149,,,,,,267,,,,,,,,153,152,,137,158,155,154,163,150,151', +'145,143,135,157,136,706,427,164,,707,,,,,,,,159,160,,156,138,139,140', +'147,144,146,,,141,142,,,,161,162,148,149,,,,,,267,,,,,,,,153,152,,137', +'158,155,154,163,150,151,145,143,135,157,136,640,420,164,,641,,,,,,,', +'159,160,,156,138,139,140,147,144,146,,,141,142,,,,161,162,148,149,,', +',,,267,,,,,,,,153,152,,137,158,155,154,163,150,151,145,143,135,157,136', +'478,420,164,,479,,,,,,,,159,160,,156,138,139,140,147,144,146,,,141,142', +',,,161,162,148,149,672,,669,668,667,677,670,,,,,,,153,152,680,137,158', +'155,154,163,150,151,145,143,135,157,136,,672,164,669,668,667,677,670', +'672,675,669,668,667,677,670,,680,,,,688,687,,680,,681,672,,669,668,667', +'677,670,,,,,,675,658,,680,,,,675,,685,684,688,687,,,,681,,688,687,,', +',681,672,675,669,668,667,677,670,,,,685,684,688,687,,680,,681,672,,669', +'668,667,677,670,672,,669,668,667,677,670,,680,,,,675,,672,680,669,668', +'667,677,670,685,684,688,687,,,,681,680,675,,,,,,,675,,,,688,687,,,,681', +',688,687,,675,,681,,,,,,,685,684,688,687,,,672,681,669,668,667,677,670', +',672,,669,668,667,677,670,680,,,,,,,,680,,672,,669,668,667,677,670,', +',,,,675,,,680,,,,,675,685,684,688,687,,,,681,685,684,688,687,,,,681', +'675,,672,,669,668,667,677,670,685,684,688,687,,,,681,680,,672,,669,668', +'667,677,670,,672,,669,668,667,677,670,680,,,,,675,,,680,,,,,,685,684', +'688,687,,,,681,675,,,,,,,,675,,,688,687,,,,681,685,684,688,687,,,672', +'681,669,668,667,677,670,672,,669,668,667,677,670,,680,,,,,,,680,,,,', +',,,,,,,,,,675,,,,,,,675,,685,684,688,687,,,,681,,688,687,,,,681' ] + racc_action_table = arr = ::Array.new(25101, nil) + idx = 0 + clist.each do |str| + str.split(',', -1).each do |i| + arr[idx] = i.to_i unless i.empty? + idx += 1 + end + end + +clist = [ +'610,928,865,1001,446,978,542,610,610,610,61,1002,610,610,610,3,610,620', +'699,387,3,19,650,650,635,610,610,610,610,386,341,897,1023,897,635,792', +'610,610,342,610,610,610,610,610,225,931,824,989,989,927,348,640,125', +'892,1,440,440,125,125,58,349,446,19,7,999,1000,610,610,610,610,610,610', +'610,610,610,610,610,610,610,610,1001,825,610,610,610,387,610,610,1002', +'352,610,543,550,610,610,386,610,61,610,58,610,225,610,610,620,610,610', +'610,610,610,542,610,610,610,701,542,650,640,702,928,865,1001,10,978', +'928,865,1001,610,978,1002,610,610,610,610,1002,610,699,610,100,699,1020', +'699,610,610,792,100,100,100,341,440,100,100,100,341,100,824,342,640', +'12,348,640,342,100,931,100,100,100,927,931,349,640,892,927,780,100,100', +'892,100,100,100,100,100,999,1000,13,825,16,999,1000,703,825,621,564', +'564,643,543,608,22,352,358,543,550,704,358,100,100,100,100,100,100,100', +'100,100,100,100,100,100,100,37,312,100,100,100,701,100,100,621,702,100', +'40,641,100,100,45,100,111,100,206,100,780,100,100,609,100,100,100,100', +'100,422,100,226,100,227,608,703,422,422,422,1020,643,643,422,422,1020', +'422,100,476,704,100,100,100,100,228,100,229,100,706,484,230,780,100', +'100,780,312,422,422,564,422,422,422,422,422,780,560,560,367,641,377', +'703,609,643,476,367,643,377,333,312,226,333,26,485,704,484,643,422,422', +'422,422,422,422,422,422,422,422,422,422,422,422,706,228,422,422,422', +'234,422,706,641,266,422,641,706,422,41,41,706,485,422,753,422,641,422', +'422,280,422,422,422,422,422,97,422,367,422,377,706,281,97,97,97,317', +'317,97,97,97,26,97,422,284,656,422,422,656,422,97,422,97,97,97,560,797', +'797,422,422,560,706,97,97,26,97,97,97,97,97,39,332,753,948,332,948,948', +'948,809,948,809,809,809,375,809,296,292,297,41,41,375,292,97,97,97,97', +'97,97,97,97,97,97,97,97,97,97,828,299,97,97,97,828,97,97,317,317,97', +'39,495,97,97,577,97,575,97,381,97,39,97,97,300,97,97,97,97,97,382,97', +'611,97,917,340,340,917,833,611,611,611,375,833,611,611,611,97,611,948', +'97,97,97,97,809,97,345,97,611,611,611,345,97,97,336,356,15,336,611,611', +'301,611,611,611,611,611,495,495,495,577,577,575,575,381,381,381,690', +'690,307,577,310,575,311,495,382,382,382,316,611,611,611,611,611,611', +'611,611,611,611,611,611,611,611,452,15,611,611,611,356,611,611,526,526', +'611,15,356,611,611,383,611,356,611,318,611,356,611,611,322,611,611,611', +'611,611,325,611,452,611,17,17,452,452,385,616,356,616,616,616,616,616', +'384,611,330,388,611,611,611,611,616,611,79,611,423,334,591,335,611,611', +'337,423,423,423,79,346,356,423,423,347,423,351,616,353,79,383,383,383', +'362,423,397,616,616,616,616,304,403,357,616,406,423,423,304,423,423', +'423,423,423,385,385,385,304,408,591,412,374,384,384,384,388,388,388', +'374,591,616,6,6,6,6,6,423,423,423,423,423,423,423,423,423,423,423,423', +'423,423,414,415,423,423,423,357,423,373,360,424,423,432,357,423,373', +'360,304,357,423,442,423,357,423,423,360,423,423,423,423,423,454,423', +'423,423,455,456,374,372,305,321,357,306,308,38,372,305,457,423,306,308', +'423,423,428,423,305,423,482,306,308,428,428,428,423,423,428,428,428', +'350,428,486,357,502,373,360,350,503,506,428,428,428,428,508,513,350', +'516,524,321,525,428,428,38,428,428,428,428,428,321,224,527,539,38,46', +'372,305,224,544,306,308,46,371,545,562,572,224,580,582,371,46,428,428', +'428,428,428,428,428,428,428,428,428,428,428,428,350,323,428,428,428', +'588,592,428,323,597,428,602,370,428,428,612,428,323,428,370,428,614', +'428,428,619,428,428,428,428,428,224,428,428,428,46,626,24,369,512,368', +'628,634,371,24,369,512,368,428,453,637,428,428,428,428,512,428,27,428', +'639,416,642,417,428,27,27,27,323,645,27,27,27,14,27,646,649,651,654', +'370,14,660,453,27,27,27,453,453,661,14,663,664,665,674,27,27,682,27', +'27,27,27,27,686,24,369,512,368,644,416,806,417,806,806,806,644,806,689', +'692,416,644,417,697,700,644,27,27,27,27,27,27,27,27,27,27,27,27,27,27', +'14,709,27,27,27,713,732,27,806,27,27,737,755,27,27,756,27,806,27,758', +'27,759,27,27,760,27,27,27,27,27,28,27,27,27,644,762,763,28,28,28,764', +'765,28,28,28,855,28,27,471,769,27,27,855,27,773,27,28,28,774,568,568', +'855,27,568,568,568,28,28,779,28,28,28,28,28,783,921,786,787,790,929', +'471,793,921,808,471,471,929,471,471,810,815,921,818,827,831,929,28,28', +'28,28,28,28,28,28,28,28,28,28,28,28,855,553,28,28,28,832,835,28,553', +'28,28,836,852,28,28,856,28,553,28,858,28,872,28,28,873,28,28,28,28,28', +'921,28,427,28,929,877,878,880,881,427,427,427,794,883,427,427,427,28', +'427,886,28,28,794,28,888,28,894,427,427,427,427,853,28,853,853,853,553', +'853,427,427,895,427,427,427,427,427,971,707,971,971,971,901,971,905', +'707,794,794,907,910,707,794,911,912,707,913,915,930,950,427,427,427', +'427,427,427,427,427,427,427,427,427,427,427,972,842,427,427,427,973', +'974,427,979,980,427,842,981,427,427,982,427,983,427,984,427,985,427', +'427,987,427,427,427,427,427,707,427,427,427,295,295,295,295,295,500', +'500,500,500,500,842,842,990,427,991,842,427,427,427,427,992,427,477', +'427,993,994,995,998,427,477,477,477,1011,1021,477,477,477,1015,477,1015', +'1015,1015,1015,1015,472,1022,,477,477,,,887,1015,887,887,887,,887,477', +'477,,477,477,477,477,477,1010,,1010,1010,1010,,1010,,1015,,472,,,,472', +'472,,472,472,1015,1015,,887,889,1015,889,889,889,,889,,887,,477,,56', +',1010,,,477,,56,56,56,477,477,56,56,56,675,56,675,675,675,,675,,,,889', +'56,56,56,,,,,477,477,,56,56,,56,56,56,56,56,,,,,477,,,477,675,,,,477', +',,,,675,,477,,,56,56,56,56,56,56,56,56,56,56,56,56,56,56,,,56,56,56', +',,56,,,56,,,56,56,,56,,56,,56,,56,56,,56,56,56,56,56,,56,,56,,,988,', +'988,988,988,,988,,,,,56,,,56,56,56,56,,56,418,56,,,,,56,418,418,418', +',,418,418,418,464,418,988,,,,,,,,418,418,418,,,,464,464,,,,418,418,', +'418,418,418,418,418,,,,464,,464,,464,464,,464,464,,,464,,464,,,,,,418', +'418,418,418,418,418,418,418,418,418,418,418,418,418,,,418,418,418,,', +'418,,418,418,,,418,418,,418,,418,,418,,418,418,,418,418,418,418,418', +',418,418,418,986,,986,986,986,,986,,949,,949,949,949,418,949,,418,418', +',418,,418,624,624,624,624,624,624,418,,,624,624,,,,624,986,624,624,624', +'624,624,624,624,949,,,,,624,624,624,624,624,624,624,,,624,,,,,435,624', +'624,624,624,624,624,624,624,624,624,624,624,,624,624,624,,624,624,624', +'624,624,435,435,435,435,435,435,435,435,435,435,435,,435,435,,,435,435', +',624,,,624,,,624,624,,,624,,624,435,,435,624,435,435,,435,435,435,435', +'435,624,435,,,,624,624,624,624,,624,624,624,624,,,,,624,624,,435,,435', +',,624,,624,624,624,926,926,926,926,926,926,,,,926,926,,,,926,,926,926', +'926,926,926,926,926,,,,,,926,926,926,926,926,926,926,,,926,,,,,613,926', +'926,926,926,926,926,926,926,926,926,926,926,,926,926,926,,926,926,926', +'926,926,613,613,613,613,613,613,613,613,613,613,613,,613,613,,,613,613', +',926,,,926,,,926,926,,,926,,926,613,,613,926,613,613,,613,613,613,613', +'613,926,613,,,,926,926,926,926,,926,926,926,926,,,,,926,926,,613,,,', +',926,,926,926,926,123,123,123,123,123,123,,,,123,123,,,,123,,123,123', +'123,123,123,123,123,,,,,,123,123,123,123,123,123,123,,,123,,,,,411,123', +'123,123,123,123,123,123,123,123,123,123,123,,123,123,123,,123,123,123', +'123,123,411,411,411,411,411,411,411,411,411,411,411,,411,411,,,411,411', +',123,,,123,,,123,123,,,123,,123,411,,411,123,411,411,,411,411,411,411', +'411,123,411,,,,123,123,123,123,,123,123,123,123,,,,,123,123,,411,,,', +',123,,123,123,123,208,208,208,208,208,208,,,,208,208,,,,208,,208,208', +'208,208,208,208,208,,,,,,208,208,208,208,208,208,208,,,208,,,,,,208', +'208,208,208,208,208,208,208,208,208,208,208,,208,208,208,,208,208,208', +'208,208,430,430,430,430,430,430,430,430,430,430,430,,430,430,,,430,430', +',208,,,208,,,208,208,,,208,,208,430,,430,208,430,430,,430,430,430,430', +'430,208,430,,,,208,208,208,208,,208,208,208,208,,,,,208,208,,430,,,', +',208,,208,208,208,785,785,785,785,785,785,,,,785,785,,,,785,,785,785', +'785,785,785,785,785,,,,,,785,785,785,785,785,785,785,,,785,,,,,,785', +'785,785,785,785,785,785,785,785,785,785,785,,785,785,785,,785,785,785', +'785,785,734,734,734,734,734,734,734,734,734,734,734,,734,734,,,734,734', +',785,,,785,,,785,785,,,785,,785,734,,734,785,734,734,,734,734,734,734', +'734,785,734,,,,785,785,785,785,,785,785,785,785,,,,,785,785,,734,,,', +',785,,785,785,785,623,623,623,623,623,623,,,,623,623,,,,623,,623,623', +'623,623,623,623,623,,,,,,623,623,623,623,623,623,623,,,623,,,,,,623', +'623,623,623,623,623,623,623,623,623,623,623,,623,623,623,,623,623,623', +'623,623,739,739,739,739,739,739,739,739,739,739,739,,739,739,,,739,739', +',623,,,623,,,623,623,,,623,,623,739,,739,623,739,739,,739,739,739,739', +'739,623,739,,,,623,623,623,623,,623,623,623,623,,,,,623,623,,739,,,', +',623,,623,623,623,538,538,538,538,538,538,,,,538,538,,,,538,,538,538', +'538,538,538,538,538,,,,,,538,538,538,538,538,538,538,,,538,,,,,,538', +'538,538,538,538,538,538,538,538,538,538,538,,538,538,538,,538,538,538', +'538,538,741,741,741,741,741,741,741,741,741,741,741,,741,741,,,741,741', +',538,,,538,,,538,538,,,538,,538,741,,741,538,741,741,,741,741,741,741', +'741,538,741,,,,538,538,538,538,,538,538,538,538,,,,,538,538,,741,,,', +',538,,538,538,538,933,933,933,933,933,933,,,,933,933,,,,933,,933,933', +'933,933,933,933,933,,,,,,933,933,933,933,933,933,933,,,933,,,,,,933', +'933,933,933,933,933,933,933,933,933,933,933,,933,933,933,,933,933,933', +'933,933,744,744,744,744,744,744,744,744,744,744,744,,744,744,,,744,744', +',933,,,933,,,933,933,,,933,,933,744,,744,933,744,744,,744,744,744,744', +'744,933,744,,,,933,933,933,933,,933,933,933,933,,,,,933,933,,744,,,', +',933,,933,933,933,934,934,934,934,934,934,,,,934,934,,,,934,,934,934', +'934,934,934,934,934,,,,,,934,934,934,934,934,934,934,,,934,,,,,,934', +'934,934,934,934,934,934,934,934,934,934,934,,934,934,934,,934,934,934', +'934,934,746,746,746,746,746,746,746,746,746,746,746,,746,746,,,746,746', +',934,,,934,,,934,934,,,934,,934,746,,746,934,746,746,,746,746,746,746', +'746,934,746,,,,934,934,934,934,,934,934,934,934,,,,,934,934,,746,,,', +',934,,934,934,934,561,561,561,561,561,561,,,,561,561,,,,561,,561,561', +'561,561,561,561,561,,,,,,561,561,561,561,561,561,561,,,561,,,,,,561', +'561,561,561,561,561,561,561,561,561,561,561,,561,561,561,,561,561,561', +'561,561,748,748,748,748,748,748,748,748,748,748,748,,748,748,,,748,748', +',561,,,561,,,561,561,,,561,,561,748,,748,561,748,748,,748,748,748,748', +'748,561,748,,,,561,561,561,561,,561,561,561,561,,,,,561,561,,748,,,', +',561,,561,561,561,618,618,618,618,618,618,,,,618,618,,,,618,,618,618', +'618,618,618,618,618,,,,,,618,618,618,618,618,618,618,,,618,,,,,,618', +'618,618,618,618,618,618,618,618,618,618,618,,618,618,618,,618,618,618', +'618,618,21,21,21,21,21,21,21,21,21,21,21,,21,21,,,21,21,,618,,,618,', +',618,618,,,618,,618,21,,21,618,21,21,,21,21,21,21,21,618,21,,,,618,618', +'618,618,,618,618,618,618,,,,,618,618,,21,,,,,618,,618,618,618,0,0,0', +'0,0,0,,,,0,0,,,,0,,0,0,0,0,0,0,0,,,,,,0,0,0,0,0,0,0,,,0,,,,,,0,0,0,0', +'0,0,0,0,0,0,0,0,,0,0,0,,0,0,0,0,0,278,278,278,278,278,278,278,278,278', +'278,278,,278,278,,,278,278,,0,,,0,,,0,0,,,0,,0,278,,278,0,278,278,,278', +'278,278,278,278,0,278,,,,0,0,0,0,,0,0,0,0,,,,,0,0,,278,,,,,0,,0,0,0', +'862,862,862,862,862,862,,,,862,862,,,,862,,862,862,862,862,862,862,862', +',,,,,862,862,862,862,862,862,862,,,862,,,,,,862,862,862,862,862,862', +'862,862,862,862,862,862,,862,862,862,,862,862,862,862,862,648,648,648', +'648,648,648,648,648,648,648,648,,648,648,,,648,648,,862,,,862,,,862', +'862,,,862,,862,648,,648,862,648,648,,648,648,648,648,648,862,648,,,', +'862,862,862,862,,862,862,862,862,,,,,862,862,,648,,,,,862,,862,862,862', +'959,959,959,959,959,959,,,,959,959,,,,959,,959,959,959,959,959,959,959', +',,,,,959,959,959,959,959,959,959,,,959,,,,,,959,959,959,959,959,959', +'959,959,959,959,959,959,,959,959,959,,959,959,959,959,959,838,838,838', +'838,838,838,838,838,838,838,838,,838,838,,,838,838,,959,,,959,,,959', +'959,,,959,,959,838,,838,959,838,838,,838,838,838,838,838,959,838,,,', +'959,959,959,959,,959,959,959,959,,,,,959,959,,838,,,,,959,,959,959,959', +'541,541,541,541,541,541,,,,541,541,,,,541,,541,541,541,541,541,541,541', +',,,,,541,541,541,541,541,541,541,,,541,,,,,,541,541,541,541,541,541', +'541,541,541,541,541,541,,541,541,541,,541,541,541,541,541,841,841,841', +'841,841,841,841,841,841,841,841,,841,841,,,841,841,,541,,,541,,,541', +'541,,,541,,541,841,,841,541,841,841,,841,841,841,841,841,541,841,,,', +'541,541,541,541,,541,541,541,541,,,,,541,541,,841,,,,,541,,541,541,541', +'501,501,501,501,501,501,,,,501,501,,,,501,,501,501,501,501,501,501,501', +',,,,,501,501,501,501,501,501,501,,,501,,,,,,501,501,501,501,501,501', +'501,501,501,501,501,501,,501,501,501,,501,501,501,501,501,475,475,475', +'475,475,475,475,475,475,475,475,,475,475,,,475,475,,501,,,501,,,501', +'501,,,501,,501,475,,475,501,475,475,,475,475,475,475,475,501,475,,,', +'501,501,501,501,,501,501,501,501,,,,,501,501,475,475,,,,,501,,501,501', +'501,951,951,951,951,951,951,,,,951,951,,,,951,,951,951,951,951,951,951', +'951,,,,,,951,951,951,951,951,951,951,,,951,,,,,,951,951,951,951,951', +'951,951,951,951,951,951,951,,951,951,951,,951,951,951,951,951,522,522', +'522,522,522,522,522,522,522,522,522,,522,522,,,522,522,,951,,,951,,', +'951,951,,,951,,951,522,,522,951,522,522,,522,522,522,522,522,951,522', +',,,951,951,951,951,,951,951,951,951,,,,,951,951,,522,,,,,951,,951,951', +'951,823,823,823,823,823,823,,,,823,823,,,,823,,823,823,823,823,823,823', +'823,,,,,,823,823,823,823,823,823,823,,,823,,,,,,823,823,823,823,823', +'823,823,823,823,823,823,823,,823,823,823,,823,823,823,823,823,473,473', +'473,473,473,473,473,,,473,473,,,,,,473,473,,823,,,823,,,823,823,,,823', +',823,473,,473,823,473,473,,473,473,473,473,473,823,473,,,,823,823,823', +'823,,823,823,823,823,,,,,823,823,,,,,,,823,,823,823,823,957,957,957', +'957,957,957,,,,957,957,,,,957,,957,957,957,957,957,957,957,,,,,,957', +'957,957,957,957,957,957,,,957,,,,,,957,957,957,957,957,957,957,957,957', +'957,957,957,,957,957,957,,957,957,957,957,957,469,469,469,469,469,469', +'469,,,469,469,,,,,,469,469,,957,,,957,,,957,957,,,957,,957,469,,469', +'957,469,469,,469,469,469,469,469,957,469,,,,957,957,957,957,,957,957', +'957,957,,,,,957,957,,,,,,,957,,957,957,957,33,33,33,33,33,33,,,,33,33', +',,,33,,33,33,33,33,33,33,33,,,,,,33,33,33,33,33,33,33,,,33,,,,,,33,33', +'33,33,33,33,33,33,33,33,33,33,,33,33,33,,33,33,33,33,33,470,470,470', +'470,470,470,470,,,470,470,,,,,,470,470,,33,,,33,,,33,33,,,33,,33,470', +',470,33,470,470,,470,470,470,470,470,33,470,,,,33,33,33,33,,33,33,33', +'33,,,,,33,33,,,,,,,33,,33,33,33,710,710,710,710,710,710,,,,710,710,', +',,710,,710,710,710,710,710,710,710,,,,,,710,710,710,710,710,710,710', +',,710,,,,,,710,710,710,710,710,710,710,710,710,710,710,710,,710,710', +'710,,710,710,710,710,710,474,474,474,474,474,474,474,474,,474,474,,', +',,,474,474,,710,,,710,,,710,710,,,710,,710,474,,474,710,474,474,,474', +'474,474,474,474,710,474,,,,710,710,710,710,,710,710,710,710,,,,,710', +'710,,,,,,,710,,710,710,710,298,298,298,298,298,298,,,,298,298,,,,298', +',298,298,298,298,298,298,298,,,,,,298,298,298,298,298,298,298,,,298', +',,,,,298,298,298,298,298,298,298,298,298,298,298,298,,298,298,298,,298', +'298,298,298,298,465,,,,,,,,,,,,,,,,465,465,,298,,,298,,,298,298,,,298', +',298,465,,465,298,465,465,,465,465,,,465,298,465,,,,298,298,298,298', +',298,298,298,298,,,,,298,298,,,,,,,298,,298,298,298,829,829,829,829', +'829,829,,,,829,829,,,,829,,829,829,829,829,829,829,829,,,,,,829,829', +'829,829,829,829,829,,,829,,,,,,829,829,829,829,829,829,829,829,829,829', +'829,829,,829,829,829,,829,829,829,829,829,466,466,466,466,466,466,466', +',,466,466,,,,,,466,466,,829,,,829,,,829,829,,,829,,829,466,,466,829', +'466,466,,466,466,466,466,466,829,466,,,,829,829,829,829,,829,829,829', +'829,,,,,829,829,,,,,,,829,,829,829,829,772,772,772,772,772,772,,,,772', +'772,,,,772,,772,772,772,772,772,772,772,,,,,,772,772,772,772,772,772', +'772,,,772,,,,,,772,772,772,772,772,772,772,772,772,772,772,772,,772', +'772,772,,772,772,772,772,772,467,467,467,467,467,467,467,,,467,467,', +',,,,467,467,,772,,,772,,,772,772,,,772,,772,467,,467,772,467,467,,467', +'467,467,467,467,772,467,,,,772,772,772,772,,772,772,772,772,,,,,772', +'772,,,,,,,772,,772,772,772,714,714,714,714,714,714,,,,714,714,,,,714', +',714,714,714,714,714,714,714,,,,,,714,714,714,714,714,714,714,,,714', +',,,,,714,714,714,714,714,714,714,714,714,714,714,714,,714,714,714,,714', +'714,714,714,714,451,451,451,451,451,451,451,451,451,451,451,,451,451', +',,451,451,,714,,,714,,,714,714,,,714,,714,451,,451,714,451,451,,451', +'451,451,451,451,714,451,,,,714,714,714,714,,714,714,714,714,,,,,714', +'714,,,,,,,714,,714,714,714,724,724,724,724,724,724,,,,724,724,,,,724', +',724,724,724,724,724,724,724,,,,,,724,724,724,724,724,724,724,,,724', +',,,,,724,724,724,724,724,724,724,724,724,724,724,724,,724,724,724,,724', +'724,724,724,724,468,468,468,468,468,468,468,,,468,468,,,,,,468,468,', +'724,,,724,,,724,724,,,724,,724,468,,468,724,468,468,,468,468,468,468', +'468,724,468,,,,724,724,724,724,,724,724,724,724,,,,,724,724,,,,,,,724', +',724,724,724,233,233,233,233,233,233,,,,233,233,,,,233,,233,233,233', +'233,233,233,233,,,,,,233,233,233,233,233,233,233,,,233,,,,,,233,233', +'233,233,233,233,233,233,233,233,233,233,,233,233,233,,233,233,233,233', +'233,461,461,461,461,461,461,461,,,461,461,,,,,,461,461,,233,,,233,,', +'233,233,,,233,,233,461,,461,233,461,461,,461,461,461,461,461,233,461', +',,,233,233,233,233,,233,233,233,233,,,,,233,233,,,,,,,233,,233,233,233', +'328,328,328,328,328,328,,,,328,328,,,,328,,328,328,328,328,328,328,328', +',,,,,328,328,328,328,328,328,328,,,328,,,,,,328,328,328,328,328,328', +'328,328,328,328,328,328,,328,328,328,,328,328,328,328,328,462,,,,,,', +',,,,,,,,,462,462,,328,,,328,,,328,328,,,328,,328,462,,462,328,462,462', +',462,462,,,462,328,462,,,,328,328,328,328,,328,328,328,328,,,,,328,328', +',,,,,,328,,328,328,328,819,819,819,819,819,819,,,,819,819,,,,819,,819', +'819,819,819,819,819,819,,,,,,819,819,819,819,819,819,819,,,819,,,,,', +'819,819,819,819,819,819,819,819,819,819,819,819,,819,819,819,,819,819', +'819,819,819,450,450,450,450,450,450,450,450,450,450,450,,450,450,,,450', +'450,,819,,,819,,,819,819,,,819,,819,450,,450,819,450,450,,450,450,450', +'450,450,819,450,,,,819,819,819,819,,819,819,819,819,,,,,819,819,,,,', +',,819,,819,819,819,820,820,820,820,820,820,,,,820,820,,,,820,,820,820', +'820,820,820,820,820,,,,,,820,820,820,820,820,820,820,,,820,,,,,,820', +'820,820,820,820,820,820,820,820,820,820,820,,820,820,820,,820,820,820', +'820,820,463,,,,,,,,,,,,,,,,463,463,,820,,,820,,,820,820,,,820,,820,463', +',463,820,463,463,,463,463,,,463,820,463,,,,820,820,820,820,,820,820', +'820,820,,,,,820,820,,,,,,,820,,820,820,820,303,303,303,303,303,303,', +',,303,303,,,,303,,303,303,303,303,303,303,303,,,,,,303,303,303,303,303', +'303,303,,,303,,,,,,303,303,303,303,303,303,303,303,303,303,303,303,', +'303,303,303,,303,303,303,303,303,460,,,,,,,,,,,,,,,,460,460,,303,,,303', +',,303,303,,,303,,303,460,,,303,460,460,,460,460,,,,303,,,,,303,303,303', +'303,,303,303,303,303,,,,,303,303,,,,238,238,238,303,238,303,303,303', +'238,238,,,,238,,238,238,238,238,238,238,238,,,,,,238,238,238,238,238', +'238,238,,,238,,,,,,,238,,,238,238,238,238,238,238,238,238,,238,238,238', +',238,238,238,238,238,458,,,,,,,,,,,,,,,,458,458,,238,,,238,,,238,238', +',,238,,,458,,458,238,458,458,,458,458,,,,238,,,,,238,238,238,238,,238', +'238,238,238,,,,,238,238,,,,647,647,647,238,647,238,238,238,647,647,', +',,647,,647,647,647,647,647,647,647,,,,,,647,647,647,647,647,647,647', +',,647,,,,,,,647,,459,647,647,647,647,647,647,647,647,,647,647,647,,647', +'647,459,459,647,,,,,,,,,,,,,,459,,459,,459,459,647,459,459,647,,,647', +'647,,,647,,,,,,,,,,,,,,,,,,,,647,647,647,647,,647,647,647,647,,,,,647', +'647,,,,237,237,237,647,237,647,647,647,237,237,,,,237,,237,237,237,237', +'237,237,237,,,,,,237,237,237,237,237,237,237,,,237,,,,,,,237,,,237,237', +'237,237,237,237,237,237,,237,237,237,,237,237,237,237,237,,,,,,,,,,', +',,,,,,,,,237,,,237,,,237,237,,,237,,,,,,237,,,,,,,,,237,,,,,237,237', +'237,237,,237,237,237,237,,,,,237,237,,,,804,804,804,237,804,237,237', +'237,804,804,,,,804,,804,804,804,804,804,804,804,,,,,,804,804,804,804', +'804,804,804,,,804,,,,,,,804,,,804,804,804,804,804,804,804,804,,804,804', +'804,,804,804,804,804,804,,,,,,,,,,,,,,,,,,,,804,,,804,,,804,804,,,804', +',,,,,804,,,,,,,,,804,,,,,804,804,804,804,,804,804,804,804,,,,,804,804', +',,,236,236,236,804,236,804,804,804,236,236,,,,236,,236,236,236,236,236', +'236,236,,,,,,236,236,236,236,236,236,236,,,236,,,,,,,236,,,236,236,236', +'236,236,236,236,236,,236,236,236,,236,236,236,236,236,,,,,,,,,,,,,,', +',,,,,236,,,236,,,236,236,,,236,,,,,,236,,,,,,,,,236,,,,,236,236,236', +'236,,236,236,236,236,,,,,236,236,,,,,,,236,,236,236,236,294,294,294', +'294,294,,,,294,294,,,,294,,294,294,294,294,294,294,294,,,,,,294,294', +'294,294,294,294,294,,,294,,,,,,294,294,,294,294,294,294,294,294,294', +'294,294,,294,294,294,,294,294,294,294,294,,,,,,,,,,,,,,,,,,,,294,,,294', +',,294,294,,,294,,294,,,,294,,,,,,,,,294,,,,,294,294,294,294,,294,294', +'294,294,,,,,294,294,,,,235,235,235,294,235,294,294,294,235,235,,,,235', +',235,235,235,235,235,235,235,,,,,,235,235,235,235,235,235,235,,,235', +',,,,,,235,,,235,235,235,235,235,235,235,235,,235,235,235,,235,235,235', +'235,235,,,,,,,,,,,,,,,,,,,,235,,,235,,,235,235,,,235,,,,,,235,,,,,,', +',,235,,,,,235,235,235,235,,235,235,235,235,,,,,235,235,,,,817,817,817', +'235,817,235,235,235,817,817,,,,817,,817,817,817,817,817,817,817,,,,', +',817,817,817,817,817,817,817,,,817,,,,,,,817,,,817,817,817,817,817,817', +'817,817,,817,817,817,,817,817,817,817,817,,,,,,,,,,,,,,,,,,,,817,,,817', +',,817,817,,,817,,,,,,817,,,,,,,,,817,,,,,817,817,817,817,,817,817,817', +'817,,,,,817,817,,,,822,822,822,817,822,817,817,817,822,822,,,,822,,822', +'822,822,822,822,822,822,,,,,,822,822,822,822,822,822,822,,,822,,,,,', +',822,,,822,822,822,822,822,822,822,822,,822,822,822,,822,822,822,822', +'822,,,,,,,,,,,,,,,,,,,,822,,,822,,,822,822,,,822,,822,,,,822,,,,,,,', +',822,,,,,822,822,822,822,,822,822,822,822,,,,,822,822,,,,253,253,253', +'822,253,822,822,822,253,253,,,,253,,253,253,253,253,253,253,253,,,,', +',253,253,253,253,253,253,253,,,253,,,,,,,253,,,253,253,253,253,253,253', +'253,253,,253,253,253,,253,253,253,253,253,,,,,,,,,,,,,,,,,,,,253,,,253', +',,253,253,,,253,,,,,,253,,,,,,,,,253,,,,,253,253,253,253,,253,253,253', +'253,,,,,253,253,,,,29,29,29,253,29,253,253,253,29,29,,,,29,,29,29,29', +'29,29,29,29,,,,,,29,29,29,29,29,29,29,,,29,,,,,,,29,,,29,29,29,29,29', +'29,29,29,29,29,29,29,,29,29,29,29,29,,,,,,,,,,,,,,,,,,,,29,,,29,,,29', +'29,,,29,,29,,29,,29,,,29,,,,,,29,,,,,29,29,29,29,,29,29,29,29,,,,,29', +'29,,,,30,30,30,29,30,29,29,29,30,30,,,,30,,30,30,30,30,30,30,30,,,,', +',30,30,30,30,30,30,30,,,30,,,,,,,30,,,30,30,30,30,30,30,30,30,30,30', +'30,30,,30,30,30,30,30,,,,,,,,,,,,,,,,,,,,30,,,30,,,30,30,,,30,,30,,30', +',30,,,30,,,,,,30,,,,,30,30,30,30,,30,30,30,30,,,,,30,30,,,,31,31,31', +'30,31,30,30,30,31,31,,,,31,,31,31,31,31,31,31,31,,,,,,31,31,31,31,31', +'31,31,,,31,,,,,,,31,,,31,31,31,31,31,31,31,31,31,31,31,31,,31,31,31', +'31,31,,,,,,,,,,,,,,,,,,,,31,,,31,,,31,31,,,31,,31,,31,,31,,,31,,,,,', +'31,,,,,31,31,31,31,,31,31,31,31,,,,,31,31,,,,302,302,302,31,302,31,31', +'31,302,302,,,,302,,302,302,302,302,302,302,302,,,,,,302,302,302,302', +'302,302,302,,,302,,,,,,,302,,,302,302,302,302,302,302,302,302,,302,302', +'302,,302,302,,,302,,,,,,,,,,,,,,,,,,,,302,,,302,,,302,302,,,302,,,1005', +',1005,1005,1005,1005,1005,,,,,,,,,1005,,302,302,302,302,,302,302,302', +'302,,,,,302,302,,,,302,,1005,302,,302,302,302,20,20,20,,20,1005,1005', +',20,20,1005,,,20,,20,20,20,20,20,20,20,,,,,,20,20,20,20,20,20,20,,,20', +',,,,,,20,,,20,20,20,20,20,20,20,20,,20,20,20,,20,20,20,20,20,,,,,,,', +',,,,,,,,,,,,20,,,20,,,20,20,,,20,,,,,,20,,,,,,,,,20,,,,,20,20,20,20', +',20,20,20,20,,,,,20,20,,,,839,839,839,20,839,20,20,20,839,839,,,,839', +',839,839,839,839,839,839,839,,,,,,839,839,839,839,839,839,839,,,839', +',,,,,,839,,,839,839,839,839,839,839,839,839,839,839,839,839,,839,839', +'839,839,839,,,,,,,,,,,,,,,,,,,,839,,,839,,,839,839,,,839,,,,839,,839', +',,839,,,,,,839,,,,,839,839,839,839,,839,839,839,839,,,,,839,839,,,,840', +'840,840,839,840,839,839,839,840,840,,,,840,,840,840,840,840,840,840', +'840,,,,,,840,840,840,840,840,840,840,,,840,,,,,,,840,,,840,840,840,840', +'840,840,840,840,,840,840,840,,840,840,840,840,840,,,,,,,,,,,,,,,,,,', +',840,,,840,,,840,840,,,840,,,,,,840,,,,,,,,,840,,,,,840,840,840,840', +',840,840,840,840,,,,,840,840,,,,636,636,636,840,636,840,840,840,636', +'636,,,,636,,636,636,636,636,636,636,636,,,,,,636,636,636,636,636,636', +'636,,,636,,,,,,,636,,,636,636,636,636,636,636,636,636,,636,636,636,', +'636,636,,,636,,,,,,,,,,,,,,,,,,,,636,,,636,,,636,636,,,636,,,,,,,,,', +',,,,,,,,,,636,636,636,636,,636,636,636,636,,,,,636,636,,,,232,232,232', +'636,232,636,636,636,232,232,,,,232,,232,232,232,232,232,232,232,,,,', +',232,232,232,232,232,232,232,,,232,,,,,,,232,,,232,232,232,232,232,232', +'232,232,,232,232,232,,232,232,232,232,232,,,,,,,,,,,,,,,,,,,,232,,,232', +',,232,232,,,232,,,,,,232,,,,,,,,,232,,,,,232,232,232,232,,232,232,232', +'232,,,,,232,232,,,,632,632,632,232,632,232,232,232,632,632,,,,632,,632', +'632,632,632,632,632,632,,,,,,632,632,632,632,632,632,632,,,632,,,,,', +',632,,,632,632,632,632,632,632,632,632,,632,632,632,,632,632,632,632', +'632,,,,,,,,,,,,,,,,,,,,632,,,632,,,632,632,,,632,,,,,,632,,,,,,,,,632', +',,,,632,632,632,632,,632,632,632,632,,,,,632,632,,,,629,629,629,632', +'629,632,632,632,629,629,,,,629,,629,629,629,629,629,629,629,,,,,,629', +'629,629,629,629,629,629,,,629,,,,,,,629,,,629,629,629,629,629,629,629', +'629,,629,629,629,,629,629,629,629,629,,,,,,,,,,,,,,,,,,,,629,,,629,', +',629,629,,,629,,,,,,629,,,,,,,,,629,,,,,629,629,629,629,,629,629,629', +'629,,,,,629,629,,,,854,854,854,629,854,629,629,629,854,854,,,,854,,854', +'854,854,854,854,854,854,,,,,,854,854,854,854,854,854,854,,,854,,,,,', +',854,,,854,854,854,854,854,854,854,854,,854,854,854,,854,854,,,854,', +',,,,,,,,,,,,,,,,,,854,,,854,,,854,854,,,854,,,,,,,,,,,,,,,,,,,,854,854', +'854,854,,854,854,854,854,,,,,854,854,,,,866,866,866,854,866,854,854', +'854,866,866,,,,866,,866,866,866,866,866,866,866,,,,,,866,866,866,866', +'866,866,866,,,866,,,,,,,866,,,866,866,866,866,866,866,866,866,,866,866', +'866,,866,866,,,866,,,,,,,,,,,,,,,,,,,,866,,,866,,,866,866,,,866,,,,', +',,,,,,,,,,,,,,,866,866,866,866,,866,866,866,866,,,,,866,866,,,,34,34', +'34,866,34,866,866,866,34,34,,,,34,,34,34,34,34,34,34,34,,,,,,34,34,34', +'34,34,34,34,,,34,,,,,,,34,,,34,34,34,34,34,34,34,34,,34,34,34,,34,34', +',,34,,,,,,,,,,,,,,,,,,,,34,,,34,,,34,34,,,34,,34,,,,,,,,,,,,,,,,,,34', +'34,34,34,,34,34,34,34,,,,,34,34,,,,35,35,35,34,35,34,34,34,35,35,,,', +'35,,35,35,35,35,35,35,35,,,,,,35,35,35,35,35,35,35,,,35,,,,,,,35,,,35', +'35,35,35,35,35,35,35,,35,35,35,,35,35,,,35,,,,,,,,,,,,,,,,,,,,35,,,35', +',,35,35,,,35,,,967,,967,967,967,967,967,,,,,,,,,967,,35,35,35,35,,35', +'35,35,35,,,,,35,35,,,,35,,967,35,,35,35,35,605,605,605,,605,967,967', +',605,605,967,,,605,,605,605,605,605,605,605,605,,,,,,605,605,605,605', +'605,605,605,,,605,,,,,,,605,,,605,605,605,605,605,605,605,605,,605,605', +'605,,605,605,605,605,605,,,,,,,,,,,,,,,,,,,,605,,,605,,,605,605,,,605', +',,,,,605,,,,,,,,,605,,,,,605,605,605,605,,605,605,605,605,,,,,605,605', +',,,,,,605,,605,605,605,5,5,5,5,5,,,,5,5,,,,5,,5,5,5,5,5,5,5,,,,,,5,5', +'5,5,5,5,5,,,5,,,,,,5,5,5,5,5,5,5,5,5,5,5,5,,5,5,5,,5,5,5,5,5,,,,,,,', +',,,,,,,,,,,,5,,,5,,,5,5,,,5,,5,,,,5,,,,,,,,,5,,,,,5,5,5,5,,5,5,5,5,', +',,,5,5,,,,604,604,604,5,604,5,5,5,604,604,,,,604,,604,604,604,604,604', +'604,604,,,,,,604,604,604,604,604,604,604,,,604,,,,,,,604,,,604,604,604', +'604,604,604,604,604,,604,604,604,,604,604,604,604,604,,,,,,,,,,,,,,', +',,,,,604,,,604,,,604,604,,,604,,,,,,604,,,,,,,,,604,,,,,604,604,604', +'604,,604,604,604,604,,,,,604,604,,,,601,601,601,604,601,604,604,604', +'601,601,,,,601,,601,601,601,601,601,601,601,,,,,,601,601,601,601,601', +'601,601,,,601,,,,,,,601,,,601,601,601,601,601,601,601,601,,601,601,601', +',601,601,601,601,601,,,,,,,,,,,,,,,,,,,,601,,,601,,,601,601,,,601,,', +',,,601,,,,,,,,,601,,,,,601,601,601,601,,601,601,601,601,,,,,601,601', +',,,600,600,600,601,600,601,601,601,600,600,,,,600,,600,600,600,600,600', +'600,600,,,,,,600,600,600,600,600,600,600,,,600,,,,,,,600,,,600,600,600', +'600,600,600,600,600,,600,600,600,,600,600,600,600,600,,,,,,,,,,,,,,', +',,,,,600,,,600,,,600,600,,,600,,,,,,600,,,,,,,,,600,,,,,600,600,600', +'600,,600,600,600,600,,,,,600,600,,,,596,596,596,600,596,600,600,600', +'596,596,,,,596,,596,596,596,596,596,596,596,,,,,,596,596,596,596,596', +'596,596,,,596,,,,,,,596,,,596,596,596,596,596,596,596,596,,596,596,596', +',596,596,596,596,596,,,,,,,,,,,,,,,,,,,,596,,,596,,,596,596,,,596,,', +',,,596,,,,,,,,,596,,,,,596,596,596,596,,596,596,596,596,,,,,596,596', +',,,319,319,319,596,319,596,596,596,319,319,,,,319,,319,319,319,319,319', +'319,319,,,,,,319,319,319,319,319,319,319,,,319,,,,,,,319,,,319,319,319', +'319,319,319,319,319,,319,319,319,,319,319,,,319,,,,,,,,,,,,,,,,,,,,319', +',,319,,,319,319,,,319,,,,,,,,,,,,,,,,,,,,319,319,319,319,,319,319,319', +'319,,,,,319,319,,,,595,595,595,319,595,319,319,319,595,595,,,,595,,595', +'595,595,595,595,595,595,,,,,,595,595,595,595,595,595,595,,,595,,,,,', +',595,,,595,595,595,595,595,595,595,595,,595,595,595,,595,595,595,595', +'595,,,,,,,,,,,,,,,,,,,,595,,,595,,,595,595,,,595,,,,,,595,,,,,,,,,595', +',,,,595,595,595,595,,595,595,595,595,,,,,595,595,,,,594,594,594,595', +'594,595,595,595,594,594,,,,594,,594,594,594,594,594,594,594,,,,,,594', +'594,594,594,594,594,594,,,594,,,,,,,594,,,594,594,594,594,594,594,594', +'594,594,594,594,594,,594,594,594,594,594,,,,,,,,,,,,,,,,,,,,594,,,594', +',,594,594,,,594,,,,594,,594,,,594,,,,,,594,,,,,594,594,594,594,,594', +'594,594,594,,,,,594,594,,,,593,593,593,594,593,594,594,594,593,593,', +',,593,,593,593,593,593,593,593,593,,,,,,593,593,593,593,593,593,593', +',,593,,,,,,,593,,,593,593,593,593,593,593,593,593,593,593,593,593,,593', +'593,593,593,593,,,,,,,,,,,,,,,,,,,,593,,,593,,,593,593,,,593,,593,,593', +',593,,,593,,,,,,593,,,,,593,593,593,593,,593,593,593,593,,,,,593,593', +',,,221,221,221,593,221,593,593,593,221,221,,,,221,,221,221,221,221,221', +'221,221,,,,,,221,221,221,221,221,221,221,,,221,,,,,,,221,,,221,221,221', +'221,221,221,221,221,,221,221,221,,221,221,221,221,221,,,,,,,,,,,,,,', +',,,,,221,,,221,,,221,221,,,221,,,,,,221,,,,,,,,,221,,,,,221,221,221', +'221,,221,221,221,221,,,,,221,221,221,,,590,590,590,221,590,221,221,221', +'590,590,,,,590,,590,590,590,590,590,590,590,,,,,,590,590,590,590,590', +'590,590,,,590,,,,,,,590,,,590,590,590,590,590,590,590,590,,590,590,590', +',590,590,590,590,590,,,,,,,,,,,,,,,,,,,,590,,,590,,,590,590,,,590,,', +',,,590,,,,,,,,,590,,,,,590,590,590,590,,590,590,590,590,,,,,590,590', +',,,327,327,327,590,327,590,590,590,327,327,,,,327,,327,327,327,327,327', +'327,327,,,,,,327,327,327,327,327,327,327,,,327,,,,,,,327,,,327,327,327', +'327,327,327,327,327,,327,327,327,,327,327,327,327,327,,,,,,,,,,,,,,', +',,,,,327,,,327,327,,327,327,,,327,,,,,,327,,,,,,,,,327,,,,,327,327,327', +'327,,327,327,327,327,,,,,327,327,,,,329,329,329,327,329,327,327,327', +'329,329,,,,329,,329,329,329,329,329,329,329,,,,,,329,329,329,329,329', +'329,329,,,329,,,,,,,329,,,329,329,329,329,329,329,329,329,,329,329,329', +',329,329,329,329,329,,,,,,,,,,,,,,,,,,,,329,,,329,,,329,329,,,329,,', +',,,329,,,,,,,,,329,,,,,329,329,329,329,,329,329,329,329,,,,,329,329', +',,,589,589,589,329,589,329,329,329,589,589,,,,589,,589,589,589,589,589', +'589,589,,,,,,589,589,589,589,589,589,589,,,589,,,,,,,589,,,589,589,589', +'589,589,589,589,589,,589,589,589,,589,589,589,589,589,,,,,,,,,,,,,,', +',,,,,589,,,589,,,589,589,,,589,,589,,,,589,,,,,,,,,589,,,,,589,589,589', +'589,,589,589,589,589,,,,,589,589,,,,220,220,220,589,220,589,589,589', +'220,220,,,,220,,220,220,220,220,220,220,220,,,,,,220,220,220,220,220', +'220,220,,,220,,,,,,,220,,,220,220,220,220,220,220,220,220,,220,220,220', +',220,220,220,220,220,,,,,,,,,,,,,,,,,,,,220,,,220,,,220,220,,,220,,', +',,,220,,,,,,,,,220,,,,,220,220,220,220,,220,220,220,220,,,,,220,220', +',,,219,219,219,220,219,220,220,220,219,219,,,,219,,219,219,219,219,219', +'219,219,,,,,,219,219,219,219,219,219,219,,,219,,,,,,,219,,,219,219,219', +'219,219,219,219,219,,219,219,219,,219,219,219,219,219,,,,,,,,,,,,,,', +',,,,,219,,,219,,,219,219,,,219,,,,,,219,,,,,,,,,219,,,,,219,219,219', +'219,,219,219,219,219,,,,,219,219,,,,218,218,218,219,218,219,219,219', +'218,218,,,,218,,218,218,218,218,218,218,218,,,,,,218,218,218,218,218', +'218,218,,,218,,,,,,,218,,,218,218,218,218,218,218,218,218,,218,218,218', +',218,218,218,218,218,,,,,,,,,,,,,,,,,,,,218,,,218,,,218,218,,,218,,', +',,,218,,,,,,,,,218,,,,,218,218,218,218,,218,218,218,218,,,,,218,218', +',,,217,217,217,218,217,218,218,218,217,217,,,,217,,217,217,217,217,217', +'217,217,,,,,,217,217,217,217,217,217,217,,,217,,,,,,,217,,,217,217,217', +'217,217,217,217,217,,217,217,217,,217,217,217,217,217,,,,,,,,,,,,,,', +',,,,,217,,,217,,,217,217,,,217,,217,,,,217,,,,,,,,,217,,,,,217,217,217', +'217,,217,217,217,217,,,,,217,217,,,,216,216,216,217,216,217,217,217', +'216,216,,,,216,,216,216,216,216,216,216,216,,,,,,216,216,216,216,216', +'216,216,,,216,,,,,,,216,,,216,216,216,216,216,216,216,216,,216,216,216', +',216,216,216,216,216,,,,,,,,,,,,,,,,,,,,216,,,216,,,216,216,,,216,,', +',,,216,,,,,,,,,216,,,,,216,216,216,216,,216,216,216,216,,,,,216,216', +',,,557,557,557,216,557,216,216,216,557,557,,,,557,,557,557,557,557,557', +'557,557,,,,,,557,557,557,557,557,557,557,,,557,,,,,,,557,,,557,557,557', +'557,557,557,557,557,557,557,557,557,,557,557,557,557,557,,,,,,,,,,,', +',,,,,,,,557,,,557,,,557,557,,,557,,557,,557,,557,,,557,,,,,,557,,,,', +'557,557,557,557,,557,557,557,557,,,,,557,557,,,,547,547,547,557,547', +'557,557,557,547,547,,,,547,,547,547,547,547,547,547,547,,,,,,547,547', +'547,547,547,547,547,,,547,,,,,,,547,,,547,547,547,547,547,547,547,547', +'547,547,547,547,,547,547,547,547,547,,,,,,,,,,,,,,,,,,,,547,,,547,,', +'547,547,,,547,,547,,547,,547,,,547,,,,,,547,,,,,547,547,547,547,,547', +'547,547,547,,,,,547,547,,,,546,546,546,547,546,547,547,547,546,546,', +',,546,,546,546,546,546,546,546,546,,,,,,546,546,546,546,546,546,546', +',,546,,,,,,,546,,,546,546,546,546,546,546,546,546,,546,546,546,,546', +'546,546,546,546,,,,,,,,,,,,,,,,,,,,546,,,546,,,546,546,,,546,,546,,', +',546,,,,,,,,,546,,,,,546,546,546,546,,546,546,546,546,,,,,546,546,,', +',42,42,42,546,42,546,546,546,42,42,,,,42,,42,42,42,42,42,42,42,,,,,', +'42,42,42,42,42,42,42,,,42,,,,,,,42,,,42,42,42,42,42,42,42,42,,42,42', +'42,,42,42,42,42,42,,,,,,,,,,,,,,,,,,,,42,,,42,,,42,42,,,42,,,,,,42,', +',,,,,,,42,,,,,42,42,42,42,,42,42,42,42,,,,,42,42,,,,69,69,69,42,69,42', +'42,42,69,69,,,,69,,69,69,69,69,69,69,69,,,,,,69,69,69,69,69,69,69,,', +'69,,,,,,,69,,,69,69,69,69,69,69,69,69,,69,69,69,,69,69,,,69,,,,,,,,', +',,,,,,,,69,,,69,,,69,,,69,69,,,69,,,,,,,,,,,,,,,,,,,,69,69,69,69,,69', +'69,69,69,,,,,69,69,,,,68,68,68,69,68,69,69,69,68,68,,,,68,,68,68,68', +'68,68,68,68,,,,,,68,68,68,68,68,68,68,,,68,,,,,,,68,,,68,68,68,68,68', +'68,68,68,,68,68,68,,68,68,,,68,,,,,,,,,,,,,,,,,,,,68,,,68,,,68,68,,', +'68,,68,,,,,,,,,,,,,,,,,,68,68,68,68,,68,68,68,68,,,,,68,68,,,,63,63', +'63,68,63,68,68,68,63,63,,,,63,,63,63,63,63,63,63,63,,,,,,63,63,63,63', +'63,63,63,,,63,,,,,,,63,,,63,63,63,63,63,63,63,63,,63,63,63,,63,63,63', +'63,63,,,,,,,,,,,,,,,,,,,,63,,,63,,,63,63,,,63,,,,,,63,,,,,,,,,63,,,', +',63,63,63,63,,63,63,63,63,,,,,63,63,,,,407,407,407,63,407,63,63,63,407', +'407,,,,407,,407,407,407,407,407,407,407,,,,,,407,407,407,407,407,407', +'407,,,407,,,,,,,407,,,407,407,407,407,407,407,407,407,,407,407,407,', +'407,407,407,407,407,,,,,,,,,,,,,,,,,,,,407,,,407,,,407,407,,,407,,,', +',,407,,,,,,,,,407,,,,,407,407,407,407,,407,407,407,407,,,,,407,407,', +',,64,64,64,407,64,407,407,407,64,64,,,,64,,64,64,64,64,64,64,64,,,,', +',64,64,64,64,64,64,64,,,64,,,,,,,64,,,64,64,64,64,64,64,64,64,,64,64', +'64,,64,64,64,64,64,,,,,,,,,,,,,,,,,,,,64,,,64,,,64,64,,,64,,,,,,64,', +',,,,,,,64,,,,,64,64,64,64,,64,64,64,64,,,,,64,64,,,,67,67,67,64,67,64', +'64,64,67,67,,,,67,,67,67,67,67,67,67,67,,,,,,67,67,67,67,67,67,67,,', +'67,,,,,,,67,,,67,67,67,67,67,67,67,67,,67,67,67,,67,67,67,67,67,,,,', +',,,,,,,,,,,,,,,67,,,67,,,67,67,,,67,,,,,,67,,,,,,,,,67,,,,,67,67,67', +'67,,67,67,67,67,,,,,67,67,67,,,,,67,67,,67,67,67,252,252,252,,252,,', +',252,252,,,,252,,252,252,252,252,252,252,252,,,,,,252,252,252,252,252', +'252,252,,,252,,,,,,,252,,,252,252,252,252,252,252,252,252,,252,252,252', +',252,252,252,252,252,,,,,,,,,,,,,,,,,,,,252,,,252,,,252,252,,,252,,', +',,,252,,,,,,,,,252,,,,,252,252,252,252,,252,252,252,252,,,,,252,252', +',,,255,255,255,252,255,252,252,252,255,255,,,,255,,255,255,255,255,255', +'255,255,,,,,,255,255,255,255,255,255,255,,,255,,,,,,,255,,,255,255,255', +'255,255,255,255,255,,255,255,255,,255,255,255,255,255,,,,,,,,,,,,,,', +',,,,,255,,,255,,,255,255,,,255,,,,,,255,,,,,,,,,255,,,,,255,255,255', +'255,,255,255,255,255,,,,,255,255,,,,733,733,733,255,733,255,255,255', +'733,733,,,,733,,733,733,733,733,733,733,733,,,,,,733,733,733,733,733', +'733,733,,,733,,,,,,,733,,,733,733,733,733,733,733,733,733,,733,733,733', +',733,733,733,733,733,,,,,,,,,,,,,,,,,,,,733,,,733,,,733,733,,,733,,', +',,,733,,,,,,,,,733,,,,,733,733,733,733,,733,733,733,733,,,,,733,733', +',,,251,251,251,733,251,733,733,733,251,251,,,,251,,251,251,251,251,251', +'251,251,,,,,,251,251,251,251,251,251,251,,,251,,,,,,,251,,,251,251,251', +'251,251,251,251,251,,251,251,251,,251,251,251,251,251,,,,,,,,,,,,,,', +',,,,,251,,,251,,,251,251,,,251,,,,,,251,,,,,,,,,251,,,,,251,251,251', +'251,,251,251,251,251,,,,,251,251,,,,735,735,735,251,735,251,251,251', +'735,735,,,,735,,735,735,735,735,735,735,735,,,,,,735,735,735,735,735', +'735,735,,,735,,,,,,,735,,,735,735,735,735,735,735,735,735,,735,735,735', +',735,735,735,735,735,,,,,,,,,,,,,,,,,,,,735,,,735,,,735,735,,,735,,', +',,,735,,,,,,,,,735,,,,,735,735,735,735,,735,735,735,735,,,,,735,735', +',,,256,256,256,735,256,735,735,735,256,256,,,,256,,256,256,256,256,256', +'256,256,,,,,,256,256,256,256,256,256,256,,,256,,,,,,,256,,,256,256,256', +'256,256,256,256,256,,256,256,256,,256,256,256,256,256,,,,,,,,,,,,,,', +',,,,,256,,,256,,,256,256,,,256,,,,,,256,,,,,,,,,256,,,,,256,256,256', +'256,,256,256,256,256,,,,,256,256,,,,250,250,250,256,250,256,256,256', +'250,250,,,,250,,250,250,250,250,250,250,250,,,,,,250,250,250,250,250', +'250,250,,,250,,,,,,,250,,,250,250,250,250,250,250,250,250,,250,250,250', +',250,250,250,250,250,,,,,,,,,,,,,,,,,,,,250,,,250,,,250,250,,,250,,', +',,,250,,,,,,,,,250,,,,,250,250,250,250,,250,250,250,250,,,,,250,250', +',,,249,249,249,250,249,250,250,250,249,249,,,,249,,249,249,249,249,249', +'249,249,,,,,,249,249,249,249,249,249,249,,,249,,,,,,,249,,,249,249,249', +'249,249,249,249,249,,249,249,249,,249,249,249,249,249,,,,,,,,,,,,,,', +',,,,,249,,,249,,,249,249,,,249,,,,,,249,,,,,,,,,249,,,,,249,249,249', +'249,,249,249,249,249,,,,,249,249,,,,248,248,248,249,248,249,249,249', +'248,248,,,,248,,248,248,248,248,248,248,248,,,,,,248,248,248,248,248', +'248,248,,,248,,,,,,,248,,,248,248,248,248,248,248,248,248,,248,248,248', +',248,248,248,248,248,,,,,,,,,,,,,,,,,,,,248,,,248,,,248,248,,,248,,', +',,,248,,,,,,,,,248,,,,,248,248,248,248,,248,248,248,248,,,,,248,248', +',,,247,247,247,248,247,248,248,248,247,247,,,,247,,247,247,247,247,247', +'247,247,,,,,,247,247,247,247,247,247,247,,,247,,,,,,,247,,,247,247,247', +'247,247,247,247,247,,247,247,247,,247,247,247,247,247,,,,,,,,,,,,,,', +',,,,,247,,,247,,,247,247,,,247,,,,,,247,,,,,,,,,247,,,,,247,247,247', +'247,,247,247,247,247,,,,,247,247,,,,678,678,678,247,678,247,247,247', +'678,678,,,,678,,678,678,678,678,678,678,678,,,,,,678,678,678,678,678', +'678,678,,,678,,,,,,,678,,,678,678,678,678,678,678,678,678,,678,678,678', +',678,678,678,678,678,,,,,,,,,,,,,,,,,,,,678,,,678,,,678,678,,,678,,', +',,,678,,,,,,,,,678,,,,,678,678,678,678,,678,678,678,678,,,,,678,678', +',,,749,749,749,678,749,678,678,678,749,749,,,,749,,749,749,749,749,749', +'749,749,,,,,,749,749,749,749,749,749,749,,,749,,,,,,,749,,,749,749,749', +'749,749,749,749,749,,749,749,749,,749,749,749,749,749,,,,,,,,,,,,,,', +',,,,,749,,,749,,,749,749,,,749,,,,,,749,,,,,,,,,749,,,,,749,749,749', +'749,,749,749,749,749,,,,,749,749,,,,750,750,750,749,750,749,749,749', +'750,750,,,,750,,750,750,750,750,750,750,750,,,,,,750,750,750,750,750', +'750,750,,,750,,,,,,,750,,,750,750,750,750,750,750,750,750,,750,750,750', +',750,750,750,750,750,,,,,,,,,,,,,,,,,,,,750,,,750,,,750,750,,,750,,', +',,,750,,,,,,,,,750,,,,,750,750,750,750,,750,750,750,750,,,,,750,750', +',,,751,751,751,750,751,750,750,750,751,751,,,,751,,751,751,751,751,751', +'751,751,,,,,,751,751,751,751,751,751,751,,,751,,,,,,,751,,,751,751,751', +'751,751,751,751,751,,751,751,751,,751,751,751,751,751,,,,,,,,,,,,,,', +',,,,,751,,,751,,,751,751,,,751,,,,,,751,,,,,,,,,751,,,,,751,751,751', +'751,,751,751,751,751,,,,,751,751,,,,752,752,752,751,752,751,751,751', +'752,752,,,,752,,752,752,752,752,752,752,752,,,,,,752,752,752,752,752', +'752,752,,,752,,,,,,,752,,,752,752,752,752,752,752,752,752,,752,752,752', +',752,752,752,752,752,,,,,,,,,,,,,,,,,,,,752,,,752,,,752,752,,,752,,', +',,,752,,,,,,,,,752,,,,,752,752,752,752,,752,752,752,752,,,,,752,752', +',,,246,246,246,752,246,752,752,752,246,246,,,,246,,246,246,246,246,246', +'246,246,,,,,,246,246,246,246,246,246,246,,,246,,,,,,,246,,,246,246,246', +'246,246,246,246,246,,246,246,246,,246,246,246,246,246,,,,,,,,,,,,,,', +',,,,,246,,,246,,,246,246,,,246,,,,,,246,,,,,,,,,246,,,,,246,246,246', +'246,,246,246,246,246,,,,,246,246,,,,754,754,754,246,754,246,246,246', +'754,754,,,,754,,754,754,754,754,754,754,754,,,,,,754,754,754,754,754', +'754,754,,,754,,,,,,,754,,,754,754,754,754,754,754,754,754,,754,754,754', +',754,754,754,754,754,,,,,,,,,,,,,,,,,,,,754,,,754,,,754,754,,,754,,', +',,,754,,,,,,,,,754,,,,,754,754,754,754,,754,754,754,754,,,,,754,754', +',,,257,257,257,754,257,754,754,754,257,257,,,,257,,257,257,257,257,257', +'257,257,,,,,,257,257,257,257,257,257,257,,,257,,,,,,,257,,,257,257,257', +'257,257,257,257,257,,257,257,257,,257,257,257,257,257,,,,,,,,,,,,,,', +',,,,,257,,,257,,,257,257,,,257,,,,,,257,,,,,,,,,257,,,,,257,257,257', +'257,,257,257,257,257,,,,,257,257,,,,258,258,258,257,258,257,257,257', +'258,258,,,,258,,258,258,258,258,258,258,258,,,,,,258,258,258,258,258', +'258,258,,,258,,,,,,,258,,,258,258,258,258,258,258,258,258,,258,258,258', +',258,258,258,258,258,,,,,,,,,,,,,,,,,,,,258,,,258,,,258,258,,,258,,', +',,,258,,,,,,,,,258,,,,,258,258,258,258,,258,258,258,258,,,,,258,258', +',,,259,259,259,258,259,258,258,258,259,259,,,,259,,259,259,259,259,259', +'259,259,,,,,,259,259,259,259,259,259,259,,,259,,,,,,,259,,,259,259,259', +'259,259,259,259,259,,259,259,259,,259,259,259,259,259,,,,,,,,,,,,,,', +',,,,,259,,,259,,,259,259,,,259,,,,,,259,,,,,,,,,259,,,,,259,259,259', +'259,,259,259,259,259,,,,,259,259,,,,260,260,260,259,260,259,259,259', +'260,260,,,,260,,260,260,260,260,260,260,260,,,,,,260,260,260,260,260', +'260,260,,,260,,,,,,,260,,,260,260,260,260,260,260,260,260,,260,260,260', +',260,260,260,260,260,,,,,,,,,,,,,,,,,,,,260,,,260,,,260,260,,,260,,', +',,,260,,,,,,,,,260,,,,,260,260,260,260,,260,260,260,260,,,,,260,260', +',,,245,245,245,260,245,260,260,260,245,245,,,,245,,245,245,245,245,245', +'245,245,,,,,,245,245,245,245,245,245,245,,,245,,,,,,,245,,,245,245,245', +'245,245,245,245,245,,245,245,245,,245,245,245,245,245,,,,,,,,,,,,,,', +',,,,,245,,,245,,,245,245,,,245,,,,,,245,,,,,,,,,245,,,,,245,245,245', +'245,,245,245,245,245,,,,,245,245,,,,244,244,244,245,244,245,245,245', +'244,244,,,,244,,244,244,244,244,244,244,244,,,,,,244,244,244,244,244', +'244,244,,,244,,,,,,,244,,,244,244,244,244,244,244,244,244,,244,244,244', +',244,244,244,244,244,,,,,,,,,,,,,,,,,,,,244,,,244,,,244,244,,,244,,', +',,,244,,,,,,,,,244,,,,,244,244,244,244,,244,244,244,244,,,,,244,244', +',,,267,267,267,244,267,244,244,244,267,267,,,,267,,267,267,267,267,267', +'267,267,,,,,,267,267,267,267,267,267,267,,,267,,,,,,,267,,,267,267,267', +'267,267,267,267,267,267,267,267,267,,267,267,267,267,267,,,,,,,,,,,', +',,,,,,,,267,,,267,,,267,267,,,267,,267,,267,,267,,,267,,,,,,267,,,,', +'267,267,267,267,,267,267,267,267,,,,,267,267,,,,268,268,268,267,268', +'267,267,267,268,268,,,,268,,268,268,268,268,268,268,268,,,,,,268,268', +'268,268,268,268,268,,,268,,,,,,,268,,,268,268,268,268,268,268,268,268', +'268,268,268,268,,268,268,268,268,268,,,,,,,,,,,,,,,,,,,,268,,,268,,', +'268,268,,,268,,268,,268,,268,,,268,,,,,,268,,,,,268,268,268,268,,268', +'268,268,268,,,,,268,268,,,,276,276,276,268,276,268,268,268,276,276,', +',,276,,276,276,276,276,276,276,276,,,,,,276,276,276,276,276,276,276', +',,276,,,,,,,276,,,276,276,276,276,276,276,276,276,276,276,276,276,,276', +'276,276,276,276,,,,,,,,,,,,,,,,,,,,276,,,276,,,276,276,,,276,,276,,276', +',276,,,276,,,,,,276,,,,,276,276,276,276,,276,276,276,276,,,,,276,276', +'276,,,766,766,766,276,766,276,276,276,766,766,,,,766,,766,766,766,766', +'766,766,766,,,,,,766,766,766,766,766,766,766,,,766,,,,,,,766,,,766,766', +'766,766,766,766,766,766,,766,766,766,,766,766,,,766,,,,,,,,,,,,,,,,', +',,,766,,,766,,,766,766,,,766,,,,,,,,,,,,,,,,,,,,766,766,766,766,,766', +'766,766,766,,,,,766,766,,,,243,243,243,766,243,766,766,766,243,243,', +',,243,,243,243,243,243,243,243,243,,,,,,243,243,243,243,243,243,243', +',,243,,,,,,,243,,,243,243,243,243,243,243,243,243,,243,243,243,,243', +'243,243,243,243,,,,,,,,,,,,,,,,,,,,243,,,243,,,243,243,,,243,,,,,,243', +',,,,,,,,243,,,,,243,243,243,243,,243,243,243,243,,,,,243,243,,,,242', +'242,242,243,242,243,243,243,242,242,,,,242,,242,242,242,242,242,242', +'242,,,,,,242,242,242,242,242,242,242,,,242,,,,,,,242,,,242,242,242,242', +'242,242,242,242,,242,242,242,,242,242,242,242,242,,,,,,,,,,,,,,,,,,', +',242,,,242,,,242,242,,,242,,,,,,242,,,,,,,,,242,,,,,242,242,242,242', +',242,242,242,242,,,,,242,242,,,,283,283,283,242,283,242,242,242,283', +'283,,,,283,,283,283,283,283,283,283,283,,,,,,283,283,283,283,283,283', +'283,,,283,,,,,,,283,,,283,283,283,283,283,283,283,283,,283,283,283,', +'283,283,283,283,283,,,,,,,,,,,,,,,,,,,,283,,,283,,,283,283,,,283,,,', +',,283,,,,,,,,,283,,,,,283,283,283,283,,283,283,283,283,,,,,283,283,', +',,241,241,241,283,241,283,283,283,241,241,,,,241,,241,241,241,241,241', +'241,241,,,,,,241,241,241,241,241,241,241,,,241,,,,,,,241,,,241,241,241', +'241,241,241,241,241,,241,241,241,,241,241,241,241,241,,,,,,,,,,,,,,', +',,,,,241,,,241,,,241,241,,,241,,,,,,241,,,,,,,,,241,,,,,241,241,241', +'241,,241,241,241,241,,,,,241,241,,,,285,285,285,241,285,241,241,241', +'285,285,,,,285,,285,285,285,285,285,285,285,,,,,,285,285,285,285,285', +'285,285,,,285,,,,,,,285,,,285,285,285,285,285,285,285,285,,285,285,285', +',285,285,285,285,285,,,,,,,,,,,,,,,,,,,,285,,,285,,,285,285,,,285,,', +',,,285,,,,,,,,,285,,,,,285,285,285,285,,285,285,285,285,,,,,285,285', +',,,288,288,288,285,288,285,285,285,288,288,,,,288,,288,288,288,288,288', +'288,288,,,,,,288,288,288,288,288,288,288,,,288,,,,,,,288,,,288,288,288', +'288,288,288,288,288,,288,288,288,,288,288,288,288,288,,,,,,,,,,,,,,', +',,,,,288,,,288,,,288,288,,,288,,,,,,288,,,,,,,,,288,,,,,288,288,288', +'288,,288,288,288,288,,,,,288,288,,,,289,289,289,288,289,288,288,288', +'289,289,,,,289,,289,289,289,289,289,289,289,,,,,,289,289,289,289,289', +'289,289,,,289,,,,,,,289,,,289,289,289,289,289,289,289,289,,289,289,289', +',289,289,289,289,289,,,,,,,,,,,,,,,,,,,,289,,,289,,,289,289,,,289,,', +',,,289,,,,,,,,,289,,,,,289,289,289,289,,289,289,289,289,,,,,289,289', +',,,705,705,705,289,705,289,289,289,705,705,,,,705,,705,705,705,705,705', +'705,705,,,,,,705,705,705,705,705,705,705,,,705,,,,,,,705,,,705,705,705', +'705,705,705,705,705,,705,705,705,,705,705,705,705,705,,,,,,,,,,,,,,', +',,,,,705,,,705,,,705,705,,,705,,,,,,705,,,,,,,,,705,,,,,705,705,705', +'705,,705,705,705,705,,,,,705,705,,,,240,240,240,705,240,705,705,705', +'240,240,,,,240,,240,240,240,240,240,240,240,,,,,,240,240,240,240,240', +'240,240,,,240,,,,,,,240,,,240,240,240,240,240,240,240,240,,240,240,240', +',240,240,240,240,240,,,,,,,,,,,,,,,,,,,,240,,,240,,,240,240,,,240,,', +',,,240,,,,,,,,,240,,,,,240,240,240,240,,240,240,240,240,,,,,240,240', +',,,652,652,652,240,652,240,240,240,652,652,,,,652,,652,652,652,652,652', +'652,652,,,,,,652,652,652,652,652,652,652,,,652,,,,,,,652,,,652,652,652', +'652,652,652,652,652,,652,652,652,,652,652,652,652,652,,,,,,,,,,,,,,', +',,,,,652,,,652,,,652,652,,,652,,652,,,,652,,,,,,,,,652,,,,,652,652,652', +'652,,652,652,652,652,,,,,652,652,,,,239,239,239,652,239,652,652,652', +'239,239,,,,239,,239,239,239,239,239,239,239,,,,,,239,239,239,239,239', +'239,239,,,239,,,,,,,239,,,239,239,239,239,239,239,239,239,,239,239,239', +',239,239,239,239,239,,,,,,,,,,,,,,,,,,,,239,,,239,,,239,239,,,239,,', +',,,239,,,,,,,,,239,,,,,239,239,239,239,,239,239,239,239,,,,,239,239', +',,,343,343,343,239,343,239,239,239,343,343,,,,343,,343,343,343,343,343', +'343,343,,,,,,343,343,343,343,343,343,343,,,343,,,,,,,343,,,343,343,343', +'343,343,343,343,343,,343,343,343,,343,343,343,343,343,,,,,,,,,,,,,,', +',,,,,343,,,343,,,343,343,,,343,,,,,,343,,,,,,,,,343,,,,,343,343,343', +'343,,343,343,343,343,,,,,343,343,,,,344,344,344,343,344,343,343,343', +'344,344,,,,344,,344,344,344,344,344,344,344,,,,,,344,344,344,344,344', +'344,344,,,344,,,,,,,344,,,344,344,344,344,344,344,344,344,,344,344,344', +',344,344,344,344,344,,,,,,,,,,,,,,,,,,,,344,,,344,,,344,344,,,344,,', +',,,344,,,,,,,,,344,,,,,344,344,344,344,,344,344,344,344,,,,,344,344', +',,,518,518,518,344,518,344,344,344,518,518,,,,518,,518,518,518,518,518', +'518,518,,,,,,518,518,518,518,518,518,518,,,518,,,,,,,518,,,518,518,518', +'518,518,518,518,518,,518,518,518,,518,518,518,518,518,,,,,,,,,,,,,,', +',,,,,518,,,518,,,518,518,,,518,,,,,,518,,,,,,,,,518,,,,,518,518,518', +'518,,518,518,518,518,,,,,518,518,,,,515,515,515,518,515,518,518,518', +'515,515,,,,515,,515,515,515,515,515,515,515,,,,,,515,515,515,515,515', +'515,515,,,515,,,,,,,515,,,515,515,515,515,515,515,515,515,,515,515,515', +',515,515,,,515,,,,,,,,,,,,,,,,,,,,515,,,515,,,515,515,,,515,,,,,,,,', +',,,,,,,,,,,515,515,515,515,,515,515,515,515,,,,,515,515,,,,509,509,509', +'515,509,515,515,515,509,509,,,,509,,509,509,509,509,509,509,509,,,,', +',509,509,509,509,509,509,509,,,509,,,,,,,509,,,509,509,509,509,509,509', +'509,509,509,509,509,509,,509,509,509,509,509,,,,,,,,,,,,,,,,,,,,509', +',,509,,,509,509,,,509,,509,,509,,509,,,509,,,,,,509,,,,,509,509,509', +'509,,509,509,509,509,,,,,509,509,,,,507,507,507,509,507,509,509,509', +'507,507,,,,507,,507,507,507,507,507,507,507,,,,,,507,507,507,507,507', +'507,507,,,507,,,,,,,507,,,507,507,507,507,507,507,507,507,,507,507,507', +',507,507,,,507,,,,,,,,,,,,,,,,,,,,507,,,507,,,507,507,,,507,,,939,,939', +'939,939,939,939,,,,,,,,,939,,507,507,507,507,,507,507,507,507,,,,,507', +'507,,,,,,939,507,,507,507,507,122,122,122,122,122,939,939,,122,122,939', +',,122,,122,122,122,122,122,122,122,,,,,,122,122,122,122,122,122,122', +',,122,,,,,,122,122,,122,122,122,122,122,122,122,122,122,,122,122,122', +',122,122,122,122,122,,,,,,,,,,,,,,,,,,,,122,,,122,,,122,122,,,122,,122', +',,,122,,,,,,,,,122,,,,,122,122,122,122,,122,122,122,122,,,,,122,122', +',,,711,711,711,122,711,122,122,122,711,711,,,,711,,711,711,711,711,711', +'711,711,,,,,,711,711,711,711,711,711,711,,,711,,,,,,,711,,,711,711,711', +'711,711,711,711,711,,711,711,711,,711,711,711,711,711,,,,,,,,,,,,,,', +',,,,,711,,,711,,,711,711,,,711,,,,,,711,,,,,,,,,711,,,,,711,711,711', +'711,,711,711,711,711,,,,,711,711,,,,254,254,254,711,254,711,711,711', +'254,254,,,,254,,254,254,254,254,254,254,254,,,,,,254,254,254,254,254', +'254,254,,,254,,,,,,,254,,,254,254,254,254,254,254,254,254,,254,254,254', +',254,254,254,254,254,,,,,,,,,,,,,,,,,,,,254,,,254,,,254,254,,,254,,', +',,,254,,,,,,,,,254,,,,,254,254,254,254,,254,254,254,254,,,,,254,254', +',,,121,121,121,254,121,254,254,254,121,121,,,,121,,121,121,121,121,121', +'121,121,,,,,,121,121,121,121,121,121,121,,,121,,,,,,,121,,,121,121,121', +'121,121,121,121,121,,121,121,121,,121,121,121,121,121,,,,,,,,,,,,,,', +',,,,,121,,,121,,,121,121,,,121,,,,,,121,,,,,,,,,121,,,,,121,121,121', +'121,,121,121,121,121,,,,,121,121,,,,120,120,120,121,120,121,121,121', +'120,120,,,,120,,120,120,120,120,120,120,120,,,,,,120,120,120,120,120', +'120,120,,,120,,,,,,,120,,,120,120,120,120,120,120,120,120,,120,120,120', +',120,120,120,120,120,,,,,,,,,,,,,,,,,,,,120,,,120,,,120,120,,,120,,', +',,,120,,,,,,,,,120,,,,,120,120,120,120,,120,120,120,120,,,,,120,120', +',,,,,,120,,120,120,120,499,499,499,499,499,,,,499,499,,,,499,,499,499', +'499,499,499,499,499,,,,,,499,499,499,499,499,499,499,,,499,,,,,,499', +'499,499,499,499,499,499,499,499,499,499,499,,499,499,499,,499,499,499', +'499,499,,,,,,,,,,,,,,,,,,,,499,,,499,,,499,499,,,499,,499,,,,499,,,', +',,,,,499,,,,,499,499,499,499,,499,499,499,499,,,,,499,499,,,,,,499,499', +',499,499,499,493,493,493,,493,,,,493,493,,,,493,,493,493,493,493,493', +'493,493,,,,,,493,493,493,493,493,493,493,,,493,,,,,,,493,,,493,493,493', +'493,493,493,493,493,,493,493,493,,493,493,493,493,493,,,,,,,,,,,,,,', +',,,,,493,,,493,,,493,493,,,493,,,,,,493,,,,,,,,,493,,,,,493,493,493', +'493,,493,493,493,493,,,,,493,493,,,,491,491,491,493,491,493,493,493', +'491,491,,,,491,,491,491,491,491,491,491,491,,,,,,491,491,491,491,491', +'491,491,,,491,,,,,,,491,,,491,491,491,491,491,491,491,491,491,491,491', +'491,,491,491,491,491,491,,,,,,,,,,,,,,,,,,,,491,,,491,,,491,491,,,491', +',,,491,,491,,,491,,,,,,491,,,,,491,491,491,491,,491,491,491,491,,,,', +'491,491,,,,489,489,489,491,489,491,491,491,489,489,,,,489,,489,489,489', +'489,489,489,489,,,,,,489,489,489,489,489,489,489,,,489,,,,,,,489,,,489', +'489,489,489,489,489,489,489,489,489,489,489,,489,489,489,489,489,,,', +',,,,,,,,,,,,,,,,489,,,489,,,489,489,,,489,,489,,489,,489,,,489,,,,,', +'489,,,,,489,489,489,489,,489,489,489,489,,,,,489,489,,,,59,59,59,489', +'59,489,489,489,59,59,,,,59,,59,59,59,59,59,59,59,,,,,,59,59,59,59,59', +'59,59,,,59,,,,,,,59,,,59,59,59,59,59,59,59,59,59,59,59,59,,59,59,59', +'59,59,,,,,,,,,,,,,,,,,,,,59,,,59,,,59,59,,,59,,59,,,,59,,,59,,,,,,59', +',,,,59,59,59,59,,59,59,59,59,,,,,59,59,,,,363,363,363,59,363,59,59,59', +'363,363,,,,363,,363,363,363,363,363,363,363,,,,,,363,363,363,363,363', +'363,363,,,363,,,,,,,363,,,363,363,363,363,363,363,363,363,,363,363,363', +',363,363,363,363,363,,,,,,,,,,,,,,,,,,,,363,,,363,,,363,363,,,363,,', +',,,363,,,,,,,,,363,,,,,363,363,363,363,,363,363,363,363,,,,,363,363', +',,,119,119,119,363,119,363,363,363,119,119,,,,119,,119,119,119,119,119', +'119,119,,,,,,119,119,119,119,119,119,119,,,119,,,,,,,119,,,119,119,119', +'119,119,119,119,119,,119,119,119,,119,119,119,119,119,,,,,,,,,,,,,,', +',,,,,119,,,119,,,119,119,,,119,,,,,,119,,,,,,,,,119,,,,,119,119,119', +'119,,119,119,119,119,,,,,119,119,,,,118,118,118,119,118,119,119,119', +'118,118,,,,118,,118,118,118,118,118,118,118,,,,,,118,118,118,118,118', +'118,118,,,118,,,,,,,118,,,118,118,118,118,118,118,118,118,,118,118,118', +',118,118,118,118,118,,,,,,,,,,,,,,,,,,,,118,,,118,,,118,118,,,118,,', +',,,118,,,,,,,,,118,,,,,118,118,118,118,,118,118,118,118,,,,,118,118', +',,,,,,118,,118,118,118,113,113,113,113,113,,,,113,113,,,,113,,113,113', +'113,113,113,113,113,,,,,,113,113,113,113,113,113,113,,,113,,,,,,113', +'113,113,113,113,113,113,113,113,113,113,113,,113,113,113,,113,113,113', +'113,113,,,,,,,,,,,,,,,,,,,,113,,,113,,,113,113,,,113,,113,,,,113,,,', +',,,,,113,,,,,113,113,113,113,,113,113,113,113,,,,,113,113,,,,,,113,113', +',113,113,113,449,449,449,,449,,,,449,449,,,,449,,449,449,449,449,449', +'449,449,,,,,,449,449,449,449,449,449,449,,,449,,,,,,,449,,,449,449,449', +'449,449,449,449,449,,449,449,449,,449,449,449,449,449,,,,,,,,,,,,,,', +',,,,,449,,,449,,,449,449,,,449,,,,,,449,,,,,,,,,449,,,,,449,449,449', +'449,,449,449,449,449,,,,,449,449,,,,448,448,448,449,448,449,449,449', +'448,448,,,,448,,448,448,448,448,448,448,448,,,,,,448,448,448,448,448', +'448,448,,,448,,,,,,,448,,,448,448,448,448,448,448,448,448,,448,448,448', +',448,448,448,448,448,,,,,,,,,,,,,,,,,,,,448,,,448,,,448,448,,,448,,', +',,,448,,,,,,,,,448,,,,,448,448,448,448,,448,448,448,448,,,,,448,448', +',,,447,447,447,448,447,448,448,448,447,447,,,,447,,447,447,447,447,447', +'447,447,,,,,,447,447,447,447,447,447,447,,,447,,,,,,,447,,,447,447,447', +'447,447,447,447,447,,447,447,447,,447,447,447,447,447,,,,,,,,,,,,,,', +',,,,,447,,,447,,,447,447,,,447,,,,,,447,,,,,,,,,447,,,,,447,447,447', +'447,,447,447,447,447,,,,,447,447,,,,445,445,445,447,445,447,447,447', +'445,445,,,,445,,445,445,445,445,445,445,445,,,,,,445,445,445,445,445', +'445,445,,,445,,,,,,,445,,,445,445,445,445,445,445,445,445,445,445,445', +'445,,445,445,445,445,445,,,,,,,,,,,,,,,,,,,,445,,,445,,,445,445,,,445', +',445,,445,,445,,,445,,,,,,445,,,,,445,445,445,445,,445,445,445,445,', +',,,445,445,,,,379,379,379,445,379,445,445,445,379,379,,,,379,,379,379', +'379,379,379,379,379,,,,,,379,379,379,379,379,379,379,,,379,,,,,,,379', +',,379,379,379,379,379,379,379,379,,379,379,379,,379,379,379,379,379', +',,,,,,,,,,,,,,,,,,,379,,,379,,,379,379,,,379,,,,,,379,,,,,,,,,379,,', +',,379,379,379,379,,379,379,379,379,,,,,379,379,,,,70,70,70,379,70,379', +'379,379,70,70,,,,70,,70,70,70,70,70,70,70,,,,,,70,70,70,70,70,70,70', +',,70,,,,,,,70,,,70,70,70,70,70,70,70,70,,70,70,70,,70,70,,,70,,,,,,', +',,,,,,,,,,,,,70,,,70,,,70,70,,,70,,,,,,,,,,,,,,,,,,,,70,70,70,70,,70', +'70,70,70,,,,,70,70,,,,60,60,60,70,60,70,70,70,60,60,,,,60,,60,60,60', +'60,60,60,60,,,,,,60,60,60,60,60,60,60,,,60,,,,,,,60,,,60,60,60,60,60', +'60,60,60,60,60,60,60,,60,60,60,60,60,,,,,,,,,,,,,,,,,,,,60,,,60,,,60', +'60,,,60,,,,,,60,,,60,,,,,,60,,,,,60,60,60,60,,60,60,60,60,,,,,60,60', +',,,211,211,211,60,211,60,60,60,211,211,,,,211,,211,211,211,211,211,211', +'211,,,,,,211,211,211,211,211,211,211,,,211,,,,,,,211,,,211,211,211,211', +'211,211,211,211,211,211,211,211,,211,211,211,211,211,,,,,,,,,,,,,,,', +',,,,211,,,211,,,211,211,,,211,,211,,211,,211,,,211,,,,,,211,,,,,211', +'211,211,211,,211,211,211,211,,,,,211,211,,,,532,532,532,211,532,211', +'211,211,532,532,,,,532,,532,532,532,532,532,532,532,,,,,,532,532,532', +'532,532,532,532,,,532,,,,,,,532,,,532,532,532,532,532,532,532,532,532', +'532,532,532,,532,532,532,532,532,,,,,,,,,,,,,,,,,,,,532,,,532,,,532', +'532,,,532,,,,,,532,,,532,,,,,,532,,,,,532,532,532,532,,532,532,532,532', +',,,,532,532,,,,529,529,529,532,529,532,532,532,529,529,,,,529,,529,529', +'529,529,529,529,529,,,,,,529,529,529,529,529,529,529,,,529,,,,,,,529', +',,529,529,529,529,529,529,529,529,529,529,529,529,,529,529,529,529,529', +',,,,,,,,,,,,,,,,,,,529,,,529,,,529,529,,,529,,529,,,,529,,,529,,,,,', +'529,,,,,529,529,529,529,,529,529,529,529,,,,,529,529,,,,210,210,210', +'529,210,529,529,529,210,210,,,,210,,210,210,210,210,210,210,210,,,,', +',210,210,210,210,210,210,210,,,210,,,,,,,210,,,210,210,210,210,210,210', +'210,210,,210,210,210,,210,210,210,210,210,,,,,,,,,,,,,,,,,,,,210,,,210', +',,210,210,,,210,,,,,,210,,,,,,,,,210,,,,,210,210,210,210,,210,210,210', +'210,,,,,210,210,,,,43,43,43,210,43,210,210,210,43,43,,,,43,,43,43,43', +'43,43,43,43,,,,,,43,43,43,43,43,43,43,,,43,,,,,,,43,,,43,43,43,43,43', +'43,43,43,,43,43,43,,43,43,43,43,43,,,,,,,,,,,,,,,,,,,,43,,,43,,,43,43', +',,43,,,,,,43,,,,,,,,,43,,,,,43,43,43,43,,43,43,43,43,,,,,43,43,,,,209', +'209,209,43,209,43,43,43,209,209,,,,209,,209,209,209,209,209,209,209', +',,,,,209,209,209,209,209,209,209,,,209,,,,,,,209,,,209,209,209,209,209', +'209,209,209,,209,209,209,,209,209,209,209,209,,,,,,,,,,,,,,,,,,,,209', +',,209,,,209,209,,,209,,209,,,,209,,,,,,,,,209,,,,,209,209,209,209,,209', +'209,209,209,,,,,209,209,,,,44,44,44,209,44,209,209,209,44,44,,,,44,', +'44,44,44,44,44,44,44,,,,,,44,44,44,44,44,44,44,,,44,,,,,,,44,,,44,44', +'44,44,44,44,44,44,,44,44,44,,44,44,44,44,44,,,,,,,,,,,,,,,,,,,,44,,', +'44,,,44,44,,,44,,,,,,44,,,,,,,,,44,,,,,44,44,44,44,,44,44,44,44,,,,', +'44,44,,,,975,975,975,44,975,44,44,44,975,975,,,,975,,975,975,975,975', +'975,975,975,,,,,,975,975,975,975,975,975,975,,,975,,,,,,,975,,,975,975', +'975,975,975,975,975,975,975,975,975,975,,975,975,975,975,975,,,,,,,', +',,,,,,,,,,,,975,,,975,,,975,975,,,975,,975,,975,,975,,,975,,,,,,975', +',,,,975,975,975,975,,975,975,975,975,,,,,975,975,,,,523,523,523,975', +'523,975,975,975,523,523,,,,523,,523,523,523,523,523,523,523,,,,,,523', +'523,523,523,523,523,523,,,523,,,,,,,523,,,523,523,523,523,523,523,523', +'523,,523,523,523,,523,523,523,523,523,,,,,,,,,,,,,,,,,,,,523,,,523,', +',523,523,,,523,,,,,,523,,,,,,,,,523,,,,,523,523,523,523,,523,523,523', +'523,,,,,523,523,,,,519,519,519,523,519,523,523,523,519,519,,,,519,,519', +'519,519,519,519,519,519,,,,,,519,519,519,519,519,519,519,,,519,,,,,', +',519,,,519,519,519,519,519,519,519,519,,519,519,519,,519,519,519,519', +'519,,,,,,,,,,,,,,,,,,,,519,,,519,,,519,519,,,519,,,,,,519,,,,,,,,,519', +',,,,519,519,519,519,,519,519,519,519,,,,,519,519,,,,,,,519,,519,519', +'519,586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,586', +'586,586,586,586,586,586,586,586,,,,586,586,586,586,586,586,586,586,586', +'586,,,,,,586,586,586,586,586,586,586,586,586,,,586,,,,,,,,586,586,,586', +'586,586,586,586,586,586,,,586,586,,,,586,586,586,586,,,,,,,,,,,,,,586', +'586,,586,586,586,586,586,586,586,586,586,586,586,586,,,586,586,,,,,', +',,,,,,,,586,398,398,398,398,398,398,398,398,398,398,398,398,398,398', +'398,398,398,398,398,398,398,398,398,398,,,,398,398,398,398,398,398,398', +'398,398,398,,,,,,398,398,398,398,398,398,398,398,398,,,398,,,,,,,,398', +'398,,398,398,398,398,398,398,398,,,398,398,,,,398,398,398,398,,,,,,', +',,,,,,,398,398,,398,398,398,398,398,398,398,398,398,398,398,398,,,398', +'398,,,,,,,,,,,,,,398,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9', +',,,9,9,9,9,9,9,9,9,9,9,,,,,,9,9,9,9,9,9,9,9,9,,,9,,,,,,,,9,9,,9,9,9', +'9,9,9,9,,,9,9,,,,9,9,9,9,,,,,,,,,,,,,,9,9,,9,9,9,9,9,9,9,9,9,9,9,9,', +',9,9,,,,,,,,,,,,,,9,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8', +',,,8,8,8,8,8,8,8,8,8,8,,,,,,8,8,8,8,8,8,8,8,8,8,,8,,,,,,,,8,8,,8,8,8', +'8,8,8,8,,,8,8,,,,8,8,8,8,,,,,,,,,,,,,,8,8,,8,8,8,8,8,8,8,8,8,8,8,8,', +',8,8,,,,,,,,,,,,,,8,717,717,717,717,717,717,717,717,717,717,717,717', +'717,717,717,717,717,717,717,717,717,717,717,717,,,,717,717,717,717,717', +'717,717,717,717,717,,,,,,717,717,717,717,717,717,717,717,717,,,717,', +',,,,,,717,717,,717,717,717,717,717,717,717,,,717,717,,,,717,717,717', +'717,,,,,,,,,,,,,,717,717,,717,717,717,717,717,717,717,717,717,717,717', +'717,,,717,71,71,71,71,71,71,71,71,71,71,71,71,71,71,71,71,71,71,71,71', +'71,71,71,71,,,,71,71,71,71,71,71,71,71,71,71,,,,,,71,71,71,71,71,71', +'71,71,71,71,71,71,,71,,,,,,71,71,,71,71,71,71,71,71,71,,,71,71,,,,71', +'71,71,71,,,,,,71,,,,,,,,71,71,,71,71,71,71,71,71,71,71,71,71,71,71,922', +'922,71,,922,,,,,,,,922,922,,922,922,922,922,922,922,922,,,922,922,,', +',922,922,922,922,,,,,,922,,,,,,,,922,922,,922,922,922,922,922,922,922', +'922,922,922,922,922,520,520,922,,520,,,,,,,,520,520,,520,520,520,520', +'520,520,520,,,520,520,,,,520,520,520,520,,,,,,520,,,,,,,,520,520,,520', +'520,520,520,520,520,520,520,520,520,520,520,521,521,520,,521,,,,,,,', +'521,521,,521,521,521,521,521,521,521,,,521,521,,,,521,521,521,521,,', +',,,521,,,,,,,,521,521,,521,521,521,521,521,521,521,521,521,521,521,521', +'549,549,521,,549,,,,,,,,549,549,,549,549,549,549,549,549,549,,,549,549', +',,,549,549,549,549,,,,,,549,,,,,,,,549,549,,549,549,549,549,549,549', +'549,549,549,549,549,549,977,977,549,,977,,,,,,,,977,977,,977,977,977', +'977,977,977,977,,,977,977,,,,977,977,977,977,,,,,,977,,,,,,,,977,977', +',977,977,977,977,977,977,977,977,977,977,977,977,976,976,977,,976,,', +',,,,,976,976,,976,976,976,976,976,976,976,,,976,976,,,,976,976,976,976', +',,,,,976,,,,,,,,976,976,,976,976,976,976,976,976,976,976,976,976,976', +'976,444,444,976,,444,,,,,,,,444,444,,444,444,444,444,444,444,444,,,444', +'444,,,,444,444,444,444,,,,,,444,,,,,,,,444,444,,444,444,444,444,444', +'444,444,444,444,444,444,444,212,212,444,,212,,,,,,,,212,212,,212,212', +'212,212,212,212,212,,,212,212,,,,212,212,212,212,,,,,,212,,,,,,,,212', +'212,,212,212,212,212,212,212,212,212,212,212,212,212,443,443,212,,443', +',,,,,,,443,443,,443,443,443,443,443,443,443,,,443,443,,,,443,443,443', +'443,,,,,,443,,,,,,,,443,443,,443,443,443,443,443,443,443,443,443,443', +'443,443,213,213,443,,213,,,,,,,,213,213,,213,213,213,213,213,213,213', +',,213,213,,,,213,213,213,213,,,,,,213,,,,,,,,213,213,,213,213,213,213', +'213,213,213,213,213,213,213,213,556,556,213,,556,,,,,,,,556,556,,556', +'556,556,556,556,556,556,,,556,556,,,,556,556,556,556,,,,,,556,,,,,,', +',556,556,,556,556,556,556,556,556,556,556,556,556,556,556,548,548,556', +',548,,,,,,,,548,548,,548,548,548,548,548,548,548,,,548,548,,,,548,548', +'548,548,,,,,,548,,,,,,,,548,548,,548,548,548,548,548,548,548,548,548', +'548,548,548,511,511,548,,511,,,,,,,,511,511,,511,511,511,511,511,511', +'511,,,511,511,,,,511,511,511,511,,,,,,511,,,,,,,,511,511,,511,511,511', +'511,511,511,511,511,511,511,511,511,555,555,511,,555,,,,,,,,555,555', +',555,555,555,555,555,555,555,,,555,555,,,,555,555,555,555,,,,,,555,', +',,,,,,555,555,,555,555,555,555,555,555,555,555,555,555,555,555,510,510', +'555,,510,,,,,,,,510,510,,510,510,510,510,510,510,510,,,510,510,,,,510', +'510,510,510,,,,,,510,,,,,,,,510,510,,510,510,510,510,510,510,510,510', +'510,510,510,510,263,263,510,,263,,,,,,,,263,263,,263,263,263,263,263', +'263,263,,,263,263,,,,263,263,263,263,965,,965,965,965,965,965,,,,,,', +'263,263,965,263,263,263,263,263,263,263,263,263,263,263,263,,537,263', +'537,537,537,537,537,963,965,963,963,963,963,963,,537,,,,965,965,,963', +',965,961,,961,961,961,961,961,,,,,,537,537,,961,,,,963,,537,537,537', +'537,,,,537,,963,963,,,,963,715,961,715,715,715,715,715,,,,961,961,961', +'961,,715,,961,941,,941,941,941,941,941,943,,943,943,943,943,943,,941', +',,,715,,658,943,658,658,658,658,658,715,715,715,715,,,,715,658,941,', +',,,,,943,,,,941,941,,,,941,,943,943,,658,,943,,,,,,,658,658,658,658', +',,937,658,937,937,937,937,937,,716,,716,716,716,716,716,937,,,,,,,,716', +',798,,798,798,798,798,798,,,,,,937,,,798,,,,,716,937,937,937,937,,,', +'937,716,716,716,716,,,,716,798,,800,,800,800,800,800,800,798,798,798', +'798,,,,798,800,,802,,802,802,802,802,802,,845,,845,845,845,845,845,802', +',,,,800,,,845,,,,,,800,800,800,800,,,,800,802,,,,,,,,845,,,802,802,', +',,802,845,845,845,845,,,847,845,847,847,847,847,847,849,,849,849,849', +'849,849,,847,,,,,,,849,,,,,,,,,,,,,,,847,,,,,,,849,,847,847,847,847', +',,,847,,849,849,,,,849' ] + racc_action_check = arr = ::Array.new(25101, nil) + idx = 0 + clist.each do |str| + str.split(',', -1).each do |i| + arr[idx] = i.to_i unless i.empty? + idx += 1 + end + end + +racc_action_pointer = [ + 3124, 54, nil, -115, nil, 9353, 630, -49, 23417, 23289, + 10, nil, 15, 98, 814, 418, 43, 548, nil, -68, + 7765, 2984, 170, nil, 779, nil, 284, 876, 986, 7233, + 7364, 7495, nil, 4244, 8944, 9075, nil, 85, 645, 316, + 174, 281, 12235, 22239, 22501, 103, 712, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 1313, nil, -31, 20127, + 21584, -15, nil, 12628, 12890, nil, nil, 13021, 12497, 12366, + 21453, 23658, nil, nil, nil, nil, nil, nil, nil, 490, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 358, nil, nil, + 138, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 235, nil, 20659, nil, nil, nil, nil, 20520, 20389, + 19456, 19325, 18932, 1864, nil, -1, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 104, nil, 2004, 22370, + 22108, 21715, 24146, 24268, nil, nil, 11711, 11580, 11449, 11318, + 11187, 10532, nil, nil, 708, -42, 164, 197, 186, 131, + 192, nil, 8289, 5224, 244, 6709, 6439, 6177, 5915, 18007, + 17745, 17090, 16828, 16697, 16042, 15911, 15125, 14339, 14208, 14077, + 13946, 13553, 13160, 7102, 19194, 13291, 13815, 15387, 15518, 15649, + 15780, nil, nil, 24634, nil, nil, 241, 16173, 16304, nil, + nil, nil, nil, nil, nil, nil, 16435, nil, 3124, nil, + 219, 231, nil, 16959, 289, 17221, nil, nil, 17352, 17483, + nil, nil, 288, nil, 6578, 1173, 305, 276, 4524, 309, + 372, 375, 7626, 5784, 562, 649, 652, 471, 653, nil, + 439, 400, 194, nil, nil, nil, 446, 307, 436, 10008, + nil, 641, 508, 744, nil, 514, nil, 10794, 5364, 10925, + 468, nil, 273, 175, 515, 498, 372, 527, nil, nil, + 437, 18, 26, 18138, 18269, 364, 603, 488, 26, 36, + 678, 570, 65, 603, nil, nil, 478, 616, 148, nil, + 619, nil, 525, 20258, nil, nil, nil, 218, 782, 780, + 755, 720, 648, 618, 582, 338, nil, 220, nil, 21322, + nil, 397, 408, 505, 536, 528, -31, -41, 539, nil, + nil, nil, nil, nil, nil, nil, nil, 521, 23161, nil, + nil, nil, nil, 527, nil, nil, 510, 12759, 523, nil, + nil, 1864, 528, nil, 555, 556, 793, 795, 1449, nil, + nil, nil, 248, 608, 608, nil, nil, 1098, 740, nil, + 2004, nil, 556, nil, nil, 1584, nil, nil, nil, nil, + 19, nil, 617, 24207, 24085, 21191, -82, 21060, 20929, 20798, + 5504, 4944, 484, 802, 652, 656, 657, 668, 5915, 6027, + 5784, 5224, 5364, 5644, 1398, 4524, 4664, 4804, 5084, 4104, + 4244, 938, 1190, 3964, 4384, 3684, 192, 1234, nil, nil, + nil, nil, 614, nil, 203, 236, 627, nil, nil, 19996, + nil, 19865, nil, 19734, nil, 390, nil, nil, nil, 19595, + 1178, 3684, 629, 630, nil, nil, 631, 18793, 639, 18662, + 24573, 24451, 781, 681, nil, 18531, 639, nil, 18400, 22894, + 23780, 23841, 3824, 22763, 766, 766, 522, 696, nil, 21977, + nil, nil, 21846, nil, nil, nil, nil, 24696, 2424, 775, + nil, 3544, -20, 65, 777, 789, 12104, 11973, 24390, 23902, + 68, nil, nil, 990, nil, 24512, 24329, 11842, nil, nil, + 257, 2844, 710, nil, 156, nil, nil, nil, 962, nil, + nil, nil, 681, nil, nil, 395, nil, 393, nil, nil, + 668, nil, 669, nil, nil, nil, 23033, nil, 692, 11056, + 10663, 524, 732, 10401, 10270, 10139, 9877, 733, nil, nil, + 9746, 9615, 735, nil, 9484, 9214, nil, nil, 110, 156, + 0, 470, 705, 1724, 709, nil, 538, nil, 2984, 817, + -8, 117, nil, 2284, 1584, nil, 722, nil, 773, 8551, + nil, nil, 8420, nil, 748, -109, 8158, 736, nil, 748, + 27, 206, 791, 170, 848, 798, 760, 6046, 3264, 828, + -14, 881, 17876, nil, 766, nil, 247, nil, 24796, nil, + 766, 773, nil, 775, 776, 777, nil, nil, nil, nil, + nil, nil, nil, nil, 768, 1277, nil, nil, 14470, nil, + nil, nil, 863, nil, nil, nil, 869, nil, nil, 883, + 511, nil, 921, nil, nil, nil, nil, 930, nil, 6, + 810, 90, 94, 165, 178, 17614, 251, 1066, nil, 827, + 4384, 19063, nil, 952, 4944, 24757, 24856, 23545, nil, nil, + nil, nil, nil, nil, 5084, nil, nil, nil, nil, nil, + nil, nil, 829, 13422, 2144, 13684, nil, 834, nil, 2284, + nil, 2424, nil, nil, 2564, nil, 2704, nil, 2844, 14601, + 14732, 14863, 14994, 261, 15256, 835, 838, nil, 842, 844, + 847, nil, 882, 862, 861, 854, 16566, nil, nil, 996, + nil, nil, 4804, 897, 1005, nil, nil, nil, nil, 891, + 149, nil, nil, 1022, nil, 2144, 899, 946, nil, nil, + 944, nil, 7, 907, 1052, nil, nil, 289, 24873, nil, + 24912, nil, 24929, nil, 6308, nil, 876, nil, 906, 359, + 915, nil, nil, nil, nil, 1037, nil, 6840, 1039, 5504, + 5644, nil, 6971, 3964, 22, 55, nil, 1040, 308, 4664, + nil, 1041, 941, 346, nil, 945, 944, nil, 3404, 7896, + 8027, 3544, 1123, nil, nil, 24937, nil, 24989, nil, 24996, + nil, nil, 969, 1076, 8682, 924, 1026, nil, 972, nil, + nil, nil, 3264, nil, nil, -10, 8813, nil, nil, nil, + nil, nil, 997, 957, nil, nil, nil, 968, 969, nil, + 970, 971, nil, 976, nil, nil, 985, 1212, 987, 1250, + nil, nil, 41, nil, 1113, 1127, nil, 17, nil, nil, + nil, 1138, nil, nil, nil, 1060, nil, 1020, nil, nil, + 1021, 1024, 1025, 1027, nil, 1028, nil, 342, nil, nil, + nil, 954, 23719, nil, nil, nil, 1724, 37, -11, 958, + 1107, 33, nil, 2564, 2704, nil, nil, 24848, nil, 18840, + nil, 24775, nil, 24782, nil, nil, nil, nil, 354, 1520, + 1030, 3824, nil, nil, nil, nil, nil, 4104, nil, 3404, + nil, 24721, nil, 24703, nil, 24667, nil, 9122, nil, nil, + nil, 1091, 1089, 1094, 1177, 22632, 24024, 23963, -7, 1073, + 1178, 1057, 1060, 1062, 1064, 1066, 1512, 1069, 1378, 34, + 1215, 1217, 1099, 1103, 1104, 1105, nil, nil, 1109, 52, + 53, -9, -1, nil, nil, 7673, nil, nil, nil, nil, + 1227, 1111, nil, nil, nil, 1198, nil, nil, nil, nil, + 128, 1112, 1124, -101, nil, nil ] + +racc_action_default = [ + -3, -601, -1, -587, -4, -601, -7, -601, -601, -601, + -601, -29, -601, -601, -601, -279, -601, -40, -43, -589, + -601, -48, -50, -51, -52, -56, -256, -256, -256, -293, + -329, -330, -68, -11, -72, -80, -82, -601, -491, -492, + -601, -601, -601, -601, -601, -589, -237, -270, -271, -272, + -273, -274, -275, -276, -277, -278, -575, -281, -283, -600, + -565, -301, -303, -601, -601, -307, -310, -587, -601, -601, + -601, -601, -331, -332, -334, -335, -432, -433, -434, -435, + -436, -457, -439, -440, -459, -461, -444, -449, -453, -455, + -471, -459, -473, -475, -476, -477, -478, -573, -480, -481, + -574, -483, -484, -485, -486, -487, -488, -489, -490, -495, + -496, -601, -2, -588, -596, -597, -598, -6, -601, -601, + -601, -601, -601, -3, -17, -601, -111, -112, -113, -114, + -115, -116, -117, -118, -119, -123, -124, -125, -126, -127, + -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, -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, -22, -120, -11, -601, + -601, -246, -601, -601, -585, -586, -601, -601, -601, -601, + -601, -589, -590, -47, -601, -491, -492, -601, -279, -601, + -601, -229, -601, -11, -601, -601, -601, -601, -601, -601, + -601, -601, -601, -601, -601, -601, -601, -601, -601, -601, + -601, -601, -601, -601, -601, -601, -601, -601, -601, -601, + -601, -401, -403, -601, -583, -584, -57, -246, -601, -300, + -407, -416, -418, -63, -413, -64, -589, -65, -238, -251, + -260, -260, -255, -601, -261, -601, -457, -567, -601, -601, + -66, -67, -587, -12, -601, -15, -601, -70, -11, -589, + -601, -73, -76, -11, -88, -89, -601, -601, -96, -293, + -296, -589, -601, -329, -330, -333, -414, -601, -78, -601, + -84, -290, -474, -601, -214, -215, -230, -601, -11, -601, + -589, -239, -593, -593, -601, -601, -593, -601, -302, -392, + -49, -601, -601, -601, -601, -587, -601, -588, -491, -492, + -601, -601, -279, -601, -345, -346, -106, -107, -601, -109, + -601, -279, -499, -601, -491, -492, -322, -111, -112, -153, + -154, -155, -171, -176, -183, -186, -324, -601, -563, -601, + -437, -601, -601, -601, -601, -601, -601, -601, -601, 1026, + -5, -599, -23, -24, -25, -26, -27, -601, -601, -19, + -20, -21, -121, -601, -30, -39, -266, -601, -601, -265, + -31, -196, -589, -247, -260, -260, -576, -577, -256, -411, + -578, -579, -577, -576, -256, -410, -412, -578, -579, -37, + -204, -38, -601, -41, -42, -194, -261, -44, -45, -46, + -589, -299, -601, -601, -601, -246, -290, -601, -601, -601, + -205, -206, -207, -208, -209, -210, -211, -212, -216, -217, + -218, -219, -220, -221, -222, -223, -224, -225, -226, -227, + -228, -231, -232, -233, -234, -589, -381, -256, -576, -577, + -54, -58, -589, -257, -381, -381, -589, -295, -252, -601, + -253, -601, -258, -601, -262, -601, -570, -572, -10, -588, + -14, -3, -589, -69, -288, -85, -74, -601, -589, -246, + -601, -601, -95, -601, -474, -601, -81, -86, -601, -601, + -601, -601, -235, -601, -424, -601, -284, -601, -240, -595, + -594, -242, -595, -291, -292, -566, -304, -523, -11, -336, + -337, -11, -601, -601, -601, -601, -601, -246, -601, -601, + -290, -315, -106, -107, -108, -601, -601, -246, -318, -497, + -601, -11, -501, -326, -589, -438, -458, -463, -601, -465, + -441, -460, -601, -462, -443, -601, -446, -601, -448, -451, + -601, -452, -601, -472, -8, -18, -601, -28, -269, -601, + -601, -415, -601, -248, -250, -601, -601, -59, -245, -408, + -601, -601, -61, -409, -601, -601, -298, -591, -576, -577, + -576, -577, -589, -194, -601, -382, -589, -384, -11, -53, + -404, -381, -243, -11, -11, -294, -260, -259, -263, -601, + -568, -569, -601, -13, -601, -71, -601, -77, -83, -589, + -576, -577, -244, -580, -94, -601, -79, -601, -203, -213, + -589, -600, -600, -282, -589, -287, -593, -393, -523, -396, + -562, -562, -506, -508, -508, -508, -522, -524, -525, -526, + -527, -528, -529, -530, -531, -601, -533, -535, -537, -542, + -544, -545, -547, -552, -554, -555, -557, -558, -559, -601, + -600, -338, -600, -308, -339, -340, -311, -601, -314, -601, + -589, -576, -577, -580, -289, -601, -106, -107, -110, -589, + -11, -601, -320, -601, -11, -523, -523, -601, -564, -464, + -467, -468, -469, -470, -11, -442, -445, -447, -450, -454, + -456, -122, -267, -601, -197, -601, -592, -260, -33, -199, + -34, -200, -60, -35, -202, -36, -201, -62, -195, -601, + -601, -601, -601, -415, -601, -562, -562, -363, -365, -365, + -365, -380, -601, -589, -386, -531, -539, -540, -550, -601, + -406, -405, -11, -601, -601, -254, -264, -571, -16, -75, + -415, -87, -297, -600, -343, -11, -425, -600, -426, -427, + -601, -241, -601, -589, -601, -504, -505, -601, -601, -515, + -601, -518, -601, -520, -601, -347, -601, -349, -351, -358, + -589, -536, -546, -556, -560, -601, -341, -601, -601, -11, + -11, -313, -601, -11, -415, -601, -415, -601, -601, -11, + -323, -601, -589, -601, -327, -601, -268, -32, -198, -249, + -601, -236, -601, -361, -362, -371, -373, -601, -376, -601, + -378, -383, -601, -601, -601, -538, -601, -402, -601, -417, + -419, -9, -11, -431, -344, -601, -601, -429, -285, -394, + -397, -399, -601, -562, -543, -561, -507, -508, -508, -534, + -508, -508, -553, -508, -531, -548, -589, -601, -356, -601, + -532, -305, -601, -306, -601, -601, -263, -600, -316, -319, + -498, -601, -325, -500, -502, -501, -466, -562, -541, -364, + -365, -365, -365, -365, -551, -365, -385, -589, -388, -390, + -391, -549, -601, -290, -55, -430, -11, -491, -492, -601, + -601, -279, -428, -11, -11, -395, -503, -601, -511, -601, + -513, -601, -516, -601, -519, -521, -348, -350, -354, -601, + -359, -11, -309, -312, -420, -421, -422, -11, -321, -11, + -360, -601, -368, -601, -370, -601, -374, -601, -377, -379, + -387, -601, -289, -580, -424, -246, -601, -601, -290, -601, + -601, -508, -508, -508, -508, -352, -601, -357, -601, -600, + -601, -601, -365, -365, -365, -365, -389, -423, -589, -576, + -577, -580, -289, -398, -400, -601, -509, -512, -514, -517, + -601, -355, -342, -317, -328, -601, -366, -369, -372, -375, + -415, -508, -353, -365, -510, -367 ] + +clist = [ +'220,418,424,26,376,525,212,223,26,331,338,279,279,279,490,301,264,262', +'412,116,714,651,2,26,270,274,327,545,815,591,6,434,26,26,26,6,26,263', +'341,342,381,409,345,759,315,315,124,207,481,431,554,630,477,318,129', +'129,659,693,696,132,132,134,134,266,273,275,26,26,113,627,26,627,516', +'322,482,810,795,796,315,315,315,528,531,116,762,535,112,783,666,280', +'280,280,630,392,393,394,395,950,717,918,299,538,541,300,277,290,291', +'297,920,882,861,382,633,914,947,206,26,129,388,332,441,26,26,26,26,26', +'26,355,818,766,340,340,117,405,340,879,362,366,618,575,577,398,621,6', +'586,397,623,624,490,334,346,620,396,6,630,378,335,987,536,281,281,281', +'353,558,377,328,329,654,330,339,343,843,844,627,627,487,819,793,344', +'820,705,957,879,710,829,340,340,340,340,333,336,561,760,279,1011,562', +'404,410,503,571,573,576,576,429,433,571,886,1,905,666,419,26,26,26,26', +'947,443,996,1022,26,26,26,26,26,26,697,920,914,761,753,763,852,418,424', +'832,833,26,917,713,657,390,869,537,792,933,495,882,708,934,279,279,476', +'612,484,485,954,780,787,279,428,637,872,865,380,383,384,666,666,646', +'408,26,26,910,385,386,387,719,408,403,26,879,724,711,772,877,437,438', +'439,440,936,874,908,513,,,,,26,510,642,517,26,13,300,879,,26,13,116', +'642,270,527,315,,274,520,639,824,542,543,506,,,960,500,,826,1012,280', +'315,,26,26,955,,13,280,642,,606,898,,548,483,,642,26,26,,514,,486,,', +'700,766,,499,766,775,766,116,766,959,709,502,26,,300,264,508,,297,300', +'878,498,880,297,,742,,622,26,,747,625,,827,,779,563,831,727,592,727', +',526,,281,630,,635,,,,791,281,638,,,340,340,,,,13,598,,434,627,,911', +'603,912,13,13,,279,544,,560,,,,,,585,,,,,419,,,129,,564,,26,132,,134', +'14,,,597,614,14,,823,,602,,718,,,,,,,775,997,224,,766,598,766,,766,', +'766,224,224,224,788,14,306,306,517,,428,279,,,,,517,,,,,,26,,26,,901', +',419,,13,,26,981,619,224,224,315,419,224,350,360,360,634,,315,26,,766', +'279,,6,,,,13,,992,,279,,26,,,26,805,419,,,782,26,,,,419,,758,428,694', +'694,26,,,,26,14,,428,,771,224,224,224,224,14,14,712,,956,,,,738,740', +',,,743,745,,650,433,,592,,428,13,764,26,26,13,428,789,26,26,13,699,26', +'690,,,692,,,770,1020,,517,,626,592,26,,,731,926,26,26,781,,13,674,129', +',,790,991,132,,134,598,,,603,,,315,,,,834,,951,,,,,315,,656,14,224,224', +'224,,,,,224,224,224,224,224,224,,,805,,,888,825,592,,756,,14,828,,769', +',592,,,773,774,,,,,,,,,,,,,,26,890,765,,408,26,26,,,26,,224,224,,837', +'737,,,,26,224,,,903,,863,,,,867,26,,881,,883,,764,,14,,,,14,,674,,306', +'14,,805,,805,,,,129,,642,,,,,,306,340,,764,26,315,,340,,14,224,998,', +',946,,913,26,915,,757,892,,835,224,224,,,,39,13,,13,,39,,,,674,674,', +',,,224,,,985,805,26,,26,26,,,26,,846,848,850,224,26,39,305,305,,,,,13', +'694,858,13,900,,,,,904,,,,,,864,805,,805,,,873,,13,315,26,,,349,365', +'365,365,,,,,315,982,,983,805,984,,,340,,,,,894,895,,674,897,674,,,224', +'970,,,993,,994,,995,,,,907,,,756,39,756,,756,,,,13,976,39,39,,13,13', +',,26,,,925,,,,26,26,,765,,765,,,,1021,,,,,,14,,14,26,1023,,279,,306', +'26,224,26,,799,801,803,306,428,875,,,875,,419,224,,,26,592,962,964,966', +'968,,969,,,337,,14,,,14,,,974,,,224,,,,979,980,,,,39,224,,,13,14,,,13', +'875,,,757,989,757,428,757,,13,990,756,,756,674,756,39,756,,,,,,,,,,', +',38,224,224,,,38,224,224,,765,224,,,,,,1016,1017,1018,1019,,,,,14,,', +',13,14,14,,,38,304,304,756,,,,,13,306,,,,,1025,39,,,,39,306,,,305,39', +',,,,,,,,,,348,364,364,364,,305,,13,13,,,13,,,39,,,13,,,,,757,406,757', +',757,,757,,,436,,,,,,,,,,,,224,,38,,,14,224,13,,14,,38,38,,,,,,16,14', +',938,940,16,942,944,,945,,,224,,,757,,,,,,,15,,,,,15,,,,,,16,,,492,', +'494,,,496,497,855,,,,,,14,,,,13,,15,308,308,,,13,13,14,,,,,,354,,,,', +',,,,,13,38,,,,,13,,13,,,,352,361,361,,224,,14,14,,,14,,,,38,,14,1006', +'1007,1008,1009,,,16,,,,,,,,,16,16,39,,39,,,,,921,305,,,15,,,,14,305', +',,929,15,15,,1024,,,,,,,,,,,,,588,,,39,,38,39,,,38,,,,304,38,,,,,,,', +',,,,39,,,,304,,,,,,,,,38,,,,14,,,,,16,,14,14,,,,,,432,,,,,,,,,,,14,', +'15,,,16,14,,14,,,,,,628,39,337,,631,,39,39,,,224,,,15,,,,,,305,,,,,', +',,,,,305,,,,,,,,,,628,,,337,,,,,,,,,16,,,,16,436,,,,16,,,,,,,,,,,,,15', +',,,15,,,,308,15,,,16,,,,,,,39,,,,39,,308,732,,,,628,337,,39,15,,,,,', +',,,,,,,,,,,,,,38,,38,,,,,,304,,,,776,,,777,304,,,,,365,,,,,,39,,,,,', +',,786,,,,38,39,,38,,,,,,,,,,,,,,,,,,,811,38,,,,,,,,,,,,39,39,,,39,,', +',,,39,,,,,,,,,,,,,,,,,,,,,,,,,365,,,,,,,836,39,,38,,928,,,38,38,,,,16', +',16,,,,,,304,,,,,,,,,,,304,,,15,,15,,,,,,308,,,,,,,,308,16,,,16,,,,', +',,,,,39,,,,,,885,39,39,15,16,,15,,,,,,,,,,,,896,39,,,,,38,39,15,39,38', +',,,,723,,337,,,38,,,,,,,,,432,,,,,,,,,,,,,,16,,,,,16,16,,,,,,,,,,,,', +'364,,,15,,,38,,15,15,,,,,,,,,,38,,308,,,,,,,,,,,308,,,,,,,,,,,,,,,,', +',,,,38,38,,,38,,,,,,38,,,,,,,,,,16,,,,16,,,,,,,,,,16,364,,,,,,,15,38', +',,15,927,,,,,,,,,15,,,,,,,,,,,,,,,,,,,,,,,,,,16,,,,,,,,,,,,,16,,,361', +',,,,,15,,,38,,,,,,,38,38,,15,,,,,,,,231,,,,16,16,,38,16,278,278,278', +',38,16,38,,,,,,,324,325,326,,15,15,,,15,,,,,,15,,,278,278,,,,,,,16,', +',,932,,,,,,,,,,361,,,,,,,,15,,,,931,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,', +',,,,,16,,,,,,,16,16,,,,,,,,,,,,,,15,,,16,,,,15,15,16,,16,,,,,,,,,,,', +',,15,,,,,,15,,15,,,,,,,,,,,,,,,,,,,,,,,278,411,278,,,,,430,435,,,,,', +',,,,,,,,,231,,,450,451,452,453,454,455,456,457,458,459,460,461,462,463', +'464,465,466,467,468,469,470,471,472,473,474,475,,,,,,,278,278,,,,,,', +',278,,,,,,,278,,278,,,278,278,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,522', +',,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,', +',,,,,,,,,,,278,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,278,,430,613,411', +',,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,278,,278,,278,,,,,,,,,,,,,,,', +'278,,,,,,,,,648,649,,,,,,,,,,278,,,278,,,,,,,,,,,,,,278,278,,,,,,,,', +',278,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,278,734,,,278,278,739,741,,,,744', +'746,,,613,748,,,,,,,,,,,,,,,,,,,,,,,,278,,,278,,,,,,,,,,,,,,,,,,,,278', +',,,,,,,,,,,,,,,,,,,,,,,,,278,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,', +',,,,,,,,,,,,,,,278,,838,,,,,,,,,,,,,,739,741,746,744,,841,,,,,,,,,,', +',,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,278,,,,,,,,,,,,,,,,,,278,,,,', +',,,,,,,,,,,,278,838,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,', +',,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,', +',,,,,,,,,,,,,,,,,,278' ] + racc_goto_table = arr = ::Array.new(2946, nil) + idx = 0 + clist.each do |str| + str.split(',', -1).each do |i| + arr[idx] = i.to_i unless i.empty? + idx += 1 + end + end + +clist = [ +'32,38,38,42,57,8,25,20,42,68,87,34,34,34,74,50,25,142,23,97,99,10,2', +'42,72,72,32,93,91,24,7,18,42,42,42,7,42,37,17,17,155,28,17,130,65,65', +'15,15,40,28,55,182,38,51,58,58,141,92,92,61,61,62,62,39,39,39,42,42', +'6,75,42,75,52,64,23,120,125,125,65,65,65,70,70,97,133,70,4,11,167,69', +'69,69,182,17,17,17,17,121,116,135,47,90,90,9,45,45,45,46,136,178,12', +'156,14,179,118,16,42,58,156,69,48,42,42,42,42,42,42,19,11,174,30,30', +'5,29,30,173,56,56,41,159,159,31,43,7,63,2,41,41,74,67,4,73,7,7,182,85', +'86,121,89,71,71,71,94,96,100,101,102,103,104,105,106,125,125,75,75,48', +'107,141,108,109,110,111,173,112,113,30,30,30,30,71,71,114,131,34,121', +'115,20,20,48,160,160,160,160,20,20,160,120,1,117,167,72,42,42,42,42', +'118,25,135,121,42,42,42,42,42,42,93,136,179,122,24,128,133,38,38,141', +'141,42,134,8,137,5,138,139,140,143,155,178,55,144,34,34,145,23,147,148', +'149,24,150,34,58,52,133,151,154,157,158,167,167,52,69,42,42,130,161', +'162,163,164,69,9,42,173,165,166,41,171,30,30,30,30,125,175,176,32,,', +',,42,25,38,50,42,21,9,173,,42,21,97,38,72,32,65,,72,25,23,24,17,17,51', +',,125,7,,24,91,69,65,,42,42,11,,21,69,38,,48,92,,25,45,,38,42,42,,64', +',45,,,23,174,,6,174,74,174,97,174,99,23,47,42,,9,25,47,,46,9,131,4,131', +'46,,40,,48,42,,40,48,,8,,52,37,8,160,32,160,,30,,71,182,,48,,,,70,71', +'48,,,30,30,,,,21,72,,18,75,,131,72,131,21,21,,34,4,,30,,,,,,15,,,,,72', +',,58,,30,,42,61,,62,22,,,39,32,22,,90,,39,,48,,,,,,,74,10,22,,174,72', +'174,,174,,174,22,22,22,28,22,22,22,50,,58,34,,,,,50,,,,,,42,,42,,8,', +'72,,21,,42,131,39,22,22,65,72,22,22,22,22,2,,65,42,,174,34,,7,,,,21', +',131,,34,,42,,,42,119,72,,,48,42,,,,72,,129,58,97,97,42,,,,42,22,,58', +',87,22,22,22,22,22,22,97,,93,,,,20,20,,,,20,20,,30,20,,32,,58,21,32', +'42,42,21,58,68,42,42,21,69,42,9,,,9,,,142,24,,50,,71,32,42,,,15,90,42', +'42,50,,21,172,58,,,32,8,61,,62,72,,,72,,,65,,,,57,,90,,,,,65,,71,22', +'22,22,22,,,,,22,22,22,22,22,22,,,119,,,119,17,32,,124,,22,17,,9,,32', +',,9,9,,,,,,,,,,,,,,42,48,172,,69,42,42,,,42,,22,22,,20,71,,,,42,22,', +',48,,68,,,,68,42,,129,,129,,32,,22,,,,22,,172,,22,22,,119,,119,,,,58', +',38,,,,,,22,30,,32,42,65,,30,,22,22,23,,,48,,129,42,129,,126,17,,9,22', +'22,,,,54,21,,21,,54,,,,172,172,,,,,22,,,119,119,42,,42,42,,,42,,127', +'127,127,22,42,54,54,54,,,,,21,97,9,21,97,,,,,97,,,,,,9,119,,119,,,124', +',21,65,42,,,54,54,54,54,,,,,65,129,,129,119,129,,,30,,,,,9,9,,172,9', +'172,,,22,32,,,129,,129,,129,,,,124,,,124,54,124,,124,,,,21,25,54,54', +',21,21,,,42,,,9,,,,42,42,,172,,172,,,,129,,,,,,22,,22,42,129,,34,,22', +'42,22,42,,170,170,170,22,58,126,,,126,,72,22,,,42,32,127,127,127,127', +',127,,,66,,22,,,22,,,9,,,22,,,,9,9,,,,54,22,,,21,22,,,21,126,,,126,9', +'126,58,126,,21,9,124,,124,172,124,54,124,,,,,,,,,,,,53,22,22,,,53,22', +'22,,172,22,,,,,,127,127,127,127,,,,,22,,,,21,22,22,,,53,53,53,124,,', +',,21,22,,,,,127,54,,,,54,22,,,54,54,,,,,,,,,,,53,53,53,53,,54,,21,21', +',,21,,,54,,,21,,,,,126,66,126,,126,,126,,,66,,,,,,,,,,,,22,,53,,,22', +'22,21,,22,,53,53,,,,,,27,22,,170,170,27,170,170,,170,,,22,,,126,,,,', +',,26,,,,,26,,,,,,27,,,66,,66,,,66,66,22,,,,,,22,,,,21,,26,26,26,,,21', +'21,22,,,,,,27,,,,,,,,,,21,53,,,,,21,,21,,,,26,26,26,,22,,22,22,,,22', +',,,53,,22,170,170,170,170,,,27,,,,,,,,,27,27,54,,54,,,,,22,54,,,26,', +',,22,54,,,22,26,26,,170,,,,,,,,,,,,,66,,,54,,53,54,,,53,,,,53,53,,,', +',,,,,,,,54,,,,53,,,,,,,,,53,,,,22,,,,,27,,22,22,,,,,,27,,,,,,,,,,,22', +',26,,,27,22,,22,,,,,,66,54,66,,66,,54,54,,,22,,,26,,,,,,54,,,,,,,,,', +',54,,,,,,,,,,66,,,66,,,,,,,,,27,,,,27,66,,,,27,,,,,,,,,,,,,26,,,,26', +',,,26,26,,,27,,,,,,,54,,,,54,,26,66,,,,66,66,,54,26,,,,,,,,,,,,,,,,', +',,,53,,53,,,,,,53,,,,66,,,66,53,,,,,54,,,,,,54,,,,,,,,66,,,,53,54,,53', +',,,,,,,,,,,,,,,,,,66,53,,,,,,,,,,,,54,54,,,54,,,,,,54,,,,,,,,,,,,,,', +',,,,,,,,,,54,,,,,,,66,54,,53,,54,,,53,53,,,,27,,27,,,,,,53,,,,,,,,,', +',53,,,26,,26,,,,,,26,,,,,,,,26,27,,,27,,,,,,,,,,54,,,,,,66,54,54,26', +'27,,26,,,,,,,,,,,,66,54,,,,,53,54,26,54,53,,,,,26,,66,,,53,,,,,,,,,27', +',,,,,,,,,,,,,27,,,,,27,27,,,,,,,,,,,,,53,,,26,,,53,,26,26,,,,,,,,,,53', +',26,,,,,,,,,,,26,,,,,,,,,,,,,,,,,,,,,53,53,,,53,,,,,,53,,,,,,,,,,27', +',,,27,,,,,,,,,,27,53,,,,,,,26,53,,,26,53,,,,,,,,,26,,,,,,,,,,,,,,,,', +',,,,,,,,,27,,,,,,,,,,,,,27,,,26,,,,,,26,,,53,,,,,,,53,53,,26,,,,,,,', +'33,,,,27,27,,53,27,33,33,33,,53,27,53,,,,,,,33,33,33,,26,26,,,26,,,', +',,26,,,33,33,,,,,,,27,,,,27,,,,,,,,,,26,,,,,,,,26,,,,26,,,,,,,,,,,,', +',,,,,,,,,,,,,,,,,,,,,,,,,27,,,,,,,27,27,,,,,,,,,,,,,,26,,,27,,,,26,26', +'27,,27,,,,,,,,,,,,,,26,,,,,,26,,26,,,,,,,,,,,,,,,,,,,,,,,33,33,33,,', +',,33,33,,,,,,,,,,,,,,,33,,,33,33,33,33,33,33,33,33,33,33,33,33,33,33', +'33,33,33,33,33,33,33,33,33,33,33,33,,,,,,,33,33,,,,,,,,33,,,,,,,33,', +'33,,,33,33,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,33,,,,,,,,,,,,,,,,,', +',,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,33,,,', +',,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,33,,33,33,33,,,,,,,,,,,,,,,,,,,,,', +',,,,,,,,,,,,,,,,,,33,,33,,33,,,,,,,,,,,,,,,,33,,,,,,,,,33,33,,,,,,,', +',,33,,,33,,,,,,,,,,,,,,33,33,,,,,,,,,,33,,,,,,,,,,,,,,,,,,,,,,,,,,,', +',,,,33,33,,,33,33,33,33,,,,33,33,,,33,33,,,,,,,,,,,,,,,,,,,,,,,,33,', +',33,,,,,,,,,,,,,,,,,,,,33,,,,,,,,,,,,,,,,,,,,,,,,,,33,,,,,,,,,,,,,,', +',,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,33,,33,,,,,,,,,,,,,,33,33,33', +'33,,33,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,33,,,,,,,,,', +',,,,,,,,33,,,,,,,,,,,,,,,,,33,33,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,', +',,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,', +',,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,33' ] + racc_goto_check = arr = ::Array.new(2946, nil) + idx = 0 + clist.each do |str| + str.split(',', -1).each do |i| + arr[idx] = i.to_i unless i.empty? + idx += 1 + end + end + +racc_goto_pointer = [ + nil, 207, 22, nil, 83, 127, 65, 30, -323, 70, + -503, -564, -673, nil, -387, 38, 106, -25, -186, 59, + -13, 302, 452, -193, -383, -8, 1197, 1175, -168, -76, + 67, 17, -19, 1970, -18, nil, nil, 13, -211, 37, + -218, -338, 3, -338, nil, 75, 74, 67, -101, nil, + -19, 18, -247, 1046, 800, -308, 67, -67, 46, nil, + nil, 51, 53, -258, 32, 10, 928, 90, -50, 60, + -251, 130, -2, -326, -267, -420, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 84, 96, -51, nil, -181, + -240, -662, -485, -319, 94, nil, -199, 16, nil, -542, + 93, 108, 108, -359, 110, 107, 105, -517, 112, -517, + -371, -717, -375, -528, -175, -181, -465, -626, -773, -130, + -600, -792, -388, nil, 67, -584, 175, 70, -386, -60, + -573, -424, nil, -532, -616, -754, -745, -298, -551, -97, + -414, -481, -5, -626, -623, -10, nil, -18, -18, -642, + -395, -525, nil, nil, 184, -41, 27, 179, 179, -245, + -183, 186, 186, 186, -292, -288, -277, -449, nil, nil, + 301, -514, 94, -663, -487, -504, -551, nil, -691, -734, + nil, nil, -440 ] + +racc_goto_default = [ + nil, nil, nil, 3, nil, 4, 347, 295, nil, 524, + nil, 816, nil, 292, 293, nil, nil, nil, 11, 12, + 18, 230, 323, nil, nil, 556, 228, 229, nil, nil, + 17, nil, 442, 21, 22, 23, 24, nil, 645, nil, + nil, nil, 312, nil, 25, 413, 32, nil, nil, 34, + 37, 36, nil, 225, 226, 359, nil, 131, 421, 130, + 133, 77, 78, nil, 92, 46, 284, nil, 784, 414, + nil, 415, 426, 599, 488, 282, 268, 47, 48, 49, + 50, 51, 52, 53, 54, 55, nil, 269, 61, nil, + nil, nil, nil, nil, nil, 69, nil, 539, 70, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 807, 673, + nil, 808, 909, 755, 661, nil, 662, nil, nil, 663, + nil, 665, 615, nil, nil, nil, 671, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 425, nil, nil, nil, + nil, nil, 76, 79, 80, nil, nil, nil, nil, nil, + 566, nil, nil, nil, nil, nil, nil, 876, 716, 660, + nil, 664, 884, 676, 678, 679, 767, 682, 683, 768, + 686, 689, 287 ] + +racc_reduce_table = [ + 0, 0, :racc_error, + 1, 146, :_reduce_none, + 2, 147, :_reduce_2, + 0, 148, :_reduce_3, + 1, 148, :_reduce_4, + 3, 148, :_reduce_5, + 2, 148, :_reduce_6, + 1, 150, :_reduce_none, + 4, 150, :_reduce_8, + 4, 153, :_reduce_9, + 2, 154, :_reduce_10, + 0, 158, :_reduce_11, + 1, 158, :_reduce_12, + 3, 158, :_reduce_13, + 2, 158, :_reduce_14, + 1, 159, :_reduce_none, + 4, 159, :_reduce_16, + 0, 176, :_reduce_17, + 4, 152, :_reduce_18, + 3, 152, :_reduce_19, + 3, 152, :_reduce_20, + 3, 152, :_reduce_21, + 2, 152, :_reduce_22, + 3, 152, :_reduce_23, + 3, 152, :_reduce_24, + 3, 152, :_reduce_25, + 3, 152, :_reduce_26, + 3, 152, :_reduce_27, + 4, 152, :_reduce_28, + 1, 152, :_reduce_none, + 3, 152, :_reduce_30, + 3, 152, :_reduce_31, + 6, 152, :_reduce_32, + 5, 152, :_reduce_33, + 5, 152, :_reduce_34, + 5, 152, :_reduce_35, + 5, 152, :_reduce_36, + 3, 152, :_reduce_37, + 3, 152, :_reduce_38, + 3, 152, :_reduce_39, + 1, 152, :_reduce_none, + 3, 163, :_reduce_41, + 3, 163, :_reduce_42, + 1, 175, :_reduce_none, + 3, 175, :_reduce_44, + 3, 175, :_reduce_45, + 3, 175, :_reduce_46, + 2, 175, :_reduce_47, + 1, 175, :_reduce_none, + 1, 162, :_reduce_none, + 1, 165, :_reduce_none, + 1, 165, :_reduce_none, + 1, 180, :_reduce_none, + 4, 180, :_reduce_53, + 0, 188, :_reduce_54, + 5, 185, :_reduce_55, + 1, 187, :_reduce_none, + 2, 179, :_reduce_57, + 3, 179, :_reduce_58, + 4, 179, :_reduce_59, + 5, 179, :_reduce_60, + 4, 179, :_reduce_61, + 5, 179, :_reduce_62, + 2, 179, :_reduce_63, + 2, 179, :_reduce_64, + 2, 179, :_reduce_65, + 2, 179, :_reduce_66, + 2, 179, :_reduce_67, + 1, 164, :_reduce_68, + 3, 164, :_reduce_69, + 1, 192, :_reduce_70, + 3, 192, :_reduce_71, + 1, 191, :_reduce_none, + 2, 191, :_reduce_73, + 3, 191, :_reduce_74, + 5, 191, :_reduce_75, + 2, 191, :_reduce_76, + 4, 191, :_reduce_77, + 2, 191, :_reduce_78, + 4, 191, :_reduce_79, + 1, 191, :_reduce_80, + 3, 191, :_reduce_81, + 1, 195, :_reduce_none, + 3, 195, :_reduce_83, + 2, 194, :_reduce_84, + 3, 194, :_reduce_85, + 1, 197, :_reduce_86, + 3, 197, :_reduce_87, + 1, 196, :_reduce_88, + 1, 196, :_reduce_89, + 4, 196, :_reduce_90, + 3, 196, :_reduce_91, + 3, 196, :_reduce_92, + 3, 196, :_reduce_93, + 3, 196, :_reduce_94, + 2, 196, :_reduce_95, + 1, 196, :_reduce_96, + 1, 172, :_reduce_97, + 1, 172, :_reduce_98, + 4, 172, :_reduce_99, + 3, 172, :_reduce_100, + 3, 172, :_reduce_101, + 3, 172, :_reduce_102, + 3, 172, :_reduce_103, + 2, 172, :_reduce_104, + 1, 172, :_reduce_105, + 1, 200, :_reduce_106, + 1, 200, :_reduce_none, + 2, 201, :_reduce_108, + 1, 201, :_reduce_109, + 3, 201, :_reduce_110, + 1, 202, :_reduce_none, + 1, 202, :_reduce_none, + 1, 202, :_reduce_none, + 1, 202, :_reduce_none, + 1, 202, :_reduce_none, + 1, 205, :_reduce_116, + 1, 205, :_reduce_none, + 1, 160, :_reduce_none, + 1, 160, :_reduce_none, + 1, 161, :_reduce_120, + 0, 208, :_reduce_121, + 4, 161, :_reduce_122, + 1, 203, :_reduce_none, + 1, 203, :_reduce_none, + 1, 203, :_reduce_none, + 1, 203, :_reduce_none, + 1, 203, :_reduce_none, + 1, 203, :_reduce_none, + 1, 203, :_reduce_none, + 1, 203, :_reduce_none, + 1, 203, :_reduce_none, + 1, 203, :_reduce_none, + 1, 203, :_reduce_none, + 1, 203, :_reduce_none, + 1, 203, :_reduce_none, + 1, 203, :_reduce_none, + 1, 203, :_reduce_none, + 1, 203, :_reduce_none, + 1, 203, :_reduce_none, + 1, 203, :_reduce_none, + 1, 203, :_reduce_none, + 1, 203, :_reduce_none, + 1, 203, :_reduce_none, + 1, 203, :_reduce_none, + 1, 203, :_reduce_none, + 1, 203, :_reduce_none, + 1, 203, :_reduce_none, + 1, 203, :_reduce_none, + 1, 203, :_reduce_none, + 1, 203, :_reduce_none, + 1, 203, :_reduce_none, + 1, 203, :_reduce_none, + 1, 204, :_reduce_none, + 1, 204, :_reduce_none, + 1, 204, :_reduce_none, + 1, 204, :_reduce_none, + 1, 204, :_reduce_none, + 1, 204, :_reduce_none, + 1, 204, :_reduce_none, + 1, 204, :_reduce_none, + 1, 204, :_reduce_none, + 1, 204, :_reduce_none, + 1, 204, :_reduce_none, + 1, 204, :_reduce_none, + 1, 204, :_reduce_none, + 1, 204, :_reduce_none, + 1, 204, :_reduce_none, + 1, 204, :_reduce_none, + 1, 204, :_reduce_none, + 1, 204, :_reduce_none, + 1, 204, :_reduce_none, + 1, 204, :_reduce_none, + 1, 204, :_reduce_none, + 1, 204, :_reduce_none, + 1, 204, :_reduce_none, + 1, 204, :_reduce_none, + 1, 204, :_reduce_none, + 1, 204, :_reduce_none, + 1, 204, :_reduce_none, + 1, 204, :_reduce_none, + 1, 204, :_reduce_none, + 1, 204, :_reduce_none, + 1, 204, :_reduce_none, + 1, 204, :_reduce_none, + 1, 204, :_reduce_none, + 1, 204, :_reduce_none, + 1, 204, :_reduce_none, + 1, 204, :_reduce_none, + 1, 204, :_reduce_none, + 1, 204, :_reduce_none, + 1, 204, :_reduce_none, + 1, 204, :_reduce_none, + 1, 204, :_reduce_none, + 3, 178, :_reduce_194, + 5, 178, :_reduce_195, + 3, 178, :_reduce_196, + 5, 178, :_reduce_197, + 6, 178, :_reduce_198, + 5, 178, :_reduce_199, + 5, 178, :_reduce_200, + 5, 178, :_reduce_201, + 5, 178, :_reduce_202, + 4, 178, :_reduce_203, + 3, 178, :_reduce_204, + 3, 178, :_reduce_205, + 3, 178, :_reduce_206, + 3, 178, :_reduce_207, + 3, 178, :_reduce_208, + 3, 178, :_reduce_209, + 3, 178, :_reduce_210, + 3, 178, :_reduce_211, + 3, 178, :_reduce_212, + 4, 178, :_reduce_213, + 2, 178, :_reduce_214, + 2, 178, :_reduce_215, + 3, 178, :_reduce_216, + 3, 178, :_reduce_217, + 3, 178, :_reduce_218, + 3, 178, :_reduce_219, + 3, 178, :_reduce_220, + 3, 178, :_reduce_221, + 3, 178, :_reduce_222, + 3, 178, :_reduce_223, + 3, 178, :_reduce_224, + 3, 178, :_reduce_225, + 3, 178, :_reduce_226, + 3, 178, :_reduce_227, + 3, 178, :_reduce_228, + 2, 178, :_reduce_229, + 2, 178, :_reduce_230, + 3, 178, :_reduce_231, + 3, 178, :_reduce_232, + 3, 178, :_reduce_233, + 3, 178, :_reduce_234, + 3, 178, :_reduce_235, + 6, 178, :_reduce_236, + 1, 178, :_reduce_none, + 1, 211, :_reduce_none, + 1, 212, :_reduce_none, + 2, 212, :_reduce_none, + 4, 212, :_reduce_241, + 2, 212, :_reduce_242, + 3, 217, :_reduce_243, + 0, 218, :_reduce_244, + 1, 218, :_reduce_none, + 0, 168, :_reduce_246, + 1, 168, :_reduce_none, + 2, 168, :_reduce_none, + 4, 168, :_reduce_249, + 2, 168, :_reduce_250, + 1, 190, :_reduce_251, + 2, 190, :_reduce_252, + 2, 190, :_reduce_253, + 4, 190, :_reduce_254, + 1, 190, :_reduce_255, + 0, 221, :_reduce_256, + 2, 184, :_reduce_257, + 2, 220, :_reduce_258, + 2, 219, :_reduce_259, + 0, 219, :_reduce_260, + 1, 214, :_reduce_261, + 2, 214, :_reduce_262, + 3, 214, :_reduce_263, + 4, 214, :_reduce_264, + 1, 174, :_reduce_265, + 1, 174, :_reduce_none, + 3, 173, :_reduce_267, + 4, 173, :_reduce_268, + 2, 173, :_reduce_269, + 1, 210, :_reduce_none, + 1, 210, :_reduce_none, + 1, 210, :_reduce_none, + 1, 210, :_reduce_none, + 1, 210, :_reduce_none, + 1, 210, :_reduce_none, + 1, 210, :_reduce_none, + 1, 210, :_reduce_none, + 1, 210, :_reduce_none, + 1, 210, :_reduce_none, + 1, 210, :_reduce_280, + 0, 246, :_reduce_281, + 4, 210, :_reduce_282, + 0, 247, :_reduce_283, + 0, 248, :_reduce_284, + 6, 210, :_reduce_285, + 0, 249, :_reduce_286, + 4, 210, :_reduce_287, + 3, 210, :_reduce_288, + 3, 210, :_reduce_289, + 2, 210, :_reduce_290, + 3, 210, :_reduce_291, + 3, 210, :_reduce_292, + 1, 210, :_reduce_293, + 4, 210, :_reduce_294, + 3, 210, :_reduce_295, + 1, 210, :_reduce_296, + 5, 210, :_reduce_297, + 4, 210, :_reduce_298, + 3, 210, :_reduce_299, + 2, 210, :_reduce_300, + 1, 210, :_reduce_none, + 2, 210, :_reduce_302, + 0, 250, :_reduce_303, + 3, 210, :_reduce_304, + 6, 210, :_reduce_305, + 6, 210, :_reduce_306, + 0, 251, :_reduce_307, + 0, 252, :_reduce_308, + 7, 210, :_reduce_309, + 0, 253, :_reduce_310, + 0, 254, :_reduce_311, + 7, 210, :_reduce_312, + 5, 210, :_reduce_313, + 4, 210, :_reduce_314, + 0, 255, :_reduce_315, + 0, 256, :_reduce_316, + 9, 210, :_reduce_317, + 0, 257, :_reduce_318, + 6, 210, :_reduce_319, + 0, 258, :_reduce_320, + 7, 210, :_reduce_321, + 0, 259, :_reduce_322, + 5, 210, :_reduce_323, + 0, 260, :_reduce_324, + 6, 210, :_reduce_325, + 0, 261, :_reduce_326, + 0, 262, :_reduce_327, + 9, 210, :_reduce_328, + 1, 210, :_reduce_329, + 1, 210, :_reduce_330, + 1, 210, :_reduce_331, + 1, 210, :_reduce_332, + 1, 167, :_reduce_none, + 1, 240, :_reduce_334, + 1, 243, :_reduce_335, + 1, 235, :_reduce_none, + 1, 235, :_reduce_none, + 2, 235, :_reduce_338, + 1, 237, :_reduce_none, + 1, 237, :_reduce_none, + 1, 236, :_reduce_none, + 5, 236, :_reduce_342, + 1, 156, :_reduce_none, + 2, 156, :_reduce_344, + 1, 239, :_reduce_none, + 1, 239, :_reduce_none, + 1, 263, :_reduce_347, + 3, 263, :_reduce_348, + 1, 266, :_reduce_349, + 3, 266, :_reduce_350, + 1, 265, :_reduce_none, + 4, 265, :_reduce_352, + 6, 265, :_reduce_353, + 3, 265, :_reduce_354, + 5, 265, :_reduce_355, + 2, 265, :_reduce_356, + 4, 265, :_reduce_357, + 1, 265, :_reduce_358, + 3, 265, :_reduce_359, + 4, 267, :_reduce_360, + 2, 267, :_reduce_361, + 2, 267, :_reduce_362, + 1, 267, :_reduce_363, + 2, 272, :_reduce_364, + 0, 272, :_reduce_365, + 6, 273, :_reduce_366, + 8, 273, :_reduce_367, + 4, 273, :_reduce_368, + 6, 273, :_reduce_369, + 4, 273, :_reduce_370, + 2, 273, :_reduce_none, + 6, 273, :_reduce_372, + 2, 273, :_reduce_373, + 4, 273, :_reduce_374, + 6, 273, :_reduce_375, + 2, 273, :_reduce_376, + 4, 273, :_reduce_377, + 2, 273, :_reduce_378, + 4, 273, :_reduce_379, + 1, 273, :_reduce_none, + 0, 186, :_reduce_381, + 1, 186, :_reduce_382, + 3, 277, :_reduce_383, + 1, 277, :_reduce_384, + 4, 277, :_reduce_385, + 1, 278, :_reduce_386, + 4, 278, :_reduce_387, + 1, 279, :_reduce_388, + 3, 279, :_reduce_389, + 1, 280, :_reduce_390, + 1, 280, :_reduce_none, + 0, 284, :_reduce_392, + 0, 285, :_reduce_393, + 4, 234, :_reduce_394, + 4, 282, :_reduce_395, + 1, 282, :_reduce_396, + 0, 288, :_reduce_397, + 4, 283, :_reduce_398, + 0, 289, :_reduce_399, + 4, 283, :_reduce_400, + 0, 290, :_reduce_401, + 5, 287, :_reduce_402, + 2, 181, :_reduce_403, + 4, 181, :_reduce_404, + 5, 181, :_reduce_405, + 5, 181, :_reduce_406, + 2, 233, :_reduce_407, + 4, 233, :_reduce_408, + 4, 233, :_reduce_409, + 3, 233, :_reduce_410, + 3, 233, :_reduce_411, + 3, 233, :_reduce_412, + 2, 233, :_reduce_413, + 1, 233, :_reduce_414, + 4, 233, :_reduce_415, + 0, 292, :_reduce_416, + 5, 232, :_reduce_417, + 0, 293, :_reduce_418, + 5, 232, :_reduce_419, + 5, 238, :_reduce_420, + 1, 294, :_reduce_421, + 1, 294, :_reduce_none, + 6, 155, :_reduce_423, + 0, 155, :_reduce_424, + 1, 295, :_reduce_425, + 1, 295, :_reduce_none, + 1, 295, :_reduce_none, + 2, 296, :_reduce_428, + 1, 296, :_reduce_none, + 2, 157, :_reduce_430, + 1, 157, :_reduce_none, + 1, 222, :_reduce_none, + 1, 222, :_reduce_none, + 1, 222, :_reduce_none, + 1, 223, :_reduce_435, + 1, 298, :_reduce_436, + 2, 298, :_reduce_437, + 3, 299, :_reduce_438, + 1, 299, :_reduce_439, + 1, 299, :_reduce_440, + 3, 224, :_reduce_441, + 4, 225, :_reduce_442, + 3, 226, :_reduce_443, + 0, 303, :_reduce_444, + 3, 303, :_reduce_445, + 1, 304, :_reduce_446, + 2, 304, :_reduce_447, + 3, 228, :_reduce_448, + 0, 306, :_reduce_449, + 3, 306, :_reduce_450, + 3, 227, :_reduce_451, + 3, 229, :_reduce_452, + 0, 307, :_reduce_453, + 3, 307, :_reduce_454, + 0, 308, :_reduce_455, + 3, 308, :_reduce_456, + 0, 300, :_reduce_457, + 2, 300, :_reduce_458, + 0, 301, :_reduce_459, + 2, 301, :_reduce_460, + 0, 302, :_reduce_461, + 2, 302, :_reduce_462, + 1, 305, :_reduce_463, + 2, 305, :_reduce_464, + 0, 310, :_reduce_465, + 4, 305, :_reduce_466, + 1, 309, :_reduce_467, + 1, 309, :_reduce_468, + 1, 309, :_reduce_469, + 1, 309, :_reduce_none, + 1, 206, :_reduce_471, + 3, 207, :_reduce_472, + 1, 297, :_reduce_473, + 2, 297, :_reduce_474, + 1, 209, :_reduce_475, + 1, 209, :_reduce_476, + 1, 209, :_reduce_477, + 1, 209, :_reduce_478, + 1, 198, :_reduce_479, + 1, 198, :_reduce_480, + 1, 198, :_reduce_481, + 1, 198, :_reduce_482, + 1, 198, :_reduce_483, + 1, 199, :_reduce_484, + 1, 199, :_reduce_485, + 1, 199, :_reduce_486, + 1, 199, :_reduce_487, + 1, 199, :_reduce_488, + 1, 199, :_reduce_489, + 1, 199, :_reduce_490, + 1, 230, :_reduce_491, + 1, 230, :_reduce_492, + 1, 166, :_reduce_493, + 1, 166, :_reduce_494, + 1, 171, :_reduce_495, + 1, 171, :_reduce_496, + 0, 311, :_reduce_497, + 4, 241, :_reduce_498, + 0, 241, :_reduce_499, + 3, 244, :_reduce_500, + 0, 313, :_reduce_501, + 3, 244, :_reduce_502, + 4, 312, :_reduce_503, + 2, 312, :_reduce_504, + 2, 312, :_reduce_505, + 1, 312, :_reduce_506, + 2, 315, :_reduce_507, + 0, 315, :_reduce_508, + 6, 286, :_reduce_509, + 8, 286, :_reduce_510, + 4, 286, :_reduce_511, + 6, 286, :_reduce_512, + 4, 286, :_reduce_513, + 6, 286, :_reduce_514, + 2, 286, :_reduce_515, + 4, 286, :_reduce_516, + 6, 286, :_reduce_517, + 2, 286, :_reduce_518, + 4, 286, :_reduce_519, + 2, 286, :_reduce_520, + 4, 286, :_reduce_521, + 1, 286, :_reduce_522, + 0, 286, :_reduce_523, + 1, 281, :_reduce_524, + 1, 281, :_reduce_525, + 1, 281, :_reduce_526, + 1, 281, :_reduce_527, + 1, 264, :_reduce_none, + 1, 264, :_reduce_529, + 1, 317, :_reduce_530, + 1, 318, :_reduce_531, + 3, 318, :_reduce_532, + 1, 274, :_reduce_533, + 3, 274, :_reduce_534, + 1, 319, :_reduce_535, + 2, 320, :_reduce_536, + 1, 320, :_reduce_537, + 2, 321, :_reduce_538, + 1, 321, :_reduce_539, + 1, 268, :_reduce_540, + 3, 268, :_reduce_541, + 1, 314, :_reduce_542, + 3, 314, :_reduce_543, + 1, 322, :_reduce_none, + 1, 322, :_reduce_none, + 2, 269, :_reduce_546, + 1, 269, :_reduce_547, + 3, 323, :_reduce_548, + 3, 324, :_reduce_549, + 1, 275, :_reduce_550, + 3, 275, :_reduce_551, + 1, 316, :_reduce_552, + 3, 316, :_reduce_553, + 1, 325, :_reduce_none, + 1, 325, :_reduce_none, + 2, 276, :_reduce_556, + 1, 276, :_reduce_557, + 1, 326, :_reduce_none, + 1, 326, :_reduce_none, + 2, 271, :_reduce_560, + 2, 270, :_reduce_561, + 0, 270, :_reduce_562, + 1, 245, :_reduce_none, + 3, 245, :_reduce_564, + 0, 231, :_reduce_565, + 2, 231, :_reduce_none, + 1, 216, :_reduce_567, + 3, 216, :_reduce_568, + 3, 327, :_reduce_569, + 2, 327, :_reduce_570, + 4, 327, :_reduce_571, + 2, 327, :_reduce_572, + 1, 189, :_reduce_none, + 1, 189, :_reduce_none, + 1, 189, :_reduce_none, + 1, 183, :_reduce_none, + 1, 183, :_reduce_none, + 1, 183, :_reduce_none, + 1, 183, :_reduce_none, + 1, 291, :_reduce_none, + 1, 291, :_reduce_none, + 1, 291, :_reduce_none, + 1, 182, :_reduce_none, + 1, 182, :_reduce_none, + 1, 170, :_reduce_585, + 1, 170, :_reduce_586, + 0, 149, :_reduce_none, + 1, 149, :_reduce_none, + 0, 177, :_reduce_none, + 1, 177, :_reduce_none, + 2, 193, :_reduce_591, + 2, 169, :_reduce_592, + 0, 215, :_reduce_none, + 1, 215, :_reduce_none, + 1, 215, :_reduce_none, + 1, 242, :_reduce_596, + 1, 242, :_reduce_none, + 1, 151, :_reduce_none, + 2, 151, :_reduce_none, + 0, 213, :_reduce_600 ] + +racc_reduce_n = 601 + +racc_shift_n = 1026 + +racc_token_table = { + false => 0, + :error => 1, + :kCLASS => 2, + :kMODULE => 3, + :kDEF => 4, + :kUNDEF => 5, + :kBEGIN => 6, + :kRESCUE => 7, + :kENSURE => 8, + :kEND => 9, + :kIF => 10, + :kUNLESS => 11, + :kTHEN => 12, + :kELSIF => 13, + :kELSE => 14, + :kCASE => 15, + :kWHEN => 16, + :kWHILE => 17, + :kUNTIL => 18, + :kFOR => 19, + :kBREAK => 20, + :kNEXT => 21, + :kREDO => 22, + :kRETRY => 23, + :kIN => 24, + :kDO => 25, + :kDO_COND => 26, + :kDO_BLOCK => 27, + :kDO_LAMBDA => 28, + :kRETURN => 29, + :kYIELD => 30, + :kSUPER => 31, + :kSELF => 32, + :kNIL => 33, + :kTRUE => 34, + :kFALSE => 35, + :kAND => 36, + :kOR => 37, + :kNOT => 38, + :kIF_MOD => 39, + :kUNLESS_MOD => 40, + :kWHILE_MOD => 41, + :kUNTIL_MOD => 42, + :kRESCUE_MOD => 43, + :kALIAS => 44, + :kDEFINED => 45, + :klBEGIN => 46, + :klEND => 47, + :k__LINE__ => 48, + :k__FILE__ => 49, + :k__ENCODING__ => 50, + :tIDENTIFIER => 51, + :tFID => 52, + :tGVAR => 53, + :tIVAR => 54, + :tCONSTANT => 55, + :tLABEL => 56, + :tCVAR => 57, + :tNTH_REF => 58, + :tBACK_REF => 59, + :tSTRING_CONTENT => 60, + :tINTEGER => 61, + :tFLOAT => 62, + :tUPLUS => 63, + :tUMINUS => 64, + :tUNARY_NUM => 65, + :tPOW => 66, + :tCMP => 67, + :tEQ => 68, + :tEQQ => 69, + :tNEQ => 70, + :tGEQ => 71, + :tLEQ => 72, + :tANDOP => 73, + :tOROP => 74, + :tMATCH => 75, + :tNMATCH => 76, + :tDOT => 77, + :tDOT2 => 78, + :tDOT3 => 79, + :tAREF => 80, + :tASET => 81, + :tLSHFT => 82, + :tRSHFT => 83, + :tCOLON2 => 84, + :tCOLON3 => 85, + :tOP_ASGN => 86, + :tASSOC => 87, + :tLPAREN => 88, + :tLPAREN2 => 89, + :tRPAREN => 90, + :tLPAREN_ARG => 91, + :tLBRACK => 92, + :tLBRACK2 => 93, + :tRBRACK => 94, + :tLBRACE => 95, + :tLBRACE_ARG => 96, + :tSTAR => 97, + :tSTAR2 => 98, + :tAMPER => 99, + :tAMPER2 => 100, + :tTILDE => 101, + :tPERCENT => 102, + :tDIVIDE => 103, + :tDSTAR => 104, + :tPLUS => 105, + :tMINUS => 106, + :tLT => 107, + :tGT => 108, + :tPIPE => 109, + :tBANG => 110, + :tCARET => 111, + :tLCURLY => 112, + :tRCURLY => 113, + :tBACK_REF2 => 114, + :tSYMBEG => 115, + :tSTRING_BEG => 116, + :tXSTRING_BEG => 117, + :tREGEXP_BEG => 118, + :tREGEXP_OPT => 119, + :tWORDS_BEG => 120, + :tQWORDS_BEG => 121, + :tSYMBOLS_BEG => 122, + :tQSYMBOLS_BEG => 123, + :tSTRING_DBEG => 124, + :tSTRING_DVAR => 125, + :tSTRING_END => 126, + :tSTRING_DEND => 127, + :tSTRING => 128, + :tSYMBOL => 129, + :tNL => 130, + :tEH => 131, + :tCOLON => 132, + :tCOMMA => 133, + :tSPACE => 134, + :tSEMI => 135, + :tLAMBDA => 136, + :tLAMBEG => 137, + :tCHARACTER => 138, + :tRATIONAL => 139, + :tIMAGINARY => 140, + :tLABEL_END => 141, + :tANDDOT => 142, + :tEQL => 143, + :tLOWEST => 144 } + +racc_nt_base = 145 + +racc_use_result_var = true + +Racc_arg = [ + racc_action_table, + racc_action_check, + racc_action_default, + racc_action_pointer, + racc_goto_table, + racc_goto_check, + racc_goto_default, + racc_goto_pointer, + racc_nt_base, + racc_reduce_table, + racc_token_table, + racc_shift_n, + racc_reduce_n, + racc_use_result_var ] + +Racc_token_to_s_table = [ + "$end", + "error", + "kCLASS", + "kMODULE", + "kDEF", + "kUNDEF", + "kBEGIN", + "kRESCUE", + "kENSURE", + "kEND", + "kIF", + "kUNLESS", + "kTHEN", + "kELSIF", + "kELSE", + "kCASE", + "kWHEN", + "kWHILE", + "kUNTIL", + "kFOR", + "kBREAK", + "kNEXT", + "kREDO", + "kRETRY", + "kIN", + "kDO", + "kDO_COND", + "kDO_BLOCK", + "kDO_LAMBDA", + "kRETURN", + "kYIELD", + "kSUPER", + "kSELF", + "kNIL", + "kTRUE", + "kFALSE", + "kAND", + "kOR", + "kNOT", + "kIF_MOD", + "kUNLESS_MOD", + "kWHILE_MOD", + "kUNTIL_MOD", + "kRESCUE_MOD", + "kALIAS", + "kDEFINED", + "klBEGIN", + "klEND", + "k__LINE__", + "k__FILE__", + "k__ENCODING__", + "tIDENTIFIER", + "tFID", + "tGVAR", + "tIVAR", + "tCONSTANT", + "tLABEL", + "tCVAR", + "tNTH_REF", + "tBACK_REF", + "tSTRING_CONTENT", + "tINTEGER", + "tFLOAT", + "tUPLUS", + "tUMINUS", + "tUNARY_NUM", + "tPOW", + "tCMP", + "tEQ", + "tEQQ", + "tNEQ", + "tGEQ", + "tLEQ", + "tANDOP", + "tOROP", + "tMATCH", + "tNMATCH", + "tDOT", + "tDOT2", + "tDOT3", + "tAREF", + "tASET", + "tLSHFT", + "tRSHFT", + "tCOLON2", + "tCOLON3", + "tOP_ASGN", + "tASSOC", + "tLPAREN", + "tLPAREN2", + "tRPAREN", + "tLPAREN_ARG", + "tLBRACK", + "tLBRACK2", + "tRBRACK", + "tLBRACE", + "tLBRACE_ARG", + "tSTAR", + "tSTAR2", + "tAMPER", + "tAMPER2", + "tTILDE", + "tPERCENT", + "tDIVIDE", + "tDSTAR", + "tPLUS", + "tMINUS", + "tLT", + "tGT", + "tPIPE", + "tBANG", + "tCARET", + "tLCURLY", + "tRCURLY", + "tBACK_REF2", + "tSYMBEG", + "tSTRING_BEG", + "tXSTRING_BEG", + "tREGEXP_BEG", + "tREGEXP_OPT", + "tWORDS_BEG", + "tQWORDS_BEG", + "tSYMBOLS_BEG", + "tQSYMBOLS_BEG", + "tSTRING_DBEG", + "tSTRING_DVAR", + "tSTRING_END", + "tSTRING_DEND", + "tSTRING", + "tSYMBOL", + "tNL", + "tEH", + "tCOLON", + "tCOMMA", + "tSPACE", + "tSEMI", + "tLAMBDA", + "tLAMBEG", + "tCHARACTER", + "tRATIONAL", + "tIMAGINARY", + "tLABEL_END", + "tANDDOT", + "tEQL", + "tLOWEST", + "$start", + "program", + "top_compstmt", + "top_stmts", + "opt_terms", + "top_stmt", + "terms", + "stmt", + "bodystmt", + "compstmt", + "opt_rescue", + "opt_else", + "opt_ensure", + "stmts", + "stmt_or_begin", + "fitem", + "undef_list", + "expr_value", + "command_asgn", + "mlhs", + "command_call", + "var_lhs", + "primary_value", + "opt_call_args", + "rbracket", + "call_op", + "backref", + "lhs", + "mrhs", + "mrhs_arg", + "expr", + "@1", + "opt_nl", + "arg", + "command", + "block_command", + "block_call", + "dot_or_colon", + "operation2", + "command_args", + "cmd_brace_block", + "opt_block_param", + "fcall", + "@2", + "operation", + "call_args", + "mlhs_basic", + "mlhs_inner", + "rparen", + "mlhs_head", + "mlhs_item", + "mlhs_node", + "mlhs_post", + "user_variable", + "keyword_variable", + "cname", + "cpath", + "fname", + "op", + "reswords", + "fsym", + "symbol", + "dsym", + "@3", + "simple_numeric", + "primary", + "arg_value", + "aref_args", + "none", + "args", + "trailer", + "assocs", + "paren_args", + "opt_paren_args", + "opt_block_arg", + "block_arg", + "@4", + "literal", + "strings", + "xstring", + "regexp", + "words", + "qwords", + "symbols", + "qsymbols", + "var_ref", + "assoc_list", + "brace_block", + "method_call", + "lambda", + "then", + "if_tail", + "do", + "case_body", + "for_var", + "k_class", + "superclass", + "term", + "k_module", + "f_arglist", + "singleton", + "@5", + "@6", + "@7", + "@8", + "@9", + "@10", + "@11", + "@12", + "@13", + "@14", + "@15", + "@16", + "@17", + "@18", + "@19", + "@20", + "@21", + "f_marg", + "f_norm_arg", + "f_margs", + "f_marg_list", + "block_args_tail", + "f_block_kwarg", + "f_kwrest", + "opt_f_block_arg", + "f_block_arg", + "opt_block_args_tail", + "block_param", + "f_arg", + "f_block_optarg", + "f_rest_arg", + "block_param_def", + "opt_bv_decl", + "bv_decls", + "bvar", + "f_bad_arg", + "f_larglist", + "lambda_body", + "@22", + "@23", + "f_args", + "do_block", + "@24", + "@25", + "@26", + "operation3", + "@27", + "@28", + "cases", + "exc_list", + "exc_var", + "numeric", + "string", + "string1", + "string_contents", + "xstring_contents", + "regexp_contents", + "word_list", + "word", + "string_content", + "symbol_list", + "qword_list", + "qsym_list", + "string_dvar", + "@29", + "@30", + "args_tail", + "@31", + "f_kwarg", + "opt_args_tail", + "f_optarg", + "f_arg_asgn", + "f_arg_item", + "f_label", + "f_kw", + "f_block_kw", + "kwrest_mark", + "f_opt", + "f_block_opt", + "restarg_mark", + "blkarg_mark", + "assoc" ] + +Racc_debug_parser = false + +##### State transition tables end ##### + +# reduce 0 omitted + +# reduce 1 omitted + +def _reduce_2(val, _values, result) + result = @builder.compstmt(val[0]) + + result +end + +def _reduce_3(val, _values, result) + result = [] + + result +end + +def _reduce_4(val, _values, result) + result = [ val[0] ] + + result +end + +def _reduce_5(val, _values, result) + result = val[0] << val[2] + + result +end + +def _reduce_6(val, _values, result) + result = [ val[1] ] + + result +end + +# reduce 7 omitted + +def _reduce_8(val, _values, result) + result = @builder.preexe(val[0], val[1], val[2], val[3]) + + result +end + +def _reduce_9(val, _values, result) + rescue_bodies = val[1] + else_t, else_ = val[2] + ensure_t, ensure_ = val[3] + + if rescue_bodies.empty? && !else_t.nil? + diagnostic :warning, :useless_else, nil, else_t + end + + result = @builder.begin_body(val[0], + rescue_bodies, + else_t, else_, + ensure_t, ensure_) + + result +end + +def _reduce_10(val, _values, result) + result = @builder.compstmt(val[0]) + + result +end + +def _reduce_11(val, _values, result) + result = [] + + result +end + +def _reduce_12(val, _values, result) + result = [ val[0] ] + + result +end + +def _reduce_13(val, _values, result) + result = val[0] << val[2] + + result +end + +def _reduce_14(val, _values, result) + result = [ val[1] ] + + result +end + +# reduce 15 omitted + +def _reduce_16(val, _values, result) + diagnostic :error, :begin_in_method, nil, val[0] + + result +end + +def _reduce_17(val, _values, result) + @lexer.state = :expr_fname + + result +end + +def _reduce_18(val, _values, result) + result = @builder.alias(val[0], val[1], val[3]) + + result +end + +def _reduce_19(val, _values, result) + result = @builder.alias(val[0], + @builder.gvar(val[1]), + @builder.gvar(val[2])) + + result +end + +def _reduce_20(val, _values, result) + result = @builder.alias(val[0], + @builder.gvar(val[1]), + @builder.back_ref(val[2])) + + result +end + +def _reduce_21(val, _values, result) + diagnostic :error, :nth_ref_alias, nil, val[2] + + result +end + +def _reduce_22(val, _values, result) + result = @builder.undef_method(val[0], val[1]) + + result +end + +def _reduce_23(val, _values, result) + result = @builder.condition_mod(val[0], nil, + val[1], val[2]) + + result +end + +def _reduce_24(val, _values, result) + result = @builder.condition_mod(nil, val[0], + val[1], val[2]) + + result +end + +def _reduce_25(val, _values, result) + result = @builder.loop_mod(:while, val[0], val[1], val[2]) + + result +end + +def _reduce_26(val, _values, result) + result = @builder.loop_mod(:until, val[0], val[1], val[2]) + + result +end + +def _reduce_27(val, _values, result) + rescue_body = @builder.rescue_body(val[1], + nil, nil, nil, + nil, val[2]) + + result = @builder.begin_body(val[0], [ rescue_body ]) + + result +end + +def _reduce_28(val, _values, result) + result = @builder.postexe(val[0], val[1], val[2], val[3]) + + result +end + +# reduce 29 omitted + +def _reduce_30(val, _values, result) + result = @builder.multi_assign(val[0], val[1], val[2]) + + result +end + +def _reduce_31(val, _values, result) + result = @builder.op_assign(val[0], val[1], val[2]) + + result +end + +def _reduce_32(val, _values, result) + result = @builder.op_assign( + @builder.index( + val[0], val[1], val[2], val[3]), + val[4], val[5]) + + result +end + +def _reduce_33(val, _values, result) + result = @builder.op_assign( + @builder.call_method( + val[0], val[1], val[2]), + val[3], val[4]) + + result +end + +def _reduce_34(val, _values, result) + result = @builder.op_assign( + @builder.call_method( + val[0], val[1], val[2]), + val[3], val[4]) + + result +end + +def _reduce_35(val, _values, result) + const = @builder.const_op_assignable( + @builder.const_fetch(val[0], val[1], val[2])) + result = @builder.op_assign(const, val[3], val[4]) + + result +end + +def _reduce_36(val, _values, result) + result = @builder.op_assign( + @builder.call_method( + val[0], val[1], val[2]), + val[3], val[4]) + + result +end + +def _reduce_37(val, _values, result) + @builder.op_assign(val[0], val[1], val[2]) + + result +end + +def _reduce_38(val, _values, result) + result = @builder.assign(val[0], val[1], + @builder.array(nil, val[2], nil)) + + result +end + +def _reduce_39(val, _values, result) + result = @builder.multi_assign(val[0], val[1], val[2]) + + result +end + +# reduce 40 omitted + +def _reduce_41(val, _values, result) + result = @builder.assign(val[0], val[1], val[2]) + + result +end + +def _reduce_42(val, _values, result) + result = @builder.assign(val[0], val[1], val[2]) + + result +end + +# reduce 43 omitted + +def _reduce_44(val, _values, result) + result = @builder.logical_op(:and, val[0], val[1], val[2]) + + result +end + +def _reduce_45(val, _values, result) + result = @builder.logical_op(:or, val[0], val[1], val[2]) + + result +end + +def _reduce_46(val, _values, result) + result = @builder.not_op(val[0], nil, val[2], nil) + + result +end + +def _reduce_47(val, _values, result) + result = @builder.not_op(val[0], nil, val[1], nil) + + result +end + +# reduce 48 omitted + +# reduce 49 omitted + +# reduce 50 omitted + +# reduce 51 omitted + +# reduce 52 omitted + +def _reduce_53(val, _values, result) + result = @builder.call_method(val[0], val[1], val[2], + nil, val[3], nil) + + result +end + +def _reduce_54(val, _values, result) + @static_env.extend_dynamic + result = @context.dup + @context.in_block = true + + result +end + +def _reduce_55(val, _values, result) + result = [ val[0], val[2], val[3], val[4] ] + + @static_env.unextend + @context.in_block = val[1].in_block + + result +end + +# reduce 56 omitted + +def _reduce_57(val, _values, result) + result = @builder.call_method(nil, nil, val[0], + nil, val[1], nil) + + result +end + +def _reduce_58(val, _values, result) + method_call = @builder.call_method(nil, nil, val[0], + nil, val[1], nil) + + begin_t, args, body, end_t = val[2] + result = @builder.block(method_call, + begin_t, args, body, end_t) + + result +end + +def _reduce_59(val, _values, result) + result = @builder.call_method(val[0], val[1], val[2], + nil, val[3], nil) + + result +end + +def _reduce_60(val, _values, result) + method_call = @builder.call_method(val[0], val[1], val[2], + nil, val[3], nil) + + begin_t, args, body, end_t = val[4] + result = @builder.block(method_call, + begin_t, args, body, end_t) + + result +end + +def _reduce_61(val, _values, result) + result = @builder.call_method(val[0], val[1], val[2], + nil, val[3], nil) + + result +end + +def _reduce_62(val, _values, result) + method_call = @builder.call_method(val[0], val[1], val[2], + nil, val[3], nil) + + begin_t, args, body, end_t = val[4] + result = @builder.block(method_call, + begin_t, args, body, end_t) + + result +end + +def _reduce_63(val, _values, result) + result = @builder.keyword_cmd(:super, val[0], + nil, val[1], nil) + + result +end + +def _reduce_64(val, _values, result) + result = @builder.keyword_cmd(:yield, val[0], + nil, val[1], nil) + + result +end + +def _reduce_65(val, _values, result) + result = @builder.keyword_cmd(:return, val[0], + nil, val[1], nil) + + result +end + +def _reduce_66(val, _values, result) + result = @builder.keyword_cmd(:break, val[0], + nil, val[1], nil) + + result +end + +def _reduce_67(val, _values, result) + result = @builder.keyword_cmd(:next, val[0], + nil, val[1], nil) + + result +end + +def _reduce_68(val, _values, result) + result = @builder.multi_lhs(nil, val[0], nil) + + result +end + +def _reduce_69(val, _values, result) + result = @builder.begin(val[0], val[1], val[2]) + + result +end + +def _reduce_70(val, _values, result) + result = @builder.multi_lhs(nil, val[0], nil) + + result +end + +def _reduce_71(val, _values, result) + result = @builder.multi_lhs(val[0], val[1], val[2]) + + result +end + +# reduce 72 omitted + +def _reduce_73(val, _values, result) + result = val[0]. + push(val[1]) + + result +end + +def _reduce_74(val, _values, result) + result = val[0]. + push(@builder.splat(val[1], val[2])) + + result +end + +def _reduce_75(val, _values, result) + result = val[0]. + push(@builder.splat(val[1], val[2])). + concat(val[4]) + + result +end + +def _reduce_76(val, _values, result) + result = val[0]. + push(@builder.splat(val[1])) + + result +end + +def _reduce_77(val, _values, result) + result = val[0]. + push(@builder.splat(val[1])). + concat(val[3]) + + result +end + +def _reduce_78(val, _values, result) + result = [ @builder.splat(val[0], val[1]) ] + + result +end + +def _reduce_79(val, _values, result) + result = [ @builder.splat(val[0], val[1]), + *val[3] ] + + result +end + +def _reduce_80(val, _values, result) + result = [ @builder.splat(val[0]) ] + + result +end + +def _reduce_81(val, _values, result) + result = [ @builder.splat(val[0]), + *val[2] ] + + result +end + +# reduce 82 omitted + +def _reduce_83(val, _values, result) + result = @builder.begin(val[0], val[1], val[2]) + + result +end + +def _reduce_84(val, _values, result) + result = [ val[0] ] + + result +end + +def _reduce_85(val, _values, result) + result = val[0] << val[1] + + result +end + +def _reduce_86(val, _values, result) + result = [ val[0] ] + + result +end + +def _reduce_87(val, _values, result) + result = val[0] << val[2] + + result +end + +def _reduce_88(val, _values, result) + result = @builder.assignable(val[0]) + + result +end + +def _reduce_89(val, _values, result) + result = @builder.assignable(val[0]) + + result +end + +def _reduce_90(val, _values, result) + result = @builder.index_asgn(val[0], val[1], val[2], val[3]) + + result +end + +def _reduce_91(val, _values, result) + result = @builder.attr_asgn(val[0], val[1], val[2]) + + result +end + +def _reduce_92(val, _values, result) + result = @builder.attr_asgn(val[0], val[1], val[2]) + + result +end + +def _reduce_93(val, _values, result) + result = @builder.attr_asgn(val[0], val[1], val[2]) + + result +end + +def _reduce_94(val, _values, result) + result = @builder.assignable( + @builder.const_fetch(val[0], val[1], val[2])) + + result +end + +def _reduce_95(val, _values, result) + result = @builder.assignable( + @builder.const_global(val[0], val[1])) + + result +end + +def _reduce_96(val, _values, result) + result = @builder.assignable(val[0]) + + result +end + +def _reduce_97(val, _values, result) + result = @builder.assignable(val[0]) + + result +end + +def _reduce_98(val, _values, result) + result = @builder.assignable(val[0]) + + result +end + +def _reduce_99(val, _values, result) + result = @builder.index_asgn(val[0], val[1], val[2], val[3]) + + result +end + +def _reduce_100(val, _values, result) + result = @builder.attr_asgn(val[0], val[1], val[2]) + + result +end + +def _reduce_101(val, _values, result) + result = @builder.attr_asgn(val[0], val[1], val[2]) + + result +end + +def _reduce_102(val, _values, result) + result = @builder.attr_asgn(val[0], val[1], val[2]) + + result +end + +def _reduce_103(val, _values, result) + result = @builder.assignable( + @builder.const_fetch(val[0], val[1], val[2])) + + result +end + +def _reduce_104(val, _values, result) + result = @builder.assignable( + @builder.const_global(val[0], val[1])) + + result +end + +def _reduce_105(val, _values, result) + result = @builder.assignable(val[0]) + + result +end + +def _reduce_106(val, _values, result) + diagnostic :error, :module_name_const, nil, val[0] + + result +end + +# reduce 107 omitted + +def _reduce_108(val, _values, result) + result = @builder.const_global(val[0], val[1]) + + result +end + +def _reduce_109(val, _values, result) + result = @builder.const(val[0]) + + result +end + +def _reduce_110(val, _values, result) + result = @builder.const_fetch(val[0], val[1], val[2]) + + result +end + +# reduce 111 omitted + +# reduce 112 omitted + +# reduce 113 omitted + +# reduce 114 omitted + +# reduce 115 omitted + +def _reduce_116(val, _values, result) + result = @builder.symbol_internal(val[0]) + + result +end + +# reduce 117 omitted + +# reduce 118 omitted + +# reduce 119 omitted + +def _reduce_120(val, _values, result) + result = [ val[0] ] + + result +end + +def _reduce_121(val, _values, result) + @lexer.state = :expr_fname + + result +end + +def _reduce_122(val, _values, result) + result = val[0] << val[3] + + result +end + +# reduce 123 omitted + +# reduce 124 omitted + +# reduce 125 omitted + +# reduce 126 omitted + +# reduce 127 omitted + +# reduce 128 omitted + +# reduce 129 omitted + +# reduce 130 omitted + +# reduce 131 omitted + +# reduce 132 omitted + +# reduce 133 omitted + +# reduce 134 omitted + +# reduce 135 omitted + +# reduce 136 omitted + +# reduce 137 omitted + +# reduce 138 omitted + +# reduce 139 omitted + +# reduce 140 omitted + +# reduce 141 omitted + +# reduce 142 omitted + +# reduce 143 omitted + +# reduce 144 omitted + +# reduce 145 omitted + +# reduce 146 omitted + +# reduce 147 omitted + +# reduce 148 omitted + +# reduce 149 omitted + +# reduce 150 omitted + +# reduce 151 omitted + +# reduce 152 omitted + +# reduce 153 omitted + +# reduce 154 omitted + +# reduce 155 omitted + +# reduce 156 omitted + +# reduce 157 omitted + +# reduce 158 omitted + +# reduce 159 omitted + +# reduce 160 omitted + +# reduce 161 omitted + +# reduce 162 omitted + +# reduce 163 omitted + +# reduce 164 omitted + +# reduce 165 omitted + +# reduce 166 omitted + +# reduce 167 omitted + +# reduce 168 omitted + +# reduce 169 omitted + +# reduce 170 omitted + +# reduce 171 omitted + +# reduce 172 omitted + +# reduce 173 omitted + +# reduce 174 omitted + +# reduce 175 omitted + +# reduce 176 omitted + +# reduce 177 omitted + +# reduce 178 omitted + +# reduce 179 omitted + +# reduce 180 omitted + +# reduce 181 omitted + +# reduce 182 omitted + +# reduce 183 omitted + +# reduce 184 omitted + +# reduce 185 omitted + +# reduce 186 omitted + +# reduce 187 omitted + +# reduce 188 omitted + +# reduce 189 omitted + +# reduce 190 omitted + +# reduce 191 omitted + +# reduce 192 omitted + +# reduce 193 omitted + +def _reduce_194(val, _values, result) + result = @builder.assign(val[0], val[1], val[2]) + + result +end + +def _reduce_195(val, _values, result) + rescue_body = @builder.rescue_body(val[3], + nil, nil, nil, + nil, val[4]) + + rescue_ = @builder.begin_body(val[2], [ rescue_body ]) + + result = @builder.assign(val[0], val[1], rescue_) + + result +end + +def _reduce_196(val, _values, result) + result = @builder.op_assign(val[0], val[1], val[2]) + + result +end + +def _reduce_197(val, _values, result) + rescue_body = @builder.rescue_body(val[3], + nil, nil, nil, + nil, val[4]) + + rescue_ = @builder.begin_body(val[2], [ rescue_body ]) + + result = @builder.op_assign(val[0], val[1], rescue_) + + result +end + +def _reduce_198(val, _values, result) + result = @builder.op_assign( + @builder.index( + val[0], val[1], val[2], val[3]), + val[4], val[5]) + + result +end + +def _reduce_199(val, _values, result) + result = @builder.op_assign( + @builder.call_method( + val[0], val[1], val[2]), + val[3], val[4]) + + result +end + +def _reduce_200(val, _values, result) + result = @builder.op_assign( + @builder.call_method( + val[0], val[1], val[2]), + val[3], val[4]) + + result +end + +def _reduce_201(val, _values, result) + result = @builder.op_assign( + @builder.call_method( + val[0], val[1], val[2]), + val[3], val[4]) + + result +end + +def _reduce_202(val, _values, result) + const = @builder.const_op_assignable( + @builder.const_fetch(val[0], val[1], val[2])) + result = @builder.op_assign(const, val[3], val[4]) + + result +end + +def _reduce_203(val, _values, result) + const = @builder.const_op_assignable( + @builder.const_global(val[0], val[1])) + result = @builder.op_assign(const, val[2], val[3]) + + result +end + +def _reduce_204(val, _values, result) + result = @builder.op_assign(val[0], val[1], val[2]) + + result +end + +def _reduce_205(val, _values, result) + result = @builder.range_inclusive(val[0], val[1], val[2]) + + result +end + +def _reduce_206(val, _values, result) + result = @builder.range_exclusive(val[0], val[1], val[2]) + + result +end + +def _reduce_207(val, _values, result) + result = @builder.binary_op(val[0], val[1], val[2]) + + result +end + +def _reduce_208(val, _values, result) + result = @builder.binary_op(val[0], val[1], val[2]) + + result +end + +def _reduce_209(val, _values, result) + result = @builder.binary_op(val[0], val[1], val[2]) + + result +end + +def _reduce_210(val, _values, result) + result = @builder.binary_op(val[0], val[1], val[2]) + + result +end + +def _reduce_211(val, _values, result) + result = @builder.binary_op(val[0], val[1], val[2]) + + result +end + +def _reduce_212(val, _values, result) + result = @builder.binary_op(val[0], val[1], val[2]) + + result +end + +def _reduce_213(val, _values, result) + result = @builder.unary_op(val[0], + @builder.binary_op( + val[1], val[2], val[3])) + + result +end + +def _reduce_214(val, _values, result) + result = @builder.unary_op(val[0], val[1]) + + result +end + +def _reduce_215(val, _values, result) + result = @builder.unary_op(val[0], val[1]) + + result +end + +def _reduce_216(val, _values, result) + result = @builder.binary_op(val[0], val[1], val[2]) + + result +end + +def _reduce_217(val, _values, result) + result = @builder.binary_op(val[0], val[1], val[2]) + + result +end + +def _reduce_218(val, _values, result) + result = @builder.binary_op(val[0], val[1], val[2]) + + result +end + +def _reduce_219(val, _values, result) + result = @builder.binary_op(val[0], val[1], val[2]) + + result +end + +def _reduce_220(val, _values, result) + result = @builder.binary_op(val[0], val[1], val[2]) + + result +end + +def _reduce_221(val, _values, result) + result = @builder.binary_op(val[0], val[1], val[2]) + + result +end + +def _reduce_222(val, _values, result) + result = @builder.binary_op(val[0], val[1], val[2]) + + result +end + +def _reduce_223(val, _values, result) + result = @builder.binary_op(val[0], val[1], val[2]) + + result +end + +def _reduce_224(val, _values, result) + result = @builder.binary_op(val[0], val[1], val[2]) + + result +end + +def _reduce_225(val, _values, result) + result = @builder.binary_op(val[0], val[1], val[2]) + + result +end + +def _reduce_226(val, _values, result) + result = @builder.binary_op(val[0], val[1], val[2]) + + result +end + +def _reduce_227(val, _values, result) + result = @builder.match_op(val[0], val[1], val[2]) + + result +end + +def _reduce_228(val, _values, result) + result = @builder.binary_op(val[0], val[1], val[2]) + + result +end + +def _reduce_229(val, _values, result) + result = @builder.not_op(val[0], nil, val[1], nil) + + result +end + +def _reduce_230(val, _values, result) + result = @builder.unary_op(val[0], val[1]) + + result +end + +def _reduce_231(val, _values, result) + result = @builder.binary_op(val[0], val[1], val[2]) + + result +end + +def _reduce_232(val, _values, result) + result = @builder.binary_op(val[0], val[1], val[2]) + + result +end + +def _reduce_233(val, _values, result) + result = @builder.logical_op(:and, val[0], val[1], val[2]) + + result +end + +def _reduce_234(val, _values, result) + result = @builder.logical_op(:or, val[0], val[1], val[2]) + + result +end + +def _reduce_235(val, _values, result) + result = @builder.keyword_cmd(:defined?, val[0], nil, [ val[2] ], nil) + + result +end + +def _reduce_236(val, _values, result) + result = @builder.ternary(val[0], val[1], + val[2], val[4], val[5]) + + result +end + +# reduce 237 omitted + +# reduce 238 omitted + +# reduce 239 omitted + +# reduce 240 omitted + +def _reduce_241(val, _values, result) + result = val[0] << @builder.associate(nil, val[2], nil) + + result +end + +def _reduce_242(val, _values, result) + result = [ @builder.associate(nil, val[0], nil) ] + + result +end + +def _reduce_243(val, _values, result) + result = val + + result +end + +def _reduce_244(val, _values, result) + result = [ nil, [], nil ] + + result +end + +# reduce 245 omitted + +def _reduce_246(val, _values, result) + result = [] + + result +end + +# reduce 247 omitted + +# reduce 248 omitted + +def _reduce_249(val, _values, result) + result = val[0] << @builder.associate(nil, val[2], nil) + + result +end + +def _reduce_250(val, _values, result) + result = [ @builder.associate(nil, val[0], nil) ] + + result +end + +def _reduce_251(val, _values, result) + result = [ val[0] ] + + result +end + +def _reduce_252(val, _values, result) + result = val[0].concat(val[1]) + + result +end + +def _reduce_253(val, _values, result) + result = [ @builder.associate(nil, val[0], nil) ] + result.concat(val[1]) + + result +end + +def _reduce_254(val, _values, result) + assocs = @builder.associate(nil, val[2], nil) + result = val[0] << assocs + result.concat(val[3]) + + result +end + +def _reduce_255(val, _values, result) + result = [ val[0] ] + + result +end + +def _reduce_256(val, _values, result) + result = @lexer.cmdarg.dup + @lexer.cmdarg.push(true) + + result +end + +def _reduce_257(val, _values, result) + @lexer.cmdarg = val[0] + + result = val[1] + + result +end + +def _reduce_258(val, _values, result) + result = @builder.block_pass(val[0], val[1]) + + result +end + +def _reduce_259(val, _values, result) + result = [ val[1] ] + + result +end + +def _reduce_260(val, _values, result) + result = [] + + result +end + +def _reduce_261(val, _values, result) + result = [ val[0] ] + + result +end + +def _reduce_262(val, _values, result) + result = [ @builder.splat(val[0], val[1]) ] + + result +end + +def _reduce_263(val, _values, result) + result = val[0] << val[2] + + result +end + +def _reduce_264(val, _values, result) + result = val[0] << @builder.splat(val[2], val[3]) + + result +end + +def _reduce_265(val, _values, result) + result = @builder.array(nil, val[0], nil) + + result +end + +# reduce 266 omitted + +def _reduce_267(val, _values, result) + result = val[0] << val[2] + + result +end + +def _reduce_268(val, _values, result) + result = val[0] << @builder.splat(val[2], val[3]) + + result +end + +def _reduce_269(val, _values, result) + result = [ @builder.splat(val[0], val[1]) ] + + result +end + +# reduce 270 omitted + +# reduce 271 omitted + +# reduce 272 omitted + +# reduce 273 omitted + +# reduce 274 omitted + +# reduce 275 omitted + +# reduce 276 omitted + +# reduce 277 omitted + +# reduce 278 omitted + +# reduce 279 omitted + +def _reduce_280(val, _values, result) + result = @builder.call_method(nil, nil, val[0]) + + result +end + +def _reduce_281(val, _values, result) + result = @lexer.cmdarg.dup + @lexer.cmdarg.clear + + result +end + +def _reduce_282(val, _values, result) + @lexer.cmdarg = val[1] + + result = @builder.begin_keyword(val[0], val[2], val[3]) + + result +end + +def _reduce_283(val, _values, result) + result = @lexer.cmdarg.dup + @lexer.cmdarg.clear + + result +end + +def _reduce_284(val, _values, result) + @lexer.state = :expr_endarg + + result +end + +def _reduce_285(val, _values, result) + @lexer.cmdarg = val[1] + + result = @builder.begin(val[0], val[2], val[5]) + + result +end + +def _reduce_286(val, _values, result) + @lexer.state = :expr_endarg + + result +end + +def _reduce_287(val, _values, result) + result = @builder.begin(val[0], nil, val[3]) + + result +end + +def _reduce_288(val, _values, result) + result = @builder.begin(val[0], val[1], val[2]) + + result +end + +def _reduce_289(val, _values, result) + result = @builder.const_fetch(val[0], val[1], val[2]) + + result +end + +def _reduce_290(val, _values, result) + result = @builder.const_global(val[0], val[1]) + + result +end + +def _reduce_291(val, _values, result) + result = @builder.array(val[0], val[1], val[2]) + + result +end + +def _reduce_292(val, _values, result) + result = @builder.associate(val[0], val[1], val[2]) + + result +end + +def _reduce_293(val, _values, result) + result = @builder.keyword_cmd(:return, val[0]) + + result +end + +def _reduce_294(val, _values, result) + result = @builder.keyword_cmd(:yield, val[0], val[1], val[2], val[3]) + + result +end + +def _reduce_295(val, _values, result) + result = @builder.keyword_cmd(:yield, val[0], val[1], [], val[2]) + + result +end + +def _reduce_296(val, _values, result) + result = @builder.keyword_cmd(:yield, val[0]) + + result +end + +def _reduce_297(val, _values, result) + result = @builder.keyword_cmd(:defined?, val[0], + val[2], [ val[3] ], val[4]) + + result +end + +def _reduce_298(val, _values, result) + result = @builder.not_op(val[0], val[1], val[2], val[3]) + + result +end + +def _reduce_299(val, _values, result) + result = @builder.not_op(val[0], val[1], nil, val[2]) + + result +end + +def _reduce_300(val, _values, result) + method_call = @builder.call_method(nil, nil, val[0]) + + begin_t, args, body, end_t = val[1] + result = @builder.block(method_call, + begin_t, args, body, end_t) + + result +end + +# reduce 301 omitted + +def _reduce_302(val, _values, result) + begin_t, args, body, end_t = val[1] + result = @builder.block(val[0], + begin_t, args, body, end_t) + + result +end + +def _reduce_303(val, _values, result) + result = @context.dup + @context.in_lambda = true + + result +end + +def _reduce_304(val, _values, result) + lambda_call = @builder.call_lambda(val[0]) + + args, (begin_t, body, end_t) = val[2] + result = @builder.block(lambda_call, + begin_t, args, body, end_t) + + @context.in_lambda = val[1].in_lambda + + result +end + +def _reduce_305(val, _values, result) + else_t, else_ = val[4] + result = @builder.condition(val[0], val[1], val[2], + val[3], else_t, + else_, val[5]) + + result +end + +def _reduce_306(val, _values, result) + else_t, else_ = val[4] + result = @builder.condition(val[0], val[1], val[2], + else_, else_t, + val[3], val[5]) + + result +end + +def _reduce_307(val, _values, result) + @lexer.cond.push(true) + + result +end + +def _reduce_308(val, _values, result) + @lexer.cond.pop + + result +end + +def _reduce_309(val, _values, result) + result = @builder.loop(:while, val[0], val[2], val[3], + val[5], val[6]) + + result +end + +def _reduce_310(val, _values, result) + @lexer.cond.push(true) + + result +end + +def _reduce_311(val, _values, result) + @lexer.cond.pop + + result +end + +def _reduce_312(val, _values, result) + result = @builder.loop(:until, val[0], val[2], val[3], + val[5], val[6]) + + result +end + +def _reduce_313(val, _values, result) + *when_bodies, (else_t, else_body) = *val[3] + + result = @builder.case(val[0], val[1], + when_bodies, else_t, else_body, + val[4]) + + result +end + +def _reduce_314(val, _values, result) + *when_bodies, (else_t, else_body) = *val[2] + + result = @builder.case(val[0], nil, + when_bodies, else_t, else_body, + val[3]) + + result +end + +def _reduce_315(val, _values, result) + @lexer.cond.push(true) + + result +end + +def _reduce_316(val, _values, result) + @lexer.cond.pop + + result +end + +def _reduce_317(val, _values, result) + result = @builder.for(val[0], val[1], + val[2], val[4], + val[5], val[7], val[8]) + + result +end + +def _reduce_318(val, _values, result) + local_push + @context.in_class = true + + result +end + +def _reduce_319(val, _values, result) + k_class, ctx = val[0] + if @context.in_def + diagnostic :error, :class_in_def, nil, k_class + end + + lt_t, superclass = val[2] + result = @builder.def_class(k_class, val[1], + lt_t, superclass, + val[4], val[5]) + + local_pop + @context.in_class = ctx.in_class + + result +end + +def _reduce_320(val, _values, result) + @context.in_def = false + @context.in_class = false + local_push + + result +end + +def _reduce_321(val, _values, result) + k_class, ctx = val[0] + result = @builder.def_sclass(k_class, val[1], val[2], + val[5], val[6]) + + local_pop + @context.in_def = ctx.in_def + @context.in_class = ctx.in_class + + result +end + +def _reduce_322(val, _values, result) + @context.in_class = true + local_push + + result +end + +def _reduce_323(val, _values, result) + k_mod, ctx = val[0] + if @context.in_def + diagnostic :error, :module_in_def, nil, k_mod + end + + result = @builder.def_module(k_mod, val[1], + val[3], val[4]) + + local_pop + @context.in_class = ctx.in_class + + result +end + +def _reduce_324(val, _values, result) + local_push + result = context.dup + @context.in_def = true + + result +end + +def _reduce_325(val, _values, result) + result = @builder.def_method(val[0], val[1], + val[3], val[4], val[5]) + + local_pop + @context.in_def = val[2].in_def + + result +end + +def _reduce_326(val, _values, result) + @lexer.state = :expr_fname + + result +end + +def _reduce_327(val, _values, result) + local_push + result = context.dup + @context.in_def = true + + result +end + +def _reduce_328(val, _values, result) + result = @builder.def_singleton(val[0], val[1], val[2], + val[4], val[6], val[7], val[8]) + + local_pop + @context.in_def = val[5].in_def + + result +end + +def _reduce_329(val, _values, result) + result = @builder.keyword_cmd(:break, val[0]) + + result +end + +def _reduce_330(val, _values, result) + result = @builder.keyword_cmd(:next, val[0]) + + result +end + +def _reduce_331(val, _values, result) + result = @builder.keyword_cmd(:redo, val[0]) + + result +end + +def _reduce_332(val, _values, result) + result = @builder.keyword_cmd(:retry, val[0]) + + result +end + +# reduce 333 omitted + +def _reduce_334(val, _values, result) + result = [ val[0], @context.dup ] + + result +end + +def _reduce_335(val, _values, result) + result = [ val[0], @context.dup ] + + result +end + +# reduce 336 omitted + +# reduce 337 omitted + +def _reduce_338(val, _values, result) + result = val[1] + + result +end + +# reduce 339 omitted + +# reduce 340 omitted + +# reduce 341 omitted + +def _reduce_342(val, _values, result) + else_t, else_ = val[4] + result = [ val[0], + @builder.condition(val[0], val[1], val[2], + val[3], else_t, + else_, nil), + ] + + result +end + +# reduce 343 omitted + +def _reduce_344(val, _values, result) + result = val + + result +end + +# reduce 345 omitted + +# reduce 346 omitted + +def _reduce_347(val, _values, result) + result = @builder.arg(val[0]) + + result +end + +def _reduce_348(val, _values, result) + result = @builder.multi_lhs(val[0], val[1], val[2]) + + result +end + +def _reduce_349(val, _values, result) + result = [ val[0] ] + + result +end + +def _reduce_350(val, _values, result) + result = val[0] << val[2] + + result +end + +# reduce 351 omitted + +def _reduce_352(val, _values, result) + result = val[0]. + push(@builder.restarg(val[2], val[3])) + + result +end + +def _reduce_353(val, _values, result) + result = val[0]. + push(@builder.restarg(val[2], val[3])). + concat(val[5]) + + result +end + +def _reduce_354(val, _values, result) + result = val[0]. + push(@builder.restarg(val[2])) + + result +end + +def _reduce_355(val, _values, result) + result = val[0]. + push(@builder.restarg(val[2])). + concat(val[4]) + + result +end + +def _reduce_356(val, _values, result) + result = [ @builder.restarg(val[0], val[1]) ] + + result +end + +def _reduce_357(val, _values, result) + result = [ @builder.restarg(val[0], val[1]), + *val[3] ] + + result +end + +def _reduce_358(val, _values, result) + result = [ @builder.restarg(val[0]) ] + + result +end + +def _reduce_359(val, _values, result) + result = [ @builder.restarg(val[0]), + *val[2] ] + + result +end + +def _reduce_360(val, _values, result) + result = val[0].concat(val[2]).concat(val[3]) + + result +end + +def _reduce_361(val, _values, result) + result = val[0].concat(val[1]) + + result +end + +def _reduce_362(val, _values, result) + result = val[0].concat(val[1]) + + result +end + +def _reduce_363(val, _values, result) + result = [ val[0] ] + + result +end + +def _reduce_364(val, _values, result) + result = val[1] + + result +end + +def _reduce_365(val, _values, result) + result = [] + + result +end + +def _reduce_366(val, _values, result) + result = val[0]. + concat(val[2]). + concat(val[4]). + concat(val[5]) + + result +end + +def _reduce_367(val, _values, result) + result = val[0]. + concat(val[2]). + concat(val[4]). + concat(val[6]). + concat(val[7]) + + result +end + +def _reduce_368(val, _values, result) + result = val[0]. + concat(val[2]). + concat(val[3]) + + result +end + +def _reduce_369(val, _values, result) + result = val[0]. + concat(val[2]). + concat(val[4]). + concat(val[5]) + + result +end + +def _reduce_370(val, _values, result) + result = val[0]. + concat(val[2]). + concat(val[3]) + + result +end + +# reduce 371 omitted + +def _reduce_372(val, _values, result) + result = val[0]. + concat(val[2]). + concat(val[4]). + concat(val[5]) + + result +end + +def _reduce_373(val, _values, result) + if val[1].empty? && val[0].size == 1 + result = [@builder.procarg0(val[0][0])] + else + result = val[0].concat(val[1]) + end + + result +end + +def _reduce_374(val, _values, result) + result = val[0]. + concat(val[2]). + concat(val[3]) + + result +end + +def _reduce_375(val, _values, result) + result = val[0]. + concat(val[2]). + concat(val[4]). + concat(val[5]) + + result +end + +def _reduce_376(val, _values, result) + result = val[0]. + concat(val[1]) + + result +end + +def _reduce_377(val, _values, result) + result = val[0]. + concat(val[2]). + concat(val[3]) + + result +end + +def _reduce_378(val, _values, result) + result = val[0]. + concat(val[1]) + + result +end + +def _reduce_379(val, _values, result) + result = val[0]. + concat(val[2]). + concat(val[3]) + + result +end + +# reduce 380 omitted + +def _reduce_381(val, _values, result) + result = @builder.args(nil, [], nil) + + result +end + +def _reduce_382(val, _values, result) + @lexer.state = :expr_value + + result +end + +def _reduce_383(val, _values, result) + result = @builder.args(val[0], val[1], val[2]) + + result +end + +def _reduce_384(val, _values, result) + result = @builder.args(val[0], [], val[0]) + + result +end + +def _reduce_385(val, _values, result) + result = @builder.args(val[0], val[1].concat(val[2]), val[3]) + + result +end + +def _reduce_386(val, _values, result) + result = [] + + result +end + +def _reduce_387(val, _values, result) + result = val[2] + + result +end + +def _reduce_388(val, _values, result) + result = [ val[0] ] + + result +end + +def _reduce_389(val, _values, result) + result = val[0] << val[2] + + result +end + +def _reduce_390(val, _values, result) + @static_env.declare val[0][0] + result = @builder.shadowarg(val[0]) + + result +end + +# reduce 391 omitted + +def _reduce_392(val, _values, result) + @static_env.extend_dynamic + + result +end + +def _reduce_393(val, _values, result) + result = @lexer.cmdarg.dup + @lexer.cmdarg.clear + + result +end + +def _reduce_394(val, _values, result) + @lexer.cmdarg = val[2] + @lexer.cmdarg.lexpop + + result = [ val[1], val[3] ] + + @static_env.unextend + + result +end + +def _reduce_395(val, _values, result) + result = @builder.args(val[0], val[1].concat(val[2]), val[3]) + + result +end + +def _reduce_396(val, _values, result) + result = @builder.args(nil, val[0], nil) + + result +end + +def _reduce_397(val, _values, result) + result = @context.dup + @context.in_lambda = true + + result +end + +def _reduce_398(val, _values, result) + result = [ val[0], val[2], val[3] ] + @context.in_lambda = val[1].in_lambda + + result +end + +def _reduce_399(val, _values, result) + result = @context.dup + @context.in_lambda = true + + result +end + +def _reduce_400(val, _values, result) + result = [ val[0], val[2], val[3] ] + @context.in_lambda = val[1].in_lambda + + result +end + +def _reduce_401(val, _values, result) + @static_env.extend_dynamic + result = @context.dup + @context.in_block = true + + result +end + +def _reduce_402(val, _values, result) + result = [ val[0], val[2], val[3], val[4] ] + + @static_env.unextend + @context.in_block = val[1].in_block + + result +end + +def _reduce_403(val, _values, result) + begin_t, block_args, body, end_t = val[1] + result = @builder.block(val[0], + begin_t, block_args, body, end_t) + + result +end + +def _reduce_404(val, _values, result) + lparen_t, args, rparen_t = val[3] + result = @builder.call_method(val[0], val[1], val[2], + lparen_t, args, rparen_t) + + result +end + +def _reduce_405(val, _values, result) + lparen_t, args, rparen_t = val[3] + method_call = @builder.call_method(val[0], val[1], val[2], + lparen_t, args, rparen_t) + + begin_t, args, body, end_t = val[4] + result = @builder.block(method_call, + begin_t, args, body, end_t) + + result +end + +def _reduce_406(val, _values, result) + method_call = @builder.call_method(val[0], val[1], val[2], + nil, val[3], nil) + + begin_t, args, body, end_t = val[4] + result = @builder.block(method_call, + begin_t, args, body, end_t) + + result +end + +def _reduce_407(val, _values, result) + lparen_t, args, rparen_t = val[1] + result = @builder.call_method(nil, nil, val[0], + lparen_t, args, rparen_t) + + result +end + +def _reduce_408(val, _values, result) + lparen_t, args, rparen_t = val[3] + result = @builder.call_method(val[0], val[1], val[2], + lparen_t, args, rparen_t) + + result +end + +def _reduce_409(val, _values, result) + lparen_t, args, rparen_t = val[3] + result = @builder.call_method(val[0], val[1], val[2], + lparen_t, args, rparen_t) + + result +end + +def _reduce_410(val, _values, result) + result = @builder.call_method(val[0], val[1], val[2]) + + result +end + +def _reduce_411(val, _values, result) + lparen_t, args, rparen_t = val[2] + result = @builder.call_method(val[0], val[1], nil, + lparen_t, args, rparen_t) + + result +end + +def _reduce_412(val, _values, result) + lparen_t, args, rparen_t = val[2] + result = @builder.call_method(val[0], val[1], nil, + lparen_t, args, rparen_t) + + result +end + +def _reduce_413(val, _values, result) + lparen_t, args, rparen_t = val[1] + result = @builder.keyword_cmd(:super, val[0], + lparen_t, args, rparen_t) + + result +end + +def _reduce_414(val, _values, result) + result = @builder.keyword_cmd(:zsuper, val[0]) + + result +end + +def _reduce_415(val, _values, result) + result = @builder.index(val[0], val[1], val[2], val[3]) + + result +end + +def _reduce_416(val, _values, result) + @static_env.extend_dynamic + result = @context.dup + @context.in_block = true + + result +end + +def _reduce_417(val, _values, result) + result = [ val[0], val[2], val[3], val[4] ] + + @static_env.unextend + @context.in_block = val[1].in_block + + result +end + +def _reduce_418(val, _values, result) + @static_env.extend_dynamic + result = @context.dup + @context.in_block = true + + result +end + +def _reduce_419(val, _values, result) + result = [ val[0], val[2], val[3], val[4] ] + + @static_env.unextend + @context.in_block = val[1].in_block + + result +end + +def _reduce_420(val, _values, result) + result = [ @builder.when(val[0], val[1], val[2], val[3]), + *val[4] ] + + result +end + +def _reduce_421(val, _values, result) + result = [ val[0] ] + + result +end + +# reduce 422 omitted + +def _reduce_423(val, _values, result) + assoc_t, exc_var = val[2] + + if val[1] + exc_list = @builder.array(nil, val[1], nil) + end + + result = [ @builder.rescue_body(val[0], + exc_list, assoc_t, exc_var, + val[3], val[4]), + *val[5] ] + + result +end + +def _reduce_424(val, _values, result) + result = [] + + result +end + +def _reduce_425(val, _values, result) + result = [ val[0] ] + + result +end + +# reduce 426 omitted + +# reduce 427 omitted + +def _reduce_428(val, _values, result) + result = [ val[0], val[1] ] + + result +end + +# reduce 429 omitted + +def _reduce_430(val, _values, result) + result = [ val[0], val[1] ] + + result +end + +# reduce 431 omitted + +# reduce 432 omitted + +# reduce 433 omitted + +# reduce 434 omitted + +def _reduce_435(val, _values, result) + result = @builder.string_compose(nil, val[0], nil) + + result +end + +def _reduce_436(val, _values, result) + result = [ val[0] ] + + result +end + +def _reduce_437(val, _values, result) + result = val[0] << val[1] + + result +end + +def _reduce_438(val, _values, result) + string = @builder.string_compose(val[0], val[1], val[2]) + result = @builder.dedent_string(string, @lexer.dedent_level) + + result +end + +def _reduce_439(val, _values, result) + string = @builder.string(val[0]) + result = @builder.dedent_string(string, @lexer.dedent_level) + + result +end + +def _reduce_440(val, _values, result) + result = @builder.character(val[0]) + + result +end + +def _reduce_441(val, _values, result) + string = @builder.xstring_compose(val[0], val[1], val[2]) + result = @builder.dedent_string(string, @lexer.dedent_level) + + result +end + +def _reduce_442(val, _values, result) + opts = @builder.regexp_options(val[3]) + result = @builder.regexp_compose(val[0], val[1], val[2], opts) + + result +end + +def _reduce_443(val, _values, result) + result = @builder.words_compose(val[0], val[1], val[2]) + + result +end + +def _reduce_444(val, _values, result) + result = [] + + result +end + +def _reduce_445(val, _values, result) + result = val[0] << @builder.word(val[1]) + + result +end + +def _reduce_446(val, _values, result) + result = [ val[0] ] + + result +end + +def _reduce_447(val, _values, result) + result = val[0] << val[1] + + result +end + +def _reduce_448(val, _values, result) + result = @builder.symbols_compose(val[0], val[1], val[2]) + + result +end + +def _reduce_449(val, _values, result) + result = [] + + result +end + +def _reduce_450(val, _values, result) + result = val[0] << @builder.word(val[1]) + + result +end + +def _reduce_451(val, _values, result) + result = @builder.words_compose(val[0], val[1], val[2]) + + result +end + +def _reduce_452(val, _values, result) + result = @builder.symbols_compose(val[0], val[1], val[2]) + + result +end + +def _reduce_453(val, _values, result) + result = [] + + result +end + +def _reduce_454(val, _values, result) + result = val[0] << @builder.string_internal(val[1]) + + result +end + +def _reduce_455(val, _values, result) + result = [] + + result +end + +def _reduce_456(val, _values, result) + result = val[0] << @builder.symbol_internal(val[1]) + + result +end + +def _reduce_457(val, _values, result) + result = [] + + result +end + +def _reduce_458(val, _values, result) + result = val[0] << val[1] + + result +end + +def _reduce_459(val, _values, result) + result = [] + + result +end + +def _reduce_460(val, _values, result) + result = val[0] << val[1] + + result +end + +def _reduce_461(val, _values, result) + result = [] + + result +end + +def _reduce_462(val, _values, result) + result = val[0] << val[1] + + result +end + +def _reduce_463(val, _values, result) + result = @builder.string_internal(val[0]) + + result +end + +def _reduce_464(val, _values, result) + result = val[1] + + result +end + +def _reduce_465(val, _values, result) + @lexer.cond.push(false) + @lexer.cmdarg.push(false) + + result +end + +def _reduce_466(val, _values, result) + @lexer.cond.lexpop + @lexer.cmdarg.lexpop + + result = @builder.begin(val[0], val[2], val[3]) + + result +end + +def _reduce_467(val, _values, result) + result = @builder.gvar(val[0]) + + result +end + +def _reduce_468(val, _values, result) + result = @builder.ivar(val[0]) + + result +end + +def _reduce_469(val, _values, result) + result = @builder.cvar(val[0]) + + result +end + +# reduce 470 omitted + +def _reduce_471(val, _values, result) + result = @builder.symbol(val[0]) + + result +end + +def _reduce_472(val, _values, result) + result = @builder.symbol_compose(val[0], val[1], val[2]) + + result +end + +def _reduce_473(val, _values, result) + result = val[0] + + result +end + +def _reduce_474(val, _values, result) + if @builder.respond_to? :negate + # AST builder interface compatibility + result = @builder.negate(val[0], val[1]) + else + result = @builder.unary_num(val[0], val[1]) + end + + result +end + +def _reduce_475(val, _values, result) + result = @builder.integer(val[0]) + + result +end + +def _reduce_476(val, _values, result) + result = @builder.float(val[0]) + + result +end + +def _reduce_477(val, _values, result) + result = @builder.rational(val[0]) + + result +end + +def _reduce_478(val, _values, result) + result = @builder.complex(val[0]) + + result +end + +def _reduce_479(val, _values, result) + result = @builder.ident(val[0]) + + result +end + +def _reduce_480(val, _values, result) + result = @builder.ivar(val[0]) + + result +end + +def _reduce_481(val, _values, result) + result = @builder.gvar(val[0]) + + result +end + +def _reduce_482(val, _values, result) + result = @builder.const(val[0]) + + result +end + +def _reduce_483(val, _values, result) + result = @builder.cvar(val[0]) + + result +end + +def _reduce_484(val, _values, result) + result = @builder.nil(val[0]) + + result +end + +def _reduce_485(val, _values, result) + result = @builder.self(val[0]) + + result +end + +def _reduce_486(val, _values, result) + result = @builder.true(val[0]) + + result +end + +def _reduce_487(val, _values, result) + result = @builder.false(val[0]) + + result +end + +def _reduce_488(val, _values, result) + result = @builder.__FILE__(val[0]) + + result +end + +def _reduce_489(val, _values, result) + result = @builder.__LINE__(val[0]) + + result +end + +def _reduce_490(val, _values, result) + result = @builder.__ENCODING__(val[0]) + + result +end + +def _reduce_491(val, _values, result) + result = @builder.accessible(val[0]) + + result +end + +def _reduce_492(val, _values, result) + result = @builder.accessible(val[0]) + + result +end + +def _reduce_493(val, _values, result) + result = @builder.assignable(val[0]) + + result +end + +def _reduce_494(val, _values, result) + result = @builder.assignable(val[0]) + + result +end + +def _reduce_495(val, _values, result) + result = @builder.nth_ref(val[0]) + + result +end + +def _reduce_496(val, _values, result) + result = @builder.back_ref(val[0]) + + result +end + +def _reduce_497(val, _values, result) + @lexer.state = :expr_value + + result +end + +def _reduce_498(val, _values, result) + result = [ val[0], val[2] ] + + result +end + +def _reduce_499(val, _values, result) + result = nil + + result +end + +def _reduce_500(val, _values, result) + result = @builder.args(val[0], val[1], val[2]) + + @lexer.state = :expr_value + + result +end + +def _reduce_501(val, _values, result) + result = @context.in_kwarg + @context.in_kwarg = true + + result +end + +def _reduce_502(val, _values, result) + @context.in_kwarg = val[0] + result = @builder.args(nil, val[1], nil) + + result +end + +def _reduce_503(val, _values, result) + result = val[0].concat(val[2]).concat(val[3]) + + result +end + +def _reduce_504(val, _values, result) + result = val[0].concat(val[1]) + + result +end + +def _reduce_505(val, _values, result) + result = val[0].concat(val[1]) + + result +end + +def _reduce_506(val, _values, result) + result = [ val[0] ] + + result +end + +def _reduce_507(val, _values, result) + result = val[1] + + result +end + +def _reduce_508(val, _values, result) + result = [] + + result +end + +def _reduce_509(val, _values, result) + result = val[0]. + concat(val[2]). + concat(val[4]). + concat(val[5]) + + result +end + +def _reduce_510(val, _values, result) + result = val[0]. + concat(val[2]). + concat(val[4]). + concat(val[6]). + concat(val[7]) + + result +end + +def _reduce_511(val, _values, result) + result = val[0]. + concat(val[2]). + concat(val[3]) + + result +end + +def _reduce_512(val, _values, result) + result = val[0]. + concat(val[2]). + concat(val[4]). + concat(val[5]) + + result +end + +def _reduce_513(val, _values, result) + result = val[0]. + concat(val[2]). + concat(val[3]) + + result +end + +def _reduce_514(val, _values, result) + result = val[0]. + concat(val[2]). + concat(val[4]). + concat(val[5]) + + result +end + +def _reduce_515(val, _values, result) + result = val[0]. + concat(val[1]) + + result +end + +def _reduce_516(val, _values, result) + result = val[0]. + concat(val[2]). + concat(val[3]) + + result +end + +def _reduce_517(val, _values, result) + result = val[0]. + concat(val[2]). + concat(val[4]). + concat(val[5]) + + result +end + +def _reduce_518(val, _values, result) + result = val[0]. + concat(val[1]) + + result +end + +def _reduce_519(val, _values, result) + result = val[0]. + concat(val[2]). + concat(val[3]) + + result +end + +def _reduce_520(val, _values, result) + result = val[0]. + concat(val[1]) + + result +end + +def _reduce_521(val, _values, result) + result = val[0]. + concat(val[2]). + concat(val[3]) + + result +end + +def _reduce_522(val, _values, result) + result = val[0] + + result +end + +def _reduce_523(val, _values, result) + result = [] + + result +end + +def _reduce_524(val, _values, result) + diagnostic :error, :argument_const, nil, val[0] + + result +end + +def _reduce_525(val, _values, result) + diagnostic :error, :argument_ivar, nil, val[0] + + result +end + +def _reduce_526(val, _values, result) + diagnostic :error, :argument_gvar, nil, val[0] + + result +end + +def _reduce_527(val, _values, result) + diagnostic :error, :argument_cvar, nil, val[0] + + result +end + +# reduce 528 omitted + +def _reduce_529(val, _values, result) + @static_env.declare val[0][0] + + result = val[0] + + result +end + +def _reduce_530(val, _values, result) + result = val[0] + + result +end + +def _reduce_531(val, _values, result) + result = @builder.arg(val[0]) + + result +end + +def _reduce_532(val, _values, result) + result = @builder.multi_lhs(val[0], val[1], val[2]) + + result +end + +def _reduce_533(val, _values, result) + result = [ val[0] ] + + result +end + +def _reduce_534(val, _values, result) + result = val[0] << val[2] + + result +end + +def _reduce_535(val, _values, result) + check_kwarg_name(val[0]) + + @static_env.declare val[0][0] + + result = val[0] + + result +end + +def _reduce_536(val, _values, result) + result = @builder.kwoptarg(val[0], val[1]) + + result +end + +def _reduce_537(val, _values, result) + result = @builder.kwarg(val[0]) + + result +end + +def _reduce_538(val, _values, result) + result = @builder.kwoptarg(val[0], val[1]) + + result +end + +def _reduce_539(val, _values, result) + result = @builder.kwarg(val[0]) + + result +end + +def _reduce_540(val, _values, result) + result = [ val[0] ] + + result +end + +def _reduce_541(val, _values, result) + result = val[0] << val[2] + + result +end + +def _reduce_542(val, _values, result) + result = [ val[0] ] + + result +end + +def _reduce_543(val, _values, result) + result = val[0] << val[2] + + result +end + +# reduce 544 omitted + +# reduce 545 omitted + +def _reduce_546(val, _values, result) + @static_env.declare val[1][0] + + result = [ @builder.kwrestarg(val[0], val[1]) ] + + result +end + +def _reduce_547(val, _values, result) + result = [ @builder.kwrestarg(val[0]) ] + + result +end + +def _reduce_548(val, _values, result) + result = @builder.optarg(val[0], val[1], val[2]) + + result +end + +def _reduce_549(val, _values, result) + result = @builder.optarg(val[0], val[1], val[2]) + + result +end + +def _reduce_550(val, _values, result) + result = [ val[0] ] + + result +end + +def _reduce_551(val, _values, result) + result = val[0] << val[2] + + result +end + +def _reduce_552(val, _values, result) + result = [ val[0] ] + + result +end + +def _reduce_553(val, _values, result) + result = val[0] << val[2] + + result +end + +# reduce 554 omitted + +# reduce 555 omitted + +def _reduce_556(val, _values, result) + @static_env.declare val[1][0] + + result = [ @builder.restarg(val[0], val[1]) ] + + result +end + +def _reduce_557(val, _values, result) + result = [ @builder.restarg(val[0]) ] + + result +end + +# reduce 558 omitted + +# reduce 559 omitted + +def _reduce_560(val, _values, result) + @static_env.declare val[1][0] + + result = @builder.blockarg(val[0], val[1]) + + result +end + +def _reduce_561(val, _values, result) + result = [ val[1] ] + + result +end + +def _reduce_562(val, _values, result) + result = [] + + result +end + +# reduce 563 omitted + +def _reduce_564(val, _values, result) + result = val[1] + + result +end + +def _reduce_565(val, _values, result) + result = [] + + result +end + +# reduce 566 omitted + +def _reduce_567(val, _values, result) + result = [ val[0] ] + + result +end + +def _reduce_568(val, _values, result) + result = val[0] << val[2] + + result +end + +def _reduce_569(val, _values, result) + result = @builder.pair(val[0], val[1], val[2]) + + result +end + +def _reduce_570(val, _values, result) + result = @builder.pair_keyword(val[0], val[1]) + + result +end + +def _reduce_571(val, _values, result) + result = @builder.pair_quoted(val[0], val[1], val[2], val[3]) + + result +end + +def _reduce_572(val, _values, result) + result = @builder.kwsplat(val[0], val[1]) + + result +end + +# reduce 573 omitted + +# reduce 574 omitted + +# reduce 575 omitted + +# reduce 576 omitted + +# reduce 577 omitted + +# reduce 578 omitted + +# reduce 579 omitted + +# reduce 580 omitted + +# reduce 581 omitted + +# reduce 582 omitted + +# reduce 583 omitted + +# reduce 584 omitted + +def _reduce_585(val, _values, result) + result = [:dot, val[0][1]] + + result +end + +def _reduce_586(val, _values, result) + result = [:anddot, val[0][1]] + + result +end + +# reduce 587 omitted + +# reduce 588 omitted + +# reduce 589 omitted + +# reduce 590 omitted + +def _reduce_591(val, _values, result) + result = val[1] + + result +end + +def _reduce_592(val, _values, result) + result = val[1] + + result +end + +# reduce 593 omitted + +# reduce 594 omitted + +# reduce 595 omitted + +def _reduce_596(val, _values, result) + yyerrok + + result +end + +# reduce 597 omitted + +# reduce 598 omitted + +# reduce 599 omitted + +def _reduce_600(val, _values, result) + result = nil + + result +end + +def _reduce_none(val, _values, result) + val[0] +end + + end # class Ruby23 + end # module Parser diff --git a/vendor/bundle/ruby/3.1.0/gems/parser-3.1.2.0/lib/parser/ruby24.rb b/vendor/bundle/ruby/3.1.0/gems/parser-3.1.2.0/lib/parser/ruby24.rb new file mode 100644 index 000000000..40f1f781f --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/parser-3.1.2.0/lib/parser/ruby24.rb @@ -0,0 +1,6736 @@ +# -*- encoding:utf-8; warn-indent:false; frozen_string_literal: true -*- +# +# DO NOT MODIFY!!!! +# This file is automatically generated by Racc 1.4.15 +# from Racc grammer file "". +# + +require 'racc/parser.rb' + + +require 'parser' + +module Parser + class Ruby24 < Parser::Base + + + def version + 24 + end + + def default_encoding + Encoding::UTF_8 + end + + def local_push + @static_env.extend_static + @lexer.cmdarg.push(false) + @lexer.cond.push(false) + end + + def local_pop + @static_env.unextend + @lexer.cmdarg.pop + @lexer.cond.pop + end +##### State transition tables begin ### + +clist = [ +'-485,999,272,211,212,211,212,-485,-485,-485,111,545,-485,-485,-485,587', +'-485,774,-102,585,221,774,211,212,-485,399,-485,-485,-485,115,401,400', +'818,787,114,-107,-485,-485,-104,-485,-485,-485,-485,-485,545,-103,-105', +'545,-100,-100,-103,-102,773,-85,-101,115,773,115,272,123,114,222,114', +'-71,870,-106,-485,-485,-485,-485,-485,-485,-485,-485,-485,-485,-485', +'-485,-485,-485,208,586,-485,-485,-485,584,-485,-485,-104,271,-485,-99', +'-105,-485,-485,-101,-485,222,-485,222,-485,209,-485,-485,-107,-485,-485', +'-485,-485,-485,545,-485,-290,-485,545,-582,222,-106,-99,-290,-290,-290', +'-582,-583,-290,-290,-290,-485,-290,115,-485,-485,-485,-485,114,-485', +'-102,-485,-290,-290,-290,-102,-485,-485,-98,271,210,701,-290,-290,523', +'-290,-290,-290,-290,-290,-104,-583,-91,-94,-93,-104,115,-103,-105,115', +'-100,114,-103,-105,114,-100,-101,869,-97,701,701,-101,-290,-290,-290', +'-290,-290,-290,-290,-290,-290,-290,-290,-290,-290,-290,211,212,-290', +'-290,-290,-95,763,-290,-90,-96,-290,572,-92,-290,-290,-106,-290,272', +'-290,115,-290,213,-290,-290,114,-290,-290,-290,-290,-290,-107,-290,272', +'-290,219,-107,115,115,261,823,115,114,114,-106,-99,114,572,-290,-106', +'-99,-290,-290,-290,-290,320,-290,-499,-290,-586,115,-500,321,-290,-105', +'114,-586,-586,-586,93,94,-586,-586,-586,-94,-586,574,573,588,211,212', +'787,267,551,-586,-586,-586,-586,115,115,694,693,-107,114,114,-586,-586', +'267,-586,-586,-586,-586,-586,93,94,271,760,222,-95,-92,-93,574,573,678', +'-99,675,674,673,-100,676,271,734,523,211,212,-586,-586,-586,-586,-586', +'-586,-586,-586,-586,-586,-586,-586,-586,-586,-582,-94,-586,-586,-586', +'389,762,-586,95,96,-586,761,606,-586,-586,557,-586,402,-586,558,-586', +'451,-586,-586,-102,-586,-586,-586,-586,-586,-97,-586,-586,-586,115,-95', +'-92,-93,572,114,-106,-94,95,96,-94,818,787,-586,452,572,-586,-586,-586', +'-586,-94,-586,888,-586,-488,-95,747,842,-586,-103,605,-488,-488,-488', +'-104,-104,-488,-488,-488,453,-488,-95,-92,-93,-95,-92,-93,606,-488,454', +'-488,-488,-488,221,-95,-92,-93,485,494,605,-488,-488,496,-488,-488,-488', +'-488,-488,574,573,678,-107,675,674,673,217,676,-93,732,574,573,577,265', +'-101,-101,535,498,-102,537,747,-488,-488,-488,-488,-488,-488,-488,-488', +'-488,-488,-488,-488,-488,-488,-104,506,-488,-488,-488,535,-488,-488', +'537,-70,-488,572,-102,-488,-488,572,-488,219,-488,572,-488,-500,-488', +'-488,572,-488,-488,-488,-488,-488,-290,-488,-92,-488,222,509,218,-290', +'-290,-290,510,517,-101,-290,-290,276,-290,-488,986,222,-488,-488,-488', +'-488,217,-488,535,-488,-579,534,267,265,-488,-488,-98,520,-290,-290', +'-91,-290,-290,-290,-290,-290,-107,574,573,570,-100,574,573,570,524,574', +'573,575,572,-499,574,573,579,535,638,242,537,222,-290,-290,-290,-290', +'-290,-290,-290,-290,-290,-290,-290,-290,-290,-290,-485,538,-290,-290', +'-290,222,610,-485,1003,218,-290,539,-579,-290,498,551,-485,391,-290', +'555,-290,556,-290,-290,-90,-290,-290,-290,-290,-290,-290,-290,564,-290', +'-99,-579,589,-290,-290,-290,574,573,583,-290,-290,592,-290,-290,242', +'-263,-290,-290,81,-96,-492,-290,594,595,-580,599,222,-492,-290,-105', +'82,-485,-290,-290,603,-290,-290,-290,-290,-290,83,217,604,267,615,217', +'239,-491,526,-490,241,240,216,-493,-491,242,-490,450,242,242,-493,214', +'-290,-290,-290,-290,-290,-290,-290,-290,-290,-290,-290,-290,-290,-290', +'-488,217,-290,-290,-290,242,610,-488,972,-492,-290,222,-580,-290,-496', +'222,-488,562,-290,222,-290,-496,-290,-290,-85,-290,-290,-290,-290,-290', +'218,-290,-586,-290,218,-580,-491,642,-490,-586,-586,-586,-493,222,528', +'-586,-586,-290,-586,653,-290,-290,658,-290,217,-290,659,-586,222,242', +'661,977,-290,-105,697,-488,218,551,-586,-586,975,-586,-586,-586,-586', +'-586,704,217,721,-496,731,-291,-494,-495,449,-488,735,-485,-291,-494', +'-495,239,-488,450,-485,241,240,-291,-586,-586,-586,-586,-586,-586,-586', +'-586,-586,-586,-586,-586,-586,-586,736,-264,-586,-586,-586,-334,611', +'218,748,485,-586,485,-334,-586,222,-586,765,766,-586,261,-586,-334,-586', +'-586,771,-586,-586,-586,-586,-586,218,-586,-586,-586,-291,-494,-495', +'776,-488,496,-485,217,-290,498,780,653,222,-586,598,-290,-586,-586,-586', +'-586,-583,-586,267,596,-290,-586,-586,-586,-586,-103,267,-586,-586,-586', +'-586,969,-334,675,674,673,-586,676,653,-586,678,-582,675,674,673,-586', +'676,242,787,795,-586,-586,798,-586,-586,-586,-586,-586,799,-290,801', +'803,805,813,-586,814,-290,815,218,-290,969,-583,675,674,673,-290,676', +'807,787,822,-586,-586,-586,-586,-586,-586,-586,-586,-586,-586,-586,-586', +'-586,-586,-586,222,-586,-586,-586,-497,611,222,-498,831,-586,-265,-497', +'-586,222,-498,841,845,-586,653,-586,-497,-586,-586,-498,-586,-586,-586', +'-586,-586,-290,-586,-586,-586,678,862,675,674,673,683,676,217,118,119', +'120,121,122,-586,516,686,-586,-586,-415,-94,-263,-586,866,514,222,-415', +'-415,-415,-586,-103,-415,-415,-415,886,-415,222,-497,681,890,-498,892', +'242,898,-415,-415,-415,691,690,694,693,901,222,905,687,-415,-415,-266', +'-415,-415,-415,-415,-415,678,907,675,674,673,-281,676,798,910,912,218', +'239,-281,914,916,241,240,222,237,238,222,-281,-415,-415,-415,-415,-415', +'-415,-415,-415,-415,-415,-415,-415,-415,-415,918,807,-415,-415,-415', +'217,919,-415,-291,267,-415,932,972,-415,-415,-291,-415,798,-415,934', +'-415,562,-415,-415,-291,-415,-415,-415,-415,-415,936,-415,-415,-415', +'-281,242,683,938,217,683,940,217,940,222,946,560,686,-415,554,686,-415', +'-415,-246,-415,562,-415,949,552,950,-246,-246,-246,-415,955,-246,-246', +'-246,239,-246,721,218,241,240,-291,237,238,966,-246,-246,694,693,973', +'694,693,687,978,988,687,-246,-246,798,-246,-246,-246,-246,-246,678,993', +'675,674,673,995,676,218,726,727,218,997,728,109,110,999,999,678,658', +'675,674,673,683,676,118,119,120,121,122,1012,1013,1014,686,-246,940', +'-246,940,807,940,1019,-246,988,-246,-246,-246,267,-246,-246,-246,-246', +'1022,-246,1023,678,681,675,674,673,-583,676,-246,-246,-246,691,690,694', +'693,-582,-246,-246,687,-246,-246,222,-246,-246,-246,-246,-246,988,1032', +'999,999,-246,999,940,-246,988,,,807,-246,118,119,120,121,122,,-246,810', +',-246,-246,-246,-246,-246,-246,-246,-246,-246,-246,-246,-246,-246,-246', +',,-246,-246,-246,,,-246,,267,-246,,,-246,-246,,-246,,-246,,-246,,-246', +'-246,,-246,-246,-246,-246,-246,-282,-246,-246,-246,,,,-282,-282,-282', +',,-282,-282,-282,,-282,-246,,,-246,-246,,-246,,-246,-282,-282,-282,', +',,-246,,,,-282,-282,,-282,-282,-282,-282,-282,678,,675,674,673,678,676', +'675,674,673,678,676,675,674,673,,676,118,119,120,121,122,-282,-282,-282', +'-282,-282,-282,-282,-282,-282,-282,-282,-282,-282,-282,,807,-282,-282', +'-282,,807,-282,,,-282,807,,-282,-282,945,-282,,-282,,-282,,-282,-282', +',-282,-282,-282,-282,-282,,-282,,-282,678,,675,674,673,,676,,,,,,,-282', +',,-282,-282,-282,-282,,-282,-587,-282,,,,,-282,-587,-587,-587,,,-587', +'-587,-587,807,-587,242,,,,,,,810,-587,-587,-587,-587,,,,,256,257,,-587', +'-587,,-587,-587,-587,-587,-587,,,,,,239,,245,,241,240,,237,238,,,243', +',244,,,,-587,-587,-587,-587,-587,-587,-587,-587,-587,-587,-587,-587', +'-587,-587,,,-587,-587,-587,,,-587,,,-587,,,-587,-587,,-587,,-587,,-587', +',-587,-587,,-587,-587,-587,-587,-587,,-587,-587,-587,,,,,,,,,,,,,,-587', +',,-587,-587,-587,-587,,-587,-588,-587,,,,,-587,-588,-588,-588,,,-588', +'-588,-588,242,-588,,,,,,,,,-588,-588,-588,-588,,,256,257,,,,-588,-588', +',-588,-588,-588,-588,-588,,,,239,,245,,241,240,,237,238,,,243,,244,', +',,,,-588,-588,-588,-588,-588,-588,-588,-588,-588,-588,-588,-588,-588', +'-588,,,-588,-588,-588,,,-588,,,-588,,,-588,-588,,-588,,-588,,-588,,-588', +'-588,,-588,-588,-588,-588,-588,,-588,-588,-588,,,,,,,,,,,,,,-588,,,-588', +'-588,-588,-588,,-588,-297,-588,,,,,-588,-297,-297,-297,,,-297,-297,-297', +'242,-297,,,,,,,,,,-297,-297,,,,256,257,,,,-297,-297,,-297,-297,-297', +'-297,-297,,,,239,,245,,241,240,,237,238,,,243,,244,,,,,,-297,-297,-297', +'-297,-297,-297,-297,-297,-297,-297,-297,-297,-297,-297,,,-297,-297,-297', +',,-297,,276,-297,,,-297,-297,,-297,,-297,,-297,,-297,-297,,-297,-297', +'-297,-297,-297,,-297,,-297,,,,,,,,,,,,,,-297,,,-297,-297,,-297,,-297', +'294,74,75,71,9,57,-297,,,63,64,,,,67,,65,66,68,30,31,72,73,,,,,,29,28', +'27,103,102,104,105,,,19,,,,,600,8,45,296,10,107,106,108,97,56,99,98', +'100,,101,109,110,,93,94,42,43,41,242,246,251,252,253,248,250,258,259', +'254,255,,235,236,,,256,257,,40,,,33,,,58,59,,,60,,35,239,,245,44,241', +'240,,237,238,249,247,243,20,244,,,,91,81,84,85,,86,88,87,89,,,,,82,90', +',260,,-238,,,62,,83,95,96,294,74,75,71,9,57,,,,63,64,,,,67,,65,66,68', +'30,31,72,73,,,,,,29,28,27,103,102,104,105,,,19,,,,,600,8,45,296,10,107', +'106,108,97,56,99,98,100,,101,109,110,,93,94,42,43,41,242,246,251,252', +'253,248,250,258,259,254,255,,235,236,,,256,257,,40,,,33,,,58,59,,,60', +',35,239,,245,44,241,240,,237,238,249,247,243,20,244,,,,91,81,84,85,', +'86,88,87,89,,,,,82,90,,260,,,,,62,,83,95,96,294,74,75,71,9,57,,,,63', +'64,,,,67,,65,66,68,30,31,72,73,,,,,,29,28,27,103,102,104,105,,,19,,', +',,,8,45,296,10,107,106,108,97,56,99,98,100,,101,109,110,,93,94,42,43', +'41,242,246,251,252,253,248,250,258,259,254,255,,235,236,,,256,257,,40', +',,33,,,58,59,,,60,,35,239,,245,44,241,240,,237,238,249,247,243,20,244', +',,,91,81,84,85,,86,88,87,89,,,,,82,90,222,260,,,,,62,,83,95,96,294,74', +'75,71,9,57,,,,63,64,,,,67,,65,66,68,30,31,72,73,,,,,,29,28,27,103,102', +'104,105,,,19,,,,,,8,45,296,10,107,106,108,97,56,99,98,100,,101,109,110', +',93,94,42,43,41,242,246,251,252,253,248,250,258,259,254,255,,235,236', +',,256,257,,40,,,33,,,58,59,,,60,,35,239,,245,44,241,240,,237,238,249', +'247,243,20,244,,,,91,81,84,85,,86,88,87,89,,,,,82,90,,260,,,,,62,,83', +'95,96,294,74,75,71,9,57,,,,63,64,,,,67,,65,66,68,30,31,72,73,,,,,,29', +'28,27,103,102,104,105,,,19,,,,,,8,45,296,10,107,106,108,97,56,99,98', +'100,,101,109,110,,93,94,42,43,41,242,246,251,252,253,248,250,258,259', +'254,255,,235,236,,,256,257,,40,,,33,,,58,59,,,60,,35,239,,245,44,241', +'240,,237,238,249,247,243,20,244,,,,91,81,84,85,,86,88,87,89,,,,,82,90', +',260,,,,,62,,83,95,96,294,74,75,71,9,57,,,,63,64,,,,67,,65,66,68,30', +'31,72,73,,,,,,29,28,27,103,102,104,105,,,19,,,,,,8,45,296,10,107,106', +'108,97,56,99,98,100,,101,109,110,,93,94,42,43,41,242,246,251,252,253', +'248,250,258,259,254,255,,235,236,,,256,257,,40,,,33,,,58,59,,,60,,35', +'239,,245,44,241,240,,237,238,249,247,243,20,244,,,,91,81,84,85,,86,88', +'87,89,,,,,82,90,,260,,,,,62,,83,95,96,294,74,75,71,9,57,,,,63,64,,,', +'67,,65,66,68,30,31,72,73,,,,,,29,28,27,103,102,104,105,,,19,,,,,,8,45', +'296,10,107,106,108,97,56,99,98,100,,101,109,110,,93,94,42,43,41,242', +'246,251,252,253,248,250,258,259,254,255,,235,236,,,256,257,,40,,,33', +',,58,59,,,60,,35,239,,245,44,241,240,,237,238,249,247,243,20,244,,,', +'91,81,84,85,,86,88,87,89,,,,,82,90,,260,,,,,62,,83,95,96,294,74,75,71', +'9,57,,,,63,64,,,,67,,65,66,68,30,31,72,73,,,,,,29,28,27,103,102,104', +'105,,,19,,,,,,8,45,296,10,107,106,108,97,56,99,98,100,,101,109,110,', +'93,94,42,43,41,242,246,251,252,253,248,250,258,259,254,255,,235,236', +',,256,257,,40,,,33,,,58,59,,,60,,35,239,,245,44,241,240,,237,238,249', +'247,243,20,244,,,,91,81,84,85,,86,88,87,89,,,,,82,90,,260,,,,,62,,83', +'95,96,294,74,75,71,9,57,,,,63,64,,,,67,,65,66,68,30,31,72,73,,,,,,29', +'28,27,103,102,104,105,,,19,,,,,,8,45,296,10,107,106,108,97,56,99,98', +'100,,101,109,110,,93,94,42,43,41,242,-607,-607,-607,-607,248,250,,,-607', +'-607,,,,,,256,257,,40,,,33,,,58,59,,,60,,35,239,,245,44,241,240,,237', +'238,249,247,243,20,244,,,,91,81,84,85,,86,88,87,89,,,,,82,90,,,,,,,62', +',83,95,96,294,74,75,71,9,57,,,,63,64,,,,67,,65,66,68,30,31,72,73,,,', +',,29,28,27,103,102,104,105,,,19,,,,,,8,45,296,10,107,106,108,97,56,99', +'98,100,,101,109,110,,93,94,42,43,41,242,-607,-607,-607,-607,248,250', +',,-607,-607,,,,,,256,257,,40,,,33,,,58,59,,,60,,35,239,,245,44,241,240', +',237,238,249,247,243,20,244,,,,91,81,84,85,,86,88,87,89,,,,,82,90,,', +',,,,62,,83,95,96,294,74,75,71,9,57,,,,63,64,,,,67,,65,66,68,30,31,72', +'73,,,,,,29,28,27,103,102,104,105,,,19,,,,,,8,45,296,10,107,106,108,97', +'56,99,98,100,,101,109,110,,93,94,42,43,41,242,246,251,252,253,248,250', +'258,259,254,255,,-607,-607,,,256,257,,40,,,33,,,58,59,,,60,,35,239,', +'245,44,241,240,,237,238,249,247,243,20,244,,,,91,81,84,85,,86,88,87', +'89,,,,,82,90,,,,,,,62,,83,95,96,5,74,75,71,9,57,,,,63,64,,,,67,,65,66', +'68,30,31,72,73,,,,,,29,28,27,103,102,104,105,,,19,,,,,,8,45,7,10,107', +'106,108,97,56,99,98,100,,101,109,110,,93,94,42,43,41,242,-607,-607,-607', +'-607,248,250,,,-607,-607,,,,,,256,257,,40,,,33,,,58,59,,,60,,35,239', +',245,44,241,240,,237,238,249,247,243,20,244,,,,91,81,84,85,,86,88,87', +'89,,,,,82,90,,,,,,,62,,83,95,96,5,74,75,71,9,57,,,,63,64,,,,67,,65,66', +'68,30,31,72,73,,,,,,29,28,27,103,102,104,105,,,19,,,,,,8,45,7,10,107', +'106,108,97,56,99,98,100,,101,109,110,,93,94,42,43,41,242,,,,,,,,,,,', +',,,,256,257,,40,,,33,,,58,59,,,60,,35,239,,245,44,241,240,,237,238,', +',243,20,244,,,,91,81,84,85,,86,88,87,89,,,,,82,90,,,,,,,62,,83,95,96', +'294,74,75,71,9,57,,,,63,64,,,,67,,65,66,68,30,31,72,73,,,,,,29,28,27', +'103,102,104,105,,,19,,,,,,8,45,296,10,107,106,108,97,56,99,98,100,,101', +'109,110,,93,94,42,43,41,242,-607,-607,-607,-607,248,250,,,-607,-607', +',,,,,256,257,,40,,,33,,,58,59,,,60,,35,239,,245,44,241,240,,237,238', +'249,247,243,20,244,,,,91,81,84,85,,86,88,87,89,,,,,82,90,,,,,,,62,,83', +'95,96,294,74,75,71,9,57,,,,63,64,,,,67,,65,66,68,30,31,72,73,,,,,,29', +'28,27,103,102,104,105,,,19,,,,,,8,45,296,10,107,106,108,97,56,99,98', +'100,,101,109,110,,93,94,42,43,41,242,-607,-607,-607,-607,248,250,,,-607', +'-607,,,,,,256,257,,40,,,33,,,58,59,,,60,,35,239,,245,44,241,240,,237', +'238,249,247,243,20,244,,,,91,81,84,85,,86,88,87,89,,,,,82,90,,,,,,,62', +',83,95,96,294,74,75,71,9,57,,,,63,64,,,,67,,65,66,68,30,31,72,73,,,', +',,29,28,27,103,102,104,105,,,19,,,,,,8,45,296,10,107,106,108,97,56,99', +'98,100,,101,109,110,,93,94,42,43,41,242,-607,-607,-607,-607,248,250', +',,-607,-607,,,,,,256,257,,40,,,33,,,58,59,,,60,,35,239,,245,44,241,240', +',237,238,249,247,243,20,244,,,,91,81,84,85,,86,88,87,89,,,,,82,90,,', +',,,,62,,83,95,96,294,74,75,71,9,57,,,,63,64,,,,67,,65,66,68,30,31,72', +'73,,,,,,29,28,27,103,102,104,105,,,19,,,,,,8,45,296,10,107,106,108,97', +'56,99,98,100,,101,109,110,,93,94,42,43,41,242,246,251,252,253,248,250', +'258,259,254,255,,-607,-607,,,256,257,,40,,,33,,,58,59,,,60,,35,239,', +'245,44,241,240,,237,238,249,247,243,20,244,,,,91,81,84,85,,86,88,87', +'89,,,,,82,90,,,,,,,62,,83,95,96,294,74,75,71,9,57,,,,63,64,,,,67,,65', +'66,68,30,31,72,73,,,,,,29,28,27,103,102,104,105,,,19,,,,,,8,45,296,10', +'107,106,108,97,56,99,98,100,,101,109,110,,93,94,42,43,41,242,246,251', +'252,253,248,250,,,254,255,,,,,,256,257,,40,,,298,,,58,59,,,60,,35,239', +',245,44,241,240,,237,238,249,247,243,20,244,,,,91,81,84,85,,86,88,87', +'89,,,,,82,90,,,,,,,62,,83,95,96,294,74,75,71,9,57,,,,63,64,,,,67,,65', +'66,68,30,31,72,73,,,,,,29,28,27,103,102,104,105,,,19,,,,,,8,45,296,10', +'107,106,108,97,56,99,98,100,,101,109,110,,93,94,42,43,41,242,246,251', +'252,253,248,250,258,,254,255,,,,,,256,257,,40,,,33,,,58,59,,,60,,35', +'239,,245,44,241,240,,237,238,249,247,243,20,244,,,,91,81,84,85,,86,88', +'87,89,,,,,82,90,,,,,,,62,,83,95,96,294,74,75,71,9,57,,,,63,64,,,,67', +',65,66,68,30,31,72,73,,,,,,29,28,27,103,102,104,105,,,19,,,,,,8,45,296', +'10,107,106,108,97,56,99,98,100,,101,109,110,,93,94,42,43,41,242,,,,', +',,,,,,,,,,,256,257,,40,,,298,,,58,59,,,60,,35,239,,245,44,241,240,,237', +'238,,,,20,,,,,91,81,84,85,,86,88,87,89,,,,,82,90,,,,,,,62,,83,95,96', +'294,74,75,71,9,57,,,,63,64,,,,67,,65,66,68,30,31,72,73,,,,,,29,28,27', +'103,102,104,105,,,19,,,,,,8,45,296,10,107,106,108,97,56,99,98,100,,101', +'109,110,,93,94,42,43,41,242,,,,,,,,,,,,,,,,256,257,,40,,,33,,,58,59', +',,60,,35,239,,245,44,241,240,,237,238,,,,20,,,,,91,81,84,85,,86,88,87', +'89,,,,,82,90,,,,,,,62,,83,95,96,294,74,75,71,9,57,,,,63,64,,,,67,,65', +'66,68,30,31,72,73,,,,,,29,28,27,103,102,104,105,,,19,,,,,,8,45,296,10', +'107,106,108,97,56,99,98,100,,101,109,110,,93,94,42,43,41,242,,,,,,,', +',,,,,,,,256,257,,40,,,33,,,58,59,,,60,,35,239,,,44,241,240,,237,238', +',,,20,,,,,91,81,84,85,,86,88,87,89,,,,,82,90,,,,,,,62,,83,95,96,294', +'74,75,71,9,57,,,,63,64,,,,67,,65,66,68,30,31,72,73,,,,,,29,28,27,103', +'102,104,105,,,19,,,,,,8,45,296,10,107,106,108,97,56,99,98,100,,101,109', +'110,,93,94,42,43,41,,,,,,,,,,,,,,,,,,,,40,,,33,,,58,59,,,60,,35,,,,44', +',,,,,,,,20,,,,,91,81,84,85,,86,88,87,89,,,,,82,90,,,,,,,62,,83,95,96', +'5,74,75,71,9,57,,,,63,64,,,,67,,65,66,68,30,31,72,73,,,,,,29,28,27,103', +'102,104,105,,,19,,,,,,8,45,7,10,107,106,108,97,56,99,98,100,,101,109', +'110,,93,94,42,43,41,,,,,,,,,,,,,,,,,,,,40,,,33,,,58,59,,,60,,35,,,,44', +',,,,,,,,20,,,,,91,81,84,85,,86,88,87,89,,,,,82,90,,,,,,,62,,83,95,96', +'294,74,75,71,9,57,,,,63,64,,,,67,,65,66,68,30,31,72,73,,,,,,29,28,27', +'103,102,104,105,,,19,,,,,,8,45,296,10,107,106,108,97,56,99,98,100,,101', +'109,110,,93,94,42,43,41,,,,,,,,,,,,,,,,,,,,40,,,33,,,58,59,,,60,,35', +',,,44,,,,,,,,,20,,,,,91,81,84,85,,86,88,87,89,,,,,82,90,,,,,,,62,,83', +'95,96,294,74,75,71,9,57,,,,63,64,,,,67,,65,66,68,30,31,72,73,,,,,,29', +'28,27,103,102,104,105,,,19,,,,,,8,45,296,10,107,106,108,97,56,99,98', +'100,,101,109,110,,93,94,42,43,41,,,,,,,,,,,,,,,,,,,,40,,,33,,,58,59', +',,60,,35,,,,44,,,,,,,,,20,,,,,91,81,84,85,,86,88,87,89,,,,,82,90,,,', +',,,62,,83,95,96,294,74,75,71,9,57,,,,63,64,,,,67,,65,66,68,30,31,72', +'73,,,,,,29,28,27,103,102,104,105,,,19,,,,,,8,45,296,10,107,106,108,97', +'56,99,98,100,,101,109,110,,93,94,42,43,41,,,,,,,,,,,,,,,,,,,,40,,,298', +',,58,59,,,60,,35,,,,44,,,,,,,,,20,,,,,91,81,84,85,,86,88,87,89,,,,,82', +'90,,,,,,,62,,83,95,96,294,74,75,71,9,57,,,,63,64,,,,67,,65,66,68,30', +'31,72,73,,,,,,29,28,27,103,102,104,105,,,19,,,,,,8,45,296,10,107,106', +'108,97,56,99,98,100,,101,109,110,,93,94,42,43,41,,,,,,,,,,,,,,,,,,,', +'40,,,33,,,58,59,,,60,,35,,,,44,,,,,,,,,20,,,,,91,81,84,85,,86,88,87', +'89,,,,,82,90,,,,,,,62,,83,95,96,294,74,75,71,9,57,,,,63,64,,,,67,,65', +'66,68,30,31,72,73,,,,,,29,28,27,103,102,104,105,,,19,,,,,,8,45,296,10', +'107,106,108,97,56,99,98,100,,101,109,110,,93,94,42,43,41,,,,,,,,,,,', +',,,,,,,,40,,,33,,,58,59,,,60,,35,,,,44,,,,,,,,,20,,,,,91,81,84,85,,86', +'88,87,89,,,,,82,90,,,,74,75,71,62,57,83,95,96,63,64,,,,67,,65,66,68', +'313,314,72,73,,,,,,309,310,316,103,102,104,105,,,234,,,,,,,45,,,107', +'106,108,97,56,99,98,100,,101,109,110,,93,94,42,43,41,,,,,,,,,,,,,,,', +',,,,227,,,233,,,58,59,,,60,,,,,,44,,,,,,,,,232,,,,,91,81,84,85,,86,88', +'87,89,,,,,82,90,,,,74,75,71,62,57,83,95,96,63,64,,,,67,,65,66,68,30', +'31,72,73,,,,,,29,28,27,103,102,104,105,,,234,,,,,,,45,,,107,106,108', +'97,56,99,98,100,288,101,109,110,,93,94,42,43,41,,,,,,,,,,,,,,,,,,,,227', +',,233,,,58,59,,,60,,285,,283,,44,,,289,,,,,,232,,,,,91,286,84,85,,86', +'88,87,89,,,,,82,90,,,,74,75,71,62,57,83,95,96,63,64,,,,67,,65,66,68', +'30,31,72,73,,,,,,29,28,27,103,102,104,105,,,234,,,,,,,45,,,107,106,108', +'97,56,99,98,100,288,101,109,110,,93,94,42,43,41,,,,,,,,,,,,,,,,,,,,227', +',,233,,,58,59,,,60,,285,,283,,44,,,289,,,,,,232,,,,,91,286,84,85,,86', +'88,87,89,,,,,82,90,,,,74,75,71,62,57,83,95,96,63,64,,,,67,,65,66,68', +'30,31,72,73,,,,,,29,28,27,103,102,104,105,,,234,,,,,,,45,,,107,106,108', +'97,56,99,98,100,288,101,109,110,,93,94,42,43,41,,,,,,,,,,,,,,,,,,,,227', +',,233,,,58,59,,,60,,285,,283,,44,,,289,,,,,,232,,,,,91,286,84,85,,86', +'88,87,89,,,,,82,90,,,,74,75,71,62,57,83,95,96,63,64,,,,67,,65,66,68', +'313,314,72,73,,,,,,309,310,316,103,102,104,105,,,234,,,,,,,311,,,107', +'106,108,97,56,99,98,100,,101,109,110,,93,94,,,317,,,,,,,,,,,,,,,,,,', +',307,,,233,,,58,59,,,60,,,678,,675,674,673,683,676,,,,,,,,,686,,91,81', +'84,85,,86,88,87,89,,,,,82,90,,,,512,,681,62,,83,95,96,74,75,71,,57,694', +'693,,63,64,687,,,67,,65,66,68,313,314,72,73,,,,,,309,310,316,103,102', +'104,105,,,234,,,,,,,45,,,107,106,108,97,56,99,98,100,,101,109,110,,93', +'94,42,43,41,,,,,,,,,,,,,,,,,,,,227,,,233,,,58,59,,,60,,,,,,44,,,,,,', +',,232,,,,,91,81,84,85,,86,88,87,89,,,,,82,90,,,,74,75,71,62,57,83,95', +'96,63,64,,,,67,,65,66,68,313,314,72,73,,,,,,309,310,316,103,102,104', +'105,,,234,,,,,,,311,,,107,106,108,97,56,99,98,100,,101,109,110,,93,94', +',,317,,,,,,,,,,,,,,,,,,,,921,,,233,,,58,59,,,60,,,,,,,,,,,,,,,,,,,,91', +'81,84,85,,86,88,87,89,,,,,82,90,,,,74,75,71,62,57,83,95,96,63,64,,,', +'67,,65,66,68,313,314,72,73,,,,,,309,310,316,103,102,104,105,,,234,,', +',,,,311,,,107,106,108,97,56,99,98,100,,101,109,110,,93,94,,,317,,,,', +',,,,,,,,,,,,,,,927,,,233,,,58,59,,,60,,,,,,,,,,,,,,,,,,,,91,81,84,85', +',86,88,87,89,,,,,82,90,,,,74,75,71,62,57,83,95,96,63,64,,,,67,,65,66', +'68,313,314,72,73,,,,,,309,310,316,103,102,104,105,,,234,,,,,,,45,,,107', +'106,108,97,56,99,98,100,,101,109,110,,93,94,42,43,41,,,,,,,,,,,,,,,', +',,,,227,,,233,,,58,59,,,60,,,,,,44,,,,,,,,,232,,,,,91,81,84,85,,86,88', +'87,89,,,,,82,90,,,,74,75,71,62,57,83,95,96,63,64,,,,67,,65,66,68,313', +'314,72,73,,,,,,309,310,316,103,102,104,105,,,234,,,,,,,311,,,107,106', +'108,97,56,99,98,100,,101,109,110,,93,94,,,317,,,,,,,,,,,,,,,,,,,,307', +',,303,,,58,59,,,60,,302,,,,,,,,,,,,,,,,,,91,81,84,85,,86,88,87,89,,', +',,82,90,,,,74,75,71,62,57,83,95,96,63,64,,,,67,,65,66,68,313,314,72', +'73,,,,,,309,310,316,103,102,104,105,,,234,,,,,,,311,,,107,106,108,97', +'56,99,98,100,,101,109,110,,93,94,,,317,,,,,,,,,,,,,,,,,,,,307,,,233', +',,58,59,,,60,,,678,,675,674,673,683,676,,,,,,,,,686,,91,81,84,85,,86', +'88,87,89,,,,,82,90,,,,319,,681,62,,83,95,96,74,75,71,9,57,694,693,,63', +'64,687,,,67,,65,66,68,30,31,72,73,,,,,,29,28,27,103,102,104,105,,,19', +',,,,,8,45,7,10,107,106,108,97,56,99,98,100,,101,109,110,,93,94,42,43', +'41,,,,,,,,,,,,,,,,,,,,40,,,33,,,58,59,,,60,,35,,,,44,,,,,,,,,20,,,,', +'91,81,84,85,,86,88,87,89,,,,,82,90,,,,74,75,71,62,57,83,95,96,63,64', +',,,67,,65,66,68,313,314,72,73,,,,,,309,310,316,103,102,104,105,,,234', +',,,,,,45,,,107,106,108,97,56,99,98,100,,101,109,110,,93,94,42,43,41', +',,,,,,,,,,,,,,,,,,,227,,,233,,,58,59,,,60,,,,,,44,,,,,,,,,232,,,,,91', +'81,84,85,,86,88,87,89,,,,,82,90,,,,74,75,71,62,57,83,95,96,63,64,,,', +'67,,65,66,68,313,314,72,73,,,,,,309,310,316,103,102,104,105,,,234,,', +',,,,311,,,107,106,108,97,56,99,98,100,,101,109,110,,93,94,,,317,,,,', +',,,,,,,,,,,,,,,307,,,303,,,58,59,,,60,,,,,,,,,,,,,,,,,,,,91,81,84,85', +',86,88,87,89,,,,,82,90,,,,74,75,71,62,57,83,95,96,63,64,,,,67,,65,66', +'68,313,314,72,73,,,,,,309,310,316,103,102,104,105,,,234,,,,,,,45,,,107', +'106,108,97,56,99,98,100,,101,109,110,,93,94,42,43,41,,,,,,,,,,,,,,,', +',,,,227,,,233,,,58,59,,,60,,,,,,44,,,,,,,,,232,,,,,91,81,84,85,,86,88', +'87,89,,,,,82,90,,,,74,75,71,62,57,83,95,96,63,64,,,,67,,65,66,68,313', +'314,72,73,,,,,,309,310,316,103,102,104,105,,,234,,,,,,,45,,,107,106', +'108,97,56,99,98,100,,101,109,110,,93,94,42,43,41,,,,,,,,,,,,,,,,,,,', +'227,,,233,,,58,59,,,60,,,,,,44,,,,,,,,,232,,,,,91,81,84,85,,86,88,87', +'89,,,,,82,90,,,,74,75,71,62,57,83,95,96,63,64,,,,67,,65,66,68,313,314', +'72,73,,,,,,309,310,316,103,102,104,105,,,234,,,,,,,311,,,107,106,108', +'97,56,99,98,100,,101,109,110,,93,94,,,317,,,,,,,,,,,,,,,,,,,,307,,,303', +',,58,59,,,60,,,,,,,,,,,,,,,,,,,,91,81,84,85,,86,88,87,89,,,,,82,90,', +',,74,75,71,62,57,83,95,96,63,64,,,,67,,65,66,68,313,314,72,73,,,,,,309', +'310,316,103,102,104,105,,,234,,,,,,,45,,,107,106,108,97,56,99,98,100', +',101,109,110,,93,94,42,43,41,,,,,,,,,,,,,,,,,,,,227,,,233,,,58,59,,', +'60,,,,,,44,,,,,,,,,232,,,,,91,81,84,85,,86,88,87,89,,,,,82,90,,,,74', +'75,71,62,57,83,95,96,63,64,,,,67,,65,66,68,313,314,72,73,,,,,,309,310', +'316,103,102,104,105,,,234,,,,,,,45,,,107,106,108,97,56,99,98,100,,101', +'109,110,,93,94,42,43,41,,,,,,,,,,,,,,,,,,,,227,,,233,,,58,59,,,60,,', +',,,44,,,,,,,,,232,,,,,91,81,84,85,,86,88,87,89,,,,,82,90,,,,74,75,71', +'62,57,83,95,96,63,64,,,,67,,65,66,68,313,314,72,73,,,,,,309,310,316', +'103,102,104,105,,,234,,,,,,,45,,,107,106,108,97,56,99,98,100,,101,109', +'110,,93,94,42,43,41,,,,,,,,,,,,,,,,,,,,227,,,233,,,58,59,,,60,,,,,,44', +',,,,,,,,232,,,,,91,81,84,85,,86,88,87,89,,,,,82,90,,,,74,75,71,62,57', +'83,95,96,63,64,,,,67,,65,66,68,30,31,72,73,,,,,,29,28,27,103,102,104', +'105,,,234,,,,,,,45,,,107,106,108,97,56,99,98,100,,101,109,110,,93,94', +'42,43,41,,,,,,,,,,,,,,,,,,,,227,,,233,,,58,59,,,60,,,,,,44,,,,,,,,,232', +',,,,91,81,84,85,,86,88,87,89,,,,,82,90,,,,74,75,71,62,57,83,95,96,63', +'64,,,,67,,65,66,68,313,314,72,73,,,,,,309,310,316,103,102,104,105,,', +'234,,,,,,,45,,,107,106,108,97,56,99,98,100,,101,109,110,,93,94,42,43', +'41,,,,,,,,,,,,,,,,,,,,227,,,233,,,58,59,,,60,,,,,,44,,,,,,,,,232,,,', +',91,81,84,85,,86,88,87,89,,,,,82,90,,,,74,75,71,62,57,83,95,96,63,64', +',,,67,,65,66,68,313,314,72,73,,,,,,309,310,316,103,102,104,105,,,234', +',,,,,,311,,,107,106,108,97,56,99,98,100,,101,109,110,,93,94,,,317,,', +',,,,,,,,,,,,,,,,,921,,,233,,,58,59,,,60,,,,,,,,,,,,,,,,,,,,91,81,84', +'85,,86,88,87,89,,,,,82,90,,,,74,75,71,62,57,83,95,96,63,64,,,,67,,65', +'66,68,30,31,72,73,,,,,,29,28,27,103,102,104,105,,,234,,,,,,,45,,,107', +'106,108,97,56,99,98,100,,101,109,110,,93,94,42,43,41,,,,,,,,,,,,,,,', +',,,,227,,,233,,,58,59,,,60,,,,,,44,,,,,,,,,232,,,,,91,81,84,85,,86,88', +'87,89,,,,,82,90,,,,74,75,71,62,57,83,95,96,63,64,,,,67,,65,66,68,30', +'31,72,73,,,,,,29,28,27,103,102,104,105,,,234,,,,,,,45,,,107,106,108', +'97,56,99,98,100,,101,109,110,,93,94,42,43,41,,,,,,,,,,,,,,,,,,,,227', +',,233,,,58,59,,,60,,,,,,44,,,,,,,,,232,,,,,91,81,84,85,,86,88,87,89', +',,,,82,90,,,,74,75,71,62,57,83,95,96,63,64,,,,67,,65,66,68,313,314,72', +'73,,,,,,309,310,316,103,102,104,105,,,234,,,,,,,45,,,107,106,108,97', +'56,99,98,100,,101,109,110,,93,94,42,43,41,,,,,,,,,,,,,,,,,,,,227,,,233', +',,58,59,,,60,,635,,,,44,,,,,,,,,232,,,,,91,81,84,85,,86,88,87,89,,,', +',82,90,,,,74,75,71,62,57,83,95,96,63,64,,,,67,,65,66,68,30,31,72,73', +',,,,,29,28,27,103,102,104,105,,,234,,,,,,,45,,,107,106,108,97,56,99', +'98,100,288,101,109,110,,93,94,42,43,41,,,,,,,,,,,,,,,,,,,,227,,,233', +',,58,59,,,60,,285,,283,,44,,,289,,,,,,232,,,,,91,286,84,85,,86,88,87', +'89,,,,,82,90,,,,74,75,71,62,57,83,95,96,63,64,,,,67,,65,66,68,313,314', +'72,73,,,,,,309,310,316,103,102,104,105,,,234,,,,,,,45,,,107,106,108', +'97,56,99,98,100,,101,109,110,,93,94,42,43,41,,,,,,,,,,,,,,,,,,,,227', +',,233,,,58,59,,,60,,,,,,44,,,,,,,,,232,,,,,91,81,84,85,,86,88,87,89', +',,,,82,90,,,,74,75,71,62,57,83,95,96,63,64,,,,67,,65,66,68,30,31,72', +'73,,,,,,29,28,27,103,102,104,105,,,19,,,,,,,45,,,107,106,108,97,56,99', +'98,100,,101,109,110,,93,94,42,43,41,,,,,,,,,,,,,,,,,,,,227,,,233,,,58', +'59,,,60,,,,,,44,,,,,,,,,20,,,,,91,81,84,85,,86,88,87,89,,,,,82,90,,', +',74,75,71,62,57,83,95,96,63,64,,,,67,,65,66,68,313,314,72,73,,,,,,309', +'310,316,103,102,104,105,,,234,,,,,,,45,,,107,106,108,97,56,99,98,100', +',101,109,110,,93,94,42,43,41,,,,,,,,,,,,,,,,,,,,227,,,233,,,58,59,,', +'60,,,,,,44,,,,,,,,,232,,,,,91,81,84,85,,86,88,87,89,,,,,82,90,,,,74', +'75,71,62,57,83,95,96,63,64,,,,67,,65,66,68,313,314,72,73,,,,,,309,310', +'316,103,102,104,105,,,234,,,,,,,45,,,107,106,108,97,56,99,98,100,,101', +'109,110,,93,94,42,43,41,,,,,,,,,,,,,,,,,,,,227,,,233,,,58,59,,,60,,', +',,,44,,,,,,,,,232,,,,,91,81,84,85,,86,88,87,89,,,,,82,90,,,,74,75,71', +'62,57,83,95,96,63,64,,,,67,,65,66,68,313,314,72,73,,,,,,309,310,316', +'103,102,104,105,,,234,,,,,,,45,,,107,106,108,97,56,99,98,100,,101,109', +'110,,93,94,42,43,41,,,,,,,,,,,,,,,,,,,,227,,,233,,,58,59,,,60,,,,,,44', +',,,,,,,,232,,,,,91,81,84,85,,86,88,87,89,,,,,82,90,,,,74,75,71,62,57', +'83,95,96,63,64,,,,67,,65,66,68,313,314,72,73,,,,,,309,310,316,103,102', +'104,105,,,234,,,,,,,45,,,107,106,108,97,56,99,98,100,,101,109,110,,93', +'94,42,43,41,,,,,,,,,,,,,,,,,,,,227,,,233,,,58,59,,,60,,,,,,44,,,,,,', +',,232,,,,,91,81,84,85,,86,88,87,89,,,,,82,90,,,,74,75,71,62,57,83,95', +'96,63,64,,,,67,,65,66,68,313,314,72,73,,,,,,309,310,316,103,102,104', +'105,,,234,,,,,,,45,,,107,106,108,97,56,99,98,100,,101,109,110,,93,94', +'42,43,41,,,,,,,,,,,,,,,,,,,,227,,,233,,,58,59,,,60,,,,,,44,,,,,,,,,232', +',,,,91,81,84,85,,86,88,87,89,,,,,82,90,,,,74,75,71,62,57,83,95,96,63', +'64,,,,67,,65,66,68,313,314,72,73,,,,,,309,310,316,103,102,104,105,,', +'234,,,,,,,45,,,107,106,108,97,56,99,98,100,,101,109,110,,93,94,42,43', +'41,,,,,,,,,,,,,,,,,,,,227,,,233,,,58,59,,,60,,,,,,44,,,,,,,,,232,,,', +',91,81,84,85,,86,88,87,89,,,,,82,90,,,,74,75,71,62,57,83,95,96,63,64', +',,,67,,65,66,68,30,31,72,73,,,,,,29,28,27,103,102,104,105,,,234,,,,', +',,45,,,107,106,108,97,56,99,98,100,,101,109,110,,93,94,42,43,41,,,,', +',,,,,,,,,,,,,,,227,,,233,,,58,59,,,60,,,,,,44,,,,,,,,,232,,,,,91,81', +'84,85,,86,88,87,89,,,,,82,90,,,,74,75,71,62,57,83,95,96,63,64,,,,67', +',65,66,68,313,314,72,73,,,,,,309,310,316,103,102,104,105,,,234,,,,,', +',45,,,107,106,108,97,56,99,98,100,,101,109,110,,93,94,42,43,41,,,,,', +',,,,,,,,,,,,,,227,,,233,,,58,59,,,60,,,,,,44,,,,,,,,,232,,,,,91,81,84', +'85,,86,88,87,89,,,,,82,90,,,,74,75,71,62,57,83,95,96,63,64,,,,67,,65', +'66,68,313,314,72,73,,,,,,309,310,316,103,102,104,105,,,234,,,,,,,45', +',,107,106,108,97,56,99,98,100,,101,109,110,,93,94,42,43,41,,,,,,,,,', +',,,,,,,,,,227,,,233,,,58,59,,,60,,,,,,44,,,,,,,,,232,,,,,91,81,84,85', +',86,88,87,89,,,,,82,90,,,,74,75,71,62,57,83,95,96,63,64,,,,67,,65,66', +'68,313,314,72,73,,,,,,309,310,316,103,102,104,105,,,234,,,,,,,45,,,107', +'106,108,97,56,99,98,100,,101,109,110,,93,94,42,43,41,,,,,,,,,,,,,,,', +',,,,227,,,233,,,58,59,,,60,,,,,,44,,,,,,,,,232,,,,,91,81,84,85,,86,88', +'87,89,,,,,82,90,,,,74,75,71,62,57,83,95,96,63,64,,,,67,,65,66,68,313', +'314,72,73,,,,,,309,310,316,103,102,104,105,,,234,,,,,,,45,,,107,106', +'108,97,56,99,98,100,,101,109,110,,93,94,42,43,41,,,,,,,,,,,,,,,,,,,', +'227,,,233,,,58,59,,,60,,,,,,44,,,,,,,,,232,,,,,91,81,84,85,,86,88,87', +'89,,,,,82,90,,,,74,75,71,62,57,83,95,96,63,64,,,,67,,65,66,68,313,314', +'72,73,,,,,,309,310,316,103,102,104,105,,,234,,,,,,,45,,,107,106,108', +'97,56,99,98,100,,101,109,110,,93,94,42,43,41,,,,,,,,,,,,,,,,,,,,227', +',,233,,,58,59,,,60,,,,,,44,,,,,,,,,232,,,,,91,81,84,85,,86,88,87,89', +',,,,82,90,,,,74,75,71,62,57,83,95,96,63,64,,,,67,,65,66,68,313,314,72', +'73,,,,,,309,310,316,103,102,104,105,,,234,,,,,,,45,,,107,106,108,97', +'56,99,98,100,,101,109,110,,93,94,42,43,41,,,,,,,,,,,,,,,,,,,,227,,,233', +',,58,59,,,60,,,,,,44,,,,,,,,,232,,,,,91,81,84,85,,86,88,87,89,,,,,82', +'90,,,,74,75,71,62,57,83,95,96,63,64,,,,67,,65,66,68,313,314,72,73,,', +',,,309,310,316,103,102,104,105,,,234,,,,,,,45,,,107,106,108,97,56,99', +'98,100,,101,109,110,,93,94,42,43,41,,,,,,,,,,,,,,,,,,,,227,,,233,,,58', +'59,,,60,,,,,,44,,,,,,,,,232,,,,,91,81,84,85,,86,88,87,89,,,,,82,90,', +',,74,75,71,62,57,83,95,96,63,64,,,,67,,65,66,68,313,314,72,73,,,,,,309', +'310,316,103,102,104,105,,,234,,,,,,,45,,,107,106,108,97,56,99,98,100', +',101,109,110,,93,94,42,43,41,,,,,,,,,,,,,,,,,,,,227,,,233,,,58,59,,', +'60,,,,,,44,,,,,,,,,232,,,,,91,81,84,85,,86,88,87,89,,,,,82,90,,,,74', +'75,71,62,57,83,95,96,63,64,,,,67,,65,66,68,313,314,72,73,,,,,,309,310', +'316,103,102,104,105,,,234,,,,,,,45,,,107,106,108,97,56,99,98,100,,101', +'109,110,,93,94,42,43,41,,,,,,,,,,,,,,,,,,,,227,,,233,,,58,59,,,60,,', +',,,44,,,,,,,,,232,,,,,91,81,84,85,,86,88,87,89,,,,,82,90,,,,74,75,71', +'62,57,83,95,96,63,64,,,,67,,65,66,68,313,314,72,73,,,,,,309,310,316', +'103,102,104,105,,,234,,,,,,,45,,,107,106,108,97,56,99,98,100,,101,109', +'110,,93,94,42,43,41,,,,,,,,,,,,,,,,,,,,227,,,233,,,58,59,,,60,,,,,,44', +',,,,,,,,232,,,,,91,81,84,85,,86,88,87,89,,,,,82,90,,,,74,75,71,62,57', +'83,95,96,63,64,,,,67,,65,66,68,30,31,72,73,,,,,,29,28,27,103,102,104', +'105,,,234,,,,,,,45,,,107,106,108,97,56,99,98,100,288,101,109,110,,93', +'94,42,43,41,,,,,,,,,,,,,,,,,,,,227,,,233,,,58,59,,,60,,285,,283,,44', +',,289,,,,,,232,,,,,91,286,84,85,,86,88,87,89,,,,,82,90,,,,74,75,71,62', +'57,83,95,96,63,64,,,,67,,65,66,68,30,31,72,73,,,,,,29,28,27,103,102', +'104,105,,,234,,,,,,,45,,,107,106,108,97,56,99,98,100,288,101,109,110', +',93,94,42,43,41,,,,,,,,,,,,,,,,,,,,227,,,233,,,58,59,,,60,,285,,283', +',44,,,289,,,,,,232,,,,,91,286,84,85,,86,88,87,89,,,,,82,90,,,,74,75', +'71,62,57,83,95,96,63,64,,,,67,,65,66,68,30,31,72,73,,,,,,29,28,27,103', +'102,104,105,,,234,,,,,,,45,,,107,106,108,97,56,99,98,100,288,101,109', +'110,,93,94,42,43,41,,,,,,,,,,,,,,,,,,,,227,,,233,,,58,59,,,60,,285,', +'283,,44,,,289,,,,,,232,,,,,91,286,84,85,,86,88,87,89,,,,,82,90,222,', +',74,75,71,62,57,83,95,96,63,64,,,,67,,65,66,68,313,314,72,73,,,,,,309', +'310,316,103,102,104,105,,,234,,,,,,,45,,,107,106,108,97,56,99,98,100', +',101,109,110,,93,94,42,43,41,,,,,,,,,,,,,,,,,,,,227,,,233,,,58,59,,', +'60,,,,,,44,,,,,,,,,232,,,,,91,81,84,85,,86,88,87,89,,,,,82,90,,,,74', +'75,71,62,57,83,95,96,63,64,,,,67,,65,66,68,313,314,72,73,,,,,,309,310', +'316,103,102,104,105,,,234,,,,,,,45,,,107,106,108,97,56,99,98,100,,101', +'109,110,,93,94,42,43,41,,,,,,,,,,,,,,,,,,,,227,,,233,,,58,59,,,60,,', +',,,44,,,,,,,,,232,,,,,91,81,84,85,,86,88,87,89,,,,,82,90,,,,74,75,71', +'62,57,83,95,96,63,64,,,,67,,65,66,68,313,314,72,73,,,,,,309,310,316', +'103,102,104,105,,,234,,,,,,,45,,,107,106,108,97,56,99,98,100,,101,109', +'110,,93,94,42,43,41,,,,,,,,,,,,,,,,,,,,227,,,233,,,58,59,,,60,,,,,,44', +',,,,,,,,232,,,,,91,81,84,85,,86,88,87,89,,,,,82,90,,,,74,75,71,62,57', +'83,95,96,63,64,,,,67,,65,66,68,313,314,72,73,,,,,,309,310,316,103,102', +'104,105,,,234,,,,,,,45,,,107,106,108,97,56,99,98,100,,101,109,110,,93', +'94,42,43,41,,,,,,,,,,,,,,,,,,,,227,,,233,,,58,59,,,60,,,,,,44,,,,,,', +',,232,,,,,91,81,84,85,,86,88,87,89,,,,,82,90,,,,74,75,71,62,57,83,95', +'96,63,64,,,,67,,65,66,68,313,314,72,73,,,,,,309,310,316,103,102,104', +'105,,,234,,,,,,,45,,,107,106,108,97,56,99,98,100,,101,109,110,,93,94', +'42,43,41,,,,,,,,,,,,,,,,,,,,227,,,233,,,58,59,,,60,,,,,,44,,,,,,,,,232', +',,,,91,81,84,85,,86,88,87,89,,,,,82,90,,,,74,75,71,62,57,83,95,96,63', +'64,,,,67,,65,66,68,313,314,72,73,,,,,,309,310,316,103,102,104,105,,', +'234,,,,,,,45,,,107,106,108,97,56,99,98,100,,101,109,110,,93,94,42,43', +'41,,,,,,,,,,,,,,,,,,,,227,,,233,,,58,59,,,60,,,,,,44,,,,,,,,,232,,,', +',91,81,84,85,,86,88,87,89,,,,,82,90,,,,74,75,71,62,57,83,95,96,63,64', +',,,67,,65,66,68,313,314,72,73,,,,,,309,310,316,103,102,104,105,,,234', +',,,,,,45,,,107,106,108,97,56,99,98,100,,101,109,110,,93,94,42,43,41', +',,,,,,,,,,,,,,,,,,,227,,,233,,,58,59,,,60,,,,,,44,,,,,,,,,232,,,,,91', +'81,84,85,,86,88,87,89,,,,,82,90,,,,74,75,71,62,57,83,95,96,63,64,,,', +'67,,65,66,68,313,314,72,73,,,,,,309,310,316,103,102,104,105,,,234,,', +',,,,45,,,107,106,108,97,56,99,98,100,,101,109,110,,93,94,42,43,41,,', +',,,,,,,,,,,,,,,,,227,,,233,,,58,59,,,60,,407,,,,44,,,,,,,,,232,,,,,91', +'81,84,85,,86,88,87,89,,,,,82,90,,,,74,75,71,62,57,83,95,96,63,64,,,', +'67,,65,66,68,313,314,72,73,,,,,,309,310,316,103,102,104,105,,,234,,', +',,,,45,,,107,106,108,97,56,99,98,100,,101,109,110,,93,94,42,43,41,,', +',,,,,,,,,,,,,,,,,227,,,233,,,58,59,,,60,,,,,,44,,,,,,,,,232,,,,,91,81', +'84,85,,86,88,87,89,,,,,82,90,,,,74,75,71,62,57,83,95,96,63,64,,,,67', +',65,66,68,313,314,72,73,,,,,,309,310,316,103,102,104,105,,,234,,,,,', +',45,,,107,106,108,97,56,99,98,100,,101,109,110,,93,94,42,43,41,,,,,', +',,,,,,,,,,,,,,227,,,233,,,58,59,,,60,,,,,,44,,,,,,,,,232,,,,,91,81,84', +'85,,86,88,87,89,,,,,82,90,,,,74,75,71,62,57,83,95,96,63,64,,,,67,,65', +'66,68,30,31,72,73,,,,,,29,28,27,103,102,104,105,,,19,,,,,,,45,,,107', +'106,108,97,56,99,98,100,,101,109,110,,93,94,42,43,41,,,,,,,,,,,,,,,', +',,,,227,,,233,,,58,59,,,60,,,,,,44,,,,,,,,,20,,,,,91,81,84,85,,86,88', +'87,89,,,,,82,90,,,,74,75,71,62,57,83,95,96,63,64,,,,67,,65,66,68,313', +'314,72,73,,,,,,309,310,316,103,102,104,105,,,234,,,,,,,45,,,107,106', +'108,97,56,99,98,100,,101,109,110,,93,94,42,43,41,,,,,,,,,,,,,,,,,,,', +'227,,,233,,,58,59,,,60,,,,,,44,,,,,,,,,232,,,,,91,81,84,85,,86,88,87', +'89,,,,,82,90,,,,74,75,71,62,57,83,95,96,63,64,,,,67,,65,66,68,313,314', +'72,73,,,,,,309,310,316,103,102,104,105,,,234,,,,,,,45,,,107,106,108', +'97,56,99,98,100,,101,109,110,,93,94,42,43,41,,,,,,,,,,,,,,,,,,,,227', +',,233,,,58,59,,,60,,,,,,44,,,,,,,,,232,,,,,91,81,84,85,,86,88,87,89', +',,,,82,90,,,,74,75,71,62,57,83,95,96,63,64,,,,67,,65,66,68,313,314,72', +'73,,,,,,309,310,316,103,102,104,105,,,234,,,,,,,45,,,107,106,108,97', +'56,99,98,100,,101,109,110,,93,94,42,43,41,,,,,,,,,,,,,,,,,,,,227,,,233', +',,58,59,,,60,,,,,,44,,,,,,,,,232,,,,,91,81,84,85,,86,88,87,89,,,,,82', +'90,,,,74,75,71,62,57,83,95,96,63,64,,,,67,,65,66,68,313,314,72,73,,', +',,,309,310,316,103,102,104,105,,,234,,,,,,,45,,,107,106,108,97,56,99', +'98,100,,101,109,110,,93,94,42,43,41,,,,,,,,,,,,,,,,,,,,227,,,233,,,58', +'59,,,60,,,,,,44,,,,,,,,,232,,,,,91,81,84,85,,86,88,87,89,,,,,82,90,', +',,74,75,71,62,57,83,95,96,63,64,,,,67,,65,66,68,313,314,72,73,,,,,,309', +'310,316,103,102,104,105,,,234,,,,,,,311,,,107,106,108,97,56,99,98,100', +',101,109,110,,93,94,,,317,,,,,,,,,,,,,,,,,,,,307,,,303,,,58,59,,,60', +',,678,,675,674,673,683,676,,,,,,,,,686,,91,81,84,85,,86,88,87,89,,,', +',82,90,,,,,,681,62,,83,95,96,74,75,71,9,57,694,693,,63,64,687,,,67,', +'65,66,68,30,31,72,73,,,,,,29,28,27,103,102,104,105,,,19,,,,,,8,45,,10', +'107,106,108,97,56,99,98,100,,101,109,110,,93,94,42,43,41,,,,,,,,,,,', +',,,,,,,,40,,,33,,,58,59,,,60,,35,,,,44,,,,,,,,,20,,,,,91,81,84,85,,86', +'88,87,89,,,,,82,90,,,,74,75,71,62,57,83,95,96,63,64,,,,67,,65,66,68', +'313,314,72,73,,,,,,309,310,316,103,102,104,105,,,234,,,,,,,45,,,107', +'106,108,97,56,99,98,100,,101,109,110,,93,94,42,43,41,,,,,,,,,,,,,,,', +',,,,227,,,233,,,58,59,,,60,,,,,,44,,,,,,,,,232,,,,,91,81,84,85,,86,88', +'87,89,,,,,82,90,,,,74,75,71,62,57,83,95,96,63,64,,,,67,,65,66,68,313', +'314,72,73,,,,,,309,310,316,103,102,104,105,,,234,,,,,,,45,,,107,106', +'108,97,56,99,98,100,,101,109,110,,93,94,42,43,41,,,,,,,,,,,,,,,,,,,', +'227,,,233,,,58,59,,,60,,,,,,44,,,,,,,,,232,,,,,91,81,84,85,,86,88,87', +'89,,,,,82,90,,,,74,75,71,62,57,83,95,96,63,64,,,,67,,65,66,68,313,314', +'72,73,,,,,,309,310,316,103,102,104,105,,,234,,,,,,,45,,,107,106,108', +'97,56,99,98,100,288,101,109,110,,93,94,42,43,41,,,,,,,,,,,,,,,,,,,,227', +',,233,,,58,59,,,60,,,,283,,44,,,289,,,,,,232,,,,,91,286,84,85,,86,88', +'87,89,,,,,82,90,,,,74,75,71,62,57,83,95,96,63,64,,,,67,,65,66,68,313', +'314,72,73,,,,,,309,310,316,103,102,104,105,,,234,,,,,,,45,,,107,106', +'108,97,56,99,98,100,,101,109,110,,93,94,42,43,41,,,,,,,,,,,,,,,,,,,', +'227,,,233,,,58,59,,,60,,,,,,44,,,,,,,,,232,,,,,91,81,84,85,,86,88,87', +'89,,,,,82,90,,,,74,75,71,62,57,83,95,96,63,64,,,,67,,65,66,68,30,31', +'72,73,,,,,,29,28,27,103,102,104,105,,,19,,,,,,,45,,,107,106,108,97,56', +'99,98,100,,101,109,110,,93,94,42,43,41,,,,,,,,,,,,,,,,,,,,227,,,233', +',,58,59,,,60,,,,,,44,,,,,,,,,20,,,,,91,81,84,85,,86,88,87,89,,,,,82', +'90,222,,,74,75,71,62,57,83,95,96,63,64,,,,67,,65,66,68,30,31,72,73,', +',,,,29,28,27,103,102,104,105,,,19,,,,,,,45,,,107,106,108,97,56,99,98', +'100,,101,109,110,,93,94,42,43,41,,,,,,,,,,,,,,,,,,,,227,,,233,,,58,59', +',,60,,,,,,44,,,,,,,,,20,,,,,91,81,84,85,,86,88,87,89,,,,,82,90,,,,74', +'75,71,62,57,83,95,96,63,64,,,,67,,65,66,68,30,31,72,73,,,,,,29,28,27', +'103,102,104,105,,,234,,,,,,,45,,,107,106,108,97,56,99,98,100,,101,109', +'110,,93,94,42,43,41,,,,,,,,,,,,,,,,,,,,227,,,233,,,58,59,,,60,,,,,,44', +',,,,,,,,232,,,,,91,81,84,85,,86,88,87,89,,,,,82,90,,,,74,75,71,62,57', +'83,95,96,63,64,,,,67,,65,66,68,30,31,72,73,,,,,,29,28,27,103,102,104', +'105,,,234,,,,,,,45,,,107,106,108,97,56,99,98,100,288,101,109,110,,93', +'94,42,43,41,,,,,,,,,,,,,,,,,,,,227,,,233,,,58,59,,,60,,285,,283,,44', +',,289,,,,,,232,,,,,91,286,84,85,,86,88,87,89,,,,,82,90,,,,74,75,71,62', +'57,83,95,96,63,64,,,,67,,65,66,68,313,314,72,73,,,,,,309,310,316,103', +'102,104,105,,,234,,,,,,,45,,,107,106,108,97,56,99,98,100,,101,109,110', +',93,94,42,43,41,,,,,,,,,,,,,,,,,,,,227,,,233,,,58,59,,,60,,,,,,44,,', +',,,,,,232,,,,,91,81,84,85,,86,88,87,89,,,,,82,90,,,,74,75,71,62,57,83', +'95,96,63,64,,,,67,,65,66,68,30,31,72,73,,,,,,29,28,27,103,102,104,105', +',,234,,,,,,,45,,,107,106,108,97,56,99,98,100,288,101,109,110,,93,94', +'42,43,41,,,,,,,,,,,,,,,,,,,,227,,,233,,,58,59,,,60,,285,,283,,44,,,289', +',,,,,232,,,,,91,286,84,85,,86,88,87,89,,,,,82,90,,,,74,75,71,62,57,83', +'95,96,63,64,,,,67,,65,66,68,30,31,72,73,,,,,,29,28,27,103,102,104,105', +',,19,,,,,,,45,,,107,106,108,97,56,99,98,100,,101,109,110,,93,94,42,43', +'41,,,,,,,,,,,,,,,,,,,,227,,,233,,,58,59,,,60,,,,,,44,,,,,,,,,20,,,,', +'91,81,84,85,,86,88,87,89,,,,,82,90,,,,74,75,71,62,57,83,95,96,63,64', +',,,67,,65,66,68,30,31,72,73,,,,,,29,28,27,103,102,104,105,,,19,,,,,', +',45,,,107,106,108,97,56,99,98,100,,101,109,110,,93,94,42,43,41,,,,,', +',,,,,,,,,,,,,,227,,,233,,,58,59,,,60,,,,,,44,,,,,,,,,20,,,,,91,81,84', +'85,,86,88,87,89,,,,,82,90,,,,74,75,71,62,57,83,95,96,63,64,,,,67,,65', +'66,68,30,31,72,73,,,,,,29,28,27,103,102,104,105,,,234,,,,,,,45,,,107', +'106,108,97,56,99,98,100,288,101,109,110,,93,94,42,43,41,,,,,,,,,,,,', +',,,,,,,227,,,233,,,58,59,,,60,,285,,283,,44,,,289,,,,,,232,,,,,91,286', +'84,85,,86,88,87,89,,,,,82,90,,,,74,75,71,62,57,83,95,96,63,64,,,,67', +',65,66,68,313,314,72,73,,,,,,309,310,316,103,102,104,105,,,234,,,,,', +',45,,,107,106,108,97,56,99,98,100,,101,109,110,,93,94,42,43,41,,,,,', +',,,,,,,,,,,,,,227,,,233,,,58,59,,,60,,285,,,,44,,,,,,,,,232,,,,,91,81', +'84,85,,86,88,87,89,,,,,82,90,,,,74,75,71,62,57,83,95,96,63,64,,,,67', +',65,66,68,30,31,72,73,,,,,,29,28,27,103,102,104,105,,,234,,,,,,,45,', +',107,106,108,97,56,99,98,100,288,101,109,110,,93,94,42,43,41,,,,,,,', +',,,,,,,,,,,,227,,,233,,,58,59,,,60,,285,,283,,44,,,289,,,,,,232,,,,', +'91,286,84,85,,86,88,87,89,,,,,82,90,,,,74,75,71,62,57,83,95,96,63,64', +',,,67,,65,66,68,30,31,72,73,,,,,,29,28,27,103,102,104,105,,,234,,,,', +',,45,,,107,106,108,97,56,99,98,100,,101,109,110,,93,94,42,43,41,,,,', +',,,,,,,,,,,,,,,227,,,233,,,58,59,,,60,,,,,,44,,,,,,,,,232,,,,,91,81', +'84,85,,86,88,87,89,,,,,82,90,,,,74,75,71,62,57,83,95,96,63,64,,,,67', +',65,66,68,313,314,72,73,,,,,,309,310,316,103,102,104,105,,,234,,,,,', +',45,,,107,106,108,97,56,99,98,100,288,101,109,110,,93,94,42,43,41,,', +',,,,,,,,,,,,,,,,,227,,,233,,,58,59,,,60,,,,,,44,,,289,,,,,,232,,,,,91', +'286,84,85,,86,88,87,89,,,,,82,90,,,,74,75,71,62,57,83,95,96,63,64,,', +',67,,65,66,68,313,314,72,73,,,,,,309,310,316,103,102,104,105,,,234,', +',,,,,45,,,107,106,108,97,56,99,98,100,288,101,109,110,,93,94,42,43,41', +',,,,,,,,,,,,,,,,,,,227,,,233,,,58,59,,,60,,635,,,,44,,,289,,,,,,232', +',,,,91,286,84,85,,86,88,87,89,,,,,82,90,,,,74,75,71,62,57,83,95,96,63', +'64,,,,67,,65,66,68,30,31,72,73,,,,,,29,28,27,103,102,104,105,,,19,,', +',,,,45,,,107,106,108,97,56,99,98,100,,101,109,110,,93,94,42,43,41,,', +',,,,,,,,,,,,,,,,,227,,,233,,,58,59,,,60,,,,,,44,,,,,,,,,20,,,,,91,81', +'84,85,,86,88,87,89,,,,,82,90,,,,74,75,71,62,57,83,95,96,63,64,,,,67', +',65,66,68,30,31,72,73,,,,,,29,28,27,103,102,104,105,,,19,,,,,,,45,,', +'107,106,108,97,56,99,98,100,,101,109,110,,93,94,42,43,41,,,,,,,,,,,', +',,,,,,,,227,,,233,,,58,59,,,60,,,,,,44,,,,,,,,,20,,,,,91,81,84,85,,86', +'88,87,89,,,,,82,90,,,,74,75,71,62,57,83,95,96,63,64,,,,67,,65,66,68', +'30,31,72,73,,,,,,29,28,27,103,102,104,105,,,234,,,,,,,45,,,107,106,108', +'97,56,99,98,100,,101,109,110,,93,94,42,43,41,,,,,,,,,,,,,,,,,,,,227', +',,233,,,58,59,,,60,,407,,,,44,,,,,,,,,232,,,,,91,81,84,85,,86,88,87', +'89,,,,,82,90,,,,,,,62,,83,95,96,74,75,71,9,57,,,,63,64,,,,67,,65,66', +'68,30,31,72,73,,,,,,29,28,27,103,102,104,105,,,19,,,,,,8,45,,10,107', +'106,108,97,56,99,98,100,,101,109,110,,93,94,42,43,41,,,,,,,,,,,,,,,', +',,,,40,,,33,,,58,59,,,60,,35,,,,44,,,,,,,,,20,,,,,91,81,84,85,,86,88', +'87,89,,,,,82,90,,,,74,75,71,62,57,83,95,96,63,64,,,,67,,65,66,68,30', +'31,72,73,,,,,,29,28,27,103,102,104,105,,,234,,,,,,,45,,,107,106,108', +'97,56,99,98,100,,101,109,110,,93,94,42,43,41,,,,,,,,,,,,,,,,,,,,227', +',,233,,,58,59,,,60,,407,,,,44,,,,,,,,,232,,,,,91,81,84,85,,86,88,87', +'89,,,,,82,90,,,,74,75,71,62,57,83,95,96,63,64,,,,67,,65,66,68,30,31', +'72,73,,,,,,29,28,27,103,102,104,105,,,19,,,,,,,45,,,107,106,108,97,56', +'99,98,100,,101,109,110,,93,94,42,43,41,,,,,,,,,,,,,,,,,,,,227,,,233', +',,58,59,,,60,,,,,,44,,,,,,,,,20,,,,,91,81,84,85,,86,88,87,89,,,,,82', +'90,,,,74,75,71,62,57,83,95,96,63,64,,,,67,,65,66,68,313,314,72,73,,', +',,,309,310,316,103,102,104,105,,,234,,,,,,,45,,,107,106,108,97,56,99', +'98,100,288,101,109,110,,93,94,42,43,41,,,,,,,,,,,,,,,,,,,,227,,,233', +',,58,59,,,60,,285,,,,44,,,289,,,,,,232,,,,,91,286,84,85,,86,88,87,89', +',,,,82,90,,,,74,75,71,62,57,83,95,96,63,64,,,,67,,65,66,68,313,314,72', +'73,,,,,,309,310,316,103,102,104,105,,,234,,,,,,,45,,,107,106,108,97', +'56,99,98,100,,101,109,110,,93,94,42,43,41,,,,,,,,,,,,,,,,,,,,227,,,233', +',,58,59,,,60,,,,,,44,,,,,,,,,232,,,,,91,81,84,85,,86,88,87,89,,,,,82', +'90,,,,74,75,71,62,57,83,95,96,63,64,,,,67,,65,66,68,30,31,72,73,,,,', +',29,28,27,103,102,104,105,,,19,,,,,,,45,,,107,106,108,97,56,99,98,100', +',101,109,110,,93,94,42,43,41,,,,,,,,,,,,,,,,,,,,227,,,233,,,58,59,,', +'60,,,,,,44,,,,,,,,,20,,,,,91,81,84,85,,86,88,87,89,,,,,82,90,,,,74,75', +'71,62,57,83,95,96,63,64,,,,67,,65,66,68,313,314,72,73,,,,,,309,310,316', +'103,102,104,105,,,234,,,,,,,45,,,107,106,108,97,56,99,98,100,,101,109', +'110,,93,94,42,43,41,,,,,,,,,,,,,,,,,,,,227,,,233,,,58,59,,,60,,,,,,44', +',,,,,,,,232,,,,,91,81,84,85,,86,88,87,89,,,,,82,90,,,,74,75,71,62,57', +'83,95,96,63,64,,,,67,,65,66,68,313,314,72,73,,,,,,309,310,316,103,102', +'104,105,,,234,,,,,,,311,,,107,106,108,97,56,99,98,100,,101,109,110,', +'93,94,,,317,,,,,,,,,,,,,,,,,,,,307,,,303,,,58,59,,,60,,,,,,,,,,,,,,', +',,,,,91,81,84,85,,86,88,87,89,,,,,82,90,,,,74,75,71,62,57,83,95,96,63', +'64,,,,67,,65,66,68,30,31,72,73,,,,,,29,28,27,103,102,104,105,,,234,', +',,,,,45,,,107,106,108,97,56,99,98,100,288,101,109,110,,93,94,42,43,41', +',,,,,,,,,,,,,,,,,,,227,,,233,,,58,59,,,60,,285,,283,,44,,,289,,,,,,232', +',,,,91,286,84,85,,86,88,87,89,,,,,82,90,,,,74,75,71,62,57,83,95,96,63', +'64,,,,67,,65,66,68,313,314,72,73,,,,,,309,310,316,103,102,104,105,,', +'234,,,,,,,311,,,107,106,108,97,56,99,98,100,,101,109,110,,93,94,,,317', +',,,,,,,,,,,,,,,,,,,307,,,303,,,58,59,,,60,,,678,,675,674,673,683,676', +',,,,,,,,686,,91,81,84,85,,86,88,87,89,,,,,82,90,,,,,,681,62,,83,95,96', +'74,75,71,9,57,694,693,,63,64,687,,,67,,65,66,68,30,31,72,73,,,,,,29', +'28,27,103,102,104,105,,,19,,,,,,8,45,,10,107,106,108,97,56,99,98,100', +',101,109,110,,93,94,42,43,41,,,,,,,,,,,,,,,,,,,,40,,,33,,,58,59,,,60', +',35,,,,44,,,,,,,,,20,,,,,91,81,84,85,,86,88,87,89,,,,,82,90,,,,74,75', +'71,62,57,83,95,96,63,64,,,,67,,65,66,68,30,31,72,73,,,,,,29,28,27,103', +'102,104,105,,,19,,,,,,,45,,,107,106,108,97,56,99,98,100,,101,109,110', +',93,94,42,43,41,,,,,,,,,,,,,,,,,,,,227,,,233,,,58,59,,,60,,,,,,44,,', +',,,,,,20,,,,,91,81,84,85,,86,88,87,89,,,,,82,90,,,,74,75,71,62,57,83', +'95,96,63,64,,,,67,,65,66,68,30,31,72,73,,,,,,29,28,27,103,102,104,105', +',,19,,,,,,,45,,,107,106,108,97,56,99,98,100,,101,109,110,,93,94,42,43', +'41,,,,,,,,,,,,,,,,,,,,227,,,233,,,58,59,,,60,,,,,,44,,,,,,,,,20,,,,', +'91,81,84,85,,86,88,87,89,,,,,82,90,,,,,,,62,,83,95,96,74,75,71,9,57', +',,,63,64,,,,67,,65,66,68,30,31,72,73,,,,,,29,28,27,103,102,104,105,', +',19,,,,,,8,45,296,10,107,106,108,97,56,99,98,100,,101,109,110,,93,94', +'42,43,41,,,,,,,,,,,,,,,,,,,,40,,,33,,,58,59,,,60,,35,,,,44,,,,,,,,,20', +',,,,91,81,84,85,,86,88,87,89,,,,,82,90,,,,,,391,62,,83,95,96,74,75,71', +',57,,,,63,64,,,,67,,65,66,68,313,314,72,73,,,,,,309,310,316,103,102', +'104,105,,,234,,,,,,,45,,,107,106,108,97,56,99,98,100,,101,109,110,,93', +'94,42,43,41,,,,,,,,,,,,,,,,,,,,227,,,233,,,58,59,,,60,,,,,,44,,,,,,', +',,232,,,,,91,81,84,85,,86,88,87,89,,,,,82,90,,,,74,75,71,62,57,83,95', +'96,63,64,,,,67,,65,66,68,313,314,72,73,,,,,,309,310,316,103,102,104', +'105,,,234,,,,,,,45,,,107,106,108,97,56,99,98,100,288,101,109,110,,93', +'94,42,43,41,,,,,,,,,,,,,,,,,,,,227,,,233,,,58,59,,,60,,,,283,,44,,,289', +',,,,,232,,,,,91,286,84,85,,86,88,87,89,,,,,82,90,,,,74,75,71,62,57,83', +'95,96,63,64,,,,67,,65,66,68,313,314,72,73,,,,,,309,310,316,103,102,104', +'105,,,234,,,,,,,45,,,107,106,108,97,56,99,98,100,288,101,109,110,,93', +'94,42,43,41,,,,,,,,,,,,,,,,,,,,227,,,233,,,58,59,,,60,,635,,283,,44', +',,289,,,,,,232,,,,,91,286,84,85,,86,88,87,89,,,,,82,90,,,,74,75,71,62', +'57,83,95,96,63,64,,,,67,,65,66,68,30,31,72,73,,,,,,29,28,27,103,102', +'104,105,,,19,,,,,,,45,,,107,106,108,97,56,99,98,100,,101,109,110,,93', +'94,42,43,41,,,,,,,,,,,,,,,,,,,,227,,,233,,,58,59,,,60,,,,,,44,,,,,,', +',,20,,,,,91,81,84,85,,86,88,87,89,,,,,82,90,,,,74,75,71,62,57,83,95', +'96,63,64,,,,67,,65,66,68,30,31,72,73,,,,,,29,28,27,103,102,104,105,', +',19,,,,,,,45,,,107,106,108,97,56,99,98,100,,101,109,110,,93,94,42,43', +'41,,,,,,,,,,,,,,,,,,,,227,,,233,,,58,59,,,60,,,,,,44,,,,,,,,,20,,,,', +'91,81,84,85,,86,88,87,89,,,,,82,90,,,,74,75,71,62,57,83,95,96,63,64', +',,,67,,65,66,68,30,31,72,73,,,,,,29,28,27,103,102,104,105,,,19,,,,,', +',45,,,107,106,108,97,56,99,98,100,,101,109,110,,93,94,42,43,41,,,,,', +',,,,,,,,,,,,,,227,,,233,,,58,59,,,60,,,,,,44,,,,,,,,,20,,,,,91,81,84', +'85,,86,88,87,89,,,,,82,90,,,,74,75,71,62,57,83,95,96,63,64,,,,67,,65', +'66,68,313,314,72,73,,,,,,309,310,316,103,102,104,105,,,234,,,,,,,45', +',,107,106,108,97,56,99,98,100,288,101,109,110,,93,94,42,43,41,,,,,,', +',,,,,,,,,,,,,227,,,233,,,58,59,,,60,,,,,,44,,,289,,,,,,232,,,,,91,286', +'84,85,,86,88,87,89,,,,,82,90,,,,74,75,71,62,57,83,95,96,63,64,,,,67', +',65,66,68,30,31,72,73,,,,,,29,28,27,103,102,104,105,,,19,,,,,,,45,,', +'107,106,108,97,56,99,98,100,,101,109,110,,93,94,42,43,41,,,,,,,,,,,', +',,,,,,,,227,,,233,,,58,59,,,60,,,,,,44,,,,,,,,,20,,,,,91,81,84,85,,86', +'88,87,89,,,,,82,90,,,,74,75,71,62,57,83,95,96,63,64,,,,67,,65,66,68', +'313,314,72,73,,,,,,309,310,316,103,102,104,105,,,234,,,,,,,45,,,107', +'106,108,97,56,99,98,100,,101,109,110,,93,94,42,43,41,,,,,,,,,,,,,,,', +',,,,227,,,233,,,58,59,,,60,,,,,,44,,,,,,,,,232,,,,,91,81,84,85,,86,88', +'87,89,,,,,82,90,,,,74,75,71,62,57,83,95,96,63,64,,,,67,,65,66,68,30', +'31,72,73,,,,,,29,28,27,103,102,104,105,,,19,,,,,,,45,,,107,106,108,97', +'56,99,98,100,,101,109,110,,93,94,42,43,41,,,,,,,,,,,,,,,,,,,,227,,,233', +',,58,59,,,60,,,,,,44,,,,,,,,,20,,,,,91,81,84,85,,86,88,87,89,,,,,82', +'90,,,,74,75,71,62,57,83,95,96,63,64,,,,67,,65,66,68,30,31,72,73,,,,', +',29,28,27,103,102,104,105,,,19,,,,,,,45,,,107,106,108,97,56,99,98,100', +',101,109,110,,93,94,42,43,41,,,,,,,,,,,,,,,,,,,,227,,,233,,,58,59,,', +'60,,,,,,44,,,,,,,,,20,,,,,91,81,84,85,,86,88,87,89,,,,,82,90,115,,,', +',114,62,,83,95,96,74,75,71,9,57,,,,63,64,,,,67,,65,66,68,30,31,72,73', +',,,,,29,28,27,103,102,104,105,,,19,,,,,,8,45,7,10,107,106,108,97,56', +'99,98,100,,101,109,110,,93,94,42,43,41,,,,,,,,,,,,,,,,,,,,40,,,33,,', +'58,59,,,60,,35,,,,44,,,,,,,,,20,,,,,91,81,84,85,,86,88,87,89,,,,,82', +'90,,,,,,391,62,,83,95,96,74,75,71,,57,,,,63,64,,,,67,,65,66,68,313,314', +'72,73,,,,,,309,310,316,103,102,104,105,,,234,,,,,,,311,,,107,106,108', +'97,56,99,98,100,,101,109,110,,93,94,,,317,,,,,,,,,,,,,,,,,,,,351,,,33', +',,58,59,,,60,,35,,,,,,,,,,,,,,,,,,91,81,84,85,,86,88,87,89,,,,,82,90', +',,,74,75,71,62,57,83,95,96,63,64,,,,67,,65,66,68,313,314,72,73,,,,,', +'309,310,316,103,102,104,105,,,234,,,,,,,311,,,107,106,108,356,56,99', +'98,357,,101,109,110,,93,94,,,317,,,,,,,,,,,,,,,,,363,,,358,,,233,,,58', +'59,,,60,,,,,,,,,,,,,,,,,,,,91,81,84,85,,86,88,87,89,,,,,82,90,,,,74', +'75,71,62,57,83,95,96,63,64,,,,67,,65,66,68,313,314,72,73,,,,,,309,310', +'316,103,102,104,105,,,234,,,,,,,311,,,107,106,108,356,56,99,98,357,', +'101,109,110,,93,94,,,317,,,,,,,,,,,,,,,,,,,,358,,,233,,,58,59,,,60,', +',,,,,,,,,,,,,,,,,,91,81,84,85,,86,88,87,89,,,,,82,90,,,,74,75,71,62', +'57,83,95,96,63,64,,,,67,,65,66,68,313,314,72,73,,,,,,309,310,316,103', +'102,104,105,,,234,,,,,,,45,,,107,106,108,97,56,99,98,100,,101,109,110', +',93,94,42,43,41,,,,,,,,,,,,,,,,,,,,227,,,233,,,58,59,,,60,,,,,,44,,', +',,,,,,232,,,,,91,81,84,85,,86,88,87,89,,,,,82,90,,,,74,75,71,62,57,83', +'95,96,63,64,,,,67,,65,66,68,313,314,72,73,,,,,,309,310,316,103,102,104', +'105,,,234,,,,,,,45,,,107,106,108,97,56,99,98,100,,101,109,110,,93,94', +'42,43,41,,,,,,,,,,,,,,,,,,,,227,,,233,,,58,59,,,60,,,,,,44,,,,,,,,,232', +',,,,91,81,84,85,,86,88,87,89,,,,,82,90,,,,74,75,71,62,57,83,95,96,63', +'64,,,,67,,65,66,68,313,314,72,73,,,,,,309,310,316,103,102,104,105,,', +'234,,,,,,,45,,,107,106,108,97,56,99,98,100,,101,109,110,,93,94,42,43', +'41,,,,,,,,,,,,,,,,,,,,227,,,233,,,58,59,,,60,,,,,,44,,,,,,,,,232,,,', +',91,81,84,85,,86,88,87,89,,,,,82,90,,,,74,75,71,62,57,83,95,96,63,64', +',,,67,,65,66,68,30,31,72,73,,,,,,29,28,27,103,102,104,105,,,234,,,,', +',,45,,,107,106,108,97,56,99,98,100,,101,109,110,,93,94,42,43,41,,,,', +',,,,,,,,,,,,,,,227,,,233,,,58,59,,,60,,,,,,44,,,,,,,,,232,,,,,91,81', +'84,85,,86,88,87,89,,,,,82,90,,,,74,75,71,62,57,83,95,96,63,64,,,,67', +',65,66,68,313,314,72,73,,,,,,309,310,316,103,102,104,105,,,234,,,,,', +',45,,,107,106,108,97,56,99,98,100,,101,109,110,,93,94,42,43,41,,,,,', +',,,,,,,,,,,,,,227,,,233,528,,58,59,,,60,,,,,,44,,,,,,,,,232,,,,,91,81', +'84,85,,86,88,87,89,,,,,82,90,,,,74,75,71,62,57,83,95,96,63,64,,,,67', +',65,66,68,30,31,72,73,,,,,,29,28,27,103,102,104,105,,,234,,,,,,,45,', +',107,106,108,97,56,99,98,100,,101,109,110,,93,94,42,43,41,,,,,,,,,,', +',,,,,,,,,227,,,233,,,58,59,,,60,,,,,,44,,,,,,,,,232,,,,,91,81,84,85', +',86,88,87,89,,,,,82,90,,,,74,75,71,62,57,83,95,96,63,64,,,,67,,65,66', +'68,313,314,72,73,,,,,,309,310,316,103,102,104,105,,,234,,,,,,,45,,,107', +'106,108,97,56,99,98,100,288,101,109,110,,93,94,42,43,41,,,,,,,,,,,,', +',,,,,,,227,,,233,,,58,59,,,60,,,,283,,44,,,289,,,,,,232,,,,,91,286,84', +'85,,86,88,87,89,,,,,82,90,,,,74,75,71,62,57,83,95,96,63,64,,,,67,,65', +'66,68,313,314,72,73,,,,,,309,310,316,103,102,104,105,,,234,,,,,,,45', +',,107,106,108,97,56,99,98,100,288,101,109,110,,93,94,42,43,41,,,,,,', +',,,,,,,,,,,,,227,,,233,,,58,59,,,60,,635,,283,,44,,,289,,,,,,232,,,', +',91,286,84,85,,86,88,87,89,,,,,82,90,,,,74,75,71,62,57,83,95,96,63,64', +',,,67,,65,66,68,313,314,72,73,,,,,,309,310,316,103,102,104,105,,,234', +',,,,,,45,,,107,106,108,97,56,99,98,100,,101,109,110,,93,94,42,43,41', +',,,,,,,,,,,,,,,,,,,227,,,233,,,58,59,,,60,,,,,,44,,,,,,,,,232,,,,,91', +'81,84,85,,86,88,87,89,,,,,82,90,,,,74,75,71,62,57,83,95,96,63,64,,,', +'67,,65,66,68,30,31,72,73,,,,,,29,28,27,103,102,104,105,,,19,,,,,,,45', +',,107,106,108,97,56,99,98,100,,101,109,110,,93,94,42,43,41,,,,,,,,,', +',,,,,,,,,,227,,,233,,,58,59,,,60,,,,,,44,,,,,,,,,20,,,,,91,81,84,85', +',86,88,87,89,,,,,82,90,,,,,,,62,,83,95,96,74,75,71,9,57,,,,63,64,,,', +'67,,65,66,68,30,31,72,73,,,,,,29,28,27,103,102,104,105,,,19,,,,,,8,45', +',10,107,106,108,97,56,99,98,100,,101,109,110,,93,94,42,43,41,,,,,,,', +',,,,,,,,,,,,40,,,33,,,58,59,,,60,,35,,,,44,,,,,,,,,20,,,,,91,81,84,85', +',86,88,87,89,,,,,82,90,,,,74,75,71,62,57,83,95,96,63,64,,,,67,,65,66', +'68,30,31,72,73,,,,,,29,28,27,103,102,104,105,,,234,,,,,,,45,,,107,106', +'108,97,56,99,98,100,288,101,109,110,,93,94,42,43,41,,,,,,,,,,,,,,,,', +',,,227,,,233,,,58,59,,,60,,285,,283,,44,,,289,,,,,,232,,,,,91,286,84', +'85,,86,88,87,89,,,,,82,90,,,,74,75,71,62,57,83,95,96,63,64,,,,67,,65', +'66,68,30,31,72,73,,,,,,29,28,27,103,102,104,105,,,234,,,,,,,45,,,107', +'106,108,97,56,99,98,100,,101,109,110,,93,94,42,43,41,,,,,,,,,,,,,,,', +',,,,227,,,233,,,58,59,,,60,,,,,,44,,,,,,,,,232,,,,,91,81,84,85,,86,88', +'87,89,,,,,82,90,,,,74,75,71,62,57,83,95,96,63,64,,,,67,,65,66,68,313', +'314,72,73,,,,,,309,310,316,103,102,104,105,,,234,,,,,,,45,,,107,106', +'108,97,56,99,98,100,,101,109,110,,93,94,42,43,41,,,,,,,,,,,,,,,,,,,', +'227,,,233,,,58,59,,,60,,739,,,,44,,,,,,,,,232,,,,,91,81,84,85,,86,88', +'87,89,,,,,82,90,,,,74,75,71,62,57,83,95,96,63,64,,,,67,,65,66,68,313', +'314,72,73,,,,,,309,310,316,103,102,104,105,,,234,,,,,,,45,,,107,106', +'108,97,56,99,98,100,,101,109,110,,93,94,42,43,41,,,,,,,,,,,,,,,,,,,', +'227,,,233,,,58,59,,,60,,,,,,44,,,,,,,,,232,,,,,91,81,84,85,,86,88,87', +'89,,,,,82,90,,,,,,,62,,83,95,96,175,186,176,199,172,192,182,181,202', +'203,197,180,179,174,200,204,205,184,173,187,191,193,185,178,,,,194,201', +'196,195,188,198,183,171,190,189,,,,,,170,177,168,169,165,166,167,126', +'128,,,127,,,,,,,,159,160,,156,138,139,140,147,144,146,,,141,142,,,,161', +'162,148,149,,,,,,,,,,,,,,153,152,,137,158,155,154,163,150,151,145,143', +'135,157,136,,,164,91,,,,,,,,,,,,,,90,175,186,176,199,172,192,182,181', +'202,203,197,180,179,174,200,204,205,184,173,187,191,193,185,178,,,,194', +'201,196,195,188,198,183,171,190,189,,,,,,170,177,168,169,165,166,167', +'126,128,125,,127,,,,,,,,159,160,,156,138,139,140,147,144,146,,,141,142', +',,,161,162,148,149,,,,,,,,,,,,,,153,152,,137,158,155,154,163,150,151', +'145,143,135,157,136,,,164,91,,,,,,,,,,,,,,90,175,186,176,199,172,192', +'182,181,202,203,197,180,179,174,200,204,205,184,173,187,191,193,185', +'178,,,,194,201,196,195,188,198,183,171,190,189,,,,,,170,177,168,169', +'165,166,167,126,128,,,127,,,,,,,,159,160,,156,138,139,140,147,144,146', +',,141,142,,,,161,162,148,149,,,,,,,,,,,,,,153,152,,137,158,155,154,163', +'150,151,145,143,135,157,136,,,164,91,,,,,,,,,,,,,,90,175,186,176,199', +'172,192,182,181,202,203,197,180,179,174,200,204,205,184,173,187,191', +'193,185,178,,,,194,201,196,195,188,198,183,171,190,189,,,,,,170,177', +'168,169,165,166,167,126,128,,,127,,,,,,,,159,160,,156,138,139,140,147', +'144,146,,,141,142,,,,161,162,148,149,,,,,,,,,,,,,,153,152,,137,158,155', +'154,163,150,151,145,143,135,157,136,,,164,91,,,,,,,,,,,,,,90,175,186', +'176,199,172,192,182,181,202,203,197,180,179,174,200,204,205,184,173', +'187,191,193,185,178,,,,194,201,196,374,373,375,372,171,190,189,,,,,', +'170,177,168,169,369,370,371,367,128,99,98,368,,101,,,,,,159,160,,156', +'138,139,140,147,144,146,,,141,142,,,,161,162,148,149,,,,,,379,,,,,,', +',153,152,,137,158,155,154,163,150,151,145,143,135,157,136,,,164,175', +'186,176,199,172,192,182,181,202,203,197,180,179,174,200,204,205,184', +'173,187,191,193,185,178,,,,194,201,196,195,188,198,183,171,190,189,', +',,,,170,177,168,169,165,166,167,126,128,,,127,,,,,,,,159,160,,156,138', +'139,140,147,144,146,,,141,142,,,,161,162,148,149,,,,,,,,,,,,,,153,152', +',137,158,155,154,163,150,151,145,143,135,157,136,646,433,164,,647,,', +',,,,,159,160,,156,138,139,140,147,144,146,,,141,142,,,,161,162,148,149', +',,,,,267,,,,,,,,153,152,,137,158,155,154,163,150,151,145,143,135,157', +'136,483,433,164,,484,,,,,,,,159,160,,156,138,139,140,147,144,146,,,141', +'142,,,,161,162,148,149,,,,,,267,,,,,,,,153,152,,137,158,155,154,163', +'150,151,145,143,135,157,136,1005,440,164,,1004,,,,,,,,159,160,,156,138', +'139,140,147,144,146,,,141,142,,,,161,162,148,149,,,,,,267,,,,,,,,153', +'152,,137,158,155,154,163,150,151,145,143,135,157,136,741,433,164,,742', +',,,,,,,159,160,,156,138,139,140,147,144,146,,,141,142,,,,161,162,148', +'149,,,,,,267,,,,,,,,153,152,,137,158,155,154,163,150,151,145,143,135', +'157,136,744,440,164,,743,,,,,,,,159,160,,156,138,139,140,147,144,146', +',,141,142,,,,161,162,148,149,,,,,,267,,,,,,,,153,152,,137,158,155,154', +'163,150,151,145,143,135,157,136,618,440,164,,619,,,,,,,,159,160,,156', +'138,139,140,147,144,146,,,141,142,,,,161,162,148,149,,,,,,267,,,,,,', +',153,152,,137,158,155,154,163,150,151,145,143,135,157,136,616,433,164', +',617,,,,,,,,159,160,,156,138,139,140,147,144,146,,,141,142,,,,161,162', +'148,149,,,,,,267,,,,,,,,153,152,,137,158,155,154,163,150,151,145,143', +'135,157,136,483,433,164,,484,,,,,,,,159,160,,156,138,139,140,147,144', +'146,,,141,142,,,,161,162,148,149,,,,,,,,,,,,,,153,152,,137,158,155,154', +'163,150,151,145,143,135,157,136,429,433,164,,430,,,,,,,,159,160,,156', +'138,139,140,147,144,146,,,141,142,,,,161,162,148,149,,,,,,267,,,,,,', +',153,152,,137,158,155,154,163,150,151,145,143,135,157,136,436,440,164', +',435,,,,,,,,159,160,,156,138,139,140,147,144,146,,,141,142,,,,161,162', +'148,149,,,,,,267,,,,,,,,153,152,,137,158,155,154,163,150,151,145,143', +'135,157,136,1008,433,164,,1009,,,,,,,,159,160,,156,138,139,140,147,144', +'146,,,141,142,,,,161,162,148,149,,,,,,267,,,,,,,,153,152,,137,158,155', +'154,163,150,151,145,143,135,157,136,712,440,164,,713,,,,,,,,159,160', +',156,138,139,140,147,144,146,,,141,142,,,,161,162,148,149,,,,,,267,', +',,,,,,153,152,,137,158,155,154,163,150,151,145,143,135,157,136,709,440', +'164,,710,,,,,,,,159,160,,156,138,139,140,147,144,146,,,141,142,,,,161', +'162,148,149,,,,,,267,,,,,,,,153,152,,137,158,155,154,163,150,151,145', +'143,135,157,136,616,433,164,,617,,,,,,,,159,160,,156,138,139,140,147', +'144,146,,,141,142,,,,161,162,148,149,,,,,,267,,,,,,,,153,152,,137,158', +'155,154,163,150,151,145,143,135,157,136,618,440,164,,619,,,,,,,,159', +'160,,156,138,139,140,147,144,146,,,141,142,,,,161,162,148,149,,,,,,267', +',,,,,,,153,152,,137,158,155,154,163,150,151,145,143,135,157,136,707', +'433,164,,708,,,,,,,,159,160,,156,138,139,140,147,144,146,,,141,142,', +',,161,162,148,149,,,,,,267,,,,,,,,153,152,,137,158,155,154,163,150,151', +'145,143,135,157,136,1010,440,164,,1011,,,,,,,,159,160,,156,138,139,140', +'147,144,146,,,141,142,,,,161,162,148,149,,,,,,267,,,,,,,,153,152,,137', +'158,155,154,163,150,151,145,143,135,157,136,649,440,164,,650,,,,,,,', +'159,160,,156,138,139,140,147,144,146,,,141,142,,,,161,162,148,149,,', +',,,267,,,,,,,,153,152,,137,158,155,154,163,150,151,145,143,135,157,136', +',678,164,675,674,673,683,676,,678,,675,674,673,683,676,686,,,,,,,,686', +',678,,675,674,673,683,676,,,,,,681,664,,686,,,,,681,691,690,694,693', +',,,687,691,690,694,693,,,,687,681,,678,,675,674,673,683,676,,,694,693', +',,,687,686,,678,,675,674,673,683,676,,678,,675,674,673,683,676,686,', +',,,681,,,686,,,,,,691,690,694,693,,,,687,681,,,,,,,,681,691,690,694', +'693,,,,687,691,690,694,693,,,678,687,675,674,673,683,676,,678,,675,674', +'673,683,676,686,,,,,,,,686,,678,,675,674,673,683,676,,,,,,681,,,686', +',,,,681,691,690,694,693,,,,687,691,690,694,693,,,,687,681,,678,,675', +'674,673,683,676,,,694,693,,,,687,686,,678,,675,674,673,683,676,678,', +'675,674,673,683,676,,686,,,,,681,,686,,,,,,,691,690,694,693,,,,687,681', +',,,,,,681,,,,694,693,,,,687,,694,693,,,678,687,675,674,673,683,676,678', +',675,674,673,683,676,678,686,675,674,673,683,676,,686,,,,,,,686,,,,', +',,,681,,,,,,,681,,691,690,694,693,,681,,687,,694,693,,,,687,,694,693', +',,,687' ] + racc_action_table = arr = ::Array.new(25333, nil) + idx = 0 + clist.each do |str| + str.split(',', -1).each do |i| + arr[idx] = i.to_i unless i.empty? + idx += 1 + end + end + +clist = [ +'97,1038,625,569,569,445,445,97,97,97,1,891,97,97,97,387,97,629,1008', +'386,19,767,656,656,97,125,97,97,97,3,125,125,989,989,3,352,97,97,1009', +'97,97,97,97,97,342,1010,1011,341,925,349,709,707,629,641,1029,834,767', +'829,61,7,834,19,829,641,793,555,97,97,97,97,97,97,97,97,97,97,97,97', +'97,97,10,387,97,97,97,386,97,97,708,625,97,348,710,97,97,825,97,569', +'97,445,97,12,97,97,928,97,97,97,97,97,705,97,619,97,865,709,656,978', +'924,619,619,619,1010,1011,619,619,619,97,619,891,97,97,97,97,891,97', +'1008,97,619,619,619,1008,97,97,352,61,13,548,619,619,451,619,619,619', +'619,619,1009,710,349,709,707,1009,342,1010,1011,341,925,342,1010,1011', +'341,925,1029,793,555,547,826,1029,619,619,619,619,619,619,619,619,619', +'619,619,619,619,619,14,14,619,619,619,708,619,619,348,710,619,388,825', +'619,619,451,619,26,619,345,619,15,619,619,345,619,619,619,619,619,928', +'619,312,619,414,928,705,292,22,705,865,705,292,978,924,865,582,619,978', +'924,619,619,619,619,37,619,225,619,618,548,226,40,619,619,548,618,618', +'618,41,41,618,618,618,649,618,388,388,388,565,565,896,26,896,618,618', +'618,618,547,826,798,798,414,547,826,618,618,312,618,618,618,618,618', +'317,317,26,616,45,647,782,646,582,582,810,225,810,810,810,226,810,312', +'582,321,340,340,618,618,618,618,618,618,618,618,618,618,618,618,618', +'618,649,649,618,618,618,111,618,618,41,41,618,617,430,618,618,358,618', +'206,618,358,618,227,618,618,616,618,618,618,618,618,321,618,618,618', +'565,647,782,646,580,565,321,649,317,317,649,696,696,618,228,383,618', +'618,618,618,649,618,810,618,100,430,838,764,618,618,429,100,100,100', +'617,430,100,100,100,229,100,647,782,646,647,782,646,742,100,230,100', +'100,100,234,647,782,646,266,280,741,100,100,281,100,100,100,100,100', +'580,580,945,228,945,945,945,24,945,429,580,383,383,383,24,838,764,333', +'284,429,333,601,100,100,100,100,100,100,100,100,100,100,100,100,100', +'100,742,296,100,100,100,662,100,100,662,297,100,500,741,100,100,381', +'100,17,100,382,100,39,100,100,384,100,100,100,100,100,435,100,601,100', +'299,300,24,435,435,435,301,307,601,435,435,310,435,100,945,311,100,100', +'100,100,377,100,332,100,356,332,316,377,100,100,17,318,435,435,39,435', +'435,435,435,435,17,500,500,500,39,381,381,381,322,382,382,382,385,38', +'384,384,384,336,500,325,336,330,435,435,435,435,435,435,435,435,435', +'435,435,435,435,435,356,334,435,435,435,967,435,356,967,377,435,335', +'356,435,337,346,356,347,435,351,435,353,435,435,38,435,435,435,435,435', +'743,435,362,435,38,356,397,743,743,743,385,385,385,743,743,403,743,435', +'458,406,435,435,79,435,375,435,408,411,357,415,425,375,435,435,79,356', +'743,743,427,743,743,743,743,743,79,323,428,437,447,16,458,374,323,373', +'458,458,16,372,374,459,373,323,460,461,372,16,743,743,743,743,743,743', +'743,743,743,743,743,743,743,743,357,920,743,743,743,462,743,357,920', +'375,743,487,357,743,371,491,357,920,743,507,743,371,743,743,508,743', +'743,743,743,743,323,743,744,743,16,357,374,511,373,744,744,744,372,513', +'518,744,744,743,744,521,743,743,529,743,926,743,530,744,531,457,532', +'926,743,743,544,357,920,549,744,744,926,744,744,744,744,744,550,224', +'567,371,577,517,370,369,224,368,585,367,517,370,369,457,368,224,367', +'457,457,517,744,744,744,744,744,744,744,744,744,744,744,744,744,744', +'587,593,744,744,744,46,744,926,602,607,744,612,46,744,620,712,621,622', +'744,624,744,46,744,744,628,744,744,744,744,744,224,744,744,744,517,370', +'369,630,368,632,367,413,713,634,640,643,645,744,413,713,744,744,436', +'744,713,744,648,413,713,436,436,436,744,744,651,436,436,712,436,918', +'46,918,918,918,712,918,652,436,1019,712,1019,1019,1019,712,1019,655', +'657,666,436,436,667,436,436,436,436,436,669,650,670,671,680,688,712', +'692,650,695,413,713,1003,650,1003,1003,1003,650,1003,1019,698,703,436', +'436,436,436,436,436,436,436,436,436,436,436,436,436,712,706,436,436', +'436,304,436,715,305,719,436,738,304,436,740,305,749,770,436,781,436', +'304,436,436,305,436,436,436,436,436,650,436,436,436,773,785,773,773', +'773,773,773,306,6,6,6,6,6,436,306,773,436,436,27,436,788,436,789,306', +'794,27,27,27,436,436,27,27,27,809,27,811,304,773,816,305,819,476,828', +'27,27,27,773,773,773,773,832,833,836,773,27,27,837,27,27,27,27,27,946', +'846,946,946,946,308,946,847,849,850,306,476,308,851,853,476,476,773', +'476,476,854,308,27,27,27,27,27,27,27,27,27,27,27,27,27,27,855,946,27', +'27,27,971,856,27,558,27,27,871,971,27,27,558,27,872,27,876,27,971,27', +'27,558,27,27,27,27,27,877,27,27,27,308,477,907,879,360,795,880,350,882', +'885,887,360,907,27,350,795,27,27,482,27,360,27,893,350,894,482,482,482', +'27,900,482,482,482,477,482,904,971,477,477,558,477,477,917,482,482,907', +'907,921,795,795,907,927,947,795,482,482,957,482,482,482,482,482,888', +'960,888,888,888,961,888,360,573,573,350,962,573,573,573,963,965,934', +'974,934,934,934,934,934,329,329,329,329,329,979,980,981,934,482,982', +'431,983,888,984,985,482,987,431,431,431,482,482,431,431,431,990,431', +'991,681,934,681,681,681,1004,681,431,431,431,934,934,934,934,1005,482', +'482,934,431,431,1007,431,431,431,431,431,1020,1024,1025,1026,482,1027', +'1030,482,1031,,,681,482,295,295,295,295,295,,482,681,,431,431,431,431', +'431,431,431,431,431,431,431,431,431,431,,,431,431,431,,,431,,431,431', +',,431,431,,431,,431,,431,,431,431,,431,431,431,431,431,56,431,431,431', +',,,56,56,56,,,56,56,56,,56,431,,,431,431,,431,,431,56,56,56,,,,431,', +',,56,56,,56,56,56,56,56,988,,988,988,988,886,988,886,886,886,986,886', +'986,986,986,,986,505,505,505,505,505,56,56,56,56,56,56,56,56,56,56,56', +'56,56,56,,988,56,56,56,,886,56,,,56,986,,56,56,886,56,,56,,56,,56,56', +',56,56,56,56,56,,56,,56,807,,807,807,807,,807,,,,,,,56,,,56,56,56,56', +',56,440,56,,,,,56,440,440,440,,,440,440,440,807,440,470,,,,,,,807,440', +'440,440,440,,,,,470,470,,440,440,,440,440,440,440,440,,,,,,470,,470', +',470,470,,470,470,,,470,,470,,,,440,440,440,440,440,440,440,440,440', +'440,440,440,440,440,,,440,440,440,,,440,,,440,,,440,440,,440,,440,,440', +',440,440,,440,440,440,440,440,,440,440,440,,,,,,,,,,,,,,440,,,440,440', +'440,440,,440,441,440,,,,,440,441,441,441,,,441,441,441,467,441,,,,,', +',,,441,441,441,441,,,467,467,,,,441,441,,441,441,441,441,441,,,,467', +',467,,467,467,,467,467,,,467,,467,,,,,,441,441,441,441,441,441,441,441', +'441,441,441,441,441,441,,,441,441,441,,,441,,,441,,,441,441,,441,,441', +',441,,441,441,,441,441,441,441,441,,441,441,441,,,,,,,,,,,,,,441,,,441', +'441,441,441,,441,28,441,,,,,441,28,28,28,,,28,28,28,468,28,,,,,,,,,', +'28,28,,,,468,468,,,,28,28,,28,28,28,28,28,,,,468,,468,,468,468,,468', +'468,,,468,,468,,,,,,28,28,28,28,28,28,28,28,28,28,28,28,28,28,,,28,28', +'28,,,28,,28,28,,,28,28,,28,,28,,28,,28,28,,28,28,28,28,28,,28,,28,,', +',,,,,,,,,,,28,,,28,28,,28,,28,821,821,821,821,821,821,28,,,821,821,', +',,821,,821,821,821,821,821,821,821,,,,,,821,821,821,821,821,821,821', +',,821,,,,,418,821,821,821,821,821,821,821,821,821,821,821,821,,821,821', +'821,,821,821,821,821,821,418,418,418,418,418,418,418,418,418,418,418', +',418,418,,,418,418,,821,,,821,,,821,821,,,821,,821,418,,418,821,418', +'418,,418,418,418,418,418,821,418,,,,821,821,821,821,,821,821,821,821', +',,,,821,821,,418,,418,,,821,,821,821,821,824,824,824,824,824,824,,,', +'824,824,,,,824,,824,824,824,824,824,824,824,,,,,,824,824,824,824,824', +'824,824,,,824,,,,,424,824,824,824,824,824,824,824,824,824,824,824,824', +',824,824,824,,824,824,824,824,824,424,424,424,424,424,424,424,424,424', +'424,424,,424,424,,,424,424,,824,,,824,,,824,824,,,824,,824,424,,424', +'824,424,424,,424,424,424,424,424,824,424,,,,824,824,824,824,,824,824', +'824,824,,,,,824,824,,424,,,,,824,,824,824,824,931,931,931,931,931,931', +',,,931,931,,,,931,,931,931,931,931,931,931,931,,,,,,931,931,931,931', +'931,931,931,,,931,,,,,,931,931,931,931,931,931,931,931,931,931,931,931', +',931,931,931,,931,931,931,931,931,480,480,480,480,480,480,480,480,480', +'480,480,,480,480,,,480,480,,931,,,931,,,931,931,,,931,,931,480,,480', +'931,480,480,,480,480,480,480,480,931,480,,,,931,931,931,931,,931,931', +'931,931,,,,,931,931,480,480,,,,,931,,931,931,931,543,543,543,543,543', +'543,,,,543,543,,,,543,,543,543,543,543,543,543,543,,,,,,543,543,543', +'543,543,543,543,,,543,,,,,,543,543,543,543,543,543,543,543,543,543,543', +'543,,543,543,543,,543,543,543,543,543,746,746,746,746,746,746,746,746', +'746,746,746,,746,746,,,746,746,,543,,,543,,,543,543,,,543,,543,746,', +'746,543,746,746,,746,746,746,746,746,543,746,,,,543,543,543,543,,543', +'543,543,543,,,,,543,543,,746,,,,,543,,543,543,543,787,787,787,787,787', +'787,,,,787,787,,,,787,,787,787,787,787,787,787,787,,,,,,787,787,787', +'787,787,787,787,,,787,,,,,,787,787,787,787,787,787,787,787,787,787,787', +'787,,787,787,787,,787,787,787,787,787,21,21,21,21,21,21,21,21,21,21', +'21,,21,21,,,21,21,,787,,,787,,,787,787,,,787,,787,21,,21,787,21,21,', +'21,21,21,21,21,787,21,,,,787,787,787,787,,787,787,787,787,,,,,787,787', +',21,,,,,787,,787,787,787,546,546,546,546,546,546,,,,546,546,,,,546,', +'546,546,546,546,546,546,546,,,,,,546,546,546,546,546,546,546,,,546,', +',,,,546,546,546,546,546,546,546,546,546,546,546,546,,546,546,546,,546', +'546,546,546,546,278,278,278,278,278,278,278,278,278,278,278,,278,278', +',,278,278,,546,,,546,,,546,546,,,546,,546,278,,278,546,278,278,,278', +'278,278,278,278,546,278,,,,546,546,546,546,,546,546,546,546,,,,,546', +'546,,278,,,,,546,,546,546,546,830,830,830,830,830,830,,,,830,830,,,', +'830,,830,830,830,830,830,830,830,,,,,,830,830,830,830,830,830,830,,', +'830,,,,,,830,830,830,830,830,830,830,830,830,830,830,830,,830,830,830', +',830,830,830,830,830,843,843,843,843,843,843,843,843,843,843,843,,843', +'843,,,843,843,,830,,,830,,,830,830,,,830,,830,843,,843,830,843,843,', +'843,843,843,843,843,830,843,,,,830,830,830,830,,830,830,830,830,,,,', +'830,830,,843,,,,,830,,830,830,830,730,730,730,730,730,730,,,,730,730', +',,,730,,730,730,730,730,730,730,730,,,,,,730,730,730,730,730,730,730', +',,730,,,,,,730,730,730,730,730,730,730,730,730,730,730,730,,730,730', +'730,,730,730,730,730,730,527,527,527,527,527,527,527,527,527,527,527', +',527,527,,,527,527,,730,,,730,,,730,730,,,730,,730,527,,527,730,527', +'527,,527,527,527,527,527,730,527,,,,730,730,730,730,,730,730,730,730', +',,,,730,730,,527,,,,,730,,730,730,730,716,716,716,716,716,716,,,,716', +'716,,,,716,,716,716,716,716,716,716,716,,,,,,716,716,716,716,716,716', +'716,,,716,,,,,,716,716,716,716,716,716,716,716,716,716,716,716,,716', +'716,716,,716,716,716,716,716,475,475,475,475,475,475,475,,,475,475,', +',,,,475,475,,716,,,716,,,716,716,,,716,,716,475,,475,716,475,475,,475', +'475,475,475,475,716,475,,,,716,716,716,716,,716,716,716,716,,,,,716', +'716,,,,,,,716,,716,716,716,233,233,233,233,233,233,,,,233,233,,,,233', +',233,233,233,233,233,233,233,,,,,,233,233,233,233,233,233,233,,,233', +',,,,,233,233,233,233,233,233,233,233,233,233,233,233,,233,233,233,,233', +'233,233,233,233,473,473,473,473,473,473,473,,,473,473,,,,,,473,473,', +'233,,,233,,,233,233,,,233,,233,473,,473,233,473,473,,473,473,473,473', +'473,233,473,,,,233,233,233,233,,233,233,233,233,,,,,233,233,,,,,,,233', +',233,233,233,930,930,930,930,930,930,,,,930,930,,,,930,,930,930,930', +'930,930,930,930,,,,,,930,930,930,930,930,930,930,,,930,,,,,,930,930', +'930,930,930,930,930,930,930,930,930,930,,930,930,930,,930,930,930,930', +'930,455,455,455,455,455,455,455,455,455,455,455,,455,455,,,455,455,', +'930,,,930,,,930,930,,,930,,930,455,,455,930,455,455,,455,455,455,455', +'455,930,455,,,,930,930,930,930,,930,930,930,930,,,,,930,930,,,,,,,930', +',930,930,930,506,506,506,506,506,506,,,,506,506,,,,506,,506,506,506', +'506,506,506,506,,,,,,506,506,506,506,506,506,506,,,506,,,,,,506,506', +'506,506,506,506,506,506,506,506,506,506,,506,506,506,,506,506,506,506', +'506,471,471,471,471,471,471,471,,,471,471,,,,,,471,471,,506,,,506,,', +'506,506,,,506,,506,471,,471,506,471,471,,471,471,471,471,471,506,471', +',,,506,506,506,506,,506,506,506,506,,,,,506,506,,,,,,,506,,506,506,506', +'123,123,123,123,123,123,,,,123,123,,,,123,,123,123,123,123,123,123,123', +',,,,,123,123,123,123,123,123,123,,,123,,,,,,123,123,123,123,123,123', +'123,123,123,123,123,123,,123,123,123,,123,123,123,123,123,469,,,,,,', +',,,,,,,,,469,469,,123,,,123,,,123,123,,,123,,123,469,,469,123,469,469', +',469,469,,,469,123,469,,,,123,123,123,123,,123,123,123,123,,,,,123,123', +',,,,,,123,,123,123,123,720,720,720,720,720,720,,,,720,720,,,,720,,720', +'720,720,720,720,720,720,,,,,,720,720,720,720,720,720,720,,,720,,,,,', +'720,720,720,720,720,720,720,720,720,720,720,720,,720,720,720,,720,720', +'720,720,720,474,474,474,474,474,474,474,,,474,474,,,,,,474,474,,720', +',,720,,,720,720,,,720,,720,474,,474,720,474,474,,474,474,474,474,474', +'720,474,,,,720,720,720,720,,720,720,720,720,,,,,720,720,,,,,,,720,,720', +'720,720,923,923,923,923,923,923,,,,923,923,,,,923,,923,923,923,923,923', +'923,923,,,,,,923,923,923,923,923,923,923,,,923,,,,,,923,923,923,923', +'923,923,923,923,923,923,923,923,,923,923,923,,923,923,923,923,923,466', +'466,466,466,466,466,466,,,466,466,,,,,,466,466,,923,,,923,,,923,923', +',,923,,923,466,,466,923,466,466,,466,466,466,466,466,923,466,,,,923', +'923,923,923,,923,923,923,923,,,,,923,923,,,,,,,923,,923,923,923,566', +'566,566,566,566,566,,,,566,566,,,,566,,566,566,566,566,566,566,566,', +',,,,566,566,566,566,566,566,566,,,566,,,,,,566,566,566,566,566,566,566', +'566,566,566,566,566,,566,566,566,,566,566,566,566,566,472,472,472,472', +'472,472,472,,,472,472,,,,,,472,472,,566,,,566,,,566,566,,,566,,566,472', +',472,566,472,472,,472,472,472,472,472,566,472,,,,566,566,566,566,,566', +'566,566,566,,,,,566,566,,,,,,,566,,566,566,566,844,844,844,844,844,844', +',,,844,844,,,,844,,844,844,844,844,844,844,844,,,,,,844,844,844,844', +'844,844,844,,,844,,,,,,844,844,844,844,844,844,844,844,844,844,844,844', +',844,844,844,,844,844,844,844,844,456,456,456,456,456,456,456,456,456', +'456,456,,456,456,,,456,456,,844,,,844,,,844,844,,,844,,844,456,,456', +'844,456,456,,456,456,456,456,456,844,456,,,,844,844,844,844,,844,844', +'844,844,,,,,844,844,,,,,,,844,,844,844,844,298,298,298,298,298,298,', +',,298,298,,,,298,,298,298,298,298,298,298,298,,,,,,298,298,298,298,298', +'298,298,,,298,,,,,,298,298,298,298,298,298,298,298,298,298,298,298,', +'298,298,298,,298,298,298,298,298,478,478,478,478,478,478,478,,,478,478', +',,,,,478,478,,298,,,298,,,298,298,,,298,,298,478,,478,298,478,478,,478', +'478,478,478,478,298,478,,,,298,298,298,298,,298,298,298,298,,,,,298', +'298,,,,,,,298,,298,298,298,775,775,775,775,775,775,,,,775,775,,,,775', +',775,775,775,775,775,775,775,,,,,,775,775,775,775,775,775,775,,,775', +',,,,,775,775,775,775,775,775,775,775,775,775,775,775,,775,775,775,,775', +'775,775,775,775,479,479,479,479,479,479,479,479,,479,479,,,,,,479,479', +',775,,,775,,,775,775,,,775,,775,479,,479,775,479,479,,479,479,479,479', +'479,775,479,,,,775,775,775,775,,775,775,775,775,,,,,775,775,,,,,,,775', +',775,775,775,303,303,303,303,303,303,,,,303,303,,,,303,,303,303,303', +'303,303,303,303,,,,,,303,303,303,303,303,303,303,,,303,,,,,,303,303', +'303,303,303,303,303,303,303,303,303,303,,303,303,303,,303,303,303,303', +'303,464,,,,,,,,,,,,,,,,464,464,,303,,,303,,,303,303,,,303,,303,464,', +'464,303,464,464,,464,464,,,,303,,,,,303,303,303,303,,303,303,303,303', +',,,,303,303,,,,,,,303,,303,303,303,208,208,208,208,208,208,,,,208,208', +',,,208,,208,208,208,208,208,208,208,,,,,,208,208,208,208,208,208,208', +',,208,,,,,,208,208,208,208,208,208,208,208,208,208,208,208,,208,208', +'208,,208,208,208,208,208,463,,,,,,,,,,,,,,,,463,463,,208,,,208,,,208', +'208,,,208,,208,463,,463,208,463,463,,463,463,,,,208,,,,,208,208,208', +'208,,208,208,208,208,,,,,208,208,,,,,,,208,,208,208,208,862,862,862', +'862,862,862,,,,862,862,,,,862,,862,862,862,862,862,862,862,,,,,,862', +'862,862,862,862,862,862,,,862,,,,,,862,862,862,862,862,862,862,862,862', +'862,862,862,,862,862,862,,862,862,862,862,862,465,,,,,,,,,,,,,,,,465', +'465,,862,,,862,,,862,862,,,862,,862,465,,,862,465,465,,465,465,,,,862', +',,,,862,862,862,862,,862,862,862,862,,,,,862,862,,,,,,,862,,862,862', +'862,956,956,956,956,956,956,,,,956,956,,,,956,,956,956,956,956,956,956', +'956,,,,,,956,956,956,956,956,956,956,,,956,,,,,,956,956,956,956,956', +'956,956,956,956,956,956,956,,956,956,956,,956,956,956,956,956,,,,,,', +',,,,,,,,,,,,,956,,,956,,,956,956,,,956,,956,,,,956,,,,,,,,,956,,,,,956', +'956,956,956,,956,956,956,956,,,,,956,956,,,,,,,956,,956,956,956,0,0', +'0,0,0,0,,,,0,0,,,,0,,0,0,0,0,0,0,0,,,,,,0,0,0,0,0,0,0,,,0,,,,,,0,0,0', +'0,0,0,0,0,0,0,0,0,,0,0,0,,0,0,0,0,0,,,,,,,,,,,,,,,,,,,,0,,,0,,,0,0,', +',0,,0,,,,0,,,,,,,,,0,,,,,0,0,0,0,,0,0,0,0,,,,,0,0,,,,,,,0,,0,0,0,954', +'954,954,954,954,954,,,,954,954,,,,954,,954,954,954,954,954,954,954,', +',,,,954,954,954,954,954,954,954,,,954,,,,,,954,954,954,954,954,954,954', +'954,954,954,954,954,,954,954,954,,954,954,954,954,954,,,,,,,,,,,,,,', +',,,,,954,,,954,,,954,954,,,954,,954,,,,954,,,,,,,,,954,,,,,954,954,954', +'954,,954,954,954,954,,,,,954,954,,,,,,,954,,954,954,954,948,948,948', +'948,948,948,,,,948,948,,,,948,,948,948,948,948,948,948,948,,,,,,948', +'948,948,948,948,948,948,,,948,,,,,,948,948,948,948,948,948,948,948,948', +'948,948,948,,948,948,948,,948,948,948,948,948,,,,,,,,,,,,,,,,,,,,948', +',,948,,,948,948,,,948,,948,,,,948,,,,,,,,,948,,,,,948,948,948,948,,948', +'948,948,948,,,,,948,948,,,,,,,948,,948,948,948,33,33,33,33,33,33,,,', +'33,33,,,,33,,33,33,33,33,33,33,33,,,,,,33,33,33,33,33,33,33,,,33,,,', +',,33,33,33,33,33,33,33,33,33,33,33,33,,33,33,33,,33,33,33,33,33,,,,', +',,,,,,,,,,,,,,,33,,,33,,,33,33,,,33,,33,,,,33,,,,,,,,,33,,,,,33,33,33', +'33,,33,33,33,33,,,,,33,33,,,,,,,33,,33,33,33,820,820,820,820,820,820', +',,,820,820,,,,820,,820,820,820,820,820,820,820,,,,,,820,820,820,820', +'820,820,820,,,820,,,,,,820,820,820,820,820,820,820,820,820,820,820,820', +',820,820,820,,820,820,820,820,820,,,,,,,,,,,,,,,,,,,,820,,,820,,,820', +'820,,,820,,820,,,,820,,,,,,,,,820,,,,,820,820,820,820,,820,820,820,820', +',,,,820,820,,,,,,,820,,820,820,820,328,328,328,328,328,328,,,,328,328', +',,,328,,328,328,328,328,328,328,328,,,,,,328,328,328,328,328,328,328', +',,328,,,,,,328,328,328,328,328,328,328,328,328,328,328,328,,328,328', +'328,,328,328,328,328,328,,,,,,,,,,,,,,,,,,,,328,,,328,,,328,328,,,328', +',328,,,,328,,,,,,,,,328,,,,,328,328,328,328,,328,328,328,328,,,,,328', +'328,,,,842,842,842,328,842,328,328,328,842,842,,,,842,,842,842,842,842', +'842,842,842,,,,,,842,842,842,842,842,842,842,,,842,,,,,,,842,,,842,842', +'842,842,842,842,842,842,,842,842,842,,842,842,842,842,842,,,,,,,,,,', +',,,,,,,,,842,,,842,,,842,842,,,842,,,,,,842,,,,,,,,,842,,,,,842,842', +'842,842,,842,842,842,842,,,,,842,842,,,,29,29,29,842,29,842,842,842', +'29,29,,,,29,,29,29,29,29,29,29,29,,,,,,29,29,29,29,29,29,29,,,29,,,', +',,,29,,,29,29,29,29,29,29,29,29,29,29,29,29,,29,29,29,29,29,,,,,,,,', +',,,,,,,,,,,29,,,29,,,29,29,,,29,,29,,29,,29,,,29,,,,,,29,,,,,29,29,29', +'29,,29,29,29,29,,,,,29,29,,,,30,30,30,29,30,29,29,29,30,30,,,,30,,30', +'30,30,30,30,30,30,,,,,,30,30,30,30,30,30,30,,,30,,,,,,,30,,,30,30,30', +'30,30,30,30,30,30,30,30,30,,30,30,30,30,30,,,,,,,,,,,,,,,,,,,,30,,,30', +',,30,30,,,30,,30,,30,,30,,,30,,,,,,30,,,,,30,30,30,30,,30,30,30,30,', +',,,30,30,,,,31,31,31,30,31,30,30,30,31,31,,,,31,,31,31,31,31,31,31,31', +',,,,,31,31,31,31,31,31,31,,,31,,,,,,,31,,,31,31,31,31,31,31,31,31,31', +'31,31,31,,31,31,31,31,31,,,,,,,,,,,,,,,,,,,,31,,,31,,,31,31,,,31,,31', +',31,,31,,,31,,,,,,31,,,,,31,31,31,31,,31,31,31,31,,,,,31,31,,,,302,302', +'302,31,302,31,31,31,302,302,,,,302,,302,302,302,302,302,302,302,,,,', +',302,302,302,302,302,302,302,,,302,,,,,,,302,,,302,302,302,302,302,302', +'302,302,,302,302,302,,302,302,,,302,,,,,,,,,,,,,,,,,,,,302,,,302,,,302', +'302,,,302,,,1032,,1032,1032,1032,1032,1032,,,,,,,,,1032,,302,302,302', +'302,,302,302,302,302,,,,,302,302,,,,302,,1032,302,,302,302,302,240,240', +'240,,240,1032,1032,,240,240,1032,,,240,,240,240,240,240,240,240,240', +',,,,,240,240,240,240,240,240,240,,,240,,,,,,,240,,,240,240,240,240,240', +'240,240,240,,240,240,240,,240,240,240,240,240,,,,,,,,,,,,,,,,,,,,240', +',,240,,,240,240,,,240,,,,,,240,,,,,,,,,240,,,,,240,240,240,240,,240', +'240,240,240,,,,,240,240,,,,857,857,857,240,857,240,240,240,857,857,', +',,857,,857,857,857,857,857,857,857,,,,,,857,857,857,857,857,857,857', +',,857,,,,,,,857,,,857,857,857,857,857,857,857,857,,857,857,857,,857', +'857,,,857,,,,,,,,,,,,,,,,,,,,857,,,857,,,857,857,,,857,,,,,,,,,,,,,', +',,,,,,857,857,857,857,,857,857,857,857,,,,,857,857,,,,866,866,866,857', +'866,857,857,857,866,866,,,,866,,866,866,866,866,866,866,866,,,,,,866', +'866,866,866,866,866,866,,,866,,,,,,,866,,,866,866,866,866,866,866,866', +'866,,866,866,866,,866,866,,,866,,,,,,,,,,,,,,,,,,,,866,,,866,,,866,866', +',,866,,,,,,,,,,,,,,,,,,,,866,866,866,866,,866,866,866,866,,,,,866,866', +',,,239,239,239,866,239,866,866,866,239,239,,,,239,,239,239,239,239,239', +'239,239,,,,,,239,239,239,239,239,239,239,,,239,,,,,,,239,,,239,239,239', +'239,239,239,239,239,,239,239,239,,239,239,239,239,239,,,,,,,,,,,,,,', +',,,,,239,,,239,,,239,239,,,239,,,,,,239,,,,,,,,,239,,,,,239,239,239', +'239,,239,239,239,239,,,,,239,239,,,,34,34,34,239,34,239,239,239,34,34', +',,,34,,34,34,34,34,34,34,34,,,,,,34,34,34,34,34,34,34,,,34,,,,,,,34', +',,34,34,34,34,34,34,34,34,,34,34,34,,34,34,,,34,,,,,,,,,,,,,,,,,,,,34', +',,34,,,34,34,,,34,,34,,,,,,,,,,,,,,,,,,34,34,34,34,,34,34,34,34,,,,', +'34,34,,,,35,35,35,34,35,34,34,34,35,35,,,,35,,35,35,35,35,35,35,35,', +',,,,35,35,35,35,35,35,35,,,35,,,,,,,35,,,35,35,35,35,35,35,35,35,,35', +'35,35,,35,35,,,35,,,,,,,,,,,,,,,,,,,,35,,,35,,,35,35,,,35,,,936,,936', +'936,936,936,936,,,,,,,,,936,,35,35,35,35,,35,35,35,35,,,,,35,35,,,,35', +',936,35,,35,35,35,5,5,5,5,5,936,936,,5,5,936,,,5,,5,5,5,5,5,5,5,,,,', +',5,5,5,5,5,5,5,,,5,,,,,,5,5,5,5,5,5,5,5,5,5,5,5,,5,5,5,,5,5,5,5,5,,', +',,,,,,,,,,,,,,,,,5,,,5,,,5,5,,,5,,5,,,,5,,,,,,,,,5,,,,,5,5,5,5,,5,5', +'5,5,,,,,5,5,,,,238,238,238,5,238,5,5,5,238,238,,,,238,,238,238,238,238', +'238,238,238,,,,,,238,238,238,238,238,238,238,,,238,,,,,,,238,,,238,238', +'238,238,238,238,238,238,,238,238,238,,238,238,238,238,238,,,,,,,,,,', +',,,,,,,,,238,,,238,,,238,238,,,238,,,,,,238,,,,,,,,,238,,,,,238,238', +'238,238,,238,238,238,238,,,,,238,238,,,,642,642,642,238,642,238,238', +'238,642,642,,,,642,,642,642,642,642,642,642,642,,,,,,642,642,642,642', +'642,642,642,,,642,,,,,,,642,,,642,642,642,642,642,642,642,642,,642,642', +'642,,642,642,,,642,,,,,,,,,,,,,,,,,,,,642,,,642,,,642,642,,,642,,,,', +',,,,,,,,,,,,,,,642,642,642,642,,642,642,642,642,,,,,642,642,,,,237,237', +'237,642,237,642,642,642,237,237,,,,237,,237,237,237,237,237,237,237', +',,,,,237,237,237,237,237,237,237,,,237,,,,,,,237,,,237,237,237,237,237', +'237,237,237,,237,237,237,,237,237,237,237,237,,,,,,,,,,,,,,,,,,,,237', +',,237,,,237,237,,,237,,,,,,237,,,,,,,,,237,,,,,237,237,237,237,,237', +'237,237,237,,,,,237,237,,,,638,638,638,237,638,237,237,237,638,638,', +',,638,,638,638,638,638,638,638,638,,,,,,638,638,638,638,638,638,638', +',,638,,,,,,,638,,,638,638,638,638,638,638,638,638,,638,638,638,,638', +'638,638,638,638,,,,,,,,,,,,,,,,,,,,638,,,638,,,638,638,,,638,,,,,,638', +',,,,,,,,638,,,,,638,638,638,638,,638,638,638,638,,,,,638,638,,,,319', +'319,319,638,319,638,638,638,319,319,,,,319,,319,319,319,319,319,319', +'319,,,,,,319,319,319,319,319,319,319,,,319,,,,,,,319,,,319,319,319,319', +'319,319,319,319,,319,319,319,,319,319,,,319,,,,,,,,,,,,,,,,,,,,319,', +',319,,,319,319,,,319,,,,,,,,,,,,,,,,,,,,319,319,319,319,,319,319,319', +'319,,,,,319,319,,,,635,635,635,319,635,319,319,319,635,635,,,,635,,635', +'635,635,635,635,635,635,,,,,,635,635,635,635,635,635,635,,,635,,,,,', +',635,,,635,635,635,635,635,635,635,635,,635,635,635,,635,635,635,635', +'635,,,,,,,,,,,,,,,,,,,,635,,,635,,,635,635,,,635,,,,,,635,,,,,,,,,635', +',,,,635,635,635,635,,635,635,635,635,,,,,635,635,,,,236,236,236,635', +'236,635,635,635,236,236,,,,236,,236,236,236,236,236,236,236,,,,,,236', +'236,236,236,236,236,236,,,236,,,,,,,236,,,236,236,236,236,236,236,236', +'236,,236,236,236,,236,236,236,236,236,,,,,,,,,,,,,,,,,,,,236,,,236,', +',236,236,,,236,,,,,,236,,,,,,,,,236,,,,,236,236,236,236,,236,236,236', +'236,,,,,236,236,,,,235,235,235,236,235,236,236,236,235,235,,,,235,,235', +'235,235,235,235,235,235,,,,,,235,235,235,235,235,235,235,,,235,,,,,', +',235,,,235,235,235,235,235,235,235,235,,235,235,235,,235,235,235,235', +'235,,,,,,,,,,,,,,,,,,,,235,,,235,,,235,235,,,235,,,,,,235,,,,,,,,,235', +',,,,235,235,235,235,,235,235,235,235,,,,,235,235,,,,20,20,20,235,20', +'235,235,235,20,20,,,,20,,20,20,20,20,20,20,20,,,,,,20,20,20,20,20,20', +'20,,,20,,,,,,,20,,,20,20,20,20,20,20,20,20,,20,20,20,,20,20,20,20,20', +',,,,,,,,,,,,,,,,,,,20,,,20,,,20,20,,,20,,,,,,20,,,,,,,,,20,,,,,20,20', +'20,20,,20,20,20,20,,,,,20,20,,,,232,232,232,20,232,20,20,20,232,232', +',,,232,,232,232,232,232,232,232,232,,,,,,232,232,232,232,232,232,232', +',,232,,,,,,,232,,,232,232,232,232,232,232,232,232,,232,232,232,,232', +'232,232,232,232,,,,,,,,,,,,,,,,,,,,232,,,232,,,232,232,,,232,,,,,,232', +',,,,,,,,232,,,,,232,232,232,232,,232,232,232,232,,,,,232,232,,,,919', +'919,919,232,919,232,232,232,919,919,,,,919,,919,919,919,919,919,919', +'919,,,,,,919,919,919,919,919,919,919,,,919,,,,,,,919,,,919,919,919,919', +'919,919,919,919,,919,919,919,,919,919,,,919,,,,,,,,,,,,,,,,,,,,919,', +',919,,,919,919,,,919,,,,,,,,,,,,,,,,,,,,919,919,919,919,,919,919,919', +'919,,,,,919,919,,,,611,611,611,919,611,919,919,919,611,611,,,,611,,611', +'611,611,611,611,611,611,,,,,,611,611,611,611,611,611,611,,,611,,,,,', +',611,,,611,611,611,611,611,611,611,611,,611,611,611,,611,611,611,611', +'611,,,,,,,,,,,,,,,,,,,,611,,,611,,,611,611,,,611,,,,,,611,,,,,,,,,611', +',,,,611,611,611,611,,611,611,611,611,,,,,611,611,,,,610,610,610,611', +'610,611,611,611,610,610,,,,610,,610,610,610,610,610,610,610,,,,,,610', +'610,610,610,610,610,610,,,610,,,,,,,610,,,610,610,610,610,610,610,610', +'610,,610,610,610,,610,610,610,610,610,,,,,,,,,,,,,,,,,,,,610,,,610,', +',610,610,,,610,,,,,,610,,,,,,,,,610,,,,,610,610,610,610,,610,610,610', +'610,,,,,610,610,,,,823,823,823,610,823,610,610,610,823,823,,,,823,,823', +'823,823,823,823,823,823,,,,,,823,823,823,823,823,823,823,,,823,,,,,', +',823,,,823,823,823,823,823,823,823,823,,823,823,823,,823,823,823,823', +'823,,,,,,,,,,,,,,,,,,,,823,,,823,,,823,823,,,823,,823,,,,823,,,,,,,', +',823,,,,,823,823,823,823,,823,823,823,823,,,,,823,823,,,,450,450,450', +'823,450,823,823,823,450,450,,,,450,,450,450,450,450,450,450,450,,,,', +',450,450,450,450,450,450,450,,,450,,,,,,,450,,,450,450,450,450,450,450', +'450,450,450,450,450,450,,450,450,450,450,450,,,,,,,,,,,,,,,,,,,,450', +',,450,,,450,450,,,450,,450,,450,,450,,,450,,,,,,450,,,,,450,450,450', +'450,,450,450,450,450,,,,,450,450,,,,257,257,257,450,257,450,450,450', +'257,257,,,,257,,257,257,257,257,257,257,257,,,,,,257,257,257,257,257', +'257,257,,,257,,,,,,,257,,,257,257,257,257,257,257,257,257,,257,257,257', +',257,257,257,257,257,,,,,,,,,,,,,,,,,,,,257,,,257,,,257,257,,,257,,', +',,,257,,,,,,,,,257,,,,,257,257,257,257,,257,257,257,257,,,,,257,257', +',,,717,717,717,257,717,257,257,257,717,717,,,,717,,717,717,717,717,717', +'717,717,,,,,,717,717,717,717,717,717,717,,,717,,,,,,,717,,,717,717,717', +'717,717,717,717,717,,717,717,717,,717,717,717,717,717,,,,,,,,,,,,,,', +',,,,,717,,,717,,,717,717,,,717,,,,,,717,,,,,,,,,717,,,,,717,717,717', +'717,,717,717,717,717,,,,,717,717,,,,258,258,258,717,258,717,717,717', +'258,258,,,,258,,258,258,258,258,258,258,258,,,,,,258,258,258,258,258', +'258,258,,,258,,,,,,,258,,,258,258,258,258,258,258,258,258,,258,258,258', +',258,258,258,258,258,,,,,,,,,,,,,,,,,,,,258,,,258,,,258,258,,,258,,', +',,,258,,,,,,,,,258,,,,,258,258,258,258,,258,258,258,258,,,,,258,258', +',,,259,259,259,258,259,258,258,258,259,259,,,,259,,259,259,259,259,259', +'259,259,,,,,,259,259,259,259,259,259,259,,,259,,,,,,,259,,,259,259,259', +'259,259,259,259,259,,259,259,259,,259,259,259,259,259,,,,,,,,,,,,,,', +',,,,,259,,,259,,,259,259,,,259,,,,,,259,,,,,,,,,259,,,,,259,259,259', +'259,,259,259,259,259,,,,,259,259,,,,739,739,739,259,739,259,259,259', +'739,739,,,,739,,739,739,739,739,739,739,739,,,,,,739,739,739,739,739', +'739,739,,,739,,,,,,,739,,,739,739,739,739,739,739,739,739,,739,739,739', +',739,739,739,739,739,,,,,,,,,,,,,,,,,,,,739,,,739,,,739,739,,,739,,', +',,,739,,,,,,,,,739,,,,,739,739,739,739,,739,739,739,739,,,,,739,739', +',,,260,260,260,739,260,739,739,739,260,260,,,,260,,260,260,260,260,260', +'260,260,,,,,,260,260,260,260,260,260,260,,,260,,,,,,,260,,,260,260,260', +'260,260,260,260,260,,260,260,260,,260,260,260,260,260,,,,,,,,,,,,,,', +',,,,,260,,,260,,,260,260,,,260,,,,,,260,,,,,,,,,260,,,,,260,260,260', +'260,,260,260,260,260,,,,,260,260,,,,256,256,256,260,256,260,260,260', +'256,256,,,,256,,256,256,256,256,256,256,256,,,,,,256,256,256,256,256', +'256,256,,,256,,,,,,,256,,,256,256,256,256,256,256,256,256,,256,256,256', +',256,256,256,256,256,,,,,,,,,,,,,,,,,,,,256,,,256,,,256,256,,,256,,', +',,,256,,,,,,,,,256,,,,,256,256,256,256,,256,256,256,256,,,,,256,256', +',,,255,255,255,256,255,256,256,256,255,255,,,,255,,255,255,255,255,255', +'255,255,,,,,,255,255,255,255,255,255,255,,,255,,,,,,,255,,,255,255,255', +'255,255,255,255,255,,255,255,255,,255,255,255,255,255,,,,,,,,,,,,,,', +',,,,,255,,,255,,,255,255,,,255,,,,,,255,,,,,,,,,255,,,,,255,255,255', +'255,,255,255,255,255,,,,,255,255,,,,747,747,747,255,747,255,255,255', +'747,747,,,,747,,747,747,747,747,747,747,747,,,,,,747,747,747,747,747', +'747,747,,,747,,,,,,,747,,,747,747,747,747,747,747,747,747,,747,747,747', +',747,747,747,747,747,,,,,,,,,,,,,,,,,,,,747,,,747,,,747,747,,,747,,', +',,,747,,,,,,,,,747,,,,,747,747,747,747,,747,747,747,747,,,,,747,747', +',,,254,254,254,747,254,747,747,747,254,254,,,,254,,254,254,254,254,254', +'254,254,,,,,,254,254,254,254,254,254,254,,,254,,,,,,,254,,,254,254,254', +'254,254,254,254,254,,254,254,254,,254,254,254,254,254,,,,,,,,,,,,,,', +',,,,,254,,,254,,,254,254,,,254,,,,,,254,,,,,,,,,254,,,,,254,254,254', +'254,,254,254,254,254,,,,,254,254,,,,760,760,760,254,760,254,254,254', +'760,760,,,,760,,760,760,760,760,760,760,760,,,,,,760,760,760,760,760', +'760,760,,,760,,,,,,,760,,,760,760,760,760,760,760,760,760,,760,760,760', +',760,760,760,760,760,,,,,,,,,,,,,,,,,,,,760,,,760,,,760,760,,,760,,', +',,,760,,,,,,,,,760,,,,,760,760,760,760,,760,760,760,760,,,,,760,760', +',,,761,761,761,760,761,760,760,760,761,761,,,,761,,761,761,761,761,761', +'761,761,,,,,,761,761,761,761,761,761,761,,,761,,,,,,,761,,,761,761,761', +'761,761,761,761,761,,761,761,761,,761,761,761,761,761,,,,,,,,,,,,,,', +',,,,,761,,,761,,,761,761,,,761,,,,,,761,,,,,,,,,761,,,,,761,761,761', +'761,,761,761,761,761,,,,,761,761,,,,762,762,762,761,762,761,761,761', +'762,762,,,,762,,762,762,762,762,762,762,762,,,,,,762,762,762,762,762', +'762,762,,,762,,,,,,,762,,,762,762,762,762,762,762,762,762,,762,762,762', +',762,762,762,762,762,,,,,,,,,,,,,,,,,,,,762,,,762,,,762,762,,,762,,', +',,,762,,,,,,,,,762,,,,,762,762,762,762,,762,762,762,762,,,,,762,762', +',,,763,763,763,762,763,762,762,762,763,763,,,,763,,763,763,763,763,763', +'763,763,,,,,,763,763,763,763,763,763,763,,,763,,,,,,,763,,,763,763,763', +'763,763,763,763,763,,763,763,763,,763,763,763,763,763,,,,,,,,,,,,,,', +',,,,,763,,,763,,,763,763,,,763,,,,,,763,,,,,,,,,763,,,,,763,763,763', +'763,,763,763,763,763,,,,,763,763,,,,253,253,253,763,253,763,763,763', +'253,253,,,,253,,253,253,253,253,253,253,253,,,,,,253,253,253,253,253', +'253,253,,,253,,,,,,,253,,,253,253,253,253,253,253,253,253,,253,253,253', +',253,253,253,253,253,,,,,,,,,,,,,,,,,,,,253,,,253,,,253,253,,,253,,', +',,,253,,,,,,,,,253,,,,,253,253,253,253,,253,253,253,253,,,,,253,253', +',,,765,765,765,253,765,253,253,253,765,765,,,,765,,765,765,765,765,765', +'765,765,,,,,,765,765,765,765,765,765,765,,,765,,,,,,,765,,,765,765,765', +'765,765,765,765,765,,765,765,765,,765,765,765,765,765,,,,,,,,,,,,,,', +',,,,,765,,,765,,,765,765,,,765,,,,,,765,,,,,,,,,765,,,,,765,765,765', +'765,,765,765,765,765,,,,,765,765,,,,252,252,252,765,252,765,765,765', +'252,252,,,,252,,252,252,252,252,252,252,252,,,,,,252,252,252,252,252', +'252,252,,,252,,,,,,,252,,,252,252,252,252,252,252,252,252,,252,252,252', +',252,252,252,252,252,,,,,,,,,,,,,,,,,,,,252,,,252,,,252,252,,,252,,', +',,,252,,,,,,,,,252,,,,,252,252,252,252,,252,252,252,252,,,,,252,252', +',,,251,251,251,252,251,252,252,252,251,251,,,,251,,251,251,251,251,251', +'251,251,,,,,,251,251,251,251,251,251,251,,,251,,,,,,,251,,,251,251,251', +'251,251,251,251,251,,251,251,251,,251,251,251,251,251,,,,,,,,,,,,,,', +',,,,,251,,,251,,,251,251,,,251,,,,,,251,,,,,,,,,251,,,,,251,251,251', +'251,,251,251,251,251,,,,,251,251,,,,684,684,684,251,684,251,251,251', +'684,684,,,,684,,684,684,684,684,684,684,684,,,,,,684,684,684,684,684', +'684,684,,,684,,,,,,,684,,,684,684,684,684,684,684,684,684,,684,684,684', +',684,684,684,684,684,,,,,,,,,,,,,,,,,,,,684,,,684,,,684,684,,,684,,', +',,,684,,,,,,,,,684,,,,,684,684,684,684,,684,684,684,684,,,,,684,684', +',,,267,267,267,684,267,684,684,684,267,267,,,,267,,267,267,267,267,267', +'267,267,,,,,,267,267,267,267,267,267,267,,,267,,,,,,,267,,,267,267,267', +'267,267,267,267,267,267,267,267,267,,267,267,267,267,267,,,,,,,,,,,', +',,,,,,,,267,,,267,,,267,267,,,267,,267,,267,,267,,,267,,,,,,267,,,,', +'267,267,267,267,,267,267,267,267,,,,,267,267,,,,268,268,268,267,268', +'267,267,267,268,268,,,,268,,268,268,268,268,268,268,268,,,,,,268,268', +'268,268,268,268,268,,,268,,,,,,,268,,,268,268,268,268,268,268,268,268', +'268,268,268,268,,268,268,268,268,268,,,,,,,,,,,,,,,,,,,,268,,,268,,', +'268,268,,,268,,268,,268,,268,,,268,,,,,,268,,,,,268,268,268,268,,268', +'268,268,268,,,,,268,268,,,,276,276,276,268,276,268,268,268,276,276,', +',,276,,276,276,276,276,276,276,276,,,,,,276,276,276,276,276,276,276', +',,276,,,,,,,276,,,276,276,276,276,276,276,276,276,276,276,276,276,,276', +'276,276,276,276,,,,,,,,,,,,,,,,,,,,276,,,276,,,276,276,,,276,,276,,276', +',276,,,276,,,,,,276,,,,,276,276,276,276,,276,276,276,276,,,,,276,276', +'276,,,250,250,250,276,250,276,276,276,250,250,,,,250,,250,250,250,250', +'250,250,250,,,,,,250,250,250,250,250,250,250,,,250,,,,,,,250,,,250,250', +'250,250,250,250,250,250,,250,250,250,,250,250,250,250,250,,,,,,,,,,', +',,,,,,,,,250,,,250,,,250,250,,,250,,,,,,250,,,,,,,,,250,,,,,250,250', +'250,250,,250,250,250,250,,,,,250,250,,,,249,249,249,250,249,250,250', +'250,249,249,,,,249,,249,249,249,249,249,249,249,,,,,,249,249,249,249', +'249,249,249,,,249,,,,,,,249,,,249,249,249,249,249,249,249,249,,249,249', +'249,,249,249,249,249,249,,,,,,,,,,,,,,,,,,,,249,,,249,,,249,249,,,249', +',,,,,249,,,,,,,,,249,,,,,249,249,249,249,,249,249,249,249,,,,,249,249', +',,,248,248,248,249,248,249,249,249,248,248,,,,248,,248,248,248,248,248', +'248,248,,,,,,248,248,248,248,248,248,248,,,248,,,,,,,248,,,248,248,248', +'248,248,248,248,248,,248,248,248,,248,248,248,248,248,,,,,,,,,,,,,,', +',,,,,248,,,248,,,248,248,,,248,,,,,,248,,,,,,,,,248,,,,,248,248,248', +'248,,248,248,248,248,,,,,248,248,,,,247,247,247,248,247,248,248,248', +'247,247,,,,247,,247,247,247,247,247,247,247,,,,,,247,247,247,247,247', +'247,247,,,247,,,,,,,247,,,247,247,247,247,247,247,247,247,,247,247,247', +',247,247,247,247,247,,,,,,,,,,,,,,,,,,,,247,,,247,,,247,247,,,247,,', +',,,247,,,,,,,,,247,,,,,247,247,247,247,,247,247,247,247,,,,,247,247', +',,,246,246,246,247,246,247,247,247,246,246,,,,246,,246,246,246,246,246', +'246,246,,,,,,246,246,246,246,246,246,246,,,246,,,,,,,246,,,246,246,246', +'246,246,246,246,246,,246,246,246,,246,246,246,246,246,,,,,,,,,,,,,,', +',,,,,246,,,246,,,246,246,,,246,,,,,,246,,,,,,,,,246,,,,,246,246,246', +'246,,246,246,246,246,,,,,246,246,,,,245,245,245,246,245,246,246,246', +'245,245,,,,245,,245,245,245,245,245,245,245,,,,,,245,245,245,245,245', +'245,245,,,245,,,,,,,245,,,245,245,245,245,245,245,245,245,,245,245,245', +',245,245,245,245,245,,,,,,,,,,,,,,,,,,,,245,,,245,,,245,245,,,245,,', +',,,245,,,,,,,,,245,,,,,245,245,245,245,,245,245,245,245,,,,,245,245', +',,,805,805,805,245,805,245,245,245,805,805,,,,805,,805,805,805,805,805', +'805,805,,,,,,805,805,805,805,805,805,805,,,805,,,,,,,805,,,805,805,805', +'805,805,805,805,805,,805,805,805,,805,805,805,805,805,,,,,,,,,,,,,,', +',,,,,805,,,805,,,805,805,,,805,,,,,,805,,,,,,,,,805,,,,,805,805,805', +'805,,805,805,805,805,,,,,805,805,,,,658,658,658,805,658,805,805,805', +'658,658,,,,658,,658,658,658,658,658,658,658,,,,,,658,658,658,658,658', +'658,658,,,658,,,,,,,658,,,658,658,658,658,658,658,658,658,,658,658,658', +',658,658,658,658,658,,,,,,,,,,,,,,,,,,,,658,,,658,,,658,658,,,658,,658', +',,,658,,,,,,,,,658,,,,,658,658,658,658,,658,658,658,658,,,,,658,658', +',,,244,244,244,658,244,658,658,658,244,244,,,,244,,244,244,244,244,244', +'244,244,,,,,,244,244,244,244,244,244,244,,,244,,,,,,,244,,,244,244,244', +'244,244,244,244,244,,244,244,244,,244,244,244,244,244,,,,,,,,,,,,,,', +',,,,,244,,,244,,,244,244,,,244,,,,,,244,,,,,,,,,244,,,,,244,244,244', +'244,,244,244,244,244,,,,,244,244,,,,283,283,283,244,283,244,244,244', +'283,283,,,,283,,283,283,283,283,283,283,283,,,,,,283,283,283,283,283', +'283,283,,,283,,,,,,,283,,,283,283,283,283,283,283,283,283,,283,283,283', +',283,283,283,283,283,,,,,,,,,,,,,,,,,,,,283,,,283,,,283,283,,,283,,', +',,,283,,,,,,,,,283,,,,,283,283,283,283,,283,283,283,283,,,,,283,283', +',,,818,818,818,283,818,283,283,283,818,818,,,,818,,818,818,818,818,818', +'818,818,,,,,,818,818,818,818,818,818,818,,,818,,,,,,,818,,,818,818,818', +'818,818,818,818,818,,818,818,818,,818,818,818,818,818,,,,,,,,,,,,,,', +',,,,,818,,,818,,,818,818,,,818,,,,,,818,,,,,,,,,818,,,,,818,818,818', +'818,,818,818,818,818,,,,,818,818,,,,285,285,285,818,285,818,818,818', +'285,285,,,,285,,285,285,285,285,285,285,285,,,,,,285,285,285,285,285', +'285,285,,,285,,,,,,,285,,,285,285,285,285,285,285,285,285,,285,285,285', +',285,285,285,285,285,,,,,,,,,,,,,,,,,,,,285,,,285,,,285,285,,,285,,', +',,,285,,,,,,,,,285,,,,,285,285,285,285,,285,285,285,285,,,,,285,285', +',,,288,288,288,285,288,285,285,285,288,288,,,,288,,288,288,288,288,288', +'288,288,,,,,,288,288,288,288,288,288,288,,,288,,,,,,,288,,,288,288,288', +'288,288,288,288,288,,288,288,288,,288,288,288,288,288,,,,,,,,,,,,,,', +',,,,,288,,,288,,,288,288,,,288,,,,,,288,,,,,,,,,288,,,,,288,288,288', +'288,,288,288,288,288,,,,,288,288,,,,289,289,289,288,289,288,288,288', +'289,289,,,,289,,289,289,289,289,289,289,289,,,,,,289,289,289,289,289', +'289,289,,,289,,,,,,,289,,,289,289,289,289,289,289,289,289,,289,289,289', +',289,289,289,289,289,,,,,,,,,,,,,,,,,,,,289,,,289,,,289,289,,,289,,', +',,,289,,,,,,,,,289,,,,,289,289,289,289,,289,289,289,289,,,,,289,289', +',,,243,243,243,289,243,289,289,289,243,243,,,,243,,243,243,243,243,243', +'243,243,,,,,,243,243,243,243,243,243,243,,,243,,,,,,,243,,,243,243,243', +'243,243,243,243,243,,243,243,243,,243,243,243,243,243,,,,,,,,,,,,,,', +',,,,,243,,,243,,,243,243,,,243,,,,,,243,,,,,,,,,243,,,,,243,243,243', +'243,,243,243,243,243,,,,,243,243,,,,653,653,653,243,653,243,243,243', +'653,653,,,,653,,653,653,653,653,653,653,653,,,,,,653,653,653,653,653', +'653,653,,,653,,,,,,,653,,,653,653,653,653,653,653,653,653,,653,653,653', +',653,653,,,653,,,,,,,,,,,,,,,,,,,,653,,,653,,,653,653,,,653,,,803,,803', +'803,803,803,803,,,,,,,,,803,,653,653,653,653,,653,653,653,653,,,,,653', +'653,,,,,,803,653,,653,653,653,294,294,294,294,294,803,803,,294,294,803', +',,294,,294,294,294,294,294,294,294,,,,,,294,294,294,294,294,294,294', +',,294,,,,,,294,294,,294,294,294,294,294,294,294,294,294,,294,294,294', +',294,294,294,294,294,,,,,,,,,,,,,,,,,,,,294,,,294,,,294,294,,,294,,294', +',,,294,,,,,,,,,294,,,,,294,294,294,294,,294,294,294,294,,,,,294,294', +',,,242,242,242,294,242,294,294,294,242,242,,,,242,,242,242,242,242,242', +'242,242,,,,,,242,242,242,242,242,242,242,,,242,,,,,,,242,,,242,242,242', +'242,242,242,242,242,,242,242,242,,242,242,242,242,242,,,,,,,,,,,,,,', +',,,,,242,,,242,,,242,242,,,242,,,,,,242,,,,,,,,,242,,,,,242,242,242', +'242,,242,242,242,242,,,,,242,242,,,,241,241,241,242,241,242,242,242', +'241,241,,,,241,,241,241,241,241,241,241,241,,,,,,241,241,241,241,241', +'241,241,,,241,,,,,,,241,,,241,241,241,241,241,241,241,241,,241,241,241', +',241,241,241,241,241,,,,,,,,,,,,,,,,,,,,241,,,241,,,241,241,,,241,,', +',,,241,,,,,,,,,241,,,,,241,241,241,241,,241,241,241,241,,,,,241,241', +',,,841,841,841,241,841,241,241,241,841,841,,,,841,,841,841,841,841,841', +'841,841,,,,,,841,841,841,841,841,841,841,,,841,,,,,,,841,,,841,841,841', +'841,841,841,841,841,841,841,841,841,,841,841,841,841,841,,,,,,,,,,,', +',,,,,,,,841,,,841,,,841,841,,,841,,,,841,,841,,,841,,,,,,841,,,,,841', +'841,841,841,,841,841,841,841,,,,,841,841,,,,43,43,43,841,43,841,841', +'841,43,43,,,,43,,43,43,43,43,43,43,43,,,,,,43,43,43,43,43,43,43,,,43', +',,,,,,43,,,43,43,43,43,43,43,43,43,,43,43,43,,43,43,43,43,43,,,,,,,', +',,,,,,,,,,,,43,,,43,,,43,43,,,43,,,,,,43,,,,,,,,,43,,,,,43,43,43,43', +',43,43,43,43,,,,,43,43,,,,221,221,221,43,221,43,43,43,221,221,,,,221', +',221,221,221,221,221,221,221,,,,,,221,221,221,221,221,221,221,,,221', +',,,,,,221,,,221,221,221,221,221,221,221,221,,221,221,221,,221,221,221', +'221,221,,,,,,,,,,,,,,,,,,,,221,,,221,,,221,221,,,221,,,,,,221,,,,,,', +',,221,,,,,221,221,221,221,,221,221,221,221,,,,,221,221,221,,,220,220', +'220,221,220,221,221,221,220,220,,,,220,,220,220,220,220,220,220,220', +',,,,,220,220,220,220,220,220,220,,,220,,,,,,,220,,,220,220,220,220,220', +'220,220,220,,220,220,220,,220,220,220,220,220,,,,,,,,,,,,,,,,,,,,220', +',,220,,,220,220,,,220,,,,,,220,,,,,,,,,220,,,,,220,220,220,220,,220', +'220,220,220,,,,,220,220,,,,219,219,219,220,219,220,220,220,219,219,', +',,219,,219,219,219,219,219,219,219,,,,,,219,219,219,219,219,219,219', +',,219,,,,,,,219,,,219,219,219,219,219,219,219,219,,219,219,219,,219', +'219,219,219,219,,,,,,,,,,,,,,,,,,,,219,,,219,,,219,219,,,219,,,,,,219', +',,,,,,,,219,,,,,219,219,219,219,,219,219,219,219,,,,,219,219,,,,975', +'975,975,219,975,219,219,219,975,975,,,,975,,975,975,975,975,975,975', +'975,,,,,,975,975,975,975,975,975,975,,,975,,,,,,,975,,,975,975,975,975', +'975,975,975,975,975,975,975,975,,975,975,975,975,975,,,,,,,,,,,,,,,', +',,,,975,,,975,,,975,975,,,975,,975,,975,,975,,,975,,,,,,975,,,,,975', +'975,975,975,,975,975,975,975,,,,,975,975,,,,44,44,44,975,44,975,975', +'975,44,44,,,,44,,44,44,44,44,44,44,44,,,,,,44,44,44,44,44,44,44,,,44', +',,,,,,44,,,44,44,44,44,44,44,44,44,,44,44,44,,44,44,44,44,44,,,,,,,', +',,,,,,,,,,,,44,,,44,,,44,44,,,44,,,,,,44,,,,,,,,,44,,,,,44,44,44,44', +',44,44,44,44,,,,,44,44,,,,562,562,562,44,562,44,44,44,562,562,,,,562', +',562,562,562,562,562,562,562,,,,,,562,562,562,562,562,562,562,,,562', +',,,,,,562,,,562,562,562,562,562,562,562,562,562,562,562,562,,562,562', +'562,562,562,,,,,,,,,,,,,,,,,,,,562,,,562,,,562,562,,,562,,562,,562,', +'562,,,562,,,,,,562,,,,,562,562,562,562,,562,562,562,562,,,,,562,562', +',,,343,343,343,562,343,562,562,562,343,343,,,,343,,343,343,343,343,343', +'343,343,,,,,,343,343,343,343,343,343,343,,,343,,,,,,,343,,,343,343,343', +'343,343,343,343,343,,343,343,343,,343,343,343,343,343,,,,,,,,,,,,,,', +',,,,,343,,,343,,,343,343,,,343,,,,,,343,,,,,,,,,343,,,,,343,343,343', +'343,,343,343,343,343,,,,,343,343,,,,344,344,344,343,344,343,343,343', +'344,344,,,,344,,344,344,344,344,344,344,344,,,,,,344,344,344,344,344', +'344,344,,,344,,,,,,,344,,,344,344,344,344,344,344,344,344,,344,344,344', +',344,344,344,344,344,,,,,,,,,,,,,,,,,,,,344,,,344,,,344,344,,,344,,', +',,,344,,,,,,,,,344,,,,,344,344,344,344,,344,344,344,344,,,,,344,344', +',,,552,552,552,344,552,344,344,344,552,552,,,,552,,552,552,552,552,552', +'552,552,,,,,,552,552,552,552,552,552,552,,,552,,,,,,,552,,,552,552,552', +'552,552,552,552,552,552,552,552,552,,552,552,552,552,552,,,,,,,,,,,', +',,,,,,,,552,,,552,,,552,552,,,552,,552,,552,,552,,,552,,,,,,552,,,,', +'552,552,552,552,,552,552,552,552,,,,,552,552,,,,551,551,551,552,551', +'552,552,552,551,551,,,,551,,551,551,551,551,551,551,551,,,,,,551,551', +'551,551,551,551,551,,,551,,,,,,,551,,,551,551,551,551,551,551,551,551', +',551,551,551,,551,551,551,551,551,,,,,,,,,,,,,,,,,,,,551,,,551,,,551', +'551,,,551,,551,,,,551,,,,,,,,,551,,,,,551,551,551,551,,551,551,551,551', +',,,,551,551,,,,214,214,214,551,214,551,551,551,214,214,,,,214,,214,214', +'214,214,214,214,214,,,,,,214,214,214,214,214,214,214,,,214,,,,,,,214', +',,214,214,214,214,214,214,214,214,214,214,214,214,,214,214,214,214,214', +',,,,,,,,,,,,,,,,,,,214,,,214,,,214,214,,,214,,214,,214,,214,,,214,,', +',,,214,,,,,214,214,214,214,,214,214,214,214,,,,,214,214,,,,213,213,213', +'214,213,214,214,214,213,213,,,,213,,213,213,213,213,213,213,213,,,,', +',213,213,213,213,213,213,213,,,213,,,,,,,213,,,213,213,213,213,213,213', +'213,213,,213,213,213,,213,213,213,213,213,,,,,,,,,,,,,,,,,,,,213,,,213', +',,213,213,,,213,,,,,,213,,,,,,,,,213,,,,,213,213,213,213,,213,213,213', +'213,,,,,213,213,,,,537,537,537,213,537,213,213,213,537,537,,,,537,,537', +'537,537,537,537,537,537,,,,,,537,537,537,537,537,537,537,,,537,,,,,', +',537,,,537,537,537,537,537,537,537,537,537,537,537,537,,537,537,537', +'537,537,,,,,,,,,,,,,,,,,,,,537,,,537,,,537,537,,,537,,,,,,537,,,537', +',,,,,537,,,,,537,537,537,537,,537,537,537,537,,,,,537,537,,,,534,534', +'534,537,534,537,537,537,534,534,,,,534,,534,534,534,534,534,534,534', +',,,,,534,534,534,534,534,534,534,,,534,,,,,,,534,,,534,534,534,534,534', +'534,534,534,534,534,534,534,,534,534,534,534,534,,,,,,,,,,,,,,,,,,,', +'534,,,534,,,534,534,,,534,,534,,,,534,,,534,,,,,,534,,,,,534,534,534', +'534,,534,534,534,534,,,,,534,534,,,,212,212,212,534,212,534,534,534', +'212,212,,,,212,,212,212,212,212,212,212,212,,,,,,212,212,212,212,212', +'212,212,,,212,,,,,,,212,,,212,212,212,212,212,212,212,212,,212,212,212', +',212,212,212,212,212,,,,,,,,,,,,,,,,,,,,212,,,212,,,212,212,,,212,,', +',,,212,,,,,,,,,212,,,,,212,212,212,212,,212,212,212,212,,,,,212,212', +',,,211,211,211,212,211,212,212,212,211,211,,,,211,,211,211,211,211,211', +'211,211,,,,,,211,211,211,211,211,211,211,,,211,,,,,,,211,,,211,211,211', +'211,211,211,211,211,,211,211,211,,211,211,211,211,211,,,,,,,,,,,,,,', +',,,,,211,,,211,,,211,211,,,211,,,,,,211,,,,,,,,,211,,,,,211,211,211', +'211,,211,211,211,211,,,,,211,211,,,,210,210,210,211,210,211,211,211', +'210,210,,,,210,,210,210,210,210,210,210,210,,,,,,210,210,210,210,210', +'210,210,,,210,,,,,,,210,,,210,210,210,210,210,210,210,210,,210,210,210', +',210,210,210,210,210,,,,,,,,,,,,,,,,,,,,210,,,210,,,210,210,,,210,,210', +',,,210,,,,,,,,,210,,,,,210,210,210,210,,210,210,210,210,,,,,210,210', +',,,,,,210,,210,210,210,58,58,58,58,58,,,,58,58,,,,58,,58,58,58,58,58', +'58,58,,,,,,58,58,58,58,58,58,58,,,58,,,,,,58,58,,58,58,58,58,58,58,58', +'58,58,,58,58,58,,58,58,58,58,58,,,,,,,,,,,,,,,,,,,,58,,,58,,,58,58,', +',58,,58,,,,58,,,,,,,,,58,,,,,58,58,58,58,,58,58,58,58,,,,,58,58,,,,209', +'209,209,58,209,58,58,58,209,209,,,,209,,209,209,209,209,209,209,209', +',,,,,209,209,209,209,209,209,209,,,209,,,,,,,209,,,209,209,209,209,209', +'209,209,209,,209,209,209,,209,209,209,209,209,,,,,,,,,,,,,,,,,,,,209', +',,209,,,209,209,,,209,,209,,,,209,,,,,,,,,209,,,,,209,209,209,209,,209', +'209,209,209,,,,,209,209,,,,528,528,528,209,528,209,209,209,528,528,', +',,528,,528,528,528,528,528,528,528,,,,,,528,528,528,528,528,528,528', +',,528,,,,,,,528,,,528,528,528,528,528,528,528,528,,528,528,528,,528', +'528,528,528,528,,,,,,,,,,,,,,,,,,,,528,,,528,,,528,528,,,528,,,,,,528', +',,,,,,,,528,,,,,528,528,528,528,,528,528,528,528,,,,,528,528,,,,59,59', +'59,528,59,528,528,528,59,59,,,,59,,59,59,59,59,59,59,59,,,,,,59,59,59', +'59,59,59,59,,,59,,,,,,,59,,,59,59,59,59,59,59,59,59,59,59,59,59,,59', +'59,59,59,59,,,,,,,,,,,,,,,,,,,,59,,,59,,,59,59,,,59,,59,,,,59,,,59,', +',,,,59,,,,,59,59,59,59,,59,59,59,59,,,,,59,59,,,,524,524,524,59,524', +'59,59,59,524,524,,,,524,,524,524,524,524,524,524,524,,,,,,524,524,524', +'524,524,524,524,,,524,,,,,,,524,,,524,524,524,524,524,524,524,524,,524', +'524,524,,524,524,524,524,524,,,,,,,,,,,,,,,,,,,,524,,,524,,,524,524', +',,524,,,,,,524,,,,,,,,,524,,,,,524,524,524,524,,524,524,524,524,,,,', +'524,524,,,,363,363,363,524,363,524,524,524,363,363,,,,363,,363,363,363', +'363,363,363,363,,,,,,363,363,363,363,363,363,363,,,363,,,,,,,363,,,363', +'363,363,363,363,363,363,363,,363,363,363,,363,363,363,363,363,,,,,,', +',,,,,,,,,,,,,363,,,363,,,363,363,,,363,,,,,,363,,,,,,,,,363,,,,,363', +'363,363,363,,363,363,363,363,,,,,363,363,,,,523,523,523,363,523,363', +'363,363,523,523,,,,523,,523,523,523,523,523,523,523,,,,,,523,523,523', +'523,523,523,523,,,523,,,,,,,523,,,523,523,523,523,523,523,523,523,,523', +'523,523,,523,523,523,523,523,,,,,,,,,,,,,,,,,,,,523,,,523,,,523,523', +',,523,,,,,,523,,,,,,,,,523,,,,,523,523,523,523,,523,523,523,523,,,,', +'523,523,,,,520,520,520,523,520,523,523,523,520,520,,,,520,,520,520,520', +'520,520,520,520,,,,,,520,520,520,520,520,520,520,,,520,,,,,,,520,,,520', +'520,520,520,520,520,520,520,,520,520,520,,520,520,,,520,,,,,,,,,,,,', +',,,,,,,520,,,520,,,520,520,,,520,,,,,,,,,,,,,,,,,,,,520,520,520,520', +',520,520,520,520,,,,,520,520,,,,514,514,514,520,514,520,520,520,514', +'514,,,,514,,514,514,514,514,514,514,514,,,,,,514,514,514,514,514,514', +'514,,,514,,,,,,,514,,,514,514,514,514,514,514,514,514,514,514,514,514', +',514,514,514,514,514,,,,,,,,,,,,,,,,,,,,514,,,514,,,514,514,,,514,,514', +',514,,514,,,514,,,,,,514,,,,,514,514,514,514,,514,514,514,514,,,,,514', +'514,,,,512,512,512,514,512,514,514,514,512,512,,,,512,,512,512,512,512', +'512,512,512,,,,,,512,512,512,512,512,512,512,,,512,,,,,,,512,,,512,512', +'512,512,512,512,512,512,,512,512,512,,512,512,,,512,,,,,,,,,,,,,,,,', +',,,512,,,512,,,512,512,,,512,,,997,,997,997,997,997,997,,,,,,,,,997', +',512,512,512,512,,512,512,512,512,,,,,512,512,,,,,,997,512,,512,512', +'512,122,122,122,122,122,997,997,,122,122,997,,,122,,122,122,122,122', +'122,122,122,,,,,,122,122,122,122,122,122,122,,,122,,,,,,122,122,,122', +'122,122,122,122,122,122,122,122,,122,122,122,,122,122,122,122,122,,', +',,,,,,,,,,,,,,,,,122,,,122,,,122,122,,,122,,122,,,,122,,,,,,,,,122,', +',,,122,122,122,122,,122,122,122,122,,,,,122,122,,,,121,121,121,122,121', +'122,122,122,121,121,,,,121,,121,121,121,121,121,121,121,,,,,,121,121', +'121,121,121,121,121,,,121,,,,,,,121,,,121,121,121,121,121,121,121,121', +',121,121,121,,121,121,121,121,121,,,,,,,,,,,,,,,,,,,,121,,,121,,,121', +'121,,,121,,,,,,121,,,,,,,,,121,,,,,121,121,121,121,,121,121,121,121', +',,,,121,121,,,,379,379,379,121,379,121,121,121,379,379,,,,379,,379,379', +'379,379,379,379,379,,,,,,379,379,379,379,379,379,379,,,379,,,,,,,379', +',,379,379,379,379,379,379,379,379,,379,379,379,,379,379,379,379,379', +',,,,,,,,,,,,,,,,,,,379,,,379,,,379,379,,,379,,,,,,379,,,,,,,,,379,,', +',,379,379,379,379,,379,379,379,379,,,,,379,379,,,,,,,379,,379,379,379', +'504,504,504,504,504,,,,504,504,,,,504,,504,504,504,504,504,504,504,', +',,,,504,504,504,504,504,504,504,,,504,,,,,,504,504,504,504,504,504,504', +'504,504,504,504,504,,504,504,504,,504,504,504,504,504,,,,,,,,,,,,,,', +',,,,,504,,,504,,,504,504,,,504,,504,,,,504,,,,,,,,,504,,,,,504,504,504', +'504,,504,504,504,504,,,,,504,504,,,,,,504,504,,504,504,504,498,498,498', +',498,,,,498,498,,,,498,,498,498,498,498,498,498,498,,,,,,498,498,498', +'498,498,498,498,,,498,,,,,,,498,,,498,498,498,498,498,498,498,498,,498', +'498,498,,498,498,498,498,498,,,,,,,,,,,,,,,,,,,,498,,,498,,,498,498', +',,498,,,,,,498,,,,,,,,,498,,,,,498,498,498,498,,498,498,498,498,,,,', +'498,498,,,,496,496,496,498,496,498,498,498,496,496,,,,496,,496,496,496', +'496,496,496,496,,,,,,496,496,496,496,496,496,496,,,496,,,,,,,496,,,496', +'496,496,496,496,496,496,496,496,496,496,496,,496,496,496,496,496,,,', +',,,,,,,,,,,,,,,,496,,,496,,,496,496,,,496,,,,496,,496,,,496,,,,,,496', +',,,,496,496,496,496,,496,496,496,496,,,,,496,496,,,,494,494,494,496', +'494,496,496,496,494,494,,,,494,,494,494,494,494,494,494,494,,,,,,494', +'494,494,494,494,494,494,,,494,,,,,,,494,,,494,494,494,494,494,494,494', +'494,494,494,494,494,,494,494,494,494,494,,,,,,,,,,,,,,,,,,,,494,,,494', +',,494,494,,,494,,494,,494,,494,,,494,,,,,,494,,,,,494,494,494,494,,494', +'494,494,494,,,,,494,494,,,,120,120,120,494,120,494,494,494,120,120,', +',,120,,120,120,120,120,120,120,120,,,,,,120,120,120,120,120,120,120', +',,120,,,,,,,120,,,120,120,120,120,120,120,120,120,,120,120,120,,120', +'120,120,120,120,,,,,,,,,,,,,,,,,,,,120,,,120,,,120,120,,,120,,,,,,120', +',,,,,,,,120,,,,,120,120,120,120,,120,120,120,120,,,,,120,120,,,,119', +'119,119,120,119,120,120,120,119,119,,,,119,,119,119,119,119,119,119', +'119,,,,,,119,119,119,119,119,119,119,,,119,,,,,,,119,,,119,119,119,119', +'119,119,119,119,,119,119,119,,119,119,119,119,119,,,,,,,,,,,,,,,,,,', +',119,,,119,,,119,119,,,119,,,,,,119,,,,,,,,,119,,,,,119,119,119,119', +',119,119,119,119,,,,,119,119,,,,118,118,118,119,118,119,119,119,118', +'118,,,,118,,118,118,118,118,118,118,118,,,,,,118,118,118,118,118,118', +'118,,,118,,,,,,,118,,,118,118,118,118,118,118,118,118,,118,118,118,', +'118,118,118,118,118,,,,,,,,,,,,,,,,,,,,118,,,118,,,118,118,,,118,,,', +',,118,,,,,,,,,118,,,,,118,118,118,118,,118,118,118,118,,,,,118,118,', +',,60,60,60,118,60,118,118,118,60,60,,,,60,,60,60,60,60,60,60,60,,,,', +',60,60,60,60,60,60,60,,,60,,,,,,,60,,,60,60,60,60,60,60,60,60,60,60', +'60,60,,60,60,60,60,60,,,,,,,,,,,,,,,,,,,,60,,,60,,,60,60,,,60,,,,,,60', +',,60,,,,,,60,,,,,60,60,60,60,,60,60,60,60,,,,,60,60,,,,63,63,63,60,63', +'60,60,60,63,63,,,,63,,63,63,63,63,63,63,63,,,,,,63,63,63,63,63,63,63', +',,63,,,,,,,63,,,63,63,63,63,63,63,63,63,,63,63,63,,63,63,63,63,63,,', +',,,,,,,,,,,,,,,,,63,,,63,,,63,63,,,63,,,,,,63,,,,,,,,,63,,,,,63,63,63', +'63,,63,63,63,63,,,,,63,63,,,,407,407,407,63,407,63,63,63,407,407,,,', +'407,,407,407,407,407,407,407,407,,,,,,407,407,407,407,407,407,407,,', +'407,,,,,,,407,,,407,407,407,407,407,407,407,407,,407,407,407,,407,407', +'407,407,407,,,,,,,,,,,,,,,,,,,,407,,,407,,,407,407,,,407,,,,,,407,,', +',,,,,,407,,,,,407,407,407,407,,407,407,407,407,,,,,407,407,,,,64,64', +'64,407,64,407,407,407,64,64,,,,64,,64,64,64,64,64,64,64,,,,,,64,64,64', +'64,64,64,64,,,64,,,,,,,64,,,64,64,64,64,64,64,64,64,,64,64,64,,64,64', +'64,64,64,,,,,,,,,,,,,,,,,,,,64,,,64,,,64,64,,,64,,,,,,64,,,,,,,,,64', +',,,,64,64,64,64,,64,64,64,64,,,,,64,64,,,,67,67,67,64,67,64,64,64,67', +'67,,,,67,,67,67,67,67,67,67,67,,,,,,67,67,67,67,67,67,67,,,67,,,,,,', +'67,,,67,67,67,67,67,67,67,67,,67,67,67,,67,67,67,67,67,,,,,,,,,,,,,', +',,,,,,67,,,67,,,67,67,,,67,,,,,,67,,,,,,,,,67,,,,,67,67,67,67,,67,67', +'67,67,,,,,67,67,67,,,,,67,67,,67,67,67,113,113,113,113,113,,,,113,113', +',,,113,,113,113,113,113,113,113,113,,,,,,113,113,113,113,113,113,113', +',,113,,,,,,113,113,113,113,113,113,113,113,113,113,113,113,,113,113', +'113,,113,113,113,113,113,,,,,,,,,,,,,,,,,,,,113,,,113,,,113,113,,,113', +',113,,,,113,,,,,,,,,113,,,,,113,113,113,113,,113,113,113,113,,,,,113', +'113,,,,,,113,113,,113,113,113,68,68,68,,68,,,,68,68,,,,68,,68,68,68', +'68,68,68,68,,,,,,68,68,68,68,68,68,68,,,68,,,,,,,68,,,68,68,68,68,68', +'68,68,68,,68,68,68,,68,68,,,68,,,,,,,,,,,,,,,,,,,,68,,,68,,,68,68,,', +'68,,68,,,,,,,,,,,,,,,,,,68,68,68,68,,68,68,68,68,,,,,68,68,,,,69,69', +'69,68,69,68,68,68,69,69,,,,69,,69,69,69,69,69,69,69,,,,,,69,69,69,69', +'69,69,69,,,69,,,,,,,69,,,69,69,69,69,69,69,69,69,,69,69,69,,69,69,,', +'69,,,,,,,,,,,,,,,,,69,,,69,,,69,,,69,69,,,69,,,,,,,,,,,,,,,,,,,,69,69', +'69,69,,69,69,69,69,,,,,69,69,,,,70,70,70,69,70,69,69,69,70,70,,,,70', +',70,70,70,70,70,70,70,,,,,,70,70,70,70,70,70,70,,,70,,,,,,,70,,,70,70', +'70,70,70,70,70,70,,70,70,70,,70,70,,,70,,,,,,,,,,,,,,,,,,,,70,,,70,', +',70,70,,,70,,,,,,,,,,,,,,,,,,,,70,70,70,70,,70,70,70,70,,,,,70,70,,', +',454,454,454,70,454,70,70,70,454,454,,,,454,,454,454,454,454,454,454', +'454,,,,,,454,454,454,454,454,454,454,,,454,,,,,,,454,,,454,454,454,454', +'454,454,454,454,,454,454,454,,454,454,454,454,454,,,,,,,,,,,,,,,,,,', +',454,,,454,,,454,454,,,454,,,,,,454,,,,,,,,,454,,,,,454,454,454,454', +',454,454,454,454,,,,,454,454,,,,453,453,453,454,453,454,454,454,453', +'453,,,,453,,453,453,453,453,453,453,453,,,,,,453,453,453,453,453,453', +'453,,,453,,,,,,,453,,,453,453,453,453,453,453,453,453,,453,453,453,', +'453,453,453,453,453,,,,,,,,,,,,,,,,,,,,453,,,453,,,453,453,,,453,,,', +',,453,,,,,,,,,453,,,,,453,453,453,453,,453,453,453,453,,,,,453,453,', +',,452,452,452,453,452,453,453,453,452,452,,,,452,,452,452,452,452,452', +'452,452,,,,,,452,452,452,452,452,452,452,,,452,,,,,,,452,,,452,452,452', +'452,452,452,452,452,,452,452,452,,452,452,452,452,452,,,,,,,,,,,,,,', +',,,,,452,,,452,,,452,452,,,452,,,,,,452,,,,,,,,,452,,,,,452,452,452', +'452,,452,452,452,452,,,,,452,452,,,,606,606,606,452,606,452,452,452', +'606,606,,,,606,,606,606,606,606,606,606,606,,,,,,606,606,606,606,606', +'606,606,,,606,,,,,,,606,,,606,606,606,606,606,606,606,606,,606,606,606', +',606,606,606,606,606,,,,,,,,,,,,,,,,,,,,606,,,606,,,606,606,,,606,,', +',,,606,,,,,,,,,606,,,,,606,606,606,606,,606,606,606,606,,,,,606,606', +',,,327,327,327,606,327,606,606,606,327,327,,,,327,,327,327,327,327,327', +'327,327,,,,,,327,327,327,327,327,327,327,,,327,,,,,,,327,,,327,327,327', +'327,327,327,327,327,,327,327,327,,327,327,327,327,327,,,,,,,,,,,,,,', +',,,,,327,,,327,327,,327,327,,,327,,,,,,327,,,,,,,,,327,,,,,327,327,327', +'327,,327,327,327,327,,,,,327,327,,,,605,605,605,327,605,327,327,327', +'605,605,,,,605,,605,605,605,605,605,605,605,,,,,,605,605,605,605,605', +'605,605,,,605,,,,,,,605,,,605,605,605,605,605,605,605,605,,605,605,605', +',605,605,605,605,605,,,,,,,,,,,,,,,,,,,,605,,,605,,,605,605,,,605,,', +',,,605,,,,,,,,,605,,,,,605,605,605,605,,605,605,605,605,,,,,605,605', +',,,604,604,604,605,604,605,605,605,604,604,,,,604,,604,604,604,604,604', +'604,604,,,,,,604,604,604,604,604,604,604,,,604,,,,,,,604,,,604,604,604', +'604,604,604,604,604,604,604,604,604,,604,604,604,604,604,,,,,,,,,,,', +',,,,,,,,604,,,604,,,604,604,,,604,,,,604,,604,,,604,,,,,,604,,,,,604', +'604,604,604,,604,604,604,604,,,,,604,604,,,,603,603,603,604,603,604', +'604,604,603,603,,,,603,,603,603,603,603,603,603,603,,,,,,603,603,603', +'603,603,603,603,,,603,,,,,,,603,,,603,603,603,603,603,603,603,603,603', +'603,603,603,,603,603,603,603,603,,,,,,,,,,,,,,,,,,,,603,,,603,,,603', +'603,,,603,,603,,603,,603,,,603,,,,,,603,,,,,603,603,603,603,,603,603', +'603,603,,,,,603,603,,,,600,600,600,603,600,603,603,603,600,600,,,,600', +',600,600,600,600,600,600,600,,,,,,600,600,600,600,600,600,600,,,600', +',,,,,,600,,,600,600,600,600,600,600,600,600,,600,600,600,,600,600,600', +'600,600,,,,,,,,,,,,,,,,,,,,600,,,600,,,600,600,,,600,,,,,,600,,,,,,', +',,600,,,,,600,600,600,600,,600,600,600,600,,,,,600,600,,,,711,711,711', +'600,711,600,600,600,711,711,,,,711,,711,711,711,711,711,711,711,,,,', +',711,711,711,711,711,711,711,,,711,,,,,,,711,,,711,711,711,711,711,711', +'711,711,,711,711,711,,711,711,711,711,711,,,,,,,,,,,,,,,,,,,,711,,,711', +',,711,711,,,711,,,,,,711,,,,,,,,,711,,,,,711,711,711,711,,711,711,711', +'711,,,,,711,711,,,,,,,711,,711,711,711,599,599,599,599,599,,,,599,599', +',,,599,,599,599,599,599,599,599,599,,,,,,599,599,599,599,599,599,599', +',,599,,,,,,599,599,,599,599,599,599,599,599,599,599,599,,599,599,599', +',599,599,599,599,599,,,,,,,,,,,,,,,,,,,,599,,,599,,,599,599,,,599,,599', +',,,599,,,,,,,,,599,,,,,599,599,599,599,,599,599,599,599,,,,,599,599', +',,,596,596,596,599,596,599,599,599,596,596,,,,596,,596,596,596,596,596', +'596,596,,,,,,596,596,596,596,596,596,596,,,596,,,,,,,596,,,596,596,596', +'596,596,596,596,596,596,596,596,596,,596,596,596,596,596,,,,,,,,,,,', +',,,,,,,,596,,,596,,,596,596,,,596,,596,,596,,596,,,596,,,,,,596,,,,', +'596,596,596,596,,596,596,596,596,,,,,596,596,,,,595,595,595,596,595', +'596,596,596,595,595,,,,595,,595,595,595,595,595,595,595,,,,,,595,595', +'595,595,595,595,595,,,595,,,,,,,595,,,595,595,595,595,595,595,595,595', +',595,595,595,,595,595,595,595,595,,,,,,,,,,,,,,,,,,,,595,,,595,,,595', +'595,,,595,,,,,,595,,,,,,,,,595,,,,,595,595,595,595,,595,595,595,595', +',,,,595,595,,,,594,594,594,595,594,595,595,595,594,594,,,,594,,594,594', +'594,594,594,594,594,,,,,,594,594,594,594,594,594,594,,,594,,,,,,,594', +',,594,594,594,594,594,594,594,594,,594,594,594,,594,594,594,594,594', +',,,,,,,,,,,,,,,,,,,594,,,594,,,594,594,,,594,,594,,,,594,,,,,,,,,594', +',,,,594,594,594,594,,594,594,594,594,,,,,594,594,,,,42,42,42,594,42', +'594,594,594,42,42,,,,42,,42,42,42,42,42,42,42,,,,,,42,42,42,42,42,42', +'42,,,42,,,,,,,42,,,42,42,42,42,42,42,42,42,,42,42,42,,42,42,42,42,42', +',,,,,,,,,,,,,,,,,,,42,,,42,,,42,42,,,42,,,,,,42,,,,,,,,,42,,,,,42,42', +'42,42,,42,42,42,42,,,,,42,42,,,,,,,42,,42,42,42,9,9,9,9,9,9,9,9,9,9', +'9,9,9,9,9,9,9,9,9,9,9,9,9,9,,,,9,9,9,9,9,9,9,9,9,9,,,,,,9,9,9,9,9,9', +'9,9,9,,,9,,,,,,,,9,9,,9,9,9,9,9,9,9,,,9,9,,,,9,9,9,9,,,,,,,,,,,,,,9', +'9,,9,9,9,9,9,9,9,9,9,9,9,9,,,9,9,,,,,,,,,,,,,,9,8,8,8,8,8,8,8,8,8,8', +'8,8,8,8,8,8,8,8,8,8,8,8,8,8,,,,8,8,8,8,8,8,8,8,8,8,,,,,,8,8,8,8,8,8', +'8,8,8,8,,8,,,,,,,,8,8,,8,8,8,8,8,8,8,,,8,8,,,,8,8,8,8,,,,,,,,,,,,,,8', +'8,,8,8,8,8,8,8,8,8,8,8,8,8,,,8,8,,,,,,,,,,,,,,8,398,398,398,398,398', +'398,398,398,398,398,398,398,398,398,398,398,398,398,398,398,398,398', +'398,398,,,,398,398,398,398,398,398,398,398,398,398,,,,,,398,398,398', +'398,398,398,398,398,398,,,398,,,,,,,,398,398,,398,398,398,398,398,398', +'398,,,398,398,,,,398,398,398,398,,,,,,,,,,,,,,398,398,,398,398,398,398', +'398,398,398,398,398,398,398,398,,,398,398,,,,,,,,,,,,,,398,591,591,591', +'591,591,591,591,591,591,591,591,591,591,591,591,591,591,591,591,591', +'591,591,591,591,,,,591,591,591,591,591,591,591,591,591,591,,,,,,591', +'591,591,591,591,591,591,591,591,,,591,,,,,,,,591,591,,591,591,591,591', +'591,591,591,,,591,591,,,,591,591,591,591,,,,,,,,,,,,,,591,591,,591,591', +'591,591,591,591,591,591,591,591,591,591,,,591,591,,,,,,,,,,,,,,591,71', +'71,71,71,71,71,71,71,71,71,71,71,71,71,71,71,71,71,71,71,71,71,71,71', +',,,71,71,71,71,71,71,71,71,71,71,,,,,,71,71,71,71,71,71,71,71,71,71', +'71,71,,71,,,,,,71,71,,71,71,71,71,71,71,71,,,71,71,,,,71,71,71,71,,', +',,,71,,,,,,,,71,71,,71,71,71,71,71,71,71,71,71,71,71,71,,,71,723,723', +'723,723,723,723,723,723,723,723,723,723,723,723,723,723,723,723,723', +'723,723,723,723,723,,,,723,723,723,723,723,723,723,723,723,723,,,,,', +'723,723,723,723,723,723,723,723,723,,,723,,,,,,,,723,723,,723,723,723', +'723,723,723,723,,,723,723,,,,723,723,723,723,,,,,,,,,,,,,,723,723,,723', +'723,723,723,723,723,723,723,723,723,723,723,515,515,723,,515,,,,,,,', +'515,515,,515,515,515,515,515,515,515,,,515,515,,,,515,515,515,515,,', +',,,515,,,,,,,,515,515,,515,515,515,515,515,515,515,515,515,515,515,515', +'561,561,515,,561,,,,,,,,561,561,,561,561,561,561,561,561,561,,,561,561', +',,,561,561,561,561,,,,,,561,,,,,,,,561,561,,561,561,561,561,561,561', +'561,561,561,561,561,561,972,972,561,,972,,,,,,,,972,972,,972,972,972', +'972,972,972,972,,,972,972,,,,972,972,972,972,,,,,,972,,,,,,,,972,972', +',972,972,972,972,972,972,972,972,972,972,972,972,597,597,972,,597,,', +',,,,,597,597,,597,597,597,597,597,597,597,,,597,597,,,,597,597,597,597', +',,,,,597,,,,,,,,597,597,,597,597,597,597,597,597,597,597,597,597,597', +'597,598,598,597,,598,,,,,,,,598,598,,598,598,598,598,598,598,598,,,598', +'598,,,,598,598,598,598,,,,,,598,,,,,,,,598,598,,598,598,598,598,598', +'598,598,598,598,598,598,598,449,449,598,,449,,,,,,,,449,449,,449,449', +'449,449,449,449,449,,,449,449,,,,449,449,449,449,,,,,,449,,,,,,,,449', +'449,,449,449,449,449,449,449,449,449,449,449,449,449,448,448,449,,448', +',,,,,,,448,448,,448,448,448,448,448,448,448,,,448,448,,,,448,448,448', +'448,,,,,,448,,,,,,,,448,448,,448,448,448,448,448,448,448,448,448,448', +'448,448,263,263,448,,263,,,,,,,,263,263,,263,263,263,263,263,263,263', +',,263,263,,,,263,263,263,263,,,,,,,,,,,,,,263,263,,263,263,263,263,263', +'263,263,263,263,263,263,263,215,215,263,,215,,,,,,,,215,215,,215,215', +'215,215,215,215,215,,,215,215,,,,215,215,215,215,,,,,,215,,,,,,,,215', +'215,,215,215,215,215,215,215,215,215,215,215,215,215,216,216,215,,216', +',,,,,,,216,216,,216,216,216,216,216,216,216,,,216,216,,,,216,216,216', +'216,,,,,,216,,,,,,,,216,216,,216,216,216,216,216,216,216,216,216,216', +'216,216,976,976,216,,976,,,,,,,,976,976,,976,976,976,976,976,976,976', +',,976,976,,,,976,976,976,976,,,,,,976,,,,,,,,976,976,,976,976,976,976', +'976,976,976,976,976,976,976,976,560,560,976,,560,,,,,,,,560,560,,560', +'560,560,560,560,560,560,,,560,560,,,,560,560,560,560,,,,,,560,,,,,,', +',560,560,,560,560,560,560,560,560,560,560,560,560,560,560,554,554,560', +',554,,,,,,,,554,554,,554,554,554,554,554,554,554,,,554,554,,,,554,554', +'554,554,,,,,,554,,,,,,,,554,554,,554,554,554,554,554,554,554,554,554', +'554,554,554,525,525,554,,525,,,,,,,,525,525,,525,525,525,525,525,525', +'525,,,525,525,,,,525,525,525,525,,,,,,525,,,,,,,,525,525,,525,525,525', +'525,525,525,525,525,525,525,525,525,526,526,525,,526,,,,,,,,526,526', +',526,526,526,526,526,526,526,,,526,526,,,,526,526,526,526,,,,,,526,', +',,,,,,526,526,,526,526,526,526,526,526,526,526,526,526,526,526,553,553', +'526,,553,,,,,,,,553,553,,553,553,553,553,553,553,553,,,553,553,,,,553', +'553,553,553,,,,,,553,,,,,,,,553,553,,553,553,553,553,553,553,553,553', +'553,553,553,553,977,977,553,,977,,,,,,,,977,977,,977,977,977,977,977', +'977,977,,,977,977,,,,977,977,977,977,,,,,,977,,,,,,,,977,977,,977,977', +'977,977,977,977,977,977,977,977,977,977,516,516,977,,516,,,,,,,,516', +'516,,516,516,516,516,516,516,516,,,516,516,,,,516,516,516,516,,,,,,516', +',,,,,,,516,516,,516,516,516,516,516,516,516,516,516,516,516,516,,542', +'516,542,542,542,542,542,,721,,721,721,721,721,721,542,,,,,,,,721,,995', +',995,995,995,995,995,,,,,,542,542,,995,,,,,721,542,542,542,542,,,,542', +'721,721,721,721,,,,721,995,,993,,993,993,993,993,993,,,995,995,,,,995', +'993,,910,,910,910,910,910,910,,799,,799,799,799,799,799,910,,,,,993', +',,799,,,,,,993,993,993,993,,,,993,910,,,,,,,,799,910,910,910,910,,,', +'910,799,799,799,799,,,912,799,912,912,912,912,912,,801,,801,801,801', +'801,801,912,,,,,,,,801,,914,,914,914,914,914,914,,,,,,912,,,914,,,,', +'801,912,912,912,912,,,,912,801,801,801,801,,,,801,914,,722,,722,722', +'722,722,722,,,914,914,,,,914,722,,1014,,1014,1014,1014,1014,1014,940', +',940,940,940,940,940,,1014,,,,,722,,940,,,,,,,722,722,722,722,,,,722', +'1014,,,,,,,940,,,,1014,1014,,,,1014,,940,940,,,664,940,664,664,664,664', +'664,999,,999,999,999,999,999,938,664,938,938,938,938,938,,999,,,,,,', +'938,,,,,,,,664,,,,,,,999,,664,664,664,664,,938,,664,,999,999,,,,999', +',938,938,,,,938' ] + racc_action_check = arr = ::Array.new(25333, nil) + idx = 0 + clist.each do |str| + str.split(',', -1).each do |i| + arr[idx] = i.to_i unless i.empty? + idx += 1 + end + end + +racc_action_pointer = [ + 5068, 10, nil, -101, nil, 7356, 935, -53, 23276, 23148, + -32, nil, -42, 3, 156, 127, 580, 399, nil, -69, + 8535, 2408, 203, nil, 362, nil, 184, 984, 1713, 6030, + 6161, 6292, nil, 5488, 7086, 7217, nil, 113, 469, 403, + 198, 199, 23009, 14962, 15617, 168, 728, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 1305, nil, 17328, 17721, + 19972, 33, nil, 20103, 20365, nil, nil, 20496, 20774, 20905, + 21036, 23660, nil, nil, nil, nil, nil, nil, nil, 514, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 0, nil, nil, + 388, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 335, nil, 20635, nil, nil, nil, nil, 19841, 19710, + 19579, 18777, 18646, 3528, nil, -28, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 214, nil, 4648, 17459, + 17189, 17058, 16927, 16534, 16403, 24322, 24383, nil, nil, 15355, + 15224, 15093, nil, nil, 688, 162, 166, 296, 292, 260, + 327, nil, 8666, 3108, 328, 8404, 8273, 7749, 7487, 6955, + 6562, 14700, 14569, 14168, 13382, 12989, 12858, 12727, 12596, 12465, + 12334, 11679, 11548, 11286, 10631, 10369, 10238, 9452, 9714, 9845, + 10107, nil, nil, 24261, nil, nil, 325, 11941, 12072, nil, + nil, nil, nil, nil, nil, nil, 12203, nil, 2548, nil, + 289, 293, nil, 13513, 363, 13775, nil, nil, 13906, 14037, + nil, nil, 99, nil, 14438, 1213, 357, 334, 4228, 372, + 413, 375, 6423, 4508, 860, 863, 896, 454, 956, nil, + 424, 387, 199, nil, nil, nil, 439, 233, 400, 8011, + nil, 227, 484, 576, nil, 495, nil, 21691, 5768, 1145, + 433, nil, 394, 319, 485, 476, 429, 505, nil, nil, + 278, 35, 32, 15879, 16010, 81, 577, 460, 67, 25, + 1028, 542, 11, 575, nil, nil, 501, 611, 294, nil, + 1025, nil, 503, 17983, nil, nil, nil, 698, 696, 694, + 693, 625, 588, 584, 582, 555, nil, 445, nil, 18908, + nil, 423, 427, 319, 432, 494, -41, -45, 143, nil, + nil, nil, nil, nil, nil, nil, nil, 501, 23404, nil, + nil, nil, nil, 510, nil, nil, 494, 20234, 501, nil, + nil, 492, nil, 764, 140, 594, nil, nil, 1848, nil, + nil, nil, nil, nil, 1988, 508, nil, 513, 521, 308, + 256, 1195, nil, nil, nil, 498, 852, 566, nil, nil, + 1441, 1577, nil, nil, nil, -31, nil, 566, 24200, 24139, + 9321, 64, 21429, 21298, 21167, 3248, 4088, 681, 560, 601, + 604, 605, 627, 4648, 4508, 4788, 3808, 1526, 1662, 3528, + 1392, 3388, 3948, 3108, 3668, 2968, 941, 1033, 4228, 4368, + 2128, nil, 1116, nil, nil, nil, nil, 569, nil, nil, + nil, 573, nil, nil, 19448, nil, 19317, nil, 19186, nil, + 419, nil, nil, nil, 19047, 1327, 3388, 577, 579, nil, + nil, 592, 18507, 601, 18376, 23834, 24871, 692, 643, nil, + 18245, 604, nil, 18114, 17852, 24627, 24688, 2828, 17590, 733, + 735, 616, 658, nil, 16796, nil, nil, 16665, nil, nil, + nil, nil, 24933, 2268, 740, nil, 2548, 149, 121, 739, + 755, 16272, 16141, 24749, 24566, 41, nil, nil, 995, nil, + 24505, 23895, 15748, nil, nil, 234, 3948, 677, nil, -33, + nil, nil, nil, 1115, nil, nil, nil, 649, nil, nil, + 308, nil, 178, nil, nil, 640, nil, 666, nil, nil, + nil, 23532, nil, 668, 22878, 22747, 22616, 24017, 24078, 22485, + 22215, 367, 714, 22084, 21953, 21822, 21560, 713, nil, nil, + 9059, 8928, 715, nil, nil, nil, 211, 255, 250, 112, + 684, 684, 808, nil, 792, -23, nil, nil, 711, -57, + 828, nil, 706, nil, 756, 8142, nil, nil, 7880, nil, + 731, -80, 7618, 712, nil, 716, 277, 275, 767, 241, + 820, 775, 743, 14299, nil, 819, -14, 872, 13251, nil, + nil, nil, 343, nil, 25214, nil, 754, 757, nil, 763, + 765, 766, nil, nil, nil, nil, nil, nil, nil, nil, + 757, 1162, nil, nil, 11810, nil, nil, nil, 850, nil, + nil, nil, 852, nil, nil, 854, 362, nil, 902, nil, + nil, nil, nil, 908, nil, 98, 803, 27, 64, 26, + 68, 22346, 790, 765, nil, 809, 2968, 9583, nil, 932, + 3668, 24941, 25138, 23773, nil, nil, nil, nil, nil, nil, + 2828, nil, nil, nil, nil, nil, nil, nil, 810, 9976, + 816, 337, 325, 608, 720, nil, 2268, 10500, nil, 815, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 10762, 10893, 11024, 11155, 305, 11417, nil, -53, nil, nil, + 836, nil, nil, 915, nil, 4368, nil, nil, nil, nil, + nil, 818, 276, nil, nil, 959, nil, 2408, 853, 901, + nil, nil, nil, 36, 860, 1047, nil, nil, 182, 25022, + nil, 25082, nil, 14346, nil, 13120, nil, 1368, nil, 866, + 253, 871, nil, nil, nil, nil, 995, nil, 13644, 997, + 5628, 1848, nil, 9190, 1988, 71, 150, nil, 999, -73, + 2688, nil, 1007, 887, -75, nil, 891, 889, 304, nil, + nil, 14831, 5899, 2688, 4088, nil, 896, 902, nil, 903, + 904, 908, nil, 933, 918, 929, 927, 6693, nil, nil, + nil, nil, 4788, nil, nil, 102, 6824, nil, nil, nil, + nil, 985, 948, nil, nil, nil, 950, 961, nil, 968, + 971, nil, 973, nil, nil, 977, 1303, 975, 1109, nil, + nil, -1, nil, 1111, 1113, nil, 258, nil, nil, nil, + 1118, nil, nil, nil, 1044, nil, nil, 1044, nil, nil, + 25014, nil, 25074, nil, 25099, nil, nil, 1031, 818, 8797, + 612, 1090, nil, 3808, 106, 36, 665, 1094, 92, nil, + 3248, 2128, nil, nil, 1126, nil, 7264, nil, 25228, nil, + 25162, nil, nil, nil, nil, 383, 977, 1017, 5348, nil, + nil, nil, nil, nil, 5208, nil, 4928, 1021, nil, nil, + 1028, 1032, 1038, 1042, nil, 1043, nil, 453, nil, nil, + nil, 992, 23956, nil, 1171, 15486, 24444, 24810, 105, 1076, + 1181, 1058, 1061, 1063, 1065, 1066, 1308, 1068, 1298, 19, + 1201, 1203, nil, 24997, nil, 24958, nil, 18554, nil, 25221, + nil, nil, nil, 857, 1129, 1138, nil, 1103, 6, 26, + 33, 34, nil, nil, 25155, nil, nil, nil, nil, 827, + 1106, nil, nil, nil, 1107, 1108, 1109, 1111, nil, 42, + 1112, 1114, 6470, nil, nil, nil, nil, nil, -132, nil ] + +racc_action_default = [ + -3, -607, -1, -593, -4, -607, -7, -607, -607, -607, + -607, -29, -607, -607, -33, -607, -607, -281, -45, -595, + -607, -50, -52, -53, -54, -58, -258, -258, -258, -294, + -330, -331, -70, -11, -74, -82, -84, -607, -497, -498, + -607, -607, -607, -607, -607, -595, -237, -272, -273, -274, + -275, -276, -277, -278, -279, -280, -581, -283, -287, -606, + -571, -302, -304, -607, -607, -308, -311, -593, -607, -607, + -607, -607, -332, -333, -335, -336, -438, -439, -440, -441, + -442, -463, -445, -446, -465, -467, -450, -455, -459, -461, + -477, -465, -479, -481, -482, -483, -484, -579, -486, -487, + -580, -489, -490, -491, -492, -493, -494, -495, -496, -501, + -502, -607, -2, -594, -602, -603, -604, -6, -607, -607, + -607, -607, -607, -3, -17, -607, -113, -114, -115, -116, + -117, -118, -119, -120, -121, -125, -126, -127, -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, -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, -22, -122, -11, -607, + -607, -607, -607, -607, -248, -607, -607, -591, -592, -607, + -607, -595, -596, -49, -607, -497, -498, -607, -281, -607, + -607, -229, -607, -11, -607, -607, -607, -607, -607, -607, + -607, -607, -607, -607, -607, -607, -607, -607, -607, -607, + -607, -607, -607, -607, -607, -607, -607, -607, -607, -607, + -607, -402, -404, -607, -589, -590, -59, -248, -607, -301, + -408, -417, -419, -65, -414, -66, -595, -67, -238, -253, + -262, -262, -257, -607, -263, -607, -463, -573, -607, -607, + -68, -69, -593, -12, -607, -15, -607, -72, -11, -595, + -607, -75, -78, -11, -90, -91, -607, -607, -98, -294, + -297, -595, -607, -330, -331, -334, -415, -607, -80, -607, + -86, -291, -480, -607, -214, -215, -230, -607, -11, -285, + -595, -239, -599, -599, -607, -607, -599, -607, -303, -393, + -51, -607, -607, -607, -607, -593, -607, -594, -497, -498, + -607, -607, -281, -607, -346, -347, -108, -109, -607, -111, + -607, -281, -505, -607, -497, -498, -323, -113, -114, -155, + -156, -157, -173, -178, -185, -188, -325, -607, -569, -607, + -443, -607, -607, -607, -607, -607, -607, -607, -607, 1040, + -5, -605, -23, -24, -25, -26, -27, -607, -607, -19, + -20, -21, -123, -607, -30, -32, -268, -607, -607, -267, + -31, -607, -34, -607, -281, -42, -44, -196, -243, -263, + -46, -47, -35, -197, -243, -595, -249, -262, -262, -582, + -583, -258, -412, -584, -585, -583, -582, -258, -411, -413, + -584, -585, -41, -204, -48, -595, -300, -607, -607, -607, + -248, -291, -607, -607, -607, -205, -206, -207, -208, -209, + -210, -211, -212, -216, -217, -218, -219, -220, -221, -222, + -223, -224, -225, -226, -227, -228, -231, -232, -233, -234, + -595, -423, -258, -582, -583, -56, -60, -595, -259, -421, + -423, -595, -296, -254, -607, -255, -607, -260, -607, -264, + -607, -576, -578, -10, -594, -14, -3, -595, -71, -289, + -87, -76, -607, -595, -248, -607, -607, -97, -607, -480, + -607, -83, -88, -607, -607, -607, -607, -235, -607, -430, + -607, -595, -607, -240, -601, -600, -242, -601, -292, -293, + -572, -305, -529, -11, -337, -338, -11, -607, -607, -607, + -607, -607, -248, -607, -607, -291, -316, -108, -109, -110, + -607, -607, -248, -319, -503, -607, -11, -507, -327, -595, + -444, -464, -469, -607, -471, -447, -466, -607, -468, -449, + -607, -452, -607, -454, -457, -607, -458, -607, -478, -8, + -18, -607, -28, -271, -607, -607, -248, -607, -607, -607, + -607, -416, -607, -250, -252, -607, -607, -61, -247, -409, + -607, -607, -63, -410, -299, -597, -582, -583, -582, -583, + -595, -607, -607, -424, -55, -405, -421, -245, -607, -382, + -607, -295, -262, -261, -265, -607, -574, -575, -607, -13, + -607, -73, -607, -79, -85, -595, -582, -583, -246, -586, + -96, -607, -81, -607, -203, -213, -595, -606, -606, -284, + -286, -288, -599, -394, -529, -397, -568, -568, -512, -514, + -514, -514, -528, -530, -531, -532, -533, -534, -535, -536, + -537, -607, -539, -541, -543, -548, -550, -551, -553, -558, + -560, -561, -563, -564, -565, -607, -606, -339, -606, -309, + -340, -341, -312, -607, -315, -607, -595, -582, -583, -586, + -290, -607, -108, -109, -112, -595, -11, -607, -321, -607, + -11, -529, -529, -607, -570, -470, -473, -474, -475, -476, + -11, -448, -451, -453, -456, -460, -462, -124, -269, -607, + -595, -582, -583, -583, -582, -43, -244, -607, -598, -262, + -37, -199, -38, -200, -62, -39, -202, -40, -201, -64, + -607, -607, -607, -607, -416, -607, -403, -382, -407, -406, + -607, -418, -383, -595, -385, -11, -420, -256, -266, -577, + -16, -77, -416, -89, -298, -606, -344, -11, -431, -606, + -432, -433, -241, -607, -595, -607, -510, -511, -607, -607, + -521, -607, -524, -607, -526, -607, -348, -607, -350, -352, + -359, -595, -542, -552, -562, -566, -607, -342, -607, -607, + -11, -11, -314, -607, -11, -416, -607, -416, -607, -607, + -11, -324, -607, -595, -607, -328, -607, -270, -416, -36, + -198, -251, -607, -236, -11, -57, -568, -568, -364, -366, + -366, -366, -381, -607, -595, -387, -537, -545, -546, -556, + -422, -9, -11, -437, -345, -607, -607, -435, -395, -398, + -400, -607, -568, -549, -567, -513, -514, -514, -540, -514, + -514, -559, -514, -537, -554, -595, -607, -357, -607, -538, + -306, -607, -307, -607, -607, -265, -606, -317, -320, -504, + -607, -326, -506, -508, -507, -472, -425, -607, -362, -363, + -372, -374, -607, -377, -607, -379, -384, -607, -607, -607, + -544, -607, -436, -11, -497, -498, -607, -607, -281, -434, + -11, -11, -396, -509, -607, -517, -607, -519, -607, -522, + -607, -525, -527, -349, -351, -355, -607, -360, -11, -310, + -313, -426, -427, -428, -11, -322, -11, -568, -547, -365, + -366, -366, -366, -366, -557, -366, -386, -595, -389, -391, + -392, -555, -607, -291, -430, -248, -607, -607, -291, -607, + -607, -514, -514, -514, -514, -353, -607, -358, -607, -606, + -607, -607, -361, -607, -369, -607, -371, -607, -375, -607, + -378, -380, -388, -607, -290, -586, -429, -595, -582, -583, + -586, -290, -399, -401, -607, -515, -518, -520, -523, -607, + -356, -343, -318, -329, -366, -366, -366, -366, -390, -416, + -514, -354, -607, -367, -370, -373, -376, -516, -366, -368 ] + +clist = [ +'220,376,262,26,279,279,279,2,26,338,129,129,331,116,301,657,425,270', +'274,215,409,410,263,26,601,495,327,264,112,280,280,280,26,26,26,550', +'26,816,633,530,633,341,342,486,720,345,318,134,134,113,297,124,207,322', +'266,273,275,132,132,332,223,26,699,702,381,628,26,26,850,487,26,785', +'636,129,521,16,559,116,672,416,16,665,416,775,117,422,543,546,416,944', +'970,442,346,878,811,224,392,393,394,395,881,446,431,437,224,224,224', +'382,16,306,306,384,819,636,388,861,26,362,366,639,964,26,26,26,26,26', +'26,533,536,206,397,540,6,16,299,580,582,6,224,224,968,947,224,350,360', +'360,355,633,633,405,482,398,576,578,581,581,492,626,576,591,853,622', +'334,625,378,335,277,290,291,541,630,353,495,563,377,970,328,796,797', +'508,636,871,531,330,339,343,820,344,16,279,329,944,390,224,224,224,224', +'16,16,987,672,964,770,794,878,960,432,821,711,408,408,26,26,26,26,26', +'26,26,441,764,885,844,26,26,26,1028,954,448,716,830,315,315,566,881', +'878,567,26,723,703,1020,904,917,279,279,782,6,852,854,967,404,415,279', +'620,415,396,6,663,672,672,415,833,834,868,542,315,315,315,643,280,500', +'26,26,1031,793,930,652,280,719,714,26,931,481,489,16,224,413,224,224', +'413,224,490,767,518,878,413,224,224,26,951,522,789,26,116,270,865,825', +'26,274,16,515,952,532,380,511,827,297,645,503,383,1,297,547,548,385', +'386,614,525,387,725,519,1021,26,730,851,717,431,437,876,504,838,873', +'897,224,224,958,,26,26,,,733,224,733,553,706,116,,908,909,877,,879,', +',715,,26,627,,16,549,631,,16,39,568,777,306,16,39,264,956,26,933,754', +'633,,641,,759,,300,,644,306,,,781,740,507,129,,648,16,513,488,602,39', +'305,305,,660,648,491,,,597,636,224,224,,,608,,,279,505,828,613,,,832', +'39,,,,,134,224,432,648,590,349,365,365,365,,132,648,724,824,441,,26', +'224,,,792,,607,1006,621,,,416,612,,,992,790,961,,962,608,416,416,,750', +'752,416,416,,755,757,431,437,,39,,279,,,522,777,981,,39,39,315,,522', +',,,,,432,26,,26,624,,,640,,315,432,26,441,,,,,,,224,,279,441,,,26,,', +',,784,279,,,,900,,,432,,26,,,26,,705,432,1024,,26,441,700,700,,,,441', +',,26,403,,,26,,279,423,769,,718,,,443,16,,16,39,,,953,,306,432,224,', +'300,,129,,306,,,26,26,441,602,26,224,768,,1029,39,26,26,923,791,,26', +'26,,416,,16,839,,16,522,806,13,,602,224,,13,134,,,783,737,415,948,224', +'6,608,132,16,613,,,415,415,,,,415,415,,835,,,300,13,408,,,300,,,,,,991', +'39,,413,224,39,,16,,305,39,,,413,413,13,,,413,413,602,,826,,889,354', +'305,,829,602,,,,,,39,340,340,,,340,315,,,,,902,26,,315,306,,26,26,602', +',26,,129,,,306,,,745,,26,857,,,13,863,,,,867,281,281,281,13,13,,806', +'26,,887,,855,,,,340,340,340,340,,,,943,,,,,,,,333,336,855,,1007,26,', +',,,,,,224,415,,,26,16,224,,,16,891,,,,,,,,,16,,,,,,443,,423,,,,680,', +',,26,413,26,26,,,26,806,,806,,13,26,411,855,700,411,315,899,,,,411,903', +',,26,,315,16,420,421,,,,,13,,,444,445,16,648,,26,,,857,,,857,,857,,857', +',,39,,39,,654,,,,305,985,806,,,,,224,305,16,16,,,16,,696,,847,698,16', +',,,337,,,,,,,,39,13,16,39,,13,,,872,26,13,806,976,806,,920,26,26,,,16', +',680,39,926,,,,,,,1002,,279,26,13,,857,,857,26,857,26,857,806,,,751', +'753,,432,,756,758,,,39,441,,,,26,441,,,281,340,340,,,,602,,281,,,857', +'971,,680,680,16,,,,,565,,16,16,,,,,,,,,,305,,,569,,,,16,,,,305,,16,', +'16,,17,,,,957,17,,847,,847,,847,,,,856,,224,,15,315,,,,15,406,419,,', +'315,,,,17,308,308,,,,,,680,,680,,,,,,,,,15,,,836,,39,17,,,39,,,,,,,352', +'361,361,39,,840,,,,15,,,,,315,,,,751,753,758,756,847,,847,,847,13,847', +'13,,497,860,499,,,501,502,,,,,,,864,17,,,39,,,800,802,804,17,17,,,,', +'39,847,,,15,,13,656,,13,,,,15,15,,,893,894,,,896,,,856,,856,,,13,,,', +'39,39,,,39,,848,840,906,,39,,,,632,680,,,,,,,,,39,411,922,,874,13,,874', +',,,411,411,365,,,411,411,39,,,,925,17,,414,,,414,,662,,,,414,,,,593', +',,,15,,15,,,15,17,,856,,,15,,,,,,,,,,974,,,,15,,,979,980,,,,365,,,,39', +',,,,,,39,39,989,,,,,,990,,,,,749,,,,,39,,,,,17,39,,39,17,,,874,308,17', +'848,,848,13,848,,634,13,337,15,637,,,15,340,308,,13,15,,340,,935,937', +'17,939,941,,942,,849,,,,411,,,,,,,,,15,,,634,,,337,,911,913,915,,,,', +'880,,882,,13,419,,,38,,,,,38,,,13,,,,,,,,,848,,848,,848,,848,,,,,,,', +',,38,304,304,,,,,738,13,13,,,13,,,,634,337,13,,,,340,848,,38,,,1015', +'1016,1017,1018,13,,,348,364,364,364,,,,,,,,,,778,,13,779,,,929,,,,,', +',,,994,996,998,1000,,1001,,963,788,965,,,,,1037,,,38,,,,,,,,,38,38,', +'982,,983,,984,812,,,,17,,17,,,,,,308,,13,,,,,,308,13,13,15,,15,,,,,1033', +'1034,1035,1036,,,,,,13,,,,17,1039,13,17,13,,,,,,,1025,837,1026,,1027', +',,,15,,,15,17,,,,,,,729,,1030,,,38,,,,,,,15,,,,,,,,1038,,414,,,,17,', +',,38,,414,414,,,,414,414,,,15,,,,15,,,884,,,15,15,,,,15,15,,,,,,,,,895', +',,308,,,,,,,,,,,308,,,,337,,,,,,,38,,,,38,,,,304,38,,,,,,,,,,,,,,,,304', +',,,,,,,,38,,,,,,,,,,,,,,,,,,17,,,,17,,,,,,,,,,17,,,,,15,,,,15,,,,,,', +',414,,15,,,,,,,,,,,,,,,,,15,,,,,,,,,17,,,,,,,,,,,,17,,,,,,,15,,,,,,', +',,,,,15,,,,,,,,,,,,,,17,17,,,17,,,,,,17,,,,,,,,,15,15,,,15,17,,,,,15', +',,,,,,,361,,,,,17,15,,,928,,,,,,,,38,,38,,,,,15,304,,,,,,,,304,,,,,', +',,,,,,,,,,,,,,,,,38,,,38,,,361,,,,17,,,,,,,17,17,,,,,38,,,,,,15,,,,', +',17,15,15,,,,17,,17,,,,,,,,,,,15,,38,,,,15,,15,,,,,,,,,,,,,,,,,,,,,', +',,,,,,,,,,,,,,,304,,,,,,,,,,231,304,,,,,,,,278,278,278,,,,,,,,,,,324', +'325,326,,,,,,,,,,,,,,,278,278,,,,,,,,,,,,,,,,,,,,,,,,38,,,,38,,,,,,', +',,,38,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,38,,,,,,,,,,,,38,', +',,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,38,38,,,38,,,,,,38,,,,,,,,,,,278,418', +',38,424,278,,,,,424,,,,,,364,,,,,38,,231,,924,455,456,457,458,459,460', +'461,462,463,464,465,466,467,468,469,470,471,472,473,474,475,476,477', +'478,479,480,,,,,,,278,278,,,,,,,,278,,,,,,,278,,278,,364,278,278,,38', +',,,,,,38,38,,,,,,,,,,,,,,,,,38,,,,,,38,,38,,,527,,,,,,,,,,,,,,,,,,,', +',,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,278,,,,', +',,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,278,,424,424,424,,,,,,,,,,,,,', +',,,,,,,,,,,,,,,,,,,,,,,,,,278,,278,,278,,,,,,,,,,,,,,,,278,,,,,,,,,424', +'655,,,,,,,,,,278,,,278,,,,,,,,,,,,,,278,278,,,,,,,,,,278,,,,,,,,,,,', +',,,,,,,,,,,,,,,,,,,,278,424,278,,,,746,,,278,278,424,424,,,,424,424', +',,,,,,,,,,,,,,,,,,,,,,,278,,,278,,,,,,,,,,,,,,,,,,,,278,,,,,,,,,,,,', +',,,,,,,,,,,,,278,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,', +',,,278,,,,,,,,424,,,,,,,,,,,,,424,424,424,424,,843,,,,,,,,,,,,,,,,,', +',,,,,,,,,,,,,,,,,,,,,,278,,,,,,,,,,,,,,,,,,278,,,,,,,,,,,,,,,,,,278', +'424,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,', +',,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,', +'278' ] + racc_goto_table = arr = ::Array.new(3011, nil) + idx = 0 + clist.each do |str| + str.split(',', -1).each do |i| + arr[idx] = i.to_i unless i.empty? + idx += 1 + end + end + +clist = [ +'33,58,144,43,35,35,35,2,43,89,59,59,70,99,51,10,29,74,74,31,22,22,38', +'43,30,76,33,31,4,71,71,71,43,43,43,95,43,93,77,8,77,17,17,41,101,17', +'52,63,63,6,47,15,15,66,40,40,40,62,62,71,20,43,94,94,161,42,43,43,131', +'29,43,11,188,59,53,28,56,99,173,18,28,143,18,133,5,26,92,92,18,119,138', +'26,4,179,121,28,17,17,17,17,184,49,39,39,28,28,28,162,28,28,28,164,11', +'188,162,12,43,57,57,14,185,43,43,43,43,43,43,72,72,16,2,72,7,28,48,165', +'165,7,28,28,137,122,28,28,28,28,19,77,77,23,39,25,166,166,166,166,49', +'44,166,64,135,147,69,75,87,88,46,46,46,91,147,96,76,98,102,138,103,126', +'126,49,188,135,104,105,106,107,108,109,28,35,7,119,5,28,28,28,28,28', +'28,122,173,185,42,143,179,131,74,110,111,71,71,43,43,43,43,43,43,43', +'59,30,121,133,43,43,43,137,112,31,113,114,67,67,115,184,179,116,43,117', +'95,122,118,135,35,35,30,7,123,129,136,20,20,35,29,20,7,7,139,173,173', +'20,143,143,140,141,67,67,67,53,71,161,43,43,122,142,145,53,71,8,56,43', +'146,148,150,28,28,28,28,28,28,28,151,154,33,179,28,28,28,43,155,51,156', +'43,99,74,157,30,43,74,28,31,11,33,160,52,30,47,29,4,163,1,47,17,17,167', +'168,49,31,169,170,66,93,43,171,132,172,39,39,177,6,30,181,94,28,28,182', +',43,43,,,166,28,166,31,29,99,,126,126,132,,132,,,29,,43,49,,28,4,49', +',28,55,38,76,28,28,55,31,101,43,126,41,77,,49,,41,,9,,49,28,,,53,29', +'48,59,,39,28,48,46,33,55,55,55,,49,39,46,,,31,188,28,28,,,74,,,35,7', +'8,74,,,8,55,,,,,63,28,74,39,15,55,55,55,55,,62,39,49,92,59,,43,28,,', +'72,,40,10,33,,,18,40,,,126,22,132,,132,74,18,18,,26,26,18,18,,26,26', +'39,39,,55,,35,,,51,76,132,,55,55,67,,51,,,,,,74,43,,43,40,,,2,,67,74', +'43,59,,,,,,,28,,35,59,,,43,,,,,49,35,,,,8,,,74,,43,,,43,,71,74,132,', +'43,59,99,99,,,,59,,,43,9,,,43,,35,65,89,,99,,,65,28,,28,55,,,95,,28', +'74,28,,9,,59,,28,,,43,43,59,33,43,28,144,,30,55,43,43,92,70,,43,43,', +'18,,28,26,,28,51,120,21,,33,28,,21,63,,,51,15,20,92,28,7,74,62,28,74', +',,20,20,,,,20,20,,58,,,9,21,71,,,9,,,,,,8,55,,28,28,55,,28,,55,55,,', +'28,28,21,,,28,28,33,,17,,49,21,55,,17,33,,,,,,55,24,24,,,24,67,,,,,49', +'43,,67,28,,43,43,33,,43,,59,,,28,,,7,,43,180,,,21,70,,,,70,73,73,73', +'21,21,,120,43,,120,,33,,,,24,24,24,24,,,,49,,,,,,,,73,73,33,,29,43,', +',,,,,,28,20,,,43,28,28,,,28,17,,,,,,,,,28,,,,,,65,,65,,,,178,,,,43,28', +'43,43,,,43,120,,120,,21,43,21,33,99,21,67,99,,,,21,99,,,43,,67,28,24', +'24,,,,,21,,,24,24,28,39,,43,,,180,,,180,,180,,180,,,55,,55,,65,,,,55', +'120,120,,,,,28,55,28,28,,,28,,9,,125,9,28,,,,68,,,,,,,,55,21,28,55,', +'21,,,125,43,21,120,31,120,,28,43,43,,,28,,178,55,28,,,,,,,33,,35,43', +'21,,180,,180,43,180,43,180,120,,,65,65,,74,,65,65,,,55,59,,,,43,59,', +',73,24,24,,,,33,,73,,,180,28,,178,178,28,,,,,24,,28,28,,,,,,,,,,55,', +',24,,,,28,,,,55,,28,,28,,32,,,,125,32,,125,,125,,125,,,,178,,28,,27', +'67,,,,27,68,68,,,67,,,,32,32,32,,,,,,178,,178,,,,,,,,,27,,,9,,55,32', +',,55,,,,,,,32,32,32,55,,65,,,,27,,,,,67,,,,65,65,65,65,125,,125,,125', +'21,125,21,,68,9,68,,,68,68,,,,,,,9,32,,,55,,,176,176,176,32,32,,,,,55', +'125,,,27,,21,24,,21,,,,27,27,,,9,9,,,9,,,178,,178,,,21,,,,55,55,,,55', +',127,65,9,,55,,,,73,178,,,,,,,,,55,21,9,,127,21,,127,,,,21,21,55,,,21', +'21,55,,,,55,32,,32,,,32,,73,,,,32,,,,68,,,,27,,27,,,27,32,,178,,,27', +',,,,,,,,,9,,,,27,,,9,9,,,,55,,,,55,,,,,,,55,55,9,,,,,,9,,,,,73,,,,,55', +',,,,32,55,,55,32,,,127,32,32,127,,127,21,127,,68,21,68,27,68,,,27,24', +'32,,21,27,,24,,176,176,32,176,176,,176,,130,,,,21,,,,,,,,,27,,,68,,', +'68,,128,128,128,,,,,130,,130,,21,68,,,54,,,,,54,,,21,,,,,,,,,127,,127', +',127,,127,,,,,,,,,,54,54,54,,,,,68,21,21,,,21,,,,68,68,21,,,,24,127', +',54,,,176,176,176,176,21,,,54,54,54,54,,,,,,,,,,68,,21,68,,,21,,,,,', +',,,128,128,128,128,,128,,130,68,130,,,,,176,,,54,,,,,,,,,54,54,,130', +',130,,130,68,,,,32,,32,,,,,,32,,21,,,,,,32,21,21,27,,27,,,,,128,128', +'128,128,,,,,,21,,,,32,128,21,32,21,,,,,,,130,68,130,,130,,,,27,,,27', +'32,,,,,,,32,,130,,,54,,,,,,,27,,,,,,,,130,,32,,,,32,,,,54,,32,32,,,', +'32,32,,,27,,,,27,,,68,,,27,27,,,,27,27,,,,,,,,,68,,,32,,,,,,,,,,,32', +',,,68,,,,,,,54,,,,54,,,,54,54,,,,,,,,,,,,,,,,54,,,,,,,,,54,,,,,,,,,', +',,,,,,,,32,,,,32,,,,,,,,,,32,,,,,27,,,,27,,,,,,,,32,,27,,,,,,,,,,,,', +',,,,27,,,,,,,,,32,,,,,,,,,,,,32,,,,,,,27,,,,,,,,,,,,27,,,,,,,,,,,,,', +'32,32,,,32,,,,,,32,,,,,,,,,27,27,,,27,32,,,,,27,,,,,,,,32,,,,,32,27', +',,32,,,,,,,,54,,54,,,,,27,54,,,,,,,,54,,,,,,,,,,,,,,,,,,,,,,,54,,,54', +',,32,,,,32,,,,,,,32,32,,,,,54,,,,,,27,,,,,,32,27,27,,,,32,,32,,,,,,', +',,,,27,,54,,,,27,,27,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,54,,,,,,,,', +',34,54,,,,,,,,34,34,34,,,,,,,,,,,34,34,34,,,,,,,,,,,,,,,34,34,,,,,,', +',,,,,,,,,,,,,,,,,54,,,,54,,,,,,,,,,54,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,', +',,,,,,,,,,,,,,54,,,,,,,,,,,,54,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,54,54', +',,54,,,,,,54,,,,,,,,,,,34,34,,54,34,34,,,,,34,,,,,,54,,,,,54,,34,,54', +'34,34,34,34,34,34,34,34,34,34,34,34,34,34,34,34,34,34,34,34,34,34,34', +'34,34,34,,,,,,,34,34,,,,,,,,34,,,,,,,34,,34,,54,34,34,,54,,,,,,,54,54', +',,,,,,,,,,,,,,,,54,,,,,,54,,54,,,34,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,', +',,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,34,,,,,,,,,,,,,,,,,,', +',,,,,,,,,,,,,,,,,,,,,,,,34,,34,34,34,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,', +',,,,,,,,34,,34,,34,,,,,,,,,,,,,,,,34,,,,,,,,,34,34,,,,,,,,,,34,,,34', +',,,,,,,,,,,,,34,34,,,,,,,,,,34,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,34,34', +'34,,,,34,,,34,34,34,34,,,,34,34,,,,,,,,,,,,,,,,,,,,,,,,34,,,34,,,,,', +',,,,,,,,,,,,,,34,,,,,,,,,,,,,,,,,,,,,,,,,,34,,,,,,,,,,,,,,,,,,,,,,,', +',,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,34,,,,,,,,34,,,,,,,,,,,,,34,34,34,34', +',34,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,34,,,,,,,,,,,,,,,,,,34,,', +',,,,,,,,,,,,,,,34,34,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,', +',,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,', +',,,,,,,,,,,,,,,,,34' ] + racc_goto_check = arr = ::Array.new(3011, nil) + idx = 0 + clist.each do |str| + str.split(',', -1).each do |i| + arr[idx] = i.to_i unless i.empty? + idx += 1 + end + end + +racc_goto_pointer = [ + nil, 319, 7, nil, 25, 79, 46, 132, -289, 358, + -514, -586, -670, nil, -385, 43, 120, -22, -131, 78, + 40, 624, -189, -60, 640, 27, -128, 1052, 75, -198, + -401, 3, 1033, -19, 2035, -25, nil, nil, -2, -113, + 28, -223, -424, 3, -328, nil, 137, 17, 101, -120, + nil, -20, 11, -245, 1403, 374, -282, 48, -70, 2, + nil, nil, 49, 39, -243, 359, 12, 196, 849, 103, + -47, 0, -205, 714, -9, -319, -256, -456, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 93, 105, -52, + nil, -170, -255, -659, -485, -311, 103, nil, -189, 10, + nil, -523, 103, 119, -147, 125, 122, 120, -513, 121, + -495, -348, -671, -335, -489, -134, -141, -331, -595, -797, + -58, -587, -747, -527, nil, 130, -489, 427, 539, -526, + 594, -705, -440, -546, nil, -613, -670, -778, -828, -286, + -531, -76, -390, -461, -20, -595, -590, -320, 20, nil, + 11, 18, nil, nil, -332, -598, -358, -485, nil, nil, + 233, -17, 23, 233, 25, -249, -230, 236, 236, 238, + -245, -242, -230, -464, nil, nil, 483, -462, 275, -706, + -39, -455, -563, nil, -701, -792, nil, nil, -424 ] + +racc_goto_default = [ + nil, nil, nil, 3, nil, 4, 347, 295, nil, 529, + nil, 817, nil, 292, 293, nil, nil, nil, 11, 12, + 18, 229, nil, nil, 14, nil, 412, 230, 323, nil, + nil, 561, 228, 447, 21, 22, 23, 24, nil, 651, + nil, nil, nil, 312, nil, 25, 426, 32, nil, nil, + 34, 37, 36, nil, 225, 226, 359, nil, 131, 434, + 130, 133, 77, 78, nil, 417, 92, 46, 284, nil, + 786, 427, nil, 428, 439, 609, 493, 282, 268, 47, + 48, 49, 50, 51, 52, 53, 54, 55, nil, 269, + 61, nil, nil, nil, nil, nil, nil, 69, nil, 544, + 70, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 808, + 679, nil, 809, 959, 846, 667, nil, 668, nil, nil, + 669, nil, 671, nil, 772, nil, nil, nil, 677, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 438, + nil, nil, 629, 623, nil, nil, nil, nil, 76, 79, + 80, nil, nil, nil, nil, nil, 571, nil, nil, nil, + nil, nil, nil, 875, 722, 666, nil, 670, 883, 682, + 684, 685, 858, 688, 689, 859, 692, 695, 287 ] + +racc_reduce_table = [ + 0, 0, :racc_error, + 1, 146, :_reduce_none, + 2, 147, :_reduce_2, + 0, 148, :_reduce_3, + 1, 148, :_reduce_4, + 3, 148, :_reduce_5, + 2, 148, :_reduce_6, + 1, 150, :_reduce_none, + 4, 150, :_reduce_8, + 4, 153, :_reduce_9, + 2, 154, :_reduce_10, + 0, 158, :_reduce_11, + 1, 158, :_reduce_12, + 3, 158, :_reduce_13, + 2, 158, :_reduce_14, + 1, 159, :_reduce_none, + 4, 159, :_reduce_16, + 0, 170, :_reduce_17, + 4, 152, :_reduce_18, + 3, 152, :_reduce_19, + 3, 152, :_reduce_20, + 3, 152, :_reduce_21, + 2, 152, :_reduce_22, + 3, 152, :_reduce_23, + 3, 152, :_reduce_24, + 3, 152, :_reduce_25, + 3, 152, :_reduce_26, + 3, 152, :_reduce_27, + 4, 152, :_reduce_28, + 1, 152, :_reduce_none, + 3, 152, :_reduce_30, + 3, 152, :_reduce_31, + 3, 152, :_reduce_32, + 1, 152, :_reduce_none, + 3, 163, :_reduce_34, + 3, 163, :_reduce_35, + 6, 163, :_reduce_36, + 5, 163, :_reduce_37, + 5, 163, :_reduce_38, + 5, 163, :_reduce_39, + 5, 163, :_reduce_40, + 3, 163, :_reduce_41, + 1, 171, :_reduce_none, + 3, 171, :_reduce_43, + 1, 171, :_reduce_none, + 1, 169, :_reduce_none, + 3, 169, :_reduce_46, + 3, 169, :_reduce_47, + 3, 169, :_reduce_48, + 2, 169, :_reduce_49, + 1, 169, :_reduce_none, + 1, 162, :_reduce_none, + 1, 165, :_reduce_none, + 1, 165, :_reduce_none, + 1, 181, :_reduce_none, + 4, 181, :_reduce_55, + 0, 189, :_reduce_56, + 4, 186, :_reduce_57, + 1, 188, :_reduce_none, + 2, 180, :_reduce_59, + 3, 180, :_reduce_60, + 4, 180, :_reduce_61, + 5, 180, :_reduce_62, + 4, 180, :_reduce_63, + 5, 180, :_reduce_64, + 2, 180, :_reduce_65, + 2, 180, :_reduce_66, + 2, 180, :_reduce_67, + 2, 180, :_reduce_68, + 2, 180, :_reduce_69, + 1, 164, :_reduce_70, + 3, 164, :_reduce_71, + 1, 193, :_reduce_72, + 3, 193, :_reduce_73, + 1, 192, :_reduce_none, + 2, 192, :_reduce_75, + 3, 192, :_reduce_76, + 5, 192, :_reduce_77, + 2, 192, :_reduce_78, + 4, 192, :_reduce_79, + 2, 192, :_reduce_80, + 4, 192, :_reduce_81, + 1, 192, :_reduce_82, + 3, 192, :_reduce_83, + 1, 196, :_reduce_none, + 3, 196, :_reduce_85, + 2, 195, :_reduce_86, + 3, 195, :_reduce_87, + 1, 198, :_reduce_88, + 3, 198, :_reduce_89, + 1, 197, :_reduce_90, + 1, 197, :_reduce_91, + 4, 197, :_reduce_92, + 3, 197, :_reduce_93, + 3, 197, :_reduce_94, + 3, 197, :_reduce_95, + 3, 197, :_reduce_96, + 2, 197, :_reduce_97, + 1, 197, :_reduce_98, + 1, 166, :_reduce_99, + 1, 166, :_reduce_100, + 4, 166, :_reduce_101, + 3, 166, :_reduce_102, + 3, 166, :_reduce_103, + 3, 166, :_reduce_104, + 3, 166, :_reduce_105, + 2, 166, :_reduce_106, + 1, 166, :_reduce_107, + 1, 201, :_reduce_108, + 1, 201, :_reduce_none, + 2, 202, :_reduce_110, + 1, 202, :_reduce_111, + 3, 202, :_reduce_112, + 1, 203, :_reduce_none, + 1, 203, :_reduce_none, + 1, 203, :_reduce_none, + 1, 203, :_reduce_none, + 1, 203, :_reduce_none, + 1, 206, :_reduce_118, + 1, 206, :_reduce_none, + 1, 160, :_reduce_none, + 1, 160, :_reduce_none, + 1, 161, :_reduce_122, + 0, 209, :_reduce_123, + 4, 161, :_reduce_124, + 1, 204, :_reduce_none, + 1, 204, :_reduce_none, + 1, 204, :_reduce_none, + 1, 204, :_reduce_none, + 1, 204, :_reduce_none, + 1, 204, :_reduce_none, + 1, 204, :_reduce_none, + 1, 204, :_reduce_none, + 1, 204, :_reduce_none, + 1, 204, :_reduce_none, + 1, 204, :_reduce_none, + 1, 204, :_reduce_none, + 1, 204, :_reduce_none, + 1, 204, :_reduce_none, + 1, 204, :_reduce_none, + 1, 204, :_reduce_none, + 1, 204, :_reduce_none, + 1, 204, :_reduce_none, + 1, 204, :_reduce_none, + 1, 204, :_reduce_none, + 1, 204, :_reduce_none, + 1, 204, :_reduce_none, + 1, 204, :_reduce_none, + 1, 204, :_reduce_none, + 1, 204, :_reduce_none, + 1, 204, :_reduce_none, + 1, 204, :_reduce_none, + 1, 204, :_reduce_none, + 1, 204, :_reduce_none, + 1, 204, :_reduce_none, + 1, 205, :_reduce_none, + 1, 205, :_reduce_none, + 1, 205, :_reduce_none, + 1, 205, :_reduce_none, + 1, 205, :_reduce_none, + 1, 205, :_reduce_none, + 1, 205, :_reduce_none, + 1, 205, :_reduce_none, + 1, 205, :_reduce_none, + 1, 205, :_reduce_none, + 1, 205, :_reduce_none, + 1, 205, :_reduce_none, + 1, 205, :_reduce_none, + 1, 205, :_reduce_none, + 1, 205, :_reduce_none, + 1, 205, :_reduce_none, + 1, 205, :_reduce_none, + 1, 205, :_reduce_none, + 1, 205, :_reduce_none, + 1, 205, :_reduce_none, + 1, 205, :_reduce_none, + 1, 205, :_reduce_none, + 1, 205, :_reduce_none, + 1, 205, :_reduce_none, + 1, 205, :_reduce_none, + 1, 205, :_reduce_none, + 1, 205, :_reduce_none, + 1, 205, :_reduce_none, + 1, 205, :_reduce_none, + 1, 205, :_reduce_none, + 1, 205, :_reduce_none, + 1, 205, :_reduce_none, + 1, 205, :_reduce_none, + 1, 205, :_reduce_none, + 1, 205, :_reduce_none, + 1, 205, :_reduce_none, + 1, 205, :_reduce_none, + 1, 205, :_reduce_none, + 1, 205, :_reduce_none, + 1, 205, :_reduce_none, + 1, 205, :_reduce_none, + 3, 179, :_reduce_196, + 3, 179, :_reduce_197, + 6, 179, :_reduce_198, + 5, 179, :_reduce_199, + 5, 179, :_reduce_200, + 5, 179, :_reduce_201, + 5, 179, :_reduce_202, + 4, 179, :_reduce_203, + 3, 179, :_reduce_204, + 3, 179, :_reduce_205, + 3, 179, :_reduce_206, + 3, 179, :_reduce_207, + 3, 179, :_reduce_208, + 3, 179, :_reduce_209, + 3, 179, :_reduce_210, + 3, 179, :_reduce_211, + 3, 179, :_reduce_212, + 4, 179, :_reduce_213, + 2, 179, :_reduce_214, + 2, 179, :_reduce_215, + 3, 179, :_reduce_216, + 3, 179, :_reduce_217, + 3, 179, :_reduce_218, + 3, 179, :_reduce_219, + 3, 179, :_reduce_220, + 3, 179, :_reduce_221, + 3, 179, :_reduce_222, + 3, 179, :_reduce_223, + 3, 179, :_reduce_224, + 3, 179, :_reduce_225, + 3, 179, :_reduce_226, + 3, 179, :_reduce_227, + 3, 179, :_reduce_228, + 2, 179, :_reduce_229, + 2, 179, :_reduce_230, + 3, 179, :_reduce_231, + 3, 179, :_reduce_232, + 3, 179, :_reduce_233, + 3, 179, :_reduce_234, + 3, 179, :_reduce_235, + 6, 179, :_reduce_236, + 1, 179, :_reduce_none, + 1, 213, :_reduce_none, + 1, 214, :_reduce_none, + 2, 214, :_reduce_none, + 4, 214, :_reduce_241, + 2, 214, :_reduce_242, + 1, 210, :_reduce_none, + 3, 210, :_reduce_244, + 3, 219, :_reduce_245, + 0, 220, :_reduce_246, + 1, 220, :_reduce_none, + 0, 174, :_reduce_248, + 1, 174, :_reduce_none, + 2, 174, :_reduce_none, + 4, 174, :_reduce_251, + 2, 174, :_reduce_252, + 1, 191, :_reduce_253, + 2, 191, :_reduce_254, + 2, 191, :_reduce_255, + 4, 191, :_reduce_256, + 1, 191, :_reduce_257, + 0, 223, :_reduce_258, + 2, 185, :_reduce_259, + 2, 222, :_reduce_260, + 2, 221, :_reduce_261, + 0, 221, :_reduce_262, + 1, 216, :_reduce_263, + 2, 216, :_reduce_264, + 3, 216, :_reduce_265, + 4, 216, :_reduce_266, + 1, 168, :_reduce_267, + 1, 168, :_reduce_none, + 3, 167, :_reduce_269, + 4, 167, :_reduce_270, + 2, 167, :_reduce_271, + 1, 212, :_reduce_none, + 1, 212, :_reduce_none, + 1, 212, :_reduce_none, + 1, 212, :_reduce_none, + 1, 212, :_reduce_none, + 1, 212, :_reduce_none, + 1, 212, :_reduce_none, + 1, 212, :_reduce_none, + 1, 212, :_reduce_none, + 1, 212, :_reduce_none, + 1, 212, :_reduce_282, + 0, 248, :_reduce_283, + 4, 212, :_reduce_284, + 0, 249, :_reduce_285, + 4, 212, :_reduce_286, + 0, 250, :_reduce_287, + 4, 212, :_reduce_288, + 3, 212, :_reduce_289, + 3, 212, :_reduce_290, + 2, 212, :_reduce_291, + 3, 212, :_reduce_292, + 3, 212, :_reduce_293, + 1, 212, :_reduce_294, + 4, 212, :_reduce_295, + 3, 212, :_reduce_296, + 1, 212, :_reduce_297, + 5, 212, :_reduce_298, + 4, 212, :_reduce_299, + 3, 212, :_reduce_300, + 2, 212, :_reduce_301, + 1, 212, :_reduce_none, + 2, 212, :_reduce_303, + 0, 251, :_reduce_304, + 3, 212, :_reduce_305, + 6, 212, :_reduce_306, + 6, 212, :_reduce_307, + 0, 252, :_reduce_308, + 0, 253, :_reduce_309, + 7, 212, :_reduce_310, + 0, 254, :_reduce_311, + 0, 255, :_reduce_312, + 7, 212, :_reduce_313, + 5, 212, :_reduce_314, + 4, 212, :_reduce_315, + 0, 256, :_reduce_316, + 0, 257, :_reduce_317, + 9, 212, :_reduce_318, + 0, 258, :_reduce_319, + 6, 212, :_reduce_320, + 0, 259, :_reduce_321, + 7, 212, :_reduce_322, + 0, 260, :_reduce_323, + 5, 212, :_reduce_324, + 0, 261, :_reduce_325, + 6, 212, :_reduce_326, + 0, 262, :_reduce_327, + 0, 263, :_reduce_328, + 9, 212, :_reduce_329, + 1, 212, :_reduce_330, + 1, 212, :_reduce_331, + 1, 212, :_reduce_332, + 1, 212, :_reduce_333, + 1, 173, :_reduce_none, + 1, 242, :_reduce_335, + 1, 245, :_reduce_336, + 1, 237, :_reduce_none, + 1, 237, :_reduce_none, + 2, 237, :_reduce_339, + 1, 239, :_reduce_none, + 1, 239, :_reduce_none, + 1, 238, :_reduce_none, + 5, 238, :_reduce_343, + 1, 156, :_reduce_none, + 2, 156, :_reduce_345, + 1, 241, :_reduce_none, + 1, 241, :_reduce_none, + 1, 264, :_reduce_348, + 3, 264, :_reduce_349, + 1, 267, :_reduce_350, + 3, 267, :_reduce_351, + 1, 266, :_reduce_none, + 4, 266, :_reduce_353, + 6, 266, :_reduce_354, + 3, 266, :_reduce_355, + 5, 266, :_reduce_356, + 2, 266, :_reduce_357, + 4, 266, :_reduce_358, + 1, 266, :_reduce_359, + 3, 266, :_reduce_360, + 4, 268, :_reduce_361, + 2, 268, :_reduce_362, + 2, 268, :_reduce_363, + 1, 268, :_reduce_364, + 2, 273, :_reduce_365, + 0, 273, :_reduce_366, + 6, 274, :_reduce_367, + 8, 274, :_reduce_368, + 4, 274, :_reduce_369, + 6, 274, :_reduce_370, + 4, 274, :_reduce_371, + 2, 274, :_reduce_none, + 6, 274, :_reduce_373, + 2, 274, :_reduce_374, + 4, 274, :_reduce_375, + 6, 274, :_reduce_376, + 2, 274, :_reduce_377, + 4, 274, :_reduce_378, + 2, 274, :_reduce_379, + 4, 274, :_reduce_380, + 1, 274, :_reduce_none, + 0, 278, :_reduce_382, + 1, 278, :_reduce_383, + 3, 279, :_reduce_384, + 1, 279, :_reduce_385, + 4, 279, :_reduce_386, + 1, 280, :_reduce_387, + 4, 280, :_reduce_388, + 1, 281, :_reduce_389, + 3, 281, :_reduce_390, + 1, 282, :_reduce_391, + 1, 282, :_reduce_none, + 0, 286, :_reduce_393, + 0, 287, :_reduce_394, + 4, 236, :_reduce_395, + 4, 284, :_reduce_396, + 1, 284, :_reduce_397, + 0, 290, :_reduce_398, + 4, 285, :_reduce_399, + 0, 291, :_reduce_400, + 4, 285, :_reduce_401, + 0, 293, :_reduce_402, + 4, 289, :_reduce_403, + 2, 182, :_reduce_404, + 4, 182, :_reduce_405, + 5, 182, :_reduce_406, + 5, 182, :_reduce_407, + 2, 235, :_reduce_408, + 4, 235, :_reduce_409, + 4, 235, :_reduce_410, + 3, 235, :_reduce_411, + 3, 235, :_reduce_412, + 3, 235, :_reduce_413, + 2, 235, :_reduce_414, + 1, 235, :_reduce_415, + 4, 235, :_reduce_416, + 0, 295, :_reduce_417, + 4, 234, :_reduce_418, + 0, 296, :_reduce_419, + 4, 234, :_reduce_420, + 0, 297, :_reduce_421, + 3, 187, :_reduce_422, + 0, 298, :_reduce_423, + 0, 299, :_reduce_424, + 4, 292, :_reduce_425, + 5, 240, :_reduce_426, + 1, 300, :_reduce_427, + 1, 300, :_reduce_none, + 6, 155, :_reduce_429, + 0, 155, :_reduce_430, + 1, 301, :_reduce_431, + 1, 301, :_reduce_none, + 1, 301, :_reduce_none, + 2, 302, :_reduce_434, + 1, 302, :_reduce_none, + 2, 157, :_reduce_436, + 1, 157, :_reduce_none, + 1, 224, :_reduce_none, + 1, 224, :_reduce_none, + 1, 224, :_reduce_none, + 1, 225, :_reduce_441, + 1, 304, :_reduce_442, + 2, 304, :_reduce_443, + 3, 305, :_reduce_444, + 1, 305, :_reduce_445, + 1, 305, :_reduce_446, + 3, 226, :_reduce_447, + 4, 227, :_reduce_448, + 3, 228, :_reduce_449, + 0, 309, :_reduce_450, + 3, 309, :_reduce_451, + 1, 310, :_reduce_452, + 2, 310, :_reduce_453, + 3, 230, :_reduce_454, + 0, 312, :_reduce_455, + 3, 312, :_reduce_456, + 3, 229, :_reduce_457, + 3, 231, :_reduce_458, + 0, 313, :_reduce_459, + 3, 313, :_reduce_460, + 0, 314, :_reduce_461, + 3, 314, :_reduce_462, + 0, 306, :_reduce_463, + 2, 306, :_reduce_464, + 0, 307, :_reduce_465, + 2, 307, :_reduce_466, + 0, 308, :_reduce_467, + 2, 308, :_reduce_468, + 1, 311, :_reduce_469, + 2, 311, :_reduce_470, + 0, 316, :_reduce_471, + 4, 311, :_reduce_472, + 1, 315, :_reduce_473, + 1, 315, :_reduce_474, + 1, 315, :_reduce_475, + 1, 315, :_reduce_none, + 1, 207, :_reduce_477, + 3, 208, :_reduce_478, + 1, 303, :_reduce_479, + 2, 303, :_reduce_480, + 1, 211, :_reduce_481, + 1, 211, :_reduce_482, + 1, 211, :_reduce_483, + 1, 211, :_reduce_484, + 1, 199, :_reduce_485, + 1, 199, :_reduce_486, + 1, 199, :_reduce_487, + 1, 199, :_reduce_488, + 1, 199, :_reduce_489, + 1, 200, :_reduce_490, + 1, 200, :_reduce_491, + 1, 200, :_reduce_492, + 1, 200, :_reduce_493, + 1, 200, :_reduce_494, + 1, 200, :_reduce_495, + 1, 200, :_reduce_496, + 1, 232, :_reduce_497, + 1, 232, :_reduce_498, + 1, 172, :_reduce_499, + 1, 172, :_reduce_500, + 1, 177, :_reduce_501, + 1, 177, :_reduce_502, + 0, 317, :_reduce_503, + 4, 243, :_reduce_504, + 0, 243, :_reduce_505, + 3, 246, :_reduce_506, + 0, 319, :_reduce_507, + 3, 246, :_reduce_508, + 4, 318, :_reduce_509, + 2, 318, :_reduce_510, + 2, 318, :_reduce_511, + 1, 318, :_reduce_512, + 2, 321, :_reduce_513, + 0, 321, :_reduce_514, + 6, 288, :_reduce_515, + 8, 288, :_reduce_516, + 4, 288, :_reduce_517, + 6, 288, :_reduce_518, + 4, 288, :_reduce_519, + 6, 288, :_reduce_520, + 2, 288, :_reduce_521, + 4, 288, :_reduce_522, + 6, 288, :_reduce_523, + 2, 288, :_reduce_524, + 4, 288, :_reduce_525, + 2, 288, :_reduce_526, + 4, 288, :_reduce_527, + 1, 288, :_reduce_528, + 0, 288, :_reduce_529, + 1, 283, :_reduce_530, + 1, 283, :_reduce_531, + 1, 283, :_reduce_532, + 1, 283, :_reduce_533, + 1, 265, :_reduce_none, + 1, 265, :_reduce_535, + 1, 323, :_reduce_536, + 1, 324, :_reduce_537, + 3, 324, :_reduce_538, + 1, 275, :_reduce_539, + 3, 275, :_reduce_540, + 1, 325, :_reduce_541, + 2, 326, :_reduce_542, + 1, 326, :_reduce_543, + 2, 327, :_reduce_544, + 1, 327, :_reduce_545, + 1, 269, :_reduce_546, + 3, 269, :_reduce_547, + 1, 320, :_reduce_548, + 3, 320, :_reduce_549, + 1, 328, :_reduce_none, + 1, 328, :_reduce_none, + 2, 270, :_reduce_552, + 1, 270, :_reduce_553, + 3, 329, :_reduce_554, + 3, 330, :_reduce_555, + 1, 276, :_reduce_556, + 3, 276, :_reduce_557, + 1, 322, :_reduce_558, + 3, 322, :_reduce_559, + 1, 331, :_reduce_none, + 1, 331, :_reduce_none, + 2, 277, :_reduce_562, + 1, 277, :_reduce_563, + 1, 332, :_reduce_none, + 1, 332, :_reduce_none, + 2, 272, :_reduce_566, + 2, 271, :_reduce_567, + 0, 271, :_reduce_568, + 1, 247, :_reduce_none, + 3, 247, :_reduce_570, + 0, 233, :_reduce_571, + 2, 233, :_reduce_none, + 1, 218, :_reduce_573, + 3, 218, :_reduce_574, + 3, 333, :_reduce_575, + 2, 333, :_reduce_576, + 4, 333, :_reduce_577, + 2, 333, :_reduce_578, + 1, 190, :_reduce_none, + 1, 190, :_reduce_none, + 1, 190, :_reduce_none, + 1, 184, :_reduce_none, + 1, 184, :_reduce_none, + 1, 184, :_reduce_none, + 1, 184, :_reduce_none, + 1, 294, :_reduce_none, + 1, 294, :_reduce_none, + 1, 294, :_reduce_none, + 1, 183, :_reduce_none, + 1, 183, :_reduce_none, + 1, 176, :_reduce_591, + 1, 176, :_reduce_592, + 0, 149, :_reduce_none, + 1, 149, :_reduce_none, + 0, 178, :_reduce_none, + 1, 178, :_reduce_none, + 2, 194, :_reduce_597, + 2, 175, :_reduce_598, + 0, 217, :_reduce_none, + 1, 217, :_reduce_none, + 1, 217, :_reduce_none, + 1, 244, :_reduce_602, + 1, 244, :_reduce_none, + 1, 151, :_reduce_none, + 2, 151, :_reduce_none, + 0, 215, :_reduce_606 ] + +racc_reduce_n = 607 + +racc_shift_n = 1040 + +racc_token_table = { + false => 0, + :error => 1, + :kCLASS => 2, + :kMODULE => 3, + :kDEF => 4, + :kUNDEF => 5, + :kBEGIN => 6, + :kRESCUE => 7, + :kENSURE => 8, + :kEND => 9, + :kIF => 10, + :kUNLESS => 11, + :kTHEN => 12, + :kELSIF => 13, + :kELSE => 14, + :kCASE => 15, + :kWHEN => 16, + :kWHILE => 17, + :kUNTIL => 18, + :kFOR => 19, + :kBREAK => 20, + :kNEXT => 21, + :kREDO => 22, + :kRETRY => 23, + :kIN => 24, + :kDO => 25, + :kDO_COND => 26, + :kDO_BLOCK => 27, + :kDO_LAMBDA => 28, + :kRETURN => 29, + :kYIELD => 30, + :kSUPER => 31, + :kSELF => 32, + :kNIL => 33, + :kTRUE => 34, + :kFALSE => 35, + :kAND => 36, + :kOR => 37, + :kNOT => 38, + :kIF_MOD => 39, + :kUNLESS_MOD => 40, + :kWHILE_MOD => 41, + :kUNTIL_MOD => 42, + :kRESCUE_MOD => 43, + :kALIAS => 44, + :kDEFINED => 45, + :klBEGIN => 46, + :klEND => 47, + :k__LINE__ => 48, + :k__FILE__ => 49, + :k__ENCODING__ => 50, + :tIDENTIFIER => 51, + :tFID => 52, + :tGVAR => 53, + :tIVAR => 54, + :tCONSTANT => 55, + :tLABEL => 56, + :tCVAR => 57, + :tNTH_REF => 58, + :tBACK_REF => 59, + :tSTRING_CONTENT => 60, + :tINTEGER => 61, + :tFLOAT => 62, + :tUPLUS => 63, + :tUMINUS => 64, + :tUNARY_NUM => 65, + :tPOW => 66, + :tCMP => 67, + :tEQ => 68, + :tEQQ => 69, + :tNEQ => 70, + :tGEQ => 71, + :tLEQ => 72, + :tANDOP => 73, + :tOROP => 74, + :tMATCH => 75, + :tNMATCH => 76, + :tDOT => 77, + :tDOT2 => 78, + :tDOT3 => 79, + :tAREF => 80, + :tASET => 81, + :tLSHFT => 82, + :tRSHFT => 83, + :tCOLON2 => 84, + :tCOLON3 => 85, + :tOP_ASGN => 86, + :tASSOC => 87, + :tLPAREN => 88, + :tLPAREN2 => 89, + :tRPAREN => 90, + :tLPAREN_ARG => 91, + :tLBRACK => 92, + :tLBRACK2 => 93, + :tRBRACK => 94, + :tLBRACE => 95, + :tLBRACE_ARG => 96, + :tSTAR => 97, + :tSTAR2 => 98, + :tAMPER => 99, + :tAMPER2 => 100, + :tTILDE => 101, + :tPERCENT => 102, + :tDIVIDE => 103, + :tDSTAR => 104, + :tPLUS => 105, + :tMINUS => 106, + :tLT => 107, + :tGT => 108, + :tPIPE => 109, + :tBANG => 110, + :tCARET => 111, + :tLCURLY => 112, + :tRCURLY => 113, + :tBACK_REF2 => 114, + :tSYMBEG => 115, + :tSTRING_BEG => 116, + :tXSTRING_BEG => 117, + :tREGEXP_BEG => 118, + :tREGEXP_OPT => 119, + :tWORDS_BEG => 120, + :tQWORDS_BEG => 121, + :tSYMBOLS_BEG => 122, + :tQSYMBOLS_BEG => 123, + :tSTRING_DBEG => 124, + :tSTRING_DVAR => 125, + :tSTRING_END => 126, + :tSTRING_DEND => 127, + :tSTRING => 128, + :tSYMBOL => 129, + :tNL => 130, + :tEH => 131, + :tCOLON => 132, + :tCOMMA => 133, + :tSPACE => 134, + :tSEMI => 135, + :tLAMBDA => 136, + :tLAMBEG => 137, + :tCHARACTER => 138, + :tRATIONAL => 139, + :tIMAGINARY => 140, + :tLABEL_END => 141, + :tANDDOT => 142, + :tEQL => 143, + :tLOWEST => 144 } + +racc_nt_base = 145 + +racc_use_result_var = true + +Racc_arg = [ + racc_action_table, + racc_action_check, + racc_action_default, + racc_action_pointer, + racc_goto_table, + racc_goto_check, + racc_goto_default, + racc_goto_pointer, + racc_nt_base, + racc_reduce_table, + racc_token_table, + racc_shift_n, + racc_reduce_n, + racc_use_result_var ] + +Racc_token_to_s_table = [ + "$end", + "error", + "kCLASS", + "kMODULE", + "kDEF", + "kUNDEF", + "kBEGIN", + "kRESCUE", + "kENSURE", + "kEND", + "kIF", + "kUNLESS", + "kTHEN", + "kELSIF", + "kELSE", + "kCASE", + "kWHEN", + "kWHILE", + "kUNTIL", + "kFOR", + "kBREAK", + "kNEXT", + "kREDO", + "kRETRY", + "kIN", + "kDO", + "kDO_COND", + "kDO_BLOCK", + "kDO_LAMBDA", + "kRETURN", + "kYIELD", + "kSUPER", + "kSELF", + "kNIL", + "kTRUE", + "kFALSE", + "kAND", + "kOR", + "kNOT", + "kIF_MOD", + "kUNLESS_MOD", + "kWHILE_MOD", + "kUNTIL_MOD", + "kRESCUE_MOD", + "kALIAS", + "kDEFINED", + "klBEGIN", + "klEND", + "k__LINE__", + "k__FILE__", + "k__ENCODING__", + "tIDENTIFIER", + "tFID", + "tGVAR", + "tIVAR", + "tCONSTANT", + "tLABEL", + "tCVAR", + "tNTH_REF", + "tBACK_REF", + "tSTRING_CONTENT", + "tINTEGER", + "tFLOAT", + "tUPLUS", + "tUMINUS", + "tUNARY_NUM", + "tPOW", + "tCMP", + "tEQ", + "tEQQ", + "tNEQ", + "tGEQ", + "tLEQ", + "tANDOP", + "tOROP", + "tMATCH", + "tNMATCH", + "tDOT", + "tDOT2", + "tDOT3", + "tAREF", + "tASET", + "tLSHFT", + "tRSHFT", + "tCOLON2", + "tCOLON3", + "tOP_ASGN", + "tASSOC", + "tLPAREN", + "tLPAREN2", + "tRPAREN", + "tLPAREN_ARG", + "tLBRACK", + "tLBRACK2", + "tRBRACK", + "tLBRACE", + "tLBRACE_ARG", + "tSTAR", + "tSTAR2", + "tAMPER", + "tAMPER2", + "tTILDE", + "tPERCENT", + "tDIVIDE", + "tDSTAR", + "tPLUS", + "tMINUS", + "tLT", + "tGT", + "tPIPE", + "tBANG", + "tCARET", + "tLCURLY", + "tRCURLY", + "tBACK_REF2", + "tSYMBEG", + "tSTRING_BEG", + "tXSTRING_BEG", + "tREGEXP_BEG", + "tREGEXP_OPT", + "tWORDS_BEG", + "tQWORDS_BEG", + "tSYMBOLS_BEG", + "tQSYMBOLS_BEG", + "tSTRING_DBEG", + "tSTRING_DVAR", + "tSTRING_END", + "tSTRING_DEND", + "tSTRING", + "tSYMBOL", + "tNL", + "tEH", + "tCOLON", + "tCOMMA", + "tSPACE", + "tSEMI", + "tLAMBDA", + "tLAMBEG", + "tCHARACTER", + "tRATIONAL", + "tIMAGINARY", + "tLABEL_END", + "tANDDOT", + "tEQL", + "tLOWEST", + "$start", + "program", + "top_compstmt", + "top_stmts", + "opt_terms", + "top_stmt", + "terms", + "stmt", + "bodystmt", + "compstmt", + "opt_rescue", + "opt_else", + "opt_ensure", + "stmts", + "stmt_or_begin", + "fitem", + "undef_list", + "expr_value", + "command_asgn", + "mlhs", + "command_call", + "lhs", + "mrhs", + "mrhs_arg", + "expr", + "@1", + "command_rhs", + "var_lhs", + "primary_value", + "opt_call_args", + "rbracket", + "call_op", + "backref", + "opt_nl", + "arg", + "command", + "block_command", + "block_call", + "dot_or_colon", + "operation2", + "command_args", + "cmd_brace_block", + "brace_body", + "fcall", + "@2", + "operation", + "call_args", + "mlhs_basic", + "mlhs_inner", + "rparen", + "mlhs_head", + "mlhs_item", + "mlhs_node", + "mlhs_post", + "user_variable", + "keyword_variable", + "cname", + "cpath", + "fname", + "op", + "reswords", + "fsym", + "symbol", + "dsym", + "@3", + "arg_rhs", + "simple_numeric", + "primary", + "arg_value", + "aref_args", + "none", + "args", + "trailer", + "assocs", + "paren_args", + "opt_paren_args", + "opt_block_arg", + "block_arg", + "@4", + "literal", + "strings", + "xstring", + "regexp", + "words", + "qwords", + "symbols", + "qsymbols", + "var_ref", + "assoc_list", + "brace_block", + "method_call", + "lambda", + "then", + "if_tail", + "do", + "case_body", + "for_var", + "k_class", + "superclass", + "term", + "k_module", + "f_arglist", + "singleton", + "@5", + "@6", + "@7", + "@8", + "@9", + "@10", + "@11", + "@12", + "@13", + "@14", + "@15", + "@16", + "@17", + "@18", + "@19", + "@20", + "f_marg", + "f_norm_arg", + "f_margs", + "f_marg_list", + "block_args_tail", + "f_block_kwarg", + "f_kwrest", + "opt_f_block_arg", + "f_block_arg", + "opt_block_args_tail", + "block_param", + "f_arg", + "f_block_optarg", + "f_rest_arg", + "opt_block_param", + "block_param_def", + "opt_bv_decl", + "bv_decls", + "bvar", + "f_bad_arg", + "f_larglist", + "lambda_body", + "@21", + "@22", + "f_args", + "do_block", + "@23", + "@24", + "do_body", + "@25", + "operation3", + "@26", + "@27", + "@28", + "@29", + "@30", + "cases", + "exc_list", + "exc_var", + "numeric", + "string", + "string1", + "string_contents", + "xstring_contents", + "regexp_contents", + "word_list", + "word", + "string_content", + "symbol_list", + "qword_list", + "qsym_list", + "string_dvar", + "@31", + "@32", + "args_tail", + "@33", + "f_kwarg", + "opt_args_tail", + "f_optarg", + "f_arg_asgn", + "f_arg_item", + "f_label", + "f_kw", + "f_block_kw", + "kwrest_mark", + "f_opt", + "f_block_opt", + "restarg_mark", + "blkarg_mark", + "assoc" ] + +Racc_debug_parser = false + +##### State transition tables end ##### + +# reduce 0 omitted + +# reduce 1 omitted + +def _reduce_2(val, _values, result) + result = @builder.compstmt(val[0]) + + result +end + +def _reduce_3(val, _values, result) + result = [] + + result +end + +def _reduce_4(val, _values, result) + result = [ val[0] ] + + result +end + +def _reduce_5(val, _values, result) + result = val[0] << val[2] + + result +end + +def _reduce_6(val, _values, result) + result = [ val[1] ] + + result +end + +# reduce 7 omitted + +def _reduce_8(val, _values, result) + result = @builder.preexe(val[0], val[1], val[2], val[3]) + + result +end + +def _reduce_9(val, _values, result) + rescue_bodies = val[1] + else_t, else_ = val[2] + ensure_t, ensure_ = val[3] + + if rescue_bodies.empty? && !else_t.nil? + diagnostic :warning, :useless_else, nil, else_t + end + + result = @builder.begin_body(val[0], + rescue_bodies, + else_t, else_, + ensure_t, ensure_) + + result +end + +def _reduce_10(val, _values, result) + result = @builder.compstmt(val[0]) + + result +end + +def _reduce_11(val, _values, result) + result = [] + + result +end + +def _reduce_12(val, _values, result) + result = [ val[0] ] + + result +end + +def _reduce_13(val, _values, result) + result = val[0] << val[2] + + result +end + +def _reduce_14(val, _values, result) + result = [ val[1] ] + + result +end + +# reduce 15 omitted + +def _reduce_16(val, _values, result) + diagnostic :error, :begin_in_method, nil, val[0] + + result +end + +def _reduce_17(val, _values, result) + @lexer.state = :expr_fname + + result +end + +def _reduce_18(val, _values, result) + result = @builder.alias(val[0], val[1], val[3]) + + result +end + +def _reduce_19(val, _values, result) + result = @builder.alias(val[0], + @builder.gvar(val[1]), + @builder.gvar(val[2])) + + result +end + +def _reduce_20(val, _values, result) + result = @builder.alias(val[0], + @builder.gvar(val[1]), + @builder.back_ref(val[2])) + + result +end + +def _reduce_21(val, _values, result) + diagnostic :error, :nth_ref_alias, nil, val[2] + + result +end + +def _reduce_22(val, _values, result) + result = @builder.undef_method(val[0], val[1]) + + result +end + +def _reduce_23(val, _values, result) + result = @builder.condition_mod(val[0], nil, + val[1], val[2]) + + result +end + +def _reduce_24(val, _values, result) + result = @builder.condition_mod(nil, val[0], + val[1], val[2]) + + result +end + +def _reduce_25(val, _values, result) + result = @builder.loop_mod(:while, val[0], val[1], val[2]) + + result +end + +def _reduce_26(val, _values, result) + result = @builder.loop_mod(:until, val[0], val[1], val[2]) + + result +end + +def _reduce_27(val, _values, result) + rescue_body = @builder.rescue_body(val[1], + nil, nil, nil, + nil, val[2]) + + result = @builder.begin_body(val[0], [ rescue_body ]) + + result +end + +def _reduce_28(val, _values, result) + result = @builder.postexe(val[0], val[1], val[2], val[3]) + + result +end + +# reduce 29 omitted + +def _reduce_30(val, _values, result) + result = @builder.multi_assign(val[0], val[1], val[2]) + + result +end + +def _reduce_31(val, _values, result) + result = @builder.assign(val[0], val[1], + @builder.array(nil, val[2], nil)) + + result +end + +def _reduce_32(val, _values, result) + result = @builder.multi_assign(val[0], val[1], val[2]) + + result +end + +# reduce 33 omitted + +def _reduce_34(val, _values, result) + result = @builder.assign(val[0], val[1], val[2]) + + result +end + +def _reduce_35(val, _values, result) + result = @builder.op_assign(val[0], val[1], val[2]) + + result +end + +def _reduce_36(val, _values, result) + result = @builder.op_assign( + @builder.index( + val[0], val[1], val[2], val[3]), + val[4], val[5]) + + result +end + +def _reduce_37(val, _values, result) + result = @builder.op_assign( + @builder.call_method( + val[0], val[1], val[2]), + val[3], val[4]) + + result +end + +def _reduce_38(val, _values, result) + result = @builder.op_assign( + @builder.call_method( + val[0], val[1], val[2]), + val[3], val[4]) + + result +end + +def _reduce_39(val, _values, result) + const = @builder.const_op_assignable( + @builder.const_fetch(val[0], val[1], val[2])) + result = @builder.op_assign(const, val[3], val[4]) + + result +end + +def _reduce_40(val, _values, result) + result = @builder.op_assign( + @builder.call_method( + val[0], val[1], val[2]), + val[3], val[4]) + + result +end + +def _reduce_41(val, _values, result) + @builder.op_assign(val[0], val[1], val[2]) + + result +end + +# reduce 42 omitted + +def _reduce_43(val, _values, result) + rescue_body = @builder.rescue_body(val[1], + nil, nil, nil, + nil, val[2]) + + result = @builder.begin_body(val[0], [ rescue_body ]) + + result +end + +# reduce 44 omitted + +# reduce 45 omitted + +def _reduce_46(val, _values, result) + result = @builder.logical_op(:and, val[0], val[1], val[2]) + + result +end + +def _reduce_47(val, _values, result) + result = @builder.logical_op(:or, val[0], val[1], val[2]) + + result +end + +def _reduce_48(val, _values, result) + result = @builder.not_op(val[0], nil, val[2], nil) + + result +end + +def _reduce_49(val, _values, result) + result = @builder.not_op(val[0], nil, val[1], nil) + + result +end + +# reduce 50 omitted + +# reduce 51 omitted + +# reduce 52 omitted + +# reduce 53 omitted + +# reduce 54 omitted + +def _reduce_55(val, _values, result) + result = @builder.call_method(val[0], val[1], val[2], + nil, val[3], nil) + + result +end + +def _reduce_56(val, _values, result) + result = @context.dup + @context.in_block = true + + result +end + +def _reduce_57(val, _values, result) + result = [ val[0], *val[2], val[3] ] + @context.in_block = val[1].in_block + + result +end + +# reduce 58 omitted + +def _reduce_59(val, _values, result) + result = @builder.call_method(nil, nil, val[0], + nil, val[1], nil) + + result +end + +def _reduce_60(val, _values, result) + method_call = @builder.call_method(nil, nil, val[0], + nil, val[1], nil) + + begin_t, args, body, end_t = val[2] + result = @builder.block(method_call, + begin_t, args, body, end_t) + + result +end + +def _reduce_61(val, _values, result) + result = @builder.call_method(val[0], val[1], val[2], + nil, val[3], nil) + + result +end + +def _reduce_62(val, _values, result) + method_call = @builder.call_method(val[0], val[1], val[2], + nil, val[3], nil) + + begin_t, args, body, end_t = val[4] + result = @builder.block(method_call, + begin_t, args, body, end_t) + + result +end + +def _reduce_63(val, _values, result) + result = @builder.call_method(val[0], val[1], val[2], + nil, val[3], nil) + + result +end + +def _reduce_64(val, _values, result) + method_call = @builder.call_method(val[0], val[1], val[2], + nil, val[3], nil) + + begin_t, args, body, end_t = val[4] + result = @builder.block(method_call, + begin_t, args, body, end_t) + + result +end + +def _reduce_65(val, _values, result) + result = @builder.keyword_cmd(:super, val[0], + nil, val[1], nil) + + result +end + +def _reduce_66(val, _values, result) + result = @builder.keyword_cmd(:yield, val[0], + nil, val[1], nil) + + result +end + +def _reduce_67(val, _values, result) + result = @builder.keyword_cmd(:return, val[0], + nil, val[1], nil) + + result +end + +def _reduce_68(val, _values, result) + result = @builder.keyword_cmd(:break, val[0], + nil, val[1], nil) + + result +end + +def _reduce_69(val, _values, result) + result = @builder.keyword_cmd(:next, val[0], + nil, val[1], nil) + + result +end + +def _reduce_70(val, _values, result) + result = @builder.multi_lhs(nil, val[0], nil) + + result +end + +def _reduce_71(val, _values, result) + result = @builder.begin(val[0], val[1], val[2]) + + result +end + +def _reduce_72(val, _values, result) + result = @builder.multi_lhs(nil, val[0], nil) + + result +end + +def _reduce_73(val, _values, result) + result = @builder.multi_lhs(val[0], val[1], val[2]) + + result +end + +# reduce 74 omitted + +def _reduce_75(val, _values, result) + result = val[0]. + push(val[1]) + + result +end + +def _reduce_76(val, _values, result) + result = val[0]. + push(@builder.splat(val[1], val[2])) + + result +end + +def _reduce_77(val, _values, result) + result = val[0]. + push(@builder.splat(val[1], val[2])). + concat(val[4]) + + result +end + +def _reduce_78(val, _values, result) + result = val[0]. + push(@builder.splat(val[1])) + + result +end + +def _reduce_79(val, _values, result) + result = val[0]. + push(@builder.splat(val[1])). + concat(val[3]) + + result +end + +def _reduce_80(val, _values, result) + result = [ @builder.splat(val[0], val[1]) ] + + result +end + +def _reduce_81(val, _values, result) + result = [ @builder.splat(val[0], val[1]), + *val[3] ] + + result +end + +def _reduce_82(val, _values, result) + result = [ @builder.splat(val[0]) ] + + result +end + +def _reduce_83(val, _values, result) + result = [ @builder.splat(val[0]), + *val[2] ] + + result +end + +# reduce 84 omitted + +def _reduce_85(val, _values, result) + result = @builder.begin(val[0], val[1], val[2]) + + result +end + +def _reduce_86(val, _values, result) + result = [ val[0] ] + + result +end + +def _reduce_87(val, _values, result) + result = val[0] << val[1] + + result +end + +def _reduce_88(val, _values, result) + result = [ val[0] ] + + result +end + +def _reduce_89(val, _values, result) + result = val[0] << val[2] + + result +end + +def _reduce_90(val, _values, result) + result = @builder.assignable(val[0]) + + result +end + +def _reduce_91(val, _values, result) + result = @builder.assignable(val[0]) + + result +end + +def _reduce_92(val, _values, result) + result = @builder.index_asgn(val[0], val[1], val[2], val[3]) + + result +end + +def _reduce_93(val, _values, result) + result = @builder.attr_asgn(val[0], val[1], val[2]) + + result +end + +def _reduce_94(val, _values, result) + result = @builder.attr_asgn(val[0], val[1], val[2]) + + result +end + +def _reduce_95(val, _values, result) + result = @builder.attr_asgn(val[0], val[1], val[2]) + + result +end + +def _reduce_96(val, _values, result) + result = @builder.assignable( + @builder.const_fetch(val[0], val[1], val[2])) + + result +end + +def _reduce_97(val, _values, result) + result = @builder.assignable( + @builder.const_global(val[0], val[1])) + + result +end + +def _reduce_98(val, _values, result) + result = @builder.assignable(val[0]) + + result +end + +def _reduce_99(val, _values, result) + result = @builder.assignable(val[0]) + + result +end + +def _reduce_100(val, _values, result) + result = @builder.assignable(val[0]) + + result +end + +def _reduce_101(val, _values, result) + result = @builder.index_asgn(val[0], val[1], val[2], val[3]) + + result +end + +def _reduce_102(val, _values, result) + result = @builder.attr_asgn(val[0], val[1], val[2]) + + result +end + +def _reduce_103(val, _values, result) + result = @builder.attr_asgn(val[0], val[1], val[2]) + + result +end + +def _reduce_104(val, _values, result) + result = @builder.attr_asgn(val[0], val[1], val[2]) + + result +end + +def _reduce_105(val, _values, result) + result = @builder.assignable( + @builder.const_fetch(val[0], val[1], val[2])) + + result +end + +def _reduce_106(val, _values, result) + result = @builder.assignable( + @builder.const_global(val[0], val[1])) + + result +end + +def _reduce_107(val, _values, result) + result = @builder.assignable(val[0]) + + result +end + +def _reduce_108(val, _values, result) + diagnostic :error, :module_name_const, nil, val[0] + + result +end + +# reduce 109 omitted + +def _reduce_110(val, _values, result) + result = @builder.const_global(val[0], val[1]) + + result +end + +def _reduce_111(val, _values, result) + result = @builder.const(val[0]) + + result +end + +def _reduce_112(val, _values, result) + result = @builder.const_fetch(val[0], val[1], val[2]) + + result +end + +# reduce 113 omitted + +# reduce 114 omitted + +# reduce 115 omitted + +# reduce 116 omitted + +# reduce 117 omitted + +def _reduce_118(val, _values, result) + result = @builder.symbol_internal(val[0]) + + result +end + +# reduce 119 omitted + +# reduce 120 omitted + +# reduce 121 omitted + +def _reduce_122(val, _values, result) + result = [ val[0] ] + + result +end + +def _reduce_123(val, _values, result) + @lexer.state = :expr_fname + + result +end + +def _reduce_124(val, _values, result) + result = val[0] << val[3] + + result +end + +# reduce 125 omitted + +# reduce 126 omitted + +# reduce 127 omitted + +# reduce 128 omitted + +# reduce 129 omitted + +# reduce 130 omitted + +# reduce 131 omitted + +# reduce 132 omitted + +# reduce 133 omitted + +# reduce 134 omitted + +# reduce 135 omitted + +# reduce 136 omitted + +# reduce 137 omitted + +# reduce 138 omitted + +# reduce 139 omitted + +# reduce 140 omitted + +# reduce 141 omitted + +# reduce 142 omitted + +# reduce 143 omitted + +# reduce 144 omitted + +# reduce 145 omitted + +# reduce 146 omitted + +# reduce 147 omitted + +# reduce 148 omitted + +# reduce 149 omitted + +# reduce 150 omitted + +# reduce 151 omitted + +# reduce 152 omitted + +# reduce 153 omitted + +# reduce 154 omitted + +# reduce 155 omitted + +# reduce 156 omitted + +# reduce 157 omitted + +# reduce 158 omitted + +# reduce 159 omitted + +# reduce 160 omitted + +# reduce 161 omitted + +# reduce 162 omitted + +# reduce 163 omitted + +# reduce 164 omitted + +# reduce 165 omitted + +# reduce 166 omitted + +# reduce 167 omitted + +# reduce 168 omitted + +# reduce 169 omitted + +# reduce 170 omitted + +# reduce 171 omitted + +# reduce 172 omitted + +# reduce 173 omitted + +# reduce 174 omitted + +# reduce 175 omitted + +# reduce 176 omitted + +# reduce 177 omitted + +# reduce 178 omitted + +# reduce 179 omitted + +# reduce 180 omitted + +# reduce 181 omitted + +# reduce 182 omitted + +# reduce 183 omitted + +# reduce 184 omitted + +# reduce 185 omitted + +# reduce 186 omitted + +# reduce 187 omitted + +# reduce 188 omitted + +# reduce 189 omitted + +# reduce 190 omitted + +# reduce 191 omitted + +# reduce 192 omitted + +# reduce 193 omitted + +# reduce 194 omitted + +# reduce 195 omitted + +def _reduce_196(val, _values, result) + result = @builder.assign(val[0], val[1], val[2]) + + result +end + +def _reduce_197(val, _values, result) + result = @builder.op_assign(val[0], val[1], val[2]) + + result +end + +def _reduce_198(val, _values, result) + result = @builder.op_assign( + @builder.index( + val[0], val[1], val[2], val[3]), + val[4], val[5]) + + result +end + +def _reduce_199(val, _values, result) + result = @builder.op_assign( + @builder.call_method( + val[0], val[1], val[2]), + val[3], val[4]) + + result +end + +def _reduce_200(val, _values, result) + result = @builder.op_assign( + @builder.call_method( + val[0], val[1], val[2]), + val[3], val[4]) + + result +end + +def _reduce_201(val, _values, result) + result = @builder.op_assign( + @builder.call_method( + val[0], val[1], val[2]), + val[3], val[4]) + + result +end + +def _reduce_202(val, _values, result) + const = @builder.const_op_assignable( + @builder.const_fetch(val[0], val[1], val[2])) + result = @builder.op_assign(const, val[3], val[4]) + + result +end + +def _reduce_203(val, _values, result) + const = @builder.const_op_assignable( + @builder.const_global(val[0], val[1])) + result = @builder.op_assign(const, val[2], val[3]) + + result +end + +def _reduce_204(val, _values, result) + result = @builder.op_assign(val[0], val[1], val[2]) + + result +end + +def _reduce_205(val, _values, result) + result = @builder.range_inclusive(val[0], val[1], val[2]) + + result +end + +def _reduce_206(val, _values, result) + result = @builder.range_exclusive(val[0], val[1], val[2]) + + result +end + +def _reduce_207(val, _values, result) + result = @builder.binary_op(val[0], val[1], val[2]) + + result +end + +def _reduce_208(val, _values, result) + result = @builder.binary_op(val[0], val[1], val[2]) + + result +end + +def _reduce_209(val, _values, result) + result = @builder.binary_op(val[0], val[1], val[2]) + + result +end + +def _reduce_210(val, _values, result) + result = @builder.binary_op(val[0], val[1], val[2]) + + result +end + +def _reduce_211(val, _values, result) + result = @builder.binary_op(val[0], val[1], val[2]) + + result +end + +def _reduce_212(val, _values, result) + result = @builder.binary_op(val[0], val[1], val[2]) + + result +end + +def _reduce_213(val, _values, result) + result = @builder.unary_op(val[0], + @builder.binary_op( + val[1], val[2], val[3])) + + result +end + +def _reduce_214(val, _values, result) + result = @builder.unary_op(val[0], val[1]) + + result +end + +def _reduce_215(val, _values, result) + result = @builder.unary_op(val[0], val[1]) + + result +end + +def _reduce_216(val, _values, result) + result = @builder.binary_op(val[0], val[1], val[2]) + + result +end + +def _reduce_217(val, _values, result) + result = @builder.binary_op(val[0], val[1], val[2]) + + result +end + +def _reduce_218(val, _values, result) + result = @builder.binary_op(val[0], val[1], val[2]) + + result +end + +def _reduce_219(val, _values, result) + result = @builder.binary_op(val[0], val[1], val[2]) + + result +end + +def _reduce_220(val, _values, result) + result = @builder.binary_op(val[0], val[1], val[2]) + + result +end + +def _reduce_221(val, _values, result) + result = @builder.binary_op(val[0], val[1], val[2]) + + result +end + +def _reduce_222(val, _values, result) + result = @builder.binary_op(val[0], val[1], val[2]) + + result +end + +def _reduce_223(val, _values, result) + result = @builder.binary_op(val[0], val[1], val[2]) + + result +end + +def _reduce_224(val, _values, result) + result = @builder.binary_op(val[0], val[1], val[2]) + + result +end + +def _reduce_225(val, _values, result) + result = @builder.binary_op(val[0], val[1], val[2]) + + result +end + +def _reduce_226(val, _values, result) + result = @builder.binary_op(val[0], val[1], val[2]) + + result +end + +def _reduce_227(val, _values, result) + result = @builder.match_op(val[0], val[1], val[2]) + + result +end + +def _reduce_228(val, _values, result) + result = @builder.binary_op(val[0], val[1], val[2]) + + result +end + +def _reduce_229(val, _values, result) + result = @builder.not_op(val[0], nil, val[1], nil) + + result +end + +def _reduce_230(val, _values, result) + result = @builder.unary_op(val[0], val[1]) + + result +end + +def _reduce_231(val, _values, result) + result = @builder.binary_op(val[0], val[1], val[2]) + + result +end + +def _reduce_232(val, _values, result) + result = @builder.binary_op(val[0], val[1], val[2]) + + result +end + +def _reduce_233(val, _values, result) + result = @builder.logical_op(:and, val[0], val[1], val[2]) + + result +end + +def _reduce_234(val, _values, result) + result = @builder.logical_op(:or, val[0], val[1], val[2]) + + result +end + +def _reduce_235(val, _values, result) + result = @builder.keyword_cmd(:defined?, val[0], nil, [ val[2] ], nil) + + result +end + +def _reduce_236(val, _values, result) + result = @builder.ternary(val[0], val[1], + val[2], val[4], val[5]) + + result +end + +# reduce 237 omitted + +# reduce 238 omitted + +# reduce 239 omitted + +# reduce 240 omitted + +def _reduce_241(val, _values, result) + result = val[0] << @builder.associate(nil, val[2], nil) + + result +end + +def _reduce_242(val, _values, result) + result = [ @builder.associate(nil, val[0], nil) ] + + result +end + +# reduce 243 omitted + +def _reduce_244(val, _values, result) + rescue_body = @builder.rescue_body(val[1], + nil, nil, nil, + nil, val[2]) + + result = @builder.begin_body(val[0], [ rescue_body ]) + + result +end + +def _reduce_245(val, _values, result) + result = val + + result +end + +def _reduce_246(val, _values, result) + result = [ nil, [], nil ] + + result +end + +# reduce 247 omitted + +def _reduce_248(val, _values, result) + result = [] + + result +end + +# reduce 249 omitted + +# reduce 250 omitted + +def _reduce_251(val, _values, result) + result = val[0] << @builder.associate(nil, val[2], nil) + + result +end + +def _reduce_252(val, _values, result) + result = [ @builder.associate(nil, val[0], nil) ] + + result +end + +def _reduce_253(val, _values, result) + result = [ val[0] ] + + result +end + +def _reduce_254(val, _values, result) + result = val[0].concat(val[1]) + + result +end + +def _reduce_255(val, _values, result) + result = [ @builder.associate(nil, val[0], nil) ] + result.concat(val[1]) + + result +end + +def _reduce_256(val, _values, result) + assocs = @builder.associate(nil, val[2], nil) + result = val[0] << assocs + result.concat(val[3]) + + result +end + +def _reduce_257(val, _values, result) + result = [ val[0] ] + + result +end + +def _reduce_258(val, _values, result) + # When branch gets invoked by RACC's lookahead + # and command args start with '[' or '(' + # we need to put `true` to the cmdarg stack + # **before** `false` pushed by lexer + # m [], n + # ^ + # Right here we have cmdarg [...0] because + # lexer pushed it on '[' + # We need to modify cmdarg stack to [...10] + # + # For all other cases (like `m n` or `m n, []`) we simply put 1 to the stack + # and later lexer pushes corresponding bits on top of it. + last_token = @last_token[0] + lookahead = last_token == :tLBRACK || last_token == :tLPAREN_ARG + + if lookahead + top = @lexer.cmdarg.pop + @lexer.cmdarg.push(true) + @lexer.cmdarg.push(top) + else + @lexer.cmdarg.push(true) + end + + result +end + +def _reduce_259(val, _values, result) + # call_args can be followed by tLBRACE_ARG (that does cmdarg.push(0) in the lexer) + # but the push must be done after cmdarg.pop() in the parser. + # So this code does cmdarg.pop() to pop 0 pushed by tLBRACE_ARG, + # cmdarg.pop() to pop 1 pushed by command_args, + # and cmdarg.push(0) to restore back the flag set by tLBRACE_ARG. + last_token = @last_token[0] + lookahead = last_token == :tLBRACE_ARG + if lookahead + top = @lexer.cmdarg.pop + @lexer.cmdarg.pop + @lexer.cmdarg.push(top) + else + @lexer.cmdarg.pop + end + + result = val[1] + + result +end + +def _reduce_260(val, _values, result) + result = @builder.block_pass(val[0], val[1]) + + result +end + +def _reduce_261(val, _values, result) + result = [ val[1] ] + + result +end + +def _reduce_262(val, _values, result) + result = [] + + result +end + +def _reduce_263(val, _values, result) + result = [ val[0] ] + + result +end + +def _reduce_264(val, _values, result) + result = [ @builder.splat(val[0], val[1]) ] + + result +end + +def _reduce_265(val, _values, result) + result = val[0] << val[2] + + result +end + +def _reduce_266(val, _values, result) + result = val[0] << @builder.splat(val[2], val[3]) + + result +end + +def _reduce_267(val, _values, result) + result = @builder.array(nil, val[0], nil) + + result +end + +# reduce 268 omitted + +def _reduce_269(val, _values, result) + result = val[0] << val[2] + + result +end + +def _reduce_270(val, _values, result) + result = val[0] << @builder.splat(val[2], val[3]) + + result +end + +def _reduce_271(val, _values, result) + result = [ @builder.splat(val[0], val[1]) ] + + result +end + +# reduce 272 omitted + +# reduce 273 omitted + +# reduce 274 omitted + +# reduce 275 omitted + +# reduce 276 omitted + +# reduce 277 omitted + +# reduce 278 omitted + +# reduce 279 omitted + +# reduce 280 omitted + +# reduce 281 omitted + +def _reduce_282(val, _values, result) + result = @builder.call_method(nil, nil, val[0]) + + result +end + +def _reduce_283(val, _values, result) + @lexer.cmdarg.push(false) + + result +end + +def _reduce_284(val, _values, result) + @lexer.cmdarg.pop + + result = @builder.begin_keyword(val[0], val[2], val[3]) + + result +end + +def _reduce_285(val, _values, result) + @lexer.state = :expr_endarg + + result +end + +def _reduce_286(val, _values, result) + result = @builder.begin(val[0], val[1], val[3]) + + result +end + +def _reduce_287(val, _values, result) + @lexer.state = :expr_endarg + + result +end + +def _reduce_288(val, _values, result) + result = @builder.begin(val[0], nil, val[3]) + + result +end + +def _reduce_289(val, _values, result) + result = @builder.begin(val[0], val[1], val[2]) + + result +end + +def _reduce_290(val, _values, result) + result = @builder.const_fetch(val[0], val[1], val[2]) + + result +end + +def _reduce_291(val, _values, result) + result = @builder.const_global(val[0], val[1]) + + result +end + +def _reduce_292(val, _values, result) + result = @builder.array(val[0], val[1], val[2]) + + result +end + +def _reduce_293(val, _values, result) + result = @builder.associate(val[0], val[1], val[2]) + + result +end + +def _reduce_294(val, _values, result) + result = @builder.keyword_cmd(:return, val[0]) + + result +end + +def _reduce_295(val, _values, result) + result = @builder.keyword_cmd(:yield, val[0], val[1], val[2], val[3]) + + result +end + +def _reduce_296(val, _values, result) + result = @builder.keyword_cmd(:yield, val[0], val[1], [], val[2]) + + result +end + +def _reduce_297(val, _values, result) + result = @builder.keyword_cmd(:yield, val[0]) + + result +end + +def _reduce_298(val, _values, result) + result = @builder.keyword_cmd(:defined?, val[0], + val[2], [ val[3] ], val[4]) + + result +end + +def _reduce_299(val, _values, result) + result = @builder.not_op(val[0], val[1], val[2], val[3]) + + result +end + +def _reduce_300(val, _values, result) + result = @builder.not_op(val[0], val[1], nil, val[2]) + + result +end + +def _reduce_301(val, _values, result) + method_call = @builder.call_method(nil, nil, val[0]) + + begin_t, args, body, end_t = val[1] + result = @builder.block(method_call, + begin_t, args, body, end_t) + + result +end + +# reduce 302 omitted + +def _reduce_303(val, _values, result) + begin_t, args, body, end_t = val[1] + result = @builder.block(val[0], + begin_t, args, body, end_t) + + result +end + +def _reduce_304(val, _values, result) + result = @context.dup + @context.in_lambda = true + + result +end + +def _reduce_305(val, _values, result) + lambda_call = @builder.call_lambda(val[0]) + + args, (begin_t, body, end_t) = val[2] + result = @builder.block(lambda_call, + begin_t, args, body, end_t) + + @context.in_lambda = val[1].in_lambda + + result +end + +def _reduce_306(val, _values, result) + else_t, else_ = val[4] + result = @builder.condition(val[0], val[1], val[2], + val[3], else_t, + else_, val[5]) + + result +end + +def _reduce_307(val, _values, result) + else_t, else_ = val[4] + result = @builder.condition(val[0], val[1], val[2], + else_, else_t, + val[3], val[5]) + + result +end + +def _reduce_308(val, _values, result) + @lexer.cond.push(true) + + result +end + +def _reduce_309(val, _values, result) + @lexer.cond.pop + + result +end + +def _reduce_310(val, _values, result) + result = @builder.loop(:while, val[0], val[2], val[3], + val[5], val[6]) + + result +end + +def _reduce_311(val, _values, result) + @lexer.cond.push(true) + + result +end + +def _reduce_312(val, _values, result) + @lexer.cond.pop + + result +end + +def _reduce_313(val, _values, result) + result = @builder.loop(:until, val[0], val[2], val[3], + val[5], val[6]) + + result +end + +def _reduce_314(val, _values, result) + *when_bodies, (else_t, else_body) = *val[3] + + result = @builder.case(val[0], val[1], + when_bodies, else_t, else_body, + val[4]) + + result +end + +def _reduce_315(val, _values, result) + *when_bodies, (else_t, else_body) = *val[2] + + result = @builder.case(val[0], nil, + when_bodies, else_t, else_body, + val[3]) + + result +end + +def _reduce_316(val, _values, result) + @lexer.cond.push(true) + + result +end + +def _reduce_317(val, _values, result) + @lexer.cond.pop + + result +end + +def _reduce_318(val, _values, result) + result = @builder.for(val[0], val[1], + val[2], val[4], + val[5], val[7], val[8]) + + result +end + +def _reduce_319(val, _values, result) + local_push + @context.in_class = true + + result +end + +def _reduce_320(val, _values, result) + k_class, ctx = val[0] + if @context.in_def + diagnostic :error, :class_in_def, nil, k_class + end + + lt_t, superclass = val[2] + result = @builder.def_class(k_class, val[1], + lt_t, superclass, + val[4], val[5]) + + local_pop + @context.in_class = ctx.in_class + + result +end + +def _reduce_321(val, _values, result) + @context.in_def = false + @context.in_class = false + local_push + + result +end + +def _reduce_322(val, _values, result) + k_class, ctx = val[0] + result = @builder.def_sclass(k_class, val[1], val[2], + val[5], val[6]) + + local_pop + @context.in_def = ctx.in_def + @context.in_class = ctx.in_class + + result +end + +def _reduce_323(val, _values, result) + @context.in_class = true + local_push + + result +end + +def _reduce_324(val, _values, result) + k_mod, ctx = val[0] + if @context.in_def + diagnostic :error, :module_in_def, nil, k_mod + end + + result = @builder.def_module(k_mod, val[1], + val[3], val[4]) + + local_pop + @context.in_class = ctx.in_class + + result +end + +def _reduce_325(val, _values, result) + local_push + result = context.dup + @context.in_def = true + + result +end + +def _reduce_326(val, _values, result) + result = @builder.def_method(val[0], val[1], + val[3], val[4], val[5]) + + local_pop + @context.in_def = val[2].in_def + + result +end + +def _reduce_327(val, _values, result) + @lexer.state = :expr_fname + + result +end + +def _reduce_328(val, _values, result) + local_push + result = context.dup + @context.in_def = true + + result +end + +def _reduce_329(val, _values, result) + result = @builder.def_singleton(val[0], val[1], val[2], + val[4], val[6], val[7], val[8]) + + local_pop + @context.in_def = val[5].in_def + + result +end + +def _reduce_330(val, _values, result) + result = @builder.keyword_cmd(:break, val[0]) + + result +end + +def _reduce_331(val, _values, result) + result = @builder.keyword_cmd(:next, val[0]) + + result +end + +def _reduce_332(val, _values, result) + result = @builder.keyword_cmd(:redo, val[0]) + + result +end + +def _reduce_333(val, _values, result) + result = @builder.keyword_cmd(:retry, val[0]) + + result +end + +# reduce 334 omitted + +def _reduce_335(val, _values, result) + result = [ val[0], @context.dup ] + + result +end + +def _reduce_336(val, _values, result) + result = [ val[0], @context.dup ] + + result +end + +# reduce 337 omitted + +# reduce 338 omitted + +def _reduce_339(val, _values, result) + result = val[1] + + result +end + +# reduce 340 omitted + +# reduce 341 omitted + +# reduce 342 omitted + +def _reduce_343(val, _values, result) + else_t, else_ = val[4] + result = [ val[0], + @builder.condition(val[0], val[1], val[2], + val[3], else_t, + else_, nil), + ] + + result +end + +# reduce 344 omitted + +def _reduce_345(val, _values, result) + result = val + + result +end + +# reduce 346 omitted + +# reduce 347 omitted + +def _reduce_348(val, _values, result) + result = @builder.arg(val[0]) + + result +end + +def _reduce_349(val, _values, result) + result = @builder.multi_lhs(val[0], val[1], val[2]) + + result +end + +def _reduce_350(val, _values, result) + result = [ val[0] ] + + result +end + +def _reduce_351(val, _values, result) + result = val[0] << val[2] + + result +end + +# reduce 352 omitted + +def _reduce_353(val, _values, result) + result = val[0]. + push(@builder.restarg(val[2], val[3])) + + result +end + +def _reduce_354(val, _values, result) + result = val[0]. + push(@builder.restarg(val[2], val[3])). + concat(val[5]) + + result +end + +def _reduce_355(val, _values, result) + result = val[0]. + push(@builder.restarg(val[2])) + + result +end + +def _reduce_356(val, _values, result) + result = val[0]. + push(@builder.restarg(val[2])). + concat(val[4]) + + result +end + +def _reduce_357(val, _values, result) + result = [ @builder.restarg(val[0], val[1]) ] + + result +end + +def _reduce_358(val, _values, result) + result = [ @builder.restarg(val[0], val[1]), + *val[3] ] + + result +end + +def _reduce_359(val, _values, result) + result = [ @builder.restarg(val[0]) ] + + result +end + +def _reduce_360(val, _values, result) + result = [ @builder.restarg(val[0]), + *val[2] ] + + result +end + +def _reduce_361(val, _values, result) + result = val[0].concat(val[2]).concat(val[3]) + + result +end + +def _reduce_362(val, _values, result) + result = val[0].concat(val[1]) + + result +end + +def _reduce_363(val, _values, result) + result = val[0].concat(val[1]) + + result +end + +def _reduce_364(val, _values, result) + result = [ val[0] ] + + result +end + +def _reduce_365(val, _values, result) + result = val[1] + + result +end + +def _reduce_366(val, _values, result) + result = [] + + result +end + +def _reduce_367(val, _values, result) + result = val[0]. + concat(val[2]). + concat(val[4]). + concat(val[5]) + + result +end + +def _reduce_368(val, _values, result) + result = val[0]. + concat(val[2]). + concat(val[4]). + concat(val[6]). + concat(val[7]) + + result +end + +def _reduce_369(val, _values, result) + result = val[0]. + concat(val[2]). + concat(val[3]) + + result +end + +def _reduce_370(val, _values, result) + result = val[0]. + concat(val[2]). + concat(val[4]). + concat(val[5]) + + result +end + +def _reduce_371(val, _values, result) + result = val[0]. + concat(val[2]). + concat(val[3]) + + result +end + +# reduce 372 omitted + +def _reduce_373(val, _values, result) + result = val[0]. + concat(val[2]). + concat(val[4]). + concat(val[5]) + + result +end + +def _reduce_374(val, _values, result) + if val[1].empty? && val[0].size == 1 + result = [@builder.procarg0(val[0][0])] + else + result = val[0].concat(val[1]) + end + + result +end + +def _reduce_375(val, _values, result) + result = val[0]. + concat(val[2]). + concat(val[3]) + + result +end + +def _reduce_376(val, _values, result) + result = val[0]. + concat(val[2]). + concat(val[4]). + concat(val[5]) + + result +end + +def _reduce_377(val, _values, result) + result = val[0]. + concat(val[1]) + + result +end + +def _reduce_378(val, _values, result) + result = val[0]. + concat(val[2]). + concat(val[3]) + + result +end + +def _reduce_379(val, _values, result) + result = val[0]. + concat(val[1]) + + result +end + +def _reduce_380(val, _values, result) + result = val[0]. + concat(val[2]). + concat(val[3]) + + result +end + +# reduce 381 omitted + +def _reduce_382(val, _values, result) + result = @builder.args(nil, [], nil) + + result +end + +def _reduce_383(val, _values, result) + @lexer.state = :expr_value + + result +end + +def _reduce_384(val, _values, result) + result = @builder.args(val[0], val[1], val[2]) + + result +end + +def _reduce_385(val, _values, result) + result = @builder.args(val[0], [], val[0]) + + result +end + +def _reduce_386(val, _values, result) + result = @builder.args(val[0], val[1].concat(val[2]), val[3]) + + result +end + +def _reduce_387(val, _values, result) + result = [] + + result +end + +def _reduce_388(val, _values, result) + result = val[2] + + result +end + +def _reduce_389(val, _values, result) + result = [ val[0] ] + + result +end + +def _reduce_390(val, _values, result) + result = val[0] << val[2] + + result +end + +def _reduce_391(val, _values, result) + @static_env.declare val[0][0] + result = @builder.shadowarg(val[0]) + + result +end + +# reduce 392 omitted + +def _reduce_393(val, _values, result) + @static_env.extend_dynamic + + result +end + +def _reduce_394(val, _values, result) + @lexer.cmdarg.push(false) + + result +end + +def _reduce_395(val, _values, result) + @lexer.cmdarg.pop + + result = [ val[1], val[3] ] + + @static_env.unextend + + result +end + +def _reduce_396(val, _values, result) + result = @builder.args(val[0], val[1].concat(val[2]), val[3]) + + result +end + +def _reduce_397(val, _values, result) + result = @builder.args(nil, val[0], nil) + + result +end + +def _reduce_398(val, _values, result) + result = @context.dup + @context.in_lambda = true + + result +end + +def _reduce_399(val, _values, result) + result = [ val[0], val[2], val[3] ] + @context.in_lambda = val[1].in_lambda + + result +end + +def _reduce_400(val, _values, result) + result = @context.dup + @context.in_lambda = true + + result +end + +def _reduce_401(val, _values, result) + result = [ val[0], val[2], val[3] ] + @context.in_lambda = val[1].in_lambda + + result +end + +def _reduce_402(val, _values, result) + result = @context.dup + @context.in_block = true + + result +end + +def _reduce_403(val, _values, result) + result = [ val[0], *val[2], val[3] ] + @context.in_block = val[1].in_block + + result +end + +def _reduce_404(val, _values, result) + begin_t, block_args, body, end_t = val[1] + result = @builder.block(val[0], + begin_t, block_args, body, end_t) + + result +end + +def _reduce_405(val, _values, result) + lparen_t, args, rparen_t = val[3] + result = @builder.call_method(val[0], val[1], val[2], + lparen_t, args, rparen_t) + + result +end + +def _reduce_406(val, _values, result) + lparen_t, args, rparen_t = val[3] + method_call = @builder.call_method(val[0], val[1], val[2], + lparen_t, args, rparen_t) + + begin_t, args, body, end_t = val[4] + result = @builder.block(method_call, + begin_t, args, body, end_t) + + result +end + +def _reduce_407(val, _values, result) + method_call = @builder.call_method(val[0], val[1], val[2], + nil, val[3], nil) + + begin_t, args, body, end_t = val[4] + result = @builder.block(method_call, + begin_t, args, body, end_t) + + result +end + +def _reduce_408(val, _values, result) + lparen_t, args, rparen_t = val[1] + result = @builder.call_method(nil, nil, val[0], + lparen_t, args, rparen_t) + + result +end + +def _reduce_409(val, _values, result) + lparen_t, args, rparen_t = val[3] + result = @builder.call_method(val[0], val[1], val[2], + lparen_t, args, rparen_t) + + result +end + +def _reduce_410(val, _values, result) + lparen_t, args, rparen_t = val[3] + result = @builder.call_method(val[0], val[1], val[2], + lparen_t, args, rparen_t) + + result +end + +def _reduce_411(val, _values, result) + result = @builder.call_method(val[0], val[1], val[2]) + + result +end + +def _reduce_412(val, _values, result) + lparen_t, args, rparen_t = val[2] + result = @builder.call_method(val[0], val[1], nil, + lparen_t, args, rparen_t) + + result +end + +def _reduce_413(val, _values, result) + lparen_t, args, rparen_t = val[2] + result = @builder.call_method(val[0], val[1], nil, + lparen_t, args, rparen_t) + + result +end + +def _reduce_414(val, _values, result) + lparen_t, args, rparen_t = val[1] + result = @builder.keyword_cmd(:super, val[0], + lparen_t, args, rparen_t) + + result +end + +def _reduce_415(val, _values, result) + result = @builder.keyword_cmd(:zsuper, val[0]) + + result +end + +def _reduce_416(val, _values, result) + result = @builder.index(val[0], val[1], val[2], val[3]) + + result +end + +def _reduce_417(val, _values, result) + result = @context.dup + @context.in_block = true + + result +end + +def _reduce_418(val, _values, result) + result = [ val[0], *val[2], val[3] ] + @context.in_block = val[1].in_block + + result +end + +def _reduce_419(val, _values, result) + result = @context.dup + @context.in_block = true + + result +end + +def _reduce_420(val, _values, result) + result = [ val[0], *val[2], val[3] ] + @context.in_block = val[1].in_block + + result +end + +def _reduce_421(val, _values, result) + @static_env.extend_dynamic + + result +end + +def _reduce_422(val, _values, result) + result = [ val[1], val[2] ] + + @static_env.unextend + + result +end + +def _reduce_423(val, _values, result) + @static_env.extend_dynamic + + result +end + +def _reduce_424(val, _values, result) + @lexer.cmdarg.push(false) + + result +end + +def _reduce_425(val, _values, result) + result = [ val[2], val[3] ] + + @static_env.unextend + @lexer.cmdarg.pop + + result +end + +def _reduce_426(val, _values, result) + result = [ @builder.when(val[0], val[1], val[2], val[3]), + *val[4] ] + + result +end + +def _reduce_427(val, _values, result) + result = [ val[0] ] + + result +end + +# reduce 428 omitted + +def _reduce_429(val, _values, result) + assoc_t, exc_var = val[2] + + if val[1] + exc_list = @builder.array(nil, val[1], nil) + end + + result = [ @builder.rescue_body(val[0], + exc_list, assoc_t, exc_var, + val[3], val[4]), + *val[5] ] + + result +end + +def _reduce_430(val, _values, result) + result = [] + + result +end + +def _reduce_431(val, _values, result) + result = [ val[0] ] + + result +end + +# reduce 432 omitted + +# reduce 433 omitted + +def _reduce_434(val, _values, result) + result = [ val[0], val[1] ] + + result +end + +# reduce 435 omitted + +def _reduce_436(val, _values, result) + result = [ val[0], val[1] ] + + result +end + +# reduce 437 omitted + +# reduce 438 omitted + +# reduce 439 omitted + +# reduce 440 omitted + +def _reduce_441(val, _values, result) + result = @builder.string_compose(nil, val[0], nil) + + result +end + +def _reduce_442(val, _values, result) + result = [ val[0] ] + + result +end + +def _reduce_443(val, _values, result) + result = val[0] << val[1] + + result +end + +def _reduce_444(val, _values, result) + string = @builder.string_compose(val[0], val[1], val[2]) + result = @builder.dedent_string(string, @lexer.dedent_level) + + result +end + +def _reduce_445(val, _values, result) + string = @builder.string(val[0]) + result = @builder.dedent_string(string, @lexer.dedent_level) + + result +end + +def _reduce_446(val, _values, result) + result = @builder.character(val[0]) + + result +end + +def _reduce_447(val, _values, result) + string = @builder.xstring_compose(val[0], val[1], val[2]) + result = @builder.dedent_string(string, @lexer.dedent_level) + + result +end + +def _reduce_448(val, _values, result) + opts = @builder.regexp_options(val[3]) + result = @builder.regexp_compose(val[0], val[1], val[2], opts) + + result +end + +def _reduce_449(val, _values, result) + result = @builder.words_compose(val[0], val[1], val[2]) + + result +end + +def _reduce_450(val, _values, result) + result = [] + + result +end + +def _reduce_451(val, _values, result) + result = val[0] << @builder.word(val[1]) + + result +end + +def _reduce_452(val, _values, result) + result = [ val[0] ] + + result +end + +def _reduce_453(val, _values, result) + result = val[0] << val[1] + + result +end + +def _reduce_454(val, _values, result) + result = @builder.symbols_compose(val[0], val[1], val[2]) + + result +end + +def _reduce_455(val, _values, result) + result = [] + + result +end + +def _reduce_456(val, _values, result) + result = val[0] << @builder.word(val[1]) + + result +end + +def _reduce_457(val, _values, result) + result = @builder.words_compose(val[0], val[1], val[2]) + + result +end + +def _reduce_458(val, _values, result) + result = @builder.symbols_compose(val[0], val[1], val[2]) + + result +end + +def _reduce_459(val, _values, result) + result = [] + + result +end + +def _reduce_460(val, _values, result) + result = val[0] << @builder.string_internal(val[1]) + + result +end + +def _reduce_461(val, _values, result) + result = [] + + result +end + +def _reduce_462(val, _values, result) + result = val[0] << @builder.symbol_internal(val[1]) + + result +end + +def _reduce_463(val, _values, result) + result = [] + + result +end + +def _reduce_464(val, _values, result) + result = val[0] << val[1] + + result +end + +def _reduce_465(val, _values, result) + result = [] + + result +end + +def _reduce_466(val, _values, result) + result = val[0] << val[1] + + result +end + +def _reduce_467(val, _values, result) + result = [] + + result +end + +def _reduce_468(val, _values, result) + result = val[0] << val[1] + + result +end + +def _reduce_469(val, _values, result) + result = @builder.string_internal(val[0]) + + result +end + +def _reduce_470(val, _values, result) + result = val[1] + + result +end + +def _reduce_471(val, _values, result) + @lexer.cmdarg.push(false) + @lexer.cond.push(false) + + result +end + +def _reduce_472(val, _values, result) + @lexer.cmdarg.pop + @lexer.cond.pop + + result = @builder.begin(val[0], val[2], val[3]) + + result +end + +def _reduce_473(val, _values, result) + result = @builder.gvar(val[0]) + + result +end + +def _reduce_474(val, _values, result) + result = @builder.ivar(val[0]) + + result +end + +def _reduce_475(val, _values, result) + result = @builder.cvar(val[0]) + + result +end + +# reduce 476 omitted + +def _reduce_477(val, _values, result) + @lexer.state = :expr_end + result = @builder.symbol(val[0]) + + result +end + +def _reduce_478(val, _values, result) + @lexer.state = :expr_end + result = @builder.symbol_compose(val[0], val[1], val[2]) + + result +end + +def _reduce_479(val, _values, result) + result = val[0] + + result +end + +def _reduce_480(val, _values, result) + if @builder.respond_to? :negate + # AST builder interface compatibility + result = @builder.negate(val[0], val[1]) + else + result = @builder.unary_num(val[0], val[1]) + end + + result +end + +def _reduce_481(val, _values, result) + @lexer.state = :expr_end + result = @builder.integer(val[0]) + + result +end + +def _reduce_482(val, _values, result) + @lexer.state = :expr_end + result = @builder.float(val[0]) + + result +end + +def _reduce_483(val, _values, result) + @lexer.state = :expr_end + result = @builder.rational(val[0]) + + result +end + +def _reduce_484(val, _values, result) + @lexer.state = :expr_end + result = @builder.complex(val[0]) + + result +end + +def _reduce_485(val, _values, result) + result = @builder.ident(val[0]) + + result +end + +def _reduce_486(val, _values, result) + result = @builder.ivar(val[0]) + + result +end + +def _reduce_487(val, _values, result) + result = @builder.gvar(val[0]) + + result +end + +def _reduce_488(val, _values, result) + result = @builder.const(val[0]) + + result +end + +def _reduce_489(val, _values, result) + result = @builder.cvar(val[0]) + + result +end + +def _reduce_490(val, _values, result) + result = @builder.nil(val[0]) + + result +end + +def _reduce_491(val, _values, result) + result = @builder.self(val[0]) + + result +end + +def _reduce_492(val, _values, result) + result = @builder.true(val[0]) + + result +end + +def _reduce_493(val, _values, result) + result = @builder.false(val[0]) + + result +end + +def _reduce_494(val, _values, result) + result = @builder.__FILE__(val[0]) + + result +end + +def _reduce_495(val, _values, result) + result = @builder.__LINE__(val[0]) + + result +end + +def _reduce_496(val, _values, result) + result = @builder.__ENCODING__(val[0]) + + result +end + +def _reduce_497(val, _values, result) + result = @builder.accessible(val[0]) + + result +end + +def _reduce_498(val, _values, result) + result = @builder.accessible(val[0]) + + result +end + +def _reduce_499(val, _values, result) + result = @builder.assignable(val[0]) + + result +end + +def _reduce_500(val, _values, result) + result = @builder.assignable(val[0]) + + result +end + +def _reduce_501(val, _values, result) + result = @builder.nth_ref(val[0]) + + result +end + +def _reduce_502(val, _values, result) + result = @builder.back_ref(val[0]) + + result +end + +def _reduce_503(val, _values, result) + @lexer.state = :expr_value + + result +end + +def _reduce_504(val, _values, result) + result = [ val[0], val[2] ] + + result +end + +def _reduce_505(val, _values, result) + result = nil + + result +end + +def _reduce_506(val, _values, result) + result = @builder.args(val[0], val[1], val[2]) + + @lexer.state = :expr_value + + result +end + +def _reduce_507(val, _values, result) + result = @context.in_kwarg + @context.in_kwarg = true + + result +end + +def _reduce_508(val, _values, result) + @context.in_kwarg = val[0] + result = @builder.args(nil, val[1], nil) + + result +end + +def _reduce_509(val, _values, result) + result = val[0].concat(val[2]).concat(val[3]) + + result +end + +def _reduce_510(val, _values, result) + result = val[0].concat(val[1]) + + result +end + +def _reduce_511(val, _values, result) + result = val[0].concat(val[1]) + + result +end + +def _reduce_512(val, _values, result) + result = [ val[0] ] + + result +end + +def _reduce_513(val, _values, result) + result = val[1] + + result +end + +def _reduce_514(val, _values, result) + result = [] + + result +end + +def _reduce_515(val, _values, result) + result = val[0]. + concat(val[2]). + concat(val[4]). + concat(val[5]) + + result +end + +def _reduce_516(val, _values, result) + result = val[0]. + concat(val[2]). + concat(val[4]). + concat(val[6]). + concat(val[7]) + + result +end + +def _reduce_517(val, _values, result) + result = val[0]. + concat(val[2]). + concat(val[3]) + + result +end + +def _reduce_518(val, _values, result) + result = val[0]. + concat(val[2]). + concat(val[4]). + concat(val[5]) + + result +end + +def _reduce_519(val, _values, result) + result = val[0]. + concat(val[2]). + concat(val[3]) + + result +end + +def _reduce_520(val, _values, result) + result = val[0]. + concat(val[2]). + concat(val[4]). + concat(val[5]) + + result +end + +def _reduce_521(val, _values, result) + result = val[0]. + concat(val[1]) + + result +end + +def _reduce_522(val, _values, result) + result = val[0]. + concat(val[2]). + concat(val[3]) + + result +end + +def _reduce_523(val, _values, result) + result = val[0]. + concat(val[2]). + concat(val[4]). + concat(val[5]) + + result +end + +def _reduce_524(val, _values, result) + result = val[0]. + concat(val[1]) + + result +end + +def _reduce_525(val, _values, result) + result = val[0]. + concat(val[2]). + concat(val[3]) + + result +end + +def _reduce_526(val, _values, result) + result = val[0]. + concat(val[1]) + + result +end + +def _reduce_527(val, _values, result) + result = val[0]. + concat(val[2]). + concat(val[3]) + + result +end + +def _reduce_528(val, _values, result) + result = val[0] + + result +end + +def _reduce_529(val, _values, result) + result = [] + + result +end + +def _reduce_530(val, _values, result) + diagnostic :error, :argument_const, nil, val[0] + + result +end + +def _reduce_531(val, _values, result) + diagnostic :error, :argument_ivar, nil, val[0] + + result +end + +def _reduce_532(val, _values, result) + diagnostic :error, :argument_gvar, nil, val[0] + + result +end + +def _reduce_533(val, _values, result) + diagnostic :error, :argument_cvar, nil, val[0] + + result +end + +# reduce 534 omitted + +def _reduce_535(val, _values, result) + @static_env.declare val[0][0] + + result = val[0] + + result +end + +def _reduce_536(val, _values, result) + result = val[0] + + result +end + +def _reduce_537(val, _values, result) + result = @builder.arg(val[0]) + + result +end + +def _reduce_538(val, _values, result) + result = @builder.multi_lhs(val[0], val[1], val[2]) + + result +end + +def _reduce_539(val, _values, result) + result = [ val[0] ] + + result +end + +def _reduce_540(val, _values, result) + result = val[0] << val[2] + + result +end + +def _reduce_541(val, _values, result) + check_kwarg_name(val[0]) + + @static_env.declare val[0][0] + + result = val[0] + + result +end + +def _reduce_542(val, _values, result) + result = @builder.kwoptarg(val[0], val[1]) + + result +end + +def _reduce_543(val, _values, result) + result = @builder.kwarg(val[0]) + + result +end + +def _reduce_544(val, _values, result) + result = @builder.kwoptarg(val[0], val[1]) + + result +end + +def _reduce_545(val, _values, result) + result = @builder.kwarg(val[0]) + + result +end + +def _reduce_546(val, _values, result) + result = [ val[0] ] + + result +end + +def _reduce_547(val, _values, result) + result = val[0] << val[2] + + result +end + +def _reduce_548(val, _values, result) + result = [ val[0] ] + + result +end + +def _reduce_549(val, _values, result) + result = val[0] << val[2] + + result +end + +# reduce 550 omitted + +# reduce 551 omitted + +def _reduce_552(val, _values, result) + @static_env.declare val[1][0] + + result = [ @builder.kwrestarg(val[0], val[1]) ] + + result +end + +def _reduce_553(val, _values, result) + result = [ @builder.kwrestarg(val[0]) ] + + result +end + +def _reduce_554(val, _values, result) + result = @builder.optarg(val[0], val[1], val[2]) + + result +end + +def _reduce_555(val, _values, result) + result = @builder.optarg(val[0], val[1], val[2]) + + result +end + +def _reduce_556(val, _values, result) + result = [ val[0] ] + + result +end + +def _reduce_557(val, _values, result) + result = val[0] << val[2] + + result +end + +def _reduce_558(val, _values, result) + result = [ val[0] ] + + result +end + +def _reduce_559(val, _values, result) + result = val[0] << val[2] + + result +end + +# reduce 560 omitted + +# reduce 561 omitted + +def _reduce_562(val, _values, result) + @static_env.declare val[1][0] + + result = [ @builder.restarg(val[0], val[1]) ] + + result +end + +def _reduce_563(val, _values, result) + result = [ @builder.restarg(val[0]) ] + + result +end + +# reduce 564 omitted + +# reduce 565 omitted + +def _reduce_566(val, _values, result) + @static_env.declare val[1][0] + + result = @builder.blockarg(val[0], val[1]) + + result +end + +def _reduce_567(val, _values, result) + result = [ val[1] ] + + result +end + +def _reduce_568(val, _values, result) + result = [] + + result +end + +# reduce 569 omitted + +def _reduce_570(val, _values, result) + result = val[1] + + result +end + +def _reduce_571(val, _values, result) + result = [] + + result +end + +# reduce 572 omitted + +def _reduce_573(val, _values, result) + result = [ val[0] ] + + result +end + +def _reduce_574(val, _values, result) + result = val[0] << val[2] + + result +end + +def _reduce_575(val, _values, result) + result = @builder.pair(val[0], val[1], val[2]) + + result +end + +def _reduce_576(val, _values, result) + result = @builder.pair_keyword(val[0], val[1]) + + result +end + +def _reduce_577(val, _values, result) + result = @builder.pair_quoted(val[0], val[1], val[2], val[3]) + + result +end + +def _reduce_578(val, _values, result) + result = @builder.kwsplat(val[0], val[1]) + + result +end + +# reduce 579 omitted + +# reduce 580 omitted + +# reduce 581 omitted + +# reduce 582 omitted + +# reduce 583 omitted + +# reduce 584 omitted + +# reduce 585 omitted + +# reduce 586 omitted + +# reduce 587 omitted + +# reduce 588 omitted + +# reduce 589 omitted + +# reduce 590 omitted + +def _reduce_591(val, _values, result) + result = [:dot, val[0][1]] + + result +end + +def _reduce_592(val, _values, result) + result = [:anddot, val[0][1]] + + result +end + +# reduce 593 omitted + +# reduce 594 omitted + +# reduce 595 omitted + +# reduce 596 omitted + +def _reduce_597(val, _values, result) + result = val[1] + + result +end + +def _reduce_598(val, _values, result) + result = val[1] + + result +end + +# reduce 599 omitted + +# reduce 600 omitted + +# reduce 601 omitted + +def _reduce_602(val, _values, result) + yyerrok + + result +end + +# reduce 603 omitted + +# reduce 604 omitted + +# reduce 605 omitted + +def _reduce_606(val, _values, result) + result = nil + + result +end + +def _reduce_none(val, _values, result) + val[0] +end + + end # class Ruby24 + end # module Parser diff --git a/vendor/bundle/ruby/3.1.0/gems/parser-3.1.2.0/lib/parser/ruby25.rb b/vendor/bundle/ruby/3.1.0/gems/parser-3.1.2.0/lib/parser/ruby25.rb new file mode 100644 index 000000000..e13e5b7c8 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/parser-3.1.2.0/lib/parser/ruby25.rb @@ -0,0 +1,6694 @@ +# -*- encoding:utf-8; warn-indent:false; frozen_string_literal: true -*- +# +# DO NOT MODIFY!!!! +# This file is automatically generated by Racc 1.4.15 +# from Racc grammer file "". +# + +require 'racc/parser.rb' + + +require 'parser' + +module Parser + class Ruby25 < Parser::Base + + + def version + 25 + end + + def default_encoding + Encoding::UTF_8 + end + + def local_push + @static_env.extend_static + @lexer.cmdarg.push(false) + @lexer.cond.push(false) + end + + def local_pop + @static_env.unextend + @lexer.cmdarg.pop + @lexer.cond.pop + end +##### State transition tables begin ### + +clist = [ +'-587,610,549,214,215,-109,-107,-587,-587,-587,224,549,-587,-587,-587', +'779,-587,276,549,872,245,-88,549,590,779,-587,-587,-587,-587,-102,562', +'-74,985,592,563,-110,-587,-587,-104,-587,-587,-587,-587,-587,-105,-103', +'-107,-109,-110,1027,778,225,242,995,214,215,244,243,-105,778,214,215', +'995,-104,-103,-105,-587,-587,-587,-587,-587,-587,-587,-587,-587,-587', +'-587,-587,-587,-587,117,-108,-587,-587,-587,116,767,-587,549,589,-587', +'-102,-106,-587,-587,995,-587,225,-587,591,-587,113,-587,-587,275,-587', +'-587,-587,-587,-587,-296,-587,-587,-587,-100,-98,705,-296,-296,-296', +'117,-106,940,-296,-296,116,-296,-587,871,117,-587,-587,-587,-587,116', +'-587,117,-587,-93,825,117,116,-587,-106,-101,116,-296,-296,225,-296', +'-296,-296,-296,-296,225,276,-104,-583,-584,-108,-96,-104,-105,-103,-107', +'-109,-110,-105,-103,-107,-109,-110,-95,-94,-96,985,-296,-296,-296,-296', +'-296,-296,-296,-296,-296,-296,-296,-296,-296,-296,276,222,-296,-296', +'-296,220,615,608,-583,-108,-296,-97,269,-296,-108,995,117,-95,-296,-102', +'-296,116,-296,-296,-102,-296,-296,-296,-296,-296,117,-296,-587,-296', +'-584,116,-96,458,752,-587,-587,-587,95,96,609,-587,-587,-296,-587,-106', +'-296,-296,275,-296,-106,-296,-500,-587,-110,214,215,117,-296,-108,271', +'-581,116,276,-587,-587,221,-587,-587,-587,-587,-587,-96,220,-99,-96', +'791,117,556,-95,969,577,116,275,225,-96,-97,95,96,567,-110,-104,214', +'215,-587,-587,-587,-587,-587,-587,-587,-587,-587,-587,-587,-587,-587', +'-587,604,-102,-587,-587,-587,-489,616,-501,97,98,-587,-95,-489,-587', +'-95,-587,577,-581,-587,271,-587,-489,-587,-587,-95,-587,-587,-587,-587', +'-587,221,-587,-587,-587,-98,822,791,579,578,575,-581,117,275,-583,-97', +'271,116,-587,577,600,-587,-587,-587,-97,643,-587,599,97,98,-587,-587', +'-587,-587,-106,-103,-587,-587,-587,-587,682,-489,679,678,677,-587,680', +'844,-587,620,-583,579,578,577,-587,-97,822,791,-97,-587,-587,737,-587', +'-587,-587,-587,-587,117,-97,117,-269,-98,116,-587,116,682,597,679,678', +'677,220,680,594,579,578,575,611,269,245,-587,-587,-587,-587,-587,-587', +'-587,-587,-587,-587,-587,-587,-587,-587,-587,-104,-587,-587,-587,245', +'616,245,-98,245,-587,-98,577,-587,579,578,577,526,-587,983,-587,-98', +'-587,-587,739,-587,-587,-587,-587,-587,-296,-587,-587,-587,765,225,752', +'-296,-296,-296,-107,225,221,-296,-296,539,-296,-587,541,225,-587,-587', +'999,-587,890,-587,539,539,-580,541,538,766,-587,-106,-100,225,-296,-296', +'222,-296,-296,-296,-296,-296,-109,-88,579,578,593,220,579,578,584,-95', +'539,-493,565,541,646,526,225,-105,-493,-104,532,567,-296,-296,-296,-296', +'-296,-296,-296,-296,-296,-296,-296,-296,-296,-296,-486,657,-296,-296', +'-296,-101,615,-486,-107,662,-296,577,-580,-296,577,-110,-486,577,-296', +'663,-296,225,-296,-296,665,-296,-296,-296,-296,-296,-486,-296,701,-296', +'221,-580,-109,-486,-486,-486,-493,706,-486,-486,-486,-297,-486,-296', +'262,263,-296,-296,-297,-99,-486,-296,-486,-486,-486,214,215,-297,-296', +'-108,707,-486,-486,-486,556,-486,-486,-486,-486,-486,709,579,578,588', +'579,578,580,579,578,582,261,260,405,-492,-491,698,697,407,406,569,-492', +'-491,-486,-486,-486,-486,-486,-486,-486,-486,-486,-486,-486,-486,-486', +'-486,-297,220,-486,-486,-486,220,-486,-486,559,561,-486,560,455,-486', +'-486,726,-486,557,-486,736,-486,456,-486,-486,740,-486,-486,-486,-486', +'-486,-494,-486,-489,-486,741,397,-270,-494,556,-489,-489,-489,-492,-491', +'-489,-489,-489,-486,-489,501,-486,-486,-486,-486,753,-486,-489,-486', +'-489,-489,-489,543,-486,-486,83,542,221,488,-489,-489,221,-489,-489', +'-489,-489,-489,84,-334,225,488,245,220,-497,-495,-334,-496,85,225,529', +'-497,-495,770,-496,-334,771,-494,265,456,-489,-489,-489,-489,-489,-489', +'-489,-489,-489,-489,-489,-489,-489,-489,776,-297,-489,-489,-489,220', +'-489,-489,-297,781,-489,499,969,-489,-489,501,-489,-297,-489,527,-489', +'567,-489,-489,523,-489,-489,-489,-489,-489,-334,-489,-296,-489,221,-497', +'-495,657,-496,-296,-296,-296,225,271,-296,-296,-296,-489,-296,271,-489', +'-489,-489,-489,271,-489,657,-489,-296,-296,-296,225,-489,-489,245,280', +'-297,791,-296,-296,221,-296,-296,-296,-296,-296,611,220,799,220,802', +'-287,-489,-486,974,803,219,805,-287,-489,-486,807,809,972,520,217,817', +'-287,-296,-296,-296,-296,-296,-296,-296,-296,-296,-296,-296,-296,-296', +'-296,818,819,-296,-296,-296,791,768,-296,220,824,-296,-98,610,-296,-296', +'603,-296,225,-296,513,-296,-107,-296,-296,601,-296,-296,-296,-296,-296', +'221,-296,221,-296,-287,-489,-486,512,682,225,679,678,677,-73,680,-501', +'225,-296,126,-500,-296,-296,-296,-296,833,-296,501,-296,-588,-96,499', +'-271,-296,-108,497,-588,-588,-588,687,-105,-588,-588,-588,221,-588,811', +'225,488,690,843,224,245,460,-588,-588,-588,-588,966,459,679,678,677', +'-94,680,-588,-588,-93,-588,-588,-588,-588,-588,-103,-296,457,847,-102', +'220,657,864,-296,698,697,242,519,-584,691,244,243,-296,240,241,-269', +'517,-588,-588,-588,-588,-588,-588,-588,-588,-588,-588,-588,-588,-588', +'-588,868,-499,-588,-588,-588,225,888,-588,-499,225,-588,892,408,-588', +'-588,894,-588,-499,-588,395,-588,897,-588,-588,898,-588,-588,-588,-588', +'-588,-296,-588,-588,-588,221,901,225,905,-498,-272,682,225,679,678,677', +'-498,680,-588,907,802,-588,-588,-588,-588,-498,-588,-589,-588,910,912', +'914,687,-588,-589,-589,-589,-499,916,-589,-589,-589,690,-589,225,918', +'245,919,811,325,932,802,-589,-589,-589,-589,966,814,679,678,677,934', +'680,-589,-589,936,-589,-589,-589,-589,-589,938,-296,940,-498,698,697', +'940,242,-296,691,225,244,243,-584,240,241,946,-296,324,952,726,963,-589', +'-589,-589,-589,-589,-589,-589,-589,-589,-589,-589,-589,-589,-589,970', +'265,-589,-589,-589,975,985,-589,216,802,-589,989,245,-589,-589,991,-589', +'993,-589,995,-589,995,-589,-589,662,-589,-589,-589,-589,-589,-296,-589', +'-589,-589,682,213,679,678,677,682,680,679,678,677,242,680,212,-589,244', +'243,-589,-589,-589,-589,1008,-589,-288,-589,1009,1010,940,940,-589,-288', +'-288,-288,940,1015,-288,-288,-288,811,-288,245,985,1018,811,-584,-583', +'225,814,211,-288,-288,-288,945,126,,,255,256,,-288,-288,,-288,-288,-288', +'-288,-288,682,,679,678,677,242,680,248,,244,243,,240,241,,,246,,247', +',,,-288,-288,-288,-288,-288,-288,-288,-288,-288,-288,-288,-288,-288', +'-288,,811,-288,-288,-288,,,-288,,,-288,,,-288,-288,,-288,,-288,,-288', +',-288,-288,,-288,-288,-288,-288,-288,,-288,,-288,731,732,,,733,111,112', +',682,,679,678,677,-288,680,,-288,-288,-288,-288,,-288,-252,-288,,,,', +'-288,-252,-252,-252,,,-252,-252,-252,682,-252,679,678,677,687,680,,811', +',-252,-252,,,,690,,,245,,,-252,-252,,-252,-252,-252,-252,-252,120,121', +'122,123,124,255,256,,685,120,121,122,123,124,,,,695,694,698,697,242', +',248,691,244,243,,240,241,,,246,-252,247,-416,,,,,-252,,-416,-416,-416', +'271,-252,-416,-416,-416,225,-416,682,,679,678,677,,680,,-416,-416,-416', +'120,121,122,123,124,-252,-252,,-416,-416,,-416,-416,-416,-416,-416,', +',,,-252,,,-252,,,811,682,-252,679,678,677,,680,,-252,,,-416,-416,-416', +'-416,-416,-416,-416,-416,-416,-416,-416,-416,-416,-416,,,-416,-416,-416', +',,-416,,271,-416,,811,-416,-416,,-416,,-416,,-416,,-416,-416,,-416,-416', +'-416,-416,-416,-303,-416,-416,-416,,,,-303,-303,-303,,,-303,-303,-303', +',-303,-416,245,,-416,-416,,-416,,-416,-303,-303,,,,,-416,,255,256,-303', +'-303,,-303,-303,-303,-303,-303,120,121,122,123,124,,242,,248,,244,243', +',240,241,,,,,,,,-303,-303,-303,-303,-303,-303,-303,-303,-303,-303,-303', +'-303,-303,-303,,,-303,-303,-303,,,-303,,280,-303,,,-303,-303,,-303,', +'-303,,-303,,-303,-303,,-303,-303,-303,-303,-303,,-303,-252,-303,,,,', +',-252,-252,-252,,,-252,-252,-252,-303,-252,245,-303,-303,,-303,,-303', +',-252,-252,-252,,,-303,,,255,256,,-252,-252,,-252,-252,-252,-252,-252', +',,,,,242,,,,244,243,,240,241,,,,,,,,,-252,-252,-252,-252,-252,-252,-252', +'-252,-252,-252,-252,-252,-252,-252,,,-252,-252,-252,,,-252,,271,-252', +',,-252,-252,,-252,,-252,,-252,,-252,-252,,-252,-252,-252,-252,-252,', +'-252,-252,-252,,,,,,,,,,,,,,-252,,,-252,-252,,-252,,-252,298,75,76,72', +'9,58,-252,,,64,65,,,,68,,66,67,69,30,31,73,74,,,,,,77,28,27,105,104', +'106,107,,,19,,,,,605,8,46,300,10,109,108,110,99,57,101,100,102,,103', +'111,112,,95,96,42,43,41,245,249,250,251,252,262,263,257,258,253,254', +',238,239,,,255,256,,40,,,33,,,59,60,,,61,,35,242,,248,45,244,243,,240', +'241,261,260,246,20,247,,,,93,83,86,87,,88,90,89,91,,,,,84,92,,259,,-244', +',,63,,85,97,98,5,75,76,72,9,58,,,,64,65,,,,68,,66,67,69,30,31,73,74', +',,,,,77,28,27,105,104,106,107,,,19,,,,,605,8,46,7,10,109,108,110,99', +'57,101,100,102,,103,111,112,,95,96,42,43,41,245,249,250,251,252,262', +'263,257,258,253,254,,238,239,,,255,256,,40,,,33,,,59,60,,,61,,35,242', +',248,45,244,243,,240,241,261,260,246,20,247,,,,93,83,86,87,,88,90,89', +'91,,,,,84,92,,259,,,,,63,,85,97,98,298,75,76,72,9,58,,,,64,65,,,,68', +',66,67,69,30,31,73,74,,,,,,77,28,27,105,104,106,107,,,19,,,,,,8,46,300', +'10,109,108,110,99,57,101,100,102,,103,111,112,,95,96,42,43,41,245,249', +'250,251,252,262,263,257,258,253,254,,238,239,,,255,256,,40,,,302,,,59', +'60,,,61,,35,242,,248,45,244,243,,240,241,261,260,246,20,247,,,,93,83', +'86,87,,88,90,89,91,,,,,84,92,,259,,,,,63,,85,97,98,298,75,76,72,9,58', +',,,64,65,,,,68,,66,67,69,30,31,73,74,,,,,,77,28,27,105,104,106,107,', +',19,,,,,,8,46,300,10,109,108,110,99,57,101,100,102,,103,111,112,,95', +'96,42,43,41,245,249,250,251,252,262,263,257,258,253,254,,238,239,,,255', +'256,,40,,,33,,,59,60,,,61,,35,242,,248,45,244,243,,240,241,261,260,246', +'20,247,,,,93,83,86,87,,88,90,89,91,,,,,84,92,,259,,,,,63,,85,97,98,298', +'75,76,72,9,58,,,,64,65,,,,68,,66,67,69,30,31,73,74,,,,,,77,28,27,105', +'104,106,107,,,19,,,,,,8,46,300,10,109,108,110,99,57,101,100,102,,103', +'111,112,,95,96,42,43,41,245,249,250,251,252,262,263,257,258,253,254', +',238,239,,,255,256,,40,,,33,,,59,60,,,61,,35,242,,248,45,244,243,,240', +'241,261,260,246,20,247,,,,93,83,86,87,,88,90,89,91,,,,,84,92,225,259', +',,,,63,,85,97,98,298,75,76,72,9,58,,,,64,65,,,,68,,66,67,69,30,31,73', +'74,,,,,,77,28,27,105,104,106,107,,,19,,,,,,8,46,300,10,109,108,110,99', +'57,101,100,102,,103,111,112,,95,96,42,43,41,245,249,250,251,252,262', +'263,257,258,253,254,,238,239,,,255,256,,40,,,33,,,59,60,,,61,,35,242', +',248,45,244,243,,240,241,261,260,246,20,247,,,,93,83,86,87,,88,90,89', +'91,,,,,84,92,,259,,,,,63,,85,97,98,298,75,76,72,9,58,,,,64,65,,,,68', +',66,67,69,30,31,73,74,,,,,,77,28,27,105,104,106,107,,,19,,,,,,8,46,300', +'10,109,108,110,99,57,101,100,102,,103,111,112,,95,96,42,43,41,245,249', +'250,251,252,262,263,257,258,253,254,,238,239,,,255,256,,40,,,33,,,59', +'60,,,61,,35,242,,248,45,244,243,,240,241,261,260,246,20,247,,,,93,83', +'86,87,,88,90,89,91,,,,,84,92,,259,,,,,63,,85,97,98,298,75,76,72,9,58', +',,,64,65,,,,68,,66,67,69,30,31,73,74,,,,,,77,28,27,105,104,106,107,', +',19,,,,,,8,46,300,10,109,108,110,99,57,101,100,102,,103,111,112,,95', +'96,42,43,41,245,249,250,251,252,262,263,257,258,253,254,,238,239,,,255', +'256,,40,,,33,,,59,60,,,61,,35,242,,248,45,244,243,,240,241,261,260,246', +'20,247,,,,93,83,86,87,,88,90,89,91,,,,,84,92,,259,,,,,63,,85,97,98,298', +'75,76,72,9,58,,,,64,65,,,,68,,66,67,69,30,31,73,74,,,,,,77,28,27,105', +'104,106,107,,,19,,,,,,8,46,300,10,109,108,110,99,57,101,100,102,,103', +'111,112,,95,96,42,43,41,245,249,250,251,252,262,263,257,258,253,254', +',-608,-608,,,255,256,,40,,,33,,,59,60,,,61,,35,242,,248,45,244,243,', +'240,241,261,260,246,20,247,,,,93,83,86,87,,88,90,89,91,,,,,84,92,,,', +',,,63,,85,97,98,298,75,76,72,9,58,,,,64,65,,,,68,,66,67,69,30,31,73', +'74,,,,,,77,28,27,105,104,106,107,,,19,,,,,,8,46,300,10,109,108,110,99', +'57,101,100,102,,103,111,112,,95,96,42,43,41,245,-608,-608,-608,-608', +'262,263,,,-608,-608,,,,,,255,256,,40,,,302,,,59,60,,,61,,35,242,,248', +'45,244,243,,240,241,261,260,246,20,247,,,,93,83,86,87,,88,90,89,91,', +',,,84,92,,,,,,,63,,85,97,98,298,75,76,72,9,58,,,,64,65,,,,68,,66,67', +'69,30,31,73,74,,,,,,77,28,27,105,104,106,107,,,19,,,,,,8,46,300,10,109', +'108,110,99,57,101,100,102,,103,111,112,,95,96,42,43,41,245,-608,-608', +'-608,-608,262,263,,,-608,-608,,,,,,255,256,,40,,,33,,,59,60,,,61,,35', +'242,,248,45,244,243,,240,241,261,260,246,20,247,,,,93,83,86,87,,88,90', +'89,91,,,,,84,92,,,,,,,63,,85,97,98,298,75,76,72,9,58,,,,64,65,,,,68', +',66,67,69,30,31,73,74,,,,,,77,28,27,105,104,106,107,,,19,,,,,,8,46,300', +'10,109,108,110,99,57,101,100,102,,103,111,112,,95,96,42,43,41,245,-608', +'-608,-608,-608,262,263,,,-608,-608,,,,,,255,256,,40,,,33,,,59,60,,,61', +',35,242,,248,45,244,243,,240,241,261,260,246,20,247,,,,93,83,86,87,', +'88,90,89,91,,,,,84,92,,,,,,,63,,85,97,98,298,75,76,72,9,58,,,,64,65', +',,,68,,66,67,69,30,31,73,74,,,,,,77,28,27,105,104,106,107,,,19,,,,,', +'8,46,300,10,109,108,110,99,57,101,100,102,,103,111,112,,95,96,42,43', +'41,245,-608,-608,-608,-608,262,263,,,-608,-608,,,,,,255,256,,40,,,33', +',,59,60,,,61,,35,242,,248,45,244,243,,240,241,261,260,246,20,247,,,', +'93,83,86,87,,88,90,89,91,,,,,84,92,,,,,,,63,,85,97,98,298,75,76,72,9', +'58,,,,64,65,,,,68,,66,67,69,30,31,73,74,,,,,,77,28,27,105,104,106,107', +',,19,,,,,,8,46,300,10,109,108,110,99,57,101,100,102,,103,111,112,,95', +'96,42,43,41,245,249,250,251,252,262,263,257,,253,254,,,,,,255,256,,40', +',,33,,,59,60,,,61,,35,242,,248,45,244,243,,240,241,261,260,246,20,247', +',,,93,83,86,87,,88,90,89,91,,,,,84,92,,,,,,,63,,85,97,98,298,75,76,72', +'9,58,,,,64,65,,,,68,,66,67,69,30,31,73,74,,,,,,77,28,27,105,104,106', +'107,,,19,,,,,,8,46,300,10,109,108,110,99,57,101,100,102,,103,111,112', +',95,96,42,43,41,245,249,250,251,252,262,263,,,253,254,,,,,,255,256,', +'40,,,33,,,59,60,,,61,,35,242,,248,45,244,243,,240,241,261,260,246,20', +'247,,,,93,83,86,87,,88,90,89,91,,,,,84,92,,,,,,,63,,85,97,98,298,75', +'76,72,9,58,,,,64,65,,,,68,,66,67,69,30,31,73,74,,,,,,77,28,27,105,104', +'106,107,,,19,,,,,,8,46,300,10,109,108,110,99,57,101,100,102,,103,111', +'112,,95,96,42,43,41,245,249,250,251,252,262,263,257,258,253,254,,-608', +'-608,,,255,256,,40,,,33,,,59,60,,,61,,35,242,,248,45,244,243,,240,241', +'261,260,246,20,247,,,,93,83,86,87,,88,90,89,91,,,,,84,92,,,,,,,63,,85', +'97,98,298,75,76,72,9,58,,,,64,65,,,,68,,66,67,69,30,31,73,74,,,,,,77', +'28,27,105,104,106,107,,,19,,,,,,8,46,300,10,109,108,110,99,57,101,100', +'102,,103,111,112,,95,96,42,43,41,245,-608,-608,-608,-608,262,263,,,-608', +'-608,,,,,,255,256,,40,,,302,,,59,60,,,61,,35,242,,248,45,244,243,,240', +'241,261,260,246,20,247,,,,93,83,86,87,,88,90,89,91,,,,,84,92,,,,,,,63', +',85,97,98,298,75,76,72,9,58,,,,64,65,,,,68,,66,67,69,30,31,73,74,,,', +',,77,28,27,105,104,106,107,,,19,,,,,,8,46,300,10,109,108,110,99,57,101', +'100,102,,103,111,112,,95,96,42,43,41,245,-608,-608,-608,-608,262,263', +',,-608,-608,,,,,,255,256,,40,,,33,,,59,60,,,61,,35,242,,248,45,244,243', +',240,241,261,260,246,20,247,,,,93,83,86,87,,88,90,89,91,,,,,84,92,,', +',,,,63,,85,97,98,298,75,76,72,9,58,,,,64,65,,,,68,,66,67,69,30,31,73', +'74,,,,,,77,28,27,105,104,106,107,,,19,,,,,,8,46,300,10,109,108,110,99', +'57,101,100,102,,103,111,112,,95,96,42,43,41,245,,,,,,,,,,,,,,,,255,256', +',40,,,33,,,59,60,,,61,,35,242,,248,45,244,243,,240,241,,,,20,,,,,93', +'83,86,87,,88,90,89,91,,,,,84,92,,,,,,,63,,85,97,98,298,75,76,72,9,58', +',,,64,65,,,,68,,66,67,69,30,31,73,74,,,,,,77,28,27,105,104,106,107,', +',19,,,,,,8,46,300,10,109,108,110,99,57,101,100,102,,103,111,112,,95', +'96,42,43,41,,,,,,,,,,,,,,,,,,,,40,,,33,,,59,60,,,61,,35,,,,45,,,,,,', +',,20,,,,,93,83,86,87,,88,90,89,91,,,,,84,92,,,,,,,63,,85,97,98,5,75', +'76,72,9,58,,,,64,65,,,,68,,66,67,69,30,31,73,74,,,,,,77,28,27,105,104', +'106,107,,,19,,,,,,8,46,7,10,109,108,110,99,57,101,100,102,,103,111,112', +',95,96,42,43,41,,,,,,,,,,,,,,,,,,,,40,,,33,,,59,60,,,61,,35,,,,45,,', +',,,,,,20,,,,,93,83,86,87,,88,90,89,91,,,,,84,92,,,,,,,63,,85,97,98,298', +'75,76,72,9,58,,,,64,65,,,,68,,66,67,69,30,31,73,74,,,,,,77,28,27,105', +'104,106,107,,,19,,,,,,8,46,300,10,109,108,110,99,57,101,100,102,,103', +'111,112,,95,96,42,43,41,,,,,,,,,,,,,,,,,,,,40,,,33,,,59,60,,,61,,35', +',,,45,,,,,,,,,20,,,,,93,83,86,87,,88,90,89,91,,,,,84,92,,,,,,,63,,85', +'97,98,298,75,76,72,9,58,,,,64,65,,,,68,,66,67,69,30,31,73,74,,,,,,77', +'28,27,105,104,106,107,,,19,,,,,,8,46,300,10,109,108,110,99,57,101,100', +'102,,103,111,112,,95,96,42,43,41,,,,,,,,,,,,,,,,,,,,40,,,33,,,59,60', +',,61,,35,,,,45,,,,,,,,,20,,,,,93,83,86,87,,88,90,89,91,,,,,84,92,,,', +',,,63,,85,97,98,298,75,76,72,9,58,,,,64,65,,,,68,,66,67,69,30,31,73', +'74,,,,,,77,28,27,105,104,106,107,,,19,,,,,,8,46,300,10,109,108,110,99', +'57,101,100,102,,103,111,112,,95,96,42,43,41,,,,,,,,,,,,,,,,,,,,40,,', +'33,,,59,60,,,61,,35,,,,45,,,,,,,,,20,,,,,93,83,86,87,,88,90,89,91,,', +',,84,92,,,,,,,63,,85,97,98,298,75,76,72,9,58,,,,64,65,,,,68,,66,67,69', +'30,31,73,74,,,,,,77,28,27,105,104,106,107,,,19,,,,,,8,46,300,10,109', +'108,110,99,57,101,100,102,,103,111,112,,95,96,42,43,41,,,,,,,,,,,,,', +',,,,,,40,,,33,,,59,60,,,61,,35,,,,45,,,,,,,,,20,,,,,93,83,86,87,,88', +'90,89,91,,,,,84,92,,,,,,,63,,85,97,98,298,75,76,72,9,58,,,,64,65,,,', +'68,,66,67,69,30,31,73,74,,,,,,77,28,27,105,104,106,107,,,19,,,,,,8,46', +'300,10,109,108,110,99,57,101,100,102,,103,111,112,,95,96,42,43,41,,', +',,,,,,,,,,,,,,,,,40,,,33,,,59,60,,,61,,35,,,,45,,,,,,,,,20,,,,,93,83', +'86,87,,88,90,89,91,,,,,84,92,,,,,,,63,,85,97,98,298,75,76,72,9,58,,', +',64,65,,,,68,,66,67,69,30,31,73,74,,,,,,77,28,27,105,104,106,107,,,19', +',,,,,8,46,300,10,109,108,110,99,57,101,100,102,,103,111,112,,95,96,42', +'43,41,,,,,,,,,,,,,,,,,,,,40,,,33,,,59,60,,,61,,35,,,,45,,,,,,,,,20,', +',,,93,83,86,87,,88,90,89,91,,,,,84,92,,,,,,,63,,85,97,98,298,75,76,72', +'9,58,,,,64,65,,,,68,,66,67,69,30,31,73,74,,,,,,77,28,27,105,104,106', +'107,,,19,,,,,,8,46,300,10,109,108,110,99,57,101,100,102,,103,111,112', +',95,96,42,43,41,,,,,,,,,,,,,,,,,,,,40,,,33,,,59,60,,,61,,35,,,,45,,', +',,,,,,20,,,,,93,83,86,87,,88,90,89,91,,,,,84,92,,,,75,76,72,63,58,85', +'97,98,64,65,,,,68,,66,67,69,30,31,73,74,,,,,,77,28,27,105,104,106,107', +',,19,,,,,,,46,,,109,108,110,99,57,101,100,102,,103,111,112,,95,96,42', +'43,41,,,,,,,,,,,,,,,,,,,,230,,,236,,,59,60,,,61,,,,,,45,,,,,,,,,20,', +',,,93,83,86,87,,88,90,89,91,,,,,84,92,225,,,75,76,72,63,58,85,97,98', +'64,65,,,,68,,66,67,69,317,318,73,74,,,,,,77,314,320,105,104,106,107', +',,237,,,,,,,46,,,109,108,110,99,57,101,100,102,,103,111,112,,95,96,42', +'43,41,,,,,,,,,,,,,,,,,,,,230,,,236,,,59,60,,,61,,,,,,45,,,,,,,,,235', +',,,,93,83,86,87,,88,90,89,91,,,,,84,92,,,,75,76,72,63,58,85,97,98,64', +'65,,,,68,,66,67,69,317,318,73,74,,,,,,77,314,320,105,104,106,107,,,237', +',,,,,,46,,,109,108,110,99,57,101,100,102,,103,111,112,,95,96,42,43,41', +',,,,,,,,,,,,,,,,,,,230,,,236,,,59,60,,,61,,,,,,45,,,,,,,,,235,,,,,93', +'83,86,87,,88,90,89,91,,,,,84,92,,,,75,76,72,63,58,85,97,98,64,65,,,', +'68,,66,67,69,317,318,73,74,,,,,,77,314,320,105,104,106,107,,,237,,,', +',,,46,,,109,108,110,99,57,101,100,102,,103,111,112,,95,96,42,43,41,', +',,,,,,,,,,,,,,,,,,230,,,236,,,59,60,,,61,,,,,,45,,,,,,,,,235,,,,,93', +'83,86,87,,88,90,89,91,,,,,84,92,,,,75,76,72,63,58,85,97,98,64,65,,,', +'68,,66,67,69,317,318,73,74,,,,,,77,314,320,105,104,106,107,,,237,,,', +',,,46,,,109,108,110,99,57,101,100,102,,103,111,112,,95,96,42,43,41,', +',,,,,,,,,,,,,,,,,,230,,,236,,,59,60,,,61,,,,,,45,,,,,,,,,235,,,,,93', +'83,86,87,,88,90,89,91,,,,,84,92,,,,75,76,72,63,58,85,97,98,64,65,,,', +'68,,66,67,69,317,318,73,74,,,,,,77,314,320,105,104,106,107,,,237,,,', +',,,46,,,109,108,110,99,57,101,100,102,,103,111,112,,95,96,42,43,41,', +',,,,,,,,,,,,,,,,,,230,,,236,,,59,60,,,61,,,,,,45,,,,,,,,,235,,,,,93', +'83,86,87,,88,90,89,91,,,,,84,92,,,,75,76,72,63,58,85,97,98,64,65,,,', +'68,,66,67,69,317,318,73,74,,,,,,77,314,320,105,104,106,107,,,237,,,', +',,,46,,,109,108,110,99,57,101,100,102,,103,111,112,,95,96,42,43,41,', +',,,,,,,,,,,,,,,,,,230,,,236,,,59,60,,,61,,,,,,45,,,,,,,,,235,,,,,93', +'83,86,87,,88,90,89,91,,,,,84,92,,,,75,76,72,63,58,85,97,98,64,65,,,', +'68,,66,67,69,317,318,73,74,,,,,,77,314,320,105,104,106,107,,,237,,,', +',,,46,,,109,108,110,99,57,101,100,102,,103,111,112,,95,96,42,43,41,', +',,,,,,,,,,,,,,,,,,230,,,236,,,59,60,,,61,,,,,,45,,,,,,,,,235,,,,,93', +'83,86,87,,88,90,89,91,,,,,84,92,,,,75,76,72,63,58,85,97,98,64,65,,,', +'68,,66,67,69,317,318,73,74,,,,,,77,314,320,105,104,106,107,,,237,,,', +',,,46,,,109,108,110,99,57,101,100,102,,103,111,112,,95,96,42,43,41,', +',,,,,,,,,,,,,,,,,,230,,,236,,,59,60,,,61,,,,,,45,,,,,,,,,235,,,,,93', +'83,86,87,,88,90,89,91,,,,,84,92,,,,75,76,72,63,58,85,97,98,64,65,,,', +'68,,66,67,69,317,318,73,74,,,,,,77,314,320,105,104,106,107,,,237,,,', +',,,46,,,109,108,110,99,57,101,100,102,,103,111,112,,95,96,42,43,41,', +',,,,,,,,,,,,,,,,,,230,,,236,,,59,60,,,61,,,,,,45,,,,,,,,,235,,,,,93', +'83,86,87,,88,90,89,91,,,,,84,92,,,,75,76,72,63,58,85,97,98,64,65,,,', +'68,,66,67,69,317,318,73,74,,,,,,77,314,320,105,104,106,107,,,237,,,', +',,,46,,,109,108,110,99,57,101,100,102,,103,111,112,,95,96,42,43,41,', +',,,,,,,,,,,,,,,,,,230,,,236,,,59,60,,,61,,,,,,45,,,,,,,,,235,,,,,93', +'83,86,87,,88,90,89,91,,,,,84,92,,,,75,76,72,63,58,85,97,98,64,65,,,', +'68,,66,67,69,317,318,73,74,,,,,,77,314,320,105,104,106,107,,,237,,,', +',,,46,,,109,108,110,99,57,101,100,102,,103,111,112,,95,96,42,43,41,', +',,,,,,,,,,,,,,,,,,230,,,236,,,59,60,,,61,,,,,,45,,,,,,,,,235,,,,,93', +'83,86,87,,88,90,89,91,,,,,84,92,,,,75,76,72,63,58,85,97,98,64,65,,,', +'68,,66,67,69,317,318,73,74,,,,,,77,314,320,105,104,106,107,,,237,,,', +',,,46,,,109,108,110,99,57,101,100,102,,103,111,112,,95,96,42,43,41,', +',,,,,,,,,,,,,,,,,,230,,,236,,,59,60,,,61,,,,,,45,,,,,,,,,235,,,,,93', +'83,86,87,,88,90,89,91,,,,,84,92,,,,75,76,72,63,58,85,97,98,64,65,,,', +'68,,66,67,69,317,318,73,74,,,,,,77,314,320,105,104,106,107,,,237,,,', +',,,46,,,109,108,110,99,57,101,100,102,,103,111,112,,95,96,42,43,41,', +',,,,,,,,,,,,,,,,,,230,,,236,,,59,60,,,61,,,,,,45,,,,,,,,,235,,,,,93', +'83,86,87,,88,90,89,91,,,,,84,92,,,,75,76,72,63,58,85,97,98,64,65,,,', +'68,,66,67,69,317,318,73,74,,,,,,77,314,320,105,104,106,107,,,237,,,', +',,,46,,,109,108,110,99,57,101,100,102,,103,111,112,,95,96,42,43,41,', +',,,,,,,,,,,,,,,,,,230,,,236,,,59,60,,,61,,,,,,45,,,,,,,,,235,,,,,93', +'83,86,87,,88,90,89,91,,,,,84,92,,,,75,76,72,63,58,85,97,98,64,65,,,', +'68,,66,67,69,317,318,73,74,,,,,,77,314,320,105,104,106,107,,,237,,,', +',,,46,,,109,108,110,99,57,101,100,102,,103,111,112,,95,96,42,43,41,', +',,,,,,,,,,,,,,,,,,230,,,236,,,59,60,,,61,,,,,,45,,,,,,,,,235,,,,,93', +'83,86,87,,88,90,89,91,,,,,84,92,,,,75,76,72,63,58,85,97,98,64,65,,,', +'68,,66,67,69,317,318,73,74,,,,,,77,314,320,105,104,106,107,,,237,,,', +',,,46,,,109,108,110,99,57,101,100,102,,103,111,112,,95,96,42,43,41,', +',,,,,,,,,,,,,,,,,,230,,,236,,,59,60,,,61,,,,,,45,,,,,,,,,235,,,,,93', +'83,86,87,,88,90,89,91,,,,,84,92,,,,75,76,72,63,58,85,97,98,64,65,,,', +'68,,66,67,69,317,318,73,74,,,,,,77,314,320,105,104,106,107,,,237,,,', +',,,46,,,109,108,110,99,57,101,100,102,,103,111,112,,95,96,42,43,41,', +',,,,,,,,,,,,,,,,,,230,,,236,,,59,60,,,61,,,,,,45,,,,,,,,,235,,,,,93', +'83,86,87,,88,90,89,91,,,,,84,92,,,,75,76,72,63,58,85,97,98,64,65,,,', +'68,,66,67,69,317,318,73,74,,,,,,77,314,320,105,104,106,107,,,237,,,', +',,,46,,,109,108,110,99,57,101,100,102,,103,111,112,,95,96,42,43,41,', +',,,,,,,,,,,,,,,,,,230,,,236,,,59,60,,,61,,,,,,45,,,,,,,,,235,,,,,93', +'83,86,87,,88,90,89,91,,,,,84,92,,,,75,76,72,63,58,85,97,98,64,65,,,', +'68,,66,67,69,317,318,73,74,,,,,,77,314,320,105,104,106,107,,,237,,,', +',,,46,,,109,108,110,99,57,101,100,102,,103,111,112,,95,96,42,43,41,', +',,,,,,,,,,,,,,,,,,230,,,236,,,59,60,,,61,,,,,,45,,,,,,,,,235,,,,,93', +'83,86,87,,88,90,89,91,,,,,84,92,,,,75,76,72,63,58,85,97,98,64,65,,,', +'68,,66,67,69,317,318,73,74,,,,,,77,314,320,105,104,106,107,,,237,,,', +',,,46,,,109,108,110,99,57,101,100,102,,103,111,112,,95,96,42,43,41,', +',,,,,,,,,,,,,,,,,,230,,,236,,,59,60,,,61,,,,,,45,,,,,,,,,235,,,,,93', +'83,86,87,,88,90,89,91,,,,,84,92,,,,75,76,72,63,58,85,97,98,64,65,,,', +'68,,66,67,69,317,318,73,74,,,,,,77,314,320,105,104,106,107,,,237,,,', +',,,46,,,109,108,110,99,57,101,100,102,,103,111,112,,95,96,42,43,41,', +',,,,,,,,,,,,,,,,,,230,,,236,,,59,60,,,61,,,,,,45,,,,,,,,,235,,,,,93', +'83,86,87,,88,90,89,91,,,,,84,92,,,,75,76,72,63,58,85,97,98,64,65,,,', +'68,,66,67,69,317,318,73,74,,,,,,77,314,320,105,104,106,107,,,237,,,', +',,,46,,,109,108,110,99,57,101,100,102,,103,111,112,,95,96,42,43,41,', +',,,,,,,,,,,,,,,,,,230,,,236,,,59,60,,,61,,,,,,45,,,,,,,,,235,,,,,93', +'83,86,87,,88,90,89,91,,,,,84,92,,,,75,76,72,63,58,85,97,98,64,65,,,', +'68,,66,67,69,317,318,73,74,,,,,,77,314,320,105,104,106,107,,,237,,,', +',,,46,,,109,108,110,99,57,101,100,102,,103,111,112,,95,96,42,43,41,', +',,,,,,,,,,,,,,,,,,230,,,236,,,59,60,,,61,,,,,,45,,,,,,,,,235,,,,,93', +'83,86,87,,88,90,89,91,,,,,84,92,,,,75,76,72,63,58,85,97,98,64,65,,,', +'68,,66,67,69,317,318,73,74,,,,,,77,314,320,105,104,106,107,,,237,,,', +',,,46,,,109,108,110,99,57,101,100,102,,103,111,112,,95,96,42,43,41,', +',,,,,,,,,,,,,,,,,,230,,,236,,,59,60,,,61,,,,,,45,,,,,,,,,235,,,,,93', +'83,86,87,,88,90,89,91,,,,,84,92,,,,75,76,72,63,58,85,97,98,64,65,,,', +'68,,66,67,69,317,318,73,74,,,,,,77,314,320,105,104,106,107,,,237,,,', +',,,46,,,109,108,110,99,57,101,100,102,,103,111,112,,95,96,42,43,41,', +',,,,,,,,,,,,,,,,,,230,,,236,,,59,60,,,61,,,,,,45,,,,,,,,,235,,,,,93', +'83,86,87,,88,90,89,91,,,,,84,92,,,,75,76,72,63,58,85,97,98,64,65,,,', +'68,,66,67,69,317,318,73,74,,,,,,77,314,320,105,104,106,107,,,237,,,', +',,,46,,,109,108,110,99,57,101,100,102,,103,111,112,,95,96,42,43,41,', +',,,,,,,,,,,,,,,,,,230,,,236,,,59,60,,,61,,,,,,45,,,,,,,,,235,,,,,93', +'83,86,87,,88,90,89,91,,,,,84,92,,,,75,76,72,63,58,85,97,98,64,65,,,', +'68,,66,67,69,317,318,73,74,,,,,,77,314,320,105,104,106,107,,,237,,,', +',,,46,,,109,108,110,99,57,101,100,102,,103,111,112,,95,96,42,43,41,', +',,,,,,,,,,,,,,,,,,230,,,236,,,59,60,,,61,,,,,,45,,,,,,,,,235,,,,,93', +'83,86,87,,88,90,89,91,,,,,84,92,,,,75,76,72,63,58,85,97,98,64,65,,,', +'68,,66,67,69,317,318,73,74,,,,,,77,314,320,105,104,106,107,,,237,,,', +',,,46,,,109,108,110,99,57,101,100,102,,103,111,112,,95,96,42,43,41,', +',,,,,,,,,,,,,,,,,,230,,,236,,,59,60,,,61,,,,,,45,,,,,,,,,235,,,,,93', +'83,86,87,,88,90,89,91,,,,,84,92,,,,75,76,72,63,58,85,97,98,64,65,,,', +'68,,66,67,69,317,318,73,74,,,,,,77,314,320,105,104,106,107,,,237,,,', +',,,46,,,109,108,110,99,57,101,100,102,,103,111,112,,95,96,42,43,41,', +',,,,,,,,,,,,,,,,,,230,,,236,,,59,60,,,61,,,,,,45,,,,,,,,,235,,,,,93', +'83,86,87,,88,90,89,91,,,,,84,92,,,,75,76,72,63,58,85,97,98,64,65,,,', +'68,,66,67,69,30,31,73,74,,,,,,77,28,27,105,104,106,107,,,237,,,,,,,46', +',,109,108,110,99,57,101,100,102,,103,111,112,,95,96,42,43,41,,,,,,,', +',,,,,,,,,,,,230,,,236,,,59,60,,,61,,,,,,45,,,,,,,,,235,,,,,93,83,86', +'87,,88,90,89,91,,,,,84,92,,,,75,76,72,63,58,85,97,98,64,65,,,,68,,66', +'67,69,30,31,73,74,,,,,,77,28,27,105,104,106,107,,,237,,,,,,,46,,,109', +'108,110,99,57,101,100,102,292,103,111,112,,95,96,42,43,41,,,,,,,,,,', +',,,,,,,,,230,,,236,,,59,60,,,61,,289,,287,,45,,,293,,,,,,235,,,,,93', +'290,86,87,,88,90,89,91,,,,,84,92,,,,75,76,72,63,58,85,97,98,64,65,,', +',68,,66,67,69,30,31,73,74,,,,,,77,28,27,105,104,106,107,,,237,,,,,,', +'46,,,109,108,110,99,57,101,100,102,292,103,111,112,,95,96,42,43,41,', +',,,,,,,,,,,,,,,,,,230,,,236,,,59,60,,,61,,289,,287,,45,,,293,,,,,,235', +',,,,93,290,86,87,,88,90,89,91,,,,,84,92,,,,75,76,72,63,58,85,97,98,64', +'65,,,,68,,66,67,69,30,31,73,74,,,,,,77,28,27,105,104,106,107,,,237,', +',,,,,46,,,109,108,110,99,57,101,100,102,292,103,111,112,,95,96,42,43', +'41,,,,,,,,,,,,,,,,,,,,230,,,236,,,59,60,,,61,,289,,287,,45,,,293,,,', +',,235,,,,,93,290,86,87,,88,90,89,91,,,,,84,92,225,,,75,76,72,63,58,85', +'97,98,64,65,,,,68,,66,67,69,317,318,73,74,,,,,,77,314,320,105,104,106', +'107,,,237,,,,,,,46,,,109,108,110,99,57,101,100,102,,103,111,112,,95', +'96,42,43,41,,,,,,,,,,,,,,,,,,,,230,,,236,,,59,60,,,61,,,,,,45,,,,,,', +',,235,,,,,93,83,86,87,,88,90,89,91,,,,,84,92,,,,75,76,72,63,58,85,97', +'98,64,65,,,,68,,66,67,69,317,318,73,74,,,,,,77,314,320,105,104,106,107', +',,237,,,,,,,46,,,109,108,110,99,57,101,100,102,,103,111,112,,95,96,42', +'43,41,,,,,,,,,,,,,,,,,,,,230,,,236,,,59,60,,,61,,,,,,45,,,,,,,,,235', +',,,,93,83,86,87,,88,90,89,91,,,,,84,92,,,,75,76,72,63,58,85,97,98,64', +'65,,,,68,,66,67,69,317,318,73,74,,,,,,77,314,320,105,104,106,107,,,237', +',,,,,,46,,,109,108,110,99,57,101,100,102,,103,111,112,,95,96,42,43,41', +',,,,,,,,,,,,,,,,,,,230,,,236,,,59,60,,,61,,,,,,45,,,,,,,,,235,,,,,93', +'83,86,87,,88,90,89,91,,,,,84,92,,,,75,76,72,63,58,85,97,98,64,65,,,', +'68,,66,67,69,317,318,73,74,,,,,,77,314,320,105,104,106,107,,,237,,,', +',,,46,,,109,108,110,99,57,101,100,102,,103,111,112,,95,96,42,43,41,', +',,,,,,,,,,,,,,,,,,230,,,236,,,59,60,,,61,,,,,,45,,,,,,,,,235,,,,,93', +'83,86,87,,88,90,89,91,,,,,84,92,,,,75,76,72,63,58,85,97,98,64,65,,,', +'68,,66,67,69,317,318,73,74,,,,,,77,314,320,105,104,106,107,,,237,,,', +',,,46,,,109,108,110,99,57,101,100,102,,103,111,112,,95,96,42,43,41,', +',,,,,,,,,,,,,,,,,,230,,,236,,,59,60,,,61,,,,,,45,,,,,,,,,235,,,,,93', +'83,86,87,,88,90,89,91,,,,,84,92,,,,,,,63,,85,97,98,75,76,72,9,58,,,', +'64,65,,,,68,,66,67,69,30,31,73,74,,,,,,77,28,27,105,104,106,107,,,19', +',,,,,8,46,,10,109,108,110,99,57,101,100,102,,103,111,112,,95,96,42,43', +'41,,,,,,,,,,,,,,,,,,,,40,,,33,,,59,60,,,61,,35,,,,45,,,,,,,,,20,,,,', +'93,83,86,87,,88,90,89,91,,,,,84,92,,,,75,76,72,63,58,85,97,98,64,65', +',,,68,,66,67,69,30,31,73,74,,,,,,77,28,27,105,104,106,107,,,19,,,,,', +',46,,,109,108,110,99,57,101,100,102,,103,111,112,,95,96,42,43,41,,,', +',,,,,,,,,,,,,,,,230,,,236,,,59,60,,,61,,,,,,45,,,,,,,,,20,,,,,93,83', +'86,87,,88,90,89,91,,,,,84,92,,,,75,76,72,63,58,85,97,98,64,65,,,,68', +',66,67,69,317,318,73,74,,,,,,77,314,320,105,104,106,107,,,237,,,,,,', +'46,,,109,108,110,99,57,101,100,102,292,103,111,112,,95,96,42,43,41,', +',,,,,,,,,,,,,,,,,,230,,,236,,,59,60,,,61,,,,,,45,,,293,,,,,,235,,,,', +'93,290,86,87,,88,90,89,91,,,,,84,92,,,,,,,63,,85,97,98,75,76,72,9,58', +',,,64,65,,,,68,,66,67,69,30,31,73,74,,,,,,77,28,27,105,104,106,107,', +',19,,,,,,8,46,7,10,109,108,110,99,57,101,100,102,,103,111,112,,95,96', +'42,43,41,,,,,,,,,,,,,,,,,,,,40,,,33,,,59,60,,,61,,35,,,,45,,,,,,,,,20', +',,,,93,83,86,87,,88,90,89,91,,,,,84,92,,,,75,76,72,63,58,85,97,98,64', +'65,,,,68,,66,67,69,30,31,73,74,,,,,,77,28,27,105,104,106,107,,,237,', +',,,,,46,,,109,108,110,99,57,101,100,102,292,103,111,112,,95,96,42,43', +'41,,,,,,,,,,,,,,,,,,,,230,,,236,,,59,60,,,61,,289,,287,,45,,,293,,,', +',,235,,,,,93,290,86,87,,88,90,89,91,,,,,84,92,,,,75,76,72,63,58,85,97', +'98,64,65,,,,68,,66,67,69,30,31,73,74,,,,,,77,28,27,105,104,106,107,', +',237,,,,,,,46,,,109,108,110,99,57,101,100,102,,103,111,112,,95,96,42', +'43,41,,,,,,,,,,,,,,,,,,,,230,,,236,,,59,60,,,61,,,,,,45,,,,,,,,,235', +',,,,93,83,86,87,,88,90,89,91,,,,,84,92,,,,75,76,72,63,58,85,97,98,64', +'65,,,,68,,66,67,69,317,318,73,74,,,,,,77,314,320,105,104,106,107,,,237', +',,,,,,315,,,109,108,110,99,57,101,100,102,,103,111,112,,95,96,,,321', +',,,,,,,,,,,,,,,,,,,921,,,236,,,59,60,,,61,,,,,,,,,,,,,,,,,,,,93,83,86', +'87,,88,90,89,91,,,,,84,92,,,,75,76,72,63,58,85,97,98,64,65,,,,68,,66', +'67,69,30,31,73,74,,,,,,77,28,27,105,104,106,107,,,237,,,,,,,46,,,109', +'108,110,99,57,101,100,102,292,103,111,112,,95,96,42,43,41,,,,,,,,,,', +',,,,,,,,,230,,,236,,,59,60,,,61,,289,,287,,45,,,293,,,,,,235,,,,,93', +'290,86,87,,88,90,89,91,,,,,84,92,,,,75,76,72,63,58,85,97,98,64,65,,', +',68,,66,67,69,30,31,73,74,,,,,,77,28,27,105,104,106,107,,,237,,,,,,', +'46,,,109,108,110,99,57,101,100,102,292,103,111,112,,95,96,42,43,41,', +',,,,,,,,,,,,,,,,,,230,,,236,,,59,60,,,61,,289,,287,,45,,,293,,,,,,235', +',,,,93,290,86,87,,88,90,89,91,,,,,84,92,,,,75,76,72,63,58,85,97,98,64', +'65,,,,68,,66,67,69,30,31,73,74,,,,,,77,28,27,105,104,106,107,,,237,', +',,,,,46,,,109,108,110,99,57,101,100,102,292,103,111,112,,95,96,42,43', +'41,,,,,,,,,,,,,,,,,,,,230,,,236,,,59,60,,,61,,289,,287,,45,,,293,,,', +',,235,,,,,93,290,86,87,,88,90,89,91,,,,,84,92,,,,75,76,72,63,58,85,97', +'98,64,65,,,,68,,66,67,69,317,318,73,74,,,,,,77,314,320,105,104,106,107', +',,237,,,,,,,315,,,109,108,110,99,57,101,100,102,,103,111,112,,95,96', +',,321,,,,,,,,,,,,,,,,,,,,311,,,307,,,59,60,,,61,,306,,,,,,,,,,,,,,,', +',,93,83,86,87,,88,90,89,91,,,,,84,92,,,,75,76,72,63,58,85,97,98,64,65', +',,,68,,66,67,69,317,318,73,74,,,,,,77,314,320,105,104,106,107,,,237', +',,,,,,315,,,109,108,110,99,57,101,100,102,,103,111,112,,95,96,,,321', +',,,,,,,,,,,,,,,,,,,311,,,236,,,59,60,,,61,,,682,,679,678,677,687,680', +',,,,,,,,690,,93,83,86,87,,88,90,89,91,,,,,84,92,,,,323,,685,63,,85,97', +'98,75,76,72,,58,698,697,,64,65,691,,,68,,66,67,69,317,318,73,74,,,,', +',77,314,320,105,104,106,107,,,237,,,,,,,315,,,109,108,110,99,57,101', +'100,102,,103,111,112,,95,96,,,321,,,,,,,,,,,,,,,,,,,,927,,,236,,,59', +'60,,,61,,,,,,,,,,,,,,,,,,,,93,83,86,87,,88,90,89,91,,,,,84,92,,,,75', +'76,72,63,58,85,97,98,64,65,,,,68,,66,67,69,317,318,73,74,,,,,,77,314', +'320,105,104,106,107,,,237,,,,,,,315,,,109,108,110,99,57,101,100,102', +',103,111,112,,95,96,,,321,,,,,,,,,,,,,,,,,,,,921,,,236,,,59,60,,,61', +',,,,,,,,,,,,,,,,,,,93,83,86,87,,88,90,89,91,,,,,84,92,,,,75,76,72,63', +'58,85,97,98,64,65,,,,68,,66,67,69,317,318,73,74,,,,,,77,314,320,105', +'104,106,107,,,237,,,,,,,46,,,109,108,110,99,57,101,100,102,,103,111', +'112,,95,96,42,43,41,,,,,,,,,,,,,,,,,,,,230,,,236,,,59,60,,,61,,,,,,45', +',,,,,,,,235,,,,,93,83,86,87,,88,90,89,91,,,,,84,92,,,,75,76,72,63,58', +'85,97,98,64,65,,,,68,,66,67,69,317,318,73,74,,,,,,77,314,320,105,104', +'106,107,,,237,,,,,,,46,,,109,108,110,99,57,101,100,102,,103,111,112', +',95,96,42,43,41,,,,,,,,,,,,,,,,,,,,230,,,236,,,59,60,,,61,,,,,,45,,', +',,,,,,235,,,,,93,83,86,87,,88,90,89,91,,,,,84,92,,,,75,76,72,63,58,85', +'97,98,64,65,,,,68,,66,67,69,317,318,73,74,,,,,,77,314,320,105,104,106', +'107,,,237,,,,,,,46,,,109,108,110,99,57,101,100,102,,103,111,112,,95', +'96,42,43,41,,,,,,,,,,,,,,,,,,,,230,,,236,,,59,60,,,61,,,,,,45,,,,,,', +',,235,,,,,93,83,86,87,,88,90,89,91,,,,,84,92,,,,75,76,72,63,58,85,97', +'98,64,65,,,,68,,66,67,69,317,318,73,74,,,,,,77,314,320,105,104,106,107', +',,237,,,,,,,46,,,109,108,110,99,57,101,100,102,,103,111,112,,95,96,42', +'43,41,,,,,,,,,,,,,,,,,,,,230,,,236,,,59,60,,,61,,,,,,45,,,,,,,,,235', +',,,,93,83,86,87,,88,90,89,91,,,,,84,92,,,,75,76,72,63,58,85,97,98,64', +'65,,,,68,,66,67,69,317,318,73,74,,,,,,77,314,320,105,104,106,107,,,237', +',,,,,,46,,,109,108,110,99,57,101,100,102,292,103,111,112,,95,96,42,43', +'41,,,,,,,,,,,,,,,,,,,,230,,,236,,,59,60,,,61,,,,287,,45,,,293,,,,,,235', +',,,,93,290,86,87,,88,90,89,91,,,,,84,92,,,,,,,63,,85,97,98,75,76,72', +'9,58,,,,64,65,,,,68,,66,67,69,30,31,73,74,,,,,,77,28,27,105,104,106', +'107,,,19,,,,,,8,46,,10,109,108,110,99,57,101,100,102,,103,111,112,,95', +'96,42,43,41,,,,,,,,,,,,,,,,,,,,40,,,33,,,59,60,,,61,,35,,,,45,,,,,,', +',,20,,,,,93,83,86,87,,88,90,89,91,,,,,84,92,,,,75,76,72,63,58,85,97', +'98,64,65,,,,68,,66,67,69,317,318,73,74,,,,,,77,314,320,105,104,106,107', +',,237,,,,,,,46,,,109,108,110,99,57,101,100,102,292,103,111,112,,95,96', +'42,43,41,,,,,,,,,,,,,,,,,,,,230,,,236,,,59,60,,,61,,289,,,,45,,,293', +',,,,,235,,,,,93,290,86,87,,88,90,89,91,,,,,84,92,,,,75,76,72,63,58,85', +'97,98,64,65,,,,68,,66,67,69,317,318,73,74,,,,,,77,314,320,105,104,106', +'107,,,237,,,,,,,46,,,109,108,110,99,57,101,100,102,292,103,111,112,', +'95,96,42,43,41,,,,,,,,,,,,,,,,,,,,230,,,236,,,59,60,,,61,,,,,,45,,,293', +',,,,,235,,,,,93,290,86,87,,88,90,89,91,,,,,84,92,,,,75,76,72,63,58,85', +'97,98,64,65,,,,68,,66,67,69,30,31,73,74,,,,,,77,28,27,105,104,106,107', +',,19,,,,,,,46,,,109,108,110,99,57,101,100,102,,103,111,112,,95,96,42', +'43,41,,,,,,,,,,,,,,,,,,,,230,,,236,,,59,60,,,61,,,,,,45,,,,,,,,,20,', +',,,93,83,86,87,,88,90,89,91,,,,,84,92,,,,75,76,72,63,58,85,97,98,64', +'65,,,,68,,66,67,69,30,31,73,74,,,,,,77,28,27,105,104,106,107,,,19,,', +',,,,46,,,109,108,110,99,57,101,100,102,,103,111,112,,95,96,42,43,41', +',,,,,,,,,,,,,,,,,,,230,,,236,,,59,60,,,61,,,,,,45,,,,,,,,,20,,,,,93', +'83,86,87,,88,90,89,91,,,,,84,92,,,,75,76,72,63,58,85,97,98,64,65,,,', +'68,,66,67,69,30,31,73,74,,,,,,77,28,27,105,104,106,107,,,19,,,,,,,46', +',,109,108,110,99,57,101,100,102,,103,111,112,,95,96,42,43,41,,,,,,,', +',,,,,,,,,,,,230,,,236,,,59,60,,,61,,,,,,45,,,,,,,,,20,,,,,93,83,86,87', +',88,90,89,91,,,,,84,92,117,,,,,116,63,,85,97,98,75,76,72,,58,,,,64,65', +',,,68,,66,67,69,317,318,73,74,,,,,,77,314,320,105,104,106,107,,,237', +',,,,,,315,,,109,108,110,99,57,101,100,102,,103,111,112,,95,96,,,321', +',,,,,,,,,,,,,,,,,,,357,,,33,,,59,60,,,61,,35,,,,,,,,,,,,,,,,,,93,83', +'86,87,,88,90,89,91,,,,,84,92,,,,75,76,72,63,58,85,97,98,64,65,,,,68', +',66,67,69,317,318,73,74,,,,,,77,314,320,105,104,106,107,,,237,,,,,,', +'315,,,109,108,110,362,57,101,100,363,,103,111,112,,95,96,,,321,,,,,', +',,,,,,,,,,,369,,,364,,,236,,,59,60,,,61,,,,,,,,,,,,,,,,,,,,93,83,86', +'87,,88,90,89,91,,,,,84,92,,,,75,76,72,63,58,85,97,98,64,65,,,,68,,66', +'67,69,317,318,73,74,,,,,,77,314,320,105,104,106,107,,,237,,,,,,,315', +',,109,108,110,362,57,101,100,363,,103,111,112,,95,96,,,321,,,,,,,,,', +',,,,,,,,,,364,,,236,,,59,60,,,61,,,682,,679,678,677,687,680,,,,,,,,', +'690,,93,83,86,87,,88,90,89,91,,,,,84,92,,,,,,685,63,,85,97,98,75,76', +'72,9,58,698,697,,64,65,691,,,68,,66,67,69,30,31,73,74,,,,,,77,28,27', +'105,104,106,107,,,19,,,,,,8,46,7,10,109,108,110,99,57,101,100,102,,103', +'111,112,,95,96,42,43,41,,,,,,,,,,,,,,,,,,,,40,,,33,,,59,60,,,61,,35', +',,,45,,,,,,,,,20,,,,,93,83,86,87,,88,90,89,91,,,,,84,92,,,,,,397,63', +',85,97,98,75,76,72,,58,,,,64,65,,,,68,,66,67,69,30,31,73,74,,,,,,77', +'28,27,105,104,106,107,,,19,,,,,,,46,,,109,108,110,99,57,101,100,102', +',103,111,112,,95,96,42,43,41,,,,,,,,,,,,,,,,,,,,230,,,236,,,59,60,,', +'61,,,,,,45,,,,,,,,,20,,,,,93,83,86,87,,88,90,89,91,,,,,84,92,,,,75,76', +'72,63,58,85,97,98,64,65,,,,68,,66,67,69,30,31,73,74,,,,,,77,28,27,105', +'104,106,107,,,19,,,,,,,46,,,109,108,110,99,57,101,100,102,,103,111,112', +',95,96,42,43,41,,,,,,,,,,,,,,,,,,,,230,,,236,,,59,60,,,61,,,,,,45,,', +',,,,,,20,,,,,93,83,86,87,,88,90,89,91,,,,,84,92,,,,75,76,72,63,58,85', +'97,98,64,65,,,,68,,66,67,69,30,31,73,74,,,,,,77,28,27,105,104,106,107', +',,19,,,,,,,46,,,109,108,110,99,57,101,100,102,,103,111,112,,95,96,42', +'43,41,,,,,,,,,,,,,,,,,,,,230,,,236,,,59,60,,,61,,,,,,45,,,,,,,,,20,', +',,,93,83,86,87,,88,90,89,91,,,,,84,92,,,,75,76,72,63,58,85,97,98,64', +'65,,,,68,,66,67,69,30,31,73,74,,,,,,77,28,27,105,104,106,107,,,19,,', +',,,,46,,,109,108,110,99,57,101,100,102,,103,111,112,,95,96,42,43,41', +',,,,,,,,,,,,,,,,,,,230,,,236,,,59,60,,,61,,,,,,45,,,,,,,,,20,,,,,93', +'83,86,87,,88,90,89,91,,,,,84,92,,,,,,,63,,85,97,98,75,76,72,9,58,,,', +'64,65,,,,68,,66,67,69,30,31,73,74,,,,,,77,28,27,105,104,106,107,,,19', +',,,,,8,46,,10,109,108,110,99,57,101,100,102,,103,111,112,,95,96,42,43', +'41,,,,,,,,,,,,,,,,,,,,40,,,33,,,59,60,,,61,,35,,,,45,,,,,,,,,20,,,,', +'93,83,86,87,,88,90,89,91,,,,,84,92,,,,75,76,72,63,58,85,97,98,64,65', +',,,68,,66,67,69,317,318,73,74,,,,,,77,314,320,105,104,106,107,,,237', +',,,,,,46,,,109,108,110,99,57,101,100,102,,103,111,112,,95,96,42,43,41', +',,,,,,,,,,,,,,,,,,,230,,,236,,,59,60,,,61,,640,,,,45,,,,,,,,,235,,,', +',93,83,86,87,,88,90,89,91,,,,,84,92,,,,75,76,72,63,58,85,97,98,64,65', +',,,68,,66,67,69,30,31,73,74,,,,,,77,28,27,105,104,106,107,,,19,,,,,', +',46,,,109,108,110,99,57,101,100,102,,103,111,112,,95,96,42,43,41,,,', +',,,,,,,,,,,,,,,,230,,,236,,,59,60,,,61,,,,,,45,,,,,,,,,20,,,,,93,83', +'86,87,,88,90,89,91,,,,,84,92,,,,75,76,72,63,58,85,97,98,64,65,,,,68', +',66,67,69,30,31,73,74,,,,,,77,28,27,105,104,106,107,,,237,,,,,,,46,', +',109,108,110,99,57,101,100,102,,103,111,112,,95,96,42,43,41,,,,,,,,', +',,,,,,,,,,,230,,,236,,,59,60,,,61,,413,,,,45,,,,,,,,,235,,,,,93,83,86', +'87,,88,90,89,91,,,,,84,92,,,,75,76,72,63,58,85,97,98,64,65,,,,68,,66', +'67,69,30,31,73,74,,,,,,77,28,27,105,104,106,107,,,237,,,,,,,46,,,109', +'108,110,99,57,101,100,102,,103,111,112,,95,96,42,43,41,,,,,,,,,,,,,', +',,,,,,230,,,236,,,59,60,,,61,,413,,,,45,,,,,,,,,235,,,,,93,83,86,87', +',88,90,89,91,,,,,84,92,,,,75,76,72,63,58,85,97,98,64,65,,,,68,,66,67', +'69,30,31,73,74,,,,,,77,28,27,105,104,106,107,,,19,,,,,,,46,,,109,108', +'110,99,57,101,100,102,,103,111,112,,95,96,42,43,41,,,,,,,,,,,,,,,,,', +',,230,,,236,,,59,60,,,61,,,,,,45,,,,,,,,,20,,,,,93,83,86,87,,88,90,89', +'91,,,,,84,92,,,,75,76,72,63,58,85,97,98,64,65,,,,68,,66,67,69,30,31', +'73,74,,,,,,77,28,27,105,104,106,107,,,19,,,,,,,46,,,109,108,110,99,57', +'101,100,102,,103,111,112,,95,96,42,43,41,,,,,,,,,,,,,,,,,,,,230,,,236', +',,59,60,,,61,,,,,,45,,,,,,,,,20,,,,,93,83,86,87,,88,90,89,91,,,,,84', +'92,,,,75,76,72,63,58,85,97,98,64,65,,,,68,,66,67,69,30,31,73,74,,,,', +',77,28,27,105,104,106,107,,,237,,,,,,,46,,,109,108,110,99,57,101,100', +'102,,103,111,112,,95,96,42,43,41,,,,,,,,,,,,,,,,,,,,230,,,236,,,59,60', +',,61,,,,,,45,,,,,,,,,235,,,,,93,83,86,87,,88,90,89,91,,,,,84,92,,,,75', +'76,72,63,58,85,97,98,64,65,,,,68,,66,67,69,30,31,73,74,,,,,,77,28,27', +'105,104,106,107,,,237,,,,,,,46,,,109,108,110,99,57,101,100,102,292,103', +'111,112,,95,96,42,43,41,,,,,,,,,,,,,,,,,,,,230,,,236,,,59,60,,,61,,289', +',287,,45,,,293,,,,,,235,,,,,93,290,86,87,,88,90,89,91,,,,,84,92,,,,75', +'76,72,63,58,85,97,98,64,65,,,,68,,66,67,69,317,318,73,74,,,,,,77,314', +'320,105,104,106,107,,,237,,,,,,,46,,,109,108,110,99,57,101,100,102,', +'103,111,112,,95,96,42,43,41,,,,,,,,,,,,,,,,,,,,230,,,236,,,59,60,,,61', +',,,,,45,,,,,,,,,235,,,,,93,83,86,87,,88,90,89,91,,,,,84,92,,,,75,76', +'72,63,58,85,97,98,64,65,,,,68,,66,67,69,30,31,73,74,,,,,,77,28,27,105', +'104,106,107,,,237,,,,,,,46,,,109,108,110,99,57,101,100,102,,103,111', +'112,,95,96,42,43,41,,,,,,,,,,,,,,,,,,,,230,,,236,,,59,60,,,61,,,,,,45', +',,,,,,,,235,,,,,93,83,86,87,,88,90,89,91,,,,,84,92,,,,75,76,72,63,58', +'85,97,98,64,65,,,,68,,66,67,69,30,31,73,74,,,,,,77,28,27,105,104,106', +'107,,,19,,,,,,,46,,,109,108,110,99,57,101,100,102,,103,111,112,,95,96', +'42,43,41,,,,,,,,,,,,,,,,,,,,230,,,236,,,59,60,,,61,,,,,,45,,,,,,,,,20', +',,,,93,83,86,87,,88,90,89,91,,,,,84,92,,,,75,76,72,63,58,85,97,98,64', +'65,,,,68,,66,67,69,317,318,73,74,,,,,,77,314,320,105,104,106,107,,,237', +',,,,,,315,,,109,108,110,99,57,101,100,102,,103,111,112,,95,96,,,321', +',,,,,,,,,,,,,,,,,,,311,,,236,,,59,60,,,61,,,682,,679,678,677,687,680', +',,,,,,,,690,,93,83,86,87,,88,90,89,91,,,,,84,92,,,,515,,685,63,,85,97', +'98,75,76,72,,58,698,697,,64,65,691,,,68,,66,67,69,317,318,73,74,,,,', +',77,314,320,105,104,106,107,,,237,,,,,,,46,,,109,108,110,99,57,101,100', +'102,,103,111,112,,95,96,42,43,41,,,,,,,,,,,,,,,,,,,,230,,,236,,,59,60', +',,61,,,,,,45,,,,,,,,,235,,,,,93,83,86,87,,88,90,89,91,,,,,84,92,,,,75', +'76,72,63,58,85,97,98,64,65,,,,68,,66,67,69,317,318,73,74,,,,,,77,314', +'320,105,104,106,107,,,237,,,,,,,46,,,109,108,110,99,57,101,100,102,', +'103,111,112,,95,96,42,43,41,,,,,,,,,,,,,,,,,,,,230,,,236,,,59,60,,,61', +',413,,,,45,,,,,,,,,235,,,,,93,83,86,87,,88,90,89,91,,,,,84,92,,,,75', +'76,72,63,58,85,97,98,64,65,,,,68,,66,67,69,317,318,73,74,,,,,,77,314', +'320,105,104,106,107,,,237,,,,,,,315,,,109,108,110,99,57,101,100,102', +',103,111,112,,95,96,,,321,,,,,,,,,,,,,,,,,,,,311,,,307,,,59,60,,,61', +',,,,,,,,,,,,,,,,,,,93,83,86,87,,88,90,89,91,,,,,84,92,,,,75,76,72,63', +'58,85,97,98,64,65,,,,68,,66,67,69,317,318,73,74,,,,,,77,314,320,105', +'104,106,107,,,237,,,,,,,315,,,109,108,110,99,57,101,100,102,,103,111', +'112,,95,96,,,321,,,,,,,,,,,,,,,,,,,,311,,,307,,,59,60,,,61,,,,,,,,,', +',,,,,,,,,,93,83,86,87,,88,90,89,91,,,,,84,92,,,,75,76,72,63,58,85,97', +'98,64,65,,,,68,,66,67,69,317,318,73,74,,,,,,77,314,320,105,104,106,107', +',,237,,,,,,,315,,,109,108,110,99,57,101,100,102,,103,111,112,,95,96', +',,321,,,,,,,,,,,,,,,,,,,,311,,,307,,,59,60,,,61,,,,,,,,,,,,,,,,,,,,93', +'83,86,87,,88,90,89,91,,,,,84,92,,,,75,76,72,63,58,85,97,98,64,65,,,', +'68,,66,67,69,317,318,73,74,,,,,,77,314,320,105,104,106,107,,,237,,,', +',,,46,,,109,108,110,99,57,101,100,102,,103,111,112,,95,96,42,43,41,', +',,,,,,,,,,,,,,,,,,230,,,236,,,59,60,,,61,,,,,,45,,,,,,,,,235,,,,,93', +'83,86,87,,88,90,89,91,,,,,84,92,,,,75,76,72,63,58,85,97,98,64,65,,,', +'68,,66,67,69,317,318,73,74,,,,,,77,314,320,105,104,106,107,,,237,,,', +',,,46,,,109,108,110,99,57,101,100,102,,103,111,112,,95,96,42,43,41,', +',,,,,,,,,,,,,,,,,,230,,,236,,,59,60,,,61,,,,,,45,,,,,,,,,235,,,,,93', +'83,86,87,,88,90,89,91,,,,,84,92,,,,75,76,72,63,58,85,97,98,64,65,,,', +'68,,66,67,69,317,318,73,74,,,,,,77,314,320,105,104,106,107,,,237,,,', +',,,46,,,109,108,110,99,57,101,100,102,,103,111,112,,95,96,42,43,41,', +',,,,,,,,,,,,,,,,,,230,,,236,,,59,60,,,61,,,,,,45,,,,,,,,,235,,,,,93', +'83,86,87,,88,90,89,91,,,,,84,92,,,,75,76,72,63,58,85,97,98,64,65,,,', +'68,,66,67,69,317,318,73,74,,,,,,77,314,320,105,104,106,107,,,237,,,', +',,,46,,,109,108,110,99,57,101,100,102,,103,111,112,,95,96,42,43,41,', +',,,,,,,,,,,,,,,,,,230,,,236,532,,59,60,,,61,,,,,,45,,,,,,,,,235,,,,', +'93,83,86,87,,88,90,89,91,,,,,84,92,,,,75,76,72,63,58,85,97,98,64,65', +',,,68,,66,67,69,30,31,73,74,,,,,,77,28,27,105,104,106,107,,,237,,,,', +',,46,,,109,108,110,99,57,101,100,102,,103,111,112,,95,96,42,43,41,,', +',,,,,,,,,,,,,,,,,230,,,236,,,59,60,,,61,,,,,,45,,,,,,,,,235,,,,,93,83', +'86,87,,88,90,89,91,,,,,84,92,,,,75,76,72,63,58,85,97,98,64,65,,,,68', +',66,67,69,30,31,73,74,,,,,,77,28,27,105,104,106,107,,,237,,,,,,,46,', +',109,108,110,99,57,101,100,102,,103,111,112,,95,96,42,43,41,,,,,,,,', +',,,,,,,,,,,230,,,236,,,59,60,,,61,,,,,,45,,,,,,,,,235,,,,,93,83,86,87', +',88,90,89,91,,,,,84,92,,,,75,76,72,63,58,85,97,98,64,65,,,,68,,66,67', +'69,30,31,73,74,,,,,,77,28,27,105,104,106,107,,,237,,,,,,,46,,,109,108', +'110,99,57,101,100,102,,103,111,112,,95,96,42,43,41,,,,,,,,,,,,,,,,,', +',,230,,,236,,,59,60,,,61,,,,,,45,,,,,,,,,235,,,,,93,83,86,87,,88,90', +'89,91,,,,,84,92,,,,75,76,72,63,58,85,97,98,64,65,,,,68,,66,67,69,30', +'31,73,74,,,,,,77,28,27,105,104,106,107,,,237,,,,,,,46,,,109,108,110', +'99,57,101,100,102,,103,111,112,,95,96,42,43,41,,,,,,,,,,,,,,,,,,,,230', +',,236,,,59,60,,,61,,,,,,45,,,,,,,,,235,,,,,93,83,86,87,,88,90,89,91', +',,,,84,92,,,,75,76,72,63,58,85,97,98,64,65,,,,68,,66,67,69,317,318,73', +'74,,,,,,77,314,320,105,104,106,107,,,237,,,,,,,46,,,109,108,110,99,57', +'101,100,102,292,103,111,112,,95,96,42,43,41,,,,,,,,,,,,,,,,,,,,230,', +',236,,,59,60,,,61,,,,287,,45,,,293,,,,,,235,,,,,93,290,86,87,,88,90', +'89,91,,,,,84,92,,,,75,76,72,63,58,85,97,98,64,65,,,,68,,66,67,69,317', +'318,73,74,,,,,,77,314,320,105,104,106,107,,,237,,,,,,,46,,,109,108,110', +'99,57,101,100,102,292,103,111,112,,95,96,42,43,41,,,,,,,,,,,,,,,,,,', +',230,,,236,,,59,60,,,61,,640,,287,,45,,,293,,,,,,235,,,,,93,290,86,87', +',88,90,89,91,,,,,84,92,,,,75,76,72,63,58,85,97,98,64,65,,,,68,,66,67', +'69,317,318,73,74,,,,,,77,314,320,105,104,106,107,,,237,,,,,,,46,,,109', +'108,110,99,57,101,100,102,,103,111,112,,95,96,42,43,41,,,,,,,,,,,,,', +',,,,,,230,,,236,,,59,60,,,61,,,,,,45,,,,,,,,,235,,,,,93,83,86,87,,88', +'90,89,91,,,,,84,92,,,,,,,63,,85,97,98,75,76,72,9,58,,,,64,65,,,,68,', +'66,67,69,30,31,73,74,,,,,,77,28,27,105,104,106,107,,,19,,,,,,8,46,,10', +'109,108,110,99,57,101,100,102,,103,111,112,,95,96,42,43,41,,,,,,,,,', +',,,,,,,,,,40,,,33,,,59,60,,,61,,35,,,,45,,,,,,,,,20,,,,,93,83,86,87', +',88,90,89,91,,,,,84,92,,,,75,76,72,63,58,85,97,98,64,65,,,,68,,66,67', +'69,30,31,73,74,,,,,,77,28,27,105,104,106,107,,,237,,,,,,,46,,,109,108', +'110,99,57,101,100,102,292,103,111,112,,95,96,42,43,41,,,,,,,,,,,,,,', +',,,,,230,,,236,,,59,60,,,61,,289,,287,,45,,,293,,,,,,235,,,,,93,290', +'86,87,,88,90,89,91,,,,,84,92,,,,75,76,72,63,58,85,97,98,64,65,,,,68', +',66,67,69,30,31,73,74,,,,,,77,28,27,105,104,106,107,,,19,,,,,,,46,,', +'109,108,110,99,57,101,100,102,,103,111,112,,95,96,42,43,41,,,,,,,,,', +',,,,,,,,,,230,,,236,,,59,60,,,61,,,,,,45,,,,,,,,,20,,,,,93,83,86,87', +',88,90,89,91,,,,,84,92,,,,75,76,72,63,58,85,97,98,64,65,,,,68,,66,67', +'69,30,31,73,74,,,,,,77,28,27,105,104,106,107,,,237,,,,,,,46,,,109,108', +'110,99,57,101,100,102,,103,111,112,,95,96,42,43,41,,,,,,,,,,,,,,,,,', +',,230,,,236,,,59,60,,,61,,,,,,45,,,,,,,,,235,,,,,93,83,86,87,,88,90', +'89,91,,,,,84,92,,,,75,76,72,63,58,85,97,98,64,65,,,,68,,66,67,69,317', +'318,73,74,,,,,,77,314,320,105,104,106,107,,,237,,,,,,,46,,,109,108,110', +'99,57,101,100,102,,103,111,112,,95,96,42,43,41,,,,,,,,,,,,,,,,,,,,230', +',,236,,,59,60,,,61,,744,,,,45,,,,,,,,,235,,,,,93,83,86,87,,88,90,89', +'91,,,,,84,92,,,,75,76,72,63,58,85,97,98,64,65,,,,68,,66,67,69,30,31', +'73,74,,,,,,77,28,27,105,104,106,107,,,237,,,,,,,46,,,109,108,110,99', +'57,101,100,102,292,103,111,112,,95,96,42,43,41,,,,,,,,,,,,,,,,,,,,230', +',,236,,,59,60,,,61,,289,,287,,45,,,293,,,,,,235,,,,,93,290,86,87,,88', +'90,89,91,,,,,84,92,,,,75,76,72,63,58,85,97,98,64,65,,,,68,,66,67,69', +'30,31,73,74,,,,,,77,28,27,105,104,106,107,,,237,,,,,,,46,,,109,108,110', +'99,57,101,100,102,292,103,111,112,,95,96,42,43,41,,,,,,,,,,,,,,,,,,', +',230,,,236,,,59,60,,,61,,289,,287,,45,,,293,,,,,,235,,,,,93,290,86,87', +',88,90,89,91,,,,,84,92,,,,75,76,72,63,58,85,97,98,64,65,,,,68,,66,67', +'69,30,31,73,74,,,,,,77,28,27,105,104,106,107,,,19,,,,,,,46,,,109,108', +'110,99,57,101,100,102,,103,111,112,,95,96,42,43,41,,,,,,,,,,,,,,,,,', +',,230,,,236,,,59,60,,,61,,,,,,45,,,,,,,,,20,,,,,93,83,86,87,,88,90,89', +'91,,,,,84,92,,,,75,76,72,63,58,85,97,98,64,65,,,,68,,66,67,69,317,318', +'73,74,,,,,,77,314,320,105,104,106,107,,,237,,,,,,,46,,,109,108,110,99', +'57,101,100,102,,103,111,112,,95,96,42,43,41,,,,,,,,,,,,,,,,,,,,230,', +',236,,,59,60,,,61,,289,,,,45,,,,,,,,,235,,,,,93,83,86,87,,88,90,89,91', +',,,,84,92,,,,75,76,72,63,58,85,97,98,64,65,,,,68,,66,67,69,317,318,73', +'74,,,,,,77,314,320,105,104,106,107,,,237,,,,,,,46,,,109,108,110,99,57', +'101,100,102,292,103,111,112,,95,96,42,43,41,,,,,,,,,,,,,,,,,,,,230,', +',236,,,59,60,,,61,,640,,,,45,,,293,,,,,,235,,,,,93,290,86,87,,88,90', +'89,91,,,,,84,92,,,,75,76,72,63,58,85,97,98,64,65,,,,68,,66,67,69,30', +'31,73,74,,,,,,77,28,27,105,104,106,107,,,19,,,,,,,46,,,109,108,110,99', +'57,101,100,102,,103,111,112,,95,96,42,43,41,,,,,,,,,,,,,,,,,,,,230,', +',236,,,59,60,,,61,,,,,,45,,,,,,,,,20,,,,,93,83,86,87,,88,90,89,91,,', +',,84,92,,,,75,76,72,63,58,85,97,98,64,65,,,,68,,66,67,69,317,318,73', +'74,,,,,,77,314,320,105,104,106,107,,,237,,,,,,,46,,,109,108,110,99,57', +'101,100,102,,103,111,112,,95,96,42,43,41,,,,,,,,,,,,,,,,,,,,230,,,236', +',,59,60,,,61,,,,,,45,,,,,,,,,235,,,,,93,83,86,87,,88,90,89,91,,,,,84', +'92,,,,75,76,72,63,58,85,97,98,64,65,,,,68,,66,67,69,317,318,73,74,,', +',,,77,314,320,105,104,106,107,,,237,,,,,,,46,,,109,108,110,99,57,101', +'100,102,,103,111,112,,95,96,42,43,41,,,,,,,,,,,,,,,,,,,,230,,,236,,', +'59,60,,,61,,,,,,45,,,,,,,,,235,,,,,93,83,86,87,,88,90,89,91,,,,,84,92', +',,,75,76,72,63,58,85,97,98,64,65,,,,68,,66,67,69,317,318,73,74,,,,,', +'77,314,320,105,104,106,107,,,237,,,,,,,315,,,109,108,110,99,57,101,100', +'102,,103,111,112,,95,96,,,321,,,,,,,,,,,,,,,,,,,,311,,,307,,,59,60,', +',61,,,,,,,,,,,,,,,,,,,,93,83,86,87,,88,90,89,91,,,,,84,92,,,,75,76,72', +'63,58,85,97,98,64,65,,,,68,,66,67,69,30,31,73,74,,,,,,77,28,27,105,104', +'106,107,,,19,,,,,,,46,,,109,108,110,99,57,101,100,102,,103,111,112,', +'95,96,42,43,41,,,,,,,,,,,,,,,,,,,,230,,,236,,,59,60,,,61,,,,,,45,,,', +',,,,,20,,,,,93,83,86,87,,88,90,89,91,,,,,84,92,,,,75,76,72,63,58,85', +'97,98,64,65,,,,68,,66,67,69,30,31,73,74,,,,,,77,28,27,105,104,106,107', +',,237,,,,,,,46,,,109,108,110,99,57,101,100,102,292,103,111,112,,95,96', +'42,43,41,,,,,,,,,,,,,,,,,,,,230,,,236,,,59,60,,,61,,289,,287,,45,,,293', +',,,,,235,,,,,93,290,86,87,,88,90,89,91,,,,,84,92,,,,75,76,72,63,58,85', +'97,98,64,65,,,,68,,66,67,69,317,318,73,74,,,,,,77,314,320,105,104,106', +'107,,,237,,,,,,,315,,,109,108,110,99,57,101,100,102,,103,111,112,,95', +'96,,,321,,,,,,,,,,,,,,,,,,,,311,,,307,,,59,60,,,61,,,682,,679,678,677', +'687,680,,,,,,,,,690,,93,83,86,87,,88,90,89,91,,,,,84,92,,,,,,685,63', +',85,97,98,75,76,72,9,58,698,697,,64,65,691,,,68,,66,67,69,30,31,73,74', +',,,,,77,28,27,105,104,106,107,,,19,,,,,,8,46,300,10,109,108,110,99,57', +'101,100,102,,103,111,112,,95,96,42,43,41,,,,,,,,,,,,,,,,,,,,40,,,33', +',,59,60,,,61,,35,,,,45,,,,,,,,,20,,,,,93,83,86,87,,88,90,89,91,,,,,84', +'92,,,,,,397,63,,85,97,98,75,76,72,,58,,,,64,65,,,,68,,66,67,69,317,318', +'73,74,,,,,,77,314,320,105,104,106,107,,,237,,,,,,,46,,,109,108,110,99', +'57,101,100,102,,103,111,112,,95,96,42,43,41,,,,,,,,,,,,,,,,,,,,230,', +',236,,,59,60,,,61,,,,,,45,,,,,,,,,235,,,,,93,83,86,87,,88,90,89,91,', +',,,84,92,,,,75,76,72,63,58,85,97,98,64,65,,,,68,,66,67,69,317,318,73', +'74,,,,,,77,314,320,105,104,106,107,,,237,,,,,,,46,,,109,108,110,99,57', +'101,100,102,292,103,111,112,,95,96,42,43,41,,,,,,,,,,,,,,,,,,,,230,', +',236,,,59,60,,,61,,,,287,,45,,,293,,,,,,235,,,,,93,290,86,87,,88,90', +'89,91,,,,,84,92,,,,75,76,72,63,58,85,97,98,64,65,,,,68,,66,67,69,317', +'318,73,74,,,,,,77,314,320,105,104,106,107,,,237,,,,,,,46,,,109,108,110', +'99,57,101,100,102,292,103,111,112,,95,96,42,43,41,,,,,,,,,,,,,,,,,,', +',230,,,236,,,59,60,,,61,,640,,287,,45,,,293,,,,,,235,,,,,93,290,86,87', +',88,90,89,91,,,,,84,92,,,,75,76,72,63,58,85,97,98,64,65,,,,68,,66,67', +'69,317,318,73,74,,,,,,77,314,320,105,104,106,107,,,237,,,,,,,46,,,109', +'108,110,99,57,101,100,102,,103,111,112,,95,96,42,43,41,,,,,,,,,,,,,', +',,,,,,230,,,236,,,59,60,,,61,,,,,,45,,,,,,,,,235,,,,,93,83,86,87,,88', +'90,89,91,,,,,84,92,,,,75,76,72,63,58,85,97,98,64,65,,,,68,,66,67,69', +'317,318,73,74,,,,,,77,314,320,105,104,106,107,,,237,,,,,,,46,,,109,108', +'110,99,57,101,100,102,,103,111,112,,95,96,42,43,41,,,,,,,,,,,,,,,,,', +',,230,,,236,,,59,60,,,61,,,,,,45,,,,,,,,,235,,,,,93,83,86,87,,88,90', +'89,91,,,,,84,92,,,,75,76,72,63,58,85,97,98,64,65,,,,68,,66,67,69,317', +'318,73,74,,,,,,77,314,320,105,104,106,107,,,237,,,,,,,46,,,109,108,110', +'99,57,101,100,102,,103,111,112,,95,96,42,43,41,,,,,,,,,,,,,,,,,,,,230', +',,236,,,59,60,,,61,,,,,,45,,,,,,,,,235,,,,,93,83,86,87,,88,90,89,91', +',,,,84,92,,,,75,76,72,63,58,85,97,98,64,65,,,,68,,66,67,69,30,31,73', +'74,,,,,,77,28,27,105,104,106,107,,,237,,,,,,,46,,,109,108,110,99,57', +'101,100,102,292,103,111,112,,95,96,42,43,41,,,,,,,,,,,,,,,,,,,,230,', +',236,,,59,60,,,61,,289,,287,,45,,,293,,,,,,235,,,,,93,290,86,87,,88', +'90,89,91,,,,,84,92,,,,75,76,72,63,58,85,97,98,64,65,,,,68,,66,67,69', +'317,318,73,74,,,,,,77,314,320,105,104,106,107,,,237,,,,,,,46,,,109,108', +'110,99,57,101,100,102,,103,111,112,,95,96,42,43,41,,,,,,,,,,,,,,,,,', +',,230,,,236,,,59,60,,,61,,,,,,45,,,,,,,,,235,,,,,93,83,86,87,,88,90', +'89,91,,,,,84,92,,,,,,,63,,85,97,98,178,189,179,202,175,195,185,184,205', +'206,200,183,182,177,203,207,208,187,176,190,194,196,188,181,,,,197,204', +'199,198,191,201,186,174,193,192,,,,,,173,180,171,172,168,169,170,129', +'131,,,130,,,,,,,,162,163,,159,141,142,143,150,147,149,,,144,145,,,,164', +'165,151,152,,,,,,,,,,,,,,156,155,,140,161,158,157,166,153,154,148,146', +'138,160,139,,,167,93,,,,,,,,,,,,,,92,178,189,179,202,175,195,185,184', +'205,206,200,183,182,177,203,207,208,187,176,190,194,196,188,181,,,,197', +'204,199,198,191,201,186,174,193,192,,,,,,173,180,171,172,168,169,170', +'129,131,,,130,,,,,,,,162,163,,159,141,142,143,150,147,149,,,144,145', +',,,164,165,151,152,,,,,,,,,,,,,,156,155,,140,161,158,157,166,153,154', +'148,146,138,160,139,,,167,93,,,,,,,,,,,,,,92,178,189,179,202,175,195', +'185,184,205,206,200,183,182,177,203,207,208,187,176,190,194,196,188', +'181,,,,197,204,199,198,191,201,186,174,193,192,,,,,,173,180,171,172', +'168,169,170,129,131,,,130,,,,,,,,162,163,,159,141,142,143,150,147,149', +',,144,145,,,,164,165,151,152,,,,,,,,,,,,,,156,155,,140,161,158,157,166', +'153,154,148,146,138,160,139,,,167,93,,,,,,,,,,,,,,92,178,189,179,202', +'175,195,185,184,205,206,200,183,182,177,203,207,208,187,176,190,194', +'196,188,181,,,,197,204,199,198,191,201,186,174,193,192,,,,,,173,180', +'171,172,168,169,170,129,131,128,,130,,,,,,,,162,163,,159,141,142,143', +'150,147,149,,,144,145,,,,164,165,151,152,,,,,,,,,,,,,,156,155,,140,161', +'158,157,166,153,154,148,146,138,160,139,,,167,93,,,,,,,,,,,,,,92,178', +'189,179,202,175,195,185,184,205,206,200,183,182,177,203,207,208,187', +'176,190,194,196,188,181,,,,197,204,199,380,379,381,378,174,193,192,', +',,,,173,180,171,172,375,376,377,373,131,101,100,374,,103,,,,,,162,163', +',159,141,142,143,150,147,149,,,144,145,,,,164,165,151,152,,,,,,385,', +',,,,,,156,155,,140,161,158,157,166,153,154,148,146,138,160,139,,,167', +'178,189,179,202,175,195,185,184,205,206,200,183,182,177,203,207,208', +'187,176,190,194,196,188,181,,,,197,204,199,198,191,201,186,174,193,192', +',,,,,173,180,171,172,168,169,170,129,131,,,130,,,,,,,,162,163,,159,141', +'142,143,150,147,149,,,144,145,,,,164,165,151,152,,,,,,,,,,,,,,156,155', +',140,161,158,157,166,153,154,148,146,138,160,139,621,439,167,,622,,', +',,,,,162,163,,159,141,142,143,150,147,149,,,144,145,,,,164,165,151,152', +',,,,,271,,,,,,,,156,155,,140,161,158,157,166,153,154,148,146,138,160', +'139,714,446,167,,715,,,,,,,,162,163,,159,141,142,143,150,147,149,,,144', +'145,,,,164,165,151,152,,,,,,271,,,,,,,,156,155,,140,161,158,157,166', +'153,154,148,146,138,160,139,749,446,167,,748,,,,,,,,162,163,,159,141', +'142,143,150,147,149,,,144,145,,,,164,165,151,152,,,,,,271,,,,,,,,156', +'155,,140,161,158,157,166,153,154,148,146,138,160,139,746,439,167,,747', +',,,,,,,162,163,,159,141,142,143,150,147,149,,,144,145,,,,164,165,151', +'152,,,,,,271,,,,,,,,156,155,,140,161,158,157,166,153,154,148,146,138', +'160,139,435,439,167,,436,,,,,,,,162,163,,159,141,142,143,150,147,149', +',,144,145,,,,164,165,151,152,,,,,,271,,,,,,,,156,155,,140,161,158,157', +'166,153,154,148,146,138,160,139,486,439,167,,487,,,,,,,,162,163,,159', +'141,142,143,150,147,149,,,144,145,,,,164,165,151,152,,,,,,,,,,,,,,156', +'155,,140,161,158,157,166,153,154,148,146,138,160,139,442,446,167,,441', +',,,,,,,162,163,,159,141,142,143,150,147,149,,,144,145,,,,164,165,151', +'152,,,,,,271,,,,,,,,156,155,,140,161,158,157,166,153,154,148,146,138', +'160,139,623,446,167,,624,,,,,,,,162,163,,159,141,142,143,150,147,149', +',,144,145,,,,164,165,151,152,,,,,,271,,,,,,,,156,155,,140,161,158,157', +'166,153,154,148,146,138,160,139,621,439,167,,622,,,,,,,,162,163,,159', +'141,142,143,150,147,149,,,144,145,,,,164,165,151,152,,,,,,271,,,,,,', +',156,155,,140,161,158,157,166,153,154,148,146,138,160,139,1006,446,167', +',1007,,,,,,,,162,163,,159,141,142,143,150,147,149,,,144,145,,,,164,165', +'151,152,,,,,,271,,,,,,,,156,155,,140,161,158,157,166,153,154,148,146', +'138,160,139,486,439,167,,487,,,,,,,,162,163,,159,141,142,143,150,147', +'149,,,144,145,,,,164,165,151,152,,,,,,271,,,,,,,,156,155,,140,161,158', +'157,166,153,154,148,146,138,160,139,717,446,167,,718,,,,,,,,162,163', +',159,141,142,143,150,147,149,,,144,145,,,,164,165,151,152,,,,,,271,', +',,,,,,156,155,,140,161,158,157,166,153,154,148,146,138,160,139,1004', +'439,167,,1005,,,,,,,,162,163,,159,141,142,143,150,147,149,,,144,145', +',,,164,165,151,152,,,,,,271,,,,,,,,156,155,,140,161,158,157,166,153', +'154,148,146,138,160,139,1001,446,167,,1000,,,,,,,,162,163,,159,141,142', +'143,150,147,149,,,144,145,,,,164,165,151,152,,,,,,271,,,,,,,,156,155', +',140,161,158,157,166,153,154,148,146,138,160,139,650,439,167,,651,,', +',,,,,162,163,,159,141,142,143,150,147,149,,,144,145,,,,164,165,151,152', +',,,,,271,,,,,,,,156,155,,140,161,158,157,166,153,154,148,146,138,160', +'139,653,446,167,,654,,,,,,,,162,163,,159,141,142,143,150,147,149,,,144', +'145,,,,164,165,151,152,,,,,,271,,,,,,,,156,155,,140,161,158,157,166', +'153,154,148,146,138,160,139,712,439,167,,713,,,,,,,,162,163,,159,141', +'142,143,150,147,149,,,144,145,,,,164,165,151,152,,,,,,271,,,,,,,,156', +'155,,140,161,158,157,166,153,154,148,146,138,160,139,623,446,167,,624', +',,,,,,,162,163,,159,141,142,143,150,147,149,,,144,145,,,,164,165,151', +'152,,,,,,271,,,,,,,,156,155,,140,161,158,157,166,153,154,148,146,138', +'160,139,,682,167,679,678,677,687,680,,682,,679,678,677,687,680,690,', +',,,,,,690,,682,,679,678,677,687,680,,,,,,685,,,690,,,,,685,695,694,698', +'697,,,,691,695,694,698,697,,,,691,685,,682,,679,678,677,687,680,695', +'694,698,697,,,,691,690,,682,,679,678,677,687,680,,682,,679,678,677,687', +'680,690,,,,,685,,,690,,,,,,695,694,698,697,,,,691,685,,,,,,,,685,695', +'694,698,697,,,,691,695,694,698,697,,,682,691,679,678,677,687,680,,682', +',679,678,677,687,680,690,,,,,,,,690,,682,,679,678,677,687,680,,,,,,685', +',,690,,,,,685,,,698,697,,,,691,695,694,698,697,,,,691,685,,682,,679', +'678,677,687,680,,,698,697,,,,691,690,,682,,679,678,677,687,680,682,', +'679,678,677,687,680,,690,,,,,685,,690,,682,,679,678,677,687,680,698', +'697,,,,691,685,,690,,,,,685,,,,698,697,,,,691,,698,697,,,,691,685,,682', +',679,678,677,687,680,695,694,698,697,,,,691,690,,682,,679,678,677,687', +'680,682,,679,678,677,687,680,,690,,,,,685,668,690,,,,,,,695,694,698', +'697,,,,691,685,,,,,,,685,,695,694,698,697,,,,691,,698,697,,,,691' ] + racc_action_table = arr = ::Array.new(24631, nil) + idx = 0 + clist.each do |str| + str.split(',', -1).each do |i| + arr[idx] = i.to_i unless i.empty? + idx += 1 + end + end + +clist = [ +'623,746,893,574,574,560,713,623,623,623,19,347,623,623,623,772,623,62', +'710,797,463,645,346,392,634,623,623,623,623,354,364,645,1016,393,364', +'358,623,623,1024,623,623,623,623,623,1004,925,1005,975,928,1019,772', +'19,463,1020,451,451,463,463,746,634,660,660,1021,827,355,712,623,623', +'623,623,623,623,623,623,623,623,623,623,623,623,836,1007,623,623,623', +'836,623,623,867,392,623,924,714,623,623,1022,623,574,623,393,623,1,623', +'623,62,623,623,623,623,623,748,623,623,623,560,713,551,748,748,748,893', +'1006,1025,748,748,893,748,623,797,347,623,623,623,623,347,623,710,623', +'354,710,346,710,623,623,358,346,748,748,451,748,748,748,748,748,660', +'630,1024,714,1007,715,650,1024,1004,925,1005,975,928,1004,925,1005,975', +'928,827,355,712,1026,748,748,748,748,748,748,748,748,748,748,748,748', +'748,748,316,420,748,748,748,383,748,433,1006,1007,748,714,383,748,1007', +'1033,867,786,748,924,748,867,748,748,924,748,748,748,748,748,551,748', +'442,748,715,551,650,231,840,442,442,442,41,41,434,442,442,748,442,1006', +'748,748,630,748,1006,748,228,442,420,570,570,351,748,748,316,363,351', +'26,442,442,383,442,442,442,442,442,650,968,715,650,896,831,896,786,968', +'503,831,316,431,650,653,321,321,968,231,840,345,345,442,442,442,442', +'442,442,442,442,442,442,442,442,442,442,421,228,442,442,442,363,442', +'229,41,41,442,786,363,442,786,717,585,363,442,26,442,363,442,442,786', +'442,442,442,442,442,968,442,442,442,651,986,986,503,503,503,363,570', +'26,653,653,443,570,442,387,417,442,442,749,442,503,442,414,321,321,749', +'749,749,442,442,229,749,749,717,749,945,363,945,945,945,717,945,769', +'749,453,717,585,585,587,717,653,700,700,653,749,749,585,749,749,749', +'749,749,296,653,3,412,651,296,717,3,814,409,814,814,814,24,814,403,387', +'387,387,747,24,465,749,749,749,749,749,749,749,749,749,749,749,749,749', +'749,717,769,749,749,749,466,749,467,651,468,749,651,394,749,587,587', +'390,325,749,945,749,651,749,749,587,749,749,749,749,749,441,749,749', +'749,621,490,606,441,441,441,747,494,24,441,441,341,441,749,341,964,749', +'749,964,749,814,749,338,337,362,338,337,622,749,749,325,510,441,441', +'17,441,441,441,441,441,325,511,394,394,394,366,390,390,390,606,666,381', +'366,666,514,457,516,621,381,606,521,366,441,441,441,441,441,441,441', +'441,441,441,441,441,441,441,362,524,441,441,441,17,441,362,622,533,441', +'391,362,441,388,17,362,389,441,534,441,535,441,441,536,441,441,441,441', +'441,99,441,548,441,366,362,457,99,99,99,381,552,99,99,99,563,99,441', +'44,44,441,441,563,441,99,441,99,99,99,14,14,563,441,441,553,362,99,99', +'554,99,99,99,99,99,555,391,391,391,388,388,388,389,389,389,44,44,128', +'380,379,802,802,128,128,368,380,379,99,99,99,99,99,99,99,99,99,99,99', +'99,99,99,563,356,99,99,99,227,99,99,356,359,99,357,227,99,99,572,99', +'356,99,582,99,227,99,99,590,99,99,99,99,99,378,99,102,99,592,353,598', +'378,352,102,102,102,380,379,102,102,102,99,102,342,99,99,99,99,607,99', +'102,99,102,102,102,340,99,99,81,339,356,612,102,102,227,102,102,102', +'102,102,81,47,335,617,329,327,377,376,47,375,81,625,327,377,376,626', +'375,47,627,378,629,327,102,102,102,102,102,102,102,102,102,102,102,102', +'102,102,633,520,102,102,102,920,102,102,520,635,102,637,920,102,102', +'639,102,520,102,326,102,920,102,102,322,102,102,102,102,102,47,102,624', +'102,327,377,376,647,375,624,624,624,649,320,624,624,624,102,624,652', +'102,102,102,102,655,102,656,102,624,624,624,315,102,102,659,314,520', +'661,624,624,920,624,624,624,624,624,436,926,670,16,671,312,374,373,926', +'673,16,674,312,374,373,675,684,926,311,16,692,312,624,624,624,624,624', +'624,624,624,624,624,624,624,624,624,696,699,624,624,624,702,624,624', +'419,708,624,436,435,624,624,419,624,711,624,305,624,436,624,624,419', +'624,624,624,624,624,926,624,16,624,312,374,373,304,946,303,946,946,946', +'301,946,39,720,624,300,38,624,624,624,624,724,624,288,624,446,435,285', +'743,624,624,284,446,446,446,799,435,446,446,446,419,446,946,745,270', +'799,754,237,478,233,446,446,446,446,999,232,999,999,999,39,999,446,446', +'38,446,446,446,446,446,39,654,230,775,38,310,785,789,654,799,799,478', +'310,654,799,478,478,654,478,478,792,310,446,446,446,446,446,446,446', +'446,446,446,446,446,446,446,793,309,446,446,446,798,813,446,309,815', +'446,820,209,446,446,823,446,309,446,113,446,828,446,446,830,446,446', +'446,446,446,654,446,446,446,310,834,835,838,308,839,811,46,811,811,811', +'308,811,446,848,849,446,446,446,446,308,446,447,446,851,852,853,907', +'446,447,447,447,309,855,447,447,447,907,447,856,857,479,858,811,40,873', +'874,447,447,447,447,918,811,918,918,918,878,918,447,447,879,447,447', +'447,447,447,881,718,882,308,907,907,884,479,718,907,887,479,479,718', +'479,479,889,718,37,900,904,917,447,447,447,447,447,447,447,447,447,447', +'447,447,447,447,921,22,447,447,447,927,947,447,15,954,447,957,464,447', +'447,958,447,959,447,960,447,962,447,447,971,447,447,447,447,447,718', +'447,447,447,685,13,685,685,685,888,685,888,888,888,464,888,12,447,464', +'464,447,447,447,447,976,447,57,447,977,978,979,980,447,57,57,57,981', +'982,57,57,57,685,57,530,984,987,888,1000,1001,1003,685,10,57,57,57,888', +'7,,,530,530,,57,57,,57,57,57,57,57,890,,890,890,890,530,890,530,,530', +'530,,530,530,,,530,,530,,,,57,57,57,57,57,57,57,57,57,57,57,57,57,57', +',890,57,57,57,,,57,,,57,,,57,57,,57,,57,,57,,57,57,,57,57,57,57,57,', +'57,,57,578,578,,,578,578,578,,1015,,1015,1015,1015,57,1015,,57,57,57', +'57,,57,485,57,,,,,57,485,485,485,,,485,485,485,778,485,778,778,778,778', +'778,,1015,,485,485,,,,778,,,483,,,485,485,,485,485,485,485,485,334,334', +'334,334,334,483,483,,778,6,6,6,6,6,,,,778,778,778,778,483,,483,778,483', +'483,,483,483,,,483,485,483,27,,,,,485,,27,27,27,485,485,27,27,27,778', +'27,983,,983,983,983,,983,,27,27,27,299,299,299,299,299,485,485,,27,27', +',27,27,27,27,27,,,,,485,,,485,,,983,985,485,985,985,985,,985,,485,,', +'27,27,27,27,27,27,27,27,27,27,27,27,27,27,,,27,27,27,,,27,,27,27,,985', +'27,27,,27,,27,,27,,27,27,,27,27,27,27,27,28,27,27,27,,,,28,28,28,,,28', +'28,28,,28,27,470,,27,27,,27,,27,28,28,,,,,27,,470,470,28,28,,28,28,28', +'28,28,508,508,508,508,508,,470,,470,,470,470,,470,470,,,,,,,,28,28,28', +'28,28,28,28,28,28,28,28,28,28,28,,,28,28,28,,,28,,28,28,,,28,28,,28', +',28,,28,,28,28,,28,28,28,28,28,,28,437,28,,,,,,437,437,437,,,437,437', +'437,28,437,471,28,28,,28,,28,,437,437,437,,,28,,,471,471,,437,437,,437', +'437,437,437,437,,,,,,471,,,,471,471,,471,471,,,,,,,,,437,437,437,437', +'437,437,437,437,437,437,437,437,437,437,,,437,437,437,,,437,,437,437', +',,437,437,,437,,437,,437,,437,437,,437,437,437,437,437,,437,437,437', +',,,,,,,,,,,,,437,,,437,437,,437,,437,550,550,550,550,550,550,437,,,550', +'550,,,,550,,550,550,550,550,550,550,550,,,,,,550,550,550,550,550,550', +'550,,,550,,,,,424,550,550,550,550,550,550,550,550,550,550,550,550,,550', +'550,550,,550,550,550,550,550,424,424,424,424,424,424,424,424,424,424', +'424,,424,424,,,424,424,,550,,,550,,,550,550,,,550,,550,424,,424,550', +'424,424,,424,424,424,424,424,550,424,,,,550,550,550,550,,550,550,550', +'550,,,,,550,550,,424,,424,,,550,,550,550,550,0,0,0,0,0,0,,,,0,0,,,,0', +',0,0,0,0,0,0,0,,,,,,0,0,0,0,0,0,0,,,0,,,,,430,0,0,0,0,0,0,0,0,0,0,0', +'0,,0,0,0,,0,0,0,0,0,430,430,430,430,430,430,430,430,430,430,430,,430', +'430,,,430,430,,0,,,0,,,0,0,,,0,,0,430,,430,0,430,430,,430,430,430,430', +'430,0,430,,,,0,0,0,0,,0,0,0,0,,,,,0,0,,430,,,,,0,,0,0,0,307,307,307', +'307,307,307,,,,307,307,,,,307,,307,307,307,307,307,307,307,,,,,,307', +'307,307,307,307,307,307,,,307,,,,,,307,307,307,307,307,307,307,307,307', +'307,307,307,,307,307,307,,307,307,307,307,307,282,282,282,282,282,282', +'282,282,282,282,282,,282,282,,,282,282,,307,,,307,,,307,307,,,307,,307', +'282,,282,307,282,282,,282,282,282,282,282,307,282,,,,307,307,307,307', +',307,307,307,307,,,,,307,307,,282,,,,,307,,307,307,307,571,571,571,571', +'571,571,,,,571,571,,,,571,,571,571,571,571,571,571,571,,,,,,571,571', +'571,571,571,571,571,,,571,,,,,,571,571,571,571,571,571,571,571,571,571', +'571,571,,571,571,571,,571,571,571,571,571,751,751,751,751,751,751,751', +'751,751,751,751,,751,751,,,751,751,,571,,,571,,,571,571,,,571,,571,751', +',751,571,751,751,,751,751,751,751,751,571,751,,,,571,571,571,571,,571', +'571,571,571,,,,,571,571,,751,,,,,571,,571,571,571,350,350,350,350,350', +'350,,,,350,350,,,,350,,350,350,350,350,350,350,350,,,,,,350,350,350', +'350,350,350,350,,,350,,,,,,350,350,350,350,350,350,350,350,350,350,350', +'350,,350,350,350,,350,350,350,350,350,482,482,482,482,482,482,482,482', +'482,482,482,,482,482,,,482,482,,350,,,350,,,350,350,,,350,,350,482,', +'482,350,482,482,,482,482,482,482,482,350,482,,,,350,350,350,350,,350', +'350,350,350,,,,,350,350,482,482,,,,,350,,350,350,350,923,923,923,923', +'923,923,,,,923,923,,,,923,,923,923,923,923,923,923,923,,,,,,923,923', +'923,923,923,923,923,,,923,,,,,,923,923,923,923,923,923,923,923,923,923', +'923,923,,923,923,923,,923,923,923,923,923,845,845,845,845,845,845,845', +'845,845,845,845,,845,845,,,845,845,,923,,,923,,,923,923,,,923,,923,845', +',845,923,845,845,,845,845,845,845,845,923,845,,,,923,923,923,923,,923', +'923,923,923,,,,,923,923,,845,,,,,923,,923,923,923,791,791,791,791,791', +'791,,,,791,791,,,,791,,791,791,791,791,791,791,791,,,,,,791,791,791', +'791,791,791,791,,,791,,,,,,791,791,791,791,791,791,791,791,791,791,791', +'791,,791,791,791,,791,791,791,791,791,21,21,21,21,21,21,21,21,21,21', +'21,,21,21,,,21,21,,791,,,791,,,791,791,,,791,,791,21,,21,791,21,21,', +'21,21,21,21,21,791,21,,,,791,791,791,791,,791,791,791,791,,,,,791,791', +',21,,,,,791,,791,791,791,735,735,735,735,735,735,,,,735,735,,,,735,', +'735,735,735,735,735,735,735,,,,,,735,735,735,735,735,735,735,,,735,', +',,,,735,735,735,735,735,735,735,735,735,735,735,735,,735,735,735,,735', +'735,735,735,735,531,531,531,531,531,531,531,531,531,531,531,,531,531', +',,531,531,,735,,,735,,,735,735,,,735,,735,531,,531,735,531,531,,531', +'531,531,531,531,735,531,,,,735,735,735,735,,735,735,735,735,,,,,735', +'735,,531,,,,,735,,735,735,735,716,716,716,716,716,716,,,,716,716,,,', +'716,,716,716,716,716,716,716,716,,,,,,716,716,716,716,716,716,716,,', +'716,,,,,,716,716,716,716,716,716,716,716,716,716,716,716,,716,716,716', +',716,716,716,716,716,461,461,461,461,461,461,461,461,461,461,461,,461', +'461,,,461,461,,716,,,716,,,716,716,,,716,,716,461,,461,716,461,461,', +'461,461,461,461,461,716,461,,,,716,716,716,716,,716,716,716,716,,,,', +'716,716,,,,,,,716,,716,716,716,302,302,302,302,302,302,,,,302,302,,', +',302,,302,302,302,302,302,302,302,,,,,,302,302,302,302,302,302,302,', +',302,,,,,,302,302,302,302,302,302,302,302,302,302,302,302,,302,302,302', +',302,302,302,302,302,473,473,473,473,473,473,473,,,473,473,,,,,,473', +'473,,302,,,302,,,302,302,,,302,,302,473,,473,302,473,473,,473,473,473', +'473,473,302,473,,,,302,302,302,302,,302,302,302,302,,,,,302,302,,,,', +',,302,,302,302,302,780,780,780,780,780,780,,,,780,780,,,,780,,780,780', +'780,780,780,780,780,,,,,,780,780,780,780,780,780,780,,,780,,,,,,780', +'780,780,780,780,780,780,780,780,780,780,780,,780,780,780,,780,780,780', +'780,780,475,475,475,475,475,475,475,,,475,475,,,,,,475,475,,780,,,780', +',,780,780,,,780,,780,475,,475,780,475,475,,475,475,475,475,475,780,475', +',,,780,780,780,780,,780,780,780,780,,,,,780,780,,,,,,,780,,780,780,780', +'832,832,832,832,832,832,,,,832,832,,,,832,,832,832,832,832,832,832,832', +',,,,,832,832,832,832,832,832,832,,,832,,,,,,832,832,832,832,832,832', +'832,832,832,832,832,832,,832,832,832,,832,832,832,832,832,477,477,477', +'477,477,477,477,,,477,477,,,,,,477,477,,832,,,832,,,832,832,,,832,,832', +'477,,477,832,477,477,,477,477,477,477,477,832,477,,,,832,832,832,832', +',832,832,832,832,,,,,832,832,,,,,,,832,,832,832,832,725,725,725,725', +'725,725,,,,725,725,,,,725,,725,725,725,725,725,725,725,,,,,,725,725', +'725,725,725,725,725,,,725,,,,,,725,725,725,725,725,725,725,725,725,725', +'725,725,,725,725,725,,725,725,725,725,725,472,472,472,472,472,472,472', +',,472,472,,,,,,472,472,,725,,,725,,,725,725,,,725,,725,472,,472,725', +'472,472,,472,472,472,472,472,725,472,,,,725,725,725,725,,725,725,725', +'725,,,,,725,725,,,,,,,725,,725,725,725,721,721,721,721,721,721,,,,721', +'721,,,,721,,721,721,721,721,721,721,721,,,,,,721,721,721,721,721,721', +'721,,,721,,,,,,721,721,721,721,721,721,721,721,721,721,721,721,,721', +'721,721,,721,721,721,721,721,481,481,481,481,481,481,481,481,,481,481', +',,,,,481,481,,721,,,721,,,721,721,,,721,,721,481,,481,721,481,481,,481', +'481,481,481,481,721,481,,,,721,721,721,721,,721,721,721,721,,,,,721', +'721,,,,,,,721,,721,721,721,236,236,236,236,236,236,,,,236,236,,,,236', +',236,236,236,236,236,236,236,,,,,,236,236,236,236,236,236,236,,,236', +',,,,,236,236,236,236,236,236,236,236,236,236,236,236,,236,236,236,,236', +'236,236,236,236,480,480,480,480,480,480,480,,,480,480,,,,,,480,480,', +'236,,,236,,,236,236,,,236,,236,480,,480,236,480,480,,480,480,480,480', +'480,236,480,,,,236,236,236,236,,236,236,236,236,,,,,236,236,,,,,,,236', +',236,236,236,826,826,826,826,826,826,,,,826,826,,,,826,,826,826,826', +'826,826,826,826,,,,,,826,826,826,826,826,826,826,,,826,,,,,,826,826', +'826,826,826,826,826,826,826,826,826,826,,826,826,826,,826,826,826,826', +'826,462,462,462,462,462,462,462,462,462,462,462,,462,462,,,462,462,', +'826,,,826,,,826,826,,,826,,826,462,,462,826,462,462,,462,462,462,462', +'462,826,462,,,,826,826,826,826,,826,826,826,826,,,,,826,826,,,,,,,826', +',826,826,826,33,33,33,33,33,33,,,,33,33,,,,33,,33,33,33,33,33,33,33', +',,,,,33,33,33,33,33,33,33,,,33,,,,,,33,33,33,33,33,33,33,33,33,33,33', +'33,,33,33,33,,33,33,33,33,33,476,476,476,476,476,476,476,,,476,476,', +',,,,476,476,,33,,,33,,,33,33,,,33,,33,476,,476,33,476,476,,476,476,476', +'476,476,33,476,,,,33,33,33,33,,33,33,33,33,,,,,33,33,,,,,,,33,,33,33', +'33,547,547,547,547,547,547,,,,547,547,,,,547,,547,547,547,547,547,547', +'547,,,,,,547,547,547,547,547,547,547,,,547,,,,,,547,547,547,547,547', +'547,547,547,547,547,547,547,,547,547,547,,547,547,547,547,547,474,474', +'474,474,474,474,474,,,474,474,,,,,,474,474,,547,,,547,,,547,547,,,547', +',547,474,,474,547,474,474,,474,474,474,474,474,547,474,,,,547,547,547', +'547,,547,547,547,547,,,,,547,547,,,,,,,547,,547,547,547,349,349,349', +'349,349,349,,,,349,349,,,,349,,349,349,349,349,349,349,349,,,,,,349', +'349,349,349,349,349,349,,,349,,,,,,349,349,349,349,349,349,349,349,349', +'349,349,349,,349,349,349,,349,349,349,349,349,469,,,,,,,,,,,,,,,,469', +'469,,349,,,349,,,349,349,,,349,,349,469,,469,349,469,469,,469,469,,', +',349,,,,,349,349,349,349,,349,349,349,349,,,,,349,349,,,,,,,349,,349', +'349,349,333,333,333,333,333,333,,,,333,333,,,,333,,333,333,333,333,333', +'333,333,,,,,,333,333,333,333,333,333,333,,,333,,,,,,333,333,333,333', +'333,333,333,333,333,333,333,333,,333,333,333,,333,333,333,333,333,,', +',,,,,,,,,,,,,,,,,333,,,333,,,333,333,,,333,,333,,,,333,,,,,,,,,333,', +',,,333,333,333,333,,333,333,333,333,,,,,333,333,,,,,,,333,,333,333,333', +'126,126,126,126,126,126,,,,126,126,,,,126,,126,126,126,126,126,126,126', +',,,,,126,126,126,126,126,126,126,,,126,,,,,,126,126,126,126,126,126', +'126,126,126,126,126,126,,126,126,126,,126,126,126,126,126,,,,,,,,,,', +',,,,,,,,,126,,,126,,,126,126,,,126,,126,,,,126,,,,,,,,,126,,,,,126,126', +'126,126,,126,126,126,126,,,,,126,126,,,,,,,126,,126,126,126,864,864', +'864,864,864,864,,,,864,864,,,,864,,864,864,864,864,864,864,864,,,,,', +'864,864,864,864,864,864,864,,,864,,,,,,864,864,864,864,864,864,864,864', +'864,864,864,864,,864,864,864,,864,864,864,864,864,,,,,,,,,,,,,,,,,,', +',864,,,864,,,864,864,,,864,,864,,,,864,,,,,,,,,864,,,,,864,864,864,864', +',864,864,864,864,,,,,864,864,,,,,,,864,,864,864,864,953,953,953,953', +'953,953,,,,953,953,,,,953,,953,953,953,953,953,953,953,,,,,,953,953', +'953,953,953,953,953,,,953,,,,,,953,953,953,953,953,953,953,953,953,953', +'953,953,,953,953,953,,953,953,953,953,953,,,,,,,,,,,,,,,,,,,,953,,,953', +',,953,953,,,953,,953,,,,953,,,,,,,,,953,,,,,953,953,953,953,,953,953', +'953,953,,,,,953,953,,,,,,,953,,953,953,953,211,211,211,211,211,211,', +',,211,211,,,,211,,211,211,211,211,211,211,211,,,,,,211,211,211,211,211', +'211,211,,,211,,,,,,211,211,211,211,211,211,211,211,211,211,211,211,', +'211,211,211,,211,211,211,211,211,,,,,,,,,,,,,,,,,,,,211,,,211,,,211', +'211,,,211,,211,,,,211,,,,,,,,,211,,,,,211,211,211,211,,211,211,211,211', +',,,,211,211,,,,,,,211,,211,211,211,948,948,948,948,948,948,,,,948,948', +',,,948,,948,948,948,948,948,948,948,,,,,,948,948,948,948,948,948,948', +',,948,,,,,,948,948,948,948,948,948,948,948,948,948,948,948,,948,948', +'948,,948,948,948,948,948,,,,,,,,,,,,,,,,,,,,948,,,948,,,948,948,,,948', +',948,,,,948,,,,,,,,,948,,,,,948,948,948,948,,948,948,948,948,,,,,948', +'948,,,,,,,948,,948,948,948,931,931,931,931,931,931,,,,931,931,,,,931', +',931,931,931,931,931,931,931,,,,,,931,931,931,931,931,931,931,,,931', +',,,,,931,931,931,931,931,931,931,931,931,931,931,931,,931,931,931,,931', +'931,931,931,931,,,,,,,,,,,,,,,,,,,,931,,,931,,,931,931,,,931,,931,,', +',931,,,,,,,,,931,,,,,931,931,931,931,,931,931,931,931,,,,,931,931,,', +',,,,931,,931,931,931,846,846,846,846,846,846,,,,846,846,,,,846,,846', +'846,846,846,846,846,846,,,,,,846,846,846,846,846,846,846,,,846,,,,,', +'846,846,846,846,846,846,846,846,846,846,846,846,,846,846,846,,846,846', +'846,846,846,,,,,,,,,,,,,,,,,,,,846,,,846,,,846,846,,,846,,846,,,,846', +',,,,,,,,846,,,,,846,846,846,846,,846,846,846,846,,,,,846,846,,,,,,,846', +',846,846,846,930,930,930,930,930,930,,,,930,930,,,,930,,930,930,930', +'930,930,930,930,,,,,,930,930,930,930,930,930,930,,,930,,,,,,930,930', +'930,930,930,930,930,930,930,930,930,930,,930,930,930,,930,930,930,930', +'930,,,,,,,,,,,,,,,,,,,,930,,,930,,,930,930,,,930,,930,,,,930,,,,,,,', +',930,,,,,930,930,930,930,,930,930,930,930,,,,,930,930,,,,224,224,224', +'930,224,930,930,930,224,224,,,,224,,224,224,224,224,224,224,224,,,,', +',224,224,224,224,224,224,224,,,224,,,,,,,224,,,224,224,224,224,224,224', +'224,224,,224,224,224,,224,224,224,224,224,,,,,,,,,,,,,,,,,,,,224,,,224', +',,224,224,,,224,,,,,,224,,,,,,,,,224,,,,,224,224,224,224,,224,224,224', +'224,,,,,224,224,224,,,770,770,770,224,770,224,224,224,770,770,,,,770', +',770,770,770,770,770,770,770,,,,,,770,770,770,770,770,770,770,,,770', +',,,,,,770,,,770,770,770,770,770,770,770,770,,770,770,770,,770,770,770', +'770,770,,,,,,,,,,,,,,,,,,,,770,,,770,,,770,770,,,770,,,,,,770,,,,,,', +',,770,,,,,770,770,770,770,,770,770,770,770,,,,,770,770,,,,768,768,768', +'770,768,770,770,770,768,768,,,,768,,768,768,768,768,768,768,768,,,,', +',768,768,768,768,768,768,768,,,768,,,,,,,768,,,768,768,768,768,768,768', +'768,768,,768,768,768,,768,768,768,768,768,,,,,,,,,,,,,,,,,,,,768,,,768', +',,768,768,,,768,,,,,,768,,,,,,,,,768,,,,,768,768,768,768,,768,768,768', +'768,,,,,768,768,,,,767,767,767,768,767,768,768,768,767,767,,,,767,,767', +'767,767,767,767,767,767,,,,,,767,767,767,767,767,767,767,,,767,,,,,', +',767,,,767,767,767,767,767,767,767,767,,767,767,767,,767,767,767,767', +'767,,,,,,,,,,,,,,,,,,,,767,,,767,,,767,767,,,767,,,,,,767,,,,,,,,,767', +',,,,767,767,767,767,,767,767,767,767,,,,,767,767,,,,766,766,766,767', +'766,767,767,767,766,766,,,,766,,766,766,766,766,766,766,766,,,,,,766', +'766,766,766,766,766,766,,,766,,,,,,,766,,,766,766,766,766,766,766,766', +'766,,766,766,766,,766,766,766,766,766,,,,,,,,,,,,,,,,,,,,766,,,766,', +',766,766,,,766,,,,,,766,,,,,,,,,766,,,,,766,766,766,766,,766,766,766', +'766,,,,,766,766,,,,235,235,235,766,235,766,766,766,235,235,,,,235,,235', +'235,235,235,235,235,235,,,,,,235,235,235,235,235,235,235,,,235,,,,,', +',235,,,235,235,235,235,235,235,235,235,,235,235,235,,235,235,235,235', +'235,,,,,,,,,,,,,,,,,,,,235,,,235,,,235,235,,,235,,,,,,235,,,,,,,,,235', +',,,,235,235,235,235,,235,235,235,235,,,,,235,235,,,,765,765,765,235', +'765,235,235,235,765,765,,,,765,,765,765,765,765,765,765,765,,,,,,765', +'765,765,765,765,765,765,,,765,,,,,,,765,,,765,765,765,765,765,765,765', +'765,,765,765,765,,765,765,765,765,765,,,,,,,,,,,,,,,,,,,,765,,,765,', +',765,765,,,765,,,,,,765,,,,,,,,,765,,,,,765,765,765,765,,765,765,765', +'765,,,,,765,765,,,,238,238,238,765,238,765,765,765,238,238,,,,238,,238', +'238,238,238,238,238,238,,,,,,238,238,238,238,238,238,238,,,238,,,,,', +',238,,,238,238,238,238,238,238,238,238,,238,238,238,,238,238,238,238', +'238,,,,,,,,,,,,,,,,,,,,238,,,238,,,238,238,,,238,,,,,,238,,,,,,,,,238', +',,,,238,238,238,238,,238,238,238,238,,,,,238,238,,,,239,239,239,238', +'239,238,238,238,239,239,,,,239,,239,239,239,239,239,239,239,,,,,,239', +'239,239,239,239,239,239,,,239,,,,,,,239,,,239,239,239,239,239,239,239', +'239,,239,239,239,,239,239,239,239,239,,,,,,,,,,,,,,,,,,,,239,,,239,', +',239,239,,,239,,,,,,239,,,,,,,,,239,,,,,239,239,239,239,,239,239,239', +'239,,,,,239,239,,,,240,240,240,239,240,239,239,239,240,240,,,,240,,240', +'240,240,240,240,240,240,,,,,,240,240,240,240,240,240,240,,,240,,,,,', +',240,,,240,240,240,240,240,240,240,240,,240,240,240,,240,240,240,240', +'240,,,,,,,,,,,,,,,,,,,,240,,,240,,,240,240,,,240,,,,,,240,,,,,,,,,240', +',,,,240,240,240,240,,240,240,240,240,,,,,240,240,,,,241,241,241,240', +'241,240,240,240,241,241,,,,241,,241,241,241,241,241,241,241,,,,,,241', +'241,241,241,241,241,241,,,241,,,,,,,241,,,241,241,241,241,241,241,241', +'241,,241,241,241,,241,241,241,241,241,,,,,,,,,,,,,,,,,,,,241,,,241,', +',241,241,,,241,,,,,,241,,,,,,,,,241,,,,,241,241,241,241,,241,241,241', +'241,,,,,241,241,,,,242,242,242,241,242,241,241,241,242,242,,,,242,,242', +'242,242,242,242,242,242,,,,,,242,242,242,242,242,242,242,,,242,,,,,', +',242,,,242,242,242,242,242,242,242,242,,242,242,242,,242,242,242,242', +'242,,,,,,,,,,,,,,,,,,,,242,,,242,,,242,242,,,242,,,,,,242,,,,,,,,,242', +',,,,242,242,242,242,,242,242,242,242,,,,,242,242,,,,243,243,243,242', +'243,242,242,242,243,243,,,,243,,243,243,243,243,243,243,243,,,,,,243', +'243,243,243,243,243,243,,,243,,,,,,,243,,,243,243,243,243,243,243,243', +'243,,243,243,243,,243,243,243,243,243,,,,,,,,,,,,,,,,,,,,243,,,243,', +',243,243,,,243,,,,,,243,,,,,,,,,243,,,,,243,243,243,243,,243,243,243', +'243,,,,,243,243,,,,244,244,244,243,244,243,243,243,244,244,,,,244,,244', +'244,244,244,244,244,244,,,,,,244,244,244,244,244,244,244,,,244,,,,,', +',244,,,244,244,244,244,244,244,244,244,,244,244,244,,244,244,244,244', +'244,,,,,,,,,,,,,,,,,,,,244,,,244,,,244,244,,,244,,,,,,244,,,,,,,,,244', +',,,,244,244,244,244,,244,244,244,244,,,,,244,244,,,,245,245,245,244', +'245,244,244,244,245,245,,,,245,,245,245,245,245,245,245,245,,,,,,245', +'245,245,245,245,245,245,,,245,,,,,,,245,,,245,245,245,245,245,245,245', +'245,,245,245,245,,245,245,245,245,245,,,,,,,,,,,,,,,,,,,,245,,,245,', +',245,245,,,245,,,,,,245,,,,,,,,,245,,,,,245,245,245,245,,245,245,245', +'245,,,,,245,245,,,,246,246,246,245,246,245,245,245,246,246,,,,246,,246', +'246,246,246,246,246,246,,,,,,246,246,246,246,246,246,246,,,246,,,,,', +',246,,,246,246,246,246,246,246,246,246,,246,246,246,,246,246,246,246', +'246,,,,,,,,,,,,,,,,,,,,246,,,246,,,246,246,,,246,,,,,,246,,,,,,,,,246', +',,,,246,246,246,246,,246,246,246,246,,,,,246,246,,,,247,247,247,246', +'247,246,246,246,247,247,,,,247,,247,247,247,247,247,247,247,,,,,,247', +'247,247,247,247,247,247,,,247,,,,,,,247,,,247,247,247,247,247,247,247', +'247,,247,247,247,,247,247,247,247,247,,,,,,,,,,,,,,,,,,,,247,,,247,', +',247,247,,,247,,,,,,247,,,,,,,,,247,,,,,247,247,247,247,,247,247,247', +'247,,,,,247,247,,,,248,248,248,247,248,247,247,247,248,248,,,,248,,248', +'248,248,248,248,248,248,,,,,,248,248,248,248,248,248,248,,,248,,,,,', +',248,,,248,248,248,248,248,248,248,248,,248,248,248,,248,248,248,248', +'248,,,,,,,,,,,,,,,,,,,,248,,,248,,,248,248,,,248,,,,,,248,,,,,,,,,248', +',,,,248,248,248,248,,248,248,248,248,,,,,248,248,,,,249,249,249,248', +'249,248,248,248,249,249,,,,249,,249,249,249,249,249,249,249,,,,,,249', +'249,249,249,249,249,249,,,249,,,,,,,249,,,249,249,249,249,249,249,249', +'249,,249,249,249,,249,249,249,249,249,,,,,,,,,,,,,,,,,,,,249,,,249,', +',249,249,,,249,,,,,,249,,,,,,,,,249,,,,,249,249,249,249,,249,249,249', +'249,,,,,249,249,,,,250,250,250,249,250,249,249,249,250,250,,,,250,,250', +'250,250,250,250,250,250,,,,,,250,250,250,250,250,250,250,,,250,,,,,', +',250,,,250,250,250,250,250,250,250,250,,250,250,250,,250,250,250,250', +'250,,,,,,,,,,,,,,,,,,,,250,,,250,,,250,250,,,250,,,,,,250,,,,,,,,,250', +',,,,250,250,250,250,,250,250,250,250,,,,,250,250,,,,251,251,251,250', +'251,250,250,250,251,251,,,,251,,251,251,251,251,251,251,251,,,,,,251', +'251,251,251,251,251,251,,,251,,,,,,,251,,,251,251,251,251,251,251,251', +'251,,251,251,251,,251,251,251,251,251,,,,,,,,,,,,,,,,,,,,251,,,251,', +',251,251,,,251,,,,,,251,,,,,,,,,251,,,,,251,251,251,251,,251,251,251', +'251,,,,,251,251,,,,252,252,252,251,252,251,251,251,252,252,,,,252,,252', +'252,252,252,252,252,252,,,,,,252,252,252,252,252,252,252,,,252,,,,,', +',252,,,252,252,252,252,252,252,252,252,,252,252,252,,252,252,252,252', +'252,,,,,,,,,,,,,,,,,,,,252,,,252,,,252,252,,,252,,,,,,252,,,,,,,,,252', +',,,,252,252,252,252,,252,252,252,252,,,,,252,252,,,,253,253,253,252', +'253,252,252,252,253,253,,,,253,,253,253,253,253,253,253,253,,,,,,253', +'253,253,253,253,253,253,,,253,,,,,,,253,,,253,253,253,253,253,253,253', +'253,,253,253,253,,253,253,253,253,253,,,,,,,,,,,,,,,,,,,,253,,,253,', +',253,253,,,253,,,,,,253,,,,,,,,,253,,,,,253,253,253,253,,253,253,253', +'253,,,,,253,253,,,,254,254,254,253,254,253,253,253,254,254,,,,254,,254', +'254,254,254,254,254,254,,,,,,254,254,254,254,254,254,254,,,254,,,,,', +',254,,,254,254,254,254,254,254,254,254,,254,254,254,,254,254,254,254', +'254,,,,,,,,,,,,,,,,,,,,254,,,254,,,254,254,,,254,,,,,,254,,,,,,,,,254', +',,,,254,254,254,254,,254,254,254,254,,,,,254,254,,,,255,255,255,254', +'255,254,254,254,255,255,,,,255,,255,255,255,255,255,255,255,,,,,,255', +'255,255,255,255,255,255,,,255,,,,,,,255,,,255,255,255,255,255,255,255', +'255,,255,255,255,,255,255,255,255,255,,,,,,,,,,,,,,,,,,,,255,,,255,', +',255,255,,,255,,,,,,255,,,,,,,,,255,,,,,255,255,255,255,,255,255,255', +'255,,,,,255,255,,,,256,256,256,255,256,255,255,255,256,256,,,,256,,256', +'256,256,256,256,256,256,,,,,,256,256,256,256,256,256,256,,,256,,,,,', +',256,,,256,256,256,256,256,256,256,256,,256,256,256,,256,256,256,256', +'256,,,,,,,,,,,,,,,,,,,,256,,,256,,,256,256,,,256,,,,,,256,,,,,,,,,256', +',,,,256,256,256,256,,256,256,256,256,,,,,256,256,,,,257,257,257,256', +'257,256,256,256,257,257,,,,257,,257,257,257,257,257,257,257,,,,,,257', +'257,257,257,257,257,257,,,257,,,,,,,257,,,257,257,257,257,257,257,257', +'257,,257,257,257,,257,257,257,257,257,,,,,,,,,,,,,,,,,,,,257,,,257,', +',257,257,,,257,,,,,,257,,,,,,,,,257,,,,,257,257,257,257,,257,257,257', +'257,,,,,257,257,,,,258,258,258,257,258,257,257,257,258,258,,,,258,,258', +'258,258,258,258,258,258,,,,,,258,258,258,258,258,258,258,,,258,,,,,', +',258,,,258,258,258,258,258,258,258,258,,258,258,258,,258,258,258,258', +'258,,,,,,,,,,,,,,,,,,,,258,,,258,,,258,258,,,258,,,,,,258,,,,,,,,,258', +',,,,258,258,258,258,,258,258,258,258,,,,,258,258,,,,259,259,259,258', +'259,258,258,258,259,259,,,,259,,259,259,259,259,259,259,259,,,,,,259', +'259,259,259,259,259,259,,,259,,,,,,,259,,,259,259,259,259,259,259,259', +'259,,259,259,259,,259,259,259,259,259,,,,,,,,,,,,,,,,,,,,259,,,259,', +',259,259,,,259,,,,,,259,,,,,,,,,259,,,,,259,259,259,259,,259,259,259', +'259,,,,,259,259,,,,264,264,264,259,264,259,259,259,264,264,,,,264,,264', +'264,264,264,264,264,264,,,,,,264,264,264,264,264,264,264,,,264,,,,,', +',264,,,264,264,264,264,264,264,264,264,,264,264,264,,264,264,264,264', +'264,,,,,,,,,,,,,,,,,,,,264,,,264,,,264,264,,,264,,,,,,264,,,,,,,,,264', +',,,,264,264,264,264,,264,264,264,264,,,,,264,264,,,,752,752,752,264', +'752,264,264,264,752,752,,,,752,,752,752,752,752,752,752,752,,,,,,752', +'752,752,752,752,752,752,,,752,,,,,,,752,,,752,752,752,752,752,752,752', +'752,,752,752,752,,752,752,752,752,752,,,,,,,,,,,,,,,,,,,,752,,,752,', +',752,752,,,752,,,,,,752,,,,,,,,,752,,,,,752,752,752,752,,752,752,752', +'752,,,,,752,752,,,,271,271,271,752,271,752,752,752,271,271,,,,271,,271', +'271,271,271,271,271,271,,,,,,271,271,271,271,271,271,271,,,271,,,,,', +',271,,,271,271,271,271,271,271,271,271,271,271,271,271,,271,271,271', +'271,271,,,,,,,,,,,,,,,,,,,,271,,,271,,,271,271,,,271,,271,,271,,271', +',,271,,,,,,271,,,,,271,271,271,271,,271,271,271,271,,,,,271,271,,,,272', +'272,272,271,272,271,271,271,272,272,,,,272,,272,272,272,272,272,272', +'272,,,,,,272,272,272,272,272,272,272,,,272,,,,,,,272,,,272,272,272,272', +'272,272,272,272,272,272,272,272,,272,272,272,272,272,,,,,,,,,,,,,,,', +',,,,272,,,272,,,272,272,,,272,,272,,272,,272,,,272,,,,,,272,,,,,272', +'272,272,272,,272,272,272,272,,,,,272,272,,,,280,280,280,272,280,272', +'272,272,280,280,,,,280,,280,280,280,280,280,280,280,,,,,,280,280,280', +'280,280,280,280,,,280,,,,,,,280,,,280,280,280,280,280,280,280,280,280', +'280,280,280,,280,280,280,280,280,,,,,,,,,,,,,,,,,,,,280,,,280,,,280', +'280,,,280,,280,,280,,280,,,280,,,,,,280,,,,,280,280,280,280,,280,280', +'280,280,,,,,280,280,280,,,744,744,744,280,744,280,280,280,744,744,,', +',744,,744,744,744,744,744,744,744,,,,,,744,744,744,744,744,744,744,', +',744,,,,,,,744,,,744,744,744,744,744,744,744,744,,744,744,744,,744,744', +'744,744,744,,,,,,,,,,,,,,,,,,,,744,,,744,,,744,744,,,744,,,,,,744,,', +',,,,,,744,,,,,744,744,744,744,,744,744,744,744,,,,,744,744,,,,287,287', +'287,744,287,744,744,744,287,287,,,,287,,287,287,287,287,287,287,287', +',,,,,287,287,287,287,287,287,287,,,287,,,,,,,287,,,287,287,287,287,287', +'287,287,287,,287,287,287,,287,287,287,287,287,,,,,,,,,,,,,,,,,,,,287', +',,287,,,287,287,,,287,,,,,,287,,,,,,,,,287,,,,,287,287,287,287,,287', +'287,287,287,,,,,287,287,,,,289,289,289,287,289,287,287,287,289,289,', +',,289,,289,289,289,289,289,289,289,,,,,,289,289,289,289,289,289,289', +',,289,,,,,,,289,,,289,289,289,289,289,289,289,289,,289,289,289,,289', +'289,289,289,289,,,,,,,,,,,,,,,,,,,,289,,,289,,,289,289,,,289,,,,,,289', +',,,,,,,,289,,,,,289,289,289,289,,289,289,289,289,,,,,289,289,,,,292', +'292,292,289,292,289,289,289,292,292,,,,292,,292,292,292,292,292,292', +'292,,,,,,292,292,292,292,292,292,292,,,292,,,,,,,292,,,292,292,292,292', +'292,292,292,292,,292,292,292,,292,292,292,292,292,,,,,,,,,,,,,,,,,,', +',292,,,292,,,292,292,,,292,,,,,,292,,,,,,,,,292,,,,,292,292,292,292', +',292,292,292,292,,,,,292,292,,,,293,293,293,292,293,292,292,292,293', +'293,,,,293,,293,293,293,293,293,293,293,,,,,,293,293,293,293,293,293', +'293,,,293,,,,,,,293,,,293,293,293,293,293,293,293,293,,293,293,293,', +'293,293,293,293,293,,,,,,,,,,,,,,,,,,,,293,,,293,,,293,293,,,293,,,', +',,293,,,,,,,,,293,,,,,293,293,293,293,,293,293,293,293,,,,,293,293,', +',,,,,293,,293,293,293,298,298,298,298,298,,,,298,298,,,,298,,298,298', +'298,298,298,298,298,,,,,,298,298,298,298,298,298,298,,,298,,,,,,298', +'298,,298,298,298,298,298,298,298,298,298,,298,298,298,,298,298,298,298', +'298,,,,,,,,,,,,,,,,,,,,298,,,298,,,298,298,,,298,,298,,,,298,,,,,,,', +',298,,,,,298,298,298,298,,298,298,298,298,,,,,298,298,,,,722,722,722', +'298,722,298,298,298,722,722,,,,722,,722,722,722,722,722,722,722,,,,', +',722,722,722,722,722,722,722,,,722,,,,,,,722,,,722,722,722,722,722,722', +'722,722,,722,722,722,,722,722,722,722,722,,,,,,,,,,,,,,,,,,,,722,,,722', +',,722,722,,,722,,,,,,722,,,,,,,,,722,,,,,722,722,722,722,,722,722,722', +'722,,,,,722,722,,,,541,541,541,722,541,722,722,722,541,541,,,,541,,541', +'541,541,541,541,541,541,,,,,,541,541,541,541,541,541,541,,,541,,,,,', +',541,,,541,541,541,541,541,541,541,541,541,541,541,541,,541,541,541', +'541,541,,,,,,,,,,,,,,,,,,,,541,,,541,,,541,541,,,541,,,,,,541,,,541', +',,,,,541,,,,,541,541,541,541,,541,541,541,541,,,,,541,541,,,,,,,541', +',541,541,541,5,5,5,5,5,,,,5,5,,,,5,,5,5,5,5,5,5,5,,,,,,5,5,5,5,5,5,5', +',,5,,,,,,5,5,5,5,5,5,5,5,5,5,5,5,,5,5,5,,5,5,5,5,5,,,,,,,,,,,,,,,,,', +',,5,,,5,,,5,5,,,5,,5,,,,5,,,,,,,,,5,,,,,5,5,5,5,,5,5,5,5,,,,,5,5,,,', +'972,972,972,5,972,5,5,5,972,972,,,,972,,972,972,972,972,972,972,972', +',,,,,972,972,972,972,972,972,972,,,972,,,,,,,972,,,972,972,972,972,972', +'972,972,972,972,972,972,972,,972,972,972,972,972,,,,,,,,,,,,,,,,,,,', +'972,,,972,,,972,972,,,972,,972,,972,,972,,,972,,,,,,972,,,,,972,972', +'972,972,,972,972,972,972,,,,,972,972,,,,20,20,20,972,20,972,972,972', +'20,20,,,,20,,20,20,20,20,20,20,20,,,,,,20,20,20,20,20,20,20,,,20,,,', +',,,20,,,20,20,20,20,20,20,20,20,,20,20,20,,20,20,20,20,20,,,,,,,,,,', +',,,,,,,,,20,,,20,,,20,20,,,20,,,,,,20,,,,,,,,,20,,,,,20,20,20,20,,20', +'20,20,20,,,,,20,20,,,,919,919,919,20,919,20,20,20,919,919,,,,919,,919', +'919,919,919,919,919,919,,,,,,919,919,919,919,919,919,919,,,919,,,,,', +',919,,,919,919,919,919,919,919,919,919,,919,919,919,,919,919,,,919,', +',,,,,,,,,,,,,,,,,,919,,,919,,,919,919,,,919,,,,,,,,,,,,,,,,,,,,919,919', +'919,919,,919,919,919,919,,,,,919,919,,,,29,29,29,919,29,919,919,919', +'29,29,,,,29,,29,29,29,29,29,29,29,,,,,,29,29,29,29,29,29,29,,,29,,,', +',,,29,,,29,29,29,29,29,29,29,29,29,29,29,29,,29,29,29,29,29,,,,,,,,', +',,,,,,,,,,,29,,,29,,,29,29,,,29,,29,,29,,29,,,29,,,,,,29,,,,,29,29,29', +'29,,29,29,29,29,,,,,29,29,,,,30,30,30,29,30,29,29,29,30,30,,,,30,,30', +'30,30,30,30,30,30,,,,,,30,30,30,30,30,30,30,,,30,,,,,,,30,,,30,30,30', +'30,30,30,30,30,30,30,30,30,,30,30,30,30,30,,,,,,,,,,,,,,,,,,,,30,,,30', +',,30,30,,,30,,30,,30,,30,,,30,,,,,,30,,,,,30,30,30,30,,30,30,30,30,', +',,,30,30,,,,31,31,31,30,31,30,30,30,31,31,,,,31,,31,31,31,31,31,31,31', +',,,,,31,31,31,31,31,31,31,,,31,,,,,,,31,,,31,31,31,31,31,31,31,31,31', +'31,31,31,,31,31,31,31,31,,,,,,,,,,,,,,,,,,,,31,,,31,,,31,31,,,31,,31', +',31,,31,,,31,,,,,,31,,,,,31,31,31,31,,31,31,31,31,,,,,31,31,,,,34,34', +'34,31,34,31,31,31,34,34,,,,34,,34,34,34,34,34,34,34,,,,,,34,34,34,34', +'34,34,34,,,34,,,,,,,34,,,34,34,34,34,34,34,34,34,,34,34,34,,34,34,,', +'34,,,,,,,,,,,,,,,,,,,,34,,,34,,,34,34,,,34,,34,,,,,,,,,,,,,,,,,,34,34', +'34,34,,34,34,34,34,,,,,34,34,,,,35,35,35,34,35,34,34,34,35,35,,,,35', +',35,35,35,35,35,35,35,,,,,,35,35,35,35,35,35,35,,,35,,,,,,,35,,,35,35', +'35,35,35,35,35,35,,35,35,35,,35,35,,,35,,,,,,,,,,,,,,,,,,,,35,,,35,', +',35,35,,,35,,,1027,,1027,1027,1027,1027,1027,,,,,,,,,1027,,35,35,35', +'35,,35,35,35,35,,,,,35,35,,,,35,,1027,35,,35,35,35,868,868,868,,868', +'1027,1027,,868,868,1027,,,868,,868,868,868,868,868,868,868,,,,,,868', +'868,868,868,868,868,868,,,868,,,,,,,868,,,868,868,868,868,868,868,868', +'868,,868,868,868,,868,868,,,868,,,,,,,,,,,,,,,,,,,,868,,,868,,,868,868', +',,868,,,,,,,,,,,,,,,,,,,,868,868,868,868,,868,868,868,868,,,,,868,868', +',,,859,859,859,868,859,868,868,868,859,859,,,,859,,859,859,859,859,859', +'859,859,,,,,,859,859,859,859,859,859,859,,,859,,,,,,,859,,,859,859,859', +'859,859,859,859,859,,859,859,859,,859,859,,,859,,,,,,,,,,,,,,,,,,,,859', +',,859,,,859,859,,,859,,,,,,,,,,,,,,,,,,,,859,859,859,859,,859,859,859', +'859,,,,,859,859,,,,42,42,42,859,42,859,859,859,42,42,,,,42,,42,42,42', +'42,42,42,42,,,,,,42,42,42,42,42,42,42,,,42,,,,,,,42,,,42,42,42,42,42', +'42,42,42,,42,42,42,,42,42,42,42,42,,,,,,,,,,,,,,,,,,,,42,,,42,,,42,42', +',,42,,,,,,42,,,,,,,,,42,,,,,42,42,42,42,,42,42,42,42,,,,,42,42,,,,43', +'43,43,42,43,42,42,42,43,43,,,,43,,43,43,43,43,43,43,43,,,,,,43,43,43', +'43,43,43,43,,,43,,,,,,,43,,,43,43,43,43,43,43,43,43,,43,43,43,,43,43', +'43,43,43,,,,,,,,,,,,,,,,,,,,43,,,43,,,43,43,,,43,,,,,,43,,,,,,,,,43', +',,,,43,43,43,43,,43,43,43,43,,,,,43,43,,,,45,45,45,43,45,43,43,43,45', +'45,,,,45,,45,45,45,45,45,45,45,,,,,,45,45,45,45,45,45,45,,,45,,,,,,', +'45,,,45,45,45,45,45,45,45,45,,45,45,45,,45,45,45,45,45,,,,,,,,,,,,,', +',,,,,,45,,,45,,,45,45,,,45,,,,,,45,,,,,,,,,45,,,,,45,45,45,45,,45,45', +'45,45,,,,,45,45,,,,844,844,844,45,844,45,45,45,844,844,,,,844,,844,844', +'844,844,844,844,844,,,,,,844,844,844,844,844,844,844,,,844,,,,,,,844', +',,844,844,844,844,844,844,844,844,,844,844,844,,844,844,844,844,844', +',,,,,,,,,,,,,,,,,,,844,,,844,,,844,844,,,844,,,,,,844,,,,,,,,,844,,', +',,844,844,844,844,,844,844,844,844,,,,,844,844,,,,843,843,843,844,843', +'844,844,844,843,843,,,,843,,843,843,843,843,843,843,843,,,,,,843,843', +'843,843,843,843,843,,,843,,,,,,,843,,,843,843,843,843,843,843,843,843', +'843,843,843,843,,843,843,843,843,843,,,,,,,,,,,,,,,,,,,,843,,,843,,', +'843,843,,,843,,,,843,,843,,,843,,,,,,843,,,,,843,843,843,843,,843,843', +'843,843,,,,,843,843,,,,,,,843,,843,843,843,59,59,59,59,59,,,,59,59,', +',,59,,59,59,59,59,59,59,59,,,,,,59,59,59,59,59,59,59,,,59,,,,,,59,59', +',59,59,59,59,59,59,59,59,59,,59,59,59,,59,59,59,59,59,,,,,,,,,,,,,,', +',,,,,59,,,59,,,59,59,,,59,,59,,,,59,,,,,,,,,59,,,,,59,59,59,59,,59,59', +'59,59,,,,,59,59,,,,60,60,60,59,60,59,59,59,60,60,,,,60,,60,60,60,60', +'60,60,60,,,,,,60,60,60,60,60,60,60,,,60,,,,,,,60,,,60,60,60,60,60,60', +'60,60,60,60,60,60,,60,60,60,60,60,,,,,,,,,,,,,,,,,,,,60,,,60,,,60,60', +',,60,,60,,,,60,,,60,,,,,,60,,,,,60,60,60,60,,60,60,60,60,,,,,60,60,', +',,61,61,61,60,61,60,60,60,61,61,,,,61,,61,61,61,61,61,61,61,,,,,,61', +'61,61,61,61,61,61,,,61,,,,,,,61,,,61,61,61,61,61,61,61,61,61,61,61,61', +',61,61,61,61,61,,,,,,,,,,,,,,,,,,,,61,,,61,,,61,61,,,61,,,,,,61,,,61', +',,,,,61,,,,,61,61,61,61,,61,61,61,61,,,,,61,61,,,,64,64,64,61,64,61', +'61,61,64,64,,,,64,,64,64,64,64,64,64,64,,,,,,64,64,64,64,64,64,64,,', +'64,,,,,,,64,,,64,64,64,64,64,64,64,64,,64,64,64,,64,64,64,64,64,,,,', +',,,,,,,,,,,,,,,64,,,64,,,64,64,,,64,,,,,,64,,,,,,,,,64,,,,,64,64,64', +'64,,64,64,64,64,,,,,64,64,,,,65,65,65,64,65,64,64,64,65,65,,,,65,,65', +'65,65,65,65,65,65,,,,,,65,65,65,65,65,65,65,,,65,,,,,,,65,,,65,65,65', +'65,65,65,65,65,,65,65,65,,65,65,65,65,65,,,,,,,,,,,,,,,,,,,,65,,,65', +',,65,65,,,65,,,,,,65,,,,,,,,,65,,,,,65,65,65,65,,65,65,65,65,,,,,65', +'65,,,,68,68,68,65,68,65,65,65,68,68,,,,68,,68,68,68,68,68,68,68,,,,', +',68,68,68,68,68,68,68,,,68,,,,,,,68,,,68,68,68,68,68,68,68,68,,68,68', +'68,,68,68,68,68,68,,,,,,,,,,,,,,,,,,,,68,,,68,,,68,68,,,68,,,,,,68,', +',,,,,,,68,,,,,68,68,68,68,,68,68,68,68,,,,,68,68,68,,,,,68,68,,68,68', +'68,69,69,69,,69,,,,69,69,,,,69,,69,69,69,69,69,69,69,,,,,,69,69,69,69', +'69,69,69,,,69,,,,,,,69,,,69,69,69,69,69,69,69,69,,69,69,69,,69,69,,', +'69,,,,,,,,,,,,,,,,,,,,69,,,69,,,69,69,,,69,,69,,,,,,,,,,,,,,,,,,69,69', +'69,69,,69,69,69,69,,,,,69,69,,,,70,70,70,69,70,69,69,69,70,70,,,,70', +',70,70,70,70,70,70,70,,,,,,70,70,70,70,70,70,70,,,70,,,,,,,70,,,70,70', +'70,70,70,70,70,70,,70,70,70,,70,70,,,70,,,,,,,,,,,,,,,,,70,,,70,,,70', +',,70,70,,,70,,,,,,,,,,,,,,,,,,,,70,70,70,70,,70,70,70,70,,,,,70,70,', +',,71,71,71,70,71,70,70,70,71,71,,,,71,,71,71,71,71,71,71,71,,,,,,71', +'71,71,71,71,71,71,,,71,,,,,,,71,,,71,71,71,71,71,71,71,71,,71,71,71', +',71,71,,,71,,,,,,,,,,,,,,,,,,,,71,,,71,,,71,71,,,71,,,914,,914,914,914', +'914,914,,,,,,,,,914,,71,71,71,71,,71,71,71,71,,,,,71,71,,,,,,914,71', +',71,71,71,115,115,115,115,115,914,914,,115,115,914,,,115,,115,115,115', +'115,115,115,115,,,,,,115,115,115,115,115,115,115,,,115,,,,,,115,115', +'115,115,115,115,115,115,115,115,115,115,,115,115,115,,115,115,115,115', +'115,,,,,,,,,,,,,,,,,,,,115,,,115,,,115,115,,,115,,115,,,,115,,,,,,,', +',115,,,,,115,115,115,115,,115,115,115,115,,,,,115,115,,,,,,115,115,', +'115,115,115,120,120,120,,120,,,,120,120,,,,120,,120,120,120,120,120', +'120,120,,,,,,120,120,120,120,120,120,120,,,120,,,,,,,120,,,120,120,120', +'120,120,120,120,120,,120,120,120,,120,120,120,120,120,,,,,,,,,,,,,,', +',,,,,120,,,120,,,120,120,,,120,,,,,,120,,,,,,,,,120,,,,,120,120,120', +'120,,120,120,120,120,,,,,120,120,,,,121,121,121,120,121,120,120,120', +'121,121,,,,121,,121,121,121,121,121,121,121,,,,,,121,121,121,121,121', +'121,121,,,121,,,,,,,121,,,121,121,121,121,121,121,121,121,,121,121,121', +',121,121,121,121,121,,,,,,,,,,,,,,,,,,,,121,,,121,,,121,121,,,121,,', +',,,121,,,,,,,,,121,,,,,121,121,121,121,,121,121,121,121,,,,,121,121', +',,,122,122,122,121,122,121,121,121,122,122,,,,122,,122,122,122,122,122', +'122,122,,,,,,122,122,122,122,122,122,122,,,122,,,,,,,122,,,122,122,122', +'122,122,122,122,122,,122,122,122,,122,122,122,122,122,,,,,,,,,,,,,,', +',,,,,122,,,122,,,122,122,,,122,,,,,,122,,,,,,,,,122,,,,,122,122,122', +'122,,122,122,122,122,,,,,122,122,,,,123,123,123,122,123,122,122,122', +'123,123,,,,123,,123,123,123,123,123,123,123,,,,,,123,123,123,123,123', +'123,123,,,123,,,,,,,123,,,123,123,123,123,123,123,123,123,,123,123,123', +',123,123,123,123,123,,,,,,,,,,,,,,,,,,,,123,,,123,,,123,123,,,123,,', +',,,123,,,,,,,,,123,,,,,123,123,123,123,,123,123,123,123,,,,,123,123', +',,,,,,123,,123,123,123,124,124,124,124,124,,,,124,124,,,,124,,124,124', +'124,124,124,124,124,,,,,,124,124,124,124,124,124,124,,,124,,,,,,124', +'124,,124,124,124,124,124,124,124,124,124,,124,124,124,,124,124,124,124', +'124,,,,,,,,,,,,,,,,,,,,124,,,124,,,124,124,,,124,,124,,,,124,,,,,,,', +',124,,,,,124,124,124,124,,124,124,124,124,,,,,124,124,,,,825,825,825', +'124,825,124,124,124,825,825,,,,825,,825,825,825,825,825,825,825,,,,', +',825,825,825,825,825,825,825,,,825,,,,,,,825,,,825,825,825,825,825,825', +'825,825,,825,825,825,,825,825,825,825,825,,,,,,,,,,,,,,,,,,,,825,,,825', +',,825,825,,,825,,825,,,,825,,,,,,,,,825,,,,,825,825,825,825,,825,825', +'825,825,,,,,825,825,,,,822,822,822,825,822,825,825,825,822,822,,,,822', +',822,822,822,822,822,822,822,,,,,,822,822,822,822,822,822,822,,,822', +',,,,,,822,,,822,822,822,822,822,822,822,822,,822,822,822,,822,822,822', +'822,822,,,,,,,,,,,,,,,,,,,,822,,,822,,,822,822,,,822,,,,,,822,,,,,,', +',,822,,,,,822,822,822,822,,822,822,822,822,,,,,822,822,,,,212,212,212', +'822,212,822,822,822,212,212,,,,212,,212,212,212,212,212,212,212,,,,', +',212,212,212,212,212,212,212,,,212,,,,,,,212,,,212,212,212,212,212,212', +'212,212,,212,212,212,,212,212,212,212,212,,,,,,,,,,,,,,,,,,,,212,,,212', +',,212,212,,,212,,212,,,,212,,,,,,,,,212,,,,,212,212,212,212,,212,212', +'212,212,,,,,212,212,,,,213,213,213,212,213,212,212,212,213,213,,,,213', +',213,213,213,213,213,213,213,,,,,,213,213,213,213,213,213,213,,,213', +',,,,,,213,,,213,213,213,213,213,213,213,213,,213,213,213,,213,213,213', +'213,213,,,,,,,,,,,,,,,,,,,,213,,,213,,,213,213,,,213,,213,,,,213,,,', +',,,,,213,,,,,213,213,213,213,,213,213,213,213,,,,,213,213,,,,214,214', +'214,213,214,213,213,213,214,214,,,,214,,214,214,214,214,214,214,214', +',,,,,214,214,214,214,214,214,214,,,214,,,,,,,214,,,214,214,214,214,214', +'214,214,214,,214,214,214,,214,214,214,214,214,,,,,,,,,,,,,,,,,,,,214', +',,214,,,214,214,,,214,,,,,,214,,,,,,,,,214,,,,,214,214,214,214,,214', +'214,214,214,,,,,214,214,,,,215,215,215,214,215,214,214,214,215,215,', +',,215,,215,215,215,215,215,215,215,,,,,,215,215,215,215,215,215,215', +',,215,,,,,,,215,,,215,215,215,215,215,215,215,215,,215,215,215,,215', +'215,215,215,215,,,,,,,,,,,,,,,,,,,,215,,,215,,,215,215,,,215,,,,,,215', +',,,,,,,,215,,,,,215,215,215,215,,215,215,215,215,,,,,215,215,,,,216', +'216,216,215,216,215,215,215,216,216,,,,216,,216,216,216,216,216,216', +'216,,,,,,216,216,216,216,216,216,216,,,216,,,,,,,216,,,216,216,216,216', +'216,216,216,216,,216,216,216,,216,216,216,216,216,,,,,,,,,,,,,,,,,,', +',216,,,216,,,216,216,,,216,,,,,,216,,,,,,,,,216,,,,,216,216,216,216', +',216,216,216,216,,,,,216,216,,,,217,217,217,216,217,216,216,216,217', +'217,,,,217,,217,217,217,217,217,217,217,,,,,,217,217,217,217,217,217', +'217,,,217,,,,,,,217,,,217,217,217,217,217,217,217,217,217,217,217,217', +',217,217,217,217,217,,,,,,,,,,,,,,,,,,,,217,,,217,,,217,217,,,217,,217', +',217,,217,,,217,,,,,,217,,,,,217,217,217,217,,217,217,217,217,,,,,217', +'217,,,,809,809,809,217,809,217,217,217,809,809,,,,809,,809,809,809,809', +'809,809,809,,,,,,809,809,809,809,809,809,809,,,809,,,,,,,809,,,809,809', +'809,809,809,809,809,809,,809,809,809,,809,809,809,809,809,,,,,,,,,,', +',,,,,,,,,809,,,809,,,809,809,,,809,,,,,,809,,,,,,,,,809,,,,,809,809', +'809,809,,809,809,809,809,,,,,809,809,,,,222,222,222,809,222,809,809', +'809,222,222,,,,222,,222,222,222,222,222,222,222,,,,,,222,222,222,222', +'222,222,222,,,222,,,,,,,222,,,222,222,222,222,222,222,222,222,,222,222', +'222,,222,222,222,222,222,,,,,,,,,,,,,,,,,,,,222,,,222,,,222,222,,,222', +',,,,,222,,,,,,,,,222,,,,,222,222,222,222,,222,222,222,222,,,,,222,222', +',,,223,223,223,222,223,222,222,222,223,223,,,,223,,223,223,223,223,223', +'223,223,,,,,,223,223,223,223,223,223,223,,,223,,,,,,,223,,,223,223,223', +'223,223,223,223,223,,223,223,223,,223,223,223,223,223,,,,,,,,,,,,,,', +',,,,,223,,,223,,,223,223,,,223,,,,,,223,,,,,,,,,223,,,,,223,223,223', +'223,,223,223,223,223,,,,,223,223,,,,306,306,306,223,306,223,223,223', +'306,306,,,,306,,306,306,306,306,306,306,306,,,,,,306,306,306,306,306', +'306,306,,,306,,,,,,,306,,,306,306,306,306,306,306,306,306,,306,306,306', +',306,306,,,306,,,,,,,,,,,,,,,,,,,,306,,,306,,,306,306,,,306,,,991,,991', +'991,991,991,991,,,,,,,,,991,,306,306,306,306,,306,306,306,306,,,,,306', +'306,,,,306,,991,306,,306,306,306,688,688,688,,688,991,991,,688,688,991', +',,688,,688,688,688,688,688,688,688,,,,,,688,688,688,688,688,688,688', +',,688,,,,,,,688,,,688,688,688,688,688,688,688,688,,688,688,688,,688', +'688,688,688,688,,,,,,,,,,,,,,,,,,,,688,,,688,,,688,688,,,688,,,,,,688', +',,,,,,,,688,,,,,688,688,688,688,,688,688,688,688,,,,,688,688,,,,662', +'662,662,688,662,688,688,688,662,662,,,,662,,662,662,662,662,662,662', +'662,,,,,,662,662,662,662,662,662,662,,,662,,,,,,,662,,,662,662,662,662', +'662,662,662,662,,662,662,662,,662,662,662,662,662,,,,,,,,,,,,,,,,,,', +',662,,,662,,,662,662,,,662,,662,,,,662,,,,,,,,,662,,,,,662,662,662,662', +',662,662,662,662,,,,,662,662,,,,657,657,657,662,657,662,662,662,657', +'657,,,,657,,657,657,657,657,657,657,657,,,,,,657,657,657,657,657,657', +'657,,,657,,,,,,,657,,,657,657,657,657,657,657,657,657,,657,657,657,', +'657,657,,,657,,,,,,,,,,,,,,,,,,,,657,,,657,,,657,657,,,657,,,,,,,,,', +',,,,,,,,,,657,657,657,657,,657,657,657,657,,,,,657,657,,,,646,646,646', +'657,646,657,657,657,646,646,,,,646,,646,646,646,646,646,646,646,,,,', +',646,646,646,646,646,646,646,,,646,,,,,,,646,,,646,646,646,646,646,646', +'646,646,,646,646,646,,646,646,,,646,,,,,,,,,,,,,,,,,,,,646,,,646,,,646', +'646,,,646,,,,,,,,,,,,,,,,,,,,646,646,646,646,,646,646,646,646,,,,,646', +'646,,,,323,323,323,646,323,646,646,646,323,323,,,,323,,323,323,323,323', +'323,323,323,,,,,,323,323,323,323,323,323,323,,,323,,,,,,,323,,,323,323', +'323,323,323,323,323,323,,323,323,323,,323,323,,,323,,,,,,,,,,,,,,,,', +',,,323,,,323,,,323,323,,,323,,,,,,,,,,,,,,,,,,,,323,323,323,323,,323', +'323,323,323,,,,,323,323,,,,643,643,643,323,643,323,323,323,643,643,', +',,643,,643,643,643,643,643,643,643,,,,,,643,643,643,643,643,643,643', +',,643,,,,,,,643,,,643,643,643,643,643,643,643,643,,643,643,643,,643', +'643,643,643,643,,,,,,,,,,,,,,,,,,,,643,,,643,,,643,643,,,643,,,,,,643', +',,,,,,,,643,,,,,643,643,643,643,,643,643,643,643,,,,,643,643,,,,640', +'640,640,643,640,643,643,643,640,640,,,,640,,640,640,640,640,640,640', +'640,,,,,,640,640,640,640,640,640,640,,,640,,,,,,,640,,,640,640,640,640', +'640,640,640,640,,640,640,640,,640,640,640,640,640,,,,,,,,,,,,,,,,,,', +',640,,,640,,,640,640,,,640,,,,,,640,,,,,,,,,640,,,,,640,640,640,640', +',640,640,640,640,,,,,640,640,,,,330,330,330,640,330,640,640,640,330', +'330,,,,330,,330,330,330,330,330,330,330,,,,,,330,330,330,330,330,330', +'330,,,330,,,,,,,330,,,330,330,330,330,330,330,330,330,,330,330,330,', +'330,330,330,330,330,,,,,,,,,,,,,,,,,,,,330,,,330,,,330,330,,,330,,,', +',,330,,,,,,,,,330,,,,,330,330,330,330,,330,330,330,330,,,,,330,330,', +',,332,332,332,330,332,330,330,330,332,332,,,,332,,332,332,332,332,332', +'332,332,,,,,,332,332,332,332,332,332,332,,,332,,,,,,,332,,,332,332,332', +'332,332,332,332,332,,332,332,332,,332,332,332,332,332,,,,,,,,,,,,,,', +',,,,,332,,,332,332,,332,332,,,332,,,,,,332,,,,,,,,,332,,,,,332,332,332', +'332,,332,332,332,332,,,,,332,332,,,,616,616,616,332,616,332,332,332', +'616,616,,,,616,,616,616,616,616,616,616,616,,,,,,616,616,616,616,616', +'616,616,,,616,,,,,,,616,,,616,616,616,616,616,616,616,616,,616,616,616', +',616,616,616,616,616,,,,,,,,,,,,,,,,,,,,616,,,616,,,616,616,,,616,,', +',,,616,,,,,,,,,616,,,,,616,616,616,616,,616,616,616,616,,,,,616,616', +',,,615,615,615,616,615,616,616,616,615,615,,,,615,,615,615,615,615,615', +'615,615,,,,,,615,615,615,615,615,615,615,,,615,,,,,,,615,,,615,615,615', +'615,615,615,615,615,,615,615,615,,615,615,615,615,615,,,,,,,,,,,,,,', +',,,,,615,,,615,,,615,615,,,615,,,,,,615,,,,,,,,,615,,,,,615,615,615', +'615,,615,615,615,615,,,,,615,615,,,,611,611,611,615,611,615,615,615', +'611,611,,,,611,,611,611,611,611,611,611,611,,,,,,611,611,611,611,611', +'611,611,,,611,,,,,,,611,,,611,611,611,611,611,611,611,611,,611,611,611', +',611,611,611,611,611,,,,,,,,,,,,,,,,,,,,611,,,611,,,611,611,,,611,,', +',,,611,,,,,,,,,611,,,,,611,611,611,611,,611,611,611,611,,,,,611,611', +',,,610,610,610,611,610,611,611,611,610,610,,,,610,,610,610,610,610,610', +'610,610,,,,,,610,610,610,610,610,610,610,,,610,,,,,,,610,,,610,610,610', +'610,610,610,610,610,,610,610,610,,610,610,610,610,610,,,,,,,,,,,,,,', +',,,,,610,,,610,,,610,610,,,610,,,,,,610,,,,,,,,,610,,,,,610,610,610', +'610,,610,610,610,610,,,,,610,610,,,,609,609,609,610,609,610,610,610', +'609,609,,,,609,,609,609,609,609,609,609,609,,,,,,609,609,609,609,609', +'609,609,,,609,,,,,,,609,,,609,609,609,609,609,609,609,609,609,609,609', +'609,,609,609,609,609,609,,,,,,,,,,,,,,,,,,,,609,,,609,,,609,609,,,609', +',,,609,,609,,,609,,,,,,609,,,,,609,609,609,609,,609,609,609,609,,,,', +'609,609,,,,608,608,608,609,608,609,609,609,608,608,,,,608,,608,608,608', +'608,608,608,608,,,,,,608,608,608,608,608,608,608,,,608,,,,,,,608,,,608', +'608,608,608,608,608,608,608,608,608,608,608,,608,608,608,608,608,,,', +',,,,,,,,,,,,,,,,608,,,608,,,608,608,,,608,,608,,608,,608,,,608,,,,,', +'608,,,,,608,608,608,608,,608,608,608,608,,,,,608,608,,,,605,605,605', +'608,605,608,608,608,605,605,,,,605,,605,605,605,605,605,605,605,,,,', +',605,605,605,605,605,605,605,,,605,,,,,,,605,,,605,605,605,605,605,605', +'605,605,,605,605,605,,605,605,605,605,605,,,,,,,,,,,,,,,,,,,,605,,,605', +',,605,605,,,605,,,,,,605,,,,,,,,,605,,,,,605,605,605,605,,605,605,605', +'605,,,,,605,605,,,,,,,605,,605,605,605,604,604,604,604,604,,,,604,604', +',,,604,,604,604,604,604,604,604,604,,,,,,604,604,604,604,604,604,604', +',,604,,,,,,604,604,,604,604,604,604,604,604,604,604,604,,604,604,604', +',604,604,604,604,604,,,,,,,,,,,,,,,,,,,,604,,,604,,,604,604,,,604,,604', +',,,604,,,,,,,,,604,,,,,604,604,604,604,,604,604,604,604,,,,,604,604', +',,,601,601,601,604,601,604,604,604,601,601,,,,601,,601,601,601,601,601', +'601,601,,,,,,601,601,601,601,601,601,601,,,601,,,,,,,601,,,601,601,601', +'601,601,601,601,601,601,601,601,601,,601,601,601,601,601,,,,,,,,,,,', +',,,,,,,,601,,,601,,,601,601,,,601,,601,,601,,601,,,601,,,,,,601,,,,', +'601,601,601,601,,601,601,601,601,,,,,601,601,,,,348,348,348,601,348', +'601,601,601,348,348,,,,348,,348,348,348,348,348,348,348,,,,,,348,348', +'348,348,348,348,348,,,348,,,,,,,348,,,348,348,348,348,348,348,348,348', +',348,348,348,,348,348,348,348,348,,,,,,,,,,,,,,,,,,,,348,,,348,,,348', +'348,,,348,,,,,,348,,,,,,,,,348,,,,,348,348,348,348,,348,348,348,348', +',,,,348,348,,,,600,600,600,348,600,348,348,348,600,600,,,,600,,600,600', +'600,600,600,600,600,,,,,,600,600,600,600,600,600,600,,,600,,,,,,,600', +',,600,600,600,600,600,600,600,600,,600,600,600,,600,600,600,600,600', +',,,,,,,,,,,,,,,,,,,600,,,600,,,600,600,,,600,,,,,,600,,,,,,,,,600,,', +',,600,600,600,600,,600,600,600,600,,,,,600,600,,,,599,599,599,600,599', +'600,600,600,599,599,,,,599,,599,599,599,599,599,599,599,,,,,,599,599', +'599,599,599,599,599,,,599,,,,,,,599,,,599,599,599,599,599,599,599,599', +',599,599,599,,599,599,599,599,599,,,,,,,,,,,,,,,,,,,,599,,,599,,,599', +'599,,,599,,599,,,,599,,,,,,,,,599,,,,,599,599,599,599,,599,599,599,599', +',,,,599,599,,,,567,567,567,599,567,599,599,599,567,567,,,,567,,567,567', +'567,567,567,567,567,,,,,,567,567,567,567,567,567,567,,,567,,,,,,,567', +',,567,567,567,567,567,567,567,567,567,567,567,567,,567,567,567,567,567', +',,,,,,,,,,,,,,,,,,,567,,,567,,,567,567,,,567,,567,,567,,567,,,567,,', +',,,567,,,,,567,567,567,567,,567,567,567,567,,,,,567,567,,,,557,557,557', +'567,557,567,567,567,557,557,,,,557,,557,557,557,557,557,557,557,,,,', +',557,557,557,557,557,557,557,,,557,,,,,,,557,,,557,557,557,557,557,557', +'557,557,557,557,557,557,,557,557,557,557,557,,,,,,,,,,,,,,,,,,,,557', +',,557,,,557,557,,,557,,557,,557,,557,,,557,,,,,,557,,,,,557,557,557', +'557,,557,557,557,557,,,,,557,557,,,,369,369,369,557,369,557,557,557', +'369,369,,,,369,,369,369,369,369,369,369,369,,,,,,369,369,369,369,369', +'369,369,,,369,,,,,,,369,,,369,369,369,369,369,369,369,369,,369,369,369', +',369,369,369,369,369,,,,,,,,,,,,,,,,,,,,369,,,369,,,369,369,,,369,,', +',,,369,,,,,,,,,369,,,,,369,369,369,369,,369,369,369,369,,,,,369,369', +',,,556,556,556,369,556,369,369,369,556,556,,,,556,,556,556,556,556,556', +'556,556,,,,,,556,556,556,556,556,556,556,,,556,,,,,,,556,,,556,556,556', +'556,556,556,556,556,,556,556,556,,556,556,556,556,556,,,,,,,,,,,,,,', +',,,,,556,,,556,,,556,556,,,556,,556,,,,556,,,,,,,,,556,,,,,556,556,556', +'556,,556,556,556,556,,,,,556,556,,,,538,538,538,556,538,556,556,556', +'538,538,,,,538,,538,538,538,538,538,538,538,,,,,,538,538,538,538,538', +'538,538,,,538,,,,,,,538,,,538,538,538,538,538,538,538,538,538,538,538', +'538,,538,538,538,538,538,,,,,,,,,,,,,,,,,,,,538,,,538,,,538,538,,,538', +',538,,,,538,,,538,,,,,,538,,,,,538,538,538,538,,538,538,538,538,,,,', +'538,538,,,,532,532,532,538,532,538,538,538,532,532,,,,532,,532,532,532', +'532,532,532,532,,,,,,532,532,532,532,532,532,532,,,532,,,,,,,532,,,532', +'532,532,532,532,532,532,532,,532,532,532,,532,532,532,532,532,,,,,,', +',,,,,,,,,,,,,532,,,532,,,532,532,,,532,,,,,,532,,,,,,,,,532,,,,,532', +'532,532,532,,532,532,532,532,,,,,532,532,,,,527,527,527,532,527,532', +'532,532,527,527,,,,527,,527,527,527,527,527,527,527,,,,,,527,527,527', +'527,527,527,527,,,527,,,,,,,527,,,527,527,527,527,527,527,527,527,,527', +'527,527,,527,527,527,527,527,,,,,,,,,,,,,,,,,,,,527,,,527,,,527,527', +',,527,,,,,,527,,,,,,,,,527,,,,,527,527,527,527,,527,527,527,527,,,,', +'527,527,,,,526,526,526,527,526,527,527,527,526,526,,,,526,,526,526,526', +'526,526,526,526,,,,,,526,526,526,526,526,526,526,,,526,,,,,,,526,,,526', +'526,526,526,526,526,526,526,,526,526,526,,526,526,526,526,526,,,,,,', +',,,,,,,,,,,,,526,,,526,,,526,526,,,526,,,,,,526,,,,,,,,,526,,,,,526', +'526,526,526,,526,526,526,526,,,,,526,526,,,,523,523,523,526,523,526', +'526,526,523,523,,,,523,,523,523,523,523,523,523,523,,,,,,523,523,523', +'523,523,523,523,,,523,,,,,,,523,,,523,523,523,523,523,523,523,523,,523', +'523,523,,523,523,,,523,,,,,,,,,,,,,,,,,,,,523,,,523,,,523,523,,,523', +',,,,,,,,,,,,,,,,,,,523,523,523,523,,523,523,523,523,,,,,523,523,,,,385', +'385,385,523,385,523,523,523,385,385,,,,385,,385,385,385,385,385,385', +'385,,,,,,385,385,385,385,385,385,385,,,385,,,,,,,385,,,385,385,385,385', +'385,385,385,385,,385,385,385,,385,385,385,385,385,,,,,,,,,,,,,,,,,,', +',385,,,385,,,385,385,,,385,,,,,,385,,,,,,,,,385,,,,,385,385,385,385', +',385,385,385,385,,,,,385,385,,,,517,517,517,385,517,385,385,385,517', +'517,,,,517,,517,517,517,517,517,517,517,,,,,,517,517,517,517,517,517', +'517,,,517,,,,,,,517,,,517,517,517,517,517,517,517,517,517,517,517,517', +',517,517,517,517,517,,,,,,,,,,,,,,,,,,,,517,,,517,,,517,517,,,517,,517', +',517,,517,,,517,,,,,,517,,,,,517,517,517,517,,517,517,517,517,,,,,517', +'517,,,,515,515,515,517,515,517,517,517,515,515,,,,515,,515,515,515,515', +'515,515,515,,,,,,515,515,515,515,515,515,515,,,515,,,,,,,515,,,515,515', +'515,515,515,515,515,515,,515,515,515,,515,515,,,515,,,,,,,,,,,,,,,,', +',,,515,,,515,,,515,515,,,515,,,993,,993,993,993,993,993,,,,,,,,,993', +',515,515,515,515,,515,515,515,515,,,,,515,515,,,,,,993,515,,515,515', +'515,507,507,507,507,507,993,993,,507,507,993,,,507,,507,507,507,507', +'507,507,507,,,,,,507,507,507,507,507,507,507,,,507,,,,,,507,507,507', +'507,507,507,507,507,507,507,507,507,,507,507,507,,507,507,507,507,507', +',,,,,,,,,,,,,,,,,,,507,,,507,,,507,507,,,507,,507,,,,507,,,,,,,,,507', +',,,,507,507,507,507,,507,507,507,507,,,,,507,507,,,,,,507,507,,507,507', +'507,501,501,501,,501,,,,501,501,,,,501,,501,501,501,501,501,501,501', +',,,,,501,501,501,501,501,501,501,,,501,,,,,,,501,,,501,501,501,501,501', +'501,501,501,,501,501,501,,501,501,501,501,501,,,,,,,,,,,,,,,,,,,,501', +',,501,,,501,501,,,501,,,,,,501,,,,,,,,,501,,,,,501,501,501,501,,501', +'501,501,501,,,,,501,501,,,,499,499,499,501,499,501,501,501,499,499,', +',,499,,499,499,499,499,499,499,499,,,,,,499,499,499,499,499,499,499', +',,499,,,,,,,499,,,499,499,499,499,499,499,499,499,499,499,499,499,,499', +'499,499,499,499,,,,,,,,,,,,,,,,,,,,499,,,499,,,499,499,,,499,,,,499', +',499,,,499,,,,,,499,,,,,499,499,499,499,,499,499,499,499,,,,,499,499', +',,,497,497,497,499,497,499,499,499,497,497,,,,497,,497,497,497,497,497', +'497,497,,,,,,497,497,497,497,497,497,497,,,497,,,,,,,497,,,497,497,497', +'497,497,497,497,497,497,497,497,497,,497,497,497,497,497,,,,,,,,,,,', +',,,,,,,,497,,,497,,,497,497,,,497,,497,,497,,497,,,497,,,,,,497,,,,', +'497,497,497,497,,497,497,497,497,,,,,497,497,,,,460,460,460,497,460', +'497,497,497,460,460,,,,460,,460,460,460,460,460,460,460,,,,,,460,460', +'460,460,460,460,460,,,460,,,,,,,460,,,460,460,460,460,460,460,460,460', +',460,460,460,,460,460,460,460,460,,,,,,,,,,,,,,,,,,,,460,,,460,,,460', +'460,,,460,,,,,,460,,,,,,,,,460,,,,,460,460,460,460,,460,460,460,460', +',,,,460,460,,,,459,459,459,460,459,460,460,460,459,459,,,,459,,459,459', +'459,459,459,459,459,,,,,,459,459,459,459,459,459,459,,,459,,,,,,,459', +',,459,459,459,459,459,459,459,459,,459,459,459,,459,459,459,459,459', +',,,,,,,,,,,,,,,,,,,459,,,459,,,459,459,,,459,,,,,,459,,,,,,,,,459,,', +',,459,459,459,459,,459,459,459,459,,,,,459,459,,,,458,458,458,459,458', +'459,459,459,458,458,,,,458,,458,458,458,458,458,458,458,,,,,,458,458', +'458,458,458,458,458,,,458,,,,,,,458,,,458,458,458,458,458,458,458,458', +',458,458,458,,458,458,458,458,458,,,,,,,,,,,,,,,,,,,,458,,,458,,,458', +'458,,,458,,,,,,458,,,,,,,,,458,,,,,458,458,458,458,,458,458,458,458', +',,,,458,458,,,,456,456,456,458,456,458,458,458,456,456,,,,456,,456,456', +'456,456,456,456,456,,,,,,456,456,456,456,456,456,456,,,456,,,,,,,456', +',,456,456,456,456,456,456,456,456,456,456,456,456,,456,456,456,456,456', +',,,,,,,,,,,,,,,,,,,456,,,456,,,456,456,,,456,,456,,456,,456,,,456,,', +',,,456,,,,,456,456,456,456,,456,456,456,456,,,,,456,456,,,,413,413,413', +'456,413,456,456,456,413,413,,,,413,,413,413,413,413,413,413,413,,,,', +',413,413,413,413,413,413,413,,,413,,,,,,,413,,,413,413,413,413,413,413', +'413,413,,413,413,413,,413,413,413,413,413,,,,,,,,,,,,,,,,,,,,413,,,413', +',,413,413,,,413,,,,,,413,,,,,,,,,413,,,,,413,413,413,413,,413,413,413', +'413,,,,,413,413,,,,,,,413,,413,413,413,596,596,596,596,596,596,596,596', +'596,596,596,596,596,596,596,596,596,596,596,596,596,596,596,596,,,,596', +'596,596,596,596,596,596,596,596,596,,,,,,596,596,596,596,596,596,596', +'596,596,,,596,,,,,,,,596,596,,596,596,596,596,596,596,596,,,596,596', +',,,596,596,596,596,,,,,,,,,,,,,,596,596,,596,596,596,596,596,596,596', +'596,596,596,596,596,,,596,596,,,,,,,,,,,,,,596,404,404,404,404,404,404', +'404,404,404,404,404,404,404,404,404,404,404,404,404,404,404,404,404', +'404,,,,404,404,404,404,404,404,404,404,404,404,,,,,,404,404,404,404', +'404,404,404,404,404,,,404,,,,,,,,404,404,,404,404,404,404,404,404,404', +',,404,404,,,,404,404,404,404,,,,,,,,,,,,,,404,404,,404,404,404,404,404', +'404,404,404,404,404,404,404,,,404,404,,,,,,,,,,,,,,404,9,9,9,9,9,9,9', +'9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,,,,9,9,9,9,9,9,9,9,9,9,,,,,,9,9,9', +'9,9,9,9,9,9,,,9,,,,,,,,9,9,,9,9,9,9,9,9,9,,,9,9,,,,9,9,9,9,,,,,,,,,', +',,,,9,9,,9,9,9,9,9,9,9,9,9,9,9,9,,,9,9,,,,,,,,,,,,,,9,8,8,8,8,8,8,8', +'8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,,,,8,8,8,8,8,8,8,8,8,8,,,,,,8,8,8', +'8,8,8,8,8,8,8,,8,,,,,,,,8,8,,8,8,8,8,8,8,8,,,8,8,,,,8,8,8,8,,,,,,,,', +',,,,,8,8,,8,8,8,8,8,8,8,8,8,8,8,8,,,8,8,,,,,,,,,,,,,,8,72,72,72,72,72', +'72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,,,,72,72,72', +'72,72,72,72,72,72,72,,,,,,72,72,72,72,72,72,72,72,72,72,72,72,,72,,', +',,,72,72,,72,72,72,72,72,72,72,,,72,72,,,,72,72,72,72,,,,,,72,,,,,,', +',72,72,,72,72,72,72,72,72,72,72,72,72,72,72,,,72,728,728,728,728,728', +'728,728,728,728,728,728,728,728,728,728,728,728,728,728,728,728,728', +'728,728,,,,728,728,728,728,728,728,728,728,728,728,,,,,,728,728,728', +'728,728,728,728,728,728,,,728,,,,,,,,728,728,,728,728,728,728,728,728', +'728,,,728,728,,,,728,728,728,728,,,,,,,,,,,,,,728,728,,728,728,728,728', +'728,728,728,728,728,728,728,728,528,528,728,,528,,,,,,,,528,528,,528', +'528,528,528,528,528,528,,,528,528,,,,528,528,528,528,,,,,,528,,,,,,', +',528,528,,528,528,528,528,528,528,528,528,528,528,528,528,559,559,528', +',559,,,,,,,,559,559,,559,559,559,559,559,559,559,,,559,559,,,,559,559', +'559,559,,,,,,559,,,,,,,,559,559,,559,559,559,559,559,559,559,559,559', +'559,559,559,603,603,559,,603,,,,,,,,603,603,,603,603,603,603,603,603', +'603,,,603,603,,,,603,603,603,603,,,,,,603,,,,,,,,603,603,,603,603,603', +'603,603,603,603,603,603,603,603,603,602,602,603,,602,,,,,,,,602,602', +',602,602,602,602,602,602,602,,,602,602,,,,602,602,602,602,,,,,,602,', +',,,,,,602,602,,602,602,602,602,602,602,602,602,602,602,602,602,218,218', +'602,,218,,,,,,,,218,218,,218,218,218,218,218,218,218,,,218,218,,,,218', +'218,218,218,,,,,,218,,,,,,,,218,218,,218,218,218,218,218,218,218,218', +'218,218,218,218,267,267,218,,267,,,,,,,,267,267,,267,267,267,267,267', +'267,267,,,267,267,,,,267,267,267,267,,,,,,,,,,,,,,267,267,,267,267,267', +'267,267,267,267,267,267,267,267,267,219,219,267,,219,,,,,,,,219,219', +',219,219,219,219,219,219,219,,,219,219,,,,219,219,219,219,,,,,,219,', +',,,,,,219,219,,219,219,219,219,219,219,219,219,219,219,219,219,455,455', +'219,,455,,,,,,,,455,455,,455,455,455,455,455,455,455,,,455,455,,,,455', +'455,455,455,,,,,,455,,,,,,,,455,455,,455,455,455,455,455,455,455,455', +'455,455,455,455,454,454,455,,454,,,,,,,,454,454,,454,454,454,454,454', +'454,454,,,454,454,,,,454,454,454,454,,,,,,454,,,,,,,,454,454,,454,454', +'454,454,454,454,454,454,454,454,454,454,974,974,454,,974,,,,,,,,974', +'974,,974,974,974,974,974,974,974,,,974,974,,,,974,974,974,974,,,,,,974', +',,,,,,,974,974,,974,974,974,974,974,974,974,974,974,974,974,974,566', +'566,974,,566,,,,,,,,566,566,,566,566,566,566,566,566,566,,,566,566,', +',,566,566,566,566,,,,,,566,,,,,,,,566,566,,566,566,566,566,566,566,566', +'566,566,566,566,566,565,565,566,,565,,,,,,,,565,565,,565,565,565,565', +'565,565,565,,,565,565,,,,565,565,565,565,,,,,,565,,,,,,,,565,565,,565', +'565,565,565,565,565,565,565,565,565,565,565,973,973,565,,973,,,,,,,', +'973,973,,973,973,973,973,973,973,973,,,973,973,,,,973,973,973,973,,', +',,,973,,,,,,,,973,973,,973,973,973,973,973,973,973,973,973,973,973,973', +'969,969,973,,969,,,,,,,,969,969,,969,969,969,969,969,969,969,,,969,969', +',,,969,969,969,969,,,,,,969,,,,,,,,969,969,,969,969,969,969,969,969', +'969,969,969,969,969,969,518,518,969,,518,,,,,,,,518,518,,518,518,518', +'518,518,518,518,,,518,518,,,,518,518,518,518,,,,,,518,,,,,,,,518,518', +',518,518,518,518,518,518,518,518,518,518,518,518,519,519,518,,519,,', +',,,,,519,519,,519,519,519,519,519,519,519,,,519,519,,,,519,519,519,519', +',,,,,519,,,,,,,,519,519,,519,519,519,519,519,519,519,519,519,519,519', +'519,558,558,519,,558,,,,,,,,558,558,,558,558,558,558,558,558,558,,,558', +'558,,,,558,558,558,558,,,,,,558,,,,,,,,558,558,,558,558,558,558,558', +'558,558,558,558,558,558,558,529,529,558,,529,,,,,,,,529,529,,529,529', +'529,529,529,529,529,,,529,529,,,,529,529,529,529,,,,,,529,,,,,,,,529', +'529,,529,529,529,529,529,529,529,529,529,529,529,529,,805,529,805,805', +'805,805,805,,727,,727,727,727,727,727,805,,,,,,,,727,,989,,989,989,989', +'989,989,,,,,,805,,,989,,,,,727,805,805,805,805,,,,805,727,727,727,727', +',,,727,989,,910,,910,910,910,910,910,989,989,989,989,,,,989,910,,912', +',912,912,912,912,912,,726,,726,726,726,726,726,912,,,,,910,,,726,,,', +',,910,910,910,910,,,,910,912,,,,,,,,726,912,912,912,912,,,,912,726,726', +'726,726,,,995,726,995,995,995,995,995,,934,,934,934,934,934,934,995', +',,,,,,,934,,936,,936,936,936,936,936,,,,,,995,,,936,,,,,934,,,995,995', +',,,995,934,934,934,934,,,,934,936,,938,,938,938,938,938,938,,,936,936', +',,,936,938,,940,,940,940,940,940,940,1010,,1010,1010,1010,1010,1010', +',940,,,,,938,,1010,,668,,668,668,668,668,668,938,938,,,,938,940,,668', +',,,,1010,,,,940,940,,,,940,,1010,1010,,,,1010,668,,546,,546,546,546', +'546,546,668,668,668,668,,,,668,546,,803,,803,803,803,803,803,807,,807', +'807,807,807,807,,803,,,,,546,546,807,,,,,,,546,546,546,546,,,,546,803', +',,,,,,807,,803,803,803,803,,,,803,,807,807,,,,807' ] + racc_action_check = arr = ::Array.new(24631, nil) + idx = 0 + clist.each do |str| + str.split(',', -1).each do |i| + arr[idx] = i.to_i unless i.empty? + idx += 1 + end + end + +racc_action_pointer = [ + 1920, 101, nil, 270, nil, 11209, 1358, 1126, 22816, 22688, + 1121, nil, 1055, 1044, 567, 1074, 768, 416, nil, -79, + 11471, 2620, 1126, nil, 334, nil, 232, 1423, 1533, 11733, + 11864, 11995, nil, 4020, 12126, 12257, nil, 1001, 841, 837, + 1039, 171, 12658, 12789, 521, 12920, 927, 654, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 1208, nil, 13321, + 13452, 13583, -8, nil, 13714, 13845, nil, nil, 13976, 14115, + 14246, 14377, 22944, nil, nil, nil, nil, nil, nil, nil, + nil, 602, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 574, + nil, nil, 686, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 1035, nil, 14516, nil, nil, nil, nil, + 14655, 14786, 14917, 15048, 15187, nil, 4580, nil, 577, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 895, + nil, 5000, 15580, 15711, 15842, 15973, 16104, 16235, 23362, 23484, + nil, nil, 16497, 16628, 5691, nil, nil, 582, 160, 223, + 927, 141, 823, 874, nil, 6346, 3740, 869, 6608, 6739, + 6870, 7001, 7132, 7263, 7394, 7525, 7656, 7787, 7918, 8049, + 8180, 8311, 8442, 8573, 8704, 8835, 8966, 9097, 9228, 9359, + nil, nil, nil, nil, 9490, nil, nil, 23423, nil, nil, + 859, 9752, 9883, nil, nil, nil, nil, nil, nil, nil, + 10014, nil, 2060, nil, 809, 805, nil, 10276, 847, 10407, + nil, nil, 10538, 10669, nil, nil, 268, nil, 10808, 1412, + 814, 778, 3040, 787, 825, 764, 16759, 2060, 977, 940, + 908, 805, 770, nil, 742, 697, 165, nil, nil, nil, + 720, 220, 657, 17422, nil, 365, 719, 658, nil, 668, + 17815, nil, 17946, 4440, 1349, 602, nil, 361, 360, 625, + 602, 349, 616, nil, nil, 250, 10, -1, 19264, 4300, + 2340, 121, 676, 554, 5, 40, 578, 610, 11, 639, + nil, nil, 467, 230, -21, nil, 436, nil, 530, 19919, + nil, nil, nil, 772, 771, 662, 660, 659, 607, 555, + 554, 442, nil, 118, nil, 20836, nil, 290, 498, 501, + 390, 495, -37, -27, 386, nil, nil, nil, nil, nil, + nil, nil, nil, 300, 22560, nil, nil, nil, nil, 294, + nil, nil, 268, 22293, 225, nil, nil, 208, nil, 809, + 105, 259, nil, nil, 1780, nil, nil, nil, nil, nil, + 1920, 148, nil, 64, 101, 804, 756, 1645, nil, nil, + nil, 464, 222, 258, nil, nil, 936, 1072, nil, nil, + nil, 18, nil, 290, 23606, 23545, 22162, 437, 22031, 21900, + 21769, 2900, 3880, -46, 1098, 353, 373, 375, 377, 4300, + 1485, 1596, 3460, 3040, 4160, 3180, 4020, 3320, 893, 1025, + 3740, 3600, 2340, 1311, nil, 1344, nil, nil, nil, nil, + 339, nil, nil, nil, 345, nil, nil, 21638, nil, 21507, + nil, 21376, nil, 215, nil, nil, nil, 21237, 1538, nil, + 369, 376, nil, nil, 389, 21098, 394, 20967, 23972, 24033, + 690, 439, nil, 20705, 412, nil, 20574, 20443, 23118, 24155, + 1159, 2760, 20312, 546, 554, 435, 478, nil, 20181, nil, + nil, 11070, nil, nil, nil, nil, 24502, 4160, 564, nil, + 1780, 90, 576, 599, 596, 609, 20050, 19788, 24094, 23179, + -19, nil, nil, 512, nil, 23789, 23728, 19657, nil, nil, + 213, 2200, 580, nil, -33, nil, nil, nil, 1269, nil, + nil, nil, 554, nil, nil, 258, nil, 324, nil, nil, + 544, nil, 554, nil, nil, nil, 22432, nil, 557, 19526, + 19395, 19133, 23301, 23240, 19002, 18863, 384, 614, 18732, 18601, + 18470, 18339, 625, nil, nil, 18208, 18077, 637, nil, nil, + nil, 382, 409, 0, 798, 611, 613, 739, nil, 723, + 130, nil, nil, 653, -50, 766, nil, 644, nil, 694, + 17684, nil, nil, 17553, nil, -112, 17291, 670, nil, 678, + 136, 312, 726, 256, 904, 731, 689, 17160, nil, 764, + 24, 819, 17029, nil, nil, nil, 388, nil, 24463, nil, + 711, 713, nil, 718, 720, 724, nil, nil, nil, nil, + nil, nil, nil, nil, 715, 1135, nil, nil, 16898, nil, + nil, nil, 811, nil, nil, nil, 827, nil, nil, 828, + 374, nil, 869, nil, nil, nil, nil, nil, 878, nil, + 6, 765, 41, -18, 68, 135, 2900, 292, 1040, nil, + 794, 3600, 10939, nil, 923, 3460, 24306, 24225, 23057, nil, + nil, nil, nil, nil, nil, 2760, nil, nil, nil, nil, + nil, nil, nil, 806, 10145, 824, -85, 331, 110, 354, + nil, 2200, 9621, nil, 824, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 6477, 6215, 6084, 5953, 292, + 5822, nil, -59, nil, nil, 870, nil, nil, 1308, nil, + 3180, nil, nil, nil, nil, 853, 183, nil, nil, 979, + nil, 2620, 867, 929, nil, nil, nil, -9, 891, 890, + nil, nil, 534, 24519, nil, 24217, nil, 24526, nil, 16366, + nil, 1005, nil, 889, 355, 895, nil, nil, nil, nil, + 1018, nil, 15449, 1022, nil, 15318, 3880, 39, 1028, nil, + 1031, 141, 3320, nil, 1042, 922, -50, nil, 926, 922, + 142, nil, nil, 13182, 13051, 2480, 5420, nil, 931, 932, + nil, 941, 942, 943, nil, 974, 959, 955, 949, 12527, + nil, nil, nil, nil, 4720, nil, nil, 76, 12396, nil, + nil, nil, nil, 1005, 963, nil, nil, nil, 973, 977, + nil, 983, 985, nil, 989, nil, nil, 996, 1140, 999, + 1201, nil, nil, -10, nil, nil, 256, nil, nil, nil, + 1126, nil, nil, nil, 1047, nil, nil, 1021, nil, nil, + 24281, nil, 24298, nil, 14424, nil, nil, 1028, 1050, 11602, + 694, 1097, nil, 2480, 79, 33, 766, 1102, 36, nil, + 5560, 5280, nil, nil, 24366, nil, 24383, nil, 24422, nil, + 24439, nil, nil, nil, nil, 320, 865, 1025, 5140, nil, + nil, nil, nil, 4860, 1028, nil, nil, 1030, 1034, 1036, + 1038, nil, 1040, nil, 353, nil, nil, nil, 190, 23911, + nil, 1169, 11340, 23850, 23667, 35, 1093, 1201, 1078, 1079, + 1080, 1085, 1086, 1389, 1093, 1427, 324, 1218, nil, 24242, + nil, 16806, nil, 21145, nil, 24358, nil, nil, nil, 914, + 1140, 1141, nil, 1101, 32, 34, 109, 69, nil, nil, + 24446, nil, nil, nil, nil, 1279, -101, nil, nil, -84, + -80, -71, -38, nil, 26, -11, 42, 12304, nil, nil, + nil, nil, nil, 72, nil ] + +racc_action_default = [ + -3, -608, -1, -594, -4, -608, -7, -608, -608, -608, + -608, -30, -608, -608, -34, -608, -608, -287, -46, -596, + -608, -51, -55, -56, -57, -61, -264, -264, -264, -300, + -330, -331, -73, -12, -77, -85, -87, -608, -498, -499, + -608, -608, -608, -608, -223, -608, -596, -237, -278, -279, + -280, -281, -282, -283, -284, -285, -286, -582, -289, -293, + -607, -572, -308, -310, -608, -608, -53, -53, -594, -608, + -608, -608, -608, -332, -333, -335, -336, -337, -439, -440, + -441, -442, -443, -464, -446, -447, -466, -468, -451, -456, + -460, -462, -478, -464, -480, -482, -483, -484, -485, -580, + -487, -488, -581, -490, -491, -492, -493, -494, -495, -496, + -497, -502, -503, -608, -2, -595, -603, -604, -605, -6, + -608, -608, -608, -608, -608, -8, -3, -18, -608, -116, + -117, -118, -119, -120, -121, -122, -123, -124, -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, -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, -23, + -125, -12, -608, -608, -608, -608, -608, -254, -608, -608, + -592, -593, -608, -608, -596, -597, -50, -608, -498, -499, + -608, -287, -608, -608, -229, -608, -12, -608, -608, -608, + -608, -608, -608, -608, -608, -608, -608, -608, -608, -608, + -608, -608, -608, -608, -608, -608, -608, -608, -608, -608, + -238, -239, -240, -241, -608, -403, -405, -608, -590, -591, + -62, -254, -608, -307, -409, -418, -420, -68, -415, -69, + -596, -70, -244, -259, -268, -268, -263, -608, -269, -608, + -464, -574, -608, -608, -71, -72, -594, -13, -608, -16, + -608, -75, -12, -596, -608, -78, -81, -12, -93, -94, + -608, -608, -101, -300, -303, -596, -608, -330, -331, -334, + -416, -608, -83, -608, -89, -297, -481, -608, -217, -218, + -608, -230, -608, -12, -291, -596, -245, -600, -600, -608, + -608, -600, -608, -309, -394, -52, -608, -608, -608, -12, + -12, -594, -608, -595, -498, -499, -608, -608, -287, -608, + -347, -348, -111, -112, -608, -114, -608, -287, -506, -608, + -498, -499, -323, -116, -117, -158, -159, -160, -176, -181, + -188, -191, -325, -608, -570, -608, -444, -608, -608, -608, + -608, -608, -608, -608, -608, 1035, -5, -606, -24, -25, + -26, -27, -28, -608, -608, -20, -21, -22, -126, -608, + -31, -33, -274, -608, -608, -273, -32, -608, -35, -608, + -287, -43, -45, -199, -249, -269, -47, -48, -36, -200, + -249, -596, -255, -268, -268, -583, -584, -264, -413, -585, + -586, -584, -583, -264, -412, -414, -585, -586, -42, -207, + -49, -596, -306, -608, -608, -608, -254, -297, -608, -608, + -608, -208, -209, -210, -211, -212, -213, -214, -215, -219, + -220, -221, -222, -224, -225, -226, -227, -228, -231, -232, + -233, -234, -596, -242, -424, -264, -583, -584, -59, -63, + -596, -265, -422, -424, -596, -302, -260, -608, -261, -608, + -266, -608, -270, -608, -577, -579, -11, -595, -15, -17, + -596, -74, -295, -90, -79, -608, -596, -254, -608, -608, + -100, -608, -481, -608, -86, -91, -608, -608, -608, -608, + -243, -235, -608, -431, -608, -596, -608, -246, -602, -601, + -248, -602, -298, -299, -573, -311, -530, -12, -338, -339, + -12, -608, -608, -608, -608, -608, -608, -254, -608, -608, + -297, -53, -111, -112, -113, -608, -608, -254, -319, -504, + -608, -12, -508, -327, -596, -445, -465, -470, -608, -472, + -448, -467, -608, -469, -450, -608, -453, -608, -455, -458, + -608, -459, -608, -479, -9, -19, -608, -29, -277, -608, + -608, -254, -608, -608, -608, -608, -417, -608, -256, -258, + -608, -608, -64, -253, -410, -608, -608, -66, -411, -305, + -598, -583, -584, -583, -584, -596, -608, -608, -425, -58, + -406, -422, -251, -608, -383, -608, -301, -268, -267, -271, + -608, -575, -576, -608, -14, -76, -608, -82, -88, -596, + -583, -584, -252, -587, -99, -608, -84, -608, -206, -216, + -596, -607, -607, -290, -292, -294, -600, -395, -530, -398, + -569, -569, -513, -515, -515, -515, -529, -531, -532, -533, + -534, -535, -536, -537, -538, -608, -540, -542, -544, -549, + -551, -552, -554, -559, -561, -562, -564, -565, -566, -608, + -607, -340, -607, -54, -341, -342, -314, -315, -608, -317, + -608, -596, -583, -584, -587, -296, -12, -111, -112, -115, + -596, -12, -608, -321, -608, -12, -530, -530, -608, -571, + -471, -474, -475, -476, -477, -12, -449, -452, -454, -457, + -461, -463, -127, -275, -608, -596, -583, -584, -584, -583, + -44, -250, -608, -599, -268, -38, -202, -39, -203, -65, + -40, -205, -41, -204, -67, -608, -608, -608, -608, -417, + -608, -404, -383, -408, -407, -608, -419, -384, -596, -386, + -12, -421, -262, -272, -578, -80, -417, -92, -304, -607, + -345, -12, -432, -607, -433, -434, -247, -608, -596, -608, + -511, -512, -608, -608, -522, -608, -525, -608, -527, -608, + -349, -608, -351, -353, -360, -596, -543, -553, -563, -567, + -608, -343, -608, -608, -316, -608, -12, -417, -608, -417, + -608, -608, -12, -324, -608, -596, -608, -328, -608, -276, + -417, -37, -201, -257, -608, -236, -12, -60, -569, -569, + -365, -367, -367, -367, -382, -608, -596, -388, -538, -546, + -547, -557, -423, -10, -12, -438, -346, -608, -608, -436, + -396, -399, -401, -608, -569, -550, -568, -514, -515, -515, + -541, -515, -515, -560, -515, -538, -555, -596, -608, -358, + -608, -539, -312, -608, -313, -271, -607, -318, -320, -505, + -608, -326, -507, -509, -508, -473, -426, -608, -363, -364, + -373, -375, -608, -378, -608, -380, -385, -608, -608, -608, + -545, -608, -437, -12, -498, -499, -608, -608, -287, -435, + -12, -12, -397, -510, -608, -518, -608, -520, -608, -523, + -608, -526, -528, -350, -352, -356, -608, -361, -12, -427, + -428, -429, -322, -12, -569, -548, -366, -367, -367, -367, + -367, -558, -367, -387, -596, -390, -392, -393, -556, -608, + -297, -431, -254, -608, -608, -297, -608, -608, -515, -515, + -515, -515, -354, -608, -359, -608, -607, -608, -362, -608, + -370, -608, -372, -608, -376, -608, -379, -381, -389, -608, + -296, -587, -430, -596, -583, -584, -587, -296, -400, -402, + -608, -516, -519, -521, -524, -608, -357, -344, -329, -367, + -367, -367, -367, -391, -417, -515, -355, -608, -368, -371, + -374, -377, -517, -367, -369 ] + +clist = [ +'223,382,534,29,266,274,278,431,29,319,319,343,267,118,336,114,283,283', +'283,555,218,322,498,29,305,125,725,332,268,137,137,661,29,29,29,641', +'29,6,132,132,127,210,6,820,319,319,319,115,346,347,547,550,351,606,135', +'135,349,350,428,415,416,490,29,638,448,638,326,29,29,524,226,29,284', +'284,284,800,801,641,118,489,352,303,537,540,345,345,544,564,345,944', +'387,789,780,883,633,880,334,270,277,279,394,119,132,337,398,399,400', +'401,437,443,852,281,294,295,967,2,961,1,29,815,585,587,429,29,29,29', +'29,29,449,29,301,965,823,335,285,285,285,627,368,372,345,345,345,345', +'535,641,635,333,854,452,383,568,6,359,545,856,340,485,855,384,630,402', +'339,6,964,338,341,667,870,546,797,498,330,596,638,638,930,931,873,484', +'492,493,772,949,793,867,944,386,388,669,389,390,631,961,391,967,392', +'438,581,583,586,586,880,393,283,495,730,735,722,703,404,396,1023,878', +'29,29,29,29,29,29,29,708,883,411,361,29,29,29,511,209,846,454,880,775', +'426,427,917,875,955,29,724,403,957,450,451,887,625,769,947,447,644,344', +'863,908,909,414,414,721,283,283,26,647,410,421,832,26,421,283,571,656', +'572,786,421,728,29,29,904,,,933,26,319,,29,,676,,880,719,26,26,26,514', +'26,,274,521,503,319,278,,29,,,984,29,118,649,506,,29,798,,525,518,284', +'536,,509,26,,,304,284,26,26,950,,26,1017,,528,551,827,422,508,29,422', +',,507,1016,829,422,437,443,522,711,,,510,29,29,29,491,516,,720,953,988', +'558,118,494,554,449,,429,840,345,835,836,573,29,1026,782,26,619,285', +',641,26,26,26,26,26,285,26,268,29,570,830,745,785,,834,738,,738,,301', +',,,,301,574,,676,652,638,,796,607,,826,632,613,,652,636,,759,618,602', +',137,764,,,,,,658,438,132,645,595,,,,,648,,283,,,,,652,,135,,755,757', +',,652,760,762,29,664,,,626,613,676,676,,,1002,,26,26,26,26,26,26,26', +',,,,26,26,26,447,,,,,319,782,437,443,,,26,438,319,729,409,900,,,283', +'525,,438,612,794,29,,,525,617,906,756,758,,,29,761,763,,,304,,,,,853', +'26,26,,684,29,,438,,,26,,,,283,438,,,,447,29,716,660,29,283,879,629', +'881,26,447,29,704,26,951,,,,26,,,29,923,,,29,,,,,774,723,438,,,,788', +',,283,447,,304,,26,841,447,304,948,,710,,,637,29,29,,607,29,26,26,26', +'773,,29,29,,795,137,29,29,,319,987,,,1024,132,,742,26,607,613,319,447', +'618,,525,,552,553,,750,135,666,,26,,787,,,421,,,,,,684,837,842,,421', +'421,958,,959,421,421,,,,,756,758,763,761,,,,,,,,859,,,,978,,,,,,607', +',,,,,,,,607,,,,414,831,,,,,,,754,684,684,26,,,29,,422,,,29,29,607,,29', +',,422,422,,,,422,422,29,,891,1019,345,865,,,,869,,,842,,,,,29,,,132', +'857,902,,1003,,,,858,26,,,,,,,,,,26,,857,,,,29,,,,,,,,684,26,684,29', +'810,,,,,,,421,,,,893,26,,,26,859,943,,859,,859,26,859,,,,,,,29,850,26', +',29,,26,,,319,29,700,857,,702,,899,345,319,,,903,876,16,29,876,,,16', +',,,,,,26,26,,652,26,,,29,227,,26,26,,422,,26,26,227,227,227,,16,310', +'310,,,,,,,,,,859,319,859,,859,858,859,858,,,,,,,16,911,913,915,,227', +'227,,,227,356,366,366,13,810,684,,889,13,29,,,,973,859,,29,29,,,,,,', +',,,,998,,,,,,29,438,13,,876,29,,850,283,850,,850,16,,849,,,227,227,227', +'227,16,,16,29,26,858,,13,,26,26,,607,26,874,,,360,,,,,,26,,,810,447', +'810,,,,447,828,,,,,,,26,,990,992,994,996,,997,804,806,808,,838,,,,,', +',,,,,13,,850,,850,26,850,,850,13,,13,,,,,26,,,,982,810,,,16,227,419', +'227,227,419,227,,,,862,419,227,227,,,850,1028,1029,1030,1031,866,,26', +',16,,26,851,,,1034,,26,810,954,810,,849,,849,,849,,,,,26,,,,,,,,882', +'896,884,,,227,227,,,,26,810,,,227,,,13,,417,,,417,,,,,,417,,,,16,,,', +'16,,,922,310,16,13,,,,,,,,,,,,,,,310,,,,,849,,849,,849,16,849,26,,,', +',,,26,26,,,,,227,16,16,,,,,,,,39,,26,,,39,971,26,849,,,227,13,976,977', +'960,13,962,,935,937,13,939,941,,942,26,227,,,,986,,39,309,309,,979,', +'980,,981,,,,,,13,,,,,,,,,,,,39,,,,13,13,,,,,355,371,371,371,,,,38,,', +',,38,,,,,,,,,,,1020,,1021,,1022,,227,,,,,,,,,,,38,308,308,,1025,,39', +',,,1011,1012,1013,1014,,39,,39,,,,1033,,,,,38,,,,,,,,,,354,370,370,370', +'16,,,,,,,,310,,227,,,,,,310,1032,,,,,,,,227,,,,,,,,,,,,,,,16,,38,16', +',,,,,,227,38,,38,,,,,,,227,,39,,16,,,,,,,,13,,,,,,,,,,,,,,,39,,,,,,419', +'227,,,16,,,,,,419,419,,,,419,419,,,13,,,13,,,,,,,,,,,,,,,,,,,,,13,,38', +'310,,,,,,,,,,39,310,,,39,,,,309,39,,,,,38,,417,,,,13,,,,,309,417,417', +',,,417,417,,,39,,,,,,,,,,,,,,,,39,39,,,,,,,,16,,,,,16,227,,,16,,,,,', +',38,,,16,38,,,,308,38,,,,,,,,,,,419,,,,,308,,,,342,,,,,,38,,,,,,,,,', +',,,16,,,38,38,,,,13,,,16,,13,,,,13,,,,,,,,,,13,,,,,,,,,,,,,,,227,,417', +',16,,,,,,16,,,,,,,,,,,,,,16,,,,,,13,,,,17,,,920,,17,,13,16,39,,,926', +',,,,309,,,,,,,,309,,,,,,,,17,312,312,,,,,,,13,,,,,,13,39,,,39,,,,412', +'425,,17,,,13,968,,,,16,,358,367,367,,39,16,16,,,,,13,,,,929,38,,,,,', +',16,308,,,,16,,,,308,,,,,39,,,,,,,,,17,227,,,,,,,,17,38,17,,38,,,500', +',502,,,504,505,,13,,,,,,,13,13,309,38,,,,,,,,,,309,,15,,,13,,15,,,13', +',,,,,,,,,,,,38,,,,,,,,,,,,15,,,,,,,,,,,,,,,,,17,,420,,,420,,39,,15,', +'420,39,308,,,39,,,,,,,,308,17,39,,,,,,,,,,,,,,,,,,,,598,,,,,,,,,,,,', +',,,,,,15,,,,,,39,,,15,,15,,,,,,39,38,,,,17,38,,,17,38,,,312,17,,,,,', +'38,,,,,,,,,,312,,,,,39,,,,,17,39,,,,,,,639,,342,,642,,,39,17,17,,,,', +',,,38,,,371,,,,,39,,,38,925,,15,,15,,,15,,,,,639,15,,342,,,,,,,,,,,', +'15,,,425,,,,38,,,,,,38,,,,,,,,,,,371,,,38,39,,,,,,,39,39,,,,370,,,,', +'38,743,,,924,,,,39,,639,342,,39,,,,15,,,,15,,,,,15,,,,,,,,,,,,,,,,783', +',,784,,,,,,,15,,,370,,,,38,,,,,792,17,38,38,15,15,,,,312,,,,,,,,312', +',,38,,,,,38,816,,,,,,,,,,,,,,,17,,,17,,,,,,,,,,,,,,,,,,,,,17,,,,,,,734', +',,,,,,,,,839,,,,,,,,,,,,420,,,,17,,,,,,420,420,,,,420,420,,,,,,,,,,', +',,,,,,,,,,,,,,,,,,,312,,,,,,,886,,,,312,,,,,,,,,,,15,895,,,,,,,,,,,', +',,,,,,342,,,,,,,,,,,,,,,,,,,,,15,,,15,,,,,17,,,,,17,,,,17,,,,,,,15,', +',17,,,,,,,,,,,,,,,,,420,,,,,,,,,15,,,,15,,,,,,15,15,,,,15,15,,,17,,', +',,,,,,,,17,,,,,,,,,,,,,,,,,234,,,,,,,,,282,282,282,,,,,,,17,,,,328,329', +'17,331,,,,,,,,,,,,,17,,282,282,,,,,,,,,,367,,,,,17,,,,928,,,,,,,,,15', +',,,,15,,,,15,,,,,,,,,,15,,,,,,,,,,,,,,,,,15,,,,,,367,,,,17,,,,,,,17', +'17,,,,,,,,,,15,,,,,,,17,,,,15,17,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,15', +',,,,,15,,,,,,,282,424,,,430,282,,15,,,430,,,,,,,,,,,,,234,,15,461,462', +'463,464,465,466,467,468,469,470,471,472,473,474,475,476,477,478,479', +'480,481,482,,,,,483,,,,,,,282,282,,,,,,,,282,,,,,,,282,,282,,,282,282', +',,15,,,,,,,15,15,,,,,,,,,,,,,,,,,15,,,,,15,,,,530,,531,,,,,,,,,,,,,', +',,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,282', +',,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,282,,430,430,430,,,,,,,,,', +',,,,,,,,,,,,,,,,,,,,,,,,,,,282,,282,,282,,,,,,,,,,,,,,,,282,,,,,,,,', +'430,659,,,,,,,,,,,282,,,282,,,,,,,,,,,,,,,282,282,,,,,,,,,,282,,,,,', +',,,,,,,,,,,,,,,,,,,,,,,,,,282,430,282,,,,751,,,282,282,430,430,,,,430', +'430,,,,,,,,,,,,,,,,,,,,,,,,282,,,282,,,,,,,,,,,,,,,,,,,282,,,,,,,,,', +',,,,,,,,,,,,,,,,282,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,', +',,,,,,,282,,,,,,,,430,,,,,,,,,,,,,430,430,430,430,,845,,,,,,,,,,,,,', +',,,,,,,,,,,,,,,,,,,,,,,,,282,,,,,,,,,,,,,,,,282,,,,,,,,,,,,,,,,,,282', +'430,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,', +',,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,282' ] + racc_goto_table = arr = ::Array.new(3465, nil) + idx = 0 + clist.each do |str| + str.split(',', -1).each do |i| + arr[idx] = i.to_i unless i.empty? + idx += 1 + end + end + +clist = [ +'34,63,9,50,144,81,81,30,50,73,73,96,42,105,77,4,39,39,39,101,32,57,83', +'50,56,8,107,34,32,68,68,11,50,50,50,188,50,7,64,64,16,16,7,100,73,73', +'73,6,18,18,99,99,18,31,67,67,36,36,27,23,23,30,50,84,27,84,71,50,50', +'58,21,50,78,78,78,126,126,188,105,45,4,53,79,79,25,25,79,61,25,119,161', +'12,133,184,46,179,7,44,44,44,161,5,64,78,18,18,18,18,43,43,131,51,51', +'51,138,2,185,1,50,121,165,165,70,50,50,50,50,50,70,50,52,137,12,111', +'80,80,80,147,62,62,25,25,25,25,110,188,147,109,123,54,108,104,7,102', +'98,129,95,43,135,94,82,7,76,7,136,80,80,139,140,141,142,83,74,69,84', +'84,145,146,135,148,150,151,154,155,156,157,119,160,162,143,163,164,48', +'185,167,138,168,81,166,166,166,166,179,169,39,54,170,171,172,37,26,5', +'137,177,50,50,50,50,50,50,50,101,184,24,20,50,50,50,54,17,133,32,179', +'46,25,25,135,181,182,50,9,2,131,25,25,121,30,31,122,64,15,112,13,126', +'126,78,78,113,39,39,47,58,21,21,114,47,21,39,115,58,116,31,21,117,50', +'50,118,,,126,47,73,,50,,173,,179,61,47,47,47,57,47,,81,34,161,73,81', +',50,,,122,50,105,30,4,,50,143,,56,32,78,34,,8,47,,,10,78,47,47,12,,47', +'100,,32,18,31,19,7,50,19,,,6,122,31,19,43,43,71,30,,,53,50,50,50,51', +'53,,30,107,126,32,105,51,4,70,,70,31,25,143,143,42,50,122,83,47,54,80', +',188,47,47,47,47,47,80,47,32,50,25,9,30,58,,9,166,,166,,52,,,,,52,25', +',173,43,84,,79,34,,99,54,81,,43,54,,45,81,32,,68,45,,,,,,70,81,64,54', +'16,,,,,54,,39,,,,,43,,67,,27,27,,,43,27,27,50,54,,,34,81,173,173,,,11', +',47,47,47,47,47,47,47,,,,,47,47,47,64,,,,,73,83,43,43,,,47,81,73,54', +'10,9,,,39,56,,81,44,23,50,,,56,44,9,70,70,,,50,70,70,,,10,,,,,132,47', +'47,,178,50,,81,,,47,,,,39,81,,,,64,50,36,25,50,39,132,44,132,47,64,50', +'105,47,101,,,,47,,,50,99,,,50,,,,,96,105,81,,,,54,,,39,64,,10,,47,27', +'64,10,99,,78,,,80,50,50,,34,50,47,47,47,144,,50,50,,77,68,50,50,,73', +'9,,,31,64,,16,47,34,81,73,64,81,,56,,10,10,,7,67,80,,47,,56,,,21,,,', +',,178,63,70,,21,21,132,,132,21,21,,,,,70,70,70,70,,,,,,,,180,,,,132', +',,,,,34,,,,,,,,,34,,,,78,18,,,,,,,80,178,178,47,,,50,,19,,,50,50,34', +',50,,,19,19,,,,19,19,50,,54,132,25,77,,,,77,,,70,,,,,50,,,64,34,54,', +'30,,,,178,47,,,,,,,,,,47,,34,,,,50,,,,,,,,178,47,178,50,120,,,,,,,21', +',,,18,47,,,47,180,54,,180,,180,47,180,,,,,,,50,127,47,,50,,47,,,73,50', +'10,34,,10,,105,25,73,,,105,127,29,50,127,,,29,,,,,,,47,47,,43,47,,,50', +'29,,47,47,,19,,47,47,29,29,29,,29,29,29,,,,,,,,,,180,73,180,,180,178', +'180,178,,,,,,,29,128,128,128,,29,29,,,29,29,29,29,22,120,178,,120,22', +'50,,,,32,180,,50,50,,,,,,,,,,,34,,,,,,50,81,22,,127,50,,127,39,127,', +'127,29,,125,,,29,29,29,29,29,,29,50,47,178,,22,,47,47,,34,47,125,,,22', +',,,,,47,,,120,64,120,,,,64,10,,,,,,,47,,128,128,128,128,,128,176,176', +'176,,10,,,,,,,,,,,22,,127,,127,47,127,,127,22,,22,,,,,47,,,,120,120', +',,29,29,29,29,29,29,29,,,,10,29,29,29,,,127,128,128,128,128,10,,47,', +'29,,47,130,,,128,,47,120,125,120,,125,,125,,125,,,,,47,,,,,,,,130,10', +'130,,,29,29,,,,47,120,,,29,,,22,,22,,,22,,,,,,22,,,,29,,,,29,,,10,29', +'29,22,,,,,,,,,,,,,,,29,,,,,125,,125,,125,29,125,47,,,,,,,47,47,,,,,29', +'29,29,,,,,,,,60,,47,,,60,10,47,125,,,29,22,10,10,130,22,130,,176,176', +'22,176,176,,176,47,29,,,,10,,60,60,60,,130,,130,,130,,,,,,22,,,,,,,', +',,,,60,,,,22,22,,,,,60,60,60,60,,,,59,,,,,59,,,,,,,,,,,130,,130,,130', +',29,,,,,,,,,,,59,59,59,,130,,60,,,,176,176,176,176,,60,,60,,,,130,,', +',,59,,,,,,,,,,59,59,59,59,29,,,,,,,,29,,29,,,,,,29,176,,,,,,,,29,,,', +',,,,,,,,,,,29,,59,29,,,,,,,29,59,,59,,,,,,,29,,60,,29,,,,,,,,22,,,,', +',,,,,,,,,,60,,,,,,29,29,,,29,,,,,,29,29,,,,29,29,,,22,,,22,,,,,,,,,', +',,,,,,,,,,,22,,59,29,,,,,,,,,,60,29,,,60,,,,60,60,,,,,59,,22,,,,22,', +',,,60,22,22,,,,22,22,,,60,,,,,,,,,,,,,,,,60,60,,,,,,,,29,,,,,29,29,', +',29,,,,,,,59,,,29,59,,,,59,59,,,,,,,,,,,29,,,,,59,,,,75,,,,,,59,,,,', +',,,,,,,,29,,,59,59,,,,22,,,29,,22,,,,22,,,,,,,,,,22,,,,,,,,,,,,,,,29', +',22,,29,,,,,,29,,,,,,,,,,,,,,29,,,,,,22,,,,33,,,29,,33,,22,29,60,,,29', +',,,,60,,,,,,,,60,,,,,,,,33,33,33,,,,,,,22,,,,,,22,60,,,60,,,,75,75,', +'33,,,22,29,,,,29,,33,33,33,,60,29,29,,,,,22,,,,22,59,,,,,,,29,59,,,', +'29,,,,59,,,,,60,,,,,,,,,33,29,,,,,,,,33,59,33,,59,,,75,,75,,,75,75,', +'22,,,,,,,22,22,60,59,,,,,,,,,,60,,28,,,22,,28,,,22,,,,,,,,,,,,,59,,', +',,,,,,,,,28,,,,,,,,,,,,,,,,,33,,33,,,33,,60,,28,,33,60,59,,,60,,,,,', +',,59,33,60,,,,,,,,,,,,,,,,,,,,75,,,,,,,,,,,,,,,,,,,28,,,,,,60,,,28,', +'28,,,,,,60,59,,,,33,59,,,33,59,,,33,33,,,,,,59,,,,,,,,,,33,,,,,60,,', +',,33,60,,,,,,,75,,75,,75,,,60,33,33,,,,,,,,59,,,60,,,,,60,,,59,60,,28', +',28,,,28,,,,,75,28,,75,,,,,,,,,,,,28,,,75,,,,59,,,,,,59,,,,,,,,,,,60', +',,59,60,,,,,,,60,60,,,,59,,,,,59,75,,,59,,,,60,,75,75,,60,,,,28,,,,28', +',,,,28,,,,,,,,,,,,,,,,75,,,75,,,,,,,28,,,59,,,,59,,,,,75,33,59,59,28', +'28,,,,33,,,,,,,,33,,,59,,,,,59,75,,,,,,,,,,,,,,,33,,,33,,,,,,,,,,,,', +',,,,,,,,33,,,,,,,33,,,,,,,,,,75,,,,,,,,,,,,33,,,,33,,,,,,33,33,,,,33', +'33,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,33,,,,,,,75,,,,33,,,,,,,,,,,28,75,,', +',,,,,,,,,,,,,,,75,,,,,,,,,,,,,,,,,,,,,28,,,28,,,,,33,,,,,33,,,,33,,', +',,,,28,,,33,,,,,,,,,,,,,,,,,33,,,,,,,,,28,,,,28,,,,,,28,28,,,,28,28', +',,33,,,,,,,,,,,33,,,,,,,,,,,,,,,,,35,,,,,,,,,35,35,35,,,,,,,33,,,,35', +'35,33,35,,,,,,,,,,,,,33,,35,35,,,,,,,,,,33,,,,,33,,,,33,,,,,,,,,28,', +',,,28,,,,28,,,,,,,,,,28,,,,,,,,,,,,,,,,,28,,,,,,33,,,,33,,,,,,,33,33', +',,,,,,,,,28,,,,,,,33,,,,28,33,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,28,,', +',,,28,,,,,,,35,35,,,35,35,,28,,,35,,,,,,,,,,,,,35,,28,35,35,35,35,35', +'35,35,35,35,35,35,35,35,35,35,35,35,35,35,35,35,35,,,,,35,,,,,,,35,35', +',,,,,,,35,,,,,,,35,,35,,,35,35,,,28,,,,,,,28,28,,,,,,,,,,,,,,,,,28,', +',,,28,,,,35,,35,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,', +',,,,,,,,,,,,,,,,,,,,,,,,,,,,35,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,', +',,,,,35,,35,35,35,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,35,,35,,35,,,', +',,,,,,,,,,,,35,,,,,,,,,35,35,,,,,,,,,,,35,,,35,,,,,,,,,,,,,,,35,35,', +',,,,,,,,35,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,35,35,35,,,,35,,,35,35,35', +'35,,,,35,35,,,,,,,,,,,,,,,,,,,,,,,,35,,,35,,,,,,,,,,,,,,,,,,,35,,,,', +',,,,,,,,,,,,,,,,,,,,,35,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,', +',,,,,,,,,,,35,,,,,,,,35,,,,,,,,,,,,,35,35,35,35,,35,,,,,,,,,,,,,,,,', +',,,,,,,,,,,,,,,,,,,,,,35,,,,,,,,,,,,,,,,35,,,,,,,,,,,,,,,,,,35,35,,', +',,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,', +',,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,35' ] + racc_goto_check = arr = ::Array.new(3465, nil) + idx = 0 + clist.each do |str| + str.split(',', -1).each do |i| + arr[idx] = i.to_i unless i.empty? + idx += 1 + end + end + +racc_goto_pointer = [ + nil, 117, 115, nil, 12, 96, 44, 37, 18, -331, + 289, -502, -570, -537, nil, -257, 32, 220, -16, 121, + 155, 50, 920, -153, 11, 20, 83, -158, 1865, 848, + -210, -378, 4, 1704, -19, 2492, -10, -342, nil, -13, + nil, nil, -12, -110, 71, -191, -398, 260, -296, nil, + 3, 82, 97, 48, -75, nil, -10, -14, -254, 1282, + 1206, -277, 68, -71, 30, nil, nil, 46, 21, -235, + -94, 25, nil, -25, 128, 1548, 102, -46, 43, -255, + 105, -21, -325, -263, -434, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 87, 95, -51, nil, -190, -296, + -657, -333, 84, nil, -217, 10, nil, -546, 78, 89, + -190, 74, 188, -311, -459, -104, -112, -300, -561, -799, + 110, -566, -642, -630, nil, 187, -595, 48, 57, -623, + 309, -668, -248, -542, nil, -620, -754, -787, -804, -379, + -629, -175, -497, -357, -18, -695, -695, -347, -86, nil, + -95, -95, nil, nil, -446, -713, -478, -608, nil, nil, + 106, 7, 102, 103, 103, -270, -190, 105, 106, 112, + -372, -372, -361, -261, nil, nil, 347, -590, -12, -708, + -96, -562, -669, nil, -712, -796, nil, nil, -464 ] + +racc_goto_default = [ + nil, nil, nil, 3, nil, 4, 353, 299, nil, nil, + 533, nil, 821, nil, 296, 297, nil, nil, nil, 11, + 12, 18, 232, nil, nil, 14, nil, 418, 233, 327, + nil, nil, 566, 231, 453, 21, nil, nil, 348, 22, + 23, 24, nil, 655, nil, nil, nil, 316, nil, 25, + 313, 432, 32, nil, nil, 34, 37, 36, nil, 228, + 229, 365, nil, 134, 440, 133, 136, 79, 80, nil, + 423, 94, 44, 47, 264, 288, nil, 790, 433, nil, + 434, 445, 614, 496, 286, 272, 48, 49, 50, 51, + 52, 53, 54, 55, 56, nil, 273, 62, nil, nil, + nil, nil, nil, 70, nil, 548, 71, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 812, + 683, nil, 813, 956, 848, 671, nil, 672, nil, nil, + 673, nil, 675, nil, 777, nil, nil, nil, 681, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 444, + nil, nil, 634, 628, nil, nil, nil, nil, 78, 81, + 82, nil, nil, nil, nil, nil, 576, nil, nil, nil, + nil, nil, nil, 877, 727, 670, nil, 674, 885, 686, + 688, 689, 860, 692, 693, 861, 696, 699, 291 ] + +racc_reduce_table = [ + 0, 0, :racc_error, + 1, 146, :_reduce_none, + 2, 147, :_reduce_2, + 0, 148, :_reduce_3, + 1, 148, :_reduce_4, + 3, 148, :_reduce_5, + 2, 148, :_reduce_6, + 1, 150, :_reduce_none, + 2, 150, :_reduce_8, + 3, 153, :_reduce_9, + 4, 154, :_reduce_10, + 2, 155, :_reduce_11, + 0, 159, :_reduce_12, + 1, 159, :_reduce_13, + 3, 159, :_reduce_14, + 2, 159, :_reduce_15, + 1, 160, :_reduce_none, + 2, 160, :_reduce_17, + 0, 171, :_reduce_18, + 4, 152, :_reduce_19, + 3, 152, :_reduce_20, + 3, 152, :_reduce_21, + 3, 152, :_reduce_22, + 2, 152, :_reduce_23, + 3, 152, :_reduce_24, + 3, 152, :_reduce_25, + 3, 152, :_reduce_26, + 3, 152, :_reduce_27, + 3, 152, :_reduce_28, + 4, 152, :_reduce_29, + 1, 152, :_reduce_none, + 3, 152, :_reduce_31, + 3, 152, :_reduce_32, + 3, 152, :_reduce_33, + 1, 152, :_reduce_none, + 3, 164, :_reduce_35, + 3, 164, :_reduce_36, + 6, 164, :_reduce_37, + 5, 164, :_reduce_38, + 5, 164, :_reduce_39, + 5, 164, :_reduce_40, + 5, 164, :_reduce_41, + 3, 164, :_reduce_42, + 1, 172, :_reduce_none, + 3, 172, :_reduce_44, + 1, 172, :_reduce_none, + 1, 170, :_reduce_none, + 3, 170, :_reduce_47, + 3, 170, :_reduce_48, + 3, 170, :_reduce_49, + 2, 170, :_reduce_50, + 1, 170, :_reduce_none, + 1, 163, :_reduce_none, + 0, 183, :_reduce_53, + 3, 181, :_reduce_54, + 1, 166, :_reduce_none, + 1, 166, :_reduce_none, + 1, 185, :_reduce_none, + 4, 185, :_reduce_58, + 0, 193, :_reduce_59, + 4, 190, :_reduce_60, + 1, 192, :_reduce_none, + 2, 184, :_reduce_62, + 3, 184, :_reduce_63, + 4, 184, :_reduce_64, + 5, 184, :_reduce_65, + 4, 184, :_reduce_66, + 5, 184, :_reduce_67, + 2, 184, :_reduce_68, + 2, 184, :_reduce_69, + 2, 184, :_reduce_70, + 2, 184, :_reduce_71, + 2, 184, :_reduce_72, + 1, 165, :_reduce_73, + 3, 165, :_reduce_74, + 1, 198, :_reduce_75, + 3, 198, :_reduce_76, + 1, 197, :_reduce_none, + 2, 197, :_reduce_78, + 3, 197, :_reduce_79, + 5, 197, :_reduce_80, + 2, 197, :_reduce_81, + 4, 197, :_reduce_82, + 2, 197, :_reduce_83, + 4, 197, :_reduce_84, + 1, 197, :_reduce_85, + 3, 197, :_reduce_86, + 1, 201, :_reduce_none, + 3, 201, :_reduce_88, + 2, 200, :_reduce_89, + 3, 200, :_reduce_90, + 1, 203, :_reduce_91, + 3, 203, :_reduce_92, + 1, 202, :_reduce_93, + 1, 202, :_reduce_94, + 4, 202, :_reduce_95, + 3, 202, :_reduce_96, + 3, 202, :_reduce_97, + 3, 202, :_reduce_98, + 3, 202, :_reduce_99, + 2, 202, :_reduce_100, + 1, 202, :_reduce_101, + 1, 167, :_reduce_102, + 1, 167, :_reduce_103, + 4, 167, :_reduce_104, + 3, 167, :_reduce_105, + 3, 167, :_reduce_106, + 3, 167, :_reduce_107, + 3, 167, :_reduce_108, + 2, 167, :_reduce_109, + 1, 167, :_reduce_110, + 1, 206, :_reduce_111, + 1, 206, :_reduce_none, + 2, 207, :_reduce_113, + 1, 207, :_reduce_114, + 3, 207, :_reduce_115, + 1, 208, :_reduce_none, + 1, 208, :_reduce_none, + 1, 208, :_reduce_none, + 1, 208, :_reduce_none, + 1, 208, :_reduce_none, + 1, 211, :_reduce_121, + 1, 211, :_reduce_none, + 1, 161, :_reduce_none, + 1, 161, :_reduce_none, + 1, 162, :_reduce_125, + 0, 214, :_reduce_126, + 4, 162, :_reduce_127, + 1, 209, :_reduce_none, + 1, 209, :_reduce_none, + 1, 209, :_reduce_none, + 1, 209, :_reduce_none, + 1, 209, :_reduce_none, + 1, 209, :_reduce_none, + 1, 209, :_reduce_none, + 1, 209, :_reduce_none, + 1, 209, :_reduce_none, + 1, 209, :_reduce_none, + 1, 209, :_reduce_none, + 1, 209, :_reduce_none, + 1, 209, :_reduce_none, + 1, 209, :_reduce_none, + 1, 209, :_reduce_none, + 1, 209, :_reduce_none, + 1, 209, :_reduce_none, + 1, 209, :_reduce_none, + 1, 209, :_reduce_none, + 1, 209, :_reduce_none, + 1, 209, :_reduce_none, + 1, 209, :_reduce_none, + 1, 209, :_reduce_none, + 1, 209, :_reduce_none, + 1, 209, :_reduce_none, + 1, 209, :_reduce_none, + 1, 209, :_reduce_none, + 1, 209, :_reduce_none, + 1, 209, :_reduce_none, + 1, 209, :_reduce_none, + 1, 210, :_reduce_none, + 1, 210, :_reduce_none, + 1, 210, :_reduce_none, + 1, 210, :_reduce_none, + 1, 210, :_reduce_none, + 1, 210, :_reduce_none, + 1, 210, :_reduce_none, + 1, 210, :_reduce_none, + 1, 210, :_reduce_none, + 1, 210, :_reduce_none, + 1, 210, :_reduce_none, + 1, 210, :_reduce_none, + 1, 210, :_reduce_none, + 1, 210, :_reduce_none, + 1, 210, :_reduce_none, + 1, 210, :_reduce_none, + 1, 210, :_reduce_none, + 1, 210, :_reduce_none, + 1, 210, :_reduce_none, + 1, 210, :_reduce_none, + 1, 210, :_reduce_none, + 1, 210, :_reduce_none, + 1, 210, :_reduce_none, + 1, 210, :_reduce_none, + 1, 210, :_reduce_none, + 1, 210, :_reduce_none, + 1, 210, :_reduce_none, + 1, 210, :_reduce_none, + 1, 210, :_reduce_none, + 1, 210, :_reduce_none, + 1, 210, :_reduce_none, + 1, 210, :_reduce_none, + 1, 210, :_reduce_none, + 1, 210, :_reduce_none, + 1, 210, :_reduce_none, + 1, 210, :_reduce_none, + 1, 210, :_reduce_none, + 1, 210, :_reduce_none, + 1, 210, :_reduce_none, + 1, 210, :_reduce_none, + 1, 210, :_reduce_none, + 3, 180, :_reduce_199, + 3, 180, :_reduce_200, + 6, 180, :_reduce_201, + 5, 180, :_reduce_202, + 5, 180, :_reduce_203, + 5, 180, :_reduce_204, + 5, 180, :_reduce_205, + 4, 180, :_reduce_206, + 3, 180, :_reduce_207, + 3, 180, :_reduce_208, + 3, 180, :_reduce_209, + 3, 180, :_reduce_210, + 3, 180, :_reduce_211, + 3, 180, :_reduce_212, + 3, 180, :_reduce_213, + 3, 180, :_reduce_214, + 3, 180, :_reduce_215, + 4, 180, :_reduce_216, + 2, 180, :_reduce_217, + 2, 180, :_reduce_218, + 3, 180, :_reduce_219, + 3, 180, :_reduce_220, + 3, 180, :_reduce_221, + 3, 180, :_reduce_222, + 1, 180, :_reduce_none, + 3, 180, :_reduce_224, + 3, 180, :_reduce_225, + 3, 180, :_reduce_226, + 3, 180, :_reduce_227, + 3, 180, :_reduce_228, + 2, 180, :_reduce_229, + 2, 180, :_reduce_230, + 3, 180, :_reduce_231, + 3, 180, :_reduce_232, + 3, 180, :_reduce_233, + 3, 180, :_reduce_234, + 3, 180, :_reduce_235, + 6, 180, :_reduce_236, + 1, 180, :_reduce_none, + 1, 219, :_reduce_none, + 1, 219, :_reduce_none, + 1, 219, :_reduce_none, + 1, 219, :_reduce_none, + 3, 217, :_reduce_242, + 3, 217, :_reduce_243, + 1, 220, :_reduce_none, + 1, 221, :_reduce_none, + 2, 221, :_reduce_none, + 4, 221, :_reduce_247, + 2, 221, :_reduce_248, + 1, 215, :_reduce_none, + 3, 215, :_reduce_250, + 3, 226, :_reduce_251, + 0, 227, :_reduce_252, + 1, 227, :_reduce_none, + 0, 175, :_reduce_254, + 1, 175, :_reduce_none, + 2, 175, :_reduce_none, + 4, 175, :_reduce_257, + 2, 175, :_reduce_258, + 1, 196, :_reduce_259, + 2, 196, :_reduce_260, + 2, 196, :_reduce_261, + 4, 196, :_reduce_262, + 1, 196, :_reduce_263, + 0, 230, :_reduce_264, + 2, 189, :_reduce_265, + 2, 229, :_reduce_266, + 2, 228, :_reduce_267, + 0, 228, :_reduce_268, + 1, 223, :_reduce_269, + 2, 223, :_reduce_270, + 3, 223, :_reduce_271, + 4, 223, :_reduce_272, + 1, 169, :_reduce_273, + 1, 169, :_reduce_none, + 3, 168, :_reduce_275, + 4, 168, :_reduce_276, + 2, 168, :_reduce_277, + 1, 218, :_reduce_none, + 1, 218, :_reduce_none, + 1, 218, :_reduce_none, + 1, 218, :_reduce_none, + 1, 218, :_reduce_none, + 1, 218, :_reduce_none, + 1, 218, :_reduce_none, + 1, 218, :_reduce_none, + 1, 218, :_reduce_none, + 1, 218, :_reduce_none, + 1, 218, :_reduce_288, + 0, 254, :_reduce_289, + 4, 218, :_reduce_290, + 0, 255, :_reduce_291, + 4, 218, :_reduce_292, + 0, 256, :_reduce_293, + 4, 218, :_reduce_294, + 3, 218, :_reduce_295, + 3, 218, :_reduce_296, + 2, 218, :_reduce_297, + 3, 218, :_reduce_298, + 3, 218, :_reduce_299, + 1, 218, :_reduce_300, + 4, 218, :_reduce_301, + 3, 218, :_reduce_302, + 1, 218, :_reduce_303, + 5, 218, :_reduce_304, + 4, 218, :_reduce_305, + 3, 218, :_reduce_306, + 2, 218, :_reduce_307, + 1, 218, :_reduce_none, + 2, 218, :_reduce_309, + 0, 257, :_reduce_310, + 3, 218, :_reduce_311, + 6, 218, :_reduce_312, + 6, 218, :_reduce_313, + 4, 218, :_reduce_314, + 4, 218, :_reduce_315, + 5, 218, :_reduce_316, + 4, 218, :_reduce_317, + 6, 218, :_reduce_318, + 0, 258, :_reduce_319, + 6, 218, :_reduce_320, + 0, 259, :_reduce_321, + 7, 218, :_reduce_322, + 0, 260, :_reduce_323, + 5, 218, :_reduce_324, + 0, 261, :_reduce_325, + 6, 218, :_reduce_326, + 0, 262, :_reduce_327, + 0, 263, :_reduce_328, + 9, 218, :_reduce_329, + 1, 218, :_reduce_330, + 1, 218, :_reduce_331, + 1, 218, :_reduce_332, + 1, 218, :_reduce_333, + 1, 174, :_reduce_none, + 1, 248, :_reduce_335, + 1, 251, :_reduce_336, + 1, 195, :_reduce_337, + 1, 244, :_reduce_none, + 1, 244, :_reduce_none, + 2, 244, :_reduce_340, + 1, 182, :_reduce_none, + 1, 182, :_reduce_none, + 1, 245, :_reduce_none, + 5, 245, :_reduce_344, + 1, 157, :_reduce_none, + 2, 157, :_reduce_346, + 1, 247, :_reduce_none, + 1, 247, :_reduce_none, + 1, 264, :_reduce_349, + 3, 264, :_reduce_350, + 1, 267, :_reduce_351, + 3, 267, :_reduce_352, + 1, 266, :_reduce_none, + 4, 266, :_reduce_354, + 6, 266, :_reduce_355, + 3, 266, :_reduce_356, + 5, 266, :_reduce_357, + 2, 266, :_reduce_358, + 4, 266, :_reduce_359, + 1, 266, :_reduce_360, + 3, 266, :_reduce_361, + 4, 268, :_reduce_362, + 2, 268, :_reduce_363, + 2, 268, :_reduce_364, + 1, 268, :_reduce_365, + 2, 273, :_reduce_366, + 0, 273, :_reduce_367, + 6, 274, :_reduce_368, + 8, 274, :_reduce_369, + 4, 274, :_reduce_370, + 6, 274, :_reduce_371, + 4, 274, :_reduce_372, + 2, 274, :_reduce_none, + 6, 274, :_reduce_374, + 2, 274, :_reduce_375, + 4, 274, :_reduce_376, + 6, 274, :_reduce_377, + 2, 274, :_reduce_378, + 4, 274, :_reduce_379, + 2, 274, :_reduce_380, + 4, 274, :_reduce_381, + 1, 274, :_reduce_none, + 0, 278, :_reduce_383, + 1, 278, :_reduce_384, + 3, 279, :_reduce_385, + 1, 279, :_reduce_386, + 4, 279, :_reduce_387, + 1, 280, :_reduce_388, + 4, 280, :_reduce_389, + 1, 281, :_reduce_390, + 3, 281, :_reduce_391, + 1, 282, :_reduce_392, + 1, 282, :_reduce_none, + 0, 286, :_reduce_394, + 0, 287, :_reduce_395, + 4, 243, :_reduce_396, + 4, 284, :_reduce_397, + 1, 284, :_reduce_398, + 0, 290, :_reduce_399, + 4, 285, :_reduce_400, + 0, 291, :_reduce_401, + 4, 285, :_reduce_402, + 0, 293, :_reduce_403, + 4, 289, :_reduce_404, + 2, 186, :_reduce_405, + 4, 186, :_reduce_406, + 5, 186, :_reduce_407, + 5, 186, :_reduce_408, + 2, 242, :_reduce_409, + 4, 242, :_reduce_410, + 4, 242, :_reduce_411, + 3, 242, :_reduce_412, + 3, 242, :_reduce_413, + 3, 242, :_reduce_414, + 2, 242, :_reduce_415, + 1, 242, :_reduce_416, + 4, 242, :_reduce_417, + 0, 295, :_reduce_418, + 4, 241, :_reduce_419, + 0, 296, :_reduce_420, + 4, 241, :_reduce_421, + 0, 297, :_reduce_422, + 3, 191, :_reduce_423, + 0, 298, :_reduce_424, + 0, 299, :_reduce_425, + 4, 292, :_reduce_426, + 5, 246, :_reduce_427, + 1, 300, :_reduce_428, + 1, 300, :_reduce_none, + 6, 156, :_reduce_430, + 0, 156, :_reduce_431, + 1, 301, :_reduce_432, + 1, 301, :_reduce_none, + 1, 301, :_reduce_none, + 2, 302, :_reduce_435, + 1, 302, :_reduce_none, + 2, 158, :_reduce_437, + 1, 158, :_reduce_none, + 1, 231, :_reduce_none, + 1, 231, :_reduce_none, + 1, 231, :_reduce_none, + 1, 232, :_reduce_442, + 1, 304, :_reduce_443, + 2, 304, :_reduce_444, + 3, 305, :_reduce_445, + 1, 305, :_reduce_446, + 1, 305, :_reduce_447, + 3, 233, :_reduce_448, + 4, 234, :_reduce_449, + 3, 235, :_reduce_450, + 0, 309, :_reduce_451, + 3, 309, :_reduce_452, + 1, 310, :_reduce_453, + 2, 310, :_reduce_454, + 3, 237, :_reduce_455, + 0, 312, :_reduce_456, + 3, 312, :_reduce_457, + 3, 236, :_reduce_458, + 3, 238, :_reduce_459, + 0, 313, :_reduce_460, + 3, 313, :_reduce_461, + 0, 314, :_reduce_462, + 3, 314, :_reduce_463, + 0, 306, :_reduce_464, + 2, 306, :_reduce_465, + 0, 307, :_reduce_466, + 2, 307, :_reduce_467, + 0, 308, :_reduce_468, + 2, 308, :_reduce_469, + 1, 311, :_reduce_470, + 2, 311, :_reduce_471, + 0, 316, :_reduce_472, + 4, 311, :_reduce_473, + 1, 315, :_reduce_474, + 1, 315, :_reduce_475, + 1, 315, :_reduce_476, + 1, 315, :_reduce_none, + 1, 212, :_reduce_478, + 3, 213, :_reduce_479, + 1, 303, :_reduce_480, + 2, 303, :_reduce_481, + 1, 216, :_reduce_482, + 1, 216, :_reduce_483, + 1, 216, :_reduce_484, + 1, 216, :_reduce_485, + 1, 204, :_reduce_486, + 1, 204, :_reduce_487, + 1, 204, :_reduce_488, + 1, 204, :_reduce_489, + 1, 204, :_reduce_490, + 1, 205, :_reduce_491, + 1, 205, :_reduce_492, + 1, 205, :_reduce_493, + 1, 205, :_reduce_494, + 1, 205, :_reduce_495, + 1, 205, :_reduce_496, + 1, 205, :_reduce_497, + 1, 239, :_reduce_498, + 1, 239, :_reduce_499, + 1, 173, :_reduce_500, + 1, 173, :_reduce_501, + 1, 178, :_reduce_502, + 1, 178, :_reduce_503, + 0, 317, :_reduce_504, + 4, 249, :_reduce_505, + 0, 249, :_reduce_506, + 3, 252, :_reduce_507, + 0, 319, :_reduce_508, + 3, 252, :_reduce_509, + 4, 318, :_reduce_510, + 2, 318, :_reduce_511, + 2, 318, :_reduce_512, + 1, 318, :_reduce_513, + 2, 321, :_reduce_514, + 0, 321, :_reduce_515, + 6, 288, :_reduce_516, + 8, 288, :_reduce_517, + 4, 288, :_reduce_518, + 6, 288, :_reduce_519, + 4, 288, :_reduce_520, + 6, 288, :_reduce_521, + 2, 288, :_reduce_522, + 4, 288, :_reduce_523, + 6, 288, :_reduce_524, + 2, 288, :_reduce_525, + 4, 288, :_reduce_526, + 2, 288, :_reduce_527, + 4, 288, :_reduce_528, + 1, 288, :_reduce_529, + 0, 288, :_reduce_530, + 1, 283, :_reduce_531, + 1, 283, :_reduce_532, + 1, 283, :_reduce_533, + 1, 283, :_reduce_534, + 1, 265, :_reduce_none, + 1, 265, :_reduce_536, + 1, 323, :_reduce_537, + 1, 324, :_reduce_538, + 3, 324, :_reduce_539, + 1, 275, :_reduce_540, + 3, 275, :_reduce_541, + 1, 325, :_reduce_542, + 2, 326, :_reduce_543, + 1, 326, :_reduce_544, + 2, 327, :_reduce_545, + 1, 327, :_reduce_546, + 1, 269, :_reduce_547, + 3, 269, :_reduce_548, + 1, 320, :_reduce_549, + 3, 320, :_reduce_550, + 1, 328, :_reduce_none, + 1, 328, :_reduce_none, + 2, 270, :_reduce_553, + 1, 270, :_reduce_554, + 3, 329, :_reduce_555, + 3, 330, :_reduce_556, + 1, 276, :_reduce_557, + 3, 276, :_reduce_558, + 1, 322, :_reduce_559, + 3, 322, :_reduce_560, + 1, 331, :_reduce_none, + 1, 331, :_reduce_none, + 2, 277, :_reduce_563, + 1, 277, :_reduce_564, + 1, 332, :_reduce_none, + 1, 332, :_reduce_none, + 2, 272, :_reduce_567, + 2, 271, :_reduce_568, + 0, 271, :_reduce_569, + 1, 253, :_reduce_none, + 3, 253, :_reduce_571, + 0, 240, :_reduce_572, + 2, 240, :_reduce_none, + 1, 225, :_reduce_574, + 3, 225, :_reduce_575, + 3, 333, :_reduce_576, + 2, 333, :_reduce_577, + 4, 333, :_reduce_578, + 2, 333, :_reduce_579, + 1, 194, :_reduce_none, + 1, 194, :_reduce_none, + 1, 194, :_reduce_none, + 1, 188, :_reduce_none, + 1, 188, :_reduce_none, + 1, 188, :_reduce_none, + 1, 188, :_reduce_none, + 1, 294, :_reduce_none, + 1, 294, :_reduce_none, + 1, 294, :_reduce_none, + 1, 187, :_reduce_none, + 1, 187, :_reduce_none, + 1, 177, :_reduce_592, + 1, 177, :_reduce_593, + 0, 149, :_reduce_none, + 1, 149, :_reduce_none, + 0, 179, :_reduce_none, + 1, 179, :_reduce_none, + 2, 199, :_reduce_598, + 2, 176, :_reduce_599, + 0, 224, :_reduce_none, + 1, 224, :_reduce_none, + 1, 224, :_reduce_none, + 1, 250, :_reduce_603, + 1, 250, :_reduce_none, + 1, 151, :_reduce_none, + 2, 151, :_reduce_none, + 0, 222, :_reduce_607 ] + +racc_reduce_n = 608 + +racc_shift_n = 1035 + +racc_token_table = { + false => 0, + :error => 1, + :kCLASS => 2, + :kMODULE => 3, + :kDEF => 4, + :kUNDEF => 5, + :kBEGIN => 6, + :kRESCUE => 7, + :kENSURE => 8, + :kEND => 9, + :kIF => 10, + :kUNLESS => 11, + :kTHEN => 12, + :kELSIF => 13, + :kELSE => 14, + :kCASE => 15, + :kWHEN => 16, + :kWHILE => 17, + :kUNTIL => 18, + :kFOR => 19, + :kBREAK => 20, + :kNEXT => 21, + :kREDO => 22, + :kRETRY => 23, + :kIN => 24, + :kDO => 25, + :kDO_COND => 26, + :kDO_BLOCK => 27, + :kDO_LAMBDA => 28, + :kRETURN => 29, + :kYIELD => 30, + :kSUPER => 31, + :kSELF => 32, + :kNIL => 33, + :kTRUE => 34, + :kFALSE => 35, + :kAND => 36, + :kOR => 37, + :kNOT => 38, + :kIF_MOD => 39, + :kUNLESS_MOD => 40, + :kWHILE_MOD => 41, + :kUNTIL_MOD => 42, + :kRESCUE_MOD => 43, + :kALIAS => 44, + :kDEFINED => 45, + :klBEGIN => 46, + :klEND => 47, + :k__LINE__ => 48, + :k__FILE__ => 49, + :k__ENCODING__ => 50, + :tIDENTIFIER => 51, + :tFID => 52, + :tGVAR => 53, + :tIVAR => 54, + :tCONSTANT => 55, + :tLABEL => 56, + :tCVAR => 57, + :tNTH_REF => 58, + :tBACK_REF => 59, + :tSTRING_CONTENT => 60, + :tINTEGER => 61, + :tFLOAT => 62, + :tUPLUS => 63, + :tUMINUS => 64, + :tUNARY_NUM => 65, + :tPOW => 66, + :tCMP => 67, + :tEQ => 68, + :tEQQ => 69, + :tNEQ => 70, + :tGEQ => 71, + :tLEQ => 72, + :tANDOP => 73, + :tOROP => 74, + :tMATCH => 75, + :tNMATCH => 76, + :tDOT => 77, + :tDOT2 => 78, + :tDOT3 => 79, + :tAREF => 80, + :tASET => 81, + :tLSHFT => 82, + :tRSHFT => 83, + :tCOLON2 => 84, + :tCOLON3 => 85, + :tOP_ASGN => 86, + :tASSOC => 87, + :tLPAREN => 88, + :tLPAREN2 => 89, + :tRPAREN => 90, + :tLPAREN_ARG => 91, + :tLBRACK => 92, + :tLBRACK2 => 93, + :tRBRACK => 94, + :tLBRACE => 95, + :tLBRACE_ARG => 96, + :tSTAR => 97, + :tSTAR2 => 98, + :tAMPER => 99, + :tAMPER2 => 100, + :tTILDE => 101, + :tPERCENT => 102, + :tDIVIDE => 103, + :tDSTAR => 104, + :tPLUS => 105, + :tMINUS => 106, + :tLT => 107, + :tGT => 108, + :tPIPE => 109, + :tBANG => 110, + :tCARET => 111, + :tLCURLY => 112, + :tRCURLY => 113, + :tBACK_REF2 => 114, + :tSYMBEG => 115, + :tSTRING_BEG => 116, + :tXSTRING_BEG => 117, + :tREGEXP_BEG => 118, + :tREGEXP_OPT => 119, + :tWORDS_BEG => 120, + :tQWORDS_BEG => 121, + :tSYMBOLS_BEG => 122, + :tQSYMBOLS_BEG => 123, + :tSTRING_DBEG => 124, + :tSTRING_DVAR => 125, + :tSTRING_END => 126, + :tSTRING_DEND => 127, + :tSTRING => 128, + :tSYMBOL => 129, + :tNL => 130, + :tEH => 131, + :tCOLON => 132, + :tCOMMA => 133, + :tSPACE => 134, + :tSEMI => 135, + :tLAMBDA => 136, + :tLAMBEG => 137, + :tCHARACTER => 138, + :tRATIONAL => 139, + :tIMAGINARY => 140, + :tLABEL_END => 141, + :tANDDOT => 142, + :tEQL => 143, + :tLOWEST => 144 } + +racc_nt_base = 145 + +racc_use_result_var = true + +Racc_arg = [ + racc_action_table, + racc_action_check, + racc_action_default, + racc_action_pointer, + racc_goto_table, + racc_goto_check, + racc_goto_default, + racc_goto_pointer, + racc_nt_base, + racc_reduce_table, + racc_token_table, + racc_shift_n, + racc_reduce_n, + racc_use_result_var ] + +Racc_token_to_s_table = [ + "$end", + "error", + "kCLASS", + "kMODULE", + "kDEF", + "kUNDEF", + "kBEGIN", + "kRESCUE", + "kENSURE", + "kEND", + "kIF", + "kUNLESS", + "kTHEN", + "kELSIF", + "kELSE", + "kCASE", + "kWHEN", + "kWHILE", + "kUNTIL", + "kFOR", + "kBREAK", + "kNEXT", + "kREDO", + "kRETRY", + "kIN", + "kDO", + "kDO_COND", + "kDO_BLOCK", + "kDO_LAMBDA", + "kRETURN", + "kYIELD", + "kSUPER", + "kSELF", + "kNIL", + "kTRUE", + "kFALSE", + "kAND", + "kOR", + "kNOT", + "kIF_MOD", + "kUNLESS_MOD", + "kWHILE_MOD", + "kUNTIL_MOD", + "kRESCUE_MOD", + "kALIAS", + "kDEFINED", + "klBEGIN", + "klEND", + "k__LINE__", + "k__FILE__", + "k__ENCODING__", + "tIDENTIFIER", + "tFID", + "tGVAR", + "tIVAR", + "tCONSTANT", + "tLABEL", + "tCVAR", + "tNTH_REF", + "tBACK_REF", + "tSTRING_CONTENT", + "tINTEGER", + "tFLOAT", + "tUPLUS", + "tUMINUS", + "tUNARY_NUM", + "tPOW", + "tCMP", + "tEQ", + "tEQQ", + "tNEQ", + "tGEQ", + "tLEQ", + "tANDOP", + "tOROP", + "tMATCH", + "tNMATCH", + "tDOT", + "tDOT2", + "tDOT3", + "tAREF", + "tASET", + "tLSHFT", + "tRSHFT", + "tCOLON2", + "tCOLON3", + "tOP_ASGN", + "tASSOC", + "tLPAREN", + "tLPAREN2", + "tRPAREN", + "tLPAREN_ARG", + "tLBRACK", + "tLBRACK2", + "tRBRACK", + "tLBRACE", + "tLBRACE_ARG", + "tSTAR", + "tSTAR2", + "tAMPER", + "tAMPER2", + "tTILDE", + "tPERCENT", + "tDIVIDE", + "tDSTAR", + "tPLUS", + "tMINUS", + "tLT", + "tGT", + "tPIPE", + "tBANG", + "tCARET", + "tLCURLY", + "tRCURLY", + "tBACK_REF2", + "tSYMBEG", + "tSTRING_BEG", + "tXSTRING_BEG", + "tREGEXP_BEG", + "tREGEXP_OPT", + "tWORDS_BEG", + "tQWORDS_BEG", + "tSYMBOLS_BEG", + "tQSYMBOLS_BEG", + "tSTRING_DBEG", + "tSTRING_DVAR", + "tSTRING_END", + "tSTRING_DEND", + "tSTRING", + "tSYMBOL", + "tNL", + "tEH", + "tCOLON", + "tCOMMA", + "tSPACE", + "tSEMI", + "tLAMBDA", + "tLAMBEG", + "tCHARACTER", + "tRATIONAL", + "tIMAGINARY", + "tLABEL_END", + "tANDDOT", + "tEQL", + "tLOWEST", + "$start", + "program", + "top_compstmt", + "top_stmts", + "opt_terms", + "top_stmt", + "terms", + "stmt", + "begin_block", + "bodystmt", + "compstmt", + "opt_rescue", + "opt_else", + "opt_ensure", + "stmts", + "stmt_or_begin", + "fitem", + "undef_list", + "expr_value", + "command_asgn", + "mlhs", + "command_call", + "lhs", + "mrhs", + "mrhs_arg", + "expr", + "@1", + "command_rhs", + "var_lhs", + "primary_value", + "opt_call_args", + "rbracket", + "call_op", + "backref", + "opt_nl", + "arg", + "expr_value_do", + "do", + "@2", + "command", + "block_command", + "block_call", + "dot_or_colon", + "operation2", + "command_args", + "cmd_brace_block", + "brace_body", + "fcall", + "@3", + "operation", + "k_return", + "call_args", + "mlhs_basic", + "mlhs_inner", + "rparen", + "mlhs_head", + "mlhs_item", + "mlhs_node", + "mlhs_post", + "user_variable", + "keyword_variable", + "cname", + "cpath", + "fname", + "op", + "reswords", + "fsym", + "symbol", + "dsym", + "@4", + "arg_rhs", + "simple_numeric", + "rel_expr", + "primary", + "relop", + "arg_value", + "aref_args", + "none", + "args", + "trailer", + "assocs", + "paren_args", + "opt_paren_args", + "opt_block_arg", + "block_arg", + "@5", + "literal", + "strings", + "xstring", + "regexp", + "words", + "qwords", + "symbols", + "qsymbols", + "var_ref", + "assoc_list", + "brace_block", + "method_call", + "lambda", + "then", + "if_tail", + "case_body", + "for_var", + "k_class", + "superclass", + "term", + "k_module", + "f_arglist", + "singleton", + "@6", + "@7", + "@8", + "@9", + "@10", + "@11", + "@12", + "@13", + "@14", + "@15", + "f_marg", + "f_norm_arg", + "f_margs", + "f_marg_list", + "block_args_tail", + "f_block_kwarg", + "f_kwrest", + "opt_f_block_arg", + "f_block_arg", + "opt_block_args_tail", + "block_param", + "f_arg", + "f_block_optarg", + "f_rest_arg", + "opt_block_param", + "block_param_def", + "opt_bv_decl", + "bv_decls", + "bvar", + "f_bad_arg", + "f_larglist", + "lambda_body", + "@16", + "@17", + "f_args", + "do_block", + "@18", + "@19", + "do_body", + "@20", + "operation3", + "@21", + "@22", + "@23", + "@24", + "@25", + "cases", + "exc_list", + "exc_var", + "numeric", + "string", + "string1", + "string_contents", + "xstring_contents", + "regexp_contents", + "word_list", + "word", + "string_content", + "symbol_list", + "qword_list", + "qsym_list", + "string_dvar", + "@26", + "@27", + "args_tail", + "@28", + "f_kwarg", + "opt_args_tail", + "f_optarg", + "f_arg_asgn", + "f_arg_item", + "f_label", + "f_kw", + "f_block_kw", + "kwrest_mark", + "f_opt", + "f_block_opt", + "restarg_mark", + "blkarg_mark", + "assoc" ] + +Racc_debug_parser = false + +##### State transition tables end ##### + +# reduce 0 omitted + +# reduce 1 omitted + +def _reduce_2(val, _values, result) + result = @builder.compstmt(val[0]) + + result +end + +def _reduce_3(val, _values, result) + result = [] + + result +end + +def _reduce_4(val, _values, result) + result = [ val[0] ] + + result +end + +def _reduce_5(val, _values, result) + result = val[0] << val[2] + + result +end + +def _reduce_6(val, _values, result) + result = [ val[1] ] + + result +end + +# reduce 7 omitted + +def _reduce_8(val, _values, result) + result = @builder.preexe(val[0], *val[1]) + + result +end + +def _reduce_9(val, _values, result) + result = val + + result +end + +def _reduce_10(val, _values, result) + rescue_bodies = val[1] + else_t, else_ = val[2] + ensure_t, ensure_ = val[3] + + if rescue_bodies.empty? && !else_t.nil? + diagnostic :warning, :useless_else, nil, else_t + end + + result = @builder.begin_body(val[0], + rescue_bodies, + else_t, else_, + ensure_t, ensure_) + + result +end + +def _reduce_11(val, _values, result) + result = @builder.compstmt(val[0]) + + result +end + +def _reduce_12(val, _values, result) + result = [] + + result +end + +def _reduce_13(val, _values, result) + result = [ val[0] ] + + result +end + +def _reduce_14(val, _values, result) + result = val[0] << val[2] + + result +end + +def _reduce_15(val, _values, result) + result = [ val[1] ] + + result +end + +# reduce 16 omitted + +def _reduce_17(val, _values, result) + diagnostic :error, :begin_in_method, nil, val[0] + + result +end + +def _reduce_18(val, _values, result) + @lexer.state = :expr_fname + + result +end + +def _reduce_19(val, _values, result) + result = @builder.alias(val[0], val[1], val[3]) + + result +end + +def _reduce_20(val, _values, result) + result = @builder.alias(val[0], + @builder.gvar(val[1]), + @builder.gvar(val[2])) + + result +end + +def _reduce_21(val, _values, result) + result = @builder.alias(val[0], + @builder.gvar(val[1]), + @builder.back_ref(val[2])) + + result +end + +def _reduce_22(val, _values, result) + diagnostic :error, :nth_ref_alias, nil, val[2] + + result +end + +def _reduce_23(val, _values, result) + result = @builder.undef_method(val[0], val[1]) + + result +end + +def _reduce_24(val, _values, result) + result = @builder.condition_mod(val[0], nil, + val[1], val[2]) + + result +end + +def _reduce_25(val, _values, result) + result = @builder.condition_mod(nil, val[0], + val[1], val[2]) + + result +end + +def _reduce_26(val, _values, result) + result = @builder.loop_mod(:while, val[0], val[1], val[2]) + + result +end + +def _reduce_27(val, _values, result) + result = @builder.loop_mod(:until, val[0], val[1], val[2]) + + result +end + +def _reduce_28(val, _values, result) + rescue_body = @builder.rescue_body(val[1], + nil, nil, nil, + nil, val[2]) + + result = @builder.begin_body(val[0], [ rescue_body ]) + + result +end + +def _reduce_29(val, _values, result) + result = @builder.postexe(val[0], val[1], val[2], val[3]) + + result +end + +# reduce 30 omitted + +def _reduce_31(val, _values, result) + result = @builder.multi_assign(val[0], val[1], val[2]) + + result +end + +def _reduce_32(val, _values, result) + result = @builder.assign(val[0], val[1], + @builder.array(nil, val[2], nil)) + + result +end + +def _reduce_33(val, _values, result) + result = @builder.multi_assign(val[0], val[1], val[2]) + + result +end + +# reduce 34 omitted + +def _reduce_35(val, _values, result) + result = @builder.assign(val[0], val[1], val[2]) + + result +end + +def _reduce_36(val, _values, result) + result = @builder.op_assign(val[0], val[1], val[2]) + + result +end + +def _reduce_37(val, _values, result) + result = @builder.op_assign( + @builder.index( + val[0], val[1], val[2], val[3]), + val[4], val[5]) + + result +end + +def _reduce_38(val, _values, result) + result = @builder.op_assign( + @builder.call_method( + val[0], val[1], val[2]), + val[3], val[4]) + + result +end + +def _reduce_39(val, _values, result) + result = @builder.op_assign( + @builder.call_method( + val[0], val[1], val[2]), + val[3], val[4]) + + result +end + +def _reduce_40(val, _values, result) + const = @builder.const_op_assignable( + @builder.const_fetch(val[0], val[1], val[2])) + result = @builder.op_assign(const, val[3], val[4]) + + result +end + +def _reduce_41(val, _values, result) + result = @builder.op_assign( + @builder.call_method( + val[0], val[1], val[2]), + val[3], val[4]) + + result +end + +def _reduce_42(val, _values, result) + @builder.op_assign(val[0], val[1], val[2]) + + result +end + +# reduce 43 omitted + +def _reduce_44(val, _values, result) + rescue_body = @builder.rescue_body(val[1], + nil, nil, nil, + nil, val[2]) + + result = @builder.begin_body(val[0], [ rescue_body ]) + + result +end + +# reduce 45 omitted + +# reduce 46 omitted + +def _reduce_47(val, _values, result) + result = @builder.logical_op(:and, val[0], val[1], val[2]) + + result +end + +def _reduce_48(val, _values, result) + result = @builder.logical_op(:or, val[0], val[1], val[2]) + + result +end + +def _reduce_49(val, _values, result) + result = @builder.not_op(val[0], nil, val[2], nil) + + result +end + +def _reduce_50(val, _values, result) + result = @builder.not_op(val[0], nil, val[1], nil) + + result +end + +# reduce 51 omitted + +# reduce 52 omitted + +def _reduce_53(val, _values, result) + @lexer.cond.push(true) + + result +end + +def _reduce_54(val, _values, result) + @lexer.cond.pop + result = [ val[1], val[2] ] + + result +end + +# reduce 55 omitted + +# reduce 56 omitted + +# reduce 57 omitted + +def _reduce_58(val, _values, result) + result = @builder.call_method(val[0], val[1], val[2], + nil, val[3], nil) + + result +end + +def _reduce_59(val, _values, result) + result = @context.dup + @context.in_block = true + + result +end + +def _reduce_60(val, _values, result) + result = [ val[0], *val[2], val[3] ] + @context.in_block = val[1].in_block + + result +end + +# reduce 61 omitted + +def _reduce_62(val, _values, result) + result = @builder.call_method(nil, nil, val[0], + nil, val[1], nil) + + result +end + +def _reduce_63(val, _values, result) + method_call = @builder.call_method(nil, nil, val[0], + nil, val[1], nil) + + begin_t, args, body, end_t = val[2] + result = @builder.block(method_call, + begin_t, args, body, end_t) + + result +end + +def _reduce_64(val, _values, result) + result = @builder.call_method(val[0], val[1], val[2], + nil, val[3], nil) + + result +end + +def _reduce_65(val, _values, result) + method_call = @builder.call_method(val[0], val[1], val[2], + nil, val[3], nil) + + begin_t, args, body, end_t = val[4] + result = @builder.block(method_call, + begin_t, args, body, end_t) + + result +end + +def _reduce_66(val, _values, result) + result = @builder.call_method(val[0], val[1], val[2], + nil, val[3], nil) + + result +end + +def _reduce_67(val, _values, result) + method_call = @builder.call_method(val[0], val[1], val[2], + nil, val[3], nil) + + begin_t, args, body, end_t = val[4] + result = @builder.block(method_call, + begin_t, args, body, end_t) + + result +end + +def _reduce_68(val, _values, result) + result = @builder.keyword_cmd(:super, val[0], + nil, val[1], nil) + + result +end + +def _reduce_69(val, _values, result) + result = @builder.keyword_cmd(:yield, val[0], + nil, val[1], nil) + + result +end + +def _reduce_70(val, _values, result) + result = @builder.keyword_cmd(:return, val[0], + nil, val[1], nil) + + result +end + +def _reduce_71(val, _values, result) + result = @builder.keyword_cmd(:break, val[0], + nil, val[1], nil) + + result +end + +def _reduce_72(val, _values, result) + result = @builder.keyword_cmd(:next, val[0], + nil, val[1], nil) + + result +end + +def _reduce_73(val, _values, result) + result = @builder.multi_lhs(nil, val[0], nil) + + result +end + +def _reduce_74(val, _values, result) + result = @builder.begin(val[0], val[1], val[2]) + + result +end + +def _reduce_75(val, _values, result) + result = @builder.multi_lhs(nil, val[0], nil) + + result +end + +def _reduce_76(val, _values, result) + result = @builder.multi_lhs(val[0], val[1], val[2]) + + result +end + +# reduce 77 omitted + +def _reduce_78(val, _values, result) + result = val[0]. + push(val[1]) + + result +end + +def _reduce_79(val, _values, result) + result = val[0]. + push(@builder.splat(val[1], val[2])) + + result +end + +def _reduce_80(val, _values, result) + result = val[0]. + push(@builder.splat(val[1], val[2])). + concat(val[4]) + + result +end + +def _reduce_81(val, _values, result) + result = val[0]. + push(@builder.splat(val[1])) + + result +end + +def _reduce_82(val, _values, result) + result = val[0]. + push(@builder.splat(val[1])). + concat(val[3]) + + result +end + +def _reduce_83(val, _values, result) + result = [ @builder.splat(val[0], val[1]) ] + + result +end + +def _reduce_84(val, _values, result) + result = [ @builder.splat(val[0], val[1]), + *val[3] ] + + result +end + +def _reduce_85(val, _values, result) + result = [ @builder.splat(val[0]) ] + + result +end + +def _reduce_86(val, _values, result) + result = [ @builder.splat(val[0]), + *val[2] ] + + result +end + +# reduce 87 omitted + +def _reduce_88(val, _values, result) + result = @builder.begin(val[0], val[1], val[2]) + + result +end + +def _reduce_89(val, _values, result) + result = [ val[0] ] + + result +end + +def _reduce_90(val, _values, result) + result = val[0] << val[1] + + result +end + +def _reduce_91(val, _values, result) + result = [ val[0] ] + + result +end + +def _reduce_92(val, _values, result) + result = val[0] << val[2] + + result +end + +def _reduce_93(val, _values, result) + result = @builder.assignable(val[0]) + + result +end + +def _reduce_94(val, _values, result) + result = @builder.assignable(val[0]) + + result +end + +def _reduce_95(val, _values, result) + result = @builder.index_asgn(val[0], val[1], val[2], val[3]) + + result +end + +def _reduce_96(val, _values, result) + result = @builder.attr_asgn(val[0], val[1], val[2]) + + result +end + +def _reduce_97(val, _values, result) + result = @builder.attr_asgn(val[0], val[1], val[2]) + + result +end + +def _reduce_98(val, _values, result) + result = @builder.attr_asgn(val[0], val[1], val[2]) + + result +end + +def _reduce_99(val, _values, result) + result = @builder.assignable( + @builder.const_fetch(val[0], val[1], val[2])) + + result +end + +def _reduce_100(val, _values, result) + result = @builder.assignable( + @builder.const_global(val[0], val[1])) + + result +end + +def _reduce_101(val, _values, result) + result = @builder.assignable(val[0]) + + result +end + +def _reduce_102(val, _values, result) + result = @builder.assignable(val[0]) + + result +end + +def _reduce_103(val, _values, result) + result = @builder.assignable(val[0]) + + result +end + +def _reduce_104(val, _values, result) + result = @builder.index_asgn(val[0], val[1], val[2], val[3]) + + result +end + +def _reduce_105(val, _values, result) + result = @builder.attr_asgn(val[0], val[1], val[2]) + + result +end + +def _reduce_106(val, _values, result) + result = @builder.attr_asgn(val[0], val[1], val[2]) + + result +end + +def _reduce_107(val, _values, result) + result = @builder.attr_asgn(val[0], val[1], val[2]) + + result +end + +def _reduce_108(val, _values, result) + result = @builder.assignable( + @builder.const_fetch(val[0], val[1], val[2])) + + result +end + +def _reduce_109(val, _values, result) + result = @builder.assignable( + @builder.const_global(val[0], val[1])) + + result +end + +def _reduce_110(val, _values, result) + result = @builder.assignable(val[0]) + + result +end + +def _reduce_111(val, _values, result) + diagnostic :error, :module_name_const, nil, val[0] + + result +end + +# reduce 112 omitted + +def _reduce_113(val, _values, result) + result = @builder.const_global(val[0], val[1]) + + result +end + +def _reduce_114(val, _values, result) + result = @builder.const(val[0]) + + result +end + +def _reduce_115(val, _values, result) + result = @builder.const_fetch(val[0], val[1], val[2]) + + result +end + +# reduce 116 omitted + +# reduce 117 omitted + +# reduce 118 omitted + +# reduce 119 omitted + +# reduce 120 omitted + +def _reduce_121(val, _values, result) + result = @builder.symbol_internal(val[0]) + + result +end + +# reduce 122 omitted + +# reduce 123 omitted + +# reduce 124 omitted + +def _reduce_125(val, _values, result) + result = [ val[0] ] + + result +end + +def _reduce_126(val, _values, result) + @lexer.state = :expr_fname + + result +end + +def _reduce_127(val, _values, result) + result = val[0] << val[3] + + result +end + +# reduce 128 omitted + +# reduce 129 omitted + +# reduce 130 omitted + +# reduce 131 omitted + +# reduce 132 omitted + +# reduce 133 omitted + +# reduce 134 omitted + +# reduce 135 omitted + +# reduce 136 omitted + +# reduce 137 omitted + +# reduce 138 omitted + +# reduce 139 omitted + +# reduce 140 omitted + +# reduce 141 omitted + +# reduce 142 omitted + +# reduce 143 omitted + +# reduce 144 omitted + +# reduce 145 omitted + +# reduce 146 omitted + +# reduce 147 omitted + +# reduce 148 omitted + +# reduce 149 omitted + +# reduce 150 omitted + +# reduce 151 omitted + +# reduce 152 omitted + +# reduce 153 omitted + +# reduce 154 omitted + +# reduce 155 omitted + +# reduce 156 omitted + +# reduce 157 omitted + +# reduce 158 omitted + +# reduce 159 omitted + +# reduce 160 omitted + +# reduce 161 omitted + +# reduce 162 omitted + +# reduce 163 omitted + +# reduce 164 omitted + +# reduce 165 omitted + +# reduce 166 omitted + +# reduce 167 omitted + +# reduce 168 omitted + +# reduce 169 omitted + +# reduce 170 omitted + +# reduce 171 omitted + +# reduce 172 omitted + +# reduce 173 omitted + +# reduce 174 omitted + +# reduce 175 omitted + +# reduce 176 omitted + +# reduce 177 omitted + +# reduce 178 omitted + +# reduce 179 omitted + +# reduce 180 omitted + +# reduce 181 omitted + +# reduce 182 omitted + +# reduce 183 omitted + +# reduce 184 omitted + +# reduce 185 omitted + +# reduce 186 omitted + +# reduce 187 omitted + +# reduce 188 omitted + +# reduce 189 omitted + +# reduce 190 omitted + +# reduce 191 omitted + +# reduce 192 omitted + +# reduce 193 omitted + +# reduce 194 omitted + +# reduce 195 omitted + +# reduce 196 omitted + +# reduce 197 omitted + +# reduce 198 omitted + +def _reduce_199(val, _values, result) + result = @builder.assign(val[0], val[1], val[2]) + + result +end + +def _reduce_200(val, _values, result) + result = @builder.op_assign(val[0], val[1], val[2]) + + result +end + +def _reduce_201(val, _values, result) + result = @builder.op_assign( + @builder.index( + val[0], val[1], val[2], val[3]), + val[4], val[5]) + + result +end + +def _reduce_202(val, _values, result) + result = @builder.op_assign( + @builder.call_method( + val[0], val[1], val[2]), + val[3], val[4]) + + result +end + +def _reduce_203(val, _values, result) + result = @builder.op_assign( + @builder.call_method( + val[0], val[1], val[2]), + val[3], val[4]) + + result +end + +def _reduce_204(val, _values, result) + result = @builder.op_assign( + @builder.call_method( + val[0], val[1], val[2]), + val[3], val[4]) + + result +end + +def _reduce_205(val, _values, result) + const = @builder.const_op_assignable( + @builder.const_fetch(val[0], val[1], val[2])) + result = @builder.op_assign(const, val[3], val[4]) + + result +end + +def _reduce_206(val, _values, result) + const = @builder.const_op_assignable( + @builder.const_global(val[0], val[1])) + result = @builder.op_assign(const, val[2], val[3]) + + result +end + +def _reduce_207(val, _values, result) + result = @builder.op_assign(val[0], val[1], val[2]) + + result +end + +def _reduce_208(val, _values, result) + result = @builder.range_inclusive(val[0], val[1], val[2]) + + result +end + +def _reduce_209(val, _values, result) + result = @builder.range_exclusive(val[0], val[1], val[2]) + + result +end + +def _reduce_210(val, _values, result) + result = @builder.binary_op(val[0], val[1], val[2]) + + result +end + +def _reduce_211(val, _values, result) + result = @builder.binary_op(val[0], val[1], val[2]) + + result +end + +def _reduce_212(val, _values, result) + result = @builder.binary_op(val[0], val[1], val[2]) + + result +end + +def _reduce_213(val, _values, result) + result = @builder.binary_op(val[0], val[1], val[2]) + + result +end + +def _reduce_214(val, _values, result) + result = @builder.binary_op(val[0], val[1], val[2]) + + result +end + +def _reduce_215(val, _values, result) + result = @builder.binary_op(val[0], val[1], val[2]) + + result +end + +def _reduce_216(val, _values, result) + result = @builder.unary_op(val[0], + @builder.binary_op( + val[1], val[2], val[3])) + + result +end + +def _reduce_217(val, _values, result) + result = @builder.unary_op(val[0], val[1]) + + result +end + +def _reduce_218(val, _values, result) + result = @builder.unary_op(val[0], val[1]) + + result +end + +def _reduce_219(val, _values, result) + result = @builder.binary_op(val[0], val[1], val[2]) + + result +end + +def _reduce_220(val, _values, result) + result = @builder.binary_op(val[0], val[1], val[2]) + + result +end + +def _reduce_221(val, _values, result) + result = @builder.binary_op(val[0], val[1], val[2]) + + result +end + +def _reduce_222(val, _values, result) + result = @builder.binary_op(val[0], val[1], val[2]) + + result +end + +# reduce 223 omitted + +def _reduce_224(val, _values, result) + result = @builder.binary_op(val[0], val[1], val[2]) + + result +end + +def _reduce_225(val, _values, result) + result = @builder.binary_op(val[0], val[1], val[2]) + + result +end + +def _reduce_226(val, _values, result) + result = @builder.binary_op(val[0], val[1], val[2]) + + result +end + +def _reduce_227(val, _values, result) + result = @builder.match_op(val[0], val[1], val[2]) + + result +end + +def _reduce_228(val, _values, result) + result = @builder.binary_op(val[0], val[1], val[2]) + + result +end + +def _reduce_229(val, _values, result) + result = @builder.not_op(val[0], nil, val[1], nil) + + result +end + +def _reduce_230(val, _values, result) + result = @builder.unary_op(val[0], val[1]) + + result +end + +def _reduce_231(val, _values, result) + result = @builder.binary_op(val[0], val[1], val[2]) + + result +end + +def _reduce_232(val, _values, result) + result = @builder.binary_op(val[0], val[1], val[2]) + + result +end + +def _reduce_233(val, _values, result) + result = @builder.logical_op(:and, val[0], val[1], val[2]) + + result +end + +def _reduce_234(val, _values, result) + result = @builder.logical_op(:or, val[0], val[1], val[2]) + + result +end + +def _reduce_235(val, _values, result) + result = @builder.keyword_cmd(:defined?, val[0], nil, [ val[2] ], nil) + + result +end + +def _reduce_236(val, _values, result) + result = @builder.ternary(val[0], val[1], + val[2], val[4], val[5]) + + result +end + +# reduce 237 omitted + +# reduce 238 omitted + +# reduce 239 omitted + +# reduce 240 omitted + +# reduce 241 omitted + +def _reduce_242(val, _values, result) + result = @builder.binary_op(val[0], val[1], val[2]) + + result +end + +def _reduce_243(val, _values, result) + result = @builder.binary_op(val[0], val[1], val[2]) + + result +end + +# reduce 244 omitted + +# reduce 245 omitted + +# reduce 246 omitted + +def _reduce_247(val, _values, result) + result = val[0] << @builder.associate(nil, val[2], nil) + + result +end + +def _reduce_248(val, _values, result) + result = [ @builder.associate(nil, val[0], nil) ] + + result +end + +# reduce 249 omitted + +def _reduce_250(val, _values, result) + rescue_body = @builder.rescue_body(val[1], + nil, nil, nil, + nil, val[2]) + + result = @builder.begin_body(val[0], [ rescue_body ]) + + result +end + +def _reduce_251(val, _values, result) + result = val + + result +end + +def _reduce_252(val, _values, result) + result = [ nil, [], nil ] + + result +end + +# reduce 253 omitted + +def _reduce_254(val, _values, result) + result = [] + + result +end + +# reduce 255 omitted + +# reduce 256 omitted + +def _reduce_257(val, _values, result) + result = val[0] << @builder.associate(nil, val[2], nil) + + result +end + +def _reduce_258(val, _values, result) + result = [ @builder.associate(nil, val[0], nil) ] + + result +end + +def _reduce_259(val, _values, result) + result = [ val[0] ] + + result +end + +def _reduce_260(val, _values, result) + result = val[0].concat(val[1]) + + result +end + +def _reduce_261(val, _values, result) + result = [ @builder.associate(nil, val[0], nil) ] + result.concat(val[1]) + + result +end + +def _reduce_262(val, _values, result) + assocs = @builder.associate(nil, val[2], nil) + result = val[0] << assocs + result.concat(val[3]) + + result +end + +def _reduce_263(val, _values, result) + result = [ val[0] ] + + result +end + +def _reduce_264(val, _values, result) + # When branch gets invoked by RACC's lookahead + # and command args start with '[' or '(' + # we need to put `true` to the cmdarg stack + # **before** `false` pushed by lexer + # m [], n + # ^ + # Right here we have cmdarg [...0] because + # lexer pushed it on '[' + # We need to modify cmdarg stack to [...10] + # + # For all other cases (like `m n` or `m n, []`) we simply put 1 to the stack + # and later lexer pushes corresponding bits on top of it. + last_token = @last_token[0] + lookahead = last_token == :tLBRACK || last_token == :tLPAREN_ARG + + if lookahead + top = @lexer.cmdarg.pop + @lexer.cmdarg.push(true) + @lexer.cmdarg.push(top) + else + @lexer.cmdarg.push(true) + end + + result +end + +def _reduce_265(val, _values, result) + # call_args can be followed by tLBRACE_ARG (that does cmdarg.push(0) in the lexer) + # but the push must be done after cmdarg.pop() in the parser. + # So this code does cmdarg.pop() to pop 0 pushed by tLBRACE_ARG, + # cmdarg.pop() to pop 1 pushed by command_args, + # and cmdarg.push(0) to restore back the flag set by tLBRACE_ARG. + last_token = @last_token[0] + lookahead = last_token == :tLBRACE_ARG + if lookahead + top = @lexer.cmdarg.pop + @lexer.cmdarg.pop + @lexer.cmdarg.push(top) + else + @lexer.cmdarg.pop + end + + result = val[1] + + result +end + +def _reduce_266(val, _values, result) + result = @builder.block_pass(val[0], val[1]) + + result +end + +def _reduce_267(val, _values, result) + result = [ val[1] ] + + result +end + +def _reduce_268(val, _values, result) + result = [] + + result +end + +def _reduce_269(val, _values, result) + result = [ val[0] ] + + result +end + +def _reduce_270(val, _values, result) + result = [ @builder.splat(val[0], val[1]) ] + + result +end + +def _reduce_271(val, _values, result) + result = val[0] << val[2] + + result +end + +def _reduce_272(val, _values, result) + result = val[0] << @builder.splat(val[2], val[3]) + + result +end + +def _reduce_273(val, _values, result) + result = @builder.array(nil, val[0], nil) + + result +end + +# reduce 274 omitted + +def _reduce_275(val, _values, result) + result = val[0] << val[2] + + result +end + +def _reduce_276(val, _values, result) + result = val[0] << @builder.splat(val[2], val[3]) + + result +end + +def _reduce_277(val, _values, result) + result = [ @builder.splat(val[0], val[1]) ] + + result +end + +# reduce 278 omitted + +# reduce 279 omitted + +# reduce 280 omitted + +# reduce 281 omitted + +# reduce 282 omitted + +# reduce 283 omitted + +# reduce 284 omitted + +# reduce 285 omitted + +# reduce 286 omitted + +# reduce 287 omitted + +def _reduce_288(val, _values, result) + result = @builder.call_method(nil, nil, val[0]) + + result +end + +def _reduce_289(val, _values, result) + @lexer.cmdarg.push(false) + + result +end + +def _reduce_290(val, _values, result) + @lexer.cmdarg.pop + + result = @builder.begin_keyword(val[0], val[2], val[3]) + + result +end + +def _reduce_291(val, _values, result) + @lexer.state = :expr_endarg + + result +end + +def _reduce_292(val, _values, result) + result = @builder.begin(val[0], val[1], val[3]) + + result +end + +def _reduce_293(val, _values, result) + @lexer.state = :expr_endarg + + result +end + +def _reduce_294(val, _values, result) + result = @builder.begin(val[0], nil, val[3]) + + result +end + +def _reduce_295(val, _values, result) + result = @builder.begin(val[0], val[1], val[2]) + + result +end + +def _reduce_296(val, _values, result) + result = @builder.const_fetch(val[0], val[1], val[2]) + + result +end + +def _reduce_297(val, _values, result) + result = @builder.const_global(val[0], val[1]) + + result +end + +def _reduce_298(val, _values, result) + result = @builder.array(val[0], val[1], val[2]) + + result +end + +def _reduce_299(val, _values, result) + result = @builder.associate(val[0], val[1], val[2]) + + result +end + +def _reduce_300(val, _values, result) + result = @builder.keyword_cmd(:return, val[0]) + + result +end + +def _reduce_301(val, _values, result) + result = @builder.keyword_cmd(:yield, val[0], val[1], val[2], val[3]) + + result +end + +def _reduce_302(val, _values, result) + result = @builder.keyword_cmd(:yield, val[0], val[1], [], val[2]) + + result +end + +def _reduce_303(val, _values, result) + result = @builder.keyword_cmd(:yield, val[0]) + + result +end + +def _reduce_304(val, _values, result) + result = @builder.keyword_cmd(:defined?, val[0], + val[2], [ val[3] ], val[4]) + + result +end + +def _reduce_305(val, _values, result) + result = @builder.not_op(val[0], val[1], val[2], val[3]) + + result +end + +def _reduce_306(val, _values, result) + result = @builder.not_op(val[0], val[1], nil, val[2]) + + result +end + +def _reduce_307(val, _values, result) + method_call = @builder.call_method(nil, nil, val[0]) + + begin_t, args, body, end_t = val[1] + result = @builder.block(method_call, + begin_t, args, body, end_t) + + result +end + +# reduce 308 omitted + +def _reduce_309(val, _values, result) + begin_t, args, body, end_t = val[1] + result = @builder.block(val[0], + begin_t, args, body, end_t) + + result +end + +def _reduce_310(val, _values, result) + result = @context.dup + @context.in_lambda = true + + result +end + +def _reduce_311(val, _values, result) + lambda_call = @builder.call_lambda(val[0]) + + args, (begin_t, body, end_t) = val[2] + result = @builder.block(lambda_call, + begin_t, args, body, end_t) + + @context.in_lambda = val[1].in_lambda + + result +end + +def _reduce_312(val, _values, result) + else_t, else_ = val[4] + result = @builder.condition(val[0], val[1], val[2], + val[3], else_t, + else_, val[5]) + + result +end + +def _reduce_313(val, _values, result) + else_t, else_ = val[4] + result = @builder.condition(val[0], val[1], val[2], + else_, else_t, + val[3], val[5]) + + result +end + +def _reduce_314(val, _values, result) + result = @builder.loop(:while, val[0], *val[1], val[2], val[3]) + + result +end + +def _reduce_315(val, _values, result) + result = @builder.loop(:until, val[0], *val[1], val[2], val[3]) + + result +end + +def _reduce_316(val, _values, result) + *when_bodies, (else_t, else_body) = *val[3] + + result = @builder.case(val[0], val[1], + when_bodies, else_t, else_body, + val[4]) + + result +end + +def _reduce_317(val, _values, result) + *when_bodies, (else_t, else_body) = *val[2] + + result = @builder.case(val[0], nil, + when_bodies, else_t, else_body, + val[3]) + + result +end + +def _reduce_318(val, _values, result) + result = @builder.for(val[0], val[1], val[2], *val[3], val[4], val[5]) + + result +end + +def _reduce_319(val, _values, result) + local_push + @context.in_class = true + + result +end + +def _reduce_320(val, _values, result) + k_class, ctx = val[0] + if @context.in_def + diagnostic :error, :class_in_def, nil, k_class + end + + lt_t, superclass = val[2] + result = @builder.def_class(k_class, val[1], + lt_t, superclass, + val[4], val[5]) + + local_pop + @context.in_class = ctx.in_class + + result +end + +def _reduce_321(val, _values, result) + @context.in_def = false + @context.in_class = false + local_push + + result +end + +def _reduce_322(val, _values, result) + k_class, ctx = val[0] + result = @builder.def_sclass(k_class, val[1], val[2], + val[5], val[6]) + + local_pop + @context.in_def = ctx.in_def + @context.in_class = ctx.in_class + + result +end + +def _reduce_323(val, _values, result) + @context.in_class = true + local_push + + result +end + +def _reduce_324(val, _values, result) + k_mod, ctx = val[0] + if @context.in_def + diagnostic :error, :module_in_def, nil, k_mod + end + + result = @builder.def_module(k_mod, val[1], + val[3], val[4]) + + local_pop + @context.in_class = ctx.in_class + + result +end + +def _reduce_325(val, _values, result) + local_push + result = context.dup + @context.in_def = true + + result +end + +def _reduce_326(val, _values, result) + result = @builder.def_method(val[0], val[1], + val[3], val[4], val[5]) + + local_pop + @context.in_def = val[2].in_def + + result +end + +def _reduce_327(val, _values, result) + @lexer.state = :expr_fname + + result +end + +def _reduce_328(val, _values, result) + local_push + result = context.dup + @context.in_def = true + + result +end + +def _reduce_329(val, _values, result) + result = @builder.def_singleton(val[0], val[1], val[2], + val[4], val[6], val[7], val[8]) + + local_pop + @context.in_def = val[5].in_def + + result +end + +def _reduce_330(val, _values, result) + result = @builder.keyword_cmd(:break, val[0]) + + result +end + +def _reduce_331(val, _values, result) + result = @builder.keyword_cmd(:next, val[0]) + + result +end + +def _reduce_332(val, _values, result) + result = @builder.keyword_cmd(:redo, val[0]) + + result +end + +def _reduce_333(val, _values, result) + result = @builder.keyword_cmd(:retry, val[0]) + + result +end + +# reduce 334 omitted + +def _reduce_335(val, _values, result) + result = [ val[0], @context.dup ] + + result +end + +def _reduce_336(val, _values, result) + result = [ val[0], @context.dup ] + + result +end + +def _reduce_337(val, _values, result) + if @context.in_class && !@context.in_def && !(context.in_block || context.in_lambda) + diagnostic :error, :invalid_return, nil, val[0] + end + + result +end + +# reduce 338 omitted + +# reduce 339 omitted + +def _reduce_340(val, _values, result) + result = val[1] + + result +end + +# reduce 341 omitted + +# reduce 342 omitted + +# reduce 343 omitted + +def _reduce_344(val, _values, result) + else_t, else_ = val[4] + result = [ val[0], + @builder.condition(val[0], val[1], val[2], + val[3], else_t, + else_, nil), + ] + + result +end + +# reduce 345 omitted + +def _reduce_346(val, _values, result) + result = val + + result +end + +# reduce 347 omitted + +# reduce 348 omitted + +def _reduce_349(val, _values, result) + result = @builder.arg(val[0]) + + result +end + +def _reduce_350(val, _values, result) + result = @builder.multi_lhs(val[0], val[1], val[2]) + + result +end + +def _reduce_351(val, _values, result) + result = [ val[0] ] + + result +end + +def _reduce_352(val, _values, result) + result = val[0] << val[2] + + result +end + +# reduce 353 omitted + +def _reduce_354(val, _values, result) + result = val[0]. + push(@builder.restarg(val[2], val[3])) + + result +end + +def _reduce_355(val, _values, result) + result = val[0]. + push(@builder.restarg(val[2], val[3])). + concat(val[5]) + + result +end + +def _reduce_356(val, _values, result) + result = val[0]. + push(@builder.restarg(val[2])) + + result +end + +def _reduce_357(val, _values, result) + result = val[0]. + push(@builder.restarg(val[2])). + concat(val[4]) + + result +end + +def _reduce_358(val, _values, result) + result = [ @builder.restarg(val[0], val[1]) ] + + result +end + +def _reduce_359(val, _values, result) + result = [ @builder.restarg(val[0], val[1]), + *val[3] ] + + result +end + +def _reduce_360(val, _values, result) + result = [ @builder.restarg(val[0]) ] + + result +end + +def _reduce_361(val, _values, result) + result = [ @builder.restarg(val[0]), + *val[2] ] + + result +end + +def _reduce_362(val, _values, result) + result = val[0].concat(val[2]).concat(val[3]) + + result +end + +def _reduce_363(val, _values, result) + result = val[0].concat(val[1]) + + result +end + +def _reduce_364(val, _values, result) + result = val[0].concat(val[1]) + + result +end + +def _reduce_365(val, _values, result) + result = [ val[0] ] + + result +end + +def _reduce_366(val, _values, result) + result = val[1] + + result +end + +def _reduce_367(val, _values, result) + result = [] + + result +end + +def _reduce_368(val, _values, result) + result = val[0]. + concat(val[2]). + concat(val[4]). + concat(val[5]) + + result +end + +def _reduce_369(val, _values, result) + result = val[0]. + concat(val[2]). + concat(val[4]). + concat(val[6]). + concat(val[7]) + + result +end + +def _reduce_370(val, _values, result) + result = val[0]. + concat(val[2]). + concat(val[3]) + + result +end + +def _reduce_371(val, _values, result) + result = val[0]. + concat(val[2]). + concat(val[4]). + concat(val[5]) + + result +end + +def _reduce_372(val, _values, result) + result = val[0]. + concat(val[2]). + concat(val[3]) + + result +end + +# reduce 373 omitted + +def _reduce_374(val, _values, result) + result = val[0]. + concat(val[2]). + concat(val[4]). + concat(val[5]) + + result +end + +def _reduce_375(val, _values, result) + if val[1].empty? && val[0].size == 1 + result = [@builder.procarg0(val[0][0])] + else + result = val[0].concat(val[1]) + end + + result +end + +def _reduce_376(val, _values, result) + result = val[0]. + concat(val[2]). + concat(val[3]) + + result +end + +def _reduce_377(val, _values, result) + result = val[0]. + concat(val[2]). + concat(val[4]). + concat(val[5]) + + result +end + +def _reduce_378(val, _values, result) + result = val[0]. + concat(val[1]) + + result +end + +def _reduce_379(val, _values, result) + result = val[0]. + concat(val[2]). + concat(val[3]) + + result +end + +def _reduce_380(val, _values, result) + result = val[0]. + concat(val[1]) + + result +end + +def _reduce_381(val, _values, result) + result = val[0]. + concat(val[2]). + concat(val[3]) + + result +end + +# reduce 382 omitted + +def _reduce_383(val, _values, result) + result = @builder.args(nil, [], nil) + + result +end + +def _reduce_384(val, _values, result) + @lexer.state = :expr_value + + result +end + +def _reduce_385(val, _values, result) + result = @builder.args(val[0], val[1], val[2]) + + result +end + +def _reduce_386(val, _values, result) + result = @builder.args(val[0], [], val[0]) + + result +end + +def _reduce_387(val, _values, result) + result = @builder.args(val[0], val[1].concat(val[2]), val[3]) + + result +end + +def _reduce_388(val, _values, result) + result = [] + + result +end + +def _reduce_389(val, _values, result) + result = val[2] + + result +end + +def _reduce_390(val, _values, result) + result = [ val[0] ] + + result +end + +def _reduce_391(val, _values, result) + result = val[0] << val[2] + + result +end + +def _reduce_392(val, _values, result) + @static_env.declare val[0][0] + result = @builder.shadowarg(val[0]) + + result +end + +# reduce 393 omitted + +def _reduce_394(val, _values, result) + @static_env.extend_dynamic + + result +end + +def _reduce_395(val, _values, result) + @lexer.cmdarg.push(false) + + result +end + +def _reduce_396(val, _values, result) + @lexer.cmdarg.pop + + result = [ val[1], val[3] ] + + @static_env.unextend + + result +end + +def _reduce_397(val, _values, result) + result = @builder.args(val[0], val[1].concat(val[2]), val[3]) + + result +end + +def _reduce_398(val, _values, result) + result = @builder.args(nil, val[0], nil) + + result +end + +def _reduce_399(val, _values, result) + result = @context.dup + @context.in_lambda = true + + result +end + +def _reduce_400(val, _values, result) + result = [ val[0], val[2], val[3] ] + @context.in_lambda = val[1].in_lambda + + result +end + +def _reduce_401(val, _values, result) + result = @context.dup + @context.in_lambda = true + + result +end + +def _reduce_402(val, _values, result) + result = [ val[0], val[2], val[3] ] + @context.in_lambda = val[1].in_lambda + + result +end + +def _reduce_403(val, _values, result) + result = @context.dup + @context.in_block = true + + result +end + +def _reduce_404(val, _values, result) + result = [ val[0], *val[2], val[3] ] + @context.in_block = val[1].in_block + + result +end + +def _reduce_405(val, _values, result) + begin_t, block_args, body, end_t = val[1] + result = @builder.block(val[0], + begin_t, block_args, body, end_t) + + result +end + +def _reduce_406(val, _values, result) + lparen_t, args, rparen_t = val[3] + result = @builder.call_method(val[0], val[1], val[2], + lparen_t, args, rparen_t) + + result +end + +def _reduce_407(val, _values, result) + lparen_t, args, rparen_t = val[3] + method_call = @builder.call_method(val[0], val[1], val[2], + lparen_t, args, rparen_t) + + begin_t, args, body, end_t = val[4] + result = @builder.block(method_call, + begin_t, args, body, end_t) + + result +end + +def _reduce_408(val, _values, result) + method_call = @builder.call_method(val[0], val[1], val[2], + nil, val[3], nil) + + begin_t, args, body, end_t = val[4] + result = @builder.block(method_call, + begin_t, args, body, end_t) + + result +end + +def _reduce_409(val, _values, result) + lparen_t, args, rparen_t = val[1] + result = @builder.call_method(nil, nil, val[0], + lparen_t, args, rparen_t) + + result +end + +def _reduce_410(val, _values, result) + lparen_t, args, rparen_t = val[3] + result = @builder.call_method(val[0], val[1], val[2], + lparen_t, args, rparen_t) + + result +end + +def _reduce_411(val, _values, result) + lparen_t, args, rparen_t = val[3] + result = @builder.call_method(val[0], val[1], val[2], + lparen_t, args, rparen_t) + + result +end + +def _reduce_412(val, _values, result) + result = @builder.call_method(val[0], val[1], val[2]) + + result +end + +def _reduce_413(val, _values, result) + lparen_t, args, rparen_t = val[2] + result = @builder.call_method(val[0], val[1], nil, + lparen_t, args, rparen_t) + + result +end + +def _reduce_414(val, _values, result) + lparen_t, args, rparen_t = val[2] + result = @builder.call_method(val[0], val[1], nil, + lparen_t, args, rparen_t) + + result +end + +def _reduce_415(val, _values, result) + lparen_t, args, rparen_t = val[1] + result = @builder.keyword_cmd(:super, val[0], + lparen_t, args, rparen_t) + + result +end + +def _reduce_416(val, _values, result) + result = @builder.keyword_cmd(:zsuper, val[0]) + + result +end + +def _reduce_417(val, _values, result) + result = @builder.index(val[0], val[1], val[2], val[3]) + + result +end + +def _reduce_418(val, _values, result) + result = @context.dup + @context.in_block = true + + result +end + +def _reduce_419(val, _values, result) + result = [ val[0], *val[2], val[3] ] + @context.in_block = val[1].in_block + + result +end + +def _reduce_420(val, _values, result) + result = @context.dup + @context.in_block = true + + result +end + +def _reduce_421(val, _values, result) + result = [ val[0], *val[2], val[3] ] + @context.in_block = val[1].in_block + + result +end + +def _reduce_422(val, _values, result) + @static_env.extend_dynamic + + result +end + +def _reduce_423(val, _values, result) + result = [ val[1], val[2] ] + + @static_env.unextend + + result +end + +def _reduce_424(val, _values, result) + @static_env.extend_dynamic + + result +end + +def _reduce_425(val, _values, result) + @lexer.cmdarg.push(false) + + result +end + +def _reduce_426(val, _values, result) + result = [ val[2], val[3] ] + + @static_env.unextend + @lexer.cmdarg.pop + + result +end + +def _reduce_427(val, _values, result) + result = [ @builder.when(val[0], val[1], val[2], val[3]), + *val[4] ] + + result +end + +def _reduce_428(val, _values, result) + result = [ val[0] ] + + result +end + +# reduce 429 omitted + +def _reduce_430(val, _values, result) + assoc_t, exc_var = val[2] + + if val[1] + exc_list = @builder.array(nil, val[1], nil) + end + + result = [ @builder.rescue_body(val[0], + exc_list, assoc_t, exc_var, + val[3], val[4]), + *val[5] ] + + result +end + +def _reduce_431(val, _values, result) + result = [] + + result +end + +def _reduce_432(val, _values, result) + result = [ val[0] ] + + result +end + +# reduce 433 omitted + +# reduce 434 omitted + +def _reduce_435(val, _values, result) + result = [ val[0], val[1] ] + + result +end + +# reduce 436 omitted + +def _reduce_437(val, _values, result) + result = [ val[0], val[1] ] + + result +end + +# reduce 438 omitted + +# reduce 439 omitted + +# reduce 440 omitted + +# reduce 441 omitted + +def _reduce_442(val, _values, result) + result = @builder.string_compose(nil, val[0], nil) + + result +end + +def _reduce_443(val, _values, result) + result = [ val[0] ] + + result +end + +def _reduce_444(val, _values, result) + result = val[0] << val[1] + + result +end + +def _reduce_445(val, _values, result) + string = @builder.string_compose(val[0], val[1], val[2]) + result = @builder.dedent_string(string, @lexer.dedent_level) + + result +end + +def _reduce_446(val, _values, result) + string = @builder.string(val[0]) + result = @builder.dedent_string(string, @lexer.dedent_level) + + result +end + +def _reduce_447(val, _values, result) + result = @builder.character(val[0]) + + result +end + +def _reduce_448(val, _values, result) + string = @builder.xstring_compose(val[0], val[1], val[2]) + result = @builder.dedent_string(string, @lexer.dedent_level) + + result +end + +def _reduce_449(val, _values, result) + opts = @builder.regexp_options(val[3]) + result = @builder.regexp_compose(val[0], val[1], val[2], opts) + + result +end + +def _reduce_450(val, _values, result) + result = @builder.words_compose(val[0], val[1], val[2]) + + result +end + +def _reduce_451(val, _values, result) + result = [] + + result +end + +def _reduce_452(val, _values, result) + result = val[0] << @builder.word(val[1]) + + result +end + +def _reduce_453(val, _values, result) + result = [ val[0] ] + + result +end + +def _reduce_454(val, _values, result) + result = val[0] << val[1] + + result +end + +def _reduce_455(val, _values, result) + result = @builder.symbols_compose(val[0], val[1], val[2]) + + result +end + +def _reduce_456(val, _values, result) + result = [] + + result +end + +def _reduce_457(val, _values, result) + result = val[0] << @builder.word(val[1]) + + result +end + +def _reduce_458(val, _values, result) + result = @builder.words_compose(val[0], val[1], val[2]) + + result +end + +def _reduce_459(val, _values, result) + result = @builder.symbols_compose(val[0], val[1], val[2]) + + result +end + +def _reduce_460(val, _values, result) + result = [] + + result +end + +def _reduce_461(val, _values, result) + result = val[0] << @builder.string_internal(val[1]) + + result +end + +def _reduce_462(val, _values, result) + result = [] + + result +end + +def _reduce_463(val, _values, result) + result = val[0] << @builder.symbol_internal(val[1]) + + result +end + +def _reduce_464(val, _values, result) + result = [] + + result +end + +def _reduce_465(val, _values, result) + result = val[0] << val[1] + + result +end + +def _reduce_466(val, _values, result) + result = [] + + result +end + +def _reduce_467(val, _values, result) + result = val[0] << val[1] + + result +end + +def _reduce_468(val, _values, result) + result = [] + + result +end + +def _reduce_469(val, _values, result) + result = val[0] << val[1] + + result +end + +def _reduce_470(val, _values, result) + result = @builder.string_internal(val[0]) + + result +end + +def _reduce_471(val, _values, result) + result = val[1] + + result +end + +def _reduce_472(val, _values, result) + @lexer.cmdarg.push(false) + @lexer.cond.push(false) + + result +end + +def _reduce_473(val, _values, result) + @lexer.cmdarg.pop + @lexer.cond.pop + + result = @builder.begin(val[0], val[2], val[3]) + + result +end + +def _reduce_474(val, _values, result) + result = @builder.gvar(val[0]) + + result +end + +def _reduce_475(val, _values, result) + result = @builder.ivar(val[0]) + + result +end + +def _reduce_476(val, _values, result) + result = @builder.cvar(val[0]) + + result +end + +# reduce 477 omitted + +def _reduce_478(val, _values, result) + @lexer.state = :expr_end + result = @builder.symbol(val[0]) + + result +end + +def _reduce_479(val, _values, result) + @lexer.state = :expr_end + result = @builder.symbol_compose(val[0], val[1], val[2]) + + result +end + +def _reduce_480(val, _values, result) + result = val[0] + + result +end + +def _reduce_481(val, _values, result) + if @builder.respond_to? :negate + # AST builder interface compatibility + result = @builder.negate(val[0], val[1]) + else + result = @builder.unary_num(val[0], val[1]) + end + + result +end + +def _reduce_482(val, _values, result) + @lexer.state = :expr_end + result = @builder.integer(val[0]) + + result +end + +def _reduce_483(val, _values, result) + @lexer.state = :expr_end + result = @builder.float(val[0]) + + result +end + +def _reduce_484(val, _values, result) + @lexer.state = :expr_end + result = @builder.rational(val[0]) + + result +end + +def _reduce_485(val, _values, result) + @lexer.state = :expr_end + result = @builder.complex(val[0]) + + result +end + +def _reduce_486(val, _values, result) + result = @builder.ident(val[0]) + + result +end + +def _reduce_487(val, _values, result) + result = @builder.ivar(val[0]) + + result +end + +def _reduce_488(val, _values, result) + result = @builder.gvar(val[0]) + + result +end + +def _reduce_489(val, _values, result) + result = @builder.const(val[0]) + + result +end + +def _reduce_490(val, _values, result) + result = @builder.cvar(val[0]) + + result +end + +def _reduce_491(val, _values, result) + result = @builder.nil(val[0]) + + result +end + +def _reduce_492(val, _values, result) + result = @builder.self(val[0]) + + result +end + +def _reduce_493(val, _values, result) + result = @builder.true(val[0]) + + result +end + +def _reduce_494(val, _values, result) + result = @builder.false(val[0]) + + result +end + +def _reduce_495(val, _values, result) + result = @builder.__FILE__(val[0]) + + result +end + +def _reduce_496(val, _values, result) + result = @builder.__LINE__(val[0]) + + result +end + +def _reduce_497(val, _values, result) + result = @builder.__ENCODING__(val[0]) + + result +end + +def _reduce_498(val, _values, result) + result = @builder.accessible(val[0]) + + result +end + +def _reduce_499(val, _values, result) + result = @builder.accessible(val[0]) + + result +end + +def _reduce_500(val, _values, result) + result = @builder.assignable(val[0]) + + result +end + +def _reduce_501(val, _values, result) + result = @builder.assignable(val[0]) + + result +end + +def _reduce_502(val, _values, result) + result = @builder.nth_ref(val[0]) + + result +end + +def _reduce_503(val, _values, result) + result = @builder.back_ref(val[0]) + + result +end + +def _reduce_504(val, _values, result) + @lexer.state = :expr_value + + result +end + +def _reduce_505(val, _values, result) + result = [ val[0], val[2] ] + + result +end + +def _reduce_506(val, _values, result) + result = nil + + result +end + +def _reduce_507(val, _values, result) + result = @builder.args(val[0], val[1], val[2]) + + @lexer.state = :expr_value + + result +end + +def _reduce_508(val, _values, result) + result = @context.in_kwarg + @context.in_kwarg = true + + result +end + +def _reduce_509(val, _values, result) + @context.in_kwarg = val[0] + result = @builder.args(nil, val[1], nil) + + result +end + +def _reduce_510(val, _values, result) + result = val[0].concat(val[2]).concat(val[3]) + + result +end + +def _reduce_511(val, _values, result) + result = val[0].concat(val[1]) + + result +end + +def _reduce_512(val, _values, result) + result = val[0].concat(val[1]) + + result +end + +def _reduce_513(val, _values, result) + result = [ val[0] ] + + result +end + +def _reduce_514(val, _values, result) + result = val[1] + + result +end + +def _reduce_515(val, _values, result) + result = [] + + result +end + +def _reduce_516(val, _values, result) + result = val[0]. + concat(val[2]). + concat(val[4]). + concat(val[5]) + + result +end + +def _reduce_517(val, _values, result) + result = val[0]. + concat(val[2]). + concat(val[4]). + concat(val[6]). + concat(val[7]) + + result +end + +def _reduce_518(val, _values, result) + result = val[0]. + concat(val[2]). + concat(val[3]) + + result +end + +def _reduce_519(val, _values, result) + result = val[0]. + concat(val[2]). + concat(val[4]). + concat(val[5]) + + result +end + +def _reduce_520(val, _values, result) + result = val[0]. + concat(val[2]). + concat(val[3]) + + result +end + +def _reduce_521(val, _values, result) + result = val[0]. + concat(val[2]). + concat(val[4]). + concat(val[5]) + + result +end + +def _reduce_522(val, _values, result) + result = val[0]. + concat(val[1]) + + result +end + +def _reduce_523(val, _values, result) + result = val[0]. + concat(val[2]). + concat(val[3]) + + result +end + +def _reduce_524(val, _values, result) + result = val[0]. + concat(val[2]). + concat(val[4]). + concat(val[5]) + + result +end + +def _reduce_525(val, _values, result) + result = val[0]. + concat(val[1]) + + result +end + +def _reduce_526(val, _values, result) + result = val[0]. + concat(val[2]). + concat(val[3]) + + result +end + +def _reduce_527(val, _values, result) + result = val[0]. + concat(val[1]) + + result +end + +def _reduce_528(val, _values, result) + result = val[0]. + concat(val[2]). + concat(val[3]) + + result +end + +def _reduce_529(val, _values, result) + result = val[0] + + result +end + +def _reduce_530(val, _values, result) + result = [] + + result +end + +def _reduce_531(val, _values, result) + diagnostic :error, :argument_const, nil, val[0] + + result +end + +def _reduce_532(val, _values, result) + diagnostic :error, :argument_ivar, nil, val[0] + + result +end + +def _reduce_533(val, _values, result) + diagnostic :error, :argument_gvar, nil, val[0] + + result +end + +def _reduce_534(val, _values, result) + diagnostic :error, :argument_cvar, nil, val[0] + + result +end + +# reduce 535 omitted + +def _reduce_536(val, _values, result) + @static_env.declare val[0][0] + + result = val[0] + + result +end + +def _reduce_537(val, _values, result) + result = val[0] + + result +end + +def _reduce_538(val, _values, result) + result = @builder.arg(val[0]) + + result +end + +def _reduce_539(val, _values, result) + result = @builder.multi_lhs(val[0], val[1], val[2]) + + result +end + +def _reduce_540(val, _values, result) + result = [ val[0] ] + + result +end + +def _reduce_541(val, _values, result) + result = val[0] << val[2] + + result +end + +def _reduce_542(val, _values, result) + check_kwarg_name(val[0]) + + @static_env.declare val[0][0] + + result = val[0] + + result +end + +def _reduce_543(val, _values, result) + result = @builder.kwoptarg(val[0], val[1]) + + result +end + +def _reduce_544(val, _values, result) + result = @builder.kwarg(val[0]) + + result +end + +def _reduce_545(val, _values, result) + result = @builder.kwoptarg(val[0], val[1]) + + result +end + +def _reduce_546(val, _values, result) + result = @builder.kwarg(val[0]) + + result +end + +def _reduce_547(val, _values, result) + result = [ val[0] ] + + result +end + +def _reduce_548(val, _values, result) + result = val[0] << val[2] + + result +end + +def _reduce_549(val, _values, result) + result = [ val[0] ] + + result +end + +def _reduce_550(val, _values, result) + result = val[0] << val[2] + + result +end + +# reduce 551 omitted + +# reduce 552 omitted + +def _reduce_553(val, _values, result) + @static_env.declare val[1][0] + + result = [ @builder.kwrestarg(val[0], val[1]) ] + + result +end + +def _reduce_554(val, _values, result) + result = [ @builder.kwrestarg(val[0]) ] + + result +end + +def _reduce_555(val, _values, result) + result = @builder.optarg(val[0], val[1], val[2]) + + result +end + +def _reduce_556(val, _values, result) + result = @builder.optarg(val[0], val[1], val[2]) + + result +end + +def _reduce_557(val, _values, result) + result = [ val[0] ] + + result +end + +def _reduce_558(val, _values, result) + result = val[0] << val[2] + + result +end + +def _reduce_559(val, _values, result) + result = [ val[0] ] + + result +end + +def _reduce_560(val, _values, result) + result = val[0] << val[2] + + result +end + +# reduce 561 omitted + +# reduce 562 omitted + +def _reduce_563(val, _values, result) + @static_env.declare val[1][0] + + result = [ @builder.restarg(val[0], val[1]) ] + + result +end + +def _reduce_564(val, _values, result) + result = [ @builder.restarg(val[0]) ] + + result +end + +# reduce 565 omitted + +# reduce 566 omitted + +def _reduce_567(val, _values, result) + @static_env.declare val[1][0] + + result = @builder.blockarg(val[0], val[1]) + + result +end + +def _reduce_568(val, _values, result) + result = [ val[1] ] + + result +end + +def _reduce_569(val, _values, result) + result = [] + + result +end + +# reduce 570 omitted + +def _reduce_571(val, _values, result) + result = val[1] + + result +end + +def _reduce_572(val, _values, result) + result = [] + + result +end + +# reduce 573 omitted + +def _reduce_574(val, _values, result) + result = [ val[0] ] + + result +end + +def _reduce_575(val, _values, result) + result = val[0] << val[2] + + result +end + +def _reduce_576(val, _values, result) + result = @builder.pair(val[0], val[1], val[2]) + + result +end + +def _reduce_577(val, _values, result) + result = @builder.pair_keyword(val[0], val[1]) + + result +end + +def _reduce_578(val, _values, result) + result = @builder.pair_quoted(val[0], val[1], val[2], val[3]) + + result +end + +def _reduce_579(val, _values, result) + result = @builder.kwsplat(val[0], val[1]) + + result +end + +# reduce 580 omitted + +# reduce 581 omitted + +# reduce 582 omitted + +# reduce 583 omitted + +# reduce 584 omitted + +# reduce 585 omitted + +# reduce 586 omitted + +# reduce 587 omitted + +# reduce 588 omitted + +# reduce 589 omitted + +# reduce 590 omitted + +# reduce 591 omitted + +def _reduce_592(val, _values, result) + result = [:dot, val[0][1]] + + result +end + +def _reduce_593(val, _values, result) + result = [:anddot, val[0][1]] + + result +end + +# reduce 594 omitted + +# reduce 595 omitted + +# reduce 596 omitted + +# reduce 597 omitted + +def _reduce_598(val, _values, result) + result = val[1] + + result +end + +def _reduce_599(val, _values, result) + result = val[1] + + result +end + +# reduce 600 omitted + +# reduce 601 omitted + +# reduce 602 omitted + +def _reduce_603(val, _values, result) + yyerrok + + result +end + +# reduce 604 omitted + +# reduce 605 omitted + +# reduce 606 omitted + +def _reduce_607(val, _values, result) + result = nil + + result +end + +def _reduce_none(val, _values, result) + val[0] +end + + end # class Ruby25 + end # module Parser diff --git a/vendor/bundle/ruby/3.1.0/gems/parser-3.1.2.0/lib/parser/ruby26.rb b/vendor/bundle/ruby/3.1.0/gems/parser-3.1.2.0/lib/parser/ruby26.rb new file mode 100644 index 000000000..c7578d32a --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/parser-3.1.2.0/lib/parser/ruby26.rb @@ -0,0 +1,6721 @@ +# -*- encoding:utf-8; warn-indent:false; frozen_string_literal: true -*- +# +# DO NOT MODIFY!!!! +# This file is automatically generated by Racc 1.4.15 +# from Racc grammer file "". +# + +require 'racc/parser.rb' + + +require 'parser' + +module Parser + class Ruby26 < Parser::Base + + + def version + 26 + end + + def default_encoding + Encoding::UTF_8 + end + + def local_push + @static_env.extend_static + @lexer.cmdarg.push(false) + @lexer.cond.push(false) + end + + def local_pop + @static_env.unextend + @lexer.cmdarg.pop + @lexer.cond.pop + end +##### State transition tables begin ### + +clist = [ +'-590,611,550,215,216,-109,-107,-590,-590,-590,225,550,-590,-590,-590', +'780,-590,277,550,873,246,-88,550,591,780,-590,-590,-590,-590,-102,563', +'-74,986,593,564,-110,-590,-590,-104,-590,-590,-590,-590,-590,-105,-103', +'-107,-109,-110,1028,779,226,243,996,215,216,245,244,-105,779,215,216', +'996,-104,-103,-105,-590,-590,-590,-590,-590,-590,-590,-590,-590,-590', +'-590,-590,-590,-590,118,-108,-590,-590,-590,117,768,-590,550,590,-590', +'-102,-106,-590,-590,996,-590,226,-590,592,-590,114,-590,-590,276,-590', +'-590,-590,-590,-590,-298,-590,-590,-590,-100,-98,706,-298,-298,-298', +'118,-106,941,-298,-298,117,-298,-590,872,118,-590,-590,-590,-590,117', +'-590,118,-590,-93,826,118,117,-590,-106,-101,117,-298,-298,226,-298', +'-298,-298,-298,-298,226,277,-104,-586,-587,-108,-96,-104,-105,-103,-107', +'-109,-110,-105,-103,-107,-109,-110,-95,-94,-96,986,-298,-298,-298,-298', +'-298,-298,-298,-298,-298,-298,-298,-298,-298,-298,277,223,-298,-298', +'-298,221,616,609,-586,-108,-298,-97,270,-298,-108,996,118,-95,-298,-102', +'-298,117,-298,-298,-102,-298,-298,-298,-298,-298,118,-298,-590,-298', +'-587,117,-96,459,753,-590,-590,-590,96,97,610,-590,-590,-298,-590,-106', +'-298,-298,276,-298,-106,-298,-503,-590,-110,215,216,118,-298,-108,272', +'-584,117,277,-590,-590,222,-590,-590,-590,-590,-590,-96,221,-99,-96', +'792,118,557,-95,970,578,117,276,226,-96,-97,96,97,568,-110,-104,215', +'216,-590,-590,-590,-590,-590,-590,-590,-590,-590,-590,-590,-590,-590', +'-590,605,-102,-590,-590,-590,-492,617,-504,98,99,-590,-95,-492,-590', +'-95,-590,578,-584,-590,272,-590,-492,-590,-590,-95,-590,-590,-590,-590', +'-590,222,-590,-590,-590,-98,823,792,580,579,576,-584,118,276,-586,-97', +'272,117,-590,578,601,-590,-590,-590,-97,644,-590,600,98,99,-590,-590', +'-590,-590,-106,-103,-590,-590,-590,-590,683,-492,680,679,678,-590,681', +'845,-590,621,-586,580,579,578,-590,-97,823,792,-97,-590,-590,738,-590', +'-590,-590,-590,-590,118,-97,118,-271,-98,117,-590,117,683,598,680,679', +'678,221,681,595,580,579,576,612,270,246,-590,-590,-590,-590,-590,-590', +'-590,-590,-590,-590,-590,-590,-590,-590,-590,-104,-590,-590,-590,246', +'617,246,-98,246,-590,-98,578,-590,580,579,578,527,-590,984,-590,-98', +'-590,-590,740,-590,-590,-590,-590,-590,-298,-590,-590,-590,766,226,753', +'-298,-298,-298,-107,226,222,-298,-298,540,-298,-590,542,226,-590,-590', +'1000,-590,891,-590,540,540,-583,542,539,767,-590,-106,-100,226,-298', +'-298,223,-298,-298,-298,-298,-298,-109,-88,580,579,594,221,580,579,585', +'-95,540,-496,566,542,647,527,226,-105,-496,-104,533,568,-298,-298,-298', +'-298,-298,-298,-298,-298,-298,-298,-298,-298,-298,-298,-489,658,-298', +'-298,-298,-101,616,-489,-107,663,-298,578,-583,-298,578,-110,-489,578', +'-298,664,-298,226,-298,-298,666,-298,-298,-298,-298,-298,-489,-298,702', +'-298,222,-583,-109,-489,-489,-489,-496,707,-489,-489,-489,-299,-489', +'-298,263,264,-298,-298,-299,-99,-489,-298,-489,-489,-489,215,216,-299', +'-298,-108,708,-489,-489,-489,557,-489,-489,-489,-489,-489,710,580,579', +'589,580,579,581,580,579,583,262,261,406,-495,-494,699,698,408,407,570', +'-495,-494,-489,-489,-489,-489,-489,-489,-489,-489,-489,-489,-489,-489', +'-489,-489,-299,221,-489,-489,-489,221,-489,-489,560,562,-489,561,456', +'-489,-489,727,-489,558,-489,737,-489,457,-489,-489,741,-489,-489,-489', +'-489,-489,-497,-489,-492,-489,742,398,-272,-497,557,-492,-492,-492,-495', +'-494,-492,-492,-492,-489,-492,502,-489,-489,-489,-489,754,-489,-492', +'-489,-492,-492,-492,544,-489,-489,84,543,222,489,-492,-492,222,-492', +'-492,-492,-492,-492,85,-336,226,489,246,221,-500,-498,-336,-499,86,226', +'530,-500,-498,771,-499,-336,772,-497,266,457,-492,-492,-492,-492,-492', +'-492,-492,-492,-492,-492,-492,-492,-492,-492,777,-299,-492,-492,-492', +'221,-492,-492,-299,782,-492,500,970,-492,-492,502,-492,-299,-492,528', +'-492,568,-492,-492,524,-492,-492,-492,-492,-492,-336,-492,-298,-492', +'222,-500,-498,658,-499,-298,-298,-298,226,272,-298,-298,-298,-492,-298', +'272,-492,-492,-492,-492,272,-492,658,-492,-298,-298,-298,226,-492,-492', +'246,281,-299,792,-298,-298,222,-298,-298,-298,-298,-298,612,221,800', +'221,803,-289,-492,-489,975,804,220,806,-289,-492,-489,808,810,973,521', +'218,818,-289,-298,-298,-298,-298,-298,-298,-298,-298,-298,-298,-298', +'-298,-298,-298,819,820,-298,-298,-298,792,769,-298,221,825,-298,-98', +'611,-298,-298,604,-298,226,-298,514,-298,-107,-298,-298,602,-298,-298', +'-298,-298,-298,222,-298,222,-298,-289,-492,-489,513,683,226,680,679', +'678,-73,681,-504,226,-298,127,-503,-298,-298,-298,-298,834,-298,502', +'-298,-591,-96,500,-273,-298,-108,498,-591,-591,-591,688,-105,-591,-591', +'-591,222,-591,812,226,489,691,844,225,246,461,-591,-591,-591,-591,967', +'460,680,679,678,-94,681,-591,-591,-93,-591,-591,-591,-591,-591,-103', +'-298,458,848,-102,221,658,865,-298,699,698,243,520,-587,692,245,244', +'-298,241,242,-271,518,-591,-591,-591,-591,-591,-591,-591,-591,-591,-591', +'-591,-591,-591,-591,869,-502,-591,-591,-591,226,889,-591,-502,226,-591', +'893,409,-591,-591,895,-591,-502,-591,396,-591,898,-591,-591,899,-591', +'-591,-591,-591,-591,-298,-591,-591,-591,222,902,226,906,-501,-274,683', +'226,680,679,678,-501,681,-591,908,803,-591,-591,-591,-591,-501,-591', +'-592,-591,911,913,915,688,-591,-592,-592,-592,-502,917,-592,-592,-592', +'691,-592,226,919,246,920,812,326,933,803,-592,-592,-592,-592,967,815', +'680,679,678,935,681,-592,-592,937,-592,-592,-592,-592,-592,939,-298', +'941,-501,699,698,941,243,-298,692,226,245,244,-587,241,242,947,-298', +'325,953,727,964,-592,-592,-592,-592,-592,-592,-592,-592,-592,-592,-592', +'-592,-592,-592,971,266,-592,-592,-592,976,986,-592,217,803,-592,990', +'246,-592,-592,992,-592,994,-592,996,-592,996,-592,-592,663,-592,-592', +'-592,-592,-592,-298,-592,-592,-592,683,214,680,679,678,683,681,680,679', +'678,243,681,213,-592,245,244,-592,-592,-592,-592,1009,-592,-290,-592', +'1010,1011,941,941,-592,-290,-290,-290,941,1016,-290,-290,-290,812,-290', +'246,986,1019,812,-587,-586,226,815,212,-290,-290,-290,946,127,,,256', +'257,,-290,-290,,-290,-290,-290,-290,-290,683,,680,679,678,243,681,249', +',245,244,,241,242,,,247,,248,,,,-290,-290,-290,-290,-290,-290,-290,-290', +'-290,-290,-290,-290,-290,-290,,812,-290,-290,-290,,,-290,,,-290,,,-290', +'-290,,-290,,-290,,-290,,-290,-290,,-290,-290,-290,-290,-290,,-290,,-290', +'732,733,,,734,112,113,,683,,680,679,678,-290,681,,-290,-290,-290,-290', +',-290,-254,-290,,,,,-290,-254,-254,-254,,,-254,-254,-254,683,-254,680', +'679,678,688,681,,812,,-254,-254,,,,691,,,246,,,-254,-254,,-254,-254', +'-254,-254,-254,121,122,123,124,125,256,257,,686,121,122,123,124,125', +',,,696,695,699,698,243,,249,692,245,244,,241,242,,,247,-254,248,-419', +',,,,-254,,-419,-419,-419,272,-254,-419,-419,-419,226,-419,683,,680,679', +'678,,681,,-419,-419,-419,121,122,123,124,125,-254,-254,,-419,-419,,-419', +'-419,-419,-419,-419,,,,,-254,,,-254,,,812,683,-254,680,679,678,,681', +',-254,,,-419,-419,-419,-419,-419,-419,-419,-419,-419,-419,-419,-419', +'-419,-419,,,-419,-419,-419,,,-419,,272,-419,,812,-419,-419,,-419,,-419', +',-419,,-419,-419,,-419,-419,-419,-419,-419,-305,-419,-419,-419,,,,-305', +'-305,-305,,,-305,-305,-305,,-305,-419,246,,-419,-419,,-419,,-419,-305', +'-305,,,,,-419,,256,257,-305,-305,,-305,-305,-305,-305,-305,121,122,123', +'124,125,,243,,249,,245,244,,241,242,,,,,,,,-305,-305,-305,-305,-305', +'-305,-305,-305,-305,-305,-305,-305,-305,-305,,,-305,-305,-305,,,-305', +',281,-305,,,-305,-305,,-305,,-305,,-305,,-305,-305,,-305,-305,-305,-305', +'-305,,-305,-254,-305,,,,,,-254,-254,-254,,,-254,-254,-254,-305,-254', +'246,-305,-305,,-305,,-305,,-254,-254,-254,,,-305,,,256,257,,-254,-254', +',-254,-254,-254,-254,-254,,,,,,243,,,,245,244,,241,242,,,,,,,,,-254', +'-254,-254,-254,-254,-254,-254,-254,-254,-254,-254,-254,-254,-254,,,-254', +'-254,-254,,,-254,,272,-254,,,-254,-254,,-254,,-254,,-254,,-254,-254', +',-254,-254,-254,-254,-254,,-254,-254,-254,,,,,,,,,,,,,,-254,,,-254,-254', +',-254,,-254,299,75,76,77,9,58,-254,,,64,65,,,,68,,66,67,69,30,31,73', +'74,,,,,,78,28,27,106,105,107,108,,,19,,,,,606,8,46,301,10,110,109,111', +'100,57,102,101,103,,104,112,113,,96,97,42,43,41,246,250,251,252,253', +'263,264,258,259,254,255,,239,240,,,256,257,,40,,,33,,,59,60,,,61,,35', +'243,,249,45,245,244,,241,242,262,261,247,20,248,,,,94,84,87,88,,89,91', +'90,92,,,,,85,93,,260,,-246,,,63,,86,98,99,5,75,76,77,9,58,,,,64,65,', +',,68,,66,67,69,30,31,73,74,,,,,,78,28,27,106,105,107,108,,,19,,,,,606', +'8,46,7,10,110,109,111,100,57,102,101,103,,104,112,113,,96,97,42,43,41', +'246,250,251,252,253,263,264,258,259,254,255,,239,240,,,256,257,,40,', +',33,,,59,60,,,61,,35,243,,249,45,245,244,,241,242,262,261,247,20,248', +',,,94,84,87,88,,89,91,90,92,,,,,85,93,,260,,,,,63,,86,98,99,299,75,76', +'77,9,58,,,,64,65,,,,68,,66,67,69,30,31,73,74,,,,,,78,28,27,106,105,107', +'108,,,19,,,,,,8,46,301,10,110,109,111,100,57,102,101,103,,104,112,113', +',96,97,42,43,41,246,250,251,252,253,263,264,258,259,254,255,,239,240', +',,256,257,,40,,,303,,,59,60,,,61,,35,243,,249,45,245,244,,241,242,262', +'261,247,20,248,,,,94,84,87,88,,89,91,90,92,,,,,85,93,,260,,,,,63,,86', +'98,99,299,75,76,77,9,58,,,,64,65,,,,68,,66,67,69,30,31,73,74,,,,,,78', +'28,27,106,105,107,108,,,19,,,,,,8,46,301,10,110,109,111,100,57,102,101', +'103,,104,112,113,,96,97,42,43,41,246,250,251,252,253,263,264,258,259', +'254,255,,239,240,,,256,257,,40,,,33,,,59,60,,,61,,35,243,,249,45,245', +'244,,241,242,262,261,247,20,248,,,,94,84,87,88,,89,91,90,92,,,,,85,93', +',260,,,,,63,,86,98,99,299,75,76,77,9,58,,,,64,65,,,,68,,66,67,69,30', +'31,73,74,,,,,,78,28,27,106,105,107,108,,,19,,,,,,8,46,301,10,110,109', +'111,100,57,102,101,103,,104,112,113,,96,97,42,43,41,246,250,251,252', +'253,263,264,258,259,254,255,,239,240,,,256,257,,40,,,33,,,59,60,,,61', +',35,243,,249,45,245,244,,241,242,262,261,247,20,248,,,,94,84,87,88,', +'89,91,90,92,,,,,85,93,226,260,,,,,63,,86,98,99,299,75,76,77,9,58,,,', +'64,65,,,,68,,66,67,69,30,31,73,74,,,,,,78,28,27,106,105,107,108,,,19', +',,,,,8,46,301,10,110,109,111,100,57,102,101,103,,104,112,113,,96,97', +'42,43,41,246,250,251,252,253,263,264,258,259,254,255,,239,240,,,256', +'257,,40,,,33,,,59,60,,,61,,35,243,,249,45,245,244,,241,242,262,261,247', +'20,248,,,,94,84,87,88,,89,91,90,92,,,,,85,93,,260,,,,,63,,86,98,99,299', +'75,76,77,9,58,,,,64,65,,,,68,,66,67,69,30,31,73,74,,,,,,78,28,27,106', +'105,107,108,,,19,,,,,,8,46,301,10,110,109,111,100,57,102,101,103,,104', +'112,113,,96,97,42,43,41,246,250,251,252,253,263,264,258,259,254,255', +',239,240,,,256,257,,40,,,33,,,59,60,,,61,,35,243,,249,45,245,244,,241', +'242,262,261,247,20,248,,,,94,84,87,88,,89,91,90,92,,,,,85,93,,260,,', +',,63,,86,98,99,299,75,76,77,9,58,,,,64,65,,,,68,,66,67,69,30,31,73,74', +',,,,,78,28,27,106,105,107,108,,,19,,,,,,8,46,301,10,110,109,111,100', +'57,102,101,103,,104,112,113,,96,97,42,43,41,246,250,251,252,253,263', +'264,258,259,254,255,,239,240,,,256,257,,40,,,33,,,59,60,,,61,,35,243', +',249,45,245,244,,241,242,262,261,247,20,248,,,,94,84,87,88,,89,91,90', +'92,,,,,85,93,,260,,,,,63,,86,98,99,299,75,76,77,9,58,,,,64,65,,,,68', +',66,67,69,30,31,73,74,,,,,,78,28,27,106,105,107,108,,,19,,,,,,8,46,301', +'10,110,109,111,100,57,102,101,103,,104,112,113,,96,97,42,43,41,246,250', +'251,252,253,263,264,258,259,254,255,,-611,-611,,,256,257,,40,,,33,,', +'59,60,,,61,,35,243,,249,45,245,244,,241,242,262,261,247,20,248,,,,94', +'84,87,88,,89,91,90,92,,,,,85,93,,,,,,,63,,86,98,99,299,75,76,77,9,58', +',,,64,65,,,,68,,66,67,69,30,31,73,74,,,,,,78,28,27,106,105,107,108,', +',19,,,,,,8,46,301,10,110,109,111,100,57,102,101,103,,104,112,113,,96', +'97,42,43,41,246,-611,-611,-611,-611,263,264,,,-611,-611,,,,,,256,257', +',40,,,303,,,59,60,,,61,,35,243,,249,45,245,244,,241,242,262,261,247', +'20,248,,,,94,84,87,88,,89,91,90,92,,,,,85,93,,,,,,,63,,86,98,99,299', +'75,76,77,9,58,,,,64,65,,,,68,,66,67,69,30,31,73,74,,,,,,78,28,27,106', +'105,107,108,,,19,,,,,,8,46,301,10,110,109,111,100,57,102,101,103,,104', +'112,113,,96,97,42,43,41,246,-611,-611,-611,-611,263,264,,,-611,-611', +',,,,,256,257,,40,,,33,,,59,60,,,61,,35,243,,249,45,245,244,,241,242', +'262,261,247,20,248,,,,94,84,87,88,,89,91,90,92,,,,,85,93,,,,,,,63,,86', +'98,99,299,75,76,77,9,58,,,,64,65,,,,68,,66,67,69,30,31,73,74,,,,,,78', +'28,27,106,105,107,108,,,19,,,,,,8,46,301,10,110,109,111,100,57,102,101', +'103,,104,112,113,,96,97,42,43,41,246,-611,-611,-611,-611,263,264,,,-611', +'-611,,,,,,256,257,,40,,,33,,,59,60,,,61,,35,243,,249,45,245,244,,241', +'242,262,261,247,20,248,,,,94,84,87,88,,89,91,90,92,,,,,85,93,,,,,,,63', +',86,98,99,299,75,76,77,9,58,,,,64,65,,,,68,,66,67,69,30,31,73,74,,,', +',,78,28,27,106,105,107,108,,,19,,,,,,8,46,301,10,110,109,111,100,57', +'102,101,103,,104,112,113,,96,97,42,43,41,246,-611,-611,-611,-611,263', +'264,,,-611,-611,,,,,,256,257,,40,,,33,,,59,60,,,61,,35,243,,249,45,245', +'244,,241,242,262,261,247,20,248,,,,94,84,87,88,,89,91,90,92,,,,,85,93', +',,,,,,63,,86,98,99,299,75,76,77,9,58,,,,64,65,,,,68,,66,67,69,30,31', +'73,74,,,,,,78,28,27,106,105,107,108,,,19,,,,,,8,46,301,10,110,109,111', +'100,57,102,101,103,,104,112,113,,96,97,42,43,41,246,250,251,252,253', +'263,264,258,,254,255,,,,,,256,257,,40,,,33,,,59,60,,,61,,35,243,,249', +'45,245,244,,241,242,262,261,247,20,248,,,,94,84,87,88,,89,91,90,92,', +',,,85,93,,,,,,,63,,86,98,99,299,75,76,77,9,58,,,,64,65,,,,68,,66,67', +'69,30,31,73,74,,,,,,78,28,27,106,105,107,108,,,19,,,,,,8,46,301,10,110', +'109,111,100,57,102,101,103,,104,112,113,,96,97,42,43,41,246,250,251', +'252,253,263,264,,,254,255,,,,,,256,257,,40,,,33,,,59,60,,,61,,35,243', +',249,45,245,244,,241,242,262,261,247,20,248,,,,94,84,87,88,,89,91,90', +'92,,,,,85,93,,,,,,,63,,86,98,99,299,75,76,77,9,58,,,,64,65,,,,68,,66', +'67,69,30,31,73,74,,,,,,78,28,27,106,105,107,108,,,19,,,,,,8,46,301,10', +'110,109,111,100,57,102,101,103,,104,112,113,,96,97,42,43,41,246,250', +'251,252,253,263,264,258,259,254,255,,-611,-611,,,256,257,,40,,,33,,', +'59,60,,,61,,35,243,,249,45,245,244,,241,242,262,261,247,20,248,,,,94', +'84,87,88,,89,91,90,92,,,,,85,93,,,,,,,63,,86,98,99,299,75,76,77,9,58', +',,,64,65,,,,68,,66,67,69,30,31,73,74,,,,,,78,28,27,106,105,107,108,', +',19,,,,,,8,46,301,10,110,109,111,100,57,102,101,103,,104,112,113,,96', +'97,42,43,41,246,-611,-611,-611,-611,263,264,,,-611,-611,,,,,,256,257', +',40,,,303,,,59,60,,,61,,35,243,,249,45,245,244,,241,242,262,261,247', +'20,248,,,,94,84,87,88,,89,91,90,92,,,,,85,93,,,,,,,63,,86,98,99,299', +'75,76,77,9,58,,,,64,65,,,,68,,66,67,69,30,31,73,74,,,,,,78,28,27,106', +'105,107,108,,,19,,,,,,8,46,301,10,110,109,111,100,57,102,101,103,,104', +'112,113,,96,97,42,43,41,246,-611,-611,-611,-611,263,264,,,-611,-611', +',,,,,256,257,,40,,,33,,,59,60,,,61,,35,243,,249,45,245,244,,241,242', +'262,261,247,20,248,,,,94,84,87,88,,89,91,90,92,,,,,85,93,,,,,,,63,,86', +'98,99,299,75,76,77,9,58,,,,64,65,,,,68,,66,67,69,30,31,73,74,,,,,,78', +'28,27,106,105,107,108,,,19,,,,,,8,46,301,10,110,109,111,100,57,102,101', +'103,,104,112,113,,96,97,42,43,41,246,,,,,,,,,,,,,,,,256,257,,40,,,33', +',,59,60,,,61,,35,243,,249,45,245,244,,241,242,,,,20,,,,,94,84,87,88', +',89,91,90,92,,,,,85,93,,,,,,,63,,86,98,99,299,75,76,77,9,58,,,,64,65', +',,,68,,66,67,69,30,31,73,74,,,,,,78,28,27,106,105,107,108,,,19,,,,,', +'8,46,301,10,110,109,111,100,57,102,101,103,,104,112,113,,96,97,42,43', +'41,,,,,,,,,,,,,,,,,,,,40,,,33,,,59,60,,,61,,35,,,,45,,,,,,,,,20,,,,', +'94,84,87,88,,89,91,90,92,,,,,85,93,,,,,,,63,,86,98,99,5,75,76,77,9,58', +',,,64,65,,,,68,,66,67,69,30,31,73,74,,,,,,78,28,27,106,105,107,108,', +',19,,,,,,8,46,7,10,110,109,111,100,57,102,101,103,,104,112,113,,96,97', +'42,43,41,,,,,,,,,,,,,,,,,,,,40,,,33,,,59,60,,,61,,35,,,,45,,,,,,,,,20', +',,,,94,84,87,88,,89,91,90,92,,,,,85,93,,,,,,,63,,86,98,99,299,75,76', +'77,9,58,,,,64,65,,,,68,,66,67,69,30,31,73,74,,,,,,78,28,27,106,105,107', +'108,,,19,,,,,,8,46,301,10,110,109,111,100,57,102,101,103,,104,112,113', +',96,97,42,43,41,,,,,,,,,,,,,,,,,,,,40,,,33,,,59,60,,,61,,35,,,,45,,', +',,,,,,20,,,,,94,84,87,88,,89,91,90,92,,,,,85,93,,,,,,,63,,86,98,99,299', +'75,76,77,9,58,,,,64,65,,,,68,,66,67,69,30,31,73,74,,,,,,78,28,27,106', +'105,107,108,,,19,,,,,,8,46,301,10,110,109,111,100,57,102,101,103,,104', +'112,113,,96,97,42,43,41,,,,,,,,,,,,,,,,,,,,40,,,33,,,59,60,,,61,,35', +',,,45,,,,,,,,,20,,,,,94,84,87,88,,89,91,90,92,,,,,85,93,,,,,,,63,,86', +'98,99,299,75,76,77,9,58,,,,64,65,,,,68,,66,67,69,30,31,73,74,,,,,,78', +'28,27,106,105,107,108,,,19,,,,,,8,46,301,10,110,109,111,100,57,102,101', +'103,,104,112,113,,96,97,42,43,41,,,,,,,,,,,,,,,,,,,,40,,,33,,,59,60', +',,61,,35,,,,45,,,,,,,,,20,,,,,94,84,87,88,,89,91,90,92,,,,,85,93,,,', +',,,63,,86,98,99,299,75,76,77,9,58,,,,64,65,,,,68,,66,67,69,30,31,73', +'74,,,,,,78,28,27,106,105,107,108,,,19,,,,,,8,46,301,10,110,109,111,100', +'57,102,101,103,,104,112,113,,96,97,42,43,41,,,,,,,,,,,,,,,,,,,,40,,', +'33,,,59,60,,,61,,35,,,,45,,,,,,,,,20,,,,,94,84,87,88,,89,91,90,92,,', +',,85,93,,,,,,,63,,86,98,99,299,75,76,77,9,58,,,,64,65,,,,68,,66,67,69', +'30,31,73,74,,,,,,78,28,27,106,105,107,108,,,19,,,,,,8,46,301,10,110', +'109,111,100,57,102,101,103,,104,112,113,,96,97,42,43,41,,,,,,,,,,,,', +',,,,,,,40,,,33,,,59,60,,,61,,35,,,,45,,,,,,,,,20,,,,,94,84,87,88,,89', +'91,90,92,,,,,85,93,,,,,,,63,,86,98,99,299,75,76,77,9,58,,,,64,65,,,', +'68,,66,67,69,30,31,73,74,,,,,,78,28,27,106,105,107,108,,,19,,,,,,8,46', +'301,10,110,109,111,100,57,102,101,103,,104,112,113,,96,97,42,43,41,', +',,,,,,,,,,,,,,,,,,40,,,33,,,59,60,,,61,,35,,,,45,,,,,,,,,20,,,,,94,84', +'87,88,,89,91,90,92,,,,,85,93,,,,,,,63,,86,98,99,299,75,76,77,9,58,,', +',64,65,,,,68,,66,67,69,30,31,73,74,,,,,,78,28,27,106,105,107,108,,,19', +',,,,,8,46,301,10,110,109,111,100,57,102,101,103,,104,112,113,,96,97', +'42,43,41,,,,,,,,,,,,,,,,,,,,40,,,33,,,59,60,,,61,,35,,,,45,,,,,,,,,20', +',,,,94,84,87,88,,89,91,90,92,,,,,85,93,,,,75,76,77,63,58,86,98,99,64', +'65,,,,68,,66,67,69,30,31,73,74,,,,,,78,28,27,106,105,107,108,,,19,,', +',,,,46,,,110,109,111,100,57,102,101,103,,104,112,113,,96,97,42,43,41', +',,,,,,,,,,,,,,,,,,,231,,,237,,,59,60,,,61,,,,,,45,,,,,,,,,20,,,,,94', +'84,87,88,,89,91,90,92,,,,,85,93,226,,,75,76,77,63,58,86,98,99,64,65', +',,,68,,66,67,69,318,319,73,74,,,,,,78,315,321,106,105,107,108,,,238', +',,,,,,46,,,110,109,111,100,57,102,101,103,,104,112,113,,96,97,42,43', +'41,,,,,,,,,,,,,,,,,,,,231,,,237,,,59,60,,,61,,,,,,45,,,,,,,,,236,,,', +',94,84,87,88,,89,91,90,92,,,,,85,93,,,,75,76,77,63,58,86,98,99,64,65', +',,,68,,66,67,69,318,319,73,74,,,,,,78,315,321,106,105,107,108,,,238', +',,,,,,46,,,110,109,111,100,57,102,101,103,,104,112,113,,96,97,42,43', +'41,,,,,,,,,,,,,,,,,,,,231,,,237,,,59,60,,,61,,,,,,45,,,,,,,,,236,,,', +',94,84,87,88,,89,91,90,92,,,,,85,93,,,,75,76,77,63,58,86,98,99,64,65', +',,,68,,66,67,69,318,319,73,74,,,,,,78,315,321,106,105,107,108,,,238', +',,,,,,46,,,110,109,111,100,57,102,101,103,,104,112,113,,96,97,42,43', +'41,,,,,,,,,,,,,,,,,,,,231,,,237,,,59,60,,,61,,,,,,45,,,,,,,,,236,,,', +',94,84,87,88,,89,91,90,92,,,,,85,93,,,,75,76,77,63,58,86,98,99,64,65', +',,,68,,66,67,69,318,319,73,74,,,,,,78,315,321,106,105,107,108,,,238', +',,,,,,46,,,110,109,111,100,57,102,101,103,,104,112,113,,96,97,42,43', +'41,,,,,,,,,,,,,,,,,,,,231,,,237,,,59,60,,,61,,,,,,45,,,,,,,,,236,,,', +',94,84,87,88,,89,91,90,92,,,,,85,93,,,,75,76,77,63,58,86,98,99,64,65', +',,,68,,66,67,69,318,319,73,74,,,,,,78,315,321,106,105,107,108,,,238', +',,,,,,46,,,110,109,111,100,57,102,101,103,,104,112,113,,96,97,42,43', +'41,,,,,,,,,,,,,,,,,,,,231,,,237,,,59,60,,,61,,,,,,45,,,,,,,,,236,,,', +',94,84,87,88,,89,91,90,92,,,,,85,93,,,,75,76,77,63,58,86,98,99,64,65', +',,,68,,66,67,69,318,319,73,74,,,,,,78,315,321,106,105,107,108,,,238', +',,,,,,46,,,110,109,111,100,57,102,101,103,,104,112,113,,96,97,42,43', +'41,,,,,,,,,,,,,,,,,,,,231,,,237,,,59,60,,,61,,,,,,45,,,,,,,,,236,,,', +',94,84,87,88,,89,91,90,92,,,,,85,93,,,,75,76,77,63,58,86,98,99,64,65', +',,,68,,66,67,69,318,319,73,74,,,,,,78,315,321,106,105,107,108,,,238', +',,,,,,46,,,110,109,111,100,57,102,101,103,,104,112,113,,96,97,42,43', +'41,,,,,,,,,,,,,,,,,,,,231,,,237,,,59,60,,,61,,,,,,45,,,,,,,,,236,,,', +',94,84,87,88,,89,91,90,92,,,,,85,93,,,,75,76,77,63,58,86,98,99,64,65', +',,,68,,66,67,69,318,319,73,74,,,,,,78,315,321,106,105,107,108,,,238', +',,,,,,46,,,110,109,111,100,57,102,101,103,,104,112,113,,96,97,42,43', +'41,,,,,,,,,,,,,,,,,,,,231,,,237,,,59,60,,,61,,,,,,45,,,,,,,,,236,,,', +',94,84,87,88,,89,91,90,92,,,,,85,93,,,,75,76,77,63,58,86,98,99,64,65', +',,,68,,66,67,69,318,319,73,74,,,,,,78,315,321,106,105,107,108,,,238', +',,,,,,46,,,110,109,111,100,57,102,101,103,,104,112,113,,96,97,42,43', +'41,,,,,,,,,,,,,,,,,,,,231,,,237,,,59,60,,,61,,,,,,45,,,,,,,,,236,,,', +',94,84,87,88,,89,91,90,92,,,,,85,93,,,,75,76,77,63,58,86,98,99,64,65', +',,,68,,66,67,69,318,319,73,74,,,,,,78,315,321,106,105,107,108,,,238', +',,,,,,46,,,110,109,111,100,57,102,101,103,,104,112,113,,96,97,42,43', +'41,,,,,,,,,,,,,,,,,,,,231,,,237,,,59,60,,,61,,,,,,45,,,,,,,,,236,,,', +',94,84,87,88,,89,91,90,92,,,,,85,93,,,,75,76,77,63,58,86,98,99,64,65', +',,,68,,66,67,69,318,319,73,74,,,,,,78,315,321,106,105,107,108,,,238', +',,,,,,46,,,110,109,111,100,57,102,101,103,,104,112,113,,96,97,42,43', +'41,,,,,,,,,,,,,,,,,,,,231,,,237,,,59,60,,,61,,,,,,45,,,,,,,,,236,,,', +',94,84,87,88,,89,91,90,92,,,,,85,93,,,,75,76,77,63,58,86,98,99,64,65', +',,,68,,66,67,69,318,319,73,74,,,,,,78,315,321,106,105,107,108,,,238', +',,,,,,46,,,110,109,111,100,57,102,101,103,,104,112,113,,96,97,42,43', +'41,,,,,,,,,,,,,,,,,,,,231,,,237,,,59,60,,,61,,,,,,45,,,,,,,,,236,,,', +',94,84,87,88,,89,91,90,92,,,,,85,93,,,,75,76,77,63,58,86,98,99,64,65', +',,,68,,66,67,69,318,319,73,74,,,,,,78,315,321,106,105,107,108,,,238', +',,,,,,46,,,110,109,111,100,57,102,101,103,,104,112,113,,96,97,42,43', +'41,,,,,,,,,,,,,,,,,,,,231,,,237,,,59,60,,,61,,,,,,45,,,,,,,,,236,,,', +',94,84,87,88,,89,91,90,92,,,,,85,93,,,,75,76,77,63,58,86,98,99,64,65', +',,,68,,66,67,69,318,319,73,74,,,,,,78,315,321,106,105,107,108,,,238', +',,,,,,46,,,110,109,111,100,57,102,101,103,,104,112,113,,96,97,42,43', +'41,,,,,,,,,,,,,,,,,,,,231,,,237,,,59,60,,,61,,,,,,45,,,,,,,,,236,,,', +',94,84,87,88,,89,91,90,92,,,,,85,93,,,,75,76,77,63,58,86,98,99,64,65', +',,,68,,66,67,69,318,319,73,74,,,,,,78,315,321,106,105,107,108,,,238', +',,,,,,46,,,110,109,111,100,57,102,101,103,,104,112,113,,96,97,42,43', +'41,,,,,,,,,,,,,,,,,,,,231,,,237,,,59,60,,,61,,,,,,45,,,,,,,,,236,,,', +',94,84,87,88,,89,91,90,92,,,,,85,93,,,,75,76,77,63,58,86,98,99,64,65', +',,,68,,66,67,69,318,319,73,74,,,,,,78,315,321,106,105,107,108,,,238', +',,,,,,46,,,110,109,111,100,57,102,101,103,,104,112,113,,96,97,42,43', +'41,,,,,,,,,,,,,,,,,,,,231,,,237,,,59,60,,,61,,,,,,45,,,,,,,,,236,,,', +',94,84,87,88,,89,91,90,92,,,,,85,93,,,,75,76,77,63,58,86,98,99,64,65', +',,,68,,66,67,69,318,319,73,74,,,,,,78,315,321,106,105,107,108,,,238', +',,,,,,46,,,110,109,111,100,57,102,101,103,,104,112,113,,96,97,42,43', +'41,,,,,,,,,,,,,,,,,,,,231,,,237,,,59,60,,,61,,,,,,45,,,,,,,,,236,,,', +',94,84,87,88,,89,91,90,92,,,,,85,93,,,,75,76,77,63,58,86,98,99,64,65', +',,,68,,66,67,69,318,319,73,74,,,,,,78,315,321,106,105,107,108,,,238', +',,,,,,46,,,110,109,111,100,57,102,101,103,,104,112,113,,96,97,42,43', +'41,,,,,,,,,,,,,,,,,,,,231,,,237,,,59,60,,,61,,,,,,45,,,,,,,,,236,,,', +',94,84,87,88,,89,91,90,92,,,,,85,93,,,,75,76,77,63,58,86,98,99,64,65', +',,,68,,66,67,69,318,319,73,74,,,,,,78,315,321,106,105,107,108,,,238', +',,,,,,46,,,110,109,111,100,57,102,101,103,,104,112,113,,96,97,42,43', +'41,,,,,,,,,,,,,,,,,,,,231,,,237,,,59,60,,,61,,,,,,45,,,,,,,,,236,,,', +',94,84,87,88,,89,91,90,92,,,,,85,93,,,,75,76,77,63,58,86,98,99,64,65', +',,,68,,66,67,69,318,319,73,74,,,,,,78,315,321,106,105,107,108,,,238', +',,,,,,46,,,110,109,111,100,57,102,101,103,,104,112,113,,96,97,42,43', +'41,,,,,,,,,,,,,,,,,,,,231,,,237,,,59,60,,,61,,,,,,45,,,,,,,,,236,,,', +',94,84,87,88,,89,91,90,92,,,,,85,93,,,,75,76,77,63,58,86,98,99,64,65', +',,,68,,66,67,69,318,319,73,74,,,,,,78,315,321,106,105,107,108,,,238', +',,,,,,46,,,110,109,111,100,57,102,101,103,,104,112,113,,96,97,42,43', +'41,,,,,,,,,,,,,,,,,,,,231,,,237,,,59,60,,,61,,,,,,45,,,,,,,,,236,,,', +',94,84,87,88,,89,91,90,92,,,,,85,93,,,,75,76,77,63,58,86,98,99,64,65', +',,,68,,66,67,69,318,319,73,74,,,,,,78,315,321,106,105,107,108,,,238', +',,,,,,46,,,110,109,111,100,57,102,101,103,,104,112,113,,96,97,42,43', +'41,,,,,,,,,,,,,,,,,,,,231,,,237,,,59,60,,,61,,,,,,45,,,,,,,,,236,,,', +',94,84,87,88,,89,91,90,92,,,,,85,93,,,,75,76,77,63,58,86,98,99,64,65', +',,,68,,66,67,69,318,319,73,74,,,,,,78,315,321,106,105,107,108,,,238', +',,,,,,46,,,110,109,111,100,57,102,101,103,,104,112,113,,96,97,42,43', +'41,,,,,,,,,,,,,,,,,,,,231,,,237,,,59,60,,,61,,,,,,45,,,,,,,,,236,,,', +',94,84,87,88,,89,91,90,92,,,,,85,93,,,,75,76,77,63,58,86,98,99,64,65', +',,,68,,66,67,69,318,319,73,74,,,,,,78,315,321,106,105,107,108,,,238', +',,,,,,46,,,110,109,111,100,57,102,101,103,,104,112,113,,96,97,42,43', +'41,,,,,,,,,,,,,,,,,,,,231,,,237,,,59,60,,,61,,,,,,45,,,,,,,,,236,,,', +',94,84,87,88,,89,91,90,92,,,,,85,93,,,,75,76,77,63,58,86,98,99,64,65', +',,,68,,66,67,69,318,319,73,74,,,,,,78,315,321,106,105,107,108,,,238', +',,,,,,46,,,110,109,111,100,57,102,101,103,,104,112,113,,96,97,42,43', +'41,,,,,,,,,,,,,,,,,,,,231,,,237,,,59,60,,,61,,,,,,45,,,,,,,,,236,,,', +',94,84,87,88,,89,91,90,92,,,,,85,93,,,,75,76,77,63,58,86,98,99,64,65', +',,,68,,66,67,69,318,319,73,74,,,,,,78,315,321,106,105,107,108,,,238', +',,,,,,46,,,110,109,111,100,57,102,101,103,,104,112,113,,96,97,42,43', +'41,,,,,,,,,,,,,,,,,,,,231,,,237,,,59,60,,,61,,,,,,45,,,,,,,,,236,,,', +',94,84,87,88,,89,91,90,92,,,,,85,93,,,,75,76,77,63,58,86,98,99,64,65', +',,,68,,66,67,69,318,319,73,74,,,,,,78,315,321,106,105,107,108,,,238', +',,,,,,46,,,110,109,111,100,57,102,101,103,,104,112,113,,96,97,42,43', +'41,,,,,,,,,,,,,,,,,,,,231,,,237,,,59,60,,,61,,,,,,45,,,,,,,,,236,,,', +',94,84,87,88,,89,91,90,92,,,,,85,93,,,,75,76,77,63,58,86,98,99,64,65', +',,,68,,66,67,69,318,319,73,74,,,,,,78,315,321,106,105,107,108,,,238', +',,,,,,46,,,110,109,111,100,57,102,101,103,,104,112,113,,96,97,42,43', +'41,,,,,,,,,,,,,,,,,,,,231,,,237,,,59,60,,,61,,,,,,45,,,,,,,,,236,,,', +',94,84,87,88,,89,91,90,92,,,,,85,93,,,,75,76,77,63,58,86,98,99,64,65', +',,,68,,66,67,69,318,319,73,74,,,,,,78,315,321,106,105,107,108,,,238', +',,,,,,46,,,110,109,111,100,57,102,101,103,,104,112,113,,96,97,42,43', +'41,,,,,,,,,,,,,,,,,,,,231,,,237,,,59,60,,,61,,,,,,45,,,,,,,,,236,,,', +',94,84,87,88,,89,91,90,92,,,,,85,93,,,,75,76,77,63,58,86,98,99,64,65', +',,,68,,66,67,69,30,31,73,74,,,,,,78,28,27,106,105,107,108,,,238,,,,', +',,46,,,110,109,111,100,57,102,101,103,,104,112,113,,96,97,42,43,41,', +',,,,,,,,,,,,,,,,,,231,,,237,,,59,60,,,61,,,,,,45,,,,,,,,,236,,,,,94', +'84,87,88,,89,91,90,92,,,,,85,93,,,,75,76,77,63,58,86,98,99,64,65,,,', +'68,,66,67,69,30,31,73,74,,,,,,78,28,27,106,105,107,108,,,238,,,,,,,46', +',,110,109,111,100,57,102,101,103,293,104,112,113,,96,97,42,43,41,,,', +',,,,,,,,,,,,,,,,231,,,237,,,59,60,,,61,,290,,288,,45,,,294,,,,,,236', +',,,,94,291,87,88,,89,91,90,92,,,,,85,93,,,,75,76,77,63,58,86,98,99,64', +'65,,,,68,,66,67,69,30,31,73,74,,,,,,78,28,27,106,105,107,108,,,238,', +',,,,,46,,,110,109,111,100,57,102,101,103,293,104,112,113,,96,97,42,43', +'41,,,,,,,,,,,,,,,,,,,,231,,,237,,,59,60,,,61,,290,,288,,45,,,294,,,', +',,236,,,,,94,291,87,88,,89,91,90,92,,,,,85,93,,,,75,76,77,63,58,86,98', +'99,64,65,,,,68,,66,67,69,30,31,73,74,,,,,,78,28,27,106,105,107,108,', +',238,,,,,,,46,,,110,109,111,100,57,102,101,103,293,104,112,113,,96,97', +'42,43,41,,,,,,,,,,,,,,,,,,,,231,,,237,,,59,60,,,61,,290,,288,,45,,,294', +',,,,,236,,,,,94,291,87,88,,89,91,90,92,,,,,85,93,226,,,75,76,77,63,58', +'86,98,99,64,65,,,,68,,66,67,69,318,319,73,74,,,,,,78,315,321,106,105', +'107,108,,,238,,,,,,,46,,,110,109,111,100,57,102,101,103,,104,112,113', +',96,97,42,43,41,,,,,,,,,,,,,,,,,,,,231,,,237,,,59,60,,,61,,,,,,45,,', +',,,,,,236,,,,,94,84,87,88,,89,91,90,92,,,,,85,93,,,,75,76,77,63,58,86', +'98,99,64,65,,,,68,,66,67,69,318,319,73,74,,,,,,78,315,321,106,105,107', +'108,,,238,,,,,,,46,,,110,109,111,100,57,102,101,103,,104,112,113,,96', +'97,42,43,41,,,,,,,,,,,,,,,,,,,,231,,,237,,,59,60,,,61,,,,,,45,,,,,,', +',,236,,,,,94,84,87,88,,89,91,90,92,,,,,85,93,,,,75,76,77,63,58,86,98', +'99,64,65,,,,68,,66,67,69,318,319,73,74,,,,,,78,315,321,106,105,107,108', +',,238,,,,,,,46,,,110,109,111,100,57,102,101,103,,104,112,113,,96,97', +'42,43,41,,,,,,,,,,,,,,,,,,,,231,,,237,,,59,60,,,61,,,,,,45,,,,,,,,,236', +',,,,94,84,87,88,,89,91,90,92,,,,,85,93,,,,75,76,77,63,58,86,98,99,64', +'65,,,,68,,66,67,69,318,319,73,74,,,,,,78,315,321,106,105,107,108,,,238', +',,,,,,46,,,110,109,111,100,57,102,101,103,,104,112,113,,96,97,42,43', +'41,,,,,,,,,,,,,,,,,,,,231,,,237,,,59,60,,,61,,,,,,45,,,,,,,,,236,,,', +',94,84,87,88,,89,91,90,92,,,,,85,93,,,,75,76,77,63,58,86,98,99,64,65', +',,,68,,66,67,69,318,319,73,74,,,,,,78,315,321,106,105,107,108,,,238', +',,,,,,46,,,110,109,111,100,57,102,101,103,,104,112,113,,96,97,42,43', +'41,,,,,,,,,,,,,,,,,,,,231,,,237,,,59,60,,,61,,,,,,45,,,,,,,,,236,,,', +',94,84,87,88,,89,91,90,92,,,,,85,93,,,,,,,63,,86,98,99,75,76,77,9,58', +',,,64,65,,,,68,,66,67,69,30,31,73,74,,,,,,78,28,27,106,105,107,108,', +',19,,,,,,8,46,,10,110,109,111,100,57,102,101,103,,104,112,113,,96,97', +'42,43,41,,,,,,,,,,,,,,,,,,,,40,,,33,,,59,60,,,61,,35,,,,45,,,,,,,,,20', +',,,,94,84,87,88,,89,91,90,92,,,,,85,93,,,,75,76,77,63,58,86,98,99,64', +'65,,,,68,,66,67,69,30,31,73,74,,,,,,78,28,27,106,105,107,108,,,19,,', +',,,,46,,,110,109,111,100,57,102,101,103,,104,112,113,,96,97,42,43,41', +',,,,,,,,,,,,,,,,,,,231,,,237,,,59,60,,,61,,,,,,45,,,,,,,,,20,,,,,94', +'84,87,88,,89,91,90,92,,,,,85,93,,,,75,76,77,63,58,86,98,99,64,65,,,', +'68,,66,67,69,318,319,73,74,,,,,,78,315,321,106,105,107,108,,,238,,,', +',,,46,,,110,109,111,100,57,102,101,103,293,104,112,113,,96,97,42,43', +'41,,,,,,,,,,,,,,,,,,,,231,,,237,,,59,60,,,61,,,,,,45,,,294,,,,,,236', +',,,,94,291,87,88,,89,91,90,92,,,,,85,93,,,,,,,63,,86,98,99,75,76,77', +'9,58,,,,64,65,,,,68,,66,67,69,30,31,73,74,,,,,,78,28,27,106,105,107', +'108,,,19,,,,,,8,46,7,10,110,109,111,100,57,102,101,103,,104,112,113', +',96,97,42,43,41,,,,,,,,,,,,,,,,,,,,40,,,33,,,59,60,,,61,,35,,,,45,,', +',,,,,,20,,,,,94,84,87,88,,89,91,90,92,,,,,85,93,,,,75,76,77,63,58,86', +'98,99,64,65,,,,68,,66,67,69,30,31,73,74,,,,,,78,28,27,106,105,107,108', +',,238,,,,,,,46,,,110,109,111,100,57,102,101,103,293,104,112,113,,96', +'97,42,43,41,,,,,,,,,,,,,,,,,,,,231,,,237,,,59,60,,,61,,290,,288,,45', +',,294,,,,,,236,,,,,94,291,87,88,,89,91,90,92,,,,,85,93,,,,75,76,77,63', +'58,86,98,99,64,65,,,,68,,66,67,69,30,31,73,74,,,,,,78,28,27,106,105', +'107,108,,,238,,,,,,,46,,,110,109,111,100,57,102,101,103,,104,112,113', +',96,97,42,43,41,,,,,,,,,,,,,,,,,,,,231,,,237,,,59,60,,,61,,,,,,45,,', +',,,,,,236,,,,,94,84,87,88,,89,91,90,92,,,,,85,93,,,,75,76,77,63,58,86', +'98,99,64,65,,,,68,,66,67,69,318,319,73,74,,,,,,78,315,321,106,105,107', +'108,,,238,,,,,,,316,,,110,109,111,100,57,102,101,103,,104,112,113,,96', +'97,,,322,,,,,,,,,,,,,,,,,,,,922,,,237,,,59,60,,,61,,,,,,,,,,,,,,,,,', +',,94,84,87,88,,89,91,90,92,,,,,85,93,,,,75,76,77,63,58,86,98,99,64,65', +',,,68,,66,67,69,30,31,73,74,,,,,,78,28,27,106,105,107,108,,,238,,,,', +',,46,,,110,109,111,100,57,102,101,103,293,104,112,113,,96,97,42,43,41', +',,,,,,,,,,,,,,,,,,,231,,,237,,,59,60,,,61,,290,,288,,45,,,294,,,,,,236', +',,,,94,291,87,88,,89,91,90,92,,,,,85,93,,,,75,76,77,63,58,86,98,99,64', +'65,,,,68,,66,67,69,30,31,73,74,,,,,,78,28,27,106,105,107,108,,,238,', +',,,,,46,,,110,109,111,100,57,102,101,103,293,104,112,113,,96,97,42,43', +'41,,,,,,,,,,,,,,,,,,,,231,,,237,,,59,60,,,61,,290,,288,,45,,,294,,,', +',,236,,,,,94,291,87,88,,89,91,90,92,,,,,85,93,,,,75,76,77,63,58,86,98', +'99,64,65,,,,68,,66,67,69,30,31,73,74,,,,,,78,28,27,106,105,107,108,', +',238,,,,,,,46,,,110,109,111,100,57,102,101,103,293,104,112,113,,96,97', +'42,43,41,,,,,,,,,,,,,,,,,,,,231,,,237,,,59,60,,,61,,290,,288,,45,,,294', +',,,,,236,,,,,94,291,87,88,,89,91,90,92,,,,,85,93,,,,75,76,77,63,58,86', +'98,99,64,65,,,,68,,66,67,69,318,319,73,74,,,,,,78,315,321,106,105,107', +'108,,,238,,,,,,,316,,,110,109,111,100,57,102,101,103,,104,112,113,,96', +'97,,,322,,,,,,,,,,,,,,,,,,,,312,,,308,,,59,60,,,61,,307,,,,,,,,,,,,', +',,,,,94,84,87,88,,89,91,90,92,,,,,85,93,,,,75,76,77,63,58,86,98,99,64', +'65,,,,68,,66,67,69,318,319,73,74,,,,,,78,315,321,106,105,107,108,,,238', +',,,,,,316,,,110,109,111,100,57,102,101,103,,104,112,113,,96,97,,,322', +',,,,,,,,,,,,,,,,,,,312,,,237,,,59,60,,,61,,,683,,680,679,678,688,681', +',,,,,,,,691,,94,84,87,88,,89,91,90,92,,,,,85,93,,,,324,,686,63,,86,98', +'99,75,76,77,,58,699,698,,64,65,692,,,68,,66,67,69,318,319,73,74,,,,', +',78,315,321,106,105,107,108,,,238,,,,,,,316,,,110,109,111,100,57,102', +'101,103,,104,112,113,,96,97,,,322,,,,,,,,,,,,,,,,,,,,928,,,237,,,59', +'60,,,61,,,,,,,,,,,,,,,,,,,,94,84,87,88,,89,91,90,92,,,,,85,93,,,,75', +'76,77,63,58,86,98,99,64,65,,,,68,,66,67,69,318,319,73,74,,,,,,78,315', +'321,106,105,107,108,,,238,,,,,,,316,,,110,109,111,100,57,102,101,103', +',104,112,113,,96,97,,,322,,,,,,,,,,,,,,,,,,,,922,,,237,,,59,60,,,61', +',,,,,,,,,,,,,,,,,,,94,84,87,88,,89,91,90,92,,,,,85,93,,,,75,76,77,63', +'58,86,98,99,64,65,,,,68,,66,67,69,318,319,73,74,,,,,,78,315,321,106', +'105,107,108,,,238,,,,,,,46,,,110,109,111,100,57,102,101,103,,104,112', +'113,,96,97,42,43,41,,,,,,,,,,,,,,,,,,,,231,,,237,,,59,60,,,61,,,,,,45', +',,,,,,,,236,,,,,94,84,87,88,,89,91,90,92,,,,,85,93,,,,75,76,77,63,58', +'86,98,99,64,65,,,,68,,66,67,69,318,319,73,74,,,,,,78,315,321,106,105', +'107,108,,,238,,,,,,,46,,,110,109,111,100,57,102,101,103,,104,112,113', +',96,97,42,43,41,,,,,,,,,,,,,,,,,,,,231,,,237,,,59,60,,,61,,,,,,45,,', +',,,,,,236,,,,,94,84,87,88,,89,91,90,92,,,,,85,93,,,,75,76,77,63,58,86', +'98,99,64,65,,,,68,,66,67,69,318,319,73,74,,,,,,78,315,321,106,105,107', +'108,,,238,,,,,,,46,,,110,109,111,100,57,102,101,103,,104,112,113,,96', +'97,42,43,41,,,,,,,,,,,,,,,,,,,,231,,,237,,,59,60,,,61,,,,,,45,,,,,,', +',,236,,,,,94,84,87,88,,89,91,90,92,,,,,85,93,,,,75,76,77,63,58,86,98', +'99,64,65,,,,68,,66,67,69,318,319,73,74,,,,,,78,315,321,106,105,107,108', +',,238,,,,,,,46,,,110,109,111,100,57,102,101,103,,104,112,113,,96,97', +'42,43,41,,,,,,,,,,,,,,,,,,,,231,,,237,,,59,60,,,61,,,,,,45,,,,,,,,,236', +',,,,94,84,87,88,,89,91,90,92,,,,,85,93,,,,75,76,77,63,58,86,98,99,64', +'65,,,,68,,66,67,69,318,319,73,74,,,,,,78,315,321,106,105,107,108,,,238', +',,,,,,46,,,110,109,111,100,57,102,101,103,293,104,112,113,,96,97,42', +'43,41,,,,,,,,,,,,,,,,,,,,231,,,237,,,59,60,,,61,,,,288,,45,,,294,,,', +',,236,,,,,94,291,87,88,,89,91,90,92,,,,,85,93,,,,,,,63,,86,98,99,75', +'76,77,9,58,,,,64,65,,,,68,,66,67,69,30,31,73,74,,,,,,78,28,27,106,105', +'107,108,,,19,,,,,,8,46,,10,110,109,111,100,57,102,101,103,,104,112,113', +',96,97,42,43,41,,,,,,,,,,,,,,,,,,,,40,,,33,,,59,60,,,61,,35,,,,45,,', +',,,,,,20,,,,,94,84,87,88,,89,91,90,92,,,,,85,93,,,,75,76,77,63,58,86', +'98,99,64,65,,,,68,,66,67,69,318,319,73,74,,,,,,78,315,321,106,105,107', +'108,,,238,,,,,,,46,,,110,109,111,100,57,102,101,103,293,104,112,113', +',96,97,42,43,41,,,,,,,,,,,,,,,,,,,,231,,,237,,,59,60,,,61,,290,,,,45', +',,294,,,,,,236,,,,,94,291,87,88,,89,91,90,92,,,,,85,93,,,,75,76,77,63', +'58,86,98,99,64,65,,,,68,,66,67,69,318,319,73,74,,,,,,78,315,321,106', +'105,107,108,,,238,,,,,,,46,,,110,109,111,100,57,102,101,103,293,104', +'112,113,,96,97,42,43,41,,,,,,,,,,,,,,,,,,,,231,,,237,,,59,60,,,61,,', +',,,45,,,294,,,,,,236,,,,,94,291,87,88,,89,91,90,92,,,,,85,93,,,,75,76', +'77,63,58,86,98,99,64,65,,,,68,,66,67,69,30,31,73,74,,,,,,78,28,27,106', +'105,107,108,,,19,,,,,,,46,,,110,109,111,100,57,102,101,103,,104,112', +'113,,96,97,42,43,41,,,,,,,,,,,,,,,,,,,,231,,,237,,,59,60,,,61,,,,,,45', +',,,,,,,,20,,,,,94,84,87,88,,89,91,90,92,,,,,85,93,,,,75,76,77,63,58', +'86,98,99,64,65,,,,68,,66,67,69,30,31,73,74,,,,,,78,28,27,106,105,107', +'108,,,19,,,,,,,46,,,110,109,111,100,57,102,101,103,,104,112,113,,96', +'97,42,43,41,,,,,,,,,,,,,,,,,,,,231,,,237,,,59,60,,,61,,,,,,45,,,,,,', +',,20,,,,,94,84,87,88,,89,91,90,92,,,,,85,93,,,,75,76,77,63,58,86,98', +'99,64,65,,,,68,,66,67,69,30,31,73,74,,,,,,78,28,27,106,105,107,108,', +',19,,,,,,,46,,,110,109,111,100,57,102,101,103,,104,112,113,,96,97,42', +'43,41,,,,,,,,,,,,,,,,,,,,231,,,237,,,59,60,,,61,,,,,,45,,,,,,,,,20,', +',,,94,84,87,88,,89,91,90,92,,,,,85,93,118,,,,,117,63,,86,98,99,75,76', +'77,,58,,,,64,65,,,,68,,66,67,69,318,319,73,74,,,,,,78,315,321,106,105', +'107,108,,,238,,,,,,,316,,,110,109,111,100,57,102,101,103,,104,112,113', +',96,97,,,322,,,,,,,,,,,,,,,,,,,,358,,,33,,,59,60,,,61,,35,,,,,,,,,,', +',,,,,,,94,84,87,88,,89,91,90,92,,,,,85,93,,,,75,76,77,63,58,86,98,99', +'64,65,,,,68,,66,67,69,318,319,73,74,,,,,,78,315,321,106,105,107,108', +',,238,,,,,,,316,,,110,109,111,363,57,102,101,364,,104,112,113,,96,97', +',,322,,,,,,,,,,,,,,,,,370,,,365,,,237,,,59,60,,,61,,,,,,,,,,,,,,,,,', +',,94,84,87,88,,89,91,90,92,,,,,85,93,,,,75,76,77,63,58,86,98,99,64,65', +',,,68,,66,67,69,318,319,73,74,,,,,,78,315,321,106,105,107,108,,,238', +',,,,,,316,,,110,109,111,363,57,102,101,364,,104,112,113,,96,97,,,322', +',,,,,,,,,,,,,,,,,,,365,,,237,,,59,60,,,61,,,683,,680,679,678,688,681', +',,,,,,,,691,,94,84,87,88,,89,91,90,92,,,,,85,93,,,,,,686,63,,86,98,99', +'75,76,77,9,58,699,698,,64,65,692,,,68,,66,67,69,30,31,73,74,,,,,,78', +'28,27,106,105,107,108,,,19,,,,,,8,46,7,10,110,109,111,100,57,102,101', +'103,,104,112,113,,96,97,42,43,41,,,,,,,,,,,,,,,,,,,,40,,,33,,,59,60', +',,61,,35,,,,45,,,,,,,,,20,,,,,94,84,87,88,,89,91,90,92,,,,,85,93,,,', +',,398,63,,86,98,99,75,76,77,,58,,,,64,65,,,,68,,66,67,69,30,31,73,74', +',,,,,78,28,27,106,105,107,108,,,19,,,,,,,46,,,110,109,111,100,57,102', +'101,103,,104,112,113,,96,97,42,43,41,,,,,,,,,,,,,,,,,,,,231,,,237,,', +'59,60,,,61,,,,,,45,,,,,,,,,20,,,,,94,84,87,88,,89,91,90,92,,,,,85,93', +',,,75,76,77,63,58,86,98,99,64,65,,,,68,,66,67,69,30,31,73,74,,,,,,78', +'28,27,106,105,107,108,,,19,,,,,,,46,,,110,109,111,100,57,102,101,103', +',104,112,113,,96,97,42,43,41,,,,,,,,,,,,,,,,,,,,231,,,237,,,59,60,,', +'61,,,,,,45,,,,,,,,,20,,,,,94,84,87,88,,89,91,90,92,,,,,85,93,,,,75,76', +'77,63,58,86,98,99,64,65,,,,68,,66,67,69,30,31,73,74,,,,,,78,28,27,106', +'105,107,108,,,19,,,,,,,46,,,110,109,111,100,57,102,101,103,,104,112', +'113,,96,97,42,43,41,,,,,,,,,,,,,,,,,,,,231,,,237,,,59,60,,,61,,,,,,45', +',,,,,,,,20,,,,,94,84,87,88,,89,91,90,92,,,,,85,93,,,,75,76,77,63,58', +'86,98,99,64,65,,,,68,,66,67,69,30,31,73,74,,,,,,78,28,27,106,105,107', +'108,,,19,,,,,,,46,,,110,109,111,100,57,102,101,103,,104,112,113,,96', +'97,42,43,41,,,,,,,,,,,,,,,,,,,,231,,,237,,,59,60,,,61,,,,,,45,,,,,,', +',,20,,,,,94,84,87,88,,89,91,90,92,,,,,85,93,,,,,,,63,,86,98,99,75,76', +'77,9,58,,,,64,65,,,,68,,66,67,69,30,31,73,74,,,,,,78,28,27,106,105,107', +'108,,,19,,,,,,8,46,,10,110,109,111,100,57,102,101,103,,104,112,113,', +'96,97,42,43,41,,,,,,,,,,,,,,,,,,,,40,,,33,,,59,60,,,61,,35,,,,45,,,', +',,,,,20,,,,,94,84,87,88,,89,91,90,92,,,,,85,93,,,,75,76,77,63,58,86', +'98,99,64,65,,,,68,,66,67,69,318,319,73,74,,,,,,78,315,321,106,105,107', +'108,,,238,,,,,,,46,,,110,109,111,100,57,102,101,103,,104,112,113,,96', +'97,42,43,41,,,,,,,,,,,,,,,,,,,,231,,,237,,,59,60,,,61,,641,,,,45,,,', +',,,,,236,,,,,94,84,87,88,,89,91,90,92,,,,,85,93,,,,75,76,77,63,58,86', +'98,99,64,65,,,,68,,66,67,69,30,31,73,74,,,,,,78,28,27,106,105,107,108', +',,19,,,,,,,46,,,110,109,111,100,57,102,101,103,,104,112,113,,96,97,42', +'43,41,,,,,,,,,,,,,,,,,,,,231,,,237,,,59,60,,,61,,,,,,45,,,,,,,,,20,', +',,,94,84,87,88,,89,91,90,92,,,,,85,93,,,,75,76,77,63,58,86,98,99,64', +'65,,,,68,,66,67,69,30,31,73,74,,,,,,78,28,27,106,105,107,108,,,238,', +',,,,,46,,,110,109,111,100,57,102,101,103,,104,112,113,,96,97,42,43,41', +',,,,,,,,,,,,,,,,,,,231,,,237,,,59,60,,,61,,414,,,,45,,,,,,,,,236,,,', +',94,84,87,88,,89,91,90,92,,,,,85,93,,,,75,76,77,63,58,86,98,99,64,65', +',,,68,,66,67,69,30,31,73,74,,,,,,78,28,27,106,105,107,108,,,238,,,,', +',,46,,,110,109,111,100,57,102,101,103,,104,112,113,,96,97,42,43,41,', +',,,,,,,,,,,,,,,,,,231,,,237,,,59,60,,,61,,414,,,,45,,,,,,,,,236,,,,', +'94,84,87,88,,89,91,90,92,,,,,85,93,,,,75,76,77,63,58,86,98,99,64,65', +',,,68,,66,67,69,30,31,73,74,,,,,,78,28,27,106,105,107,108,,,19,,,,,', +',46,,,110,109,111,100,57,102,101,103,,104,112,113,,96,97,42,43,41,,', +',,,,,,,,,,,,,,,,,231,,,237,,,59,60,,,61,,,,,,45,,,,,,,,,20,,,,,94,84', +'87,88,,89,91,90,92,,,,,85,93,,,,75,76,77,63,58,86,98,99,64,65,,,,68', +',66,67,69,30,31,73,74,,,,,,78,28,27,106,105,107,108,,,19,,,,,,,46,,', +'110,109,111,100,57,102,101,103,,104,112,113,,96,97,42,43,41,,,,,,,,', +',,,,,,,,,,,231,,,237,,,59,60,,,61,,,,,,45,,,,,,,,,20,,,,,94,84,87,88', +',89,91,90,92,,,,,85,93,,,,75,76,77,63,58,86,98,99,64,65,,,,68,,66,67', +'69,30,31,73,74,,,,,,78,28,27,106,105,107,108,,,238,,,,,,,46,,,110,109', +'111,100,57,102,101,103,,104,112,113,,96,97,42,43,41,,,,,,,,,,,,,,,,', +',,,231,,,237,,,59,60,,,61,,,,,,45,,,,,,,,,236,,,,,94,84,87,88,,89,91', +'90,92,,,,,85,93,,,,75,76,77,63,58,86,98,99,64,65,,,,68,,66,67,69,30', +'31,73,74,,,,,,78,28,27,106,105,107,108,,,238,,,,,,,46,,,110,109,111', +'100,57,102,101,103,293,104,112,113,,96,97,42,43,41,,,,,,,,,,,,,,,,,', +',,231,,,237,,,59,60,,,61,,290,,288,,45,,,294,,,,,,236,,,,,94,291,87', +'88,,89,91,90,92,,,,,85,93,,,,75,76,77,63,58,86,98,99,64,65,,,,68,,66', +'67,69,318,319,73,74,,,,,,78,315,321,106,105,107,108,,,238,,,,,,,46,', +',110,109,111,100,57,102,101,103,,104,112,113,,96,97,42,43,41,,,,,,,', +',,,,,,,,,,,,231,,,237,,,59,60,,,61,,,,,,45,,,,,,,,,236,,,,,94,84,87', +'88,,89,91,90,92,,,,,85,93,,,,75,76,77,63,58,86,98,99,64,65,,,,68,,66', +'67,69,30,31,73,74,,,,,,78,28,27,106,105,107,108,,,238,,,,,,,46,,,110', +'109,111,100,57,102,101,103,,104,112,113,,96,97,42,43,41,,,,,,,,,,,,', +',,,,,,,231,,,237,,,59,60,,,61,,,,,,45,,,,,,,,,236,,,,,94,84,87,88,,89', +'91,90,92,,,,,85,93,,,,75,76,77,63,58,86,98,99,64,65,,,,68,,66,67,69', +'30,31,73,74,,,,,,78,28,27,106,105,107,108,,,19,,,,,,,46,,,110,109,111', +'100,57,102,101,103,,104,112,113,,96,97,42,43,41,,,,,,,,,,,,,,,,,,,,231', +',,237,,,59,60,,,61,,,,,,45,,,,,,,,,20,,,,,94,84,87,88,,89,91,90,92,', +',,,85,93,,,,75,76,77,63,58,86,98,99,64,65,,,,68,,66,67,69,318,319,73', +'74,,,,,,78,315,321,106,105,107,108,,,238,,,,,,,316,,,110,109,111,100', +'57,102,101,103,,104,112,113,,96,97,,,322,,,,,,,,,,,,,,,,,,,,312,,,237', +',,59,60,,,61,,,683,,680,679,678,688,681,,,,,,,,,691,,94,84,87,88,,89', +'91,90,92,,,,,85,93,,,,516,,686,63,,86,98,99,75,76,77,,58,699,698,,64', +'65,692,,,68,,66,67,69,318,319,73,74,,,,,,78,315,321,106,105,107,108', +',,238,,,,,,,46,,,110,109,111,100,57,102,101,103,,104,112,113,,96,97', +'42,43,41,,,,,,,,,,,,,,,,,,,,231,,,237,,,59,60,,,61,,,,,,45,,,,,,,,,236', +',,,,94,84,87,88,,89,91,90,92,,,,,85,93,,,,75,76,77,63,58,86,98,99,64', +'65,,,,68,,66,67,69,318,319,73,74,,,,,,78,315,321,106,105,107,108,,,238', +',,,,,,46,,,110,109,111,100,57,102,101,103,,104,112,113,,96,97,42,43', +'41,,,,,,,,,,,,,,,,,,,,231,,,237,,,59,60,,,61,,414,,,,45,,,,,,,,,236', +',,,,94,84,87,88,,89,91,90,92,,,,,85,93,,,,75,76,77,63,58,86,98,99,64', +'65,,,,68,,66,67,69,318,319,73,74,,,,,,78,315,321,106,105,107,108,,,238', +',,,,,,316,,,110,109,111,100,57,102,101,103,,104,112,113,,96,97,,,322', +',,,,,,,,,,,,,,,,,,,312,,,308,,,59,60,,,61,,,,,,,,,,,,,,,,,,,,94,84,87', +'88,,89,91,90,92,,,,,85,93,,,,75,76,77,63,58,86,98,99,64,65,,,,68,,66', +'67,69,318,319,73,74,,,,,,78,315,321,106,105,107,108,,,238,,,,,,,316', +',,110,109,111,100,57,102,101,103,,104,112,113,,96,97,,,322,,,,,,,,,', +',,,,,,,,,,312,,,308,,,59,60,,,61,,,,,,,,,,,,,,,,,,,,94,84,87,88,,89', +'91,90,92,,,,,85,93,,,,75,76,77,63,58,86,98,99,64,65,,,,68,,66,67,69', +'318,319,73,74,,,,,,78,315,321,106,105,107,108,,,238,,,,,,,316,,,110', +'109,111,100,57,102,101,103,,104,112,113,,96,97,,,322,,,,,,,,,,,,,,,', +',,,,312,,,308,,,59,60,,,61,,,,,,,,,,,,,,,,,,,,94,84,87,88,,89,91,90', +'92,,,,,85,93,,,,75,76,77,63,58,86,98,99,64,65,,,,68,,66,67,69,318,319', +'73,74,,,,,,78,315,321,106,105,107,108,,,238,,,,,,,46,,,110,109,111,100', +'57,102,101,103,,104,112,113,,96,97,42,43,41,,,,,,,,,,,,,,,,,,,,231,', +',237,,,59,60,,,61,,,,,,45,,,,,,,,,236,,,,,94,84,87,88,,89,91,90,92,', +',,,85,93,,,,75,76,77,63,58,86,98,99,64,65,,,,68,,66,67,69,318,319,73', +'74,,,,,,78,315,321,106,105,107,108,,,238,,,,,,,46,,,110,109,111,100', +'57,102,101,103,,104,112,113,,96,97,42,43,41,,,,,,,,,,,,,,,,,,,,231,', +',237,,,59,60,,,61,,,,,,45,,,,,,,,,236,,,,,94,84,87,88,,89,91,90,92,', +',,,85,93,,,,75,76,77,63,58,86,98,99,64,65,,,,68,,66,67,69,318,319,73', +'74,,,,,,78,315,321,106,105,107,108,,,238,,,,,,,46,,,110,109,111,100', +'57,102,101,103,,104,112,113,,96,97,42,43,41,,,,,,,,,,,,,,,,,,,,231,', +',237,,,59,60,,,61,,,,,,45,,,,,,,,,236,,,,,94,84,87,88,,89,91,90,92,', +',,,85,93,,,,75,76,77,63,58,86,98,99,64,65,,,,68,,66,67,69,318,319,73', +'74,,,,,,78,315,321,106,105,107,108,,,238,,,,,,,46,,,110,109,111,100', +'57,102,101,103,,104,112,113,,96,97,42,43,41,,,,,,,,,,,,,,,,,,,,231,', +',237,533,,59,60,,,61,,,,,,45,,,,,,,,,236,,,,,94,84,87,88,,89,91,90,92', +',,,,85,93,,,,75,76,77,63,58,86,98,99,64,65,,,,68,,66,67,69,30,31,73', +'74,,,,,,78,28,27,106,105,107,108,,,238,,,,,,,46,,,110,109,111,100,57', +'102,101,103,,104,112,113,,96,97,42,43,41,,,,,,,,,,,,,,,,,,,,231,,,237', +',,59,60,,,61,,,,,,45,,,,,,,,,236,,,,,94,84,87,88,,89,91,90,92,,,,,85', +'93,,,,75,76,77,63,58,86,98,99,64,65,,,,68,,66,67,69,30,31,73,74,,,,', +',78,28,27,106,105,107,108,,,238,,,,,,,46,,,110,109,111,100,57,102,101', +'103,,104,112,113,,96,97,42,43,41,,,,,,,,,,,,,,,,,,,,231,,,237,,,59,60', +',,61,,,,,,45,,,,,,,,,236,,,,,94,84,87,88,,89,91,90,92,,,,,85,93,,,,75', +'76,77,63,58,86,98,99,64,65,,,,68,,66,67,69,30,31,73,74,,,,,,78,28,27', +'106,105,107,108,,,238,,,,,,,46,,,110,109,111,100,57,102,101,103,,104', +'112,113,,96,97,42,43,41,,,,,,,,,,,,,,,,,,,,231,,,237,,,59,60,,,61,,', +',,,45,,,,,,,,,236,,,,,94,84,87,88,,89,91,90,92,,,,,85,93,,,,75,76,77', +'63,58,86,98,99,64,65,,,,68,,66,67,69,30,31,73,74,,,,,,78,28,27,106,105', +'107,108,,,238,,,,,,,46,,,110,109,111,100,57,102,101,103,,104,112,113', +',96,97,42,43,41,,,,,,,,,,,,,,,,,,,,231,,,237,,,59,60,,,61,,,,,,45,,', +',,,,,,236,,,,,94,84,87,88,,89,91,90,92,,,,,85,93,,,,75,76,77,63,58,86', +'98,99,64,65,,,,68,,66,67,69,318,319,73,74,,,,,,78,315,321,106,105,107', +'108,,,238,,,,,,,46,,,110,109,111,100,57,102,101,103,293,104,112,113', +',96,97,42,43,41,,,,,,,,,,,,,,,,,,,,231,,,237,,,59,60,,,61,,,,288,,45', +',,294,,,,,,236,,,,,94,291,87,88,,89,91,90,92,,,,,85,93,,,,75,76,77,63', +'58,86,98,99,64,65,,,,68,,66,67,69,318,319,73,74,,,,,,78,315,321,106', +'105,107,108,,,238,,,,,,,46,,,110,109,111,100,57,102,101,103,293,104', +'112,113,,96,97,42,43,41,,,,,,,,,,,,,,,,,,,,231,,,237,,,59,60,,,61,,641', +',288,,45,,,294,,,,,,236,,,,,94,291,87,88,,89,91,90,92,,,,,85,93,,,,75', +'76,77,63,58,86,98,99,64,65,,,,68,,66,67,69,318,319,73,74,,,,,,78,315', +'321,106,105,107,108,,,238,,,,,,,46,,,110,109,111,100,57,102,101,103', +',104,112,113,,96,97,42,43,41,,,,,,,,,,,,,,,,,,,,231,,,237,,,59,60,,', +'61,,,,,,45,,,,,,,,,236,,,,,94,84,87,88,,89,91,90,92,,,,,85,93,,,,,,', +'63,,86,98,99,75,76,77,9,58,,,,64,65,,,,68,,66,67,69,30,31,73,74,,,,', +',78,28,27,106,105,107,108,,,19,,,,,,8,46,,10,110,109,111,100,57,102', +'101,103,,104,112,113,,96,97,42,43,41,,,,,,,,,,,,,,,,,,,,40,,,33,,,59', +'60,,,61,,35,,,,45,,,,,,,,,20,,,,,94,84,87,88,,89,91,90,92,,,,,85,93', +',,,75,76,77,63,58,86,98,99,64,65,,,,68,,66,67,69,30,31,73,74,,,,,,78', +'28,27,106,105,107,108,,,238,,,,,,,46,,,110,109,111,100,57,102,101,103', +'293,104,112,113,,96,97,42,43,41,,,,,,,,,,,,,,,,,,,,231,,,237,,,59,60', +',,61,,290,,288,,45,,,294,,,,,,236,,,,,94,291,87,88,,89,91,90,92,,,,', +'85,93,,,,75,76,77,63,58,86,98,99,64,65,,,,68,,66,67,69,30,31,73,74,', +',,,,78,28,27,106,105,107,108,,,19,,,,,,,46,,,110,109,111,100,57,102', +'101,103,,104,112,113,,96,97,42,43,41,,,,,,,,,,,,,,,,,,,,231,,,237,,', +'59,60,,,61,,,,,,45,,,,,,,,,20,,,,,94,84,87,88,,89,91,90,92,,,,,85,93', +',,,75,76,77,63,58,86,98,99,64,65,,,,68,,66,67,69,30,31,73,74,,,,,,78', +'28,27,106,105,107,108,,,238,,,,,,,46,,,110,109,111,100,57,102,101,103', +',104,112,113,,96,97,42,43,41,,,,,,,,,,,,,,,,,,,,231,,,237,,,59,60,,', +'61,,,,,,45,,,,,,,,,236,,,,,94,84,87,88,,89,91,90,92,,,,,85,93,,,,75', +'76,77,63,58,86,98,99,64,65,,,,68,,66,67,69,318,319,73,74,,,,,,78,315', +'321,106,105,107,108,,,238,,,,,,,46,,,110,109,111,100,57,102,101,103', +',104,112,113,,96,97,42,43,41,,,,,,,,,,,,,,,,,,,,231,,,237,,,59,60,,', +'61,,745,,,,45,,,,,,,,,236,,,,,94,84,87,88,,89,91,90,92,,,,,85,93,,,', +'75,76,77,63,58,86,98,99,64,65,,,,68,,66,67,69,30,31,73,74,,,,,,78,28', +'27,106,105,107,108,,,238,,,,,,,46,,,110,109,111,100,57,102,101,103,293', +'104,112,113,,96,97,42,43,41,,,,,,,,,,,,,,,,,,,,231,,,237,,,59,60,,,61', +',290,,288,,45,,,294,,,,,,236,,,,,94,291,87,88,,89,91,90,92,,,,,85,93', +',,,75,76,77,63,58,86,98,99,64,65,,,,68,,66,67,69,30,31,73,74,,,,,,78', +'28,27,106,105,107,108,,,238,,,,,,,46,,,110,109,111,100,57,102,101,103', +'293,104,112,113,,96,97,42,43,41,,,,,,,,,,,,,,,,,,,,231,,,237,,,59,60', +',,61,,290,,288,,45,,,294,,,,,,236,,,,,94,291,87,88,,89,91,90,92,,,,', +'85,93,,,,75,76,77,63,58,86,98,99,64,65,,,,68,,66,67,69,30,31,73,74,', +',,,,78,28,27,106,105,107,108,,,19,,,,,,,46,,,110,109,111,100,57,102', +'101,103,,104,112,113,,96,97,42,43,41,,,,,,,,,,,,,,,,,,,,231,,,237,,', +'59,60,,,61,,,,,,45,,,,,,,,,20,,,,,94,84,87,88,,89,91,90,92,,,,,85,93', +',,,75,76,77,63,58,86,98,99,64,65,,,,68,,66,67,69,318,319,73,74,,,,,', +'78,315,321,106,105,107,108,,,238,,,,,,,46,,,110,109,111,100,57,102,101', +'103,,104,112,113,,96,97,42,43,41,,,,,,,,,,,,,,,,,,,,231,,,237,,,59,60', +',,61,,290,,,,45,,,,,,,,,236,,,,,94,84,87,88,,89,91,90,92,,,,,85,93,', +',,75,76,77,63,58,86,98,99,64,65,,,,68,,66,67,69,318,319,73,74,,,,,,78', +'315,321,106,105,107,108,,,238,,,,,,,46,,,110,109,111,100,57,102,101', +'103,293,104,112,113,,96,97,42,43,41,,,,,,,,,,,,,,,,,,,,231,,,237,,,59', +'60,,,61,,641,,,,45,,,294,,,,,,236,,,,,94,291,87,88,,89,91,90,92,,,,', +'85,93,,,,75,76,77,63,58,86,98,99,64,65,,,,68,,66,67,69,30,31,73,74,', +',,,,78,28,27,106,105,107,108,,,19,,,,,,,46,,,110,109,111,100,57,102', +'101,103,,104,112,113,,96,97,42,43,41,,,,,,,,,,,,,,,,,,,,231,,,237,,', +'59,60,,,61,,,,,,45,,,,,,,,,20,,,,,94,84,87,88,,89,91,90,92,,,,,85,93', +',,,75,76,77,63,58,86,98,99,64,65,,,,68,,66,67,69,318,319,73,74,,,,,', +'78,315,321,106,105,107,108,,,238,,,,,,,46,,,110,109,111,100,57,102,101', +'103,,104,112,113,,96,97,42,43,41,,,,,,,,,,,,,,,,,,,,231,,,237,,,59,60', +',,61,,,,,,45,,,,,,,,,236,,,,,94,84,87,88,,89,91,90,92,,,,,85,93,,,,75', +'76,77,63,58,86,98,99,64,65,,,,68,,66,67,69,318,319,73,74,,,,,,78,315', +'321,106,105,107,108,,,238,,,,,,,46,,,110,109,111,100,57,102,101,103', +',104,112,113,,96,97,42,43,41,,,,,,,,,,,,,,,,,,,,231,,,237,,,59,60,,', +'61,,,,,,45,,,,,,,,,236,,,,,94,84,87,88,,89,91,90,92,,,,,85,93,,,,75', +'76,77,63,58,86,98,99,64,65,,,,68,,66,67,69,318,319,73,74,,,,,,78,315', +'321,106,105,107,108,,,238,,,,,,,316,,,110,109,111,100,57,102,101,103', +',104,112,113,,96,97,,,322,,,,,,,,,,,,,,,,,,,,312,,,308,,,59,60,,,61', +',,,,,,,,,,,,,,,,,,,94,84,87,88,,89,91,90,92,,,,,85,93,,,,75,76,77,63', +'58,86,98,99,64,65,,,,68,,66,67,69,30,31,73,74,,,,,,78,28,27,106,105', +'107,108,,,19,,,,,,,46,,,110,109,111,100,57,102,101,103,,104,112,113', +',96,97,42,43,41,,,,,,,,,,,,,,,,,,,,231,,,237,,,59,60,,,61,,,,,,45,,', +',,,,,,20,,,,,94,84,87,88,,89,91,90,92,,,,,85,93,,,,75,76,77,63,58,86', +'98,99,64,65,,,,68,,66,67,69,30,31,73,74,,,,,,78,28,27,106,105,107,108', +',,238,,,,,,,46,,,110,109,111,100,57,102,101,103,293,104,112,113,,96', +'97,42,43,41,,,,,,,,,,,,,,,,,,,,231,,,237,,,59,60,,,61,,290,,288,,45', +',,294,,,,,,236,,,,,94,291,87,88,,89,91,90,92,,,,,85,93,,,,75,76,77,63', +'58,86,98,99,64,65,,,,68,,66,67,69,318,319,73,74,,,,,,78,315,321,106', +'105,107,108,,,238,,,,,,,316,,,110,109,111,100,57,102,101,103,,104,112', +'113,,96,97,,,322,,,,,,,,,,,,,,,,,,,,312,,,308,,,59,60,,,61,,,683,,680', +'679,678,688,681,,,,,,,,,691,,94,84,87,88,,89,91,90,92,,,,,85,93,,,,', +',686,63,,86,98,99,75,76,77,9,58,699,698,,64,65,692,,,68,,66,67,69,30', +'31,73,74,,,,,,78,28,27,106,105,107,108,,,19,,,,,,8,46,301,10,110,109', +'111,100,57,102,101,103,,104,112,113,,96,97,42,43,41,,,,,,,,,,,,,,,,', +',,,40,,,33,,,59,60,,,61,,35,,,,45,,,,,,,,,20,,,,,94,84,87,88,,89,91', +'90,92,,,,,85,93,,,,,,398,63,,86,98,99,75,76,77,,58,,,,64,65,,,,68,,66', +'67,69,318,319,73,74,,,,,,78,315,321,106,105,107,108,,,238,,,,,,,46,', +',110,109,111,100,57,102,101,103,,104,112,113,,96,97,42,43,41,,,,,,,', +',,,,,,,,,,,,231,,,237,,,59,60,,,61,,,,,,45,,,,,,,,,236,,,,,94,84,87', +'88,,89,91,90,92,,,,,85,93,,,,75,76,77,63,58,86,98,99,64,65,,,,68,,66', +'67,69,318,319,73,74,,,,,,78,315,321,106,105,107,108,,,238,,,,,,,46,', +',110,109,111,100,57,102,101,103,293,104,112,113,,96,97,42,43,41,,,,', +',,,,,,,,,,,,,,,231,,,237,,,59,60,,,61,,,,288,,45,,,294,,,,,,236,,,,', +'94,291,87,88,,89,91,90,92,,,,,85,93,,,,75,76,77,63,58,86,98,99,64,65', +',,,68,,66,67,69,318,319,73,74,,,,,,78,315,321,106,105,107,108,,,238', +',,,,,,46,,,110,109,111,100,57,102,101,103,293,104,112,113,,96,97,42', +'43,41,,,,,,,,,,,,,,,,,,,,231,,,237,,,59,60,,,61,,641,,288,,45,,,294', +',,,,,236,,,,,94,291,87,88,,89,91,90,92,,,,,85,93,,,,75,76,77,63,58,86', +'98,99,64,65,,,,68,,66,67,69,318,319,73,74,,,,,,78,315,321,106,105,107', +'108,,,238,,,,,,,46,,,110,109,111,100,57,102,101,103,,104,112,113,,96', +'97,42,43,41,,,,,,,,,,,,,,,,,,,,231,,,237,,,59,60,,,61,,,,,,45,,,,,,', +',,236,,,,,94,84,87,88,,89,91,90,92,,,,,85,93,,,,75,76,77,63,58,86,98', +'99,64,65,,,,68,,66,67,69,318,319,73,74,,,,,,78,315,321,106,105,107,108', +',,238,,,,,,,46,,,110,109,111,100,57,102,101,103,,104,112,113,,96,97', +'42,43,41,,,,,,,,,,,,,,,,,,,,231,,,237,,,59,60,,,61,,,,,,45,,,,,,,,,236', +',,,,94,84,87,88,,89,91,90,92,,,,,85,93,,,,75,76,77,63,58,86,98,99,64', +'65,,,,68,,66,67,69,318,319,73,74,,,,,,78,315,321,106,105,107,108,,,238', +',,,,,,46,,,110,109,111,100,57,102,101,103,,104,112,113,,96,97,42,43', +'41,,,,,,,,,,,,,,,,,,,,231,,,237,,,59,60,,,61,,,,,,45,,,,,,,,,236,,,', +',94,84,87,88,,89,91,90,92,,,,,85,93,,,,75,76,77,63,58,86,98,99,64,65', +',,,68,,66,67,69,30,31,73,74,,,,,,78,28,27,106,105,107,108,,,238,,,,', +',,46,,,110,109,111,100,57,102,101,103,293,104,112,113,,96,97,42,43,41', +',,,,,,,,,,,,,,,,,,,231,,,237,,,59,60,,,61,,290,,288,,45,,,294,,,,,,236', +',,,,94,291,87,88,,89,91,90,92,,,,,85,93,,,,75,76,77,63,58,86,98,99,64', +'65,,,,68,,66,67,69,318,319,73,74,,,,,,78,315,321,106,105,107,108,,,238', +',,,,,,46,,,110,109,111,100,57,102,101,103,,104,112,113,,96,97,42,43', +'41,,,,,,,,,,,,,,,,,,,,231,,,237,,,59,60,,,61,,,,,,45,,,,,,,,,236,,,', +',94,84,87,88,,89,91,90,92,,,,,85,93,,,,,,,63,,86,98,99,179,190,180,203', +'176,196,186,185,206,207,201,184,183,178,204,208,209,188,177,191,195', +'197,189,182,,,,198,205,200,199,192,202,187,175,194,193,,,,,,174,181', +'172,173,169,170,171,130,132,,,131,,,,,,,,163,164,,160,142,143,144,151', +'148,150,,,145,146,,,,165,166,152,153,,,,,,,,,,,,,,157,156,,141,162,159', +'158,167,154,155,149,147,139,161,140,,,168,94,,,,,,,,,,,,,,93,179,190', +'180,203,176,196,186,185,206,207,201,184,183,178,204,208,209,188,177', +'191,195,197,189,182,,,,198,205,200,199,192,202,187,175,194,193,,,,,', +'174,181,172,173,169,170,171,130,132,,,131,,,,,,,,163,164,,160,142,143', +'144,151,148,150,,,145,146,,,,165,166,152,153,,,,,,,,,,,,,,157,156,,141', +'162,159,158,167,154,155,149,147,139,161,140,,,168,94,,,,,,,,,,,,,,93', +'179,190,180,203,176,196,186,185,206,207,201,184,183,178,204,208,209', +'188,177,191,195,197,189,182,,,,198,205,200,199,192,202,187,175,194,193', +',,,,,174,181,172,173,169,170,171,130,132,,,131,,,,,,,,163,164,,160,142', +'143,144,151,148,150,,,145,146,,,,165,166,152,153,,,,,,,,,,,,,,157,156', +',141,162,159,158,167,154,155,149,147,139,161,140,,,168,94,,,,,,,,,,', +',,,93,179,190,180,203,176,196,186,185,206,207,201,184,183,178,204,208', +'209,188,177,191,195,197,189,182,,,,198,205,200,199,192,202,187,175,194', +'193,,,,,,174,181,172,173,169,170,171,130,132,129,,131,,,,,,,,163,164', +',160,142,143,144,151,148,150,,,145,146,,,,165,166,152,153,,,,,,,,,,', +',,,157,156,,141,162,159,158,167,154,155,149,147,139,161,140,,,168,94', +',,,,,,,,,,,,,93,179,190,180,203,176,196,186,185,206,207,201,184,183', +'178,204,208,209,188,177,191,195,197,189,182,,,,198,205,200,381,380,382', +'379,175,194,193,,,,,,174,181,172,173,376,377,378,374,132,102,101,375', +',104,,,,,,163,164,,160,142,143,144,151,148,150,,,145,146,,,,165,166', +'152,153,,,,,,386,,,,,,,,157,156,,141,162,159,158,167,154,155,149,147', +'139,161,140,,,168,179,190,180,203,176,196,186,185,206,207,201,184,183', +'178,204,208,209,188,177,191,195,197,189,182,,,,198,205,200,199,192,202', +'187,175,194,193,,,,,,174,181,172,173,169,170,171,130,132,,,131,,,,,', +',,163,164,,160,142,143,144,151,148,150,,,145,146,,,,165,166,152,153', +',,,,,,,,,,,,,157,156,,141,162,159,158,167,154,155,149,147,139,161,140', +'622,440,168,,623,,,,,,,,163,164,,160,142,143,144,151,148,150,,,145,146', +',,,165,166,152,153,,,,,,272,,,,,,,,157,156,,141,162,159,158,167,154', +'155,149,147,139,161,140,715,447,168,,716,,,,,,,,163,164,,160,142,143', +'144,151,148,150,,,145,146,,,,165,166,152,153,,,,,,272,,,,,,,,157,156', +',141,162,159,158,167,154,155,149,147,139,161,140,750,447,168,,749,,', +',,,,,163,164,,160,142,143,144,151,148,150,,,145,146,,,,165,166,152,153', +',,,,,272,,,,,,,,157,156,,141,162,159,158,167,154,155,149,147,139,161', +'140,747,440,168,,748,,,,,,,,163,164,,160,142,143,144,151,148,150,,,145', +'146,,,,165,166,152,153,,,,,,272,,,,,,,,157,156,,141,162,159,158,167', +'154,155,149,147,139,161,140,436,440,168,,437,,,,,,,,163,164,,160,142', +'143,144,151,148,150,,,145,146,,,,165,166,152,153,,,,,,272,,,,,,,,157', +'156,,141,162,159,158,167,154,155,149,147,139,161,140,487,440,168,,488', +',,,,,,,163,164,,160,142,143,144,151,148,150,,,145,146,,,,165,166,152', +'153,,,,,,,,,,,,,,157,156,,141,162,159,158,167,154,155,149,147,139,161', +'140,443,447,168,,442,,,,,,,,163,164,,160,142,143,144,151,148,150,,,145', +'146,,,,165,166,152,153,,,,,,272,,,,,,,,157,156,,141,162,159,158,167', +'154,155,149,147,139,161,140,624,447,168,,625,,,,,,,,163,164,,160,142', +'143,144,151,148,150,,,145,146,,,,165,166,152,153,,,,,,272,,,,,,,,157', +'156,,141,162,159,158,167,154,155,149,147,139,161,140,622,440,168,,623', +',,,,,,,163,164,,160,142,143,144,151,148,150,,,145,146,,,,165,166,152', +'153,,,,,,272,,,,,,,,157,156,,141,162,159,158,167,154,155,149,147,139', +'161,140,1007,447,168,,1008,,,,,,,,163,164,,160,142,143,144,151,148,150', +',,145,146,,,,165,166,152,153,,,,,,272,,,,,,,,157,156,,141,162,159,158', +'167,154,155,149,147,139,161,140,487,440,168,,488,,,,,,,,163,164,,160', +'142,143,144,151,148,150,,,145,146,,,,165,166,152,153,,,,,,272,,,,,,', +',157,156,,141,162,159,158,167,154,155,149,147,139,161,140,718,447,168', +',719,,,,,,,,163,164,,160,142,143,144,151,148,150,,,145,146,,,,165,166', +'152,153,,,,,,272,,,,,,,,157,156,,141,162,159,158,167,154,155,149,147', +'139,161,140,1005,440,168,,1006,,,,,,,,163,164,,160,142,143,144,151,148', +'150,,,145,146,,,,165,166,152,153,,,,,,272,,,,,,,,157,156,,141,162,159', +'158,167,154,155,149,147,139,161,140,1002,447,168,,1001,,,,,,,,163,164', +',160,142,143,144,151,148,150,,,145,146,,,,165,166,152,153,,,,,,272,', +',,,,,,157,156,,141,162,159,158,167,154,155,149,147,139,161,140,651,440', +'168,,652,,,,,,,,163,164,,160,142,143,144,151,148,150,,,145,146,,,,165', +'166,152,153,,,,,,272,,,,,,,,157,156,,141,162,159,158,167,154,155,149', +'147,139,161,140,654,447,168,,655,,,,,,,,163,164,,160,142,143,144,151', +'148,150,,,145,146,,,,165,166,152,153,,,,,,272,,,,,,,,157,156,,141,162', +'159,158,167,154,155,149,147,139,161,140,713,440,168,,714,,,,,,,,163', +'164,,160,142,143,144,151,148,150,,,145,146,,,,165,166,152,153,,,,,,272', +',,,,,,,157,156,,141,162,159,158,167,154,155,149,147,139,161,140,624', +'447,168,,625,,,,,,,,163,164,,160,142,143,144,151,148,150,,,145,146,', +',,165,166,152,153,,,,,,272,,,,,,,,157,156,,141,162,159,158,167,154,155', +'149,147,139,161,140,,683,168,680,679,678,688,681,,683,,680,679,678,688', +'681,691,,,,,,,,691,,683,,680,679,678,688,681,,,,,,686,,,691,,,,,686', +'696,695,699,698,,,,692,696,695,699,698,,,,692,686,,683,,680,679,678', +'688,681,696,695,699,698,,,,692,691,,683,,680,679,678,688,681,,683,,680', +'679,678,688,681,691,,,,,686,,,691,,,,,,696,695,699,698,,,,692,686,,', +',,,,,686,696,695,699,698,,,,692,696,695,699,698,,,683,692,680,679,678', +'688,681,,683,,680,679,678,688,681,691,,,,,,,,691,,683,,680,679,678,688', +'681,,,,,,686,,,691,,,,,686,,,699,698,,,,692,696,695,699,698,,,,692,686', +',683,,680,679,678,688,681,,,699,698,,,,692,691,,683,,680,679,678,688', +'681,683,,680,679,678,688,681,,691,,,,,686,,691,,683,,680,679,678,688', +'681,699,698,,,,692,686,,691,,,,,686,,,,699,698,,,,692,,699,698,,,,692', +'686,,683,,680,679,678,688,681,696,695,699,698,,,,692,691,,683,,680,679', +'678,688,681,683,,680,679,678,688,681,,691,,,,,686,669,691,,,,,,,696', +'695,699,698,,,,692,686,,,,,,,686,,696,695,699,698,,,,692,,699,698,,', +',692' ] + racc_action_table = arr = ::Array.new(24631, nil) + idx = 0 + clist.each do |str| + str.split(',', -1).each do |i| + arr[idx] = i.to_i unless i.empty? + idx += 1 + end + end + +clist = [ +'624,747,894,575,575,561,714,624,624,624,19,348,624,624,624,773,624,62', +'711,798,464,646,347,393,635,624,624,624,624,355,365,646,1017,394,365', +'359,624,624,1025,624,624,624,624,624,1005,926,1006,976,929,1020,773', +'19,464,1021,452,452,464,464,747,635,661,661,1022,828,356,713,624,624', +'624,624,624,624,624,624,624,624,624,624,624,624,837,1008,624,624,624', +'837,624,624,868,393,624,925,715,624,624,1023,624,575,624,394,624,1,624', +'624,62,624,624,624,624,624,749,624,624,624,561,714,552,749,749,749,894', +'1007,1026,749,749,894,749,624,798,348,624,624,624,624,348,624,711,624', +'355,711,347,711,624,624,359,347,749,749,452,749,749,749,749,749,661', +'631,1025,715,1008,716,651,1025,1005,926,1006,976,929,1005,926,1006,976', +'929,828,356,713,1027,749,749,749,749,749,749,749,749,749,749,749,749', +'749,749,317,421,749,749,749,384,749,434,1007,1008,749,715,384,749,1008', +'1034,868,787,749,925,749,868,749,749,925,749,749,749,749,749,552,749', +'443,749,716,552,651,232,841,443,443,443,41,41,435,443,443,749,443,1007', +'749,749,631,749,1007,749,229,443,421,571,571,352,749,749,317,364,352', +'26,443,443,384,443,443,443,443,443,651,969,716,651,897,832,897,787,969', +'504,832,317,432,651,654,322,322,969,232,841,346,346,443,443,443,443', +'443,443,443,443,443,443,443,443,443,443,422,229,443,443,443,364,443', +'230,41,41,443,787,364,443,787,718,586,364,443,26,443,364,443,443,787', +'443,443,443,443,443,969,443,443,443,652,987,987,504,504,504,364,571', +'26,654,654,444,571,443,388,418,443,443,750,443,504,443,415,322,322,750', +'750,750,443,443,230,750,750,718,750,946,364,946,946,946,718,946,770', +'750,454,718,586,586,588,718,654,701,701,654,750,750,586,750,750,750', +'750,750,297,654,3,413,652,297,718,3,815,410,815,815,815,24,815,404,388', +'388,388,748,24,466,750,750,750,750,750,750,750,750,750,750,750,750,750', +'750,718,770,750,750,750,467,750,468,652,469,750,652,395,750,588,588', +'391,326,750,946,750,652,750,750,588,750,750,750,750,750,442,750,750', +'750,622,491,607,442,442,442,748,495,24,442,442,342,442,750,342,965,750', +'750,965,750,815,750,339,338,363,339,338,623,750,750,326,511,442,442', +'17,442,442,442,442,442,326,512,395,395,395,367,391,391,391,607,667,382', +'367,667,515,458,517,622,382,607,522,367,442,442,442,442,442,442,442', +'442,442,442,442,442,442,442,363,525,442,442,442,17,442,363,623,534,442', +'392,363,442,389,17,363,390,442,535,442,536,442,442,537,442,442,442,442', +'442,100,442,549,442,367,363,458,100,100,100,382,553,100,100,100,564', +'100,442,44,44,442,442,564,442,100,442,100,100,100,14,14,564,442,442', +'554,363,100,100,555,100,100,100,100,100,556,392,392,392,389,389,389', +'390,390,390,44,44,129,381,380,803,803,129,129,369,381,380,100,100,100', +'100,100,100,100,100,100,100,100,100,100,100,564,357,100,100,100,228', +'100,100,357,360,100,358,228,100,100,573,100,357,100,583,100,228,100', +'100,591,100,100,100,100,100,379,100,103,100,593,354,599,379,353,103', +'103,103,381,380,103,103,103,100,103,343,100,100,100,100,608,100,103', +'100,103,103,103,341,100,100,82,340,357,613,103,103,228,103,103,103,103', +'103,82,47,336,618,330,328,378,377,47,376,82,626,328,378,377,627,376', +'47,628,379,630,328,103,103,103,103,103,103,103,103,103,103,103,103,103', +'103,634,521,103,103,103,921,103,103,521,636,103,638,921,103,103,640', +'103,521,103,327,103,921,103,103,323,103,103,103,103,103,47,103,625,103', +'328,378,377,648,376,625,625,625,650,321,625,625,625,103,625,653,103', +'103,103,103,656,103,657,103,625,625,625,316,103,103,660,315,521,662', +'625,625,921,625,625,625,625,625,437,927,671,16,672,313,375,374,927,674', +'16,675,313,375,374,676,685,927,312,16,693,313,625,625,625,625,625,625', +'625,625,625,625,625,625,625,625,697,700,625,625,625,703,625,625,420', +'709,625,437,436,625,625,420,625,712,625,306,625,437,625,625,420,625', +'625,625,625,625,927,625,16,625,313,375,374,305,947,304,947,947,947,302', +'947,39,721,625,301,38,625,625,625,625,725,625,289,625,447,436,286,744', +'625,625,285,447,447,447,800,436,447,447,447,420,447,947,746,271,800', +'755,238,479,234,447,447,447,447,1000,233,1000,1000,1000,39,1000,447', +'447,38,447,447,447,447,447,39,655,231,776,38,311,786,790,655,800,800', +'479,311,655,800,479,479,655,479,479,793,311,447,447,447,447,447,447', +'447,447,447,447,447,447,447,447,794,310,447,447,447,799,814,447,310', +'816,447,821,210,447,447,824,447,310,447,114,447,829,447,447,831,447', +'447,447,447,447,655,447,447,447,311,835,836,839,309,840,812,46,812,812', +'812,309,812,447,849,850,447,447,447,447,309,447,448,447,852,853,854', +'908,447,448,448,448,310,856,448,448,448,908,448,857,858,480,859,812', +'40,874,875,448,448,448,448,919,812,919,919,919,879,919,448,448,880,448', +'448,448,448,448,882,719,883,309,908,908,885,480,719,908,888,480,480', +'719,480,480,890,719,37,901,905,918,448,448,448,448,448,448,448,448,448', +'448,448,448,448,448,922,22,448,448,448,928,948,448,15,955,448,958,465', +'448,448,959,448,960,448,961,448,963,448,448,972,448,448,448,448,448', +'719,448,448,448,686,13,686,686,686,889,686,889,889,889,465,889,12,448', +'465,465,448,448,448,448,977,448,57,448,978,979,980,981,448,57,57,57', +'982,983,57,57,57,686,57,531,985,988,889,1001,1002,1004,686,10,57,57', +'57,889,7,,,531,531,,57,57,,57,57,57,57,57,891,,891,891,891,531,891,531', +',531,531,,531,531,,,531,,531,,,,57,57,57,57,57,57,57,57,57,57,57,57', +'57,57,,891,57,57,57,,,57,,,57,,,57,57,,57,,57,,57,,57,57,,57,57,57,57', +'57,,57,,57,579,579,,,579,579,579,,1016,,1016,1016,1016,57,1016,,57,57', +'57,57,,57,486,57,,,,,57,486,486,486,,,486,486,486,779,486,779,779,779', +'779,779,,1016,,486,486,,,,779,,,484,,,486,486,,486,486,486,486,486,335', +'335,335,335,335,484,484,,779,6,6,6,6,6,,,,779,779,779,779,484,,484,779', +'484,484,,484,484,,,484,486,484,27,,,,,486,,27,27,27,486,486,27,27,27', +'779,27,984,,984,984,984,,984,,27,27,27,300,300,300,300,300,486,486,', +'27,27,,27,27,27,27,27,,,,,486,,,486,,,984,986,486,986,986,986,,986,', +'486,,,27,27,27,27,27,27,27,27,27,27,27,27,27,27,,,27,27,27,,,27,,27', +'27,,986,27,27,,27,,27,,27,,27,27,,27,27,27,27,27,28,27,27,27,,,,28,28', +'28,,,28,28,28,,28,27,471,,27,27,,27,,27,28,28,,,,,27,,471,471,28,28', +',28,28,28,28,28,509,509,509,509,509,,471,,471,,471,471,,471,471,,,,', +',,,28,28,28,28,28,28,28,28,28,28,28,28,28,28,,,28,28,28,,,28,,28,28', +',,28,28,,28,,28,,28,,28,28,,28,28,28,28,28,,28,438,28,,,,,,438,438,438', +',,438,438,438,28,438,472,28,28,,28,,28,,438,438,438,,,28,,,472,472,', +'438,438,,438,438,438,438,438,,,,,,472,,,,472,472,,472,472,,,,,,,,,438', +'438,438,438,438,438,438,438,438,438,438,438,438,438,,,438,438,438,,', +'438,,438,438,,,438,438,,438,,438,,438,,438,438,,438,438,438,438,438', +',438,438,438,,,,,,,,,,,,,,438,,,438,438,,438,,438,551,551,551,551,551', +'551,438,,,551,551,,,,551,,551,551,551,551,551,551,551,,,,,,551,551,551', +'551,551,551,551,,,551,,,,,425,551,551,551,551,551,551,551,551,551,551', +'551,551,,551,551,551,,551,551,551,551,551,425,425,425,425,425,425,425', +'425,425,425,425,,425,425,,,425,425,,551,,,551,,,551,551,,,551,,551,425', +',425,551,425,425,,425,425,425,425,425,551,425,,,,551,551,551,551,,551', +'551,551,551,,,,,551,551,,425,,425,,,551,,551,551,551,0,0,0,0,0,0,,,', +'0,0,,,,0,,0,0,0,0,0,0,0,,,,,,0,0,0,0,0,0,0,,,0,,,,,431,0,0,0,0,0,0,0', +'0,0,0,0,0,,0,0,0,,0,0,0,0,0,431,431,431,431,431,431,431,431,431,431', +'431,,431,431,,,431,431,,0,,,0,,,0,0,,,0,,0,431,,431,0,431,431,,431,431', +'431,431,431,0,431,,,,0,0,0,0,,0,0,0,0,,,,,0,0,,431,,,,,0,,0,0,0,308', +'308,308,308,308,308,,,,308,308,,,,308,,308,308,308,308,308,308,308,', +',,,,308,308,308,308,308,308,308,,,308,,,,,,308,308,308,308,308,308,308', +'308,308,308,308,308,,308,308,308,,308,308,308,308,308,283,283,283,283', +'283,283,283,283,283,283,283,,283,283,,,283,283,,308,,,308,,,308,308', +',,308,,308,283,,283,308,283,283,,283,283,283,283,283,308,283,,,,308', +'308,308,308,,308,308,308,308,,,,,308,308,,283,,,,,308,,308,308,308,572', +'572,572,572,572,572,,,,572,572,,,,572,,572,572,572,572,572,572,572,', +',,,,572,572,572,572,572,572,572,,,572,,,,,,572,572,572,572,572,572,572', +'572,572,572,572,572,,572,572,572,,572,572,572,572,572,752,752,752,752', +'752,752,752,752,752,752,752,,752,752,,,752,752,,572,,,572,,,572,572', +',,572,,572,752,,752,572,752,752,,752,752,752,752,752,572,752,,,,572', +'572,572,572,,572,572,572,572,,,,,572,572,,752,,,,,572,,572,572,572,351', +'351,351,351,351,351,,,,351,351,,,,351,,351,351,351,351,351,351,351,', +',,,,351,351,351,351,351,351,351,,,351,,,,,,351,351,351,351,351,351,351', +'351,351,351,351,351,,351,351,351,,351,351,351,351,351,483,483,483,483', +'483,483,483,483,483,483,483,,483,483,,,483,483,,351,,,351,,,351,351', +',,351,,351,483,,483,351,483,483,,483,483,483,483,483,351,483,,,,351', +'351,351,351,,351,351,351,351,,,,,351,351,483,483,,,,,351,,351,351,351', +'924,924,924,924,924,924,,,,924,924,,,,924,,924,924,924,924,924,924,924', +',,,,,924,924,924,924,924,924,924,,,924,,,,,,924,924,924,924,924,924', +'924,924,924,924,924,924,,924,924,924,,924,924,924,924,924,846,846,846', +'846,846,846,846,846,846,846,846,,846,846,,,846,846,,924,,,924,,,924', +'924,,,924,,924,846,,846,924,846,846,,846,846,846,846,846,924,846,,,', +'924,924,924,924,,924,924,924,924,,,,,924,924,,846,,,,,924,,924,924,924', +'792,792,792,792,792,792,,,,792,792,,,,792,,792,792,792,792,792,792,792', +',,,,,792,792,792,792,792,792,792,,,792,,,,,,792,792,792,792,792,792', +'792,792,792,792,792,792,,792,792,792,,792,792,792,792,792,21,21,21,21', +'21,21,21,21,21,21,21,,21,21,,,21,21,,792,,,792,,,792,792,,,792,,792', +'21,,21,792,21,21,,21,21,21,21,21,792,21,,,,792,792,792,792,,792,792', +'792,792,,,,,792,792,,21,,,,,792,,792,792,792,736,736,736,736,736,736', +',,,736,736,,,,736,,736,736,736,736,736,736,736,,,,,,736,736,736,736', +'736,736,736,,,736,,,,,,736,736,736,736,736,736,736,736,736,736,736,736', +',736,736,736,,736,736,736,736,736,532,532,532,532,532,532,532,532,532', +'532,532,,532,532,,,532,532,,736,,,736,,,736,736,,,736,,736,532,,532', +'736,532,532,,532,532,532,532,532,736,532,,,,736,736,736,736,,736,736', +'736,736,,,,,736,736,,532,,,,,736,,736,736,736,717,717,717,717,717,717', +',,,717,717,,,,717,,717,717,717,717,717,717,717,,,,,,717,717,717,717', +'717,717,717,,,717,,,,,,717,717,717,717,717,717,717,717,717,717,717,717', +',717,717,717,,717,717,717,717,717,462,462,462,462,462,462,462,462,462', +'462,462,,462,462,,,462,462,,717,,,717,,,717,717,,,717,,717,462,,462', +'717,462,462,,462,462,462,462,462,717,462,,,,717,717,717,717,,717,717', +'717,717,,,,,717,717,,,,,,,717,,717,717,717,303,303,303,303,303,303,', +',,303,303,,,,303,,303,303,303,303,303,303,303,,,,,,303,303,303,303,303', +'303,303,,,303,,,,,,303,303,303,303,303,303,303,303,303,303,303,303,', +'303,303,303,,303,303,303,303,303,474,474,474,474,474,474,474,,,474,474', +',,,,,474,474,,303,,,303,,,303,303,,,303,,303,474,,474,303,474,474,,474', +'474,474,474,474,303,474,,,,303,303,303,303,,303,303,303,303,,,,,303', +'303,,,,,,,303,,303,303,303,781,781,781,781,781,781,,,,781,781,,,,781', +',781,781,781,781,781,781,781,,,,,,781,781,781,781,781,781,781,,,781', +',,,,,781,781,781,781,781,781,781,781,781,781,781,781,,781,781,781,,781', +'781,781,781,781,476,476,476,476,476,476,476,,,476,476,,,,,,476,476,', +'781,,,781,,,781,781,,,781,,781,476,,476,781,476,476,,476,476,476,476', +'476,781,476,,,,781,781,781,781,,781,781,781,781,,,,,781,781,,,,,,,781', +',781,781,781,833,833,833,833,833,833,,,,833,833,,,,833,,833,833,833', +'833,833,833,833,,,,,,833,833,833,833,833,833,833,,,833,,,,,,833,833', +'833,833,833,833,833,833,833,833,833,833,,833,833,833,,833,833,833,833', +'833,478,478,478,478,478,478,478,,,478,478,,,,,,478,478,,833,,,833,,', +'833,833,,,833,,833,478,,478,833,478,478,,478,478,478,478,478,833,478', +',,,833,833,833,833,,833,833,833,833,,,,,833,833,,,,,,,833,,833,833,833', +'726,726,726,726,726,726,,,,726,726,,,,726,,726,726,726,726,726,726,726', +',,,,,726,726,726,726,726,726,726,,,726,,,,,,726,726,726,726,726,726', +'726,726,726,726,726,726,,726,726,726,,726,726,726,726,726,473,473,473', +'473,473,473,473,,,473,473,,,,,,473,473,,726,,,726,,,726,726,,,726,,726', +'473,,473,726,473,473,,473,473,473,473,473,726,473,,,,726,726,726,726', +',726,726,726,726,,,,,726,726,,,,,,,726,,726,726,726,722,722,722,722', +'722,722,,,,722,722,,,,722,,722,722,722,722,722,722,722,,,,,,722,722', +'722,722,722,722,722,,,722,,,,,,722,722,722,722,722,722,722,722,722,722', +'722,722,,722,722,722,,722,722,722,722,722,482,482,482,482,482,482,482', +'482,,482,482,,,,,,482,482,,722,,,722,,,722,722,,,722,,722,482,,482,722', +'482,482,,482,482,482,482,482,722,482,,,,722,722,722,722,,722,722,722', +'722,,,,,722,722,,,,,,,722,,722,722,722,237,237,237,237,237,237,,,,237', +'237,,,,237,,237,237,237,237,237,237,237,,,,,,237,237,237,237,237,237', +'237,,,237,,,,,,237,237,237,237,237,237,237,237,237,237,237,237,,237', +'237,237,,237,237,237,237,237,481,481,481,481,481,481,481,,,481,481,', +',,,,481,481,,237,,,237,,,237,237,,,237,,237,481,,481,237,481,481,,481', +'481,481,481,481,237,481,,,,237,237,237,237,,237,237,237,237,,,,,237', +'237,,,,,,,237,,237,237,237,827,827,827,827,827,827,,,,827,827,,,,827', +',827,827,827,827,827,827,827,,,,,,827,827,827,827,827,827,827,,,827', +',,,,,827,827,827,827,827,827,827,827,827,827,827,827,,827,827,827,,827', +'827,827,827,827,463,463,463,463,463,463,463,463,463,463,463,,463,463', +',,463,463,,827,,,827,,,827,827,,,827,,827,463,,463,827,463,463,,463', +'463,463,463,463,827,463,,,,827,827,827,827,,827,827,827,827,,,,,827', +'827,,,,,,,827,,827,827,827,33,33,33,33,33,33,,,,33,33,,,,33,,33,33,33', +'33,33,33,33,,,,,,33,33,33,33,33,33,33,,,33,,,,,,33,33,33,33,33,33,33', +'33,33,33,33,33,,33,33,33,,33,33,33,33,33,477,477,477,477,477,477,477', +',,477,477,,,,,,477,477,,33,,,33,,,33,33,,,33,,33,477,,477,33,477,477', +',477,477,477,477,477,33,477,,,,33,33,33,33,,33,33,33,33,,,,,33,33,,', +',,,,33,,33,33,33,548,548,548,548,548,548,,,,548,548,,,,548,,548,548', +'548,548,548,548,548,,,,,,548,548,548,548,548,548,548,,,548,,,,,,548', +'548,548,548,548,548,548,548,548,548,548,548,,548,548,548,,548,548,548', +'548,548,475,475,475,475,475,475,475,,,475,475,,,,,,475,475,,548,,,548', +',,548,548,,,548,,548,475,,475,548,475,475,,475,475,475,475,475,548,475', +',,,548,548,548,548,,548,548,548,548,,,,,548,548,,,,,,,548,,548,548,548', +'350,350,350,350,350,350,,,,350,350,,,,350,,350,350,350,350,350,350,350', +',,,,,350,350,350,350,350,350,350,,,350,,,,,,350,350,350,350,350,350', +'350,350,350,350,350,350,,350,350,350,,350,350,350,350,350,470,,,,,,', +',,,,,,,,,470,470,,350,,,350,,,350,350,,,350,,350,470,,470,350,470,470', +',470,470,,,,350,,,,,350,350,350,350,,350,350,350,350,,,,,350,350,,,', +',,,350,,350,350,350,334,334,334,334,334,334,,,,334,334,,,,334,,334,334', +'334,334,334,334,334,,,,,,334,334,334,334,334,334,334,,,334,,,,,,334', +'334,334,334,334,334,334,334,334,334,334,334,,334,334,334,,334,334,334', +'334,334,,,,,,,,,,,,,,,,,,,,334,,,334,,,334,334,,,334,,334,,,,334,,,', +',,,,,334,,,,,334,334,334,334,,334,334,334,334,,,,,334,334,,,,,,,334', +',334,334,334,127,127,127,127,127,127,,,,127,127,,,,127,,127,127,127', +'127,127,127,127,,,,,,127,127,127,127,127,127,127,,,127,,,,,,127,127', +'127,127,127,127,127,127,127,127,127,127,,127,127,127,,127,127,127,127', +'127,,,,,,,,,,,,,,,,,,,,127,,,127,,,127,127,,,127,,127,,,,127,,,,,,,', +',127,,,,,127,127,127,127,,127,127,127,127,,,,,127,127,,,,,,,127,,127', +'127,127,865,865,865,865,865,865,,,,865,865,,,,865,,865,865,865,865,865', +'865,865,,,,,,865,865,865,865,865,865,865,,,865,,,,,,865,865,865,865', +'865,865,865,865,865,865,865,865,,865,865,865,,865,865,865,865,865,,', +',,,,,,,,,,,,,,,,,865,,,865,,,865,865,,,865,,865,,,,865,,,,,,,,,865,', +',,,865,865,865,865,,865,865,865,865,,,,,865,865,,,,,,,865,,865,865,865', +'954,954,954,954,954,954,,,,954,954,,,,954,,954,954,954,954,954,954,954', +',,,,,954,954,954,954,954,954,954,,,954,,,,,,954,954,954,954,954,954', +'954,954,954,954,954,954,,954,954,954,,954,954,954,954,954,,,,,,,,,,', +',,,,,,,,,954,,,954,,,954,954,,,954,,954,,,,954,,,,,,,,,954,,,,,954,954', +'954,954,,954,954,954,954,,,,,954,954,,,,,,,954,,954,954,954,212,212', +'212,212,212,212,,,,212,212,,,,212,,212,212,212,212,212,212,212,,,,,', +'212,212,212,212,212,212,212,,,212,,,,,,212,212,212,212,212,212,212,212', +'212,212,212,212,,212,212,212,,212,212,212,212,212,,,,,,,,,,,,,,,,,,', +',212,,,212,,,212,212,,,212,,212,,,,212,,,,,,,,,212,,,,,212,212,212,212', +',212,212,212,212,,,,,212,212,,,,,,,212,,212,212,212,949,949,949,949', +'949,949,,,,949,949,,,,949,,949,949,949,949,949,949,949,,,,,,949,949', +'949,949,949,949,949,,,949,,,,,,949,949,949,949,949,949,949,949,949,949', +'949,949,,949,949,949,,949,949,949,949,949,,,,,,,,,,,,,,,,,,,,949,,,949', +',,949,949,,,949,,949,,,,949,,,,,,,,,949,,,,,949,949,949,949,,949,949', +'949,949,,,,,949,949,,,,,,,949,,949,949,949,932,932,932,932,932,932,', +',,932,932,,,,932,,932,932,932,932,932,932,932,,,,,,932,932,932,932,932', +'932,932,,,932,,,,,,932,932,932,932,932,932,932,932,932,932,932,932,', +'932,932,932,,932,932,932,932,932,,,,,,,,,,,,,,,,,,,,932,,,932,,,932', +'932,,,932,,932,,,,932,,,,,,,,,932,,,,,932,932,932,932,,932,932,932,932', +',,,,932,932,,,,,,,932,,932,932,932,847,847,847,847,847,847,,,,847,847', +',,,847,,847,847,847,847,847,847,847,,,,,,847,847,847,847,847,847,847', +',,847,,,,,,847,847,847,847,847,847,847,847,847,847,847,847,,847,847', +'847,,847,847,847,847,847,,,,,,,,,,,,,,,,,,,,847,,,847,,,847,847,,,847', +',847,,,,847,,,,,,,,,847,,,,,847,847,847,847,,847,847,847,847,,,,,847', +'847,,,,,,,847,,847,847,847,931,931,931,931,931,931,,,,931,931,,,,931', +',931,931,931,931,931,931,931,,,,,,931,931,931,931,931,931,931,,,931', +',,,,,931,931,931,931,931,931,931,931,931,931,931,931,,931,931,931,,931', +'931,931,931,931,,,,,,,,,,,,,,,,,,,,931,,,931,,,931,931,,,931,,931,,', +',931,,,,,,,,,931,,,,,931,931,931,931,,931,931,931,931,,,,,931,931,,', +',225,225,225,931,225,931,931,931,225,225,,,,225,,225,225,225,225,225', +'225,225,,,,,,225,225,225,225,225,225,225,,,225,,,,,,,225,,,225,225,225', +'225,225,225,225,225,,225,225,225,,225,225,225,225,225,,,,,,,,,,,,,,', +',,,,,225,,,225,,,225,225,,,225,,,,,,225,,,,,,,,,225,,,,,225,225,225', +'225,,225,225,225,225,,,,,225,225,225,,,771,771,771,225,771,225,225,225', +'771,771,,,,771,,771,771,771,771,771,771,771,,,,,,771,771,771,771,771', +'771,771,,,771,,,,,,,771,,,771,771,771,771,771,771,771,771,,771,771,771', +',771,771,771,771,771,,,,,,,,,,,,,,,,,,,,771,,,771,,,771,771,,,771,,', +',,,771,,,,,,,,,771,,,,,771,771,771,771,,771,771,771,771,,,,,771,771', +',,,769,769,769,771,769,771,771,771,769,769,,,,769,,769,769,769,769,769', +'769,769,,,,,,769,769,769,769,769,769,769,,,769,,,,,,,769,,,769,769,769', +'769,769,769,769,769,,769,769,769,,769,769,769,769,769,,,,,,,,,,,,,,', +',,,,,769,,,769,,,769,769,,,769,,,,,,769,,,,,,,,,769,,,,,769,769,769', +'769,,769,769,769,769,,,,,769,769,,,,768,768,768,769,768,769,769,769', +'768,768,,,,768,,768,768,768,768,768,768,768,,,,,,768,768,768,768,768', +'768,768,,,768,,,,,,,768,,,768,768,768,768,768,768,768,768,,768,768,768', +',768,768,768,768,768,,,,,,,,,,,,,,,,,,,,768,,,768,,,768,768,,,768,,', +',,,768,,,,,,,,,768,,,,,768,768,768,768,,768,768,768,768,,,,,768,768', +',,,767,767,767,768,767,768,768,768,767,767,,,,767,,767,767,767,767,767', +'767,767,,,,,,767,767,767,767,767,767,767,,,767,,,,,,,767,,,767,767,767', +'767,767,767,767,767,,767,767,767,,767,767,767,767,767,,,,,,,,,,,,,,', +',,,,,767,,,767,,,767,767,,,767,,,,,,767,,,,,,,,,767,,,,,767,767,767', +'767,,767,767,767,767,,,,,767,767,,,,236,236,236,767,236,767,767,767', +'236,236,,,,236,,236,236,236,236,236,236,236,,,,,,236,236,236,236,236', +'236,236,,,236,,,,,,,236,,,236,236,236,236,236,236,236,236,,236,236,236', +',236,236,236,236,236,,,,,,,,,,,,,,,,,,,,236,,,236,,,236,236,,,236,,', +',,,236,,,,,,,,,236,,,,,236,236,236,236,,236,236,236,236,,,,,236,236', +',,,766,766,766,236,766,236,236,236,766,766,,,,766,,766,766,766,766,766', +'766,766,,,,,,766,766,766,766,766,766,766,,,766,,,,,,,766,,,766,766,766', +'766,766,766,766,766,,766,766,766,,766,766,766,766,766,,,,,,,,,,,,,,', +',,,,,766,,,766,,,766,766,,,766,,,,,,766,,,,,,,,,766,,,,,766,766,766', +'766,,766,766,766,766,,,,,766,766,,,,239,239,239,766,239,766,766,766', +'239,239,,,,239,,239,239,239,239,239,239,239,,,,,,239,239,239,239,239', +'239,239,,,239,,,,,,,239,,,239,239,239,239,239,239,239,239,,239,239,239', +',239,239,239,239,239,,,,,,,,,,,,,,,,,,,,239,,,239,,,239,239,,,239,,', +',,,239,,,,,,,,,239,,,,,239,239,239,239,,239,239,239,239,,,,,239,239', +',,,240,240,240,239,240,239,239,239,240,240,,,,240,,240,240,240,240,240', +'240,240,,,,,,240,240,240,240,240,240,240,,,240,,,,,,,240,,,240,240,240', +'240,240,240,240,240,,240,240,240,,240,240,240,240,240,,,,,,,,,,,,,,', +',,,,,240,,,240,,,240,240,,,240,,,,,,240,,,,,,,,,240,,,,,240,240,240', +'240,,240,240,240,240,,,,,240,240,,,,241,241,241,240,241,240,240,240', +'241,241,,,,241,,241,241,241,241,241,241,241,,,,,,241,241,241,241,241', +'241,241,,,241,,,,,,,241,,,241,241,241,241,241,241,241,241,,241,241,241', +',241,241,241,241,241,,,,,,,,,,,,,,,,,,,,241,,,241,,,241,241,,,241,,', +',,,241,,,,,,,,,241,,,,,241,241,241,241,,241,241,241,241,,,,,241,241', +',,,242,242,242,241,242,241,241,241,242,242,,,,242,,242,242,242,242,242', +'242,242,,,,,,242,242,242,242,242,242,242,,,242,,,,,,,242,,,242,242,242', +'242,242,242,242,242,,242,242,242,,242,242,242,242,242,,,,,,,,,,,,,,', +',,,,,242,,,242,,,242,242,,,242,,,,,,242,,,,,,,,,242,,,,,242,242,242', +'242,,242,242,242,242,,,,,242,242,,,,243,243,243,242,243,242,242,242', +'243,243,,,,243,,243,243,243,243,243,243,243,,,,,,243,243,243,243,243', +'243,243,,,243,,,,,,,243,,,243,243,243,243,243,243,243,243,,243,243,243', +',243,243,243,243,243,,,,,,,,,,,,,,,,,,,,243,,,243,,,243,243,,,243,,', +',,,243,,,,,,,,,243,,,,,243,243,243,243,,243,243,243,243,,,,,243,243', +',,,244,244,244,243,244,243,243,243,244,244,,,,244,,244,244,244,244,244', +'244,244,,,,,,244,244,244,244,244,244,244,,,244,,,,,,,244,,,244,244,244', +'244,244,244,244,244,,244,244,244,,244,244,244,244,244,,,,,,,,,,,,,,', +',,,,,244,,,244,,,244,244,,,244,,,,,,244,,,,,,,,,244,,,,,244,244,244', +'244,,244,244,244,244,,,,,244,244,,,,245,245,245,244,245,244,244,244', +'245,245,,,,245,,245,245,245,245,245,245,245,,,,,,245,245,245,245,245', +'245,245,,,245,,,,,,,245,,,245,245,245,245,245,245,245,245,,245,245,245', +',245,245,245,245,245,,,,,,,,,,,,,,,,,,,,245,,,245,,,245,245,,,245,,', +',,,245,,,,,,,,,245,,,,,245,245,245,245,,245,245,245,245,,,,,245,245', +',,,246,246,246,245,246,245,245,245,246,246,,,,246,,246,246,246,246,246', +'246,246,,,,,,246,246,246,246,246,246,246,,,246,,,,,,,246,,,246,246,246', +'246,246,246,246,246,,246,246,246,,246,246,246,246,246,,,,,,,,,,,,,,', +',,,,,246,,,246,,,246,246,,,246,,,,,,246,,,,,,,,,246,,,,,246,246,246', +'246,,246,246,246,246,,,,,246,246,,,,247,247,247,246,247,246,246,246', +'247,247,,,,247,,247,247,247,247,247,247,247,,,,,,247,247,247,247,247', +'247,247,,,247,,,,,,,247,,,247,247,247,247,247,247,247,247,,247,247,247', +',247,247,247,247,247,,,,,,,,,,,,,,,,,,,,247,,,247,,,247,247,,,247,,', +',,,247,,,,,,,,,247,,,,,247,247,247,247,,247,247,247,247,,,,,247,247', +',,,248,248,248,247,248,247,247,247,248,248,,,,248,,248,248,248,248,248', +'248,248,,,,,,248,248,248,248,248,248,248,,,248,,,,,,,248,,,248,248,248', +'248,248,248,248,248,,248,248,248,,248,248,248,248,248,,,,,,,,,,,,,,', +',,,,,248,,,248,,,248,248,,,248,,,,,,248,,,,,,,,,248,,,,,248,248,248', +'248,,248,248,248,248,,,,,248,248,,,,249,249,249,248,249,248,248,248', +'249,249,,,,249,,249,249,249,249,249,249,249,,,,,,249,249,249,249,249', +'249,249,,,249,,,,,,,249,,,249,249,249,249,249,249,249,249,,249,249,249', +',249,249,249,249,249,,,,,,,,,,,,,,,,,,,,249,,,249,,,249,249,,,249,,', +',,,249,,,,,,,,,249,,,,,249,249,249,249,,249,249,249,249,,,,,249,249', +',,,250,250,250,249,250,249,249,249,250,250,,,,250,,250,250,250,250,250', +'250,250,,,,,,250,250,250,250,250,250,250,,,250,,,,,,,250,,,250,250,250', +'250,250,250,250,250,,250,250,250,,250,250,250,250,250,,,,,,,,,,,,,,', +',,,,,250,,,250,,,250,250,,,250,,,,,,250,,,,,,,,,250,,,,,250,250,250', +'250,,250,250,250,250,,,,,250,250,,,,251,251,251,250,251,250,250,250', +'251,251,,,,251,,251,251,251,251,251,251,251,,,,,,251,251,251,251,251', +'251,251,,,251,,,,,,,251,,,251,251,251,251,251,251,251,251,,251,251,251', +',251,251,251,251,251,,,,,,,,,,,,,,,,,,,,251,,,251,,,251,251,,,251,,', +',,,251,,,,,,,,,251,,,,,251,251,251,251,,251,251,251,251,,,,,251,251', +',,,252,252,252,251,252,251,251,251,252,252,,,,252,,252,252,252,252,252', +'252,252,,,,,,252,252,252,252,252,252,252,,,252,,,,,,,252,,,252,252,252', +'252,252,252,252,252,,252,252,252,,252,252,252,252,252,,,,,,,,,,,,,,', +',,,,,252,,,252,,,252,252,,,252,,,,,,252,,,,,,,,,252,,,,,252,252,252', +'252,,252,252,252,252,,,,,252,252,,,,253,253,253,252,253,252,252,252', +'253,253,,,,253,,253,253,253,253,253,253,253,,,,,,253,253,253,253,253', +'253,253,,,253,,,,,,,253,,,253,253,253,253,253,253,253,253,,253,253,253', +',253,253,253,253,253,,,,,,,,,,,,,,,,,,,,253,,,253,,,253,253,,,253,,', +',,,253,,,,,,,,,253,,,,,253,253,253,253,,253,253,253,253,,,,,253,253', +',,,254,254,254,253,254,253,253,253,254,254,,,,254,,254,254,254,254,254', +'254,254,,,,,,254,254,254,254,254,254,254,,,254,,,,,,,254,,,254,254,254', +'254,254,254,254,254,,254,254,254,,254,254,254,254,254,,,,,,,,,,,,,,', +',,,,,254,,,254,,,254,254,,,254,,,,,,254,,,,,,,,,254,,,,,254,254,254', +'254,,254,254,254,254,,,,,254,254,,,,255,255,255,254,255,254,254,254', +'255,255,,,,255,,255,255,255,255,255,255,255,,,,,,255,255,255,255,255', +'255,255,,,255,,,,,,,255,,,255,255,255,255,255,255,255,255,,255,255,255', +',255,255,255,255,255,,,,,,,,,,,,,,,,,,,,255,,,255,,,255,255,,,255,,', +',,,255,,,,,,,,,255,,,,,255,255,255,255,,255,255,255,255,,,,,255,255', +',,,256,256,256,255,256,255,255,255,256,256,,,,256,,256,256,256,256,256', +'256,256,,,,,,256,256,256,256,256,256,256,,,256,,,,,,,256,,,256,256,256', +'256,256,256,256,256,,256,256,256,,256,256,256,256,256,,,,,,,,,,,,,,', +',,,,,256,,,256,,,256,256,,,256,,,,,,256,,,,,,,,,256,,,,,256,256,256', +'256,,256,256,256,256,,,,,256,256,,,,257,257,257,256,257,256,256,256', +'257,257,,,,257,,257,257,257,257,257,257,257,,,,,,257,257,257,257,257', +'257,257,,,257,,,,,,,257,,,257,257,257,257,257,257,257,257,,257,257,257', +',257,257,257,257,257,,,,,,,,,,,,,,,,,,,,257,,,257,,,257,257,,,257,,', +',,,257,,,,,,,,,257,,,,,257,257,257,257,,257,257,257,257,,,,,257,257', +',,,258,258,258,257,258,257,257,257,258,258,,,,258,,258,258,258,258,258', +'258,258,,,,,,258,258,258,258,258,258,258,,,258,,,,,,,258,,,258,258,258', +'258,258,258,258,258,,258,258,258,,258,258,258,258,258,,,,,,,,,,,,,,', +',,,,,258,,,258,,,258,258,,,258,,,,,,258,,,,,,,,,258,,,,,258,258,258', +'258,,258,258,258,258,,,,,258,258,,,,259,259,259,258,259,258,258,258', +'259,259,,,,259,,259,259,259,259,259,259,259,,,,,,259,259,259,259,259', +'259,259,,,259,,,,,,,259,,,259,259,259,259,259,259,259,259,,259,259,259', +',259,259,259,259,259,,,,,,,,,,,,,,,,,,,,259,,,259,,,259,259,,,259,,', +',,,259,,,,,,,,,259,,,,,259,259,259,259,,259,259,259,259,,,,,259,259', +',,,260,260,260,259,260,259,259,259,260,260,,,,260,,260,260,260,260,260', +'260,260,,,,,,260,260,260,260,260,260,260,,,260,,,,,,,260,,,260,260,260', +'260,260,260,260,260,,260,260,260,,260,260,260,260,260,,,,,,,,,,,,,,', +',,,,,260,,,260,,,260,260,,,260,,,,,,260,,,,,,,,,260,,,,,260,260,260', +'260,,260,260,260,260,,,,,260,260,,,,265,265,265,260,265,260,260,260', +'265,265,,,,265,,265,265,265,265,265,265,265,,,,,,265,265,265,265,265', +'265,265,,,265,,,,,,,265,,,265,265,265,265,265,265,265,265,,265,265,265', +',265,265,265,265,265,,,,,,,,,,,,,,,,,,,,265,,,265,,,265,265,,,265,,', +',,,265,,,,,,,,,265,,,,,265,265,265,265,,265,265,265,265,,,,,265,265', +',,,753,753,753,265,753,265,265,265,753,753,,,,753,,753,753,753,753,753', +'753,753,,,,,,753,753,753,753,753,753,753,,,753,,,,,,,753,,,753,753,753', +'753,753,753,753,753,,753,753,753,,753,753,753,753,753,,,,,,,,,,,,,,', +',,,,,753,,,753,,,753,753,,,753,,,,,,753,,,,,,,,,753,,,,,753,753,753', +'753,,753,753,753,753,,,,,753,753,,,,272,272,272,753,272,753,753,753', +'272,272,,,,272,,272,272,272,272,272,272,272,,,,,,272,272,272,272,272', +'272,272,,,272,,,,,,,272,,,272,272,272,272,272,272,272,272,272,272,272', +'272,,272,272,272,272,272,,,,,,,,,,,,,,,,,,,,272,,,272,,,272,272,,,272', +',272,,272,,272,,,272,,,,,,272,,,,,272,272,272,272,,272,272,272,272,', +',,,272,272,,,,273,273,273,272,273,272,272,272,273,273,,,,273,,273,273', +'273,273,273,273,273,,,,,,273,273,273,273,273,273,273,,,273,,,,,,,273', +',,273,273,273,273,273,273,273,273,273,273,273,273,,273,273,273,273,273', +',,,,,,,,,,,,,,,,,,,273,,,273,,,273,273,,,273,,273,,273,,273,,,273,,', +',,,273,,,,,273,273,273,273,,273,273,273,273,,,,,273,273,,,,281,281,281', +'273,281,273,273,273,281,281,,,,281,,281,281,281,281,281,281,281,,,,', +',281,281,281,281,281,281,281,,,281,,,,,,,281,,,281,281,281,281,281,281', +'281,281,281,281,281,281,,281,281,281,281,281,,,,,,,,,,,,,,,,,,,,281', +',,281,,,281,281,,,281,,281,,281,,281,,,281,,,,,,281,,,,,281,281,281', +'281,,281,281,281,281,,,,,281,281,281,,,745,745,745,281,745,281,281,281', +'745,745,,,,745,,745,745,745,745,745,745,745,,,,,,745,745,745,745,745', +'745,745,,,745,,,,,,,745,,,745,745,745,745,745,745,745,745,,745,745,745', +',745,745,745,745,745,,,,,,,,,,,,,,,,,,,,745,,,745,,,745,745,,,745,,', +',,,745,,,,,,,,,745,,,,,745,745,745,745,,745,745,745,745,,,,,745,745', +',,,288,288,288,745,288,745,745,745,288,288,,,,288,,288,288,288,288,288', +'288,288,,,,,,288,288,288,288,288,288,288,,,288,,,,,,,288,,,288,288,288', +'288,288,288,288,288,,288,288,288,,288,288,288,288,288,,,,,,,,,,,,,,', +',,,,,288,,,288,,,288,288,,,288,,,,,,288,,,,,,,,,288,,,,,288,288,288', +'288,,288,288,288,288,,,,,288,288,,,,290,290,290,288,290,288,288,288', +'290,290,,,,290,,290,290,290,290,290,290,290,,,,,,290,290,290,290,290', +'290,290,,,290,,,,,,,290,,,290,290,290,290,290,290,290,290,,290,290,290', +',290,290,290,290,290,,,,,,,,,,,,,,,,,,,,290,,,290,,,290,290,,,290,,', +',,,290,,,,,,,,,290,,,,,290,290,290,290,,290,290,290,290,,,,,290,290', +',,,293,293,293,290,293,290,290,290,293,293,,,,293,,293,293,293,293,293', +'293,293,,,,,,293,293,293,293,293,293,293,,,293,,,,,,,293,,,293,293,293', +'293,293,293,293,293,,293,293,293,,293,293,293,293,293,,,,,,,,,,,,,,', +',,,,,293,,,293,,,293,293,,,293,,,,,,293,,,,,,,,,293,,,,,293,293,293', +'293,,293,293,293,293,,,,,293,293,,,,294,294,294,293,294,293,293,293', +'294,294,,,,294,,294,294,294,294,294,294,294,,,,,,294,294,294,294,294', +'294,294,,,294,,,,,,,294,,,294,294,294,294,294,294,294,294,,294,294,294', +',294,294,294,294,294,,,,,,,,,,,,,,,,,,,,294,,,294,,,294,294,,,294,,', +',,,294,,,,,,,,,294,,,,,294,294,294,294,,294,294,294,294,,,,,294,294', +',,,,,,294,,294,294,294,299,299,299,299,299,,,,299,299,,,,299,,299,299', +'299,299,299,299,299,,,,,,299,299,299,299,299,299,299,,,299,,,,,,299', +'299,,299,299,299,299,299,299,299,299,299,,299,299,299,,299,299,299,299', +'299,,,,,,,,,,,,,,,,,,,,299,,,299,,,299,299,,,299,,299,,,,299,,,,,,,', +',299,,,,,299,299,299,299,,299,299,299,299,,,,,299,299,,,,723,723,723', +'299,723,299,299,299,723,723,,,,723,,723,723,723,723,723,723,723,,,,', +',723,723,723,723,723,723,723,,,723,,,,,,,723,,,723,723,723,723,723,723', +'723,723,,723,723,723,,723,723,723,723,723,,,,,,,,,,,,,,,,,,,,723,,,723', +',,723,723,,,723,,,,,,723,,,,,,,,,723,,,,,723,723,723,723,,723,723,723', +'723,,,,,723,723,,,,542,542,542,723,542,723,723,723,542,542,,,,542,,542', +'542,542,542,542,542,542,,,,,,542,542,542,542,542,542,542,,,542,,,,,', +',542,,,542,542,542,542,542,542,542,542,542,542,542,542,,542,542,542', +'542,542,,,,,,,,,,,,,,,,,,,,542,,,542,,,542,542,,,542,,,,,,542,,,542', +',,,,,542,,,,,542,542,542,542,,542,542,542,542,,,,,542,542,,,,,,,542', +',542,542,542,5,5,5,5,5,,,,5,5,,,,5,,5,5,5,5,5,5,5,,,,,,5,5,5,5,5,5,5', +',,5,,,,,,5,5,5,5,5,5,5,5,5,5,5,5,,5,5,5,,5,5,5,5,5,,,,,,,,,,,,,,,,,', +',,5,,,5,,,5,5,,,5,,5,,,,5,,,,,,,,,5,,,,,5,5,5,5,,5,5,5,5,,,,,5,5,,,', +'973,973,973,5,973,5,5,5,973,973,,,,973,,973,973,973,973,973,973,973', +',,,,,973,973,973,973,973,973,973,,,973,,,,,,,973,,,973,973,973,973,973', +'973,973,973,973,973,973,973,,973,973,973,973,973,,,,,,,,,,,,,,,,,,,', +'973,,,973,,,973,973,,,973,,973,,973,,973,,,973,,,,,,973,,,,,973,973', +'973,973,,973,973,973,973,,,,,973,973,,,,20,20,20,973,20,973,973,973', +'20,20,,,,20,,20,20,20,20,20,20,20,,,,,,20,20,20,20,20,20,20,,,20,,,', +',,,20,,,20,20,20,20,20,20,20,20,,20,20,20,,20,20,20,20,20,,,,,,,,,,', +',,,,,,,,,20,,,20,,,20,20,,,20,,,,,,20,,,,,,,,,20,,,,,20,20,20,20,,20', +'20,20,20,,,,,20,20,,,,920,920,920,20,920,20,20,20,920,920,,,,920,,920', +'920,920,920,920,920,920,,,,,,920,920,920,920,920,920,920,,,920,,,,,', +',920,,,920,920,920,920,920,920,920,920,,920,920,920,,920,920,,,920,', +',,,,,,,,,,,,,,,,,,920,,,920,,,920,920,,,920,,,,,,,,,,,,,,,,,,,,920,920', +'920,920,,920,920,920,920,,,,,920,920,,,,29,29,29,920,29,920,920,920', +'29,29,,,,29,,29,29,29,29,29,29,29,,,,,,29,29,29,29,29,29,29,,,29,,,', +',,,29,,,29,29,29,29,29,29,29,29,29,29,29,29,,29,29,29,29,29,,,,,,,,', +',,,,,,,,,,,29,,,29,,,29,29,,,29,,29,,29,,29,,,29,,,,,,29,,,,,29,29,29', +'29,,29,29,29,29,,,,,29,29,,,,30,30,30,29,30,29,29,29,30,30,,,,30,,30', +'30,30,30,30,30,30,,,,,,30,30,30,30,30,30,30,,,30,,,,,,,30,,,30,30,30', +'30,30,30,30,30,30,30,30,30,,30,30,30,30,30,,,,,,,,,,,,,,,,,,,,30,,,30', +',,30,30,,,30,,30,,30,,30,,,30,,,,,,30,,,,,30,30,30,30,,30,30,30,30,', +',,,30,30,,,,31,31,31,30,31,30,30,30,31,31,,,,31,,31,31,31,31,31,31,31', +',,,,,31,31,31,31,31,31,31,,,31,,,,,,,31,,,31,31,31,31,31,31,31,31,31', +'31,31,31,,31,31,31,31,31,,,,,,,,,,,,,,,,,,,,31,,,31,,,31,31,,,31,,31', +',31,,31,,,31,,,,,,31,,,,,31,31,31,31,,31,31,31,31,,,,,31,31,,,,34,34', +'34,31,34,31,31,31,34,34,,,,34,,34,34,34,34,34,34,34,,,,,,34,34,34,34', +'34,34,34,,,34,,,,,,,34,,,34,34,34,34,34,34,34,34,,34,34,34,,34,34,,', +'34,,,,,,,,,,,,,,,,,,,,34,,,34,,,34,34,,,34,,34,,,,,,,,,,,,,,,,,,34,34', +'34,34,,34,34,34,34,,,,,34,34,,,,35,35,35,34,35,34,34,34,35,35,,,,35', +',35,35,35,35,35,35,35,,,,,,35,35,35,35,35,35,35,,,35,,,,,,,35,,,35,35', +'35,35,35,35,35,35,,35,35,35,,35,35,,,35,,,,,,,,,,,,,,,,,,,,35,,,35,', +',35,35,,,35,,,1028,,1028,1028,1028,1028,1028,,,,,,,,,1028,,35,35,35', +'35,,35,35,35,35,,,,,35,35,,,,35,,1028,35,,35,35,35,869,869,869,,869', +'1028,1028,,869,869,1028,,,869,,869,869,869,869,869,869,869,,,,,,869', +'869,869,869,869,869,869,,,869,,,,,,,869,,,869,869,869,869,869,869,869', +'869,,869,869,869,,869,869,,,869,,,,,,,,,,,,,,,,,,,,869,,,869,,,869,869', +',,869,,,,,,,,,,,,,,,,,,,,869,869,869,869,,869,869,869,869,,,,,869,869', +',,,860,860,860,869,860,869,869,869,860,860,,,,860,,860,860,860,860,860', +'860,860,,,,,,860,860,860,860,860,860,860,,,860,,,,,,,860,,,860,860,860', +'860,860,860,860,860,,860,860,860,,860,860,,,860,,,,,,,,,,,,,,,,,,,,860', +',,860,,,860,860,,,860,,,,,,,,,,,,,,,,,,,,860,860,860,860,,860,860,860', +'860,,,,,860,860,,,,42,42,42,860,42,860,860,860,42,42,,,,42,,42,42,42', +'42,42,42,42,,,,,,42,42,42,42,42,42,42,,,42,,,,,,,42,,,42,42,42,42,42', +'42,42,42,,42,42,42,,42,42,42,42,42,,,,,,,,,,,,,,,,,,,,42,,,42,,,42,42', +',,42,,,,,,42,,,,,,,,,42,,,,,42,42,42,42,,42,42,42,42,,,,,42,42,,,,43', +'43,43,42,43,42,42,42,43,43,,,,43,,43,43,43,43,43,43,43,,,,,,43,43,43', +'43,43,43,43,,,43,,,,,,,43,,,43,43,43,43,43,43,43,43,,43,43,43,,43,43', +'43,43,43,,,,,,,,,,,,,,,,,,,,43,,,43,,,43,43,,,43,,,,,,43,,,,,,,,,43', +',,,,43,43,43,43,,43,43,43,43,,,,,43,43,,,,45,45,45,43,45,43,43,43,45', +'45,,,,45,,45,45,45,45,45,45,45,,,,,,45,45,45,45,45,45,45,,,45,,,,,,', +'45,,,45,45,45,45,45,45,45,45,,45,45,45,,45,45,45,45,45,,,,,,,,,,,,,', +',,,,,,45,,,45,,,45,45,,,45,,,,,,45,,,,,,,,,45,,,,,45,45,45,45,,45,45', +'45,45,,,,,45,45,,,,845,845,845,45,845,45,45,45,845,845,,,,845,,845,845', +'845,845,845,845,845,,,,,,845,845,845,845,845,845,845,,,845,,,,,,,845', +',,845,845,845,845,845,845,845,845,,845,845,845,,845,845,845,845,845', +',,,,,,,,,,,,,,,,,,,845,,,845,,,845,845,,,845,,,,,,845,,,,,,,,,845,,', +',,845,845,845,845,,845,845,845,845,,,,,845,845,,,,844,844,844,845,844', +'845,845,845,844,844,,,,844,,844,844,844,844,844,844,844,,,,,,844,844', +'844,844,844,844,844,,,844,,,,,,,844,,,844,844,844,844,844,844,844,844', +'844,844,844,844,,844,844,844,844,844,,,,,,,,,,,,,,,,,,,,844,,,844,,', +'844,844,,,844,,,,844,,844,,,844,,,,,,844,,,,,844,844,844,844,,844,844', +'844,844,,,,,844,844,,,,,,,844,,844,844,844,59,59,59,59,59,,,,59,59,', +',,59,,59,59,59,59,59,59,59,,,,,,59,59,59,59,59,59,59,,,59,,,,,,59,59', +',59,59,59,59,59,59,59,59,59,,59,59,59,,59,59,59,59,59,,,,,,,,,,,,,,', +',,,,,59,,,59,,,59,59,,,59,,59,,,,59,,,,,,,,,59,,,,,59,59,59,59,,59,59', +'59,59,,,,,59,59,,,,60,60,60,59,60,59,59,59,60,60,,,,60,,60,60,60,60', +'60,60,60,,,,,,60,60,60,60,60,60,60,,,60,,,,,,,60,,,60,60,60,60,60,60', +'60,60,60,60,60,60,,60,60,60,60,60,,,,,,,,,,,,,,,,,,,,60,,,60,,,60,60', +',,60,,60,,,,60,,,60,,,,,,60,,,,,60,60,60,60,,60,60,60,60,,,,,60,60,', +',,61,61,61,60,61,60,60,60,61,61,,,,61,,61,61,61,61,61,61,61,,,,,,61', +'61,61,61,61,61,61,,,61,,,,,,,61,,,61,61,61,61,61,61,61,61,61,61,61,61', +',61,61,61,61,61,,,,,,,,,,,,,,,,,,,,61,,,61,,,61,61,,,61,,,,,,61,,,61', +',,,,,61,,,,,61,61,61,61,,61,61,61,61,,,,,61,61,,,,64,64,64,61,64,61', +'61,61,64,64,,,,64,,64,64,64,64,64,64,64,,,,,,64,64,64,64,64,64,64,,', +'64,,,,,,,64,,,64,64,64,64,64,64,64,64,,64,64,64,,64,64,64,64,64,,,,', +',,,,,,,,,,,,,,,64,,,64,,,64,64,,,64,,,,,,64,,,,,,,,,64,,,,,64,64,64', +'64,,64,64,64,64,,,,,64,64,,,,65,65,65,64,65,64,64,64,65,65,,,,65,,65', +'65,65,65,65,65,65,,,,,,65,65,65,65,65,65,65,,,65,,,,,,,65,,,65,65,65', +'65,65,65,65,65,,65,65,65,,65,65,65,65,65,,,,,,,,,,,,,,,,,,,,65,,,65', +',,65,65,,,65,,,,,,65,,,,,,,,,65,,,,,65,65,65,65,,65,65,65,65,,,,,65', +'65,,,,68,68,68,65,68,65,65,65,68,68,,,,68,,68,68,68,68,68,68,68,,,,', +',68,68,68,68,68,68,68,,,68,,,,,,,68,,,68,68,68,68,68,68,68,68,,68,68', +'68,,68,68,68,68,68,,,,,,,,,,,,,,,,,,,,68,,,68,,,68,68,,,68,,,,,,68,', +',,,,,,,68,,,,,68,68,68,68,,68,68,68,68,,,,,68,68,68,,,,,68,68,,68,68', +'68,69,69,69,,69,,,,69,69,,,,69,,69,69,69,69,69,69,69,,,,,,69,69,69,69', +'69,69,69,,,69,,,,,,,69,,,69,69,69,69,69,69,69,69,,69,69,69,,69,69,,', +'69,,,,,,,,,,,,,,,,,,,,69,,,69,,,69,69,,,69,,69,,,,,,,,,,,,,,,,,,69,69', +'69,69,,69,69,69,69,,,,,69,69,,,,70,70,70,69,70,69,69,69,70,70,,,,70', +',70,70,70,70,70,70,70,,,,,,70,70,70,70,70,70,70,,,70,,,,,,,70,,,70,70', +'70,70,70,70,70,70,,70,70,70,,70,70,,,70,,,,,,,,,,,,,,,,,70,,,70,,,70', +',,70,70,,,70,,,,,,,,,,,,,,,,,,,,70,70,70,70,,70,70,70,70,,,,,70,70,', +',,71,71,71,70,71,70,70,70,71,71,,,,71,,71,71,71,71,71,71,71,,,,,,71', +'71,71,71,71,71,71,,,71,,,,,,,71,,,71,71,71,71,71,71,71,71,,71,71,71', +',71,71,,,71,,,,,,,,,,,,,,,,,,,,71,,,71,,,71,71,,,71,,,915,,915,915,915', +'915,915,,,,,,,,,915,,71,71,71,71,,71,71,71,71,,,,,71,71,,,,,,915,71', +',71,71,71,116,116,116,116,116,915,915,,116,116,915,,,116,,116,116,116', +'116,116,116,116,,,,,,116,116,116,116,116,116,116,,,116,,,,,,116,116', +'116,116,116,116,116,116,116,116,116,116,,116,116,116,,116,116,116,116', +'116,,,,,,,,,,,,,,,,,,,,116,,,116,,,116,116,,,116,,116,,,,116,,,,,,,', +',116,,,,,116,116,116,116,,116,116,116,116,,,,,116,116,,,,,,116,116,', +'116,116,116,121,121,121,,121,,,,121,121,,,,121,,121,121,121,121,121', +'121,121,,,,,,121,121,121,121,121,121,121,,,121,,,,,,,121,,,121,121,121', +'121,121,121,121,121,,121,121,121,,121,121,121,121,121,,,,,,,,,,,,,,', +',,,,,121,,,121,,,121,121,,,121,,,,,,121,,,,,,,,,121,,,,,121,121,121', +'121,,121,121,121,121,,,,,121,121,,,,122,122,122,121,122,121,121,121', +'122,122,,,,122,,122,122,122,122,122,122,122,,,,,,122,122,122,122,122', +'122,122,,,122,,,,,,,122,,,122,122,122,122,122,122,122,122,,122,122,122', +',122,122,122,122,122,,,,,,,,,,,,,,,,,,,,122,,,122,,,122,122,,,122,,', +',,,122,,,,,,,,,122,,,,,122,122,122,122,,122,122,122,122,,,,,122,122', +',,,123,123,123,122,123,122,122,122,123,123,,,,123,,123,123,123,123,123', +'123,123,,,,,,123,123,123,123,123,123,123,,,123,,,,,,,123,,,123,123,123', +'123,123,123,123,123,,123,123,123,,123,123,123,123,123,,,,,,,,,,,,,,', +',,,,,123,,,123,,,123,123,,,123,,,,,,123,,,,,,,,,123,,,,,123,123,123', +'123,,123,123,123,123,,,,,123,123,,,,124,124,124,123,124,123,123,123', +'124,124,,,,124,,124,124,124,124,124,124,124,,,,,,124,124,124,124,124', +'124,124,,,124,,,,,,,124,,,124,124,124,124,124,124,124,124,,124,124,124', +',124,124,124,124,124,,,,,,,,,,,,,,,,,,,,124,,,124,,,124,124,,,124,,', +',,,124,,,,,,,,,124,,,,,124,124,124,124,,124,124,124,124,,,,,124,124', +',,,,,,124,,124,124,124,125,125,125,125,125,,,,125,125,,,,125,,125,125', +'125,125,125,125,125,,,,,,125,125,125,125,125,125,125,,,125,,,,,,125', +'125,,125,125,125,125,125,125,125,125,125,,125,125,125,,125,125,125,125', +'125,,,,,,,,,,,,,,,,,,,,125,,,125,,,125,125,,,125,,125,,,,125,,,,,,,', +',125,,,,,125,125,125,125,,125,125,125,125,,,,,125,125,,,,826,826,826', +'125,826,125,125,125,826,826,,,,826,,826,826,826,826,826,826,826,,,,', +',826,826,826,826,826,826,826,,,826,,,,,,,826,,,826,826,826,826,826,826', +'826,826,,826,826,826,,826,826,826,826,826,,,,,,,,,,,,,,,,,,,,826,,,826', +',,826,826,,,826,,826,,,,826,,,,,,,,,826,,,,,826,826,826,826,,826,826', +'826,826,,,,,826,826,,,,823,823,823,826,823,826,826,826,823,823,,,,823', +',823,823,823,823,823,823,823,,,,,,823,823,823,823,823,823,823,,,823', +',,,,,,823,,,823,823,823,823,823,823,823,823,,823,823,823,,823,823,823', +'823,823,,,,,,,,,,,,,,,,,,,,823,,,823,,,823,823,,,823,,,,,,823,,,,,,', +',,823,,,,,823,823,823,823,,823,823,823,823,,,,,823,823,,,,213,213,213', +'823,213,823,823,823,213,213,,,,213,,213,213,213,213,213,213,213,,,,', +',213,213,213,213,213,213,213,,,213,,,,,,,213,,,213,213,213,213,213,213', +'213,213,,213,213,213,,213,213,213,213,213,,,,,,,,,,,,,,,,,,,,213,,,213', +',,213,213,,,213,,213,,,,213,,,,,,,,,213,,,,,213,213,213,213,,213,213', +'213,213,,,,,213,213,,,,214,214,214,213,214,213,213,213,214,214,,,,214', +',214,214,214,214,214,214,214,,,,,,214,214,214,214,214,214,214,,,214', +',,,,,,214,,,214,214,214,214,214,214,214,214,,214,214,214,,214,214,214', +'214,214,,,,,,,,,,,,,,,,,,,,214,,,214,,,214,214,,,214,,214,,,,214,,,', +',,,,,214,,,,,214,214,214,214,,214,214,214,214,,,,,214,214,,,,215,215', +'215,214,215,214,214,214,215,215,,,,215,,215,215,215,215,215,215,215', +',,,,,215,215,215,215,215,215,215,,,215,,,,,,,215,,,215,215,215,215,215', +'215,215,215,,215,215,215,,215,215,215,215,215,,,,,,,,,,,,,,,,,,,,215', +',,215,,,215,215,,,215,,,,,,215,,,,,,,,,215,,,,,215,215,215,215,,215', +'215,215,215,,,,,215,215,,,,216,216,216,215,216,215,215,215,216,216,', +',,216,,216,216,216,216,216,216,216,,,,,,216,216,216,216,216,216,216', +',,216,,,,,,,216,,,216,216,216,216,216,216,216,216,,216,216,216,,216', +'216,216,216,216,,,,,,,,,,,,,,,,,,,,216,,,216,,,216,216,,,216,,,,,,216', +',,,,,,,,216,,,,,216,216,216,216,,216,216,216,216,,,,,216,216,,,,217', +'217,217,216,217,216,216,216,217,217,,,,217,,217,217,217,217,217,217', +'217,,,,,,217,217,217,217,217,217,217,,,217,,,,,,,217,,,217,217,217,217', +'217,217,217,217,,217,217,217,,217,217,217,217,217,,,,,,,,,,,,,,,,,,', +',217,,,217,,,217,217,,,217,,,,,,217,,,,,,,,,217,,,,,217,217,217,217', +',217,217,217,217,,,,,217,217,,,,218,218,218,217,218,217,217,217,218', +'218,,,,218,,218,218,218,218,218,218,218,,,,,,218,218,218,218,218,218', +'218,,,218,,,,,,,218,,,218,218,218,218,218,218,218,218,218,218,218,218', +',218,218,218,218,218,,,,,,,,,,,,,,,,,,,,218,,,218,,,218,218,,,218,,218', +',218,,218,,,218,,,,,,218,,,,,218,218,218,218,,218,218,218,218,,,,,218', +'218,,,,810,810,810,218,810,218,218,218,810,810,,,,810,,810,810,810,810', +'810,810,810,,,,,,810,810,810,810,810,810,810,,,810,,,,,,,810,,,810,810', +'810,810,810,810,810,810,,810,810,810,,810,810,810,810,810,,,,,,,,,,', +',,,,,,,,,810,,,810,,,810,810,,,810,,,,,,810,,,,,,,,,810,,,,,810,810', +'810,810,,810,810,810,810,,,,,810,810,,,,223,223,223,810,223,810,810', +'810,223,223,,,,223,,223,223,223,223,223,223,223,,,,,,223,223,223,223', +'223,223,223,,,223,,,,,,,223,,,223,223,223,223,223,223,223,223,,223,223', +'223,,223,223,223,223,223,,,,,,,,,,,,,,,,,,,,223,,,223,,,223,223,,,223', +',,,,,223,,,,,,,,,223,,,,,223,223,223,223,,223,223,223,223,,,,,223,223', +',,,224,224,224,223,224,223,223,223,224,224,,,,224,,224,224,224,224,224', +'224,224,,,,,,224,224,224,224,224,224,224,,,224,,,,,,,224,,,224,224,224', +'224,224,224,224,224,,224,224,224,,224,224,224,224,224,,,,,,,,,,,,,,', +',,,,,224,,,224,,,224,224,,,224,,,,,,224,,,,,,,,,224,,,,,224,224,224', +'224,,224,224,224,224,,,,,224,224,,,,307,307,307,224,307,224,224,224', +'307,307,,,,307,,307,307,307,307,307,307,307,,,,,,307,307,307,307,307', +'307,307,,,307,,,,,,,307,,,307,307,307,307,307,307,307,307,,307,307,307', +',307,307,,,307,,,,,,,,,,,,,,,,,,,,307,,,307,,,307,307,,,307,,,992,,992', +'992,992,992,992,,,,,,,,,992,,307,307,307,307,,307,307,307,307,,,,,307', +'307,,,,307,,992,307,,307,307,307,689,689,689,,689,992,992,,689,689,992', +',,689,,689,689,689,689,689,689,689,,,,,,689,689,689,689,689,689,689', +',,689,,,,,,,689,,,689,689,689,689,689,689,689,689,,689,689,689,,689', +'689,689,689,689,,,,,,,,,,,,,,,,,,,,689,,,689,,,689,689,,,689,,,,,,689', +',,,,,,,,689,,,,,689,689,689,689,,689,689,689,689,,,,,689,689,,,,663', +'663,663,689,663,689,689,689,663,663,,,,663,,663,663,663,663,663,663', +'663,,,,,,663,663,663,663,663,663,663,,,663,,,,,,,663,,,663,663,663,663', +'663,663,663,663,,663,663,663,,663,663,663,663,663,,,,,,,,,,,,,,,,,,', +',663,,,663,,,663,663,,,663,,663,,,,663,,,,,,,,,663,,,,,663,663,663,663', +',663,663,663,663,,,,,663,663,,,,658,658,658,663,658,663,663,663,658', +'658,,,,658,,658,658,658,658,658,658,658,,,,,,658,658,658,658,658,658', +'658,,,658,,,,,,,658,,,658,658,658,658,658,658,658,658,,658,658,658,', +'658,658,,,658,,,,,,,,,,,,,,,,,,,,658,,,658,,,658,658,,,658,,,,,,,,,', +',,,,,,,,,,658,658,658,658,,658,658,658,658,,,,,658,658,,,,647,647,647', +'658,647,658,658,658,647,647,,,,647,,647,647,647,647,647,647,647,,,,', +',647,647,647,647,647,647,647,,,647,,,,,,,647,,,647,647,647,647,647,647', +'647,647,,647,647,647,,647,647,,,647,,,,,,,,,,,,,,,,,,,,647,,,647,,,647', +'647,,,647,,,,,,,,,,,,,,,,,,,,647,647,647,647,,647,647,647,647,,,,,647', +'647,,,,324,324,324,647,324,647,647,647,324,324,,,,324,,324,324,324,324', +'324,324,324,,,,,,324,324,324,324,324,324,324,,,324,,,,,,,324,,,324,324', +'324,324,324,324,324,324,,324,324,324,,324,324,,,324,,,,,,,,,,,,,,,,', +',,,324,,,324,,,324,324,,,324,,,,,,,,,,,,,,,,,,,,324,324,324,324,,324', +'324,324,324,,,,,324,324,,,,644,644,644,324,644,324,324,324,644,644,', +',,644,,644,644,644,644,644,644,644,,,,,,644,644,644,644,644,644,644', +',,644,,,,,,,644,,,644,644,644,644,644,644,644,644,,644,644,644,,644', +'644,644,644,644,,,,,,,,,,,,,,,,,,,,644,,,644,,,644,644,,,644,,,,,,644', +',,,,,,,,644,,,,,644,644,644,644,,644,644,644,644,,,,,644,644,,,,641', +'641,641,644,641,644,644,644,641,641,,,,641,,641,641,641,641,641,641', +'641,,,,,,641,641,641,641,641,641,641,,,641,,,,,,,641,,,641,641,641,641', +'641,641,641,641,,641,641,641,,641,641,641,641,641,,,,,,,,,,,,,,,,,,', +',641,,,641,,,641,641,,,641,,,,,,641,,,,,,,,,641,,,,,641,641,641,641', +',641,641,641,641,,,,,641,641,,,,331,331,331,641,331,641,641,641,331', +'331,,,,331,,331,331,331,331,331,331,331,,,,,,331,331,331,331,331,331', +'331,,,331,,,,,,,331,,,331,331,331,331,331,331,331,331,,331,331,331,', +'331,331,331,331,331,,,,,,,,,,,,,,,,,,,,331,,,331,,,331,331,,,331,,,', +',,331,,,,,,,,,331,,,,,331,331,331,331,,331,331,331,331,,,,,331,331,', +',,333,333,333,331,333,331,331,331,333,333,,,,333,,333,333,333,333,333', +'333,333,,,,,,333,333,333,333,333,333,333,,,333,,,,,,,333,,,333,333,333', +'333,333,333,333,333,,333,333,333,,333,333,333,333,333,,,,,,,,,,,,,,', +',,,,,333,,,333,333,,333,333,,,333,,,,,,333,,,,,,,,,333,,,,,333,333,333', +'333,,333,333,333,333,,,,,333,333,,,,617,617,617,333,617,333,333,333', +'617,617,,,,617,,617,617,617,617,617,617,617,,,,,,617,617,617,617,617', +'617,617,,,617,,,,,,,617,,,617,617,617,617,617,617,617,617,,617,617,617', +',617,617,617,617,617,,,,,,,,,,,,,,,,,,,,617,,,617,,,617,617,,,617,,', +',,,617,,,,,,,,,617,,,,,617,617,617,617,,617,617,617,617,,,,,617,617', +',,,616,616,616,617,616,617,617,617,616,616,,,,616,,616,616,616,616,616', +'616,616,,,,,,616,616,616,616,616,616,616,,,616,,,,,,,616,,,616,616,616', +'616,616,616,616,616,,616,616,616,,616,616,616,616,616,,,,,,,,,,,,,,', +',,,,,616,,,616,,,616,616,,,616,,,,,,616,,,,,,,,,616,,,,,616,616,616', +'616,,616,616,616,616,,,,,616,616,,,,612,612,612,616,612,616,616,616', +'612,612,,,,612,,612,612,612,612,612,612,612,,,,,,612,612,612,612,612', +'612,612,,,612,,,,,,,612,,,612,612,612,612,612,612,612,612,,612,612,612', +',612,612,612,612,612,,,,,,,,,,,,,,,,,,,,612,,,612,,,612,612,,,612,,', +',,,612,,,,,,,,,612,,,,,612,612,612,612,,612,612,612,612,,,,,612,612', +',,,611,611,611,612,611,612,612,612,611,611,,,,611,,611,611,611,611,611', +'611,611,,,,,,611,611,611,611,611,611,611,,,611,,,,,,,611,,,611,611,611', +'611,611,611,611,611,,611,611,611,,611,611,611,611,611,,,,,,,,,,,,,,', +',,,,,611,,,611,,,611,611,,,611,,,,,,611,,,,,,,,,611,,,,,611,611,611', +'611,,611,611,611,611,,,,,611,611,,,,610,610,610,611,610,611,611,611', +'610,610,,,,610,,610,610,610,610,610,610,610,,,,,,610,610,610,610,610', +'610,610,,,610,,,,,,,610,,,610,610,610,610,610,610,610,610,610,610,610', +'610,,610,610,610,610,610,,,,,,,,,,,,,,,,,,,,610,,,610,,,610,610,,,610', +',,,610,,610,,,610,,,,,,610,,,,,610,610,610,610,,610,610,610,610,,,,', +'610,610,,,,609,609,609,610,609,610,610,610,609,609,,,,609,,609,609,609', +'609,609,609,609,,,,,,609,609,609,609,609,609,609,,,609,,,,,,,609,,,609', +'609,609,609,609,609,609,609,609,609,609,609,,609,609,609,609,609,,,', +',,,,,,,,,,,,,,,,609,,,609,,,609,609,,,609,,609,,609,,609,,,609,,,,,', +'609,,,,,609,609,609,609,,609,609,609,609,,,,,609,609,,,,606,606,606', +'609,606,609,609,609,606,606,,,,606,,606,606,606,606,606,606,606,,,,', +',606,606,606,606,606,606,606,,,606,,,,,,,606,,,606,606,606,606,606,606', +'606,606,,606,606,606,,606,606,606,606,606,,,,,,,,,,,,,,,,,,,,606,,,606', +',,606,606,,,606,,,,,,606,,,,,,,,,606,,,,,606,606,606,606,,606,606,606', +'606,,,,,606,606,,,,,,,606,,606,606,606,605,605,605,605,605,,,,605,605', +',,,605,,605,605,605,605,605,605,605,,,,,,605,605,605,605,605,605,605', +',,605,,,,,,605,605,,605,605,605,605,605,605,605,605,605,,605,605,605', +',605,605,605,605,605,,,,,,,,,,,,,,,,,,,,605,,,605,,,605,605,,,605,,605', +',,,605,,,,,,,,,605,,,,,605,605,605,605,,605,605,605,605,,,,,605,605', +',,,602,602,602,605,602,605,605,605,602,602,,,,602,,602,602,602,602,602', +'602,602,,,,,,602,602,602,602,602,602,602,,,602,,,,,,,602,,,602,602,602', +'602,602,602,602,602,602,602,602,602,,602,602,602,602,602,,,,,,,,,,,', +',,,,,,,,602,,,602,,,602,602,,,602,,602,,602,,602,,,602,,,,,,602,,,,', +'602,602,602,602,,602,602,602,602,,,,,602,602,,,,349,349,349,602,349', +'602,602,602,349,349,,,,349,,349,349,349,349,349,349,349,,,,,,349,349', +'349,349,349,349,349,,,349,,,,,,,349,,,349,349,349,349,349,349,349,349', +',349,349,349,,349,349,349,349,349,,,,,,,,,,,,,,,,,,,,349,,,349,,,349', +'349,,,349,,,,,,349,,,,,,,,,349,,,,,349,349,349,349,,349,349,349,349', +',,,,349,349,,,,601,601,601,349,601,349,349,349,601,601,,,,601,,601,601', +'601,601,601,601,601,,,,,,601,601,601,601,601,601,601,,,601,,,,,,,601', +',,601,601,601,601,601,601,601,601,,601,601,601,,601,601,601,601,601', +',,,,,,,,,,,,,,,,,,,601,,,601,,,601,601,,,601,,,,,,601,,,,,,,,,601,,', +',,601,601,601,601,,601,601,601,601,,,,,601,601,,,,600,600,600,601,600', +'601,601,601,600,600,,,,600,,600,600,600,600,600,600,600,,,,,,600,600', +'600,600,600,600,600,,,600,,,,,,,600,,,600,600,600,600,600,600,600,600', +',600,600,600,,600,600,600,600,600,,,,,,,,,,,,,,,,,,,,600,,,600,,,600', +'600,,,600,,600,,,,600,,,,,,,,,600,,,,,600,600,600,600,,600,600,600,600', +',,,,600,600,,,,568,568,568,600,568,600,600,600,568,568,,,,568,,568,568', +'568,568,568,568,568,,,,,,568,568,568,568,568,568,568,,,568,,,,,,,568', +',,568,568,568,568,568,568,568,568,568,568,568,568,,568,568,568,568,568', +',,,,,,,,,,,,,,,,,,,568,,,568,,,568,568,,,568,,568,,568,,568,,,568,,', +',,,568,,,,,568,568,568,568,,568,568,568,568,,,,,568,568,,,,558,558,558', +'568,558,568,568,568,558,558,,,,558,,558,558,558,558,558,558,558,,,,', +',558,558,558,558,558,558,558,,,558,,,,,,,558,,,558,558,558,558,558,558', +'558,558,558,558,558,558,,558,558,558,558,558,,,,,,,,,,,,,,,,,,,,558', +',,558,,,558,558,,,558,,558,,558,,558,,,558,,,,,,558,,,,,558,558,558', +'558,,558,558,558,558,,,,,558,558,,,,370,370,370,558,370,558,558,558', +'370,370,,,,370,,370,370,370,370,370,370,370,,,,,,370,370,370,370,370', +'370,370,,,370,,,,,,,370,,,370,370,370,370,370,370,370,370,,370,370,370', +',370,370,370,370,370,,,,,,,,,,,,,,,,,,,,370,,,370,,,370,370,,,370,,', +',,,370,,,,,,,,,370,,,,,370,370,370,370,,370,370,370,370,,,,,370,370', +',,,557,557,557,370,557,370,370,370,557,557,,,,557,,557,557,557,557,557', +'557,557,,,,,,557,557,557,557,557,557,557,,,557,,,,,,,557,,,557,557,557', +'557,557,557,557,557,,557,557,557,,557,557,557,557,557,,,,,,,,,,,,,,', +',,,,,557,,,557,,,557,557,,,557,,557,,,,557,,,,,,,,,557,,,,,557,557,557', +'557,,557,557,557,557,,,,,557,557,,,,539,539,539,557,539,557,557,557', +'539,539,,,,539,,539,539,539,539,539,539,539,,,,,,539,539,539,539,539', +'539,539,,,539,,,,,,,539,,,539,539,539,539,539,539,539,539,539,539,539', +'539,,539,539,539,539,539,,,,,,,,,,,,,,,,,,,,539,,,539,,,539,539,,,539', +',539,,,,539,,,539,,,,,,539,,,,,539,539,539,539,,539,539,539,539,,,,', +'539,539,,,,533,533,533,539,533,539,539,539,533,533,,,,533,,533,533,533', +'533,533,533,533,,,,,,533,533,533,533,533,533,533,,,533,,,,,,,533,,,533', +'533,533,533,533,533,533,533,,533,533,533,,533,533,533,533,533,,,,,,', +',,,,,,,,,,,,,533,,,533,,,533,533,,,533,,,,,,533,,,,,,,,,533,,,,,533', +'533,533,533,,533,533,533,533,,,,,533,533,,,,528,528,528,533,528,533', +'533,533,528,528,,,,528,,528,528,528,528,528,528,528,,,,,,528,528,528', +'528,528,528,528,,,528,,,,,,,528,,,528,528,528,528,528,528,528,528,,528', +'528,528,,528,528,528,528,528,,,,,,,,,,,,,,,,,,,,528,,,528,,,528,528', +',,528,,,,,,528,,,,,,,,,528,,,,,528,528,528,528,,528,528,528,528,,,,', +'528,528,,,,527,527,527,528,527,528,528,528,527,527,,,,527,,527,527,527', +'527,527,527,527,,,,,,527,527,527,527,527,527,527,,,527,,,,,,,527,,,527', +'527,527,527,527,527,527,527,,527,527,527,,527,527,527,527,527,,,,,,', +',,,,,,,,,,,,,527,,,527,,,527,527,,,527,,,,,,527,,,,,,,,,527,,,,,527', +'527,527,527,,527,527,527,527,,,,,527,527,,,,524,524,524,527,524,527', +'527,527,524,524,,,,524,,524,524,524,524,524,524,524,,,,,,524,524,524', +'524,524,524,524,,,524,,,,,,,524,,,524,524,524,524,524,524,524,524,,524', +'524,524,,524,524,,,524,,,,,,,,,,,,,,,,,,,,524,,,524,,,524,524,,,524', +',,,,,,,,,,,,,,,,,,,524,524,524,524,,524,524,524,524,,,,,524,524,,,,386', +'386,386,524,386,524,524,524,386,386,,,,386,,386,386,386,386,386,386', +'386,,,,,,386,386,386,386,386,386,386,,,386,,,,,,,386,,,386,386,386,386', +'386,386,386,386,,386,386,386,,386,386,386,386,386,,,,,,,,,,,,,,,,,,', +',386,,,386,,,386,386,,,386,,,,,,386,,,,,,,,,386,,,,,386,386,386,386', +',386,386,386,386,,,,,386,386,,,,518,518,518,386,518,386,386,386,518', +'518,,,,518,,518,518,518,518,518,518,518,,,,,,518,518,518,518,518,518', +'518,,,518,,,,,,,518,,,518,518,518,518,518,518,518,518,518,518,518,518', +',518,518,518,518,518,,,,,,,,,,,,,,,,,,,,518,,,518,,,518,518,,,518,,518', +',518,,518,,,518,,,,,,518,,,,,518,518,518,518,,518,518,518,518,,,,,518', +'518,,,,516,516,516,518,516,518,518,518,516,516,,,,516,,516,516,516,516', +'516,516,516,,,,,,516,516,516,516,516,516,516,,,516,,,,,,,516,,,516,516', +'516,516,516,516,516,516,,516,516,516,,516,516,,,516,,,,,,,,,,,,,,,,', +',,,516,,,516,,,516,516,,,516,,,994,,994,994,994,994,994,,,,,,,,,994', +',516,516,516,516,,516,516,516,516,,,,,516,516,,,,,,994,516,,516,516', +'516,508,508,508,508,508,994,994,,508,508,994,,,508,,508,508,508,508', +'508,508,508,,,,,,508,508,508,508,508,508,508,,,508,,,,,,508,508,508', +'508,508,508,508,508,508,508,508,508,,508,508,508,,508,508,508,508,508', +',,,,,,,,,,,,,,,,,,,508,,,508,,,508,508,,,508,,508,,,,508,,,,,,,,,508', +',,,,508,508,508,508,,508,508,508,508,,,,,508,508,,,,,,508,508,,508,508', +'508,502,502,502,,502,,,,502,502,,,,502,,502,502,502,502,502,502,502', +',,,,,502,502,502,502,502,502,502,,,502,,,,,,,502,,,502,502,502,502,502', +'502,502,502,,502,502,502,,502,502,502,502,502,,,,,,,,,,,,,,,,,,,,502', +',,502,,,502,502,,,502,,,,,,502,,,,,,,,,502,,,,,502,502,502,502,,502', +'502,502,502,,,,,502,502,,,,500,500,500,502,500,502,502,502,500,500,', +',,500,,500,500,500,500,500,500,500,,,,,,500,500,500,500,500,500,500', +',,500,,,,,,,500,,,500,500,500,500,500,500,500,500,500,500,500,500,,500', +'500,500,500,500,,,,,,,,,,,,,,,,,,,,500,,,500,,,500,500,,,500,,,,500', +',500,,,500,,,,,,500,,,,,500,500,500,500,,500,500,500,500,,,,,500,500', +',,,498,498,498,500,498,500,500,500,498,498,,,,498,,498,498,498,498,498', +'498,498,,,,,,498,498,498,498,498,498,498,,,498,,,,,,,498,,,498,498,498', +'498,498,498,498,498,498,498,498,498,,498,498,498,498,498,,,,,,,,,,,', +',,,,,,,,498,,,498,,,498,498,,,498,,498,,498,,498,,,498,,,,,,498,,,,', +'498,498,498,498,,498,498,498,498,,,,,498,498,,,,461,461,461,498,461', +'498,498,498,461,461,,,,461,,461,461,461,461,461,461,461,,,,,,461,461', +'461,461,461,461,461,,,461,,,,,,,461,,,461,461,461,461,461,461,461,461', +',461,461,461,,461,461,461,461,461,,,,,,,,,,,,,,,,,,,,461,,,461,,,461', +'461,,,461,,,,,,461,,,,,,,,,461,,,,,461,461,461,461,,461,461,461,461', +',,,,461,461,,,,460,460,460,461,460,461,461,461,460,460,,,,460,,460,460', +'460,460,460,460,460,,,,,,460,460,460,460,460,460,460,,,460,,,,,,,460', +',,460,460,460,460,460,460,460,460,,460,460,460,,460,460,460,460,460', +',,,,,,,,,,,,,,,,,,,460,,,460,,,460,460,,,460,,,,,,460,,,,,,,,,460,,', +',,460,460,460,460,,460,460,460,460,,,,,460,460,,,,459,459,459,460,459', +'460,460,460,459,459,,,,459,,459,459,459,459,459,459,459,,,,,,459,459', +'459,459,459,459,459,,,459,,,,,,,459,,,459,459,459,459,459,459,459,459', +',459,459,459,,459,459,459,459,459,,,,,,,,,,,,,,,,,,,,459,,,459,,,459', +'459,,,459,,,,,,459,,,,,,,,,459,,,,,459,459,459,459,,459,459,459,459', +',,,,459,459,,,,457,457,457,459,457,459,459,459,457,457,,,,457,,457,457', +'457,457,457,457,457,,,,,,457,457,457,457,457,457,457,,,457,,,,,,,457', +',,457,457,457,457,457,457,457,457,457,457,457,457,,457,457,457,457,457', +',,,,,,,,,,,,,,,,,,,457,,,457,,,457,457,,,457,,457,,457,,457,,,457,,', +',,,457,,,,,457,457,457,457,,457,457,457,457,,,,,457,457,,,,414,414,414', +'457,414,457,457,457,414,414,,,,414,,414,414,414,414,414,414,414,,,,', +',414,414,414,414,414,414,414,,,414,,,,,,,414,,,414,414,414,414,414,414', +'414,414,,414,414,414,,414,414,414,414,414,,,,,,,,,,,,,,,,,,,,414,,,414', +',,414,414,,,414,,,,,,414,,,,,,,,,414,,,,,414,414,414,414,,414,414,414', +'414,,,,,414,414,,,,,,,414,,414,414,414,597,597,597,597,597,597,597,597', +'597,597,597,597,597,597,597,597,597,597,597,597,597,597,597,597,,,,597', +'597,597,597,597,597,597,597,597,597,,,,,,597,597,597,597,597,597,597', +'597,597,,,597,,,,,,,,597,597,,597,597,597,597,597,597,597,,,597,597', +',,,597,597,597,597,,,,,,,,,,,,,,597,597,,597,597,597,597,597,597,597', +'597,597,597,597,597,,,597,597,,,,,,,,,,,,,,597,405,405,405,405,405,405', +'405,405,405,405,405,405,405,405,405,405,405,405,405,405,405,405,405', +'405,,,,405,405,405,405,405,405,405,405,405,405,,,,,,405,405,405,405', +'405,405,405,405,405,,,405,,,,,,,,405,405,,405,405,405,405,405,405,405', +',,405,405,,,,405,405,405,405,,,,,,,,,,,,,,405,405,,405,405,405,405,405', +'405,405,405,405,405,405,405,,,405,405,,,,,,,,,,,,,,405,9,9,9,9,9,9,9', +'9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,,,,9,9,9,9,9,9,9,9,9,9,,,,,,9,9,9', +'9,9,9,9,9,9,,,9,,,,,,,,9,9,,9,9,9,9,9,9,9,,,9,9,,,,9,9,9,9,,,,,,,,,', +',,,,9,9,,9,9,9,9,9,9,9,9,9,9,9,9,,,9,9,,,,,,,,,,,,,,9,8,8,8,8,8,8,8', +'8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,,,,8,8,8,8,8,8,8,8,8,8,,,,,,8,8,8', +'8,8,8,8,8,8,8,,8,,,,,,,,8,8,,8,8,8,8,8,8,8,,,8,8,,,,8,8,8,8,,,,,,,,', +',,,,,8,8,,8,8,8,8,8,8,8,8,8,8,8,8,,,8,8,,,,,,,,,,,,,,8,72,72,72,72,72', +'72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,,,,72,72,72', +'72,72,72,72,72,72,72,,,,,,72,72,72,72,72,72,72,72,72,72,72,72,,72,,', +',,,72,72,,72,72,72,72,72,72,72,,,72,72,,,,72,72,72,72,,,,,,72,,,,,,', +',72,72,,72,72,72,72,72,72,72,72,72,72,72,72,,,72,729,729,729,729,729', +'729,729,729,729,729,729,729,729,729,729,729,729,729,729,729,729,729', +'729,729,,,,729,729,729,729,729,729,729,729,729,729,,,,,,729,729,729', +'729,729,729,729,729,729,,,729,,,,,,,,729,729,,729,729,729,729,729,729', +'729,,,729,729,,,,729,729,729,729,,,,,,,,,,,,,,729,729,,729,729,729,729', +'729,729,729,729,729,729,729,729,529,529,729,,529,,,,,,,,529,529,,529', +'529,529,529,529,529,529,,,529,529,,,,529,529,529,529,,,,,,529,,,,,,', +',529,529,,529,529,529,529,529,529,529,529,529,529,529,529,560,560,529', +',560,,,,,,,,560,560,,560,560,560,560,560,560,560,,,560,560,,,,560,560', +'560,560,,,,,,560,,,,,,,,560,560,,560,560,560,560,560,560,560,560,560', +'560,560,560,604,604,560,,604,,,,,,,,604,604,,604,604,604,604,604,604', +'604,,,604,604,,,,604,604,604,604,,,,,,604,,,,,,,,604,604,,604,604,604', +'604,604,604,604,604,604,604,604,604,603,603,604,,603,,,,,,,,603,603', +',603,603,603,603,603,603,603,,,603,603,,,,603,603,603,603,,,,,,603,', +',,,,,,603,603,,603,603,603,603,603,603,603,603,603,603,603,603,219,219', +'603,,219,,,,,,,,219,219,,219,219,219,219,219,219,219,,,219,219,,,,219', +'219,219,219,,,,,,219,,,,,,,,219,219,,219,219,219,219,219,219,219,219', +'219,219,219,219,268,268,219,,268,,,,,,,,268,268,,268,268,268,268,268', +'268,268,,,268,268,,,,268,268,268,268,,,,,,,,,,,,,,268,268,,268,268,268', +'268,268,268,268,268,268,268,268,268,220,220,268,,220,,,,,,,,220,220', +',220,220,220,220,220,220,220,,,220,220,,,,220,220,220,220,,,,,,220,', +',,,,,,220,220,,220,220,220,220,220,220,220,220,220,220,220,220,456,456', +'220,,456,,,,,,,,456,456,,456,456,456,456,456,456,456,,,456,456,,,,456', +'456,456,456,,,,,,456,,,,,,,,456,456,,456,456,456,456,456,456,456,456', +'456,456,456,456,455,455,456,,455,,,,,,,,455,455,,455,455,455,455,455', +'455,455,,,455,455,,,,455,455,455,455,,,,,,455,,,,,,,,455,455,,455,455', +'455,455,455,455,455,455,455,455,455,455,975,975,455,,975,,,,,,,,975', +'975,,975,975,975,975,975,975,975,,,975,975,,,,975,975,975,975,,,,,,975', +',,,,,,,975,975,,975,975,975,975,975,975,975,975,975,975,975,975,567', +'567,975,,567,,,,,,,,567,567,,567,567,567,567,567,567,567,,,567,567,', +',,567,567,567,567,,,,,,567,,,,,,,,567,567,,567,567,567,567,567,567,567', +'567,567,567,567,567,566,566,567,,566,,,,,,,,566,566,,566,566,566,566', +'566,566,566,,,566,566,,,,566,566,566,566,,,,,,566,,,,,,,,566,566,,566', +'566,566,566,566,566,566,566,566,566,566,566,974,974,566,,974,,,,,,,', +'974,974,,974,974,974,974,974,974,974,,,974,974,,,,974,974,974,974,,', +',,,974,,,,,,,,974,974,,974,974,974,974,974,974,974,974,974,974,974,974', +'970,970,974,,970,,,,,,,,970,970,,970,970,970,970,970,970,970,,,970,970', +',,,970,970,970,970,,,,,,970,,,,,,,,970,970,,970,970,970,970,970,970', +'970,970,970,970,970,970,519,519,970,,519,,,,,,,,519,519,,519,519,519', +'519,519,519,519,,,519,519,,,,519,519,519,519,,,,,,519,,,,,,,,519,519', +',519,519,519,519,519,519,519,519,519,519,519,519,520,520,519,,520,,', +',,,,,520,520,,520,520,520,520,520,520,520,,,520,520,,,,520,520,520,520', +',,,,,520,,,,,,,,520,520,,520,520,520,520,520,520,520,520,520,520,520', +'520,559,559,520,,559,,,,,,,,559,559,,559,559,559,559,559,559,559,,,559', +'559,,,,559,559,559,559,,,,,,559,,,,,,,,559,559,,559,559,559,559,559', +'559,559,559,559,559,559,559,530,530,559,,530,,,,,,,,530,530,,530,530', +'530,530,530,530,530,,,530,530,,,,530,530,530,530,,,,,,530,,,,,,,,530', +'530,,530,530,530,530,530,530,530,530,530,530,530,530,,806,530,806,806', +'806,806,806,,728,,728,728,728,728,728,806,,,,,,,,728,,990,,990,990,990', +'990,990,,,,,,806,,,990,,,,,728,806,806,806,806,,,,806,728,728,728,728', +',,,728,990,,911,,911,911,911,911,911,990,990,990,990,,,,990,911,,913', +',913,913,913,913,913,,727,,727,727,727,727,727,913,,,,,911,,,727,,,', +',,911,911,911,911,,,,911,913,,,,,,,,727,913,913,913,913,,,,913,727,727', +'727,727,,,996,727,996,996,996,996,996,,935,,935,935,935,935,935,996', +',,,,,,,935,,937,,937,937,937,937,937,,,,,,996,,,937,,,,,935,,,996,996', +',,,996,935,935,935,935,,,,935,937,,939,,939,939,939,939,939,,,937,937', +',,,937,939,,941,,941,941,941,941,941,1011,,1011,1011,1011,1011,1011', +',941,,,,,939,,1011,,669,,669,669,669,669,669,939,939,,,,939,941,,669', +',,,,1011,,,,941,941,,,,941,,1011,1011,,,,1011,669,,547,,547,547,547', +'547,547,669,669,669,669,,,,669,547,,804,,804,804,804,804,804,808,,808', +'808,808,808,808,,804,,,,,547,547,808,,,,,,,547,547,547,547,,,,547,804', +',,,,,,808,,804,804,804,804,,,,804,,808,808,,,,808' ] + racc_action_check = arr = ::Array.new(24631, nil) + idx = 0 + clist.each do |str| + str.split(',', -1).each do |i| + arr[idx] = i.to_i unless i.empty? + idx += 1 + end + end + +racc_action_pointer = [ + 1920, 101, nil, 270, nil, 11209, 1358, 1126, 22816, 22688, + 1121, nil, 1055, 1044, 567, 1074, 768, 416, nil, -79, + 11471, 2620, 1126, nil, 334, nil, 232, 1423, 1533, 11733, + 11864, 11995, nil, 4020, 12126, 12257, nil, 1001, 841, 837, + 1039, 171, 12658, 12789, 521, 12920, 927, 654, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 1208, nil, 13321, + 13452, 13583, -8, nil, 13714, 13845, nil, nil, 13976, 14115, + 14246, 14377, 22944, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 602, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 574, nil, nil, 686, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 1035, nil, 14516, nil, nil, nil, + nil, 14655, 14786, 14917, 15048, 15187, nil, 4580, nil, 577, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 895, nil, 5000, 15580, 15711, 15842, 15973, 16104, 16235, 23362, + 23484, nil, nil, 16497, 16628, 5691, nil, nil, 582, 160, + 223, 927, 141, 823, 874, nil, 6346, 3740, 869, 6608, + 6739, 6870, 7001, 7132, 7263, 7394, 7525, 7656, 7787, 7918, + 8049, 8180, 8311, 8442, 8573, 8704, 8835, 8966, 9097, 9228, + 9359, nil, nil, nil, nil, 9490, nil, nil, 23423, nil, + nil, 859, 9752, 9883, nil, nil, nil, nil, nil, nil, + nil, 10014, nil, 2060, nil, 809, 805, nil, 10276, 847, + 10407, nil, nil, 10538, 10669, nil, nil, 268, nil, 10808, + 1412, 814, 778, 3040, 787, 825, 764, 16759, 2060, 977, + 940, 908, 805, 770, nil, 742, 697, 165, nil, nil, + nil, 720, 220, 657, 17422, nil, 365, 719, 658, nil, + 668, 17815, nil, 17946, 4440, 1349, 602, nil, 361, 360, + 625, 602, 349, 616, nil, nil, 250, 10, -1, 19264, + 4300, 2340, 121, 676, 554, 5, 40, 578, 610, 11, + 639, nil, nil, 467, 230, -21, nil, 436, nil, 530, + 19919, nil, nil, nil, 772, 771, 662, 660, 659, 607, + 555, 554, 442, nil, 118, nil, 20836, nil, 290, 498, + 501, 390, 495, -37, -27, 386, nil, nil, nil, nil, + nil, nil, nil, nil, 300, 22560, nil, nil, nil, nil, + 294, nil, nil, 268, 22293, 225, nil, nil, 208, nil, + 809, 105, 259, nil, nil, 1780, nil, nil, nil, nil, + nil, 1920, 148, nil, 64, 101, 804, 756, 1645, nil, + nil, nil, 464, 222, 258, nil, nil, 936, 1072, nil, + nil, nil, 18, nil, 290, 23606, 23545, 22162, 437, 22031, + 21900, 21769, 2900, 3880, -46, 1098, 353, 373, 375, 377, + 4300, 1485, 1596, 3460, 3040, 4160, 3180, 4020, 3320, 893, + 1025, 3740, 3600, 2340, 1311, nil, 1344, nil, nil, nil, + nil, 339, nil, nil, nil, 345, nil, nil, 21638, nil, + 21507, nil, 21376, nil, 215, nil, nil, nil, 21237, 1538, + nil, 369, 376, nil, nil, 389, 21098, 394, 20967, 23972, + 24033, 690, 439, nil, 20705, 412, nil, 20574, 20443, 23118, + 24155, 1159, 2760, 20312, 546, 554, 435, 478, nil, 20181, + nil, nil, 11070, nil, nil, nil, nil, 24502, 4160, 564, + nil, 1780, 90, 576, 599, 596, 609, 20050, 19788, 24094, + 23179, -19, nil, nil, 512, nil, 23789, 23728, 19657, nil, + nil, 213, 2200, 580, nil, -33, nil, nil, nil, 1269, + nil, nil, nil, 554, nil, nil, 258, nil, 324, nil, + nil, 544, nil, 554, nil, nil, nil, 22432, nil, 557, + 19526, 19395, 19133, 23301, 23240, 19002, 18863, 384, 614, 18732, + 18601, 18470, 18339, 625, nil, nil, 18208, 18077, 637, nil, + nil, nil, 382, 409, 0, 798, 611, 613, 739, nil, + 723, 130, nil, nil, 653, -50, 766, nil, 644, nil, + 694, 17684, nil, nil, 17553, nil, -112, 17291, 670, nil, + 678, 136, 312, 726, 256, 904, 731, 689, 17160, nil, + 764, 24, 819, 17029, nil, nil, nil, 388, nil, 24463, + nil, 711, 713, nil, 718, 720, 724, nil, nil, nil, + nil, nil, nil, nil, nil, 715, 1135, nil, nil, 16898, + nil, nil, nil, 811, nil, nil, nil, 827, nil, nil, + 828, 374, nil, 869, nil, nil, nil, nil, nil, 878, + nil, 6, 765, 41, -18, 68, 135, 2900, 292, 1040, + nil, 794, 3600, 10939, nil, 923, 3460, 24306, 24225, 23057, + nil, nil, nil, nil, nil, nil, 2760, nil, nil, nil, + nil, nil, nil, nil, 806, 10145, 824, -85, 331, 110, + 354, nil, 2200, 9621, nil, 824, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 6477, 6215, 6084, 5953, + 292, 5822, nil, -59, nil, nil, 870, nil, nil, 1308, + nil, 3180, nil, nil, nil, nil, 853, 183, nil, nil, + 979, nil, 2620, 867, 929, nil, nil, nil, -9, 891, + 890, nil, nil, 534, 24519, nil, 24217, nil, 24526, nil, + 16366, nil, 1005, nil, 889, 355, 895, nil, nil, nil, + nil, 1018, nil, 15449, 1022, nil, 15318, 3880, 39, 1028, + nil, 1031, 141, 3320, nil, 1042, 922, -50, nil, 926, + 922, 142, nil, nil, 13182, 13051, 2480, 5420, nil, 931, + 932, nil, 941, 942, 943, nil, 974, 959, 955, 949, + 12527, nil, nil, nil, nil, 4720, nil, nil, 76, 12396, + nil, nil, nil, nil, 1005, 963, nil, nil, nil, 973, + 977, nil, 983, 985, nil, 989, nil, nil, 996, 1140, + 999, 1201, nil, nil, -10, nil, nil, 256, nil, nil, + nil, 1126, nil, nil, nil, 1047, nil, nil, 1021, nil, + nil, 24281, nil, 24298, nil, 14424, nil, nil, 1028, 1050, + 11602, 694, 1097, nil, 2480, 79, 33, 766, 1102, 36, + nil, 5560, 5280, nil, nil, 24366, nil, 24383, nil, 24422, + nil, 24439, nil, nil, nil, nil, 320, 865, 1025, 5140, + nil, nil, nil, nil, 4860, 1028, nil, nil, 1030, 1034, + 1036, 1038, nil, 1040, nil, 353, nil, nil, nil, 190, + 23911, nil, 1169, 11340, 23850, 23667, 35, 1093, 1201, 1078, + 1079, 1080, 1085, 1086, 1389, 1093, 1427, 324, 1218, nil, + 24242, nil, 16806, nil, 21145, nil, 24358, nil, nil, nil, + 914, 1140, 1141, nil, 1101, 32, 34, 109, 69, nil, + nil, 24446, nil, nil, nil, nil, 1279, -101, nil, nil, + -84, -80, -71, -38, nil, 26, -11, 42, 12304, nil, + nil, nil, nil, nil, 72, nil ] + +racc_action_default = [ + -3, -611, -1, -597, -4, -611, -7, -611, -611, -611, + -611, -30, -611, -611, -34, -611, -611, -289, -46, -599, + -611, -51, -55, -56, -57, -61, -266, -266, -266, -302, + -332, -333, -73, -12, -77, -85, -87, -611, -501, -502, + -611, -611, -611, -611, -225, -611, -599, -239, -280, -281, + -282, -283, -284, -285, -286, -287, -288, -585, -291, -295, + -610, -575, -310, -312, -611, -611, -53, -53, -597, -611, + -611, -611, -611, -334, -335, -337, -338, -339, -340, -442, + -443, -444, -445, -446, -467, -449, -450, -469, -471, -454, + -459, -463, -465, -481, -467, -483, -485, -486, -487, -488, + -583, -490, -491, -584, -493, -494, -495, -496, -497, -498, + -499, -500, -505, -506, -611, -2, -598, -606, -607, -608, + -6, -611, -611, -611, -611, -611, -8, -3, -18, -611, + -116, -117, -118, -119, -120, -121, -122, -123, -124, -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, -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, + -23, -125, -12, -611, -611, -611, -611, -611, -256, -611, + -611, -595, -596, -611, -611, -599, -600, -50, -611, -501, + -502, -611, -289, -611, -611, -231, -611, -12, -611, -210, + -211, -611, -611, -611, -611, -611, -611, -611, -611, -611, + -611, -611, -611, -611, -611, -611, -611, -611, -611, -611, + -611, -240, -241, -242, -243, -611, -406, -408, -611, -593, + -594, -62, -256, -611, -309, -412, -421, -423, -68, -418, + -69, -599, -70, -246, -261, -270, -270, -265, -611, -271, + -611, -467, -577, -611, -611, -71, -72, -597, -13, -611, + -16, -611, -75, -12, -599, -611, -78, -81, -12, -93, + -94, -611, -611, -101, -302, -305, -599, -611, -332, -333, + -336, -419, -611, -83, -611, -89, -299, -484, -611, -219, + -220, -611, -232, -611, -12, -293, -599, -247, -603, -603, + -611, -611, -603, -611, -311, -397, -52, -611, -611, -611, + -12, -12, -597, -611, -598, -501, -502, -611, -611, -289, + -611, -350, -351, -111, -112, -611, -114, -611, -289, -509, + -611, -501, -502, -325, -116, -117, -158, -159, -160, -176, + -181, -188, -191, -327, -611, -573, -611, -447, -611, -611, + -611, -611, -611, -611, -611, -611, 1036, -5, -609, -24, + -25, -26, -27, -28, -611, -611, -20, -21, -22, -126, + -611, -31, -33, -276, -611, -611, -275, -32, -611, -35, + -611, -289, -43, -45, -199, -251, -271, -47, -48, -36, + -200, -251, -599, -257, -270, -270, -586, -587, -266, -416, + -588, -589, -587, -586, -266, -415, -417, -588, -589, -42, + -207, -49, -599, -308, -611, -611, -611, -256, -299, -611, + -611, -611, -208, -209, -212, -213, -214, -215, -216, -217, + -221, -222, -223, -224, -226, -227, -228, -229, -230, -233, + -234, -235, -236, -599, -244, -427, -266, -586, -587, -59, + -63, -599, -267, -425, -427, -599, -304, -262, -611, -263, + -611, -268, -611, -272, -611, -580, -582, -11, -598, -15, + -17, -599, -74, -297, -90, -79, -611, -599, -256, -611, + -611, -100, -611, -484, -611, -86, -91, -611, -611, -611, + -611, -245, -237, -611, -434, -611, -599, -611, -248, -605, + -604, -250, -605, -300, -301, -576, -313, -533, -12, -341, + -342, -12, -611, -611, -611, -611, -611, -611, -256, -611, + -611, -299, -53, -111, -112, -113, -611, -611, -256, -321, + -507, -611, -12, -511, -329, -599, -448, -468, -473, -611, + -475, -451, -470, -611, -472, -453, -611, -456, -611, -458, + -461, -611, -462, -611, -482, -9, -19, -611, -29, -279, + -611, -611, -256, -611, -611, -611, -611, -420, -611, -258, + -260, -611, -611, -64, -255, -413, -611, -611, -66, -414, + -307, -601, -586, -587, -586, -587, -599, -611, -611, -428, + -58, -409, -425, -253, -611, -386, -611, -303, -270, -269, + -273, -611, -578, -579, -611, -14, -76, -611, -82, -88, + -599, -586, -587, -254, -590, -99, -611, -84, -611, -206, + -218, -599, -610, -610, -292, -294, -296, -603, -398, -533, + -401, -572, -572, -516, -518, -518, -518, -532, -534, -535, + -536, -537, -538, -539, -540, -541, -611, -543, -545, -547, + -552, -554, -555, -557, -562, -564, -565, -567, -568, -569, + -611, -610, -343, -610, -54, -344, -345, -316, -317, -611, + -319, -611, -599, -586, -587, -590, -298, -12, -111, -112, + -115, -599, -12, -611, -323, -611, -12, -533, -533, -611, + -574, -474, -477, -478, -479, -480, -12, -452, -455, -457, + -460, -464, -466, -127, -277, -611, -599, -586, -587, -587, + -586, -44, -252, -611, -602, -270, -38, -202, -39, -203, + -65, -40, -205, -41, -204, -67, -611, -611, -611, -611, + -420, -611, -407, -386, -411, -410, -611, -422, -387, -599, + -389, -12, -424, -264, -274, -581, -80, -420, -92, -306, + -610, -348, -12, -435, -610, -436, -437, -249, -611, -599, + -611, -514, -515, -611, -611, -525, -611, -528, -611, -530, + -611, -352, -611, -354, -356, -363, -599, -546, -556, -566, + -570, -611, -346, -611, -611, -318, -611, -12, -420, -611, + -420, -611, -611, -12, -326, -611, -599, -611, -330, -611, + -278, -420, -37, -201, -259, -611, -238, -12, -60, -572, + -572, -368, -370, -370, -370, -385, -611, -599, -391, -541, + -549, -550, -560, -426, -10, -12, -441, -349, -611, -611, + -439, -399, -402, -404, -611, -572, -553, -571, -517, -518, + -518, -544, -518, -518, -563, -518, -541, -558, -599, -611, + -361, -611, -542, -314, -611, -315, -273, -610, -320, -322, + -508, -611, -328, -510, -512, -511, -476, -429, -611, -366, + -367, -376, -378, -611, -381, -611, -383, -388, -611, -611, + -611, -548, -611, -440, -12, -501, -502, -611, -611, -289, + -438, -12, -12, -400, -513, -611, -521, -611, -523, -611, + -526, -611, -529, -531, -353, -355, -359, -611, -364, -12, + -430, -431, -432, -324, -12, -572, -551, -369, -370, -370, + -370, -370, -561, -370, -390, -599, -393, -395, -396, -559, + -611, -299, -434, -256, -611, -611, -299, -611, -611, -518, + -518, -518, -518, -357, -611, -362, -611, -610, -611, -365, + -611, -373, -611, -375, -611, -379, -611, -382, -384, -392, + -611, -298, -590, -433, -599, -586, -587, -590, -298, -403, + -405, -611, -519, -522, -524, -527, -611, -360, -347, -331, + -370, -370, -370, -370, -394, -420, -518, -358, -611, -371, + -374, -377, -380, -520, -370, -372 ] + +clist = [ +'224,383,662,29,267,275,279,344,29,556,284,284,284,320,320,337,432,268', +'219,499,119,416,417,29,347,348,269,333,352,285,285,285,29,29,29,126', +'29,429,133,133,327,346,346,449,306,346,6,726,320,320,320,6,138,138,128', +'211,548,551,438,444,338,116,29,821,136,136,323,29,29,490,491,29,525', +'639,227,639,350,351,115,884,642,399,400,401,402,119,565,304,968,286', +'286,286,282,295,296,271,278,280,346,346,346,346,133,634,453,335,781', +'486,790,853,2,948,538,541,607,945,545,816,302,29,339,342,642,430,29', +'29,29,29,29,450,29,628,388,962,120,586,588,535,369,373,636,966,395,353', +'1,856,336,536,334,824,855,582,584,587,587,384,569,360,546,857,496,341', +'6,385,631,874,340,985,499,968,965,403,668,6,871,547,798,331,597,931', +'932,485,493,512,639,639,494,773,950,794,642,868,427,428,387,389,390', +'391,439,284,632,451,452,392,1017,881,393,394,884,731,962,709,945,415', +'415,29,29,29,29,29,29,29,1024,918,670,736,29,29,29,723,455,704,405,879', +'412,362,1027,404,210,876,29,958,776,888,847,397,956,645,345,864,448', +'801,802,284,284,626,722,833,572,573,26,729,284,905,648,26,,411,422,', +',422,657,285,,29,29,422,,,26,285,,,29,,320,720,685,26,26,26,,26,438', +'444,275,522,,677,279,423,29,320,423,,29,,770,552,423,29,881,519,119', +',650,537,,26,,523,,,26,26,346,305,26,510,529,620,787,286,526,,492,29', +'515,504,,286,881,951,495,509,799,571,739,1018,739,,29,29,29,508,712', +'511,653,559,,,517,575,,450,721,430,653,119,633,783,507,29,637,725,26', +'574,,954,,26,26,26,26,26,269,26,302,29,646,,,302,828,786,649,881,653', +',746,,,830,836,837,653,,,,685,760,,608,,665,765,614,,639,827,677,603', +'619,642,,,555,841,909,910,756,758,659,439,133,761,763,284,,1003,797', +'438,444,,,,,,138,,596,,,730,934,,,,,29,136,,,627,614,854,,685,685,,795', +'26,26,26,26,26,26,26,677,677,,,26,26,26,448,811,783,,,880,,882,,320', +',26,439,284,,,,320,,,410,613,439,,661,29,,618,,,,757,759,,859,29,762', +'764,,831,526,,,835,,305,26,26,526,989,29,,439,284,789,26,,,,685,439', +'685,,284,448,29,,952,29,630,,711,638,26,448,29,,26,,,,,26,705,,29,717', +'842,,29,775,924,,,,,439,284,,,,,724,,448,,,,26,,448,305,959,667,960', +',305,949,29,29,,608,29,26,26,26,774,811,29,29,890,,796,29,29,,979,,', +',320,133,,,26,608,614,,448,619,901,320,,,860,138,,743,553,554,26,,,', +'907,751,859,136,859,422,,526,838,843,,,,415,,422,422,,788,755,422,422', +'757,759,764,762,685,1020,,,,,,832,,,1025,851,423,,811,,811,608,,892', +',,423,423,346,,608,423,423,,,,877,,,877,805,807,809,903,,26,,,29,,,', +',29,29,608,,29,,859,,,,978,,,,29,,,,,,866,,983,811,870,,843,,,,,29,988', +',133,858,,,,,,,944,26,860,,1004,860,,860,,860,,26,,858,,,894,29,811', +',811,,,,,,26,,29,,,,,346,,,,,,,422,26,,,26,,653,,,877,811,26,851,,851', +',851,,,29,,26,,29,,26,,,,29,,858,320,423,,701,,,703,,,320,900,29,860', +',860,904,860,852,860,,850,,26,26,,,26,,,29,,,26,26,,,,26,26,,,875,,', +'883,,885,,,,860,,,,,,,,,851,320,851,,851,,851,,,,,,,,,,,,,936,938,,940', +'942,,943,,,,29,,974,,,,,29,29,851,,16,,,,,16,,,999,,,343,,,29,439,284', +',,29,228,,,,,,,,,228,228,228,,16,311,311,,,29,26,,,,,26,26,,608,26,', +'955,,961,850,963,850,,850,26,16,,,448,,228,228,,448,228,357,367,367', +',829,980,26,981,,982,1012,1013,1014,1015,,,,,,,,,,839,912,914,916,,', +',,,,,26,,,,,,,,,,,26,,16,,,,,228,228,228,228,16,1033,16,,1021,,1022', +'850,1023,850,,850,863,850,,,,,,,26,,,867,26,1026,,,,,26,,,,,,13,,413', +'426,,13,1034,,26,850,,,,,,,,,,,,,897,,,,26,,,,,,,13,,,,,991,993,995', +'997,,998,,,,,,,,16,228,420,228,228,420,228,,13,923,,420,228,228,,,,', +'361,,,,,,,16,501,,503,,,505,506,,26,,,,,,,26,26,,,,,,,1029,1030,1031', +'1032,,,,,,,26,228,228,,1035,26,13,,,972,228,,,,,13,977,13,,,,,,,26,', +',,16,,,,16,,987,,311,16,,,,,,,,,,,,39,,,,311,39,,,,,,,,,16,,,,,,,,,', +',,,,,228,16,16,,39,310,310,,,,,,,,,599,,,,,,228,,,13,,418,,,418,39,', +',,,418,,228,,,356,372,372,372,,,,,,13,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,', +',,,,,,,39,,,,,,,,,39,,39,640,,343,,643,,,,,228,,,13,,,,13,,,,,13,,,', +',,,,,,,,,,,,,,,,640,,,343,,,13,,,,,,,,,,,,426,16,,,13,13,,,,311,,228', +',,,,,311,,,,,,,,39,228,,,,,,,,,,,,,,,16,,744,16,,,,,,39,228,640,343', +',,,,,,,228,,,,16,,,,,,,,,,,,,,,,,,,784,,,785,,,,,,,420,228,,,16,,,,', +',420,420,793,,,420,420,,39,,,,39,,,,310,39,,,,,,,,,,,817,,,,,310,,,311', +',,,,,,39,,,,311,,,,,,,,,,,13,39,39,,,,,,,,,,,,,,,,,,,,,,,,840,,,,,,', +',,,,,,,13,,,13,,,38,,16,,,38,,16,228,,,16,,,,,,,13,,,16,,,,,,,,,,,,38', +'309,309,,,420,,,,,,,887,,418,,,,13,,,,,,418,418,38,,896,418,418,,,16', +',,355,371,371,371,,,,,16,,343,,,,,,,,,,,,,,,,,,,,,,,,,,,,,228,,,,16', +'39,,,38,,16,,,310,,,,38,17,38,,310,,17,16,,,,,,,,,,,,,921,,,,,16,,,39', +'927,,39,,,17,313,313,,13,,,,,13,,,,13,,,,,39,,,,,13,,,17,,,,,,,,,,359', +'368,368,,418,,,,,,969,,,,16,39,,38,,,,16,16,,,,,,,,,,13,,,,,,,16,,,38', +'13,16,,,17,,,,,,,,,17,310,17,,,,,228,,,,,310,,,,,,,,,,13,,,,,,13,,,', +',,,15,,,,,15,,13,,,,,,38,,,,38,,,,309,38,,,13,,,,930,,,,15,,,39,,309', +',,39,,,,39,,,38,,,,17,,421,39,,421,,15,,,,421,38,38,,,,,,,,,,,,17,,', +',,,,13,,,,,,,13,13,,,,,,,,39,,,,,,,,,13,,39,,,13,,15,,,,,,,,,15,,15', +',,,,,,,,,,,17,,,,17,,,39,313,17,,,,39,,,,,,,,,,,,313,,39,,,,,,,,17,', +',,,372,,,,,39,,,,926,,17,17,,,,,,,,,,,,,,,,,,,,,15,,15,,,15,,,,,38,15', +',,,,,,309,,,,,,,15,309,372,,,,39,,,,,,,39,39,,,,,,,,,,,38,,,38,,,39', +',,,,39,,,,,,,,,,,,,38,,,,,,,,,,,,,15,,,,15,,,,,15,,,,,,,,,,,38,,,,,', +',,,,,,,,,15,,,,,,,,,,,,,,17,,15,15,,,,,313,,,,,309,,,313,,,,,,,,309', +',,,,,,,,,,,,,,,17,,,17,,,,,,,,,,,,,,,,,,,,,17,,,,,,,735,,,,,,,,,,,,38', +',,,,38,,,,38,421,,,,17,,,,,38,421,421,,,,421,421,,,,,,,,,,,,,,,,,,,', +',,,,,,,,,,313,,,,,,,,38,,,313,,,,,,,,38,,15,,,,,,,,,,,,,,,,,,,,,,,,', +',,,,,,,,38,,,,,,38,15,,,15,,,,,,17,,,,38,17,,,,17,,,,,,15,,371,,17,', +',38,,,,925,,235,,,,,,,,421,283,283,283,,,,,15,,,,15,,329,330,,332,15', +'15,,,,15,15,,,,17,,,,283,283,,,,,,17,,371,,,,38,,,,,,,38,38,,,,,,,,', +',,,,,,,,38,,,,17,38,,,,,17,,,,,,,,,,,,,,17,,,,,,,,,,,,,368,,,,,17,,', +',929,,,,,,,,15,,,,,15,,,,15,,,,,,,,,,15,,,,,,,,,,,,,,,,,15,,,,,,,368', +',,,17,,,,,,,17,17,,,,,,283,425,,15,431,283,,,,,431,17,,,15,,17,,,,,', +',235,,,462,463,464,465,466,467,468,469,470,471,472,473,474,475,476,477', +'478,479,480,481,482,483,,15,,,484,,,15,,,,283,283,,,,,,,,283,15,,,,', +',283,,283,,,283,283,,,,,,15,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,531,,532,', +',,,,,,,,,,,,,,,,,,,,,,,,15,,,,,,,15,15,,,,,,,,,,,,,,,,,15,,,,,15,,,', +',,,,,,,,,,,,,,,,,,,,,283,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,283', +',431,431,431,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,283,,283,,283,,,,,', +',,,,,,,,,,283,,,,,,,,,431,660,,,,,,,,,,,283,,,283,,,,,,,,,,,,,,,283', +'283,,,,,,,,,,283,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,283,431,283,,,,752,', +',283,283,431,431,,,,431,431,,,,,,,,,,,,,,,,,,,,,,,,283,,,283,,,,,,,', +',,,,,,,,,,,283,,,,,,,,,,,,,,,,,,,,,,,,,,283,,,,,,,,,,,,,,,,,,,,,,,,', +',,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,283,,,,,,,,431,,,,,,,,,,,,,431,431,431', +'431,,846,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,283,,,,,,,,,,,,,,,,283', +',,,,,,,,,,,,,,,,,283,431,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,', +',,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,', +',,,,,,,,,,,,,,,,283' ] + racc_goto_table = arr = ::Array.new(3478, nil) + idx = 0 + clist.each do |str| + str.split(',', -1).each do |i| + arr[idx] = i.to_i unless i.empty? + idx += 1 + end + end + +clist = [ +'34,63,11,50,145,81,81,96,50,101,39,39,39,73,73,77,30,42,32,83,105,23', +'23,50,18,18,32,34,18,78,78,78,50,50,50,8,50,27,64,64,71,25,25,27,56', +'25,7,108,73,73,73,7,68,68,16,16,99,99,43,43,78,6,50,100,67,67,57,50', +'50,45,30,50,58,84,21,84,36,36,4,185,189,18,18,18,18,105,61,53,139,80', +'80,80,51,51,51,44,44,44,25,25,25,25,64,46,54,7,134,43,12,132,2,123,79', +'79,31,120,79,122,52,50,80,80,189,70,50,50,50,50,50,70,50,148,162,186', +'5,166,166,9,62,62,148,138,162,4,1,136,112,111,110,12,124,167,167,167', +'167,109,104,102,98,130,54,95,7,94,82,136,76,123,83,139,137,7,140,7,141', +'142,143,74,69,146,147,149,151,54,84,84,152,155,156,157,189,158,25,25', +'161,163,164,165,81,39,48,25,25,168,123,180,169,170,185,171,186,101,120', +'78,78,50,50,50,50,50,50,50,138,136,144,172,50,50,50,173,32,37,26,178', +'24,20,123,2,17,182,50,132,46,122,134,5,183,15,113,13,64,127,127,39,39', +'30,114,115,116,117,47,118,39,119,58,47,,21,21,,,21,58,78,,50,50,21,', +',47,78,,,50,,73,61,179,47,47,47,,47,43,43,81,34,,174,81,19,50,73,19', +',50,,31,18,19,50,180,32,105,,30,34,,47,,71,,,47,47,25,10,47,8,32,54', +'31,80,56,,51,50,57,162,,80,180,12,51,7,144,25,167,100,167,,50,50,50', +'6,30,53,43,32,,,53,25,,70,30,70,43,105,54,83,4,50,54,9,47,42,,108,,47', +'47,47,47,47,32,47,52,50,54,,,52,31,58,54,180,43,,30,,,31,144,144,43', +',,,179,45,,34,,54,45,81,,84,99,174,32,81,189,,,4,31,127,127,27,27,70', +'81,64,27,27,39,,11,79,43,43,,,,,,68,,16,,,54,127,,,,,50,67,,,34,81,133', +',179,179,,23,47,47,47,47,47,47,47,174,174,,,47,47,47,64,121,83,,,133', +',133,,73,,47,81,39,,,,73,,,10,44,81,,25,50,,44,,,,70,70,,179,50,70,70', +',9,56,,,9,,10,47,47,56,127,50,,81,39,54,47,,,,179,81,179,,39,64,50,', +'101,50,44,,78,80,47,64,50,,47,,,,,47,105,,50,36,27,,50,96,99,,,,,81', +'39,,,,,105,,64,,,,47,,64,10,133,80,133,,10,99,50,50,,34,50,47,47,47', +'145,121,50,50,121,,77,50,50,,133,,,,73,64,,,47,34,81,,64,81,9,73,,,181', +'68,,16,10,10,47,,,,9,7,179,67,179,21,,56,63,70,,,,78,,21,21,,56,80,21', +'21,70,70,70,70,179,133,,,,,,18,,,31,128,19,,121,,121,34,,54,,,19,19', +'25,,34,19,19,,,,128,,,128,177,177,177,54,,47,,,50,,,,,50,50,34,,50,', +'179,,,,9,,,,50,,,,,,77,,121,121,77,,70,,,,,50,9,,64,34,,,,,,,54,47,181', +',30,181,,181,,181,,47,,34,,,18,50,121,,121,,,,,,47,,50,,,,,25,,,,,,', +'21,47,,,47,,43,,,128,121,47,128,,128,,128,,,50,,47,,50,,47,,,,50,,34', +'73,19,,10,,,10,,,73,105,50,181,,181,105,181,131,181,,126,,47,47,,,47', +',,50,,,47,47,,,,47,47,,,126,,,131,,131,,,,181,,,,,,,,,128,73,128,,128', +',128,,,,,,,,,,,,,177,177,,177,177,,177,,,,50,,32,,,,,50,50,128,,29,', +',,,29,,,34,,,75,,,50,81,39,,,50,29,,,,,,,,,29,29,29,,29,29,29,,,50,47', +',,,,47,47,,34,47,,126,,131,126,131,126,,126,47,29,,,64,,29,29,,64,29', +'29,29,29,,10,131,47,131,,131,177,177,177,177,,,,,,,,,,10,129,129,129', +',,,,,,,47,,,,,,,,,,,47,,29,,,,,29,29,29,29,29,177,29,,131,,131,126,131', +'126,,126,10,126,,,,,,,47,,,10,47,131,,,,,47,,,,,,22,,75,75,,22,131,', +'47,126,,,,,,,,,,,,,10,,,,47,,,,,,,22,,,,,129,129,129,129,,129,,,,,,', +',29,29,29,29,29,29,29,,22,10,,29,29,29,,,,,22,,,,,,,29,75,,75,,,75,75', +',47,,,,,,,47,47,,,,,,,129,129,129,129,,,,,,,47,29,29,,129,47,22,,,10', +'29,,,,,22,10,22,,,,,,,47,,,,29,,,,29,,10,,29,29,,,,,,,,,,,,60,,,,29', +'60,,,,,,,,,29,,,,,,,,,,,,,,,29,29,29,,60,60,60,,,,,,,,,75,,,,,,29,,', +'22,,22,,,22,60,,,,,22,,29,,,60,60,60,60,,,,,,22,,,,,,,,,,,,,,,,,,,,', +',,,,,,,,,,,,,,,,,60,,,,,,,,,60,,60,75,,75,,75,,,,,29,,,22,,,,22,,,,', +'22,,,,,,,,,,,,,,,,,,,,75,,,75,,,22,,,,,,,,,,,,75,29,,,22,22,,,,29,,29', +',,,,,29,,,,,,,,60,29,,,,,,,,,,,,,,,29,,75,29,,,,,,60,29,75,75,,,,,,', +',29,,,,29,,,,,,,,,,,,,,,,,,,75,,,75,,,,,,,29,29,,,29,,,,,,29,29,75,', +',29,29,,60,,,,60,,,,60,60,,,,,,,,,,,75,,,,,60,,,29,,,,,,,60,,,,29,,', +',,,,,,,,22,60,60,,,,,,,,,,,,,,,,,,,,,,,,75,,,,,,,,,,,,,,22,,,22,,,59', +',29,,,59,,29,29,,,29,,,,,,,22,,,29,,,,,,,,,,,,59,59,59,,,29,,,,,,,75', +',22,,,,22,,,,,,22,22,59,,75,22,22,,,29,,,59,59,59,59,,,,,29,,75,,,,', +',,,,,,,,,,,,,,,,,,,,,,,,29,,,,29,60,,,59,,29,,,60,,,,59,33,59,,60,,33', +'29,,,,,,,,,,,,,29,,,,,29,,,60,29,,60,,,33,33,33,,22,,,,,22,,,,22,,,', +',60,,,,,22,,,33,,,,,,,,,,33,33,33,,22,,,,,,29,,,,29,60,,59,,,,29,29', +',,,,,,,,,22,,,,,,,29,,,59,22,29,,,33,,,,,,,,,33,60,33,,,,,29,,,,,60', +',,,,,,,,,22,,,,,,22,,,,,,,28,,,,,28,,22,,,,,,59,,,,59,,,,59,59,,,22', +',,,22,,,,28,,,60,,59,,,60,,,,60,,,59,,,,33,,33,60,,33,,28,,,,33,59,59', +',,,,,,,,,,,33,,,,,,,22,,,,,,,22,22,,,,,,,,60,,,,,,,,,22,,60,,,22,,28', +',,,,,,,,28,,28,,,,,,,,,,,,33,,,,33,,,60,33,33,,,,60,,,,,,,,,,,,33,,60', +',,,,,,,33,,,,,60,,,,,60,,,,60,,33,33,,,,,,,,,,,,,,,,,,,,,28,,28,,,28', +',,,,59,28,,,,,,,59,,,,,,,28,59,60,,,,60,,,,,,,60,60,,,,,,,,,,,59,,,59', +',,60,,,,,60,,,,,,,,,,,,,59,,,,,,,,,,,,,28,,,,28,,,,,28,,,,,,,,,,,59', +',,,,,,,,,,,,,,28,,,,,,,,,,,,,,33,,28,28,,,,,33,,,,,59,,,33,,,,,,,,59', +',,,,,,,,,,,,,,,33,,,33,,,,,,,,,,,,,,,,,,,,,33,,,,,,,33,,,,,,,,,,,,59', +',,,,59,,,,59,33,,,,33,,,,,59,33,33,,,,33,33,,,,,,,,,,,,,,,,,,,,,,,,', +',,,,,33,,,,,,,,59,,,33,,,,,,,,59,,28,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,', +',59,,,,,,59,28,,,28,,,,,,33,,,,59,33,,,,33,,,,,,28,,59,,33,,,59,,,,59', +',35,,,,,,,,33,35,35,35,,,,,28,,,,28,,35,35,,35,28,28,,,,28,28,,,,33', +',,,35,35,,,,,,33,,59,,,,59,,,,,,,59,59,,,,,,,,,,,,,,,,,59,,,,33,59,', +',,,33,,,,,,,,,,,,,,33,,,,,,,,,,,,,33,,,,,33,,,,33,,,,,,,,28,,,,,28,', +',,28,,,,,,,,,,28,,,,,,,,,,,,,,,,,28,,,,,,,33,,,,33,,,,,,,33,33,,,,,', +'35,35,,28,35,35,,,,,35,33,,,28,,33,,,,,,,35,,,35,35,35,35,35,35,35,35', +'35,35,35,35,35,35,35,35,35,35,35,35,35,35,,28,,,35,,,28,,,,35,35,,,', +',,,,35,28,,,,,,35,,35,,,35,35,,,,,,28,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,', +'35,,35,,,,,,,,,,,,,,,,,,,,,,,,,,28,,,,,,,28,28,,,,,,,,,,,,,,,,,28,,', +',,28,,,,,,,,,,,,,,,,,,,,,,,,,35,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,', +',,,,,,35,,35,35,35,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,35,,35,,35,,', +',,,,,,,,,,,,,35,,,,,,,,,35,35,,,,,,,,,,,35,,,35,,,,,,,,,,,,,,,35,35', +',,,,,,,,,35,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,35,35,35,,,,35,,,35,35,35', +'35,,,,35,35,,,,,,,,,,,,,,,,,,,,,,,,35,,,35,,,,,,,,,,,,,,,,,,,35,,,,', +',,,,,,,,,,,,,,,,,,,,,35,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,', +',,,,,,,,,,,35,,,,,,,,35,,,,,,,,,,,,,35,35,35,35,,35,,,,,,,,,,,,,,,,', +',,,,,,,,,,,,,,,,,,,,,,35,,,,,,,,,,,,,,,,35,,,,,,,,,,,,,,,,,,35,35,,', +',,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,', +',,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,35' ] + racc_goto_check = arr = ::Array.new(3478, nil) + idx = 0 + clist.each do |str| + str.split(',', -1).each do |i| + arr[idx] = i.to_i unless i.empty? + idx += 1 + end + end + +racc_goto_pointer = [ + nil, 144, 110, nil, 75, 129, 58, 46, 28, -197, + 294, -532, -554, -541, nil, -261, 46, 229, -40, 87, + 166, 54, 1099, -192, 21, -23, 104, -180, 1939, 938, + -202, -318, 2, 1779, -19, 2504, 10, -321, nil, -19, + nil, nil, -7, -161, 69, -202, -390, 260, -289, nil, + 3, 63, 85, 54, -121, nil, 10, 31, -252, 1653, + 1258, -279, 68, -71, 30, nil, nil, 56, 44, -231, + -94, -1, nil, -21, 133, 888, 106, -45, 0, -226, + 60, -21, -322, -267, -425, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 91, 100, -55, nil, -187, -291, + -638, -344, 88, nil, -213, 17, nil, nil, -526, 83, + 90, -188, 87, 185, -313, -467, -115, -124, -313, -575, + -774, -199, -569, -780, -629, nil, 80, -420, -92, 179, + -620, 77, -670, -313, -529, nil, -634, -749, -778, -831, + -375, -624, -170, -492, -323, -18, -693, -693, -354, -85, + nil, -94, -91, nil, nil, -442, -709, -474, -603, nil, + nil, 112, 48, 108, 108, 108, -256, -238, 113, 115, + 115, -370, -355, -341, -248, nil, nil, 38, -571, -259, + -599, -139, -561, -662, nil, -727, -780, nil, nil, -420 ] + +racc_goto_default = [ + nil, nil, nil, 3, nil, 4, 354, 300, nil, nil, + 534, nil, 822, nil, 297, 298, nil, nil, nil, 11, + 12, 18, 233, nil, nil, 14, nil, 419, 234, 328, + nil, nil, 567, 232, 454, 21, nil, nil, 349, 22, + 23, 24, nil, 656, nil, nil, nil, 317, nil, 25, + 314, 433, 32, nil, nil, 34, 37, 36, nil, 229, + 230, 366, nil, 135, 441, 134, 137, 80, 81, nil, + 424, 95, 44, 47, 265, 289, nil, 791, 434, nil, + 435, 446, 615, 497, 287, 273, 48, 49, 50, 51, + 52, 53, 54, 55, 56, nil, 274, 62, nil, nil, + nil, nil, nil, 70, nil, 549, 71, 72, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 813, 684, nil, 814, 957, 849, 672, nil, 673, nil, + nil, 674, nil, 676, nil, 778, nil, nil, nil, 682, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 445, nil, nil, 635, 629, nil, nil, nil, nil, 79, + 82, 83, nil, nil, nil, nil, nil, 577, nil, nil, + nil, nil, nil, nil, 878, 728, 671, nil, 675, 886, + 687, 689, 690, 861, 693, 694, 862, 697, 700, 292 ] + +racc_reduce_table = [ + 0, 0, :racc_error, + 1, 146, :_reduce_none, + 2, 147, :_reduce_2, + 0, 148, :_reduce_3, + 1, 148, :_reduce_4, + 3, 148, :_reduce_5, + 2, 148, :_reduce_6, + 1, 150, :_reduce_none, + 2, 150, :_reduce_8, + 3, 153, :_reduce_9, + 4, 154, :_reduce_10, + 2, 155, :_reduce_11, + 0, 159, :_reduce_12, + 1, 159, :_reduce_13, + 3, 159, :_reduce_14, + 2, 159, :_reduce_15, + 1, 160, :_reduce_none, + 2, 160, :_reduce_17, + 0, 171, :_reduce_18, + 4, 152, :_reduce_19, + 3, 152, :_reduce_20, + 3, 152, :_reduce_21, + 3, 152, :_reduce_22, + 2, 152, :_reduce_23, + 3, 152, :_reduce_24, + 3, 152, :_reduce_25, + 3, 152, :_reduce_26, + 3, 152, :_reduce_27, + 3, 152, :_reduce_28, + 4, 152, :_reduce_29, + 1, 152, :_reduce_none, + 3, 152, :_reduce_31, + 3, 152, :_reduce_32, + 3, 152, :_reduce_33, + 1, 152, :_reduce_none, + 3, 164, :_reduce_35, + 3, 164, :_reduce_36, + 6, 164, :_reduce_37, + 5, 164, :_reduce_38, + 5, 164, :_reduce_39, + 5, 164, :_reduce_40, + 5, 164, :_reduce_41, + 3, 164, :_reduce_42, + 1, 172, :_reduce_none, + 3, 172, :_reduce_44, + 1, 172, :_reduce_none, + 1, 170, :_reduce_none, + 3, 170, :_reduce_47, + 3, 170, :_reduce_48, + 3, 170, :_reduce_49, + 2, 170, :_reduce_50, + 1, 170, :_reduce_none, + 1, 163, :_reduce_none, + 0, 183, :_reduce_53, + 3, 181, :_reduce_54, + 1, 166, :_reduce_none, + 1, 166, :_reduce_none, + 1, 185, :_reduce_none, + 4, 185, :_reduce_58, + 0, 193, :_reduce_59, + 4, 190, :_reduce_60, + 1, 192, :_reduce_none, + 2, 184, :_reduce_62, + 3, 184, :_reduce_63, + 4, 184, :_reduce_64, + 5, 184, :_reduce_65, + 4, 184, :_reduce_66, + 5, 184, :_reduce_67, + 2, 184, :_reduce_68, + 2, 184, :_reduce_69, + 2, 184, :_reduce_70, + 2, 184, :_reduce_71, + 2, 184, :_reduce_72, + 1, 165, :_reduce_73, + 3, 165, :_reduce_74, + 1, 198, :_reduce_75, + 3, 198, :_reduce_76, + 1, 197, :_reduce_none, + 2, 197, :_reduce_78, + 3, 197, :_reduce_79, + 5, 197, :_reduce_80, + 2, 197, :_reduce_81, + 4, 197, :_reduce_82, + 2, 197, :_reduce_83, + 4, 197, :_reduce_84, + 1, 197, :_reduce_85, + 3, 197, :_reduce_86, + 1, 201, :_reduce_none, + 3, 201, :_reduce_88, + 2, 200, :_reduce_89, + 3, 200, :_reduce_90, + 1, 203, :_reduce_91, + 3, 203, :_reduce_92, + 1, 202, :_reduce_93, + 1, 202, :_reduce_94, + 4, 202, :_reduce_95, + 3, 202, :_reduce_96, + 3, 202, :_reduce_97, + 3, 202, :_reduce_98, + 3, 202, :_reduce_99, + 2, 202, :_reduce_100, + 1, 202, :_reduce_101, + 1, 167, :_reduce_102, + 1, 167, :_reduce_103, + 4, 167, :_reduce_104, + 3, 167, :_reduce_105, + 3, 167, :_reduce_106, + 3, 167, :_reduce_107, + 3, 167, :_reduce_108, + 2, 167, :_reduce_109, + 1, 167, :_reduce_110, + 1, 206, :_reduce_111, + 1, 206, :_reduce_none, + 2, 207, :_reduce_113, + 1, 207, :_reduce_114, + 3, 207, :_reduce_115, + 1, 208, :_reduce_none, + 1, 208, :_reduce_none, + 1, 208, :_reduce_none, + 1, 208, :_reduce_none, + 1, 208, :_reduce_none, + 1, 211, :_reduce_121, + 1, 211, :_reduce_none, + 1, 161, :_reduce_none, + 1, 161, :_reduce_none, + 1, 162, :_reduce_125, + 0, 214, :_reduce_126, + 4, 162, :_reduce_127, + 1, 209, :_reduce_none, + 1, 209, :_reduce_none, + 1, 209, :_reduce_none, + 1, 209, :_reduce_none, + 1, 209, :_reduce_none, + 1, 209, :_reduce_none, + 1, 209, :_reduce_none, + 1, 209, :_reduce_none, + 1, 209, :_reduce_none, + 1, 209, :_reduce_none, + 1, 209, :_reduce_none, + 1, 209, :_reduce_none, + 1, 209, :_reduce_none, + 1, 209, :_reduce_none, + 1, 209, :_reduce_none, + 1, 209, :_reduce_none, + 1, 209, :_reduce_none, + 1, 209, :_reduce_none, + 1, 209, :_reduce_none, + 1, 209, :_reduce_none, + 1, 209, :_reduce_none, + 1, 209, :_reduce_none, + 1, 209, :_reduce_none, + 1, 209, :_reduce_none, + 1, 209, :_reduce_none, + 1, 209, :_reduce_none, + 1, 209, :_reduce_none, + 1, 209, :_reduce_none, + 1, 209, :_reduce_none, + 1, 209, :_reduce_none, + 1, 210, :_reduce_none, + 1, 210, :_reduce_none, + 1, 210, :_reduce_none, + 1, 210, :_reduce_none, + 1, 210, :_reduce_none, + 1, 210, :_reduce_none, + 1, 210, :_reduce_none, + 1, 210, :_reduce_none, + 1, 210, :_reduce_none, + 1, 210, :_reduce_none, + 1, 210, :_reduce_none, + 1, 210, :_reduce_none, + 1, 210, :_reduce_none, + 1, 210, :_reduce_none, + 1, 210, :_reduce_none, + 1, 210, :_reduce_none, + 1, 210, :_reduce_none, + 1, 210, :_reduce_none, + 1, 210, :_reduce_none, + 1, 210, :_reduce_none, + 1, 210, :_reduce_none, + 1, 210, :_reduce_none, + 1, 210, :_reduce_none, + 1, 210, :_reduce_none, + 1, 210, :_reduce_none, + 1, 210, :_reduce_none, + 1, 210, :_reduce_none, + 1, 210, :_reduce_none, + 1, 210, :_reduce_none, + 1, 210, :_reduce_none, + 1, 210, :_reduce_none, + 1, 210, :_reduce_none, + 1, 210, :_reduce_none, + 1, 210, :_reduce_none, + 1, 210, :_reduce_none, + 1, 210, :_reduce_none, + 1, 210, :_reduce_none, + 1, 210, :_reduce_none, + 1, 210, :_reduce_none, + 1, 210, :_reduce_none, + 1, 210, :_reduce_none, + 3, 180, :_reduce_199, + 3, 180, :_reduce_200, + 6, 180, :_reduce_201, + 5, 180, :_reduce_202, + 5, 180, :_reduce_203, + 5, 180, :_reduce_204, + 5, 180, :_reduce_205, + 4, 180, :_reduce_206, + 3, 180, :_reduce_207, + 3, 180, :_reduce_208, + 3, 180, :_reduce_209, + 2, 180, :_reduce_210, + 2, 180, :_reduce_211, + 3, 180, :_reduce_212, + 3, 180, :_reduce_213, + 3, 180, :_reduce_214, + 3, 180, :_reduce_215, + 3, 180, :_reduce_216, + 3, 180, :_reduce_217, + 4, 180, :_reduce_218, + 2, 180, :_reduce_219, + 2, 180, :_reduce_220, + 3, 180, :_reduce_221, + 3, 180, :_reduce_222, + 3, 180, :_reduce_223, + 3, 180, :_reduce_224, + 1, 180, :_reduce_none, + 3, 180, :_reduce_226, + 3, 180, :_reduce_227, + 3, 180, :_reduce_228, + 3, 180, :_reduce_229, + 3, 180, :_reduce_230, + 2, 180, :_reduce_231, + 2, 180, :_reduce_232, + 3, 180, :_reduce_233, + 3, 180, :_reduce_234, + 3, 180, :_reduce_235, + 3, 180, :_reduce_236, + 3, 180, :_reduce_237, + 6, 180, :_reduce_238, + 1, 180, :_reduce_none, + 1, 219, :_reduce_none, + 1, 219, :_reduce_none, + 1, 219, :_reduce_none, + 1, 219, :_reduce_none, + 3, 217, :_reduce_244, + 3, 217, :_reduce_245, + 1, 220, :_reduce_none, + 1, 221, :_reduce_none, + 2, 221, :_reduce_none, + 4, 221, :_reduce_249, + 2, 221, :_reduce_250, + 1, 215, :_reduce_none, + 3, 215, :_reduce_252, + 3, 226, :_reduce_253, + 0, 227, :_reduce_254, + 1, 227, :_reduce_none, + 0, 175, :_reduce_256, + 1, 175, :_reduce_none, + 2, 175, :_reduce_none, + 4, 175, :_reduce_259, + 2, 175, :_reduce_260, + 1, 196, :_reduce_261, + 2, 196, :_reduce_262, + 2, 196, :_reduce_263, + 4, 196, :_reduce_264, + 1, 196, :_reduce_265, + 0, 230, :_reduce_266, + 2, 189, :_reduce_267, + 2, 229, :_reduce_268, + 2, 228, :_reduce_269, + 0, 228, :_reduce_270, + 1, 223, :_reduce_271, + 2, 223, :_reduce_272, + 3, 223, :_reduce_273, + 4, 223, :_reduce_274, + 1, 169, :_reduce_275, + 1, 169, :_reduce_none, + 3, 168, :_reduce_277, + 4, 168, :_reduce_278, + 2, 168, :_reduce_279, + 1, 218, :_reduce_none, + 1, 218, :_reduce_none, + 1, 218, :_reduce_none, + 1, 218, :_reduce_none, + 1, 218, :_reduce_none, + 1, 218, :_reduce_none, + 1, 218, :_reduce_none, + 1, 218, :_reduce_none, + 1, 218, :_reduce_none, + 1, 218, :_reduce_none, + 1, 218, :_reduce_290, + 0, 255, :_reduce_291, + 4, 218, :_reduce_292, + 0, 256, :_reduce_293, + 4, 218, :_reduce_294, + 0, 257, :_reduce_295, + 4, 218, :_reduce_296, + 3, 218, :_reduce_297, + 3, 218, :_reduce_298, + 2, 218, :_reduce_299, + 3, 218, :_reduce_300, + 3, 218, :_reduce_301, + 1, 218, :_reduce_302, + 4, 218, :_reduce_303, + 3, 218, :_reduce_304, + 1, 218, :_reduce_305, + 5, 218, :_reduce_306, + 4, 218, :_reduce_307, + 3, 218, :_reduce_308, + 2, 218, :_reduce_309, + 1, 218, :_reduce_none, + 2, 218, :_reduce_311, + 0, 258, :_reduce_312, + 3, 218, :_reduce_313, + 6, 218, :_reduce_314, + 6, 218, :_reduce_315, + 4, 218, :_reduce_316, + 4, 218, :_reduce_317, + 5, 218, :_reduce_318, + 4, 218, :_reduce_319, + 6, 218, :_reduce_320, + 0, 259, :_reduce_321, + 6, 218, :_reduce_322, + 0, 260, :_reduce_323, + 7, 218, :_reduce_324, + 0, 261, :_reduce_325, + 5, 218, :_reduce_326, + 0, 262, :_reduce_327, + 6, 218, :_reduce_328, + 0, 263, :_reduce_329, + 0, 264, :_reduce_330, + 9, 218, :_reduce_331, + 1, 218, :_reduce_332, + 1, 218, :_reduce_333, + 1, 218, :_reduce_334, + 1, 218, :_reduce_335, + 1, 174, :_reduce_none, + 1, 248, :_reduce_337, + 1, 251, :_reduce_338, + 1, 252, :_reduce_339, + 1, 195, :_reduce_340, + 1, 244, :_reduce_none, + 1, 244, :_reduce_none, + 2, 244, :_reduce_343, + 1, 182, :_reduce_none, + 1, 182, :_reduce_none, + 1, 245, :_reduce_none, + 5, 245, :_reduce_347, + 1, 157, :_reduce_none, + 2, 157, :_reduce_349, + 1, 247, :_reduce_none, + 1, 247, :_reduce_none, + 1, 265, :_reduce_352, + 3, 265, :_reduce_353, + 1, 268, :_reduce_354, + 3, 268, :_reduce_355, + 1, 267, :_reduce_none, + 4, 267, :_reduce_357, + 6, 267, :_reduce_358, + 3, 267, :_reduce_359, + 5, 267, :_reduce_360, + 2, 267, :_reduce_361, + 4, 267, :_reduce_362, + 1, 267, :_reduce_363, + 3, 267, :_reduce_364, + 4, 269, :_reduce_365, + 2, 269, :_reduce_366, + 2, 269, :_reduce_367, + 1, 269, :_reduce_368, + 2, 274, :_reduce_369, + 0, 274, :_reduce_370, + 6, 275, :_reduce_371, + 8, 275, :_reduce_372, + 4, 275, :_reduce_373, + 6, 275, :_reduce_374, + 4, 275, :_reduce_375, + 2, 275, :_reduce_none, + 6, 275, :_reduce_377, + 2, 275, :_reduce_378, + 4, 275, :_reduce_379, + 6, 275, :_reduce_380, + 2, 275, :_reduce_381, + 4, 275, :_reduce_382, + 2, 275, :_reduce_383, + 4, 275, :_reduce_384, + 1, 275, :_reduce_none, + 0, 279, :_reduce_386, + 1, 279, :_reduce_387, + 3, 280, :_reduce_388, + 1, 280, :_reduce_389, + 4, 280, :_reduce_390, + 1, 281, :_reduce_391, + 4, 281, :_reduce_392, + 1, 282, :_reduce_393, + 3, 282, :_reduce_394, + 1, 283, :_reduce_395, + 1, 283, :_reduce_none, + 0, 287, :_reduce_397, + 0, 288, :_reduce_398, + 4, 243, :_reduce_399, + 4, 285, :_reduce_400, + 1, 285, :_reduce_401, + 0, 291, :_reduce_402, + 4, 286, :_reduce_403, + 0, 292, :_reduce_404, + 4, 286, :_reduce_405, + 0, 294, :_reduce_406, + 4, 290, :_reduce_407, + 2, 186, :_reduce_408, + 4, 186, :_reduce_409, + 5, 186, :_reduce_410, + 5, 186, :_reduce_411, + 2, 242, :_reduce_412, + 4, 242, :_reduce_413, + 4, 242, :_reduce_414, + 3, 242, :_reduce_415, + 3, 242, :_reduce_416, + 3, 242, :_reduce_417, + 2, 242, :_reduce_418, + 1, 242, :_reduce_419, + 4, 242, :_reduce_420, + 0, 296, :_reduce_421, + 4, 241, :_reduce_422, + 0, 297, :_reduce_423, + 4, 241, :_reduce_424, + 0, 298, :_reduce_425, + 3, 191, :_reduce_426, + 0, 299, :_reduce_427, + 0, 300, :_reduce_428, + 4, 293, :_reduce_429, + 5, 246, :_reduce_430, + 1, 301, :_reduce_431, + 1, 301, :_reduce_none, + 6, 156, :_reduce_433, + 0, 156, :_reduce_434, + 1, 302, :_reduce_435, + 1, 302, :_reduce_none, + 1, 302, :_reduce_none, + 2, 303, :_reduce_438, + 1, 303, :_reduce_none, + 2, 158, :_reduce_440, + 1, 158, :_reduce_none, + 1, 231, :_reduce_none, + 1, 231, :_reduce_none, + 1, 231, :_reduce_none, + 1, 232, :_reduce_445, + 1, 305, :_reduce_446, + 2, 305, :_reduce_447, + 3, 306, :_reduce_448, + 1, 306, :_reduce_449, + 1, 306, :_reduce_450, + 3, 233, :_reduce_451, + 4, 234, :_reduce_452, + 3, 235, :_reduce_453, + 0, 310, :_reduce_454, + 3, 310, :_reduce_455, + 1, 311, :_reduce_456, + 2, 311, :_reduce_457, + 3, 237, :_reduce_458, + 0, 313, :_reduce_459, + 3, 313, :_reduce_460, + 3, 236, :_reduce_461, + 3, 238, :_reduce_462, + 0, 314, :_reduce_463, + 3, 314, :_reduce_464, + 0, 315, :_reduce_465, + 3, 315, :_reduce_466, + 0, 307, :_reduce_467, + 2, 307, :_reduce_468, + 0, 308, :_reduce_469, + 2, 308, :_reduce_470, + 0, 309, :_reduce_471, + 2, 309, :_reduce_472, + 1, 312, :_reduce_473, + 2, 312, :_reduce_474, + 0, 317, :_reduce_475, + 4, 312, :_reduce_476, + 1, 316, :_reduce_477, + 1, 316, :_reduce_478, + 1, 316, :_reduce_479, + 1, 316, :_reduce_none, + 1, 212, :_reduce_481, + 3, 213, :_reduce_482, + 1, 304, :_reduce_483, + 2, 304, :_reduce_484, + 1, 216, :_reduce_485, + 1, 216, :_reduce_486, + 1, 216, :_reduce_487, + 1, 216, :_reduce_488, + 1, 204, :_reduce_489, + 1, 204, :_reduce_490, + 1, 204, :_reduce_491, + 1, 204, :_reduce_492, + 1, 204, :_reduce_493, + 1, 205, :_reduce_494, + 1, 205, :_reduce_495, + 1, 205, :_reduce_496, + 1, 205, :_reduce_497, + 1, 205, :_reduce_498, + 1, 205, :_reduce_499, + 1, 205, :_reduce_500, + 1, 239, :_reduce_501, + 1, 239, :_reduce_502, + 1, 173, :_reduce_503, + 1, 173, :_reduce_504, + 1, 178, :_reduce_505, + 1, 178, :_reduce_506, + 0, 318, :_reduce_507, + 4, 249, :_reduce_508, + 0, 249, :_reduce_509, + 3, 253, :_reduce_510, + 0, 320, :_reduce_511, + 3, 253, :_reduce_512, + 4, 319, :_reduce_513, + 2, 319, :_reduce_514, + 2, 319, :_reduce_515, + 1, 319, :_reduce_516, + 2, 322, :_reduce_517, + 0, 322, :_reduce_518, + 6, 289, :_reduce_519, + 8, 289, :_reduce_520, + 4, 289, :_reduce_521, + 6, 289, :_reduce_522, + 4, 289, :_reduce_523, + 6, 289, :_reduce_524, + 2, 289, :_reduce_525, + 4, 289, :_reduce_526, + 6, 289, :_reduce_527, + 2, 289, :_reduce_528, + 4, 289, :_reduce_529, + 2, 289, :_reduce_530, + 4, 289, :_reduce_531, + 1, 289, :_reduce_532, + 0, 289, :_reduce_533, + 1, 284, :_reduce_534, + 1, 284, :_reduce_535, + 1, 284, :_reduce_536, + 1, 284, :_reduce_537, + 1, 266, :_reduce_none, + 1, 266, :_reduce_539, + 1, 324, :_reduce_540, + 1, 325, :_reduce_541, + 3, 325, :_reduce_542, + 1, 276, :_reduce_543, + 3, 276, :_reduce_544, + 1, 326, :_reduce_545, + 2, 327, :_reduce_546, + 1, 327, :_reduce_547, + 2, 328, :_reduce_548, + 1, 328, :_reduce_549, + 1, 270, :_reduce_550, + 3, 270, :_reduce_551, + 1, 321, :_reduce_552, + 3, 321, :_reduce_553, + 1, 329, :_reduce_none, + 1, 329, :_reduce_none, + 2, 271, :_reduce_556, + 1, 271, :_reduce_557, + 3, 330, :_reduce_558, + 3, 331, :_reduce_559, + 1, 277, :_reduce_560, + 3, 277, :_reduce_561, + 1, 323, :_reduce_562, + 3, 323, :_reduce_563, + 1, 332, :_reduce_none, + 1, 332, :_reduce_none, + 2, 278, :_reduce_566, + 1, 278, :_reduce_567, + 1, 333, :_reduce_none, + 1, 333, :_reduce_none, + 2, 273, :_reduce_570, + 2, 272, :_reduce_571, + 0, 272, :_reduce_572, + 1, 254, :_reduce_none, + 3, 254, :_reduce_574, + 0, 240, :_reduce_575, + 2, 240, :_reduce_none, + 1, 225, :_reduce_577, + 3, 225, :_reduce_578, + 3, 334, :_reduce_579, + 2, 334, :_reduce_580, + 4, 334, :_reduce_581, + 2, 334, :_reduce_582, + 1, 194, :_reduce_none, + 1, 194, :_reduce_none, + 1, 194, :_reduce_none, + 1, 188, :_reduce_none, + 1, 188, :_reduce_none, + 1, 188, :_reduce_none, + 1, 188, :_reduce_none, + 1, 295, :_reduce_none, + 1, 295, :_reduce_none, + 1, 295, :_reduce_none, + 1, 187, :_reduce_none, + 1, 187, :_reduce_none, + 1, 177, :_reduce_595, + 1, 177, :_reduce_596, + 0, 149, :_reduce_none, + 1, 149, :_reduce_none, + 0, 179, :_reduce_none, + 1, 179, :_reduce_none, + 2, 199, :_reduce_601, + 2, 176, :_reduce_602, + 0, 224, :_reduce_none, + 1, 224, :_reduce_none, + 1, 224, :_reduce_none, + 1, 250, :_reduce_606, + 1, 250, :_reduce_none, + 1, 151, :_reduce_none, + 2, 151, :_reduce_none, + 0, 222, :_reduce_610 ] + +racc_reduce_n = 611 + +racc_shift_n = 1036 + +racc_token_table = { + false => 0, + :error => 1, + :kCLASS => 2, + :kMODULE => 3, + :kDEF => 4, + :kUNDEF => 5, + :kBEGIN => 6, + :kRESCUE => 7, + :kENSURE => 8, + :kEND => 9, + :kIF => 10, + :kUNLESS => 11, + :kTHEN => 12, + :kELSIF => 13, + :kELSE => 14, + :kCASE => 15, + :kWHEN => 16, + :kWHILE => 17, + :kUNTIL => 18, + :kFOR => 19, + :kBREAK => 20, + :kNEXT => 21, + :kREDO => 22, + :kRETRY => 23, + :kIN => 24, + :kDO => 25, + :kDO_COND => 26, + :kDO_BLOCK => 27, + :kDO_LAMBDA => 28, + :kRETURN => 29, + :kYIELD => 30, + :kSUPER => 31, + :kSELF => 32, + :kNIL => 33, + :kTRUE => 34, + :kFALSE => 35, + :kAND => 36, + :kOR => 37, + :kNOT => 38, + :kIF_MOD => 39, + :kUNLESS_MOD => 40, + :kWHILE_MOD => 41, + :kUNTIL_MOD => 42, + :kRESCUE_MOD => 43, + :kALIAS => 44, + :kDEFINED => 45, + :klBEGIN => 46, + :klEND => 47, + :k__LINE__ => 48, + :k__FILE__ => 49, + :k__ENCODING__ => 50, + :tIDENTIFIER => 51, + :tFID => 52, + :tGVAR => 53, + :tIVAR => 54, + :tCONSTANT => 55, + :tLABEL => 56, + :tCVAR => 57, + :tNTH_REF => 58, + :tBACK_REF => 59, + :tSTRING_CONTENT => 60, + :tINTEGER => 61, + :tFLOAT => 62, + :tUPLUS => 63, + :tUMINUS => 64, + :tUNARY_NUM => 65, + :tPOW => 66, + :tCMP => 67, + :tEQ => 68, + :tEQQ => 69, + :tNEQ => 70, + :tGEQ => 71, + :tLEQ => 72, + :tANDOP => 73, + :tOROP => 74, + :tMATCH => 75, + :tNMATCH => 76, + :tDOT => 77, + :tDOT2 => 78, + :tDOT3 => 79, + :tAREF => 80, + :tASET => 81, + :tLSHFT => 82, + :tRSHFT => 83, + :tCOLON2 => 84, + :tCOLON3 => 85, + :tOP_ASGN => 86, + :tASSOC => 87, + :tLPAREN => 88, + :tLPAREN2 => 89, + :tRPAREN => 90, + :tLPAREN_ARG => 91, + :tLBRACK => 92, + :tLBRACK2 => 93, + :tRBRACK => 94, + :tLBRACE => 95, + :tLBRACE_ARG => 96, + :tSTAR => 97, + :tSTAR2 => 98, + :tAMPER => 99, + :tAMPER2 => 100, + :tTILDE => 101, + :tPERCENT => 102, + :tDIVIDE => 103, + :tDSTAR => 104, + :tPLUS => 105, + :tMINUS => 106, + :tLT => 107, + :tGT => 108, + :tPIPE => 109, + :tBANG => 110, + :tCARET => 111, + :tLCURLY => 112, + :tRCURLY => 113, + :tBACK_REF2 => 114, + :tSYMBEG => 115, + :tSTRING_BEG => 116, + :tXSTRING_BEG => 117, + :tREGEXP_BEG => 118, + :tREGEXP_OPT => 119, + :tWORDS_BEG => 120, + :tQWORDS_BEG => 121, + :tSYMBOLS_BEG => 122, + :tQSYMBOLS_BEG => 123, + :tSTRING_DBEG => 124, + :tSTRING_DVAR => 125, + :tSTRING_END => 126, + :tSTRING_DEND => 127, + :tSTRING => 128, + :tSYMBOL => 129, + :tNL => 130, + :tEH => 131, + :tCOLON => 132, + :tCOMMA => 133, + :tSPACE => 134, + :tSEMI => 135, + :tLAMBDA => 136, + :tLAMBEG => 137, + :tCHARACTER => 138, + :tRATIONAL => 139, + :tIMAGINARY => 140, + :tLABEL_END => 141, + :tANDDOT => 142, + :tEQL => 143, + :tLOWEST => 144 } + +racc_nt_base = 145 + +racc_use_result_var = true + +Racc_arg = [ + racc_action_table, + racc_action_check, + racc_action_default, + racc_action_pointer, + racc_goto_table, + racc_goto_check, + racc_goto_default, + racc_goto_pointer, + racc_nt_base, + racc_reduce_table, + racc_token_table, + racc_shift_n, + racc_reduce_n, + racc_use_result_var ] + +Racc_token_to_s_table = [ + "$end", + "error", + "kCLASS", + "kMODULE", + "kDEF", + "kUNDEF", + "kBEGIN", + "kRESCUE", + "kENSURE", + "kEND", + "kIF", + "kUNLESS", + "kTHEN", + "kELSIF", + "kELSE", + "kCASE", + "kWHEN", + "kWHILE", + "kUNTIL", + "kFOR", + "kBREAK", + "kNEXT", + "kREDO", + "kRETRY", + "kIN", + "kDO", + "kDO_COND", + "kDO_BLOCK", + "kDO_LAMBDA", + "kRETURN", + "kYIELD", + "kSUPER", + "kSELF", + "kNIL", + "kTRUE", + "kFALSE", + "kAND", + "kOR", + "kNOT", + "kIF_MOD", + "kUNLESS_MOD", + "kWHILE_MOD", + "kUNTIL_MOD", + "kRESCUE_MOD", + "kALIAS", + "kDEFINED", + "klBEGIN", + "klEND", + "k__LINE__", + "k__FILE__", + "k__ENCODING__", + "tIDENTIFIER", + "tFID", + "tGVAR", + "tIVAR", + "tCONSTANT", + "tLABEL", + "tCVAR", + "tNTH_REF", + "tBACK_REF", + "tSTRING_CONTENT", + "tINTEGER", + "tFLOAT", + "tUPLUS", + "tUMINUS", + "tUNARY_NUM", + "tPOW", + "tCMP", + "tEQ", + "tEQQ", + "tNEQ", + "tGEQ", + "tLEQ", + "tANDOP", + "tOROP", + "tMATCH", + "tNMATCH", + "tDOT", + "tDOT2", + "tDOT3", + "tAREF", + "tASET", + "tLSHFT", + "tRSHFT", + "tCOLON2", + "tCOLON3", + "tOP_ASGN", + "tASSOC", + "tLPAREN", + "tLPAREN2", + "tRPAREN", + "tLPAREN_ARG", + "tLBRACK", + "tLBRACK2", + "tRBRACK", + "tLBRACE", + "tLBRACE_ARG", + "tSTAR", + "tSTAR2", + "tAMPER", + "tAMPER2", + "tTILDE", + "tPERCENT", + "tDIVIDE", + "tDSTAR", + "tPLUS", + "tMINUS", + "tLT", + "tGT", + "tPIPE", + "tBANG", + "tCARET", + "tLCURLY", + "tRCURLY", + "tBACK_REF2", + "tSYMBEG", + "tSTRING_BEG", + "tXSTRING_BEG", + "tREGEXP_BEG", + "tREGEXP_OPT", + "tWORDS_BEG", + "tQWORDS_BEG", + "tSYMBOLS_BEG", + "tQSYMBOLS_BEG", + "tSTRING_DBEG", + "tSTRING_DVAR", + "tSTRING_END", + "tSTRING_DEND", + "tSTRING", + "tSYMBOL", + "tNL", + "tEH", + "tCOLON", + "tCOMMA", + "tSPACE", + "tSEMI", + "tLAMBDA", + "tLAMBEG", + "tCHARACTER", + "tRATIONAL", + "tIMAGINARY", + "tLABEL_END", + "tANDDOT", + "tEQL", + "tLOWEST", + "$start", + "program", + "top_compstmt", + "top_stmts", + "opt_terms", + "top_stmt", + "terms", + "stmt", + "begin_block", + "bodystmt", + "compstmt", + "opt_rescue", + "opt_else", + "opt_ensure", + "stmts", + "stmt_or_begin", + "fitem", + "undef_list", + "expr_value", + "command_asgn", + "mlhs", + "command_call", + "lhs", + "mrhs", + "mrhs_arg", + "expr", + "@1", + "command_rhs", + "var_lhs", + "primary_value", + "opt_call_args", + "rbracket", + "call_op", + "backref", + "opt_nl", + "arg", + "expr_value_do", + "do", + "@2", + "command", + "block_command", + "block_call", + "dot_or_colon", + "operation2", + "command_args", + "cmd_brace_block", + "brace_body", + "fcall", + "@3", + "operation", + "k_return", + "call_args", + "mlhs_basic", + "mlhs_inner", + "rparen", + "mlhs_head", + "mlhs_item", + "mlhs_node", + "mlhs_post", + "user_variable", + "keyword_variable", + "cname", + "cpath", + "fname", + "op", + "reswords", + "fsym", + "symbol", + "dsym", + "@4", + "arg_rhs", + "simple_numeric", + "rel_expr", + "primary", + "relop", + "arg_value", + "aref_args", + "none", + "args", + "trailer", + "assocs", + "paren_args", + "opt_paren_args", + "opt_block_arg", + "block_arg", + "@5", + "literal", + "strings", + "xstring", + "regexp", + "words", + "qwords", + "symbols", + "qsymbols", + "var_ref", + "assoc_list", + "brace_block", + "method_call", + "lambda", + "then", + "if_tail", + "case_body", + "for_var", + "k_class", + "superclass", + "term", + "k_module", + "k_def", + "f_arglist", + "singleton", + "@6", + "@7", + "@8", + "@9", + "@10", + "@11", + "@12", + "@13", + "@14", + "@15", + "f_marg", + "f_norm_arg", + "f_margs", + "f_marg_list", + "block_args_tail", + "f_block_kwarg", + "f_kwrest", + "opt_f_block_arg", + "f_block_arg", + "opt_block_args_tail", + "block_param", + "f_arg", + "f_block_optarg", + "f_rest_arg", + "opt_block_param", + "block_param_def", + "opt_bv_decl", + "bv_decls", + "bvar", + "f_bad_arg", + "f_larglist", + "lambda_body", + "@16", + "@17", + "f_args", + "do_block", + "@18", + "@19", + "do_body", + "@20", + "operation3", + "@21", + "@22", + "@23", + "@24", + "@25", + "cases", + "exc_list", + "exc_var", + "numeric", + "string", + "string1", + "string_contents", + "xstring_contents", + "regexp_contents", + "word_list", + "word", + "string_content", + "symbol_list", + "qword_list", + "qsym_list", + "string_dvar", + "@26", + "@27", + "args_tail", + "@28", + "f_kwarg", + "opt_args_tail", + "f_optarg", + "f_arg_asgn", + "f_arg_item", + "f_label", + "f_kw", + "f_block_kw", + "kwrest_mark", + "f_opt", + "f_block_opt", + "restarg_mark", + "blkarg_mark", + "assoc" ] + +Racc_debug_parser = false + +##### State transition tables end ##### + +# reduce 0 omitted + +# reduce 1 omitted + +def _reduce_2(val, _values, result) + result = @builder.compstmt(val[0]) + + result +end + +def _reduce_3(val, _values, result) + result = [] + + result +end + +def _reduce_4(val, _values, result) + result = [ val[0] ] + + result +end + +def _reduce_5(val, _values, result) + result = val[0] << val[2] + + result +end + +def _reduce_6(val, _values, result) + result = [ val[1] ] + + result +end + +# reduce 7 omitted + +def _reduce_8(val, _values, result) + result = @builder.preexe(val[0], *val[1]) + + result +end + +def _reduce_9(val, _values, result) + result = val + + result +end + +def _reduce_10(val, _values, result) + rescue_bodies = val[1] + else_t, else_ = val[2] + ensure_t, ensure_ = val[3] + + if rescue_bodies.empty? && !else_t.nil? + diagnostic :error, :useless_else, nil, else_t + end + + result = @builder.begin_body(val[0], + rescue_bodies, + else_t, else_, + ensure_t, ensure_) + + result +end + +def _reduce_11(val, _values, result) + result = @builder.compstmt(val[0]) + + result +end + +def _reduce_12(val, _values, result) + result = [] + + result +end + +def _reduce_13(val, _values, result) + result = [ val[0] ] + + result +end + +def _reduce_14(val, _values, result) + result = val[0] << val[2] + + result +end + +def _reduce_15(val, _values, result) + result = [ val[1] ] + + result +end + +# reduce 16 omitted + +def _reduce_17(val, _values, result) + diagnostic :error, :begin_in_method, nil, val[0] + + result +end + +def _reduce_18(val, _values, result) + @lexer.state = :expr_fname + + result +end + +def _reduce_19(val, _values, result) + result = @builder.alias(val[0], val[1], val[3]) + + result +end + +def _reduce_20(val, _values, result) + result = @builder.alias(val[0], + @builder.gvar(val[1]), + @builder.gvar(val[2])) + + result +end + +def _reduce_21(val, _values, result) + result = @builder.alias(val[0], + @builder.gvar(val[1]), + @builder.back_ref(val[2])) + + result +end + +def _reduce_22(val, _values, result) + diagnostic :error, :nth_ref_alias, nil, val[2] + + result +end + +def _reduce_23(val, _values, result) + result = @builder.undef_method(val[0], val[1]) + + result +end + +def _reduce_24(val, _values, result) + result = @builder.condition_mod(val[0], nil, + val[1], val[2]) + + result +end + +def _reduce_25(val, _values, result) + result = @builder.condition_mod(nil, val[0], + val[1], val[2]) + + result +end + +def _reduce_26(val, _values, result) + result = @builder.loop_mod(:while, val[0], val[1], val[2]) + + result +end + +def _reduce_27(val, _values, result) + result = @builder.loop_mod(:until, val[0], val[1], val[2]) + + result +end + +def _reduce_28(val, _values, result) + rescue_body = @builder.rescue_body(val[1], + nil, nil, nil, + nil, val[2]) + + result = @builder.begin_body(val[0], [ rescue_body ]) + + result +end + +def _reduce_29(val, _values, result) + result = @builder.postexe(val[0], val[1], val[2], val[3]) + + result +end + +# reduce 30 omitted + +def _reduce_31(val, _values, result) + result = @builder.multi_assign(val[0], val[1], val[2]) + + result +end + +def _reduce_32(val, _values, result) + result = @builder.assign(val[0], val[1], + @builder.array(nil, val[2], nil)) + + result +end + +def _reduce_33(val, _values, result) + result = @builder.multi_assign(val[0], val[1], val[2]) + + result +end + +# reduce 34 omitted + +def _reduce_35(val, _values, result) + result = @builder.assign(val[0], val[1], val[2]) + + result +end + +def _reduce_36(val, _values, result) + result = @builder.op_assign(val[0], val[1], val[2]) + + result +end + +def _reduce_37(val, _values, result) + result = @builder.op_assign( + @builder.index( + val[0], val[1], val[2], val[3]), + val[4], val[5]) + + result +end + +def _reduce_38(val, _values, result) + result = @builder.op_assign( + @builder.call_method( + val[0], val[1], val[2]), + val[3], val[4]) + + result +end + +def _reduce_39(val, _values, result) + result = @builder.op_assign( + @builder.call_method( + val[0], val[1], val[2]), + val[3], val[4]) + + result +end + +def _reduce_40(val, _values, result) + const = @builder.const_op_assignable( + @builder.const_fetch(val[0], val[1], val[2])) + result = @builder.op_assign(const, val[3], val[4]) + + result +end + +def _reduce_41(val, _values, result) + result = @builder.op_assign( + @builder.call_method( + val[0], val[1], val[2]), + val[3], val[4]) + + result +end + +def _reduce_42(val, _values, result) + @builder.op_assign(val[0], val[1], val[2]) + + result +end + +# reduce 43 omitted + +def _reduce_44(val, _values, result) + rescue_body = @builder.rescue_body(val[1], + nil, nil, nil, + nil, val[2]) + + result = @builder.begin_body(val[0], [ rescue_body ]) + + result +end + +# reduce 45 omitted + +# reduce 46 omitted + +def _reduce_47(val, _values, result) + result = @builder.logical_op(:and, val[0], val[1], val[2]) + + result +end + +def _reduce_48(val, _values, result) + result = @builder.logical_op(:or, val[0], val[1], val[2]) + + result +end + +def _reduce_49(val, _values, result) + result = @builder.not_op(val[0], nil, val[2], nil) + + result +end + +def _reduce_50(val, _values, result) + result = @builder.not_op(val[0], nil, val[1], nil) + + result +end + +# reduce 51 omitted + +# reduce 52 omitted + +def _reduce_53(val, _values, result) + @lexer.cond.push(true) + + result +end + +def _reduce_54(val, _values, result) + @lexer.cond.pop + result = [ val[1], val[2] ] + + result +end + +# reduce 55 omitted + +# reduce 56 omitted + +# reduce 57 omitted + +def _reduce_58(val, _values, result) + result = @builder.call_method(val[0], val[1], val[2], + nil, val[3], nil) + + result +end + +def _reduce_59(val, _values, result) + result = @context.dup + @context.in_block = true + + result +end + +def _reduce_60(val, _values, result) + result = [ val[0], *val[2], val[3] ] + @context.in_block = val[1].in_block + + result +end + +# reduce 61 omitted + +def _reduce_62(val, _values, result) + result = @builder.call_method(nil, nil, val[0], + nil, val[1], nil) + + result +end + +def _reduce_63(val, _values, result) + method_call = @builder.call_method(nil, nil, val[0], + nil, val[1], nil) + + begin_t, args, body, end_t = val[2] + result = @builder.block(method_call, + begin_t, args, body, end_t) + + result +end + +def _reduce_64(val, _values, result) + result = @builder.call_method(val[0], val[1], val[2], + nil, val[3], nil) + + result +end + +def _reduce_65(val, _values, result) + method_call = @builder.call_method(val[0], val[1], val[2], + nil, val[3], nil) + + begin_t, args, body, end_t = val[4] + result = @builder.block(method_call, + begin_t, args, body, end_t) + + result +end + +def _reduce_66(val, _values, result) + result = @builder.call_method(val[0], val[1], val[2], + nil, val[3], nil) + + result +end + +def _reduce_67(val, _values, result) + method_call = @builder.call_method(val[0], val[1], val[2], + nil, val[3], nil) + + begin_t, args, body, end_t = val[4] + result = @builder.block(method_call, + begin_t, args, body, end_t) + + result +end + +def _reduce_68(val, _values, result) + result = @builder.keyword_cmd(:super, val[0], + nil, val[1], nil) + + result +end + +def _reduce_69(val, _values, result) + result = @builder.keyword_cmd(:yield, val[0], + nil, val[1], nil) + + result +end + +def _reduce_70(val, _values, result) + result = @builder.keyword_cmd(:return, val[0], + nil, val[1], nil) + + result +end + +def _reduce_71(val, _values, result) + result = @builder.keyword_cmd(:break, val[0], + nil, val[1], nil) + + result +end + +def _reduce_72(val, _values, result) + result = @builder.keyword_cmd(:next, val[0], + nil, val[1], nil) + + result +end + +def _reduce_73(val, _values, result) + result = @builder.multi_lhs(nil, val[0], nil) + + result +end + +def _reduce_74(val, _values, result) + result = @builder.begin(val[0], val[1], val[2]) + + result +end + +def _reduce_75(val, _values, result) + result = @builder.multi_lhs(nil, val[0], nil) + + result +end + +def _reduce_76(val, _values, result) + result = @builder.multi_lhs(val[0], val[1], val[2]) + + result +end + +# reduce 77 omitted + +def _reduce_78(val, _values, result) + result = val[0]. + push(val[1]) + + result +end + +def _reduce_79(val, _values, result) + result = val[0]. + push(@builder.splat(val[1], val[2])) + + result +end + +def _reduce_80(val, _values, result) + result = val[0]. + push(@builder.splat(val[1], val[2])). + concat(val[4]) + + result +end + +def _reduce_81(val, _values, result) + result = val[0]. + push(@builder.splat(val[1])) + + result +end + +def _reduce_82(val, _values, result) + result = val[0]. + push(@builder.splat(val[1])). + concat(val[3]) + + result +end + +def _reduce_83(val, _values, result) + result = [ @builder.splat(val[0], val[1]) ] + + result +end + +def _reduce_84(val, _values, result) + result = [ @builder.splat(val[0], val[1]), + *val[3] ] + + result +end + +def _reduce_85(val, _values, result) + result = [ @builder.splat(val[0]) ] + + result +end + +def _reduce_86(val, _values, result) + result = [ @builder.splat(val[0]), + *val[2] ] + + result +end + +# reduce 87 omitted + +def _reduce_88(val, _values, result) + result = @builder.begin(val[0], val[1], val[2]) + + result +end + +def _reduce_89(val, _values, result) + result = [ val[0] ] + + result +end + +def _reduce_90(val, _values, result) + result = val[0] << val[1] + + result +end + +def _reduce_91(val, _values, result) + result = [ val[0] ] + + result +end + +def _reduce_92(val, _values, result) + result = val[0] << val[2] + + result +end + +def _reduce_93(val, _values, result) + result = @builder.assignable(val[0]) + + result +end + +def _reduce_94(val, _values, result) + result = @builder.assignable(val[0]) + + result +end + +def _reduce_95(val, _values, result) + result = @builder.index_asgn(val[0], val[1], val[2], val[3]) + + result +end + +def _reduce_96(val, _values, result) + result = @builder.attr_asgn(val[0], val[1], val[2]) + + result +end + +def _reduce_97(val, _values, result) + result = @builder.attr_asgn(val[0], val[1], val[2]) + + result +end + +def _reduce_98(val, _values, result) + result = @builder.attr_asgn(val[0], val[1], val[2]) + + result +end + +def _reduce_99(val, _values, result) + result = @builder.assignable( + @builder.const_fetch(val[0], val[1], val[2])) + + result +end + +def _reduce_100(val, _values, result) + result = @builder.assignable( + @builder.const_global(val[0], val[1])) + + result +end + +def _reduce_101(val, _values, result) + result = @builder.assignable(val[0]) + + result +end + +def _reduce_102(val, _values, result) + result = @builder.assignable(val[0]) + + result +end + +def _reduce_103(val, _values, result) + result = @builder.assignable(val[0]) + + result +end + +def _reduce_104(val, _values, result) + result = @builder.index_asgn(val[0], val[1], val[2], val[3]) + + result +end + +def _reduce_105(val, _values, result) + result = @builder.attr_asgn(val[0], val[1], val[2]) + + result +end + +def _reduce_106(val, _values, result) + result = @builder.attr_asgn(val[0], val[1], val[2]) + + result +end + +def _reduce_107(val, _values, result) + result = @builder.attr_asgn(val[0], val[1], val[2]) + + result +end + +def _reduce_108(val, _values, result) + result = @builder.assignable( + @builder.const_fetch(val[0], val[1], val[2])) + + result +end + +def _reduce_109(val, _values, result) + result = @builder.assignable( + @builder.const_global(val[0], val[1])) + + result +end + +def _reduce_110(val, _values, result) + result = @builder.assignable(val[0]) + + result +end + +def _reduce_111(val, _values, result) + diagnostic :error, :module_name_const, nil, val[0] + + result +end + +# reduce 112 omitted + +def _reduce_113(val, _values, result) + result = @builder.const_global(val[0], val[1]) + + result +end + +def _reduce_114(val, _values, result) + result = @builder.const(val[0]) + + result +end + +def _reduce_115(val, _values, result) + result = @builder.const_fetch(val[0], val[1], val[2]) + + result +end + +# reduce 116 omitted + +# reduce 117 omitted + +# reduce 118 omitted + +# reduce 119 omitted + +# reduce 120 omitted + +def _reduce_121(val, _values, result) + result = @builder.symbol_internal(val[0]) + + result +end + +# reduce 122 omitted + +# reduce 123 omitted + +# reduce 124 omitted + +def _reduce_125(val, _values, result) + result = [ val[0] ] + + result +end + +def _reduce_126(val, _values, result) + @lexer.state = :expr_fname + + result +end + +def _reduce_127(val, _values, result) + result = val[0] << val[3] + + result +end + +# reduce 128 omitted + +# reduce 129 omitted + +# reduce 130 omitted + +# reduce 131 omitted + +# reduce 132 omitted + +# reduce 133 omitted + +# reduce 134 omitted + +# reduce 135 omitted + +# reduce 136 omitted + +# reduce 137 omitted + +# reduce 138 omitted + +# reduce 139 omitted + +# reduce 140 omitted + +# reduce 141 omitted + +# reduce 142 omitted + +# reduce 143 omitted + +# reduce 144 omitted + +# reduce 145 omitted + +# reduce 146 omitted + +# reduce 147 omitted + +# reduce 148 omitted + +# reduce 149 omitted + +# reduce 150 omitted + +# reduce 151 omitted + +# reduce 152 omitted + +# reduce 153 omitted + +# reduce 154 omitted + +# reduce 155 omitted + +# reduce 156 omitted + +# reduce 157 omitted + +# reduce 158 omitted + +# reduce 159 omitted + +# reduce 160 omitted + +# reduce 161 omitted + +# reduce 162 omitted + +# reduce 163 omitted + +# reduce 164 omitted + +# reduce 165 omitted + +# reduce 166 omitted + +# reduce 167 omitted + +# reduce 168 omitted + +# reduce 169 omitted + +# reduce 170 omitted + +# reduce 171 omitted + +# reduce 172 omitted + +# reduce 173 omitted + +# reduce 174 omitted + +# reduce 175 omitted + +# reduce 176 omitted + +# reduce 177 omitted + +# reduce 178 omitted + +# reduce 179 omitted + +# reduce 180 omitted + +# reduce 181 omitted + +# reduce 182 omitted + +# reduce 183 omitted + +# reduce 184 omitted + +# reduce 185 omitted + +# reduce 186 omitted + +# reduce 187 omitted + +# reduce 188 omitted + +# reduce 189 omitted + +# reduce 190 omitted + +# reduce 191 omitted + +# reduce 192 omitted + +# reduce 193 omitted + +# reduce 194 omitted + +# reduce 195 omitted + +# reduce 196 omitted + +# reduce 197 omitted + +# reduce 198 omitted + +def _reduce_199(val, _values, result) + result = @builder.assign(val[0], val[1], val[2]) + + result +end + +def _reduce_200(val, _values, result) + result = @builder.op_assign(val[0], val[1], val[2]) + + result +end + +def _reduce_201(val, _values, result) + result = @builder.op_assign( + @builder.index( + val[0], val[1], val[2], val[3]), + val[4], val[5]) + + result +end + +def _reduce_202(val, _values, result) + result = @builder.op_assign( + @builder.call_method( + val[0], val[1], val[2]), + val[3], val[4]) + + result +end + +def _reduce_203(val, _values, result) + result = @builder.op_assign( + @builder.call_method( + val[0], val[1], val[2]), + val[3], val[4]) + + result +end + +def _reduce_204(val, _values, result) + result = @builder.op_assign( + @builder.call_method( + val[0], val[1], val[2]), + val[3], val[4]) + + result +end + +def _reduce_205(val, _values, result) + const = @builder.const_op_assignable( + @builder.const_fetch(val[0], val[1], val[2])) + result = @builder.op_assign(const, val[3], val[4]) + + result +end + +def _reduce_206(val, _values, result) + const = @builder.const_op_assignable( + @builder.const_global(val[0], val[1])) + result = @builder.op_assign(const, val[2], val[3]) + + result +end + +def _reduce_207(val, _values, result) + result = @builder.op_assign(val[0], val[1], val[2]) + + result +end + +def _reduce_208(val, _values, result) + result = @builder.range_inclusive(val[0], val[1], val[2]) + + result +end + +def _reduce_209(val, _values, result) + result = @builder.range_exclusive(val[0], val[1], val[2]) + + result +end + +def _reduce_210(val, _values, result) + result = @builder.range_inclusive(val[0], val[1], nil) + + result +end + +def _reduce_211(val, _values, result) + result = @builder.range_exclusive(val[0], val[1], nil) + + result +end + +def _reduce_212(val, _values, result) + result = @builder.binary_op(val[0], val[1], val[2]) + + result +end + +def _reduce_213(val, _values, result) + result = @builder.binary_op(val[0], val[1], val[2]) + + result +end + +def _reduce_214(val, _values, result) + result = @builder.binary_op(val[0], val[1], val[2]) + + result +end + +def _reduce_215(val, _values, result) + result = @builder.binary_op(val[0], val[1], val[2]) + + result +end + +def _reduce_216(val, _values, result) + result = @builder.binary_op(val[0], val[1], val[2]) + + result +end + +def _reduce_217(val, _values, result) + result = @builder.binary_op(val[0], val[1], val[2]) + + result +end + +def _reduce_218(val, _values, result) + result = @builder.unary_op(val[0], + @builder.binary_op( + val[1], val[2], val[3])) + + result +end + +def _reduce_219(val, _values, result) + result = @builder.unary_op(val[0], val[1]) + + result +end + +def _reduce_220(val, _values, result) + result = @builder.unary_op(val[0], val[1]) + + result +end + +def _reduce_221(val, _values, result) + result = @builder.binary_op(val[0], val[1], val[2]) + + result +end + +def _reduce_222(val, _values, result) + result = @builder.binary_op(val[0], val[1], val[2]) + + result +end + +def _reduce_223(val, _values, result) + result = @builder.binary_op(val[0], val[1], val[2]) + + result +end + +def _reduce_224(val, _values, result) + result = @builder.binary_op(val[0], val[1], val[2]) + + result +end + +# reduce 225 omitted + +def _reduce_226(val, _values, result) + result = @builder.binary_op(val[0], val[1], val[2]) + + result +end + +def _reduce_227(val, _values, result) + result = @builder.binary_op(val[0], val[1], val[2]) + + result +end + +def _reduce_228(val, _values, result) + result = @builder.binary_op(val[0], val[1], val[2]) + + result +end + +def _reduce_229(val, _values, result) + result = @builder.match_op(val[0], val[1], val[2]) + + result +end + +def _reduce_230(val, _values, result) + result = @builder.binary_op(val[0], val[1], val[2]) + + result +end + +def _reduce_231(val, _values, result) + result = @builder.not_op(val[0], nil, val[1], nil) + + result +end + +def _reduce_232(val, _values, result) + result = @builder.unary_op(val[0], val[1]) + + result +end + +def _reduce_233(val, _values, result) + result = @builder.binary_op(val[0], val[1], val[2]) + + result +end + +def _reduce_234(val, _values, result) + result = @builder.binary_op(val[0], val[1], val[2]) + + result +end + +def _reduce_235(val, _values, result) + result = @builder.logical_op(:and, val[0], val[1], val[2]) + + result +end + +def _reduce_236(val, _values, result) + result = @builder.logical_op(:or, val[0], val[1], val[2]) + + result +end + +def _reduce_237(val, _values, result) + result = @builder.keyword_cmd(:defined?, val[0], nil, [ val[2] ], nil) + + result +end + +def _reduce_238(val, _values, result) + result = @builder.ternary(val[0], val[1], + val[2], val[4], val[5]) + + result +end + +# reduce 239 omitted + +# reduce 240 omitted + +# reduce 241 omitted + +# reduce 242 omitted + +# reduce 243 omitted + +def _reduce_244(val, _values, result) + result = @builder.binary_op(val[0], val[1], val[2]) + + result +end + +def _reduce_245(val, _values, result) + result = @builder.binary_op(val[0], val[1], val[2]) + + result +end + +# reduce 246 omitted + +# reduce 247 omitted + +# reduce 248 omitted + +def _reduce_249(val, _values, result) + result = val[0] << @builder.associate(nil, val[2], nil) + + result +end + +def _reduce_250(val, _values, result) + result = [ @builder.associate(nil, val[0], nil) ] + + result +end + +# reduce 251 omitted + +def _reduce_252(val, _values, result) + rescue_body = @builder.rescue_body(val[1], + nil, nil, nil, + nil, val[2]) + + result = @builder.begin_body(val[0], [ rescue_body ]) + + result +end + +def _reduce_253(val, _values, result) + result = val + + result +end + +def _reduce_254(val, _values, result) + result = [ nil, [], nil ] + + result +end + +# reduce 255 omitted + +def _reduce_256(val, _values, result) + result = [] + + result +end + +# reduce 257 omitted + +# reduce 258 omitted + +def _reduce_259(val, _values, result) + result = val[0] << @builder.associate(nil, val[2], nil) + + result +end + +def _reduce_260(val, _values, result) + result = [ @builder.associate(nil, val[0], nil) ] + + result +end + +def _reduce_261(val, _values, result) + result = [ val[0] ] + + result +end + +def _reduce_262(val, _values, result) + result = val[0].concat(val[1]) + + result +end + +def _reduce_263(val, _values, result) + result = [ @builder.associate(nil, val[0], nil) ] + result.concat(val[1]) + + result +end + +def _reduce_264(val, _values, result) + assocs = @builder.associate(nil, val[2], nil) + result = val[0] << assocs + result.concat(val[3]) + + result +end + +def _reduce_265(val, _values, result) + result = [ val[0] ] + + result +end + +def _reduce_266(val, _values, result) + # When branch gets invoked by RACC's lookahead + # and command args start with '[' or '(' + # we need to put `true` to the cmdarg stack + # **before** `false` pushed by lexer + # m [], n + # ^ + # Right here we have cmdarg [...0] because + # lexer pushed it on '[' + # We need to modify cmdarg stack to [...10] + # + # For all other cases (like `m n` or `m n, []`) we simply put 1 to the stack + # and later lexer pushes corresponding bits on top of it. + last_token = @last_token[0] + lookahead = last_token == :tLBRACK || last_token == :tLPAREN_ARG + + if lookahead + top = @lexer.cmdarg.pop + @lexer.cmdarg.push(true) + @lexer.cmdarg.push(top) + else + @lexer.cmdarg.push(true) + end + + result +end + +def _reduce_267(val, _values, result) + # call_args can be followed by tLBRACE_ARG (that does cmdarg.push(0) in the lexer) + # but the push must be done after cmdarg.pop() in the parser. + # So this code does cmdarg.pop() to pop 0 pushed by tLBRACE_ARG, + # cmdarg.pop() to pop 1 pushed by command_args, + # and cmdarg.push(0) to restore back the flag set by tLBRACE_ARG. + last_token = @last_token[0] + lookahead = last_token == :tLBRACE_ARG + if lookahead + top = @lexer.cmdarg.pop + @lexer.cmdarg.pop + @lexer.cmdarg.push(top) + else + @lexer.cmdarg.pop + end + + result = val[1] + + result +end + +def _reduce_268(val, _values, result) + result = @builder.block_pass(val[0], val[1]) + + result +end + +def _reduce_269(val, _values, result) + result = [ val[1] ] + + result +end + +def _reduce_270(val, _values, result) + result = [] + + result +end + +def _reduce_271(val, _values, result) + result = [ val[0] ] + + result +end + +def _reduce_272(val, _values, result) + result = [ @builder.splat(val[0], val[1]) ] + + result +end + +def _reduce_273(val, _values, result) + result = val[0] << val[2] + + result +end + +def _reduce_274(val, _values, result) + result = val[0] << @builder.splat(val[2], val[3]) + + result +end + +def _reduce_275(val, _values, result) + result = @builder.array(nil, val[0], nil) + + result +end + +# reduce 276 omitted + +def _reduce_277(val, _values, result) + result = val[0] << val[2] + + result +end + +def _reduce_278(val, _values, result) + result = val[0] << @builder.splat(val[2], val[3]) + + result +end + +def _reduce_279(val, _values, result) + result = [ @builder.splat(val[0], val[1]) ] + + result +end + +# reduce 280 omitted + +# reduce 281 omitted + +# reduce 282 omitted + +# reduce 283 omitted + +# reduce 284 omitted + +# reduce 285 omitted + +# reduce 286 omitted + +# reduce 287 omitted + +# reduce 288 omitted + +# reduce 289 omitted + +def _reduce_290(val, _values, result) + result = @builder.call_method(nil, nil, val[0]) + + result +end + +def _reduce_291(val, _values, result) + @lexer.cmdarg.push(false) + + result +end + +def _reduce_292(val, _values, result) + @lexer.cmdarg.pop + + result = @builder.begin_keyword(val[0], val[2], val[3]) + + result +end + +def _reduce_293(val, _values, result) + @lexer.state = :expr_endarg + + result +end + +def _reduce_294(val, _values, result) + result = @builder.begin(val[0], val[1], val[3]) + + result +end + +def _reduce_295(val, _values, result) + @lexer.state = :expr_endarg + + result +end + +def _reduce_296(val, _values, result) + result = @builder.begin(val[0], nil, val[3]) + + result +end + +def _reduce_297(val, _values, result) + result = @builder.begin(val[0], val[1], val[2]) + + result +end + +def _reduce_298(val, _values, result) + result = @builder.const_fetch(val[0], val[1], val[2]) + + result +end + +def _reduce_299(val, _values, result) + result = @builder.const_global(val[0], val[1]) + + result +end + +def _reduce_300(val, _values, result) + result = @builder.array(val[0], val[1], val[2]) + + result +end + +def _reduce_301(val, _values, result) + result = @builder.associate(val[0], val[1], val[2]) + + result +end + +def _reduce_302(val, _values, result) + result = @builder.keyword_cmd(:return, val[0]) + + result +end + +def _reduce_303(val, _values, result) + result = @builder.keyword_cmd(:yield, val[0], val[1], val[2], val[3]) + + result +end + +def _reduce_304(val, _values, result) + result = @builder.keyword_cmd(:yield, val[0], val[1], [], val[2]) + + result +end + +def _reduce_305(val, _values, result) + result = @builder.keyword_cmd(:yield, val[0]) + + result +end + +def _reduce_306(val, _values, result) + result = @builder.keyword_cmd(:defined?, val[0], + val[2], [ val[3] ], val[4]) + + result +end + +def _reduce_307(val, _values, result) + result = @builder.not_op(val[0], val[1], val[2], val[3]) + + result +end + +def _reduce_308(val, _values, result) + result = @builder.not_op(val[0], val[1], nil, val[2]) + + result +end + +def _reduce_309(val, _values, result) + method_call = @builder.call_method(nil, nil, val[0]) + + begin_t, args, body, end_t = val[1] + result = @builder.block(method_call, + begin_t, args, body, end_t) + + result +end + +# reduce 310 omitted + +def _reduce_311(val, _values, result) + begin_t, args, body, end_t = val[1] + result = @builder.block(val[0], + begin_t, args, body, end_t) + + result +end + +def _reduce_312(val, _values, result) + result = @context.dup + @context.in_lambda = true + + result +end + +def _reduce_313(val, _values, result) + lambda_call = @builder.call_lambda(val[0]) + + args, (begin_t, body, end_t) = val[2] + result = @builder.block(lambda_call, + begin_t, args, body, end_t) + + @context.in_lambda = val[1].in_lambda + + result +end + +def _reduce_314(val, _values, result) + else_t, else_ = val[4] + result = @builder.condition(val[0], val[1], val[2], + val[3], else_t, + else_, val[5]) + + result +end + +def _reduce_315(val, _values, result) + else_t, else_ = val[4] + result = @builder.condition(val[0], val[1], val[2], + else_, else_t, + val[3], val[5]) + + result +end + +def _reduce_316(val, _values, result) + result = @builder.loop(:while, val[0], *val[1], val[2], val[3]) + + result +end + +def _reduce_317(val, _values, result) + result = @builder.loop(:until, val[0], *val[1], val[2], val[3]) + + result +end + +def _reduce_318(val, _values, result) + *when_bodies, (else_t, else_body) = *val[3] + + result = @builder.case(val[0], val[1], + when_bodies, else_t, else_body, + val[4]) + + result +end + +def _reduce_319(val, _values, result) + *when_bodies, (else_t, else_body) = *val[2] + + result = @builder.case(val[0], nil, + when_bodies, else_t, else_body, + val[3]) + + result +end + +def _reduce_320(val, _values, result) + result = @builder.for(val[0], val[1], val[2], *val[3], val[4], val[5]) + + result +end + +def _reduce_321(val, _values, result) + local_push + @context.in_class = true + + result +end + +def _reduce_322(val, _values, result) + k_class, ctx = val[0] + if @context.in_def + diagnostic :error, :class_in_def, nil, k_class + end + + lt_t, superclass = val[2] + result = @builder.def_class(k_class, val[1], + lt_t, superclass, + val[4], val[5]) + + local_pop + @context.in_class = ctx.in_class + + result +end + +def _reduce_323(val, _values, result) + @context.in_def = false + @context.in_class = false + local_push + + result +end + +def _reduce_324(val, _values, result) + k_class, ctx = val[0] + result = @builder.def_sclass(k_class, val[1], val[2], + val[5], val[6]) + + local_pop + @context.in_def = ctx.in_def + @context.in_class = ctx.in_class + + result +end + +def _reduce_325(val, _values, result) + @context.in_class = true + local_push + + result +end + +def _reduce_326(val, _values, result) + k_mod, ctx = val[0] + if @context.in_def + diagnostic :error, :module_in_def, nil, k_mod + end + + result = @builder.def_module(k_mod, val[1], + val[3], val[4]) + + local_pop + @context.in_class = ctx.in_class + + result +end + +def _reduce_327(val, _values, result) + local_push + result = context.dup + @context.in_def = true + + result +end + +def _reduce_328(val, _values, result) + result = @builder.def_method(val[0], val[1], + val[3], val[4], val[5]) + + local_pop + @context.in_def = val[2].in_def + + result +end + +def _reduce_329(val, _values, result) + @lexer.state = :expr_fname + + result +end + +def _reduce_330(val, _values, result) + local_push + result = context.dup + @context.in_def = true + + result +end + +def _reduce_331(val, _values, result) + result = @builder.def_singleton(val[0], val[1], val[2], + val[4], val[6], val[7], val[8]) + + local_pop + @context.in_def = val[5].in_def + + result +end + +def _reduce_332(val, _values, result) + result = @builder.keyword_cmd(:break, val[0]) + + result +end + +def _reduce_333(val, _values, result) + result = @builder.keyword_cmd(:next, val[0]) + + result +end + +def _reduce_334(val, _values, result) + result = @builder.keyword_cmd(:redo, val[0]) + + result +end + +def _reduce_335(val, _values, result) + result = @builder.keyword_cmd(:retry, val[0]) + + result +end + +# reduce 336 omitted + +def _reduce_337(val, _values, result) + result = [ val[0], @context.dup ] + + result +end + +def _reduce_338(val, _values, result) + result = [ val[0], @context.dup ] + + result +end + +def _reduce_339(val, _values, result) + result = val[0] + + result +end + +def _reduce_340(val, _values, result) + if @context.in_class && !@context.in_def && !(context.in_block || context.in_lambda) + diagnostic :error, :invalid_return, nil, val[0] + end + + result +end + +# reduce 341 omitted + +# reduce 342 omitted + +def _reduce_343(val, _values, result) + result = val[1] + + result +end + +# reduce 344 omitted + +# reduce 345 omitted + +# reduce 346 omitted + +def _reduce_347(val, _values, result) + else_t, else_ = val[4] + result = [ val[0], + @builder.condition(val[0], val[1], val[2], + val[3], else_t, + else_, nil), + ] + + result +end + +# reduce 348 omitted + +def _reduce_349(val, _values, result) + result = val + + result +end + +# reduce 350 omitted + +# reduce 351 omitted + +def _reduce_352(val, _values, result) + result = @builder.arg(val[0]) + + result +end + +def _reduce_353(val, _values, result) + result = @builder.multi_lhs(val[0], val[1], val[2]) + + result +end + +def _reduce_354(val, _values, result) + result = [ val[0] ] + + result +end + +def _reduce_355(val, _values, result) + result = val[0] << val[2] + + result +end + +# reduce 356 omitted + +def _reduce_357(val, _values, result) + result = val[0]. + push(@builder.restarg(val[2], val[3])) + + result +end + +def _reduce_358(val, _values, result) + result = val[0]. + push(@builder.restarg(val[2], val[3])). + concat(val[5]) + + result +end + +def _reduce_359(val, _values, result) + result = val[0]. + push(@builder.restarg(val[2])) + + result +end + +def _reduce_360(val, _values, result) + result = val[0]. + push(@builder.restarg(val[2])). + concat(val[4]) + + result +end + +def _reduce_361(val, _values, result) + result = [ @builder.restarg(val[0], val[1]) ] + + result +end + +def _reduce_362(val, _values, result) + result = [ @builder.restarg(val[0], val[1]), + *val[3] ] + + result +end + +def _reduce_363(val, _values, result) + result = [ @builder.restarg(val[0]) ] + + result +end + +def _reduce_364(val, _values, result) + result = [ @builder.restarg(val[0]), + *val[2] ] + + result +end + +def _reduce_365(val, _values, result) + result = val[0].concat(val[2]).concat(val[3]) + + result +end + +def _reduce_366(val, _values, result) + result = val[0].concat(val[1]) + + result +end + +def _reduce_367(val, _values, result) + result = val[0].concat(val[1]) + + result +end + +def _reduce_368(val, _values, result) + result = [ val[0] ] + + result +end + +def _reduce_369(val, _values, result) + result = val[1] + + result +end + +def _reduce_370(val, _values, result) + result = [] + + result +end + +def _reduce_371(val, _values, result) + result = val[0]. + concat(val[2]). + concat(val[4]). + concat(val[5]) + + result +end + +def _reduce_372(val, _values, result) + result = val[0]. + concat(val[2]). + concat(val[4]). + concat(val[6]). + concat(val[7]) + + result +end + +def _reduce_373(val, _values, result) + result = val[0]. + concat(val[2]). + concat(val[3]) + + result +end + +def _reduce_374(val, _values, result) + result = val[0]. + concat(val[2]). + concat(val[4]). + concat(val[5]) + + result +end + +def _reduce_375(val, _values, result) + result = val[0]. + concat(val[2]). + concat(val[3]) + + result +end + +# reduce 376 omitted + +def _reduce_377(val, _values, result) + result = val[0]. + concat(val[2]). + concat(val[4]). + concat(val[5]) + + result +end + +def _reduce_378(val, _values, result) + if val[1].empty? && val[0].size == 1 + result = [@builder.procarg0(val[0][0])] + else + result = val[0].concat(val[1]) + end + + result +end + +def _reduce_379(val, _values, result) + result = val[0]. + concat(val[2]). + concat(val[3]) + + result +end + +def _reduce_380(val, _values, result) + result = val[0]. + concat(val[2]). + concat(val[4]). + concat(val[5]) + + result +end + +def _reduce_381(val, _values, result) + result = val[0]. + concat(val[1]) + + result +end + +def _reduce_382(val, _values, result) + result = val[0]. + concat(val[2]). + concat(val[3]) + + result +end + +def _reduce_383(val, _values, result) + result = val[0]. + concat(val[1]) + + result +end + +def _reduce_384(val, _values, result) + result = val[0]. + concat(val[2]). + concat(val[3]) + + result +end + +# reduce 385 omitted + +def _reduce_386(val, _values, result) + result = @builder.args(nil, [], nil) + + result +end + +def _reduce_387(val, _values, result) + @lexer.state = :expr_value + + result +end + +def _reduce_388(val, _values, result) + result = @builder.args(val[0], val[1], val[2]) + + result +end + +def _reduce_389(val, _values, result) + result = @builder.args(val[0], [], val[0]) + + result +end + +def _reduce_390(val, _values, result) + result = @builder.args(val[0], val[1].concat(val[2]), val[3]) + + result +end + +def _reduce_391(val, _values, result) + result = [] + + result +end + +def _reduce_392(val, _values, result) + result = val[2] + + result +end + +def _reduce_393(val, _values, result) + result = [ val[0] ] + + result +end + +def _reduce_394(val, _values, result) + result = val[0] << val[2] + + result +end + +def _reduce_395(val, _values, result) + @static_env.declare val[0][0] + result = @builder.shadowarg(val[0]) + + result +end + +# reduce 396 omitted + +def _reduce_397(val, _values, result) + @static_env.extend_dynamic + + result +end + +def _reduce_398(val, _values, result) + @lexer.cmdarg.push(false) + + result +end + +def _reduce_399(val, _values, result) + @lexer.cmdarg.pop + + result = [ val[1], val[3] ] + + @static_env.unextend + + result +end + +def _reduce_400(val, _values, result) + result = @builder.args(val[0], val[1].concat(val[2]), val[3]) + + result +end + +def _reduce_401(val, _values, result) + result = @builder.args(nil, val[0], nil) + + result +end + +def _reduce_402(val, _values, result) + result = @context.dup + @context.in_lambda = true + + result +end + +def _reduce_403(val, _values, result) + result = [ val[0], val[2], val[3] ] + @context.in_lambda = val[1].in_lambda + + result +end + +def _reduce_404(val, _values, result) + result = @context.dup + @context.in_lambda = true + + result +end + +def _reduce_405(val, _values, result) + result = [ val[0], val[2], val[3] ] + @context.in_lambda = val[1].in_lambda + + result +end + +def _reduce_406(val, _values, result) + result = @context.dup + @context.in_block = true + + result +end + +def _reduce_407(val, _values, result) + result = [ val[0], *val[2], val[3] ] + @context.in_block = val[1].in_block + + result +end + +def _reduce_408(val, _values, result) + begin_t, block_args, body, end_t = val[1] + result = @builder.block(val[0], + begin_t, block_args, body, end_t) + + result +end + +def _reduce_409(val, _values, result) + lparen_t, args, rparen_t = val[3] + result = @builder.call_method(val[0], val[1], val[2], + lparen_t, args, rparen_t) + + result +end + +def _reduce_410(val, _values, result) + lparen_t, args, rparen_t = val[3] + method_call = @builder.call_method(val[0], val[1], val[2], + lparen_t, args, rparen_t) + + begin_t, args, body, end_t = val[4] + result = @builder.block(method_call, + begin_t, args, body, end_t) + + result +end + +def _reduce_411(val, _values, result) + method_call = @builder.call_method(val[0], val[1], val[2], + nil, val[3], nil) + + begin_t, args, body, end_t = val[4] + result = @builder.block(method_call, + begin_t, args, body, end_t) + + result +end + +def _reduce_412(val, _values, result) + lparen_t, args, rparen_t = val[1] + result = @builder.call_method(nil, nil, val[0], + lparen_t, args, rparen_t) + + result +end + +def _reduce_413(val, _values, result) + lparen_t, args, rparen_t = val[3] + result = @builder.call_method(val[0], val[1], val[2], + lparen_t, args, rparen_t) + + result +end + +def _reduce_414(val, _values, result) + lparen_t, args, rparen_t = val[3] + result = @builder.call_method(val[0], val[1], val[2], + lparen_t, args, rparen_t) + + result +end + +def _reduce_415(val, _values, result) + result = @builder.call_method(val[0], val[1], val[2]) + + result +end + +def _reduce_416(val, _values, result) + lparen_t, args, rparen_t = val[2] + result = @builder.call_method(val[0], val[1], nil, + lparen_t, args, rparen_t) + + result +end + +def _reduce_417(val, _values, result) + lparen_t, args, rparen_t = val[2] + result = @builder.call_method(val[0], val[1], nil, + lparen_t, args, rparen_t) + + result +end + +def _reduce_418(val, _values, result) + lparen_t, args, rparen_t = val[1] + result = @builder.keyword_cmd(:super, val[0], + lparen_t, args, rparen_t) + + result +end + +def _reduce_419(val, _values, result) + result = @builder.keyword_cmd(:zsuper, val[0]) + + result +end + +def _reduce_420(val, _values, result) + result = @builder.index(val[0], val[1], val[2], val[3]) + + result +end + +def _reduce_421(val, _values, result) + result = @context.dup + @context.in_block = true + + result +end + +def _reduce_422(val, _values, result) + result = [ val[0], *val[2], val[3] ] + @context.in_block = val[1].in_block + + result +end + +def _reduce_423(val, _values, result) + result = @context.dup + @context.in_block = true + + result +end + +def _reduce_424(val, _values, result) + result = [ val[0], *val[2], val[3] ] + @context.in_block = val[1].in_block + + result +end + +def _reduce_425(val, _values, result) + @static_env.extend_dynamic + + result +end + +def _reduce_426(val, _values, result) + result = [ val[1], val[2] ] + + @static_env.unextend + + result +end + +def _reduce_427(val, _values, result) + @static_env.extend_dynamic + + result +end + +def _reduce_428(val, _values, result) + @lexer.cmdarg.push(false) + + result +end + +def _reduce_429(val, _values, result) + result = [ val[2], val[3] ] + + @static_env.unextend + @lexer.cmdarg.pop + + result +end + +def _reduce_430(val, _values, result) + result = [ @builder.when(val[0], val[1], val[2], val[3]), + *val[4] ] + + result +end + +def _reduce_431(val, _values, result) + result = [ val[0] ] + + result +end + +# reduce 432 omitted + +def _reduce_433(val, _values, result) + assoc_t, exc_var = val[2] + + if val[1] + exc_list = @builder.array(nil, val[1], nil) + end + + result = [ @builder.rescue_body(val[0], + exc_list, assoc_t, exc_var, + val[3], val[4]), + *val[5] ] + + result +end + +def _reduce_434(val, _values, result) + result = [] + + result +end + +def _reduce_435(val, _values, result) + result = [ val[0] ] + + result +end + +# reduce 436 omitted + +# reduce 437 omitted + +def _reduce_438(val, _values, result) + result = [ val[0], val[1] ] + + result +end + +# reduce 439 omitted + +def _reduce_440(val, _values, result) + result = [ val[0], val[1] ] + + result +end + +# reduce 441 omitted + +# reduce 442 omitted + +# reduce 443 omitted + +# reduce 444 omitted + +def _reduce_445(val, _values, result) + result = @builder.string_compose(nil, val[0], nil) + + result +end + +def _reduce_446(val, _values, result) + result = [ val[0] ] + + result +end + +def _reduce_447(val, _values, result) + result = val[0] << val[1] + + result +end + +def _reduce_448(val, _values, result) + string = @builder.string_compose(val[0], val[1], val[2]) + result = @builder.dedent_string(string, @lexer.dedent_level) + + result +end + +def _reduce_449(val, _values, result) + string = @builder.string(val[0]) + result = @builder.dedent_string(string, @lexer.dedent_level) + + result +end + +def _reduce_450(val, _values, result) + result = @builder.character(val[0]) + + result +end + +def _reduce_451(val, _values, result) + string = @builder.xstring_compose(val[0], val[1], val[2]) + result = @builder.dedent_string(string, @lexer.dedent_level) + + result +end + +def _reduce_452(val, _values, result) + opts = @builder.regexp_options(val[3]) + result = @builder.regexp_compose(val[0], val[1], val[2], opts) + + result +end + +def _reduce_453(val, _values, result) + result = @builder.words_compose(val[0], val[1], val[2]) + + result +end + +def _reduce_454(val, _values, result) + result = [] + + result +end + +def _reduce_455(val, _values, result) + result = val[0] << @builder.word(val[1]) + + result +end + +def _reduce_456(val, _values, result) + result = [ val[0] ] + + result +end + +def _reduce_457(val, _values, result) + result = val[0] << val[1] + + result +end + +def _reduce_458(val, _values, result) + result = @builder.symbols_compose(val[0], val[1], val[2]) + + result +end + +def _reduce_459(val, _values, result) + result = [] + + result +end + +def _reduce_460(val, _values, result) + result = val[0] << @builder.word(val[1]) + + result +end + +def _reduce_461(val, _values, result) + result = @builder.words_compose(val[0], val[1], val[2]) + + result +end + +def _reduce_462(val, _values, result) + result = @builder.symbols_compose(val[0], val[1], val[2]) + + result +end + +def _reduce_463(val, _values, result) + result = [] + + result +end + +def _reduce_464(val, _values, result) + result = val[0] << @builder.string_internal(val[1]) + + result +end + +def _reduce_465(val, _values, result) + result = [] + + result +end + +def _reduce_466(val, _values, result) + result = val[0] << @builder.symbol_internal(val[1]) + + result +end + +def _reduce_467(val, _values, result) + result = [] + + result +end + +def _reduce_468(val, _values, result) + result = val[0] << val[1] + + result +end + +def _reduce_469(val, _values, result) + result = [] + + result +end + +def _reduce_470(val, _values, result) + result = val[0] << val[1] + + result +end + +def _reduce_471(val, _values, result) + result = [] + + result +end + +def _reduce_472(val, _values, result) + result = val[0] << val[1] + + result +end + +def _reduce_473(val, _values, result) + result = @builder.string_internal(val[0]) + + result +end + +def _reduce_474(val, _values, result) + result = val[1] + + result +end + +def _reduce_475(val, _values, result) + @lexer.cmdarg.push(false) + @lexer.cond.push(false) + + result +end + +def _reduce_476(val, _values, result) + @lexer.cmdarg.pop + @lexer.cond.pop + + result = @builder.begin(val[0], val[2], val[3]) + + result +end + +def _reduce_477(val, _values, result) + result = @builder.gvar(val[0]) + + result +end + +def _reduce_478(val, _values, result) + result = @builder.ivar(val[0]) + + result +end + +def _reduce_479(val, _values, result) + result = @builder.cvar(val[0]) + + result +end + +# reduce 480 omitted + +def _reduce_481(val, _values, result) + @lexer.state = :expr_end + result = @builder.symbol(val[0]) + + result +end + +def _reduce_482(val, _values, result) + @lexer.state = :expr_end + result = @builder.symbol_compose(val[0], val[1], val[2]) + + result +end + +def _reduce_483(val, _values, result) + result = val[0] + + result +end + +def _reduce_484(val, _values, result) + if @builder.respond_to? :negate + # AST builder interface compatibility + result = @builder.negate(val[0], val[1]) + else + result = @builder.unary_num(val[0], val[1]) + end + + result +end + +def _reduce_485(val, _values, result) + @lexer.state = :expr_end + result = @builder.integer(val[0]) + + result +end + +def _reduce_486(val, _values, result) + @lexer.state = :expr_end + result = @builder.float(val[0]) + + result +end + +def _reduce_487(val, _values, result) + @lexer.state = :expr_end + result = @builder.rational(val[0]) + + result +end + +def _reduce_488(val, _values, result) + @lexer.state = :expr_end + result = @builder.complex(val[0]) + + result +end + +def _reduce_489(val, _values, result) + result = @builder.ident(val[0]) + + result +end + +def _reduce_490(val, _values, result) + result = @builder.ivar(val[0]) + + result +end + +def _reduce_491(val, _values, result) + result = @builder.gvar(val[0]) + + result +end + +def _reduce_492(val, _values, result) + result = @builder.const(val[0]) + + result +end + +def _reduce_493(val, _values, result) + result = @builder.cvar(val[0]) + + result +end + +def _reduce_494(val, _values, result) + result = @builder.nil(val[0]) + + result +end + +def _reduce_495(val, _values, result) + result = @builder.self(val[0]) + + result +end + +def _reduce_496(val, _values, result) + result = @builder.true(val[0]) + + result +end + +def _reduce_497(val, _values, result) + result = @builder.false(val[0]) + + result +end + +def _reduce_498(val, _values, result) + result = @builder.__FILE__(val[0]) + + result +end + +def _reduce_499(val, _values, result) + result = @builder.__LINE__(val[0]) + + result +end + +def _reduce_500(val, _values, result) + result = @builder.__ENCODING__(val[0]) + + result +end + +def _reduce_501(val, _values, result) + result = @builder.accessible(val[0]) + + result +end + +def _reduce_502(val, _values, result) + result = @builder.accessible(val[0]) + + result +end + +def _reduce_503(val, _values, result) + result = @builder.assignable(val[0]) + + result +end + +def _reduce_504(val, _values, result) + result = @builder.assignable(val[0]) + + result +end + +def _reduce_505(val, _values, result) + result = @builder.nth_ref(val[0]) + + result +end + +def _reduce_506(val, _values, result) + result = @builder.back_ref(val[0]) + + result +end + +def _reduce_507(val, _values, result) + @lexer.state = :expr_value + + result +end + +def _reduce_508(val, _values, result) + result = [ val[0], val[2] ] + + result +end + +def _reduce_509(val, _values, result) + result = nil + + result +end + +def _reduce_510(val, _values, result) + result = @builder.args(val[0], val[1], val[2]) + + @lexer.state = :expr_value + + result +end + +def _reduce_511(val, _values, result) + result = @context.in_kwarg + @context.in_kwarg = true + + result +end + +def _reduce_512(val, _values, result) + @context.in_kwarg = val[0] + result = @builder.args(nil, val[1], nil) + + result +end + +def _reduce_513(val, _values, result) + result = val[0].concat(val[2]).concat(val[3]) + + result +end + +def _reduce_514(val, _values, result) + result = val[0].concat(val[1]) + + result +end + +def _reduce_515(val, _values, result) + result = val[0].concat(val[1]) + + result +end + +def _reduce_516(val, _values, result) + result = [ val[0] ] + + result +end + +def _reduce_517(val, _values, result) + result = val[1] + + result +end + +def _reduce_518(val, _values, result) + result = [] + + result +end + +def _reduce_519(val, _values, result) + result = val[0]. + concat(val[2]). + concat(val[4]). + concat(val[5]) + + result +end + +def _reduce_520(val, _values, result) + result = val[0]. + concat(val[2]). + concat(val[4]). + concat(val[6]). + concat(val[7]) + + result +end + +def _reduce_521(val, _values, result) + result = val[0]. + concat(val[2]). + concat(val[3]) + + result +end + +def _reduce_522(val, _values, result) + result = val[0]. + concat(val[2]). + concat(val[4]). + concat(val[5]) + + result +end + +def _reduce_523(val, _values, result) + result = val[0]. + concat(val[2]). + concat(val[3]) + + result +end + +def _reduce_524(val, _values, result) + result = val[0]. + concat(val[2]). + concat(val[4]). + concat(val[5]) + + result +end + +def _reduce_525(val, _values, result) + result = val[0]. + concat(val[1]) + + result +end + +def _reduce_526(val, _values, result) + result = val[0]. + concat(val[2]). + concat(val[3]) + + result +end + +def _reduce_527(val, _values, result) + result = val[0]. + concat(val[2]). + concat(val[4]). + concat(val[5]) + + result +end + +def _reduce_528(val, _values, result) + result = val[0]. + concat(val[1]) + + result +end + +def _reduce_529(val, _values, result) + result = val[0]. + concat(val[2]). + concat(val[3]) + + result +end + +def _reduce_530(val, _values, result) + result = val[0]. + concat(val[1]) + + result +end + +def _reduce_531(val, _values, result) + result = val[0]. + concat(val[2]). + concat(val[3]) + + result +end + +def _reduce_532(val, _values, result) + result = val[0] + + result +end + +def _reduce_533(val, _values, result) + result = [] + + result +end + +def _reduce_534(val, _values, result) + diagnostic :error, :argument_const, nil, val[0] + + result +end + +def _reduce_535(val, _values, result) + diagnostic :error, :argument_ivar, nil, val[0] + + result +end + +def _reduce_536(val, _values, result) + diagnostic :error, :argument_gvar, nil, val[0] + + result +end + +def _reduce_537(val, _values, result) + diagnostic :error, :argument_cvar, nil, val[0] + + result +end + +# reduce 538 omitted + +def _reduce_539(val, _values, result) + @static_env.declare val[0][0] + + result = val[0] + + result +end + +def _reduce_540(val, _values, result) + result = val[0] + + result +end + +def _reduce_541(val, _values, result) + result = @builder.arg(val[0]) + + result +end + +def _reduce_542(val, _values, result) + result = @builder.multi_lhs(val[0], val[1], val[2]) + + result +end + +def _reduce_543(val, _values, result) + result = [ val[0] ] + + result +end + +def _reduce_544(val, _values, result) + result = val[0] << val[2] + + result +end + +def _reduce_545(val, _values, result) + check_kwarg_name(val[0]) + + @static_env.declare val[0][0] + + result = val[0] + + result +end + +def _reduce_546(val, _values, result) + result = @builder.kwoptarg(val[0], val[1]) + + result +end + +def _reduce_547(val, _values, result) + result = @builder.kwarg(val[0]) + + result +end + +def _reduce_548(val, _values, result) + result = @builder.kwoptarg(val[0], val[1]) + + result +end + +def _reduce_549(val, _values, result) + result = @builder.kwarg(val[0]) + + result +end + +def _reduce_550(val, _values, result) + result = [ val[0] ] + + result +end + +def _reduce_551(val, _values, result) + result = val[0] << val[2] + + result +end + +def _reduce_552(val, _values, result) + result = [ val[0] ] + + result +end + +def _reduce_553(val, _values, result) + result = val[0] << val[2] + + result +end + +# reduce 554 omitted + +# reduce 555 omitted + +def _reduce_556(val, _values, result) + @static_env.declare val[1][0] + + result = [ @builder.kwrestarg(val[0], val[1]) ] + + result +end + +def _reduce_557(val, _values, result) + result = [ @builder.kwrestarg(val[0]) ] + + result +end + +def _reduce_558(val, _values, result) + result = @builder.optarg(val[0], val[1], val[2]) + + result +end + +def _reduce_559(val, _values, result) + result = @builder.optarg(val[0], val[1], val[2]) + + result +end + +def _reduce_560(val, _values, result) + result = [ val[0] ] + + result +end + +def _reduce_561(val, _values, result) + result = val[0] << val[2] + + result +end + +def _reduce_562(val, _values, result) + result = [ val[0] ] + + result +end + +def _reduce_563(val, _values, result) + result = val[0] << val[2] + + result +end + +# reduce 564 omitted + +# reduce 565 omitted + +def _reduce_566(val, _values, result) + @static_env.declare val[1][0] + + result = [ @builder.restarg(val[0], val[1]) ] + + result +end + +def _reduce_567(val, _values, result) + result = [ @builder.restarg(val[0]) ] + + result +end + +# reduce 568 omitted + +# reduce 569 omitted + +def _reduce_570(val, _values, result) + @static_env.declare val[1][0] + + result = @builder.blockarg(val[0], val[1]) + + result +end + +def _reduce_571(val, _values, result) + result = [ val[1] ] + + result +end + +def _reduce_572(val, _values, result) + result = [] + + result +end + +# reduce 573 omitted + +def _reduce_574(val, _values, result) + result = val[1] + + result +end + +def _reduce_575(val, _values, result) + result = [] + + result +end + +# reduce 576 omitted + +def _reduce_577(val, _values, result) + result = [ val[0] ] + + result +end + +def _reduce_578(val, _values, result) + result = val[0] << val[2] + + result +end + +def _reduce_579(val, _values, result) + result = @builder.pair(val[0], val[1], val[2]) + + result +end + +def _reduce_580(val, _values, result) + result = @builder.pair_keyword(val[0], val[1]) + + result +end + +def _reduce_581(val, _values, result) + result = @builder.pair_quoted(val[0], val[1], val[2], val[3]) + + result +end + +def _reduce_582(val, _values, result) + result = @builder.kwsplat(val[0], val[1]) + + result +end + +# reduce 583 omitted + +# reduce 584 omitted + +# reduce 585 omitted + +# reduce 586 omitted + +# reduce 587 omitted + +# reduce 588 omitted + +# reduce 589 omitted + +# reduce 590 omitted + +# reduce 591 omitted + +# reduce 592 omitted + +# reduce 593 omitted + +# reduce 594 omitted + +def _reduce_595(val, _values, result) + result = [:dot, val[0][1]] + + result +end + +def _reduce_596(val, _values, result) + result = [:anddot, val[0][1]] + + result +end + +# reduce 597 omitted + +# reduce 598 omitted + +# reduce 599 omitted + +# reduce 600 omitted + +def _reduce_601(val, _values, result) + result = val[1] + + result +end + +def _reduce_602(val, _values, result) + result = val[1] + + result +end + +# reduce 603 omitted + +# reduce 604 omitted + +# reduce 605 omitted + +def _reduce_606(val, _values, result) + yyerrok + + result +end + +# reduce 607 omitted + +# reduce 608 omitted + +# reduce 609 omitted + +def _reduce_610(val, _values, result) + result = nil + + result +end + +def _reduce_none(val, _values, result) + val[0] +end + + end # class Ruby26 + end # module Parser diff --git a/vendor/bundle/ruby/3.1.0/gems/parser-3.1.2.0/lib/parser/ruby27.rb b/vendor/bundle/ruby/3.1.0/gems/parser-3.1.2.0/lib/parser/ruby27.rb new file mode 100644 index 000000000..7177c184e --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/parser-3.1.2.0/lib/parser/ruby27.rb @@ -0,0 +1,7914 @@ +# -*- encoding:utf-8; warn-indent:false; frozen_string_literal: true -*- +# +# DO NOT MODIFY!!!! +# This file is automatically generated by Racc 1.4.15 +# from Racc grammer file "". +# + +require 'racc/parser.rb' + + +require 'parser' + +module Parser + class Ruby27 < Parser::Base + + + def version + 27 + end + + def default_encoding + Encoding::UTF_8 + end + + def local_push + @static_env.extend_static + @lexer.cmdarg.push(false) + @lexer.cond.push(false) + @max_numparam_stack.push(static: true) + end + + def local_pop + @static_env.unextend + @lexer.cmdarg.pop + @lexer.cond.pop + @max_numparam_stack.pop + end + + def try_declare_numparam(node) + name = node.children[0] + + if name =~ /\A_[1-9]\z/ && !static_env.declared?(name) && context.in_dynamic_block? + # definitely an implicit param + location = node.loc.expression + + if max_numparam_stack.has_ordinary_params? + diagnostic :error, :ordinary_param_defined, nil, [nil, location] + end + + raw_max_numparam_stack = max_numparam_stack.stack.dup + + # ignore current block scope + raw_max_numparam_stack.pop + + raw_max_numparam_stack.reverse_each do |outer_scope| + if outer_scope[:static] + # found an outer scope that can't have numparams + # like def/class/etc + break + else + outer_scope_has_numparams = outer_scope[:value] > 0 + + if outer_scope_has_numparams + diagnostic :error, :numparam_used_in_outer_scope, nil, [nil, location] + else + # for now it's ok, but an outer scope can also be a block + # with numparams, so we need to continue + end + end + end + + static_env.declare(name) + max_numparam_stack.register(name[1].to_i) + + true + else + false + end + end +##### State transition tables begin ### + +clist = [ +'-304,559,-113,-112,536,-111,-106,-304,-304,-304,281,559,-304,-304,-304', +'-703,-304,281,-108,228,-114,815,218,219,-304,887,-304,-304,-304,600', +'1093,-107,1026,602,857,-107,-304,-304,559,-304,-304,-304,-304,-304,752', +'-588,218,219,-114,917,-106,559,-588,-112,559,229,218,219,622,876,229', +'978,-109,-113,229,559,-304,-304,-304,-304,-304,-304,-304,-304,-304,-304', +'-304,-304,-304,-304,-691,-110,-304,-304,-304,-111,813,-304,-108,-113', +'-304,747,874,-304,-304,599,-304,280,-304,601,-304,-109,-304,-304,280', +'-304,-304,-304,-304,-304,-588,-304,1094,-304,1027,-97,229,-111,-691', +'123,-113,-112,896,-111,122,-113,-112,-304,-111,123,-304,-304,-304,-304', +'122,-304,-108,-304,-114,-694,229,-108,-304,-114,-98,-112,-694,-694,-694', +'-107,229,-694,-694,-694,-107,-694,123,-105,-690,872,-703,122,-103,-694', +'-694,-694,-694,-694,-106,123,977,-100,123,-106,122,-694,-694,122,-694', +'-694,-694,-694,-694,123,101,102,870,-99,122,-100,281,-102,281,566,-102', +'123,229,-99,-104,-110,122,752,-110,815,-110,-694,-694,-694,-694,-694', +'-694,-694,-694,-694,-694,-694,-694,-694,-694,-109,885,-694,-694,-694', +'-109,812,-694,815,-703,-694,218,219,-694,-694,868,-694,-591,-694,886', +'-694,797,-694,-694,-591,-694,-694,-694,-694,-694,1085,-694,-694,-694', +'-99,276,-100,276,-102,587,101,102,-101,103,104,229,1032,-694,-690,587', +'-694,-694,-694,-694,-489,-694,-598,-694,280,-591,280,661,-694,-598,1031', +'-110,-591,-591,-591,218,219,-591,-591,-591,-99,-591,-100,-99,-102,-100', +'-108,-102,-591,-591,572,-591,-591,-591,834,-99,868,-100,-101,-102,87', +'-591,-591,865,-591,-591,-591,-591,-591,589,588,123,88,-690,-101,587', +'122,572,857,589,588,834,89,-597,103,104,1101,-598,810,783,-597,-591', +'-591,-591,-591,-591,-591,-591,-591,-591,-591,-591,-591,-591,-591,250', +'224,-591,-591,-591,226,-591,-591,1122,-101,-591,-602,-101,-591,-591', +'587,-591,1120,-591,587,-591,698,-591,-591,-101,-591,-591,-591,-591,-591', +'-599,-591,-588,-591,589,588,598,-599,-603,-588,-588,-588,-109,-597,-588', +'-588,-588,-591,-588,123,-591,-591,-591,-591,122,-591,-588,-591,-588', +'-588,-588,464,-591,572,-114,-591,225,573,-588,-588,-106,-588,-588,-588', +'-588,-588,276,-703,-92,589,588,585,587,589,588,587,549,123,587,551,-78', +'587,122,781,229,-599,684,-107,-588,-588,-588,-588,-588,-588,-588,-588', +'-588,-588,-588,-588,-588,-588,276,536,-588,-588,-588,587,-588,-588,-114', +'857,-588,566,587,-588,-588,918,-588,-596,-588,229,-588,621,-588,-588', +'-596,-588,-588,-588,-588,-588,811,-588,-602,-588,589,588,592,589,588', +'585,589,588,590,589,588,585,944,-588,-104,-593,-588,-588,-588,-588,1101', +'-588,-593,-588,-603,-694,-113,549,-588,698,548,-588,-694,-694,-694,589', +'588,603,-694,-694,-108,-694,589,588,594,-97,-109,224,-596,-694,-694', +'-594,-595,549,569,-111,551,-106,-594,-595,511,-694,-694,567,-694,-694', +'-694,-694,-694,549,509,-98,551,724,224,721,720,719,729,722,-593,575', +'224,-107,229,218,219,1154,732,274,577,-694,-694,-694,-694,-694,-694', +'-694,-694,-694,-694,-694,-694,-694,-694,-694,621,-694,-694,-694,727', +'627,225,828,829,-694,-594,-595,-694,737,736,740,739,-694,123,-694,733', +'-694,-694,122,-694,-694,-694,-694,-694,-304,-694,-694,-694,225,1083', +'1084,-304,-304,-304,267,268,225,-304,-304,847,-304,-694,-100,845,-694', +'-694,-694,-101,-304,-694,224,891,857,-694,-109,909,-694,274,-690,-110', +'-304,-304,-694,-304,-304,-304,-304,-304,951,622,266,265,724,224,721', +'720,719,729,722,821,1117,-694,740,739,817,891,857,732,818,577,-304,-304', +'-304,-304,-304,-304,-304,-304,-304,-304,-304,-304,-304,-304,-688,226', +'-304,-304,-304,727,626,-694,229,845,-304,225,-102,-304,737,736,740,739', +'-304,843,-304,733,-304,-304,-111,-304,-304,-304,-304,-304,-304,-304', +'935,-304,225,411,698,-304,-304,-304,413,412,732,-304,-304,270,-304,-304', +'-105,970,-304,-304,-591,-103,-304,-304,837,250,123,-591,-114,909,-304', +'122,-688,-112,-304,-304,-591,-304,-304,-304,-304,-304,-277,224,123,974', +'836,-305,733,122,614,229,833,816,-305,-688,815,247,229,612,943,249,248', +'-305,-304,-304,-304,-304,-304,-304,-304,-304,-304,-304,-304,-304,-304', +'-304,495,935,-304,-304,-304,-304,626,-591,995,996,-304,732,-304,-304', +'495,229,999,-691,-304,797,-304,-304,-304,-304,798,-304,-304,-304,-304', +'-304,225,-304,-694,-304,-305,1001,-278,785,784,-694,-694,-694,729,780', +'1009,-694,-694,-304,-694,733,-304,-304,732,-304,1010,-304,-694,-694', +'770,250,753,943,-304,1013,229,-112,-99,1015,-694,-694,-304,-694,-694', +'-694,-694,-694,229,224,-108,749,1019,-305,-280,748,223,740,739,743,-305', +'706,733,247,229,221,229,249,248,-305,-694,-694,-694,-694,-694,-694,-694', +'-694,-694,-694,-694,-694,-694,-694,229,704,-694,-694,-694,1025,627,703', +'224,1028,-694,698,542,-694,229,461,229,229,-694,229,-694,229,-694,-694', +'462,-694,-694,-694,-694,-694,225,-694,-694,-694,-305,1114,-304,721,720', +'719,687,722,224,-304,-92,1040,868,-694,-691,1117,-694,-694,-304,-694', +'868,-694,-343,1044,577,1046,1048,1050,-694,-343,229,-110,303,79,80,81', +'11,62,-343,225,1052,68,69,1053,229,229,72,-687,70,71,73,32,33,77,78', +'126,127,128,129,130,82,30,29,111,110,112,113,-304,724,21,721,720,719', +'225,722,10,50,305,12,115,114,116,105,61,107,106,108,-343,109,117,118', +'-600,101,102,46,47,45,-601,-600,-588,229,224,672,1066,-601,878,-588', +'-600,529,868,886,-687,1068,-601,882,-588,42,527,1070,35,1072,1074,63', +'64,-295,1074,65,229,37,229,250,-295,49,1114,-687,721,720,719,250,722', +'-295,22,250,250,1089,631,99,87,90,91,770,92,94,93,95,815,-600,1092,276', +'88,98,1095,-601,620,-588,619,225,67,815,89,103,104,229,615,43,44,303', +'79,80,81,11,62,611,610,-277,68,69,608,1111,-295,72,607,70,71,73,32,33', +'77,78,242,604,579,1118,571,82,30,29,111,110,112,113,775,776,21,570,777', +'117,118,403,10,50,305,12,115,114,116,105,61,107,106,108,566,109,117', +'118,1123,101,102,46,47,45,250,254,255,256,257,267,268,262,263,258,259', +'224,243,244,511,553,260,261,538,42,552,3,35,729,229,63,64,462,250,65', +'1130,37,247,732,253,49,249,248,1131,245,246,266,265,251,22,252,539,533', +'276,99,87,90,91,229,92,94,93,95,229,285,1139,530,88,98,523,264,740,739', +'1142,868,67,733,89,103,104,1144,225,43,44,303,79,80,81,11,62,1146,1148', +'1150,68,69,1150,1150,522,72,229,70,71,73,32,33,77,78,126,127,128,129', +'130,82,30,29,111,110,112,113,703,-77,21,132,511,509,1163,616,10,50,305', +'12,115,114,116,105,61,107,106,108,1164,109,117,118,1165,101,102,46,47', +'45,250,254,255,256,257,267,268,262,263,258,259,1074,243,244,1074,1074', +'260,261,507,42,495,228,307,1173,466,63,64,1142,1142,65,465,37,247,463', +'253,49,249,248,414,245,246,266,265,251,22,252,229,330,329,99,87,90,91', +'-691,92,94,93,95,-690,229,270,220,88,98,217,264,216,-250,1131,215,67', +'1142,89,103,104,1186,1150,43,44,303,79,80,81,11,62,1150,1150,132,68', +'69,1074,119,229,72,904,70,71,73,32,33,77,78,126,127,128,129,130,82,30', +'29,111,110,112,113,-279,229,21,229,894,893,857,616,10,50,305,12,115', +'114,116,105,61,107,106,108,888,109,117,118,,101,102,46,47,45,250,254', +'255,256,257,267,268,262,263,258,259,,243,244,,,260,261,,42,,,35,,,63', +'64,,,65,,37,247,,253,49,249,248,,245,246,266,265,251,22,252,,,,99,87', +'90,91,,92,94,93,95,,,,,88,98,,264,,,,,67,,89,103,104,,,43,44,303,79', +'80,81,11,62,,,,68,69,,,,72,,70,71,73,32,33,77,78,126,127,128,129,130', +'82,30,29,111,110,112,113,,724,21,721,720,719,,722,10,50,305,12,115,114', +'116,105,61,107,106,108,,109,117,118,,101,102,46,47,45,250,254,255,256', +'257,267,268,262,263,258,259,,243,244,,,260,261,,42,,,35,,,63,64,,,65', +',37,247,,253,49,249,248,,245,246,266,265,251,22,252,,,,99,87,90,91,', +'92,94,93,95,,,,,88,98,229,264,,,,,67,,89,103,104,,,43,44,303,79,80,81', +'11,62,,,,68,69,,,,72,,70,71,73,32,33,77,78,,,,,,82,30,29,111,110,112', +'113,,,21,,,,,,10,50,305,12,115,114,116,105,61,107,106,108,,109,117,118', +',101,102,46,47,45,250,254,255,256,257,267,268,262,263,258,259,,243,244', +',,260,261,,42,,,35,,,63,64,,,65,,37,247,,253,49,249,248,,245,246,266', +'265,251,22,252,,,,99,87,90,91,,92,94,93,95,,,,,88,98,,264,,,,,67,,89', +'103,104,,,43,44,303,79,80,81,11,62,,,,68,69,,,,72,,70,71,73,32,33,77', +'78,,,,,,82,30,29,111,110,112,113,,,21,,,,,,10,50,305,12,115,114,116', +'105,61,107,106,108,,109,117,118,,101,102,46,47,45,250,254,255,256,257', +'267,268,262,263,258,259,,243,244,,,260,261,,42,,,35,,,63,64,,,65,,37', +'247,,253,49,249,248,,245,246,266,265,251,22,252,,,,99,87,90,91,,92,94', +'93,95,,,,,88,98,,264,,,,,67,,89,103,104,,,43,44,303,79,80,81,11,62,', +',,68,69,,,,72,,70,71,73,32,33,77,78,,,,,,82,30,29,111,110,112,113,,', +'21,,,,,,10,50,305,12,115,114,116,105,61,107,106,108,,109,117,118,,101', +'102,46,47,45,250,254,255,256,257,267,268,262,263,258,259,,243,244,,', +'260,261,,42,,,35,,,63,64,,,65,,37,247,,253,49,249,248,,245,246,266,265', +'251,22,252,,,,99,87,90,91,,92,94,93,95,,,,,88,98,,264,,,,,67,,89,103', +'104,,,43,44,303,79,80,81,11,62,,,,68,69,,,,72,,70,71,73,32,33,77,78', +',,,,,82,30,29,111,110,112,113,,,21,,,,,,10,50,305,12,115,114,116,105', +'61,107,106,108,,109,117,118,,101,102,46,47,45,250,254,255,256,257,267', +'268,262,263,258,259,,243,244,,,260,261,,42,,,35,,,63,64,,,65,,37,247', +',253,49,249,248,,245,246,266,265,251,22,252,,,,99,87,90,91,,92,94,93', +'95,,,,,88,98,,264,,,,,67,,89,103,104,,,43,44,7,79,80,81,11,62,,,,68', +'69,,,,72,,70,71,73,32,33,77,78,,,,,,82,30,29,111,110,112,113,,724,21', +'721,720,719,,722,10,50,9,12,115,114,116,105,61,107,106,108,,109,117', +'118,,101,102,46,47,45,724,,721,720,719,,722,,878,,724,,721,720,719,', +'722,882,,42,,,35,,,63,64,,250,65,,37,,,,49,,878,,724,,721,720,719,22', +'722,882,878,,99,87,90,91,,92,94,93,95,,,247,,88,98,249,248,,245,246', +',67,,89,103,104,,878,43,44,303,79,80,81,11,62,,,,68,69,,,,72,,70,71', +'73,32,33,77,78,,,,,,82,30,29,111,110,112,113,,,21,,,,,,10,50,305,12', +'115,114,116,105,61,107,106,108,,109,117,118,,101,102,46,47,45,250,254', +'255,256,257,267,268,262,263,258,259,,-716,-716,,,260,261,,42,,,35,,', +'63,64,,250,65,,37,247,,253,49,249,248,,245,246,266,265,251,22,252,,', +',99,87,90,91,,92,94,93,95,,,247,,88,98,249,248,,245,246,,67,,89,103', +'104,,,43,44,303,79,80,81,11,62,,,,68,69,,,,72,,70,71,73,32,33,77,78', +',,,,,82,30,29,111,110,112,113,,,21,,,,,,10,50,305,12,115,114,116,105', +'61,107,106,108,,109,117,118,,101,102,46,47,45,250,254,255,256,257,267', +'268,262,263,258,259,,-716,-716,,,260,261,,42,,,35,,,63,64,,,65,,37,247', +',253,49,249,248,,245,246,266,265,251,22,252,,,,99,87,90,91,,92,94,93', +'95,,,,,88,98,,724,,721,720,719,67,722,89,103,104,,,43,44,7,79,80,81', +'11,62,,,,68,69,,,,72,,70,71,73,32,33,77,78,878,,,,,82,30,29,111,110', +'112,113,,,21,,,,,,10,50,9,12,115,114,116,105,61,107,106,108,,109,117', +'118,,101,102,46,47,45,250,254,255,256,257,267,268,262,,258,259,,,,,', +'260,261,,42,,,35,,,63,64,,,65,,37,247,,253,49,249,248,,245,246,266,265', +'251,22,252,,,,99,87,90,91,,92,94,93,95,,,,,88,98,,,,,,,67,,89,103,104', +',,43,44,303,79,80,81,11,62,,,,68,69,,,,72,,70,71,73,32,33,77,78,,,,', +',82,30,29,111,110,112,113,,,21,,,,,,10,50,305,12,115,114,116,105,61', +'107,106,108,,109,117,118,,101,102,46,47,45,250,254,255,256,257,267,268', +'262,263,258,259,,-716,-716,,,260,261,,42,,,35,,,63,64,,,65,,37,247,', +'253,49,249,248,,245,246,266,265,251,22,252,,,,99,87,90,91,,92,94,93', +'95,,,,,88,98,,,,,,,67,,89,103,104,,,43,44,303,79,80,81,11,62,,,,68,69', +',,,72,,70,71,73,32,33,77,78,,,,,,82,30,29,111,110,112,113,,,21,,,,,', +'10,50,305,12,115,114,116,105,61,107,106,108,,109,117,118,,101,102,46', +'47,45,250,254,255,256,257,267,268,,,258,259,,,,,,260,261,,42,,,35,,', +'63,64,,,65,,37,247,,253,49,249,248,,245,246,266,265,251,22,252,,,,99', +'87,90,91,,92,94,93,95,,,,,88,98,,,,,,,67,,89,103,104,,,43,44,303,79', +'80,81,11,62,,,,68,69,,,,72,,70,71,73,32,33,77,78,,,,,,82,30,29,111,110', +'112,113,,,21,,,,,,10,50,305,12,115,114,116,105,61,107,106,108,,109,117', +'118,,101,102,46,47,45,250,,,,,,,,,,,,,,,,260,261,,42,,,35,,,63,64,,', +'65,,37,247,,253,49,249,248,,245,246,,,251,22,252,,,,99,87,90,91,,92', +'94,93,95,,,,,88,98,,,,,,,67,,89,103,104,,,43,44,303,79,80,81,11,62,', +',,68,69,,,,72,,70,71,73,32,33,77,78,,,,,,82,30,29,111,110,112,113,,', +'21,,,,,,10,50,305,12,115,114,116,105,61,107,106,108,,109,117,118,,101', +'102,46,47,45,250,,,,,,,,,,,,,,,,260,261,,42,,,35,,,63,64,,,65,,37,247', +',253,49,249,248,,245,246,,,251,22,252,,,,99,87,90,91,,92,94,93,95,,', +',,88,98,,,,,,,67,,89,103,104,,,43,44,303,79,80,81,11,62,,,,68,69,,,', +'72,,70,71,73,32,33,77,78,,,,,,82,30,29,111,110,112,113,,,21,,,,,,10', +'50,305,12,115,114,116,105,61,107,106,108,,109,117,118,,101,102,46,47', +'45,250,254,255,256,257,267,268,262,263,258,259,,-716,-716,,,260,261', +',42,,,35,,,63,64,,,65,,37,247,,253,49,249,248,,245,246,266,265,251,22', +'252,,,,99,87,90,91,,92,94,93,95,,,,,88,98,,,,,,,67,,89,103,104,,,43', +'44,303,79,80,81,11,62,,,,68,69,,,,72,,70,71,73,32,33,77,78,,,,,,82,30', +'29,111,110,112,113,,,21,,,,,,10,50,305,12,115,114,116,105,61,107,106', +'108,,109,117,118,,101,102,46,47,45,250,-716,-716,-716,-716,267,268,', +',-716,-716,,,,,,260,261,,42,,,35,,,63,64,,,65,,37,247,,253,49,249,248', +',245,246,266,265,251,22,252,,,,99,87,90,91,,92,94,93,95,,,,,88,98,,', +',,,,67,,89,103,104,,,43,44,303,79,80,81,11,62,,,,68,69,,,,72,,70,71', +'73,32,33,77,78,,,,,,82,30,29,111,110,112,113,,,21,,,,,,10,50,305,12', +'115,114,116,105,61,107,106,108,,109,117,118,,101,102,46,47,45,250,-716', +'-716,-716,-716,267,268,,,-716,-716,,,,,,260,261,,42,,,307,,,63,64,,', +'65,,37,247,,253,49,249,248,,245,246,266,265,251,22,252,,,,99,87,90,91', +',92,94,93,95,,,,,88,98,,,,,,,67,,89,103,104,,,43,44,303,79,80,81,11', +'62,,,,68,69,,,,72,,70,71,73,32,33,77,78,,,,,,82,30,29,111,110,112,113', +',,21,,,,,,10,50,305,12,115,114,116,105,61,107,106,108,,109,117,118,', +'101,102,46,47,45,250,-716,-716,-716,-716,267,268,,,-716,-716,,,,,,260', +'261,,42,,,35,,,63,64,,,65,,37,247,,253,49,249,248,,245,246,266,265,251', +'22,252,,,,99,87,90,91,,92,94,93,95,,,,,88,98,,,,,,,67,,89,103,104,,', +'43,44,303,79,80,81,11,62,,,,68,69,,,,72,,70,71,73,32,33,77,78,,,,,,82', +'30,29,111,110,112,113,,,21,,,,,,10,50,305,12,115,114,116,105,61,107', +'106,108,,109,117,118,,101,102,46,47,45,250,-716,-716,-716,-716,267,268', +',,-716,-716,,,,,,260,261,,42,,,35,,,63,64,,,65,,37,247,,253,49,249,248', +',245,246,266,265,251,22,252,,,,99,87,90,91,,92,94,93,95,,,,,88,98,,', +',,,,67,,89,103,104,,,43,44,303,79,80,81,11,62,,,,68,69,,,,72,,70,71', +'73,32,33,77,78,,,,,,82,30,29,111,110,112,113,,,21,,,,,,10,50,305,12', +'115,114,116,105,61,107,106,108,,109,117,118,,101,102,46,47,45,250,-716', +'-716,-716,-716,267,268,,,-716,-716,,,,,,260,261,,42,,,35,,,63,64,,,65', +',37,247,,253,49,249,248,,245,246,266,265,251,22,252,,,,99,87,90,91,', +'92,94,93,95,,,,,88,98,,,,,,,67,,89,103,104,,,43,44,303,79,80,81,11,62', +',,,68,69,,,,72,,70,71,73,32,33,77,78,,,,,,82,30,29,111,110,112,113,', +',21,,,,,,10,50,305,12,115,114,116,105,61,107,106,108,,109,117,118,,101', +'102,46,47,45,250,-716,-716,-716,-716,267,268,,,-716,-716,,,,,,260,261', +',42,,,35,,,63,64,,,65,,37,247,,253,49,249,248,,245,246,266,265,251,22', +'252,,,,99,87,90,91,,92,94,93,95,,,,,88,98,,,,,,,67,,89,103,104,,,43', +'44,303,79,80,81,11,62,,,,68,69,,,,72,,70,71,73,32,33,77,78,,,,,,82,30', +'29,111,110,112,113,,,21,,,,,,10,50,305,12,115,114,116,105,61,107,106', +'108,,109,117,118,,101,102,46,47,45,250,,,,,,,,,,,,,,,,260,261,,42,,', +'35,,,63,64,,,65,,37,247,,253,49,249,248,,245,246,,,,22,,,,,99,87,90', +'91,,92,94,93,95,,,,,88,98,,,,,,,67,,89,103,104,,,43,44,303,79,80,81', +'11,62,,,,68,69,,,,72,,70,71,73,32,33,77,78,,,,,,82,30,29,111,110,112', +'113,,,21,,,,,,10,50,305,12,115,114,116,105,61,107,106,108,,109,117,118', +',101,102,46,47,45,250,,,,,,,,,,,,,,,,260,261,,42,,,35,,,63,64,,,65,', +'37,247,,253,49,249,248,,245,246,,,,22,,,,,99,87,90,91,,92,94,93,95,', +',,,88,98,,,,,,,67,,89,103,104,,,43,44,303,79,80,81,11,62,,,,68,69,,', +',72,,70,71,73,32,33,77,78,,,,,,82,30,29,111,110,112,113,,,21,,,,,,10', +'50,305,12,115,114,116,105,61,107,106,108,,109,117,118,,101,102,46,47', +'45,250,,,,,,,,,,,,,,,,260,261,,42,,,307,,,63,64,,,65,,37,247,,,49,249', +'248,,245,246,,,,22,,,,,99,87,90,91,,92,94,93,95,,,,,88,98,,,,,,,67,', +'89,103,104,,,43,44,303,79,80,81,11,62,,,,68,69,,,,72,,70,71,73,32,33', +'77,78,,,,,,82,30,29,111,110,112,113,,,21,,,,,,10,50,305,12,115,114,116', +'105,61,107,106,108,,109,117,118,,101,102,46,47,45,,,,,,,,,,,,,,,,,,', +',42,,,35,,,63,64,,,65,,37,,,,49,,,,,,,,,22,,,,,99,87,90,91,,92,94,93', +'95,,,,,88,98,,,,,,,67,,89,103,104,,,43,44,303,79,80,81,11,62,,,,68,69', +',,,72,,70,71,73,32,33,77,78,,,,,,82,30,29,111,110,112,113,,,21,,,,,', +'10,50,305,12,115,114,116,105,61,107,106,108,,109,117,118,,101,102,46', +'47,45,,,,,,,,,,,,,,,,,,,,42,,,35,,,63,64,,,65,,37,,,,49,,,,,,,,,22,', +',,,99,87,90,91,,92,94,93,95,,,,,88,98,,,,79,80,81,67,62,89,103,104,68', +'69,43,44,,72,,70,71,73,32,33,77,78,,,,,,82,30,29,111,110,112,113,,,21', +',,,,,,50,,,115,114,116,105,61,107,106,108,,109,117,118,,101,102,46,47', +'45,,,,,,,,,,,,,,,,,,,,234,,,240,,,63,64,,,65,,,,,,49,,,,,,,,,22,,,,', +'99,87,90,91,,92,94,93,95,,,,,88,98,,,,,,,67,,89,103,104,,,43,44,79,80', +'81,11,62,,,,68,69,,,,72,,70,71,73,32,33,77,78,,,,,,82,30,29,111,110', +'112,113,,,21,,,,,,10,50,9,12,115,114,116,105,61,107,106,108,,109,117', +'118,,101,102,46,47,45,,,,,,,,,,,,,,,,,,,,42,,,35,,,63,64,,,65,,37,,', +',49,,,,,,,,,22,,,,,99,87,90,91,,92,94,93,95,,,,,88,98,,,,79,80,81,67', +'62,89,103,104,68,69,43,44,,72,,70,71,73,32,33,77,78,,,,,,82,30,29,111', +'110,112,113,,,241,,,,,,,50,,,115,114,116,105,61,107,106,108,,109,117', +'118,,101,102,46,47,45,,,,,,,,,,,,,,,,,,,,234,,,240,,,63,64,,,65,,,,', +',49,,,,,,,,,239,,,,,99,87,90,91,,92,94,93,95,,,,,88,98,,,,,,,67,,89', +'103,104,-424,,43,44,,,,-424,-424,-424,,,-424,-424,-424,,-424,,,,,,,', +'-424,-424,-424,-424,,,,,,,,,-424,-424,,-424,-424,-424,-424,-424,,,,', +',,,,,,,,,,,,,,,,,,-424,-424,-424,-424,-424,-424,-424,-424,-424,-424', +'-424,-424,-424,-424,,,-424,-424,-424,,,-424,,276,-424,,,-424,-424,,-424', +',-424,,-424,,-424,-424,,-424,-424,-424,-424,-424,-311,-424,-424,-424', +',,,-311,-311,-311,,,-311,-311,-311,,-311,-424,,,-424,-424,,-424,-311', +'-424,-311,-311,,,,,-424,,,,-311,-311,,-311,-311,-311,-311,-311,,,,,', +',,,,,,,,,,,,,,,,,-311,-311,-311,-311,-311,-311,-311,-311,-311,-311,-311', +'-311,-311,-311,,,-311,-311,-311,,,-311,,285,-311,,,-311,-311,,-311,', +'-311,,-311,,-311,-311,,-311,-311,-311,-311,-311,,-311,,-311,,,,,,,,', +',,,,,-311,,,-311,-311,,-311,,-311,79,80,81,,62,,-311,,68,69,,,,72,,70', +'71,73,32,33,77,78,,,,,,82,30,29,111,110,112,113,,,241,,,,,,,50,,,115', +'114,116,105,61,107,106,108,297,109,117,118,,101,102,46,47,45,,,,,,,', +',,,,,,,,,,,,234,,,240,,,63,64,,,65,,294,,292,,49,,,298,,,,,,239,,,,', +'99,295,90,91,,92,94,93,95,,,,,88,98,,,,79,80,81,67,62,89,103,104,68', +'69,43,44,,72,,70,71,73,32,33,77,78,,,,,,82,30,29,111,110,112,113,,,241', +',,,,,,50,,,115,114,116,105,61,107,106,108,297,109,117,118,,101,102,46', +'47,45,,,,,,,,,,,,,,,,,,,,234,,,240,,,63,64,,,65,,294,,292,,49,,,298', +',,,,,239,,,,,99,295,90,91,,92,94,93,95,,,,,88,98,,,,79,80,81,67,62,89', +'103,104,68,69,43,44,,72,,70,71,73,32,33,77,78,,,,,,82,30,29,111,110', +'112,113,,,241,,,,,,,50,,,115,114,116,105,61,107,106,108,297,109,117', +'118,,101,102,46,47,45,,,,,,,,,,,,,,,,,,,,234,,,240,,,63,64,,,65,,294', +',292,,49,,,298,,,,,,239,,,,,99,295,90,91,,92,94,93,95,,,,,88,98,,,,79', +'80,81,67,62,89,103,104,68,69,43,44,,72,,70,71,73,322,323,77,78,,,,,', +'82,319,325,111,110,112,113,,,241,,,,,,,50,,,115,114,116,105,61,107,106', +'108,,109,117,118,,101,102,46,47,45,,,,,,,,,,,,,,,,,,,,234,,,240,,,63', +'64,,,65,,,,,,49,,,,,,,,,239,,,,,99,87,90,91,,92,94,93,95,,,,,88,98,', +',,79,80,81,67,62,89,103,104,68,69,43,44,,72,,70,71,73,322,323,77,78', +',,,,,82,319,325,111,110,112,113,,,241,,,,,,,50,,,115,114,116,105,61', +'107,106,108,,109,117,118,,101,102,46,47,45,,,,,,,,,,,,,,,,,,,,234,,', +'240,,,63,64,,,65,,,,,,49,,,,,,,,,239,,,,,99,87,90,91,,92,94,93,95,,', +',,88,98,,,,79,80,81,67,62,89,103,104,68,69,43,44,,72,,70,71,73,322,323', +'77,78,,,,,,82,319,325,111,110,112,113,,,241,,,,,,,50,,,115,114,116,105', +'61,107,106,108,,109,117,118,,101,102,46,47,45,,,,,,,,,,,,,,,,,,,,234', +',,240,,,63,64,,,65,,,,,,49,,,,,,,,,239,,,,,99,87,90,91,,92,94,93,95', +',,,,88,98,,,,79,80,81,67,62,89,103,104,68,69,43,44,,72,,70,71,73,322', +'323,77,78,,,,,,82,319,325,111,110,112,113,,,241,,,,,,,50,,,115,114,116', +'105,61,107,106,108,,109,117,118,,101,102,46,47,45,,,,,,,,,,,,,,,,,,', +',234,,,240,,,63,64,,,65,,,,,,49,,,,,,,,,239,,,,,99,87,90,91,,92,94,93', +'95,,,,,88,98,,,,79,80,81,67,62,89,103,104,68,69,43,44,,72,,70,71,73', +'322,323,77,78,,,,,,82,319,325,111,110,112,113,,,241,,,,,,,50,,,115,114', +'116,105,61,107,106,108,,109,117,118,,101,102,46,47,45,,,,,,,,,,,,,,', +',,,,,234,,,240,,,63,64,,,65,,,,,,49,,,,,,,,,239,,,,,99,87,90,91,,92', +'94,93,95,,,,,88,98,,,,,,,67,,89,103,104,-296,,43,44,,,,-296,-296,-296', +',,-296,-296,-296,,-296,,,,,,,,-296,,-296,-296,-296,,,,111,110,112,113', +'-296,-296,,-296,-296,-296,-296,-296,,,,,115,114,116,,,,,,,,,,,101,102', +',,326,-296,-296,-296,-296,-296,-296,-296,-296,-296,-296,-296,-296,-296', +'-296,,,-296,-296,-296,,,-296,,,-296,,,-296,-296,,-296,,-296,,-296,,-296', +'-296,,-296,-296,-296,-296,-296,,-296,,-296,,99,87,90,91,,92,94,93,95', +',,,-296,88,98,-296,-296,-296,-296,,-296,660,-296,89,103,104,,-296,79', +'80,81,11,62,,,,68,69,,,,72,,70,71,73,32,33,77,78,,,,,,82,30,29,111,110', +'112,113,,,21,,,,,,10,50,,12,115,114,116,105,61,107,106,108,,109,117', +'118,,101,102,46,47,45,,,,,,,,,,,,,,,,,,,,42,,,35,,,63,64,,,65,,37,,', +',49,,,,,,,,,22,,,,,99,87,90,91,,92,94,93,95,,,,,88,98,,,,79,80,81,67', +'62,89,103,104,68,69,43,44,,72,,70,71,73,322,323,77,78,,,,,,82,319,325', +'111,110,112,113,,,241,,,,,,,50,,,115,114,116,105,61,107,106,108,297', +'109,117,118,,101,102,46,47,45,,,,,,,,,,,,,,,,,,,,234,,,240,,,63,64,', +',65,,294,,,,49,,,298,,,,,,239,,,,,99,295,90,91,,92,94,93,95,,,,,88,98', +',,,79,80,81,67,62,89,103,104,68,69,43,44,,72,,70,71,73,322,323,77,78', +',,,,,82,319,325,111,110,112,113,,,241,,,,,,,50,,,115,114,116,105,61', +'107,106,108,297,109,117,118,,101,102,46,47,45,,,,,,,,,,,,,,,,,,,,234', +',,240,,,63,64,,,65,,,,,,49,,,298,,,,,,239,,,,,99,295,90,91,,92,94,93', +'95,,,,,88,98,,,,79,80,81,67,62,89,103,104,68,69,43,44,,72,,70,71,73', +'32,33,77,78,,,,,,82,30,29,111,110,112,113,,,21,,,,,,,50,,,115,114,116', +'105,61,107,106,108,,109,117,118,,101,102,46,47,45,,,,,,,,,,,,,,,,,,', +',234,,,240,,,63,64,,,65,,,,,,49,,,,,,,,,22,,,,,99,87,90,91,,92,94,93', +'95,,,,,88,98,,,,79,80,81,67,62,89,103,104,68,69,43,44,,72,,70,71,73', +'32,33,77,78,,,,,,82,30,29,111,110,112,113,,,21,,,,,,,50,,,115,114,116', +'105,61,107,106,108,,109,117,118,,101,102,46,47,45,,,,,,,,,,,,,,,,,,', +',234,,,240,,,63,64,,,65,,,,,,49,,,,,,,,,22,,,,,99,87,90,91,,92,94,93', +'95,,,,,88,98,,,,79,80,81,67,62,89,103,104,68,69,43,44,,72,,70,71,73', +'32,33,77,78,,,,,,82,30,29,111,110,112,113,,,21,,,,,,,50,,,115,114,116', +'105,61,107,106,108,,109,117,118,,101,102,46,47,45,,,,,,,,,,,,,,,,,,', +',234,,,240,,,63,64,,,65,,,,,,49,,,,,,,,,22,,,,,99,87,90,91,,92,94,93', +'95,,,,,88,98,123,,,,,122,67,,89,103,104,,,43,44,79,80,81,11,62,,,,68', +'69,,,,72,,70,71,73,32,33,77,78,,,,,,82,30,29,111,110,112,113,,,21,,', +',,,10,50,9,12,115,114,116,105,61,107,106,108,,109,117,118,,101,102,46', +'47,45,,,,,,,,,,,,,,,,,,,,42,,,35,,,63,64,,,65,,37,,,,49,,,,,,,,,22,', +',,,99,87,90,91,,92,94,93,95,,,,,88,98,,,,,,403,67,,89,103,104,,,43,44', +'79,80,81,,62,,,,68,69,,,,72,,70,71,73,32,33,77,78,,,,,,82,30,29,111', +'110,112,113,,,21,,,,,,,50,,,115,114,116,105,61,107,106,108,,109,117', +'118,,101,102,46,47,45,,,,,,,,,,,,,,,,,,,,234,,,240,,,63,64,,,65,,,,', +',49,,,,,,,,,22,,,,,99,87,90,91,,92,94,93,95,,,,,88,98,,,,79,80,81,67', +'62,89,103,104,68,69,43,44,,72,,70,71,73,32,33,77,78,,,,,,82,30,29,111', +'110,112,113,,,21,,,,,,,50,,,115,114,116,105,61,107,106,108,,109,117', +'118,,101,102,46,47,45,,,,,,,,,,,,,,,,,,,,234,,,240,,,63,64,,,65,,,,', +',49,,,,,,,,,22,,,,,99,87,90,91,,92,94,93,95,,,,,88,98,,,,79,80,81,67', +'62,89,103,104,68,69,43,44,,72,,70,71,73,32,33,77,78,,,,,,82,30,29,111', +'110,112,113,,,21,,,,,,,50,,,115,114,116,105,61,107,106,108,,109,117', +'118,,101,102,46,47,45,,,,,,,,,,,,,,,,,,,,234,,,240,,,63,64,,,65,,,,', +',49,,,,,,,,,22,,,,,99,87,90,91,,92,94,93,95,,,,,88,98,,,,79,80,81,67', +'62,89,103,104,68,69,43,44,,72,,70,71,73,32,33,77,78,,,,,,82,30,29,111', +'110,112,113,,,21,,,,,,,50,,,115,114,116,105,61,107,106,108,,109,117', +'118,,101,102,46,47,45,,,,,,,,,,,,,,,,,,,,234,,,240,,,63,64,,,65,,,,', +',49,,,,,,,,,22,,,,,99,87,90,91,,92,94,93,95,,,,,88,98,,,,,,,67,,89,103', +'104,,,43,44,79,80,81,11,62,,,,68,69,,,,72,,70,71,73,32,33,77,78,,,,', +',82,30,29,111,110,112,113,,,21,,,,,,10,50,,12,115,114,116,105,61,107', +'106,108,,109,117,118,,101,102,46,47,45,,,,,,,,,,,,,,,,,,,,42,,,35,,', +'63,64,,,65,,37,,,,49,,,,,,,,,22,,,,,99,87,90,91,,92,94,93,95,,,,,88', +'98,,,,79,80,81,67,62,89,103,104,68,69,43,44,,72,,70,71,73,32,33,77,78', +',,,,,82,30,29,111,110,112,113,,,241,,,,,,,50,,,115,114,116,105,61,107', +'106,108,,109,117,118,,101,102,46,47,45,,,,,,,,,,,,,,,,,,,,234,,,240', +',,63,64,,,65,,419,,,,49,,,,,,,,,239,,,,,99,87,90,91,,92,94,93,95,,,', +',88,98,,,,79,80,81,67,62,89,103,104,68,69,43,44,,72,,70,71,73,32,33', +'77,78,,,,,,82,30,29,111,110,112,113,,,241,,,,,,,50,,,115,114,116,105', +'61,107,106,108,,109,117,118,,101,102,46,47,45,,,,,,,,,,,,,,,,,,,,234', +',,240,,,63,64,,,65,,419,,,,49,,,,,,,,,239,,,,,99,87,90,91,,92,94,93', +'95,,,,,88,98,,,,79,80,81,67,62,89,103,104,68,69,43,44,,72,,70,71,73', +'32,33,77,78,,,,,,82,30,29,111,110,112,113,,,21,,,,,,,50,,,115,114,116', +'105,61,107,106,108,,109,117,118,,101,102,46,47,45,,,,,,,,,,,,,,,,,,', +',234,,,240,,,63,64,,,65,,,,,,49,,,,,,,,,22,,,,,99,87,90,91,,92,94,93', +'95,,,,,88,98,,,,79,80,81,67,62,89,103,104,68,69,43,44,,72,,70,71,73', +'32,33,77,78,,,,,,82,30,29,111,110,112,113,,,21,,,,,,,50,,,115,114,116', +'105,61,107,106,108,,109,117,118,,101,102,46,47,45,,,,,,,,,,,,,,,,,,', +',234,,,240,,,63,64,,,65,,,,,,49,,,,,,,,,22,,,,,99,87,90,91,,92,94,93', +'95,,,,,88,98,,,,79,80,81,67,62,89,103,104,68,69,43,44,,72,,70,71,73', +'32,33,77,78,,,,,,82,30,29,111,110,112,113,,,241,,,,,,,50,,,115,114,116', +'105,61,107,106,108,,109,117,118,,101,102,46,47,45,,,,,,,,,,,,,,,,,,', +',234,,,240,,,63,64,,,65,,,,,,49,,,,,,,,,239,,,,,99,87,90,91,,92,94,93', +'95,,,,,88,98,,,,79,80,81,67,62,89,103,104,68,69,43,44,,72,,70,71,73', +'32,33,77,78,,,,,,82,30,29,111,110,112,113,,,241,,,,,,,50,,,115,114,116', +'105,61,107,106,108,297,109,117,118,,101,102,46,47,45,,,,,,,,,,,,,,,', +',,,,234,,,240,,,63,64,,,65,,294,,292,,49,,,298,,,,,,239,,,,,99,295,90', +'91,,92,94,93,95,,,,,88,98,,,,79,80,81,67,62,89,103,104,68,69,43,44,', +'72,,70,71,73,32,33,77,78,,,,,,82,30,29,111,110,112,113,,,241,,,,,,,50', +',,115,114,116,105,61,107,106,108,,109,117,118,,101,102,46,47,45,,,,', +',,,,,,,,,,,,,,,234,,,240,,,63,64,,,65,,,,,,49,,,,,,,,,239,,,,,99,87', +'90,91,,92,94,93,95,,,,,88,98,,,,79,80,81,67,62,89,103,104,68,69,43,44', +',72,,70,71,73,32,33,77,78,,,,,,82,30,29,111,110,112,113,,,21,,,,,,,50', +',,115,114,116,105,61,107,106,108,,109,117,118,,101,102,46,47,45,,,,', +',,,,,,,,,,,,,,,234,,,240,,,63,64,,,65,,,,,,49,,,,,,,,,22,,,,,99,87,90', +'91,,92,94,93,95,,,,,88,98,,,,79,80,81,67,62,89,103,104,68,69,43,44,', +'72,,70,71,73,32,33,77,78,,,,,,82,30,29,111,110,112,113,,,21,,,,,,,50', +',,115,114,116,105,61,107,106,108,,109,117,118,,101,102,46,47,45,,,,', +',,,,,,,,,,,,,,,234,,,240,,,63,64,,,65,,,,,,49,,,,,,,,,22,,,,,99,87,90', +'91,,92,94,93,95,,,,,88,98,229,,,79,80,81,67,62,89,103,104,68,69,43,44', +',72,,70,71,73,322,323,77,78,,,,,,82,319,325,111,110,112,113,,,241,,', +',,,,50,,,115,114,116,105,61,107,106,108,,109,117,118,,101,102,46,47', +'45,,,,,,,,,,,,,,,,,,,,234,,,240,,,63,64,,,65,,,,,,49,,,,,,,,,239,,,', +',99,87,90,91,,92,94,93,95,,,,,88,98,,,,79,80,81,67,62,89,103,104,68', +'69,43,44,,72,,70,71,73,322,323,77,78,,,,,,82,319,325,111,110,112,113', +',,241,,,,,,,50,,,115,114,116,105,61,107,106,108,,109,117,118,,101,102', +'46,47,45,,,,,,,,,,,,,,,,,,,,234,,,240,,,63,64,,,65,,,,,,49,,,,,,,,,239', +',,,,99,87,90,91,,92,94,93,95,,,,,88,98,,,,79,80,81,67,62,89,103,104', +'68,69,43,44,,72,,70,71,73,322,323,77,78,,,,,,82,319,325,111,110,112', +'113,,,241,,,,,,,50,,,115,114,116,105,61,107,106,108,,109,117,118,,101', +'102,46,47,45,,,,,,,,,,,,,,,,,,,,234,,,240,,,63,64,,,65,,,,,,49,,,,,', +',,,239,,,,,99,87,90,91,,92,94,93,95,,,,,88,98,,,,79,80,81,67,62,89,103', +'104,68,69,43,44,,72,,70,71,73,322,323,77,78,,,,,,82,319,325,111,110', +'112,113,,,241,,,,,,,50,,,115,114,116,105,61,107,106,108,,109,117,118', +',101,102,46,47,45,,,,,,,,,,,,,,,,,,,,234,,,240,,,63,64,,,65,,,,,,49', +',,,,,,,,239,,,,,99,87,90,91,,92,94,93,95,,,,,88,98,,,,79,80,81,67,62', +'89,103,104,68,69,43,44,,72,,70,71,73,322,323,77,78,,,,,,82,319,325,111', +'110,112,113,,,241,,,,,,,50,,,115,114,116,105,61,107,106,108,,109,117', +'118,,101,102,46,47,45,,,,,,,,,,,,,,,,,,,,234,,,240,,,63,64,,,65,,,,', +',49,,,,,,,,,239,,,,,99,87,90,91,,92,94,93,95,,,,,88,98,,,,79,80,81,67', +'62,89,103,104,68,69,43,44,,72,,70,71,73,322,323,77,78,,,,,,82,319,325', +'111,110,112,113,,,241,,,,,,,50,,,115,114,116,105,61,107,106,108,,109', +'117,118,,101,102,46,47,45,,,,,,,,,,,,,,,,,,,,234,,,240,,,63,64,,,65', +',,,,,49,,,,,,,,,239,,,,,99,87,90,91,,92,94,93,95,,,,,88,98,,,,79,80', +'81,67,62,89,103,104,68,69,43,44,,72,,70,71,73,322,323,77,78,,,,,,82', +'319,325,111,110,112,113,,,241,,,,,,,50,,,115,114,116,105,61,107,106', +'108,,109,117,118,,101,102,46,47,45,,,,,,,,,,,,,,,,,,,,234,,,240,,,63', +'64,,,65,,,,,,49,,,,,,,,,239,,,,,99,87,90,91,,92,94,93,95,,,,,88,98,', +',,79,80,81,67,62,89,103,104,68,69,43,44,,72,,70,71,73,322,323,77,78', +',,,,,82,319,325,111,110,112,113,,,241,,,,,,,50,,,115,114,116,105,61', +'107,106,108,,109,117,118,,101,102,46,47,45,,,,,,,,,,,,,,,,,,,,234,,', +'240,,,63,64,,,65,,,,,,49,,,,,,,,,239,,,,,99,87,90,91,,92,94,93,95,,', +',,88,98,,,,79,80,81,67,62,89,103,104,68,69,43,44,,72,,70,71,73,322,323', +'77,78,,,,,,82,319,325,111,110,112,113,,,241,,,,,,,50,,,115,114,116,105', +'61,107,106,108,,109,117,118,,101,102,46,47,45,,,,,,,,,,,,,,,,,,,,234', +',,240,,,63,64,,,65,,,,,,49,,,,,,,,,239,,,,,99,87,90,91,,92,94,93,95', +',,,,88,98,,,,79,80,81,67,62,89,103,104,68,69,43,44,,72,,70,71,73,322', +'323,77,78,,,,,,82,319,325,111,110,112,113,,,241,,,,,,,50,,,115,114,116', +'105,61,107,106,108,,109,117,118,,101,102,46,47,45,,,,,,,,,,,,,,,,,,', +',234,,,240,,,63,64,,,65,,,,,,49,,,,,,,,,239,,,,,99,87,90,91,,92,94,93', +'95,,,,,88,98,,,,79,80,81,67,62,89,103,104,68,69,43,44,,72,,70,71,73', +'322,323,77,78,,,,,,82,319,325,111,110,112,113,,,241,,,,,,,50,,,115,114', +'116,105,61,107,106,108,,109,117,118,,101,102,46,47,45,,,,,,,,,,,,,,', +',,,,,234,,,240,,,63,64,,,65,,,,,,49,,,,,,,,,239,,,,,99,87,90,91,,92', +'94,93,95,,,,,88,98,,,,79,80,81,67,62,89,103,104,68,69,43,44,,72,,70', +'71,73,322,323,77,78,,,,,,82,319,325,111,110,112,113,,,241,,,,,,,50,', +',115,114,116,105,61,107,106,108,,109,117,118,,101,102,46,47,45,,,,,', +',,,,,,,,,,,,,,234,,,240,,,63,64,,,65,,,,,,49,,,,,,,,,239,,,,,99,87,90', +'91,,92,94,93,95,,,,,88,98,,,,79,80,81,67,62,89,103,104,68,69,43,44,', +'72,,70,71,73,322,323,77,78,,,,,,82,319,325,111,110,112,113,,,241,,,', +',,,50,,,115,114,116,105,61,107,106,108,,109,117,118,,101,102,46,47,45', +',,,,,,,,,,,,,,,,,,,234,,,240,,,63,64,,,65,,,,,,49,,,,,,,,,239,,,,,99', +'87,90,91,,92,94,93,95,,,,,88,98,,,,79,80,81,67,62,89,103,104,68,69,43', +'44,,72,,70,71,73,322,323,77,78,,,,,,82,319,325,111,110,112,113,,,241', +',,,,,,50,,,115,114,116,105,61,107,106,108,,109,117,118,,101,102,46,47', +'45,,,,,,,,,,,,,,,,,,,,234,,,240,,,63,64,,,65,,,,,,49,,,,,,,,,239,,,', +',99,87,90,91,,92,94,93,95,,,,,88,98,,,,79,80,81,67,62,89,103,104,68', +'69,43,44,,72,,70,71,73,322,323,77,78,,,,,,82,319,325,111,110,112,113', +',,241,,,,,,,50,,,115,114,116,105,61,107,106,108,,109,117,118,,101,102', +'46,47,45,,,,,,,,,,,,,,,,,,,,234,,,240,,,63,64,,,65,,,,,,49,,,,,,,,,239', +',,,,99,87,90,91,,92,94,93,95,,,,,88,98,,,,79,80,81,67,62,89,103,104', +'68,69,43,44,,72,,70,71,73,322,323,77,78,,,,,,82,319,325,111,110,112', +'113,,,241,,,,,,,50,,,115,114,116,105,61,107,106,108,,109,117,118,,101', +'102,46,47,45,,,,,,,,,,,,,,,,,,,,234,,,240,,,63,64,,,65,,,,,,49,,,,,', +',,,239,,,,,99,87,90,91,,92,94,93,95,,,,,88,98,,,,79,80,81,67,62,89,103', +'104,68,69,43,44,,72,,70,71,73,322,323,77,78,,,,,,82,319,325,111,110', +'112,113,,,241,,,,,,,50,,,115,114,116,105,61,107,106,108,,109,117,118', +',101,102,46,47,45,,,,,,,,,,,,,,,,,,,,234,,,240,,,63,64,,,65,,,,,,49', +',,,,,,,,239,,,,,99,87,90,91,,92,94,93,95,,,,,88,98,,,,79,80,81,67,62', +'89,103,104,68,69,43,44,,72,,70,71,73,322,323,77,78,,,,,,82,319,325,111', +'110,112,113,,,241,,,,,,,50,,,115,114,116,105,61,107,106,108,,109,117', +'118,,101,102,46,47,45,,,,,,,,,,,,,,,,,,,,234,,,240,,,63,64,,,65,,,,', +',49,,,,,,,,,239,,,,,99,87,90,91,,92,94,93,95,,,,,88,98,,,,79,80,81,67', +'62,89,103,104,68,69,43,44,,72,,70,71,73,322,323,77,78,,,,,,82,319,325', +'111,110,112,113,,,241,,,,,,,50,,,115,114,116,105,61,107,106,108,,109', +'117,118,,101,102,46,47,45,,,,,,,,,,,,,,,,,,,,234,,,240,,,63,64,,,65', +',,,,,49,,,,,,,,,239,,,,,99,87,90,91,,92,94,93,95,,,,,88,98,,,,79,80', +'81,67,62,89,103,104,68,69,43,44,,72,,70,71,73,322,323,77,78,,,,,,82', +'319,325,111,110,112,113,,,241,,,,,,,50,,,115,114,116,105,61,107,106', +'108,,109,117,118,,101,102,46,47,45,,,,,,,,,,,,,,,,,,,,234,,,240,,,63', +'64,,,65,,,,,,49,,,,,,,,,239,,,,,99,87,90,91,,92,94,93,95,,,,,88,98,', +',,79,80,81,67,62,89,103,104,68,69,43,44,,72,,70,71,73,322,323,77,78', +',,,,,82,319,325,111,110,112,113,,,241,,,,,,,50,,,115,114,116,105,61', +'107,106,108,,109,117,118,,101,102,46,47,45,,,,,,,,,,,,,,,,,,,,234,,', +'240,,,63,64,,,65,,,,,,49,,,,,,,,,239,,,,,99,87,90,91,,92,94,93,95,,', +',,88,98,,,,79,80,81,67,62,89,103,104,68,69,43,44,,72,,70,71,73,322,323', +'77,78,,,,,,82,319,325,111,110,112,113,,,241,,,,,,,50,,,115,114,116,105', +'61,107,106,108,,109,117,118,,101,102,46,47,45,,,,,,,,,,,,,,,,,,,,234', +',,240,,,63,64,,,65,,,,,,49,,,,,,,,,239,,,,,99,87,90,91,,92,94,93,95', +',,,,88,98,,,,79,80,81,67,62,89,103,104,68,69,43,44,,72,,70,71,73,322', +'323,77,78,,,,,,82,319,325,111,110,112,113,,,241,,,,,,,50,,,115,114,116', +'105,61,107,106,108,,109,117,118,,101,102,46,47,45,,,,,,,,,,,,,,,,,,', +',234,,,240,,,63,64,,,65,,,,,,49,,,,,,,,,239,,,,,99,87,90,91,,92,94,93', +'95,,,,,88,98,,,,79,80,81,67,62,89,103,104,68,69,43,44,,72,,70,71,73', +'322,323,77,78,,,,,,82,319,325,111,110,112,113,,,241,,,,,,,50,,,115,114', +'116,105,61,107,106,108,,109,117,118,,101,102,46,47,45,,,,,,,,,,,,,,', +',,,,,234,,,240,,,63,64,,,65,,,,,,49,,,,,,,,,239,,,,,99,87,90,91,,92', +'94,93,95,,,,,88,98,,,,79,80,81,67,62,89,103,104,68,69,43,44,,72,,70', +'71,73,32,33,77,78,,,,,,82,30,29,111,110,112,113,,,241,,,,,,,50,,,115', +'114,116,105,61,107,106,108,297,109,117,118,,101,102,46,47,45,,,,,,,', +',,,,,,,,,,,,234,,,240,,,63,64,,,65,,294,,292,,49,,,298,,,,,,239,,,,', +'99,295,90,91,,92,94,93,95,,,,,88,98,,,,79,80,81,67,62,89,103,104,68', +'69,43,497,,72,,70,71,73,32,33,77,78,,,,,,82,30,29,111,110,112,113,,', +'241,,,,,,,50,,,115,114,116,105,61,107,106,108,297,109,117,118,,101,102', +'46,47,45,,,,,,,,,,,,,,,,,,,,234,,,240,,,63,64,,,65,,294,,292,,49,,,298', +',,,,,239,,,,,99,295,90,91,,92,94,93,95,,,,,88,98,,,,79,80,81,67,62,89', +'103,104,68,69,43,44,,72,,70,71,73,32,33,77,78,,,,,,82,30,29,111,110', +'112,113,,,241,,,,,,,50,,,115,114,116,105,61,107,106,108,297,109,117', +'118,,101,102,46,47,45,,,,,,,,,,,,,,,,,,,,234,,,240,,,63,64,,,65,,294', +',292,,49,,,298,,,,,,239,,,,,99,295,90,91,,92,94,93,95,,,,,88,98,229', +',,79,80,81,67,62,89,103,104,68,69,43,44,,72,,70,71,73,322,323,77,78', +',,,,,82,319,325,111,110,112,113,,,241,,,,,,,50,,,115,114,116,105,61', +'107,106,108,,109,117,118,,101,102,46,47,45,,,,,,,,,,,,,,,,,,,,234,,', +'240,,,63,64,,,65,,,,,,49,,,,,,,,,239,,,,,99,87,90,91,,92,94,93,95,,', +',,88,98,,,,79,80,81,67,62,89,103,104,68,69,43,44,,72,,70,71,73,322,323', +'77,78,,,,,,82,319,325,111,110,112,113,,,241,,,,,,,50,,,115,114,116,105', +'61,107,106,108,,109,117,118,,101,102,46,47,45,,,,,,,,,,,,,,,,,,,,234', +',,240,,,63,64,,,65,,,,,,49,,,,,,,,,239,,,,,99,87,90,91,,92,94,93,95', +',,,,88,98,,,,79,80,81,67,62,89,103,104,68,69,43,44,,72,,70,71,73,322', +'323,77,78,,,,,,82,319,325,111,110,112,113,,,241,,,,,,,50,,,115,114,116', +'105,61,107,106,108,,109,117,118,,101,102,46,47,45,,,,,,,,,,,,,,,,,,', +',234,,,240,,,63,64,,,65,,,,,,49,,,,,,,,,239,,,,,99,87,90,91,,92,94,93', +'95,,,,,88,98,,,,79,80,81,67,62,89,103,104,68,69,43,44,,72,,70,71,73', +'322,323,77,78,,,,,,82,319,325,111,110,112,113,,,241,,,,,,,50,,,115,114', +'116,105,61,107,106,108,,109,117,118,,101,102,46,47,45,,,,,,,,,,,,,,', +',,,,,234,,,240,,,63,64,,,65,,,,,,49,,,,,,,,,239,,,,,99,87,90,91,,92', +'94,93,95,,,,,88,98,,,,,,,67,,89,103,104,,,43,44,79,80,81,11,62,,,,68', +'69,,,,72,,70,71,73,32,33,77,78,,,,,,82,30,29,111,110,112,113,,,21,,', +',,,10,50,,12,115,114,116,105,61,107,106,108,,109,117,118,,101,102,46', +'47,45,,,,,,,,,,,,,,,,,,,,42,,,35,,,63,64,,,65,,37,,,,49,,,,,,,,,22,', +',,,99,87,90,91,,92,94,93,95,,,,,88,98,,,,79,80,81,67,62,89,103,104,68', +'69,43,44,,72,,70,71,73,32,33,77,78,,,,,,82,30,29,111,110,112,113,,,241', +',,,,,,50,,,115,114,116,105,61,107,106,108,297,109,117,118,,101,102,46', +'47,45,,,,,,,,,,,,,,,,,,,,234,,,240,,,63,64,,,65,,294,,292,,49,,,298', +',,,,,239,,,,,99,295,90,91,,92,94,93,95,,,,,88,98,,,,79,80,81,67,62,89', +'103,104,68,69,43,44,,72,,70,71,73,32,33,77,78,,,,,,82,30,29,111,110', +'112,113,,,21,,,,,,,50,,,115,114,116,105,61,107,106,108,,109,117,118', +',101,102,46,47,45,,,,,,,,,,,,,,,,,,,,234,,,240,,,63,64,,,65,,,,,,49', +',,,,,,,,22,,,,,99,87,90,91,,92,94,93,95,,,,,88,98,,,,79,80,81,67,62', +'89,103,104,68,69,43,44,,72,,70,71,73,32,33,77,78,,,,,,82,30,29,111,110', +'112,113,,,21,,,,,,,50,,,115,114,116,105,61,107,106,108,,109,117,118', +',101,102,46,47,45,,,,,,,,,,,,,,,,,,,,234,,,240,,,63,64,,,65,,,,,,49', +',,,,,,,,22,,,,,99,87,90,91,,92,94,93,95,,,,,88,98,,,,79,80,81,67,62', +'89,103,104,68,69,43,44,,72,,70,71,73,322,323,77,78,,,,,,82,319,325,111', +'110,112,113,,,241,,,,,,,50,,,115,114,116,105,61,107,106,108,,109,117', +'118,,101,102,46,47,45,,,,,,,,,,,,,,,,,,,,234,,,240,,,63,64,,,65,,,,', +',49,,,,,,,,,239,,,,,99,87,90,91,,92,94,93,95,,,,,88,98,,,,79,80,81,67', +'62,89,103,104,68,69,43,44,,72,,70,71,73,322,323,77,78,,,,,,82,319,325', +'111,110,112,113,,,241,,,,,,,50,,,115,114,116,105,61,107,106,108,,109', +'117,118,,101,102,46,47,45,,,,,,,,,,,,,,,,,,,,234,,,240,542,,63,64,,', +'65,,,,,,49,,,,,,,,,239,,,,,99,87,90,91,,92,94,93,95,,,,,88,98,,,,79', +'80,81,67,62,89,103,104,68,69,43,44,,72,,70,71,73,32,33,77,78,,,,,,82', +'30,29,111,110,112,113,,,21,,,,,,,50,,,115,114,116,105,61,107,106,108', +',109,117,118,,101,102,46,47,45,,,,,,,,,,,,,,,,,,,,234,,,240,,,63,64', +',,65,,,,,,49,,,,,,,,,22,,,,,99,87,90,91,,92,94,93,95,,,,,88,98,,,,79', +'80,81,67,62,89,103,104,68,69,43,44,,72,,70,71,73,32,33,77,78,,,,,,82', +'30,29,111,110,112,113,,,21,,,,,,,50,,,115,114,116,105,61,107,106,108', +',109,117,118,,101,102,46,47,45,,,,,,,,,,,,,,,,,,,,234,,,240,,,63,64', +',,65,,,,,,49,,,,,,,,,22,,,,,99,87,90,91,,92,94,93,95,,,,,88,98,,,,79', +'80,81,67,62,89,103,104,68,69,43,44,,72,,70,71,73,32,33,77,78,,,,,,82', +'30,29,111,110,112,113,,,21,,,,,,,50,,,115,114,116,105,61,107,106,108', +',109,117,118,,101,102,46,47,45,,,,,,,,,,,,,,,,,,,,234,,,240,,,63,64', +',,65,,,,,,49,,,,,,,,,22,,,,,99,87,90,91,,92,94,93,95,,,,,88,98,,,,79', +'80,81,67,62,89,103,104,68,69,43,44,,72,,70,71,73,322,323,77,78,,,,,', +'82,319,325,111,110,112,113,,,241,,,,,,,50,,,115,114,116,105,61,107,106', +'108,,109,117,118,,101,102,46,47,45,,,,,,,,,,,,,,,,,,,,234,,,240,,,63', +'64,,,65,,,,,,49,,,,,,,,,239,,,,,99,87,90,91,,92,94,93,95,,,,,88,98,', +',,,,,67,,89,103,104,-260,,43,44,,,,-260,-260,-260,,,-260,-260,-260,', +'-260,,,,,,,,-260,-260,-260,-260,,,,,,,,,-260,-260,,-260,-260,-260,-260', +'-260,,,,,,,,,,,,,,,,,,,,,,,-260,-260,-260,-260,-260,-260,-260,-260,-260', +'-260,-260,-260,-260,-260,,,-260,-260,-260,,,-260,,276,-260,,,-260,-260', +',-260,,-260,,-260,,-260,-260,,-260,-260,-260,-260,-260,,-260,-260,-260', +'724,,721,720,719,729,722,,,,,,,-260,,732,-260,-260,-695,-260,,-260,', +',,-695,-695,-695,-260,,-695,-695,-695,,-695,,,727,,,,,-695,-695,-695', +'-695,-695,,740,739,,,,733,-695,-695,,-695,-695,-695,-695,-695,,,,,,', +',,,,,,,,,,,,,,,,-695,-695,-695,-695,-695,-695,-695,-695,-695,-695,-695', +'-695,-695,-695,,,-695,-695,-695,,,-695,,,-695,,,-695,-695,,-695,,-695', +',-695,,-695,-695,,-695,-695,-695,-695,-695,,-695,-695,-695,,,,,,,,,', +',,,,-695,,,-695,-695,-695,-695,,-695,-696,-695,,,,,-695,-696,-696,-696', +',,-696,-696,-696,,-696,,,,,,,,-696,-696,-696,-696,-696,,,,,,,,-696,-696', +',-696,-696,-696,-696,-696,,,,,,,,,,,,,,,,,,,,,,,-696,-696,-696,-696', +'-696,-696,-696,-696,-696,-696,-696,-696,-696,-696,,,-696,-696,-696,', +',-696,,,-696,,,-696,-696,,-696,,-696,,-696,,-696,-696,,-696,-696,-696', +'-696,-696,,-696,-696,-696,,,,,,,,,,,,,,-696,,,-696,-696,-696,-696,,-696', +',-696,,79,80,81,-696,62,,,,68,69,,,,72,,70,71,73,32,33,77,78,,,,,,82', +'30,29,111,110,112,113,,,241,,,,,,,50,,,115,114,116,105,61,107,106,108', +'297,109,117,118,,101,102,46,47,45,,,,,,,,,,,,,,,,,,,,234,,,240,,,63', +'64,,,65,,294,,292,,49,,,298,,,,,,239,,,,,99,295,90,91,,92,94,93,95,', +',,,88,98,,,,79,80,81,67,62,89,103,104,68,69,43,44,,72,,70,71,73,322', +'323,77,78,,,,,,82,319,325,111,110,112,113,,,241,,,,,,,50,,,115,114,116', +'105,61,107,106,108,,109,117,118,,101,102,46,47,45,,,,,,,,,,,,,,,,,,', +',234,,,240,,,63,64,,,65,,,,,,49,,,,,,,,,239,,,,,99,87,90,91,,92,94,93', +'95,,,,,88,98,,,,79,80,81,67,62,89,103,104,68,69,43,44,,72,,70,71,73', +'322,323,77,78,,,,,,82,319,325,111,110,112,113,,,241,,,,,,,50,,,115,114', +'116,105,61,107,106,108,,109,117,118,,101,102,46,47,45,,,,,,,,,,,,,,', +',,,,,234,,,240,,,63,64,,,65,,,,,,49,,,,,,,,,239,,,,,99,87,90,91,,92', +'94,93,95,,,,,88,98,,,,79,80,81,67,62,89,103,104,68,69,43,44,,72,,70', +'71,73,322,323,77,78,,,,,,82,319,325,111,110,112,113,,,241,,,,,,,50,', +',115,114,116,105,61,107,106,108,,109,117,118,,101,102,46,47,45,,,,,', +',,,,,,,,,,,,,,234,,,240,,,63,64,,,65,,,,,,49,,,,,,,,,239,,,,,99,87,90', +'91,,92,94,93,95,,,,,88,98,,,,,,,67,,89,103,104,-260,,43,44,,,,-260,-260', +'-260,,,-260,-260,-260,724,-260,721,720,719,729,722,,,-260,-260,-260', +',,,732,,,,,,-260,-260,,-260,-260,-260,-260,-260,,,,,,,,724,727,721,720', +'719,729,722,,,,737,736,740,739,,732,,733,,724,,721,720,719,729,722,-260', +',,,,,,-260,732,,,727,276,-260,,,,229,,,737,736,740,739,,,,733,,,727', +',,,,-260,-260,,,737,736,740,739,,,,733,,,,-260,,,-260,,79,80,81,-260', +'62,,,,68,69,-260,,,72,,70,71,73,322,323,77,78,,,,,,82,319,325,111,110', +'112,113,,,241,,,,,,,50,,,115,114,116,105,61,107,106,108,,109,117,118', +',101,102,46,47,45,,,,,,,,,,,,,,,,,,,,234,,,240,,,63,64,,,65,,,,,,49', +',,,,,,,,239,,,,,99,87,90,91,,92,94,93,95,,,,,88,98,,,,79,80,81,67,62', +'89,103,104,68,69,43,44,,72,,70,71,73,322,323,77,78,,,,,,82,319,325,111', +'110,112,113,,,241,,,,,,,50,,,115,114,116,105,61,107,106,108,297,109', +'117,118,,101,102,46,47,45,,,,,,,,,,,,,,,,,,,,234,,,240,,,63,64,,,65', +',681,,292,,49,,,298,,,,,,239,,,,,99,295,90,91,,92,94,93,95,,,,,88,98', +',,,79,80,81,67,62,89,103,104,68,69,43,44,,72,,70,71,73,322,323,77,78', +',,,,,82,319,325,111,110,112,113,,,241,,,,,,,50,,,115,114,116,105,61', +'107,106,108,297,109,117,118,,101,102,46,47,45,,,,,,,,,,,,,,,,,,,,234', +',,240,,,63,64,,,65,,,,292,,49,,,298,,,,,,239,,,,,99,295,90,91,,92,94', +'93,95,,,,,88,98,,,,79,80,81,67,62,89,103,104,68,69,43,44,,72,,70,71', +'73,322,323,77,78,,,,,,82,319,325,111,110,112,113,,,241,,,,,,,50,,,115', +'114,116,105,61,107,106,108,,109,117,118,,101,102,46,47,45,,,,,,,,,,', +',,,,,,,,,234,,,240,,,63,64,,,65,,,,,,49,,,,,,,,,239,,,,,99,87,90,91', +',92,94,93,95,,,,,88,98,,,,,,,67,,89,103,104,,,43,44,79,80,81,11,62,', +',,68,69,,,,72,,70,71,73,32,33,77,78,,,,,,82,30,29,111,110,112,113,,', +'21,,,,,,10,50,305,12,115,114,116,105,61,107,106,108,,109,117,118,,101', +'102,46,47,45,,,,,,,,,,,,,,,,,,,,42,,,35,,,63,64,,,65,,37,,,,49,,,,,', +',,,22,,,,,99,87,90,91,,92,94,93,95,,,,,88,98,,,,,,403,67,,89,103,104', +',,43,44,79,80,81,,62,,,,68,69,,,,72,,70,71,73,32,33,77,78,,,,,,82,30', +'29,111,110,112,113,,,241,,,,,,,50,,,115,114,116,105,61,107,106,108,297', +'109,117,118,,101,102,46,47,45,,,,,,,,,,,,,,,,,,,,234,,,240,,,63,64,', +',65,,294,,292,,49,,,298,,,,,,239,,,,,99,295,90,91,,92,94,93,95,,,,,88', +'98,,,,79,80,81,67,62,89,103,104,68,69,43,44,,72,,70,71,73,322,323,77', +'78,,,,,,82,319,325,111,110,112,113,,,241,,,,,,,50,,,115,114,116,105', +'61,107,106,108,,109,117,118,,101,102,46,47,45,,,,,,,,,,,,,,,,,,,,234', +',,240,,,63,64,,,65,,,,,,49,,,,,,,,,239,,,,,99,87,90,91,,92,94,93,95', +',,,,88,98,,,,79,80,81,67,62,89,103,104,68,69,43,44,,72,,70,71,73,322', +'323,77,78,,,,,,82,319,325,111,110,112,113,,,241,,,,,,,50,,,115,114,116', +'105,61,107,106,108,,109,117,118,,101,102,46,47,45,,,,,,,,,,,,,,,,,,', +',234,,,240,,,63,64,,,65,,,,,,49,,,,,,,,,239,,,,,99,87,90,91,,92,94,93', +'95,,,,,88,98,,,,79,80,81,67,62,89,103,104,68,69,43,44,,72,,70,71,73', +'32,33,77,78,,,,,,82,30,29,111,110,112,113,,,21,,,,,,,50,,,115,114,116', +'105,61,107,106,108,,109,117,118,,101,102,46,47,45,,,,,,,,,,,,,,,,,,', +',234,,,240,,,63,64,,,65,,,,,,49,,,,,,,,,22,,,,,99,87,90,91,,92,94,93', +'95,,,,,88,98,,,,79,80,81,67,62,89,103,104,68,69,43,44,,72,,70,71,73', +'322,323,77,78,,,,,,82,319,325,111,110,112,113,,,241,,,,,,,50,,,115,114', +'116,105,61,107,106,108,,109,117,118,,101,102,46,47,45,,,,,,,,,,,,,,', +',,,,,234,,,240,,,63,64,,,65,,,,,,49,,,,,,,,,239,,,,,99,87,90,91,,92', +'94,93,95,,,,,88,98,,,,79,80,81,67,62,89,103,104,68,69,43,44,,72,,70', +'71,73,322,323,77,78,,,,,,82,319,325,111,110,112,113,,,241,,,,,,,50,', +',115,114,116,105,61,107,106,108,297,109,117,118,,101,102,46,47,45,,', +',,,,,,,,,,,,,,,,,234,,,240,,,63,64,,,65,,681,,,,49,,,298,,,,,,239,,', +',,99,295,90,91,,92,94,93,95,,,,,88,98,,,,79,80,81,67,62,89,103,104,68', +'69,43,44,,72,,70,71,73,322,323,77,78,,,,,,82,319,325,111,110,112,113', +',,241,,,,,,,50,,,115,114,116,105,61,107,106,108,297,109,117,118,,101', +'102,46,47,45,,,,,,,,,,,,,,,,,,,,234,,,240,,,63,64,,,65,,,,,,49,,,298', +',,,,,239,,,,,99,295,90,91,,92,94,93,95,,,,,88,98,,,,79,80,81,67,62,89', +'103,104,68,69,43,44,,72,,70,71,73,322,323,77,78,,,,,,82,319,325,111', +'110,112,113,,,241,,,,,,,50,,,115,114,116,105,61,107,106,108,297,109', +'117,118,,101,102,46,47,45,,,,,,,,,,,,,,,,,,,,234,,,240,,,63,64,,,65', +',,,292,,49,,,298,,,,,,239,,,,,99,295,90,91,,92,94,93,95,,,,,88,98,,', +',79,80,81,67,62,89,103,104,68,69,43,44,,72,,70,71,73,322,323,77,78,', +',,,,82,319,325,111,110,112,113,,,241,,,,,,,50,,,115,114,116,105,61,107', +'106,108,,109,117,118,,101,102,46,47,45,,,,,,,,,,,,,,,,,,,,234,,,240', +',,63,64,,,65,,294,,,,49,,,,,,,,,239,,,,,99,87,90,91,,92,94,93,95,,,', +',88,98,,,,79,80,81,67,62,89,103,104,68,69,43,44,,72,,70,71,73,32,33', +'77,78,,,,,,82,30,29,111,110,112,113,,,241,,,,,,,50,,,115,114,116,105', +'61,107,106,108,297,109,117,118,,101,102,46,47,45,,,,,,,,,,,,,,,,,,,', +'234,,,240,,,63,64,,,65,,294,,292,,49,,,298,,,,,,239,,,,,99,295,90,91', +',92,94,93,95,,,,,88,98,,,,79,80,81,67,62,89,103,104,68,69,43,44,,72', +',70,71,73,32,33,77,78,,,,,,82,30,29,111,110,112,113,,,241,,,,,,,50,', +',115,114,116,105,61,107,106,108,297,109,117,118,,101,102,46,47,45,,', +',,,,,,,,,,,,,,,,,234,,,240,,,63,64,,,65,,294,,292,,49,,,298,,,,,,239', +',,,,99,295,90,91,,92,94,93,95,,,,,88,98,,,,79,80,81,67,62,89,103,104', +'68,69,43,44,,72,,70,71,73,322,323,77,78,,,,,,82,319,325,111,110,112', +'113,,,241,,,,,,,50,,,115,114,116,105,61,107,106,108,,109,117,118,,101', +'102,46,47,45,,,,,,,,,,,,,,,,,,,,234,,,240,,,63,64,,,65,,681,,,,49,,', +',,,,,,239,,,,,99,87,90,91,,92,94,93,95,,,,,88,98,,,,,,,67,,89,103,104', +',,43,44,79,80,81,11,62,,,,68,69,,,,72,,70,71,73,32,33,77,78,,,,,,82', +'30,29,111,110,112,113,,,21,,,,,,10,50,,12,115,114,116,105,61,107,106', +'108,,109,117,118,,101,102,46,47,45,,,,,,,,,,,,,,,,,,,,42,,,35,,,63,64', +',,65,,37,,,,49,,,,,,,,,22,,,,,99,87,90,91,,92,94,93,95,,,,,88,98,,,', +'79,80,81,67,62,89,103,104,68,69,43,44,,72,,70,71,73,322,323,77,78,,', +',,,82,319,325,111,110,112,113,,,241,,,,,,,50,,,115,114,116,105,61,107', +'106,108,,109,117,118,,101,102,46,47,45,,,,,,,,,,,,,,,,,,,,234,,,240', +',,63,64,,,65,,789,,,,49,,,,,,,,,239,,,,,99,87,90,91,,92,94,93,95,,,', +',88,98,,,,79,80,81,67,62,89,103,104,68,69,43,44,,72,,70,71,73,32,33', +'77,78,,,,,,82,30,29,111,110,112,113,,,241,,,,,,,50,,,115,114,116,105', +'61,107,106,108,,109,117,118,,101,102,46,47,45,,,,,,,,,,,,,,,,,,,,234', +',,240,,,63,64,,,65,,,,,,49,,,,,,,,,239,,,,,99,87,90,91,,92,94,93,95', +',,,,88,98,,,,79,80,81,67,62,89,103,104,68,69,43,44,,72,,70,71,73,32', +'33,77,78,,,,,,82,30,29,111,110,112,113,,,241,,,,,,,50,,,115,114,116', +'105,61,107,106,108,297,109,117,118,,101,102,46,47,45,,,,,,,,,,,,,,,', +',,,,234,,,240,,,63,64,,,65,,294,,292,,49,,,298,,,,,,239,,,,,99,295,90', +'91,,92,94,93,95,,,,,88,98,,,,,,,67,,89,103,104,,,43,44,79,80,81,11,62', +',,,68,69,,,,72,,70,71,73,32,33,77,78,,,,,,82,30,29,111,110,112,113,', +',21,,,,,,10,50,,12,115,114,116,105,61,107,106,108,,109,117,118,,101', +'102,46,47,45,,,,,,,,,,,,,,,,,,,,42,,,35,,,63,64,,,65,,37,,,,49,,,,,', +',,,22,,,,,99,87,90,91,,92,94,93,95,,,,,88,98,,,,79,80,81,67,62,89,103', +'104,68,69,43,44,,72,,70,71,73,322,323,77,78,,,,,,82,319,325,111,110', +'112,113,,,241,,,,,,,50,,,115,114,116,105,61,107,106,108,,109,117,118', +',101,102,46,47,45,,,,,,,,,,,,,,,,,,,,234,,,240,,,63,64,,,65,,,,,,49', +',,,,,,,,239,,,,,99,87,90,91,,92,94,93,95,,,,,88,98,,,,79,80,81,67,62', +'89,103,104,68,69,43,44,,72,,70,71,73,32,33,77,78,,,,,,82,30,29,111,110', +'112,113,,,21,,,,,,,50,,,115,114,116,105,61,107,106,108,,109,117,118', +',101,102,46,47,45,,,,,,,,,,,,,,,,,,,,234,,,240,,,63,64,,,65,,,,,,49', +',,,,,,,,22,,,,,99,87,90,91,,92,94,93,95,,,,,88,98,,,,79,80,81,67,62', +'89,103,104,68,69,43,44,,72,,70,71,73,322,323,77,78,,,,,,82,319,325,111', +'110,112,113,,,241,,,,,,,50,,,115,114,116,105,61,107,106,108,297,109', +'117,118,,101,102,46,47,45,,,,,,,,,,,,,,,,,,,,234,,,240,,,63,64,,,65', +',681,,292,,49,,,298,,,,,,239,,,,,99,295,90,91,,92,94,93,95,,,,,88,98', +',,,79,80,81,67,62,89,103,104,68,69,43,44,,72,,70,71,73,322,323,77,78', +',,,,,82,319,325,111,110,112,113,,,241,,,,,,,50,,,115,114,116,105,61', +'107,106,108,297,109,117,118,,101,102,46,47,45,,,,,,,,,,,,,,,,,,,,234', +',,240,,,63,64,,,65,,,,292,,49,,,298,,,,,,239,,,,,99,295,90,91,,92,94', +'93,95,,,,,88,98,,,,79,80,81,67,62,89,103,104,68,69,43,44,,72,,70,71', +'73,32,33,77,78,,,,,,82,30,29,111,110,112,113,,,241,,,,,,,50,,,115,114', +'116,105,61,107,106,108,,109,117,118,,101,102,46,47,45,,,,,,,,,,,,,,', +',,,,,234,,,240,,,63,64,,,65,,,,,,49,,,,,,,,,239,,,,,99,87,90,91,,92', +'94,93,95,,,,,88,98,,,,79,80,81,67,62,89,103,104,68,69,43,44,,72,,70', +'71,73,32,33,77,78,,,,,,82,30,29,111,110,112,113,,,241,,,,,,,50,,,115', +'114,116,105,61,107,106,108,,109,117,118,,101,102,46,47,45,,,,,,,,,,', +',,,,,,,,,234,,,240,,,63,64,,,65,,,,,,49,,,,,,,,,239,,,,,99,87,90,91', +',92,94,93,95,,,,,88,98,,,,79,80,81,67,62,89,103,104,68,69,43,44,,72', +',70,71,73,32,33,77,78,,,,,,82,30,29,111,110,112,113,,,241,,,,,,,50,', +',115,114,116,105,61,107,106,108,,109,117,118,,101,102,46,47,45,,,,,', +',,,,,,,,,,,,,,234,,,240,,,63,64,,,65,,,,,,49,,,,,,,,,239,,,,,99,87,90', +'91,,92,94,93,95,,,,,88,98,,,,79,80,81,67,62,89,103,104,68,69,43,44,', +'72,,70,71,73,32,33,77,78,,,,,,82,30,29,111,110,112,113,,,241,,,,,,,50', +',,115,114,116,105,61,107,106,108,,109,117,118,,101,102,46,47,45,,,,', +',,,,,,,,,,,,,,,234,,,240,,,63,64,,,65,,,,,,49,,,,,,,,,239,,,,,99,87', +'90,91,,92,94,93,95,,,,,88,98,,,,79,80,81,67,62,89,103,104,68,69,43,44', +',72,,70,71,73,322,323,77,78,,,,,,82,319,325,111,110,112,113,,,241,,', +',,,,50,,,115,114,116,105,61,107,106,108,,109,117,118,,101,102,46,47', +'45,,,,,,,,,,,,,,,,,,,,234,,,240,,,63,64,,,65,,,,,,49,,,,,,,,,239,,,', +',99,87,90,91,,92,94,93,95,,,,,88,98,,,,79,80,81,67,62,89,103,104,68', +'69,43,44,,72,,70,71,73,322,323,77,78,,,,,,82,319,325,111,110,112,113', +',,241,,,,,,,50,,,115,114,116,105,61,107,106,108,297,109,117,118,,101', +'102,46,47,45,,,,,,,,,,,,,,,,,,,,234,,,240,,,63,64,,,65,,681,,292,,49', +',,298,,,,,,239,,,,,99,295,90,91,,92,94,93,95,,,,,88,98,,,,79,80,81,67', +'62,89,103,104,68,69,43,497,,72,,70,71,73,322,323,77,78,,,,,,82,319,325', +'111,110,112,113,,,241,,,,,,,50,,,115,114,116,105,61,107,106,108,,109', +'117,118,,101,102,46,47,45,,,,,,,,,,,,,,,,,,,,234,,,240,,,63,64,,,65', +',,,,,49,,,,,,,,,239,,,,,99,87,90,91,,92,94,93,95,,,,,88,98,,,,79,80', +'81,67,62,89,103,104,68,69,43,44,,72,,70,71,73,322,323,77,78,,,,,,82', +'319,325,111,110,112,113,,,241,,,,,,,50,,,115,114,116,105,61,107,106', +'108,,109,117,118,,101,102,46,47,45,,,,,,,,,,,,,,,,,,,,234,,,240,,,63', +'64,,,65,,,,,,49,,,,,,,,,239,,,,,99,87,90,91,,92,94,93,95,,,,,88,98,', +',,79,80,81,67,62,89,103,104,68,69,43,44,,72,,70,71,73,322,323,77,78', +',,,,,82,319,325,111,110,112,113,,,241,,,,,,,50,,,115,114,116,105,61', +'107,106,108,,109,117,118,,101,102,46,47,45,,,,,,,,,,,,,,,,,,,,234,,', +'240,,,63,64,,,65,,,,,,49,,,,,,,,,239,,,,,99,87,90,91,,92,94,93,95,,', +',,88,98,,,,79,80,81,67,62,89,103,104,68,69,43,44,,72,,70,71,73,322,323', +'77,78,,,,,,82,319,325,111,110,112,113,,,241,,,,,,,50,,,115,114,116,105', +'61,107,106,108,,109,117,118,,101,102,46,47,45,,,,,,,,,,,,,,,,,,,,234', +',,240,,,63,64,,,65,,419,,,,49,,,,,,,,,239,,,,,99,87,90,91,,92,94,93', +'95,,,,,88,98,,,,79,80,81,67,62,89,103,104,68,69,43,44,,72,,70,71,73', +'322,323,77,78,,,,,,82,319,325,111,110,112,113,,,241,,,,,,,50,,,115,114', +'116,105,61,107,106,108,,109,117,118,,101,102,46,47,45,,,,,,,,,,,,,,', +',,,,,234,,,240,,,63,64,,,65,,,,,,49,,,,,,,,,239,,,,,99,87,90,91,,92', +'94,93,95,,,,,88,98,,,,79,80,81,67,62,89,103,104,68,69,43,44,,72,,70', +'71,73,322,323,77,78,,,,,,82,319,325,111,110,112,113,,,241,,,,,,,50,', +',115,114,116,105,61,107,106,108,,109,117,118,,101,102,46,47,45,,,,,', +',,,,,,,,,,,,,,234,,,240,,,63,64,,,65,,,,,,49,,,,,,,,,239,,,,,99,87,90', +'91,,92,94,93,95,,,,,88,98,,,,79,80,81,67,62,89,103,104,68,69,43,44,', +'72,,70,71,73,322,323,77,78,,,,,,82,319,325,111,110,112,113,,,241,,,', +',,,50,,,115,114,116,105,61,107,106,108,,109,117,118,,101,102,46,47,45', +',,,,,,,,,,,,,,,,,,,234,,,240,,,63,64,,,65,,,,,,49,,,,,,,,,239,,,,,99', +'87,90,91,,92,94,93,95,,,,,88,98,,,,79,80,81,67,62,89,103,104,68,69,43', +'44,,72,,70,71,73,322,323,77,78,,,,,,82,319,325,111,110,112,113,,,241', +',,,,,,50,,,115,114,116,105,61,107,106,108,,109,117,118,,101,102,46,47', +'45,,,,,,,,,,,,,,,,,,,,234,,,240,,,63,64,,,65,,,,,,49,,,,,,,,,239,,,', +',99,87,90,91,,92,94,93,95,,,,,88,98,,,,79,80,81,67,62,89,103,104,68', +'69,43,44,,72,,70,71,73,322,323,77,78,,,,,,82,319,325,111,110,112,113', +',,241,,,,,,,50,,,115,114,116,105,61,107,106,108,,109,117,118,,101,102', +'46,47,45,,,,,,,,,,,,,,,,,,,,234,,,240,,,63,64,,,65,,,,,,49,,,,,,,,,239', +',,,,99,87,90,91,,92,94,93,95,,,,,88,98,,,,79,80,81,67,62,89,103,104', +'68,69,43,44,,72,,70,71,73,32,33,77,78,,,,,,82,30,29,111,110,112,113', +',,241,,,,,,,50,,,115,114,116,105,61,107,106,108,,109,117,118,,101,102', +'46,47,45,,,,,,,,,,,,,,,,,,,,234,,,240,,,63,64,,,65,,,,,,49,,,,,,,,,239', +',,,,99,87,90,91,,92,94,93,95,,,,,88,98,,,,79,80,81,67,62,89,103,104', +'68,69,43,44,,72,,70,71,73,322,323,77,78,,,,,,82,319,325,111,110,112', +'113,,,241,,,,,,,50,,,115,114,116,105,61,107,106,108,,109,117,118,,101', +'102,46,47,45,,,,,,,,,,,,,,,,,,,,234,,,240,,,63,64,,,65,,,,,,49,,,,,', +',,,239,,,,,99,87,90,91,,92,94,93,95,,,,,88,98,,,,79,80,81,67,62,89,103', +'104,68,69,43,44,,72,,70,71,73,322,323,77,78,,,,,,82,319,325,111,110', +'112,113,,,241,,,,,,,320,,,115,114,116,369,61,107,106,370,,109,117,118', +',101,102,,,326,,,,,,,,,,,,,,,,,376,,,371,,,240,,,63,64,,,65,,,,,,,,', +',,,,,,,,,,,99,87,90,91,,92,94,93,95,,,,,88,98,,,,79,80,81,67,62,89,103', +'104,68,69,,,,72,,70,71,73,322,323,77,78,,,,,,82,319,325,111,110,112', +'113,,,241,,,,,,,320,,,115,114,116,105,61,107,106,108,,109,117,118,,101', +'102,,,326,,,,,,,,,,,,,,,,,,,,364,,,35,,,63,64,,,65,,37,,,,,,,,,,,,,', +',,,,99,87,90,91,,92,94,93,95,,,,,88,98,,,,79,80,81,67,62,89,103,104', +'68,69,,,,72,,70,71,73,322,323,77,78,,,,,,82,319,325,111,110,112,113', +',,241,,,,,,,320,,,115,114,116,105,61,107,106,108,,109,117,118,,101,102', +',,326,,,,,,,,,,,,,,,,,,,,316,,,312,,,63,64,,,65,,,,,,,,,,,,,,,,,,,,99', +'87,90,91,,92,94,93,95,,,,,88,98,,,,79,80,81,67,62,89,103,104,68,69,', +',,72,,70,71,73,322,323,77,78,,,,,,82,319,325,111,110,112,113,,,241,', +',,,,,320,,,115,114,116,105,61,107,106,108,,109,117,118,,101,102,,,326', +',,,,,,,,,,,,,,,,,,,316,,,312,,,63,64,,,65,,,,,,,,,,,,,,,,,,,,99,87,90', +'91,,92,94,93,95,,,,,88,98,,,,79,80,81,67,62,89,103,104,68,69,,,,72,', +'70,71,73,322,323,77,78,,,,,,82,319,325,111,110,112,113,,,241,,,,,,,320', +',,115,114,116,105,61,107,106,108,,109,117,118,,101,102,,,326,,,,,,,', +',,,,,,,,,,,,316,,,312,,,63,64,,,65,,,,,,,,,,,,,,,,,,,,99,87,90,91,,92', +'94,93,95,,,,,88,98,,,,79,80,81,67,62,89,103,104,68,69,,,,72,,70,71,73', +'322,323,77,78,,,,,,82,319,325,111,110,112,113,,,241,,,,,,,320,,,115', +'114,116,105,61,107,106,108,,109,117,118,,101,102,,,326,,,,,,,,,,,,,', +',,,,,,316,,,240,,,63,64,,,65,,,724,,721,720,719,729,722,,,,,,,,,732', +',99,87,90,91,,92,94,93,95,,,,,88,98,,,,525,,727,67,,89,103,104,79,80', +'81,,62,740,739,,68,69,733,,,72,,70,71,73,322,323,77,78,,,,,,82,319,325', +'111,110,112,113,,,241,,,,,,,320,,,115,114,116,369,61,107,106,370,,109', +'117,118,,101,102,,,326,,,,,,,,,,,,,,,,,,,,371,,,240,,,63,64,,,65,,,', +',,,,,,,,,,,,,,,,99,87,90,91,,92,94,93,95,,,,,88,98,,,,79,80,81,67,62', +'89,103,104,68,69,,,,72,,70,71,73,322,323,77,78,,,,,,82,319,325,111,110', +'112,113,,,241,,,,,,,320,,,115,114,116,105,61,107,106,108,,109,117,118', +',101,102,,,326,,,,,,,,,,,,,,,,,,,,316,,,240,,,63,64,,,65,,,724,,721', +'720,719,729,722,,,,,,,,,732,,99,87,90,91,,92,94,93,95,,,,,88,98,,,,328', +',727,67,,89,103,104,79,80,81,,62,740,739,,68,69,733,,,72,,70,71,73,322', +'323,77,78,,,,,,82,319,325,111,110,112,113,,,241,,,,,,,320,,,115,114', +'116,105,61,107,106,108,,109,117,118,,101,102,,,326,,,,,,,,,,,,,,,,,', +',,1061,,,240,,,63,64,,,65,,,,,,,,,,,,,,,,,,,,99,87,90,91,,92,94,93,95', +',,,,88,98,,,,79,80,81,67,62,89,103,104,68,69,,,,72,,70,71,73,322,323', +'77,78,,,,,,82,319,325,111,110,112,113,,,241,,,,,,,320,,,115,114,116', +'105,61,107,106,108,,109,117,118,,101,102,,,326,,,,,,,,,,,,,,,,,,,,1055', +',,240,,,63,64,,,65,,,,,,,,,,,,,,,,,,,,99,87,90,91,,92,94,93,95,,,,,88', +'98,,,,79,80,81,67,62,89,103,104,68,69,,,,72,,70,71,73,322,323,77,78', +',,,,,82,319,325,111,110,112,113,,,241,,,,,,,320,,,115,114,116,105,61', +'107,106,108,,109,117,118,,101,102,,,326,,,,,,,,,,,,,,,,,,,,316,,,312', +',,63,64,,,65,,311,,,,,,,,,,,,,,,,,,99,87,90,91,,92,94,93,95,,,,,88,98', +',,,79,80,81,67,62,89,103,104,68,69,,,,72,,70,71,73,322,323,77,78,,,', +',,82,319,325,111,110,112,113,,,241,,,,,,,320,,,115,114,116,105,61,107', +'106,108,,109,117,118,,101,102,,,326,,,,,,,,,,,,,,,,,,,,316,,,312,,,63', +'64,,,65,,,,,,,,,,,,,,,,,,,,99,87,90,91,,92,94,93,95,,,,,88,98,,,,79', +'80,81,67,62,89,103,104,68,69,,,,72,,70,71,73,322,323,77,78,,,,,,82,319', +'325,111,110,112,113,,,241,,,,,,,320,,,115,114,116,105,61,107,106,108', +',109,117,118,,101,102,,,326,,,,,,,,,,,,,,,,,,,,1055,,,240,,,63,64,,', +'65,,,,,,,,,,,,,,,,,,,,99,87,90,91,,92,94,93,95,,,,,88,98,,,,79,80,81', +'67,62,89,103,104,68,69,,,,72,,70,71,73,322,323,77,78,,,,,,82,319,325', +'111,110,112,113,,,241,,,,,,,320,,,115,114,116,105,61,107,106,108,,109', +'117,118,,101,102,,,326,,,,,,,,,,,,,,,,,,,,316,,,312,,,63,64,,,65,,,', +',,,,,,,,,,,,,,,,99,87,90,91,,92,94,93,95,,,,,88,98,,,,,,,67,,89,103', +'104,182,193,183,206,179,199,189,188,209,210,204,187,186,181,207,211', +'212,191,180,194,198,200,192,185,,,,201,208,203,202,195,205,190,178,197', +'196,,,,,,177,184,175,176,172,173,174,135,137,,,136,,,,,,,,166,167,,163', +'145,146,147,154,151,153,,,148,149,,,,168,169,155,156,,,,,,,,,,,,,,160', +'159,,144,165,162,161,170,157,158,152,150,142,164,143,,,171,99,,,,,,', +',,,,,,,98,182,193,183,206,179,199,189,188,209,210,204,187,186,181,207', +'211,212,191,180,194,198,200,192,185,,,,201,208,203,202,195,205,190,178', +'197,196,,,,,,177,184,175,176,172,173,174,135,137,,,136,,,,,,,,166,167', +',163,145,146,147,154,151,153,,,148,149,,,,168,169,155,156,,,,,,,,,,', +',,,160,159,,144,165,162,161,170,157,158,152,150,142,164,143,,,171,99', +',,,,,,,,,,,,,98,182,193,183,206,179,199,189,188,209,210,204,187,186', +'181,207,211,212,191,180,194,198,200,192,185,,,,201,208,203,202,195,205', +'190,178,197,196,,,,,,177,184,175,176,172,173,174,135,137,,,136,,,,,', +',,166,167,,163,145,146,147,154,151,153,,,148,149,,,,168,169,155,156', +',,,,,,,,,,,,,160,159,,144,165,162,161,170,157,158,152,150,142,164,143', +',,171,99,,,,,,,,,,,,,,98,182,193,183,206,179,199,189,188,209,210,204', +'187,186,181,207,211,212,191,180,194,198,200,192,185,,,,201,208,203,202', +'195,205,190,178,197,196,,,,,,177,184,175,176,172,173,174,135,137,134', +',136,,,,,,,,166,167,,163,145,146,147,154,151,153,,,148,149,,,,168,169', +'155,156,,,,,,,,,,,,,,160,159,,144,165,162,161,170,157,158,152,150,142', +'164,143,,,171,99,111,110,112,113,,,,,,,,,,98,,,115,114,116,661,,,724', +'664,721,720,719,729,722,101,102,,,326,,,,732,,,,,,,,,,,,,,,,663,,,645', +',,727,643,,,644,,,,,737,736,740,739,,,,733,,,,662,,,,99,87,90,91,,92', +'94,93,95,,,,,88,98,111,110,112,113,,,660,,89,103,104,,,649,650,,115', +'114,116,661,,,,664,935,,,,,101,102,,,326,732,,,,,,,,,,,,,,,,,,,663,', +',645,,,,643,,,644,,929,,,,,,,733,,,,,,,662,,,,99,936,90,91,,92,94,93', +'95,,,,,88,98,,,,,,,660,,89,103,104,,,649,650,182,193,183,206,179,199', +'189,188,209,210,204,187,186,181,207,211,212,191,180,194,198,200,192', +'185,,,,201,208,203,202,195,205,190,178,197,196,,,,,,177,184,175,176', +'172,173,174,135,137,,,136,,,,,,,,166,167,,163,145,146,147,154,151,153', +',,148,149,,,,168,169,155,156,,,,,,,,,,,,,,160,159,,144,165,162,161,170', +'157,158,152,150,142,164,143,,,171,111,110,112,113,,,724,,721,720,719', +'729,722,,,,115,114,116,661,,732,,664,,,,,,101,102,,,326,,,,,,,,,,727', +',,,,,,,,,663,740,739,645,,,733,643,,,644,,,,,,,,,,,,,,,,662,,,,99,87', +'90,91,,92,94,93,95,,,,,88,98,111,110,112,113,,,660,,89,103,104,,,649', +'650,,115,114,116,661,,,,664,935,,,,,101,102,,,326,732,,,,,,,,,,,,,,', +',,,,663,,,645,,,,643,,,644,,929,,,,,,,733,,,,,,,662,,,,99,936,90,91', +',92,94,93,95,,,,,88,98,111,110,112,113,,,660,,89,103,104,,,649,650,', +'115,114,116,661,,,724,664,721,720,719,729,722,101,102,,,326,,,,732,', +',,,,,,,,,,,,,,663,,,645,,,727,643,,,644,,,,,737,736,740,739,,,,733,', +',,662,,,,99,87,90,91,,92,94,93,95,,,,,88,98,111,110,112,113,,,660,,89', +'103,104,,,649,650,,115,114,116,661,,,724,664,721,720,719,729,722,101', +'102,,,326,,,,732,,,,,,,,,,,,,,,,663,,,645,,,727,643,,,644,,929,,,737', +'736,740,739,,,,733,,,,662,,,,99,87,90,91,,92,94,93,95,,,,,88,98,111', +'110,112,113,,,660,,89,103,104,,,649,650,,115,114,116,661,,,724,664,721', +'720,719,729,722,101,102,,,326,,,,732,,,,,,,,,,,,,,,,663,,,645,,,727', +'643,,,644,,,,,737,736,740,739,,,,733,,,,662,,,,99,87,90,91,,92,94,93', +'95,,,,,88,98,111,110,112,113,,,660,,89,103,104,,,649,650,,115,114,116', +'661,,,724,664,721,720,719,729,722,101,102,,,326,,,,732,,,,,,,,,,,,,', +',,663,,,645,,,727,643,,,644,,,,,,,740,739,,,,733,,,,662,,,,99,87,90', +'91,,92,94,93,95,,,,,88,98,111,110,112,113,,,660,,89,103,104,,,649,650', +',115,114,116,661,,,724,664,721,720,719,729,722,101,102,,,326,,,,732', +',,,,,,,,,,,,,,,663,,,645,,,727,643,,,644,,929,,,,,740,739,,,,733,,,', +'662,,,,99,87,90,91,,92,94,93,95,,,,,88,98,,,,,,,660,,89,103,104,,,649', +'650,182,193,183,206,179,199,189,188,209,210,204,187,186,181,207,211', +'212,191,180,194,198,200,192,185,,,,201,208,203,387,386,388,385,178,197', +'196,,,,,,177,184,175,176,382,383,384,380,137,107,106,381,,109,,,,,,166', +'167,,163,145,146,147,154,151,153,,,148,149,,,,168,169,155,156,,,,,,392', +',,,,,,,160,159,,144,165,162,161,170,157,158,152,150,142,164,143,,,171', +'111,110,112,113,,,724,,721,720,719,729,722,,,,115,114,116,661,,732,', +'664,,,,,,101,102,,,326,,,,,,,,,,727,,,,,,,,,,663,740,739,645,,,733,643', +',,644,,,,,,,,,,,,,,,,662,,,,99,87,90,91,,92,94,93,95,,,,,88,98,111,110', +'112,113,,,660,,89,103,104,,,649,650,,115,114,116,661,,,,664,935,,,,', +'101,102,,,326,732,,,,,,,,,,,,,,,,,,,663,,,645,,,,643,,,644,,929,,,,', +',,733,,,,,,,662,,,,99,936,90,91,,92,94,93,95,,,,,88,98,111,110,112,113', +',,660,,89,103,104,,,649,650,,115,114,116,661,,,724,664,721,720,719,729', +'722,101,102,,,326,,,,732,,,,,,,,,,,,,,,,663,,,645,,,727,643,,,644,,', +',,,,740,739,,,,733,,,,662,,,,99,87,90,91,,92,94,93,95,,,,,88,98,111', +'110,112,113,,,660,,89,103,104,,,649,650,,115,114,116,661,,,724,664,721', +'720,719,729,722,101,102,,,326,,,,732,,,,,,,,,,,,,,,,663,,,645,,,727', +'643,,,644,,,,,737,736,740,739,,,,733,,,,662,,,,99,87,90,91,,92,94,93', +'95,,,,,88,98,111,110,112,113,,,660,,89,103,104,,,649,650,,115,114,116', +'661,,,724,664,721,720,719,729,722,101,102,,,326,,,,732,,,,,,,,,,,,,', +',,663,,,645,,,727,643,,,644,,,,,,,740,739,,,,733,,,,662,,,,99,87,90', +'91,,92,94,93,95,,,,,88,98,111,110,112,113,,,660,,89,103,104,,,649,650', +',115,114,116,661,,,,664,,,,,,101,102,,,326,,,,,,,,111,110,112,113,,', +',,,,,,663,,,645,115,114,116,643,,,644,,1024,,,,,101,102,,,326,,,,,662', +',,,99,87,90,91,,92,94,93,95,,,,,88,98,,,,,,,660,,89,103,104,,,649,650', +'724,,721,720,719,729,722,,,,,99,87,90,91,732,92,94,93,95,,,,,88,98,111', +'110,112,113,,,660,,89,103,104,727,709,,,,115,114,116,,737,736,740,739', +',,,733,,101,102,,,326,111,110,112,113,,,,,,,,,,,,,115,114,116,,,,,,', +',,,,101,102,,,326,,,,,,,,,,,,,,,,99,87,90,91,,92,94,93,95,,,,,88,98', +',,,,,,660,,89,103,104,,,,,,,,,99,87,90,91,,92,94,93,95,,,,,88,98,1161', +'452,,,1162,,660,,89,103,104,,166,167,,163,145,146,147,154,151,153,,', +'148,149,,,,168,169,155,156,,,,,,276,,,,,,,,160,159,,144,165,162,161', +'170,157,158,152,150,142,164,143,1159,445,171,,1160,,,,,,,,166,167,,163', +'145,146,147,154,151,153,,,148,149,,,,168,169,155,156,,,,,,276,,,,,,', +',160,159,,144,165,162,161,170,157,158,152,150,142,164,143,694,452,171', +',695,,,,,,,,166,167,,163,145,146,147,154,151,153,,,148,149,,,,168,169', +'155,156,,,,,,276,,,,,,,,160,159,,144,165,162,161,170,157,158,152,150', +'142,164,143,1156,452,171,,1155,,,,,,,,166,167,,163,145,146,147,154,151', +'153,,,148,149,,,,168,169,155,156,,,,,,276,,,,,,,,160,159,,144,165,162', +'161,170,157,158,152,150,142,164,143,634,452,171,,635,,,,,,,,166,167', +',163,145,146,147,154,151,153,,,148,149,,,,168,169,155,156,,,,,,276,', +',,,,,,160,159,,144,165,162,161,170,157,158,152,150,142,164,143,632,445', +'171,,633,,,,,,,,166,167,,163,145,146,147,154,151,153,,,148,149,,,,168', +'169,155,156,,,,,,276,,,,,,,,160,159,,144,165,162,161,170,157,158,152', +'150,142,164,143,448,452,171,,447,,,,,,,,166,167,,163,145,146,147,154', +'151,153,,,148,149,,,,168,169,155,156,,,,,,276,,,,,,,,160,159,,144,165', +'162,161,170,157,158,152,150,142,164,143,441,445,171,,442,,,,,,,,166', +'167,,163,145,146,147,154,151,153,,,148,149,,,,168,169,155,156,,,,,,276', +',,,,,,,160,159,,144,165,162,161,170,157,158,152,150,142,164,143,634', +'452,171,,635,,,,,,,,166,167,,163,145,146,147,154,151,153,,,148,149,', +',,168,169,155,156,,,,,,276,,,,,,,,160,159,,144,165,162,161,170,157,158', +'152,150,142,164,143,756,445,171,,757,,,,,,,,166,167,,163,145,146,147', +'154,151,153,,,148,149,,,,168,169,155,156,,,,,,276,,,,,,,,160,159,,144', +'165,162,161,170,157,158,152,150,142,164,143,758,452,171,,759,,,,,,,', +'166,167,,163,145,146,147,154,151,153,,,148,149,,,,168,169,155,156,,', +',,,276,,,,,,,,160,159,,144,165,162,161,170,157,158,152,150,142,164,143', +'632,445,171,,633,,,,,,,,166,167,,163,145,146,147,154,151,153,,,148,149', +',,,168,169,155,156,,,,,,276,,,,,,,,160,159,,144,165,162,161,170,157', +'158,152,150,142,164,143,794,452,171,,793,,,,,,,,166,167,,163,145,146', +'147,154,151,153,,,148,149,,,,168,169,155,156,,,,,,276,,,,,,,,160,159', +',144,165,162,161,170,157,158,152,150,142,164,143,493,445,171,,494,,', +',,,,,166,167,,163,145,146,147,154,151,153,,,148,149,,,,168,169,155,156', +',,,,,,,,,,,,,160,159,,144,165,162,161,170,157,158,152,150,142,164,143', +'761,452,171,,762,,,,,,,,166,167,,163,145,146,147,154,151,153,,,148,149', +',,,168,169,155,156,,,,,,276,,,,,,,,160,159,,144,165,162,161,170,157', +'158,152,150,142,164,143,493,445,171,,494,,,,,,,,166,167,,163,145,146', +'147,154,151,153,,,148,149,,,,168,169,155,156,,,,,,276,,,,,,,,160,159', +',144,165,162,161,170,157,158,152,150,142,164,143,791,445,171,,792,,', +',,,,,166,167,,163,145,146,147,154,151,153,,,148,149,,,,168,169,155,156', +',,,,,276,,,,,,,,160,159,,144,165,162,161,170,157,158,152,150,142,164', +'143,691,445,171,,692,,,,,,,,166,167,,163,145,146,147,154,151,153,,,148', +'149,,,,168,169,155,156,,,,,,276,,,,,,,,160,159,,144,165,162,161,170', +'157,158,152,150,142,164,143,,724,171,721,720,719,729,722,,724,,721,720', +'719,729,722,732,,,,,,,,732,,,,,,,,,,,,,,727,,,,,,,,727,,,740,739,,,', +'733,737,736,740,739,,,,733' ] + racc_action_table = arr = ::Array.new(27375, nil) + idx = 0 + clist.each do |str| + str.split(',', -1).each do |i| + arr[idx] = i.to_i unless i.empty? + idx += 1 + end + end + +clist = [ +'635,754,1123,1162,463,1160,361,635,635,635,66,354,635,635,635,817,635', +'669,1181,21,1062,945,457,457,635,738,635,635,635,399,1024,1059,929,400', +'1172,362,635,635,353,635,635,635,635,635,1172,380,701,701,365,799,1058', +'1000,380,759,973,817,584,584,792,726,21,863,756,463,945,1002,635,635', +'635,635,635,635,635,635,635,635,635,635,635,635,1162,1161,635,635,635', +'757,635,635,898,570,635,561,717,635,635,399,635,66,635,400,635,1159', +'635,635,669,635,635,635,635,635,380,635,1024,635,929,361,457,792,759', +'754,1123,1162,754,1160,754,1123,1162,635,1160,354,635,635,635,635,354', +'635,1181,635,1062,634,701,1181,635,1062,362,635,634,634,634,1059,584', +'634,634,634,1059,634,353,365,1161,716,643,353,759,634,634,634,634,634', +'1058,1000,863,756,973,1058,1000,634,634,973,634,634,634,634,634,1002', +'45,45,715,852,1002,691,28,692,321,564,757,561,643,898,570,1161,561,564', +'758,1004,1161,634,634,634,634,634,634,634,634,634,634,634,634,634,634', +'1159,734,634,634,634,1159,634,634,923,818,634,580,580,634,634,713,634', +'381,634,734,634,914,634,634,381,634,634,634,634,634,1004,634,634,634', +'852,28,691,321,692,1037,326,326,694,45,45,818,937,634,758,597,634,634', +'634,634,923,634,382,634,28,108,321,815,634,382,937,634,108,108,108,352', +'352,108,108,108,852,108,691,852,692,691,914,692,381,108,663,108,108', +'108,663,852,712,691,758,692,85,108,108,711,108,108,108,108,108,1037', +'1037,580,85,694,694,398,580,821,702,597,597,821,85,383,326,326,1037', +'382,632,597,383,108,108,108,108,108,108,108,108,108,108,108,108,108', +'108,700,1060,108,108,108,426,108,108,1060,694,108,232,694,108,108,513', +'108,1060,108,595,108,697,108,108,694,108,108,108,108,108,384,108,105', +'108,398,398,398,384,233,105,105,105,632,383,105,105,105,108,105,5,108', +'108,108,108,5,108,105,108,105,105,105,235,108,371,426,108,1060,371,105', +'105,232,105,105,105,105,105,696,644,686,513,513,513,396,595,595,1030', +'345,301,395,345,686,394,301,595,644,384,513,233,105,105,105,105,105', +'105,105,105,105,105,105,105,105,105,693,330,105,105,105,401,105,105', +'235,1008,105,1008,397,105,105,814,105,385,105,690,105,791,105,105,385', +'105,105,105,105,105,633,105,40,105,396,396,396,1030,1030,1030,395,395', +'395,394,394,394,826,105,330,386,105,105,105,105,1030,105,386,105,41', +'448,330,344,105,688,344,105,448,448,448,401,401,401,448,448,814,448', +'397,397,397,40,791,363,385,448,448,387,388,348,363,633,348,40,387,388', +'680,448,448,363,448,448,448,448,448,707,678,41,707,770,373,770,770,770', +'770,770,386,373,390,41,1112,16,16,1112,770,390,373,448,448,448,448,448', +'448,448,448,448,448,448,448,448,448,761,441,448,448,448,770,448,363', +'646,646,448,387,388,448,770,770,770,770,448,902,448,770,448,448,902', +'448,448,448,448,448,447,448,448,448,373,1003,1003,447,447,447,48,48', +'390,447,447,676,447,448,441,838,448,448,761,448,447,448,26,742,742,761', +'441,770,448,26,761,448,447,447,761,447,447,447,447,447,841,442,48,48', +'1015,1054,1015,1015,1015,1015,1015,642,1054,761,868,868,642,1132,1132', +'1015,642,1054,447,447,447,447,447,447,447,447,447,447,447,447,447,447', +'370,19,447,447,447,1015,447,761,842,675,447,26,442,447,1015,1015,1015', +'1015,447,674,447,1015,447,447,442,447,447,447,447,447,793,447,1028,447', +'1054,134,851,793,793,793,134,134,1028,793,793,668,793,447,19,855,447', +'447,370,447,793,447,666,471,910,370,19,1015,447,910,370,447,793,793', +'370,793,793,793,793,793,858,425,358,859,665,530,1028,358,425,864,662', +'639,530,370,637,471,636,425,1028,471,471,530,793,793,793,793,793,793', +'793,793,793,793,793,793,793,793,628,824,793,793,793,695,793,370,880', +'881,793,824,695,793,623,883,889,695,793,617,793,695,793,793,618,793', +'793,793,793,793,425,793,794,793,530,892,609,602,600,794,794,794,865', +'592,899,794,794,793,794,824,793,793,865,793,901,793,794,794,582,470', +'565,824,793,905,906,793,617,907,794,794,695,794,794,794,794,794,908', +'18,617,563,912,573,913,562,18,865,865,558,573,546,865,470,545,18,924', +'470,470,573,794,794,794,794,794,794,794,794,794,794,794,794,794,794', +'925,544,794,794,794,928,794,543,231,930,794,534,531,794,938,231,939', +'941,794,942,794,526,794,794,231,794,794,794,794,794,18,794,794,794,573', +'1052,762,1052,1052,1052,524,1052,1116,762,521,953,954,794,762,1116,794', +'794,762,794,955,794,51,957,1116,958,959,961,794,51,962,794,903,903,903', +'903,903,903,51,231,963,903,903,964,520,504,903,369,903,903,903,903,903', +'903,903,341,341,341,341,341,903,903,903,903,903,903,903,762,995,903', +'995,995,995,1116,995,903,903,903,903,903,903,903,903,903,903,903,903', +'51,903,903,903,313,903,903,903,903,903,314,313,369,500,315,499,979,314', +'995,369,313,315,980,982,369,985,314,995,369,903,315,986,903,988,989', +'903,903,317,991,903,994,903,498,475,317,903,1154,369,1154,1154,1154', +'474,1154,317,903,473,472,1012,459,903,903,903,903,1018,903,903,903,903', +'1022,313,1023,449,903,903,1026,314,440,369,439,315,903,1029,903,903', +'903,437,427,903,903,557,557,557,557,557,557,423,420,418,557,557,417', +'1051,317,557,415,557,557,557,557,557,557,557,23,409,375,1055,366,557', +'557,557,557,557,557,557,588,588,557,364,588,588,588,360,557,557,557', +'557,557,557,557,557,557,557,557,557,359,557,557,557,1061,557,557,557', +'557,557,23,23,23,23,23,23,23,23,23,23,23,331,23,23,349,347,23,23,331', +'557,346,1,557,1040,342,557,557,331,336,557,1079,557,23,1040,23,557,23', +'23,1080,23,23,23,23,23,557,23,334,327,325,557,557,557,557,320,557,557', +'557,557,1090,319,1093,316,557,557,310,23,1040,1040,1096,1102,557,1040', +'557,557,557,1105,331,557,557,307,307,307,307,307,307,1106,1107,1108', +'307,307,1110,1192,309,307,308,307,307,307,307,307,307,307,304,304,304', +'304,304,307,307,307,307,307,307,307,1119,306,307,305,293,290,1124,430', +'307,307,307,307,307,307,307,307,307,307,307,307,1125,307,307,307,1126', +'307,307,307,307,307,430,430,430,430,430,430,430,430,430,430,430,1127', +'430,430,1128,1129,430,430,289,307,275,241,307,1138,237,307,307,1140', +'1141,307,236,307,430,234,430,307,430,430,213,430,430,430,430,430,307', +'430,50,42,39,307,307,307,307,1155,307,307,307,307,1156,1158,24,17,307', +'307,15,430,14,430,1170,12,307,1174,307,307,307,1176,1177,307,307,765', +'765,765,765,765,765,1178,1179,9,765,765,1182,3,764,765,768,765,765,765', +'765,765,765,765,8,8,8,8,8,765,765,765,765,765,765,765,788,755,765,790', +'751,750,744,436,765,765,765,765,765,765,765,765,765,765,765,765,741', +'765,765,765,,765,765,765,765,765,436,436,436,436,436,436,436,436,436', +'436,436,,436,436,,,436,436,,765,,,765,,,765,765,,,765,,765,436,,436', +'765,436,436,,436,436,436,436,436,765,436,,,,765,765,765,765,,765,765', +'765,765,,,,,765,765,,436,,,,,765,,765,765,765,,,765,765,950,950,950', +'950,950,950,,,,950,950,,,,950,,950,950,950,950,950,950,950,518,518,518', +'518,518,950,950,950,950,950,950,950,,882,950,882,882,882,,882,950,950', +'950,950,950,950,950,950,950,950,950,950,,950,950,950,,950,950,950,950', +'950,489,489,489,489,489,489,489,489,489,489,489,,489,489,,,489,489,', +'950,,,950,,,950,950,,,950,,950,489,,489,950,489,489,,489,489,489,489', +'489,950,489,,,,950,950,950,950,,950,950,950,950,,,,,950,950,489,489', +',,,,950,,950,950,950,,,950,950,970,970,970,970,970,970,,,,970,970,,', +',970,,970,970,970,970,970,970,970,,,,,,970,970,970,970,970,970,970,', +',970,,,,,,970,970,970,970,970,970,970,970,970,970,970,970,,970,970,970', +',970,970,970,970,970,949,949,949,949,949,949,949,949,949,949,949,,949', +'949,,,949,949,,970,,,970,,,970,970,,,970,,970,949,,949,970,949,949,', +'949,949,949,949,949,970,949,,,,970,970,970,970,,970,970,970,970,,,,', +'970,970,,949,,,,,970,,970,970,970,,,970,970,1133,1133,1133,1133,1133', +'1133,,,,1133,1133,,,,1133,,1133,1133,1133,1133,1133,1133,1133,,,,,,1133', +'1133,1133,1133,1133,1133,1133,,,1133,,,,,,1133,1133,1133,1133,1133,1133', +'1133,1133,1133,1133,1133,1133,,1133,1133,1133,,1133,1133,1133,1133,1133', +'541,541,541,541,541,541,541,541,541,541,541,,541,541,,,541,541,,1133', +',,1133,,,1133,1133,,,1133,,1133,541,,541,1133,541,541,,541,541,541,541', +'541,1133,541,,,,1133,1133,1133,1133,,1133,1133,1133,1133,,,,,1133,1133', +',541,,,,,1133,,1133,1133,1133,,,1133,1133,240,240,240,240,240,240,,', +',240,240,,,,240,,240,240,240,240,240,240,240,,,,,,240,240,240,240,240', +'240,240,,,240,,,,,,240,240,240,240,240,240,240,240,240,240,240,240,', +'240,240,240,,240,240,240,240,240,796,796,796,796,796,796,796,796,796', +'796,796,,796,796,,,796,796,,240,,,240,,,240,240,,,240,,240,796,,796', +'240,796,796,,796,796,796,796,796,240,796,,,,240,240,240,240,,240,240', +'240,240,,,,,240,240,,796,,,,,240,,240,240,240,,,240,240,215,215,215', +'215,215,215,,,,215,215,,,,215,,215,215,215,215,215,215,215,,,,,,215', +'215,215,215,215,215,215,,,215,,,,,,215,215,215,215,215,215,215,215,215', +'215,215,215,,215,215,215,,215,215,215,215,215,287,287,287,287,287,287', +'287,287,287,287,287,,287,287,,,287,287,,215,,,215,,,215,215,,,215,,215', +'287,,287,215,287,287,,287,287,287,287,287,215,287,,,,215,215,215,215', +',215,215,215,215,,,,,215,215,,287,,,,,215,,215,215,215,,,215,215,132', +'132,132,132,132,132,,,,132,132,,,,132,,132,132,132,132,132,132,132,', +',,,,132,132,132,132,132,132,132,,727,132,727,727,727,,727,132,132,132', +'132,132,132,132,132,132,132,132,132,,132,132,132,,132,132,132,132,132', +'878,,878,878,878,,878,,727,,996,,996,996,996,,996,727,,132,,,132,,,132', +'132,,485,132,,132,,,,132,,878,,1131,,1131,1131,1131,132,1131,878,996', +',132,132,132,132,,132,132,132,132,,,485,,132,132,485,485,,485,485,,132', +',132,132,132,,1131,132,132,1064,1064,1064,1064,1064,1064,,,,1064,1064', +',,,1064,,1064,1064,1064,1064,1064,1064,1064,,,,,,1064,1064,1064,1064', +'1064,1064,1064,,,1064,,,,,,1064,1064,1064,1064,1064,1064,1064,1064,1064', +'1064,1064,1064,,1064,1064,1064,,1064,1064,1064,1064,1064,333,333,333', +'333,333,333,333,333,333,333,333,,333,333,,,333,333,,1064,,,1064,,,1064', +'1064,,486,1064,,1064,333,,333,1064,333,333,,333,333,333,333,333,1064', +'333,,,,1064,1064,1064,1064,,1064,1064,1064,1064,,,486,,1064,1064,486', +'486,,486,486,,1064,,1064,1064,1064,,,1064,1064,1065,1065,1065,1065,1065', +'1065,,,,1065,1065,,,,1065,,1065,1065,1065,1065,1065,1065,1065,,,,,,1065', +'1065,1065,1065,1065,1065,1065,,,1065,,,,,,1065,1065,1065,1065,1065,1065', +'1065,1065,1065,1065,1065,1065,,1065,1065,1065,,1065,1065,1065,1065,1065', +'468,468,468,468,468,468,468,468,468,468,468,,468,468,,,468,468,,1065', +',,1065,,,1065,1065,,,1065,,1065,468,,468,1065,468,468,,468,468,468,468', +'468,1065,468,,,,1065,1065,1065,1065,,1065,1065,1065,1065,,,,,1065,1065', +',1130,,1130,1130,1130,1065,1130,1065,1065,1065,,,1065,1065,2,2,2,2,2', +'2,,,,2,2,,,,2,,2,2,2,2,2,2,2,1130,,,,,2,2,2,2,2,2,2,,,2,,,,,,2,2,2,2', +'2,2,2,2,2,2,2,2,,2,2,2,,2,2,2,2,2,488,488,488,488,488,488,488,488,,488', +'488,,,,,,488,488,,2,,,2,,,2,2,,,2,,2,488,,488,2,488,488,,488,488,488', +'488,488,2,488,,,,2,2,2,2,,2,2,2,2,,,,,2,2,,,,,,,2,,2,2,2,,,2,2,846,846', +'846,846,846,846,,,,846,846,,,,846,,846,846,846,846,846,846,846,,,,,', +'846,846,846,846,846,846,846,,,846,,,,,,846,846,846,846,846,846,846,846', +'846,846,846,846,,846,846,846,,846,846,846,846,846,469,469,469,469,469', +'469,469,469,469,469,469,,469,469,,,469,469,,846,,,846,,,846,846,,,846', +',846,469,,469,846,469,469,,469,469,469,469,469,846,469,,,,846,846,846', +'846,,846,846,846,846,,,,,846,846,,,,,,,846,,846,846,846,,,846,846,779', +'779,779,779,779,779,,,,779,779,,,,779,,779,779,779,779,779,779,779,', +',,,,779,779,779,779,779,779,779,,,779,,,,,,779,779,779,779,779,779,779', +'779,779,779,779,779,,779,779,779,,779,779,779,779,779,487,487,487,487', +'487,487,487,,,487,487,,,,,,487,487,,779,,,779,,,779,779,,,779,,779,487', +',487,779,487,487,,487,487,487,487,487,779,487,,,,779,779,779,779,,779', +'779,779,779,,,,,779,779,,,,,,,779,,779,779,779,,,779,779,769,769,769', +'769,769,769,,,,769,769,,,,769,,769,769,769,769,769,769,769,,,,,,769', +'769,769,769,769,769,769,,,769,,,,,,769,769,769,769,769,769,769,769,769', +'769,769,769,,769,769,769,,769,769,769,769,769,490,,,,,,,,,,,,,,,,490', +'490,,769,,,769,,,769,769,,,769,,769,490,,490,769,490,490,,490,490,,', +'490,769,490,,,,769,769,769,769,,769,769,769,769,,,,,769,769,,,,,,,769', +',769,769,769,,,769,769,760,760,760,760,760,760,,,,760,760,,,,760,,760', +'760,760,760,760,760,760,,,,,,760,760,760,760,760,760,760,,,760,,,,,', +'760,760,760,760,760,760,760,760,760,760,760,760,,760,760,760,,760,760', +'760,760,760,540,,,,,,,,,,,,,,,,540,540,,760,,,760,,,760,760,,,760,,760', +'540,,540,760,540,540,,540,540,,,540,760,540,,,,760,760,760,760,,760', +'760,760,760,,,,,760,760,,,,,,,760,,760,760,760,,,760,760,857,857,857', +'857,857,857,,,,857,857,,,,857,,857,857,857,857,857,857,857,,,,,,857', +'857,857,857,857,857,857,,,857,,,,,,857,857,857,857,857,857,857,857,857', +'857,857,857,,857,857,857,,857,857,857,857,857,332,332,332,332,332,332', +'332,332,332,332,332,,332,332,,,332,332,,857,,,857,,,857,857,,,857,,857', +'332,,332,857,332,332,,332,332,332,332,332,857,332,,,,857,857,857,857', +',857,857,857,857,,,,,857,857,,,,,,,857,,857,857,857,,,857,857,340,340', +'340,340,340,340,,,,340,340,,,,340,,340,340,340,340,340,340,340,,,,,', +'340,340,340,340,340,340,340,,,340,,,,,,340,340,340,340,340,340,340,340', +'340,340,340,340,,340,340,340,,340,340,340,340,340,484,484,484,484,484', +'484,484,,,484,484,,,,,,484,484,,340,,,340,,,340,340,,,340,,340,484,', +'484,340,484,484,,484,484,484,484,484,340,484,,,,340,340,340,340,,340', +'340,340,340,,,,,340,340,,,,,,,340,,340,340,340,,,340,340,35,35,35,35', +'35,35,,,,35,35,,,,35,,35,35,35,35,35,35,35,,,,,,35,35,35,35,35,35,35', +',,35,,,,,,35,35,35,35,35,35,35,35,35,35,35,35,,35,35,35,,35,35,35,35', +'35,483,483,483,483,483,483,483,,,483,483,,,,,,483,483,,35,,,35,,,35', +'35,,,35,,35,483,,483,35,483,483,,483,483,483,483,483,35,483,,,,35,35', +'35,35,,35,35,35,35,,,,,35,35,,,,,,,35,,35,35,35,,,35,35,1057,1057,1057', +'1057,1057,1057,,,,1057,1057,,,,1057,,1057,1057,1057,1057,1057,1057,1057', +',,,,,1057,1057,1057,1057,1057,1057,1057,,,1057,,,,,,1057,1057,1057,1057', +'1057,1057,1057,1057,1057,1057,1057,1057,,1057,1057,1057,,1057,1057,1057', +'1057,1057,482,482,482,482,482,482,482,,,482,482,,,,,,482,482,,1057,', +',1057,,,1057,1057,,,1057,,1057,482,,482,1057,482,482,,482,482,482,482', +'482,1057,482,,,,1057,1057,1057,1057,,1057,1057,1057,1057,,,,,1057,1057', +',,,,,,1057,,1057,1057,1057,,,1057,1057,357,357,357,357,357,357,,,,357', +'357,,,,357,,357,357,357,357,357,357,357,,,,,,357,357,357,357,357,357', +'357,,,357,,,,,,357,357,357,357,357,357,357,357,357,357,357,357,,357', +'357,357,,357,357,357,357,357,481,481,481,481,481,481,481,,,481,481,', +',,,,481,481,,357,,,357,,,357,357,,,357,,357,481,,481,357,481,481,,481', +'481,481,481,481,357,481,,,,357,357,357,357,,357,357,357,357,,,,,357', +'357,,,,,,,357,,357,357,357,,,357,357,356,356,356,356,356,356,,,,356', +'356,,,,356,,356,356,356,356,356,356,356,,,,,,356,356,356,356,356,356', +'356,,,356,,,,,,356,356,356,356,356,356,356,356,356,356,356,356,,356', +'356,356,,356,356,356,356,356,480,480,480,480,480,480,480,,,480,480,', +',,,,480,480,,356,,,356,,,356,356,,,356,,356,480,,480,356,480,480,,480', +'480,480,480,480,356,480,,,,356,356,356,356,,356,356,356,356,,,,,356', +'356,,,,,,,356,,356,356,356,,,356,356,1081,1081,1081,1081,1081,1081,', +',,1081,1081,,,,1081,,1081,1081,1081,1081,1081,1081,1081,,,,,,1081,1081', +'1081,1081,1081,1081,1081,,,1081,,,,,,1081,1081,1081,1081,1081,1081,1081', +'1081,1081,1081,1081,1081,,1081,1081,1081,,1081,1081,1081,1081,1081,479', +'479,479,479,479,479,479,,,479,479,,,,,,479,479,,1081,,,1081,,,1081,1081', +',,1081,,1081,479,,479,1081,479,479,,479,479,479,479,479,1081,479,,,', +'1081,1081,1081,1081,,1081,1081,1081,1081,,,,,1081,1081,,,,,,,1081,,1081', +'1081,1081,,,1081,1081,897,897,897,897,897,897,,,,897,897,,,,897,,897', +'897,897,897,897,897,897,,,,,,897,897,897,897,897,897,897,,,897,,,,,', +'897,897,897,897,897,897,897,897,897,897,897,897,,897,897,897,,897,897', +'897,897,897,476,,,,,,,,,,,,,,,,476,476,,897,,,897,,,897,897,,,897,,897', +'476,,476,897,476,476,,476,476,,,,897,,,,,897,897,897,897,,897,897,897', +'897,,,,,897,897,,,,,,,897,,897,897,897,,,897,897,1091,1091,1091,1091', +'1091,1091,,,,1091,1091,,,,1091,,1091,1091,1091,1091,1091,1091,1091,', +',,,,1091,1091,1091,1091,1091,1091,1091,,,1091,,,,,,1091,1091,1091,1091', +'1091,1091,1091,1091,1091,1091,1091,1091,,1091,1091,1091,,1091,1091,1091', +'1091,1091,477,,,,,,,,,,,,,,,,477,477,,1091,,,1091,,,1091,1091,,,1091', +',1091,477,,477,1091,477,477,,477,477,,,,1091,,,,,1091,1091,1091,1091', +',1091,1091,1091,1091,,,,,1091,1091,,,,,,,1091,,1091,1091,1091,,,1091', +'1091,312,312,312,312,312,312,,,,312,312,,,,312,,312,312,312,312,312', +'312,312,,,,,,312,312,312,312,312,312,312,,,312,,,,,,312,312,312,312', +'312,312,312,312,312,312,312,312,,312,312,312,,312,312,312,312,312,478', +',,,,,,,,,,,,,,,478,478,,312,,,312,,,312,312,,,312,,312,478,,,312,478', +'478,,478,478,,,,312,,,,,312,312,312,312,,312,312,312,312,,,,,312,312', +',,,,,,312,,312,312,312,,,312,312,581,581,581,581,581,581,,,,581,581', +',,,581,,581,581,581,581,581,581,581,,,,,,581,581,581,581,581,581,581', +',,581,,,,,,581,581,581,581,581,581,581,581,581,581,581,581,,581,581', +'581,,581,581,581,581,581,,,,,,,,,,,,,,,,,,,,581,,,581,,,581,581,,,581', +',581,,,,581,,,,,,,,,581,,,,,581,581,581,581,,581,581,581,581,,,,,581', +'581,,,,,,,581,,581,581,581,,,581,581,560,560,560,560,560,560,,,,560', +'560,,,,560,,560,560,560,560,560,560,560,,,,,,560,560,560,560,560,560', +'560,,,560,,,,,,560,560,560,560,560,560,560,560,560,560,560,560,,560', +'560,560,,560,560,560,560,560,,,,,,,,,,,,,,,,,,,,560,,,560,,,560,560', +',,560,,560,,,,560,,,,,,,,,560,,,,,560,560,560,560,,560,560,560,560,', +',,,560,560,,,,766,766,766,560,766,560,560,560,766,766,560,560,,766,', +'766,766,766,766,766,766,766,,,,,,766,766,766,766,766,766,766,,,766,', +',,,,,766,,,766,766,766,766,766,766,766,766,,766,766,766,,766,766,766', +'766,766,,,,,,,,,,,,,,,,,,,,766,,,766,,,766,766,,,766,,,,,,766,,,,,,', +',,766,,,,,766,766,766,766,,766,766,766,766,,,,,766,766,,,,,,,766,,766', +'766,766,,,766,766,7,7,7,7,7,,,,7,7,,,,7,,7,7,7,7,7,7,7,,,,,,7,7,7,7', +'7,7,7,,,7,,,,,,7,7,7,7,7,7,7,7,7,7,7,7,,7,7,7,,7,7,7,7,7,,,,,,,,,,,', +',,,,,,,,7,,,7,,,7,7,,,7,,7,,,,7,,,,,,,,,7,,,,,7,7,7,7,,7,7,7,7,,,,,7', +'7,,,,22,22,22,7,22,7,7,7,22,22,7,7,,22,,22,22,22,22,22,22,22,,,,,,22', +'22,22,22,22,22,22,,,22,,,,,,,22,,,22,22,22,22,22,22,22,22,,22,22,22', +',22,22,22,22,22,,,,,,,,,,,,,,,,,,,,22,,,22,,,22,22,,,22,,,,,,22,,,,', +',,,,22,,,,,22,22,22,22,,22,22,22,22,,,,,22,22,,,,,,,22,,22,22,22,29', +',22,22,,,,29,29,29,,,29,29,29,,29,,,,,,,,29,29,29,29,,,,,,,,,29,29,', +'29,29,29,29,29,,,,,,,,,,,,,,,,,,,,,,,29,29,29,29,29,29,29,29,29,29,29', +'29,29,29,,,29,29,29,,,29,,29,29,,,29,29,,29,,29,,29,,29,29,,29,29,29', +'29,29,30,29,29,29,,,,30,30,30,,,30,30,30,,30,29,,,29,29,,29,30,29,30', +'30,,,,,29,,,,30,30,,30,30,30,30,30,,,,,,,,,,,,,,,,,,,,,,,30,30,30,30', +'30,30,30,30,30,30,30,30,30,30,,,30,30,30,,,30,,30,30,,,30,30,,30,,30', +',30,,30,30,,30,30,30,30,30,,30,,30,,,,,,,,,,,,,,30,,,30,30,,30,,30,31', +'31,31,,31,,30,,31,31,,,,31,,31,31,31,31,31,31,31,,,,,,31,31,31,31,31', +'31,31,,,31,,,,,,,31,,,31,31,31,31,31,31,31,31,31,31,31,31,,31,31,31', +'31,31,,,,,,,,,,,,,,,,,,,,31,,,31,,,31,31,,,31,,31,,31,,31,,,31,,,,,', +'31,,,,,31,31,31,31,,31,31,31,31,,,,,31,31,,,,32,32,32,31,32,31,31,31', +'32,32,31,31,,32,,32,32,32,32,32,32,32,,,,,,32,32,32,32,32,32,32,,,32', +',,,,,,32,,,32,32,32,32,32,32,32,32,32,32,32,32,,32,32,32,32,32,,,,,', +',,,,,,,,,,,,,,32,,,32,,,32,32,,,32,,32,,32,,32,,,32,,,,,,32,,,,,32,32', +'32,32,,32,32,32,32,,,,,32,32,,,,33,33,33,32,33,32,32,32,33,33,32,32', +',33,,33,33,33,33,33,33,33,,,,,,33,33,33,33,33,33,33,,,33,,,,,,,33,,', +'33,33,33,33,33,33,33,33,33,33,33,33,,33,33,33,33,33,,,,,,,,,,,,,,,,', +',,,33,,,33,,,33,33,,,33,,33,,33,,33,,,33,,,,,,33,,,,,33,33,33,33,,33', +'33,33,33,,,,,33,33,,,,43,43,43,33,43,33,33,33,43,43,33,33,,43,,43,43', +'43,43,43,43,43,,,,,,43,43,43,43,43,43,43,,,43,,,,,,,43,,,43,43,43,43', +'43,43,43,43,,43,43,43,,43,43,43,43,43,,,,,,,,,,,,,,,,,,,,43,,,43,,,43', +'43,,,43,,,,,,43,,,,,,,,,43,,,,,43,43,43,43,,43,43,43,43,,,,,43,43,,', +',44,44,44,43,44,43,43,43,44,44,43,43,,44,,44,44,44,44,44,44,44,,,,,', +'44,44,44,44,44,44,44,,,44,,,,,,,44,,,44,44,44,44,44,44,44,44,,44,44', +'44,,44,44,44,44,44,,,,,,,,,,,,,,,,,,,,44,,,44,,,44,44,,,44,,,,,,44,', +',,,,,,,44,,,,,44,44,44,44,,44,44,44,44,,,,,44,44,,,,46,46,46,44,46,44', +'44,44,46,46,44,44,,46,,46,46,46,46,46,46,46,,,,,,46,46,46,46,46,46,46', +',,46,,,,,,,46,,,46,46,46,46,46,46,46,46,,46,46,46,,46,46,46,46,46,,', +',,,,,,,,,,,,,,,,,46,,,46,,,46,46,,,46,,,,,,46,,,,,,,,,46,,,,,46,46,46', +'46,,46,46,46,46,,,,,46,46,,,,47,47,47,46,47,46,46,46,47,47,46,46,,47', +',47,47,47,47,47,47,47,,,,,,47,47,47,47,47,47,47,,,47,,,,,,,47,,,47,47', +'47,47,47,47,47,47,,47,47,47,,47,47,47,47,47,,,,,,,,,,,,,,,,,,,,47,,', +'47,,,47,47,,,47,,,,,,47,,,,,,,,,47,,,,,47,47,47,47,,47,47,47,47,,,,', +'47,47,,,,49,49,49,47,49,47,47,47,49,49,47,47,,49,,49,49,49,49,49,49', +'49,,,,,,49,49,49,49,49,49,49,,,49,,,,,,,49,,,49,49,49,49,49,49,49,49', +',49,49,49,,49,49,49,49,49,,,,,,,,,,,,,,,,,,,,49,,,49,,,49,49,,,49,,', +',,,49,,,,,,,,,49,,,,,49,49,49,49,,49,49,49,49,,,,,49,49,,,,,,,49,,49', +'49,49,61,,49,49,,,,61,61,61,,,61,61,61,,61,,,,,,,,61,,61,61,61,,,,828', +'828,828,828,61,61,,61,61,61,61,61,,,,,828,828,828,,,,,,,,,,,828,828', +',,828,61,61,61,61,61,61,61,61,61,61,61,61,61,61,,,61,61,61,,,61,,,61', +',,61,61,,61,,61,,61,,61,61,,61,61,61,61,61,,61,,61,,828,828,828,828', +',828,828,828,828,,,,61,828,828,61,61,61,61,,61,828,61,828,828,828,,61', +'63,63,63,63,63,,,,63,63,,,,63,,63,63,63,63,63,63,63,,,,,,63,63,63,63', +'63,63,63,,,63,,,,,,63,63,,63,63,63,63,63,63,63,63,63,,63,63,63,,63,63', +'63,63,63,,,,,,,,,,,,,,,,,,,,63,,,63,,,63,63,,,63,,63,,,,63,,,,,,,,,63', +',,,,63,63,63,63,,63,63,63,63,,,,,63,63,,,,64,64,64,63,64,63,63,63,64', +'64,63,63,,64,,64,64,64,64,64,64,64,,,,,,64,64,64,64,64,64,64,,,64,,', +',,,,64,,,64,64,64,64,64,64,64,64,64,64,64,64,,64,64,64,64,64,,,,,,,', +',,,,,,,,,,,,64,,,64,,,64,64,,,64,,64,,,,64,,,64,,,,,,64,,,,,64,64,64', +'64,,64,64,64,64,,,,,64,64,,,,65,65,65,64,65,64,64,64,65,65,64,64,,65', +',65,65,65,65,65,65,65,,,,,,65,65,65,65,65,65,65,,,65,,,,,,,65,,,65,65', +'65,65,65,65,65,65,65,65,65,65,,65,65,65,65,65,,,,,,,,,,,,,,,,,,,,65', +',,65,,,65,65,,,65,,,,,,65,,,65,,,,,,65,,,,,65,65,65,65,,65,65,65,65', +',,,,65,65,,,,68,68,68,65,68,65,65,65,68,68,65,65,,68,,68,68,68,68,68', +'68,68,,,,,,68,68,68,68,68,68,68,,,68,,,,,,,68,,,68,68,68,68,68,68,68', +'68,,68,68,68,,68,68,68,68,68,,,,,,,,,,,,,,,,,,,,68,,,68,,,68,68,,,68', +',,,,,68,,,,,,,,,68,,,,,68,68,68,68,,68,68,68,68,,,,,68,68,,,,69,69,69', +'68,69,68,68,68,69,69,68,68,,69,,69,69,69,69,69,69,69,,,,,,69,69,69,69', +'69,69,69,,,69,,,,,,,69,,,69,69,69,69,69,69,69,69,,69,69,69,,69,69,69', +'69,69,,,,,,,,,,,,,,,,,,,,69,,,69,,,69,69,,,69,,,,,,69,,,,,,,,,69,,,', +',69,69,69,69,,69,69,69,69,,,,,69,69,,,,72,72,72,69,72,69,69,69,72,72', +'69,69,,72,,72,72,72,72,72,72,72,,,,,,72,72,72,72,72,72,72,,,72,,,,,', +',72,,,72,72,72,72,72,72,72,72,,72,72,72,,72,72,72,72,72,,,,,,,,,,,,', +',,,,,,,72,,,72,,,72,72,,,72,,,,,,72,,,,,,,,,72,,,,,72,72,72,72,,72,72', +'72,72,,,,,72,72,72,,,,,72,72,,72,72,72,,,72,72,121,121,121,121,121,', +',,121,121,,,,121,,121,121,121,121,121,121,121,,,,,,121,121,121,121,121', +'121,121,,,121,,,,,,121,121,121,121,121,121,121,121,121,121,121,121,', +'121,121,121,,121,121,121,121,121,,,,,,,,,,,,,,,,,,,,121,,,121,,,121', +'121,,,121,,121,,,,121,,,,,,,,,121,,,,,121,121,121,121,,121,121,121,121', +',,,,121,121,,,,,,121,121,,121,121,121,,,121,121,126,126,126,,126,,,', +'126,126,,,,126,,126,126,126,126,126,126,126,,,,,,126,126,126,126,126', +'126,126,,,126,,,,,,,126,,,126,126,126,126,126,126,126,126,,126,126,126', +',126,126,126,126,126,,,,,,,,,,,,,,,,,,,,126,,,126,,,126,126,,,126,,', +',,,126,,,,,,,,,126,,,,,126,126,126,126,,126,126,126,126,,,,,126,126', +',,,127,127,127,126,127,126,126,126,127,127,126,126,,127,,127,127,127', +'127,127,127,127,,,,,,127,127,127,127,127,127,127,,,127,,,,,,,127,,,127', +'127,127,127,127,127,127,127,,127,127,127,,127,127,127,127,127,,,,,,', +',,,,,,,,,,,,,127,,,127,,,127,127,,,127,,,,,,127,,,,,,,,,127,,,,,127', +'127,127,127,,127,127,127,127,,,,,127,127,,,,128,128,128,127,128,127', +'127,127,128,128,127,127,,128,,128,128,128,128,128,128,128,,,,,,128,128', +'128,128,128,128,128,,,128,,,,,,,128,,,128,128,128,128,128,128,128,128', +',128,128,128,,128,128,128,128,128,,,,,,,,,,,,,,,,,,,,128,,,128,,,128', +'128,,,128,,,,,,128,,,,,,,,,128,,,,,128,128,128,128,,128,128,128,128', +',,,,128,128,,,,129,129,129,128,129,128,128,128,129,129,128,128,,129', +',129,129,129,129,129,129,129,,,,,,129,129,129,129,129,129,129,,,129', +',,,,,,129,,,129,129,129,129,129,129,129,129,,129,129,129,,129,129,129', +'129,129,,,,,,,,,,,,,,,,,,,,129,,,129,,,129,129,,,129,,,,,,129,,,,,,', +',,129,,,,,129,129,129,129,,129,129,129,129,,,,,129,129,,,,,,,129,,129', +'129,129,,,129,129,130,130,130,130,130,,,,130,130,,,,130,,130,130,130', +'130,130,130,130,,,,,,130,130,130,130,130,130,130,,,130,,,,,,130,130', +',130,130,130,130,130,130,130,130,130,,130,130,130,,130,130,130,130,130', +',,,,,,,,,,,,,,,,,,,130,,,130,,,130,130,,,130,,130,,,,130,,,,,,,,,130', +',,,,130,130,130,130,,130,130,130,130,,,,,130,130,,,,216,216,216,130', +'216,130,130,130,216,216,130,130,,216,,216,216,216,216,216,216,216,,', +',,,216,216,216,216,216,216,216,,,216,,,,,,,216,,,216,216,216,216,216', +'216,216,216,,216,216,216,,216,216,216,216,216,,,,,,,,,,,,,,,,,,,,216', +',,216,,,216,216,,,216,,216,,,,216,,,,,,,,,216,,,,,216,216,216,216,,216', +'216,216,216,,,,,216,216,,,,217,217,217,216,217,216,216,216,217,217,216', +'216,,217,,217,217,217,217,217,217,217,,,,,,217,217,217,217,217,217,217', +',,217,,,,,,,217,,,217,217,217,217,217,217,217,217,,217,217,217,,217', +'217,217,217,217,,,,,,,,,,,,,,,,,,,,217,,,217,,,217,217,,,217,,217,,', +',217,,,,,,,,,217,,,,,217,217,217,217,,217,217,217,217,,,,,217,217,,', +',218,218,218,217,218,217,217,217,218,218,217,217,,218,,218,218,218,218', +'218,218,218,,,,,,218,218,218,218,218,218,218,,,218,,,,,,,218,,,218,218', +'218,218,218,218,218,218,,218,218,218,,218,218,218,218,218,,,,,,,,,,', +',,,,,,,,,218,,,218,,,218,218,,,218,,,,,,218,,,,,,,,,218,,,,,218,218', +'218,218,,218,218,218,218,,,,,218,218,,,,219,219,219,218,219,218,218', +'218,219,219,218,218,,219,,219,219,219,219,219,219,219,,,,,,219,219,219', +'219,219,219,219,,,219,,,,,,,219,,,219,219,219,219,219,219,219,219,,219', +'219,219,,219,219,219,219,219,,,,,,,,,,,,,,,,,,,,219,,,219,,,219,219', +',,219,,,,,,219,,,,,,,,,219,,,,,219,219,219,219,,219,219,219,219,,,,', +'219,219,,,,220,220,220,219,220,219,219,219,220,220,219,219,,220,,220', +'220,220,220,220,220,220,,,,,,220,220,220,220,220,220,220,,,220,,,,,', +',220,,,220,220,220,220,220,220,220,220,,220,220,220,,220,220,220,220', +'220,,,,,,,,,,,,,,,,,,,,220,,,220,,,220,220,,,220,,,,,,220,,,,,,,,,220', +',,,,220,220,220,220,,220,220,220,220,,,,,220,220,,,,221,221,221,220', +'221,220,220,220,221,221,220,220,,221,,221,221,221,221,221,221,221,,', +',,,221,221,221,221,221,221,221,,,221,,,,,,,221,,,221,221,221,221,221', +'221,221,221,221,221,221,221,,221,221,221,221,221,,,,,,,,,,,,,,,,,,,', +'221,,,221,,,221,221,,,221,,221,,221,,221,,,221,,,,,,221,,,,,221,221', +'221,221,,221,221,221,221,,,,,221,221,,,,226,226,226,221,226,221,221', +'221,226,226,221,221,,226,,226,226,226,226,226,226,226,,,,,,226,226,226', +'226,226,226,226,,,226,,,,,,,226,,,226,226,226,226,226,226,226,226,,226', +'226,226,,226,226,226,226,226,,,,,,,,,,,,,,,,,,,,226,,,226,,,226,226', +',,226,,,,,,226,,,,,,,,,226,,,,,226,226,226,226,,226,226,226,226,,,,', +'226,226,,,,227,227,227,226,227,226,226,226,227,227,226,226,,227,,227', +'227,227,227,227,227,227,,,,,,227,227,227,227,227,227,227,,,227,,,,,', +',227,,,227,227,227,227,227,227,227,227,,227,227,227,,227,227,227,227', +'227,,,,,,,,,,,,,,,,,,,,227,,,227,,,227,227,,,227,,,,,,227,,,,,,,,,227', +',,,,227,227,227,227,,227,227,227,227,,,,,227,227,,,,228,228,228,227', +'228,227,227,227,228,228,227,227,,228,,228,228,228,228,228,228,228,,', +',,,228,228,228,228,228,228,228,,,228,,,,,,,228,,,228,228,228,228,228', +'228,228,228,,228,228,228,,228,228,228,228,228,,,,,,,,,,,,,,,,,,,,228', +',,228,,,228,228,,,228,,,,,,228,,,,,,,,,228,,,,,228,228,228,228,,228', +'228,228,228,,,,,228,228,228,,,239,239,239,228,239,228,228,228,239,239', +'228,228,,239,,239,239,239,239,239,239,239,,,,,,239,239,239,239,239,239', +'239,,,239,,,,,,,239,,,239,239,239,239,239,239,239,239,,239,239,239,', +'239,239,239,239,239,,,,,,,,,,,,,,,,,,,,239,,,239,,,239,239,,,239,,,', +',,239,,,,,,,,,239,,,,,239,239,239,239,,239,239,239,239,,,,,239,239,', +',,243,243,243,239,243,239,239,239,243,243,239,239,,243,,243,243,243', +'243,243,243,243,,,,,,243,243,243,243,243,243,243,,,243,,,,,,,243,,,243', +'243,243,243,243,243,243,243,,243,243,243,,243,243,243,243,243,,,,,,', +',,,,,,,,,,,,,243,,,243,,,243,243,,,243,,,,,,243,,,,,,,,,243,,,,,243', +'243,243,243,,243,243,243,243,,,,,243,243,,,,244,244,244,243,244,243', +'243,243,244,244,243,243,,244,,244,244,244,244,244,244,244,,,,,,244,244', +'244,244,244,244,244,,,244,,,,,,,244,,,244,244,244,244,244,244,244,244', +',244,244,244,,244,244,244,244,244,,,,,,,,,,,,,,,,,,,,244,,,244,,,244', +'244,,,244,,,,,,244,,,,,,,,,244,,,,,244,244,244,244,,244,244,244,244', +',,,,244,244,,,,245,245,245,244,245,244,244,244,245,245,244,244,,245', +',245,245,245,245,245,245,245,,,,,,245,245,245,245,245,245,245,,,245', +',,,,,,245,,,245,245,245,245,245,245,245,245,,245,245,245,,245,245,245', +'245,245,,,,,,,,,,,,,,,,,,,,245,,,245,,,245,245,,,245,,,,,,245,,,,,,', +',,245,,,,,245,245,245,245,,245,245,245,245,,,,,245,245,,,,246,246,246', +'245,246,245,245,245,246,246,245,245,,246,,246,246,246,246,246,246,246', +',,,,,246,246,246,246,246,246,246,,,246,,,,,,,246,,,246,246,246,246,246', +'246,246,246,,246,246,246,,246,246,246,246,246,,,,,,,,,,,,,,,,,,,,246', +',,246,,,246,246,,,246,,,,,,246,,,,,,,,,246,,,,,246,246,246,246,,246', +'246,246,246,,,,,246,246,,,,247,247,247,246,247,246,246,246,247,247,246', +'246,,247,,247,247,247,247,247,247,247,,,,,,247,247,247,247,247,247,247', +',,247,,,,,,,247,,,247,247,247,247,247,247,247,247,,247,247,247,,247', +'247,247,247,247,,,,,,,,,,,,,,,,,,,,247,,,247,,,247,247,,,247,,,,,,247', +',,,,,,,,247,,,,,247,247,247,247,,247,247,247,247,,,,,247,247,,,,248', +'248,248,247,248,247,247,247,248,248,247,247,,248,,248,248,248,248,248', +'248,248,,,,,,248,248,248,248,248,248,248,,,248,,,,,,,248,,,248,248,248', +'248,248,248,248,248,,248,248,248,,248,248,248,248,248,,,,,,,,,,,,,,', +',,,,,248,,,248,,,248,248,,,248,,,,,,248,,,,,,,,,248,,,,,248,248,248', +'248,,248,248,248,248,,,,,248,248,,,,249,249,249,248,249,248,248,248', +'249,249,248,248,,249,,249,249,249,249,249,249,249,,,,,,249,249,249,249', +'249,249,249,,,249,,,,,,,249,,,249,249,249,249,249,249,249,249,,249,249', +'249,,249,249,249,249,249,,,,,,,,,,,,,,,,,,,,249,,,249,,,249,249,,,249', +',,,,,249,,,,,,,,,249,,,,,249,249,249,249,,249,249,249,249,,,,,249,249', +',,,250,250,250,249,250,249,249,249,250,250,249,249,,250,,250,250,250', +'250,250,250,250,,,,,,250,250,250,250,250,250,250,,,250,,,,,,,250,,,250', +'250,250,250,250,250,250,250,,250,250,250,,250,250,250,250,250,,,,,,', +',,,,,,,,,,,,,250,,,250,,,250,250,,,250,,,,,,250,,,,,,,,,250,,,,,250', +'250,250,250,,250,250,250,250,,,,,250,250,,,,251,251,251,250,251,250', +'250,250,251,251,250,250,,251,,251,251,251,251,251,251,251,,,,,,251,251', +'251,251,251,251,251,,,251,,,,,,,251,,,251,251,251,251,251,251,251,251', +',251,251,251,,251,251,251,251,251,,,,,,,,,,,,,,,,,,,,251,,,251,,,251', +'251,,,251,,,,,,251,,,,,,,,,251,,,,,251,251,251,251,,251,251,251,251', +',,,,251,251,,,,252,252,252,251,252,251,251,251,252,252,251,251,,252', +',252,252,252,252,252,252,252,,,,,,252,252,252,252,252,252,252,,,252', +',,,,,,252,,,252,252,252,252,252,252,252,252,,252,252,252,,252,252,252', +'252,252,,,,,,,,,,,,,,,,,,,,252,,,252,,,252,252,,,252,,,,,,252,,,,,,', +',,252,,,,,252,252,252,252,,252,252,252,252,,,,,252,252,,,,253,253,253', +'252,253,252,252,252,253,253,252,252,,253,,253,253,253,253,253,253,253', +',,,,,253,253,253,253,253,253,253,,,253,,,,,,,253,,,253,253,253,253,253', +'253,253,253,,253,253,253,,253,253,253,253,253,,,,,,,,,,,,,,,,,,,,253', +',,253,,,253,253,,,253,,,,,,253,,,,,,,,,253,,,,,253,253,253,253,,253', +'253,253,253,,,,,253,253,,,,254,254,254,253,254,253,253,253,254,254,253', +'253,,254,,254,254,254,254,254,254,254,,,,,,254,254,254,254,254,254,254', +',,254,,,,,,,254,,,254,254,254,254,254,254,254,254,,254,254,254,,254', +'254,254,254,254,,,,,,,,,,,,,,,,,,,,254,,,254,,,254,254,,,254,,,,,,254', +',,,,,,,,254,,,,,254,254,254,254,,254,254,254,254,,,,,254,254,,,,255', +'255,255,254,255,254,254,254,255,255,254,254,,255,,255,255,255,255,255', +'255,255,,,,,,255,255,255,255,255,255,255,,,255,,,,,,,255,,,255,255,255', +'255,255,255,255,255,,255,255,255,,255,255,255,255,255,,,,,,,,,,,,,,', +',,,,,255,,,255,,,255,255,,,255,,,,,,255,,,,,,,,,255,,,,,255,255,255', +'255,,255,255,255,255,,,,,255,255,,,,256,256,256,255,256,255,255,255', +'256,256,255,255,,256,,256,256,256,256,256,256,256,,,,,,256,256,256,256', +'256,256,256,,,256,,,,,,,256,,,256,256,256,256,256,256,256,256,,256,256', +'256,,256,256,256,256,256,,,,,,,,,,,,,,,,,,,,256,,,256,,,256,256,,,256', +',,,,,256,,,,,,,,,256,,,,,256,256,256,256,,256,256,256,256,,,,,256,256', +',,,257,257,257,256,257,256,256,256,257,257,256,256,,257,,257,257,257', +'257,257,257,257,,,,,,257,257,257,257,257,257,257,,,257,,,,,,,257,,,257', +'257,257,257,257,257,257,257,,257,257,257,,257,257,257,257,257,,,,,,', +',,,,,,,,,,,,,257,,,257,,,257,257,,,257,,,,,,257,,,,,,,,,257,,,,,257', +'257,257,257,,257,257,257,257,,,,,257,257,,,,258,258,258,257,258,257', +'257,257,258,258,257,257,,258,,258,258,258,258,258,258,258,,,,,,258,258', +'258,258,258,258,258,,,258,,,,,,,258,,,258,258,258,258,258,258,258,258', +',258,258,258,,258,258,258,258,258,,,,,,,,,,,,,,,,,,,,258,,,258,,,258', +'258,,,258,,,,,,258,,,,,,,,,258,,,,,258,258,258,258,,258,258,258,258', +',,,,258,258,,,,259,259,259,258,259,258,258,258,259,259,258,258,,259', +',259,259,259,259,259,259,259,,,,,,259,259,259,259,259,259,259,,,259', +',,,,,,259,,,259,259,259,259,259,259,259,259,,259,259,259,,259,259,259', +'259,259,,,,,,,,,,,,,,,,,,,,259,,,259,,,259,259,,,259,,,,,,259,,,,,,', +',,259,,,,,259,259,259,259,,259,259,259,259,,,,,259,259,,,,260,260,260', +'259,260,259,259,259,260,260,259,259,,260,,260,260,260,260,260,260,260', +',,,,,260,260,260,260,260,260,260,,,260,,,,,,,260,,,260,260,260,260,260', +'260,260,260,,260,260,260,,260,260,260,260,260,,,,,,,,,,,,,,,,,,,,260', +',,260,,,260,260,,,260,,,,,,260,,,,,,,,,260,,,,,260,260,260,260,,260', +'260,260,260,,,,,260,260,,,,261,261,261,260,261,260,260,260,261,261,260', +'260,,261,,261,261,261,261,261,261,261,,,,,,261,261,261,261,261,261,261', +',,261,,,,,,,261,,,261,261,261,261,261,261,261,261,,261,261,261,,261', +'261,261,261,261,,,,,,,,,,,,,,,,,,,,261,,,261,,,261,261,,,261,,,,,,261', +',,,,,,,,261,,,,,261,261,261,261,,261,261,261,261,,,,,261,261,,,,262', +'262,262,261,262,261,261,261,262,262,261,261,,262,,262,262,262,262,262', +'262,262,,,,,,262,262,262,262,262,262,262,,,262,,,,,,,262,,,262,262,262', +'262,262,262,262,262,,262,262,262,,262,262,262,262,262,,,,,,,,,,,,,,', +',,,,,262,,,262,,,262,262,,,262,,,,,,262,,,,,,,,,262,,,,,262,262,262', +'262,,262,262,262,262,,,,,262,262,,,,263,263,263,262,263,262,262,262', +'263,263,262,262,,263,,263,263,263,263,263,263,263,,,,,,263,263,263,263', +'263,263,263,,,263,,,,,,,263,,,263,263,263,263,263,263,263,263,,263,263', +'263,,263,263,263,263,263,,,,,,,,,,,,,,,,,,,,263,,,263,,,263,263,,,263', +',,,,,263,,,,,,,,,263,,,,,263,263,263,263,,263,263,263,263,,,,,263,263', +',,,264,264,264,263,264,263,263,263,264,264,263,263,,264,,264,264,264', +'264,264,264,264,,,,,,264,264,264,264,264,264,264,,,264,,,,,,,264,,,264', +'264,264,264,264,264,264,264,,264,264,264,,264,264,264,264,264,,,,,,', +',,,,,,,,,,,,,264,,,264,,,264,264,,,264,,,,,,264,,,,,,,,,264,,,,,264', +'264,264,264,,264,264,264,264,,,,,264,264,,,,269,269,269,264,269,264', +'264,264,269,269,264,264,,269,,269,269,269,269,269,269,269,,,,,,269,269', +'269,269,269,269,269,,,269,,,,,,,269,,,269,269,269,269,269,269,269,269', +',269,269,269,,269,269,269,269,269,,,,,,,,,,,,,,,,,,,,269,,,269,,,269', +'269,,,269,,,,,,269,,,,,,,,,269,,,,,269,269,269,269,,269,269,269,269', +',,,,269,269,,,,276,276,276,269,276,269,269,269,276,276,269,269,,276', +',276,276,276,276,276,276,276,,,,,,276,276,276,276,276,276,276,,,276', +',,,,,,276,,,276,276,276,276,276,276,276,276,276,276,276,276,,276,276', +'276,276,276,,,,,,,,,,,,,,,,,,,,276,,,276,,,276,276,,,276,,276,,276,', +'276,,,276,,,,,,276,,,,,276,276,276,276,,276,276,276,276,,,,,276,276', +',,,277,277,277,276,277,276,276,276,277,277,276,276,,277,,277,277,277', +'277,277,277,277,,,,,,277,277,277,277,277,277,277,,,277,,,,,,,277,,,277', +'277,277,277,277,277,277,277,277,277,277,277,,277,277,277,277,277,,,', +',,,,,,,,,,,,,,,,277,,,277,,,277,277,,,277,,277,,277,,277,,,277,,,,,', +'277,,,,,277,277,277,277,,277,277,277,277,,,,,277,277,,,,285,285,285', +'277,285,277,277,277,285,285,277,277,,285,,285,285,285,285,285,285,285', +',,,,,285,285,285,285,285,285,285,,,285,,,,,,,285,,,285,285,285,285,285', +'285,285,285,285,285,285,285,,285,285,285,285,285,,,,,,,,,,,,,,,,,,,', +'285,,,285,,,285,285,,,285,,285,,285,,285,,,285,,,,,,285,,,,,285,285', +'285,285,,285,285,285,285,,,,,285,285,285,,,292,292,292,285,292,285,285', +'285,292,292,285,285,,292,,292,292,292,292,292,292,292,,,,,,292,292,292', +'292,292,292,292,,,292,,,,,,,292,,,292,292,292,292,292,292,292,292,,292', +'292,292,,292,292,292,292,292,,,,,,,,,,,,,,,,,,,,292,,,292,,,292,292', +',,292,,,,,,292,,,,,,,,,292,,,,,292,292,292,292,,292,292,292,292,,,,', +'292,292,,,,294,294,294,292,294,292,292,292,294,294,292,292,,294,,294', +'294,294,294,294,294,294,,,,,,294,294,294,294,294,294,294,,,294,,,,,', +',294,,,294,294,294,294,294,294,294,294,,294,294,294,,294,294,294,294', +'294,,,,,,,,,,,,,,,,,,,,294,,,294,,,294,294,,,294,,,,,,294,,,,,,,,,294', +',,,,294,294,294,294,,294,294,294,294,,,,,294,294,,,,297,297,297,294', +'297,294,294,294,297,297,294,294,,297,,297,297,297,297,297,297,297,,', +',,,297,297,297,297,297,297,297,,,297,,,,,,,297,,,297,297,297,297,297', +'297,297,297,,297,297,297,,297,297,297,297,297,,,,,,,,,,,,,,,,,,,,297', +',,297,,,297,297,,,297,,,,,,297,,,,,,,,,297,,,,,297,297,297,297,,297', +'297,297,297,,,,,297,297,,,,298,298,298,297,298,297,297,297,298,298,297', +'297,,298,,298,298,298,298,298,298,298,,,,,,298,298,298,298,298,298,298', +',,298,,,,,,,298,,,298,298,298,298,298,298,298,298,,298,298,298,,298', +'298,298,298,298,,,,,,,,,,,,,,,,,,,,298,,,298,,,298,298,,,298,,,,,,298', +',,,,,,,,298,,,,,298,298,298,298,,298,298,298,298,,,,,298,298,,,,,,,298', +',298,298,298,,,298,298,303,303,303,303,303,,,,303,303,,,,303,,303,303', +'303,303,303,303,303,,,,,,303,303,303,303,303,303,303,,,303,,,,,,303', +'303,,303,303,303,303,303,303,303,303,303,,303,303,303,,303,303,303,303', +'303,,,,,,,,,,,,,,,,,,,,303,,,303,,,303,303,,,303,,303,,,,303,,,,,,,', +',303,,,,,303,303,303,303,,303,303,303,303,,,,,303,303,,,,1120,1120,1120', +'303,1120,303,303,303,1120,1120,303,303,,1120,,1120,1120,1120,1120,1120', +'1120,1120,,,,,,1120,1120,1120,1120,1120,1120,1120,,,1120,,,,,,,1120', +',,1120,1120,1120,1120,1120,1120,1120,1120,1120,1120,1120,1120,,1120', +'1120,1120,1120,1120,,,,,,,,,,,,,,,,,,,,1120,,,1120,,,1120,1120,,,1120', +',1120,,1120,,1120,,,1120,,,,,,1120,,,,,1120,1120,1120,1120,,1120,1120', +'1120,1120,,,,,1120,1120,,,,1084,1084,1084,1120,1084,1120,1120,1120,1084', +'1084,1120,1120,,1084,,1084,1084,1084,1084,1084,1084,1084,,,,,,1084,1084', +'1084,1084,1084,1084,1084,,,1084,,,,,,,1084,,,1084,1084,1084,1084,1084', +'1084,1084,1084,,1084,1084,1084,,1084,1084,1084,1084,1084,,,,,,,,,,,', +',,,,,,,,1084,,,1084,,,1084,1084,,,1084,,,,,,1084,,,,,,,,,1084,,,,,1084', +'1084,1084,1084,,1084,1084,1084,1084,,,,,1084,1084,,,,1083,1083,1083', +'1084,1083,1084,1084,1084,1083,1083,1084,1084,,1083,,1083,1083,1083,1083', +'1083,1083,1083,,,,,,1083,1083,1083,1083,1083,1083,1083,,,1083,,,,,,', +'1083,,,1083,1083,1083,1083,1083,1083,1083,1083,,1083,1083,1083,,1083', +'1083,1083,1083,1083,,,,,,,,,,,,,,,,,,,,1083,,,1083,,,1083,1083,,,1083', +',,,,,1083,,,,,,,,,1083,,,,,1083,1083,1083,1083,,1083,1083,1083,1083', +',,,,1083,1083,,,,337,337,337,1083,337,1083,1083,1083,337,337,1083,1083', +',337,,337,337,337,337,337,337,337,,,,,,337,337,337,337,337,337,337,', +',337,,,,,,,337,,,337,337,337,337,337,337,337,337,,337,337,337,,337,337', +'337,337,337,,,,,,,,,,,,,,,,,,,,337,,,337,,,337,337,,,337,,,,,,337,,', +',,,,,,337,,,,,337,337,337,337,,337,337,337,337,,,,,337,337,,,,339,339', +'339,337,339,337,337,337,339,339,337,337,,339,,339,339,339,339,339,339', +'339,,,,,,339,339,339,339,339,339,339,,,339,,,,,,,339,,,339,339,339,339', +'339,339,339,339,,339,339,339,,339,339,339,339,339,,,,,,,,,,,,,,,,,,', +',339,,,339,339,,339,339,,,339,,,,,,339,,,,,,,,,339,,,,,339,339,339,339', +',339,339,339,339,,,,,339,339,,,,355,355,355,339,355,339,339,339,355', +'355,339,339,,355,,355,355,355,355,355,355,355,,,,,,355,355,355,355,355', +'355,355,,,355,,,,,,,355,,,355,355,355,355,355,355,355,355,,355,355,355', +',355,355,355,355,355,,,,,,,,,,,,,,,,,,,,355,,,355,,,355,355,,,355,,', +',,,355,,,,,,,,,355,,,,,355,355,355,355,,355,355,355,355,,,,,355,355', +',,,376,376,376,355,376,355,355,355,376,376,355,355,,376,,376,376,376', +'376,376,376,376,,,,,,376,376,376,376,376,376,376,,,376,,,,,,,376,,,376', +'376,376,376,376,376,376,376,,376,376,376,,376,376,376,376,376,,,,,,', +',,,,,,,,,,,,,376,,,376,,,376,376,,,376,,,,,,376,,,,,,,,,376,,,,,376', +'376,376,376,,376,376,376,376,,,,,376,376,,,,392,392,392,376,392,376', +'376,376,392,392,376,376,,392,,392,392,392,392,392,392,392,,,,,,392,392', +'392,392,392,392,392,,,392,,,,,,,392,,,392,392,392,392,392,392,392,392', +',392,392,392,,392,392,392,392,392,,,,,,,,,,,,,,,,,,,,392,,,392,,,392', +'392,,,392,,,,,,392,,,,,,,,,392,,,,,392,392,392,392,,392,392,392,392', +',,,,392,392,,,,419,419,419,392,419,392,392,392,419,419,392,392,,419', +',419,419,419,419,419,419,419,,,,,,419,419,419,419,419,419,419,,,419', +',,,,,,419,,,419,419,419,419,419,419,419,419,,419,419,419,,419,419,419', +'419,419,,,,,,,,,,,,,,,,,,,,419,,,419,,,419,419,,,419,,,,,,419,,,,,,', +',,419,,,,,419,419,419,419,,419,419,419,419,,,,,419,419,,,,,,,419,,419', +'419,419,443,,419,419,,,,443,443,443,,,443,443,443,,443,,,,,,,,443,443', +'443,443,,,,,,,,,443,443,,443,443,443,443,443,,,,,,,,,,,,,,,,,,,,,,,443', +'443,443,443,443,443,443,443,443,443,443,443,443,443,,,443,443,443,,', +'443,,443,443,,,443,443,,443,,443,,443,,443,443,,443,443,443,443,443', +',443,443,443,1165,,1165,1165,1165,1165,1165,,,,,,,443,,1165,443,443', +'452,443,,443,,,,452,452,452,443,,452,452,452,,452,,,1165,,,,,452,452', +'452,452,452,,1165,1165,,,,1165,452,452,,452,452,452,452,452,,,,,,,,', +',,,,,,,,,,,,,,452,452,452,452,452,452,452,452,452,452,452,452,452,452', +',,452,452,452,,,452,,,452,,,452,452,,452,,452,,452,,452,452,,452,452', +'452,452,452,,452,452,452,,,,,,,,,,,,,,452,,,452,452,452,452,,452,453', +'452,,,,,452,453,453,453,,,453,453,453,,453,,,,,,,,453,453,453,453,453', +',,,,,,,453,453,,453,453,453,453,453,,,,,,,,,,,,,,,,,,,,,,,453,453,453', +'453,453,453,453,453,453,453,453,453,453,453,,,453,453,453,,,453,,,453', +',,453,453,,453,,453,,453,,453,453,,453,453,453,453,453,,453,453,453', +',,,,,,,,,,,,,453,,,453,453,453,453,,453,,453,,462,462,462,453,462,,', +',462,462,,,,462,,462,462,462,462,462,462,462,,,,,,462,462,462,462,462', +'462,462,,,462,,,,,,,462,,,462,462,462,462,462,462,462,462,462,462,462', +'462,,462,462,462,462,462,,,,,,,,,,,,,,,,,,,,462,,,462,,,462,462,,,462', +',462,,462,,462,,,462,,,,,,462,,,,,462,462,462,462,,462,462,462,462,', +',,,462,462,,,,464,464,464,462,464,462,462,462,464,464,462,462,,464,', +'464,464,464,464,464,464,464,,,,,,464,464,464,464,464,464,464,,,464,', +',,,,,464,,,464,464,464,464,464,464,464,464,,464,464,464,,464,464,464', +'464,464,,,,,,,,,,,,,,,,,,,,464,,,464,,,464,464,,,464,,,,,,464,,,,,,', +',,464,,,,,464,464,464,464,,464,464,464,464,,,,,464,464,,,,465,465,465', +'464,465,464,464,464,465,465,464,464,,465,,465,465,465,465,465,465,465', +',,,,,465,465,465,465,465,465,465,,,465,,,,,,,465,,,465,465,465,465,465', +'465,465,465,,465,465,465,,465,465,465,465,465,,,,,,,,,,,,,,,,,,,,465', +',,465,,,465,465,,,465,,,,,,465,,,,,,,,,465,,,,,465,465,465,465,,465', +'465,465,465,,,,,465,465,,,,466,466,466,465,466,465,465,465,466,466,465', +'465,,466,,466,466,466,466,466,466,466,,,,,,466,466,466,466,466,466,466', +',,466,,,,,,,466,,,466,466,466,466,466,466,466,466,,466,466,466,,466', +'466,466,466,466,,,,,,,,,,,,,,,,,,,,466,,,466,,,466,466,,,466,,,,,,466', +',,,,,,,,466,,,,,466,466,466,466,,466,466,466,466,,,,,466,466,,,,,,,466', +',466,466,466,492,,466,466,,,,492,492,492,,,492,492,492,845,492,845,845', +'845,845,845,,,492,492,492,,,,845,,,,,,492,492,,492,492,492,492,492,', +',,,,,,1144,845,1144,1144,1144,1144,1144,,,,845,845,845,845,,1144,,845', +',709,,709,709,709,709,709,492,,,,,,,492,709,,,1144,492,492,,,,845,,', +'1144,1144,1144,1144,,,,1144,,,709,,,,,492,492,,,709,709,709,709,,,,709', +',,,492,,,492,,497,497,497,492,497,,,,497,497,492,,,497,,497,497,497', +'497,497,497,497,,,,,,497,497,497,497,497,497,497,,,497,,,,,,,497,,,497', +'497,497,497,497,497,497,497,,497,497,497,,497,497,497,497,497,,,,,,', +',,,,,,,,,,,,,497,,,497,,,497,497,,,497,,,,,,497,,,,,,,,,497,,,,,497', +'497,497,497,,497,497,497,497,,,,,497,497,,,,507,507,507,497,507,497', +'497,497,507,507,497,497,,507,,507,507,507,507,507,507,507,,,,,,507,507', +'507,507,507,507,507,,,507,,,,,,,507,,,507,507,507,507,507,507,507,507', +'507,507,507,507,,507,507,507,507,507,,,,,,,,,,,,,,,,,,,,507,,,507,,', +'507,507,,,507,,507,,507,,507,,,507,,,,,,507,,,,,507,507,507,507,,507', +'507,507,507,,,,,507,507,,,,509,509,509,507,509,507,507,507,509,509,507', +'507,,509,,509,509,509,509,509,509,509,,,,,,509,509,509,509,509,509,509', +',,509,,,,,,,509,,,509,509,509,509,509,509,509,509,509,509,509,509,,509', +'509,509,509,509,,,,,,,,,,,,,,,,,,,,509,,,509,,,509,509,,,509,,,,509', +',509,,,509,,,,,,509,,,,,509,509,509,509,,509,509,509,509,,,,,509,509', +',,,511,511,511,509,511,509,509,509,511,511,509,509,,511,,511,511,511', +'511,511,511,511,,,,,,511,511,511,511,511,511,511,,,511,,,,,,,511,,,511', +'511,511,511,511,511,511,511,,511,511,511,,511,511,511,511,511,,,,,,', +',,,,,,,,,,,,,511,,,511,,,511,511,,,511,,,,,,511,,,,,,,,,511,,,,,511', +'511,511,511,,511,511,511,511,,,,,511,511,,,,,,,511,,511,511,511,,,511', +'511,517,517,517,517,517,,,,517,517,,,,517,,517,517,517,517,517,517,517', +',,,,,517,517,517,517,517,517,517,,,517,,,,,,517,517,517,517,517,517', +'517,517,517,517,517,517,,517,517,517,,517,517,517,517,517,,,,,,,,,,', +',,,,,,,,,517,,,517,,,517,517,,,517,,517,,,,517,,,,,,,,,517,,,,,517,517', +'517,517,,517,517,517,517,,,,,517,517,,,,,,517,517,,517,517,517,,,517', +'517,527,527,527,,527,,,,527,527,,,,527,,527,527,527,527,527,527,527', +',,,,,527,527,527,527,527,527,527,,,527,,,,,,,527,,,527,527,527,527,527', +'527,527,527,527,527,527,527,,527,527,527,527,527,,,,,,,,,,,,,,,,,,,', +'527,,,527,,,527,527,,,527,,527,,527,,527,,,527,,,,,,527,,,,,527,527', +'527,527,,527,527,527,527,,,,,527,527,,,,536,536,536,527,536,527,527', +'527,536,536,527,527,,536,,536,536,536,536,536,536,536,,,,,,536,536,536', +'536,536,536,536,,,536,,,,,,,536,,,536,536,536,536,536,536,536,536,,536', +'536,536,,536,536,536,536,536,,,,,,,,,,,,,,,,,,,,536,,,536,,,536,536', +',,536,,,,,,536,,,,,,,,,536,,,,,536,536,536,536,,536,536,536,536,,,,', +'536,536,,,,539,539,539,536,539,536,536,536,539,539,536,536,,539,,539', +'539,539,539,539,539,539,,,,,,539,539,539,539,539,539,539,,,539,,,,,', +',539,,,539,539,539,539,539,539,539,539,,539,539,539,,539,539,539,539', +'539,,,,,,,,,,,,,,,,,,,,539,,,539,,,539,539,,,539,,,,,,539,,,,,,,,,539', +',,,,539,539,539,539,,539,539,539,539,,,,,539,539,,,,542,542,542,539', +'542,539,539,539,542,542,539,539,,542,,542,542,542,542,542,542,542,,', +',,,542,542,542,542,542,542,542,,,542,,,,,,,542,,,542,542,542,542,542', +'542,542,542,,542,542,542,,542,542,542,542,542,,,,,,,,,,,,,,,,,,,,542', +',,542,,,542,542,,,542,,,,,,542,,,,,,,,,542,,,,,542,542,542,542,,542', +'542,542,542,,,,,542,542,,,,918,918,918,542,918,542,542,542,918,918,542', +'542,,918,,918,918,918,918,918,918,918,,,,,,918,918,918,918,918,918,918', +',,918,,,,,,,918,,,918,918,918,918,918,918,918,918,,918,918,918,,918', +'918,918,918,918,,,,,,,,,,,,,,,,,,,,918,,,918,,,918,918,,,918,,,,,,918', +',,,,,,,,918,,,,,918,918,918,918,,918,918,918,918,,,,,918,918,,,,548', +'548,548,918,548,918,918,918,548,548,918,918,,548,,548,548,548,548,548', +'548,548,,,,,,548,548,548,548,548,548,548,,,548,,,,,,,548,,,548,548,548', +'548,548,548,548,548,548,548,548,548,,548,548,548,548,548,,,,,,,,,,,', +',,,,,,,,548,,,548,,,548,548,,,548,,548,,,,548,,,548,,,,,,548,,,,,548', +'548,548,548,,548,548,548,548,,,,,548,548,,,,551,551,551,548,551,548', +'548,548,551,551,548,548,,551,,551,551,551,551,551,551,551,,,,,,551,551', +'551,551,551,551,551,,,551,,,,,,,551,,,551,551,551,551,551,551,551,551', +'551,551,551,551,,551,551,551,551,551,,,,,,,,,,,,,,,,,,,,551,,,551,,', +'551,551,,,551,,,,,,551,,,551,,,,,,551,,,,,551,551,551,551,,551,551,551', +'551,,,,,551,551,,,,917,917,917,551,917,551,551,551,917,917,551,551,', +'917,,917,917,917,917,917,917,917,,,,,,917,917,917,917,917,917,917,,', +'917,,,,,,,917,,,917,917,917,917,917,917,917,917,917,917,917,917,,917', +'917,917,917,917,,,,,,,,,,,,,,,,,,,,917,,,917,,,917,917,,,917,,,,917', +',917,,,917,,,,,,917,,,,,917,917,917,917,,917,917,917,917,,,,,917,917', +',,,566,566,566,917,566,917,917,917,566,566,917,917,,566,,566,566,566', +'566,566,566,566,,,,,,566,566,566,566,566,566,566,,,566,,,,,,,566,,,566', +'566,566,566,566,566,566,566,,566,566,566,,566,566,566,566,566,,,,,,', +',,,,,,,,,,,,,566,,,566,,,566,566,,,566,,566,,,,566,,,,,,,,,566,,,,,566', +'566,566,566,,566,566,566,566,,,,,566,566,,,,567,567,567,566,567,566', +'566,566,567,567,566,566,,567,,567,567,567,567,567,567,567,,,,,,567,567', +'567,567,567,567,567,,,567,,,,,,,567,,,567,567,567,567,567,567,567,567', +'567,567,567,567,,567,567,567,567,567,,,,,,,,,,,,,,,,,,,,567,,,567,,', +'567,567,,,567,,567,,567,,567,,,567,,,,,,567,,,,,567,567,567,567,,567', +'567,567,567,,,,,567,567,,,,577,577,577,567,577,567,567,567,577,577,567', +'567,,577,,577,577,577,577,577,577,577,,,,,,577,577,577,577,577,577,577', +',,577,,,,,,,577,,,577,577,577,577,577,577,577,577,577,577,577,577,,577', +'577,577,577,577,,,,,,,,,,,,,,,,,,,,577,,,577,,,577,577,,,577,,577,,577', +',577,,,577,,,,,,577,,,,,577,577,577,577,,577,577,577,577,,,,,577,577', +',,,896,896,896,577,896,577,577,577,896,896,577,577,,896,,896,896,896', +'896,896,896,896,,,,,,896,896,896,896,896,896,896,,,896,,,,,,,896,,,896', +'896,896,896,896,896,896,896,,896,896,896,,896,896,896,896,896,,,,,,', +',,,,,,,,,,,,,896,,,896,,,896,896,,,896,,896,,,,896,,,,,,,,,896,,,,,896', +'896,896,896,,896,896,896,896,,,,,896,896,,,,,,,896,,896,896,896,,,896', +'896,608,608,608,608,608,,,,608,608,,,,608,,608,608,608,608,608,608,608', +',,,,,608,608,608,608,608,608,608,,,608,,,,,,608,608,,608,608,608,608', +'608,608,608,608,608,,608,608,608,,608,608,608,608,608,,,,,,,,,,,,,,', +',,,,,608,,,608,,,608,608,,,608,,608,,,,608,,,,,,,,,608,,,,,608,608,608', +'608,,608,608,608,608,,,,,608,608,,,,610,610,610,608,610,608,608,608', +'610,610,608,608,,610,,610,610,610,610,610,610,610,,,,,,610,610,610,610', +'610,610,610,,,610,,,,,,,610,,,610,610,610,610,610,610,610,610,,610,610', +'610,,610,610,610,610,610,,,,,,,,,,,,,,,,,,,,610,,,610,,,610,610,,,610', +',610,,,,610,,,,,,,,,610,,,,,610,610,610,610,,610,610,610,610,,,,,610', +'610,,,,611,611,611,610,611,610,610,610,611,611,610,610,,611,,611,611', +'611,611,611,611,611,,,,,,611,611,611,611,611,611,611,,,611,,,,,,,611', +',,611,611,611,611,611,611,611,611,,611,611,611,,611,611,611,611,611', +',,,,,,,,,,,,,,,,,,,611,,,611,,,611,611,,,611,,,,,,611,,,,,,,,,611,,', +',,611,611,611,611,,611,611,611,611,,,,,611,611,,,,612,612,612,611,612', +'611,611,611,612,612,611,611,,612,,612,612,612,612,612,612,612,,,,,,612', +'612,612,612,612,612,612,,,612,,,,,,,612,,,612,612,612,612,612,612,612', +'612,612,612,612,612,,612,612,612,612,612,,,,,,,,,,,,,,,,,,,,612,,,612', +',,612,612,,,612,,612,,612,,612,,,612,,,,,,612,,,,,612,612,612,612,,612', +'612,612,612,,,,,612,612,,,,,,,612,,612,612,612,,,612,612,615,615,615', +'615,615,,,,615,615,,,,615,,615,615,615,615,615,615,615,,,,,,615,615', +'615,615,615,615,615,,,615,,,,,,615,615,,615,615,615,615,615,615,615', +'615,615,,615,615,615,,615,615,615,615,615,,,,,,,,,,,,,,,,,,,,615,,,615', +',,615,615,,,615,,615,,,,615,,,,,,,,,615,,,,,615,615,615,615,,615,615', +'615,615,,,,,615,615,,,,616,616,616,615,616,615,615,615,616,616,615,615', +',616,,616,616,616,616,616,616,616,,,,,,616,616,616,616,616,616,616,', +',616,,,,,,,616,,,616,616,616,616,616,616,616,616,,616,616,616,,616,616', +'616,616,616,,,,,,,,,,,,,,,,,,,,616,,,616,,,616,616,,,616,,,,,,616,,', +',,,,,,616,,,,,616,616,616,616,,616,616,616,616,,,,,616,616,,,,891,891', +'891,616,891,616,616,616,891,891,616,616,,891,,891,891,891,891,891,891', +'891,,,,,,891,891,891,891,891,891,891,,,891,,,,,,,891,,,891,891,891,891', +'891,891,891,891,,891,891,891,,891,891,891,891,891,,,,,,,,,,,,,,,,,,', +',891,,,891,,,891,891,,,891,,,,,,891,,,,,,,,,891,,,,,891,891,891,891', +',891,891,891,891,,,,,891,891,,,,619,619,619,891,619,891,891,891,619', +'619,891,891,,619,,619,619,619,619,619,619,619,,,,,,619,619,619,619,619', +'619,619,,,619,,,,,,,619,,,619,619,619,619,619,619,619,619,619,619,619', +'619,,619,619,619,619,619,,,,,,,,,,,,,,,,,,,,619,,,619,,,619,619,,,619', +',619,,619,,619,,,619,,,,,,619,,,,,619,619,619,619,,619,619,619,619,', +',,,619,619,,,,620,620,620,619,620,619,619,619,620,620,619,619,,620,', +'620,620,620,620,620,620,620,,,,,,620,620,620,620,620,620,620,,,620,', +',,,,,620,,,620,620,620,620,620,620,620,620,620,620,620,620,,620,620', +'620,620,620,,,,,,,,,,,,,,,,,,,,620,,,620,,,620,620,,,620,,,,620,,620', +',,620,,,,,,620,,,,,620,620,620,620,,620,620,620,620,,,,,620,620,,,,621', +'621,621,620,621,620,620,620,621,621,620,620,,621,,621,621,621,621,621', +'621,621,,,,,,621,621,621,621,621,621,621,,,621,,,,,,,621,,,621,621,621', +'621,621,621,621,621,,621,621,621,,621,621,621,621,621,,,,,,,,,,,,,,', +',,,,,621,,,621,,,621,621,,,621,,,,,,621,,,,,,,,,621,,,,,621,621,621', +'621,,621,621,621,621,,,,,621,621,,,,622,622,622,621,622,621,621,621', +'622,622,621,621,,622,,622,622,622,622,622,622,622,,,,,,622,622,622,622', +'622,622,622,,,622,,,,,,,622,,,622,622,622,622,622,622,622,622,,622,622', +'622,,622,622,622,622,622,,,,,,,,,,,,,,,,,,,,622,,,622,,,622,622,,,622', +',,,,,622,,,,,,,,,622,,,,,622,622,622,622,,622,622,622,622,,,,,622,622', +',,,626,626,626,622,626,622,622,622,626,626,622,622,,626,,626,626,626', +'626,626,626,626,,,,,,626,626,626,626,626,626,626,,,626,,,,,,,626,,,626', +'626,626,626,626,626,626,626,,626,626,626,,626,626,626,626,626,,,,,,', +',,,,,,,,,,,,,626,,,626,,,626,626,,,626,,,,,,626,,,,,,,,,626,,,,,626', +'626,626,626,,626,626,626,626,,,,,626,626,,,,627,627,627,626,627,626', +'626,626,627,627,626,626,,627,,627,627,627,627,627,627,627,,,,,,627,627', +'627,627,627,627,627,,,627,,,,,,,627,,,627,627,627,627,627,627,627,627', +',627,627,627,,627,627,627,627,627,,,,,,,,,,,,,,,,,,,,627,,,627,,,627', +'627,,,627,,,,,,627,,,,,,,,,627,,,,,627,627,627,627,,627,627,627,627', +',,,,627,627,,,,876,876,876,627,876,627,627,627,876,876,627,627,,876', +',876,876,876,876,876,876,876,,,,,,876,876,876,876,876,876,876,,,876', +',,,,,,876,,,876,876,876,876,876,876,876,876,,876,876,876,,876,876,876', +'876,876,,,,,,,,,,,,,,,,,,,,876,,,876,,,876,876,,,876,,,,,,876,,,,,,', +',,876,,,,,876,876,876,876,,876,876,876,876,,,,,876,876,,,,672,672,672', +'876,672,876,876,876,672,672,876,876,,672,,672,672,672,672,672,672,672', +',,,,,672,672,672,672,672,672,672,,,672,,,,,,,672,,,672,672,672,672,672', +'672,672,672,672,672,672,672,,672,672,672,672,672,,,,,,,,,,,,,,,,,,,', +'672,,,672,,,672,672,,,672,,672,,672,,672,,,672,,,,,,672,,,,,672,672', +'672,672,,672,672,672,672,,,,,672,672,,,,836,836,836,672,836,672,672', +'672,836,836,672,672,,836,,836,836,836,836,836,836,836,,,,,,836,836,836', +'836,836,836,836,,,836,,,,,,,836,,,836,836,836,836,836,836,836,836,,836', +'836,836,,836,836,836,836,836,,,,,,,,,,,,,,,,,,,,836,,,836,,,836,836', +',,836,,,,,,836,,,,,,,,,836,,,,,836,836,836,836,,836,836,836,836,,,,', +'836,836,,,,681,681,681,836,681,836,836,836,681,681,836,836,,681,,681', +'681,681,681,681,681,681,,,,,,681,681,681,681,681,681,681,,,681,,,,,', +',681,,,681,681,681,681,681,681,681,681,,681,681,681,,681,681,681,681', +'681,,,,,,,,,,,,,,,,,,,,681,,,681,,,681,681,,,681,,,,,,681,,,,,,,,,681', +',,,,681,681,681,681,,681,681,681,681,,,,,681,681,,,,684,684,684,681', +'684,681,681,681,684,684,681,681,,684,,684,684,684,684,684,684,684,,', +',,,684,684,684,684,684,684,684,,,684,,,,,,,684,,,684,684,684,684,684', +'684,684,684,,684,684,684,,684,684,684,684,684,,,,,,,,,,,,,,,,,,,,684', +',,684,,,684,684,,,684,,,,,,684,,,,,,,,,684,,,,,684,684,684,684,,684', +'684,684,684,,,,,684,684,,,,703,703,703,684,703,684,684,684,703,703,684', +'684,,703,,703,703,703,703,703,703,703,,,,,,703,703,703,703,703,703,703', +',,703,,,,,,,703,,,703,703,703,703,703,703,703,703,,703,703,703,,703', +'703,703,703,703,,,,,,,,,,,,,,,,,,,,703,,,703,,,703,703,,,703,,703,,', +',703,,,,,,,,,703,,,,,703,703,703,703,,703,703,703,703,,,,,703,703,,', +',813,813,813,703,813,703,703,703,813,813,703,703,,813,,813,813,813,813', +'813,813,813,,,,,,813,813,813,813,813,813,813,,,813,,,,,,,813,,,813,813', +'813,813,813,813,813,813,,813,813,813,,813,813,813,813,813,,,,,,,,,,', +',,,,,,,,,813,,,813,,,813,813,,,813,,,,,,813,,,,,,,,,813,,,,,813,813', +'813,813,,813,813,813,813,,,,,813,813,,,,812,812,812,813,812,813,813', +'813,812,812,813,813,,812,,812,812,812,812,812,812,812,,,,,,812,812,812', +'812,812,812,812,,,812,,,,,,,812,,,812,812,812,812,812,812,812,812,,812', +'812,812,,812,812,812,812,812,,,,,,,,,,,,,,,,,,,,812,,,812,,,812,812', +',,812,,,,,,812,,,,,,,,,812,,,,,812,812,812,812,,812,812,812,812,,,,', +'812,812,,,,811,811,811,812,811,812,812,812,811,811,812,812,,811,,811', +'811,811,811,811,811,811,,,,,,811,811,811,811,811,811,811,,,811,,,,,', +',811,,,811,811,811,811,811,811,811,811,,811,811,811,,811,811,811,811', +'811,,,,,,,,,,,,,,,,,,,,811,,,811,,,811,811,,,811,,,,,,811,,,,,,,,,811', +',,,,811,811,811,811,,811,811,811,811,,,,,811,811,,,,810,810,810,811', +'810,811,811,811,810,810,811,811,,810,,810,810,810,810,810,810,810,,', +',,,810,810,810,810,810,810,810,,,810,,,,,,,810,,,810,810,810,810,810', +'810,810,810,,810,810,810,,810,810,810,810,810,,,,,,,,,,,,,,,,,,,,810', +',,810,,,810,810,,,810,,,,,,810,,,,,,,,,810,,,,,810,810,810,810,,810', +'810,810,810,,,,,810,810,,,,730,730,730,810,730,810,810,810,730,730,810', +'810,,730,,730,730,730,730,730,730,730,,,,,,730,730,730,730,730,730,730', +',,730,,,,,,,730,,,730,730,730,730,730,730,730,730,,730,730,730,,730', +'730,730,730,730,,,,,,,,,,,,,,,,,,,,730,,,730,,,730,730,,,730,,,,,,730', +',,,,,,,,730,,,,,730,730,730,730,,730,730,730,730,,,,,730,730,,,,797', +'797,797,730,797,730,730,730,797,797,730,730,,797,,797,797,797,797,797', +'797,797,,,,,,797,797,797,797,797,797,797,,,797,,,,,,,797,,,797,797,797', +'797,797,797,797,797,,797,797,797,,797,797,797,797,797,,,,,,,,,,,,,,', +',,,,,797,,,797,,,797,797,,,797,,,,,,797,,,,,,,,,797,,,,,797,797,797', +'797,,797,797,797,797,,,,,797,797,,,,789,789,789,797,789,797,797,797', +'789,789,797,797,,789,,789,789,789,789,789,789,789,,,,,,789,789,789,789', +'789,789,789,,,789,,,,,,,789,,,789,789,789,789,789,789,789,789,,789,789', +'789,,789,789,789,789,789,,,,,,,,,,,,,,,,,,,,789,,,789,,,789,789,,,789', +',,,,,789,,,,,,,,,789,,,,,789,789,789,789,,789,789,789,789,,,,,789,789', +',,,74,74,74,789,74,789,789,789,74,74,789,789,,74,,74,74,74,74,74,74', +'74,,,,,,74,74,74,74,74,74,74,,,74,,,,,,,74,,,74,74,74,74,74,74,74,74', +',74,74,74,,74,74,,,74,,,,,,,,,,,,,,,,,74,,,74,,,74,,,74,74,,,74,,,,', +',,,,,,,,,,,,,,,74,74,74,74,,74,74,74,74,,,,,74,74,,,,73,73,73,74,73', +'74,74,74,73,73,,,,73,,73,73,73,73,73,73,73,,,,,,73,73,73,73,73,73,73', +',,73,,,,,,,73,,,73,73,73,73,73,73,73,73,,73,73,73,,73,73,,,73,,,,,,', +',,,,,,,,,,,,,73,,,73,,,73,73,,,73,,73,,,,,,,,,,,,,,,,,,73,73,73,73,', +'73,73,73,73,,,,,73,73,,,,687,687,687,73,687,73,73,73,687,687,,,,687', +',687,687,687,687,687,687,687,,,,,,687,687,687,687,687,687,687,,,687', +',,,,,,687,,,687,687,687,687,687,687,687,687,,687,687,687,,687,687,,', +'687,,,,,,,,,,,,,,,,,,,,687,,,687,,,687,687,,,687,,,,,,,,,,,,,,,,,,,', +'687,687,687,687,,687,687,687,687,,,,,687,687,,,,698,698,698,687,698', +'687,687,687,698,698,,,,698,,698,698,698,698,698,698,698,,,,,,698,698', +'698,698,698,698,698,,,698,,,,,,,698,,,698,698,698,698,698,698,698,698', +',698,698,698,,698,698,,,698,,,,,,,,,,,,,,,,,,,,698,,,698,,,698,698,', +',698,,,,,,,,,,,,,,,,,,,,698,698,698,698,,698,698,698,698,,,,,698,698', +',,,533,533,533,698,533,698,698,698,533,533,,,,533,,533,533,533,533,533', +'533,533,,,,,,533,533,533,533,533,533,533,,,533,,,,,,,533,,,533,533,533', +'533,533,533,533,533,,533,533,533,,533,533,,,533,,,,,,,,,,,,,,,,,,,,533', +',,533,,,533,533,,,533,,,,,,,,,,,,,,,,,,,,533,533,533,533,,533,533,533', +'533,,,,,533,533,,,,311,311,311,533,311,533,533,533,311,311,,,,311,,311', +'311,311,311,311,311,311,,,,,,311,311,311,311,311,311,311,,,311,,,,,', +',311,,,311,311,311,311,311,311,311,311,,311,311,311,,311,311,,,311,', +',,,,,,,,,,,,,,,,,,311,,,311,,,311,311,,,311,,,1146,,1146,1146,1146,1146', +'1146,,,,,,,,,1146,,311,311,311,311,,311,311,311,311,,,,,311,311,,,,311', +',1146,311,,311,311,311,75,75,75,,75,1146,1146,,75,75,1146,,,75,,75,75', +'75,75,75,75,75,,,,,,75,75,75,75,75,75,75,,,75,,,,,,,75,,,75,75,75,75', +'75,75,75,75,,75,75,75,,75,75,,,75,,,,,,,,,,,,,,,,,,,,75,,,75,,,75,75', +',,75,,,,,,,,,,,,,,,,,,,,75,75,75,75,,75,75,75,75,,,,,75,75,,,,37,37', +'37,75,37,75,75,75,37,37,,,,37,,37,37,37,37,37,37,37,,,,,,37,37,37,37', +'37,37,37,,,37,,,,,,,37,,,37,37,37,37,37,37,37,37,,37,37,37,,37,37,,', +'37,,,,,,,,,,,,,,,,,,,,37,,,37,,,37,37,,,37,,,874,,874,874,874,874,874', +',,,,,,,,874,,37,37,37,37,,37,37,37,37,,,,,37,37,,,,37,,874,37,,37,37', +'37,974,974,974,,974,874,874,,974,974,874,,,974,,974,974,974,974,974', +'974,974,,,,,,974,974,974,974,974,974,974,,,974,,,,,,,974,,,974,974,974', +'974,974,974,974,974,,974,974,974,,974,974,,,974,,,,,,,,,,,,,,,,,,,,974', +',,974,,,974,974,,,974,,,,,,,,,,,,,,,,,,,,974,974,974,974,,974,974,974', +'974,,,,,974,974,,,,965,965,965,974,965,974,974,974,965,965,,,,965,,965', +'965,965,965,965,965,965,,,,,,965,965,965,965,965,965,965,,,965,,,,,', +',965,,,965,965,965,965,965,965,965,965,,965,965,965,,965,965,,,965,', +',,,,,,,,,,,,,,,,,,965,,,965,,,965,965,,,965,,,,,,,,,,,,,,,,,,,,965,965', +'965,965,,965,965,965,965,,,,,965,965,,,,36,36,36,965,36,965,965,965', +'36,36,,,,36,,36,36,36,36,36,36,36,,,,,,36,36,36,36,36,36,36,,,36,,,', +',,,36,,,36,36,36,36,36,36,36,36,,36,36,36,,36,36,,,36,,,,,,,,,,,,,,', +',,,,,36,,,36,,,36,36,,,36,,36,,,,,,,,,,,,,,,,,,36,36,36,36,,36,36,36', +'36,,,,,36,36,,,,525,525,525,36,525,36,36,36,525,525,,,,525,,525,525', +'525,525,525,525,525,,,,,,525,525,525,525,525,525,525,,,525,,,,,,,525', +',,525,525,525,525,525,525,525,525,,525,525,525,,525,525,,,525,,,,,,', +',,,,,,,,,,,,,525,,,525,,,525,525,,,525,,,,,,,,,,,,,,,,,,,,525,525,525', +'525,,525,525,525,525,,,,,525,525,,,,1053,1053,1053,525,1053,525,525', +'525,1053,1053,,,,1053,,1053,1053,1053,1053,1053,1053,1053,,,,,,1053', +'1053,1053,1053,1053,1053,1053,,,1053,,,,,,,1053,,,1053,1053,1053,1053', +'1053,1053,1053,1053,,1053,1053,1053,,1053,1053,,,1053,,,,,,,,,,,,,,', +',,,,,1053,,,1053,,,1053,1053,,,1053,,,,,,,,,,,,,,,,,,,,1053,1053,1053', +'1053,,1053,1053,1053,1053,,,,,1053,1053,,,,328,328,328,1053,328,1053', +'1053,1053,328,328,,,,328,,328,328,328,328,328,328,328,,,,,,328,328,328', +'328,328,328,328,,,328,,,,,,,328,,,328,328,328,328,328,328,328,328,,328', +'328,328,,328,328,,,328,,,,,,,,,,,,,,,,,,,,328,,,328,,,328,328,,,328', +',,,,,,,,,,,,,,,,,,,328,328,328,328,,328,328,328,328,,,,,328,328,,,,', +',,328,,328,328,328,606,606,606,606,606,606,606,606,606,606,606,606,606', +'606,606,606,606,606,606,606,606,606,606,606,,,,606,606,606,606,606,606', +'606,606,606,606,,,,,,606,606,606,606,606,606,606,606,606,,,606,,,,,', +',,606,606,,606,606,606,606,606,606,606,,,606,606,,,,606,606,606,606', +',,,,,,,,,,,,,606,606,,606,606,606,606,606,606,606,606,606,606,606,606', +',,606,606,,,,,,,,,,,,,,606,11,11,11,11,11,11,11,11,11,11,11,11,11,11', +'11,11,11,11,11,11,11,11,11,11,,,,11,11,11,11,11,11,11,11,11,11,,,,,', +'11,11,11,11,11,11,11,11,11,,,11,,,,,,,,11,11,,11,11,11,11,11,11,11,', +',11,11,,,,11,11,11,11,,,,,,,,,,,,,,11,11,,11,11,11,11,11,11,11,11,11', +'11,11,11,,,11,11,,,,,,,,,,,,,,11,410,410,410,410,410,410,410,410,410', +'410,410,410,410,410,410,410,410,410,410,410,410,410,410,410,,,,410,410', +'410,410,410,410,410,410,410,410,,,,,,410,410,410,410,410,410,410,410', +'410,,,410,,,,,,,,410,410,,410,410,410,410,410,410,410,,,410,410,,,,410', +'410,410,410,,,,,,,,,,,,,,410,410,,410,410,410,410,410,410,410,410,410', +'410,410,410,,,410,410,,,,,,,,,,,,,,410,10,10,10,10,10,10,10,10,10,10', +'10,10,10,10,10,10,10,10,10,10,10,10,10,10,,,,10,10,10,10,10,10,10,10', +'10,10,,,,,,10,10,10,10,10,10,10,10,10,10,,10,,,,,,,,10,10,,10,10,10', +'10,10,10,10,,,10,10,,,,10,10,10,10,,,,,,,,,,,,,,10,10,,10,10,10,10,10', +'10,10,10,10,10,10,10,,,10,10,467,467,467,467,,,,,,,,,,10,,,467,467,467', +'467,,,771,467,771,771,771,771,771,467,467,,,467,,,,771,,,,,,,,,,,,,', +',,467,,,467,,,771,467,,,467,,,,,771,771,771,771,,,,771,,,,467,,,,467', +'467,467,467,,467,467,467,467,,,,,467,467,819,819,819,819,,,467,,467', +'467,467,,,467,467,,819,819,819,819,,,,819,819,,,,,819,819,,,819,819', +',,,,,,,,,,,,,,,,,,819,,,819,,,,819,,,819,,819,,,,,,,819,,,,,,,819,,', +',819,819,819,819,,819,819,819,819,,,,,819,819,,,,,,,819,,819,819,819', +',,819,819,772,772,772,772,772,772,772,772,772,772,772,772,772,772,772', +'772,772,772,772,772,772,772,772,772,,,,772,772,772,772,772,772,772,772', +'772,772,,,,,,772,772,772,772,772,772,772,772,772,,,772,,,,,,,,772,772', +',772,772,772,772,772,772,772,,,772,772,,,,772,772,772,772,,,,,,,,,,', +',,,772,772,,772,772,772,772,772,772,772,772,772,772,772,772,,,772,1095', +'1095,1095,1095,,,1148,,1148,1148,1148,1148,1148,,,,1095,1095,1095,1095', +',1148,,1095,,,,,,1095,1095,,,1095,,,,,,,,,,1148,,,,,,,,,,1095,1148,1148', +'1095,,,1148,1095,,,1095,,,,,,,,,,,,,,,,1095,,,,1095,1095,1095,1095,', +'1095,1095,1095,1095,,,,,1095,1095,895,895,895,895,,,1095,,1095,1095', +'1095,,,1095,1095,,895,895,895,895,,,,895,895,,,,,895,895,,,895,895,', +',,,,,,,,,,,,,,,,,895,,,895,,,,895,,,895,,895,,,,,,,895,,,,,,,895,,,', +'895,895,895,895,,895,895,895,895,,,,,895,895,1027,1027,1027,1027,,,895', +',895,895,895,,,895,895,,1027,1027,1027,1027,,,870,1027,870,870,870,870', +'870,1027,1027,,,1027,,,,870,,,,,,,,,,,,,,,,1027,,,1027,,,870,1027,,', +'1027,,,,,870,870,870,870,,,,870,,,,1027,,,,1027,1027,1027,1027,,1027', +'1027,1027,1027,,,,,1027,1027,1085,1085,1085,1085,,,1027,,1027,1027,1027', +',,1027,1027,,1085,1085,1085,1085,,,1044,1085,1044,1044,1044,1044,1044', +'1085,1085,,,1085,,,,1044,,,,,,,,,,,,,,,,1085,,,1085,,,1044,1085,,,1085', +',1085,,,1044,1044,1044,1044,,,,1044,,,,1085,,,,1085,1085,1085,1085,', +'1085,1085,1085,1085,,,,,1085,1085,1094,1094,1094,1094,,,1085,,1085,1085', +'1085,,,1085,1085,,1094,1094,1094,1094,,,1046,1094,1046,1046,1046,1046', +'1046,1094,1094,,,1094,,,,1046,,,,,,,,,,,,,,,,1094,,,1094,,,1046,1094', +',,1094,,,,,1046,1046,1046,1046,,,,1046,,,,1094,,,,1094,1094,1094,1094', +',1094,1094,1094,1094,,,,,1094,1094,827,827,827,827,,,1094,,1094,1094', +'1094,,,1094,1094,,827,827,827,827,,,1072,827,1072,1072,1072,1072,1072', +'827,827,,,827,,,,1072,,,,,,,,,,,,,,,,827,,,827,,,1072,827,,,827,,,,', +',,1072,1072,,,,1072,,,,827,,,,827,827,827,827,,827,827,827,827,,,,,827', +'827,822,822,822,822,,,827,,827,827,827,,,827,827,,822,822,822,822,,', +'1048,822,1048,1048,1048,1048,1048,822,822,,,822,,,,1048,,,,,,,,,,,,', +',,,822,,,822,,,1048,822,,,822,,822,,,,,1048,1048,,,,1048,,,,822,,,,822', +'822,822,822,,822,822,822,822,,,,,822,822,,,,,,,822,,822,822,822,,,822', +'822,76,76,76,76,76,76,76,76,76,76,76,76,76,76,76,76,76,76,76,76,76,76', +'76,76,,,,76,76,76,76,76,76,76,76,76,76,,,,,,76,76,76,76,76,76,76,76', +'76,76,76,76,,76,,,,,,76,76,,76,76,76,76,76,76,76,,,76,76,,,,76,76,76', +'76,,,,,,76,,,,,,,,76,76,,76,76,76,76,76,76,76,76,76,76,76,76,,,76,816', +'816,816,816,,,1150,,1150,1150,1150,1150,1150,,,,816,816,816,816,,1150', +',816,,,,,,816,816,,,816,,,,,,,,,,1150,,,,,,,,,,816,1150,1150,816,,,1150', +'816,,,816,,,,,,,,,,,,,,,,816,,,,816,816,816,816,,816,816,816,816,,,', +',816,816,820,820,820,820,,,816,,816,816,816,,,816,816,,820,820,820,820', +',,,820,820,,,,,820,820,,,820,820,,,,,,,,,,,,,,,,,,,820,,,820,,,,820', +',,820,,820,,,,,,,820,,,,,,,820,,,,820,820,820,820,,820,820,820,820,', +',,,820,820,1142,1142,1142,1142,,,820,,820,820,820,,,820,820,,1142,1142', +'1142,1142,,,1070,1142,1070,1070,1070,1070,1070,1142,1142,,,1142,,,,1070', +',,,,,,,,,,,,,,,1142,,,1142,,,1070,1142,,,1142,,,,,,,1070,1070,,,,1070', +',,,1142,,,,1142,1142,1142,1142,,1142,1142,1142,1142,,,,,1142,1142,1139', +'1139,1139,1139,,,1142,,1142,1142,1142,,,1142,1142,,1139,1139,1139,1139', +',,1068,1139,1068,1068,1068,1068,1068,1139,1139,,,1139,,,,1068,,,,,,', +',,,,,,,,,1139,,,1139,,,1068,1139,,,1139,,,,,1068,1068,1068,1068,,,,1068', +',,,1139,,,,1139,1139,1139,1139,,1139,1139,1139,1139,,,,,1139,1139,934', +'934,934,934,,,1139,,1139,1139,1139,,,1139,1139,,934,934,934,934,,,1186', +'934,1186,1186,1186,1186,1186,934,934,,,934,,,,1186,,,,,,,,,,,,,,,,934', +',,934,,,1186,934,,,934,,,,,,,1186,1186,,,,1186,,,,934,,,,934,934,934', +'934,,934,934,934,934,,,,,934,934,926,926,926,926,,,934,,934,934,934', +',,934,934,,926,926,926,926,,,,926,,,,,,926,926,,,926,,,,,,,,829,829', +'829,829,,,,,,,,,926,,,926,829,829,829,926,,,926,,926,,,,,829,829,,,829', +',,,,926,,,,926,926,926,926,,926,926,926,926,,,,,926,926,,,,,,,926,,926', +'926,926,,,926,926,556,,556,556,556,556,556,,,,,829,829,829,829,556,829', +'829,829,829,,,,,829,829,650,650,650,650,,,829,,829,829,829,556,556,', +',,650,650,650,,556,556,556,556,,,,556,,650,650,,,650,649,649,649,649', +',,,,,,,,,,,,649,649,649,,,,,,,,,,,649,649,,,649,,,,,,,,,,,,,,,,650,650', +'650,650,,650,650,650,650,,,,,650,650,,,,,,,650,,650,650,650,,,,,,,,', +'649,649,649,649,,649,649,649,649,,,,,649,649,1122,1122,,,1122,,649,', +'649,649,649,,1122,1122,,1122,1122,1122,1122,1122,1122,1122,,,1122,1122', +',,,1122,1122,1122,1122,,,,,,1122,,,,,,,,1122,1122,,1122,1122,1122,1122', +'1122,1122,1122,1122,1122,1122,1122,1122,1121,1121,1122,,1121,,,,,,,', +'1121,1121,,1121,1121,1121,1121,1121,1121,1121,,,1121,1121,,,,1121,1121', +'1121,1121,,,,,,1121,,,,,,,,1121,1121,,1121,1121,1121,1121,1121,1121', +'1121,1121,1121,1121,1121,1121,529,529,1121,,529,,,,,,,,529,529,,529', +'529,529,529,529,529,529,,,529,529,,,,529,529,529,529,,,,,,529,,,,,,', +',529,529,,529,529,529,529,529,529,529,529,529,529,529,529,1117,1117', +'529,,1117,,,,,,,,1117,1117,,1117,1117,1117,1117,1117,1117,1117,,,1117', +'1117,,,,1117,1117,1117,1117,,,,,,1117,,,,,,,,1117,1117,,1117,1117,1117', +'1117,1117,1117,1117,1117,1117,1117,1117,1117,461,461,1117,,461,,,,,', +',,461,461,,461,461,461,461,461,461,461,,,461,461,,,,461,461,461,461', +',,,,,461,,,,,,,,461,461,,461,461,461,461,461,461,461,461,461,461,461', +'461,460,460,461,,460,,,,,,,,460,460,,460,460,460,460,460,460,460,,,460', +'460,,,,460,460,460,460,,,,,,460,,,,,,,,460,460,,460,460,460,460,460', +'460,460,460,460,460,460,460,223,223,460,,223,,,,,,,,223,223,,223,223', +'223,223,223,223,223,,,223,223,,,,223,223,223,223,,,,,,223,,,,,,,,223', +'223,,223,223,223,223,223,223,223,223,223,223,223,223,222,222,223,,222', +',,,,,,,222,222,,222,222,222,222,222,222,222,,,222,222,,,,222,222,222', +'222,,,,,,222,,,,,,,,222,222,,222,222,222,222,222,222,222,222,222,222', +'222,222,538,538,222,,538,,,,,,,,538,538,,538,538,538,538,538,538,538', +',,538,538,,,,538,538,538,538,,,,,,538,,,,,,,,538,538,,538,538,538,538', +'538,538,538,538,538,538,538,538,568,568,538,,568,,,,,,,,568,568,,568', +'568,568,568,568,568,568,,,568,568,,,,568,568,568,568,,,,,,568,,,,,,', +',568,568,,568,568,568,568,568,568,568,568,568,568,568,568,569,569,568', +',569,,,,,,,,569,569,,569,569,569,569,569,569,569,,,569,569,,,,569,569', +'569,569,,,,,,569,,,,,,,,569,569,,569,569,569,569,569,569,569,569,569', +'569,569,569,537,537,569,,537,,,,,,,,537,537,,537,537,537,537,537,537', +'537,,,537,537,,,,537,537,537,537,,,,,,537,,,,,,,,537,537,,537,537,537', +'537,537,537,537,537,537,537,537,537,614,614,537,,614,,,,,,,,614,614', +',614,614,614,614,614,614,614,,,614,614,,,,614,614,614,614,,,,,,614,', +',,,,,,614,614,,614,614,614,614,614,614,614,614,614,614,614,614,272,272', +'614,,272,,,,,,,,272,272,,272,272,272,272,272,272,272,,,272,272,,,,272', +'272,272,272,,,,,,,,,,,,,,272,272,,272,272,272,272,272,272,272,272,272', +'272,272,272,575,575,272,,575,,,,,,,,575,575,,575,575,575,575,575,575', +'575,,,575,575,,,,575,575,575,575,,,,,,575,,,,,,,,575,575,,575,575,575', +'575,575,575,575,575,575,575,575,575,576,576,575,,576,,,,,,,,576,576', +',576,576,576,576,576,576,576,,,576,576,,,,576,576,576,576,,,,,,576,', +',,,,,,576,576,,576,576,576,576,576,576,576,576,576,576,576,576,613,613', +'576,,613,,,,,,,,613,613,,613,613,613,613,613,613,613,,,613,613,,,,613', +'613,613,613,,,,,,613,,,,,,,,613,613,,613,613,613,613,613,613,613,613', +'613,613,613,613,528,528,613,,528,,,,,,,,528,528,,528,528,528,528,528', +'528,528,,,528,528,,,,528,528,528,528,,,,,,528,,,,,,,,528,528,,528,528', +'528,528,528,528,528,528,528,528,528,528,,1074,528,1074,1074,1074,1074', +'1074,,872,,872,872,872,872,872,1074,,,,,,,,872,,,,,,,,,,,,,,1074,,,', +',,,,872,,,1074,1074,,,,1074,872,872,872,872,,,,872' ] + racc_action_check = arr = ::Array.new(27375, nil) + idx = 0 + clist.each do |str| + str.split(',', -1).each do |i| + arr[idx] = i.to_i unless i.empty? + idx += 1 + end + end + +racc_action_pointer = [ + nil, 1237, 2734, 1451, nil, 277, nil, 5312, 1423, 1335, + 24199, 23943, 1317, nil, 1281, 1279, 553, 1335, 829, 634, + nil, -70, 5443, 1150, 1393, nil, 588, nil, 165, 5584, + 5694, 5828, 5959, 6090, nil, 3742, 23283, 22882, nil, 1275, + 416, 442, 1352, 6221, 6352, 123, 6483, 6614, 578, 6745, + 1276, 920, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 6886, nil, 7027, 7158, 7289, -15, nil, 7420, 7551, + nil, nil, 7682, 22088, 21957, 22751, 25338, nil, nil, nil, + nil, nil, nil, nil, nil, 197, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 390, nil, nil, 278, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 7825, nil, nil, nil, nil, 7968, 8099, 8230, 8361, + 8504, nil, 2302, nil, 701, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 1265, nil, 2158, 8635, 8766, 8897, 9028, + 9159, 9290, 26590, 26529, nil, nil, 9421, 9552, 9683, nil, + nil, 872, 283, 310, 1338, 333, 1245, 1298, nil, 9814, + 2014, 1292, nil, 9945, 10076, 10207, 10338, 10469, 10600, 10731, + 10862, 10993, 11124, 11255, 11386, 11517, 11648, 11779, 11910, 12041, + 12172, 12303, 12434, 12565, 12696, nil, nil, nil, nil, 12827, + nil, nil, 26956, nil, nil, 1284, 12958, 13089, nil, nil, + nil, nil, nil, nil, nil, 13220, nil, 2158, nil, 1245, + 1202, nil, 13351, 1247, 13482, nil, nil, 13613, 13744, nil, + nil, 315, nil, 13887, 1279, 1221, 1186, 1294, 1180, 1218, + 1147, 22612, 4750, 989, 995, 999, 1222, 1022, nil, 1186, + 1139, 167, nil, nil, nil, 1175, 198, 1130, 23676, nil, + 385, 1150, 3454, 2446, 1196, nil, 1178, 14411, nil, 14542, + 3598, 991, 1110, nil, 401, 314, 1142, 1118, 427, 1143, + nil, nil, 252, 26, -1, 14673, 4174, 4030, 665, 1190, + 1058, -18, 11, 474, 1134, 24, 1154, nil, nil, 997, + 694, 370, nil, 501, nil, 1069, 14804, nil, nil, nil, + -32, 159, 198, 259, 311, 410, 442, 478, 479, nil, + 509, nil, 14935, nil, 389, 386, 380, 422, 268, -31, + -27, 415, nil, nil, nil, nil, nil, nil, nil, 1062, + 24071, nil, nil, nil, nil, 1053, nil, 1119, 1026, 15066, + 1025, nil, nil, 1012, nil, 717, 277, 1105, nil, nil, + 1294, nil, nil, nil, nil, nil, 1438, 1017, nil, 1007, + 1005, 524, 598, 15207, nil, nil, nil, 639, 529, 1044, + nil, nil, 15339, 15475, nil, nil, nil, -14, nil, 1030, + 26468, 26407, 15612, -82, 15743, 15874, 16005, 24283, 2590, 2878, + 822, 710, 1052, 1051, 1047, 1039, 4462, 4606, 4750, 4318, + 4174, 4030, 3886, 3742, 3598, 2330, 2474, 3022, 2734, 1582, + 3166, nil, 16146, nil, nil, nil, nil, 16276, 974, 944, + 945, nil, nil, nil, 890, nil, nil, 16407, nil, 16538, + nil, 16669, nil, 313, nil, nil, nil, 16812, 1567, nil, + 889, 852, nil, nil, 848, 23414, 832, 16955, 27200, 26285, + 721, 864, nil, 22481, 819, nil, 17086, 26834, 26651, 17217, + 3310, 1870, 17348, 941, 933, 791, 828, nil, 17610, nil, + nil, 17741, nil, nil, nil, nil, 26005, 1150, 904, nil, + 5038, 65, 903, 899, 177, 880, 18003, 18134, 26712, 26773, + 65, nil, nil, 833, nil, 27017, 27078, 18265, nil, nil, + 194, 4894, 798, nil, 20, nil, nil, nil, 1133, nil, + nil, nil, 753, nil, nil, 317, nil, 208, nil, nil, + 733, nil, 732, nil, nil, nil, 23815, nil, 18539, 732, + 18670, 18801, 18932, 27139, 26895, 19075, 19206, 762, 759, 19468, + 19599, 19730, 19861, 747, nil, nil, 19992, 20123, 733, nil, + nil, nil, 255, 414, 139, 0, 679, 720, nil, 695, + nil, nil, 610, 66, 322, nil, 539, nil, nil, 26084, + 26050, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 752, 252, nil, 665, 766, nil, 737, -8, + nil, nil, 20385, nil, 625, 619, 645, nil, 441, nil, + 477, 20647, nil, nil, 20778, nil, 303, 22219, 400, nil, + 359, 165, 167, 381, 237, 757, 345, 246, 22350, nil, + 292, 10, 317, 20909, nil, nil, nil, 443, nil, 16165, + nil, 183, 176, 101, nil, 53, 26, -41, nil, nil, + nil, nil, nil, nil, nil, nil, -86, 2288, nil, nil, + 21564, nil, nil, nil, 187, nil, nil, nil, -26, nil, + nil, 1443, 653, nil, 1466, nil, nil, nil, nil, nil, + 1470, 1469, nil, nil, -11, 1345, 38, 61, 178, 29, + 3310, 584, 900, nil, 1322, 1438, 5169, nil, 1445, 3166, + 526, 24286, 24524, nil, nil, nil, nil, nil, nil, 3022, + nil, nil, nil, nil, nil, nil, nil, nil, 1341, 21826, + 1347, 405, -28, 749, 861, nil, 2014, 21695, nil, -84, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 21433, 21302, 21171, 21040, 399, 229, 25421, -75, 134, 24381, + 25519, 279, 25195, nil, 774, nil, 403, 25097, 6886, 25952, + nil, nil, nil, nil, nil, nil, 20516, nil, 549, nil, + nil, 570, 597, nil, nil, 16110, 2878, nil, nil, nil, + nil, 622, 163, nil, nil, 760, nil, 3454, 660, 709, + nil, nil, nil, 33, 672, 815, nil, nil, 598, nil, + 24806, nil, 27270, nil, 22929, nil, 20254, nil, 2317, nil, + 704, 705, 1568, 714, nil, nil, nil, nil, nil, 836, + nil, 19337, 855, nil, nil, 24705, 18396, 4462, 64, 864, + nil, 874, 498, 1006, nil, 883, 763, 763, 775, nil, + 647, nil, 782, 778, 154, nil, nil, 17872, 17479, nil, + nil, nil, nil, 140, 793, 811, 25911, nil, 813, -19, + 817, nil, nil, nil, 25813, nil, nil, 232, 825, 827, + nil, 828, 830, nil, nil, -66, nil, nil, nil, 1726, + 1582, nil, nil, 853, 854, 862, nil, 865, 867, 868, + nil, 893, 875, 880, 873, 23152, nil, nil, nil, nil, + 1726, nil, nil, 42, 23021, nil, nil, nil, nil, 988, + 951, nil, 1034, nil, nil, 954, 960, nil, 962, 963, + nil, 967, nil, nil, 972, 992, 2327, nil, nil, nil, + 39, nil, 53, 605, 116, nil, nil, nil, 465, nil, + nil, nil, 1110, nil, nil, 636, nil, nil, 1036, nil, + nil, nil, 1043, 999, -21, nil, 1003, 24803, 695, 1056, + 383, nil, nil, nil, nil, nil, nil, 198, nil, nil, + 1183, nil, nil, nil, 24904, nil, 25002, nil, 25198, nil, + nil, 1054, 925, 23545, 611, 1122, nil, 3886, 38, 19, + 282, 1155, 8, nil, 2446, 2590, nil, nil, 25718, nil, + 25620, nil, 25100, nil, 27262, nil, nil, nil, nil, 1113, + 1121, 4318, nil, 14280, 14149, 24901, nil, nil, nil, nil, + 1144, 4606, nil, 1143, 24999, 24607, 1151, nil, nil, nil, + nil, nil, 1152, nil, nil, 1158, 1168, 1169, 1170, nil, + 1173, nil, 458, nil, nil, nil, 906, 26346, nil, 1323, + 14018, 26224, 26163, -10, 1223, 1341, 1221, 1238, 1241, 1242, + 2670, 2356, 687, 1870, nil, nil, nil, nil, 1374, 25715, + 1254, 1255, 25617, nil, 16146, nil, 22659, nil, 24594, nil, + 25408, nil, nil, nil, 1057, 1324, 1329, nil, 1289, 89, + -7, 69, -9, nil, nil, 15270, nil, nil, nil, nil, + 1295, nil, 20, nil, 1298, nil, 1302, 1303, 1312, 1313, + nil, 6, 1317, nil, nil, nil, 25816, nil, nil, nil, + nil, nil, 1174, nil ] + +racc_action_default = [ + -1, -716, -4, -716, -2, -701, -5, -716, -8, -716, + -716, -716, -716, -31, -716, -716, -36, -716, -716, -295, + -48, -703, -716, -55, -59, -60, -61, -65, -272, -272, + -272, -308, -339, -340, -77, -13, -81, -89, -91, -716, + -600, -601, -716, -716, -716, -716, -716, -716, -229, -716, + -703, -243, -286, -287, -288, -289, -290, -291, -292, -293, + -294, -689, -297, -301, -715, -679, -316, -318, -716, -716, + -57, -57, -701, -716, -716, -716, -716, -341, -342, -344, + -345, -346, -347, -540, -541, -542, -543, -564, -546, -547, + -566, -568, -551, -556, -560, -562, -578, -579, -580, -564, + -582, -584, -585, -586, -587, -687, -589, -590, -688, -592, + -593, -594, -595, -596, -597, -598, -599, -604, -605, 1194, + -3, -702, -711, -712, -713, -7, -716, -716, -716, -716, + -716, -9, -4, -19, -716, -120, -121, -122, -123, -124, + -125, -126, -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, -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, -24, -127, -13, -716, -716, -716, -716, + -716, -262, -716, -716, -699, -700, -716, -716, -703, -704, + -52, -716, -600, -601, -716, -295, -716, -716, -235, -716, + -13, -716, -53, -212, -213, -716, -716, -716, -716, -716, + -716, -716, -716, -716, -716, -716, -716, -716, -716, -716, + -716, -716, -716, -716, -716, -244, -245, -246, -247, -716, + -411, -413, -716, -697, -698, -66, -262, -716, -315, -417, + -426, -428, -72, -423, -73, -703, -74, -250, -267, -276, + -276, -271, -716, -277, -716, -564, -681, -716, -716, -75, + -76, -701, -14, -716, -17, -716, -79, -13, -703, -716, + -82, -85, -13, -97, -98, -716, -716, -105, -308, -311, + -703, -716, -339, -340, -343, -424, -716, -87, -716, -93, + -305, -716, -214, -215, -583, -223, -224, -716, -236, -716, + -13, -299, -703, -251, -708, -708, -716, -716, -708, -716, + -317, -402, -56, -716, -716, -716, -13, -13, -701, -716, + -702, -600, -601, -716, -716, -295, -716, -357, -358, -115, + -116, -716, -118, -716, -295, -608, -716, -600, -601, -332, + -120, -121, -160, -161, -162, -178, -183, -190, -193, -334, + -716, -677, -716, -544, -716, -716, -716, -716, -716, -716, + -716, -716, -6, -714, -25, -26, -27, -28, -29, -716, + -716, -21, -22, -23, -128, -716, -32, -35, -282, -716, + -716, -281, -33, -716, -37, -716, -295, -45, -47, -201, + -255, -277, -49, -50, -38, -202, -255, -703, -263, -276, + -276, -690, -691, -272, -421, -692, -693, -691, -690, -272, + -420, -422, -692, -693, -44, -209, -51, -703, -314, -716, + -716, -716, -262, -305, -716, -716, -716, -716, -210, -211, + -216, -217, -218, -219, -220, -221, -225, -226, -227, -228, + -230, -231, -232, -233, -234, -237, -238, -239, -240, -703, + -248, -432, -272, -690, -691, -63, -67, -636, -703, -276, + -703, -273, -430, -432, -703, -310, -268, -716, -269, -716, + -274, -716, -278, -716, -684, -686, -12, -702, -16, -18, + -703, -78, -303, -94, -83, -716, -703, -262, -716, -716, + -104, -716, -583, -716, -90, -95, -716, -716, -716, -716, + -249, -241, -716, -532, -716, -703, -716, -252, -710, -709, + -254, -710, -306, -307, -680, -319, -635, -13, -348, -349, + -13, -716, -716, -716, -716, -716, -716, -262, -716, -716, + -305, -57, -115, -116, -117, -716, -716, -262, -328, -606, + -716, -13, -612, -336, -703, -545, -565, -570, -716, -572, + -548, -567, -716, -569, -550, -716, -553, -716, -555, -558, + -716, -559, -716, -581, -10, -20, -716, -30, -716, -285, + -716, -716, -262, -716, -716, -716, -716, -425, -716, -264, + -266, -716, -716, -68, -261, -418, -716, -716, -70, -419, + -313, -705, -690, -691, -690, -691, -703, -54, -451, -453, + -455, -458, -512, -465, -468, -471, -505, -510, -511, -716, + -716, -515, -516, -517, -518, -519, -520, -521, -522, -523, + -524, -526, -716, -716, -530, -716, -716, -433, -62, -414, + -430, -257, -264, -259, -716, -392, -716, -309, -276, -275, + -279, -716, -682, -683, -716, -15, -80, -716, -86, -92, + -703, -690, -691, -260, -694, -103, -716, -88, -716, -208, + -222, -703, -715, -715, -298, -300, -302, -708, -403, -635, + -406, -676, -676, -676, -618, -620, -620, -620, -634, -637, + -638, -639, -640, -641, -642, -643, -644, -716, -646, -648, + -650, -655, -657, -658, -661, -666, -668, -669, -671, -672, + -673, -716, -715, -350, -715, -58, -351, -352, -322, -323, + -716, -716, -438, -325, -716, -703, -690, -691, -694, -304, + -13, -115, -116, -119, -703, -13, -716, -330, -716, -13, + -635, -635, -716, -678, -571, -574, -575, -576, -577, -13, + -549, -552, -554, -557, -561, -563, -129, -34, -283, -716, + -703, -690, -691, -691, -690, -46, -256, -716, -706, -276, + -40, -204, -41, -205, -69, -42, -207, -43, -206, -71, + -716, -716, -716, -716, -425, -716, -716, -456, -457, -716, + -716, -716, -716, -467, -716, -470, -716, -716, -508, -509, + -513, -514, -402, -527, -116, -528, -716, -412, -392, -416, + -415, -716, -703, -427, -393, -703, -13, -429, -270, -280, + -685, -84, -425, -96, -312, -715, -355, -13, -533, -715, + -534, -535, -253, -716, -703, -716, -615, -616, -716, -617, + -716, -627, -716, -630, -716, -632, -716, -359, -716, -361, + -363, -366, -369, -703, -649, -659, -660, -670, -674, -716, + -353, -716, -716, -324, -326, -716, -716, -13, -425, -716, + -425, -716, -716, -13, -333, -716, -703, -620, -703, -636, + -716, -337, -716, -284, -425, -39, -203, -265, -716, -452, + -454, -461, -464, -473, -703, -703, -474, -480, -716, -485, + -491, -493, -495, -496, -499, -500, -564, -503, -703, -703, + -529, -703, -703, -564, -707, -703, -506, -507, -525, -242, + -13, -64, -258, -676, -676, -676, -374, -376, -376, -376, + -391, -716, -703, -396, -644, -652, -653, -664, -431, -11, + -13, -539, -356, -716, -716, -537, -404, -407, -409, -716, + -676, -656, -661, -675, -619, -620, -620, -647, -620, -620, + -667, -620, -644, -662, -703, -716, -716, -368, -645, -320, + -716, -321, -716, -443, -446, -449, -450, -279, -715, -327, + -329, -607, -716, -335, -609, -716, -611, -613, -612, -573, + -459, -460, -489, -475, -478, -481, -483, -716, -492, -498, + -716, -502, -504, -462, -463, -466, -469, -716, -472, -434, + -716, -371, -372, -373, -382, -384, -716, -387, -716, -389, + -394, -716, -716, -716, -651, -716, -538, -13, -600, -601, + -716, -716, -295, -536, -13, -13, -405, -614, -716, -623, + -716, -625, -716, -628, -716, -631, -633, -360, -362, -364, + -367, -13, -439, -716, -716, -447, -435, -436, -437, -331, + -703, -13, -482, -476, -716, -716, -486, -487, -490, -494, + -497, -501, -676, -654, -375, -376, -376, -376, -376, -665, + -376, -395, -703, -398, -400, -401, -663, -716, -305, -532, + -262, -716, -716, -305, -716, -716, -620, -620, -620, -620, + -716, -716, -715, -13, -444, -445, -448, -610, -716, -716, + -479, -484, -716, -370, -716, -379, -716, -381, -716, -385, + -716, -388, -390, -397, -716, -304, -694, -531, -703, -690, + -691, -694, -304, -408, -410, -716, -621, -624, -626, -629, + -365, -354, -715, -338, -477, -488, -376, -376, -376, -376, + -399, -425, -620, -440, -441, -442, -716, -377, -380, -383, + -386, -622, -376, -378 ] + +clist = [ +'41,394,343,222,544,41,324,324,500,227,124,273,309,401,443,449,288,288', +'288,389,310,565,138,138,279,283,141,141,751,271,230,133,214,41,314,314', +'15,350,339,437,702,15,769,324,324,324,356,357,508,421,422,555,557,560', +'682,272,353,354,889,534,358,41,121,8,492,131,327,496,8,15,334,362,378', +'378,378,825,855,124,574,958,547,550,637,679,554,679,883,120,138,990', +'289,289,289,1078,498,458,682,15,434,275,282,284,846,674,454,985,1080', +'367,830,831,961,4,1109,903,404,405,406,407,892,41,306,987,308,344,341', +'125,666,765,41,979,41,375,379,351,1113,290,290,290,676,595,597,924,938', +'962,941,1115,342,1096,545,340,390,1,505,1112,359,15,578,286,299,300', +'368,708,976,617,15,682,15,863,345,348,366,347,352,352,1064,521,352,959', +'1065,491,502,503,8,838,591,593,596,596,1086,1002,1183,408,415,8,428', +'679,679,428,508,895,1133,1003,986,428,988,391,288,925,939,513,1109,1005', +'942,41,1140,1141,460,309,444,919,920,819,820,669,416,427,750,1051,427', +'1078,352,352,352,352,427,453,1180,994,41,402,1170,409,866,867,869,768', +'822,1115,679,15,985,423,443,449,423,1023,688,824,827,1174,423,288,288', +'346,697,950,987,337,710,1098,288,841,1099,1100,15,420,420,2,1105,606', +'636,324,763,1006,309,990,832,946,947,309,859,973,393,718,395,987,435', +'396,324,397,528,41,455,670,398,41,124,399,531,314,41,400,535,774,779', +'877,537,279,766,745,693,283,432,433,630,987,314,467,969,693,546,456', +'457,562,563,499,289,15,41,685,524,15,213,561,289,690,15,986,568,410', +'981,532,937,937,41,41,1097,937,517,1103,693,519,814,124,518,671,417', +'673,693,823,835,677,772,1036,15,273,1106,1018,1107,1079,960,290,1087', +'516,782,755,782,686,582,290,15,15,306,689,520,764,581,306,982,526,1126', +'987,,501,842,443,449,1136,,,613,504,705,,,804,852,,851,583,809,864,138', +'1097,1097,618,141,,937,901,790,605,,905,923,923,848,923,,624,564,,945', +'862,,629,718,288,1171,,,773,,897,,,444,,,352,,,682,,,659,877,,1097,', +'997,1175,,453,,,1176,665,1091,,580,898,906,910,1041,1042,1043,,624,', +'900,,,679,,324,584,,,800,802,,908,324,805,807,,718,718,535,1004,1067', +'288,,623,41,914,535,,,628,,,314,444,,,,940,,,314,948,444,742,,860,744', +',,455,453,435,,922,,1184,760,,1029,453,15,288,,,41,,848,41,,,937,288', +'668,444,,746,1012,854,,873,875,444,982,,,,,,41,,453,,877,877,767,,453', +'428,,,15,,,15,,,288,428,428,,955,,428,428,,41,,,444,,678,699,41,1039', +'15,1157,,138,427,,,141,,618,754,453,786,,427,427,618,826,1143,427,427', +'1185,,,,840,861,15,,,423,701,659,659,15,,,707,,,423,423,324,,,423,423', +',,1033,1034,,1035,324,787,1088,535,1057,839,,915,795,,618,,,,853,,921', +'314,,,,624,,,629,,,,314,801,803,1081,923,1082,806,808,,,,,,952,,,,,', +'911,,,877,877,,,,799,,,,,,1125,,,,,,,,899,,,,,,618,,,,1090,,,998,,618', +',902,1138,912,,41,,,,420,41,,,,41,1045,1047,1049,,,1014,428,1016,799', +'41,618,,,,,,138,,,,,,,1020,1021,971,15,,,975,,15,955,,955,15,955,427', +'618,,,,,,1038,15,659,,,659,659,,659,,,968,,659,659,659,,,,423,,963,972', +',,,,1069,1071,,1073,1075,41,1076,726,,,,1030,,963,,,41,,1037,,,,1077', +',,,,,,,,352,,,916,1008,,,,,1000,15,965,,,1181,,801,803,808,806,,15,', +'659,,41,,,,,955,41,955,,955,,955,1011,,,,,,693,,1017,1145,1147,1149', +'1151,,1152,,,659,,618,618,,618,826,15,659,,,324,,15,1158,,18,,955,,324', +'18,,1056,41,,963,,,,,,,1137,,,231,,,378,,,,349,41,231,231,231,1059,18', +'315,315,,,,,1166,1167,1168,1169,15,,,1187,1188,1189,1190,,,,916,352', +',,,726,,18,,1193,15,,231,231,1063,,231,363,373,373,17,,,,,17,,,,324', +',659,,,,,654,,,,1119,,1191,,,,,1124,,,,1121,,17,,,,378,,,,41,,,1132', +'18,726,726,41,41,231,231,231,231,18,,18,1134,1135,,,17,965,,,41,965', +',965,659,965,,,,,41,,15,659,659,,,,,15,15,1153,,,954,,288,,,,,1172,', +',,,15,,444,418,431,,,,980,,15,,,,453,658,41,,17,453,964,,659,,,659,', +'17,,17,,618,,,,,,,18,231,425,231,231,425,231,726,,726,,425,231,231,15', +',,,,,,,,,,18,,965,,965,,965,,965,352,352,,,,,,510,,512,,,514,515,40', +',,,,40,,,,,,654,654,231,231,,,,,,,965,231,,,,17,,17,,,17,,40,313,313', +',17,,,18,,,,18,,,,315,18,,17,,,657,,,,,,,40,,,,315,,,,,,361,377,377', +'377,,,18,,,,,,,,,,,,,,,231,18,18,,,1102,,,,954,,954,726,954,,,,,,658', +'658,231,17,,,,17,40,609,,,17,956,,,,40,231,40,,,964,,964,,,,,,,,,983', +',,983,,,,17,,,,,,726,,,,,,,,,,17,17,,907,,,,,,,,654,,,654,654,,654,', +',,,654,654,654,,,,,,,,231,,954,,954,,954,,954,680,,349,,683,40,,,,,', +',,,,,,,,,,,,,,964,,,657,657,40,,,,,954,,957,,,,680,,,349,,18,,,654,', +',,,315,,231,,,431,,,315,656,989,,991,,,,658,231,,658,658,,658,,,,654', +'658,658,658,,,18,,654,18,,,,40,,,231,40,,,,313,40,788,,,231,,,,18,983', +'680,349,,956,,956,313,956,17,,,,,,,,,,40,,,,,,,18,,,425,231,,,18,,40', +'40,,658,425,425,655,,,425,425,,,,17,,,17,,680,,,,,,,,,849,,,850,,,658', +'654,,,17,,,,658,,,,,,,657,858,,657,657,,657,,,,,657,657,657,,,17,,,17', +'956,315,956,17,956,,956,,884,17,17,,315,,17,17,,,,,,,,1108,654,1110', +',,,,656,656,,654,654,,,,,,,,956,,,1127,,1128,,1129,,,,,,,,,,657,,,,', +',,658,913,,,,,,,18,,,,654,18,231,654,,18,,,,,,,657,,40,18,,,,,657,,313', +',,,,,,,313,,,425,,,,,,,,655,655,1177,,1178,658,1179,,,,,,,40,658,658', +'40,,,,,,,1182,,,,,,17,,,,,17,993,,40,17,,,18,,,1192,,,,17,,,,18,,,1007', +',,,658,,,658,,40,,17,653,,,,40,657,,,,349,,656,,31,656,656,,656,31,231', +',,656,656,656,18,,,,,,18,,31,,,,,,,,,31,31,31,,31,,17,,,,,,,,,,,17,', +',,657,,,,,,,,,657,657,31,,313,,18,31,31,,,31,,,,313,,,656,,,1054,,,', +',18,17,655,,1060,655,655,17,655,,,,,655,655,655,,,,657,,,657,656,652', +',,,,,,656,,,31,,,,,31,31,31,31,31,,31,,,,,,40,,,17,,40,,,,40,,,,,,,', +',,40,,,,17,,,,,,,655,,1116,653,653,,18,,,,,,,18,18,,,,,,,,,651,,,,,', +',18,655,231,231,,,,,,655,18,,,656,,,,31,31,31,31,31,31,31,,,40,,31,31', +'31,,,,,,,40,,231,,,31,,,,,,,,17,,18,,,,,17,17,,,,,,,,,,,,,656,,,17,', +',40,31,31,656,656,,40,17,,,31,,,,,,,,652,652,,,,,,655,,,31,,,,31,,,', +',31,,,,,,,,,,,656,17,,656,,40,,,,,,,,,,653,,31,653,653,377,653,,,,40', +'653,653,653,1058,,,31,31,31,655,,,,,,,,,655,655,,,,,651,651,,31,,,,28', +',,,,28,,,,,,,31,,,,,,,,28,,,,,,,,,28,28,28,655,28,,655,,653,,,,,,,,', +',,,,,377,,,,40,,,,,,28,40,40,,,28,28,653,,28,,,,,,653,,,40,652,,31,652', +'652,,652,,,40,,652,652,652,,,,,,,,,,,,,,,,,,,,,,,,,,28,,,,,28,28,28', +'28,28,,28,40,,,,,,31,,,,,,,,,,31,,,,,,,,,,,,652,651,,31,651,651,,651', +',,653,,651,651,651,,,,31,,,31,,,,,,,31,,,652,,,,,,,31,652,,,31,,,,,', +',,,,,,28,28,28,28,28,28,28,,,,,28,28,28,653,31,,,31,31,,,31,653,653', +'28,651,,31,31,,,,31,31,,,,,,,,,,,,,,,,,,,,,,,651,,,,28,28,,,651,,,653', +',28,653,,,,,,19,652,,,,19,,,,,,28,,,,28,,,,,28,,,,,,,,,,,,,19,317,317', +',,,,,,,,,,,,28,,,,,,,,,,,652,,19,,28,28,28,,,652,652,,365,374,374,,', +',,,,,651,,,28,,,,,,31,,,,,31,31,,,31,28,,,,,,,,,31,,,,652,,,652,,,19', +',,,,,,,31,19,,19,,,,,,,,,651,,,,,,,,,651,651,,,,,,,,,,,,,,,,,,,,,28', +',,,,,31,,,,,,,,,,,31,,,,,,651,,,651,,,,,,,,,,,,,,,,,19,,426,,,426,,', +'31,,,426,28,,31,,,,,,31,,28,,,19,,,,,,,,,,,,28,,,,,,,,,,,,,,,28,,,28', +',,,,,,28,,,,,31,,,,,28,,,,28,,,,,,,,,,,31,19,,,,19,,,,317,19,,,,,,28', +',,28,28,,,28,,,317,,,28,28,,,,28,28,,,19,,,,,,,,,,,,,,,,19,19,,,,,,', +',,,,,,,,,,,,,,,,,,,,,,,,,31,,,,,,,31,31,,,,,,,,,,,,,,,,31,,31,31,,,', +',,,31,,,,,,,,,,,,,,,,,,,,,,,,,,,,,31,,,,,,,,,,,,,31,,,,,28,,,,,28,28', +',,28,,,,,,,,,,28,,,,,,,,,,,,,,,,,,28,,,,,,,,,,19,,,,,,,,317,,,,,,,,317', +',,,,,,,,,,,,,,,,,,,,,,28,19,,,19,,,,,,,28,,,,,,,,,,,,,,19,,,,,,,778', +',,,,,,,,,,,,28,,,,,,28,19,,,426,,28,,19,,,,,,426,426,,,,426,426,,,,', +',,,,,,,,,,,,,,,,,,,,,,238,,,,,,28,,,287,287,287,,,,,,,,,,332,333,,335', +'336,28,338,,,,,,317,,,,,,,,,287,287,317,,,,,,,,,,,,,,,,,,,,,,,,,,,,', +',,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,19,,,,,19,,28,,19,,,,,28,28,,,,19,', +',,,,,,,,,,28,,28,28,,,426,,,,28,,,,,,,,,,,,,,,,,,,,,,,,,,,,,28,,,,,', +',,,,,,,28,,,19,,287,430,,,436,287,,,,19,436,,,,,,,,,,,,,238,,,,468,469', +'470,471,472,473,474,475,476,477,478,479,480,481,482,483,484,485,486', +'487,488,489,19,,,,490,,19,,,,,287,287,,,,,,,,287,,,,,,,287,,287,,,287', +'287,,,,,,,,,,,,,,,,,,,,19,,,,,,,,,,,,,,,374,,,,540,19,541,,,1062,,,', +',,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,', +',,,,,287,,374,,,,19,,,,,,,19,19,,,,,,,,,,,,,,,,19,,,,,,,,,,19,,,287', +',436,436,436,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,333,,,,19,,,,,,287,,287,', +'287,,,,,,,,,,,,,,,,287,,,,,,,,,436,,,700,,,,,,,,,287,,,287,,,,,,,,,', +',,,,,287,287,,,,,,,,,,287,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,287,436,287', +',,,796,,,287,287,436,436,,,,436,436,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,', +',,,,,,,,,,,,287,,,,,,,,,287,,,287,,,,,,,,,,,,,,,,,,,287,,,,,,,,,,,,', +',,,,,,,,,,,,,,287,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,', +',,,,,,,,287,,,,,,,,436,,,,,,,,,,,,,436,436,436,436,,,,,,,,,,,,,,,,,', +',,,,,949,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,287,,,,,,,,,,,,,,,,', +',,,287,,,,,,,,,,,,,,,,,,,,,287,436,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,', +',,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,', +',,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,', +',,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,287' ] + racc_goto_table = arr = ::Array.new(4242, nil) + idx = 0 + clist.each do |str| + str.split(',', -1).each do |i| + arr[idx] = i.to_i unless i.empty? + idx += 1 + end + end + +clist = [ +'63,190,78,33,10,63,74,74,83,35,108,33,11,190,46,46,42,42,42,66,59,103', +'67,67,82,82,69,69,104,150,22,17,17,63,63,63,23,98,35,31,12,23,111,74', +'74,74,39,39,85,24,24,100,101,101,227,45,19,19,102,61,19,63,7,8,46,9', +'60,48,8,23,72,63,63,63,63,178,13,108,64,137,80,80,37,86,80,86,125,5', +'67,223,79,79,79,123,31,57,227,23,28,47,47,47,139,49,28,217,126,23,192', +'192,141,2,224,118,19,19,19,19,13,63,55,219,56,79,8,6,153,117,63,141', +'63,65,65,116,143,81,81,81,153,203,203,167,167,135,167,144,115,184,114', +'113,112,1,57,142,5,23,107,54,54,54,21,145,146,32,23,227,23,148,81,81', +'105,97,26,26,151,57,26,138,152,154,156,157,8,160,204,204,204,204,161', +'162,163,8,11,8,20,86,86,20,85,164,165,166,138,20,138,96,42,169,169,190', +'224,168,169,63,184,184,33,11,82,171,173,174,175,84,22,22,103,141,22', +'123,26,26,26,26,22,67,143,125,63,6,126,2,131,131,131,10,179,144,86,23', +'217,23,46,46,23,183,61,180,181,184,23,42,42,77,61,139,219,75,149,186', +'42,49,187,188,23,79,79,3,137,70,31,74,64,169,11,223,194,192,192,11,195', +'196,199,213,200,219,71,201,74,202,33,63,71,51,205,63,108,206,35,63,63', +'207,59,208,209,124,33,82,212,40,46,82,26,26,57,219,63,38,14,46,35,26', +'26,11,11,79,79,23,63,16,60,23,18,19,79,31,23,138,33,27,221,72,191,191', +'63,63,183,191,7,222,46,9,32,108,8,57,25,57,46,32,64,57,121,178,23,33', +'138,122,138,127,128,81,13,5,204,31,204,57,120,81,23,23,55,57,56,31,119', +'55,191,56,138,219,,54,83,46,46,167,,,33,54,57,,,48,32,,61,45,48,149', +'67,183,183,35,69,,191,10,31,17,,10,37,37,85,37,,82,5,,37,80,,82,213', +'42,102,,,57,,101,,,82,,,26,,,227,,,63,124,,183,,124,183,,67,,,138,35', +'111,,26,32,149,149,131,131,131,,82,,32,,,86,,74,26,,,28,28,,83,74,28', +'28,,213,213,59,37,131,42,,47,63,32,59,,,47,,,63,82,,,,64,,,63,100,82', +'11,,24,11,,,71,67,71,,32,,13,39,,37,67,23,42,,,63,,85,63,,,191,42,47', +'82,,108,10,57,,216,216,82,191,,,,,,63,,67,,124,124,108,,67,20,,,23,', +',23,,,42,20,20,,132,,20,20,,63,,,82,,81,71,63,10,23,12,,67,22,,,69,', +'35,79,67,17,,22,22,35,35,131,22,22,104,,,,98,78,23,,,23,26,63,63,23', +',,81,,,23,23,74,,,23,23,,,32,32,,32,74,8,103,59,101,150,,28,8,,35,,', +',59,,57,63,,,,82,,,82,,,,63,71,71,101,37,101,71,71,,,,,,57,,,,,,66,', +',124,124,,,,81,,,,,,10,,,,,,,,11,,,,,,35,,,,83,,,57,,35,,19,10,11,,63', +',,,79,63,,,,63,134,134,134,,,57,20,57,81,63,35,,,,,,67,,,,,,,57,57,78', +'23,,,78,,23,132,,132,23,132,22,35,,,,,,57,23,63,,,63,63,,63,,,11,,63', +'63,63,,,,23,,35,11,,,,,216,216,,216,216,63,216,218,,,,190,,35,,,63,', +'190,,,,57,,,,,,,,,26,,,71,11,,,,,19,23,220,,,32,,71,71,71,71,,23,,63', +',63,,,,,132,63,132,,132,,132,108,,,,,,46,,108,134,134,134,134,,134,', +',63,,35,35,,35,35,23,63,,,74,,23,31,,30,,132,,74,30,,11,63,,35,,,,,', +',57,,,30,,,63,,,,76,63,30,30,30,63,30,30,30,,,,,216,216,216,216,23,', +',134,134,134,134,,,,71,26,,,,218,,30,,134,23,,30,30,23,,30,30,30,30', +'29,,,,,29,,,,74,,63,,,,,91,,,,11,,216,,,,,11,,,,33,,29,,,,63,,,,63,', +',11,30,218,218,63,63,30,30,30,30,30,,30,19,19,,,29,220,,,63,220,,220', +'63,220,,,,,63,,23,63,63,,,,,23,23,35,,,130,,42,,,,,11,,,,,23,,82,76', +'76,,,,130,,23,,,,67,95,63,,29,67,218,,63,,,63,,29,,29,,35,,,,,,,30,30', +'30,30,30,30,30,218,,218,,30,30,30,23,,,,,,,,,,,30,,220,,220,,220,,220', +'26,26,,,,,,76,,76,,,76,76,62,,,,,62,,,,,,91,91,30,30,,,,,,,220,30,,', +',29,,29,,,29,,62,62,62,,29,,,30,,,,30,,,,30,30,,29,,,94,,,,,,,62,,,', +'30,,,,,,62,62,62,62,,,30,,,,,,,,,,,,,,,30,30,30,,,130,,,,130,,130,218', +'130,,,,,,95,95,30,29,,,,29,62,76,,,29,133,,,,62,30,62,,,218,,218,,,', +',,,,,133,,,133,,,,29,,,,,,218,,,,,,,,,,29,29,,136,,,,,,,,91,,,91,91', +',91,,,,,91,91,91,,,,,,,,30,,130,,130,,130,,130,76,,76,,76,62,,,,,,,', +',,,,,,,,,,,,218,,,94,94,62,,,,,130,,136,,,,76,,,76,,30,,,91,,,,,30,', +'30,,,76,,,30,93,136,,136,,,,95,30,,95,95,,95,,,,91,95,95,95,,,30,,91', +'30,,,,62,,,30,62,,,,62,62,76,,,30,,,,30,133,76,76,,133,,133,62,133,29', +',,,,,,,,,62,,,,,,,30,,,30,30,,,30,,62,62,,95,30,30,92,,,30,30,,,,29', +',,29,,76,,,,,,,,,76,,,76,,,95,91,,,29,,,,95,,,,,,,94,76,,94,94,,94,', +',,,94,94,94,,,29,,,29,133,30,133,29,133,,133,,76,29,29,,30,,29,29,,', +',,,,,136,91,136,,,,,93,93,,91,91,,,,,,,,133,,,136,,136,,136,,,,,,,,', +',94,,,,,,,95,76,,,,,,,30,,,,91,30,30,91,,30,,,,,,,94,,62,30,,,,,94,', +'62,,,,,,,,62,,,30,,,,,,,,92,92,136,,136,95,136,,,,,,,62,95,95,62,,,', +',,,136,,,,,,29,,,,,29,76,,62,29,,,30,,,136,,,,29,,,,30,,,76,,,,95,,', +'95,,62,,29,90,,,,62,94,,,,76,,93,,53,93,93,,93,53,30,,,93,93,93,30,', +',,,,30,,53,,,,,,,,,53,53,53,,53,,29,,,,,,,,,,,29,,,,94,,,,,,,,,94,94', +'53,,62,,30,53,53,,,53,,,,62,,,93,,,30,,,,,30,29,92,,30,92,92,29,92,', +',,,92,92,92,,,,94,,,94,93,89,,,,,,,93,,,53,,,,,53,53,53,53,53,,53,,', +',,,62,,,29,,62,,,,62,,,,,,,,,,62,,,,29,,,,,,,92,,30,90,90,,30,,,,,,', +'30,30,,,,,,,,,88,,,,,,,30,92,30,30,,,,,,92,30,,,93,,,,53,53,53,53,53', +'53,53,,,62,,53,53,53,,,,,,,62,,30,,,53,,,,,,,,29,,30,,,,,29,29,,,,,', +',,,,,,,93,,,29,,,62,53,53,93,93,,62,29,,,53,,,,,,,,89,89,,,,,,92,,,53', +',,,53,,,,,53,,,,,,,,,,,93,29,,93,,62,,,,,,,,,,90,,53,90,90,62,90,,,', +'62,90,90,90,62,,,53,53,53,92,,,,,,,,,92,92,,,,,88,88,,53,,,,50,,,,,50', +',,,,,,53,,,,,,,,50,,,,,,,,,50,50,50,92,50,,92,,90,,,,,,,,,,,,,,62,,', +',62,,,,,,50,62,62,,,50,50,90,,50,,,,,,90,,,62,89,,53,89,89,,89,,,62', +',89,89,89,,,,,,,,,,,,,,,,,,,,,,,,,,50,,,,,50,50,50,50,50,,50,62,,,,', +',53,,,,,,,,,,53,,,,,,,,,,,,89,88,,53,88,88,,88,,,90,,88,88,88,,,,53', +',,53,,,,,,,53,,,89,,,,,,,53,89,,,53,,,,,,,,,,,,50,50,50,50,50,50,50', +',,,,50,50,50,90,53,,,53,53,,,53,90,90,50,88,,53,53,,,,53,53,,,,,,,,', +',,,,,,,,,,,,,,88,,,,50,50,,,88,,,90,,50,90,,,,,,34,89,,,,34,,,,,,50', +',,,50,,,,,50,,,,,,,,,,,,,34,34,34,,,,,,,,,,,,,50,,,,,,,,,,,89,,34,,50', +'50,50,,,89,89,,34,34,34,,,,,,,,88,,,50,,,,,,53,,,,,53,53,,,53,50,,,', +',,,,,53,,,,89,,,89,,,34,,,,,,,,53,34,,34,,,,,,,,,88,,,,,,,,,88,88,,', +',,,,,,,,,,,,,,,,,,50,,,,,,53,,,,,,,,,,,53,,,,,,88,,,88,,,,,,,,,,,,,', +',,,34,,34,,,34,,,53,,,34,50,,53,,,,,,53,,50,,,34,,,,,,,,,,,,50,,,,,', +',,,,,,,,,50,,,50,,,,,,,50,,,,,53,,,,,50,,,,50,,,,,,,,,,,53,34,,,,34', +',,,34,34,,,,,,50,,,50,50,,,50,,,34,,,50,50,,,,50,50,,,34,,,,,,,,,,,', +',,,,34,34,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,53,,,,,,,53,53,,,,,,,,,,,,', +',,,53,,53,53,,,,,,,53,,,,,,,,,,,,,,,,,,,,,,,,,,,,,53,,,,,,,,,,,,,53', +',,,,50,,,,,50,50,,,50,,,,,,,,,,50,,,,,,,,,,,,,,,,,,50,,,,,,,,,,34,,', +',,,,,34,,,,,,,,34,,,,,,,,,,,,,,,,,,,,,,,50,34,,,34,,,,,,,50,,,,,,,,', +',,,,,34,,,,,,,34,,,,,,,,,,,,,50,,,,,,50,34,,,34,,50,,34,,,,,,34,34,', +',,34,34,,,,,,,,,,,,,,,,,,,,,,,,,,,36,,,,,,50,,,36,36,36,,,,,,,,,,36', +'36,,36,36,50,36,,,,,,34,,,,,,,,,36,36,34,,,,,,,,,,,,,,,,,,,,,,,,,,,', +',,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,34,,,,,34,,50,,34,,,,,50,50,,,,34', +',,,,,,,,,,,50,,50,50,,,34,,,,50,,,,,,,,,,,,,,,,,,,,,,,,,,,,,50,,,,,', +',,,,,,,50,,,34,,36,36,,,36,36,,,,34,36,,,,,,,,,,,,,36,,,,36,36,36,36', +'36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,34,,,,36,,34,', +',,,36,36,,,,,,,,36,,,,,,,36,,36,,,36,36,,,,,,,,,,,,,,,,,,,,34,,,,,,', +',,,,,,,,34,,,,36,34,36,,,34,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,', +',,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,36,,34,,,,34,,,,,,,34,34,,,,,,,', +',,,,,,,,34,,,,,,,,,,34,,,36,,36,36,36,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,', +'36,,,,34,,,,,,36,,36,,36,,,,,,,,,,,,,,,,36,,,,,,,,,36,,,36,,,,,,,,,36', +',,36,,,,,,,,,,,,,,,36,36,,,,,,,,,,36,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,', +',36,36,36,,,,36,,,36,36,36,36,,,,36,36,,,,,,,,,,,,,,,,,,,,,,,,,,,,,', +',,,,,,,,,,,,,,,36,,,,,,,,,36,,,36,,,,,,,,,,,,,,,,,,,36,,,,,,,,,,,,,', +',,,,,,,,,,,,,36,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,', +',,,,,,36,,,,,,,,36,,,,,,,,,,,,,36,36,36,36,,,,,,,,,,,,,,,,,,,,,,,36', +',,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,36,,,,,,,,,,,,,,,,,,,,36,,,,', +',,,,,,,,,,,,,,,,36,36,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,', +',,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,', +',,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,', +',,,,,,,,,,,,,,,,,,,36' ] + racc_goto_check = arr = ::Array.new(4242, nil) + idx = 0 + clist.each do |str| + str.split(',', -1).each do |i| + arr[idx] = i.to_i unless i.empty? + idx += 1 + end + end + +racc_goto_pointer = [ + nil, 151, 109, 277, nil, 82, 118, 57, 61, 56, + -336, -23, -503, -626, -527, nil, -178, 21, 331, -12, + -23, 87, 8, 34, -167, 150, 104, 216, -122, 1012, + 938, -182, -274, -15, 2489, -12, 3121, -385, 85, -24, + -242, nil, -15, nil, nil, 29, -208, 71, -208, -399, + 2199, -192, nil, 1821, 126, 85, 87, -133, nil, -16, + 29, -269, 1199, -2, -293, 57, -57, 12, nil, 16, + -135, 76, 25, nil, -30, 219, 902, 199, -62, 59, + -264, 104, -4, -268, -269, -242, -424, nil, 1545, 1465, + 1343, 563, 1094, 1005, 788, 663, 129, 106, -29, nil, + -300, -301, -684, -338, -536, 97, nil, -219, 5, nil, + nil, -540, 74, 87, -193, 83, 66, -451, -654, 17, + -1, -211, -534, -902, -412, -641, -890, -616, -465, nil, + 258, -469, -244, 480, -189, -702, 601, -766, -668, -573, + nil, -735, -899, -918, -907, -395, -701, nil, -541, -288, + 5, -803, -800, -365, -91, nil, -100, -100, nil, nil, + -484, -820, -706, -982, -553, -882, -694, -678, -684, -612, + nil, -596, nil, -596, -421, -420, nil, nil, -569, -397, + -387, -387, nil, -671, -880, nil, -759, -756, -755, nil, + -86, -467, -541, nil, -374, -413, -568, nil, nil, 207, + 204, 206, 207, -258, -211, 211, 213, 216, -275, -275, + nil, nil, -261, -263, nil, nil, -146, -765, 290, -749, + 36, -515, -681, -783, -934, nil, nil, -455 ] + +racc_goto_default = [ + nil, nil, nil, nil, 5, nil, 6, 360, 304, nil, + nil, 543, nil, 890, nil, 301, 302, nil, nil, nil, + 13, 14, 20, 236, nil, nil, 16, nil, 424, 237, + 331, nil, nil, 576, 235, 459, 23, 1022, nil, nil, + nil, 355, 24, 25, 26, nil, 696, nil, nil, nil, + 321, nil, 27, 318, 438, 34, nil, nil, 36, 39, + 38, nil, 232, 233, 372, nil, 140, 446, 139, 84, + nil, 429, 100, 48, 51, 269, 293, nil, 856, 439, + nil, 440, 451, nil, 625, 506, 291, 277, 52, 53, + 54, 55, 56, 57, 58, 59, 60, nil, 278, 66, + nil, nil, nil, nil, nil, nil, 74, nil, 558, 75, + 76, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 879, 725, nil, 880, 881, 1104, 953, + 712, nil, 713, 714, nil, nil, 715, nil, 717, nil, + 844, nil, nil, nil, 723, nil, nil, 556, nil, nil, + nil, nil, nil, nil, nil, 450, nil, nil, 675, 667, + nil, nil, nil, nil, nil, nil, nil, nil, 927, nil, + 638, 647, 639, 640, nil, nil, 641, 642, nil, nil, + nil, nil, 926, 928, nil, 930, 931, 932, 933, 934, + nil, 734, 646, 648, nil, nil, nil, 83, 85, 86, + nil, nil, nil, nil, 586, nil, nil, nil, nil, nil, + 96, 97, nil, 984, 771, 711, 871, 716, 992, 728, + 730, 731, 966, 735, 967, 738, 741, 296 ] + +racc_reduce_table = [ + 0, 0, :racc_error, + 0, 150, :_reduce_1, + 2, 148, :_reduce_2, + 2, 149, :_reduce_3, + 0, 151, :_reduce_4, + 1, 151, :_reduce_5, + 3, 151, :_reduce_6, + 2, 151, :_reduce_7, + 1, 153, :_reduce_none, + 2, 153, :_reduce_9, + 3, 156, :_reduce_10, + 4, 157, :_reduce_11, + 2, 158, :_reduce_12, + 0, 162, :_reduce_13, + 1, 162, :_reduce_14, + 3, 162, :_reduce_15, + 2, 162, :_reduce_16, + 1, 163, :_reduce_none, + 2, 163, :_reduce_18, + 0, 174, :_reduce_19, + 4, 155, :_reduce_20, + 3, 155, :_reduce_21, + 3, 155, :_reduce_22, + 3, 155, :_reduce_23, + 2, 155, :_reduce_24, + 3, 155, :_reduce_25, + 3, 155, :_reduce_26, + 3, 155, :_reduce_27, + 3, 155, :_reduce_28, + 3, 155, :_reduce_29, + 4, 155, :_reduce_30, + 1, 155, :_reduce_none, + 3, 155, :_reduce_32, + 3, 155, :_reduce_33, + 5, 155, :_reduce_34, + 3, 155, :_reduce_35, + 1, 155, :_reduce_none, + 3, 167, :_reduce_37, + 3, 167, :_reduce_38, + 6, 167, :_reduce_39, + 5, 167, :_reduce_40, + 5, 167, :_reduce_41, + 5, 167, :_reduce_42, + 5, 167, :_reduce_43, + 3, 167, :_reduce_44, + 1, 175, :_reduce_none, + 3, 175, :_reduce_46, + 1, 175, :_reduce_none, + 1, 173, :_reduce_none, + 3, 173, :_reduce_49, + 3, 173, :_reduce_50, + 3, 173, :_reduce_51, + 2, 173, :_reduce_52, + 0, 185, :_reduce_53, + 4, 173, :_reduce_54, + 1, 173, :_reduce_none, + 1, 166, :_reduce_none, + 0, 188, :_reduce_57, + 3, 186, :_reduce_58, + 1, 169, :_reduce_none, + 1, 169, :_reduce_none, + 1, 190, :_reduce_none, + 4, 190, :_reduce_62, + 0, 198, :_reduce_63, + 4, 195, :_reduce_64, + 1, 197, :_reduce_none, + 2, 189, :_reduce_66, + 3, 189, :_reduce_67, + 4, 189, :_reduce_68, + 5, 189, :_reduce_69, + 4, 189, :_reduce_70, + 5, 189, :_reduce_71, + 2, 189, :_reduce_72, + 2, 189, :_reduce_73, + 2, 189, :_reduce_74, + 2, 189, :_reduce_75, + 2, 189, :_reduce_76, + 1, 168, :_reduce_77, + 3, 168, :_reduce_78, + 1, 203, :_reduce_79, + 3, 203, :_reduce_80, + 1, 202, :_reduce_none, + 2, 202, :_reduce_82, + 3, 202, :_reduce_83, + 5, 202, :_reduce_84, + 2, 202, :_reduce_85, + 4, 202, :_reduce_86, + 2, 202, :_reduce_87, + 4, 202, :_reduce_88, + 1, 202, :_reduce_89, + 3, 202, :_reduce_90, + 1, 206, :_reduce_none, + 3, 206, :_reduce_92, + 2, 205, :_reduce_93, + 3, 205, :_reduce_94, + 1, 208, :_reduce_95, + 3, 208, :_reduce_96, + 1, 207, :_reduce_97, + 1, 207, :_reduce_98, + 4, 207, :_reduce_99, + 3, 207, :_reduce_100, + 3, 207, :_reduce_101, + 3, 207, :_reduce_102, + 3, 207, :_reduce_103, + 2, 207, :_reduce_104, + 1, 207, :_reduce_105, + 1, 170, :_reduce_106, + 1, 170, :_reduce_107, + 4, 170, :_reduce_108, + 3, 170, :_reduce_109, + 3, 170, :_reduce_110, + 3, 170, :_reduce_111, + 3, 170, :_reduce_112, + 2, 170, :_reduce_113, + 1, 170, :_reduce_114, + 1, 211, :_reduce_115, + 1, 211, :_reduce_none, + 2, 212, :_reduce_117, + 1, 212, :_reduce_118, + 3, 212, :_reduce_119, + 1, 213, :_reduce_none, + 1, 213, :_reduce_none, + 1, 213, :_reduce_none, + 1, 213, :_reduce_none, + 1, 213, :_reduce_none, + 1, 164, :_reduce_125, + 1, 164, :_reduce_none, + 1, 165, :_reduce_127, + 0, 217, :_reduce_128, + 4, 165, :_reduce_129, + 1, 214, :_reduce_none, + 1, 214, :_reduce_none, + 1, 214, :_reduce_none, + 1, 214, :_reduce_none, + 1, 214, :_reduce_none, + 1, 214, :_reduce_none, + 1, 214, :_reduce_none, + 1, 214, :_reduce_none, + 1, 214, :_reduce_none, + 1, 214, :_reduce_none, + 1, 214, :_reduce_none, + 1, 214, :_reduce_none, + 1, 214, :_reduce_none, + 1, 214, :_reduce_none, + 1, 214, :_reduce_none, + 1, 214, :_reduce_none, + 1, 214, :_reduce_none, + 1, 214, :_reduce_none, + 1, 214, :_reduce_none, + 1, 214, :_reduce_none, + 1, 214, :_reduce_none, + 1, 214, :_reduce_none, + 1, 214, :_reduce_none, + 1, 214, :_reduce_none, + 1, 214, :_reduce_none, + 1, 214, :_reduce_none, + 1, 214, :_reduce_none, + 1, 214, :_reduce_none, + 1, 214, :_reduce_none, + 1, 214, :_reduce_none, + 1, 215, :_reduce_none, + 1, 215, :_reduce_none, + 1, 215, :_reduce_none, + 1, 215, :_reduce_none, + 1, 215, :_reduce_none, + 1, 215, :_reduce_none, + 1, 215, :_reduce_none, + 1, 215, :_reduce_none, + 1, 215, :_reduce_none, + 1, 215, :_reduce_none, + 1, 215, :_reduce_none, + 1, 215, :_reduce_none, + 1, 215, :_reduce_none, + 1, 215, :_reduce_none, + 1, 215, :_reduce_none, + 1, 215, :_reduce_none, + 1, 215, :_reduce_none, + 1, 215, :_reduce_none, + 1, 215, :_reduce_none, + 1, 215, :_reduce_none, + 1, 215, :_reduce_none, + 1, 215, :_reduce_none, + 1, 215, :_reduce_none, + 1, 215, :_reduce_none, + 1, 215, :_reduce_none, + 1, 215, :_reduce_none, + 1, 215, :_reduce_none, + 1, 215, :_reduce_none, + 1, 215, :_reduce_none, + 1, 215, :_reduce_none, + 1, 215, :_reduce_none, + 1, 215, :_reduce_none, + 1, 215, :_reduce_none, + 1, 215, :_reduce_none, + 1, 215, :_reduce_none, + 1, 215, :_reduce_none, + 1, 215, :_reduce_none, + 1, 215, :_reduce_none, + 1, 215, :_reduce_none, + 1, 215, :_reduce_none, + 1, 215, :_reduce_none, + 3, 183, :_reduce_201, + 3, 183, :_reduce_202, + 6, 183, :_reduce_203, + 5, 183, :_reduce_204, + 5, 183, :_reduce_205, + 5, 183, :_reduce_206, + 5, 183, :_reduce_207, + 4, 183, :_reduce_208, + 3, 183, :_reduce_209, + 3, 183, :_reduce_210, + 3, 183, :_reduce_211, + 2, 183, :_reduce_212, + 2, 183, :_reduce_213, + 2, 183, :_reduce_214, + 2, 183, :_reduce_215, + 3, 183, :_reduce_216, + 3, 183, :_reduce_217, + 3, 183, :_reduce_218, + 3, 183, :_reduce_219, + 3, 183, :_reduce_220, + 3, 183, :_reduce_221, + 4, 183, :_reduce_222, + 2, 183, :_reduce_223, + 2, 183, :_reduce_224, + 3, 183, :_reduce_225, + 3, 183, :_reduce_226, + 3, 183, :_reduce_227, + 3, 183, :_reduce_228, + 1, 183, :_reduce_none, + 3, 183, :_reduce_230, + 3, 183, :_reduce_231, + 3, 183, :_reduce_232, + 3, 183, :_reduce_233, + 3, 183, :_reduce_234, + 2, 183, :_reduce_235, + 2, 183, :_reduce_236, + 3, 183, :_reduce_237, + 3, 183, :_reduce_238, + 3, 183, :_reduce_239, + 3, 183, :_reduce_240, + 3, 183, :_reduce_241, + 6, 183, :_reduce_242, + 1, 183, :_reduce_none, + 1, 222, :_reduce_none, + 1, 222, :_reduce_none, + 1, 222, :_reduce_none, + 1, 222, :_reduce_none, + 3, 220, :_reduce_248, + 3, 220, :_reduce_249, + 1, 223, :_reduce_none, + 1, 224, :_reduce_none, + 2, 224, :_reduce_none, + 4, 224, :_reduce_253, + 2, 224, :_reduce_254, + 1, 218, :_reduce_none, + 3, 218, :_reduce_256, + 3, 229, :_reduce_257, + 5, 229, :_reduce_258, + 3, 229, :_reduce_259, + 0, 231, :_reduce_260, + 1, 231, :_reduce_none, + 0, 178, :_reduce_262, + 1, 178, :_reduce_none, + 2, 178, :_reduce_none, + 4, 178, :_reduce_265, + 2, 178, :_reduce_266, + 1, 201, :_reduce_267, + 2, 201, :_reduce_268, + 2, 201, :_reduce_269, + 4, 201, :_reduce_270, + 1, 201, :_reduce_271, + 0, 234, :_reduce_272, + 2, 194, :_reduce_273, + 2, 233, :_reduce_274, + 2, 232, :_reduce_275, + 0, 232, :_reduce_276, + 1, 226, :_reduce_277, + 2, 226, :_reduce_278, + 3, 226, :_reduce_279, + 4, 226, :_reduce_280, + 1, 172, :_reduce_281, + 1, 172, :_reduce_none, + 3, 171, :_reduce_283, + 4, 171, :_reduce_284, + 2, 171, :_reduce_285, + 1, 221, :_reduce_none, + 1, 221, :_reduce_none, + 1, 221, :_reduce_none, + 1, 221, :_reduce_none, + 1, 221, :_reduce_none, + 1, 221, :_reduce_none, + 1, 221, :_reduce_none, + 1, 221, :_reduce_none, + 1, 221, :_reduce_none, + 1, 221, :_reduce_none, + 1, 221, :_reduce_296, + 0, 260, :_reduce_297, + 4, 221, :_reduce_298, + 0, 261, :_reduce_299, + 4, 221, :_reduce_300, + 0, 262, :_reduce_301, + 4, 221, :_reduce_302, + 3, 221, :_reduce_303, + 3, 221, :_reduce_304, + 2, 221, :_reduce_305, + 3, 221, :_reduce_306, + 3, 221, :_reduce_307, + 1, 221, :_reduce_308, + 4, 221, :_reduce_309, + 3, 221, :_reduce_310, + 1, 221, :_reduce_311, + 5, 221, :_reduce_312, + 4, 221, :_reduce_313, + 3, 221, :_reduce_314, + 2, 221, :_reduce_315, + 1, 221, :_reduce_none, + 2, 221, :_reduce_317, + 0, 263, :_reduce_318, + 3, 221, :_reduce_319, + 6, 221, :_reduce_320, + 6, 221, :_reduce_321, + 4, 221, :_reduce_322, + 4, 221, :_reduce_323, + 5, 221, :_reduce_324, + 4, 221, :_reduce_325, + 5, 221, :_reduce_326, + 6, 221, :_reduce_327, + 0, 264, :_reduce_328, + 6, 221, :_reduce_329, + 0, 265, :_reduce_330, + 7, 221, :_reduce_331, + 0, 266, :_reduce_332, + 5, 221, :_reduce_333, + 0, 267, :_reduce_334, + 6, 221, :_reduce_335, + 0, 268, :_reduce_336, + 0, 269, :_reduce_337, + 9, 221, :_reduce_338, + 1, 221, :_reduce_339, + 1, 221, :_reduce_340, + 1, 221, :_reduce_341, + 1, 221, :_reduce_342, + 1, 177, :_reduce_none, + 1, 253, :_reduce_344, + 1, 256, :_reduce_345, + 1, 257, :_reduce_346, + 1, 200, :_reduce_347, + 1, 248, :_reduce_none, + 1, 248, :_reduce_none, + 2, 248, :_reduce_350, + 1, 187, :_reduce_none, + 1, 187, :_reduce_none, + 1, 249, :_reduce_none, + 5, 249, :_reduce_354, + 1, 160, :_reduce_none, + 2, 160, :_reduce_356, + 1, 252, :_reduce_none, + 1, 252, :_reduce_none, + 1, 270, :_reduce_359, + 3, 270, :_reduce_360, + 1, 273, :_reduce_361, + 3, 273, :_reduce_362, + 1, 272, :_reduce_none, + 3, 272, :_reduce_364, + 5, 272, :_reduce_365, + 1, 272, :_reduce_366, + 3, 272, :_reduce_367, + 2, 274, :_reduce_368, + 1, 274, :_reduce_369, + 4, 275, :_reduce_370, + 2, 275, :_reduce_371, + 2, 275, :_reduce_372, + 2, 275, :_reduce_373, + 1, 275, :_reduce_374, + 2, 281, :_reduce_375, + 0, 281, :_reduce_376, + 6, 282, :_reduce_377, + 8, 282, :_reduce_378, + 4, 282, :_reduce_379, + 6, 282, :_reduce_380, + 4, 282, :_reduce_381, + 2, 282, :_reduce_none, + 6, 282, :_reduce_383, + 2, 282, :_reduce_384, + 4, 282, :_reduce_385, + 6, 282, :_reduce_386, + 2, 282, :_reduce_387, + 4, 282, :_reduce_388, + 2, 282, :_reduce_389, + 4, 282, :_reduce_390, + 1, 282, :_reduce_none, + 0, 286, :_reduce_392, + 1, 286, :_reduce_393, + 3, 287, :_reduce_394, + 4, 287, :_reduce_395, + 1, 288, :_reduce_396, + 4, 288, :_reduce_397, + 1, 289, :_reduce_398, + 3, 289, :_reduce_399, + 1, 290, :_reduce_400, + 1, 290, :_reduce_none, + 0, 294, :_reduce_402, + 0, 295, :_reduce_403, + 4, 247, :_reduce_404, + 4, 292, :_reduce_405, + 1, 292, :_reduce_406, + 0, 298, :_reduce_407, + 4, 293, :_reduce_408, + 0, 299, :_reduce_409, + 4, 293, :_reduce_410, + 0, 301, :_reduce_411, + 4, 297, :_reduce_412, + 2, 191, :_reduce_413, + 4, 191, :_reduce_414, + 5, 191, :_reduce_415, + 5, 191, :_reduce_416, + 2, 246, :_reduce_417, + 4, 246, :_reduce_418, + 4, 246, :_reduce_419, + 3, 246, :_reduce_420, + 3, 246, :_reduce_421, + 3, 246, :_reduce_422, + 2, 246, :_reduce_423, + 1, 246, :_reduce_424, + 4, 246, :_reduce_425, + 0, 303, :_reduce_426, + 4, 245, :_reduce_427, + 0, 304, :_reduce_428, + 4, 245, :_reduce_429, + 0, 305, :_reduce_430, + 3, 196, :_reduce_431, + 0, 306, :_reduce_432, + 0, 307, :_reduce_433, + 4, 300, :_reduce_434, + 5, 250, :_reduce_435, + 1, 308, :_reduce_436, + 1, 308, :_reduce_none, + 0, 311, :_reduce_438, + 0, 312, :_reduce_439, + 7, 251, :_reduce_440, + 1, 310, :_reduce_441, + 1, 310, :_reduce_none, + 1, 309, :_reduce_443, + 3, 309, :_reduce_444, + 3, 309, :_reduce_445, + 1, 313, :_reduce_none, + 2, 313, :_reduce_447, + 3, 313, :_reduce_448, + 1, 313, :_reduce_449, + 1, 313, :_reduce_450, + 1, 184, :_reduce_none, + 3, 317, :_reduce_452, + 1, 317, :_reduce_none, + 3, 319, :_reduce_454, + 1, 319, :_reduce_none, + 1, 321, :_reduce_456, + 1, 322, :_reduce_457, + 1, 320, :_reduce_none, + 4, 320, :_reduce_459, + 4, 320, :_reduce_460, + 3, 320, :_reduce_461, + 4, 320, :_reduce_462, + 4, 320, :_reduce_463, + 3, 320, :_reduce_464, + 0, 326, :_reduce_465, + 4, 320, :_reduce_466, + 2, 320, :_reduce_467, + 0, 327, :_reduce_468, + 4, 320, :_reduce_469, + 2, 320, :_reduce_470, + 0, 328, :_reduce_471, + 4, 320, :_reduce_472, + 1, 314, :_reduce_473, + 1, 314, :_reduce_474, + 2, 314, :_reduce_475, + 3, 314, :_reduce_476, + 5, 314, :_reduce_477, + 2, 314, :_reduce_478, + 4, 314, :_reduce_479, + 1, 314, :_reduce_none, + 2, 329, :_reduce_481, + 3, 329, :_reduce_482, + 2, 315, :_reduce_483, + 4, 315, :_reduce_484, + 1, 315, :_reduce_485, + 3, 315, :_reduce_486, + 1, 331, :_reduce_487, + 3, 331, :_reduce_488, + 1, 330, :_reduce_none, + 3, 316, :_reduce_490, + 1, 316, :_reduce_491, + 2, 316, :_reduce_492, + 1, 316, :_reduce_493, + 3, 316, :_reduce_494, + 1, 316, :_reduce_495, + 1, 332, :_reduce_496, + 3, 332, :_reduce_497, + 2, 335, :_reduce_498, + 1, 335, :_reduce_499, + 1, 336, :_reduce_500, + 3, 336, :_reduce_501, + 2, 333, :_reduce_502, + 1, 333, :_reduce_503, + 2, 334, :_reduce_504, + 1, 323, :_reduce_none, + 3, 323, :_reduce_506, + 3, 323, :_reduce_507, + 2, 323, :_reduce_508, + 2, 323, :_reduce_509, + 1, 323, :_reduce_none, + 1, 323, :_reduce_none, + 1, 323, :_reduce_none, + 2, 323, :_reduce_513, + 2, 323, :_reduce_514, + 1, 339, :_reduce_none, + 1, 339, :_reduce_none, + 1, 339, :_reduce_none, + 1, 339, :_reduce_none, + 1, 339, :_reduce_none, + 1, 339, :_reduce_none, + 1, 339, :_reduce_none, + 1, 339, :_reduce_none, + 1, 339, :_reduce_523, + 0, 341, :_reduce_524, + 3, 339, :_reduce_525, + 1, 318, :_reduce_526, + 2, 340, :_reduce_527, + 2, 324, :_reduce_528, + 3, 324, :_reduce_529, + 1, 324, :_reduce_530, + 6, 159, :_reduce_531, + 0, 159, :_reduce_532, + 1, 342, :_reduce_533, + 1, 342, :_reduce_none, + 1, 342, :_reduce_none, + 2, 343, :_reduce_536, + 1, 343, :_reduce_none, + 2, 161, :_reduce_538, + 1, 161, :_reduce_none, + 1, 235, :_reduce_none, + 1, 235, :_reduce_none, + 1, 236, :_reduce_542, + 1, 345, :_reduce_543, + 2, 345, :_reduce_544, + 3, 346, :_reduce_545, + 1, 346, :_reduce_546, + 1, 346, :_reduce_547, + 3, 237, :_reduce_548, + 4, 238, :_reduce_549, + 3, 239, :_reduce_550, + 0, 349, :_reduce_551, + 3, 349, :_reduce_552, + 1, 350, :_reduce_553, + 2, 350, :_reduce_554, + 3, 241, :_reduce_555, + 0, 352, :_reduce_556, + 3, 352, :_reduce_557, + 3, 240, :_reduce_558, + 3, 242, :_reduce_559, + 0, 353, :_reduce_560, + 3, 353, :_reduce_561, + 0, 354, :_reduce_562, + 3, 354, :_reduce_563, + 0, 337, :_reduce_564, + 2, 337, :_reduce_565, + 0, 347, :_reduce_566, + 2, 347, :_reduce_567, + 0, 348, :_reduce_568, + 2, 348, :_reduce_569, + 1, 351, :_reduce_570, + 2, 351, :_reduce_571, + 0, 356, :_reduce_572, + 4, 351, :_reduce_573, + 1, 355, :_reduce_574, + 1, 355, :_reduce_575, + 1, 355, :_reduce_576, + 1, 355, :_reduce_none, + 1, 216, :_reduce_none, + 1, 216, :_reduce_none, + 1, 357, :_reduce_580, + 3, 358, :_reduce_581, + 1, 344, :_reduce_582, + 2, 344, :_reduce_583, + 1, 219, :_reduce_584, + 1, 219, :_reduce_585, + 1, 219, :_reduce_586, + 1, 219, :_reduce_587, + 1, 209, :_reduce_588, + 1, 209, :_reduce_589, + 1, 209, :_reduce_590, + 1, 209, :_reduce_591, + 1, 209, :_reduce_592, + 1, 210, :_reduce_593, + 1, 210, :_reduce_594, + 1, 210, :_reduce_595, + 1, 210, :_reduce_596, + 1, 210, :_reduce_597, + 1, 210, :_reduce_598, + 1, 210, :_reduce_599, + 1, 243, :_reduce_600, + 1, 243, :_reduce_601, + 1, 176, :_reduce_602, + 1, 176, :_reduce_603, + 1, 181, :_reduce_604, + 1, 181, :_reduce_605, + 0, 359, :_reduce_606, + 4, 254, :_reduce_607, + 0, 254, :_reduce_608, + 3, 258, :_reduce_609, + 5, 258, :_reduce_610, + 3, 258, :_reduce_611, + 0, 361, :_reduce_612, + 3, 258, :_reduce_613, + 4, 360, :_reduce_614, + 2, 360, :_reduce_615, + 2, 360, :_reduce_616, + 2, 360, :_reduce_617, + 1, 360, :_reduce_618, + 2, 363, :_reduce_619, + 0, 363, :_reduce_620, + 6, 296, :_reduce_621, + 8, 296, :_reduce_622, + 4, 296, :_reduce_623, + 6, 296, :_reduce_624, + 4, 296, :_reduce_625, + 6, 296, :_reduce_626, + 2, 296, :_reduce_627, + 4, 296, :_reduce_628, + 6, 296, :_reduce_629, + 2, 296, :_reduce_630, + 4, 296, :_reduce_631, + 2, 296, :_reduce_632, + 4, 296, :_reduce_633, + 1, 296, :_reduce_634, + 0, 296, :_reduce_635, + 1, 230, :_reduce_636, + 1, 291, :_reduce_637, + 1, 291, :_reduce_638, + 1, 291, :_reduce_639, + 1, 291, :_reduce_640, + 1, 271, :_reduce_none, + 1, 271, :_reduce_642, + 1, 365, :_reduce_643, + 1, 366, :_reduce_644, + 3, 366, :_reduce_645, + 1, 283, :_reduce_646, + 3, 283, :_reduce_647, + 1, 367, :_reduce_648, + 2, 368, :_reduce_649, + 1, 368, :_reduce_650, + 2, 369, :_reduce_651, + 1, 369, :_reduce_652, + 1, 276, :_reduce_653, + 3, 276, :_reduce_654, + 1, 362, :_reduce_655, + 3, 362, :_reduce_656, + 1, 338, :_reduce_none, + 1, 338, :_reduce_none, + 2, 279, :_reduce_659, + 2, 277, :_reduce_660, + 1, 277, :_reduce_661, + 3, 370, :_reduce_662, + 3, 371, :_reduce_663, + 1, 284, :_reduce_664, + 3, 284, :_reduce_665, + 1, 364, :_reduce_666, + 3, 364, :_reduce_667, + 1, 372, :_reduce_none, + 1, 372, :_reduce_none, + 2, 285, :_reduce_670, + 1, 285, :_reduce_671, + 1, 373, :_reduce_none, + 1, 373, :_reduce_none, + 2, 280, :_reduce_674, + 2, 278, :_reduce_675, + 0, 278, :_reduce_676, + 1, 259, :_reduce_none, + 3, 259, :_reduce_678, + 0, 244, :_reduce_679, + 2, 244, :_reduce_none, + 1, 228, :_reduce_681, + 3, 228, :_reduce_682, + 3, 374, :_reduce_683, + 2, 374, :_reduce_684, + 4, 374, :_reduce_685, + 2, 374, :_reduce_686, + 1, 199, :_reduce_none, + 1, 199, :_reduce_none, + 1, 199, :_reduce_none, + 1, 193, :_reduce_none, + 1, 193, :_reduce_none, + 1, 193, :_reduce_none, + 1, 193, :_reduce_none, + 1, 302, :_reduce_none, + 1, 302, :_reduce_none, + 1, 302, :_reduce_none, + 1, 192, :_reduce_none, + 1, 192, :_reduce_none, + 1, 180, :_reduce_699, + 1, 180, :_reduce_700, + 0, 152, :_reduce_none, + 1, 152, :_reduce_none, + 0, 182, :_reduce_none, + 1, 182, :_reduce_none, + 2, 204, :_reduce_705, + 2, 179, :_reduce_706, + 2, 325, :_reduce_707, + 0, 227, :_reduce_none, + 1, 227, :_reduce_none, + 1, 227, :_reduce_none, + 1, 255, :_reduce_711, + 1, 255, :_reduce_none, + 1, 154, :_reduce_none, + 2, 154, :_reduce_none, + 0, 225, :_reduce_715 ] + +racc_reduce_n = 716 + +racc_shift_n = 1194 + +racc_token_table = { + false => 0, + :error => 1, + :kCLASS => 2, + :kMODULE => 3, + :kDEF => 4, + :kUNDEF => 5, + :kBEGIN => 6, + :kRESCUE => 7, + :kENSURE => 8, + :kEND => 9, + :kIF => 10, + :kUNLESS => 11, + :kTHEN => 12, + :kELSIF => 13, + :kELSE => 14, + :kCASE => 15, + :kWHEN => 16, + :kWHILE => 17, + :kUNTIL => 18, + :kFOR => 19, + :kBREAK => 20, + :kNEXT => 21, + :kREDO => 22, + :kRETRY => 23, + :kIN => 24, + :kDO => 25, + :kDO_COND => 26, + :kDO_BLOCK => 27, + :kDO_LAMBDA => 28, + :kRETURN => 29, + :kYIELD => 30, + :kSUPER => 31, + :kSELF => 32, + :kNIL => 33, + :kTRUE => 34, + :kFALSE => 35, + :kAND => 36, + :kOR => 37, + :kNOT => 38, + :kIF_MOD => 39, + :kUNLESS_MOD => 40, + :kWHILE_MOD => 41, + :kUNTIL_MOD => 42, + :kRESCUE_MOD => 43, + :kALIAS => 44, + :kDEFINED => 45, + :klBEGIN => 46, + :klEND => 47, + :k__LINE__ => 48, + :k__FILE__ => 49, + :k__ENCODING__ => 50, + :tIDENTIFIER => 51, + :tFID => 52, + :tGVAR => 53, + :tIVAR => 54, + :tCONSTANT => 55, + :tLABEL => 56, + :tCVAR => 57, + :tNTH_REF => 58, + :tBACK_REF => 59, + :tSTRING_CONTENT => 60, + :tINTEGER => 61, + :tFLOAT => 62, + :tUPLUS => 63, + :tUMINUS => 64, + :tUNARY_NUM => 65, + :tPOW => 66, + :tCMP => 67, + :tEQ => 68, + :tEQQ => 69, + :tNEQ => 70, + :tGEQ => 71, + :tLEQ => 72, + :tANDOP => 73, + :tOROP => 74, + :tMATCH => 75, + :tNMATCH => 76, + :tDOT => 77, + :tDOT2 => 78, + :tDOT3 => 79, + :tAREF => 80, + :tASET => 81, + :tLSHFT => 82, + :tRSHFT => 83, + :tCOLON2 => 84, + :tCOLON3 => 85, + :tOP_ASGN => 86, + :tASSOC => 87, + :tLPAREN => 88, + :tLPAREN2 => 89, + :tRPAREN => 90, + :tLPAREN_ARG => 91, + :tLBRACK => 92, + :tLBRACK2 => 93, + :tRBRACK => 94, + :tLBRACE => 95, + :tLBRACE_ARG => 96, + :tSTAR => 97, + :tSTAR2 => 98, + :tAMPER => 99, + :tAMPER2 => 100, + :tTILDE => 101, + :tPERCENT => 102, + :tDIVIDE => 103, + :tDSTAR => 104, + :tPLUS => 105, + :tMINUS => 106, + :tLT => 107, + :tGT => 108, + :tPIPE => 109, + :tBANG => 110, + :tCARET => 111, + :tLCURLY => 112, + :tRCURLY => 113, + :tBACK_REF2 => 114, + :tSYMBEG => 115, + :tSTRING_BEG => 116, + :tXSTRING_BEG => 117, + :tREGEXP_BEG => 118, + :tREGEXP_OPT => 119, + :tWORDS_BEG => 120, + :tQWORDS_BEG => 121, + :tSYMBOLS_BEG => 122, + :tQSYMBOLS_BEG => 123, + :tSTRING_DBEG => 124, + :tSTRING_DVAR => 125, + :tSTRING_END => 126, + :tSTRING_DEND => 127, + :tSTRING => 128, + :tSYMBOL => 129, + :tNL => 130, + :tEH => 131, + :tCOLON => 132, + :tCOMMA => 133, + :tSPACE => 134, + :tSEMI => 135, + :tLAMBDA => 136, + :tLAMBEG => 137, + :tCHARACTER => 138, + :tRATIONAL => 139, + :tIMAGINARY => 140, + :tLABEL_END => 141, + :tANDDOT => 142, + :tBDOT2 => 143, + :tBDOT3 => 144, + :tEQL => 145, + :tLOWEST => 146 } + +racc_nt_base = 147 + +racc_use_result_var = true + +Racc_arg = [ + racc_action_table, + racc_action_check, + racc_action_default, + racc_action_pointer, + racc_goto_table, + racc_goto_check, + racc_goto_default, + racc_goto_pointer, + racc_nt_base, + racc_reduce_table, + racc_token_table, + racc_shift_n, + racc_reduce_n, + racc_use_result_var ] + +Racc_token_to_s_table = [ + "$end", + "error", + "kCLASS", + "kMODULE", + "kDEF", + "kUNDEF", + "kBEGIN", + "kRESCUE", + "kENSURE", + "kEND", + "kIF", + "kUNLESS", + "kTHEN", + "kELSIF", + "kELSE", + "kCASE", + "kWHEN", + "kWHILE", + "kUNTIL", + "kFOR", + "kBREAK", + "kNEXT", + "kREDO", + "kRETRY", + "kIN", + "kDO", + "kDO_COND", + "kDO_BLOCK", + "kDO_LAMBDA", + "kRETURN", + "kYIELD", + "kSUPER", + "kSELF", + "kNIL", + "kTRUE", + "kFALSE", + "kAND", + "kOR", + "kNOT", + "kIF_MOD", + "kUNLESS_MOD", + "kWHILE_MOD", + "kUNTIL_MOD", + "kRESCUE_MOD", + "kALIAS", + "kDEFINED", + "klBEGIN", + "klEND", + "k__LINE__", + "k__FILE__", + "k__ENCODING__", + "tIDENTIFIER", + "tFID", + "tGVAR", + "tIVAR", + "tCONSTANT", + "tLABEL", + "tCVAR", + "tNTH_REF", + "tBACK_REF", + "tSTRING_CONTENT", + "tINTEGER", + "tFLOAT", + "tUPLUS", + "tUMINUS", + "tUNARY_NUM", + "tPOW", + "tCMP", + "tEQ", + "tEQQ", + "tNEQ", + "tGEQ", + "tLEQ", + "tANDOP", + "tOROP", + "tMATCH", + "tNMATCH", + "tDOT", + "tDOT2", + "tDOT3", + "tAREF", + "tASET", + "tLSHFT", + "tRSHFT", + "tCOLON2", + "tCOLON3", + "tOP_ASGN", + "tASSOC", + "tLPAREN", + "tLPAREN2", + "tRPAREN", + "tLPAREN_ARG", + "tLBRACK", + "tLBRACK2", + "tRBRACK", + "tLBRACE", + "tLBRACE_ARG", + "tSTAR", + "tSTAR2", + "tAMPER", + "tAMPER2", + "tTILDE", + "tPERCENT", + "tDIVIDE", + "tDSTAR", + "tPLUS", + "tMINUS", + "tLT", + "tGT", + "tPIPE", + "tBANG", + "tCARET", + "tLCURLY", + "tRCURLY", + "tBACK_REF2", + "tSYMBEG", + "tSTRING_BEG", + "tXSTRING_BEG", + "tREGEXP_BEG", + "tREGEXP_OPT", + "tWORDS_BEG", + "tQWORDS_BEG", + "tSYMBOLS_BEG", + "tQSYMBOLS_BEG", + "tSTRING_DBEG", + "tSTRING_DVAR", + "tSTRING_END", + "tSTRING_DEND", + "tSTRING", + "tSYMBOL", + "tNL", + "tEH", + "tCOLON", + "tCOMMA", + "tSPACE", + "tSEMI", + "tLAMBDA", + "tLAMBEG", + "tCHARACTER", + "tRATIONAL", + "tIMAGINARY", + "tLABEL_END", + "tANDDOT", + "tBDOT2", + "tBDOT3", + "tEQL", + "tLOWEST", + "$start", + "program", + "top_compstmt", + "@1", + "top_stmts", + "opt_terms", + "top_stmt", + "terms", + "stmt", + "begin_block", + "bodystmt", + "compstmt", + "opt_rescue", + "opt_else", + "opt_ensure", + "stmts", + "stmt_or_begin", + "fitem", + "undef_list", + "expr_value", + "command_asgn", + "mlhs", + "command_call", + "lhs", + "mrhs", + "mrhs_arg", + "expr", + "@2", + "command_rhs", + "var_lhs", + "primary_value", + "opt_call_args", + "rbracket", + "call_op", + "backref", + "opt_nl", + "arg", + "p_expr", + "@3", + "expr_value_do", + "do", + "@4", + "command", + "block_command", + "block_call", + "dot_or_colon", + "operation2", + "command_args", + "cmd_brace_block", + "brace_body", + "fcall", + "@5", + "operation", + "k_return", + "call_args", + "mlhs_basic", + "mlhs_inner", + "rparen", + "mlhs_head", + "mlhs_item", + "mlhs_node", + "mlhs_post", + "user_variable", + "keyword_variable", + "cname", + "cpath", + "fname", + "op", + "reswords", + "symbol", + "@6", + "arg_rhs", + "simple_numeric", + "rel_expr", + "primary", + "relop", + "arg_value", + "aref_args", + "none", + "args", + "trailer", + "assocs", + "paren_args", + "args_forward", + "opt_paren_args", + "opt_block_arg", + "block_arg", + "@7", + "literal", + "strings", + "xstring", + "regexp", + "words", + "qwords", + "symbols", + "qsymbols", + "var_ref", + "assoc_list", + "brace_block", + "method_call", + "lambda", + "then", + "if_tail", + "case_body", + "p_case_body", + "for_var", + "k_class", + "superclass", + "term", + "k_module", + "k_def", + "f_arglist", + "singleton", + "@8", + "@9", + "@10", + "@11", + "@12", + "@13", + "@14", + "@15", + "@16", + "@17", + "f_marg", + "f_norm_arg", + "f_margs", + "f_marg_list", + "f_rest_marg", + "block_args_tail", + "f_block_kwarg", + "f_kwrest", + "opt_f_block_arg", + "f_no_kwarg", + "f_block_arg", + "opt_block_args_tail", + "block_param", + "f_arg", + "f_block_optarg", + "f_rest_arg", + "opt_block_param", + "block_param_def", + "opt_bv_decl", + "bv_decls", + "bvar", + "f_bad_arg", + "f_larglist", + "lambda_body", + "@18", + "@19", + "f_args", + "do_block", + "@20", + "@21", + "do_body", + "@22", + "operation3", + "@23", + "@24", + "@25", + "@26", + "@27", + "cases", + "p_top_expr", + "p_cases", + "@28", + "@29", + "p_top_expr_body", + "p_args", + "p_args_tail", + "p_kwargs", + "p_as", + "p_variable", + "p_alt", + "p_expr_basic", + "p_lparen", + "p_lbracket", + "p_value", + "p_const", + "rbrace", + "@30", + "@31", + "@32", + "p_args_head", + "p_arg", + "p_args_post", + "p_kwarg", + "p_kwrest", + "p_kwnorest", + "p_kw", + "p_kw_label", + "string_contents", + "kwrest_mark", + "p_primitive", + "p_var_ref", + "@33", + "exc_list", + "exc_var", + "numeric", + "string", + "string1", + "xstring_contents", + "regexp_contents", + "word_list", + "word", + "string_content", + "symbol_list", + "qword_list", + "qsym_list", + "string_dvar", + "@34", + "ssym", + "dsym", + "@35", + "args_tail", + "@36", + "f_kwarg", + "opt_args_tail", + "f_optarg", + "f_arg_asgn", + "f_arg_item", + "f_label", + "f_kw", + "f_block_kw", + "f_opt", + "f_block_opt", + "restarg_mark", + "blkarg_mark", + "assoc" ] + +Racc_debug_parser = false + +##### State transition tables end ##### + +# reduce 0 omitted + +def _reduce_1(val, _values, result) + @current_arg_stack.push(nil) + @max_numparam_stack.push(static: false) + + result +end + +def _reduce_2(val, _values, result) + result = val[1] + + @current_arg_stack.pop + @max_numparam_stack.pop + + result +end + +def _reduce_3(val, _values, result) + result = @builder.compstmt(val[0]) + + result +end + +def _reduce_4(val, _values, result) + result = [] + + result +end + +def _reduce_5(val, _values, result) + result = [ val[0] ] + + result +end + +def _reduce_6(val, _values, result) + result = val[0] << val[2] + + result +end + +def _reduce_7(val, _values, result) + result = [ val[1] ] + + result +end + +# reduce 8 omitted + +def _reduce_9(val, _values, result) + result = @builder.preexe(val[0], *val[1]) + + result +end + +def _reduce_10(val, _values, result) + result = val + + result +end + +def _reduce_11(val, _values, result) + rescue_bodies = val[1] + else_t, else_ = val[2] + ensure_t, ensure_ = val[3] + + if rescue_bodies.empty? && !else_t.nil? + diagnostic :error, :useless_else, nil, else_t + end + + result = @builder.begin_body(val[0], + rescue_bodies, + else_t, else_, + ensure_t, ensure_) + + result +end + +def _reduce_12(val, _values, result) + result = @builder.compstmt(val[0]) + + result +end + +def _reduce_13(val, _values, result) + result = [] + + result +end + +def _reduce_14(val, _values, result) + result = [ val[0] ] + + result +end + +def _reduce_15(val, _values, result) + result = val[0] << val[2] + + result +end + +def _reduce_16(val, _values, result) + result = [ val[1] ] + + result +end + +# reduce 17 omitted + +def _reduce_18(val, _values, result) + diagnostic :error, :begin_in_method, nil, val[0] + + result +end + +def _reduce_19(val, _values, result) + @lexer.state = :expr_fname + + result +end + +def _reduce_20(val, _values, result) + result = @builder.alias(val[0], val[1], val[3]) + + result +end + +def _reduce_21(val, _values, result) + result = @builder.alias(val[0], + @builder.gvar(val[1]), + @builder.gvar(val[2])) + + result +end + +def _reduce_22(val, _values, result) + result = @builder.alias(val[0], + @builder.gvar(val[1]), + @builder.back_ref(val[2])) + + result +end + +def _reduce_23(val, _values, result) + diagnostic :error, :nth_ref_alias, nil, val[2] + + result +end + +def _reduce_24(val, _values, result) + result = @builder.undef_method(val[0], val[1]) + + result +end + +def _reduce_25(val, _values, result) + result = @builder.condition_mod(val[0], nil, + val[1], val[2]) + + result +end + +def _reduce_26(val, _values, result) + result = @builder.condition_mod(nil, val[0], + val[1], val[2]) + + result +end + +def _reduce_27(val, _values, result) + result = @builder.loop_mod(:while, val[0], val[1], val[2]) + + result +end + +def _reduce_28(val, _values, result) + result = @builder.loop_mod(:until, val[0], val[1], val[2]) + + result +end + +def _reduce_29(val, _values, result) + rescue_body = @builder.rescue_body(val[1], + nil, nil, nil, + nil, val[2]) + + result = @builder.begin_body(val[0], [ rescue_body ]) + + result +end + +def _reduce_30(val, _values, result) + result = @builder.postexe(val[0], val[1], val[2], val[3]) + + result +end + +# reduce 31 omitted + +def _reduce_32(val, _values, result) + result = @builder.multi_assign(val[0], val[1], val[2]) + + result +end + +def _reduce_33(val, _values, result) + result = @builder.assign(val[0], val[1], + @builder.array(nil, val[2], nil)) + + result +end + +def _reduce_34(val, _values, result) + rescue_body = @builder.rescue_body(val[3], + nil, nil, nil, + nil, val[4]) + begin_body = @builder.begin_body(val[2], [ rescue_body ]) + + result = @builder.multi_assign(val[0], val[1], begin_body) + + result +end + +def _reduce_35(val, _values, result) + result = @builder.multi_assign(val[0], val[1], val[2]) + + result +end + +# reduce 36 omitted + +def _reduce_37(val, _values, result) + result = @builder.assign(val[0], val[1], val[2]) + + result +end + +def _reduce_38(val, _values, result) + result = @builder.op_assign(val[0], val[1], val[2]) + + result +end + +def _reduce_39(val, _values, result) + result = @builder.op_assign( + @builder.index( + val[0], val[1], val[2], val[3]), + val[4], val[5]) + + result +end + +def _reduce_40(val, _values, result) + result = @builder.op_assign( + @builder.call_method( + val[0], val[1], val[2]), + val[3], val[4]) + + result +end + +def _reduce_41(val, _values, result) + result = @builder.op_assign( + @builder.call_method( + val[0], val[1], val[2]), + val[3], val[4]) + + result +end + +def _reduce_42(val, _values, result) + const = @builder.const_op_assignable( + @builder.const_fetch(val[0], val[1], val[2])) + result = @builder.op_assign(const, val[3], val[4]) + + result +end + +def _reduce_43(val, _values, result) + result = @builder.op_assign( + @builder.call_method( + val[0], val[1], val[2]), + val[3], val[4]) + + result +end + +def _reduce_44(val, _values, result) + @builder.op_assign(val[0], val[1], val[2]) + + result +end + +# reduce 45 omitted + +def _reduce_46(val, _values, result) + rescue_body = @builder.rescue_body(val[1], + nil, nil, nil, + nil, val[2]) + + result = @builder.begin_body(val[0], [ rescue_body ]) + + result +end + +# reduce 47 omitted + +# reduce 48 omitted + +def _reduce_49(val, _values, result) + result = @builder.logical_op(:and, val[0], val[1], val[2]) + + result +end + +def _reduce_50(val, _values, result) + result = @builder.logical_op(:or, val[0], val[1], val[2]) + + result +end + +def _reduce_51(val, _values, result) + result = @builder.not_op(val[0], nil, val[2], nil) + + result +end + +def _reduce_52(val, _values, result) + result = @builder.not_op(val[0], nil, val[1], nil) + + result +end + +def _reduce_53(val, _values, result) + @lexer.state = :expr_beg + @lexer.command_start = false + @pattern_variables.push + + result = @context.in_kwarg + @context.in_kwarg = true + + result +end + +def _reduce_54(val, _values, result) + @pattern_variables.pop + @context.in_kwarg = val[2] + if @builder.class.emit_match_pattern + result = @builder.match_pattern(val[0], val[1], val[3]) + else + result = @builder.in_match(val[0], val[1], val[3]) + end + + result +end + +# reduce 55 omitted + +# reduce 56 omitted + +def _reduce_57(val, _values, result) + @lexer.cond.push(true) + + result +end + +def _reduce_58(val, _values, result) + @lexer.cond.pop + result = [ val[1], val[2] ] + + result +end + +# reduce 59 omitted + +# reduce 60 omitted + +# reduce 61 omitted + +def _reduce_62(val, _values, result) + result = @builder.call_method(val[0], val[1], val[2], + nil, val[3], nil) + + result +end + +def _reduce_63(val, _values, result) + result = @context.dup + @context.in_block = true + + result +end + +def _reduce_64(val, _values, result) + result = [ val[0], *val[2], val[3] ] + @context.in_block = val[1].in_block + + result +end + +# reduce 65 omitted + +def _reduce_66(val, _values, result) + result = @builder.call_method(nil, nil, val[0], + nil, val[1], nil) + + result +end + +def _reduce_67(val, _values, result) + method_call = @builder.call_method(nil, nil, val[0], + nil, val[1], nil) + + begin_t, args, body, end_t = val[2] + result = @builder.block(method_call, + begin_t, args, body, end_t) + + result +end + +def _reduce_68(val, _values, result) + result = @builder.call_method(val[0], val[1], val[2], + nil, val[3], nil) + + result +end + +def _reduce_69(val, _values, result) + method_call = @builder.call_method(val[0], val[1], val[2], + nil, val[3], nil) + + begin_t, args, body, end_t = val[4] + result = @builder.block(method_call, + begin_t, args, body, end_t) + + result +end + +def _reduce_70(val, _values, result) + result = @builder.call_method(val[0], val[1], val[2], + nil, val[3], nil) + + result +end + +def _reduce_71(val, _values, result) + method_call = @builder.call_method(val[0], val[1], val[2], + nil, val[3], nil) + + begin_t, args, body, end_t = val[4] + result = @builder.block(method_call, + begin_t, args, body, end_t) + + result +end + +def _reduce_72(val, _values, result) + result = @builder.keyword_cmd(:super, val[0], + nil, val[1], nil) + + result +end + +def _reduce_73(val, _values, result) + result = @builder.keyword_cmd(:yield, val[0], + nil, val[1], nil) + + result +end + +def _reduce_74(val, _values, result) + result = @builder.keyword_cmd(:return, val[0], + nil, val[1], nil) + + result +end + +def _reduce_75(val, _values, result) + result = @builder.keyword_cmd(:break, val[0], + nil, val[1], nil) + + result +end + +def _reduce_76(val, _values, result) + result = @builder.keyword_cmd(:next, val[0], + nil, val[1], nil) + + result +end + +def _reduce_77(val, _values, result) + result = @builder.multi_lhs(nil, val[0], nil) + + result +end + +def _reduce_78(val, _values, result) + result = @builder.begin(val[0], val[1], val[2]) + + result +end + +def _reduce_79(val, _values, result) + result = @builder.multi_lhs(nil, val[0], nil) + + result +end + +def _reduce_80(val, _values, result) + result = @builder.multi_lhs(val[0], val[1], val[2]) + + result +end + +# reduce 81 omitted + +def _reduce_82(val, _values, result) + result = val[0]. + push(val[1]) + + result +end + +def _reduce_83(val, _values, result) + result = val[0]. + push(@builder.splat(val[1], val[2])) + + result +end + +def _reduce_84(val, _values, result) + result = val[0]. + push(@builder.splat(val[1], val[2])). + concat(val[4]) + + result +end + +def _reduce_85(val, _values, result) + result = val[0]. + push(@builder.splat(val[1])) + + result +end + +def _reduce_86(val, _values, result) + result = val[0]. + push(@builder.splat(val[1])). + concat(val[3]) + + result +end + +def _reduce_87(val, _values, result) + result = [ @builder.splat(val[0], val[1]) ] + + result +end + +def _reduce_88(val, _values, result) + result = [ @builder.splat(val[0], val[1]), + *val[3] ] + + result +end + +def _reduce_89(val, _values, result) + result = [ @builder.splat(val[0]) ] + + result +end + +def _reduce_90(val, _values, result) + result = [ @builder.splat(val[0]), + *val[2] ] + + result +end + +# reduce 91 omitted + +def _reduce_92(val, _values, result) + result = @builder.begin(val[0], val[1], val[2]) + + result +end + +def _reduce_93(val, _values, result) + result = [ val[0] ] + + result +end + +def _reduce_94(val, _values, result) + result = val[0] << val[1] + + result +end + +def _reduce_95(val, _values, result) + result = [ val[0] ] + + result +end + +def _reduce_96(val, _values, result) + result = val[0] << val[2] + + result +end + +def _reduce_97(val, _values, result) + result = @builder.assignable(val[0]) + + result +end + +def _reduce_98(val, _values, result) + result = @builder.assignable(val[0]) + + result +end + +def _reduce_99(val, _values, result) + result = @builder.index_asgn(val[0], val[1], val[2], val[3]) + + result +end + +def _reduce_100(val, _values, result) + if (val[1][0] == :anddot) + diagnostic :error, :csend_in_lhs_of_masgn, nil, val[1] + end + + result = @builder.attr_asgn(val[0], val[1], val[2]) + + result +end + +def _reduce_101(val, _values, result) + result = @builder.attr_asgn(val[0], val[1], val[2]) + + result +end + +def _reduce_102(val, _values, result) + if (val[1][0] == :anddot) + diagnostic :error, :csend_in_lhs_of_masgn, nil, val[1] + end + + result = @builder.attr_asgn(val[0], val[1], val[2]) + + result +end + +def _reduce_103(val, _values, result) + result = @builder.assignable( + @builder.const_fetch(val[0], val[1], val[2])) + + result +end + +def _reduce_104(val, _values, result) + result = @builder.assignable( + @builder.const_global(val[0], val[1])) + + result +end + +def _reduce_105(val, _values, result) + result = @builder.assignable(val[0]) + + result +end + +def _reduce_106(val, _values, result) + result = @builder.assignable(val[0]) + + result +end + +def _reduce_107(val, _values, result) + result = @builder.assignable(val[0]) + + result +end + +def _reduce_108(val, _values, result) + result = @builder.index_asgn(val[0], val[1], val[2], val[3]) + + result +end + +def _reduce_109(val, _values, result) + result = @builder.attr_asgn(val[0], val[1], val[2]) + + result +end + +def _reduce_110(val, _values, result) + result = @builder.attr_asgn(val[0], val[1], val[2]) + + result +end + +def _reduce_111(val, _values, result) + result = @builder.attr_asgn(val[0], val[1], val[2]) + + result +end + +def _reduce_112(val, _values, result) + result = @builder.assignable( + @builder.const_fetch(val[0], val[1], val[2])) + + result +end + +def _reduce_113(val, _values, result) + result = @builder.assignable( + @builder.const_global(val[0], val[1])) + + result +end + +def _reduce_114(val, _values, result) + result = @builder.assignable(val[0]) + + result +end + +def _reduce_115(val, _values, result) + diagnostic :error, :module_name_const, nil, val[0] + + result +end + +# reduce 116 omitted + +def _reduce_117(val, _values, result) + result = @builder.const_global(val[0], val[1]) + + result +end + +def _reduce_118(val, _values, result) + result = @builder.const(val[0]) + + result +end + +def _reduce_119(val, _values, result) + result = @builder.const_fetch(val[0], val[1], val[2]) + + result +end + +# reduce 120 omitted + +# reduce 121 omitted + +# reduce 122 omitted + +# reduce 123 omitted + +# reduce 124 omitted + +def _reduce_125(val, _values, result) + result = @builder.symbol_internal(val[0]) + + result +end + +# reduce 126 omitted + +def _reduce_127(val, _values, result) + result = [ val[0] ] + + result +end + +def _reduce_128(val, _values, result) + @lexer.state = :expr_fname + + result +end + +def _reduce_129(val, _values, result) + result = val[0] << val[3] + + result +end + +# reduce 130 omitted + +# reduce 131 omitted + +# reduce 132 omitted + +# reduce 133 omitted + +# reduce 134 omitted + +# reduce 135 omitted + +# reduce 136 omitted + +# reduce 137 omitted + +# reduce 138 omitted + +# reduce 139 omitted + +# reduce 140 omitted + +# reduce 141 omitted + +# reduce 142 omitted + +# reduce 143 omitted + +# reduce 144 omitted + +# reduce 145 omitted + +# reduce 146 omitted + +# reduce 147 omitted + +# reduce 148 omitted + +# reduce 149 omitted + +# reduce 150 omitted + +# reduce 151 omitted + +# reduce 152 omitted + +# reduce 153 omitted + +# reduce 154 omitted + +# reduce 155 omitted + +# reduce 156 omitted + +# reduce 157 omitted + +# reduce 158 omitted + +# reduce 159 omitted + +# reduce 160 omitted + +# reduce 161 omitted + +# reduce 162 omitted + +# reduce 163 omitted + +# reduce 164 omitted + +# reduce 165 omitted + +# reduce 166 omitted + +# reduce 167 omitted + +# reduce 168 omitted + +# reduce 169 omitted + +# reduce 170 omitted + +# reduce 171 omitted + +# reduce 172 omitted + +# reduce 173 omitted + +# reduce 174 omitted + +# reduce 175 omitted + +# reduce 176 omitted + +# reduce 177 omitted + +# reduce 178 omitted + +# reduce 179 omitted + +# reduce 180 omitted + +# reduce 181 omitted + +# reduce 182 omitted + +# reduce 183 omitted + +# reduce 184 omitted + +# reduce 185 omitted + +# reduce 186 omitted + +# reduce 187 omitted + +# reduce 188 omitted + +# reduce 189 omitted + +# reduce 190 omitted + +# reduce 191 omitted + +# reduce 192 omitted + +# reduce 193 omitted + +# reduce 194 omitted + +# reduce 195 omitted + +# reduce 196 omitted + +# reduce 197 omitted + +# reduce 198 omitted + +# reduce 199 omitted + +# reduce 200 omitted + +def _reduce_201(val, _values, result) + result = @builder.assign(val[0], val[1], val[2]) + + result +end + +def _reduce_202(val, _values, result) + result = @builder.op_assign(val[0], val[1], val[2]) + + result +end + +def _reduce_203(val, _values, result) + result = @builder.op_assign( + @builder.index( + val[0], val[1], val[2], val[3]), + val[4], val[5]) + + result +end + +def _reduce_204(val, _values, result) + result = @builder.op_assign( + @builder.call_method( + val[0], val[1], val[2]), + val[3], val[4]) + + result +end + +def _reduce_205(val, _values, result) + result = @builder.op_assign( + @builder.call_method( + val[0], val[1], val[2]), + val[3], val[4]) + + result +end + +def _reduce_206(val, _values, result) + result = @builder.op_assign( + @builder.call_method( + val[0], val[1], val[2]), + val[3], val[4]) + + result +end + +def _reduce_207(val, _values, result) + const = @builder.const_op_assignable( + @builder.const_fetch(val[0], val[1], val[2])) + result = @builder.op_assign(const, val[3], val[4]) + + result +end + +def _reduce_208(val, _values, result) + const = @builder.const_op_assignable( + @builder.const_global(val[0], val[1])) + result = @builder.op_assign(const, val[2], val[3]) + + result +end + +def _reduce_209(val, _values, result) + result = @builder.op_assign(val[0], val[1], val[2]) + + result +end + +def _reduce_210(val, _values, result) + result = @builder.range_inclusive(val[0], val[1], val[2]) + + result +end + +def _reduce_211(val, _values, result) + result = @builder.range_exclusive(val[0], val[1], val[2]) + + result +end + +def _reduce_212(val, _values, result) + result = @builder.range_inclusive(val[0], val[1], nil) + + result +end + +def _reduce_213(val, _values, result) + result = @builder.range_exclusive(val[0], val[1], nil) + + result +end + +def _reduce_214(val, _values, result) + result = @builder.range_inclusive(nil, val[0], val[1]) + + result +end + +def _reduce_215(val, _values, result) + result = @builder.range_exclusive(nil, val[0], val[1]) + + result +end + +def _reduce_216(val, _values, result) + result = @builder.binary_op(val[0], val[1], val[2]) + + result +end + +def _reduce_217(val, _values, result) + result = @builder.binary_op(val[0], val[1], val[2]) + + result +end + +def _reduce_218(val, _values, result) + result = @builder.binary_op(val[0], val[1], val[2]) + + result +end + +def _reduce_219(val, _values, result) + result = @builder.binary_op(val[0], val[1], val[2]) + + result +end + +def _reduce_220(val, _values, result) + result = @builder.binary_op(val[0], val[1], val[2]) + + result +end + +def _reduce_221(val, _values, result) + result = @builder.binary_op(val[0], val[1], val[2]) + + result +end + +def _reduce_222(val, _values, result) + result = @builder.unary_op(val[0], + @builder.binary_op( + val[1], val[2], val[3])) + + result +end + +def _reduce_223(val, _values, result) + result = @builder.unary_op(val[0], val[1]) + + result +end + +def _reduce_224(val, _values, result) + result = @builder.unary_op(val[0], val[1]) + + result +end + +def _reduce_225(val, _values, result) + result = @builder.binary_op(val[0], val[1], val[2]) + + result +end + +def _reduce_226(val, _values, result) + result = @builder.binary_op(val[0], val[1], val[2]) + + result +end + +def _reduce_227(val, _values, result) + result = @builder.binary_op(val[0], val[1], val[2]) + + result +end + +def _reduce_228(val, _values, result) + result = @builder.binary_op(val[0], val[1], val[2]) + + result +end + +# reduce 229 omitted + +def _reduce_230(val, _values, result) + result = @builder.binary_op(val[0], val[1], val[2]) + + result +end + +def _reduce_231(val, _values, result) + result = @builder.binary_op(val[0], val[1], val[2]) + + result +end + +def _reduce_232(val, _values, result) + result = @builder.binary_op(val[0], val[1], val[2]) + + result +end + +def _reduce_233(val, _values, result) + result = @builder.match_op(val[0], val[1], val[2]) + + result +end + +def _reduce_234(val, _values, result) + result = @builder.binary_op(val[0], val[1], val[2]) + + result +end + +def _reduce_235(val, _values, result) + result = @builder.not_op(val[0], nil, val[1], nil) + + result +end + +def _reduce_236(val, _values, result) + result = @builder.unary_op(val[0], val[1]) + + result +end + +def _reduce_237(val, _values, result) + result = @builder.binary_op(val[0], val[1], val[2]) + + result +end + +def _reduce_238(val, _values, result) + result = @builder.binary_op(val[0], val[1], val[2]) + + result +end + +def _reduce_239(val, _values, result) + result = @builder.logical_op(:and, val[0], val[1], val[2]) + + result +end + +def _reduce_240(val, _values, result) + result = @builder.logical_op(:or, val[0], val[1], val[2]) + + result +end + +def _reduce_241(val, _values, result) + result = @builder.keyword_cmd(:defined?, val[0], nil, [ val[2] ], nil) + + result +end + +def _reduce_242(val, _values, result) + result = @builder.ternary(val[0], val[1], + val[2], val[4], val[5]) + + result +end + +# reduce 243 omitted + +# reduce 244 omitted + +# reduce 245 omitted + +# reduce 246 omitted + +# reduce 247 omitted + +def _reduce_248(val, _values, result) + result = @builder.binary_op(val[0], val[1], val[2]) + + result +end + +def _reduce_249(val, _values, result) + result = @builder.binary_op(val[0], val[1], val[2]) + + result +end + +# reduce 250 omitted + +# reduce 251 omitted + +# reduce 252 omitted + +def _reduce_253(val, _values, result) + result = val[0] << @builder.associate(nil, val[2], nil) + + result +end + +def _reduce_254(val, _values, result) + result = [ @builder.associate(nil, val[0], nil) ] + + result +end + +# reduce 255 omitted + +def _reduce_256(val, _values, result) + rescue_body = @builder.rescue_body(val[1], + nil, nil, nil, + nil, val[2]) + + result = @builder.begin_body(val[0], [ rescue_body ]) + + result +end + +def _reduce_257(val, _values, result) + result = val + + result +end + +def _reduce_258(val, _values, result) + unless @static_env.declared_forward_args? + diagnostic :error, :unexpected_token, { :token => 'tBDOT3' } , val[3] + end + + result = [val[0], [*val[1], @builder.forwarded_args(val[3])], val[4]] + + result +end + +def _reduce_259(val, _values, result) + unless @static_env.declared_forward_args? + diagnostic :error, :unexpected_token, { :token => 'tBDOT3' } , val[1] + end + + result = [val[0], [@builder.forwarded_args(val[1])], val[2]] + + result +end + +def _reduce_260(val, _values, result) + result = [ nil, [], nil ] + + result +end + +# reduce 261 omitted + +def _reduce_262(val, _values, result) + result = [] + + result +end + +# reduce 263 omitted + +# reduce 264 omitted + +def _reduce_265(val, _values, result) + result = val[0] << @builder.associate(nil, val[2], nil) + + result +end + +def _reduce_266(val, _values, result) + result = [ @builder.associate(nil, val[0], nil) ] + + result +end + +def _reduce_267(val, _values, result) + result = [ val[0] ] + + result +end + +def _reduce_268(val, _values, result) + result = val[0].concat(val[1]) + + result +end + +def _reduce_269(val, _values, result) + result = [ @builder.associate(nil, val[0], nil) ] + result.concat(val[1]) + + result +end + +def _reduce_270(val, _values, result) + assocs = @builder.associate(nil, val[2], nil) + result = val[0] << assocs + result.concat(val[3]) + + result +end + +def _reduce_271(val, _values, result) + result = [ val[0] ] + + result +end + +def _reduce_272(val, _values, result) + # When branch gets invoked by RACC's lookahead + # and command args start with '[' or '(' + # we need to put `true` to the cmdarg stack + # **before** `false` pushed by lexer + # m [], n + # ^ + # Right here we have cmdarg [...0] because + # lexer pushed it on '[' + # We need to modify cmdarg stack to [...10] + # + # For all other cases (like `m n` or `m n, []`) we simply put 1 to the stack + # and later lexer pushes corresponding bits on top of it. + last_token = @last_token[0] + lookahead = last_token == :tLBRACK || last_token == :tLPAREN_ARG + + if lookahead + top = @lexer.cmdarg.pop + @lexer.cmdarg.push(true) + @lexer.cmdarg.push(top) + else + @lexer.cmdarg.push(true) + end + + result +end + +def _reduce_273(val, _values, result) + # call_args can be followed by tLBRACE_ARG (that does cmdarg.push(0) in the lexer) + # but the push must be done after cmdarg.pop() in the parser. + # So this code does cmdarg.pop() to pop 0 pushed by tLBRACE_ARG, + # cmdarg.pop() to pop 1 pushed by command_args, + # and cmdarg.push(0) to restore back the flag set by tLBRACE_ARG. + last_token = @last_token[0] + lookahead = last_token == :tLBRACE_ARG + if lookahead + top = @lexer.cmdarg.pop + @lexer.cmdarg.pop + @lexer.cmdarg.push(top) + else + @lexer.cmdarg.pop + end + + result = val[1] + + result +end + +def _reduce_274(val, _values, result) + result = @builder.block_pass(val[0], val[1]) + + result +end + +def _reduce_275(val, _values, result) + result = [ val[1] ] + + result +end + +def _reduce_276(val, _values, result) + result = [] + + result +end + +def _reduce_277(val, _values, result) + result = [ val[0] ] + + result +end + +def _reduce_278(val, _values, result) + result = [ @builder.splat(val[0], val[1]) ] + + result +end + +def _reduce_279(val, _values, result) + result = val[0] << val[2] + + result +end + +def _reduce_280(val, _values, result) + result = val[0] << @builder.splat(val[2], val[3]) + + result +end + +def _reduce_281(val, _values, result) + result = @builder.array(nil, val[0], nil) + + result +end + +# reduce 282 omitted + +def _reduce_283(val, _values, result) + result = val[0] << val[2] + + result +end + +def _reduce_284(val, _values, result) + result = val[0] << @builder.splat(val[2], val[3]) + + result +end + +def _reduce_285(val, _values, result) + result = [ @builder.splat(val[0], val[1]) ] + + result +end + +# reduce 286 omitted + +# reduce 287 omitted + +# reduce 288 omitted + +# reduce 289 omitted + +# reduce 290 omitted + +# reduce 291 omitted + +# reduce 292 omitted + +# reduce 293 omitted + +# reduce 294 omitted + +# reduce 295 omitted + +def _reduce_296(val, _values, result) + result = @builder.call_method(nil, nil, val[0]) + + result +end + +def _reduce_297(val, _values, result) + @lexer.cmdarg.push(false) + + result +end + +def _reduce_298(val, _values, result) + @lexer.cmdarg.pop + + result = @builder.begin_keyword(val[0], val[2], val[3]) + + result +end + +def _reduce_299(val, _values, result) + @lexer.state = :expr_endarg + + result +end + +def _reduce_300(val, _values, result) + result = @builder.begin(val[0], val[1], val[3]) + + result +end + +def _reduce_301(val, _values, result) + @lexer.state = :expr_endarg + + result +end + +def _reduce_302(val, _values, result) + result = @builder.begin(val[0], nil, val[3]) + + result +end + +def _reduce_303(val, _values, result) + result = @builder.begin(val[0], val[1], val[2]) + + result +end + +def _reduce_304(val, _values, result) + result = @builder.const_fetch(val[0], val[1], val[2]) + + result +end + +def _reduce_305(val, _values, result) + result = @builder.const_global(val[0], val[1]) + + result +end + +def _reduce_306(val, _values, result) + result = @builder.array(val[0], val[1], val[2]) + + result +end + +def _reduce_307(val, _values, result) + result = @builder.associate(val[0], val[1], val[2]) + + result +end + +def _reduce_308(val, _values, result) + result = @builder.keyword_cmd(:return, val[0]) + + result +end + +def _reduce_309(val, _values, result) + result = @builder.keyword_cmd(:yield, val[0], val[1], val[2], val[3]) + + result +end + +def _reduce_310(val, _values, result) + result = @builder.keyword_cmd(:yield, val[0], val[1], [], val[2]) + + result +end + +def _reduce_311(val, _values, result) + result = @builder.keyword_cmd(:yield, val[0]) + + result +end + +def _reduce_312(val, _values, result) + result = @builder.keyword_cmd(:defined?, val[0], + val[2], [ val[3] ], val[4]) + + result +end + +def _reduce_313(val, _values, result) + result = @builder.not_op(val[0], val[1], val[2], val[3]) + + result +end + +def _reduce_314(val, _values, result) + result = @builder.not_op(val[0], val[1], nil, val[2]) + + result +end + +def _reduce_315(val, _values, result) + method_call = @builder.call_method(nil, nil, val[0]) + + begin_t, args, body, end_t = val[1] + result = @builder.block(method_call, + begin_t, args, body, end_t) + + result +end + +# reduce 316 omitted + +def _reduce_317(val, _values, result) + begin_t, args, body, end_t = val[1] + result = @builder.block(val[0], + begin_t, args, body, end_t) + + result +end + +def _reduce_318(val, _values, result) + result = @context.dup + @context.in_lambda = true + + result +end + +def _reduce_319(val, _values, result) + lambda_call = @builder.call_lambda(val[0]) + + args, (begin_t, body, end_t) = val[2] + result = @builder.block(lambda_call, + begin_t, args, body, end_t) + + @context.in_lambda = val[1].in_lambda + + result +end + +def _reduce_320(val, _values, result) + else_t, else_ = val[4] + result = @builder.condition(val[0], val[1], val[2], + val[3], else_t, + else_, val[5]) + + result +end + +def _reduce_321(val, _values, result) + else_t, else_ = val[4] + result = @builder.condition(val[0], val[1], val[2], + else_, else_t, + val[3], val[5]) + + result +end + +def _reduce_322(val, _values, result) + result = @builder.loop(:while, val[0], *val[1], val[2], val[3]) + + result +end + +def _reduce_323(val, _values, result) + result = @builder.loop(:until, val[0], *val[1], val[2], val[3]) + + result +end + +def _reduce_324(val, _values, result) + *when_bodies, (else_t, else_body) = *val[3] + + result = @builder.case(val[0], val[1], + when_bodies, else_t, else_body, + val[4]) + + result +end + +def _reduce_325(val, _values, result) + *when_bodies, (else_t, else_body) = *val[2] + + result = @builder.case(val[0], nil, + when_bodies, else_t, else_body, + val[3]) + + result +end + +def _reduce_326(val, _values, result) + *in_bodies, (else_t, else_body) = *val[3] + + result = @builder.case_match(val[0], val[1], + in_bodies, else_t, else_body, + val[4]) + + result +end + +def _reduce_327(val, _values, result) + result = @builder.for(val[0], val[1], val[2], *val[3], val[4], val[5]) + + result +end + +def _reduce_328(val, _values, result) + local_push + @context.in_class = true + + result +end + +def _reduce_329(val, _values, result) + k_class, ctx = val[0] + if @context.in_def + diagnostic :error, :class_in_def, nil, k_class + end + + lt_t, superclass = val[2] + result = @builder.def_class(k_class, val[1], + lt_t, superclass, + val[4], val[5]) + + local_pop + @context.in_class = ctx.in_class + + result +end + +def _reduce_330(val, _values, result) + @context.in_def = false + @context.in_class = false + local_push + + result +end + +def _reduce_331(val, _values, result) + k_class, ctx = val[0] + result = @builder.def_sclass(k_class, val[1], val[2], + val[5], val[6]) + + local_pop + @context.in_def = ctx.in_def + @context.in_class = ctx.in_class + + result +end + +def _reduce_332(val, _values, result) + @context.in_class = true + local_push + + result +end + +def _reduce_333(val, _values, result) + k_mod, ctx = val[0] + if @context.in_def + diagnostic :error, :module_in_def, nil, k_mod + end + + result = @builder.def_module(k_mod, val[1], + val[3], val[4]) + + local_pop + @context.in_class = ctx.in_class + + result +end + +def _reduce_334(val, _values, result) + local_push + result = context.dup + @context.in_def = true + @current_arg_stack.push(nil) + + result +end + +def _reduce_335(val, _values, result) + result = @builder.def_method(val[0], val[1], + val[3], val[4], val[5]) + + local_pop + @context.in_def = val[2].in_def + @current_arg_stack.pop + + result +end + +def _reduce_336(val, _values, result) + @lexer.state = :expr_fname + + result +end + +def _reduce_337(val, _values, result) + local_push + result = context.dup + @context.in_def = true + @current_arg_stack.push(nil) + + result +end + +def _reduce_338(val, _values, result) + result = @builder.def_singleton(val[0], val[1], val[2], + val[4], val[6], val[7], val[8]) + + local_pop + @context.in_def = val[5].in_def + @current_arg_stack.pop + + result +end + +def _reduce_339(val, _values, result) + result = @builder.keyword_cmd(:break, val[0]) + + result +end + +def _reduce_340(val, _values, result) + result = @builder.keyword_cmd(:next, val[0]) + + result +end + +def _reduce_341(val, _values, result) + result = @builder.keyword_cmd(:redo, val[0]) + + result +end + +def _reduce_342(val, _values, result) + result = @builder.keyword_cmd(:retry, val[0]) + + result +end + +# reduce 343 omitted + +def _reduce_344(val, _values, result) + result = [ val[0], @context.dup ] + + result +end + +def _reduce_345(val, _values, result) + result = [ val[0], @context.dup ] + + result +end + +def _reduce_346(val, _values, result) + result = val[0] + + result +end + +def _reduce_347(val, _values, result) + if @context.in_class && !@context.in_def && !(context.in_block || context.in_lambda) + diagnostic :error, :invalid_return, nil, val[0] + end + + result +end + +# reduce 348 omitted + +# reduce 349 omitted + +def _reduce_350(val, _values, result) + result = val[1] + + result +end + +# reduce 351 omitted + +# reduce 352 omitted + +# reduce 353 omitted + +def _reduce_354(val, _values, result) + else_t, else_ = val[4] + result = [ val[0], + @builder.condition(val[0], val[1], val[2], + val[3], else_t, + else_, nil), + ] + + result +end + +# reduce 355 omitted + +def _reduce_356(val, _values, result) + result = val + + result +end + +# reduce 357 omitted + +# reduce 358 omitted + +def _reduce_359(val, _values, result) + result = @builder.arg(val[0]) + + result +end + +def _reduce_360(val, _values, result) + result = @builder.multi_lhs(val[0], val[1], val[2]) + + result +end + +def _reduce_361(val, _values, result) + result = [ val[0] ] + + result +end + +def _reduce_362(val, _values, result) + result = val[0] << val[2] + + result +end + +# reduce 363 omitted + +def _reduce_364(val, _values, result) + result = val[0]. + push(val[2]) + + result +end + +def _reduce_365(val, _values, result) + result = val[0]. + push(val[2]). + concat(val[4]) + + result +end + +def _reduce_366(val, _values, result) + result = [ val[0] ] + + result +end + +def _reduce_367(val, _values, result) + result = [ val[0], *val[2] ] + + result +end + +def _reduce_368(val, _values, result) + result = @builder.restarg(val[0], val[1]) + + result +end + +def _reduce_369(val, _values, result) + result = @builder.restarg(val[0]) + + result +end + +def _reduce_370(val, _values, result) + result = val[0].concat(val[2]).concat(val[3]) + + result +end + +def _reduce_371(val, _values, result) + result = val[0].concat(val[1]) + + result +end + +def _reduce_372(val, _values, result) + result = val[0].concat(val[1]) + + result +end + +def _reduce_373(val, _values, result) + result = val[0].concat(val[1]) + + result +end + +def _reduce_374(val, _values, result) + result = [ val[0] ] + + result +end + +def _reduce_375(val, _values, result) + result = val[1] + + result +end + +def _reduce_376(val, _values, result) + result = [] + + result +end + +def _reduce_377(val, _values, result) + result = val[0]. + concat(val[2]). + concat(val[4]). + concat(val[5]) + + result +end + +def _reduce_378(val, _values, result) + result = val[0]. + concat(val[2]). + concat(val[4]). + concat(val[6]). + concat(val[7]) + + result +end + +def _reduce_379(val, _values, result) + result = val[0]. + concat(val[2]). + concat(val[3]) + + result +end + +def _reduce_380(val, _values, result) + result = val[0]. + concat(val[2]). + concat(val[4]). + concat(val[5]) + + result +end + +def _reduce_381(val, _values, result) + result = val[0]. + concat(val[2]). + concat(val[3]) + + result +end + +# reduce 382 omitted + +def _reduce_383(val, _values, result) + result = val[0]. + concat(val[2]). + concat(val[4]). + concat(val[5]) + + result +end + +def _reduce_384(val, _values, result) + if val[1].empty? && val[0].size == 1 + result = [@builder.procarg0(val[0][0])] + else + result = val[0].concat(val[1]) + end + + result +end + +def _reduce_385(val, _values, result) + result = val[0]. + concat(val[2]). + concat(val[3]) + + result +end + +def _reduce_386(val, _values, result) + result = val[0]. + concat(val[2]). + concat(val[4]). + concat(val[5]) + + result +end + +def _reduce_387(val, _values, result) + result = val[0]. + concat(val[1]) + + result +end + +def _reduce_388(val, _values, result) + result = val[0]. + concat(val[2]). + concat(val[3]) + + result +end + +def _reduce_389(val, _values, result) + result = val[0]. + concat(val[1]) + + result +end + +def _reduce_390(val, _values, result) + result = val[0]. + concat(val[2]). + concat(val[3]) + + result +end + +# reduce 391 omitted + +def _reduce_392(val, _values, result) + result = @builder.args(nil, [], nil) + + result +end + +def _reduce_393(val, _values, result) + @lexer.state = :expr_value + + result +end + +def _reduce_394(val, _values, result) + @max_numparam_stack.has_ordinary_params! + @current_arg_stack.set(nil) + result = @builder.args(val[0], val[1], val[2]) + + result +end + +def _reduce_395(val, _values, result) + @max_numparam_stack.has_ordinary_params! + @current_arg_stack.set(nil) + result = @builder.args(val[0], val[1].concat(val[2]), val[3]) + + result +end + +def _reduce_396(val, _values, result) + result = [] + + result +end + +def _reduce_397(val, _values, result) + result = val[2] + + result +end + +def _reduce_398(val, _values, result) + result = [ val[0] ] + + result +end + +def _reduce_399(val, _values, result) + result = val[0] << val[2] + + result +end + +def _reduce_400(val, _values, result) + @static_env.declare val[0][0] + result = @builder.shadowarg(val[0]) + + result +end + +# reduce 401 omitted + +def _reduce_402(val, _values, result) + @static_env.extend_dynamic + @max_numparam_stack.push(static: false) + + result +end + +def _reduce_403(val, _values, result) + @lexer.cmdarg.push(false) + + result +end + +def _reduce_404(val, _values, result) + args = @max_numparam_stack.has_numparams? ? @builder.numargs(@max_numparam_stack.top) : val[1] + result = [ args, val[3] ] + + @max_numparam_stack.pop + @static_env.unextend + @lexer.cmdarg.pop + + result +end + +def _reduce_405(val, _values, result) + @max_numparam_stack.has_ordinary_params! + result = @builder.args(val[0], val[1].concat(val[2]), val[3]) + + result +end + +def _reduce_406(val, _values, result) + if val[0].any? + @max_numparam_stack.has_ordinary_params! + end + result = @builder.args(nil, val[0], nil) + + result +end + +def _reduce_407(val, _values, result) + result = @context.dup + @context.in_lambda = true + + result +end + +def _reduce_408(val, _values, result) + result = [ val[0], val[2], val[3] ] + @context.in_lambda = val[1].in_lambda + + result +end + +def _reduce_409(val, _values, result) + result = @context.dup + @context.in_lambda = true + + result +end + +def _reduce_410(val, _values, result) + result = [ val[0], val[2], val[3] ] + @context.in_lambda = val[1].in_lambda + + result +end + +def _reduce_411(val, _values, result) + result = @context.dup + @context.in_block = true + + result +end + +def _reduce_412(val, _values, result) + result = [ val[0], *val[2], val[3] ] + @context.in_block = val[1].in_block + + result +end + +def _reduce_413(val, _values, result) + begin_t, block_args, body, end_t = val[1] + result = @builder.block(val[0], + begin_t, block_args, body, end_t) + + result +end + +def _reduce_414(val, _values, result) + lparen_t, args, rparen_t = val[3] + result = @builder.call_method(val[0], val[1], val[2], + lparen_t, args, rparen_t) + + result +end + +def _reduce_415(val, _values, result) + lparen_t, args, rparen_t = val[3] + method_call = @builder.call_method(val[0], val[1], val[2], + lparen_t, args, rparen_t) + + begin_t, args, body, end_t = val[4] + result = @builder.block(method_call, + begin_t, args, body, end_t) + + result +end + +def _reduce_416(val, _values, result) + method_call = @builder.call_method(val[0], val[1], val[2], + nil, val[3], nil) + + begin_t, args, body, end_t = val[4] + result = @builder.block(method_call, + begin_t, args, body, end_t) + + result +end + +def _reduce_417(val, _values, result) + lparen_t, args, rparen_t = val[1] + result = @builder.call_method(nil, nil, val[0], + lparen_t, args, rparen_t) + + result +end + +def _reduce_418(val, _values, result) + lparen_t, args, rparen_t = val[3] + result = @builder.call_method(val[0], val[1], val[2], + lparen_t, args, rparen_t) + + result +end + +def _reduce_419(val, _values, result) + lparen_t, args, rparen_t = val[3] + result = @builder.call_method(val[0], val[1], val[2], + lparen_t, args, rparen_t) + + result +end + +def _reduce_420(val, _values, result) + result = @builder.call_method(val[0], val[1], val[2]) + + result +end + +def _reduce_421(val, _values, result) + lparen_t, args, rparen_t = val[2] + result = @builder.call_method(val[0], val[1], nil, + lparen_t, args, rparen_t) + + result +end + +def _reduce_422(val, _values, result) + lparen_t, args, rparen_t = val[2] + result = @builder.call_method(val[0], val[1], nil, + lparen_t, args, rparen_t) + + result +end + +def _reduce_423(val, _values, result) + lparen_t, args, rparen_t = val[1] + result = @builder.keyword_cmd(:super, val[0], + lparen_t, args, rparen_t) + + result +end + +def _reduce_424(val, _values, result) + result = @builder.keyword_cmd(:zsuper, val[0]) + + result +end + +def _reduce_425(val, _values, result) + result = @builder.index(val[0], val[1], val[2], val[3]) + + result +end + +def _reduce_426(val, _values, result) + result = @context.dup + @context.in_block = true + + result +end + +def _reduce_427(val, _values, result) + result = [ val[0], *val[2], val[3] ] + @context.in_block = val[1].in_block + + result +end + +def _reduce_428(val, _values, result) + result = @context.dup + @context.in_block = true + + result +end + +def _reduce_429(val, _values, result) + result = [ val[0], *val[2], val[3] ] + @context.in_block = val[1].in_block + + result +end + +def _reduce_430(val, _values, result) + @static_env.extend_dynamic + @max_numparam_stack.push(static: false) + + result +end + +def _reduce_431(val, _values, result) + args = @max_numparam_stack.has_numparams? ? @builder.numargs(@max_numparam_stack.top) : val[1] + result = [ args, val[2] ] + + @max_numparam_stack.pop + @static_env.unextend + + result +end + +def _reduce_432(val, _values, result) + @static_env.extend_dynamic + @max_numparam_stack.push(static: false) + + result +end + +def _reduce_433(val, _values, result) + @lexer.cmdarg.push(false) + + result +end + +def _reduce_434(val, _values, result) + args = @max_numparam_stack.has_numparams? ? @builder.numargs(@max_numparam_stack.top) : val[2] + result = [ args, val[3] ] + + @max_numparam_stack.pop + @static_env.unextend + @lexer.cmdarg.pop + + result +end + +def _reduce_435(val, _values, result) + result = [ @builder.when(val[0], val[1], val[2], val[3]), + *val[4] ] + + result +end + +def _reduce_436(val, _values, result) + result = [ val[0] ] + + result +end + +# reduce 437 omitted + +def _reduce_438(val, _values, result) + @lexer.state = :expr_beg + @lexer.command_start = false + @pattern_variables.push + @pattern_hash_keys.push + + result = @context.in_kwarg + @context.in_kwarg = true + + result +end + +def _reduce_439(val, _values, result) + @pattern_hash_keys.pop + @pattern_variables.pop + @context.in_kwarg = val[1] + + result +end + +def _reduce_440(val, _values, result) + result = [ @builder.in_pattern(val[0], *val[2], val[3], val[5]), + *val[6] ] + + result +end + +def _reduce_441(val, _values, result) + result = [ val[0] ] + + result +end + +# reduce 442 omitted + +def _reduce_443(val, _values, result) + result = [ val[0], nil ] + + result +end + +def _reduce_444(val, _values, result) + result = [ val[0], @builder.if_guard(val[1], val[2]) ] + + result +end + +def _reduce_445(val, _values, result) + result = [ val[0], @builder.unless_guard(val[1], val[2]) ] + + result +end + +# reduce 446 omitted + +def _reduce_447(val, _values, result) + # array patterns that end with comma + # like 1, 2, + # must be emitted as `array_pattern_with_tail` + item = @builder.match_with_trailing_comma(val[0], val[1]) + result = @builder.array_pattern(nil, [ item ], nil) + + result +end + +def _reduce_448(val, _values, result) + result = @builder.array_pattern(nil, [val[0]].concat(val[2]), nil) + + result +end + +def _reduce_449(val, _values, result) + result = @builder.array_pattern(nil, val[0], nil) + + result +end + +def _reduce_450(val, _values, result) + result = @builder.hash_pattern(nil, val[0], nil) + + result +end + +# reduce 451 omitted + +def _reduce_452(val, _values, result) + result = @builder.match_as(val[0], val[1], val[2]) + + result +end + +# reduce 453 omitted + +def _reduce_454(val, _values, result) + result = @builder.match_alt(val[0], val[1], val[2]) + + result +end + +# reduce 455 omitted + +def _reduce_456(val, _values, result) + result = val[0] + @pattern_hash_keys.push + + result +end + +def _reduce_457(val, _values, result) + result = val[0] + @pattern_hash_keys.push + + result +end + +# reduce 458 omitted + +def _reduce_459(val, _values, result) + @pattern_hash_keys.pop + pattern = @builder.array_pattern(nil, val[2], nil) + result = @builder.const_pattern(val[0], val[1], pattern, val[3]) + + result +end + +def _reduce_460(val, _values, result) + @pattern_hash_keys.pop + pattern = @builder.hash_pattern(nil, val[2], nil) + result = @builder.const_pattern(val[0], val[1], pattern, val[3]) + + result +end + +def _reduce_461(val, _values, result) + pattern = @builder.array_pattern(val[1], nil, val[2]) + result = @builder.const_pattern(val[0], val[1], pattern, val[2]) + + result +end + +def _reduce_462(val, _values, result) + @pattern_hash_keys.pop + pattern = @builder.array_pattern(nil, val[2], nil) + result = @builder.const_pattern(val[0], val[1], pattern, val[3]) + + result +end + +def _reduce_463(val, _values, result) + @pattern_hash_keys.pop + pattern = @builder.hash_pattern(nil, val[2], nil) + result = @builder.const_pattern(val[0], val[1], pattern, val[3]) + + result +end + +def _reduce_464(val, _values, result) + pattern = @builder.array_pattern(val[1], nil, val[2]) + result = @builder.const_pattern(val[0], val[1], pattern, val[2]) + + result +end + +def _reduce_465(val, _values, result) + @pattern_hash_keys.push + + result +end + +def _reduce_466(val, _values, result) + @pattern_hash_keys.pop + result = @builder.array_pattern(val[0], val[2], val[3]) + + result +end + +def _reduce_467(val, _values, result) + result = @builder.array_pattern(val[0], [], val[1]) + + result +end + +def _reduce_468(val, _values, result) + @pattern_hash_keys.push + result = @context.in_kwarg + @context.in_kwarg = false + + result +end + +def _reduce_469(val, _values, result) + @pattern_hash_keys.pop + @context.in_kwarg = val[1] + result = @builder.hash_pattern(val[0], val[2], val[3]) + + result +end + +def _reduce_470(val, _values, result) + result = @builder.hash_pattern(val[0], [], val[1]) + + result +end + +def _reduce_471(val, _values, result) + @pattern_hash_keys.push + + result +end + +def _reduce_472(val, _values, result) + @pattern_hash_keys.pop + result = @builder.begin(val[0], val[2], val[3]) + + result +end + +def _reduce_473(val, _values, result) + result = [ val[0] ] + + result +end + +def _reduce_474(val, _values, result) + result = val[0] + + result +end + +def _reduce_475(val, _values, result) + result = [ *val[0], val[1] ] + + result +end + +def _reduce_476(val, _values, result) + match_rest = @builder.match_rest(val[1], val[2]) + result = [ *val[0], match_rest ] + + result +end + +def _reduce_477(val, _values, result) + match_rest = @builder.match_rest(val[1], val[2]) + result = [ *val[0], match_rest, *val[4] ] + + result +end + +def _reduce_478(val, _values, result) + result = [ *val[0], @builder.match_rest(val[1]) ] + + result +end + +def _reduce_479(val, _values, result) + result = [ *val[0], @builder.match_rest(val[1]), *val[3] ] + + result +end + +# reduce 480 omitted + +def _reduce_481(val, _values, result) + # array patterns that end with comma + # like [1, 2,] + # must be emitted as `array_pattern_with_tail` + item = @builder.match_with_trailing_comma(val[0], val[1]) + result = [ item ] + + result +end + +def _reduce_482(val, _values, result) + # array patterns that end with comma + # like [1, 2,] + # must be emitted as `array_pattern_with_tail` + last_item = @builder.match_with_trailing_comma(val[1], val[2]) + result = [ *val[0], last_item ] + + result +end + +def _reduce_483(val, _values, result) + match_rest = @builder.match_rest(val[0], val[1]) + result = [ match_rest ] + + result +end + +def _reduce_484(val, _values, result) + match_rest = @builder.match_rest(val[0], val[1]) + result = [ match_rest, *val[3] ] + + result +end + +def _reduce_485(val, _values, result) + match_rest = @builder.match_rest(val[0]) + result = [ match_rest ] + + result +end + +def _reduce_486(val, _values, result) + match_rest = @builder.match_rest(val[0]) + result = [ match_rest, *val[2] ] + + result +end + +def _reduce_487(val, _values, result) + result = [ val[0] ] + + result +end + +def _reduce_488(val, _values, result) + result = [ *val[0], val[2] ] + + result +end + +# reduce 489 omitted + +def _reduce_490(val, _values, result) + result = [ *val[0], *val[2] ] + + result +end + +def _reduce_491(val, _values, result) + result = val[0] + + result +end + +def _reduce_492(val, _values, result) + result = val[0] + + result +end + +def _reduce_493(val, _values, result) + result = val[0] + + result +end + +def _reduce_494(val, _values, result) + result = [ *val[0], *val[2] ] + + result +end + +def _reduce_495(val, _values, result) + result = [ *val[0], *val[2] ] + + result +end + +def _reduce_496(val, _values, result) + result = [ val[0] ] + + result +end + +def _reduce_497(val, _values, result) + result = [ *val[0], val[2] ] + + result +end + +def _reduce_498(val, _values, result) + result = @builder.match_pair(*val[0], val[1]) + + result +end + +def _reduce_499(val, _values, result) + result = @builder.match_label(*val[0]) + + result +end + +def _reduce_500(val, _values, result) + result = [:label, val[0]] + + result +end + +def _reduce_501(val, _values, result) + result = [:quoted, [val[0], val[1], val[2]]] + + result +end + +def _reduce_502(val, _values, result) + result = [ @builder.match_rest(val[0], val[1]) ] + + result +end + +def _reduce_503(val, _values, result) + result = [ @builder.match_rest(val[0], nil) ] + + result +end + +def _reduce_504(val, _values, result) + result = [ @builder.match_nil_pattern(val[0], val[1]) ] + + result +end + +# reduce 505 omitted + +def _reduce_506(val, _values, result) + result = @builder.range_inclusive(val[0], val[1], val[2]) + + result +end + +def _reduce_507(val, _values, result) + result = @builder.range_exclusive(val[0], val[1], val[2]) + + result +end + +def _reduce_508(val, _values, result) + result = @builder.range_inclusive(val[0], val[1], nil) + + result +end + +def _reduce_509(val, _values, result) + result = @builder.range_exclusive(val[0], val[1], nil) + + result +end + +# reduce 510 omitted + +# reduce 511 omitted + +# reduce 512 omitted + +def _reduce_513(val, _values, result) + result = @builder.range_inclusive(nil, val[0], val[1]) + + result +end + +def _reduce_514(val, _values, result) + result = @builder.range_exclusive(nil, val[0], val[1]) + + result +end + +# reduce 515 omitted + +# reduce 516 omitted + +# reduce 517 omitted + +# reduce 518 omitted + +# reduce 519 omitted + +# reduce 520 omitted + +# reduce 521 omitted + +# reduce 522 omitted + +def _reduce_523(val, _values, result) + result = @builder.accessible(val[0]) + + result +end + +def _reduce_524(val, _values, result) + result = @context.dup + @context.in_lambda = true + + result +end + +def _reduce_525(val, _values, result) + lambda_call = @builder.call_lambda(val[0]) + + args, (begin_t, body, end_t) = val[2] + result = @builder.block(lambda_call, + begin_t, args, body, end_t) + + @context.in_lambda = val[1].in_lambda + + result +end + +def _reduce_526(val, _values, result) + result = @builder.assignable(@builder.match_var(val[0])) + + result +end + +def _reduce_527(val, _values, result) + name = val[1][0] + unless static_env.declared?(name) + diagnostic :error, :undefined_lvar, { :name => name }, val[1] + end + + lvar = @builder.accessible(@builder.ident(val[1])) + result = @builder.pin(val[0], lvar) + + result +end + +def _reduce_528(val, _values, result) + result = @builder.const_global(val[0], val[1]) + + result +end + +def _reduce_529(val, _values, result) + result = @builder.const_fetch(val[0], val[1], val[2]) + + result +end + +def _reduce_530(val, _values, result) + result = @builder.const(val[0]) + + result +end + +def _reduce_531(val, _values, result) + assoc_t, exc_var = val[2] + + if val[1] + exc_list = @builder.array(nil, val[1], nil) + end + + result = [ @builder.rescue_body(val[0], + exc_list, assoc_t, exc_var, + val[3], val[4]), + *val[5] ] + + result +end + +def _reduce_532(val, _values, result) + result = [] + + result +end + +def _reduce_533(val, _values, result) + result = [ val[0] ] + + result +end + +# reduce 534 omitted + +# reduce 535 omitted + +def _reduce_536(val, _values, result) + result = [ val[0], val[1] ] + + result +end + +# reduce 537 omitted + +def _reduce_538(val, _values, result) + result = [ val[0], val[1] ] + + result +end + +# reduce 539 omitted + +# reduce 540 omitted + +# reduce 541 omitted + +def _reduce_542(val, _values, result) + result = @builder.string_compose(nil, val[0], nil) + + result +end + +def _reduce_543(val, _values, result) + result = [ val[0] ] + + result +end + +def _reduce_544(val, _values, result) + result = val[0] << val[1] + + result +end + +def _reduce_545(val, _values, result) + string = @builder.string_compose(val[0], val[1], val[2]) + result = @builder.dedent_string(string, @lexer.dedent_level) + + result +end + +def _reduce_546(val, _values, result) + string = @builder.string(val[0]) + result = @builder.dedent_string(string, @lexer.dedent_level) + + result +end + +def _reduce_547(val, _values, result) + result = @builder.character(val[0]) + + result +end + +def _reduce_548(val, _values, result) + string = @builder.xstring_compose(val[0], val[1], val[2]) + result = @builder.dedent_string(string, @lexer.dedent_level) + + result +end + +def _reduce_549(val, _values, result) + opts = @builder.regexp_options(val[3]) + result = @builder.regexp_compose(val[0], val[1], val[2], opts) + + result +end + +def _reduce_550(val, _values, result) + result = @builder.words_compose(val[0], val[1], val[2]) + + result +end + +def _reduce_551(val, _values, result) + result = [] + + result +end + +def _reduce_552(val, _values, result) + result = val[0] << @builder.word(val[1]) + + result +end + +def _reduce_553(val, _values, result) + result = [ val[0] ] + + result +end + +def _reduce_554(val, _values, result) + result = val[0] << val[1] + + result +end + +def _reduce_555(val, _values, result) + result = @builder.symbols_compose(val[0], val[1], val[2]) + + result +end + +def _reduce_556(val, _values, result) + result = [] + + result +end + +def _reduce_557(val, _values, result) + result = val[0] << @builder.word(val[1]) + + result +end + +def _reduce_558(val, _values, result) + result = @builder.words_compose(val[0], val[1], val[2]) + + result +end + +def _reduce_559(val, _values, result) + result = @builder.symbols_compose(val[0], val[1], val[2]) + + result +end + +def _reduce_560(val, _values, result) + result = [] + + result +end + +def _reduce_561(val, _values, result) + result = val[0] << @builder.string_internal(val[1]) + + result +end + +def _reduce_562(val, _values, result) + result = [] + + result +end + +def _reduce_563(val, _values, result) + result = val[0] << @builder.symbol_internal(val[1]) + + result +end + +def _reduce_564(val, _values, result) + result = [] + + result +end + +def _reduce_565(val, _values, result) + result = val[0] << val[1] + + result +end + +def _reduce_566(val, _values, result) + result = [] + + result +end + +def _reduce_567(val, _values, result) + result = val[0] << val[1] + + result +end + +def _reduce_568(val, _values, result) + result = [] + + result +end + +def _reduce_569(val, _values, result) + result = val[0] << val[1] + + result +end + +def _reduce_570(val, _values, result) + result = @builder.string_internal(val[0]) + + result +end + +def _reduce_571(val, _values, result) + result = val[1] + + result +end + +def _reduce_572(val, _values, result) + @lexer.cmdarg.push(false) + @lexer.cond.push(false) + + result +end + +def _reduce_573(val, _values, result) + @lexer.cmdarg.pop + @lexer.cond.pop + + result = @builder.begin(val[0], val[2], val[3]) + + result +end + +def _reduce_574(val, _values, result) + result = @builder.gvar(val[0]) + + result +end + +def _reduce_575(val, _values, result) + result = @builder.ivar(val[0]) + + result +end + +def _reduce_576(val, _values, result) + result = @builder.cvar(val[0]) + + result +end + +# reduce 577 omitted + +# reduce 578 omitted + +# reduce 579 omitted + +def _reduce_580(val, _values, result) + @lexer.state = :expr_end + result = @builder.symbol(val[0]) + + result +end + +def _reduce_581(val, _values, result) + @lexer.state = :expr_end + result = @builder.symbol_compose(val[0], val[1], val[2]) + + result +end + +def _reduce_582(val, _values, result) + result = val[0] + + result +end + +def _reduce_583(val, _values, result) + if @builder.respond_to? :negate + # AST builder interface compatibility + result = @builder.negate(val[0], val[1]) + else + result = @builder.unary_num(val[0], val[1]) + end + + result +end + +def _reduce_584(val, _values, result) + @lexer.state = :expr_end + result = @builder.integer(val[0]) + + result +end + +def _reduce_585(val, _values, result) + @lexer.state = :expr_end + result = @builder.float(val[0]) + + result +end + +def _reduce_586(val, _values, result) + @lexer.state = :expr_end + result = @builder.rational(val[0]) + + result +end + +def _reduce_587(val, _values, result) + @lexer.state = :expr_end + result = @builder.complex(val[0]) + + result +end + +def _reduce_588(val, _values, result) + result = @builder.ident(val[0]) + + result +end + +def _reduce_589(val, _values, result) + result = @builder.ivar(val[0]) + + result +end + +def _reduce_590(val, _values, result) + result = @builder.gvar(val[0]) + + result +end + +def _reduce_591(val, _values, result) + result = @builder.const(val[0]) + + result +end + +def _reduce_592(val, _values, result) + result = @builder.cvar(val[0]) + + result +end + +def _reduce_593(val, _values, result) + result = @builder.nil(val[0]) + + result +end + +def _reduce_594(val, _values, result) + result = @builder.self(val[0]) + + result +end + +def _reduce_595(val, _values, result) + result = @builder.true(val[0]) + + result +end + +def _reduce_596(val, _values, result) + result = @builder.false(val[0]) + + result +end + +def _reduce_597(val, _values, result) + result = @builder.__FILE__(val[0]) + + result +end + +def _reduce_598(val, _values, result) + result = @builder.__LINE__(val[0]) + + result +end + +def _reduce_599(val, _values, result) + result = @builder.__ENCODING__(val[0]) + + result +end + +def _reduce_600(val, _values, result) + result = @builder.accessible(val[0]) + + result +end + +def _reduce_601(val, _values, result) + result = @builder.accessible(val[0]) + + result +end + +def _reduce_602(val, _values, result) + result = @builder.assignable(val[0]) + + result +end + +def _reduce_603(val, _values, result) + result = @builder.assignable(val[0]) + + result +end + +def _reduce_604(val, _values, result) + result = @builder.nth_ref(val[0]) + + result +end + +def _reduce_605(val, _values, result) + result = @builder.back_ref(val[0]) + + result +end + +def _reduce_606(val, _values, result) + @lexer.state = :expr_value + + result +end + +def _reduce_607(val, _values, result) + result = [ val[0], val[2] ] + + result +end + +def _reduce_608(val, _values, result) + result = nil + + result +end + +def _reduce_609(val, _values, result) + result = @builder.args(val[0], val[1], val[2]) + + @lexer.state = :expr_value + + result +end + +def _reduce_610(val, _values, result) + args = [ *val[1], @builder.forward_arg(val[3]) ] + result = @builder.args(val[0], args, val[4]) + @static_env.declare_forward_args + + result +end + +def _reduce_611(val, _values, result) + result = @builder.forward_only_args(val[0], val[1], val[2]) + @static_env.declare_forward_args + + @lexer.state = :expr_value + + result +end + +def _reduce_612(val, _values, result) + result = @context.in_kwarg + @context.in_kwarg = true + + result +end + +def _reduce_613(val, _values, result) + @context.in_kwarg = val[0] + result = @builder.args(nil, val[1], nil) + + result +end + +def _reduce_614(val, _values, result) + result = val[0].concat(val[2]).concat(val[3]) + + result +end + +def _reduce_615(val, _values, result) + result = val[0].concat(val[1]) + + result +end + +def _reduce_616(val, _values, result) + result = val[0].concat(val[1]) + + result +end + +def _reduce_617(val, _values, result) + result = val[0].concat(val[1]) + + result +end + +def _reduce_618(val, _values, result) + result = [ val[0] ] + + result +end + +def _reduce_619(val, _values, result) + result = val[1] + + result +end + +def _reduce_620(val, _values, result) + result = [] + + result +end + +def _reduce_621(val, _values, result) + result = val[0]. + concat(val[2]). + concat(val[4]). + concat(val[5]) + + result +end + +def _reduce_622(val, _values, result) + result = val[0]. + concat(val[2]). + concat(val[4]). + concat(val[6]). + concat(val[7]) + + result +end + +def _reduce_623(val, _values, result) + result = val[0]. + concat(val[2]). + concat(val[3]) + + result +end + +def _reduce_624(val, _values, result) + result = val[0]. + concat(val[2]). + concat(val[4]). + concat(val[5]) + + result +end + +def _reduce_625(val, _values, result) + result = val[0]. + concat(val[2]). + concat(val[3]) + + result +end + +def _reduce_626(val, _values, result) + result = val[0]. + concat(val[2]). + concat(val[4]). + concat(val[5]) + + result +end + +def _reduce_627(val, _values, result) + result = val[0]. + concat(val[1]) + + result +end + +def _reduce_628(val, _values, result) + result = val[0]. + concat(val[2]). + concat(val[3]) + + result +end + +def _reduce_629(val, _values, result) + result = val[0]. + concat(val[2]). + concat(val[4]). + concat(val[5]) + + result +end + +def _reduce_630(val, _values, result) + result = val[0]. + concat(val[1]) + + result +end + +def _reduce_631(val, _values, result) + result = val[0]. + concat(val[2]). + concat(val[3]) + + result +end + +def _reduce_632(val, _values, result) + result = val[0]. + concat(val[1]) + + result +end + +def _reduce_633(val, _values, result) + result = val[0]. + concat(val[2]). + concat(val[3]) + + result +end + +def _reduce_634(val, _values, result) + result = val[0] + + result +end + +def _reduce_635(val, _values, result) + result = [] + + result +end + +def _reduce_636(val, _values, result) + result = val[0] + + result +end + +def _reduce_637(val, _values, result) + diagnostic :error, :argument_const, nil, val[0] + + result +end + +def _reduce_638(val, _values, result) + diagnostic :error, :argument_ivar, nil, val[0] + + result +end + +def _reduce_639(val, _values, result) + diagnostic :error, :argument_gvar, nil, val[0] + + result +end + +def _reduce_640(val, _values, result) + diagnostic :error, :argument_cvar, nil, val[0] + + result +end + +# reduce 641 omitted + +def _reduce_642(val, _values, result) + @static_env.declare val[0][0] + + @max_numparam_stack.has_ordinary_params! + + result = val[0] + + result +end + +def _reduce_643(val, _values, result) + @current_arg_stack.set(val[0][0]) + result = val[0] + + result +end + +def _reduce_644(val, _values, result) + @current_arg_stack.set(0) + result = @builder.arg(val[0]) + + result +end + +def _reduce_645(val, _values, result) + result = @builder.multi_lhs(val[0], val[1], val[2]) + + result +end + +def _reduce_646(val, _values, result) + result = [ val[0] ] + + result +end + +def _reduce_647(val, _values, result) + result = val[0] << val[2] + + result +end + +def _reduce_648(val, _values, result) + check_kwarg_name(val[0]) + + @static_env.declare val[0][0] + + @max_numparam_stack.has_ordinary_params! + + @current_arg_stack.set(val[0][0]) + + result = val[0] + + result +end + +def _reduce_649(val, _values, result) + @current_arg_stack.set(nil) + result = @builder.kwoptarg(val[0], val[1]) + + result +end + +def _reduce_650(val, _values, result) + @current_arg_stack.set(nil) + result = @builder.kwarg(val[0]) + + result +end + +def _reduce_651(val, _values, result) + result = @builder.kwoptarg(val[0], val[1]) + + result +end + +def _reduce_652(val, _values, result) + result = @builder.kwarg(val[0]) + + result +end + +def _reduce_653(val, _values, result) + result = [ val[0] ] + + result +end + +def _reduce_654(val, _values, result) + result = val[0] << val[2] + + result +end + +def _reduce_655(val, _values, result) + result = [ val[0] ] + + result +end + +def _reduce_656(val, _values, result) + result = val[0] << val[2] + + result +end + +# reduce 657 omitted + +# reduce 658 omitted + +def _reduce_659(val, _values, result) + result = [ @builder.kwnilarg(val[0], val[1]) ] + + result +end + +def _reduce_660(val, _values, result) + @static_env.declare val[1][0] + + result = [ @builder.kwrestarg(val[0], val[1]) ] + + result +end + +def _reduce_661(val, _values, result) + result = [ @builder.kwrestarg(val[0]) ] + + result +end + +def _reduce_662(val, _values, result) + @current_arg_stack.set(0) + result = @builder.optarg(val[0], val[1], val[2]) + + result +end + +def _reduce_663(val, _values, result) + @current_arg_stack.set(0) + result = @builder.optarg(val[0], val[1], val[2]) + + result +end + +def _reduce_664(val, _values, result) + result = [ val[0] ] + + result +end + +def _reduce_665(val, _values, result) + result = val[0] << val[2] + + result +end + +def _reduce_666(val, _values, result) + result = [ val[0] ] + + result +end + +def _reduce_667(val, _values, result) + result = val[0] << val[2] + + result +end + +# reduce 668 omitted + +# reduce 669 omitted + +def _reduce_670(val, _values, result) + @static_env.declare val[1][0] + + result = [ @builder.restarg(val[0], val[1]) ] + + result +end + +def _reduce_671(val, _values, result) + result = [ @builder.restarg(val[0]) ] + + result +end + +# reduce 672 omitted + +# reduce 673 omitted + +def _reduce_674(val, _values, result) + @static_env.declare val[1][0] + + result = @builder.blockarg(val[0], val[1]) + + result +end + +def _reduce_675(val, _values, result) + result = [ val[1] ] + + result +end + +def _reduce_676(val, _values, result) + result = [] + + result +end + +# reduce 677 omitted + +def _reduce_678(val, _values, result) + result = val[1] + + result +end + +def _reduce_679(val, _values, result) + result = [] + + result +end + +# reduce 680 omitted + +def _reduce_681(val, _values, result) + result = [ val[0] ] + + result +end + +def _reduce_682(val, _values, result) + result = val[0] << val[2] + + result +end + +def _reduce_683(val, _values, result) + result = @builder.pair(val[0], val[1], val[2]) + + result +end + +def _reduce_684(val, _values, result) + result = @builder.pair_keyword(val[0], val[1]) + + result +end + +def _reduce_685(val, _values, result) + result = @builder.pair_quoted(val[0], val[1], val[2], val[3]) + + result +end + +def _reduce_686(val, _values, result) + result = @builder.kwsplat(val[0], val[1]) + + result +end + +# reduce 687 omitted + +# reduce 688 omitted + +# reduce 689 omitted + +# reduce 690 omitted + +# reduce 691 omitted + +# reduce 692 omitted + +# reduce 693 omitted + +# reduce 694 omitted + +# reduce 695 omitted + +# reduce 696 omitted + +# reduce 697 omitted + +# reduce 698 omitted + +def _reduce_699(val, _values, result) + result = [:dot, val[0][1]] + + result +end + +def _reduce_700(val, _values, result) + result = [:anddot, val[0][1]] + + result +end + +# reduce 701 omitted + +# reduce 702 omitted + +# reduce 703 omitted + +# reduce 704 omitted + +def _reduce_705(val, _values, result) + result = val[1] + + result +end + +def _reduce_706(val, _values, result) + result = val[1] + + result +end + +def _reduce_707(val, _values, result) + result = val[1] + + result +end + +# reduce 708 omitted + +# reduce 709 omitted + +# reduce 710 omitted + +def _reduce_711(val, _values, result) + yyerrok + + result +end + +# reduce 712 omitted + +# reduce 713 omitted + +# reduce 714 omitted + +def _reduce_715(val, _values, result) + result = nil + + result +end + +def _reduce_none(val, _values, result) + val[0] +end + + end # class Ruby27 + end # module Parser diff --git a/vendor/bundle/ruby/3.1.0/gems/parser-3.1.2.0/lib/parser/ruby28.rb b/vendor/bundle/ruby/3.1.0/gems/parser-3.1.2.0/lib/parser/ruby28.rb new file mode 100644 index 000000000..9e077816c --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/parser-3.1.2.0/lib/parser/ruby28.rb @@ -0,0 +1,8047 @@ +# -*- encoding:utf-8; warn-indent:false; frozen_string_literal: true -*- +# +# DO NOT MODIFY!!!! +# This file is automatically generated by Racc 1.4.15 +# from Racc grammer file "". +# + +require 'racc/parser.rb' + + +require 'parser' + +module Parser + class Ruby28 < Parser::Base + + + def version + 28 + end + + def default_encoding + Encoding::UTF_8 + end +##### State transition tables begin ### + +clist = [ +'-704,618,-119,-117,299,-122,965,-704,-704,-704,299,-120,870,-704,-704', +'1078,-704,1083,-121,659,-116,870,219,220,-704,-704,618,-603,805,362', +'299,299,-713,1077,-603,661,-704,-704,618,-704,-704,-704,-704,-704,788', +'-604,219,220,230,231,618,-114,-604,811,618,556,219,220,-500,962,219', +'220,789,974,231,618,-704,-704,-704,-704,-704,-704,-704,-704,-704,-704', +'-704,-704,-704,-704,-118,-115,-704,-704,-704,658,686,-704,-701,231,-704', +'298,-603,-704,294,294,625,298,-704,1084,-704,660,-704,-704,810,-704', +'-704,-704,-704,-704,-604,-704,-704,-704,-121,964,231,298,298,123,-119', +'-117,-116,-122,122,-119,-117,-704,-122,-120,-704,-704,123,-109,-120', +'-704,-121,122,-116,-704,231,-121,-704,-116,123,-118,-704,-704,-704,122', +'231,-704,-704,-704,123,-704,123,-700,-100,122,-612,122,231,-704,-704', +'-704,-704,-704,123,-114,-86,807,123,122,-114,-704,-704,122,-704,-704', +'-704,-704,-704,123,556,-291,954,-713,122,101,102,920,123,625,-613,481', +'646,122,-118,-115,681,101,102,-118,-115,-704,-704,-704,-704,-704,-704', +'-704,-704,-704,-704,-704,-704,-704,-704,-114,230,-704,-704,-704,680', +'867,-704,231,866,-704,646,-112,-704,-704,646,-704,646,-704,646,-704', +'231,-704,-704,-121,-704,-704,-704,-704,-704,-316,-704,-704,-704,-115', +'-122,865,-316,-316,-316,-119,648,647,-316,-316,806,-316,-704,103,104', +'-704,-704,-704,-704,-316,-704,-605,-704,1137,-432,103,104,-704,-605', +'-117,-118,-316,-316,-119,-316,-316,-316,-316,-316,-713,648,647,644,362', +'648,647,648,647,648,647,644,852,483,646,836,631,838,745,482,895,-117', +'-316,-316,-316,-316,-316,-316,-316,-316,-316,-316,-316,-316,-316,-316', +'231,-432,-316,-316,-316,228,685,-316,-432,920,-316,-605,646,-316,226', +'870,801,-432,-316,810,-316,673,-316,-316,646,-316,-316,-316,-316,-316', +'671,-316,-704,-316,681,-116,-432,228,294,-704,-704,-704,648,647,644', +'-704,-704,-316,-704,876,-316,-316,-113,-316,872,-316,-704,-704,873,1137', +'973,1124,-316,631,-122,-120,-432,895,-704,-704,480,-704,-704,-704,-704', +'-704,648,647,653,227,583,-110,580,579,578,588,581,226,648,647,651,553', +'123,-119,292,591,-122,122,-704,-704,-704,-704,-704,-704,-704,-704,-704', +'-704,-704,-704,-704,-704,798,680,-704,-704,-704,586,686,-704,631,231', +'-704,646,632,-704,596,595,599,598,-704,646,-704,592,-704,-704,646,-704', +'-704,-704,-704,-704,-598,-704,-704,-704,852,-612,123,-598,-598,-598', +'227,122,-598,-598,-598,226,-598,-704,-108,796,-704,-704,292,-704,-598', +'-704,-598,-598,-598,123,-117,577,-704,123,122,-118,-598,-598,122,-598', +'-598,-598,-598,-598,720,648,647,657,795,-316,-598,-107,-105,648,647', +'662,-316,-598,648,647,649,-701,793,-116,-114,-316,-598,-598,-598,-598', +'-598,-598,-598,-598,-598,-598,-598,-598,-598,-598,227,-601,-598,-598', +'-598,-316,-598,-598,-601,791,-598,231,-316,-598,-598,231,-598,-701,-598', +'790,-598,-316,-598,-598,1000,-598,-598,-598,-598,-598,-608,-598,-601', +'-598,-316,-598,1001,-608,1002,-601,-601,-601,269,270,-601,-601,-601', +'-598,-601,1005,-598,-598,-598,-598,779,-598,-601,-598,-601,-601,-601', +'-111,-598,777,610,-598,-601,609,-601,-601,-316,-601,-601,-601,-601,-601', +'986,-610,268,267,775,226,-607,-609,-610,-606,591,774,1152,-607,-609', +'610,-606,-610,612,-608,907,636,-601,-601,-601,-601,-601,-601,-601,-601', +'-601,-601,-601,-601,-601,-601,1011,226,-601,-601,-601,231,-601,-601', +'225,771,-601,231,592,-601,-601,759,-601,223,-601,768,-601,-105,-601', +'-601,1004,-601,-601,-601,-601,-601,-610,-601,-316,-601,227,-607,-609', +'-613,-606,-316,-316,-316,87,427,-316,-316,-316,-601,-316,1029,-601,-601', +'-601,-601,88,-601,-316,-601,-316,-316,-316,-289,-601,1033,89,-601,227', +'610,-316,-316,612,-316,-316,-316,-316,-316,231,424,1036,226,1038,226', +'426,425,-106,774,1157,583,1152,580,579,578,789,581,1041,1155,-115,636', +'-316,-316,-316,-316,-316,-316,-316,-316,-316,-316,-316,-316,-316,-316', +'1043,986,-316,-316,-316,231,868,-316,1174,1043,-316,591,781,-316,-316', +'231,-316,231,-316,414,-316,785,-316,-316,1051,-316,-316,-316,-316,-316', +'-316,-316,227,-316,227,1122,1123,-316,-316,-316,599,598,610,-316,-316', +'612,-316,-316,1053,592,-316,-316,-316,-316,-316,-316,766,-316,949,920', +'765,1004,-316,949,920,-120,-316,-316,559,-316,-316,-316,-316,-316,890', +'891,219,220,583,226,580,579,578,588,581,583,628,580,579,578,1186,581', +'1062,591,1063,626,-316,-316,-316,-316,-316,-316,-316,-316,-316,-316', +'-316,-316,-316,-316,219,220,-316,-316,-316,586,685,-316,362,1068,-316', +'1069,781,-316,596,595,599,598,-316,1070,-316,592,-316,-316,-292,-316', +'-316,-316,-316,-316,588,-316,252,-316,227,362,226,231,231,231,591,-317', +'-351,634,231,1074,759,-316,-317,-351,-316,-316,636,-111,231,-316,226', +'-317,-351,231,231,577,-316,558,870,-120,321,77,78,24,9,65,479,599,598', +'71,72,1082,592,563,75,-700,73,74,76,33,34,79,80,126,127,128,129,130', +'81,31,30,111,110,112,113,227,562,21,231,231,-317,-351,1091,8,51,323', +'10,115,114,116,105,64,107,106,108,227,109,117,118,226,101,102,47,48', +'46,-317,478,-700,774,-611,1094,1097,-317,1099,-700,479,-611,1101,231', +'-700,1103,-317,748,-700,43,-611,-100,325,350,231,66,67,-316,603,68,231', +'38,1118,1119,-316,50,231,-700,349,-701,231,830,831,-316,22,832,117,118', +'733,99,87,90,91,1128,92,94,93,95,231,227,-106,288,88,98,870,-317,613', +'-700,1138,-611,82,1140,89,103,104,252,1150,44,45,321,77,78,24,9,65,252', +'252,1153,71,72,252,1158,-316,75,-697,73,74,76,33,34,79,80,126,127,128', +'129,130,81,31,30,111,110,112,113,614,583,21,580,579,578,1159,581,8,51', +'323,10,115,114,116,105,64,107,106,108,1043,109,117,118,-307,101,102', +'47,48,46,226,-307,-598,1043,-307,1043,222,548,781,-598,-307,-307,221', +'1171,-697,1172,546,785,-598,43,-307,530,36,1176,774,66,67,-611,1180', +'68,1182,38,1184,1186,-611,50,1186,-697,690,252,765,218,294,-611,22,625', +'217,416,1119,99,87,90,91,216,92,94,93,95,1200,-307,-113,1176,88,98,679', +'227,678,-598,231,-307,82,249,89,103,104,251,250,44,45,321,77,78,24,9', +'65,674,670,-701,71,72,-700,231,-611,75,-698,73,74,76,33,34,79,80,126', +'127,128,129,130,81,31,30,111,110,112,113,215,583,21,580,579,578,132', +'581,8,51,323,10,115,114,116,105,64,107,106,108,588,109,117,118,-610', +'101,102,47,48,46,591,-610,-601,1043,-317,669,630,-289,781,-601,-610', +'-317,667,638,-698,629,666,785,-601,43,-317,663,36,871,894,66,67,897', +'870,68,899,38,288,599,598,50,231,-698,592,252,526,905,907,909,22,528', +'530,514,528,99,87,90,91,514,92,94,93,95,759,-610,-112,231,88,98,530', +'1212,294,-601,1186,-317,82,249,89,103,104,251,250,44,45,321,77,78,24', +'9,65,294,759,514,71,72,252,132,920,75,-701,73,74,76,33,34,79,80,126', +'127,128,129,130,81,31,30,111,110,112,113,-85,252,21,231,853,541,542', +'-290,8,51,323,10,115,114,116,105,64,107,106,108,549,109,117,118,941', +'101,102,47,48,46,942,231,-701,249,840,839,252,251,250,-701,247,248,920', +'951,-701,952,835,231,-701,43,1186,1186,36,119,303,66,67,1176,231,68', +'583,38,580,579,578,50,581,-701,249,231,,,251,250,22,247,248,,,99,87', +'90,91,,92,94,93,95,,,,,88,98,,,,-701,,,82,,89,103,104,,,44,45,321,77', +'78,24,9,65,,,,71,72,,,,75,-704,73,74,76,33,34,79,80,,,,,,81,31,30,111', +'110,112,113,,583,21,580,579,578,,581,8,51,323,10,115,114,116,105,64', +'107,106,108,,109,117,118,,101,102,47,48,46,,583,-704,580,579,578,,581', +'781,-704,,,,,-700,,,,-704,43,,,325,,,66,67,,,68,1133,38,580,579,578', +'50,581,-704,781,1133,,580,579,578,22,581,,,,99,87,90,91,,92,94,93,95', +',,,,88,98,,,,-704,,,82,,89,103,104,,,44,45,321,77,78,24,9,65,,,,71,72', +',,,75,-700,73,74,76,33,34,79,80,,,,,,81,31,30,111,110,112,113,,,21,', +',,,,8,51,323,10,115,114,116,105,64,107,106,108,,109,117,118,,101,102', +'47,48,46,,,-700,,,,,,,-700,,,,,-700,,,,-700,43,,,36,,,66,67,,,68,,38', +',,,50,,-700,,,,,,,22,,,,,99,87,90,91,,92,94,93,95,-108,,,,88,98,,,,-700', +',,82,,89,103,104,,,44,45,321,77,78,24,9,65,,,,71,72,,,,75,-701,73,74', +'76,33,34,79,80,,,,,,81,31,30,111,110,112,113,,,21,,,,,,8,51,323,10,115', +'114,116,105,64,107,106,108,,109,117,118,,101,102,47,48,46,,,-701,,,', +',,,-701,,,,,-701,,,,-701,43,,,36,,,66,67,,,68,,38,,,,50,,-701,,,,,,', +'22,,,,,99,87,90,91,,92,94,93,95,-110,,,,88,98,,,,-701,,,82,,89,103,104', +',,44,45,321,77,78,24,9,65,,,,71,72,,,,75,-704,73,74,76,33,34,79,80,', +',,,,81,31,30,111,110,112,113,,,21,,,,,,8,51,323,10,115,114,116,105,64', +'107,106,108,,109,117,118,,101,102,47,48,46,,,-704,,,,,,,-704,,,,,-700', +',,,-704,43,,,36,,,66,67,,,68,,38,,,,50,,-704,,,,,,,22,,,,,99,87,90,91', +',92,94,93,95,-109,,,,88,98,,,,-704,,,82,,89,103,104,,,44,45,321,77,78', +'24,9,65,,,,71,72,,,,75,-704,73,74,76,33,34,79,80,,,,,,81,31,30,111,110', +'112,113,,,21,,,,,,8,51,323,10,115,114,116,105,64,107,106,108,,109,117', +'118,,101,102,47,48,46,,,-704,,,,,,,-704,,,,,-700,,,,-704,43,,,36,,,66', +'67,,,68,,38,,,,50,,-704,,,,,,,22,,,,,99,87,90,91,,92,94,93,95,,,,,88', +'98,,,,-704,,,82,,89,103,104,,,44,45,321,77,78,24,9,65,,,,71,72,,,,75', +'-432,73,74,76,33,34,79,80,,,,,,81,31,30,111,110,112,113,,,21,,,,,,8', +'51,323,10,115,114,116,105,64,107,106,108,,109,117,118,,101,102,47,48', +'46,,,-432,,,,,,,-432,,,,,,,,,-432,43,,,36,,,66,67,,,68,,38,,,,50,,-432', +',,,,,,22,,,,,99,87,90,91,,92,94,93,95,-107,,,,88,98,,,,-432,,,82,,89', +'103,104,,,44,45,5,77,78,24,9,65,,,,71,72,,,,75,,73,74,76,33,34,79,80', +'244,,,,,81,31,30,111,110,112,113,,,21,,,,,,8,51,7,10,115,114,116,105', +'64,107,106,108,,109,117,118,,101,102,47,48,46,252,256,257,258,259,269', +'270,264,265,260,261,,245,246,,,262,263,,43,,-262,36,,,66,67,,,68,,38', +'249,,255,50,251,250,,247,248,268,267,253,22,254,,,,99,87,90,91,,92,94', +'93,95,,,,,88,98,,266,,,,,82,,89,103,104,,,44,45,321,77,78,24,9,65,,', +',71,72,,,,75,,73,74,76,33,34,79,80,244,,,,,81,31,30,111,110,112,113', +',,21,,,,,,8,51,323,10,115,114,116,105,64,107,106,108,,109,117,118,,101', +'102,47,48,46,252,256,257,258,259,269,270,264,265,260,261,,245,246,,', +'262,263,,43,,,36,,,66,67,,,68,,38,249,,255,50,251,250,,247,248,268,267', +'253,22,254,,,,99,87,90,91,,92,94,93,95,,,,,88,98,,266,,,,,82,,89,103', +'104,,,44,45,321,77,78,24,9,65,,,,71,72,,,,75,,73,74,76,33,34,79,80,', +',,,,81,31,30,111,110,112,113,,,21,,,,,675,8,51,323,10,115,114,116,105', +'64,107,106,108,,109,117,118,,101,102,47,48,46,252,256,257,258,259,269', +'270,264,265,260,261,,245,246,,,262,263,,43,,,36,,,66,67,,,68,,38,249', +',255,50,251,250,,247,248,268,267,253,22,254,,,,99,87,90,91,,92,94,93', +'95,,,,,88,98,,266,,-262,,,82,,89,103,104,,,44,45,321,77,78,24,9,65,', +',,71,72,,,,75,,73,74,76,33,34,79,80,,,,,,81,31,30,111,110,112,113,,', +'21,,,,,675,8,51,323,10,115,114,116,105,64,107,106,108,,109,117,118,', +'101,102,47,48,46,252,256,257,258,259,269,270,264,265,260,261,,245,246', +',,262,263,,43,,,36,,,66,67,,,68,,38,249,,255,50,251,250,,247,248,268', +'267,253,22,254,,,,99,87,90,91,,92,94,93,95,,,,,88,98,,266,,,,,82,,89', +'103,104,,,44,45,321,77,78,24,9,65,,,,71,72,,,,75,,73,74,76,33,34,79', +'80,,,,,,81,31,30,111,110,112,113,,,21,,,,,917,8,51,323,10,115,114,116', +'105,64,107,106,108,,109,117,118,,101,102,47,48,46,252,256,257,258,259', +'269,270,264,265,260,261,,245,246,,,262,263,,43,,,36,,,66,67,,,68,,38', +'249,,255,50,251,250,,247,248,268,267,253,22,254,,,,99,87,90,91,,92,94', +'93,95,,,,,88,98,,266,,,,,82,,89,103,104,,,44,45,321,77,78,24,9,65,,', +',71,72,,,,75,,73,74,76,33,34,79,80,,,,,,81,31,30,111,110,112,113,,,21', +',,,,945,8,51,323,10,115,114,116,105,64,107,106,108,,109,117,118,,101', +'102,47,48,46,252,256,257,258,259,269,270,264,265,260,261,,245,246,,', +'262,263,,43,,,36,,,66,67,,,68,,38,249,,255,50,251,250,,247,248,268,267', +'253,22,254,,,,99,87,90,91,,92,94,93,95,,,,,88,98,,266,,,,,82,,89,103', +'104,,,44,45,321,77,78,24,9,65,,,,71,72,,,,75,,73,74,76,33,34,79,80,', +',,,,81,31,30,111,110,112,113,,,21,,,,,,8,51,323,10,115,114,116,105,64', +'107,106,108,,109,117,118,,101,102,47,48,46,252,256,257,258,259,269,270', +'264,265,260,261,,245,246,,,262,263,,43,,,36,,,66,67,,,68,,38,249,,255', +'50,251,250,,247,248,268,267,253,22,254,,,,99,87,90,91,,92,94,93,95,', +',,,88,98,,266,,,,,82,,89,103,104,,,44,45,321,77,78,24,9,65,,,,71,72', +',,,75,,73,74,76,33,34,79,80,,,,,,81,31,30,111,110,112,113,,,21,,,,,', +'8,51,323,10,115,114,116,105,64,107,106,108,,109,117,118,,101,102,47', +'48,46,252,256,257,258,259,269,270,264,265,260,261,,245,246,,,262,263', +',43,,,36,,,66,67,,,68,,38,249,,255,50,251,250,,247,248,268,267,253,22', +'254,,,,99,87,90,91,,92,94,93,95,,,,,88,98,231,266,,,,,82,,89,103,104', +',,44,45,321,77,78,24,9,65,,,,71,72,,,,75,,73,74,76,33,34,79,80,,,,,', +'81,31,30,111,110,112,113,,,21,,,,,,8,51,323,10,115,114,116,105,64,107', +'106,108,,109,117,118,,101,102,47,48,46,252,256,257,258,259,269,270,264', +'265,260,261,,245,246,,,262,263,,43,,,325,,,66,67,,,68,,38,249,,255,50', +'251,250,,247,248,268,267,253,22,254,,,,99,87,90,91,,92,94,93,95,,,,', +'88,98,,266,,,,,82,,89,103,104,,,44,45,321,77,78,24,9,65,,,,71,72,,,', +'75,,73,74,76,33,34,79,80,,,,,,81,31,30,111,110,112,113,,,21,,,,,,8,51', +'323,10,115,114,116,105,64,107,106,108,,109,117,118,,101,102,47,48,46', +'252,256,257,258,259,269,270,264,265,260,261,,245,246,,,262,263,,43,', +',36,,,66,67,,,68,,38,249,,255,50,251,250,,247,248,268,267,253,22,254', +',,,99,87,90,91,,92,94,93,95,,,,,88,98,,266,,,,,82,,89,103,104,,,44,45', +'5,77,78,24,9,65,,,,71,72,,,,75,,73,74,76,33,34,79,80,,,,,,81,31,30,111', +'110,112,113,,,21,,,,,,8,51,7,10,115,114,116,105,64,107,106,108,,109', +'117,118,,101,102,47,48,46,252,256,257,258,259,269,270,264,265,260,261', +',245,246,,,262,263,,43,,,36,,,66,67,,,68,,38,249,,255,50,251,250,,247', +'248,268,267,253,22,254,,,,99,87,90,91,,92,94,93,95,,,,,88,98,,266,,', +',,82,,89,103,104,,,44,45,321,77,78,24,9,65,,,,71,72,,,,75,,73,74,76', +'33,34,79,80,,,,,,81,31,30,111,110,112,113,,,21,,,,,,8,51,323,10,115', +'114,116,105,64,107,106,108,,109,117,118,,101,102,47,48,46,252,256,257', +'258,259,269,270,264,265,260,261,,245,246,,,262,263,,43,,,36,,,66,67', +',,68,,38,249,,255,50,251,250,,247,248,268,267,253,22,254,,,,99,87,90', +'91,,92,94,93,95,,,,,88,98,,266,,,,,82,,89,103,104,,,44,45,321,77,78', +'24,9,65,,,,71,72,,,,75,,73,74,76,33,34,79,80,,,,,,81,31,30,111,110,112', +'113,,,21,,,,,,8,51,323,10,115,114,116,105,64,107,106,108,,109,117,118', +',101,102,47,48,46,252,256,257,258,259,269,270,264,265,260,261,,245,246', +',,262,263,,43,,,36,,,66,67,,,68,,38,249,,255,50,251,250,,247,248,268', +'267,253,22,254,,,,99,87,90,91,,92,94,93,95,,,,,88,98,,266,,,,,82,,89', +'103,104,,,44,45,321,77,78,24,9,65,,,,71,72,,,,75,,73,74,76,33,34,79', +'80,,,,,,81,31,30,111,110,112,113,,,21,,,,,,8,51,323,10,115,114,116,105', +'64,107,106,108,,109,117,118,,101,102,47,48,46,252,-726,-726,-726,-726', +'269,270,,,-726,-726,,,,,,262,263,,43,,,36,,,66,67,,,68,,38,249,,255', +'50,251,250,,247,248,268,267,253,22,254,,,,99,87,90,91,,92,94,93,95,', +',,,88,98,,,,,,,82,,89,103,104,,,44,45,321,77,78,24,9,65,,,,71,72,,,', +'75,,73,74,76,33,34,79,80,,,,,,81,31,30,111,110,112,113,,,21,,,,,,8,51', +'323,10,115,114,116,105,64,107,106,108,,109,117,118,,101,102,47,48,46', +'252,256,257,258,259,269,270,264,265,260,261,,-726,-726,,,262,263,,43', +',,36,,,66,67,,,68,,38,249,,255,50,251,250,,247,248,268,267,253,22,254', +',,,99,87,90,91,,92,94,93,95,,,,,88,98,,,,,,,82,,89,103,104,,,44,45,321', +'77,78,24,9,65,,,,71,72,,,,75,,73,74,76,33,34,79,80,,,,,,81,31,30,111', +'110,112,113,,,21,,,,,,8,51,323,10,115,114,116,105,64,107,106,108,,109', +'117,118,,101,102,47,48,46,252,256,257,258,259,269,270,264,265,260,261', +',-726,-726,,,262,263,,43,,,36,,,66,67,,,68,,38,249,,255,50,251,250,', +'247,248,268,267,253,22,254,,,,99,87,90,91,,92,94,93,95,,,,,88,98,,,', +',,,82,,89,103,104,,,44,45,321,77,78,24,9,65,,,,71,72,,,,75,,73,74,76', +'33,34,79,80,,,,,,81,31,30,111,110,112,113,,,21,,,,,,8,51,323,10,115', +'114,116,105,64,107,106,108,,109,117,118,,101,102,47,48,46,252,-726,-726', +'-726,-726,269,270,,,-726,-726,,,,,,262,263,,43,,,36,,,66,67,,,68,,38', +'249,,255,50,251,250,,247,248,268,267,253,22,254,,,,99,87,90,91,,92,94', +'93,95,,,,,88,98,,,,,,,82,,89,103,104,,,44,45,321,77,78,24,9,65,,,,71', +'72,,,,75,,73,74,76,33,34,79,80,,,,,,81,31,30,111,110,112,113,,,21,,', +',,,8,51,323,10,115,114,116,105,64,107,106,108,,109,117,118,,101,102', +'47,48,46,252,-726,-726,-726,-726,269,270,,,-726,-726,,,,,,262,263,,43', +',,36,,,66,67,,,68,,38,249,,255,50,251,250,,247,248,268,267,253,22,254', +',,,99,87,90,91,,92,94,93,95,,,,,88,98,,,,,,,82,,89,103,104,,,44,45,321', +'77,78,24,9,65,,,,71,72,,,,75,,73,74,76,33,34,79,80,,,,,,81,31,30,111', +'110,112,113,,,21,,,,,,8,51,323,10,115,114,116,105,64,107,106,108,,109', +'117,118,,101,102,47,48,46,252,-726,-726,-726,-726,269,270,,,-726,-726', +',,,,,262,263,,43,,,36,,,66,67,,,68,,38,249,,255,50,251,250,,247,248', +'268,267,253,22,254,,,,99,87,90,91,,92,94,93,95,,,,,88,98,,,,77,78,24', +'82,65,89,103,104,71,72,44,45,,75,,73,74,76,33,34,79,80,,,,,,81,31,30', +'111,110,112,113,,,243,,,,,,,51,,,115,114,116,105,64,107,106,108,315', +'109,117,118,,101,102,47,48,46,252,-726,-726,-726,-726,269,270,,,-726', +'-726,,,,,,262,263,,236,,,242,,,66,67,,,68,,312,249,310,255,50,251,250', +'316,247,248,268,267,253,241,254,,,,99,313,90,91,,92,94,93,95,,,,,88', +'98,,,,,,,82,,89,103,104,,,44,45,77,78,24,9,65,,,,71,72,,,,75,,73,74', +'76,33,34,79,80,,,,,,81,31,30,111,110,112,113,,,21,,,,,,8,51,7,10,115', +'114,116,105,64,107,106,108,,109,117,118,,101,102,47,48,46,252,-726,-726', +'-726,-726,269,270,,,-726,-726,,,,,,262,263,,43,,,36,,,66,67,,,68,,38', +'249,,255,50,251,250,,247,248,268,267,253,22,254,,,,99,87,90,91,,92,94', +'93,95,,,,,88,98,,,,77,78,24,82,65,89,103,104,71,72,44,45,,75,,73,74', +'76,33,34,79,80,,,,,,81,31,30,111,110,112,113,,,243,,,,,,,51,,,115,114', +'116,105,64,107,106,108,315,109,117,118,,101,102,47,48,46,252,256,257', +'258,259,269,270,,,260,261,,,,,,262,263,,236,,,242,,,66,67,,,68,,312', +'249,310,255,50,251,250,316,247,248,268,267,253,241,254,,,,99,313,90', +'91,,92,94,93,95,,,,,88,98,,,,77,78,24,82,65,89,103,104,71,72,44,45,', +'75,,73,74,76,33,34,79,80,,,,,,81,31,30,111,110,112,113,,,21,,,,,,,51', +',,115,114,116,105,64,107,106,108,,109,117,118,,101,102,47,48,46,252', +'256,257,258,259,269,270,264,,260,261,,,,,,262,263,,236,,,242,,,66,67', +',,68,,,249,,255,50,251,250,,247,248,268,267,253,22,254,,,,99,87,90,91', +',92,94,93,95,,,,,88,98,,,,77,78,24,82,65,89,103,104,71,72,44,45,,75', +',73,74,76,33,34,79,80,,,,,,81,31,30,111,110,112,113,,,21,,,,,,,51,,', +'115,114,116,105,64,107,106,108,,109,117,118,,101,102,47,48,46,252,,', +',,,,,,,,,,,,,262,263,,236,,,242,,,66,67,,,68,,,249,,255,50,251,250,', +'247,248,,,253,22,254,,,,99,87,90,91,,92,94,93,95,,,,,88,98,,,,77,78', +'24,82,65,89,103,104,71,72,44,45,,75,,73,74,76,33,34,79,80,,,,,,81,31', +'30,111,110,112,113,,,243,,,,,,,51,,,115,114,116,105,64,107,106,108,', +'109,117,118,,101,102,47,48,46,252,,,,,,,,,,,,,,,,262,263,,236,,,242', +',,66,67,,,68,,,249,,255,50,251,250,,247,248,,,253,241,254,,,,99,87,90', +'91,,92,94,93,95,,,,,88,98,,,,,,,82,,89,103,104,-431,,44,45,,,,-431,-431', +'-431,,,-431,-431,-431,252,-431,,,,,,,,-431,-431,-431,-431,,,,262,263', +',,,-431,-431,,-431,-431,-431,-431,-431,,,,249,,255,,251,250,,247,248', +',,,,,,,,,,-431,-431,-431,-431,-431,-431,-431,-431,-431,-431,-431,-431', +'-431,-431,,,-431,-431,-431,,,-431,,294,-431,,,-431,-431,,-431,,-431', +',-431,,-431,-431,,-431,-431,-431,-431,-431,-323,-431,-431,-431,,,,-323', +'-323,-323,,,-323,-323,-323,,-323,-431,252,,-431,-431,,-431,-323,-431', +'-323,-323,,,,,-431,,262,263,-323,-323,,-323,-323,-323,-323,-323,,,,', +',,249,,,,251,250,,247,248,,,,,,,,-323,-323,-323,-323,-323,-323,-323', +'-323,-323,-323,-323,-323,-323,-323,,,-323,-323,-323,,,-323,,303,-323', +',,-323,-323,,-323,,-323,,-323,,-323,-323,,-323,-323,-323,-323,-323,', +'-323,,-323,,,,,,,,,,,,,,-323,,,-323,-323,,-323,,-323,77,78,24,,65,,-323', +',71,72,,,,75,,73,74,76,33,34,79,80,,,,,,81,31,30,111,110,112,113,,,243', +',,,,,,51,,,115,114,116,105,64,107,106,108,315,109,117,118,,101,102,47', +'48,46,252,256,257,258,259,269,270,264,265,260,261,,-726,-726,,,262,263', +',236,,,242,,,66,67,,,68,,312,249,310,255,50,251,250,316,247,248,268', +'267,253,241,254,,,,99,313,90,91,,92,94,93,95,,,,,88,98,,,,77,78,24,82', +'65,89,103,104,71,72,44,45,,75,,73,74,76,33,34,79,80,,,,,,81,31,30,111', +'110,112,113,,,243,,,,,,,51,,,115,114,116,105,64,107,106,108,315,109', +'117,118,,101,102,47,48,46,252,256,257,258,259,269,270,264,265,260,261', +',-726,-726,,,262,263,,236,,,242,,,66,67,,,68,,312,249,310,255,50,251', +'250,316,247,248,268,267,253,241,254,,,,99,313,90,91,,92,94,93,95,,,', +',88,98,,,,77,78,24,82,65,89,103,104,71,72,44,45,,75,,73,74,76,33,34', +'79,80,,,,,,81,31,30,111,110,112,113,,,243,,,,,,,51,,,115,114,116,105', +'64,107,106,108,315,109,117,118,,101,102,47,48,46,252,,,,,,,,,,,,,,,', +'262,263,,236,,,242,,,66,67,,,68,,312,249,310,255,50,251,250,316,247', +'248,,,,241,,,,,99,313,90,91,,92,94,93,95,,,,,88,98,,,,77,78,24,82,65', +'89,103,104,71,72,44,45,,75,,73,74,76,342,343,79,80,,,,,,81,337,345,111', +'110,112,113,,,243,,,,,,,51,,,115,114,116,105,64,107,106,108,,109,117', +'118,,101,102,47,48,46,,,,,,,,,,,,,,,,,,,,236,,,242,,,66,67,,,68,,,,', +',50,,,,,,,,,241,,,,,99,87,90,91,,92,94,93,95,,,,,88,98,,,,77,78,24,82', +'65,89,103,104,71,72,44,45,,75,,73,74,76,342,343,79,80,,,,,,81,337,345', +'111,110,112,113,,,243,,,,,,,51,,,115,114,116,105,64,107,106,108,,109', +'117,118,,101,102,47,48,46,,,,,,,,,,,,,,,,,,,,236,,,242,,,66,67,,,68', +',,,,,50,,,,,,,,,241,,,,,99,87,90,91,,92,94,93,95,,,,,88,98,,,,77,78', +'24,82,65,89,103,104,71,72,44,45,,75,,73,74,76,342,343,79,80,,,,,,81', +'337,345,111,110,112,113,,,243,,,,,,,51,,,115,114,116,105,64,107,106', +'108,,109,117,118,,101,102,47,48,46,,,,,,,,,,,,,,,,,,,,236,,,242,,,66', +'67,,,68,,,,,,50,,,,,,,,,241,,,,,99,87,90,91,,92,94,93,95,,,,,88,98,', +',,77,78,24,82,65,89,103,104,71,72,44,45,,75,,73,74,76,342,343,79,80', +',,,,,81,337,345,111,110,112,113,,,243,,,,,,,51,,,115,114,116,105,64', +'107,106,108,,109,117,118,,101,102,47,48,46,,,,,,,,,,,,,,,,,,,,236,,', +'242,,,66,67,,,68,,,,,,50,,,,,,,,,241,,,,,99,87,90,91,,92,94,93,95,,', +',,88,98,,,,77,78,24,82,65,89,103,104,71,72,44,45,,75,,73,74,76,342,343', +'79,80,,,,,,81,337,345,111,110,112,113,,,243,,,,,,,51,,,115,114,116,105', +'64,107,106,108,,109,117,118,,101,102,47,48,46,,,,,,,,,,,,,,,,,,,,236', +',,242,,,66,67,,,68,,,,,,50,,,,,,,,,241,,,,,99,87,90,91,,92,94,93,95', +',,,,88,98,,,,77,78,24,82,65,89,103,104,71,72,44,45,,75,,73,74,76,342', +'343,79,80,,,,,,81,337,345,111,110,112,113,,,243,,,,,,,51,,,115,114,116', +'105,64,107,106,108,,109,117,118,,101,102,47,48,46,,,,,,,,,,,,,,,,,,', +',236,,,242,,,66,67,,,68,,,,,,50,,,,,,,,,241,,,,,99,87,90,91,,92,94,93', +'95,,,,,88,98,,,,77,78,24,82,65,89,103,104,71,72,44,45,,75,,73,74,76', +'342,343,79,80,,,,,,81,337,345,111,110,112,113,,,243,,,,,,,51,,,115,114', +'116,105,64,107,106,108,315,109,117,118,,101,102,47,48,46,,,,,,,,,,,', +',,,,,,,,236,,,242,,,66,67,,,68,,,,310,,50,,,316,,,,,,241,,,,,99,313', +'90,91,,92,94,93,95,,,,,88,98,,,,,,,82,,89,103,104,-308,,44,45,,,,-308', +'-308,-308,,,-308,-308,-308,,-308,,,,,,,,-308,,-308,-308,-308,,,,111', +'110,112,113,-308,-308,,-308,-308,-308,-308,-308,,,,,115,114,116,,,,', +',,,,,,101,102,,,346,-308,-308,-308,-308,-308,-308,-308,-308,-308,-308', +'-308,-308,-308,-308,,,-308,-308,-308,,,-308,,,-308,,,-308,-308,,-308', +',-308,,-308,,-308,-308,,-308,-308,-308,-308,-308,,-308,,-308,,99,87', +'90,91,,92,94,93,95,,,,-308,88,98,-308,-308,-308,-308,,-308,82,-308,89', +'103,104,,-308,77,78,24,9,65,,,,71,72,,,,75,,73,74,76,33,34,79,80,,,', +',,81,31,30,111,110,112,113,,,21,,,,,,8,51,,10,115,114,116,105,64,107', +'106,108,,109,117,118,,101,102,47,48,46,,,,,,,,,,,,,,,,,,,,43,,,36,,', +'66,67,,,68,,38,,,,50,,,,,,,,,22,,,,,99,87,90,91,,92,94,93,95,,,,,88', +'98,,,,77,78,24,82,65,89,103,104,71,72,44,45,,75,,73,74,76,342,343,79', +'80,,,,,,81,337,345,111,110,112,113,,,243,,,,,,,51,,,115,114,116,105', +'64,107,106,108,315,109,117,118,,101,102,47,48,46,,,,,,,,,,,,,,,,,,,', +'236,,,242,,,66,67,,,68,,312,,,,50,,,316,,,,,,241,,,,,99,313,90,91,,92', +'94,93,95,,,,,88,98,,,,77,78,24,82,65,89,103,104,71,72,44,45,,75,,73', +'74,76,342,343,79,80,,,,,,81,337,345,111,110,112,113,,,243,,,,,,,51,', +',115,114,116,105,64,107,106,108,315,109,117,118,,101,102,47,48,46,,', +',,,,,,,,,,,,,,,,,236,,,242,,,66,67,,,68,,,,,,50,,,316,,,,,,241,,,,,99', +'313,90,91,,92,94,93,95,,,,,88,98,,,,77,78,24,82,65,89,103,104,71,72', +'44,45,,75,,73,74,76,342,343,79,80,,,,,,81,337,345,111,110,112,113,,', +'243,,,,,,,51,,,115,114,116,105,64,107,106,108,,109,117,118,,101,102', +'47,48,46,,,,,,,,,,,,,,,,,,,,236,,,242,,,66,67,,,68,,742,,,,50,,,,,,', +',,241,,,,,99,87,90,91,,92,94,93,95,,,,,88,98,,,,77,78,24,82,65,89,103', +'104,71,72,44,45,,75,,73,74,76,33,34,79,80,,,,,,81,31,30,111,110,112', +'113,,,21,,,,,,,51,,,115,114,116,105,64,107,106,108,,109,117,118,,101', +'102,47,48,46,,,,,,,,,,,,,,,,,,,,236,,,242,,,66,67,,,68,,,,,,50,,,,,', +',,,22,,,,,99,87,90,91,,92,94,93,95,,,,,88,98,,,,77,78,24,82,65,89,103', +'104,71,72,44,45,,75,,73,74,76,33,34,79,80,,,,,,81,31,30,111,110,112', +'113,,,21,,,,,,,51,,,115,114,116,105,64,107,106,108,,109,117,118,,101', +'102,47,48,46,,,,,,,,,,,,,,,,,,,,236,,,242,,,66,67,,,68,,,,,,50,,,,,', +',,,22,,,,,99,87,90,91,,92,94,93,95,,,,,88,98,,,,77,78,24,82,65,89,103', +'104,71,72,44,45,,75,,73,74,76,33,34,79,80,,,,,,81,31,30,111,110,112', +'113,,,21,,,,,,,51,,,115,114,116,105,64,107,106,108,,109,117,118,,101', +'102,47,48,46,,,,,,,,,,,,,,,,,,,,236,,,242,,,66,67,,,68,,,,,,50,,,,,', +',,,22,,,,,99,87,90,91,,92,94,93,95,,,,,88,98,123,,,,,122,82,,89,103', +'104,,,44,45,77,78,24,,65,,,,71,72,,,,75,,73,74,76,33,34,79,80,,,,,,81', +'31,30,111,110,112,113,,,21,,,,,,,51,,,115,114,116,105,64,107,106,108', +',109,117,118,,101,102,47,48,46,,,,,,,,,,,,,,,,,,,,236,,,242,,,66,67', +',,68,,,,,,50,,,,,,,,,22,,,,,99,87,90,91,,92,94,93,95,,,,,88,98,,,,77', +'78,24,82,65,89,103,104,71,72,44,45,,75,,73,74,76,342,343,79,80,,,,,', +'81,337,345,111,110,112,113,,,243,,,,,,,51,,,115,114,116,105,64,107,106', +'108,,109,117,118,,101,102,47,48,46,,,,,,,,,,,,,,,,,,,,236,,,242,,,66', +'67,,,68,,,,,,50,,,,,,,,,241,,,,,99,87,90,91,,92,94,93,95,,,,,88,98,', +',,,,,82,,89,103,104,,,44,45,77,78,24,9,65,,,,71,72,,,,75,,73,74,76,33', +'34,79,80,,,,,,81,31,30,111,110,112,113,,,21,,,,,,8,51,7,10,115,114,116', +'105,64,107,106,108,,109,117,118,,101,102,47,48,46,,,,,,,,,,,,,,,,,,', +',43,,,36,,,66,67,,,68,,38,,,,50,,,,,,,,,22,,,,,99,87,90,91,,92,94,93', +'95,,,,,88,98,,,,,,416,82,,89,103,104,,,44,45,77,78,24,,65,,,,71,72,', +',,75,,73,74,76,33,34,79,80,,,,,,81,31,30,111,110,112,113,,,21,,,,,,', +'51,,,115,114,116,105,64,107,106,108,,109,117,118,,101,102,47,48,46,', +',,,,,,,,,,,,,,,,,,236,,,242,,,66,67,,,68,,,,,,50,,,,,,,,,22,,,,,99,87', +'90,91,,92,94,93,95,,,,,88,98,,,,77,78,24,82,65,89,103,104,71,72,44,45', +',75,,73,74,76,33,34,79,80,,,,,,81,31,30,111,110,112,113,,,21,,,,,,,51', +',,115,114,116,105,64,107,106,108,,109,117,118,,101,102,47,48,46,,,,', +',,,,,,,,,,,,,,,236,,,242,,,66,67,,,68,,,,,,50,,,,,,,,,22,,,,,99,87,90', +'91,,92,94,93,95,,,,,88,98,,,,77,78,24,82,65,89,103,104,71,72,44,45,', +'75,,73,74,76,33,34,79,80,,,,,,81,31,30,111,110,112,113,,,21,,,,,,,51', +',,115,114,116,105,64,107,106,108,,109,117,118,,101,102,47,48,46,,,,', +',,,,,,,,,,,,,,,236,,,242,,,66,67,,,68,,,,,,50,,,,,,,,,22,,,,,99,87,90', +'91,,92,94,93,95,,,,,88,98,,,,77,78,24,82,65,89,103,104,71,72,44,45,', +'75,,73,74,76,33,34,79,80,,,,,,81,31,30,111,110,112,113,,,21,,,,,,,51', +',,115,114,116,105,64,107,106,108,,109,117,118,,101,102,47,48,46,,,,', +',,,,,,,,,,,,,,,236,,,242,,,66,67,,,68,,,,,,50,,,,,,,,,22,,,,,99,87,90', +'91,,92,94,93,95,,,,,88,98,,,,,,,82,,89,103,104,,,44,45,77,78,24,9,65', +',,,71,72,,,,75,,73,74,76,33,34,79,80,,,,,,81,31,30,111,110,112,113,', +',21,,,,,,8,51,,10,115,114,116,105,64,107,106,108,,109,117,118,,101,102', +'47,48,46,,,,,,,,,,,,,,,,,,,,43,,,36,,,66,67,,,68,,38,,,,50,,,,,,,,,22', +',,,,99,87,90,91,,92,94,93,95,,,,,88,98,,,,77,78,24,82,65,89,103,104', +'71,72,44,45,,75,,73,74,76,342,343,79,80,,,,,,81,337,345,111,110,112', +'113,,,243,,,,,,,51,,,115,114,116,105,64,107,106,108,,109,117,118,,101', +'102,47,48,46,,,,,,,,,,,,,,,,,,,,236,,,242,,,66,67,,,68,,,,,,50,,,,,', +',,,241,,,,,99,87,90,91,,92,94,93,95,,,,,88,98,,,,77,78,24,82,65,89,103', +'104,71,72,44,45,,75,,73,74,76,33,34,79,80,,,,,,81,31,30,111,110,112', +'113,,,243,,,,,,,51,,,115,114,116,105,64,107,106,108,,109,117,118,,101', +'102,47,48,46,,,,,,,,,,,,,,,,,,,,236,,,242,,,66,67,,,68,,432,,,,50,,', +',,,,,,241,,,,,99,87,90,91,,92,94,93,95,,,,,88,98,,,,77,78,24,82,65,89', +'103,104,71,72,44,45,,75,,73,74,76,33,34,79,80,,,,,,81,31,30,111,110', +'112,113,,,243,,,,,,,51,,,115,114,116,105,64,107,106,108,,109,117,118', +',101,102,47,48,46,,,,,,,,,,,,,,,,,,,,236,,,242,,,66,67,,,68,,432,,,', +'50,,,,,,,,,241,,,,,99,87,90,91,,92,94,93,95,,,,,88,98,,,,77,78,24,82', +'65,89,103,104,71,72,44,45,,75,,73,74,76,342,343,79,80,,,,,,81,337,345', +'111,110,112,113,,,243,,,,,,,51,,,115,114,116,105,64,107,106,108,,109', +'117,118,,101,102,47,48,46,,,,,,,,,,,,,,,,,,,,236,,,242,,,66,67,,,68', +',,,,,50,,,,,,,,,241,,,,,99,87,90,91,,92,94,93,95,,,,,88,98,,,,,,,82', +',89,103,104,,,44,45,77,78,24,9,65,,,,71,72,,,,75,,73,74,76,33,34,79', +'80,,,,,,81,31,30,111,110,112,113,,,21,,,,,,8,51,,10,115,114,116,105', +'64,107,106,108,,109,117,118,,101,102,47,48,46,,,,,,,,,,,,,,,,,,,,43', +',,36,,,66,67,,,68,,38,,,,50,,,,,,,,,22,,,,,99,87,90,91,,92,94,93,95', +',,,,88,98,,,,77,78,24,82,65,89,103,104,71,72,44,45,,75,,73,74,76,33', +'34,79,80,,,,,,81,31,30,111,110,112,113,,,243,,,,,,,51,,,115,114,116', +'105,64,107,106,108,315,109,117,118,,101,102,47,48,46,,,,,,,,,,,,,,,', +',,,,236,,,242,,,66,67,,,68,,312,,310,,50,,,316,,,,,,241,,,,,99,313,90', +'91,,92,94,93,95,,,,,88,98,,,,77,78,24,82,65,89,103,104,71,72,44,45,', +'75,,73,74,76,33,34,79,80,,,,,,81,31,30,111,110,112,113,,,243,,,,,,,51', +',,115,114,116,105,64,107,106,108,,109,117,118,,101,102,47,48,46,,,,', +',,,,,,,,,,,,,,,236,,,242,,,66,67,,,68,,,,,,50,,,,,,,,,241,,,,,99,87', +'90,91,,92,94,93,95,,,,,88,98,,,,77,78,24,82,65,89,103,104,71,72,44,45', +',75,,73,74,76,342,343,79,80,,,,,,81,337,345,111,110,112,113,,,243,,', +',,,,51,,,115,114,116,105,64,107,106,108,,109,117,118,,101,102,47,48', +'46,,,,,,,,,,,,,,,,,,,,236,,,242,,,66,67,,,68,,844,,,,50,,,,,,,,,241', +',,,,99,87,90,91,,92,94,93,95,,,,,88,98,,,,,,,82,,89,103,104,,,44,45', +'77,78,24,9,65,,,,71,72,,,,75,,73,74,76,33,34,79,80,,,,,,81,31,30,111', +'110,112,113,,,21,,,,,,8,51,,10,115,114,116,105,64,107,106,108,,109,117', +'118,,101,102,47,48,46,,,,,,,,,,,,,,,,,,,,43,,,36,,,66,67,,,68,,38,,', +',50,,,,,,,,,22,,,,,99,87,90,91,,92,94,93,95,,,,,88,98,,,,77,78,24,82', +'65,89,103,104,71,72,44,45,,75,,73,74,76,33,34,79,80,,,,,,81,31,30,111', +'110,112,113,,,243,,,,,,,51,,,115,114,116,105,64,107,106,108,315,109', +'117,118,,101,102,47,48,46,,,,,,,,,,,,,,,,,,,,236,,,242,,,66,67,,,68', +',312,,310,,50,,,316,,,,,,241,,,,,99,313,90,91,,92,94,93,95,,,,,88,98', +',,,77,78,24,82,65,89,103,104,71,72,44,45,,75,,73,74,76,33,34,79,80,', +',,,,81,31,30,111,110,112,113,,,243,,,,,,,51,,,115,114,116,105,64,107', +'106,108,315,109,117,118,,101,102,47,48,46,,,,,,,,,,,,,,,,,,,,236,,,242', +',,66,67,,,68,,312,,310,,50,,,316,,,,,,241,,,,,99,313,90,91,,92,94,93', +'95,,,,,88,98,,,,77,78,24,82,65,89,103,104,71,72,44,45,,75,,73,74,76', +'342,343,79,80,,,,,,81,337,345,111,110,112,113,,,243,,,,,,,51,,,115,114', +'116,105,64,107,106,108,,109,117,118,,101,102,47,48,46,,,,,,,,,,,,,,', +',,,,,236,,,242,,,66,67,,,68,,312,,,,50,,,,,,,,,241,,,,,99,87,90,91,', +'92,94,93,95,,,,,88,98,,,,77,78,24,82,65,89,103,104,71,72,44,45,,75,', +'73,74,76,342,343,79,80,,,,,,81,337,345,111,110,112,113,,,243,,,,,,,51', +',,115,114,116,105,64,107,106,108,315,109,117,118,,101,102,47,48,46,', +',,,,,,,,,,,,,,,,,,236,,,242,,,66,67,,,68,,,,,,50,,,316,,,,,,241,,,,', +'99,313,90,91,,92,94,93,95,,,,,88,98,,,,77,78,24,82,65,89,103,104,71', +'72,44,45,,75,,73,74,76,342,343,79,80,,,,,,81,337,345,111,110,112,113', +',,243,,,,,,,51,,,115,114,116,105,64,107,106,108,315,109,117,118,,101', +'102,47,48,46,,,,,,,,,,,,,,,,,,,,236,,,242,,,66,67,,,68,,742,,,,50,,', +'316,,,,,,241,,,,,99,313,90,91,,92,94,93,95,,,,,88,98,,,,77,78,24,82', +'65,89,103,104,71,72,44,45,,75,,73,74,76,342,343,79,80,,,,,,81,337,345', +'111,110,112,113,,,243,,,,,,,51,,,115,114,116,105,64,107,106,108,,109', +'117,118,,101,102,47,48,46,,,,,,,,,,,,,,,,,,,,236,,,242,,,66,67,,,68', +',,,,,50,,,,,,,,,241,,,,,99,87,90,91,,92,94,93,95,,,,,88,98,,,,77,78', +'24,82,65,89,103,104,71,72,44,45,,75,,73,74,76,342,343,79,80,,,,,,81', +'337,345,111,110,112,113,,,243,,,,,,,51,,,115,114,116,105,64,107,106', +'108,,109,117,118,,101,102,47,48,46,,,,,,,,,,,,,,,,,,,,236,,,242,,,66', +'67,,,68,,,,,,50,,,,,,,,,241,,,,,99,87,90,91,,92,94,93,95,,,,,88,98,', +',,77,78,24,82,65,89,103,104,71,72,44,45,,75,,73,74,76,342,343,79,80', +',,,,,81,337,345,111,110,112,113,,,243,,,,,,,51,,,115,114,116,105,64', +'107,106,108,,109,117,118,,101,102,47,48,46,,,,,,,,,,,,,,,,,,,,236,,', +'242,,,66,67,,,68,,,,,,50,,,,,,,,,241,,,,,99,87,90,91,,92,94,93,95,,', +',,88,98,,,,77,78,24,82,65,89,103,104,71,72,44,45,,75,,73,74,76,33,34', +'79,80,,,,,,81,31,30,111,110,112,113,,,21,,,,,,,51,,,115,114,116,105', +'64,107,106,108,,109,117,118,,101,102,47,48,46,,,,,,,,,,,,,,,,,,,,236', +',,242,,,66,67,,,68,,,,,,50,,,,,,,,,22,,,,,99,87,90,91,,92,94,93,95,', +',,,88,98,,,,77,78,24,82,65,89,103,104,71,72,44,45,,75,,73,74,76,342', +'343,79,80,,,,,,81,337,345,111,110,112,113,,,243,,,,,,,51,,,115,114,116', +'105,64,107,106,108,,109,117,118,,101,102,47,48,46,,,,,,,,,,,,,,,,,,', +',236,,,242,,,66,67,,,68,,,,,,50,,,,,,,,,241,,,,,99,87,90,91,,92,94,93', +'95,,,,,88,98,,,,77,78,24,82,65,89,103,104,71,72,44,45,,75,,73,74,76', +'342,343,79,80,,,,,,81,337,345,111,110,112,113,,,243,,,,,,,51,,,115,114', +'116,105,64,107,106,108,,109,117,118,,101,102,47,48,46,,,,,,,,,,,,,,', +',,,,,236,,,242,,,66,67,,,68,,,,,,50,,,,,,,,,241,,,,,99,87,90,91,,92', +'94,93,95,,,,,88,98,,,,77,78,24,82,65,89,103,104,71,72,44,45,,75,,73', +'74,76,342,343,79,80,,,,,,81,337,345,111,110,112,113,,,243,,,,,,,51,', +',115,114,116,105,64,107,106,108,,109,117,118,,101,102,47,48,46,,,,,', +',,,,,,,,,,,,,,236,,,242,,,66,67,,,68,,,,,,50,,,,,,,,,241,,,,,99,87,90', +'91,,92,94,93,95,,,,,88,98,,,,77,78,24,82,65,89,103,104,71,72,44,45,', +'75,,73,74,76,342,343,79,80,,,,,,81,337,345,111,110,112,113,,,243,,,', +',,,51,,,115,114,116,105,64,107,106,108,,109,117,118,,101,102,47,48,46', +',,,,,,,,,,,,,,,,,,,236,,,242,562,,66,67,,,68,,,,,,50,,,,,,,,,241,,,', +',99,87,90,91,,92,94,93,95,,,,,88,98,,,,77,78,24,82,65,89,103,104,71', +'72,44,45,,75,,73,74,76,33,34,79,80,,,,,,81,31,30,111,110,112,113,,,21', +',,,,,,51,,,115,114,116,105,64,107,106,108,,109,117,118,,101,102,47,48', +'46,,,,,,,,,,,,,,,,,,,,236,,,242,,,66,67,,,68,,,,,,50,,,,,,,,,22,,,,', +'99,87,90,91,,92,94,93,95,,,,,88,98,,,,,,,82,,89,103,104,,,44,45,77,78', +'24,9,65,,,,71,72,,,,75,,73,74,76,33,34,79,80,,,,,,81,31,30,111,110,112', +'113,,,21,,,,,,8,51,323,10,115,114,116,105,64,107,106,108,,109,117,118', +',101,102,47,48,46,,,,,,,,,,,,,,,,,,,,43,,,36,,,66,67,,,68,,38,,,,50', +',,,,,,,,22,,,,,99,87,90,91,,92,94,93,95,,,,,88,98,,,,,,416,82,,89,103', +'104,,,44,45,77,78,24,,65,,,,71,72,,,,75,,73,74,76,342,343,79,80,,,,', +',81,337,345,111,110,112,113,,,243,,,,,,,51,,,115,114,116,105,64,107', +'106,108,,109,117,118,,101,102,47,48,46,,,,,,,,,,,,,,,,,,,,236,,,242', +',,66,67,,,68,,,,,,50,,,,,,,,,241,,,,,99,87,90,91,,92,94,93,95,,,,,88', +'98,,,,77,78,24,82,65,89,103,104,71,72,44,45,,75,,73,74,76,342,343,79', +'80,,,,,,81,337,345,111,110,112,113,,,243,,,,,,,51,,,115,114,116,105', +'64,107,106,108,315,109,117,118,,101,102,47,48,46,,,,,,,,,,,,,,,,,,,', +'236,,,242,,,66,67,,,68,,,,310,,50,,,316,,,,,,241,,,,,99,313,90,91,,92', +'94,93,95,,,,,88,98,,,,77,78,24,82,65,89,103,104,71,72,44,45,,75,,73', +'74,76,342,343,79,80,,,,,,81,337,345,111,110,112,113,,,243,,,,,,,51,', +',115,114,116,105,64,107,106,108,315,109,117,118,,101,102,47,48,46,,', +',,,,,,,,,,,,,,,,,236,,,242,,,66,67,,,68,,742,,310,,50,,,316,,,,,,241', +',,,,99,313,90,91,,92,94,93,95,,,,,88,98,,,,77,78,24,82,65,89,103,104', +'71,72,44,45,,75,,73,74,76,342,343,79,80,,,,,,81,337,345,111,110,112', +'113,,,243,,,,,,,51,,,115,114,116,105,64,107,106,108,,109,117,118,,101', +'102,47,48,46,,,,,,,,,,,,,,,,,,,,236,,,242,,,66,67,,,68,,,,,,50,,,,,', +',,,241,,,,,99,87,90,91,,92,94,93,95,,,,,88,98,,,,,,,82,,89,103,104,-272', +',44,45,,,,-272,-272,-272,,,-272,-272,-272,583,-272,580,579,578,588,581', +',,-272,-272,-272,,,,591,,,,,,-272,-272,,-272,-272,-272,-272,-272,,,', +',,,,583,586,580,579,578,588,581,,,,596,595,599,598,,591,,592,,583,,580', +'579,578,588,581,-272,,,,,,,-272,591,,,586,294,-272,,,,231,,,596,595', +'599,598,,,,592,,,586,,,,,-272,-272,,,596,595,599,598,,,,592,,,,-272', +',,-272,,77,78,24,-272,65,,,,71,72,-272,,,75,,73,74,76,342,343,79,80', +',,,,,81,337,345,111,110,112,113,,,243,,,,,,,51,,,115,114,116,105,64', +'107,106,108,,109,117,118,,101,102,47,48,46,,,,,,,,,,,,,,,,,,,,236,,', +'242,,,66,67,,,68,,,,,,50,,,,,,,,,241,,,,,99,87,90,91,,92,94,93,95,,', +',,88,98,,,,77,78,24,82,65,89,103,104,71,72,44,45,,75,,73,74,76,342,343', +'79,80,,,,,,81,337,345,111,110,112,113,,,243,,,,,,,51,,,115,114,116,105', +'64,107,106,108,,109,117,118,,101,102,47,48,46,,,,,,,,,,,,,,,,,,,,236', +',,242,,,66,67,,,68,,,,,,50,,,,,,,,,241,,,,,99,87,90,91,,92,94,93,95', +',,,,88,98,,,,77,78,24,82,65,89,103,104,71,72,44,45,,75,,73,74,76,342', +'343,79,80,,,,,,81,337,345,111,110,112,113,,,243,,,,,,,51,,,115,114,116', +'105,64,107,106,108,,109,117,118,,101,102,47,48,46,,,,,,,,,,,,,,,,,,', +',236,,,242,,,66,67,,,68,,,,,,50,,,,,,,,,241,,,,,99,87,90,91,,92,94,93', +'95,,,,,88,98,,,,77,78,24,82,65,89,103,104,71,72,44,45,,75,,73,74,76', +'33,34,79,80,,,,,,81,31,30,111,110,112,113,,,243,,,,,,,51,,,115,114,116', +'105,64,107,106,108,315,109,117,118,,101,102,47,48,46,,,,,,,,,,,,,,,', +',,,,236,,,242,,,66,67,,,68,,312,,310,,50,,,316,,,,,,241,,,,,99,313,90', +'91,,92,94,93,95,,,,,88,98,,,,,,,82,,89,103,104,-706,,44,45,,,,-706,-706', +'-706,,,-706,-706,-706,,-706,,,,,,,,-706,-706,-706,-706,-706,,,,,,,,-706', +'-706,,-706,-706,-706,-706,-706,,,,,,,,,,,,,,,,,,,,,,,-706,-706,-706', +'-706,-706,-706,-706,-706,-706,-706,-706,-706,-706,-706,,,-706,-706,-706', +',,-706,,,-706,,,-706,-706,,-706,,-706,,-706,,-706,-706,,-706,-706,-706', +'-706,-706,,-706,-706,-706,,,,,,,,,,,,,,-706,,,-706,-706,-706,-706,,-706', +',-706,,77,78,24,-706,65,,,,71,72,,,,75,,73,74,76,33,34,79,80,,,,,,81', +'31,30,111,110,112,113,,,21,,,,,,,51,,,115,114,116,105,64,107,106,108', +',109,117,118,,101,102,47,48,46,,,,,,,,,,,,,,,,,,,,236,,,242,,,66,67', +',,68,,,,,,50,,,,,,,,,22,,,,,99,87,90,91,,92,94,93,95,,,,,88,98,,,,,', +',82,,89,103,104,-705,,44,45,,,,-705,-705,-705,,,-705,-705,-705,,-705', +',,,,,,,-705,-705,-705,-705,-705,,,,,,,,-705,-705,,-705,-705,-705,-705', +'-705,,,,,,,,,,,,,,,,,,,,,,,-705,-705,-705,-705,-705,-705,-705,-705,-705', +'-705,-705,-705,-705,-705,,,-705,-705,-705,,,-705,,,-705,,,-705,-705', +',-705,,-705,,-705,,-705,-705,,-705,-705,-705,-705,-705,,-705,-705,-705', +',,,,,,,,,,,,,-705,,,-705,-705,-705,-705,,-705,-272,-705,,,,,-705,-272', +'-272,-272,,,-272,-272,-272,,-272,,,,,,,,-272,-272,-272,-272,,,,,,,,', +'-272,-272,,-272,-272,-272,-272,-272,,,,,,,,,,,,,,,,,,,,,,,-272,-272', +'-272,-272,-272,-272,-272,-272,-272,-272,-272,-272,-272,-272,,,-272,-272', +'-272,,,-272,,294,-272,,,-272,-272,,-272,,-272,,-272,,-272,-272,,-272', +'-272,-272,-272,-272,,-272,-272,-272,,,,,,,,,,,,,,-272,,,-272,-272,,-272', +',-272,77,78,24,,65,,-272,,71,72,,,,75,,73,74,76,342,343,79,80,,,,,,81', +'337,345,111,110,112,113,,,243,,,,,,,51,,,115,114,116,105,64,107,106', +'108,,109,117,118,,101,102,47,48,46,,,,,,,,,,,,,,,,,,,,236,,,242,,,66', +'67,,,68,,,,,,50,,,,,,,,,241,,,,,99,87,90,91,,92,94,93,95,,,,,88,98,', +',,77,78,24,82,65,89,103,104,71,72,44,45,,75,,73,74,76,33,34,79,80,,', +',,,81,31,30,111,110,112,113,,,21,,,,,,,51,,,115,114,116,105,64,107,106', +'108,,109,117,118,,101,102,47,48,46,,,,,,,,,,,,,,,,,,,,236,,,242,,,66', +'67,,,68,,,,,,50,,,,,,,,,22,,,,,99,87,90,91,,92,94,93,95,,,,,88,98,,', +',77,78,24,82,65,89,103,104,71,72,44,45,,75,,73,74,76,33,34,79,80,,,', +',,81,31,30,111,110,112,113,,,21,,,,,,,51,,,115,114,116,105,64,107,106', +'108,,109,117,118,,101,102,47,48,46,,,,,,,,,,,,,,,,,,,,236,,,242,,,66', +'67,,,68,,,,,,50,,,,,,,,,22,,,,,99,87,90,91,,92,94,93,95,,,,,88,98,,', +',77,78,24,82,65,89,103,104,71,72,44,45,,75,,73,74,76,33,34,79,80,,,', +',,81,31,30,111,110,112,113,,,243,,,,,,,51,,,115,114,116,105,64,107,106', +'108,,109,117,118,,101,102,47,48,46,,,,,,,,,,,,,,,,,,,,236,,,242,,,66', +'67,,,68,,,,,,50,,,,,,,,,241,,,,,99,87,90,91,,92,94,93,95,,,,,88,98,', +',,77,78,24,82,65,89,103,104,71,72,44,45,,75,,73,74,76,33,34,79,80,,', +',,,81,31,30,111,110,112,113,,,243,,,,,,,51,,,115,114,116,105,64,107', +'106,108,315,109,117,118,,101,102,47,48,46,,,,,,,,,,,,,,,,,,,,236,,,242', +',,66,67,,,68,,312,,310,,50,,,316,,,,,,241,,,,,99,313,90,91,,92,94,93', +'95,,,,,88,98,,,,77,78,24,82,65,89,103,104,71,72,44,45,,75,,73,74,76', +'342,343,79,80,,,,,,81,337,345,111,110,112,113,,,243,,,,,,,51,,,115,114', +'116,105,64,107,106,108,,109,117,118,,101,102,47,48,46,,,,,,,,,,,,,,', +',,,,,236,,,242,,,66,67,,,68,,,,,,50,,,,,,,,,241,,,,,99,87,90,91,,92', +'94,93,95,,,,,88,98,,,,77,78,24,82,65,89,103,104,71,72,44,45,,75,,73', +'74,76,33,34,79,80,,,,,,81,31,30,111,110,112,113,,,243,,,,,,,51,,,115', +'114,116,105,64,107,106,108,,109,117,118,,101,102,47,48,46,,,,,,,,,,', +',,,,,,,,,236,,,242,,,66,67,,,68,,,,,,50,,,,,,,,,241,,,,,99,87,90,91', +',92,94,93,95,,,,,88,98,,,,77,78,24,82,65,89,103,104,71,72,44,45,,75', +',73,74,76,33,34,79,80,,,,,,81,31,30,111,110,112,113,,,21,,,,,,,51,,', +'115,114,116,105,64,107,106,108,,109,117,118,,101,102,47,48,46,,,,,,', +',,,,,,,,,,,,,236,,,242,,,66,67,,,68,,,,,,50,,,,,,,,,22,,,,,99,87,90', +'91,,92,94,93,95,,,,,88,98,,,,77,78,24,82,65,89,103,104,71,72,44,45,', +'75,,73,74,76,33,34,79,80,,,,,,81,31,30,111,110,112,113,,,21,,,,,,,51', +',,115,114,116,105,64,107,106,108,,109,117,118,,101,102,47,48,46,,,,', +',,,,,,,,,,,,,,,236,,,242,,,66,67,,,68,,,,,,50,,,,,,,,,22,,,,,99,87,90', +'91,,92,94,93,95,,,,,88,98,231,,,77,78,24,82,65,89,103,104,71,72,44,45', +',75,,73,74,76,342,343,79,80,,,,,,81,337,345,111,110,112,113,,,243,,', +',,,,51,,,115,114,116,105,64,107,106,108,,109,117,118,,101,102,47,48', +'46,,,,,,,,,,,,,,,,,,,,236,,,242,,,66,67,,,68,,,,,,50,,,,,,,,,241,,,', +',99,87,90,91,,92,94,93,95,,,,,88,98,,,,77,78,24,82,65,89,103,104,71', +'72,44,45,,75,,73,74,76,342,343,79,80,,,,,,81,337,345,111,110,112,113', +',,243,,,,,,,51,,,115,114,116,105,64,107,106,108,,109,117,118,,101,102', +'47,48,46,,,,,,,,,,,,,,,,,,,,236,,,242,,,66,67,,,68,,,,,,50,,,,,,,,,241', +',,,,99,87,90,91,,92,94,93,95,,,,,88,98,,,,77,78,24,82,65,89,103,104', +'71,72,44,45,,75,,73,74,76,342,343,79,80,,,,,,81,337,345,111,110,112', +'113,,,243,,,,,,,51,,,115,114,116,105,64,107,106,108,,109,117,118,,101', +'102,47,48,46,,,,,,,,,,,,,,,,,,,,236,,,242,,,66,67,,,68,,,,,,50,,,,,', +',,,241,,,,,99,87,90,91,,92,94,93,95,,,,,88,98,,,,77,78,24,82,65,89,103', +'104,71,72,44,45,,75,,73,74,76,342,343,79,80,,,,,,81,337,345,111,110', +'112,113,,,243,,,,,,,51,,,115,114,116,105,64,107,106,108,,109,117,118', +',101,102,47,48,46,,,,,,,,,,,,,,,,,,,,236,,,242,,,66,67,,,68,,,,,,50', +',,,,,,,,241,,,,,99,87,90,91,,92,94,93,95,,,,,88,98,,,,77,78,24,82,65', +'89,103,104,71,72,44,45,,75,,73,74,76,33,34,79,80,,,,,,81,31,30,111,110', +'112,113,,,243,,,,,,,51,,,115,114,116,105,64,107,106,108,,109,117,118', +',101,102,47,48,46,,,,,,,,,,,,,,,,,,,,236,,,242,,,66,67,,,68,,,,,,50', +',,,,,,,,241,,,,,99,87,90,91,,92,94,93,95,,,,,88,98,,,,77,78,24,82,65', +'89,103,104,71,72,44,45,,75,,73,74,76,342,343,79,80,,,,,,81,337,345,111', +'110,112,113,,,243,,,,,,,51,,,115,114,116,105,64,107,106,108,,109,117', +'118,,101,102,47,48,46,,,,,,,,,,,,,,,,,,,,236,,,242,,,66,67,,,68,,,,', +',50,,,,,,,,,241,,,,,99,87,90,91,,92,94,93,95,,,,,88,98,,,,77,78,24,82', +'65,89,103,104,71,72,44,45,,75,,73,74,76,342,343,79,80,,,,,,81,337,345', +'111,110,112,113,,,243,,,,,,,51,,,115,114,116,105,64,107,106,108,,109', +'117,118,,101,102,47,48,46,,,,,,,,,,,,,,,,,,,,236,,,242,,,66,67,,,68', +',,,,,50,,,,,,,,,241,,,,,99,87,90,91,,92,94,93,95,,,,,88,98,,,,77,78', +'24,82,65,89,103,104,71,72,44,45,,75,,73,74,76,342,343,79,80,,,,,,81', +'337,345,111,110,112,113,,,243,,,,,,,51,,,115,114,116,105,64,107,106', +'108,,109,117,118,,101,102,47,48,46,,,,,,,,,,,,,,,,,,,,236,,,242,,,66', +'67,,,68,,,,,,50,,,,,,,,,241,,,,,99,87,90,91,,92,94,93,95,,,,,88,98,', +',,77,78,24,82,65,89,103,104,71,72,44,45,,75,,73,74,76,342,343,79,80', +',,,,,81,337,345,111,110,112,113,,,243,,,,,,,51,,,115,114,116,105,64', +'107,106,108,,109,117,118,,101,102,47,48,46,,,,,,,,,,,,,,,,,,,,236,,', +'242,,,66,67,,,68,,,,,,50,,,,,,,,,241,,,,,99,87,90,91,,92,94,93,95,,', +',,88,98,,,,77,78,24,82,65,89,103,104,71,72,44,45,,75,,73,74,76,342,343', +'79,80,,,,,,81,337,345,111,110,112,113,,,243,,,,,,,51,,,115,114,116,105', +'64,107,106,108,,109,117,118,,101,102,47,48,46,,,,,,,,,,,,,,,,,,,,236', +',,242,,,66,67,,,68,,,,,,50,,,,,,,,,241,,,,,99,87,90,91,,92,94,93,95', +',,,,88,98,,,,77,78,24,82,65,89,103,104,71,72,44,45,,75,,73,74,76,342', +'343,79,80,,,,,,81,337,345,111,110,112,113,,,243,,,,,,,51,,,115,114,116', +'105,64,107,106,108,,109,117,118,,101,102,47,48,46,,,,,,,,,,,,,,,,,,', +',236,,,242,,,66,67,,,68,,,,,,50,,,,,,,,,241,,,,,99,87,90,91,,92,94,93', +'95,,,,,88,98,,,,77,78,24,82,65,89,103,104,71,72,44,45,,75,,73,74,76', +'342,343,79,80,,,,,,81,337,345,111,110,112,113,,,243,,,,,,,51,,,115,114', +'116,105,64,107,106,108,,109,117,118,,101,102,47,48,46,,,,,,,,,,,,,,', +',,,,,236,,,242,,,66,67,,,68,,,,,,50,,,,,,,,,241,,,,,99,87,90,91,,92', +'94,93,95,,,,,88,98,,,,77,78,24,82,65,89,103,104,71,72,44,45,,75,,73', +'74,76,342,343,79,80,,,,,,81,337,345,111,110,112,113,,,243,,,,,,,51,', +',115,114,116,105,64,107,106,108,,109,117,118,,101,102,47,48,46,,,,,', +',,,,,,,,,,,,,,236,,,242,,,66,67,,,68,,,,,,50,,,,,,,,,241,,,,,99,87,90', +'91,,92,94,93,95,,,,,88,98,,,,77,78,24,82,65,89,103,104,71,72,44,45,', +'75,,73,74,76,342,343,79,80,,,,,,81,337,345,111,110,112,113,,,243,,,', +',,,51,,,115,114,116,105,64,107,106,108,,109,117,118,,101,102,47,48,46', +',,,,,,,,,,,,,,,,,,,236,,,242,,,66,67,,,68,,,,,,50,,,,,,,,,241,,,,,99', +'87,90,91,,92,94,93,95,,,,,88,98,,,,77,78,24,82,65,89,103,104,71,72,44', +'45,,75,,73,74,76,342,343,79,80,,,,,,81,337,345,111,110,112,113,,,243', +',,,,,,51,,,115,114,116,105,64,107,106,108,,109,117,118,,101,102,47,48', +'46,,,,,,,,,,,,,,,,,,,,236,,,242,,,66,67,,,68,,,,,,50,,,,,,,,,241,,,', +',99,87,90,91,,92,94,93,95,,,,,88,98,,,,77,78,24,82,65,89,103,104,71', +'72,44,45,,75,,73,74,76,342,343,79,80,,,,,,81,337,345,111,110,112,113', +',,243,,,,,,,51,,,115,114,116,105,64,107,106,108,,109,117,118,,101,102', +'47,48,46,,,,,,,,,,,,,,,,,,,,236,,,242,,,66,67,,,68,,,,,,50,,,,,,,,,241', +',,,,99,87,90,91,,92,94,93,95,,,,,88,98,,,,77,78,24,82,65,89,103,104', +'71,72,44,45,,75,,73,74,76,342,343,79,80,,,,,,81,337,345,111,110,112', +'113,,,243,,,,,,,51,,,115,114,116,105,64,107,106,108,,109,117,118,,101', +'102,47,48,46,,,,,,,,,,,,,,,,,,,,236,,,242,,,66,67,,,68,,,,,,50,,,,,', +',,,241,,,,,99,87,90,91,,92,94,93,95,,,,,88,98,,,,77,78,24,82,65,89,103', +'104,71,72,44,45,,75,,73,74,76,342,343,79,80,,,,,,81,337,345,111,110', +'112,113,,,243,,,,,,,51,,,115,114,116,105,64,107,106,108,,109,117,118', +',101,102,47,48,46,,,,,,,,,,,,,,,,,,,,236,,,242,,,66,67,,,68,,,,,,50', +',,,,,,,,241,,,,,99,87,90,91,,92,94,93,95,,,,,88,98,,,,77,78,24,82,65', +'89,103,104,71,72,44,45,,75,,73,74,76,342,343,79,80,,,,,,81,337,345,111', +'110,112,113,,,243,,,,,,,51,,,115,114,116,105,64,107,106,108,,109,117', +'118,,101,102,47,48,46,,,,,,,,,,,,,,,,,,,,236,,,242,,,66,67,,,68,,,,', +',50,,,,,,,,,241,,,,,99,87,90,91,,92,94,93,95,,,,,88,98,,,,77,78,24,82', +'65,89,103,104,71,72,44,45,,75,,73,74,76,342,343,79,80,,,,,,81,337,345', +'111,110,112,113,,,243,,,,,,,51,,,115,114,116,105,64,107,106,108,,109', +'117,118,,101,102,47,48,46,,,,,,,,,,,,,,,,,,,,236,,,242,,,66,67,,,68', +',,,,,50,,,,,,,,,241,,,,,99,87,90,91,,92,94,93,95,,,,,88,98,,,,77,78', +'24,82,65,89,103,104,71,72,44,45,,75,,73,74,76,342,343,79,80,,,,,,81', +'337,345,111,110,112,113,,,243,,,,,,,51,,,115,114,116,105,64,107,106', +'108,,109,117,118,,101,102,47,48,46,,,,,,,,,,,,,,,,,,,,236,,,242,,,66', +'67,,,68,,,,,,50,,,,,,,,,241,,,,,99,87,90,91,,92,94,93,95,,,,,88,98,', +',,77,78,24,82,65,89,103,104,71,72,44,45,,75,,73,74,76,342,343,79,80', +',,,,,81,337,345,111,110,112,113,,,243,,,,,,,51,,,115,114,116,105,64', +'107,106,108,,109,117,118,,101,102,47,48,46,,,,,,,,,,,,,,,,,,,,236,,', +'242,,,66,67,,,68,,,,,,50,,,,,,,,,241,,,,,99,87,90,91,,92,94,93,95,,', +',,88,98,,,,77,78,24,82,65,89,103,104,71,72,44,45,,75,,73,74,76,342,343', +'79,80,,,,,,81,337,345,111,110,112,113,,,243,,,,,,,51,,,115,114,116,105', +'64,107,106,108,,109,117,118,,101,102,47,48,46,,,,,,,,,,,,,,,,,,,,236', +',,242,,,66,67,,,68,,,,,,50,,,,,,,,,241,,,,,99,87,90,91,,92,94,93,95', +',,,,88,98,,,,77,78,24,82,65,89,103,104,71,72,44,45,,75,,73,74,76,342', +'343,79,80,,,,,,81,337,345,111,110,112,113,,,243,,,,,,,51,,,115,114,116', +'105,64,107,106,108,,109,117,118,,101,102,47,48,46,,,,,,,,,,,,,,,,,,', +',236,,,242,,,66,67,,,68,,,,,,50,,,,,,,,,241,,,,,99,87,90,91,,92,94,93', +'95,,,,,88,98,,,,77,78,24,82,65,89,103,104,71,72,44,45,,75,,73,74,76', +'342,343,79,80,,,,,,81,337,345,111,110,112,113,,,243,,,,,,,51,,,115,114', +'116,105,64,107,106,108,,109,117,118,,101,102,47,48,46,,,,,,,,,,,,,,', +',,,,,236,,,242,,,66,67,,,68,,,,,,50,,,,,,,,,241,,,,,99,87,90,91,,92', +'94,93,95,,,,,88,98,,,,77,78,24,82,65,89,103,104,71,72,44,45,,75,,73', +'74,76,342,343,79,80,,,,,,81,337,345,111,110,112,113,,,243,,,,,,,51,', +',115,114,116,105,64,107,106,108,,109,117,118,,101,102,47,48,46,,,,,', +',,,,,,,,,,,,,,236,,,242,,,66,67,,,68,,,,,,50,,,,,,,,,241,,,,,99,87,90', +'91,,92,94,93,95,,,,,88,98,,,,77,78,24,82,65,89,103,104,71,72,44,45,', +'75,,73,74,76,342,343,79,80,,,,,,81,337,345,111,110,112,113,,,243,,,', +',,,51,,,115,114,116,105,64,107,106,108,,109,117,118,,101,102,47,48,46', +',,,,,,,,,,,,,,,,,,,236,,,242,,,66,67,,,68,,,,,,50,,,,,,,,,241,,,,,99', +'87,90,91,,92,94,93,95,,,,,88,98,,,,77,78,24,82,65,89,103,104,71,72,44', +'45,,75,,73,74,76,342,343,79,80,,,,,,81,337,345,111,110,112,113,,,243', +',,,,,,51,,,115,114,116,105,64,107,106,108,,109,117,118,,101,102,47,48', +'46,,,,,,,,,,,,,,,,,,,,236,,,242,,,66,67,,,68,,,,,,50,,,,,,,,,241,,,', +',99,87,90,91,,92,94,93,95,,,,,88,98,,,,77,78,24,82,65,89,103,104,71', +'72,44,45,,75,,73,74,76,342,343,79,80,,,,,,81,337,345,111,110,112,113', +',,243,,,,,,,51,,,115,114,116,105,64,107,106,108,,109,117,118,,101,102', +'47,48,46,,,,,,,,,,,,,,,,,,,,236,,,242,,,66,67,,,68,,,,,,50,,,,,,,,,241', +',,,,99,87,90,91,,92,94,93,95,,,,,88,98,,,,77,78,24,82,65,89,103,104', +'71,72,44,45,,75,,73,74,76,342,343,79,80,,,,,,81,337,345,111,110,112', +'113,,,243,,,,,,,51,,,115,114,116,105,64,107,106,108,,109,117,118,,101', +'102,47,48,46,,,,,,,,,,,,,,,,,,,,236,,,242,,,66,67,,,68,,,,,,50,,,,,', +',,,241,,,,,99,87,90,91,,92,94,93,95,,,,,88,98,,,,77,78,24,82,65,89,103', +'104,71,72,44,45,,75,,73,74,76,33,34,79,80,,,,,,81,31,30,111,110,112', +'113,,,21,,,,,,,51,,,115,114,116,105,64,107,106,108,,109,117,118,,101', +'102,47,48,46,,,,,,,,,,,,,,,,,,,,236,,,242,,,66,67,,,68,,,,,,50,,,,,', +',,,22,,,,,99,87,90,91,,92,94,93,95,,,,,88,98,,,,77,78,24,82,65,89,103', +'104,71,72,44,45,,75,,73,74,76,342,343,79,80,,,,,,81,337,345,111,110', +'112,113,,,243,,,,,,,51,,,115,114,116,105,64,107,106,108,,109,117,118', +',101,102,47,48,46,,,,,,,,,,,,,,,,,,,,236,,,242,,,66,67,,,68,,,,,,50', +',,,,,,,,241,,,,,99,87,90,91,,92,94,93,95,,,,,88,98,,,,77,78,24,82,65', +'89,103,104,71,72,44,45,,75,,73,74,76,342,343,79,80,,,,,,81,337,345,111', +'110,112,113,,,243,,,,,,,51,,,115,114,116,105,64,107,106,108,,109,117', +'118,,101,102,47,48,46,,,,,,,,,,,,,,,,,,,,236,,,242,,,66,67,,,68,,432', +',,,50,,,,,,,,,241,,,,,99,87,90,91,,92,94,93,95,,,,,88,98,,,,77,78,24', +'82,65,89,103,104,71,72,44,45,,75,,73,74,76,33,34,79,80,,,,,,81,31,30', +'111,110,112,113,,,21,,,,,,,51,,,115,114,116,105,64,107,106,108,,109', +'117,118,,101,102,47,48,46,,,,,,,,,,,,,,,,,,,,236,,,242,,,66,67,,,68', +',,,,,50,,,,,,,,,22,,,,,99,87,90,91,,92,94,93,95,,,,,88,98,,,,77,78,24', +'82,65,89,103,104,71,72,44,45,,75,,73,74,76,342,343,79,80,,,,,,81,337', +'345,111,110,112,113,,,243,,,,,,,51,,,115,114,116,105,64,107,106,108', +',109,117,118,,101,102,47,48,46,,,,,,,,,,,,,,,,,,,,236,,,242,,,66,67', +',,68,,,,,,50,,,,,,,,,241,,,,,99,87,90,91,,92,94,93,95,,,,,88,98,,,,77', +'78,24,82,65,89,103,104,71,72,44,45,,75,,73,74,76,342,343,79,80,,,,,', +'81,337,345,111,110,112,113,,,243,,,,,,,51,,,115,114,116,105,64,107,106', +'108,,109,117,118,,101,102,47,48,46,,,,,,,,,,,,,,,,,,,,236,,,242,,,66', +'67,,,68,,,,,,50,,,,,,,,,241,,,,,99,87,90,91,,92,94,93,95,,,,,88,98,', +',,77,78,24,82,65,89,103,104,71,72,44,45,,75,,73,74,76,33,34,79,80,,', +',,,81,31,30,111,110,112,113,,,243,,,,,,,51,,,115,114,116,105,64,107', +'106,108,315,109,117,118,,101,102,47,48,46,,,,,,,,,,,,,,,,,,,,236,,,242', +',,66,67,,,68,,312,,310,,50,,,316,,,,,,241,,,,,99,313,90,91,,92,94,93', +'95,,,,,88,98,,,,77,78,24,82,65,89,103,104,71,72,44,516,,75,,73,74,76', +'33,34,79,80,,,,,,81,31,30,111,110,112,113,,,243,,,,,,,51,,,115,114,116', +'105,64,107,106,108,315,109,117,118,,101,102,47,48,46,,,,,,,,,,,,,,,', +',,,,236,,,242,,,66,67,,,68,,312,,310,,50,,,316,,,,,,241,,,,,99,313,90', +'91,,92,94,93,95,,,,,88,98,,,,77,78,24,82,65,89,103,104,71,72,44,45,', +'75,,73,74,76,33,34,79,80,,,,,,81,31,30,111,110,112,113,,,243,,,,,,,51', +',,115,114,116,105,64,107,106,108,315,109,117,118,,101,102,47,48,46,', +',,,,,,,,,,,,,,,,,,236,,,242,,,66,67,,,68,,312,,310,,50,,,316,,,,,,241', +',,,,99,313,90,91,,92,94,93,95,,,,,88,98,231,,,77,78,24,82,65,89,103', +'104,71,72,44,45,,75,,73,74,76,342,343,79,80,,,,,,81,337,345,111,110', +'112,113,,,243,,,,,,,51,,,115,114,116,105,64,107,106,108,315,109,117', +'118,,101,102,47,48,46,,,,,,,,,,,,,,,,,,,,236,,,242,,,66,67,,,68,,742', +',310,,50,,,316,,,,,,241,,,,,99,313,90,91,,92,94,93,95,,,,,88,98,,,,77', +'78,24,82,65,89,103,104,71,72,44,516,,75,,73,74,76,342,343,79,80,,,,', +',81,337,345,111,110,112,113,,,243,,,,,,,51,,,115,114,116,105,64,107', +'106,108,,109,117,118,,101,102,47,48,46,,,,,,,,,,,,,,,,,,,,236,,,242', +',,66,67,,,68,,,,,,50,,,,,,,,,241,,,,,99,87,90,91,,92,94,93,95,,,,,88', +'98,,,,77,78,24,82,65,89,103,104,71,72,44,45,,75,,73,74,76,33,34,79,80', +',,,,,81,31,30,111,110,112,113,,,243,,,,,,,51,,,115,114,116,105,64,107', +'106,108,,109,117,118,,101,102,47,48,46,,,,,,,,,,,,,,,,,,,,236,,,242', +',,66,67,,,68,,,,,,50,,,,,,,,,241,,,,,99,87,90,91,,92,94,93,95,,,,,88', +'98,,,,77,78,24,82,65,89,103,104,71,72,44,45,,75,,73,74,76,342,343,79', +'80,,,,,,81,337,345,111,110,112,113,,,243,,,,,,,51,,,115,114,116,105', +'64,107,106,108,,109,117,118,,101,102,47,48,46,,,,,,,,,,,,,,,,,,,,236', +',,242,,,66,67,,,68,,,,,,50,,,,,,,,,241,,,,,99,87,90,91,,92,94,93,95', +',,,,88,98,,,,77,78,24,82,65,89,103,104,71,72,44,45,,75,,73,74,76,342', +'343,79,80,,,,,,81,337,345,111,110,112,113,,,243,,,,,,,51,,,115,114,116', +'105,64,107,106,108,,109,117,118,,101,102,47,48,46,,,,,,,,,,,,,,,,,,', +',236,,,242,,,66,67,,,68,,,,,,50,,,,,,,,,241,,,,,99,87,90,91,,92,94,93', +'95,,,,,88,98,,,,77,78,24,82,65,89,103,104,71,72,44,45,,75,,73,74,76', +'342,343,79,80,,,,,,81,337,345,111,110,112,113,,,243,,,,,,,51,,,115,114', +'116,105,64,107,106,108,,109,117,118,,101,102,47,48,46,,,,,,,,,,,,,,', +',,,,,236,,,242,,,66,67,,,68,,,,,,50,,,,,,,,,241,,,,,99,87,90,91,,92', +'94,93,95,,,,,88,98,,,,77,78,24,82,65,89,103,104,71,72,44,45,,75,,73', +'74,76,33,34,79,80,,,,,,81,31,30,111,110,112,113,,,243,,,,,,,51,,,115', +'114,116,105,64,107,106,108,,109,117,118,,101,102,47,48,46,,,,,,,,,,', +',,,,,,,,,236,,,242,,,66,67,,,68,,,,,,50,,,,,,,,,241,,,,,99,87,90,91', +',92,94,93,95,,,,,88,98,,,,,,,82,,89,103,104,,,44,45,77,78,24,9,65,,', +',71,72,,,,75,,73,74,76,33,34,79,80,,,,,,81,31,30,111,110,112,113,,,21', +',,,,,8,51,,10,115,114,116,105,64,107,106,108,,109,117,118,,101,102,47', +'48,46,,,,,,,,,,,,,,,,,,,,43,,,36,,,66,67,,,68,,38,,,,50,,,,,,,,,22,', +',,,99,87,90,91,,92,94,93,95,,,,,88,98,,,,77,78,24,82,65,89,103,104,71', +'72,44,45,,75,,73,74,76,33,34,79,80,,,,,,81,31,30,111,110,112,113,,,243', +',,,,,,51,,,115,114,116,105,64,107,106,108,,109,117,118,,101,102,47,48', +'46,,,,,,,,,,,,,,,,,,,,236,,,242,,,66,67,,,68,,,,,,50,,,,,,,,,241,,,', +',99,87,90,91,,92,94,93,95,,,,,88,98,,,,77,78,24,82,65,89,103,104,71', +'72,44,45,,75,,73,74,76,33,34,79,80,,,,,,81,31,30,111,110,112,113,,,243', +',,,,,,51,,,115,114,116,105,64,107,106,108,,109,117,118,,101,102,47,48', +'46,,,,,,,,,,,,,,,,,,,,236,,,242,,,66,67,,,68,,,,,,50,,,,,,,,,241,,,', +',99,87,90,91,,92,94,93,95,,,,,88,98,,,,77,78,24,82,65,89,103,104,71', +'72,44,45,,75,,73,74,76,342,343,79,80,,,,,,81,337,345,111,110,112,113', +',,243,,,,,,,51,,,115,114,116,105,64,107,106,108,315,109,117,118,,101', +'102,47,48,46,,,,,,,,,,,,,,,,,,,,236,,,242,,,66,67,,,68,,,,310,,50,,', +'316,,,,,,241,,,,,99,313,90,91,,92,94,93,95,,,,,88,98,,,,77,78,24,82', +'65,89,103,104,71,72,44,45,,75,,73,74,76,342,343,79,80,,,,,,81,337,345', +'111,110,112,113,,,243,,,,,,,51,,,115,114,116,105,64,107,106,108,315', +'109,117,118,,101,102,47,48,46,,,,,,,,,,,,,,,,,,,,236,,,242,,,66,67,', +',68,,742,,310,,50,,,316,,,,,,241,,,,,99,313,90,91,,92,94,93,95,,,,,88', +'98,,,,77,78,24,82,65,89,103,104,71,72,44,45,,75,,73,74,76,342,343,79', +'80,,,,,,81,337,345,111,110,112,113,,,243,,,,,,,338,,,115,114,116,105', +'64,107,106,108,,109,117,118,,101,102,,,346,,,,,,,,,,,,,,,,,,,,390,,', +'36,,,66,67,,,68,,38,,,,,,,,,,,,,,,,,,99,87,90,91,,92,94,93,95,,,,,88', +'98,,,,77,78,24,82,65,89,103,104,71,72,,,,75,,73,74,76,342,343,79,80', +',,,,,81,337,345,111,110,112,113,,,243,,,,,,,338,,,115,114,116,105,64', +'107,106,108,,109,117,118,,101,102,,,346,,,,,,,,,,,,,,,,,,,,390,,,36', +',,66,67,,,68,,38,,,,,,,,,,,,,,,,,,99,87,90,91,,92,94,93,95,,,,,88,98', +',,,77,78,24,82,65,89,103,104,71,72,,,,75,,73,74,76,342,343,79,80,,,', +',,81,337,345,111,110,112,113,,,243,,,,,,,338,,,115,114,116,105,64,107', +'106,108,,109,117,118,,101,102,,,346,,,,,,,,,,,,,,,,,,,,334,,,330,,,66', +'67,,,68,,,,,,,,,,,,,,,,,,,,99,87,90,91,,92,94,93,95,,,,,88,98,,,,77', +'78,24,82,65,89,103,104,71,72,,,,75,,73,74,76,342,343,79,80,,,,,,81,337', +'345,111,110,112,113,,,243,,,,,,,338,,,115,114,116,395,64,107,106,396', +',109,117,118,,101,102,,,346,,,,,,,,,,,,,,,,,,,,397,,,242,,,66,67,,,68', +',,,,,,,,,,,,,,,,,,,99,87,90,91,,92,94,93,95,,,,,88,98,,,,77,78,24,82', +'65,89,103,104,71,72,,,,75,,73,74,76,342,343,79,80,,,,,,81,337,345,111', +'110,112,113,,,243,,,,,,,338,,,115,114,116,105,64,107,106,108,,109,117', +'118,,101,102,,,346,,,,,,,,,,,,,,,,,,,,334,,,330,,,66,67,,,68,,,,,,,', +',,,,,,,,,,,,99,87,90,91,,92,94,93,95,,,,,88,98,,,,77,78,24,82,65,89', +'103,104,71,72,,,,75,,73,74,76,342,343,79,80,,,,,,81,337,345,111,110', +'112,113,,,243,,,,,,,338,,,115,114,116,105,64,107,106,108,,109,117,118', +',101,102,,,346,,,,,,,,,,,,,,,,,,,,334,,,330,,,66,67,,,68,,,,,,,,,,,', +',,,,,,,,99,87,90,91,,92,94,93,95,,,,,88,98,,,,77,78,24,82,65,89,103', +'104,71,72,,,,75,,73,74,76,342,343,79,80,,,,,,81,337,345,111,110,112', +'113,,,243,,,,,,,338,,,115,114,116,105,64,107,106,108,,109,117,118,,101', +'102,,,346,,,,,,,,,,,,,,,,,,,,1105,,,242,,,66,67,,,68,,,,,,,,,,,,,,,', +',,,,99,87,90,91,,92,94,93,95,,,,,88,98,,,,77,78,24,82,65,89,103,104', +'71,72,,,,75,,73,74,76,342,343,79,80,,,,,,81,337,345,111,110,112,113', +',,243,,,,,,,338,,,115,114,116,105,64,107,106,108,,109,117,118,,101,102', +',,346,,,,,,,,,,,,,,,,,,,,1111,,,242,,,66,67,,,68,,,,,,,,,,,,,,,,,,,', +'99,87,90,91,,92,94,93,95,,,,,88,98,,,,77,78,24,82,65,89,103,104,71,72', +',,,75,,73,74,76,342,343,79,80,,,,,,81,337,345,111,110,112,113,,,243', +',,,,,,338,,,115,114,116,395,64,107,106,396,,109,117,118,,101,102,,,346', +',,,,,,,,,,,,,,,,402,,,397,,,242,,,66,67,,,68,,,,,,,,,,,,,,,,,,,,99,87', +'90,91,,92,94,93,95,,,,,88,98,,,,77,78,24,82,65,89,103,104,71,72,,,,75', +',73,74,76,342,343,79,80,,,,,,81,337,345,111,110,112,113,,,243,,,,,,', +'338,,,115,114,116,105,64,107,106,108,,109,117,118,,101,102,,,346,,,', +',,,,,,,,,,,,,,,,390,,,36,,,66,67,,,68,,38,,,,,,,,,,,,,,,,,,99,87,90', +'91,,92,94,93,95,,,,,88,98,,,,77,78,24,82,65,89,103,104,71,72,,,,75,', +'73,74,76,342,343,79,80,,,,,,81,337,345,111,110,112,113,,,243,,,,,,,338', +',,115,114,116,105,64,107,106,108,,109,117,118,,101,102,,,346,,,,,,,', +',,,,,,,,,,,,1105,,,242,,,66,67,,,68,,,,,,,,,,,,,,,,,,,,99,87,90,91,', +'92,94,93,95,,,,,88,98,,,,77,78,24,82,65,89,103,104,71,72,,,,75,,73,74', +'76,342,343,79,80,,,,,,81,337,345,111,110,112,113,,,243,,,,,,,338,,,115', +'114,116,105,64,107,106,108,,109,117,118,,101,102,,,346,,,,,,,,,,,,,', +',,,,,,334,,,330,,,66,67,,,68,,,,,,,,,,,,,,,,,,,,99,87,90,91,,92,94,93', +'95,,,,,88,98,,,,77,78,24,82,65,89,103,104,71,72,,,,75,,73,74,76,342', +'343,79,80,,,,,,81,337,345,111,110,112,113,,,243,,,,,,,338,,,115,114', +'116,105,64,107,106,108,,109,117,118,,101,102,,,346,,,,,,,,,,,,,,,,,', +',,334,,,242,,,66,67,,,68,,,583,,580,579,578,588,581,,,,,,,,,591,,99', +'87,90,91,,92,94,93,95,,,,,88,98,,,,348,,586,82,,89,103,104,77,78,24', +',65,599,598,,71,72,592,,,75,,73,74,76,342,343,79,80,,,,,,81,337,345', +'111,110,112,113,,,243,,,,,,,338,,,115,114,116,105,64,107,106,108,,109', +'117,118,,101,102,,,346,,,,,,,,,,,,,,,,,,,,334,,,330,,,66,67,,,68,,,', +',,,,,,,,,,,,,,,,99,87,90,91,,92,94,93,95,,,,,88,98,,,,77,78,24,82,65', +'89,103,104,71,72,,,,75,,73,74,76,342,343,79,80,,,,,,81,337,345,111,110', +'112,113,,,243,,,,,,,338,,,115,114,116,105,64,107,106,108,,109,117,118', +',101,102,,,346,,,,,,,,,,,,,,,,,,,,334,,,242,,,66,67,,,68,,,583,,580', +'579,578,588,581,,,,,,,,,591,,99,87,90,91,,92,94,93,95,,,,,88,98,,,,544', +',586,82,,89,103,104,77,78,24,,65,599,598,,71,72,592,,,75,,73,74,76,342', +'343,79,80,,,,,,81,337,345,111,110,112,113,,,243,,,,,,,338,,,115,114', +'116,105,64,107,106,108,,109,117,118,,101,102,,,346,,,,,,,,,,,,,,,,,', +',,334,,,330,,,66,67,,,68,,329,,,,,,,,,,,,,,,,,,99,87,90,91,,92,94,93', +'95,,,,,88,98,,,,,,,82,,89,103,104,182,193,183,206,179,199,189,188,209', +'210,204,187,186,181,207,211,212,191,180,194,198,200,192,185,,,,201,208', +'203,202,195,205,190,178,197,196,,,,,,177,184,175,176,172,173,174,135', +'137,,,136,,,,,,,,166,167,,163,145,146,147,154,151,153,,,148,149,,,,168', +'169,155,156,,,,,,,,,,,,,,160,159,,144,165,162,161,170,157,158,152,150', +'142,164,143,,,171,99,,,,,,,,,,,,,,98,182,193,183,206,179,199,189,188', +'209,210,204,187,186,181,207,211,212,191,180,194,198,200,192,185,,,,201', +'208,203,202,195,205,190,178,197,196,,,,,,177,184,175,176,172,173,174', +'135,137,134,,136,,,,,,,,166,167,,163,145,146,147,154,151,153,,,148,149', +',,,168,169,155,156,,,,,,,,,,,,,,160,159,,144,165,162,161,170,157,158', +'152,150,142,164,143,,,171,99,,,,,,,,,,,,,,98,182,193,183,206,179,199', +'189,188,209,210,204,187,186,181,207,211,212,191,180,194,198,200,192', +'185,,,,201,208,203,202,195,205,190,178,197,196,,,,,,177,184,175,176', +'172,173,174,135,137,,,136,,,,,,,,166,167,,163,145,146,147,154,151,153', +',,148,149,,,,168,169,155,156,,,,,,,,,,,,,,160,159,,144,165,162,161,170', +'157,158,152,150,142,164,143,,,171,99,,,,,,,,,,,,,,98,182,193,183,206', +'179,199,189,188,209,210,204,187,186,181,207,211,212,191,180,194,198', +'200,192,185,,,,201,208,203,202,195,205,190,178,197,196,,,,,,177,184', +'175,176,172,173,174,135,137,,,136,,,,,,,,166,167,,163,145,146,147,154', +'151,153,,,148,149,,,,168,169,155,156,,,,,,,,,,,,,,160,159,,144,165,162', +'161,170,157,158,152,150,142,164,143,,,171,99,111,110,112,113,,,583,', +'580,579,578,588,581,98,,,115,114,116,720,,591,,723,986,,,,,101,102,', +',346,591,,,,,,,,,586,,,,,,,,,,722,599,598,704,,,592,702,,,703,,885,', +',,,,,592,,,,,,,721,,,,99,987,90,91,,92,94,93,95,,,,,88,98,111,110,112', +'113,,,82,,89,103,104,,,708,709,,115,114,116,720,,,583,723,580,579,578', +'588,581,101,102,,,346,,,,591,,,,,,,,,,,,,,,,722,,,704,,,586,702,,,703', +',,,,596,595,599,598,,,,592,,,,721,,,,99,87,90,91,,92,94,93,95,,,,,88', +'98,111,110,112,113,,,82,,89,103,104,,,708,709,,115,114,116,720,,,583', +'723,580,579,578,588,581,101,102,,,346,,,,591,,,,,,,,,,,,,,,,722,,,704', +',,586,702,,,703,,,,,596,595,599,598,,,,592,,,,721,,,,99,87,90,91,,92', +'94,93,95,,,,,88,98,,,,,,,82,,89,103,104,,,708,709,182,193,183,206,179', +'199,189,188,209,210,204,187,186,181,207,211,212,191,180,194,198,200', +'192,185,,,,201,208,203,202,195,205,190,178,197,196,,,,,,177,184,175', +'176,172,173,174,135,137,,,136,,,,,,,,166,167,,163,145,146,147,154,151', +'153,,,148,149,,,,168,169,155,156,,,,,,,,,,,,,,160,159,,144,165,162,161', +'170,157,158,152,150,142,164,143,,,171,111,110,112,113,,,583,,580,579', +'578,588,581,,,,115,114,116,720,,591,,723,,,,,,101,102,,,346,,,,,,,,', +',586,,,,,,,,,,722,599,598,704,,,592,702,,,703,,,,,,,,,,,,,,,,721,,,', +'99,87,90,91,,92,94,93,95,,,,,88,98,111,110,112,113,,,82,,89,103,104', +',,708,709,,115,114,116,720,,,583,723,580,579,578,588,581,101,102,,,346', +',,,591,,,,,,,,,,,,,,,,722,,,704,,,586,702,,,703,,885,,,596,595,599,598', +',,,592,,,,721,,,,99,87,90,91,,92,94,93,95,,,,,88,98,111,110,112,113', +',,82,,89,103,104,,,708,709,,115,114,116,720,,,583,723,580,579,578,588', +'581,101,102,,,346,,,,591,,,,,,,,,,,,,,,,722,,,704,,,586,702,,,703,,', +',,596,595,599,598,,,,592,,,,721,,,,99,87,90,91,,92,94,93,95,,,,,88,98', +'111,110,112,113,,,82,,89,103,104,,,708,709,,115,114,116,720,,,583,723', +'580,579,578,588,581,101,102,,,346,,,,591,,,,,,,,,,,,,,,,722,,,704,,', +'586,702,,,703,,885,,,,,599,598,,,,592,,,,721,,,,99,87,90,91,,92,94,93', +'95,,,,,88,98,111,110,112,113,,,82,,89,103,104,,,708,709,,115,114,116', +'720,,,583,723,580,579,578,588,581,101,102,,,346,,,,591,,,,,,,,,,,,,', +',,722,,,704,,,586,702,,,703,,,,,,,599,598,,,,592,,,,721,,,,99,87,90', +'91,,92,94,93,95,,,,,88,98,111,110,112,113,,,82,,89,103,104,,,708,709', +',115,114,116,720,,,583,723,580,579,578,588,581,101,102,,,346,,,,591', +',,,,,,,,,,,,,,,722,,,704,,,586,702,,,703,,,,,,,599,598,,,,592,,,,721', +',,,99,87,90,91,,92,94,93,95,,,,,88,98,111,110,112,113,,,82,,89,103,104', +',,708,709,,115,114,116,720,,,583,723,580,579,578,588,581,101,102,,,346', +',,,591,,,,,,,,,,,,,,,,722,,,704,,,586,702,,,703,,999,,,,,599,598,,,', +'592,,,,721,,,,99,87,90,91,,92,94,93,95,,,,,88,98,111,110,112,113,,,82', +',89,103,104,,,708,709,,115,114,116,720,,,583,723,580,579,578,588,581', +'101,102,,,346,,,,591,,,,,,,,,,,,,,,,722,,,704,,,586,702,,,703,,,,,596', +'595,599,598,,,,592,,,,721,,,,99,87,90,91,,92,94,93,95,,,,,88,98,111', +'110,112,113,,,82,,89,103,104,,,708,709,,115,114,116,720,,,,723,986,', +',,,101,102,,,346,591,,,,,,,,,,,,,,,,,,,722,,,704,,,,702,,,703,,885,', +',,,,,592,,,,,,,721,,,,99,987,90,91,,92,94,93,95,,,,,88,98,111,110,112', +'113,,,82,,89,103,104,,,708,709,,115,114,116,720,,,583,723,580,579,578', +'588,581,101,102,,,346,,,,591,,,,,,,,,,,,,,,,722,,,704,,,586,702,,,703', +',,,,,,599,598,,,,592,,,,721,,,,99,87,90,91,,92,94,93,95,,,,,88,98,111', +'110,112,113,,,82,,89,103,104,,,708,709,,115,114,116,720,,,583,723,580', +'579,578,588,581,101,102,,,346,,,,591,,,,,,,,,,,,,,,,722,,,704,,,586', +'702,,,703,,,,,,,599,598,,,,592,,,,721,,,,99,87,90,91,,92,94,93,95,,', +',,88,98,111,110,112,113,,,82,,89,103,104,,,708,709,,115,114,116,720', +',,583,723,580,579,578,588,581,101,102,,,346,,,,591,,,,,,,,,,,,,,,,722', +',,704,,,586,702,,,703,,885,,,596,595,599,598,,,,592,,,,721,,,,99,87', +'90,91,,92,94,93,95,,,,,88,98,231,111,110,112,113,,82,,89,103,104,,,708', +'709,,,115,114,116,720,,,,723,986,,,,,101,102,,,346,591,,,,,,,,,,,,,', +',,,,,722,,,704,,,,702,,,703,,885,,,,,,,592,,,,,,,721,,,,99,987,90,91', +',92,94,93,95,,,,,88,98,,,,,,,82,,89,103,104,,,708,709,182,193,183,206', +'179,199,189,188,209,210,204,187,186,181,207,211,212,191,180,194,198', +'200,192,185,,,,201,208,203,282,281,283,280,178,197,196,,,,,,177,184', +'175,176,277,278,279,275,137,107,106,276,,109,,,,,,166,167,,163,145,146', +'147,154,151,153,,,148,149,,,,168,169,155,156,,,,,,287,,,,,,,,160,159', +',144,165,162,161,170,157,158,152,150,142,164,143,,,171,111,110,112,113', +',,,583,,580,579,578,588,581,,,115,114,116,,,,591,,,,,,,101,102,,,346', +'111,110,112,113,,,,,,,586,642,,,,,115,114,116,596,595,599,598,,,,592', +',,101,102,,,346,,,,,,,,,,,,,,,,99,87,90,91,,92,94,93,95,,,,,88,98,,', +',,,,82,,89,103,104,,,,,,,,,99,87,90,91,,92,94,93,95,,,,,88,98,111,110', +'112,113,,,82,,89,103,104,,,,,,115,114,116,1195,469,,,1196,,,,,,101,102', +'166,167,346,163,145,146,147,154,151,153,,,148,149,,,,168,169,155,156', +',,,,,294,,,,,,,,160,159,,144,165,162,161,170,157,158,152,150,142,164', +'143,,,171,99,87,90,91,,92,94,93,95,,,,,88,98,846,462,,,847,,82,,89,103', +'104,,166,167,,163,145,146,147,154,151,153,,,148,149,,,,168,169,155,156', +',,,,,294,,,,,,,,160,159,,144,165,162,161,170,157,158,152,150,142,164', +'143,512,462,171,,513,,,,,,,,166,167,,163,145,146,147,154,151,153,,,148', +'149,,,,168,169,155,156,,,,,,294,,,,,,,,160,159,,144,165,162,161,170', +'157,158,152,150,142,164,143,693,469,171,,694,,,,,,,,166,167,,163,145', +'146,147,154,151,153,,,148,149,,,,168,169,155,156,,,,,,294,,,,,,,,160', +'159,,144,165,162,161,170,157,158,152,150,142,164,143,819,469,171,,820', +',,,,,,,166,167,,163,145,146,147,154,151,153,,,148,149,,,,168,169,155', +'156,,,,,,294,,,,,,,,160,159,,144,165,162,161,170,157,158,152,150,142', +'164,143,691,462,171,,692,,,,,,,,166,167,,163,145,146,147,154,151,153', +',,148,149,,,,168,169,155,156,,,,,,294,,,,,,,,160,159,,144,165,162,161', +'170,157,158,152,150,142,164,143,693,469,171,,694,,,,,,,,166,167,,163', +'145,146,147,154,151,153,,,148,149,,,,168,169,155,156,,,,,,294,,,,,,', +',160,159,,144,165,162,161,170,157,158,152,150,142,164,143,755,469,171', +',756,,,,,,,,166,167,,163,145,146,147,154,151,153,,,148,149,,,,168,169', +'155,156,,,,,,294,,,,,,,,160,159,,144,165,162,161,170,157,158,152,150', +'142,164,143,816,469,171,,817,,,,,,,,166,167,,163,145,146,147,154,151', +'153,,,148,149,,,,168,169,155,156,,,,,,294,,,,,,,,160,159,,144,165,162', +'161,170,157,158,152,150,142,164,143,512,462,171,,513,,,,,,,,166,167', +',163,145,146,147,154,151,153,,,148,149,,,,168,169,155,156,,,,,,,,,,', +',,,160,159,,144,165,162,161,170,157,158,152,150,142,164,143,465,469', +'171,,464,,,,,,,,166,167,,163,145,146,147,154,151,153,,,148,149,,,,168', +'169,155,156,,,,,,294,,,,,,,,160,159,,144,165,162,161,170,157,158,152', +'150,142,164,143,814,462,171,,815,,,,,,,,166,167,,163,145,146,147,154', +'151,153,,,148,149,,,,168,169,155,156,,,,,,294,,,,,,,,160,159,,144,165', +'162,161,170,157,158,152,150,142,164,143,691,462,171,,692,,,,,,,,166', +'167,,163,145,146,147,154,151,153,,,148,149,,,,168,169,155,156,,,,,,294', +',,,,,,,160,159,,144,165,162,161,170,157,158,152,150,142,164,143,752', +'462,171,,753,,,,,,,,166,167,,163,145,146,147,154,151,153,,,148,149,', +',,168,169,155,156,,,,,,294,,,,,,,,160,159,,144,165,162,161,170,157,158', +'152,150,142,164,143,1190,469,171,,1189,,,,,,,,166,167,,163,145,146,147', +'154,151,153,,,148,149,,,,168,169,155,156,,,,,,294,,,,,,,,160,159,,144', +'165,162,161,170,157,158,152,150,142,164,143,1193,462,171,,1194,,,,,', +',,166,167,,163,145,146,147,154,151,153,,,148,149,,,,168,169,155,156', +',,,,,294,,,,,,,,160,159,,144,165,162,161,170,157,158,152,150,142,164', +'143,849,469,171,,848,,,,,,,,166,167,,163,145,146,147,154,151,153,,,148', +'149,,,,168,169,155,156,,,,,,294,,,,,,,,160,159,,144,165,162,161,170', +'157,158,152,150,142,164,143,458,462,171,,459,,,,,,,,166,167,,163,145', +'146,147,154,151,153,,,148,149,,,,168,169,155,156,,,,,,294,,,,,,,,160', +'159,,144,165,162,161,170,157,158,152,150,142,164,143,,,171' ] + racc_action_table = arr = ::Array.new(28164, nil) + idx = 0 + clist.each do |str| + str.split(',', -1).each do |i| + arr[idx] = i.to_i unless i.empty? + idx += 1 + end + end + +clist = [ +'465,380,1194,1193,730,1112,827,465,465,465,69,1196,877,465,465,988,465', +'999,1158,411,1206,1006,509,509,465,465,379,281,620,340,29,339,703,988', +'281,412,465,465,1032,465,465,465,465,465,593,282,474,474,21,703,1054', +'1108,282,624,1052,480,762,762,877,826,639,639,593,869,1006,812,465,465', +'465,465,465,465,465,465,465,465,465,465,465,465,1195,1109,465,465,465', +'411,465,465,1196,21,465,730,281,465,29,339,623,69,465,999,465,412,465', +'465,623,465,465,465,465,465,282,465,465,465,480,827,509,29,339,380,1194', +'1193,869,1112,380,1194,1193,465,1112,1196,465,465,620,465,1196,465,1158', +'620,1206,693,474,1158,465,1206,379,465,693,693,693,379,762,693,693,693', +'639,693,1032,1195,747,639,234,1032,828,693,693,693,693,693,1054,1108', +'747,622,1052,1054,1108,693,693,1052,693,693,693,693,693,812,350,843', +'812,872,812,46,46,1061,3,1061,235,237,1088,3,1195,1109,847,346,346,1195', +'1109,693,693,693,693,693,693,693,693,693,693,693,693,693,693,234,243', +'693,693,693,846,693,693,872,692,693,532,350,693,693,654,693,656,693', +'406,693,845,693,693,350,693,693,693,693,693,848,693,693,693,235,237', +'691,848,848,848,847,1088,1088,848,848,621,848,693,46,46,693,693,693', +'693,848,693,283,693,1088,914,346,346,693,283,846,693,848,848,692,848', +'848,848,848,848,873,532,532,532,341,654,654,656,656,406,406,406,970', +'239,1076,654,722,656,532,238,722,691,848,848,848,848,848,848,848,848', +'848,848,848,848,848,848,873,914,848,848,848,19,848,848,914,1199,848', +'283,409,848,438,1056,617,914,848,1199,848,438,848,848,408,848,848,848', +'848,848,438,848,849,848,459,970,914,439,345,849,849,849,1076,1076,1076', +'849,849,848,849,701,848,848,19,848,701,848,849,849,701,1076,854,1056', +'848,876,19,848,914,876,849,849,236,849,849,849,849,849,409,409,409,438', +'362,459,362,362,362,362,362,27,408,408,408,347,384,459,27,362,439,384', +'849,849,849,849,849,849,849,849,849,849,849,849,849,849,607,458,849', +'849,849,362,849,849,397,606,849,410,397,849,362,362,362,362,849,413', +'849,362,849,849,407,849,849,849,849,849,105,849,849,849,676,41,960,105', +'105,105,27,960,105,105,105,274,105,849,458,605,849,849,274,849,105,849', +'105,105,105,319,458,362,849,601,319,849,105,105,601,105,105,105,105', +'105,870,410,410,410,604,756,275,676,41,413,413,413,756,275,407,407,407', +'756,602,676,41,756,105,105,105,105,105,105,105,105,105,105,105,105,105', +'105,274,276,105,105,105,817,105,105,276,600,105,878,817,105,105,879', +'105,817,105,597,105,817,105,105,883,105,105,105,105,105,277,105,108', +'105,756,275,884,277,885,108,108,108,49,49,108,108,108,105,108,888,105', +'105,105,105,585,105,108,105,108,108,108,817,105,575,370,105,276,370', +'108,108,817,108,108,108,108,108,886,387,49,49,574,1151,278,279,387,280', +'886,572,1151,278,279,799,280,387,799,277,900,1151,108,108,108,108,108', +'108,108,108,108,108,108,108,108,108,903,18,108,108,108,904,108,108,18', +'571,108,570,886,108,108,913,108,18,108,569,108,387,108,108,886,108,108', +'108,108,108,387,108,694,108,1151,278,279,42,280,694,694,694,85,213,694', +'694,694,108,694,918,108,108,108,108,85,108,694,108,694,694,694,921,108', +'922,85,108,18,371,694,694,371,694,694,694,694,694,925,134,927,1110,928', +'1104,134,134,42,930,1110,586,1104,586,586,586,932,586,934,1110,42,1104', +'694,694,694,694,694,694,694,694,694,694,694,694,694,694,935,1074,694', +'694,694,1131,694,694,1131,937,694,1074,586,694,694,940,694,568,694,119', +'694,586,694,694,947,694,694,694,694,694,464,694,1110,694,1104,1055,1055', +'464,464,464,774,774,374,464,464,374,464,694,950,1074,694,694,694,694', +'464,694,565,694,800,800,564,1074,694,1165,1165,694,464,464,354,464,464', +'464,464,464,705,705,15,15,768,389,768,768,768,768,768,1118,389,1118', +'1118,1118,1217,1118,957,768,959,389,464,464,464,464,464,464,464,464', +'464,464,464,464,464,464,377,377,464,464,464,768,464,464,53,966,464,967', +'1118,464,768,768,768,768,464,968,464,768,464,464,969,464,464,464,464', +'464,1091,464,356,464,389,52,399,51,979,980,1091,549,54,399,981,982,554', +'464,549,54,464,464,399,464,991,464,351,549,54,992,993,768,464,351,997', +'464,330,330,330,330,330,330,351,1091,1091,330,330,998,1091,360,330,752', +'330,330,330,330,330,330,330,537,537,537,537,537,330,330,330,330,330', +'330,330,399,550,330,1003,545,549,54,1013,330,330,330,330,330,330,330', +'330,330,330,330,330,351,330,330,330,233,330,330,330,330,330,632,233', +'752,1014,388,1016,1017,632,1018,752,233,388,1020,1021,752,1022,632,543', +'752,330,388,540,330,43,539,330,330,820,364,330,368,330,1048,1049,820', +'330,523,752,40,820,519,647,647,820,330,647,647,647,518,330,330,330,330', +'1065,330,330,330,330,517,233,388,25,330,330,1075,632,372,752,1083,388', +'330,1085,330,330,330,492,1102,330,330,955,955,955,955,955,955,491,490', +'1105,955,955,489,1111,820,955,395,955,955,955,955,955,955,955,6,6,6', +'6,6,955,955,955,955,955,955,955,373,781,955,781,781,781,1114,781,955', +'955,955,955,955,955,955,955,955,955,955,955,1115,955,955,955,335,955', +'955,955,955,955,333,335,395,1116,391,1117,17,333,781,395,335,391,16', +'1129,395,1130,333,781,395,955,391,375,955,1139,1141,955,955,332,1144', +'955,1145,955,1146,1147,332,955,1149,395,476,487,1154,14,466,332,955', +'385,13,386,1164,955,955,955,955,12,955,955,955,955,1170,335,391,1175', +'955,955,457,333,456,395,454,391,955,487,955,955,955,487,487,955,955', +'382,382,382,382,382,382,440,436,1189,382,382,1190,1192,332,382,396,382', +'382,382,382,382,382,382,322,322,322,322,322,382,382,382,382,382,382', +'382,10,941,382,941,941,941,7,941,382,382,382,382,382,382,382,382,382', +'382,382,382,771,382,382,382,331,382,382,382,382,382,771,331,396,1197', +'629,433,392,431,941,396,331,629,430,401,396,390,428,941,396,382,629', +'422,382,698,721,382,382,724,696,382,727,382,729,771,771,382,695,396', +'771,488,307,735,736,737,382,739,741,293,308,382,382,382,382,687,382', +'382,382,382,749,331,629,751,382,382,311,1202,754,396,1203,629,382,488', +'382,382,382,488,488,382,382,1107,1107,1107,1107,1107,1107,757,758,682', +'1107,1107,761,323,764,1107,753,1107,1107,1107,1107,1107,1107,1107,367', +'367,367,367,367,1107,1107,1107,1107,1107,1107,1107,324,502,1107,326', +'677,327,328,668,1107,1107,1107,1107,1107,1107,1107,1107,1107,1107,1107', +'1107,334,1107,1107,1107,783,1107,1107,1107,1107,1107,784,786,753,502', +'661,659,503,502,502,753,502,502,802,808,753,809,651,813,753,1107,1204', +'1205,1107,1,337,1107,1107,1211,338,1107,785,1107,785,785,785,1107,785', +'753,503,822,,,503,503,1107,503,503,,,1107,1107,1107,1107,,1107,1107', +'1107,1107,,,,,1107,1107,,,,753,,,1107,,1107,1107,1107,,,1107,1107,325', +'325,325,325,325,325,,,,325,325,,,,325,755,325,325,325,325,325,325,325', +',,,,,325,325,325,325,325,325,325,,942,325,942,942,942,,942,325,325,325', +'325,325,325,325,325,325,325,325,325,,325,325,325,,325,325,325,325,325', +',1119,755,1119,1119,1119,,1119,942,755,,,,,755,,,,755,325,,,325,,,325', +'325,,,325,1068,325,1068,1068,1068,325,1068,755,1119,1174,,1174,1174', +'1174,325,1174,,,,325,325,325,325,,325,325,325,325,,,,,325,325,,,,755', +',,325,,325,325,325,,,325,325,1067,1067,1067,1067,1067,1067,,,,1067,1067', +',,,1067,814,1067,1067,1067,1067,1067,1067,1067,,,,,,1067,1067,1067,1067', +'1067,1067,1067,,,1067,,,,,,1067,1067,1067,1067,1067,1067,1067,1067,1067', +'1067,1067,1067,,1067,1067,1067,,1067,1067,1067,1067,1067,,,814,,,,,', +',814,,,,,814,,,,814,1067,,,1067,,,1067,1067,,,1067,,1067,,,,1067,,814', +',,,,,,1067,,,,,1067,1067,1067,1067,,1067,1067,1067,1067,814,,,,1067', +'1067,,,,814,,,1067,,1067,1067,1067,,,1067,1067,1066,1066,1066,1066,1066', +'1066,,,,1066,1066,,,,1066,815,1066,1066,1066,1066,1066,1066,1066,,,', +',,1066,1066,1066,1066,1066,1066,1066,,,1066,,,,,,1066,1066,1066,1066', +'1066,1066,1066,1066,1066,1066,1066,1066,,1066,1066,1066,,1066,1066,1066', +'1066,1066,,,815,,,,,,,815,,,,,815,,,,815,1066,,,1066,,,1066,1066,,,1066', +',1066,,,,1066,,815,,,,,,,1066,,,,,1066,1066,1066,1066,,1066,1066,1066', +'1066,815,,,,1066,1066,,,,815,,,1066,,1066,1066,1066,,,1066,1066,823', +'823,823,823,823,823,,,,823,823,,,,823,816,823,823,823,823,823,823,823', +',,,,,823,823,823,823,823,823,823,,,823,,,,,,823,823,823,823,823,823', +'823,823,823,823,823,823,,823,823,823,,823,823,823,823,823,,,816,,,,', +',,816,,,,,816,,,,816,823,,,823,,,823,823,,,823,,823,,,,823,,816,,,,', +',,823,,,,,823,823,823,823,,823,823,823,823,816,,,,823,823,,,,816,,,823', +',823,823,823,,,823,823,366,366,366,366,366,366,,,,366,366,,,,366,819', +'366,366,366,366,366,366,366,,,,,,366,366,366,366,366,366,366,,,366,', +',,,,366,366,366,366,366,366,366,366,366,366,366,366,,366,366,366,,366', +'366,366,366,366,,,819,,,,,,,819,,,,,819,,,,819,366,,,366,,,366,366,', +',366,,366,,,,366,,819,,,,,,,366,,,,,366,366,366,366,,366,366,366,366', +',,,,366,366,,,,819,,,366,,366,366,366,,,366,366,365,365,365,365,365', +'365,,,,365,365,,,,365,956,365,365,365,365,365,365,365,,,,,,365,365,365', +'365,365,365,365,,,365,,,,,,365,365,365,365,365,365,365,365,365,365,365', +'365,,365,365,365,,365,365,365,365,365,,,956,,,,,,,956,,,,,,,,,956,365', +',,365,,,365,365,,,365,,365,,,,365,,956,,,,,,,365,,,,,365,365,365,365', +',365,365,365,365,956,,,,365,365,,,,956,,,365,,365,365,365,,,365,365', +'132,132,132,132,132,132,,,,132,132,,,,132,,132,132,132,132,132,132,132', +'23,,,,,132,132,132,132,132,132,132,,,132,,,,,,132,132,132,132,132,132', +'132,132,132,132,132,132,,132,132,132,,132,132,132,132,132,23,23,23,23', +'23,23,23,23,23,23,23,,23,23,,,23,23,,132,,23,132,,,132,132,,,132,,132', +'23,,23,132,23,23,,23,23,23,23,23,132,23,,,,132,132,132,132,,132,132', +'132,132,,,,,132,132,,23,,,,,132,,132,132,132,,,132,132,920,920,920,920', +'920,920,,,,920,920,,,,920,,920,920,920,920,920,920,920,378,,,,,920,920', +'920,920,920,920,920,,,920,,,,,,920,920,920,920,920,920,920,920,920,920', +'920,920,,920,920,920,,920,920,920,920,920,378,378,378,378,378,378,378', +'378,378,378,378,,378,378,,,378,378,,920,,,920,,,920,920,,,920,,920,378', +',378,920,378,378,,378,378,378,378,378,920,378,,,,920,920,920,920,,920', +'920,920,920,,,,,920,920,,378,,,,,920,,920,920,920,,,920,920,908,908', +'908,908,908,908,,,,908,908,,,,908,,908,908,908,908,908,908,908,,,,,', +'908,908,908,908,908,908,908,,,908,,,,,443,908,908,908,908,908,908,908', +'908,908,908,908,908,,908,908,908,,908,908,908,908,908,443,443,443,443', +'443,443,443,443,443,443,443,,443,443,,,443,443,,908,,,908,,,908,908', +',,908,,908,443,,443,908,443,443,,443,443,443,443,443,908,443,,,,908', +'908,908,908,,908,908,908,908,,,,,908,908,,443,,443,,,908,,908,908,908', +',,908,908,361,361,361,361,361,361,,,,361,361,,,,361,,361,361,361,361', +'361,361,361,,,,,,361,361,361,361,361,361,361,,,361,,,,,453,361,361,361', +'361,361,361,361,361,361,361,361,361,,361,361,361,,361,361,361,361,361', +'453,453,453,453,453,453,453,453,453,453,453,,453,453,,,453,453,,361', +',,361,,,361,361,,,361,,361,453,,453,361,453,453,,453,453,453,453,453', +'361,453,,,,361,361,361,361,,361,361,361,361,,,,,361,361,,453,,,,,361', +',361,361,361,,,361,361,834,834,834,834,834,834,,,,834,834,,,,834,,834', +'834,834,834,834,834,834,,,,,,834,834,834,834,834,834,834,,,834,,,,,763', +'834,834,834,834,834,834,834,834,834,834,834,834,,834,834,834,,834,834', +'834,834,834,763,763,763,763,763,763,763,763,763,763,763,,763,763,,,763', +'763,,834,,,834,,,834,834,,,834,,834,763,,763,834,763,763,,763,763,763', +'763,763,834,763,,,,834,834,834,834,,834,834,834,834,,,,,834,834,,763', +',,,,834,,834,834,834,,,834,834,215,215,215,215,215,215,,,,215,215,,', +',215,,215,215,215,215,215,215,215,,,,,,215,215,215,215,215,215,215,', +',215,,,,,794,215,215,215,215,215,215,215,215,215,215,215,215,,215,215', +'215,,215,215,215,215,215,794,794,794,794,794,794,794,794,794,794,794', +',794,794,,,794,794,,215,,,215,,,215,215,,,215,,215,794,,794,215,794', +'794,,794,794,794,794,794,215,794,,,,215,215,215,215,,215,215,215,215', +',,,,215,215,,794,,,,,215,,215,215,215,,,215,215,1166,1166,1166,1166', +'1166,1166,,,,1166,1166,,,,1166,,1166,1166,1166,1166,1166,1166,1166,', +',,,,1166,1166,1166,1166,1166,1166,1166,,,1166,,,,,,1166,1166,1166,1166', +'1166,1166,1166,1166,1166,1166,1166,1166,,1166,1166,1166,,1166,1166,1166', +'1166,1166,305,305,305,305,305,305,305,305,305,305,305,,305,305,,,305', +'305,,1166,,,1166,,,1166,1166,,,1166,,1166,305,,305,1166,305,305,,305', +'305,305,305,305,1166,305,,,,1166,1166,1166,1166,,1166,1166,1166,1166', +',,,,1166,1166,,305,,,,,1166,,1166,1166,1166,,,1166,1166,616,616,616', +'616,616,616,,,,616,616,,,,616,,616,616,616,616,616,616,616,,,,,,616', +'616,616,616,616,616,616,,,616,,,,,,616,616,616,616,616,616,616,616,616', +'616,616,616,,616,616,616,,616,616,616,616,616,506,506,506,506,506,506', +'506,506,506,506,506,,506,506,,,506,506,,616,,,616,,,616,616,,,616,,616', +'506,,506,616,506,506,,506,506,506,506,506,616,506,,,,616,616,616,616', +',616,616,616,616,,,,,616,616,506,506,,,,,616,,616,616,616,,,616,616', +'36,36,36,36,36,36,,,,36,36,,,,36,,36,36,36,36,36,36,36,,,,,,36,36,36', +'36,36,36,36,,,36,,,,,,36,36,36,36,36,36,36,36,36,36,36,36,,36,36,36', +',36,36,36,36,36,1050,1050,1050,1050,1050,1050,1050,1050,1050,1050,1050', +',1050,1050,,,1050,1050,,36,,,36,,,36,36,,,36,,36,1050,,1050,36,1050', +'1050,,1050,1050,1050,1050,1050,36,1050,,,,36,36,36,36,,36,36,36,36,', +',,,36,36,,1050,,,,,36,,36,36,36,,,36,36,1029,1029,1029,1029,1029,1029', +',,,1029,1029,,,,1029,,1029,1029,1029,1029,1029,1029,1029,,,,,,1029,1029', +'1029,1029,1029,1029,1029,,,1029,,,,,,1029,1029,1029,1029,1029,1029,1029', +'1029,1029,1029,1029,1029,,1029,1029,1029,,1029,1029,1029,1029,1029,1027', +'1027,1027,1027,1027,1027,1027,1027,1027,1027,1027,,1027,1027,,,1027', +'1027,,1029,,,1029,,,1029,1029,,,1029,,1029,1027,,1027,1029,1027,1027', +',1027,1027,1027,1027,1027,1029,1027,,,,1029,1029,1029,1029,,1029,1029', +'1029,1029,,,,,1029,1029,,1027,,,,,1029,,1029,1029,1029,,,1029,1029,0', +'0,0,0,0,0,,,,0,0,,,,0,,0,0,0,0,0,0,0,,,,,,0,0,0,0,0,0,0,,,0,,,,,,0,0', +'0,0,0,0,0,0,0,0,0,0,,0,0,0,,0,0,0,0,0,1009,1009,1009,1009,1009,1009', +'1009,1009,1009,1009,1009,,1009,1009,,,1009,1009,,0,,,0,,,0,0,,,0,,0', +'1009,,1009,0,1009,1009,,1009,1009,1009,1009,1009,0,1009,,,,0,0,0,0,', +'0,0,0,0,,,,,0,0,,1009,,,,,0,,0,0,0,,,0,0,818,818,818,818,818,818,,,', +'818,818,,,,818,,818,818,818,818,818,818,818,,,,,,818,818,818,818,818', +'818,818,,,818,,,,,,818,818,818,818,818,818,818,818,818,818,818,818,', +'818,818,818,,818,818,818,818,818,561,561,561,561,561,561,561,561,561', +'561,561,,561,561,,,561,561,,818,,,818,,,818,818,,,818,,818,561,,561', +'818,561,561,,561,561,561,561,561,818,561,,,,818,818,818,818,,818,818', +'818,818,,,,,818,818,,561,,,,,818,,818,818,818,,,818,818,242,242,242', +'242,242,242,,,,242,242,,,,242,,242,242,242,242,242,242,242,,,,,,242', +'242,242,242,242,242,242,,,242,,,,,,242,242,242,242,242,242,242,242,242', +'242,242,242,,242,242,242,,242,242,242,242,242,851,851,851,851,851,851', +'851,851,851,851,851,,851,851,,,851,851,,242,,,242,,,242,242,,,242,,242', +'851,,851,242,851,851,,851,851,851,851,851,242,851,,,,242,242,242,242', +',242,242,242,242,,,,,242,242,,851,,,,,242,,242,242,242,,,242,242,383', +'383,383,383,383,383,,,,383,383,,,,383,,383,383,383,383,383,383,383,', +',,,,383,383,383,383,383,383,383,,,383,,,,,,383,383,383,383,383,383,383', +'383,383,383,383,383,,383,383,383,,383,383,383,383,383,500,500,500,500', +'500,500,500,,,500,500,,,,,,500,500,,383,,,383,,,383,383,,,383,,383,500', +',500,383,500,500,,500,500,500,500,500,383,500,,,,383,383,383,383,,383', +'383,383,383,,,,,383,383,,,,,,,383,,383,383,383,,,383,383,1120,1120,1120', +'1120,1120,1120,,,,1120,1120,,,,1120,,1120,1120,1120,1120,1120,1120,1120', +',,,,,1120,1120,1120,1120,1120,1120,1120,,,1120,,,,,,1120,1120,1120,1120', +'1120,1120,1120,1120,1120,1120,1120,1120,,1120,1120,1120,,1120,1120,1120', +'1120,1120,485,485,485,485,485,485,485,485,485,485,485,,485,485,,,485', +'485,,1120,,,1120,,,1120,1120,,,1120,,1120,485,,485,1120,485,485,,485', +'485,485,485,485,1120,485,,,,1120,1120,1120,1120,,1120,1120,1120,1120', +',,,,1120,1120,,,,,,,1120,,1120,1120,1120,,,1120,1120,1010,1010,1010', +'1010,1010,1010,,,,1010,1010,,,,1010,,1010,1010,1010,1010,1010,1010,1010', +',,,,,1010,1010,1010,1010,1010,1010,1010,,,1010,,,,,,1010,1010,1010,1010', +'1010,1010,1010,1010,1010,1010,1010,1010,,1010,1010,1010,,1010,1010,1010', +'1010,1010,486,486,486,486,486,486,486,486,486,486,486,,486,486,,,486', +'486,,1010,,,1010,,,1010,1010,,,1010,,1010,486,,486,1010,486,486,,486', +'486,486,486,486,1010,486,,,,1010,1010,1010,1010,,1010,1010,1010,1010', +',,,,1010,1010,,,,,,,1010,,1010,1010,1010,,,1010,1010,619,619,619,619', +'619,619,,,,619,619,,,,619,,619,619,619,619,619,619,619,,,,,,619,619', +'619,619,619,619,619,,,619,,,,,,619,619,619,619,619,619,619,619,619,619', +'619,619,,619,619,619,,619,619,619,619,619,496,496,496,496,496,496,496', +',,496,496,,,,,,496,496,,619,,,619,,,619,619,,,619,,619,496,,496,619', +'496,496,,496,496,496,496,496,619,496,,,,619,619,619,619,,619,619,619', +'619,,,,,619,619,,,,,,,619,,619,619,619,,,619,619,640,640,640,640,640', +'640,,,,640,640,,,,640,,640,640,640,640,640,640,640,,,,,,640,640,640', +'640,640,640,640,,,640,,,,,,640,640,640,640,640,640,640,640,640,640,640', +'640,,640,640,640,,640,640,640,640,640,497,497,497,497,497,497,497,,', +'497,497,,,,,,497,497,,640,,,640,,,640,640,,,640,,640,497,,497,640,497', +'497,,497,497,497,497,497,640,497,,,,640,640,640,640,,640,640,640,640', +',,,,640,640,,,,,,,640,,640,640,640,,,640,640,961,961,961,961,961,961', +',,,961,961,,,,961,,961,961,961,961,961,961,961,,,,,,961,961,961,961', +'961,961,961,,,961,,,,,,961,961,961,961,961,961,961,961,961,961,961,961', +',961,961,961,,961,961,961,961,961,498,498,498,498,498,498,498,,,498', +'498,,,,,,498,498,,961,,,961,,,961,961,,,961,,961,498,,498,961,498,498', +',498,498,498,498,498,961,498,,,,961,961,961,961,,961,961,961,961,,,', +',961,961,,,,546,546,546,961,546,961,961,961,546,546,961,961,,546,,546', +'546,546,546,546,546,546,,,,,,546,546,546,546,546,546,546,,,546,,,,,', +',546,,,546,546,546,546,546,546,546,546,546,546,546,546,,546,546,546', +'546,546,499,499,499,499,499,499,499,,,499,499,,,,,,499,499,,546,,,546', +',,546,546,,,546,,546,499,546,499,546,499,499,546,499,499,499,499,499', +'546,499,,,,546,546,546,546,,546,546,546,546,,,,,546,546,,,,,,,546,,546', +'546,546,,,546,546,5,5,5,5,5,,,,5,5,,,,5,,5,5,5,5,5,5,5,,,,,,5,5,5,5', +'5,5,5,,,5,,,,,,5,5,5,5,5,5,5,5,5,5,5,5,,5,5,5,,5,5,5,5,5,501,501,501', +'501,501,501,501,,,501,501,,,,,,501,501,,5,,,5,,,5,5,,,5,,5,501,,501', +'5,501,501,,501,501,501,501,501,5,501,,,,5,5,5,5,,5,5,5,5,,,,,5,5,,,', +'1155,1155,1155,5,1155,5,5,5,1155,1155,5,5,,1155,,1155,1155,1155,1155', +'1155,1155,1155,,,,,,1155,1155,1155,1155,1155,1155,1155,,,1155,,,,,,', +'1155,,,1155,1155,1155,1155,1155,1155,1155,1155,1155,1155,1155,1155,', +'1155,1155,1155,1155,1155,504,504,504,504,504,504,504,,,504,504,,,,,', +'504,504,,1155,,,1155,,,1155,1155,,,1155,,1155,504,1155,504,1155,504', +'504,1155,504,504,504,504,504,1155,504,,,,1155,1155,1155,1155,,1155,1155', +'1155,1155,,,,,1155,1155,,,,1123,1123,1123,1155,1123,1155,1155,1155,1123', +'1123,1155,1155,,1123,,1123,1123,1123,1123,1123,1123,1123,,,,,,1123,1123', +'1123,1123,1123,1123,1123,,,1123,,,,,,,1123,,,1123,1123,1123,1123,1123', +'1123,1123,1123,,1123,1123,1123,,1123,1123,1123,1123,1123,505,505,505', +'505,505,505,505,505,,505,505,,,,,,505,505,,1123,,,1123,,,1123,1123,', +',1123,,,505,,505,1123,505,505,,505,505,505,505,505,1123,505,,,,1123', +'1123,1123,1123,,1123,1123,1123,1123,,,,,1123,1123,,,,1122,1122,1122', +'1123,1122,1123,1123,1123,1122,1122,1123,1123,,1122,,1122,1122,1122,1122', +'1122,1122,1122,,,,,,1122,1122,1122,1122,1122,1122,1122,,,1122,,,,,,', +'1122,,,1122,1122,1122,1122,1122,1122,1122,1122,,1122,1122,1122,,1122', +'1122,1122,1122,1122,507,,,,,,,,,,,,,,,,507,507,,1122,,,1122,,,1122,1122', +',,1122,,,507,,507,1122,507,507,,507,507,,,507,1122,507,,,,1122,1122', +'1122,1122,,1122,1122,1122,1122,,,,,1122,1122,,,,22,22,22,1122,22,1122', +'1122,1122,22,22,1122,1122,,22,,22,22,22,22,22,22,22,,,,,,22,22,22,22', +'22,22,22,,,22,,,,,,,22,,,22,22,22,22,22,22,22,22,,22,22,22,,22,22,22', +'22,22,560,,,,,,,,,,,,,,,,560,560,,22,,,22,,,22,22,,,22,,,560,,560,22', +'560,560,,560,560,,,560,22,560,,,,22,22,22,22,,22,22,22,22,,,,,22,22', +',,,,,,22,,22,22,22,30,,22,22,,,,30,30,30,,,30,30,30,494,30,,,,,,,,30', +'30,30,30,,,,494,494,,,,30,30,,30,30,30,30,30,,,,494,,494,,494,494,,494', +'494,,,,,,,,,,,30,30,30,30,30,30,30,30,30,30,30,30,30,30,,,30,30,30,', +',30,,30,30,,,30,30,,30,,30,,30,,30,30,,30,30,30,30,30,31,30,30,30,,', +',31,31,31,,,31,31,31,,31,30,495,,30,30,,30,31,30,31,31,,,,,30,,495,495', +'31,31,,31,31,31,31,31,,,,,,,495,,,,495,495,,495,495,,,,,,,,31,31,31', +'31,31,31,31,31,31,31,31,31,31,31,,,31,31,31,,,31,,31,31,,,31,31,,31', +',31,,31,,31,31,,31,31,31,31,31,,31,,31,,,,,,,,,,,,,,31,,,31,31,,31,', +'31,32,32,32,,32,,31,,32,32,,,,32,,32,32,32,32,32,32,32,,,,,,32,32,32', +'32,32,32,32,,,32,,,,,,,32,,,32,32,32,32,32,32,32,32,32,32,32,32,,32', +'32,32,32,32,353,353,353,353,353,353,353,353,353,353,353,,353,353,,,353', +'353,,32,,,32,,,32,32,,,32,,32,353,32,353,32,353,353,32,353,353,353,353', +'353,32,353,,,,32,32,32,32,,32,32,32,32,,,,,32,32,,,,33,33,33,32,33,32', +'32,32,33,33,32,32,,33,,33,33,33,33,33,33,33,,,,,,33,33,33,33,33,33,33', +',,33,,,,,,,33,,,33,33,33,33,33,33,33,33,33,33,33,33,,33,33,33,33,33', +'352,352,352,352,352,352,352,352,352,352,352,,352,352,,,352,352,,33,', +',33,,,33,33,,,33,,33,352,33,352,33,352,352,33,352,352,352,352,352,33', +'352,,,,33,33,33,33,,33,33,33,33,,,,,33,33,,,,34,34,34,33,34,33,33,33', +'34,34,33,33,,34,,34,34,34,34,34,34,34,,,,,,34,34,34,34,34,34,34,,,34', +',,,,,,34,,,34,34,34,34,34,34,34,34,34,34,34,34,,34,34,34,34,34,493,', +',,,,,,,,,,,,,,493,493,,34,,,34,,,34,34,,,34,,34,493,34,493,34,493,493', +'34,493,493,,,,34,,,,,34,34,34,34,,34,34,34,34,,,,,34,34,,,,44,44,44', +'34,44,34,34,34,44,44,34,34,,44,,44,44,44,44,44,44,44,,,,,,44,44,44,44', +'44,44,44,,,44,,,,,,,44,,,44,44,44,44,44,44,44,44,,44,44,44,,44,44,44', +'44,44,,,,,,,,,,,,,,,,,,,,44,,,44,,,44,44,,,44,,,,,,44,,,,,,,,,44,,,', +',44,44,44,44,,44,44,44,44,,,,,44,44,,,,45,45,45,44,45,44,44,44,45,45', +'44,44,,45,,45,45,45,45,45,45,45,,,,,,45,45,45,45,45,45,45,,,45,,,,,', +',45,,,45,45,45,45,45,45,45,45,,45,45,45,,45,45,45,45,45,,,,,,,,,,,,', +',,,,,,,45,,,45,,,45,45,,,45,,,,,,45,,,,,,,,,45,,,,,45,45,45,45,,45,45', +'45,45,,,,,45,45,,,,47,47,47,45,47,45,45,45,47,47,45,45,,47,,47,47,47', +'47,47,47,47,,,,,,47,47,47,47,47,47,47,,,47,,,,,,,47,,,47,47,47,47,47', +'47,47,47,,47,47,47,,47,47,47,47,47,,,,,,,,,,,,,,,,,,,,47,,,47,,,47,47', +',,47,,,,,,47,,,,,,,,,47,,,,,47,47,47,47,,47,47,47,47,,,,,47,47,,,,48', +'48,48,47,48,47,47,47,48,48,47,47,,48,,48,48,48,48,48,48,48,,,,,,48,48', +'48,48,48,48,48,,,48,,,,,,,48,,,48,48,48,48,48,48,48,48,,48,48,48,,48', +'48,48,48,48,,,,,,,,,,,,,,,,,,,,48,,,48,,,48,48,,,48,,,,,,48,,,,,,,,', +'48,,,,,48,48,48,48,,48,48,48,48,,,,,48,48,,,,50,50,50,48,50,48,48,48', +'50,50,48,48,,50,,50,50,50,50,50,50,50,,,,,,50,50,50,50,50,50,50,,,50', +',,,,,,50,,,50,50,50,50,50,50,50,50,,50,50,50,,50,50,50,50,50,,,,,,,', +',,,,,,,,,,,,50,,,50,,,50,50,,,50,,,,,,50,,,,,,,,,50,,,,,50,50,50,50', +',50,50,50,50,,,,,50,50,,,,974,974,974,50,974,50,50,50,974,974,50,50', +',974,,974,974,974,974,974,974,974,,,,,,974,974,974,974,974,974,974,', +',974,,,,,,,974,,,974,974,974,974,974,974,974,974,,974,974,974,,974,974', +'974,974,974,,,,,,,,,,,,,,,,,,,,974,,,974,,,974,974,,,974,,,,,,974,,', +',,,,,,974,,,,,974,974,974,974,,974,974,974,974,,,,,974,974,,,,973,973', +'973,974,973,974,974,974,973,973,974,974,,973,,973,973,973,973,973,973', +'973,,,,,,973,973,973,973,973,973,973,,,973,,,,,,,973,,,973,973,973,973', +'973,973,973,973,973,973,973,973,,973,973,973,973,973,,,,,,,,,,,,,,,', +',,,,973,,,973,,,973,973,,,973,,,,973,,973,,,973,,,,,,973,,,,,973,973', +'973,973,,973,973,973,973,,,,,973,973,,,,,,,973,,973,973,973,64,,973', +'973,,,,64,64,64,,,64,64,64,,64,,,,,,,,64,,64,64,64,,,,709,709,709,709', +'64,64,,64,64,64,64,64,,,,,709,709,709,,,,,,,,,,,709,709,,,709,64,64', +'64,64,64,64,64,64,64,64,64,64,64,64,,,64,64,64,,,64,,,64,,,64,64,,64', +',64,,64,,64,64,,64,64,64,64,64,,64,,64,,709,709,709,709,,709,709,709', +'709,,,,64,709,709,64,64,64,64,,64,709,64,709,709,709,,64,66,66,66,66', +'66,,,,66,66,,,,66,,66,66,66,66,66,66,66,,,,,,66,66,66,66,66,66,66,,', +'66,,,,,,66,66,,66,66,66,66,66,66,66,66,66,,66,66,66,,66,66,66,66,66', +',,,,,,,,,,,,,,,,,,,66,,,66,,,66,66,,,66,,66,,,,66,,,,,,,,,66,,,,,66', +'66,66,66,,66,66,66,66,,,,,66,66,,,,67,67,67,66,67,66,66,66,67,67,66', +'66,,67,,67,67,67,67,67,67,67,,,,,,67,67,67,67,67,67,67,,,67,,,,,,,67', +',,67,67,67,67,67,67,67,67,67,67,67,67,,67,67,67,67,67,,,,,,,,,,,,,,', +',,,,,67,,,67,,,67,67,,,67,,67,,,,67,,,67,,,,,,67,,,,,67,67,67,67,,67', +'67,67,67,,,,,67,67,,,,68,68,68,67,68,67,67,67,68,68,67,67,,68,,68,68', +'68,68,68,68,68,,,,,,68,68,68,68,68,68,68,,,68,,,,,,,68,,,68,68,68,68', +'68,68,68,68,68,68,68,68,,68,68,68,68,68,,,,,,,,,,,,,,,,,,,,68,,,68,', +',68,68,,,68,,,,,,68,,,68,,,,,,68,,,,,68,68,68,68,,68,68,68,68,,,,,68', +'68,,,,954,954,954,68,954,68,68,68,954,954,68,68,,954,,954,954,954,954', +'954,954,954,,,,,,954,954,954,954,954,954,954,,,954,,,,,,,954,,,954,954', +'954,954,954,954,954,954,,954,954,954,,954,954,954,954,954,,,,,,,,,,', +',,,,,,,,,954,,,954,,,954,954,,,954,,954,,,,954,,,,,,,,,954,,,,,954,954', +'954,954,,954,954,954,954,,,,,954,954,,,,71,71,71,954,71,954,954,954', +'71,71,954,954,,71,,71,71,71,71,71,71,71,,,,,,71,71,71,71,71,71,71,,', +'71,,,,,,,71,,,71,71,71,71,71,71,71,71,,71,71,71,,71,71,71,71,71,,,,', +',,,,,,,,,,,,,,,71,,,71,,,71,71,,,71,,,,,,71,,,,,,,,,71,,,,,71,71,71', +'71,,71,71,71,71,,,,,71,71,,,,72,72,72,71,72,71,71,71,72,72,71,71,,72', +',72,72,72,72,72,72,72,,,,,,72,72,72,72,72,72,72,,,72,,,,,,,72,,,72,72', +'72,72,72,72,72,72,,72,72,72,,72,72,72,72,72,,,,,,,,,,,,,,,,,,,,72,,', +'72,,,72,72,,,72,,,,,,72,,,,,,,,,72,,,,,72,72,72,72,,72,72,72,72,,,,', +'72,72,,,,75,75,75,72,75,72,72,72,75,75,72,72,,75,,75,75,75,75,75,75', +'75,,,,,,75,75,75,75,75,75,75,,,75,,,,,,,75,,,75,75,75,75,75,75,75,75', +',75,75,75,,75,75,75,75,75,,,,,,,,,,,,,,,,,,,,75,,,75,,,75,75,,,75,,', +',,,75,,,,,,,,,75,,,,,75,75,75,75,,75,75,75,75,,,,,75,75,75,,,,,75,75', +',75,75,75,,,75,75,949,949,949,,949,,,,949,949,,,,949,,949,949,949,949', +'949,949,949,,,,,,949,949,949,949,949,949,949,,,949,,,,,,,949,,,949,949', +'949,949,949,949,949,949,,949,949,949,,949,949,949,949,949,,,,,,,,,,', +',,,,,,,,,949,,,949,,,949,949,,,949,,,,,,949,,,,,,,,,949,,,,,949,949', +'949,949,,949,949,949,949,,,,,949,949,,,,945,945,945,949,945,949,949', +'949,945,945,949,949,,945,,945,945,945,945,945,945,945,,,,,,945,945,945', +'945,945,945,945,,,945,,,,,,,945,,,945,945,945,945,945,945,945,945,,945', +'945,945,,945,945,945,945,945,,,,,,,,,,,,,,,,,,,,945,,,945,,,945,945', +',,945,,,,,,945,,,,,,,,,945,,,,,945,945,945,945,,945,945,945,945,,,,', +'945,945,,,,,,,945,,945,945,945,,,945,945,121,121,121,121,121,,,,121', +'121,,,,121,,121,121,121,121,121,121,121,,,,,,121,121,121,121,121,121', +'121,,,121,,,,,,121,121,121,121,121,121,121,121,121,121,121,121,,121', +'121,121,,121,121,121,121,121,,,,,,,,,,,,,,,,,,,,121,,,121,,,121,121', +',,121,,121,,,,121,,,,,,,,,121,,,,,121,121,121,121,,121,121,121,121,', +',,,121,121,,,,,,121,121,,121,121,121,,,121,121,126,126,126,,126,,,,126', +'126,,,,126,,126,126,126,126,126,126,126,,,,,,126,126,126,126,126,126', +'126,,,126,,,,,,,126,,,126,126,126,126,126,126,126,126,,126,126,126,', +'126,126,126,126,126,,,,,,,,,,,,,,,,,,,,126,,,126,,,126,126,,,126,,,', +',,126,,,,,,,,,126,,,,,126,126,126,126,,126,126,126,126,,,,,126,126,', +',,127,127,127,126,127,126,126,126,127,127,126,126,,127,,127,127,127', +'127,127,127,127,,,,,,127,127,127,127,127,127,127,,,127,,,,,,,127,,,127', +'127,127,127,127,127,127,127,,127,127,127,,127,127,127,127,127,,,,,,', +',,,,,,,,,,,,,127,,,127,,,127,127,,,127,,,,,,127,,,,,,,,,127,,,,,127', +'127,127,127,,127,127,127,127,,,,,127,127,,,,128,128,128,127,128,127', +'127,127,128,128,127,127,,128,,128,128,128,128,128,128,128,,,,,,128,128', +'128,128,128,128,128,,,128,,,,,,,128,,,128,128,128,128,128,128,128,128', +',128,128,128,,128,128,128,128,128,,,,,,,,,,,,,,,,,,,,128,,,128,,,128', +'128,,,128,,,,,,128,,,,,,,,,128,,,,,128,128,128,128,,128,128,128,128', +',,,,128,128,,,,129,129,129,128,129,128,128,128,129,129,128,128,,129', +',129,129,129,129,129,129,129,,,,,,129,129,129,129,129,129,129,,,129', +',,,,,,129,,,129,129,129,129,129,129,129,129,,129,129,129,,129,129,129', +'129,129,,,,,,,,,,,,,,,,,,,,129,,,129,,,129,129,,,129,,,,,,129,,,,,,', +',,129,,,,,129,129,129,129,,129,129,129,129,,,,,129,129,,,,,,,129,,129', +'129,129,,,129,129,130,130,130,130,130,,,,130,130,,,,130,,130,130,130', +'130,130,130,130,,,,,,130,130,130,130,130,130,130,,,130,,,,,,130,130', +',130,130,130,130,130,130,130,130,130,,130,130,130,,130,130,130,130,130', +',,,,,,,,,,,,,,,,,,,130,,,130,,,130,130,,,130,,130,,,,130,,,,,,,,,130', +',,,,130,130,130,130,,130,130,130,130,,,,,130,130,,,,917,917,917,130', +'917,130,130,130,917,917,130,130,,917,,917,917,917,917,917,917,917,,', +',,,917,917,917,917,917,917,917,,,917,,,,,,,917,,,917,917,917,917,917', +'917,917,917,,917,917,917,,917,917,917,917,917,,,,,,,,,,,,,,,,,,,,917', +',,917,,,917,917,,,917,,,,,,917,,,,,,,,,917,,,,,917,917,917,917,,917', +'917,917,917,,,,,917,917,,,,216,216,216,917,216,917,917,917,216,216,917', +'917,,216,,216,216,216,216,216,216,216,,,,,,216,216,216,216,216,216,216', +',,216,,,,,,,216,,,216,216,216,216,216,216,216,216,,216,216,216,,216', +'216,216,216,216,,,,,,,,,,,,,,,,,,,,216,,,216,,,216,216,,,216,,216,,', +',216,,,,,,,,,216,,,,,216,216,216,216,,216,216,216,216,,,,,216,216,,', +',217,217,217,216,217,216,216,216,217,217,216,216,,217,,217,217,217,217', +'217,217,217,,,,,,217,217,217,217,217,217,217,,,217,,,,,,,217,,,217,217', +'217,217,217,217,217,217,,217,217,217,,217,217,217,217,217,,,,,,,,,,', +',,,,,,,,,217,,,217,,,217,217,,,217,,217,,,,217,,,,,,,,,217,,,,,217,217', +'217,217,,217,217,217,217,,,,,217,217,,,,675,675,675,217,675,217,217', +'217,675,675,217,217,,675,,675,675,675,675,675,675,675,,,,,,675,675,675', +'675,675,675,675,,,675,,,,,,,675,,,675,675,675,675,675,675,675,675,,675', +'675,675,,675,675,675,675,675,,,,,,,,,,,,,,,,,,,,675,,,675,,,675,675', +',,675,,,,,,675,,,,,,,,,675,,,,,675,675,675,675,,675,675,675,675,,,,', +'675,675,,,,,,,675,,675,675,675,,,675,675,674,674,674,674,674,,,,674', +'674,,,,674,,674,674,674,674,674,674,674,,,,,,674,674,674,674,674,674', +'674,,,674,,,,,,674,674,,674,674,674,674,674,674,674,674,674,,674,674', +'674,,674,674,674,674,674,,,,,,,,,,,,,,,,,,,,674,,,674,,,674,674,,,674', +',674,,,,674,,,,,,,,,674,,,,,674,674,674,674,,674,674,674,674,,,,,674', +'674,,,,671,671,671,674,671,674,674,674,671,671,674,674,,671,,671,671', +'671,671,671,671,671,,,,,,671,671,671,671,671,671,671,,,671,,,,,,,671', +',,671,671,671,671,671,671,671,671,671,671,671,671,,671,671,671,671,671', +',,,,,,,,,,,,,,,,,,,671,,,671,,,671,671,,,671,,671,,671,,671,,,671,,', +',,,671,,,,,671,671,671,671,,671,671,671,671,,,,,671,671,,,,670,670,670', +'671,670,671,671,671,670,670,671,671,,670,,670,670,670,670,670,670,670', +',,,,,670,670,670,670,670,670,670,,,670,,,,,,,670,,,670,670,670,670,670', +'670,670,670,,670,670,670,,670,670,670,670,670,,,,,,,,,,,,,,,,,,,,670', +',,670,,,670,670,,,670,,,,,,670,,,,,,,,,670,,,,,670,670,670,670,,670', +'670,670,670,,,,,670,670,,,,669,669,669,670,669,670,670,670,669,669,670', +'670,,669,,669,669,669,669,669,669,669,,,,,,669,669,669,669,669,669,669', +',,669,,,,,,,669,,,669,669,669,669,669,669,669,669,,669,669,669,,669', +'669,669,669,669,,,,,,,,,,,,,,,,,,,,669,,,669,,,669,669,,,669,,669,,', +',669,,,,,,,,,669,,,,,669,669,669,669,,669,669,669,669,,,,,669,669,,', +',,,,669,,669,669,669,,,669,669,667,667,667,667,667,,,,667,667,,,,667', +',667,667,667,667,667,667,667,,,,,,667,667,667,667,667,667,667,,,667', +',,,,,667,667,,667,667,667,667,667,667,667,667,667,,667,667,667,,667', +'667,667,667,667,,,,,,,,,,,,,,,,,,,,667,,,667,,,667,667,,,667,,667,,', +',667,,,,,,,,,667,,,,,667,667,667,667,,667,667,667,667,,,,,667,667,,', +',636,636,636,667,636,667,667,667,636,636,667,667,,636,,636,636,636,636', +'636,636,636,,,,,,636,636,636,636,636,636,636,,,636,,,,,,,636,,,636,636', +'636,636,636,636,636,636,636,636,636,636,,636,636,636,636,636,,,,,,,', +',,,,,,,,,,,,636,,,636,,,636,636,,,636,,636,,636,,636,,,636,,,,,,636', +',,,,636,636,636,636,,636,636,636,636,,,,,636,636,,,,626,626,626,636', +'626,636,636,636,626,626,636,636,,626,,626,626,626,626,626,626,626,,', +',,,626,626,626,626,626,626,626,,,626,,,,,,,626,,,626,626,626,626,626', +'626,626,626,626,626,626,626,,626,626,626,626,626,,,,,,,,,,,,,,,,,,,', +'626,,,626,,,626,626,,,626,,626,,626,,626,,,626,,,,,,626,,,,,626,626', +'626,626,,626,626,626,626,,,,,626,626,,,,625,625,625,626,625,626,626', +'626,625,625,626,626,,625,,625,625,625,625,625,625,625,,,,,,625,625,625', +'625,625,625,625,,,625,,,,,,,625,,,625,625,625,625,625,625,625,625,,625', +'625,625,,625,625,625,625,625,,,,,,,,,,,,,,,,,,,,625,,,625,,,625,625', +',,625,,625,,,,625,,,,,,,,,625,,,,,625,625,625,625,,625,625,625,625,', +',,,625,625,,,,612,612,612,625,612,625,625,625,612,612,625,625,,612,', +'612,612,612,612,612,612,612,,,,,,612,612,612,612,612,612,612,,,612,', +',,,,,612,,,612,612,612,612,612,612,612,612,612,612,612,612,,612,612', +'612,612,612,,,,,,,,,,,,,,,,,,,,612,,,612,,,612,612,,,612,,,,,,612,,', +'612,,,,,,612,,,,,612,612,612,612,,612,612,612,612,,,,,612,612,,,,609', +'609,609,612,609,612,612,612,609,609,612,612,,609,,609,609,609,609,609', +'609,609,,,,,,609,609,609,609,609,609,609,,,609,,,,,,,609,,,609,609,609', +'609,609,609,609,609,609,609,609,609,,609,609,609,609,609,,,,,,,,,,,', +',,,,,,,,609,,,609,,,609,609,,,609,,609,,,,609,,,609,,,,,,609,,,,,609', +'609,609,609,,609,609,609,609,,,,,609,609,,,,603,603,603,609,603,609', +'609,609,603,603,609,609,,603,,603,603,603,603,603,603,603,,,,,,603,603', +'603,603,603,603,603,,,603,,,,,,,603,,,603,603,603,603,603,603,603,603', +',603,603,603,,603,603,603,603,603,,,,,,,,,,,,,,,,,,,,603,,,603,,,603', +'603,,,603,,,,,,603,,,,,,,,,603,,,,,603,603,603,603,,603,603,603,603', +',,,,603,603,,,,589,589,589,603,589,603,603,603,589,589,603,603,,589', +',589,589,589,589,589,589,589,,,,,,589,589,589,589,589,589,589,,,589', +',,,,,,589,,,589,589,589,589,589,589,589,589,,589,589,589,,589,589,589', +'589,589,,,,,,,,,,,,,,,,,,,,589,,,589,,,589,589,,,589,,,,,,589,,,,,,', +',,589,,,,,589,589,589,589,,589,589,589,589,,,,,589,589,,,,563,563,563', +'589,563,589,589,589,563,563,589,589,,563,,563,563,563,563,563,563,563', +',,,,,563,563,563,563,563,563,563,,,563,,,,,,,563,,,563,563,563,563,563', +'563,563,563,,563,563,563,,563,563,563,563,563,,,,,,,,,,,,,,,,,,,,563', +',,563,,,563,563,,,563,,,,,,563,,,,,,,,,563,,,,,563,563,563,563,,563', +'563,563,563,,,,,563,563,,,,562,562,562,563,562,563,563,563,562,562,563', +'563,,562,,562,562,562,562,562,562,562,,,,,,562,562,562,562,562,562,562', +',,562,,,,,,,562,,,562,562,562,562,562,562,562,562,,562,562,562,,562', +'562,562,562,562,,,,,,,,,,,,,,,,,,,,562,,,562,,,562,562,,,562,,,,,,562', +',,,,,,,,562,,,,,562,562,562,562,,562,562,562,562,,,,,562,562,,,,559', +'559,559,562,559,562,562,562,559,559,562,562,,559,,559,559,559,559,559', +'559,559,,,,,,559,559,559,559,559,559,559,,,559,,,,,,,559,,,559,559,559', +'559,559,559,559,559,,559,559,559,,559,559,559,559,559,,,,,,,,,,,,,,', +',,,,,559,,,559,,,559,559,,,559,,,,,,559,,,,,,,,,559,,,,,559,559,559', +'559,,559,559,559,559,,,,,559,559,,,,556,556,556,559,556,559,559,559', +'556,556,559,559,,556,,556,556,556,556,556,556,556,,,,,,556,556,556,556', +'556,556,556,,,556,,,,,,,556,,,556,556,556,556,556,556,556,556,,556,556', +'556,,556,556,556,556,556,,,,,,,,,,,,,,,,,,,,556,,,556,,,556,556,,,556', +',,,,,556,,,,,,,,,556,,,,,556,556,556,556,,556,556,556,556,,,,,556,556', +',,,357,357,357,556,357,556,556,556,357,357,556,556,,357,,357,357,357', +'357,357,357,357,,,,,,357,357,357,357,357,357,357,,,357,,,,,,,357,,,357', +'357,357,357,357,357,357,357,,357,357,357,,357,357,357,357,357,,,,,,', +',,,,,,,,,,,,,357,,,357,,,357,357,,,357,,,,,,357,,,,,,,,,357,,,,,357', +'357,357,357,,357,357,357,357,,,,,357,357,,,,359,359,359,357,359,357', +'357,357,359,359,357,357,,359,,359,359,359,359,359,359,359,,,,,,359,359', +'359,359,359,359,359,,,359,,,,,,,359,,,359,359,359,359,359,359,359,359', +',359,359,359,,359,359,359,359,359,,,,,,,,,,,,,,,,,,,,359,,,359,359,', +'359,359,,,359,,,,,,359,,,,,,,,,359,,,,,359,359,359,359,,359,359,359', +'359,,,,,359,359,,,,402,402,402,359,402,359,359,359,402,402,359,359,', +'402,,402,402,402,402,402,402,402,,,,,,402,402,402,402,402,402,402,,', +'402,,,,,,,402,,,402,402,402,402,402,402,402,402,,402,402,402,,402,402', +'402,402,402,,,,,,,,,,,,,,,,,,,,402,,,402,,,402,402,,,402,,,,,,402,,', +',,,,,,402,,,,,402,402,402,402,,402,402,402,402,,,,,402,402,,,,,,,402', +',402,402,402,,,402,402,536,536,536,536,536,,,,536,536,,,,536,,536,536', +'536,536,536,536,536,,,,,,536,536,536,536,536,536,536,,,536,,,,,,536', +'536,536,536,536,536,536,536,536,536,536,536,,536,536,536,,536,536,536', +'536,536,,,,,,,,,,,,,,,,,,,,536,,,536,,,536,536,,,536,,536,,,,536,,,', +',,,,,536,,,,,536,536,536,536,,536,536,536,536,,,,,536,536,,,,,,536,536', +',536,536,536,,,536,536,530,530,530,,530,,,,530,530,,,,530,,530,530,530', +'530,530,530,530,,,,,,530,530,530,530,530,530,530,,,530,,,,,,,530,,,530', +'530,530,530,530,530,530,530,,530,530,530,,530,530,530,530,530,,,,,,', +',,,,,,,,,,,,,530,,,530,,,530,530,,,530,,,,,,530,,,,,,,,,530,,,,,530', +'530,530,530,,530,530,530,530,,,,,530,530,,,,528,528,528,530,528,530', +'530,530,528,528,530,530,,528,,528,528,528,528,528,528,528,,,,,,528,528', +'528,528,528,528,528,,,528,,,,,,,528,,,528,528,528,528,528,528,528,528', +'528,528,528,528,,528,528,528,528,528,,,,,,,,,,,,,,,,,,,,528,,,528,,', +'528,528,,,528,,,,528,,528,,,528,,,,,,528,,,,,528,528,528,528,,528,528', +'528,528,,,,,528,528,,,,526,526,526,528,526,528,528,528,526,526,528,528', +',526,,526,526,526,526,526,526,526,,,,,,526,526,526,526,526,526,526,', +',526,,,,,,,526,,,526,526,526,526,526,526,526,526,526,526,526,526,,526', +'526,526,526,526,,,,,,,,,,,,,,,,,,,,526,,,526,,,526,526,,,526,,526,,526', +',526,,,526,,,,,,526,,,,,526,526,526,526,,526,526,526,526,,,,,526,526', +',,,516,516,516,526,516,526,526,526,516,516,526,526,,516,,516,516,516', +'516,516,516,516,,,,,,516,516,516,516,516,516,516,,,516,,,,,,,516,,,516', +'516,516,516,516,516,516,516,,516,516,516,,516,516,516,516,516,,,,,,', +',,,,,,,,,,,,,516,,,516,,,516,516,,,516,,,,,,516,,,,,,,,,516,,,,,516', +'516,516,516,,516,516,516,516,,,,,516,516,,,,,,,516,,516,516,516,511', +',516,516,,,,511,511,511,,,511,511,511,907,511,907,907,907,907,907,,', +'511,511,511,,,,907,,,,,,511,511,,511,511,511,511,511,,,,,,,,775,907', +'775,775,775,775,775,,,,907,907,907,907,,775,,907,,793,,793,793,793,793', +'793,511,,,,,,,511,793,,,775,511,511,,,,907,,,775,775,775,775,,,,775', +',,793,,,,,511,511,,,793,793,793,793,,,,793,,,,511,,,511,,483,483,483', +'511,483,,,,483,483,511,,,483,,483,483,483,483,483,483,483,,,,,,483,483', +'483,483,483,483,483,,,483,,,,,,,483,,,483,483,483,483,483,483,483,483', +',483,483,483,,483,483,483,483,483,,,,,,,,,,,,,,,,,,,,483,,,483,,,483', +'483,,,483,,,,,,483,,,,,,,,,483,,,,,483,483,483,483,,483,483,483,483', +',,,,483,483,,,,482,482,482,483,482,483,483,483,482,482,483,483,,482', +',482,482,482,482,482,482,482,,,,,,482,482,482,482,482,482,482,,,482', +',,,,,,482,,,482,482,482,482,482,482,482,482,,482,482,482,,482,482,482', +'482,482,,,,,,,,,,,,,,,,,,,,482,,,482,,,482,482,,,482,,,,,,482,,,,,,', +',,482,,,,,482,482,482,482,,482,482,482,482,,,,,482,482,,,,481,481,481', +'482,481,482,482,482,481,481,482,482,,481,,481,481,481,481,481,481,481', +',,,,,481,481,481,481,481,481,481,,,481,,,,,,,481,,,481,481,481,481,481', +'481,481,481,,481,481,481,,481,481,481,481,481,,,,,,,,,,,,,,,,,,,,481', +',,481,,,481,481,,,481,,,,,,481,,,,,,,,,481,,,,,481,481,481,481,,481', +'481,481,481,,,,,481,481,,,,479,479,479,481,479,481,481,481,479,479,481', +'481,,479,,479,479,479,479,479,479,479,,,,,,479,479,479,479,479,479,479', +',,479,,,,,,,479,,,479,479,479,479,479,479,479,479,479,479,479,479,,479', +'479,479,479,479,,,,,,,,,,,,,,,,,,,,479,,,479,,,479,479,,,479,,479,,479', +',479,,,479,,,,,,479,,,,,479,479,479,479,,479,479,479,479,,,,,479,479', +',,,,,,479,,479,479,479,470,,479,479,,,,470,470,470,,,470,470,470,,470', +',,,,,,,470,470,470,470,470,,,,,,,,470,470,,470,470,470,470,470,,,,,', +',,,,,,,,,,,,,,,,,470,470,470,470,470,470,470,470,470,470,470,470,470', +'470,,,470,470,470,,,470,,,470,,,470,470,,470,,470,,470,,470,470,,470', +'470,470,470,470,,470,470,470,,,,,,,,,,,,,,470,,,470,470,470,470,,470', +',470,,381,381,381,470,381,,,,381,381,,,,381,,381,381,381,381,381,381', +'381,,,,,,381,381,381,381,381,381,381,,,381,,,,,,,381,,,381,381,381,381', +'381,381,381,381,,381,381,381,,381,381,381,381,381,,,,,,,,,,,,,,,,,,', +',381,,,381,,,381,381,,,381,,,,,,381,,,,,,,,,381,,,,,381,381,381,381', +',381,381,381,381,,,,,381,381,,,,,,,381,,381,381,381,469,,381,381,,,', +'469,469,469,,,469,469,469,,469,,,,,,,,469,469,469,469,469,,,,,,,,469', +'469,,469,469,469,469,469,,,,,,,,,,,,,,,,,,,,,,,469,469,469,469,469,469', +'469,469,469,469,469,469,469,469,,,469,469,469,,,469,,,469,,,469,469', +',469,,469,,469,,469,469,,469,469,469,469,469,,469,469,469,,,,,,,,,,', +',,,469,,,469,469,469,469,,469,460,469,,,,,469,460,460,460,,,460,460', +'460,,460,,,,,,,,460,460,460,460,,,,,,,,,460,460,,460,460,460,460,460', +',,,,,,,,,,,,,,,,,,,,,,460,460,460,460,460,460,460,460,460,460,460,460', +'460,460,,,460,460,460,,,460,,460,460,,,460,460,,460,,460,,460,,460,460', +',460,460,460,460,460,,460,460,460,,,,,,,,,,,,,,460,,,460,460,,460,,460', +'432,432,432,,432,,460,,432,432,,,,432,,432,432,432,432,432,432,432,', +',,,,432,432,432,432,432,432,432,,,432,,,,,,,432,,,432,432,432,432,432', +'432,432,432,,432,432,432,,432,432,432,432,432,,,,,,,,,,,,,,,,,,,,432', +',,432,,,432,432,,,432,,,,,,432,,,,,,,,,432,,,,,432,432,432,432,,432', +'432,432,432,,,,,432,432,,,,219,219,219,432,219,432,432,432,219,219,432', +'432,,219,,219,219,219,219,219,219,219,,,,,,219,219,219,219,219,219,219', +',,219,,,,,,,219,,,219,219,219,219,219,219,219,219,,219,219,219,,219', +'219,219,219,219,,,,,,,,,,,,,,,,,,,,219,,,219,,,219,219,,,219,,,,,,219', +',,,,,,,,219,,,,,219,219,219,219,,219,219,219,219,,,,,219,219,,,,220', +'220,220,219,220,219,219,219,220,220,219,219,,220,,220,220,220,220,220', +'220,220,,,,,,220,220,220,220,220,220,220,,,220,,,,,,,220,,,220,220,220', +'220,220,220,220,220,,220,220,220,,220,220,220,220,220,,,,,,,,,,,,,,', +',,,,,220,,,220,,,220,220,,,220,,,,,,220,,,,,,,,,220,,,,,220,220,220', +'220,,220,220,220,220,,,,,220,220,,,,222,222,222,220,222,220,220,220', +'222,222,220,220,,222,,222,222,222,222,222,222,222,,,,,,222,222,222,222', +'222,222,222,,,222,,,,,,,222,,,222,222,222,222,222,222,222,222,,222,222', +'222,,222,222,222,222,222,,,,,,,,,,,,,,,,,,,,222,,,222,,,222,222,,,222', +',,,,,222,,,,,,,,,222,,,,,222,222,222,222,,222,222,222,222,,,,,222,222', +',,,223,223,223,222,223,222,222,222,223,223,222,222,,223,,223,223,223', +'223,223,223,223,,,,,,223,223,223,223,223,223,223,,,223,,,,,,,223,,,223', +'223,223,223,223,223,223,223,223,223,223,223,,223,223,223,223,223,,,', +',,,,,,,,,,,,,,,,223,,,223,,,223,223,,,223,,223,,223,,223,,,223,,,,,', +'223,,,,,223,223,223,223,,223,223,223,223,,,,,223,223,,,,897,897,897', +'223,897,223,223,223,897,897,223,223,,897,,897,897,897,897,897,897,897', +',,,,,897,897,897,897,897,897,897,,,897,,,,,,,897,,,897,897,897,897,897', +'897,897,897,,897,897,897,,897,897,897,897,897,,,,,,,,,,,,,,,,,,,,897', +',,897,,,897,897,,,897,,,,,,897,,,,,,,,,897,,,,,897,897,897,897,,897', +'897,897,897,,,,,897,897,,,,228,228,228,897,228,897,897,897,228,228,897', +'897,,228,,228,228,228,228,228,228,228,,,,,,228,228,228,228,228,228,228', +',,228,,,,,,,228,,,228,228,228,228,228,228,228,228,,228,228,228,,228', +'228,228,228,228,,,,,,,,,,,,,,,,,,,,228,,,228,,,228,228,,,228,,,,,,228', +',,,,,,,,228,,,,,228,228,228,228,,228,228,228,228,,,,,228,228,,,,229', +'229,229,228,229,228,228,228,229,229,228,228,,229,,229,229,229,229,229', +'229,229,,,,,,229,229,229,229,229,229,229,,,229,,,,,,,229,,,229,229,229', +'229,229,229,229,229,,229,229,229,,229,229,229,229,229,,,,,,,,,,,,,,', +',,,,,229,,,229,,,229,229,,,229,,,,,,229,,,,,,,,,229,,,,,229,229,229', +'229,,229,229,229,229,,,,,229,229,,,,230,230,230,229,230,229,229,229', +'230,230,229,229,,230,,230,230,230,230,230,230,230,,,,,,230,230,230,230', +'230,230,230,,,230,,,,,,,230,,,230,230,230,230,230,230,230,230,,230,230', +'230,,230,230,230,230,230,,,,,,,,,,,,,,,,,,,,230,,,230,,,230,230,,,230', +',,,,,230,,,,,,,,,230,,,,,230,230,230,230,,230,230,230,230,,,,,230,230', +'230,,,868,868,868,230,868,230,230,230,868,868,230,230,,868,,868,868', +'868,868,868,868,868,,,,,,868,868,868,868,868,868,868,,,868,,,,,,,868', +',,868,868,868,868,868,868,868,868,,868,868,868,,868,868,868,868,868', +',,,,,,,,,,,,,,,,,,,868,,,868,,,868,868,,,868,,,,,,868,,,,,,,,,868,,', +',,868,868,868,868,,868,868,868,868,,,,,868,868,,,,867,867,867,868,867', +'868,868,868,867,867,868,868,,867,,867,867,867,867,867,867,867,,,,,,867', +'867,867,867,867,867,867,,,867,,,,,,,867,,,867,867,867,867,867,867,867', +'867,,867,867,867,,867,867,867,867,867,,,,,,,,,,,,,,,,,,,,867,,,867,', +',867,867,,,867,,,,,,867,,,,,,,,,867,,,,,867,867,867,867,,867,867,867', +'867,,,,,867,867,,,,866,866,866,867,866,867,867,867,866,866,867,867,', +'866,,866,866,866,866,866,866,866,,,,,,866,866,866,866,866,866,866,,', +'866,,,,,,,866,,,866,866,866,866,866,866,866,866,,866,866,866,,866,866', +'866,866,866,,,,,,,,,,,,,,,,,,,,866,,,866,,,866,866,,,866,,,,,,866,,', +',,,,,,866,,,,,866,866,866,866,,866,866,866,866,,,,,866,866,,,,865,865', +'865,866,865,866,866,866,865,865,866,866,,865,,865,865,865,865,865,865', +'865,,,,,,865,865,865,865,865,865,865,,,865,,,,,,,865,,,865,865,865,865', +'865,865,865,865,,865,865,865,,865,865,865,865,865,,,,,,,,,,,,,,,,,,', +',865,,,865,,,865,865,,,865,,,,,,865,,,,,,,,,865,,,,,865,865,865,865', +',865,865,865,865,,,,,865,865,,,,852,852,852,865,852,865,865,865,852', +'852,865,865,,852,,852,852,852,852,852,852,852,,,,,,852,852,852,852,852', +'852,852,,,852,,,,,,,852,,,852,852,852,852,852,852,852,852,,852,852,852', +',852,852,852,852,852,,,,,,,,,,,,,,,,,,,,852,,,852,,,852,852,,,852,,', +',,,852,,,,,,,,,852,,,,,852,852,852,852,,852,852,852,852,,,,,852,852', +',,,241,241,241,852,241,852,852,852,241,241,852,852,,241,,241,241,241', +'241,241,241,241,,,,,,241,241,241,241,241,241,241,,,241,,,,,,,241,,,241', +'241,241,241,241,241,241,241,,241,241,241,,241,241,241,241,241,,,,,,', +',,,,,,,,,,,,,241,,,241,,,241,241,,,241,,,,,,241,,,,,,,,,241,,,,,241', +'241,241,241,,241,241,241,241,,,,,241,241,,,,844,844,844,241,844,241', +'241,241,844,844,241,241,,844,,844,844,844,844,844,844,844,,,,,,844,844', +'844,844,844,844,844,,,844,,,,,,,844,,,844,844,844,844,844,844,844,844', +',844,844,844,,844,844,844,844,844,,,,,,,,,,,,,,,,,,,,844,,,844,,,844', +'844,,,844,,,,,,844,,,,,,,,,844,,,,,844,844,844,844,,844,844,844,844', +',,,,844,844,,,,245,245,245,844,245,844,844,844,245,245,844,844,,245', +',245,245,245,245,245,245,245,,,,,,245,245,245,245,245,245,245,,,245', +',,,,,,245,,,245,245,245,245,245,245,245,245,,245,245,245,,245,245,245', +'245,245,,,,,,,,,,,,,,,,,,,,245,,,245,,,245,245,,,245,,,,,,245,,,,,,', +',,245,,,,,245,245,245,245,,245,245,245,245,,,,,245,245,,,,246,246,246', +'245,246,245,245,245,246,246,245,245,,246,,246,246,246,246,246,246,246', +',,,,,246,246,246,246,246,246,246,,,246,,,,,,,246,,,246,246,246,246,246', +'246,246,246,,246,246,246,,246,246,246,246,246,,,,,,,,,,,,,,,,,,,,246', +',,246,,,246,246,,,246,,,,,,246,,,,,,,,,246,,,,,246,246,246,246,,246', +'246,246,246,,,,,246,246,,,,247,247,247,246,247,246,246,246,247,247,246', +'246,,247,,247,247,247,247,247,247,247,,,,,,247,247,247,247,247,247,247', +',,247,,,,,,,247,,,247,247,247,247,247,247,247,247,,247,247,247,,247', +'247,247,247,247,,,,,,,,,,,,,,,,,,,,247,,,247,,,247,247,,,247,,,,,,247', +',,,,,,,,247,,,,,247,247,247,247,,247,247,247,247,,,,,247,247,,,,248', +'248,248,247,248,247,247,247,248,248,247,247,,248,,248,248,248,248,248', +'248,248,,,,,,248,248,248,248,248,248,248,,,248,,,,,,,248,,,248,248,248', +'248,248,248,248,248,,248,248,248,,248,248,248,248,248,,,,,,,,,,,,,,', +',,,,,248,,,248,,,248,248,,,248,,,,,,248,,,,,,,,,248,,,,,248,248,248', +'248,,248,248,248,248,,,,,248,248,,,,249,249,249,248,249,248,248,248', +'249,249,248,248,,249,,249,249,249,249,249,249,249,,,,,,249,249,249,249', +'249,249,249,,,249,,,,,,,249,,,249,249,249,249,249,249,249,249,,249,249', +'249,,249,249,249,249,249,,,,,,,,,,,,,,,,,,,,249,,,249,,,249,249,,,249', +',,,,,249,,,,,,,,,249,,,,,249,249,249,249,,249,249,249,249,,,,,249,249', +',,,250,250,250,249,250,249,249,249,250,250,249,249,,250,,250,250,250', +'250,250,250,250,,,,,,250,250,250,250,250,250,250,,,250,,,,,,,250,,,250', +'250,250,250,250,250,250,250,,250,250,250,,250,250,250,250,250,,,,,,', +',,,,,,,,,,,,,250,,,250,,,250,250,,,250,,,,,,250,,,,,,,,,250,,,,,250', +'250,250,250,,250,250,250,250,,,,,250,250,,,,251,251,251,250,251,250', +'250,250,251,251,250,250,,251,,251,251,251,251,251,251,251,,,,,,251,251', +'251,251,251,251,251,,,251,,,,,,,251,,,251,251,251,251,251,251,251,251', +',251,251,251,,251,251,251,251,251,,,,,,,,,,,,,,,,,,,,251,,,251,,,251', +'251,,,251,,,,,,251,,,,,,,,,251,,,,,251,251,251,251,,251,251,251,251', +',,,,251,251,,,,252,252,252,251,252,251,251,251,252,252,251,251,,252', +',252,252,252,252,252,252,252,,,,,,252,252,252,252,252,252,252,,,252', +',,,,,,252,,,252,252,252,252,252,252,252,252,,252,252,252,,252,252,252', +'252,252,,,,,,,,,,,,,,,,,,,,252,,,252,,,252,252,,,252,,,,,,252,,,,,,', +',,252,,,,,252,252,252,252,,252,252,252,252,,,,,252,252,,,,253,253,253', +'252,253,252,252,252,253,253,252,252,,253,,253,253,253,253,253,253,253', +',,,,,253,253,253,253,253,253,253,,,253,,,,,,,253,,,253,253,253,253,253', +'253,253,253,,253,253,253,,253,253,253,253,253,,,,,,,,,,,,,,,,,,,,253', +',,253,,,253,253,,,253,,,,,,253,,,,,,,,,253,,,,,253,253,253,253,,253', +'253,253,253,,,,,253,253,,,,254,254,254,253,254,253,253,253,254,254,253', +'253,,254,,254,254,254,254,254,254,254,,,,,,254,254,254,254,254,254,254', +',,254,,,,,,,254,,,254,254,254,254,254,254,254,254,,254,254,254,,254', +'254,254,254,254,,,,,,,,,,,,,,,,,,,,254,,,254,,,254,254,,,254,,,,,,254', +',,,,,,,,254,,,,,254,254,254,254,,254,254,254,254,,,,,254,254,,,,255', +'255,255,254,255,254,254,254,255,255,254,254,,255,,255,255,255,255,255', +'255,255,,,,,,255,255,255,255,255,255,255,,,255,,,,,,,255,,,255,255,255', +'255,255,255,255,255,,255,255,255,,255,255,255,255,255,,,,,,,,,,,,,,', +',,,,,255,,,255,,,255,255,,,255,,,,,,255,,,,,,,,,255,,,,,255,255,255', +'255,,255,255,255,255,,,,,255,255,,,,256,256,256,255,256,255,255,255', +'256,256,255,255,,256,,256,256,256,256,256,256,256,,,,,,256,256,256,256', +'256,256,256,,,256,,,,,,,256,,,256,256,256,256,256,256,256,256,,256,256', +'256,,256,256,256,256,256,,,,,,,,,,,,,,,,,,,,256,,,256,,,256,256,,,256', +',,,,,256,,,,,,,,,256,,,,,256,256,256,256,,256,256,256,256,,,,,256,256', +',,,257,257,257,256,257,256,256,256,257,257,256,256,,257,,257,257,257', +'257,257,257,257,,,,,,257,257,257,257,257,257,257,,,257,,,,,,,257,,,257', +'257,257,257,257,257,257,257,,257,257,257,,257,257,257,257,257,,,,,,', +',,,,,,,,,,,,,257,,,257,,,257,257,,,257,,,,,,257,,,,,,,,,257,,,,,257', +'257,257,257,,257,257,257,257,,,,,257,257,,,,258,258,258,257,258,257', +'257,257,258,258,257,257,,258,,258,258,258,258,258,258,258,,,,,,258,258', +'258,258,258,258,258,,,258,,,,,,,258,,,258,258,258,258,258,258,258,258', +',258,258,258,,258,258,258,258,258,,,,,,,,,,,,,,,,,,,,258,,,258,,,258', +'258,,,258,,,,,,258,,,,,,,,,258,,,,,258,258,258,258,,258,258,258,258', +',,,,258,258,,,,259,259,259,258,259,258,258,258,259,259,258,258,,259', +',259,259,259,259,259,259,259,,,,,,259,259,259,259,259,259,259,,,259', +',,,,,,259,,,259,259,259,259,259,259,259,259,,259,259,259,,259,259,259', +'259,259,,,,,,,,,,,,,,,,,,,,259,,,259,,,259,259,,,259,,,,,,259,,,,,,', +',,259,,,,,259,259,259,259,,259,259,259,259,,,,,259,259,,,,260,260,260', +'259,260,259,259,259,260,260,259,259,,260,,260,260,260,260,260,260,260', +',,,,,260,260,260,260,260,260,260,,,260,,,,,,,260,,,260,260,260,260,260', +'260,260,260,,260,260,260,,260,260,260,260,260,,,,,,,,,,,,,,,,,,,,260', +',,260,,,260,260,,,260,,,,,,260,,,,,,,,,260,,,,,260,260,260,260,,260', +'260,260,260,,,,,260,260,,,,261,261,261,260,261,260,260,260,261,261,260', +'260,,261,,261,261,261,261,261,261,261,,,,,,261,261,261,261,261,261,261', +',,261,,,,,,,261,,,261,261,261,261,261,261,261,261,,261,261,261,,261', +'261,261,261,261,,,,,,,,,,,,,,,,,,,,261,,,261,,,261,261,,,261,,,,,,261', +',,,,,,,,261,,,,,261,261,261,261,,261,261,261,261,,,,,261,261,,,,262', +'262,262,261,262,261,261,261,262,262,261,261,,262,,262,262,262,262,262', +'262,262,,,,,,262,262,262,262,262,262,262,,,262,,,,,,,262,,,262,262,262', +'262,262,262,262,262,,262,262,262,,262,262,262,262,262,,,,,,,,,,,,,,', +',,,,,262,,,262,,,262,262,,,262,,,,,,262,,,,,,,,,262,,,,,262,262,262', +'262,,262,262,262,262,,,,,262,262,,,,263,263,263,262,263,262,262,262', +'263,263,262,262,,263,,263,263,263,263,263,263,263,,,,,,263,263,263,263', +'263,263,263,,,263,,,,,,,263,,,263,263,263,263,263,263,263,263,,263,263', +'263,,263,263,263,263,263,,,,,,,,,,,,,,,,,,,,263,,,263,,,263,263,,,263', +',,,,,263,,,,,,,,,263,,,,,263,263,263,263,,263,263,263,263,,,,,263,263', +',,,264,264,264,263,264,263,263,263,264,264,263,263,,264,,264,264,264', +'264,264,264,264,,,,,,264,264,264,264,264,264,264,,,264,,,,,,,264,,,264', +'264,264,264,264,264,264,264,,264,264,264,,264,264,264,264,264,,,,,,', +',,,,,,,,,,,,,264,,,264,,,264,264,,,264,,,,,,264,,,,,,,,,264,,,,,264', +'264,264,264,,264,264,264,264,,,,,264,264,,,,265,265,265,264,265,264', +'264,264,265,265,264,264,,265,,265,265,265,265,265,265,265,,,,,,265,265', +'265,265,265,265,265,,,265,,,,,,,265,,,265,265,265,265,265,265,265,265', +',265,265,265,,265,265,265,265,265,,,,,,,,,,,,,,,,,,,,265,,,265,,,265', +'265,,,265,,,,,,265,,,,,,,,,265,,,,,265,265,265,265,,265,265,265,265', +',,,,265,265,,,,266,266,266,265,266,265,265,265,266,266,265,265,,266', +',266,266,266,266,266,266,266,,,,,,266,266,266,266,266,266,266,,,266', +',,,,,,266,,,266,266,266,266,266,266,266,266,,266,266,266,,266,266,266', +'266,266,,,,,,,,,,,,,,,,,,,,266,,,266,,,266,266,,,266,,,,,,266,,,,,,', +',,266,,,,,266,266,266,266,,266,266,266,266,,,,,266,266,,,,271,271,271', +'266,271,266,266,266,271,271,266,266,,271,,271,271,271,271,271,271,271', +',,,,,271,271,271,271,271,271,271,,,271,,,,,,,271,,,271,271,271,271,271', +'271,271,271,,271,271,271,,271,271,271,271,271,,,,,,,,,,,,,,,,,,,,271', +',,271,,,271,271,,,271,,,,,,271,,,,,,,,,271,,,,,271,271,271,271,,271', +'271,271,271,,,,,271,271,,,,824,824,824,271,824,271,271,271,824,824,271', +'271,,824,,824,824,824,824,824,824,824,,,,,,824,824,824,824,824,824,824', +',,824,,,,,,,824,,,824,824,824,824,824,824,824,824,,824,824,824,,824', +'824,824,824,824,,,,,,,,,,,,,,,,,,,,824,,,824,,,824,824,,,824,,,,,,824', +',,,,,,,,824,,,,,824,824,824,824,,824,824,824,824,,,,,824,824,,,,779', +'779,779,824,779,824,824,824,779,779,824,824,,779,,779,779,779,779,779', +'779,779,,,,,,779,779,779,779,779,779,779,,,779,,,,,,,779,,,779,779,779', +'779,779,779,779,779,,779,779,779,,779,779,779,779,779,,,,,,,,,,,,,,', +',,,,,779,,,779,,,779,779,,,779,,,,,,779,,,,,,,,,779,,,,,779,779,779', +'779,,779,779,779,779,,,,,779,779,,,,765,765,765,779,765,779,779,779', +'765,765,779,779,,765,,765,765,765,765,765,765,765,,,,,,765,765,765,765', +'765,765,765,,,765,,,,,,,765,,,765,765,765,765,765,765,765,765,,765,765', +'765,,765,765,765,765,765,,,,,,,,,,,,,,,,,,,,765,,,765,,,765,765,,,765', +',765,,,,765,,,,,,,,,765,,,,,765,765,765,765,,765,765,765,765,,,,,765', +'765,,,,287,287,287,765,287,765,765,765,287,287,765,765,,287,,287,287', +'287,287,287,287,287,,,,,,287,287,287,287,287,287,287,,,287,,,,,,,287', +',,287,287,287,287,287,287,287,287,,287,287,287,,287,287,287,287,287', +',,,,,,,,,,,,,,,,,,,287,,,287,,,287,287,,,287,,,,,,287,,,,,,,,,287,,', +',,287,287,287,287,,287,287,287,287,,,,,287,287,,,,745,745,745,287,745', +'287,287,287,745,745,287,287,,745,,745,745,745,745,745,745,745,,,,,,745', +'745,745,745,745,745,745,,,745,,,,,,,745,,,745,745,745,745,745,745,745', +'745,,745,745,745,,745,745,745,745,745,,,,,,,,,,,,,,,,,,,,745,,,745,', +',745,745,,,745,,,,,,745,,,,,,,,,745,,,,,745,745,745,745,,745,745,745', +'745,,,,,745,745,,,,742,742,742,745,742,745,745,745,742,742,745,745,', +'742,,742,742,742,742,742,742,742,,,,,,742,742,742,742,742,742,742,,', +'742,,,,,,,742,,,742,742,742,742,742,742,742,742,,742,742,742,,742,742', +'742,742,742,,,,,,,,,,,,,,,,,,,,742,,,742,,,742,742,,,742,,,,,,742,,', +',,,,,,742,,,,,742,742,742,742,,742,742,742,742,,,,,742,742,,,,294,294', +'294,742,294,742,742,742,294,294,742,742,,294,,294,294,294,294,294,294', +'294,,,,,,294,294,294,294,294,294,294,,,294,,,,,,,294,,,294,294,294,294', +'294,294,294,294,294,294,294,294,,294,294,294,294,294,,,,,,,,,,,,,,,', +',,,,294,,,294,,,294,294,,,294,,294,,294,,294,,,294,,,,,,294,,,,,294', +'294,294,294,,294,294,294,294,,,,,294,294,,,,295,295,295,294,295,294', +'294,294,295,295,294,294,,295,,295,295,295,295,295,295,295,,,,,,295,295', +'295,295,295,295,295,,,295,,,,,,,295,,,295,295,295,295,295,295,295,295', +'295,295,295,295,,295,295,295,295,295,,,,,,,,,,,,,,,,,,,,295,,,295,,', +'295,295,,,295,,295,,295,,295,,,295,,,,,,295,,,,,295,295,295,295,,295', +'295,295,295,,,,,295,295,,,,303,303,303,295,303,295,295,295,303,303,295', +'295,,303,,303,303,303,303,303,303,303,,,,,,303,303,303,303,303,303,303', +',,303,,,,,,,303,,,303,303,303,303,303,303,303,303,303,303,303,303,,303', +'303,303,303,303,,,,,,,,,,,,,,,,,,,,303,,,303,,,303,303,,,303,,303,,303', +',303,,,303,,,,,,303,,,,,303,303,303,303,,303,303,303,303,,,,,303,303', +'303,,,733,733,733,303,733,303,303,303,733,733,303,303,,733,,733,733', +'733,733,733,733,733,,,,,,733,733,733,733,733,733,733,,,733,,,,,,,733', +',,733,733,733,733,733,733,733,733,733,733,733,733,,733,733,733,733,733', +',,,,,,,,,,,,,,,,,,,733,,,733,,,733,733,,,733,,733,,733,,733,,,733,,', +',,,733,,,,,733,733,733,733,,733,733,733,733,,,,,733,733,,,,310,310,310', +'733,310,733,733,733,310,310,733,733,,310,,310,310,310,310,310,310,310', +',,,,,310,310,310,310,310,310,310,,,310,,,,,,,310,,,310,310,310,310,310', +'310,310,310,,310,310,310,,310,310,310,310,310,,,,,,,,,,,,,,,,,,,,310', +',,310,,,310,310,,,310,,,,,,310,,,,,,,,,310,,,,,310,310,310,310,,310', +'310,310,310,,,,,310,310,,,,686,686,686,310,686,310,310,310,686,686,310', +'310,,686,,686,686,686,686,686,686,686,,,,,,686,686,686,686,686,686,686', +',,686,,,,,,,686,,,686,686,686,686,686,686,686,686,,686,686,686,,686', +'686,686,686,686,,,,,,,,,,,,,,,,,,,,686,,,686,,,686,686,,,686,,,,,,686', +',,,,,,,,686,,,,,686,686,686,686,,686,686,686,686,,,,,686,686,,,,312', +'312,312,686,312,686,686,686,312,312,686,686,,312,,312,312,312,312,312', +'312,312,,,,,,312,312,312,312,312,312,312,,,312,,,,,,,312,,,312,312,312', +'312,312,312,312,312,,312,312,312,,312,312,312,312,312,,,,,,,,,,,,,,', +',,,,,312,,,312,,,312,312,,,312,,,,,,312,,,,,,,,,312,,,,,312,312,312', +'312,,312,312,312,312,,,,,312,312,,,,315,315,315,312,315,312,312,312', +'315,315,312,312,,315,,315,315,315,315,315,315,315,,,,,,315,315,315,315', +'315,315,315,,,315,,,,,,,315,,,315,315,315,315,315,315,315,315,,315,315', +'315,,315,315,315,315,315,,,,,,,,,,,,,,,,,,,,315,,,315,,,315,315,,,315', +',,,,,315,,,,,,,,,315,,,,,315,315,315,315,,315,315,315,315,,,,,315,315', +',,,316,316,316,315,316,315,315,315,316,316,315,315,,316,,316,316,316', +'316,316,316,316,,,,,,316,316,316,316,316,316,316,,,316,,,,,,,316,,,316', +'316,316,316,316,316,316,316,,316,316,316,,316,316,316,316,316,,,,,,', +',,,,,,,,,,,,,316,,,316,,,316,316,,,316,,,,,,316,,,,,,,,,316,,,,,316', +'316,316,316,,316,316,316,316,,,,,316,316,,,,685,685,685,316,685,316', +'316,316,685,685,316,316,,685,,685,685,685,685,685,685,685,,,,,,685,685', +'685,685,685,685,685,,,685,,,,,,,685,,,685,685,685,685,685,685,685,685', +',685,685,685,,685,685,685,685,685,,,,,,,,,,,,,,,,,,,,685,,,685,,,685', +'685,,,685,,,,,,685,,,,,,,,,685,,,,,685,685,685,685,,685,685,685,685', +',,,,685,685,,,,,,,685,,685,685,685,,,685,685,321,321,321,321,321,,,', +'321,321,,,,321,,321,321,321,321,321,321,321,,,,,,321,321,321,321,321', +'321,321,,,321,,,,,,321,321,,321,321,321,321,321,321,321,321,321,,321', +'321,321,,321,321,321,321,321,,,,,,,,,,,,,,,,,,,,321,,,321,,,321,321', +',,321,,321,,,,321,,,,,,,,,321,,,,,321,321,321,321,,321,321,321,321,', +',,,321,321,,,,681,681,681,321,681,321,321,321,681,681,321,321,,681,', +'681,681,681,681,681,681,681,,,,,,681,681,681,681,681,681,681,,,681,', +',,,,,681,,,681,681,681,681,681,681,681,681,,681,681,681,,681,681,681', +'681,681,,,,,,,,,,,,,,,,,,,,681,,,681,,,681,681,,,681,,,,,,681,,,,,,', +',,681,,,,,681,681,681,681,,681,681,681,681,,,,,681,681,,,,680,680,680', +'681,680,681,681,681,680,680,681,681,,680,,680,680,680,680,680,680,680', +',,,,,680,680,680,680,680,680,680,,,680,,,,,,,680,,,680,680,680,680,680', +'680,680,680,,680,680,680,,680,680,680,680,680,,,,,,,,,,,,,,,,,,,,680', +',,680,,,680,680,,,680,,,,,,680,,,,,,,,,680,,,,,680,680,680,680,,680', +'680,680,680,,,,,680,680,,,,679,679,679,680,679,680,680,680,679,679,680', +'680,,679,,679,679,679,679,679,679,679,,,,,,679,679,679,679,679,679,679', +',,679,,,,,,,679,,,679,679,679,679,679,679,679,679,679,679,679,679,,679', +'679,679,679,679,,,,,,,,,,,,,,,,,,,,679,,,679,,,679,679,,,679,,,,679', +',679,,,679,,,,,,679,,,,,679,679,679,679,,679,679,679,679,,,,,679,679', +',,,678,678,678,679,678,679,679,679,678,678,679,679,,678,,678,678,678', +'678,678,678,678,,,,,,678,678,678,678,678,678,678,,,678,,,,,,,678,,,678', +'678,678,678,678,678,678,678,678,678,678,678,,678,678,678,678,678,,,', +',,,,,,,,,,,,,,,,678,,,678,,,678,678,,,678,,678,,678,,678,,,678,,,,,', +'678,,,,,678,678,678,678,,678,678,678,678,,,,,678,678,,,,218,218,218', +'678,218,678,678,678,218,218,678,678,,218,,218,218,218,218,218,218,218', +',,,,,218,218,218,218,218,218,218,,,218,,,,,,,218,,,218,218,218,218,218', +'218,218,218,,218,218,218,,218,218,,,218,,,,,,,,,,,,,,,,,,,,218,,,218', +',,218,218,,,218,,218,,,,,,,,,,,,,,,,,,218,218,218,218,,218,218,218,218', +',,,,218,218,,,,221,221,221,218,221,218,218,218,221,221,,,,221,,221,221', +'221,221,221,221,221,,,,,,221,221,221,221,221,221,221,,,221,,,,,,,221', +',,221,221,221,221,221,221,221,221,,221,221,221,,221,221,,,221,,,,,,', +',,,,,,,,,,,,,221,,,221,,,221,221,,,221,,221,,,,,,,,,,,,,,,,,,221,221', +'221,221,,221,221,221,221,,,,,221,221,,,,553,553,553,221,553,221,221', +'221,553,553,,,,553,,553,553,553,553,553,553,553,,,,,,553,553,553,553', +'553,553,553,,,553,,,,,,,553,,,553,553,553,553,553,553,553,553,,553,553', +'553,,553,553,,,553,,,,,,,,,,,,,,,,,,,,553,,,553,,,553,553,,,553,,,,', +',,,,,,,,,,,,,,,553,553,553,553,,553,553,553,553,,,,,553,553,,,,78,78', +'78,553,78,553,553,553,78,78,,,,78,,78,78,78,78,78,78,78,,,,,,78,78,78', +'78,78,78,78,,,78,,,,,,,78,,,78,78,78,78,78,78,78,78,,78,78,78,,78,78', +',,78,,,,,,,,,,,,,,,,,,,,78,,,78,,,78,78,,,78,,,,,,,,,,,,,,,,,,,,78,78', +'78,78,,78,78,78,78,,,,,78,78,,,,544,544,544,78,544,78,78,78,544,544', +',,,544,,544,544,544,544,544,544,544,,,,,,544,544,544,544,544,544,544', +',,544,,,,,,,544,,,544,544,544,544,544,544,544,544,,544,544,544,,544', +'544,,,544,,,,,,,,,,,,,,,,,,,,544,,,544,,,544,544,,,544,,,,,,,,,,,,,', +',,,,,,544,544,544,544,,544,544,544,544,,,,,544,544,,,,348,348,348,544', +'348,544,544,544,348,348,,,,348,,348,348,348,348,348,348,348,,,,,,348', +'348,348,348,348,348,348,,,348,,,,,,,348,,,348,348,348,348,348,348,348', +'348,,348,348,348,,348,348,,,348,,,,,,,,,,,,,,,,,,,,348,,,348,,,348,348', +',,348,,,,,,,,,,,,,,,,,,,,348,348,348,348,,348,348,348,348,,,,,348,348', +',,,1103,1103,1103,348,1103,348,348,348,1103,1103,,,,1103,,1103,1103', +'1103,1103,1103,1103,1103,,,,,,1103,1103,1103,1103,1103,1103,1103,,,1103', +',,,,,,1103,,,1103,1103,1103,1103,1103,1103,1103,1103,,1103,1103,1103', +',1103,1103,,,1103,,,,,,,,,,,,,,,,,,,,1103,,,1103,,,1103,1103,,,1103', +',,,,,,,,,,,,,,,,,,,1103,1103,1103,1103,,1103,1103,1103,1103,,,,,1103', +'1103,,,,1033,1033,1033,1103,1033,1103,1103,1103,1033,1033,,,,1033,,1033', +'1033,1033,1033,1033,1033,1033,,,,,,1033,1033,1033,1033,1033,1033,1033', +',,1033,,,,,,,1033,,,1033,1033,1033,1033,1033,1033,1033,1033,,1033,1033', +'1033,,1033,1033,,,1033,,,,,,,,,,,,,,,,,,,,1033,,,1033,,,1033,1033,,', +'1033,,,,,,,,,,,,,,,,,,,,1033,1033,1033,1033,,1033,1033,1033,1033,,,', +',1033,1033,,,,77,77,77,1033,77,1033,1033,1033,77,77,,,,77,,77,77,77', +'77,77,77,77,,,,,,77,77,77,77,77,77,77,,,77,,,,,,,77,,,77,77,77,77,77', +'77,77,77,,77,77,77,,77,77,,,77,,,,,,,,,,,,,,,,,77,,,77,,,77,,,77,77', +',,77,,,,,,,,,,,,,,,,,,,,77,77,77,77,,77,77,77,77,,,,,77,77,,,,76,76', +'76,77,76,77,77,77,76,76,,,,76,,76,76,76,76,76,76,76,,,,,,76,76,76,76', +'76,76,76,,,76,,,,,,,76,,,76,76,76,76,76,76,76,76,,76,76,76,,76,76,,', +'76,,,,,,,,,,,,,,,,,,,,76,,,76,,,76,76,,,76,,76,,,,,,,,,,,,,,,,,,76,76', +'76,76,,76,76,76,76,,,,,76,76,,,,1023,1023,1023,76,1023,76,76,76,1023', +'1023,,,,1023,,1023,1023,1023,1023,1023,1023,1023,,,,,,1023,1023,1023', +'1023,1023,1023,1023,,,1023,,,,,,,1023,,,1023,1023,1023,1023,1023,1023', +'1023,1023,,1023,1023,1023,,1023,1023,,,1023,,,,,,,,,,,,,,,,,,,,1023', +',,1023,,,1023,1023,,,1023,,,,,,,,,,,,,,,,,,,,1023,1023,1023,1023,,1023', +'1023,1023,1023,,,,,1023,1023,,,,759,759,759,1023,759,1023,1023,1023', +'759,759,,,,759,,759,759,759,759,759,759,759,,,,,,759,759,759,759,759', +'759,759,,,759,,,,,,,759,,,759,759,759,759,759,759,759,759,,759,759,759', +',759,759,,,759,,,,,,,,,,,,,,,,,,,,759,,,759,,,759,759,,,759,,,,,,,,', +',,,,,,,,,,,759,759,759,759,,759,759,759,759,,,,,759,759,,,,38,38,38', +'759,38,759,759,759,38,38,,,,38,,38,38,38,38,38,38,38,,,,,,38,38,38,38', +'38,38,38,,,38,,,,,,,38,,,38,38,38,38,38,38,38,38,,38,38,38,,38,38,,', +'38,,,,,,,,,,,,,,,,,,,,38,,,38,,,38,38,,,38,,,1038,,1038,1038,1038,1038', +'1038,,,,,,,,,1038,,38,38,38,38,,38,38,38,38,,,,,38,38,,,,38,,1038,38', +',38,38,38,748,748,748,,748,1038,1038,,748,748,1038,,,748,,748,748,748', +'748,748,748,748,,,,,,748,748,748,748,748,748,748,,,748,,,,,,,748,,,748', +'748,748,748,748,748,748,748,,748,748,748,,748,748,,,748,,,,,,,,,,,,', +',,,,,,,748,,,748,,,748,748,,,748,,,,,,,,,,,,,,,,,,,,748,748,748,748', +',748,748,748,748,,,,,748,748,,,,329,329,329,748,329,748,748,748,329', +'329,,,,329,,329,329,329,329,329,329,329,,,,,,329,329,329,329,329,329', +'329,,,329,,,,,,,329,,,329,329,329,329,329,329,329,329,,329,329,329,', +'329,329,,,329,,,,,,,,,,,,,,,,,,,,329,,,329,,,329,329,,,329,,,777,,777', +'777,777,777,777,,,,,,,,,777,,329,329,329,329,,329,329,329,329,,,,,329', +'329,,,,329,,777,329,,329,329,329,37,37,37,,37,777,777,,37,37,777,,,37', +',37,37,37,37,37,37,37,,,,,,37,37,37,37,37,37,37,,,37,,,,,,,37,,,37,37', +'37,37,37,37,37,37,,37,37,37,,37,37,,,37,,,,,,,,,,,,,,,,,,,,37,,,37,', +',37,37,,,37,,37,,,,,,,,,,,,,,,,,,37,37,37,37,,37,37,37,37,,,,,37,37', +',,,,,,37,,37,37,37,423,423,423,423,423,423,423,423,423,423,423,423,423', +'423,423,423,423,423,423,423,423,423,423,423,,,,423,423,423,423,423,423', +'423,423,423,423,,,,,,423,423,423,423,423,423,423,423,423,,,423,,,,,', +',,423,423,,423,423,423,423,423,423,423,,,423,423,,,,423,423,423,423', +',,,,,,,,,,,,,423,423,,423,423,423,423,423,423,423,423,423,423,423,423', +',,423,423,,,,,,,,,,,,,,423,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8', +'8,8,8,,,,8,8,8,8,8,8,8,8,8,8,,,,,,8,8,8,8,8,8,8,8,8,8,,8,,,,,,,,8,8', +',8,8,8,8,8,8,8,,,8,8,,,,8,8,8,8,,,,,,,,,,,,,,8,8,,8,8,8,8,8,8,8,8,8', +'8,8,8,,,8,8,,,,,,,,,,,,,,8,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9', +'9,9,9,,,,9,9,9,9,9,9,9,9,9,9,,,,,,9,9,9,9,9,9,9,9,9,,,9,,,,,,,,9,9,', +'9,9,9,9,9,9,9,,,9,9,,,,9,9,9,9,,,,,,,,,,,,,,9,9,,9,9,9,9,9,9,9,9,9,9', +'9,9,,,9,9,,,,,,,,,,,,,,9,665,665,665,665,665,665,665,665,665,665,665', +'665,665,665,665,665,665,665,665,665,665,665,665,665,,,,665,665,665,665', +'665,665,665,665,665,665,,,,,,665,665,665,665,665,665,665,665,665,,,665', +',,,,,,,665,665,,665,665,665,665,665,665,665,,,665,665,,,,665,665,665', +'665,,,,,,,,,,,,,,665,665,,665,665,665,665,665,665,665,665,665,665,665', +'665,,,665,665,875,875,875,875,,,1182,,1182,1182,1182,1182,1182,665,', +',875,875,875,875,,1182,,875,875,,,,,875,875,,,875,875,,,,,,,,,1182,', +',,,,,,,,875,1182,1182,875,,,1182,875,,,875,,875,,,,,,,875,,,,,,,875', +',,,875,875,875,875,,875,875,875,875,,,,,875,875,1200,1200,1200,1200', +',,875,,875,875,875,,,875,875,,1200,1200,1200,1200,,,1036,1200,1036,1036', +'1036,1036,1036,1200,1200,,,1200,,,,1036,,,,,,,,,,,,,,,,1200,,,1200,', +',1036,1200,,,1200,,,,,1036,1036,1036,1036,,,,1036,,,,1200,,,,1200,1200', +'1200,1200,,1200,1200,1200,1200,,,,,1200,1200,1001,1001,1001,1001,,,1200', +',1200,1200,1200,,,1200,1200,,1001,1001,1001,1001,,,1094,1001,1094,1094', +'1094,1094,1094,1001,1001,,,1001,,,,1094,,,,,,,,,,,,,,,,1001,,,1001,', +',1094,1001,,,1001,,,,,1094,1094,1094,1094,,,,1094,,,,1001,,,,1001,1001', +'1001,1001,,1001,1001,1001,1001,,,,,1001,1001,,,,,,,1001,,1001,1001,1001', +',,1001,1001,725,725,725,725,725,725,725,725,725,725,725,725,725,725', +'725,725,725,725,725,725,725,725,725,725,,,,725,725,725,725,725,725,725', +'725,725,725,,,,,,725,725,725,725,725,725,725,725,725,,,725,,,,,,,,725', +'725,,725,725,725,725,725,725,725,,,725,725,,,,725,725,725,725,,,,,,', +',,,,,,,725,725,,725,725,725,725,725,725,725,725,725,725,725,725,,,725', +'484,484,484,484,,,1041,,1041,1041,1041,1041,1041,,,,484,484,484,484', +',1041,,484,,,,,,484,484,,,484,,,,,,,,,,1041,,,,,,,,,,484,1041,1041,484', +',,1041,484,,,484,,,,,,,,,,,,,,,,484,,,,484,484,484,484,,484,484,484', +'484,,,,,484,484,1124,1124,1124,1124,,,484,,484,484,484,,,484,484,,1124', +'1124,1124,1124,,,363,1124,363,363,363,363,363,1124,1124,,,1124,,,,363', +',,,,,,,,,,,,,,,1124,,,1124,,,363,1124,,,1124,,1124,,,363,363,363,363', +',,,363,,,,1124,,,,1124,1124,1124,1124,,1124,1124,1124,1124,,,,,1124', +'1124,1138,1138,1138,1138,,,1124,,1124,1124,1124,,,1124,1124,,1138,1138', +'1138,1138,,,1097,1138,1097,1097,1097,1097,1097,1138,1138,,,1138,,,,1097', +',,,,,,,,,,,,,,,1138,,,1138,,,1097,1138,,,1138,,,,,1097,1097,1097,1097', +',,,1097,,,,1138,,,,1138,1138,1138,1138,,1138,1138,1138,1138,,,,,1138', +'1138,1140,1140,1140,1140,,,1138,,1138,1138,1138,,,1138,1138,,1140,1140', +'1140,1140,,,1043,1140,1043,1043,1043,1043,1043,1140,1140,,,1140,,,,1043', +',,,,,,,,,,,,,,,1140,,,1140,,,1043,1140,,,1140,,1140,,,,,1043,1043,,', +',1043,,,,1140,,,,1140,1140,1140,1140,,1140,1140,1140,1140,,,,,1140,1140', +'1176,1176,1176,1176,,,1140,,1140,1140,1140,,,1140,1140,,1176,1176,1176', +'1176,,,1099,1176,1099,1099,1099,1099,1099,1176,1176,,,1176,,,,1099,', +',,,,,,,,,,,,,,1176,,,1176,,,1099,1176,,,1176,,,,,,,1099,1099,,,,1099', +',,,1176,,,,1176,1176,1176,1176,,1176,1176,1176,1176,,,,,1176,1176,889', +'889,889,889,,,1176,,1176,1176,1176,,,1176,1176,,889,889,889,889,,,1186', +'889,1186,1186,1186,1186,1186,889,889,,,889,,,,1186,,,,,,,,,,,,,,,,889', +',,889,,,1186,889,,,889,,,,,,,1186,1186,,,,1186,,,,889,,,,889,889,889', +'889,,889,889,889,889,,,,,889,889,881,881,881,881,,,889,,889,889,889', +',,889,889,,881,881,881,881,,,1212,881,1212,1212,1212,1212,1212,881,881', +',,881,,,,1212,,,,,,,,,,,,,,,,881,,,881,,,1212,881,,,881,,881,,,,,1212', +'1212,,,,1212,,,,881,,,,881,881,881,881,,881,881,881,881,,,,,881,881', +'871,871,871,871,,,881,,881,881,881,,,881,881,,871,871,871,871,,,1180', +'871,1180,1180,1180,1180,1180,871,871,,,871,,,,1180,,,,,,,,,,,,,,,,871', +',,871,,,1180,871,,,871,,,,,1180,1180,1180,1180,,,,1180,,,,871,,,,871', +'871,871,871,,871,871,871,871,,,,,871,871,874,874,874,874,,,871,,871', +'871,871,,,871,871,,874,874,874,874,,,,874,874,,,,,874,874,,,874,874', +',,,,,,,,,,,,,,,,,,874,,,874,,,,874,,,874,,874,,,,,,,874,,,,,,,874,,', +',874,874,874,874,,874,874,874,874,,,,,874,874,1084,1084,1084,1084,,', +'874,,874,874,874,,,874,874,,1084,1084,1084,1084,,,1184,1084,1184,1184', +'1184,1184,1184,1084,1084,,,1084,,,,1184,,,,,,,,,,,,,,,,1084,,,1084,', +',1184,1084,,,1084,,,,,,,1184,1184,,,,1184,,,,1084,,,,1084,1084,1084', +'1084,,1084,1084,1084,1084,,,,,1084,1084,985,985,985,985,,,1084,,1084', +'1084,1084,,,1084,1084,,985,985,985,985,,,1159,985,1159,1159,1159,1159', +'1159,985,985,,,985,,,,1159,,,,,,,,,,,,,,,,985,,,985,,,1159,985,,,985', +',,,,,,1159,1159,,,,1159,,,,985,,,,985,985,985,985,,985,985,985,985,', +',,,985,985,702,702,702,702,,,985,,985,985,985,,,985,985,,702,702,702', +'702,,,642,702,642,642,642,642,642,702,702,,,702,,,,642,,,,,,,,,,,,,', +',,702,,,702,,,642,702,,,702,,702,,,642,642,642,642,,,,642,,,,702,,,', +'702,702,702,702,,702,702,702,702,,,,,702,702,702,953,953,953,953,,702', +',702,702,702,,,702,702,,,953,953,953,953,,,,953,953,,,,,953,953,,,953', +'953,,,,,,,,,,,,,,,,,,,953,,,953,,,,953,,,953,,953,,,,,,,953,,,,,,,953', +',,,953,953,953,953,,953,953,953,953,,,,,953,953,,,,,,,953,,953,953,953', +',,953,953,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24', +'24,24,24,24,,,,24,24,24,24,24,24,24,24,24,24,,,,,,24,24,24,24,24,24', +'24,24,24,24,24,24,,24,,,,,,24,24,,24,24,24,24,24,24,24,,,24,24,,,,24', +'24,24,24,,,,,,24,,,,,,,,24,24,,24,24,24,24,24,24,24,24,24,24,24,24,', +',24,891,891,891,891,,,,404,,404,404,404,404,404,,,891,891,891,,,,404', +',,,,,,891,891,,,891,708,708,708,708,,,,,,,404,404,,,,,708,708,708,404', +'404,404,404,,,,404,,,708,708,,,708,,,,,,,,,,,,,,,,891,891,891,891,,891', +'891,891,891,,,,,891,891,,,,,,,891,,891,891,891,,,,,,,,,708,708,708,708', +',708,708,708,708,,,,,708,708,890,890,890,890,,,708,,708,708,708,,,,', +',890,890,890,1157,1157,,,1157,,,,,,890,890,1157,1157,890,1157,1157,1157', +'1157,1157,1157,1157,,,1157,1157,,,,1157,1157,1157,1157,,,,,,1157,,,', +',,,,1157,1157,,1157,1157,1157,1157,1157,1157,1157,1157,1157,1157,1157', +'1157,,,1157,890,890,890,890,,890,890,890,890,,,,,890,890,672,672,,,672', +',890,,890,890,890,,672,672,,672,672,672,672,672,672,672,,,672,672,,', +',672,672,672,672,,,,,,672,,,,,,,,672,672,,672,672,672,672,672,672,672', +'672,672,672,672,672,635,635,672,,635,,,,,,,,635,635,,635,635,635,635', +'635,635,635,,,635,635,,,,635,635,635,635,,,,,,635,,,,,,,,635,635,,635', +'635,635,635,635,635,635,635,635,635,635,635,558,558,635,,558,,,,,,,', +'558,558,,558,558,558,558,558,558,558,,,558,558,,,,558,558,558,558,,', +',,,558,,,,,,,,558,558,,558,558,558,558,558,558,558,558,558,558,558,558', +'634,634,558,,634,,,,,,,,634,634,,634,634,634,634,634,634,634,,,634,634', +',,,634,634,634,634,,,,,,634,,,,,,,,634,634,,634,634,634,634,634,634', +'634,634,634,634,634,634,557,557,634,,557,,,,,,,,557,557,,557,557,557', +'557,557,557,557,,,557,557,,,,557,557,557,557,,,,,,557,,,,,,,,557,557', +',557,557,557,557,557,557,557,557,557,557,557,557,478,478,557,,478,,', +',,,,,478,478,,478,478,478,478,478,478,478,,,478,478,,,,478,478,478,478', +',,,,,478,,,,,,,,478,478,,478,478,478,478,478,478,478,478,478,478,478', +'478,548,548,478,,548,,,,,,,,548,548,,548,548,548,548,548,548,548,,,548', +'548,,,,548,548,548,548,,,,,,548,,,,,,,,548,548,,548,548,548,548,548', +'548,548,548,548,548,548,548,628,628,548,,628,,,,,,,,628,628,,628,628', +'628,628,628,628,628,,,628,628,,,,628,628,628,628,,,,,,628,,,,,,,,628', +'628,,628,628,628,628,628,628,628,628,628,628,628,628,290,290,628,,290', +',,,,,,,290,290,,290,290,290,290,290,290,290,,,290,290,,,,290,290,290', +'290,,,,,,,,,,,,,,290,290,,290,290,290,290,290,290,290,290,290,290,290', +'290,225,225,290,,225,,,,,,,,225,225,,225,225,225,225,225,225,225,,,225', +'225,,,,225,225,225,225,,,,,,225,,,,,,,,225,225,,225,225,225,225,225', +'225,225,225,225,225,225,225,627,627,225,,627,,,,,,,,627,627,,627,627', +'627,627,627,627,627,,,627,627,,,,627,627,627,627,,,,,,627,,,,,,,,627', +'627,,627,627,627,627,627,627,627,627,627,627,627,627,477,477,627,,477', +',,,,,,,477,477,,477,477,477,477,477,477,477,,,477,477,,,,477,477,477', +'477,,,,,,477,,,,,,,,477,477,,477,477,477,477,477,477,477,477,477,477', +'477,477,547,547,477,,547,,,,,,,,547,547,,547,547,547,547,547,547,547', +',,547,547,,,,547,547,547,547,,,,,,547,,,,,,,,547,547,,547,547,547,547', +'547,547,547,547,547,547,547,547,1152,1152,547,,1152,,,,,,,,1152,1152', +',1152,1152,1152,1152,1152,1152,1152,,,1152,1152,,,,1152,1152,1152,1152', +',,,,,1152,,,,,,,,1152,1152,,1152,1152,1152,1152,1152,1152,1152,1152', +'1152,1152,1152,1152,1156,1156,1152,,1156,,,,,,,,1156,1156,,1156,1156', +'1156,1156,1156,1156,1156,,,1156,1156,,,,1156,1156,1156,1156,,,,,,1156', +',,,,,,,1156,1156,,1156,1156,1156,1156,1156,1156,1156,1156,1156,1156', +'1156,1156,673,673,1156,,673,,,,,,,,673,673,,673,673,673,673,673,673', +'673,,,673,673,,,,673,673,673,673,,,,,,673,,,,,,,,673,673,,673,673,673', +'673,673,673,673,673,673,673,673,673,224,224,673,,224,,,,,,,,224,224', +',224,224,224,224,224,224,224,,,224,224,,,,224,224,224,224,,,,,,224,', +',,,,,,224,224,,224,224,224,224,224,224,224,224,224,224,224,224,,,224' ] + racc_action_check = arr = ::Array.new(28164, nil) + idx = 0 + clist.each do |str| + str.split(',', -1).each do |i| + arr[idx] = i.to_i unless i.empty? + idx += 1 + end + end + +racc_action_pointer = [ + 3830, 1471, nil, 62, nil, 5256, 1079, 1168, 24697, 24825, + 1162, nil, 1068, 1061, 1114, 815, 1085, 1080, 587, 248, + nil, -41, 5780, 2390, 26779, 1050, nil, 339, nil, 5, + 5921, 6031, 6165, 6296, 6427, nil, 3542, 24430, 24021, nil, + 921, 390, 614, 984, 6558, 6689, 128, 6820, 6951, 522, + 7082, 792, 831, 804, 850, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 7485, nil, 7626, 7757, 7888, -15, + nil, 8150, 8281, nil, nil, 8412, 23628, 23497, 22842, nil, + nil, nil, nil, nil, nil, 589, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 471, nil, nil, 583, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 794, + nil, 8829, nil, nil, nil, nil, 8972, 9103, 9234, 9365, + 9508, nil, 2390, nil, 687, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 573, nil, 3110, 9770, 9901, 22449, 14708, + 14839, 22580, 14970, 15101, 28049, 27622, nil, nil, 15363, 15494, + 15625, nil, nil, 933, 74, 108, 344, 109, 167, 220, + nil, 16411, 4118, 131, nil, 16673, 16804, 16935, 17066, 17197, + 17328, 17459, 17590, 17721, 17852, 17983, 18114, 18245, 18376, 18507, + 18638, 18769, 18900, 19031, 19162, 19293, 19424, nil, nil, nil, + nil, 19555, nil, nil, 409, 444, 475, 504, 556, 557, + 559, -50, -32, 198, nil, nil, nil, 20079, nil, nil, + 27561, nil, nil, 1255, 20472, 20603, nil, nil, nil, nil, + nil, nil, nil, 20734, nil, 3254, nil, 1211, 1219, nil, + 20996, 1281, 21258, nil, nil, 21389, 21520, nil, nil, 370, + nil, 21794, 1223, 1283, 1273, 1526, 1291, 1333, 1291, 24291, + 950, 1221, 1110, 1083, 1383, 1077, nil, 1383, 1346, 6, + -60, 208, nil, nil, nil, 278, 140, 287, 23104, nil, + 98, 864, 6296, 6165, 777, nil, 851, 12283, nil, 12414, + 819, 2822, 358, 25560, 899, 2246, 2102, 1367, 916, nil, + 485, 600, 988, 1017, 687, 1094, nil, 849, 2534, 14, + -11, 14166, 1238, 4262, 291, 1189, 1072, 551, 943, 777, + 1264, 1087, 1286, nil, nil, 1085, 1229, 398, nil, 844, + nil, 1210, 12545, nil, 26850, nil, 178, 405, 293, 281, + 392, -41, -25, 400, nil, nil, nil, nil, nil, nil, + nil, nil, 1212, 24569, nil, nil, nil, nil, 1207, nil, + 1273, 1178, 14577, 1176, nil, nil, 1101, nil, 266, 280, + 1202, nil, nil, 2678, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 2822, 1098, nil, 1093, 1091, 356, 277, + 14443, nil, nil, nil, 805, 0, 1113, nil, nil, 14307, + 14029, nil, nil, nil, 10, nil, 1108, 27744, 27378, 13888, + -31, 13757, 13626, 13495, 25459, 4406, 4550, 1133, 1277, 1040, + 1036, 1035, 1025, 6427, 5870, 5983, 4694, 4838, 4982, 5113, + 4262, 5256, 1353, 1388, 5387, 5518, 3398, 5649, nil, -14, + nil, 13365, nil, nil, nil, nil, 13224, 944, 931, 926, + nil, nil, nil, 922, nil, nil, 13093, nil, 12962, nil, + 12831, nil, 170, nil, nil, nil, 12688, 935, nil, 910, + 904, nil, nil, 900, 22973, 860, 5113, 27805, 27439, 849, + 898, nil, nil, 22711, 798, nil, 12152, 27317, 27195, 12021, + 5780, 3974, 11890, 11759, 828, 822, nil, nil, 662, 549, + 544, 539, 505, nil, 498, 481, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 460, 699, nil, nil, 11628, + nil, nil, nil, 11, nil, nil, nil, 519, nil, nil, + 509, 374, 400, 11497, 510, 481, 320, 351, nil, 11366, + nil, nil, 11235, nil, nil, nil, 3398, 333, nil, 4694, + 2, 255, 162, 80, 44, 11104, 10973, 27683, 27500, 1231, + nil, nil, 939, nil, 27256, 27134, 10842, nil, nil, 24, + 4838, nil, 26540, nil, nil, nil, nil, 1004, nil, nil, + nil, 1345, nil, nil, 174, nil, 176, nil, nil, 1319, + nil, 1318, nil, nil, nil, 24953, nil, 10711, 1292, 10568, + 10437, 10306, 27073, 27988, 10175, 10032, 389, 1328, 22318, 22187, + 22056, 21925, 1295, nil, nil, 21651, 21127, 1261, nil, nil, + nil, 169, 142, 139, 695, 1210, 1245, nil, 1218, nil, + nil, 294, 26537, -81, nil, 771, nil, nil, 26896, 7485, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 1277, 258, nil, 1199, 25376, nil, 1325, nil, 1309, + -21, nil, nil, 20865, nil, 1232, 1237, 1338, nil, 1216, + nil, 1263, 20341, nil, nil, 20210, nil, 25, 24160, 1229, + nil, 1235, 941, 1373, 1281, 1517, 443, 1300, 1257, 23890, + nil, 1328, 20, 2966, 1382, 19948, nil, nil, 802, nil, + nil, 1238, nil, nil, 716, 13365, nil, 24338, nil, 19817, + nil, 1080, nil, 1309, 1315, 1427, 1319, nil, nil, nil, + nil, nil, nil, 13384, 3110, nil, nil, nil, nil, 512, + 820, nil, 1446, nil, nil, nil, nil, nil, 1452, 1454, + nil, nil, 53, 1335, 1661, 1805, 1949, 479, 3974, 2093, + 966, nil, 1357, 1958, 19686, nil, 50, -22, 32, nil, + nil, nil, nil, nil, 2966, nil, nil, nil, nil, nil, + nil, nil, nil, 52, 16542, 110, 138, 114, 249, 361, + nil, 4118, 16280, nil, 256, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 16149, 16018, 15887, 15756, -23, + 464, 26145, 97, 199, 26243, 25037, 341, -75, 432, 436, + nil, 26047, nil, 442, 454, 538, 571, nil, 487, 25949, + 26994, 26862, nil, nil, nil, nil, nil, 15232, nil, nil, + 538, nil, nil, 550, 538, nil, nil, 13329, 2678, nil, + nil, nil, nil, 545, 253, nil, nil, 9639, 704, nil, + 2534, 591, 639, nil, nil, 609, nil, 608, 610, nil, + 615, nil, 704, nil, 624, 642, nil, 651, nil, nil, + 660, 1224, 1512, nil, nil, 8686, nil, 790, nil, 8555, + 814, nil, nil, 26636, 8019, 1094, 2237, 858, nil, 860, + 347, 4982, nil, nil, nil, nil, 759, 806, 777, 776, + 219, nil, nil, 7344, 7213, nil, nil, nil, nil, 793, + 794, 799, 797, nil, nil, 26439, nil, nil, -18, nil, + nil, 809, 814, 815, nil, nil, nil, 862, 829, -34, + nil, 25233, nil, 859, nil, nil, -66, nil, nil, 3830, + 4550, nil, nil, 860, 886, nil, 888, 889, 891, nil, + 919, 899, 886, 23759, nil, nil, nil, 3686, nil, 3686, + nil, nil, 26, 23366, nil, nil, 25138, nil, 24068, nil, + nil, 25446, nil, 25756, nil, nil, nil, nil, 915, 916, + 3542, nil, 42, nil, 38, 771, 257, nil, nil, nil, + nil, 177, nil, nil, nil, 1060, 1814, 1670, 1571, nil, + nil, nil, nil, nil, 720, 993, 247, nil, nil, nil, + nil, nil, nil, 951, 26341, 954, nil, nil, 136, nil, + nil, 859, nil, nil, 25236, nil, nil, 25658, nil, 25854, + nil, nil, 983, 23235, 667, 1048, nil, 1382, 39, 69, + 665, 1052, -7, nil, 1003, 1017, 1030, 1032, 809, 1542, + 4406, nil, 5649, 5518, 25557, nil, nil, nil, nil, 1060, + 1166, 650, nil, nil, nil, nil, nil, nil, 25655, 1050, + 25753, 1051, nil, nil, 1055, 1057, 1059, 1060, nil, 1063, + nil, 555, 27866, nil, 1193, 5387, 27927, 26994, 6, 26442, + nil, nil, nil, nil, 1075, 825, 3254, nil, nil, nil, + 1085, nil, nil, nil, 1580, 1088, 25851, nil, nil, nil, + 26148, nil, 25024, nil, 26344, nil, 25952, nil, nil, 1158, + 1161, nil, 1121, -9, -10, 68, -1, 1174, nil, 324, + 25135, nil, 1236, 1239, 1335, 1336, 8, nil, nil, nil, + nil, 1342, 26050, nil, nil, nil, nil, 732, nil ] + +racc_action_default = [ + -3, -726, -1, -711, -4, -726, -7, -726, -726, -726, + -726, -30, -726, -726, -35, -36, -726, -726, -726, -307, + -52, -713, -726, -59, -726, -67, -68, -69, -73, -284, + -284, -284, -320, -347, -348, -85, -12, -89, -97, -99, + -726, -610, -611, -726, -726, -726, -726, -726, -726, -237, + -726, -713, -623, -623, -255, -298, -299, -300, -301, -302, + -303, -304, -305, -306, -699, -309, -313, -725, -689, -328, + -330, -726, -726, -61, -61, -711, -726, -726, -726, -349, + -350, -352, -409, -550, -551, -552, -553, -574, -556, -557, + -576, -578, -561, -566, -570, -572, -588, -589, -590, -574, + -592, -594, -595, -596, -597, -697, -599, -600, -698, -602, + -603, -604, -605, -606, -607, -608, -609, -614, -615, -726, + -2, -712, -721, -722, -723, -6, -726, -726, -726, -726, + -726, -8, -3, -18, -726, -128, -129, -130, -131, -132, + -133, -134, -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, -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, -23, -135, -12, -726, -726, -726, -726, + -726, -726, -726, -274, -726, -726, -709, -710, -726, -726, + -713, -714, -56, -726, -610, -611, -726, -307, -726, -726, + -243, -726, -12, -726, -57, -220, -221, -726, -726, -726, + -726, -726, -726, -726, -726, -726, -726, -726, -726, -726, + -726, -726, -726, -726, -726, -726, -726, -256, -257, -258, + -259, -726, -63, -64, -726, -128, -129, -168, -169, -170, + -186, -191, -198, -201, -610, -611, -687, -726, -418, -420, + -726, -707, -708, -74, -274, -726, -327, -424, -433, -435, + -80, -430, -81, -713, -82, -262, -279, -288, -288, -283, + -726, -289, -726, -574, -691, -726, -726, -83, -84, -711, + -13, -726, -16, -726, -87, -12, -713, -726, -90, -93, + -12, -105, -106, -726, -726, -113, -320, -323, -713, -726, + -623, -623, -347, -348, -351, -431, -726, -95, -726, -101, + -317, -726, -222, -223, -593, -231, -232, -726, -244, -726, + -622, -12, -645, -645, -622, -12, -12, -311, -713, -263, + -718, -718, -726, -726, -718, -726, -329, -60, -59, -726, + -726, -726, -12, -12, -711, -726, -712, -114, -115, -726, + -726, -122, -726, -362, -363, -123, -124, -726, -126, -726, + -307, -618, -726, -343, -645, -554, -726, -726, -726, -726, + -726, -726, -726, -726, 1219, -5, -724, -24, -25, -26, + -27, -28, -726, -726, -20, -21, -22, -136, -726, -31, + -34, -294, -726, -726, -293, -32, -726, -41, -726, -307, + -49, -51, -209, -267, -289, -39, -40, -53, -54, -37, + -38, -42, -210, -267, -713, -275, -288, -288, -700, -701, + -284, -428, -702, -703, -701, -700, -284, -427, -429, -702, + -703, -48, -217, -55, -713, -326, -726, -726, -726, -274, + -317, -726, -726, -726, -726, -218, -219, -224, -225, -226, + -227, -228, -229, -233, -234, -235, -236, -238, -239, -240, + -241, -242, -245, -246, -247, -248, -713, -260, -65, -713, + -439, -284, -700, -701, -71, -75, -646, -713, -288, -713, + -285, -437, -439, -713, -322, -280, -726, -281, -726, -286, + -726, -290, -726, -694, -696, -11, -712, -15, -17, -713, + -86, -315, -102, -91, -726, -713, -274, -726, -726, -112, + -726, -622, -593, -726, -98, -103, -726, -726, -726, -726, + -261, -249, -726, -726, -542, -726, -375, -376, -713, -630, + -713, -686, -686, -628, -630, -630, -644, -646, -647, -648, + -649, -650, -651, -652, -653, -654, -726, -656, -658, -660, + -665, -667, -668, -671, -676, -678, -679, -681, -682, -683, + -726, -726, -630, -726, -726, -726, -713, -726, -264, -720, + -719, -266, -720, -318, -319, -690, -12, -353, -354, -12, + -726, -726, -726, -726, -726, -726, -274, -726, -726, -121, + -61, -123, -124, -125, -726, -726, -274, -339, -616, -726, + -12, -410, -645, -413, -555, -575, -580, -726, -582, -558, + -577, -726, -579, -560, -726, -563, -726, -565, -568, -726, + -569, -726, -591, -9, -19, -726, -29, -726, -297, -726, + -726, -274, -726, -726, -726, -726, -432, -726, -276, -278, + -726, -726, -76, -273, -425, -726, -726, -78, -426, -325, + -715, -700, -701, -700, -701, -713, -58, -459, -461, -463, + -466, -523, -713, -478, -481, -516, -521, -522, -726, -726, + -526, -527, -528, -529, -530, -531, -532, -533, -534, -535, + -536, -726, -726, -540, -726, -726, -688, -726, -440, -70, + -421, -437, -269, -276, -271, -726, -399, -726, -321, -288, + -287, -291, -726, -692, -693, -726, -14, -88, -726, -94, + -100, -713, -108, -110, -272, -109, -111, -726, -96, -726, + -216, -230, -713, -251, -725, -725, -345, -619, -726, -637, + -621, -726, -626, -627, -726, -726, -640, -726, -642, -726, + -364, -726, -366, -368, -371, -374, -713, -659, -669, -670, + -680, -684, -624, -726, -253, -346, -310, -312, -314, -718, + -725, -355, -725, -62, -356, -357, -333, -334, -726, -726, + -445, -336, -726, -713, -117, -119, -118, -120, -12, -123, + -124, -127, -713, -12, -726, -341, -726, -726, -713, -581, + -584, -585, -586, -587, -12, -559, -562, -564, -567, -571, + -573, -137, -33, -295, -726, -713, -700, -701, -701, -700, + -50, -268, -726, -716, -288, -44, -212, -45, -213, -77, + -46, -215, -47, -214, -79, -726, -726, -726, -726, -432, + -726, -726, -464, -465, -726, -726, -726, -483, -713, -713, + -477, -484, -490, -726, -493, -497, -726, -480, -726, -726, + -519, -520, -524, -525, -537, -124, -538, -726, -66, -419, + -399, -423, -422, -726, -713, -434, -400, -713, -12, -436, + -282, -292, -695, -92, -107, -104, -324, -726, -725, -360, + -12, -543, -725, -544, -545, -713, -629, -630, -630, -657, + -686, -666, -671, -685, -630, -630, -677, -630, -654, -672, + -713, -726, -726, -373, -655, -726, -265, -726, -358, -726, + -726, -335, -337, -726, -726, -12, -116, -726, -432, -726, + -726, -12, -344, -411, -414, -416, -403, -726, -726, -296, + -432, -43, -211, -277, -726, -460, -462, -470, -474, -713, + -713, -713, -502, -504, -505, -508, -509, -574, -512, -514, + -515, -713, -713, -713, -539, -475, -476, -500, -485, -488, + -491, -726, -496, -713, -574, -717, -713, -517, -518, -250, + -12, -72, -270, -686, -686, -380, -382, -382, -382, -398, + -726, -713, -654, -662, -663, -674, -438, -252, -10, -12, + -549, -361, -726, -726, -547, -620, -726, -633, -726, -635, + -625, -726, -638, -726, -641, -643, -365, -367, -369, -372, + -254, -331, -726, -332, -726, -450, -453, -456, -457, -458, + -291, -725, -338, -340, -617, -726, -12, -12, -726, -412, + -583, -467, -468, -469, -503, -507, -726, -511, -513, -471, + -472, -473, -492, -486, -726, -494, -498, -479, -726, -482, + -441, -726, -378, -379, -383, -389, -391, -726, -394, -726, + -396, -401, -726, -726, -661, -726, -548, -12, -610, -611, + -726, -726, -307, -546, -630, -630, -630, -630, -726, -726, + -12, -446, -726, -726, -454, -442, -443, -444, -342, -726, + -726, -713, -405, -407, -408, -501, -506, -510, -726, -489, + -726, -686, -664, -381, -382, -382, -382, -382, -675, -382, + -402, -673, -726, -317, -542, -274, -726, -726, -317, -726, + -631, -634, -636, -639, -370, -725, -12, -451, -452, -455, + -493, -415, -417, -404, -726, -487, -726, -495, -499, -377, + -726, -386, -726, -388, -726, -392, -726, -395, -397, -316, + -704, -541, -713, -700, -701, -704, -316, -630, -359, -725, + -726, -406, -382, -382, -382, -382, -432, -632, -447, -448, + -449, -494, -726, -384, -387, -390, -393, -382, -385 ] + +clist = [ +'42,224,229,289,272,42,306,306,306,406,291,328,138,138,376,624,764,297', +'301,124,273,413,369,809,285,585,585,743,138,565,633,454,359,604,605', +'527,42,332,332,519,141,141,947,452,382,383,460,466,930,472,676,878,232', +'344,344,133,214,131,121,879,340,340,434,435,327,347,42,585,735,6,354', +'379,380,515,6,384,388,285,285,1017,120,616,619,772,773,887,326,918,307', +'307,307,124,344,344,344,780,554,324,17,340,340,340,517,17,365,341,341', +'570,1085,608,611,743,511,615,568,601,377,377,576,576,377,42,786,370', +'908,950,417,418,419,420,42,290,42,451,17,367,1047,394,936,471,922,308', +'308,308,341,341,341,1049,967,696,929,1028,385,2,892,893,643,1148,360', +'364,576,304,317,318,17,1132,746,293,300,302,1134,377,377,377,377,929', +'371,374,743,1170,932,125,981,993,527,927,740,213,740,430,6,1139,423', +'441,1003,1177,727,306,441,421,484,6,654,656,441,401,403,803,737,274', +'927,725,461,731,665,42,477,357,388,17,372,388,730,979,991,286,373,1020', +'17,470,17,980,992,392,344,532,637,344,366,606,1148,340,42,428,340,1175', +'429,440,368,823,961,640,440,808,1048,1019,928,291,440,1095,1021,1059', +'1131,934,447,448,1144,821,306,306,327,1201,433,433,473,474,1134,306', +'903,446,641,928,450,988,988,422,341,695,1010,341,780,869,749,963,943', +'988,404,415,880,460,466,758,472,827,452,585,1066,1211,826,1067,1057', +'510,521,17,1047,17,547,940,522,550,17,42,555,1164,900,42,17,297,1125', +'332,42,1054,509,301,557,124,1007,1008,740,740,17,1102,1208,953,1166', +'344,1055,914,332,607,518,307,340,327,751,896,543,1058,327,307,975,42', +'988,976,344,42,42,877,1141,754,552,340,627,538,536,539,874,760,508,754', +'545,620,42,42,1126,1087,324,875,886,889,537,324,365,740,828,1018,535', +'341,576,936,124,1135,1136,1,308,1032,405,1198,407,956,621,622,308,408', +'409,410,341,411,958,17,412,672,829,17,520,929,377,138,17,834,824,585', +'523,931,813,677,998,1142,585,776,778,970,1040,,822,,,639,683,754,780', +'780,,306,688,141,585,754,,17,,623,859,17,17,461,910,864,,978,664,,743', +'1169,995,996,929,,904,845,17,17,470,988,718,,,724,,,,959,,,460,466,913', +',,683,932,856,858,,,,861,863,,994,,,,925,955,,,,555,,306,,1209,,1114', +'1092,1093,555,,933,,,933,,,461,42,,946,877,877,,,,332,461,,,,,,,470', +'332,1006,,1086,,,,344,,470,,,,,340,929,344,1022,,,,,,340,,,,,910,1145', +'569,,1146,,1079,1080,1081,,855,857,,,,860,862,682,1210,306,818,,,687', +',1191,762,,,306,923,341,,,461,42,792,1056,42,1023,341,,461,,,,780,780', +'1065,,,470,740,17,739,804,,470,1086,42,,,,800,306,441,802,,729,1075', +',,1179,,825,441,441,,,461,441,441,,,1015,1014,42,1202,138,,,,972,42', +'902,677,470,1090,,,812,,677,888,,856,858,863,861,,1127,,1086,,1178,', +'141,,585,440,,718,,,272,,901,718,718,440,440,841,,17,440,440,17,799', +',924,898,555,,,,,,,138,,1178,677,915,1107,1130,842,,17,,,,683,850,,688', +',,332,,650,652,655,655,1120,1086,1121,1022,,332,1022,,,971,344,17,,', +'17,,,340,17,,,344,,,17,17,,,340,17,17,,,854,1206,877,,,1037,1039,677', +'972,,,,1042,1044,,1045,677,1023,,,1023,,966,1023,,1023,,,,341,,42,,', +'433,,42,960,,677,341,441,,13,,,,42,13,,,,,,,854,1022,,,957,,,933,,,1015', +'1014,677,1015,1014,1015,1014,677,677,,968,,,,13,,,377,,718,,1030,718', +'718,,1034,,,713,718,440,,,,,,966,718,718,718,,1023,,1023,13,1023,,1023', +',,,,,,393,,42,1076,,,,,,,17,,,,42,17,,,,1023,1088,,,,,,17,,,,1026,,1015', +'1014,1015,1014,1015,1014,1015,1014,,,1031,1052,17,13,,718,712,42,,,', +',13,42,13,1192,,,,,,,1015,1014,677,677,677,,1064,,754,1160,1161,1162', +'1163,1061,888,718,,,,,,,,,377,,935,837,937,837,,718,966,,18,,17,,,18', +'42,,,,,,,,17,,,,,285,,,233,,,42,,,,1109,,,233,233,233,344,18,333,333', +',,13,340,436,445,344,,449,436,17,716,,340,1106,436,17,,,1207,,,,42,42', +',,18,,13,,,233,233,,,233,389,399,399,,718,,,,,,,341,,1156,1129,,,,713', +',,341,,285,713,713,,42,17,,,,1173,,,,,,,344,42,,1167,1168,718,18,340', +'17,1016,306,233,233,233,233,18,1154,18,,718,,718,,,,461,,,,1165,,,13', +',,,13,470,,,,13,470,,,17,17,42,377,377,475,,341,712,677,,,718,,712,712', +',,,,,,,,,,,13,,,1199,13,13,,,,718,,,,,17,,,,,,,13,13,,,,,17,18,233,438', +'389,233,233,389,438,233,,,,,438,233,233,,,,,,,,524,,,,18,,,,,,,,,,,1115', +',1116,,,1117,,17,540,,713,,,713,713,716,,,,,713,716,716,,,,,,713,713', +'713,1096,1098,1100,233,,,,,,,233,233,,,,,,,,233,710,,,,,,,,,,1147,,1149', +',,,,18,,,,18,,,,333,18,,,,,,,712,,,712,712,,,,713,,712,333,,,,,,19,712', +'712,712,,19,,18,13,,,18,18,,,,,,,,,,1197,713,,,,233,18,18,,,,,,,19,335', +'335,713,,,,1203,,1204,,1205,233,,,,,,,689,,,1181,1183,1185,1187,,1188', +',712,19,,,,,,,,,1217,391,400,400,,,,,716,,,716,716,13,,726,13,,716,', +',,712,732,,734,716,716,716,738,,,,,,,,13,712,,,1213,1214,1215,1216,747', +'19,713,,,233,750,,,,19,1218,19,,,,,,,13,,,436,,,,13,,,767,,770,436,436', +',,,436,436,,,,713,,,716,,,710,,,,,,710,710,713,,713,,,,18,,,,,797,,', +'333,,233,,,,712,716,,333,,,,,,,,,233,,,,,716,713,19,,439,391,,,391,439', +',,,,,439,,719,,,,,,712,,713,,,,19,,,,,,,,712,,712,,,,,,,,,,18,,,18,', +',,,,,233,,,,,,,,,,233,,,,18,,712,,13,,,,,13,716,,,,,,,,,,13,,,,,,712', +'18,,,438,233,,,18,19,,,436,19,438,438,,335,19,438,438,,,,716,710,,,710', +'710,,916,,,,710,335,,716,,716,,,710,710,710,,,,19,,,,19,19,944,,,,,', +',,,,,,,13,,19,19,,,,,716,,,,13,,333,,,,,,,,,,,333,,,,,,,716,,,,,,,710', +',,,,,,,13,,,,,,13,,711,,,,,,,,,,,,,719,,,710,,977,719,719,,,,,,,,,18', +',,710,,18,233,,,,,,715,,,,18,,13,,,1012,,,,,,,,,,,,,438,,,13,,,,1113', +'1035,,,,,,,,,,,,,,,1046,,,,,,,,,,,,,,,19,,13,13,,,,,335,,,,,,710,,,335', +'18,,,,,,1071,1072,1073,,,,18,,,,,,,,,,,29,,13,,,29,,,,,1089,,,710,,13', +',,233,,,,29,,18,,,710,,710,18,,29,29,29,,29,,,19,719,,19,719,719,,,', +',,719,,,,,,,,719,719,719,13,,19,,710,29,,,,833,29,29,,,29,711,,,18,', +',711,711,,,,,,710,19,,1104,439,,,,19,18,,,,1110,439,439,,,,439,439,', +',,,,,,715,,,,29,719,715,715,,29,29,29,29,29,,29,,,18,18,,,,,,,,,,,,', +',,,,,719,,,,,,,,,,,,,,,,719,335,1151,,717,,18,,,,,,335,,,,,,,18,,233', +'233,,,,,,,,,,,,311,311,311,,,,,,,,,29,29,29,,29,29,,29,29,233,,,,29', +'29,29,,,,,18,,,,311,375,19,29,,,711,19,,711,711,,,,719,,711,,19,,,,', +',711,711,711,,,,,,,,,,439,41,,,,,41,,,,,715,29,,715,715,,,719,29,29', +'715,,,,284,,,29,715,715,715,719,,719,,,41,331,331,,,,,,,29,,,,29,,711', +',,29,19,,,,,,,,,,,41,19,,719,,,714,,,,387,284,284,,,,,711,,29,,,,29', +'29,,715,719,,,,,,711,,,19,,,29,29,29,19,,,,431,444,,,717,,,311,,41,717', +'717,715,,29,,,,41,,41,,,,,,,,715,,,,,,,,,,,,,,,,,19,,,,,,,,,,,,,400', +',,,,,19,,,,1112,,711,,,,,,,,311,311,,,,,,,,311,,,,29,,,529,,531,,,533', +'534,19,19,41,,,387,,,387,711,715,,,,,,,,,,,,,711,,711,,,,41,,,,,,,,400', +',,,19,,,,,,29,,,715,,,,19,,,29,,,,711,,,715,,715,,,,,,717,29,,717,717', +'714,,,,,717,714,714,711,,,,,717,717,717,,,,,,,,19,,715,,,,,,41,,,,41', +',,668,331,41,,,,,,,,,715,29,,,29,,,,,331,,29,,,,,,,,,,29,41,,,29,41', +'41,717,,,,,,,,311,,,,,,,41,41,,,,,,,,29,,,29,29,,,29,717,,,,,29,29,', +',,29,29,,,,,717,,,,,,,741,,375,,744,,,,,,,,,,,,,,,,311,,,,,,,,,,,,,', +',,,714,,,714,714,,,,,,714,,,,,,,,714,714,714,,,,,,787,,,,,,,,,,,,,717', +',,,,,,741,,,375,,,,,,,,,,,,,444,311,,,,,,,,,,311,,,,41,,717,,,714,29', +',331,,,29,29,,,,717,331,717,,,,29,,,,,,,843,,311,,,,,,714,741,375,29', +'32,,,,,32,,,,,,,714,717,,,,,,,,,32,,,,,,,,,,32,32,32,,32,717,,41,,,41', +',,,,,,,,,741,,,29,,,,,,911,,41,912,,32,29,,,,32,32,,,32,,,,,,,,,921', +',,,,,41,,,,,714,29,41,939,,,,29,,,,,,29,,,,,,,,,,,,,32,,,,,32,32,32', +'32,32,,32,,,714,,,,,,,,,,,,,,714,,714,,,,,,29,,,,,,969,,,,,,,,331,,', +',,29,,,,,,331,,,,,714,,,,,,,,,,,,,,,,,,,,,,,,714,,29,29,32,32,32,,32', +'32,,32,32,,,,,32,32,32,,,,,,,,,,,41,32,,,,41,,,,,,,,29,,,41,,,,,,,,', +',29,,29,29,,,1060,,,,,,,,,,,,,,32,,,,,375,,32,32,,,,,,,29,32,,,,,,,', +',,29,,,,,,,,32,,,,32,,,,,32,41,,,,,,,,,,,,41,,,,,,,,,,,,,,,,,,32,,,', +'32,32,,,,,,,,,,,,41,,,32,32,32,41,,,,,,,,,,,,,,,,,,32,,,,,,,,,,,,,,', +',,,,,,,,,,,,,,,,41,,,,,,,,,,,,,284,,,,,,41,,,,1108,,,,,,,,,,,,,,,,,', +'311,,,,,32,,,,,,,,,,41,41,,,,,,,,,,,,,,,,,,,,,,,,,,23,,,,,23,,,,,284', +',,,41,,,,,,32,,240,,,,,41,,,32,,,,,,23,,,,,,,,352,353,32,355,356,,358', +',,,,,,,,,,,,,,,23,,,,,378,378,41,,378,,,,,,,,,,,,,,,,,,,,,,,,,32,,,32', +',,,,,,32,,,,,,,,,,32,23,,,32,,378,378,378,378,23,,23,,,,,,,,,,,,,,,', +',,,32,,,32,32,,,32,,,,,,32,32,,,,32,32,,,,,,,,,,,,,,,,,,,,,,,,,,,,,', +',,,,,,,,,,,,,,,23,,443,,378,378,,453,,,,,,453,378,378,,,,,,,,,,,240', +'23,,,485,486,487,488,489,490,491,492,493,494,495,496,497,498,499,500', +'501,502,503,504,505,506,,,,,507,,,,,,,,,,,,,,,,378,,,,,,,,,,,,,,,32', +',,,,32,32,,,,,,,,,,32,,,23,,,,23,,,,,23,,,,,,32,,,,,,,,,,,,,,,,,,,,', +'560,,561,,23,,,,23,23,,,,,,,,,,,,,,,378,23,23,,,,,,,,,32,,,,,,,,,,378', +',32,,,,,,,,,,,,,,,,,,,,,,,,,,,,,32,,,,,,32,,,,,,32,,,,,,,,,,,,,,,,,', +',,,,,,,,,,,,,,,,,,453,453,453,,,,,,,,,,,32,,,,,,,,,,,,,,,,,,,32,,,353', +',,,,,,,,,,,,,,,,,,,23,,,,,,,,,,,,,,32,32,,,,,453,,,761,,,378,763,,,', +',,,,,,,,,,,,,,,,,,,,,,,,32,,,,,,,,,,,,794,32,,32,32,,,,,,,,,23,,,23', +',,,,,,,,,,,,,,,,,,,32,23,,,,,,,,,,32,,,,,,,,,,,,,,,,,23,,,453,,,,23', +'851,,,,,453,453,,,,453,453,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,', +',,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,', +',,,,,,,,,,,,,,,,,,,,,,23,,,,,23,378,,,,,,,,,,23,,,,,,,,,,,,,,,,,,453', +',,,,,,,,,,,,453,453,453,453,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1009,,,,,,,', +',,,23,,,,,,,,,1027,,,23,,,,,,,,,,,,,,,,,,,,,,,,,1050,,,,378,,,,,,23', +',,,,,23,,,,,,,,,,,,,453,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,23,,,,,,', +',,,,,,,,,,,,23,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,23,23,,,,,,,,,,,', +',,,,,,,,,,,,,,,,,,,,,,,,,,,,23,,,,,,,,,,,,,23,,378,378,,,,,,,,,,,,,', +',,,,,,,,,,,,,,,,,,,,,,,,,,,,,23' ] + racc_goto_table = arr = ::Array.new(4471, nil) + idx = 0 + clist.each do |str| + str.split(',', -1).each do |i| + arr[idx] = i.to_i unless i.empty? + idx += 1 + end + end + +clist = [ +'70,34,36,150,44,70,50,50,50,190,34,66,73,73,104,109,11,88,88,113,42', +'190,84,110,70,219,219,228,73,9,71,32,36,9,9,91,70,70,70,89,75,75,108', +'77,40,40,53,53,127,77,33,167,21,81,81,16,16,8,6,168,45,45,23,23,10,67', +'70,219,56,7,78,18,18,55,7,18,70,70,70,137,4,107,107,131,131,179,63,12', +'85,85,85,113,81,81,81,122,68,62,30,45,45,45,32,30,114,46,46,89,184,86', +'86,228,53,86,149,149,26,26,214,214,26,70,123,85,139,12,18,18,18,18,70', +'48,70,29,30,7,121,20,224,29,196,87,87,87,46,46,46,124,141,38,220,13', +'4,2,194,194,149,225,80,80,214,61,61,61,30,143,15,54,54,54,144,26,26', +'26,26,220,87,87,228,185,192,5,170,170,91,218,92,17,92,24,7,184,27,19', +'170,185,153,50,19,7,39,7,204,204,19,72,72,41,153,47,218,49,88,58,76', +'70,34,82,70,30,83,70,90,167,167,102,103,141,30,73,30,168,168,111,81', +'190,112,81,115,116,225,45,70,10,45,184,21,21,117,118,119,120,21,109', +'125,129,138,34,21,134,135,170,142,138,26,26,137,71,50,50,10,143,85,85', +'26,26,144,50,56,20,145,138,20,192,192,2,46,32,139,46,122,33,68,146,122', +'192,147,5,33,53,53,68,77,148,77,219,151,184,9,152,168,154,156,30,121', +'30,34,123,157,36,30,70,66,124,160,70,30,88,161,70,70,162,26,88,34,113', +'194,194,92,92,30,141,163,164,165,81,166,33,70,36,85,85,45,10,32,71,67', +'169,10,85,172,70,192,174,81,70,70,38,127,53,78,45,34,8,6,63,175,77,48', +'53,63,18,70,70,12,179,62,176,180,181,7,62,114,92,149,138,4,46,214,224', +'113,187,188,1,87,197,200,108,201,33,10,10,87,202,203,206,46,207,33,30', +'208,34,209,30,61,220,26,73,30,210,213,219,61,222,32,36,183,223,219,217', +'217,33,131,,32,,,26,88,53,122,122,,50,88,75,219,53,,30,,4,55,30,30,88', +'91,55,,33,16,,228,167,33,33,220,,89,32,30,30,73,192,70,,,36,,,,9,,,53', +'53,68,,,88,192,77,77,,,,77,77,,71,,,,89,107,,,,66,,50,,12,,138,131,131', +'66,,132,,,132,,,88,70,,86,38,38,,,,70,88,,,,,,,73,70,38,,183,,,,81,', +'73,,,,,45,220,81,219,,,,,,45,,,,,91,138,136,,138,,33,33,33,,29,29,,', +',29,29,54,110,50,40,,,54,,11,26,,,50,23,46,,,88,70,113,38,70,221,46', +',88,,,,122,122,9,,,73,92,30,87,113,,73,183,70,,,,10,50,19,10,,54,38', +',,131,,113,19,19,,,88,19,19,,,132,126,70,138,73,,,,77,70,104,36,73,9', +',,85,,36,36,,77,77,77,77,,109,,183,,183,,75,,219,21,,70,,,44,,150,70', +'70,21,21,16,,30,21,21,30,87,,84,42,66,,,,,,,73,,183,36,66,107,9,7,,30', +',,,88,7,,88,,,70,,205,205,205,205,107,183,107,219,,70,219,,,29,81,30', +',,30,,,45,30,,,81,,,30,30,,,45,30,30,,,87,33,38,,,217,217,36,77,,,,217', +'217,,217,36,221,,,221,,36,221,,221,,,,46,,70,,,85,,70,18,,36,46,19,', +'22,,,,70,22,,,,,,,87,219,,,10,,,132,,,132,126,36,132,126,132,126,36', +'36,,10,,,,22,,,26,,70,,84,70,70,,84,,,97,70,21,,,,,,36,70,70,70,,221', +',221,22,221,,221,,,,,,,22,,70,190,,,,,,,30,,,,70,30,,,,221,190,,,,,', +'30,,,,10,,132,126,132,126,132,126,132,126,,,10,18,30,22,,70,96,70,,', +',,22,70,22,32,,,,,,,132,126,36,36,36,,113,,53,217,217,217,217,10,36', +'70,,,,,,,,,26,,136,205,136,205,,70,36,,31,,30,,,31,70,,,,,,,,30,,,,', +'70,,,31,,,70,,,,70,,,31,31,31,81,31,31,31,,,22,45,22,22,81,,22,22,30', +'100,,45,10,22,30,,,217,,,,70,70,,,31,,22,,,31,31,,,31,31,31,31,,70,', +',,,,,46,,34,10,,,,97,,,46,,70,97,97,,70,30,,,,36,,,,,,,81,70,,18,18', +'70,31,45,30,136,50,31,31,31,31,31,10,31,,70,,70,,,,88,,,,10,,,22,,,', +'22,73,,,,22,73,,,30,30,70,26,26,64,,46,96,36,,,70,,96,96,,,,,,,,,,,', +'22,,,10,22,22,,,,70,,,,,30,,,,,,,22,22,,,,,30,31,31,31,31,31,31,31,31', +'31,,,,,31,31,31,,,,,,,,64,,,,31,,,,,,,,,,,136,,136,,,136,,30,64,,97', +',,97,97,100,,,,,97,100,100,,,,,,97,97,97,133,133,133,31,,,,,,,31,31', +',,,,,,,31,94,,,,,,,,,,136,,136,,,,,31,,,,31,,,,31,31,,,,,,,96,,,96,96', +',,,97,,96,31,,,,,,35,96,96,96,,35,,31,22,,,31,31,,,,,,,,,,136,97,,,', +'31,31,31,,,,,,,35,35,35,97,,,,136,,136,,136,31,,,,,,,64,,,133,133,133', +'133,,133,,96,35,,,,,,,,,136,35,35,35,,,,,100,,,100,100,22,,64,22,,100', +',,,96,64,,64,100,100,100,64,,,,,,,,22,96,,,133,133,133,133,64,35,97', +',,31,64,,,,35,133,35,,,,,,,22,,,22,,,,22,,,64,,64,22,22,,,,22,22,,,', +'97,,,100,,,94,,,,,,94,94,97,,97,,,,31,,,,,64,,,31,,31,,,,96,100,,31', +',,,,,,,,31,,,,,100,97,35,,35,35,,,35,35,,,,,,35,,106,,,,,,96,,97,,,', +'35,,,,,,,,96,,96,,,,,,,,,,31,,,31,,,,,,,31,,,,,,,,,,31,,,,31,,96,,22', +',,,,22,100,,,,,,,,,,22,,,,,,96,31,,,31,31,,,31,35,,,22,35,31,31,,35', +'35,31,31,,,,100,94,,,94,94,,64,,,,94,35,,100,,100,,,94,94,94,,,,35,', +',,35,35,64,,,,,,,,,,,,,22,,35,35,,,,,100,,,,22,,31,,,,,,,,,,,31,,,,', +',,100,,,,,,,94,,,,,,,,22,,,,,,22,,95,,,,,,,,,,,,,106,,,94,,64,106,106', +',,,,,,,,31,,,94,,31,31,,,,,,99,,,,31,,22,,,64,,,,,,,,,,,,,31,,,22,,', +',22,64,,,,,,,,,,,,,,,64,,,,,,,,,,,,,,,35,,22,22,,,,,35,,,,,,94,,,35', +'31,,,,,,64,64,64,,,,31,,,,,,,,,,,57,,22,,,57,,,,,64,,,94,,22,,,31,,', +',57,,31,,,94,,94,31,,57,57,57,,57,,,35,106,,35,106,106,,,,,,106,,,,', +',,,106,106,106,22,,35,,94,57,,,,35,57,57,,,57,95,,,31,,,95,95,,,,,,94', +'35,,31,35,,,,35,31,,,,31,35,35,,,,35,35,,,,,,,,99,,,,57,106,99,99,,57', +'57,57,57,57,,57,,,31,31,,,,,,,,,,,,,,,,,,106,,,,,,,,,,,,,,,,106,35,31', +',101,,31,,,,,,35,,,,,,,31,,31,31,,,,,,,,,,,,28,28,28,,,,,,,,,57,57,57', +',57,57,,57,57,31,,,,57,57,57,,,,,31,,,,28,28,35,57,,,95,35,,95,95,,', +',106,,95,,35,,,,,,95,95,95,,,,,,,,,,35,69,,,,,69,,,,,99,57,,99,99,,', +'106,57,57,99,,,,69,,,57,99,99,99,106,,106,,,69,69,69,,,,,,,57,,,,57', +',95,,,57,35,,,,,,,,,,,69,35,,106,,,98,,,,69,69,69,,,,,95,,57,,,,57,57', +',99,106,,,,,,95,,,35,,,57,57,57,35,,,,28,28,,,101,,,28,,69,101,101,99', +',57,,,,69,,69,,,,,,,,99,,,,,,,,,,,,,,,,,35,,,,,,,,,,,,,35,,,,,,35,,', +',35,,95,,,,,,,,28,28,,,,,,,,28,,,,57,,,28,,28,,,28,28,35,35,69,,,69', +',,69,95,99,,,,,,,,,,,,,95,,95,,,,69,,,,,,,,35,,,,35,,,,,,57,,,99,,,', +'35,,,57,,,,95,,,99,,99,,,,,,101,57,,101,101,98,,,,,101,98,98,95,,,,', +'101,101,101,,,,,,,,35,,99,,,,,,69,,,,69,,,28,69,69,,,,,,,,,99,57,,,57', +',,,,69,,57,,,,,,,,,,57,69,,,57,69,69,101,,,,,,,,28,,,,,,,69,69,,,,,', +',,57,,,57,57,,,57,101,,,,,57,57,,,,57,57,,,,,101,,,,,,,28,,28,,28,,', +',,,,,,,,,,,,,28,,,,,,,,,,,,,,,,,98,,,98,98,,,,,,98,,,,,,,,98,98,98,', +',,,,28,,,,,,,,,,,,,101,,,,,,,28,,,28,,,,,,,,,,,,,28,28,,,,,,,,,,28,', +',,69,,101,,,98,57,,69,,,57,57,,,,101,69,101,,,,57,,,,,,,28,,28,,,,,', +'98,28,28,57,60,,,,,60,,,,,,,98,101,,,,,,,,,60,,,,,,,,,,60,60,60,,60', +'101,,69,,,69,,,,,,,,,,28,,,57,,,,,,28,,69,28,,60,57,,,,60,60,,,60,,', +',,,,,,28,,,,,,69,,,,,98,57,69,28,,,,57,,,,,,57,,,,,,,,,,,,,60,,,,,60', +'60,60,60,60,,60,,,98,,,,,,,,,,,,,,98,,98,,,,,,57,,,,,,28,,,,,,,,69,', +',,,57,,,,,,69,,,,,98,,,,,,,,,,,,,,,,,,,,,,,,98,,57,57,60,60,60,,60,60', +',60,60,,,,,60,60,60,,,,,,,,,,,69,60,,,,69,,,,,,,,57,,,69,,,,,,,,,,57', +',57,57,,,28,,,,,,,,,,,,,,60,,,,,28,,60,60,,,,,,,57,60,,,,,,,,,,57,,', +',,,,,60,,,,60,,,,,60,69,,,,,,,,,,,,69,,,,,,,,,,,,,,,,,,60,,,,60,60,', +',,,,,,,,,,69,,,60,60,60,69,,,,,,,,,,,,,,,,,,60,,,,,,,,,,,,,,,,,,,,,', +',,,,,,,,,69,,,,,,,,,,,,,69,,,,,,69,,,,69,,,,,,,,,,,,,,,,,,28,,,,,60', +',,,,,,,,,69,69,,,,,,,,,,,,,,,,,,,,,,,,,,37,,,,,37,,,,,69,,,,69,,,,,', +'60,,37,,,,,69,,,60,,,,,,37,,,,,,,,37,37,60,37,37,,37,,,,,,,,,,,,,,,', +'37,,,,,37,37,69,,37,,,,,,,,,,,,,,,,,,,,,,,,,60,,,60,,,,,,,60,,,,,,,', +',,60,37,,,60,,37,37,37,37,37,,37,,,,,,,,,,,,,,,,,,,60,,,60,60,,,60,', +',,,,60,60,,,,60,60,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,37,,37', +',37,37,,37,,,,,,37,37,37,,,,,,,,,,,37,37,,,37,37,37,37,37,37,37,37,37', +'37,37,37,37,37,37,37,37,37,37,37,37,37,,,,,37,,,,,,,,,,,,,,,,37,,,,', +',,,,,,,,,,60,,,,,60,60,,,,,,,,,,60,,,37,,,,37,,,,,37,,,,,,60,,,,,,,', +',,,,,,,,,,,,,37,,37,,37,,,,37,37,,,,,,,,,,,,,,,37,37,37,,,,,,,,,60,', +',,,,,,,,37,,60,,,,,,,,,,,,,,,,,,,,,,,,,,,,,60,,,,,,60,,,,,,60,,,,,,', +',,,,,,,,,,,,,,,,,,,,,,,,,,,,,37,37,37,,,,,,,,,,,60,,,,,,,,,,,,,,,,,', +',60,,,37,,,,,,,,,,,,,,,,,,,,37,,,,,,,,,,,,,,60,60,,,,,37,,,37,,,37,37', +',,,,,,,,,,,,,,,,,,,,,,,,,,,60,,,,,,,,,,,,37,60,,60,60,,,,,,,,,37,,,37', +',,,,,,,,,,,,,,,,,,,60,37,,,,,,,,,,60,,,,,,,,,,,,,,,,,37,,,37,,,,37,37', +',,,,37,37,,,,37,37,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,', +',,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,', +',,,,,,,,,,,,,,37,,,,,37,37,,,,,,,,,,37,,,,,,,,,,,,,,,,,,37,,,,,,,,,', +',,,37,37,37,37,,,,,,,,,,,,,,,,,,,,,,,,,,,,,37,,,,,,,,,,,37,,,,,,,,,37', +',,37,,,,,,,,,,,,,,,,,,,,,,,,,37,,,,37,,,,,,37,,,,,,37,,,,,,,,,,,,,37', +',,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,37,,,,,,,,,,,,,,,,,,,37,,,,,,,,,', +',,,,,,,,,,,,,,,,,,,,,,,,,,,37,37,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,', +',,,,37,,,,,,,,,,,,,37,,37,37,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,', +',,,37' ] + racc_goto_check = arr = ::Array.new(4471, nil) + idx = 0 + clist.each do |str| + str.split(',', -1).each do |i| + arr[idx] = i.to_i unless i.empty? + idx += 1 + end + end + +racc_goto_pointer = [ + nil, 403, 153, nil, 77, 176, 55, 69, 50, -332, + 28, -548, -677, -767, nil, -370, 47, 178, 0, -24, + 61, 30, 830, -154, -27, nil, 45, 59, 2107, -89, + 98, 1004, -192, -404, -17, 1358, -19, 3304, -335, -44, + -29, -413, -4, nil, -20, 23, 68, 185, 104, -297, + -26, nil, nil, -178, 138, -220, -453, 1935, -301, nil, + 2788, 129, 61, 50, 939, nil, -26, 27, -252, 2211, + 0, -367, 128, 4, nil, 32, -213, -179, 24, nil, + 106, 16, 168, 153, -45, 56, -261, 109, -12, -255, + -289, -273, -340, nil, 824, 1309, 470, 396, 1799, 1350, + 570, 1625, 201, 158, -55, nil, 1104, -298, -758, -370, + -600, 157, -165, 16, 51, 173, -128, 182, -388, -575, + -152, -805, -491, -464, -795, -687, -241, -723, nil, -652, + nil, -488, -242, 272, -757, -647, 221, -828, -512, -612, + nil, -680, -806, -903, -898, -124, -534, 214, -338, -248, + -22, -658, -656, -314, 23, nil, 14, 19, nil, nil, + -404, -733, -622, -857, -467, -777, -607, -651, -643, -596, + -692, nil, -510, nil, -508, -325, -314, nil, nil, -618, + -315, -315, nil, -445, -893, -945, nil, -673, -672, nil, + -78, nil, -591, nil, -554, nil, -625, -517, nil, nil, + 321, 318, 322, 322, -207, 343, 322, 323, 325, -225, + -219, nil, nil, -208, -244, nil, nil, -135, -583, -337, + -618, -287, -338, -654, -637, -940, nil, nil, -501 ] + +racc_goto_default = [ + nil, nil, nil, 3, nil, 4, 386, 322, nil, nil, + 564, nil, 948, nil, 319, 320, nil, nil, nil, 11, + 12, 20, 238, nil, nil, 14, 15, nil, 16, 437, + 239, 351, nil, nil, 635, 237, 476, 305, 997, nil, + nil, nil, nil, 381, 140, 52, 53, nil, nil, nil, + 25, 26, 27, 757, nil, nil, nil, 339, nil, 28, + 336, 455, 35, nil, nil, 37, 40, 39, nil, 234, + 235, 398, nil, 463, 139, 84, nil, 442, 100, 49, + 551, 54, 271, nil, 919, 456, nil, 457, 468, nil, + 684, 525, 309, 295, 55, 56, 57, 58, 59, 60, + 61, 62, 63, nil, 296, 69, 70, nil, nil, nil, + nil, nil, nil, 617, 361, nil, nil, nil, nil, nil, + nil, 782, 584, nil, 783, 784, 572, 566, 567, 1143, + 1013, nil, 573, nil, nil, nil, 602, nil, 575, nil, + 906, nil, nil, nil, 582, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 467, nil, nil, 736, 728, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 882, + nil, 697, 706, 698, 699, nil, nil, 700, 701, nil, + nil, nil, 881, 883, nil, 884, 982, 983, 984, 985, + nil, 989, 593, 990, 705, 707, nil, nil, 83, 85, + 86, nil, nil, nil, nil, 645, nil, nil, nil, nil, + nil, 96, 97, nil, 926, 363, 571, 769, 574, 938, + 587, 589, 590, 1024, 594, 1025, 597, 600, 314 ] + +racc_reduce_table = [ + 0, 0, :racc_error, + 1, 148, :_reduce_none, + 2, 149, :_reduce_2, + 0, 150, :_reduce_3, + 1, 150, :_reduce_4, + 3, 150, :_reduce_5, + 2, 150, :_reduce_6, + 1, 152, :_reduce_none, + 2, 152, :_reduce_8, + 3, 155, :_reduce_9, + 4, 156, :_reduce_10, + 2, 157, :_reduce_11, + 0, 161, :_reduce_12, + 1, 161, :_reduce_13, + 3, 161, :_reduce_14, + 2, 161, :_reduce_15, + 1, 162, :_reduce_none, + 2, 162, :_reduce_17, + 0, 174, :_reduce_18, + 4, 154, :_reduce_19, + 3, 154, :_reduce_20, + 3, 154, :_reduce_21, + 3, 154, :_reduce_22, + 2, 154, :_reduce_23, + 3, 154, :_reduce_24, + 3, 154, :_reduce_25, + 3, 154, :_reduce_26, + 3, 154, :_reduce_27, + 3, 154, :_reduce_28, + 4, 154, :_reduce_29, + 1, 154, :_reduce_none, + 3, 154, :_reduce_31, + 3, 154, :_reduce_32, + 5, 154, :_reduce_33, + 3, 154, :_reduce_34, + 1, 154, :_reduce_none, + 1, 154, :_reduce_none, + 3, 172, :_reduce_37, + 3, 172, :_reduce_38, + 3, 172, :_reduce_39, + 3, 172, :_reduce_40, + 3, 166, :_reduce_41, + 3, 166, :_reduce_42, + 6, 166, :_reduce_43, + 5, 166, :_reduce_44, + 5, 166, :_reduce_45, + 5, 166, :_reduce_46, + 5, 166, :_reduce_47, + 3, 166, :_reduce_48, + 1, 176, :_reduce_none, + 3, 176, :_reduce_50, + 1, 176, :_reduce_none, + 1, 173, :_reduce_none, + 3, 173, :_reduce_53, + 3, 173, :_reduce_54, + 3, 173, :_reduce_55, + 2, 173, :_reduce_56, + 0, 186, :_reduce_57, + 4, 173, :_reduce_58, + 1, 173, :_reduce_none, + 1, 165, :_reduce_none, + 0, 190, :_reduce_61, + 3, 187, :_reduce_62, + 1, 189, :_reduce_63, + 2, 192, :_reduce_64, + 0, 196, :_reduce_65, + 5, 193, :_reduce_66, + 1, 168, :_reduce_none, + 1, 168, :_reduce_none, + 1, 198, :_reduce_none, + 4, 198, :_reduce_70, + 0, 205, :_reduce_71, + 4, 202, :_reduce_72, + 1, 204, :_reduce_none, + 2, 197, :_reduce_74, + 3, 197, :_reduce_75, + 4, 197, :_reduce_76, + 5, 197, :_reduce_77, + 4, 197, :_reduce_78, + 5, 197, :_reduce_79, + 2, 197, :_reduce_80, + 2, 197, :_reduce_81, + 2, 197, :_reduce_82, + 2, 197, :_reduce_83, + 2, 197, :_reduce_84, + 1, 167, :_reduce_85, + 3, 167, :_reduce_86, + 1, 210, :_reduce_87, + 3, 210, :_reduce_88, + 1, 209, :_reduce_none, + 2, 209, :_reduce_90, + 3, 209, :_reduce_91, + 5, 209, :_reduce_92, + 2, 209, :_reduce_93, + 4, 209, :_reduce_94, + 2, 209, :_reduce_95, + 4, 209, :_reduce_96, + 1, 209, :_reduce_97, + 3, 209, :_reduce_98, + 1, 213, :_reduce_none, + 3, 213, :_reduce_100, + 2, 212, :_reduce_101, + 3, 212, :_reduce_102, + 1, 215, :_reduce_103, + 3, 215, :_reduce_104, + 1, 214, :_reduce_105, + 1, 214, :_reduce_106, + 4, 214, :_reduce_107, + 3, 214, :_reduce_108, + 3, 214, :_reduce_109, + 3, 214, :_reduce_110, + 3, 214, :_reduce_111, + 2, 214, :_reduce_112, + 1, 214, :_reduce_113, + 1, 169, :_reduce_114, + 1, 169, :_reduce_115, + 4, 169, :_reduce_116, + 3, 169, :_reduce_117, + 3, 169, :_reduce_118, + 3, 169, :_reduce_119, + 3, 169, :_reduce_120, + 2, 169, :_reduce_121, + 1, 169, :_reduce_122, + 1, 218, :_reduce_123, + 1, 218, :_reduce_none, + 2, 219, :_reduce_125, + 1, 219, :_reduce_126, + 3, 219, :_reduce_127, + 1, 191, :_reduce_none, + 1, 191, :_reduce_none, + 1, 191, :_reduce_none, + 1, 191, :_reduce_none, + 1, 191, :_reduce_none, + 1, 163, :_reduce_133, + 1, 163, :_reduce_none, + 1, 164, :_reduce_135, + 0, 223, :_reduce_136, + 4, 164, :_reduce_137, + 1, 220, :_reduce_none, + 1, 220, :_reduce_none, + 1, 220, :_reduce_none, + 1, 220, :_reduce_none, + 1, 220, :_reduce_none, + 1, 220, :_reduce_none, + 1, 220, :_reduce_none, + 1, 220, :_reduce_none, + 1, 220, :_reduce_none, + 1, 220, :_reduce_none, + 1, 220, :_reduce_none, + 1, 220, :_reduce_none, + 1, 220, :_reduce_none, + 1, 220, :_reduce_none, + 1, 220, :_reduce_none, + 1, 220, :_reduce_none, + 1, 220, :_reduce_none, + 1, 220, :_reduce_none, + 1, 220, :_reduce_none, + 1, 220, :_reduce_none, + 1, 220, :_reduce_none, + 1, 220, :_reduce_none, + 1, 220, :_reduce_none, + 1, 220, :_reduce_none, + 1, 220, :_reduce_none, + 1, 220, :_reduce_none, + 1, 220, :_reduce_none, + 1, 220, :_reduce_none, + 1, 220, :_reduce_none, + 1, 220, :_reduce_none, + 1, 221, :_reduce_none, + 1, 221, :_reduce_none, + 1, 221, :_reduce_none, + 1, 221, :_reduce_none, + 1, 221, :_reduce_none, + 1, 221, :_reduce_none, + 1, 221, :_reduce_none, + 1, 221, :_reduce_none, + 1, 221, :_reduce_none, + 1, 221, :_reduce_none, + 1, 221, :_reduce_none, + 1, 221, :_reduce_none, + 1, 221, :_reduce_none, + 1, 221, :_reduce_none, + 1, 221, :_reduce_none, + 1, 221, :_reduce_none, + 1, 221, :_reduce_none, + 1, 221, :_reduce_none, + 1, 221, :_reduce_none, + 1, 221, :_reduce_none, + 1, 221, :_reduce_none, + 1, 221, :_reduce_none, + 1, 221, :_reduce_none, + 1, 221, :_reduce_none, + 1, 221, :_reduce_none, + 1, 221, :_reduce_none, + 1, 221, :_reduce_none, + 1, 221, :_reduce_none, + 1, 221, :_reduce_none, + 1, 221, :_reduce_none, + 1, 221, :_reduce_none, + 1, 221, :_reduce_none, + 1, 221, :_reduce_none, + 1, 221, :_reduce_none, + 1, 221, :_reduce_none, + 1, 221, :_reduce_none, + 1, 221, :_reduce_none, + 1, 221, :_reduce_none, + 1, 221, :_reduce_none, + 1, 221, :_reduce_none, + 1, 221, :_reduce_none, + 3, 184, :_reduce_209, + 3, 184, :_reduce_210, + 6, 184, :_reduce_211, + 5, 184, :_reduce_212, + 5, 184, :_reduce_213, + 5, 184, :_reduce_214, + 5, 184, :_reduce_215, + 4, 184, :_reduce_216, + 3, 184, :_reduce_217, + 3, 184, :_reduce_218, + 3, 184, :_reduce_219, + 2, 184, :_reduce_220, + 2, 184, :_reduce_221, + 2, 184, :_reduce_222, + 2, 184, :_reduce_223, + 3, 184, :_reduce_224, + 3, 184, :_reduce_225, + 3, 184, :_reduce_226, + 3, 184, :_reduce_227, + 3, 184, :_reduce_228, + 3, 184, :_reduce_229, + 4, 184, :_reduce_230, + 2, 184, :_reduce_231, + 2, 184, :_reduce_232, + 3, 184, :_reduce_233, + 3, 184, :_reduce_234, + 3, 184, :_reduce_235, + 3, 184, :_reduce_236, + 1, 184, :_reduce_none, + 3, 184, :_reduce_238, + 3, 184, :_reduce_239, + 3, 184, :_reduce_240, + 3, 184, :_reduce_241, + 3, 184, :_reduce_242, + 2, 184, :_reduce_243, + 2, 184, :_reduce_244, + 3, 184, :_reduce_245, + 3, 184, :_reduce_246, + 3, 184, :_reduce_247, + 3, 184, :_reduce_248, + 3, 184, :_reduce_249, + 6, 184, :_reduce_250, + 4, 184, :_reduce_251, + 6, 184, :_reduce_252, + 4, 184, :_reduce_253, + 6, 184, :_reduce_254, + 1, 184, :_reduce_none, + 1, 229, :_reduce_none, + 1, 229, :_reduce_none, + 1, 229, :_reduce_none, + 1, 229, :_reduce_none, + 3, 226, :_reduce_260, + 3, 226, :_reduce_261, + 1, 175, :_reduce_none, + 1, 230, :_reduce_none, + 2, 230, :_reduce_none, + 4, 230, :_reduce_265, + 2, 230, :_reduce_266, + 1, 224, :_reduce_none, + 3, 224, :_reduce_268, + 3, 235, :_reduce_269, + 5, 235, :_reduce_270, + 3, 235, :_reduce_271, + 0, 237, :_reduce_272, + 1, 237, :_reduce_none, + 0, 179, :_reduce_274, + 1, 179, :_reduce_none, + 2, 179, :_reduce_none, + 4, 179, :_reduce_277, + 2, 179, :_reduce_278, + 1, 208, :_reduce_279, + 2, 208, :_reduce_280, + 2, 208, :_reduce_281, + 4, 208, :_reduce_282, + 1, 208, :_reduce_283, + 0, 240, :_reduce_284, + 2, 201, :_reduce_285, + 2, 239, :_reduce_286, + 2, 238, :_reduce_287, + 0, 238, :_reduce_288, + 1, 232, :_reduce_289, + 2, 232, :_reduce_290, + 3, 232, :_reduce_291, + 4, 232, :_reduce_292, + 1, 171, :_reduce_293, + 1, 171, :_reduce_none, + 3, 170, :_reduce_295, + 4, 170, :_reduce_296, + 2, 170, :_reduce_297, + 1, 228, :_reduce_none, + 1, 228, :_reduce_none, + 1, 228, :_reduce_none, + 1, 228, :_reduce_none, + 1, 228, :_reduce_none, + 1, 228, :_reduce_none, + 1, 228, :_reduce_none, + 1, 228, :_reduce_none, + 1, 228, :_reduce_none, + 1, 228, :_reduce_none, + 1, 228, :_reduce_308, + 0, 262, :_reduce_309, + 4, 228, :_reduce_310, + 0, 263, :_reduce_311, + 4, 228, :_reduce_312, + 0, 264, :_reduce_313, + 4, 228, :_reduce_314, + 3, 228, :_reduce_315, + 3, 228, :_reduce_316, + 2, 228, :_reduce_317, + 3, 228, :_reduce_318, + 3, 228, :_reduce_319, + 1, 228, :_reduce_320, + 4, 228, :_reduce_321, + 3, 228, :_reduce_322, + 1, 228, :_reduce_323, + 5, 228, :_reduce_324, + 4, 228, :_reduce_325, + 3, 228, :_reduce_326, + 2, 228, :_reduce_327, + 1, 228, :_reduce_none, + 2, 228, :_reduce_329, + 1, 228, :_reduce_none, + 6, 228, :_reduce_331, + 6, 228, :_reduce_332, + 4, 228, :_reduce_333, + 4, 228, :_reduce_334, + 5, 228, :_reduce_335, + 4, 228, :_reduce_336, + 5, 228, :_reduce_337, + 6, 228, :_reduce_338, + 0, 265, :_reduce_339, + 6, 228, :_reduce_340, + 0, 266, :_reduce_341, + 7, 228, :_reduce_342, + 0, 267, :_reduce_343, + 5, 228, :_reduce_344, + 4, 228, :_reduce_345, + 4, 228, :_reduce_346, + 1, 228, :_reduce_347, + 1, 228, :_reduce_348, + 1, 228, :_reduce_349, + 1, 228, :_reduce_350, + 1, 178, :_reduce_none, + 1, 207, :_reduce_352, + 1, 254, :_reduce_none, + 1, 254, :_reduce_none, + 2, 254, :_reduce_355, + 1, 188, :_reduce_none, + 1, 188, :_reduce_none, + 1, 255, :_reduce_none, + 5, 255, :_reduce_359, + 1, 159, :_reduce_none, + 2, 159, :_reduce_361, + 1, 258, :_reduce_none, + 1, 258, :_reduce_none, + 1, 268, :_reduce_364, + 3, 268, :_reduce_365, + 1, 271, :_reduce_366, + 3, 271, :_reduce_367, + 1, 270, :_reduce_none, + 3, 270, :_reduce_369, + 5, 270, :_reduce_370, + 1, 270, :_reduce_371, + 3, 270, :_reduce_372, + 2, 272, :_reduce_373, + 1, 272, :_reduce_374, + 1, 273, :_reduce_none, + 1, 273, :_reduce_none, + 4, 276, :_reduce_377, + 2, 276, :_reduce_378, + 2, 276, :_reduce_379, + 1, 276, :_reduce_380, + 2, 280, :_reduce_381, + 0, 280, :_reduce_382, + 1, 281, :_reduce_none, + 6, 282, :_reduce_384, + 8, 282, :_reduce_385, + 4, 282, :_reduce_386, + 6, 282, :_reduce_387, + 4, 282, :_reduce_388, + 2, 282, :_reduce_none, + 6, 282, :_reduce_390, + 2, 282, :_reduce_391, + 4, 282, :_reduce_392, + 6, 282, :_reduce_393, + 2, 282, :_reduce_394, + 4, 282, :_reduce_395, + 2, 282, :_reduce_396, + 4, 282, :_reduce_397, + 1, 282, :_reduce_none, + 0, 286, :_reduce_399, + 1, 286, :_reduce_400, + 3, 287, :_reduce_401, + 4, 287, :_reduce_402, + 1, 288, :_reduce_403, + 4, 288, :_reduce_404, + 1, 289, :_reduce_405, + 3, 289, :_reduce_406, + 1, 290, :_reduce_407, + 1, 290, :_reduce_none, + 0, 294, :_reduce_409, + 0, 295, :_reduce_410, + 5, 253, :_reduce_411, + 4, 292, :_reduce_412, + 1, 292, :_reduce_413, + 0, 298, :_reduce_414, + 4, 293, :_reduce_415, + 0, 299, :_reduce_416, + 4, 293, :_reduce_417, + 0, 301, :_reduce_418, + 4, 297, :_reduce_419, + 2, 199, :_reduce_420, + 4, 199, :_reduce_421, + 5, 199, :_reduce_422, + 5, 199, :_reduce_423, + 2, 252, :_reduce_424, + 4, 252, :_reduce_425, + 4, 252, :_reduce_426, + 3, 252, :_reduce_427, + 3, 252, :_reduce_428, + 3, 252, :_reduce_429, + 2, 252, :_reduce_430, + 1, 252, :_reduce_431, + 4, 252, :_reduce_432, + 0, 303, :_reduce_433, + 4, 251, :_reduce_434, + 0, 304, :_reduce_435, + 4, 251, :_reduce_436, + 0, 305, :_reduce_437, + 3, 203, :_reduce_438, + 0, 306, :_reduce_439, + 0, 307, :_reduce_440, + 4, 300, :_reduce_441, + 5, 256, :_reduce_442, + 1, 308, :_reduce_443, + 1, 308, :_reduce_none, + 0, 311, :_reduce_445, + 0, 312, :_reduce_446, + 7, 257, :_reduce_447, + 1, 310, :_reduce_448, + 1, 310, :_reduce_none, + 1, 309, :_reduce_450, + 3, 309, :_reduce_451, + 3, 309, :_reduce_452, + 1, 313, :_reduce_none, + 2, 313, :_reduce_454, + 3, 313, :_reduce_455, + 1, 313, :_reduce_456, + 1, 313, :_reduce_457, + 1, 313, :_reduce_458, + 1, 185, :_reduce_none, + 3, 318, :_reduce_460, + 1, 318, :_reduce_none, + 3, 320, :_reduce_462, + 1, 320, :_reduce_none, + 1, 322, :_reduce_464, + 1, 323, :_reduce_465, + 1, 321, :_reduce_none, + 4, 321, :_reduce_467, + 4, 321, :_reduce_468, + 4, 321, :_reduce_469, + 3, 321, :_reduce_470, + 4, 321, :_reduce_471, + 4, 321, :_reduce_472, + 4, 321, :_reduce_473, + 3, 321, :_reduce_474, + 3, 321, :_reduce_475, + 3, 321, :_reduce_476, + 2, 321, :_reduce_477, + 0, 327, :_reduce_478, + 4, 321, :_reduce_479, + 2, 321, :_reduce_480, + 0, 328, :_reduce_481, + 4, 321, :_reduce_482, + 1, 314, :_reduce_483, + 1, 314, :_reduce_484, + 2, 314, :_reduce_485, + 3, 314, :_reduce_486, + 5, 314, :_reduce_487, + 2, 314, :_reduce_488, + 4, 314, :_reduce_489, + 1, 314, :_reduce_none, + 2, 329, :_reduce_491, + 3, 329, :_reduce_492, + 1, 316, :_reduce_493, + 3, 316, :_reduce_494, + 5, 315, :_reduce_495, + 2, 332, :_reduce_496, + 1, 332, :_reduce_497, + 1, 331, :_reduce_498, + 3, 331, :_reduce_499, + 1, 330, :_reduce_none, + 3, 317, :_reduce_501, + 1, 317, :_reduce_502, + 2, 317, :_reduce_503, + 1, 317, :_reduce_504, + 1, 333, :_reduce_505, + 3, 333, :_reduce_506, + 2, 335, :_reduce_507, + 1, 335, :_reduce_508, + 1, 336, :_reduce_509, + 3, 336, :_reduce_510, + 2, 338, :_reduce_511, + 1, 338, :_reduce_512, + 2, 340, :_reduce_513, + 1, 334, :_reduce_none, + 1, 334, :_reduce_none, + 1, 324, :_reduce_none, + 3, 324, :_reduce_517, + 3, 324, :_reduce_518, + 2, 324, :_reduce_519, + 2, 324, :_reduce_520, + 1, 324, :_reduce_none, + 1, 324, :_reduce_none, + 1, 324, :_reduce_none, + 2, 324, :_reduce_524, + 2, 324, :_reduce_525, + 1, 341, :_reduce_none, + 1, 341, :_reduce_none, + 1, 341, :_reduce_none, + 1, 341, :_reduce_none, + 1, 341, :_reduce_none, + 1, 341, :_reduce_none, + 1, 341, :_reduce_none, + 1, 341, :_reduce_none, + 1, 341, :_reduce_534, + 1, 341, :_reduce_none, + 1, 319, :_reduce_536, + 2, 342, :_reduce_537, + 2, 325, :_reduce_538, + 3, 325, :_reduce_539, + 1, 325, :_reduce_540, + 6, 158, :_reduce_541, + 0, 158, :_reduce_542, + 1, 343, :_reduce_543, + 1, 343, :_reduce_none, + 1, 343, :_reduce_none, + 2, 344, :_reduce_546, + 1, 344, :_reduce_none, + 2, 160, :_reduce_548, + 1, 160, :_reduce_none, + 1, 241, :_reduce_none, + 1, 241, :_reduce_none, + 1, 242, :_reduce_552, + 1, 346, :_reduce_553, + 2, 346, :_reduce_554, + 3, 347, :_reduce_555, + 1, 347, :_reduce_556, + 1, 347, :_reduce_557, + 3, 243, :_reduce_558, + 4, 244, :_reduce_559, + 3, 245, :_reduce_560, + 0, 350, :_reduce_561, + 3, 350, :_reduce_562, + 1, 351, :_reduce_563, + 2, 351, :_reduce_564, + 3, 247, :_reduce_565, + 0, 353, :_reduce_566, + 3, 353, :_reduce_567, + 3, 246, :_reduce_568, + 3, 248, :_reduce_569, + 0, 354, :_reduce_570, + 3, 354, :_reduce_571, + 0, 355, :_reduce_572, + 3, 355, :_reduce_573, + 0, 337, :_reduce_574, + 2, 337, :_reduce_575, + 0, 348, :_reduce_576, + 2, 348, :_reduce_577, + 0, 349, :_reduce_578, + 2, 349, :_reduce_579, + 1, 352, :_reduce_580, + 2, 352, :_reduce_581, + 0, 357, :_reduce_582, + 4, 352, :_reduce_583, + 1, 356, :_reduce_584, + 1, 356, :_reduce_585, + 1, 356, :_reduce_586, + 1, 356, :_reduce_none, + 1, 222, :_reduce_none, + 1, 222, :_reduce_none, + 1, 358, :_reduce_590, + 3, 359, :_reduce_591, + 1, 345, :_reduce_592, + 2, 345, :_reduce_593, + 1, 225, :_reduce_594, + 1, 225, :_reduce_595, + 1, 225, :_reduce_596, + 1, 225, :_reduce_597, + 1, 216, :_reduce_598, + 1, 216, :_reduce_599, + 1, 216, :_reduce_600, + 1, 216, :_reduce_601, + 1, 216, :_reduce_602, + 1, 217, :_reduce_603, + 1, 217, :_reduce_604, + 1, 217, :_reduce_605, + 1, 217, :_reduce_606, + 1, 217, :_reduce_607, + 1, 217, :_reduce_608, + 1, 217, :_reduce_609, + 1, 249, :_reduce_610, + 1, 249, :_reduce_611, + 1, 177, :_reduce_612, + 1, 177, :_reduce_613, + 1, 182, :_reduce_614, + 1, 182, :_reduce_615, + 0, 360, :_reduce_616, + 4, 259, :_reduce_617, + 0, 259, :_reduce_618, + 3, 227, :_reduce_619, + 5, 227, :_reduce_620, + 3, 227, :_reduce_621, + 1, 261, :_reduce_none, + 0, 362, :_reduce_623, + 3, 261, :_reduce_624, + 4, 361, :_reduce_625, + 2, 361, :_reduce_626, + 2, 361, :_reduce_627, + 1, 361, :_reduce_628, + 2, 364, :_reduce_629, + 0, 364, :_reduce_630, + 6, 296, :_reduce_631, + 8, 296, :_reduce_632, + 4, 296, :_reduce_633, + 6, 296, :_reduce_634, + 4, 296, :_reduce_635, + 6, 296, :_reduce_636, + 2, 296, :_reduce_637, + 4, 296, :_reduce_638, + 6, 296, :_reduce_639, + 2, 296, :_reduce_640, + 4, 296, :_reduce_641, + 2, 296, :_reduce_642, + 4, 296, :_reduce_643, + 1, 296, :_reduce_644, + 0, 296, :_reduce_645, + 1, 236, :_reduce_646, + 1, 291, :_reduce_647, + 1, 291, :_reduce_648, + 1, 291, :_reduce_649, + 1, 291, :_reduce_650, + 1, 269, :_reduce_none, + 1, 269, :_reduce_652, + 1, 366, :_reduce_653, + 1, 367, :_reduce_654, + 3, 367, :_reduce_655, + 1, 283, :_reduce_656, + 3, 283, :_reduce_657, + 1, 368, :_reduce_658, + 2, 369, :_reduce_659, + 1, 369, :_reduce_660, + 2, 370, :_reduce_661, + 1, 370, :_reduce_662, + 1, 277, :_reduce_663, + 3, 277, :_reduce_664, + 1, 363, :_reduce_665, + 3, 363, :_reduce_666, + 1, 339, :_reduce_none, + 1, 339, :_reduce_none, + 2, 275, :_reduce_669, + 2, 274, :_reduce_670, + 1, 274, :_reduce_671, + 3, 371, :_reduce_672, + 3, 372, :_reduce_673, + 1, 284, :_reduce_674, + 3, 284, :_reduce_675, + 1, 365, :_reduce_676, + 3, 365, :_reduce_677, + 1, 373, :_reduce_none, + 1, 373, :_reduce_none, + 2, 285, :_reduce_680, + 1, 285, :_reduce_681, + 1, 374, :_reduce_none, + 1, 374, :_reduce_none, + 2, 279, :_reduce_684, + 2, 278, :_reduce_685, + 0, 278, :_reduce_686, + 1, 194, :_reduce_none, + 3, 194, :_reduce_688, + 0, 250, :_reduce_689, + 2, 250, :_reduce_none, + 1, 234, :_reduce_691, + 3, 234, :_reduce_692, + 3, 375, :_reduce_693, + 2, 375, :_reduce_694, + 4, 375, :_reduce_695, + 2, 375, :_reduce_696, + 1, 206, :_reduce_none, + 1, 206, :_reduce_none, + 1, 206, :_reduce_none, + 1, 200, :_reduce_none, + 1, 200, :_reduce_none, + 1, 200, :_reduce_none, + 1, 200, :_reduce_none, + 1, 302, :_reduce_none, + 1, 302, :_reduce_none, + 1, 302, :_reduce_none, + 1, 195, :_reduce_none, + 1, 195, :_reduce_none, + 1, 181, :_reduce_709, + 1, 181, :_reduce_710, + 0, 151, :_reduce_none, + 1, 151, :_reduce_none, + 0, 183, :_reduce_none, + 1, 183, :_reduce_none, + 2, 211, :_reduce_715, + 2, 180, :_reduce_716, + 2, 326, :_reduce_717, + 0, 233, :_reduce_none, + 1, 233, :_reduce_none, + 1, 233, :_reduce_none, + 1, 260, :_reduce_721, + 1, 260, :_reduce_none, + 1, 153, :_reduce_none, + 2, 153, :_reduce_none, + 0, 231, :_reduce_725 ] + +racc_reduce_n = 726 + +racc_shift_n = 1219 + +racc_token_table = { + false => 0, + :error => 1, + :kCLASS => 2, + :kMODULE => 3, + :kDEF => 4, + :kUNDEF => 5, + :kBEGIN => 6, + :kRESCUE => 7, + :kENSURE => 8, + :kEND => 9, + :kIF => 10, + :kUNLESS => 11, + :kTHEN => 12, + :kELSIF => 13, + :kELSE => 14, + :kCASE => 15, + :kWHEN => 16, + :kWHILE => 17, + :kUNTIL => 18, + :kFOR => 19, + :kBREAK => 20, + :kNEXT => 21, + :kREDO => 22, + :kRETRY => 23, + :kIN => 24, + :kDO => 25, + :kDO_COND => 26, + :kDO_BLOCK => 27, + :kDO_LAMBDA => 28, + :kRETURN => 29, + :kYIELD => 30, + :kSUPER => 31, + :kSELF => 32, + :kNIL => 33, + :kTRUE => 34, + :kFALSE => 35, + :kAND => 36, + :kOR => 37, + :kNOT => 38, + :kIF_MOD => 39, + :kUNLESS_MOD => 40, + :kWHILE_MOD => 41, + :kUNTIL_MOD => 42, + :kRESCUE_MOD => 43, + :kALIAS => 44, + :kDEFINED => 45, + :klBEGIN => 46, + :klEND => 47, + :k__LINE__ => 48, + :k__FILE__ => 49, + :k__ENCODING__ => 50, + :tIDENTIFIER => 51, + :tFID => 52, + :tGVAR => 53, + :tIVAR => 54, + :tCONSTANT => 55, + :tLABEL => 56, + :tCVAR => 57, + :tNTH_REF => 58, + :tBACK_REF => 59, + :tSTRING_CONTENT => 60, + :tINTEGER => 61, + :tFLOAT => 62, + :tUPLUS => 63, + :tUMINUS => 64, + :tUNARY_NUM => 65, + :tPOW => 66, + :tCMP => 67, + :tEQ => 68, + :tEQQ => 69, + :tNEQ => 70, + :tGEQ => 71, + :tLEQ => 72, + :tANDOP => 73, + :tOROP => 74, + :tMATCH => 75, + :tNMATCH => 76, + :tDOT => 77, + :tDOT2 => 78, + :tDOT3 => 79, + :tAREF => 80, + :tASET => 81, + :tLSHFT => 82, + :tRSHFT => 83, + :tCOLON2 => 84, + :tCOLON3 => 85, + :tOP_ASGN => 86, + :tASSOC => 87, + :tLPAREN => 88, + :tLPAREN2 => 89, + :tRPAREN => 90, + :tLPAREN_ARG => 91, + :tLBRACK => 92, + :tLBRACK2 => 93, + :tRBRACK => 94, + :tLBRACE => 95, + :tLBRACE_ARG => 96, + :tSTAR => 97, + :tSTAR2 => 98, + :tAMPER => 99, + :tAMPER2 => 100, + :tTILDE => 101, + :tPERCENT => 102, + :tDIVIDE => 103, + :tDSTAR => 104, + :tPLUS => 105, + :tMINUS => 106, + :tLT => 107, + :tGT => 108, + :tPIPE => 109, + :tBANG => 110, + :tCARET => 111, + :tLCURLY => 112, + :tRCURLY => 113, + :tBACK_REF2 => 114, + :tSYMBEG => 115, + :tSTRING_BEG => 116, + :tXSTRING_BEG => 117, + :tREGEXP_BEG => 118, + :tREGEXP_OPT => 119, + :tWORDS_BEG => 120, + :tQWORDS_BEG => 121, + :tSYMBOLS_BEG => 122, + :tQSYMBOLS_BEG => 123, + :tSTRING_DBEG => 124, + :tSTRING_DVAR => 125, + :tSTRING_END => 126, + :tSTRING_DEND => 127, + :tSTRING => 128, + :tSYMBOL => 129, + :tNL => 130, + :tEH => 131, + :tCOLON => 132, + :tCOMMA => 133, + :tSPACE => 134, + :tSEMI => 135, + :tLAMBDA => 136, + :tLAMBEG => 137, + :tCHARACTER => 138, + :tRATIONAL => 139, + :tIMAGINARY => 140, + :tLABEL_END => 141, + :tANDDOT => 142, + :tBDOT2 => 143, + :tBDOT3 => 144, + :tEQL => 145, + :tLOWEST => 146 } + +racc_nt_base = 147 + +racc_use_result_var = true + +Racc_arg = [ + racc_action_table, + racc_action_check, + racc_action_default, + racc_action_pointer, + racc_goto_table, + racc_goto_check, + racc_goto_default, + racc_goto_pointer, + racc_nt_base, + racc_reduce_table, + racc_token_table, + racc_shift_n, + racc_reduce_n, + racc_use_result_var ] + +Racc_token_to_s_table = [ + "$end", + "error", + "kCLASS", + "kMODULE", + "kDEF", + "kUNDEF", + "kBEGIN", + "kRESCUE", + "kENSURE", + "kEND", + "kIF", + "kUNLESS", + "kTHEN", + "kELSIF", + "kELSE", + "kCASE", + "kWHEN", + "kWHILE", + "kUNTIL", + "kFOR", + "kBREAK", + "kNEXT", + "kREDO", + "kRETRY", + "kIN", + "kDO", + "kDO_COND", + "kDO_BLOCK", + "kDO_LAMBDA", + "kRETURN", + "kYIELD", + "kSUPER", + "kSELF", + "kNIL", + "kTRUE", + "kFALSE", + "kAND", + "kOR", + "kNOT", + "kIF_MOD", + "kUNLESS_MOD", + "kWHILE_MOD", + "kUNTIL_MOD", + "kRESCUE_MOD", + "kALIAS", + "kDEFINED", + "klBEGIN", + "klEND", + "k__LINE__", + "k__FILE__", + "k__ENCODING__", + "tIDENTIFIER", + "tFID", + "tGVAR", + "tIVAR", + "tCONSTANT", + "tLABEL", + "tCVAR", + "tNTH_REF", + "tBACK_REF", + "tSTRING_CONTENT", + "tINTEGER", + "tFLOAT", + "tUPLUS", + "tUMINUS", + "tUNARY_NUM", + "tPOW", + "tCMP", + "tEQ", + "tEQQ", + "tNEQ", + "tGEQ", + "tLEQ", + "tANDOP", + "tOROP", + "tMATCH", + "tNMATCH", + "tDOT", + "tDOT2", + "tDOT3", + "tAREF", + "tASET", + "tLSHFT", + "tRSHFT", + "tCOLON2", + "tCOLON3", + "tOP_ASGN", + "tASSOC", + "tLPAREN", + "tLPAREN2", + "tRPAREN", + "tLPAREN_ARG", + "tLBRACK", + "tLBRACK2", + "tRBRACK", + "tLBRACE", + "tLBRACE_ARG", + "tSTAR", + "tSTAR2", + "tAMPER", + "tAMPER2", + "tTILDE", + "tPERCENT", + "tDIVIDE", + "tDSTAR", + "tPLUS", + "tMINUS", + "tLT", + "tGT", + "tPIPE", + "tBANG", + "tCARET", + "tLCURLY", + "tRCURLY", + "tBACK_REF2", + "tSYMBEG", + "tSTRING_BEG", + "tXSTRING_BEG", + "tREGEXP_BEG", + "tREGEXP_OPT", + "tWORDS_BEG", + "tQWORDS_BEG", + "tSYMBOLS_BEG", + "tQSYMBOLS_BEG", + "tSTRING_DBEG", + "tSTRING_DVAR", + "tSTRING_END", + "tSTRING_DEND", + "tSTRING", + "tSYMBOL", + "tNL", + "tEH", + "tCOLON", + "tCOMMA", + "tSPACE", + "tSEMI", + "tLAMBDA", + "tLAMBEG", + "tCHARACTER", + "tRATIONAL", + "tIMAGINARY", + "tLABEL_END", + "tANDDOT", + "tBDOT2", + "tBDOT3", + "tEQL", + "tLOWEST", + "$start", + "program", + "top_compstmt", + "top_stmts", + "opt_terms", + "top_stmt", + "terms", + "stmt", + "begin_block", + "bodystmt", + "compstmt", + "opt_rescue", + "opt_else", + "opt_ensure", + "stmts", + "stmt_or_begin", + "fitem", + "undef_list", + "expr_value", + "command_asgn", + "mlhs", + "command_call", + "lhs", + "mrhs", + "mrhs_arg", + "rassign", + "expr", + "@1", + "arg_value", + "command_rhs", + "var_lhs", + "primary_value", + "opt_call_args", + "rbracket", + "call_op", + "backref", + "opt_nl", + "arg", + "p_expr", + "@2", + "expr_value_do", + "do", + "def_name", + "@3", + "fname", + "defn_head", + "defs_head", + "singleton", + "dot_or_colon", + "@4", + "command", + "block_command", + "block_call", + "operation2", + "command_args", + "cmd_brace_block", + "brace_body", + "fcall", + "@5", + "operation", + "k_return", + "call_args", + "mlhs_basic", + "mlhs_inner", + "rparen", + "mlhs_head", + "mlhs_item", + "mlhs_node", + "mlhs_post", + "user_variable", + "keyword_variable", + "cname", + "cpath", + "op", + "reswords", + "symbol", + "@6", + "arg_rhs", + "simple_numeric", + "rel_expr", + "f_paren_args", + "primary", + "relop", + "aref_args", + "none", + "args", + "trailer", + "assocs", + "paren_args", + "args_forward", + "opt_paren_args", + "opt_block_arg", + "block_arg", + "@7", + "literal", + "strings", + "xstring", + "regexp", + "words", + "qwords", + "symbols", + "qsymbols", + "var_ref", + "assoc_list", + "brace_block", + "method_call", + "lambda", + "then", + "if_tail", + "case_body", + "p_case_body", + "for_var", + "superclass", + "term", + "f_arglist", + "@8", + "@9", + "@10", + "@11", + "@12", + "@13", + "f_marg", + "f_norm_arg", + "f_margs", + "f_marg_list", + "f_rest_marg", + "f_any_kwrest", + "f_kwrest", + "f_no_kwarg", + "block_args_tail", + "f_block_kwarg", + "opt_f_block_arg", + "f_block_arg", + "opt_block_args_tail", + "excessed_comma", + "block_param", + "f_arg", + "f_block_optarg", + "f_rest_arg", + "opt_block_param", + "block_param_def", + "opt_bv_decl", + "bv_decls", + "bvar", + "f_bad_arg", + "f_larglist", + "lambda_body", + "@14", + "@15", + "f_args", + "do_block", + "@16", + "@17", + "do_body", + "@18", + "operation3", + "@19", + "@20", + "@21", + "@22", + "@23", + "cases", + "p_top_expr", + "p_cases", + "@24", + "@25", + "p_top_expr_body", + "p_args", + "p_find", + "p_args_tail", + "p_kwargs", + "p_as", + "p_variable", + "p_alt", + "p_expr_basic", + "p_lparen", + "p_lbracket", + "p_value", + "p_const", + "rbrace", + "@26", + "@27", + "p_args_head", + "p_arg", + "p_args_post", + "p_rest", + "p_kwarg", + "p_any_kwrest", + "p_kw", + "p_kw_label", + "string_contents", + "p_kwrest", + "kwrest_mark", + "p_kwnorest", + "p_primitive", + "p_var_ref", + "exc_list", + "exc_var", + "numeric", + "string", + "string1", + "xstring_contents", + "regexp_contents", + "word_list", + "word", + "string_content", + "symbol_list", + "qword_list", + "qsym_list", + "string_dvar", + "@28", + "ssym", + "dsym", + "@29", + "args_tail", + "@30", + "f_kwarg", + "opt_args_tail", + "f_optarg", + "f_arg_asgn", + "f_arg_item", + "f_label", + "f_kw", + "f_block_kw", + "f_opt", + "f_block_opt", + "restarg_mark", + "blkarg_mark", + "assoc" ] + +Racc_debug_parser = false + +##### State transition tables end ##### + +# reduce 0 omitted + +# reduce 1 omitted + +def _reduce_2(val, _values, result) + result = @builder.compstmt(val[0]) + + result +end + +def _reduce_3(val, _values, result) + result = [] + + result +end + +def _reduce_4(val, _values, result) + result = [ val[0] ] + + result +end + +def _reduce_5(val, _values, result) + result = val[0] << val[2] + + result +end + +def _reduce_6(val, _values, result) + result = [ val[1] ] + + result +end + +# reduce 7 omitted + +def _reduce_8(val, _values, result) + result = @builder.preexe(val[0], *val[1]) + + result +end + +def _reduce_9(val, _values, result) + result = val + + result +end + +def _reduce_10(val, _values, result) + rescue_bodies = val[1] + else_t, else_ = val[2] + ensure_t, ensure_ = val[3] + + if rescue_bodies.empty? && !else_t.nil? + diagnostic :error, :useless_else, nil, else_t + end + + result = @builder.begin_body(val[0], + rescue_bodies, + else_t, else_, + ensure_t, ensure_) + + result +end + +def _reduce_11(val, _values, result) + result = @builder.compstmt(val[0]) + + result +end + +def _reduce_12(val, _values, result) + result = [] + + result +end + +def _reduce_13(val, _values, result) + result = [ val[0] ] + + result +end + +def _reduce_14(val, _values, result) + result = val[0] << val[2] + + result +end + +def _reduce_15(val, _values, result) + result = [ val[1] ] + + result +end + +# reduce 16 omitted + +def _reduce_17(val, _values, result) + diagnostic :error, :begin_in_method, nil, val[0] + + result +end + +def _reduce_18(val, _values, result) + @lexer.state = :expr_fname + + result +end + +def _reduce_19(val, _values, result) + result = @builder.alias(val[0], val[1], val[3]) + + result +end + +def _reduce_20(val, _values, result) + result = @builder.alias(val[0], + @builder.gvar(val[1]), + @builder.gvar(val[2])) + + result +end + +def _reduce_21(val, _values, result) + result = @builder.alias(val[0], + @builder.gvar(val[1]), + @builder.back_ref(val[2])) + + result +end + +def _reduce_22(val, _values, result) + diagnostic :error, :nth_ref_alias, nil, val[2] + + result +end + +def _reduce_23(val, _values, result) + result = @builder.undef_method(val[0], val[1]) + + result +end + +def _reduce_24(val, _values, result) + result = @builder.condition_mod(val[0], nil, + val[1], val[2]) + + result +end + +def _reduce_25(val, _values, result) + result = @builder.condition_mod(nil, val[0], + val[1], val[2]) + + result +end + +def _reduce_26(val, _values, result) + result = @builder.loop_mod(:while, val[0], val[1], val[2]) + + result +end + +def _reduce_27(val, _values, result) + result = @builder.loop_mod(:until, val[0], val[1], val[2]) + + result +end + +def _reduce_28(val, _values, result) + rescue_body = @builder.rescue_body(val[1], + nil, nil, nil, + nil, val[2]) + + result = @builder.begin_body(val[0], [ rescue_body ]) + + result +end + +def _reduce_29(val, _values, result) + result = @builder.postexe(val[0], val[1], val[2], val[3]) + + result +end + +# reduce 30 omitted + +def _reduce_31(val, _values, result) + result = @builder.multi_assign(val[0], val[1], val[2]) + + result +end + +def _reduce_32(val, _values, result) + result = @builder.assign(val[0], val[1], + @builder.array(nil, val[2], nil)) + + result +end + +def _reduce_33(val, _values, result) + rescue_body = @builder.rescue_body(val[3], + nil, nil, nil, + nil, val[4]) + begin_body = @builder.begin_body(val[2], [ rescue_body ]) + + result = @builder.multi_assign(val[0], val[1], begin_body) + + result +end + +def _reduce_34(val, _values, result) + result = @builder.multi_assign(val[0], val[1], val[2]) + + result +end + +# reduce 35 omitted + +# reduce 36 omitted + +def _reduce_37(val, _values, result) + result = @builder.rassign(val[0], val[1], val[2]) + + result +end + +def _reduce_38(val, _values, result) + result = @builder.multi_rassign(val[0], val[1], val[2]) + + result +end + +def _reduce_39(val, _values, result) + result = @builder.rassign(val[0], val[1], val[2]) + + result +end + +def _reduce_40(val, _values, result) + result = @builder.multi_rassign(val[0], val[1], val[2]) + + result +end + +def _reduce_41(val, _values, result) + result = @builder.assign(val[0], val[1], val[2]) + + result +end + +def _reduce_42(val, _values, result) + result = @builder.op_assign(val[0], val[1], val[2]) + + result +end + +def _reduce_43(val, _values, result) + result = @builder.op_assign( + @builder.index( + val[0], val[1], val[2], val[3]), + val[4], val[5]) + + result +end + +def _reduce_44(val, _values, result) + result = @builder.op_assign( + @builder.call_method( + val[0], val[1], val[2]), + val[3], val[4]) + + result +end + +def _reduce_45(val, _values, result) + result = @builder.op_assign( + @builder.call_method( + val[0], val[1], val[2]), + val[3], val[4]) + + result +end + +def _reduce_46(val, _values, result) + const = @builder.const_op_assignable( + @builder.const_fetch(val[0], val[1], val[2])) + result = @builder.op_assign(const, val[3], val[4]) + + result +end + +def _reduce_47(val, _values, result) + result = @builder.op_assign( + @builder.call_method( + val[0], val[1], val[2]), + val[3], val[4]) + + result +end + +def _reduce_48(val, _values, result) + @builder.op_assign(val[0], val[1], val[2]) + + result +end + +# reduce 49 omitted + +def _reduce_50(val, _values, result) + rescue_body = @builder.rescue_body(val[1], + nil, nil, nil, + nil, val[2]) + + result = @builder.begin_body(val[0], [ rescue_body ]) + + result +end + +# reduce 51 omitted + +# reduce 52 omitted + +def _reduce_53(val, _values, result) + result = @builder.logical_op(:and, val[0], val[1], val[2]) + + result +end + +def _reduce_54(val, _values, result) + result = @builder.logical_op(:or, val[0], val[1], val[2]) + + result +end + +def _reduce_55(val, _values, result) + result = @builder.not_op(val[0], nil, val[2], nil) + + result +end + +def _reduce_56(val, _values, result) + result = @builder.not_op(val[0], nil, val[1], nil) + + result +end + +def _reduce_57(val, _values, result) + @lexer.state = :expr_beg + @lexer.command_start = false + pattern_variables.push + + result = @lexer.in_kwarg + @lexer.in_kwarg = true + + result +end + +def _reduce_58(val, _values, result) + @lexer.in_kwarg = val[2] + result = @builder.in_match(val[0], val[1], val[3]) + + result +end + +# reduce 59 omitted + +# reduce 60 omitted + +def _reduce_61(val, _values, result) + @lexer.cond.push(true) + + result +end + +def _reduce_62(val, _values, result) + @lexer.cond.pop + result = [ val[1], val[2] ] + + result +end + +def _reduce_63(val, _values, result) + @static_env.extend_static + @lexer.cmdarg.push(false) + @lexer.cond.push(false) + @current_arg_stack.push(nil) + + result = val[0] + + result +end + +def _reduce_64(val, _values, result) + @context.push(:def) + + result = [ val[0], val[1] ] + + result +end + +def _reduce_65(val, _values, result) + @lexer.state = :expr_fname + + result +end + +def _reduce_66(val, _values, result) + @context.push(:defs) + + result = [ val[0], val[1], val[2], val[4] ] + + result +end + +# reduce 67 omitted + +# reduce 68 omitted + +# reduce 69 omitted + +def _reduce_70(val, _values, result) + result = @builder.call_method(val[0], val[1], val[2], + nil, val[3], nil) + + result +end + +def _reduce_71(val, _values, result) + @context.push(:block) + + result +end + +def _reduce_72(val, _values, result) + result = [ val[0], *val[2], val[3] ] + @context.pop + + result +end + +# reduce 73 omitted + +def _reduce_74(val, _values, result) + result = @builder.call_method(nil, nil, val[0], + nil, val[1], nil) + + result +end + +def _reduce_75(val, _values, result) + method_call = @builder.call_method(nil, nil, val[0], + nil, val[1], nil) + + begin_t, args, body, end_t = val[2] + result = @builder.block(method_call, + begin_t, args, body, end_t) + + result +end + +def _reduce_76(val, _values, result) + result = @builder.call_method(val[0], val[1], val[2], + nil, val[3], nil) + + result +end + +def _reduce_77(val, _values, result) + method_call = @builder.call_method(val[0], val[1], val[2], + nil, val[3], nil) + + begin_t, args, body, end_t = val[4] + result = @builder.block(method_call, + begin_t, args, body, end_t) + + result +end + +def _reduce_78(val, _values, result) + result = @builder.call_method(val[0], val[1], val[2], + nil, val[3], nil) + + result +end + +def _reduce_79(val, _values, result) + method_call = @builder.call_method(val[0], val[1], val[2], + nil, val[3], nil) + + begin_t, args, body, end_t = val[4] + result = @builder.block(method_call, + begin_t, args, body, end_t) + + result +end + +def _reduce_80(val, _values, result) + result = @builder.keyword_cmd(:super, val[0], + nil, val[1], nil) + + result +end + +def _reduce_81(val, _values, result) + result = @builder.keyword_cmd(:yield, val[0], + nil, val[1], nil) + + result +end + +def _reduce_82(val, _values, result) + result = @builder.keyword_cmd(:return, val[0], + nil, val[1], nil) + + result +end + +def _reduce_83(val, _values, result) + result = @builder.keyword_cmd(:break, val[0], + nil, val[1], nil) + + result +end + +def _reduce_84(val, _values, result) + result = @builder.keyword_cmd(:next, val[0], + nil, val[1], nil) + + result +end + +def _reduce_85(val, _values, result) + result = @builder.multi_lhs(nil, val[0], nil) + + result +end + +def _reduce_86(val, _values, result) + result = @builder.begin(val[0], val[1], val[2]) + + result +end + +def _reduce_87(val, _values, result) + result = @builder.multi_lhs(nil, val[0], nil) + + result +end + +def _reduce_88(val, _values, result) + result = @builder.multi_lhs(val[0], val[1], val[2]) + + result +end + +# reduce 89 omitted + +def _reduce_90(val, _values, result) + result = val[0]. + push(val[1]) + + result +end + +def _reduce_91(val, _values, result) + result = val[0]. + push(@builder.splat(val[1], val[2])) + + result +end + +def _reduce_92(val, _values, result) + result = val[0]. + push(@builder.splat(val[1], val[2])). + concat(val[4]) + + result +end + +def _reduce_93(val, _values, result) + result = val[0]. + push(@builder.splat(val[1])) + + result +end + +def _reduce_94(val, _values, result) + result = val[0]. + push(@builder.splat(val[1])). + concat(val[3]) + + result +end + +def _reduce_95(val, _values, result) + result = [ @builder.splat(val[0], val[1]) ] + + result +end + +def _reduce_96(val, _values, result) + result = [ @builder.splat(val[0], val[1]), + *val[3] ] + + result +end + +def _reduce_97(val, _values, result) + result = [ @builder.splat(val[0]) ] + + result +end + +def _reduce_98(val, _values, result) + result = [ @builder.splat(val[0]), + *val[2] ] + + result +end + +# reduce 99 omitted + +def _reduce_100(val, _values, result) + result = @builder.begin(val[0], val[1], val[2]) + + result +end + +def _reduce_101(val, _values, result) + result = [ val[0] ] + + result +end + +def _reduce_102(val, _values, result) + result = val[0] << val[1] + + result +end + +def _reduce_103(val, _values, result) + result = [ val[0] ] + + result +end + +def _reduce_104(val, _values, result) + result = val[0] << val[2] + + result +end + +def _reduce_105(val, _values, result) + result = @builder.assignable(val[0]) + + result +end + +def _reduce_106(val, _values, result) + result = @builder.assignable(val[0]) + + result +end + +def _reduce_107(val, _values, result) + result = @builder.index_asgn(val[0], val[1], val[2], val[3]) + + result +end + +def _reduce_108(val, _values, result) + if (val[1][0] == :anddot) + diagnostic :error, :csend_in_lhs_of_masgn, nil, val[1] + end + + result = @builder.attr_asgn(val[0], val[1], val[2]) + + result +end + +def _reduce_109(val, _values, result) + result = @builder.attr_asgn(val[0], val[1], val[2]) + + result +end + +def _reduce_110(val, _values, result) + if (val[1][0] == :anddot) + diagnostic :error, :csend_in_lhs_of_masgn, nil, val[1] + end + + result = @builder.attr_asgn(val[0], val[1], val[2]) + + result +end + +def _reduce_111(val, _values, result) + result = @builder.assignable( + @builder.const_fetch(val[0], val[1], val[2])) + + result +end + +def _reduce_112(val, _values, result) + result = @builder.assignable( + @builder.const_global(val[0], val[1])) + + result +end + +def _reduce_113(val, _values, result) + result = @builder.assignable(val[0]) + + result +end + +def _reduce_114(val, _values, result) + result = @builder.assignable(val[0]) + + result +end + +def _reduce_115(val, _values, result) + result = @builder.assignable(val[0]) + + result +end + +def _reduce_116(val, _values, result) + result = @builder.index_asgn(val[0], val[1], val[2], val[3]) + + result +end + +def _reduce_117(val, _values, result) + result = @builder.attr_asgn(val[0], val[1], val[2]) + + result +end + +def _reduce_118(val, _values, result) + result = @builder.attr_asgn(val[0], val[1], val[2]) + + result +end + +def _reduce_119(val, _values, result) + result = @builder.attr_asgn(val[0], val[1], val[2]) + + result +end + +def _reduce_120(val, _values, result) + result = @builder.assignable( + @builder.const_fetch(val[0], val[1], val[2])) + + result +end + +def _reduce_121(val, _values, result) + result = @builder.assignable( + @builder.const_global(val[0], val[1])) + + result +end + +def _reduce_122(val, _values, result) + result = @builder.assignable(val[0]) + + result +end + +def _reduce_123(val, _values, result) + diagnostic :error, :module_name_const, nil, val[0] + + result +end + +# reduce 124 omitted + +def _reduce_125(val, _values, result) + result = @builder.const_global(val[0], val[1]) + + result +end + +def _reduce_126(val, _values, result) + result = @builder.const(val[0]) + + result +end + +def _reduce_127(val, _values, result) + result = @builder.const_fetch(val[0], val[1], val[2]) + + result +end + +# reduce 128 omitted + +# reduce 129 omitted + +# reduce 130 omitted + +# reduce 131 omitted + +# reduce 132 omitted + +def _reduce_133(val, _values, result) + result = @builder.symbol(val[0]) + + result +end + +# reduce 134 omitted + +def _reduce_135(val, _values, result) + result = [ val[0] ] + + result +end + +def _reduce_136(val, _values, result) + @lexer.state = :expr_fname + + result +end + +def _reduce_137(val, _values, result) + result = val[0] << val[3] + + result +end + +# reduce 138 omitted + +# reduce 139 omitted + +# reduce 140 omitted + +# reduce 141 omitted + +# reduce 142 omitted + +# reduce 143 omitted + +# reduce 144 omitted + +# reduce 145 omitted + +# reduce 146 omitted + +# reduce 147 omitted + +# reduce 148 omitted + +# reduce 149 omitted + +# reduce 150 omitted + +# reduce 151 omitted + +# reduce 152 omitted + +# reduce 153 omitted + +# reduce 154 omitted + +# reduce 155 omitted + +# reduce 156 omitted + +# reduce 157 omitted + +# reduce 158 omitted + +# reduce 159 omitted + +# reduce 160 omitted + +# reduce 161 omitted + +# reduce 162 omitted + +# reduce 163 omitted + +# reduce 164 omitted + +# reduce 165 omitted + +# reduce 166 omitted + +# reduce 167 omitted + +# reduce 168 omitted + +# reduce 169 omitted + +# reduce 170 omitted + +# reduce 171 omitted + +# reduce 172 omitted + +# reduce 173 omitted + +# reduce 174 omitted + +# reduce 175 omitted + +# reduce 176 omitted + +# reduce 177 omitted + +# reduce 178 omitted + +# reduce 179 omitted + +# reduce 180 omitted + +# reduce 181 omitted + +# reduce 182 omitted + +# reduce 183 omitted + +# reduce 184 omitted + +# reduce 185 omitted + +# reduce 186 omitted + +# reduce 187 omitted + +# reduce 188 omitted + +# reduce 189 omitted + +# reduce 190 omitted + +# reduce 191 omitted + +# reduce 192 omitted + +# reduce 193 omitted + +# reduce 194 omitted + +# reduce 195 omitted + +# reduce 196 omitted + +# reduce 197 omitted + +# reduce 198 omitted + +# reduce 199 omitted + +# reduce 200 omitted + +# reduce 201 omitted + +# reduce 202 omitted + +# reduce 203 omitted + +# reduce 204 omitted + +# reduce 205 omitted + +# reduce 206 omitted + +# reduce 207 omitted + +# reduce 208 omitted + +def _reduce_209(val, _values, result) + result = @builder.assign(val[0], val[1], val[2]) + + result +end + +def _reduce_210(val, _values, result) + result = @builder.op_assign(val[0], val[1], val[2]) + + result +end + +def _reduce_211(val, _values, result) + result = @builder.op_assign( + @builder.index( + val[0], val[1], val[2], val[3]), + val[4], val[5]) + + result +end + +def _reduce_212(val, _values, result) + result = @builder.op_assign( + @builder.call_method( + val[0], val[1], val[2]), + val[3], val[4]) + + result +end + +def _reduce_213(val, _values, result) + result = @builder.op_assign( + @builder.call_method( + val[0], val[1], val[2]), + val[3], val[4]) + + result +end + +def _reduce_214(val, _values, result) + result = @builder.op_assign( + @builder.call_method( + val[0], val[1], val[2]), + val[3], val[4]) + + result +end + +def _reduce_215(val, _values, result) + const = @builder.const_op_assignable( + @builder.const_fetch(val[0], val[1], val[2])) + result = @builder.op_assign(const, val[3], val[4]) + + result +end + +def _reduce_216(val, _values, result) + const = @builder.const_op_assignable( + @builder.const_global(val[0], val[1])) + result = @builder.op_assign(const, val[2], val[3]) + + result +end + +def _reduce_217(val, _values, result) + result = @builder.op_assign(val[0], val[1], val[2]) + + result +end + +def _reduce_218(val, _values, result) + result = @builder.range_inclusive(val[0], val[1], val[2]) + + result +end + +def _reduce_219(val, _values, result) + result = @builder.range_exclusive(val[0], val[1], val[2]) + + result +end + +def _reduce_220(val, _values, result) + result = @builder.range_inclusive(val[0], val[1], nil) + + result +end + +def _reduce_221(val, _values, result) + result = @builder.range_exclusive(val[0], val[1], nil) + + result +end + +def _reduce_222(val, _values, result) + result = @builder.range_inclusive(nil, val[0], val[1]) + + result +end + +def _reduce_223(val, _values, result) + result = @builder.range_exclusive(nil, val[0], val[1]) + + result +end + +def _reduce_224(val, _values, result) + result = @builder.binary_op(val[0], val[1], val[2]) + + result +end + +def _reduce_225(val, _values, result) + result = @builder.binary_op(val[0], val[1], val[2]) + + result +end + +def _reduce_226(val, _values, result) + result = @builder.binary_op(val[0], val[1], val[2]) + + result +end + +def _reduce_227(val, _values, result) + result = @builder.binary_op(val[0], val[1], val[2]) + + result +end + +def _reduce_228(val, _values, result) + result = @builder.binary_op(val[0], val[1], val[2]) + + result +end + +def _reduce_229(val, _values, result) + result = @builder.binary_op(val[0], val[1], val[2]) + + result +end + +def _reduce_230(val, _values, result) + result = @builder.unary_op(val[0], + @builder.binary_op( + val[1], val[2], val[3])) + + result +end + +def _reduce_231(val, _values, result) + result = @builder.unary_op(val[0], val[1]) + + result +end + +def _reduce_232(val, _values, result) + result = @builder.unary_op(val[0], val[1]) + + result +end + +def _reduce_233(val, _values, result) + result = @builder.binary_op(val[0], val[1], val[2]) + + result +end + +def _reduce_234(val, _values, result) + result = @builder.binary_op(val[0], val[1], val[2]) + + result +end + +def _reduce_235(val, _values, result) + result = @builder.binary_op(val[0], val[1], val[2]) + + result +end + +def _reduce_236(val, _values, result) + result = @builder.binary_op(val[0], val[1], val[2]) + + result +end + +# reduce 237 omitted + +def _reduce_238(val, _values, result) + result = @builder.binary_op(val[0], val[1], val[2]) + + result +end + +def _reduce_239(val, _values, result) + result = @builder.binary_op(val[0], val[1], val[2]) + + result +end + +def _reduce_240(val, _values, result) + result = @builder.binary_op(val[0], val[1], val[2]) + + result +end + +def _reduce_241(val, _values, result) + result = @builder.match_op(val[0], val[1], val[2]) + + result +end + +def _reduce_242(val, _values, result) + result = @builder.binary_op(val[0], val[1], val[2]) + + result +end + +def _reduce_243(val, _values, result) + result = @builder.not_op(val[0], nil, val[1], nil) + + result +end + +def _reduce_244(val, _values, result) + result = @builder.unary_op(val[0], val[1]) + + result +end + +def _reduce_245(val, _values, result) + result = @builder.binary_op(val[0], val[1], val[2]) + + result +end + +def _reduce_246(val, _values, result) + result = @builder.binary_op(val[0], val[1], val[2]) + + result +end + +def _reduce_247(val, _values, result) + result = @builder.logical_op(:and, val[0], val[1], val[2]) + + result +end + +def _reduce_248(val, _values, result) + result = @builder.logical_op(:or, val[0], val[1], val[2]) + + result +end + +def _reduce_249(val, _values, result) + result = @builder.keyword_cmd(:defined?, val[0], nil, [ val[2] ], nil) + + result +end + +def _reduce_250(val, _values, result) + result = @builder.ternary(val[0], val[1], + val[2], val[4], val[5]) + + result +end + +def _reduce_251(val, _values, result) + result = @builder.def_endless_method(*val[0], + val[1], val[2], val[3]) + + @lexer.cmdarg.pop + @lexer.cond.pop + @static_env.unextend + @context.pop + @current_arg_stack.pop + + result +end + +def _reduce_252(val, _values, result) + rescue_body = @builder.rescue_body(val[4], + nil, nil, nil, + nil, val[5]) + + method_body = @builder.begin_body(val[3], [ rescue_body ]) + + result = @builder.def_endless_method(*val[0], + val[1], val[2], method_body) + + @lexer.cmdarg.pop + @lexer.cond.pop + @static_env.unextend + @context.pop + @current_arg_stack.pop + + result +end + +def _reduce_253(val, _values, result) + result = @builder.def_endless_singleton(*val[0], + val[1], val[2], val[3]) + + @lexer.cmdarg.pop + @lexer.cond.pop + @static_env.unextend + @context.pop + @current_arg_stack.pop + + result +end + +def _reduce_254(val, _values, result) + rescue_body = @builder.rescue_body(val[4], + nil, nil, nil, + nil, val[5]) + + method_body = @builder.begin_body(val[3], [ rescue_body ]) + + result = @builder.def_endless_singleton(*val[0], + val[1], val[2], method_body) + + @lexer.cmdarg.pop + @lexer.cond.pop + @static_env.unextend + @context.pop + @current_arg_stack.pop + + result +end + +# reduce 255 omitted + +# reduce 256 omitted + +# reduce 257 omitted + +# reduce 258 omitted + +# reduce 259 omitted + +def _reduce_260(val, _values, result) + result = @builder.binary_op(val[0], val[1], val[2]) + + result +end + +def _reduce_261(val, _values, result) + result = @builder.binary_op(val[0], val[1], val[2]) + + result +end + +# reduce 262 omitted + +# reduce 263 omitted + +# reduce 264 omitted + +def _reduce_265(val, _values, result) + result = val[0] << @builder.associate(nil, val[2], nil) + + result +end + +def _reduce_266(val, _values, result) + result = [ @builder.associate(nil, val[0], nil) ] + + result +end + +# reduce 267 omitted + +def _reduce_268(val, _values, result) + rescue_body = @builder.rescue_body(val[1], + nil, nil, nil, + nil, val[2]) + + result = @builder.begin_body(val[0], [ rescue_body ]) + + result +end + +def _reduce_269(val, _values, result) + result = val + + result +end + +def _reduce_270(val, _values, result) + unless @static_env.declared_forward_args? + diagnostic :error, :unexpected_token, { :token => 'tBDOT3' } , val[3] + end + + result = [val[0], [*val[1], @builder.forwarded_args(val[3])], val[4]] + + result +end + +def _reduce_271(val, _values, result) + unless @static_env.declared_forward_args? + diagnostic :error, :unexpected_token, { :token => 'tBDOT3' } , val[1] + end + + result = [val[0], [@builder.forwarded_args(val[1])], val[2]] + + result +end + +def _reduce_272(val, _values, result) + result = [ nil, [], nil ] + + result +end + +# reduce 273 omitted + +def _reduce_274(val, _values, result) + result = [] + + result +end + +# reduce 275 omitted + +# reduce 276 omitted + +def _reduce_277(val, _values, result) + result = val[0] << @builder.associate(nil, val[2], nil) + + result +end + +def _reduce_278(val, _values, result) + result = [ @builder.associate(nil, val[0], nil) ] + + result +end + +def _reduce_279(val, _values, result) + result = [ val[0] ] + + result +end + +def _reduce_280(val, _values, result) + result = val[0].concat(val[1]) + + result +end + +def _reduce_281(val, _values, result) + result = [ @builder.associate(nil, val[0], nil) ] + result.concat(val[1]) + + result +end + +def _reduce_282(val, _values, result) + assocs = @builder.associate(nil, val[2], nil) + result = val[0] << assocs + result.concat(val[3]) + + result +end + +def _reduce_283(val, _values, result) + result = [ val[0] ] + + result +end + +def _reduce_284(val, _values, result) + # When branch gets invoked by RACC's lookahead + # and command args start with '[' or '(' + # we need to put `true` to the cmdarg stack + # **before** `false` pushed by lexer + # m [], n + # ^ + # Right here we have cmdarg [...0] because + # lexer pushed it on '[' + # We need to modify cmdarg stack to [...10] + # + # For all other cases (like `m n` or `m n, []`) we simply put 1 to the stack + # and later lexer pushes corresponding bits on top of it. + last_token = @last_token[0] + lookahead = last_token == :tLBRACK || last_token == :tLPAREN_ARG + + if lookahead + top = @lexer.cmdarg.pop + @lexer.cmdarg.push(true) + @lexer.cmdarg.push(top) + else + @lexer.cmdarg.push(true) + end + + result +end + +def _reduce_285(val, _values, result) + # call_args can be followed by tLBRACE_ARG (that does cmdarg.push(0) in the lexer) + # but the push must be done after cmdarg.pop() in the parser. + # So this code does cmdarg.pop() to pop 0 pushed by tLBRACE_ARG, + # cmdarg.pop() to pop 1 pushed by command_args, + # and cmdarg.push(0) to restore back the flag set by tLBRACE_ARG. + last_token = @last_token[0] + lookahead = last_token == :tLBRACE_ARG + if lookahead + top = @lexer.cmdarg.pop + @lexer.cmdarg.pop + @lexer.cmdarg.push(top) + else + @lexer.cmdarg.pop + end + + result = val[1] + + result +end + +def _reduce_286(val, _values, result) + result = @builder.block_pass(val[0], val[1]) + + result +end + +def _reduce_287(val, _values, result) + result = [ val[1] ] + + result +end + +def _reduce_288(val, _values, result) + result = [] + + result +end + +def _reduce_289(val, _values, result) + result = [ val[0] ] + + result +end + +def _reduce_290(val, _values, result) + result = [ @builder.splat(val[0], val[1]) ] + + result +end + +def _reduce_291(val, _values, result) + result = val[0] << val[2] + + result +end + +def _reduce_292(val, _values, result) + result = val[0] << @builder.splat(val[2], val[3]) + + result +end + +def _reduce_293(val, _values, result) + result = @builder.array(nil, val[0], nil) + + result +end + +# reduce 294 omitted + +def _reduce_295(val, _values, result) + result = val[0] << val[2] + + result +end + +def _reduce_296(val, _values, result) + result = val[0] << @builder.splat(val[2], val[3]) + + result +end + +def _reduce_297(val, _values, result) + result = [ @builder.splat(val[0], val[1]) ] + + result +end + +# reduce 298 omitted + +# reduce 299 omitted + +# reduce 300 omitted + +# reduce 301 omitted + +# reduce 302 omitted + +# reduce 303 omitted + +# reduce 304 omitted + +# reduce 305 omitted + +# reduce 306 omitted + +# reduce 307 omitted + +def _reduce_308(val, _values, result) + result = @builder.call_method(nil, nil, val[0]) + + result +end + +def _reduce_309(val, _values, result) + @lexer.cmdarg.push(false) + + result +end + +def _reduce_310(val, _values, result) + @lexer.cmdarg.pop + + result = @builder.begin_keyword(val[0], val[2], val[3]) + + result +end + +def _reduce_311(val, _values, result) + @lexer.state = :expr_endarg + + result +end + +def _reduce_312(val, _values, result) + result = @builder.begin(val[0], val[1], val[3]) + + result +end + +def _reduce_313(val, _values, result) + @lexer.state = :expr_endarg + + result +end + +def _reduce_314(val, _values, result) + result = @builder.begin(val[0], nil, val[3]) + + result +end + +def _reduce_315(val, _values, result) + result = @builder.begin(val[0], val[1], val[2]) + + result +end + +def _reduce_316(val, _values, result) + result = @builder.const_fetch(val[0], val[1], val[2]) + + result +end + +def _reduce_317(val, _values, result) + result = @builder.const_global(val[0], val[1]) + + result +end + +def _reduce_318(val, _values, result) + result = @builder.array(val[0], val[1], val[2]) + + result +end + +def _reduce_319(val, _values, result) + result = @builder.associate(val[0], val[1], val[2]) + + result +end + +def _reduce_320(val, _values, result) + result = @builder.keyword_cmd(:return, val[0]) + + result +end + +def _reduce_321(val, _values, result) + result = @builder.keyword_cmd(:yield, val[0], val[1], val[2], val[3]) + + result +end + +def _reduce_322(val, _values, result) + result = @builder.keyword_cmd(:yield, val[0], val[1], [], val[2]) + + result +end + +def _reduce_323(val, _values, result) + result = @builder.keyword_cmd(:yield, val[0]) + + result +end + +def _reduce_324(val, _values, result) + result = @builder.keyword_cmd(:defined?, val[0], + val[2], [ val[3] ], val[4]) + + result +end + +def _reduce_325(val, _values, result) + result = @builder.not_op(val[0], val[1], val[2], val[3]) + + result +end + +def _reduce_326(val, _values, result) + result = @builder.not_op(val[0], val[1], nil, val[2]) + + result +end + +def _reduce_327(val, _values, result) + method_call = @builder.call_method(nil, nil, val[0]) + + begin_t, args, body, end_t = val[1] + result = @builder.block(method_call, + begin_t, args, body, end_t) + + result +end + +# reduce 328 omitted + +def _reduce_329(val, _values, result) + begin_t, args, body, end_t = val[1] + result = @builder.block(val[0], + begin_t, args, body, end_t) + + result +end + +# reduce 330 omitted + +def _reduce_331(val, _values, result) + else_t, else_ = val[4] + result = @builder.condition(val[0], val[1], val[2], + val[3], else_t, + else_, val[5]) + + result +end + +def _reduce_332(val, _values, result) + else_t, else_ = val[4] + result = @builder.condition(val[0], val[1], val[2], + else_, else_t, + val[3], val[5]) + + result +end + +def _reduce_333(val, _values, result) + result = @builder.loop(:while, val[0], *val[1], val[2], val[3]) + + result +end + +def _reduce_334(val, _values, result) + result = @builder.loop(:until, val[0], *val[1], val[2], val[3]) + + result +end + +def _reduce_335(val, _values, result) + *when_bodies, (else_t, else_body) = *val[3] + + result = @builder.case(val[0], val[1], + when_bodies, else_t, else_body, + val[4]) + + result +end + +def _reduce_336(val, _values, result) + *when_bodies, (else_t, else_body) = *val[2] + + result = @builder.case(val[0], nil, + when_bodies, else_t, else_body, + val[3]) + + result +end + +def _reduce_337(val, _values, result) + *in_bodies, (else_t, else_body) = *val[3] + + result = @builder.case_match(val[0], val[1], + in_bodies, else_t, else_body, + val[4]) + + result +end + +def _reduce_338(val, _values, result) + result = @builder.for(val[0], val[1], val[2], *val[3], val[4], val[5]) + + result +end + +def _reduce_339(val, _values, result) + @static_env.extend_static + @lexer.cmdarg.push(false) + @lexer.cond.push(false) + @context.push(:class) + + result +end + +def _reduce_340(val, _values, result) + unless @context.class_definition_allowed? + diagnostic :error, :class_in_def, nil, val[0] + end + + lt_t, superclass = val[2] + result = @builder.def_class(val[0], val[1], + lt_t, superclass, + val[4], val[5]) + + @lexer.cmdarg.pop + @lexer.cond.pop + @static_env.unextend + @context.pop + + result +end + +def _reduce_341(val, _values, result) + @static_env.extend_static + @lexer.cmdarg.push(false) + @lexer.cond.push(false) + @context.push(:sclass) + + result +end + +def _reduce_342(val, _values, result) + result = @builder.def_sclass(val[0], val[1], val[2], + val[5], val[6]) + + @lexer.cmdarg.pop + @lexer.cond.pop + @static_env.unextend + @context.pop + + result +end + +def _reduce_343(val, _values, result) + @static_env.extend_static + @lexer.cmdarg.push(false) + @context.push(:module) + + result +end + +def _reduce_344(val, _values, result) + unless @context.module_definition_allowed? + diagnostic :error, :module_in_def, nil, val[0] + end + + result = @builder.def_module(val[0], val[1], + val[3], val[4]) + + @lexer.cmdarg.pop + @static_env.unextend + @context.pop + + result +end + +def _reduce_345(val, _values, result) + result = @builder.def_method(*val[0], val[1], + val[2], val[3]) + + @lexer.cmdarg.pop + @lexer.cond.pop + @static_env.unextend + @context.pop + @current_arg_stack.pop + + result +end + +def _reduce_346(val, _values, result) + result = @builder.def_singleton(*val[0], val[1], + val[2], val[3]) + + @lexer.cmdarg.pop + @lexer.cond.pop + @static_env.unextend + @context.pop + @current_arg_stack.pop + + result +end + +def _reduce_347(val, _values, result) + result = @builder.keyword_cmd(:break, val[0]) + + result +end + +def _reduce_348(val, _values, result) + result = @builder.keyword_cmd(:next, val[0]) + + result +end + +def _reduce_349(val, _values, result) + result = @builder.keyword_cmd(:redo, val[0]) + + result +end + +def _reduce_350(val, _values, result) + result = @builder.keyword_cmd(:retry, val[0]) + + result +end + +# reduce 351 omitted + +def _reduce_352(val, _values, result) + if @context.in_class? + diagnostic :error, :invalid_return, nil, val[0] + end + + result +end + +# reduce 353 omitted + +# reduce 354 omitted + +def _reduce_355(val, _values, result) + result = val[1] + + result +end + +# reduce 356 omitted + +# reduce 357 omitted + +# reduce 358 omitted + +def _reduce_359(val, _values, result) + else_t, else_ = val[4] + result = [ val[0], + @builder.condition(val[0], val[1], val[2], + val[3], else_t, + else_, nil), + ] + + result +end + +# reduce 360 omitted + +def _reduce_361(val, _values, result) + result = val + + result +end + +# reduce 362 omitted + +# reduce 363 omitted + +def _reduce_364(val, _values, result) + result = @builder.arg(val[0]) + + result +end + +def _reduce_365(val, _values, result) + result = @builder.multi_lhs(val[0], val[1], val[2]) + + result +end + +def _reduce_366(val, _values, result) + result = [ val[0] ] + + result +end + +def _reduce_367(val, _values, result) + result = val[0] << val[2] + + result +end + +# reduce 368 omitted + +def _reduce_369(val, _values, result) + result = val[0]. + push(val[2]) + + result +end + +def _reduce_370(val, _values, result) + result = val[0]. + push(val[2]). + concat(val[4]) + + result +end + +def _reduce_371(val, _values, result) + result = [ val[0] ] + + result +end + +def _reduce_372(val, _values, result) + result = [ val[0], *val[2] ] + + result +end + +def _reduce_373(val, _values, result) + result = @builder.restarg(val[0], val[1]) + + result +end + +def _reduce_374(val, _values, result) + result = @builder.restarg(val[0]) + + result +end + +# reduce 375 omitted + +# reduce 376 omitted + +def _reduce_377(val, _values, result) + result = val[0].concat(val[2]).concat(val[3]) + + result +end + +def _reduce_378(val, _values, result) + result = val[0].concat(val[1]) + + result +end + +def _reduce_379(val, _values, result) + result = val[0].concat(val[1]) + + result +end + +def _reduce_380(val, _values, result) + result = [ val[0] ] + + result +end + +def _reduce_381(val, _values, result) + result = val[1] + + result +end + +def _reduce_382(val, _values, result) + result = [] + + result +end + +# reduce 383 omitted + +def _reduce_384(val, _values, result) + result = val[0]. + concat(val[2]). + concat(val[4]). + concat(val[5]) + + result +end + +def _reduce_385(val, _values, result) + result = val[0]. + concat(val[2]). + concat(val[4]). + concat(val[6]). + concat(val[7]) + + result +end + +def _reduce_386(val, _values, result) + result = val[0]. + concat(val[2]). + concat(val[3]) + + result +end + +def _reduce_387(val, _values, result) + result = val[0]. + concat(val[2]). + concat(val[4]). + concat(val[5]) + + result +end + +def _reduce_388(val, _values, result) + result = val[0]. + concat(val[2]). + concat(val[3]) + + result +end + +# reduce 389 omitted + +def _reduce_390(val, _values, result) + result = val[0]. + concat(val[2]). + concat(val[4]). + concat(val[5]) + + result +end + +def _reduce_391(val, _values, result) + if val[1].empty? && val[0].size == 1 + result = [@builder.procarg0(val[0][0])] + else + result = val[0].concat(val[1]) + end + + result +end + +def _reduce_392(val, _values, result) + result = val[0]. + concat(val[2]). + concat(val[3]) + + result +end + +def _reduce_393(val, _values, result) + result = val[0]. + concat(val[2]). + concat(val[4]). + concat(val[5]) + + result +end + +def _reduce_394(val, _values, result) + result = val[0]. + concat(val[1]) + + result +end + +def _reduce_395(val, _values, result) + result = val[0]. + concat(val[2]). + concat(val[3]) + + result +end + +def _reduce_396(val, _values, result) + result = val[0]. + concat(val[1]) + + result +end + +def _reduce_397(val, _values, result) + result = val[0]. + concat(val[2]). + concat(val[3]) + + result +end + +# reduce 398 omitted + +def _reduce_399(val, _values, result) + result = @builder.args(nil, [], nil) + + result +end + +def _reduce_400(val, _values, result) + @lexer.state = :expr_value + + result +end + +def _reduce_401(val, _values, result) + @max_numparam_stack.has_ordinary_params! + @current_arg_stack.set(nil) + result = @builder.args(val[0], val[1], val[2]) + + result +end + +def _reduce_402(val, _values, result) + @max_numparam_stack.has_ordinary_params! + @current_arg_stack.set(nil) + result = @builder.args(val[0], val[1].concat(val[2]), val[3]) + + result +end + +def _reduce_403(val, _values, result) + result = [] + + result +end + +def _reduce_404(val, _values, result) + result = val[2] + + result +end + +def _reduce_405(val, _values, result) + result = [ val[0] ] + + result +end + +def _reduce_406(val, _values, result) + result = val[0] << val[2] + + result +end + +def _reduce_407(val, _values, result) + @static_env.declare val[0][0] + result = @builder.shadowarg(val[0]) + + result +end + +# reduce 408 omitted + +def _reduce_409(val, _values, result) + @static_env.extend_dynamic + @max_numparam_stack.push + @context.push(:lambda) + + result +end + +def _reduce_410(val, _values, result) + @context.pop + @lexer.cmdarg.push(false) + + result +end + +def _reduce_411(val, _values, result) + lambda_call = @builder.call_lambda(val[0]) + args = @max_numparam_stack.has_numparams? ? @builder.numargs(@max_numparam_stack.top) : val[2] + begin_t, body, end_t = val[4] + + @max_numparam_stack.pop + @static_env.unextend + @lexer.cmdarg.pop + + result = @builder.block(lambda_call, + begin_t, args, body, end_t) + + result +end + +def _reduce_412(val, _values, result) + @max_numparam_stack.has_ordinary_params! + result = @builder.args(val[0], val[1].concat(val[2]), val[3]) + + result +end + +def _reduce_413(val, _values, result) + if val[0].any? + @max_numparam_stack.has_ordinary_params! + end + result = @builder.args(nil, val[0], nil) + + result +end + +def _reduce_414(val, _values, result) + @context.push(:lambda) + + result +end + +def _reduce_415(val, _values, result) + result = [ val[0], val[2], val[3] ] + @context.pop + + result +end + +def _reduce_416(val, _values, result) + @context.push(:lambda) + + result +end + +def _reduce_417(val, _values, result) + result = [ val[0], val[2], val[3] ] + @context.pop + + result +end + +def _reduce_418(val, _values, result) + @context.push(:block) + + result +end + +def _reduce_419(val, _values, result) + result = [ val[0], *val[2], val[3] ] + @context.pop + + result +end + +def _reduce_420(val, _values, result) + begin_t, block_args, body, end_t = val[1] + result = @builder.block(val[0], + begin_t, block_args, body, end_t) + + result +end + +def _reduce_421(val, _values, result) + lparen_t, args, rparen_t = val[3] + result = @builder.call_method(val[0], val[1], val[2], + lparen_t, args, rparen_t) + + result +end + +def _reduce_422(val, _values, result) + lparen_t, args, rparen_t = val[3] + method_call = @builder.call_method(val[0], val[1], val[2], + lparen_t, args, rparen_t) + + begin_t, args, body, end_t = val[4] + result = @builder.block(method_call, + begin_t, args, body, end_t) + + result +end + +def _reduce_423(val, _values, result) + method_call = @builder.call_method(val[0], val[1], val[2], + nil, val[3], nil) + + begin_t, args, body, end_t = val[4] + result = @builder.block(method_call, + begin_t, args, body, end_t) + + result +end + +def _reduce_424(val, _values, result) + lparen_t, args, rparen_t = val[1] + result = @builder.call_method(nil, nil, val[0], + lparen_t, args, rparen_t) + + result +end + +def _reduce_425(val, _values, result) + lparen_t, args, rparen_t = val[3] + result = @builder.call_method(val[0], val[1], val[2], + lparen_t, args, rparen_t) + + result +end + +def _reduce_426(val, _values, result) + lparen_t, args, rparen_t = val[3] + result = @builder.call_method(val[0], val[1], val[2], + lparen_t, args, rparen_t) + + result +end + +def _reduce_427(val, _values, result) + result = @builder.call_method(val[0], val[1], val[2]) + + result +end + +def _reduce_428(val, _values, result) + lparen_t, args, rparen_t = val[2] + result = @builder.call_method(val[0], val[1], nil, + lparen_t, args, rparen_t) + + result +end + +def _reduce_429(val, _values, result) + lparen_t, args, rparen_t = val[2] + result = @builder.call_method(val[0], val[1], nil, + lparen_t, args, rparen_t) + + result +end + +def _reduce_430(val, _values, result) + lparen_t, args, rparen_t = val[1] + result = @builder.keyword_cmd(:super, val[0], + lparen_t, args, rparen_t) + + result +end + +def _reduce_431(val, _values, result) + result = @builder.keyword_cmd(:zsuper, val[0]) + + result +end + +def _reduce_432(val, _values, result) + result = @builder.index(val[0], val[1], val[2], val[3]) + + result +end + +def _reduce_433(val, _values, result) + @context.push(:block) + + result +end + +def _reduce_434(val, _values, result) + result = [ val[0], *val[2], val[3] ] + @context.pop + + result +end + +def _reduce_435(val, _values, result) + @context.push(:block) + + result +end + +def _reduce_436(val, _values, result) + result = [ val[0], *val[2], val[3] ] + @context.pop + + result +end + +def _reduce_437(val, _values, result) + @static_env.extend_dynamic + @max_numparam_stack.push + + result +end + +def _reduce_438(val, _values, result) + args = @max_numparam_stack.has_numparams? ? @builder.numargs(@max_numparam_stack.top) : val[1] + result = [ args, val[2] ] + + @max_numparam_stack.pop + @static_env.unextend + + result +end + +def _reduce_439(val, _values, result) + @static_env.extend_dynamic + @max_numparam_stack.push + + result +end + +def _reduce_440(val, _values, result) + @lexer.cmdarg.push(false) + + result +end + +def _reduce_441(val, _values, result) + args = @max_numparam_stack.has_numparams? ? @builder.numargs(@max_numparam_stack.top) : val[2] + result = [ args, val[3] ] + + @max_numparam_stack.pop + @static_env.unextend + @lexer.cmdarg.pop + + result +end + +def _reduce_442(val, _values, result) + result = [ @builder.when(val[0], val[1], val[2], val[3]), + *val[4] ] + + result +end + +def _reduce_443(val, _values, result) + result = [ val[0] ] + + result +end + +# reduce 444 omitted + +def _reduce_445(val, _values, result) + @lexer.state = :expr_beg + @lexer.command_start = false + @pattern_variables.push + @pattern_hash_keys.push + + result = @lexer.in_kwarg + @lexer.in_kwarg = true + + result +end + +def _reduce_446(val, _values, result) + @lexer.in_kwarg = val[1] + + result +end + +def _reduce_447(val, _values, result) + result = [ @builder.in_pattern(val[0], *val[2], val[3], val[5]), + *val[6] ] + + result +end + +def _reduce_448(val, _values, result) + result = [ val[0] ] + + result +end + +# reduce 449 omitted + +def _reduce_450(val, _values, result) + result = [ val[0], nil ] + + result +end + +def _reduce_451(val, _values, result) + result = [ val[0], @builder.if_guard(val[1], val[2]) ] + + result +end + +def _reduce_452(val, _values, result) + result = [ val[0], @builder.unless_guard(val[1], val[2]) ] + + result +end + +# reduce 453 omitted + +def _reduce_454(val, _values, result) + # array patterns that end with comma + # like 1, 2, + # must be emitted as `array_pattern_with_tail` + item = @builder.match_with_trailing_comma(val[0], val[1]) + result = @builder.array_pattern(nil, [ item ], nil) + + result +end + +def _reduce_455(val, _values, result) + result = @builder.array_pattern(nil, [val[0]].concat(val[2]), nil) + + result +end + +def _reduce_456(val, _values, result) + result = @builder.find_pattern(nil, val[0], nil) + + result +end + +def _reduce_457(val, _values, result) + result = @builder.array_pattern(nil, val[0], nil) + + result +end + +def _reduce_458(val, _values, result) + result = @builder.hash_pattern(nil, val[0], nil) + + result +end + +# reduce 459 omitted + +def _reduce_460(val, _values, result) + result = @builder.match_as(val[0], val[1], val[2]) + + result +end + +# reduce 461 omitted + +def _reduce_462(val, _values, result) + result = @builder.match_alt(val[0], val[1], val[2]) + + result +end + +# reduce 463 omitted + +def _reduce_464(val, _values, result) + result = val[0] + @pattern_hash_keys.push + + result +end + +def _reduce_465(val, _values, result) + result = val[0] + @pattern_hash_keys.push + + result +end + +# reduce 466 omitted + +def _reduce_467(val, _values, result) + @pattern_hash_keys.pop + pattern = @builder.array_pattern(nil, val[2], nil) + result = @builder.const_pattern(val[0], val[1], pattern, val[3]) + + result +end + +def _reduce_468(val, _values, result) + @pattern_hash_keys.pop + pattern = @builder.find_pattern(nil, val[2], nil) + result = @builder.const_pattern(val[0], val[1], pattern, val[3]) + + result +end + +def _reduce_469(val, _values, result) + @pattern_hash_keys.pop + pattern = @builder.hash_pattern(nil, val[2], nil) + result = @builder.const_pattern(val[0], val[1], pattern, val[3]) + + result +end + +def _reduce_470(val, _values, result) + pattern = @builder.array_pattern(val[1], nil, val[2]) + result = @builder.const_pattern(val[0], val[1], pattern, val[2]) + + result +end + +def _reduce_471(val, _values, result) + @pattern_hash_keys.pop + pattern = @builder.array_pattern(nil, val[2], nil) + result = @builder.const_pattern(val[0], val[1], pattern, val[3]) + + result +end + +def _reduce_472(val, _values, result) + @pattern_hash_keys.pop + pattern = @builder.find_pattern(nil, val[2], nil) + result = @builder.const_pattern(val[0], val[1], pattern, val[3]) + + result +end + +def _reduce_473(val, _values, result) + @pattern_hash_keys.pop + pattern = @builder.hash_pattern(nil, val[2], nil) + result = @builder.const_pattern(val[0], val[1], pattern, val[3]) + + result +end + +def _reduce_474(val, _values, result) + pattern = @builder.array_pattern(val[1], nil, val[2]) + result = @builder.const_pattern(val[0], val[1], pattern, val[2]) + + result +end + +def _reduce_475(val, _values, result) + result = @builder.array_pattern(val[0], val[1], val[2]) + + result +end + +def _reduce_476(val, _values, result) + result = @builder.find_pattern(val[0], val[1], val[2]) + + result +end + +def _reduce_477(val, _values, result) + result = @builder.array_pattern(val[0], [], val[1]) + + result +end + +def _reduce_478(val, _values, result) + @pattern_hash_keys.push + result = @lexer.in_kwarg + @lexer.in_kwarg = false + + result +end + +def _reduce_479(val, _values, result) + @pattern_hash_keys.pop + @lexer.in_kwarg = val[1] + result = @builder.hash_pattern(val[0], val[2], val[3]) + + result +end + +def _reduce_480(val, _values, result) + result = @builder.hash_pattern(val[0], [], val[1]) + + result +end + +def _reduce_481(val, _values, result) + @pattern_hash_keys.push + + result +end + +def _reduce_482(val, _values, result) + @pattern_hash_keys.pop + result = @builder.begin(val[0], val[2], val[3]) + + result +end + +def _reduce_483(val, _values, result) + result = [ val[0] ] + + result +end + +def _reduce_484(val, _values, result) + result = val[0] + + result +end + +def _reduce_485(val, _values, result) + result = [ *val[0], val[1] ] + + result +end + +def _reduce_486(val, _values, result) + match_rest = @builder.match_rest(val[1], val[2]) + result = [ *val[0], match_rest ] + + result +end + +def _reduce_487(val, _values, result) + match_rest = @builder.match_rest(val[1], val[2]) + result = [ *val[0], match_rest, *val[4] ] + + result +end + +def _reduce_488(val, _values, result) + result = [ *val[0], @builder.match_rest(val[1]) ] + + result +end + +def _reduce_489(val, _values, result) + result = [ *val[0], @builder.match_rest(val[1]), *val[3] ] + + result +end + +# reduce 490 omitted + +def _reduce_491(val, _values, result) + # array patterns that end with comma + # like [1, 2,] + # must be emitted as `array_pattern_with_tail` + item = @builder.match_with_trailing_comma(val[0], val[1]) + result = [ item ] + + result +end + +def _reduce_492(val, _values, result) + # array patterns that end with comma + # like [1, 2,] + # must be emitted as `array_pattern_with_tail` + last_item = @builder.match_with_trailing_comma(val[1], val[2]) + result = [ *val[0], last_item ] + + result +end + +def _reduce_493(val, _values, result) + result = [ val[0] ] + + result +end + +def _reduce_494(val, _values, result) + result = [ val[0], *val[2] ] + + result +end + +def _reduce_495(val, _values, result) + result = [ val[0], *val[2], val[4] ] + + result +end + +def _reduce_496(val, _values, result) + result = @builder.match_rest(val[0], val[1]) + + result +end + +def _reduce_497(val, _values, result) + result = @builder.match_rest(val[0]) + + result +end + +def _reduce_498(val, _values, result) + result = [ val[0] ] + + result +end + +def _reduce_499(val, _values, result) + result = [ *val[0], val[2] ] + + result +end + +# reduce 500 omitted + +def _reduce_501(val, _values, result) + result = [ *val[0], *val[2] ] + + result +end + +def _reduce_502(val, _values, result) + result = val[0] + + result +end + +def _reduce_503(val, _values, result) + result = val[0] + + result +end + +def _reduce_504(val, _values, result) + result = val[0] + + result +end + +def _reduce_505(val, _values, result) + result = [ val[0] ] + + result +end + +def _reduce_506(val, _values, result) + result = [ *val[0], val[2] ] + + result +end + +def _reduce_507(val, _values, result) + result = @builder.match_pair(*val[0], val[1]) + + result +end + +def _reduce_508(val, _values, result) + result = @builder.match_label(*val[0]) + + result +end + +def _reduce_509(val, _values, result) + check_kwarg_name(val[0]) + result = [:label, val[0]] + + result +end + +def _reduce_510(val, _values, result) + result = [:quoted, [val[0], val[1], val[2]]] + + result +end + +def _reduce_511(val, _values, result) + result = [ @builder.match_rest(val[0], val[1]) ] + + result +end + +def _reduce_512(val, _values, result) + result = [ @builder.match_rest(val[0], nil) ] + + result +end + +def _reduce_513(val, _values, result) + result = [ @builder.match_nil_pattern(val[0], val[1]) ] + + result +end + +# reduce 514 omitted + +# reduce 515 omitted + +# reduce 516 omitted + +def _reduce_517(val, _values, result) + result = @builder.range_inclusive(val[0], val[1], val[2]) + + result +end + +def _reduce_518(val, _values, result) + result = @builder.range_exclusive(val[0], val[1], val[2]) + + result +end + +def _reduce_519(val, _values, result) + result = @builder.range_inclusive(val[0], val[1], nil) + + result +end + +def _reduce_520(val, _values, result) + result = @builder.range_exclusive(val[0], val[1], nil) + + result +end + +# reduce 521 omitted + +# reduce 522 omitted + +# reduce 523 omitted + +def _reduce_524(val, _values, result) + result = @builder.range_inclusive(nil, val[0], val[1]) + + result +end + +def _reduce_525(val, _values, result) + result = @builder.range_exclusive(nil, val[0], val[1]) + + result +end + +# reduce 526 omitted + +# reduce 527 omitted + +# reduce 528 omitted + +# reduce 529 omitted + +# reduce 530 omitted + +# reduce 531 omitted + +# reduce 532 omitted + +# reduce 533 omitted + +def _reduce_534(val, _values, result) + result = @builder.accessible(val[0]) + + result +end + +# reduce 535 omitted + +def _reduce_536(val, _values, result) + result = @builder.match_var(val[0]) + + result +end + +def _reduce_537(val, _values, result) + name = val[1][0] + unless static_env.declared?(name) + diagnostic :error, :undefined_lvar, { :name => name }, val[1] + end + + lvar = @builder.accessible(@builder.ident(val[1])) + result = @builder.pin(val[0], lvar) + + result +end + +def _reduce_538(val, _values, result) + result = @builder.const_global(val[0], val[1]) + + result +end + +def _reduce_539(val, _values, result) + result = @builder.const_fetch(val[0], val[1], val[2]) + + result +end + +def _reduce_540(val, _values, result) + result = @builder.const(val[0]) + + result +end + +def _reduce_541(val, _values, result) + assoc_t, exc_var = val[2] + + if val[1] + exc_list = @builder.array(nil, val[1], nil) + end + + result = [ @builder.rescue_body(val[0], + exc_list, assoc_t, exc_var, + val[3], val[4]), + *val[5] ] + + result +end + +def _reduce_542(val, _values, result) + result = [] + + result +end + +def _reduce_543(val, _values, result) + result = [ val[0] ] + + result +end + +# reduce 544 omitted + +# reduce 545 omitted + +def _reduce_546(val, _values, result) + result = [ val[0], val[1] ] + + result +end + +# reduce 547 omitted + +def _reduce_548(val, _values, result) + result = [ val[0], val[1] ] + + result +end + +# reduce 549 omitted + +# reduce 550 omitted + +# reduce 551 omitted + +def _reduce_552(val, _values, result) + result = @builder.string_compose(nil, val[0], nil) + + result +end + +def _reduce_553(val, _values, result) + result = [ val[0] ] + + result +end + +def _reduce_554(val, _values, result) + result = val[0] << val[1] + + result +end + +def _reduce_555(val, _values, result) + string = @builder.string_compose(val[0], val[1], val[2]) + result = @builder.dedent_string(string, @lexer.dedent_level) + + result +end + +def _reduce_556(val, _values, result) + string = @builder.string(val[0]) + result = @builder.dedent_string(string, @lexer.dedent_level) + + result +end + +def _reduce_557(val, _values, result) + result = @builder.character(val[0]) + + result +end + +def _reduce_558(val, _values, result) + string = @builder.xstring_compose(val[0], val[1], val[2]) + result = @builder.dedent_string(string, @lexer.dedent_level) + + result +end + +def _reduce_559(val, _values, result) + opts = @builder.regexp_options(val[3]) + result = @builder.regexp_compose(val[0], val[1], val[2], opts) + + result +end + +def _reduce_560(val, _values, result) + result = @builder.words_compose(val[0], val[1], val[2]) + + result +end + +def _reduce_561(val, _values, result) + result = [] + + result +end + +def _reduce_562(val, _values, result) + result = val[0] << @builder.word(val[1]) + + result +end + +def _reduce_563(val, _values, result) + result = [ val[0] ] + + result +end + +def _reduce_564(val, _values, result) + result = val[0] << val[1] + + result +end + +def _reduce_565(val, _values, result) + result = @builder.symbols_compose(val[0], val[1], val[2]) + + result +end + +def _reduce_566(val, _values, result) + result = [] + + result +end + +def _reduce_567(val, _values, result) + result = val[0] << @builder.word(val[1]) + + result +end + +def _reduce_568(val, _values, result) + result = @builder.words_compose(val[0], val[1], val[2]) + + result +end + +def _reduce_569(val, _values, result) + result = @builder.symbols_compose(val[0], val[1], val[2]) + + result +end + +def _reduce_570(val, _values, result) + result = [] + + result +end + +def _reduce_571(val, _values, result) + result = val[0] << @builder.string_internal(val[1]) + + result +end + +def _reduce_572(val, _values, result) + result = [] + + result +end + +def _reduce_573(val, _values, result) + result = val[0] << @builder.symbol_internal(val[1]) + + result +end + +def _reduce_574(val, _values, result) + result = [] + + result +end + +def _reduce_575(val, _values, result) + result = val[0] << val[1] + + result +end + +def _reduce_576(val, _values, result) + result = [] + + result +end + +def _reduce_577(val, _values, result) + result = val[0] << val[1] + + result +end + +def _reduce_578(val, _values, result) + result = [] + + result +end + +def _reduce_579(val, _values, result) + result = val[0] << val[1] + + result +end + +def _reduce_580(val, _values, result) + result = @builder.string_internal(val[0]) + + result +end + +def _reduce_581(val, _values, result) + result = val[1] + + result +end + +def _reduce_582(val, _values, result) + @lexer.cmdarg.push(false) + @lexer.cond.push(false) + + result +end + +def _reduce_583(val, _values, result) + @lexer.cmdarg.pop + @lexer.cond.pop + + result = @builder.begin(val[0], val[2], val[3]) + + result +end + +def _reduce_584(val, _values, result) + result = @builder.gvar(val[0]) + + result +end + +def _reduce_585(val, _values, result) + result = @builder.ivar(val[0]) + + result +end + +def _reduce_586(val, _values, result) + result = @builder.cvar(val[0]) + + result +end + +# reduce 587 omitted + +# reduce 588 omitted + +# reduce 589 omitted + +def _reduce_590(val, _values, result) + @lexer.state = :expr_end + result = @builder.symbol(val[0]) + + result +end + +def _reduce_591(val, _values, result) + @lexer.state = :expr_end + result = @builder.symbol_compose(val[0], val[1], val[2]) + + result +end + +def _reduce_592(val, _values, result) + result = val[0] + + result +end + +def _reduce_593(val, _values, result) + if @builder.respond_to? :negate + # AST builder interface compatibility + result = @builder.negate(val[0], val[1]) + else + result = @builder.unary_num(val[0], val[1]) + end + + result +end + +def _reduce_594(val, _values, result) + @lexer.state = :expr_end + result = @builder.integer(val[0]) + + result +end + +def _reduce_595(val, _values, result) + @lexer.state = :expr_end + result = @builder.float(val[0]) + + result +end + +def _reduce_596(val, _values, result) + @lexer.state = :expr_end + result = @builder.rational(val[0]) + + result +end + +def _reduce_597(val, _values, result) + @lexer.state = :expr_end + result = @builder.complex(val[0]) + + result +end + +def _reduce_598(val, _values, result) + result = @builder.ident(val[0]) + + result +end + +def _reduce_599(val, _values, result) + result = @builder.ivar(val[0]) + + result +end + +def _reduce_600(val, _values, result) + result = @builder.gvar(val[0]) + + result +end + +def _reduce_601(val, _values, result) + result = @builder.const(val[0]) + + result +end + +def _reduce_602(val, _values, result) + result = @builder.cvar(val[0]) + + result +end + +def _reduce_603(val, _values, result) + result = @builder.nil(val[0]) + + result +end + +def _reduce_604(val, _values, result) + result = @builder.self(val[0]) + + result +end + +def _reduce_605(val, _values, result) + result = @builder.true(val[0]) + + result +end + +def _reduce_606(val, _values, result) + result = @builder.false(val[0]) + + result +end + +def _reduce_607(val, _values, result) + result = @builder.__FILE__(val[0]) + + result +end + +def _reduce_608(val, _values, result) + result = @builder.__LINE__(val[0]) + + result +end + +def _reduce_609(val, _values, result) + result = @builder.__ENCODING__(val[0]) + + result +end + +def _reduce_610(val, _values, result) + if (node = val[0]) && node.type == :ident + name = node.children[0] + + if name =~ /\A_[1-9]\z/ && !static_env.declared?(name) && context.in_dynamic_block? + # definitely an implicit param + location = node.loc.expression + + if max_numparam_stack.has_ordinary_params? + diagnostic :error, :ordinary_param_defined, nil, [nil, location] + end + + raw_context = context.stack.dup + raw_max_numparam_stack = max_numparam_stack.stack.dup + + # ignore current block scope + raw_context.pop + raw_max_numparam_stack.pop + + raw_context.reverse_each do |outer_scope| + if outer_scope == :block || outer_scope == :lambda + outer_scope_has_numparams = raw_max_numparam_stack.pop > 0 + + if outer_scope_has_numparams + diagnostic :error, :numparam_used_in_outer_scope, nil, [nil, location] + else + # for now it's ok, but an outer scope can also be a block + # with numparams, so we need to continue + end + else + # found an outer scope that can't have numparams + # like def/class/etc + break + end + end + + static_env.declare(name) + max_numparam_stack.register(name[1].to_i) + end + end + + result = @builder.accessible(val[0]) + + result +end + +def _reduce_611(val, _values, result) + result = @builder.accessible(val[0]) + + result +end + +def _reduce_612(val, _values, result) + result = @builder.assignable(val[0]) + + result +end + +def _reduce_613(val, _values, result) + result = @builder.assignable(val[0]) + + result +end + +def _reduce_614(val, _values, result) + result = @builder.nth_ref(val[0]) + + result +end + +def _reduce_615(val, _values, result) + result = @builder.back_ref(val[0]) + + result +end + +def _reduce_616(val, _values, result) + @lexer.state = :expr_value + + result +end + +def _reduce_617(val, _values, result) + result = [ val[0], val[2] ] + + result +end + +def _reduce_618(val, _values, result) + result = nil + + result +end + +def _reduce_619(val, _values, result) + result = @builder.args(val[0], val[1], val[2]) + + @lexer.state = :expr_value + + result +end + +def _reduce_620(val, _values, result) + args = [ *val[1], @builder.forward_arg(val[3]) ] + result = @builder.args(val[0], args, val[4]) + + @static_env.declare_forward_args + + result +end + +def _reduce_621(val, _values, result) + result = @builder.forward_only_args(val[0], val[1], val[2]) + @static_env.declare_forward_args + + @lexer.state = :expr_value + + result +end + +# reduce 622 omitted + +def _reduce_623(val, _values, result) + result = @lexer.in_kwarg + @lexer.in_kwarg = true + + result +end + +def _reduce_624(val, _values, result) + @lexer.in_kwarg = val[0] + result = @builder.args(nil, val[1], nil) + + result +end + +def _reduce_625(val, _values, result) + result = val[0].concat(val[2]).concat(val[3]) + + result +end + +def _reduce_626(val, _values, result) + result = val[0].concat(val[1]) + + result +end + +def _reduce_627(val, _values, result) + result = val[0].concat(val[1]) + + result +end + +def _reduce_628(val, _values, result) + result = [ val[0] ] + + result +end + +def _reduce_629(val, _values, result) + result = val[1] + + result +end + +def _reduce_630(val, _values, result) + result = [] + + result +end + +def _reduce_631(val, _values, result) + result = val[0]. + concat(val[2]). + concat(val[4]). + concat(val[5]) + + result +end + +def _reduce_632(val, _values, result) + result = val[0]. + concat(val[2]). + concat(val[4]). + concat(val[6]). + concat(val[7]) + + result +end + +def _reduce_633(val, _values, result) + result = val[0]. + concat(val[2]). + concat(val[3]) + + result +end + +def _reduce_634(val, _values, result) + result = val[0]. + concat(val[2]). + concat(val[4]). + concat(val[5]) + + result +end + +def _reduce_635(val, _values, result) + result = val[0]. + concat(val[2]). + concat(val[3]) + + result +end + +def _reduce_636(val, _values, result) + result = val[0]. + concat(val[2]). + concat(val[4]). + concat(val[5]) + + result +end + +def _reduce_637(val, _values, result) + result = val[0]. + concat(val[1]) + + result +end + +def _reduce_638(val, _values, result) + result = val[0]. + concat(val[2]). + concat(val[3]) + + result +end + +def _reduce_639(val, _values, result) + result = val[0]. + concat(val[2]). + concat(val[4]). + concat(val[5]) + + result +end + +def _reduce_640(val, _values, result) + result = val[0]. + concat(val[1]) + + result +end + +def _reduce_641(val, _values, result) + result = val[0]. + concat(val[2]). + concat(val[3]) + + result +end + +def _reduce_642(val, _values, result) + result = val[0]. + concat(val[1]) + + result +end + +def _reduce_643(val, _values, result) + result = val[0]. + concat(val[2]). + concat(val[3]) + + result +end + +def _reduce_644(val, _values, result) + result = val[0] + + result +end + +def _reduce_645(val, _values, result) + result = [] + + result +end + +def _reduce_646(val, _values, result) + result = val[0] + + result +end + +def _reduce_647(val, _values, result) + diagnostic :error, :argument_const, nil, val[0] + + result +end + +def _reduce_648(val, _values, result) + diagnostic :error, :argument_ivar, nil, val[0] + + result +end + +def _reduce_649(val, _values, result) + diagnostic :error, :argument_gvar, nil, val[0] + + result +end + +def _reduce_650(val, _values, result) + diagnostic :error, :argument_cvar, nil, val[0] + + result +end + +# reduce 651 omitted + +def _reduce_652(val, _values, result) + @static_env.declare val[0][0] + + @max_numparam_stack.has_ordinary_params! + + result = val[0] + + result +end + +def _reduce_653(val, _values, result) + @current_arg_stack.set(val[0][0]) + result = val[0] + + result +end + +def _reduce_654(val, _values, result) + @current_arg_stack.set(0) + result = @builder.arg(val[0]) + + result +end + +def _reduce_655(val, _values, result) + result = @builder.multi_lhs(val[0], val[1], val[2]) + + result +end + +def _reduce_656(val, _values, result) + result = [ val[0] ] + + result +end + +def _reduce_657(val, _values, result) + result = val[0] << val[2] + + result +end + +def _reduce_658(val, _values, result) + check_kwarg_name(val[0]) + + @static_env.declare val[0][0] + + @max_numparam_stack.has_ordinary_params! + + @current_arg_stack.set(val[0][0]) + + result = val[0] + + result +end + +def _reduce_659(val, _values, result) + @current_arg_stack.set(nil) + result = @builder.kwoptarg(val[0], val[1]) + + result +end + +def _reduce_660(val, _values, result) + @current_arg_stack.set(nil) + result = @builder.kwarg(val[0]) + + result +end + +def _reduce_661(val, _values, result) + result = @builder.kwoptarg(val[0], val[1]) + + result +end + +def _reduce_662(val, _values, result) + result = @builder.kwarg(val[0]) + + result +end + +def _reduce_663(val, _values, result) + result = [ val[0] ] + + result +end + +def _reduce_664(val, _values, result) + result = val[0] << val[2] + + result +end + +def _reduce_665(val, _values, result) + result = [ val[0] ] + + result +end + +def _reduce_666(val, _values, result) + result = val[0] << val[2] + + result +end + +# reduce 667 omitted + +# reduce 668 omitted + +def _reduce_669(val, _values, result) + result = [ @builder.kwnilarg(val[0], val[1]) ] + + result +end + +def _reduce_670(val, _values, result) + @static_env.declare val[1][0] + + result = [ @builder.kwrestarg(val[0], val[1]) ] + + result +end + +def _reduce_671(val, _values, result) + result = [ @builder.kwrestarg(val[0]) ] + + result +end + +def _reduce_672(val, _values, result) + @current_arg_stack.set(0) + result = @builder.optarg(val[0], val[1], val[2]) + + result +end + +def _reduce_673(val, _values, result) + @current_arg_stack.set(0) + result = @builder.optarg(val[0], val[1], val[2]) + + result +end + +def _reduce_674(val, _values, result) + result = [ val[0] ] + + result +end + +def _reduce_675(val, _values, result) + result = val[0] << val[2] + + result +end + +def _reduce_676(val, _values, result) + result = [ val[0] ] + + result +end + +def _reduce_677(val, _values, result) + result = val[0] << val[2] + + result +end + +# reduce 678 omitted + +# reduce 679 omitted + +def _reduce_680(val, _values, result) + @static_env.declare val[1][0] + + result = [ @builder.restarg(val[0], val[1]) ] + + result +end + +def _reduce_681(val, _values, result) + result = [ @builder.restarg(val[0]) ] + + result +end + +# reduce 682 omitted + +# reduce 683 omitted + +def _reduce_684(val, _values, result) + @static_env.declare val[1][0] + + result = @builder.blockarg(val[0], val[1]) + + result +end + +def _reduce_685(val, _values, result) + result = [ val[1] ] + + result +end + +def _reduce_686(val, _values, result) + result = [] + + result +end + +# reduce 687 omitted + +def _reduce_688(val, _values, result) + result = val[1] + + result +end + +def _reduce_689(val, _values, result) + result = [] + + result +end + +# reduce 690 omitted + +def _reduce_691(val, _values, result) + result = [ val[0] ] + + result +end + +def _reduce_692(val, _values, result) + result = val[0] << val[2] + + result +end + +def _reduce_693(val, _values, result) + result = @builder.pair(val[0], val[1], val[2]) + + result +end + +def _reduce_694(val, _values, result) + result = @builder.pair_keyword(val[0], val[1]) + + result +end + +def _reduce_695(val, _values, result) + result = @builder.pair_quoted(val[0], val[1], val[2], val[3]) + + result +end + +def _reduce_696(val, _values, result) + result = @builder.kwsplat(val[0], val[1]) + + result +end + +# reduce 697 omitted + +# reduce 698 omitted + +# reduce 699 omitted + +# reduce 700 omitted + +# reduce 701 omitted + +# reduce 702 omitted + +# reduce 703 omitted + +# reduce 704 omitted + +# reduce 705 omitted + +# reduce 706 omitted + +# reduce 707 omitted + +# reduce 708 omitted + +def _reduce_709(val, _values, result) + result = [:dot, val[0][1]] + + result +end + +def _reduce_710(val, _values, result) + result = [:anddot, val[0][1]] + + result +end + +# reduce 711 omitted + +# reduce 712 omitted + +# reduce 713 omitted + +# reduce 714 omitted + +def _reduce_715(val, _values, result) + result = val[1] + + result +end + +def _reduce_716(val, _values, result) + result = val[1] + + result +end + +def _reduce_717(val, _values, result) + result = val[1] + + result +end + +# reduce 718 omitted + +# reduce 719 omitted + +# reduce 720 omitted + +def _reduce_721(val, _values, result) + yyerrok + + result +end + +# reduce 722 omitted + +# reduce 723 omitted + +# reduce 724 omitted + +def _reduce_725(val, _values, result) + result = nil + + result +end + +def _reduce_none(val, _values, result) + val[0] +end + + end # class Ruby28 + end # module Parser diff --git a/vendor/bundle/ruby/3.1.0/gems/parser-3.1.2.0/lib/parser/ruby30.rb b/vendor/bundle/ruby/3.1.0/gems/parser-3.1.2.0/lib/parser/ruby30.rb new file mode 100644 index 000000000..c587cd2f9 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/parser-3.1.2.0/lib/parser/ruby30.rb @@ -0,0 +1,8096 @@ +# -*- encoding:utf-8; warn-indent:false; frozen_string_literal: true -*- +# +# DO NOT MODIFY!!!! +# This file is automatically generated by Racc 1.4.15 +# from Racc grammer file "". +# + +require 'racc/parser.rb' + + +require 'parser' + +module Parser + class Ruby30 < Parser::Base + + + def version + 30 + end + + def default_encoding + Encoding::UTF_8 + end + + def endless_method_name(name_t) + if !%w[=== == != <= >=].include?(name_t[0]) && name_t[0].end_with?('=') + diagnostic :error, :endless_setter, nil, name_t + end + end + + def local_push + @static_env.extend_static + @lexer.cmdarg.push(false) + @lexer.cond.push(false) + @max_numparam_stack.push(static: true) + end + + def local_pop + @static_env.unextend + @lexer.cmdarg.pop + @lexer.cond.pop + @max_numparam_stack.pop + end + + def try_declare_numparam(node) + name = node.children[0] + + if name =~ /\A_[1-9]\z/ && !static_env.declared?(name) && @context.in_dynamic_block? + # definitely an implicit param + location = node.loc.expression + + if max_numparam_stack.has_ordinary_params? + diagnostic :error, :ordinary_param_defined, nil, [nil, location] + end + + raw_max_numparam_stack = max_numparam_stack.stack.dup + + # ignore current block scope + raw_max_numparam_stack.pop + + raw_max_numparam_stack.reverse_each do |outer_scope| + if outer_scope[:static] + # found an outer scope that can't have numparams + # like def/class/etc + break + else + outer_scope_has_numparams = outer_scope[:value] > 0 + + if outer_scope_has_numparams + diagnostic :error, :numparam_used_in_outer_scope, nil, [nil, location] + else + # for now it's ok, but an outer scope can also be a block + # like proc { _1; proc { proc { proc { _2 }} }} + # with numparams, so we need to continue + end + end + end + + static_env.declare(name) + max_numparam_stack.register(name[1].to_i) + + true + else + false + end + end +##### State transition tables begin ### + +clist = [ +'-707,680,617,1083,870,965,-120,-707,-707,-707,221,222,805,-707,-707', +'-606,-707,104,105,870,231,-113,-606,-116,-707,-707,660,1150,658,-716', +'866,-119,-118,1153,-114,1078,-707,-707,617,-707,-707,-707,-707,-707', +'-112,-119,232,617,617,920,1124,-118,426,1077,624,-117,870,428,427,810', +'-117,232,810,-115,-113,-501,-707,-707,-707,-707,-707,-707,-707,-707', +'-707,-707,-707,-707,-707,-707,-606,-112,-707,-707,-707,1084,685,-707', +'-703,-117,-707,-120,659,-707,657,106,107,-704,-707,232,-707,229,-707', +'-707,232,-707,-707,-707,-707,-707,-602,-707,-707,-707,964,-111,126,-602', +'-602,-602,126,125,-602,-602,-602,125,-602,-707,-704,-106,-707,-707,-107', +'-707,-602,-707,-602,-602,-602,-113,-110,-109,-707,-105,-113,-116,-602', +'-602,617,-602,-602,-602,-602,-602,-116,-114,126,-115,-117,954,-120,125', +'-112,-119,-108,126,126,-112,-119,-118,125,125,-106,-104,-118,232,-602', +'-602,-602,-602,-602,-602,-602,-602,-602,-602,-602,-602,-602,-602,-103', +'617,-602,-602,-602,-106,-602,-602,301,852,-602,352,126,-602,-602,479', +'-602,125,-602,-120,-602,-716,-602,-602,-120,-602,-602,-602,-602,-602', +'-314,-602,1158,-602,301,221,222,-314,-314,-314,920,-703,624,-314,-314', +'-106,-314,-602,-106,1159,-602,-602,-602,-602,-314,-602,-716,-602,221', +'222,-106,232,-602,949,920,-602,-314,-314,-114,-314,-314,-314,-314,-314', +'-120,788,126,221,222,1043,-107,125,-116,-114,366,-115,-117,-116,-114', +'301,-115,-117,232,789,1043,300,-314,-314,-314,-314,-314,-314,-314,-314', +'-314,-314,-314,-314,-314,-314,301,1043,-314,-314,-314,-611,684,-314', +'351,126,-314,300,-611,-314,125,-105,104,105,-314,126,-314,-611,-314', +'-314,125,-314,-314,-314,-314,-314,-728,-314,-707,-314,290,-703,-107', +'865,679,-707,-707,-707,232,296,-707,-707,-707,-314,-707,126,-314,-314', +'1171,-314,125,-314,-707,-707,-707,-707,-707,232,-314,1172,296,-118,300', +'-108,-707,-707,-611,-707,-707,-707,-707,-707,-107,-612,1176,-107,-98', +'-105,645,-605,-612,645,774,300,1180,645,-605,-107,-84,-612,106,107,-115', +'-115,-707,-707,-707,-707,-707,-707,-707,-707,-707,-707,-707,-707,-707', +'-707,366,555,-707,-707,-707,645,867,-707,1182,-105,-707,630,-105,-707', +'-707,631,-707,1184,-707,555,-707,-108,-707,-707,-105,-707,-707,-707', +'-707,-707,-612,-707,-707,-707,647,646,-605,647,646,643,645,647,646,645', +'836,1186,645,-707,-110,645,-707,-707,-707,-707,1137,-707,-728,-707,1137', +'-314,-119,-108,-707,-614,-108,-116,-314,-314,-314,647,646,-314,-314', +'-314,227,-314,-108,1186,-119,838,630,547,-604,-314,895,-314,-314,-314', +'876,-604,545,974,-701,872,765,-314,-314,873,-314,-314,-314,-314,-314', +'223,647,646,643,647,646,643,647,646,648,647,646,656,852,-613,126,126', +'1119,745,-113,125,125,-314,-314,-314,-314,-314,-314,-314,-314,-314,-314', +'-314,-314,-314,-314,228,-613,-314,-314,-314,-602,868,-314,-604,1200', +'-314,-114,-602,-314,-314,645,-314,-701,-314,1176,-314,-602,-314,-314', +'-105,-314,-314,-314,-314,-314,126,-314,220,-314,630,125,-114,-112,895', +'582,-701,579,578,577,587,580,680,-314,-103,-607,-314,-314,-314,-314', +'590,-314,-607,-314,-704,-707,-112,679,-314,1122,1123,-118,-707,-707', +'-707,-703,-602,609,-707,-707,611,-707,585,221,222,647,646,652,-610,-707', +'-707,595,594,598,597,-610,949,920,591,-108,90,-707,-707,232,-707,-707', +'-707,-707,-707,219,-614,-117,91,582,-106,579,578,577,587,580,-607,645', +'92,218,232,135,-115,232,590,1043,1174,-707,-707,-707,-707,-707,-707', +'-707,-707,-707,-707,-707,-707,-707,-707,1212,229,-707,-707,-707,585', +'685,-707,-610,1186,-707,645,-104,-707,595,594,598,597,-707,1186,-707', +'591,-707,-707,-113,-707,-707,-707,-707,-707,-314,-707,-707,-707,890', +'891,1186,-314,-314,-314,647,646,661,-314,-314,-608,-314,-707,-111,122', +'-707,-707,-608,-107,-314,-707,-609,-602,598,597,-120,576,-707,-609,-602', +'-116,-314,-314,1176,-314,-314,-314,-314,-314,1186,647,646,650,582,227', +'579,578,577,587,580,-599,627,129,130,131,132,133,-599,590,232,625,-314', +'-314,-314,-314,-314,-314,-314,-314,-314,-314,-314,-314,-314,-314,-608', +'733,-314,-314,-314,585,684,-314,221,222,-314,-609,-602,-314,595,594', +'598,597,-314,232,-314,591,-314,-314,232,-314,-314,-314,-314,-314,-599', +'-314,609,-314,228,611,254,-599,-599,-599,-599,254,-599,-599,-599,227', +'-599,-314,254,254,-314,-314,294,-109,-599,-314,-599,-599,-599,232,609', +'576,-314,611,-98,-118,-599,-599,748,-599,-599,-599,-599,-599,232,-315', +'561,227,609,-305,227,608,-315,759,226,765,-305,294,766,232,768,-315', +'232,224,771,-305,-599,-599,-599,-599,-599,-599,-599,-599,-599,-599,-599', +'-599,-599,-599,228,774,-599,-599,-599,775,-599,-599,227,254,-599,777', +'779,-599,-599,1152,-599,689,-599,790,-599,791,-599,-599,635,-599,-599', +'-599,-599,-599,-315,-599,228,-599,-305,228,129,130,131,132,133,251,-314', +'793,296,253,252,-599,795,-314,-599,-599,-599,-599,-704,-599,227,-599', +'-314,796,232,798,-599,672,678,-599,323,81,82,83,11,65,670,228,801,71', +'72,677,232,806,75,-700,73,74,76,33,34,79,80,129,130,131,132,133,84,31', +'30,114,113,115,116,807,582,21,579,578,577,-314,580,10,51,325,12,118', +'117,119,108,64,110,109,111,228,112,120,121,-315,104,105,47,48,46,-314', +'-315,-599,811,227,271,272,-314,781,-599,-315,557,-704,673,-700,669,-314', +'785,-599,43,477,668,36,-287,835,66,67,227,839,68,840,38,666,665,1157', +'50,-288,-700,662,254,853,270,269,1155,22,513,637,513,232,102,90,93,94', +'870,95,97,96,98,986,-315,871,629,91,101,628,-314,894,-599,590,228,85', +'251,92,106,107,253,252,44,45,323,81,82,83,11,65,870,897,418,71,72,899', +'290,228,75,-707,73,74,76,33,34,79,80,624,905,907,909,591,84,31,30,114', +'113,115,116,527,529,21,529,1004,759,232,613,10,51,325,12,118,117,119', +'108,64,110,109,111,612,112,120,121,227,104,105,47,48,46,227,1152,-707', +'296,-349,296,759,633,254,-707,635,-349,232,920,-703,602,635,-620,-707', +'43,-349,941,36,942,232,66,67,227,562,68,920,38,951,952,476,50,582,-707', +'579,578,577,254,580,477,22,232,558,552,232,102,90,93,94,296,95,97,96', +'98,986,228,366,962,91,101,366,228,232,-707,590,-349,85,232,92,106,107', +'-289,305,44,45,323,81,82,83,11,65,232,548,973,71,72,541,540,228,75,719', +'73,74,76,33,34,79,80,246,232,-83,135,591,84,31,30,114,113,115,116,232', +'232,21,1000,1004,1001,1002,1005,10,51,325,12,118,117,119,108,64,110', +'109,111,529,112,120,121,527,104,105,47,48,46,254,258,259,260,261,271', +'272,266,267,262,263,525,247,248,907,1011,264,265,232,43,3,245,36,587', +'759,66,67,513,1029,68,-287,38,251,590,257,50,253,252,1033,249,250,270', +'269,255,22,256,232,1036,1038,102,90,93,94,774,95,97,96,98,789,1041,1043', +'1043,91,101,232,268,598,597,1051,1053,85,591,92,106,107,1062,1063,44', +'45,323,81,82,83,11,65,1068,830,831,71,72,832,120,121,75,1069,73,74,76', +'33,34,79,80,129,130,131,132,133,84,31,30,114,113,115,116,1070,-290,21', +'232,232,232,1074,674,10,51,325,12,118,117,119,108,64,110,109,111,231', +'112,120,121,232,104,105,47,48,46,254,258,259,260,261,271,272,266,267', +'262,263,232,247,248,232,870,264,265,1082,43,481,480,36,232,1091,66,67', +'774,1094,68,1097,38,251,1099,257,50,253,252,1101,249,250,270,269,255', +'22,256,232,1103,478,102,90,93,94,1118,95,97,96,98,1119,1128,429,870', +'91,101,1138,268,1140,-260,,,85,,92,106,107,,,44,45,323,81,82,83,11,65', +',,,71,72,,,,75,,73,74,76,33,34,79,80,,,,,,84,31,30,114,113,115,116,', +',21,,,,,945,10,51,325,12,118,117,119,108,64,110,109,111,,112,120,121', +',104,105,47,48,46,254,258,259,260,261,271,272,266,267,262,263,,247,248', +',,264,265,,43,,,36,587,,66,67,,,68,,38,251,590,257,50,253,252,,249,250', +'270,269,255,22,256,,,,102,90,93,94,,95,97,96,98,,,,,91,101,,268,598', +'597,,,85,591,92,106,107,,,44,45,323,81,82,83,11,65,,,,71,72,,,,75,,73', +'74,76,33,34,79,80,,,,,,84,31,30,114,113,115,116,,,21,,,,,674,10,51,325', +'12,118,117,119,108,64,110,109,111,,112,120,121,,104,105,47,48,46,254', +'258,259,260,261,271,272,266,267,262,263,,247,248,,,264,265,,43,,,36', +',,66,67,,,68,,38,251,,257,50,253,252,,249,250,270,269,255,22,256,,,', +'102,90,93,94,,95,97,96,98,,,,,91,101,,268,,,,,85,,92,106,107,,,44,45', +'323,81,82,83,11,65,,,,71,72,,,,75,,73,74,76,33,34,79,80,,,,,,84,31,30', +'114,113,115,116,,,21,,,,,917,10,51,325,12,118,117,119,108,64,110,109', +'111,,112,120,121,,104,105,47,48,46,254,258,259,260,261,271,272,266,267', +'262,263,,247,248,,,264,265,,43,,,36,,,66,67,,,68,,38,251,,257,50,253', +'252,,249,250,270,269,255,22,256,,,,102,90,93,94,,95,97,96,98,,,,,91', +'101,,268,,,,,85,,92,106,107,,,44,45,323,81,82,83,11,65,,,,71,72,,,,75', +',73,74,76,33,34,79,80,,,,,,84,31,30,114,113,115,116,,1133,21,579,578', +'577,,580,10,51,325,12,118,117,119,108,64,110,109,111,,112,120,121,,104', +'105,47,48,46,254,258,259,260,261,271,272,266,267,262,263,,247,248,,', +'264,265,,43,,,36,,,66,67,,,68,,38,251,,257,50,253,252,,249,250,270,269', +'255,22,256,,,,102,90,93,94,,95,97,96,98,,,,,91,101,232,268,,,,,85,,92', +'106,107,,,44,45,323,81,82,83,11,65,,,,71,72,,,,75,,73,74,76,33,34,79', +'80,,,,,,84,31,30,114,113,115,116,,1133,21,579,578,577,,580,10,51,325', +'12,118,117,119,108,64,110,109,111,,112,120,121,,104,105,47,48,46,254', +'258,259,260,261,271,272,266,267,262,263,,247,248,,,264,265,,43,,,36', +',,66,67,,,68,,38,251,,257,50,253,252,,249,250,270,269,255,22,256,,,', +'102,90,93,94,,95,97,96,98,,,,,91,101,,268,,,,,85,,92,106,107,,,44,45', +'323,81,82,83,11,65,,,,71,72,,,,75,,73,74,76,33,34,79,80,,,,,,84,31,30', +'114,113,115,116,,,21,,,,,,10,51,325,12,118,117,119,108,64,110,109,111', +',112,120,121,,104,105,47,48,46,254,258,259,260,261,271,272,266,267,262', +'263,,247,248,,,264,265,,43,,,36,,,66,67,,,68,,38,251,,257,50,253,252', +',249,250,270,269,255,22,256,,,,102,90,93,94,,95,97,96,98,,,,,91,101', +',268,,,,,85,,92,106,107,,,44,45,323,81,82,83,11,65,,,,71,72,,,,75,,73', +'74,76,33,34,79,80,,,,,,84,31,30,114,113,115,116,,,21,,,,,,10,51,325', +'12,118,117,119,108,64,110,109,111,,112,120,121,,104,105,47,48,46,254', +'258,259,260,261,271,272,266,267,262,263,,247,248,,,264,265,,43,,,36', +',,66,67,,,68,,38,251,,257,50,253,252,,249,250,270,269,255,22,256,,,', +'102,90,93,94,,95,97,96,98,,,,,91,101,,268,,,,,85,,92,106,107,,,44,45', +'323,81,82,83,11,65,,,,71,72,,,,75,,73,74,76,33,34,79,80,,,,,,84,31,30', +'114,113,115,116,,,21,,,,,,10,51,325,12,118,117,119,108,64,110,109,111', +',112,120,121,,104,105,47,48,46,254,258,259,260,261,271,272,266,267,262', +'263,,247,248,,,264,265,,43,,,36,,,66,67,,,68,,38,251,,257,50,253,252', +',249,250,270,269,255,22,256,,,,102,90,93,94,,95,97,96,98,,,,,91,101', +',268,,,,,85,,92,106,107,,,44,45,323,81,82,83,11,65,,,,71,72,,,,75,,73', +'74,76,33,34,79,80,,,,,,84,31,30,114,113,115,116,,,21,,,,,,10,51,325', +'12,118,117,119,108,64,110,109,111,,112,120,121,,104,105,47,48,46,254', +'258,259,260,261,271,272,266,267,262,263,,247,248,,,264,265,,43,,,327', +',,66,67,,,68,,38,251,,257,50,253,252,,249,250,270,269,255,22,256,,,', +'102,90,93,94,,95,97,96,98,,,,,91,101,,268,,,,,85,,92,106,107,,,44,45', +'7,81,82,83,11,65,,,,71,72,,,,75,,73,74,76,33,34,79,80,,,,,,84,31,30', +'114,113,115,116,,,21,,,,,,10,51,9,12,118,117,119,108,64,110,109,111', +',112,120,121,,104,105,47,48,46,254,258,259,260,261,271,272,266,267,262', +'263,,247,248,,,264,265,,43,,,36,,,66,67,,,68,,38,251,,257,50,253,252', +',249,250,270,269,255,22,256,,,,102,90,93,94,,95,97,96,98,,,,,91,101', +',268,,,,,85,,92,106,107,,,44,45,323,81,82,83,11,65,,,,71,72,,,,75,,73', +'74,76,33,34,79,80,,,,,,84,31,30,114,113,115,116,,582,21,579,578,577', +',580,10,51,325,12,118,117,119,108,64,110,109,111,,112,120,121,,104,105', +'47,48,46,582,,579,578,577,,580,,781,,582,,579,578,577,,580,785,,43,', +',327,,,66,67,,254,68,,38,,,,50,,781,,582,,579,578,577,22,580,785,781', +',102,90,93,94,,95,97,96,98,,,251,,91,101,253,252,,249,250,,85,,92,106', +'107,,781,44,45,323,81,82,83,11,65,,,,71,72,,,,75,,73,74,76,33,34,79', +'80,,,,,,84,31,30,114,113,115,116,,,21,,,254,,,10,51,325,12,118,117,119', +'108,64,110,109,111,,112,120,121,,104,105,47,48,46,254,258,259,260,261', +'271,272,251,,262,263,253,252,,249,250,264,265,,43,,,36,,,66,67,,,68', +',38,251,,257,50,253,252,,249,250,270,269,255,22,256,,,,102,90,93,94', +',95,97,96,98,,,,,91,101,,582,,579,578,577,85,580,92,106,107,,,44,45', +'323,81,82,83,11,65,,,,71,72,,,,75,,73,74,76,33,34,79,80,781,,,,,84,31', +'30,114,113,115,116,,,21,,,,,,10,51,325,12,118,117,119,108,64,110,109', +'111,,112,120,121,,104,105,47,48,46,254,-729,-729,-729,-729,271,272,', +',-729,-729,,,,,,264,265,,43,,,36,,,66,67,,,68,,38,251,,257,50,253,252', +',249,250,270,269,255,22,256,,,,102,90,93,94,,95,97,96,98,,,,,91,101', +',,,,,,85,,92,106,107,,,44,45,323,81,82,83,11,65,,,,71,72,,,,75,,73,74', +'76,33,34,79,80,,,,,,84,31,30,114,113,115,116,,,21,,,,,,10,51,325,12', +'118,117,119,108,64,110,109,111,,112,120,121,,104,105,47,48,46,254,-729', +'-729,-729,-729,271,272,,,-729,-729,,,,,,264,265,,43,,,327,,,66,67,,', +'68,,38,251,,257,50,253,252,,249,250,270,269,255,22,256,,,,102,90,93', +'94,,95,97,96,98,,,,,91,101,,,,,,,85,,92,106,107,,,44,45,323,81,82,83', +'11,65,,,,71,72,,,,75,,73,74,76,33,34,79,80,,,,,,84,31,30,114,113,115', +'116,,,21,,,,,,10,51,325,12,118,117,119,108,64,110,109,111,,112,120,121', +',104,105,47,48,46,254,-729,-729,-729,-729,271,272,,,-729,-729,,,,,,264', +'265,,43,,,36,,,66,67,,,68,,38,251,,257,50,253,252,,249,250,270,269,255', +'22,256,,,,102,90,93,94,,95,97,96,98,,,,,91,101,,,,,,,85,,92,106,107', +',,44,45,323,81,82,83,11,65,,,,71,72,,,,75,,73,74,76,33,34,79,80,,,,', +',84,31,30,114,113,115,116,,,21,,,,,,10,51,325,12,118,117,119,108,64', +'110,109,111,,112,120,121,,104,105,47,48,46,254,-729,-729,-729,-729,271', +'272,,,-729,-729,,,,,,264,265,,43,,,36,,,66,67,,,68,,38,251,,257,50,253', +'252,,249,250,270,269,255,22,256,,,,102,90,93,94,,95,97,96,98,,,,,91', +'101,,,,,,,85,,92,106,107,,,44,45,7,81,82,83,11,65,,,,71,72,,,,75,,73', +'74,76,33,34,79,80,,,,,,84,31,30,114,113,115,116,,,21,,,,,,10,51,9,12', +'118,117,119,108,64,110,109,111,,112,120,121,,104,105,47,48,46,254,258', +'259,260,261,271,272,266,267,262,263,,-729,-729,,,264,265,,43,,,36,,', +'66,67,,,68,,38,251,,257,50,253,252,,249,250,270,269,255,22,256,,,,102', +'90,93,94,,95,97,96,98,,,,,91,101,,,,,,,85,,92,106,107,,,44,45,323,81', +'82,83,11,65,,,,71,72,,,,75,,73,74,76,33,34,79,80,,,,,,84,31,30,114,113', +'115,116,,,21,,,,,,10,51,325,12,118,117,119,108,64,110,109,111,,112,120', +'121,,104,105,47,48,46,254,258,259,260,261,271,272,266,267,262,263,,-729', +'-729,,,264,265,,43,,,36,,,66,67,,,68,,38,251,,257,50,253,252,,249,250', +'270,269,255,22,256,,,,102,90,93,94,,95,97,96,98,,,,,91,101,,,,,,,85', +',92,106,107,,,44,45,323,81,82,83,11,65,,,,71,72,,,,75,,73,74,76,33,34', +'79,80,,,,,,84,31,30,114,113,115,116,,,21,,,,,,10,51,325,12,118,117,119', +'108,64,110,109,111,,112,120,121,,104,105,47,48,46,254,258,259,260,261', +'271,272,266,,262,263,,,,,,264,265,,43,,,36,,,66,67,,,68,,38,251,,257', +'50,253,252,,249,250,270,269,255,22,256,,,,102,90,93,94,,95,97,96,98', +',,,,91,101,,,,,,,85,,92,106,107,,,44,45,323,81,82,83,11,65,,,,71,72', +',,,75,,73,74,76,33,34,79,80,,,,,,84,31,30,114,113,115,116,,,21,,,,,', +'10,51,325,12,118,117,119,108,64,110,109,111,,112,120,121,,104,105,47', +'48,46,254,,,,,,,,,,,,,,,,264,265,,43,,,36,,,66,67,,,68,,38,251,,257', +'50,253,252,,249,250,,,255,22,256,,,,102,90,93,94,,95,97,96,98,,,,,91', +'101,,,,,,,85,,92,106,107,,,44,45,323,81,82,83,11,65,,,,71,72,,,,75,', +'73,74,76,33,34,79,80,,,,,,84,31,30,114,113,115,116,,,21,,,,,,10,51,325', +'12,118,117,119,108,64,110,109,111,,112,120,121,,104,105,47,48,46,254', +'258,259,260,261,271,272,266,267,262,263,,-729,-729,,,264,265,,43,,,36', +',,66,67,,,68,,38,251,,257,50,253,252,,249,250,270,269,255,22,256,,,', +'102,90,93,94,,95,97,96,98,,,,,91,101,,,,,,,85,,92,106,107,,,44,45,323', +'81,82,83,11,65,,,,71,72,,,,75,,73,74,76,33,34,79,80,,,,,,84,31,30,114', +'113,115,116,,,21,,,,,,10,51,325,12,118,117,119,108,64,110,109,111,,112', +'120,121,,104,105,47,48,46,254,-729,-729,-729,-729,271,272,,,-729,-729', +',,,,,264,265,,43,,,36,,,66,67,,,68,,38,251,,257,50,253,252,,249,250', +'270,269,255,22,256,,,,102,90,93,94,,95,97,96,98,,,,,91,101,,,,,,,85', +',92,106,107,,,44,45,323,81,82,83,11,65,,,,71,72,,,,75,,73,74,76,33,34', +'79,80,,,,,,84,31,30,114,113,115,116,,,21,,,,,,10,51,325,12,118,117,119', +'108,64,110,109,111,,112,120,121,,104,105,47,48,46,254,258,259,260,261', +'271,272,266,267,262,263,,-729,-729,,,264,265,,43,,,36,,,66,67,,,68,', +'38,251,,257,50,253,252,,249,250,270,269,255,22,256,,,,102,90,93,94,', +'95,97,96,98,,,,,91,101,,,,,,,85,,92,106,107,,,44,45,323,81,82,83,11', +'65,,,,71,72,,,,75,,73,74,76,33,34,79,80,,,,,,84,31,30,114,113,115,116', +',,21,,,,,,10,51,325,12,118,117,119,108,64,110,109,111,,112,120,121,', +'104,105,47,48,46,254,-729,-729,-729,-729,271,272,,,-729,-729,,,,,,264', +'265,,43,,,36,,,66,67,,,68,,38,251,,257,50,253,252,,249,250,270,269,255', +'22,256,,,,102,90,93,94,,95,97,96,98,,,,,91,101,,,,,,,85,,92,106,107', +',,44,45,323,81,82,83,11,65,,,,71,72,,,,75,,73,74,76,33,34,79,80,,,,', +',84,31,30,114,113,115,116,,,21,,,,,,10,51,325,12,118,117,119,108,64', +'110,109,111,,112,120,121,,104,105,47,48,46,254,,,,,,,,,,,,,,,,264,265', +',43,,,36,,,66,67,,,68,,38,251,,257,50,253,252,,249,250,,,255,22,256', +',,,102,90,93,94,,95,97,96,98,,,,,91,101,,,,81,82,83,85,65,92,106,107', +'71,72,44,45,,75,,73,74,76,33,34,79,80,,,,,,84,31,30,114,113,115,116', +',,21,,,,,,,51,,,118,117,119,108,64,110,109,111,,112,120,121,,104,105', +'47,48,46,254,,,,,,,,,,,,,,,,264,265,,237,,,243,,,66,67,,,68,,,251,,257', +'50,253,252,,249,250,,,,22,,,,,102,90,93,94,,95,97,96,98,,,,,91,101,', +',,,,,85,,92,106,107,-270,,44,45,,,,-270,-270,-270,,,-270,-270,-270,', +'-270,254,,,,,,,-270,-270,-270,,,,,,,264,265,,-270,-270,,-270,-270,-270', +'-270,-270,,,,,,251,,511,460,253,252,512,249,250,,,,,,169,170,,166,148', +'149,150,157,154,156,,,151,152,-270,,,171,172,158,159,-270,,,,,296,-270', +',,,,,,163,162,,147,168,165,164,173,160,161,155,153,145,167,146,-270', +'-270,174,,,,,,,,,,,,,-270,,,-270,,,,,-270,81,82,83,11,65,,-270,,71,72', +',,,75,,73,74,76,33,34,79,80,,,,,,84,31,30,114,113,115,116,,,21,,,,,', +'10,51,9,12,118,117,119,108,64,110,109,111,,112,120,121,,104,105,47,48', +'46,254,,,,,,,,,,,,,,,,264,265,,43,,,36,,,66,67,,,68,,38,251,,257,50', +'253,252,,249,250,,,,22,,,,,102,90,93,94,,95,97,96,98,,,,,91,101,,,,81', +'82,83,85,65,92,106,107,71,72,44,45,,75,,73,74,76,33,34,79,80,,,,,,84', +'31,30,114,113,115,116,,,244,,,,,,,51,,,118,117,119,108,64,110,109,111', +'317,112,120,121,,104,105,47,48,46,,,,,,,,,,,,,,,,,,,,237,,,243,,,66', +'67,,,68,,314,,312,,50,,,318,,,,,,242,,,,,102,315,93,94,,95,97,96,98', +',,,,91,101,,,,81,82,83,85,65,92,106,107,71,72,44,45,,75,,73,74,76,33', +'34,79,80,,,,,,84,31,30,114,113,115,116,,,244,,,,,,,51,,,118,117,119', +'108,64,110,109,111,,112,120,121,,104,105,47,48,46,,,,,,,,,,,,,,,,,,', +',237,,,243,,,66,67,,,68,,,,,,50,,,,,,,,,242,,,,,102,90,93,94,,95,97', +'96,98,,,,,91,101,,,,81,82,83,85,65,92,106,107,71,72,44,45,,75,,73,74', +'76,33,34,79,80,,,,,,84,31,30,114,113,115,116,,,21,,,,,,,51,,,118,117', +'119,108,64,110,109,111,,112,120,121,,104,105,47,48,46,,,,,,,,,,,,,,', +',,,,,237,,,243,,,66,67,,,68,,,,,,50,,,,,,,,,22,,,,,102,90,93,94,,95', +'97,96,98,,,,,91,101,,,,,,,85,,92,106,107,-432,,44,45,,,,-432,-432,-432', +',,-432,-432,-432,,-432,,,,,,,,-432,-432,-432,-432,,,,,,,,,-432,-432', +',-432,-432,-432,-432,-432,,,,,,,,,,,,,,,,,,,,,,,-432,-432,-432,-432', +'-432,-432,-432,-432,-432,-432,-432,-432,-432,-432,,,-432,-432,-432,', +',-432,,296,-432,,,-432,-432,,-432,,-432,,-432,,-432,-432,,-432,-432', +'-432,-432,-432,-321,-432,-432,-432,,,,-321,-321,-321,,,-321,-321,-321', +',-321,-432,,,-432,-432,,-432,-321,-432,-321,-321,,,,,-432,,,,-321,-321', +',-321,-321,-321,-321,-321,,,,,,,,,,,,,,,,,,,,,,,-321,-321,-321,-321', +'-321,-321,-321,-321,-321,-321,-321,-321,-321,-321,,,-321,-321,-321,', +',-321,,305,-321,,,-321,-321,,-321,,-321,,-321,,-321,-321,,-321,-321', +'-321,-321,-321,,-321,,-321,,,,,,,,,,,,,,-321,,,-321,-321,,-321,,-321', +'81,82,83,,65,,-321,,71,72,,,,75,,73,74,76,33,34,79,80,,,,,,84,31,30', +'114,113,115,116,,,244,,,,,,,51,,,118,117,119,108,64,110,109,111,317', +'112,120,121,,104,105,47,48,46,,,,,,,,,,,,,,,,,,,,237,,,243,,,66,67,', +',68,,314,,312,,50,,,318,,,,,,242,,,,,102,315,93,94,,95,97,96,98,,,,', +'91,101,,,,81,82,83,85,65,92,106,107,71,72,44,45,,75,,73,74,76,33,34', +'79,80,,,,,,84,31,30,114,113,115,116,,,244,,,,,,,51,,,118,117,119,108', +'64,110,109,111,317,112,120,121,,104,105,47,48,46,,,,,,,,,,,,,,,,,,,', +'237,,,243,,,66,67,,,68,,314,,312,,50,,,318,,,,,,242,,,,,102,315,93,94', +',95,97,96,98,,,,,91,101,,,,81,82,83,85,65,92,106,107,71,72,44,45,,75', +',73,74,76,33,34,79,80,,,,,,84,31,30,114,113,115,116,,,244,,,,,,,51,', +',118,117,119,108,64,110,109,111,317,112,120,121,,104,105,47,48,46,,', +',,,,,,,,,,,,,,,,,237,,,243,,,66,67,,,68,,314,,312,,50,,,318,,,,,,242', +',,,,102,315,93,94,,95,97,96,98,,,,,91,101,,,,81,82,83,85,65,92,106,107', +'71,72,44,45,,75,,73,74,76,33,34,79,80,,,,,,84,31,30,114,113,115,116', +',,21,,,,,,,51,,,118,117,119,108,64,110,109,111,,112,120,121,,104,105', +'47,48,46,,,,,,,,,,,,,,,,,,,,237,,,243,,,66,67,,,68,,,,,,50,,,,,,,,,22', +',,,,102,90,93,94,,95,97,96,98,,,,,91,101,,,,81,82,83,85,65,92,106,107', +'71,72,44,45,,75,,73,74,76,344,345,79,80,,,,,,84,339,347,114,113,115', +'116,,,244,,,,,,,51,,,118,117,119,108,64,110,109,111,,112,120,121,,104', +'105,47,48,46,,,,,,,,,,,,,,,,,,,,237,,,243,,,66,67,,,68,,,,,,50,,,,,', +',,,242,,,,,102,90,93,94,,95,97,96,98,,,,,91,101,,,,81,82,83,85,65,92', +'106,107,71,72,44,45,,75,,73,74,76,344,345,79,80,,,,,,84,339,347,114', +'113,115,116,,,244,,,,,,,51,,,118,117,119,108,64,110,109,111,,112,120', +'121,,104,105,47,48,46,,,,,,,,,,,,,,,,,,,,237,,,243,,,66,67,,,68,,,,', +',50,,,,,,,,,242,,,,,102,90,93,94,,95,97,96,98,,,,,91,101,,,,81,82,83', +'85,65,92,106,107,71,72,44,45,,75,,73,74,76,344,345,79,80,,,,,,84,339', +'347,114,113,115,116,,,244,,,,,,,51,,,118,117,119,108,64,110,109,111', +',112,120,121,,104,105,47,48,46,,,,,,,,,,,,,,,,,,,,237,,,243,,,66,67', +',,68,,,,,,50,,,,,,,,,242,,,,,102,90,93,94,,95,97,96,98,,,,,91,101,,', +',81,82,83,85,65,92,106,107,71,72,44,45,,75,,73,74,76,344,345,79,80,', +',,,,84,339,347,114,113,115,116,,,244,,,,,,,51,,,118,117,119,108,64,110', +'109,111,,112,120,121,,104,105,47,48,46,,,,,,,,,,,,,,,,,,,,237,,,243', +',,66,67,,,68,,,,,,50,,,,,,,,,242,,,,,102,90,93,94,,95,97,96,98,,,,,91', +'101,,,,81,82,83,85,65,92,106,107,71,72,44,45,,75,,73,74,76,344,345,79', +'80,,,,,,84,339,347,114,113,115,116,,,244,,,,,,,51,,,118,117,119,108', +'64,110,109,111,,112,120,121,,104,105,47,48,46,,,,,,,,,,,,,,,,,,,,237', +',,243,,,66,67,,,68,,,,,,50,,,,,,,,,242,,,,,102,90,93,94,,95,97,96,98', +',,,,91,101,,,,,,,85,,92,106,107,-306,,44,45,,,,-306,-306,-306,,,-306', +'-306,-306,,-306,,,,,,,,-306,,-306,-306,-306,,,,114,113,115,116,-306', +'-306,,-306,-306,-306,-306,-306,,,,,118,117,119,,,,,,,,,,,104,105,,,348', +'-306,-306,-306,-306,-306,-306,-306,-306,-306,-306,-306,-306,-306,-306', +',,-306,-306,-306,,,-306,,,-306,,,-306,-306,,-306,,-306,,-306,,-306,-306', +',-306,-306,-306,-306,-306,,-306,,-306,,102,90,93,94,,95,97,96,98,,,', +'-306,91,101,-306,-306,-306,-306,,-306,85,-306,92,106,107,,-306,81,82', +'83,11,65,,,,71,72,,,,75,,73,74,76,33,34,79,80,,,,,,84,31,30,114,113', +'115,116,,,21,,,,,,10,51,,12,118,117,119,108,64,110,109,111,,112,120', +'121,,104,105,47,48,46,,,,,,,,,,,,,,,,,,,,43,,,36,,,66,67,,,68,,38,,', +',50,,,,,,,,,22,,,,,102,90,93,94,,95,97,96,98,,,,,91,101,,,,81,82,83', +'85,65,92,106,107,71,72,44,45,,75,,73,74,76,344,345,79,80,,,,,,84,339', +'347,114,113,115,116,,,244,,,,,,,51,,,118,117,119,108,64,110,109,111', +'317,112,120,121,,104,105,47,48,46,,,,,,,,,,,,,,,,,,,,237,,,243,,,66', +'67,,,68,,314,,,,50,,,318,,,,,,242,,,,,102,315,93,94,,95,97,96,98,,,', +',91,101,,,,81,82,83,85,65,92,106,107,71,72,44,45,,75,,73,74,76,344,345', +'79,80,,,,,,84,339,347,114,113,115,116,,,244,,,,,,,51,,,118,117,119,108', +'64,110,109,111,317,112,120,121,,104,105,47,48,46,,,,,,,,,,,,,,,,,,,', +'237,,,243,,,66,67,,,68,,,,,,50,,,318,,,,,,242,,,,,102,315,93,94,,95', +'97,96,98,,,,,91,101,,,,81,82,83,85,65,92,106,107,71,72,44,45,,75,,73', +'74,76,33,34,79,80,,,,,,84,31,30,114,113,115,116,,,21,,,,,,,51,,,118', +'117,119,108,64,110,109,111,,112,120,121,,104,105,47,48,46,,,,,,,,,,', +',,,,,,,,,237,,,243,,,66,67,,,68,,,,,,50,,,,,,,,,22,,,,,102,90,93,94', +',95,97,96,98,,,,,91,101,,,,81,82,83,85,65,92,106,107,71,72,44,45,,75', +',73,74,76,33,34,79,80,,,,,,84,31,30,114,113,115,116,,,21,,,,,,,51,,', +'118,117,119,108,64,110,109,111,,112,120,121,,104,105,47,48,46,,,,,,', +',,,,,,,,,,,,,237,,,243,,,66,67,,,68,,,,,,50,,,,,,,,,22,,,,,102,90,93', +'94,,95,97,96,98,,,,,91,101,,,,81,82,83,85,65,92,106,107,71,72,44,45', +',75,,73,74,76,33,34,79,80,,,,,,84,31,30,114,113,115,116,,,21,,,,,,,51', +',,118,117,119,108,64,110,109,111,,112,120,121,,104,105,47,48,46,,,,', +',,,,,,,,,,,,,,,237,,,243,,,66,67,,,68,,,,,,50,,,,,,,,,22,,,,,102,90', +'93,94,,95,97,96,98,,,,,91,101,126,,,,,125,85,,92,106,107,,,44,45,81', +'82,83,11,65,,,,71,72,,,,75,,73,74,76,33,34,79,80,,,,,,84,31,30,114,113', +'115,116,,,21,,,,,,10,51,9,12,118,117,119,108,64,110,109,111,,112,120', +'121,,104,105,47,48,46,,,,,,,,,,,,,,,,,,,,43,,,36,,,66,67,,,68,,38,,', +',50,,,,,,,,,22,,,,,102,90,93,94,,95,97,96,98,,,,,91,101,,,,,,418,85', +',92,106,107,,,44,45,81,82,83,,65,,,,71,72,,,,75,,73,74,76,33,34,79,80', +',,,,,84,31,30,114,113,115,116,,,21,,,,,,,51,,,118,117,119,108,64,110', +'109,111,,112,120,121,,104,105,47,48,46,,,,,,,,,,,,,,,,,,,,237,,,243', +',,66,67,,,68,,,,,,50,,,,,,,,,22,,,,,102,90,93,94,,95,97,96,98,,,,,91', +'101,,,,81,82,83,85,65,92,106,107,71,72,44,45,,75,,73,74,76,33,34,79', +'80,,,,,,84,31,30,114,113,115,116,,,21,,,,,,,51,,,118,117,119,108,64', +'110,109,111,,112,120,121,,104,105,47,48,46,,,,,,,,,,,,,,,,,,,,237,,', +'243,,,66,67,,,68,,,,,,50,,,,,,,,,22,,,,,102,90,93,94,,95,97,96,98,,', +',,91,101,,,,81,82,83,85,65,92,106,107,71,72,44,45,,75,,73,74,76,33,34', +'79,80,,,,,,84,31,30,114,113,115,116,,,21,,,,,,,51,,,118,117,119,108', +'64,110,109,111,,112,120,121,,104,105,47,48,46,,,,,,,,,,,,,,,,,,,,237', +',,243,,,66,67,,,68,,,,,,50,,,,,,,,,22,,,,,102,90,93,94,,95,97,96,98', +',,,,91,101,,,,81,82,83,85,65,92,106,107,71,72,44,45,,75,,73,74,76,344', +'345,79,80,,,,,,84,339,347,114,113,115,116,,,244,,,,,,,51,,,118,117,119', +'108,64,110,109,111,,112,120,121,,104,105,47,48,46,,,,,,,,,,,,,,,,,,', +',237,,,243,,,66,67,,,68,,,,,,50,,,,,,,,,242,,,,,102,90,93,94,,95,97', +'96,98,,,,,91,101,,,,,,,85,,92,106,107,,,44,45,81,82,83,11,65,,,,71,72', +',,,75,,73,74,76,33,34,79,80,,,,,,84,31,30,114,113,115,116,,,21,,,,,', +'10,51,,12,118,117,119,108,64,110,109,111,,112,120,121,,104,105,47,48', +'46,,,,,,,,,,,,,,,,,,,,43,,,36,,,66,67,,,68,,38,,,,50,,,,,,,,,22,,,,', +'102,90,93,94,,95,97,96,98,,,,,91,101,,,,81,82,83,85,65,92,106,107,71', +'72,44,45,,75,,73,74,76,33,34,79,80,,,,,,84,31,30,114,113,115,116,,,21', +',,,,,,51,,,118,117,119,108,64,110,109,111,,112,120,121,,104,105,47,48', +'46,,,,,,,,,,,,,,,,,,,,237,,,243,,,66,67,,,68,,,,,,50,,,,,,,,,22,,,,', +'102,90,93,94,,95,97,96,98,,,,,91,101,232,,,81,82,83,85,65,92,106,107', +'71,72,44,45,,75,,73,74,76,344,345,79,80,,,,,,84,339,347,114,113,115', +'116,,,244,,,,,,,51,,,118,117,119,108,64,110,109,111,,112,120,121,,104', +'105,47,48,46,,,,,,,,,,,,,,,,,,,,237,,,243,,,66,67,,,68,,,,,,50,,,,,', +',,,242,,,,,102,90,93,94,,95,97,96,98,,,,,91,101,,,,81,82,83,85,65,92', +'106,107,71,72,44,45,,75,,73,74,76,344,345,79,80,,,,,,84,339,347,114', +'113,115,116,,,244,,,,,,,51,,,118,117,119,108,64,110,109,111,,112,120', +'121,,104,105,47,48,46,,,,,,,,,,,,,,,,,,,,237,,,243,,,66,67,,,68,,,,', +',50,,,,,,,,,242,,,,,102,90,93,94,,95,97,96,98,,,,,91,101,,,,81,82,83', +'85,65,92,106,107,71,72,44,45,,75,,73,74,76,344,345,79,80,,,,,,84,339', +'347,114,113,115,116,,,244,,,,,,,51,,,118,117,119,108,64,110,109,111', +',112,120,121,,104,105,47,48,46,,,,,,,,,,,,,,,,,,,,237,,,243,,,66,67', +',,68,,,,,,50,,,,,,,,,242,,,,,102,90,93,94,,95,97,96,98,,,,,91,101,,', +',81,82,83,85,65,92,106,107,71,72,44,45,,75,,73,74,76,344,345,79,80,', +',,,,84,339,347,114,113,115,116,,,244,,,,,,,51,,,118,117,119,108,64,110', +'109,111,,112,120,121,,104,105,47,48,46,,,,,,,,,,,,,,,,,,,,237,,,243', +',,66,67,,,68,,,,,,50,,,,,,,,,242,,,,,102,90,93,94,,95,97,96,98,,,,,91', +'101,,,,81,82,83,85,65,92,106,107,71,72,44,45,,75,,73,74,76,344,345,79', +'80,,,,,,84,339,347,114,113,115,116,,,244,,,,,,,51,,,118,117,119,108', +'64,110,109,111,,112,120,121,,104,105,47,48,46,,,,,,,,,,,,,,,,,,,,237', +',,243,,,66,67,,,68,,,,,,50,,,,,,,,,242,,,,,102,90,93,94,,95,97,96,98', +',,,,91,101,,,,81,82,83,85,65,92,106,107,71,72,44,45,,75,,73,74,76,344', +'345,79,80,,,,,,84,339,347,114,113,115,116,,,244,,,,,,,51,,,118,117,119', +'108,64,110,109,111,,112,120,121,,104,105,47,48,46,,,,,,,,,,,,,,,,,,', +',237,,,243,,,66,67,,,68,,,,,,50,,,,,,,,,242,,,,,102,90,93,94,,95,97', +'96,98,,,,,91,101,,,,81,82,83,85,65,92,106,107,71,72,44,45,,75,,73,74', +'76,344,345,79,80,,,,,,84,339,347,114,113,115,116,,,244,,,,,,,51,,,118', +'117,119,108,64,110,109,111,,112,120,121,,104,105,47,48,46,,,,,,,,,,', +',,,,,,,,,237,,,243,,,66,67,,,68,,,,,,50,,,,,,,,,242,,,,,102,90,93,94', +',95,97,96,98,,,,,91,101,,,,81,82,83,85,65,92,106,107,71,72,44,45,,75', +',73,74,76,344,345,79,80,,,,,,84,339,347,114,113,115,116,,,244,,,,,,', +'51,,,118,117,119,108,64,110,109,111,,112,120,121,,104,105,47,48,46,', +',,,,,,,,,,,,,,,,,,237,,,243,,,66,67,,,68,,,,,,50,,,,,,,,,242,,,,,102', +'90,93,94,,95,97,96,98,,,,,91,101,,,,81,82,83,85,65,92,106,107,71,72', +'44,45,,75,,73,74,76,344,345,79,80,,,,,,84,339,347,114,113,115,116,,', +'244,,,,,,,51,,,118,117,119,108,64,110,109,111,,112,120,121,,104,105', +'47,48,46,,,,,,,,,,,,,,,,,,,,237,,,243,,,66,67,,,68,,,,,,50,,,,,,,,,242', +',,,,102,90,93,94,,95,97,96,98,,,,,91,101,,,,81,82,83,85,65,92,106,107', +'71,72,44,45,,75,,73,74,76,344,345,79,80,,,,,,84,339,347,114,113,115', +'116,,,244,,,,,,,51,,,118,117,119,108,64,110,109,111,,112,120,121,,104', +'105,47,48,46,,,,,,,,,,,,,,,,,,,,237,,,243,,,66,67,,,68,,,,,,50,,,,,', +',,,242,,,,,102,90,93,94,,95,97,96,98,,,,,91,101,,,,81,82,83,85,65,92', +'106,107,71,72,44,45,,75,,73,74,76,344,345,79,80,,,,,,84,339,347,114', +'113,115,116,,,244,,,,,,,51,,,118,117,119,108,64,110,109,111,,112,120', +'121,,104,105,47,48,46,,,,,,,,,,,,,,,,,,,,237,,,243,,,66,67,,,68,,,,', +',50,,,,,,,,,242,,,,,102,90,93,94,,95,97,96,98,,,,,91,101,,,,81,82,83', +'85,65,92,106,107,71,72,44,45,,75,,73,74,76,344,345,79,80,,,,,,84,339', +'347,114,113,115,116,,,244,,,,,,,51,,,118,117,119,108,64,110,109,111', +',112,120,121,,104,105,47,48,46,,,,,,,,,,,,,,,,,,,,237,,,243,,,66,67', +',,68,,,,,,50,,,,,,,,,242,,,,,102,90,93,94,,95,97,96,98,,,,,91,101,,', +',81,82,83,85,65,92,106,107,71,72,44,45,,75,,73,74,76,344,345,79,80,', +',,,,84,339,347,114,113,115,116,,,244,,,,,,,51,,,118,117,119,108,64,110', +'109,111,,112,120,121,,104,105,47,48,46,,,,,,,,,,,,,,,,,,,,237,,,243', +',,66,67,,,68,,,,,,50,,,,,,,,,242,,,,,102,90,93,94,,95,97,96,98,,,,,91', +'101,,,,81,82,83,85,65,92,106,107,71,72,44,45,,75,,73,74,76,344,345,79', +'80,,,,,,84,339,347,114,113,115,116,,,244,,,,,,,51,,,118,117,119,108', +'64,110,109,111,,112,120,121,,104,105,47,48,46,,,,,,,,,,,,,,,,,,,,237', +',,243,,,66,67,,,68,,,,,,50,,,,,,,,,242,,,,,102,90,93,94,,95,97,96,98', +',,,,91,101,,,,81,82,83,85,65,92,106,107,71,72,44,45,,75,,73,74,76,344', +'345,79,80,,,,,,84,339,347,114,113,115,116,,,244,,,,,,,51,,,118,117,119', +'108,64,110,109,111,,112,120,121,,104,105,47,48,46,,,,,,,,,,,,,,,,,,', +',237,,,243,,,66,67,,,68,,,,,,50,,,,,,,,,242,,,,,102,90,93,94,,95,97', +'96,98,,,,,91,101,,,,81,82,83,85,65,92,106,107,71,72,44,45,,75,,73,74', +'76,344,345,79,80,,,,,,84,339,347,114,113,115,116,,,244,,,,,,,51,,,118', +'117,119,108,64,110,109,111,,112,120,121,,104,105,47,48,46,,,,,,,,,,', +',,,,,,,,,237,,,243,,,66,67,,,68,,,,,,50,,,,,,,,,242,,,,,102,90,93,94', +',95,97,96,98,,,,,91,101,,,,81,82,83,85,65,92,106,107,71,72,44,45,,75', +',73,74,76,344,345,79,80,,,,,,84,339,347,114,113,115,116,,,244,,,,,,', +'51,,,118,117,119,108,64,110,109,111,,112,120,121,,104,105,47,48,46,', +',,,,,,,,,,,,,,,,,,237,,,243,,,66,67,,,68,,,,,,50,,,,,,,,,242,,,,,102', +'90,93,94,,95,97,96,98,,,,,91,101,,,,81,82,83,85,65,92,106,107,71,72', +'44,45,,75,,73,74,76,344,345,79,80,,,,,,84,339,347,114,113,115,116,,', +'244,,,,,,,51,,,118,117,119,108,64,110,109,111,,112,120,121,,104,105', +'47,48,46,,,,,,,,,,,,,,,,,,,,237,,,243,,,66,67,,,68,,,,,,50,,,,,,,,,242', +',,,,102,90,93,94,,95,97,96,98,,,,,91,101,,,,81,82,83,85,65,92,106,107', +'71,72,44,45,,75,,73,74,76,344,345,79,80,,,,,,84,339,347,114,113,115', +'116,,,244,,,,,,,51,,,118,117,119,108,64,110,109,111,,112,120,121,,104', +'105,47,48,46,,,,,,,,,,,,,,,,,,,,237,,,243,,,66,67,,,68,,,,,,50,,,,,', +',,,242,,,,,102,90,93,94,,95,97,96,98,,,,,91,101,,,,81,82,83,85,65,92', +'106,107,71,72,44,45,,75,,73,74,76,344,345,79,80,,,,,,84,339,347,114', +'113,115,116,,,244,,,,,,,51,,,118,117,119,108,64,110,109,111,,112,120', +'121,,104,105,47,48,46,,,,,,,,,,,,,,,,,,,,237,,,243,,,66,67,,,68,,,,', +',50,,,,,,,,,242,,,,,102,90,93,94,,95,97,96,98,,,,,91,101,,,,81,82,83', +'85,65,92,106,107,71,72,44,45,,75,,73,74,76,344,345,79,80,,,,,,84,339', +'347,114,113,115,116,,,244,,,,,,,51,,,118,117,119,108,64,110,109,111', +',112,120,121,,104,105,47,48,46,,,,,,,,,,,,,,,,,,,,237,,,243,,,66,67', +',,68,,,,,,50,,,,,,,,,242,,,,,102,90,93,94,,95,97,96,98,,,,,91,101,,', +',81,82,83,85,65,92,106,107,71,72,44,45,,75,,73,74,76,344,345,79,80,', +',,,,84,339,347,114,113,115,116,,,244,,,,,,,51,,,118,117,119,108,64,110', +'109,111,,112,120,121,,104,105,47,48,46,,,,,,,,,,,,,,,,,,,,237,,,243', +',,66,67,,,68,,,,,,50,,,,,,,,,242,,,,,102,90,93,94,,95,97,96,98,,,,,91', +'101,,,,81,82,83,85,65,92,106,107,71,72,44,45,,75,,73,74,76,344,345,79', +'80,,,,,,84,339,347,114,113,115,116,,,244,,,,,,,51,,,118,117,119,108', +'64,110,109,111,,112,120,121,,104,105,47,48,46,,,,,,,,,,,,,,,,,,,,237', +',,243,,,66,67,,,68,,,,,,50,,,,,,,,,242,,,,,102,90,93,94,,95,97,96,98', +',,,,91,101,,,,81,82,83,85,65,92,106,107,71,72,44,45,,75,,73,74,76,344', +'345,79,80,,,,,,84,339,347,114,113,115,116,,,244,,,,,,,51,,,118,117,119', +'108,64,110,109,111,,112,120,121,,104,105,47,48,46,,,,,,,,,,,,,,,,,,', +',237,,,243,,,66,67,,,68,,,,,,50,,,,,,,,,242,,,,,102,90,93,94,,95,97', +'96,98,,,,,91,101,,,,81,82,83,85,65,92,106,107,71,72,44,45,,75,,73,74', +'76,344,345,79,80,,,,,,84,339,347,114,113,115,116,,,244,,,,,,,51,,,118', +'117,119,108,64,110,109,111,,112,120,121,,104,105,47,48,46,,,,,,,,,,', +',,,,,,,,,237,,,243,,,66,67,,,68,,,,,,50,,,,,,,,,242,,,,,102,90,93,94', +',95,97,96,98,,,,,91,101,,,,81,82,83,85,65,92,106,107,71,72,44,45,,75', +',73,74,76,344,345,79,80,,,,,,84,339,347,114,113,115,116,,,244,,,,,,', +'51,,,118,117,119,108,64,110,109,111,317,112,120,121,,104,105,47,48,46', +',,,,,,,,,,,,,,,,,,,237,,,243,,,66,67,,,68,,,,312,,50,,,318,,,,,,242', +',,,,102,315,93,94,,95,97,96,98,,,,,91,101,,,,81,82,83,85,65,92,106,107', +'71,72,44,45,,75,,73,74,76,344,345,79,80,,,,,,84,339,347,114,113,115', +'116,,,244,,,,,,,51,,,118,117,119,108,64,110,109,111,,112,120,121,,104', +'105,47,48,46,,,,,,,,,,,,,,,,,,,,237,,,243,,,66,67,,,68,,742,,,,50,,', +',,,,,,242,,,,,102,90,93,94,,95,97,96,98,,,,,91,101,,,,81,82,83,85,65', +'92,106,107,71,72,44,45,,75,,73,74,76,33,34,79,80,,,,,,84,31,30,114,113', +'115,116,,,21,,,,,,,51,,,118,117,119,108,64,110,109,111,,112,120,121', +',104,105,47,48,46,,,,,,,,,,,,,,,,,,,,237,,,243,,,66,67,,,68,,,,,,50', +',,,,,,,,22,,,,,102,90,93,94,,95,97,96,98,,,,,91,101,,,,81,82,83,85,65', +'92,106,107,71,72,44,45,,75,,73,74,76,344,345,79,80,,,,,,84,339,347,114', +'113,115,116,,,244,,,,,,,51,,,118,117,119,108,64,110,109,111,,112,120', +'121,,104,105,47,48,46,,,,,,,,,,,,,,,,,,,,237,,,243,,,66,67,,,68,,,,', +',50,,,,,,,,,242,,,,,102,90,93,94,,95,97,96,98,,,,,91,101,,,,81,82,83', +'85,65,92,106,107,71,72,44,45,,75,,73,74,76,33,34,79,80,,,,,,84,31,30', +'114,113,115,116,,,21,,,,,,,51,,,118,117,119,108,64,110,109,111,,112', +'120,121,,104,105,47,48,46,,,,,,,,,,,,,,,,,,,,237,,,243,,,66,67,,,68', +',,,,,50,,,,,,,,,22,,,,,102,90,93,94,,95,97,96,98,,,,,91,101,,,,81,82', +'83,85,65,92,106,107,71,72,44,45,,75,,73,74,76,344,345,79,80,,,,,,84', +'339,347,114,113,115,116,,,244,,,,,,,51,,,118,117,119,108,64,110,109', +'111,,112,120,121,,104,105,47,48,46,,,,,,,,,,,,,,,,,,,,237,,,243,,,66', +'67,,,68,,,,,,50,,,,,,,,,242,,,,,102,90,93,94,,95,97,96,98,,,,,91,101', +',,,81,82,83,85,65,92,106,107,71,72,44,45,,75,,73,74,76,33,34,79,80,', +',,,,84,31,30,114,113,115,116,,,244,,,,,,,51,,,118,117,119,108,64,110', +'109,111,317,112,120,121,,104,105,47,48,46,,,,,,,,,,,,,,,,,,,,237,,,243', +',,66,67,,,68,,314,,312,,50,,,318,,,,,,242,,,,,102,315,93,94,,95,97,96', +'98,,,,,91,101,,,,81,82,83,85,65,92,106,107,71,72,44,515,,75,,73,74,76', +'33,34,79,80,,,,,,84,31,30,114,113,115,116,,,244,,,,,,,51,,,118,117,119', +'108,64,110,109,111,317,112,120,121,,104,105,47,48,46,,,,,,,,,,,,,,,', +',,,,237,,,243,,,66,67,,,68,,314,,312,,50,,,318,,,,,,242,,,,,102,315', +'93,94,,95,97,96,98,,,,,91,101,,,,81,82,83,85,65,92,106,107,71,72,44', +'45,,75,,73,74,76,33,34,79,80,,,,,,84,31,30,114,113,115,116,,,244,,,', +',,,51,,,118,117,119,108,64,110,109,111,317,112,120,121,,104,105,47,48', +'46,,,,,,,,,,,,,,,,,,,,237,,,243,,,66,67,,,68,,314,,312,,50,,,318,,,', +',,242,,,,,102,315,93,94,,95,97,96,98,,,,,91,101,232,,,81,82,83,85,65', +'92,106,107,71,72,44,45,,75,,73,74,76,344,345,79,80,,,,,,84,339,347,114', +'113,115,116,,,244,,,,,,,51,,,118,117,119,108,64,110,109,111,,112,120', +'121,,104,105,47,48,46,,,,,,,,,,,,,,,,,,,,237,,,243,,,66,67,,,68,,,,', +',50,,,,,,,,,242,,,,,102,90,93,94,,95,97,96,98,,,,,91,101,,,,81,82,83', +'85,65,92,106,107,71,72,44,45,,75,,73,74,76,344,345,79,80,,,,,,84,339', +'347,114,113,115,116,,,244,,,,,,,51,,,118,117,119,108,64,110,109,111', +',112,120,121,,104,105,47,48,46,,,,,,,,,,,,,,,,,,,,237,,,243,,,66,67', +',,68,,,,,,50,,,,,,,,,242,,,,,102,90,93,94,,95,97,96,98,,,,,91,101,,', +',81,82,83,85,65,92,106,107,71,72,44,45,,75,,73,74,76,344,345,79,80,', +',,,,84,339,347,114,113,115,116,,,244,,,,,,,51,,,118,117,119,108,64,110', +'109,111,,112,120,121,,104,105,47,48,46,,,,,,,,,,,,,,,,,,,,237,,,243', +',,66,67,,,68,,,,,,50,,,,,,,,,242,,,,,102,90,93,94,,95,97,96,98,,,,,91', +'101,,,,81,82,83,85,65,92,106,107,71,72,44,45,,75,,73,74,76,344,345,79', +'80,,,,,,84,339,347,114,113,115,116,,,244,,,,,,,51,,,118,117,119,108', +'64,110,109,111,,112,120,121,,104,105,47,48,46,,,,,,,,,,,,,,,,,,,,237', +',,243,,,66,67,,,68,,,,,,50,,,,,,,,,242,,,,,102,90,93,94,,95,97,96,98', +',,,,91,101,,,,81,82,83,85,65,92,106,107,71,72,44,45,,75,,73,74,76,344', +'345,79,80,,,,,,84,339,347,114,113,115,116,,,244,,,,,,,51,,,118,117,119', +'108,64,110,109,111,,112,120,121,,104,105,47,48,46,,,,,,,,,,,,,,,,,,', +',237,,,243,,,66,67,,,68,,,,,,50,,,,,,,,,242,,,,,102,90,93,94,,95,97', +'96,98,,,,,91,101,,,,,,,85,,92,106,107,,,44,45,81,82,83,11,65,,,,71,72', +',,,75,,73,74,76,33,34,79,80,,,,,,84,31,30,114,113,115,116,,,21,,,,,', +'10,51,,12,118,117,119,108,64,110,109,111,,112,120,121,,104,105,47,48', +'46,,,,,,,,,,,,,,,,,,,,43,,,36,,,66,67,,,68,,38,,,,50,,,,,,,,,22,,,,', +'102,90,93,94,,95,97,96,98,,,,,91,101,,,,81,82,83,85,65,92,106,107,71', +'72,44,45,,75,,73,74,76,344,345,79,80,,,,,,84,339,347,114,113,115,116', +',,244,,,,,,,51,,,118,117,119,108,64,110,109,111,,112,120,121,,104,105', +'47,48,46,,,,,,,,,,,,,,,,,,,,237,,,243,,,66,67,,,68,,,,,,50,,,,,,,,,242', +',,,,102,90,93,94,,95,97,96,98,,,,,91,101,,,,81,82,83,85,65,92,106,107', +'71,72,44,45,,75,,73,74,76,344,345,79,80,,,,,,84,339,347,114,113,115', +'116,,,244,,,,,,,51,,,118,117,119,108,64,110,109,111,,112,120,121,,104', +'105,47,48,46,,,,,,,,,,,,,,,,,,,,237,,,243,,,66,67,,,68,,,,,,50,,,,,', +',,,242,,,,,102,90,93,94,,95,97,96,98,,,,,91,101,,,,81,82,83,85,65,92', +'106,107,71,72,44,45,,75,,73,74,76,344,345,79,80,,,,,,84,339,347,114', +'113,115,116,,,244,,,,,,,51,,,118,117,119,108,64,110,109,111,,112,120', +'121,,104,105,47,48,46,,,,,,,,,,,,,,,,,,,,237,,,243,,,66,67,,,68,,,,', +',50,,,,,,,,,242,,,,,102,90,93,94,,95,97,96,98,,,,,91,101,,,,81,82,83', +'85,65,92,106,107,71,72,44,45,,75,,73,74,76,344,345,79,80,,,,,,84,339', +'347,114,113,115,116,,,244,,,,,,,51,,,118,117,119,108,64,110,109,111', +',112,120,121,,104,105,47,48,46,,,,,,,,,,,,,,,,,,,,237,,,243,,,66,67', +',,68,,,,,,50,,,,,,,,,242,,,,,102,90,93,94,,95,97,96,98,,,,,91,101,,', +',81,82,83,85,65,92,106,107,71,72,44,45,,75,,73,74,76,33,34,79,80,,,', +',,84,31,30,114,113,115,116,,,244,,,,,,,51,,,118,117,119,108,64,110,109', +'111,,112,120,121,,104,105,47,48,46,,,,,,,,,,,,,,,,,,,,237,,,243,,,66', +'67,,,68,,,,,,50,,,,,,,,,242,,,,,102,90,93,94,,95,97,96,98,,,,,91,101', +',,,81,82,83,85,65,92,106,107,71,72,44,45,,75,,73,74,76,344,345,79,80', +',,,,,84,339,347,114,113,115,116,,,244,,,,,,,51,,,118,117,119,108,64', +'110,109,111,,112,120,121,,104,105,47,48,46,,,,,,,,,,,,,,,,,,,,237,,', +'243,,,66,67,,,68,,,,,,50,,,,,,,,,242,,,,,102,90,93,94,,95,97,96,98,', +',,,91,101,,,,81,82,83,85,65,92,106,107,71,72,44,45,,75,,73,74,76,33', +'34,79,80,,,,,,84,31,30,114,113,115,116,,,21,,,,,,,51,,,118,117,119,108', +'64,110,109,111,,112,120,121,,104,105,47,48,46,,,,,,,,,,,,,,,,,,,,237', +',,243,,,66,67,,,68,,,,,,50,,,,,,,,,22,,,,,102,90,93,94,,95,97,96,98', +',,,,91,101,,,,81,82,83,85,65,92,106,107,71,72,44,45,,75,,73,74,76,344', +'345,79,80,,,,,,84,339,347,114,113,115,116,,,244,,,,,,,51,,,118,117,119', +'108,64,110,109,111,,112,120,121,,104,105,47,48,46,,,,,,,,,,,,,,,,,,', +',237,,,243,,,66,67,,,68,,,,,,50,,,,,,,,,242,,,,,102,90,93,94,,95,97', +'96,98,,,,,91,101,,,,81,82,83,85,65,92,106,107,71,72,44,45,,75,,73,74', +'76,344,345,79,80,,,,,,84,339,347,114,113,115,116,,,244,,,,,,,51,,,118', +'117,119,108,64,110,109,111,,112,120,121,,104,105,47,48,46,,,,,,,,,,', +',,,,,,,,,237,,,243,561,,66,67,,,68,,,,,,50,,,,,,,,,242,,,,,102,90,93', +'94,,95,97,96,98,,,,,91,101,,,,81,82,83,85,65,92,106,107,71,72,44,45', +',75,,73,74,76,344,345,79,80,,,,,,84,339,347,114,113,115,116,,,244,,', +',,,,51,,,118,117,119,108,64,110,109,111,,112,120,121,,104,105,47,48', +'46,,,,,,,,,,,,,,,,,,,,237,,,243,,,66,67,,,68,,,,,,50,,,,,,,,,242,,,', +',102,90,93,94,,95,97,96,98,,,,,91,101,,,,81,82,83,85,65,92,106,107,71', +'72,44,45,,75,,73,74,76,344,345,79,80,,,,,,84,339,347,114,113,115,116', +',,244,,,,,,,51,,,118,117,119,108,64,110,109,111,,112,120,121,,104,105', +'47,48,46,,,,,,,,,,,,,,,,,,,,237,,,243,,,66,67,,,68,,434,,,,50,,,,,,', +',,242,,,,,102,90,93,94,,95,97,96,98,,,,,91,101,,,,81,82,83,85,65,92', +'106,107,71,72,44,45,,75,,73,74,76,344,345,79,80,,,,,,84,339,347,114', +'113,115,116,,,244,,,,,,,51,,,118,117,119,108,64,110,109,111,,112,120', +'121,,104,105,47,48,46,,,,,,,,,,,,,,,,,,,,237,,,243,,,66,67,,,68,,,,', +',50,,,,,,,,,242,,,,,102,90,93,94,,95,97,96,98,,,,,91,101,,,,81,82,83', +'85,65,92,106,107,71,72,44,45,,75,,73,74,76,344,345,79,80,,,,,,84,339', +'347,114,113,115,116,,,244,,,,,,,51,,,118,117,119,108,64,110,109,111', +',112,120,121,,104,105,47,48,46,,,,,,,,,,,,,,,,,,,,237,,,243,,,66,67', +',,68,,,,,,50,,,,,,,,,242,,,,,102,90,93,94,,95,97,96,98,,,,,91,101,,', +',81,82,83,85,65,92,106,107,71,72,44,45,,75,,73,74,76,33,34,79,80,,,', +',,84,31,30,114,113,115,116,,,21,,,,,,,51,,,118,117,119,108,64,110,109', +'111,,112,120,121,,104,105,47,48,46,,,,,,,,,,,,,,,,,,,,237,,,243,,,66', +'67,,,68,,,,,,50,,,,,,,,,22,,,,,102,90,93,94,,95,97,96,98,,,,,91,101', +',,,81,82,83,85,65,92,106,107,71,72,44,45,,75,,73,74,76,344,345,79,80', +',,,,,84,339,347,114,113,115,116,,,244,,,,,,,51,,,118,117,119,108,64', +'110,109,111,317,112,120,121,,104,105,47,48,46,,,,,,,,,,,,,,,,,,,,237', +',,243,,,66,67,,,68,,742,,312,,50,,,318,,,,,,242,,,,,102,315,93,94,,95', +'97,96,98,,,,,91,101,,,,81,82,83,85,65,92,106,107,71,72,44,515,,75,,73', +'74,76,33,34,79,80,,,,,,84,31,30,114,113,115,116,,,244,,,,,,,51,,,118', +'117,119,108,64,110,109,111,,112,120,121,,104,105,47,48,46,,,,,,,,,,', +',,,,,,,,,237,,,243,,,66,67,,,68,,,,,,50,,,,,,,,,242,,,,,102,90,93,94', +',95,97,96,98,,,,,91,101,,,,81,82,83,85,65,92,106,107,71,72,44,45,,75', +',73,74,76,33,34,79,80,,,,,,84,31,30,114,113,115,116,,,21,,,,,,,51,,', +'118,117,119,108,64,110,109,111,,112,120,121,,104,105,47,48,46,,,,,,', +',,,,,,,,,,,,,237,,,243,,,66,67,,,68,,,,,,50,,,,,,,,,22,,,,,102,90,93', +'94,,95,97,96,98,,,,,91,101,,,,81,82,83,85,65,92,106,107,71,72,44,45', +',75,,73,74,76,33,34,79,80,,,,,,84,31,30,114,113,115,116,,,244,,,,,,', +'51,,,118,117,119,108,64,110,109,111,,112,120,121,,104,105,47,48,46,', +',,,,,,,,,,,,,,,,,,237,,,243,,,66,67,,,68,,,,,,50,,,,,,,,,242,,,,,102', +'90,93,94,,95,97,96,98,,,,,91,101,,,,81,82,83,85,65,92,106,107,71,72', +'44,45,,75,,73,74,76,33,34,79,80,,,,,,84,31,30,114,113,115,116,,,244', +',,,,,,51,,,118,117,119,108,64,110,109,111,,112,120,121,,104,105,47,48', +'46,,,,,,,,,,,,,,,,,,,,237,,,243,,,66,67,,,68,,,,,,50,,,,,,,,,242,,,', +',102,90,93,94,,95,97,96,98,,,,,91,101,,,,81,82,83,85,65,92,106,107,71', +'72,44,45,,75,,73,74,76,33,34,79,80,,,,,,84,31,30,114,113,115,116,,,244', +',,,,,,51,,,118,117,119,108,64,110,109,111,,112,120,121,,104,105,47,48', +'46,,,,,,,,,,,,,,,,,,,,237,,,243,,,66,67,,,68,,,,,,50,,,,,,,,,242,,,', +',102,90,93,94,,95,97,96,98,,,,,91,101,,,,81,82,83,85,65,92,106,107,71', +'72,44,45,,75,,73,74,76,344,345,79,80,,,,,,84,339,347,114,113,115,116', +',,244,,,,,,,51,,,118,117,119,108,64,110,109,111,317,112,120,121,,104', +'105,47,48,46,,,,,,,,,,,,,,,,,,,,237,,,243,,,66,67,,,68,,,,312,,50,,', +'318,,,,,,242,,,,,102,315,93,94,,95,97,96,98,,,,,91,101,,,,81,82,83,85', +'65,92,106,107,71,72,44,45,,75,,73,74,76,344,345,79,80,,,,,,84,339,347', +'114,113,115,116,,,244,,,,,,,51,,,118,117,119,108,64,110,109,111,317', +'112,120,121,,104,105,47,48,46,,,,,,,,,,,,,,,,,,,,237,,,243,,,66,67,', +',68,,742,,312,,50,,,318,,,,,,242,,,,,102,315,93,94,,95,97,96,98,,,,', +'91,101,,,,81,82,83,85,65,92,106,107,71,72,44,45,,75,,73,74,76,344,345', +'79,80,,,,,,84,339,347,114,113,115,116,,,244,,,,,,,51,,,118,117,119,108', +'64,110,109,111,,112,120,121,,104,105,47,48,46,,,,,,,,,,,,,,,,,,,,237', +',,243,,,66,67,,,68,,,,,,50,,,,,,,,,242,,,,,102,90,93,94,,95,97,96,98', +',,,,91,101,,,,,,,85,,92,106,107,,,44,45,81,82,83,11,65,,,,71,72,,,,75', +',73,74,76,33,34,79,80,,,,,,84,31,30,114,113,115,116,,,21,,,,,,10,51', +',12,118,117,119,108,64,110,109,111,,112,120,121,,104,105,47,48,46,,', +',,,,,,,,,,,,,,,,,43,,,36,,,66,67,,,68,,38,,,,50,,,,,,,,,22,,,,,102,90', +'93,94,,95,97,96,98,,,,,91,101,,,,81,82,83,85,65,92,106,107,71,72,44', +'45,,75,,73,74,76,33,34,79,80,,,,,,84,31,30,114,113,115,116,,,244,,,', +',,,51,,,118,117,119,108,64,110,109,111,317,112,120,121,,104,105,47,48', +'46,,,,,,,,,,,,,,,,,,,,237,,,243,,,66,67,,,68,,314,,312,,50,,,318,,,', +',,242,,,,,102,315,93,94,,95,97,96,98,,,,,91,101,,,,81,82,83,85,65,92', +'106,107,71,72,44,45,,75,,73,74,76,33,34,79,80,,,,,,84,31,30,114,113', +'115,116,,,244,,,,,,,51,,,118,117,119,108,64,110,109,111,,112,120,121', +',104,105,47,48,46,,,,,,,,,,,,,,,,,,,,237,,,243,,,66,67,,,68,,,,,,50', +',,,,,,,,242,,,,,102,90,93,94,,95,97,96,98,,,,,91,101,,,,81,82,83,85', +'65,92,106,107,71,72,44,45,,75,,73,74,76,344,345,79,80,,,,,,84,339,347', +'114,113,115,116,,,244,,,,,,,51,,,118,117,119,108,64,110,109,111,,112', +'120,121,,104,105,47,48,46,,,,,,,,,,,,,,,,,,,,237,,,243,,,66,67,,,68', +',844,,,,50,,,,,,,,,242,,,,,102,90,93,94,,95,97,96,98,,,,,91,101,,,,', +',,85,,92,106,107,,,44,45,81,82,83,11,65,,,,71,72,,,,75,,73,74,76,33', +'34,79,80,,,,,,84,31,30,114,113,115,116,,,21,,,,,,10,51,,12,118,117,119', +'108,64,110,109,111,,112,120,121,,104,105,47,48,46,,,,,,,,,,,,,,,,,,', +',43,,,36,,,66,67,,,68,,38,,,,50,,,,,,,,,22,,,,,102,90,93,94,,95,97,96', +'98,,,,,91,101,,,,81,82,83,85,65,92,106,107,71,72,44,45,,75,,73,74,76', +'344,345,79,80,,,,,,84,339,347,114,113,115,116,,,244,,,,,,,51,,,118,117', +'119,108,64,110,109,111,,112,120,121,,104,105,47,48,46,,,,,,,,,,,,,,', +',,,,,237,,,243,,,66,67,,,68,,,,,,50,,,,,,,,,242,,,,,102,90,93,94,,95', +'97,96,98,,,,,91,101,,,,81,82,83,85,65,92,106,107,71,72,44,45,,75,,73', +'74,76,33,34,79,80,,,,,,84,31,30,114,113,115,116,,,244,,,,,,,51,,,118', +'117,119,108,64,110,109,111,317,112,120,121,,104,105,47,48,46,,,,,,,', +',,,,,,,,,,,,237,,,243,,,66,67,,,68,,314,,312,,50,,,318,,,,,,242,,,,', +'102,315,93,94,,95,97,96,98,,,,,91,101,,,,81,82,83,85,65,92,106,107,71', +'72,44,45,,75,,73,74,76,33,34,79,80,,,,,,84,31,30,114,113,115,116,,,244', +',,,,,,51,,,118,117,119,108,64,110,109,111,317,112,120,121,,104,105,47', +'48,46,,,,,,,,,,,,,,,,,,,,237,,,243,,,66,67,,,68,,314,,312,,50,,,318', +',,,,,242,,,,,102,315,93,94,,95,97,96,98,,,,,91,101,,,,81,82,83,85,65', +'92,106,107,71,72,44,45,,75,,73,74,76,344,345,79,80,,,,,,84,339,347,114', +'113,115,116,,,244,,,,,,,51,,,118,117,119,108,64,110,109,111,,112,120', +'121,,104,105,47,48,46,,,,,,,,,,,,,,,,,,,,237,,,243,,,66,67,,,68,,314', +',,,50,,,,,,,,,242,,,,,102,90,93,94,,95,97,96,98,,,,,91,101,,,,81,82', +'83,85,65,92,106,107,71,72,44,45,,75,,73,74,76,344,345,79,80,,,,,,84', +'339,347,114,113,115,116,,,244,,,,,,,51,,,118,117,119,108,64,110,109', +'111,317,112,120,121,,104,105,47,48,46,,,,,,,,,,,,,,,,,,,,237,,,243,', +',66,67,,,68,,,,,,50,,,318,,,,,,242,,,,,102,315,93,94,,95,97,96,98,,', +',,91,101,,,,81,82,83,85,65,92,106,107,71,72,44,45,,75,,73,74,76,344', +'345,79,80,,,,,,84,339,347,114,113,115,116,,,244,,,,,,,51,,,118,117,119', +'108,64,110,109,111,317,112,120,121,,104,105,47,48,46,,,,,,,,,,,,,,,', +',,,,237,,,243,,,66,67,,,68,,742,,,,50,,,318,,,,,,242,,,,,102,315,93', +'94,,95,97,96,98,,,,,91,101,,,,,,,85,,92,106,107,-270,,44,45,,,,-270', +'-270,-270,,,-270,-270,-270,,-270,,,,,,,,-270,-270,-270,-270,,,,,,,,', +'-270,-270,,-270,-270,-270,-270,-270,,,,,,,,,,,,,,,,,,,,,,,-270,-270', +'-270,-270,-270,-270,-270,-270,-270,-270,-270,-270,-270,-270,,,-270,-270', +'-270,,,-270,,296,-270,,,-270,-270,,-270,,-270,,-270,,-270,-270,,-270', +'-270,-270,-270,-270,,-270,-270,-270,,,,,,,,,,,,,,-270,,,-270,-270,,-270', +',-270,81,82,83,,65,,-270,,71,72,,,,75,,73,74,76,344,345,79,80,,,,,,84', +'339,347,114,113,115,116,,,244,,,,,,,51,,,118,117,119,108,64,110,109', +'111,,112,120,121,,104,105,47,48,46,,,,,,,,,,,,,,,,,,,,237,,,243,,,66', +'67,,,68,,,,,,50,,,,,,,,,242,,,,,102,90,93,94,,95,97,96,98,,,,,91,101', +',,,,,,85,,92,106,107,-708,,44,45,,,,-708,-708,-708,,,-708,-708,-708', +',-708,,,,,,,,-708,-708,-708,-708,-708,,,,,,,,-708,-708,,-708,-708,-708', +'-708,-708,,,,,,,,,,,,,,,,,,,,,,,-708,-708,-708,-708,-708,-708,-708,-708', +'-708,-708,-708,-708,-708,-708,,,-708,-708,-708,,,-708,,,-708,,,-708', +'-708,,-708,,-708,,-708,,-708,-708,,-708,-708,-708,-708,-708,,-708,-708', +'-708,,,,,,,,,,,,,,-708,,,-708,-708,-708,-708,,-708,-709,-708,,,,,-708', +'-709,-709,-709,,,-709,-709,-709,,-709,,,,,,,,-709,-709,-709,-709,-709', +',,,,,,,-709,-709,,-709,-709,-709,-709,-709,,,,,,,,,,,,,,,,,,,,,,,-709', +'-709,-709,-709,-709,-709,-709,-709,-709,-709,-709,-709,-709,-709,,,-709', +'-709,-709,,,-709,,,-709,,,-709,-709,,-709,,-709,,-709,,-709,-709,,-709', +'-709,-709,-709,-709,,-709,-709,-709,,,,,,,,,,,,,,-709,,,-709,-709,-709', +'-709,,-709,,-709,,81,82,83,-709,65,,,,71,72,,,,75,,73,74,76,344,345', +'79,80,,,,,,84,339,347,114,113,115,116,,,244,,,,,,,51,,,118,117,119,108', +'64,110,109,111,,112,120,121,,104,105,47,48,46,,,,,,,,,,,,,,,,,,,,237', +',,243,,,66,67,,,68,,,,,,50,,,,,,,,,242,,,,,102,90,93,94,,95,97,96,98', +',,,,91,101,,,,81,82,83,85,65,92,106,107,71,72,44,45,,75,,73,74,76,344', +'345,79,80,,,,,,84,339,347,114,113,115,116,,,244,,,,,,,51,,,118,117,119', +'108,64,110,109,111,,112,120,121,,104,105,47,48,46,,,,,,,,,,,,,,,,,,', +',237,,,243,,,66,67,,,68,,,,,,50,,,,,,,,,242,,,,,102,90,93,94,,95,97', +'96,98,,,,,91,101,,,,81,82,83,85,65,92,106,107,71,72,44,45,,75,,73,74', +'76,33,34,79,80,,,,,,84,31,30,114,113,115,116,,,21,,,,,,,51,,,118,117', +'119,108,64,110,109,111,,112,120,121,,104,105,47,48,46,,,,,,,,,,,,,,', +',,,,,237,,,243,,,66,67,,,68,,,,,,50,,,,,,,,,22,,,,,102,90,93,94,,95', +'97,96,98,,,,,91,101,,,,81,82,83,85,65,92,106,107,71,72,44,45,,75,,73', +'74,76,33,34,79,80,,,,,,84,31,30,114,113,115,116,,,244,,,,,,,51,,,118', +'117,119,108,64,110,109,111,317,112,120,121,,104,105,47,48,46,,,,,,,', +',,,,,,,,,,,,237,,,243,,,66,67,,,68,,314,,312,,50,,,318,,,,,,242,,,,', +'102,315,93,94,,95,97,96,98,,,,,91,101,,,,81,82,83,85,65,92,106,107,71', +'72,44,45,,75,,73,74,76,344,345,79,80,,,,,,84,339,347,114,113,115,116', +',,244,,,,,,,51,,,118,117,119,108,64,110,109,111,,112,120,121,,104,105', +'47,48,46,,,,,,,,,,,,,,,,,,,,237,,,243,,,66,67,,,68,,,,,,50,,,,,,,,,242', +',,,,102,90,93,94,,95,97,96,98,,,,,91,101,,,,81,82,83,85,65,92,106,107', +'71,72,44,45,,75,,73,74,76,344,345,79,80,,,,,,84,339,347,114,113,115', +'116,,,244,,,,,,,51,,,118,117,119,108,64,110,109,111,,112,120,121,,104', +'105,47,48,46,,,,,,,,,,,,,,,,,,,,237,,,243,,,66,67,,,68,,,,,,50,,,,,', +',,,242,,,,,102,90,93,94,,95,97,96,98,,,,,91,101,,,,81,82,83,85,65,92', +'106,107,71,72,44,45,,75,,73,74,76,344,345,79,80,,,,,,84,339,347,114', +'113,115,116,,,244,,,,,,,51,,,118,117,119,108,64,110,109,111,,112,120', +'121,,104,105,47,48,46,,,,,,,,,,,,,,,,,,,,237,,,243,,,66,67,,,68,,,,', +',50,,,,,,,,,242,,,,,102,90,93,94,,95,97,96,98,,,,,91,101,,,,81,82,83', +'85,65,92,106,107,71,72,44,45,,75,,73,74,76,344,345,79,80,,,,,,84,339', +'347,114,113,115,116,,,244,,,,,,,51,,,118,117,119,108,64,110,109,111', +',112,120,121,,104,105,47,48,46,,,,,,,,,,,,,,,,,,,,237,,,243,,,66,67', +',,68,,,,,,50,,,,,,,,,242,,,,,102,90,93,94,,95,97,96,98,,,,,91,101,,', +',81,82,83,85,65,92,106,107,71,72,44,45,,75,,73,74,76,344,345,79,80,', +',,,,84,339,347,114,113,115,116,,,244,,,,,,,51,,,118,117,119,108,64,110', +'109,111,,112,120,121,,104,105,47,48,46,,,,,,,,,,,,,,,,,,,,237,,,243', +',,66,67,,,68,,,,,,50,,,,,,,,,242,,,,,102,90,93,94,,95,97,96,98,,,,,91', +'101,,,,81,82,83,85,65,92,106,107,71,72,44,45,,75,,73,74,76,33,34,79', +'80,,,,,,84,31,30,114,113,115,116,,,244,,,,,,,51,,,118,117,119,108,64', +'110,109,111,317,112,120,121,,104,105,47,48,46,,,,,,,,,,,,,,,,,,,,237', +',,243,,,66,67,,,68,,314,,312,,50,,,318,,,,,,242,,,,,102,315,93,94,,95', +'97,96,98,,,,,91,101,,,,,,,85,,92,106,107,,,44,45,81,82,83,11,65,,,,71', +'72,,,,75,,73,74,76,33,34,79,80,,,,,,84,31,30,114,113,115,116,,,21,,', +',,,10,51,325,12,118,117,119,108,64,110,109,111,,112,120,121,,104,105', +'47,48,46,,,,,,,,,,,,,,,,,,,,43,,,36,,,66,67,,,68,,38,,,,50,,,,,,,,,22', +',,,,102,90,93,94,,95,97,96,98,,,,,91,101,,,,,,418,85,,92,106,107,,,44', +'45,81,82,83,,65,,,,71,72,,,,75,,73,74,76,344,345,79,80,,,,,,84,339,347', +'114,113,115,116,,,244,,,,,,,51,,,118,117,119,108,64,110,109,111,,112', +'120,121,,104,105,47,48,46,,,,,,,,,,,,,,,,,,,,237,,,243,,,66,67,,,68', +',,,,,50,,,,,,,,,242,,,,,102,90,93,94,,95,97,96,98,,,,,91,101,,,,81,82', +'83,85,65,92,106,107,71,72,44,45,,75,,73,74,76,344,345,79,80,,,,,,84', +'339,347,114,113,115,116,,,244,,,,,,,51,,,118,117,119,108,64,110,109', +'111,317,112,120,121,,104,105,47,48,46,,,,,,,,,,,,,,,,,,,,237,,,243,', +',66,67,,,68,,,,312,,50,,,318,,,,,,242,,,,,102,315,93,94,,95,97,96,98', +',,,,91,101,,,,81,82,83,85,65,92,106,107,71,72,44,45,,75,,73,74,76,344', +'345,79,80,,,,,,84,339,347,114,113,115,116,,,244,,,,,,,51,,,118,117,119', +'108,64,110,109,111,317,112,120,121,,104,105,47,48,46,,,,,,,,,,,,,,,', +',,,,237,,,243,,,66,67,,,68,,742,,312,,50,,,318,,,,,,242,,,,,102,315', +'93,94,,95,97,96,98,,,,,91,101,,,,81,82,83,85,65,92,106,107,71,72,44', +'45,,75,,73,74,76,33,34,79,80,,,,,,84,31,30,114,113,115,116,,,244,,,', +',,,51,,,118,117,119,108,64,110,109,111,,112,120,121,,104,105,47,48,46', +',,,,,,,,,,,,,,,,,,,237,,,243,,,66,67,,,68,,434,,,,50,,,,,,,,,242,,,', +',102,90,93,94,,95,97,96,98,,,,,91,101,,,,81,82,83,85,65,92,106,107,71', +'72,44,45,,75,,73,74,76,33,34,79,80,,,,,,84,31,30,114,113,115,116,,,244', +',,,,,,51,,,118,117,119,108,64,110,109,111,,112,120,121,,104,105,47,48', +'46,,,,,,,,,,,,,,,,,,,,237,,,243,,,66,67,,,68,,434,,,,50,,,,,,,,,242', +',,,,102,90,93,94,,95,97,96,98,,,,,91,101,,,,81,82,83,85,65,92,106,107', +'71,72,44,45,,75,,73,74,76,33,34,79,80,,,,,,84,31,30,114,113,115,116', +',,21,,,,,,,51,,,118,117,119,108,64,110,109,111,,112,120,121,,104,105', +'47,48,46,,,,,,,,,,,,,,,,,,,,237,,,243,,,66,67,,,68,,,,,,50,,,,,,,,,22', +',,,,102,90,93,94,,95,97,96,98,,,,,91,101,,,,81,82,83,85,65,92,106,107', +'71,72,44,45,,75,,73,74,76,33,34,79,80,,,,,,84,31,30,114,113,115,116', +',,21,,,,,,,51,,,118,117,119,108,64,110,109,111,,112,120,121,,104,105', +'47,48,46,,,,,,,,,,,,,,,,,,,,237,,,243,,,66,67,,,68,,,,,,50,,,,,,,,,22', +',,,,102,90,93,94,,95,97,96,98,,,,,91,101,,,,81,82,83,85,65,92,106,107', +'71,72,44,45,,75,,73,74,76,33,34,79,80,,,,,,84,31,30,114,113,115,116', +',,244,,,,,,,51,,,118,117,119,108,64,110,109,111,,112,120,121,,104,105', +'47,48,46,,,,,,,,,,,,,,,,,,,,237,,,243,,,66,67,,,68,,,,,,50,,,,,,,,,242', +',,,,102,90,93,94,,95,97,96,98,,,,,91,101,,,,81,82,83,85,65,92,106,107', +'71,72,44,45,,75,,73,74,76,33,34,79,80,,,,,,84,31,30,114,113,115,116', +',,244,,,,,,,51,,,118,117,119,108,64,110,109,111,317,112,120,121,,104', +'105,47,48,46,,,,,,,,,,,,,,,,,,,,237,,,243,,,66,67,,,68,,314,,312,,50', +',,318,,,,,,242,,,,,102,315,93,94,,95,97,96,98,,,,,91,101,,,,81,82,83', +'85,65,92,106,107,71,72,44,45,,75,,73,74,76,33,34,79,80,,,,,,84,31,30', +'114,113,115,116,,,244,,,,,,,51,,,118,117,119,108,64,110,109,111,,112', +'120,121,,104,105,47,48,46,,,,,,,,,,,,,,,,,,,,237,,,243,,,66,67,,,68', +',,,,,50,,,,,,,,,242,,,,,102,90,93,94,,95,97,96,98,,,,,91,101,,,,81,82', +'83,85,65,92,106,107,71,72,44,45,,75,,73,74,76,33,34,79,80,,,,,,84,31', +'30,114,113,115,116,,,21,,,,,,,51,,,118,117,119,108,64,110,109,111,,112', +'120,121,,104,105,47,48,46,,,,,,,,,,,,,,,,,,,,237,,,243,,,66,67,,,68', +',,,,,50,,,,,,,,,22,,,,,102,90,93,94,,95,97,96,98,,,,,91,101,,,,81,82', +'83,85,65,92,106,107,71,72,44,45,,75,,73,74,76,344,345,79,80,,,,,,84', +'339,347,114,113,115,116,,,244,,,,,,,340,,,118,117,119,108,64,110,109', +'111,,112,120,121,,104,105,,,348,,,,,,,,,,,,,,,,,,,,1105,,,243,,,66,67', +',,68,,,,,,,,,,,,,,,,,,,,102,90,93,94,,95,97,96,98,,,,,91,101,,,,81,82', +'83,85,65,92,106,107,71,72,,,,75,,73,74,76,344,345,79,80,,,,,,84,339', +'347,114,113,115,116,,,244,,,,,,,340,,,118,117,119,108,64,110,109,111', +',112,120,121,,104,105,,,348,,,,,,,,,,,,,,,,,,,,393,,,36,,,66,67,,,68', +',38,,,,,,,,,,,,,,,,,,102,90,93,94,,95,97,96,98,,,,,91,101,,,,81,82,83', +'85,65,92,106,107,71,72,,,,75,,73,74,76,344,345,79,80,,,,,,84,339,347', +'114,113,115,116,,,244,,,,,,,340,,,118,117,119,108,64,110,109,111,,112', +'120,121,,104,105,,,348,,,,,,,,,,,,,,,,,,,,336,,,332,,,66,67,,,68,,,', +',,,,,,,,,,,,,,,,102,90,93,94,,95,97,96,98,,,,,91,101,,,,81,82,83,85', +'65,92,106,107,71,72,,,,75,,73,74,76,344,345,79,80,,,,,,84,339,347,114', +'113,115,116,,,244,,,,,,,340,,,118,117,119,108,64,110,109,111,,112,120', +'121,,104,105,,,348,,,,,,,,,,,,,,,,,,,,336,,,332,,,66,67,,,68,,,,,,,', +',,,,,,,,,,,,102,90,93,94,,95,97,96,98,,,,,91,101,,,,81,82,83,85,65,92', +'106,107,71,72,,,,75,,73,74,76,344,345,79,80,,,,,,84,339,347,114,113', +'115,116,,,244,,,,,,,340,,,118,117,119,108,64,110,109,111,,112,120,121', +',104,105,,,348,,,,,,,,,,,,,,,,,,,,336,,,332,,,66,67,,,68,,,,,,,,,,,', +',,,,,,,,102,90,93,94,,95,97,96,98,,,,,91,101,,,,81,82,83,85,65,92,106', +'107,71,72,,,,75,,73,74,76,344,345,79,80,,,,,,84,339,347,114,113,115', +'116,,,244,,,,,,,340,,,118,117,119,108,64,110,109,111,,112,120,121,,104', +'105,,,348,,,,,,,,,,,,,,,,,,,,336,,,332,,,66,67,,,68,,331,,,,,,,,,,,', +',,,,,,102,90,93,94,,95,97,96,98,,,,,91,101,,,,81,82,83,85,65,92,106', +'107,71,72,,,,75,,73,74,76,344,345,79,80,,,,,,84,339,347,114,113,115', +'116,,,244,,,,,,,340,,,118,117,119,108,64,110,109,111,,112,120,121,,104', +'105,,,348,,,,,,,,,,,,,,,,,,,,336,,,332,,,66,67,,,68,,,,,,,,,,,,,,,,', +',,,102,90,93,94,,95,97,96,98,,,,,91,101,,,,81,82,83,85,65,92,106,107', +'71,72,,,,75,,73,74,76,344,345,79,80,,,,,,84,339,347,114,113,115,116', +',,244,,,,,,,340,,,118,117,119,108,64,110,109,111,,112,120,121,,104,105', +',,348,,,,,,,,,,,,,,,,,,,,1105,,,243,,,66,67,,,68,,,,,,,,,,,,,,,,,,,', +'102,90,93,94,,95,97,96,98,,,,,91,101,,,,81,82,83,85,65,92,106,107,71', +'72,,,,75,,73,74,76,344,345,79,80,,,,,,84,339,347,114,113,115,116,,,244', +',,,,,,340,,,118,117,119,398,64,110,109,399,,112,120,121,,104,105,,,348', +',,,,,,,,,,,,,,,,405,,,400,,,243,,,66,67,,,68,,,,,,,,,,,,,,,,,,,,102', +'90,93,94,,95,97,96,98,,,,,91,101,,,,81,82,83,85,65,92,106,107,71,72', +',,,75,,73,74,76,344,345,79,80,,,,,,84,339,347,114,113,115,116,,,244', +',,,,,,340,,,118,117,119,108,64,110,109,111,,112,120,121,,104,105,,,348', +',,,,,,,,,,,,,,,,,,,336,,,332,,,66,67,,,68,,,,,,,,,,,,,,,,,,,,102,90', +'93,94,,95,97,96,98,,,,,91,101,,,,81,82,83,85,65,92,106,107,71,72,,,', +'75,,73,74,76,344,345,79,80,,,,,,84,339,347,114,113,115,116,,,244,,,', +',,,340,,,118,117,119,398,64,110,109,399,,112,120,121,,104,105,,,348', +',,,,,,,,,,,,,,,,,,,400,,,243,,,66,67,,,68,,,,,,,,,,,,,,,,,,,,102,90', +'93,94,,95,97,96,98,,,,,91,101,,,,81,82,83,85,65,92,106,107,71,72,,,', +'75,,73,74,76,344,345,79,80,,,,,,84,339,347,114,113,115,116,,,244,,,', +',,,340,,,118,117,119,108,64,110,109,111,,112,120,121,,104,105,,,348', +',,,,,,,,,,,,,,,,,,,336,,,243,,,66,67,,,68,,,582,,579,578,577,587,580', +',,,,,,,,590,,102,90,93,94,,95,97,96,98,,,,,91,101,,,,350,,585,85,,92', +'106,107,81,82,83,,65,598,597,,71,72,591,,,75,,73,74,76,344,345,79,80', +',,,,,84,339,347,114,113,115,116,,,244,,,,,,,340,,,118,117,119,108,64', +'110,109,111,,112,120,121,,104,105,,,348,,,,,,,,,,,,,,,,,,,,336,,,243', +',,66,67,,,68,,,582,,579,578,577,587,580,,,,,,,,,590,,102,90,93,94,,95', +'97,96,98,,,,,91,101,,,,543,,585,85,,92,106,107,81,82,83,,65,598,597', +',71,72,591,,,75,,73,74,76,344,345,79,80,,,,,,84,339,347,114,113,115', +'116,,,244,,,,,,,340,,,118,117,119,108,64,110,109,111,,112,120,121,,104', +'105,,,348,,,,,,,,,,,,,,,,,,,,1111,,,243,,,66,67,,,68,,,,,,,,,,,,,,,', +',,,,102,90,93,94,,95,97,96,98,,,,,91,101,,,,,,,85,,92,106,107,185,196', +'186,209,182,202,192,191,212,213,207,190,189,184,210,214,215,194,183', +'197,201,203,195,188,,,,204,211,206,205,198,208,193,181,200,199,,,,,', +'180,187,178,179,175,176,177,138,140,,,139,,,,,,,,169,170,,166,148,149', +'150,157,154,156,,,151,152,,,,171,172,158,159,,,,,,,,,,,,,,163,162,,147', +'168,165,164,173,160,161,155,153,145,167,146,,,174,102,,,,,,,,,,,,,,101', +'185,196,186,209,182,202,192,191,212,213,207,190,189,184,210,214,215', +'194,183,197,201,203,195,188,,,,204,211,206,205,198,208,193,181,200,199', +',,,,,180,187,178,179,175,176,177,138,140,137,,139,,,,,,,,169,170,,166', +'148,149,150,157,154,156,,,151,152,,,,171,172,158,159,,,,,,,,,,,,,,163', +'162,,147,168,165,164,173,160,161,155,153,145,167,146,,,174,102,,,,,', +',,,,,,,,101,185,196,186,209,182,202,192,191,212,213,207,190,189,184', +'210,214,215,194,183,197,201,203,195,188,,,,204,211,206,205,198,208,193', +'181,200,199,,,,,,180,187,178,179,175,176,177,138,140,,,139,,,,,,,,169', +'170,,166,148,149,150,157,154,156,,,151,152,,,,171,172,158,159,,,,,,', +',,,,,,,163,162,,147,168,165,164,173,160,161,155,153,145,167,146,,,174', +'102,,,,,,,,,,,,,,101,185,196,186,209,182,202,192,191,212,213,207,190', +'189,184,210,214,215,194,183,197,201,203,195,188,,,,204,211,206,205,198', +'208,193,181,200,199,,,,,,180,187,178,179,175,176,177,138,140,,,139,', +',,,,,,169,170,,166,148,149,150,157,154,156,,,151,152,,,,171,172,158', +'159,,,,,,,,,,,,,,163,162,,147,168,165,164,173,160,161,155,153,145,167', +'146,,,174,102,,,,,,,,,,,,,,101,185,196,186,209,182,202,192,191,212,213', +'207,190,189,184,210,214,215,194,183,197,201,203,195,188,,,,204,211,206', +'284,283,285,282,181,200,199,,,,,,180,187,178,179,279,280,281,277,140', +'110,109,278,,112,,,,,,169,170,,166,148,149,150,157,154,156,,,151,152', +',,,171,172,158,159,,,,,,289,,,,,,,,163,162,,147,168,165,164,173,160', +'161,155,153,145,167,146,,,174,114,113,115,116,,,,,,,,,,,,,118,117,119', +'719,,,582,722,579,578,577,587,580,104,105,,,348,,,,590,,,,,,,,,,,,,', +',,721,,,703,,,585,701,,,702,,,,,595,594,598,597,,,,591,,,,720,,,,102', +'90,93,94,,95,97,96,98,,,,,91,101,114,113,115,116,,,85,,92,106,107,,', +'707,708,,118,117,119,719,,,582,722,579,578,577,587,580,104,105,,,348', +',,,590,,,,,,,,,,,,,,,,721,,,703,,,585,701,,,702,,,,,595,594,598,597', +',,,591,,,,720,,,,102,90,93,94,,95,97,96,98,,,,,91,101,114,113,115,116', +',,85,,92,106,107,,,707,708,,118,117,119,719,,,582,722,579,578,577,587', +'580,104,105,,,348,,,,590,,,,,,,,,,,,,,,,721,,,703,,,585,701,,,702,,', +',,,,598,597,,,,591,,,,720,,,,102,90,93,94,,95,97,96,98,,,,,91,101,114', +'113,115,116,,,85,,92,106,107,,,707,708,,118,117,119,719,,,582,722,579', +'578,577,587,580,104,105,,,348,,,,590,,,,,,,,,,,,,,,,721,,,703,,,585', +'701,,,702,,,,,595,594,598,597,,,,591,,,,720,,,,102,90,93,94,,95,97,96', +'98,,,,,91,101,114,113,115,116,,,85,,92,106,107,,,707,708,,118,117,119', +'719,,,582,722,579,578,577,587,580,104,105,,,348,,,,590,,,,,,,,,,,,,', +',,721,,,703,,,585,701,,,702,,,,,,,598,597,,,,591,,,,720,,,,102,90,93', +'94,,95,97,96,98,,,,,91,101,114,113,115,116,,,85,,92,106,107,,,707,708', +',118,117,119,719,,,582,722,579,578,577,587,580,104,105,,,348,,,,590', +',,,,,,,,,,,,,,,721,,,703,,,585,701,,,702,,885,,,,,598,597,,,,591,,,', +'720,,,,102,90,93,94,,95,97,96,98,,,,,91,101,114,113,115,116,,,85,,92', +'106,107,,,707,708,,118,117,119,719,,,582,722,579,578,577,587,580,104', +'105,,,348,,,,590,,,,,,,,,,,,,,,,721,,,703,,,585,701,,,702,,,,,,,598', +'597,,,,591,,,,720,,,,102,90,93,94,,95,97,96,98,,,,,91,101,,,,,,,85,', +'92,106,107,,,707,708,185,196,186,209,182,202,192,191,212,213,207,190', +'189,184,210,214,215,194,183,197,201,203,195,188,,,,204,211,206,205,198', +'208,193,181,200,199,,,,,,180,187,178,179,175,176,177,138,140,,,139,', +',,,,,,169,170,,166,148,149,150,157,154,156,,,151,152,,,,171,172,158', +'159,,,,,,,,,,,,,,163,162,,147,168,165,164,173,160,161,155,153,145,167', +'146,,,174,114,113,115,116,,,582,,579,578,577,587,580,,,,118,117,119', +'719,,590,,722,986,,,,,104,105,,,348,590,,,,,,,,,585,,,,,,,,,,721,598', +'597,703,,,591,701,,,702,,885,,,,,,,591,,,,,,,720,,,,102,987,93,94,,95', +'97,96,98,,,,,91,101,114,113,115,116,,,85,,92,106,107,,,707,708,,118', +'117,119,719,,,582,722,579,578,577,587,580,104,105,,,348,,,,590,,,,,', +',,,,,,,,,,721,,,703,,,585,701,,,702,,885,,,595,594,598,597,,,,591,,', +',720,,,,102,90,93,94,,95,97,96,98,,,,,91,101,232,114,113,115,116,,85', +',92,106,107,,,707,708,,,118,117,119,719,,,582,722,579,578,577,587,580', +'104,105,,,348,,,,590,,,,,,,,,,,,,,,,721,,,703,,,585,701,,,702,,,,,595', +'594,598,597,,,,591,,,,720,,,,102,90,93,94,,95,97,96,98,,,,,91,101,114', +'113,115,116,,,85,,92,106,107,,,707,708,,118,117,119,719,,,582,722,579', +'578,577,587,580,104,105,,,348,,,,590,,,,,,,,,,,,,,,,721,,,703,,,585', +'701,,,702,,,,,595,594,598,597,,,,591,,,,720,,,,102,90,93,94,,95,97,96', +'98,,,,,91,101,114,113,115,116,,,85,,92,106,107,,,707,708,,118,117,119', +'719,,,582,722,579,578,577,587,580,104,105,,,348,,,,590,,,,,,,,,,,,,', +',,721,,,703,,,585,701,,,702,,999,,,,,598,597,,,,591,,,,720,,,,102,90', +'93,94,,95,97,96,98,,,,,91,101,114,113,115,116,,,85,,92,106,107,,,707', +'708,,118,117,119,719,,,,722,986,,,,,104,105,,,348,590,,,,,,,,,,,,,,', +',,,,721,,,703,,,,701,,,702,,885,,,,,,,591,,,,,,,720,,,,102,987,93,94', +',95,97,96,98,,,,,91,101,114,113,115,116,,,85,,92,106,107,,,707,708,', +'118,117,119,719,,,,722,986,,,,,104,105,,,348,590,,,,,,,,,,,,,,,,,,,721', +',,703,,,,701,,,702,,885,,,,,,,591,,,,,,,720,,,,102,987,93,94,,95,97', +'96,98,,,,,91,101,114,113,115,116,,,85,,92,106,107,,,707,708,,118,117', +'119,719,,,582,722,579,578,577,587,580,104,105,,,348,,,,590,,,,,,,,,', +',,,,,,721,,,703,,,585,701,,,702,,,,,,,598,597,,,,591,,,,720,,,,102,90', +'93,94,,95,97,96,98,,,,,91,101,114,113,115,116,,,85,,92,106,107,,,707', +'708,,118,117,119,719,,,582,722,579,578,577,587,580,104,105,,,348,,,', +'590,,,,,,,,,,,,,,,,721,,,703,,,585,701,,,702,,,,,,,598,597,,,,591,,', +',720,,,,102,90,93,94,,95,97,96,98,,,,,91,101,114,113,115,116,,,85,,92', +'106,107,,,707,708,,118,117,119,719,,,,722,,,,,,104,105,,,348,,,,,,,', +'114,113,115,116,,,,,,,,,721,,,703,118,117,119,701,,,702,,885,,,,,104', +'105,,,348,,,,,720,,,,102,90,93,94,,95,97,96,98,,,,,91,101,,,,,,,85,', +'92,106,107,,,707,708,582,,579,578,577,587,580,,,,,102,90,93,94,590,95', +'97,96,98,,,,,91,101,114,113,115,116,,,85,,92,106,107,585,641,,,,118', +'117,119,,595,594,598,597,,,,591,,104,105,,,348,114,113,115,116,,,,,', +',,,,,,,118,117,119,,,,,,,,,,,104,105,,,348,,,,,,,,,,,,,,,,102,90,93', +'94,,95,97,96,98,,,,,91,101,,,,,,,85,,92,106,107,,,,,,,,,102,90,93,94', +',95,97,96,98,,,,,91,101,846,460,,,847,,85,,92,106,107,,169,170,,166', +'148,149,150,157,154,156,,,151,152,,,,171,172,158,159,,,,,,296,,,,,,', +',163,162,,147,168,165,164,173,160,161,155,153,145,167,146,814,460,174', +',815,,,,,,,,169,170,,166,148,149,150,157,154,156,,,151,152,,,,171,172', +'158,159,,,,,,296,,,,,,,,163,162,,147,168,165,164,173,160,161,155,153', +'145,167,146,456,460,174,,457,,,,,,,,169,170,,166,148,149,150,157,154', +'156,,,151,152,,,,171,172,158,159,,,,,,296,,,,,,,,163,162,,147,168,165', +'164,173,160,161,155,153,145,167,146,463,467,174,,462,,,,,,,,169,170', +',166,148,149,150,157,154,156,,,151,152,,,,171,172,158,159,,,,,,296,', +',,,,,,163,162,,147,168,165,164,173,160,161,155,153,145,167,146,816,467', +'174,,817,,,,,,,,169,170,,166,148,149,150,157,154,156,,,151,152,,,,171', +'172,158,159,,,,,,296,,,,,,,,163,162,,147,168,165,164,173,160,161,155', +'153,145,167,146,755,467,174,,756,,,,,,,,169,170,,166,148,149,150,157', +'154,156,,,151,152,,,,171,172,158,159,,,,,,296,,,,,,,,163,162,,147,168', +'165,164,173,160,161,155,153,145,167,146,690,460,174,,691,,,,,,,,169', +'170,,166,148,149,150,157,154,156,,,151,152,,,,171,172,158,159,,,,,,296', +',,,,,,,163,162,,147,168,165,164,173,160,161,155,153,145,167,146,1190', +'467,174,,1189,,,,,,,,169,170,,166,148,149,150,157,154,156,,,151,152', +',,,171,172,158,159,,,,,,296,,,,,,,,163,162,,147,168,165,164,173,160', +'161,155,153,145,167,146,819,467,174,,820,,,,,,,,169,170,,166,148,149', +'150,157,154,156,,,151,152,,,,171,172,158,159,,,,,,296,,,,,,,,163,162', +',147,168,165,164,173,160,161,155,153,145,167,146,690,460,174,,691,,', +',,,,,169,170,,166,148,149,150,157,154,156,,,151,152,,,,171,172,158,159', +',,,,,296,,,,,,,,163,162,,147,168,165,164,173,160,161,155,153,145,167', +'146,692,467,174,,693,,,,,,,,169,170,,166,148,149,150,157,154,156,,,151', +'152,,,,171,172,158,159,,,,,,296,,,,,,,,163,162,,147,168,165,164,173', +'160,161,155,153,145,167,146,752,460,174,,753,,,,,,,,169,170,,166,148', +'149,150,157,154,156,,,151,152,,,,171,172,158,159,,,,,,296,,,,,,,,163', +'162,,147,168,165,164,173,160,161,155,153,145,167,146,511,460,174,,512', +',,,,,,,169,170,,166,148,149,150,157,154,156,,,151,152,,,,171,172,158', +'159,,,,,,296,,,,,,,,163,162,,147,168,165,164,173,160,161,155,153,145', +'167,146,1193,460,174,,1194,,,,,,,,169,170,,166,148,149,150,157,154,156', +',,151,152,,,,171,172,158,159,,,,,,296,,,,,,,,163,162,,147,168,165,164', +'173,160,161,155,153,145,167,146,692,467,174,,693,,,,,,,,169,170,,166', +'148,149,150,157,154,156,,,151,152,,,,171,172,158,159,,,,,,296,,,,,,', +',163,162,,147,168,165,164,173,160,161,155,153,145,167,146,1195,467,174', +',1196,,,,,,,,169,170,,166,148,149,150,157,154,156,,,151,152,,,,171,172', +'158,159,,,,,,296,,,,,,,,163,162,,147,168,165,164,173,160,161,155,153', +'145,167,146,849,467,174,,848,,,,,,,,169,170,,166,148,149,150,157,154', +'156,,,151,152,,,,171,172,158,159,,,,,,296,,,,,,,,163,162,,147,168,165', +'164,173,160,161,155,153,145,167,146,,582,174,579,578,577,587,580,,582', +',579,578,577,587,580,590,,,,,,,,590,,,,,,,,,,,,,,585,,,,,,,,585,595', +'594,598,597,,,,591,595,594,598,597,,,,591' ] + racc_action_table = arr = ::Array.new(28007, nil) + idx = 0 + clist.each do |str| + str.split(',', -1).each do |i| + arr[idx] = i.to_i unless i.empty? + idx += 1 + end + end + +clist = [ +'849,847,1052,999,1056,827,394,849,849,849,762,762,619,849,849,285,849', +'46,46,877,21,1109,285,816,849,849,415,1102,414,702,691,628,817,1105', +'956,988,849,849,812,849,849,849,849,849,1108,1158,702,383,1032,1199', +'1056,1196,137,988,622,815,1006,137,137,1199,847,21,622,814,391,877,849', +'849,849,849,849,849,849,849,849,849,849,849,849,849,285,390,849,849', +'849,999,849,849,816,691,849,1112,415,849,414,46,46,817,849,1006,849', +'441,849,849,762,849,849,849,849,849,111,849,849,849,827,394,619,111', +'111,111,1052,619,111,111,111,1052,111,849,1196,752,849,849,816,849,111', +'849,111,111,111,1109,628,817,849,956,1109,849,111,111,1054,111,111,111', +'111,111,1195,1206,812,1193,1194,812,441,812,1108,1158,815,383,1032,1108', +'1158,1196,383,1032,814,391,1196,51,111,111,111,111,111,111,111,111,111', +'111,111,111,111,111,390,382,111,111,111,752,111,111,730,970,111,43,321', +'111,111,238,111,321,111,1112,111,872,111,111,1112,111,111,111,111,111', +'848,111,1111,111,69,638,638,848,848,848,1061,1195,1061,848,848,752,848', +'111,752,1114,111,111,111,111,848,111,873,111,472,472,752,872,111,800', +'800,111,848,848,970,848,848,848,848,848,238,592,1054,508,508,1115,755', +'1054,1195,1206,52,1193,1194,1195,1206,29,1193,1194,873,592,1116,730', +'848,848,848,848,848,848,848,848,848,848,848,848,848,848,341,1117,848', +'848,848,333,848,848,40,382,848,69,333,848,382,914,348,348,848,638,848', +'333,848,848,638,848,848,848,848,848,52,848,692,848,25,755,755,690,846', +'692,692,692,472,29,692,692,692,848,692,600,848,848,1129,848,600,848', +'692,692,692,692,692,508,848,1130,341,848,29,753,692,692,333,692,692', +'692,692,692,755,334,1139,755,747,914,653,284,334,1076,1141,341,1144', +'1088,284,755,747,334,348,348,690,846,692,692,692,692,692,692,692,692', +'692,692,692,692,692,692,53,352,692,692,692,655,692,692,1145,914,692', +'400,914,692,692,400,692,1146,692,478,692,753,692,692,914,692,692,692', +'692,692,334,692,692,692,653,653,284,1076,1076,1076,531,1088,1088,409', +'653,1147,410,692,352,413,692,692,692,692,1076,692,53,692,1088,693,352', +'753,692,236,753,692,693,693,693,655,655,693,693,693,335,693,753,1149', +'478,655,876,335,283,693,876,693,693,693,700,283,335,869,399,700,1154', +'693,693,700,693,693,693,693,693,17,531,531,531,409,409,409,410,410,410', +'413,413,413,675,235,387,5,1164,531,236,387,5,693,693,693,693,693,693', +'693,693,693,693,693,693,693,693,335,41,693,693,693,399,693,693,283,1170', +'693,869,399,693,693,412,693,399,693,1175,693,399,693,693,675,693,693', +'693,693,693,960,693,15,693,721,960,675,235,721,907,399,907,907,907,907', +'907,457,693,41,282,693,693,693,693,907,693,282,693,1189,463,41,456,693', +'1055,1055,693,463,463,463,1190,399,378,463,463,378,463,907,16,16,412', +'412,412,281,463,463,907,907,907,907,281,1165,1165,907,457,88,463,463', +'1192,463,463,463,463,463,14,42,457,88,366,456,366,366,366,366,366,282', +'416,88,12,907,9,456,1131,366,1197,1131,463,463,463,463,463,463,463,463', +'463,463,463,463,463,463,1202,19,463,463,463,366,463,463,281,1203,463', +'411,42,463,366,366,366,366,463,1204,463,366,463,463,42,463,463,463,463', +'463,462,463,463,463,704,704,1205,462,462,462,416,416,416,462,462,280', +'462,463,19,3,463,463,280,463,462,463,279,278,774,774,19,366,463,279', +'278,463,462,462,1211,462,462,462,462,462,1217,411,411,411,768,392,768', +'768,768,768,768,277,392,371,371,371,371,371,277,768,516,392,462,462', +'462,462,462,462,462,462,462,462,462,462,462,462,280,517,462,462,462', +'768,462,462,381,381,462,279,278,462,768,768,768,768,462,518,462,768', +'462,462,522,462,462,462,462,462,108,462,799,462,392,799,491,108,108', +'108,277,490,108,108,108,276,108,462,489,488,462,462,276,462,108,462', +'108,108,108,538,375,768,462,375,539,462,108,108,542,108,108,108,108', +'108,544,548,549,18,374,337,27,374,548,553,18,563,337,27,564,567,568', +'548,569,18,570,337,108,108,108,108,108,108,108,108,108,108,108,108,108', +'108,276,571,108,108,108,573,108,108,1151,487,108,574,584,108,108,1151', +'108,474,108,596,108,599,108,108,1151,108,108,108,108,108,548,108,18', +'108,337,27,536,536,536,536,536,487,756,601,464,487,487,108,603,756,108', +'108,108,108,756,108,440,108,756,604,605,606,108,440,455,108,818,818', +'818,818,818,818,440,1151,616,818,818,454,452,620,818,398,818,818,818', +'818,818,818,818,324,324,324,324,324,818,818,818,818,818,818,818,621', +'585,818,585,585,585,756,585,818,818,818,818,818,818,818,818,818,818', +'818,818,440,818,818,818,631,818,818,818,818,818,820,631,398,623,353', +'49,49,820,585,398,631,353,820,442,398,438,820,585,398,818,353,435,818', +'433,650,818,818,1110,658,818,660,818,432,430,1110,818,667,398,424,486', +'676,49,49,1110,818,681,404,686,694,818,818,818,818,695,818,818,818,818', +'1074,631,697,395,818,818,393,820,720,398,1074,353,818,486,818,818,818', +'486,486,818,818,823,823,823,823,823,823,723,724,389,823,823,727,729', +'1110,823,819,823,823,823,823,823,823,823,388,735,736,737,1074,823,823', +'823,823,823,823,823,739,741,823,379,1074,749,751,377,823,823,823,823', +'823,823,823,823,823,823,823,823,376,823,823,823,1104,823,823,823,823', +'823,402,1104,819,754,54,757,758,402,761,819,1104,54,372,764,819,368', +'402,364,819,823,54,783,823,784,786,823,823,234,362,823,802,823,808,809', +'234,823,785,819,785,785,785,358,785,234,823,813,356,349,822,823,823', +'823,823,347,823,823,823,823,886,1104,343,826,823,823,342,402,828,819', +'886,54,823,340,823,823,823,843,339,823,823,834,834,834,834,834,834,845', +'336,854,834,834,330,329,234,834,870,834,834,834,834,834,834,834,23,328', +'326,325,886,834,834,834,834,834,834,834,878,879,834,883,886,884,885', +'888,834,834,834,834,834,834,834,834,834,834,834,834,313,834,834,834', +'310,834,834,834,834,834,23,23,23,23,23,23,23,23,23,23,23,309,23,23,900', +'903,23,23,904,834,1,23,834,771,913,834,834,295,918,834,921,834,23,771', +'23,834,23,23,922,23,23,23,23,23,834,23,925,927,928,834,834,834,834,930', +'834,834,834,834,932,934,935,937,834,834,940,23,771,771,947,950,834,771', +'834,834,834,957,959,834,834,1010,1010,1010,1010,1010,1010,966,646,646', +'1010,1010,646,646,646,1010,967,1010,1010,1010,1010,1010,1010,1010,8', +'8,8,8,8,1010,1010,1010,1010,1010,1010,1010,968,969,1010,979,980,981', +'982,445,1010,1010,1010,1010,1010,1010,1010,1010,1010,1010,1010,1010', +'244,1010,1010,1010,991,1010,1010,1010,1010,1010,445,445,445,445,445', +'445,445,445,445,445,445,992,445,445,993,997,445,445,998,1010,240,239', +'1010,1003,1013,1010,1010,1014,1016,1010,1017,1010,445,1018,445,1010', +'445,445,1020,445,445,445,445,445,1010,445,1021,1022,237,1010,1010,1010', +'1010,1048,1010,1010,1010,1010,1049,1065,216,1075,1010,1010,1083,445', +'1085,445,,,1010,,1010,1010,1010,,,1010,1010,615,615,615,615,615,615', +',,,615,615,,,,615,,615,615,615,615,615,615,615,,,,,,615,615,615,615', +'615,615,615,,,615,,,,,794,615,615,615,615,615,615,615,615,615,615,615', +'615,,615,615,615,,615,615,615,615,615,794,794,794,794,794,794,794,794', +'794,794,794,,794,794,,,794,794,,615,,,615,1091,,615,615,,,615,,615,794', +'1091,794,615,794,794,,794,794,794,794,794,615,794,,,,615,615,615,615', +',615,615,615,615,,,,,615,615,,794,1091,1091,,,615,1091,615,615,615,', +',615,615,618,618,618,618,618,618,,,,618,618,,,,618,,618,618,618,618', +'618,618,618,,,,,,618,618,618,618,618,618,618,,,618,,,,,451,618,618,618', +'618,618,618,618,618,618,618,618,618,,618,618,618,,618,618,618,618,618', +'451,451,451,451,451,451,451,451,451,451,451,,451,451,,,451,451,,618', +',,618,,,618,618,,,618,,618,451,,451,618,451,451,,451,451,451,451,451', +'618,451,,,,618,618,618,618,,618,618,618,618,,,,,618,618,,451,,,,,618', +',618,618,618,,,618,618,1029,1029,1029,1029,1029,1029,,,,1029,1029,,', +',1029,,1029,1029,1029,1029,1029,1029,1029,,,,,,1029,1029,1029,1029,1029', +'1029,1029,,,1029,,,,,763,1029,1029,1029,1029,1029,1029,1029,1029,1029', +'1029,1029,1029,,1029,1029,1029,,1029,1029,1029,1029,1029,763,763,763', +'763,763,763,763,763,763,763,763,,763,763,,,763,763,,1029,,,1029,,,1029', +'1029,,,1029,,1029,763,,763,1029,763,763,,763,763,763,763,763,1029,763', +',,,1029,1029,1029,1029,,1029,1029,1029,1029,,,,,1029,1029,,763,,,,,1029', +',1029,1029,1029,,,1029,1029,218,218,218,218,218,218,,,,218,218,,,,218', +',218,218,218,218,218,218,218,,,,,,218,218,218,218,218,218,218,,1174', +'218,1174,1174,1174,,1174,218,218,218,218,218,218,218,218,218,218,218', +'218,,218,218,218,,218,218,218,218,218,505,505,505,505,505,505,505,505', +'505,505,505,,505,505,,,505,505,,218,,,218,,,218,218,,,218,,218,505,', +'505,218,505,505,,505,505,505,505,505,218,505,,,,218,218,218,218,,218', +'218,218,218,,,,,218,218,505,505,,,,,218,,218,218,218,,,218,218,1066', +'1066,1066,1066,1066,1066,,,,1066,1066,,,,1066,,1066,1066,1066,1066,1066', +'1066,1066,,,,,,1066,1066,1066,1066,1066,1066,1066,,1068,1066,1068,1068', +'1068,,1068,1066,1066,1066,1066,1066,1066,1066,1066,1066,1066,1066,1066', +',1066,1066,1066,,1066,1066,1066,1066,1066,851,851,851,851,851,851,851', +'851,851,851,851,,851,851,,,851,851,,1066,,,1066,,,1066,1066,,,1066,', +'1066,851,,851,1066,851,851,,851,851,851,851,851,1066,851,,,,1066,1066', +'1066,1066,,1066,1066,1066,1066,,,,,1066,1066,,851,,,,,1066,,1066,1066', +'1066,,,1066,1066,1067,1067,1067,1067,1067,1067,,,,1067,1067,,,,1067', +',1067,1067,1067,1067,1067,1067,1067,,,,,,1067,1067,1067,1067,1067,1067', +'1067,,,1067,,,,,,1067,1067,1067,1067,1067,1067,1067,1067,1067,1067,1067', +'1067,,1067,1067,1067,,1067,1067,1067,1067,1067,307,307,307,307,307,307', +'307,307,307,307,307,,307,307,,,307,307,,1067,,,1067,,,1067,1067,,,1067', +',1067,307,,307,1067,307,307,,307,307,307,307,307,1067,307,,,,1067,1067', +'1067,1067,,1067,1067,1067,1067,,,,,1067,1067,,307,,,,,1067,,1067,1067', +'1067,,,1067,1067,639,639,639,639,639,639,,,,639,639,,,,639,,639,639', +'639,639,639,639,639,,,,,,639,639,639,639,639,639,639,,,639,,,,,,639', +'639,639,639,639,639,639,639,639,639,639,639,,639,639,639,,639,639,639', +'639,639,1050,1050,1050,1050,1050,1050,1050,1050,1050,1050,1050,,1050', +'1050,,,1050,1050,,639,,,639,,,639,639,,,639,,639,1050,,1050,639,1050', +'1050,,1050,1050,1050,1050,1050,639,1050,,,,639,639,639,639,,639,639', +'639,639,,,,,639,639,,1050,,,,,639,,639,639,639,,,639,639,386,386,386', +'386,386,386,,,,386,386,,,,386,,386,386,386,386,386,386,386,,,,,,386', +'386,386,386,386,386,386,,,386,,,,,,386,386,386,386,386,386,386,386,386', +'386,386,386,,386,386,386,,386,386,386,386,386,560,560,560,560,560,560', +'560,560,560,560,560,,560,560,,,560,560,,386,,,386,,,386,386,,,386,,386', +'560,,560,386,560,560,,560,560,560,560,560,386,560,,,,386,386,386,386', +',386,386,386,386,,,,,386,386,,560,,,,,386,,386,386,386,,,386,386,36', +'36,36,36,36,36,,,,36,36,,,,36,,36,36,36,36,36,36,36,,,,,,36,36,36,36', +'36,36,36,,,36,,,,,,36,36,36,36,36,36,36,36,36,36,36,36,,36,36,36,,36', +'36,36,36,36,1009,1009,1009,1009,1009,1009,1009,1009,1009,1009,1009,', +'1009,1009,,,1009,1009,,36,,,36,,,36,36,,,36,,36,1009,,1009,36,1009,1009', +',1009,1009,1009,1009,1009,36,1009,,,,36,36,36,36,,36,36,36,36,,,,,36', +'36,,1009,,,,,36,,36,36,36,,,36,36,135,135,135,135,135,135,,,,135,135', +',,,135,,135,135,135,135,135,135,135,,,,,,135,135,135,135,135,135,135', +',,135,,,,,,135,135,135,135,135,135,135,135,135,135,135,135,,135,135', +'135,,135,135,135,135,135,1027,1027,1027,1027,1027,1027,1027,1027,1027', +'1027,1027,,1027,1027,,,1027,1027,,135,,,135,,,135,135,,,135,,135,1027', +',1027,135,1027,1027,,1027,1027,1027,1027,1027,135,1027,,,,135,135,135', +'135,,135,135,135,135,,,,,135,135,,1027,,,,,135,,135,135,135,,,135,135', +'332,332,332,332,332,332,,,,332,332,,,,332,,332,332,332,332,332,332,332', +',,,,,332,332,332,332,332,332,332,,941,332,941,941,941,,941,332,332,332', +'332,332,332,332,332,332,332,332,332,,332,332,332,,332,332,332,332,332', +'781,,781,781,781,,781,,941,,942,,942,942,942,,942,941,,332,,,332,,,332', +'332,,502,332,,332,,,,332,,781,,1119,,1119,1119,1119,332,1119,781,942', +',332,332,332,332,,332,332,332,332,,,502,,332,332,502,502,,502,502,,332', +',332,332,332,,1119,332,332,385,385,385,385,385,385,,,,385,385,,,,385', +',385,385,385,385,385,385,385,,,,,,385,385,385,385,385,385,385,,,385', +',,501,,,385,385,385,385,385,385,385,385,385,385,385,385,,385,385,385', +',385,385,385,385,385,503,503,503,503,503,503,503,501,,503,503,501,501', +',501,501,503,503,,385,,,385,,,385,385,,,385,,385,503,,503,385,503,503', +',503,503,503,503,503,385,503,,,,385,385,385,385,,385,385,385,385,,,', +',385,385,,1118,,1118,1118,1118,385,1118,385,385,385,,,385,385,1120,1120', +'1120,1120,1120,1120,,,,1120,1120,,,,1120,,1120,1120,1120,1120,1120,1120', +'1120,1118,,,,,1120,1120,1120,1120,1120,1120,1120,,,1120,,,,,,1120,1120', +'1120,1120,1120,1120,1120,1120,1120,1120,1120,1120,,1120,1120,1120,,1120', +'1120,1120,1120,1120,499,499,499,499,499,499,499,,,499,499,,,,,,499,499', +',1120,,,1120,,,1120,1120,,,1120,,1120,499,,499,1120,499,499,,499,499', +'499,499,499,1120,499,,,,1120,1120,1120,1120,,1120,1120,1120,1120,,,', +',1120,1120,,,,,,,1120,,1120,1120,1120,,,1120,1120,327,327,327,327,327', +'327,,,,327,327,,,,327,,327,327,327,327,327,327,327,,,,,,327,327,327', +'327,327,327,327,,,327,,,,,,327,327,327,327,327,327,327,327,327,327,327', +'327,,327,327,327,,327,327,327,327,327,500,500,500,500,500,500,500,,', +'500,500,,,,,,500,500,,327,,,327,,,327,327,,,327,,327,500,,500,327,500', +'500,,500,500,500,500,500,327,500,,,,327,327,327,327,,327,327,327,327', +',,,,327,327,,,,,,,327,,327,327,327,,,327,327,908,908,908,908,908,908', +',,,908,908,,,,908,,908,908,908,908,908,908,908,,,,,,908,908,908,908', +'908,908,908,,,908,,,,,,908,908,908,908,908,908,908,908,908,908,908,908', +',908,908,908,,908,908,908,908,908,498,498,498,498,498,498,498,,,498', +'498,,,,,,498,498,,908,,,908,,,908,908,,,908,,908,498,,498,908,498,498', +',498,498,498,498,498,908,498,,,,908,908,908,908,,908,908,908,908,,,', +',908,908,,,,,,,908,,908,908,908,,,908,908,1166,1166,1166,1166,1166,1166', +',,,1166,1166,,,,1166,,1166,1166,1166,1166,1166,1166,1166,,,,,,1166,1166', +'1166,1166,1166,1166,1166,,,1166,,,,,,1166,1166,1166,1166,1166,1166,1166', +'1166,1166,1166,1166,1166,,1166,1166,1166,,1166,1166,1166,1166,1166,496', +'496,496,496,496,496,496,,,496,496,,,,,,496,496,,1166,,,1166,,,1166,1166', +',,1166,,1166,496,,496,1166,496,496,,496,496,496,496,496,1166,496,,,', +'1166,1166,1166,1166,,1166,1166,1166,1166,,,,,1166,1166,,,,,,,1166,,1166', +'1166,1166,,,1166,1166,2,2,2,2,2,2,,,,2,2,,,,2,,2,2,2,2,2,2,2,,,,,,2', +'2,2,2,2,2,2,,,2,,,,,,2,2,2,2,2,2,2,2,2,2,2,2,,2,2,2,,2,2,2,2,2,355,355', +'355,355,355,355,355,355,355,355,355,,355,355,,,355,355,,2,,,2,,,2,2', +',,2,,2,355,,355,2,355,355,,355,355,355,355,355,2,355,,,,2,2,2,2,,2,2', +'2,2,,,,,2,2,,,,,,,2,,2,2,2,,,2,2,370,370,370,370,370,370,,,,370,370', +',,,370,,370,370,370,370,370,370,370,,,,,,370,370,370,370,370,370,370', +',,370,,,,,,370,370,370,370,370,370,370,370,370,370,370,370,,370,370', +'370,,370,370,370,370,370,354,354,354,354,354,354,354,354,354,354,354', +',354,354,,,354,354,,370,,,370,,,370,370,,,370,,370,354,,354,370,354', +'354,,354,354,354,354,354,370,354,,,,370,370,370,370,,370,370,370,370', +',,,,370,370,,,,,,,370,,370,370,370,,,370,370,369,369,369,369,369,369', +',,,369,369,,,,369,,369,369,369,369,369,369,369,,,,,,369,369,369,369', +'369,369,369,,,369,,,,,,369,369,369,369,369,369,369,369,369,369,369,369', +',369,369,369,,369,369,369,369,369,504,504,504,504,504,504,504,504,,504', +'504,,,,,,504,504,,369,,,369,,,369,369,,,369,,369,504,,504,369,504,504', +',504,504,504,504,504,369,504,,,,369,369,369,369,,369,369,369,369,,,', +',369,369,,,,,,,369,,369,369,369,,,369,369,920,920,920,920,920,920,,', +',920,920,,,,920,,920,920,920,920,920,920,920,,,,,,920,920,920,920,920', +'920,920,,,920,,,,,,920,920,920,920,920,920,920,920,920,920,920,920,', +'920,920,920,,920,920,920,920,920,559,,,,,,,,,,,,,,,,559,559,,920,,,920', +',,920,920,,,920,,920,559,,559,920,559,559,,559,559,,,559,920,559,,,', +'920,920,920,920,,920,920,920,920,,,,,920,920,,,,,,,920,,920,920,920', +',,920,920,363,363,363,363,363,363,,,,363,363,,,,363,,363,363,363,363', +'363,363,363,,,,,,363,363,363,363,363,363,363,,,363,,,,,,363,363,363', +'363,363,363,363,363,363,363,363,363,,363,363,363,,363,363,363,363,363', +'484,484,484,484,484,484,484,484,484,484,484,,484,484,,,484,484,,363', +',,363,,,363,363,,,363,,363,484,,484,363,484,484,,484,484,484,484,484', +'363,484,,,,363,363,363,363,,363,363,363,363,,,,,363,363,,,,,,,363,,363', +'363,363,,,363,363,1107,1107,1107,1107,1107,1107,,,,1107,1107,,,,1107', +',1107,1107,1107,1107,1107,1107,1107,,,,,,1107,1107,1107,1107,1107,1107', +'1107,,,1107,,,,,,1107,1107,1107,1107,1107,1107,1107,1107,1107,1107,1107', +'1107,,1107,1107,1107,,1107,1107,1107,1107,1107,497,497,497,497,497,497', +'497,,,497,497,,,,,,497,497,,1107,,,1107,,,1107,1107,,,1107,,1107,497', +',497,1107,497,497,,497,497,497,497,497,1107,497,,,,1107,1107,1107,1107', +',1107,1107,1107,1107,,,,,1107,1107,,,,,,,1107,,1107,1107,1107,,,1107', +'1107,955,955,955,955,955,955,,,,955,955,,,,955,,955,955,955,955,955', +'955,955,,,,,,955,955,955,955,955,955,955,,,955,,,,,,955,955,955,955', +'955,955,955,955,955,955,955,955,,955,955,955,,955,955,955,955,955,485', +'485,485,485,485,485,485,485,485,485,485,,485,485,,,485,485,,955,,,955', +',,955,955,,,955,,955,485,,485,955,485,485,,485,485,485,485,485,955,485', +',,,955,955,955,955,,955,955,955,955,,,,,955,955,,,,,,,955,,955,955,955', +',,955,955,961,961,961,961,961,961,,,,961,961,,,,961,,961,961,961,961', +'961,961,961,,,,,,961,961,961,961,961,961,961,,,961,,,,,,961,961,961', +'961,961,961,961,961,961,961,961,961,,961,961,961,,961,961,961,961,961', +'495,495,495,495,495,495,495,,,495,495,,,,,,495,495,,961,,,961,,,961', +'961,,,961,,961,495,,495,961,495,495,,495,495,495,495,495,961,495,,,', +'961,961,961,961,,961,961,961,961,,,,,961,961,,,,,,,961,,961,961,961', +',,961,961,243,243,243,243,243,243,,,,243,243,,,,243,,243,243,243,243', +'243,243,243,,,,,,243,243,243,243,243,243,243,,,243,,,,,,243,243,243', +'243,243,243,243,243,243,243,243,243,,243,243,243,,243,243,243,243,243', +'506,,,,,,,,,,,,,,,,506,506,,243,,,243,,,243,243,,,243,,243,506,,506', +'243,506,506,,506,506,,,506,243,506,,,,243,243,243,243,,243,243,243,243', +',,,,243,243,,,,132,132,132,243,132,243,243,243,132,132,243,243,,132', +',132,132,132,132,132,132,132,,,,,,132,132,132,132,132,132,132,,,132', +',,,,,,132,,,132,132,132,132,132,132,132,132,,132,132,132,,132,132,132', +'132,132,492,,,,,,,,,,,,,,,,492,492,,132,,,132,,,132,132,,,132,,,492', +',492,132,492,492,,492,492,,,,132,,,,,132,132,132,132,,132,132,132,132', +',,,,132,132,,,,,,,132,,132,132,132,510,,132,132,,,,510,510,510,,,510', +'510,510,,510,494,,,,,,,510,510,510,,,,,,,494,494,,510,510,,510,510,510', +'510,510,,,,,,494,,292,292,494,494,292,494,494,,,,,,292,292,,292,292', +'292,292,292,292,292,,,292,292,510,,,292,292,292,292,510,,,,,510,510', +',,,,,,292,292,,292,292,292,292,292,292,292,292,292,292,292,292,510,510', +'292,,,,,,,,,,,,,510,,,510,,,,,510,7,7,7,7,7,,510,,7,7,,,,7,,7,7,7,7', +'7,7,7,,,,,,7,7,7,7,7,7,7,,,7,,,,,,7,7,7,7,7,7,7,7,7,7,7,7,,7,7,7,,7', +'7,7,7,7,493,,,,,,,,,,,,,,,,493,493,,7,,,7,,,7,7,,,7,,7,493,,493,7,493', +'493,,493,493,,,,7,,,,,7,7,7,7,,7,7,7,7,,,,,7,7,,,,1155,1155,1155,7,1155', +'7,7,7,1155,1155,7,7,,1155,,1155,1155,1155,1155,1155,1155,1155,,,,,,1155', +'1155,1155,1155,1155,1155,1155,,,1155,,,,,,,1155,,,1155,1155,1155,1155', +'1155,1155,1155,1155,1155,1155,1155,1155,,1155,1155,1155,1155,1155,,', +',,,,,,,,,,,,,,,,,1155,,,1155,,,1155,1155,,,1155,,1155,,1155,,1155,,', +'1155,,,,,,1155,,,,,1155,1155,1155,1155,,1155,1155,1155,1155,,,,,1155', +'1155,,,,22,22,22,1155,22,1155,1155,1155,22,22,1155,1155,,22,,22,22,22', +'22,22,22,22,,,,,,22,22,22,22,22,22,22,,,22,,,,,,,22,,,22,22,22,22,22', +'22,22,22,,22,22,22,,22,22,22,22,22,,,,,,,,,,,,,,,,,,,,22,,,22,,,22,22', +',,22,,,,,,22,,,,,,,,,22,,,,,22,22,22,22,,22,22,22,22,,,,,22,22,,,,1123', +'1123,1123,22,1123,22,22,22,1123,1123,22,22,,1123,,1123,1123,1123,1123', +'1123,1123,1123,,,,,,1123,1123,1123,1123,1123,1123,1123,,,1123,,,,,,', +'1123,,,1123,1123,1123,1123,1123,1123,1123,1123,,1123,1123,1123,,1123', +'1123,1123,1123,1123,,,,,,,,,,,,,,,,,,,,1123,,,1123,,,1123,1123,,,1123', +',,,,,1123,,,,,,,,,1123,,,,,1123,1123,1123,1123,,1123,1123,1123,1123', +',,,,1123,1123,,,,,,,1123,,1123,1123,1123,30,,1123,1123,,,,30,30,30,', +',30,30,30,,30,,,,,,,,30,30,30,30,,,,,,,,,30,30,,30,30,30,30,30,,,,,', +',,,,,,,,,,,,,,,,,30,30,30,30,30,30,30,30,30,30,30,30,30,30,,,30,30,30', +',,30,,30,30,,,30,30,,30,,30,,30,,30,30,,30,30,30,30,30,31,30,30,30,', +',,31,31,31,,,31,31,31,,31,30,,,30,30,,30,31,30,31,31,,,,,30,,,,31,31', +',31,31,31,31,31,,,,,,,,,,,,,,,,,,,,,,,31,31,31,31,31,31,31,31,31,31', +'31,31,31,31,,,31,31,31,,,31,,31,31,,,31,31,,31,,31,,31,,31,31,,31,31', +'31,31,31,,31,,31,,,,,,,,,,,,,,31,,,31,31,,31,,31,32,32,32,,32,,31,,32', +'32,,,,32,,32,32,32,32,32,32,32,,,,,,32,32,32,32,32,32,32,,,32,,,,,,', +'32,,,32,32,32,32,32,32,32,32,32,32,32,32,,32,32,32,32,32,,,,,,,,,,,', +',,,,,,,,32,,,32,,,32,32,,,32,,32,,32,,32,,,32,,,,,,32,,,,,32,32,32,32', +',32,32,32,32,,,,,32,32,,,,33,33,33,32,33,32,32,32,33,33,32,32,,33,,33', +'33,33,33,33,33,33,,,,,,33,33,33,33,33,33,33,,,33,,,,,,,33,,,33,33,33', +'33,33,33,33,33,33,33,33,33,,33,33,33,33,33,,,,,,,,,,,,,,,,,,,,33,,,33', +',,33,33,,,33,,33,,33,,33,,,33,,,,,,33,,,,,33,33,33,33,,33,33,33,33,', +',,,33,33,,,,34,34,34,33,34,33,33,33,34,34,33,33,,34,,34,34,34,34,34', +'34,34,,,,,,34,34,34,34,34,34,34,,,34,,,,,,,34,,,34,34,34,34,34,34,34', +'34,34,34,34,34,,34,34,34,34,34,,,,,,,,,,,,,,,,,,,,34,,,34,,,34,34,,', +'34,,34,,34,,34,,,34,,,,,,34,,,,,34,34,34,34,,34,34,34,34,,,,,34,34,', +',,1122,1122,1122,34,1122,34,34,34,1122,1122,34,34,,1122,,1122,1122,1122', +'1122,1122,1122,1122,,,,,,1122,1122,1122,1122,1122,1122,1122,,,1122,', +',,,,,1122,,,1122,1122,1122,1122,1122,1122,1122,1122,,1122,1122,1122', +',1122,1122,1122,1122,1122,,,,,,,,,,,,,,,,,,,,1122,,,1122,,,1122,1122', +',,1122,,,,,,1122,,,,,,,,,1122,,,,,1122,1122,1122,1122,,1122,1122,1122', +'1122,,,,,1122,1122,,,,44,44,44,1122,44,1122,1122,1122,44,44,1122,1122', +',44,,44,44,44,44,44,44,44,,,,,,44,44,44,44,44,44,44,,,44,,,,,,,44,,', +'44,44,44,44,44,44,44,44,,44,44,44,,44,44,44,44,44,,,,,,,,,,,,,,,,,,', +',44,,,44,,,44,44,,,44,,,,,,44,,,,,,,,,44,,,,,44,44,44,44,,44,44,44,44', +',,,,44,44,,,,45,45,45,44,45,44,44,44,45,45,44,44,,45,,45,45,45,45,45', +'45,45,,,,,,45,45,45,45,45,45,45,,,45,,,,,,,45,,,45,45,45,45,45,45,45', +'45,,45,45,45,,45,45,45,45,45,,,,,,,,,,,,,,,,,,,,45,,,45,,,45,45,,,45', +',,,,,45,,,,,,,,,45,,,,,45,45,45,45,,45,45,45,45,,,,,45,45,,,,47,47,47', +'45,47,45,45,45,47,47,45,45,,47,,47,47,47,47,47,47,47,,,,,,47,47,47,47', +'47,47,47,,,47,,,,,,,47,,,47,47,47,47,47,47,47,47,,47,47,47,,47,47,47', +'47,47,,,,,,,,,,,,,,,,,,,,47,,,47,,,47,47,,,47,,,,,,47,,,,,,,,,47,,,', +',47,47,47,47,,47,47,47,47,,,,,47,47,,,,48,48,48,47,48,47,47,47,48,48', +'47,47,,48,,48,48,48,48,48,48,48,,,,,,48,48,48,48,48,48,48,,,48,,,,,', +',48,,,48,48,48,48,48,48,48,48,,48,48,48,,48,48,48,48,48,,,,,,,,,,,,', +',,,,,,,48,,,48,,,48,48,,,48,,,,,,48,,,,,,,,,48,,,,,48,48,48,48,,48,48', +'48,48,,,,,48,48,,,,50,50,50,48,50,48,48,48,50,50,48,48,,50,,50,50,50', +'50,50,50,50,,,,,,50,50,50,50,50,50,50,,,50,,,,,,,50,,,50,50,50,50,50', +'50,50,50,,50,50,50,,50,50,50,50,50,,,,,,,,,,,,,,,,,,,,50,,,50,,,50,50', +',,50,,,,,,50,,,,,,,,,50,,,,,50,50,50,50,,50,50,50,50,,,,,50,50,,,,,', +',50,,50,50,50,64,,50,50,,,,64,64,64,,,64,64,64,,64,,,,,,,,64,,64,64', +'64,,,,707,707,707,707,64,64,,64,64,64,64,64,,,,,707,707,707,,,,,,,,', +',,707,707,,,707,64,64,64,64,64,64,64,64,64,64,64,64,64,64,,,64,64,64', +',,64,,,64,,,64,64,,64,,64,,64,,64,64,,64,64,64,64,64,,64,,64,,707,707', +'707,707,,707,707,707,707,,,,64,707,707,64,64,64,64,,64,707,64,707,707', +'707,,64,66,66,66,66,66,,,,66,66,,,,66,,66,66,66,66,66,66,66,,,,,,66', +'66,66,66,66,66,66,,,66,,,,,,66,66,,66,66,66,66,66,66,66,66,66,,66,66', +'66,,66,66,66,66,66,,,,,,,,,,,,,,,,,,,,66,,,66,,,66,66,,,66,,66,,,,66', +',,,,,,,,66,,,,,66,66,66,66,,66,66,66,66,,,,,66,66,,,,67,67,67,66,67', +'66,66,66,67,67,66,66,,67,,67,67,67,67,67,67,67,,,,,,67,67,67,67,67,67', +'67,,,67,,,,,,,67,,,67,67,67,67,67,67,67,67,67,67,67,67,,67,67,67,67', +'67,,,,,,,,,,,,,,,,,,,,67,,,67,,,67,67,,,67,,67,,,,67,,,67,,,,,,67,,', +',,67,67,67,67,,67,67,67,67,,,,,67,67,,,,68,68,68,67,68,67,67,67,68,68', +'67,67,,68,,68,68,68,68,68,68,68,,,,,,68,68,68,68,68,68,68,,,68,,,,,', +',68,,,68,68,68,68,68,68,68,68,68,68,68,68,,68,68,68,68,68,,,,,,,,,,', +',,,,,,,,,68,,,68,,,68,68,,,68,,,,,,68,,,68,,,,,,68,,,,,68,68,68,68,', +'68,68,68,68,,,,,68,68,,,,71,71,71,68,71,68,68,68,71,71,68,68,,71,,71', +'71,71,71,71,71,71,,,,,,71,71,71,71,71,71,71,,,71,,,,,,,71,,,71,71,71', +'71,71,71,71,71,,71,71,71,,71,71,71,71,71,,,,,,,,,,,,,,,,,,,,71,,,71', +',,71,71,,,71,,,,,,71,,,,,,,,,71,,,,,71,71,71,71,,71,71,71,71,,,,,71', +'71,,,,72,72,72,71,72,71,71,71,72,72,71,71,,72,,72,72,72,72,72,72,72', +',,,,,72,72,72,72,72,72,72,,,72,,,,,,,72,,,72,72,72,72,72,72,72,72,,72', +'72,72,,72,72,72,72,72,,,,,,,,,,,,,,,,,,,,72,,,72,,,72,72,,,72,,,,,,72', +',,,,,,,,72,,,,,72,72,72,72,,72,72,72,72,,,,,72,72,,,,75,75,75,72,75', +'72,72,72,75,75,72,72,,75,,75,75,75,75,75,75,75,,,,,,75,75,75,75,75,75', +'75,,,75,,,,,,,75,,,75,75,75,75,75,75,75,75,,75,75,75,,75,75,75,75,75', +',,,,,,,,,,,,,,,,,,,75,,,75,,,75,75,,,75,,,,,,75,,,,,,,,,75,,,,,75,75', +'75,75,,75,75,75,75,,,,,75,75,75,,,,,75,75,,75,75,75,,,75,75,124,124', +'124,124,124,,,,124,124,,,,124,,124,124,124,124,124,124,124,,,,,,124', +'124,124,124,124,124,124,,,124,,,,,,124,124,124,124,124,124,124,124,124', +'124,124,124,,124,124,124,,124,124,124,124,124,,,,,,,,,,,,,,,,,,,,124', +',,124,,,124,124,,,124,,124,,,,124,,,,,,,,,124,,,,,124,124,124,124,,124', +'124,124,124,,,,,124,124,,,,,,124,124,,124,124,124,,,124,124,129,129', +'129,,129,,,,129,129,,,,129,,129,129,129,129,129,129,129,,,,,,129,129', +'129,129,129,129,129,,,129,,,,,,,129,,,129,129,129,129,129,129,129,129', +',129,129,129,,129,129,129,129,129,,,,,,,,,,,,,,,,,,,,129,,,129,,,129', +'129,,,129,,,,,,129,,,,,,,,,129,,,,,129,129,129,129,,129,129,129,129', +',,,,129,129,,,,130,130,130,129,130,129,129,129,130,130,129,129,,130', +',130,130,130,130,130,130,130,,,,,,130,130,130,130,130,130,130,,,130', +',,,,,,130,,,130,130,130,130,130,130,130,130,,130,130,130,,130,130,130', +'130,130,,,,,,,,,,,,,,,,,,,,130,,,130,,,130,130,,,130,,,,,,130,,,,,,', +',,130,,,,,130,130,130,130,,130,130,130,130,,,,,130,130,,,,131,131,131', +'130,131,130,130,130,131,131,130,130,,131,,131,131,131,131,131,131,131', +',,,,,131,131,131,131,131,131,131,,,131,,,,,,,131,,,131,131,131,131,131', +'131,131,131,,131,131,131,,131,131,131,131,131,,,,,,,,,,,,,,,,,,,,131', +',,131,,,131,131,,,131,,,,,,131,,,,,,,,,131,,,,,131,131,131,131,,131', +'131,131,131,,,,,131,131,,,,515,515,515,131,515,131,131,131,515,515,131', +'131,,515,,515,515,515,515,515,515,515,,,,,,515,515,515,515,515,515,515', +',,515,,,,,,,515,,,515,515,515,515,515,515,515,515,,515,515,515,,515', +'515,515,515,515,,,,,,,,,,,,,,,,,,,,515,,,515,,,515,515,,,515,,,,,,515', +',,,,,,,,515,,,,,515,515,515,515,,515,515,515,515,,,,,515,515,,,,,,,515', +',515,515,515,,,515,515,133,133,133,133,133,,,,133,133,,,,133,,133,133', +'133,133,133,133,133,,,,,,133,133,133,133,133,133,133,,,133,,,,,,133', +'133,,133,133,133,133,133,133,133,133,133,,133,133,133,,133,133,133,133', +'133,,,,,,,,,,,,,,,,,,,,133,,,133,,,133,133,,,133,,133,,,,133,,,,,,,', +',133,,,,,133,133,133,133,,133,133,133,133,,,,,133,133,,,,231,231,231', +'133,231,133,133,133,231,231,133,133,,231,,231,231,231,231,231,231,231', +',,,,,231,231,231,231,231,231,231,,,231,,,,,,,231,,,231,231,231,231,231', +'231,231,231,,231,231,231,,231,231,231,231,231,,,,,,,,,,,,,,,,,,,,231', +',,231,,,231,231,,,231,,,,,,231,,,,,,,,,231,,,,,231,231,231,231,,231', +'231,231,231,,,,,231,231,231,,,242,242,242,231,242,231,231,231,242,242', +'231,231,,242,,242,242,242,242,242,242,242,,,,,,242,242,242,242,242,242', +'242,,,242,,,,,,,242,,,242,242,242,242,242,242,242,242,,242,242,242,', +'242,242,242,242,242,,,,,,,,,,,,,,,,,,,,242,,,242,,,242,242,,,242,,,', +',,242,,,,,,,,,242,,,,,242,242,242,242,,242,242,242,242,,,,,242,242,', +',,247,247,247,242,247,242,242,242,247,247,242,242,,247,,247,247,247', +'247,247,247,247,,,,,,247,247,247,247,247,247,247,,,247,,,,,,,247,,,247', +'247,247,247,247,247,247,247,,247,247,247,,247,247,247,247,247,,,,,,', +',,,,,,,,,,,,,247,,,247,,,247,247,,,247,,,,,,247,,,,,,,,,247,,,,,247', +'247,247,247,,247,247,247,247,,,,,247,247,,,,248,248,248,247,248,247', +'247,247,248,248,247,247,,248,,248,248,248,248,248,248,248,,,,,,248,248', +'248,248,248,248,248,,,248,,,,,,,248,,,248,248,248,248,248,248,248,248', +',248,248,248,,248,248,248,248,248,,,,,,,,,,,,,,,,,,,,248,,,248,,,248', +'248,,,248,,,,,,248,,,,,,,,,248,,,,,248,248,248,248,,248,248,248,248', +',,,,248,248,,,,249,249,249,248,249,248,248,248,249,249,248,248,,249', +',249,249,249,249,249,249,249,,,,,,249,249,249,249,249,249,249,,,249', +',,,,,,249,,,249,249,249,249,249,249,249,249,,249,249,249,,249,249,249', +'249,249,,,,,,,,,,,,,,,,,,,,249,,,249,,,249,249,,,249,,,,,,249,,,,,,', +',,249,,,,,249,249,249,249,,249,249,249,249,,,,,249,249,,,,250,250,250', +'249,250,249,249,249,250,250,249,249,,250,,250,250,250,250,250,250,250', +',,,,,250,250,250,250,250,250,250,,,250,,,,,,,250,,,250,250,250,250,250', +'250,250,250,,250,250,250,,250,250,250,250,250,,,,,,,,,,,,,,,,,,,,250', +',,250,,,250,250,,,250,,,,,,250,,,,,,,,,250,,,,,250,250,250,250,,250', +'250,250,250,,,,,250,250,,,,251,251,251,250,251,250,250,250,251,251,250', +'250,,251,,251,251,251,251,251,251,251,,,,,,251,251,251,251,251,251,251', +',,251,,,,,,,251,,,251,251,251,251,251,251,251,251,,251,251,251,,251', +'251,251,251,251,,,,,,,,,,,,,,,,,,,,251,,,251,,,251,251,,,251,,,,,,251', +',,,,,,,,251,,,,,251,251,251,251,,251,251,251,251,,,,,251,251,,,,252', +'252,252,251,252,251,251,251,252,252,251,251,,252,,252,252,252,252,252', +'252,252,,,,,,252,252,252,252,252,252,252,,,252,,,,,,,252,,,252,252,252', +'252,252,252,252,252,,252,252,252,,252,252,252,252,252,,,,,,,,,,,,,,', +',,,,,252,,,252,,,252,252,,,252,,,,,,252,,,,,,,,,252,,,,,252,252,252', +'252,,252,252,252,252,,,,,252,252,,,,253,253,253,252,253,252,252,252', +'253,253,252,252,,253,,253,253,253,253,253,253,253,,,,,,253,253,253,253', +'253,253,253,,,253,,,,,,,253,,,253,253,253,253,253,253,253,253,,253,253', +'253,,253,253,253,253,253,,,,,,,,,,,,,,,,,,,,253,,,253,,,253,253,,,253', +',,,,,253,,,,,,,,,253,,,,,253,253,253,253,,253,253,253,253,,,,,253,253', +',,,254,254,254,253,254,253,253,253,254,254,253,253,,254,,254,254,254', +'254,254,254,254,,,,,,254,254,254,254,254,254,254,,,254,,,,,,,254,,,254', +'254,254,254,254,254,254,254,,254,254,254,,254,254,254,254,254,,,,,,', +',,,,,,,,,,,,,254,,,254,,,254,254,,,254,,,,,,254,,,,,,,,,254,,,,,254', +'254,254,254,,254,254,254,254,,,,,254,254,,,,255,255,255,254,255,254', +'254,254,255,255,254,254,,255,,255,255,255,255,255,255,255,,,,,,255,255', +'255,255,255,255,255,,,255,,,,,,,255,,,255,255,255,255,255,255,255,255', +',255,255,255,,255,255,255,255,255,,,,,,,,,,,,,,,,,,,,255,,,255,,,255', +'255,,,255,,,,,,255,,,,,,,,,255,,,,,255,255,255,255,,255,255,255,255', +',,,,255,255,,,,256,256,256,255,256,255,255,255,256,256,255,255,,256', +',256,256,256,256,256,256,256,,,,,,256,256,256,256,256,256,256,,,256', +',,,,,,256,,,256,256,256,256,256,256,256,256,,256,256,256,,256,256,256', +'256,256,,,,,,,,,,,,,,,,,,,,256,,,256,,,256,256,,,256,,,,,,256,,,,,,', +',,256,,,,,256,256,256,256,,256,256,256,256,,,,,256,256,,,,257,257,257', +'256,257,256,256,256,257,257,256,256,,257,,257,257,257,257,257,257,257', +',,,,,257,257,257,257,257,257,257,,,257,,,,,,,257,,,257,257,257,257,257', +'257,257,257,,257,257,257,,257,257,257,257,257,,,,,,,,,,,,,,,,,,,,257', +',,257,,,257,257,,,257,,,,,,257,,,,,,,,,257,,,,,257,257,257,257,,257', +'257,257,257,,,,,257,257,,,,258,258,258,257,258,257,257,257,258,258,257', +'257,,258,,258,258,258,258,258,258,258,,,,,,258,258,258,258,258,258,258', +',,258,,,,,,,258,,,258,258,258,258,258,258,258,258,,258,258,258,,258', +'258,258,258,258,,,,,,,,,,,,,,,,,,,,258,,,258,,,258,258,,,258,,,,,,258', +',,,,,,,,258,,,,,258,258,258,258,,258,258,258,258,,,,,258,258,,,,259', +'259,259,258,259,258,258,258,259,259,258,258,,259,,259,259,259,259,259', +'259,259,,,,,,259,259,259,259,259,259,259,,,259,,,,,,,259,,,259,259,259', +'259,259,259,259,259,,259,259,259,,259,259,259,259,259,,,,,,,,,,,,,,', +',,,,,259,,,259,,,259,259,,,259,,,,,,259,,,,,,,,,259,,,,,259,259,259', +'259,,259,259,259,259,,,,,259,259,,,,260,260,260,259,260,259,259,259', +'260,260,259,259,,260,,260,260,260,260,260,260,260,,,,,,260,260,260,260', +'260,260,260,,,260,,,,,,,260,,,260,260,260,260,260,260,260,260,,260,260', +'260,,260,260,260,260,260,,,,,,,,,,,,,,,,,,,,260,,,260,,,260,260,,,260', +',,,,,260,,,,,,,,,260,,,,,260,260,260,260,,260,260,260,260,,,,,260,260', +',,,261,261,261,260,261,260,260,260,261,261,260,260,,261,,261,261,261', +'261,261,261,261,,,,,,261,261,261,261,261,261,261,,,261,,,,,,,261,,,261', +'261,261,261,261,261,261,261,,261,261,261,,261,261,261,261,261,,,,,,', +',,,,,,,,,,,,,261,,,261,,,261,261,,,261,,,,,,261,,,,,,,,,261,,,,,261', +'261,261,261,,261,261,261,261,,,,,261,261,,,,262,262,262,261,262,261', +'261,261,262,262,261,261,,262,,262,262,262,262,262,262,262,,,,,,262,262', +'262,262,262,262,262,,,262,,,,,,,262,,,262,262,262,262,262,262,262,262', +',262,262,262,,262,262,262,262,262,,,,,,,,,,,,,,,,,,,,262,,,262,,,262', +'262,,,262,,,,,,262,,,,,,,,,262,,,,,262,262,262,262,,262,262,262,262', +',,,,262,262,,,,263,263,263,262,263,262,262,262,263,263,262,262,,263', +',263,263,263,263,263,263,263,,,,,,263,263,263,263,263,263,263,,,263', +',,,,,,263,,,263,263,263,263,263,263,263,263,,263,263,263,,263,263,263', +'263,263,,,,,,,,,,,,,,,,,,,,263,,,263,,,263,263,,,263,,,,,,263,,,,,,', +',,263,,,,,263,263,263,263,,263,263,263,263,,,,,263,263,,,,264,264,264', +'263,264,263,263,263,264,264,263,263,,264,,264,264,264,264,264,264,264', +',,,,,264,264,264,264,264,264,264,,,264,,,,,,,264,,,264,264,264,264,264', +'264,264,264,,264,264,264,,264,264,264,264,264,,,,,,,,,,,,,,,,,,,,264', +',,264,,,264,264,,,264,,,,,,264,,,,,,,,,264,,,,,264,264,264,264,,264', +'264,264,264,,,,,264,264,,,,265,265,265,264,265,264,264,264,265,265,264', +'264,,265,,265,265,265,265,265,265,265,,,,,,265,265,265,265,265,265,265', +',,265,,,,,,,265,,,265,265,265,265,265,265,265,265,,265,265,265,,265', +'265,265,265,265,,,,,,,,,,,,,,,,,,,,265,,,265,,,265,265,,,265,,,,,,265', +',,,,,,,,265,,,,,265,265,265,265,,265,265,265,265,,,,,265,265,,,,266', +'266,266,265,266,265,265,265,266,266,265,265,,266,,266,266,266,266,266', +'266,266,,,,,,266,266,266,266,266,266,266,,,266,,,,,,,266,,,266,266,266', +'266,266,266,266,266,,266,266,266,,266,266,266,266,266,,,,,,,,,,,,,,', +',,,,,266,,,266,,,266,266,,,266,,,,,,266,,,,,,,,,266,,,,,266,266,266', +'266,,266,266,266,266,,,,,266,266,,,,267,267,267,266,267,266,266,266', +'267,267,266,266,,267,,267,267,267,267,267,267,267,,,,,,267,267,267,267', +'267,267,267,,,267,,,,,,,267,,,267,267,267,267,267,267,267,267,,267,267', +'267,,267,267,267,267,267,,,,,,,,,,,,,,,,,,,,267,,,267,,,267,267,,,267', +',,,,,267,,,,,,,,,267,,,,,267,267,267,267,,267,267,267,267,,,,,267,267', +',,,268,268,268,267,268,267,267,267,268,268,267,267,,268,,268,268,268', +'268,268,268,268,,,,,,268,268,268,268,268,268,268,,,268,,,,,,,268,,,268', +'268,268,268,268,268,268,268,,268,268,268,,268,268,268,268,268,,,,,,', +',,,,,,,,,,,,,268,,,268,,,268,268,,,268,,,,,,268,,,,,,,,,268,,,,,268', +'268,268,268,,268,268,268,268,,,,,268,268,,,,273,273,273,268,273,268', +'268,268,273,273,268,268,,273,,273,273,273,273,273,273,273,,,,,,273,273', +'273,273,273,273,273,,,273,,,,,,,273,,,273,273,273,273,273,273,273,273', +',273,273,273,,273,273,273,273,273,,,,,,,,,,,,,,,,,,,,273,,,273,,,273', +'273,,,273,,,,,,273,,,,,,,,,273,,,,,273,273,273,273,,273,273,273,273', +',,,,273,273,,,,974,974,974,273,974,273,273,273,974,974,273,273,,974', +',974,974,974,974,974,974,974,,,,,,974,974,974,974,974,974,974,,,974', +',,,,,,974,,,974,974,974,974,974,974,974,974,,974,974,974,,974,974,974', +'974,974,,,,,,,,,,,,,,,,,,,,974,,,974,,,974,974,,,974,,,,,,974,,,,,,', +',,974,,,,,974,974,974,974,,974,974,974,974,,,,,974,974,,,,973,973,973', +'974,973,974,974,974,973,973,974,974,,973,,973,973,973,973,973,973,973', +',,,,,973,973,973,973,973,973,973,,,973,,,,,,,973,,,973,973,973,973,973', +'973,973,973,973,973,973,973,,973,973,973,973,973,,,,,,,,,,,,,,,,,,,', +'973,,,973,,,973,973,,,973,,,,973,,973,,,973,,,,,,973,,,,,973,973,973', +'973,,973,973,973,973,,,,,973,973,,,,954,954,954,973,954,973,973,973', +'954,954,973,973,,954,,954,954,954,954,954,954,954,,,,,,954,954,954,954', +'954,954,954,,,954,,,,,,,954,,,954,954,954,954,954,954,954,954,,954,954', +'954,,954,954,954,954,954,,,,,,,,,,,,,,,,,,,,954,,,954,,,954,954,,,954', +',954,,,,954,,,,,,,,,954,,,,,954,954,954,954,,954,954,954,954,,,,,954', +'954,,,,949,949,949,954,949,954,954,954,949,949,954,954,,949,,949,949', +'949,949,949,949,949,,,,,,949,949,949,949,949,949,949,,,949,,,,,,,949', +',,949,949,949,949,949,949,949,949,,949,949,949,,949,949,949,949,949', +',,,,,,,,,,,,,,,,,,,949,,,949,,,949,949,,,949,,,,,,949,,,,,,,,,949,,', +',,949,949,949,949,,949,949,949,949,,,,,949,949,,,,945,945,945,949,945', +'949,949,949,945,945,949,949,,945,,945,945,945,945,945,945,945,,,,,,945', +'945,945,945,945,945,945,,,945,,,,,,,945,,,945,945,945,945,945,945,945', +'945,,945,945,945,,945,945,945,945,945,,,,,,,,,,,,,,,,,,,,945,,,945,', +',945,945,,,945,,,,,,945,,,,,,,,,945,,,,,945,945,945,945,,945,945,945', +'945,,,,,945,945,,,,289,289,289,945,289,945,945,945,289,289,945,945,', +'289,,289,289,289,289,289,289,289,,,,,,289,289,289,289,289,289,289,,', +'289,,,,,,,289,,,289,289,289,289,289,289,289,289,,289,289,289,,289,289', +'289,289,289,,,,,,,,,,,,,,,,,,,,289,,,289,,,289,289,,,289,,,,,,289,,', +',,,,,,289,,,,,289,289,289,289,,289,289,289,289,,,,,289,289,,,,917,917', +'917,289,917,289,289,289,917,917,289,289,,917,,917,917,917,917,917,917', +'917,,,,,,917,917,917,917,917,917,917,,,917,,,,,,,917,,,917,917,917,917', +'917,917,917,917,,917,917,917,,917,917,917,917,917,,,,,,,,,,,,,,,,,,', +',917,,,917,,,917,917,,,917,,,,,,917,,,,,,,,,917,,,,,917,917,917,917', +',917,917,917,917,,,,,917,917,,,,296,296,296,917,296,917,917,917,296', +'296,917,917,,296,,296,296,296,296,296,296,296,,,,,,296,296,296,296,296', +'296,296,,,296,,,,,,,296,,,296,296,296,296,296,296,296,296,296,296,296', +'296,,296,296,296,296,296,,,,,,,,,,,,,,,,,,,,296,,,296,,,296,296,,,296', +',296,,296,,296,,,296,,,,,,296,,,,,296,296,296,296,,296,296,296,296,', +',,,296,296,,,,297,297,297,296,297,296,296,296,297,297,296,296,,297,', +'297,297,297,297,297,297,297,,,,,,297,297,297,297,297,297,297,,,297,', +',,,,,297,,,297,297,297,297,297,297,297,297,297,297,297,297,,297,297', +'297,297,297,,,,,,,,,,,,,,,,,,,,297,,,297,,,297,297,,,297,,297,,297,', +'297,,,297,,,,,,297,,,,,297,297,297,297,,297,297,297,297,,,,,297,297', +',,,305,305,305,297,305,297,297,297,305,305,297,297,,305,,305,305,305', +'305,305,305,305,,,,,,305,305,305,305,305,305,305,,,305,,,,,,,305,,,305', +'305,305,305,305,305,305,305,305,305,305,305,,305,305,305,305,305,,,', +',,,,,,,,,,,,,,,,305,,,305,,,305,305,,,305,,305,,305,,305,,,305,,,,,', +'305,,,,,305,305,305,305,,305,305,305,305,,,,,305,305,305,,,897,897,897', +'305,897,305,305,305,897,897,305,305,,897,,897,897,897,897,897,897,897', +',,,,,897,897,897,897,897,897,897,,,897,,,,,,,897,,,897,897,897,897,897', +'897,897,897,,897,897,897,,897,897,897,897,897,,,,,,,,,,,,,,,,,,,,897', +',,897,,,897,897,,,897,,,,,,897,,,,,,,,,897,,,,,897,897,897,897,,897', +'897,897,897,,,,,897,897,,,,312,312,312,897,312,897,897,897,312,312,897', +'897,,312,,312,312,312,312,312,312,312,,,,,,312,312,312,312,312,312,312', +',,312,,,,,,,312,,,312,312,312,312,312,312,312,312,,312,312,312,,312', +'312,312,312,312,,,,,,,,,,,,,,,,,,,,312,,,312,,,312,312,,,312,,,,,,312', +',,,,,,,,312,,,,,312,312,312,312,,312,312,312,312,,,,,312,312,,,,314', +'314,314,312,314,312,312,312,314,314,312,312,,314,,314,314,314,314,314', +'314,314,,,,,,314,314,314,314,314,314,314,,,314,,,,,,,314,,,314,314,314', +'314,314,314,314,314,,314,314,314,,314,314,314,314,314,,,,,,,,,,,,,,', +',,,,,314,,,314,,,314,314,,,314,,,,,,314,,,,,,,,,314,,,,,314,314,314', +'314,,314,314,314,314,,,,,314,314,,,,317,317,317,314,317,314,314,314', +'317,317,314,314,,317,,317,317,317,317,317,317,317,,,,,,317,317,317,317', +'317,317,317,,,317,,,,,,,317,,,317,317,317,317,317,317,317,317,,317,317', +'317,,317,317,317,317,317,,,,,,,,,,,,,,,,,,,,317,,,317,,,317,317,,,317', +',,,,,317,,,,,,,,,317,,,,,317,317,317,317,,317,317,317,317,,,,,317,317', +',,,318,318,318,317,318,317,317,317,318,318,317,317,,318,,318,318,318', +'318,318,318,318,,,,,,318,318,318,318,318,318,318,,,318,,,,,,,318,,,318', +'318,318,318,318,318,318,318,,318,318,318,,318,318,318,318,318,,,,,,', +',,,,,,,,,,,,,318,,,318,,,318,318,,,318,,,,,,318,,,,,,,,,318,,,,,318', +'318,318,318,,318,318,318,318,,,,,318,318,,,,,,,318,,318,318,318,,,318', +'318,323,323,323,323,323,,,,323,323,,,,323,,323,323,323,323,323,323,323', +',,,,,323,323,323,323,323,323,323,,,323,,,,,,323,323,,323,323,323,323', +'323,323,323,323,323,,323,323,323,,323,323,323,323,323,,,,,,,,,,,,,,', +',,,,,323,,,323,,,323,323,,,323,,323,,,,323,,,,,,,,,323,,,,,323,323,323', +'323,,323,323,323,323,,,,,323,323,,,,868,868,868,323,868,323,323,323', +'868,868,323,323,,868,,868,868,868,868,868,868,868,,,,,,868,868,868,868', +'868,868,868,,,868,,,,,,,868,,,868,868,868,868,868,868,868,868,,868,868', +'868,,868,868,868,868,868,,,,,,,,,,,,,,,,,,,,868,,,868,,,868,868,,,868', +',,,,,868,,,,,,,,,868,,,,,868,868,868,868,,868,868,868,868,,,,,868,868', +',,,867,867,867,868,867,868,868,868,867,867,868,868,,867,,867,867,867', +'867,867,867,867,,,,,,867,867,867,867,867,867,867,,,867,,,,,,,867,,,867', +'867,867,867,867,867,867,867,,867,867,867,,867,867,867,867,867,,,,,,', +',,,,,,,,,,,,,867,,,867,,,867,867,,,867,,,,,,867,,,,,,,,,867,,,,,867', +'867,867,867,,867,867,867,867,,,,,867,867,,,,866,866,866,867,866,867', +'867,867,866,866,867,867,,866,,866,866,866,866,866,866,866,,,,,,866,866', +'866,866,866,866,866,,,866,,,,,,,866,,,866,866,866,866,866,866,866,866', +',866,866,866,,866,866,866,866,866,,,,,,,,,,,,,,,,,,,,866,,,866,,,866', +'866,,,866,,,,,,866,,,,,,,,,866,,,,,866,866,866,866,,866,866,866,866', +',,,,866,866,,,,865,865,865,866,865,866,866,866,865,865,866,866,,865', +',865,865,865,865,865,865,865,,,,,,865,865,865,865,865,865,865,,,865', +',,,,,,865,,,865,865,865,865,865,865,865,865,,865,865,865,,865,865,865', +'865,865,,,,,,,,,,,,,,,,,,,,865,,,865,,,865,865,,,865,,,,,,865,,,,,,', +',,865,,,,,865,865,865,865,,865,865,865,865,,,,,865,865,,,,852,852,852', +'865,852,865,865,865,852,852,865,865,,852,,852,852,852,852,852,852,852', +',,,,,852,852,852,852,852,852,852,,,852,,,,,,,852,,,852,852,852,852,852', +'852,852,852,,852,852,852,,852,852,852,852,852,,,,,,,,,,,,,,,,,,,,852', +',,852,,,852,852,,,852,,,,,,852,,,,,,,,,852,,,,,852,852,852,852,,852', +'852,852,852,,,,,852,852,,,,844,844,844,852,844,852,852,852,844,844,852', +'852,,844,,844,844,844,844,844,844,844,,,,,,844,844,844,844,844,844,844', +',,844,,,,,,,844,,,844,844,844,844,844,844,844,844,,844,844,844,,844', +'844,844,844,844,,,,,,,,,,,,,,,,,,,,844,,,844,,,844,844,,,844,,,,,,844', +',,,,,,,,844,,,,,844,844,844,844,,844,844,844,844,,,,,844,844,,,,824', +'824,824,844,824,844,844,844,824,824,844,844,,824,,824,824,824,824,824', +'824,824,,,,,,824,824,824,824,824,824,824,,,824,,,,,,,824,,,824,824,824', +'824,824,824,824,824,,824,824,824,,824,824,824,824,824,,,,,,,,,,,,,,', +',,,,,824,,,824,,,824,824,,,824,,,,,,824,,,,,,,,,824,,,,,824,824,824', +'824,,824,824,824,824,,,,,824,824,,,,359,359,359,824,359,824,824,824', +'359,359,824,824,,359,,359,359,359,359,359,359,359,,,,,,359,359,359,359', +'359,359,359,,,359,,,,,,,359,,,359,359,359,359,359,359,359,359,,359,359', +'359,,359,359,359,359,359,,,,,,,,,,,,,,,,,,,,359,,,359,,,359,359,,,359', +',,,,,359,,,,,,,,,359,,,,,359,359,359,359,,359,359,359,359,,,,,359,359', +',,,361,361,361,359,361,359,359,359,361,361,359,359,,361,,361,361,361', +'361,361,361,361,,,,,,361,361,361,361,361,361,361,,,361,,,,,,,361,,,361', +'361,361,361,361,361,361,361,,361,361,361,,361,361,361,361,361,,,,,,', +',,,,,,,,,,,,,361,,,361,361,,361,361,,,361,,,,,,361,,,,,,,,,361,,,,,361', +'361,361,361,,361,361,361,361,,,,,361,361,,,,779,779,779,361,779,361', +'361,361,779,779,361,361,,779,,779,779,779,779,779,779,779,,,,,,779,779', +'779,779,779,779,779,,,779,,,,,,,779,,,779,779,779,779,779,779,779,779', +',779,779,779,,779,779,779,779,779,,,,,,,,,,,,,,,,,,,,779,,,779,,,779', +'779,,,779,,,,,,779,,,,,,,,,779,,,,,779,779,779,779,,779,779,779,779', +',,,,779,779,,,,765,765,765,779,765,779,779,779,765,765,779,779,,765', +',765,765,765,765,765,765,765,,,,,,765,765,765,765,765,765,765,,,765', +',,,,,,765,,,765,765,765,765,765,765,765,765,,765,765,765,,765,765,765', +'765,765,,,,,,,,,,,,,,,,,,,,765,,,765,,,765,765,,,765,,765,,,,765,,,', +',,,,,765,,,,,765,765,765,765,,765,765,765,765,,,,,765,765,,,,745,745', +'745,765,745,765,765,765,745,745,765,765,,745,,745,745,745,745,745,745', +'745,,,,,,745,745,745,745,745,745,745,,,745,,,,,,,745,,,745,745,745,745', +'745,745,745,745,,745,745,745,,745,745,745,745,745,,,,,,,,,,,,,,,,,,', +',745,,,745,,,745,745,,,745,,,,,,745,,,,,,,,,745,,,,,745,745,745,745', +',745,745,745,745,,,,,745,745,,,,742,742,742,745,742,745,745,745,742', +'742,745,745,,742,,742,742,742,742,742,742,742,,,,,,742,742,742,742,742', +'742,742,,,742,,,,,,,742,,,742,742,742,742,742,742,742,742,,742,742,742', +',742,742,742,742,742,,,,,,,,,,,,,,,,,,,,742,,,742,,,742,742,,,742,,', +',,,742,,,,,,,,,742,,,,,742,742,742,742,,742,742,742,742,,,,,742,742', +',,,384,384,384,742,384,742,742,742,384,384,742,742,,384,,384,384,384', +'384,384,384,384,,,,,,384,384,384,384,384,384,384,,,384,,,,,,,384,,,384', +'384,384,384,384,384,384,384,,384,384,384,,384,384,384,384,384,,,,,,', +',,,,,,,,,,,,,384,,,384,,,384,384,,,384,,,,,,384,,,,,,,,,384,,,,,384', +'384,384,384,,384,384,384,384,,,,,384,384,,,,733,733,733,384,733,384', +'384,384,733,733,384,384,,733,,733,733,733,733,733,733,733,,,,,,733,733', +'733,733,733,733,733,,,733,,,,,,,733,,,733,733,733,733,733,733,733,733', +'733,733,733,733,,733,733,733,733,733,,,,,,,,,,,,,,,,,,,,733,,,733,,', +'733,733,,,733,,733,,733,,733,,,733,,,,,,733,,,,,733,733,733,733,,733', +'733,733,733,,,,,733,733,,,,685,685,685,733,685,733,733,733,685,685,733', +'733,,685,,685,685,685,685,685,685,685,,,,,,685,685,685,685,685,685,685', +',,685,,,,,,,685,,,685,685,685,685,685,685,685,685,,685,685,685,,685', +'685,685,685,685,,,,,,,,,,,,,,,,,,,,685,,,685,,,685,685,,,685,,,,,,685', +',,,,,,,,685,,,,,685,685,685,685,,685,685,685,685,,,,,685,685,,,,405', +'405,405,685,405,685,685,685,405,405,685,685,,405,,405,405,405,405,405', +'405,405,,,,,,405,405,405,405,405,405,405,,,405,,,,,,,405,,,405,405,405', +'405,405,405,405,405,,405,405,405,,405,405,405,405,405,,,,,,,,,,,,,,', +',,,,,405,,,405,,,405,405,,,405,,,,,,405,,,,,,,,,405,,,,,405,405,405', +'405,,405,405,405,405,,,,,405,405,,,,684,684,684,405,684,405,405,405', +'684,684,405,405,,684,,684,684,684,684,684,684,684,,,,,,684,684,684,684', +'684,684,684,,,684,,,,,,,684,,,684,684,684,684,684,684,684,684,,684,684', +'684,,684,684,684,684,684,,,,,,,,,,,,,,,,,,,,684,,,684,,,684,684,,,684', +',,,,,684,,,,,,,,,684,,,,,684,684,684,684,,684,684,684,684,,,,,684,684', +',,,680,680,680,684,680,684,684,684,680,680,684,684,,680,,680,680,680', +'680,680,680,680,,,,,,680,680,680,680,680,680,680,,,680,,,,,,,680,,,680', +'680,680,680,680,680,680,680,,680,680,680,,680,680,680,680,680,,,,,,', +',,,,,,,,,,,,,680,,,680,,,680,680,,,680,,,,,,680,,,,,,,,,680,,,,,680', +'680,680,680,,680,680,680,680,,,,,680,680,,,,679,679,679,680,679,680', +'680,680,679,679,680,680,,679,,679,679,679,679,679,679,679,,,,,,679,679', +'679,679,679,679,679,,,679,,,,,,,679,,,679,679,679,679,679,679,679,679', +',679,679,679,,679,679,679,679,679,,,,,,,,,,,,,,,,,,,,679,,,679,,,679', +'679,,,679,,,,,,679,,,,,,,,,679,,,,,679,679,679,679,,679,679,679,679', +',,,,679,679,,,,678,678,678,679,678,679,679,679,678,678,679,679,,678', +',678,678,678,678,678,678,678,,,,,,678,678,678,678,678,678,678,,,678', +',,,,,,678,,,678,678,678,678,678,678,678,678,678,678,678,678,,678,678', +'678,678,678,,,,,,,,,,,,,,,,,,,,678,,,678,,,678,678,,,678,,,,678,,678', +',,678,,,,,,678,,,,,678,678,678,678,,678,678,678,678,,,,,678,678,,,,677', +'677,677,678,677,678,678,678,677,677,678,678,,677,,677,677,677,677,677', +'677,677,,,,,,677,677,677,677,677,677,677,,,677,,,,,,,677,,,677,677,677', +'677,677,677,677,677,677,677,677,677,,677,677,677,677,677,,,,,,,,,,,', +',,,,,,,,677,,,677,,,677,677,,,677,,677,,677,,677,,,677,,,,,,677,,,,', +'677,677,677,677,,677,677,677,677,,,,,677,677,,,,674,674,674,677,674', +'677,677,677,674,674,677,677,,674,,674,674,674,674,674,674,674,,,,,,674', +'674,674,674,674,674,674,,,674,,,,,,,674,,,674,674,674,674,674,674,674', +'674,,674,674,674,,674,674,674,674,674,,,,,,,,,,,,,,,,,,,,674,,,674,', +',674,674,,,674,,,,,,674,,,,,,,,,674,,,,,674,674,674,674,,674,674,674', +'674,,,,,674,674,,,,,,,674,,674,674,674,,,674,674,673,673,673,673,673', +',,,673,673,,,,673,,673,673,673,673,673,673,673,,,,,,673,673,673,673', +'673,673,673,,,673,,,,,,673,673,,673,673,673,673,673,673,673,673,673', +',673,673,673,,673,673,673,673,673,,,,,,,,,,,,,,,,,,,,673,,,673,,,673', +'673,,,673,,673,,,,673,,,,,,,,,673,,,,,673,673,673,673,,673,673,673,673', +',,,,673,673,,,,670,670,670,673,670,673,673,673,670,670,673,673,,670', +',670,670,670,670,670,670,670,,,,,,670,670,670,670,670,670,670,,,670', +',,,,,,670,,,670,670,670,670,670,670,670,670,670,670,670,670,,670,670', +'670,670,670,,,,,,,,,,,,,,,,,,,,670,,,670,,,670,670,,,670,,670,,670,', +'670,,,670,,,,,,670,,,,,670,670,670,670,,670,670,670,670,,,,,670,670', +',,,669,669,669,670,669,670,670,670,669,669,670,670,,669,,669,669,669', +'669,669,669,669,,,,,,669,669,669,669,669,669,669,,,669,,,,,,,669,,,669', +'669,669,669,669,669,669,669,,669,669,669,,669,669,669,669,669,,,,,,', +',,,,,,,,,,,,,669,,,669,,,669,669,,,669,,,,,,669,,,,,,,,,669,,,,,669', +'669,669,669,,669,669,669,669,,,,,669,669,,,,668,668,668,669,668,669', +'669,669,668,668,669,669,,668,,668,668,668,668,668,668,668,,,,,,668,668', +'668,668,668,668,668,,,668,,,,,,,668,,,668,668,668,668,668,668,668,668', +',668,668,668,,668,668,668,668,668,,,,,,,,,,,,,,,,,,,,668,,,668,,,668', +'668,,,668,,668,,,,668,,,,,,,,,668,,,,,668,668,668,668,,668,668,668,668', +',,,,668,668,,,,,,,668,,668,668,668,,,668,668,666,666,666,666,666,,,', +'666,666,,,,666,,666,666,666,666,666,666,666,,,,,,666,666,666,666,666', +'666,666,,,666,,,,,,666,666,,666,666,666,666,666,666,666,666,666,,666', +'666,666,,666,666,666,666,666,,,,,,,,,,,,,,,,,,,,666,,,666,,,666,666', +',,666,,666,,,,666,,,,,,,,,666,,,,,666,666,666,666,,666,666,666,666,', +',,,666,666,,,,434,434,434,666,434,666,666,666,434,434,666,666,,434,', +'434,434,434,434,434,434,434,,,,,,434,434,434,434,434,434,434,,,434,', +',,,,,434,,,434,434,434,434,434,434,434,434,,434,434,434,,434,434,434', +'434,434,,,,,,,,,,,,,,,,,,,,434,,,434,,,434,434,,,434,,,,,,434,,,,,,', +',,434,,,,,434,434,434,434,,434,434,434,434,,,,,434,434,,,,635,635,635', +'434,635,434,434,434,635,635,434,434,,635,,635,635,635,635,635,635,635', +',,,,,635,635,635,635,635,635,635,,,635,,,,,,,635,,,635,635,635,635,635', +'635,635,635,635,635,635,635,,635,635,635,635,635,,,,,,,,,,,,,,,,,,,', +'635,,,635,,,635,635,,,635,,635,,635,,635,,,635,,,,,,635,,,,,635,635', +'635,635,,635,635,635,635,,,,,635,635,,,,625,625,625,635,625,635,635', +'635,625,625,635,635,,625,,625,625,625,625,625,625,625,,,,,,625,625,625', +'625,625,625,625,,,625,,,,,,,625,,,625,625,625,625,625,625,625,625,625', +'625,625,625,,625,625,625,625,625,,,,,,,,,,,,,,,,,,,,625,,,625,,,625', +'625,,,625,,625,,625,,625,,,625,,,,,,625,,,,,625,625,625,625,,625,625', +'625,625,,,,,625,625,,,,624,624,624,625,624,625,625,625,624,624,625,625', +',624,,624,624,624,624,624,624,624,,,,,,624,624,624,624,624,624,624,', +',624,,,,,,,624,,,624,624,624,624,624,624,624,624,,624,624,624,,624,624', +'624,624,624,,,,,,,,,,,,,,,,,,,,624,,,624,,,624,624,,,624,,624,,,,624', +',,,,,,,,624,,,,,624,624,624,624,,624,624,624,624,,,,,624,624,,,,611', +'611,611,624,611,624,624,624,611,611,624,624,,611,,611,611,611,611,611', +'611,611,,,,,,611,611,611,611,611,611,611,,,611,,,,,,,611,,,611,611,611', +'611,611,611,611,611,611,611,611,611,,611,611,611,611,611,,,,,,,,,,,', +',,,,,,,,611,,,611,,,611,611,,,611,,,,,,611,,,611,,,,,,611,,,,,611,611', +'611,611,,611,611,611,611,,,,,611,611,,,,608,608,608,611,608,611,611', +'611,608,608,611,611,,608,,608,608,608,608,608,608,608,,,,,,608,608,608', +'608,608,608,608,,,608,,,,,,,608,,,608,608,608,608,608,608,608,608,608', +'608,608,608,,608,608,608,608,608,,,,,,,,,,,,,,,,,,,,608,,,608,,,608', +'608,,,608,,608,,,,608,,,608,,,,,,608,,,,,608,608,608,608,,608,608,608', +'608,,,,,608,608,,,,,,,608,,608,608,608,458,,608,608,,,,458,458,458,', +',458,458,458,,458,,,,,,,,458,458,458,458,,,,,,,,,458,458,,458,458,458', +'458,458,,,,,,,,,,,,,,,,,,,,,,,458,458,458,458,458,458,458,458,458,458', +'458,458,458,458,,,458,458,458,,,458,,458,458,,,458,458,,458,,458,,458', +',458,458,,458,458,458,458,458,,458,458,458,,,,,,,,,,,,,,458,,,458,458', +',458,,458,602,602,602,,602,,458,,602,602,,,,602,,602,602,602,602,602', +'602,602,,,,,,602,602,602,602,602,602,602,,,602,,,,,,,602,,,602,602,602', +'602,602,602,602,602,,602,602,602,,602,602,602,602,602,,,,,,,,,,,,,,', +',,,,,602,,,602,,,602,602,,,602,,,,,,602,,,,,,,,,602,,,,,602,602,602', +'602,,602,602,602,602,,,,,602,602,,,,,,,602,,602,602,602,467,,602,602', +',,,467,467,467,,,467,467,467,,467,,,,,,,,467,467,467,467,467,,,,,,,', +'467,467,,467,467,467,467,467,,,,,,,,,,,,,,,,,,,,,,,467,467,467,467,467', +'467,467,467,467,467,467,467,467,467,,,467,467,467,,,467,,,467,,,467', +'467,,467,,467,,467,,467,467,,467,467,467,467,467,,467,467,467,,,,,,', +',,,,,,,467,,,467,467,467,467,,467,468,467,,,,,467,468,468,468,,,468', +'468,468,,468,,,,,,,,468,468,468,468,468,,,,,,,,468,468,,468,468,468', +'468,468,,,,,,,,,,,,,,,,,,,,,,,468,468,468,468,468,468,468,468,468,468', +'468,468,468,468,,,468,468,468,,,468,,,468,,,468,468,,468,,468,,468,', +'468,468,,468,468,468,468,468,,468,468,468,,,,,,,,,,,,,,468,,,468,468', +'468,468,,468,,468,,588,588,588,468,588,,,,588,588,,,,588,,588,588,588', +'588,588,588,588,,,,,,588,588,588,588,588,588,588,,,588,,,,,,,588,,,588', +'588,588,588,588,588,588,588,,588,588,588,,588,588,588,588,588,,,,,,', +',,,,,,,,,,,,,588,,,588,,,588,588,,,588,,,,,,588,,,,,,,,,588,,,,,588', +'588,588,588,,588,588,588,588,,,,,588,588,,,,562,562,562,588,562,588', +'588,588,562,562,588,588,,562,,562,562,562,562,562,562,562,,,,,,562,562', +'562,562,562,562,562,,,562,,,,,,,562,,,562,562,562,562,562,562,562,562', +',562,562,562,,562,562,562,562,562,,,,,,,,,,,,,,,,,,,,562,,,562,,,562', +'562,,,562,,,,,,562,,,,,,,,,562,,,,,562,562,562,562,,562,562,562,562', +',,,,562,562,,,,561,561,561,562,561,562,562,562,561,561,562,562,,561', +',561,561,561,561,561,561,561,,,,,,561,561,561,561,561,561,561,,,561', +',,,,,,561,,,561,561,561,561,561,561,561,561,,561,561,561,,561,561,561', +'561,561,,,,,,,,,,,,,,,,,,,,561,,,561,,,561,561,,,561,,,,,,561,,,,,,', +',,561,,,,,561,561,561,561,,561,561,561,561,,,,,561,561,,,,477,477,477', +'561,477,561,561,561,477,477,561,561,,477,,477,477,477,477,477,477,477', +',,,,,477,477,477,477,477,477,477,,,477,,,,,,,477,,,477,477,477,477,477', +'477,477,477,477,477,477,477,,477,477,477,477,477,,,,,,,,,,,,,,,,,,,', +'477,,,477,,,477,477,,,477,,477,,477,,477,,,477,,,,,,477,,,,,477,477', +'477,477,,477,477,477,477,,,,,477,477,,,,558,558,558,477,558,477,477', +'477,558,558,477,477,,558,,558,558,558,558,558,558,558,,,,,,558,558,558', +'558,558,558,558,,,558,,,,,,,558,,,558,558,558,558,558,558,558,558,,558', +'558,558,,558,558,558,558,558,,,,,,,,,,,,,,,,,,,,558,,,558,,,558,558', +',,558,,,,,,558,,,,,,,,,558,,,,,558,558,558,558,,558,558,558,558,,,,', +'558,558,,,,479,479,479,558,479,558,558,558,479,479,558,558,,479,,479', +'479,479,479,479,479,479,,,,,,479,479,479,479,479,479,479,,,479,,,,,', +',479,,,479,479,479,479,479,479,479,479,,479,479,479,,479,479,479,479', +'479,,,,,,,,,,,,,,,,,,,,479,,,479,,,479,479,,,479,,,,,,479,,,,,,,,,479', +',,,,479,479,479,479,,479,479,479,479,,,,,479,479,,,,480,480,480,479', +'480,479,479,479,480,480,479,479,,480,,480,480,480,480,480,480,480,,', +',,,480,480,480,480,480,480,480,,,480,,,,,,,480,,,480,480,480,480,480', +'480,480,480,,480,480,480,,480,480,480,480,480,,,,,,,,,,,,,,,,,,,,480', +',,480,,,480,480,,,480,,,,,,480,,,,,,,,,480,,,,,480,480,480,480,,480', +'480,480,480,,,,,480,480,,,,481,481,481,480,481,480,480,480,481,481,480', +'480,,481,,481,481,481,481,481,481,481,,,,,,481,481,481,481,481,481,481', +',,481,,,,,,,481,,,481,481,481,481,481,481,481,481,,481,481,481,,481', +'481,481,481,481,,,,,,,,,,,,,,,,,,,,481,,,481,,,481,481,,,481,,,,,,481', +',,,,,,,,481,,,,,481,481,481,481,,481,481,481,481,,,,,481,481,,,,555', +'555,555,481,555,481,481,481,555,555,481,481,,555,,555,555,555,555,555', +'555,555,,,,,,555,555,555,555,555,555,555,,,555,,,,,,,555,,,555,555,555', +'555,555,555,555,555,,555,555,555,,555,555,555,555,555,,,,,,,,,,,,,,', +',,,,,555,,,555,,,555,555,,,555,,,,,,555,,,,,,,,,555,,,,,555,555,555', +'555,,555,555,555,555,,,,,555,555,,,,545,545,545,555,545,555,555,555', +'545,545,555,555,,545,,545,545,545,545,545,545,545,,,,,,545,545,545,545', +'545,545,545,,,545,,,,,,,545,,,545,545,545,545,545,545,545,545,545,545', +'545,545,,545,545,545,545,545,,,,,,,,,,,,,,,,,,,,545,,,545,,,545,545', +',,545,,545,,545,,545,,,545,,,,,,545,,,,,545,545,545,545,,545,545,545', +'545,,,,,545,545,,,,,,,545,,545,545,545,,,545,545,535,535,535,535,535', +',,,535,535,,,,535,,535,535,535,535,535,535,535,,,,,,535,535,535,535', +'535,535,535,,,535,,,,,,535,535,535,535,535,535,535,535,535,535,535,535', +',535,535,535,,535,535,535,535,535,,,,,,,,,,,,,,,,,,,,535,,,535,,,535', +'535,,,535,,535,,,,535,,,,,,,,,535,,,,,535,535,535,535,,535,535,535,535', +',,,,535,535,,,,,,535,535,,535,535,535,,,535,535,529,529,529,,529,,,', +'529,529,,,,529,,529,529,529,529,529,529,529,,,,,,529,529,529,529,529', +'529,529,,,529,,,,,,,529,,,529,529,529,529,529,529,529,529,,529,529,529', +',529,529,529,529,529,,,,,,,,,,,,,,,,,,,,529,,,529,,,529,529,,,529,,', +',,,529,,,,,,,,,529,,,,,529,529,529,529,,529,529,529,529,,,,,529,529', +',,,527,527,527,529,527,529,529,529,527,527,529,529,,527,,527,527,527', +'527,527,527,527,,,,,,527,527,527,527,527,527,527,,,527,,,,,,,527,,,527', +'527,527,527,527,527,527,527,527,527,527,527,,527,527,527,527,527,,,', +',,,,,,,,,,,,,,,,527,,,527,,,527,527,,,527,,,,527,,527,,,527,,,,,,527', +',,,,527,527,527,527,,527,527,527,527,,,,,527,527,,,,525,525,525,527', +'525,527,527,527,525,525,527,527,,525,,525,525,525,525,525,525,525,,', +',,,525,525,525,525,525,525,525,,,525,,,,,,,525,,,525,525,525,525,525', +'525,525,525,525,525,525,525,,525,525,525,525,525,,,,,,,,,,,,,,,,,,,', +'525,,,525,,,525,525,,,525,,525,,525,,525,,,525,,,,,,525,,,,,525,525', +'525,525,,525,525,525,525,,,,,525,525,,,,219,219,219,525,219,525,525', +'525,219,219,525,525,,219,,219,219,219,219,219,219,219,,,,,,219,219,219', +'219,219,219,219,,,219,,,,,,,219,,,219,219,219,219,219,219,219,219,,219', +'219,219,,219,219,219,219,219,,,,,,,,,,,,,,,,,,,,219,,,219,,,219,219', +',,219,,219,,,,219,,,,,,,,,219,,,,,219,219,219,219,,219,219,219,219,', +',,,219,219,,,,220,220,220,219,220,219,219,219,220,220,219,219,,220,', +'220,220,220,220,220,220,220,,,,,,220,220,220,220,220,220,220,,,220,', +',,,,,220,,,220,220,220,220,220,220,220,220,,220,220,220,,220,220,220', +'220,220,,,,,,,,,,,,,,,,,,,,220,,,220,,,220,220,,,220,,220,,,,220,,,', +',,,,,220,,,,,220,220,220,220,,220,220,220,220,,,,,220,220,,,,221,221', +'221,220,221,220,220,220,221,221,220,220,,221,,221,221,221,221,221,221', +'221,,,,,,221,221,221,221,221,221,221,,,221,,,,,,,221,,,221,221,221,221', +'221,221,221,221,,221,221,221,,221,221,221,221,221,,,,,,,,,,,,,,,,,,', +',221,,,221,,,221,221,,,221,,,,,,221,,,,,,,,,221,,,,,221,221,221,221', +',221,221,221,221,,,,,221,221,,,,222,222,222,221,222,221,221,221,222', +'222,221,221,,222,,222,222,222,222,222,222,222,,,,,,222,222,222,222,222', +'222,222,,,222,,,,,,,222,,,222,222,222,222,222,222,222,222,,222,222,222', +',222,222,222,222,222,,,,,,,,,,,,,,,,,,,,222,,,222,,,222,222,,,222,,', +',,,222,,,,,,,,,222,,,,,222,222,222,222,,222,222,222,222,,,,,222,222', +',,,223,223,223,222,223,222,222,222,223,223,222,222,,223,,223,223,223', +'223,223,223,223,,,,,,223,223,223,223,223,223,223,,,223,,,,,,,223,,,223', +'223,223,223,223,223,223,223,,223,223,223,,223,223,223,223,223,,,,,,', +',,,,,,,,,,,,,223,,,223,,,223,223,,,223,,,,,,223,,,,,,,,,223,,,,,223', +'223,223,223,,223,223,223,223,,,,,223,223,,,,224,224,224,223,224,223', +'223,223,224,224,223,223,,224,,224,224,224,224,224,224,224,,,,,,224,224', +'224,224,224,224,224,,,224,,,,,,,224,,,224,224,224,224,224,224,224,224', +'224,224,224,224,,224,224,224,224,224,,,,,,,,,,,,,,,,,,,,224,,,224,,', +'224,224,,,224,,224,,224,,224,,,224,,,,,,224,,,,,224,224,224,224,,224', +'224,224,224,,,,,224,224,,,,229,229,229,224,229,224,224,224,229,229,224', +'224,,229,,229,229,229,229,229,229,229,,,,,,229,229,229,229,229,229,229', +',,229,,,,,,,229,,,229,229,229,229,229,229,229,229,,229,229,229,,229', +'229,229,229,229,,,,,,,,,,,,,,,,,,,,229,,,229,,,229,229,,,229,,,,,,229', +',,,,,,,,229,,,,,229,229,229,229,,229,229,229,229,,,,,229,229,,,,230', +'230,230,229,230,229,229,229,230,230,229,229,,230,,230,230,230,230,230', +'230,230,,,,,,230,230,230,230,230,230,230,,,230,,,,,,,230,,,230,230,230', +'230,230,230,230,230,,230,230,230,,230,230,230,230,230,,,,,,,,,,,,,,', +',,,,,230,,,230,,,230,230,,,230,,,,,,230,,,,,,,,,230,,,,,230,230,230', +'230,,230,230,230,230,,,,,230,230,,,,1023,1023,1023,230,1023,230,230', +'230,1023,1023,230,230,,1023,,1023,1023,1023,1023,1023,1023,1023,,,,', +',1023,1023,1023,1023,1023,1023,1023,,,1023,,,,,,,1023,,,1023,1023,1023', +'1023,1023,1023,1023,1023,,1023,1023,1023,,1023,1023,,,1023,,,,,,,,,', +',,,,,,,,,,1023,,,1023,,,1023,1023,,,1023,,,,,,,,,,,,,,,,,,,,1023,1023', +'1023,1023,,1023,1023,1023,1023,,,,,1023,1023,,,,76,76,76,1023,76,1023', +'1023,1023,76,76,,,,76,,76,76,76,76,76,76,76,,,,,,76,76,76,76,76,76,76', +',,76,,,,,,,76,,,76,76,76,76,76,76,76,76,,76,76,76,,76,76,,,76,,,,,,', +',,,,,,,,,,,,,76,,,76,,,76,76,,,76,,76,,,,,,,,,,,,,,,,,,76,76,76,76,', +'76,76,76,76,,,,,76,76,,,,748,748,748,76,748,76,76,76,748,748,,,,748', +',748,748,748,748,748,748,748,,,,,,748,748,748,748,748,748,748,,,748', +',,,,,,748,,,748,748,748,748,748,748,748,748,,748,748,748,,748,748,,', +'748,,,,,,,,,,,,,,,,,,,,748,,,748,,,748,748,,,748,,,,,,,,,,,,,,,,,,,', +'748,748,748,748,,748,748,748,748,,,,,748,748,,,,759,759,759,748,759', +'748,748,748,759,759,,,,759,,759,759,759,759,759,759,759,,,,,,759,759', +'759,759,759,759,759,,,759,,,,,,,759,,,759,759,759,759,759,759,759,759', +',759,759,759,,759,759,,,759,,,,,,,,,,,,,,,,,,,,759,,,759,,,759,759,', +',759,,,,,,,,,,,,,,,,,,,,759,759,759,759,,759,759,759,759,,,,,759,759', +',,,350,350,350,759,350,759,759,759,350,350,,,,350,,350,350,350,350,350', +'350,350,,,,,,350,350,350,350,350,350,350,,,350,,,,,,,350,,,350,350,350', +'350,350,350,350,350,,350,350,350,,350,350,,,350,,,,,,,,,,,,,,,,,,,,350', +',,350,,,350,350,,,350,,,,,,,,,,,,,,,,,,,,350,350,350,350,,350,350,350', +'350,,,,,350,350,,,,37,37,37,350,37,350,350,350,37,37,,,,37,,37,37,37', +'37,37,37,37,,,,,,37,37,37,37,37,37,37,,,37,,,,,,,37,,,37,37,37,37,37', +'37,37,37,,37,37,37,,37,37,,,37,,,,,,,,,,,,,,,,,,,,37,,,37,,,37,37,,', +'37,,37,,,,,,,,,,,,,,,,,,37,37,37,37,,37,37,37,37,,,,,37,37,,,,552,552', +'552,37,552,37,37,37,552,552,,,,552,,552,552,552,552,552,552,552,,,,', +',552,552,552,552,552,552,552,,,552,,,,,,,552,,,552,552,552,552,552,552', +'552,552,,552,552,552,,552,552,,,552,,,,,,,,,,,,,,,,,,,,552,,,552,,,552', +'552,,,552,,,,,,,,,,,,,,,,,,,,552,552,552,552,,552,552,552,552,,,,,552', +'552,,,,1103,1103,1103,552,1103,552,552,552,1103,1103,,,,1103,,1103,1103', +'1103,1103,1103,1103,1103,,,,,,1103,1103,1103,1103,1103,1103,1103,,,1103', +',,,,,,1103,,,1103,1103,1103,1103,1103,1103,1103,1103,,1103,1103,1103', +',1103,1103,,,1103,,,,,,,,,,,,,,,,,,,,1103,,,1103,,,1103,1103,,,1103', +',,,,,,,,,,,,,,,,,,,1103,1103,1103,1103,,1103,1103,1103,1103,,,,,1103', +'1103,,,,77,77,77,1103,77,1103,1103,1103,77,77,,,,77,,77,77,77,77,77', +'77,77,,,,,,77,77,77,77,77,77,77,,,77,,,,,,,77,,,77,77,77,77,77,77,77', +'77,,77,77,77,,77,77,,,77,,,,,,,,,,,,,,,,,77,,,77,,,77,,,77,77,,,77,', +',,,,,,,,,,,,,,,,,,77,77,77,77,,77,77,77,77,,,,,77,77,,,,543,543,543', +'77,543,77,77,77,543,543,,,,543,,543,543,543,543,543,543,543,,,,,,543', +'543,543,543,543,543,543,,,543,,,,,,,543,,,543,543,543,543,543,543,543', +'543,,543,543,543,,543,543,,,543,,,,,,,,,,,,,,,,,,,,543,,,543,,,543,543', +',,543,,,,,,,,,,,,,,,,,,,,543,543,543,543,,543,543,543,543,,,,,543,543', +',,,78,78,78,543,78,543,543,543,78,78,,,,78,,78,78,78,78,78,78,78,,,', +',,78,78,78,78,78,78,78,,,78,,,,,,,78,,,78,78,78,78,78,78,78,78,,78,78', +'78,,78,78,,,78,,,,,,,,,,,,,,,,,,,,78,,,78,,,78,78,,,78,,,,,,,,,,,,,', +',,,,,,78,78,78,78,,78,78,78,78,,,,,78,78,,,,38,38,38,78,38,78,78,78', +'38,38,,,,38,,38,38,38,38,38,38,38,,,,,,38,38,38,38,38,38,38,,,38,,,', +',,,38,,,38,38,38,38,38,38,38,38,,38,38,38,,38,38,,,38,,,,,,,,,,,,,,', +',,,,,38,,,38,,,38,38,,,38,,,777,,777,777,777,777,777,,,,,,,,,777,,38', +'38,38,38,,38,38,38,38,,,,,38,38,,,,38,,777,38,,38,38,38,331,331,331', +',331,777,777,,331,331,777,,,331,,331,331,331,331,331,331,331,,,,,,331', +'331,331,331,331,331,331,,,331,,,,,,,331,,,331,331,331,331,331,331,331', +'331,,331,331,331,,331,331,,,331,,,,,,,,,,,,,,,,,,,,331,,,331,,,331,331', +',,331,,,1043,,1043,1043,1043,1043,1043,,,,,,,,,1043,,331,331,331,331', +',331,331,331,331,,,,,331,331,,,,331,,1043,331,,331,331,331,1033,1033', +'1033,,1033,1043,1043,,1033,1033,1043,,,1033,,1033,1033,1033,1033,1033', +'1033,1033,,,,,,1033,1033,1033,1033,1033,1033,1033,,,1033,,,,,,,1033', +',,1033,1033,1033,1033,1033,1033,1033,1033,,1033,1033,1033,,1033,1033', +',,1033,,,,,,,,,,,,,,,,,,,,1033,,,1033,,,1033,1033,,,1033,,,,,,,,,,,', +',,,,,,,,1033,1033,1033,1033,,1033,1033,1033,1033,,,,,1033,1033,,,,,', +',1033,,1033,1033,1033,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11', +'11,11,11,11,11,11,11,11,,,,11,11,11,11,11,11,11,11,11,11,,,,,,11,11', +'11,11,11,11,11,11,11,,,11,,,,,,,,11,11,,11,11,11,11,11,11,11,,,11,11', +',,,11,11,11,11,,,,,,,,,,,,,,11,11,,11,11,11,11,11,11,11,11,11,11,11', +'11,,,11,11,,,,,,,,,,,,,,11,10,10,10,10,10,10,10,10,10,10,10,10,10,10', +'10,10,10,10,10,10,10,10,10,10,,,,10,10,10,10,10,10,10,10,10,10,,,,,', +'10,10,10,10,10,10,10,10,10,10,,10,,,,,,,,10,10,,10,10,10,10,10,10,10', +',,10,10,,,,10,10,10,10,,,,,,,,,,,,,,10,10,,10,10,10,10,10,10,10,10,10', +'10,10,10,,,10,10,,,,,,,,,,,,,,10,664,664,664,664,664,664,664,664,664', +'664,664,664,664,664,664,664,664,664,664,664,664,664,664,664,,,,664,664', +'664,664,664,664,664,664,664,664,,,,,,664,664,664,664,664,664,664,664', +'664,,,664,,,,,,,,664,664,,664,664,664,664,664,664,664,,,664,664,,,,664', +'664,664,664,,,,,,,,,,,,,,664,664,,664,664,664,664,664,664,664,664,664', +'664,664,664,,,664,664,,,,,,,,,,,,,,664,425,425,425,425,425,425,425,425', +'425,425,425,425,425,425,425,425,425,425,425,425,425,425,425,425,,,,425', +'425,425,425,425,425,425,425,425,425,,,,,,425,425,425,425,425,425,425', +'425,425,,,425,,,,,,,,425,425,,425,425,425,425,425,425,425,,,425,425', +',,,425,425,425,425,,,,,,,,,,,,,,425,425,,425,425,425,425,425,425,425', +'425,425,425,425,425,,,425,425,,,,,,,,,,,,,,425,24,24,24,24,24,24,24', +'24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,,,,24,24,24,24,24', +'24,24,24,24,24,,,,,,24,24,24,24,24,24,24,24,24,24,24,24,,24,,,,,,24', +'24,,24,24,24,24,24,24,24,,,24,24,,,,24,24,24,24,,,,,,24,,,,,,,,24,24', +',24,24,24,24,24,24,24,24,24,24,24,24,,,24,1001,1001,1001,1001,,,,,,', +',,,,,,1001,1001,1001,1001,,,367,1001,367,367,367,367,367,1001,1001,', +',1001,,,,367,,,,,,,,,,,,,,,,1001,,,1001,,,367,1001,,,1001,,,,,367,367', +'367,367,,,,367,,,,1001,,,,1001,1001,1001,1001,,1001,1001,1001,1001,', +',,,1001,1001,1084,1084,1084,1084,,,1001,,1001,1001,1001,,,1001,1001', +',1084,1084,1084,1084,,,793,1084,793,793,793,793,793,1084,1084,,,1084', +',,,793,,,,,,,,,,,,,,,,1084,,,1084,,,793,1084,,,1084,,,,,793,793,793', +'793,,,,793,,,,1084,,,,1084,1084,1084,1084,,1084,1084,1084,1084,,,,,1084', +'1084,985,985,985,985,,,1084,,1084,1084,1084,,,1084,1084,,985,985,985', +'985,,,1212,985,1212,1212,1212,1212,1212,985,985,,,985,,,,1212,,,,,,', +',,,,,,,,,985,,,985,,,1212,985,,,985,,,,,,,1212,1212,,,,1212,,,,985,', +',,985,985,985,985,,985,985,985,985,,,,,985,985,1138,1138,1138,1138,', +',985,,985,985,985,,,985,985,,1138,1138,1138,1138,,,775,1138,775,775', +'775,775,775,1138,1138,,,1138,,,,775,,,,,,,,,,,,,,,,1138,,,1138,,,775', +'1138,,,1138,,,,,775,775,775,775,,,,775,,,,1138,,,,1138,1138,1138,1138', +',1138,1138,1138,1138,,,,,1138,1138,1200,1200,1200,1200,,,1138,,1138', +'1138,1138,,,1138,1138,,1200,1200,1200,1200,,,1041,1200,1041,1041,1041', +'1041,1041,1200,1200,,,1200,,,,1041,,,,,,,,,,,,,,,,1200,,,1200,,,1041', +'1200,,,1200,,,,,,,1041,1041,,,,1041,,,,1200,,,,1200,1200,1200,1200,', +'1200,1200,1200,1200,,,,,1200,1200,1140,1140,1140,1140,,,1200,,1200,1200', +'1200,,,1200,1200,,1140,1140,1140,1140,,,1038,1140,1038,1038,1038,1038', +'1038,1140,1140,,,1140,,,,1038,,,,,,,,,,,,,,,,1140,,,1140,,,1038,1140', +',,1140,,1140,,,,,1038,1038,,,,1038,,,,1140,,,,1140,1140,1140,1140,,1140', +'1140,1140,1140,,,,,1140,1140,1176,1176,1176,1176,,,1140,,1140,1140,1140', +',,1140,1140,,1176,1176,1176,1176,,,1159,1176,1159,1159,1159,1159,1159', +'1176,1176,,,1176,,,,1159,,,,,,,,,,,,,,,,1176,,,1176,,,1159,1176,,,1176', +',,,,,,1159,1159,,,,1159,,,,1176,,,,1176,1176,1176,1176,,1176,1176,1176', +'1176,,,,,1176,1176,,,,,,,1176,,1176,1176,1176,,,1176,1176,725,725,725', +'725,725,725,725,725,725,725,725,725,725,725,725,725,725,725,725,725', +'725,725,725,725,,,,725,725,725,725,725,725,725,725,725,725,,,,,,725', +'725,725,725,725,725,725,725,725,,,725,,,,,,,,725,725,,725,725,725,725', +'725,725,725,,,725,725,,,,725,725,725,725,,,,,,,,,,,,,,725,725,,725,725', +'725,725,725,725,725,725,725,725,725,725,,,725,953,953,953,953,,,1099', +',1099,1099,1099,1099,1099,,,,953,953,953,953,,1099,,953,953,,,,,953', +'953,,,953,953,,,,,,,,,1099,,,,,,,,,,953,1099,1099,953,,,1099,953,,,953', +',953,,,,,,,953,,,,,,,953,,,,953,953,953,953,,953,953,953,953,,,,,953', +'953,701,701,701,701,,,953,,953,953,953,,,953,953,,701,701,701,701,,', +'1036,701,1036,1036,1036,1036,1036,701,701,,,701,,,,1036,,,,,,,,,,,,', +',,,701,,,701,,,1036,701,,,701,,701,,,1036,1036,1036,1036,,,,1036,,,', +'701,,,,701,701,701,701,,701,701,701,701,,,,,701,701,701,889,889,889', +'889,,701,,701,701,701,,,701,701,,,889,889,889,889,,,1094,889,1094,1094', +'1094,1094,1094,889,889,,,889,,,,1094,,,,,,,,,,,,,,,,889,,,889,,,1094', +'889,,,889,,,,,1094,1094,1094,1094,,,,1094,,,,889,,,,889,889,889,889', +',889,889,889,889,,,,,889,889,482,482,482,482,,,889,,889,889,889,,,889', +'889,,482,482,482,482,,,1097,482,1097,1097,1097,1097,1097,482,482,,,482', +',,,1097,,,,,,,,,,,,,,,,482,,,482,,,1097,482,,,482,,,,,1097,1097,1097', +'1097,,,,1097,,,,482,,,,482,482,482,482,,482,482,482,482,,,,,482,482', +'881,881,881,881,,,482,,482,482,482,,,482,482,,881,881,881,881,,,1186', +'881,1186,1186,1186,1186,1186,881,881,,,881,,,,1186,,,,,,,,,,,,,,,,881', +',,881,,,1186,881,,,881,,881,,,,,1186,1186,,,,1186,,,,881,,,,881,881', +'881,881,,881,881,881,881,,,,,881,881,875,875,875,875,,,881,,881,881', +'881,,,881,881,,875,875,875,875,,,,875,875,,,,,875,875,,,875,875,,,,', +',,,,,,,,,,,,,,875,,,875,,,,875,,,875,,875,,,,,,,875,,,,,,,875,,,,875', +'875,875,875,,875,875,875,875,,,,,875,875,874,874,874,874,,,875,,875', +'875,875,,,875,875,,874,874,874,874,,,,874,874,,,,,874,874,,,874,874', +',,,,,,,,,,,,,,,,,,874,,,874,,,,874,,,874,,874,,,,,,,874,,,,,,,874,,', +',874,874,874,874,,874,874,874,874,,,,,874,874,871,871,871,871,,,874', +',874,874,874,,,874,874,,871,871,871,871,,,1184,871,1184,1184,1184,1184', +'1184,871,871,,,871,,,,1184,,,,,,,,,,,,,,,,871,,,871,,,1184,871,,,871', +',,,,,,1184,1184,,,,1184,,,,871,,,,871,871,871,871,,871,871,871,871,', +',,,871,871,483,483,483,483,,,871,,871,871,871,,,871,871,,483,483,483', +'483,,,1182,483,1182,1182,1182,1182,1182,483,483,,,483,,,,1182,,,,,,', +',,,,,,,,,483,,,483,,,1182,483,,,483,,,,,,,1182,1182,,,,1182,,,,483,', +',,483,483,483,483,,483,483,483,483,,,,,483,483,1124,1124,1124,1124,', +',483,,483,483,483,,,483,483,,1124,1124,1124,1124,,,,1124,,,,,,1124,1124', +',,1124,,,,,,,,708,708,708,708,,,,,,,,,1124,,,1124,708,708,708,1124,', +',1124,,1124,,,,,708,708,,,708,,,,,1124,,,,1124,1124,1124,1124,,1124', +'1124,1124,1124,,,,,1124,1124,,,,,,,1124,,1124,1124,1124,,,1124,1124', +'407,,407,407,407,407,407,,,,,708,708,708,708,407,708,708,708,708,,,', +',708,708,891,891,891,891,,,708,,708,708,708,407,407,,,,891,891,891,', +'407,407,407,407,,,,407,,891,891,,,891,890,890,890,890,,,,,,,,,,,,,890', +'890,890,,,,,,,,,,,890,890,,,890,,,,,,,,,,,,,,,,891,891,891,891,,891', +'891,891,891,,,,,891,891,,,,,,,891,,891,891,891,,,,,,,,,890,890,890,890', +',890,890,890,890,,,,,890,890,671,671,,,671,,890,,890,890,890,,671,671', +',671,671,671,671,671,671,671,,,671,671,,,,671,671,671,671,,,,,,671,', +',,,,,,671,671,,671,671,671,671,671,671,671,671,671,671,671,671,626,626', +'671,,626,,,,,,,,626,626,,626,626,626,626,626,626,626,,,626,626,,,,626', +'626,626,626,,,,,,626,,,,,,,,626,626,,626,626,626,626,626,626,626,626', +'626,626,626,626,225,225,626,,225,,,,,,,,225,225,,225,225,225,225,225', +'225,225,,,225,225,,,,225,225,225,225,,,,,,225,,,,,,,,225,225,,225,225', +'225,225,225,225,225,225,225,225,225,225,226,226,225,,226,,,,,,,,226', +'226,,226,226,226,226,226,226,226,,,226,226,,,,226,226,226,226,,,,,,226', +',,,,,,,226,226,,226,226,226,226,226,226,226,226,226,226,226,226,627', +'627,226,,627,,,,,,,,627,627,,627,627,627,627,627,627,627,,,627,627,', +',,627,627,627,627,,,,,,627,,,,,,,,627,627,,627,627,627,627,627,627,627', +'627,627,627,627,627,547,547,627,,547,,,,,,,,547,547,,547,547,547,547', +'547,547,547,,,547,547,,,,547,547,547,547,,,,,,547,,,,,,,,547,547,,547', +'547,547,547,547,547,547,547,547,547,547,547,475,475,547,,475,,,,,,,', +'475,475,,475,475,475,475,475,475,475,,,475,475,,,,475,475,475,475,,', +',,,475,,,,,,,,475,475,,475,475,475,475,475,475,475,475,475,475,475,475', +'1152,1152,475,,1152,,,,,,,,1152,1152,,1152,1152,1152,1152,1152,1152', +'1152,,,1152,1152,,,,1152,1152,1152,1152,,,,,,1152,,,,,,,,1152,1152,', +'1152,1152,1152,1152,1152,1152,1152,1152,1152,1152,1152,1152,633,633', +'1152,,633,,,,,,,,633,633,,633,633,633,633,633,633,633,,,633,633,,,,633', +'633,633,633,,,,,,633,,,,,,,,633,633,,633,633,633,633,633,633,633,633', +'633,633,633,633,556,556,633,,556,,,,,,,,556,556,,556,556,556,556,556', +'556,556,,,556,556,,,,556,556,556,556,,,,,,556,,,,,,,,556,556,,556,556', +'556,556,556,556,556,556,556,556,556,556,557,557,556,,557,,,,,,,,557', +'557,,557,557,557,557,557,557,557,,,557,557,,,,557,557,557,557,,,,,,557', +',,,,,,,557,557,,557,557,557,557,557,557,557,557,557,557,557,557,546', +'546,557,,546,,,,,,,,546,546,,546,546,546,546,546,546,546,,,546,546,', +',,546,546,546,546,,,,,,546,,,,,,,,546,546,,546,546,546,546,546,546,546', +'546,546,546,546,546,634,634,546,,634,,,,,,,,634,634,,634,634,634,634', +'634,634,634,,,634,634,,,,634,634,634,634,,,,,,634,,,,,,,,634,634,,634', +'634,634,634,634,634,634,634,634,634,634,634,1156,1156,634,,1156,,,,', +',,,1156,1156,,1156,1156,1156,1156,1156,1156,1156,,,1156,1156,,,,1156', +'1156,1156,1156,,,,,,1156,,,,,,,,1156,1156,,1156,1156,1156,1156,1156', +'1156,1156,1156,1156,1156,1156,1156,476,476,1156,,476,,,,,,,,476,476', +',476,476,476,476,476,476,476,,,476,476,,,,476,476,476,476,,,,,,476,', +',,,,,,476,476,,476,476,476,476,476,476,476,476,476,476,476,476,1157', +'1157,476,,1157,,,,,,,,1157,1157,,1157,1157,1157,1157,1157,1157,1157', +',,1157,1157,,,,1157,1157,1157,1157,,,,,,1157,,,,,,,,1157,1157,,1157', +'1157,1157,1157,1157,1157,1157,1157,1157,1157,1157,1157,672,672,1157', +',672,,,,,,,,672,672,,672,672,672,672,672,672,672,,,672,672,,,,672,672', +'672,672,,,,,,672,,,,,,,,672,672,,672,672,672,672,672,672,672,672,672', +'672,672,672,,641,672,641,641,641,641,641,,1180,,1180,1180,1180,1180', +'1180,641,,,,,,,,1180,,,,,,,,,,,,,,641,,,,,,,,1180,641,641,641,641,,', +',641,1180,1180,1180,1180,,,,1180' ] + racc_action_check = arr = ::Array.new(28007, nil) + idx = 0 + clist.each do |str| + str.split(',', -1).each do |i| + arr[idx] = i.to_i unless i.empty? + idx += 1 + end + end + +racc_action_pointer = [ + nil, 1349, 3855, 739, nil, 401, nil, 5413, 1392, 558, + 24440, 24312, 556, nil, 509, 438, 592, 429, 800, 605, + nil, -69, 5675, 1263, 24824, 307, nil, 803, nil, 254, + 5947, 6057, 6191, 6322, 6453, nil, 2703, 23109, 23895, nil, + 175, 466, 569, 146, 6715, 6846, -44, 6977, 7108, 975, + 7239, 45, 185, 323, 1112, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 7380, nil, 7521, 7652, 7783, 199, + nil, 7914, 8045, nil, nil, 8176, 22585, 23502, 23764, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 529, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 830, nil, + nil, 110, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 8319, nil, nil, nil, nil, 8462, + 8593, 8724, 5138, 8998, nil, 2847, nil, -1, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 1400, nil, 1983, 21406, + 21537, 21668, 21799, 21930, 22061, 26978, 27039, nil, nil, 22192, + 22323, 9129, nil, nil, 1135, 443, 389, 1466, 119, 1349, + 1407, nil, 9260, 5007, 1374, nil, nil, 9391, 9522, 9653, + 9784, 9915, 10046, 10177, 10308, 10439, 10570, 10701, 10832, 10963, + 11094, 11225, 11356, 11487, 11618, 11749, 11880, 12011, 12142, nil, + nil, nil, nil, 12273, nil, nil, 768, 698, 670, 669, + 658, 556, 523, 417, 306, -62, nil, nil, nil, 13059, + nil, nil, 5279, nil, nil, 1260, 13321, 13452, nil, nil, + nil, nil, nil, nil, nil, 13583, nil, 2271, nil, 1207, + 1190, nil, 13845, 1232, 13976, nil, nil, 14107, 14238, nil, + nil, 72, nil, 14381, 960, 1178, 1144, 3423, 1158, 1186, + 1142, 24034, 2991, 228, 300, 409, 1216, 802, nil, 1172, + 1126, 275, 1160, 1156, nil, nil, nil, 1149, 255, 1099, + 22978, nil, 327, 968, 3999, 3855, 1165, nil, 1160, 15429, + nil, 15560, 1068, 4431, 1057, nil, 607, 24910, 1055, 4143, + 3999, 738, 1067, nil, 748, 730, 1081, 1049, 492, 1071, + nil, 772, 179, 35, 16215, 3135, 2559, 400, 1127, 993, + 57, 40, 692, 1050, -18, 1078, nil, nil, 966, 479, + 372, nil, 1108, nil, 980, 16608, nil, 26698, nil, 395, + 398, 641, 506, 401, -32, -34, 606, nil, nil, nil, + nil, nil, nil, nil, 966, 24696, nil, nil, nil, nil, + 961, nil, 1030, 931, 18204, 929, nil, nil, 911, nil, + 889, 15, 1011, nil, nil, 1407, nil, nil, nil, nil, + nil, 1695, 858, nil, 854, 841, 526, 511, 19000, nil, + nil, nil, 720, 610, 865, nil, nil, 19275, 19411, nil, + nil, nil, 212, nil, 837, 27222, 27710, 19941, 345, 20203, + 20334, 20465, 26016, 26506, 4431, 4719, 1014, 853, 783, 782, + 775, 770, 5138, 5413, 5230, 4863, 3711, 4575, 3567, 3279, + 3423, 3110, 3019, 3135, 4143, 1983, 5007, nil, 231, nil, + 5279, nil, nil, nil, nil, 8855, 654, 668, 689, nil, + nil, nil, 694, nil, nil, 21275, nil, 21144, nil, 21013, + nil, 392, nil, nil, nil, 20870, 907, nil, 729, 731, + nil, nil, 735, 23633, 744, 20727, 27527, 27161, 798, 787, + nil, nil, 23240, 750, nil, 20596, 27405, 27466, 20072, 4287, + 2559, 19810, 19679, 878, 879, nil, nil, 759, 757, 762, + 761, 778, nil, 782, 788, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 777, 961, nil, nil, 19548, nil, + nil, nil, 232, nil, nil, nil, 878, nil, nil, 880, + 219, 820, 19134, 949, 960, 840, 881, nil, 18859, nil, + nil, 18728, nil, nil, nil, 1551, 972, nil, 1695, -14, + 980, 1002, 38, 1035, 18597, 18466, 26917, 27100, 7, nil, + nil, 958, nil, 27344, 27588, 18335, nil, nil, 189, 2415, + nil, 27894, nil, nil, nil, nil, 1362, nil, nil, nil, + 946, nil, nil, 322, nil, 357, nil, nil, 935, nil, + 937, nil, nil, nil, 24568, nil, 18073, 944, 17930, 17799, + 17668, 26856, 27832, 17537, 17394, 442, 987, 17263, 17132, 17001, + 16870, 990, nil, nil, 16739, 16477, 992, nil, nil, nil, + 251, -56, 332, 471, 959, 1007, nil, 992, nil, nil, + 416, 25819, -84, nil, 646, nil, nil, 7380, 26645, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 1056, 534, nil, 1039, 995, 25638, nil, 1122, nil, 1105, + 173, nil, nil, 16346, nil, 1031, 1036, 1137, nil, 1022, + nil, 1069, 16084, nil, nil, 15953, nil, 247, 22716, 1027, + nil, 1031, 105, 343, 1099, 246, 875, 1101, 1058, 22847, + nil, 1127, -26, 1839, 1184, 15822, nil, nil, 717, nil, + nil, 1296, nil, nil, 649, 25204, nil, 23942, nil, 15691, + nil, 3006, nil, 1073, 1075, 1170, 1079, nil, nil, nil, + nil, nil, nil, 25008, 1551, nil, nil, nil, nil, 702, + 240, nil, 1201, nil, nil, nil, nil, nil, 1208, 1209, + nil, nil, 26, 1100, 39, 31, -1, 8, 975, 1110, + 964, nil, 1103, 1119, 15298, nil, 1237, -23, 1121, nil, + nil, nil, nil, nil, 1263, nil, nil, nil, nil, nil, + nil, nil, nil, 1127, 15167, 1140, 252, -85, 220, 0, + nil, 2127, 15036, nil, 1139, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 14905, 14774, 14643, 14512, 417, + 1228, 26408, 121, 152, 26310, 26212, 441, -68, 1169, 1170, + nil, 26114, nil, 1169, 1171, 1254, 1187, nil, 1193, 25918, + 26777, 26743, nil, nil, nil, nil, nil, 13714, nil, nil, + 1234, nil, nil, 1231, 1217, nil, nil, 539, 3567, nil, + nil, nil, nil, 1220, 291, nil, nil, 13190, 1349, nil, + 4287, 1226, 1280, nil, nil, 1245, nil, 1243, 1244, nil, + 1249, nil, 1336, nil, 1255, 1256, nil, 1257, nil, nil, + 1263, 2977, 3016, nil, nil, 12928, nil, 1388, nil, 12797, + 1389, nil, nil, 25721, 12666, 4719, 10, 1395, nil, 1396, + 451, 4863, nil, nil, nil, nil, 1279, 1333, 1316, 1311, + 113, nil, nil, 12535, 12404, nil, nil, nil, nil, 1316, + 1317, 1318, 1316, nil, nil, 25103, nil, nil, 2, nil, + nil, 1337, 1354, 1357, nil, nil, nil, 1401, 1358, -48, + nil, 24907, nil, 1366, nil, nil, -31, nil, nil, 2703, + 1407, nil, nil, 1364, 1367, nil, 1368, 1370, 1373, nil, + 1402, 1389, 1375, 22454, nil, nil, nil, 2847, nil, 1839, + nil, nil, 36, 24173, nil, nil, 25822, nil, 25400, nil, + nil, 25302, nil, 24081, nil, nil, nil, nil, 1393, 1398, + 2415, nil, -10, nil, 136, 575, -83, nil, nil, nil, + nil, 216, nil, nil, nil, 1523, 2127, 2271, 2113, nil, + nil, nil, nil, nil, 1043, 1447, 325, nil, nil, nil, + nil, nil, nil, 1404, 25005, 1406, nil, nil, 329, nil, + nil, 1584, nil, nil, 25921, nil, nil, 26019, nil, 25708, + nil, nil, -82, 23371, 1102, -22, nil, 4575, 32, 9, + 991, 167, 79, nil, 106, 136, 151, 168, 3215, 3045, + 3279, nil, 6584, 5806, 26604, nil, nil, nil, nil, 239, + 354, 542, nil, nil, nil, nil, nil, nil, 25201, 245, + 25397, 253, nil, nil, 255, 287, 296, 324, nil, 356, + nil, 841, 27283, nil, 499, 5544, 27649, 27771, 33, 25498, + nil, nil, nil, nil, 399, 628, 3711, nil, nil, nil, + 427, nil, nil, nil, 1969, 437, 25495, nil, nil, nil, + 27902, nil, 26509, nil, 26411, nil, 26117, nil, nil, 520, + 531, nil, 518, 145, 146, 142, 39, 541, nil, 35, + 25299, nil, 557, 566, 576, 593, 143, nil, nil, nil, + nil, 625, 25106, nil, nil, nil, nil, 631, nil ] + +racc_action_default = [ + -1, -729, -4, -729, -2, -714, -5, -729, -8, -729, + -729, -729, -729, -31, -729, -729, -36, -729, -729, -305, + -48, -716, -729, -57, -729, -65, -66, -67, -71, -282, + -282, -282, -318, -345, -346, -83, -13, -87, -95, -97, + -729, -611, -612, -729, -729, -729, -729, -729, -729, -235, + -729, -716, -626, -626, -253, -296, -297, -298, -299, -300, + -301, -302, -303, -304, -702, -307, -311, -728, -692, -326, + -328, -729, -729, -59, -59, -714, -729, -729, -729, -347, + -348, -350, -351, -352, -353, -410, -551, -552, -553, -554, + -575, -557, -558, -577, -579, -562, -567, -571, -573, -589, + -590, -591, -575, -593, -595, -596, -597, -598, -700, -600, + -601, -701, -603, -604, -605, -606, -607, -608, -609, -610, + -615, -616, 1219, -3, -715, -724, -725, -726, -7, -729, + -729, -729, -729, -729, -9, -4, -19, -729, -126, -127, + -128, -129, -130, -131, -132, -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, -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, -24, -133, -13, -729, + -729, -729, -729, -729, -272, -729, -729, -712, -713, -729, + -729, -716, -717, -52, -729, -611, -612, -729, -305, -729, + -729, -241, -729, -13, -729, -53, -55, -218, -219, -729, + -729, -729, -729, -729, -729, -729, -729, -729, -729, -729, + -729, -729, -729, -729, -729, -729, -729, -729, -729, -254, + -255, -256, -257, -729, -61, -62, -729, -126, -127, -166, + -167, -168, -184, -189, -196, -199, -611, -612, -690, -729, + -419, -421, -729, -710, -711, -72, -272, -729, -325, -425, + -434, -436, -78, -431, -79, -716, -80, -260, -277, -286, + -286, -281, -729, -287, -729, -575, -694, -729, -729, -81, + -82, -714, -14, -729, -17, -729, -85, -13, -716, -729, + -88, -91, -13, -103, -104, -729, -729, -111, -318, -321, + -716, -729, -626, -626, -345, -346, -349, -432, -729, -93, + -729, -99, -315, -729, -220, -221, -594, -229, -230, -729, + -242, -729, -729, -13, -625, -621, -648, -648, -729, -13, + -13, -309, -716, -261, -721, -721, -729, -729, -721, -729, + -327, -58, -729, -729, -729, -13, -13, -714, -729, -715, + -611, -612, -729, -729, -305, -729, -363, -364, -121, -122, + -729, -124, -729, -305, -619, -729, -341, -648, -555, -729, + -729, -729, -729, -729, -729, -729, -729, -6, -727, -25, + -26, -27, -28, -29, -729, -729, -21, -22, -23, -134, + -729, -32, -35, -292, -729, -729, -291, -33, -729, -37, + -729, -305, -45, -47, -207, -265, -287, -49, -50, -38, + -208, -265, -716, -273, -286, -286, -703, -704, -282, -429, + -705, -706, -704, -703, -282, -428, -430, -705, -706, -44, + -215, -51, -716, -324, -729, -729, -729, -272, -315, -729, + -729, -729, -729, -729, -216, -217, -222, -223, -224, -225, + -226, -227, -231, -232, -233, -234, -236, -237, -238, -239, + -240, -243, -244, -245, -246, -716, -258, -63, -716, -440, + -282, -703, -704, -69, -73, -649, -716, -286, -716, -283, + -438, -440, -716, -320, -278, -729, -279, -729, -284, -729, + -288, -729, -697, -699, -12, -715, -16, -18, -716, -84, + -313, -100, -89, -729, -716, -272, -729, -729, -110, -729, + -625, -594, -729, -96, -101, -729, -729, -729, -729, -259, + -247, -729, -729, -543, -729, -376, -377, -716, -633, -716, + -689, -689, -631, -633, -633, -647, -649, -650, -651, -652, + -653, -654, -655, -656, -657, -729, -659, -661, -663, -668, + -670, -671, -674, -679, -681, -682, -684, -685, -686, -729, + -729, -633, -729, -729, -729, -716, -729, -262, -723, -722, + -264, -723, -316, -317, -693, -13, -354, -355, -13, -729, + -729, -729, -729, -729, -729, -272, -729, -729, -315, -59, + -121, -122, -123, -729, -729, -272, -337, -617, -729, -13, + -411, -648, -414, -556, -576, -581, -729, -583, -559, -578, + -729, -580, -561, -729, -564, -729, -566, -569, -729, -570, + -729, -592, -10, -20, -729, -30, -729, -295, -729, -729, + -272, -729, -729, -729, -729, -433, -729, -274, -276, -729, + -729, -74, -271, -426, -729, -729, -76, -427, -323, -718, + -703, -704, -703, -704, -716, -54, -460, -462, -464, -467, + -524, -716, -479, -482, -517, -522, -523, -729, -729, -527, + -528, -529, -530, -531, -532, -533, -534, -535, -536, -537, + -729, -729, -541, -56, -729, -729, -691, -729, -441, -68, + -422, -438, -267, -274, -269, -729, -400, -729, -319, -286, + -285, -289, -729, -695, -696, -729, -15, -86, -729, -92, + -98, -716, -703, -704, -270, -707, -109, -729, -94, -729, + -214, -228, -716, -249, -728, -728, -343, -622, -729, -640, + -624, -729, -629, -630, -729, -729, -643, -729, -645, -729, + -365, -729, -367, -369, -372, -375, -716, -662, -672, -673, + -683, -687, -627, -729, -251, -344, -308, -310, -312, -721, + -728, -356, -728, -60, -357, -358, -331, -332, -729, -729, + -446, -334, -729, -716, -703, -704, -707, -314, -13, -121, + -122, -125, -716, -13, -729, -339, -729, -729, -716, -582, + -585, -586, -587, -588, -13, -560, -563, -565, -568, -572, + -574, -135, -34, -293, -729, -716, -703, -704, -704, -703, + -46, -266, -729, -719, -286, -40, -210, -41, -211, -75, + -42, -213, -43, -212, -77, -729, -729, -729, -729, -433, + -729, -729, -465, -466, -729, -729, -729, -484, -716, -716, + -478, -485, -491, -729, -494, -498, -729, -481, -729, -729, + -520, -521, -525, -526, -538, -122, -539, -729, -64, -420, + -400, -424, -423, -729, -716, -435, -401, -716, -13, -437, + -280, -290, -698, -90, -433, -102, -322, -729, -728, -361, + -13, -544, -728, -545, -546, -716, -632, -633, -633, -660, + -689, -669, -674, -688, -633, -633, -680, -633, -657, -675, + -716, -729, -729, -374, -658, -729, -263, -729, -359, -729, + -729, -333, -335, -729, -729, -13, -433, -729, -433, -729, + -729, -13, -342, -412, -415, -417, -404, -729, -729, -294, + -433, -39, -209, -275, -729, -461, -463, -471, -475, -716, + -716, -716, -503, -505, -506, -509, -510, -575, -513, -515, + -516, -716, -716, -716, -540, -476, -477, -501, -486, -489, + -492, -729, -497, -716, -575, -720, -716, -518, -519, -248, + -13, -70, -268, -689, -689, -381, -383, -383, -383, -399, + -729, -716, -657, -665, -666, -677, -439, -250, -11, -13, + -550, -362, -729, -729, -548, -623, -729, -636, -729, -638, + -628, -729, -641, -729, -644, -646, -366, -368, -370, -373, + -252, -329, -729, -330, -729, -451, -454, -457, -458, -459, + -289, -728, -336, -338, -618, -729, -13, -13, -729, -413, + -584, -468, -469, -470, -504, -508, -729, -512, -514, -472, + -473, -474, -493, -487, -729, -495, -499, -480, -729, -483, + -442, -729, -379, -380, -384, -390, -392, -729, -395, -729, + -397, -402, -729, -729, -664, -729, -549, -13, -611, -612, + -729, -729, -305, -547, -633, -633, -633, -633, -729, -729, + -13, -447, -729, -729, -455, -443, -444, -445, -340, -729, + -729, -716, -406, -408, -409, -502, -507, -511, -729, -490, + -729, -689, -667, -382, -383, -383, -383, -383, -678, -383, + -403, -676, -729, -315, -543, -272, -729, -729, -315, -729, + -634, -637, -639, -642, -371, -728, -13, -452, -453, -456, + -494, -416, -418, -405, -729, -488, -729, -496, -500, -378, + -729, -387, -729, -389, -729, -393, -729, -396, -398, -314, + -707, -542, -716, -703, -704, -707, -314, -633, -360, -728, + -729, -407, -383, -383, -383, -383, -433, -635, -448, -449, + -450, -495, -729, -385, -388, -391, -394, -383, -386 ] + +clist = [ +'42,141,141,225,291,42,330,230,623,275,274,380,293,809,409,141,308,308', +'308,346,346,124,287,458,464,127,416,382,383,365,365,387,764,526,42,334', +'334,361,309,309,309,436,437,452,373,514,743,518,878,144,144,772,773', +'342,342,632,584,584,346,346,346,947,233,918,42,8,134,136,217,123,8,385', +'386,374,391,287,287,310,310,310,349,299,303,449,928,419,420,421,422', +'469,510,934,342,342,342,127,929,584,564,356,329,950,615,618,603,604', +'343,343,930,928,607,610,375,378,614,516,443,569,15,443,887,929,42,15', +'326,443,936,328,1085,371,743,42,932,42,567,600,879,369,735,388,1047', +'1017,575,575,908,343,343,343,740,292,740,4,15,553,295,302,304,786,967', +'1049,1134,128,695,723,306,319,320,1148,927,649,651,654,654,1132,1170', +'642,1032,568,526,892,893,2,15,575,550,550,1028,8,981,993,1177,727,396', +'927,653,655,423,743,8,746,1003,404,406,737,362,368,216,397,308,432,425', +'1139,482,483,803,276,42,468,725,475,731,979,991,1018,664,435,435,359', +'376,730,288,377,395,636,370,988,988,1020,605,531,15,42,808,372,823,961', +'639,988,1048,15,1148,15,998,1019,1095,1021,1131,640,963,431,442,293', +'407,442,827,1175,1134,1059,1066,442,1067,509,520,458,464,521,900,459', +'417,1201,308,308,430,1125,424,1054,1208,953,821,308,1166,1055,1058,975', +'976,874,694,875,886,889,740,740,517,309,1135,1136,922,329,1010,980,992', +'309,1,346,988,408,410,780,1047,554,546,42,411,412,413,42,549,1211,1144', +'334,42,584,346,414,15,1164,438,535,556,438,619,127,310,415,754,438,749', +'342,334,903,310,1102,1114,940,754,758,740,829,606,15,1126,42,1007,1008', +'751,834,342,42,42,824,931,929,1086,542,826,1142,896,626,,,,877,537,42', +'42,534,536,936,1057,776,778,329,,299,,,329,,507,303,343,551,,,,,,127', +',828,1145,1040,837,1146,837,326,141,575,538,343,326,1087,929,544,754', +'671,1198,369,1141,519,,859,754,,,988,864,522,676,15,,,,15,813,,,,15', +'620,621,622,932,,822,1086,,,584,,,308,910,,144,584,,468,,458,464,1169', +',29,,,,,29,15,717,717,663,584,904,15,15,,,845,,724,743,29,1092,1093', +'1202,,1209,,,15,15,29,29,29,,29,,1086,682,1178,554,780,929,,687,943', +',925,,554,,,,346,,459,,308,,994,955,42,346,946,,29,468,855,857,334,29', +'29,860,862,29,1178,468,,334,913,,,877,877,,,959,342,,,682,,,443,,,342', +'1006,739,1086,,,,443,443,910,,,443,443,,681,,,935,923,937,686,1210,', +',,,29,740,1022,459,,29,29,29,29,29,,29,,459,308,,,343,42,,,42,,468,308', +'792,343,1179,1191,468,,,818,,933,812,,933,1056,,729,,42,,804,,,,,,,', +',675,,,15,,799,308,141,,,825,,,,,468,42,1075,,,,,,42,902,780,780,,,', +'459,800,676,1127,802,,,,459,676,888,29,29,29,29,29,29,29,1065,,,717', +'29,29,29,144,,717,717,,901,442,898,274,971,,29,,141,554,1016,442,442', +'841,854,459,442,442,584,,915,842,346,15,,,15,,850,676,,,,346,924,1037', +'1039,1090,334,,443,,1042,1044,1107,1045,,15,,334,,,29,,,,342,1015,,29', +'29,,,435,1120,,1121,342,29,,854,,960,,15,,1022,438,,1022,,15,,,,,29', +'438,438,,29,676,438,438,1130,29,877,,682,,676,687,,,,,966,,42,343,,', +',42,,,,,,,343,,,676,42,,29,,,,,,29,29,,,,,,1115,,1116,780,780,1117,', +',29,29,29,,676,,,,,676,676,,,,717,1022,,717,717,,,29,450,,717,,,957', +'470,,,,717,717,717,869,,442,966,,1030,,880,968,1034,,,,381,381,1052', +'42,381,1147,,1149,1076,,,,,,,42,,,,,,,,,,1088,,1160,1161,1162,1163,15', +',,,,15,,,,,,,,914,29,933,15,717,1015,42,754,1015,,1015,,42,,381,381', +'381,381,,,,438,,1197,,1026,,1192,,,676,676,676,1064,,,717,1031,,,,,888', +',1203,,1204,,1205,,,,717,,,,,,346,29,966,42,956,,,,1207,,346,29,,958', +'1061,,287,,1217,15,,,42,,,,1109,29,,,1023,15,,1015,342,1015,970,1015', +',1015,,,,,342,,,1014,447,448,,,,,,,,471,472,42,42,,,,978,1015,15,,,995', +'996,,15,1167,1168,,,717,,,346,29,,,29,,,343,1106,,1156,29,,,,,287,343', +',,42,29,,,,29,,,,,,,1173,42,342,,508,717,,,,15,18,,,1129,,18,470,,450', +'717,29,717,308,29,29,,468,29,15,,234,468,1113,29,29,,,,29,29,234,234', +'234,,18,335,335,42,,,,,,,1154,343,,717,,,,676,,,,15,15,1165,,,1079,1080', +'1081,,18,,,,,234,234,717,,234,392,402,402,,,,,459,760,,,,,718,718,381', +',,1023,,,1023,15,,1023,,1023,17,,1199,,,17,,,15,638,,1014,,,1014,,1014', +',,,,18,,,,,234,234,234,234,18,,18,,17,,,,,,,,,,1096,1098,1100,,,,,,', +',15,,,,,,,29,,,17,,29,29,,,,,,,,,,29,,,1023,,1023,,1023,,1023,,,,,,', +',,29,,1014,379,1014,,1014,,1014,,856,858,,,,861,863,1023,,,18,234,440', +'234,234,440,234,17,,,,440,234,234,1014,,17,,17,,,,,,,18,,,,,,,,,,,29', +',,,,,,,,1206,,,29,,762,,,,,,,1181,1183,1185,1187,,1188,,,,,,,,,234,', +',,,,29,234,234,,,,29,,,,234,,29,718,473,,,,,718,718,,,,17,,17,,18,17', +',,18,,,17,335,18,1213,1214,1215,1216,,,,,,,,17,,,,1218,,335,,433,446', +',,29,,,,,,,18,,,,,,18,18,,,,,29,,,,,,972,41,523,234,18,18,41,,,,,,,856', +'858,863,861,,,,,,,286,234,539,,,,,,29,29,,,41,333,333,,,,,,17,,,,17', +',,,,17,,,,,,,,,,,,528,41,530,,,532,533,,29,,,390,286,286,,,,,,17,,29', +',29,29,17,17,,,,,,234,718,,,718,718,,,,17,17,718,,,,,,,,718,718,718', +',,29,,972,41,,,,,,,,29,41,,41,,,,,,,,,,,,,,,,381,,,,18,,,,,,,,335,,234', +',,,,688,,335,,,,,,,,718,234,,,,,,667,,,,,,,,,,,,,,,,,,,726,,,,,,718', +',732,,734,,41,,738,,,,,,,,718,,,,,,,18,747,,18,,,,750,41,,234,,,,,,', +',,,234,17,,,18,,,,712,712,767,,770,,,,,,,,,381,,741,,379,,744,,,,18', +',,440,234,,,18,,,,,,440,440,,,797,440,440,,,,,,718,,,,,,,,,,,,41,,,', +'41,,,,333,41,,,,17,,,17,,787,,,,,,,,,333,718,,,,,,,,,17,741,,41,379', +'718,,718,335,41,41,,,,,,,446,,335,,,,,,41,41,17,,,17,,,,17,,,,,,17,17', +',718,,17,17,711,711,,,,,,,,,,,,,843,,,,,,718,,,741,379,,,,,,,18,,,,', +'18,234,,,,,381,381,,,,18,,,,,,916,,,,,,,,,,,,440,,,,,,,,,,712,,944,', +'741,,712,712,,,,,,911,,,912,,,,,,,,,,,,,,,,19,,,,921,19,,,,,,,,,18,', +',,939,,,41,,,,17,18,,,333,17,,,,19,337,337,,333,,,17,,,,,,,,,,,,,,234', +'977,,,17,,18,,,19,,,18,,,,,,,394,403,403,,,,,,,969,,,,,1012,,,,,,,,', +',,,,41,,,41,,,,,1035,,,711,,,17,18,,711,711,,,19,,1046,41,,17,,1104', +',19,,19,,18,,,712,1110,,712,712,,,,,,712,,,,41,,,,712,712,712,41,,,17', +'1071,1072,1073,,,17,,,,18,18,,,,,,,,,,,,,,,,,1089,,,1060,,,,,,,,,,,', +',,,,1151,710,710,379,18,,,19,17,441,,712,441,,,,,18,441,234,234,,709', +'709,,333,,17,,,,,19,,,,333,,,,,,,712,,,,,,,,,234,,,,,,,712,,,,18,17', +'17,,,,,,713,713,711,,,711,711,,,,,,711,,,,,,,,711,711,711,,41,,,,,41', +',,,,17,,,,,,41,19,,,,19,,17,,337,19,,,,,,,,,,,,,,,,,,337,,,712,,,,32', +',,,,32,19,,,711,,,19,19,,,,,17,,32,,,,,,,,19,19,32,32,32,,32,,712,,', +'41,,711,,,,,,,,,712,41,712,,,,,711,,,,,,,32,,,,,32,32,,,32,710,,,,,', +'710,710,,,,,41,,712,,,,41,,,709,,,,,,709,709,,,,,,,,,,712,,,,,715,715', +',,,32,,,,,32,32,32,32,32,,32,,,,,,,711,41,,,713,,,,,,713,713,,,286,', +',,,,41,,,,1108,,,,,,,,,,,,,,19,,711,,,,,,337,,,,,,,,711,337,711,41,41', +',,,,,,,,,,,,,,,,,32,32,32,32,32,32,32,,,,,32,32,32,,,711,,286,,,,41', +',,32,,,710,,,710,710,,,41,,,710,,711,,19,,,19,710,710,710,709,,,709', +'709,,,,,,709,,,,,,,19,709,709,709,,32,,833,,,,,32,32,,41,,,,,,32,,,', +',,19,,,441,,713,,19,713,713,,,32,441,441,713,32,710,441,441,,32,,713', +'713,713,,715,,,,,,715,715,,,,709,,,,,,,,,,,710,,,32,,,,,,32,32,,,,,', +'710,,,,,709,,,32,32,32,,,,,,,337,,,,709,713,,,,,,337,32,,,,,,,,,,,,', +',,,,,,,,,,,,713,,,,,,,,,,,,,,,,713,,,,,,,,,,,,,710,,,,19,,,,,19,,,,', +',,,,32,,19,709,,,,,,,,,,,,,,,,,441,,710,,,,,716,716,,,715,,,715,715', +'710,,710,,,715,,709,,,,,,715,715,715,713,,,,,709,32,709,,,,,,,714,714', +'32,,,,,,710,,19,,,,,,,,32,,,,19,,,,713,,,709,,,710,,,,,,,,713,,713,', +',,,715,,,,,,709,,,,19,,,,,,19,,,,,,,,,32,,,32,,,713,715,,,32,,,,,,241', +',,,32,,,715,32,,307,307,307,,713,,,,,,,,354,355,19,357,358,,360,,,,', +',,32,,403,32,32,,,32,19,,307,307,1112,32,32,,,,32,32,,,,,,,,,,,,,,,', +',,,,,,,,,,19,19,,,,,,,,,715,,716,,,,,,716,716,,,,,,,,,,,,,,,,,,403,', +',,19,,,,,,,,,715,714,,,19,,,714,714,,,,,,715,,715,,,,,,,,,,,,,,,,,,', +',,,,,,,,,,,,,,,19,,715,,,,,32,,,,,32,32,,,,307,445,,,451,307,32,,,715', +'451,,,,,,,,,,,,,241,32,,,,484,485,486,487,488,489,490,491,492,493,494', +'495,496,497,498,499,500,501,502,503,504,505,,,,,506,,,,,,,,,,,716,,', +'716,716,,,,,,716,,307,307,,32,,,716,716,716,307,,,,,,32,307,,307,,,307', +'307,,,,,714,,,714,714,,,,,,714,,,,,,,32,714,714,714,,,32,,,,,,32,,,', +',,,559,,560,,,,,716,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,716,,,32,,,,714,', +',,,,,,,716,,,,,,32,,,,,,,,,,,,,,307,,,714,,,,,,,,,,,,,,,,714,,,,32,32', +',,,,,,,,,,,,,,,,,,307,,451,451,451,,,,,,,,,,,,,,,,716,32,,,,,,,,,,,', +',32,,32,32,355,,,,,,,,,,307,,307,,307,,,,,,,714,716,,,,,,,,307,32,,', +',,716,,716,,451,,32,761,,,,763,,,,,,,,,,,,,,714,,,,,,,,,,,,307,716,714', +',714,,,,,,,,,,794,,,,,,307,,,307,,716,,,,,,,,,,,307,307,,,714,,,,,,', +'307,,,,,,,,,,,,,,,,,714,,,,,,,,,,,,,,,,307,451,307,,,,851,,,307,307', +'451,451,,,,451,451,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,307', +',,,,,,,,307,,,307,,,,,,,,,,,,,,,,,,,,307,,,,,,,,,,,,,,307,,,,,,,,,,', +',,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,307,,,,,,,,451', +',,,,,,,,,,,,451,451,451,451,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1009,,,,,,,', +',,,,,,,,,,,,1027,,,,,,,,,,,,,,,,,,,,,,,,,,,,1050,,,,,,,,,307,,,,,,,', +',,,,,,,,,,,307,451,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,', +',,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,', +',,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,307' ] + racc_goto_table = arr = ::Array.new(4137, nil) + idx = 0 + clist.each do |str| + str.split(',', -1).each do |i| + arr[idx] = i.to_i unless i.empty? + idx += 1 + end + end + +clist = [ +'71,74,74,33,154,71,67,35,111,42,44,106,33,112,194,74,51,51,51,82,82', +'7,71,54,54,116,194,19,19,86,86,19,12,93,71,71,71,35,87,87,87,24,24,31', +'86,56,233,91,171,76,76,135,135,45,45,72,224,224,82,82,82,110,22,13,71', +'8,9,17,17,5,8,40,40,87,71,71,71,89,89,89,68,90,90,28,142,19,19,19,19', +'28,54,142,45,45,45,116,225,224,10,79,11,13,109,109,10,10,47,47,131,142', +'88,88,89,89,88,31,20,91,23,20,183,225,71,23,63,20,229,64,188,8,233,71', +'196,71,153,153,172,118,57,5,125,141,219,219,143,47,47,47,94,49,94,2', +'23,69,55,55,55,127,145,128,148,6,37,37,62,62,62,230,223,209,209,209', +'209,147,189,153,201,140,93,198,198,3,23,219,218,218,14,8,174,174,189', +'157,23,223,208,208,8,233,8,16,174,73,73,157,81,81,18,21,51,25,27,188', +'38,39,41,48,71,74,50,33,59,171,171,142,77,87,87,83,85,92,104,105,113', +'115,119,196,196,145,120,194,23,71,111,121,122,123,124,196,129,23,230', +'23,187,133,138,139,146,149,150,22,22,33,151,22,152,188,148,174,155,22', +'156,158,160,54,54,161,164,90,6,147,51,51,11,165,2,166,167,168,72,51', +'169,170,173,176,178,179,31,180,184,185,94,94,87,87,191,192,200,11,143', +'172,172,87,1,82,196,204,205,126,125,67,33,71,206,207,210,71,35,188,141', +'71,71,224,82,211,23,128,23,7,33,23,19,116,89,212,54,23,69,45,71,57,89', +'145,142,127,54,69,94,213,35,23,13,71,198,198,31,214,45,71,71,217,227', +'225,187,68,10,228,72,33,,,,37,9,71,71,5,8,229,172,222,222,11,,90,,,11', +',49,90,47,79,,,,,,116,,153,142,135,209,142,209,63,74,219,64,47,63,183', +'225,64,54,33,110,118,131,62,,56,54,,,196,56,62,35,23,,,,23,31,,,,23', +'11,11,5,196,,31,187,,,224,,,51,93,,76,224,,74,,54,54,171,,58,,,,,58', +'23,71,71,17,224,91,23,23,,,31,,35,233,58,135,135,142,,13,,,23,23,58', +'58,58,,58,,187,90,187,67,126,225,,90,126,,91,,67,,,,82,,90,,51,,72,109', +'71,82,88,,58,74,28,28,71,58,58,28,28,58,187,74,,71,69,,,37,37,,,10,45', +',,90,,,20,,,45,37,89,187,,,,20,20,93,,,20,20,,55,,,140,24,140,55,112', +',,,,58,94,224,90,,58,58,58,58,58,,58,,90,51,,,47,71,,,71,,74,51,116', +'47,135,12,74,,,40,,136,87,,136,37,,55,,71,,116,,,,,,,,,32,,,23,,89,51', +'74,,,116,,,,,74,71,37,,,,,,71,106,126,126,,,,90,11,35,111,11,,,,90,35', +'35,58,58,58,58,58,58,58,10,,,71,58,58,58,76,,71,71,,154,22,42,44,28', +',58,,74,67,140,22,22,17,89,90,22,22,224,,67,8,82,23,,,23,,8,35,,,,82', +'86,222,222,10,71,,20,,222,222,109,222,,23,,71,,,58,,,,45,136,,58,58', +',,87,109,,109,45,58,,89,,19,,23,,224,23,,224,,23,,,,,58,23,23,,58,35', +'23,23,10,58,37,,90,,35,90,,,,,35,,71,47,,,,71,,,,,,,47,,,35,71,,58,', +',,,,58,58,,,,,,140,,140,126,126,140,,,58,58,58,,35,,,,,35,35,,,,71,224', +',71,71,,,58,78,,71,,,11,78,,,,71,71,71,32,,22,35,,86,,32,11,86,,,,26', +'26,19,71,26,140,,140,194,,,,,,,71,,,,,,,,,,194,,222,222,222,222,23,', +',,,23,,,,,,,,32,58,136,23,71,136,71,54,136,,136,,71,,26,26,26,26,,,', +'23,,140,,11,,31,,,35,35,35,116,,,71,11,,,,,35,,140,,140,,140,,,,71,', +',,,,82,58,35,71,32,,,,222,,82,58,,32,11,,71,,140,23,,,71,,,,71,58,,', +'226,23,,136,45,136,32,136,,136,,,,,45,,,130,26,26,,,,,,,,26,26,71,71', +',,,32,136,23,,,32,32,,23,19,19,,,71,,,82,58,,,58,,,47,11,,33,58,,,,', +'71,47,,,71,58,,,,58,,,,,,,35,71,45,,26,71,,,,23,30,,,11,,30,78,,78,71', +'58,71,51,58,58,,74,58,23,,30,74,23,58,58,,,,58,58,30,30,30,,30,30,30', +'71,,,,,,,11,47,,71,,,,35,,,,23,23,11,,,32,32,32,,30,,,,,30,30,71,,30', +'30,30,30,,,,,90,78,,,,,108,108,26,,,226,,,226,23,,226,,226,29,,11,,', +'29,,,23,26,,130,,,130,,130,,,,,30,,,,,30,30,30,30,30,,30,,29,,,,,,,', +',,137,137,137,,,,,,,,23,,,,,,,58,,,29,,58,58,,,,,,,,,,58,,,226,,226', +',226,,226,,,,,,,,,58,,130,84,130,,130,,130,,78,78,,,,78,78,226,,,30', +'30,30,30,30,30,30,29,,,,30,30,30,130,,29,,29,,,,,,,30,,,,,,,,,,,58,', +',,,,,,,32,,,58,,26,,,,,,,137,137,137,137,,137,,,,,,,,,30,,,,,,58,30', +'30,,,,58,,,,30,,58,108,65,,,,,108,108,,,,29,,29,,30,29,,,30,,,29,30', +'30,137,137,137,137,,,,,,,,29,,,,137,,30,,84,84,,,58,,,,,,,30,,,,,,30', +'30,,,,,58,,,,,,78,70,65,30,30,30,70,,,,,,,78,78,78,78,,,,,,,70,30,65', +',,,,,58,58,,,70,70,70,,,,,,29,,,,29,,,,,29,,,,,,,,,,,,84,70,84,,,84', +'84,,58,,,70,70,70,,,,,,29,,58,,58,58,29,29,,,,,,30,108,,,108,108,,,', +'29,29,108,,,,,,,,108,108,108,,,58,,78,70,,,,,,,,58,70,,70,,,,,,,,,,', +',,,,,26,,,,30,,,,,,,,30,,30,,,,,65,,30,,,,,,,,108,30,,,,,,84,,,,,,,', +',,,,,,,,,,,65,,,,,,108,,65,,65,,70,,65,,,,,,,,108,,,,,,,30,65,,30,,', +',65,70,,30,,,,,,,,,,30,29,,,30,,,,99,99,65,,65,,,,,,,,,26,,84,,84,,84', +',,,30,,,30,30,,,30,,,,,,30,30,,,65,30,30,,,,,,108,,,,,,,,,,,,70,,,,70', +',,,70,70,,,,29,,,29,,84,,,,,,,,,70,108,,,,,,,,,29,84,,70,84,108,,108', +'30,70,70,,,,,,,84,,30,,,,,,70,70,29,,,29,,,,29,,,,,,29,29,,108,,29,29', +'98,98,,,,,,,,,,,,,84,,,,,,108,,,84,84,,,,,,,30,,,,,30,30,,,,,26,26,', +',,30,,,,,,65,,,,,,,,,,,,30,,,,,,,,,,99,,65,,84,,99,99,,,,,,84,,,84,', +',,,,,,,,,,,,,,34,,,,84,34,,,,,,,,,30,,,,84,,,70,,,,29,30,,,70,29,,,', +'34,34,34,,70,,,29,,,,,,,,,,,,,,30,65,,,29,,30,,,34,,,30,,,,,,,34,34', +'34,,,,,,,84,,,,,65,,,,,,,,,,,,,70,,,70,,,,,65,,,98,,,29,30,,98,98,,', +'34,,65,70,,29,,30,,34,,34,,30,,,99,30,,99,99,,,,,,99,,,,70,,,,99,99', +'99,70,,,29,65,65,65,,,29,,,,30,30,,,,,,,,,,,,,,,,,65,,,84,,,,,,,,,,', +',,,,,30,97,97,84,30,,,34,29,34,,99,34,,,,,30,34,30,30,,96,96,,70,,29', +',,,,34,,,,70,,,,,,,99,,,,,,,,,30,,,,,,,99,,,,30,29,29,,,,,,100,100,98', +',,98,98,,,,,,98,,,,,,,,98,98,98,,70,,,,,70,,,,,29,,,,,,70,34,,,,34,', +'29,,34,34,,,,,,,,,,,,,,,,,,34,,,99,,,,61,,,,,61,34,,,98,,,34,34,,,,', +'29,,61,,,,,,,,34,34,61,61,61,,61,,99,,,70,,98,,,,,,,,,99,70,99,,,,,98', +',,,,,,61,,,,,61,61,,,61,97,,,,,,97,97,,,,,70,,99,,,,70,,,96,,,,,,96', +'96,,,,,,,,,,99,,,,,102,102,,,,61,,,,,61,61,61,61,61,,61,,,,,,,98,70', +',,100,,,,,,100,100,,,70,,,,,,70,,,,70,,,,,,,,,,,,,,34,,98,,,,,,34,,', +',,,,,98,34,98,70,70,,,,,,,,,,,,,,,,,,61,61,61,61,61,61,61,,,,,61,61', +'61,,,98,,70,,,,70,,,61,,,97,,,97,97,,,70,,,97,,98,,34,,,34,97,97,97', +'96,,,96,96,,,,,,96,,,,,,,34,96,96,96,,61,,34,,,,,61,61,,70,,,,,,61,', +',,,,34,,,34,,100,,34,100,100,,,61,34,34,100,61,97,34,34,,61,,100,100', +'100,,102,,,,,,102,102,,,,96,,,,,,,,,,,97,,,61,,,,,,61,61,,,,,,97,,,', +',96,,,61,61,61,,,,,,,34,,,,96,100,,,,,,34,61,,,,,,,,,,,,,,,,,,,,,,,', +',100,,,,,,,,,,,,,,,,100,,,,,,,,,,,,,97,,,,34,,,,,34,,,,,,,,,61,,34,96', +',,,,,,,,,,,,,,,,34,,97,,,,,103,103,,,102,,,102,102,97,,97,,,102,,96', +',,,,,102,102,102,100,,,,,96,61,96,,,,,,,101,101,61,,,,,,97,,34,,,,,', +',,61,,,,34,,,,100,,,96,,,97,,,,,,,,100,,100,,,,,102,,,,,,96,,,,34,,', +',,,34,,,,,,,,,61,,,61,,,100,102,,,61,,,,,,36,,,,61,,,102,61,,36,36,36', +',100,,,,,,,,36,36,34,36,36,,36,,,,,,,61,,34,61,61,,,61,34,,36,36,34', +'61,61,,,,61,61,,,,,,,,,,,,,,,,,,,,,,,,,,34,34,,,,,,,,,102,,103,,,,,', +'103,103,,,,,,,,,,,,,,,,,,34,,,,34,,,,,,,,,102,101,,,34,,,101,101,,,', +',,102,,102,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,34,,102,,,,,61,,,,,61,61', +',,,36,36,,,36,36,61,,,102,36,,,,,,,,,,,,,36,61,,,,36,36,36,36,36,36', +'36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,,,,,36,,,,,,,,,,,103', +',,103,103,,,,,,103,,36,36,,61,,,103,103,103,36,,,,,,61,36,,36,,,36,36', +',,,,101,,,101,101,,,,,,101,,,,,,,61,101,101,101,,,61,,,,,,61,,,,,,,36', +',36,,,,,103,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,103,,,61,,,,101,,,,,,,,,103', +',,,,,61,,,,,,,,,,,,,,36,,,101,,,,,,,,,,,,,,,,101,,,,61,61,,,,,,,,,,', +',,,,,,,,36,,36,36,36,,,,,,,,,,,,,,,,103,61,,,,,,,,,,,,,61,,61,61,36', +',,,,,,,,,36,,36,,36,,,,,,,101,103,,,,,,,,36,61,,,,,103,,103,,36,,61', +'36,,,,36,,,,,,,,,,,,,,101,,,,,,,,,,,,36,103,101,,101,,,,,,,,,,36,,,', +',,36,,,36,,103,,,,,,,,,,,36,36,,,101,,,,,,,36,,,,,,,,,,,,,,,,,101,,', +',,,,,,,,,,,,,36,36,36,,,,36,,,36,36,36,36,,,,36,36,,,,,,,,,,,,,,,,,', +',,,,,,,,,,,,,,,,,,,,,,,,,,,,,,36,,,,,,,,,36,,,36,,,,,,,,,,,,,,,,,,,', +'36,,,,,,,,,,,,,,36,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,', +',,,,,,,,,,,,,,,36,,,,,,,,36,,,,,,,,,,,,,36,36,36,36,,,,,,,,,,,,,,,,', +',,,,,,,,,,,,36,,,,,,,,,,,,,,,,,,,,36,,,,,,,,,,,,,,,,,,,,,,,,,,,,36,', +',,,,,,,36,,,,,,,,,,,,,,,,,,,36,36,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,', +',,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,', +',,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,', +',,,,,,,,,,36' ] + racc_goto_check = arr = ::Array.new(4137, nil) + idx = 0 + clist.each do |str| + str.split(',', -1).each do |i| + arr[idx] = i.to_i unless i.empty? + idx += 1 + end + end + +racc_goto_pointer = [ + nil, 312, 149, 181, nil, 64, 154, 16, 63, 57, + -265, 64, -531, -701, -732, nil, -336, 57, 195, -44, + -104, 131, 40, 116, -178, -10, 832, 74, -140, 1226, + 1125, -181, 196, -15, 2017, -14, 2981, -320, -33, -33, + -2, -405, -15, nil, -14, 16, nil, 69, 191, 122, + -289, -16, nil, nil, -202, 125, -250, -382, 471, -293, + nil, 2372, 132, 88, 91, 1203, nil, -31, 42, -197, + 1505, -2, -345, 124, -9, nil, 39, -205, 654, 53, + nil, 152, -18, 178, 1258, 161, -23, 6, -264, 45, + 52, -249, -281, -277, -377, nil, 1768, 1747, 1430, 1286, + 1817, 2433, 2009, 2394, 206, 163, -58, nil, 732, -280, + -739, -380, -609, 156, nil, -171, 20, nil, 84, 169, + -133, 177, -392, -580, -160, -801, -268, -428, -783, -693, + 145, -663, nil, -654, nil, -519, -142, 256, -762, -652, + -189, -766, -684, -592, nil, -670, -812, -895, -908, -150, + -569, 177, -376, -232, -21, -696, -695, -318, -19, nil, + -28, -26, nil, nil, -452, -778, -668, -913, -523, -831, + -662, -653, -565, -661, -686, nil, -577, nil, -577, -405, + -403, nil, nil, -582, -404, -404, nil, -629, -873, -950, + nil, -770, -769, nil, -76, nil, -639, nil, -528, nil, + -459, -746, nil, nil, 227, 223, 228, 228, -218, -241, + 228, 236, 245, -289, -282, nil, nil, -268, -158, -224, + nil, nil, -184, -600, -310, -672, 128, -401, -716, -649, + -930, nil, nil, -481 ] + +racc_goto_default = [ + nil, nil, nil, nil, 5, nil, 6, 389, 324, nil, + nil, 563, nil, 948, nil, 321, 322, nil, nil, nil, + 13, 14, 20, 239, nil, nil, 16, nil, 439, 240, + 353, nil, nil, 634, 238, 474, 23, 997, nil, nil, + nil, nil, nil, 384, 143, 52, 24, 53, nil, nil, + nil, 25, 26, 27, 757, nil, nil, nil, 341, nil, + 28, 338, 453, 35, nil, nil, 37, 40, 39, nil, + 235, 236, 401, nil, 461, 142, 87, nil, 444, 103, + 49, nil, 54, 273, 313, nil, 919, 454, nil, 455, + 466, nil, 683, 524, 311, 297, 55, 56, 57, 58, + 59, 60, 61, 62, 63, nil, 298, 69, 70, nil, + nil, nil, nil, nil, 77, nil, 616, 78, 363, nil, + nil, nil, nil, nil, nil, 782, 583, nil, 783, 784, + 571, 565, 566, 1143, 1013, nil, 572, nil, nil, nil, + 601, nil, 574, nil, 906, nil, nil, nil, 581, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 465, + nil, nil, 736, 728, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 882, nil, 696, 705, 697, 698, nil, + nil, 699, 700, nil, nil, nil, 881, 883, nil, 884, + 982, 983, 984, 985, nil, 989, 592, 990, 704, 706, + nil, nil, 86, 88, 89, nil, nil, nil, nil, 644, + nil, nil, nil, nil, nil, 99, 100, nil, 364, 926, + 367, 570, 769, 573, 938, 586, 588, 589, 1024, 593, + 1025, 596, 599, 316 ] + +racc_reduce_table = [ + 0, 0, :racc_error, + 0, 150, :_reduce_1, + 2, 148, :_reduce_2, + 2, 149, :_reduce_3, + 0, 151, :_reduce_4, + 1, 151, :_reduce_5, + 3, 151, :_reduce_6, + 2, 151, :_reduce_7, + 1, 153, :_reduce_none, + 2, 153, :_reduce_9, + 3, 156, :_reduce_10, + 4, 157, :_reduce_11, + 2, 158, :_reduce_12, + 0, 162, :_reduce_13, + 1, 162, :_reduce_14, + 3, 162, :_reduce_15, + 2, 162, :_reduce_16, + 1, 163, :_reduce_none, + 2, 163, :_reduce_18, + 0, 174, :_reduce_19, + 4, 155, :_reduce_20, + 3, 155, :_reduce_21, + 3, 155, :_reduce_22, + 3, 155, :_reduce_23, + 2, 155, :_reduce_24, + 3, 155, :_reduce_25, + 3, 155, :_reduce_26, + 3, 155, :_reduce_27, + 3, 155, :_reduce_28, + 3, 155, :_reduce_29, + 4, 155, :_reduce_30, + 1, 155, :_reduce_none, + 3, 155, :_reduce_32, + 3, 155, :_reduce_33, + 5, 155, :_reduce_34, + 3, 155, :_reduce_35, + 1, 155, :_reduce_none, + 3, 167, :_reduce_37, + 3, 167, :_reduce_38, + 6, 167, :_reduce_39, + 5, 167, :_reduce_40, + 5, 167, :_reduce_41, + 5, 167, :_reduce_42, + 5, 167, :_reduce_43, + 3, 167, :_reduce_44, + 1, 175, :_reduce_none, + 3, 175, :_reduce_46, + 1, 175, :_reduce_none, + 1, 173, :_reduce_none, + 3, 173, :_reduce_49, + 3, 173, :_reduce_50, + 3, 173, :_reduce_51, + 2, 173, :_reduce_52, + 0, 185, :_reduce_53, + 4, 173, :_reduce_54, + 0, 186, :_reduce_55, + 4, 173, :_reduce_56, + 1, 173, :_reduce_none, + 1, 166, :_reduce_none, + 0, 190, :_reduce_59, + 3, 187, :_reduce_60, + 1, 189, :_reduce_61, + 2, 192, :_reduce_62, + 0, 197, :_reduce_63, + 5, 194, :_reduce_64, + 1, 169, :_reduce_none, + 1, 169, :_reduce_none, + 1, 199, :_reduce_none, + 4, 199, :_reduce_68, + 0, 206, :_reduce_69, + 4, 203, :_reduce_70, + 1, 205, :_reduce_none, + 2, 198, :_reduce_72, + 3, 198, :_reduce_73, + 4, 198, :_reduce_74, + 5, 198, :_reduce_75, + 4, 198, :_reduce_76, + 5, 198, :_reduce_77, + 2, 198, :_reduce_78, + 2, 198, :_reduce_79, + 2, 198, :_reduce_80, + 2, 198, :_reduce_81, + 2, 198, :_reduce_82, + 1, 168, :_reduce_83, + 3, 168, :_reduce_84, + 1, 211, :_reduce_85, + 3, 211, :_reduce_86, + 1, 210, :_reduce_none, + 2, 210, :_reduce_88, + 3, 210, :_reduce_89, + 5, 210, :_reduce_90, + 2, 210, :_reduce_91, + 4, 210, :_reduce_92, + 2, 210, :_reduce_93, + 4, 210, :_reduce_94, + 1, 210, :_reduce_95, + 3, 210, :_reduce_96, + 1, 214, :_reduce_none, + 3, 214, :_reduce_98, + 2, 213, :_reduce_99, + 3, 213, :_reduce_100, + 1, 216, :_reduce_101, + 3, 216, :_reduce_102, + 1, 215, :_reduce_103, + 1, 215, :_reduce_104, + 4, 215, :_reduce_105, + 3, 215, :_reduce_106, + 3, 215, :_reduce_107, + 3, 215, :_reduce_108, + 3, 215, :_reduce_109, + 2, 215, :_reduce_110, + 1, 215, :_reduce_111, + 1, 170, :_reduce_112, + 1, 170, :_reduce_113, + 4, 170, :_reduce_114, + 3, 170, :_reduce_115, + 3, 170, :_reduce_116, + 3, 170, :_reduce_117, + 3, 170, :_reduce_118, + 2, 170, :_reduce_119, + 1, 170, :_reduce_120, + 1, 219, :_reduce_121, + 1, 219, :_reduce_none, + 2, 220, :_reduce_123, + 1, 220, :_reduce_124, + 3, 220, :_reduce_125, + 1, 191, :_reduce_none, + 1, 191, :_reduce_none, + 1, 191, :_reduce_none, + 1, 191, :_reduce_none, + 1, 191, :_reduce_none, + 1, 164, :_reduce_131, + 1, 164, :_reduce_none, + 1, 165, :_reduce_133, + 0, 224, :_reduce_134, + 4, 165, :_reduce_135, + 1, 221, :_reduce_none, + 1, 221, :_reduce_none, + 1, 221, :_reduce_none, + 1, 221, :_reduce_none, + 1, 221, :_reduce_none, + 1, 221, :_reduce_none, + 1, 221, :_reduce_none, + 1, 221, :_reduce_none, + 1, 221, :_reduce_none, + 1, 221, :_reduce_none, + 1, 221, :_reduce_none, + 1, 221, :_reduce_none, + 1, 221, :_reduce_none, + 1, 221, :_reduce_none, + 1, 221, :_reduce_none, + 1, 221, :_reduce_none, + 1, 221, :_reduce_none, + 1, 221, :_reduce_none, + 1, 221, :_reduce_none, + 1, 221, :_reduce_none, + 1, 221, :_reduce_none, + 1, 221, :_reduce_none, + 1, 221, :_reduce_none, + 1, 221, :_reduce_none, + 1, 221, :_reduce_none, + 1, 221, :_reduce_none, + 1, 221, :_reduce_none, + 1, 221, :_reduce_none, + 1, 221, :_reduce_none, + 1, 221, :_reduce_none, + 1, 222, :_reduce_none, + 1, 222, :_reduce_none, + 1, 222, :_reduce_none, + 1, 222, :_reduce_none, + 1, 222, :_reduce_none, + 1, 222, :_reduce_none, + 1, 222, :_reduce_none, + 1, 222, :_reduce_none, + 1, 222, :_reduce_none, + 1, 222, :_reduce_none, + 1, 222, :_reduce_none, + 1, 222, :_reduce_none, + 1, 222, :_reduce_none, + 1, 222, :_reduce_none, + 1, 222, :_reduce_none, + 1, 222, :_reduce_none, + 1, 222, :_reduce_none, + 1, 222, :_reduce_none, + 1, 222, :_reduce_none, + 1, 222, :_reduce_none, + 1, 222, :_reduce_none, + 1, 222, :_reduce_none, + 1, 222, :_reduce_none, + 1, 222, :_reduce_none, + 1, 222, :_reduce_none, + 1, 222, :_reduce_none, + 1, 222, :_reduce_none, + 1, 222, :_reduce_none, + 1, 222, :_reduce_none, + 1, 222, :_reduce_none, + 1, 222, :_reduce_none, + 1, 222, :_reduce_none, + 1, 222, :_reduce_none, + 1, 222, :_reduce_none, + 1, 222, :_reduce_none, + 1, 222, :_reduce_none, + 1, 222, :_reduce_none, + 1, 222, :_reduce_none, + 1, 222, :_reduce_none, + 1, 222, :_reduce_none, + 1, 222, :_reduce_none, + 3, 183, :_reduce_207, + 3, 183, :_reduce_208, + 6, 183, :_reduce_209, + 5, 183, :_reduce_210, + 5, 183, :_reduce_211, + 5, 183, :_reduce_212, + 5, 183, :_reduce_213, + 4, 183, :_reduce_214, + 3, 183, :_reduce_215, + 3, 183, :_reduce_216, + 3, 183, :_reduce_217, + 2, 183, :_reduce_218, + 2, 183, :_reduce_219, + 2, 183, :_reduce_220, + 2, 183, :_reduce_221, + 3, 183, :_reduce_222, + 3, 183, :_reduce_223, + 3, 183, :_reduce_224, + 3, 183, :_reduce_225, + 3, 183, :_reduce_226, + 3, 183, :_reduce_227, + 4, 183, :_reduce_228, + 2, 183, :_reduce_229, + 2, 183, :_reduce_230, + 3, 183, :_reduce_231, + 3, 183, :_reduce_232, + 3, 183, :_reduce_233, + 3, 183, :_reduce_234, + 1, 183, :_reduce_none, + 3, 183, :_reduce_236, + 3, 183, :_reduce_237, + 3, 183, :_reduce_238, + 3, 183, :_reduce_239, + 3, 183, :_reduce_240, + 2, 183, :_reduce_241, + 2, 183, :_reduce_242, + 3, 183, :_reduce_243, + 3, 183, :_reduce_244, + 3, 183, :_reduce_245, + 3, 183, :_reduce_246, + 3, 183, :_reduce_247, + 6, 183, :_reduce_248, + 4, 183, :_reduce_249, + 6, 183, :_reduce_250, + 4, 183, :_reduce_251, + 6, 183, :_reduce_252, + 1, 183, :_reduce_none, + 1, 230, :_reduce_none, + 1, 230, :_reduce_none, + 1, 230, :_reduce_none, + 1, 230, :_reduce_none, + 3, 227, :_reduce_258, + 3, 227, :_reduce_259, + 1, 231, :_reduce_none, + 1, 232, :_reduce_none, + 2, 232, :_reduce_none, + 4, 232, :_reduce_263, + 2, 232, :_reduce_264, + 1, 225, :_reduce_none, + 3, 225, :_reduce_266, + 3, 237, :_reduce_267, + 5, 237, :_reduce_268, + 3, 237, :_reduce_269, + 0, 239, :_reduce_270, + 1, 239, :_reduce_none, + 0, 178, :_reduce_272, + 1, 178, :_reduce_none, + 2, 178, :_reduce_none, + 4, 178, :_reduce_275, + 2, 178, :_reduce_276, + 1, 209, :_reduce_277, + 2, 209, :_reduce_278, + 2, 209, :_reduce_279, + 4, 209, :_reduce_280, + 1, 209, :_reduce_281, + 0, 242, :_reduce_282, + 2, 202, :_reduce_283, + 2, 241, :_reduce_284, + 2, 240, :_reduce_285, + 0, 240, :_reduce_286, + 1, 234, :_reduce_287, + 2, 234, :_reduce_288, + 3, 234, :_reduce_289, + 4, 234, :_reduce_290, + 1, 172, :_reduce_291, + 1, 172, :_reduce_none, + 3, 171, :_reduce_293, + 4, 171, :_reduce_294, + 2, 171, :_reduce_295, + 1, 229, :_reduce_none, + 1, 229, :_reduce_none, + 1, 229, :_reduce_none, + 1, 229, :_reduce_none, + 1, 229, :_reduce_none, + 1, 229, :_reduce_none, + 1, 229, :_reduce_none, + 1, 229, :_reduce_none, + 1, 229, :_reduce_none, + 1, 229, :_reduce_none, + 1, 229, :_reduce_306, + 0, 266, :_reduce_307, + 4, 229, :_reduce_308, + 0, 267, :_reduce_309, + 4, 229, :_reduce_310, + 0, 268, :_reduce_311, + 4, 229, :_reduce_312, + 3, 229, :_reduce_313, + 3, 229, :_reduce_314, + 2, 229, :_reduce_315, + 3, 229, :_reduce_316, + 3, 229, :_reduce_317, + 1, 229, :_reduce_318, + 4, 229, :_reduce_319, + 3, 229, :_reduce_320, + 1, 229, :_reduce_321, + 5, 229, :_reduce_322, + 4, 229, :_reduce_323, + 3, 229, :_reduce_324, + 2, 229, :_reduce_325, + 1, 229, :_reduce_none, + 2, 229, :_reduce_327, + 1, 229, :_reduce_none, + 6, 229, :_reduce_329, + 6, 229, :_reduce_330, + 4, 229, :_reduce_331, + 4, 229, :_reduce_332, + 5, 229, :_reduce_333, + 4, 229, :_reduce_334, + 5, 229, :_reduce_335, + 6, 229, :_reduce_336, + 0, 269, :_reduce_337, + 6, 229, :_reduce_338, + 0, 270, :_reduce_339, + 7, 229, :_reduce_340, + 0, 271, :_reduce_341, + 5, 229, :_reduce_342, + 4, 229, :_reduce_343, + 4, 229, :_reduce_344, + 1, 229, :_reduce_345, + 1, 229, :_reduce_346, + 1, 229, :_reduce_347, + 1, 229, :_reduce_348, + 1, 177, :_reduce_none, + 1, 261, :_reduce_350, + 1, 264, :_reduce_351, + 1, 193, :_reduce_352, + 1, 208, :_reduce_353, + 1, 256, :_reduce_none, + 1, 256, :_reduce_none, + 2, 256, :_reduce_356, + 1, 188, :_reduce_none, + 1, 188, :_reduce_none, + 1, 257, :_reduce_none, + 5, 257, :_reduce_360, + 1, 160, :_reduce_none, + 2, 160, :_reduce_362, + 1, 260, :_reduce_none, + 1, 260, :_reduce_none, + 1, 272, :_reduce_365, + 3, 272, :_reduce_366, + 1, 275, :_reduce_367, + 3, 275, :_reduce_368, + 1, 274, :_reduce_none, + 3, 274, :_reduce_370, + 5, 274, :_reduce_371, + 1, 274, :_reduce_372, + 3, 274, :_reduce_373, + 2, 276, :_reduce_374, + 1, 276, :_reduce_375, + 1, 277, :_reduce_none, + 1, 277, :_reduce_none, + 4, 280, :_reduce_378, + 2, 280, :_reduce_379, + 2, 280, :_reduce_380, + 1, 280, :_reduce_381, + 2, 284, :_reduce_382, + 0, 284, :_reduce_383, + 1, 285, :_reduce_none, + 6, 286, :_reduce_385, + 8, 286, :_reduce_386, + 4, 286, :_reduce_387, + 6, 286, :_reduce_388, + 4, 286, :_reduce_389, + 2, 286, :_reduce_none, + 6, 286, :_reduce_391, + 2, 286, :_reduce_392, + 4, 286, :_reduce_393, + 6, 286, :_reduce_394, + 2, 286, :_reduce_395, + 4, 286, :_reduce_396, + 2, 286, :_reduce_397, + 4, 286, :_reduce_398, + 1, 286, :_reduce_none, + 0, 290, :_reduce_400, + 1, 290, :_reduce_401, + 3, 291, :_reduce_402, + 4, 291, :_reduce_403, + 1, 292, :_reduce_404, + 4, 292, :_reduce_405, + 1, 293, :_reduce_406, + 3, 293, :_reduce_407, + 1, 294, :_reduce_408, + 1, 294, :_reduce_none, + 0, 298, :_reduce_410, + 0, 299, :_reduce_411, + 5, 255, :_reduce_412, + 4, 296, :_reduce_413, + 1, 296, :_reduce_414, + 0, 302, :_reduce_415, + 4, 297, :_reduce_416, + 0, 303, :_reduce_417, + 4, 297, :_reduce_418, + 0, 305, :_reduce_419, + 4, 301, :_reduce_420, + 2, 200, :_reduce_421, + 4, 200, :_reduce_422, + 5, 200, :_reduce_423, + 5, 200, :_reduce_424, + 2, 254, :_reduce_425, + 4, 254, :_reduce_426, + 4, 254, :_reduce_427, + 3, 254, :_reduce_428, + 3, 254, :_reduce_429, + 3, 254, :_reduce_430, + 2, 254, :_reduce_431, + 1, 254, :_reduce_432, + 4, 254, :_reduce_433, + 0, 307, :_reduce_434, + 4, 253, :_reduce_435, + 0, 308, :_reduce_436, + 4, 253, :_reduce_437, + 0, 309, :_reduce_438, + 3, 204, :_reduce_439, + 0, 310, :_reduce_440, + 0, 311, :_reduce_441, + 4, 304, :_reduce_442, + 5, 258, :_reduce_443, + 1, 312, :_reduce_444, + 1, 312, :_reduce_none, + 0, 315, :_reduce_446, + 0, 316, :_reduce_447, + 7, 259, :_reduce_448, + 1, 314, :_reduce_449, + 1, 314, :_reduce_none, + 1, 313, :_reduce_451, + 3, 313, :_reduce_452, + 3, 313, :_reduce_453, + 1, 317, :_reduce_none, + 2, 317, :_reduce_455, + 3, 317, :_reduce_456, + 1, 317, :_reduce_457, + 1, 317, :_reduce_458, + 1, 317, :_reduce_459, + 1, 184, :_reduce_none, + 3, 322, :_reduce_461, + 1, 322, :_reduce_none, + 3, 324, :_reduce_463, + 1, 324, :_reduce_none, + 1, 326, :_reduce_465, + 1, 327, :_reduce_466, + 1, 325, :_reduce_none, + 4, 325, :_reduce_468, + 4, 325, :_reduce_469, + 4, 325, :_reduce_470, + 3, 325, :_reduce_471, + 4, 325, :_reduce_472, + 4, 325, :_reduce_473, + 4, 325, :_reduce_474, + 3, 325, :_reduce_475, + 3, 325, :_reduce_476, + 3, 325, :_reduce_477, + 2, 325, :_reduce_478, + 0, 331, :_reduce_479, + 4, 325, :_reduce_480, + 2, 325, :_reduce_481, + 0, 332, :_reduce_482, + 4, 325, :_reduce_483, + 1, 318, :_reduce_484, + 1, 318, :_reduce_485, + 2, 318, :_reduce_486, + 3, 318, :_reduce_487, + 5, 318, :_reduce_488, + 2, 318, :_reduce_489, + 4, 318, :_reduce_490, + 1, 318, :_reduce_none, + 2, 333, :_reduce_492, + 3, 333, :_reduce_493, + 1, 320, :_reduce_494, + 3, 320, :_reduce_495, + 5, 319, :_reduce_496, + 2, 336, :_reduce_497, + 1, 336, :_reduce_498, + 1, 335, :_reduce_499, + 3, 335, :_reduce_500, + 1, 334, :_reduce_none, + 3, 321, :_reduce_502, + 1, 321, :_reduce_503, + 2, 321, :_reduce_504, + 1, 321, :_reduce_505, + 1, 337, :_reduce_506, + 3, 337, :_reduce_507, + 2, 339, :_reduce_508, + 1, 339, :_reduce_509, + 1, 340, :_reduce_510, + 3, 340, :_reduce_511, + 2, 342, :_reduce_512, + 1, 342, :_reduce_513, + 2, 344, :_reduce_514, + 1, 338, :_reduce_none, + 1, 338, :_reduce_none, + 1, 328, :_reduce_none, + 3, 328, :_reduce_518, + 3, 328, :_reduce_519, + 2, 328, :_reduce_520, + 2, 328, :_reduce_521, + 1, 328, :_reduce_none, + 1, 328, :_reduce_none, + 1, 328, :_reduce_none, + 2, 328, :_reduce_525, + 2, 328, :_reduce_526, + 1, 345, :_reduce_none, + 1, 345, :_reduce_none, + 1, 345, :_reduce_none, + 1, 345, :_reduce_none, + 1, 345, :_reduce_none, + 1, 345, :_reduce_none, + 1, 345, :_reduce_none, + 1, 345, :_reduce_none, + 1, 345, :_reduce_535, + 1, 345, :_reduce_none, + 1, 323, :_reduce_537, + 2, 346, :_reduce_538, + 2, 329, :_reduce_539, + 3, 329, :_reduce_540, + 1, 329, :_reduce_541, + 6, 159, :_reduce_542, + 0, 159, :_reduce_543, + 1, 347, :_reduce_544, + 1, 347, :_reduce_none, + 1, 347, :_reduce_none, + 2, 348, :_reduce_547, + 1, 348, :_reduce_none, + 2, 161, :_reduce_549, + 1, 161, :_reduce_none, + 1, 243, :_reduce_none, + 1, 243, :_reduce_none, + 1, 244, :_reduce_553, + 1, 350, :_reduce_554, + 2, 350, :_reduce_555, + 3, 351, :_reduce_556, + 1, 351, :_reduce_557, + 1, 351, :_reduce_558, + 3, 245, :_reduce_559, + 4, 246, :_reduce_560, + 3, 247, :_reduce_561, + 0, 354, :_reduce_562, + 3, 354, :_reduce_563, + 1, 355, :_reduce_564, + 2, 355, :_reduce_565, + 3, 249, :_reduce_566, + 0, 357, :_reduce_567, + 3, 357, :_reduce_568, + 3, 248, :_reduce_569, + 3, 250, :_reduce_570, + 0, 358, :_reduce_571, + 3, 358, :_reduce_572, + 0, 359, :_reduce_573, + 3, 359, :_reduce_574, + 0, 341, :_reduce_575, + 2, 341, :_reduce_576, + 0, 352, :_reduce_577, + 2, 352, :_reduce_578, + 0, 353, :_reduce_579, + 2, 353, :_reduce_580, + 1, 356, :_reduce_581, + 2, 356, :_reduce_582, + 0, 361, :_reduce_583, + 4, 356, :_reduce_584, + 1, 360, :_reduce_585, + 1, 360, :_reduce_586, + 1, 360, :_reduce_587, + 1, 360, :_reduce_none, + 1, 223, :_reduce_none, + 1, 223, :_reduce_none, + 1, 362, :_reduce_591, + 3, 363, :_reduce_592, + 1, 349, :_reduce_593, + 2, 349, :_reduce_594, + 1, 226, :_reduce_595, + 1, 226, :_reduce_596, + 1, 226, :_reduce_597, + 1, 226, :_reduce_598, + 1, 217, :_reduce_599, + 1, 217, :_reduce_600, + 1, 217, :_reduce_601, + 1, 217, :_reduce_602, + 1, 217, :_reduce_603, + 1, 218, :_reduce_604, + 1, 218, :_reduce_605, + 1, 218, :_reduce_606, + 1, 218, :_reduce_607, + 1, 218, :_reduce_608, + 1, 218, :_reduce_609, + 1, 218, :_reduce_610, + 1, 251, :_reduce_611, + 1, 251, :_reduce_612, + 1, 176, :_reduce_613, + 1, 176, :_reduce_614, + 1, 181, :_reduce_615, + 1, 181, :_reduce_616, + 0, 364, :_reduce_617, + 4, 262, :_reduce_618, + 0, 262, :_reduce_619, + 1, 228, :_reduce_none, + 1, 228, :_reduce_621, + 3, 365, :_reduce_622, + 5, 365, :_reduce_623, + 3, 365, :_reduce_624, + 1, 265, :_reduce_none, + 0, 367, :_reduce_626, + 3, 265, :_reduce_627, + 4, 366, :_reduce_628, + 2, 366, :_reduce_629, + 2, 366, :_reduce_630, + 1, 366, :_reduce_631, + 2, 369, :_reduce_632, + 0, 369, :_reduce_633, + 6, 300, :_reduce_634, + 8, 300, :_reduce_635, + 4, 300, :_reduce_636, + 6, 300, :_reduce_637, + 4, 300, :_reduce_638, + 6, 300, :_reduce_639, + 2, 300, :_reduce_640, + 4, 300, :_reduce_641, + 6, 300, :_reduce_642, + 2, 300, :_reduce_643, + 4, 300, :_reduce_644, + 2, 300, :_reduce_645, + 4, 300, :_reduce_646, + 1, 300, :_reduce_647, + 0, 300, :_reduce_648, + 1, 238, :_reduce_649, + 1, 295, :_reduce_650, + 1, 295, :_reduce_651, + 1, 295, :_reduce_652, + 1, 295, :_reduce_653, + 1, 273, :_reduce_none, + 1, 273, :_reduce_655, + 1, 371, :_reduce_656, + 1, 372, :_reduce_657, + 3, 372, :_reduce_658, + 1, 287, :_reduce_659, + 3, 287, :_reduce_660, + 1, 373, :_reduce_661, + 2, 374, :_reduce_662, + 1, 374, :_reduce_663, + 2, 375, :_reduce_664, + 1, 375, :_reduce_665, + 1, 281, :_reduce_666, + 3, 281, :_reduce_667, + 1, 368, :_reduce_668, + 3, 368, :_reduce_669, + 1, 343, :_reduce_none, + 1, 343, :_reduce_none, + 2, 279, :_reduce_672, + 2, 278, :_reduce_673, + 1, 278, :_reduce_674, + 3, 376, :_reduce_675, + 3, 377, :_reduce_676, + 1, 288, :_reduce_677, + 3, 288, :_reduce_678, + 1, 370, :_reduce_679, + 3, 370, :_reduce_680, + 1, 378, :_reduce_none, + 1, 378, :_reduce_none, + 2, 289, :_reduce_683, + 1, 289, :_reduce_684, + 1, 379, :_reduce_none, + 1, 379, :_reduce_none, + 2, 283, :_reduce_687, + 2, 282, :_reduce_688, + 0, 282, :_reduce_689, + 1, 195, :_reduce_none, + 3, 195, :_reduce_691, + 0, 252, :_reduce_692, + 2, 252, :_reduce_none, + 1, 236, :_reduce_694, + 3, 236, :_reduce_695, + 3, 380, :_reduce_696, + 2, 380, :_reduce_697, + 4, 380, :_reduce_698, + 2, 380, :_reduce_699, + 1, 207, :_reduce_none, + 1, 207, :_reduce_none, + 1, 207, :_reduce_none, + 1, 201, :_reduce_none, + 1, 201, :_reduce_none, + 1, 201, :_reduce_none, + 1, 201, :_reduce_none, + 1, 306, :_reduce_none, + 1, 306, :_reduce_none, + 1, 306, :_reduce_none, + 1, 196, :_reduce_none, + 1, 196, :_reduce_none, + 1, 180, :_reduce_712, + 1, 180, :_reduce_713, + 0, 152, :_reduce_none, + 1, 152, :_reduce_none, + 0, 182, :_reduce_none, + 1, 182, :_reduce_none, + 2, 212, :_reduce_718, + 2, 179, :_reduce_719, + 2, 330, :_reduce_720, + 0, 235, :_reduce_none, + 1, 235, :_reduce_none, + 1, 235, :_reduce_none, + 1, 263, :_reduce_724, + 1, 263, :_reduce_none, + 1, 154, :_reduce_none, + 2, 154, :_reduce_none, + 0, 233, :_reduce_728 ] + +racc_reduce_n = 729 + +racc_shift_n = 1219 + +racc_token_table = { + false => 0, + :error => 1, + :kCLASS => 2, + :kMODULE => 3, + :kDEF => 4, + :kUNDEF => 5, + :kBEGIN => 6, + :kRESCUE => 7, + :kENSURE => 8, + :kEND => 9, + :kIF => 10, + :kUNLESS => 11, + :kTHEN => 12, + :kELSIF => 13, + :kELSE => 14, + :kCASE => 15, + :kWHEN => 16, + :kWHILE => 17, + :kUNTIL => 18, + :kFOR => 19, + :kBREAK => 20, + :kNEXT => 21, + :kREDO => 22, + :kRETRY => 23, + :kIN => 24, + :kDO => 25, + :kDO_COND => 26, + :kDO_BLOCK => 27, + :kDO_LAMBDA => 28, + :kRETURN => 29, + :kYIELD => 30, + :kSUPER => 31, + :kSELF => 32, + :kNIL => 33, + :kTRUE => 34, + :kFALSE => 35, + :kAND => 36, + :kOR => 37, + :kNOT => 38, + :kIF_MOD => 39, + :kUNLESS_MOD => 40, + :kWHILE_MOD => 41, + :kUNTIL_MOD => 42, + :kRESCUE_MOD => 43, + :kALIAS => 44, + :kDEFINED => 45, + :klBEGIN => 46, + :klEND => 47, + :k__LINE__ => 48, + :k__FILE__ => 49, + :k__ENCODING__ => 50, + :tIDENTIFIER => 51, + :tFID => 52, + :tGVAR => 53, + :tIVAR => 54, + :tCONSTANT => 55, + :tLABEL => 56, + :tCVAR => 57, + :tNTH_REF => 58, + :tBACK_REF => 59, + :tSTRING_CONTENT => 60, + :tINTEGER => 61, + :tFLOAT => 62, + :tUPLUS => 63, + :tUMINUS => 64, + :tUNARY_NUM => 65, + :tPOW => 66, + :tCMP => 67, + :tEQ => 68, + :tEQQ => 69, + :tNEQ => 70, + :tGEQ => 71, + :tLEQ => 72, + :tANDOP => 73, + :tOROP => 74, + :tMATCH => 75, + :tNMATCH => 76, + :tDOT => 77, + :tDOT2 => 78, + :tDOT3 => 79, + :tAREF => 80, + :tASET => 81, + :tLSHFT => 82, + :tRSHFT => 83, + :tCOLON2 => 84, + :tCOLON3 => 85, + :tOP_ASGN => 86, + :tASSOC => 87, + :tLPAREN => 88, + :tLPAREN2 => 89, + :tRPAREN => 90, + :tLPAREN_ARG => 91, + :tLBRACK => 92, + :tLBRACK2 => 93, + :tRBRACK => 94, + :tLBRACE => 95, + :tLBRACE_ARG => 96, + :tSTAR => 97, + :tSTAR2 => 98, + :tAMPER => 99, + :tAMPER2 => 100, + :tTILDE => 101, + :tPERCENT => 102, + :tDIVIDE => 103, + :tDSTAR => 104, + :tPLUS => 105, + :tMINUS => 106, + :tLT => 107, + :tGT => 108, + :tPIPE => 109, + :tBANG => 110, + :tCARET => 111, + :tLCURLY => 112, + :tRCURLY => 113, + :tBACK_REF2 => 114, + :tSYMBEG => 115, + :tSTRING_BEG => 116, + :tXSTRING_BEG => 117, + :tREGEXP_BEG => 118, + :tREGEXP_OPT => 119, + :tWORDS_BEG => 120, + :tQWORDS_BEG => 121, + :tSYMBOLS_BEG => 122, + :tQSYMBOLS_BEG => 123, + :tSTRING_DBEG => 124, + :tSTRING_DVAR => 125, + :tSTRING_END => 126, + :tSTRING_DEND => 127, + :tSTRING => 128, + :tSYMBOL => 129, + :tNL => 130, + :tEH => 131, + :tCOLON => 132, + :tCOMMA => 133, + :tSPACE => 134, + :tSEMI => 135, + :tLAMBDA => 136, + :tLAMBEG => 137, + :tCHARACTER => 138, + :tRATIONAL => 139, + :tIMAGINARY => 140, + :tLABEL_END => 141, + :tANDDOT => 142, + :tBDOT2 => 143, + :tBDOT3 => 144, + :tEQL => 145, + :tLOWEST => 146 } + +racc_nt_base = 147 + +racc_use_result_var = true + +Racc_arg = [ + racc_action_table, + racc_action_check, + racc_action_default, + racc_action_pointer, + racc_goto_table, + racc_goto_check, + racc_goto_default, + racc_goto_pointer, + racc_nt_base, + racc_reduce_table, + racc_token_table, + racc_shift_n, + racc_reduce_n, + racc_use_result_var ] + +Racc_token_to_s_table = [ + "$end", + "error", + "kCLASS", + "kMODULE", + "kDEF", + "kUNDEF", + "kBEGIN", + "kRESCUE", + "kENSURE", + "kEND", + "kIF", + "kUNLESS", + "kTHEN", + "kELSIF", + "kELSE", + "kCASE", + "kWHEN", + "kWHILE", + "kUNTIL", + "kFOR", + "kBREAK", + "kNEXT", + "kREDO", + "kRETRY", + "kIN", + "kDO", + "kDO_COND", + "kDO_BLOCK", + "kDO_LAMBDA", + "kRETURN", + "kYIELD", + "kSUPER", + "kSELF", + "kNIL", + "kTRUE", + "kFALSE", + "kAND", + "kOR", + "kNOT", + "kIF_MOD", + "kUNLESS_MOD", + "kWHILE_MOD", + "kUNTIL_MOD", + "kRESCUE_MOD", + "kALIAS", + "kDEFINED", + "klBEGIN", + "klEND", + "k__LINE__", + "k__FILE__", + "k__ENCODING__", + "tIDENTIFIER", + "tFID", + "tGVAR", + "tIVAR", + "tCONSTANT", + "tLABEL", + "tCVAR", + "tNTH_REF", + "tBACK_REF", + "tSTRING_CONTENT", + "tINTEGER", + "tFLOAT", + "tUPLUS", + "tUMINUS", + "tUNARY_NUM", + "tPOW", + "tCMP", + "tEQ", + "tEQQ", + "tNEQ", + "tGEQ", + "tLEQ", + "tANDOP", + "tOROP", + "tMATCH", + "tNMATCH", + "tDOT", + "tDOT2", + "tDOT3", + "tAREF", + "tASET", + "tLSHFT", + "tRSHFT", + "tCOLON2", + "tCOLON3", + "tOP_ASGN", + "tASSOC", + "tLPAREN", + "tLPAREN2", + "tRPAREN", + "tLPAREN_ARG", + "tLBRACK", + "tLBRACK2", + "tRBRACK", + "tLBRACE", + "tLBRACE_ARG", + "tSTAR", + "tSTAR2", + "tAMPER", + "tAMPER2", + "tTILDE", + "tPERCENT", + "tDIVIDE", + "tDSTAR", + "tPLUS", + "tMINUS", + "tLT", + "tGT", + "tPIPE", + "tBANG", + "tCARET", + "tLCURLY", + "tRCURLY", + "tBACK_REF2", + "tSYMBEG", + "tSTRING_BEG", + "tXSTRING_BEG", + "tREGEXP_BEG", + "tREGEXP_OPT", + "tWORDS_BEG", + "tQWORDS_BEG", + "tSYMBOLS_BEG", + "tQSYMBOLS_BEG", + "tSTRING_DBEG", + "tSTRING_DVAR", + "tSTRING_END", + "tSTRING_DEND", + "tSTRING", + "tSYMBOL", + "tNL", + "tEH", + "tCOLON", + "tCOMMA", + "tSPACE", + "tSEMI", + "tLAMBDA", + "tLAMBEG", + "tCHARACTER", + "tRATIONAL", + "tIMAGINARY", + "tLABEL_END", + "tANDDOT", + "tBDOT2", + "tBDOT3", + "tEQL", + "tLOWEST", + "$start", + "program", + "top_compstmt", + "@1", + "top_stmts", + "opt_terms", + "top_stmt", + "terms", + "stmt", + "begin_block", + "bodystmt", + "compstmt", + "opt_rescue", + "opt_else", + "opt_ensure", + "stmts", + "stmt_or_begin", + "fitem", + "undef_list", + "expr_value", + "command_asgn", + "mlhs", + "command_call", + "lhs", + "mrhs", + "mrhs_arg", + "expr", + "@2", + "command_rhs", + "var_lhs", + "primary_value", + "opt_call_args", + "rbracket", + "call_op", + "backref", + "opt_nl", + "arg", + "p_expr", + "@3", + "@4", + "expr_value_do", + "do", + "def_name", + "@5", + "fname", + "defn_head", + "k_def", + "defs_head", + "singleton", + "dot_or_colon", + "@6", + "command", + "block_command", + "block_call", + "operation2", + "command_args", + "cmd_brace_block", + "brace_body", + "fcall", + "@7", + "operation", + "k_return", + "call_args", + "mlhs_basic", + "mlhs_inner", + "rparen", + "mlhs_head", + "mlhs_item", + "mlhs_node", + "mlhs_post", + "user_variable", + "keyword_variable", + "cname", + "cpath", + "op", + "reswords", + "symbol", + "@8", + "arg_rhs", + "simple_numeric", + "rel_expr", + "f_opt_paren_args", + "primary", + "relop", + "arg_value", + "aref_args", + "none", + "args", + "trailer", + "assocs", + "paren_args", + "args_forward", + "opt_paren_args", + "opt_block_arg", + "block_arg", + "@9", + "literal", + "strings", + "xstring", + "regexp", + "words", + "qwords", + "symbols", + "qsymbols", + "var_ref", + "assoc_list", + "brace_block", + "method_call", + "lambda", + "then", + "if_tail", + "case_body", + "p_case_body", + "for_var", + "k_class", + "superclass", + "term", + "k_module", + "f_arglist", + "@10", + "@11", + "@12", + "@13", + "@14", + "@15", + "f_marg", + "f_norm_arg", + "f_margs", + "f_marg_list", + "f_rest_marg", + "f_any_kwrest", + "f_kwrest", + "f_no_kwarg", + "block_args_tail", + "f_block_kwarg", + "opt_f_block_arg", + "f_block_arg", + "opt_block_args_tail", + "excessed_comma", + "block_param", + "f_arg", + "f_block_optarg", + "f_rest_arg", + "opt_block_param", + "block_param_def", + "opt_bv_decl", + "bv_decls", + "bvar", + "f_bad_arg", + "f_larglist", + "lambda_body", + "@16", + "@17", + "f_args", + "do_block", + "@18", + "@19", + "do_body", + "@20", + "operation3", + "@21", + "@22", + "@23", + "@24", + "@25", + "cases", + "p_top_expr", + "p_cases", + "@26", + "@27", + "p_top_expr_body", + "p_args", + "p_find", + "p_args_tail", + "p_kwargs", + "p_as", + "p_variable", + "p_alt", + "p_expr_basic", + "p_lparen", + "p_lbracket", + "p_value", + "p_const", + "rbrace", + "@28", + "@29", + "p_args_head", + "p_arg", + "p_args_post", + "p_rest", + "p_kwarg", + "p_any_kwrest", + "p_kw", + "p_kw_label", + "string_contents", + "p_kwrest", + "kwrest_mark", + "p_kwnorest", + "p_primitive", + "p_var_ref", + "exc_list", + "exc_var", + "numeric", + "string", + "string1", + "xstring_contents", + "regexp_contents", + "word_list", + "word", + "string_content", + "symbol_list", + "qword_list", + "qsym_list", + "string_dvar", + "@30", + "ssym", + "dsym", + "@31", + "f_paren_args", + "args_tail", + "@32", + "f_kwarg", + "opt_args_tail", + "f_optarg", + "f_arg_asgn", + "f_arg_item", + "f_label", + "f_kw", + "f_block_kw", + "f_opt", + "f_block_opt", + "restarg_mark", + "blkarg_mark", + "assoc" ] + +Racc_debug_parser = false + +##### State transition tables end ##### + +# reduce 0 omitted + +def _reduce_1(val, _values, result) + @current_arg_stack.push(nil) + @max_numparam_stack.push(static: true) + + result +end + +def _reduce_2(val, _values, result) + result = val[1] + + @current_arg_stack.pop + @max_numparam_stack.pop + + result +end + +def _reduce_3(val, _values, result) + result = @builder.compstmt(val[0]) + + result +end + +def _reduce_4(val, _values, result) + result = [] + + result +end + +def _reduce_5(val, _values, result) + result = [ val[0] ] + + result +end + +def _reduce_6(val, _values, result) + result = val[0] << val[2] + + result +end + +def _reduce_7(val, _values, result) + result = [ val[1] ] + + result +end + +# reduce 8 omitted + +def _reduce_9(val, _values, result) + result = @builder.preexe(val[0], *val[1]) + + result +end + +def _reduce_10(val, _values, result) + result = val + + result +end + +def _reduce_11(val, _values, result) + rescue_bodies = val[1] + else_t, else_ = val[2] + ensure_t, ensure_ = val[3] + + if rescue_bodies.empty? && !else_t.nil? + diagnostic :error, :useless_else, nil, else_t + end + + result = @builder.begin_body(val[0], + rescue_bodies, + else_t, else_, + ensure_t, ensure_) + + result +end + +def _reduce_12(val, _values, result) + result = @builder.compstmt(val[0]) + + result +end + +def _reduce_13(val, _values, result) + result = [] + + result +end + +def _reduce_14(val, _values, result) + result = [ val[0] ] + + result +end + +def _reduce_15(val, _values, result) + result = val[0] << val[2] + + result +end + +def _reduce_16(val, _values, result) + result = [ val[1] ] + + result +end + +# reduce 17 omitted + +def _reduce_18(val, _values, result) + diagnostic :error, :begin_in_method, nil, val[0] + + result +end + +def _reduce_19(val, _values, result) + @lexer.state = :expr_fname + + result +end + +def _reduce_20(val, _values, result) + result = @builder.alias(val[0], val[1], val[3]) + + result +end + +def _reduce_21(val, _values, result) + result = @builder.alias(val[0], + @builder.gvar(val[1]), + @builder.gvar(val[2])) + + result +end + +def _reduce_22(val, _values, result) + result = @builder.alias(val[0], + @builder.gvar(val[1]), + @builder.back_ref(val[2])) + + result +end + +def _reduce_23(val, _values, result) + diagnostic :error, :nth_ref_alias, nil, val[2] + + result +end + +def _reduce_24(val, _values, result) + result = @builder.undef_method(val[0], val[1]) + + result +end + +def _reduce_25(val, _values, result) + result = @builder.condition_mod(val[0], nil, + val[1], val[2]) + + result +end + +def _reduce_26(val, _values, result) + result = @builder.condition_mod(nil, val[0], + val[1], val[2]) + + result +end + +def _reduce_27(val, _values, result) + result = @builder.loop_mod(:while, val[0], val[1], val[2]) + + result +end + +def _reduce_28(val, _values, result) + result = @builder.loop_mod(:until, val[0], val[1], val[2]) + + result +end + +def _reduce_29(val, _values, result) + rescue_body = @builder.rescue_body(val[1], + nil, nil, nil, + nil, val[2]) + + result = @builder.begin_body(val[0], [ rescue_body ]) + + result +end + +def _reduce_30(val, _values, result) + result = @builder.postexe(val[0], val[1], val[2], val[3]) + + result +end + +# reduce 31 omitted + +def _reduce_32(val, _values, result) + result = @builder.multi_assign(val[0], val[1], val[2]) + + result +end + +def _reduce_33(val, _values, result) + result = @builder.assign(val[0], val[1], + @builder.array(nil, val[2], nil)) + + result +end + +def _reduce_34(val, _values, result) + rescue_body = @builder.rescue_body(val[3], + nil, nil, nil, + nil, val[4]) + begin_body = @builder.begin_body(val[2], [ rescue_body ]) + + result = @builder.multi_assign(val[0], val[1], begin_body) + + result +end + +def _reduce_35(val, _values, result) + result = @builder.multi_assign(val[0], val[1], val[2]) + + result +end + +# reduce 36 omitted + +def _reduce_37(val, _values, result) + result = @builder.assign(val[0], val[1], val[2]) + + result +end + +def _reduce_38(val, _values, result) + result = @builder.op_assign(val[0], val[1], val[2]) + + result +end + +def _reduce_39(val, _values, result) + result = @builder.op_assign( + @builder.index( + val[0], val[1], val[2], val[3]), + val[4], val[5]) + + result +end + +def _reduce_40(val, _values, result) + result = @builder.op_assign( + @builder.call_method( + val[0], val[1], val[2]), + val[3], val[4]) + + result +end + +def _reduce_41(val, _values, result) + result = @builder.op_assign( + @builder.call_method( + val[0], val[1], val[2]), + val[3], val[4]) + + result +end + +def _reduce_42(val, _values, result) + const = @builder.const_op_assignable( + @builder.const_fetch(val[0], val[1], val[2])) + result = @builder.op_assign(const, val[3], val[4]) + + result +end + +def _reduce_43(val, _values, result) + result = @builder.op_assign( + @builder.call_method( + val[0], val[1], val[2]), + val[3], val[4]) + + result +end + +def _reduce_44(val, _values, result) + @builder.op_assign(val[0], val[1], val[2]) + + result +end + +# reduce 45 omitted + +def _reduce_46(val, _values, result) + rescue_body = @builder.rescue_body(val[1], + nil, nil, nil, + nil, val[2]) + + result = @builder.begin_body(val[0], [ rescue_body ]) + + result +end + +# reduce 47 omitted + +# reduce 48 omitted + +def _reduce_49(val, _values, result) + result = @builder.logical_op(:and, val[0], val[1], val[2]) + + result +end + +def _reduce_50(val, _values, result) + result = @builder.logical_op(:or, val[0], val[1], val[2]) + + result +end + +def _reduce_51(val, _values, result) + result = @builder.not_op(val[0], nil, val[2], nil) + + result +end + +def _reduce_52(val, _values, result) + result = @builder.not_op(val[0], nil, val[1], nil) + + result +end + +def _reduce_53(val, _values, result) + @lexer.state = :expr_beg + @lexer.command_start = false + @pattern_variables.push + + result = @context.in_kwarg + @context.in_kwarg = true + + result +end + +def _reduce_54(val, _values, result) + @pattern_variables.pop + @context.in_kwarg = val[2] + result = @builder.match_pattern(val[0], val[1], val[3]) + + result +end + +def _reduce_55(val, _values, result) + @lexer.state = :expr_beg + @lexer.command_start = false + @pattern_variables.push + + result = @context.in_kwarg + @context.in_kwarg = true + + result +end + +def _reduce_56(val, _values, result) + @pattern_variables.pop + @context.in_kwarg = val[2] + result = @builder.match_pattern_p(val[0], val[1], val[3]) + + result +end + +# reduce 57 omitted + +# reduce 58 omitted + +def _reduce_59(val, _values, result) + @lexer.cond.push(true) + + result +end + +def _reduce_60(val, _values, result) + @lexer.cond.pop + result = [ val[1], val[2] ] + + result +end + +def _reduce_61(val, _values, result) + local_push + @current_arg_stack.push(nil) + + result = [ val[0], @context.dup ] + @context.in_def = true + + result +end + +def _reduce_62(val, _values, result) + result = [ val[0], val[1] ] + + result +end + +def _reduce_63(val, _values, result) + @lexer.state = :expr_fname + + result +end + +def _reduce_64(val, _values, result) + result = [ val[0], val[1], val[2], val[4] ] + + result +end + +# reduce 65 omitted + +# reduce 66 omitted + +# reduce 67 omitted + +def _reduce_68(val, _values, result) + result = @builder.call_method(val[0], val[1], val[2], + nil, val[3], nil) + + result +end + +def _reduce_69(val, _values, result) + result = @context.dup + @context.in_block = true + + result +end + +def _reduce_70(val, _values, result) + result = [ val[0], *val[2], val[3] ] + @context.in_block = val[1].in_block + + result +end + +# reduce 71 omitted + +def _reduce_72(val, _values, result) + result = @builder.call_method(nil, nil, val[0], + nil, val[1], nil) + + result +end + +def _reduce_73(val, _values, result) + method_call = @builder.call_method(nil, nil, val[0], + nil, val[1], nil) + + begin_t, args, body, end_t = val[2] + result = @builder.block(method_call, + begin_t, args, body, end_t) + + result +end + +def _reduce_74(val, _values, result) + result = @builder.call_method(val[0], val[1], val[2], + nil, val[3], nil) + + result +end + +def _reduce_75(val, _values, result) + method_call = @builder.call_method(val[0], val[1], val[2], + nil, val[3], nil) + + begin_t, args, body, end_t = val[4] + result = @builder.block(method_call, + begin_t, args, body, end_t) + + result +end + +def _reduce_76(val, _values, result) + result = @builder.call_method(val[0], val[1], val[2], + nil, val[3], nil) + + result +end + +def _reduce_77(val, _values, result) + method_call = @builder.call_method(val[0], val[1], val[2], + nil, val[3], nil) + + begin_t, args, body, end_t = val[4] + result = @builder.block(method_call, + begin_t, args, body, end_t) + + result +end + +def _reduce_78(val, _values, result) + result = @builder.keyword_cmd(:super, val[0], + nil, val[1], nil) + + result +end + +def _reduce_79(val, _values, result) + result = @builder.keyword_cmd(:yield, val[0], + nil, val[1], nil) + + result +end + +def _reduce_80(val, _values, result) + result = @builder.keyword_cmd(:return, val[0], + nil, val[1], nil) + + result +end + +def _reduce_81(val, _values, result) + result = @builder.keyword_cmd(:break, val[0], + nil, val[1], nil) + + result +end + +def _reduce_82(val, _values, result) + result = @builder.keyword_cmd(:next, val[0], + nil, val[1], nil) + + result +end + +def _reduce_83(val, _values, result) + result = @builder.multi_lhs(nil, val[0], nil) + + result +end + +def _reduce_84(val, _values, result) + result = @builder.begin(val[0], val[1], val[2]) + + result +end + +def _reduce_85(val, _values, result) + result = @builder.multi_lhs(nil, val[0], nil) + + result +end + +def _reduce_86(val, _values, result) + result = @builder.multi_lhs(val[0], val[1], val[2]) + + result +end + +# reduce 87 omitted + +def _reduce_88(val, _values, result) + result = val[0]. + push(val[1]) + + result +end + +def _reduce_89(val, _values, result) + result = val[0]. + push(@builder.splat(val[1], val[2])) + + result +end + +def _reduce_90(val, _values, result) + result = val[0]. + push(@builder.splat(val[1], val[2])). + concat(val[4]) + + result +end + +def _reduce_91(val, _values, result) + result = val[0]. + push(@builder.splat(val[1])) + + result +end + +def _reduce_92(val, _values, result) + result = val[0]. + push(@builder.splat(val[1])). + concat(val[3]) + + result +end + +def _reduce_93(val, _values, result) + result = [ @builder.splat(val[0], val[1]) ] + + result +end + +def _reduce_94(val, _values, result) + result = [ @builder.splat(val[0], val[1]), + *val[3] ] + + result +end + +def _reduce_95(val, _values, result) + result = [ @builder.splat(val[0]) ] + + result +end + +def _reduce_96(val, _values, result) + result = [ @builder.splat(val[0]), + *val[2] ] + + result +end + +# reduce 97 omitted + +def _reduce_98(val, _values, result) + result = @builder.begin(val[0], val[1], val[2]) + + result +end + +def _reduce_99(val, _values, result) + result = [ val[0] ] + + result +end + +def _reduce_100(val, _values, result) + result = val[0] << val[1] + + result +end + +def _reduce_101(val, _values, result) + result = [ val[0] ] + + result +end + +def _reduce_102(val, _values, result) + result = val[0] << val[2] + + result +end + +def _reduce_103(val, _values, result) + result = @builder.assignable(val[0]) + + result +end + +def _reduce_104(val, _values, result) + result = @builder.assignable(val[0]) + + result +end + +def _reduce_105(val, _values, result) + result = @builder.index_asgn(val[0], val[1], val[2], val[3]) + + result +end + +def _reduce_106(val, _values, result) + if (val[1][0] == :anddot) + diagnostic :error, :csend_in_lhs_of_masgn, nil, val[1] + end + + result = @builder.attr_asgn(val[0], val[1], val[2]) + + result +end + +def _reduce_107(val, _values, result) + result = @builder.attr_asgn(val[0], val[1], val[2]) + + result +end + +def _reduce_108(val, _values, result) + if (val[1][0] == :anddot) + diagnostic :error, :csend_in_lhs_of_masgn, nil, val[1] + end + + result = @builder.attr_asgn(val[0], val[1], val[2]) + + result +end + +def _reduce_109(val, _values, result) + result = @builder.assignable( + @builder.const_fetch(val[0], val[1], val[2])) + + result +end + +def _reduce_110(val, _values, result) + result = @builder.assignable( + @builder.const_global(val[0], val[1])) + + result +end + +def _reduce_111(val, _values, result) + result = @builder.assignable(val[0]) + + result +end + +def _reduce_112(val, _values, result) + result = @builder.assignable(val[0]) + + result +end + +def _reduce_113(val, _values, result) + result = @builder.assignable(val[0]) + + result +end + +def _reduce_114(val, _values, result) + result = @builder.index_asgn(val[0], val[1], val[2], val[3]) + + result +end + +def _reduce_115(val, _values, result) + result = @builder.attr_asgn(val[0], val[1], val[2]) + + result +end + +def _reduce_116(val, _values, result) + result = @builder.attr_asgn(val[0], val[1], val[2]) + + result +end + +def _reduce_117(val, _values, result) + result = @builder.attr_asgn(val[0], val[1], val[2]) + + result +end + +def _reduce_118(val, _values, result) + result = @builder.assignable( + @builder.const_fetch(val[0], val[1], val[2])) + + result +end + +def _reduce_119(val, _values, result) + result = @builder.assignable( + @builder.const_global(val[0], val[1])) + + result +end + +def _reduce_120(val, _values, result) + result = @builder.assignable(val[0]) + + result +end + +def _reduce_121(val, _values, result) + diagnostic :error, :module_name_const, nil, val[0] + + result +end + +# reduce 122 omitted + +def _reduce_123(val, _values, result) + result = @builder.const_global(val[0], val[1]) + + result +end + +def _reduce_124(val, _values, result) + result = @builder.const(val[0]) + + result +end + +def _reduce_125(val, _values, result) + result = @builder.const_fetch(val[0], val[1], val[2]) + + result +end + +# reduce 126 omitted + +# reduce 127 omitted + +# reduce 128 omitted + +# reduce 129 omitted + +# reduce 130 omitted + +def _reduce_131(val, _values, result) + result = @builder.symbol_internal(val[0]) + + result +end + +# reduce 132 omitted + +def _reduce_133(val, _values, result) + result = [ val[0] ] + + result +end + +def _reduce_134(val, _values, result) + @lexer.state = :expr_fname + + result +end + +def _reduce_135(val, _values, result) + result = val[0] << val[3] + + result +end + +# reduce 136 omitted + +# reduce 137 omitted + +# reduce 138 omitted + +# reduce 139 omitted + +# reduce 140 omitted + +# reduce 141 omitted + +# reduce 142 omitted + +# reduce 143 omitted + +# reduce 144 omitted + +# reduce 145 omitted + +# reduce 146 omitted + +# reduce 147 omitted + +# reduce 148 omitted + +# reduce 149 omitted + +# reduce 150 omitted + +# reduce 151 omitted + +# reduce 152 omitted + +# reduce 153 omitted + +# reduce 154 omitted + +# reduce 155 omitted + +# reduce 156 omitted + +# reduce 157 omitted + +# reduce 158 omitted + +# reduce 159 omitted + +# reduce 160 omitted + +# reduce 161 omitted + +# reduce 162 omitted + +# reduce 163 omitted + +# reduce 164 omitted + +# reduce 165 omitted + +# reduce 166 omitted + +# reduce 167 omitted + +# reduce 168 omitted + +# reduce 169 omitted + +# reduce 170 omitted + +# reduce 171 omitted + +# reduce 172 omitted + +# reduce 173 omitted + +# reduce 174 omitted + +# reduce 175 omitted + +# reduce 176 omitted + +# reduce 177 omitted + +# reduce 178 omitted + +# reduce 179 omitted + +# reduce 180 omitted + +# reduce 181 omitted + +# reduce 182 omitted + +# reduce 183 omitted + +# reduce 184 omitted + +# reduce 185 omitted + +# reduce 186 omitted + +# reduce 187 omitted + +# reduce 188 omitted + +# reduce 189 omitted + +# reduce 190 omitted + +# reduce 191 omitted + +# reduce 192 omitted + +# reduce 193 omitted + +# reduce 194 omitted + +# reduce 195 omitted + +# reduce 196 omitted + +# reduce 197 omitted + +# reduce 198 omitted + +# reduce 199 omitted + +# reduce 200 omitted + +# reduce 201 omitted + +# reduce 202 omitted + +# reduce 203 omitted + +# reduce 204 omitted + +# reduce 205 omitted + +# reduce 206 omitted + +def _reduce_207(val, _values, result) + result = @builder.assign(val[0], val[1], val[2]) + + result +end + +def _reduce_208(val, _values, result) + result = @builder.op_assign(val[0], val[1], val[2]) + + result +end + +def _reduce_209(val, _values, result) + result = @builder.op_assign( + @builder.index( + val[0], val[1], val[2], val[3]), + val[4], val[5]) + + result +end + +def _reduce_210(val, _values, result) + result = @builder.op_assign( + @builder.call_method( + val[0], val[1], val[2]), + val[3], val[4]) + + result +end + +def _reduce_211(val, _values, result) + result = @builder.op_assign( + @builder.call_method( + val[0], val[1], val[2]), + val[3], val[4]) + + result +end + +def _reduce_212(val, _values, result) + result = @builder.op_assign( + @builder.call_method( + val[0], val[1], val[2]), + val[3], val[4]) + + result +end + +def _reduce_213(val, _values, result) + const = @builder.const_op_assignable( + @builder.const_fetch(val[0], val[1], val[2])) + result = @builder.op_assign(const, val[3], val[4]) + + result +end + +def _reduce_214(val, _values, result) + const = @builder.const_op_assignable( + @builder.const_global(val[0], val[1])) + result = @builder.op_assign(const, val[2], val[3]) + + result +end + +def _reduce_215(val, _values, result) + result = @builder.op_assign(val[0], val[1], val[2]) + + result +end + +def _reduce_216(val, _values, result) + result = @builder.range_inclusive(val[0], val[1], val[2]) + + result +end + +def _reduce_217(val, _values, result) + result = @builder.range_exclusive(val[0], val[1], val[2]) + + result +end + +def _reduce_218(val, _values, result) + result = @builder.range_inclusive(val[0], val[1], nil) + + result +end + +def _reduce_219(val, _values, result) + result = @builder.range_exclusive(val[0], val[1], nil) + + result +end + +def _reduce_220(val, _values, result) + result = @builder.range_inclusive(nil, val[0], val[1]) + + result +end + +def _reduce_221(val, _values, result) + result = @builder.range_exclusive(nil, val[0], val[1]) + + result +end + +def _reduce_222(val, _values, result) + result = @builder.binary_op(val[0], val[1], val[2]) + + result +end + +def _reduce_223(val, _values, result) + result = @builder.binary_op(val[0], val[1], val[2]) + + result +end + +def _reduce_224(val, _values, result) + result = @builder.binary_op(val[0], val[1], val[2]) + + result +end + +def _reduce_225(val, _values, result) + result = @builder.binary_op(val[0], val[1], val[2]) + + result +end + +def _reduce_226(val, _values, result) + result = @builder.binary_op(val[0], val[1], val[2]) + + result +end + +def _reduce_227(val, _values, result) + result = @builder.binary_op(val[0], val[1], val[2]) + + result +end + +def _reduce_228(val, _values, result) + result = @builder.unary_op(val[0], + @builder.binary_op( + val[1], val[2], val[3])) + + result +end + +def _reduce_229(val, _values, result) + result = @builder.unary_op(val[0], val[1]) + + result +end + +def _reduce_230(val, _values, result) + result = @builder.unary_op(val[0], val[1]) + + result +end + +def _reduce_231(val, _values, result) + result = @builder.binary_op(val[0], val[1], val[2]) + + result +end + +def _reduce_232(val, _values, result) + result = @builder.binary_op(val[0], val[1], val[2]) + + result +end + +def _reduce_233(val, _values, result) + result = @builder.binary_op(val[0], val[1], val[2]) + + result +end + +def _reduce_234(val, _values, result) + result = @builder.binary_op(val[0], val[1], val[2]) + + result +end + +# reduce 235 omitted + +def _reduce_236(val, _values, result) + result = @builder.binary_op(val[0], val[1], val[2]) + + result +end + +def _reduce_237(val, _values, result) + result = @builder.binary_op(val[0], val[1], val[2]) + + result +end + +def _reduce_238(val, _values, result) + result = @builder.binary_op(val[0], val[1], val[2]) + + result +end + +def _reduce_239(val, _values, result) + result = @builder.match_op(val[0], val[1], val[2]) + + result +end + +def _reduce_240(val, _values, result) + result = @builder.binary_op(val[0], val[1], val[2]) + + result +end + +def _reduce_241(val, _values, result) + result = @builder.not_op(val[0], nil, val[1], nil) + + result +end + +def _reduce_242(val, _values, result) + result = @builder.unary_op(val[0], val[1]) + + result +end + +def _reduce_243(val, _values, result) + result = @builder.binary_op(val[0], val[1], val[2]) + + result +end + +def _reduce_244(val, _values, result) + result = @builder.binary_op(val[0], val[1], val[2]) + + result +end + +def _reduce_245(val, _values, result) + result = @builder.logical_op(:and, val[0], val[1], val[2]) + + result +end + +def _reduce_246(val, _values, result) + result = @builder.logical_op(:or, val[0], val[1], val[2]) + + result +end + +def _reduce_247(val, _values, result) + result = @builder.keyword_cmd(:defined?, val[0], nil, [ val[2] ], nil) + + result +end + +def _reduce_248(val, _values, result) + result = @builder.ternary(val[0], val[1], + val[2], val[4], val[5]) + + result +end + +def _reduce_249(val, _values, result) + def_t, (name_t, ctx) = val[0] + endless_method_name(name_t) + + result = @builder.def_endless_method(def_t, name_t, + val[1], val[2], val[3]) + + local_pop + @context.in_def = ctx.in_def + @current_arg_stack.pop + + result +end + +def _reduce_250(val, _values, result) + def_t, (name_t, ctx) = val[0] + endless_method_name(name_t) + + rescue_body = @builder.rescue_body(val[4], + nil, nil, nil, + nil, val[5]) + + method_body = @builder.begin_body(val[3], [ rescue_body ]) + + result = @builder.def_endless_method(def_t, name_t, + val[1], val[2], method_body) + + local_pop + @context.in_def = ctx.in_def + @current_arg_stack.pop + + result +end + +def _reduce_251(val, _values, result) + def_t, recv, dot_t, (name_t, ctx) = val[0] + endless_method_name(name_t) + + result = @builder.def_endless_singleton(def_t, recv, dot_t, name_t, + val[1], val[2], val[3]) + + local_pop + @context.in_def = ctx.in_def + @current_arg_stack.pop + + result +end + +def _reduce_252(val, _values, result) + def_t, recv, dot_t, (name_t, ctx) = val[0] + endless_method_name(name_t) + + rescue_body = @builder.rescue_body(val[4], + nil, nil, nil, + nil, val[5]) + + method_body = @builder.begin_body(val[3], [ rescue_body ]) + + result = @builder.def_endless_singleton(def_t, recv, dot_t, name_t, + val[1], val[2], method_body) + + local_pop + @context.in_def = ctx.in_def + @current_arg_stack.pop + + result +end + +# reduce 253 omitted + +# reduce 254 omitted + +# reduce 255 omitted + +# reduce 256 omitted + +# reduce 257 omitted + +def _reduce_258(val, _values, result) + result = @builder.binary_op(val[0], val[1], val[2]) + + result +end + +def _reduce_259(val, _values, result) + result = @builder.binary_op(val[0], val[1], val[2]) + + result +end + +# reduce 260 omitted + +# reduce 261 omitted + +# reduce 262 omitted + +def _reduce_263(val, _values, result) + result = val[0] << @builder.associate(nil, val[2], nil) + + result +end + +def _reduce_264(val, _values, result) + result = [ @builder.associate(nil, val[0], nil) ] + + result +end + +# reduce 265 omitted + +def _reduce_266(val, _values, result) + rescue_body = @builder.rescue_body(val[1], + nil, nil, nil, + nil, val[2]) + + result = @builder.begin_body(val[0], [ rescue_body ]) + + result +end + +def _reduce_267(val, _values, result) + result = val + + result +end + +def _reduce_268(val, _values, result) + unless @static_env.declared_forward_args? + diagnostic :error, :unexpected_token, { :token => 'tBDOT3' } , val[3] + end + + result = [val[0], [*val[1], @builder.forwarded_args(val[3])], val[4]] + + result +end + +def _reduce_269(val, _values, result) + unless @static_env.declared_forward_args? + diagnostic :error, :unexpected_token, { :token => 'tBDOT3' } , val[1] + end + + result = [val[0], [@builder.forwarded_args(val[1])], val[2]] + + result +end + +def _reduce_270(val, _values, result) + result = [ nil, [], nil ] + + result +end + +# reduce 271 omitted + +def _reduce_272(val, _values, result) + result = [] + + result +end + +# reduce 273 omitted + +# reduce 274 omitted + +def _reduce_275(val, _values, result) + result = val[0] << @builder.associate(nil, val[2], nil) + + result +end + +def _reduce_276(val, _values, result) + result = [ @builder.associate(nil, val[0], nil) ] + + result +end + +def _reduce_277(val, _values, result) + result = [ val[0] ] + + result +end + +def _reduce_278(val, _values, result) + result = val[0].concat(val[1]) + + result +end + +def _reduce_279(val, _values, result) + result = [ @builder.associate(nil, val[0], nil) ] + result.concat(val[1]) + + result +end + +def _reduce_280(val, _values, result) + assocs = @builder.associate(nil, val[2], nil) + result = val[0] << assocs + result.concat(val[3]) + + result +end + +def _reduce_281(val, _values, result) + result = [ val[0] ] + + result +end + +def _reduce_282(val, _values, result) + # When branch gets invoked by RACC's lookahead + # and command args start with '[' or '(' + # we need to put `true` to the cmdarg stack + # **before** `false` pushed by lexer + # m [], n + # ^ + # Right here we have cmdarg [...0] because + # lexer pushed it on '[' + # We need to modify cmdarg stack to [...10] + # + # For all other cases (like `m n` or `m n, []`) we simply put 1 to the stack + # and later lexer pushes corresponding bits on top of it. + last_token = @last_token[0] + lookahead = last_token == :tLBRACK || last_token == :tLPAREN_ARG + + if lookahead + top = @lexer.cmdarg.pop + @lexer.cmdarg.push(true) + @lexer.cmdarg.push(top) + else + @lexer.cmdarg.push(true) + end + + result +end + +def _reduce_283(val, _values, result) + # call_args can be followed by tLBRACE_ARG (that does cmdarg.push(0) in the lexer) + # but the push must be done after cmdarg.pop() in the parser. + # So this code does cmdarg.pop() to pop 0 pushed by tLBRACE_ARG, + # cmdarg.pop() to pop 1 pushed by command_args, + # and cmdarg.push(0) to restore back the flag set by tLBRACE_ARG. + last_token = @last_token[0] + lookahead = last_token == :tLBRACE_ARG + if lookahead + top = @lexer.cmdarg.pop + @lexer.cmdarg.pop + @lexer.cmdarg.push(top) + else + @lexer.cmdarg.pop + end + + result = val[1] + + result +end + +def _reduce_284(val, _values, result) + result = @builder.block_pass(val[0], val[1]) + + result +end + +def _reduce_285(val, _values, result) + result = [ val[1] ] + + result +end + +def _reduce_286(val, _values, result) + result = [] + + result +end + +def _reduce_287(val, _values, result) + result = [ val[0] ] + + result +end + +def _reduce_288(val, _values, result) + result = [ @builder.splat(val[0], val[1]) ] + + result +end + +def _reduce_289(val, _values, result) + result = val[0] << val[2] + + result +end + +def _reduce_290(val, _values, result) + result = val[0] << @builder.splat(val[2], val[3]) + + result +end + +def _reduce_291(val, _values, result) + result = @builder.array(nil, val[0], nil) + + result +end + +# reduce 292 omitted + +def _reduce_293(val, _values, result) + result = val[0] << val[2] + + result +end + +def _reduce_294(val, _values, result) + result = val[0] << @builder.splat(val[2], val[3]) + + result +end + +def _reduce_295(val, _values, result) + result = [ @builder.splat(val[0], val[1]) ] + + result +end + +# reduce 296 omitted + +# reduce 297 omitted + +# reduce 298 omitted + +# reduce 299 omitted + +# reduce 300 omitted + +# reduce 301 omitted + +# reduce 302 omitted + +# reduce 303 omitted + +# reduce 304 omitted + +# reduce 305 omitted + +def _reduce_306(val, _values, result) + result = @builder.call_method(nil, nil, val[0]) + + result +end + +def _reduce_307(val, _values, result) + @lexer.cmdarg.push(false) + + result +end + +def _reduce_308(val, _values, result) + @lexer.cmdarg.pop + + result = @builder.begin_keyword(val[0], val[2], val[3]) + + result +end + +def _reduce_309(val, _values, result) + @lexer.state = :expr_endarg + + result +end + +def _reduce_310(val, _values, result) + result = @builder.begin(val[0], val[1], val[3]) + + result +end + +def _reduce_311(val, _values, result) + @lexer.state = :expr_endarg + + result +end + +def _reduce_312(val, _values, result) + result = @builder.begin(val[0], nil, val[3]) + + result +end + +def _reduce_313(val, _values, result) + result = @builder.begin(val[0], val[1], val[2]) + + result +end + +def _reduce_314(val, _values, result) + result = @builder.const_fetch(val[0], val[1], val[2]) + + result +end + +def _reduce_315(val, _values, result) + result = @builder.const_global(val[0], val[1]) + + result +end + +def _reduce_316(val, _values, result) + result = @builder.array(val[0], val[1], val[2]) + + result +end + +def _reduce_317(val, _values, result) + result = @builder.associate(val[0], val[1], val[2]) + + result +end + +def _reduce_318(val, _values, result) + result = @builder.keyword_cmd(:return, val[0]) + + result +end + +def _reduce_319(val, _values, result) + result = @builder.keyword_cmd(:yield, val[0], val[1], val[2], val[3]) + + result +end + +def _reduce_320(val, _values, result) + result = @builder.keyword_cmd(:yield, val[0], val[1], [], val[2]) + + result +end + +def _reduce_321(val, _values, result) + result = @builder.keyword_cmd(:yield, val[0]) + + result +end + +def _reduce_322(val, _values, result) + result = @builder.keyword_cmd(:defined?, val[0], + val[2], [ val[3] ], val[4]) + + result +end + +def _reduce_323(val, _values, result) + result = @builder.not_op(val[0], val[1], val[2], val[3]) + + result +end + +def _reduce_324(val, _values, result) + result = @builder.not_op(val[0], val[1], nil, val[2]) + + result +end + +def _reduce_325(val, _values, result) + method_call = @builder.call_method(nil, nil, val[0]) + + begin_t, args, body, end_t = val[1] + result = @builder.block(method_call, + begin_t, args, body, end_t) + + result +end + +# reduce 326 omitted + +def _reduce_327(val, _values, result) + begin_t, args, body, end_t = val[1] + result = @builder.block(val[0], + begin_t, args, body, end_t) + + result +end + +# reduce 328 omitted + +def _reduce_329(val, _values, result) + else_t, else_ = val[4] + result = @builder.condition(val[0], val[1], val[2], + val[3], else_t, + else_, val[5]) + + result +end + +def _reduce_330(val, _values, result) + else_t, else_ = val[4] + result = @builder.condition(val[0], val[1], val[2], + else_, else_t, + val[3], val[5]) + + result +end + +def _reduce_331(val, _values, result) + result = @builder.loop(:while, val[0], *val[1], val[2], val[3]) + + result +end + +def _reduce_332(val, _values, result) + result = @builder.loop(:until, val[0], *val[1], val[2], val[3]) + + result +end + +def _reduce_333(val, _values, result) + *when_bodies, (else_t, else_body) = *val[3] + + result = @builder.case(val[0], val[1], + when_bodies, else_t, else_body, + val[4]) + + result +end + +def _reduce_334(val, _values, result) + *when_bodies, (else_t, else_body) = *val[2] + + result = @builder.case(val[0], nil, + when_bodies, else_t, else_body, + val[3]) + + result +end + +def _reduce_335(val, _values, result) + *in_bodies, (else_t, else_body) = *val[3] + + result = @builder.case_match(val[0], val[1], + in_bodies, else_t, else_body, + val[4]) + + result +end + +def _reduce_336(val, _values, result) + result = @builder.for(val[0], val[1], val[2], *val[3], val[4], val[5]) + + result +end + +def _reduce_337(val, _values, result) + @context.in_class = true + local_push + + result +end + +def _reduce_338(val, _values, result) + k_class, ctx = val[0] + if @context.in_def + diagnostic :error, :class_in_def, nil, k_class + end + + lt_t, superclass = val[2] + result = @builder.def_class(k_class, val[1], + lt_t, superclass, + val[4], val[5]) + + local_pop + @context.in_class = ctx.in_class + + result +end + +def _reduce_339(val, _values, result) + @context.in_def = false + @context.in_class = false + local_push + + result +end + +def _reduce_340(val, _values, result) + k_class, ctx = val[0] + result = @builder.def_sclass(k_class, val[1], val[2], + val[5], val[6]) + + local_pop + @context.in_def = ctx.in_def + @context.in_class = ctx.in_class + + result +end + +def _reduce_341(val, _values, result) + @context.in_class = true + local_push + + result +end + +def _reduce_342(val, _values, result) + k_mod, ctx = val[0] + if @context.in_def + diagnostic :error, :module_in_def, nil, k_mod + end + + result = @builder.def_module(k_mod, val[1], + val[3], val[4]) + + local_pop + @context.in_class = ctx.in_class + + result +end + +def _reduce_343(val, _values, result) + def_t, (name_t, ctx) = val[0] + result = @builder.def_method(def_t, name_t, val[1], + val[2], val[3]) + + local_pop + @context.in_def = ctx.in_def + @current_arg_stack.pop + + result +end + +def _reduce_344(val, _values, result) + def_t, recv, dot_t, (name_t, ctx) = val[0] + result = @builder.def_singleton(def_t, recv, dot_t, name_t, val[1], + val[2], val[3]) + + local_pop + @context.in_def = ctx.in_def + @current_arg_stack.pop + + result +end + +def _reduce_345(val, _values, result) + result = @builder.keyword_cmd(:break, val[0]) + + result +end + +def _reduce_346(val, _values, result) + result = @builder.keyword_cmd(:next, val[0]) + + result +end + +def _reduce_347(val, _values, result) + result = @builder.keyword_cmd(:redo, val[0]) + + result +end + +def _reduce_348(val, _values, result) + result = @builder.keyword_cmd(:retry, val[0]) + + result +end + +# reduce 349 omitted + +def _reduce_350(val, _values, result) + result = [ val[0], @context.dup ] + + result +end + +def _reduce_351(val, _values, result) + result = [ val[0], @context.dup ] + + result +end + +def _reduce_352(val, _values, result) + result = val[0] + + result +end + +def _reduce_353(val, _values, result) + if @context.in_class && !@context.in_def && !(context.in_block || context.in_lambda) + diagnostic :error, :invalid_return, nil, val[0] + end + + result +end + +# reduce 354 omitted + +# reduce 355 omitted + +def _reduce_356(val, _values, result) + result = val[1] + + result +end + +# reduce 357 omitted + +# reduce 358 omitted + +# reduce 359 omitted + +def _reduce_360(val, _values, result) + else_t, else_ = val[4] + result = [ val[0], + @builder.condition(val[0], val[1], val[2], + val[3], else_t, + else_, nil), + ] + + result +end + +# reduce 361 omitted + +def _reduce_362(val, _values, result) + result = val + + result +end + +# reduce 363 omitted + +# reduce 364 omitted + +def _reduce_365(val, _values, result) + result = @builder.arg(val[0]) + + result +end + +def _reduce_366(val, _values, result) + result = @builder.multi_lhs(val[0], val[1], val[2]) + + result +end + +def _reduce_367(val, _values, result) + result = [ val[0] ] + + result +end + +def _reduce_368(val, _values, result) + result = val[0] << val[2] + + result +end + +# reduce 369 omitted + +def _reduce_370(val, _values, result) + result = val[0]. + push(val[2]) + + result +end + +def _reduce_371(val, _values, result) + result = val[0]. + push(val[2]). + concat(val[4]) + + result +end + +def _reduce_372(val, _values, result) + result = [ val[0] ] + + result +end + +def _reduce_373(val, _values, result) + result = [ val[0], *val[2] ] + + result +end + +def _reduce_374(val, _values, result) + result = @builder.restarg(val[0], val[1]) + + result +end + +def _reduce_375(val, _values, result) + result = @builder.restarg(val[0]) + + result +end + +# reduce 376 omitted + +# reduce 377 omitted + +def _reduce_378(val, _values, result) + result = val[0].concat(val[2]).concat(val[3]) + + result +end + +def _reduce_379(val, _values, result) + result = val[0].concat(val[1]) + + result +end + +def _reduce_380(val, _values, result) + result = val[0].concat(val[1]) + + result +end + +def _reduce_381(val, _values, result) + result = [ val[0] ] + + result +end + +def _reduce_382(val, _values, result) + result = val[1] + + result +end + +def _reduce_383(val, _values, result) + result = [] + + result +end + +# reduce 384 omitted + +def _reduce_385(val, _values, result) + result = val[0]. + concat(val[2]). + concat(val[4]). + concat(val[5]) + + result +end + +def _reduce_386(val, _values, result) + result = val[0]. + concat(val[2]). + concat(val[4]). + concat(val[6]). + concat(val[7]) + + result +end + +def _reduce_387(val, _values, result) + result = val[0]. + concat(val[2]). + concat(val[3]) + + result +end + +def _reduce_388(val, _values, result) + result = val[0]. + concat(val[2]). + concat(val[4]). + concat(val[5]) + + result +end + +def _reduce_389(val, _values, result) + result = val[0]. + concat(val[2]). + concat(val[3]) + + result +end + +# reduce 390 omitted + +def _reduce_391(val, _values, result) + result = val[0]. + concat(val[2]). + concat(val[4]). + concat(val[5]) + + result +end + +def _reduce_392(val, _values, result) + if val[1].empty? && val[0].size == 1 + result = [@builder.procarg0(val[0][0])] + else + result = val[0].concat(val[1]) + end + + result +end + +def _reduce_393(val, _values, result) + result = val[0]. + concat(val[2]). + concat(val[3]) + + result +end + +def _reduce_394(val, _values, result) + result = val[0]. + concat(val[2]). + concat(val[4]). + concat(val[5]) + + result +end + +def _reduce_395(val, _values, result) + result = val[0]. + concat(val[1]) + + result +end + +def _reduce_396(val, _values, result) + result = val[0]. + concat(val[2]). + concat(val[3]) + + result +end + +def _reduce_397(val, _values, result) + result = val[0]. + concat(val[1]) + + result +end + +def _reduce_398(val, _values, result) + result = val[0]. + concat(val[2]). + concat(val[3]) + + result +end + +# reduce 399 omitted + +def _reduce_400(val, _values, result) + result = @builder.args(nil, [], nil) + + result +end + +def _reduce_401(val, _values, result) + @lexer.state = :expr_value + + result +end + +def _reduce_402(val, _values, result) + @max_numparam_stack.has_ordinary_params! + @current_arg_stack.set(nil) + result = @builder.args(val[0], val[1], val[2]) + + result +end + +def _reduce_403(val, _values, result) + @max_numparam_stack.has_ordinary_params! + @current_arg_stack.set(nil) + result = @builder.args(val[0], val[1].concat(val[2]), val[3]) + + result +end + +def _reduce_404(val, _values, result) + result = [] + + result +end + +def _reduce_405(val, _values, result) + result = val[2] + + result +end + +def _reduce_406(val, _values, result) + result = [ val[0] ] + + result +end + +def _reduce_407(val, _values, result) + result = val[0] << val[2] + + result +end + +def _reduce_408(val, _values, result) + @static_env.declare val[0][0] + result = @builder.shadowarg(val[0]) + + result +end + +# reduce 409 omitted + +def _reduce_410(val, _values, result) + @static_env.extend_dynamic + @max_numparam_stack.push(static: false) + result = @context.dup + @context.in_lambda = true + + result +end + +def _reduce_411(val, _values, result) + @lexer.cmdarg.push(false) + + result +end + +def _reduce_412(val, _values, result) + lambda_call = @builder.call_lambda(val[0]) + args = @max_numparam_stack.has_numparams? ? @builder.numargs(@max_numparam_stack.top) : val[2] + begin_t, body, end_t = val[4] + + @max_numparam_stack.pop + @static_env.unextend + @lexer.cmdarg.pop + @context.in_lambda = val[1].in_lambda + + result = @builder.block(lambda_call, + begin_t, args, body, end_t) + + result +end + +def _reduce_413(val, _values, result) + @max_numparam_stack.has_ordinary_params! + result = @builder.args(val[0], val[1].concat(val[2]), val[3]) + + result +end + +def _reduce_414(val, _values, result) + if val[0].any? + @max_numparam_stack.has_ordinary_params! + end + result = @builder.args(nil, val[0], nil) + + result +end + +def _reduce_415(val, _values, result) + result = @context.dup + @context.in_lambda = true + + result +end + +def _reduce_416(val, _values, result) + result = [ val[0], val[2], val[3] ] + @context.in_lambda = val[1].in_lambda + + result +end + +def _reduce_417(val, _values, result) + result = @context.dup + @context.in_lambda = true + + result +end + +def _reduce_418(val, _values, result) + result = [ val[0], val[2], val[3] ] + @context.in_lambda = val[1].in_lambda + + result +end + +def _reduce_419(val, _values, result) + result = @context.dup + @context.in_block = true + + result +end + +def _reduce_420(val, _values, result) + result = [ val[0], *val[2], val[3] ] + @context.in_block = val[1].in_block + + result +end + +def _reduce_421(val, _values, result) + begin_t, block_args, body, end_t = val[1] + result = @builder.block(val[0], + begin_t, block_args, body, end_t) + + result +end + +def _reduce_422(val, _values, result) + lparen_t, args, rparen_t = val[3] + result = @builder.call_method(val[0], val[1], val[2], + lparen_t, args, rparen_t) + + result +end + +def _reduce_423(val, _values, result) + lparen_t, args, rparen_t = val[3] + method_call = @builder.call_method(val[0], val[1], val[2], + lparen_t, args, rparen_t) + + begin_t, args, body, end_t = val[4] + result = @builder.block(method_call, + begin_t, args, body, end_t) + + result +end + +def _reduce_424(val, _values, result) + method_call = @builder.call_method(val[0], val[1], val[2], + nil, val[3], nil) + + begin_t, args, body, end_t = val[4] + result = @builder.block(method_call, + begin_t, args, body, end_t) + + result +end + +def _reduce_425(val, _values, result) + lparen_t, args, rparen_t = val[1] + result = @builder.call_method(nil, nil, val[0], + lparen_t, args, rparen_t) + + result +end + +def _reduce_426(val, _values, result) + lparen_t, args, rparen_t = val[3] + result = @builder.call_method(val[0], val[1], val[2], + lparen_t, args, rparen_t) + + result +end + +def _reduce_427(val, _values, result) + lparen_t, args, rparen_t = val[3] + result = @builder.call_method(val[0], val[1], val[2], + lparen_t, args, rparen_t) + + result +end + +def _reduce_428(val, _values, result) + result = @builder.call_method(val[0], val[1], val[2]) + + result +end + +def _reduce_429(val, _values, result) + lparen_t, args, rparen_t = val[2] + result = @builder.call_method(val[0], val[1], nil, + lparen_t, args, rparen_t) + + result +end + +def _reduce_430(val, _values, result) + lparen_t, args, rparen_t = val[2] + result = @builder.call_method(val[0], val[1], nil, + lparen_t, args, rparen_t) + + result +end + +def _reduce_431(val, _values, result) + lparen_t, args, rparen_t = val[1] + result = @builder.keyword_cmd(:super, val[0], + lparen_t, args, rparen_t) + + result +end + +def _reduce_432(val, _values, result) + result = @builder.keyword_cmd(:zsuper, val[0]) + + result +end + +def _reduce_433(val, _values, result) + result = @builder.index(val[0], val[1], val[2], val[3]) + + result +end + +def _reduce_434(val, _values, result) + result = @context.dup + @context.in_block = true + + result +end + +def _reduce_435(val, _values, result) + result = [ val[0], *val[2], val[3] ] + @context.in_block = val[1].in_block + + result +end + +def _reduce_436(val, _values, result) + result = @context.dup + @context.in_block = true + + result +end + +def _reduce_437(val, _values, result) + result = [ val[0], *val[2], val[3] ] + @context.in_block = val[1].in_block + + result +end + +def _reduce_438(val, _values, result) + @static_env.extend_dynamic + @max_numparam_stack.push(static: false) + + result +end + +def _reduce_439(val, _values, result) + args = @max_numparam_stack.has_numparams? ? @builder.numargs(@max_numparam_stack.top) : val[1] + result = [ args, val[2] ] + + @max_numparam_stack.pop + @static_env.unextend + + result +end + +def _reduce_440(val, _values, result) + @static_env.extend_dynamic + @max_numparam_stack.push(static: false) + + result +end + +def _reduce_441(val, _values, result) + @lexer.cmdarg.push(false) + + result +end + +def _reduce_442(val, _values, result) + args = @max_numparam_stack.has_numparams? ? @builder.numargs(@max_numparam_stack.top) : val[2] + result = [ args, val[3] ] + + @max_numparam_stack.pop + @static_env.unextend + @lexer.cmdarg.pop + + result +end + +def _reduce_443(val, _values, result) + result = [ @builder.when(val[0], val[1], val[2], val[3]), + *val[4] ] + + result +end + +def _reduce_444(val, _values, result) + result = [ val[0] ] + + result +end + +# reduce 445 omitted + +def _reduce_446(val, _values, result) + @lexer.state = :expr_beg + @lexer.command_start = false + @pattern_variables.push + @pattern_hash_keys.push + + result = @context.in_kwarg + @context.in_kwarg = true + + result +end + +def _reduce_447(val, _values, result) + @pattern_variables.pop + @pattern_hash_keys.pop + @context.in_kwarg = val[1] + + result +end + +def _reduce_448(val, _values, result) + result = [ @builder.in_pattern(val[0], *val[2], val[3], val[5]), + *val[6] ] + + result +end + +def _reduce_449(val, _values, result) + result = [ val[0] ] + + result +end + +# reduce 450 omitted + +def _reduce_451(val, _values, result) + result = [ val[0], nil ] + + result +end + +def _reduce_452(val, _values, result) + result = [ val[0], @builder.if_guard(val[1], val[2]) ] + + result +end + +def _reduce_453(val, _values, result) + result = [ val[0], @builder.unless_guard(val[1], val[2]) ] + + result +end + +# reduce 454 omitted + +def _reduce_455(val, _values, result) + # array patterns that end with comma + # like 1, 2, + # must be emitted as `array_pattern_with_tail` + item = @builder.match_with_trailing_comma(val[0], val[1]) + result = @builder.array_pattern(nil, [ item ], nil) + + result +end + +def _reduce_456(val, _values, result) + result = @builder.array_pattern(nil, [val[0]].concat(val[2]), nil) + + result +end + +def _reduce_457(val, _values, result) + result = @builder.find_pattern(nil, val[0], nil) + + result +end + +def _reduce_458(val, _values, result) + result = @builder.array_pattern(nil, val[0], nil) + + result +end + +def _reduce_459(val, _values, result) + result = @builder.hash_pattern(nil, val[0], nil) + + result +end + +# reduce 460 omitted + +def _reduce_461(val, _values, result) + result = @builder.match_as(val[0], val[1], val[2]) + + result +end + +# reduce 462 omitted + +def _reduce_463(val, _values, result) + result = @builder.match_alt(val[0], val[1], val[2]) + + result +end + +# reduce 464 omitted + +def _reduce_465(val, _values, result) + result = val[0] + @pattern_hash_keys.push + + result +end + +def _reduce_466(val, _values, result) + result = val[0] + @pattern_hash_keys.push + + result +end + +# reduce 467 omitted + +def _reduce_468(val, _values, result) + @pattern_hash_keys.pop + pattern = @builder.array_pattern(nil, val[2], nil) + result = @builder.const_pattern(val[0], val[1], pattern, val[3]) + + result +end + +def _reduce_469(val, _values, result) + @pattern_hash_keys.pop + pattern = @builder.find_pattern(nil, val[2], nil) + result = @builder.const_pattern(val[0], val[1], pattern, val[3]) + + result +end + +def _reduce_470(val, _values, result) + @pattern_hash_keys.pop + pattern = @builder.hash_pattern(nil, val[2], nil) + result = @builder.const_pattern(val[0], val[1], pattern, val[3]) + + result +end + +def _reduce_471(val, _values, result) + pattern = @builder.array_pattern(val[1], nil, val[2]) + result = @builder.const_pattern(val[0], val[1], pattern, val[2]) + + result +end + +def _reduce_472(val, _values, result) + @pattern_hash_keys.pop + pattern = @builder.array_pattern(nil, val[2], nil) + result = @builder.const_pattern(val[0], val[1], pattern, val[3]) + + result +end + +def _reduce_473(val, _values, result) + @pattern_hash_keys.pop + pattern = @builder.find_pattern(nil, val[2], nil) + result = @builder.const_pattern(val[0], val[1], pattern, val[3]) + + result +end + +def _reduce_474(val, _values, result) + @pattern_hash_keys.pop + pattern = @builder.hash_pattern(nil, val[2], nil) + result = @builder.const_pattern(val[0], val[1], pattern, val[3]) + + result +end + +def _reduce_475(val, _values, result) + pattern = @builder.array_pattern(val[1], nil, val[2]) + result = @builder.const_pattern(val[0], val[1], pattern, val[2]) + + result +end + +def _reduce_476(val, _values, result) + result = @builder.array_pattern(val[0], val[1], val[2]) + + result +end + +def _reduce_477(val, _values, result) + result = @builder.find_pattern(val[0], val[1], val[2]) + + result +end + +def _reduce_478(val, _values, result) + result = @builder.array_pattern(val[0], [], val[1]) + + result +end + +def _reduce_479(val, _values, result) + @pattern_hash_keys.push + result = @context.in_kwarg + @context.in_kwarg = false + + result +end + +def _reduce_480(val, _values, result) + @pattern_hash_keys.pop + @context.in_kwarg = val[1] + result = @builder.hash_pattern(val[0], val[2], val[3]) + + result +end + +def _reduce_481(val, _values, result) + result = @builder.hash_pattern(val[0], [], val[1]) + + result +end + +def _reduce_482(val, _values, result) + @pattern_hash_keys.push + + result +end + +def _reduce_483(val, _values, result) + @pattern_hash_keys.pop + result = @builder.begin(val[0], val[2], val[3]) + + result +end + +def _reduce_484(val, _values, result) + result = [ val[0] ] + + result +end + +def _reduce_485(val, _values, result) + result = val[0] + + result +end + +def _reduce_486(val, _values, result) + result = [ *val[0], val[1] ] + + result +end + +def _reduce_487(val, _values, result) + match_rest = @builder.match_rest(val[1], val[2]) + result = [ *val[0], match_rest ] + + result +end + +def _reduce_488(val, _values, result) + match_rest = @builder.match_rest(val[1], val[2]) + result = [ *val[0], match_rest, *val[4] ] + + result +end + +def _reduce_489(val, _values, result) + result = [ *val[0], @builder.match_rest(val[1]) ] + + result +end + +def _reduce_490(val, _values, result) + result = [ *val[0], @builder.match_rest(val[1]), *val[3] ] + + result +end + +# reduce 491 omitted + +def _reduce_492(val, _values, result) + # array patterns that end with comma + # like [1, 2,] + # must be emitted as `array_pattern_with_tail` + item = @builder.match_with_trailing_comma(val[0], val[1]) + result = [ item ] + + result +end + +def _reduce_493(val, _values, result) + # array patterns that end with comma + # like [1, 2,] + # must be emitted as `array_pattern_with_tail` + last_item = @builder.match_with_trailing_comma(val[1], val[2]) + result = [ *val[0], last_item ] + + result +end + +def _reduce_494(val, _values, result) + result = [ val[0] ] + + result +end + +def _reduce_495(val, _values, result) + result = [ val[0], *val[2] ] + + result +end + +def _reduce_496(val, _values, result) + result = [ val[0], *val[2], val[4] ] + + result +end + +def _reduce_497(val, _values, result) + result = @builder.match_rest(val[0], val[1]) + + result +end + +def _reduce_498(val, _values, result) + result = @builder.match_rest(val[0]) + + result +end + +def _reduce_499(val, _values, result) + result = [ val[0] ] + + result +end + +def _reduce_500(val, _values, result) + result = [ *val[0], val[2] ] + + result +end + +# reduce 501 omitted + +def _reduce_502(val, _values, result) + result = [ *val[0], *val[2] ] + + result +end + +def _reduce_503(val, _values, result) + result = val[0] + + result +end + +def _reduce_504(val, _values, result) + result = val[0] + + result +end + +def _reduce_505(val, _values, result) + result = val[0] + + result +end + +def _reduce_506(val, _values, result) + result = [ val[0] ] + + result +end + +def _reduce_507(val, _values, result) + result = [ *val[0], val[2] ] + + result +end + +def _reduce_508(val, _values, result) + result = @builder.match_pair(*val[0], val[1]) + + result +end + +def _reduce_509(val, _values, result) + result = @builder.match_label(*val[0]) + + result +end + +def _reduce_510(val, _values, result) + result = [:label, val[0]] + + result +end + +def _reduce_511(val, _values, result) + result = [:quoted, [val[0], val[1], val[2]]] + + result +end + +def _reduce_512(val, _values, result) + result = [ @builder.match_rest(val[0], val[1]) ] + + result +end + +def _reduce_513(val, _values, result) + result = [ @builder.match_rest(val[0], nil) ] + + result +end + +def _reduce_514(val, _values, result) + result = [ @builder.match_nil_pattern(val[0], val[1]) ] + + result +end + +# reduce 515 omitted + +# reduce 516 omitted + +# reduce 517 omitted + +def _reduce_518(val, _values, result) + result = @builder.range_inclusive(val[0], val[1], val[2]) + + result +end + +def _reduce_519(val, _values, result) + result = @builder.range_exclusive(val[0], val[1], val[2]) + + result +end + +def _reduce_520(val, _values, result) + result = @builder.range_inclusive(val[0], val[1], nil) + + result +end + +def _reduce_521(val, _values, result) + result = @builder.range_exclusive(val[0], val[1], nil) + + result +end + +# reduce 522 omitted + +# reduce 523 omitted + +# reduce 524 omitted + +def _reduce_525(val, _values, result) + result = @builder.range_inclusive(nil, val[0], val[1]) + + result +end + +def _reduce_526(val, _values, result) + result = @builder.range_exclusive(nil, val[0], val[1]) + + result +end + +# reduce 527 omitted + +# reduce 528 omitted + +# reduce 529 omitted + +# reduce 530 omitted + +# reduce 531 omitted + +# reduce 532 omitted + +# reduce 533 omitted + +# reduce 534 omitted + +def _reduce_535(val, _values, result) + result = @builder.accessible(val[0]) + + result +end + +# reduce 536 omitted + +def _reduce_537(val, _values, result) + result = @builder.assignable(@builder.match_var(val[0])) + + result +end + +def _reduce_538(val, _values, result) + name = val[1][0] + unless static_env.declared?(name) + diagnostic :error, :undefined_lvar, { :name => name }, val[1] + end + + lvar = @builder.accessible(@builder.ident(val[1])) + result = @builder.pin(val[0], lvar) + + result +end + +def _reduce_539(val, _values, result) + result = @builder.const_global(val[0], val[1]) + + result +end + +def _reduce_540(val, _values, result) + result = @builder.const_fetch(val[0], val[1], val[2]) + + result +end + +def _reduce_541(val, _values, result) + result = @builder.const(val[0]) + + result +end + +def _reduce_542(val, _values, result) + assoc_t, exc_var = val[2] + + if val[1] + exc_list = @builder.array(nil, val[1], nil) + end + + result = [ @builder.rescue_body(val[0], + exc_list, assoc_t, exc_var, + val[3], val[4]), + *val[5] ] + + result +end + +def _reduce_543(val, _values, result) + result = [] + + result +end + +def _reduce_544(val, _values, result) + result = [ val[0] ] + + result +end + +# reduce 545 omitted + +# reduce 546 omitted + +def _reduce_547(val, _values, result) + result = [ val[0], val[1] ] + + result +end + +# reduce 548 omitted + +def _reduce_549(val, _values, result) + result = [ val[0], val[1] ] + + result +end + +# reduce 550 omitted + +# reduce 551 omitted + +# reduce 552 omitted + +def _reduce_553(val, _values, result) + result = @builder.string_compose(nil, val[0], nil) + + result +end + +def _reduce_554(val, _values, result) + result = [ val[0] ] + + result +end + +def _reduce_555(val, _values, result) + result = val[0] << val[1] + + result +end + +def _reduce_556(val, _values, result) + string = @builder.string_compose(val[0], val[1], val[2]) + result = @builder.dedent_string(string, @lexer.dedent_level) + + result +end + +def _reduce_557(val, _values, result) + string = @builder.string(val[0]) + result = @builder.dedent_string(string, @lexer.dedent_level) + + result +end + +def _reduce_558(val, _values, result) + result = @builder.character(val[0]) + + result +end + +def _reduce_559(val, _values, result) + string = @builder.xstring_compose(val[0], val[1], val[2]) + result = @builder.dedent_string(string, @lexer.dedent_level) + + result +end + +def _reduce_560(val, _values, result) + opts = @builder.regexp_options(val[3]) + result = @builder.regexp_compose(val[0], val[1], val[2], opts) + + result +end + +def _reduce_561(val, _values, result) + result = @builder.words_compose(val[0], val[1], val[2]) + + result +end + +def _reduce_562(val, _values, result) + result = [] + + result +end + +def _reduce_563(val, _values, result) + result = val[0] << @builder.word(val[1]) + + result +end + +def _reduce_564(val, _values, result) + result = [ val[0] ] + + result +end + +def _reduce_565(val, _values, result) + result = val[0] << val[1] + + result +end + +def _reduce_566(val, _values, result) + result = @builder.symbols_compose(val[0], val[1], val[2]) + + result +end + +def _reduce_567(val, _values, result) + result = [] + + result +end + +def _reduce_568(val, _values, result) + result = val[0] << @builder.word(val[1]) + + result +end + +def _reduce_569(val, _values, result) + result = @builder.words_compose(val[0], val[1], val[2]) + + result +end + +def _reduce_570(val, _values, result) + result = @builder.symbols_compose(val[0], val[1], val[2]) + + result +end + +def _reduce_571(val, _values, result) + result = [] + + result +end + +def _reduce_572(val, _values, result) + result = val[0] << @builder.string_internal(val[1]) + + result +end + +def _reduce_573(val, _values, result) + result = [] + + result +end + +def _reduce_574(val, _values, result) + result = val[0] << @builder.symbol_internal(val[1]) + + result +end + +def _reduce_575(val, _values, result) + result = [] + + result +end + +def _reduce_576(val, _values, result) + result = val[0] << val[1] + + result +end + +def _reduce_577(val, _values, result) + result = [] + + result +end + +def _reduce_578(val, _values, result) + result = val[0] << val[1] + + result +end + +def _reduce_579(val, _values, result) + result = [] + + result +end + +def _reduce_580(val, _values, result) + result = val[0] << val[1] + + result +end + +def _reduce_581(val, _values, result) + result = @builder.string_internal(val[0]) + + result +end + +def _reduce_582(val, _values, result) + result = val[1] + + result +end + +def _reduce_583(val, _values, result) + @lexer.cmdarg.push(false) + @lexer.cond.push(false) + + result +end + +def _reduce_584(val, _values, result) + @lexer.cmdarg.pop + @lexer.cond.pop + + result = @builder.begin(val[0], val[2], val[3]) + + result +end + +def _reduce_585(val, _values, result) + result = @builder.gvar(val[0]) + + result +end + +def _reduce_586(val, _values, result) + result = @builder.ivar(val[0]) + + result +end + +def _reduce_587(val, _values, result) + result = @builder.cvar(val[0]) + + result +end + +# reduce 588 omitted + +# reduce 589 omitted + +# reduce 590 omitted + +def _reduce_591(val, _values, result) + @lexer.state = :expr_end + result = @builder.symbol(val[0]) + + result +end + +def _reduce_592(val, _values, result) + @lexer.state = :expr_end + result = @builder.symbol_compose(val[0], val[1], val[2]) + + result +end + +def _reduce_593(val, _values, result) + result = val[0] + + result +end + +def _reduce_594(val, _values, result) + if @builder.respond_to? :negate + # AST builder interface compatibility + result = @builder.negate(val[0], val[1]) + else + result = @builder.unary_num(val[0], val[1]) + end + + result +end + +def _reduce_595(val, _values, result) + @lexer.state = :expr_end + result = @builder.integer(val[0]) + + result +end + +def _reduce_596(val, _values, result) + @lexer.state = :expr_end + result = @builder.float(val[0]) + + result +end + +def _reduce_597(val, _values, result) + @lexer.state = :expr_end + result = @builder.rational(val[0]) + + result +end + +def _reduce_598(val, _values, result) + @lexer.state = :expr_end + result = @builder.complex(val[0]) + + result +end + +def _reduce_599(val, _values, result) + result = @builder.ident(val[0]) + + result +end + +def _reduce_600(val, _values, result) + result = @builder.ivar(val[0]) + + result +end + +def _reduce_601(val, _values, result) + result = @builder.gvar(val[0]) + + result +end + +def _reduce_602(val, _values, result) + result = @builder.const(val[0]) + + result +end + +def _reduce_603(val, _values, result) + result = @builder.cvar(val[0]) + + result +end + +def _reduce_604(val, _values, result) + result = @builder.nil(val[0]) + + result +end + +def _reduce_605(val, _values, result) + result = @builder.self(val[0]) + + result +end + +def _reduce_606(val, _values, result) + result = @builder.true(val[0]) + + result +end + +def _reduce_607(val, _values, result) + result = @builder.false(val[0]) + + result +end + +def _reduce_608(val, _values, result) + result = @builder.__FILE__(val[0]) + + result +end + +def _reduce_609(val, _values, result) + result = @builder.__LINE__(val[0]) + + result +end + +def _reduce_610(val, _values, result) + result = @builder.__ENCODING__(val[0]) + + result +end + +def _reduce_611(val, _values, result) + result = @builder.accessible(val[0]) + + result +end + +def _reduce_612(val, _values, result) + result = @builder.accessible(val[0]) + + result +end + +def _reduce_613(val, _values, result) + result = @builder.assignable(val[0]) + + result +end + +def _reduce_614(val, _values, result) + result = @builder.assignable(val[0]) + + result +end + +def _reduce_615(val, _values, result) + result = @builder.nth_ref(val[0]) + + result +end + +def _reduce_616(val, _values, result) + result = @builder.back_ref(val[0]) + + result +end + +def _reduce_617(val, _values, result) + @lexer.state = :expr_value + + result +end + +def _reduce_618(val, _values, result) + result = [ val[0], val[2] ] + + result +end + +def _reduce_619(val, _values, result) + result = nil + + result +end + +# reduce 620 omitted + +def _reduce_621(val, _values, result) + result = @builder.args(nil, [], nil) + + result +end + +def _reduce_622(val, _values, result) + result = @builder.args(val[0], val[1], val[2]) + + @lexer.state = :expr_value + + result +end + +def _reduce_623(val, _values, result) + args = [ *val[1], @builder.forward_arg(val[3]) ] + result = @builder.args(val[0], args, val[4]) + + @static_env.declare_forward_args + + result +end + +def _reduce_624(val, _values, result) + result = @builder.forward_only_args(val[0], val[1], val[2]) + @static_env.declare_forward_args + + @lexer.state = :expr_value + + result +end + +# reduce 625 omitted + +def _reduce_626(val, _values, result) + result = @context.in_kwarg + @context.in_kwarg = true + + result +end + +def _reduce_627(val, _values, result) + @context.in_kwarg = val[0] + result = @builder.args(nil, val[1], nil) + + result +end + +def _reduce_628(val, _values, result) + result = val[0].concat(val[2]).concat(val[3]) + + result +end + +def _reduce_629(val, _values, result) + result = val[0].concat(val[1]) + + result +end + +def _reduce_630(val, _values, result) + result = val[0].concat(val[1]) + + result +end + +def _reduce_631(val, _values, result) + result = [ val[0] ] + + result +end + +def _reduce_632(val, _values, result) + result = val[1] + + result +end + +def _reduce_633(val, _values, result) + result = [] + + result +end + +def _reduce_634(val, _values, result) + result = val[0]. + concat(val[2]). + concat(val[4]). + concat(val[5]) + + result +end + +def _reduce_635(val, _values, result) + result = val[0]. + concat(val[2]). + concat(val[4]). + concat(val[6]). + concat(val[7]) + + result +end + +def _reduce_636(val, _values, result) + result = val[0]. + concat(val[2]). + concat(val[3]) + + result +end + +def _reduce_637(val, _values, result) + result = val[0]. + concat(val[2]). + concat(val[4]). + concat(val[5]) + + result +end + +def _reduce_638(val, _values, result) + result = val[0]. + concat(val[2]). + concat(val[3]) + + result +end + +def _reduce_639(val, _values, result) + result = val[0]. + concat(val[2]). + concat(val[4]). + concat(val[5]) + + result +end + +def _reduce_640(val, _values, result) + result = val[0]. + concat(val[1]) + + result +end + +def _reduce_641(val, _values, result) + result = val[0]. + concat(val[2]). + concat(val[3]) + + result +end + +def _reduce_642(val, _values, result) + result = val[0]. + concat(val[2]). + concat(val[4]). + concat(val[5]) + + result +end + +def _reduce_643(val, _values, result) + result = val[0]. + concat(val[1]) + + result +end + +def _reduce_644(val, _values, result) + result = val[0]. + concat(val[2]). + concat(val[3]) + + result +end + +def _reduce_645(val, _values, result) + result = val[0]. + concat(val[1]) + + result +end + +def _reduce_646(val, _values, result) + result = val[0]. + concat(val[2]). + concat(val[3]) + + result +end + +def _reduce_647(val, _values, result) + result = val[0] + + result +end + +def _reduce_648(val, _values, result) + result = [] + + result +end + +def _reduce_649(val, _values, result) + result = val[0] + + result +end + +def _reduce_650(val, _values, result) + diagnostic :error, :argument_const, nil, val[0] + + result +end + +def _reduce_651(val, _values, result) + diagnostic :error, :argument_ivar, nil, val[0] + + result +end + +def _reduce_652(val, _values, result) + diagnostic :error, :argument_gvar, nil, val[0] + + result +end + +def _reduce_653(val, _values, result) + diagnostic :error, :argument_cvar, nil, val[0] + + result +end + +# reduce 654 omitted + +def _reduce_655(val, _values, result) + @static_env.declare val[0][0] + + @max_numparam_stack.has_ordinary_params! + + result = val[0] + + result +end + +def _reduce_656(val, _values, result) + @current_arg_stack.set(val[0][0]) + result = val[0] + + result +end + +def _reduce_657(val, _values, result) + @current_arg_stack.set(0) + result = @builder.arg(val[0]) + + result +end + +def _reduce_658(val, _values, result) + result = @builder.multi_lhs(val[0], val[1], val[2]) + + result +end + +def _reduce_659(val, _values, result) + result = [ val[0] ] + + result +end + +def _reduce_660(val, _values, result) + result = val[0] << val[2] + + result +end + +def _reduce_661(val, _values, result) + check_kwarg_name(val[0]) + + @static_env.declare val[0][0] + + @max_numparam_stack.has_ordinary_params! + + @current_arg_stack.set(val[0][0]) + + result = val[0] + + result +end + +def _reduce_662(val, _values, result) + @current_arg_stack.set(nil) + result = @builder.kwoptarg(val[0], val[1]) + + result +end + +def _reduce_663(val, _values, result) + @current_arg_stack.set(nil) + result = @builder.kwarg(val[0]) + + result +end + +def _reduce_664(val, _values, result) + result = @builder.kwoptarg(val[0], val[1]) + + result +end + +def _reduce_665(val, _values, result) + result = @builder.kwarg(val[0]) + + result +end + +def _reduce_666(val, _values, result) + result = [ val[0] ] + + result +end + +def _reduce_667(val, _values, result) + result = val[0] << val[2] + + result +end + +def _reduce_668(val, _values, result) + result = [ val[0] ] + + result +end + +def _reduce_669(val, _values, result) + result = val[0] << val[2] + + result +end + +# reduce 670 omitted + +# reduce 671 omitted + +def _reduce_672(val, _values, result) + result = [ @builder.kwnilarg(val[0], val[1]) ] + + result +end + +def _reduce_673(val, _values, result) + @static_env.declare val[1][0] + + result = [ @builder.kwrestarg(val[0], val[1]) ] + + result +end + +def _reduce_674(val, _values, result) + result = [ @builder.kwrestarg(val[0]) ] + + result +end + +def _reduce_675(val, _values, result) + @current_arg_stack.set(0) + result = @builder.optarg(val[0], val[1], val[2]) + + result +end + +def _reduce_676(val, _values, result) + @current_arg_stack.set(0) + result = @builder.optarg(val[0], val[1], val[2]) + + result +end + +def _reduce_677(val, _values, result) + result = [ val[0] ] + + result +end + +def _reduce_678(val, _values, result) + result = val[0] << val[2] + + result +end + +def _reduce_679(val, _values, result) + result = [ val[0] ] + + result +end + +def _reduce_680(val, _values, result) + result = val[0] << val[2] + + result +end + +# reduce 681 omitted + +# reduce 682 omitted + +def _reduce_683(val, _values, result) + @static_env.declare val[1][0] + + result = [ @builder.restarg(val[0], val[1]) ] + + result +end + +def _reduce_684(val, _values, result) + result = [ @builder.restarg(val[0]) ] + + result +end + +# reduce 685 omitted + +# reduce 686 omitted + +def _reduce_687(val, _values, result) + @static_env.declare val[1][0] + + result = @builder.blockarg(val[0], val[1]) + + result +end + +def _reduce_688(val, _values, result) + result = [ val[1] ] + + result +end + +def _reduce_689(val, _values, result) + result = [] + + result +end + +# reduce 690 omitted + +def _reduce_691(val, _values, result) + result = val[1] + + result +end + +def _reduce_692(val, _values, result) + result = [] + + result +end + +# reduce 693 omitted + +def _reduce_694(val, _values, result) + result = [ val[0] ] + + result +end + +def _reduce_695(val, _values, result) + result = val[0] << val[2] + + result +end + +def _reduce_696(val, _values, result) + result = @builder.pair(val[0], val[1], val[2]) + + result +end + +def _reduce_697(val, _values, result) + result = @builder.pair_keyword(val[0], val[1]) + + result +end + +def _reduce_698(val, _values, result) + result = @builder.pair_quoted(val[0], val[1], val[2], val[3]) + + result +end + +def _reduce_699(val, _values, result) + result = @builder.kwsplat(val[0], val[1]) + + result +end + +# reduce 700 omitted + +# reduce 701 omitted + +# reduce 702 omitted + +# reduce 703 omitted + +# reduce 704 omitted + +# reduce 705 omitted + +# reduce 706 omitted + +# reduce 707 omitted + +# reduce 708 omitted + +# reduce 709 omitted + +# reduce 710 omitted + +# reduce 711 omitted + +def _reduce_712(val, _values, result) + result = [:dot, val[0][1]] + + result +end + +def _reduce_713(val, _values, result) + result = [:anddot, val[0][1]] + + result +end + +# reduce 714 omitted + +# reduce 715 omitted + +# reduce 716 omitted + +# reduce 717 omitted + +def _reduce_718(val, _values, result) + result = val[1] + + result +end + +def _reduce_719(val, _values, result) + result = val[1] + + result +end + +def _reduce_720(val, _values, result) + result = val[1] + + result +end + +# reduce 721 omitted + +# reduce 722 omitted + +# reduce 723 omitted + +def _reduce_724(val, _values, result) + yyerrok + + result +end + +# reduce 725 omitted + +# reduce 726 omitted + +# reduce 727 omitted + +def _reduce_728(val, _values, result) + result = nil + + result +end + +def _reduce_none(val, _values, result) + val[0] +end + + end # class Ruby30 + end # module Parser diff --git a/vendor/bundle/ruby/3.1.0/gems/parser-3.1.2.0/lib/parser/ruby31.rb b/vendor/bundle/ruby/3.1.0/gems/parser-3.1.2.0/lib/parser/ruby31.rb new file mode 100644 index 000000000..690d4b463 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/parser-3.1.2.0/lib/parser/ruby31.rb @@ -0,0 +1,8354 @@ +# -*- encoding:utf-8; warn-indent:false; frozen_string_literal: true -*- +# +# DO NOT MODIFY!!!! +# This file is automatically generated by Racc 1.4.15 +# from Racc grammer file "". +# + +require 'racc/parser.rb' + + +require 'parser' + +module Parser + class Ruby31 < Parser::Base + + + def version + 31 + end + + def default_encoding + Encoding::UTF_8 + end + + def endless_method_name(name_t) + if !%w[=== == != <= >=].include?(name_t[0]) && name_t[0].end_with?('=') + diagnostic :error, :endless_setter, nil, name_t + end + end + + def local_push + @static_env.extend_static + @lexer.cmdarg.push(false) + @lexer.cond.push(false) + @max_numparam_stack.push(static: true) + end + + def local_pop + @static_env.unextend + @lexer.cmdarg.pop + @lexer.cond.pop + @max_numparam_stack.pop + end + + def try_declare_numparam(node) + name = node.children[0] + + if name =~ /\A_[1-9]\z/ && !static_env.declared?(name) && @context.in_dynamic_block? + # definitely an implicit param + location = node.loc.expression + + if max_numparam_stack.has_ordinary_params? + diagnostic :error, :ordinary_param_defined, nil, [nil, location] + end + + raw_max_numparam_stack = max_numparam_stack.stack.dup + # ignore current block scope + raw_max_numparam_stack.pop + + raw_max_numparam_stack.reverse_each do |outer_scope| + if outer_scope[:static] + # found an outer scope that can't have numparams + # like def/class/etc + break + else + outer_scope_has_numparams = outer_scope[:value] > 0 + + if outer_scope_has_numparams + diagnostic :error, :numparam_used_in_outer_scope, nil, [nil, location] + else + # for now it's ok, but an outer scope can also be a block + # like proc { _1; proc { proc { proc { _2 }} }} + # with numparams, so we need to continue + end + end + end + + static_env.declare(name) + max_numparam_stack.register(name[1].to_i) + + true + else + false + end + end +##### State transition tables begin ### + +clist = [ +'-320,600,620,-119,1214,-121,-118,-320,-320,-320,221,222,1124,-320,-320', +'-624,-320,239,620,-123,620,925,-624,-110,-320,-732,237,428,-124,311', +'122,-122,430,429,717,311,-320,-320,620,-320,-320,-320,-320,-320,-116', +'-117,-124,620,620,-116,1001,828,718,627,892,925,627,126,240,-732,-123', +'833,125,-117,240,240,-320,-320,-320,-320,-320,-320,-320,-320,-320,-320', +'-320,-320,-320,-320,-624,-123,-320,-320,-320,-124,687,-320,-119,-110', +'-320,-121,-120,-320,1125,240,-720,135,-320,306,-320,-511,-320,-320,240', +'-320,-320,-320,-320,-320,-320,-320,-110,-320,-112,-109,310,-320,-320', +'-320,126,-120,310,-320,-320,125,-320,-320,-114,-110,-320,-320,-110,-113', +'-320,-320,126,-115,126,990,-113,125,-320,125,-110,-122,-320,-320,-122', +'-320,-320,-320,-320,-320,-118,126,126,-719,-107,1000,125,125,-116,-117', +'-124,126,126,-116,-117,-124,125,125,-108,221,222,218,-320,-320,-320', +'-320,-320,-320,-320,-320,-320,-320,-320,-320,-320,-320,221,222,-320', +'-320,-320,311,687,-320,-719,-123,-320,-111,661,-320,-123,648,-119,925', +'-320,-121,-320,-119,-320,-320,-121,-320,-320,-320,-320,-320,233,-320', +'-723,-320,-628,-720,-629,221,222,-723,-723,-723,104,105,-723,-723,-723', +'-320,-723,-120,-320,-320,-102,-320,-120,-320,-723,-723,-723,-723,-723', +'663,-320,924,-88,-122,219,-112,-723,-723,522,-723,-723,-723,-723,-723', +'-122,240,660,650,649,-122,-118,-111,-109,220,-744,-118,311,648,233,223', +'310,-116,240,-117,1063,300,-723,-723,-723,-723,-723,-723,-723,-723,-723', +'-723,-723,-723,-723,-723,233,682,-723,-723,-723,648,921,-723,106,107', +'-723,104,105,-723,-723,662,-723,-124,-723,126,-723,-112,-723,-723,125', +'-723,-723,-723,-723,-723,361,-723,-723,-723,-744,683,-719,-111,-109', +'648,306,650,649,646,648,362,648,-723,-110,648,-723,-723,-723,-723,240', +'-723,-744,-723,800,-320,-119,-112,-723,310,-112,-120,-320,-320,-320', +'650,649,-320,-320,-320,892,-320,-112,-111,-109,859,-111,-109,-112,-320', +'833,-320,-320,-320,875,106,107,919,-111,-109,-121,-320,-320,431,-320', +'-320,-320,-320,-320,650,649,646,949,471,650,649,650,649,655,650,649', +'653,920,1035,861,633,1063,233,-732,634,948,-320,-320,-320,-320,-320', +'-320,-320,-320,-320,-320,-320,-320,-320,-320,240,-629,-320,-320,-320', +'648,922,-320,-118,-635,-320,-119,-625,-320,-320,648,-320,-617,-320,-625', +'-320,510,-320,-320,-617,-320,-320,-320,-320,-320,683,-320,682,-320,507', +'506,-121,-118,-744,491,648,488,487,486,496,489,521,-320,-108,-623,-320', +'-320,-320,-320,499,-320,-623,-320,126,-723,-117,612,-320,125,614,-122', +'-723,-723,-723,650,649,651,-723,-723,633,-723,494,-625,960,650,649,664', +'-617,-723,-723,504,503,507,506,-121,633,-119,500,523,960,-723,-723,524', +'-723,-723,-723,-723,-723,239,650,649,659,491,-321,488,487,486,496,489', +'-623,-321,600,491,240,488,487,486,499,489,-321,-723,-723,-723,-723,-723', +'-723,-723,-723,-723,-723,-723,-723,-723,-723,558,-628,-723,-723,-723', +'494,688,-723,570,126,-723,648,572,-723,125,710,507,506,-723,574,-723', +'500,-723,-723,-114,-723,-723,-723,-723,-723,-614,-723,-723,-723,-321', +'126,-123,-614,-614,-614,125,135,-614,-614,-614,-614,-614,-723,-107,-87', +'-723,-723,-614,-723,-614,-723,-614,-614,-614,931,-116,485,-723,240,927', +'-120,-614,-614,928,-614,-614,-614,-614,-614,585,650,649,646,586,-311', +'227,-620,-621,227,950,951,-311,304,-620,-621,304,612,593,237,611,-311', +'-614,-614,-614,-614,-614,-614,-614,-614,-614,-614,-614,-614,-614,-614', +'-614,227,-614,-614,-614,227,-614,-614,592,315,-614,240,1188,-614,-614', +'233,-614,590,-614,126,-614,638,-614,-614,125,-614,-614,-614,-614,-614', +'-115,-614,-617,-614,-311,228,-620,-621,228,-617,-617,-617,-124,233,-617', +'-617,-617,-614,-617,306,-614,-614,-614,-614,597,-614,-617,-614,-617', +'-617,-617,612,-614,603,614,-614,228,264,-617,-617,228,-617,-617,-617', +'-617,-617,606,227,240,227,615,-356,-619,-622,675,616,636,574,-356,-619', +'-622,612,627,673,614,638,420,-356,-617,-617,-617,-617,-617,-617,-617', +'-617,-617,-617,-617,-617,-617,-617,631,754,-617,-617,-617,227,-617,-617', +'1149,1150,-617,499,630,-617,-617,632,-617,875,-617,640,-617,628,-617', +'-617,665,-617,-617,-617,-617,-617,228,-617,228,-617,-356,-619,-622,668', +'227,669,954,240,958,957,1197,1188,959,-617,-293,500,-617,-617,-617,-617', +'638,-617,671,-617,672,-723,676,1056,-617,240,-109,-617,-723,-723,-723', +'496,228,680,-723,-723,-320,-723,-118,956,264,499,681,-320,306,-723,-723', +'694,-720,985,892,695,-320,114,113,115,116,-723,-723,240,-723,-723,-723', +'-723,-723,228,221,222,697,118,117,119,261,700,507,506,263,262,701,500', +'703,264,104,105,221,222,358,-723,-723,-723,-723,-723,-723,-723,-723', +'-723,-723,-723,-723,-723,-723,-320,705,-723,-723,-723,-385,688,-723', +'227,719,-723,720,261,-723,227,1164,263,262,-723,724,-723,226,-723,-723', +'1162,-723,-723,-723,-723,-723,224,-723,-723,-723,726,102,90,93,94,732', +'95,97,96,98,754,985,892,-723,91,101,-723,-723,90,-111,499,-723,85,733', +'92,106,107,264,-723,264,91,-120,333,81,82,83,11,65,264,228,92,71,72', +'264,240,228,75,-723,73,74,76,35,36,79,80,788,240,240,500,240,84,33,32', +'114,113,115,116,-102,803,23,1056,240,606,281,282,10,53,335,12,118,117', +'119,108,64,110,109,111,814,112,120,121,-320,104,105,49,50,48,-321,-320', +'-723,819,-626,240,-720,-321,821,-723,-320,-626,280,279,-719,824,-321', +'829,-723,45,-626,830,38,834,858,66,67,227,862,68,863,40,-294,876,602', +'52,491,-723,488,487,486,558,489,520,24,558,888,892,910,102,90,93,94', +'913,95,97,96,98,914,-320,240,917,91,101,240,-321,926,-723,943,-626,85', +'944,92,106,107,945,962,46,47,333,81,82,83,11,65,964,300,970,71,72,972', +'974,228,75,-716,73,74,76,35,36,79,80,572,574,496,814,240,84,33,32,114', +'113,115,116,499,1159,23,488,487,486,306,489,10,53,335,12,118,117,119', +'108,64,110,109,111,306,112,120,121,227,104,105,49,50,48,-627,519,-614', +'507,506,814,264,-627,500,-614,520,892,987,988,-716,240,-627,240,-614', +'45,998,240,38,-295,240,66,67,1009,1013,68,1159,40,488,487,486,52,489', +'-716,-293,491,1017,488,487,486,24,489,700,718,1020,102,90,93,94,1022', +'95,97,96,98,1024,228,1026,1026,91,101,240,-627,774,-614,240,240,85,1054', +'92,106,107,1057,710,46,47,333,81,82,83,11,65,714,853,854,71,72,855,120', +'121,75,-717,73,74,76,35,36,79,80,129,130,131,132,133,84,33,32,114,113', +'115,116,925,491,23,488,487,486,972,489,10,53,335,12,118,117,119,108', +'64,110,109,111,1069,112,120,121,240,104,105,49,50,48,814,491,-617,488', +'487,486,1086,489,710,-617,1088,1093,1094,1099,-717,1100,1101,714,-617', +'45,-296,1114,38,1115,1116,66,67,240,240,68,240,40,240,240,240,52,925', +'-717,710,491,1123,488,487,486,24,489,240,714,1129,102,90,93,94,1130', +'95,97,96,98,1132,700,1135,1138,91,101,1140,1142,240,-617,-385,1154,85', +'1165,92,106,107,1166,710,46,47,333,81,82,83,11,65,1026,1026,1026,71', +'72,1173,1186,1189,75,1194,73,74,76,35,36,79,80,256,1195,694,1115,1205', +'84,33,32,114,113,115,116,1205,700,23,129,130,131,132,133,10,53,335,12', +'118,117,119,108,64,110,109,111,1208,112,120,121,1210,104,105,49,50,48', +'264,268,269,270,271,281,282,276,277,272,273,1212,257,258,1214,1214,274', +'275,240,45,1026,255,38,1205,-720,66,67,-719,1231,68,1214,40,261,1214', +'267,52,263,262,1214,259,260,280,279,265,24,266,3,,,102,90,93,94,,95', +'97,96,98,,,,,91,101,,278,,,,,85,,92,106,107,,,46,47,333,81,82,83,11', +'65,,,,71,72,,,,75,,73,74,76,35,36,79,80,129,130,131,132,133,84,33,32', +'114,113,115,116,,,23,,,,,677,10,53,335,12,118,117,119,108,64,110,109', +'111,,112,120,121,,104,105,49,50,48,264,268,269,270,271,281,282,276,277', +'272,273,,257,258,,,274,275,,45,,,38,,,66,67,,,68,,40,261,,267,52,263', +'262,,259,260,280,279,265,24,266,,,,102,90,93,94,,95,97,96,98,,,,,91', +'101,,278,,-265,,,85,,92,106,107,,,46,47,333,81,82,83,11,65,,,,71,72', +',,,75,,73,74,76,35,36,79,80,129,130,131,132,133,84,33,32,114,113,115', +'116,,,23,,,,,889,10,53,335,12,118,117,119,108,64,110,109,111,,112,120', +'121,,104,105,49,50,48,264,268,269,270,271,281,282,276,277,272,273,,257', +'258,,,274,275,,45,,,337,,,66,67,,,68,,40,261,,267,52,263,262,,259,260', +'280,279,265,24,266,,,,102,90,93,94,,95,97,96,98,,,,,91,101,,278,,,,', +'85,,92,106,107,,,46,47,333,81,82,83,11,65,,,,71,72,,,,75,,73,74,76,35', +'36,79,80,,,,,,84,33,32,114,113,115,116,,,23,,,,,677,10,53,335,12,118', +'117,119,108,64,110,109,111,,112,120,121,,104,105,49,50,48,264,268,269', +'270,271,281,282,276,277,272,273,,257,258,,,274,275,,45,,,337,,,66,67', +',,68,,40,261,,267,52,263,262,,259,260,280,279,265,24,266,,,,102,90,93', +'94,,95,97,96,98,,,,,91,101,,278,,,,,85,,92,106,107,,,46,47,333,81,82', +'83,11,65,,,,71,72,,,,75,,73,74,76,35,36,79,80,,,,,,84,33,32,114,113', +'115,116,,,23,,,,,918,10,53,335,12,118,117,119,108,64,110,109,111,,112', +'120,121,,104,105,49,50,48,264,268,269,270,271,281,282,276,277,272,273', +',257,258,,,274,275,,45,,,38,,,66,67,,,68,,40,261,,267,52,263,262,,259', +'260,280,279,265,24,266,,,,102,90,93,94,,95,97,96,98,,,,,91,101,,278', +',,,,85,,92,106,107,,,46,47,333,81,82,83,11,65,,,,71,72,,,,75,,73,74', +'76,35,36,79,80,,,,,,84,33,32,114,113,115,116,,,23,,,,,,10,53,335,12', +'118,117,119,108,64,110,109,111,,112,120,121,,104,105,49,50,48,264,268', +'269,270,271,281,282,276,277,272,273,,257,258,,,274,275,,45,,,38,,,66', +'67,,,68,,40,261,,267,52,263,262,,259,260,280,279,265,24,266,,,,102,90', +'93,94,,95,97,96,98,,,,,91,101,,278,,,,,85,,92,106,107,,,46,47,333,81', +'82,83,11,65,,,,71,72,,,,75,,73,74,76,35,36,79,80,,,,,,84,33,32,114,113', +'115,116,,,23,,,,,,10,53,335,12,118,117,119,108,64,110,109,111,,112,120', +'121,,104,105,49,50,48,264,268,269,270,271,281,282,276,277,272,273,,257', +'258,,,274,275,,45,,,38,,,66,67,,,68,,40,261,,267,52,263,262,,259,260', +'280,279,265,24,266,,,,102,90,93,94,,95,97,96,98,,,,,91,101,,278,,,,', +'85,,92,106,107,,,46,47,333,81,82,83,11,65,,,,71,72,,,,75,,73,74,76,35', +'36,79,80,,,,,,84,33,32,114,113,115,116,,,23,,,,,,10,53,335,12,118,117', +'119,108,64,110,109,111,,112,120,121,,104,105,49,50,48,264,268,269,270', +'271,281,282,276,277,272,273,,257,258,,,274,275,,45,,,38,,,66,67,,,68', +',40,261,,267,52,263,262,,259,260,280,279,265,24,266,,,,102,90,93,94', +',95,97,96,98,,,,,91,101,,278,,,,,85,,92,106,107,,,46,47,7,81,82,83,11', +'65,,,,71,72,,,,75,,73,74,76,35,36,79,80,,,,,,84,33,32,114,113,115,116', +',,23,,,,,,10,53,9,12,118,117,119,108,64,110,109,111,,112,120,121,,104', +'105,49,50,48,264,268,269,270,271,281,282,276,277,272,273,,257,258,,', +'274,275,,45,,,38,,,66,67,,,68,,40,261,,267,52,263,262,,259,260,280,279', +'265,24,266,,,,102,90,93,94,,95,97,96,98,,,,,91,101,240,278,,,,,85,,92', +'106,107,,,46,47,333,81,82,83,11,65,,,,71,72,,,,75,,73,74,76,35,36,79', +'80,,,,,,84,33,32,114,113,115,116,,,23,,,,,,10,53,335,12,118,117,119', +'108,64,110,109,111,,112,120,121,,104,105,49,50,48,264,268,269,270,271', +'281,282,276,277,272,273,,257,258,,,274,275,,45,,,38,,,66,67,,,68,,40', +'261,,267,52,263,262,,259,260,280,279,265,24,266,,,,102,90,93,94,,95', +'97,96,98,,,,,91,101,,278,,,,,85,,92,106,107,,,46,47,333,81,82,83,11', +'65,,,,71,72,,,,75,,73,74,76,35,36,79,80,,,,,,84,33,32,114,113,115,116', +',,23,,,,,,10,53,335,12,118,117,119,108,64,110,109,111,,112,120,121,', +'104,105,49,50,48,264,268,269,270,271,281,282,276,277,272,273,,257,258', +',,274,275,,45,,,337,,,66,67,,,68,,40,261,,267,52,263,262,,259,260,280', +'279,265,24,266,,,,102,90,93,94,,95,97,96,98,,,,,91,101,,278,,,,,85,', +'92,106,107,,,46,47,333,81,82,83,11,65,,,,71,72,,,,75,,73,74,76,35,36', +'79,80,,,,,,84,33,32,114,113,115,116,,,23,,,,,,10,53,335,12,118,117,119', +'108,64,110,109,111,,112,120,121,,104,105,49,50,48,264,268,269,270,271', +'281,282,276,277,272,273,,257,258,,,274,275,,45,,,38,,,66,67,,,68,,40', +'261,,267,52,263,262,,259,260,280,279,265,24,266,,,,102,90,93,94,,95', +'97,96,98,,,,,91,101,,278,,,,,85,,92,106,107,,,46,47,333,81,82,83,11', +'65,,,,71,72,,,,75,,73,74,76,35,36,79,80,,,,,,84,33,32,114,113,115,116', +',,23,,,,,,10,53,335,12,118,117,119,108,64,110,109,111,,112,120,121,', +'104,105,49,50,48,264,268,269,270,271,281,282,276,277,272,273,,257,258', +',,274,275,,45,,,38,,,66,67,,,68,,40,261,,267,52,263,262,,259,260,280', +'279,265,24,266,,,,102,90,93,94,,95,97,96,98,,,,,91,101,,278,,,,,85,', +'92,106,107,,,46,47,333,81,82,83,11,65,,,,71,72,,,,75,,73,74,76,35,36', +'79,80,,,,,,84,33,32,114,113,115,116,,,23,,,,,,10,53,335,12,118,117,119', +'108,64,110,109,111,,112,120,121,,104,105,49,50,48,264,268,269,270,271', +'281,282,276,277,272,273,,257,258,,,274,275,,45,,,38,,,66,67,,,68,,40', +'261,,267,52,263,262,,259,260,280,279,265,24,266,,,,102,90,93,94,,95', +'97,96,98,,,,,91,101,,278,,,,,85,,92,106,107,,,46,47,333,81,82,83,11', +'65,,,,71,72,,,,75,,73,74,76,35,36,79,80,,,,,,84,33,32,114,113,115,116', +',,23,,,,,,10,53,335,12,118,117,119,108,64,110,109,111,,112,120,121,', +'104,105,49,50,48,264,268,269,270,271,281,282,276,277,272,273,,-745,-745', +',,274,275,,45,,,38,,,66,67,,264,68,,40,261,,267,52,263,262,,259,260', +'280,279,265,24,266,,,,102,90,93,94,,95,97,96,98,,,261,,91,101,263,262', +',259,260,,85,,92,106,107,,,46,47,333,81,82,83,11,65,,,,71,72,,,,75,', +'73,74,76,35,36,79,80,,,,,,84,33,32,114,113,115,116,264,491,23,488,487', +'486,,489,10,53,335,12,118,117,119,108,64,110,109,111,,112,120,121,,104', +'105,49,50,48,264,,261,,,,263,262,710,259,260,,,,,,274,275,,45,,,38,', +',66,67,,,68,,40,261,,267,52,263,262,,259,260,,,265,24,266,,,,102,90', +'93,94,,95,97,96,98,,,,,91,101,,,,,,,85,,92,106,107,,,46,47,333,81,82', +'83,11,65,,,,71,72,,,,75,,73,74,76,35,36,79,80,,,,,,84,33,32,114,113', +'115,116,,,23,,,,,,10,53,335,12,118,117,119,108,64,110,109,111,,112,120', +'121,,104,105,49,50,48,264,268,269,270,271,281,282,276,277,272,273,,-745', +'-745,,,274,275,,45,,,38,,,66,67,,,68,,40,261,,267,52,263,262,,259,260', +'280,279,265,24,266,,,,102,90,93,94,,95,97,96,98,,,,,91,101,,,,,,,85', +',92,106,107,,,46,47,333,81,82,83,11,65,,,,71,72,,,,75,,73,74,76,35,36', +'79,80,,,,,,84,33,32,114,113,115,116,,,23,,,,,,10,53,335,12,118,117,119', +'108,64,110,109,111,,112,120,121,,104,105,49,50,48,264,268,269,270,271', +'281,282,276,277,272,273,,-745,-745,,,274,275,,45,,,38,,,66,67,,,68,', +'40,261,,267,52,263,262,,259,260,280,279,265,24,266,,,,102,90,93,94,', +'95,97,96,98,,,,,91,101,,,,,,,85,,92,106,107,,,46,47,333,81,82,83,11', +'65,,,,71,72,,,,75,,73,74,76,35,36,79,80,,,,,,84,33,32,114,113,115,116', +',,23,,,,,,10,53,335,12,118,117,119,108,64,110,109,111,,112,120,121,', +'104,105,49,50,48,264,,,,,,,,,,,,,,,,274,275,,45,,,38,,,66,67,,,68,,40', +'261,,267,52,263,262,,259,260,,,265,24,266,,,,102,90,93,94,,95,97,96', +'98,,,,,91,101,,,,,,,85,,92,106,107,,,46,47,333,81,82,83,11,65,,,,71', +'72,,,,75,,73,74,76,35,36,79,80,,,,,,84,33,32,114,113,115,116,,,23,,', +',,,10,53,335,12,118,117,119,108,64,110,109,111,,112,120,121,,104,105', +'49,50,48,264,268,269,270,271,281,282,276,,272,273,,,,,,274,275,,45,', +',38,,,66,67,,,68,,40,261,,267,52,263,262,,259,260,280,279,265,24,266', +',,,102,90,93,94,,95,97,96,98,,,,,91,101,,,,,,,85,,92,106,107,,,46,47', +'7,81,82,83,11,65,,,,71,72,,,,75,,73,74,76,35,36,79,80,,,,,,84,33,32', +'114,113,115,116,,,23,,,,,,10,53,9,12,118,117,119,108,64,110,109,111', +',112,120,121,,104,105,49,50,48,264,268,269,270,271,281,282,,,272,273', +',,,,,274,275,,45,,,38,,,66,67,,,68,,40,261,,267,52,263,262,,259,260', +'280,279,265,24,266,,,,102,90,93,94,,95,97,96,98,,,,,91,101,,,,,,,85', +',92,106,107,,,46,47,333,81,82,83,11,65,,,,71,72,,,,75,,73,74,76,35,36', +'79,80,,,,,,84,33,32,114,113,115,116,,,23,,,,,,10,53,335,12,118,117,119', +'108,64,110,109,111,,112,120,121,,104,105,49,50,48,264,-745,-745,-745', +'-745,281,282,,,-745,-745,,,,,,274,275,,45,,,38,,,66,67,,,68,,40,261', +',267,52,263,262,,259,260,280,279,265,24,266,,,,102,90,93,94,,95,97,96', +'98,,,,,91,101,,,,,,,85,,92,106,107,,,46,47,333,81,82,83,11,65,,,,71', +'72,,,,75,,73,74,76,35,36,79,80,,,,,,84,33,32,114,113,115,116,,,23,,', +',,,10,53,335,12,118,117,119,108,64,110,109,111,,112,120,121,,104,105', +'49,50,48,264,-745,-745,-745,-745,281,282,,,-745,-745,,,,,,274,275,,45', +',,38,,,66,67,,,68,,40,261,,267,52,263,262,,259,260,280,279,265,24,266', +',,,102,90,93,94,,95,97,96,98,,,,,91,101,,,,,,,85,,92,106,107,,,46,47', +'333,81,82,83,11,65,,,,71,72,,,,75,,73,74,76,35,36,79,80,,,,,,84,33,32', +'114,113,115,116,,,23,,,,,,10,53,335,12,118,117,119,108,64,110,109,111', +',112,120,121,,104,105,49,50,48,264,-745,-745,-745,-745,281,282,,,-745', +'-745,,,,,,274,275,,45,,,38,,,66,67,,,68,,40,261,,267,52,263,262,,259', +'260,280,279,265,24,266,,,,102,90,93,94,,95,97,96,98,,,,,91,101,,,,,', +',85,,92,106,107,,,46,47,333,81,82,83,11,65,,,,71,72,,,,75,,73,74,76', +'35,36,79,80,,,,,,84,33,32,114,113,115,116,,,23,,,,,,10,53,335,12,118', +'117,119,108,64,110,109,111,,112,120,121,,104,105,49,50,48,264,-745,-745', +'-745,-745,281,282,,,-745,-745,,,,,,274,275,,45,,,38,,,66,67,,,68,,40', +'261,,267,52,263,262,,259,260,280,279,265,24,266,,,,102,90,93,94,,95', +'97,96,98,,,,,91,101,,,,,,,85,,92,106,107,,,46,47,333,81,82,83,11,65', +',,,71,72,,,,75,,73,74,76,35,36,79,80,,,,,,84,33,32,114,113,115,116,', +',23,,,,,,10,53,335,12,118,117,119,108,64,110,109,111,,112,120,121,,104', +'105,49,50,48,264,-745,-745,-745,-745,281,282,,,-745,-745,,,,,,274,275', +',45,,,38,,,66,67,,,68,,40,261,,267,52,263,262,,259,260,280,279,265,24', +'266,,,,102,90,93,94,,95,97,96,98,,,,,91,101,,,,81,82,83,85,65,92,106', +'107,71,72,46,47,,75,,73,74,76,354,355,79,80,,,,,,84,349,357,114,113', +'115,116,,,254,,,,,,,53,,,118,117,119,108,64,110,109,111,,112,120,121', +',104,105,49,50,48,264,-745,-745,-745,-745,281,282,,,-745,-745,,,,,,274', +'275,,245,,,253,,,66,67,,,68,,,261,,267,52,263,262,,259,260,280,279,265', +'250,266,,,,102,90,93,94,,95,97,96,98,,,,,91,101,,,,81,82,83,85,65,92', +'106,107,71,72,46,47,,75,,73,74,76,354,355,79,80,,,,,,84,349,357,114', +'113,115,116,,,254,,,,,,,53,,,118,117,119,108,64,110,109,111,,112,120', +'121,,104,105,49,50,48,264,268,269,270,271,281,282,276,277,272,273,,-745', +'-745,,,274,275,,245,,,253,,,66,67,,,68,,,261,,267,52,263,262,,259,260', +'280,279,265,250,266,,,,102,90,93,94,,95,97,96,98,,,,,91,101,,,,81,82', +'83,85,65,92,106,107,71,72,46,47,,75,,73,74,76,354,355,79,80,,,,,,84', +'349,357,114,113,115,116,,,254,,,,,,,53,,,118,117,119,108,64,110,109', +'111,,112,120,121,,104,105,49,50,48,264,,,,,,,,,,,,,,,,274,275,,245,', +',253,,,66,67,,,68,,,261,,267,52,263,262,,259,260,,,,250,,,,,102,90,93', +'94,,95,97,96,98,,,,,91,101,,,,81,82,83,85,65,92,106,107,71,72,46,47', +',75,,73,74,76,354,355,79,80,,,,,,84,349,357,114,113,115,116,,,254,,', +',,,,53,,,118,117,119,108,64,110,109,111,,112,120,121,,104,105,49,50', +'48,264,,,,,,,,,,,,,,,,274,275,,245,,,253,,,66,67,,,68,,,261,,,52,263', +'262,,259,260,,,,250,,,,,102,90,93,94,,95,97,96,98,,,,,91,101,,,,81,82', +'83,85,65,92,106,107,71,72,46,47,,75,,73,74,76,354,355,79,80,,,,,,84', +'349,357,114,113,115,116,,,254,,,,,,,53,,,118,117,119,108,64,110,109', +'111,,112,120,121,,104,105,49,50,48,264,,,,,,,,,,,,,,,,274,275,,245,', +',253,,,66,67,,,68,,,261,,267,52,263,262,,259,260,,,,250,,,,,102,90,93', +'94,,95,97,96,98,,,,,91,101,,,,,,,85,,92,106,107,,,46,47,81,82,83,11', +'65,,,,71,72,,,,75,,73,74,76,35,36,79,80,,,,,,84,33,32,114,113,115,116', +',,23,,,,,,10,53,,12,118,117,119,108,64,110,109,111,,112,120,121,,104', +'105,49,50,48,,,,,,,,,,,,,,,,,,,,45,,,38,,,66,67,,,68,,40,,,,52,,,,,', +',,,24,,,,,102,90,93,94,,95,97,96,98,,,,,91,101,,,,81,82,83,85,65,92', +'106,107,71,72,46,47,,75,,73,74,76,354,355,79,80,,,,,,84,349,357,114', +'113,115,116,,,254,,,,,,,53,,,118,117,119,108,64,110,109,111,,112,120', +'121,,104,105,49,50,48,,,,,,,,,,,,,,,,,,,,245,,,253,,,66,67,,,68,,,,', +',52,,,,,,,,,250,,,,,102,90,93,94,,95,97,96,98,,,,,91,101,,,,81,82,83', +'85,65,92,106,107,71,72,46,47,,75,,73,74,76,354,355,79,80,,,,,,84,349', +'357,114,113,115,116,,,254,,,,,,,53,,,118,117,119,108,64,110,109,111', +',112,120,121,,104,105,49,50,48,,,,,,,,,,,,,,,,,,,,245,,,253,,,66,67', +',,68,,,,,,52,,,,,,,,,250,,,,,102,90,93,94,,95,97,96,98,,,,,91,101,,', +',81,82,83,85,65,92,106,107,71,72,46,47,,75,,73,74,76,354,355,79,80,', +',,,,84,349,357,114,113,115,116,,,254,,,,,,,53,,,118,117,119,108,64,110', +'109,111,,112,120,121,,104,105,49,50,48,,,,,,,,,,,,,,,,,,,,245,,,253', +',,66,67,,,68,,,,,,52,,,,,,,,,250,,,,,102,90,93,94,,95,97,96,98,,,,,91', +'101,,,,81,82,83,85,65,92,106,107,71,72,46,47,,75,,73,74,76,354,355,79', +'80,,,,,,84,349,357,114,113,115,116,,,254,,,,,,,53,,,118,117,119,108', +'64,110,109,111,,112,120,121,,104,105,49,50,48,,,,,,,,,,,,,,,,,,,,245', +',,253,,,66,67,,,68,,,,,,52,,,,,,,,,250,,,,,102,90,93,94,,95,97,96,98', +',,,,91,101,,,,81,82,83,85,65,92,106,107,71,72,46,47,,75,,73,74,76,354', +'355,79,80,,,,,,84,349,357,114,113,115,116,,,254,,,,,,,53,,,118,117,119', +'108,64,110,109,111,,112,120,121,,104,105,49,50,48,,,,,,,,,,,,,,,,,,', +',245,,,253,,,66,67,,,68,,,,,,52,,,,,,,,,250,,,,,102,90,93,94,,95,97', +'96,98,,,,,91,101,,,,81,82,83,85,65,92,106,107,71,72,46,47,,75,,73,74', +'76,354,355,79,80,,,,,,84,349,357,114,113,115,116,,,254,,,,,,,53,,,118', +'117,119,108,64,110,109,111,,112,120,121,,104,105,49,50,48,,,,,,,,,,', +',,,,,,,,,245,,,253,,,66,67,,,68,,,,,,52,,,,,,,,,250,,,,,102,90,93,94', +',95,97,96,98,,,,,91,101,,,,81,82,83,85,65,92,106,107,71,72,46,47,,75', +',73,74,76,354,355,79,80,,,,,,84,349,357,114,113,115,116,,,254,,,,,,', +'53,,,118,117,119,108,64,110,109,111,,112,120,121,,104,105,49,50,48,', +',,,,,,,,,,,,,,,,,,245,,,253,,,66,67,,,68,,,,,,52,,,,,,,,,250,,,,,102', +'90,93,94,,95,97,96,98,,,,,91,101,,,,81,82,83,85,65,92,106,107,71,72', +'46,47,,75,,73,74,76,354,355,79,80,,,,,,84,349,357,114,113,115,116,,', +'254,,,,,,,53,,,118,117,119,108,64,110,109,111,,112,120,121,,104,105', +'49,50,48,,,,,,,,,,,,,,,,,,,,245,,,253,,,66,67,,,68,,436,,,,52,,,,,,', +',,250,,,,,102,90,93,94,,95,97,96,98,,,,,91,101,,,,81,82,83,85,65,92', +'106,107,71,72,46,47,,75,,73,74,76,354,355,79,80,,,,,,84,349,357,114', +'113,115,116,,,254,,,,,,,53,,,118,117,119,108,64,110,109,111,,112,120', +'121,,104,105,49,50,48,,,,,,,,,,,,,,,,,,,,245,,,253,,,66,67,,,68,,,,', +',52,,,,,,,,,250,,,,,102,90,93,94,,95,97,96,98,,,,,91,101,,,,81,82,83', +'85,65,92,106,107,71,72,46,47,,75,,73,74,76,354,355,79,80,,,,,,84,349', +'357,114,113,115,116,,,254,,,,,,,53,,,118,117,119,108,64,110,109,111', +',112,120,121,,104,105,49,50,48,,,,,,,,,,,,,,,,,,,,245,,,253,,,66,67', +',,68,,,,,,52,,,,,,,,,250,,,,,102,90,93,94,,95,97,96,98,,,,,91,101,,', +',81,82,83,85,65,92,106,107,71,72,46,47,,75,,73,74,76,354,355,79,80,', +',,,,84,349,357,114,113,115,116,,,254,,,,,,,53,,,118,117,119,108,64,110', +'109,111,,112,120,121,,104,105,49,50,48,,,,,,,,,,,,,,,,,,,,245,,,253', +',,66,67,,,68,,,,,,52,,,,,,,,,250,,,,,102,90,93,94,,95,97,96,98,,,,,91', +'101,,,,81,82,83,85,65,92,106,107,71,72,46,47,,75,,73,74,76,35,36,79', +'80,,,,,,84,33,32,114,113,115,116,,,254,,,,,,,53,,,118,117,119,108,64', +'110,109,111,,112,120,121,,104,105,49,50,48,,,,,,,,,,,,,,,,,,,,245,,', +'253,,,66,67,,,68,,,,,,52,,,,,,,,,250,,,,,102,90,93,94,,95,97,96,98,', +',,,91,101,,,,81,82,83,85,65,92,106,107,71,72,46,47,,75,,73,74,76,35', +'36,79,80,,,,,,84,33,32,114,113,115,116,,,254,,,,,,,53,,,118,117,119', +'108,64,110,109,111,,112,120,121,,104,105,49,50,48,,,,,,,,,,,,,,,,,,', +',245,,,253,,,66,67,,,68,,,,,,52,,,,,,,,,250,,,,,102,90,93,94,,95,97', +'96,98,,,,,91,101,,,,,,,85,,92,106,107,-441,,46,47,,,,-441,-441,-441', +',,-441,-441,-441,,-441,,,,,,,,-441,-441,-441,-441,,,,,,,,,-441,-441', +',-441,-441,-441,-441,-441,,,,,,,,,,,,,,,,,,,,,,,-441,-441,-441,-441', +'-441,-441,-441,-441,-441,-441,-441,-441,-441,-441,,,-441,-441,-441,', +',-441,,306,-441,,,-441,-441,,-441,,-441,,-441,,-441,-441,,-441,-441', +'-441,-441,-441,,-441,-441,-441,,,,,,,,,,,,,,-441,,,-441,-441,,-441,', +'-441,81,82,83,,65,,-441,,71,72,,,,75,,73,74,76,35,36,79,80,,,,,,84,33', +'32,114,113,115,116,,,254,,,,,,,53,,,118,117,119,108,64,110,109,111,', +'112,120,121,,104,105,49,50,48,,,,,,,,,,,,,,,,,,,,245,,,253,,,66,67,', +',68,,,,,,52,,,,,,,,,250,,,,,102,90,93,94,,95,97,96,98,,,,,91,101,,,', +'81,82,83,85,65,92,106,107,71,72,46,47,,75,,73,74,76,35,36,79,80,,,,', +',84,33,32,114,113,115,116,,,254,,,,,,,53,,,118,117,119,108,64,110,109', +'111,,112,120,121,,104,105,49,50,48,,,,,,,,,,,,,,,,,,,,245,,,253,,,66', +'67,,,68,,,,,,52,,,,,,,,,250,,,,,102,90,93,94,,95,97,96,98,,,,,91,101', +',,,81,82,83,85,65,92,106,107,71,72,46,47,,75,,73,74,76,354,355,79,80', +',,,,,84,349,357,114,113,115,116,,,254,,,,,,,53,,,118,117,119,108,64', +'110,109,111,327,112,120,121,,104,105,49,50,48,,,,,,,,,,,,,,,,,,,,245', +',,253,,,66,67,,,68,,,,322,,52,,,328,,,,,,250,,,,,102,325,93,94,,95,97', +'96,98,,,,,91,101,,,,81,82,83,85,65,92,106,107,71,72,46,47,,75,,73,74', +'76,35,36,79,80,,,,,,84,33,32,114,113,115,116,,,23,,,,,,,53,,,118,117', +'119,108,64,110,109,111,,112,120,121,,104,105,49,50,48,,,,,,,,,,,,,,', +',,,,,245,,,253,,,66,67,,,68,,,,,,52,,,,,,,,,24,,,,,102,90,93,94,,95', +'97,96,98,,,,,91,101,,,,81,82,83,85,65,92,106,107,71,72,46,47,,75,,73', +'74,76,354,355,79,80,,,,,,84,349,357,114,113,115,116,,,254,,,,,,,53,', +',118,117,119,108,64,110,109,111,,112,120,121,,104,105,49,50,48,,,,,', +',,,,,,,,,,,,,,245,,,253,,,66,67,,,68,,,,,,52,,,,,,,,,250,,,,,102,90', +'93,94,,95,97,96,98,,,,,91,101,,,,,,,85,,92,106,107,-327,,46,47,,,,-327', +'-327,-327,,,-327,-327,-327,,-327,,,,,,,,-327,,-327,-327,,,,,,,,,-327', +'-327,,-327,-327,-327,-327,-327,,,,,,,,,,,,,,,,,,,,,,,-327,-327,-327', +'-327,-327,-327,-327,-327,-327,-327,-327,-327,-327,-327,,,-327,-327,-327', +',,-327,,315,-327,,,-327,-327,,-327,,-327,,-327,,-327,-327,,-327,-327', +'-327,-327,-327,,-327,,-327,,,,,,,,,,,,,,-327,,,-327,-327,,-327,,-327', +'81,82,83,,65,,-327,,71,72,,,,75,,73,74,76,35,36,79,80,,,,,,84,33,32', +'114,113,115,116,,,254,,,,,,,53,,,118,117,119,108,64,110,109,111,327', +'112,120,121,,104,105,49,50,48,,,,,,,,,,,,,,,,,,,,245,,,253,,,66,67,', +',68,,324,,322,,52,,,328,,,,,,250,,,,,102,325,93,94,,95,97,96,98,,,,', +'91,101,,,,81,82,83,85,65,92,106,107,71,72,46,47,,75,,73,74,76,354,355', +'79,80,,,,,,84,349,357,114,113,115,116,,,254,,,,,,,53,,,118,117,119,108', +'64,110,109,111,327,112,120,121,,104,105,49,50,48,,,,,,,,,,,,,,,,,,,', +'245,,,253,,,66,67,,,68,,797,,322,,52,,,328,,,,,,250,,,,,102,325,93,94', +',95,97,96,98,,,,,91,101,,,,81,82,83,85,65,92,106,107,71,72,46,47,,75', +',73,74,76,354,355,79,80,,,,,,84,349,357,114,113,115,116,,,254,,,,,,', +'53,,,118,117,119,108,64,110,109,111,,112,120,121,,104,105,49,50,48,', +',,,,,,,,,,,,,,,,,,245,,,253,,,66,67,,,68,,,,,,52,,,,,,,,,250,,,,,102', +'90,93,94,,95,97,96,98,,,,,91,101,,,,,,,85,,92,106,107,,,46,47,81,82', +'83,11,65,,,,71,72,,,,75,,73,74,76,35,36,79,80,,,,,,84,33,32,114,113', +'115,116,,,23,,,,,,10,53,,12,118,117,119,108,64,110,109,111,,112,120', +'121,,104,105,49,50,48,,,,,,,,,,,,,,,,,,,,45,,,38,,,66,67,,,68,,40,,', +',52,,,,,,,,,24,,,,,102,90,93,94,,95,97,96,98,,,,,91,101,,,,81,82,83', +'85,65,92,106,107,71,72,46,47,,75,,73,74,76,35,36,79,80,,,,,,84,33,32', +'114,113,115,116,,,23,,,,,,,53,,,118,117,119,108,64,110,109,111,,112', +'120,121,,104,105,49,50,48,,,,,,,,,,,,,,,,,,,,245,,,253,,,66,67,,,68', +',,,,,52,,,,,,,,,24,,,,,102,90,93,94,,95,97,96,98,,,,,91,101,,,,81,82', +'83,85,65,92,106,107,71,72,46,47,,75,,73,74,76,35,36,79,80,,,,,,84,33', +'32,114,113,115,116,,,254,,,,,,,53,,,118,117,119,108,64,110,109,111,327', +'112,120,121,,104,105,49,50,48,,,,,,,,,,,,,,,,,,,,245,,,253,,,66,67,', +',68,,324,,322,,52,,,328,,,,,,250,,,,,102,325,93,94,,95,97,96,98,,,,', +'91,101,,,,81,82,83,85,65,92,106,107,71,72,46,47,,75,,73,74,76,35,36', +'79,80,,,,,,84,33,32,114,113,115,116,,,254,,,,,,,53,,,118,117,119,108', +'64,110,109,111,,112,120,121,,104,105,49,50,48,,,,,,,,,,,,,,,,,,,,245', +',,253,,,66,67,,,68,,,,,,52,,,,,,,,,250,,,,,102,90,93,94,,95,97,96,98', +',,,,91,101,,,,81,82,83,85,65,92,106,107,71,72,46,47,,75,,73,74,76,354', +'355,79,80,,,,,,84,349,357,114,113,115,116,,,254,,,,,,,53,,,118,117,119', +'108,64,110,109,111,,112,120,121,,104,105,49,50,48,,,,,,,,,,,,,,,,,,', +',245,,,253,,,66,67,,,68,,797,,,,52,,,,,,,,,250,,,,,102,90,93,94,,95', +'97,96,98,,,,,91,101,,,,81,82,83,85,65,92,106,107,71,72,46,47,,75,,73', +'74,76,354,355,79,80,,,,,,84,349,357,114,113,115,116,,,254,,,,,,,53,', +',118,117,119,108,64,110,109,111,,112,120,121,,104,105,49,50,48,,,,,', +',,,,,,,,,,,,,,245,,,253,,,66,67,,,68,,867,,,,52,,,,,,,,,250,,,,,102', +'90,93,94,,95,97,96,98,,,,,91,101,,,,,,,85,,92,106,107,,,46,47,81,82', +'83,11,65,,,,71,72,,,,75,,73,74,76,35,36,79,80,,,,,,84,33,32,114,113', +'115,116,,,23,,,,,,10,53,,12,118,117,119,108,64,110,109,111,,112,120', +'121,,104,105,49,50,48,,,,,,,,,,,,,,,,,,,,45,,,38,,,66,67,,,68,,40,,', +',52,,,,,,,,,24,,,,,102,90,93,94,,95,97,96,98,,,,,91,101,,,,81,82,83', +'85,65,92,106,107,71,72,46,47,,75,,73,74,76,35,36,79,80,,,,,,84,33,32', +'114,113,115,116,,,254,,,,,,,53,,,118,117,119,108,64,110,109,111,327', +'112,120,121,,104,105,49,50,48,,,,,,,,,,,,,,,,,,,,245,,,253,,,66,67,', +',68,,324,,322,,52,,,328,,,,,,250,,,,,102,325,93,94,,95,97,96,98,,,,', +'91,101,,,,81,82,83,85,65,92,106,107,71,72,46,47,,75,,73,74,76,354,355', +'79,80,,,,,,84,349,357,114,113,115,116,,,254,,,,,,,53,,,118,117,119,108', +'64,110,109,111,,112,120,121,,104,105,49,50,48,,,,,,,,,,,,,,,,,,,,245', +',,253,,,66,67,,,68,,,,,,52,,,,,,,,,250,,,,,102,90,93,94,,95,97,96,98', +',,,,91,101,,,,81,82,83,85,65,92,106,107,71,72,46,47,,75,,73,74,76,35', +'36,79,80,,,,,,84,33,32,114,113,115,116,,,254,,,,,,,53,,,118,117,119', +'108,64,110,109,111,327,112,120,121,,104,105,49,50,48,,,,,,,,,,,,,,,', +',,,,245,,,253,,,66,67,,,68,,324,,322,,52,,,328,,,,,,250,,,,,102,325', +'93,94,,95,97,96,98,,,,,91,101,,,,81,82,83,85,65,92,106,107,71,72,46', +'47,,75,,73,74,76,35,36,79,80,,,,,,84,33,32,114,113,115,116,,,254,,,', +',,,53,,,118,117,119,108,64,110,109,111,327,112,120,121,,104,105,49,50', +'48,,,,,,,,,,,,,,,,,,,,245,,,253,,,66,67,,,68,,324,,322,,52,,,328,,,', +',,250,,,,,102,325,93,94,,95,97,96,98,,,,,91,101,,,,81,82,83,85,65,92', +'106,107,71,72,46,47,,75,,73,74,76,354,355,79,80,,,,,,84,349,357,114', +'113,115,116,,,254,,,,,,,53,,,118,117,119,108,64,110,109,111,327,112', +'120,121,,104,105,49,50,48,,,,,,,,,,,,,,,,,,,,245,,,253,,,66,67,,,68', +',,,322,,52,,,328,,,,,,250,,,,,102,325,93,94,,95,97,96,98,,,,,91,101', +',,,81,82,83,85,65,92,106,107,71,72,46,47,,75,,73,74,76,35,36,79,80,', +',,,,84,33,32,114,113,115,116,,,254,,,,,,,53,,,118,117,119,108,64,110', +'109,111,327,112,120,121,,104,105,49,50,48,,,,,,,,,,,,,,,,,,,,245,,,253', +',,66,67,,,68,,324,,322,,52,,,328,,,,,,250,,,,,102,325,93,94,,95,97,96', +'98,,,,,91,101,,,,81,82,83,85,65,92,106,107,71,72,46,47,,75,,73,74,76', +'354,355,79,80,,,,,,84,349,357,114,113,115,116,,,254,,,,,,,53,,,118,117', +'119,108,64,110,109,111,,112,120,121,,104,105,49,50,48,,,,,,,,,,,,,,', +',,,,,245,,,253,,,66,67,,,68,,324,,,,52,,,,,,,,,250,,,,,102,90,93,94', +',95,97,96,98,,,,,91,101,,,,81,82,83,85,65,92,106,107,71,72,46,47,,75', +',73,74,76,35,36,79,80,,,,,,84,33,32,114,113,115,116,,,23,,,,,,,53,,', +'118,117,119,108,64,110,109,111,,112,120,121,,104,105,49,50,48,,,,,,', +',,,,,,,,,,,,,245,,,253,,,66,67,,,68,,,,,,52,,,,,,,,,24,,,,,102,90,93', +'94,,95,97,96,98,,,,,91,101,,,,81,82,83,85,65,92,106,107,71,72,46,47', +',75,,73,74,76,354,355,79,80,,,,,,84,349,357,114,113,115,116,,,254,,', +',,,,53,,,118,117,119,108,64,110,109,111,327,112,120,121,,104,105,49', +'50,48,,,,,,,,,,,,,,,,,,,,245,,,253,,,66,67,,,68,,,,,,52,,,328,,,,,,250', +',,,,102,325,93,94,,95,97,96,98,,,,,91,101,,,,81,82,83,85,65,92,106,107', +'71,72,46,47,,75,,73,74,76,354,355,79,80,,,,,,84,349,357,114,113,115', +'116,,,254,,,,,,,53,,,118,117,119,108,64,110,109,111,327,112,120,121', +',104,105,49,50,48,,,,,,,,,,,,,,,,,,,,245,,,253,,,66,67,,,68,,797,,,', +'52,,,328,,,,,,250,,,,,102,325,93,94,,95,97,96,98,,,,,91,101,,,,81,82', +'83,85,65,92,106,107,71,72,46,47,,75,,73,74,76,35,36,79,80,,,,,,84,33', +'32,114,113,115,116,,,23,,,,,,,53,,,118,117,119,108,64,110,109,111,,112', +'120,121,,104,105,49,50,48,,,,,,,,,,,,,,,,,,,,245,,,253,,,66,67,,,68', +',,,,,52,,,,,,,,,24,,,,,102,90,93,94,,95,97,96,98,,,,,91,101,240,,,81', +'82,83,85,65,92,106,107,71,72,46,47,,75,,73,74,76,354,355,79,80,,,,,', +'84,349,357,114,113,115,116,,,254,,,,,,,53,,,118,117,119,108,64,110,109', +'111,,112,120,121,,104,105,49,50,48,,,,,,,,,,,,,,,,,,,,245,,,253,,,66', +'67,,,68,,,,,,52,,,,,,,,,250,,,,,102,90,93,94,,95,97,96,98,,,,,91,101', +',,,81,82,83,85,65,92,106,107,71,72,46,47,,75,,73,74,76,354,355,79,80', +',,,,,84,349,357,114,113,115,116,,,254,,,,,,,53,,,118,117,119,108,64', +'110,109,111,,112,120,121,,104,105,49,50,48,,,,,,,,,,,,,,,,,,,,245,,', +'253,,,66,67,,,68,,,,,,52,,,,,,,,,250,,,,,102,90,93,94,,95,97,96,98,', +',,,91,101,,,,81,82,83,85,65,92,106,107,71,72,46,47,,75,,73,74,76,354', +'355,79,80,,,,,,84,349,357,114,113,115,116,,,254,,,,,,,53,,,118,117,119', +'108,64,110,109,111,,112,120,121,,104,105,49,50,48,,,,,,,,,,,,,,,,,,', +',245,,,253,,,66,67,,,68,,,,,,52,,,,,,,,,250,,,,,102,90,93,94,,95,97', +'96,98,,,,,91,101,,,,81,82,83,85,65,92,106,107,71,72,46,47,,75,,73,74', +'76,354,355,79,80,,,,,,84,349,357,114,113,115,116,,,254,,,,,,,53,,,118', +'117,119,108,64,110,109,111,,112,120,121,,104,105,49,50,48,,,,,,,,,,', +',,,,,,,,,245,,,253,,,66,67,,,68,,,,,,52,,,,,,,,,250,,,,,102,90,93,94', +',95,97,96,98,,,,,91,101,,,,81,82,83,85,65,92,106,107,71,72,46,47,,75', +',73,74,76,35,36,79,80,,,,,,84,33,32,114,113,115,116,,,23,,,,,,,53,,', +'118,117,119,108,64,110,109,111,,112,120,121,,104,105,49,50,48,,,,,,', +',,,,,,,,,,,,,245,,,253,,,66,67,,,68,,,,,,52,,,,,,,,,24,,,,,102,90,93', +'94,,95,97,96,98,,,,,91,101,,,,81,82,83,85,65,92,106,107,71,72,46,47', +',75,,73,74,76,35,36,79,80,,,,,,84,33,32,114,113,115,116,,,254,,,,,,', +'53,,,118,117,119,108,64,110,109,111,,112,120,121,,104,105,49,50,48,', +',,,,,,,,,,,,,,,,,,245,,,253,,,66,67,,,68,,,,,,52,,,,,,,,,250,,,,,102', +'90,93,94,,95,97,96,98,,,,,91,101,,,,81,82,83,85,65,92,106,107,71,72', +'46,47,,75,,73,74,76,35,36,79,80,,,,,,84,33,32,114,113,115,116,,,254', +',,,,,,53,,,118,117,119,108,64,110,109,111,327,112,120,121,,104,105,49', +'50,48,,,,,,,,,,,,,,,,,,,,245,,,253,,,66,67,,,68,,324,,322,,52,,,328', +',,,,,250,,,,,102,325,93,94,,95,97,96,98,,,,,91,101,,,,,,,85,,92,106', +'107,,,46,47,81,82,83,11,65,,,,71,72,,,,75,,73,74,76,35,36,79,80,,,,', +',84,33,32,114,113,115,116,,,23,,,,,,10,53,335,12,118,117,119,108,64', +'110,109,111,,112,120,121,,104,105,49,50,48,,,,,,,,,,,,,,,,,,,,45,,,38', +',,66,67,,,68,,40,,,,52,,,,,,,,,24,,,,,102,90,93,94,,95,97,96,98,,,,', +'91,101,,,,,,420,85,,92,106,107,,,46,47,81,82,83,,65,,,,71,72,,,,75,', +'73,74,76,354,355,79,80,,,,,,84,349,357,114,113,115,116,,,254,,,,,,,53', +',,118,117,119,108,64,110,109,111,,112,120,121,,104,105,49,50,48,,,,', +',,,,,,,,,,,,,,,245,,,253,,,66,67,,,68,,,,,,52,,,,,,,,,250,,,,,102,90', +'93,94,,95,97,96,98,,,,,91,101,,,,81,82,83,85,65,92,106,107,71,72,46', +'47,,75,,73,74,76,354,355,79,80,,,,,,84,349,357,114,113,115,116,,,254', +',,,,,,53,,,118,117,119,108,64,110,109,111,,112,120,121,,104,105,49,50', +'48,,,,,,,,,,,,,,,,,,,,245,,,253,,,66,67,,,68,,,,,,52,,,,,,,,,250,,,', +',102,90,93,94,,95,97,96,98,,,,,91,101,,,,81,82,83,85,65,92,106,107,71', +'72,46,47,,75,,73,74,76,354,355,79,80,,,,,,84,349,357,114,113,115,116', +',,254,,,,,,,53,,,118,117,119,108,64,110,109,111,,112,120,121,,104,105', +'49,50,48,,,,,,,,,,,,,,,,,,,,245,,,253,,,66,67,,,68,,,,,,52,,,,,,,,,250', +',,,,102,90,93,94,,95,97,96,98,,,,,91,101,,,,81,82,83,85,65,92,106,107', +'71,72,46,47,,75,,73,74,76,354,355,79,80,,,,,,84,349,357,114,113,115', +'116,,,254,,,,,,,53,,,118,117,119,108,64,110,109,111,327,112,120,121', +',104,105,49,50,48,,,,,,,,,,,,,,,,,,,,245,,,253,,,66,67,,,68,,,,322,', +'52,,,328,,,,,,250,,,,,102,325,93,94,,95,97,96,98,,,,,91,101,,,,81,82', +'83,85,65,92,106,107,71,72,46,47,,75,,73,74,76,354,355,79,80,,,,,,84', +'349,357,114,113,115,116,,,254,,,,,,,53,,,118,117,119,108,64,110,109', +'111,327,112,120,121,,104,105,49,50,48,,,,,,,,,,,,,,,,,,,,245,,,253,', +',66,67,,,68,,797,,322,,52,,,328,,,,,,250,,,,,102,325,93,94,,95,97,96', +'98,,,,,91,101,,,,81,82,83,85,65,92,106,107,71,72,46,47,,75,,73,74,76', +'354,355,79,80,,,,,,84,349,357,114,113,115,116,,,254,,,,,,,53,,,118,117', +'119,108,64,110,109,111,,112,120,121,,104,105,49,50,48,,,,,,,,,,,,,,', +',,,,,245,,,253,,,66,67,,,68,,,,,,52,,,,,,,,,250,,,,,102,90,93,94,,95', +'97,96,98,,,,,91,101,,,,81,82,83,85,65,92,106,107,71,72,46,47,,75,,73', +'74,76,354,355,79,80,,,,,,84,349,357,114,113,115,116,,,254,,,,,,,53,', +',118,117,119,108,64,110,109,111,,112,120,121,,104,105,49,50,48,,,,,', +',,,,,,,,,,,,,,245,,,253,,,66,67,,,68,,,,,,52,,,,,,,,,250,,,,,102,90', +'93,94,,95,97,96,98,,,,,91,101,,,,81,82,83,85,65,92,106,107,71,72,46', +'47,,75,,73,74,76,354,355,79,80,,,,,,84,349,357,114,113,115,116,,,254', +',,,,,,53,,,118,117,119,108,64,110,109,111,,112,120,121,,104,105,49,50', +'48,,,,,,,,,,,,,,,,,,,,245,,,253,,,66,67,,,68,,,,,,52,,,,,,,,,250,,,', +',102,90,93,94,,95,97,96,98,,,,,91,101,,,,,,,85,,92,106,107,-275,,46', +'47,,,,-275,-275,-275,,,-275,-275,-275,491,-275,488,487,486,496,489,', +',-275,-275,-275,,,,499,,,,,,-275,-275,,-275,-275,-275,-275,-275,,491', +',488,487,486,496,489,494,,,,,,,,499,504,503,507,506,,,,500,,491,,488', +'487,486,496,489,-275,,,,,494,,-275,499,,,,306,-275,504,503,507,506,', +',,500,,,,,,,,,494,485,,,,-275,-275,,,,,507,506,,,,500,,,,-275,,,-275', +',81,82,83,-275,65,,485,,71,72,-275,,,75,,73,74,76,354,355,79,80,,,,', +',84,349,357,114,113,115,116,,,254,,,,,,,53,,,118,117,119,108,64,110', +'109,111,,112,120,121,,104,105,49,50,48,,,,,,,,,,,,,,,,,,,,245,,,253', +',,66,67,,,68,,,,,,52,,,,,,,,,250,,,,,102,90,93,94,,95,97,96,98,,,,,91', +'101,,,,81,82,83,85,65,92,106,107,71,72,46,47,,75,,73,74,76,35,36,79', +'80,,,,,,84,33,32,114,113,115,116,,,254,,,,,,,53,,,118,117,119,108,64', +'110,109,111,327,112,120,121,,104,105,49,50,48,,,,,,,,,,,,,,,,,,,,245', +',,253,,,66,67,,,68,,324,,322,,52,,,328,,,,,,250,,,,,102,325,93,94,,95', +'97,96,98,,,,,91,101,,,,81,82,83,85,65,92,106,107,71,72,46,47,,75,,73', +'74,76,35,36,79,80,,,,,,84,33,32,114,113,115,116,,,254,,,,,,,53,,,118', +'117,119,108,64,110,109,111,,112,120,121,,104,105,49,50,48,,,,,,,,,,', +',,,,,,,,,245,,,253,,,66,67,,,68,,,,,,52,,,,,,,,,250,,,,,102,90,93,94', +',95,97,96,98,,,,,91,101,,,,81,82,83,85,65,92,106,107,71,72,46,47,,75', +',73,74,76,354,355,79,80,,,,,,84,349,357,114,113,115,116,,,254,,,,,,', +'53,,,118,117,119,108,64,110,109,111,,112,120,121,,104,105,49,50,48,', +',,,,,,,,,,,,,,,,,,245,,,253,,,66,67,,,68,,,,,,52,,,,,,,,,250,,,,,102', +'90,93,94,,95,97,96,98,,,,,91,101,,,,81,82,83,85,65,92,106,107,71,72', +'46,47,,75,,73,74,76,35,36,79,80,,,,,,84,33,32,114,113,115,116,,,23,', +',,,,,53,,,118,117,119,108,64,110,109,111,,112,120,121,,104,105,49,50', +'48,,,,,,,,,,,,,,,,,,,,245,,,253,,,66,67,,,68,,,,,,52,,,,,,,,,24,,,,', +'102,90,93,94,,95,97,96,98,,,,,91,101,,,,81,82,83,85,65,92,106,107,71', +'72,46,47,,75,,73,74,76,35,36,79,80,,,,,,84,33,32,114,113,115,116,,,23', +',,,,,,53,,,118,117,119,108,64,110,109,111,,112,120,121,,104,105,49,50', +'48,,,,,,,,,,,,,,,,,,,,245,,,253,,,66,67,,,68,,,,,,52,,,,,,,,,24,,,,', +'102,90,93,94,,95,97,96,98,,,,,91,101,,,,81,82,83,85,65,92,106,107,71', +'72,46,47,,75,,73,74,76,35,36,79,80,,,,,,84,33,32,114,113,115,116,,,23', +',,,,,,53,,,118,117,119,108,64,110,109,111,,112,120,121,,104,105,49,50', +'48,,,,,,,,,,,,,,,,,,,,245,,,253,,,66,67,,,68,,,,,,52,,,,,,,,,24,,,,', +'102,90,93,94,,95,97,96,98,,,,,91,101,,,,81,82,83,85,65,92,106,107,71', +'72,46,47,,75,,73,74,76,354,355,79,80,,,,,,84,349,357,114,113,115,116', +',,254,,,,,,,53,,,118,117,119,108,64,110,109,111,,112,120,121,,104,105', +'49,50,48,,,,,,,,,,,,,,,,,,,,245,,,253,,,66,67,,,68,,,,,,52,,,,,,,,,250', +',,,,102,90,93,94,,95,97,96,98,,,,,91,101,,,,81,82,83,85,65,92,106,107', +'71,72,46,47,,75,,73,74,76,354,355,79,80,,,,,,84,349,357,114,113,115', +'116,,,254,,,,,,,53,,,118,117,119,108,64,110,109,111,327,112,120,121', +',104,105,49,50,48,,,,,,,,,,,,,,,,,,,,245,,,253,,,66,67,,,68,,,,,,52', +',,328,,,,,,250,,,,,102,325,93,94,,95,97,96,98,,,,,91,101,,,,81,82,83', +'85,65,92,106,107,71,72,46,47,,75,,73,74,76,35,36,79,80,,,,,,84,33,32', +'114,113,115,116,,,23,,,,,,,53,,,118,117,119,108,64,110,109,111,,112', +'120,121,,104,105,49,50,48,,,,,,,,,,,,,,,,,,,,245,,,253,,,66,67,,,68', +',,,,,52,,,,,,,,,24,,,,,102,90,93,94,,95,97,96,98,,,,,91,101,,,,81,82', +'83,85,65,92,106,107,71,72,46,47,,75,,73,74,76,35,36,79,80,,,,,,84,33', +'32,114,113,115,116,,,23,,,,,,,53,,,118,117,119,108,64,110,109,111,,112', +'120,121,,104,105,49,50,48,,,,,,,,,,,,,,,,,,,,245,,,253,,,66,67,,,68', +',,,,,52,,,,,,,,,24,,,,,102,90,93,94,,95,97,96,98,,,,,91,101,,,,81,82', +'83,85,65,92,106,107,71,72,46,47,,75,,73,74,76,354,355,79,80,,,,,,84', +'349,357,114,113,115,116,,,254,,,,,,,53,,,118,117,119,108,64,110,109', +'111,,112,120,121,,104,105,49,50,48,,,,,,,,,,,,,,,,,,,,245,,,253,,,66', +'67,,,68,,,,,,52,,,,,,,,,250,,,,,102,90,93,94,,95,97,96,98,,,,,91,101', +',,,81,82,83,85,65,92,106,107,71,72,46,47,,75,,73,74,76,354,355,79,80', +',,,,,84,349,357,114,113,115,116,,,254,,,,,,,53,,,118,117,119,108,64', +'110,109,111,,112,120,121,,104,105,49,50,48,,,,,,,,,,,,,,,,,,,,245,,', +'253,,,66,67,,,68,,,,,,52,,,,,,,,,250,,,,,102,90,93,94,,95,97,96,98,', +',,,91,101,,,,81,82,83,85,65,92,106,107,71,72,46,47,,75,,73,74,76,354', +'355,79,80,,,,,,84,349,357,114,113,115,116,,,254,,,,,,,53,,,118,117,119', +'108,64,110,109,111,327,112,120,121,,104,105,49,50,48,,,,,,,,,,,,,,,', +',,,,245,,,253,,,66,67,,,68,,324,,,,52,,,328,,,,,,250,,,,,102,325,93', +'94,,95,97,96,98,,,,,91,101,,,,,,,85,,92,106,107,,,46,47,81,82,83,11', +'65,,,,71,72,,,,75,,73,74,76,35,36,79,80,,,,,,84,33,32,114,113,115,116', +',,23,,,,,,10,53,,12,118,117,119,108,64,110,109,111,,112,120,121,,104', +'105,49,50,48,,,,,,,,,,,,,,,,,,,,45,,,38,,,66,67,,,68,,40,,,,52,,,,,', +',,,24,,,,,102,90,93,94,,95,97,96,98,,,,,91,101,,,,81,82,83,85,65,92', +'106,107,71,72,46,47,,75,,73,74,76,35,36,79,80,,,,,,84,33,32,114,113', +'115,116,,,23,,,,,,,53,,,118,117,119,108,64,110,109,111,,112,120,121', +',104,105,49,50,48,,,,,,,,,,,,,,,,,,,,245,,,253,,,66,67,,,68,,,,,,52', +',,,,,,,,24,,,,,102,90,93,94,,95,97,96,98,,,,,91,101,,,,81,82,83,85,65', +'92,106,107,71,72,46,47,,75,,73,74,76,354,355,79,80,,,,,,84,349,357,114', +'113,115,116,,,254,,,,,,,53,,,118,117,119,108,64,110,109,111,,112,120', +'121,,104,105,49,50,48,,,,,,,,,,,,,,,,,,,,245,,,253,,,66,67,,,68,,,,', +',52,,,,,,,,,250,,,,,102,90,93,94,,95,97,96,98,,,,,91,101,,,,81,82,83', +'85,65,92,106,107,71,72,46,47,,75,,73,74,76,354,355,79,80,,,,,,84,349', +'357,114,113,115,116,,,254,,,,,,,53,,,118,117,119,108,64,110,109,111', +',112,120,121,,104,105,49,50,48,,,,,,,,,,,,,,,,,,,,245,,,253,,,66,67', +',,68,,,,,,52,,,,,,,,,250,,,,,102,90,93,94,,95,97,96,98,,,,,91,101,,', +',81,82,83,85,65,92,106,107,71,72,46,47,,75,,73,74,76,35,36,79,80,,,', +',,84,33,32,114,113,115,116,,,254,,,,,,,53,,,118,117,119,108,64,110,109', +'111,,112,120,121,,104,105,49,50,48,,,,,,,,,,,,,,,,,,,,245,,,253,,,66', +'67,,,68,,,,,,52,,,,,,,,,250,,,,,102,90,93,94,,95,97,96,98,,,,,91,101', +',,,81,82,83,85,65,92,106,107,71,72,46,47,,75,,73,74,76,354,355,79,80', +',,,,,84,349,357,114,113,115,116,,,254,,,,,,,53,,,118,117,119,108,64', +'110,109,111,,112,120,121,,104,105,49,50,48,,,,,,,,,,,,,,,,,,,,245,,', +'253,,,66,67,,,68,,,,,,52,,,,,,,,,250,,,,,102,90,93,94,,95,97,96,98,', +',,,91,101,,,,81,82,83,85,65,92,106,107,71,72,46,47,,75,,73,74,76,354', +'355,79,80,,,,,,84,349,357,114,113,115,116,,,254,,,,,,,53,,,118,117,119', +'108,64,110,109,111,327,112,120,121,,104,105,49,50,48,,,,,,,,,,,,,,,', +',,,,245,,,253,,,66,67,,,68,,797,,322,,52,,,328,,,,,,250,,,,,102,325', +'93,94,,95,97,96,98,,,,,91,101,,,,81,82,83,85,65,92,106,107,71,72,46', +'560,,75,,73,74,76,354,355,79,80,,,,,,84,349,357,114,113,115,116,,,254', +',,,,,,53,,,118,117,119,108,64,110,109,111,,112,120,121,,104,105,49,50', +'48,,,,,,,,,,,,,,,,,,,,245,,,253,,,66,67,,,68,,,,,,52,,,,,,,,,250,,,', +',102,90,93,94,,95,97,96,98,,,,,91,101,,,,81,82,83,85,65,92,106,107,71', +'72,46,47,,75,,73,74,76,35,36,79,80,,,,,,84,33,32,114,113,115,116,,,254', +',,,,,,53,,,118,117,119,108,64,110,109,111,,112,120,121,,104,105,49,50', +'48,,,,,,,,,,,,,,,,,,,,245,,,253,,,66,67,,,68,,,,,,52,,,,,,,,,250,,,', +',102,90,93,94,,95,97,96,98,,,,,91,101,,,,81,82,83,85,65,92,106,107,71', +'72,46,47,,75,,73,74,76,35,36,79,80,,,,,,84,33,32,114,113,115,116,,,254', +',,,,,,53,,,118,117,119,108,64,110,109,111,327,112,120,121,,104,105,49', +'50,48,,,,,,,,,,,,,,,,,,,,245,,,253,,,66,67,,,68,,324,,322,,52,,,328', +',,,,,250,,,,,102,325,93,94,,95,97,96,98,,,,,91,101,,,,81,82,83,85,65', +'92,106,107,71,72,46,560,,75,,73,74,76,354,355,79,80,,,,,,84,349,357', +'114,113,115,116,,,254,,,,,,,53,,,118,117,119,108,64,110,109,111,,112', +'120,121,,104,105,49,50,48,,,,,,,,,,,,,,,,,,,,245,,,253,,,66,67,,,68', +',,,,,52,,,,,,,,,250,,,,,102,90,93,94,,95,97,96,98,,,,,91,101,,,,81,82', +'83,85,65,92,106,107,71,72,46,47,,75,,73,74,76,354,355,79,80,,,,,,84', +'349,357,114,113,115,116,,,254,,,,,,,53,,,118,117,119,108,64,110,109', +'111,,112,120,121,,104,105,49,50,48,,,,,,,,,,,,,,,,,,,,245,,,253,,,66', +'67,,,68,,,,,,52,,,,,,,,,250,,,,,102,90,93,94,,95,97,96,98,,,,,91,101', +',,,81,82,83,85,65,92,106,107,71,72,46,47,,75,,73,74,76,35,36,79,80,', +',,,,84,33,32,114,113,115,116,,,254,,,,,,,53,,,118,117,119,108,64,110', +'109,111,327,112,120,121,,104,105,49,50,48,,,,,,,,,,,,,,,,,,,,245,,,253', +',,66,67,,,68,,324,,322,,52,,,328,,,,,,250,,,,,102,325,93,94,,95,97,96', +'98,,,,,91,101,,,,81,82,83,85,65,92,106,107,71,72,46,47,,75,,73,74,76', +'35,36,79,80,,,,,,84,33,32,114,113,115,116,,,254,,,,,,,53,,,118,117,119', +'108,64,110,109,111,327,112,120,121,,104,105,49,50,48,,,,,,,,,,,,,,,', +',,,,245,,,253,,,66,67,,,68,,324,,322,,52,,,328,,,,,,250,,,,,102,325', +'93,94,,95,97,96,98,,,,,91,101,240,,,81,82,83,85,65,92,106,107,71,72', +'46,47,,75,,73,74,76,354,355,79,80,,,,,,84,349,357,114,113,115,116,,', +'254,,,,,,,53,,,118,117,119,108,64,110,109,111,,112,120,121,,104,105', +'49,50,48,,,,,,,,,,,,,,,,,,,,245,,,253,,,66,67,,,68,,,,,,52,,,,,,,,,250', +',,,,102,90,93,94,,95,97,96,98,,,,,91,101,,,,81,82,83,85,65,92,106,107', +'71,72,46,47,,75,,73,74,76,354,355,79,80,,,,,,84,349,357,114,113,115', +'116,,,254,,,,,,,53,,,118,117,119,108,64,110,109,111,,112,120,121,,104', +'105,49,50,48,,,,,,,,,,,,,,,,,,,,245,,,253,,,66,67,,,68,,,,,,52,,,,,', +',,,250,,,,,102,90,93,94,,95,97,96,98,,,,,91,101,,,,81,82,83,85,65,92', +'106,107,71,72,46,47,,75,,73,74,76,354,355,79,80,,,,,,84,349,357,114', +'113,115,116,,,254,,,,,,,53,,,118,117,119,108,64,110,109,111,,112,120', +'121,,104,105,49,50,48,,,,,,,,,,,,,,,,,,,,245,,,253,,,66,67,,,68,,,,', +',52,,,,,,,,,250,,,,,102,90,93,94,,95,97,96,98,,,,,91,101,,,,81,82,83', +'85,65,92,106,107,71,72,46,47,,75,,73,74,76,354,355,79,80,,,,,,84,349', +'357,114,113,115,116,,,254,,,,,,,53,,,118,117,119,108,64,110,109,111', +',112,120,121,,104,105,49,50,48,,,,,,,,,,,,,,,,,,,,245,,,253,,,66,67', +',,68,,,,,,52,,,,,,,,,250,,,,,102,90,93,94,,95,97,96,98,,,,,91,101,,', +',81,82,83,85,65,92,106,107,71,72,46,47,,75,,73,74,76,354,355,79,80,', +',,,,84,349,357,114,113,115,116,,,254,,,,,,,53,,,118,117,119,108,64,110', +'109,111,,112,120,121,,104,105,49,50,48,,,,,,,,,,,,,,,,,,,,245,,,253', +',,66,67,,,68,,,,,,52,,,,,,,,,250,,,,,102,90,93,94,,95,97,96,98,,,,,91', +'101,,,,81,82,83,85,65,92,106,107,71,72,46,47,,75,,73,74,76,354,355,79', +'80,,,,,,84,349,357,114,113,115,116,,,254,,,,,,,53,,,118,117,119,108', +'64,110,109,111,,112,120,121,,104,105,49,50,48,,,,,,,,,,,,,,,,,,,,245', +',,253,,,66,67,,,68,,,,,,52,,,,,,,,,250,,,,,102,90,93,94,,95,97,96,98', +',,,,91,101,,,,81,82,83,85,65,92,106,107,71,72,46,47,,75,,73,74,76,354', +'355,79,80,,,,,,84,349,357,114,113,115,116,,,254,,,,,,,53,,,118,117,119', +'108,64,110,109,111,,112,120,121,,104,105,49,50,48,,,,,,,,,,,,,,,,,,', +',245,,,253,,,66,67,,,68,,,,,,52,,,,,,,,,250,,,,,102,90,93,94,,95,97', +'96,98,,,,,91,101,,,,81,82,83,85,65,92,106,107,71,72,46,47,,75,,73,74', +'76,354,355,79,80,,,,,,84,349,357,114,113,115,116,,,254,,,,,,,53,,,118', +'117,119,108,64,110,109,111,,112,120,121,,104,105,49,50,48,,,,,,,,,,', +',,,,,,,,,245,,,253,,,66,67,,,68,,,,,,52,,,,,,,,,250,,,,,102,90,93,94', +',95,97,96,98,,,,,91,101,,,,81,82,83,85,65,92,106,107,71,72,46,47,,75', +',73,74,76,354,355,79,80,,,,,,84,349,357,114,113,115,116,,,254,,,,,,', +'53,,,118,117,119,108,64,110,109,111,,112,120,121,,104,105,49,50,48,', +',,,,,,,,,,,,,,,,,,245,,,253,,,66,67,,,68,,,,,,52,,,,,,,,,250,,,,,102', +'90,93,94,,95,97,96,98,,,,,91,101,,,,81,82,83,85,65,92,106,107,71,72', +'46,47,,75,,73,74,76,354,355,79,80,,,,,,84,349,357,114,113,115,116,,', +'254,,,,,,,53,,,118,117,119,108,64,110,109,111,,112,120,121,,104,105', +'49,50,48,,,,,,,,,,,,,,,,,,,,245,,,253,,,66,67,,,68,,,,,,52,,,,,,,,,250', +',,,,102,90,93,94,,95,97,96,98,,,,,91,101,,,,81,82,83,85,65,92,106,107', +'71,72,46,47,,75,,73,74,76,354,355,79,80,,,,,,84,349,357,114,113,115', +'116,,,254,,,,,,,53,,,118,117,119,108,64,110,109,111,,112,120,121,,104', +'105,49,50,48,,,,,,,,,,,,,,,,,,,,245,,,253,,,66,67,,,68,,,,,,52,,,,,', +',,,250,,,,,102,90,93,94,,95,97,96,98,,,,,91,101,,,,81,82,83,85,65,92', +'106,107,71,72,46,47,,75,,73,74,76,354,355,79,80,,,,,,84,349,357,114', +'113,115,116,,,254,,,,,,,53,,,118,117,119,108,64,110,109,111,,112,120', +'121,,104,105,49,50,48,,,,,,,,,,,,,,,,,,,,245,,,253,,,66,67,,,68,,,,', +',52,,,,,,,,,250,,,,,102,90,93,94,,95,97,96,98,,,,,91,101,,,,81,82,83', +'85,65,92,106,107,71,72,46,47,,75,,73,74,76,354,355,79,80,,,,,,84,349', +'357,114,113,115,116,,,254,,,,,,,53,,,118,117,119,108,64,110,109,111', +',112,120,121,,104,105,49,50,48,,,,,,,,,,,,,,,,,,,,245,,,253,,,66,67', +',,68,,,,,,52,,,,,,,,,250,,,,,102,90,93,94,,95,97,96,98,,,,,91,101,,', +',81,82,83,85,65,92,106,107,71,72,46,47,,75,,73,74,76,354,355,79,80,', +',,,,84,349,357,114,113,115,116,,,254,,,,,,,53,,,118,117,119,108,64,110', +'109,111,,112,120,121,,104,105,49,50,48,,,,,,,,,,,,,,,,,,,,245,,,253', +',,66,67,,,68,,,,,,52,,,,,,,,,250,,,,,102,90,93,94,,95,97,96,98,,,,,91', +'101,,,,,,,85,,92,106,107,,,46,47,81,82,83,11,65,,,,71,72,,,,75,,73,74', +'76,35,36,79,80,,,,,,84,33,32,114,113,115,116,,,23,,,,,,10,53,,12,118', +'117,119,108,64,110,109,111,,112,120,121,,104,105,49,50,48,,,,,,,,,,', +',,,,,,,,,45,,,38,,,66,67,,,68,,40,,,,52,,,,,,,,,24,,,,,102,90,93,94', +',95,97,96,98,,,,,91,101,,,,81,82,83,85,65,92,106,107,71,72,46,47,,75', +',73,74,76,35,36,79,80,,,,,,84,33,32,114,113,115,116,,,23,,,,,,,53,,', +'118,117,119,108,64,110,109,111,,112,120,121,,104,105,49,50,48,,,,,,', +',,,,,,,,,,,,,245,,,253,,,66,67,,,68,,,,,,52,,,,,,,,,24,,,,,102,90,93', +'94,,95,97,96,98,,,,,91,101,,,,81,82,83,85,65,92,106,107,71,72,46,47', +',75,,73,74,76,35,36,79,80,,,,,,84,33,32,114,113,115,116,,,23,,,,,,,53', +',,118,117,119,108,64,110,109,111,,112,120,121,,104,105,49,50,48,,,,', +',,,,,,,,,,,,,,,245,,,253,,,66,67,,,68,,,,,,52,,,,,,,,,24,,,,,102,90', +'93,94,,95,97,96,98,,,,,91,101,,,,81,82,83,85,65,92,106,107,71,72,46', +'47,,75,,73,74,76,35,36,79,80,,,,,,84,33,32,114,113,115,116,,,23,,,,', +',,53,,,118,117,119,108,64,110,109,111,,112,120,121,,104,105,49,50,48', +',,,,,,,,,,,,,,,,,,,245,,,253,,,66,67,,,68,,,,,,52,,,,,,,,,24,,,,,102', +'90,93,94,,95,97,96,98,,,,,91,101,,,,81,82,83,85,65,92,106,107,71,72', +'46,47,,75,,73,74,76,35,36,79,80,,,,,,84,33,32,114,113,115,116,,,23,', +',,,,,53,,,118,117,119,108,64,110,109,111,,112,120,121,,104,105,49,50', +'48,,,,,,,,,,,,,,,,,,,,245,,,253,,,66,67,,,68,,,,,,52,,,,,,,,,24,,,,', +'102,90,93,94,,95,97,96,98,,,,,91,101,,,,81,82,83,85,65,92,106,107,71', +'72,46,47,,75,,73,74,76,35,36,79,80,,,,,,84,33,32,114,113,115,116,,,23', +',,,,,,53,,,118,117,119,108,64,110,109,111,,112,120,121,,104,105,49,50', +'48,,,,,,,,,,,,,,,,,,,,245,,,253,,,66,67,,,68,,,,,,52,,,,,,,,,24,,,,', +'102,90,93,94,,95,97,96,98,,,,,91,101,,,,81,82,83,85,65,92,106,107,71', +'72,46,47,,75,,73,74,76,354,355,79,80,,,,,,84,349,357,114,113,115,116', +',,254,,,,,,,53,,,118,117,119,108,64,110,109,111,,112,120,121,,104,105', +'49,50,48,,,,,,,,,,,,,,,,,,,,245,,,253,,,66,67,,,68,,,,,,52,,,,,,,,,250', +',,,,102,90,93,94,,95,97,96,98,,,,,91,101,,,,81,82,83,85,65,92,106,107', +'71,72,46,47,,75,,73,74,76,35,36,79,80,,,,,,84,33,32,114,113,115,116', +',,23,,,,,,,53,,,118,117,119,108,64,110,109,111,,112,120,121,,104,105', +'49,50,48,,,,,,,,,,,,,,,,,,,,245,,,253,,,66,67,,,68,,,,,,52,,,,,,,,,24', +',,,,102,90,93,94,,95,97,96,98,,,,,91,101,,,,,,,85,,92,106,107,,,46,47', +'81,82,83,11,65,,,,71,72,,,,75,,73,74,76,35,36,79,80,,,,,,84,33,32,114', +'113,115,116,,,23,,,,,,10,53,9,12,118,117,119,108,64,110,109,111,,112', +'120,121,,104,105,49,50,48,,,,,,,,,,,,,,,,,,,,45,,,38,,,66,67,,,68,,40', +',,,52,,,,,,,,,24,,,,,102,90,93,94,,95,97,96,98,,,,,91,101,,,,,,420,85', +',92,106,107,,,46,47,81,82,83,,65,,,,71,72,,,,75,,73,74,76,35,36,79,80', +',,,,,84,33,32,114,113,115,116,,,254,,,,,,,53,,,118,117,119,108,64,110', +'109,111,327,112,120,121,,104,105,49,50,48,,,,,,,,,,,,,,,,,,,,245,,,253', +',,66,67,,,68,,324,,322,,52,,,328,,,,,,250,,,,,102,325,93,94,,95,97,96', +'98,,,,,91,101,,,,81,82,83,85,65,92,106,107,71,72,46,47,,75,,73,74,76', +'35,36,79,80,,,,,,84,33,32,114,113,115,116,,,254,,,,,,,53,,,118,117,119', +'108,64,110,109,111,,112,120,121,,104,105,49,50,48,,,,,,,,,,,,,,,,,,', +',245,,,253,,,66,67,,,68,,,,,,52,,,,,,,,,250,,,,,102,90,93,94,,95,97', +'96,98,,,,,91,101,,,,81,82,83,85,65,92,106,107,71,72,46,47,,75,,73,74', +'76,354,355,79,80,,,,,,84,349,357,114,113,115,116,,,254,,,,,,,53,,,118', +'117,119,108,64,110,109,111,,112,120,121,,104,105,49,50,48,,,,,,,,,,', +',,,,,,,,,245,,,253,,,66,67,,,68,,,,,,52,,,,,,,,,250,,,,,102,90,93,94', +',95,97,96,98,,,,,91,101,,,,,,,85,,92,106,107,-725,,46,47,,,,-725,-725', +'-725,,,-725,-725,-725,,-725,,,,,,,,-725,-725,-725,-725,-725,,,,,,,,-725', +'-725,,-725,-725,-725,-725,-725,,,,,,,,,,,,,,,,,,,,,,,-725,-725,-725', +'-725,-725,-725,-725,-725,-725,-725,-725,-725,-725,-725,,,-725,-725,-725', +',,-725,,,-725,,,-725,-725,,-725,,-725,,-725,,-725,-725,,-725,-725,-725', +'-725,-725,,-725,-725,-725,,,,,,,,,,,,,,-725,,,-725,-725,-725,-725,,-725', +'-724,-725,,,,,-725,-724,-724,-724,,,-724,-724,-724,,-724,,,,,,,,-724', +'-724,-724,-724,-724,,,,114,113,115,116,-724,-724,,-724,-724,-724,-724', +'-724,,,,,118,117,119,,,,,,,,,,,104,105,,,358,-724,-724,-724,-724,-724', +'-724,-724,-724,-724,-724,-724,-724,-724,-724,,,-724,-724,-724,,,-724', +',,-724,,,-724,-724,,-724,,-724,,-724,,-724,-724,,-724,-724,-724,-724', +'-724,,-724,-724,-724,,102,90,93,94,,95,97,96,98,,,,-724,91,101,-724', +'-724,-724,-724,,-724,85,-724,92,106,107,-275,-724,81,82,83,11,65,-275', +'-275,-275,71,72,-275,-275,-275,75,-275,73,74,76,35,36,79,80,-275,-275', +'-275,-275,,84,33,32,114,113,115,116,-275,-275,23,-275,-275,-275,-275', +'-275,10,53,9,12,118,117,119,108,64,110,109,111,,112,120,121,,104,105', +'49,50,48,-275,-275,-275,-275,-275,-275,-275,-275,-275,-275,-275,-275', +'-275,-275,,,-275,-275,-275,45,,-275,38,306,-275,66,67,-275,-275,68,-275', +'40,-275,,-275,52,-275,-275,,-275,-275,-275,-275,-275,24,-275,-275,-275', +',102,90,93,94,,95,97,96,98,,,,-275,91,101,-275,-275,,-275,,-275,85,', +'92,106,107,,-275,46,47,81,82,83,,65,,,,71,72,,,,75,,73,74,76,35,36,79', +'80,,,,,,84,33,32,114,113,115,116,,,23,,,,,,,53,,,118,117,119,108,64', +'110,109,111,,112,120,121,,104,105,49,50,48,,,,,,,,,,,,,,,,,,,,245,,', +'253,,,66,67,,,68,,,,,,52,,,,,,,,,24,,,,,102,90,93,94,,95,97,96,98,,', +',,91,101,126,,,,,125,85,,92,106,107,-312,,46,47,,,,-312,-312,-312,,', +'-312,-312,-312,,-312,,,,,,,,-312,,-312,-312,-312,,,,,,,,-312,-312,,-312', +'-312,-312,-312,-312,,,,,,,,,,,,,,,,,,,,,,,-312,-312,-312,-312,-312,-312', +'-312,-312,-312,-312,-312,-312,-312,-312,,,-312,-312,-312,,,-312,,,-312', +',,-312,-312,,-312,,-312,,-312,,-312,-312,,-312,-312,-312,-312,-312,', +'-312,,-312,,,,,,,,,,,,,,-312,,,-312,-312,-312,-312,,-312,,-312,,81,82', +'83,-312,65,,,,71,72,,,,75,,73,74,76,354,355,79,80,,,,,,84,349,357,114', +'113,115,116,,,254,,,,,,,53,,,118,117,119,108,64,110,109,111,,112,120', +'121,,104,105,49,50,48,,,,,,,,,,,,,,,,,,,,245,,,253,,,66,67,,,68,,,,', +',52,,,,,,,,,250,,,,,102,90,93,94,,95,97,96,98,,,,,91,101,,,,81,82,83', +'85,65,92,106,107,71,72,46,47,,75,,73,74,76,35,36,79,80,,,,,,84,33,32', +'114,113,115,116,,,23,,,,,,,53,,,118,117,119,108,64,110,109,111,,112', +'120,121,,104,105,49,50,48,,,,,,,,,,,,,,,,,,,,245,,,253,,,66,67,,,68', +',,,,,52,,,,,,,,,24,,,,,102,90,93,94,,95,97,96,98,,,,,91,101,,,,81,82', +'83,85,65,92,106,107,71,72,46,47,,75,,73,74,76,35,36,79,80,,,,,,84,33', +'32,114,113,115,116,,,254,,,,,,,53,,,118,117,119,108,64,110,109,111,', +'112,120,121,,104,105,49,50,48,,,,,,,,,,,,,,,,,,,,245,,,253,,,66,67,', +',68,,436,,,,52,,,,,,,,,250,,,,,102,90,93,94,,95,97,96,98,,,,,91,101', +',,,81,82,83,85,65,92,106,107,71,72,46,47,,75,,73,74,76,354,355,79,80', +',,,,,84,349,357,114,113,115,116,,,254,,,,,,,53,,,118,117,119,108,64', +'110,109,111,,112,120,121,,104,105,49,50,48,,,,,,,,,,,,,,,,,,,,245,,', +'253,,,66,67,,,68,,,,,,52,,,,,,,,,250,,,,,102,90,93,94,,95,97,96,98,', +',,,91,101,,,,81,82,83,85,65,92,106,107,71,72,46,47,,75,,73,74,76,354', +'355,79,80,,,,,,84,349,357,114,113,115,116,,,254,,,,,,,53,,,118,117,119', +'108,64,110,109,111,,112,120,121,,104,105,49,50,48,,,,,,,,,,,,,,,,,,', +',245,,,253,,,66,67,,,68,,,,,,52,,,,,,,,,250,,,,,102,90,93,94,,95,97', +'96,98,,,,,91,101,,,,81,82,83,85,65,92,106,107,71,72,46,47,,75,,73,74', +'76,35,36,79,80,,,,,,84,33,32,114,113,115,116,,,23,,,,,,,53,,,118,117', +'119,108,64,110,109,111,,112,120,121,,104,105,49,50,48,,,,,,,,,,,,,,', +',,,,,245,,,253,,,66,67,,,68,,,,,,52,,,,,,,,,24,,,,,102,90,93,94,,95', +'97,96,98,,,,,91,101,,,,81,82,83,85,65,92,106,107,71,72,46,47,,75,,73', +'74,76,354,355,79,80,,,,,,84,349,357,114,113,115,116,,,254,,,,,,,53,', +',118,117,119,108,64,110,109,111,,112,120,121,,104,105,49,50,48,,,,,', +',,,,,,,,,,,,,,245,,,253,,,66,67,,,68,,,,,,52,,,,,,,,,250,,,,,102,90', +'93,94,,95,97,96,98,,,,,91,101,,,,81,82,83,85,65,92,106,107,71,72,46', +'47,,75,,73,74,76,354,355,79,80,,,,,,84,349,357,114,113,115,116,,,254', +',,,,,,53,,,118,117,119,108,64,110,109,111,,112,120,121,,104,105,49,50', +'48,,,,,,,,,,,,,,,,,,,,245,,,253,,,66,67,,,68,,,,,,52,,,,,,,,,250,,,', +',102,90,93,94,,95,97,96,98,,,,,91,101,,,,81,82,83,85,65,92,106,107,71', +'72,46,47,,75,,73,74,76,354,355,79,80,,,,,,84,349,357,114,113,115,116', +',,254,,,,,,,53,,,118,117,119,108,64,110,109,111,,112,120,121,,104,105', +'49,50,48,,,,,,,,,,,,,,,,,,,,245,,,253,,,66,67,,,68,,,,,,52,,,,,,,,,250', +',,,,102,90,93,94,,95,97,96,98,,,,,91,101,,,,81,82,83,85,65,92,106,107', +'71,72,46,47,,75,,73,74,76,35,36,79,80,,,,,,84,33,32,114,113,115,116', +',,254,,,,,,,53,,,118,117,119,108,64,110,109,111,327,112,120,121,,104', +'105,49,50,48,,,,,,,,,,,,,,,,,,,,245,,,253,,,66,67,,,68,,324,,322,,52', +',,328,,,,,,250,,,,,102,325,93,94,,95,97,96,98,,,,,91,101,,,,81,82,83', +'85,65,92,106,107,71,72,46,47,,75,,73,74,76,35,36,79,80,,,,,,84,33,32', +'114,113,115,116,,,254,,,,,,,53,,,118,117,119,108,64,110,109,111,,112', +'120,121,,104,105,49,50,48,,,,,,,,,,,,,,,,,,,,245,,,253,,,66,67,,,68', +',436,,,,52,,,,,,,,,250,,,,,102,90,93,94,,95,97,96,98,,,,,91,101,,,,81', +'82,83,85,65,92,106,107,71,72,46,47,,75,,73,74,76,35,36,79,80,,,,,,84', +'33,32,114,113,115,116,,,254,,,,,,,53,,,118,117,119,108,64,110,109,111', +',112,120,121,,104,105,49,50,48,,,,,,,,,,,,,,,,,,,,245,,,253,,,66,67', +',,68,,,,,,52,,,,,,,,,250,,,,,102,90,93,94,,95,97,96,98,,,,,91,101,,', +',81,82,83,85,65,92,106,107,71,72,46,47,,75,,73,74,76,354,355,79,80,', +',,,,84,349,357,114,113,115,116,,,254,,,,,,,350,,,118,117,119,108,64', +'110,109,111,,112,120,121,,104,105,,,358,,,,,,,,,,,,,,,,,,,,1107,,,253', +',,66,67,,,68,,,,,,,,,,,,,,,,,,,,102,90,93,94,,95,97,96,98,,,,,91,101', +',,,81,82,83,85,65,92,106,107,71,72,,,,75,,73,74,76,354,355,79,80,,,', +',,84,349,357,114,113,115,116,,,254,,,,,,,350,,,118,117,119,108,64,110', +'109,111,,112,120,121,,104,105,,,358,,,,,,,,,,,,,,,,,,,,1146,,,253,,', +'66,67,,,68,,,,,,,,,,,,,,,,,,,,102,90,93,94,,95,97,96,98,,,,,91,101,', +',,81,82,83,85,65,92,106,107,71,72,,,,75,,73,74,76,354,355,79,80,,,,', +',84,349,357,114,113,115,116,,,254,,,,,,,350,,,118,117,119,108,64,110', +'109,111,,112,120,121,,104,105,,,358,,,,,,,,,,,,,,,,,,,,346,,,253,,,66', +'67,,,68,,,491,,488,487,486,496,489,,,,,,,,,499,,102,90,93,94,,95,97', +'96,98,,,,,91,101,,,,588,,494,85,,92,106,107,81,82,83,,65,507,506,,71', +'72,500,,,75,,73,74,76,354,355,79,80,,,,,,84,349,357,114,113,115,116', +',,254,,,,,,,350,,,118,117,119,108,64,110,109,111,,112,120,121,,104,105', +',,358,,,,,,,,,,,,,,,,,,,,346,,,342,,,66,67,,,68,,,,,,,,,,,,,,,,,,,,102', +'90,93,94,,95,97,96,98,,,,,91,101,,,,81,82,83,85,65,92,106,107,71,72', +',,,75,,73,74,76,354,355,79,80,,,,,,84,349,357,114,113,115,116,,,254', +',,,,,,350,,,118,117,119,108,64,110,109,111,,112,120,121,,104,105,,,358', +',,,,,,,,,,,,,,,,,,,346,,,253,,,66,67,,,68,,,491,,488,487,486,496,489', +',,,,,,,,499,,102,90,93,94,,95,97,96,98,,,,,91,101,,,,360,,494,85,,92', +'106,107,81,82,83,,65,507,506,,71,72,500,,,75,,73,74,76,354,355,79,80', +',,,,,84,349,357,114,113,115,116,,,254,,,,,,,350,,,118,117,119,108,64', +'110,109,111,,112,120,121,,104,105,,,358,,,,,,,,,,,,,,,,,,,,346,,,342', +',,66,67,,,68,,,,,,,,,,,,,,,,,,,,102,90,93,94,,95,97,96,98,,,,,91,101', +',,,81,82,83,85,65,92,106,107,71,72,,,,75,,73,74,76,354,355,79,80,,,', +',,84,349,357,114,113,115,116,,,254,,,,,,,350,,,118,117,119,108,64,110', +'109,111,,112,120,121,,104,105,,,358,,,,,,,,,,,,,,,,,,,,346,,,342,,,66', +'67,,,68,,,,,,,,,,,,,,,,,,,,102,90,93,94,,95,97,96,98,,,,,91,101,,,,81', +'82,83,85,65,92,106,107,71,72,,,,75,,73,74,76,354,355,79,80,,,,,,84,349', +'357,114,113,115,116,,,254,,,,,,,350,,,118,117,119,108,64,110,109,111', +',112,120,121,,104,105,,,358,,,,,,,,,,,,,,,,,,,,1146,,,253,,,66,67,,', +'68,,,,,,,,,,,,,,,,,,,,102,90,93,94,,95,97,96,98,,,,,91,101,,,,81,82', +'83,85,65,92,106,107,71,72,,,,75,,73,74,76,354,355,79,80,,,,,,84,349', +'357,114,113,115,116,,,254,,,,,,,350,,,118,117,119,400,64,110,109,401', +',112,120,121,,104,105,,,358,,,,,,,,,,,,,,,,,407,,,402,,,253,,,66,67', +',,68,,,,,,,,,,,,,,,,,,,,102,90,93,94,,95,97,96,98,,,,,91,101,,,,81,82', +'83,85,65,92,106,107,71,72,,,,75,,73,74,76,354,355,79,80,,,,,,84,349', +'357,114,113,115,116,,,254,,,,,,,350,,,118,117,119,108,64,110,109,111', +',112,120,121,,104,105,,,358,,,,,,,,,,,,,,,,,,,,346,,,342,,,66,67,,,68', +',,,,,,,,,,,,,,,,,,,102,90,93,94,,95,97,96,98,,,,,91,101,,,,81,82,83', +'85,65,92,106,107,71,72,,,,75,,73,74,76,354,355,79,80,,,,,,84,349,357', +'114,113,115,116,,,254,,,,,,,350,,,118,117,119,108,64,110,109,111,,112', +'120,121,,104,105,,,358,,,,,,,,,,,,,,,,,,,,346,,,342,,,66,67,,,68,,,', +',,,,,,,,,,,,,,,,102,90,93,94,,95,97,96,98,,,,,91,101,,,,81,82,83,85', +'65,92,106,107,71,72,,,,75,,73,74,76,354,355,79,80,,,,,,84,349,357,114', +'113,115,116,,,254,,,,,,,350,,,118,117,119,108,64,110,109,111,,112,120', +'121,,104,105,,,358,,,,,,,,,,,,,,,,,,,,346,,,342,,,66,67,,,68,,341,,', +',,,,,,,,,,,,,,,102,90,93,94,,95,97,96,98,,,,,91,101,,,,81,82,83,85,65', +'92,106,107,71,72,,,,75,,73,74,76,354,355,79,80,,,,,,84,349,357,114,113', +'115,116,,,254,,,,,,,350,,,118,117,119,108,64,110,109,111,,112,120,121', +',104,105,,,358,,,,,,,,,,,,,,,,,,,,395,,,38,,,66,67,,,68,,40,,,,,,,,', +',,,,,,,,,102,90,93,94,,95,97,96,98,,,,,91,101,,,,81,82,83,85,65,92,106', +'107,71,72,,,,75,,73,74,76,354,355,79,80,,,,,,84,349,357,114,113,115', +'116,,,254,,,,,,,350,,,118,117,119,400,64,110,109,401,,112,120,121,,104', +'105,,,358,,,,,,,,,,,,,,,,,,,,402,,,253,,,66,67,,,68,,,,,,,,,,,,,,,,', +',,,102,90,93,94,,95,97,96,98,,,,,91,101,,,,,,,85,,92,106,107,185,196', +'186,209,182,202,192,191,212,213,207,190,189,184,210,214,215,194,183', +'197,201,203,195,188,,,,204,211,206,205,198,208,193,181,200,199,,,,,', +'180,187,178,179,175,176,177,138,140,137,,139,,,,,,,,169,170,,166,148', +'149,150,157,154,156,,,151,152,,,,171,172,158,159,,,,,,,,,,,,,,163,162', +',147,168,165,164,173,160,161,155,153,145,167,146,,,174,102,,,,,,,,,', +',,,,101,185,196,186,209,182,202,192,191,212,213,207,190,189,184,210', +'214,215,194,183,197,201,203,195,188,,,,204,211,206,205,198,208,193,181', +'200,199,,,,,,180,187,178,179,175,176,177,138,140,,,139,,,,,,,,169,170', +',166,148,149,150,157,154,156,,,151,152,,,,171,172,158,159,,,,,,,,,,', +',,,163,162,,147,168,165,164,173,160,161,155,153,145,167,146,,,174,102', +',,,,,,,,,,,,,101,185,196,186,209,182,202,192,191,212,213,207,190,189', +'184,210,214,215,194,183,197,201,203,195,188,,,,204,211,206,205,198,208', +'193,181,200,199,,,,,,180,187,178,179,175,176,177,138,140,,,139,,,,,', +',,169,170,,166,148,149,150,157,154,156,,,151,152,,,,171,172,158,159', +',,,,,,,,,,,,,163,162,,147,168,165,164,173,160,161,155,153,145,167,146', +',,174,102,,,,,,,,,,,,,,101,185,196,186,209,182,202,192,191,212,213,207', +'190,189,184,210,214,215,194,183,197,201,203,195,188,,,,204,211,206,205', +'198,208,193,181,200,199,,,,,,180,187,178,179,175,176,177,138,140,,,139', +',,,,,,,169,170,,166,148,149,150,157,154,156,,,151,152,,,,171,172,158', +'159,,,,,,,,,,,,,,163,162,,147,168,165,164,173,160,161,155,153,145,167', +'146,,,174,102,,,,,,,,,,,,,,101,185,196,186,209,182,202,192,191,212,213', +'207,190,189,184,210,214,215,194,183,197,201,203,195,188,,,,204,211,206', +'294,293,295,292,181,200,199,,,,,,180,187,178,179,289,290,291,287,140', +'110,109,288,,112,,,,,,169,170,,166,148,149,150,157,154,156,,,151,152', +',,,171,172,158,159,,,,,,299,,,,,,,,163,162,,147,168,165,164,173,160', +'161,155,153,145,167,146,,,174,114,113,115,116,,,,,,491,,488,487,486', +'496,489,118,117,119,774,,,,777,499,,,,,104,105,,,358,,,,,,,,,,,,,494', +',,,,,,776,,,747,507,506,,745,,500,746,,,,,,,,,,,,,,,,775,,,,102,90,93', +'94,,95,97,96,98,,,,,91,101,114,113,115,116,485,,85,,92,106,107,,,762', +'763,,118,117,119,774,,,491,777,488,487,486,496,489,104,105,,,358,,,', +'499,,,,,,,,,,,,,,,,776,,,747,,,494,745,,,746,,,,,504,503,507,506,,,', +'500,,,,775,,,,102,90,93,94,,95,97,96,98,,,,,91,101,114,113,115,116,', +',85,,92,106,107,,,762,763,,118,117,119,774,,,491,777,488,487,486,496', +'489,104,105,,,358,,,,499,,,,,,,,,,,,,,,,776,,,747,,,494,745,,,746,,749', +',,504,503,507,506,,,,500,,,,775,,,,102,90,93,94,,95,97,96,98,,,,,91', +'101,114,113,115,116,,,85,,92,106,107,,,762,763,,118,117,119,774,,,,777', +'754,,,,,104,105,,,358,499,,,,,,,,,,,,,,,,,,,776,,,747,,,,745,,,746,', +'749,,,,,,,500,,,,,,,775,,,,102,755,93,94,,95,97,96,98,,,,,91,101,114', +'113,115,116,,,85,,92,106,107,,,762,763,,118,117,119,774,,,491,777,488', +'487,486,496,489,104,105,,,358,,,,499,,,,,,,,,,,,,,,,776,,,747,,,494', +'745,,,746,,,,,504,503,507,506,,,,500,,,,775,,,,102,90,93,94,,95,97,96', +'98,,,,,91,101,114,113,115,116,,,85,,92,106,107,,,762,763,,118,117,119', +'774,,,491,777,488,487,486,496,489,104,105,,,358,,,,499,,,,,,,,,,,,,', +',,776,,,747,,,494,745,,,746,,749,,,,,507,506,,,,500,,,,775,,,,102,90', +'93,94,,95,97,96,98,,,,,91,101,114,113,115,116,,,85,,92,106,107,,,762', +'763,,118,117,119,774,,,,777,,,,,,104,105,,,358,,,,,,,,,,,,,,,,,,,,776', +',,747,,,,745,,,746,,749,,,,,,,491,,488,487,486,496,489,775,,,,102,90', +'93,94,499,95,97,96,98,,,,,91,101,240,114,113,115,116,,85,,92,106,107', +'494,,762,763,,,118,117,119,774,,507,506,777,,,500,,,104,105,,,358,,', +',,,,,,,,,,,,,,,,,776,,,747,,,,745,,,746,,,485,,,,,,,,,,,,,775,,,,102', +'90,93,94,,95,97,96,98,,,,,91,101,114,113,115,116,,,85,,92,106,107,,', +'762,763,,118,117,119,774,,,,777,754,,,,,104,105,,,358,499,,,,,,,,,,', +',,,,,,,,776,,,747,,,,745,,,746,,749,,,,,,,500,,,,,,,775,,,,102,755,93', +'94,,95,97,96,98,,,,,91,101,114,113,115,116,,,85,,92,106,107,,,762,763', +',118,117,119,774,,,,777,754,,,,,104,105,,,358,499,,,,,,,,,,,,,,,,,,', +'776,,,747,,,,745,,,746,,749,,,,,,,500,,,,,,,775,,,,102,755,93,94,,95', +'97,96,98,,,,,91,101,,,,,,,85,,92,106,107,,,762,763,185,196,186,209,182', +'202,192,191,212,213,207,190,189,184,210,214,215,194,183,197,201,203', +'195,188,,,,204,211,206,205,198,208,193,181,200,199,,,,,,180,187,178', +'179,175,176,177,138,140,,,139,,,,,,,,169,170,,166,148,149,150,157,154', +'156,,,151,152,,,,171,172,158,159,,,,,,,,,,,,,,163,162,,147,168,165,164', +'173,160,161,155,153,145,167,146,,,174,114,113,115,116,,,491,,488,487', +'486,496,489,,,,118,117,119,774,,499,,777,754,,,,,104,105,,,358,499,', +',,,,,,,494,,,,,,,,,,776,507,506,747,,,500,745,,,746,,749,,,,,,,500,', +',,,,,775,,,,102,755,93,94,,95,97,96,98,,,,,91,101,114,113,115,116,,', +'85,,92,106,107,,,762,763,,118,117,119,774,,,,777,754,,,,,104,105,,,358', +'499,,,,,,,,,,,,,,,,,,,776,,,747,,,,745,,,746,,749,,,,,,,500,,,,,,,775', +',,,102,755,93,94,,95,97,96,98,,,,,91,101,114,113,115,116,,,85,,92,106', +'107,,,762,763,,118,117,119,774,,,,777,,,,,,104,105,,,358,,,,,,,,,,,', +',,,,,,,,776,,,747,,,,745,,,746,,,,,,,,,,,,,,,,775,,,,102,90,93,94,,95', +'97,96,98,,,,,91,101,114,113,115,116,,,85,,92,106,107,,,762,763,,118', +'117,119,774,,,,777,,,,,,104,105,,,358,,,,,,,,,,,,,,,,,,,,776,,,747,', +',,745,,,746,,,,,,,,,,,,,,,,775,,,,102,90,93,94,,95,97,96,98,,,,,91,101', +'114,113,115,116,,,85,,92,106,107,,,762,763,,118,117,119,774,,,,777,', +',,,,104,105,,,358,,,,,,,,,,,,,,,,,,,,776,,,747,,,,745,,,746,,,,,,,,', +',,,,,,,775,,,,102,90,93,94,,95,97,96,98,,,,,91,101,114,113,115,116,', +',85,,92,106,107,,,762,763,,118,117,119,774,,,,777,,,,,,104,105,,,358', +',,,,,,,,,,,,,,,,,,,776,,,747,,,,745,,,746,,,,,,,,,,,,,,,,775,,,,102', +'90,93,94,,95,97,96,98,,,,,91,101,114,113,115,116,,,85,,92,106,107,,', +'762,763,,118,117,119,774,,,,777,,,,,,104,105,,,358,,,,,,,,114,113,115', +'116,,,,,,,,,776,,,747,118,117,119,745,,,746,,1053,,,,,104,105,,,358', +',,,,775,,,,102,90,93,94,,95,97,96,98,,,,,91,101,,,,,,,85,,92,106,107', +',,762,763,491,,488,487,486,496,489,,,,,102,90,93,94,499,95,97,96,98', +',,,,91,101,114,113,115,116,,,85,,92,106,107,494,,,,,118,117,119,,504', +'503,507,506,,,,500,,104,105,,,358,,,,,,,,,,,,491,,488,487,486,496,489', +',,,,,,,,499,,,,,,491,485,488,487,486,496,489,,,,,,,,,499,494,102,90', +'93,94,,95,97,96,98,,507,506,,91,101,500,,,,,494,85,,92,106,107,,,,504', +'503,507,506,,,491,500,488,487,486,496,489,,491,,488,487,486,496,489', +'499,,,,,485,,,499,,491,,488,487,486,496,489,,,,,,494,644,,499,485,,', +',494,504,503,507,506,,,,500,504,503,507,506,,,,500,494,,,,,,,,,504,503', +'507,506,,,491,500,488,487,486,496,489,,,,,,,,,499,485,,,,,,,,485,,,', +',,,,,,,,,494,,,,485,,,,,,,507,506,872,469,,500,871,,,,,,,,169,170,,166', +'148,149,150,157,154,156,,,151,152,,,,171,172,158,159,,,,,,306,,,,,485', +',,163,162,,147,168,165,164,173,160,161,155,153,145,167,146,842,469,174', +',843,,,,,,,,169,170,,166,148,149,150,157,154,156,,,151,152,,,,171,172', +'158,159,,,,,,306,,,,,,,,163,162,,147,168,165,164,173,160,161,155,153', +'145,167,146,837,462,174,,838,,,,,,,,169,170,,166,148,149,150,157,154', +'156,,,151,152,,,,171,172,158,159,,,,,,306,,,,,,,,163,162,,147,168,165', +'164,173,160,161,155,153,145,167,146,465,469,174,,464,,,,,,,,169,170', +',166,148,149,150,157,154,156,,,151,152,,,,171,172,158,159,,,,,,306,', +',,,,,,163,162,,147,168,165,164,173,160,161,155,153,145,167,146,729,469', +'174,,730,,,,,,,,169,170,,166,148,149,150,157,154,156,,,151,152,,,,171', +'172,158,159,,,,,,306,,,,,,,,163,162,,147,168,165,164,173,160,161,155', +'153,145,167,146,556,462,174,,557,,,,,,,,169,170,,166,148,149,150,157', +'154,156,,,151,152,,,,171,172,158,159,,,,,,306,,,,,,,,163,162,,147,168', +'165,164,173,160,161,155,153,145,167,146,458,462,174,,459,,,,,,,,169', +'170,,166,148,149,150,157,154,156,,,151,152,,,,171,172,158,159,,,,,,306', +',,,,,,,163,162,,147,168,165,164,173,160,161,155,153,145,167,146,556', +'462,174,,557,,,,,,,,169,170,,166,148,149,150,157,154,156,,,151,152,', +',,171,172,158,159,,,,,,,,,,,,,,163,162,,147,168,165,164,173,160,161', +'155,153,145,167,146,729,469,174,,730,,,,,,,,169,170,,166,148,149,150', +'157,154,156,,,151,152,,,,171,172,158,159,,,,,,306,,,,,,,,163,162,,147', +'168,165,164,173,160,161,155,153,145,167,146,727,462,174,,728,,,,,,,', +'169,170,,166,148,149,150,157,154,156,,,151,152,,,,171,172,158,159,,', +',,,306,,,,,,,,163,162,,147,168,165,164,173,160,161,155,153,145,167,146', +'807,462,174,,808,,,,,,,,169,170,,166,148,149,150,157,154,156,,,151,152', +',,,171,172,158,159,,,,,,306,,,,,,,,163,162,,147,168,165,164,173,160', +'161,155,153,145,167,146,810,469,174,,811,,,,,,,,169,170,,166,148,149', +'150,157,154,156,,,151,152,,,,171,172,158,159,,,,,,306,,,,,,,,163,162', +',147,168,165,164,173,160,161,155,153,145,167,146,1200,462,174,,1201', +',,,,,,,169,170,,166,148,149,150,157,154,156,,,151,152,,,,171,172,158', +'159,,,,,,306,,,,,,,,163,162,,147,168,165,164,173,160,161,155,153,145', +'167,146,869,462,174,,870,,,,,,,,169,170,,166,148,149,150,157,154,156', +',,151,152,,,,171,172,158,159,,,,,,306,,,,,,,,163,162,,147,168,165,164', +'173,160,161,155,153,145,167,146,1202,469,174,,1203,,,,,,,,169,170,,166', +'148,149,150,157,154,156,,,151,152,,,,171,172,158,159,,,,,,306,,,,,,', +',163,162,,147,168,165,164,173,160,161,155,153,145,167,146,839,469,174', +',840,,,,,,,,169,170,,166,148,149,150,157,154,156,,,151,152,,,,171,172', +'158,159,,,,,,306,,,,,,,,163,162,,147,168,165,164,173,160,161,155,153', +'145,167,146,1218,469,174,,1217,,,,,,,,169,170,,166,148,149,150,157,154', +'156,,,151,152,,,,171,172,158,159,,,,,,306,,,,,,,,163,162,,147,168,165', +'164,173,160,161,155,153,145,167,146,727,462,174,,728,,,,,,,,169,170', +',166,148,149,150,157,154,156,,,151,152,,,,171,172,158,159,,,,,,306,', +',,,,,,163,162,,147,168,165,164,173,160,161,155,153,145,167,146,,,174' ] + racc_action_table = arr = ::Array.new(28717, nil) + idx = 0 + clist.each do |str| + str.split(',', -1).each do |i| + arr[idx] = i.to_i unless i.empty? + idx += 1 + end + end + +clist = [ +'464,521,1016,837,1236,838,992,464,464,464,515,515,1053,464,464,289,464', +'23,835,631,1087,1058,289,807,464,927,443,137,396,785,3,840,137,137,501', +'31,464,464,1089,464,464,464,464,464,1104,1105,1108,384,385,392,850,622', +'501,625,1092,932,1092,331,23,928,521,625,331,393,1058,927,464,464,464', +'464,464,464,464,464,464,464,464,464,464,464,289,1165,464,464,464,443', +'464,464,1200,807,464,1201,839,464,1053,928,840,9,464,31,464,932,464', +'464,515,464,464,464,464,464,871,464,837,464,838,992,785,871,871,871', +'1016,1202,31,871,871,1016,871,464,631,807,464,464,807,464,871,464,835', +'396,1087,835,840,835,464,1087,807,464,871,871,1203,871,871,871,871,871', +'1222,622,1089,839,392,850,622,1089,1104,1105,1108,384,385,1104,1105', +'1108,384,385,393,981,981,12,871,871,871,871,871,871,871,871,871,871', +'871,871,871,871,553,553,871,871,871,69,871,871,1202,1165,871,839,416', +'871,1165,1127,1200,735,871,1201,871,1200,871,871,1201,871,871,871,871', +'871,251,871,729,871,243,1203,244,641,641,729,729,729,358,358,729,729', +'729,871,729,1202,871,871,802,871,1202,871,729,729,729,729,729,417,871', +'735,802,871,14,808,729,729,246,729,729,729,729,729,1203,981,416,1127', +'1127,1203,1222,810,979,15,251,1222,351,576,252,17,69,243,553,244,1127', +'27,729,729,729,729,729,729,729,729,729,729,729,729,729,729,20,458,729', +'729,729,656,729,729,358,358,729,48,48,729,729,417,729,246,729,641,729', +'808,729,729,641,729,729,729,729,729,42,729,729,729,252,459,810,810,979', +'947,351,576,576,576,658,45,414,729,458,413,729,729,729,729,53,729,20', +'729,576,730,458,808,729,351,808,729,730,730,730,656,656,730,730,730', +'1220,730,808,810,979,656,810,979,459,730,1220,730,730,730,1006,48,48', +'727,810,979,459,730,730,216,730,730,730,730,730,947,947,947,756,229', +'658,658,414,414,414,413,413,413,728,923,658,402,947,19,746,402,756,730', +'730,730,730,730,730,730,730,730,730,730,730,730,730,746,44,730,730,730', +'412,730,730,1006,231,730,727,291,730,730,418,730,288,730,291,730,235', +'730,730,288,730,730,730,730,730,870,730,869,730,700,700,728,923,19,972', +'415,972,972,972,972,972,245,730,44,290,730,730,730,730,972,730,290,730', +'996,872,44,822,730,996,822,730,872,872,872,412,412,412,872,872,776,872', +'972,291,776,418,418,418,288,872,872,972,972,972,972,870,931,869,972', +'247,931,872,872,248,872,872,872,872,872,254,415,415,415,1022,634,1022', +'1022,1022,1022,1022,290,634,362,914,972,914,914,914,1022,914,634,872', +'872,872,872,872,872,872,872,872,872,872,872,872,872,305,43,872,872,872', +'1022,872,872,319,389,872,411,320,872,389,914,1022,1022,872,323,872,1022', +'872,872,362,872,872,872,872,872,108,872,872,872,634,5,362,108,108,108', +'5,335,108,108,108,287,108,872,43,336,872,872,287,872,108,872,108,108', +'108,744,43,1022,872,338,744,872,108,108,744,108,108,108,108,108,339', +'411,411,411,340,347,286,294,295,29,759,759,347,286,294,295,29,376,346', +'21,376,347,108,108,108,108,108,108,108,108,108,108,108,108,108,108,287', +'345,108,108,108,1187,108,108,345,349,108,350,1187,108,108,352,108,345', +'108,509,108,1187,108,108,509,108,108,108,108,108,21,108,111,108,347', +'286,294,295,29,111,111,111,21,353,111,111,111,108,111,357,108,108,108', +'108,359,108,111,108,111,111,111,377,108,366,377,108,345,368,111,111', +'1187,111,111,111,111,111,371,442,374,404,378,54,293,292,442,379,404', +'381,54,293,292,380,390,442,380,404,391,54,111,111,111,111,111,111,111', +'111,111,111,111,111,111,111,395,939,111,111,111,394,111,111,1090,1090', +'111,939,394,111,111,397,111,678,111,406,111,394,111,111,426,111,111', +'111,111,111,442,111,404,111,54,293,292,432,1145,434,775,1157,775,775', +'1157,1145,775,111,435,939,111,111,111,111,1145,111,437,111,440,465,444', +'939,111,454,678,111,465,465,465,1132,394,456,465,465,811,465,678,775', +'531,1132,457,811,466,465,465,472,811,823,823,473,811,762,762,762,762', +'465,465,476,465,465,465,465,465,1145,383,383,477,762,762,762,531,478', +'1132,1132,531,531,481,1132,482,532,762,762,16,16,762,465,465,465,465', +'465,465,465,465,465,465,465,465,465,465,811,483,465,465,465,493,465', +'465,1106,505,465,508,532,465,18,1106,532,532,465,511,465,18,465,465', +'1106,465,465,465,465,465,18,465,465,465,517,762,762,762,762,525,762', +'762,762,762,945,1190,1190,465,762,762,465,465,88,465,945,465,762,526', +'762,762,762,533,465,534,88,465,387,387,387,387,387,387,535,1106,88,387', +'387,536,561,18,387,842,387,387,387,387,387,387,387,562,563,567,945,583', +'387,387,387,387,387,387,387,584,587,387,945,589,594,51,51,387,387,387', +'387,387,387,387,387,387,387,387,387,598,387,387,387,843,387,387,387', +'387,387,593,843,842,607,343,608,843,593,609,842,843,343,51,51,842,619', +'593,623,842,387,343,624,387,626,653,387,387,363,661,387,663,387,670', +'679,363,387,714,842,714,714,714,684,714,363,387,689,691,693,707,387', +'387,387,387,712,387,387,387,387,713,843,715,722,387,387,731,593,740', +'842,748,343,387,749,387,387,387,750,779,387,387,841,841,841,841,841', +'841,782,784,790,841,841,791,792,363,841,400,841,841,841,841,841,841', +'841,794,796,697,804,806,841,841,841,841,841,841,841,697,1099,841,1099', +'1099,1099,809,1099,841,841,841,841,841,841,841,841,841,841,841,841,812', +'841,841,841,242,841,841,841,841,841,344,242,400,697,697,813,816,344', +'697,400,242,825,831,832,400,836,344,845,400,841,849,851,841,866,868', +'841,841,877,890,841,1197,841,1197,1197,1197,841,1197,400,893,913,894', +'913,913,913,841,913,897,899,902,841,841,841,841,903,841,841,841,841', +'905,242,906,908,841,841,912,344,925,400,933,934,841,938,841,841,841', +'941,913,841,841,236,236,236,236,236,236,913,649,649,236,236,649,649', +'649,236,401,236,236,236,236,236,236,236,8,8,8,8,8,236,236,236,236,236', +'236,236,946,494,236,494,494,494,965,494,236,236,236,236,236,236,236', +'236,236,236,236,236,968,236,236,236,969,236,236,236,236,236,978,710', +'401,710,710,710,983,710,494,401,986,993,995,1002,401,1003,1004,494,401', +'236,1005,1031,236,1032,1037,236,236,1042,1043,236,1044,236,1045,1046', +'1047,236,1051,401,710,1114,1052,1114,1114,1114,236,1114,1055,710,1059', +'236,236,236,236,1066,236,236,236,236,1071,1072,1074,1075,236,236,1076', +'1078,1079,401,1080,1096,236,1107,236,236,236,1110,1114,236,236,1103', +'1103,1103,1103,1103,1103,1111,1112,1113,1103,1103,1124,1143,1146,1103', +'1155,1103,1103,1103,1103,1103,1103,1103,25,1156,1161,1171,1172,1103', +'1103,1103,1103,1103,1103,1103,1174,1177,1103,581,581,581,581,581,1103', +'1103,1103,1103,1103,1103,1103,1103,1103,1103,1103,1103,1180,1103,1103', +'1103,1181,1103,1103,1103,1103,1103,25,25,25,25,25,25,25,25,25,25,25', +'1182,25,25,1183,1185,25,25,1199,1103,1204,25,1103,1206,1217,1103,1103', +'1218,1224,1103,1225,1103,25,1226,25,1103,25,25,1227,25,25,25,25,25,1103', +'25,1,,,1103,1103,1103,1103,,1103,1103,1103,1103,,,,,1103,1103,,25,,', +',,1103,,1103,1103,1103,,,1103,1103,997,997,997,997,997,997,,,,997,997', +',,,997,,997,997,997,997,997,997,997,373,373,373,373,373,997,997,997', +'997,997,997,997,,,997,,,,,447,997,997,997,997,997,997,997,997,997,997', +'997,997,,997,997,997,,997,997,997,997,997,447,447,447,447,447,447,447', +'447,447,447,447,,447,447,,,447,447,,997,,,997,,,997,997,,,997,,997,447', +',447,997,447,447,,447,447,447,447,447,997,447,,,,997,997,997,997,,997', +'997,997,997,,,,,997,997,,447,,447,,,997,,997,997,997,,,997,997,337,337', +'337,337,337,337,,,,337,337,,,,337,,337,337,337,337,337,337,337,334,334', +'334,334,334,337,337,337,337,337,337,337,,,337,,,,,692,337,337,337,337', +'337,337,337,337,337,337,337,337,,337,337,337,,337,337,337,337,337,692', +'692,692,692,692,692,692,692,692,692,692,,692,692,,,692,692,,337,,,337', +',,337,337,,,337,,337,692,,692,337,692,692,,692,692,692,692,692,337,692', +',,,337,337,337,337,,337,337,337,337,,,,,337,337,,692,,,,,337,,337,337', +'337,,,337,337,38,38,38,38,38,38,,,,38,38,,,,38,,38,38,38,38,38,38,38', +',,,,,38,38,38,38,38,38,38,,,38,,,,,453,38,38,38,38,38,38,38,38,38,38', +'38,38,,38,38,38,,38,38,38,38,38,453,453,453,453,453,453,453,453,453', +'453,453,,453,453,,,453,453,,38,,,38,,,38,38,,,38,,38,453,,453,38,453', +'453,,453,453,453,453,453,38,453,,,,38,38,38,38,,38,38,38,38,,,,,38,38', +',453,,,,,38,,38,38,38,,,38,38,642,642,642,642,642,642,,,,642,642,,,', +'642,,642,642,642,642,642,642,642,,,,,,642,642,642,642,642,642,642,,', +'642,,,,,723,642,642,642,642,642,642,642,642,642,642,642,642,,642,642', +'642,,642,642,642,642,642,723,723,723,723,723,723,723,723,723,723,723', +',723,723,,,723,723,,642,,,642,,,642,642,,,642,,642,723,,723,642,723', +'723,,723,723,723,723,723,642,723,,,,642,642,642,642,,642,642,642,642', +',,,,642,642,,723,,,,,642,,642,642,642,,,642,642,1068,1068,1068,1068', +'1068,1068,,,,1068,1068,,,,1068,,1068,1068,1068,1068,1068,1068,1068,', +',,,,1068,1068,1068,1068,1068,1068,1068,,,1068,,,,,,1068,1068,1068,1068', +'1068,1068,1068,1068,1068,1068,1068,1068,,1068,1068,1068,,1068,1068,1068', +'1068,1068,817,817,817,817,817,817,817,817,817,817,817,,817,817,,,817', +'817,,1068,,,1068,,,1068,1068,,,1068,,1068,817,,817,1068,817,817,,817', +'817,817,817,817,1068,817,,,,1068,1068,1068,1068,,1068,1068,1068,1068', +',,,,1068,1068,,817,,,,,1068,,1068,1068,1068,,,1068,1068,372,372,372', +'372,372,372,,,,372,372,,,,372,,372,372,372,372,372,372,372,,,,,,372', +'372,372,372,372,372,372,,,372,,,,,,372,372,372,372,372,372,372,372,372', +'372,372,372,,372,372,372,,372,372,372,372,372,874,874,874,874,874,874', +'874,874,874,874,874,,874,874,,,874,874,,372,,,372,,,372,372,,,372,,372', +'874,,874,372,874,874,,874,874,874,874,874,372,874,,,,372,372,372,372', +',372,372,372,372,,,,,372,372,,874,,,,,372,,372,372,372,,,372,372,973', +'973,973,973,973,973,,,,973,973,,,,973,,973,973,973,973,973,973,973,', +',,,,973,973,973,973,973,973,973,,,973,,,,,,973,973,973,973,973,973,973', +'973,973,973,973,973,,973,973,973,,973,973,973,973,973,317,317,317,317', +'317,317,317,317,317,317,317,,317,317,,,317,317,,973,,,973,,,973,973', +',,973,,973,317,,317,973,317,317,,317,317,317,317,317,973,317,,,,973', +'973,973,973,,973,973,973,973,,,,,973,973,,317,,,,,973,,973,973,973,', +',973,973,2,2,2,2,2,2,,,,2,2,,,,2,,2,2,2,2,2,2,2,,,,,,2,2,2,2,2,2,2,', +',2,,,,,,2,2,2,2,2,2,2,2,2,2,2,2,,2,2,2,,2,2,2,2,2,550,550,550,550,550', +'550,550,550,550,550,550,,550,550,,,550,550,,2,,,2,,,2,2,,,2,,2,550,', +'550,2,550,550,,550,550,550,550,550,2,550,,,,2,2,2,2,,2,2,2,2,,,,,2,2', +'550,550,,,,,2,,2,2,2,,,2,2,230,230,230,230,230,230,,,,230,230,,,,230', +',230,230,230,230,230,230,230,,,,,,230,230,230,230,230,230,230,,,230', +',,,,,230,230,230,230,230,230,230,230,230,230,230,230,,230,230,230,,230', +'230,230,230,230,1067,1067,1067,1067,1067,1067,1067,1067,1067,1067,1067', +',1067,1067,,,1067,1067,,230,,,230,,,230,230,,,230,,230,1067,,1067,230', +'1067,1067,,1067,1067,1067,1067,1067,230,1067,,,,230,230,230,230,,230', +'230,230,230,,,,,230,230,,1067,,,,,230,,230,230,230,,,230,230,342,342', +'342,342,342,342,,,,342,342,,,,342,,342,342,342,342,342,342,342,,,,,', +'342,342,342,342,342,342,342,,,342,,,,,,342,342,342,342,342,342,342,342', +'342,342,342,342,,342,342,342,,342,342,342,342,342,1034,1034,1034,1034', +'1034,1034,1034,1034,1034,1034,1034,,1034,1034,,,1034,1034,,342,,,342', +',,342,342,,,342,,342,1034,,1034,342,1034,1034,,1034,1034,1034,1034,1034', +'342,1034,,,,342,342,342,342,,342,342,342,342,,,,,342,342,,1034,,,,,342', +',342,342,342,,,342,342,253,253,253,253,253,253,,,,253,253,,,,253,,253', +'253,253,253,253,253,253,,,,,,253,253,253,253,253,253,253,,,253,,,,,', +'253,253,253,253,253,253,253,253,253,253,253,253,,253,253,253,,253,253', +'253,253,253,1033,1033,1033,1033,1033,1033,1033,1033,1033,1033,1033,', +'1033,1033,,,1033,1033,,253,,,253,,,253,253,,,253,,253,1033,,1033,253', +'1033,1033,,1033,1033,1033,1033,1033,253,1033,,,,253,253,253,253,,253', +'253,253,253,,,,,253,253,,1033,,,,,253,,253,253,253,,,253,253,1013,1013', +'1013,1013,1013,1013,,,,1013,1013,,,,1013,,1013,1013,1013,1013,1013,1013', +'1013,,,,,,1013,1013,1013,1013,1013,1013,1013,,,1013,,,,,,1013,1013,1013', +'1013,1013,1013,1013,1013,1013,1013,1013,1013,,1013,1013,1013,,1013,1013', +'1013,1013,1013,1011,1011,1011,1011,1011,1011,1011,1011,1011,1011,1011', +',1011,1011,,,1011,1011,,1013,,,1013,,,1013,1013,,,1013,,1013,1011,,1011', +'1013,1011,1011,,1011,1011,1011,1011,1011,1013,1011,,,,1013,1013,1013', +'1013,,1013,1013,1013,1013,,,,,1013,1013,,1011,,,,,1013,,1013,1013,1013', +',,1013,1013,1098,1098,1098,1098,1098,1098,,,,1098,1098,,,,1098,,1098', +'1098,1098,1098,1098,1098,1098,,,,,,1098,1098,1098,1098,1098,1098,1098', +',,1098,,,,,,1098,1098,1098,1098,1098,1098,1098,1098,1098,1098,1098,1098', +',1098,1098,1098,,1098,1098,1098,1098,1098,1010,1010,1010,1010,1010,1010', +'1010,1010,1010,1010,1010,,1010,1010,,,1010,1010,,1098,,,1098,,,1098', +'1098,,,1098,,1098,1010,,1010,1098,1010,1010,,1010,1010,1010,1010,1010', +'1098,1010,,,,1098,1098,1098,1098,,1098,1098,1098,1098,,,,,1098,1098', +',1010,,,,,1098,,1098,1098,1098,,,1098,1098,1097,1097,1097,1097,1097', +'1097,,,,1097,1097,,,,1097,,1097,1097,1097,1097,1097,1097,1097,,,,,,1097', +'1097,1097,1097,1097,1097,1097,,,1097,,,,,,1097,1097,1097,1097,1097,1097', +'1097,1097,1097,1097,1097,1097,,1097,1097,1097,,1097,1097,1097,1097,1097', +'529,529,529,529,529,529,529,529,529,529,529,,529,529,,,529,529,,1097', +',,1097,,,1097,1097,,546,1097,,1097,529,,529,1097,529,529,,529,529,529', +'529,529,1097,529,,,,1097,1097,1097,1097,,1097,1097,1097,1097,,,546,', +'1097,1097,546,546,,546,546,,1097,,1097,1097,1097,,,1097,1097,1147,1147', +'1147,1147,1147,1147,,,,1147,1147,,,,1147,,1147,1147,1147,1147,1147,1147', +'1147,,,,,,1147,1147,1147,1147,1147,1147,1147,547,1115,1147,1115,1115', +'1115,,1115,1147,1147,1147,1147,1147,1147,1147,1147,1147,1147,1147,1147', +',1147,1147,1147,,1147,1147,1147,1147,1147,604,,547,,,,547,547,1115,547', +'547,,,,,,604,604,,1147,,,1147,,,1147,1147,,,1147,,1147,604,,604,1147', +'604,604,,604,604,,,604,1147,604,,,,1147,1147,1147,1147,,1147,1147,1147', +'1147,,,,,1147,1147,,,,,,,1147,,1147,1147,1147,,,1147,1147,621,621,621', +'621,621,621,,,,621,621,,,,621,,621,621,621,621,621,621,621,,,,,,621', +'621,621,621,621,621,621,,,621,,,,,,621,621,621,621,621,621,621,621,621', +'621,621,621,,621,621,621,,621,621,621,621,621,364,364,364,364,364,364', +'364,364,364,364,364,,364,364,,,364,364,,621,,,621,,,621,621,,,621,,621', +'364,,364,621,364,364,,364,364,364,364,364,621,364,,,,621,621,621,621', +',621,621,621,621,,,,,621,621,,,,,,,621,,621,621,621,,,621,621,892,892', +'892,892,892,892,,,,892,892,,,,892,,892,892,892,892,892,892,892,,,,,', +'892,892,892,892,892,892,892,,,892,,,,,,892,892,892,892,892,892,892,892', +'892,892,892,892,,892,892,892,,892,892,892,892,892,365,365,365,365,365', +'365,365,365,365,365,365,,365,365,,,365,365,,892,,,892,,,892,892,,,892', +',892,365,,365,892,365,365,,365,365,365,365,365,892,365,,,,892,892,892', +'892,,892,892,892,892,,,,,892,892,,,,,,,892,,892,892,892,,,892,892,618', +'618,618,618,618,618,,,,618,618,,,,618,,618,618,618,618,618,618,618,', +',,,,618,618,618,618,618,618,618,,,618,,,,,,618,618,618,618,618,618,618', +'618,618,618,618,618,,618,618,618,,618,618,618,618,618,551,,,,,,,,,,', +',,,,,551,551,,618,,,618,,,618,618,,,618,,618,551,,551,618,551,551,,551', +'551,,,551,618,551,,,,618,618,618,618,,618,618,618,618,,,,,618,618,,', +',,,,618,,618,618,618,,,618,618,1191,1191,1191,1191,1191,1191,,,,1191', +'1191,,,,1191,,1191,1191,1191,1191,1191,1191,1191,,,,,,1191,1191,1191', +'1191,1191,1191,1191,,,1191,,,,,,1191,1191,1191,1191,1191,1191,1191,1191', +'1191,1191,1191,1191,,1191,1191,1191,,1191,1191,1191,1191,1191,549,549', +'549,549,549,549,549,549,,549,549,,,,,,549,549,,1191,,,1191,,,1191,1191', +',,1191,,1191,549,,549,1191,549,549,,549,549,549,549,549,1191,549,,,', +'1191,1191,1191,1191,,1191,1191,1191,1191,,,,,1191,1191,,,,,,,1191,,1191', +'1191,1191,,,1191,1191,135,135,135,135,135,135,,,,135,135,,,,135,,135', +'135,135,135,135,135,135,,,,,,135,135,135,135,135,135,135,,,135,,,,,', +'135,135,135,135,135,135,135,135,135,135,135,135,,135,135,135,,135,135', +'135,135,135,548,548,548,548,548,548,548,,,548,548,,,,,,548,548,,135', +',,135,,,135,135,,,135,,135,548,,548,135,548,548,,548,548,548,548,548', +'135,548,,,,135,135,135,135,,135,135,135,135,,,,,135,135,,,,,,,135,,135', +'135,135,,,135,135,218,218,218,218,218,218,,,,218,218,,,,218,,218,218', +'218,218,218,218,218,,,,,,218,218,218,218,218,218,218,,,218,,,,,,218', +'218,218,218,218,218,218,218,218,218,218,218,,218,218,218,,218,218,218', +'218,218,545,545,545,545,545,545,545,,,545,545,,,,,,545,545,,218,,,218', +',,218,218,,,218,,218,545,,545,218,545,545,,545,545,545,545,545,218,545', +',,,218,218,218,218,,218,218,218,218,,,,,218,218,,,,,,,218,,218,218,218', +',,218,218,846,846,846,846,846,846,,,,846,846,,,,846,,846,846,846,846', +'846,846,846,,,,,,846,846,846,846,846,846,846,,,846,,,,,,846,846,846', +'846,846,846,846,846,846,846,846,846,,846,846,846,,846,846,846,846,846', +'544,544,544,544,544,544,544,,,544,544,,,,,,544,544,,846,,,846,,,846', +'846,,,846,,846,544,,544,846,544,544,,544,544,544,544,544,846,544,,,', +'846,846,846,846,,846,846,846,846,,,,,846,846,,,,,,,846,,846,846,846', +',,846,846,857,857,857,857,857,857,,,,857,857,,,,857,,857,857,857,857', +'857,857,857,,,,,,857,857,857,857,857,857,857,,,857,,,,,,857,857,857', +'857,857,857,857,857,857,857,857,857,,857,857,857,,857,857,857,857,857', +'543,543,543,543,543,543,543,,,543,543,,,,,,543,543,,857,,,857,,,857', +'857,,,857,,857,543,,543,857,543,543,,543,543,543,543,543,857,543,,,', +'857,857,857,857,,857,857,857,857,,,,,857,857,,,,,,,857,,857,857,857', +',,857,857,388,388,388,388,388,388,,,,388,388,,,,388,,388,388,388,388', +'388,388,388,,,,,,388,388,388,388,388,388,388,,,388,,,,,,388,388,388', +'388,388,388,388,388,388,388,388,388,,388,388,388,,388,388,388,388,388', +'542,542,542,542,542,542,542,,,542,542,,,,,,542,542,,388,,,388,,,388', +'388,,,388,,388,542,,542,388,542,542,,542,542,542,542,542,388,542,,,', +'388,388,388,388,,388,388,388,388,,,,,388,388,,,,,,,388,,388,388,388', +',,388,388,991,991,991,991,991,991,,,,991,991,,,,991,,991,991,991,991', +'991,991,991,,,,,,991,991,991,991,991,991,991,,,991,,,,,,991,991,991', +'991,991,991,991,991,991,991,991,991,,991,991,991,,991,991,991,991,991', +'541,541,541,541,541,541,541,,,541,541,,,,,,541,541,,991,,,991,,,991', +'991,,,991,,991,541,,541,991,541,541,,541,541,541,541,541,991,541,,,', +'991,991,991,991,,991,991,991,991,,,,,991,991,,,,920,920,920,991,920', +'991,991,991,920,920,991,991,,920,,920,920,920,920,920,920,920,,,,,,920', +'920,920,920,920,920,920,,,920,,,,,,,920,,,920,920,920,920,920,920,920', +'920,,920,920,920,,920,920,920,920,920,540,540,540,540,540,540,540,,', +'540,540,,,,,,540,540,,920,,,920,,,920,920,,,920,,,540,,540,920,540,540', +',540,540,540,540,540,920,540,,,,920,920,920,920,,920,920,920,920,,,', +',920,920,,,,921,921,921,920,921,920,920,920,921,921,920,920,,921,,921', +'921,921,921,921,921,921,,,,,,921,921,921,921,921,921,921,,,921,,,,,', +',921,,,921,921,921,921,921,921,921,921,,921,921,921,,921,921,921,921', +'921,530,530,530,530,530,530,530,530,530,530,530,,530,530,,,530,530,', +'921,,,921,,,921,921,,,921,,,530,,530,921,530,530,,530,530,530,530,530', +'921,530,,,,921,921,921,921,,921,921,921,921,,,,,921,921,,,,922,922,922', +'921,922,921,921,921,922,922,921,921,,922,,922,922,922,922,922,922,922', +',,,,,922,922,922,922,922,922,922,,,922,,,,,,,922,,,922,922,922,922,922', +'922,922,922,,922,922,922,,922,922,922,922,922,538,,,,,,,,,,,,,,,,538', +'538,,922,,,922,,,922,922,,,922,,,538,,538,922,538,538,,538,538,,,,922', +',,,,922,922,922,922,,922,922,922,922,,,,,922,922,,,,733,733,733,922', +'733,922,922,922,733,733,922,922,,733,,733,733,733,733,733,733,733,,', +',,,733,733,733,733,733,733,733,,,733,,,,,,,733,,,733,733,733,733,733', +'733,733,733,,733,733,733,,733,733,733,733,733,539,,,,,,,,,,,,,,,,539', +'539,,733,,,733,,,733,733,,,733,,,539,,,733,539,539,,539,539,,,,733,', +',,,733,733,733,733,,733,733,733,733,,,,,733,733,,,,732,732,732,733,732', +'733,733,733,732,732,733,733,,732,,732,732,732,732,732,732,732,,,,,,732', +'732,732,732,732,732,732,,,732,,,,,,,732,,,732,732,732,732,732,732,732', +'732,,732,732,732,,732,732,732,732,732,537,,,,,,,,,,,,,,,,537,537,,732', +',,732,,,732,732,,,732,,,537,,537,732,537,537,,537,537,,,,732,,,,,732', +'732,732,732,,732,732,732,732,,,,,732,732,,,,,,,732,,732,732,732,,,732', +'732,333,333,333,333,333,,,,333,333,,,,333,,333,333,333,333,333,333,333', +',,,,,333,333,333,333,333,333,333,,,333,,,,,,333,333,,333,333,333,333', +'333,333,333,333,333,,333,333,333,,333,333,333,333,333,,,,,,,,,,,,,,', +',,,,,333,,,333,,,333,333,,,333,,333,,,,333,,,,,,,,,333,,,,,333,333,333', +'333,,333,333,333,333,,,,,333,333,,,,265,265,265,333,265,333,333,333', +'265,265,333,333,,265,,265,265,265,265,265,265,265,,,,,,265,265,265,265', +'265,265,265,,,265,,,,,,,265,,,265,265,265,265,265,265,265,265,,265,265', +'265,,265,265,265,265,265,,,,,,,,,,,,,,,,,,,,265,,,265,,,265,265,,,265', +',,,,,265,,,,,,,,,265,,,,,265,265,265,265,,265,265,265,265,,,,,265,265', +',,,264,264,264,265,264,265,265,265,264,264,265,265,,264,,264,264,264', +'264,264,264,264,,,,,,264,264,264,264,264,264,264,,,264,,,,,,,264,,,264', +'264,264,264,264,264,264,264,,264,264,264,,264,264,264,264,264,,,,,,', +',,,,,,,,,,,,,264,,,264,,,264,264,,,264,,,,,,264,,,,,,,,,264,,,,,264', +'264,264,264,,264,264,264,264,,,,,264,264,,,,263,263,263,264,263,264', +'264,264,263,263,264,264,,263,,263,263,263,263,263,263,263,,,,,,263,263', +'263,263,263,263,263,,,263,,,,,,,263,,,263,263,263,263,263,263,263,263', +',263,263,263,,263,263,263,263,263,,,,,,,,,,,,,,,,,,,,263,,,263,,,263', +'263,,,263,,,,,,263,,,,,,,,,263,,,,,263,263,263,263,,263,263,263,263', +',,,,263,263,,,,262,262,262,263,262,263,263,263,262,262,263,263,,262', +',262,262,262,262,262,262,262,,,,,,262,262,262,262,262,262,262,,,262', +',,,,,,262,,,262,262,262,262,262,262,262,262,,262,262,262,,262,262,262', +'262,262,,,,,,,,,,,,,,,,,,,,262,,,262,,,262,262,,,262,,,,,,262,,,,,,', +',,262,,,,,262,262,262,262,,262,262,262,262,,,,,262,262,,,,261,261,261', +'262,261,262,262,262,261,261,262,262,,261,,261,261,261,261,261,261,261', +',,,,,261,261,261,261,261,261,261,,,261,,,,,,,261,,,261,261,261,261,261', +'261,261,261,,261,261,261,,261,261,261,261,261,,,,,,,,,,,,,,,,,,,,261', +',,261,,,261,261,,,261,,,,,,261,,,,,,,,,261,,,,,261,261,261,261,,261', +'261,261,261,,,,,261,261,,,,708,708,708,261,708,261,261,261,708,708,261', +'261,,708,,708,708,708,708,708,708,708,,,,,,708,708,708,708,708,708,708', +',,708,,,,,,,708,,,708,708,708,708,708,708,708,708,,708,708,708,,708', +'708,708,708,708,,,,,,,,,,,,,,,,,,,,708,,,708,,,708,708,,,708,,,,,,708', +',,,,,,,,708,,,,,708,708,708,708,,708,708,708,708,,,,,708,708,,,,260', +'260,260,708,260,708,708,708,260,260,708,708,,260,,260,260,260,260,260', +'260,260,,,,,,260,260,260,260,260,260,260,,,260,,,,,,,260,,,260,260,260', +'260,260,260,260,260,,260,260,260,,260,260,260,260,260,,,,,,,,,,,,,,', +',,,,,260,,,260,,,260,260,,,260,,,,,,260,,,,,,,,,260,,,,,260,260,260', +'260,,260,260,260,260,,,,,260,260,,,,694,694,694,260,694,260,260,260', +'694,694,260,260,,694,,694,694,694,694,694,694,694,,,,,,694,694,694,694', +'694,694,694,,,694,,,,,,,694,,,694,694,694,694,694,694,694,694,,694,694', +'694,,694,694,694,694,694,,,,,,,,,,,,,,,,,,,,694,,,694,,,694,694,,,694', +',694,,,,694,,,,,,,,,694,,,,,694,694,694,694,,694,694,694,694,,,,,694', +'694,,,,259,259,259,694,259,694,694,694,259,259,694,694,,259,,259,259', +'259,259,259,259,259,,,,,,259,259,259,259,259,259,259,,,259,,,,,,,259', +',,259,259,259,259,259,259,259,259,,259,259,259,,259,259,259,259,259', +',,,,,,,,,,,,,,,,,,,259,,,259,,,259,259,,,259,,,,,,259,,,,,,,,,259,,', +',,259,259,259,259,,259,259,259,259,,,,,259,259,,,,258,258,258,259,258', +'259,259,259,258,258,259,259,,258,,258,258,258,258,258,258,258,,,,,,258', +'258,258,258,258,258,258,,,258,,,,,,,258,,,258,258,258,258,258,258,258', +'258,,258,258,258,,258,258,258,258,258,,,,,,,,,,,,,,,,,,,,258,,,258,', +',258,258,,,258,,,,,,258,,,,,,,,,258,,,,,258,258,258,258,,258,258,258', +'258,,,,,258,258,,,,257,257,257,258,257,258,258,258,257,257,258,258,', +'257,,257,257,257,257,257,257,257,,,,,,257,257,257,257,257,257,257,,', +'257,,,,,,,257,,,257,257,257,257,257,257,257,257,,257,257,257,,257,257', +'257,257,257,,,,,,,,,,,,,,,,,,,,257,,,257,,,257,257,,,257,,,,,,257,,', +',,,,,,257,,,,,257,257,257,257,,257,257,257,257,,,,,257,257,,,,688,688', +'688,257,688,257,257,257,688,688,257,257,,688,,688,688,688,688,688,688', +'688,,,,,,688,688,688,688,688,688,688,,,688,,,,,,,688,,,688,688,688,688', +'688,688,688,688,,688,688,688,,688,688,688,688,688,,,,,,,,,,,,,,,,,,', +',688,,,688,,,688,688,,,688,,,,,,688,,,,,,,,,688,,,,,688,688,688,688', +',688,688,688,688,,,,,688,688,,,,687,687,687,688,687,688,688,688,687', +'687,688,688,,687,,687,687,687,687,687,687,687,,,,,,687,687,687,687,687', +'687,687,,,687,,,,,,,687,,,687,687,687,687,687,687,687,687,,687,687,687', +',687,687,687,687,687,,,,,,,,,,,,,,,,,,,,687,,,687,,,687,687,,,687,,', +',,,687,,,,,,,,,687,,,,,687,687,687,687,,687,687,687,687,,,,,687,687', +',,,,,,687,,687,687,687,32,,687,687,,,,32,32,32,,,32,32,32,,32,,,,,,', +',32,32,32,32,,,,,,,,,32,32,,32,32,32,32,32,,,,,,,,,,,,,,,,,,,,,,,32', +'32,32,32,32,32,32,32,32,32,32,32,32,32,,,32,32,32,,,32,,32,32,,,32,32', +',32,,32,,32,,32,32,,32,32,32,32,32,,32,32,32,,,,,,,,,,,,,,32,,,32,32', +',32,,32,683,683,683,,683,,32,,683,683,,,,683,,683,683,683,683,683,683', +'683,,,,,,683,683,683,683,683,683,683,,,683,,,,,,,683,,,683,683,683,683', +'683,683,683,683,,683,683,683,,683,683,683,683,683,,,,,,,,,,,,,,,,,,', +',683,,,683,,,683,683,,,683,,,,,,683,,,,,,,,,683,,,,,683,683,683,683', +',683,683,683,683,,,,,683,683,,,,682,682,682,683,682,683,683,683,682', +'682,683,683,,682,,682,682,682,682,682,682,682,,,,,,682,682,682,682,682', +'682,682,,,682,,,,,,,682,,,682,682,682,682,682,682,682,682,,682,682,682', +',682,682,682,682,682,,,,,,,,,,,,,,,,,,,,682,,,682,,,682,682,,,682,,', +',,,682,,,,,,,,,682,,,,,682,682,682,682,,682,682,682,682,,,,,682,682', +',,,681,681,681,682,681,682,682,682,681,681,682,682,,681,,681,681,681', +'681,681,681,681,,,,,,681,681,681,681,681,681,681,,,681,,,,,,,681,,,681', +'681,681,681,681,681,681,681,681,681,681,681,,681,681,681,681,681,,,', +',,,,,,,,,,,,,,,,681,,,681,,,681,681,,,681,,,,681,,681,,,681,,,,,,681', +',,,,681,681,681,681,,681,681,681,681,,,,,681,681,,,,956,956,956,681', +'956,681,681,681,956,956,681,681,,956,,956,956,956,956,956,956,956,,', +',,,956,956,956,956,956,956,956,,,956,,,,,,,956,,,956,956,956,956,956', +'956,956,956,,956,956,956,,956,956,956,956,956,,,,,,,,,,,,,,,,,,,,956', +',,956,,,956,956,,,956,,,,,,956,,,,,,,,,956,,,,,956,956,956,956,,956', +'956,956,956,,,,,956,956,,,,962,962,962,956,962,956,956,956,962,962,956', +'956,,962,,962,962,962,962,962,962,962,,,,,,962,962,962,962,962,962,962', +',,962,,,,,,,962,,,962,962,962,962,962,962,962,962,,962,962,962,,962', +'962,962,962,962,,,,,,,,,,,,,,,,,,,,962,,,962,,,962,962,,,962,,,,,,962', +',,,,,,,,962,,,,,962,962,962,962,,962,962,962,962,,,,,962,962,,,,,,,962', +',962,962,962,33,,962,962,,,,33,33,33,,,33,33,33,,33,,,,,,,,33,,33,33', +',,,,,,,,33,33,,33,33,33,33,33,,,,,,,,,,,,,,,,,,,,,,,33,33,33,33,33,33', +'33,33,33,33,33,33,33,33,,,33,33,33,,,33,,33,33,,,33,33,,33,,33,,33,', +'33,33,,33,33,33,33,33,,33,,33,,,,,,,,,,,,,,33,,,33,33,,33,,33,34,34', +'34,,34,,33,,34,34,,,,34,,34,34,34,34,34,34,34,,,,,,34,34,34,34,34,34', +'34,,,34,,,,,,,34,,,34,34,34,34,34,34,34,34,34,34,34,34,,34,34,34,34', +'34,,,,,,,,,,,,,,,,,,,,34,,,34,,,34,34,,,34,,34,,34,,34,,,34,,,,,,34', +',,,,34,34,34,34,,34,34,34,34,,,,,34,34,,,,680,680,680,34,680,34,34,34', +'680,680,34,34,,680,,680,680,680,680,680,680,680,,,,,,680,680,680,680', +'680,680,680,,,680,,,,,,,680,,,680,680,680,680,680,680,680,680,680,680', +'680,680,,680,680,680,680,680,,,,,,,,,,,,,,,,,,,,680,,,680,,,680,680', +',,680,,680,,680,,680,,,680,,,,,,680,,,,,680,680,680,680,,680,680,680', +'680,,,,,680,680,,,,677,677,677,680,677,680,680,680,677,677,680,680,', +'677,,677,677,677,677,677,677,677,,,,,,677,677,677,677,677,677,677,,', +'677,,,,,,,677,,,677,677,677,677,677,677,677,677,,677,677,677,,677,677', +'677,677,677,,,,,,,,,,,,,,,,,,,,677,,,677,,,677,677,,,677,,,,,,677,,', +',,,,,,677,,,,,677,677,677,677,,677,677,677,677,,,,,677,677,,,,,,,677', +',677,677,677,,,677,677,676,676,676,676,676,,,,676,676,,,,676,,676,676', +'676,676,676,676,676,,,,,,676,676,676,676,676,676,676,,,676,,,,,,676', +'676,,676,676,676,676,676,676,676,676,676,,676,676,676,,676,676,676,676', +'676,,,,,,,,,,,,,,,,,,,,676,,,676,,,676,676,,,676,,676,,,,676,,,,,,,', +',676,,,,,676,676,676,676,,676,676,676,676,,,,,676,676,,,,985,985,985', +'676,985,676,676,676,985,985,676,676,,985,,985,985,985,985,985,985,985', +',,,,,985,985,985,985,985,985,985,,,985,,,,,,,985,,,985,985,985,985,985', +'985,985,985,,985,985,985,,985,985,985,985,985,,,,,,,,,,,,,,,,,,,,985', +',,985,,,985,985,,,985,,,,,,985,,,,,,,,,985,,,,,985,985,985,985,,985', +'985,985,985,,,,,985,985,,,,673,673,673,985,673,985,985,985,673,673,985', +'985,,673,,673,673,673,673,673,673,673,,,,,,673,673,673,673,673,673,673', +',,673,,,,,,,673,,,673,673,673,673,673,673,673,673,673,673,673,673,,673', +'673,673,673,673,,,,,,,,,,,,,,,,,,,,673,,,673,,,673,673,,,673,,673,,673', +',673,,,673,,,,,,673,,,,,673,673,673,673,,673,673,673,673,,,,,673,673', +',,,672,672,672,673,672,673,673,673,672,672,673,673,,672,,672,672,672', +'672,672,672,672,,,,,,672,672,672,672,672,672,672,,,672,,,,,,,672,,,672', +'672,672,672,672,672,672,672,,672,672,672,,672,672,672,672,672,,,,,,', +',,,,,,,,,,,,,672,,,672,,,672,672,,,672,,,,,,672,,,,,,,,,672,,,,,672', +'672,672,672,,672,672,672,672,,,,,672,672,,,,990,990,990,672,990,672', +'672,672,990,990,672,672,,990,,990,990,990,990,990,990,990,,,,,,990,990', +'990,990,990,990,990,,,990,,,,,,,990,,,990,990,990,990,990,990,990,990', +',990,990,990,,990,990,990,990,990,,,,,,,,,,,,,,,,,,,,990,,,990,,,990', +'990,,,990,,990,,,,990,,,,,,,,,990,,,,,990,990,990,990,,990,990,990,990', +',,,,990,990,,,,671,671,671,990,671,990,990,990,671,671,990,990,,671', +',671,671,671,671,671,671,671,,,,,,671,671,671,671,671,671,671,,,671', +',,,,,,671,,,671,671,671,671,671,671,671,671,,671,671,671,,671,671,671', +'671,671,,,,,,,,,,,,,,,,,,,,671,,,671,,,671,671,,,671,,671,,,,671,,,', +',,,,,671,,,,,671,671,671,671,,671,671,671,671,,,,,671,671,,,,,,,671', +',671,671,671,,,671,671,669,669,669,669,669,,,,669,669,,,,669,,669,669', +'669,669,669,669,669,,,,,,669,669,669,669,669,669,669,,,669,,,,,,669', +'669,,669,669,669,669,669,669,669,669,669,,669,669,669,,669,669,669,669', +'669,,,,,,,,,,,,,,,,,,,,669,,,669,,,669,669,,,669,,669,,,,669,,,,,,,', +',669,,,,,669,669,669,669,,669,669,669,669,,,,,669,669,,,,35,35,35,669', +'35,669,669,669,35,35,669,669,,35,,35,35,35,35,35,35,35,,,,,,35,35,35', +'35,35,35,35,,,35,,,,,,,35,,,35,35,35,35,35,35,35,35,35,35,35,35,,35', +'35,35,35,35,,,,,,,,,,,,,,,,,,,,35,,,35,,,35,35,,,35,,35,,35,,35,,,35', +',,,,,35,,,,,35,35,35,35,,35,35,35,35,,,,,35,35,,,,250,250,250,35,250', +'35,35,35,250,250,35,35,,250,,250,250,250,250,250,250,250,,,,,,250,250', +'250,250,250,250,250,,,250,,,,,,,250,,,250,250,250,250,250,250,250,250', +',250,250,250,,250,250,250,250,250,,,,,,,,,,,,,,,,,,,,250,,,250,,,250', +'250,,,250,,,,,,250,,,,,,,,,250,,,,,250,250,250,250,,250,250,250,250', +',,,,250,250,,,,36,36,36,250,36,250,250,250,36,36,250,250,,36,,36,36', +'36,36,36,36,36,,,,,,36,36,36,36,36,36,36,,,36,,,,,,,36,,,36,36,36,36', +'36,36,36,36,36,36,36,36,,36,36,36,36,36,,,,,,,,,,,,,,,,,,,,36,,,36,', +',36,36,,,36,,36,,36,,36,,,36,,,,,,36,,,,,36,36,36,36,,36,36,36,36,,', +',,36,36,,,,638,638,638,36,638,36,36,36,638,638,36,36,,638,,638,638,638', +'638,638,638,638,,,,,,638,638,638,638,638,638,638,,,638,,,,,,,638,,,638', +'638,638,638,638,638,638,638,638,638,638,638,,638,638,638,638,638,,,', +',,,,,,,,,,,,,,,,638,,,638,,,638,638,,,638,,638,,638,,638,,,638,,,,,', +'638,,,,,638,638,638,638,,638,638,638,638,,,,,638,638,,,,1009,1009,1009', +'638,1009,638,638,638,1009,1009,638,638,,1009,,1009,1009,1009,1009,1009', +'1009,1009,,,,,,1009,1009,1009,1009,1009,1009,1009,,,1009,,,,,,,1009', +',,1009,1009,1009,1009,1009,1009,1009,1009,1009,1009,1009,1009,,1009', +'1009,1009,1009,1009,,,,,,,,,,,,,,,,,,,,1009,,,1009,,,1009,1009,,,1009', +',,,1009,,1009,,,1009,,,,,,1009,,,,,1009,1009,1009,1009,,1009,1009,1009', +'1009,,,,,1009,1009,,,,628,628,628,1009,628,1009,1009,1009,628,628,1009', +'1009,,628,,628,628,628,628,628,628,628,,,,,,628,628,628,628,628,628', +'628,,,628,,,,,,,628,,,628,628,628,628,628,628,628,628,628,628,628,628', +',628,628,628,628,628,,,,,,,,,,,,,,,,,,,,628,,,628,,,628,628,,,628,,628', +',628,,628,,,628,,,,,,628,,,,,628,628,628,628,,628,628,628,628,,,,,628', +'628,,,,627,627,627,628,627,628,628,628,627,627,628,628,,627,,627,627', +'627,627,627,627,627,,,,,,627,627,627,627,627,627,627,,,627,,,,,,,627', +',,627,627,627,627,627,627,627,627,,627,627,627,,627,627,627,627,627', +',,,,,,,,,,,,,,,,,,,627,,,627,,,627,627,,,627,,627,,,,627,,,,,,,,,627', +',,,,627,627,627,627,,627,627,627,627,,,,,627,627,,,,818,818,818,627', +'818,627,627,627,818,818,627,627,,818,,818,818,818,818,818,818,818,,', +',,,818,818,818,818,818,818,818,,,818,,,,,,,818,,,818,818,818,818,818', +'818,818,818,,818,818,818,,818,818,818,818,818,,,,,,,,,,,,,,,,,,,,818', +',,818,,,818,818,,,818,,,,,,818,,,,,,,,,818,,,,,818,818,818,818,,818', +'818,818,818,,,,,818,818,,,,614,614,614,818,614,818,818,818,614,614,818', +'818,,614,,614,614,614,614,614,614,614,,,,,,614,614,614,614,614,614,614', +',,614,,,,,,,614,,,614,614,614,614,614,614,614,614,614,614,614,614,,614', +'614,614,614,614,,,,,,,,,,,,,,,,,,,,614,,,614,,,614,614,,,614,,,,,,614', +',,614,,,,,,614,,,,,614,614,614,614,,614,614,614,614,,,,,614,614,,,,611', +'611,611,614,611,614,614,614,611,611,614,614,,611,,611,611,611,611,611', +'611,611,,,,,,611,611,611,611,611,611,611,,,611,,,,,,,611,,,611,611,611', +'611,611,611,611,611,611,611,611,611,,611,611,611,611,611,,,,,,,,,,,', +',,,,,,,,611,,,611,,,611,611,,,611,,611,,,,611,,,611,,,,,,611,,,,,611', +'611,611,611,,611,611,611,611,,,,,611,611,,,,239,239,239,611,239,611', +'611,611,239,239,611,611,,239,,239,239,239,239,239,239,239,,,,,,239,239', +'239,239,239,239,239,,,239,,,,,,,239,,,239,239,239,239,239,239,239,239', +',239,239,239,,239,239,239,239,239,,,,,,,,,,,,,,,,,,,,239,,,239,,,239', +'239,,,239,,,,,,239,,,,,,,,,239,,,,,239,239,239,239,,239,239,239,239', +',,,,239,239,239,,,605,605,605,239,605,239,239,239,605,605,239,239,,605', +',605,605,605,605,605,605,605,,,,,,605,605,605,605,605,605,605,,,605', +',,,,,,605,,,605,605,605,605,605,605,605,605,,605,605,605,,605,605,605', +'605,605,,,,,,,,,,,,,,,,,,,,605,,,605,,,605,605,,,605,,,,,,605,,,,,,', +',,605,,,,,605,605,605,605,,605,605,605,605,,,,,605,605,,,,1035,1035', +'1035,605,1035,605,605,605,1035,1035,605,605,,1035,,1035,1035,1035,1035', +'1035,1035,1035,,,,,,1035,1035,1035,1035,1035,1035,1035,,,1035,,,,,,', +'1035,,,1035,1035,1035,1035,1035,1035,1035,1035,,1035,1035,1035,,1035', +'1035,1035,1035,1035,,,,,,,,,,,,,,,,,,,,1035,,,1035,,,1035,1035,,,1035', +',,,,,1035,,,,,,,,,1035,,,,,1035,1035,1035,1035,,1035,1035,1035,1035', +',,,,1035,1035,,,,603,603,603,1035,603,1035,1035,1035,603,603,1035,1035', +',603,,603,603,603,603,603,603,603,,,,,,603,603,603,603,603,603,603,', +',603,,,,,,,603,,,603,603,603,603,603,603,603,603,,603,603,603,,603,603', +'603,603,603,,,,,,,,,,,,,,,,,,,,603,,,603,,,603,603,,,603,,,,,,603,,', +',,,,,,603,,,,,603,603,603,603,,603,603,603,603,,,,,603,603,,,,600,600', +'600,603,600,603,603,603,600,600,603,603,,600,,600,600,600,600,600,600', +'600,,,,,,600,600,600,600,600,600,600,,,600,,,,,,,600,,,600,600,600,600', +'600,600,600,600,,600,600,600,,600,600,600,600,600,,,,,,,,,,,,,,,,,,', +',600,,,600,,,600,600,,,600,,,,,,600,,,,,,,,,600,,,,,600,600,600,600', +',600,600,600,600,,,,,600,600,,,,238,238,238,600,238,600,600,600,238', +'238,600,600,,238,,238,238,238,238,238,238,238,,,,,,238,238,238,238,238', +'238,238,,,238,,,,,,,238,,,238,238,238,238,238,238,238,238,,238,238,238', +',238,238,238,238,238,,,,,,,,,,,,,,,,,,,,238,,,238,,,238,238,,,238,,', +',,,238,,,,,,,,,238,,,,,238,238,238,238,,238,238,238,238,,,,,238,238', +',,,237,237,237,238,237,238,238,238,237,237,238,238,,237,,237,237,237', +'237,237,237,237,,,,,,237,237,237,237,237,237,237,,,237,,,,,,,237,,,237', +'237,237,237,237,237,237,237,,237,237,237,,237,237,237,237,237,,,,,,', +',,,,,,,,,,,,,237,,,237,,,237,237,,,237,,,,,,237,,,,,,,,,237,,,,,237', +'237,237,237,,237,237,237,237,,,,,237,237,,,,590,590,590,237,590,237', +'237,237,590,590,237,237,,590,,590,590,590,590,590,590,590,,,,,,590,590', +'590,590,590,590,590,,,590,,,,,,,590,,,590,590,590,590,590,590,590,590', +'590,590,590,590,,590,590,590,590,590,,,,,,,,,,,,,,,,,,,,590,,,590,,', +'590,590,,,590,,590,,590,,590,,,590,,,,,,590,,,,,590,590,590,590,,590', +'590,590,590,,,,,590,590,,,,,,,590,,590,590,590,,,590,590,580,580,580', +'580,580,,,,580,580,,,,580,,580,580,580,580,580,580,580,,,,,,580,580', +'580,580,580,580,580,,,580,,,,,,580,580,580,580,580,580,580,580,580,580', +'580,580,,580,580,580,,580,580,580,580,580,,,,,,,,,,,,,,,,,,,,580,,,580', +',,580,580,,,580,,580,,,,580,,,,,,,,,580,,,,,580,580,580,580,,580,580', +'580,580,,,,,580,580,,,,,,580,580,,580,580,580,,,580,580,574,574,574', +',574,,,,574,574,,,,574,,574,574,574,574,574,574,574,,,,,,574,574,574', +'574,574,574,574,,,574,,,,,,,574,,,574,574,574,574,574,574,574,574,,574', +'574,574,,574,574,574,574,574,,,,,,,,,,,,,,,,,,,,574,,,574,,,574,574', +',,574,,,,,,574,,,,,,,,,574,,,,,574,574,574,574,,574,574,574,574,,,,', +'574,574,,,,369,369,369,574,369,574,574,574,369,369,574,574,,369,,369', +'369,369,369,369,369,369,,,,,,369,369,369,369,369,369,369,,,369,,,,,', +',369,,,369,369,369,369,369,369,369,369,,369,369,369,,369,369,369,369', +'369,,,,,,,,,,,,,,,,,,,,369,,,369,,,369,369,,,369,,,,,,369,,,,,,,,,369', +',,,,369,369,369,369,,369,369,369,369,,,,,369,369,,,,46,46,46,369,46', +'369,369,369,46,46,369,369,,46,,46,46,46,46,46,46,46,,,,,,46,46,46,46', +'46,46,46,,,46,,,,,,,46,,,46,46,46,46,46,46,46,46,,46,46,46,,46,46,46', +'46,46,,,,,,,,,,,,,,,,,,,,46,,,46,,,46,46,,,46,,,,,,46,,,,,,,,,46,,,', +',46,46,46,46,,46,46,46,46,,,,,46,46,,,,572,572,572,46,572,46,46,46,572', +'572,46,46,,572,,572,572,572,572,572,572,572,,,,,,572,572,572,572,572', +'572,572,,,572,,,,,,,572,,,572,572,572,572,572,572,572,572,572,572,572', +'572,,572,572,572,572,572,,,,,,,,,,,,,,,,,,,,572,,,572,,,572,572,,,572', +',,,572,,572,,,572,,,,,,572,,,,,572,572,572,572,,572,572,572,572,,,,', +'572,572,,,,570,570,570,572,570,572,572,572,570,570,572,572,,570,,570', +'570,570,570,570,570,570,,,,,,570,570,570,570,570,570,570,,,570,,,,,', +',570,,,570,570,570,570,570,570,570,570,570,570,570,570,,570,570,570', +'570,570,,,,,,,,,,,,,,,,,,,,570,,,570,,,570,570,,,570,,570,,570,,570', +',,570,,,,,,570,,,,,570,570,570,570,,570,570,570,570,,,,,570,570,,,,47', +'47,47,570,47,570,570,570,47,47,570,570,,47,,47,47,47,47,47,47,47,,,', +',,47,47,47,47,47,47,47,,,47,,,,,,,47,,,47,47,47,47,47,47,47,47,,47,47', +'47,,47,47,47,47,47,,,,,,,,,,,,,,,,,,,,47,,,47,,,47,47,,,47,,,,,,47,', +',,,,,,,47,,,,,47,47,47,47,,47,47,47,47,,,,,47,47,,,,560,560,560,47,560', +'47,47,47,560,560,47,47,,560,,560,560,560,560,560,560,560,,,,,,560,560', +'560,560,560,560,560,,,560,,,,,,,560,,,560,560,560,560,560,560,560,560', +',560,560,560,,560,560,560,560,560,,,,,,,,,,,,,,,,,,,,560,,,560,,,560', +'560,,,560,,,,,,560,,,,,,,,,560,,,,,560,560,560,560,,560,560,560,560', +',,,,560,560,,,,49,49,49,560,49,560,560,560,49,49,560,560,,49,,49,49', +'49,49,49,49,49,,,,,,49,49,49,49,49,49,49,,,49,,,,,,,49,,,49,49,49,49', +'49,49,49,49,,49,49,49,,49,49,49,49,49,,,,,,,,,,,,,,,,,,,,49,,,49,,,49', +'49,,,49,,,,,,49,,,,,,,,,49,,,,,49,49,49,49,,49,49,49,49,,,,,49,49,,', +',,,,49,,49,49,49,555,,49,49,,,,555,555,555,,,555,555,555,703,555,703', +'703,703,703,703,,,555,555,555,,,,703,,,,,,555,555,,555,555,555,555,555', +',701,,701,701,701,701,701,703,,,,,,,,701,703,703,703,703,,,,703,,1140', +',1140,1140,1140,1140,1140,555,,,,,701,,555,1140,,,,555,555,701,701,701', +'701,,,,701,,,,,,,,,1140,703,,,,555,555,,,,,1140,1140,,,,1140,,,,555', +',,555,,283,283,283,555,283,,701,,283,283,555,,,283,,283,283,283,283', +'283,283,283,,,,,,283,283,283,283,283,283,283,,,283,,,,,,,283,,,283,283', +'283,283,283,283,283,283,,283,283,283,,283,283,283,283,283,,,,,,,,,,', +',,,,,,,,,283,,,283,,,283,283,,,283,,,,,,283,,,,,,,,,283,,,,,283,283', +'283,283,,283,283,283,283,,,,,283,283,,,,224,224,224,283,224,283,283', +'283,224,224,283,283,,224,,224,224,224,224,224,224,224,,,,,,224,224,224', +'224,224,224,224,,,224,,,,,,,224,,,224,224,224,224,224,224,224,224,224', +'224,224,224,,224,224,224,224,224,,,,,,,,,,,,,,,,,,,,224,,,224,,,224', +'224,,,224,,224,,224,,224,,,224,,,,,,224,,,,,224,224,224,224,,224,224', +'224,224,,,,,224,224,,,,223,223,223,224,223,224,224,224,223,223,224,224', +',223,,223,223,223,223,223,223,223,,,,,,223,223,223,223,223,223,223,', +',223,,,,,,,223,,,223,223,223,223,223,223,223,223,,223,223,223,,223,223', +'223,223,223,,,,,,,,,,,,,,,,,,,,223,,,223,,,223,223,,,223,,,,,,223,,', +',,,,,,223,,,,,223,223,223,223,,223,223,223,223,,,,,223,223,,,,50,50', +'50,223,50,223,223,223,50,50,223,223,,50,,50,50,50,50,50,50,50,,,,,,50', +'50,50,50,50,50,50,,,50,,,,,,,50,,,50,50,50,50,50,50,50,50,,50,50,50', +',50,50,50,50,50,,,,,,,,,,,,,,,,,,,,50,,,50,,,50,50,,,50,,,,,,50,,,,', +',,,,50,,,,,50,50,50,50,,50,50,50,50,,,,,50,50,,,,222,222,222,50,222', +'50,50,50,222,222,50,50,,222,,222,222,222,222,222,222,222,,,,,,222,222', +'222,222,222,222,222,,,222,,,,,,,222,,,222,222,222,222,222,222,222,222', +',222,222,222,,222,222,222,222,222,,,,,,,,,,,,,,,,,,,,222,,,222,,,222', +'222,,,222,,,,,,222,,,,,,,,,222,,,,,222,222,222,222,,222,222,222,222', +',,,,222,222,,,,72,72,72,222,72,222,222,222,72,72,222,222,,72,,72,72', +'72,72,72,72,72,,,,,,72,72,72,72,72,72,72,,,72,,,,,,,72,,,72,72,72,72', +'72,72,72,72,,72,72,72,,72,72,72,72,72,,,,,,,,,,,,,,,,,,,,72,,,72,,,72', +'72,,,72,,,,,,72,,,,,,,,,72,,,,,72,72,72,72,,72,72,72,72,,,,,72,72,,', +',71,71,71,72,71,72,72,72,71,71,72,72,,71,,71,71,71,71,71,71,71,,,,,', +'71,71,71,71,71,71,71,,,71,,,,,,,71,,,71,71,71,71,71,71,71,71,,71,71', +'71,,71,71,71,71,71,,,,,,,,,,,,,,,,,,,,71,,,71,,,71,71,,,71,,,,,,71,', +',,,,,,,71,,,,,71,71,71,71,,71,71,71,71,,,,,71,71,,,,436,436,436,71,436', +'71,71,71,436,436,71,71,,436,,436,436,436,436,436,436,436,,,,,,436,436', +'436,436,436,436,436,,,436,,,,,,,436,,,436,436,436,436,436,436,436,436', +',436,436,436,,436,436,436,436,436,,,,,,,,,,,,,,,,,,,,436,,,436,,,436', +'436,,,436,,,,,,436,,,,,,,,,436,,,,,436,436,436,436,,436,436,436,436', +',,,,436,436,,,,68,68,68,436,68,436,436,436,68,68,436,436,,68,,68,68', +'68,68,68,68,68,,,,,,68,68,68,68,68,68,68,,,68,,,,,,,68,,,68,68,68,68', +'68,68,68,68,68,68,68,68,,68,68,68,68,68,,,,,,,,,,,,,,,,,,,,68,,,68,', +',68,68,,,68,,,,,,68,,,68,,,,,,68,,,,,68,68,68,68,,68,68,68,68,,,,,68', +'68,,,,407,407,407,68,407,68,68,68,407,407,68,68,,407,,407,407,407,407', +'407,407,407,,,,,,407,407,407,407,407,407,407,,,407,,,,,,,407,,,407,407', +'407,407,407,407,407,407,,407,407,407,,407,407,407,407,407,,,,,,,,,,', +',,,,,,,,,407,,,407,,,407,407,,,407,,,,,,407,,,,,,,,,407,,,,,407,407', +'407,407,,407,407,407,407,,,,,407,407,,,,847,847,847,407,847,407,407', +'407,847,847,407,407,,847,,847,847,847,847,847,847,847,,,,,,847,847,847', +'847,847,847,847,,,847,,,,,,,847,,,847,847,847,847,847,847,847,847,,847', +'847,847,,847,847,847,847,847,,,,,,,,,,,,,,,,,,,,847,,,847,,,847,847', +',,847,,,,,,847,,,,,,,,,847,,,,,847,847,847,847,,847,847,847,847,,,,', +'847,847,,,,276,276,276,847,276,847,847,847,276,276,847,847,,276,,276', +'276,276,276,276,276,276,,,,,,276,276,276,276,276,276,276,,,276,,,,,', +',276,,,276,276,276,276,276,276,276,276,,276,276,276,,276,276,276,276', +'276,,,,,,,,,,,,,,,,,,,,276,,,276,,,276,276,,,276,,,,,,276,,,,,,,,,276', +',,,,276,276,276,276,,276,276,276,276,,,,,276,276,,,,275,275,275,276', +'275,276,276,276,275,275,276,276,,275,,275,275,275,275,275,275,275,,', +',,,275,275,275,275,275,275,275,,,275,,,,,,,275,,,275,275,275,275,275', +'275,275,275,,275,275,275,,275,275,275,275,275,,,,,,,,,,,,,,,,,,,,275', +',,275,,,275,275,,,275,,,,,,275,,,,,,,,,275,,,,,275,275,275,275,,275', +'275,275,275,,,,,275,275,,,,67,67,67,275,67,275,275,275,67,67,275,275', +',67,,67,67,67,67,67,67,67,,,,,,67,67,67,67,67,67,67,,,67,,,,,,,67,,', +'67,67,67,67,67,67,67,67,67,67,67,67,,67,67,67,67,67,,,,,,,,,,,,,,,,', +',,,67,,,67,,,67,67,,,67,,67,,,,67,,,67,,,,,,67,,,,,67,67,67,67,,67,67', +'67,67,,,,,67,67,,,,,,,67,,67,67,67,,,67,67,66,66,66,66,66,,,,66,66,', +',,66,,66,66,66,66,66,66,66,,,,,,66,66,66,66,66,66,66,,,66,,,,,,66,66', +',66,66,66,66,66,66,66,66,66,,66,66,66,,66,66,66,66,66,,,,,,,,,,,,,,', +',,,,,66,,,66,,,66,66,,,66,,66,,,,66,,,,,,,,,66,,,,,66,66,66,66,,66,66', +'66,66,,,,,66,66,,,,299,299,299,66,299,66,66,66,299,299,66,66,,299,,299', +'299,299,299,299,299,299,,,,,,299,299,299,299,299,299,299,,,299,,,,,', +',299,,,299,299,299,299,299,299,299,299,,299,299,299,,299,299,299,299', +'299,,,,,,,,,,,,,,,,,,,,299,,,299,,,299,299,,,299,,,,,,299,,,,,,,,,299', +',,,,299,299,299,299,,299,299,299,299,,,,,299,299,,,,274,274,274,299', +'274,299,299,299,274,274,299,299,,274,,274,274,274,274,274,274,274,,', +',,,274,274,274,274,274,274,274,,,274,,,,,,,274,,,274,274,274,274,274', +'274,274,274,,274,274,274,,274,274,274,274,274,,,,,,,,,,,,,,,,,,,,274', +',,274,,,274,274,,,274,,,,,,274,,,,,,,,,274,,,,,274,274,274,274,,274', +'274,274,274,,,,,274,274,,,,867,867,867,274,867,274,274,274,867,867,274', +'274,,867,,867,867,867,867,867,867,867,,,,,,867,867,867,867,867,867,867', +',,867,,,,,,,867,,,867,867,867,867,867,867,867,867,,867,867,867,,867', +'867,867,867,867,,,,,,,,,,,,,,,,,,,,867,,,867,,,867,867,,,867,,,,,,867', +',,,,,,,,867,,,,,867,867,867,867,,867,867,867,867,,,,,867,867,,,,24,24', +'24,867,24,867,867,867,24,24,867,867,,24,,24,24,24,24,24,24,24,,,,,,24', +'24,24,24,24,24,24,,,24,,,,,,,24,,,24,24,24,24,24,24,24,24,,24,24,24', +',24,24,24,24,24,,,,,,,,,,,,,,,,,,,,24,,,24,,,24,24,,,24,,,,,,24,,,,', +',,,,24,,,,,24,24,24,24,,24,24,24,24,,,,,24,24,,,,273,273,273,24,273', +'24,24,24,273,273,24,24,,273,,273,273,273,273,273,273,273,,,,,,273,273', +'273,273,273,273,273,,,273,,,,,,,273,,,273,273,273,273,273,273,273,273', +',273,273,273,,273,273,273,273,273,,,,,,,,,,,,,,,,,,,,273,,,273,,,273', +'273,,,273,,,,,,273,,,,,,,,,273,,,,,273,273,273,273,,273,273,273,273', +',,,,273,273,,,,788,788,788,273,788,273,273,273,788,788,273,273,,788', +',788,788,788,788,788,788,788,,,,,,788,788,788,788,788,788,788,,,788', +',,,,,,788,,,788,788,788,788,788,788,788,788,788,788,788,788,,788,788', +'788,788,788,,,,,,,,,,,,,,,,,,,,788,,,788,,,788,788,,,788,,788,,788,', +'788,,,788,,,,,,788,,,,,788,788,788,788,,788,788,788,788,,,,,788,788', +',,,272,272,272,788,272,788,788,788,272,272,788,788,,272,,272,272,272', +'272,272,272,272,,,,,,272,272,272,272,272,272,272,,,272,,,,,,,272,,,272', +'272,272,272,272,272,272,272,,272,272,272,,272,272,272,272,272,,,,,,', +',,,,,,,,,,,,,272,,,272,,,272,272,,,272,,,,,,272,,,,,,,,,272,,,,,272', +'272,272,272,,272,272,272,272,,,,,272,272,,,,875,875,875,272,875,272', +'272,272,875,875,272,272,,875,,875,875,875,875,875,875,875,,,,,,875,875', +'875,875,875,875,875,,,875,,,,,,,875,,,875,875,875,875,875,875,875,875', +',875,875,875,,875,875,875,875,875,,,,,,,,,,,,,,,,,,,,875,,,875,,,875', +'875,,,875,,,,,,875,,,,,,,,,875,,,,,875,875,875,875,,875,875,875,875', +',,,,875,875,,,,306,306,306,875,306,875,875,875,306,306,875,875,,306', +',306,306,306,306,306,306,306,,,,,,306,306,306,306,306,306,306,,,306', +',,,,,,306,,,306,306,306,306,306,306,306,306,306,306,306,306,,306,306', +'306,306,306,,,,,,,,,,,,,,,,,,,,306,,,306,,,306,306,,,306,,306,,306,', +'306,,,306,,,,,,306,,,,,306,306,306,306,,306,306,306,306,,,,,306,306', +',,,888,888,888,306,888,306,306,306,888,888,306,306,,888,,888,888,888', +'888,888,888,888,,,,,,888,888,888,888,888,888,888,,,888,,,,,,,888,,,888', +'888,888,888,888,888,888,888,,888,888,888,,888,888,888,888,888,,,,,,', +',,,,,,,,,,,,,888,,,888,,,888,888,,,888,,,,,,888,,,,,,,,,888,,,,,888', +'888,888,888,,888,888,888,888,,,,,888,888,,,,889,889,889,888,889,888', +'888,888,889,889,888,888,,889,,889,889,889,889,889,889,889,,,,,,889,889', +'889,889,889,889,889,,,889,,,,,,,889,,,889,889,889,889,889,889,889,889', +',889,889,889,,889,889,889,889,889,,,,,,,,,,,,,,,,,,,,889,,,889,,,889', +'889,,,889,,,,,,889,,,,,,,,,889,,,,,889,889,889,889,,889,889,889,889', +',,,,889,889,,,,307,307,307,889,307,889,889,889,307,307,889,889,,307', +',307,307,307,307,307,307,307,,,,,,307,307,307,307,307,307,307,,,307', +',,,,,,307,,,307,307,307,307,307,307,307,307,307,307,307,307,,307,307', +'307,307,307,,,,,,,,,,,,,,,,,,,,307,,,307,,,307,307,,,307,,307,,307,', +'307,,,307,,,,,,307,,,,,307,307,307,307,,307,307,307,307,,,,,307,307', +',,,315,315,315,307,315,307,307,307,315,315,307,307,,315,,315,315,315', +'315,315,315,315,,,,,,315,315,315,315,315,315,315,,,315,,,,,,,315,,,315', +'315,315,315,315,315,315,315,315,315,315,315,,315,315,315,315,315,,,', +',,,,,,,,,,,,,,,,315,,,315,,,315,315,,,315,,315,,315,,315,,,315,,,,,', +'315,,,,,315,315,315,315,,315,315,315,315,,,,,315,315,315,,,271,271,271', +'315,271,315,315,315,271,271,315,315,,271,,271,271,271,271,271,271,271', +',,,,,271,271,271,271,271,271,271,,,271,,,,,,,271,,,271,271,271,271,271', +'271,271,271,,271,271,271,,271,271,271,271,271,,,,,,,,,,,,,,,,,,,,271', +',,271,,,271,271,,,271,,,,,,271,,,,,,,,,271,,,,,271,271,271,271,,271', +'271,271,271,,,,,271,271,,,,270,270,270,271,270,271,271,271,270,270,271', +'271,,270,,270,270,270,270,270,270,270,,,,,,270,270,270,270,270,270,270', +',,270,,,,,,,270,,,270,270,270,270,270,270,270,270,,270,270,270,,270', +'270,270,270,270,,,,,,,,,,,,,,,,,,,,270,,,270,,,270,270,,,270,,,,,,270', +',,,,,,,,270,,,,,270,270,270,270,,270,270,270,270,,,,,270,270,,,,269', +'269,269,270,269,270,270,270,269,269,270,270,,269,,269,269,269,269,269', +'269,269,,,,,,269,269,269,269,269,269,269,,,269,,,,,,,269,,,269,269,269', +'269,269,269,269,269,,269,269,269,,269,269,269,269,269,,,,,,,,,,,,,,', +',,,,,269,,,269,,,269,269,,,269,,,,,,269,,,,,,,,,269,,,,,269,269,269', +'269,,269,269,269,269,,,,,269,269,,,,322,322,322,269,322,269,269,269', +'322,322,269,269,,322,,322,322,322,322,322,322,322,,,,,,322,322,322,322', +'322,322,322,,,322,,,,,,,322,,,322,322,322,322,322,322,322,322,,322,322', +'322,,322,322,322,322,322,,,,,,,,,,,,,,,,,,,,322,,,322,,,322,322,,,322', +',,,,,322,,,,,,,,,322,,,,,322,322,322,322,,322,322,322,322,,,,,322,322', +',,,324,324,324,322,324,322,322,322,324,324,322,322,,324,,324,324,324', +'324,324,324,324,,,,,,324,324,324,324,324,324,324,,,324,,,,,,,324,,,324', +'324,324,324,324,324,324,324,,324,324,324,,324,324,324,324,324,,,,,,', +',,,,,,,,,,,,,324,,,324,,,324,324,,,324,,,,,,324,,,,,,,,,324,,,,,324', +'324,324,324,,324,324,324,324,,,,,324,324,,,,327,327,327,324,327,324', +'324,324,327,327,324,324,,327,,327,327,327,327,327,327,327,,,,,,327,327', +'327,327,327,327,327,,,327,,,,,,,327,,,327,327,327,327,327,327,327,327', +',327,327,327,,327,327,327,327,327,,,,,,,,,,,,,,,,,,,,327,,,327,,,327', +'327,,,327,,,,,,327,,,,,,,,,327,,,,,327,327,327,327,,327,327,327,327', +',,,,327,327,,,,328,328,328,327,328,327,327,327,328,328,327,327,,328', +',328,328,328,328,328,328,328,,,,,,328,328,328,328,328,328,328,,,328', +',,,,,,328,,,328,328,328,328,328,328,328,328,,328,328,328,,328,328,328', +'328,328,,,,,,,,,,,,,,,,,,,,328,,,328,,,328,328,,,328,,,,,,328,,,,,,', +',,328,,,,,328,328,328,328,,328,328,328,328,,,,,328,328,,,,268,268,268', +'328,268,328,328,328,268,268,328,328,,268,,268,268,268,268,268,268,268', +',,,,,268,268,268,268,268,268,268,,,268,,,,,,,268,,,268,268,268,268,268', +'268,268,268,,268,268,268,,268,268,268,268,268,,,,,,,,,,,,,,,,,,,,268', +',,268,,,268,268,,,268,,,,,,268,,,,,,,,,268,,,,,268,268,268,268,,268', +'268,268,268,,,,,268,268,,,,267,267,267,268,267,268,268,268,267,267,268', +'268,,267,,267,267,267,267,267,267,267,,,,,,267,267,267,267,267,267,267', +',,267,,,,,,,267,,,267,267,267,267,267,267,267,267,,267,267,267,,267', +'267,267,267,267,,,,,,,,,,,,,,,,,,,,267,,,267,,,267,267,,,267,,,,,,267', +',,,,,,,,267,,,,,267,267,267,267,,267,267,267,267,,,,,267,267,,,,266', +'266,266,267,266,267,267,267,266,266,267,267,,266,,266,266,266,266,266', +'266,266,,,,,,266,266,266,266,266,266,266,,,266,,,,,,,266,,,266,266,266', +'266,266,266,266,266,,266,266,266,,266,266,266,266,266,,,,,,,,,,,,,,', +',,,,,266,,,266,,,266,266,,,266,,,,,,266,,,,,,,,,266,,,,,266,266,266', +'266,,266,266,266,266,,,,,266,266,,,,917,917,917,266,917,266,266,266', +'917,917,266,266,,917,,917,917,917,917,917,917,917,,,,,,917,917,917,917', +'917,917,917,,,917,,,,,,,917,,,917,917,917,917,917,917,917,917,,917,917', +'917,,917,917,917,917,917,,,,,,,,,,,,,,,,,,,,917,,,917,,,917,917,,,917', +',,,,,917,,,,,,,,,917,,,,,917,917,917,917,,917,917,917,917,,,,,917,917', +',,,918,918,918,917,918,917,917,917,918,918,917,917,,918,,918,918,918', +'918,918,918,918,,,,,,918,918,918,918,918,918,918,,,918,,,,,,,918,,,918', +'918,918,918,918,918,918,918,,918,918,918,,918,918,918,918,918,,,,,,', +',,,,,,,,,,,,,918,,,918,,,918,918,,,918,,,,,,918,,,,,,,,,918,,,,,918', +'918,918,918,,918,918,918,918,,,,,918,918,,,,919,919,919,918,919,918', +'918,918,919,919,918,918,,919,,919,919,919,919,919,919,919,,,,,,919,919', +'919,919,919,919,919,,,919,,,,,,,919,,,919,919,919,919,919,919,919,919', +',919,919,919,,919,919,919,919,919,,,,,,,,,,,,,,,,,,,,919,,,919,,,919', +'919,,,919,,,,,,919,,,,,,,,,919,,,,,919,919,919,919,,919,919,919,919', +',,,,919,919,,,,497,497,497,919,497,919,919,919,497,497,919,919,,497', +',497,497,497,497,497,497,497,,,,,,497,497,497,497,497,497,497,,,497', +',,,,,,497,,,497,497,497,497,497,497,497,497,,497,497,497,,497,497,497', +'497,497,,,,,,,,,,,,,,,,,,,,497,,,497,,,497,497,,,497,,,,,,497,,,,,,', +',,497,,,,,497,497,497,497,,497,497,497,497,,,,,497,497,,,,,,,497,,497', +'497,497,,,497,497,133,133,133,133,133,,,,133,133,,,,133,,133,133,133', +'133,133,133,133,,,,,,133,133,133,133,133,133,133,,,133,,,,,,133,133', +',133,133,133,133,133,133,133,133,133,,133,133,133,,133,133,133,133,133', +',,,,,,,,,,,,,,,,,,,133,,,133,,,133,133,,,133,,133,,,,133,,,,,,,,,133', +',,,,133,133,133,133,,133,133,133,133,,,,,133,133,,,,132,132,132,133', +'132,133,133,133,132,132,133,133,,132,,132,132,132,132,132,132,132,,', +',,,132,132,132,132,132,132,132,,,132,,,,,,,132,,,132,132,132,132,132', +'132,132,132,,132,132,132,,132,132,132,132,132,,,,,,,,,,,,,,,,,,,,132', +',,132,,,132,132,,,132,,,,,,132,,,,,,,,,132,,,,,132,132,132,132,,132', +'132,132,132,,,,,132,132,,,,131,131,131,132,131,132,132,132,131,131,132', +'132,,131,,131,131,131,131,131,131,131,,,,,,131,131,131,131,131,131,131', +',,131,,,,,,,131,,,131,131,131,131,131,131,131,131,,131,131,131,,131', +'131,131,131,131,,,,,,,,,,,,,,,,,,,,131,,,131,,,131,131,,,131,,,,,,131', +',,,,,,,,131,,,,,131,131,131,131,,131,131,131,131,,,,,131,131,,,,130', +'130,130,131,130,131,131,131,130,130,131,131,,130,,130,130,130,130,130', +'130,130,,,,,,130,130,130,130,130,130,130,,,130,,,,,,,130,,,130,130,130', +'130,130,130,130,130,,130,130,130,,130,130,130,130,130,,,,,,,,,,,,,,', +',,,,,130,,,130,,,130,130,,,130,,,,,,130,,,,,,,,,130,,,,,130,130,130', +'130,,130,130,130,130,,,,,130,130,,,,1149,1149,1149,130,1149,130,130', +'130,1149,1149,130,130,,1149,,1149,1149,1149,1149,1149,1149,1149,,,,', +',1149,1149,1149,1149,1149,1149,1149,,,1149,,,,,,,1149,,,1149,1149,1149', +'1149,1149,1149,1149,1149,,1149,1149,1149,,1149,1149,1149,1149,1149,', +',,,,,,,,,,,,,,,,,,1149,,,1149,,,1149,1149,,,1149,,,,,,1149,,,,,,,,,1149', +',,,,1149,1149,1149,1149,,1149,1149,1149,1149,,,,,1149,1149,,,,1150,1150', +'1150,1149,1150,1149,1149,1149,1150,1150,1149,1149,,1150,,1150,1150,1150', +'1150,1150,1150,1150,,,,,,1150,1150,1150,1150,1150,1150,1150,,,1150,', +',,,,,1150,,,1150,1150,1150,1150,1150,1150,1150,1150,,1150,1150,1150', +',1150,1150,1150,1150,1150,,,,,,,,,,,,,,,,,,,,1150,,,1150,,,1150,1150', +',,1150,,,,,,1150,,,,,,,,,1150,,,,,1150,1150,1150,1150,,1150,1150,1150', +'1150,,,,,1150,1150,,,,52,52,52,1150,52,1150,1150,1150,52,52,1150,1150', +',52,,52,52,52,52,52,52,52,,,,,,52,52,52,52,52,52,52,,,52,,,,,,,52,,', +'52,52,52,52,52,52,52,52,,52,52,52,,52,52,52,52,52,,,,,,,,,,,,,,,,,,', +',52,,,52,,,52,52,,,52,,,,,,52,,,,,,,,,52,,,,,52,52,52,52,,52,52,52,52', +',,,,52,52,,,,129,129,129,52,129,52,52,52,129,129,52,52,,129,,129,129', +'129,129,129,129,129,,,,,,129,129,129,129,129,129,129,,,129,,,,,,,129', +',,129,129,129,129,129,129,129,129,,129,129,129,,129,129,129,129,129', +',,,,,,,,,,,,,,,,,,,129,,,129,,,129,129,,,129,,,,,,129,,,,,,,,,129,,', +',,129,129,129,129,,129,129,129,129,,,,,129,129,,,,,,,129,,129,129,129', +',,129,129,124,124,124,124,124,,,,124,124,,,,124,,124,124,124,124,124', +'124,124,,,,,,124,124,124,124,124,124,124,,,124,,,,,,124,124,124,124', +'124,124,124,124,124,124,124,124,,124,124,124,,124,124,124,124,124,,', +',,,,,,,,,,,,,,,,,124,,,124,,,124,124,,,124,,124,,,,124,,,,,,,,,124,', +',,,124,124,124,124,,124,124,124,124,,,,,124,124,,,,,,124,124,,124,124', +'124,,,124,124,1162,1162,1162,,1162,,,,1162,1162,,,,1162,,1162,1162,1162', +'1162,1162,1162,1162,,,,,,1162,1162,1162,1162,1162,1162,1162,,,1162,', +',,,,,1162,,,1162,1162,1162,1162,1162,1162,1162,1162,1162,1162,1162,1162', +',1162,1162,1162,1162,1162,,,,,,,,,,,,,,,,,,,,1162,,,1162,,,1162,1162', +',,1162,,1162,,1162,,1162,,,1162,,,,,,1162,,,,,1162,1162,1162,1162,,1162', +'1162,1162,1162,,,,,1162,1162,,,,471,471,471,1162,471,1162,1162,1162', +'471,471,1162,1162,,471,,471,471,471,471,471,471,471,,,,,,471,471,471', +'471,471,471,471,,,471,,,,,,,471,,,471,471,471,471,471,471,471,471,,471', +'471,471,,471,471,471,471,471,,,,,,,,,,,,,,,,,,,,471,,,471,,,471,471', +',,471,,,,,,471,,,,,,,,,471,,,,,471,471,471,471,,471,471,471,471,,,,', +'471,471,,,,277,277,277,471,277,471,471,471,277,277,471,471,,277,,277', +'277,277,277,277,277,277,,,,,,277,277,277,277,277,277,277,,,277,,,,,', +',277,,,277,277,277,277,277,277,277,277,,277,277,277,,277,277,277,277', +'277,,,,,,,,,,,,,,,,,,,,277,,,277,,,277,277,,,277,,,,,,277,,,,,,,,,277', +',,,,277,277,277,277,,277,277,277,277,,,,,277,277,,,,,,,277,,277,277', +'277,470,,277,277,,,,470,470,470,,,470,470,470,,470,,,,,,,,470,470,470', +'470,470,,,,,,,,470,470,,470,470,470,470,470,,,,,,,,,,,,,,,,,,,,,,,470', +'470,470,470,470,470,470,470,470,470,470,470,470,470,,,470,470,470,,', +'470,,,470,,,470,470,,470,,470,,470,,470,470,,470,470,470,470,470,,470', +'470,470,,,,,,,,,,,,,,470,,,470,470,470,470,,470,469,470,,,,,470,469', +'469,469,,,469,469,469,,469,,,,,,,,469,469,469,469,469,,,,951,951,951', +'951,469,469,,469,469,469,469,469,,,,,951,951,951,,,,,,,,,,,951,951,', +',951,469,469,469,469,469,469,469,469,469,469,469,469,469,469,,,469,469', +'469,,,469,,,469,,,469,469,,469,,469,,469,,469,469,,469,469,469,469,469', +',469,469,469,,951,951,951,951,,951,951,951,951,,,,469,951,951,469,469', +'469,469,,469,951,469,951,951,951,460,469,7,7,7,7,7,460,460,460,7,7,460', +'460,460,7,460,7,7,7,7,7,7,7,460,460,460,460,,7,7,7,7,7,7,7,460,460,7', +'460,460,460,460,460,7,7,7,7,7,7,7,7,7,7,7,7,,7,7,7,,7,7,7,7,7,460,460', +'460,460,460,460,460,460,460,460,460,460,460,460,,,460,460,460,7,,460', +'7,460,460,7,7,460,460,7,460,7,460,,460,7,460,460,,460,460,460,460,460', +'7,460,460,460,,7,7,7,7,,7,7,7,7,,,,460,7,7,460,460,,460,,460,7,,7,7', +'7,,460,7,7,75,75,75,,75,,,,75,75,,,,75,,75,75,75,75,75,75,75,,,,,,75', +'75,75,75,75,75,75,,,75,,,,,,,75,,,75,75,75,75,75,75,75,75,,75,75,75', +',75,75,75,75,75,,,,,,,,,,,,,,,,,,,,75,,,75,,,75,75,,,75,,,,,,75,,,,', +',,,,75,,,,,75,75,75,75,,75,75,75,75,,,,,75,75,75,,,,,75,75,,75,75,75', +'64,,75,75,,,,64,64,64,,,64,64,64,,64,,,,,,,,64,,64,64,64,,,,,,,,64,64', +',64,64,64,64,64,,,,,,,,,,,,,,,,,,,,,,,64,64,64,64,64,64,64,64,64,64', +'64,64,64,64,,,64,64,64,,,64,,,64,,,64,64,,64,,64,,64,,64,64,,64,64,64', +'64,64,,64,,64,,,,,,,,,,,,,,64,,,64,64,64,64,,64,,64,,278,278,278,64', +'278,,,,278,278,,,,278,,278,278,278,278,278,278,278,,,,,,278,278,278', +'278,278,278,278,,,278,,,,,,,278,,,278,278,278,278,278,278,278,278,,278', +'278,278,,278,278,278,278,278,,,,,,,,,,,,,,,,,,,,278,,,278,,,278,278', +',,278,,,,,,278,,,,,,,,,278,,,,,278,278,278,278,,278,278,278,278,,,,', +'278,278,,,,221,221,221,278,221,278,278,278,221,221,278,278,,221,,221', +'221,221,221,221,221,221,,,,,,221,221,221,221,221,221,221,,,221,,,,,', +',221,,,221,221,221,221,221,221,221,221,,221,221,221,,221,221,221,221', +'221,,,,,,,,,,,,,,,,,,,,221,,,221,,,221,221,,,221,,,,,,221,,,,,,,,,221', +',,,,221,221,221,221,,221,221,221,221,,,,,221,221,,,,220,220,220,221', +'220,221,221,221,220,220,221,221,,220,,220,220,220,220,220,220,220,,', +',,,220,220,220,220,220,220,220,,,220,,,,,,,220,,,220,220,220,220,220', +'220,220,220,,220,220,220,,220,220,220,220,220,,,,,,,,,,,,,,,,,,,,220', +',,220,,,220,220,,,220,,220,,,,220,,,,,,,,,220,,,,,220,220,220,220,,220', +'220,220,220,,,,,220,220,,,,800,800,800,220,800,220,220,220,800,800,220', +'220,,800,,800,800,800,800,800,800,800,,,,,,800,800,800,800,800,800,800', +',,800,,,,,,,800,,,800,800,800,800,800,800,800,800,,800,800,800,,800', +'800,800,800,800,,,,,,,,,,,,,,,,,,,,800,,,800,,,800,800,,,800,,,,,,800', +',,,,,,,,800,,,,,800,800,800,800,,800,800,800,800,,,,,800,800,,,,797', +'797,797,800,797,800,800,800,797,797,800,800,,797,,797,797,797,797,797', +'797,797,,,,,,797,797,797,797,797,797,797,,,797,,,,,,,797,,,797,797,797', +'797,797,797,797,797,,797,797,797,,797,797,797,797,797,,,,,,,,,,,,,,', +',,,,,797,,,797,,,797,797,,,797,,,,,,797,,,,,,,,,797,,,,,797,797,797', +'797,,797,797,797,797,,,,,797,797,,,,386,386,386,797,386,797,797,797', +'386,386,797,797,,386,,386,386,386,386,386,386,386,,,,,,386,386,386,386', +'386,386,386,,,386,,,,,,,386,,,386,386,386,386,386,386,386,386,,386,386', +'386,,386,386,386,386,386,,,,,,,,,,,,,,,,,,,,386,,,386,,,386,386,,,386', +',,,,,386,,,,,,,,,386,,,,,386,386,386,386,,386,386,386,386,,,,,386,386', +',,,524,524,524,386,524,386,386,386,524,524,386,386,,524,,524,524,524', +'524,524,524,524,,,,,,524,524,524,524,524,524,524,,,524,,,,,,,524,,,524', +'524,524,524,524,524,524,524,,524,524,524,,524,524,524,524,524,,,,,,', +',,,,,,,,,,,,,524,,,524,,,524,524,,,524,,,,,,524,,,,,,,,,524,,,,,524', +'524,524,524,,524,524,524,524,,,,,524,524,,,,523,523,523,524,523,524', +'524,524,523,523,524,524,,523,,523,523,523,523,523,523,523,,,,,,523,523', +'523,523,523,523,523,,,523,,,,,,,523,,,523,523,523,523,523,523,523,523', +',523,523,523,,523,523,523,523,523,,,,,,,,,,,,,,,,,,,,523,,,523,,,523', +'523,,,523,,,,,,523,,,,,,,,,523,,,,,523,523,523,523,,523,523,523,523', +',,,,523,523,,,,522,522,522,523,522,523,523,523,522,522,523,523,,522', +',522,522,522,522,522,522,522,,,,,,522,522,522,522,522,522,522,,,522', +',,,,,,522,,,522,522,522,522,522,522,522,522,,522,522,522,,522,522,522', +'522,522,,,,,,,,,,,,,,,,,,,,522,,,522,,,522,522,,,522,,,,,,522,,,,,,', +',,522,,,,,522,522,522,522,,522,522,522,522,,,,,522,522,,,,520,520,520', +'522,520,522,522,522,520,520,522,522,,520,,520,520,520,520,520,520,520', +',,,,,520,520,520,520,520,520,520,,,520,,,,,,,520,,,520,520,520,520,520', +'520,520,520,520,520,520,520,,520,520,520,520,520,,,,,,,,,,,,,,,,,,,', +'520,,,520,,,520,520,,,520,,520,,520,,520,,,520,,,,,,520,,,,,520,520', +'520,520,,520,520,520,520,,,,,520,520,,,,219,219,219,520,219,520,520', +'520,219,219,520,520,,219,,219,219,219,219,219,219,219,,,,,,219,219,219', +'219,219,219,219,,,219,,,,,,,219,,,219,219,219,219,219,219,219,219,,219', +'219,219,,219,219,219,219,219,,,,,,,,,,,,,,,,,,,,219,,,219,,,219,219', +',,219,,219,,,,219,,,,,,,,,219,,,,,219,219,219,219,,219,219,219,219,', +',,,219,219,,,,510,510,510,219,510,219,219,219,510,510,219,219,,510,', +'510,510,510,510,510,510,510,,,,,,510,510,510,510,510,510,510,,,510,', +',,,,,510,,,510,510,510,510,510,510,510,510,,510,510,510,,510,510,510', +'510,510,,,,,,,,,,,,,,,,,,,,510,,,510,,,510,510,,,510,,,,,,510,,,,,,', +',,510,,,,,510,510,510,510,,510,510,510,510,,,,,510,510,,,,1017,1017', +'1017,510,1017,510,510,510,1017,1017,510,510,,1017,,1017,1017,1017,1017', +'1017,1017,1017,,,,,,1017,1017,1017,1017,1017,1017,1017,,,1017,,,,,,', +'1017,,,1017,1017,1017,1017,1017,1017,1017,1017,,1017,1017,1017,,1017', +'1017,,,1017,,,,,,,,,,,,,,,,,,,,1017,,,1017,,,1017,1017,,,1017,,,,,,', +',,,,,,,,,,,,,1017,1017,1017,1017,,1017,1017,1017,1017,,,,,1017,1017', +',,,1081,1081,1081,1017,1081,1017,1017,1017,1081,1081,,,,1081,,1081,1081', +'1081,1081,1081,1081,1081,,,,,,1081,1081,1081,1081,1081,1081,1081,,,1081', +',,,,,,1081,,,1081,1081,1081,1081,1081,1081,1081,1081,,1081,1081,1081', +',1081,1081,,,1081,,,,,,,,,,,,,,,,,,,,1081,,,1081,,,1081,1081,,,1081', +',,,,,,,,,,,,,,,,,,,1081,1081,1081,1081,,1081,1081,1081,1081,,,,,1081', +'1081,,,,341,341,341,1081,341,1081,1081,1081,341,341,,,,341,,341,341', +'341,341,341,341,341,,,,,,341,341,341,341,341,341,341,,,341,,,,,,,341', +',,341,341,341,341,341,341,341,341,,341,341,341,,341,341,,,341,,,,,,', +',,,,,,,,,,,,,341,,,341,,,341,341,,,341,,,1214,,1214,1214,1214,1214,1214', +',,,,,,,,1214,,341,341,341,341,,341,341,341,341,,,,,341,341,,,,341,,1214', +'341,,341,341,341,588,588,588,,588,1214,1214,,588,588,1214,,,588,,588', +'588,588,588,588,588,588,,,,,,588,588,588,588,588,588,588,,,588,,,,,', +',588,,,588,588,588,588,588,588,588,588,,588,588,588,,588,588,,,588,', +',,,,,,,,,,,,,,,,,,588,,,588,,,588,588,,,588,,,,,,,,,,,,,,,,,,,,588,588', +'588,588,,588,588,588,588,,,,,588,588,,,,40,40,40,588,40,588,588,588', +'40,40,,,,40,,40,40,40,40,40,40,40,,,,,,40,40,40,40,40,40,40,,,40,,,', +',,,40,,,40,40,40,40,40,40,40,40,,40,40,40,,40,40,,,40,,,,,,,,,,,,,,', +',,,,,40,,,40,,,40,40,,,40,,,1210,,1210,1210,1210,1210,1210,,,,,,,,,1210', +',40,40,40,40,,40,40,40,40,,,,,40,40,,,,40,,1210,40,,40,40,40,803,803', +'803,,803,1210,1210,,803,803,1210,,,803,,803,803,803,803,803,803,803', +',,,,,803,803,803,803,803,803,803,,,803,,,,,,,803,,,803,803,803,803,803', +'803,803,803,,803,803,803,,803,803,,,803,,,,,,,,,,,,,,,,,,,,803,,,803', +',,803,803,,,803,,,,,,,,,,,,,,,,,,,,803,803,803,803,,803,803,803,803', +',,,,803,803,,,,360,360,360,803,360,803,803,803,360,360,,,,360,,360,360', +'360,360,360,360,360,,,,,,360,360,360,360,360,360,360,,,360,,,,,,,360', +',,360,360,360,360,360,360,360,360,,360,360,360,,360,360,,,360,,,,,,', +',,,,,,,,,,,,,360,,,360,,,360,360,,,360,,,,,,,,,,,,,,,,,,,,360,360,360', +'360,,360,360,360,360,,,,,360,360,,,,1144,1144,1144,360,1144,360,360', +'360,1144,1144,,,,1144,,1144,1144,1144,1144,1144,1144,1144,,,,,,1144', +'1144,1144,1144,1144,1144,1144,,,1144,,,,,,,1144,,,1144,1144,1144,1144', +'1144,1144,1144,1144,,1144,1144,1144,,1144,1144,,,1144,,,,,,,,,,,,,,', +',,,,,1144,,,1144,,,1144,1144,,,1144,,,,,,,,,,,,,,,,,,,,1144,1144,1144', +'1144,,1144,1144,1144,1144,,,,,1144,1144,,,,77,77,77,1144,77,1144,1144', +'1144,77,77,,,,77,,77,77,77,77,77,77,77,,,,,,77,77,77,77,77,77,77,,,77', +',,,,,,77,,,77,77,77,77,77,77,77,77,,77,77,77,,77,77,,,77,,,,,,,,,,,', +',,,,,77,,,77,,,77,,,77,77,,,77,,,,,,,,,,,,,,,,,,,,77,77,77,77,,77,77', +'77,77,,,,,77,77,,,,814,814,814,77,814,77,77,77,814,814,,,,814,,814,814', +'814,814,814,814,814,,,,,,814,814,814,814,814,814,814,,,814,,,,,,,814', +',,814,814,814,814,814,814,814,814,,814,814,814,,814,814,,,814,,,,,,', +',,,,,,,,,,,,,814,,,814,,,814,814,,,814,,,,,,,,,,,,,,,,,,,,814,814,814', +'814,,814,814,814,814,,,,,814,814,,,,597,597,597,814,597,814,814,814', +'597,597,,,,597,,597,597,597,597,597,597,597,,,,,,597,597,597,597,597', +'597,597,,,597,,,,,,,597,,,597,597,597,597,597,597,597,597,,597,597,597', +',597,597,,,597,,,,,,,,,,,,,,,,,,,,597,,,597,,,597,597,,,597,,,,,,,,', +',,,,,,,,,,,597,597,597,597,,597,597,597,597,,,,,597,597,,,,39,39,39', +'597,39,597,597,597,39,39,,,,39,,39,39,39,39,39,39,39,,,,,,39,39,39,39', +'39,39,39,,,39,,,,,,,39,,,39,39,39,39,39,39,39,39,,39,39,39,,39,39,,', +'39,,,,,,,,,,,,,,,,,,,,39,,,39,,,39,39,,,39,,39,,,,,,,,,,,,,,,,,,39,39', +'39,39,,39,39,39,39,,,,,39,39,,,,76,76,76,39,76,39,39,39,76,76,,,,76', +',76,76,76,76,76,76,76,,,,,,76,76,76,76,76,76,76,,,76,,,,,,,76,,,76,76', +'76,76,76,76,76,76,,76,76,76,,76,76,,,76,,,,,,,,,,,,,,,,,,,,76,,,76,', +',76,76,,,76,,76,,,,,,,,,,,,,,,,,,76,76,76,76,,76,76,76,76,,,,,76,76', +',,,78,78,78,76,78,76,76,76,78,78,,,,78,,78,78,78,78,78,78,78,,,,,,78', +'78,78,78,78,78,78,,,78,,,,,,,78,,,78,78,78,78,78,78,78,78,,78,78,78', +',78,78,,,78,,,,,,,,,,,,,,,,,,,,78,,,78,,,78,78,,,78,,,,,,,,,,,,,,,,', +',,,78,78,78,78,,78,78,78,78,,,,,78,78,,,,,,,78,,78,78,78,10,10,10,10', +'10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,,,,10,10', +'10,10,10,10,10,10,10,10,,,,,,10,10,10,10,10,10,10,10,10,10,,10,,,,,', +',,10,10,,10,10,10,10,10,10,10,,,10,10,,,,10,10,10,10,,,,,,,,,,,,,,10', +'10,,10,10,10,10,10,10,10,10,10,10,10,10,,,10,10,,,,,,,,,,,,,,10,427', +'427,427,427,427,427,427,427,427,427,427,427,427,427,427,427,427,427', +'427,427,427,427,427,427,,,,427,427,427,427,427,427,427,427,427,427,', +',,,,427,427,427,427,427,427,427,427,427,,,427,,,,,,,,427,427,,427,427', +'427,427,427,427,427,,,427,427,,,,427,427,427,427,,,,,,,,,,,,,,427,427', +',427,427,427,427,427,427,427,427,427,427,427,427,,,427,427,,,,,,,,,', +',,,,427,667,667,667,667,667,667,667,667,667,667,667,667,667,667,667', +'667,667,667,667,667,667,667,667,667,,,,667,667,667,667,667,667,667,667', +'667,667,,,,,,667,667,667,667,667,667,667,667,667,,,667,,,,,,,,667,667', +',667,667,667,667,667,667,667,,,667,667,,,,667,667,667,667,,,,,,,,,,', +',,,667,667,,667,667,667,667,667,667,667,667,667,667,667,667,,,667,667', +',,,,,,,,,,,,,667,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11', +'11,11,11,11,11,11,11,,,,11,11,11,11,11,11,11,11,11,11,,,,,,11,11,11', +'11,11,11,11,11,11,,,11,,,,,,,,11,11,,11,11,11,11,11,11,11,,,11,11,,', +',11,11,11,11,,,,,,,,,,,,,,11,11,,11,11,11,11,11,11,11,11,11,11,11,11', +',,11,11,,,,,,,,,,,,,,11,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26', +'26,26,26,26,26,26,26,26,26,,,,26,26,26,26,26,26,26,26,26,26,,,,,,26', +'26,26,26,26,26,26,26,26,26,26,26,,26,,,,,,26,26,,26,26,26,26,26,26,26', +',,26,26,,,,26,26,26,26,,,,,,26,,,,,,,,26,26,,26,26,26,26,26,26,26,26', +'26,26,26,26,,,26,753,753,753,753,,,,,,1026,,1026,1026,1026,1026,1026', +'753,753,753,753,,,,753,1026,,,,,753,753,,,753,,,,,,,,,,,,,1026,,,,,', +',753,,,753,1026,1026,,753,,1026,753,,,,,,,,,,,,,,,,753,,,,753,753,753', +'753,,753,753,753,753,,,,,753,753,1205,1205,1205,1205,1026,,753,,753', +'753,753,,,753,753,,1205,1205,1205,1205,,,1208,1205,1208,1208,1208,1208', +'1208,1205,1205,,,1205,,,,1208,,,,,,,,,,,,,,,,1205,,,1205,,,1208,1205', +',,1205,,,,,1208,1208,1208,1208,,,,1208,,,,1205,,,,1205,1205,1205,1205', +',1205,1205,1205,1205,,,,,1205,1205,1129,1129,1129,1129,,,1205,,1205', +'1205,1205,,,1205,1205,,1129,1129,1129,1129,,,1138,1129,1138,1138,1138', +'1138,1138,1129,1129,,,1129,,,,1138,,,,,,,,,,,,,,,,1129,,,1129,,,1138', +'1129,,,1129,,1129,,,1138,1138,1138,1138,,,,1138,,,,1129,,,,1129,1129', +'1129,1129,,1129,1129,1129,1129,,,,,1129,1129,989,989,989,989,,,1129', +',1129,1129,1129,,,1129,1129,,989,989,989,989,,,,989,989,,,,,989,989', +',,989,989,,,,,,,,,,,,,,,,,,,989,,,989,,,,989,,,989,,989,,,,,,,989,,', +',,,,989,,,,989,989,989,989,,989,989,989,989,,,,,989,989,942,942,942', +'942,,,989,,989,989,989,,,989,989,,942,942,942,942,,,1135,942,1135,1135', +'1135,1135,1135,942,942,,,942,,,,1135,,,,,,,,,,,,,,,,942,,,942,,,1135', +'942,,,942,,,,,1135,1135,1135,1135,,,,1135,,,,942,,,,942,942,942,942', +',942,942,942,942,,,,,942,942,924,924,924,924,,,942,,942,942,942,,,942', +'942,,924,924,924,924,,,1231,924,1231,1231,1231,1231,1231,924,924,,,924', +',,,1231,,,,,,,,,,,,,,,,924,,,924,,,1231,924,,,924,,924,,,,,1231,1231', +',,,1231,,,,924,,,,924,924,924,924,,924,924,924,924,,,,,924,924,745,745', +'745,745,,,924,,924,924,924,,,924,924,,745,745,745,745,,,,745,,,,,,745', +'745,,,745,,,,,,,,,,,,,,,,,,,,745,,,745,,,,745,,,745,,745,,,,,,,1166', +',1166,1166,1166,1166,1166,745,,,,745,745,745,745,1166,745,745,745,745', +',,,,745,745,745,943,943,943,943,,745,,745,745,745,1166,,745,745,,,943', +'943,943,943,,1166,1166,943,,,1166,,,943,943,,,943,,,,,,,,,,,,,,,,,,', +',943,,,943,,,,943,,,943,,,1166,,,,,,,,,,,,,943,,,,943,943,943,943,,943', +'943,943,943,,,,,943,943,930,930,930,930,,,943,,943,943,943,,,943,943', +',930,930,930,930,,,,930,930,,,,,930,930,,,930,930,,,,,,,,,,,,,,,,,,', +'930,,,930,,,,930,,,930,,930,,,,,,,930,,,,,,,930,,,,930,930,930,930,', +'930,930,930,930,,,,,930,930,929,929,929,929,,,930,,930,930,930,,,930', +'930,,929,929,929,929,,,,929,929,,,,,929,929,,,929,929,,,,,,,,,,,,,,', +',,,,929,,,929,,,,929,,,929,,929,,,,,,,929,,,,,,,929,,,,929,929,929,929', +',929,929,929,929,,,,,929,929,,,,,,,929,,929,929,929,,,929,929,780,780', +'780,780,780,780,780,780,780,780,780,780,780,780,780,780,780,780,780', +'780,780,780,780,780,,,,780,780,780,780,780,780,780,780,780,780,,,,,', +'780,780,780,780,780,780,780,780,780,,,780,,,,,,,,780,780,,780,780,780', +'780,780,780,780,,,780,780,,,,780,780,780,780,,,,,,,,,,,,,,780,780,,780', +'780,780,780,780,780,780,780,780,780,780,780,,,780,528,528,528,528,,', +'1212,,1212,1212,1212,1212,1212,,,,528,528,528,528,,1212,,528,528,,,', +',528,528,,,528,528,,,,,,,,,1212,,,,,,,,,,528,1212,1212,528,,,1212,528', +',,528,,528,,,,,,,528,,,,,,,528,,,,528,528,528,528,,528,528,528,528,', +',,,528,528,527,527,527,527,,,528,,528,528,528,,,528,528,,527,527,527', +'527,,,,527,527,,,,,527,527,,,527,527,,,,,,,,,,,,,,,,,,,527,,,527,,,', +'527,,,527,,527,,,,,,,527,,,,,,,527,,,,527,527,527,527,,527,527,527,527', +',,,,527,527,1173,1173,1173,1173,,,527,,527,527,527,,,527,527,,1173,1173', +'1173,1173,,,,1173,,,,,,1173,1173,,,1173,,,,,,,,,,,,,,,,,,,,1173,,,1173', +',,,1173,,,1173,,,,,,,,,,,,,,,,1173,,,,1173,1173,1173,1173,,1173,1173', +'1173,1173,,,,,1173,1173,1116,1116,1116,1116,,,1173,,1173,1173,1173,', +',1173,1173,,1116,1116,1116,1116,,,,1116,,,,,,1116,1116,,,1116,,,,,,', +',,,,,,,,,,,,,1116,,,1116,,,,1116,,,1116,,,,,,,,,,,,,,,,1116,,,,1116', +'1116,1116,1116,,1116,1116,1116,1116,,,,,1116,1116,926,926,926,926,,', +'1116,,1116,1116,1116,,,1116,1116,,926,926,926,926,,,,926,,,,,,926,926', +',,926,,,,,,,,,,,,,,,,,,,,926,,,926,,,,926,,,926,,,,,,,,,,,,,,,,926,', +',,926,926,926,926,,926,926,926,926,,,,,926,926,1125,1125,1125,1125,', +',926,,926,926,926,,,926,926,,1125,1125,1125,1125,,,,1125,,,,,,1125,1125', +',,1125,,,,,,,,,,,,,,,,,,,,1125,,,1125,,,,1125,,,1125,,,,,,,,,,,,,,,', +'1125,,,,1125,1125,1125,1125,,1125,1125,1125,1125,,,,,1125,1125,936,936', +'936,936,,,1125,,1125,1125,1125,,,1125,1125,,936,936,936,936,,,,936,', +',,,,936,936,,,936,,,,,,,,763,763,763,763,,,,,,,,,936,,,936,763,763,763', +'936,,,936,,936,,,,,763,763,,,763,,,,,936,,,,936,936,936,936,,936,936', +'936,936,,,,,936,936,,,,,,,936,,936,936,936,,,936,936,233,,233,233,233', +'233,233,,,,,763,763,763,763,233,763,763,763,763,,,,,763,763,950,950', +'950,950,,,763,,763,763,763,233,,,,,950,950,950,,233,233,233,233,,,,233', +',950,950,,,950,,,,,,,,,,,,705,,705,705,705,705,705,,,,,,,,,705,,,,,', +'234,233,234,234,234,234,234,,,,,,,,,234,705,950,950,950,950,,950,950', +'950,950,,705,705,,950,950,705,,,,,234,950,,950,950,950,,,,234,234,234', +'234,,,409,234,409,409,409,409,409,,1020,,1020,1020,1020,1020,1020,409', +',,,,705,,,1020,,644,,644,644,644,644,644,,,,,,409,409,,644,234,,,,1020', +'409,409,409,409,,,,409,1020,1020,1020,1020,,,,1020,644,,,,,,,,,644,644', +'644,644,,,1024,644,1024,1024,1024,1024,1024,,,,,,,,,1024,409,,,,,,,', +'1020,,,,,,,,,,,,,1024,,,,644,,,,,,,1024,1024,675,675,,1024,675,,,,,', +',,675,675,,675,675,675,675,675,675,675,,,675,675,,,,675,675,675,675', +',,,,,675,,,,,1024,,,675,675,,675,675,675,675,675,675,675,675,675,675', +'675,675,636,636,675,,636,,,,,,,,636,636,,636,636,636,636,636,636,636', +',,636,636,,,,636,636,636,636,,,,,,636,,,,,,,,636,636,,636,636,636,636', +'636,636,636,636,636,636,636,636,629,629,636,,629,,,,,,,,629,629,,629', +'629,629,629,629,629,629,,,629,629,,,,629,629,629,629,,,,,,629,,,,,,', +',629,629,,629,629,629,629,629,629,629,629,629,629,629,629,226,226,629', +',226,,,,,,,,226,226,,226,226,226,226,226,226,226,,,226,226,,,,226,226', +'226,226,,,,,,226,,,,,,,,226,226,,226,226,226,226,226,226,226,226,226', +'226,226,226,602,602,226,,602,,,,,,,,602,602,,602,602,602,602,602,602', +'602,,,602,602,,,,602,602,602,602,,,,,,602,,,,,,,,602,602,,602,602,602', +'602,602,602,602,602,602,602,602,602,637,637,602,,637,,,,,,,,637,637', +',637,637,637,637,637,637,637,,,637,637,,,,637,637,637,637,,,,,,637,', +',,,,,,637,637,,637,637,637,637,637,637,637,637,637,637,637,637,225,225', +'637,,225,,,,,,,,225,225,,225,225,225,225,225,225,225,,,225,225,,,,225', +'225,225,225,,,,,,225,,,,,,,,225,225,,225,225,225,225,225,225,225,225', +'225,225,225,225,302,302,225,,302,,,,,,,,302,302,,302,302,302,302,302', +'302,302,,,302,302,,,,302,302,302,302,,,,,,,,,,,,,,302,302,,302,302,302', +'302,302,302,302,302,302,302,302,302,519,519,302,,519,,,,,,,,519,519', +',519,519,519,519,519,519,519,,,519,519,,,,519,519,519,519,,,,,,519,', +',,,,,,519,519,,519,519,519,519,519,519,519,519,519,519,519,519,518,518', +'519,,518,,,,,,,,518,518,,518,518,518,518,518,518,518,,,518,518,,,,518', +'518,518,518,,,,,,518,,,,,,,,518,518,,518,518,518,518,518,518,518,518', +'518,518,518,518,591,591,518,,591,,,,,,,,591,591,,591,591,591,591,591', +'591,591,,,591,591,,,,591,591,591,591,,,,,,591,,,,,,,,591,591,,591,591', +'591,591,591,591,591,591,591,591,591,591,592,592,591,,592,,,,,,,,592', +'592,,592,592,592,592,592,592,592,,,592,592,,,,592,592,592,592,,,,,,592', +',,,,,,,592,592,,592,592,592,592,592,592,592,592,592,592,592,592,1163', +'1163,592,,1163,,,,,,,,1163,1163,,1163,1163,1163,1163,1163,1163,1163', +',,1163,1163,,,,1163,1163,1163,1163,,,,,,1163,,,,,,,,1163,1163,,1163', +'1163,1163,1163,1163,1163,1163,1163,1163,1163,1163,1163,674,674,1163', +',674,,,,,,,,674,674,,674,674,674,674,674,674,674,,,674,674,,,,674,674', +'674,674,,,,,,674,,,,,,,,674,674,,674,674,674,674,674,674,674,674,674', +'674,674,674,1164,1164,674,,1164,,,,,,,,1164,1164,,1164,1164,1164,1164', +'1164,1164,1164,,,1164,1164,,,,1164,1164,1164,1164,,,,,,1164,,,,,,,,1164', +'1164,,1164,1164,1164,1164,1164,1164,1164,1164,1164,1164,1164,1164,630', +'630,1164,,630,,,,,,,,630,630,,630,630,630,630,630,630,630,,,630,630', +',,,630,630,630,630,,,,,,630,,,,,,,,630,630,,630,630,630,630,630,630', +'630,630,630,630,630,630,1188,1188,630,,1188,,,,,,,,1188,1188,,1188,1188', +'1188,1188,1188,1188,1188,,,1188,1188,,,,1188,1188,1188,1188,,,,,,1188', +',,,,,,,1188,1188,,1188,1188,1188,1188,1188,1188,1188,1188,1188,1188', +'1188,1188,601,601,1188,,601,,,,,,,,601,601,,601,601,601,601,601,601', +'601,,,601,601,,,,601,601,601,601,,,,,,601,,,,,,,,601,601,,601,601,601', +'601,601,601,601,601,601,601,601,601,,,601' ] + racc_action_check = arr = ::Array.new(28717, nil) + idx = 0 + clist.each do |str| + str.split(',', -1).each do |i| + arr[idx] = i.to_i unless i.empty? + idx += 1 + end + end + +racc_action_pointer = [ + nil, 1550, 2590, 30, nil, 485, nil, 21057, 1279, -15, + 24908, 25292, 63, nil, 111, 130, 888, 195, 878, 334, + 213, 587, nil, -72, 16018, 1438, 25420, 260, nil, 586, + nil, 10, 7680, 8479, 8613, 9947, 10209, nil, 1870, 24507, + 23582, nil, 199, 495, 356, 292, 12722, 13115, 252, 13377, + 14041, 977, 19960, 226, 694, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 21341, nil, 15494, 15351, 14696, 170, + nil, 14434, 14303, nil, nil, 21200, 24638, 24114, 24769, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 877, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 610, nil, + nil, 722, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 20234, nil, nil, nil, nil, 20091, + 19567, 19436, 19305, 19174, nil, 4318, nil, -26, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 266, nil, 4462, 22788, + 21740, 21609, 14172, 13910, 13779, 27931, 27748, nil, nil, 264, + 2734, 305, nil, 27294, 27386, 317, 1294, 12043, 11912, 11257, + nil, nil, 1133, 138, 140, 432, 174, 389, 452, nil, + 10078, 131, 191, 3022, 455, nil, nil, 7277, 7146, 7015, + 6753, 6491, 6360, 6229, 6098, 5967, 18507, 18376, 18245, 17590, + 17459, 17328, 16411, 16149, 15756, 15220, 15089, 20639, 21478, nil, + nil, nil, nil, 13648, nil, nil, 583, 548, 381, -62, + 413, 376, 696, 695, 584, 585, nil, nil, nil, 15625, + nil, nil, 27992, nil, nil, 484, 16673, 17066, nil, nil, + nil, nil, nil, nil, nil, 17197, nil, 2446, nil, 455, + 459, nil, 17721, 512, 17852, nil, nil, 17983, 18114, nil, + nil, -73, nil, 5836, 1711, 509, 484, 1726, 513, 564, + 525, 23312, 2878, 999, 1139, 614, 617, 582, nil, 610, + 571, 253, 616, 644, nil, nil, nil, 650, 171, 611, + 23852, nil, 471, 1022, 3742, 3886, 687, nil, 691, 12591, + nil, 677, 2302, 1567, 638, nil, 541, 621, 676, 662, + 651, 690, nil, 870, 35, 36, 22133, 1006, 4894, 459, + 766, 651, 25, 39, 730, 747, 4, 793, nil, nil, + 1141, 1285, 370, nil, 692, nil, 714, 14827, nil, 27438, + nil, 531, 386, 291, 288, 421, 142, 191, 396, nil, + nil, nil, nil, nil, nil, nil, 713, 25036, nil, nil, + nil, nil, 726, nil, 798, 717, 14565, 725, nil, nil, + 715, nil, 690, -60, 819, nil, nil, 1582, nil, nil, + nil, nil, nil, 1870, 735, nil, 740, 749, 217, 251, + 21057, nil, nil, nil, 0, 861, 795, nil, nil, 20916, + 20780, 20508, 880, 882, nil, nil, 769, 775, 780, nil, + nil, 785, 787, 809, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 801, 1280, nil, nil, 19031, nil, nil, + nil, 1, nil, nil, nil, 899, nil, nil, 901, 579, + 22919, 951, nil, nil, nil, -26, nil, 885, 28114, 28053, + 22657, -85, 22526, 22395, 22264, 835, 853, 26710, 26612, 3454, + 5300, 814, 855, 936, 938, 947, 952, 5693, 5431, 5562, + 5169, 5038, 4894, 4750, 4606, 4462, 3482, 3568, 4318, 4174, + 2590, 4030, nil, 154, nil, 13518, nil, nil, nil, nil, + 13246, 889, 897, 901, nil, nil, nil, 902, nil, nil, + 12984, nil, 12853, nil, 12460, nil, 219, nil, nil, nil, + 12317, 1438, nil, 904, 909, nil, nil, 910, 23451, 916, + 12174, 28175, 28236, 995, 958, nil, nil, 24376, 929, nil, + 11781, 28602, 27809, 11650, 3598, 11388, nil, 1066, 947, 990, + nil, 11126, nil, nil, 10995, nil, nil, nil, 4030, 1075, + nil, 3742, 25, 1080, 1084, 37, 1086, 10733, 10602, 27687, + 28480, -5, nil, nil, 472, nil, 27626, 27870, 10340, nil, + nil, 191, 2014, nil, 27463, nil, nil, nil, nil, 1249, + nil, nil, nil, 977, nil, nil, 247, nil, 286, nil, + nil, 966, nil, 968, nil, nil, nil, 25164, nil, 9816, + 971, 9673, 9411, 9280, 28358, 27565, 9018, 8875, 733, 1011, + 8744, 8076, 7945, 7814, 1017, nil, nil, 7539, 7408, 1021, + nil, 1075, 1726, 1105, 6884, nil, nil, 1120, nil, nil, + 376, 13512, nil, 13482, nil, 27365, nil, 975, 6622, nil, + 1310, nil, 992, 997, 1057, 1002, nil, nil, nil, nil, + nil, nil, 1090, 2014, nil, nil, nil, 307, 332, 222, + 361, 1006, 5693, 5562, nil, 120, nil, nil, nil, nil, + 1029, nil, nil, nil, 555, 26091, 311, nil, 1007, 1092, + 1014, nil, nil, 25503, nil, nil, 375, nil, nil, 586, + nil, nil, 861, 27241, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 791, 464, nil, nil, 1016, + 26529, nil, 1148, nil, 1131, 4, nil, nil, 16280, nil, + 1046, 1053, 1154, nil, 1041, nil, 1088, 22002, nil, nil, + 21871, nil, 109, 23721, 1044, nil, 1048, -1, 233, 1103, + 249, 799, 1117, 1088, 24245, nil, 1156, 2158, 10864, nil, + nil, nil, 372, 876, nil, 1213, nil, nil, nil, nil, + nil, 1219, 1220, nil, nil, 6, 1101, -21, -19, 68, + 7, 1150, 997, 989, nil, 1103, 4606, 14958, nil, 1227, + 22, 1107, nil, nil, nil, nil, nil, 4750, nil, nil, + nil, nil, nil, nil, nil, nil, 1106, 15887, 1110, 387, + 385, 110, 500, nil, 2302, 16542, nil, 1110, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 16804, 16935, + 1236, nil, 3886, 1121, 1169, nil, nil, 1129, nil, 1212, + nil, nil, 1131, 1136, nil, 1141, 1143, nil, 1144, nil, + nil, nil, 1150, 1204, 507, nil, nil, 18638, 18769, 18900, + 5169, 5300, 5431, 333, 25993, 1231, 27004, -65, -35, 26386, + 26288, 480, -32, 1154, 1155, nil, 27200, nil, 1154, 747, + nil, 1178, 25895, 26190, nil, 929, 1243, 281, nil, nil, + 27339, 20916, nil, nil, nil, nil, 8207, nil, nil, nil, + nil, nil, 8338, nil, nil, 1227, nil, nil, 1237, 1224, + nil, nil, 429, 2446, nil, nil, nil, nil, 1227, 250, + nil, 137, nil, 1357, nil, 9149, 1361, nil, nil, 25797, + 9542, 5038, -18, 1362, nil, 1363, 369, 1582, nil, nil, + nil, nil, 1238, 1285, 1249, 1247, 304, nil, nil, 10471, + 3310, 3166, nil, 3166, nil, nil, -10, 23050, nil, nil, + 27446, nil, 497, nil, 27515, nil, 25493, nil, nil, nil, + nil, 1248, 1250, 3022, 2878, 11519, nil, 1251, nil, nil, + nil, nil, 1257, 1258, 1260, 1262, 1263, 1264, nil, nil, + nil, 1309, 1267, -39, nil, 1276, nil, nil, -66, 1275, + nil, nil, nil, nil, nil, nil, 1323, 2734, 2158, nil, + nil, 1285, 1286, nil, 1287, 1288, 1291, nil, 1316, 1296, + 1283, 23181, nil, nil, nil, nil, nil, 8, nil, 26, + 771, nil, 40, nil, nil, nil, 1420, 3454, 3310, 1136, + nil, nil, nil, 1438, 32, 33, 872, 1376, 34, nil, + 1302, 1312, 1313, 1314, 1348, 3584, 26906, nil, nil, nil, + nil, nil, nil, nil, 1317, 27102, nil, 145, nil, 25699, + nil, nil, 815, nil, nil, 25898, nil, nil, 25702, nil, + 13537, nil, nil, 1342, 23983, 763, 1397, 3598, nil, 19698, + 19829, nil, nil, nil, nil, 1341, 1454, 713, nil, nil, + nil, 1457, 20377, 28297, 28419, 69, 26144, nil, nil, nil, + nil, 1332, 1333, 26808, 1341, nil, nil, 1342, nil, nil, + 1361, 1365, 1382, 1385, nil, 1386, nil, 618, 28541, nil, + 973, 4174, nil, nil, nil, nil, nil, 1195, nil, 1392, + 76, 79, 109, 136, 1391, 25601, 1394, nil, 25604, nil, + 23629, nil, 26599, nil, 23359, nil, nil, 1439, 1442, nil, + 362, nil, 142, nil, 1399, 1401, 1404, 1409, nil, nil, + nil, 25996, nil, nil, nil, nil, -129, nil ] + +racc_action_default = [ + -1, -745, -4, -745, -2, -730, -5, -745, -8, -745, + -745, -745, -745, -31, -745, -745, -36, -745, -745, -639, + -639, -311, -52, -732, -745, -61, -745, -69, -70, -71, + -75, -287, -287, -287, -324, -352, -353, -87, -13, -91, + -99, -101, -745, -626, -627, -745, -745, -745, -745, -745, + -745, -239, -745, -732, -258, -302, -303, -304, -305, -306, + -307, -308, -309, -310, -718, -313, -317, -744, -707, -333, + -335, -745, -745, -63, -63, -730, -745, -745, -745, -354, + -355, -357, -358, -359, -360, -419, -563, -564, -565, -566, + -587, -569, -570, -589, -591, -574, -579, -583, -585, -601, + -602, -603, -587, -605, -607, -608, -609, -610, -716, -615, + -616, -717, -618, -619, -620, -621, -622, -623, -624, -625, + -630, -631, 1238, -3, -731, -740, -741, -742, -7, -745, + -745, -745, -745, -745, -9, -4, -19, -745, -130, -131, + -132, -133, -134, -135, -136, -140, -141, -142, -143, -144, + -145, -146, -147, -148, -149, -150, -151, -152, -153, -154, + -155, -156, -157, -158, -159, -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, -24, -137, -13, -745, + -745, -745, -745, -745, -277, -745, -745, -728, -729, -745, + -13, -638, -636, -662, -662, -745, -13, -745, -745, -732, + -733, -56, -745, -626, -627, -745, -311, -745, -745, -245, + -745, -639, -639, -13, -745, -57, -59, -222, -223, -745, + -745, -745, -745, -745, -745, -745, -745, -745, -745, -745, + -745, -745, -745, -745, -745, -745, -745, -745, -745, -259, + -260, -261, -262, -745, -65, -66, -745, -130, -131, -170, + -171, -172, -188, -193, -200, -203, -626, -627, -705, -745, + -428, -430, -745, -726, -727, -76, -277, -745, -332, -434, + -443, -445, -82, -440, -83, -732, -84, -265, -282, -292, + -292, -286, -290, -293, -745, -587, -709, -713, -745, -85, + -86, -730, -14, -745, -17, -745, -89, -13, -732, -745, + -92, -95, -13, -107, -108, -745, -745, -115, -324, -327, + -732, -745, -639, -639, -352, -353, -356, -441, -745, -97, + -745, -103, -321, -745, -224, -225, -606, -233, -234, -745, + -246, -251, -13, -315, -732, -266, -737, -737, -745, -745, + -737, -745, -334, -62, -745, -745, -745, -13, -13, -730, + -745, -731, -626, -627, -745, -745, -311, -745, -370, -371, + -125, -126, -745, -128, -745, -311, -634, -745, -348, -662, + -567, -745, -745, -745, -745, -745, -745, -745, -745, -6, + -743, -25, -26, -27, -28, -29, -745, -745, -21, -22, + -23, -138, -745, -32, -35, -298, -745, -745, -297, -33, + -745, -37, -745, -311, -49, -51, -211, -270, -293, -53, + -54, -38, -212, -270, -732, -278, -292, -292, -719, -720, + -287, -438, -721, -722, -720, -719, -287, -437, -439, -721, + -722, -745, -555, -745, -383, -384, -732, -704, -704, -644, + -645, -647, -647, -647, -661, -663, -664, -665, -666, -667, + -668, -669, -670, -671, -745, -673, -675, -677, -682, -684, + -685, -688, -693, -695, -696, -698, -699, -700, -702, -745, + -745, -745, -48, -219, -55, -732, -331, -745, -745, -745, + -277, -321, -745, -745, -745, -745, -745, -745, -745, -220, + -221, -226, -227, -228, -229, -230, -231, -235, -236, -237, + -238, -240, -241, -242, -243, -244, -247, -248, -249, -250, + -732, -263, -67, -732, -449, -287, -719, -720, -73, -77, + -663, -732, -292, -732, -288, -447, -449, -732, -326, -283, + -745, -284, -745, -289, -745, -294, -745, -712, -715, -12, + -731, -16, -18, -732, -88, -319, -104, -93, -745, -732, + -277, -745, -745, -114, -745, -638, -606, -745, -100, -105, + -745, -745, -745, -745, -264, -745, -328, -745, -732, -745, + -267, -739, -738, -269, -739, -322, -323, -708, -13, -361, + -362, -13, -745, -745, -745, -745, -745, -745, -277, -745, + -745, -321, -63, -125, -126, -127, -745, -745, -277, -344, + -632, -745, -13, -420, -662, -423, -568, -588, -593, -745, + -595, -571, -590, -745, -592, -573, -745, -576, -745, -578, + -581, -745, -582, -745, -604, -10, -20, -745, -30, -745, + -301, -745, -745, -277, -745, -745, -745, -745, -442, -745, + -279, -281, -745, -745, -78, -276, -435, -745, -745, -80, + -436, -44, -254, -744, -744, -350, -637, -745, -642, -643, + -745, -745, -654, -745, -657, -745, -659, -745, -745, -372, + -745, -374, -376, -379, -382, -732, -676, -686, -687, -697, + -701, -640, -46, -256, -351, -330, -734, -719, -720, -719, + -720, -732, -745, -745, -58, -463, -466, -467, -468, -469, + -471, -473, -476, -477, -534, -732, -489, -492, -504, -508, + -513, -515, -516, -519, -520, -587, -523, -525, -526, -527, + -532, -533, -745, -745, -537, -538, -539, -540, -541, -542, + -543, -544, -545, -546, -547, -745, -745, -553, -60, -745, + -745, -706, -745, -450, -72, -431, -447, -272, -279, -274, + -745, -409, -745, -325, -292, -291, -295, -745, -710, -711, + -745, -15, -90, -745, -96, -102, -732, -719, -720, -275, + -723, -113, -745, -98, -745, -218, -232, -252, -745, -314, + -316, -318, -737, -744, -363, -744, -64, -364, -365, -338, + -339, -745, -745, -455, -341, -745, -732, -719, -720, -723, + -320, -13, -125, -126, -129, -732, -13, -745, -346, -745, + -745, -732, -594, -597, -598, -599, -600, -13, -572, -575, + -577, -580, -584, -586, -139, -34, -299, -745, -732, -719, + -720, -720, -719, -50, -271, -745, -735, -292, -40, -214, + -41, -215, -79, -42, -217, -43, -216, -81, -745, -745, + -744, -368, -13, -556, -744, -557, -558, -704, -683, -688, + -703, -646, -647, -647, -674, -647, -647, -694, -647, -671, + -386, -689, -732, -745, -745, -381, -672, -745, -745, -745, + -745, -745, -745, -442, -464, -745, -745, -474, -475, -745, + -745, -745, -494, -732, -732, -488, -495, -501, -745, -745, + -491, -745, -745, -745, -507, -514, -518, -745, -522, -524, + -530, -531, -535, -536, -548, -549, -745, -611, -612, -613, + -126, -551, -745, -68, -429, -409, -433, -432, -745, -732, + -444, -410, -732, -13, -446, -285, -296, -714, -94, -442, + -106, -732, -268, -745, -366, -745, -745, -340, -342, -745, + -745, -13, -442, -745, -442, -745, -745, -13, -349, -421, + -424, -426, -413, -745, -745, -300, -442, -39, -213, -280, + -45, -255, -11, -13, -562, -369, -745, -745, -560, -641, + -745, -650, -745, -652, -745, -655, -745, -658, -660, -373, + -375, -377, -380, -47, -257, -745, -465, -504, -470, -472, + -481, -485, -732, -732, -732, -732, -732, -732, -552, -486, + -487, -511, -496, -499, -502, -732, -587, -736, -732, -505, + -509, -512, -517, -521, -528, -529, -745, -253, -13, -74, + -273, -704, -704, -390, -392, -392, -392, -408, -745, -732, + -671, -679, -680, -691, -448, -329, -336, -745, -337, -745, + -460, -295, -744, -343, -345, -633, -745, -13, -13, -745, + -422, -596, -561, -13, -626, -627, -745, -745, -311, -559, + -647, -647, -647, -647, -745, -745, -745, -478, -479, -480, + -482, -483, -484, -503, -497, -745, -490, -745, -493, -745, + -550, -451, -745, -388, -389, -393, -399, -401, -745, -404, + -745, -406, -411, -745, -745, -678, -745, -13, -456, -745, + -745, -452, -453, -454, -347, -745, -745, -732, -415, -417, + -418, -555, -277, -745, -745, -321, -745, -648, -651, -653, + -656, -378, -505, -745, -500, -506, -510, -704, -681, -391, + -392, -392, -392, -392, -692, -392, -412, -690, -745, -321, + -744, -13, -461, -462, -425, -427, -414, -745, -554, -732, + -719, -720, -723, -320, -647, -745, -498, -387, -745, -396, + -745, -398, -745, -402, -745, -405, -407, -320, -723, -367, + -744, -416, -442, -649, -392, -392, -392, -392, -457, -458, + -459, -745, -394, -397, -400, -403, -392, -395 ] + +clist = [ +'44,411,301,309,313,44,141,141,318,318,318,340,285,418,454,493,493,284', +'382,384,385,473,141,389,297,19,626,511,709,832,19,693,460,466,356,356', +'44,344,344,635,127,698,699,571,225,618,621,339,563,702,704,706,144,144', +'890,303,708,598,897,241,983,19,352,352,44,134,387,388,366,136,217,356', +'356,356,393,297,297,421,422,423,424,798,232,232,305,312,314,907,8,19', +'795,445,795,8,445,302,561,678,940,352,352,352,359,734,778,737,737,790', +'445,555,127,124,438,439,1003,451,383,383,236,559,383,715,44,798,610', +'613,1160,1059,617,512,375,44,904,44,1158,484,484,756,756,123,229,235', +'336,1037,4,476,509,19,320,320,320,1030,373,973,1032,1184,19,1075,19', +'1016,782,128,2,607,656,658,17,1012,338,1044,1047,17,792,801,383,383', +'383,383,216,1055,571,377,380,933,595,595,986,399,516,434,798,493,934', +'406,408,427,527,461,318,528,795,795,17,826,952,953,286,780,786,390,8', +'667,652,654,657,657,44,369,605,425,378,8,470,785,1160,1184,298,432,44', +'379,17,397,1221,639,44,1078,576,372,608,374,818,19,846,19,709,997,19', +'642,915,1031,1077,44,1136,19,433,444,1079,1157,444,19,19,831,339,903', +'568,905,449,450,518,319,319,319,444,844,643,999,19,426,419,409,318,318', +'850,514,515,804,1097,584,17,318,1098,554,565,566,813,965,1151,17,1089', +'17,1172,1228,376,989,1191,1038,1039,899,795,1174,731,484,303,929,232', +'232,316,329,330,930,1180,645,939,309,942,460,466,1068,968,313,1061,44', +'599,1062,622,44,356,912,955,344,44,894,1143,1,553,410,339,412,1175,413', +'236,339,552,1030,1171,356,19,1206,344,414,19,415,1036,416,352,19,127', +'1042,1045,417,44,591,525,526,923,852,1043,1046,596,857,806,847,17,352', +'17,44,44,17,935,601,902,582,1064,1065,17,19,623,624,809,898,17,17,1178', +'587,907,,,1126,809,,19,19,,961,,,,17,836,581,629,320,,141,127,696,493', +'1219,845,320,,383,685,849,,,809,580,690,,,336,,,809,691,336,709,709', +'979,,236,641,1152,437,437,860,904,860,,,1019,,868,725,579,,583,674,144', +'1021,1023,589,1025,1027,,1028,,,992,,460,466,493,722,493,666,,994,,461', +',,1177,318,,991,17,882,,978,17,781,887,,,17,238,,,787,1006,789,684,452', +'470,793,975,798,689,,,,625,,772,772,685,513,795,969,,802,,1076,,17,371', +'805,756,756,562,319,445,721,,484,,,756,319,17,17,445,445,756,851,820', +'445,445,599,735,735,461,318,1090,904,737,1048,599,982,1041,,461,878', +'880,1049,1050,44,883,885,1229,1110,356,1052,,344,895,470,564,,1060,356', +',,344,,567,470,756,975,461,318,19,,,,,784,461,,352,318,,,,44,,,44,352', +',,,1230,841,470,823,,,825,,470,,,1133,1134,995,,,44,19,,1144,19,904', +'461,318,709,709,,,,,,,,827,,,,,,141,916,19,947,44,,,900,470,,900,44', +',848,1103,1167,1168,1169,1170,,,794,,,,1120,1121,1122,,19,,,19,,1181', +',19,1182,,,,,19,19,444,,144,19,19,,,,,,444,444,,1198,,444,444,,822,864', +',1153,,,,,,967,,,,,,,1207,899,772,17,,445,,1147,,1148,772,,,1080,865', +',896,,966,772,772,873,,1060,,963,1007,,,1224,284,1223,1060,,599,141', +'1176,,932,,685,17,,690,17,980,946,1096,,,,,,877,996,,,356,,,344,493', +',,,17,,,356,,,344,513,,452,,,,,,1060,,,,,352,,,,,1072,,17,594,,17,352', +',44,17,,1222,,44,,17,17,,,993,17,17,1176,,44,,,609,1131,,1029,835,981', +'19,,1004,,,19,,,,,,,1040,,,,19,,,,,,,,,1156,44,815,383,,,,,,19,,,1015', +'877,,1066,,,,,,444,,,,,19,,1080,1070,,1080,,772,,772,,,772,772,437,1085', +',,1087,772,,,,679,,772,772,,,,1073,,,772,772,,,1199,1014,,,,1018,932', +',,,,932,932,,,1127,,,809,44,,879,881,,1058,,884,886,,,1084,,,,,772,', +'44,1080,1117,1118,1119,1072,44,19,1072,,1072,1092,383,,,,17,,1128,,', +'17,44,356,,19,1105,,,,31,19,17,1102,735,31,,,,,,383,1095,,,779,,19,', +',17,352,31,,,,,,,,,,31,31,31,,31,17,,,,,,,,,,44,1072,,1072,,1072,,1072', +',,356,,,297,,,,31,,,,,31,31,1072,19,31,,,44,44,1192,1193,,,44,,,352', +'900,1155,,1073,,,1073,1161,1073,772,,906,,908,,19,19,,772,,,19,772,', +',,,1163,,,461,318,17,,356,,31,297,765,765,44,31,31,31,31,31,,31,,,17', +'1190,,,,470,17,,,,,1008,352,,,19,772,,,,,,17,,,,1073,,1073,470,1073', +',1073,,44,,,,,383,383,,,,,1220,,1081,772,1073,,,,,,879,881,886,884,19', +'679,,,,,,,,,,,,,,679,941,,17,,,31,31,31,31,31,31,31,,,,,,31,,,,,,31', +'31,31,31,,,,,17,17,381,18,,,17,,18,31,,,,,,,,,,,,,,,,242,,,,679,,,,', +',242,242,242,,18,345,345,,,,,,,,,17,,,,,31,,,,679,,,31,31,,1008,,18', +'679,,,31,242,242,1002,,242,394,404,404,,,1137,1139,1141,,,,,31,,679', +',31,17,,,,31,,765,1081,,,1081,,,1081,765,1081,,,,,,764,764,765,765,', +',,,,1074,18,,,31,,242,242,242,242,18,,18,,,,,,31,31,31,,,,,,,679,,435', +'448,,679,679,,,,,,31,,,,,,,,,1111,,1112,,1113,1081,,1081,,1081,,1081', +',,,,1209,1211,1213,1215,,1216,,1002,,,,,1081,,,,,,,,,,,,,,,,,,,18,242', +'442,242,242,442,242,,31,,,,18,1232,1233,1234,1235,,18,442,242,242,,', +',1237,,,,,,,,,,18,,573,,575,,,577,578,,,,31,,679,679,679,,,,,,31,,941', +'765,,765,,,765,765,,,,,1183,765,1185,,,,,765,765,,242,,1002,,,765,765', +'242,242,,,,,,,,242,,1204,,,,,,,,,,,,,,,764,18,,31,,18,,,764,345,18,765', +',31,,,,764,764,,,,,,,,,1225,345,1226,,1227,,20,,,,670,20,,18,31,,,31', +',,1196,,,1236,31,,,242,18,18,,,,,31,,,,31,,,,20,353,353,,,,242,,,,,', +',,,,,,,,679,,,31,,,31,31,20,716,31,,,,,,31,31,353,353,353,31,31,,,,', +',,,,,,,,,,,,,,,,,,,,,,765,242,,,,,,,,765,,,,765,,,,20,,,,,,,,,20,,20', +',,,,796,,381,,799,,,242,764,,764,,,764,764,,,242,,,764,,,,765,,764,764', +',,,,,,764,764,,,,,,796,,,381,,,,,,,,,,,,765,448,,,,,,,,,,,,,31,,,764', +',,,18,20,,20,,,20,,345,,242,,,20,,,31,345,,20,20,31,31,,866,,,,,,,,31', +'796,381,,20,,18,,,18,,,,,,893,242,,31,,,,,,,,242,,,911,18,,,,,31,,,', +',,,,,,,,,,,,,,,,,,18,,,442,242,,,18,,,,,,442,442,,,,442,442,,,,,,,,20', +',,,20,,,764,353,20,,,,,,31,764,,,,764,,,,,796,,353,,,,,31,,976,,,977', +',20,,,,,31,,,,,,31,,,,20,20,31,,,,,,,,764,,,,,,,,31,,,,,,,,,,,,,,,,', +',,,,,,,764,,,,,,,,1005,,,345,,,,,15,,,,,15,345,,,,242,,,,,31,,,,,,,', +',,,,,,,,,,18,,,15,,18,242,,,,,31,31,,,,18,31,,,21,,,,,21,,,,,,15,,,442', +',,,,,,398,773,773,,,,,,,,18,,,,,21,347,347,,,31,,31,31,,,,,,,,,,,,31', +',,,,,1091,,21,,,,,15,,,,,396,405,405,,15,,15,381,20,,,31,,,,,353,,,', +',242,,,,353,,,,,,,,,,,,,18,,,,,,,,20,,21,20,242,,,771,771,,18,21,,21', +',,18,,,,,,,,20,,,,,,,,18,,,,1106,,,,,,,15,,440,,,440,,,20,,,20,15,,', +'20,,,15,440,,20,20,,,,20,20,,,,,,,,15,,,,,,,,,18,,,,,,,,,21,,443,,1145', +'443,,,,,,,21,,,,,,21,443,18,18,,,773,,18,,,,,,773,,,21,,,,,,773,773', +',770,770,,,,,,,,,,,,,,,,,15,,,,15,1187,,,18,15,242,242,,,,,,,,,,,,242', +',,,353,,,,,,,,,,,353,15,,,,,,,,,,,,,18,21,15,15,,21,,,,347,21,,,20,', +'771,,,20,,,,,771,,,,,347,20,,,771,771,,,,,,,21,,,,,,,20,43,,,,,43,,21', +'21,,,,,,,,20,,,,,,,,296,,,,,,,,,,,,43,343,343,,,773,,773,,,773,773,', +',,,,773,,,,,,773,773,,,,43,,,773,773,,,,,,392,296,296,,,,,,,,,,,,,,', +',,,769,769,,20,,,770,,,,,,773,,770,,,,,,,20,,770,770,,,20,43,,,,,,,', +',43,,43,,,,20,,768,768,353,,,,,771,15,771,,,771,771,,,,,,771,,,,,,771', +'771,,,,,,,771,771,,,,,,,,,,,,15,,,15,,,,20,,,,,,,,21,,,,,353,,,347,15', +',771,,,,,43,347,,,,20,20,,,,,20,43,767,767,,,773,43,,15,,21,440,,21', +'773,15,,,773,,,440,440,43,,,440,440,,,,,,,21,,,,,,353,856,,20,,,,,,', +',770,,770,,,770,770,,,,21,773,770,443,,,,21,770,770,,,,443,443,,770', +'770,443,443,,,,769,,,20,,,,,769,,773,,,,,,,769,769,43,,,,43,,,771,343', +'43,,,,770,,,771,,,,771,,,,,,768,343,,,,,,,768,,,,,43,,,,768,768,,,,', +',,,,,43,43,,,,,,,,,771,,,,,,,,,,,,,15,,,,,15,,,,,,,,,,347,15,,,771,', +',,,,,347,,,,,,,,440,,,,,767,,,,,,,,767,,,,15,,21,,,767,767,21,,,,,770', +',,,,,21,,,770,,,,770,,,,,,,769,,769,,443,769,769,,,,,,769,,,,,,769,769', +',21,,,,,769,769,,,,,,,,,,770,,766,766,,,,,768,,768,,15,768,768,,,,,', +'768,,,,,,768,768,769,,15,,770,,768,768,15,,,,,,,,,,,,,,43,,15,,,,1109', +',343,,,,,,,21,,343,,,,,,768,,,,,,,,,,21,,,,,43,21,,43,,,,,,,767,,767', +',,767,767,21,,15,,1108,767,,43,,,,767,767,34,,,,,34,767,767,,,,,,,,', +',,15,15,,43,34,,15,,,,43,,,,34,34,34,,34,769,,,,,21,,,767,769,,,,769', +',,,,405,,,,,,,,,34,,,,15,34,34,21,21,34,,,,21,,,,,768,,,,,,,,,768,,', +'769,768,,,,,,,766,,,,,,,,766,,15,,,,,,405,766,766,21,34,,,,769,34,34', +'34,34,34,,34,,,,,,768,,,,,,,,,,,,,,,,343,,,,,,,,,,21,343,,,,,768,767', +',,,,,,,,767,,,,767,,,,,,,,43,,,,,43,,,,,,,,,,,43,,,,,,,34,34,34,34,34', +'34,34,,,,,,34,767,,,,,34,34,34,34,,,,,,,43,,,,,,,34,,,,,,,,,,767,,,', +',,,,,,,,,,,,,,,,766,,766,,,766,766,,,,,,766,,,,34,,766,766,,,,34,34', +',766,766,,,,,34,,,,,,,,,,,,43,,,,,,34,,,,34,,,,,34,,,43,,,766,,,43,', +',,,,,,,,,,,,,,43,,,,1104,34,,,,,,,,,,,,,,34,34,34,,,,,,,,,,,,,,,,,,', +'34,,,,,,,,,,,,,,,43,,,,,,,,,,,,,296,,,,,,,,,,,,,,,,43,43,,,,,43,,,,', +',,,,,,249,,,34,,,,766,,,317,317,317,,,,766,,,,766,,364,365,,367,368', +',370,,296,,,43,,,,,,,,,34,317,317,,,,,,,,34,,,,,,,,,,,,766,,,,,,,,,', +',,,43,,,,,,,,,,,,,,,,,,,766,,,,,,,,,,,,,,,,34,,,,,,,,,,34,,,,,,,,,,', +',,,,,,,,,,,,,,,,,34,,,34,,,,,,,34,,,,,,,,,,34,,,,34,,,,,,,,,,,,,,,,', +',,,,317,447,,,453,317,34,,,34,34,,,34,,,,,453,34,34,,,,34,34,,,,,,249', +',,,,,,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544', +'545,546,547,548,549,550,,,,,551,,,,,,,,,,,,,,,,,,,,,,,317,317,,,,,,', +',317,,,,,,,317,,317,,,317,317,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,', +',,604,,,,,34,,,,,,,,,,,,,,,,,,,,,,,34,,,,,34,34,,,,,,,,,,34,,,,,,,,', +',,,,,,,,,34,,,,,317,,,,,,,,,,,,34,,,,,,,,,,,,,,,,,,,,,,,692,,,,,,,,', +',,,,,,,,,,,,,,,,,317,,,,,,,,,,,,,723,,34,,,,,,,,317,,453,453,453,,,', +',34,,,,,,,,,,,,34,,,,,,34,,,,,,34,,,,,,,365,,,,,,,,,34,317,,317,,317', +',,,,,,,,,,,,,,,317,,,,,,,,,,453,,,816,,817,,,,,,317,,,317,,,,,,,,,,34', +',,317,317,,,,,,,,,,317,,,,,,,,,,,,,,,34,34,,,,,34,,,,,,,,,,,,317,453', +'317,,,,874,,,317,317,453,453,,,,453,453,,,,,,317,,,,,,,,,34,,34,34,', +'317,,,,,,,,,,34,,,,,,,,,,,,,,692,723,,,,,,,,,,,,,,34,,,,,,,,,,,,,,,', +',,,,,,,,,,,,,,,,,,,,,,,,,317,,,,,,,,,317,,,317,,,,,,,,,,,,,,,,,,,,,', +',,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,317,,,,,,,,453,,,,,,,,', +',,,,1010,1011,,,,,,,,,,,,,,,,,,,,,,,,,,,,1033,1034,453,453,453,453,', +',,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1067,,,,,,,,,,,,,,,,,,,,,,,,,', +',,317,,,,,,,,,,,,,,,,,,,317,,,,,,,,,,,,,,,,,,,,,,,,,,453,,,,,,,,,,,', +',,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,', +',,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,317' ] + racc_goto_table = arr = ::Array.new(4752, nil) + idx = 0 + clist.each do |str| + str.split(',', -1).each do |i| + arr[idx] = i.to_i unless i.empty? + idx += 1 + end + end + +clist = [ +'72,198,158,91,91,72,75,75,36,36,36,68,46,198,31,230,230,48,107,19,19', +'10,75,19,72,34,112,10,128,113,34,12,55,55,82,82,72,72,72,73,117,139', +'139,94,33,110,110,11,92,228,228,228,77,77,13,33,135,70,133,22,111,34', +'34,34,72,9,44,44,80,17,17,82,82,82,72,72,72,19,19,19,19,239,87,87,56', +'56,56,235,8,34,95,20,95,8,20,51,31,32,187,34,34,34,69,41,41,177,177', +'58,20,55,117,7,24,24,149,28,26,26,119,57,26,129,72,239,89,89,152,192', +'89,28,87,72,231,72,151,225,225,200,200,5,35,35,64,193,2,157,157,34,90', +'90,90,127,8,147,130,236,34,145,34,207,161,6,3,10,214,214,29,14,65,178', +'178,29,161,16,26,26,26,26,18,178,94,90,90,175,224,224,13,21,66,25,239', +'230,176,74,74,27,42,91,36,43,95,95,29,45,202,202,50,52,60,5,8,78,215', +'215,215,215,72,83,84,8,86,8,75,93,152,236,105,11,72,106,29,114,151,116', +'72,149,198,120,121,122,123,34,124,34,128,125,34,126,128,131,136,72,142', +'34,22,22,143,150,22,34,34,112,11,146,66,146,26,26,33,88,88,88,22,73', +'153,154,34,2,6,155,36,36,156,26,26,70,159,66,29,36,160,162,164,165,70', +'168,169,29,170,29,192,171,88,172,173,180,182,200,95,192,31,225,33,183', +'87,87,63,63,63,184,145,157,188,91,189,55,55,147,58,91,195,72,68,196', +'19,72,82,129,205,72,72,206,149,1,26,210,11,211,193,212,119,11,51,127', +'130,82,34,192,72,213,34,216,175,217,34,34,117,175,175,218,72,33,35,35', +'32,219,176,176,80,220,31,223,29,34,29,72,72,29,32,33,229,9,202,202,29', +'34,11,11,55,233,29,29,234,69,235,,,187,55,,34,34,,73,,,,29,31,8,33,90', +',75,117,66,230,111,31,90,,26,91,10,,,55,7,91,,,64,,,55,36,64,128,128', +'32,,119,26,13,88,88,215,231,215,,,139,,31,66,5,,65,33,77,228,228,65', +'228,228,,228,,,32,,55,55,230,36,230,17,,32,,91,,,133,36,,110,29,57,', +'70,29,66,57,,,29,40,,,66,32,66,56,79,75,66,94,239,56,,,,5,,72,72,91', +'79,95,92,,66,,146,,29,40,66,200,200,88,88,20,117,,225,,,200,88,29,29', +'20,20,200,157,66,20,20,68,174,174,91,36,41,231,177,73,68,89,32,,91,28', +'28,32,32,72,28,28,13,146,82,191,,72,24,75,63,,191,82,,,72,,63,75,200', +'94,91,36,34,,,,,56,91,,34,36,,,,72,,,72,34,,,,113,44,75,11,,,11,,75', +',,139,139,10,,,72,34,,135,34,231,91,36,128,128,,,,,,,,117,,,,,,75,66', +'34,198,72,,,140,75,,140,72,,117,110,228,228,228,228,,,90,,,,32,32,32', +',34,,,34,,146,,34,146,,,,,34,34,22,,77,34,34,,,,,,22,22,,12,,22,22,', +'90,17,,112,,,,,,107,,,,,,,139,200,72,29,,20,,110,,110,72,,,230,8,,87', +',158,72,72,8,,191,,46,28,,,146,48,228,191,,68,75,191,,174,,91,29,,91', +'29,68,174,10,,,,,,90,19,,,82,,,72,230,,,,29,,,82,,,72,79,,79,,,,,,191', +',,,,34,,,,,132,,29,40,,29,34,,72,29,,32,,72,,29,29,,,11,29,29,191,,72', +',,40,10,,66,88,26,34,,11,,,34,,,,,,,66,,,,34,,,,,,,,,10,72,79,26,,,', +',,34,,,11,90,,19,,,,,,22,,,,,34,,230,66,,230,,72,,72,,,72,72,88,66,', +',19,72,,,,40,,72,72,,,,140,,,72,72,,,31,87,,,,87,174,,,,,174,174,,,198', +',,55,72,,79,79,,174,,79,79,,,11,,,,,72,,72,230,66,66,66,132,72,34,132', +',132,11,26,,,,29,,66,,,29,72,82,,34,72,,,,59,34,29,11,174,59,,,,,,26', +'117,,,40,,34,,,29,34,59,,,,,,,,,,59,59,59,,59,29,,,,,,,,,,72,132,,132', +',132,,132,,,82,,,72,,,,59,,,,,59,59,132,34,59,,,72,72,19,19,,,72,,,34', +'140,11,,140,,,140,11,140,72,,144,,144,,34,34,,72,,,34,72,,,,,33,,,91', +'36,29,,82,,59,72,98,98,72,59,59,59,59,59,,59,,,29,11,,,,75,29,,,,,79', +'34,,,34,72,,,,,,29,,,,140,,140,75,140,,140,,72,,,,,26,26,,,,,11,,232', +'72,140,,,,,,79,79,79,79,34,40,,,,,,,,,,,,,,40,40,,29,,,59,59,59,59,59', +'59,59,,,,,,59,,,,,,59,59,59,59,,,,,29,29,85,30,,,29,,30,59,,,,,,,,,', +',,,,,,30,,,,40,,,,,,30,30,30,,30,30,30,,,,,,,,,29,,,,,59,,,,40,,,59', +'59,,79,,30,40,,,59,30,30,40,,30,30,30,30,,,141,141,141,,,,,59,,40,,59', +'29,,,,59,,98,232,,,232,,,232,98,232,,,,,,97,97,98,98,,,,,,144,30,,,59', +',30,30,30,30,30,,30,,,,,,59,59,59,,,,,,,40,,85,85,,40,40,,,,,,59,,,', +',,,,,144,,144,,144,232,,232,,232,,232,,,,,141,141,141,141,,141,,40,', +',,,232,,,,,,,,,,,,,,,,,,,30,30,30,30,30,30,30,,59,,,,30,141,141,141', +'141,,30,30,30,30,,,,141,,,,,,,,,,30,,85,,85,,,85,85,,,,59,,40,40,40', +',,,,,59,,40,98,,98,,,98,98,,,,,144,98,144,,,,,98,98,,30,,40,,,98,98', +'30,30,,,,,,,,30,,144,,,,,,,,,,,,,,,97,30,,59,,30,,,97,30,30,98,,59,', +',,97,97,,,,,,,,,144,30,144,,144,,38,,,,85,38,,30,59,,,59,,,40,,,144', +'59,,,30,30,30,,,,,59,,,,59,,,,38,38,38,,,,30,,,,,,,,,,,,,,40,,,59,,', +'59,59,38,85,59,,,,,,59,59,38,38,38,59,59,,,,,,,,,,,,,,,,,,,,,,,,,,,98', +'30,,,,,,,,98,,,,98,,,,38,,,,,,,,,38,,38,,,,,85,,85,,85,,,30,97,,97,', +',97,97,,,30,,,97,,,,98,,97,97,,,,,,,97,97,,,,,,85,,,85,,,,,,,,,,,,98', +'85,,,,,,,,,,,,,59,,,97,,,,30,38,,38,,,38,,30,,30,,,38,,,59,30,,38,38', +'59,59,,85,,,,,,,,59,85,85,,38,,30,,,30,,,,,,85,30,,59,,,,,,,,30,,,85', +'30,,,,,59,,,,,,,,,,,,,,,,,,,,,,30,,,30,30,,,30,,,,,,30,30,,,,30,30,', +',,,,,,38,,,,38,,,97,38,38,,,,,,59,97,,,,97,,,,,85,,38,,,,,59,,85,,,85', +',38,,,,,59,,,,,,59,,,,38,38,59,,,,,,,,97,,,,,,,,59,,,,,,,,,,,,,,,,,', +',,,,,,97,,,,,,,,85,,,30,,,,,23,,,,,23,30,,,,30,,,,,59,,,,,,,,,,,,,,', +',,,30,,,23,,30,30,,,,,59,59,,,,30,59,,,39,,,,,39,,,,,,23,,,30,,,,,,', +'23,109,109,,,,,,,,30,,,,,39,39,39,,,59,,59,59,,,,,,,,,,,,59,,,,,,85', +',39,,,,,23,,,,,39,39,39,,23,,23,85,38,,,59,,,,,38,,,,,30,,,,38,,,,,', +',,,,,,,30,,,,,,,,38,,39,38,30,,,104,104,,30,39,,39,,,30,,,,,,,,38,,', +',,,,,30,,,,30,,,,,,,23,,23,,,23,,,38,,,38,23,,,38,,,23,23,,38,38,,,', +'38,38,,,,,,,,23,,,,,,,,,30,,,,,,,,,39,,39,,30,39,,,,,,,39,,,,,,39,39', +'30,30,,,109,,30,,,,,,109,,,39,,,,,,109,109,,103,103,,,,,,,,,,,,,,,,', +'23,,,,23,30,,,30,23,30,30,,,,,,,,,,,,30,,,,38,,,,,,,,,,,38,23,,,,,,', +',,,,,,30,39,23,23,,39,,,,39,39,,,38,,104,,,38,,,,,104,,,,,39,38,,,104', +'104,,,,,,,39,,,,,,,38,71,,,,,71,,39,39,,,,,,,,38,,,,,,,,71,,,,,,,,,', +',,71,71,71,,,109,,109,,,109,109,,,,,,109,,,,,,109,109,,,,71,,,109,109', +',,,,,71,71,71,,,,,,,,,,,,,,,,,,102,102,,38,,,103,,,,,,109,,103,,,,,', +',38,,103,103,,,38,71,,,,,,,,,71,,71,,,,38,,101,101,38,,,,,104,23,104', +',,104,104,,,,,,104,,,,,,104,104,,,,,,,104,104,,,,,,,,,,,,23,,,23,,,', +'38,,,,,,,,39,,,,,38,,,39,23,,104,,,,,71,39,,,,38,38,,,,,38,71,100,100', +',,109,71,,23,,39,23,,39,109,23,,,109,,,23,23,71,,,23,23,,,,,,,39,,,', +',,38,39,,38,,,,,,,,103,,103,,,103,103,,,,39,109,103,39,,,,39,103,103', +',,,39,39,,103,103,39,39,,,,102,,,38,,,,,102,,109,,,,,,,102,102,71,,', +',71,,,104,71,71,,,,103,,,104,,,,104,,,,,,101,71,,,,,,,101,,,,,71,,,', +'101,101,,,,,,,,,,71,71,,,,,,,,,104,,,,,,,,,,,,,23,,,,,23,,,,,,,,,,39', +'23,,,104,,,,,,,39,,,,,,,,23,,,,,100,,,,,,,,100,,,,23,,39,,,100,100,39', +',,,,103,,,,,,39,,,103,,,,103,,,,,,,102,,102,,39,102,102,,,,,,102,,,', +',,102,102,,39,,,,,102,102,,,,,,,,,,103,,99,99,,,,,101,,101,,23,101,101', +',,,,,101,,,,,,101,101,102,,23,,103,,101,101,23,,,,,,,,,,,,,,71,,23,', +',,23,,71,,,,,,,39,,71,,,,,,101,,,,,,,,,,39,,,,,71,39,,71,,,,,,,100,', +'100,,,100,100,39,,23,,39,100,,71,,,,100,100,62,,,,,62,100,100,,,,,,', +',,,,23,23,,71,62,,23,,,,71,,,,62,62,62,,62,102,,,,,39,,,100,102,,,,102', +',,,,39,,,,,,,,,62,,,,23,62,62,39,39,62,,,,39,,,,,101,,,,,,,,,101,,,102', +'101,,,,,,,99,,,,,,,,99,,23,,,,,,39,99,99,39,62,,,,102,62,62,62,62,62', +',62,,,,,,101,,,,,,,,,,,,,,,,71,,,,,,,,,,39,71,,,,,101,100,,,,,,,,,100', +',,,100,,,,,,,,71,,,,,71,,,,,,,,,,,71,,,,,,,62,62,62,62,62,62,62,,,,', +',62,100,,,,,62,62,62,62,,,,,,,71,,,,,,,62,,,,,,,,,,100,,,,,,,,,,,,,', +',,,,,,99,,99,,,99,99,,,,,,99,,,,62,,99,99,,,,62,62,,99,99,,,,,62,,,', +',,,,,,,,71,,,,,,62,,,,62,,,,,62,,,71,,,99,,,71,,,,,,,,,,,,,,,,71,,,', +'71,62,,,,,,,,,,,,,,62,62,62,,,,,,,,,,,,,,,,,,,62,,,,,,,,,,,,,,,71,,', +',,,,,,,,,,71,,,,,,,,,,,,,,,,71,71,,,,,71,,,,,,,,,,,37,,,62,,,,99,,,37', +'37,37,,,,99,,,,99,,37,37,,37,37,,37,,71,,,71,,,,,,,,,62,37,37,,,,,,', +',62,,,,,,,,,,,,99,,,,,,,,,,,,,71,,,,,,,,,,,,,,,,,,,99,,,,,,,,,,,,,,', +',62,,,,,,,,,,62,,,,,,,,,,,,,,,,,,,,,,,,,,,,62,,,62,,,,,,,62,,,,,,,,', +',62,,,,62,,,,,,,,,,,,,,,,,,,,,37,37,,,37,37,62,,,62,62,,,62,,,,,37,62', +'62,,,,62,62,,,,,,37,,,,,,,37,37,37,37,37,37,37,37,37,37,37,37,37,37', +'37,37,37,37,37,37,37,37,,,,,37,,,,,,,,,,,,,,,,,,,,,,,37,37,,,,,,,,37', +',,,,,,37,,37,,,37,37,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,37,,,,', +'62,,,,,,,,,,,,,,,,,,,,,,,62,,,,,62,62,,,,,,,,,,62,,,,,,,,,,,,,,,,,,62', +',,,,37,,,,,,,,,,,,62,,,,,,,,,,,,,,,,,,,,,,,37,,,,,,,,,,,,,,,,,,,,,,', +',,,37,,,,,,,,,,,,,37,,62,,,,,,,,37,,37,37,37,,,,,62,,,,,,,,,,,,62,,', +',,,62,,,,,,62,,,,,,,37,,,,,,,,,62,37,,37,,37,,,,,,,,,,,,,,,,37,,,,,', +',,,,37,,,37,,37,,,,,,37,,,37,,,,,,,,,,62,,,37,37,,,,,,,,,,37,,,,,,,', +',,,,,,,62,62,,,,,62,,,,,,,,,,,,37,37,37,,,,37,,,37,37,37,37,,,,37,37', +',,,,,37,,,,,,,,,62,,62,62,,37,,,,,,,,,,62,,,,,,,,,,,,,,37,37,,,,,,,', +',,,,,,62,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,37,,,,,,,,,37,,,37', +',,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,37', +',,,,,,,37,,,,,,,,,,,,,37,37,,,,,,,,,,,,,,,,,,,,,,,,,,,,37,37,37,37,37', +'37,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,37,,,,,,,,,,,,,,,,,,,,,,,', +',,,,37,,,,,,,,,,,,,,,,,,,37,,,,,,,,,,,,,,,,,,,,,,,,,,37,,,,,,,,,,,,', +',,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,', +',,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,37' ] + racc_goto_check = arr = ::Array.new(4752, nil) + idx = 0 + clist.each do |str| + str.split(',', -1).each do |i| + arr[idx] = i.to_i unless i.empty? + idx += 1 + end + end + +racc_goto_pointer = [ + nil, 343, 142, 162, nil, 134, 154, 106, 86, 56, + -209, 9, -441, -639, -723, nil, -407, 59, 167, -52, + -129, 111, 35, 2068, -107, -30, 45, 59, -108, 164, + 1262, -210, -357, 26, 23, 121, -26, 3589, 1625, 2121, + 484, -424, -59, -57, -7, -419, -14, nil, -9, nil, + 180, 66, -345, nil, nil, -193, 53, -186, -458, 1017, + -350, nil, 3145, 282, 104, 130, -51, nil, -28, 62, + -303, 2499, -2, -363, 116, -4, nil, 42, -220, 291, + 20, nil, -5, 166, -153, 1195, 153, 63, 235, -252, + 114, -28, -258, -332, -277, -480, nil, 849, 616, 2504, + 2203, 2113, 2068, 1856, 1723, 200, 161, -51, nil, 1618, + -339, -763, -364, -596, 155, nil, -173, 35, nil, 98, + 172, -135, 173, -366, -397, -603, -161, -762, -466, -373, + -760, -664, -141, -639, nil, -437, -722, nil, nil, -436, + -27, 269, -822, -716, 413, -815, -438, -638, nil, -737, + -842, -965, -973, -135, -575, 194, -361, -88, -25, -714, + -711, -394, -9, nil, -18, -18, nil, nil, -488, -796, + -691, -919, -530, -844, 34, -562, -553, -422, -760, nil, + -620, nil, -620, -431, -425, nil, nil, -648, -424, -423, + nil, -352, -816, -781, nil, -615, -612, nil, -89, nil, + -390, nil, -558, nil, nil, -437, -353, -735, nil, nil, + 257, 254, 255, 264, -250, -200, 265, 266, 271, -274, + -271, nil, nil, -259, -168, -98, nil, nil, -432, -311, + -218, -569, 230, -298, -730, -616, -983, nil, nil, -491 ] + +racc_goto_default = [ + nil, nil, nil, nil, 5, nil, 6, 391, 334, nil, + nil, 472, nil, 984, nil, 331, 332, nil, nil, nil, + 13, 14, 22, 247, nil, nil, 16, nil, 441, 248, + 363, nil, nil, 637, 251, nil, 27, 25, 252, 246, + 517, nil, nil, nil, nil, nil, nil, 386, 143, 26, + nil, nil, nil, 28, 29, 812, nil, nil, nil, 351, + nil, 30, 348, 455, 37, nil, nil, 39, 42, 41, + nil, 243, 244, 403, nil, 463, 142, 87, nil, 446, + 103, 51, 54, 283, nil, 323, nil, 891, 456, nil, + 457, 468, 480, 686, 569, 321, 307, 55, 56, 57, + 58, 59, 60, 61, 62, 63, nil, 308, 69, 70, + nil, nil, nil, nil, nil, 77, nil, 619, 78, 230, + nil, nil, nil, nil, nil, nil, nil, 711, 492, nil, + 712, 713, 478, 474, 475, nil, 1179, 707, 1071, nil, + 479, nil, nil, nil, 481, nil, 483, nil, 971, nil, + nil, nil, 490, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 467, nil, nil, 791, 783, nil, nil, + nil, nil, nil, nil, 1051, nil, 736, 937, 738, 739, + 743, 740, 741, nil, nil, 742, 744, nil, nil, nil, + 936, 938, nil, 748, 750, 751, 752, 753, nil, 757, + 501, 758, 759, 760, 761, nil, nil, nil, 86, 88, + 89, nil, nil, nil, nil, 647, nil, nil, nil, nil, + nil, 99, 100, nil, 231, 901, 234, 477, nil, 482, + 909, 495, 497, 498, 1082, 502, 1083, 505, 508, 326 ] + +racc_reduce_table = [ + 0, 0, :racc_error, + 0, 150, :_reduce_1, + 2, 148, :_reduce_2, + 2, 149, :_reduce_3, + 0, 151, :_reduce_4, + 1, 151, :_reduce_5, + 3, 151, :_reduce_6, + 2, 151, :_reduce_7, + 1, 153, :_reduce_none, + 2, 153, :_reduce_9, + 3, 156, :_reduce_10, + 4, 157, :_reduce_11, + 2, 158, :_reduce_12, + 0, 162, :_reduce_13, + 1, 162, :_reduce_14, + 3, 162, :_reduce_15, + 2, 162, :_reduce_16, + 1, 163, :_reduce_none, + 2, 163, :_reduce_18, + 0, 174, :_reduce_19, + 4, 155, :_reduce_20, + 3, 155, :_reduce_21, + 3, 155, :_reduce_22, + 3, 155, :_reduce_23, + 2, 155, :_reduce_24, + 3, 155, :_reduce_25, + 3, 155, :_reduce_26, + 3, 155, :_reduce_27, + 3, 155, :_reduce_28, + 3, 155, :_reduce_29, + 4, 155, :_reduce_30, + 1, 155, :_reduce_none, + 3, 155, :_reduce_32, + 3, 155, :_reduce_33, + 5, 155, :_reduce_34, + 3, 155, :_reduce_35, + 1, 155, :_reduce_none, + 3, 167, :_reduce_37, + 3, 167, :_reduce_38, + 6, 167, :_reduce_39, + 5, 167, :_reduce_40, + 5, 167, :_reduce_41, + 5, 167, :_reduce_42, + 5, 167, :_reduce_43, + 4, 167, :_reduce_44, + 6, 167, :_reduce_45, + 4, 167, :_reduce_46, + 6, 167, :_reduce_47, + 3, 167, :_reduce_48, + 1, 175, :_reduce_none, + 3, 175, :_reduce_50, + 1, 175, :_reduce_none, + 1, 173, :_reduce_none, + 3, 173, :_reduce_53, + 3, 173, :_reduce_54, + 3, 173, :_reduce_55, + 2, 173, :_reduce_56, + 0, 189, :_reduce_57, + 4, 173, :_reduce_58, + 0, 190, :_reduce_59, + 4, 173, :_reduce_60, + 1, 173, :_reduce_none, + 1, 166, :_reduce_none, + 0, 194, :_reduce_63, + 3, 191, :_reduce_64, + 1, 193, :_reduce_65, + 2, 181, :_reduce_66, + 0, 199, :_reduce_67, + 5, 185, :_reduce_68, + 1, 169, :_reduce_none, + 1, 169, :_reduce_none, + 1, 200, :_reduce_none, + 4, 200, :_reduce_72, + 0, 207, :_reduce_73, + 4, 204, :_reduce_74, + 1, 206, :_reduce_none, + 2, 183, :_reduce_76, + 3, 183, :_reduce_77, + 4, 183, :_reduce_78, + 5, 183, :_reduce_79, + 4, 183, :_reduce_80, + 5, 183, :_reduce_81, + 2, 183, :_reduce_82, + 2, 183, :_reduce_83, + 2, 183, :_reduce_84, + 2, 183, :_reduce_85, + 2, 183, :_reduce_86, + 1, 168, :_reduce_87, + 3, 168, :_reduce_88, + 1, 212, :_reduce_89, + 3, 212, :_reduce_90, + 1, 211, :_reduce_none, + 2, 211, :_reduce_92, + 3, 211, :_reduce_93, + 5, 211, :_reduce_94, + 2, 211, :_reduce_95, + 4, 211, :_reduce_96, + 2, 211, :_reduce_97, + 4, 211, :_reduce_98, + 1, 211, :_reduce_99, + 3, 211, :_reduce_100, + 1, 215, :_reduce_none, + 3, 215, :_reduce_102, + 2, 214, :_reduce_103, + 3, 214, :_reduce_104, + 1, 217, :_reduce_105, + 3, 217, :_reduce_106, + 1, 216, :_reduce_107, + 1, 216, :_reduce_108, + 4, 216, :_reduce_109, + 3, 216, :_reduce_110, + 3, 216, :_reduce_111, + 3, 216, :_reduce_112, + 3, 216, :_reduce_113, + 2, 216, :_reduce_114, + 1, 216, :_reduce_115, + 1, 170, :_reduce_116, + 1, 170, :_reduce_117, + 4, 170, :_reduce_118, + 3, 170, :_reduce_119, + 3, 170, :_reduce_120, + 3, 170, :_reduce_121, + 3, 170, :_reduce_122, + 2, 170, :_reduce_123, + 1, 170, :_reduce_124, + 1, 220, :_reduce_125, + 1, 220, :_reduce_none, + 2, 221, :_reduce_127, + 1, 221, :_reduce_128, + 3, 221, :_reduce_129, + 1, 195, :_reduce_none, + 1, 195, :_reduce_none, + 1, 195, :_reduce_none, + 1, 195, :_reduce_none, + 1, 195, :_reduce_none, + 1, 164, :_reduce_135, + 1, 164, :_reduce_none, + 1, 165, :_reduce_137, + 0, 225, :_reduce_138, + 4, 165, :_reduce_139, + 1, 222, :_reduce_none, + 1, 222, :_reduce_none, + 1, 222, :_reduce_none, + 1, 222, :_reduce_none, + 1, 222, :_reduce_none, + 1, 222, :_reduce_none, + 1, 222, :_reduce_none, + 1, 222, :_reduce_none, + 1, 222, :_reduce_none, + 1, 222, :_reduce_none, + 1, 222, :_reduce_none, + 1, 222, :_reduce_none, + 1, 222, :_reduce_none, + 1, 222, :_reduce_none, + 1, 222, :_reduce_none, + 1, 222, :_reduce_none, + 1, 222, :_reduce_none, + 1, 222, :_reduce_none, + 1, 222, :_reduce_none, + 1, 222, :_reduce_none, + 1, 222, :_reduce_none, + 1, 222, :_reduce_none, + 1, 222, :_reduce_none, + 1, 222, :_reduce_none, + 1, 222, :_reduce_none, + 1, 222, :_reduce_none, + 1, 222, :_reduce_none, + 1, 222, :_reduce_none, + 1, 222, :_reduce_none, + 1, 222, :_reduce_none, + 1, 223, :_reduce_none, + 1, 223, :_reduce_none, + 1, 223, :_reduce_none, + 1, 223, :_reduce_none, + 1, 223, :_reduce_none, + 1, 223, :_reduce_none, + 1, 223, :_reduce_none, + 1, 223, :_reduce_none, + 1, 223, :_reduce_none, + 1, 223, :_reduce_none, + 1, 223, :_reduce_none, + 1, 223, :_reduce_none, + 1, 223, :_reduce_none, + 1, 223, :_reduce_none, + 1, 223, :_reduce_none, + 1, 223, :_reduce_none, + 1, 223, :_reduce_none, + 1, 223, :_reduce_none, + 1, 223, :_reduce_none, + 1, 223, :_reduce_none, + 1, 223, :_reduce_none, + 1, 223, :_reduce_none, + 1, 223, :_reduce_none, + 1, 223, :_reduce_none, + 1, 223, :_reduce_none, + 1, 223, :_reduce_none, + 1, 223, :_reduce_none, + 1, 223, :_reduce_none, + 1, 223, :_reduce_none, + 1, 223, :_reduce_none, + 1, 223, :_reduce_none, + 1, 223, :_reduce_none, + 1, 223, :_reduce_none, + 1, 223, :_reduce_none, + 1, 223, :_reduce_none, + 1, 223, :_reduce_none, + 1, 223, :_reduce_none, + 1, 223, :_reduce_none, + 1, 223, :_reduce_none, + 1, 223, :_reduce_none, + 1, 223, :_reduce_none, + 3, 184, :_reduce_211, + 3, 184, :_reduce_212, + 6, 184, :_reduce_213, + 5, 184, :_reduce_214, + 5, 184, :_reduce_215, + 5, 184, :_reduce_216, + 5, 184, :_reduce_217, + 4, 184, :_reduce_218, + 3, 184, :_reduce_219, + 3, 184, :_reduce_220, + 3, 184, :_reduce_221, + 2, 184, :_reduce_222, + 2, 184, :_reduce_223, + 2, 184, :_reduce_224, + 2, 184, :_reduce_225, + 3, 184, :_reduce_226, + 3, 184, :_reduce_227, + 3, 184, :_reduce_228, + 3, 184, :_reduce_229, + 3, 184, :_reduce_230, + 3, 184, :_reduce_231, + 4, 184, :_reduce_232, + 2, 184, :_reduce_233, + 2, 184, :_reduce_234, + 3, 184, :_reduce_235, + 3, 184, :_reduce_236, + 3, 184, :_reduce_237, + 3, 184, :_reduce_238, + 1, 184, :_reduce_none, + 3, 184, :_reduce_240, + 3, 184, :_reduce_241, + 3, 184, :_reduce_242, + 3, 184, :_reduce_243, + 3, 184, :_reduce_244, + 2, 184, :_reduce_245, + 2, 184, :_reduce_246, + 3, 184, :_reduce_247, + 3, 184, :_reduce_248, + 3, 184, :_reduce_249, + 3, 184, :_reduce_250, + 0, 231, :_reduce_251, + 4, 184, :_reduce_252, + 6, 184, :_reduce_253, + 4, 184, :_reduce_254, + 6, 184, :_reduce_255, + 4, 184, :_reduce_256, + 6, 184, :_reduce_257, + 1, 184, :_reduce_none, + 1, 230, :_reduce_none, + 1, 230, :_reduce_none, + 1, 230, :_reduce_none, + 1, 230, :_reduce_none, + 3, 228, :_reduce_263, + 3, 228, :_reduce_264, + 1, 232, :_reduce_none, + 1, 233, :_reduce_none, + 2, 233, :_reduce_none, + 4, 233, :_reduce_268, + 2, 233, :_reduce_269, + 1, 226, :_reduce_none, + 3, 226, :_reduce_271, + 3, 238, :_reduce_272, + 5, 238, :_reduce_273, + 3, 238, :_reduce_274, + 0, 240, :_reduce_275, + 1, 240, :_reduce_none, + 0, 178, :_reduce_277, + 1, 178, :_reduce_none, + 2, 178, :_reduce_none, + 4, 178, :_reduce_280, + 2, 178, :_reduce_281, + 1, 210, :_reduce_282, + 2, 210, :_reduce_283, + 2, 210, :_reduce_284, + 4, 210, :_reduce_285, + 1, 210, :_reduce_286, + 0, 243, :_reduce_287, + 2, 203, :_reduce_288, + 2, 242, :_reduce_289, + 1, 242, :_reduce_290, + 2, 241, :_reduce_291, + 0, 241, :_reduce_292, + 1, 235, :_reduce_293, + 2, 235, :_reduce_294, + 3, 235, :_reduce_295, + 4, 235, :_reduce_296, + 1, 172, :_reduce_297, + 1, 172, :_reduce_none, + 3, 171, :_reduce_299, + 4, 171, :_reduce_300, + 2, 171, :_reduce_301, + 1, 229, :_reduce_none, + 1, 229, :_reduce_none, + 1, 229, :_reduce_none, + 1, 229, :_reduce_none, + 1, 229, :_reduce_none, + 1, 229, :_reduce_none, + 1, 229, :_reduce_none, + 1, 229, :_reduce_none, + 1, 229, :_reduce_none, + 1, 229, :_reduce_none, + 1, 229, :_reduce_312, + 0, 267, :_reduce_313, + 4, 229, :_reduce_314, + 0, 268, :_reduce_315, + 4, 229, :_reduce_316, + 0, 269, :_reduce_317, + 4, 229, :_reduce_318, + 3, 229, :_reduce_319, + 3, 229, :_reduce_320, + 2, 229, :_reduce_321, + 3, 229, :_reduce_322, + 3, 229, :_reduce_323, + 1, 229, :_reduce_324, + 4, 229, :_reduce_325, + 3, 229, :_reduce_326, + 1, 229, :_reduce_327, + 0, 270, :_reduce_328, + 6, 229, :_reduce_329, + 4, 229, :_reduce_330, + 3, 229, :_reduce_331, + 2, 229, :_reduce_332, + 1, 229, :_reduce_none, + 2, 229, :_reduce_334, + 1, 229, :_reduce_none, + 6, 229, :_reduce_336, + 6, 229, :_reduce_337, + 4, 229, :_reduce_338, + 4, 229, :_reduce_339, + 5, 229, :_reduce_340, + 4, 229, :_reduce_341, + 5, 229, :_reduce_342, + 6, 229, :_reduce_343, + 0, 271, :_reduce_344, + 6, 229, :_reduce_345, + 0, 272, :_reduce_346, + 7, 229, :_reduce_347, + 0, 273, :_reduce_348, + 5, 229, :_reduce_349, + 4, 229, :_reduce_350, + 4, 229, :_reduce_351, + 1, 229, :_reduce_352, + 1, 229, :_reduce_353, + 1, 229, :_reduce_354, + 1, 229, :_reduce_355, + 1, 177, :_reduce_none, + 1, 262, :_reduce_357, + 1, 265, :_reduce_358, + 1, 196, :_reduce_359, + 1, 209, :_reduce_360, + 1, 257, :_reduce_none, + 1, 257, :_reduce_none, + 2, 257, :_reduce_363, + 1, 192, :_reduce_none, + 1, 192, :_reduce_none, + 1, 258, :_reduce_none, + 5, 258, :_reduce_367, + 1, 160, :_reduce_none, + 2, 160, :_reduce_369, + 1, 261, :_reduce_none, + 1, 261, :_reduce_none, + 1, 274, :_reduce_372, + 3, 274, :_reduce_373, + 1, 277, :_reduce_374, + 3, 277, :_reduce_375, + 1, 276, :_reduce_none, + 3, 276, :_reduce_377, + 5, 276, :_reduce_378, + 1, 276, :_reduce_379, + 3, 276, :_reduce_380, + 2, 278, :_reduce_381, + 1, 278, :_reduce_382, + 1, 279, :_reduce_none, + 1, 279, :_reduce_none, + 0, 284, :_reduce_385, + 2, 282, :_reduce_386, + 4, 283, :_reduce_387, + 2, 283, :_reduce_388, + 2, 283, :_reduce_389, + 1, 283, :_reduce_390, + 2, 288, :_reduce_391, + 0, 288, :_reduce_392, + 1, 289, :_reduce_none, + 6, 290, :_reduce_394, + 8, 290, :_reduce_395, + 4, 290, :_reduce_396, + 6, 290, :_reduce_397, + 4, 290, :_reduce_398, + 2, 290, :_reduce_none, + 6, 290, :_reduce_400, + 2, 290, :_reduce_401, + 4, 290, :_reduce_402, + 6, 290, :_reduce_403, + 2, 290, :_reduce_404, + 4, 290, :_reduce_405, + 2, 290, :_reduce_406, + 4, 290, :_reduce_407, + 1, 290, :_reduce_none, + 0, 294, :_reduce_409, + 1, 294, :_reduce_410, + 3, 295, :_reduce_411, + 4, 295, :_reduce_412, + 1, 296, :_reduce_413, + 4, 296, :_reduce_414, + 1, 297, :_reduce_415, + 3, 297, :_reduce_416, + 1, 298, :_reduce_417, + 1, 298, :_reduce_none, + 0, 302, :_reduce_419, + 0, 303, :_reduce_420, + 5, 256, :_reduce_421, + 4, 300, :_reduce_422, + 1, 300, :_reduce_423, + 0, 306, :_reduce_424, + 4, 301, :_reduce_425, + 0, 307, :_reduce_426, + 4, 301, :_reduce_427, + 0, 309, :_reduce_428, + 4, 305, :_reduce_429, + 2, 201, :_reduce_430, + 4, 201, :_reduce_431, + 5, 201, :_reduce_432, + 5, 201, :_reduce_433, + 2, 255, :_reduce_434, + 4, 255, :_reduce_435, + 4, 255, :_reduce_436, + 3, 255, :_reduce_437, + 3, 255, :_reduce_438, + 3, 255, :_reduce_439, + 2, 255, :_reduce_440, + 1, 255, :_reduce_441, + 4, 255, :_reduce_442, + 0, 311, :_reduce_443, + 4, 254, :_reduce_444, + 0, 312, :_reduce_445, + 4, 254, :_reduce_446, + 0, 313, :_reduce_447, + 3, 205, :_reduce_448, + 0, 314, :_reduce_449, + 0, 315, :_reduce_450, + 4, 308, :_reduce_451, + 5, 259, :_reduce_452, + 1, 316, :_reduce_453, + 1, 316, :_reduce_none, + 0, 319, :_reduce_455, + 0, 320, :_reduce_456, + 7, 260, :_reduce_457, + 1, 318, :_reduce_458, + 1, 318, :_reduce_none, + 1, 317, :_reduce_460, + 3, 317, :_reduce_461, + 3, 317, :_reduce_462, + 1, 188, :_reduce_none, + 2, 188, :_reduce_464, + 3, 188, :_reduce_465, + 1, 188, :_reduce_466, + 1, 188, :_reduce_467, + 1, 188, :_reduce_468, + 1, 321, :_reduce_none, + 3, 326, :_reduce_470, + 1, 326, :_reduce_none, + 3, 328, :_reduce_472, + 1, 328, :_reduce_none, + 1, 330, :_reduce_474, + 1, 331, :_reduce_475, + 1, 329, :_reduce_none, + 1, 329, :_reduce_none, + 4, 329, :_reduce_478, + 4, 329, :_reduce_479, + 4, 329, :_reduce_480, + 3, 329, :_reduce_481, + 4, 329, :_reduce_482, + 4, 329, :_reduce_483, + 4, 329, :_reduce_484, + 3, 329, :_reduce_485, + 3, 329, :_reduce_486, + 3, 329, :_reduce_487, + 2, 329, :_reduce_488, + 0, 335, :_reduce_489, + 4, 329, :_reduce_490, + 2, 329, :_reduce_491, + 0, 336, :_reduce_492, + 4, 329, :_reduce_493, + 1, 322, :_reduce_494, + 1, 322, :_reduce_495, + 2, 322, :_reduce_496, + 3, 322, :_reduce_497, + 5, 322, :_reduce_498, + 2, 322, :_reduce_499, + 4, 322, :_reduce_500, + 1, 322, :_reduce_none, + 2, 337, :_reduce_502, + 3, 337, :_reduce_503, + 1, 324, :_reduce_504, + 3, 324, :_reduce_505, + 5, 323, :_reduce_506, + 2, 340, :_reduce_507, + 1, 340, :_reduce_508, + 1, 339, :_reduce_509, + 3, 339, :_reduce_510, + 1, 338, :_reduce_none, + 3, 325, :_reduce_512, + 1, 325, :_reduce_513, + 2, 325, :_reduce_514, + 1, 325, :_reduce_515, + 1, 341, :_reduce_516, + 3, 341, :_reduce_517, + 2, 343, :_reduce_518, + 1, 343, :_reduce_519, + 1, 344, :_reduce_520, + 3, 344, :_reduce_521, + 2, 346, :_reduce_522, + 1, 346, :_reduce_523, + 2, 348, :_reduce_524, + 1, 342, :_reduce_none, + 1, 342, :_reduce_none, + 1, 332, :_reduce_none, + 3, 332, :_reduce_528, + 3, 332, :_reduce_529, + 2, 332, :_reduce_530, + 2, 332, :_reduce_531, + 1, 332, :_reduce_none, + 1, 332, :_reduce_none, + 1, 332, :_reduce_none, + 2, 332, :_reduce_535, + 2, 332, :_reduce_536, + 1, 349, :_reduce_none, + 1, 349, :_reduce_none, + 1, 349, :_reduce_none, + 1, 349, :_reduce_none, + 1, 349, :_reduce_none, + 1, 349, :_reduce_none, + 1, 349, :_reduce_none, + 1, 349, :_reduce_none, + 1, 349, :_reduce_545, + 1, 349, :_reduce_none, + 1, 327, :_reduce_547, + 2, 350, :_reduce_548, + 2, 350, :_reduce_549, + 4, 351, :_reduce_550, + 2, 333, :_reduce_551, + 3, 333, :_reduce_552, + 1, 333, :_reduce_553, + 6, 159, :_reduce_554, + 0, 159, :_reduce_555, + 1, 353, :_reduce_556, + 1, 353, :_reduce_none, + 1, 353, :_reduce_none, + 2, 354, :_reduce_559, + 1, 354, :_reduce_none, + 2, 161, :_reduce_561, + 1, 161, :_reduce_none, + 1, 244, :_reduce_none, + 1, 244, :_reduce_none, + 1, 245, :_reduce_565, + 1, 356, :_reduce_566, + 2, 356, :_reduce_567, + 3, 357, :_reduce_568, + 1, 357, :_reduce_569, + 1, 357, :_reduce_570, + 3, 246, :_reduce_571, + 4, 247, :_reduce_572, + 3, 248, :_reduce_573, + 0, 360, :_reduce_574, + 3, 360, :_reduce_575, + 1, 361, :_reduce_576, + 2, 361, :_reduce_577, + 3, 250, :_reduce_578, + 0, 363, :_reduce_579, + 3, 363, :_reduce_580, + 3, 249, :_reduce_581, + 3, 251, :_reduce_582, + 0, 364, :_reduce_583, + 3, 364, :_reduce_584, + 0, 365, :_reduce_585, + 3, 365, :_reduce_586, + 0, 345, :_reduce_587, + 2, 345, :_reduce_588, + 0, 358, :_reduce_589, + 2, 358, :_reduce_590, + 0, 359, :_reduce_591, + 2, 359, :_reduce_592, + 1, 362, :_reduce_593, + 2, 362, :_reduce_594, + 0, 367, :_reduce_595, + 4, 362, :_reduce_596, + 1, 366, :_reduce_597, + 1, 366, :_reduce_598, + 1, 366, :_reduce_599, + 1, 366, :_reduce_none, + 1, 224, :_reduce_none, + 1, 224, :_reduce_none, + 1, 368, :_reduce_603, + 3, 369, :_reduce_604, + 1, 355, :_reduce_605, + 2, 355, :_reduce_606, + 1, 227, :_reduce_607, + 1, 227, :_reduce_608, + 1, 227, :_reduce_609, + 1, 227, :_reduce_610, + 1, 352, :_reduce_611, + 1, 352, :_reduce_612, + 1, 352, :_reduce_613, + 1, 218, :_reduce_614, + 1, 218, :_reduce_615, + 1, 218, :_reduce_616, + 1, 218, :_reduce_617, + 1, 218, :_reduce_618, + 1, 219, :_reduce_619, + 1, 219, :_reduce_620, + 1, 219, :_reduce_621, + 1, 219, :_reduce_622, + 1, 219, :_reduce_623, + 1, 219, :_reduce_624, + 1, 219, :_reduce_625, + 1, 252, :_reduce_626, + 1, 252, :_reduce_627, + 1, 176, :_reduce_628, + 1, 176, :_reduce_629, + 1, 186, :_reduce_630, + 1, 186, :_reduce_631, + 0, 370, :_reduce_632, + 4, 263, :_reduce_633, + 0, 263, :_reduce_634, + 1, 182, :_reduce_none, + 1, 182, :_reduce_636, + 3, 371, :_reduce_637, + 1, 266, :_reduce_none, + 0, 373, :_reduce_639, + 3, 266, :_reduce_640, + 4, 372, :_reduce_641, + 2, 372, :_reduce_642, + 2, 372, :_reduce_643, + 1, 372, :_reduce_644, + 1, 372, :_reduce_645, + 2, 375, :_reduce_646, + 0, 375, :_reduce_647, + 6, 304, :_reduce_648, + 8, 304, :_reduce_649, + 4, 304, :_reduce_650, + 6, 304, :_reduce_651, + 4, 304, :_reduce_652, + 6, 304, :_reduce_653, + 2, 304, :_reduce_654, + 4, 304, :_reduce_655, + 6, 304, :_reduce_656, + 2, 304, :_reduce_657, + 4, 304, :_reduce_658, + 2, 304, :_reduce_659, + 4, 304, :_reduce_660, + 1, 304, :_reduce_661, + 0, 304, :_reduce_662, + 1, 239, :_reduce_663, + 1, 299, :_reduce_664, + 1, 299, :_reduce_665, + 1, 299, :_reduce_666, + 1, 299, :_reduce_667, + 1, 275, :_reduce_none, + 1, 275, :_reduce_669, + 1, 377, :_reduce_670, + 1, 378, :_reduce_671, + 3, 378, :_reduce_672, + 1, 291, :_reduce_673, + 3, 291, :_reduce_674, + 1, 379, :_reduce_675, + 2, 380, :_reduce_676, + 1, 380, :_reduce_677, + 2, 381, :_reduce_678, + 1, 381, :_reduce_679, + 1, 285, :_reduce_680, + 3, 285, :_reduce_681, + 1, 374, :_reduce_682, + 3, 374, :_reduce_683, + 1, 347, :_reduce_none, + 1, 347, :_reduce_none, + 2, 281, :_reduce_686, + 2, 280, :_reduce_687, + 1, 280, :_reduce_688, + 3, 382, :_reduce_689, + 3, 383, :_reduce_690, + 1, 292, :_reduce_691, + 3, 292, :_reduce_692, + 1, 376, :_reduce_693, + 3, 376, :_reduce_694, + 1, 384, :_reduce_none, + 1, 384, :_reduce_none, + 2, 293, :_reduce_697, + 1, 293, :_reduce_698, + 1, 385, :_reduce_none, + 1, 385, :_reduce_none, + 2, 287, :_reduce_701, + 1, 287, :_reduce_702, + 2, 286, :_reduce_703, + 0, 286, :_reduce_704, + 1, 197, :_reduce_none, + 3, 197, :_reduce_706, + 0, 253, :_reduce_707, + 2, 253, :_reduce_none, + 1, 237, :_reduce_709, + 3, 237, :_reduce_710, + 3, 386, :_reduce_711, + 2, 386, :_reduce_712, + 1, 386, :_reduce_713, + 4, 386, :_reduce_714, + 2, 386, :_reduce_715, + 1, 208, :_reduce_none, + 1, 208, :_reduce_none, + 1, 208, :_reduce_none, + 1, 202, :_reduce_none, + 1, 202, :_reduce_none, + 1, 202, :_reduce_none, + 1, 202, :_reduce_none, + 1, 310, :_reduce_none, + 1, 310, :_reduce_none, + 1, 310, :_reduce_none, + 1, 198, :_reduce_none, + 1, 198, :_reduce_none, + 1, 180, :_reduce_728, + 1, 180, :_reduce_729, + 0, 152, :_reduce_none, + 1, 152, :_reduce_none, + 0, 187, :_reduce_none, + 1, 187, :_reduce_none, + 2, 213, :_reduce_734, + 2, 179, :_reduce_735, + 2, 334, :_reduce_736, + 0, 236, :_reduce_none, + 1, 236, :_reduce_none, + 1, 236, :_reduce_none, + 1, 264, :_reduce_740, + 1, 264, :_reduce_none, + 1, 154, :_reduce_none, + 2, 154, :_reduce_none, + 0, 234, :_reduce_744 ] + +racc_reduce_n = 745 + +racc_shift_n = 1238 + +racc_token_table = { + false => 0, + :error => 1, + :kCLASS => 2, + :kMODULE => 3, + :kDEF => 4, + :kUNDEF => 5, + :kBEGIN => 6, + :kRESCUE => 7, + :kENSURE => 8, + :kEND => 9, + :kIF => 10, + :kUNLESS => 11, + :kTHEN => 12, + :kELSIF => 13, + :kELSE => 14, + :kCASE => 15, + :kWHEN => 16, + :kWHILE => 17, + :kUNTIL => 18, + :kFOR => 19, + :kBREAK => 20, + :kNEXT => 21, + :kREDO => 22, + :kRETRY => 23, + :kIN => 24, + :kDO => 25, + :kDO_COND => 26, + :kDO_BLOCK => 27, + :kDO_LAMBDA => 28, + :kRETURN => 29, + :kYIELD => 30, + :kSUPER => 31, + :kSELF => 32, + :kNIL => 33, + :kTRUE => 34, + :kFALSE => 35, + :kAND => 36, + :kOR => 37, + :kNOT => 38, + :kIF_MOD => 39, + :kUNLESS_MOD => 40, + :kWHILE_MOD => 41, + :kUNTIL_MOD => 42, + :kRESCUE_MOD => 43, + :kALIAS => 44, + :kDEFINED => 45, + :klBEGIN => 46, + :klEND => 47, + :k__LINE__ => 48, + :k__FILE__ => 49, + :k__ENCODING__ => 50, + :tIDENTIFIER => 51, + :tFID => 52, + :tGVAR => 53, + :tIVAR => 54, + :tCONSTANT => 55, + :tLABEL => 56, + :tCVAR => 57, + :tNTH_REF => 58, + :tBACK_REF => 59, + :tSTRING_CONTENT => 60, + :tINTEGER => 61, + :tFLOAT => 62, + :tUPLUS => 63, + :tUMINUS => 64, + :tUNARY_NUM => 65, + :tPOW => 66, + :tCMP => 67, + :tEQ => 68, + :tEQQ => 69, + :tNEQ => 70, + :tGEQ => 71, + :tLEQ => 72, + :tANDOP => 73, + :tOROP => 74, + :tMATCH => 75, + :tNMATCH => 76, + :tDOT => 77, + :tDOT2 => 78, + :tDOT3 => 79, + :tAREF => 80, + :tASET => 81, + :tLSHFT => 82, + :tRSHFT => 83, + :tCOLON2 => 84, + :tCOLON3 => 85, + :tOP_ASGN => 86, + :tASSOC => 87, + :tLPAREN => 88, + :tLPAREN2 => 89, + :tRPAREN => 90, + :tLPAREN_ARG => 91, + :tLBRACK => 92, + :tLBRACK2 => 93, + :tRBRACK => 94, + :tLBRACE => 95, + :tLBRACE_ARG => 96, + :tSTAR => 97, + :tSTAR2 => 98, + :tAMPER => 99, + :tAMPER2 => 100, + :tTILDE => 101, + :tPERCENT => 102, + :tDIVIDE => 103, + :tDSTAR => 104, + :tPLUS => 105, + :tMINUS => 106, + :tLT => 107, + :tGT => 108, + :tPIPE => 109, + :tBANG => 110, + :tCARET => 111, + :tLCURLY => 112, + :tRCURLY => 113, + :tBACK_REF2 => 114, + :tSYMBEG => 115, + :tSTRING_BEG => 116, + :tXSTRING_BEG => 117, + :tREGEXP_BEG => 118, + :tREGEXP_OPT => 119, + :tWORDS_BEG => 120, + :tQWORDS_BEG => 121, + :tSYMBOLS_BEG => 122, + :tQSYMBOLS_BEG => 123, + :tSTRING_DBEG => 124, + :tSTRING_DVAR => 125, + :tSTRING_END => 126, + :tSTRING_DEND => 127, + :tSTRING => 128, + :tSYMBOL => 129, + :tNL => 130, + :tEH => 131, + :tCOLON => 132, + :tCOMMA => 133, + :tSPACE => 134, + :tSEMI => 135, + :tLAMBDA => 136, + :tLAMBEG => 137, + :tCHARACTER => 138, + :tRATIONAL => 139, + :tIMAGINARY => 140, + :tLABEL_END => 141, + :tANDDOT => 142, + :tBDOT2 => 143, + :tBDOT3 => 144, + :tEQL => 145, + :tLOWEST => 146 } + +racc_nt_base = 147 + +racc_use_result_var = true + +Racc_arg = [ + racc_action_table, + racc_action_check, + racc_action_default, + racc_action_pointer, + racc_goto_table, + racc_goto_check, + racc_goto_default, + racc_goto_pointer, + racc_nt_base, + racc_reduce_table, + racc_token_table, + racc_shift_n, + racc_reduce_n, + racc_use_result_var ] + +Racc_token_to_s_table = [ + "$end", + "error", + "kCLASS", + "kMODULE", + "kDEF", + "kUNDEF", + "kBEGIN", + "kRESCUE", + "kENSURE", + "kEND", + "kIF", + "kUNLESS", + "kTHEN", + "kELSIF", + "kELSE", + "kCASE", + "kWHEN", + "kWHILE", + "kUNTIL", + "kFOR", + "kBREAK", + "kNEXT", + "kREDO", + "kRETRY", + "kIN", + "kDO", + "kDO_COND", + "kDO_BLOCK", + "kDO_LAMBDA", + "kRETURN", + "kYIELD", + "kSUPER", + "kSELF", + "kNIL", + "kTRUE", + "kFALSE", + "kAND", + "kOR", + "kNOT", + "kIF_MOD", + "kUNLESS_MOD", + "kWHILE_MOD", + "kUNTIL_MOD", + "kRESCUE_MOD", + "kALIAS", + "kDEFINED", + "klBEGIN", + "klEND", + "k__LINE__", + "k__FILE__", + "k__ENCODING__", + "tIDENTIFIER", + "tFID", + "tGVAR", + "tIVAR", + "tCONSTANT", + "tLABEL", + "tCVAR", + "tNTH_REF", + "tBACK_REF", + "tSTRING_CONTENT", + "tINTEGER", + "tFLOAT", + "tUPLUS", + "tUMINUS", + "tUNARY_NUM", + "tPOW", + "tCMP", + "tEQ", + "tEQQ", + "tNEQ", + "tGEQ", + "tLEQ", + "tANDOP", + "tOROP", + "tMATCH", + "tNMATCH", + "tDOT", + "tDOT2", + "tDOT3", + "tAREF", + "tASET", + "tLSHFT", + "tRSHFT", + "tCOLON2", + "tCOLON3", + "tOP_ASGN", + "tASSOC", + "tLPAREN", + "tLPAREN2", + "tRPAREN", + "tLPAREN_ARG", + "tLBRACK", + "tLBRACK2", + "tRBRACK", + "tLBRACE", + "tLBRACE_ARG", + "tSTAR", + "tSTAR2", + "tAMPER", + "tAMPER2", + "tTILDE", + "tPERCENT", + "tDIVIDE", + "tDSTAR", + "tPLUS", + "tMINUS", + "tLT", + "tGT", + "tPIPE", + "tBANG", + "tCARET", + "tLCURLY", + "tRCURLY", + "tBACK_REF2", + "tSYMBEG", + "tSTRING_BEG", + "tXSTRING_BEG", + "tREGEXP_BEG", + "tREGEXP_OPT", + "tWORDS_BEG", + "tQWORDS_BEG", + "tSYMBOLS_BEG", + "tQSYMBOLS_BEG", + "tSTRING_DBEG", + "tSTRING_DVAR", + "tSTRING_END", + "tSTRING_DEND", + "tSTRING", + "tSYMBOL", + "tNL", + "tEH", + "tCOLON", + "tCOMMA", + "tSPACE", + "tSEMI", + "tLAMBDA", + "tLAMBEG", + "tCHARACTER", + "tRATIONAL", + "tIMAGINARY", + "tLABEL_END", + "tANDDOT", + "tBDOT2", + "tBDOT3", + "tEQL", + "tLOWEST", + "$start", + "program", + "top_compstmt", + "@1", + "top_stmts", + "opt_terms", + "top_stmt", + "terms", + "stmt", + "begin_block", + "bodystmt", + "compstmt", + "opt_rescue", + "opt_else", + "opt_ensure", + "stmts", + "stmt_or_begin", + "fitem", + "undef_list", + "expr_value", + "command_asgn", + "mlhs", + "command_call", + "lhs", + "mrhs", + "mrhs_arg", + "expr", + "@2", + "command_rhs", + "var_lhs", + "primary_value", + "opt_call_args", + "rbracket", + "call_op", + "defn_head", + "f_opt_paren_args", + "command", + "arg", + "defs_head", + "backref", + "opt_nl", + "p_top_expr_body", + "@3", + "@4", + "expr_value_do", + "do", + "def_name", + "@5", + "fname", + "k_def", + "singleton", + "dot_or_colon", + "@6", + "block_command", + "block_call", + "operation2", + "command_args", + "cmd_brace_block", + "brace_body", + "fcall", + "@7", + "operation", + "k_return", + "call_args", + "mlhs_basic", + "mlhs_inner", + "rparen", + "mlhs_head", + "mlhs_item", + "mlhs_node", + "mlhs_post", + "user_variable", + "keyword_variable", + "cname", + "cpath", + "op", + "reswords", + "symbol", + "@8", + "arg_rhs", + "simple_numeric", + "rel_expr", + "primary", + "relop", + "@9", + "arg_value", + "aref_args", + "none", + "args", + "trailer", + "assocs", + "paren_args", + "args_forward", + "opt_paren_args", + "opt_block_arg", + "block_arg", + "@10", + "literal", + "strings", + "xstring", + "regexp", + "words", + "qwords", + "symbols", + "qsymbols", + "var_ref", + "assoc_list", + "brace_block", + "method_call", + "lambda", + "then", + "if_tail", + "case_body", + "p_case_body", + "for_var", + "k_class", + "superclass", + "term", + "k_module", + "f_arglist", + "@11", + "@12", + "@13", + "@14", + "@15", + "@16", + "@17", + "f_marg", + "f_norm_arg", + "f_margs", + "f_marg_list", + "f_rest_marg", + "f_any_kwrest", + "f_kwrest", + "f_no_kwarg", + "f_eq", + "block_args_tail", + "@18", + "f_block_kwarg", + "opt_f_block_arg", + "f_block_arg", + "opt_block_args_tail", + "excessed_comma", + "block_param", + "f_arg", + "f_block_optarg", + "f_rest_arg", + "opt_block_param", + "block_param_def", + "opt_bv_decl", + "bv_decls", + "bvar", + "f_bad_arg", + "f_larglist", + "lambda_body", + "@19", + "@20", + "f_args", + "do_block", + "@21", + "@22", + "do_body", + "@23", + "operation3", + "@24", + "@25", + "@26", + "@27", + "@28", + "cases", + "p_top_expr", + "p_cases", + "@29", + "@30", + "p_expr", + "p_args", + "p_find", + "p_args_tail", + "p_kwargs", + "p_as", + "p_variable", + "p_alt", + "p_expr_basic", + "p_lparen", + "p_lbracket", + "p_value", + "p_const", + "rbrace", + "@31", + "@32", + "p_args_head", + "p_arg", + "p_args_post", + "p_rest", + "p_kwarg", + "p_any_kwrest", + "p_kw", + "p_kw_label", + "string_contents", + "p_kwrest", + "kwrest_mark", + "p_kwnorest", + "p_primitive", + "p_var_ref", + "p_expr_ref", + "nonlocal_var", + "exc_list", + "exc_var", + "numeric", + "string", + "string1", + "xstring_contents", + "regexp_contents", + "word_list", + "word", + "string_content", + "symbol_list", + "qword_list", + "qsym_list", + "string_dvar", + "@33", + "ssym", + "dsym", + "@34", + "f_paren_args", + "args_tail", + "@35", + "f_kwarg", + "opt_args_tail", + "f_optarg", + "f_arg_asgn", + "f_arg_item", + "f_label", + "f_kw", + "f_block_kw", + "f_opt", + "f_block_opt", + "restarg_mark", + "blkarg_mark", + "assoc" ] + +Racc_debug_parser = false + +##### State transition tables end ##### + +# reduce 0 omitted + +def _reduce_1(val, _values, result) + @current_arg_stack.push(nil) + @max_numparam_stack.push(static: true) + + result +end + +def _reduce_2(val, _values, result) + result = val[1] + + @current_arg_stack.pop + @max_numparam_stack.pop + + result +end + +def _reduce_3(val, _values, result) + result = @builder.compstmt(val[0]) + + result +end + +def _reduce_4(val, _values, result) + result = [] + + result +end + +def _reduce_5(val, _values, result) + result = [ val[0] ] + + result +end + +def _reduce_6(val, _values, result) + result = val[0] << val[2] + + result +end + +def _reduce_7(val, _values, result) + result = [ val[1] ] + + result +end + +# reduce 8 omitted + +def _reduce_9(val, _values, result) + result = @builder.preexe(val[0], *val[1]) + + result +end + +def _reduce_10(val, _values, result) + result = val + + result +end + +def _reduce_11(val, _values, result) + rescue_bodies = val[1] + else_t, else_ = val[2] + ensure_t, ensure_ = val[3] + + if rescue_bodies.empty? && !else_t.nil? + diagnostic :error, :useless_else, nil, else_t + end + + result = @builder.begin_body(val[0], + rescue_bodies, + else_t, else_, + ensure_t, ensure_) + + result +end + +def _reduce_12(val, _values, result) + result = @builder.compstmt(val[0]) + + result +end + +def _reduce_13(val, _values, result) + result = [] + + result +end + +def _reduce_14(val, _values, result) + result = [ val[0] ] + + result +end + +def _reduce_15(val, _values, result) + result = val[0] << val[2] + + result +end + +def _reduce_16(val, _values, result) + result = [ val[1] ] + + result +end + +# reduce 17 omitted + +def _reduce_18(val, _values, result) + diagnostic :error, :begin_in_method, nil, val[0] + + result +end + +def _reduce_19(val, _values, result) + @lexer.state = :expr_fname + + result +end + +def _reduce_20(val, _values, result) + result = @builder.alias(val[0], val[1], val[3]) + + result +end + +def _reduce_21(val, _values, result) + result = @builder.alias(val[0], + @builder.gvar(val[1]), + @builder.gvar(val[2])) + + result +end + +def _reduce_22(val, _values, result) + result = @builder.alias(val[0], + @builder.gvar(val[1]), + @builder.back_ref(val[2])) + + result +end + +def _reduce_23(val, _values, result) + diagnostic :error, :nth_ref_alias, nil, val[2] + + result +end + +def _reduce_24(val, _values, result) + result = @builder.undef_method(val[0], val[1]) + + result +end + +def _reduce_25(val, _values, result) + result = @builder.condition_mod(val[0], nil, + val[1], val[2]) + + result +end + +def _reduce_26(val, _values, result) + result = @builder.condition_mod(nil, val[0], + val[1], val[2]) + + result +end + +def _reduce_27(val, _values, result) + result = @builder.loop_mod(:while, val[0], val[1], val[2]) + + result +end + +def _reduce_28(val, _values, result) + result = @builder.loop_mod(:until, val[0], val[1], val[2]) + + result +end + +def _reduce_29(val, _values, result) + rescue_body = @builder.rescue_body(val[1], + nil, nil, nil, + nil, val[2]) + + result = @builder.begin_body(val[0], [ rescue_body ]) + + result +end + +def _reduce_30(val, _values, result) + result = @builder.postexe(val[0], val[1], val[2], val[3]) + + result +end + +# reduce 31 omitted + +def _reduce_32(val, _values, result) + result = @builder.multi_assign(val[0], val[1], val[2]) + + result +end + +def _reduce_33(val, _values, result) + result = @builder.assign(val[0], val[1], + @builder.array(nil, val[2], nil)) + + result +end + +def _reduce_34(val, _values, result) + rescue_body = @builder.rescue_body(val[3], + nil, nil, nil, + nil, val[4]) + begin_body = @builder.begin_body(val[2], [ rescue_body ]) + + result = @builder.multi_assign(val[0], val[1], begin_body) + + result +end + +def _reduce_35(val, _values, result) + result = @builder.multi_assign(val[0], val[1], val[2]) + + result +end + +# reduce 36 omitted + +def _reduce_37(val, _values, result) + result = @builder.assign(val[0], val[1], val[2]) + + result +end + +def _reduce_38(val, _values, result) + result = @builder.op_assign(val[0], val[1], val[2]) + + result +end + +def _reduce_39(val, _values, result) + result = @builder.op_assign( + @builder.index( + val[0], val[1], val[2], val[3]), + val[4], val[5]) + + result +end + +def _reduce_40(val, _values, result) + result = @builder.op_assign( + @builder.call_method( + val[0], val[1], val[2]), + val[3], val[4]) + + result +end + +def _reduce_41(val, _values, result) + result = @builder.op_assign( + @builder.call_method( + val[0], val[1], val[2]), + val[3], val[4]) + + result +end + +def _reduce_42(val, _values, result) + const = @builder.const_op_assignable( + @builder.const_fetch(val[0], val[1], val[2])) + result = @builder.op_assign(const, val[3], val[4]) + + result +end + +def _reduce_43(val, _values, result) + result = @builder.op_assign( + @builder.call_method( + val[0], val[1], val[2]), + val[3], val[4]) + + result +end + +def _reduce_44(val, _values, result) + def_t, (name_t, ctx) = val[0] + endless_method_name(name_t) + + result = @builder.def_endless_method(def_t, name_t, + val[1], val[2], val[3]) + + local_pop + @current_arg_stack.pop + @context.in_def = ctx.in_def + + result +end + +def _reduce_45(val, _values, result) + def_t, (name_t, ctx) = val[0] + endless_method_name(name_t) + + rescue_body = @builder.rescue_body(val[4], + nil, nil, nil, + nil, val[5]) + + method_body = @builder.begin_body(val[3], [ rescue_body ]) + + result = @builder.def_endless_method(def_t, name_t, + val[1], val[2], method_body) + + local_pop + @current_arg_stack.pop + @context.in_def = ctx.in_def + + result +end + +def _reduce_46(val, _values, result) + def_t, recv, dot_t, (name_t, ctx) = val[0] + endless_method_name(name_t) + + result = @builder.def_endless_singleton(def_t, recv, dot_t, name_t, + val[1], val[2], val[3]) + + local_pop + @current_arg_stack.pop + @context.in_def = ctx.in_def + + result +end + +def _reduce_47(val, _values, result) + def_t, recv, dot_t, (name_t, ctx) = val[0] + endless_method_name(name_t) + + rescue_body = @builder.rescue_body(val[4], + nil, nil, nil, + nil, val[5]) + + method_body = @builder.begin_body(val[3], [ rescue_body ]) + + result = @builder.def_endless_singleton(def_t, recv, dot_t, name_t, + val[1], val[2], method_body) + + local_pop + @current_arg_stack.pop + @context.in_def = ctx.in_def + + result +end + +def _reduce_48(val, _values, result) + @builder.op_assign(val[0], val[1], val[2]) + + result +end + +# reduce 49 omitted + +def _reduce_50(val, _values, result) + rescue_body = @builder.rescue_body(val[1], + nil, nil, nil, + nil, val[2]) + + result = @builder.begin_body(val[0], [ rescue_body ]) + + result +end + +# reduce 51 omitted + +# reduce 52 omitted + +def _reduce_53(val, _values, result) + result = @builder.logical_op(:and, val[0], val[1], val[2]) + + result +end + +def _reduce_54(val, _values, result) + result = @builder.logical_op(:or, val[0], val[1], val[2]) + + result +end + +def _reduce_55(val, _values, result) + result = @builder.not_op(val[0], nil, val[2], nil) + + result +end + +def _reduce_56(val, _values, result) + result = @builder.not_op(val[0], nil, val[1], nil) + + result +end + +def _reduce_57(val, _values, result) + @lexer.state = :expr_beg + @lexer.command_start = false + @pattern_variables.push + + result = @context.in_kwarg + @context.in_kwarg = true + + result +end + +def _reduce_58(val, _values, result) + @pattern_variables.pop + @context.in_kwarg = val[2] + result = @builder.match_pattern(val[0], val[1], val[3]) + + result +end + +def _reduce_59(val, _values, result) + @lexer.state = :expr_beg + @lexer.command_start = false + @pattern_variables.push + + result = @context.in_kwarg + @context.in_kwarg = true + + result +end + +def _reduce_60(val, _values, result) + @pattern_variables.pop + @context.in_kwarg = val[2] + result = @builder.match_pattern_p(val[0], val[1], val[3]) + + result +end + +# reduce 61 omitted + +# reduce 62 omitted + +def _reduce_63(val, _values, result) + @lexer.cond.push(true) + + result +end + +def _reduce_64(val, _values, result) + @lexer.cond.pop + result = [ val[1], val[2] ] + + result +end + +def _reduce_65(val, _values, result) + local_push + @current_arg_stack.push(nil) + + result = [ val[0], @context.dup ] + @context.in_def = true + + result +end + +def _reduce_66(val, _values, result) + result = [ val[0], val[1] ] + + result +end + +def _reduce_67(val, _values, result) + @lexer.state = :expr_fname + @context.in_argdef = true + + result +end + +def _reduce_68(val, _values, result) + result = [ val[0], val[1], val[2], val[4] ] + + result +end + +# reduce 69 omitted + +# reduce 70 omitted + +# reduce 71 omitted + +def _reduce_72(val, _values, result) + result = @builder.call_method(val[0], val[1], val[2], + nil, val[3], nil) + + result +end + +def _reduce_73(val, _values, result) + result = @context.dup + @context.in_block = true + + result +end + +def _reduce_74(val, _values, result) + @context.in_block = val[1].in_block + result = [ val[0], *val[2], val[3] ] + + result +end + +# reduce 75 omitted + +def _reduce_76(val, _values, result) + result = @builder.call_method(nil, nil, val[0], + nil, val[1], nil) + + result +end + +def _reduce_77(val, _values, result) + method_call = @builder.call_method(nil, nil, val[0], + nil, val[1], nil) + + begin_t, args, body, end_t = val[2] + result = @builder.block(method_call, + begin_t, args, body, end_t) + + result +end + +def _reduce_78(val, _values, result) + result = @builder.call_method(val[0], val[1], val[2], + nil, val[3], nil) + + result +end + +def _reduce_79(val, _values, result) + method_call = @builder.call_method(val[0], val[1], val[2], + nil, val[3], nil) + + begin_t, args, body, end_t = val[4] + result = @builder.block(method_call, + begin_t, args, body, end_t) + + result +end + +def _reduce_80(val, _values, result) + result = @builder.call_method(val[0], val[1], val[2], + nil, val[3], nil) + + result +end + +def _reduce_81(val, _values, result) + method_call = @builder.call_method(val[0], val[1], val[2], + nil, val[3], nil) + + begin_t, args, body, end_t = val[4] + result = @builder.block(method_call, + begin_t, args, body, end_t) + + result +end + +def _reduce_82(val, _values, result) + result = @builder.keyword_cmd(:super, val[0], + nil, val[1], nil) + + result +end + +def _reduce_83(val, _values, result) + result = @builder.keyword_cmd(:yield, val[0], + nil, val[1], nil) + + result +end + +def _reduce_84(val, _values, result) + result = @builder.keyword_cmd(:return, val[0], + nil, val[1], nil) + + result +end + +def _reduce_85(val, _values, result) + result = @builder.keyword_cmd(:break, val[0], + nil, val[1], nil) + + result +end + +def _reduce_86(val, _values, result) + result = @builder.keyword_cmd(:next, val[0], + nil, val[1], nil) + + result +end + +def _reduce_87(val, _values, result) + result = @builder.multi_lhs(nil, val[0], nil) + + result +end + +def _reduce_88(val, _values, result) + result = @builder.begin(val[0], val[1], val[2]) + + result +end + +def _reduce_89(val, _values, result) + result = @builder.multi_lhs(nil, val[0], nil) + + result +end + +def _reduce_90(val, _values, result) + result = @builder.multi_lhs(val[0], val[1], val[2]) + + result +end + +# reduce 91 omitted + +def _reduce_92(val, _values, result) + result = val[0]. + push(val[1]) + + result +end + +def _reduce_93(val, _values, result) + result = val[0]. + push(@builder.splat(val[1], val[2])) + + result +end + +def _reduce_94(val, _values, result) + result = val[0]. + push(@builder.splat(val[1], val[2])). + concat(val[4]) + + result +end + +def _reduce_95(val, _values, result) + result = val[0]. + push(@builder.splat(val[1])) + + result +end + +def _reduce_96(val, _values, result) + result = val[0]. + push(@builder.splat(val[1])). + concat(val[3]) + + result +end + +def _reduce_97(val, _values, result) + result = [ @builder.splat(val[0], val[1]) ] + + result +end + +def _reduce_98(val, _values, result) + result = [ @builder.splat(val[0], val[1]), + *val[3] ] + + result +end + +def _reduce_99(val, _values, result) + result = [ @builder.splat(val[0]) ] + + result +end + +def _reduce_100(val, _values, result) + result = [ @builder.splat(val[0]), + *val[2] ] + + result +end + +# reduce 101 omitted + +def _reduce_102(val, _values, result) + result = @builder.begin(val[0], val[1], val[2]) + + result +end + +def _reduce_103(val, _values, result) + result = [ val[0] ] + + result +end + +def _reduce_104(val, _values, result) + result = val[0] << val[1] + + result +end + +def _reduce_105(val, _values, result) + result = [ val[0] ] + + result +end + +def _reduce_106(val, _values, result) + result = val[0] << val[2] + + result +end + +def _reduce_107(val, _values, result) + result = @builder.assignable(val[0]) + + result +end + +def _reduce_108(val, _values, result) + result = @builder.assignable(val[0]) + + result +end + +def _reduce_109(val, _values, result) + result = @builder.index_asgn(val[0], val[1], val[2], val[3]) + + result +end + +def _reduce_110(val, _values, result) + if (val[1][0] == :anddot) + diagnostic :error, :csend_in_lhs_of_masgn, nil, val[1] + end + + result = @builder.attr_asgn(val[0], val[1], val[2]) + + result +end + +def _reduce_111(val, _values, result) + result = @builder.attr_asgn(val[0], val[1], val[2]) + + result +end + +def _reduce_112(val, _values, result) + if (val[1][0] == :anddot) + diagnostic :error, :csend_in_lhs_of_masgn, nil, val[1] + end + + result = @builder.attr_asgn(val[0], val[1], val[2]) + + result +end + +def _reduce_113(val, _values, result) + result = @builder.assignable( + @builder.const_fetch(val[0], val[1], val[2])) + + result +end + +def _reduce_114(val, _values, result) + result = @builder.assignable( + @builder.const_global(val[0], val[1])) + + result +end + +def _reduce_115(val, _values, result) + result = @builder.assignable(val[0]) + + result +end + +def _reduce_116(val, _values, result) + result = @builder.assignable(val[0]) + + result +end + +def _reduce_117(val, _values, result) + result = @builder.assignable(val[0]) + + result +end + +def _reduce_118(val, _values, result) + result = @builder.index_asgn(val[0], val[1], val[2], val[3]) + + result +end + +def _reduce_119(val, _values, result) + result = @builder.attr_asgn(val[0], val[1], val[2]) + + result +end + +def _reduce_120(val, _values, result) + result = @builder.attr_asgn(val[0], val[1], val[2]) + + result +end + +def _reduce_121(val, _values, result) + result = @builder.attr_asgn(val[0], val[1], val[2]) + + result +end + +def _reduce_122(val, _values, result) + result = @builder.assignable( + @builder.const_fetch(val[0], val[1], val[2])) + + result +end + +def _reduce_123(val, _values, result) + result = @builder.assignable( + @builder.const_global(val[0], val[1])) + + result +end + +def _reduce_124(val, _values, result) + result = @builder.assignable(val[0]) + + result +end + +def _reduce_125(val, _values, result) + diagnostic :error, :module_name_const, nil, val[0] + + result +end + +# reduce 126 omitted + +def _reduce_127(val, _values, result) + result = @builder.const_global(val[0], val[1]) + + result +end + +def _reduce_128(val, _values, result) + result = @builder.const(val[0]) + + result +end + +def _reduce_129(val, _values, result) + result = @builder.const_fetch(val[0], val[1], val[2]) + + result +end + +# reduce 130 omitted + +# reduce 131 omitted + +# reduce 132 omitted + +# reduce 133 omitted + +# reduce 134 omitted + +def _reduce_135(val, _values, result) + result = @builder.symbol_internal(val[0]) + + result +end + +# reduce 136 omitted + +def _reduce_137(val, _values, result) + result = [ val[0] ] + + result +end + +def _reduce_138(val, _values, result) + @lexer.state = :expr_fname + + result +end + +def _reduce_139(val, _values, result) + result = val[0] << val[3] + + result +end + +# reduce 140 omitted + +# reduce 141 omitted + +# reduce 142 omitted + +# reduce 143 omitted + +# reduce 144 omitted + +# reduce 145 omitted + +# reduce 146 omitted + +# reduce 147 omitted + +# reduce 148 omitted + +# reduce 149 omitted + +# reduce 150 omitted + +# reduce 151 omitted + +# reduce 152 omitted + +# reduce 153 omitted + +# reduce 154 omitted + +# reduce 155 omitted + +# reduce 156 omitted + +# reduce 157 omitted + +# reduce 158 omitted + +# reduce 159 omitted + +# reduce 160 omitted + +# reduce 161 omitted + +# reduce 162 omitted + +# reduce 163 omitted + +# reduce 164 omitted + +# reduce 165 omitted + +# reduce 166 omitted + +# reduce 167 omitted + +# reduce 168 omitted + +# reduce 169 omitted + +# reduce 170 omitted + +# reduce 171 omitted + +# reduce 172 omitted + +# reduce 173 omitted + +# reduce 174 omitted + +# reduce 175 omitted + +# reduce 176 omitted + +# reduce 177 omitted + +# reduce 178 omitted + +# reduce 179 omitted + +# reduce 180 omitted + +# reduce 181 omitted + +# reduce 182 omitted + +# reduce 183 omitted + +# reduce 184 omitted + +# reduce 185 omitted + +# reduce 186 omitted + +# reduce 187 omitted + +# reduce 188 omitted + +# reduce 189 omitted + +# reduce 190 omitted + +# reduce 191 omitted + +# reduce 192 omitted + +# reduce 193 omitted + +# reduce 194 omitted + +# reduce 195 omitted + +# reduce 196 omitted + +# reduce 197 omitted + +# reduce 198 omitted + +# reduce 199 omitted + +# reduce 200 omitted + +# reduce 201 omitted + +# reduce 202 omitted + +# reduce 203 omitted + +# reduce 204 omitted + +# reduce 205 omitted + +# reduce 206 omitted + +# reduce 207 omitted + +# reduce 208 omitted + +# reduce 209 omitted + +# reduce 210 omitted + +def _reduce_211(val, _values, result) + result = @builder.assign(val[0], val[1], val[2]) + + result +end + +def _reduce_212(val, _values, result) + result = @builder.op_assign(val[0], val[1], val[2]) + + result +end + +def _reduce_213(val, _values, result) + result = @builder.op_assign( + @builder.index( + val[0], val[1], val[2], val[3]), + val[4], val[5]) + + result +end + +def _reduce_214(val, _values, result) + result = @builder.op_assign( + @builder.call_method( + val[0], val[1], val[2]), + val[3], val[4]) + + result +end + +def _reduce_215(val, _values, result) + result = @builder.op_assign( + @builder.call_method( + val[0], val[1], val[2]), + val[3], val[4]) + + result +end + +def _reduce_216(val, _values, result) + result = @builder.op_assign( + @builder.call_method( + val[0], val[1], val[2]), + val[3], val[4]) + + result +end + +def _reduce_217(val, _values, result) + const = @builder.const_op_assignable( + @builder.const_fetch(val[0], val[1], val[2])) + result = @builder.op_assign(const, val[3], val[4]) + + result +end + +def _reduce_218(val, _values, result) + const = @builder.const_op_assignable( + @builder.const_global(val[0], val[1])) + result = @builder.op_assign(const, val[2], val[3]) + + result +end + +def _reduce_219(val, _values, result) + result = @builder.op_assign(val[0], val[1], val[2]) + + result +end + +def _reduce_220(val, _values, result) + result = @builder.range_inclusive(val[0], val[1], val[2]) + + result +end + +def _reduce_221(val, _values, result) + result = @builder.range_exclusive(val[0], val[1], val[2]) + + result +end + +def _reduce_222(val, _values, result) + result = @builder.range_inclusive(val[0], val[1], nil) + + result +end + +def _reduce_223(val, _values, result) + result = @builder.range_exclusive(val[0], val[1], nil) + + result +end + +def _reduce_224(val, _values, result) + result = @builder.range_inclusive(nil, val[0], val[1]) + + result +end + +def _reduce_225(val, _values, result) + result = @builder.range_exclusive(nil, val[0], val[1]) + + result +end + +def _reduce_226(val, _values, result) + result = @builder.binary_op(val[0], val[1], val[2]) + + result +end + +def _reduce_227(val, _values, result) + result = @builder.binary_op(val[0], val[1], val[2]) + + result +end + +def _reduce_228(val, _values, result) + result = @builder.binary_op(val[0], val[1], val[2]) + + result +end + +def _reduce_229(val, _values, result) + result = @builder.binary_op(val[0], val[1], val[2]) + + result +end + +def _reduce_230(val, _values, result) + result = @builder.binary_op(val[0], val[1], val[2]) + + result +end + +def _reduce_231(val, _values, result) + result = @builder.binary_op(val[0], val[1], val[2]) + + result +end + +def _reduce_232(val, _values, result) + result = @builder.unary_op(val[0], + @builder.binary_op( + val[1], val[2], val[3])) + + result +end + +def _reduce_233(val, _values, result) + result = @builder.unary_op(val[0], val[1]) + + result +end + +def _reduce_234(val, _values, result) + result = @builder.unary_op(val[0], val[1]) + + result +end + +def _reduce_235(val, _values, result) + result = @builder.binary_op(val[0], val[1], val[2]) + + result +end + +def _reduce_236(val, _values, result) + result = @builder.binary_op(val[0], val[1], val[2]) + + result +end + +def _reduce_237(val, _values, result) + result = @builder.binary_op(val[0], val[1], val[2]) + + result +end + +def _reduce_238(val, _values, result) + result = @builder.binary_op(val[0], val[1], val[2]) + + result +end + +# reduce 239 omitted + +def _reduce_240(val, _values, result) + result = @builder.binary_op(val[0], val[1], val[2]) + + result +end + +def _reduce_241(val, _values, result) + result = @builder.binary_op(val[0], val[1], val[2]) + + result +end + +def _reduce_242(val, _values, result) + result = @builder.binary_op(val[0], val[1], val[2]) + + result +end + +def _reduce_243(val, _values, result) + result = @builder.match_op(val[0], val[1], val[2]) + + result +end + +def _reduce_244(val, _values, result) + result = @builder.binary_op(val[0], val[1], val[2]) + + result +end + +def _reduce_245(val, _values, result) + result = @builder.not_op(val[0], nil, val[1], nil) + + result +end + +def _reduce_246(val, _values, result) + result = @builder.unary_op(val[0], val[1]) + + result +end + +def _reduce_247(val, _values, result) + result = @builder.binary_op(val[0], val[1], val[2]) + + result +end + +def _reduce_248(val, _values, result) + result = @builder.binary_op(val[0], val[1], val[2]) + + result +end + +def _reduce_249(val, _values, result) + result = @builder.logical_op(:and, val[0], val[1], val[2]) + + result +end + +def _reduce_250(val, _values, result) + result = @builder.logical_op(:or, val[0], val[1], val[2]) + + result +end + +def _reduce_251(val, _values, result) + @context.in_defined = true + + result +end + +def _reduce_252(val, _values, result) + @context.in_defined = false + result = @builder.keyword_cmd(:defined?, val[0], nil, [ val[3] ], nil) + + result +end + +def _reduce_253(val, _values, result) + result = @builder.ternary(val[0], val[1], + val[2], val[4], val[5]) + + result +end + +def _reduce_254(val, _values, result) + def_t, (name_t, ctx) = val[0] + endless_method_name(name_t) + + result = @builder.def_endless_method(def_t, name_t, + val[1], val[2], val[3]) + + local_pop + @current_arg_stack.pop + @context.in_def = ctx.in_def + + result +end + +def _reduce_255(val, _values, result) + def_t, (name_t, ctx) = val[0] + endless_method_name(name_t) + + rescue_body = @builder.rescue_body(val[4], + nil, nil, nil, + nil, val[5]) + + method_body = @builder.begin_body(val[3], [ rescue_body ]) + + result = @builder.def_endless_method(def_t, name_t, + val[1], val[2], method_body) + + local_pop + @current_arg_stack.pop + @context.in_def = ctx.in_def + + result +end + +def _reduce_256(val, _values, result) + def_t, recv, dot_t, (name_t, ctx) = val[0] + endless_method_name(name_t) + + result = @builder.def_endless_singleton(def_t, recv, dot_t, name_t, + val[1], val[2], val[3]) + + local_pop + @current_arg_stack.pop + @context.in_def = ctx.in_def + + result +end + +def _reduce_257(val, _values, result) + def_t, recv, dot_t, (name_t, ctx) = val[0] + endless_method_name(name_t) + + rescue_body = @builder.rescue_body(val[4], + nil, nil, nil, + nil, val[5]) + + method_body = @builder.begin_body(val[3], [ rescue_body ]) + + result = @builder.def_endless_singleton(def_t, recv, dot_t, name_t, + val[1], val[2], method_body) + + local_pop + @current_arg_stack.pop + @context.in_def = ctx.in_def + + result +end + +# reduce 258 omitted + +# reduce 259 omitted + +# reduce 260 omitted + +# reduce 261 omitted + +# reduce 262 omitted + +def _reduce_263(val, _values, result) + result = @builder.binary_op(val[0], val[1], val[2]) + + result +end + +def _reduce_264(val, _values, result) + result = @builder.binary_op(val[0], val[1], val[2]) + + result +end + +# reduce 265 omitted + +# reduce 266 omitted + +# reduce 267 omitted + +def _reduce_268(val, _values, result) + result = val[0] << @builder.associate(nil, val[2], nil) + + result +end + +def _reduce_269(val, _values, result) + result = [ @builder.associate(nil, val[0], nil) ] + + result +end + +# reduce 270 omitted + +def _reduce_271(val, _values, result) + rescue_body = @builder.rescue_body(val[1], + nil, nil, nil, + nil, val[2]) + + result = @builder.begin_body(val[0], [ rescue_body ]) + + result +end + +def _reduce_272(val, _values, result) + result = val + + result +end + +def _reduce_273(val, _values, result) + unless @static_env.declared_forward_args? + diagnostic :error, :unexpected_token, { :token => 'tBDOT3' } , val[3] + end + + result = [val[0], [*val[1], @builder.forwarded_args(val[3])], val[4]] + + result +end + +def _reduce_274(val, _values, result) + unless @static_env.declared_forward_args? + diagnostic :error, :unexpected_token, { :token => 'tBDOT3' } , val[1] + end + + result = [val[0], [@builder.forwarded_args(val[1])], val[2]] + + result +end + +def _reduce_275(val, _values, result) + result = [ nil, [], nil ] + + result +end + +# reduce 276 omitted + +def _reduce_277(val, _values, result) + result = [] + + result +end + +# reduce 278 omitted + +# reduce 279 omitted + +def _reduce_280(val, _values, result) + result = val[0] << @builder.associate(nil, val[2], nil) + + result +end + +def _reduce_281(val, _values, result) + result = [ @builder.associate(nil, val[0], nil) ] + + result +end + +def _reduce_282(val, _values, result) + result = [ val[0] ] + + result +end + +def _reduce_283(val, _values, result) + result = val[0].concat(val[1]) + + result +end + +def _reduce_284(val, _values, result) + result = [ @builder.associate(nil, val[0], nil) ] + result.concat(val[1]) + + result +end + +def _reduce_285(val, _values, result) + assocs = @builder.associate(nil, val[2], nil) + result = val[0] << assocs + result.concat(val[3]) + + result +end + +def _reduce_286(val, _values, result) + result = [ val[0] ] + + result +end + +def _reduce_287(val, _values, result) + # When branch gets invoked by RACC's lookahead + # and command args start with '[' or '(' + # we need to put `true` to the cmdarg stack + # **before** `false` pushed by lexer + # m [], n + # ^ + # Right here we have cmdarg [...0] because + # lexer pushed it on '[' + # We need to modify cmdarg stack to [...10] + # + # For all other cases (like `m n` or `m n, []`) we simply put 1 to the stack + # and later lexer pushes corresponding bits on top of it. + last_token = @last_token[0] + lookahead = last_token == :tLBRACK || last_token == :tLPAREN_ARG + + if lookahead + top = @lexer.cmdarg.pop + @lexer.cmdarg.push(true) + @lexer.cmdarg.push(top) + else + @lexer.cmdarg.push(true) + end + + result +end + +def _reduce_288(val, _values, result) + # call_args can be followed by tLBRACE_ARG (that does cmdarg.push(0) in the lexer) + # but the push must be done after cmdarg.pop() in the parser. + # So this code does cmdarg.pop() to pop 0 pushed by tLBRACE_ARG, + # cmdarg.pop() to pop 1 pushed by command_args, + # and cmdarg.push(0) to restore back the flag set by tLBRACE_ARG. + last_token = @last_token[0] + lookahead = last_token == :tLBRACE_ARG + if lookahead + top = @lexer.cmdarg.pop + @lexer.cmdarg.pop + @lexer.cmdarg.push(top) + else + @lexer.cmdarg.pop + end + + result = val[1] + + result +end + +def _reduce_289(val, _values, result) + result = @builder.block_pass(val[0], val[1]) + + result +end + +def _reduce_290(val, _values, result) + if !@static_env.declared_anonymous_blockarg? + diagnostic :error, :no_anonymous_blockarg, nil, val[0] + end + + result = @builder.block_pass(val[0], nil) + + result +end + +def _reduce_291(val, _values, result) + result = [ val[1] ] + + result +end + +def _reduce_292(val, _values, result) + result = [] + + result +end + +def _reduce_293(val, _values, result) + result = [ val[0] ] + + result +end + +def _reduce_294(val, _values, result) + result = [ @builder.splat(val[0], val[1]) ] + + result +end + +def _reduce_295(val, _values, result) + result = val[0] << val[2] + + result +end + +def _reduce_296(val, _values, result) + result = val[0] << @builder.splat(val[2], val[3]) + + result +end + +def _reduce_297(val, _values, result) + result = @builder.array(nil, val[0], nil) + + result +end + +# reduce 298 omitted + +def _reduce_299(val, _values, result) + result = val[0] << val[2] + + result +end + +def _reduce_300(val, _values, result) + result = val[0] << @builder.splat(val[2], val[3]) + + result +end + +def _reduce_301(val, _values, result) + result = [ @builder.splat(val[0], val[1]) ] + + result +end + +# reduce 302 omitted + +# reduce 303 omitted + +# reduce 304 omitted + +# reduce 305 omitted + +# reduce 306 omitted + +# reduce 307 omitted + +# reduce 308 omitted + +# reduce 309 omitted + +# reduce 310 omitted + +# reduce 311 omitted + +def _reduce_312(val, _values, result) + result = @builder.call_method(nil, nil, val[0]) + + result +end + +def _reduce_313(val, _values, result) + @lexer.cmdarg.push(false) + + result +end + +def _reduce_314(val, _values, result) + @lexer.cmdarg.pop + + result = @builder.begin_keyword(val[0], val[2], val[3]) + + result +end + +def _reduce_315(val, _values, result) + @lexer.state = :expr_endarg + + result +end + +def _reduce_316(val, _values, result) + result = @builder.begin(val[0], val[1], val[3]) + + result +end + +def _reduce_317(val, _values, result) + @lexer.state = :expr_endarg + + result +end + +def _reduce_318(val, _values, result) + result = @builder.begin(val[0], nil, val[3]) + + result +end + +def _reduce_319(val, _values, result) + result = @builder.begin(val[0], val[1], val[2]) + + result +end + +def _reduce_320(val, _values, result) + result = @builder.const_fetch(val[0], val[1], val[2]) + + result +end + +def _reduce_321(val, _values, result) + result = @builder.const_global(val[0], val[1]) + + result +end + +def _reduce_322(val, _values, result) + result = @builder.array(val[0], val[1], val[2]) + + result +end + +def _reduce_323(val, _values, result) + result = @builder.associate(val[0], val[1], val[2]) + + result +end + +def _reduce_324(val, _values, result) + result = @builder.keyword_cmd(:return, val[0]) + + result +end + +def _reduce_325(val, _values, result) + result = @builder.keyword_cmd(:yield, val[0], val[1], val[2], val[3]) + + result +end + +def _reduce_326(val, _values, result) + result = @builder.keyword_cmd(:yield, val[0], val[1], [], val[2]) + + result +end + +def _reduce_327(val, _values, result) + result = @builder.keyword_cmd(:yield, val[0]) + + result +end + +def _reduce_328(val, _values, result) + @context.in_defined = true + + result +end + +def _reduce_329(val, _values, result) + @context.in_defined = false + result = @builder.keyword_cmd(:defined?, val[0], + val[2], [ val[4] ], val[5]) + + result +end + +def _reduce_330(val, _values, result) + result = @builder.not_op(val[0], val[1], val[2], val[3]) + + result +end + +def _reduce_331(val, _values, result) + result = @builder.not_op(val[0], val[1], nil, val[2]) + + result +end + +def _reduce_332(val, _values, result) + method_call = @builder.call_method(nil, nil, val[0]) + + begin_t, args, body, end_t = val[1] + result = @builder.block(method_call, + begin_t, args, body, end_t) + + result +end + +# reduce 333 omitted + +def _reduce_334(val, _values, result) + begin_t, args, body, end_t = val[1] + result = @builder.block(val[0], + begin_t, args, body, end_t) + + result +end + +# reduce 335 omitted + +def _reduce_336(val, _values, result) + else_t, else_ = val[4] + result = @builder.condition(val[0], val[1], val[2], + val[3], else_t, + else_, val[5]) + + result +end + +def _reduce_337(val, _values, result) + else_t, else_ = val[4] + result = @builder.condition(val[0], val[1], val[2], + else_, else_t, + val[3], val[5]) + + result +end + +def _reduce_338(val, _values, result) + result = @builder.loop(:while, val[0], *val[1], val[2], val[3]) + + result +end + +def _reduce_339(val, _values, result) + result = @builder.loop(:until, val[0], *val[1], val[2], val[3]) + + result +end + +def _reduce_340(val, _values, result) + *when_bodies, (else_t, else_body) = *val[3] + + result = @builder.case(val[0], val[1], + when_bodies, else_t, else_body, + val[4]) + + result +end + +def _reduce_341(val, _values, result) + *when_bodies, (else_t, else_body) = *val[2] + + result = @builder.case(val[0], nil, + when_bodies, else_t, else_body, + val[3]) + + result +end + +def _reduce_342(val, _values, result) + *in_bodies, (else_t, else_body) = *val[3] + + result = @builder.case_match(val[0], val[1], + in_bodies, else_t, else_body, + val[4]) + + result +end + +def _reduce_343(val, _values, result) + result = @builder.for(val[0], val[1], val[2], *val[3], val[4], val[5]) + + result +end + +def _reduce_344(val, _values, result) + @context.in_class = true + local_push + + result +end + +def _reduce_345(val, _values, result) + k_class, ctx = val[0] + if @context.in_def + diagnostic :error, :class_in_def, nil, k_class + end + lt_t, superclass = val[2] + result = @builder.def_class(k_class, val[1], + lt_t, superclass, + val[4], val[5]) + + local_pop + @context.in_class = ctx.in_class + + result +end + +def _reduce_346(val, _values, result) + @context.in_def = false + @context.in_class = false + local_push + + result +end + +def _reduce_347(val, _values, result) + k_class, ctx = val[0] + result = @builder.def_sclass(k_class, val[1], val[2], + val[5], val[6]) + + local_pop + @context.in_def = ctx.in_def + @context.in_class = ctx.in_class + + result +end + +def _reduce_348(val, _values, result) + @context.in_class = true + local_push + + result +end + +def _reduce_349(val, _values, result) + k_mod, ctx = val[0] + if @context.in_def + diagnostic :error, :module_in_def, nil, k_mod + end + result = @builder.def_module(k_mod, val[1], + val[3], val[4]) + + local_pop + @context.in_class = ctx.in_class + + result +end + +def _reduce_350(val, _values, result) + def_t, (name_t, ctx) = val[0] + result = @builder.def_method(def_t, name_t, val[1], + val[2], val[3]) + + local_pop + @current_arg_stack.pop + @context.in_def = ctx.in_def + + result +end + +def _reduce_351(val, _values, result) + def_t, recv, dot_t, (name_t, ctx) = val[0] + result = @builder.def_singleton(def_t, recv, dot_t, name_t, val[1], + val[2], val[3]) + + local_pop + @current_arg_stack.pop + @context.in_def = ctx.in_def + + result +end + +def _reduce_352(val, _values, result) + result = @builder.keyword_cmd(:break, val[0]) + + result +end + +def _reduce_353(val, _values, result) + result = @builder.keyword_cmd(:next, val[0]) + + result +end + +def _reduce_354(val, _values, result) + result = @builder.keyword_cmd(:redo, val[0]) + + result +end + +def _reduce_355(val, _values, result) + result = @builder.keyword_cmd(:retry, val[0]) + + result +end + +# reduce 356 omitted + +def _reduce_357(val, _values, result) + result = [ val[0], @context.dup ] + + result +end + +def _reduce_358(val, _values, result) + result = [ val[0], @context.dup ] + + result +end + +def _reduce_359(val, _values, result) + result = val[0] + @context.in_argdef = true + + result +end + +def _reduce_360(val, _values, result) + if @context.in_class && !@context.in_def && !(context.in_block || context.in_lambda) + diagnostic :error, :invalid_return, nil, val[0] + end + + result +end + +# reduce 361 omitted + +# reduce 362 omitted + +def _reduce_363(val, _values, result) + result = val[1] + + result +end + +# reduce 364 omitted + +# reduce 365 omitted + +# reduce 366 omitted + +def _reduce_367(val, _values, result) + else_t, else_ = val[4] + result = [ val[0], + @builder.condition(val[0], val[1], val[2], + val[3], else_t, + else_, nil), + ] + + result +end + +# reduce 368 omitted + +def _reduce_369(val, _values, result) + result = val + + result +end + +# reduce 370 omitted + +# reduce 371 omitted + +def _reduce_372(val, _values, result) + result = @builder.arg(val[0]) + + result +end + +def _reduce_373(val, _values, result) + result = @builder.multi_lhs(val[0], val[1], val[2]) + + result +end + +def _reduce_374(val, _values, result) + result = [ val[0] ] + + result +end + +def _reduce_375(val, _values, result) + result = val[0] << val[2] + + result +end + +# reduce 376 omitted + +def _reduce_377(val, _values, result) + result = val[0]. + push(val[2]) + + result +end + +def _reduce_378(val, _values, result) + result = val[0]. + push(val[2]). + concat(val[4]) + + result +end + +def _reduce_379(val, _values, result) + result = [ val[0] ] + + result +end + +def _reduce_380(val, _values, result) + result = [ val[0], *val[2] ] + + result +end + +def _reduce_381(val, _values, result) + result = @builder.restarg(val[0], val[1]) + + result +end + +def _reduce_382(val, _values, result) + result = @builder.restarg(val[0]) + + result +end + +# reduce 383 omitted + +# reduce 384 omitted + +def _reduce_385(val, _values, result) + @context.in_argdef = false + + result +end + +def _reduce_386(val, _values, result) + result = val[1] + + result +end + +def _reduce_387(val, _values, result) + result = val[0].concat(val[2]).concat(val[3]) + + result +end + +def _reduce_388(val, _values, result) + result = val[0].concat(val[1]) + + result +end + +def _reduce_389(val, _values, result) + result = val[0].concat(val[1]) + + result +end + +def _reduce_390(val, _values, result) + result = [ val[0] ] + + result +end + +def _reduce_391(val, _values, result) + result = val[1] + + result +end + +def _reduce_392(val, _values, result) + result = [] + + result +end + +# reduce 393 omitted + +def _reduce_394(val, _values, result) + result = val[0]. + concat(val[2]). + concat(val[4]). + concat(val[5]) + + result +end + +def _reduce_395(val, _values, result) + result = val[0]. + concat(val[2]). + concat(val[4]). + concat(val[6]). + concat(val[7]) + + result +end + +def _reduce_396(val, _values, result) + result = val[0]. + concat(val[2]). + concat(val[3]) + + result +end + +def _reduce_397(val, _values, result) + result = val[0]. + concat(val[2]). + concat(val[4]). + concat(val[5]) + + result +end + +def _reduce_398(val, _values, result) + result = val[0]. + concat(val[2]). + concat(val[3]) + + result +end + +# reduce 399 omitted + +def _reduce_400(val, _values, result) + result = val[0]. + concat(val[2]). + concat(val[4]). + concat(val[5]) + + result +end + +def _reduce_401(val, _values, result) + if val[1].empty? && val[0].size == 1 + result = [@builder.procarg0(val[0][0])] + else + result = val[0].concat(val[1]) + end + + result +end + +def _reduce_402(val, _values, result) + result = val[0]. + concat(val[2]). + concat(val[3]) + + result +end + +def _reduce_403(val, _values, result) + result = val[0]. + concat(val[2]). + concat(val[4]). + concat(val[5]) + + result +end + +def _reduce_404(val, _values, result) + result = val[0]. + concat(val[1]) + + result +end + +def _reduce_405(val, _values, result) + result = val[0]. + concat(val[2]). + concat(val[3]) + + result +end + +def _reduce_406(val, _values, result) + result = val[0]. + concat(val[1]) + + result +end + +def _reduce_407(val, _values, result) + result = val[0]. + concat(val[2]). + concat(val[3]) + + result +end + +# reduce 408 omitted + +def _reduce_409(val, _values, result) + result = @builder.args(nil, [], nil) + + result +end + +def _reduce_410(val, _values, result) + @lexer.state = :expr_value + + result +end + +def _reduce_411(val, _values, result) + @max_numparam_stack.has_ordinary_params! + @current_arg_stack.set(nil) + @context.in_argdef = false + result = @builder.args(val[0], val[1], val[2]) + + result +end + +def _reduce_412(val, _values, result) + @max_numparam_stack.has_ordinary_params! + @current_arg_stack.set(nil) + @context.in_argdef = false + result = @builder.args(val[0], val[1].concat(val[2]), val[3]) + + result +end + +def _reduce_413(val, _values, result) + result = [] + + result +end + +def _reduce_414(val, _values, result) + result = val[2] + + result +end + +def _reduce_415(val, _values, result) + result = [ val[0] ] + + result +end + +def _reduce_416(val, _values, result) + result = val[0] << val[2] + + result +end + +def _reduce_417(val, _values, result) + @static_env.declare val[0][0] + result = @builder.shadowarg(val[0]) + + result +end + +# reduce 418 omitted + +def _reduce_419(val, _values, result) + @static_env.extend_dynamic + @max_numparam_stack.push(static: false) + result = @context.dup + @context.in_lambda = true + + result +end + +def _reduce_420(val, _values, result) + @lexer.cmdarg.push(false) + + result +end + +def _reduce_421(val, _values, result) + lambda_call = @builder.call_lambda(val[0]) + args = @max_numparam_stack.has_numparams? ? @builder.numargs(@max_numparam_stack.top) : val[2] + begin_t, body, end_t = val[4] + + @max_numparam_stack.pop + @static_env.unextend + @lexer.cmdarg.pop + @context.in_lambda = val[1].in_lambda + + result = @builder.block(lambda_call, + begin_t, args, body, end_t) + + result +end + +def _reduce_422(val, _values, result) + @context.in_argdef = false + @max_numparam_stack.has_ordinary_params! + result = @builder.args(val[0], val[1].concat(val[2]), val[3]) + + result +end + +def _reduce_423(val, _values, result) + @context.in_argdef = false + if val[0].any? + @max_numparam_stack.has_ordinary_params! + end + result = @builder.args(nil, val[0], nil) + + result +end + +def _reduce_424(val, _values, result) + result = @context.dup + @context.in_lambda = true + + result +end + +def _reduce_425(val, _values, result) + @context.in_lambda = val[1].in_lambda + result = [ val[0], val[2], val[3] ] + + result +end + +def _reduce_426(val, _values, result) + result = @context.dup + @context.in_lambda = true + + result +end + +def _reduce_427(val, _values, result) + @context.in_lambda = val[1].in_lambda + result = [ val[0], val[2], val[3] ] + + result +end + +def _reduce_428(val, _values, result) + result = @context.dup + @context.in_block = true + + result +end + +def _reduce_429(val, _values, result) + @context.in_block = val[1].in_block + result = [ val[0], *val[2], val[3] ] + + result +end + +def _reduce_430(val, _values, result) + begin_t, block_args, body, end_t = val[1] + result = @builder.block(val[0], + begin_t, block_args, body, end_t) + + result +end + +def _reduce_431(val, _values, result) + lparen_t, args, rparen_t = val[3] + result = @builder.call_method(val[0], val[1], val[2], + lparen_t, args, rparen_t) + + result +end + +def _reduce_432(val, _values, result) + lparen_t, args, rparen_t = val[3] + method_call = @builder.call_method(val[0], val[1], val[2], + lparen_t, args, rparen_t) + + begin_t, args, body, end_t = val[4] + result = @builder.block(method_call, + begin_t, args, body, end_t) + + result +end + +def _reduce_433(val, _values, result) + method_call = @builder.call_method(val[0], val[1], val[2], + nil, val[3], nil) + + begin_t, args, body, end_t = val[4] + result = @builder.block(method_call, + begin_t, args, body, end_t) + + result +end + +def _reduce_434(val, _values, result) + lparen_t, args, rparen_t = val[1] + result = @builder.call_method(nil, nil, val[0], + lparen_t, args, rparen_t) + + result +end + +def _reduce_435(val, _values, result) + lparen_t, args, rparen_t = val[3] + result = @builder.call_method(val[0], val[1], val[2], + lparen_t, args, rparen_t) + + result +end + +def _reduce_436(val, _values, result) + lparen_t, args, rparen_t = val[3] + result = @builder.call_method(val[0], val[1], val[2], + lparen_t, args, rparen_t) + + result +end + +def _reduce_437(val, _values, result) + result = @builder.call_method(val[0], val[1], val[2]) + + result +end + +def _reduce_438(val, _values, result) + lparen_t, args, rparen_t = val[2] + result = @builder.call_method(val[0], val[1], nil, + lparen_t, args, rparen_t) + + result +end + +def _reduce_439(val, _values, result) + lparen_t, args, rparen_t = val[2] + result = @builder.call_method(val[0], val[1], nil, + lparen_t, args, rparen_t) + + result +end + +def _reduce_440(val, _values, result) + lparen_t, args, rparen_t = val[1] + result = @builder.keyword_cmd(:super, val[0], + lparen_t, args, rparen_t) + + result +end + +def _reduce_441(val, _values, result) + result = @builder.keyword_cmd(:zsuper, val[0]) + + result +end + +def _reduce_442(val, _values, result) + result = @builder.index(val[0], val[1], val[2], val[3]) + + result +end + +def _reduce_443(val, _values, result) + result = @context.dup + @context.in_block = true + + result +end + +def _reduce_444(val, _values, result) + @context.in_block = val[1].in_block + result = [ val[0], *val[2], val[3] ] + + result +end + +def _reduce_445(val, _values, result) + result = @context.dup + @context.in_block = true + + result +end + +def _reduce_446(val, _values, result) + @context.in_block = val[1].in_block + result = [ val[0], *val[2], val[3] ] + + result +end + +def _reduce_447(val, _values, result) + @static_env.extend_dynamic + @max_numparam_stack.push(static: false) + + result +end + +def _reduce_448(val, _values, result) + args = @max_numparam_stack.has_numparams? ? @builder.numargs(@max_numparam_stack.top) : val[1] + result = [ args, val[2] ] + + @max_numparam_stack.pop + @static_env.unextend + + result +end + +def _reduce_449(val, _values, result) + @static_env.extend_dynamic + @max_numparam_stack.push(static: false) + + result +end + +def _reduce_450(val, _values, result) + @lexer.cmdarg.push(false) + + result +end + +def _reduce_451(val, _values, result) + args = @max_numparam_stack.has_numparams? ? @builder.numargs(@max_numparam_stack.top) : val[2] + result = [ args, val[3] ] + + @max_numparam_stack.pop + @static_env.unextend + @lexer.cmdarg.pop + + result +end + +def _reduce_452(val, _values, result) + result = [ @builder.when(val[0], val[1], val[2], val[3]), + *val[4] ] + + result +end + +def _reduce_453(val, _values, result) + result = [ val[0] ] + + result +end + +# reduce 454 omitted + +def _reduce_455(val, _values, result) + @lexer.state = :expr_beg + @lexer.command_start = false + @pattern_variables.push + @pattern_hash_keys.push + + result = @context.in_kwarg + @context.in_kwarg = true + + result +end + +def _reduce_456(val, _values, result) + @pattern_variables.pop + @pattern_hash_keys.pop + @context.in_kwarg = val[1] + + result +end + +def _reduce_457(val, _values, result) + result = [ @builder.in_pattern(val[0], *val[2], val[3], val[5]), + *val[6] ] + + result +end + +def _reduce_458(val, _values, result) + result = [ val[0] ] + + result +end + +# reduce 459 omitted + +def _reduce_460(val, _values, result) + result = [ val[0], nil ] + + result +end + +def _reduce_461(val, _values, result) + result = [ val[0], @builder.if_guard(val[1], val[2]) ] + + result +end + +def _reduce_462(val, _values, result) + result = [ val[0], @builder.unless_guard(val[1], val[2]) ] + + result +end + +# reduce 463 omitted + +def _reduce_464(val, _values, result) + # array patterns that end with comma + # like 1, 2, + # must be emitted as `array_pattern_with_tail` + item = @builder.match_with_trailing_comma(val[0], val[1]) + result = @builder.array_pattern(nil, [ item ], nil) + + result +end + +def _reduce_465(val, _values, result) + result = @builder.array_pattern(nil, [val[0]].concat(val[2]), nil) + + result +end + +def _reduce_466(val, _values, result) + result = @builder.find_pattern(nil, val[0], nil) + + result +end + +def _reduce_467(val, _values, result) + result = @builder.array_pattern(nil, val[0], nil) + + result +end + +def _reduce_468(val, _values, result) + result = @builder.hash_pattern(nil, val[0], nil) + + result +end + +# reduce 469 omitted + +def _reduce_470(val, _values, result) + result = @builder.match_as(val[0], val[1], val[2]) + + result +end + +# reduce 471 omitted + +def _reduce_472(val, _values, result) + result = @builder.match_alt(val[0], val[1], val[2]) + + result +end + +# reduce 473 omitted + +def _reduce_474(val, _values, result) + result = val[0] + @pattern_hash_keys.push + + result +end + +def _reduce_475(val, _values, result) + result = val[0] + @pattern_hash_keys.push + + result +end + +# reduce 476 omitted + +# reduce 477 omitted + +def _reduce_478(val, _values, result) + @pattern_hash_keys.pop + pattern = @builder.array_pattern(nil, val[2], nil) + result = @builder.const_pattern(val[0], val[1], pattern, val[3]) + + result +end + +def _reduce_479(val, _values, result) + @pattern_hash_keys.pop + pattern = @builder.find_pattern(nil, val[2], nil) + result = @builder.const_pattern(val[0], val[1], pattern, val[3]) + + result +end + +def _reduce_480(val, _values, result) + @pattern_hash_keys.pop + pattern = @builder.hash_pattern(nil, val[2], nil) + result = @builder.const_pattern(val[0], val[1], pattern, val[3]) + + result +end + +def _reduce_481(val, _values, result) + pattern = @builder.array_pattern(val[1], nil, val[2]) + result = @builder.const_pattern(val[0], val[1], pattern, val[2]) + + result +end + +def _reduce_482(val, _values, result) + @pattern_hash_keys.pop + pattern = @builder.array_pattern(nil, val[2], nil) + result = @builder.const_pattern(val[0], val[1], pattern, val[3]) + + result +end + +def _reduce_483(val, _values, result) + @pattern_hash_keys.pop + pattern = @builder.find_pattern(nil, val[2], nil) + result = @builder.const_pattern(val[0], val[1], pattern, val[3]) + + result +end + +def _reduce_484(val, _values, result) + @pattern_hash_keys.pop + pattern = @builder.hash_pattern(nil, val[2], nil) + result = @builder.const_pattern(val[0], val[1], pattern, val[3]) + + result +end + +def _reduce_485(val, _values, result) + pattern = @builder.array_pattern(val[1], nil, val[2]) + result = @builder.const_pattern(val[0], val[1], pattern, val[2]) + + result +end + +def _reduce_486(val, _values, result) + result = @builder.array_pattern(val[0], val[1], val[2]) + + result +end + +def _reduce_487(val, _values, result) + result = @builder.find_pattern(val[0], val[1], val[2]) + + result +end + +def _reduce_488(val, _values, result) + result = @builder.array_pattern(val[0], [], val[1]) + + result +end + +def _reduce_489(val, _values, result) + @pattern_hash_keys.push + result = @context.in_kwarg + @context.in_kwarg = false + + result +end + +def _reduce_490(val, _values, result) + @pattern_hash_keys.pop + @context.in_kwarg = val[1] + result = @builder.hash_pattern(val[0], val[2], val[3]) + + result +end + +def _reduce_491(val, _values, result) + result = @builder.hash_pattern(val[0], [], val[1]) + + result +end + +def _reduce_492(val, _values, result) + @pattern_hash_keys.push + + result +end + +def _reduce_493(val, _values, result) + @pattern_hash_keys.pop + result = @builder.begin(val[0], val[2], val[3]) + + result +end + +def _reduce_494(val, _values, result) + result = [ val[0] ] + + result +end + +def _reduce_495(val, _values, result) + result = val[0] + + result +end + +def _reduce_496(val, _values, result) + result = [ *val[0], val[1] ] + + result +end + +def _reduce_497(val, _values, result) + match_rest = @builder.match_rest(val[1], val[2]) + result = [ *val[0], match_rest ] + + result +end + +def _reduce_498(val, _values, result) + match_rest = @builder.match_rest(val[1], val[2]) + result = [ *val[0], match_rest, *val[4] ] + + result +end + +def _reduce_499(val, _values, result) + result = [ *val[0], @builder.match_rest(val[1]) ] + + result +end + +def _reduce_500(val, _values, result) + result = [ *val[0], @builder.match_rest(val[1]), *val[3] ] + + result +end + +# reduce 501 omitted + +def _reduce_502(val, _values, result) + # array patterns that end with comma + # like [1, 2,] + # must be emitted as `array_pattern_with_tail` + item = @builder.match_with_trailing_comma(val[0], val[1]) + result = [ item ] + + result +end + +def _reduce_503(val, _values, result) + # array patterns that end with comma + # like [1, 2,] + # must be emitted as `array_pattern_with_tail` + last_item = @builder.match_with_trailing_comma(val[1], val[2]) + result = [ *val[0], last_item ] + + result +end + +def _reduce_504(val, _values, result) + result = [ val[0] ] + + result +end + +def _reduce_505(val, _values, result) + result = [ val[0], *val[2] ] + + result +end + +def _reduce_506(val, _values, result) + result = [ val[0], *val[2], val[4] ] + + result +end + +def _reduce_507(val, _values, result) + result = @builder.match_rest(val[0], val[1]) + + result +end + +def _reduce_508(val, _values, result) + result = @builder.match_rest(val[0]) + + result +end + +def _reduce_509(val, _values, result) + result = [ val[0] ] + + result +end + +def _reduce_510(val, _values, result) + result = [ *val[0], val[2] ] + + result +end + +# reduce 511 omitted + +def _reduce_512(val, _values, result) + result = [ *val[0], *val[2] ] + + result +end + +def _reduce_513(val, _values, result) + result = val[0] + + result +end + +def _reduce_514(val, _values, result) + result = val[0] + + result +end + +def _reduce_515(val, _values, result) + result = val[0] + + result +end + +def _reduce_516(val, _values, result) + result = [ val[0] ] + + result +end + +def _reduce_517(val, _values, result) + result = [ *val[0], val[2] ] + + result +end + +def _reduce_518(val, _values, result) + result = @builder.match_pair(*val[0], val[1]) + + result +end + +def _reduce_519(val, _values, result) + result = @builder.match_label(*val[0]) + + result +end + +def _reduce_520(val, _values, result) + result = [:label, val[0]] + + result +end + +def _reduce_521(val, _values, result) + result = [:quoted, [val[0], val[1], val[2]]] + + result +end + +def _reduce_522(val, _values, result) + result = [ @builder.match_rest(val[0], val[1]) ] + + result +end + +def _reduce_523(val, _values, result) + result = [ @builder.match_rest(val[0], nil) ] + + result +end + +def _reduce_524(val, _values, result) + result = [ @builder.match_nil_pattern(val[0], val[1]) ] + + result +end + +# reduce 525 omitted + +# reduce 526 omitted + +# reduce 527 omitted + +def _reduce_528(val, _values, result) + result = @builder.range_inclusive(val[0], val[1], val[2]) + + result +end + +def _reduce_529(val, _values, result) + result = @builder.range_exclusive(val[0], val[1], val[2]) + + result +end + +def _reduce_530(val, _values, result) + result = @builder.range_inclusive(val[0], val[1], nil) + + result +end + +def _reduce_531(val, _values, result) + result = @builder.range_exclusive(val[0], val[1], nil) + + result +end + +# reduce 532 omitted + +# reduce 533 omitted + +# reduce 534 omitted + +def _reduce_535(val, _values, result) + result = @builder.range_inclusive(nil, val[0], val[1]) + + result +end + +def _reduce_536(val, _values, result) + result = @builder.range_exclusive(nil, val[0], val[1]) + + result +end + +# reduce 537 omitted + +# reduce 538 omitted + +# reduce 539 omitted + +# reduce 540 omitted + +# reduce 541 omitted + +# reduce 542 omitted + +# reduce 543 omitted + +# reduce 544 omitted + +def _reduce_545(val, _values, result) + result = @builder.accessible(val[0]) + + result +end + +# reduce 546 omitted + +def _reduce_547(val, _values, result) + result = @builder.assignable(@builder.match_var(val[0])) + + result +end + +def _reduce_548(val, _values, result) + name = val[1][0] + unless static_env.declared?(name) + diagnostic :error, :undefined_lvar, { :name => name }, val[1] + end + + lvar = @builder.accessible(@builder.ident(val[1])) + result = @builder.pin(val[0], lvar) + + result +end + +def _reduce_549(val, _values, result) + non_lvar = @builder.accessible(val[1]) + result = @builder.pin(val[0], non_lvar) + + result +end + +def _reduce_550(val, _values, result) + expr = @builder.begin(val[1], val[2], val[3]) + result = @builder.pin(val[0], expr) + + result +end + +def _reduce_551(val, _values, result) + result = @builder.const_global(val[0], val[1]) + + result +end + +def _reduce_552(val, _values, result) + result = @builder.const_fetch(val[0], val[1], val[2]) + + result +end + +def _reduce_553(val, _values, result) + result = @builder.const(val[0]) + + result +end + +def _reduce_554(val, _values, result) + assoc_t, exc_var = val[2] + + if val[1] + exc_list = @builder.array(nil, val[1], nil) + end + + result = [ @builder.rescue_body(val[0], + exc_list, assoc_t, exc_var, + val[3], val[4]), + *val[5] ] + + result +end + +def _reduce_555(val, _values, result) + result = [] + + result +end + +def _reduce_556(val, _values, result) + result = [ val[0] ] + + result +end + +# reduce 557 omitted + +# reduce 558 omitted + +def _reduce_559(val, _values, result) + result = [ val[0], val[1] ] + + result +end + +# reduce 560 omitted + +def _reduce_561(val, _values, result) + result = [ val[0], val[1] ] + + result +end + +# reduce 562 omitted + +# reduce 563 omitted + +# reduce 564 omitted + +def _reduce_565(val, _values, result) + result = @builder.string_compose(nil, val[0], nil) + + result +end + +def _reduce_566(val, _values, result) + result = [ val[0] ] + + result +end + +def _reduce_567(val, _values, result) + result = val[0] << val[1] + + result +end + +def _reduce_568(val, _values, result) + string = @builder.string_compose(val[0], val[1], val[2]) + result = @builder.dedent_string(string, @lexer.dedent_level) + + result +end + +def _reduce_569(val, _values, result) + string = @builder.string(val[0]) + result = @builder.dedent_string(string, @lexer.dedent_level) + + result +end + +def _reduce_570(val, _values, result) + result = @builder.character(val[0]) + + result +end + +def _reduce_571(val, _values, result) + string = @builder.xstring_compose(val[0], val[1], val[2]) + result = @builder.dedent_string(string, @lexer.dedent_level) + + result +end + +def _reduce_572(val, _values, result) + opts = @builder.regexp_options(val[3]) + result = @builder.regexp_compose(val[0], val[1], val[2], opts) + + result +end + +def _reduce_573(val, _values, result) + result = @builder.words_compose(val[0], val[1], val[2]) + + result +end + +def _reduce_574(val, _values, result) + result = [] + + result +end + +def _reduce_575(val, _values, result) + result = val[0] << @builder.word(val[1]) + + result +end + +def _reduce_576(val, _values, result) + result = [ val[0] ] + + result +end + +def _reduce_577(val, _values, result) + result = val[0] << val[1] + + result +end + +def _reduce_578(val, _values, result) + result = @builder.symbols_compose(val[0], val[1], val[2]) + + result +end + +def _reduce_579(val, _values, result) + result = [] + + result +end + +def _reduce_580(val, _values, result) + result = val[0] << @builder.word(val[1]) + + result +end + +def _reduce_581(val, _values, result) + result = @builder.words_compose(val[0], val[1], val[2]) + + result +end + +def _reduce_582(val, _values, result) + result = @builder.symbols_compose(val[0], val[1], val[2]) + + result +end + +def _reduce_583(val, _values, result) + result = [] + + result +end + +def _reduce_584(val, _values, result) + result = val[0] << @builder.string_internal(val[1]) + + result +end + +def _reduce_585(val, _values, result) + result = [] + + result +end + +def _reduce_586(val, _values, result) + result = val[0] << @builder.symbol_internal(val[1]) + + result +end + +def _reduce_587(val, _values, result) + result = [] + + result +end + +def _reduce_588(val, _values, result) + result = val[0] << val[1] + + result +end + +def _reduce_589(val, _values, result) + result = [] + + result +end + +def _reduce_590(val, _values, result) + result = val[0] << val[1] + + result +end + +def _reduce_591(val, _values, result) + result = [] + + result +end + +def _reduce_592(val, _values, result) + result = val[0] << val[1] + + result +end + +def _reduce_593(val, _values, result) + result = @builder.string_internal(val[0]) + + result +end + +def _reduce_594(val, _values, result) + result = val[1] + + result +end + +def _reduce_595(val, _values, result) + @lexer.cmdarg.push(false) + @lexer.cond.push(false) + + result +end + +def _reduce_596(val, _values, result) + @lexer.cmdarg.pop + @lexer.cond.pop + + result = @builder.begin(val[0], val[2], val[3]) + + result +end + +def _reduce_597(val, _values, result) + result = @builder.gvar(val[0]) + + result +end + +def _reduce_598(val, _values, result) + result = @builder.ivar(val[0]) + + result +end + +def _reduce_599(val, _values, result) + result = @builder.cvar(val[0]) + + result +end + +# reduce 600 omitted + +# reduce 601 omitted + +# reduce 602 omitted + +def _reduce_603(val, _values, result) + @lexer.state = :expr_end + result = @builder.symbol(val[0]) + + result +end + +def _reduce_604(val, _values, result) + @lexer.state = :expr_end + result = @builder.symbol_compose(val[0], val[1], val[2]) + + result +end + +def _reduce_605(val, _values, result) + result = val[0] + + result +end + +def _reduce_606(val, _values, result) + if @builder.respond_to? :negate + # AST builder interface compatibility + result = @builder.negate(val[0], val[1]) + else + result = @builder.unary_num(val[0], val[1]) + end + + result +end + +def _reduce_607(val, _values, result) + @lexer.state = :expr_end + result = @builder.integer(val[0]) + + result +end + +def _reduce_608(val, _values, result) + @lexer.state = :expr_end + result = @builder.float(val[0]) + + result +end + +def _reduce_609(val, _values, result) + @lexer.state = :expr_end + result = @builder.rational(val[0]) + + result +end + +def _reduce_610(val, _values, result) + @lexer.state = :expr_end + result = @builder.complex(val[0]) + + result +end + +def _reduce_611(val, _values, result) + result = @builder.ivar(val[0]) + + result +end + +def _reduce_612(val, _values, result) + result = @builder.gvar(val[0]) + + result +end + +def _reduce_613(val, _values, result) + result = @builder.cvar(val[0]) + + result +end + +def _reduce_614(val, _values, result) + result = @builder.ident(val[0]) + + result +end + +def _reduce_615(val, _values, result) + result = @builder.ivar(val[0]) + + result +end + +def _reduce_616(val, _values, result) + result = @builder.gvar(val[0]) + + result +end + +def _reduce_617(val, _values, result) + result = @builder.const(val[0]) + + result +end + +def _reduce_618(val, _values, result) + result = @builder.cvar(val[0]) + + result +end + +def _reduce_619(val, _values, result) + result = @builder.nil(val[0]) + + result +end + +def _reduce_620(val, _values, result) + result = @builder.self(val[0]) + + result +end + +def _reduce_621(val, _values, result) + result = @builder.true(val[0]) + + result +end + +def _reduce_622(val, _values, result) + result = @builder.false(val[0]) + + result +end + +def _reduce_623(val, _values, result) + result = @builder.__FILE__(val[0]) + + result +end + +def _reduce_624(val, _values, result) + result = @builder.__LINE__(val[0]) + + result +end + +def _reduce_625(val, _values, result) + result = @builder.__ENCODING__(val[0]) + + result +end + +def _reduce_626(val, _values, result) + result = @builder.accessible(val[0]) + + result +end + +def _reduce_627(val, _values, result) + result = @builder.accessible(val[0]) + + result +end + +def _reduce_628(val, _values, result) + result = @builder.assignable(val[0]) + + result +end + +def _reduce_629(val, _values, result) + result = @builder.assignable(val[0]) + + result +end + +def _reduce_630(val, _values, result) + result = @builder.nth_ref(val[0]) + + result +end + +def _reduce_631(val, _values, result) + result = @builder.back_ref(val[0]) + + result +end + +def _reduce_632(val, _values, result) + @lexer.state = :expr_value + + result +end + +def _reduce_633(val, _values, result) + result = [ val[0], val[2] ] + + result +end + +def _reduce_634(val, _values, result) + result = nil + + result +end + +# reduce 635 omitted + +def _reduce_636(val, _values, result) + @context.in_argdef = false + result = @builder.args(nil, [], nil) + + result +end + +def _reduce_637(val, _values, result) + result = @builder.args(val[0], val[1], val[2]) + + @lexer.state = :expr_value + @context.in_argdef = false + + result +end + +# reduce 638 omitted + +def _reduce_639(val, _values, result) + result = @context.dup + @context.in_kwarg = true + @context.in_argdef = true + + result +end + +def _reduce_640(val, _values, result) + @context.in_kwarg = val[0].in_kwarg + @context.in_argdef = false + result = @builder.args(nil, val[1], nil) + + result +end + +def _reduce_641(val, _values, result) + result = val[0].concat(val[2]).concat(val[3]) + + result +end + +def _reduce_642(val, _values, result) + result = val[0].concat(val[1]) + + result +end + +def _reduce_643(val, _values, result) + result = val[0].concat(val[1]) + + result +end + +def _reduce_644(val, _values, result) + result = [ val[0] ] + + result +end + +def _reduce_645(val, _values, result) + @static_env.declare_forward_args + result = [ @builder.forward_arg(val[0]) ] + + result +end + +def _reduce_646(val, _values, result) + result = val[1] + + result +end + +def _reduce_647(val, _values, result) + result = [] + + result +end + +def _reduce_648(val, _values, result) + result = val[0]. + concat(val[2]). + concat(val[4]). + concat(val[5]) + + result +end + +def _reduce_649(val, _values, result) + result = val[0]. + concat(val[2]). + concat(val[4]). + concat(val[6]). + concat(val[7]) + + result +end + +def _reduce_650(val, _values, result) + result = val[0]. + concat(val[2]). + concat(val[3]) + + result +end + +def _reduce_651(val, _values, result) + result = val[0]. + concat(val[2]). + concat(val[4]). + concat(val[5]) + + result +end + +def _reduce_652(val, _values, result) + result = val[0]. + concat(val[2]). + concat(val[3]) + + result +end + +def _reduce_653(val, _values, result) + result = val[0]. + concat(val[2]). + concat(val[4]). + concat(val[5]) + + result +end + +def _reduce_654(val, _values, result) + result = val[0]. + concat(val[1]) + + result +end + +def _reduce_655(val, _values, result) + result = val[0]. + concat(val[2]). + concat(val[3]) + + result +end + +def _reduce_656(val, _values, result) + result = val[0]. + concat(val[2]). + concat(val[4]). + concat(val[5]) + + result +end + +def _reduce_657(val, _values, result) + result = val[0]. + concat(val[1]) + + result +end + +def _reduce_658(val, _values, result) + result = val[0]. + concat(val[2]). + concat(val[3]) + + result +end + +def _reduce_659(val, _values, result) + result = val[0]. + concat(val[1]) + + result +end + +def _reduce_660(val, _values, result) + result = val[0]. + concat(val[2]). + concat(val[3]) + + result +end + +def _reduce_661(val, _values, result) + result = val[0] + + result +end + +def _reduce_662(val, _values, result) + result = [] + + result +end + +def _reduce_663(val, _values, result) + result = val[0] + + result +end + +def _reduce_664(val, _values, result) + diagnostic :error, :argument_const, nil, val[0] + + result +end + +def _reduce_665(val, _values, result) + diagnostic :error, :argument_ivar, nil, val[0] + + result +end + +def _reduce_666(val, _values, result) + diagnostic :error, :argument_gvar, nil, val[0] + + result +end + +def _reduce_667(val, _values, result) + diagnostic :error, :argument_cvar, nil, val[0] + + result +end + +# reduce 668 omitted + +def _reduce_669(val, _values, result) + @static_env.declare val[0][0] + + @max_numparam_stack.has_ordinary_params! + + result = val[0] + + result +end + +def _reduce_670(val, _values, result) + @current_arg_stack.set(val[0][0]) + result = val[0] + + result +end + +def _reduce_671(val, _values, result) + @current_arg_stack.set(0) + result = @builder.arg(val[0]) + + result +end + +def _reduce_672(val, _values, result) + result = @builder.multi_lhs(val[0], val[1], val[2]) + + result +end + +def _reduce_673(val, _values, result) + result = [ val[0] ] + + result +end + +def _reduce_674(val, _values, result) + result = val[0] << val[2] + + result +end + +def _reduce_675(val, _values, result) + check_kwarg_name(val[0]) + + @static_env.declare val[0][0] + + @max_numparam_stack.has_ordinary_params! + + @current_arg_stack.set(val[0][0]) + @context.in_argdef = false + + result = val[0] + + result +end + +def _reduce_676(val, _values, result) + @current_arg_stack.set(nil) + @context.in_argdef = true + result = @builder.kwoptarg(val[0], val[1]) + + result +end + +def _reduce_677(val, _values, result) + @current_arg_stack.set(nil) + @context.in_argdef = true + result = @builder.kwarg(val[0]) + + result +end + +def _reduce_678(val, _values, result) + @context.in_argdef = true + result = @builder.kwoptarg(val[0], val[1]) + + result +end + +def _reduce_679(val, _values, result) + @context.in_argdef = true + result = @builder.kwarg(val[0]) + + result +end + +def _reduce_680(val, _values, result) + result = [ val[0] ] + + result +end + +def _reduce_681(val, _values, result) + result = val[0] << val[2] + + result +end + +def _reduce_682(val, _values, result) + result = [ val[0] ] + + result +end + +def _reduce_683(val, _values, result) + result = val[0] << val[2] + + result +end + +# reduce 684 omitted + +# reduce 685 omitted + +def _reduce_686(val, _values, result) + result = [ @builder.kwnilarg(val[0], val[1]) ] + + result +end + +def _reduce_687(val, _values, result) + @static_env.declare val[1][0] + + result = [ @builder.kwrestarg(val[0], val[1]) ] + + result +end + +def _reduce_688(val, _values, result) + result = [ @builder.kwrestarg(val[0]) ] + + result +end + +def _reduce_689(val, _values, result) + @current_arg_stack.set(0) + @context.in_argdef = true + result = @builder.optarg(val[0], val[1], val[2]) + + result +end + +def _reduce_690(val, _values, result) + @current_arg_stack.set(0) + @context.in_argdef = true + result = @builder.optarg(val[0], val[1], val[2]) + + result +end + +def _reduce_691(val, _values, result) + result = [ val[0] ] + + result +end + +def _reduce_692(val, _values, result) + result = val[0] << val[2] + + result +end + +def _reduce_693(val, _values, result) + result = [ val[0] ] + + result +end + +def _reduce_694(val, _values, result) + result = val[0] << val[2] + + result +end + +# reduce 695 omitted + +# reduce 696 omitted + +def _reduce_697(val, _values, result) + @static_env.declare val[1][0] + + result = [ @builder.restarg(val[0], val[1]) ] + + result +end + +def _reduce_698(val, _values, result) + result = [ @builder.restarg(val[0]) ] + + result +end + +# reduce 699 omitted + +# reduce 700 omitted + +def _reduce_701(val, _values, result) + @static_env.declare val[1][0] + + result = @builder.blockarg(val[0], val[1]) + + result +end + +def _reduce_702(val, _values, result) + @static_env.declare_anonymous_blockarg + + result = @builder.blockarg(val[0], nil) + + result +end + +def _reduce_703(val, _values, result) + result = [ val[1] ] + + result +end + +def _reduce_704(val, _values, result) + result = [] + + result +end + +# reduce 705 omitted + +def _reduce_706(val, _values, result) + result = val[1] + + result +end + +def _reduce_707(val, _values, result) + result = [] + + result +end + +# reduce 708 omitted + +def _reduce_709(val, _values, result) + result = [ val[0] ] + + result +end + +def _reduce_710(val, _values, result) + result = val[0] << val[2] + + result +end + +def _reduce_711(val, _values, result) + result = @builder.pair(val[0], val[1], val[2]) + + result +end + +def _reduce_712(val, _values, result) + result = @builder.pair_keyword(val[0], val[1]) + + result +end + +def _reduce_713(val, _values, result) + result = @builder.pair_label(val[0]) + + result +end + +def _reduce_714(val, _values, result) + result = @builder.pair_quoted(val[0], val[1], val[2], val[3]) + + result +end + +def _reduce_715(val, _values, result) + result = @builder.kwsplat(val[0], val[1]) + + result +end + +# reduce 716 omitted + +# reduce 717 omitted + +# reduce 718 omitted + +# reduce 719 omitted + +# reduce 720 omitted + +# reduce 721 omitted + +# reduce 722 omitted + +# reduce 723 omitted + +# reduce 724 omitted + +# reduce 725 omitted + +# reduce 726 omitted + +# reduce 727 omitted + +def _reduce_728(val, _values, result) + result = [:dot, val[0][1]] + + result +end + +def _reduce_729(val, _values, result) + result = [:anddot, val[0][1]] + + result +end + +# reduce 730 omitted + +# reduce 731 omitted + +# reduce 732 omitted + +# reduce 733 omitted + +def _reduce_734(val, _values, result) + result = val[1] + + result +end + +def _reduce_735(val, _values, result) + result = val[1] + + result +end + +def _reduce_736(val, _values, result) + result = val[1] + + result +end + +# reduce 737 omitted + +# reduce 738 omitted + +# reduce 739 omitted + +def _reduce_740(val, _values, result) + yyerrok + + result +end + +# reduce 741 omitted + +# reduce 742 omitted + +# reduce 743 omitted + +def _reduce_744(val, _values, result) + result = nil + + result +end + +def _reduce_none(val, _values, result) + val[0] +end + + end # class Ruby31 + end # module Parser diff --git a/vendor/bundle/ruby/3.1.0/gems/parser-3.1.2.0/lib/parser/ruby32.rb b/vendor/bundle/ruby/3.1.0/gems/parser-3.1.2.0/lib/parser/ruby32.rb new file mode 100644 index 000000000..d75b3aecc --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/parser-3.1.2.0/lib/parser/ruby32.rb @@ -0,0 +1,8334 @@ +# -*- encoding:utf-8; warn-indent:false; frozen_string_literal: true -*- +# +# DO NOT MODIFY!!!! +# This file is automatically generated by Racc 1.4.15 +# from Racc grammer file "". +# + +require 'racc/parser.rb' + + +require 'parser' + +module Parser + class Ruby32 < Parser::Base + + + def version + 32 + end + + def default_encoding + Encoding::UTF_8 + end + + def endless_method_name(name_t) + if !%w[=== == != <= >=].include?(name_t[0]) && name_t[0].end_with?('=') + diagnostic :error, :endless_setter, nil, name_t + end + end + + def local_push + @static_env.extend_static + @lexer.cmdarg.push(false) + @lexer.cond.push(false) + @max_numparam_stack.push(static: true) + end + + def local_pop + @static_env.unextend + @lexer.cmdarg.pop + @lexer.cond.pop + @max_numparam_stack.pop + end + + def try_declare_numparam(node) + name = node.children[0] + + if name =~ /\A_[1-9]\z/ && !static_env.declared?(name) && @context.in_dynamic_block? + # definitely an implicit param + location = node.loc.expression + + if max_numparam_stack.has_ordinary_params? + diagnostic :error, :ordinary_param_defined, nil, [nil, location] + end + + raw_max_numparam_stack = max_numparam_stack.stack.dup + # ignore current block scope + raw_max_numparam_stack.pop + + raw_max_numparam_stack.reverse_each do |outer_scope| + if outer_scope[:static] + # found an outer scope that can't have numparams + # like def/class/etc + break + else + outer_scope_has_numparams = outer_scope[:value] > 0 + + if outer_scope_has_numparams + diagnostic :error, :numparam_used_in_outer_scope, nil, [nil, location] + else + # for now it's ok, but an outer scope can also be a block + # like proc { _1; proc { proc { proc { _2 }} }} + # with numparams, so we need to continue + end + end + end + + static_env.declare(name) + max_numparam_stack.register(name[1].to_i) + + true + else + false + end + end +##### State transition tables begin ### + +clist = [ +'-615,-116,-118,-124,1036,-121,830,-615,-615,-615,-728,-120,-615,-615', +'-615,927,-615,311,622,239,-122,1212,221,222,-615,311,-615,-615,-615', +'663,311,-117,-102,665,698,-118,-615,-615,-123,-615,-615,-615,-615,-615', +'-88,894,240,-728,-119,-620,622,622,699,-122,622,835,-620,894,240,629', +'240,-121,-124,-118,240,622,-615,-615,-615,-615,-615,-615,-615,-615,-615', +'-615,-615,-615,-615,-615,-119,622,-615,-615,-615,-120,-615,-615,-714', +'306,-615,-116,-123,-615,-615,662,-615,-715,-615,664,-615,-626,-615,-615', +'310,-615,-615,-615,-615,-615,126,-615,310,-615,-620,125,240,310,-715', +'-116,-118,-124,-117,-121,-116,-118,-124,-615,-121,-120,-615,-615,-615', +'-615,-120,-615,126,-615,-122,-719,1002,125,-615,-122,-109,-615,-719', +'-719,-719,-117,-714,-719,-719,-719,-117,-719,-123,-110,-112,122,-116', +'-123,-113,-719,-719,-719,-719,-719,126,126,-112,-115,126,125,125,-719', +'-719,125,-719,-719,-719,-719,-719,126,104,105,991,-110,125,-111,-728', +'-109,927,135,-111,221,222,-627,-119,126,-107,-114,524,-119,125,-719', +'-719,-719,-719,-719,-719,-719,-719,-719,-719,-719,-719,-719,-719,221', +'222,-719,-719,-719,-112,923,-719,927,218,-719,240,-108,-719,-719,233', +'-719,-617,-719,926,-719,602,-719,-719,-617,-719,-719,-719,-719,-719', +'1001,-719,-719,-719,-110,-714,-111,-117,-109,650,104,105,-124,106,107', +'-112,219,-719,-112,-618,-719,-719,-719,-719,-509,-719,-618,-719,237', +'-719,-112,629,-719,220,921,-120,-719,-719,-719,835,240,-740,-719,-719', +'-110,-719,-111,-110,-109,-111,-123,-109,-617,-719,-719,221,222,311,922', +'-110,223,-111,233,-109,240,-719,-719,300,-719,-719,-719,-719,-719,652', +'651,648,698,493,-619,490,489,488,498,491,-618,-619,877,-124,106,107', +'1064,684,501,-119,950,-719,-719,-719,-719,-719,-719,-719,-719,-719,-719', +'-719,-719,-719,-719,685,237,-719,-719,-719,496,690,-719,-121,-740,-719', +'650,306,-719,506,505,509,508,-719,361,-719,502,-719,-719,650,-719,-719', +'-719,-719,-719,-320,-719,-719,-719,-619,310,-118,-320,-320,-320,126', +'-119,-320,-320,-320,125,-320,-719,-115,264,-719,-719,90,-719,-320,-719', +'-320,-320,-320,-121,-124,487,-719,233,91,-120,-320,-320,362,-320,-320', +'-320,-320,-320,92,652,651,648,233,126,650,261,240,650,125,263,262,227', +'652,651,653,635,802,431,304,961,-320,-320,-320,-320,-320,-320,-320,-320', +'-320,-320,-320,-320,-320,-320,126,-623,-320,-320,-320,125,924,-320,-623', +'-740,-320,472,650,-320,-320,650,-320,650,-320,-633,-320,512,-320,-320', +'-740,-320,-320,-320,-320,-320,650,-320,-612,-320,652,651,657,652,651', +'-612,-612,-612,228,523,-612,-612,-612,-320,-612,525,-320,-320,-320,-320', +'1064,-320,-612,-320,-612,-612,-612,614,-320,635,616,-122,-623,961,-612', +'-612,526,-612,-612,-612,-612,-612,652,651,239,652,651,652,651,655,650', +'428,861,126,933,863,430,429,125,929,652,651,648,930,-612,-612,-612,-612', +'-612,-612,-612,-612,-612,-612,-612,-612,-612,-612,560,877,-612,-612', +'-612,650,-612,-612,221,222,-612,635,227,-612,-612,636,-612,-612,-612', +'304,-612,572,-612,-612,-612,-612,-612,-612,-612,-612,126,-612,685,-612', +'574,125,652,651,666,493,576,490,489,488,498,491,684,-612,-109,-615,-612', +'-612,-612,-612,501,-612,-615,-612,126,-719,-118,614,-612,125,616,-612', +'-719,-719,-719,652,651,661,-719,-719,-624,-719,496,228,135,-112,-87', +'-624,-612,-719,-719,506,505,509,508,240,-624,-121,502,-110,240,-719', +'-719,1196,-719,-719,-719,-719,-719,614,587,-119,616,493,-320,490,489', +'488,498,491,-615,-320,-622,588,240,595,-715,315,501,-622,-320,-719,-719', +'-719,-719,-719,-719,-719,-719,-719,-719,-719,-719,-719,-719,-624,-627', +'-719,-719,-719,496,690,-719,614,602,-719,613,-621,-719,506,505,509,508', +'-719,-621,-719,502,-719,-719,240,-719,-719,-719,-719,-719,-320,-719', +'-719,-719,-320,221,222,-320,-320,-320,1149,1150,-622,-320,-320,233,-320', +'-719,-108,233,-719,-719,306,-111,-320,-719,-114,951,952,599,-117,487', +'-719,-626,605,-120,-320,-320,-123,-320,-320,-320,-320,-320,986,894,264', +'-621,493,-625,490,489,488,498,491,1159,-625,490,489,488,608,491,240', +'501,617,-625,-320,-320,-320,-320,-320,-320,-320,-320,-320,-320,-320', +'-320,-320,-320,-107,618,-320,-320,-320,496,689,-320,986,894,-320,576', +'-116,-320,506,505,509,508,-320,629,-320,502,-320,-320,420,-320,-320', +'-320,-320,-320,-320,-320,633,-320,-625,509,508,-320,-320,-320,281,282', +'634,-320,-320,642,-320,-320,667,670,-320,-320,671,-320,-320,-320,-293', +'955,673,959,958,487,-320,960,674,-122,-320,-320,678,-320,-320,-320,-320', +'-320,240,682,280,279,493,227,490,489,488,498,491,493,594,490,489,488', +'683,491,306,501,957,592,-320,-320,-320,-320,-320,-320,-320,-320,-320', +'-320,-320,-320,-320,-320,696,697,-320,-320,-320,496,689,-320,240,701', +'-320,704,714,-320,506,505,509,508,-320,705,-320,502,-320,-320,707,-320', +'-320,-320,-320,-320,756,-320,709,-320,228,-385,-311,721,722,726,501', +'227,227,-311,756,728,734,-320,604,1164,-320,-320,-311,-113,501,-320', +'227,522,1162,735,264,487,-320,1187,264,-122,7,81,82,83,11,65,640,264', +'264,71,72,240,502,790,75,-715,73,74,76,35,36,79,80,240,1057,240,502', +'240,84,33,32,114,113,115,116,-311,-102,23,1057,805,228,228,240,10,53', +'9,12,118,117,119,108,64,110,109,111,228,112,120,121,227,104,105,49,50', +'48,-356,632,-615,608,227,816,821,-356,240,-615,630,638,823,826,-715', +'831,-356,832,-615,45,640,836,38,860,864,66,67,227,865,68,-294,40,878', +'560,1187,52,560,-715,890,264,894,855,856,640,24,857,120,121,912,102', +'90,93,94,915,95,97,96,98,916,228,240,919,91,101,240,-356,928,-615,945', +'228,85,261,92,106,107,263,262,46,47,333,81,82,83,11,65,946,947,963,71', +'72,965,300,228,75,-719,73,74,76,35,36,79,80,129,130,131,132,133,84,33', +'32,114,113,115,116,971,493,23,490,489,488,973,491,10,53,335,12,118,117', +'119,108,64,110,109,111,975,112,120,121,227,104,105,49,50,48,227,677', +'-719,574,-321,576,816,226,714,-719,675,-321,240,306,-714,306,224,718', +'-719,45,-321,816,38,264,894,66,67,227,988,68,989,40,240,240,521,52,493', +'-719,490,489,488,999,491,522,24,240,-295,240,1010,102,90,93,94,1014', +'95,97,96,98,-293,228,1018,704,91,101,699,228,1021,-719,1023,-321,85', +'1025,92,106,107,1027,1027,46,47,333,81,82,83,11,65,240,776,240,71,72', +'240,1055,228,75,-714,73,74,76,35,36,79,80,1058,927,498,973,1070,84,33', +'32,114,113,115,116,501,1159,23,490,489,488,240,491,10,53,335,12,118', +'117,119,108,64,110,109,111,816,112,120,121,-321,104,105,49,50,48,-320', +'-321,-612,509,508,1087,1089,-320,502,-612,-321,1094,-715,1095,-714,1100', +'-320,1101,-612,45,1102,-296,38,1115,1116,66,67,1117,240,68,240,40,240', +'240,240,52,240,-714,129,130,131,132,133,498,24,927,1124,1125,240,102', +'90,93,94,501,95,97,96,98,1129,-321,1130,1132,91,101,704,-320,1135,-612', +'1138,1140,85,1142,92,106,107,240,-385,46,47,333,81,82,83,11,65,1154', +'509,508,71,72,1165,502,1166,75,1027,73,74,76,35,36,79,80,256,1027,1027', +'1185,1188,84,33,32,114,113,115,116,1193,1194,23,129,130,131,132,133', +'10,53,335,12,118,117,119,108,64,110,109,111,696,112,120,121,1116,104', +'105,49,50,48,264,268,269,270,271,281,282,276,277,272,273,1204,257,258', +'1204,704,274,275,1206,45,1208,255,38,1210,1212,66,67,1212,240,68,1027', +'40,261,-715,267,52,263,262,-714,259,260,280,279,265,24,266,1229,1212', +'1212,102,90,93,94,1212,95,97,96,98,3,,,,91,101,,278,,,,,85,,92,106,107', +',,46,47,333,81,82,83,11,65,,,,71,72,,,,75,,73,74,76,35,36,79,80,129', +'130,131,132,133,84,33,32,114,113,115,116,,,23,,,,,679,10,53,335,12,118', +'117,119,108,64,110,109,111,,112,120,121,,104,105,49,50,48,264,268,269', +'270,271,281,282,276,277,272,273,,257,258,,,274,275,,45,,,38,,,66,67', +',,68,,40,261,,267,52,263,262,,259,260,280,279,265,24,266,,,,102,90,93', +'94,,95,97,96,98,,,,,91,101,,278,,-265,,,85,,92,106,107,,,46,47,333,81', +'82,83,11,65,,,,71,72,,,,75,,73,74,76,35,36,79,80,,,,,,84,33,32,114,113', +'115,116,,,23,,,,,679,10,53,335,12,118,117,119,108,64,110,109,111,,112', +'120,121,,104,105,49,50,48,264,268,269,270,271,281,282,276,277,272,273', +',257,258,,,274,275,,45,,,337,,,66,67,,,68,,40,261,,267,52,263,262,,259', +'260,280,279,265,24,266,,,,102,90,93,94,,95,97,96,98,,,,,91,101,,278', +',,,,85,,92,106,107,,,46,47,333,81,82,83,11,65,,,,71,72,,,,75,,73,74', +'76,35,36,79,80,,,,,,84,33,32,114,113,115,116,,,23,,,,,920,10,53,335', +'12,118,117,119,108,64,110,109,111,,112,120,121,,104,105,49,50,48,264', +'268,269,270,271,281,282,276,277,272,273,,257,258,,,274,275,,45,,,38', +',,66,67,,,68,,40,261,,267,52,263,262,,259,260,280,279,265,24,266,,,', +'102,90,93,94,,95,97,96,98,,,,,91,101,,278,,,,,85,,92,106,107,,,46,47', +'333,81,82,83,11,65,,,,71,72,,,,75,,73,74,76,35,36,79,80,,,,,,84,33,32', +'114,113,115,116,,,23,,,,,891,10,53,335,12,118,117,119,108,64,110,109', +'111,,112,120,121,,104,105,49,50,48,264,268,269,270,271,281,282,276,277', +'272,273,,257,258,,,274,275,,45,,,38,,,66,67,,,68,,40,261,,267,52,263', +'262,,259,260,280,279,265,24,266,,,,102,90,93,94,,95,97,96,98,,,,,91', +'101,,278,,,,,85,,92,106,107,,,46,47,333,81,82,83,11,65,,,,71,72,,,,75', +',73,74,76,35,36,79,80,,,,,,84,33,32,114,113,115,116,,,23,,,,,,10,53', +'335,12,118,117,119,108,64,110,109,111,,112,120,121,,104,105,49,50,48', +'264,268,269,270,271,281,282,276,277,272,273,,257,258,,,274,275,,45,', +',38,,,66,67,,,68,,40,261,,267,52,263,262,,259,260,280,279,265,24,266', +',,,102,90,93,94,,95,97,96,98,,,,,91,101,,278,,,,,85,,92,106,107,,,46', +'47,333,81,82,83,11,65,,,,71,72,,,,75,,73,74,76,35,36,79,80,,,,,,84,33', +'32,114,113,115,116,,,23,,,,,,10,53,335,12,118,117,119,108,64,110,109', +'111,,112,120,121,,104,105,49,50,48,264,268,269,270,271,281,282,276,277', +'272,273,,257,258,,,274,275,,45,,,38,,,66,67,,,68,,40,261,,267,52,263', +'262,,259,260,280,279,265,24,266,,,,102,90,93,94,,95,97,96,98,,,,,91', +'101,,278,,,,,85,,92,106,107,,,46,47,333,81,82,83,11,65,,,,71,72,,,,75', +',73,74,76,35,36,79,80,,,,,,84,33,32,114,113,115,116,,,23,,,,,,10,53', +'335,12,118,117,119,108,64,110,109,111,,112,120,121,,104,105,49,50,48', +'264,268,269,270,271,281,282,276,277,272,273,,257,258,,,274,275,,45,', +',38,,,66,67,,,68,,40,261,,267,52,263,262,,259,260,280,279,265,24,266', +',,,102,90,93,94,,95,97,96,98,,,,,91,101,,278,,,,,85,,92,106,107,,,46', +'47,333,81,82,83,11,65,,,,71,72,,,,75,,73,74,76,35,36,79,80,,,,,,84,33', +'32,114,113,115,116,,,23,,,,,,10,53,335,12,118,117,119,108,64,110,109', +'111,,112,120,121,,104,105,49,50,48,264,268,269,270,271,281,282,276,277', +'272,273,,257,258,,,274,275,,45,,,38,,,66,67,,,68,,40,261,,267,52,263', +'262,,259,260,280,279,265,24,266,,,,102,90,93,94,,95,97,96,98,,,,,91', +'101,,278,,,,,85,,92,106,107,,,46,47,333,81,82,83,11,65,,,,71,72,,,,75', +',73,74,76,35,36,79,80,,,,,,84,33,32,114,113,115,116,,,23,,,,,,10,53', +'335,12,118,117,119,108,64,110,109,111,,112,120,121,,104,105,49,50,48', +'264,268,269,270,271,281,282,276,277,272,273,,257,258,,,274,275,,45,', +',38,,,66,67,,,68,,40,261,,267,52,263,262,,259,260,280,279,265,24,266', +',,,102,90,93,94,,95,97,96,98,,,,,91,101,,278,,,,,85,,92,106,107,,,46', +'47,333,81,82,83,11,65,,,,71,72,,,,75,,73,74,76,35,36,79,80,,,,,,84,33', +'32,114,113,115,116,,,23,,,,,,10,53,335,12,118,117,119,108,64,110,109', +'111,,112,120,121,,104,105,49,50,48,264,268,269,270,271,281,282,276,277', +'272,273,,257,258,,,274,275,,45,,,38,,,66,67,,,68,,40,261,,267,52,263', +'262,,259,260,280,279,265,24,266,,,,102,90,93,94,,95,97,96,98,,,,,91', +'101,,278,,,,,85,,92,106,107,,,46,47,333,81,82,83,11,65,,,,71,72,,,,75', +',73,74,76,35,36,79,80,,,,,,84,33,32,114,113,115,116,,,23,,,,,,10,53', +'335,12,118,117,119,108,64,110,109,111,,112,120,121,,104,105,49,50,48', +'264,268,269,270,271,281,282,276,277,272,273,,257,258,,,274,275,,45,', +',38,,,66,67,,,68,,40,261,,267,52,263,262,,259,260,280,279,265,24,266', +',,,102,90,93,94,,95,97,96,98,,,,,91,101,,278,,,,,85,,92,106,107,,,46', +'47,333,81,82,83,11,65,,,,71,72,,,,75,,73,74,76,35,36,79,80,,,,,,84,33', +'32,114,113,115,116,,,23,,,,,,10,53,335,12,118,117,119,108,64,110,109', +'111,,112,120,121,,104,105,49,50,48,264,268,269,270,271,281,282,276,277', +'272,273,,257,258,,,274,275,,45,,,337,,,66,67,,,68,,40,261,,267,52,263', +'262,,259,260,280,279,265,24,266,,,,102,90,93,94,,95,97,96,98,,,,,91', +'101,240,278,,,,,85,,92,106,107,,,46,47,333,81,82,83,11,65,,,,71,72,', +',,75,,73,74,76,35,36,79,80,,,,,,84,33,32,114,113,115,116,,,23,,,,,,10', +'53,335,12,118,117,119,108,64,110,109,111,,112,120,121,,104,105,49,50', +'48,264,268,269,270,271,281,282,276,277,272,273,,257,258,,,274,275,,45', +',,38,,,66,67,,,68,,40,261,,267,52,263,262,,259,260,280,279,265,24,266', +',,,102,90,93,94,,95,97,96,98,,,,,91,101,,278,,,,,85,,92,106,107,,,46', +'47,333,81,82,83,11,65,,,,71,72,,,,75,,73,74,76,35,36,79,80,,,,,,84,33', +'32,114,113,115,116,,493,23,490,489,488,,491,10,53,335,12,118,117,119', +'108,64,110,109,111,,112,120,121,,104,105,49,50,48,493,,490,489,488,', +'491,,714,,493,,490,489,488,,491,718,,45,,,38,,,66,67,,264,68,,40,,,', +'52,,714,,493,,490,489,488,24,491,718,714,,102,90,93,94,,95,97,96,98', +',,261,,91,101,263,262,,259,260,,85,,92,106,107,,714,46,47,333,81,82', +'83,11,65,,,,71,72,,,,75,,73,74,76,35,36,79,80,,,,,,84,33,32,114,113', +'115,116,,,23,,,264,,,10,53,335,12,118,117,119,108,64,110,109,111,,112', +'120,121,,104,105,49,50,48,264,-741,-741,-741,-741,281,282,261,,-741', +'-741,263,262,,259,260,274,275,,45,,,337,,,66,67,,,68,,40,261,,267,52', +'263,262,,259,260,280,279,265,24,266,,,,102,90,93,94,,95,97,96,98,,,', +',91,101,,,,,,,85,,92,106,107,,,46,47,333,81,82,83,11,65,,,,71,72,,,', +'75,,73,74,76,35,36,79,80,,,,,,84,33,32,114,113,115,116,,,23,,,,,,10', +'53,335,12,118,117,119,108,64,110,109,111,,112,120,121,,104,105,49,50', +'48,264,268,269,270,271,281,282,276,277,272,273,,-741,-741,,,274,275', +',45,,,38,,,66,67,,,68,,40,261,,267,52,263,262,,259,260,280,279,265,24', +'266,,,,102,90,93,94,,95,97,96,98,,,,,91,101,,,,,,,85,,92,106,107,,,46', +'47,333,81,82,83,11,65,,,,71,72,,,,75,,73,74,76,35,36,79,80,,,,,,84,33', +'32,114,113,115,116,,,23,,,,,,10,53,335,12,118,117,119,108,64,110,109', +'111,,112,120,121,,104,105,49,50,48,264,268,269,270,271,281,282,276,277', +'272,273,,-741,-741,,,274,275,,45,,,38,,,66,67,,,68,,40,261,,267,52,263', +'262,,259,260,280,279,265,24,266,,,,102,90,93,94,,95,97,96,98,,,,,91', +'101,,,,,,,85,,92,106,107,,,46,47,333,81,82,83,11,65,,,,71,72,,,,75,', +'73,74,76,35,36,79,80,,,,,,84,33,32,114,113,115,116,,,23,,,,,,10,53,335', +'12,118,117,119,108,64,110,109,111,,112,120,121,,104,105,49,50,48,264', +',,,,,,,,,,,,,,,274,275,,45,,,38,,,66,67,,,68,,40,261,,267,52,263,262', +',259,260,,,265,24,266,,,,102,90,93,94,,95,97,96,98,,,,,91,101,,,,,,', +'85,,92,106,107,,,46,47,7,81,82,83,11,65,,,,71,72,,,,75,,73,74,76,35', +'36,79,80,,,,,,84,33,32,114,113,115,116,,,23,,,,,,10,53,9,12,118,117', +'119,108,64,110,109,111,,112,120,121,,104,105,49,50,48,264,268,269,270', +'271,281,282,276,277,272,273,,-741,-741,,,274,275,,45,,,38,,,66,67,,', +'68,,40,261,,267,52,263,262,,259,260,280,279,265,24,266,,,,102,90,93', +'94,,95,97,96,98,,,,,91,101,,,,,,,85,,92,106,107,,,46,47,333,81,82,83', +'11,65,,,,71,72,,,,75,,73,74,76,35,36,79,80,,,,,,84,33,32,114,113,115', +'116,,,23,,,,,,10,53,335,12,118,117,119,108,64,110,109,111,,112,120,121', +',104,105,49,50,48,264,-741,-741,-741,-741,281,282,,,-741,-741,,,,,,274', +'275,,45,,,38,,,66,67,,,68,,40,261,,267,52,263,262,,259,260,280,279,265', +'24,266,,,,102,90,93,94,,95,97,96,98,,,,,91,101,,,,,,,85,,92,106,107', +',,46,47,333,81,82,83,11,65,,,,71,72,,,,75,,73,74,76,35,36,79,80,,,,', +',84,33,32,114,113,115,116,,,23,,,,,,10,53,335,12,118,117,119,108,64', +'110,109,111,,112,120,121,,104,105,49,50,48,264,268,269,270,271,281,282', +'276,277,272,273,,-741,-741,,,274,275,,45,,,38,,,66,67,,,68,,40,261,', +'267,52,263,262,,259,260,280,279,265,24,266,,,,102,90,93,94,,95,97,96', +'98,,,,,91,101,,,,,,,85,,92,106,107,,,46,47,333,81,82,83,11,65,,,,71', +'72,,,,75,,73,74,76,35,36,79,80,,,,,,84,33,32,114,113,115,116,,,23,,', +',,,10,53,335,12,118,117,119,108,64,110,109,111,,112,120,121,,104,105', +'49,50,48,264,268,269,270,271,281,282,,,272,273,,,,,,274,275,,45,,,38', +',,66,67,,,68,,40,261,,267,52,263,262,,259,260,280,279,265,24,266,,,', +'102,90,93,94,,95,97,96,98,,,,,91,101,,,,,,,85,,92,106,107,,,46,47,333', +'81,82,83,11,65,,,,71,72,,,,75,,73,74,76,35,36,79,80,,,,,,84,33,32,114', +'113,115,116,,,23,,,,,,10,53,335,12,118,117,119,108,64,110,109,111,,112', +'120,121,,104,105,49,50,48,264,-741,-741,-741,-741,281,282,,,-741,-741', +',,,,,274,275,,45,,,38,,,66,67,,,68,,40,261,,267,52,263,262,,259,260', +'280,279,265,24,266,,,,102,90,93,94,,95,97,96,98,,,,,91,101,,,,,,,85', +',92,106,107,,,46,47,333,81,82,83,11,65,,,,71,72,,,,75,,73,74,76,35,36', +'79,80,,,,,,84,33,32,114,113,115,116,,,23,,,,,,10,53,335,12,118,117,119', +'108,64,110,109,111,,112,120,121,,104,105,49,50,48,264,-741,-741,-741', +'-741,281,282,,,-741,-741,,,,,,274,275,,45,,,38,,,66,67,,,68,,40,261', +',267,52,263,262,,259,260,280,279,265,24,266,,,,102,90,93,94,,95,97,96', +'98,,,,,91,101,,,,,,,85,,92,106,107,,,46,47,333,81,82,83,11,65,,,,71', +'72,,,,75,,73,74,76,35,36,79,80,,,,,,84,33,32,114,113,115,116,,,23,,', +',,,10,53,335,12,118,117,119,108,64,110,109,111,,112,120,121,,104,105', +'49,50,48,264,-741,-741,-741,-741,281,282,,,-741,-741,,,,,,274,275,,45', +',,38,,,66,67,,,68,,40,261,,267,52,263,262,,259,260,280,279,265,24,266', +',,,102,90,93,94,,95,97,96,98,,,,,91,101,,,,81,82,83,85,65,92,106,107', +'71,72,46,47,,75,,73,74,76,354,355,79,80,,,,,,84,349,357,114,113,115', +'116,,,254,,,,,,,53,,,118,117,119,108,64,110,109,111,,112,120,121,,104', +'105,49,50,48,264,268,269,270,271,281,282,276,,272,273,,,,,,274,275,', +'245,,,253,,,66,67,,,68,,,261,,267,52,263,262,,259,260,280,279,265,250', +'266,,,,102,90,93,94,,95,97,96,98,,,,,91,101,,,,81,82,83,85,65,92,106', +'107,71,72,46,47,,75,,73,74,76,354,355,79,80,,,,,,84,349,357,114,113', +'115,116,,,254,,,,,,,53,,,118,117,119,108,64,110,109,111,,112,120,121', +',104,105,49,50,48,264,-741,-741,-741,-741,281,282,,,-741,-741,,,,,,274', +'275,,245,,,253,,,66,67,,,68,,,261,,267,52,263,262,,259,260,280,279,265', +'250,266,,,,102,90,93,94,,95,97,96,98,,,,,91,101,,,,81,82,83,85,65,92', +'106,107,71,72,46,47,,75,,73,74,76,354,355,79,80,,,,,,84,349,357,114', +'113,115,116,,,254,,,,,,,53,,,118,117,119,108,64,110,109,111,,112,120', +'121,,104,105,49,50,48,264,,,,,,,,,,,,,,,,274,275,,245,,,253,,,66,67', +',,68,,,261,,267,52,263,262,,259,260,,,265,250,266,,,,102,90,93,94,,95', +'97,96,98,,,,,91,101,,,,81,82,83,85,65,92,106,107,71,72,46,47,,75,,73', +'74,76,354,355,79,80,,,,,,84,349,357,114,113,115,116,,,254,,,,,,,53,', +',118,117,119,108,64,110,109,111,,112,120,121,,104,105,49,50,48,264,', +',,,,,,,,,,,,,,274,275,,245,,,253,,,66,67,,,68,,,261,,,52,263,262,,259', +'260,,,,250,,,,,102,90,93,94,,95,97,96,98,,,,,91,101,,,,,,,85,,92,106', +'107,-441,,46,47,,,,-441,-441,-441,,,-441,-441,-441,264,-441,,,,,,,,-441', +'-441,-441,-441,,,,274,275,,,,-441,-441,,-441,-441,-441,-441,-441,,,', +'261,,267,,263,262,,259,260,,,,,,,,,,,-441,-441,-441,-441,-441,-441,-441', +'-441,-441,-441,-441,-441,-441,-441,,,-441,-441,-441,,,-441,,306,-441', +',,-441,-441,,-441,,-441,,-441,,-441,-441,,-441,-441,-441,-441,-441,', +'-441,-441,-441,,,,,,,,,,,,,,-441,,,-441,-441,,-441,,-441,81,82,83,,65', +',-441,,71,72,,,,75,,73,74,76,35,36,79,80,,,,,,84,33,32,114,113,115,116', +',,23,,,,,,,53,,,118,117,119,108,64,110,109,111,,112,120,121,,104,105', +'49,50,48,264,,,,,,,,,,,,,,,,274,275,,245,,,253,,,66,67,,,68,,,261,,267', +'52,263,262,,259,260,,,,24,,,,,102,90,93,94,,95,97,96,98,,,,,91,101,', +',,81,82,83,85,65,92,106,107,71,72,46,47,,75,,73,74,76,354,355,79,80', +',,,,,84,349,357,114,113,115,116,,,254,,,,,,,53,,,118,117,119,108,64', +'110,109,111,,112,120,121,,104,105,49,50,48,,,,,,,,,,,,,,,,,,,,245,,', +'253,,,66,67,,,68,,,,,,52,,,,,,,,,250,,,,,102,90,93,94,,95,97,96,98,', +',,,91,101,,,,,,,85,,92,106,107,-327,,46,47,,,,-327,-327,-327,,,-327', +'-327,-327,,-327,,,,,,,,-327,,-327,-327,,,,,,,,,-327,-327,,-327,-327', +'-327,-327,-327,,,,,,,,,,,,,,,,,,,,,,,-327,-327,-327,-327,-327,-327,-327', +'-327,-327,-327,-327,-327,-327,-327,,,-327,-327,-327,,,-327,,315,-327', +',,-327,-327,,-327,,-327,,-327,,-327,-327,,-327,-327,-327,-327,-327,', +'-327,,-327,,,,,,,,,,,,,,-327,,,-327,-327,,-327,,-327,81,82,83,,65,,-327', +',71,72,,,,75,,73,74,76,35,36,79,80,,,,,,84,33,32,114,113,115,116,,,254', +',,,,,,53,,,118,117,119,108,64,110,109,111,327,112,120,121,,104,105,49', +'50,48,,,,,,,,,,,,,,,,,,,,245,,,253,,,66,67,,,68,,324,,322,,52,,,328', +',,,,,250,,,,,102,325,93,94,,95,97,96,98,,,,,91,101,,,,81,82,83,85,65', +'92,106,107,71,72,46,47,,75,,73,74,76,35,36,79,80,,,,,,84,33,32,114,113', +'115,116,,,254,,,,,,,53,,,118,117,119,108,64,110,109,111,,112,120,121', +',104,105,49,50,48,,,,,,,,,,,,,,,,,,,,245,,,253,,,66,67,,,68,,,,,,52', +',,,,,,,,250,,,,,102,90,93,94,,95,97,96,98,,,,,91,101,,,,81,82,83,85', +'65,92,106,107,71,72,46,47,,75,,73,74,76,354,355,79,80,,,,,,84,349,357', +'114,113,115,116,,,254,,,,,,,53,,,118,117,119,108,64,110,109,111,327', +'112,120,121,,104,105,49,50,48,,,,,,,,,,,,,,,,,,,,245,,,253,,,66,67,', +',68,,,,,,52,,,328,,,,,,250,,,,,102,325,93,94,,95,97,96,98,,,,,91,101', +',,,81,82,83,85,65,92,106,107,71,72,46,47,,75,,73,74,76,354,355,79,80', +',,,,,84,349,357,114,113,115,116,,,254,,,,,,,53,,,118,117,119,108,64', +'110,109,111,327,112,120,121,,104,105,49,50,48,,,,,,,,,,,,,,,,,,,,245', +',,253,,,66,67,,,68,,799,,,,52,,,328,,,,,,250,,,,,102,325,93,94,,95,97', +'96,98,,,,,91,101,,,,81,82,83,85,65,92,106,107,71,72,46,47,,75,,73,74', +'76,35,36,79,80,,,,,,84,33,32,114,113,115,116,,,23,,,,,,,53,,,118,117', +'119,108,64,110,109,111,,112,120,121,,104,105,49,50,48,,,,,,,,,,,,,,', +',,,,,245,,,253,,,66,67,,,68,,,,,,52,,,,,,,,,24,,,,,102,90,93,94,,95', +'97,96,98,,,,,91,101,240,,,81,82,83,85,65,92,106,107,71,72,46,47,,75', +',73,74,76,354,355,79,80,,,,,,84,349,357,114,113,115,116,,,254,,,,,,', +'53,,,118,117,119,108,64,110,109,111,,112,120,121,,104,105,49,50,48,', +',,,,,,,,,,,,,,,,,,245,,,253,,,66,67,,,68,,,,,,52,,,,,,,,,250,,,,,102', +'90,93,94,,95,97,96,98,,,,,91,101,,,,81,82,83,85,65,92,106,107,71,72', +'46,47,,75,,73,74,76,354,355,79,80,,,,,,84,349,357,114,113,115,116,,', +'254,,,,,,,53,,,118,117,119,108,64,110,109,111,,112,120,121,,104,105', +'49,50,48,,,,,,,,,,,,,,,,,,,,245,,,253,,,66,67,,,68,,,,,,52,,,,,,,,,250', +',,,,102,90,93,94,,95,97,96,98,,,,,91,101,,,,81,82,83,85,65,92,106,107', +'71,72,46,47,,75,,73,74,76,354,355,79,80,,,,,,84,349,357,114,113,115', +'116,,,254,,,,,,,53,,,118,117,119,108,64,110,109,111,,112,120,121,,104', +'105,49,50,48,,,,,,,,,,,,,,,,,,,,245,,,253,,,66,67,,,68,,,,,,52,,,,,', +',,,250,,,,,102,90,93,94,,95,97,96,98,,,,,91,101,,,,81,82,83,85,65,92', +'106,107,71,72,46,47,,75,,73,74,76,35,36,79,80,,,,,,84,33,32,114,113', +'115,116,,,254,,,,,,,53,,,118,117,119,108,64,110,109,111,,112,120,121', +',104,105,49,50,48,,,,,,,,,,,,,,,,,,,,245,,,253,,,66,67,,,68,,,,,,52', +',,,,,,,,250,,,,,102,90,93,94,,95,97,96,98,,,,,91,101,,,,81,82,83,85', +'65,92,106,107,71,72,46,47,,75,,73,74,76,35,36,79,80,,,,,,84,33,32,114', +'113,115,116,,,23,,,,,,,53,,,118,117,119,108,64,110,109,111,,112,120', +'121,,104,105,49,50,48,,,,,,,,,,,,,,,,,,,,245,,,253,,,66,67,,,68,,,,', +',52,,,,,,,,,24,,,,,102,90,93,94,,95,97,96,98,,,,,91,101,,,,,,,85,,92', +'106,107,-275,,46,47,,,,-275,-275,-275,,,-275,-275,-275,493,-275,490', +'489,488,498,491,,,-275,-275,-275,,,,501,,,,,,-275,-275,,-275,-275,-275', +'-275,-275,,493,,490,489,488,498,491,496,646,,,,,,,501,506,505,509,508', +',,,502,,493,,490,489,488,498,491,-275,,,,,496,,-275,501,,,,306,-275', +'506,505,509,508,,,,502,,,,,,,,,496,487,,,,-275,-275,,,,,509,508,,,,502', +',,,-275,,,-275,,81,82,83,-275,65,,487,,71,72,-275,,,75,,73,74,76,354', +'355,79,80,,,,,,84,349,357,114,113,115,116,,,254,,,,,,,53,,,118,117,119', +'108,64,110,109,111,,112,120,121,,104,105,49,50,48,,,,,,,,,,,,,,,,,,', +',245,,,253,,,66,67,,,68,,,,,,52,,,,,,,,,250,,,,,102,90,93,94,,95,97', +'96,98,,,,,91,101,,,,81,82,83,85,65,92,106,107,71,72,46,47,,75,,73,74', +'76,35,36,79,80,,,,,,84,33,32,114,113,115,116,,,254,,,,,,,53,,,118,117', +'119,108,64,110,109,111,,112,120,121,,104,105,49,50,48,,,,,,,,,,,,,,', +',,,,,245,,,253,,,66,67,,,68,,,,,,52,,,,,,,,,250,,,,,102,90,93,94,,95', +'97,96,98,,,,,91,101,,,,81,82,83,85,65,92,106,107,71,72,46,47,,75,,73', +'74,76,354,355,79,80,,,,,,84,349,357,114,113,115,116,,,254,,,,,,,53,', +',118,117,119,108,64,110,109,111,327,112,120,121,,104,105,49,50,48,,', +',,,,,,,,,,,,,,,,,245,,,253,,,66,67,,,68,,799,,322,,52,,,328,,,,,,250', +',,,,102,325,93,94,,95,97,96,98,,,,,91,101,,,,81,82,83,85,65,92,106,107', +'71,72,46,47,,75,,73,74,76,354,355,79,80,,,,,,84,349,357,114,113,115', +'116,,,254,,,,,,,53,,,118,117,119,108,64,110,109,111,327,112,120,121', +',104,105,49,50,48,,,,,,,,,,,,,,,,,,,,245,,,253,,,66,67,,,68,,,,322,', +'52,,,328,,,,,,250,,,,,102,325,93,94,,95,97,96,98,,,,,91,101,,,,81,82', +'83,85,65,92,106,107,71,72,46,47,,75,,73,74,76,354,355,79,80,,,,,,84', +'349,357,114,113,115,116,,,254,,,,,,,53,,,118,117,119,108,64,110,109', +'111,,112,120,121,,104,105,49,50,48,,,,,,,,,,,,,,,,,,,,245,,,253,,,66', +'67,,,68,,,,,,52,,,,,,,,,250,,,,,102,90,93,94,,95,97,96,98,,,,,91,101', +',,,,,,85,,92,106,107,,,46,47,81,82,83,11,65,,,,71,72,,,,75,,73,74,76', +'35,36,79,80,,,,,,84,33,32,114,113,115,116,,,23,,,,,,10,53,335,12,118', +'117,119,108,64,110,109,111,,112,120,121,,104,105,49,50,48,,,,,,,,,,', +',,,,,,,,,45,,,38,,,66,67,,,68,,40,,,,52,,,,,,,,,24,,,,,102,90,93,94', +',95,97,96,98,,,,,91,101,,,,,,420,85,,92,106,107,,,46,47,81,82,83,,65', +',,,71,72,,,,75,,73,74,76,35,36,79,80,,,,,,84,33,32,114,113,115,116,', +',254,,,,,,,53,,,118,117,119,108,64,110,109,111,327,112,120,121,,104', +'105,49,50,48,,,,,,,,,,,,,,,,,,,,245,,,253,,,66,67,,,68,,324,,322,,52', +',,328,,,,,,250,,,,,102,325,93,94,,95,97,96,98,,,,,91,101,,,,81,82,83', +'85,65,92,106,107,71,72,46,47,,75,,73,74,76,35,36,79,80,,,,,,84,33,32', +'114,113,115,116,,,254,,,,,,,53,,,118,117,119,108,64,110,109,111,327', +'112,120,121,,104,105,49,50,48,,,,,,,,,,,,,,,,,,,,245,,,253,,,66,67,', +',68,,324,,322,,52,,,328,,,,,,250,,,,,102,325,93,94,,95,97,96,98,,,,', +'91,101,,,,81,82,83,85,65,92,106,107,71,72,46,562,,75,,73,74,76,354,355', +'79,80,,,,,,84,349,357,114,113,115,116,,,254,,,,,,,53,,,118,117,119,108', +'64,110,109,111,,112,120,121,,104,105,49,50,48,,,,,,,,,,,,,,,,,,,,245', +',,253,,,66,67,,,68,,,,,,52,,,,,,,,,250,,,,,102,90,93,94,,95,97,96,98', +',,,,91,101,,,,81,82,83,85,65,92,106,107,71,72,46,47,,75,,73,74,76,354', +'355,79,80,,,,,,84,349,357,114,113,115,116,,,254,,,,,,,53,,,118,117,119', +'108,64,110,109,111,,112,120,121,,104,105,49,50,48,,,,,,,,,,,,,,,,,,', +',245,,,253,,,66,67,,,68,,,,,,52,,,,,,,,,250,,,,,102,90,93,94,,95,97', +'96,98,,,,,91,101,,,,81,82,83,85,65,92,106,107,71,72,46,47,,75,,73,74', +'76,35,36,79,80,,,,,,84,33,32,114,113,115,116,,,254,,,,,,,53,,,118,117', +'119,108,64,110,109,111,327,112,120,121,,104,105,49,50,48,,,,,,,,,,,', +',,,,,,,,245,,,253,,,66,67,,,68,,324,,322,,52,,,328,,,,,,250,,,,,102', +'325,93,94,,95,97,96,98,,,,,91,101,,,,81,82,83,85,65,92,106,107,71,72', +'46,47,,75,,73,74,76,35,36,79,80,,,,,,84,33,32,114,113,115,116,,,254', +',,,,,,53,,,118,117,119,108,64,110,109,111,327,112,120,121,,104,105,49', +'50,48,,,,,,,,,,,,,,,,,,,,245,,,253,,,66,67,,,68,,324,,322,,52,,,328', +',,,,,250,,,,,102,325,93,94,,95,97,96,98,,,,,91,101,240,,,81,82,83,85', +'65,92,106,107,71,72,46,47,,75,,73,74,76,354,355,79,80,,,,,,84,349,357', +'114,113,115,116,,,254,,,,,,,53,,,118,117,119,108,64,110,109,111,,112', +'120,121,,104,105,49,50,48,,,,,,,,,,,,,,,,,,,,245,,,253,,,66,67,,,68', +',,,,,52,,,,,,,,,250,,,,,102,90,93,94,,95,97,96,98,,,,,91,101,,,,81,82', +'83,85,65,92,106,107,71,72,46,47,,75,,73,74,76,354,355,79,80,,,,,,84', +'349,357,114,113,115,116,,,254,,,,,,,53,,,118,117,119,108,64,110,109', +'111,,112,120,121,,104,105,49,50,48,,,,,,,,,,,,,,,,,,,,245,,,253,,,66', +'67,,,68,,,,,,52,,,,,,,,,250,,,,,102,90,93,94,,95,97,96,98,,,,,91,101', +',,,81,82,83,85,65,92,106,107,71,72,46,47,,75,,73,74,76,354,355,79,80', +',,,,,84,349,357,114,113,115,116,,,254,,,,,,,53,,,118,117,119,108,64', +'110,109,111,,112,120,121,,104,105,49,50,48,,,,,,,,,,,,,,,,,,,,245,,', +'253,,,66,67,,,68,,,,,,52,,,,,,,,,250,,,,,102,90,93,94,,95,97,96,98,', +',,,91,101,,,,81,82,83,85,65,92,106,107,71,72,46,47,,75,,73,74,76,354', +'355,79,80,,,,,,84,349,357,114,113,115,116,,,254,,,,,,,53,,,118,117,119', +'108,64,110,109,111,,112,120,121,,104,105,49,50,48,,,,,,,,,,,,,,,,,,', +',245,,,253,,,66,67,,,68,,,,,,52,,,,,,,,,250,,,,,102,90,93,94,,95,97', +'96,98,,,,,91,101,,,,81,82,83,85,65,92,106,107,71,72,46,47,,75,,73,74', +'76,354,355,79,80,,,,,,84,349,357,114,113,115,116,,,254,,,,,,,53,,,118', +'117,119,108,64,110,109,111,,112,120,121,,104,105,49,50,48,,,,,,,,,,', +',,,,,,,,,245,,,253,,,66,67,,,68,,,,,,52,,,,,,,,,250,,,,,102,90,93,94', +',95,97,96,98,,,,,91,101,,,,81,82,83,85,65,92,106,107,71,72,46,47,,75', +',73,74,76,354,355,79,80,,,,,,84,349,357,114,113,115,116,,,254,,,,,,', +'53,,,118,117,119,108,64,110,109,111,,112,120,121,,104,105,49,50,48,', +',,,,,,,,,,,,,,,,,,245,,,253,,,66,67,,,68,,,,,,52,,,,,,,,,250,,,,,102', +'90,93,94,,95,97,96,98,,,,,91,101,,,,81,82,83,85,65,92,106,107,71,72', +'46,47,,75,,73,74,76,354,355,79,80,,,,,,84,349,357,114,113,115,116,,', +'254,,,,,,,53,,,118,117,119,108,64,110,109,111,,112,120,121,,104,105', +'49,50,48,,,,,,,,,,,,,,,,,,,,245,,,253,,,66,67,,,68,,,,,,52,,,,,,,,,250', +',,,,102,90,93,94,,95,97,96,98,,,,,91,101,,,,81,82,83,85,65,92,106,107', +'71,72,46,47,,75,,73,74,76,354,355,79,80,,,,,,84,349,357,114,113,115', +'116,,,254,,,,,,,53,,,118,117,119,108,64,110,109,111,,112,120,121,,104', +'105,49,50,48,,,,,,,,,,,,,,,,,,,,245,,,253,,,66,67,,,68,,,,,,52,,,,,', +',,,250,,,,,102,90,93,94,,95,97,96,98,,,,,91,101,,,,81,82,83,85,65,92', +'106,107,71,72,46,47,,75,,73,74,76,354,355,79,80,,,,,,84,349,357,114', +'113,115,116,,,254,,,,,,,53,,,118,117,119,108,64,110,109,111,,112,120', +'121,,104,105,49,50,48,,,,,,,,,,,,,,,,,,,,245,,,253,,,66,67,,,68,,,,', +',52,,,,,,,,,250,,,,,102,90,93,94,,95,97,96,98,,,,,91,101,,,,81,82,83', +'85,65,92,106,107,71,72,46,47,,75,,73,74,76,354,355,79,80,,,,,,84,349', +'357,114,113,115,116,,,254,,,,,,,53,,,118,117,119,108,64,110,109,111', +',112,120,121,,104,105,49,50,48,,,,,,,,,,,,,,,,,,,,245,,,253,,,66,67', +',,68,,,,,,52,,,,,,,,,250,,,,,102,90,93,94,,95,97,96,98,,,,,91,101,,', +',81,82,83,85,65,92,106,107,71,72,46,47,,75,,73,74,76,354,355,79,80,', +',,,,84,349,357,114,113,115,116,,,254,,,,,,,53,,,118,117,119,108,64,110', +'109,111,,112,120,121,,104,105,49,50,48,,,,,,,,,,,,,,,,,,,,245,,,253', +',,66,67,,,68,,,,,,52,,,,,,,,,250,,,,,102,90,93,94,,95,97,96,98,,,,,91', +'101,,,,81,82,83,85,65,92,106,107,71,72,46,47,,75,,73,74,76,354,355,79', +'80,,,,,,84,349,357,114,113,115,116,,,254,,,,,,,53,,,118,117,119,108', +'64,110,109,111,,112,120,121,,104,105,49,50,48,,,,,,,,,,,,,,,,,,,,245', +',,253,,,66,67,,,68,,,,,,52,,,,,,,,,250,,,,,102,90,93,94,,95,97,96,98', +',,,,91,101,,,,,,,85,,92,106,107,,,46,47,81,82,83,11,65,,,,71,72,,,,75', +',73,74,76,35,36,79,80,,,,,,84,33,32,114,113,115,116,,,23,,,,,,10,53', +',12,118,117,119,108,64,110,109,111,,112,120,121,,104,105,49,50,48,,', +',,,,,,,,,,,,,,,,,45,,,38,,,66,67,,,68,,40,,,,52,,,,,,,,,24,,,,,102,90', +'93,94,,95,97,96,98,,,,,91,101,,,,81,82,83,85,65,92,106,107,71,72,46', +'47,,75,,73,74,76,354,355,79,80,,,,,,84,349,357,114,113,115,116,,,254', +',,,,,,53,,,118,117,119,108,64,110,109,111,,112,120,121,,104,105,49,50', +'48,,,,,,,,,,,,,,,,,,,,245,,,253,,,66,67,,,68,,,,,,52,,,,,,,,,250,,,', +',102,90,93,94,,95,97,96,98,,,,,91,101,,,,81,82,83,85,65,92,106,107,71', +'72,46,47,,75,,73,74,76,354,355,79,80,,,,,,84,349,357,114,113,115,116', +',,254,,,,,,,53,,,118,117,119,108,64,110,109,111,,112,120,121,,104,105', +'49,50,48,,,,,,,,,,,,,,,,,,,,245,,,253,,,66,67,,,68,,,,,,52,,,,,,,,,250', +',,,,102,90,93,94,,95,97,96,98,,,,,91,101,,,,81,82,83,85,65,92,106,107', +'71,72,46,47,,75,,73,74,76,35,36,79,80,,,,,,84,33,32,114,113,115,116', +',,23,,,,,,,53,,,118,117,119,108,64,110,109,111,,112,120,121,,104,105', +'49,50,48,,,,,,,,,,,,,,,,,,,,245,,,253,,,66,67,,,68,,,,,,52,,,,,,,,,24', +',,,,102,90,93,94,,95,97,96,98,,,,,91,101,,,,81,82,83,85,65,92,106,107', +'71,72,46,47,,75,,73,74,76,354,355,79,80,,,,,,84,349,357,114,113,115', +'116,,,254,,,,,,,53,,,118,117,119,108,64,110,109,111,,112,120,121,,104', +'105,49,50,48,,,,,,,,,,,,,,,,,,,,245,,,253,,,66,67,,,68,,799,,,,52,,', +',,,,,,250,,,,,102,90,93,94,,95,97,96,98,,,,,91,101,,,,81,82,83,85,65', +'92,106,107,71,72,46,47,,75,,73,74,76,35,36,79,80,,,,,,84,33,32,114,113', +'115,116,,,254,,,,,,,53,,,118,117,119,108,64,110,109,111,327,112,120', +'121,,104,105,49,50,48,,,,,,,,,,,,,,,,,,,,245,,,253,,,66,67,,,68,,324', +',322,,52,,,328,,,,,,250,,,,,102,325,93,94,,95,97,96,98,,,,,91,101,,', +',81,82,83,85,65,92,106,107,71,72,46,47,,75,,73,74,76,354,355,79,80,', +',,,,84,349,357,114,113,115,116,,,254,,,,,,,53,,,118,117,119,108,64,110', +'109,111,,112,120,121,,104,105,49,50,48,,,,,,,,,,,,,,,,,,,,245,,,253', +',,66,67,,,68,,,,,,52,,,,,,,,,250,,,,,102,90,93,94,,95,97,96,98,,,,,91', +'101,,,,81,82,83,85,65,92,106,107,71,72,46,47,,75,,73,74,76,35,36,79', +'80,,,,,,84,33,32,114,113,115,116,,,254,,,,,,,53,,,118,117,119,108,64', +'110,109,111,327,112,120,121,,104,105,49,50,48,,,,,,,,,,,,,,,,,,,,245', +',,253,,,66,67,,,68,,324,,322,,52,,,328,,,,,,250,,,,,102,325,93,94,,95', +'97,96,98,,,,,91,101,,,,81,82,83,85,65,92,106,107,71,72,46,47,,75,,73', +'74,76,354,355,79,80,,,,,,84,349,357,114,113,115,116,,,254,,,,,,,53,', +',118,117,119,108,64,110,109,111,327,112,120,121,,104,105,49,50,48,,', +',,,,,,,,,,,,,,,,,245,,,253,,,66,67,,,68,,799,,322,,52,,,328,,,,,,250', +',,,,102,325,93,94,,95,97,96,98,,,,,91,101,,,,81,82,83,85,65,92,106,107', +'71,72,46,562,,75,,73,74,76,354,355,79,80,,,,,,84,349,357,114,113,115', +'116,,,254,,,,,,,53,,,118,117,119,108,64,110,109,111,327,112,120,121', +',104,105,49,50,48,,,,,,,,,,,,,,,,,,,,245,,,253,,,66,67,,,68,,,,322,', +'52,,,328,,,,,,250,,,,,102,325,93,94,,95,97,96,98,,,,,91,101,,,,81,82', +'83,85,65,92,106,107,71,72,46,47,,75,,73,74,76,35,36,79,80,,,,,,84,33', +'32,114,113,115,116,,,23,,,,,,,53,,,118,117,119,108,64,110,109,111,,112', +'120,121,,104,105,49,50,48,,,,,,,,,,,,,,,,,,,,245,,,253,,,66,67,,,68', +',,,,,52,,,,,,,,,24,,,,,102,90,93,94,,95,97,96,98,,,,,91,101,,,,81,82', +'83,85,65,92,106,107,71,72,46,47,,75,,73,74,76,35,36,79,80,,,,,,84,33', +'32,114,113,115,116,,,23,,,,,,,53,,,118,117,119,108,64,110,109,111,,112', +'120,121,,104,105,49,50,48,,,,,,,,,,,,,,,,,,,,245,,,253,,,66,67,,,68', +',,,,,52,,,,,,,,,24,,,,,102,90,93,94,,95,97,96,98,,,,,91,101,,,,81,82', +'83,85,65,92,106,107,71,72,46,47,,75,,73,74,76,354,355,79,80,,,,,,84', +'349,357,114,113,115,116,,,254,,,,,,,53,,,118,117,119,108,64,110,109', +'111,,112,120,121,,104,105,49,50,48,,,,,,,,,,,,,,,,,,,,245,,,253,,,66', +'67,,,68,,,,,,52,,,,,,,,,250,,,,,102,90,93,94,,95,97,96,98,,,,,91,101', +',,,81,82,83,85,65,92,106,107,71,72,46,47,,75,,73,74,76,354,355,79,80', +',,,,,84,349,357,114,113,115,116,,,254,,,,,,,53,,,118,117,119,108,64', +'110,109,111,,112,120,121,,104,105,49,50,48,,,,,,,,,,,,,,,,,,,,245,,', +'253,,,66,67,,,68,,,,,,52,,,,,,,,,250,,,,,102,90,93,94,,95,97,96,98,', +',,,91,101,,,,81,82,83,85,65,92,106,107,71,72,46,47,,75,,73,74,76,354', +'355,79,80,,,,,,84,349,357,114,113,115,116,,,254,,,,,,,53,,,118,117,119', +'108,64,110,109,111,,112,120,121,,104,105,49,50,48,,,,,,,,,,,,,,,,,,', +',245,,,253,,,66,67,,,68,,,,,,52,,,,,,,,,250,,,,,102,90,93,94,,95,97', +'96,98,,,,,91,101,,,,81,82,83,85,65,92,106,107,71,72,46,47,,75,,73,74', +'76,354,355,79,80,,,,,,84,349,357,114,113,115,116,,,254,,,,,,,53,,,118', +'117,119,108,64,110,109,111,,112,120,121,,104,105,49,50,48,,,,,,,,,,', +',,,,,,,,,245,,,253,,,66,67,,,68,,,,,,52,,,,,,,,,250,,,,,102,90,93,94', +',95,97,96,98,,,,,91,101,,,,81,82,83,85,65,92,106,107,71,72,46,47,,75', +',73,74,76,354,355,79,80,,,,,,84,349,357,114,113,115,116,,,254,,,,,,', +'53,,,118,117,119,108,64,110,109,111,,112,120,121,,104,105,49,50,48,', +',,,,,,,,,,,,,,,,,,245,,,253,,,66,67,,,68,,,,,,52,,,,,,,,,250,,,,,102', +'90,93,94,,95,97,96,98,,,,,91,101,,,,81,82,83,85,65,92,106,107,71,72', +'46,47,,75,,73,74,76,354,355,79,80,,,,,,84,349,357,114,113,115,116,,', +'254,,,,,,,53,,,118,117,119,108,64,110,109,111,,112,120,121,,104,105', +'49,50,48,,,,,,,,,,,,,,,,,,,,245,,,253,,,66,67,,,68,,,,,,52,,,,,,,,,250', +',,,,102,90,93,94,,95,97,96,98,,,,,91,101,,,,81,82,83,85,65,92,106,107', +'71,72,46,47,,75,,73,74,76,35,36,79,80,,,,,,84,33,32,114,113,115,116', +',,23,,,,,,,53,,,118,117,119,108,64,110,109,111,,112,120,121,,104,105', +'49,50,48,,,,,,,,,,,,,,,,,,,,245,,,253,,,66,67,,,68,,,,,,52,,,,,,,,,24', +',,,,102,90,93,94,,95,97,96,98,,,,,91,101,,,,81,82,83,85,65,92,106,107', +'71,72,46,47,,75,,73,74,76,354,355,79,80,,,,,,84,349,357,114,113,115', +'116,,,254,,,,,,,53,,,118,117,119,108,64,110,109,111,,112,120,121,,104', +'105,49,50,48,,,,,,,,,,,,,,,,,,,,245,,,253,,,66,67,,,68,,,,,,52,,,,,', +',,,250,,,,,102,90,93,94,,95,97,96,98,,,,,91,101,,,,81,82,83,85,65,92', +'106,107,71,72,46,47,,75,,73,74,76,354,355,79,80,,,,,,84,349,357,114', +'113,115,116,,,254,,,,,,,53,,,118,117,119,108,64,110,109,111,,112,120', +'121,,104,105,49,50,48,,,,,,,,,,,,,,,,,,,,245,,,253,,,66,67,,,68,,,,', +',52,,,,,,,,,250,,,,,102,90,93,94,,95,97,96,98,,,,,91,101,,,,81,82,83', +'85,65,92,106,107,71,72,46,47,,75,,73,74,76,354,355,79,80,,,,,,84,349', +'357,114,113,115,116,,,254,,,,,,,53,,,118,117,119,108,64,110,109,111', +',112,120,121,,104,105,49,50,48,,,,,,,,,,,,,,,,,,,,245,,,253,,,66,67', +',,68,,,,,,52,,,,,,,,,250,,,,,102,90,93,94,,95,97,96,98,,,,,91,101,,', +',81,82,83,85,65,92,106,107,71,72,46,47,,75,,73,74,76,354,355,79,80,', +',,,,84,349,357,114,113,115,116,,,254,,,,,,,53,,,118,117,119,108,64,110', +'109,111,,112,120,121,,104,105,49,50,48,,,,,,,,,,,,,,,,,,,,245,,,253', +',,66,67,,,68,,,,,,52,,,,,,,,,250,,,,,102,90,93,94,,95,97,96,98,,,,,91', +'101,,,,81,82,83,85,65,92,106,107,71,72,46,47,,75,,73,74,76,354,355,79', +'80,,,,,,84,349,357,114,113,115,116,,,254,,,,,,,53,,,118,117,119,108', +'64,110,109,111,,112,120,121,,104,105,49,50,48,,,,,,,,,,,,,,,,,,,,245', +',,253,,,66,67,,,68,,,,,,52,,,,,,,,,250,,,,,102,90,93,94,,95,97,96,98', +',,,,91,101,,,,81,82,83,85,65,92,106,107,71,72,46,47,,75,,73,74,76,354', +'355,79,80,,,,,,84,349,357,114,113,115,116,,,254,,,,,,,53,,,118,117,119', +'108,64,110,109,111,,112,120,121,,104,105,49,50,48,,,,,,,,,,,,,,,,,,', +',245,,,253,,,66,67,,,68,,,,,,52,,,,,,,,,250,,,,,102,90,93,94,,95,97', +'96,98,,,,,91,101,,,,81,82,83,85,65,92,106,107,71,72,46,47,,75,,73,74', +'76,354,355,79,80,,,,,,84,349,357,114,113,115,116,,,254,,,,,,,53,,,118', +'117,119,108,64,110,109,111,,112,120,121,,104,105,49,50,48,,,,,,,,,,', +',,,,,,,,,245,,,253,,,66,67,,,68,,,,,,52,,,,,,,,,250,,,,,102,90,93,94', +',95,97,96,98,,,,,91,101,,,,81,82,83,85,65,92,106,107,71,72,46,47,,75', +',73,74,76,354,355,79,80,,,,,,84,349,357,114,113,115,116,,,254,,,,,,', +'53,,,118,117,119,108,64,110,109,111,,112,120,121,,104,105,49,50,48,', +',,,,,,,,,,,,,,,,,,245,,,253,,,66,67,,,68,,,,,,52,,,,,,,,,250,,,,,102', +'90,93,94,,95,97,96,98,,,,,91,101,,,,81,82,83,85,65,92,106,107,71,72', +'46,47,,75,,73,74,76,354,355,79,80,,,,,,84,349,357,114,113,115,116,,', +'254,,,,,,,53,,,118,117,119,108,64,110,109,111,,112,120,121,,104,105', +'49,50,48,,,,,,,,,,,,,,,,,,,,245,,,253,,,66,67,,,68,,,,,,52,,,,,,,,,250', +',,,,102,90,93,94,,95,97,96,98,,,,,91,101,,,,81,82,83,85,65,92,106,107', +'71,72,46,47,,75,,73,74,76,354,355,79,80,,,,,,84,349,357,114,113,115', +'116,,,254,,,,,,,53,,,118,117,119,108,64,110,109,111,,112,120,121,,104', +'105,49,50,48,,,,,,,,,,,,,,,,,,,,245,,,253,,,66,67,,,68,,,,,,52,,,,,', +',,,250,,,,,102,90,93,94,,95,97,96,98,,,,,91,101,,,,81,82,83,85,65,92', +'106,107,71,72,46,47,,75,,73,74,76,35,36,79,80,,,,,,84,33,32,114,113', +'115,116,,,23,,,,,,,53,,,118,117,119,108,64,110,109,111,,112,120,121', +',104,105,49,50,48,,,,,,,,,,,,,,,,,,,,245,,,253,,,66,67,,,68,,,,,,52', +',,,,,,,,24,,,,,102,90,93,94,,95,97,96,98,,,,,91,101,,,,81,82,83,85,65', +'92,106,107,71,72,46,47,,75,,73,74,76,354,355,79,80,,,,,,84,349,357,114', +'113,115,116,,,254,,,,,,,53,,,118,117,119,108,64,110,109,111,,112,120', +'121,,104,105,49,50,48,,,,,,,,,,,,,,,,,,,,245,,,253,,,66,67,,,68,,,,', +',52,,,,,,,,,250,,,,,102,90,93,94,,95,97,96,98,,,,,91,101,,,,81,82,83', +'85,65,92,106,107,71,72,46,47,,75,,73,74,76,354,355,79,80,,,,,,84,349', +'357,114,113,115,116,,,254,,,,,,,53,,,118,117,119,108,64,110,109,111', +',112,120,121,,104,105,49,50,48,,,,,,,,,,,,,,,,,,,,245,,,253,,,66,67', +',,68,,,,,,52,,,,,,,,,250,,,,,102,90,93,94,,95,97,96,98,,,,,91,101,,', +',81,82,83,85,65,92,106,107,71,72,46,47,,75,,73,74,76,354,355,79,80,', +',,,,84,349,357,114,113,115,116,,,254,,,,,,,53,,,118,117,119,108,64,110', +'109,111,,112,120,121,,104,105,49,50,48,,,,,,,,,,,,,,,,,,,,245,,,253', +',,66,67,,,68,,,,,,52,,,,,,,,,250,,,,,102,90,93,94,,95,97,96,98,,,,,91', +'101,,,,81,82,83,85,65,92,106,107,71,72,46,47,,75,,73,74,76,354,355,79', +'80,,,,,,84,349,357,114,113,115,116,,,254,,,,,,,53,,,118,117,119,108', +'64,110,109,111,,112,120,121,,104,105,49,50,48,,,,,,,,,,,,,,,,,,,,245', +',,253,,,66,67,,,68,,,,,,52,,,,,,,,,250,,,,,102,90,93,94,,95,97,96,98', +',,,,91,101,,,,81,82,83,85,65,92,106,107,71,72,46,47,,75,,73,74,76,35', +'36,79,80,,,,,,84,33,32,114,113,115,116,,,254,,,,,,,53,,,118,117,119', +'108,64,110,109,111,,112,120,121,,104,105,49,50,48,,,,,,,,,,,,,,,,,,', +',245,,,253,,,66,67,,,68,,,,,,52,,,,,,,,,250,,,,,102,90,93,94,,95,97', +'96,98,,,,,91,101,,,,81,82,83,85,65,92,106,107,71,72,46,47,,75,,73,74', +'76,354,355,79,80,,,,,,84,349,357,114,113,115,116,,,254,,,,,,,53,,,118', +'117,119,108,64,110,109,111,,112,120,121,,104,105,49,50,48,,,,,,,,,,', +',,,,,,,,,245,,,253,,,66,67,,,68,,,,,,52,,,,,,,,,250,,,,,102,90,93,94', +',95,97,96,98,,,,,91,101,,,,81,82,83,85,65,92,106,107,71,72,46,47,,75', +',73,74,76,35,36,79,80,,,,,,84,33,32,114,113,115,116,,,23,,,,,,,53,,', +'118,117,119,108,64,110,109,111,,112,120,121,,104,105,49,50,48,,,,,,', +',,,,,,,,,,,,,245,,,253,,,66,67,,,68,,,,,,52,,,,,,,,,24,,,,,102,90,93', +'94,,95,97,96,98,,,,,91,101,,,,81,82,83,85,65,92,106,107,71,72,46,47', +',75,,73,74,76,35,36,79,80,,,,,,84,33,32,114,113,115,116,,,23,,,,,,,53', +',,118,117,119,108,64,110,109,111,,112,120,121,,104,105,49,50,48,,,,', +',,,,,,,,,,,,,,,245,,,253,,,66,67,,,68,,,,,,52,,,,,,,,,24,,,,,102,90', +'93,94,,95,97,96,98,,,,,91,101,,,,81,82,83,85,65,92,106,107,71,72,46', +'47,,75,,73,74,76,354,355,79,80,,,,,,84,349,357,114,113,115,116,,,254', +',,,,,,53,,,118,117,119,108,64,110,109,111,,112,120,121,,104,105,49,50', +'48,,,,,,,,,,,,,,,,,,,,245,,,253,,,66,67,,,68,,,,,,52,,,,,,,,,250,,,', +',102,90,93,94,,95,97,96,98,,,,,91,101,,,,81,82,83,85,65,92,106,107,71', +'72,46,47,,75,,73,74,76,354,355,79,80,,,,,,84,349,357,114,113,115,116', +',,254,,,,,,,53,,,118,117,119,108,64,110,109,111,,112,120,121,,104,105', +'49,50,48,,,,,,,,,,,,,,,,,,,,245,,,253,,,66,67,,,68,,,,,,52,,,,,,,,,250', +',,,,102,90,93,94,,95,97,96,98,,,,,91,101,,,,81,82,83,85,65,92,106,107', +'71,72,46,47,,75,,73,74,76,35,36,79,80,,,,,,84,33,32,114,113,115,116', +',,254,,,,,,,53,,,118,117,119,108,64,110,109,111,327,112,120,121,,104', +'105,49,50,48,,,,,,,,,,,,,,,,,,,,245,,,253,,,66,67,,,68,,324,,322,,52', +',,328,,,,,,250,,,,,102,325,93,94,,95,97,96,98,,,,,91,101,,,,81,82,83', +'85,65,92,106,107,71,72,46,47,,75,,73,74,76,354,355,79,80,,,,,,84,349', +'357,114,113,115,116,,,254,,,,,,,53,,,118,117,119,108,64,110,109,111', +',112,120,121,,104,105,49,50,48,,,,,,,,,,,,,,,,,,,,245,,,253,,,66,67', +',,68,,,,,,52,,,,,,,,,250,,,,,102,90,93,94,,95,97,96,98,,,,,91,101,,', +',,,,85,,92,106,107,,,46,47,81,82,83,11,65,,,,71,72,,,,75,,73,74,76,35', +'36,79,80,,,,,,84,33,32,114,113,115,116,,,23,,,,,,10,53,9,12,118,117', +'119,108,64,110,109,111,,112,120,121,,104,105,49,50,48,,,,,,,,,,,,,,', +',,,,,45,,,38,,,66,67,,,68,,40,,,,52,,,,,,,,,24,,,,,102,90,93,94,,95', +'97,96,98,,,,,91,101,,,,,,,85,,92,106,107,-312,,46,47,,,,-312,-312,-312', +',,-312,-312,-312,,-312,,,,,,,,-312,,-312,-312,-312,,,,,,,,-312,-312', +',-312,-312,-312,-312,-312,,,,,,,,,,,,,,,,,,,,,,,-312,-312,-312,-312', +'-312,-312,-312,-312,-312,-312,-312,-312,-312,-312,,,-312,-312,-312,', +',-312,,,-312,,,-312,-312,,-312,,-312,,-312,,-312,-312,,-312,-312,-312', +'-312,-312,,-312,,-312,,,,,,,,,,,,,,-312,,,-312,-312,-312,-312,,-312', +',-312,,81,82,83,-312,65,,,,71,72,,,,75,,73,74,76,354,355,79,80,,,,,', +'84,349,357,114,113,115,116,,,254,,,,,,,53,,,118,117,119,108,64,110,109', +'111,,112,120,121,,104,105,49,50,48,,,,,,,,,,,,,,,,,,,,245,,,253,,,66', +'67,,,68,,436,,,,52,,,,,,,,,250,,,,,102,90,93,94,,95,97,96,98,,,,,91', +'101,,,,81,82,83,85,65,92,106,107,71,72,46,47,,75,,73,74,76,354,355,79', +'80,,,,,,84,349,357,114,113,115,116,,,254,,,,,,,53,,,118,117,119,108', +'64,110,109,111,,112,120,121,,104,105,49,50,48,,,,,,,,,,,,,,,,,,,,245', +',,253,,,66,67,,,68,,,,,,52,,,,,,,,,250,,,,,102,90,93,94,,95,97,96,98', +',,,,91,101,,,,81,82,83,85,65,92,106,107,71,72,46,47,,75,,73,74,76,35', +'36,79,80,,,,,,84,33,32,114,113,115,116,,,23,,,,,,,53,,,118,117,119,108', +'64,110,109,111,,112,120,121,,104,105,49,50,48,,,,,,,,,,,,,,,,,,,,245', +',,253,,,66,67,,,68,,,,,,52,,,,,,,,,24,,,,,102,90,93,94,,95,97,96,98', +',,,,91,101,,,,81,82,83,85,65,92,106,107,71,72,46,47,,75,,73,74,76,354', +'355,79,80,,,,,,84,349,357,114,113,115,116,,,254,,,,,,,53,,,118,117,119', +'108,64,110,109,111,,112,120,121,,104,105,49,50,48,,,,,,,,,,,,,,,,,,', +',245,,,253,,,66,67,,,68,,,,,,52,,,,,,,,,250,,,,,102,90,93,94,,95,97', +'96,98,,,,,91,101,,,,81,82,83,85,65,92,106,107,71,72,46,47,,75,,73,74', +'76,354,355,79,80,,,,,,84,349,357,114,113,115,116,,,254,,,,,,,53,,,118', +'117,119,108,64,110,109,111,,112,120,121,,104,105,49,50,48,,,,,,,,,,', +',,,,,,,,,245,,,253,,,66,67,,,68,,,,,,52,,,,,,,,,250,,,,,102,90,93,94', +',95,97,96,98,,,,,91,101,,,,81,82,83,85,65,92,106,107,71,72,46,47,,75', +',73,74,76,35,36,79,80,,,,,,84,33,32,114,113,115,116,,,254,,,,,,,53,', +',118,117,119,108,64,110,109,111,,112,120,121,,104,105,49,50,48,,,,,', +',,,,,,,,,,,,,,245,,,253,,,66,67,,,68,,,,,,52,,,,,,,,,250,,,,,102,90', +'93,94,,95,97,96,98,,,,,91,101,,,,81,82,83,85,65,92,106,107,71,72,46', +'47,,75,,73,74,76,35,36,79,80,,,,,,84,33,32,114,113,115,116,,,254,,,', +',,,53,,,118,117,119,108,64,110,109,111,,112,120,121,,104,105,49,50,48', +',,,,,,,,,,,,,,,,,,,245,,,253,,,66,67,,,68,,,,,,52,,,,,,,,,250,,,,,102', +'90,93,94,,95,97,96,98,,,,,91,101,,,,,,,85,,92,106,107,,,46,47,81,82', +'83,11,65,,,,71,72,,,,75,,73,74,76,35,36,79,80,,,,,,84,33,32,114,113', +'115,116,,,23,,,,,,10,53,,12,118,117,119,108,64,110,109,111,,112,120', +'121,,104,105,49,50,48,,,,,,,,,,,,,,,,,,,,45,,,38,,,66,67,,,68,,40,,', +',52,,,,,,,,,24,,,,,102,90,93,94,,95,97,96,98,,,,,91,101,,,,81,82,83', +'85,65,92,106,107,71,72,46,47,,75,,73,74,76,354,355,79,80,,,,,,84,349', +'357,114,113,115,116,,,254,,,,,,,53,,,118,117,119,108,64,110,109,111', +'327,112,120,121,,104,105,49,50,48,,,,,,,,,,,,,,,,,,,,245,,,253,,,66', +'67,,,68,,324,,,,52,,,328,,,,,,250,,,,,102,325,93,94,,95,97,96,98,,,', +',91,101,,,,81,82,83,85,65,92,106,107,71,72,46,47,,75,,73,74,76,354,355', +'79,80,,,,,,84,349,357,114,113,115,116,,,254,,,,,,,53,,,118,117,119,108', +'64,110,109,111,327,112,120,121,,104,105,49,50,48,,,,,,,,,,,,,,,,,,,', +'245,,,253,,,66,67,,,68,,,,,,52,,,328,,,,,,250,,,,,102,325,93,94,,95', +'97,96,98,,,,,91,101,,,,81,82,83,85,65,92,106,107,71,72,46,47,,75,,73', +'74,76,354,355,79,80,,,,,,84,349,357,114,113,115,116,,,254,,,,,,,53,', +',118,117,119,108,64,110,109,111,,112,120,121,,104,105,49,50,48,,,,,', +',,,,,,,,,,,,,,245,,,253,,,66,67,,,68,,,,,,52,,,,,,,,,250,,,,,102,90', +'93,94,,95,97,96,98,,,,,91,101,,,,81,82,83,85,65,92,106,107,71,72,46', +'47,,75,,73,74,76,35,36,79,80,,,,,,84,33,32,114,113,115,116,,,23,,,,', +',,53,,,118,117,119,108,64,110,109,111,,112,120,121,,104,105,49,50,48', +',,,,,,,,,,,,,,,,,,,245,,,253,,,66,67,,,68,,,,,,52,,,,,,,,,24,,,,,102', +'90,93,94,,95,97,96,98,,,,,91,101,,,,81,82,83,85,65,92,106,107,71,72', +'46,47,,75,,73,74,76,35,36,79,80,,,,,,84,33,32,114,113,115,116,,,23,', +',,,,,53,,,118,117,119,108,64,110,109,111,,112,120,121,,104,105,49,50', +'48,,,,,,,,,,,,,,,,,,,,245,,,253,,,66,67,,,68,,,,,,52,,,,,,,,,24,,,,', +'102,90,93,94,,95,97,96,98,,,,,91,101,,,,81,82,83,85,65,92,106,107,71', +'72,46,47,,75,,73,74,76,35,36,79,80,,,,,,84,33,32,114,113,115,116,,,254', +',,,,,,53,,,118,117,119,108,64,110,109,111,,112,120,121,,104,105,49,50', +'48,,,,,,,,,,,,,,,,,,,,245,,,253,,,66,67,,,68,,,,,,52,,,,,,,,,250,,,', +',102,90,93,94,,95,97,96,98,,,,,91,101,,,,81,82,83,85,65,92,106,107,71', +'72,46,47,,75,,73,74,76,35,36,79,80,,,,,,84,33,32,114,113,115,116,,,23', +',,,,,,53,,,118,117,119,108,64,110,109,111,,112,120,121,,104,105,49,50', +'48,,,,,,,,,,,,,,,,,,,,245,,,253,,,66,67,,,68,,,,,,52,,,,,,,,,24,,,,', +'102,90,93,94,,95,97,96,98,,,,,91,101,126,,,,,125,85,,92,106,107,,,46', +'47,81,82,83,,65,,,,71,72,,,,75,,73,74,76,354,355,79,80,,,,,,84,349,357', +'114,113,115,116,,,254,,,,,,,53,,,118,117,119,108,64,110,109,111,327', +'112,120,121,,104,105,49,50,48,,,,,,,,,,,,,,,,,,,,245,,,253,,,66,67,', +',68,,,,322,,52,,,328,,,,,,250,,,,,102,325,93,94,,95,97,96,98,,,,,91', +'101,,,,81,82,83,85,65,92,106,107,71,72,46,47,,75,,73,74,76,354,355,79', +'80,,,,,,84,349,357,114,113,115,116,,,254,,,,,,,53,,,118,117,119,108', +'64,110,109,111,327,112,120,121,,104,105,49,50,48,,,,,,,,,,,,,,,,,,,', +'245,,,253,,,66,67,,,68,,799,,322,,52,,,328,,,,,,250,,,,,102,325,93,94', +',95,97,96,98,,,,,91,101,,,,,,,85,,92,106,107,-275,,46,47,,,,-275,-275', +'-275,,,-275,-275,-275,,-275,,,,,,,,-275,-275,-275,-275,,,,,,,,,-275', +'-275,,-275,-275,-275,-275,-275,,,,,,,,,,,,,,,,,,,,,,,-275,-275,-275', +'-275,-275,-275,-275,-275,-275,-275,-275,-275,-275,-275,,,-275,-275,-275', +',,-275,,306,-275,,,-275,-275,,-275,,-275,,-275,,-275,-275,,-275,-275', +'-275,-275,-275,,-275,-275,-275,493,,490,489,488,498,491,,,,,,,-275,', +'501,-275,-275,-720,-275,,-275,,,,-720,-720,-720,-275,,-720,-720,-720', +',-720,,,496,,,,,-720,-720,-720,-720,-720,,509,508,,,,502,-720,-720,', +'-720,-720,-720,-720,-720,,,,,,,,,,,,,,,,,,,,,,,-720,-720,-720,-720,-720', +'-720,-720,-720,-720,-720,-720,-720,-720,-720,,,-720,-720,-720,,,-720', +',,-720,,,-720,-720,,-720,,-720,,-720,,-720,-720,,-720,-720,-720,-720', +'-720,,-720,-720,-720,,,,,,,,,,,,,,-720,,,-720,-720,-720,-720,,-720,-721', +'-720,,,,,-720,-721,-721,-721,,,-721,-721,-721,,-721,,,,,,,,-721,-721', +'-721,-721,-721,,,,,,,,-721,-721,,-721,-721,-721,-721,-721,,,,,,,,,,', +',,,,,,,,,,,,-721,-721,-721,-721,-721,-721,-721,-721,-721,-721,-721,-721', +'-721,-721,,,-721,-721,-721,,,-721,,,-721,,,-721,-721,,-721,,-721,,-721', +',-721,-721,,-721,-721,-721,-721,-721,,-721,-721,-721,,,,,,,,,,,,,,-721', +',,-721,-721,-721,-721,,-721,,-721,,81,82,83,-721,65,,,,71,72,,,,75,', +'73,74,76,35,36,79,80,,,,,,84,33,32,114,113,115,116,,,254,,,,,,,53,,', +'118,117,119,108,64,110,109,111,,112,120,121,,104,105,49,50,48,,,,,,', +',,,,,,,,,,,,,245,,,253,,,66,67,,,68,,,,,,52,,,,,,,,,250,,,,,102,90,93', +'94,,95,97,96,98,,,,,91,101,,,,81,82,83,85,65,92,106,107,71,72,46,47', +',75,,73,74,76,354,355,79,80,,,,,,84,349,357,114,113,115,116,,,254,,', +',,,,53,,,118,117,119,108,64,110,109,111,,112,120,121,,104,105,49,50', +'48,,,,,,,,,,,,,,,,,,,,245,,,253,,,66,67,,,68,,,,,,52,,,,,,,,,250,,,', +',102,90,93,94,,95,97,96,98,,,,,91,101,,,,,,,85,,92,106,107,,,46,47,81', +'82,83,11,65,,,,71,72,,,,75,,73,74,76,35,36,79,80,,,,,,84,33,32,114,113', +'115,116,,,23,,,,,,10,53,9,12,118,117,119,108,64,110,109,111,,112,120', +'121,,104,105,49,50,48,,,,,,,,,,,,,,,,,,,,45,,,38,,,66,67,,,68,,40,,', +',52,,,,,,,,,24,,,,,102,90,93,94,,95,97,96,98,,,,,91,101,,,,,,420,85', +',92,106,107,,,46,47,81,82,83,,65,,,,71,72,,,,75,,73,74,76,35,36,79,80', +',,,,,84,33,32,114,113,115,116,,,23,,,,,,,53,,,118,117,119,108,64,110', +'109,111,,112,120,121,,104,105,49,50,48,,,,,,,,,,,,,,,,,,,,245,,,253', +',,66,67,,,68,,,,,,52,,,,,,,,,24,,,,,102,90,93,94,,95,97,96,98,,,,,91', +'101,,,,81,82,83,85,65,92,106,107,71,72,46,47,,75,,73,74,76,35,36,79', +'80,,,,,,84,33,32,114,113,115,116,,,23,,,,,,,53,,,118,117,119,108,64', +'110,109,111,,112,120,121,,104,105,49,50,48,,,,,,,,,,,,,,,,,,,,245,,', +'253,,,66,67,,,68,,,,,,52,,,,,,,,,24,,,,,102,90,93,94,,95,97,96,98,,', +',,91,101,,,,81,82,83,85,65,92,106,107,71,72,46,47,,75,,73,74,76,35,36', +'79,80,,,,,,84,33,32,114,113,115,116,,,23,,,,,,,53,,,118,117,119,108', +'64,110,109,111,,112,120,121,,104,105,49,50,48,,,,,,,,,,,,,,,,,,,,245', +',,253,,,66,67,,,68,,,,,,52,,,,,,,,,24,,,,,102,90,93,94,,95,97,96,98', +',,,,91,101,,,,81,82,83,85,65,92,106,107,71,72,46,47,,75,,73,74,76,35', +'36,79,80,,,,,,84,33,32,114,113,115,116,,,23,,,,,,,53,,,118,117,119,108', +'64,110,109,111,,112,120,121,,104,105,49,50,48,,,,,,,,,,,,,,,,,,,,245', +',,253,,,66,67,,,68,,,,,,52,,,,,,,,,24,,,,,102,90,93,94,,95,97,96,98', +',,,,91,101,,,,,,,85,,92,106,107,,,46,47,81,82,83,11,65,,,,71,72,,,,75', +',73,74,76,35,36,79,80,,,,,,84,33,32,114,113,115,116,,,23,,,,,,10,53', +',12,118,117,119,108,64,110,109,111,,112,120,121,,104,105,49,50,48,,', +',,,,,,,,,,,,,,,,,45,,,38,,,66,67,,,68,,40,,,,52,,,,,,,,,24,,,,,102,90', +'93,94,,95,97,96,98,,,,,91,101,,,,,,,85,,92,106,107,,,46,47,81,82,83', +'11,65,,,,71,72,,,,75,,73,74,76,35,36,79,80,,,,,,84,33,32,114,113,115', +'116,,,23,,,,,,10,53,,12,118,117,119,108,64,110,109,111,,112,120,121', +',104,105,49,50,48,,,,,,,,,,,,,,,,,,,,45,,,38,,,66,67,,,68,,40,,,,52', +',,,,,,,,24,,,,,102,90,93,94,,95,97,96,98,,,,,91,101,,,,81,82,83,85,65', +'92,106,107,71,72,46,47,,75,,73,74,76,354,355,79,80,,,,,,84,349,357,114', +'113,115,116,,,254,,,,,,,53,,,118,117,119,108,64,110,109,111,,112,120', +'121,,104,105,49,50,48,,,,,,,,,,,,,,,,,,,,245,,,253,,,66,67,,,68,,,,', +',52,,,,,,,,,250,,,,,102,90,93,94,,95,97,96,98,,,,,91,101,,,,81,82,83', +'85,65,92,106,107,71,72,46,47,,75,,73,74,76,35,36,79,80,,,,,,84,33,32', +'114,113,115,116,,,254,,,,,,,53,,,118,117,119,108,64,110,109,111,327', +'112,120,121,,104,105,49,50,48,,,,,,,,,,,,,,,,,,,,245,,,253,,,66,67,', +',68,,324,,322,,52,,,328,,,,,,250,,,,,102,325,93,94,,95,97,96,98,,,,', +'91,101,,,,81,82,83,85,65,92,106,107,71,72,46,47,,75,,73,74,76,35,36', +'79,80,,,,,,84,33,32,114,113,115,116,,,254,,,,,,,53,,,118,117,119,108', +'64,110,109,111,,112,120,121,,104,105,49,50,48,,,,,,,,,,,,,,,,,,,,245', +',,253,,,66,67,,,68,,,,,,52,,,,,,,,,250,,,,,102,90,93,94,,95,97,96,98', +',,,,91,101,,,,81,82,83,85,65,92,106,107,71,72,46,47,,75,,73,74,76,354', +'355,79,80,,,,,,84,349,357,114,113,115,116,,,254,,,,,,,53,,,118,117,119', +'108,64,110,109,111,,112,120,121,,104,105,49,50,48,,,,,,,,,,,,,,,,,,', +',245,,,253,,,66,67,,,68,,869,,,,52,,,,,,,,,250,,,,,102,90,93,94,,95', +'97,96,98,,,,,91,101,,,,81,82,83,85,65,92,106,107,71,72,46,47,,75,,73', +'74,76,35,36,79,80,,,,,,84,33,32,114,113,115,116,,,254,,,,,,,53,,,118', +'117,119,108,64,110,109,111,,112,120,121,,104,105,49,50,48,,,,,,,,,,', +',,,,,,,,,245,,,253,,,66,67,,,68,,,,,,52,,,,,,,,,250,,,,,102,90,93,94', +',95,97,96,98,,,,,91,101,,,,81,82,83,85,65,92,106,107,71,72,46,47,,75', +',73,74,76,35,36,79,80,,,,,,84,33,32,114,113,115,116,,,254,,,,,,,53,', +',118,117,119,108,64,110,109,111,,112,120,121,,104,105,49,50,48,,,,,', +',,,,,,,,,,,,,,245,,,253,,,66,67,,,68,,436,,,,52,,,,,,,,,250,,,,,102', +'90,93,94,,95,97,96,98,,,,,91,101,,,,,,,85,,92,106,107,,,46,47,81,82', +'83,11,65,,,,71,72,,,,75,,73,74,76,35,36,79,80,,,,,,84,33,32,114,113', +'115,116,,,23,,,,,,10,53,,12,118,117,119,108,64,110,109,111,,112,120', +'121,,104,105,49,50,48,,,,,,,,,,,,,,,,,,,,45,,,38,,,66,67,,,68,,40,,', +',52,,,,,,,,,24,,,,,102,90,93,94,,95,97,96,98,,,,,91,101,,,,81,82,83', +'85,65,92,106,107,71,72,46,47,,75,,73,74,76,35,36,79,80,,,,,,84,33,32', +'114,113,115,116,,,254,,,,,,,53,,,118,117,119,108,64,110,109,111,327', +'112,120,121,,104,105,49,50,48,,,,,,,,,,,,,,,,,,,,245,,,253,,,66,67,', +',68,,324,,322,,52,,,328,,,,,,250,,,,,102,325,93,94,,95,97,96,98,,,,', +'91,101,,,,81,82,83,85,65,92,106,107,71,72,46,47,,75,,73,74,76,354,355', +'79,80,,,,,,84,349,357,114,113,115,116,,,254,,,,,,,53,,,118,117,119,108', +'64,110,109,111,,112,120,121,,104,105,49,50,48,,,,,,,,,,,,,,,,,,,,245', +',,253,,,66,67,,,68,,,,,,52,,,,,,,,,250,,,,,102,90,93,94,,95,97,96,98', +',,,,91,101,,,,81,82,83,85,65,92,106,107,71,72,46,47,,75,,73,74,76,354', +'355,79,80,,,,,,84,349,357,114,113,115,116,,,254,,,,,,,53,,,118,117,119', +'108,64,110,109,111,,112,120,121,,104,105,49,50,48,,,,,,,,,,,,,,,,,,', +',245,,,253,,,66,67,,,68,,,,,,52,,,,,,,,,250,,,,,102,90,93,94,,95,97', +'96,98,,,,,91,101,,,,81,82,83,85,65,92,106,107,71,72,46,47,,75,,73,74', +'76,354,355,79,80,,,,,,84,349,357,114,113,115,116,,,254,,,,,,,53,,,118', +'117,119,108,64,110,109,111,,112,120,121,,104,105,49,50,48,,,,,,,,,,', +',,,,,,,,,245,,,253,,,66,67,,,68,,,,,,52,,,,,,,,,250,,,,,102,90,93,94', +',95,97,96,98,,,,,91,101,,,,81,82,83,85,65,92,106,107,71,72,46,47,,75', +',73,74,76,354,355,79,80,,,,,,84,349,357,114,113,115,116,,,254,,,,,,', +'53,,,118,117,119,108,64,110,109,111,,112,120,121,,104,105,49,50,48,', +',,,,,,,,,,,,,,,,,,245,,,253,,,66,67,,,68,,,,,,52,,,,,,,,,250,,,,,102', +'90,93,94,,95,97,96,98,,,,,91,101,,,,81,82,83,85,65,92,106,107,71,72', +'46,47,,75,,73,74,76,35,36,79,80,,,,,,84,33,32,114,113,115,116,,,254', +',,,,,,53,,,118,117,119,108,64,110,109,111,,112,120,121,,104,105,49,50', +'48,,,,,,,,,,,,,,,,,,,,245,,,253,,,66,67,,,68,,436,,,,52,,,,,,,,,250', +',,,,102,90,93,94,,95,97,96,98,,,,,91,101,,,,81,82,83,85,65,92,106,107', +'71,72,46,47,,75,,73,74,76,35,36,79,80,,,,,,84,33,32,114,113,115,116', +',,23,,,,,,,53,,,118,117,119,108,64,110,109,111,,112,120,121,,104,105', +'49,50,48,,,,,,,,,,,,,,,,,,,,245,,,253,,,66,67,,,68,,,,,,52,,,,,,,,,24', +',,,,102,90,93,94,,95,97,96,98,,,,,91,101,,,,81,82,83,85,65,92,106,107', +'71,72,46,47,,75,,73,74,76,35,36,79,80,,,,,,84,33,32,114,113,115,116', +',,23,,,,,,,53,,,118,117,119,108,64,110,109,111,,112,120,121,,104,105', +'49,50,48,,,,,,,,,,,,,,,,,,,,245,,,253,,,66,67,,,68,,,,,,52,,,,,,,,,24', +',,,,102,90,93,94,,95,97,96,98,,,,,91,101,,,,81,82,83,85,65,92,106,107', +'71,72,46,47,,75,,73,74,76,35,36,79,80,,,,,,84,33,32,114,113,115,116', +',,254,,,,,,,53,,,118,117,119,108,64,110,109,111,,112,120,121,,104,105', +'49,50,48,,,,,,,,,,,,,,,,,,,,245,,,253,,,66,67,,,68,,,,,,52,,,,,,,,,250', +',,,,102,90,93,94,,95,97,96,98,,,,,91,101,,,,81,82,83,85,65,92,106,107', +'71,72,46,47,,75,,73,74,76,35,36,79,80,,,,,,84,33,32,114,113,115,116', +',,254,,,,,,,53,,,118,117,119,108,64,110,109,111,327,112,120,121,,104', +'105,49,50,48,,,,,,,,,,,,,,,,,,,,245,,,253,,,66,67,,,68,,324,,322,,52', +',,328,,,,,,250,,,,,102,325,93,94,,95,97,96,98,,,,,91,101,,,,81,82,83', +'85,65,92,106,107,71,72,46,47,,75,,73,74,76,35,36,79,80,,,,,,84,33,32', +'114,113,115,116,,,254,,,,,,,53,,,118,117,119,108,64,110,109,111,327', +'112,120,121,,104,105,49,50,48,,,,,,,,,,,,,,,,,,,,245,,,253,,,66,67,', +',68,,324,,322,,52,,,328,,,,,,250,,,,,102,325,93,94,,95,97,96,98,,,,', +'91,101,,,,81,82,83,85,65,92,106,107,71,72,46,47,,75,,73,74,76,35,36', +'79,80,,,,,,84,33,32,114,113,115,116,,,254,,,,,,,53,,,118,117,119,108', +'64,110,109,111,327,112,120,121,,104,105,49,50,48,,,,,,,,,,,,,,,,,,,', +'245,,,253,,,66,67,,,68,,324,,322,,52,,,328,,,,,,250,,,,,102,325,93,94', +',95,97,96,98,,,,,91,101,,,,81,82,83,85,65,92,106,107,71,72,46,47,,75', +',73,74,76,354,355,79,80,,,,,,84,349,357,114,113,115,116,,,254,,,,,,', +'53,,,118,117,119,108,64,110,109,111,,112,120,121,,104,105,49,50,48,', +',,,,,,,,,,,,,,,,,,245,,,253,,,66,67,,,68,,324,,,,52,,,,,,,,,250,,,,', +'102,90,93,94,,95,97,96,98,,,,,91,101,,,,81,82,83,85,65,92,106,107,71', +'72,46,47,,75,,73,74,76,354,355,79,80,,,,,,84,349,357,114,113,115,116', +',,254,,,,,,,350,,,118,117,119,108,64,110,109,111,,112,120,121,,104,105', +',,358,,,,,,,,,,,,,,,,,,,,395,,,38,,,66,67,,,68,,40,,,,,,,,,,,,,,,,,', +'102,90,93,94,,95,97,96,98,,,,,91,101,,,,81,82,83,85,65,92,106,107,71', +'72,,,,75,,73,74,76,354,355,79,80,,,,,,84,349,357,114,113,115,116,,,254', +',,,,,,350,,,118,117,119,108,64,110,109,111,,112,120,121,,104,105,,,358', +',,,,,,,,,,,,,,,,,,,1108,,,253,,,66,67,,,68,,,,,,,,,,,,,,,,,,,,102,90', +'93,94,,95,97,96,98,,,,,91,101,,,,81,82,83,85,65,92,106,107,71,72,,,', +'75,,73,74,76,354,355,79,80,,,,,,84,349,357,114,113,115,116,,,254,,,', +',,,350,,,118,117,119,108,64,110,109,111,,112,120,121,,104,105,,,358', +',,,,,,,,,,,,,,,,,,,346,,,342,,,66,67,,,68,,341,,,,,,,,,,,,,,,,,,102', +'90,93,94,,95,97,96,98,,,,,91,101,,,,81,82,83,85,65,92,106,107,71,72', +',,,75,,73,74,76,354,355,79,80,,,,,,84,349,357,114,113,115,116,,,254', +',,,,,,350,,,118,117,119,400,64,110,109,401,,112,120,121,,104,105,,,358', +',,,,,,,,,,,,,,,,407,,,402,,,253,,,66,67,,,68,,,,,,,,,,,,,,,,,,,,102', +'90,93,94,,95,97,96,98,,,,,91,101,,,,81,82,83,85,65,92,106,107,71,72', +',,,75,,73,74,76,354,355,79,80,,,,,,84,349,357,114,113,115,116,,,254', +',,,,,,350,,,118,117,119,108,64,110,109,111,,112,120,121,,104,105,,,358', +',,,,,,,,,,,,,,,,,,,1146,,,253,,,66,67,,,68,,,,,,,,,,,,,,,,,,,,102,90', +'93,94,,95,97,96,98,,,,,91,101,,,,81,82,83,85,65,92,106,107,71,72,,,', +'75,,73,74,76,354,355,79,80,,,,,,84,349,357,114,113,115,116,,,254,,,', +',,,350,,,118,117,119,400,64,110,109,401,,112,120,121,,104,105,,,358', +',,,,,,,,,,,,,,,,,,,402,,,253,,,66,67,,,68,,,,,,,,,,,,,,,,,,,,102,90', +'93,94,,95,97,96,98,,,,,91,101,,,,81,82,83,85,65,92,106,107,71,72,,,', +'75,,73,74,76,354,355,79,80,,,,,,84,349,357,114,113,115,116,,,254,,,', +',,,350,,,118,117,119,108,64,110,109,111,,112,120,121,,104,105,,,358', +',,,,,,,,,,,,,,,,,,,346,,,342,,,66,67,,,68,,,,,,,,,,,,,,,,,,,,102,90', +'93,94,,95,97,96,98,,,,,91,101,,,,81,82,83,85,65,92,106,107,71,72,,,', +'75,,73,74,76,354,355,79,80,,,,,,84,349,357,114,113,115,116,,,254,,,', +',,,350,,,118,117,119,108,64,110,109,111,,112,120,121,,104,105,,,358', +',,,,,,,,,,,,,,,,,,,346,,,253,,,66,67,,,68,,,493,,490,489,488,498,491', +',,,,,,,,501,,102,90,93,94,,95,97,96,98,,,,,91,101,,,,360,,496,85,,92', +'106,107,81,82,83,,65,509,508,,71,72,502,,,75,,73,74,76,354,355,79,80', +',,,,,84,349,357,114,113,115,116,,,254,,,,,,,350,,,118,117,119,108,64', +'110,109,111,,112,120,121,,104,105,,,358,,,,,,,,,,,,,,,,,,,,346,,,253', +',,66,67,,,68,,,493,,490,489,488,498,491,,,,,,,,,501,,102,90,93,94,,95', +'97,96,98,,,,,91,101,,,,590,,496,85,,92,106,107,81,82,83,,65,509,508', +',71,72,502,,,75,,73,74,76,354,355,79,80,,,,,,84,349,357,114,113,115', +'116,,,254,,,,,,,350,,,118,117,119,108,64,110,109,111,,112,120,121,,104', +'105,,,358,,,,,,,,,,,,,,,,,,,,346,,,342,,,66,67,,,68,,,,,,,,,,,,,,,,', +',,,102,90,93,94,,95,97,96,98,,,,,91,101,,,,81,82,83,85,65,92,106,107', +'71,72,,,,75,,73,74,76,354,355,79,80,,,,,,84,349,357,114,113,115,116', +',,254,,,,,,,350,,,118,117,119,108,64,110,109,111,,112,120,121,,104,105', +',,358,,,,,,,,,,,,,,,,,,,,346,,,342,,,66,67,,,68,,,,,,,,,,,,,,,,,,,,102', +'90,93,94,,95,97,96,98,,,,,91,101,,,,81,82,83,85,65,92,106,107,71,72', +',,,75,,73,74,76,354,355,79,80,,,,,,84,349,357,114,113,115,116,,,254', +',,,,,,350,,,118,117,119,108,64,110,109,111,,112,120,121,,104,105,,,358', +',,,,,,,,,,,,,,,,,,,1146,,,253,,,66,67,,,68,,,,,,,,,,,,,,,,,,,,102,90', +'93,94,,95,97,96,98,,,,,91,101,,,,81,82,83,85,65,92,106,107,71,72,,,', +'75,,73,74,76,354,355,79,80,,,,,,84,349,357,114,113,115,116,,,254,,,', +',,,350,,,118,117,119,108,64,110,109,111,,112,120,121,,104,105,,,358', +',,,,,,,,,,,,,,,,,,,346,,,342,,,66,67,,,68,,,,,,,,,,,,,,,,,,,,102,90', +'93,94,,95,97,96,98,,,,,91,101,,,,81,82,83,85,65,92,106,107,71,72,,,', +'75,,73,74,76,354,355,79,80,,,,,,84,349,357,114,113,115,116,,,254,,,', +',,,350,,,118,117,119,108,64,110,109,111,,112,120,121,,104,105,,,358', +',,,,,,,,,,,,,,,,,,,346,,,342,,,66,67,,,68,,,,,,,,,,,,,,,,,,,,102,90', +'93,94,,95,97,96,98,,,,,91,101,,,,,,,85,,92,106,107,185,196,186,209,182', +'202,192,191,212,213,207,190,189,184,210,214,215,194,183,197,201,203', +'195,188,,,,204,211,206,205,198,208,193,181,200,199,,,,,,180,187,178', +'179,175,176,177,138,140,,,139,,,,,,,,169,170,,166,148,149,150,157,154', +'156,,,151,152,,,,171,172,158,159,,,,,,,,,,,,,,163,162,,147,168,165,164', +'173,160,161,155,153,145,167,146,,,174,102,,,,,,,,,,,,,,101,185,196,186', +'209,182,202,192,191,212,213,207,190,189,184,210,214,215,194,183,197', +'201,203,195,188,,,,204,211,206,205,198,208,193,181,200,199,,,,,,180', +'187,178,179,175,176,177,138,140,,,139,,,,,,,,169,170,,166,148,149,150', +'157,154,156,,,151,152,,,,171,172,158,159,,,,,,,,,,,,,,163,162,,147,168', +'165,164,173,160,161,155,153,145,167,146,,,174,102,,,,,,,,,,,,,,101,185', +'196,186,209,182,202,192,191,212,213,207,190,189,184,210,214,215,194', +'183,197,201,203,195,188,,,,204,211,206,205,198,208,193,181,200,199,', +',,,,180,187,178,179,175,176,177,138,140,137,,139,,,,,,,,169,170,,166', +'148,149,150,157,154,156,,,151,152,,,,171,172,158,159,,,,,,,,,,,,,,163', +'162,,147,168,165,164,173,160,161,155,153,145,167,146,,,174,102,,,,,', +',,,,,,,,101,185,196,186,209,182,202,192,191,212,213,207,190,189,184', +'210,214,215,194,183,197,201,203,195,188,,,,204,211,206,205,198,208,193', +'181,200,199,,,,,,180,187,178,179,175,176,177,138,140,,,139,,,,,,,,169', +'170,,166,148,149,150,157,154,156,,,151,152,,,,171,172,158,159,,,,,,', +',,,,,,,163,162,,147,168,165,164,173,160,161,155,153,145,167,146,,,174', +'102,114,113,115,116,,,,,,,,,,101,,,118,117,119,776,,,493,779,490,489', +'488,498,491,104,105,,,358,,,,501,,,,,,,,,,,,,,,,778,,,749,,,496,747', +',,748,,,,,506,505,509,508,,,,502,,,,777,,,,102,90,93,94,,95,97,96,98', +',,,,91,101,114,113,115,116,,,85,,92,106,107,,,764,765,,118,117,119,776', +',,,779,756,,,,,104,105,,,358,501,,,,,,,,,,,,,,,,,,,778,,,749,,,,747', +',,748,,751,,,,,,,502,,,,,,,777,,,,102,757,93,94,,95,97,96,98,,,,,91', +'101,114,113,115,116,,,85,,92,106,107,,,764,765,,118,117,119,776,,,493', +'779,490,489,488,498,491,104,105,,,358,,,,501,,,,,,,,,,,,,,,,778,,,749', +',,496,747,,,748,,,,,506,505,509,508,,,,502,,,,777,,,,102,90,93,94,,95', +'97,96,98,,,,,91,101,,,,,,,85,,92,106,107,,,764,765,185,196,186,209,182', +'202,192,191,212,213,207,190,189,184,210,214,215,194,183,197,201,203', +'195,188,,,,204,211,206,205,198,208,193,181,200,199,,,,,,180,187,178', +'179,175,176,177,138,140,,,139,,,,,,,,169,170,,166,148,149,150,157,154', +'156,,,151,152,,,,171,172,158,159,,,,,,,,,,,,,,163,162,,147,168,165,164', +'173,160,161,155,153,145,167,146,,,174,114,113,115,116,,,,,,493,,490', +'489,488,498,491,118,117,119,776,,,,779,501,,,,,104,105,,,358,,,,,,,', +',,,,,496,,,,,,,778,,,749,509,508,,747,,502,748,,,,,,,,,,,,,,,,777,,', +',102,90,93,94,,95,97,96,98,,,,,91,101,114,113,115,116,487,,85,,92,106', +'107,,,764,765,,118,117,119,776,,,493,779,490,489,488,498,491,104,105', +',,358,,,,501,,,,,,,,,,,,,,,,778,,,749,,,496,747,,,748,,,,,,,509,508', +',,,502,,,,777,,,,102,90,93,94,,95,97,96,98,,,,,91,101,,,,,,,85,,92,106', +'107,,,764,765,185,196,186,209,182,202,192,191,212,213,207,190,189,184', +'210,214,215,194,183,197,201,203,195,188,,,,204,211,206,294,293,295,292', +'181,200,199,,,,,,180,187,178,179,289,290,291,287,140,110,109,288,,112', +',,,,,169,170,,166,148,149,150,157,154,156,,,151,152,,,,171,172,158,159', +',,,,,299,,,,,,,,163,162,,147,168,165,164,173,160,161,155,153,145,167', +'146,,,174,114,113,115,116,,,,,,,,,,,,,118,117,119,776,,,,779,,,,,,104', +'105,,,358,,,,,,,,,,,,,,,,,,,,778,,,749,,,,747,,,748,,751,,,,,,,493,', +'490,489,488,498,491,777,,,,102,90,93,94,501,95,97,96,98,,,,,91,101,240', +'114,113,115,116,,85,,92,106,107,496,,764,765,,,118,117,119,776,,509', +'508,779,,,502,,,104,105,,,358,,,,,,,,,,,,,,,,,,,,778,,,749,,,,747,,', +'748,,751,487,,,,,,,,,,,,,777,,,,102,90,93,94,,95,97,96,98,,,,,91,101', +'114,113,115,116,,,85,,92,106,107,,,764,765,,118,117,119,776,,,,779,756', +',,,,104,105,,,358,501,,,,,,,,,,,,,,,,,,,778,,,749,,,,747,,,748,,751', +',,,,,,502,,,,,,,777,,,,102,757,93,94,,95,97,96,98,,,,,91,101,114,113', +'115,116,,,85,,92,106,107,,,764,765,,118,117,119,776,,,,779,756,,,,,104', +'105,,,358,501,,,,,,,,,,,,,,,,,,,778,,,749,,,,747,,,748,,751,,,,,,,502', +',,,,,,777,,,,102,757,93,94,,95,97,96,98,,,,,91,101,114,113,115,116,', +',85,,92,106,107,,,764,765,,118,117,119,776,,,493,779,490,489,488,498', +'491,104,105,,,358,,,,501,,,,,,,,,,,,,,,,778,,,749,,,496,747,,,748,,', +',,506,505,509,508,,,,502,,,,777,,,,102,90,93,94,,95,97,96,98,,,,,91', +'101,114,113,115,116,,,85,,92,106,107,,,764,765,,118,117,119,776,,,,779', +',,,,,104,105,,,358,,,,,,,,,,,,,,,,,,,,778,,,749,,,,747,,,748,,,,,,,', +',,,,,,,,777,,,,102,90,93,94,,95,97,96,98,,,,,91,101,114,113,115,116', +',,85,,92,106,107,,,764,765,,118,117,119,776,,,,779,,,,,,104,105,,,358', +',,,,,,,,,,,,,,,,,,,778,,,749,,,,747,,,748,,751,,,,,,,,,,,,,,777,,,,102', +'90,93,94,,95,97,96,98,,,,,91,101,114,113,115,116,,,85,,92,106,107,,', +'764,765,,118,117,119,776,,,,779,,,,,,104,105,,,358,,,,,,,,,,,,,,,,,', +',,778,,,749,,,,747,,,748,,,,,,,,,,,,,,,,777,,,,102,90,93,94,,95,97,96', +'98,,,,,91,101,114,113,115,116,,,85,,92,106,107,,,764,765,,118,117,119', +'776,,,,779,756,,,,,104,105,,,358,501,,,,,,,,,,,,,,,,,,,778,,,749,,,', +'747,,,748,,751,,,,,,,502,,,,,,,777,,,,102,757,93,94,,95,97,96,98,,,', +',91,101,114,113,115,116,,,85,,92,106,107,,,764,765,,118,117,119,776', +',,,779,756,,,,,104,105,,,358,501,,,,,,,,,,,,,,,,,,,778,,,749,,,,747', +',,748,,751,,,,,,,502,,,,,,,777,,,,102,757,93,94,,95,97,96,98,,,,,91', +'101,114,113,115,116,,,85,,92,106,107,,,764,765,,118,117,119,776,,,,779', +',,,,,104,105,,,358,,,,,,,,114,113,115,116,,,,,,,,,778,,,749,118,117', +'119,747,,,748,,751,,,,,104,105,,,358,,,,,777,,,,102,90,93,94,,95,97', +'96,98,,,,,91,101,,,,,,,85,,92,106,107,,,764,765,,,,,,,,,,,,102,90,93', +'94,,95,97,96,98,,,,,91,101,114,113,115,116,,,85,,92,106,107,,,,,,118', +'117,119,,,,,,,,,,,104,105,,,358,114,113,115,116,,,,,,,,,,,,,118,117', +'119,,,,,,,,,,,104,105,,,358,,,,,,,,,,,,,,,,102,90,93,94,,95,97,96,98', +',,,,91,101,,,,,,,85,,92,106,107,,,,,,,,,102,90,93,94,,95,97,96,98,,', +',,91,101,114,113,115,116,,,85,,92,106,107,,,,,,118,117,119,493,,490', +'489,488,498,491,,,,104,105,,,358,501,,,,,,,,,,,493,,490,489,488,498', +'491,,,,,496,,,,501,,,,,506,505,509,508,,,,502,,,,,,,,,,496,102,90,93', +'94,,95,97,96,98,,509,508,,91,101,502,,,,,,85,,92,106,107,,,493,487,490', +'489,488,498,491,493,,490,489,488,498,491,,501,,,,,,,501,,,,,487,,,,', +',,,,,496,,,,,,,496,,,,509,508,,,,502,,509,508,841,470,,502,842,,,,,', +',,169,170,,166,148,149,150,157,154,156,,,151,152,,,,171,172,158,159', +',,,487,,306,,,,,487,,,163,162,,147,168,165,164,173,160,161,155,153,145', +'167,146,558,462,174,,559,,,,,,,,169,170,,166,148,149,150,157,154,156', +',,151,152,,,,171,172,158,159,,,,,,,,,,,,,,163,162,,147,168,165,164,173', +'160,161,155,153,145,167,146,844,470,174,,845,,,,,,,,169,170,,166,148', +'149,150,157,154,156,,,151,152,,,,171,172,158,159,,,,,,306,,,,,,,,163', +'162,,147,168,165,164,173,160,161,155,153,145,167,146,558,462,174,,559', +',,,,,,,169,170,,166,148,149,150,157,154,156,,,151,152,,,,171,172,158', +'159,,,,,,306,,,,,,,,163,162,,147,168,165,164,173,160,161,155,153,145', +'167,146,812,470,174,,813,,,,,,,,169,170,,166,148,149,150,157,154,156', +',,151,152,,,,171,172,158,159,,,,,,306,,,,,,,,163,162,,147,168,165,164', +'173,160,161,155,153,145,167,146,731,470,174,,732,,,,,,,,169,170,,166', +'148,149,150,157,154,156,,,151,152,,,,171,172,158,159,,,,,,306,,,,,,', +',163,162,,147,168,165,164,173,160,161,155,153,145,167,146,809,462,174', +',810,,,,,,,,169,170,,166,148,149,150,157,154,156,,,151,152,,,,171,172', +'158,159,,,,,,306,,,,,,,,163,162,,147,168,165,164,173,160,161,155,153', +'145,167,146,839,462,174,,840,,,,,,,,169,170,,166,148,149,150,157,154', +'156,,,151,152,,,,171,172,158,159,,,,,,306,,,,,,,,163,162,,147,168,165', +'164,173,160,161,155,153,145,167,146,458,462,174,,459,,,,,,,,169,170', +',166,148,149,150,157,154,156,,,151,152,,,,171,172,158,159,,,,,,306,', +',,,,,,163,162,,147,168,165,164,173,160,161,155,153,145,167,146,729,462', +'174,,730,,,,,,,,169,170,,166,148,149,150,157,154,156,,,151,152,,,,171', +'172,158,159,,,,,,306,,,,,,,,163,162,,147,168,165,164,173,160,161,155', +'153,145,167,146,1199,462,174,,1200,,,,,,,,169,170,,166,148,149,150,157', +'154,156,,,151,152,,,,171,172,158,159,,,,,,306,,,,,,,,163,162,,147,168', +'165,164,173,160,161,155,153,145,167,146,1201,470,174,,1202,,,,,,,,169', +'170,,166,148,149,150,157,154,156,,,151,152,,,,171,172,158,159,,,,,,306', +',,,,,,,163,162,,147,168,165,164,173,160,161,155,153,145,167,146,1216', +'470,174,,1215,,,,,,,,169,170,,166,148,149,150,157,154,156,,,151,152', +',,,171,172,158,159,,,,,,306,,,,,,,,163,162,,147,168,165,164,173,160', +'161,155,153,145,167,146,466,470,174,,465,,,,,,,,169,170,,166,148,149', +'150,157,154,156,,,151,152,,,,171,172,158,159,,,,,,306,,,,,,,,163,162', +',147,168,165,164,173,160,161,155,153,145,167,146,874,470,174,,873,,', +',,,,,169,170,,166,148,149,150,157,154,156,,,151,152,,,,171,172,158,159', +',,,,,306,,,,,,,,163,162,,147,168,165,164,173,160,161,155,153,145,167', +'146,871,462,174,,872,,,,,,,,169,170,,166,148,149,150,157,154,156,,,151', +'152,,,,171,172,158,159,,,,,,306,,,,,,,,163,162,,147,168,165,164,173', +'160,161,155,153,145,167,146,729,462,174,,730,,,,,,,,169,170,,166,148', +'149,150,157,154,156,,,151,152,,,,171,172,158,159,,,,,,306,,,,,,,,163', +'162,,147,168,165,164,173,160,161,155,153,145,167,146,731,470,174,,732', +',,,,,,,169,170,,166,148,149,150,157,154,156,,,151,152,,,,171,172,158', +'159,,,,,,306,,,,,,,,163,162,,147,168,165,164,173,160,161,155,153,145', +'167,146,,,174' ] + racc_action_table = arr = ::Array.new(28813, nil) + idx = 0 + clist.each do |str| + str.split(',', -1).each do |i| + arr[idx] = i.to_i unless i.empty? + idx += 1 + end + end + +clist = [ +'111,1105,1220,1109,925,1200,624,111,111,111,930,1201,111,111,111,1059', +'111,787,1017,23,1202,1234,982,982,111,31,111,111,111,416,69,1106,804', +'417,477,993,111,111,1165,111,111,111,111,111,804,1218,930,748,839,292', +'1090,385,477,842,1088,1218,292,1093,1059,1093,23,840,396,925,748,837', +'111,111,111,111,111,111,111,111,111,111,111,111,111,111,1199,384,111', +'111,111,841,111,111,1201,31,111,392,633,111,111,416,111,1202,111,417', +'111,243,111,111,787,111,111,111,111,111,624,111,31,111,292,624,982,69', +'842,1105,1220,1109,393,1200,1105,1220,1109,111,1200,1201,111,111,111', +'111,1201,111,1017,111,1202,731,852,1017,111,1202,993,111,731,731,731', +'1106,841,731,731,731,1106,731,1165,839,810,3,243,1165,842,731,731,731', +'731,731,1090,385,840,396,1088,1090,385,731,731,1088,731,731,731,731', +'731,837,48,48,837,809,837,812,929,980,737,9,841,517,517,244,1199,384', +'392,633,246,1199,384,731,731,731,731,731,731,731,731,731,731,731,731', +'731,731,555,555,731,731,731,810,731,731,934,12,731,929,393,731,731,251', +'731,293,731,737,731,523,731,731,293,731,731,731,731,731,852,731,731', +'731,809,812,812,244,980,949,358,358,246,48,48,810,14,731,810,294,731', +'731,731,731,934,731,294,731,443,874,810,627,731,15,729,731,874,874,874', +'627,517,251,874,874,809,874,812,809,980,812,523,980,293,874,874,643', +'643,351,730,809,17,812,252,980,555,874,874,27,874,874,874,874,874,949', +'949,949,758,234,295,234,234,234,234,234,294,295,1007,443,358,358,949', +'871,234,729,758,874,874,874,874,874,874,874,874,874,874,874,874,874', +'874,872,21,874,874,874,234,874,874,730,252,874,578,351,874,234,234,234', +'234,874,42,874,234,874,874,412,874,874,874,874,874,732,874,874,874,295', +'351,1007,732,732,732,643,871,732,732,732,643,732,874,21,533,874,874', +'88,874,732,874,732,732,732,872,21,234,874,20,88,874,732,732,45,732,732', +'732,732,732,88,578,578,578,19,997,414,533,53,1127,997,533,533,29,412', +'412,412,933,578,216,29,933,732,732,732,732,732,732,732,732,732,732,732', +'732,732,732,389,291,732,732,732,389,732,732,291,20,732,229,658,732,732', +'660,732,413,732,231,732,235,732,732,19,732,732,732,732,732,411,732,108', +'732,414,414,414,1127,1127,108,108,108,29,245,108,108,108,732,108,247', +'732,732,732,732,1127,732,108,732,108,108,108,377,732,778,377,732,291', +'778,108,108,248,108,108,108,108,108,658,658,254,660,660,413,413,413', +'418,137,658,5,746,660,137,137,5,746,411,411,411,746,108,108,108,108', +'108,108,108,108,108,108,108,108,108,108,305,680,108,108,108,415,108', +'108,383,383,108,402,286,108,108,402,108,287,108,286,108,319,108,108', +'287,108,108,108,108,108,331,108,459,108,320,331,418,418,418,973,323', +'973,973,973,973,973,458,108,680,288,108,108,108,108,973,108,288,108', +'511,466,680,824,108,511,824,108,466,466,466,415,415,415,466,466,343', +'466,973,286,335,459,336,343,287,466,466,973,973,973,973,338,343,459', +'973,458,1157,466,466,1157,466,466,466,466,466,380,339,458,380,233,845', +'233,233,233,233,233,288,845,289,340,973,346,845,349,233,289,845,466', +'466,466,466,466,466,466,466,466,466,466,466,466,466,343,44,466,466,466', +'233,466,466,376,362,466,376,290,466,233,233,233,233,466,290,466,233', +'466,466,350,466,466,466,466,466,873,466,466,466,845,16,16,873,873,873', +'1091,1091,289,873,873,352,873,466,44,353,466,466,357,466,873,466,362', +'761,761,359,44,233,466,43,366,466,873,873,362,873,873,873,873,873,1189', +'1189,368,290,705,344,705,705,705,705,705,1100,344,1100,1100,1100,371', +'1100,374,705,378,344,873,873,873,873,873,873,873,873,873,873,873,873', +'873,873,43,379,873,873,873,705,873,873,825,825,873,381,43,873,705,705', +'705,705,873,390,873,705,873,873,391,873,873,873,873,873,465,873,395', +'873,344,704,704,465,465,465,51,51,397,465,465,406,465,873,426,432,873', +'873,434,873,465,873,435,777,437,777,777,705,873,777,440,873,465,465', +'444,465,465,465,465,465,454,456,51,51,646,345,646,646,646,646,646,1116', +'345,1116,1116,1116,457,1116,467,646,777,345,465,465,465,465,465,465', +'465,465,465,465,465,465,465,465,473,474,465,465,465,646,465,465,478', +'479,465,480,1116,465,646,646,646,646,465,483,465,646,465,465,484,465', +'465,465,465,465,941,465,485,465,345,495,347,507,510,513,941,363,1107', +'347,947,519,527,465,363,1107,465,465,347,465,947,465,1145,363,1107,528', +'535,646,465,1145,536,465,2,2,2,2,2,2,1145,537,538,2,2,563,941,564,2', +'401,2,2,2,2,2,2,2,565,941,569,947,585,2,2,2,2,2,2,2,347,586,2,947,589', +'363,1107,591,2,2,2,2,2,2,2,2,2,2,2,2,1145,2,2,2,394,2,2,2,2,2,54,394', +'401,596,404,600,609,54,610,401,394,404,611,621,401,625,54,626,401,2', +'404,628,2,655,663,2,2,1186,665,2,672,2,681,686,1186,2,691,401,693,534', +'695,651,651,1186,2,651,651,651,711,2,2,2,2,716,2,2,2,2,717,394,719,724', +'2,2,733,54,742,401,750,404,2,534,2,2,2,534,534,2,2,1190,1190,1190,1190', +'1190,1190,751,752,781,1190,1190,784,786,1186,1190,844,1190,1190,1190', +'1190,1190,1190,1190,583,583,583,583,583,1190,1190,1190,1190,1190,1190', +'1190,792,496,1190,496,496,496,793,496,1190,1190,1190,1190,1190,1190', +'1190,1190,1190,1190,1190,1190,794,1190,1190,1190,442,1190,1190,1190', +'1190,1190,18,442,844,796,595,798,806,18,496,844,442,595,808,811,844', +'814,18,496,844,1190,595,815,1190,818,827,1190,1190,242,833,1190,834', +'1190,838,847,242,1190,718,844,718,718,718,851,718,242,1190,853,868,870', +'879,1190,1190,1190,1190,892,1190,1190,1190,1190,895,442,896,899,1190', +'1190,901,18,904,844,905,595,1190,907,1190,1190,1190,908,910,1190,1190', +'843,843,843,843,843,843,914,927,935,843,843,936,940,242,843,400,843', +'843,843,843,843,843,843,943,948,701,966,969,843,843,843,843,843,843', +'843,701,1196,843,1196,1196,1196,970,1196,843,843,843,843,843,843,843', +'843,843,843,843,843,979,843,843,843,636,843,843,843,843,843,813,636', +'400,701,701,984,987,813,701,400,636,994,813,996,400,1003,813,1004,400', +'843,1005,1006,843,1032,1033,843,843,1038,1043,843,1044,843,1045,1046', +'1047,843,1048,400,8,8,8,8,8,1132,843,1052,1053,1054,1056,843,843,843', +'843,1132,843,843,843,843,1060,636,1067,1072,843,843,1073,813,1075,400', +'1076,1077,843,1079,843,843,843,1080,1081,843,843,1104,1104,1104,1104', +'1104,1104,1097,1132,1132,1104,1104,1108,1132,1111,1104,1112,1104,1104', +'1104,1104,1104,1104,1104,25,1113,1114,1143,1146,1104,1104,1104,1104', +'1104,1104,1104,1155,1156,1104,334,334,334,334,334,1104,1104,1104,1104', +'1104,1104,1104,1104,1104,1104,1104,1104,1161,1104,1104,1104,1171,1104', +'1104,1104,1104,1104,25,25,25,25,25,25,25,25,25,25,25,1172,25,25,1173', +'1176,25,25,1179,1104,1180,25,1104,1181,1182,1104,1104,1184,1198,1104', +'1203,1104,25,1215,25,1104,25,25,1216,25,25,25,25,25,1104,25,1222,1223', +'1224,1104,1104,1104,1104,1225,1104,1104,1104,1104,1,,,,1104,1104,,25', +',,,,1104,,1104,1104,1104,,,1104,1104,1099,1099,1099,1099,1099,1099,', +',,1099,1099,,,,1099,,1099,1099,1099,1099,1099,1099,1099,373,373,373', +'373,373,1099,1099,1099,1099,1099,1099,1099,,,1099,,,,,447,1099,1099', +'1099,1099,1099,1099,1099,1099,1099,1099,1099,1099,,1099,1099,1099,,1099', +'1099,1099,1099,1099,447,447,447,447,447,447,447,447,447,447,447,,447', +'447,,,447,447,,1099,,,1099,,,1099,1099,,,1099,,1099,447,,447,1099,447', +'447,,447,447,447,447,447,1099,447,,,,1099,1099,1099,1099,,1099,1099', +'1099,1099,,,,,1099,1099,,447,,447,,,1099,,1099,1099,1099,,,1099,1099', +'337,337,337,337,337,337,,,,337,337,,,,337,,337,337,337,337,337,337,337', +',,,,,337,337,337,337,337,337,337,,,337,,,,,453,337,337,337,337,337,337', +'337,337,337,337,337,337,,337,337,337,,337,337,337,337,337,453,453,453', +'453,453,453,453,453,453,453,453,,453,453,,,453,453,,337,,,337,,,337', +'337,,,337,,337,453,,453,337,453,453,,453,453,453,453,453,337,453,,,', +'337,337,337,337,,337,337,337,337,,,,,337,337,,453,,,,,337,,337,337,337', +',,337,337,1098,1098,1098,1098,1098,1098,,,,1098,1098,,,,1098,,1098,1098', +'1098,1098,1098,1098,1098,,,,,,1098,1098,1098,1098,1098,1098,1098,,,1098', +',,,,725,1098,1098,1098,1098,1098,1098,1098,1098,1098,1098,1098,1098', +',1098,1098,1098,,1098,1098,1098,1098,1098,725,725,725,725,725,725,725', +'725,725,725,725,,725,725,,,725,725,,1098,,,1098,,,1098,1098,,,1098,', +'1098,725,,725,1098,725,725,,725,725,725,725,725,1098,725,,,,1098,1098', +'1098,1098,,1098,1098,1098,1098,,,,,1098,1098,,725,,,,,1098,,1098,1098', +'1098,,,1098,1098,1069,1069,1069,1069,1069,1069,,,,1069,1069,,,,1069', +',1069,1069,1069,1069,1069,1069,1069,,,,,,1069,1069,1069,1069,1069,1069', +'1069,,,1069,,,,,694,1069,1069,1069,1069,1069,1069,1069,1069,1069,1069', +'1069,1069,,1069,1069,1069,,1069,1069,1069,1069,1069,694,694,694,694', +'694,694,694,694,694,694,694,,694,694,,,694,694,,1069,,,1069,,,1069,1069', +',,1069,,1069,694,,694,1069,694,694,,694,694,694,694,694,1069,694,,,', +'1069,1069,1069,1069,,1069,1069,1069,1069,,,,,1069,1069,,694,,,,,1069', +',1069,1069,1069,,,1069,1069,644,644,644,644,644,644,,,,644,644,,,,644', +',644,644,644,644,644,644,644,,,,,,644,644,644,644,644,644,644,,,644', +',,,,,644,644,644,644,644,644,644,644,644,644,644,644,,644,644,644,,644', +'644,644,644,644,1035,1035,1035,1035,1035,1035,1035,1035,1035,1035,1035', +',1035,1035,,,1035,1035,,644,,,644,,,644,644,,,644,,644,1035,,1035,644', +'1035,1035,,1035,1035,1035,1035,1035,644,1035,,,,644,644,644,644,,644', +'644,644,644,,,,,644,644,,1035,,,,,644,,644,644,644,,,644,644,372,372', +'372,372,372,372,,,,372,372,,,,372,,372,372,372,372,372,372,372,,,,,', +'372,372,372,372,372,372,372,,,372,,,,,,372,372,372,372,372,372,372,372', +'372,372,372,372,,372,372,372,,372,372,372,372,372,876,876,876,876,876', +'876,876,876,876,876,876,,876,876,,,876,876,,372,,,372,,,372,372,,,372', +',372,876,,876,372,876,876,,876,876,876,876,876,372,876,,,,372,372,372', +'372,,372,372,372,372,,,,,372,372,,876,,,,,372,,372,372,372,,,372,372', +'859,859,859,859,859,859,,,,859,859,,,,859,,859,859,859,859,859,859,859', +',,,,,859,859,859,859,859,859,859,,,859,,,,,,859,859,859,859,859,859', +'859,859,859,859,859,859,,859,859,859,,859,859,859,859,859,317,317,317', +'317,317,317,317,317,317,317,317,,317,317,,,317,317,,859,,,859,,,859', +'859,,,859,,859,317,,317,859,317,317,,317,317,317,317,317,859,317,,,', +'859,859,859,859,,859,859,859,859,,,,,859,859,,317,,,,,859,,859,859,859', +',,859,859,1014,1014,1014,1014,1014,1014,,,,1014,1014,,,,1014,,1014,1014', +'1014,1014,1014,1014,1014,,,,,,1014,1014,1014,1014,1014,1014,1014,,,1014', +',,,,,1014,1014,1014,1014,1014,1014,1014,1014,1014,1014,1014,1014,,1014', +'1014,1014,,1014,1014,1014,1014,1014,1011,1011,1011,1011,1011,1011,1011', +'1011,1011,1011,1011,,1011,1011,,,1011,1011,,1014,,,1014,,,1014,1014', +',,1014,,1014,1011,,1011,1014,1011,1011,,1011,1011,1011,1011,1011,1014', +'1011,,,,1014,1014,1014,1014,,1014,1014,1014,1014,,,,,1014,1014,,1011', +',,,,1014,,1014,1014,1014,,,1014,1014,253,253,253,253,253,253,,,,253', +'253,,,,253,,253,253,253,253,253,253,253,,,,,,253,253,253,253,253,253', +'253,,,253,,,,,,253,253,253,253,253,253,253,253,253,253,253,253,,253', +'253,253,,253,253,253,253,253,1012,1012,1012,1012,1012,1012,1012,1012', +'1012,1012,1012,,1012,1012,,,1012,1012,,253,,,253,,,253,253,,,253,,253', +'1012,,1012,253,1012,1012,,1012,1012,1012,1012,1012,253,1012,,,,253,253', +'253,253,,253,253,253,253,,,,,253,253,,1012,,,,,253,,253,253,253,,,253', +'253,236,236,236,236,236,236,,,,236,236,,,,236,,236,236,236,236,236,236', +'236,,,,,,236,236,236,236,236,236,236,,,236,,,,,,236,236,236,236,236', +'236,236,236,236,236,236,236,,236,236,236,,236,236,236,236,236,1034,1034', +'1034,1034,1034,1034,1034,1034,1034,1034,1034,,1034,1034,,,1034,1034', +',236,,,236,,,236,236,,,236,,236,1034,,1034,236,1034,1034,,1034,1034', +'1034,1034,1034,236,1034,,,,236,236,236,236,,236,236,236,236,,,,,236', +'236,,1034,,,,,236,,236,236,236,,,236,236,218,218,218,218,218,218,,,', +'218,218,,,,218,,218,218,218,218,218,218,218,,,,,,218,218,218,218,218', +'218,218,,,218,,,,,,218,218,218,218,218,218,218,218,218,218,218,218,', +'218,218,218,,218,218,218,218,218,1068,1068,1068,1068,1068,1068,1068', +'1068,1068,1068,1068,,1068,1068,,,1068,1068,,218,,,218,,,218,218,,,218', +',218,1068,,1068,218,1068,1068,,1068,1068,1068,1068,1068,218,1068,,,', +'218,218,218,218,,218,218,218,218,,,,,218,218,,1068,,,,,218,,218,218', +'218,,,218,218,38,38,38,38,38,38,,,,38,38,,,,38,,38,38,38,38,38,38,38', +',,,,,38,38,38,38,38,38,38,,,38,,,,,,38,38,38,38,38,38,38,38,38,38,38', +'38,,38,38,38,,38,38,38,38,38,552,552,552,552,552,552,552,552,552,552', +'552,,552,552,,,552,552,,38,,,38,,,38,38,,,38,,38,552,,552,38,552,552', +',552,552,552,552,552,38,552,,,,38,38,38,38,,38,38,38,38,,,,,38,38,552', +'552,,,,,38,,38,38,38,,,38,38,848,848,848,848,848,848,,,,848,848,,,,848', +',848,848,848,848,848,848,848,,,,,,848,848,848,848,848,848,848,,,848', +',,,,,848,848,848,848,848,848,848,848,848,848,848,848,,848,848,848,,848', +'848,848,848,848,819,819,819,819,819,819,819,819,819,819,819,,819,819', +',,819,819,,848,,,848,,,848,848,,,848,,848,819,,819,848,819,819,,819', +'819,819,819,819,848,819,,,,848,848,848,848,,848,848,848,848,,,,,848', +'848,,819,,,,,848,,848,848,848,,,848,848,974,974,974,974,974,974,,,,974', +'974,,,,974,,974,974,974,974,974,974,974,,,,,,974,974,974,974,974,974', +'974,,714,974,714,714,714,,714,974,974,974,974,974,974,974,974,974,974', +'974,974,,974,974,974,,974,974,974,974,974,915,,915,915,915,,915,,714', +',1115,,1115,1115,1115,,1115,714,,974,,,974,,,974,974,,549,974,,974,', +',,974,,915,,916,,916,916,916,974,916,915,1115,,974,974,974,974,,974', +'974,974,974,,,549,,974,974,549,549,,549,549,,974,,974,974,974,,916,974', +'974,342,342,342,342,342,342,,,,342,342,,,,342,,342,342,342,342,342,342', +'342,,,,,,342,342,342,342,342,342,342,,,342,,,548,,,342,342,342,342,342', +'342,342,342,342,342,342,342,,342,342,342,,342,342,342,342,342,546,546', +'546,546,546,546,546,548,,546,546,548,548,,548,548,546,546,,342,,,342', +',,342,342,,,342,,342,546,,546,342,546,546,,546,546,546,546,546,342,546', +',,,342,342,342,342,,342,342,342,342,,,,,342,342,,,,,,,342,,342,342,342', +',,342,342,998,998,998,998,998,998,,,,998,998,,,,998,,998,998,998,998', +'998,998,998,,,,,,998,998,998,998,998,998,998,,,998,,,,,,998,998,998', +'998,998,998,998,998,998,998,998,998,,998,998,998,,998,998,998,998,998', +'364,364,364,364,364,364,364,364,364,364,364,,364,364,,,364,364,,998', +',,998,,,998,998,,,998,,998,364,,364,998,364,364,,364,364,364,364,364', +'998,364,,,,998,998,998,998,,998,998,998,998,,,,,998,998,,,,,,,998,,998', +'998,998,,,998,998,620,620,620,620,620,620,,,,620,620,,,,620,,620,620', +'620,620,620,620,620,,,,,,620,620,620,620,620,620,620,,,620,,,,,,620', +'620,620,620,620,620,620,620,620,620,620,620,,620,620,620,,620,620,620', +'620,620,365,365,365,365,365,365,365,365,365,365,365,,365,365,,,365,365', +',620,,,620,,,620,620,,,620,,620,365,,365,620,365,365,,365,365,365,365', +'365,620,365,,,,620,620,620,620,,620,620,620,620,,,,,620,620,,,,,,,620', +',620,620,620,,,620,620,992,992,992,992,992,992,,,,992,992,,,,992,,992', +'992,992,992,992,992,992,,,,,,992,992,992,992,992,992,992,,,992,,,,,', +'992,992,992,992,992,992,992,992,992,992,992,992,,992,992,992,,992,992', +'992,992,992,606,,,,,,,,,,,,,,,,606,606,,992,,,992,,,992,992,,,992,,992', +'606,,606,992,606,606,,606,606,,,606,992,606,,,,992,992,992,992,,992', +'992,992,992,,,,,992,992,,,,,,,992,,992,992,992,,,992,992,135,135,135', +'135,135,135,,,,135,135,,,,135,,135,135,135,135,135,135,135,,,,,,135', +'135,135,135,135,135,135,,,135,,,,,,135,135,135,135,135,135,135,135,135', +'135,135,135,,135,135,135,,135,135,135,135,135,531,531,531,531,531,531', +'531,531,531,531,531,,531,531,,,531,531,,135,,,135,,,135,135,,,135,,135', +'531,,531,135,531,531,,531,531,531,531,531,135,531,,,,135,135,135,135', +',135,135,135,135,,,,,135,135,,,,,,,135,,135,135,135,,,135,135,894,894', +'894,894,894,894,,,,894,894,,,,894,,894,894,894,894,894,894,894,,,,,', +'894,894,894,894,894,894,894,,,894,,,,,,894,894,894,894,894,894,894,894', +'894,894,894,894,,894,894,894,,894,894,894,894,894,547,547,547,547,547', +'547,547,,,547,547,,,,,,547,547,,894,,,894,,,894,894,,,894,,894,547,', +'547,894,547,547,,547,547,547,547,547,894,547,,,,894,894,894,894,,894', +'894,894,894,,,,,894,894,,,,,,,894,,894,894,894,,,894,894,230,230,230', +'230,230,230,,,,230,230,,,,230,,230,230,230,230,230,230,230,,,,,,230', +'230,230,230,230,230,230,,,230,,,,,,230,230,230,230,230,230,230,230,230', +'230,230,230,,230,230,230,,230,230,230,230,230,532,532,532,532,532,532', +'532,532,532,532,532,,532,532,,,532,532,,230,,,230,,,230,230,,,230,,230', +'532,,532,230,532,532,,532,532,532,532,532,230,532,,,,230,230,230,230', +',230,230,230,230,,,,,230,230,,,,,,,230,,230,230,230,,,230,230,1147,1147', +'1147,1147,1147,1147,,,,1147,1147,,,,1147,,1147,1147,1147,1147,1147,1147', +'1147,,,,,,1147,1147,1147,1147,1147,1147,1147,,,1147,,,,,,1147,1147,1147', +'1147,1147,1147,1147,1147,1147,1147,1147,1147,,1147,1147,1147,,1147,1147', +'1147,1147,1147,550,550,550,550,550,550,550,,,550,550,,,,,,550,550,,1147', +',,1147,,,1147,1147,,,1147,,1147,550,,550,1147,550,550,,550,550,550,550', +'550,1147,550,,,,1147,1147,1147,1147,,1147,1147,1147,1147,,,,,1147,1147', +',,,,,,1147,,1147,1147,1147,,,1147,1147,623,623,623,623,623,623,,,,623', +'623,,,,623,,623,623,623,623,623,623,623,,,,,,623,623,623,623,623,623', +'623,,,623,,,,,,623,623,623,623,623,623,623,623,623,623,623,623,,623', +'623,623,,623,623,623,623,623,543,543,543,543,543,543,543,,,543,543,', +',,,,543,543,,623,,,623,,,623,623,,,623,,623,543,,543,623,543,543,,543', +'543,543,543,543,623,543,,,,623,623,623,623,,623,623,623,623,,,,,623', +'623,,,,,,,623,,623,623,623,,,623,623,388,388,388,388,388,388,,,,388', +'388,,,,388,,388,388,388,388,388,388,388,,,,,,388,388,388,388,388,388', +'388,,,388,,,,,,388,388,388,388,388,388,388,388,388,388,388,388,,388', +'388,388,,388,388,388,388,388,544,544,544,544,544,544,544,,,544,544,', +',,,,544,544,,388,,,388,,,388,388,,,388,,388,544,,544,388,544,544,,544', +'544,544,544,544,388,544,,,,388,388,388,388,,388,388,388,388,,,,,388', +'388,,,,,,,388,,388,388,388,,,388,388,387,387,387,387,387,387,,,,387', +'387,,,,387,,387,387,387,387,387,387,387,,,,,,387,387,387,387,387,387', +'387,,,387,,,,,,387,387,387,387,387,387,387,387,387,387,387,387,,387', +'387,387,,387,387,387,387,387,545,545,545,545,545,545,545,,,545,545,', +',,,,545,545,,387,,,387,,,387,387,,,387,,387,545,,545,387,545,545,,545', +'545,545,545,545,387,545,,,,387,387,387,387,,387,387,387,387,,,,,387', +'387,,,,277,277,277,387,277,387,387,387,277,277,387,387,,277,,277,277', +'277,277,277,277,277,,,,,,277,277,277,277,277,277,277,,,277,,,,,,,277', +',,277,277,277,277,277,277,277,277,,277,277,277,,277,277,277,277,277', +'551,551,551,551,551,551,551,551,,551,551,,,,,,551,551,,277,,,277,,,277', +'277,,,277,,,551,,551,277,551,551,,551,551,551,551,551,277,551,,,,277', +'277,277,277,,277,277,277,277,,,,,277,277,,,,276,276,276,277,276,277', +'277,277,276,276,277,277,,276,,276,276,276,276,276,276,276,,,,,,276,276', +'276,276,276,276,276,,,276,,,,,,,276,,,276,276,276,276,276,276,276,276', +',276,276,276,,276,276,276,276,276,542,542,542,542,542,542,542,,,542', +'542,,,,,,542,542,,276,,,276,,,276,276,,,276,,,542,,542,276,542,542,', +'542,542,542,542,542,276,542,,,,276,276,276,276,,276,276,276,276,,,,', +'276,276,,,,275,275,275,276,275,276,276,276,275,275,276,276,,275,,275', +'275,275,275,275,275,275,,,,,,275,275,275,275,275,275,275,,,275,,,,,', +',275,,,275,275,275,275,275,275,275,275,,275,275,275,,275,275,275,275', +'275,553,,,,,,,,,,,,,,,,553,553,,275,,,275,,,275,275,,,275,,,553,,553', +'275,553,553,,553,553,,,553,275,553,,,,275,275,275,275,,275,275,275,275', +',,,,275,275,,,,274,274,274,275,274,275,275,275,274,274,275,275,,274', +',274,274,274,274,274,274,274,,,,,,274,274,274,274,274,274,274,,,274', +',,,,,,274,,,274,274,274,274,274,274,274,274,,274,274,274,,274,274,274', +'274,274,541,,,,,,,,,,,,,,,,541,541,,274,,,274,,,274,274,,,274,,,541', +',,274,541,541,,541,541,,,,274,,,,,274,274,274,274,,274,274,274,274,', +',,,274,274,,,,,,,274,,274,274,274,32,,274,274,,,,32,32,32,,,32,32,32', +'539,32,,,,,,,,32,32,32,32,,,,539,539,,,,32,32,,32,32,32,32,32,,,,539', +',539,,539,539,,539,539,,,,,,,,,,,32,32,32,32,32,32,32,32,32,32,32,32', +'32,32,,,32,32,32,,,32,,32,32,,,32,32,,32,,32,,32,,32,32,,32,32,32,32', +'32,,32,32,32,,,,,,,,,,,,,,32,,,32,32,,32,,32,957,957,957,,957,,32,,957', +'957,,,,957,,957,957,957,957,957,957,957,,,,,,957,957,957,957,957,957', +'957,,,957,,,,,,,957,,,957,957,957,957,957,957,957,957,,957,957,957,', +'957,957,957,957,957,540,,,,,,,,,,,,,,,,540,540,,957,,,957,,,957,957', +',,957,,,540,,540,957,540,540,,540,540,,,,957,,,,,957,957,957,957,,957', +'957,957,957,,,,,957,957,,,,963,963,963,957,963,957,957,957,963,963,957', +'957,,963,,963,963,963,963,963,963,963,,,,,,963,963,963,963,963,963,963', +',,963,,,,,,,963,,,963,963,963,963,963,963,963,963,,963,963,963,,963', +'963,963,963,963,,,,,,,,,,,,,,,,,,,,963,,,963,,,963,963,,,963,,,,,,963', +',,,,,,,,963,,,,,963,963,963,963,,963,963,963,963,,,,,963,963,,,,,,,963', +',963,963,963,33,,963,963,,,,33,33,33,,,33,33,33,,33,,,,,,,,33,,33,33', +',,,,,,,,33,33,,33,33,33,33,33,,,,,,,,,,,,,,,,,,,,,,,33,33,33,33,33,33', +'33,33,33,33,33,33,33,33,,,33,33,33,,,33,,33,33,,,33,33,,33,,33,,33,', +'33,33,,33,33,33,33,33,,33,,33,,,,,,,,,,,,,,33,,,33,33,,33,,33,34,34', +'34,,34,,33,,34,34,,,,34,,34,34,34,34,34,34,34,,,,,,34,34,34,34,34,34', +'34,,,34,,,,,,,34,,,34,34,34,34,34,34,34,34,34,34,34,34,,34,34,34,34', +'34,,,,,,,,,,,,,,,,,,,,34,,,34,,,34,34,,,34,,34,,34,,34,,,34,,,,,,34', +',,,,34,34,34,34,,34,34,34,34,,,,,34,34,,,,685,685,685,34,685,34,34,34', +'685,685,34,34,,685,,685,685,685,685,685,685,685,,,,,,685,685,685,685', +'685,685,685,,,685,,,,,,,685,,,685,685,685,685,685,685,685,685,,685,685', +'685,,685,685,685,685,685,,,,,,,,,,,,,,,,,,,,685,,,685,,,685,685,,,685', +',,,,,685,,,,,,,,,685,,,,,685,685,685,685,,685,685,685,685,,,,,685,685', +',,,616,616,616,685,616,685,685,685,616,616,685,685,,616,,616,616,616', +'616,616,616,616,,,,,,616,616,616,616,616,616,616,,,616,,,,,,,616,,,616', +'616,616,616,616,616,616,616,616,616,616,616,,616,616,616,616,616,,,', +',,,,,,,,,,,,,,,,616,,,616,,,616,616,,,616,,,,,,616,,,616,,,,,,616,,', +',,616,616,616,616,,616,616,616,616,,,,,616,616,,,,613,613,613,616,613', +'616,616,616,613,613,616,616,,613,,613,613,613,613,613,613,613,,,,,,613', +'613,613,613,613,613,613,,,613,,,,,,,613,,,613,613,613,613,613,613,613', +'613,613,613,613,613,,613,613,613,613,613,,,,,,,,,,,,,,,,,,,,613,,,613', +',,613,613,,,613,,613,,,,613,,,613,,,,,,613,,,,,613,613,613,613,,613', +'613,613,613,,,,,613,613,,,,239,239,239,613,239,613,613,613,239,239,613', +'613,,239,,239,239,239,239,239,239,239,,,,,,239,239,239,239,239,239,239', +',,239,,,,,,,239,,,239,239,239,239,239,239,239,239,,239,239,239,,239', +'239,239,239,239,,,,,,,,,,,,,,,,,,,,239,,,239,,,239,239,,,239,,,,,,239', +',,,,,,,,239,,,,,239,239,239,239,,239,239,239,239,,,,,239,239,239,,,607', +'607,607,239,607,239,239,239,607,607,239,239,,607,,607,607,607,607,607', +'607,607,,,,,,607,607,607,607,607,607,607,,,607,,,,,,,607,,,607,607,607', +'607,607,607,607,607,,607,607,607,,607,607,607,607,607,,,,,,,,,,,,,,', +',,,,,607,,,607,,,607,607,,,607,,,,,,607,,,,,,,,,607,,,,,607,607,607', +'607,,607,607,607,607,,,,,607,607,,,,605,605,605,607,605,607,607,607', +'605,605,607,607,,605,,605,605,605,605,605,605,605,,,,,,605,605,605,605', +'605,605,605,,,605,,,,,,,605,,,605,605,605,605,605,605,605,605,,605,605', +'605,,605,605,605,605,605,,,,,,,,,,,,,,,,,,,,605,,,605,,,605,605,,,605', +',,,,,605,,,,,,,,,605,,,,,605,605,605,605,,605,605,605,605,,,,,605,605', +',,,602,602,602,605,602,605,605,605,602,602,605,605,,602,,602,602,602', +'602,602,602,602,,,,,,602,602,602,602,602,602,602,,,602,,,,,,,602,,,602', +'602,602,602,602,602,602,602,,602,602,602,,602,602,602,602,602,,,,,,', +',,,,,,,,,,,,,602,,,602,,,602,602,,,602,,,,,,602,,,,,,,,,602,,,,,602', +'602,602,602,,602,602,602,602,,,,,602,602,,,,877,877,877,602,877,602', +'602,602,877,877,602,602,,877,,877,877,877,877,877,877,877,,,,,,877,877', +'877,877,877,877,877,,,877,,,,,,,877,,,877,877,877,877,877,877,877,877', +',877,877,877,,877,877,877,877,877,,,,,,,,,,,,,,,,,,,,877,,,877,,,877', +'877,,,877,,,,,,877,,,,,,,,,877,,,,,877,877,877,877,,877,877,877,877', +',,,,877,877,,,,238,238,238,877,238,877,877,877,238,238,877,877,,238', +',238,238,238,238,238,238,238,,,,,,238,238,238,238,238,238,238,,,238', +',,,,,,238,,,238,238,238,238,238,238,238,238,,238,238,238,,238,238,238', +'238,238,,,,,,,,,,,,,,,,,,,,238,,,238,,,238,238,,,238,,,,,,238,,,,,,', +',,238,,,,,238,238,238,238,,238,238,238,238,,,,,238,238,,,,,,,238,,238', +'238,238,557,,238,238,,,,557,557,557,,,557,557,557,409,557,409,409,409', +'409,409,,,557,557,557,,,,409,,,,,,557,557,,557,557,557,557,557,,707', +',707,707,707,707,707,409,409,,,,,,,707,409,409,409,409,,,,409,,1140', +',1140,1140,1140,1140,1140,557,,,,,707,,557,1140,,,,557,557,707,707,707', +'707,,,,707,,,,,,,,,1140,409,,,,557,557,,,,,1140,1140,,,,1140,,,,557', +',,557,,562,562,562,557,562,,707,,562,562,557,,,562,,562,562,562,562', +'562,562,562,,,,,,562,562,562,562,562,562,562,,,562,,,,,,,562,,,562,562', +'562,562,562,562,562,562,,562,562,562,,562,562,562,562,562,,,,,,,,,,', +',,,,,,,,,562,,,562,,,562,562,,,562,,,,,,562,,,,,,,,,562,,,,,562,562', +'562,562,,562,562,562,562,,,,,562,562,,,,237,237,237,562,237,562,562', +'562,237,237,562,562,,237,,237,237,237,237,237,237,237,,,,,,237,237,237', +'237,237,237,237,,,237,,,,,,,237,,,237,237,237,237,237,237,237,237,,237', +'237,237,,237,237,237,237,237,,,,,,,,,,,,,,,,,,,,237,,,237,,,237,237', +',,237,,,,,,237,,,,,,,,,237,,,,,237,237,237,237,,237,237,237,237,,,,', +'237,237,,,,572,572,572,237,572,237,237,237,572,572,237,237,,572,,572', +'572,572,572,572,572,572,,,,,,572,572,572,572,572,572,572,,,572,,,,,', +',572,,,572,572,572,572,572,572,572,572,572,572,572,572,,572,572,572', +'572,572,,,,,,,,,,,,,,,,,,,,572,,,572,,,572,572,,,572,,572,,572,,572', +',,572,,,,,,572,,,,,572,572,572,572,,572,572,572,572,,,,,572,572,,,,574', +'574,574,572,574,572,572,572,574,574,572,572,,574,,574,574,574,574,574', +'574,574,,,,,,574,574,574,574,574,574,574,,,574,,,,,,,574,,,574,574,574', +'574,574,574,574,574,574,574,574,574,,574,574,574,574,574,,,,,,,,,,,', +',,,,,,,,574,,,574,,,574,574,,,574,,,,574,,574,,,574,,,,,,574,,,,,574', +'574,574,574,,574,574,574,574,,,,,574,574,,,,576,576,576,574,576,574', +'574,574,576,576,574,574,,576,,576,576,576,576,576,576,576,,,,,,576,576', +'576,576,576,576,576,,,576,,,,,,,576,,,576,576,576,576,576,576,576,576', +',576,576,576,,576,576,576,576,576,,,,,,,,,,,,,,,,,,,,576,,,576,,,576', +'576,,,576,,,,,,576,,,,,,,,,576,,,,,576,576,576,576,,576,576,576,576', +',,,,576,576,,,,,,,576,,576,576,576,,,576,576,582,582,582,582,582,,,', +'582,582,,,,582,,582,582,582,582,582,582,582,,,,,,582,582,582,582,582', +'582,582,,,582,,,,,,582,582,582,582,582,582,582,582,582,582,582,582,', +'582,582,582,,582,582,582,582,582,,,,,,,,,,,,,,,,,,,,582,,,582,,,582', +'582,,,582,,582,,,,582,,,,,,,,,582,,,,,582,582,582,582,,582,582,582,582', +',,,,582,582,,,,,,582,582,,582,582,582,,,582,582,592,592,592,,592,,,', +'592,592,,,,592,,592,592,592,592,592,592,592,,,,,,592,592,592,592,592', +'592,592,,,592,,,,,,,592,,,592,592,592,592,592,592,592,592,592,592,592', +'592,,592,592,592,592,592,,,,,,,,,,,,,,,,,,,,592,,,592,,,592,592,,,592', +',592,,592,,592,,,592,,,,,,592,,,,,592,592,592,592,,592,592,592,592,', +',,,592,592,,,,306,306,306,592,306,592,592,592,306,306,592,592,,306,', +'306,306,306,306,306,306,306,,,,,,306,306,306,306,306,306,306,,,306,', +',,,,,306,,,306,306,306,306,306,306,306,306,306,306,306,306,,306,306', +'306,306,306,,,,,,,,,,,,,,,,,,,,306,,,306,,,306,306,,,306,,306,,306,', +'306,,,306,,,,,,306,,,,,306,306,306,306,,306,306,306,306,,,,,306,306', +',,,890,890,890,306,890,306,306,306,890,890,306,306,,890,,890,890,890', +'890,890,890,890,,,,,,890,890,890,890,890,890,890,,,890,,,,,,,890,,,890', +'890,890,890,890,890,890,890,,890,890,890,,890,890,890,890,890,,,,,,', +',,,,,,,,,,,,,890,,,890,,,890,890,,,890,,,,,,890,,,,,,,,,890,,,,,890', +'890,890,890,,890,890,890,890,,,,,890,890,,,,891,891,891,890,891,890', +'890,890,891,891,890,890,,891,,891,891,891,891,891,891,891,,,,,,891,891', +'891,891,891,891,891,,,891,,,,,,,891,,,891,891,891,891,891,891,891,891', +',891,891,891,,891,891,891,891,891,,,,,,,,,,,,,,,,,,,,891,,,891,,,891', +'891,,,891,,,,,,891,,,,,,,,,891,,,,,891,891,891,891,,891,891,891,891', +',,,,891,891,,,,307,307,307,891,307,891,891,891,307,307,891,891,,307', +',307,307,307,307,307,307,307,,,,,,307,307,307,307,307,307,307,,,307', +',,,,,,307,,,307,307,307,307,307,307,307,307,307,307,307,307,,307,307', +'307,307,307,,,,,,,,,,,,,,,,,,,,307,,,307,,,307,307,,,307,,307,,307,', +'307,,,307,,,,,,307,,,,,307,307,307,307,,307,307,307,307,,,,,307,307', +',,,315,315,315,307,315,307,307,307,315,315,307,307,,315,,315,315,315', +'315,315,315,315,,,,,,315,315,315,315,315,315,315,,,315,,,,,,,315,,,315', +'315,315,315,315,315,315,315,315,315,315,315,,315,315,315,315,315,,,', +',,,,,,,,,,,,,,,,315,,,315,,,315,315,,,315,,315,,315,,315,,,315,,,,,', +'315,,,,,315,315,315,315,,315,315,315,315,,,,,315,315,315,,,322,322,322', +'315,322,315,315,315,322,322,315,315,,322,,322,322,322,322,322,322,322', +',,,,,322,322,322,322,322,322,322,,,322,,,,,,,322,,,322,322,322,322,322', +'322,322,322,,322,322,322,,322,322,322,322,322,,,,,,,,,,,,,,,,,,,,322', +',,322,,,322,322,,,322,,,,,,322,,,,,,,,,322,,,,,322,322,322,322,,322', +'322,322,322,,,,,322,322,,,,324,324,324,322,324,322,322,322,324,324,322', +'322,,324,,324,324,324,324,324,324,324,,,,,,324,324,324,324,324,324,324', +',,324,,,,,,,324,,,324,324,324,324,324,324,324,324,,324,324,324,,324', +'324,324,324,324,,,,,,,,,,,,,,,,,,,,324,,,324,,,324,324,,,324,,,,,,324', +',,,,,,,,324,,,,,324,324,324,324,,324,324,324,324,,,,,324,324,,,,327', +'327,327,324,327,324,324,324,327,327,324,324,,327,,327,327,327,327,327', +'327,327,,,,,,327,327,327,327,327,327,327,,,327,,,,,,,327,,,327,327,327', +'327,327,327,327,327,,327,327,327,,327,327,327,327,327,,,,,,,,,,,,,,', +',,,,,327,,,327,,,327,327,,,327,,,,,,327,,,,,,,,,327,,,,,327,327,327', +'327,,327,327,327,327,,,,,327,327,,,,328,328,328,327,328,327,327,327', +'328,328,327,327,,328,,328,328,328,328,328,328,328,,,,,,328,328,328,328', +'328,328,328,,,328,,,,,,,328,,,328,328,328,328,328,328,328,328,,328,328', +'328,,328,328,328,328,328,,,,,,,,,,,,,,,,,,,,328,,,328,,,328,328,,,328', +',,,,,328,,,,,,,,,328,,,,,328,328,328,328,,328,328,328,328,,,,,328,328', +',,,283,283,283,328,283,328,328,328,283,283,328,328,,283,,283,283,283', +'283,283,283,283,,,,,,283,283,283,283,283,283,283,,,283,,,,,,,283,,,283', +'283,283,283,283,283,283,283,,283,283,283,,283,283,283,283,283,,,,,,', +',,,,,,,,,,,,,283,,,283,,,283,283,,,283,,,,,,283,,,,,,,,,283,,,,,283', +'283,283,283,,283,283,283,283,,,,,283,283,,,,919,919,919,283,919,283', +'283,283,919,919,283,283,,919,,919,919,919,919,919,919,919,,,,,,919,919', +'919,919,919,919,919,,,919,,,,,,,919,,,919,919,919,919,919,919,919,919', +',919,919,919,,919,919,919,919,919,,,,,,,,,,,,,,,,,,,,919,,,919,,,919', +'919,,,919,,,,,,919,,,,,,,,,919,,,,,919,919,919,919,,919,919,919,919', +',,,,919,919,,,,920,920,920,919,920,919,919,919,920,920,919,919,,920', +',920,920,920,920,920,920,920,,,,,,920,920,920,920,920,920,920,,,920', +',,,,,,920,,,920,920,920,920,920,920,920,920,,920,920,920,,920,920,920', +'920,920,,,,,,,,,,,,,,,,,,,,920,,,920,,,920,920,,,920,,,,,,920,,,,,,', +',,920,,,,,920,920,920,920,,920,920,920,920,,,,,920,920,,,,921,921,921', +'920,921,920,920,920,921,921,920,920,,921,,921,921,921,921,921,921,921', +',,,,,921,921,921,921,921,921,921,,,921,,,,,,,921,,,921,921,921,921,921', +'921,921,921,,921,921,921,,921,921,921,921,921,,,,,,,,,,,,,,,,,,,,921', +',,921,,,921,921,,,921,,,,,,921,,,,,,,,,921,,,,,921,921,921,921,,921', +'921,921,921,,,,,921,921,,,,922,922,922,921,922,921,921,921,922,922,921', +'921,,922,,922,922,922,922,922,922,922,,,,,,922,922,922,922,922,922,922', +',,922,,,,,,,922,,,922,922,922,922,922,922,922,922,,922,922,922,,922', +'922,922,922,922,,,,,,,,,,,,,,,,,,,,922,,,922,,,922,922,,,922,,,,,,922', +',,,,,,,,922,,,,,922,922,922,922,,922,922,922,922,,,,,922,922,,,,923', +'923,923,922,923,922,922,922,923,923,922,922,,923,,923,923,923,923,923', +'923,923,,,,,,923,923,923,923,923,923,923,,,923,,,,,,,923,,,923,923,923', +'923,923,923,923,923,,923,923,923,,923,923,923,923,923,,,,,,,,,,,,,,', +',,,,,923,,,923,,,923,923,,,923,,,,,,923,,,,,,,,,923,,,,,923,923,923', +'923,,923,923,923,923,,,,,923,923,,,,924,924,924,923,924,923,923,923', +'924,924,923,923,,924,,924,924,924,924,924,924,924,,,,,,924,924,924,924', +'924,924,924,,,924,,,,,,,924,,,924,924,924,924,924,924,924,924,,924,924', +'924,,924,924,924,924,924,,,,,,,,,,,,,,,,,,,,924,,,924,,,924,924,,,924', +',,,,,924,,,,,,,,,924,,,,,924,924,924,924,,924,924,924,924,,,,,924,924', +',,,278,278,278,924,278,924,924,924,278,278,924,924,,278,,278,278,278', +'278,278,278,278,,,,,,278,278,278,278,278,278,278,,,278,,,,,,,278,,,278', +'278,278,278,278,278,278,278,,278,278,278,,278,278,278,278,278,,,,,,', +',,,,,,,,,,,,,278,,,278,,,278,278,,,278,,,,,,278,,,,,,,,,278,,,,,278', +'278,278,278,,278,278,278,278,,,,,278,278,,,,,,,278,,278,278,278,,,278', +'278,333,333,333,333,333,,,,333,333,,,,333,,333,333,333,333,333,333,333', +',,,,,333,333,333,333,333,333,333,,,333,,,,,,333,333,,333,333,333,333', +'333,333,333,333,333,,333,333,333,,333,333,333,333,333,,,,,,,,,,,,,,', +',,,,,333,,,333,,,333,333,,,333,,333,,,,333,,,,,,,,,333,,,,,333,333,333', +'333,,333,333,333,333,,,,,333,333,,,,802,802,802,333,802,333,333,333', +'802,802,333,333,,802,,802,802,802,802,802,802,802,,,,,,802,802,802,802', +'802,802,802,,,802,,,,,,,802,,,802,802,802,802,802,802,802,802,,802,802', +'802,,802,802,802,802,802,,,,,,,,,,,,,,,,,,,,802,,,802,,,802,802,,,802', +',,,,,802,,,,,,,,,802,,,,,802,802,802,802,,802,802,802,802,,,,,802,802', +',,,799,799,799,802,799,802,802,802,799,799,802,802,,799,,799,799,799', +'799,799,799,799,,,,,,799,799,799,799,799,799,799,,,799,,,,,,,799,,,799', +'799,799,799,799,799,799,799,,799,799,799,,799,799,799,799,799,,,,,,', +',,,,,,,,,,,,,799,,,799,,,799,799,,,799,,,,,,799,,,,,,,,,799,,,,,799', +'799,799,799,,799,799,799,799,,,,,799,799,,,,986,986,986,799,986,799', +'799,799,986,986,799,799,,986,,986,986,986,986,986,986,986,,,,,,986,986', +'986,986,986,986,986,,,986,,,,,,,986,,,986,986,986,986,986,986,986,986', +',986,986,986,,986,986,986,986,986,,,,,,,,,,,,,,,,,,,,986,,,986,,,986', +'986,,,986,,,,,,986,,,,,,,,,986,,,,,986,986,986,986,,986,986,986,986', +',,,,986,986,,,,991,991,991,986,991,986,986,986,991,991,986,986,,991', +',991,991,991,991,991,991,991,,,,,,991,991,991,991,991,991,991,,,991', +',,,,,,991,,,991,991,991,991,991,991,991,991,,991,991,991,,991,991,991', +'991,991,,,,,,,,,,,,,,,,,,,,991,,,991,,,991,991,,,991,,991,,,,991,,,', +',,,,,991,,,,,991,991,991,991,,991,991,991,991,,,,,991,991,,,,35,35,35', +'991,35,991,991,991,35,35,991,991,,35,,35,35,35,35,35,35,35,,,,,,35,35', +'35,35,35,35,35,,,35,,,,,,,35,,,35,35,35,35,35,35,35,35,35,35,35,35,', +'35,35,35,35,35,,,,,,,,,,,,,,,,,,,,35,,,35,,,35,35,,,35,,35,,35,,35,', +',35,,,,,,35,,,,,35,35,35,35,,35,35,35,35,,,,,35,35,,,,273,273,273,35', +'273,35,35,35,273,273,35,35,,273,,273,273,273,273,273,273,273,,,,,,273', +'273,273,273,273,273,273,,,273,,,,,,,273,,,273,273,273,273,273,273,273', +'273,,273,273,273,,273,273,273,273,273,,,,,,,,,,,,,,,,,,,,273,,,273,', +',273,273,,,273,,,,,,273,,,,,,,,,273,,,,,273,273,273,273,,273,273,273', +'273,,,,,273,273,,,,36,36,36,273,36,273,273,273,36,36,273,273,,36,,36', +'36,36,36,36,36,36,,,,,,36,36,36,36,36,36,36,,,36,,,,,,,36,,,36,36,36', +'36,36,36,36,36,36,36,36,36,,36,36,36,36,36,,,,,,,,,,,,,,,,,,,,36,,,36', +',,36,36,,,36,,36,,36,,36,,,36,,,,,,36,,,,,36,36,36,36,,36,36,36,36,', +',,,36,36,,,,790,790,790,36,790,36,36,36,790,790,36,36,,790,,790,790', +'790,790,790,790,790,,,,,,790,790,790,790,790,790,790,,,790,,,,,,,790', +',,790,790,790,790,790,790,790,790,790,790,790,790,,790,790,790,790,790', +',,,,,,,,,,,,,,,,,,,790,,,790,,,790,790,,,790,,790,,790,,790,,,790,,', +',,,790,,,,,790,790,790,790,,790,790,790,790,,,,,790,790,,,,1010,1010', +'1010,790,1010,790,790,790,1010,1010,790,790,,1010,,1010,1010,1010,1010', +'1010,1010,1010,,,,,,1010,1010,1010,1010,1010,1010,1010,,,1010,,,,,,', +'1010,,,1010,1010,1010,1010,1010,1010,1010,1010,1010,1010,1010,1010,', +'1010,1010,1010,1010,1010,,,,,,,,,,,,,,,,,,,,1010,,,1010,,,1010,1010', +',,1010,,,,1010,,1010,,,1010,,,,,,1010,,,,,1010,1010,1010,1010,,1010', +'1010,1010,1010,,,,,1010,1010,,,,849,849,849,1010,849,1010,1010,1010', +'849,849,1010,1010,,849,,849,849,849,849,849,849,849,,,,,,849,849,849', +'849,849,849,849,,,849,,,,,,,849,,,849,849,849,849,849,849,849,849,,849', +'849,849,,849,849,849,849,849,,,,,,,,,,,,,,,,,,,,849,,,849,,,849,849', +',,849,,,,,,849,,,,,,,,,849,,,,,849,849,849,849,,849,849,849,849,,,,', +'849,849,,,,299,299,299,849,299,849,849,849,299,299,849,849,,299,,299', +'299,299,299,299,299,299,,,,,,299,299,299,299,299,299,299,,,299,,,,,', +',299,,,299,299,299,299,299,299,299,299,,299,299,299,,299,299,299,299', +'299,,,,,,,,,,,,,,,,,,,,299,,,299,,,299,299,,,299,,,,,,299,,,,,,,,,299', +',,,,299,299,299,299,,299,299,299,299,,,,,299,299,,,,1036,1036,1036,299', +'1036,299,299,299,1036,1036,299,299,,1036,,1036,1036,1036,1036,1036,1036', +'1036,,,,,,1036,1036,1036,1036,1036,1036,1036,,,1036,,,,,,,1036,,,1036', +'1036,1036,1036,1036,1036,1036,1036,,1036,1036,1036,,1036,1036,1036,1036', +'1036,,,,,,,,,,,,,,,,,,,,1036,,,1036,,,1036,1036,,,1036,,,,,,1036,,,', +',,,,,1036,,,,,1036,1036,1036,1036,,1036,1036,1036,1036,,,,,1036,1036', +',,,272,272,272,1036,272,1036,1036,1036,272,272,1036,1036,,272,,272,272', +'272,272,272,272,272,,,,,,272,272,272,272,272,272,272,,,272,,,,,,,272', +',,272,272,272,272,272,272,272,272,,272,272,272,,272,272,272,272,272', +',,,,,,,,,,,,,,,,,,,272,,,272,,,272,272,,,272,,,,,,272,,,,,,,,,272,,', +',,272,272,272,272,,272,272,272,272,,,,,272,272,,,,271,271,271,272,271', +'272,272,272,271,271,272,272,,271,,271,271,271,271,271,271,271,,,,,,271', +'271,271,271,271,271,271,,,271,,,,,,,271,,,271,271,271,271,271,271,271', +'271,,271,271,271,,271,271,271,271,271,,,,,,,,,,,,,,,,,,,,271,,,271,', +',271,271,,,271,,,,,,271,,,,,,,,,271,,,,,271,271,271,271,,271,271,271', +'271,,,,,271,271,,,,270,270,270,271,270,271,271,271,270,270,271,271,', +'270,,270,270,270,270,270,270,270,,,,,,270,270,270,270,270,270,270,,', +'270,,,,,,,270,,,270,270,270,270,270,270,270,270,,270,270,270,,270,270', +'270,270,270,,,,,,,,,,,,,,,,,,,,270,,,270,,,270,270,,,270,,,,,,270,,', +',,,,,,270,,,,,270,270,270,270,,270,270,270,270,,,,,270,270,,,,369,369', +'369,270,369,270,270,270,369,369,270,270,,369,,369,369,369,369,369,369', +'369,,,,,,369,369,369,369,369,369,369,,,369,,,,,,,369,,,369,369,369,369', +'369,369,369,369,,369,369,369,,369,369,369,369,369,,,,,,,,,,,,,,,,,,', +',369,,,369,,,369,369,,,369,,,,,,369,,,,,,,,,369,,,,,369,369,369,369', +',369,369,369,369,,,,,369,369,,,,46,46,46,369,46,369,369,369,46,46,369', +'369,,46,,46,46,46,46,46,46,46,,,,,,46,46,46,46,46,46,46,,,46,,,,,,,46', +',,46,46,46,46,46,46,46,46,,46,46,46,,46,46,46,46,46,,,,,,,,,,,,,,,,', +',,,46,,,46,,,46,46,,,46,,,,,,46,,,,,,,,,46,,,,,46,46,46,46,,46,46,46', +'46,,,,,46,46,,,,820,820,820,46,820,46,46,46,820,820,46,46,,820,,820', +'820,820,820,820,820,820,,,,,,820,820,820,820,820,820,820,,,820,,,,,', +',820,,,820,820,820,820,820,820,820,820,,820,820,820,,820,820,820,820', +'820,,,,,,,,,,,,,,,,,,,,820,,,820,,,820,820,,,820,,,,,,820,,,,,,,,,820', +',,,,820,820,820,820,,820,820,820,820,,,,,820,820,,,,47,47,47,820,47', +'820,820,820,47,47,820,820,,47,,47,47,47,47,47,47,47,,,,,,47,47,47,47', +'47,47,47,,,47,,,,,,,47,,,47,47,47,47,47,47,47,47,,47,47,47,,47,47,47', +'47,47,,,,,,,,,,,,,,,,,,,,47,,,47,,,47,47,,,47,,,,,,47,,,,,,,,,47,,,', +',47,47,47,47,,47,47,47,47,,,,,47,47,,,,269,269,269,47,269,47,47,47,269', +'269,47,47,,269,,269,269,269,269,269,269,269,,,,,,269,269,269,269,269', +'269,269,,,269,,,,,,,269,,,269,269,269,269,269,269,269,269,,269,269,269', +',269,269,269,269,269,,,,,,,,,,,,,,,,,,,,269,,,269,,,269,269,,,269,,', +',,,269,,,,,,,,,269,,,,,269,269,269,269,,269,269,269,269,,,,,269,269', +',,,268,268,268,269,268,269,269,269,268,268,269,269,,268,,268,268,268', +'268,268,268,268,,,,,,268,268,268,268,268,268,268,,,268,,,,,,,268,,,268', +'268,268,268,268,268,268,268,,268,268,268,,268,268,268,268,268,,,,,,', +',,,,,,,,,,,,,268,,,268,,,268,268,,,268,,,,,,268,,,,,,,,,268,,,,,268', +'268,268,268,,268,268,268,268,,,,,268,268,,,,49,49,49,268,49,268,268', +'268,49,49,268,268,,49,,49,49,49,49,49,49,49,,,,,,49,49,49,49,49,49,49', +',,49,,,,,,,49,,,49,49,49,49,49,49,49,49,,49,49,49,,49,49,49,49,49,,', +',,,,,,,,,,,,,,,,,49,,,49,,,49,49,,,49,,,,,,49,,,,,,,,,49,,,,,49,49,49', +'49,,49,49,49,49,,,,,49,49,,,,267,267,267,49,267,49,49,49,267,267,49', +'49,,267,,267,267,267,267,267,267,267,,,,,,267,267,267,267,267,267,267', +',,267,,,,,,,267,,,267,267,267,267,267,267,267,267,,267,267,267,,267', +'267,267,267,267,,,,,,,,,,,,,,,,,,,,267,,,267,,,267,267,,,267,,,,,,267', +',,,,,,,,267,,,,,267,267,267,267,,267,267,267,267,,,,,267,267,,,,50,50', +'50,267,50,267,267,267,50,50,267,267,,50,,50,50,50,50,50,50,50,,,,,,50', +'50,50,50,50,50,50,,,50,,,,,,,50,,,50,50,50,50,50,50,50,50,,50,50,50', +',50,50,50,50,50,,,,,,,,,,,,,,,,,,,,50,,,50,,,50,50,,,50,,,,,,50,,,,', +',,,,50,,,,,50,50,50,50,,50,50,50,50,,,,,50,50,,,,266,266,266,50,266', +'50,50,50,266,266,50,50,,266,,266,266,266,266,266,266,266,,,,,,266,266', +'266,266,266,266,266,,,266,,,,,,,266,,,266,266,266,266,266,266,266,266', +',266,266,266,,266,266,266,266,266,,,,,,,,,,,,,,,,,,,,266,,,266,,,266', +'266,,,266,,,,,,266,,,,,,,,,266,,,,,266,266,266,266,,266,266,266,266', +',,,,266,266,,,,735,735,735,266,735,266,266,266,735,735,266,266,,735', +',735,735,735,735,735,735,735,,,,,,735,735,735,735,735,735,735,,,735', +',,,,,,735,,,735,735,735,735,735,735,735,735,,735,735,735,,735,735,735', +'735,735,,,,,,,,,,,,,,,,,,,,735,,,735,,,735,735,,,735,,,,,,735,,,,,,', +',,735,,,,,735,735,735,735,,735,735,735,735,,,,,735,735,,,,734,734,734', +'735,734,735,735,735,734,734,735,735,,734,,734,734,734,734,734,734,734', +',,,,,734,734,734,734,734,734,734,,,734,,,,,,,734,,,734,734,734,734,734', +'734,734,734,,734,734,734,,734,734,734,734,734,,,,,,,,,,,,,,,,,,,,734', +',,734,,,734,734,,,734,,,,,,734,,,,,,,,,734,,,,,734,734,734,734,,734', +'734,734,734,,,,,734,734,,,,869,869,869,734,869,734,734,734,869,869,734', +'734,,869,,869,869,869,869,869,869,869,,,,,,869,869,869,869,869,869,869', +',,869,,,,,,,869,,,869,869,869,869,869,869,869,869,,869,869,869,,869', +'869,869,869,869,,,,,,,,,,,,,,,,,,,,869,,,869,,,869,869,,,869,,,,,,869', +',,,,,,,,869,,,,,869,869,869,869,,869,869,869,869,,,,,869,869,,,,386', +'386,386,869,386,869,869,869,386,386,869,869,,386,,386,386,386,386,386', +'386,386,,,,,,386,386,386,386,386,386,386,,,386,,,,,,,386,,,386,386,386', +'386,386,386,386,386,,386,386,386,,386,386,386,386,386,,,,,,,,,,,,,,', +',,,,,386,,,386,,,386,386,,,386,,,,,,386,,,,,,,,,386,,,,,386,386,386', +'386,,386,386,386,386,,,,,386,386,,,,265,265,265,386,265,386,386,386', +'265,265,386,386,,265,,265,265,265,265,265,265,265,,,,,,265,265,265,265', +'265,265,265,,,265,,,,,,,265,,,265,265,265,265,265,265,265,265,,265,265', +'265,,265,265,265,265,265,,,,,,,,,,,,,,,,,,,,265,,,265,,,265,265,,,265', +',,,,,265,,,,,,,,,265,,,,,265,265,265,265,,265,265,265,265,,,,,265,265', +',,,264,264,264,265,264,265,265,265,264,264,265,265,,264,,264,264,264', +'264,264,264,264,,,,,,264,264,264,264,264,264,264,,,264,,,,,,,264,,,264', +'264,264,264,264,264,264,264,,264,264,264,,264,264,264,264,264,,,,,,', +',,,,,,,,,,,,,264,,,264,,,264,264,,,264,,,,,,264,,,,,,,,,264,,,,,264', +'264,264,264,,264,264,264,264,,,,,264,264,,,,263,263,263,264,263,264', +'264,264,263,263,264,264,,263,,263,263,263,263,263,263,263,,,,,,263,263', +'263,263,263,263,263,,,263,,,,,,,263,,,263,263,263,263,263,263,263,263', +',263,263,263,,263,263,263,263,263,,,,,,,,,,,,,,,,,,,,263,,,263,,,263', +'263,,,263,,,,,,263,,,,,,,,,263,,,,,263,263,263,263,,263,263,263,263', +',,,,263,263,,,,262,262,262,263,262,263,263,263,262,262,263,263,,262', +',262,262,262,262,262,262,262,,,,,,262,262,262,262,262,262,262,,,262', +',,,,,,262,,,262,262,262,262,262,262,262,262,,262,262,262,,262,262,262', +'262,262,,,,,,,,,,,,,,,,,,,,262,,,262,,,262,262,,,262,,,,,,262,,,,,,', +',,262,,,,,262,262,262,262,,262,262,262,262,,,,,262,262,,,,24,24,24,262', +'24,262,262,262,24,24,262,262,,24,,24,24,24,24,24,24,24,,,,,,24,24,24', +'24,24,24,24,,,24,,,,,,,24,,,24,24,24,24,24,24,24,24,,24,24,24,,24,24', +'24,24,24,,,,,,,,,,,,,,,,,,,,24,,,24,,,24,24,,,24,,,,,,24,,,,,,,,,24', +',,,,24,24,24,24,,24,24,24,24,,,,,24,24,,,,261,261,261,24,261,24,24,24', +'261,261,24,24,,261,,261,261,261,261,261,261,261,,,,,,261,261,261,261', +'261,261,261,,,261,,,,,,,261,,,261,261,261,261,261,261,261,261,,261,261', +'261,,261,261,261,261,261,,,,,,,,,,,,,,,,,,,,261,,,261,,,261,261,,,261', +',,,,,261,,,,,,,,,261,,,,,261,261,261,261,,261,261,261,261,,,,,261,261', +',,,1149,1149,1149,261,1149,261,261,261,1149,1149,261,261,,1149,,1149', +'1149,1149,1149,1149,1149,1149,,,,,,1149,1149,1149,1149,1149,1149,1149', +',,1149,,,,,,,1149,,,1149,1149,1149,1149,1149,1149,1149,1149,,1149,1149', +'1149,,1149,1149,1149,1149,1149,,,,,,,,,,,,,,,,,,,,1149,,,1149,,,1149', +'1149,,,1149,,,,,,1149,,,,,,,,,1149,,,,,1149,1149,1149,1149,,1149,1149', +'1149,1149,,,,,1149,1149,,,,1150,1150,1150,1149,1150,1149,1149,1149,1150', +'1150,1149,1149,,1150,,1150,1150,1150,1150,1150,1150,1150,,,,,,1150,1150', +'1150,1150,1150,1150,1150,,,1150,,,,,,,1150,,,1150,1150,1150,1150,1150', +'1150,1150,1150,,1150,1150,1150,,1150,1150,1150,1150,1150,,,,,,,,,,,', +',,,,,,,,1150,,,1150,,,1150,1150,,,1150,,,,,,1150,,,,,,,,,1150,,,,,1150', +'1150,1150,1150,,1150,1150,1150,1150,,,,,1150,1150,,,,52,52,52,1150,52', +'1150,1150,1150,52,52,1150,1150,,52,,52,52,52,52,52,52,52,,,,,,52,52', +'52,52,52,52,52,,,52,,,,,,,52,,,52,52,52,52,52,52,52,52,,52,52,52,,52', +'52,52,52,52,,,,,,,,,,,,,,,,,,,,52,,,52,,,52,52,,,52,,,,,,52,,,,,,,,', +'52,,,,,52,52,52,52,,52,52,52,52,,,,,52,52,,,,712,712,712,52,712,52,52', +'52,712,712,52,52,,712,,712,712,712,712,712,712,712,,,,,,712,712,712', +'712,712,712,712,,,712,,,,,,,712,,,712,712,712,712,712,712,712,712,,712', +'712,712,,712,712,712,712,712,,,,,,,,,,,,,,,,,,,,712,,,712,,,712,712', +',,712,,,,,,712,,,,,,,,,712,,,,,712,712,712,712,,712,712,712,712,,,,', +'712,712,,,,1162,1162,1162,712,1162,712,712,712,1162,1162,712,712,,1162', +',1162,1162,1162,1162,1162,1162,1162,,,,,,1162,1162,1162,1162,1162,1162', +'1162,,,1162,,,,,,,1162,,,1162,1162,1162,1162,1162,1162,1162,1162,1162', +'1162,1162,1162,,1162,1162,1162,1162,1162,,,,,,,,,,,,,,,,,,,,1162,,,1162', +',,1162,1162,,,1162,,1162,,1162,,1162,,,1162,,,,,,1162,,,,,1162,1162', +'1162,1162,,1162,1162,1162,1162,,,,,1162,1162,,,,260,260,260,1162,260', +'1162,1162,1162,260,260,1162,1162,,260,,260,260,260,260,260,260,260,', +',,,,260,260,260,260,260,260,260,,,260,,,,,,,260,,,260,260,260,260,260', +'260,260,260,,260,260,260,,260,260,260,260,260,,,,,,,,,,,,,,,,,,,,260', +',,260,,,260,260,,,260,,,,,,260,,,,,,,,,260,,,,,260,260,260,260,,260', +'260,260,260,,,,,260,260,,,,,,,260,,260,260,260,,,260,260,7,7,7,7,7,', +',,7,7,,,,7,,7,7,7,7,7,7,7,,,,,,7,7,7,7,7,7,7,,,7,,,,,,7,7,7,7,7,7,7', +'7,7,7,7,7,,7,7,7,,7,7,7,7,7,,,,,,,,,,,,,,,,,,,,7,,,7,,,7,7,,,7,,7,,', +',7,,,,,,,,,7,,,,,7,7,7,7,,7,7,7,7,,,,,7,7,,,,,,,7,,7,7,7,64,,7,7,,,', +'64,64,64,,,64,64,64,,64,,,,,,,,64,,64,64,64,,,,,,,,64,64,,64,64,64,64', +'64,,,,,,,,,,,,,,,,,,,,,,,64,64,64,64,64,64,64,64,64,64,64,64,64,64,', +',64,64,64,,,64,,,64,,,64,64,,64,,64,,64,,64,64,,64,64,64,64,64,,64,', +'64,,,,,,,,,,,,,,64,,,64,64,64,64,,64,,64,,696,696,696,64,696,,,,696', +'696,,,,696,,696,696,696,696,696,696,696,,,,,,696,696,696,696,696,696', +'696,,,696,,,,,,,696,,,696,696,696,696,696,696,696,696,,696,696,696,', +'696,696,696,696,696,,,,,,,,,,,,,,,,,,,,696,,,696,,,696,696,,,696,,696', +',,,696,,,,,,,,,696,,,,,696,696,696,696,,696,696,696,696,,,,,696,696', +',,,259,259,259,696,259,696,696,696,259,259,696,696,,259,,259,259,259', +'259,259,259,259,,,,,,259,259,259,259,259,259,259,,,259,,,,,,,259,,,259', +'259,259,259,259,259,259,259,,259,259,259,,259,259,259,259,259,,,,,,', +',,,,,,,,,,,,,259,,,259,,,259,259,,,259,,,,,,259,,,,,,,,,259,,,,,259', +'259,259,259,,259,259,259,259,,,,,259,259,,,,407,407,407,259,407,259', +'259,259,407,407,259,259,,407,,407,407,407,407,407,407,407,,,,,,407,407', +'407,407,407,407,407,,,407,,,,,,,407,,,407,407,407,407,407,407,407,407', +',407,407,407,,407,407,407,407,407,,,,,,,,,,,,,,,,,,,,407,,,407,,,407', +'407,,,407,,,,,,407,,,,,,,,,407,,,,,407,407,407,407,,407,407,407,407', +',,,,407,407,,,,258,258,258,407,258,407,407,407,258,258,407,407,,258', +',258,258,258,258,258,258,258,,,,,,258,258,258,258,258,258,258,,,258', +',,,,,,258,,,258,258,258,258,258,258,258,258,,258,258,258,,258,258,258', +'258,258,,,,,,,,,,,,,,,,,,,,258,,,258,,,258,258,,,258,,,,,,258,,,,,,', +',,258,,,,,258,258,258,258,,258,258,258,258,,,,,258,258,,,,257,257,257', +'258,257,258,258,258,257,257,258,258,,257,,257,257,257,257,257,257,257', +',,,,,257,257,257,257,257,257,257,,,257,,,,,,,257,,,257,257,257,257,257', +'257,257,257,,257,257,257,,257,257,257,257,257,,,,,,,,,,,,,,,,,,,,257', +',,257,,,257,257,,,257,,,,,,257,,,,,,,,,257,,,,,257,257,257,257,,257', +'257,257,257,,,,,257,257,,,,690,690,690,257,690,257,257,257,690,690,257', +'257,,690,,690,690,690,690,690,690,690,,,,,,690,690,690,690,690,690,690', +',,690,,,,,,,690,,,690,690,690,690,690,690,690,690,,690,690,690,,690', +'690,690,690,690,,,,,,,,,,,,,,,,,,,,690,,,690,,,690,690,,,690,,,,,,690', +',,,,,,,,690,,,,,690,690,690,690,,690,690,690,690,,,,,690,690,,,,689', +'689,689,690,689,690,690,690,689,689,690,690,,689,,689,689,689,689,689', +'689,689,,,,,,689,689,689,689,689,689,689,,,689,,,,,,,689,,,689,689,689', +'689,689,689,689,689,,689,689,689,,689,689,689,689,689,,,,,,,,,,,,,,', +',,,,,689,,,689,,,689,689,,,689,,,,,,689,,,,,,,,,689,,,,,689,689,689', +'689,,689,689,689,689,,,,,689,689,,,,,,,689,,689,689,689,,,689,689,66', +'66,66,66,66,,,,66,66,,,,66,,66,66,66,66,66,66,66,,,,,,66,66,66,66,66', +'66,66,,,66,,,,,,66,66,,66,66,66,66,66,66,66,66,66,,66,66,66,,66,66,66', +'66,66,,,,,,,,,,,,,,,,,,,,66,,,66,,,66,66,,,66,,66,,,,66,,,,,,,,,66,', +',,,66,66,66,66,,66,66,66,66,,,,,66,66,,,,67,67,67,66,67,66,66,66,67', +'67,66,66,,67,,67,67,67,67,67,67,67,,,,,,67,67,67,67,67,67,67,,,67,,', +',,,,67,,,67,67,67,67,67,67,67,67,67,67,67,67,,67,67,67,67,67,,,,,,,', +',,,,,,,,,,,,67,,,67,,,67,67,,,67,,67,,,,67,,,67,,,,,,67,,,,,67,67,67', +'67,,67,67,67,67,,,,,67,67,,,,68,68,68,67,68,67,67,67,68,68,67,67,,68', +',68,68,68,68,68,68,68,,,,,,68,68,68,68,68,68,68,,,68,,,,,,,68,,,68,68', +'68,68,68,68,68,68,68,68,68,68,,68,68,68,68,68,,,,,,,,,,,,,,,,,,,,68', +',,68,,,68,68,,,68,,,,,,68,,,68,,,,,,68,,,,,68,68,68,68,,68,68,68,68', +',,,,68,68,,,,436,436,436,68,436,68,68,68,436,436,68,68,,436,,436,436', +'436,436,436,436,436,,,,,,436,436,436,436,436,436,436,,,436,,,,,,,436', +',,436,436,436,436,436,436,436,436,,436,436,436,,436,436,436,436,436', +',,,,,,,,,,,,,,,,,,,436,,,436,,,436,436,,,436,,,,,,436,,,,,,,,,436,,', +',,436,436,436,436,,436,436,436,436,,,,,436,436,,,,71,71,71,436,71,436', +'436,436,71,71,436,436,,71,,71,71,71,71,71,71,71,,,,,,71,71,71,71,71', +'71,71,,,71,,,,,,,71,,,71,71,71,71,71,71,71,71,,71,71,71,,71,71,71,71', +'71,,,,,,,,,,,,,,,,,,,,71,,,71,,,71,71,,,71,,,,,,71,,,,,,,,,71,,,,,71', +'71,71,71,,71,71,71,71,,,,,71,71,,,,72,72,72,71,72,71,71,71,72,72,71', +'71,,72,,72,72,72,72,72,72,72,,,,,,72,72,72,72,72,72,72,,,72,,,,,,,72', +',,72,72,72,72,72,72,72,72,,72,72,72,,72,72,72,72,72,,,,,,,,,,,,,,,,', +',,,72,,,72,,,72,72,,,72,,,,,,72,,,,,,,,,72,,,,,72,72,72,72,,72,72,72', +'72,,,,,72,72,,,,684,684,684,72,684,72,72,72,684,684,72,72,,684,,684', +'684,684,684,684,684,684,,,,,,684,684,684,684,684,684,684,,,684,,,,,', +',684,,,684,684,684,684,684,684,684,684,,684,684,684,,684,684,684,684', +'684,,,,,,,,,,,,,,,,,,,,684,,,684,,,684,684,,,684,,,,,,684,,,,,,,,,684', +',,,,684,684,684,684,,684,684,684,684,,,,,684,684,,,,75,75,75,684,75', +'684,684,684,75,75,684,684,,75,,75,75,75,75,75,75,75,,,,,,75,75,75,75', +'75,75,75,,,75,,,,,,,75,,,75,75,75,75,75,75,75,75,,75,75,75,,75,75,75', +'75,75,,,,,,,,,,,,,,,,,,,,75,,,75,,,75,75,,,75,,,,,,75,,,,,,,,,75,,,', +',75,75,75,75,,75,75,75,75,,,,,75,75,75,,,,,75,75,,75,75,75,,,75,75,683', +'683,683,,683,,,,683,683,,,,683,,683,683,683,683,683,683,683,,,,,,683', +'683,683,683,683,683,683,,,683,,,,,,,683,,,683,683,683,683,683,683,683', +'683,683,683,683,683,,683,683,683,683,683,,,,,,,,,,,,,,,,,,,,683,,,683', +',,683,683,,,683,,,,683,,683,,,683,,,,,,683,,,,,683,683,683,683,,683', +'683,683,683,,,,,683,683,,,,682,682,682,683,682,683,683,683,682,682,683', +'683,,682,,682,682,682,682,682,682,682,,,,,,682,682,682,682,682,682,682', +',,682,,,,,,,682,,,682,682,682,682,682,682,682,682,682,682,682,682,,682', +'682,682,682,682,,,,,,,,,,,,,,,,,,,,682,,,682,,,682,682,,,682,,682,,682', +',682,,,682,,,,,,682,,,,,682,682,682,682,,682,682,682,682,,,,,682,682', +',,,,,,682,,682,682,682,460,,682,682,,,,460,460,460,,,460,460,460,,460', +',,,,,,,460,460,460,460,,,,,,,,,460,460,,460,460,460,460,460,,,,,,,,', +',,,,,,,,,,,,,,460,460,460,460,460,460,460,460,460,460,460,460,460,460', +',,460,460,460,,,460,,460,460,,,460,460,,460,,460,,460,,460,460,,460', +'460,460,460,460,,460,460,460,1229,,1229,1229,1229,1229,1229,,,,,,,460', +',1229,460,460,470,460,,460,,,,470,470,470,460,,470,470,470,,470,,,1229', +',,,,470,470,470,470,470,,1229,1229,,,,1229,470,470,,470,470,470,470', +'470,,,,,,,,,,,,,,,,,,,,,,,470,470,470,470,470,470,470,470,470,470,470', +'470,470,470,,,470,470,470,,,470,,,470,,,470,470,,470,,470,,470,,470', +'470,,470,470,470,470,470,,470,470,470,,,,,,,,,,,,,,470,,,470,470,470', +'470,,470,471,470,,,,,470,471,471,471,,,471,471,471,,471,,,,,,,,471,471', +'471,471,471,,,,,,,,471,471,,471,471,471,471,471,,,,,,,,,,,,,,,,,,,,', +',,471,471,471,471,471,471,471,471,471,471,471,471,471,471,,,471,471', +'471,,,471,,,471,,,471,471,,471,,471,,471,,471,471,,471,471,471,471,471', +',471,471,471,,,,,,,,,,,,,,471,,,471,471,471,471,,471,,471,,472,472,472', +'471,472,,,,472,472,,,,472,,472,472,472,472,472,472,472,,,,,,472,472', +'472,472,472,472,472,,,472,,,,,,,472,,,472,472,472,472,472,472,472,472', +',472,472,472,,472,472,472,472,472,,,,,,,,,,,,,,,,,,,,472,,,472,,,472', +'472,,,472,,,,,,472,,,,,,,,,472,,,,,472,472,472,472,,472,472,472,472', +',,,,472,472,,,,679,679,679,472,679,472,472,472,679,679,472,472,,679', +',679,679,679,679,679,679,679,,,,,,679,679,679,679,679,679,679,,,679', +',,,,,,679,,,679,679,679,679,679,679,679,679,,679,679,679,,679,679,679', +'679,679,,,,,,,,,,,,,,,,,,,,679,,,679,,,679,679,,,679,,,,,,679,,,,,,', +',,679,,,,,679,679,679,679,,679,679,679,679,,,,,679,679,,,,,,,679,,679', +'679,679,,,679,679,124,124,124,124,124,,,,124,124,,,,124,,124,124,124', +'124,124,124,124,,,,,,124,124,124,124,124,124,124,,,124,,,,,,124,124', +'124,124,124,124,124,124,124,124,124,124,,124,124,124,,124,124,124,124', +'124,,,,,,,,,,,,,,,,,,,,124,,,124,,,124,124,,,124,,124,,,,124,,,,,,,', +',124,,,,,124,124,124,124,,124,124,124,124,,,,,124,124,,,,,,124,124,', +'124,124,124,,,124,124,129,129,129,,129,,,,129,129,,,,129,,129,129,129', +'129,129,129,129,,,,,,129,129,129,129,129,129,129,,,129,,,,,,,129,,,129', +'129,129,129,129,129,129,129,,129,129,129,,129,129,129,129,129,,,,,,', +',,,,,,,,,,,,,129,,,129,,,129,129,,,129,,,,,,129,,,,,,,,,129,,,,,129', +'129,129,129,,129,129,129,129,,,,,129,129,,,,130,130,130,129,130,129', +'129,129,130,130,129,129,,130,,130,130,130,130,130,130,130,,,,,,130,130', +'130,130,130,130,130,,,130,,,,,,,130,,,130,130,130,130,130,130,130,130', +',130,130,130,,130,130,130,130,130,,,,,,,,,,,,,,,,,,,,130,,,130,,,130', +'130,,,130,,,,,,130,,,,,,,,,130,,,,,130,130,130,130,,130,130,130,130', +',,,,130,130,,,,131,131,131,130,131,130,130,130,131,131,130,130,,131', +',131,131,131,131,131,131,131,,,,,,131,131,131,131,131,131,131,,,131', +',,,,,,131,,,131,131,131,131,131,131,131,131,,131,131,131,,131,131,131', +'131,131,,,,,,,,,,,,,,,,,,,,131,,,131,,,131,131,,,131,,,,,,131,,,,,,', +',,131,,,,,131,131,131,131,,131,131,131,131,,,,,131,131,,,,132,132,132', +'131,132,131,131,131,132,132,131,131,,132,,132,132,132,132,132,132,132', +',,,,,132,132,132,132,132,132,132,,,132,,,,,,,132,,,132,132,132,132,132', +'132,132,132,,132,132,132,,132,132,132,132,132,,,,,,,,,,,,,,,,,,,,132', +',,132,,,132,132,,,132,,,,,,132,,,,,,,,,132,,,,,132,132,132,132,,132', +'132,132,132,,,,,132,132,,,,,,,132,,132,132,132,,,132,132,133,133,133', +'133,133,,,,133,133,,,,133,,133,133,133,133,133,133,133,,,,,,133,133', +'133,133,133,133,133,,,133,,,,,,133,133,,133,133,133,133,133,133,133', +'133,133,,133,133,133,,133,133,133,133,133,,,,,,,,,,,,,,,,,,,,133,,,133', +',,133,133,,,133,,133,,,,133,,,,,,,,,133,,,,,133,133,133,133,,133,133', +'133,133,,,,,133,133,,,,,,,133,,133,133,133,,,133,133,678,678,678,678', +'678,,,,678,678,,,,678,,678,678,678,678,678,678,678,,,,,,678,678,678', +'678,678,678,678,,,678,,,,,,678,678,,678,678,678,678,678,678,678,678', +'678,,678,678,678,,678,678,678,678,678,,,,,,,,,,,,,,,,,,,,678,,,678,', +',678,678,,,678,,678,,,,678,,,,,,,,,678,,,,,678,678,678,678,,678,678', +'678,678,,,,,678,678,,,,499,499,499,678,499,678,678,678,499,499,678,678', +',499,,499,499,499,499,499,499,499,,,,,,499,499,499,499,499,499,499,', +',499,,,,,,,499,,,499,499,499,499,499,499,499,499,,499,499,499,,499,499', +'499,499,499,,,,,,,,,,,,,,,,,,,,499,,,499,,,499,499,,,499,,,,,,499,,', +',,,,,,499,,,,,499,499,499,499,,499,499,499,499,,,,,499,499,,,,675,675', +'675,499,675,499,499,499,675,675,499,499,,675,,675,675,675,675,675,675', +'675,,,,,,675,675,675,675,675,675,675,,,675,,,,,,,675,,,675,675,675,675', +'675,675,675,675,675,675,675,675,,675,675,675,675,675,,,,,,,,,,,,,,,', +',,,,675,,,675,,,675,675,,,675,,675,,675,,675,,,675,,,,,,675,,,,,675', +'675,675,675,,675,675,675,675,,,,,675,675,,,,674,674,674,675,674,675', +'675,675,674,674,675,675,,674,,674,674,674,674,674,674,674,,,,,,674,674', +'674,674,674,674,674,,,674,,,,,,,674,,,674,674,674,674,674,674,674,674', +',674,674,674,,674,674,674,674,674,,,,,,,,,,,,,,,,,,,,674,,,674,,,674', +'674,,,674,,,,,,674,,,,,,,,,674,,,,,674,674,674,674,,674,674,674,674', +',,,,674,674,,,,673,673,673,674,673,674,674,674,673,673,674,674,,673', +',673,673,673,673,673,673,673,,,,,,673,673,673,673,673,673,673,,,673', +',,,,,,673,,,673,673,673,673,673,673,673,673,,673,673,673,,673,673,673', +'673,673,,,,,,,,,,,,,,,,,,,,673,,,673,,,673,673,,,673,,673,,,,673,,,', +',,,,,673,,,,,673,673,673,673,,673,673,673,673,,,,,673,673,,,,512,512', +'512,673,512,673,673,673,512,512,673,673,,512,,512,512,512,512,512,512', +'512,,,,,,512,512,512,512,512,512,512,,,512,,,,,,,512,,,512,512,512,512', +'512,512,512,512,,512,512,512,,512,512,512,512,512,,,,,,,,,,,,,,,,,,', +',512,,,512,,,512,512,,,512,,,,,,512,,,,,,,,,512,,,,,512,512,512,512', +',512,512,512,512,,,,,512,512,,,,219,219,219,512,219,512,512,512,219', +'219,512,512,,219,,219,219,219,219,219,219,219,,,,,,219,219,219,219,219', +'219,219,,,219,,,,,,,219,,,219,219,219,219,219,219,219,219,,219,219,219', +',219,219,219,219,219,,,,,,,,,,,,,,,,,,,,219,,,219,,,219,219,,,219,,219', +',,,219,,,,,,,,,219,,,,,219,219,219,219,,219,219,219,219,,,,,219,219', +',,,,,,219,,219,219,219,,,219,219,671,671,671,671,671,,,,671,671,,,,671', +',671,671,671,671,671,671,671,,,,,,671,671,671,671,671,671,671,,,671', +',,,,,671,671,,671,671,671,671,671,671,671,671,671,,671,671,671,,671', +'671,671,671,671,,,,,,,,,,,,,,,,,,,,671,,,671,,,671,671,,,671,,671,,', +',671,,,,,,,,,671,,,,,671,671,671,671,,671,671,671,671,,,,,671,671,,', +',522,522,522,671,522,671,671,671,522,522,671,671,,522,,522,522,522,522', +'522,522,522,,,,,,522,522,522,522,522,522,522,,,522,,,,,,,522,,,522,522', +'522,522,522,522,522,522,522,522,522,522,,522,522,522,522,522,,,,,,,', +',,,,,,,,,,,,522,,,522,,,522,522,,,522,,522,,522,,522,,,522,,,,,,522', +',,,,522,522,522,522,,522,522,522,522,,,,,522,522,,,,250,250,250,522', +'250,522,522,522,250,250,522,522,,250,,250,250,250,250,250,250,250,,', +',,,250,250,250,250,250,250,250,,,250,,,,,,,250,,,250,250,250,250,250', +'250,250,250,,250,250,250,,250,250,250,250,250,,,,,,,,,,,,,,,,,,,,250', +',,250,,,250,250,,,250,,,,,,250,,,,,,,,,250,,,,,250,250,250,250,,250', +'250,250,250,,,,,250,250,,,,524,524,524,250,524,250,250,250,524,524,250', +'250,,524,,524,524,524,524,524,524,524,,,,,,524,524,524,524,524,524,524', +',,524,,,,,,,524,,,524,524,524,524,524,524,524,524,,524,524,524,,524', +'524,524,524,524,,,,,,,,,,,,,,,,,,,,524,,,524,,,524,524,,,524,,,,,,524', +',,,,,,,,524,,,,,524,524,524,524,,524,524,524,524,,,,,524,524,,,,525', +'525,525,524,525,524,524,524,525,525,524,524,,525,,525,525,525,525,525', +'525,525,,,,,,525,525,525,525,525,525,525,,,525,,,,,,,525,,,525,525,525', +'525,525,525,525,525,,525,525,525,,525,525,525,525,525,,,,,,,,,,,,,,', +',,,,,525,,,525,,,525,525,,,525,,,,,,525,,,,,,,,,525,,,,,525,525,525', +'525,,525,525,525,525,,,,,525,525,,,,526,526,526,525,526,525,525,525', +'526,526,525,525,,526,,526,526,526,526,526,526,526,,,,,,526,526,526,526', +'526,526,526,,,526,,,,,,,526,,,526,526,526,526,526,526,526,526,,526,526', +'526,,526,526,526,526,526,,,,,,,,,,,,,,,,,,,,526,,,526,,,526,526,,,526', +',,,,,526,,,,,,,,,526,,,,,526,526,526,526,,526,526,526,526,,,,,526,526', +',,,220,220,220,526,220,526,526,526,220,220,526,526,,220,,220,220,220', +'220,220,220,220,,,,,,220,220,220,220,220,220,220,,,220,,,,,,,220,,,220', +'220,220,220,220,220,220,220,,220,220,220,,220,220,220,220,220,,,,,,', +',,,,,,,,,,,,,220,,,220,,,220,220,,,220,,220,,,,220,,,,,,,,,220,,,,,220', +'220,220,220,,220,220,220,220,,,,,220,220,,,,221,221,221,220,221,220', +'220,220,221,221,220,220,,221,,221,221,221,221,221,221,221,,,,,,221,221', +'221,221,221,221,221,,,221,,,,,,,221,,,221,221,221,221,221,221,221,221', +',221,221,221,,221,221,221,221,221,,,,,,,,,,,,,,,,,,,,221,,,221,,,221', +'221,,,221,,,,,,221,,,,,,,,,221,,,,,221,221,221,221,,221,221,221,221', +',,,,221,221,,,,222,222,222,221,222,221,221,221,222,222,221,221,,222', +',222,222,222,222,222,222,222,,,,,,222,222,222,222,222,222,222,,,222', +',,,,,,222,,,222,222,222,222,222,222,222,222,,222,222,222,,222,222,222', +'222,222,,,,,,,,,,,,,,,,,,,,222,,,222,,,222,222,,,222,,,,,,222,,,,,,', +',,222,,,,,222,222,222,222,,222,222,222,222,,,,,222,222,,,,223,223,223', +'222,223,222,222,222,223,223,222,222,,223,,223,223,223,223,223,223,223', +',,,,,223,223,223,223,223,223,223,,,223,,,,,,,223,,,223,223,223,223,223', +'223,223,223,,223,223,223,,223,223,223,223,223,,,,,,,,,,,,,,,,,,,,223', +',,223,,,223,223,,,223,,,,,,223,,,,,,,,,223,,,,,223,223,223,223,,223', +'223,223,223,,,,,223,223,,,,224,224,224,223,224,223,223,223,224,224,223', +'223,,224,,224,224,224,224,224,224,224,,,,,,224,224,224,224,224,224,224', +',,224,,,,,,,224,,,224,224,224,224,224,224,224,224,224,224,224,224,,224', +'224,224,224,224,,,,,,,,,,,,,,,,,,,,224,,,224,,,224,224,,,224,,224,,224', +',224,,,224,,,,,,224,,,,,224,224,224,224,,224,224,224,224,,,,,224,224', +',,,640,640,640,224,640,224,224,224,640,640,224,224,,640,,640,640,640', +'640,640,640,640,,,,,,640,640,640,640,640,640,640,,,640,,,,,,,640,,,640', +'640,640,640,640,640,640,640,640,640,640,640,,640,640,640,640,640,,,', +',,,,,,,,,,,,,,,,640,,,640,,,640,640,,,640,,640,,640,,640,,,640,,,,,', +'640,,,,,640,640,640,640,,640,640,640,640,,,,,640,640,,,,630,630,630', +'640,630,640,640,640,630,630,640,640,,630,,630,630,630,630,630,630,630', +',,,,,630,630,630,630,630,630,630,,,630,,,,,,,630,,,630,630,630,630,630', +'630,630,630,630,630,630,630,,630,630,630,630,630,,,,,,,,,,,,,,,,,,,', +'630,,,630,,,630,630,,,630,,630,,630,,630,,,630,,,,,,630,,,,,630,630', +'630,630,,630,630,630,630,,,,,630,630,,,,629,629,629,630,629,630,630', +'630,629,629,630,630,,629,,629,629,629,629,629,629,629,,,,,,629,629,629', +'629,629,629,629,,,629,,,,,,,629,,,629,629,629,629,629,629,629,629,,629', +'629,629,,629,629,629,629,629,,,,,,,,,,,,,,,,,,,,629,,,629,,,629,629', +',,629,,629,,,,629,,,,,,,,,629,,,,,629,629,629,629,,629,629,629,629,', +',,,629,629,,,,76,76,76,629,76,629,629,629,76,76,629,629,,76,,76,76,76', +'76,76,76,76,,,,,,76,76,76,76,76,76,76,,,76,,,,,,,76,,,76,76,76,76,76', +'76,76,76,,76,76,76,,76,76,,,76,,,,,,,,,,,,,,,,,,,,76,,,76,,,76,76,,', +'76,,76,,,,,,,,,,,,,,,,,,76,76,76,76,,76,76,76,76,,,,,76,76,,,,1018,1018', +'1018,76,1018,76,76,76,1018,1018,,,,1018,,1018,1018,1018,1018,1018,1018', +'1018,,,,,,1018,1018,1018,1018,1018,1018,1018,,,1018,,,,,,,1018,,,1018', +'1018,1018,1018,1018,1018,1018,1018,,1018,1018,1018,,1018,1018,,,1018', +',,,,,,,,,,,,,,,,,,,1018,,,1018,,,1018,1018,,,1018,,,,,,,,,,,,,,,,,,', +',1018,1018,1018,1018,,1018,1018,1018,1018,,,,,1018,1018,,,,39,39,39', +'1018,39,1018,1018,1018,39,39,,,,39,,39,39,39,39,39,39,39,,,,,,39,39', +'39,39,39,39,39,,,39,,,,,,,39,,,39,39,39,39,39,39,39,39,,39,39,39,,39', +'39,,,39,,,,,,,,,,,,,,,,,,,,39,,,39,,,39,39,,,39,,39,,,,,,,,,,,,,,,,', +',39,39,39,39,,39,39,39,39,,,,,39,39,,,,77,77,77,39,77,39,39,39,77,77', +',,,77,,77,77,77,77,77,77,77,,,,,,77,77,77,77,77,77,77,,,77,,,,,,,77', +',,77,77,77,77,77,77,77,77,,77,77,77,,77,77,,,77,,,,,,,,,,,,,,,,,77,', +',77,,,77,,,77,77,,,77,,,,,,,,,,,,,,,,,,,,77,77,77,77,,77,77,77,77,,', +',,77,77,,,,1144,1144,1144,77,1144,77,77,77,1144,1144,,,,1144,,1144,1144', +'1144,1144,1144,1144,1144,,,,,,1144,1144,1144,1144,1144,1144,1144,,,1144', +',,,,,,1144,,,1144,1144,1144,1144,1144,1144,1144,1144,,1144,1144,1144', +',1144,1144,,,1144,,,,,,,,,,,,,,,,,,,,1144,,,1144,,,1144,1144,,,1144', +',,,,,,,,,,,,,,,,,,,1144,1144,1144,1144,,1144,1144,1144,1144,,,,,1144', +'1144,,,,78,78,78,1144,78,1144,1144,1144,78,78,,,,78,,78,78,78,78,78', +'78,78,,,,,,78,78,78,78,78,78,78,,,78,,,,,,,78,,,78,78,78,78,78,78,78', +'78,,78,78,78,,78,78,,,78,,,,,,,,,,,,,,,,,,,,78,,,78,,,78,78,,,78,,,', +',,,,,,,,,,,,,,,,78,78,78,78,,78,78,78,78,,,,,78,78,,,,805,805,805,78', +'805,78,78,78,805,805,,,,805,,805,805,805,805,805,805,805,,,,,,805,805', +'805,805,805,805,805,,,805,,,,,,,805,,,805,805,805,805,805,805,805,805', +',805,805,805,,805,805,,,805,,,,,,,,,,,,,,,,,,,,805,,,805,,,805,805,', +',805,,,,,,,,,,,,,,,,,,,,805,805,805,805,,805,805,805,805,,,,,805,805', +',,,40,40,40,805,40,805,805,805,40,40,,,,40,,40,40,40,40,40,40,40,,,', +',,40,40,40,40,40,40,40,,,40,,,,,,,40,,,40,40,40,40,40,40,40,40,,40,40', +'40,,40,40,,,40,,,,,,,,,,,,,,,,,,,,40,,,40,,,40,40,,,40,,,1212,,1212', +'1212,1212,1212,1212,,,,,,,,,1212,,40,40,40,40,,40,40,40,40,,,,,40,40', +',,,40,,1212,40,,40,40,40,341,341,341,,341,1212,1212,,341,341,1212,,', +'341,,341,341,341,341,341,341,341,,,,,,341,341,341,341,341,341,341,,', +'341,,,,,,,341,,,341,341,341,341,341,341,341,341,,341,341,341,,341,341', +',,341,,,,,,,,,,,,,,,,,,,,341,,,341,,,341,341,,,341,,,1210,,1210,1210', +'1210,1210,1210,,,,,,,,,1210,,341,341,341,341,,341,341,341,341,,,,,341', +'341,,,,341,,1210,341,,341,341,341,360,360,360,,360,1210,1210,,360,360', +'1210,,,360,,360,360,360,360,360,360,360,,,,,,360,360,360,360,360,360', +'360,,,360,,,,,,,360,,,360,360,360,360,360,360,360,360,,360,360,360,', +'360,360,,,360,,,,,,,,,,,,,,,,,,,,360,,,360,,,360,360,,,360,,,,,,,,,', +',,,,,,,,,,360,360,360,360,,360,360,360,360,,,,,360,360,,,,816,816,816', +'360,816,360,360,360,816,816,,,,816,,816,816,816,816,816,816,816,,,,', +',816,816,816,816,816,816,816,,,816,,,,,,,816,,,816,816,816,816,816,816', +'816,816,,816,816,816,,816,816,,,816,,,,,,,,,,,,,,,,,,,,816,,,816,,,816', +'816,,,816,,,,,,,,,,,,,,,,,,,,816,816,816,816,,816,816,816,816,,,,,816', +'816,,,,1082,1082,1082,816,1082,816,816,816,1082,1082,,,,1082,,1082,1082', +'1082,1082,1082,1082,1082,,,,,,1082,1082,1082,1082,1082,1082,1082,,,1082', +',,,,,,1082,,,1082,1082,1082,1082,1082,1082,1082,1082,,1082,1082,1082', +',1082,1082,,,1082,,,,,,,,,,,,,,,,,,,,1082,,,1082,,,1082,1082,,,1082', +',,,,,,,,,,,,,,,,,,,1082,1082,1082,1082,,1082,1082,1082,1082,,,,,1082', +'1082,,,,599,599,599,1082,599,1082,1082,1082,599,599,,,,599,,599,599', +'599,599,599,599,599,,,,,,599,599,599,599,599,599,599,,,599,,,,,,,599', +',,599,599,599,599,599,599,599,599,,599,599,599,,599,599,,,599,,,,,,', +',,,,,,,,,,,,,599,,,599,,,599,599,,,599,,,,,,,,,,,,,,,,,,,,599,599,599', +'599,,599,599,599,599,,,,,599,599,,,,590,590,590,599,590,599,599,599', +'590,590,,,,590,,590,590,590,590,590,590,590,,,,,,590,590,590,590,590', +'590,590,,,590,,,,,,,590,,,590,590,590,590,590,590,590,590,,590,590,590', +',590,590,,,590,,,,,,,,,,,,,,,,,,,,590,,,590,,,590,590,,,590,,,,,,,,', +',,,,,,,,,,,590,590,590,590,,590,590,590,590,,,,,590,590,,,,,,,590,,590', +'590,590,427,427,427,427,427,427,427,427,427,427,427,427,427,427,427', +'427,427,427,427,427,427,427,427,427,,,,427,427,427,427,427,427,427,427', +'427,427,,,,,,427,427,427,427,427,427,427,427,427,,,427,,,,,,,,427,427', +',427,427,427,427,427,427,427,,,427,427,,,,427,427,427,427,,,,,,,,,,', +',,,427,427,,427,427,427,427,427,427,427,427,427,427,427,427,,,427,427', +',,,,,,,,,,,,,427,669,669,669,669,669,669,669,669,669,669,669,669,669', +'669,669,669,669,669,669,669,669,669,669,669,,,,669,669,669,669,669,669', +'669,669,669,669,,,,,,669,669,669,669,669,669,669,669,669,,,669,,,,,', +',,669,669,,669,669,669,669,669,669,669,,,669,669,,,,669,669,669,669', +',,,,,,,,,,,,,669,669,,669,669,669,669,669,669,669,669,669,669,669,669', +',,669,669,,,,,,,,,,,,,,669,10,10,10,10,10,10,10,10,10,10,10,10,10,10', +'10,10,10,10,10,10,10,10,10,10,,,,10,10,10,10,10,10,10,10,10,10,,,,,', +'10,10,10,10,10,10,10,10,10,10,,10,,,,,,,,10,10,,10,10,10,10,10,10,10', +',,10,10,,,,10,10,10,10,,,,,,,,,,,,,,10,10,,10,10,10,10,10,10,10,10,10', +'10,10,10,,,10,10,,,,,,,,,,,,,,10,11,11,11,11,11,11,11,11,11,11,11,11', +'11,11,11,11,11,11,11,11,11,11,11,11,,,,11,11,11,11,11,11,11,11,11,11', +',,,,,11,11,11,11,11,11,11,11,11,,,11,,,,,,,,11,11,,11,11,11,11,11,11', +'11,,,11,11,,,,11,11,11,11,,,,,,,,,,,,,,11,11,,11,11,11,11,11,11,11,11', +'11,11,11,11,,,11,11,944,944,944,944,,,,,,,,,,11,,,944,944,944,944,,', +'1138,944,1138,1138,1138,1138,1138,944,944,,,944,,,,1138,,,,,,,,,,,,', +',,,944,,,944,,,1138,944,,,944,,,,,1138,1138,1138,1138,,,,1138,,,,944', +',,,944,944,944,944,,944,944,944,944,,,,,944,944,990,990,990,990,,,944', +',944,944,944,,,944,944,,990,990,990,990,,,,990,990,,,,,990,990,,,990', +'990,,,,,,,,,,,,,,,,,,,990,,,990,,,,990,,,990,,990,,,,,,,990,,,,,,,990', +',,,990,990,990,990,,990,990,990,990,,,,,990,990,1204,1204,1204,1204', +',,990,,990,990,990,,,990,990,,1204,1204,1204,1204,,,1135,1204,1135,1135', +'1135,1135,1135,1204,1204,,,1204,,,,1135,,,,,,,,,,,,,,,,1204,,,1204,', +',1135,1204,,,1204,,,,,1135,1135,1135,1135,,,,1135,,,,1204,,,,1204,1204', +'1204,1204,,1204,1204,1204,1204,,,,,1204,1204,,,,,,,1204,,1204,1204,1204', +',,1204,1204,782,782,782,782,782,782,782,782,782,782,782,782,782,782', +'782,782,782,782,782,782,782,782,782,782,,,,782,782,782,782,782,782,782', +'782,782,782,,,,,,782,782,782,782,782,782,782,782,782,,,782,,,,,,,,782', +'782,,782,782,782,782,782,782,782,,,782,782,,,,782,782,782,782,,,,,,', +',,,,,,,782,782,,782,782,782,782,782,782,782,782,782,782,782,782,,,782', +'945,945,945,945,,,,,,1166,,1166,1166,1166,1166,1166,945,945,945,945', +',,,945,1166,,,,,945,945,,,945,,,,,,,,,,,,,1166,,,,,,,945,,,945,1166', +'1166,,945,,1166,945,,,,,,,,,,,,,,,,945,,,,945,945,945,945,,945,945,945', +'945,,,,,945,945,755,755,755,755,1166,,945,,945,945,945,,,945,945,,755', +'755,755,755,,,1208,755,1208,1208,1208,1208,1208,755,755,,,755,,,,1208', +',,,,,,,,,,,,,,,755,,,755,,,1208,755,,,755,,,,,,,1208,1208,,,,1208,,', +',755,,,,755,755,755,755,,755,755,755,755,,,,,755,755,,,,,,,755,,755', +'755,755,,,755,755,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26', +'26,26,26,26,26,26,26,,,,26,26,26,26,26,26,26,26,26,26,,,,,,26,26,26', +'26,26,26,26,26,26,26,26,26,,26,,,,,,26,26,,26,26,26,26,26,26,26,,,26', +'26,,,,26,26,26,26,,,,,,26,,,,,,,,26,26,,26,26,26,26,26,26,26,26,26,26', +'26,26,,,26,747,747,747,747,,,,,,,,,,,,,747,747,747,747,,,,747,,,,,,747', +'747,,,747,,,,,,,,,,,,,,,,,,,,747,,,747,,,,747,,,747,,747,,,,,,,709,', +'709,709,709,709,709,747,,,,747,747,747,747,709,747,747,747,747,,,,,747', +'747,747,938,938,938,938,,747,,747,747,747,709,,747,747,,,938,938,938', +'938,,709,709,938,,,709,,,938,938,,,938,,,,,,,,,,,,,,,,,,,,938,,,938', +',,,938,,,938,,938,709,,,,,,,,,,,,,938,,,,938,938,938,938,,938,938,938', +'938,,,,,938,938,932,932,932,932,,,938,,938,938,938,,,938,938,,932,932', +'932,932,,,,932,932,,,,,932,932,,,932,932,,,,,,,,,,,,,,,,,,,932,,,932', +',,,932,,,932,,932,,,,,,,932,,,,,,,932,,,,932,932,932,932,,932,932,932', +'932,,,,,932,932,931,931,931,931,,,932,,932,932,932,,,932,932,,931,931', +'931,931,,,,931,931,,,,,931,931,,,931,931,,,,,,,,,,,,,,,,,,,931,,,931', +',,,931,,,931,,931,,,,,,,931,,,,,,,931,,,,931,931,931,931,,931,931,931', +'931,,,,,931,931,1117,1117,1117,1117,,,931,,931,931,931,,,931,931,,1117', +'1117,1117,1117,,,1206,1117,1206,1206,1206,1206,1206,1117,1117,,,1117', +',,,1206,,,,,,,,,,,,,,,,1117,,,1117,,,1206,1117,,,1117,,,,,1206,1206', +'1206,1206,,,,1206,,,,1117,,,,1117,1117,1117,1117,,1117,1117,1117,1117', +',,,,1117,1117,1125,1125,1125,1125,,,1117,,1117,1117,1117,,,1117,1117', +',1125,1125,1125,1125,,,,1125,,,,,,1125,1125,,,1125,,,,,,,,,,,,,,,,,', +',,1125,,,1125,,,,1125,,,1125,,,,,,,,,,,,,,,,1125,,,,1125,1125,1125,1125', +',1125,1125,1125,1125,,,,,1125,1125,1129,1129,1129,1129,,,1125,,1125', +'1125,1125,,,1125,1125,,1129,1129,1129,1129,,,,1129,,,,,,1129,1129,,', +'1129,,,,,,,,,,,,,,,,,,,,1129,,,1129,,,,1129,,,1129,,1129,,,,,,,,,,,', +',,1129,,,,1129,1129,1129,1129,,1129,1129,1129,1129,,,,,1129,1129,928', +'928,928,928,,,1129,,1129,1129,1129,,,1129,1129,,928,928,928,928,,,,928', +',,,,,928,928,,,928,,,,,,,,,,,,,,,,,,,,928,,,928,,,,928,,,928,,,,,,,', +',,,,,,,,928,,,,928,928,928,928,,928,928,928,928,,,,,928,928,529,529', +'529,529,,,928,,928,928,928,,,928,928,,529,529,529,529,,,,529,529,,,', +',529,529,,,529,529,,,,,,,,,,,,,,,,,,,529,,,529,,,,529,,,529,,529,,,', +',,,529,,,,,,,529,,,,529,529,529,529,,529,529,529,529,,,,,529,529,530', +'530,530,530,,,529,,529,529,529,,,529,529,,530,530,530,530,,,,530,530', +',,,,530,530,,,530,530,,,,,,,,,,,,,,,,,,,530,,,530,,,,530,,,530,,530', +',,,,,,530,,,,,,,530,,,,530,530,530,530,,530,530,530,530,,,,,530,530', +'926,926,926,926,,,530,,530,530,530,,,530,530,,926,926,926,926,,,,926', +',,,,,926,926,,,926,,,,,,,,765,765,765,765,,,,,,,,,926,,,926,765,765', +'765,926,,,926,,926,,,,,765,765,,,765,,,,,926,,,,926,926,926,926,,926', +'926,926,926,,,,,926,926,,,,,,,926,,926,926,926,,,926,926,,,,,,,,,,,', +'765,765,765,765,,765,765,765,765,,,,,765,765,951,951,951,951,,,765,', +'765,765,765,,,,,,951,951,951,,,,,,,,,,,951,951,,,951,952,952,952,952', +',,,,,,,,,,,,952,952,952,,,,,,,,,,,952,952,,,952,,,,,,,,,,,,,,,,951,951', +'951,951,,951,951,951,951,,,,,951,951,,,,,,,951,,951,951,951,,,,,,,,', +'952,952,952,952,,952,952,952,952,,,,,952,952,764,764,764,764,,,952,', +'952,952,952,,,,,,764,764,764,1021,,1021,1021,1021,1021,1021,,,,764,764', +',,764,1021,,,,,,,,,,,1023,,1023,1023,1023,1023,1023,,,,,1021,,,,1023', +',,,,1021,1021,1021,1021,,,,1021,,,,,,,,,,1023,764,764,764,764,,764,764', +'764,764,,1023,1023,,764,764,1023,,,,,,764,,764,764,764,,,1025,1021,1025', +'1025,1025,1025,1025,1027,,1027,1027,1027,1027,1027,,1025,,,,,,,1027', +',,,,1023,,,,,,,,,,1025,,,,,,,1027,,,,1025,1025,,,,1025,,1027,1027,632', +'632,,1027,632,,,,,,,,632,632,,632,632,632,632,632,632,632,,,632,632', +',,,632,632,632,632,,,,1025,,632,,,,,1027,,,632,632,,632,632,632,632', +'632,632,632,632,632,632,632,632,302,302,632,,302,,,,,,,,302,302,,302', +'302,302,302,302,302,302,,,302,302,,,,302,302,302,302,,,,,,,,,,,,,,302', +'302,,302,302,302,302,302,302,302,302,302,302,302,302,638,638,302,,638', +',,,,,,,638,638,,638,638,638,638,638,638,638,,,638,638,,,,638,638,638', +'638,,,,,,638,,,,,,,,638,638,,638,638,638,638,638,638,638,638,638,638', +'638,638,639,639,638,,639,,,,,,,,639,639,,639,639,639,639,639,639,639', +',,639,639,,,,639,639,639,639,,,,,,639,,,,,,,,639,639,,639,639,639,639', +'639,639,639,639,639,639,639,639,594,594,639,,594,,,,,,,,594,594,,594', +'594,594,594,594,594,594,,,594,594,,,,594,594,594,594,,,,,,594,,,,,,', +',594,594,,594,594,594,594,594,594,594,594,594,594,594,594,604,604,594', +',604,,,,,,,,604,604,,604,604,604,604,604,604,604,,,604,604,,,,604,604', +'604,604,,,,,,604,,,,,,,,604,604,,604,604,604,604,604,604,604,604,604', +'604,604,604,593,593,604,,593,,,,,,,,593,593,,593,593,593,593,593,593', +'593,,,593,593,,,,593,593,593,593,,,,,,593,,,,,,,,593,593,,593,593,593', +'593,593,593,593,593,593,593,593,593,631,631,593,,631,,,,,,,,631,631', +',631,631,631,631,631,631,631,,,631,631,,,,631,631,631,631,,,,,,631,', +',,,,,,631,631,,631,631,631,631,631,631,631,631,631,631,631,631,225,225', +'631,,225,,,,,,,,225,225,,225,225,225,225,225,225,225,,,225,225,,,,225', +'225,225,225,,,,,,225,,,,,,,,225,225,,225,225,225,225,225,225,225,225', +'225,225,225,225,603,603,225,,603,,,,,,,,603,603,,603,603,603,603,603', +'603,603,,,603,603,,,,603,603,603,603,,,,,,603,,,,,,,,603,603,,603,603', +'603,603,603,603,603,603,603,603,603,603,1163,1163,603,,1163,,,,,,,,1163', +'1163,,1163,1163,1163,1163,1163,1163,1163,,,1163,1163,,,,1163,1163,1163', +'1163,,,,,,1163,,,,,,,,1163,1163,,1163,1163,1163,1163,1163,1163,1163', +'1163,1163,1163,1163,1163,1164,1164,1163,,1164,,,,,,,,1164,1164,,1164', +'1164,1164,1164,1164,1164,1164,,,1164,1164,,,,1164,1164,1164,1164,,,', +',,1164,,,,,,,,1164,1164,,1164,1164,1164,1164,1164,1164,1164,1164,1164', +'1164,1164,1164,1187,1187,1164,,1187,,,,,,,,1187,1187,,1187,1187,1187', +'1187,1187,1187,1187,,,1187,1187,,,,1187,1187,1187,1187,,,,,,1187,,,', +',,,,1187,1187,,1187,1187,1187,1187,1187,1187,1187,1187,1187,1187,1187', +'1187,226,226,1187,,226,,,,,,,,226,226,,226,226,226,226,226,226,226,', +',226,226,,,,226,226,226,226,,,,,,226,,,,,,,,226,226,,226,226,226,226', +'226,226,226,226,226,226,226,226,677,677,226,,677,,,,,,,,677,677,,677', +'677,677,677,677,677,677,,,677,677,,,,677,677,677,677,,,,,,677,,,,,,', +',677,677,,677,677,677,677,677,677,677,677,677,677,677,677,676,676,677', +',676,,,,,,,,676,676,,676,676,676,676,676,676,676,,,676,676,,,,676,676', +'676,676,,,,,,676,,,,,,,,676,676,,676,676,676,676,676,676,676,676,676', +'676,676,676,520,520,676,,520,,,,,,,,520,520,,520,520,520,520,520,520', +'520,,,520,520,,,,520,520,520,520,,,,,,520,,,,,,,,520,520,,520,520,520', +'520,520,520,520,520,520,520,520,520,521,521,520,,521,,,,,,,,521,521', +',521,521,521,521,521,521,521,,,521,521,,,,521,521,521,521,,,,,,521,', +',,,,,,521,521,,521,521,521,521,521,521,521,521,521,521,521,521,,,521' ] + racc_action_check = arr = ::Array.new(28813, nil) + idx = 0 + clist.each do |str| + str.split(',', -1).each do |i| + arr[idx] = i.to_i unless i.empty? + idx += 1 + end + end + +racc_action_pointer = [ + nil, 1560, 1004, 159, nil, 425, nil, 16385, 1357, 81, + 25302, 25430, 116, nil, 120, 137, 718, 223, 1137, 347, + 332, 273, nil, -70, 15325, 1436, 26177, 289, nil, 368, + nil, 0, 5701, 6107, 6241, 11526, 11788, nil, 3164, 23450, + 24105, nil, 244, 696, 634, 371, 13098, 13360, 123, 13753, + 14015, 798, 15849, 310, 993, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 16526, nil, 17592, 17723, 17854, 5, + nil, 18116, 18247, nil, nil, 18509, 23188, 23581, 23843, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 294, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 500, nil, + nil, 0, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 19603, nil, nil, nil, nil, 19746, + 19877, 20008, 20139, 20282, nil, 4172, nil, 500, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 318, nil, 3020, 21211, + 22140, 22271, 22402, 22533, 22664, 28149, 28454, nil, nil, 334, + 4460, 342, nil, 636, 275, 344, 2876, 7822, 7420, 6765, + nil, nil, 1164, 15, 111, 456, 116, 372, 452, nil, + 21616, 145, 222, 2732, 457, nil, nil, 17187, 17056, 16794, + 16242, 15456, 15194, 15063, 14932, 14801, 14146, 13884, 13622, 13491, + 12836, 12705, 12574, 11657, 5560, 5429, 5298, 5167, 10728, nil, + nil, nil, nil, 9811, nil, nil, 515, 520, 552, 619, + 654, 392, -28, 159, 191, 250, nil, nil, nil, 12312, + nil, nil, 27722, nil, nil, 484, 8632, 9025, nil, nil, + nil, nil, nil, nil, nil, 9156, nil, 2444, nil, 468, + 481, nil, 9287, 533, 9418, nil, nil, 9549, 9680, nil, + nil, 480, nil, 10871, 1436, 546, 515, 1724, 539, 594, + 564, 24244, 3596, 577, 721, 831, 644, 898, nil, 612, + 613, 281, 675, 679, nil, nil, nil, 682, 198, 645, + 24383, nil, 642, 903, 3740, 3884, 717, nil, 729, 12967, + nil, 720, 2300, 1565, 681, nil, 597, 399, 719, 717, + 553, 753, nil, 552, 69, 39, 14670, 5036, 4892, 338, + 832, 718, 67, 98, 987, 806, 38, 847, nil, nil, + 1283, 995, 540, nil, 997, nil, 767, 16925, nil, 7525, + nil, 438, 322, 425, 378, 525, -31, -27, 492, nil, + nil, nil, nil, nil, nil, nil, 764, 25046, nil, nil, + nil, nil, 765, nil, 838, 752, 17985, 754, nil, nil, + 748, nil, 1131, 191, 854, nil, nil, 1580, nil, nil, + nil, nil, nil, 1724, 773, nil, 771, 786, 540, 526, + 18924, nil, nil, nil, nil, 859, 639, 832, nil, nil, + 19056, 19192, 19329, 932, 931, nil, nil, 1, 817, 815, + 817, nil, nil, 825, 830, 838, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 829, 1134, nil, nil, 20556, + nil, nil, nil, nil, nil, nil, nil, 925, nil, nil, + 926, 508, 21080, 969, nil, nil, nil, 159, nil, 894, + 28637, 28698, 21485, 154, 21747, 21878, 22009, 840, 853, 27045, + 27143, 4172, 4460, 341, 1043, 933, 937, 946, 947, 5650, + 5835, 5560, 5298, 4748, 4892, 5036, 3596, 4316, 3571, 3480, + 4604, 5167, 3164, 5429, nil, 183, nil, 7561, nil, nil, + nil, nil, 7691, 886, 885, 898, nil, nil, nil, 900, + nil, nil, 7953, nil, 8084, nil, 8215, nil, 309, nil, + nil, nil, 8358, 1133, nil, 902, 908, nil, nil, 911, + 24907, 917, 8501, 28027, 27905, 1141, 984, nil, nil, 24776, + 942, nil, 7158, 28210, 27966, 7027, 4028, 6896, nil, 1067, + 948, 992, nil, 6634, nil, nil, 6503, nil, nil, nil, + 3884, 1071, nil, 4748, -20, 1076, 1078, 264, 1082, 23057, + 22926, 28088, 27661, 68, nil, nil, 1275, nil, 27783, 27844, + 22795, nil, nil, 268, 2156, nil, 856, nil, nil, nil, + nil, 1058, nil, nil, nil, 974, nil, nil, 420, nil, + 423, nil, nil, 960, nil, 964, nil, nil, nil, 25174, + nil, 21354, 967, 20949, 20818, 20687, 28576, 28515, 20425, 19460, + 495, 1008, 18783, 18652, 18378, 6372, 1007, nil, nil, 17449, + 17318, 1010, nil, 1065, 2012, 1096, 16663, nil, nil, nil, + nil, 1262, nil, nil, 765, 746, nil, 7555, nil, 26313, + nil, 973, 15980, nil, 3438, nil, 990, 995, 1199, 1000, + nil, nil, nil, nil, 1088, 1868, nil, nil, nil, 197, + 221, 139, 388, 1004, 14408, 14277, nil, 105, nil, nil, + nil, nil, 1027, nil, nil, nil, 472, 26260, -66, nil, + 1005, 1104, 1023, nil, nil, 26034, nil, nil, 292, nil, + nil, 698, nil, nil, 27512, 27282, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 835, 480, nil, + nil, 1025, 25853, nil, 1151, nil, 1134, -8, nil, nil, + 11919, nil, 1071, 1081, 1195, nil, 1084, nil, 1132, 11133, + nil, nil, 11002, nil, -101, 23974, 1087, nil, 1096, 163, + 134, 1138, 165, 1281, 1140, 1102, 24514, nil, 1171, 3308, + 13229, nil, nil, nil, 511, 824, nil, 1224, nil, nil, + nil, nil, nil, 1233, 1235, nil, nil, 53, 1116, 24, + 37, 61, 29, 1292, 1139, 611, nil, 1117, 3308, 12181, + nil, 1246, 112, 1129, nil, nil, nil, nil, nil, 2444, + nil, nil, nil, nil, nil, nil, nil, nil, 1127, 14539, + 1131, 254, 272, 749, 278, nil, 2300, 7289, nil, 1129, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 8763, 8894, 1259, nil, 4316, 1139, 1187, nil, nil, 1142, + nil, 1227, nil, nil, 1147, 1149, nil, 1152, 1156, nil, + 1157, nil, nil, nil, 1169, 3467, 3506, nil, nil, 9942, + 10073, 10204, 10335, 10466, 10597, -82, 27241, 1249, 26947, 100, + -84, 26555, 26457, 398, 140, 1171, 1174, nil, 26359, nil, + 1172, 913, nil, 1203, 25514, 25936, nil, 927, 1230, 198, + nil, 27380, 27414, nil, nil, nil, nil, 5835, nil, nil, + nil, nil, nil, 5966, nil, nil, 1210, nil, nil, 1207, + 1204, nil, nil, 568, 3452, nil, nil, nil, nil, 1215, + 167, nil, -14, nil, 1354, nil, 11264, 1355, nil, nil, + 25612, 11395, 4028, 11, 1360, nil, 1362, 307, 3740, nil, + nil, nil, nil, 1238, 1285, 1251, 1246, 249, nil, nil, + 12050, 2588, 2732, nil, 2588, nil, nil, 6, 23319, nil, + nil, 27512, nil, 27538, nil, 27604, nil, 27611, nil, nil, + nil, nil, 1248, 1249, 2876, 2156, 12443, nil, 1252, nil, + nil, nil, nil, 1256, 1258, 1260, 1261, 1262, 1264, nil, + nil, nil, 1316, 1271, 1272, nil, 1276, nil, nil, -72, + 1283, nil, nil, nil, nil, nil, nil, 1328, 3020, 2012, + nil, nil, 1286, 1289, nil, 1291, 1293, 1294, nil, 1320, + 1303, 1289, 24645, nil, nil, nil, nil, nil, 42, nil, + 38, 720, nil, 43, nil, nil, nil, 1434, 1868, 1580, + 753, nil, nil, nil, 1436, -11, 19, 904, 1393, -9, + nil, 1317, 1319, 1328, 1329, 3477, 863, 26653, nil, nil, + nil, nil, nil, nil, nil, 26751, nil, 381, nil, 26849, + nil, nil, 1345, nil, nil, 25713, nil, nil, 25517, nil, + 7580, nil, nil, 1354, 23712, 918, 1409, 4604, nil, 15587, + 15718, nil, nil, nil, nil, 1359, 1464, 544, nil, nil, + nil, 1485, 16111, 28271, 28332, 26, 25926, nil, nil, nil, + nil, 1363, 1380, 1383, nil, nil, 1384, nil, nil, 1387, + 1389, 1392, 1393, nil, 1396, nil, 1020, 28393, nil, 780, + 1148, nil, nil, nil, nil, nil, 1278, nil, 1400, 68, + -7, -1, 8, 1399, 25710, nil, 26656, nil, 26037, nil, + 24291, nil, 24152, nil, nil, 1446, 1451, nil, 31, nil, + -10, nil, 1415, 1416, 1417, 1422, nil, nil, nil, 18987, + nil, nil, nil, nil, -112, nil ] + +racc_action_default = [ + -1, -741, -4, -741, -2, -726, -5, -741, -8, -741, + -741, -741, -741, -31, -741, -741, -36, -741, -741, -637, + -637, -311, -52, -728, -741, -61, -741, -69, -70, -71, + -75, -287, -287, -287, -324, -352, -353, -87, -13, -91, + -99, -101, -741, -624, -625, -741, -741, -741, -741, -741, + -741, -239, -741, -728, -258, -302, -303, -304, -305, -306, + -307, -308, -309, -310, -716, -313, -317, -740, -705, -333, + -335, -741, -741, -63, -63, -726, -741, -741, -741, -354, + -355, -357, -358, -359, -360, -419, -561, -562, -563, -564, + -585, -567, -568, -587, -589, -572, -577, -581, -583, -599, + -600, -601, -585, -603, -605, -606, -607, -608, -714, -613, + -614, -715, -616, -617, -618, -619, -620, -621, -622, -623, + -628, -629, 1236, -3, -727, -736, -737, -738, -7, -741, + -741, -741, -741, -741, -9, -4, -19, -741, -130, -131, + -132, -133, -134, -135, -136, -140, -141, -142, -143, -144, + -145, -146, -147, -148, -149, -150, -151, -152, -153, -154, + -155, -156, -157, -158, -159, -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, -24, -137, -13, -741, + -741, -741, -741, -741, -277, -741, -741, -724, -725, -741, + -13, -636, -634, -660, -660, -741, -13, -741, -741, -728, + -729, -56, -741, -624, -625, -741, -311, -741, -741, -245, + -741, -637, -637, -13, -741, -57, -59, -222, -223, -741, + -741, -741, -741, -741, -741, -741, -741, -741, -741, -741, + -741, -741, -741, -741, -741, -741, -741, -741, -741, -259, + -260, -261, -262, -741, -65, -66, -741, -130, -131, -170, + -171, -172, -188, -193, -200, -203, -624, -625, -703, -741, + -428, -430, -741, -722, -723, -76, -277, -741, -332, -434, + -443, -445, -82, -440, -83, -728, -84, -265, -282, -292, + -292, -286, -290, -293, -741, -585, -707, -711, -741, -85, + -86, -726, -14, -741, -17, -741, -89, -13, -728, -741, + -92, -95, -13, -107, -108, -741, -741, -115, -324, -327, + -728, -741, -637, -637, -352, -353, -356, -441, -741, -97, + -741, -103, -321, -741, -224, -225, -604, -233, -234, -741, + -246, -251, -13, -315, -728, -266, -733, -733, -741, -741, + -733, -741, -334, -62, -741, -741, -741, -13, -13, -726, + -741, -727, -624, -625, -741, -741, -311, -741, -370, -371, + -125, -126, -741, -128, -741, -311, -632, -741, -348, -660, + -565, -741, -741, -741, -741, -741, -741, -741, -741, -6, + -739, -25, -26, -27, -28, -29, -741, -741, -21, -22, + -23, -138, -741, -32, -35, -298, -741, -741, -297, -33, + -741, -37, -741, -311, -49, -51, -211, -270, -293, -53, + -54, -38, -212, -270, -728, -278, -292, -292, -714, -715, + -287, -438, -716, -717, -718, -715, -714, -287, -437, -439, + -716, -718, -741, -553, -741, -383, -384, -686, -728, -702, + -702, -642, -643, -645, -645, -645, -659, -661, -662, -663, + -664, -665, -666, -667, -668, -669, -741, -671, -673, -675, + -680, -682, -683, -684, -691, -693, -694, -696, -697, -698, + -700, -741, -741, -741, -48, -219, -55, -728, -331, -741, + -741, -741, -277, -321, -741, -741, -741, -741, -741, -741, + -741, -220, -221, -226, -227, -228, -229, -230, -231, -235, + -236, -237, -238, -240, -241, -242, -243, -244, -247, -248, + -249, -250, -728, -263, -67, -728, -449, -287, -714, -715, + -73, -77, -661, -728, -292, -728, -288, -447, -449, -728, + -326, -283, -741, -284, -741, -289, -741, -294, -741, -710, + -713, -12, -727, -16, -18, -728, -88, -319, -104, -93, + -741, -728, -277, -741, -741, -114, -741, -636, -604, -741, + -100, -105, -741, -741, -741, -741, -264, -741, -328, -741, + -728, -741, -267, -735, -734, -269, -735, -322, -323, -706, + -13, -361, -362, -13, -741, -741, -741, -741, -741, -741, + -277, -741, -741, -321, -63, -125, -126, -127, -741, -741, + -277, -344, -630, -741, -13, -420, -660, -423, -566, -586, + -591, -741, -593, -569, -588, -741, -590, -571, -741, -574, + -741, -576, -579, -741, -580, -741, -602, -10, -20, -741, + -30, -741, -301, -741, -741, -277, -741, -741, -741, -741, + -442, -741, -279, -281, -741, -741, -78, -276, -435, -741, + -741, -80, -436, -44, -254, -740, -740, -350, -522, -685, + -635, -741, -640, -641, -741, -741, -652, -741, -655, -741, + -657, -741, -741, -372, -741, -374, -376, -379, -382, -728, + -674, -695, -699, -638, -46, -256, -351, -330, -730, -714, + -715, -714, -715, -728, -741, -741, -58, -463, -466, -467, + -468, -469, -471, -473, -476, -477, -532, -728, -489, -492, + -502, -506, -511, -513, -514, -517, -518, -585, -521, -523, + -524, -525, -530, -531, -741, -741, -535, -536, -537, -538, + -539, -540, -541, -542, -543, -544, -545, -741, -741, -551, + -60, -741, -741, -704, -741, -450, -72, -431, -447, -272, + -279, -274, -741, -409, -741, -325, -292, -291, -295, -741, + -708, -709, -741, -15, -90, -741, -96, -102, -728, -714, + -715, -275, -719, -113, -741, -98, -741, -218, -232, -252, + -741, -314, -316, -318, -733, -740, -363, -740, -64, -364, + -365, -338, -339, -741, -741, -455, -341, -741, -728, -714, + -715, -719, -320, -13, -125, -126, -129, -728, -13, -741, + -346, -741, -741, -728, -592, -595, -596, -597, -598, -13, + -570, -573, -575, -578, -582, -584, -139, -34, -299, -741, + -728, -714, -715, -715, -714, -50, -271, -741, -731, -292, + -40, -214, -41, -215, -79, -42, -217, -43, -216, -81, + -741, -741, -740, -368, -13, -554, -740, -555, -556, -702, + -681, -686, -701, -644, -645, -645, -672, -645, -645, -692, + -645, -669, -386, -687, -728, -741, -741, -381, -670, -741, + -741, -741, -741, -741, -741, -442, -464, -741, -741, -474, + -475, -741, -741, -741, -494, -728, -728, -488, -495, -499, + -741, -741, -491, -741, -741, -741, -505, -512, -516, -741, + -520, -528, -529, -533, -534, -546, -547, -741, -609, -610, + -611, -126, -549, -741, -68, -429, -409, -433, -432, -741, + -728, -444, -410, -728, -13, -446, -285, -296, -712, -94, + -442, -106, -728, -268, -741, -366, -741, -741, -340, -342, + -741, -741, -13, -442, -741, -442, -741, -741, -13, -349, + -421, -424, -426, -413, -741, -741, -300, -442, -39, -213, + -280, -45, -255, -11, -13, -560, -369, -741, -741, -558, + -639, -741, -648, -741, -650, -741, -653, -741, -656, -658, + -373, -375, -377, -380, -47, -257, -741, -465, -502, -470, + -472, -481, -485, -728, -728, -728, -728, -728, -728, -550, + -486, -487, -509, -496, -497, -500, -728, -585, -732, -728, + -503, -507, -510, -515, -519, -526, -527, -741, -253, -13, + -74, -273, -702, -702, -390, -392, -392, -392, -408, -741, + -728, -669, -677, -678, -689, -448, -329, -336, -741, -337, + -741, -460, -295, -740, -343, -345, -631, -741, -13, -13, + -741, -422, -594, -559, -13, -624, -625, -741, -741, -311, + -557, -645, -645, -645, -645, -741, -741, -741, -478, -479, + -480, -482, -483, -484, -501, -741, -490, -741, -493, -741, + -548, -451, -741, -388, -389, -393, -399, -401, -741, -404, + -741, -406, -411, -741, -741, -676, -741, -13, -456, -741, + -741, -452, -453, -454, -347, -741, -741, -728, -415, -417, + -418, -553, -277, -741, -741, -321, -741, -646, -649, -651, + -654, -378, -503, -498, -504, -508, -702, -679, -391, -392, + -392, -392, -392, -690, -392, -412, -688, -741, -321, -740, + -13, -461, -462, -425, -427, -414, -741, -552, -728, -714, + -715, -719, -320, -645, -741, -387, -741, -396, -741, -398, + -741, -402, -741, -405, -407, -320, -719, -367, -740, -416, + -442, -647, -392, -392, -392, -392, -457, -458, -459, -741, + -394, -397, -400, -403, -392, -395 ] + +clist = [ +'44,225,301,127,284,44,411,141,141,340,232,232,303,285,382,356,356,695', +'418,620,623,628,834,141,297,463,463,318,318,318,384,385,702,703,389', +'573,44,344,344,637,136,217,495,495,454,309,313,565,712,909,241,892,356', +'356,356,387,388,1033,375,474,713,144,144,451,44,513,984,706,708,710', +'320,320,320,127,393,297,297,514,1031,899,8,438,439,486,486,8,792,236', +'421,422,423,424,906,460,467,736,780,134,366,942,739,739,463,377,380', +'905,336,907,445,302,124,445,974,128,719,612,615,561,338,619,478,511', +'44,600,1038,445,563,1004,305,312,314,44,359,44,4,1183,1054,758,758,935', +'1076,936,123,800,373,529,784,383,383,406,408,383,1158,316,329,330,902', +'1160,794,902,953,954,18,1045,1048,658,660,18,597,597,557,1078,573,1056', +'286,1032,782,797,1157,797,644,998,645,987,242,800,1000,409,852,427,434', +'1098,1060,1099,242,242,242,787,18,345,345,609,8,1183,556,383,383,383', +'383,229,235,425,390,8,567,568,44,318,495,17,966,1151,1090,471,17,520', +'18,1226,44,990,419,242,242,1190,44,242,394,404,404,461,452,578,232,232', +'399,433,444,1079,1219,444,848,44,800,1160,515,17,1171,820,833,486,216', +'1039,1040,444,931,932,374,426,941,303,944,654,656,659,659,846,610,372', +'713,1031,1,1062,917,17,18,1069,1063,797,797,242,242,242,242,18,803,18', +'647,449,450,318,318,1013,1179,641,397,956,896,969,318,901,1017,410,412', +'413,516,517,414,356,1037,236,463,463,788,1043,1046,1044,1047,1174,593', +'127,601,44,914,415,416,44,356,417,854,344,44,17,733,320,859,624,603', +'1065,1066,849,17,320,17,806,1143,760,760,379,344,298,904,2,815,909,1172', +'309,554,319,319,319,44,313,1173,1077,669,555,900,631,18,242,442,242', +'242,442,242,44,44,127,460,467,18,1177,369,463,463,797,18,442,242,242', +'376,607,530,463,463,336,378,1126,598,828,336,583,808,18,906,962,1136', +'585,737,737,236,1111,591,584,141,676,566,1080,1074,,1217,463,463,589', +'569,17,582,17,463,463,17,527,528,,,,,17,,1152,838,,1020,17,17,495,,668', +',242,847,811,383,,,693,242,242,581,,17,811,992,851,687,242,463,463,144', +'713,713,692,,643,,,,,1022,1024,,1026,1028,18,1029,870,486,18,884,811', +',345,18,889,,724,339,811,,723,1176,976,,,495,318,495,862,471,862,345', +',906,,880,882,627,774,774,885,887,970,18,853,461,1180,,,1181,758,758', +'515,,452,460,467,242,18,18,758,17,,437,437,17,758,1091,686,897,17,601', +'739,445,983,691,,356,242,979,601,1049,687,445,445,1227,356,,445,445', +'800,44,,,,,318,,902,344,17,1074,471,,1074,976,1074,,344,758,906,,471', +',,17,17,1222,461,796,,,,,1228,,797,843,461,44,817,,44,829,318,,1133', +'1134,,,471,,,242,318,1144,471,934,,,564,319,850,44,,948,461,,,319,824', +',,1104,461,786,,,,,,,1074,,1074,,1074,141,1074,318,44,,,242,949,471', +',44,996,,713,713,,242,,1074,,432,898,,,461,,,,,1167,1168,1169,1170,866', +'444,881,883,,,1197,886,888,,,444,444,,,,444,444,1008,879,,144,339,,1147', +'1153,1148,,,,1205,,908,968,910,,,1053,,,,901,238,18,1061,,774,,,,867', +'345,,242,774,,,875,760,760,345,284,967,774,774,,445,,760,,964,,371,', +'760,,601,,,,141,18,356,1081,18,,,981,1221,,,242,,356,,,,,,,17,242,,', +'344,18,339,,,997,,339,,,,344,934,760,,,,934,934,,,,687,879,1097,692', +',495,18,,1059,442,242,,17,18,,17,44,,,442,442,44,,,442,442,,,,,625,626', +'44,,,,17,,,,,,,,,,,381,,,,,1082,,737,,,,1015,,,,1019,17,,,17,44,,1009', +'17,982,,1131,,,17,17,444,1073,,17,17,,,,,,,,1061,1067,,,,,,,1061,774', +'383,774,1175,1156,774,774,,,,,,774,,881,883,888,886,774,774,1081,1088', +',1081,,774,774,,,,,,,,680,,,,837,463,463,345,,,,,,,44,1127,,,345,,,', +'242,,1198,,,,,463,774,,44,,,,356,1096,44,1075,,,,,1175,18,,,,,18,242', +',,44,,,1081,1106,,,18,,,,435,448,,,,,437,,811,,383,,,1082,442,,1082', +',,1082,,1082,1112,,1113,,1114,,,,1009,18,,,,356,,17,,383,,,17,1073,44', +'596,1073,,1073,,,,,17,,,,297,,,,,,,,825,,1163,827,611,,17,,44,44,,,', +',44,,,,,,1191,1192,1082,17,1082,,1082,774,1082,242,,,356,,,774,,,575', +'774,577,,,579,580,1082,18,,,1073,,1073,,1073,297,1073,,44,242,,,34,', +',18,,34,318,,,18,,1073,471,1182,,1184,,,,,,,34,681,,18,,,461,1107,,', +'34,34,34,471,34,,,44,,1203,17,,,,,,,,,,,774,,,,,,,17,,,,34,,17,,,34', +'34,,,34,,,383,383,,,18,1223,17,1224,,1225,,,925,,,672,,1145,,,,,,,,', +'937,,1234,,,,,18,18,20,,,,18,20,,,,,781,34,,,,,34,34,34,34,34,,34,,', +',17,,,,,,,,,,20,353,353,,,,,720,1186,,,18,,242,242,994,980,,,17,17,', +',,,17,242,,20,,,1005,,,,,,,353,353,353,,,15,,,993,,15,,,,,,18,995,,', +',,,,,,,,1016,,17,34,34,34,34,34,34,34,,,1007,15,798,34,381,,801,,20', +'34,34,34,34,,,,,20,,20,,,,,,,34,,,15,,,,17,,,,,,398,,,,798,,,381,,,', +',,,,,,,,,448,1042,,,,,1050,1051,,1085,,,,34,,,,,681,,34,34,,,,,,1093', +'15,34,,,681,943,,,,15,,15,1137,1139,1141,20,868,20,,34,20,1103,,34,', +'798,381,20,34,,,,,20,20,,,,,895,,,,,,,,,,,20,,,,,913,,,34,,,,,,,681', +',,,,,,34,34,34,,,,,,,,,,,,,,,1121,1122,1123,,34,15,681,440,,,440,,,', +',681,1155,15,,,,1003,1161,15,440,,,1207,1209,1211,1213,,1214,,,,,,681', +',15,20,,,798,20,,,,353,20,,,977,,,978,,,,,,,,,1189,,,353,34,1230,1231', +'1232,1233,,,,,,,20,,1235,,,,,,,,,,,,,20,20,,681,,,,,681,681,,,,1218', +'34,,,,,,,,,,34,15,,,1006,15,,,,,15,,,,,,,,,,,,1003,,,,,,,,,,,1220,,', +',,,,15,,,,,,,,,,,,,,,15,15,,,,34,,,,,,,,,,34,,,,,,,,,,,,,,,,,,,,,,,', +',681,681,681,34,,,34,,,,943,,,34,,,,,,,,,518,34,,,,34,,,,1092,,,1003', +',,,,,,,,,,,,,,,381,,,,34,,,34,34,,,34,,,,,,34,34,21,,,34,34,21,,20,', +',,,,,,353,,,,,,,,,353,,,,,570,,,,,,,21,347,347,,,,1195,,,20,,,20,,,', +'586,,,,,,,,,,,,21,,,,,20,,,,,396,405,405,,,,,,,681,,,15,,,,,,,,,,20', +',,20,,,,20,,,,,,20,20,,,,20,20,,,,,,,21,,15,,,15,,,,21,,21,34,,,,773', +'773,,,,,,,,,15,,,,,,,,,34,,,,,34,34,,,,,,,,,,34,,15,,,440,,,,15,,,,', +',440,440,,34,700,440,440,,,,,,,,,,,,,,34,,,,,,,,21,,443,,,443,,,,,,', +'21,,353,727,766,766,21,443,,,,,,353,,,,,,,,,,21,,,,,,,,,,,,,,,,,20,783', +',34,,20,,,,789,,791,,,,795,20,,,,34,,,,,,,,,,,804,34,,20,,,807,34,,', +',,,34,,,,,,,20,,,,,822,,,,34,,,21,,,,21,,,,347,21,,,,,,,15,,,,,15,,', +',773,,347,,,,,15,773,,19,,,,21,19,,773,773,,,,,,,440,,34,,21,21,,,,', +',,,,,,,15,20,,,19,352,352,,,,,,,,34,34,,,,20,34,,,,,20,,,,,,,19,,,918', +',,,,,20,352,352,352,353,,,,,,,766,,,,,,,,766,,,34,,34,34,,,766,766,', +',,,,772,772,34,,15,,,,,,,,,,19,,,,,,20,,15,19,,19,,,15,,34,,,353,,,', +',,,,,,,15,,,,1110,20,20,,,767,767,20,,,,,,773,,773,,,773,773,,,,,,773', +',,,,,773,773,,,,,,773,773,,,,,,,,353,,,20,15,,,771,771,,,21,,19,,19', +',,19,347,,,,,,19,,,347,,773,19,19,15,15,,,,,15,,,,,,,20,,19,21,,,21', +',,,,,,1030,766,,766,,,766,766,,,,,,766,21,1041,,,,766,766,858,,15,,', +'766,766,,,,,,,,,,,43,,,21,,43,443,,,,21,,,,,,443,443,1071,,,443,443', +',296,,772,766,15,,1086,19,,,772,19,43,343,343,352,19,,,772,772,,,,,', +',,,,,,,,352,,773,,,,43,,,,773,,19,,773,,392,296,296,,,767,,,,,,19,19', +'767,,,,1118,1119,1120,,,767,767,,,,,,,,,,1128,,,,,,,,,,,,,,,43,,,,,', +'771,770,770,43,,43,,,771,347,,,,,,,,771,771,773,347,,,,,,766,,,,,,,', +'766,,,,766,,,,,,,,,21,,,,,21,,,,,,,,,,,21,,,,,,,,,,,,,,772,,772,,443', +'772,772,,,,,43,772,,,,,,772,772,,21,,43,,772,772,775,775,43,,,,,,,766', +',,,,,,,,,43,,,,,,,767,,767,,,767,767,,,,,772,767,,,,,,767,767,,,19,', +',767,767,,,,352,,,,,,,,,352,,,,,,,,,21,771,,771,,,771,771,,,,,19,771', +',19,767,,21,771,771,,,,21,43,771,771,,43,,,,343,43,,19,,,,21,770,,,1109', +',,,,770,,,343,,,,,,770,770,,,,19,43,771,19,,,,19,,,,,,19,19,,43,43,19', +'19,,,,,,,,772,,,,,21,,,772,,,,772,,,,,,405,,,,,,,,,,,,,,,,21,21,,,,', +'21,,,,,,,,,,,,,767,775,,,,,,,767,775,,,767,,,,,,775,775,,,,,,768,768', +'405,,,21,,,,772,,,,,,,,,,,,,,,771,,,,,352,,,771,,,,771,,,,352,,,,,,', +',21,,,,770,,770,,,770,770,,31,,767,,770,31,,19,,,770,770,19,,,,,770', +'770,,,,31,19,,,,,,,,,31,31,31,,31,,,,,19,,,,,43,,,,,771,,,343,,770,', +'19,,,,,343,31,,,,,31,31,,,31,,,,,,,,,,,43,,,43,,,,,,,,775,,775,,,775', +'775,,,,,,775,43,,,,,775,775,,,,,,775,775,31,,,,,31,31,31,31,31,,31,', +'43,,,19,,,,43,,,,,,,,,,,,,,19,,768,775,,,19,,,,768,,,,,,,,,768,768,', +'19,,,,352,770,769,769,,,,,,770,,,,770,,,,,,,,,,,,,,,,,,,,,31,31,31,31', +'31,31,31,,,,,,31,,,,,19,31,31,31,31,,,,,,,,,352,,,,,31,,,,,,,,,,,19', +'19,,,,,19,343,770,,,,,,,,,,343,,,,,,775,,,,,,,,775,,,31,775,,,,,,31', +'31,,43,352,,,19,43,31,,,,,,,,,,43,,,,,,,,31,,,,31,,768,,768,31,,768', +'768,,,,,,768,,,,,19,768,768,,43,,,,768,768,,,,,,,31,,,775,,,,,,,,,,', +'31,31,31,,,,,,,,,,,,,,,768,769,,,31,,,,,769,,,,,,,,,769,769,,,,,,,,', +',,,,,,,,,43,,,,,,,,,,,,,,,,,,43,,,,,,43,,,249,,,,,31,,,,,317,317,317', +'43,,,,1105,,,,,364,365,,367,368,,370,,,,,,,,,,,,,,,317,317,31,,,,,,', +',,,31,,,,,,,,768,,,,,43,,,768,,,,768,,,,,,296,,,,,,,,,,,,,,,,43,43,', +',,,43,,,,,,,,,,,,31,769,,769,,,769,769,,,31,,,769,,,,,,769,769,,,,,', +'769,769,296,,,43,,,,768,,,31,,,31,,,,,,,31,,,,,,,,,,31,,,,31,,,769,', +',,,,,,,43,,,,,,317,447,,,453,317,,,,31,,,31,31,,,31,,453,,,,31,31,,', +',31,31,,,249,,,,,,,531,532,533,534,535,536,537,538,539,540,541,542,543', +'544,545,546,547,548,549,550,551,552,,,,,553,,,,,,,,,,,,,,,,,,,,,,,317', +'317,,,,,,,,317,,,,,,,317,,317,,,317,317,,,769,,,,,,,,769,,,,769,,,,', +',,,,,,,,,,,,,,,,,,,,,606,,,,,,,,31,,,,,,,,,,,,,,,,,,,,,,,31,,,,,31,31', +',,,,,,,,,31,,769,,,,,,,,,,,,,,,,31,,317,,,,,,,,,,,,,,,31,,,,,,,,,,,', +',,,,,,,,,694,,,,,,,,,,,,,,,,,,,,,,,,,,,317,,,,,,,,,,,,,725,,31,,,,,', +',,317,,453,453,453,,,,,31,,,,,,,,,,,,31,,,,,,31,,,,,,31,,,,,,,365,,', +',,,,,,31,317,,317,,317,,,,,,,,,,,,,,,,317,,,,,,,,,,453,,,818,,819,,', +',,,317,,,317,,,,,,,,,,31,,,317,317,,,,,,,,,,317,,,,,,,,,,,,,,,31,31', +',,,,31,,,,,,,,,,,,317,453,317,,,,876,,,317,317,453,453,,,,453,453,,', +',,,317,,,,,,,,31,,31,31,,,,,317,,,,,,,31,,,,,,,,,,,,,,,694,725,,,,,', +',,,,,,31,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,317,,,,,,,,,317,', +',317,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,', +',,,317,,,,,,,,453,,,,,,,,,,,,,1011,1012,,,,,,,,,,,,,,,,,,,,,,,,,,,,1034', +'1035,453,453,453,453,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1068,,,,', +',,,,,,,,,,,,,,,,,,,,,,,317,,,,,,,,,,,,,,,,,,,317,,,,,,,,,,,,,,,,,,,', +',,,,,,453,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,', +',,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,317' ] + racc_goto_table = arr = ::Array.new(4637, nil) + idx = 0 + clist.each do |str| + str.split(',', -1).each do |i| + arr[idx] = i.to_i unless i.empty? + idx += 1 + end + end + +clist = [ +'72,33,158,117,48,72,198,75,75,68,87,87,33,46,107,82,82,12,198,110,110', +'112,113,75,72,61,61,36,36,36,19,19,139,139,19,94,72,72,72,73,17,17,230', +'230,31,91,91,92,135,235,22,13,82,82,82,44,44,130,87,10,128,77,77,28', +'72,10,111,228,228,228,90,90,90,117,72,72,72,28,127,133,8,24,24,225,225', +'8,58,119,19,19,19,19,231,55,55,41,41,9,80,187,177,177,61,90,90,146,64', +'146,20,51,7,20,147,6,129,89,89,57,65,89,157,157,72,70,192,20,31,149', +'56,56,56,72,69,72,2,236,192,200,200,175,145,176,5,239,8,42,161,26,26', +'74,74,26,151,63,63,63,140,152,161,140,202,202,30,178,178,214,214,30', +'224,224,55,136,94,178,50,131,52,95,150,95,126,125,153,13,30,239,154', +'155,156,27,25,159,193,160,30,30,30,93,30,30,30,10,8,236,162,26,26,26', +'26,35,35,8,5,8,164,165,72,36,230,29,168,169,170,75,29,33,30,171,72,172', +'6,30,30,173,72,30,30,30,30,91,79,198,87,87,21,22,22,149,151,22,124,72', +'239,152,79,29,130,123,112,225,18,180,182,22,183,184,122,2,188,33,189', +'215,215,215,215,73,121,120,128,127,1,195,128,29,30,147,196,95,95,30', +'30,30,30,30,16,30,157,26,26,36,36,14,145,116,114,205,206,58,36,200,207', +'210,211,212,26,26,213,82,175,119,61,61,60,175,175,176,176,192,33,117', +'68,72,129,216,217,72,82,218,219,72,72,29,31,90,220,19,33,202,202,223', +'29,90,29,70,149,201,201,106,72,105,229,3,70,235,193,91,51,88,88,88,72', +'91,193,146,78,26,233,33,30,30,30,30,30,30,30,72,72,117,55,55,30,234', +'83,61,61,95,30,30,30,30,88,84,43,61,61,64,86,187,80,45,64,8,31,30,231', +'73,142,65,174,174,119,146,65,9,75,33,63,143,140,,111,61,61,69,63,29', +'7,29,61,61,29,35,35,,,,,29,,13,31,,139,29,29,230,,17,,30,31,55,26,,', +'36,30,30,5,,29,55,110,10,91,30,61,61,77,128,128,91,,26,,,,,228,228,', +'228,228,30,228,31,225,30,57,55,,30,30,57,,36,11,55,,117,133,94,,,230', +'36,230,215,75,215,30,,231,,28,28,5,72,72,28,28,92,30,157,91,146,,,146', +'200,200,79,,79,55,55,30,30,30,200,29,,88,88,29,200,41,56,24,29,68,177', +'20,89,56,,82,30,70,68,73,91,20,20,13,82,,20,20,239,72,,,,,36,,140,72', +'29,140,75,,140,94,140,,72,200,231,,75,,,29,29,146,91,90,,,,,113,,95', +'44,91,72,79,,72,117,36,,139,139,,,75,,,30,36,135,75,174,,,88,88,117', +'72,,174,91,,,88,90,,,110,91,56,,,,,,,140,,140,,140,75,140,36,72,,,30', +'198,75,,72,10,,128,128,,30,,140,,11,87,,,91,,,,,228,228,228,228,17,22', +'79,79,,,12,79,79,,,22,22,,,,22,22,28,90,,77,11,,110,112,110,,,,139,', +'144,107,144,,,191,,,,200,40,30,191,,72,,,,8,30,,30,72,,,8,201,201,30', +'48,158,72,72,,20,,201,,46,,40,,201,,68,,,,75,30,82,230,30,,,68,228,', +',30,,82,,,,,,,29,30,,,72,30,11,,,19,,11,,,,72,174,201,,,,174,174,,,', +'91,90,10,91,,230,30,,174,30,30,,29,30,,29,72,,,30,30,72,,,30,30,,,,', +'11,11,72,,,,29,,,,,,,,,,,85,,,,,232,,174,,,,87,,,,87,29,,,29,72,,79', +'29,26,,10,,,29,29,22,132,,29,29,,,,,,,,191,19,,,,,,,191,72,26,72,191', +'10,72,72,,,,,,72,,79,79,79,79,72,72,230,19,,230,,72,72,,,,,,,,32,,,', +'88,61,61,30,,,,,,,72,198,,,30,,,,30,,31,,,,,61,72,,72,,,,82,117,72,144', +',,,,191,30,,,,,30,30,,,72,,,230,72,,,30,,,,85,85,,,,,88,,55,,26,,,232', +'30,,232,,,232,,232,144,,144,,144,,,,79,30,,,,82,,29,,26,,,29,132,72', +'40,132,,132,,,,,29,,,,72,,,,,,,,11,,33,11,40,,29,,72,72,,,,,72,,,,,', +'19,19,232,29,232,,232,72,232,30,,,82,,,72,,,85,72,85,,,85,85,232,30', +',,132,,132,,132,72,132,,72,30,,,62,,,30,,62,36,,,30,,132,75,144,,144', +',,,,,,62,40,,30,,,91,30,,,62,62,62,75,62,,,72,,144,29,,,,,,,,,,,72,', +',,,,,29,,,,62,,29,,,62,62,,,62,,,26,26,,,30,144,29,144,,144,,,32,,,85', +',30,,,,,,,,,32,,144,,,,,30,30,38,,,,30,38,,,,,40,62,,,,,62,62,62,62', +'62,,62,,,,29,,,,,,,,,,38,38,38,,,,,85,30,,,30,,30,30,11,32,,,29,29,', +',,,29,30,,38,,,11,,,,,,,38,38,38,,,23,,,32,,23,,,,,,30,32,,,,,,,,,,', +'11,,29,62,62,62,62,62,62,62,,,32,23,85,62,85,,85,,38,62,62,62,62,,,', +',38,,38,,,,,,,62,,,23,,,,29,,,,,,23,,,,85,,,85,,,,,,,,,,,,,85,32,,,', +',32,32,,11,,,,62,,,,,40,,62,62,,,,,,11,23,62,,,40,40,,,,23,,23,141,141', +'141,38,85,38,,62,38,11,,62,,85,85,38,62,,,,,38,38,,,,,85,,,,,,,,,,,38', +',,,,85,,,62,,,,,,,40,,,,,,,62,62,62,,,,,,,,,,,,,,,32,32,32,,62,23,40', +'23,,,23,,,,,40,11,23,,,,40,11,23,23,,,141,141,141,141,,141,,,,,,40,', +'23,38,,,85,38,,,,38,38,,,85,,,85,,,,,,,,,11,,,38,62,141,141,141,141', +',,,,,,38,,141,,,,,,,,,,,,,38,38,,40,,,,,40,40,,,,11,62,,,,,,,,,,62,23', +',,85,23,,,,,23,,,,,,,,,,,,40,,,,,,,,,,,32,,,,,,,23,,,,,,,,,,,,,,,23', +'23,,,,62,,,,,,,,,,62,,,,,,,,,,,,,,,,,,,,,,,,,40,40,40,62,,,62,,,,40', +',,62,,,,,,,,,66,62,,,,62,,,,85,,,40,,,,,,,,,,,,,,,,85,,,,62,,,62,62', +',,62,,,,,,62,62,39,,,62,62,39,,38,,,,,,,,38,,,,,,,,,38,,,,,66,,,,,,', +'39,39,39,,,,40,,,38,,,38,,,,66,,,,,,,,,,,,39,,,,,38,,,,,39,39,39,,,', +',,,40,,,23,,,,,,,,,,38,,,38,,,,38,,,,,,38,38,,,,38,38,,,,,,,39,,23,', +',23,,,,39,,39,62,,,,104,104,,,,,,,,,23,,,,,,,,,62,,,,,62,62,,,,,,,,', +',62,,23,,,23,,,,23,,,,,,23,23,,62,66,23,23,,,,,,,,,,,,,,62,,,,,,,,39', +',39,,,39,,,,,,,39,,38,66,97,97,39,39,,,,,,38,,,,,,,,,,39,,,,,,,,,,,', +',,,,,38,66,,62,,38,,,,66,,66,,,,66,38,,,,62,,,,,,,,,,,66,62,,38,,,66', +'62,,,,,,62,,,,,,,38,,,,,66,,,,62,,,39,,,,39,,,,39,39,,,,,,,23,,,,,23', +',,,104,,39,,,,,23,104,,34,,,,39,34,,104,104,,,,,,,23,,62,,39,39,,,,', +',,,,,,,23,38,,,34,34,34,,,,,,,,62,62,,,,38,62,,,,,38,,,,,,,34,,,66,', +',,,,38,34,34,34,38,,,,,,,97,,,,,,,,97,,,62,,62,62,,,97,97,,,,,,103,103', +'62,,23,,,,,,,,,,34,,,,,,38,,23,34,,34,,,23,,62,,,38,,,,,,,,,,,23,,,', +'23,38,38,,,98,98,38,,,,,,104,,104,,,104,104,,,,,,104,,,,,,104,104,,', +',,,104,104,,,,,,,,38,,,38,23,,,102,102,,,39,,34,,34,,,34,39,,,,,,34', +',,39,,104,34,34,23,23,,,,,23,,,,,,,38,,34,39,,,39,,,,,,,66,97,,97,,', +'97,97,,,,,,97,39,66,,,,97,97,39,,23,,,97,97,,,,,,,,,,,71,,,39,,71,39', +',,,39,,,,,,39,39,66,,,39,39,,71,,103,97,23,,66,34,,,103,34,71,71,71', +'34,34,,,103,103,,,,,,,,,,,,,,34,,104,,,,71,,,,104,,34,,104,,71,71,71', +',,98,,,,,,34,34,98,,,,66,66,66,,,98,98,,,,,,,,,,66,,,,,,,,,,,,,,,71', +',,,,,102,101,101,71,,71,,,102,39,,,,,,,,102,102,104,39,,,,,,97,,,,,', +',,97,,,,97,,,,,,,,,39,,,,,39,,,,,,,,,,,39,,,,,,,,,,,,,,103,,103,,39', +'103,103,,,,,71,103,,,,,,103,103,,39,,71,,103,103,109,109,71,,,,,,,97', +',,,,,,,,,71,,,,,,,98,,98,,,98,98,,,,,103,98,,,,,,98,98,,,34,,,98,98', +',,,34,,,,,,,,,34,,,,,,,,,39,102,,102,,,102,102,,,,,34,102,,34,98,,39', +'102,102,,,,39,71,102,102,,71,,,,71,71,,34,,,,39,101,,,39,,,,,101,,,71', +',,,,,101,101,,,,34,71,102,34,,,,34,,,,,,34,34,,71,71,34,34,,,,,,,,103', +',,,,39,,,103,,,,103,,,,,,39,,,,,,,,,,,,,,,,39,39,,,,,39,,,,,,,,,,,,', +'98,109,,,,,,,98,109,,,98,,,,,,109,109,,,,,,99,99,39,,,39,,,,103,,,,', +',,,,,,,,,,102,,,,,34,,,102,,,,102,,,,34,,,,,,,,39,,,,101,,101,,,101', +'101,,59,,98,,101,59,,34,,,101,101,34,,,,,101,101,,,,59,34,,,,,,,,,59', +'59,59,,59,,,,,34,,,,,71,,,,,102,,,71,,101,,34,,,,,71,59,,,,,59,59,,', +'59,,,,,,,,,,,71,,,71,,,,,,,,109,,109,,,109,109,,,,,,109,71,,,,,109,109', +',,,,,109,109,59,,,,,59,59,59,59,59,,59,,71,,,34,,,,71,,,,,,,,,,,,,,34', +',99,109,,,34,,,,99,,,,,,,,,99,99,,34,,,,34,101,100,100,,,,,,101,,,,101', +',,,,,,,,,,,,,,,,,,,,59,59,59,59,59,59,59,,,,,,59,,,,,34,59,59,59,59', +',,,,,,,,34,,,,,59,,,,,,,,,,,34,34,,,,,34,71,101,,,,,,,,,,71,,,,,,109', +',,,,,,,109,,,59,109,,,,,,59,59,,71,34,,,34,71,59,,,,,,,,,,71,,,,,,,', +'59,,,,59,,99,,99,59,,99,99,,,,,,99,,,,,34,99,99,,71,,,,99,99,,,,,,,59', +',,109,,,,,,,,,,,59,59,59,,,,,,,,,,,,,,,99,100,,,59,,,,,100,,,,,,,,,100', +'100,,,,,,,,,,,,,,,,,,71,,,,,,,,,,,,,,,,,,71,,,,,,71,,,37,,,,,59,,,,', +'37,37,37,71,,,,71,,,,,37,37,,37,37,,37,,,,,,,,,,,,,,,37,37,59,,,,,,', +',,,59,,,,,,,,99,,,,,71,,,99,,,,99,,,,,,71,,,,,,,,,,,,,,,,71,71,,,,,71', +',,,,,,,,,,,59,100,,100,,,100,100,,,59,,,100,,,,,,100,100,,,,,,100,100', +'71,,,71,,,,99,,,59,,,59,,,,,,,59,,,,,,,,,,59,,,,59,,,100,,,,,,,,,71', +',,,,,37,37,,,37,37,,,,59,,,59,59,,,59,,37,,,,59,59,,,,59,59,,,37,,,', +',,,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37', +',,,,37,,,,,,,,,,,,,,,,,,,,,,,37,37,,,,,,,,37,,,,,,,37,,37,,,37,37,,', +'100,,,,,,,,100,,,,100,,,,,,,,,,,,,,,,,,,,,,,,,,37,,,,,,,,59,,,,,,,,', +',,,,,,,,,,,,,,59,,,,,59,59,,,,,,,,,,59,,100,,,,,,,,,,,,,,,,59,,37,,', +',,,,,,,,,,,,59,,,,,,,,,,,,,,,,,,,,,37,,,,,,,,,,,,,,,,,,,,,,,,,,,37,', +',,,,,,,,,,,37,,59,,,,,,,,37,,37,37,37,,,,,59,,,,,,,,,,,,59,,,,,,59,', +',,,,59,,,,,,,37,,,,,,,,,59,37,,37,,37,,,,,,,,,,,,,,,,37,,,,,,,,,,37', +',,37,,37,,,,,,37,,,37,,,,,,,,,,59,,,37,37,,,,,,,,,,37,,,,,,,,,,,,,,', +'59,59,,,,,59,,,,,,,,,,,,37,37,37,,,,37,,,37,37,37,37,,,,37,37,,,,,,37', +',,,,,,,59,,59,59,,,,,37,,,,,,,59,,,,,,,,,,,,,,,37,37,,,,,,,,,,,,59,', +',,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,37,,,,,,,,,37,,,37,,,,,,,,', +',,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,37,,,,,,,', +'37,,,,,,,,,,,,,37,37,,,,,,,,,,,,,,,,,,,,,,,,,,,,37,37,37,37,37,37,,', +',,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,37,,,,,,,,,,,,,,,,,,,,,,,,,,,,37', +',,,,,,,,,,,,,,,,,,37,,,,,,,,,,,,,,,,,,,,,,,,,,37,,,,,,,,,,,,,,,,,,,', +',,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,', +',,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,37' ] + racc_goto_check = arr = ::Array.new(4637, nil) + idx = 0 + clist.each do |str| + str.split(',', -1).each do |i| + arr[idx] = i.to_i unless i.empty? + idx += 1 + end + end + +racc_goto_pointer = [ + nil, 280, 132, 361, nil, 137, 106, 105, 78, 88, + -171, 468, -456, -644, -591, nil, -288, 30, 249, -41, + -112, 168, 26, 1337, -138, -29, 76, 53, -160, 217, + 160, -180, 504, -17, 2197, 190, -7, 3474, 1258, 1831, + 718, -434, -110, 146, -18, -215, -13, nil, -22, nil, + 148, 80, -378, nil, nil, -132, 97, -188, -481, 3031, + -238, -200, 1147, 119, 68, 80, 1547, nil, -30, 92, + -237, 2497, -2, -363, 72, -3, nil, 51, -57, 17, + 50, nil, -24, 341, 30, 804, 339, -9, 333, -261, + 36, 14, -259, -360, -285, -395, nil, 1536, 1831, 2444, + 2688, 2099, 1880, 1778, 1442, 333, 289, -55, nil, 2202, + -365, -759, -369, -605, 228, nil, -103, -2, nil, 67, + 212, -97, 200, -351, -391, -669, -228, -837, -436, -382, + -859, -740, -69, -622, nil, -447, -802, nil, nil, -447, + -545, 398, -659, -546, 24, -833, -600, -681, nil, -726, + -922, -948, -943, -227, -666, 102, -457, -113, -25, -810, + -809, -410, -96, nil, -96, -96, nil, nil, -565, -872, + -768, -991, -606, -915, -111, -608, -606, -429, -768, nil, + -666, nil, -666, -482, -481, nil, nil, -649, -480, -479, + nil, -202, -802, -753, nil, -666, -661, nil, -84, nil, + -392, -174, -604, nil, nil, -472, -390, -586, nil, nil, + 223, 219, 219, 221, -249, -141, 237, 237, 239, -313, + -308, nil, nil, -293, -184, -150, nil, nil, -416, -345, + -191, -613, -96, -325, -741, -658, -1003, nil, nil, -431 ] + +racc_goto_default = [ + nil, nil, nil, nil, 5, nil, 6, 391, 334, nil, + nil, 473, nil, 985, nil, 331, 332, nil, nil, nil, + 13, 14, 22, 247, nil, nil, 16, nil, 441, 248, + 363, nil, nil, 639, 251, nil, 27, 25, 252, 246, + 519, nil, nil, nil, nil, nil, nil, 386, 143, 26, + nil, nil, nil, 28, 29, 814, nil, nil, nil, 351, + nil, 30, 348, 455, 37, nil, nil, 39, 42, 41, + nil, 243, 244, 403, nil, 464, 142, 87, nil, 446, + 103, 51, 54, 283, nil, 323, nil, 893, 456, nil, + 457, 469, 482, 688, 571, 321, 307, 55, 56, 57, + 58, 59, 60, 61, 62, 63, nil, 308, 69, 70, + nil, nil, nil, nil, nil, 77, nil, 621, 78, 230, + nil, nil, nil, nil, nil, nil, nil, 715, 494, nil, + 716, 717, 480, 475, 476, nil, 1178, 711, 1072, nil, + 481, nil, nil, nil, 483, nil, 485, nil, 972, nil, + nil, nil, 492, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 468, nil, nil, 793, 785, nil, nil, + nil, nil, nil, nil, 1052, nil, 738, 939, 740, 741, + 745, 742, 743, nil, nil, 744, 746, nil, nil, nil, + 938, 940, 750, nil, 752, 753, 754, 755, nil, 759, + 477, 503, 761, 762, 763, nil, nil, nil, 86, 88, + 89, nil, nil, nil, nil, 649, nil, nil, nil, nil, + nil, 99, 100, nil, 231, 903, 234, 479, nil, 484, + 911, 497, 499, 500, 1083, 504, 1084, 507, 510, 326 ] + +racc_reduce_table = [ + 0, 0, :racc_error, + 0, 150, :_reduce_1, + 2, 148, :_reduce_2, + 2, 149, :_reduce_3, + 0, 151, :_reduce_4, + 1, 151, :_reduce_5, + 3, 151, :_reduce_6, + 2, 151, :_reduce_7, + 1, 153, :_reduce_none, + 2, 153, :_reduce_9, + 3, 156, :_reduce_10, + 4, 157, :_reduce_11, + 2, 158, :_reduce_12, + 0, 162, :_reduce_13, + 1, 162, :_reduce_14, + 3, 162, :_reduce_15, + 2, 162, :_reduce_16, + 1, 163, :_reduce_none, + 2, 163, :_reduce_18, + 0, 174, :_reduce_19, + 4, 155, :_reduce_20, + 3, 155, :_reduce_21, + 3, 155, :_reduce_22, + 3, 155, :_reduce_23, + 2, 155, :_reduce_24, + 3, 155, :_reduce_25, + 3, 155, :_reduce_26, + 3, 155, :_reduce_27, + 3, 155, :_reduce_28, + 3, 155, :_reduce_29, + 4, 155, :_reduce_30, + 1, 155, :_reduce_none, + 3, 155, :_reduce_32, + 3, 155, :_reduce_33, + 5, 155, :_reduce_34, + 3, 155, :_reduce_35, + 1, 155, :_reduce_none, + 3, 167, :_reduce_37, + 3, 167, :_reduce_38, + 6, 167, :_reduce_39, + 5, 167, :_reduce_40, + 5, 167, :_reduce_41, + 5, 167, :_reduce_42, + 5, 167, :_reduce_43, + 4, 167, :_reduce_44, + 6, 167, :_reduce_45, + 4, 167, :_reduce_46, + 6, 167, :_reduce_47, + 3, 167, :_reduce_48, + 1, 175, :_reduce_none, + 3, 175, :_reduce_50, + 1, 175, :_reduce_none, + 1, 173, :_reduce_none, + 3, 173, :_reduce_53, + 3, 173, :_reduce_54, + 3, 173, :_reduce_55, + 2, 173, :_reduce_56, + 0, 189, :_reduce_57, + 4, 173, :_reduce_58, + 0, 190, :_reduce_59, + 4, 173, :_reduce_60, + 1, 173, :_reduce_none, + 1, 166, :_reduce_none, + 0, 194, :_reduce_63, + 3, 191, :_reduce_64, + 1, 193, :_reduce_65, + 2, 181, :_reduce_66, + 0, 199, :_reduce_67, + 5, 185, :_reduce_68, + 1, 169, :_reduce_none, + 1, 169, :_reduce_none, + 1, 200, :_reduce_none, + 4, 200, :_reduce_72, + 0, 207, :_reduce_73, + 4, 204, :_reduce_74, + 1, 206, :_reduce_none, + 2, 183, :_reduce_76, + 3, 183, :_reduce_77, + 4, 183, :_reduce_78, + 5, 183, :_reduce_79, + 4, 183, :_reduce_80, + 5, 183, :_reduce_81, + 2, 183, :_reduce_82, + 2, 183, :_reduce_83, + 2, 183, :_reduce_84, + 2, 183, :_reduce_85, + 2, 183, :_reduce_86, + 1, 168, :_reduce_87, + 3, 168, :_reduce_88, + 1, 212, :_reduce_89, + 3, 212, :_reduce_90, + 1, 211, :_reduce_none, + 2, 211, :_reduce_92, + 3, 211, :_reduce_93, + 5, 211, :_reduce_94, + 2, 211, :_reduce_95, + 4, 211, :_reduce_96, + 2, 211, :_reduce_97, + 4, 211, :_reduce_98, + 1, 211, :_reduce_99, + 3, 211, :_reduce_100, + 1, 215, :_reduce_none, + 3, 215, :_reduce_102, + 2, 214, :_reduce_103, + 3, 214, :_reduce_104, + 1, 217, :_reduce_105, + 3, 217, :_reduce_106, + 1, 216, :_reduce_107, + 1, 216, :_reduce_108, + 4, 216, :_reduce_109, + 3, 216, :_reduce_110, + 3, 216, :_reduce_111, + 3, 216, :_reduce_112, + 3, 216, :_reduce_113, + 2, 216, :_reduce_114, + 1, 216, :_reduce_115, + 1, 170, :_reduce_116, + 1, 170, :_reduce_117, + 4, 170, :_reduce_118, + 3, 170, :_reduce_119, + 3, 170, :_reduce_120, + 3, 170, :_reduce_121, + 3, 170, :_reduce_122, + 2, 170, :_reduce_123, + 1, 170, :_reduce_124, + 1, 220, :_reduce_125, + 1, 220, :_reduce_none, + 2, 221, :_reduce_127, + 1, 221, :_reduce_128, + 3, 221, :_reduce_129, + 1, 195, :_reduce_none, + 1, 195, :_reduce_none, + 1, 195, :_reduce_none, + 1, 195, :_reduce_none, + 1, 195, :_reduce_none, + 1, 164, :_reduce_135, + 1, 164, :_reduce_none, + 1, 165, :_reduce_137, + 0, 225, :_reduce_138, + 4, 165, :_reduce_139, + 1, 222, :_reduce_none, + 1, 222, :_reduce_none, + 1, 222, :_reduce_none, + 1, 222, :_reduce_none, + 1, 222, :_reduce_none, + 1, 222, :_reduce_none, + 1, 222, :_reduce_none, + 1, 222, :_reduce_none, + 1, 222, :_reduce_none, + 1, 222, :_reduce_none, + 1, 222, :_reduce_none, + 1, 222, :_reduce_none, + 1, 222, :_reduce_none, + 1, 222, :_reduce_none, + 1, 222, :_reduce_none, + 1, 222, :_reduce_none, + 1, 222, :_reduce_none, + 1, 222, :_reduce_none, + 1, 222, :_reduce_none, + 1, 222, :_reduce_none, + 1, 222, :_reduce_none, + 1, 222, :_reduce_none, + 1, 222, :_reduce_none, + 1, 222, :_reduce_none, + 1, 222, :_reduce_none, + 1, 222, :_reduce_none, + 1, 222, :_reduce_none, + 1, 222, :_reduce_none, + 1, 222, :_reduce_none, + 1, 222, :_reduce_none, + 1, 223, :_reduce_none, + 1, 223, :_reduce_none, + 1, 223, :_reduce_none, + 1, 223, :_reduce_none, + 1, 223, :_reduce_none, + 1, 223, :_reduce_none, + 1, 223, :_reduce_none, + 1, 223, :_reduce_none, + 1, 223, :_reduce_none, + 1, 223, :_reduce_none, + 1, 223, :_reduce_none, + 1, 223, :_reduce_none, + 1, 223, :_reduce_none, + 1, 223, :_reduce_none, + 1, 223, :_reduce_none, + 1, 223, :_reduce_none, + 1, 223, :_reduce_none, + 1, 223, :_reduce_none, + 1, 223, :_reduce_none, + 1, 223, :_reduce_none, + 1, 223, :_reduce_none, + 1, 223, :_reduce_none, + 1, 223, :_reduce_none, + 1, 223, :_reduce_none, + 1, 223, :_reduce_none, + 1, 223, :_reduce_none, + 1, 223, :_reduce_none, + 1, 223, :_reduce_none, + 1, 223, :_reduce_none, + 1, 223, :_reduce_none, + 1, 223, :_reduce_none, + 1, 223, :_reduce_none, + 1, 223, :_reduce_none, + 1, 223, :_reduce_none, + 1, 223, :_reduce_none, + 1, 223, :_reduce_none, + 1, 223, :_reduce_none, + 1, 223, :_reduce_none, + 1, 223, :_reduce_none, + 1, 223, :_reduce_none, + 1, 223, :_reduce_none, + 3, 184, :_reduce_211, + 3, 184, :_reduce_212, + 6, 184, :_reduce_213, + 5, 184, :_reduce_214, + 5, 184, :_reduce_215, + 5, 184, :_reduce_216, + 5, 184, :_reduce_217, + 4, 184, :_reduce_218, + 3, 184, :_reduce_219, + 3, 184, :_reduce_220, + 3, 184, :_reduce_221, + 2, 184, :_reduce_222, + 2, 184, :_reduce_223, + 2, 184, :_reduce_224, + 2, 184, :_reduce_225, + 3, 184, :_reduce_226, + 3, 184, :_reduce_227, + 3, 184, :_reduce_228, + 3, 184, :_reduce_229, + 3, 184, :_reduce_230, + 3, 184, :_reduce_231, + 4, 184, :_reduce_232, + 2, 184, :_reduce_233, + 2, 184, :_reduce_234, + 3, 184, :_reduce_235, + 3, 184, :_reduce_236, + 3, 184, :_reduce_237, + 3, 184, :_reduce_238, + 1, 184, :_reduce_none, + 3, 184, :_reduce_240, + 3, 184, :_reduce_241, + 3, 184, :_reduce_242, + 3, 184, :_reduce_243, + 3, 184, :_reduce_244, + 2, 184, :_reduce_245, + 2, 184, :_reduce_246, + 3, 184, :_reduce_247, + 3, 184, :_reduce_248, + 3, 184, :_reduce_249, + 3, 184, :_reduce_250, + 0, 231, :_reduce_251, + 4, 184, :_reduce_252, + 6, 184, :_reduce_253, + 4, 184, :_reduce_254, + 6, 184, :_reduce_255, + 4, 184, :_reduce_256, + 6, 184, :_reduce_257, + 1, 184, :_reduce_none, + 1, 230, :_reduce_none, + 1, 230, :_reduce_none, + 1, 230, :_reduce_none, + 1, 230, :_reduce_none, + 3, 228, :_reduce_263, + 3, 228, :_reduce_264, + 1, 232, :_reduce_none, + 1, 233, :_reduce_none, + 2, 233, :_reduce_none, + 4, 233, :_reduce_268, + 2, 233, :_reduce_269, + 1, 226, :_reduce_none, + 3, 226, :_reduce_271, + 3, 238, :_reduce_272, + 5, 238, :_reduce_273, + 3, 238, :_reduce_274, + 0, 240, :_reduce_275, + 1, 240, :_reduce_none, + 0, 178, :_reduce_277, + 1, 178, :_reduce_none, + 2, 178, :_reduce_none, + 4, 178, :_reduce_280, + 2, 178, :_reduce_281, + 1, 210, :_reduce_282, + 2, 210, :_reduce_283, + 2, 210, :_reduce_284, + 4, 210, :_reduce_285, + 1, 210, :_reduce_286, + 0, 243, :_reduce_287, + 2, 203, :_reduce_288, + 2, 242, :_reduce_289, + 1, 242, :_reduce_290, + 2, 241, :_reduce_291, + 0, 241, :_reduce_292, + 1, 235, :_reduce_293, + 2, 235, :_reduce_294, + 3, 235, :_reduce_295, + 4, 235, :_reduce_296, + 1, 172, :_reduce_297, + 1, 172, :_reduce_none, + 3, 171, :_reduce_299, + 4, 171, :_reduce_300, + 2, 171, :_reduce_301, + 1, 229, :_reduce_none, + 1, 229, :_reduce_none, + 1, 229, :_reduce_none, + 1, 229, :_reduce_none, + 1, 229, :_reduce_none, + 1, 229, :_reduce_none, + 1, 229, :_reduce_none, + 1, 229, :_reduce_none, + 1, 229, :_reduce_none, + 1, 229, :_reduce_none, + 1, 229, :_reduce_312, + 0, 267, :_reduce_313, + 4, 229, :_reduce_314, + 0, 268, :_reduce_315, + 4, 229, :_reduce_316, + 0, 269, :_reduce_317, + 4, 229, :_reduce_318, + 3, 229, :_reduce_319, + 3, 229, :_reduce_320, + 2, 229, :_reduce_321, + 3, 229, :_reduce_322, + 3, 229, :_reduce_323, + 1, 229, :_reduce_324, + 4, 229, :_reduce_325, + 3, 229, :_reduce_326, + 1, 229, :_reduce_327, + 0, 270, :_reduce_328, + 6, 229, :_reduce_329, + 4, 229, :_reduce_330, + 3, 229, :_reduce_331, + 2, 229, :_reduce_332, + 1, 229, :_reduce_none, + 2, 229, :_reduce_334, + 1, 229, :_reduce_none, + 6, 229, :_reduce_336, + 6, 229, :_reduce_337, + 4, 229, :_reduce_338, + 4, 229, :_reduce_339, + 5, 229, :_reduce_340, + 4, 229, :_reduce_341, + 5, 229, :_reduce_342, + 6, 229, :_reduce_343, + 0, 271, :_reduce_344, + 6, 229, :_reduce_345, + 0, 272, :_reduce_346, + 7, 229, :_reduce_347, + 0, 273, :_reduce_348, + 5, 229, :_reduce_349, + 4, 229, :_reduce_350, + 4, 229, :_reduce_351, + 1, 229, :_reduce_352, + 1, 229, :_reduce_353, + 1, 229, :_reduce_354, + 1, 229, :_reduce_355, + 1, 177, :_reduce_none, + 1, 262, :_reduce_357, + 1, 265, :_reduce_358, + 1, 196, :_reduce_359, + 1, 209, :_reduce_360, + 1, 257, :_reduce_none, + 1, 257, :_reduce_none, + 2, 257, :_reduce_363, + 1, 192, :_reduce_none, + 1, 192, :_reduce_none, + 1, 258, :_reduce_none, + 5, 258, :_reduce_367, + 1, 160, :_reduce_none, + 2, 160, :_reduce_369, + 1, 261, :_reduce_none, + 1, 261, :_reduce_none, + 1, 274, :_reduce_372, + 3, 274, :_reduce_373, + 1, 277, :_reduce_374, + 3, 277, :_reduce_375, + 1, 276, :_reduce_none, + 3, 276, :_reduce_377, + 5, 276, :_reduce_378, + 1, 276, :_reduce_379, + 3, 276, :_reduce_380, + 2, 278, :_reduce_381, + 1, 278, :_reduce_382, + 1, 279, :_reduce_none, + 1, 279, :_reduce_none, + 0, 284, :_reduce_385, + 2, 282, :_reduce_386, + 4, 283, :_reduce_387, + 2, 283, :_reduce_388, + 2, 283, :_reduce_389, + 1, 283, :_reduce_390, + 2, 288, :_reduce_391, + 0, 288, :_reduce_392, + 1, 289, :_reduce_none, + 6, 290, :_reduce_394, + 8, 290, :_reduce_395, + 4, 290, :_reduce_396, + 6, 290, :_reduce_397, + 4, 290, :_reduce_398, + 2, 290, :_reduce_none, + 6, 290, :_reduce_400, + 2, 290, :_reduce_401, + 4, 290, :_reduce_402, + 6, 290, :_reduce_403, + 2, 290, :_reduce_404, + 4, 290, :_reduce_405, + 2, 290, :_reduce_406, + 4, 290, :_reduce_407, + 1, 290, :_reduce_none, + 0, 294, :_reduce_409, + 1, 294, :_reduce_410, + 3, 295, :_reduce_411, + 4, 295, :_reduce_412, + 1, 296, :_reduce_413, + 4, 296, :_reduce_414, + 1, 297, :_reduce_415, + 3, 297, :_reduce_416, + 1, 298, :_reduce_417, + 1, 298, :_reduce_none, + 0, 302, :_reduce_419, + 0, 303, :_reduce_420, + 5, 256, :_reduce_421, + 4, 300, :_reduce_422, + 1, 300, :_reduce_423, + 0, 306, :_reduce_424, + 4, 301, :_reduce_425, + 0, 307, :_reduce_426, + 4, 301, :_reduce_427, + 0, 309, :_reduce_428, + 4, 305, :_reduce_429, + 2, 201, :_reduce_430, + 4, 201, :_reduce_431, + 5, 201, :_reduce_432, + 5, 201, :_reduce_433, + 2, 255, :_reduce_434, + 4, 255, :_reduce_435, + 4, 255, :_reduce_436, + 3, 255, :_reduce_437, + 3, 255, :_reduce_438, + 3, 255, :_reduce_439, + 2, 255, :_reduce_440, + 1, 255, :_reduce_441, + 4, 255, :_reduce_442, + 0, 311, :_reduce_443, + 4, 254, :_reduce_444, + 0, 312, :_reduce_445, + 4, 254, :_reduce_446, + 0, 313, :_reduce_447, + 3, 205, :_reduce_448, + 0, 314, :_reduce_449, + 0, 315, :_reduce_450, + 4, 308, :_reduce_451, + 5, 259, :_reduce_452, + 1, 316, :_reduce_453, + 1, 316, :_reduce_none, + 0, 319, :_reduce_455, + 0, 320, :_reduce_456, + 7, 260, :_reduce_457, + 1, 318, :_reduce_458, + 1, 318, :_reduce_none, + 1, 317, :_reduce_460, + 3, 317, :_reduce_461, + 3, 317, :_reduce_462, + 1, 188, :_reduce_none, + 2, 188, :_reduce_464, + 3, 188, :_reduce_465, + 1, 188, :_reduce_466, + 1, 188, :_reduce_467, + 1, 188, :_reduce_468, + 1, 321, :_reduce_none, + 3, 326, :_reduce_470, + 1, 326, :_reduce_none, + 3, 328, :_reduce_472, + 1, 328, :_reduce_none, + 1, 330, :_reduce_474, + 1, 331, :_reduce_475, + 1, 329, :_reduce_none, + 1, 329, :_reduce_none, + 4, 329, :_reduce_478, + 4, 329, :_reduce_479, + 4, 329, :_reduce_480, + 3, 329, :_reduce_481, + 4, 329, :_reduce_482, + 4, 329, :_reduce_483, + 4, 329, :_reduce_484, + 3, 329, :_reduce_485, + 3, 329, :_reduce_486, + 3, 329, :_reduce_487, + 2, 329, :_reduce_488, + 0, 335, :_reduce_489, + 4, 329, :_reduce_490, + 2, 329, :_reduce_491, + 0, 336, :_reduce_492, + 4, 329, :_reduce_493, + 1, 322, :_reduce_494, + 1, 322, :_reduce_495, + 2, 322, :_reduce_496, + 2, 322, :_reduce_497, + 4, 322, :_reduce_498, + 1, 322, :_reduce_none, + 2, 337, :_reduce_500, + 3, 337, :_reduce_501, + 1, 324, :_reduce_502, + 3, 324, :_reduce_503, + 5, 323, :_reduce_504, + 2, 339, :_reduce_505, + 1, 339, :_reduce_506, + 1, 340, :_reduce_507, + 3, 340, :_reduce_508, + 1, 338, :_reduce_none, + 3, 325, :_reduce_510, + 1, 325, :_reduce_511, + 2, 325, :_reduce_512, + 1, 325, :_reduce_513, + 1, 341, :_reduce_514, + 3, 341, :_reduce_515, + 2, 343, :_reduce_516, + 1, 343, :_reduce_517, + 1, 344, :_reduce_518, + 3, 344, :_reduce_519, + 2, 346, :_reduce_520, + 1, 346, :_reduce_521, + 2, 348, :_reduce_522, + 1, 342, :_reduce_none, + 1, 342, :_reduce_524, + 1, 332, :_reduce_none, + 3, 332, :_reduce_526, + 3, 332, :_reduce_527, + 2, 332, :_reduce_528, + 2, 332, :_reduce_529, + 1, 332, :_reduce_none, + 1, 332, :_reduce_none, + 1, 332, :_reduce_none, + 2, 332, :_reduce_533, + 2, 332, :_reduce_534, + 1, 349, :_reduce_none, + 1, 349, :_reduce_none, + 1, 349, :_reduce_none, + 1, 349, :_reduce_none, + 1, 349, :_reduce_none, + 1, 349, :_reduce_none, + 1, 349, :_reduce_none, + 1, 349, :_reduce_none, + 1, 349, :_reduce_543, + 1, 349, :_reduce_none, + 1, 327, :_reduce_545, + 2, 350, :_reduce_546, + 2, 350, :_reduce_547, + 4, 351, :_reduce_548, + 2, 333, :_reduce_549, + 3, 333, :_reduce_550, + 1, 333, :_reduce_551, + 6, 159, :_reduce_552, + 0, 159, :_reduce_553, + 1, 353, :_reduce_554, + 1, 353, :_reduce_none, + 1, 353, :_reduce_none, + 2, 354, :_reduce_557, + 1, 354, :_reduce_none, + 2, 161, :_reduce_559, + 1, 161, :_reduce_none, + 1, 244, :_reduce_none, + 1, 244, :_reduce_none, + 1, 245, :_reduce_563, + 1, 356, :_reduce_564, + 2, 356, :_reduce_565, + 3, 357, :_reduce_566, + 1, 357, :_reduce_567, + 1, 357, :_reduce_568, + 3, 246, :_reduce_569, + 4, 247, :_reduce_570, + 3, 248, :_reduce_571, + 0, 360, :_reduce_572, + 3, 360, :_reduce_573, + 1, 361, :_reduce_574, + 2, 361, :_reduce_575, + 3, 250, :_reduce_576, + 0, 363, :_reduce_577, + 3, 363, :_reduce_578, + 3, 249, :_reduce_579, + 3, 251, :_reduce_580, + 0, 364, :_reduce_581, + 3, 364, :_reduce_582, + 0, 365, :_reduce_583, + 3, 365, :_reduce_584, + 0, 345, :_reduce_585, + 2, 345, :_reduce_586, + 0, 358, :_reduce_587, + 2, 358, :_reduce_588, + 0, 359, :_reduce_589, + 2, 359, :_reduce_590, + 1, 362, :_reduce_591, + 2, 362, :_reduce_592, + 0, 367, :_reduce_593, + 4, 362, :_reduce_594, + 1, 366, :_reduce_595, + 1, 366, :_reduce_596, + 1, 366, :_reduce_597, + 1, 366, :_reduce_none, + 1, 224, :_reduce_none, + 1, 224, :_reduce_none, + 1, 368, :_reduce_601, + 3, 369, :_reduce_602, + 1, 355, :_reduce_603, + 2, 355, :_reduce_604, + 1, 227, :_reduce_605, + 1, 227, :_reduce_606, + 1, 227, :_reduce_607, + 1, 227, :_reduce_608, + 1, 352, :_reduce_609, + 1, 352, :_reduce_610, + 1, 352, :_reduce_611, + 1, 218, :_reduce_612, + 1, 218, :_reduce_613, + 1, 218, :_reduce_614, + 1, 218, :_reduce_615, + 1, 218, :_reduce_616, + 1, 219, :_reduce_617, + 1, 219, :_reduce_618, + 1, 219, :_reduce_619, + 1, 219, :_reduce_620, + 1, 219, :_reduce_621, + 1, 219, :_reduce_622, + 1, 219, :_reduce_623, + 1, 252, :_reduce_624, + 1, 252, :_reduce_625, + 1, 176, :_reduce_626, + 1, 176, :_reduce_627, + 1, 186, :_reduce_628, + 1, 186, :_reduce_629, + 0, 370, :_reduce_630, + 4, 263, :_reduce_631, + 0, 263, :_reduce_632, + 1, 182, :_reduce_none, + 1, 182, :_reduce_634, + 3, 371, :_reduce_635, + 1, 266, :_reduce_none, + 0, 373, :_reduce_637, + 3, 266, :_reduce_638, + 4, 372, :_reduce_639, + 2, 372, :_reduce_640, + 2, 372, :_reduce_641, + 1, 372, :_reduce_642, + 1, 372, :_reduce_643, + 2, 375, :_reduce_644, + 0, 375, :_reduce_645, + 6, 304, :_reduce_646, + 8, 304, :_reduce_647, + 4, 304, :_reduce_648, + 6, 304, :_reduce_649, + 4, 304, :_reduce_650, + 6, 304, :_reduce_651, + 2, 304, :_reduce_652, + 4, 304, :_reduce_653, + 6, 304, :_reduce_654, + 2, 304, :_reduce_655, + 4, 304, :_reduce_656, + 2, 304, :_reduce_657, + 4, 304, :_reduce_658, + 1, 304, :_reduce_659, + 0, 304, :_reduce_660, + 1, 239, :_reduce_661, + 1, 299, :_reduce_662, + 1, 299, :_reduce_663, + 1, 299, :_reduce_664, + 1, 299, :_reduce_665, + 1, 275, :_reduce_none, + 1, 275, :_reduce_667, + 1, 377, :_reduce_668, + 1, 378, :_reduce_669, + 3, 378, :_reduce_670, + 1, 291, :_reduce_671, + 3, 291, :_reduce_672, + 1, 379, :_reduce_673, + 2, 380, :_reduce_674, + 1, 380, :_reduce_675, + 2, 381, :_reduce_676, + 1, 381, :_reduce_677, + 1, 285, :_reduce_678, + 3, 285, :_reduce_679, + 1, 374, :_reduce_680, + 3, 374, :_reduce_681, + 1, 347, :_reduce_none, + 1, 347, :_reduce_none, + 1, 281, :_reduce_684, + 2, 280, :_reduce_685, + 1, 280, :_reduce_686, + 3, 382, :_reduce_687, + 3, 383, :_reduce_688, + 1, 292, :_reduce_689, + 3, 292, :_reduce_690, + 1, 376, :_reduce_691, + 3, 376, :_reduce_692, + 1, 384, :_reduce_none, + 1, 384, :_reduce_none, + 2, 293, :_reduce_695, + 1, 293, :_reduce_696, + 1, 385, :_reduce_none, + 1, 385, :_reduce_none, + 2, 287, :_reduce_699, + 1, 287, :_reduce_700, + 2, 286, :_reduce_701, + 0, 286, :_reduce_702, + 1, 197, :_reduce_none, + 3, 197, :_reduce_704, + 0, 253, :_reduce_705, + 2, 253, :_reduce_none, + 1, 237, :_reduce_707, + 3, 237, :_reduce_708, + 3, 386, :_reduce_709, + 2, 386, :_reduce_710, + 1, 386, :_reduce_711, + 4, 386, :_reduce_712, + 2, 386, :_reduce_713, + 1, 208, :_reduce_none, + 1, 208, :_reduce_none, + 1, 208, :_reduce_none, + 1, 202, :_reduce_none, + 1, 202, :_reduce_none, + 1, 310, :_reduce_none, + 1, 310, :_reduce_none, + 1, 310, :_reduce_none, + 1, 198, :_reduce_none, + 1, 198, :_reduce_none, + 1, 180, :_reduce_724, + 1, 180, :_reduce_725, + 0, 152, :_reduce_none, + 1, 152, :_reduce_none, + 0, 187, :_reduce_none, + 1, 187, :_reduce_none, + 2, 213, :_reduce_730, + 2, 179, :_reduce_731, + 2, 334, :_reduce_732, + 0, 236, :_reduce_none, + 1, 236, :_reduce_none, + 1, 236, :_reduce_none, + 1, 264, :_reduce_736, + 1, 264, :_reduce_none, + 1, 154, :_reduce_none, + 2, 154, :_reduce_none, + 0, 234, :_reduce_740 ] + +racc_reduce_n = 741 + +racc_shift_n = 1236 + +racc_token_table = { + false => 0, + :error => 1, + :kCLASS => 2, + :kMODULE => 3, + :kDEF => 4, + :kUNDEF => 5, + :kBEGIN => 6, + :kRESCUE => 7, + :kENSURE => 8, + :kEND => 9, + :kIF => 10, + :kUNLESS => 11, + :kTHEN => 12, + :kELSIF => 13, + :kELSE => 14, + :kCASE => 15, + :kWHEN => 16, + :kWHILE => 17, + :kUNTIL => 18, + :kFOR => 19, + :kBREAK => 20, + :kNEXT => 21, + :kREDO => 22, + :kRETRY => 23, + :kIN => 24, + :kDO => 25, + :kDO_COND => 26, + :kDO_BLOCK => 27, + :kDO_LAMBDA => 28, + :kRETURN => 29, + :kYIELD => 30, + :kSUPER => 31, + :kSELF => 32, + :kNIL => 33, + :kTRUE => 34, + :kFALSE => 35, + :kAND => 36, + :kOR => 37, + :kNOT => 38, + :kIF_MOD => 39, + :kUNLESS_MOD => 40, + :kWHILE_MOD => 41, + :kUNTIL_MOD => 42, + :kRESCUE_MOD => 43, + :kALIAS => 44, + :kDEFINED => 45, + :klBEGIN => 46, + :klEND => 47, + :k__LINE__ => 48, + :k__FILE__ => 49, + :k__ENCODING__ => 50, + :tIDENTIFIER => 51, + :tFID => 52, + :tGVAR => 53, + :tIVAR => 54, + :tCONSTANT => 55, + :tLABEL => 56, + :tCVAR => 57, + :tNTH_REF => 58, + :tBACK_REF => 59, + :tSTRING_CONTENT => 60, + :tINTEGER => 61, + :tFLOAT => 62, + :tUPLUS => 63, + :tUMINUS => 64, + :tUNARY_NUM => 65, + :tPOW => 66, + :tCMP => 67, + :tEQ => 68, + :tEQQ => 69, + :tNEQ => 70, + :tGEQ => 71, + :tLEQ => 72, + :tANDOP => 73, + :tOROP => 74, + :tMATCH => 75, + :tNMATCH => 76, + :tDOT => 77, + :tDOT2 => 78, + :tDOT3 => 79, + :tAREF => 80, + :tASET => 81, + :tLSHFT => 82, + :tRSHFT => 83, + :tCOLON2 => 84, + :tCOLON3 => 85, + :tOP_ASGN => 86, + :tASSOC => 87, + :tLPAREN => 88, + :tLPAREN2 => 89, + :tRPAREN => 90, + :tLPAREN_ARG => 91, + :tLBRACK => 92, + :tLBRACK2 => 93, + :tRBRACK => 94, + :tLBRACE => 95, + :tLBRACE_ARG => 96, + :tSTAR => 97, + :tSTAR2 => 98, + :tAMPER => 99, + :tAMPER2 => 100, + :tTILDE => 101, + :tPERCENT => 102, + :tDIVIDE => 103, + :tDSTAR => 104, + :tPLUS => 105, + :tMINUS => 106, + :tLT => 107, + :tGT => 108, + :tPIPE => 109, + :tBANG => 110, + :tCARET => 111, + :tLCURLY => 112, + :tRCURLY => 113, + :tBACK_REF2 => 114, + :tSYMBEG => 115, + :tSTRING_BEG => 116, + :tXSTRING_BEG => 117, + :tREGEXP_BEG => 118, + :tREGEXP_OPT => 119, + :tWORDS_BEG => 120, + :tQWORDS_BEG => 121, + :tSYMBOLS_BEG => 122, + :tQSYMBOLS_BEG => 123, + :tSTRING_DBEG => 124, + :tSTRING_DVAR => 125, + :tSTRING_END => 126, + :tSTRING_DEND => 127, + :tSTRING => 128, + :tSYMBOL => 129, + :tNL => 130, + :tEH => 131, + :tCOLON => 132, + :tCOMMA => 133, + :tSPACE => 134, + :tSEMI => 135, + :tLAMBDA => 136, + :tLAMBEG => 137, + :tCHARACTER => 138, + :tRATIONAL => 139, + :tIMAGINARY => 140, + :tLABEL_END => 141, + :tANDDOT => 142, + :tBDOT2 => 143, + :tBDOT3 => 144, + :tEQL => 145, + :tLOWEST => 146 } + +racc_nt_base = 147 + +racc_use_result_var = true + +Racc_arg = [ + racc_action_table, + racc_action_check, + racc_action_default, + racc_action_pointer, + racc_goto_table, + racc_goto_check, + racc_goto_default, + racc_goto_pointer, + racc_nt_base, + racc_reduce_table, + racc_token_table, + racc_shift_n, + racc_reduce_n, + racc_use_result_var ] + +Racc_token_to_s_table = [ + "$end", + "error", + "kCLASS", + "kMODULE", + "kDEF", + "kUNDEF", + "kBEGIN", + "kRESCUE", + "kENSURE", + "kEND", + "kIF", + "kUNLESS", + "kTHEN", + "kELSIF", + "kELSE", + "kCASE", + "kWHEN", + "kWHILE", + "kUNTIL", + "kFOR", + "kBREAK", + "kNEXT", + "kREDO", + "kRETRY", + "kIN", + "kDO", + "kDO_COND", + "kDO_BLOCK", + "kDO_LAMBDA", + "kRETURN", + "kYIELD", + "kSUPER", + "kSELF", + "kNIL", + "kTRUE", + "kFALSE", + "kAND", + "kOR", + "kNOT", + "kIF_MOD", + "kUNLESS_MOD", + "kWHILE_MOD", + "kUNTIL_MOD", + "kRESCUE_MOD", + "kALIAS", + "kDEFINED", + "klBEGIN", + "klEND", + "k__LINE__", + "k__FILE__", + "k__ENCODING__", + "tIDENTIFIER", + "tFID", + "tGVAR", + "tIVAR", + "tCONSTANT", + "tLABEL", + "tCVAR", + "tNTH_REF", + "tBACK_REF", + "tSTRING_CONTENT", + "tINTEGER", + "tFLOAT", + "tUPLUS", + "tUMINUS", + "tUNARY_NUM", + "tPOW", + "tCMP", + "tEQ", + "tEQQ", + "tNEQ", + "tGEQ", + "tLEQ", + "tANDOP", + "tOROP", + "tMATCH", + "tNMATCH", + "tDOT", + "tDOT2", + "tDOT3", + "tAREF", + "tASET", + "tLSHFT", + "tRSHFT", + "tCOLON2", + "tCOLON3", + "tOP_ASGN", + "tASSOC", + "tLPAREN", + "tLPAREN2", + "tRPAREN", + "tLPAREN_ARG", + "tLBRACK", + "tLBRACK2", + "tRBRACK", + "tLBRACE", + "tLBRACE_ARG", + "tSTAR", + "tSTAR2", + "tAMPER", + "tAMPER2", + "tTILDE", + "tPERCENT", + "tDIVIDE", + "tDSTAR", + "tPLUS", + "tMINUS", + "tLT", + "tGT", + "tPIPE", + "tBANG", + "tCARET", + "tLCURLY", + "tRCURLY", + "tBACK_REF2", + "tSYMBEG", + "tSTRING_BEG", + "tXSTRING_BEG", + "tREGEXP_BEG", + "tREGEXP_OPT", + "tWORDS_BEG", + "tQWORDS_BEG", + "tSYMBOLS_BEG", + "tQSYMBOLS_BEG", + "tSTRING_DBEG", + "tSTRING_DVAR", + "tSTRING_END", + "tSTRING_DEND", + "tSTRING", + "tSYMBOL", + "tNL", + "tEH", + "tCOLON", + "tCOMMA", + "tSPACE", + "tSEMI", + "tLAMBDA", + "tLAMBEG", + "tCHARACTER", + "tRATIONAL", + "tIMAGINARY", + "tLABEL_END", + "tANDDOT", + "tBDOT2", + "tBDOT3", + "tEQL", + "tLOWEST", + "$start", + "program", + "top_compstmt", + "@1", + "top_stmts", + "opt_terms", + "top_stmt", + "terms", + "stmt", + "begin_block", + "bodystmt", + "compstmt", + "opt_rescue", + "opt_else", + "opt_ensure", + "stmts", + "stmt_or_begin", + "fitem", + "undef_list", + "expr_value", + "command_asgn", + "mlhs", + "command_call", + "lhs", + "mrhs", + "mrhs_arg", + "expr", + "@2", + "command_rhs", + "var_lhs", + "primary_value", + "opt_call_args", + "rbracket", + "call_op", + "defn_head", + "f_opt_paren_args", + "command", + "arg", + "defs_head", + "backref", + "opt_nl", + "p_top_expr_body", + "@3", + "@4", + "expr_value_do", + "do", + "def_name", + "@5", + "fname", + "k_def", + "singleton", + "dot_or_colon", + "@6", + "block_command", + "block_call", + "operation2", + "command_args", + "cmd_brace_block", + "brace_body", + "fcall", + "@7", + "operation", + "k_return", + "call_args", + "mlhs_basic", + "mlhs_inner", + "rparen", + "mlhs_head", + "mlhs_item", + "mlhs_node", + "mlhs_post", + "user_variable", + "keyword_variable", + "cname", + "cpath", + "op", + "reswords", + "symbol", + "@8", + "arg_rhs", + "simple_numeric", + "rel_expr", + "primary", + "relop", + "@9", + "arg_value", + "aref_args", + "none", + "args", + "trailer", + "assocs", + "paren_args", + "args_forward", + "opt_paren_args", + "opt_block_arg", + "block_arg", + "@10", + "literal", + "strings", + "xstring", + "regexp", + "words", + "qwords", + "symbols", + "qsymbols", + "var_ref", + "assoc_list", + "brace_block", + "method_call", + "lambda", + "then", + "if_tail", + "case_body", + "p_case_body", + "for_var", + "k_class", + "superclass", + "term", + "k_module", + "f_arglist", + "@11", + "@12", + "@13", + "@14", + "@15", + "@16", + "@17", + "f_marg", + "f_norm_arg", + "f_margs", + "f_marg_list", + "f_rest_marg", + "f_any_kwrest", + "f_kwrest", + "f_no_kwarg", + "f_eq", + "block_args_tail", + "@18", + "f_block_kwarg", + "opt_f_block_arg", + "f_block_arg", + "opt_block_args_tail", + "excessed_comma", + "block_param", + "f_arg", + "f_block_optarg", + "f_rest_arg", + "opt_block_param", + "block_param_def", + "opt_bv_decl", + "bv_decls", + "bvar", + "f_bad_arg", + "f_larglist", + "lambda_body", + "@19", + "@20", + "f_args", + "do_block", + "@21", + "@22", + "do_body", + "@23", + "operation3", + "@24", + "@25", + "@26", + "@27", + "@28", + "cases", + "p_top_expr", + "p_cases", + "@29", + "@30", + "p_expr", + "p_args", + "p_find", + "p_args_tail", + "p_kwargs", + "p_as", + "p_variable", + "p_alt", + "p_expr_basic", + "p_lparen", + "p_lbracket", + "p_value", + "p_const", + "rbrace", + "@31", + "@32", + "p_args_head", + "p_arg", + "p_rest", + "p_args_post", + "p_kwarg", + "p_any_kwrest", + "p_kw", + "p_kw_label", + "string_contents", + "p_kwrest", + "kwrest_mark", + "p_kwnorest", + "p_primitive", + "p_var_ref", + "p_expr_ref", + "nonlocal_var", + "exc_list", + "exc_var", + "numeric", + "string", + "string1", + "xstring_contents", + "regexp_contents", + "word_list", + "word", + "string_content", + "symbol_list", + "qword_list", + "qsym_list", + "string_dvar", + "@33", + "ssym", + "dsym", + "@34", + "f_paren_args", + "args_tail", + "@35", + "f_kwarg", + "opt_args_tail", + "f_optarg", + "f_arg_asgn", + "f_arg_item", + "f_label", + "f_kw", + "f_block_kw", + "f_opt", + "f_block_opt", + "restarg_mark", + "blkarg_mark", + "assoc" ] + +Racc_debug_parser = false + +##### State transition tables end ##### + +# reduce 0 omitted + +def _reduce_1(val, _values, result) + @current_arg_stack.push(nil) + @max_numparam_stack.push(static: true) + + result +end + +def _reduce_2(val, _values, result) + result = val[1] + + @current_arg_stack.pop + @max_numparam_stack.pop + + result +end + +def _reduce_3(val, _values, result) + result = @builder.compstmt(val[0]) + + result +end + +def _reduce_4(val, _values, result) + result = [] + + result +end + +def _reduce_5(val, _values, result) + result = [ val[0] ] + + result +end + +def _reduce_6(val, _values, result) + result = val[0] << val[2] + + result +end + +def _reduce_7(val, _values, result) + result = [ val[1] ] + + result +end + +# reduce 8 omitted + +def _reduce_9(val, _values, result) + result = @builder.preexe(val[0], *val[1]) + + result +end + +def _reduce_10(val, _values, result) + result = val + + result +end + +def _reduce_11(val, _values, result) + rescue_bodies = val[1] + else_t, else_ = val[2] + ensure_t, ensure_ = val[3] + + if rescue_bodies.empty? && !else_t.nil? + diagnostic :error, :useless_else, nil, else_t + end + + result = @builder.begin_body(val[0], + rescue_bodies, + else_t, else_, + ensure_t, ensure_) + + result +end + +def _reduce_12(val, _values, result) + result = @builder.compstmt(val[0]) + + result +end + +def _reduce_13(val, _values, result) + result = [] + + result +end + +def _reduce_14(val, _values, result) + result = [ val[0] ] + + result +end + +def _reduce_15(val, _values, result) + result = val[0] << val[2] + + result +end + +def _reduce_16(val, _values, result) + result = [ val[1] ] + + result +end + +# reduce 17 omitted + +def _reduce_18(val, _values, result) + diagnostic :error, :begin_in_method, nil, val[0] + + result +end + +def _reduce_19(val, _values, result) + @lexer.state = :expr_fname + + result +end + +def _reduce_20(val, _values, result) + result = @builder.alias(val[0], val[1], val[3]) + + result +end + +def _reduce_21(val, _values, result) + result = @builder.alias(val[0], + @builder.gvar(val[1]), + @builder.gvar(val[2])) + + result +end + +def _reduce_22(val, _values, result) + result = @builder.alias(val[0], + @builder.gvar(val[1]), + @builder.back_ref(val[2])) + + result +end + +def _reduce_23(val, _values, result) + diagnostic :error, :nth_ref_alias, nil, val[2] + + result +end + +def _reduce_24(val, _values, result) + result = @builder.undef_method(val[0], val[1]) + + result +end + +def _reduce_25(val, _values, result) + result = @builder.condition_mod(val[0], nil, + val[1], val[2]) + + result +end + +def _reduce_26(val, _values, result) + result = @builder.condition_mod(nil, val[0], + val[1], val[2]) + + result +end + +def _reduce_27(val, _values, result) + result = @builder.loop_mod(:while, val[0], val[1], val[2]) + + result +end + +def _reduce_28(val, _values, result) + result = @builder.loop_mod(:until, val[0], val[1], val[2]) + + result +end + +def _reduce_29(val, _values, result) + rescue_body = @builder.rescue_body(val[1], + nil, nil, nil, + nil, val[2]) + + result = @builder.begin_body(val[0], [ rescue_body ]) + + result +end + +def _reduce_30(val, _values, result) + result = @builder.postexe(val[0], val[1], val[2], val[3]) + + result +end + +# reduce 31 omitted + +def _reduce_32(val, _values, result) + result = @builder.multi_assign(val[0], val[1], val[2]) + + result +end + +def _reduce_33(val, _values, result) + result = @builder.assign(val[0], val[1], + @builder.array(nil, val[2], nil)) + + result +end + +def _reduce_34(val, _values, result) + rescue_body = @builder.rescue_body(val[3], + nil, nil, nil, + nil, val[4]) + begin_body = @builder.begin_body(val[2], [ rescue_body ]) + + result = @builder.multi_assign(val[0], val[1], begin_body) + + result +end + +def _reduce_35(val, _values, result) + result = @builder.multi_assign(val[0], val[1], val[2]) + + result +end + +# reduce 36 omitted + +def _reduce_37(val, _values, result) + result = @builder.assign(val[0], val[1], val[2]) + + result +end + +def _reduce_38(val, _values, result) + result = @builder.op_assign(val[0], val[1], val[2]) + + result +end + +def _reduce_39(val, _values, result) + result = @builder.op_assign( + @builder.index( + val[0], val[1], val[2], val[3]), + val[4], val[5]) + + result +end + +def _reduce_40(val, _values, result) + result = @builder.op_assign( + @builder.call_method( + val[0], val[1], val[2]), + val[3], val[4]) + + result +end + +def _reduce_41(val, _values, result) + result = @builder.op_assign( + @builder.call_method( + val[0], val[1], val[2]), + val[3], val[4]) + + result +end + +def _reduce_42(val, _values, result) + const = @builder.const_op_assignable( + @builder.const_fetch(val[0], val[1], val[2])) + result = @builder.op_assign(const, val[3], val[4]) + + result +end + +def _reduce_43(val, _values, result) + result = @builder.op_assign( + @builder.call_method( + val[0], val[1], val[2]), + val[3], val[4]) + + result +end + +def _reduce_44(val, _values, result) + def_t, (name_t, ctx) = val[0] + endless_method_name(name_t) + + result = @builder.def_endless_method(def_t, name_t, + val[1], val[2], val[3]) + + local_pop + @current_arg_stack.pop + @context.in_def = ctx.in_def + + result +end + +def _reduce_45(val, _values, result) + def_t, (name_t, ctx) = val[0] + endless_method_name(name_t) + + rescue_body = @builder.rescue_body(val[4], + nil, nil, nil, + nil, val[5]) + + method_body = @builder.begin_body(val[3], [ rescue_body ]) + + result = @builder.def_endless_method(def_t, name_t, + val[1], val[2], method_body) + + local_pop + @current_arg_stack.pop + @context.in_def = ctx.in_def + + result +end + +def _reduce_46(val, _values, result) + def_t, recv, dot_t, (name_t, ctx) = val[0] + endless_method_name(name_t) + + result = @builder.def_endless_singleton(def_t, recv, dot_t, name_t, + val[1], val[2], val[3]) + + local_pop + @current_arg_stack.pop + @context.in_def = ctx.in_def + + result +end + +def _reduce_47(val, _values, result) + def_t, recv, dot_t, (name_t, ctx) = val[0] + endless_method_name(name_t) + + rescue_body = @builder.rescue_body(val[4], + nil, nil, nil, + nil, val[5]) + + method_body = @builder.begin_body(val[3], [ rescue_body ]) + + result = @builder.def_endless_singleton(def_t, recv, dot_t, name_t, + val[1], val[2], method_body) + + local_pop + @current_arg_stack.pop + @context.in_def = ctx.in_def + + result +end + +def _reduce_48(val, _values, result) + @builder.op_assign(val[0], val[1], val[2]) + + result +end + +# reduce 49 omitted + +def _reduce_50(val, _values, result) + rescue_body = @builder.rescue_body(val[1], + nil, nil, nil, + nil, val[2]) + + result = @builder.begin_body(val[0], [ rescue_body ]) + + result +end + +# reduce 51 omitted + +# reduce 52 omitted + +def _reduce_53(val, _values, result) + result = @builder.logical_op(:and, val[0], val[1], val[2]) + + result +end + +def _reduce_54(val, _values, result) + result = @builder.logical_op(:or, val[0], val[1], val[2]) + + result +end + +def _reduce_55(val, _values, result) + result = @builder.not_op(val[0], nil, val[2], nil) + + result +end + +def _reduce_56(val, _values, result) + result = @builder.not_op(val[0], nil, val[1], nil) + + result +end + +def _reduce_57(val, _values, result) + @lexer.state = :expr_beg + @lexer.command_start = false + @pattern_variables.push + + result = @context.in_kwarg + @context.in_kwarg = true + + result +end + +def _reduce_58(val, _values, result) + @pattern_variables.pop + @context.in_kwarg = val[2] + result = @builder.match_pattern(val[0], val[1], val[3]) + + result +end + +def _reduce_59(val, _values, result) + @lexer.state = :expr_beg + @lexer.command_start = false + @pattern_variables.push + + result = @context.in_kwarg + @context.in_kwarg = true + + result +end + +def _reduce_60(val, _values, result) + @pattern_variables.pop + @context.in_kwarg = val[2] + result = @builder.match_pattern_p(val[0], val[1], val[3]) + + result +end + +# reduce 61 omitted + +# reduce 62 omitted + +def _reduce_63(val, _values, result) + @lexer.cond.push(true) + + result +end + +def _reduce_64(val, _values, result) + @lexer.cond.pop + result = [ val[1], val[2] ] + + result +end + +def _reduce_65(val, _values, result) + local_push + @current_arg_stack.push(nil) + + result = [ val[0], @context.dup ] + @context.in_def = true + + result +end + +def _reduce_66(val, _values, result) + result = [ val[0], val[1] ] + + result +end + +def _reduce_67(val, _values, result) + @lexer.state = :expr_fname + @context.in_argdef = true + + result +end + +def _reduce_68(val, _values, result) + result = [ val[0], val[1], val[2], val[4] ] + + result +end + +# reduce 69 omitted + +# reduce 70 omitted + +# reduce 71 omitted + +def _reduce_72(val, _values, result) + result = @builder.call_method(val[0], val[1], val[2], + nil, val[3], nil) + + result +end + +def _reduce_73(val, _values, result) + result = @context.dup + @context.in_block = true + + result +end + +def _reduce_74(val, _values, result) + @context.in_block = val[1].in_block + result = [ val[0], *val[2], val[3] ] + + result +end + +# reduce 75 omitted + +def _reduce_76(val, _values, result) + result = @builder.call_method(nil, nil, val[0], + nil, val[1], nil) + + result +end + +def _reduce_77(val, _values, result) + method_call = @builder.call_method(nil, nil, val[0], + nil, val[1], nil) + + begin_t, args, body, end_t = val[2] + result = @builder.block(method_call, + begin_t, args, body, end_t) + + result +end + +def _reduce_78(val, _values, result) + result = @builder.call_method(val[0], val[1], val[2], + nil, val[3], nil) + + result +end + +def _reduce_79(val, _values, result) + method_call = @builder.call_method(val[0], val[1], val[2], + nil, val[3], nil) + + begin_t, args, body, end_t = val[4] + result = @builder.block(method_call, + begin_t, args, body, end_t) + + result +end + +def _reduce_80(val, _values, result) + result = @builder.call_method(val[0], val[1], val[2], + nil, val[3], nil) + + result +end + +def _reduce_81(val, _values, result) + method_call = @builder.call_method(val[0], val[1], val[2], + nil, val[3], nil) + + begin_t, args, body, end_t = val[4] + result = @builder.block(method_call, + begin_t, args, body, end_t) + + result +end + +def _reduce_82(val, _values, result) + result = @builder.keyword_cmd(:super, val[0], + nil, val[1], nil) + + result +end + +def _reduce_83(val, _values, result) + result = @builder.keyword_cmd(:yield, val[0], + nil, val[1], nil) + + result +end + +def _reduce_84(val, _values, result) + result = @builder.keyword_cmd(:return, val[0], + nil, val[1], nil) + + result +end + +def _reduce_85(val, _values, result) + result = @builder.keyword_cmd(:break, val[0], + nil, val[1], nil) + + result +end + +def _reduce_86(val, _values, result) + result = @builder.keyword_cmd(:next, val[0], + nil, val[1], nil) + + result +end + +def _reduce_87(val, _values, result) + result = @builder.multi_lhs(nil, val[0], nil) + + result +end + +def _reduce_88(val, _values, result) + result = @builder.begin(val[0], val[1], val[2]) + + result +end + +def _reduce_89(val, _values, result) + result = @builder.multi_lhs(nil, val[0], nil) + + result +end + +def _reduce_90(val, _values, result) + result = @builder.multi_lhs(val[0], val[1], val[2]) + + result +end + +# reduce 91 omitted + +def _reduce_92(val, _values, result) + result = val[0]. + push(val[1]) + + result +end + +def _reduce_93(val, _values, result) + result = val[0]. + push(@builder.splat(val[1], val[2])) + + result +end + +def _reduce_94(val, _values, result) + result = val[0]. + push(@builder.splat(val[1], val[2])). + concat(val[4]) + + result +end + +def _reduce_95(val, _values, result) + result = val[0]. + push(@builder.splat(val[1])) + + result +end + +def _reduce_96(val, _values, result) + result = val[0]. + push(@builder.splat(val[1])). + concat(val[3]) + + result +end + +def _reduce_97(val, _values, result) + result = [ @builder.splat(val[0], val[1]) ] + + result +end + +def _reduce_98(val, _values, result) + result = [ @builder.splat(val[0], val[1]), + *val[3] ] + + result +end + +def _reduce_99(val, _values, result) + result = [ @builder.splat(val[0]) ] + + result +end + +def _reduce_100(val, _values, result) + result = [ @builder.splat(val[0]), + *val[2] ] + + result +end + +# reduce 101 omitted + +def _reduce_102(val, _values, result) + result = @builder.begin(val[0], val[1], val[2]) + + result +end + +def _reduce_103(val, _values, result) + result = [ val[0] ] + + result +end + +def _reduce_104(val, _values, result) + result = val[0] << val[1] + + result +end + +def _reduce_105(val, _values, result) + result = [ val[0] ] + + result +end + +def _reduce_106(val, _values, result) + result = val[0] << val[2] + + result +end + +def _reduce_107(val, _values, result) + result = @builder.assignable(val[0]) + + result +end + +def _reduce_108(val, _values, result) + result = @builder.assignable(val[0]) + + result +end + +def _reduce_109(val, _values, result) + result = @builder.index_asgn(val[0], val[1], val[2], val[3]) + + result +end + +def _reduce_110(val, _values, result) + if (val[1][0] == :anddot) + diagnostic :error, :csend_in_lhs_of_masgn, nil, val[1] + end + + result = @builder.attr_asgn(val[0], val[1], val[2]) + + result +end + +def _reduce_111(val, _values, result) + result = @builder.attr_asgn(val[0], val[1], val[2]) + + result +end + +def _reduce_112(val, _values, result) + if (val[1][0] == :anddot) + diagnostic :error, :csend_in_lhs_of_masgn, nil, val[1] + end + + result = @builder.attr_asgn(val[0], val[1], val[2]) + + result +end + +def _reduce_113(val, _values, result) + result = @builder.assignable( + @builder.const_fetch(val[0], val[1], val[2])) + + result +end + +def _reduce_114(val, _values, result) + result = @builder.assignable( + @builder.const_global(val[0], val[1])) + + result +end + +def _reduce_115(val, _values, result) + result = @builder.assignable(val[0]) + + result +end + +def _reduce_116(val, _values, result) + result = @builder.assignable(val[0]) + + result +end + +def _reduce_117(val, _values, result) + result = @builder.assignable(val[0]) + + result +end + +def _reduce_118(val, _values, result) + result = @builder.index_asgn(val[0], val[1], val[2], val[3]) + + result +end + +def _reduce_119(val, _values, result) + result = @builder.attr_asgn(val[0], val[1], val[2]) + + result +end + +def _reduce_120(val, _values, result) + result = @builder.attr_asgn(val[0], val[1], val[2]) + + result +end + +def _reduce_121(val, _values, result) + result = @builder.attr_asgn(val[0], val[1], val[2]) + + result +end + +def _reduce_122(val, _values, result) + result = @builder.assignable( + @builder.const_fetch(val[0], val[1], val[2])) + + result +end + +def _reduce_123(val, _values, result) + result = @builder.assignable( + @builder.const_global(val[0], val[1])) + + result +end + +def _reduce_124(val, _values, result) + result = @builder.assignable(val[0]) + + result +end + +def _reduce_125(val, _values, result) + diagnostic :error, :module_name_const, nil, val[0] + + result +end + +# reduce 126 omitted + +def _reduce_127(val, _values, result) + result = @builder.const_global(val[0], val[1]) + + result +end + +def _reduce_128(val, _values, result) + result = @builder.const(val[0]) + + result +end + +def _reduce_129(val, _values, result) + result = @builder.const_fetch(val[0], val[1], val[2]) + + result +end + +# reduce 130 omitted + +# reduce 131 omitted + +# reduce 132 omitted + +# reduce 133 omitted + +# reduce 134 omitted + +def _reduce_135(val, _values, result) + result = @builder.symbol_internal(val[0]) + + result +end + +# reduce 136 omitted + +def _reduce_137(val, _values, result) + result = [ val[0] ] + + result +end + +def _reduce_138(val, _values, result) + @lexer.state = :expr_fname + + result +end + +def _reduce_139(val, _values, result) + result = val[0] << val[3] + + result +end + +# reduce 140 omitted + +# reduce 141 omitted + +# reduce 142 omitted + +# reduce 143 omitted + +# reduce 144 omitted + +# reduce 145 omitted + +# reduce 146 omitted + +# reduce 147 omitted + +# reduce 148 omitted + +# reduce 149 omitted + +# reduce 150 omitted + +# reduce 151 omitted + +# reduce 152 omitted + +# reduce 153 omitted + +# reduce 154 omitted + +# reduce 155 omitted + +# reduce 156 omitted + +# reduce 157 omitted + +# reduce 158 omitted + +# reduce 159 omitted + +# reduce 160 omitted + +# reduce 161 omitted + +# reduce 162 omitted + +# reduce 163 omitted + +# reduce 164 omitted + +# reduce 165 omitted + +# reduce 166 omitted + +# reduce 167 omitted + +# reduce 168 omitted + +# reduce 169 omitted + +# reduce 170 omitted + +# reduce 171 omitted + +# reduce 172 omitted + +# reduce 173 omitted + +# reduce 174 omitted + +# reduce 175 omitted + +# reduce 176 omitted + +# reduce 177 omitted + +# reduce 178 omitted + +# reduce 179 omitted + +# reduce 180 omitted + +# reduce 181 omitted + +# reduce 182 omitted + +# reduce 183 omitted + +# reduce 184 omitted + +# reduce 185 omitted + +# reduce 186 omitted + +# reduce 187 omitted + +# reduce 188 omitted + +# reduce 189 omitted + +# reduce 190 omitted + +# reduce 191 omitted + +# reduce 192 omitted + +# reduce 193 omitted + +# reduce 194 omitted + +# reduce 195 omitted + +# reduce 196 omitted + +# reduce 197 omitted + +# reduce 198 omitted + +# reduce 199 omitted + +# reduce 200 omitted + +# reduce 201 omitted + +# reduce 202 omitted + +# reduce 203 omitted + +# reduce 204 omitted + +# reduce 205 omitted + +# reduce 206 omitted + +# reduce 207 omitted + +# reduce 208 omitted + +# reduce 209 omitted + +# reduce 210 omitted + +def _reduce_211(val, _values, result) + result = @builder.assign(val[0], val[1], val[2]) + + result +end + +def _reduce_212(val, _values, result) + result = @builder.op_assign(val[0], val[1], val[2]) + + result +end + +def _reduce_213(val, _values, result) + result = @builder.op_assign( + @builder.index( + val[0], val[1], val[2], val[3]), + val[4], val[5]) + + result +end + +def _reduce_214(val, _values, result) + result = @builder.op_assign( + @builder.call_method( + val[0], val[1], val[2]), + val[3], val[4]) + + result +end + +def _reduce_215(val, _values, result) + result = @builder.op_assign( + @builder.call_method( + val[0], val[1], val[2]), + val[3], val[4]) + + result +end + +def _reduce_216(val, _values, result) + result = @builder.op_assign( + @builder.call_method( + val[0], val[1], val[2]), + val[3], val[4]) + + result +end + +def _reduce_217(val, _values, result) + const = @builder.const_op_assignable( + @builder.const_fetch(val[0], val[1], val[2])) + result = @builder.op_assign(const, val[3], val[4]) + + result +end + +def _reduce_218(val, _values, result) + const = @builder.const_op_assignable( + @builder.const_global(val[0], val[1])) + result = @builder.op_assign(const, val[2], val[3]) + + result +end + +def _reduce_219(val, _values, result) + result = @builder.op_assign(val[0], val[1], val[2]) + + result +end + +def _reduce_220(val, _values, result) + result = @builder.range_inclusive(val[0], val[1], val[2]) + + result +end + +def _reduce_221(val, _values, result) + result = @builder.range_exclusive(val[0], val[1], val[2]) + + result +end + +def _reduce_222(val, _values, result) + result = @builder.range_inclusive(val[0], val[1], nil) + + result +end + +def _reduce_223(val, _values, result) + result = @builder.range_exclusive(val[0], val[1], nil) + + result +end + +def _reduce_224(val, _values, result) + result = @builder.range_inclusive(nil, val[0], val[1]) + + result +end + +def _reduce_225(val, _values, result) + result = @builder.range_exclusive(nil, val[0], val[1]) + + result +end + +def _reduce_226(val, _values, result) + result = @builder.binary_op(val[0], val[1], val[2]) + + result +end + +def _reduce_227(val, _values, result) + result = @builder.binary_op(val[0], val[1], val[2]) + + result +end + +def _reduce_228(val, _values, result) + result = @builder.binary_op(val[0], val[1], val[2]) + + result +end + +def _reduce_229(val, _values, result) + result = @builder.binary_op(val[0], val[1], val[2]) + + result +end + +def _reduce_230(val, _values, result) + result = @builder.binary_op(val[0], val[1], val[2]) + + result +end + +def _reduce_231(val, _values, result) + result = @builder.binary_op(val[0], val[1], val[2]) + + result +end + +def _reduce_232(val, _values, result) + result = @builder.unary_op(val[0], + @builder.binary_op( + val[1], val[2], val[3])) + + result +end + +def _reduce_233(val, _values, result) + result = @builder.unary_op(val[0], val[1]) + + result +end + +def _reduce_234(val, _values, result) + result = @builder.unary_op(val[0], val[1]) + + result +end + +def _reduce_235(val, _values, result) + result = @builder.binary_op(val[0], val[1], val[2]) + + result +end + +def _reduce_236(val, _values, result) + result = @builder.binary_op(val[0], val[1], val[2]) + + result +end + +def _reduce_237(val, _values, result) + result = @builder.binary_op(val[0], val[1], val[2]) + + result +end + +def _reduce_238(val, _values, result) + result = @builder.binary_op(val[0], val[1], val[2]) + + result +end + +# reduce 239 omitted + +def _reduce_240(val, _values, result) + result = @builder.binary_op(val[0], val[1], val[2]) + + result +end + +def _reduce_241(val, _values, result) + result = @builder.binary_op(val[0], val[1], val[2]) + + result +end + +def _reduce_242(val, _values, result) + result = @builder.binary_op(val[0], val[1], val[2]) + + result +end + +def _reduce_243(val, _values, result) + result = @builder.match_op(val[0], val[1], val[2]) + + result +end + +def _reduce_244(val, _values, result) + result = @builder.binary_op(val[0], val[1], val[2]) + + result +end + +def _reduce_245(val, _values, result) + result = @builder.not_op(val[0], nil, val[1], nil) + + result +end + +def _reduce_246(val, _values, result) + result = @builder.unary_op(val[0], val[1]) + + result +end + +def _reduce_247(val, _values, result) + result = @builder.binary_op(val[0], val[1], val[2]) + + result +end + +def _reduce_248(val, _values, result) + result = @builder.binary_op(val[0], val[1], val[2]) + + result +end + +def _reduce_249(val, _values, result) + result = @builder.logical_op(:and, val[0], val[1], val[2]) + + result +end + +def _reduce_250(val, _values, result) + result = @builder.logical_op(:or, val[0], val[1], val[2]) + + result +end + +def _reduce_251(val, _values, result) + @context.in_defined = true + + result +end + +def _reduce_252(val, _values, result) + @context.in_defined = false + result = @builder.keyword_cmd(:defined?, val[0], nil, [ val[3] ], nil) + + result +end + +def _reduce_253(val, _values, result) + result = @builder.ternary(val[0], val[1], + val[2], val[4], val[5]) + + result +end + +def _reduce_254(val, _values, result) + def_t, (name_t, ctx) = val[0] + endless_method_name(name_t) + + result = @builder.def_endless_method(def_t, name_t, + val[1], val[2], val[3]) + + local_pop + @current_arg_stack.pop + @context.in_def = ctx.in_def + + result +end + +def _reduce_255(val, _values, result) + def_t, (name_t, ctx) = val[0] + endless_method_name(name_t) + + rescue_body = @builder.rescue_body(val[4], + nil, nil, nil, + nil, val[5]) + + method_body = @builder.begin_body(val[3], [ rescue_body ]) + + result = @builder.def_endless_method(def_t, name_t, + val[1], val[2], method_body) + + local_pop + @current_arg_stack.pop + @context.in_def = ctx.in_def + + result +end + +def _reduce_256(val, _values, result) + def_t, recv, dot_t, (name_t, ctx) = val[0] + endless_method_name(name_t) + + result = @builder.def_endless_singleton(def_t, recv, dot_t, name_t, + val[1], val[2], val[3]) + + local_pop + @current_arg_stack.pop + @context.in_def = ctx.in_def + + result +end + +def _reduce_257(val, _values, result) + def_t, recv, dot_t, (name_t, ctx) = val[0] + endless_method_name(name_t) + + rescue_body = @builder.rescue_body(val[4], + nil, nil, nil, + nil, val[5]) + + method_body = @builder.begin_body(val[3], [ rescue_body ]) + + result = @builder.def_endless_singleton(def_t, recv, dot_t, name_t, + val[1], val[2], method_body) + + local_pop + @current_arg_stack.pop + @context.in_def = ctx.in_def + + result +end + +# reduce 258 omitted + +# reduce 259 omitted + +# reduce 260 omitted + +# reduce 261 omitted + +# reduce 262 omitted + +def _reduce_263(val, _values, result) + result = @builder.binary_op(val[0], val[1], val[2]) + + result +end + +def _reduce_264(val, _values, result) + result = @builder.binary_op(val[0], val[1], val[2]) + + result +end + +# reduce 265 omitted + +# reduce 266 omitted + +# reduce 267 omitted + +def _reduce_268(val, _values, result) + result = val[0] << @builder.associate(nil, val[2], nil) + + result +end + +def _reduce_269(val, _values, result) + result = [ @builder.associate(nil, val[0], nil) ] + + result +end + +# reduce 270 omitted + +def _reduce_271(val, _values, result) + rescue_body = @builder.rescue_body(val[1], + nil, nil, nil, + nil, val[2]) + + result = @builder.begin_body(val[0], [ rescue_body ]) + + result +end + +def _reduce_272(val, _values, result) + result = val + + result +end + +def _reduce_273(val, _values, result) + unless @static_env.declared_forward_args? + diagnostic :error, :unexpected_token, { :token => 'tBDOT3' } , val[3] + end + + result = [val[0], [*val[1], @builder.forwarded_args(val[3])], val[4]] + + result +end + +def _reduce_274(val, _values, result) + unless @static_env.declared_forward_args? + diagnostic :error, :unexpected_token, { :token => 'tBDOT3' } , val[1] + end + + result = [val[0], [@builder.forwarded_args(val[1])], val[2]] + + result +end + +def _reduce_275(val, _values, result) + result = [ nil, [], nil ] + + result +end + +# reduce 276 omitted + +def _reduce_277(val, _values, result) + result = [] + + result +end + +# reduce 278 omitted + +# reduce 279 omitted + +def _reduce_280(val, _values, result) + result = val[0] << @builder.associate(nil, val[2], nil) + + result +end + +def _reduce_281(val, _values, result) + result = [ @builder.associate(nil, val[0], nil) ] + + result +end + +def _reduce_282(val, _values, result) + result = [ val[0] ] + + result +end + +def _reduce_283(val, _values, result) + result = val[0].concat(val[1]) + + result +end + +def _reduce_284(val, _values, result) + result = [ @builder.associate(nil, val[0], nil) ] + result.concat(val[1]) + + result +end + +def _reduce_285(val, _values, result) + assocs = @builder.associate(nil, val[2], nil) + result = val[0] << assocs + result.concat(val[3]) + + result +end + +def _reduce_286(val, _values, result) + result = [ val[0] ] + + result +end + +def _reduce_287(val, _values, result) + # When branch gets invoked by RACC's lookahead + # and command args start with '[' or '(' + # we need to put `true` to the cmdarg stack + # **before** `false` pushed by lexer + # m [], n + # ^ + # Right here we have cmdarg [...0] because + # lexer pushed it on '[' + # We need to modify cmdarg stack to [...10] + # + # For all other cases (like `m n` or `m n, []`) we simply put 1 to the stack + # and later lexer pushes corresponding bits on top of it. + last_token = @last_token[0] + lookahead = last_token == :tLBRACK || last_token == :tLPAREN_ARG + + if lookahead + top = @lexer.cmdarg.pop + @lexer.cmdarg.push(true) + @lexer.cmdarg.push(top) + else + @lexer.cmdarg.push(true) + end + + result +end + +def _reduce_288(val, _values, result) + # call_args can be followed by tLBRACE_ARG (that does cmdarg.push(0) in the lexer) + # but the push must be done after cmdarg.pop() in the parser. + # So this code does cmdarg.pop() to pop 0 pushed by tLBRACE_ARG, + # cmdarg.pop() to pop 1 pushed by command_args, + # and cmdarg.push(0) to restore back the flag set by tLBRACE_ARG. + last_token = @last_token[0] + lookahead = last_token == :tLBRACE_ARG + if lookahead + top = @lexer.cmdarg.pop + @lexer.cmdarg.pop + @lexer.cmdarg.push(top) + else + @lexer.cmdarg.pop + end + + result = val[1] + + result +end + +def _reduce_289(val, _values, result) + result = @builder.block_pass(val[0], val[1]) + + result +end + +def _reduce_290(val, _values, result) + if !@static_env.declared_anonymous_blockarg? + diagnostic :error, :no_anonymous_blockarg, nil, val[0] + end + + result = @builder.block_pass(val[0], nil) + + result +end + +def _reduce_291(val, _values, result) + result = [ val[1] ] + + result +end + +def _reduce_292(val, _values, result) + result = [] + + result +end + +def _reduce_293(val, _values, result) + result = [ val[0] ] + + result +end + +def _reduce_294(val, _values, result) + result = [ @builder.splat(val[0], val[1]) ] + + result +end + +def _reduce_295(val, _values, result) + result = val[0] << val[2] + + result +end + +def _reduce_296(val, _values, result) + result = val[0] << @builder.splat(val[2], val[3]) + + result +end + +def _reduce_297(val, _values, result) + result = @builder.array(nil, val[0], nil) + + result +end + +# reduce 298 omitted + +def _reduce_299(val, _values, result) + result = val[0] << val[2] + + result +end + +def _reduce_300(val, _values, result) + result = val[0] << @builder.splat(val[2], val[3]) + + result +end + +def _reduce_301(val, _values, result) + result = [ @builder.splat(val[0], val[1]) ] + + result +end + +# reduce 302 omitted + +# reduce 303 omitted + +# reduce 304 omitted + +# reduce 305 omitted + +# reduce 306 omitted + +# reduce 307 omitted + +# reduce 308 omitted + +# reduce 309 omitted + +# reduce 310 omitted + +# reduce 311 omitted + +def _reduce_312(val, _values, result) + result = @builder.call_method(nil, nil, val[0]) + + result +end + +def _reduce_313(val, _values, result) + @lexer.cmdarg.push(false) + + result +end + +def _reduce_314(val, _values, result) + @lexer.cmdarg.pop + + result = @builder.begin_keyword(val[0], val[2], val[3]) + + result +end + +def _reduce_315(val, _values, result) + @lexer.state = :expr_endarg + + result +end + +def _reduce_316(val, _values, result) + result = @builder.begin(val[0], val[1], val[3]) + + result +end + +def _reduce_317(val, _values, result) + @lexer.state = :expr_endarg + + result +end + +def _reduce_318(val, _values, result) + result = @builder.begin(val[0], nil, val[3]) + + result +end + +def _reduce_319(val, _values, result) + result = @builder.begin(val[0], val[1], val[2]) + + result +end + +def _reduce_320(val, _values, result) + result = @builder.const_fetch(val[0], val[1], val[2]) + + result +end + +def _reduce_321(val, _values, result) + result = @builder.const_global(val[0], val[1]) + + result +end + +def _reduce_322(val, _values, result) + result = @builder.array(val[0], val[1], val[2]) + + result +end + +def _reduce_323(val, _values, result) + result = @builder.associate(val[0], val[1], val[2]) + + result +end + +def _reduce_324(val, _values, result) + result = @builder.keyword_cmd(:return, val[0]) + + result +end + +def _reduce_325(val, _values, result) + result = @builder.keyword_cmd(:yield, val[0], val[1], val[2], val[3]) + + result +end + +def _reduce_326(val, _values, result) + result = @builder.keyword_cmd(:yield, val[0], val[1], [], val[2]) + + result +end + +def _reduce_327(val, _values, result) + result = @builder.keyword_cmd(:yield, val[0]) + + result +end + +def _reduce_328(val, _values, result) + @context.in_defined = true + + result +end + +def _reduce_329(val, _values, result) + @context.in_defined = false + result = @builder.keyword_cmd(:defined?, val[0], + val[2], [ val[4] ], val[5]) + + result +end + +def _reduce_330(val, _values, result) + result = @builder.not_op(val[0], val[1], val[2], val[3]) + + result +end + +def _reduce_331(val, _values, result) + result = @builder.not_op(val[0], val[1], nil, val[2]) + + result +end + +def _reduce_332(val, _values, result) + method_call = @builder.call_method(nil, nil, val[0]) + + begin_t, args, body, end_t = val[1] + result = @builder.block(method_call, + begin_t, args, body, end_t) + + result +end + +# reduce 333 omitted + +def _reduce_334(val, _values, result) + begin_t, args, body, end_t = val[1] + result = @builder.block(val[0], + begin_t, args, body, end_t) + + result +end + +# reduce 335 omitted + +def _reduce_336(val, _values, result) + else_t, else_ = val[4] + result = @builder.condition(val[0], val[1], val[2], + val[3], else_t, + else_, val[5]) + + result +end + +def _reduce_337(val, _values, result) + else_t, else_ = val[4] + result = @builder.condition(val[0], val[1], val[2], + else_, else_t, + val[3], val[5]) + + result +end + +def _reduce_338(val, _values, result) + result = @builder.loop(:while, val[0], *val[1], val[2], val[3]) + + result +end + +def _reduce_339(val, _values, result) + result = @builder.loop(:until, val[0], *val[1], val[2], val[3]) + + result +end + +def _reduce_340(val, _values, result) + *when_bodies, (else_t, else_body) = *val[3] + + result = @builder.case(val[0], val[1], + when_bodies, else_t, else_body, + val[4]) + + result +end + +def _reduce_341(val, _values, result) + *when_bodies, (else_t, else_body) = *val[2] + + result = @builder.case(val[0], nil, + when_bodies, else_t, else_body, + val[3]) + + result +end + +def _reduce_342(val, _values, result) + *in_bodies, (else_t, else_body) = *val[3] + + result = @builder.case_match(val[0], val[1], + in_bodies, else_t, else_body, + val[4]) + + result +end + +def _reduce_343(val, _values, result) + result = @builder.for(val[0], val[1], val[2], *val[3], val[4], val[5]) + + result +end + +def _reduce_344(val, _values, result) + @context.in_class = true + local_push + + result +end + +def _reduce_345(val, _values, result) + k_class, ctx = val[0] + if @context.in_def + diagnostic :error, :class_in_def, nil, k_class + end + lt_t, superclass = val[2] + result = @builder.def_class(k_class, val[1], + lt_t, superclass, + val[4], val[5]) + + local_pop + @context.in_class = ctx.in_class + + result +end + +def _reduce_346(val, _values, result) + @context.in_def = false + @context.in_class = false + local_push + + result +end + +def _reduce_347(val, _values, result) + k_class, ctx = val[0] + result = @builder.def_sclass(k_class, val[1], val[2], + val[5], val[6]) + + local_pop + @context.in_def = ctx.in_def + @context.in_class = ctx.in_class + + result +end + +def _reduce_348(val, _values, result) + @context.in_class = true + local_push + + result +end + +def _reduce_349(val, _values, result) + k_mod, ctx = val[0] + if @context.in_def + diagnostic :error, :module_in_def, nil, k_mod + end + result = @builder.def_module(k_mod, val[1], + val[3], val[4]) + + local_pop + @context.in_class = ctx.in_class + + result +end + +def _reduce_350(val, _values, result) + def_t, (name_t, ctx) = val[0] + result = @builder.def_method(def_t, name_t, val[1], + val[2], val[3]) + + local_pop + @current_arg_stack.pop + @context.in_def = ctx.in_def + + result +end + +def _reduce_351(val, _values, result) + def_t, recv, dot_t, (name_t, ctx) = val[0] + result = @builder.def_singleton(def_t, recv, dot_t, name_t, val[1], + val[2], val[3]) + + local_pop + @current_arg_stack.pop + @context.in_def = ctx.in_def + + result +end + +def _reduce_352(val, _values, result) + result = @builder.keyword_cmd(:break, val[0]) + + result +end + +def _reduce_353(val, _values, result) + result = @builder.keyword_cmd(:next, val[0]) + + result +end + +def _reduce_354(val, _values, result) + result = @builder.keyword_cmd(:redo, val[0]) + + result +end + +def _reduce_355(val, _values, result) + result = @builder.keyword_cmd(:retry, val[0]) + + result +end + +# reduce 356 omitted + +def _reduce_357(val, _values, result) + result = [ val[0], @context.dup ] + + result +end + +def _reduce_358(val, _values, result) + result = [ val[0], @context.dup ] + + result +end + +def _reduce_359(val, _values, result) + result = val[0] + @context.in_argdef = true + + result +end + +def _reduce_360(val, _values, result) + if @context.in_class && !@context.in_def && !(context.in_block || context.in_lambda) + diagnostic :error, :invalid_return, nil, val[0] + end + + result +end + +# reduce 361 omitted + +# reduce 362 omitted + +def _reduce_363(val, _values, result) + result = val[1] + + result +end + +# reduce 364 omitted + +# reduce 365 omitted + +# reduce 366 omitted + +def _reduce_367(val, _values, result) + else_t, else_ = val[4] + result = [ val[0], + @builder.condition(val[0], val[1], val[2], + val[3], else_t, + else_, nil), + ] + + result +end + +# reduce 368 omitted + +def _reduce_369(val, _values, result) + result = val + + result +end + +# reduce 370 omitted + +# reduce 371 omitted + +def _reduce_372(val, _values, result) + result = @builder.arg(val[0]) + + result +end + +def _reduce_373(val, _values, result) + result = @builder.multi_lhs(val[0], val[1], val[2]) + + result +end + +def _reduce_374(val, _values, result) + result = [ val[0] ] + + result +end + +def _reduce_375(val, _values, result) + result = val[0] << val[2] + + result +end + +# reduce 376 omitted + +def _reduce_377(val, _values, result) + result = val[0]. + push(val[2]) + + result +end + +def _reduce_378(val, _values, result) + result = val[0]. + push(val[2]). + concat(val[4]) + + result +end + +def _reduce_379(val, _values, result) + result = [ val[0] ] + + result +end + +def _reduce_380(val, _values, result) + result = [ val[0], *val[2] ] + + result +end + +def _reduce_381(val, _values, result) + result = @builder.restarg(val[0], val[1]) + + result +end + +def _reduce_382(val, _values, result) + result = @builder.restarg(val[0]) + + result +end + +# reduce 383 omitted + +# reduce 384 omitted + +def _reduce_385(val, _values, result) + @context.in_argdef = false + + result +end + +def _reduce_386(val, _values, result) + result = val[1] + + result +end + +def _reduce_387(val, _values, result) + result = val[0].concat(val[2]).concat(val[3]) + + result +end + +def _reduce_388(val, _values, result) + result = val[0].concat(val[1]) + + result +end + +def _reduce_389(val, _values, result) + result = val[0].concat(val[1]) + + result +end + +def _reduce_390(val, _values, result) + result = [ val[0] ] + + result +end + +def _reduce_391(val, _values, result) + result = val[1] + + result +end + +def _reduce_392(val, _values, result) + result = [] + + result +end + +# reduce 393 omitted + +def _reduce_394(val, _values, result) + result = val[0]. + concat(val[2]). + concat(val[4]). + concat(val[5]) + + result +end + +def _reduce_395(val, _values, result) + result = val[0]. + concat(val[2]). + concat(val[4]). + concat(val[6]). + concat(val[7]) + + result +end + +def _reduce_396(val, _values, result) + result = val[0]. + concat(val[2]). + concat(val[3]) + + result +end + +def _reduce_397(val, _values, result) + result = val[0]. + concat(val[2]). + concat(val[4]). + concat(val[5]) + + result +end + +def _reduce_398(val, _values, result) + result = val[0]. + concat(val[2]). + concat(val[3]) + + result +end + +# reduce 399 omitted + +def _reduce_400(val, _values, result) + result = val[0]. + concat(val[2]). + concat(val[4]). + concat(val[5]) + + result +end + +def _reduce_401(val, _values, result) + if val[1].empty? && val[0].size == 1 + result = [@builder.procarg0(val[0][0])] + else + result = val[0].concat(val[1]) + end + + result +end + +def _reduce_402(val, _values, result) + result = val[0]. + concat(val[2]). + concat(val[3]) + + result +end + +def _reduce_403(val, _values, result) + result = val[0]. + concat(val[2]). + concat(val[4]). + concat(val[5]) + + result +end + +def _reduce_404(val, _values, result) + result = val[0]. + concat(val[1]) + + result +end + +def _reduce_405(val, _values, result) + result = val[0]. + concat(val[2]). + concat(val[3]) + + result +end + +def _reduce_406(val, _values, result) + result = val[0]. + concat(val[1]) + + result +end + +def _reduce_407(val, _values, result) + result = val[0]. + concat(val[2]). + concat(val[3]) + + result +end + +# reduce 408 omitted + +def _reduce_409(val, _values, result) + result = @builder.args(nil, [], nil) + + result +end + +def _reduce_410(val, _values, result) + @lexer.state = :expr_value + + result +end + +def _reduce_411(val, _values, result) + @max_numparam_stack.has_ordinary_params! + @current_arg_stack.set(nil) + @context.in_argdef = false + result = @builder.args(val[0], val[1], val[2]) + + result +end + +def _reduce_412(val, _values, result) + @max_numparam_stack.has_ordinary_params! + @current_arg_stack.set(nil) + @context.in_argdef = false + result = @builder.args(val[0], val[1].concat(val[2]), val[3]) + + result +end + +def _reduce_413(val, _values, result) + result = [] + + result +end + +def _reduce_414(val, _values, result) + result = val[2] + + result +end + +def _reduce_415(val, _values, result) + result = [ val[0] ] + + result +end + +def _reduce_416(val, _values, result) + result = val[0] << val[2] + + result +end + +def _reduce_417(val, _values, result) + @static_env.declare val[0][0] + result = @builder.shadowarg(val[0]) + + result +end + +# reduce 418 omitted + +def _reduce_419(val, _values, result) + @static_env.extend_dynamic + @max_numparam_stack.push(static: false) + result = @context.dup + @context.in_lambda = true + + result +end + +def _reduce_420(val, _values, result) + @lexer.cmdarg.push(false) + + result +end + +def _reduce_421(val, _values, result) + lambda_call = @builder.call_lambda(val[0]) + args = @max_numparam_stack.has_numparams? ? @builder.numargs(@max_numparam_stack.top) : val[2] + begin_t, body, end_t = val[4] + + @max_numparam_stack.pop + @static_env.unextend + @lexer.cmdarg.pop + @context.in_lambda = val[1].in_lambda + + result = @builder.block(lambda_call, + begin_t, args, body, end_t) + + result +end + +def _reduce_422(val, _values, result) + @context.in_argdef = false + @max_numparam_stack.has_ordinary_params! + result = @builder.args(val[0], val[1].concat(val[2]), val[3]) + + result +end + +def _reduce_423(val, _values, result) + @context.in_argdef = false + if val[0].any? + @max_numparam_stack.has_ordinary_params! + end + result = @builder.args(nil, val[0], nil) + + result +end + +def _reduce_424(val, _values, result) + result = @context.dup + @context.in_lambda = true + + result +end + +def _reduce_425(val, _values, result) + @context.in_lambda = val[1].in_lambda + result = [ val[0], val[2], val[3] ] + + result +end + +def _reduce_426(val, _values, result) + result = @context.dup + @context.in_lambda = true + + result +end + +def _reduce_427(val, _values, result) + @context.in_lambda = val[1].in_lambda + result = [ val[0], val[2], val[3] ] + + result +end + +def _reduce_428(val, _values, result) + result = @context.dup + @context.in_block = true + + result +end + +def _reduce_429(val, _values, result) + @context.in_block = val[1].in_block + result = [ val[0], *val[2], val[3] ] + + result +end + +def _reduce_430(val, _values, result) + begin_t, block_args, body, end_t = val[1] + result = @builder.block(val[0], + begin_t, block_args, body, end_t) + + result +end + +def _reduce_431(val, _values, result) + lparen_t, args, rparen_t = val[3] + result = @builder.call_method(val[0], val[1], val[2], + lparen_t, args, rparen_t) + + result +end + +def _reduce_432(val, _values, result) + lparen_t, args, rparen_t = val[3] + method_call = @builder.call_method(val[0], val[1], val[2], + lparen_t, args, rparen_t) + + begin_t, args, body, end_t = val[4] + result = @builder.block(method_call, + begin_t, args, body, end_t) + + result +end + +def _reduce_433(val, _values, result) + method_call = @builder.call_method(val[0], val[1], val[2], + nil, val[3], nil) + + begin_t, args, body, end_t = val[4] + result = @builder.block(method_call, + begin_t, args, body, end_t) + + result +end + +def _reduce_434(val, _values, result) + lparen_t, args, rparen_t = val[1] + result = @builder.call_method(nil, nil, val[0], + lparen_t, args, rparen_t) + + result +end + +def _reduce_435(val, _values, result) + lparen_t, args, rparen_t = val[3] + result = @builder.call_method(val[0], val[1], val[2], + lparen_t, args, rparen_t) + + result +end + +def _reduce_436(val, _values, result) + lparen_t, args, rparen_t = val[3] + result = @builder.call_method(val[0], val[1], val[2], + lparen_t, args, rparen_t) + + result +end + +def _reduce_437(val, _values, result) + result = @builder.call_method(val[0], val[1], val[2]) + + result +end + +def _reduce_438(val, _values, result) + lparen_t, args, rparen_t = val[2] + result = @builder.call_method(val[0], val[1], nil, + lparen_t, args, rparen_t) + + result +end + +def _reduce_439(val, _values, result) + lparen_t, args, rparen_t = val[2] + result = @builder.call_method(val[0], val[1], nil, + lparen_t, args, rparen_t) + + result +end + +def _reduce_440(val, _values, result) + lparen_t, args, rparen_t = val[1] + result = @builder.keyword_cmd(:super, val[0], + lparen_t, args, rparen_t) + + result +end + +def _reduce_441(val, _values, result) + result = @builder.keyword_cmd(:zsuper, val[0]) + + result +end + +def _reduce_442(val, _values, result) + result = @builder.index(val[0], val[1], val[2], val[3]) + + result +end + +def _reduce_443(val, _values, result) + result = @context.dup + @context.in_block = true + + result +end + +def _reduce_444(val, _values, result) + @context.in_block = val[1].in_block + result = [ val[0], *val[2], val[3] ] + + result +end + +def _reduce_445(val, _values, result) + result = @context.dup + @context.in_block = true + + result +end + +def _reduce_446(val, _values, result) + @context.in_block = val[1].in_block + result = [ val[0], *val[2], val[3] ] + + result +end + +def _reduce_447(val, _values, result) + @static_env.extend_dynamic + @max_numparam_stack.push(static: false) + + result +end + +def _reduce_448(val, _values, result) + args = @max_numparam_stack.has_numparams? ? @builder.numargs(@max_numparam_stack.top) : val[1] + result = [ args, val[2] ] + + @max_numparam_stack.pop + @static_env.unextend + + result +end + +def _reduce_449(val, _values, result) + @static_env.extend_dynamic + @max_numparam_stack.push(static: false) + + result +end + +def _reduce_450(val, _values, result) + @lexer.cmdarg.push(false) + + result +end + +def _reduce_451(val, _values, result) + args = @max_numparam_stack.has_numparams? ? @builder.numargs(@max_numparam_stack.top) : val[2] + result = [ args, val[3] ] + + @max_numparam_stack.pop + @static_env.unextend + @lexer.cmdarg.pop + + result +end + +def _reduce_452(val, _values, result) + result = [ @builder.when(val[0], val[1], val[2], val[3]), + *val[4] ] + + result +end + +def _reduce_453(val, _values, result) + result = [ val[0] ] + + result +end + +# reduce 454 omitted + +def _reduce_455(val, _values, result) + @lexer.state = :expr_beg + @lexer.command_start = false + @pattern_variables.push + @pattern_hash_keys.push + + result = @context.in_kwarg + @context.in_kwarg = true + + result +end + +def _reduce_456(val, _values, result) + @pattern_variables.pop + @pattern_hash_keys.pop + @context.in_kwarg = val[1] + + result +end + +def _reduce_457(val, _values, result) + result = [ @builder.in_pattern(val[0], *val[2], val[3], val[5]), + *val[6] ] + + result +end + +def _reduce_458(val, _values, result) + result = [ val[0] ] + + result +end + +# reduce 459 omitted + +def _reduce_460(val, _values, result) + result = [ val[0], nil ] + + result +end + +def _reduce_461(val, _values, result) + result = [ val[0], @builder.if_guard(val[1], val[2]) ] + + result +end + +def _reduce_462(val, _values, result) + result = [ val[0], @builder.unless_guard(val[1], val[2]) ] + + result +end + +# reduce 463 omitted + +def _reduce_464(val, _values, result) + # array patterns that end with comma + # like 1, 2, + # must be emitted as `array_pattern_with_tail` + item = @builder.match_with_trailing_comma(val[0], val[1]) + result = @builder.array_pattern(nil, [ item ], nil) + + result +end + +def _reduce_465(val, _values, result) + result = @builder.array_pattern(nil, [val[0]].concat(val[2]), nil) + + result +end + +def _reduce_466(val, _values, result) + result = @builder.find_pattern(nil, val[0], nil) + + result +end + +def _reduce_467(val, _values, result) + result = @builder.array_pattern(nil, val[0], nil) + + result +end + +def _reduce_468(val, _values, result) + result = @builder.hash_pattern(nil, val[0], nil) + + result +end + +# reduce 469 omitted + +def _reduce_470(val, _values, result) + result = @builder.match_as(val[0], val[1], val[2]) + + result +end + +# reduce 471 omitted + +def _reduce_472(val, _values, result) + result = @builder.match_alt(val[0], val[1], val[2]) + + result +end + +# reduce 473 omitted + +def _reduce_474(val, _values, result) + result = val[0] + @pattern_hash_keys.push + + result +end + +def _reduce_475(val, _values, result) + result = val[0] + @pattern_hash_keys.push + + result +end + +# reduce 476 omitted + +# reduce 477 omitted + +def _reduce_478(val, _values, result) + @pattern_hash_keys.pop + pattern = @builder.array_pattern(nil, val[2], nil) + result = @builder.const_pattern(val[0], val[1], pattern, val[3]) + + result +end + +def _reduce_479(val, _values, result) + @pattern_hash_keys.pop + pattern = @builder.find_pattern(nil, val[2], nil) + result = @builder.const_pattern(val[0], val[1], pattern, val[3]) + + result +end + +def _reduce_480(val, _values, result) + @pattern_hash_keys.pop + pattern = @builder.hash_pattern(nil, val[2], nil) + result = @builder.const_pattern(val[0], val[1], pattern, val[3]) + + result +end + +def _reduce_481(val, _values, result) + pattern = @builder.array_pattern(val[1], nil, val[2]) + result = @builder.const_pattern(val[0], val[1], pattern, val[2]) + + result +end + +def _reduce_482(val, _values, result) + @pattern_hash_keys.pop + pattern = @builder.array_pattern(nil, val[2], nil) + result = @builder.const_pattern(val[0], val[1], pattern, val[3]) + + result +end + +def _reduce_483(val, _values, result) + @pattern_hash_keys.pop + pattern = @builder.find_pattern(nil, val[2], nil) + result = @builder.const_pattern(val[0], val[1], pattern, val[3]) + + result +end + +def _reduce_484(val, _values, result) + @pattern_hash_keys.pop + pattern = @builder.hash_pattern(nil, val[2], nil) + result = @builder.const_pattern(val[0], val[1], pattern, val[3]) + + result +end + +def _reduce_485(val, _values, result) + pattern = @builder.array_pattern(val[1], nil, val[2]) + result = @builder.const_pattern(val[0], val[1], pattern, val[2]) + + result +end + +def _reduce_486(val, _values, result) + result = @builder.array_pattern(val[0], val[1], val[2]) + + result +end + +def _reduce_487(val, _values, result) + result = @builder.find_pattern(val[0], val[1], val[2]) + + result +end + +def _reduce_488(val, _values, result) + result = @builder.array_pattern(val[0], [], val[1]) + + result +end + +def _reduce_489(val, _values, result) + @pattern_hash_keys.push + result = @context.in_kwarg + @context.in_kwarg = false + + result +end + +def _reduce_490(val, _values, result) + @pattern_hash_keys.pop + @context.in_kwarg = val[1] + result = @builder.hash_pattern(val[0], val[2], val[3]) + + result +end + +def _reduce_491(val, _values, result) + result = @builder.hash_pattern(val[0], [], val[1]) + + result +end + +def _reduce_492(val, _values, result) + @pattern_hash_keys.push + + result +end + +def _reduce_493(val, _values, result) + @pattern_hash_keys.pop + result = @builder.begin(val[0], val[2], val[3]) + + result +end + +def _reduce_494(val, _values, result) + result = [ val[0] ] + + result +end + +def _reduce_495(val, _values, result) + result = val[0] + + result +end + +def _reduce_496(val, _values, result) + result = [ *val[0], val[1] ] + + result +end + +def _reduce_497(val, _values, result) + result = [ *val[0], val[1] ] + + result +end + +def _reduce_498(val, _values, result) + result = [ *val[0], val[1], *val[3] ] + + result +end + +# reduce 499 omitted + +def _reduce_500(val, _values, result) + # array patterns that end with comma + # like [1, 2,] + # must be emitted as `array_pattern_with_tail` + item = @builder.match_with_trailing_comma(val[0], val[1]) + result = [ item ] + + result +end + +def _reduce_501(val, _values, result) + # array patterns that end with comma + # like [1, 2,] + # must be emitted as `array_pattern_with_tail` + last_item = @builder.match_with_trailing_comma(val[1], val[2]) + result = [ *val[0], last_item ] + + result +end + +def _reduce_502(val, _values, result) + result = [ val[0] ] + + result +end + +def _reduce_503(val, _values, result) + result = [ val[0], *val[2] ] + + result +end + +def _reduce_504(val, _values, result) + result = [ val[0], *val[2], val[4] ] + + result +end + +def _reduce_505(val, _values, result) + result = @builder.match_rest(val[0], val[1]) + + result +end + +def _reduce_506(val, _values, result) + result = @builder.match_rest(val[0]) + + result +end + +def _reduce_507(val, _values, result) + result = [ val[0] ] + + result +end + +def _reduce_508(val, _values, result) + result = [ *val[0], val[2] ] + + result +end + +# reduce 509 omitted + +def _reduce_510(val, _values, result) + result = [ *val[0], *val[2] ] + + result +end + +def _reduce_511(val, _values, result) + result = val[0] + + result +end + +def _reduce_512(val, _values, result) + result = val[0] + + result +end + +def _reduce_513(val, _values, result) + result = val[0] + + result +end + +def _reduce_514(val, _values, result) + result = [ val[0] ] + + result +end + +def _reduce_515(val, _values, result) + result = [ *val[0], val[2] ] + + result +end + +def _reduce_516(val, _values, result) + result = @builder.match_pair(*val[0], val[1]) + + result +end + +def _reduce_517(val, _values, result) + result = @builder.match_label(*val[0]) + + result +end + +def _reduce_518(val, _values, result) + result = [:label, val[0]] + + result +end + +def _reduce_519(val, _values, result) + result = [:quoted, [val[0], val[1], val[2]]] + + result +end + +def _reduce_520(val, _values, result) + result = [ @builder.match_rest(val[0], val[1]) ] + + result +end + +def _reduce_521(val, _values, result) + result = [ @builder.match_rest(val[0], nil) ] + + result +end + +def _reduce_522(val, _values, result) + result = val + + result +end + +# reduce 523 omitted + +def _reduce_524(val, _values, result) + result = [ @builder.match_nil_pattern(val[0][0], val[0][1]) ] + + result +end + +# reduce 525 omitted + +def _reduce_526(val, _values, result) + result = @builder.range_inclusive(val[0], val[1], val[2]) + + result +end + +def _reduce_527(val, _values, result) + result = @builder.range_exclusive(val[0], val[1], val[2]) + + result +end + +def _reduce_528(val, _values, result) + result = @builder.range_inclusive(val[0], val[1], nil) + + result +end + +def _reduce_529(val, _values, result) + result = @builder.range_exclusive(val[0], val[1], nil) + + result +end + +# reduce 530 omitted + +# reduce 531 omitted + +# reduce 532 omitted + +def _reduce_533(val, _values, result) + result = @builder.range_inclusive(nil, val[0], val[1]) + + result +end + +def _reduce_534(val, _values, result) + result = @builder.range_exclusive(nil, val[0], val[1]) + + result +end + +# reduce 535 omitted + +# reduce 536 omitted + +# reduce 537 omitted + +# reduce 538 omitted + +# reduce 539 omitted + +# reduce 540 omitted + +# reduce 541 omitted + +# reduce 542 omitted + +def _reduce_543(val, _values, result) + result = @builder.accessible(val[0]) + + result +end + +# reduce 544 omitted + +def _reduce_545(val, _values, result) + result = @builder.assignable(@builder.match_var(val[0])) + + result +end + +def _reduce_546(val, _values, result) + name = val[1][0] + unless static_env.declared?(name) + diagnostic :error, :undefined_lvar, { :name => name }, val[1] + end + + lvar = @builder.accessible(@builder.ident(val[1])) + result = @builder.pin(val[0], lvar) + + result +end + +def _reduce_547(val, _values, result) + non_lvar = @builder.accessible(val[1]) + result = @builder.pin(val[0], non_lvar) + + result +end + +def _reduce_548(val, _values, result) + expr = @builder.begin(val[1], val[2], val[3]) + result = @builder.pin(val[0], expr) + + result +end + +def _reduce_549(val, _values, result) + result = @builder.const_global(val[0], val[1]) + + result +end + +def _reduce_550(val, _values, result) + result = @builder.const_fetch(val[0], val[1], val[2]) + + result +end + +def _reduce_551(val, _values, result) + result = @builder.const(val[0]) + + result +end + +def _reduce_552(val, _values, result) + assoc_t, exc_var = val[2] + + if val[1] + exc_list = @builder.array(nil, val[1], nil) + end + + result = [ @builder.rescue_body(val[0], + exc_list, assoc_t, exc_var, + val[3], val[4]), + *val[5] ] + + result +end + +def _reduce_553(val, _values, result) + result = [] + + result +end + +def _reduce_554(val, _values, result) + result = [ val[0] ] + + result +end + +# reduce 555 omitted + +# reduce 556 omitted + +def _reduce_557(val, _values, result) + result = [ val[0], val[1] ] + + result +end + +# reduce 558 omitted + +def _reduce_559(val, _values, result) + result = [ val[0], val[1] ] + + result +end + +# reduce 560 omitted + +# reduce 561 omitted + +# reduce 562 omitted + +def _reduce_563(val, _values, result) + result = @builder.string_compose(nil, val[0], nil) + + result +end + +def _reduce_564(val, _values, result) + result = [ val[0] ] + + result +end + +def _reduce_565(val, _values, result) + result = val[0] << val[1] + + result +end + +def _reduce_566(val, _values, result) + string = @builder.string_compose(val[0], val[1], val[2]) + result = @builder.dedent_string(string, @lexer.dedent_level) + + result +end + +def _reduce_567(val, _values, result) + string = @builder.string(val[0]) + result = @builder.dedent_string(string, @lexer.dedent_level) + + result +end + +def _reduce_568(val, _values, result) + result = @builder.character(val[0]) + + result +end + +def _reduce_569(val, _values, result) + string = @builder.xstring_compose(val[0], val[1], val[2]) + result = @builder.dedent_string(string, @lexer.dedent_level) + + result +end + +def _reduce_570(val, _values, result) + opts = @builder.regexp_options(val[3]) + result = @builder.regexp_compose(val[0], val[1], val[2], opts) + + result +end + +def _reduce_571(val, _values, result) + result = @builder.words_compose(val[0], val[1], val[2]) + + result +end + +def _reduce_572(val, _values, result) + result = [] + + result +end + +def _reduce_573(val, _values, result) + result = val[0] << @builder.word(val[1]) + + result +end + +def _reduce_574(val, _values, result) + result = [ val[0] ] + + result +end + +def _reduce_575(val, _values, result) + result = val[0] << val[1] + + result +end + +def _reduce_576(val, _values, result) + result = @builder.symbols_compose(val[0], val[1], val[2]) + + result +end + +def _reduce_577(val, _values, result) + result = [] + + result +end + +def _reduce_578(val, _values, result) + result = val[0] << @builder.word(val[1]) + + result +end + +def _reduce_579(val, _values, result) + result = @builder.words_compose(val[0], val[1], val[2]) + + result +end + +def _reduce_580(val, _values, result) + result = @builder.symbols_compose(val[0], val[1], val[2]) + + result +end + +def _reduce_581(val, _values, result) + result = [] + + result +end + +def _reduce_582(val, _values, result) + result = val[0] << @builder.string_internal(val[1]) + + result +end + +def _reduce_583(val, _values, result) + result = [] + + result +end + +def _reduce_584(val, _values, result) + result = val[0] << @builder.symbol_internal(val[1]) + + result +end + +def _reduce_585(val, _values, result) + result = [] + + result +end + +def _reduce_586(val, _values, result) + result = val[0] << val[1] + + result +end + +def _reduce_587(val, _values, result) + result = [] + + result +end + +def _reduce_588(val, _values, result) + result = val[0] << val[1] + + result +end + +def _reduce_589(val, _values, result) + result = [] + + result +end + +def _reduce_590(val, _values, result) + result = val[0] << val[1] + + result +end + +def _reduce_591(val, _values, result) + result = @builder.string_internal(val[0]) + + result +end + +def _reduce_592(val, _values, result) + result = val[1] + + result +end + +def _reduce_593(val, _values, result) + @lexer.cmdarg.push(false) + @lexer.cond.push(false) + + result +end + +def _reduce_594(val, _values, result) + @lexer.cmdarg.pop + @lexer.cond.pop + + result = @builder.begin(val[0], val[2], val[3]) + + result +end + +def _reduce_595(val, _values, result) + result = @builder.gvar(val[0]) + + result +end + +def _reduce_596(val, _values, result) + result = @builder.ivar(val[0]) + + result +end + +def _reduce_597(val, _values, result) + result = @builder.cvar(val[0]) + + result +end + +# reduce 598 omitted + +# reduce 599 omitted + +# reduce 600 omitted + +def _reduce_601(val, _values, result) + @lexer.state = :expr_end + result = @builder.symbol(val[0]) + + result +end + +def _reduce_602(val, _values, result) + @lexer.state = :expr_end + result = @builder.symbol_compose(val[0], val[1], val[2]) + + result +end + +def _reduce_603(val, _values, result) + result = val[0] + + result +end + +def _reduce_604(val, _values, result) + if @builder.respond_to? :negate + # AST builder interface compatibility + result = @builder.negate(val[0], val[1]) + else + result = @builder.unary_num(val[0], val[1]) + end + + result +end + +def _reduce_605(val, _values, result) + @lexer.state = :expr_end + result = @builder.integer(val[0]) + + result +end + +def _reduce_606(val, _values, result) + @lexer.state = :expr_end + result = @builder.float(val[0]) + + result +end + +def _reduce_607(val, _values, result) + @lexer.state = :expr_end + result = @builder.rational(val[0]) + + result +end + +def _reduce_608(val, _values, result) + @lexer.state = :expr_end + result = @builder.complex(val[0]) + + result +end + +def _reduce_609(val, _values, result) + result = @builder.ivar(val[0]) + + result +end + +def _reduce_610(val, _values, result) + result = @builder.gvar(val[0]) + + result +end + +def _reduce_611(val, _values, result) + result = @builder.cvar(val[0]) + + result +end + +def _reduce_612(val, _values, result) + result = @builder.ident(val[0]) + + result +end + +def _reduce_613(val, _values, result) + result = @builder.ivar(val[0]) + + result +end + +def _reduce_614(val, _values, result) + result = @builder.gvar(val[0]) + + result +end + +def _reduce_615(val, _values, result) + result = @builder.const(val[0]) + + result +end + +def _reduce_616(val, _values, result) + result = @builder.cvar(val[0]) + + result +end + +def _reduce_617(val, _values, result) + result = @builder.nil(val[0]) + + result +end + +def _reduce_618(val, _values, result) + result = @builder.self(val[0]) + + result +end + +def _reduce_619(val, _values, result) + result = @builder.true(val[0]) + + result +end + +def _reduce_620(val, _values, result) + result = @builder.false(val[0]) + + result +end + +def _reduce_621(val, _values, result) + result = @builder.__FILE__(val[0]) + + result +end + +def _reduce_622(val, _values, result) + result = @builder.__LINE__(val[0]) + + result +end + +def _reduce_623(val, _values, result) + result = @builder.__ENCODING__(val[0]) + + result +end + +def _reduce_624(val, _values, result) + result = @builder.accessible(val[0]) + + result +end + +def _reduce_625(val, _values, result) + result = @builder.accessible(val[0]) + + result +end + +def _reduce_626(val, _values, result) + result = @builder.assignable(val[0]) + + result +end + +def _reduce_627(val, _values, result) + result = @builder.assignable(val[0]) + + result +end + +def _reduce_628(val, _values, result) + result = @builder.nth_ref(val[0]) + + result +end + +def _reduce_629(val, _values, result) + result = @builder.back_ref(val[0]) + + result +end + +def _reduce_630(val, _values, result) + @lexer.state = :expr_value + + result +end + +def _reduce_631(val, _values, result) + result = [ val[0], val[2] ] + + result +end + +def _reduce_632(val, _values, result) + result = nil + + result +end + +# reduce 633 omitted + +def _reduce_634(val, _values, result) + @context.in_argdef = false + result = @builder.args(nil, [], nil) + + result +end + +def _reduce_635(val, _values, result) + result = @builder.args(val[0], val[1], val[2]) + + @lexer.state = :expr_value + @context.in_argdef = false + + result +end + +# reduce 636 omitted + +def _reduce_637(val, _values, result) + result = @context.dup + @context.in_kwarg = true + @context.in_argdef = true + + result +end + +def _reduce_638(val, _values, result) + @context.in_kwarg = val[0].in_kwarg + @context.in_argdef = false + result = @builder.args(nil, val[1], nil) + + result +end + +def _reduce_639(val, _values, result) + result = val[0].concat(val[2]).concat(val[3]) + + result +end + +def _reduce_640(val, _values, result) + result = val[0].concat(val[1]) + + result +end + +def _reduce_641(val, _values, result) + result = val[0].concat(val[1]) + + result +end + +def _reduce_642(val, _values, result) + result = [ val[0] ] + + result +end + +def _reduce_643(val, _values, result) + @static_env.declare_forward_args + result = [ @builder.forward_arg(val[0]) ] + + result +end + +def _reduce_644(val, _values, result) + result = val[1] + + result +end + +def _reduce_645(val, _values, result) + result = [] + + result +end + +def _reduce_646(val, _values, result) + result = val[0]. + concat(val[2]). + concat(val[4]). + concat(val[5]) + + result +end + +def _reduce_647(val, _values, result) + result = val[0]. + concat(val[2]). + concat(val[4]). + concat(val[6]). + concat(val[7]) + + result +end + +def _reduce_648(val, _values, result) + result = val[0]. + concat(val[2]). + concat(val[3]) + + result +end + +def _reduce_649(val, _values, result) + result = val[0]. + concat(val[2]). + concat(val[4]). + concat(val[5]) + + result +end + +def _reduce_650(val, _values, result) + result = val[0]. + concat(val[2]). + concat(val[3]) + + result +end + +def _reduce_651(val, _values, result) + result = val[0]. + concat(val[2]). + concat(val[4]). + concat(val[5]) + + result +end + +def _reduce_652(val, _values, result) + result = val[0]. + concat(val[1]) + + result +end + +def _reduce_653(val, _values, result) + result = val[0]. + concat(val[2]). + concat(val[3]) + + result +end + +def _reduce_654(val, _values, result) + result = val[0]. + concat(val[2]). + concat(val[4]). + concat(val[5]) + + result +end + +def _reduce_655(val, _values, result) + result = val[0]. + concat(val[1]) + + result +end + +def _reduce_656(val, _values, result) + result = val[0]. + concat(val[2]). + concat(val[3]) + + result +end + +def _reduce_657(val, _values, result) + result = val[0]. + concat(val[1]) + + result +end + +def _reduce_658(val, _values, result) + result = val[0]. + concat(val[2]). + concat(val[3]) + + result +end + +def _reduce_659(val, _values, result) + result = val[0] + + result +end + +def _reduce_660(val, _values, result) + result = [] + + result +end + +def _reduce_661(val, _values, result) + result = val[0] + + result +end + +def _reduce_662(val, _values, result) + diagnostic :error, :argument_const, nil, val[0] + + result +end + +def _reduce_663(val, _values, result) + diagnostic :error, :argument_ivar, nil, val[0] + + result +end + +def _reduce_664(val, _values, result) + diagnostic :error, :argument_gvar, nil, val[0] + + result +end + +def _reduce_665(val, _values, result) + diagnostic :error, :argument_cvar, nil, val[0] + + result +end + +# reduce 666 omitted + +def _reduce_667(val, _values, result) + @static_env.declare val[0][0] + + @max_numparam_stack.has_ordinary_params! + + result = val[0] + + result +end + +def _reduce_668(val, _values, result) + @current_arg_stack.set(val[0][0]) + result = val[0] + + result +end + +def _reduce_669(val, _values, result) + @current_arg_stack.set(0) + result = @builder.arg(val[0]) + + result +end + +def _reduce_670(val, _values, result) + result = @builder.multi_lhs(val[0], val[1], val[2]) + + result +end + +def _reduce_671(val, _values, result) + result = [ val[0] ] + + result +end + +def _reduce_672(val, _values, result) + result = val[0] << val[2] + + result +end + +def _reduce_673(val, _values, result) + check_kwarg_name(val[0]) + + @static_env.declare val[0][0] + + @max_numparam_stack.has_ordinary_params! + + @current_arg_stack.set(val[0][0]) + @context.in_argdef = false + + result = val[0] + + result +end + +def _reduce_674(val, _values, result) + @current_arg_stack.set(nil) + @context.in_argdef = true + result = @builder.kwoptarg(val[0], val[1]) + + result +end + +def _reduce_675(val, _values, result) + @current_arg_stack.set(nil) + @context.in_argdef = true + result = @builder.kwarg(val[0]) + + result +end + +def _reduce_676(val, _values, result) + @context.in_argdef = true + result = @builder.kwoptarg(val[0], val[1]) + + result +end + +def _reduce_677(val, _values, result) + @context.in_argdef = true + result = @builder.kwarg(val[0]) + + result +end + +def _reduce_678(val, _values, result) + result = [ val[0] ] + + result +end + +def _reduce_679(val, _values, result) + result = val[0] << val[2] + + result +end + +def _reduce_680(val, _values, result) + result = [ val[0] ] + + result +end + +def _reduce_681(val, _values, result) + result = val[0] << val[2] + + result +end + +# reduce 682 omitted + +# reduce 683 omitted + +def _reduce_684(val, _values, result) + result = [ @builder.kwnilarg(val[0][0], val[0][1]) ] + + result +end + +def _reduce_685(val, _values, result) + @static_env.declare val[1][0] + + result = [ @builder.kwrestarg(val[0], val[1]) ] + + result +end + +def _reduce_686(val, _values, result) + result = [ @builder.kwrestarg(val[0]) ] + + result +end + +def _reduce_687(val, _values, result) + @current_arg_stack.set(0) + @context.in_argdef = true + result = @builder.optarg(val[0], val[1], val[2]) + + result +end + +def _reduce_688(val, _values, result) + @current_arg_stack.set(0) + @context.in_argdef = true + result = @builder.optarg(val[0], val[1], val[2]) + + result +end + +def _reduce_689(val, _values, result) + result = [ val[0] ] + + result +end + +def _reduce_690(val, _values, result) + result = val[0] << val[2] + + result +end + +def _reduce_691(val, _values, result) + result = [ val[0] ] + + result +end + +def _reduce_692(val, _values, result) + result = val[0] << val[2] + + result +end + +# reduce 693 omitted + +# reduce 694 omitted + +def _reduce_695(val, _values, result) + @static_env.declare val[1][0] + + result = [ @builder.restarg(val[0], val[1]) ] + + result +end + +def _reduce_696(val, _values, result) + result = [ @builder.restarg(val[0]) ] + + result +end + +# reduce 697 omitted + +# reduce 698 omitted + +def _reduce_699(val, _values, result) + @static_env.declare val[1][0] + + result = @builder.blockarg(val[0], val[1]) + + result +end + +def _reduce_700(val, _values, result) + @static_env.declare_anonymous_blockarg + + result = @builder.blockarg(val[0], nil) + + result +end + +def _reduce_701(val, _values, result) + result = [ val[1] ] + + result +end + +def _reduce_702(val, _values, result) + result = [] + + result +end + +# reduce 703 omitted + +def _reduce_704(val, _values, result) + result = val[1] + + result +end + +def _reduce_705(val, _values, result) + result = [] + + result +end + +# reduce 706 omitted + +def _reduce_707(val, _values, result) + result = [ val[0] ] + + result +end + +def _reduce_708(val, _values, result) + result = val[0] << val[2] + + result +end + +def _reduce_709(val, _values, result) + result = @builder.pair(val[0], val[1], val[2]) + + result +end + +def _reduce_710(val, _values, result) + result = @builder.pair_keyword(val[0], val[1]) + + result +end + +def _reduce_711(val, _values, result) + result = @builder.pair_label(val[0]) + + result +end + +def _reduce_712(val, _values, result) + result = @builder.pair_quoted(val[0], val[1], val[2], val[3]) + + result +end + +def _reduce_713(val, _values, result) + result = @builder.kwsplat(val[0], val[1]) + + result +end + +# reduce 714 omitted + +# reduce 715 omitted + +# reduce 716 omitted + +# reduce 717 omitted + +# reduce 718 omitted + +# reduce 719 omitted + +# reduce 720 omitted + +# reduce 721 omitted + +# reduce 722 omitted + +# reduce 723 omitted + +def _reduce_724(val, _values, result) + result = [:dot, val[0][1]] + + result +end + +def _reduce_725(val, _values, result) + result = [:anddot, val[0][1]] + + result +end + +# reduce 726 omitted + +# reduce 727 omitted + +# reduce 728 omitted + +# reduce 729 omitted + +def _reduce_730(val, _values, result) + result = val[1] + + result +end + +def _reduce_731(val, _values, result) + result = val[1] + + result +end + +def _reduce_732(val, _values, result) + result = val[1] + + result +end + +# reduce 733 omitted + +# reduce 734 omitted + +# reduce 735 omitted + +def _reduce_736(val, _values, result) + yyerrok + + result +end + +# reduce 737 omitted + +# reduce 738 omitted + +# reduce 739 omitted + +def _reduce_740(val, _values, result) + result = nil + + result +end + +def _reduce_none(val, _values, result) + val[0] +end + + end # class Ruby32 + end # module Parser diff --git a/vendor/bundle/ruby/3.1.0/gems/parser-3.1.2.0/lib/parser/rubymotion.rb b/vendor/bundle/ruby/3.1.0/gems/parser-3.1.2.0/lib/parser/rubymotion.rb new file mode 100644 index 000000000..93d10ea20 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/parser-3.1.2.0/lib/parser/rubymotion.rb @@ -0,0 +1,6125 @@ +# -*- encoding:utf-8; warn-indent:false; frozen_string_literal: true -*- +# +# DO NOT MODIFY!!!! +# This file is automatically generated by Racc 1.4.15 +# from Racc grammer file "". +# + +require 'racc/parser.rb' + + +require 'parser' + +module Parser + class RubyMotion < Parser::Base + + + def version + 19 # closest released match: v1_9_0_2 + end + + def default_encoding + Encoding::BINARY + end + + def local_push + @static_env.extend_static + @lexer.cmdarg.push(false) + @lexer.cond.push(false) + end + + def local_pop + @static_env.unextend + @lexer.cmdarg.pop + @lexer.cond.pop + end +##### State transition tables begin ### + +clist = [ +'-279,540,509,509,509,-93,-90,-279,-279,-279,-87,206,207,-279,-279,530', +'-279,452,521,583,583,209,522,206,207,-93,551,583,509,509,-88,583,499', +'206,207,498,-279,-279,-456,-279,-279,-279,-279,-279,-90,-456,625,-466', +'515,-91,661,-88,751,582,582,-92,-87,-86,210,731,210,582,542,541,552', +'582,-279,-279,-279,-279,-279,-279,-279,-279,-279,-279,-279,-279,-279', +'-279,661,661,-279,-279,-279,-92,571,206,207,550,-279,210,274,-279,206', +'207,-456,-86,-279,883,-279,210,-279,-279,-279,-279,-279,-279,-279,-86', +'-279,-82,-279,210,-528,-79,104,104,104,-93,529,103,103,103,-93,-279', +'-279,-279,-89,-83,-85,-279,-279,-279,-279,-279,-91,-279,-279,-279,104', +'-279,104,104,-88,103,779,103,103,-88,104,-279,-279,-279,-83,103,-80', +'750,-90,-91,274,-279,-279,-90,-279,-279,-279,-279,-279,-92,-87,-86,713', +'886,-92,-87,-86,104,273,-89,104,104,103,104,210,103,103,540,103,486', +'-84,-279,-279,-279,-279,-279,-279,-279,-279,-279,-279,-279,-279,-279', +'-279,-527,-80,-279,-279,-279,-73,571,-279,274,-78,-279,760,-59,-279', +'-279,796,-279,-90,-279,269,-279,540,-279,-279,-279,-279,-279,-279,-279', +'888,-279,-528,-279,-81,-92,417,890,-89,203,-527,890,273,-89,542,541', +'878,-279,-279,-279,-279,-531,-279,693,-279,876,-279,-91,-531,-531,-531', +'761,701,-531,-531,-531,-87,-531,-80,-91,104,774,625,269,-91,103,-531', +'-531,-531,-531,-81,712,-462,542,541,547,-93,-531,-531,-462,-531,-531', +'-531,-531,-531,273,104,204,-82,-527,-81,103,-458,760,-80,-79,210,-80', +'203,-458,499,540,-87,501,-80,267,895,-531,-531,-531,-531,-531,-531,-531', +'-531,-531,-531,-531,-531,-531,-531,-88,-79,-531,-531,-531,-81,714,-531', +'-81,-462,-531,-466,-461,-531,-531,-81,-531,299,-531,-461,-531,810,-531', +'-531,-531,-531,-531,-531,-531,-458,-531,-531,-531,-82,724,204,641,640', +'639,645,642,542,541,545,898,563,-531,-531,-531,-531,-456,-531,899,-531', +'-78,-531,-89,-456,-456,-456,104,-86,-456,-456,-456,103,-456,-79,904', +'-82,-461,647,-82,229,-456,906,-456,-456,-456,-82,651,650,654,653,206', +'207,-456,-456,-80,-456,-456,-456,-456,-456,768,-88,641,640,639,645,642', +'-464,909,-79,911,226,-79,540,-464,228,227,890,540,-79,723,890,-456,-456', +'-456,-456,-456,-456,-456,-456,-456,-456,-456,-456,-456,-456,75,916,-456', +'-456,-456,499,-456,-456,501,76,-456,298,499,-456,-456,501,-456,205,-456', +'77,-456,494,-456,-456,-456,-456,-456,-456,-456,-464,-456,768,-456,641', +'640,639,645,642,542,541,543,248,843,542,541,538,-456,-456,-456,-456', +'-453,-456,486,-456,-323,-456,-456,-453,-453,-453,-85,-323,-453,-453', +'-453,564,-453,-93,229,924,-323,925,203,-453,-453,933,-453,-453,-453', +'202,-453,300,301,-531,481,482,-453,-453,200,-453,-453,-453,-453,-453', +'104,-84,774,625,199,103,226,198,-92,-463,228,227,197,203,-82,931,-463', +'450,-323,210,536,-90,-453,-453,-453,-453,-453,-453,-453,-453,-453,-453', +'-453,-453,-453,-453,204,-453,-453,-453,-453,-531,-453,-453,206,207,-453', +'196,-531,-453,-453,195,-453,-527,-453,946,-453,-531,-453,-453,-453,-453', +'-453,-453,-453,-531,-453,-463,-453,-460,-273,204,-531,-531,-531,-531', +'-460,-273,-531,-531,890,-531,-453,-453,-453,-453,-273,-453,-459,-453', +'-531,-453,-453,890,890,-459,-280,950,-525,-531,933,-531,-531,-280,-531', +'-531,-531,-531,-531,953,954,956,-280,890,890,768,890,641,640,639,645', +'642,-528,210,373,210,-73,-460,-273,375,374,-531,-531,-531,-531,-531', +'-531,-531,-531,-531,-531,-531,-531,-531,-531,210,-459,-531,-531,-531', +'-456,568,764,607,-280,-531,210,-456,-531,492,-524,894,-525,-531,618', +'-531,-456,-531,-531,-531,-531,-531,-531,-531,625,-531,-531,-531,210', +'-465,229,229,657,229,-525,229,-465,515,664,573,-286,-531,-531,269,-81', +'-465,-531,-286,-286,-286,-531,-89,-286,-286,-286,210,-286,-259,-456', +'687,688,229,-453,689,98,99,-286,-286,203,-453,559,556,692,555,-524,518', +'-286,-286,-453,-286,-286,-286,-286,-286,516,695,808,-465,641,640,639', +'-260,642,226,702,459,-524,228,227,224,225,106,107,108,109,110,-286,-286', +'-286,-286,-286,-286,-286,-286,-286,-286,-286,-286,-286,-286,-453,229', +'-286,-286,-286,203,204,-286,459,278,-286,210,915,-286,-286,716,-286', +'728,-286,452,-286,526,-286,-286,-286,-286,-286,-286,-286,520,-286,519', +'-286,226,203,450,210,228,227,224,225,524,366,515,618,-533,-286,-286', +'210,-286,526,-286,-533,-533,-533,-286,269,-533,-533,-533,452,-533,808', +'204,641,640,639,203,642,269,-533,-533,-533,-533,490,106,107,108,109', +'110,618,-533,-533,415,-533,-533,-533,-533,-533,-527,229,229,204,503', +'768,742,641,640,639,645,642,106,107,108,109,110,502,-259,746,723,754', +'-533,-533,-533,-533,-533,-533,-533,-533,-533,-533,-533,-533,-533,-533', +'204,756,-533,-533,-533,759,764,-533,762,770,-533,771,625,-533,-533,767', +'-533,778,-533,210,-533,495,-533,-533,-533,-533,-533,-533,-533,494,-533', +'-533,-533,229,488,210,-280,487,203,787,483,100,-261,-280,269,478,-533', +'-533,-533,-533,-274,-533,-280,-533,476,-533,210,-274,-274,-274,933,890', +'-274,-274,-274,644,-274,641,640,639,645,642,-279,278,479,798,-274,-274', +'-274,-279,800,803,804,723,-528,811,-274,-274,-279,-274,-274,-274,-274', +'-274,-280,472,204,471,210,818,819,768,647,641,640,639,645,642,618,210', +'-58,651,650,654,653,459,-274,-274,-274,-274,-274,-274,-274,-274,-274', +'-274,-274,-274,-274,-274,-279,452,-274,-274,-274,723,838,-274,764,450', +'-274,841,448,-274,-274,760,-274,767,-274,210,-274,845,-274,-274,-274', +'-274,-274,-274,-274,209,-274,847,-274,419,418,768,203,641,640,639,645', +'642,416,414,853,376,-274,-274,-274,-274,-232,-274,415,-274,855,-274', +'210,-232,-232,-232,858,-279,-232,-232,-232,-262,-232,933,-279,890,865', +'866,647,-528,870,871,-232,-279,873,450,364,879,,654,653,,-232,-232,', +'-232,-232,-232,-232,-232,204,,,,768,,641,640,639,645,642,,,,,,,,644', +',641,640,639,645,642,-279,,,,,,,,-232,,-532,,,,,-232,647,-532,-532,-532', +'269,-232,-532,-532,-532,,-532,654,653,,647,682,,,,-532,-532,-532,-532', +'651,650,654,653,-232,,,-532,-532,,-532,-532,-532,-532,-532,,,,-232,', +',,,-232,,,768,-232,641,640,639,645,642,,,,,-532,-532,-532,-532,-532', +'-532,-532,-532,-532,-532,-532,-532,-532,-532,,,-532,-532,-532,,,-532', +',,-532,,764,-532,-532,,-532,,-532,,-532,,-532,-532,-532,-532,-532,-532', +'-532,,-532,-532,-532,644,,641,640,639,645,642,,,,,,,-532,-532,-532,-532', +'-232,-532,,-532,,-532,,-232,-232,-232,,,-232,-232,-232,,-232,,,644,647', +'641,640,639,645,642,-232,,,651,650,654,653,,,,-232,-232,,-232,-232,-232', +'-232,-232,229,,,,768,,641,640,639,645,642,,647,633,,,243,244,,,,651', +'650,654,653,,,,,,,,226,-232,232,-232,228,227,224,225,-232,647,-232,-232', +'-232,269,-232,-232,-232,-232,,-232,654,653,,,,,,,-232,-232,-232,,,,', +',-232,,,-232,-232,,-232,-232,-232,-232,-232,,,,-232,,,,,-232,,,768,-232', +'641,640,639,645,642,,,,,-232,-232,-232,-232,-232,-232,-232,-232,-232', +'-232,-232,-232,-232,-232,,,-232,-232,-232,,,-232,,269,-232,,764,-232', +'-232,,-232,,-232,,-232,,-232,-232,-232,-232,-232,-232,-232,,-232,-232', +'-232,,,,768,,641,640,639,645,642,,,-396,-232,-232,,-232,,-232,-396,-396', +'-396,-232,,-396,-396,-396,724,-396,641,640,639,645,642,,,,-396,-396', +'-396,764,,,,,,,,-396,-396,,-396,-396,-396,-396,-396,768,,641,640,639', +'645,642,768,647,641,640,639,645,642,,,,651,650,654,653,,-396,-396,-396', +'-396,-396,-396,-396,-396,-396,-396,-396,-396,-396,-396,,764,-396,-396', +'-396,,,-396,764,269,-396,,,-396,-396,,-396,,-396,,-396,,-396,-396,-396', +'-396,-396,-396,-396,,-396,-396,-396,,724,,641,640,639,645,642,,,,,,-396', +'-396,,-396,,-396,,,,-396,5,68,69,65,7,51,,,,57,58,,,,61,647,59,60,62', +'23,24,66,67,,651,650,654,653,22,28,27,92,91,93,94,,,17,,,,,,6,41,8,9', +'96,95,97,86,50,88,87,89,,90,98,99,,84,85,38,39,37,,,,,,,,768,,641,640', +'639,645,642,,,,,,36,,,30,,,52,53,,,54,,32,,,,40,768,,641,640,639,645', +'642,18,647,,,,83,75,78,79,,80,81,654,653,,76,82,5,68,69,65,7,51,56,', +'77,57,58,,,647,61,,59,60,62,23,24,66,67,,654,653,,,22,28,27,92,91,93', +'94,,,17,,,,,,6,41,8,9,96,95,97,86,50,88,87,89,,90,98,99,,84,85,38,39', +'37,,,,,,,,768,,641,640,639,645,642,,,,,,36,,,30,,,52,53,,,54,,32,,,', +'40,768,,641,640,639,645,642,18,647,,,,83,75,78,79,,80,81,654,653,,76', +'82,5,68,69,65,7,51,56,,77,57,58,,,647,61,,59,60,62,23,24,66,67,,654', +'653,,,22,28,27,92,91,93,94,,,17,,,,,,6,41,8,9,96,95,97,86,50,88,87,89', +',90,98,99,,84,85,38,39,37,,,,,,,,768,,641,640,639,645,642,,,,,,36,,', +'30,,,52,53,,,54,,32,,,,40,768,,641,640,639,645,642,18,647,,,,83,75,78', +'79,,80,81,654,653,,76,82,5,68,69,65,7,51,56,,77,57,58,,,647,61,,59,60', +'62,23,24,66,67,,654,653,,,22,28,27,92,91,93,94,,,17,,,,,,6,41,8,9,96', +'95,97,86,50,88,87,89,,90,98,99,,84,85,38,39,37,229,-552,-552,-552,-552', +'235,237,,,-552,-552,,,,,,243,244,,36,,,30,,,52,53,,,54,,32,226,,232', +'40,228,227,224,225,236,234,230,18,231,,,,83,75,78,79,,80,81,,,,76,82', +'5,68,69,65,7,51,56,,77,57,58,,,,61,,59,60,62,23,24,66,67,,,,,,22,28', +'27,92,91,93,94,,,17,,,,,,6,41,8,9,96,95,97,86,50,88,87,89,,90,98,99', +',84,85,38,39,37,229,-552,-552,-552,-552,235,237,,,-552,-552,,,,,,243', +'244,,36,,,30,,,52,53,,,54,,32,226,,232,40,228,227,224,225,236,234,230', +'18,231,,,,83,75,78,79,,80,81,,,,76,82,5,68,69,65,7,51,56,,77,57,58,', +',,61,,59,60,62,23,24,66,67,,,,,,22,28,27,92,91,93,94,,,17,,,,,,6,41', +'8,9,96,95,97,86,50,88,87,89,,90,98,99,,84,85,38,39,37,229,-552,-552', +'-552,-552,235,237,,,-552,-552,,,,,,243,244,,36,,,30,,,52,53,,,54,,32', +'226,,232,40,228,227,224,225,236,234,230,18,231,,,,83,75,78,79,,80,81', +',,,76,82,5,68,69,65,7,51,56,,77,57,58,,,,61,,59,60,62,23,24,66,67,,', +',,,22,28,27,92,91,93,94,,,17,,,,,,6,41,8,9,96,95,97,86,50,88,87,89,', +'90,98,99,,84,85,38,39,37,229,,,,,,,,,,,,,,,,243,244,,36,,,30,,,52,53', +',,54,,32,226,,232,40,228,227,224,225,,,230,18,231,,,,83,75,78,79,,80', +'81,,,,76,82,5,68,69,65,7,51,56,,77,57,58,,,,61,,59,60,62,23,24,66,67', +',,,,,22,28,27,92,91,93,94,,,17,,,,,,6,41,8,9,96,95,97,86,50,88,87,89', +',90,98,99,,84,85,38,39,37,229,,,,,,,,,,,,,,,,243,244,,36,,,30,,,52,53', +',,54,,32,226,,232,40,228,227,224,225,,,230,18,231,,,,83,75,78,79,,80', +'81,,,,76,82,5,68,69,65,7,51,56,,77,57,58,,,,61,,59,60,62,23,24,66,67', +',,,,,22,28,27,92,91,93,94,,,17,,,,,,6,41,8,9,96,95,97,86,50,88,87,89', +',90,98,99,,84,85,38,39,37,229,233,238,239,240,235,237,245,,241,242,', +',,,,243,244,,36,,,30,,,52,53,,,54,,32,226,,232,40,228,227,224,225,236', +'234,230,18,231,,,,83,75,78,79,,80,81,,,,76,82,5,68,69,65,7,51,56,,77', +'57,58,,,,61,,59,60,62,23,24,66,67,,,,,,22,28,27,92,91,93,94,,,17,,,', +',,6,41,8,9,96,95,97,86,50,88,87,89,,90,98,99,,84,85,38,39,37,229,233', +'238,239,240,235,237,,,241,242,,,,,,243,244,,36,,,280,,,52,53,,,54,,32', +'226,,232,40,228,227,224,225,236,234,230,18,231,,,,83,75,78,79,,80,81', +',,,76,82,5,68,69,65,7,51,56,,77,57,58,,,,61,,59,60,62,23,24,66,67,,', +',,,22,28,27,92,91,93,94,,,17,,,,,,6,41,8,9,96,95,97,86,50,88,87,89,', +'90,98,99,,84,85,38,39,37,229,233,238,239,240,235,237,245,246,241,242', +',-552,-552,,,243,244,,36,,,30,,,52,53,,,54,,32,226,,232,40,228,227,224', +'225,236,234,230,18,231,,,,83,75,78,79,,80,81,,,,76,82,5,68,69,65,7,51', +'56,,77,57,58,,,,61,,59,60,62,23,24,66,67,,,,,,22,28,27,92,91,93,94,', +',17,,,,,,6,41,8,9,96,95,97,86,50,88,87,89,,90,98,99,,84,85,38,39,37', +'229,233,238,239,240,235,237,245,246,241,242,,-552,-552,,,243,244,,36', +',,30,,,52,53,,,54,,32,226,,232,40,228,227,224,225,236,234,230,18,231', +',,,83,75,78,79,,80,81,,,,76,82,5,68,69,65,7,51,56,,77,57,58,,,,61,,59', +'60,62,23,24,66,67,,,,,,22,28,27,92,91,93,94,,,17,,,,,,6,41,8,9,96,95', +'97,86,50,88,87,89,,90,98,99,,84,85,38,39,37,229,,,,,,,,,,,,,,,,243,244', +',36,,,30,,,52,53,,,54,,32,226,,232,40,228,227,224,225,,,230,18,231,', +',,83,75,78,79,,80,81,,,,76,82,5,68,69,65,7,51,56,,77,57,58,,,,61,,59', +'60,62,23,24,66,67,,,,,,22,28,27,92,91,93,94,,,17,,,,,,6,41,8,9,96,95', +'97,86,50,88,87,89,,90,98,99,,84,85,38,39,37,229,-552,-552,-552,-552', +'235,237,,,-552,-552,,,,,,243,244,,36,,,30,,,52,53,,,54,,32,226,,232', +'40,228,227,224,225,236,234,230,18,231,,,,83,75,78,79,,80,81,,,,76,82', +'5,68,69,65,7,51,56,,77,57,58,,,,61,,59,60,62,23,24,66,67,,,,,,22,28', +'27,92,91,93,94,,,17,,,,,,6,41,8,9,96,95,97,86,50,88,87,89,,90,98,99', +',84,85,38,39,37,229,,,,,,,,,,,,,,,,243,244,,36,,,280,,,52,53,,,54,,32', +'226,,232,40,228,227,224,225,,,230,18,231,,,,83,75,78,79,,80,81,,,,76', +'82,5,68,69,65,7,51,56,,77,57,58,,,,61,,59,60,62,23,24,66,67,,,,,,22', +'28,27,92,91,93,94,,,17,,,,,,6,41,8,9,96,95,97,86,50,88,87,89,,90,98', +'99,,84,85,38,39,37,229,-552,-552,-552,-552,235,237,,,-552,-552,,,,,', +'243,244,,36,,,30,,,52,53,,,54,,32,226,,232,40,228,227,224,225,236,234', +'230,18,231,,,,83,75,78,79,,80,81,,,,76,82,5,68,69,65,7,51,56,,77,57', +'58,,,,61,,59,60,62,23,24,66,67,,,,,,22,28,27,92,91,93,94,,,17,,,,,,6', +'41,8,9,96,95,97,86,50,88,87,89,,90,98,99,,84,85,38,39,37,229,-552,-552', +'-552,-552,235,237,,,-552,-552,,,,,,243,244,,36,,,30,,,52,53,,,54,,32', +'226,,232,40,228,227,224,225,236,234,230,18,231,,,,83,75,78,79,,80,81', +',,,76,82,5,68,69,65,7,51,56,,77,57,58,,,,61,,59,60,62,23,24,66,67,,', +',,,22,28,27,92,91,93,94,,,17,,,,,,6,41,8,9,96,95,97,86,50,88,87,89,', +'90,98,99,,84,85,38,39,37,229,,,,,,,,,,,,,,,,243,244,,36,,,30,,,52,53', +',,54,,32,226,,,40,228,227,224,225,,,,18,,,,,83,75,78,79,,80,81,,,,76', +'82,5,68,69,65,7,51,56,,77,57,58,,,,61,,59,60,62,23,24,66,67,,,,,,22', +'28,27,92,91,93,94,,,17,,,,,,6,41,8,9,96,95,97,86,50,88,87,89,,90,98', +'99,,84,85,38,39,37,229,,,,,,,,,,,,,,,,243,244,,36,,,30,,,52,53,,,54', +',32,226,,232,40,228,227,224,225,,,,18,,,,,83,75,78,79,,80,81,,,,76,82', +'5,68,69,65,7,51,56,,77,57,58,,,,61,,59,60,62,23,24,66,67,,,,,,22,28', +'27,92,91,93,94,,,17,,,,,,6,41,8,9,96,95,97,86,50,88,87,89,,90,98,99', +',84,85,38,39,37,,,,,,,,,,,,,,,,,,,,36,,,30,,,52,53,,,54,,32,,,,40,,', +',,,,,18,,,,,83,75,78,79,,80,81,,,,76,82,5,68,69,65,7,51,56,,77,57,58', +',,,61,,59,60,62,23,24,66,67,,,,,,22,28,27,92,91,93,94,,,17,,,,,,6,41', +'8,9,96,95,97,86,50,88,87,89,,90,98,99,,84,85,38,39,37,,,,,,,,,,,,,,', +',,,,,36,,,30,,,52,53,,,54,,32,,,,40,,,,,,,,18,,,,,83,75,78,79,,80,81', +',,,76,82,5,68,69,65,7,51,56,,77,57,58,,,,61,,59,60,62,23,24,66,67,,', +',,,22,28,27,92,91,93,94,,,17,,,,,,6,41,8,9,96,95,97,86,50,88,87,89,', +'90,98,99,,84,85,38,39,37,,,,,,,,,,,,,,,,,,,,36,,,30,,,52,53,,,54,,32', +',,,40,,,,,,,,18,,,,,83,75,78,79,,80,81,,,,76,82,5,68,69,65,7,51,56,', +'77,57,58,,,,61,,59,60,62,23,24,66,67,,,,,,22,28,27,92,91,93,94,,,17', +',,,,,6,41,8,9,96,95,97,86,50,88,87,89,,90,98,99,,84,85,38,39,37,,,,', +',,,,,,,,,,,,,,,36,,,30,,,52,53,,,54,,32,,,,40,,,,,,,,18,,,,,83,75,78', +'79,,80,81,,,,76,82,5,68,69,65,7,51,56,,77,57,58,,,,61,,59,60,62,23,24', +'66,67,,,,,,22,28,27,92,91,93,94,,,17,,,,,,6,41,8,9,96,95,97,86,50,88', +'87,89,,90,98,99,,84,85,38,39,37,,,,,,,,,,,,,,,,,,,,36,,,30,,,52,53,', +',54,,32,,,,40,,,,,,,,18,,,,,83,75,78,79,,80,81,,,,76,82,5,68,69,65,7', +'51,56,,77,57,58,,,,61,,59,60,62,23,24,66,67,,,,,,22,28,27,92,91,93,94', +',,17,,,,,,6,41,8,9,96,95,97,86,50,88,87,89,,90,98,99,,84,85,38,39,37', +',,,,,,,,,,,,,,,,,,,36,,,30,,,52,53,,,54,,32,,,,40,,,,,,,,18,,,,,83,75', +'78,79,,80,81,,,,76,82,5,68,69,65,7,51,56,,77,57,58,,,,61,,59,60,62,23', +'24,66,67,,,,,,22,28,27,92,91,93,94,,,17,,,,,,6,41,8,9,96,95,97,86,50', +'88,87,89,,90,98,99,,84,85,38,39,37,,,,,,,,,,,,,,,,,,,,36,,,30,,,52,53', +',,54,,32,,,,40,,,,,,,,18,,,,,83,75,78,79,,80,81,,,,76,82,5,68,69,65', +'7,51,56,,77,57,58,,,,61,,59,60,62,23,24,66,67,,,,,,22,28,27,92,91,93', +'94,,,17,,,,,,6,41,8,9,96,95,97,86,50,88,87,89,,90,98,99,,84,85,38,39', +'37,,,,,,,,,,,,,,,,,,,,36,,,30,,,52,53,,,54,,32,,,,40,,,,,,,,18,,,,,83', +'75,78,79,,80,81,,,,76,82,5,68,69,65,7,51,56,,77,57,58,,,,61,,59,60,62', +'23,24,66,67,,,,,,22,28,27,92,91,93,94,,,17,,,,,,6,41,8,9,96,95,97,86', +'50,88,87,89,,90,98,99,,84,85,38,39,37,,,,,,,,,,,,,,,,,,,,36,,,30,,,52', +'53,,,54,,32,,,,40,,,,,,,,18,,,,,83,75,78,79,,80,81,,,,76,82,5,68,69', +'65,7,51,56,,77,57,58,,,,61,,59,60,62,23,24,66,67,,,,,,22,28,27,92,91', +'93,94,,,17,,,,,,6,41,8,9,96,95,97,86,50,88,87,89,,90,98,99,,84,85,38', +'39,37,,,,,,,,,,,,,,,,,,,,36,,,280,,,52,53,,,54,,32,,,,40,,,,,,,,18,', +',,,83,75,78,79,,80,81,,,,76,82,5,68,69,65,7,51,56,,77,57,58,,,,61,,59', +'60,62,23,24,66,67,,,,,,22,28,27,92,91,93,94,,,17,,,,,,6,41,8,9,96,95', +'97,86,50,88,87,89,,90,98,99,,84,85,38,39,37,,,,,,,,,,,,,,,,,,,,36,,', +'30,,,52,53,,,54,,32,,,,40,,,,,,,,18,,,,,83,75,78,79,,80,81,,,,76,82', +',68,69,65,,51,56,,77,57,58,,,,61,,59,60,62,260,261,66,67,,,,,,259,290', +'294,92,91,93,94,,,221,,,,,,,41,,,96,95,97,86,50,88,87,89,,90,98,99,', +'84,85,38,39,37,,,,,,,,,,,,,,,,,,,,214,,,220,,,52,53,,,54,,,,,,40,,,', +',,,,219,,,,,83,75,78,79,,80,81,,,,76,82,,68,69,65,,51,56,,77,57,58,', +',,61,,59,60,62,23,24,66,67,,,,,,22,28,27,92,91,93,94,,,17,,,,,,,41,', +',96,95,97,86,50,88,87,89,,90,98,99,,84,85,38,39,37,,,,,,,,,,,,,,,,,', +',,214,,,220,,,52,53,,,54,,,,,,40,,,,,,,,18,,,,,83,75,78,79,,80,81,,', +',76,82,,68,69,65,,51,56,,77,57,58,,,,61,,59,60,62,260,261,66,67,,,,', +',259,290,294,92,91,93,94,,,221,,,,,,,41,,,96,95,97,86,50,88,87,89,,90', +'98,99,,84,85,38,39,37,,,,,,,,,,,,,,,,,,,,214,,,220,,,52,53,,,54,,,,', +',40,,,,,,,,219,,,,,83,75,78,79,,80,81,,,,76,82,,68,69,65,,51,56,,77', +'57,58,,,,61,,59,60,62,260,261,66,67,,,,,,259,290,294,92,91,93,94,,,221', +',,,,,,41,,,96,95,97,86,50,88,87,89,,90,98,99,,84,85,38,39,37,,,,,,,', +',,,,,,,,,,,,214,,,220,,,52,53,,,54,,,,,,40,,,,,,,,219,,,,,83,75,78,79', +',80,81,,,,76,82,,68,69,65,,51,56,,77,57,58,,,,61,,59,60,62,260,261,66', +'67,,,,,,259,290,294,92,91,93,94,,,221,,,,,,,41,,,96,95,97,86,50,88,87', +'89,,90,98,99,,84,85,38,39,37,,,,,,,,,,,,,,,,,,,,214,,,220,,,52,53,,', +'54,,,,,,40,,,,,,,,219,,,,,83,75,78,79,,80,81,,,,76,82,,68,69,65,,51', +'56,,77,57,58,,,,61,,59,60,62,260,261,66,67,,,,,,259,290,294,92,91,93', +'94,,,221,,,,,,,41,,,96,95,97,86,50,88,87,89,,90,98,99,,84,85,38,39,37', +',,,,,,,,,,,,,,,,,,,214,,,220,,,52,53,,,54,,,,,,40,,,,,,,,219,,,,,83', +'75,78,79,,80,81,,,,76,82,,68,69,65,,51,56,,77,57,58,,,,61,,59,60,62', +'260,261,66,67,,,,,,259,290,294,92,91,93,94,,,221,,,,,,,41,,,96,95,97', +'86,50,88,87,89,,90,98,99,,84,85,38,39,37,,,,,,,,,,,,,,,,,,,,214,,,220', +',,52,53,,,54,,,,,,40,,,,,,,,219,,,,,83,75,78,79,,80,81,,,,76,82,,68', +'69,65,,51,56,,77,57,58,,,,61,,59,60,62,260,261,66,67,,,,,,259,290,294', +'92,91,93,94,,,221,,,,,,,41,,,96,95,97,86,50,88,87,89,,90,98,99,,84,85', +'38,39,37,,,,,,,,,,,,,,,,,,,,214,,,220,,,52,53,,,54,,,,,,40,,,,,,,,219', +',,,,83,75,78,79,,80,81,,,,76,82,,68,69,65,,51,56,,77,57,58,,,,61,,59', +'60,62,260,261,66,67,,,,,,259,290,294,92,91,93,94,,,221,,,,,,,41,,,96', +'95,97,86,50,88,87,89,,90,98,99,,84,85,38,39,37,,,,,,,,,,,,,,,,,,,,214', +',,220,,,52,53,,,54,,,,,,40,,,,,,,,219,,,,,83,75,78,79,,80,81,,,,76,82', +',68,69,65,,51,56,,77,57,58,,,,61,,59,60,62,260,261,66,67,,,,,,259,290', +'294,92,91,93,94,,,221,,,,,,,41,,,96,95,97,86,50,88,87,89,,90,98,99,', +'84,85,38,39,37,,,,,,,,,,,,,,,,,,,,214,,,220,,,52,53,,,54,,,,,,40,,,', +',,,,219,,,,,83,75,78,79,,80,81,,,,76,82,,68,69,65,,51,56,,77,57,58,', +',,61,,59,60,62,260,261,66,67,,,,,,259,290,294,92,91,93,94,,,221,,,,', +',,41,,,96,95,97,86,50,88,87,89,,90,98,99,,84,85,38,39,37,,,,,,,,,,,', +',,,,,,,,214,,,220,,,52,53,,,54,,,,,,40,,,,,,,,219,,,,,83,75,78,79,,80', +'81,,,,76,82,,68,69,65,,51,56,,77,57,58,,,,61,,59,60,62,260,261,66,67', +',,,,,259,290,294,92,91,93,94,,,221,,,,,,,41,,,96,95,97,86,50,88,87,89', +',90,98,99,,84,85,38,39,37,,,,,,,,,,,,,,,,,,,,214,,,220,,,52,53,,,54', +',,,,,40,,,,,,,,219,,,,,83,75,78,79,,80,81,,,,76,82,,68,69,65,,51,56', +',77,57,58,,,,61,,59,60,62,260,261,66,67,,,,,,259,290,294,92,91,93,94', +',,221,,,,,,,41,,,96,95,97,86,50,88,87,89,,90,98,99,,84,85,38,39,37,', +',,,,,,,,,,,,,,,,,,214,,,220,,,52,53,,,54,,,,,,40,,,,,,,,219,,,,,83,75', +'78,79,,80,81,,,,76,82,,68,69,65,,51,56,,77,57,58,,,,61,,59,60,62,260', +'261,66,67,,,,,,259,290,294,92,91,93,94,,,221,,,,,,,41,,,96,95,97,86', +'50,88,87,89,,90,98,99,,84,85,38,39,37,,,,,,,,,,,,,,,,,,,,214,,,220,', +',52,53,,,54,,,,,,40,,,,,,,,219,,,,,83,75,78,79,,80,81,,,,76,82,,68,69', +'65,,51,56,,77,57,58,,,,61,,59,60,62,260,261,66,67,,,,,,259,290,294,92', +'91,93,94,,,221,,,,,,,41,,,96,95,97,86,50,88,87,89,,90,98,99,,84,85,38', +'39,37,,,,,,,,,,,,,,,,,,,,214,,,220,,,52,53,,,54,,,,,,40,,,,,,,,219,', +',,,83,75,78,79,,80,81,,,,76,82,,68,69,65,,51,56,,77,57,58,,,,61,,59', +'60,62,260,261,66,67,,,,,,259,290,294,92,91,93,94,,,221,,,,,,,41,,,96', +'95,97,86,50,88,87,89,,90,98,99,,84,85,38,39,37,,,,,,,,,,,,,,,,,,,,214', +',,220,,,52,53,,,54,,,,,,40,,,,,,,,219,,,,,83,75,78,79,,80,81,,,,76,82', +',68,69,65,,51,56,,77,57,58,,,,61,,59,60,62,260,261,66,67,,,,,,259,290', +'294,92,91,93,94,,,221,,,,,,,41,,,96,95,97,86,50,88,87,89,,90,98,99,', +'84,85,38,39,37,,,,,,,,,,,,,,,,,,,,214,,,220,,,52,53,,,54,,,,,,40,,,', +',,,,219,,,,,83,75,78,79,,80,81,,,,76,82,,68,69,65,,51,56,,77,57,58,', +',,61,,59,60,62,260,261,66,67,,,,,,259,290,294,92,91,93,94,,,221,,,,', +',,41,,,96,95,97,86,50,88,87,89,,90,98,99,,84,85,38,39,37,,,,,,,,,,,', +',,,,,,,,214,,,220,,,52,53,,,54,,,,,,40,,,,,,,,219,,,,,83,75,78,79,,80', +'81,,,,76,82,,68,69,65,,51,56,,77,57,58,,,,61,,59,60,62,260,261,66,67', +',,,,,259,290,294,92,91,93,94,,,221,,,,,,,41,,,96,95,97,86,50,88,87,89', +',90,98,99,,84,85,38,39,37,,,,,,,,,,,,,,,,,,,,214,,,220,,,52,53,,,54', +',,,,,40,,,,,,,,219,,,,,83,75,78,79,,80,81,,,,76,82,,68,69,65,,51,56', +',77,57,58,,,,61,,59,60,62,260,261,66,67,,,,,,259,290,294,92,91,93,94', +',,221,,,,,,,41,,,96,95,97,86,50,88,87,89,,90,98,99,,84,85,38,39,37,', +',,,,,,,,,,,,,,,,,,214,,,220,,,52,53,,,54,,,,,,40,,,,,,,,219,,,,,83,75', +'78,79,,80,81,,,,76,82,,68,69,65,,51,56,,77,57,58,,,,61,,59,60,62,260', +'261,66,67,,,,,,259,290,294,92,91,93,94,,,221,,,,,,,41,,,96,95,97,86', +'50,88,87,89,,90,98,99,,84,85,38,39,37,,,,,,,,,,,,,,,,,,,,214,,,220,', +',52,53,,,54,,,,,,40,,,,,,,,219,,,,,83,75,78,79,,80,81,,,,76,82,,68,69', +'65,,51,56,,77,57,58,,,,61,,59,60,62,260,261,66,67,,,,,,259,290,294,92', +'91,93,94,,,221,,,,,,,41,,,96,95,97,86,50,88,87,89,,90,98,99,,84,85,38', +'39,37,,,,,,,,,,,,,,,,,,,,214,,,220,,,52,53,,,54,,,,,,40,,,,,,,,219,', +',,,83,75,78,79,,80,81,,,,76,82,,68,69,65,,51,56,,77,57,58,,,,61,,59', +'60,62,260,261,66,67,,,,,,259,290,294,92,91,93,94,,,221,,,,,,,41,,,96', +'95,97,86,50,88,87,89,,90,98,99,,84,85,38,39,37,,,,,,,,,,,,,,,,,,,,214', +',,220,,,52,53,,,54,,,,,,40,,,,,,,,219,,,,,83,75,78,79,,80,81,,,,76,82', +',68,69,65,,51,56,,77,57,58,,,,61,,59,60,62,260,261,66,67,,,,,,259,290', +'294,92,91,93,94,,,221,,,,,,,41,,,96,95,97,86,50,88,87,89,,90,98,99,', +'84,85,38,39,37,,,,,,,,,,,,,,,,,,,,214,,,220,,,52,53,,,54,,,,,,40,,,', +',,,,219,,,,,83,75,78,79,,80,81,,,,76,82,,68,69,65,,51,56,,77,57,58,', +',,61,,59,60,62,260,261,66,67,,,,,,259,290,294,92,91,93,94,,,221,,,,', +',,41,,,96,95,97,86,50,88,87,89,,90,98,99,,84,85,38,39,37,,,,,,,,,,,', +',,,,,,,,214,,,220,,,52,53,,,54,,,,,,40,,,,,,,,219,,,,,83,75,78,79,,80', +'81,,,,76,82,,68,69,65,,51,56,,77,57,58,,,,61,,59,60,62,260,261,66,67', +',,,,,259,290,294,92,91,93,94,,,221,,,,,,,41,,,96,95,97,86,50,88,87,89', +',90,98,99,,84,85,38,39,37,,,,,,,,,,,,,,,,,,,,214,,,220,,,52,53,,,54', +',,,,,40,,,,,,,,219,,,,,83,75,78,79,,80,81,,,,76,82,,68,69,65,,51,56', +',77,57,58,,,,61,,59,60,62,260,261,66,67,,,,,,259,290,294,92,91,93,94', +',,221,,,,,,,41,,,96,95,97,86,50,88,87,89,,90,98,99,,84,85,38,39,37,', +',,,,,,,,,,,,,,,,,,214,,,220,,,52,53,,,54,,,,,,40,,,,,,,,219,,,,,83,75', +'78,79,,80,81,,,,76,82,,68,69,65,,51,56,,77,57,58,,,,61,,59,60,62,260', +'261,66,67,,,,,,259,290,294,92,91,93,94,,,221,,,,,,,41,,,96,95,97,86', +'50,88,87,89,,90,98,99,,84,85,38,39,37,,,,,,,,,,,,,,,,,,,,214,,,220,', +',52,53,,,54,,,,,,40,,,,,,,,219,,,,,83,75,78,79,,80,81,,,,76,82,,68,69', +'65,,51,56,,77,57,58,,,,61,,59,60,62,260,261,66,67,,,,,,259,290,294,92', +'91,93,94,,,221,,,,,,,41,,,96,95,97,86,50,88,87,89,,90,98,99,,84,85,38', +'39,37,,,,,,,,,,,,,,,,,,,,214,,,220,,,52,53,,,54,,,,,,40,,,,,,,,219,', +',,,83,75,78,79,,80,81,,,,76,82,,68,69,65,,51,56,,77,57,58,,,,61,,59', +'60,62,260,261,66,67,,,,,,259,290,294,92,91,93,94,,,221,,,,,,,41,,,96', +'95,97,86,50,88,87,89,,90,98,99,,84,85,38,39,37,,,,,,,,,,,,,,,,,,,,214', +',,220,,,52,53,,,54,,,,,,40,,,,,,,,219,,,,,83,75,78,79,,80,81,,,,76,82', +',68,69,65,,51,56,,77,57,58,,,,61,,59,60,62,260,261,66,67,,,,,,259,290', +'294,92,91,93,94,,,221,,,,,,,291,,,96,95,97,86,50,88,87,89,,90,98,99', +',84,85,,644,295,641,640,639,645,642,,,,,,,,,,,,,,,824,,,220,,,52,53', +',,54,,,,,,647,,,,,,,,,651,650,654,653,83,75,78,79,,80,81,,,,76,82,,68', +'69,65,,51,56,,77,57,58,,,,61,,59,60,62,260,261,66,67,,,,,,259,290,294', +'92,91,93,94,,,221,,,,,,,41,,,96,95,97,86,50,88,87,89,,90,98,99,,84,85', +'38,39,37,,,,,,,,,,,,,,,,,,,,214,,,220,,,52,53,,,54,,,,,,40,,,,,,,,219', +',,,,83,75,78,79,,80,81,,,,76,82,,68,69,65,,51,56,,77,57,58,,,,61,,59', +'60,62,260,261,66,67,,,,,,259,290,294,92,91,93,94,,,221,,,,,,,41,,,96', +'95,97,86,50,88,87,89,,90,98,99,,84,85,38,39,37,,,,,,,,,,,,,,,,,,,,214', +',,220,,,52,53,,,54,,,,,,40,,,,,,,,219,,,,,83,75,78,79,,80,81,,,,76,82', +',68,69,65,,51,56,,77,57,58,,,,61,,59,60,62,260,261,66,67,,,,,,259,290', +'294,92,91,93,94,,,221,,,,,,,41,,,96,95,97,86,50,88,87,89,,90,98,99,', +'84,85,38,39,37,,,,,,,,,,,,,,,,,,,,214,,,220,,,52,53,,,54,,699,,,,40', +',,,,,,,219,,,,,83,75,78,79,,80,81,,,,76,82,,68,69,65,7,51,56,,77,57', +'58,,,,61,,59,60,62,23,24,66,67,,,,,,22,28,27,92,91,93,94,,,17,,,,,,6', +'41,8,9,96,95,97,86,50,88,87,89,,90,98,99,,84,85,38,39,37,,,,,,,,,,,', +',,,,,,,,36,,,30,,,52,53,,,54,,32,,,,40,,,,,,,,18,,,,,83,75,78,79,,80', +'81,,,,76,82,,68,69,65,,51,56,,77,57,58,,,,61,,59,60,62,260,261,66,67', +',,,,,259,290,294,92,91,93,94,,,221,,,,,,,41,,,96,95,97,86,50,88,87,89', +',90,98,99,,84,85,38,39,37,,,,,,,,,,,,,,,,,,,,214,,,220,,,52,53,,,54', +',,,,,40,,,,,,,,219,,,,,83,75,78,79,,80,81,,,,76,82,,68,69,65,,51,56', +',77,57,58,,,,61,,59,60,62,260,261,66,67,,,,,,259,290,294,92,91,93,94', +',,221,,,,,,,41,,,96,95,97,86,50,88,87,89,263,90,98,99,,84,85,38,39,37', +',,,,,,,,,,,,,,,,,,,214,,,220,,,52,53,,,54,,588,,256,,40,,,,,,,,219,', +',,,83,75,78,79,,80,81,,,,76,82,,68,69,65,,51,56,,77,57,58,,,,61,,59', +'60,62,260,261,66,67,,,,,,259,290,294,92,91,93,94,,,221,,,,,,,41,,,96', +'95,97,86,50,88,87,89,263,90,98,99,,84,85,38,39,37,,,,,,,,,,,,,,,,,,', +',214,,,220,,,52,53,,,54,,,,256,,40,,,,,,,,219,,,,,83,75,78,79,,80,81', +',,,76,82,,68,69,65,,51,56,,77,57,58,,,,61,,59,60,62,23,24,66,67,,,,', +',22,28,27,92,91,93,94,,,221,,,,,,,41,,,96,95,97,86,50,88,87,89,,90,98', +'99,,84,85,38,39,37,,,,,,,,,,,,,,,,,,,,214,,,220,,,52,53,,,54,,,,,,40', +',,,,,,,219,,,,,83,75,78,79,,80,81,,,,76,82,,68,69,65,,51,56,,77,57,58', +',,,61,,59,60,62,260,261,66,67,,,,,,259,28,27,92,91,93,94,,,221,,,,,', +',41,,,96,95,97,86,50,88,87,89,263,90,98,99,,84,85,38,39,37,,,,,,,,,', +',,,,,,,,,,214,,,220,,,52,53,,,54,,258,,256,,40,,,,,,,,219,,,,,83,75', +'78,79,,80,81,,,,76,82,,68,69,65,,51,56,,77,57,58,,,,61,,59,60,62,260', +'261,66,67,,,,,,259,28,27,92,91,93,94,,,221,,,,,,,41,,,96,95,97,86,50', +'88,87,89,263,90,98,99,,84,85,38,39,37,,,,,,,,,,,,,,,,,,,,214,,,220,', +',52,53,,,54,,258,,256,,40,,,,,,,,219,,,,,83,75,78,79,,80,81,,,,76,82', +',68,69,65,,51,56,,77,57,58,,,,61,,59,60,62,260,261,66,67,,,,,,259,28', +'27,92,91,93,94,,,221,,,,,,,41,,,96,95,97,86,50,88,87,89,263,90,98,99', +',84,85,38,39,37,,,,,,,,,,,,,,,,,,,,214,,,220,,,52,53,,,54,,258,,256', +',40,,,,,,,,219,,,,,83,75,78,79,,80,81,,,,76,82,,68,69,65,,51,56,,77', +'57,58,,,,61,,59,60,62,260,261,66,67,,,,,,259,28,27,92,91,93,94,,,221', +',,,,,,41,,,96,95,97,86,50,88,87,89,263,90,98,99,,84,85,38,39,37,,,,', +',,,,,,,,,,,,,,,214,,,220,,,52,53,,,54,,258,,256,,40,,,,,,,,219,,,,,83', +'75,78,79,,80,81,,,,76,82,,68,69,65,,51,56,,77,57,58,,,,61,,59,60,62', +'260,261,66,67,,,,,,259,290,294,92,91,93,94,,,221,,,,,,,291,,,96,95,97', +'86,50,88,87,89,,90,98,99,,84,85,,644,295,641,640,639,645,642,,,,,,,', +',,,,,,,288,,,285,,,52,53,,,54,,284,,,,647,682,,,,,,,,651,650,654,653', +'83,75,78,79,,80,81,,,,76,82,,68,69,65,,51,56,,77,57,58,,,,61,,59,60', +'62,260,261,66,67,,,,,,259,290,294,92,91,93,94,,,221,,,,,,557,291,,,96', +'95,97,86,50,88,87,89,,90,98,99,,84,85,,,295,,229,233,238,239,240,235', +'237,245,246,241,242,,222,223,,,243,244,288,,,220,,,52,53,,,54,,,,226', +',232,,228,227,224,225,236,234,230,,231,,,83,75,78,79,,80,81,,,,76,82', +',,247,297,-226,,56,,77,68,69,65,,51,,,,57,58,,,,61,,59,60,62,260,261', +'66,67,,,,,,259,290,294,92,91,93,94,,,221,,,,,,,41,,,96,95,97,86,50,88', +'87,89,263,90,98,99,,84,85,38,39,37,,,,,,,,,,,,,,,,,,,,214,,,220,,,52', +'53,,,54,,588,,256,,40,,,,,,,,219,,,,,83,75,78,79,,80,81,,,,76,82,,68', +'69,65,,51,56,,77,57,58,,,,61,,59,60,62,260,261,66,67,,,,,,259,290,294', +'92,91,93,94,,,221,,,,,,,41,,,96,95,97,86,50,88,87,89,,90,98,99,,84,85', +'38,39,37,,,,,,,,,,,,,,,,,,,,214,,,220,,,52,53,,,54,,588,,256,,40,,,', +',,,,219,,,,,83,75,78,79,,80,81,,,,76,82,,68,69,65,,51,56,,77,57,58,', +',,61,,59,60,62,260,261,66,67,,,,,,259,290,294,92,91,93,94,,,221,,,,', +',,41,,,96,95,97,86,50,88,87,89,,90,98,99,,84,85,38,39,37,,,,,,,,,,,', +',,,,,,,,214,,,220,,,52,53,,,54,,,,,,40,,,,,,,,219,,,,,83,75,78,79,,80', +'81,,,,76,82,,68,69,65,,51,56,,77,57,58,,,,61,,59,60,62,260,261,66,67', +',,,,,259,290,294,92,91,93,94,,,221,,,,,,,41,,,96,95,97,86,50,88,87,89', +',90,98,99,,84,85,38,39,37,,,,,,,,,,,,,,,,,,,,214,,,220,,,52,53,,,54', +',,,,,40,,,,,,,,219,,,,,83,75,78,79,,80,81,,,,76,82,,68,69,65,,51,56', +',77,57,58,,,,61,,59,60,62,260,261,66,67,,,,,,259,290,294,92,91,93,94', +',,221,,,,,,,41,,,96,95,97,86,50,88,87,89,,90,98,99,,84,85,38,39,37,', +',,,,,,,,,,,,,,,,,,214,,,220,,,52,53,,,54,,,,,,40,,,,,,,,219,,,,,83,75', +'78,79,,80,81,,,,76,82,,68,69,65,,51,56,,77,57,58,,,,61,,59,60,62,23', +'24,66,67,,,,,,22,28,27,92,91,93,94,,,17,,,,,,,41,,,96,95,97,86,50,88', +'87,89,,90,98,99,,84,85,38,39,37,,,,,,,,,,,,,,,,,,,,214,,,220,,,52,53', +',,54,,,,,,40,,,,,,,,18,,,,,83,75,78,79,,80,81,,,,76,82,,68,69,65,,51', +'56,,77,57,58,,,,61,,59,60,62,260,261,66,67,,,,,,259,290,294,92,91,93', +'94,,,221,,,,,,,41,,,96,95,97,86,50,88,87,89,263,90,98,99,,84,85,38,39', +'37,,,,,,,,,,,,,,,,,,,,214,,,220,,,52,53,,,54,,258,,,,40,,,,,,,,219,', +',,,83,75,78,79,,80,81,,,,76,82,,68,69,65,,51,56,,77,57,58,,,,61,,59', +'60,62,260,261,66,67,,,,,,259,290,294,92,91,93,94,,,221,,,,,,,41,,,96', +'95,97,86,50,88,87,89,263,90,98,99,,84,85,38,39,37,,,,,,,,,,,,,,,,,,', +',214,,,220,,,52,53,,,54,,,,,,40,,,,,,,,219,,,,,83,75,78,79,,80,81,,', +',76,82,,68,69,65,,51,56,,77,57,58,,,,61,,59,60,62,23,24,66,67,,,,,,22', +'28,27,92,91,93,94,,,17,,,,,,,41,,,96,95,97,86,50,88,87,89,,90,98,99', +',84,85,38,39,37,,,,,,,,,,,,,,,,,,,,214,,,220,,,52,53,,,54,,,,,,40,,', +',,,,,18,,,,,83,75,78,79,,80,81,,,,76,82,,68,69,65,,51,56,,77,57,58,', +',,61,,59,60,62,23,24,66,67,,,,,,22,28,27,92,91,93,94,,,17,,,,,,,41,', +',96,95,97,86,50,88,87,89,,90,98,99,,84,85,38,39,37,,,,,,,,,,,,,,,,,', +',,214,,,220,,,52,53,,,54,,,,,,40,,,,,,,,18,,,,,83,75,78,79,,80,81,,', +',76,82,,68,69,65,,51,56,,77,57,58,,,,61,,59,60,62,23,24,66,67,,,,,,22', +'28,27,92,91,93,94,,,17,,,,,560,,41,,,96,95,97,86,50,88,87,89,,90,98', +'99,,84,85,38,39,37,229,233,238,239,240,235,237,245,246,241,242,,222', +'223,,,243,244,,214,,,220,,,52,53,,,54,,,226,,232,40,228,227,224,225', +'236,234,230,18,231,,,,83,75,78,79,,80,81,,,,76,82,104,247,,,,103,56', +',77,68,69,65,,51,,,,57,58,,,,61,,59,60,62,260,261,66,67,,,,,,259,290', +'294,92,91,93,94,,,221,,,,,,,291,,,96,95,97,86,50,88,87,89,,90,98,99', +',84,85,,644,295,641,640,639,645,642,,,,,,,,,,,,,,,329,,,30,,,52,53,', +',54,,32,,,,647,,,,,,,,,651,650,654,653,83,75,78,79,,80,81,,,,76,82,', +'68,69,65,,51,56,,77,57,58,,,,61,,59,60,62,260,261,66,67,,,,,,259,290', +'294,92,91,93,94,,,221,,,,,,,291,,,96,95,97,334,50,88,87,335,,90,98,99', +',84,85,,724,295,641,640,639,645,642,,,,,,,,,,,,341,,,336,,,220,,,52', +'53,,,54,,,,,,647,,,,,,,,,651,650,654,653,83,75,78,79,,80,81,,,,76,82', +',68,69,65,,51,56,,77,57,58,,,,61,,59,60,62,260,261,66,67,,,,,,259,290', +'294,92,91,93,94,,,221,,,,,,,291,,,96,95,97,334,50,88,87,335,,90,98,99', +',84,85,,644,295,641,640,639,645,642,,,,,,,,,,,,,,,336,,,220,,,52,53', +',,54,,,,,,647,,,,,,,,,651,650,654,653,83,75,78,79,,80,81,,,,76,82,,68', +'69,65,7,51,56,,77,57,58,,,,61,,59,60,62,23,24,66,67,,,,,,22,28,27,92', +'91,93,94,,,17,,,,,557,6,41,8,9,96,95,97,86,50,88,87,89,,90,98,99,,84', +'85,38,39,37,229,233,238,239,240,235,237,245,246,241,242,,222,223,,,243', +'244,,36,,,30,,,52,53,,,54,,32,226,,232,40,228,227,224,225,236,234,230', +'18,231,,,,83,75,78,79,,80,81,,,,76,82,,247,,,,366,56,,77,68,69,65,,51', +',,,57,58,,,,61,,59,60,62,23,24,66,67,,,,,,22,28,27,92,91,93,94,,,17', +',,,,,,41,,,96,95,97,86,50,88,87,89,,90,98,99,,84,85,38,39,37,,,,,,,', +',,,,,,,,,,,,214,,,220,,,52,53,,,54,,,,,,40,,,,,,,,18,,,,,83,75,78,79', +',80,81,,,,76,82,,68,69,65,,51,56,,77,57,58,,,,61,,59,60,62,23,24,66', +'67,,,,,,22,28,27,92,91,93,94,,,17,,,,,,,41,,,96,95,97,86,50,88,87,89', +',90,98,99,,84,85,38,39,37,,,,,,,,,,,,,,,,,,,,214,,,220,,,52,53,,,54', +',,,,,40,,,,,,,,18,,,,,83,75,78,79,,80,81,,,,76,82,,68,69,65,,51,56,', +'77,57,58,,,,61,,59,60,62,23,24,66,67,,,,,,22,28,27,92,91,93,94,,,17', +',,,,,,41,,,96,95,97,86,50,88,87,89,,90,98,99,,84,85,38,39,37,,,,,,,', +',,,,,,,,,,,,214,,,220,,,52,53,,,54,,,,,,40,,,,,,,,18,,,,,83,75,78,79', +',80,81,,,,76,82,,68,69,65,,51,56,,77,57,58,,,,61,,59,60,62,23,24,66', +'67,,,,,,22,28,27,92,91,93,94,,,17,,,,,,,41,,,96,95,97,86,50,88,87,89', +',90,98,99,,84,85,38,39,37,,,,,,,,,,,,,,,,,,,,214,,,220,,,52,53,,,54', +',,,,,40,,,,,,,,18,,,,,83,75,78,79,,80,81,,,,76,82,,68,69,65,7,51,56', +',77,57,58,,,,61,,59,60,62,23,24,66,67,,,,,,22,28,27,92,91,93,94,,,17', +',,,,,6,41,8,9,96,95,97,86,50,88,87,89,,90,98,99,,84,85,38,39,37,,,,', +',,,,,,,,,,,,,,,36,,,30,,,52,53,,,54,,32,,,,40,,,,,,,,18,,,,,83,75,78', +'79,,80,81,,,,76,82,,68,69,65,,51,56,,77,57,58,,,,61,,59,60,62,260,261', +'66,67,,,,,,259,290,294,92,91,93,94,,,221,,,,,,,291,,,96,95,97,86,50', +'88,87,89,,90,98,99,,84,85,,,295,,,,,,,,,,,,,,,,,,,,868,,,220,,,52,53', +',,54,,,,,,,,,,,,,,,,,,,83,75,78,79,,80,81,,,,76,82,,68,69,65,,51,56', +',77,57,58,,,,61,,59,60,62,260,261,66,67,,,,,,259,290,294,92,91,93,94', +',,221,,,,,,,41,,,96,95,97,86,50,88,87,89,,90,98,99,,84,85,38,39,37,', +',,,,,,,,,,,,,,,,,,214,,,220,,,52,53,,,54,,,,,,40,,,,,,,,219,,,,,83,75', +'78,79,,80,81,,,,76,82,,68,69,65,,51,56,,77,57,58,,,,61,,59,60,62,23', +'24,66,67,,,,,,22,28,27,92,91,93,94,,,221,,,,,,,41,,,96,95,97,86,50,88', +'87,89,,90,98,99,,84,85,38,39,37,,,,,,,,,,,,,,,,,,,,214,,,220,,,52,53', +',,54,,383,,,,40,,,,,,,,219,,,,,83,75,78,79,,80,81,,,,76,82,,68,69,65', +',51,56,,77,57,58,,,,61,,59,60,62,23,24,66,67,,,,,,22,28,27,92,91,93', +'94,,,221,,,,,,,41,,,96,95,97,86,50,88,87,89,,90,98,99,,84,85,38,39,37', +',,,,,,,,,,,,,,,,,,,214,,,220,,,52,53,,,54,,383,,,,40,,,,,,,,219,,,,', +'83,75,78,79,,80,81,,,,76,82,,68,69,65,,51,56,,77,57,58,,,,61,,59,60', +'62,23,24,66,67,,,,,,22,28,27,92,91,93,94,,,221,,,,,,,41,,,96,95,97,86', +'50,88,87,89,,90,98,99,,84,85,38,39,37,,,,,,,,,,,,,,,,,,,,214,,,220,', +',52,53,,,54,,,,,,40,,,,,,,,219,,,,,83,75,78,79,,80,81,,,,76,82,,68,69', +'65,,51,56,,77,57,58,,,,61,,59,60,62,260,261,66,67,,,,,,259,28,27,92', +'91,93,94,,,221,,,,,,,41,,,96,95,97,86,50,88,87,89,263,90,98,99,,84,85', +'38,39,37,,,,,,,,,,,,,,,,,,,,214,,,220,,,52,53,,,54,,258,,256,,40,,,', +',,,,219,,,,,83,75,78,79,,80,81,,,,76,82,,68,69,65,,51,56,,77,57,58,', +',,61,,59,60,62,23,24,66,67,,,,,,22,28,27,92,91,93,94,,,221,,,,,,,41', +',,96,95,97,86,50,88,87,89,,90,98,99,,84,85,38,39,37,,,,,,,,,,,,,,,,', +',,,214,,,220,,,52,53,,,54,,,,,,40,,,,,,,,219,,,,,83,75,78,79,,80,81', +',,,76,82,,68,69,65,,51,56,,77,57,58,,,,61,,59,60,62,23,24,66,67,,,,', +',22,28,27,92,91,93,94,,,17,,,,,,,41,,,96,95,97,86,50,88,87,89,,90,98', +'99,,84,85,38,39,37,,,,,,,,,,,,,,,,,,,,214,,,220,,,52,53,,,54,,,,,,40', +',,,,,,,18,,,,,83,75,78,79,,80,81,,,,76,82,,68,69,65,,51,56,,77,57,58', +',,,61,,59,60,62,23,24,66,67,,,,,,22,28,27,92,91,93,94,,,17,,,,,,,41', +',,96,95,97,86,50,88,87,89,,90,98,99,,84,85,38,39,37,,,,,,,,,,,,,,,,', +',,,214,,,220,,,52,53,,,54,,,,,,40,,,,,,,,18,,,,,83,75,78,79,,80,81,', +',,76,82,,68,69,65,,51,56,,77,57,58,,,,61,,59,60,62,23,24,66,67,,,,,', +'22,28,27,92,91,93,94,,,17,,,,,,,41,,,96,95,97,86,50,88,87,89,,90,98', +'99,,84,85,38,39,37,,,,,,,,,,,,,,,,,,,,214,,,220,,,52,53,,,54,,,,,,40', +',,,,,,,18,,,,,83,75,78,79,,80,81,,,,76,82,,68,69,65,,51,56,,77,57,58', +',,,61,,59,60,62,23,24,66,67,,,,,,22,28,27,92,91,93,94,,,17,,,,,,,41', +',,96,95,97,86,50,88,87,89,,90,98,99,,84,85,38,39,37,,,,,,,,,,,,,,,,', +',,,214,,,220,,,52,53,,,54,,,,,,40,,,,,,,,18,,,,,83,75,78,79,,80,81,', +',,76,82,210,68,69,65,,51,56,,77,57,58,,,,61,,59,60,62,260,261,66,67', +',,,,,259,290,294,92,91,93,94,,,221,,,,,,,41,,,96,95,97,86,50,88,87,89', +',90,98,99,,84,85,38,39,37,,,,,,,,,,,,,,,,,,,,214,,,220,,,52,53,,,54', +',588,,,,40,,,,,,,,219,,,,,83,75,78,79,,80,81,,,,76,82,,68,69,65,,51', +'56,,77,57,58,,,,61,,59,60,62,260,261,66,67,,,,,,259,28,27,92,91,93,94', +',,221,,,,,,,41,,,96,95,97,86,50,88,87,89,263,90,98,99,,84,85,38,39,37', +',,,,,,,,,,,,,,,,,,,214,,,220,,,52,53,,,54,,258,,256,,40,,,,,,,,219,', +',,,83,75,78,79,,80,81,,,,76,82,,68,69,65,,51,56,,77,57,58,,,,61,,59', +'60,62,260,261,66,67,,,,,,259,28,27,92,91,93,94,,,221,,,,,,,41,,,96,95', +'97,86,50,88,87,89,263,90,98,99,,84,85,38,39,37,,,,,,,,,,,,,,,,,,,,214', +',,220,,,464,53,,,54,,258,,256,,40,,,,,,,,219,,,,,83,75,78,79,,80,81', +',,,76,82,,68,69,65,,51,56,,77,57,58,,,,61,,59,60,62,260,261,66,67,,', +',,,259,28,27,92,91,93,94,,,221,,,,,,,41,,,96,95,97,86,50,88,87,89,263', +'90,98,99,,84,85,38,39,37,,,,,,,,,,,,,,,,,,,,214,,,220,,,52,53,,,54,', +'258,,256,,40,,,,,,,,219,,,,,83,75,78,79,,80,81,,,,76,82,210,68,69,65', +',51,56,,77,57,58,,,,61,,59,60,62,260,261,66,67,,,,,,259,290,294,92,91', +'93,94,,,221,,,,,,,41,,,96,95,97,86,50,88,87,89,263,90,98,99,,84,85,38', +'39,37,,,,,,,,,,,,,,,,,,,,214,,,220,,,52,53,,,54,,258,,256,,40,,,,,,', +',219,,,,,83,75,78,79,,80,81,,,,76,82,,68,69,65,,51,56,,77,57,58,,,,61', +',59,60,62,260,261,66,67,,,,,,259,290,294,92,91,93,94,,,221,,,,,,,291', +',,96,95,97,86,50,88,87,89,,90,98,99,,84,85,,,295,229,233,238,239,240', +'235,237,245,246,241,242,,222,223,,,243,244,,288,,,220,,,52,53,,,54,', +',226,,232,,228,227,224,225,236,234,230,,231,,,,83,75,78,79,,80,81,,', +',76,82,,247,,474,,,56,,77,68,69,65,,51,,,,57,58,,,,61,,59,60,62,260', +'261,66,67,,,,,,259,290,294,92,91,93,94,,,221,,,,,,,41,,,96,95,97,86', +'50,88,87,89,263,90,98,99,,84,85,38,39,37,,,,,,,,,,,,,,,,,,,,214,,,220', +',,52,53,,,54,,258,,256,,40,,,,,,,,219,,,,,83,75,78,79,,80,81,,,,76,82', +',68,69,65,,51,56,,77,57,58,,,,61,,59,60,62,260,261,66,67,,,,,,259,290', +'294,92,91,93,94,,,221,,,,,,,41,,,96,95,97,86,50,88,87,89,,90,98,99,', +'84,85,38,39,37,,,,,,,,,,,,,,,,,,,,214,,,220,,,52,53,,,54,,,,,,40,,,', +',,,,219,,,,,83,75,78,79,,80,81,,,,76,82,,68,69,65,,51,56,,77,57,58,', +',,61,,59,60,62,260,261,66,67,,,,,,259,290,294,92,91,93,94,,,221,,,,', +',,41,,,96,95,97,86,50,88,87,89,,90,98,99,,84,85,38,39,37,,,,,,,,,,,', +',,,,,,,,214,,,220,,,52,53,,,54,,,,,,40,,,,,,,,219,,,,,83,75,78,79,,80', +'81,,,,76,82,,68,69,65,,51,56,,77,57,58,,,,61,,59,60,62,260,261,66,67', +',,,,,259,290,294,92,91,93,94,,,221,,,,,,,41,,,96,95,97,86,50,88,87,89', +',90,98,99,,84,85,38,39,37,,,,,,,,,,,,,,,,,,,,214,,,220,,,52,53,,,54', +',,,,,40,,,,,,,,219,,,,,83,75,78,79,,80,81,,,,76,82,,68,69,65,,51,56', +',77,57,58,,,,61,,59,60,62,260,261,66,67,,,,,,259,290,294,92,91,93,94', +',,221,,,,,,,41,,,96,95,97,86,50,88,87,89,,90,98,99,,84,85,38,39,37,', +',,,,,,,,,,,,,,,,,,214,,,220,,,52,53,,,54,,,,,,40,,,,,,,,219,,,,,83,75', +'78,79,,80,81,,,,76,82,,68,69,65,,51,56,,77,57,58,,,,61,,59,60,62,23', +'24,66,67,,,,,,22,28,27,92,91,93,94,,,221,,,,,,,41,,,96,95,97,86,50,88', +'87,89,,90,98,99,,84,85,38,39,37,,,,,,,,,,,,,,,,,,,,214,,,220,,,52,53', +',,54,,,,,,40,,,,,,,,219,,,,,83,75,78,79,,80,81,,,,76,82,,68,69,65,,51', +'56,,77,57,58,,,,61,,59,60,62,260,261,66,67,,,,,,259,290,294,92,91,93', +'94,,,221,,,,,,,41,,,96,95,97,86,50,88,87,89,,90,98,99,,84,85,38,39,37', +',,,,,,,,,,,,,,,,,,,214,,,220,,,52,53,,,54,,,,,,40,,,,,,,,219,,,,,83', +'75,78,79,,80,81,,,,76,82,,68,69,65,,51,56,,77,57,58,,,,61,,59,60,62', +'260,261,66,67,,,,,,259,290,294,92,91,93,94,,,221,,,,,,,291,,,96,95,97', +'86,50,88,87,89,,90,98,99,,84,85,,,295,,,,,,,,,,,,,,,,,,,,288,,,285,', +',52,53,,,54,,,,,,,,,,,,,,,,,,,83,75,78,79,,80,81,,,,76,82,,68,69,65', +',51,56,,77,57,58,,,,61,,59,60,62,23,24,66,67,,,,,,22,28,27,92,91,93', +'94,,,17,,,,,,,41,,,96,95,97,86,50,88,87,89,,90,98,99,,84,85,38,39,37', +',,,,,,,,,,,,,,,,,,,214,,,220,,,52,53,,,54,,,,,,40,,,,,,,,18,,,,,83,75', +'78,79,,80,81,,,,76,82,,68,69,65,,51,56,,77,57,58,,,,61,,59,60,62,260', +'261,66,67,,,,,,259,290,294,92,91,93,94,,,221,,,,,,,41,,,96,95,97,86', +'50,88,87,89,,90,98,99,,84,85,38,39,37,,,,,,,,,,,,,,,,,,,,214,,,220,492', +',52,53,,,54,,,,,,40,,,,,,,,219,,,,,83,75,78,79,,80,81,,,,76,82,,68,69', +'65,,51,56,,77,57,58,,,,61,,59,60,62,260,261,66,67,,,,,,259,290,294,92', +'91,93,94,,,221,,,,,,,291,,,96,95,97,86,50,88,87,89,,90,98,99,,84,85', +',,295,,,,,,,,,,,,,,,,,,,,288,,,285,,,52,53,,,54,,,,,,,,,,,,,,,,,,,83', +'75,78,79,,80,81,,,,76,82,,68,69,65,,51,56,,77,57,58,,,,61,,59,60,62', +'23,24,66,67,,,,,,22,28,27,92,91,93,94,,,17,,,,,,,41,,,96,95,97,86,50', +'88,87,89,,90,98,99,,84,85,38,39,37,,,,,,,,,,,,,,,,,,,,214,,,220,,,52', +'53,,,54,,,,,,40,,,,,,,,18,,,,,83,75,78,79,,80,81,,,,76,82,,68,69,65', +',51,56,,77,57,58,,,,61,,59,60,62,23,24,66,67,,,,,,22,28,27,92,91,93', +'94,,,17,,,,,,,41,,,96,95,97,86,50,88,87,89,,90,98,99,,84,85,38,39,37', +',,,,,,,,,,,,,,,,,,,214,,,220,,,52,53,,,54,,,,,,40,,,,,,,,18,,,,,83,75', +'78,79,,80,81,,,,76,82,,68,69,65,,51,56,,77,57,58,,,,61,,59,60,62,260', +'261,66,67,,,,,,259,290,294,92,91,93,94,,,221,,,,,,,291,,,96,95,97,86', +'50,88,87,89,,90,98,99,,84,85,,,295,,,,,,,,,,,,,,,,,,,,288,,,285,,,52', +'53,,,54,,,,,,,,,,,,,,,,,,,83,75,78,79,,80,81,,,,76,82,,68,69,65,,51', +'56,,77,57,58,,,,61,,59,60,62,260,261,66,67,,,,,,259,290,294,92,91,93', +'94,,,221,,,,,,,41,,,96,95,97,86,50,88,87,89,,90,98,99,,84,85,38,39,37', +',,,,,,,,,,,,,,,,,,,214,,,220,,,52,53,,,54,,,,,,40,,,,,,,,219,,,,,83', +'75,78,79,,80,81,,,,76,82,,68,69,65,,51,56,,77,57,58,,,,61,,59,60,62', +'23,24,66,67,,,,,,22,28,27,92,91,93,94,,,17,,,,,,,41,,,96,95,97,86,50', +'88,87,89,,90,98,99,,84,85,38,39,37,,,,,,,,,,,,,,,,,,,,214,,,220,,,52', +'53,,,54,,,,,,40,,,,,,,,18,,,,,83,75,78,79,,80,81,,,,76,82,,68,69,65', +',51,56,,77,57,58,,,,61,,59,60,62,260,261,66,67,,,,,,259,290,294,92,91', +'93,94,,,221,,,,,,,41,,,96,95,97,86,50,88,87,89,,90,98,99,,84,85,38,39', +'37,,,,,,,,,,,,,,,,,,,,214,,,220,,,52,53,,,54,,,,,,40,,,,,,,,219,,,,', +'83,75,78,79,,80,81,,,,76,82,,68,69,65,,51,56,,77,57,58,,,,61,,59,60', +'62,23,24,66,67,,,,,,22,28,27,92,91,93,94,,,221,,,,,,,41,,,96,95,97,86', +'50,88,87,89,,90,98,99,,84,85,38,39,37,,,,,,,,,,,,,,,,,,,,214,,,220,', +',52,53,,,54,,,,,,40,,,,,,,,219,,,,,83,75,78,79,,80,81,,,,76,82,,68,69', +'65,,51,56,,77,57,58,,,,61,,59,60,62,23,24,66,67,,,,,,22,28,27,92,91', +'93,94,,,221,,,,,,,41,,,96,95,97,86,50,88,87,89,,90,98,99,,84,85,38,39', +'37,,,,,,,,,,,,,,,,,,,,214,,,220,,,52,53,,,54,,,,,,40,,,,,,,,219,,,,', +'83,75,78,79,,80,81,,,,76,82,,68,69,65,,51,56,,77,57,58,,,,61,,59,60', +'62,23,24,66,67,,,,,,22,28,27,92,91,93,94,,,221,,,,,,,41,,,96,95,97,86', +'50,88,87,89,,90,98,99,,84,85,38,39,37,,,,,,,,,,,,,,,,,,,,214,,,220,', +',52,53,,,54,,,,,,40,,,,,,,,219,,,,,83,75,78,79,,80,81,,,,76,82,,68,69', +'65,,51,56,,77,57,58,,,,61,,59,60,62,260,261,66,67,,,,,,259,290,294,92', +'91,93,94,,,221,,,,,,,41,,,96,95,97,86,50,88,87,89,,90,98,99,,84,85,38', +'39,37,,,,,,,,,,,,,,,,,,,,214,,,220,,,52,53,,,54,,,,,,40,,,,,,,,219,', +',,,83,75,78,79,,80,81,,,,76,82,,68,69,65,,51,56,,77,57,58,,,,61,,59', +'60,62,260,261,66,67,,,,,,259,290,294,92,91,93,94,,,221,,,,,,,41,,,96', +'95,97,86,50,88,87,89,,90,98,99,,84,85,38,39,37,,,,,,,,,,,,,,,,,,,,214', +',,220,,,52,53,,,54,,,,,,40,,,,,,,,219,,,,,83,75,78,79,,80,81,,,,76,82', +',68,69,65,,51,56,,77,57,58,,,,61,,59,60,62,23,24,66,67,,,,,,22,28,27', +'92,91,93,94,,,17,,,,,,,41,,,96,95,97,86,50,88,87,89,,90,98,99,,84,85', +'38,39,37,,,,,,,,,,,,,,,,,,,,214,,,220,,,52,53,,,54,,,,,,40,,,,,,,,18', +',,,,83,75,78,79,,80,81,,,,76,82,,68,69,65,,51,56,,77,57,58,,,,61,,59', +'60,62,260,261,66,67,,,,,,259,290,294,92,91,93,94,,,221,,,,,,,41,,,96', +'95,97,86,50,88,87,89,,90,98,99,,84,85,38,39,37,,,,,,,,,,,,,,,,,,,,214', +',,220,,,52,53,,,54,,,,,,40,,,,,,,,219,,,,,83,75,78,79,,80,81,,,,76,82', +',68,69,65,,51,56,,77,57,58,,,,61,,59,60,62,23,24,66,67,,,,,,22,28,27', +'92,91,93,94,,,17,,,,,,,41,,,96,95,97,86,50,88,87,89,,90,98,99,,84,85', +'38,39,37,,,,,,,,,,,,,,,,,,,,214,,,220,,,52,53,,,54,,,,,,40,,,,,,,,18', +',,,,83,75,78,79,,80,81,,,,76,82,,68,69,65,,51,56,,77,57,58,,,,61,,59', +'60,62,260,261,66,67,,,,,,259,28,27,92,91,93,94,,,221,,,,,,,41,,,96,95', +'97,86,50,88,87,89,263,90,98,99,,84,85,38,39,37,,,,,,,,,,,,,,,,,,,,214', +',,220,,,52,53,,,54,,258,,256,,40,,,,,,,,219,,,,,83,75,78,79,,80,81,', +',,76,82,,68,69,65,,51,56,,77,57,58,,,,61,,59,60,62,260,261,66,67,,,', +',,259,28,27,92,91,93,94,,,221,,,,,,,41,,,96,95,97,86,50,88,87,89,263', +'90,98,99,,84,85,38,39,37,,,,,,,,,,,,,,,,,,,,214,,,220,,,52,53,,,54,', +'258,,256,,40,,,,,,,,219,,,,,83,75,78,79,,80,81,,,,76,82,,68,69,65,,51', +'56,,77,57,58,,,,61,,59,60,62,260,261,66,67,,,,,,259,290,294,92,91,93', +'94,,,221,,,,,,,41,,,96,95,97,86,50,88,87,89,,90,98,99,,84,85,38,39,37', +',,,,,,,,,,,,,,,,,,,214,,,220,,,52,53,,,54,,,,,,40,,,,,,,,219,,,,,83', +'75,78,79,,80,81,,,,76,82,,68,69,65,,51,56,,77,57,58,,,,61,,59,60,62', +'260,261,66,67,,,,,,259,290,294,92,91,93,94,,,221,,,,,,,41,,,96,95,97', +'86,50,88,87,89,,90,98,99,,84,85,38,39,37,,,,,,,,,,,,,,,,,,,,214,,,220', +',,52,53,,,54,,,,,,40,,,,,,,,219,,,,,83,75,78,79,,80,81,,,,76,82,,68', +'69,65,,51,56,,77,57,58,,,,61,,59,60,62,260,261,66,67,,,,,,259,290,294', +'92,91,93,94,,,221,,,,,,,41,,,96,95,97,86,50,88,87,89,,90,98,99,,84,85', +'38,39,37,,,,,,,,,,,,,,,,,,,,214,,,220,,,52,53,,,54,,,,,,40,,,,,,,,219', +',,,,83,75,78,79,,80,81,,,,76,82,,68,69,65,,51,56,,77,57,58,,,,61,,59', +'60,62,260,261,66,67,,,,,,259,28,27,92,91,93,94,,,221,,,,,,,41,,,96,95', +'97,86,50,88,87,89,263,90,98,99,,84,85,38,39,37,,,,,,,,,,,,,,,,,,,,214', +',,220,,,52,53,,,54,,258,,256,,40,,,,,,,,219,,,,,83,75,78,79,,80,81,', +',,76,82,,68,69,65,,51,56,,77,57,58,,,,61,,59,60,62,260,261,66,67,,,', +',,259,290,294,92,91,93,94,,,221,,,,,,,41,,,96,95,97,86,50,88,87,89,', +'90,98,99,,84,85,38,39,37,,,,,,,,,,,,,,,,,,,,214,,,220,,,52,53,,,54,', +'258,,,,40,,,,,,,,219,,,,,83,75,78,79,,80,81,,,,76,82,,68,69,65,,51,56', +',77,57,58,,,,61,,59,60,62,260,261,66,67,,,,,,259,290,294,92,91,93,94', +',,221,,,,,,,41,,,96,95,97,86,50,88,87,89,263,90,98,99,,84,85,38,39,37', +',,,,,,,,,,,,,,,,,,,214,,,220,,,52,53,,,54,,,,,,40,,,,,,,,219,,,,,83', +'75,78,79,,80,81,,,,76,82,,68,69,65,,51,56,,77,57,58,,,,61,,59,60,62', +'260,261,66,67,,,,,,259,290,294,92,91,93,94,,,221,,,,,,,41,,,96,95,97', +'86,50,88,87,89,263,90,98,99,,84,85,38,39,37,,,,,,,,,,,,,,,,,,,,214,', +',220,,,52,53,,,54,,588,,,,40,,,,,,,,219,,,,,83,75,78,79,,80,81,,,,76', +'82,,68,69,65,,51,56,,77,57,58,,,,61,,59,60,62,260,261,66,67,,,,,,259', +'290,294,92,91,93,94,,,221,,,,,,,41,,,96,95,97,86,50,88,87,89,,90,98', +'99,,84,85,38,39,37,,,,,,,,,,,,,,,,,,,,214,,,220,,,52,53,,,54,,383,,', +',40,,,,,,,,219,,,,,83,75,78,79,,80,81,,,,76,82,,68,69,65,,51,56,,77', +'57,58,,,,61,,59,60,62,23,24,66,67,,,,,,22,28,27,92,91,93,94,,,17,,,', +',,,41,,,96,95,97,86,50,88,87,89,,90,98,99,,84,85,38,39,37,,,,,,,,,,', +',,,,,,,,,214,,,220,,,52,53,,,54,,,,,,40,,,,,,,,18,,,,,83,75,78,79,,80', +'81,,,,76,82,,68,69,65,,51,56,,77,57,58,,,,61,,59,60,62,260,261,66,67', +',,,,,259,290,294,92,91,93,94,,,221,,,,,,,41,,,96,95,97,86,50,88,87,89', +',90,98,99,,84,85,38,39,37,,,,,,,,,,,,,,,,,,,,214,,,220,,,52,53,,,54', +',,,,,40,,,,,,,,219,,,,,83,75,78,79,,80,81,,,,76,82,,68,69,65,,51,56', +',77,57,58,,,,61,,59,60,62,260,261,66,67,,,,,,259,290,294,92,91,93,94', +',,221,,,,,,,41,,,96,95,97,86,50,88,87,89,,90,98,99,,84,85,38,39,37,', +',,,,,,,,,,,,,,,,,,214,,,220,,,52,53,,,54,,,,,,40,,,,,,,,219,,,,,83,75', +'78,79,,80,81,,,,76,82,,68,69,65,,51,56,,77,57,58,,,,61,,59,60,62,260', +'261,66,67,,,,,,259,290,294,92,91,93,94,,,221,,,,,,,41,,,96,95,97,86', +'50,88,87,89,,90,98,99,,84,85,38,39,37,,,,,,,,,,,,,,,,,,,,214,,,220,', +',52,53,,,54,,,,,,40,,,,,,,,219,,,,,83,75,78,79,,80,81,,,,76,82,,68,69', +'65,,51,56,,77,57,58,,,,61,,59,60,62,260,261,66,67,,,,,,259,290,294,92', +'91,93,94,,,221,,,,,,,291,,,96,95,97,86,50,88,87,89,,90,98,99,,84,85', +',,295,,,,,,,,,,,,,,,,,,,,288,,,285,,,52,53,,,54,,,,,,,,,,,,,,,,,,,83', +'75,78,79,,80,81,,,,76,82,,68,69,65,,51,56,,77,57,58,,,,61,,59,60,62', +'260,261,66,67,,,,,,259,28,27,92,91,93,94,,,221,,,,,,,41,,,96,95,97,86', +'50,88,87,89,263,90,98,99,,84,85,38,39,37,,,,,,,,,,,,,,,,,,,,214,,,220', +',,52,53,,,54,,258,,256,,40,,,,,,,,219,,,,,83,75,78,79,,80,81,,,,76,82', +',68,69,65,,51,56,,77,57,58,,,,61,,59,60,62,260,261,66,67,,,,,,259,290', +'294,92,91,93,94,,,221,,,,,,,291,,,96,95,97,86,50,88,87,89,,90,98,99', +',84,85,,,295,,,,,,,,,,,,,,,,,,,,288,,,285,,,52,53,,,54,,,,,,,,,,,,,', +',,,,,83,75,78,79,,80,81,,,,76,82,,68,69,65,,51,56,,77,57,58,,,,61,,59', +'60,62,23,24,66,67,,,,,,22,28,27,92,91,93,94,,,17,,,,,,,41,,,96,95,97', +'86,50,88,87,89,263,90,98,99,,84,85,38,39,37,229,233,238,239,240,235', +'237,245,246,241,242,,222,223,,,243,244,,214,,-226,220,,,52,53,,,54,', +',226,256,232,40,228,227,224,225,236,234,230,18,231,,,,83,75,78,79,,80', +'81,,,,76,82,,247,,-226,,,56,,77,162,173,163,186,159,179,169,168,189', +'190,184,167,166,161,187,191,192,171,160,174,178,180,172,165,,,,181,188', +'183,182,175,185,170,158,177,176,,,,,,157,164,155,156,152,153,154,114', +'116,,,115,,,,,,,,147,148,,144,126,127,128,135,132,134,,,129,130,,,,149', +'150,136,137,,,,,,,,,,,,,,141,140,,125,146,143,142,138,139,133,131,123', +'145,124,,,151,83,,,,,,,,,,,82,162,173,163,186,159,179,169,168,189,190', +'184,167,166,161,187,191,192,171,160,174,178,180,172,165,,,,181,188,183', +'182,175,185,170,158,177,176,,,,,,157,164,155,156,152,153,154,114,116', +',,115,,,,,,,,147,148,,144,126,127,128,135,132,134,,,129,130,,,,149,150', +'136,137,,,,,,,,,,,,,,141,140,,125,146,143,142,138,139,133,131,123,145', +'124,,,151,83,,,,,,,,,,,82,162,173,163,186,159,179,169,168,189,190,184', +'167,166,161,187,191,192,171,160,174,178,180,172,165,,,,181,188,183,182', +'175,185,170,158,177,176,,,,,,157,164,155,156,152,153,154,114,116,113', +',115,,,,,,,,147,148,,144,126,127,128,135,132,134,,,129,130,,,,149,150', +'136,137,,,,,,,,,,,,,,141,140,,125,146,143,142,138,139,133,131,123,145', +'124,,,151,83,,,,,,,,,,,82,162,173,163,186,159,179,169,168,189,190,184', +'167,166,161,187,191,192,171,160,174,178,180,172,165,,,,181,188,183,182', +'175,185,170,158,177,176,,,,,,157,164,155,156,152,153,154,114,116,,,115', +',,,,,,,147,148,,144,126,127,128,135,132,134,,,129,130,,,,149,150,136', +'137,,,,,,,,,,,,,,141,140,,125,146,143,142,138,139,133,131,123,145,124', +',,151,83,,,,,,,,,,,82,162,173,163,186,159,179,169,168,189,190,184,167', +'166,161,187,191,192,171,160,174,178,180,172,165,,,,181,188,183,182,175', +'185,170,158,177,176,,,,,,157,164,155,156,152,153,154,114,116,,,115,', +',,,,,,147,148,,144,126,127,128,135,132,134,,,129,130,,,,149,150,136', +'137,,,,,,,,,,,,,,141,140,,125,146,143,142,138,139,133,131,123,145,124', +',,151,162,173,163,186,159,179,169,168,189,190,184,167,166,161,187,191', +'192,171,160,174,178,180,172,165,,,,181,188,183,351,350,352,349,158,177', +'176,,,,,,157,164,155,156,346,347,348,344,116,88,87,345,,90,,,,,,147', +'148,,144,126,127,128,135,132,134,,,129,130,,,,149,150,136,137,,,,,,356', +',,,,,,,141,140,,125,146,143,142,138,139,133,131,123,145,124,576,403', +'151,,577,,,,,,,,147,148,,144,126,127,128,135,132,134,,,129,130,,,,149', +'150,136,137,,,,,,269,,,,,,,,141,140,,125,146,143,142,138,139,133,131', +'123,145,124,456,396,151,,457,,,,,,,,147,148,,144,126,127,128,135,132', +'134,,,129,130,,,,149,150,136,137,,,,,,269,,,,,,,,141,140,,125,146,143', +'142,138,139,133,131,123,145,124,392,396,151,,393,,,,,,,,147,148,,144', +'126,127,128,135,132,134,,,129,130,,,,149,150,136,137,,,,,,269,,,,,,', +',141,140,,125,146,143,142,138,139,133,131,123,145,124,574,396,151,,575', +',,,,,,,147,148,,144,126,127,128,135,132,134,,,129,130,,,,149,150,136', +'137,,,,,,269,,,,,,,,141,140,,125,146,143,142,138,139,133,131,123,145', +'124,942,403,151,,941,,,,,,,,147,148,,144,126,127,128,135,132,134,,,129', +'130,,,,149,150,136,137,,,,,,269,,,,,,,,141,140,,125,146,143,142,138', +'139,133,131,123,145,124,611,396,151,,612,,,,,,,,147,148,,144,126,127', +'128,135,132,134,,,129,130,,,,149,150,136,137,,,,,,269,,,,,,,,141,140', +',125,146,143,142,138,139,133,131,123,145,124,614,403,151,,615,,,,,,', +',147,148,,144,126,127,128,135,132,134,,,129,130,,,,149,150,136,137,', +',,,,269,,,,,,,,141,140,,125,146,143,142,138,139,133,131,123,145,124', +'576,403,151,,577,,,,,,,,147,148,,144,126,127,128,135,132,134,,,129,130', +',,,149,150,136,137,,,,,,269,,,,,,,,141,140,,125,146,143,142,138,139', +'133,131,123,145,124,398,403,151,,400,,,,,,,,147,148,,144,126,127,128', +'135,132,134,,,129,130,,,,149,150,136,137,,,,,,269,,,,,,,,141,140,,125', +'146,143,142,138,139,133,131,123,145,124,574,396,151,,575,,,,,,,,147', +'148,,144,126,127,128,135,132,134,,,129,130,,,,149,150,136,137,,,,,,269', +',,,,,,,141,140,,125,146,143,142,138,139,133,131,123,145,124,920,396', +'151,,921,,,,,,,,147,148,,144,126,127,128,135,132,134,,,129,130,,,,149', +'150,136,137,,,,,,269,,,,,,,,141,140,,125,146,143,142,138,139,133,131', +'123,145,124,456,396,151,,457,,,,,,,,147,148,,144,126,127,128,135,132', +'134,,,129,130,,,,149,150,136,137,,,,,,,,,,,,,,141,140,,125,146,143,142', +'138,139,133,131,123,145,124,456,396,151,,457,,,,,,,,147,148,,144,126', +'127,128,135,132,134,,,129,130,,,,149,150,136,137,,,,,,,,,,,,,,141,140', +',125,146,143,142,138,139,133,131,123,145,124,669,403,151,,670,,,,,,', +',147,148,,144,126,127,128,135,132,134,,,129,130,,,,149,150,136,137,', +',,,,269,,,,,,,,141,140,,125,146,143,142,138,139,133,131,123,145,124', +'672,403,151,,673,,,,,,,,147,148,,144,126,127,128,135,132,134,,,129,130', +',,,149,150,136,137,,,,,,269,,,,,,,,141,140,,125,146,143,142,138,139', +'133,131,123,145,124,922,403,151,,923,,,,,,,,147,148,,144,126,127,128', +'135,132,134,,,129,130,,,,149,150,136,137,,,,,,269,,,,,,,,141,140,,125', +'146,143,142,138,139,133,131,123,145,124,667,396,151,,668,,,,,,,,147', +'148,,144,126,127,128,135,132,134,,,129,130,,,,149,150,136,137,,,,,,269', +',,,,,,,141,140,,125,146,143,142,138,139,133,131,123,145,124,,,151,229', +'233,238,239,240,235,237,245,246,241,242,,222,223,,,243,244,,,,,,,,,', +',,,,,226,,232,,228,227,224,225,236,234,230,,231,,229,233,238,239,240', +'235,237,245,246,241,242,,222,223,,247,243,244,,,,,,,,,,,,,,,226,,232', +',228,227,224,225,236,234,230,,231,,229,233,238,239,240,235,237,245,246', +'241,242,,222,223,,247,243,244,,,,,,,,,,,,,,,226,,232,,228,227,224,225', +'236,234,230,,231,,229,233,238,239,240,235,237,245,246,241,242,,222,223', +',247,243,244,,,,,,,,,,,,,,,226,,232,,228,227,224,225,236,234,230,,231', +',229,233,238,239,240,235,237,245,246,241,242,,222,223,210,247,243,244', +',,,,,,,,,,,,,,226,,232,,228,227,224,225,236,234,230,,231,,229,233,238', +'239,240,235,237,245,246,241,242,,222,223,,247,243,244,,,,,,,,,,,,,,', +'226,,232,,228,227,224,225,236,234,230,,231,,229,233,238,239,240,235', +'237,245,246,241,242,,222,223,,247,243,244,,,,,,,,,,,,,,,226,,232,,228', +'227,224,225,236,234,230,,231,,229,233,238,239,240,235,237,245,246,241', +'242,,222,223,,247,243,244,,,,,,,,,,,,,,,226,,232,,228,227,224,225,236', +'234,230,,231,,229,233,238,239,240,235,237,245,246,241,242,,222,223,', +'247,243,244,,,,,,,,,,,,,,,226,,232,,228,227,224,225,236,234,230,,231', +',229,233,238,239,240,235,237,245,246,241,242,,222,223,,247,243,244,', +',,,,,,,,,,,,,226,,232,,228,227,224,225,236,234,230,,231,,229,233,238', +'239,240,235,237,245,246,241,242,,222,223,,247,243,244,,,,,,,,,,,,,,', +'226,,232,,228,227,224,225,236,234,230,,231,,229,233,238,239,240,235', +'237,245,246,241,242,,222,223,,247,243,244,,,,,,,,,,,,,,,226,,232,,228', +'227,224,225,236,234,230,,231,,229,233,238,239,240,235,237,245,246,241', +'242,,222,223,,247,243,244,,,,,,,,,,,,,,,226,,232,,228,227,224,225,236', +'234,230,,231,,,,,,,,,,,,,,,,,247' ] + racc_action_table = arr = ::Array.new(23453, nil) + idx = 0 + clist.each do |str| + str.split(',', -1).each do |i| + arr[idx] = i.to_i unless i.empty? + idx += 1 + end + end + +clist = [ +'400,363,745,321,320,825,668,400,400,400,781,537,537,400,400,340,400', +'598,336,465,595,17,336,622,622,330,362,446,846,665,920,466,311,309,309', +'311,400,400,345,400,400,400,400,400,921,345,851,213,851,670,512,667', +'632,465,595,879,944,822,17,598,41,446,363,363,363,466,400,400,400,400', +'400,400,400,400,400,400,400,400,400,400,511,782,400,400,400,519,400', +'531,531,362,400,829,55,400,410,410,345,213,400,830,400,537,400,400,400', +'400,400,400,400,327,400,668,400,622,670,781,745,321,320,825,340,745', +'321,320,825,577,400,400,922,400,330,400,577,577,577,400,400,577,577', +'577,340,577,846,665,920,340,665,846,665,920,512,577,577,577,670,512', +'667,632,921,923,26,577,577,921,577,577,577,577,577,879,944,822,575,831', +'879,944,822,531,55,669,511,782,531,3,410,511,782,548,3,416,519,577,577', +'577,577,577,577,577,577,577,577,577,577,577,577,922,611,577,577,577', +'606,577,577,292,327,577,644,606,577,577,715,577,575,577,26,577,361,577', +'577,577,577,577,577,577,834,577,923,577,614,416,215,835,922,823,669', +'837,26,922,548,548,823,577,577,577,577,576,577,548,577,823,577,577,576', +'576,576,644,561,576,576,576,715,576,611,923,324,934,934,292,923,324', +'576,576,576,576,669,574,347,361,361,361,215,576,576,347,576,576,576', +'576,576,292,683,823,612,614,614,683,350,724,611,561,840,611,25,350,315', +'360,561,315,611,25,842,576,576,576,576,576,576,576,576,576,576,576,576', +'576,576,574,738,576,576,576,614,576,576,614,347,576,35,349,576,576,614', +'576,36,576,349,576,724,576,576,576,576,576,576,576,350,576,576,576,612', +'582,25,582,582,582,582,582,360,360,360,848,392,576,576,576,576,89,576', +'849,576,35,576,576,89,89,89,530,35,89,89,89,530,89,738,854,612,349,582', +'612,423,89,859,89,89,89,612,582,582,582,582,319,319,89,89,392,89,89', +'89,89,89,767,392,767,767,767,767,767,348,860,738,861,423,738,359,348', +'423,423,862,358,738,582,864,89,89,89,89,89,89,89,89,89,89,89,89,89,89', +'73,868,89,89,89,631,89,89,631,73,89,34,312,89,89,312,89,14,89,73,89', +'875,89,89,89,89,89,89,89,348,89,894,89,894,894,894,894,894,359,359,359', +'20,767,358,358,358,89,89,89,89,86,89,299,89,42,89,89,86,86,86,14,42', +'86,86,86,393,86,14,422,880,42,881,13,344,86,896,86,86,86,13,344,37,37', +'672,295,295,86,86,13,86,86,86,86,86,677,299,656,656,12,677,422,11,299', +'346,422,422,10,354,393,894,346,917,42,919,354,393,86,86,86,86,86,86', +'86,86,86,86,86,86,86,86,13,344,86,86,86,672,86,86,15,15,86,9,672,86', +'86,8,86,672,86,926,86,672,86,86,86,86,86,86,86,398,86,346,86,352,289', +'354,398,398,398,672,352,289,398,398,927,398,86,86,86,86,289,86,351,86', +'398,86,86,928,929,351,522,930,335,672,932,398,398,522,398,398,398,398', +'398,935,936,937,522,938,939,841,940,841,841,841,841,841,941,461,113', +'467,470,352,289,113,113,398,398,398,398,398,398,398,398,398,398,398', +'398,398,398,469,351,398,398,398,335,398,841,473,522,398,475,335,398', +'480,334,841,335,398,484,398,335,398,398,398,398,398,398,398,493,398', +'398,398,496,286,427,426,508,425,335,424,286,513,514,412,28,398,398,399', +'398,286,398,28,28,28,398,398,28,28,28,390,28,386,335,541,541,441,334', +'541,541,541,28,28,328,334,384,378,545,377,334,328,28,28,334,28,28,28', +'28,28,328,551,723,286,723,723,723,558,723,441,562,565,334,441,441,441', +'441,4,4,4,4,4,28,28,28,28,28,28,28,28,28,28,28,28,28,28,334,442,28,28', +'28,867,328,28,569,28,28,578,867,28,28,580,28,585,28,587,28,867,28,28', +'28,28,28,28,28,331,28,329,28,442,338,599,601,442,442,442,442,338,326', +'325,608,404,28,28,610,28,338,28,404,404,404,28,613,404,404,404,316,404', +'866,867,866,866,866,302,866,616,404,404,404,404,302,365,365,365,365', +'365,617,404,404,302,404,404,404,404,404,942,620,621,338,314,647,623', +'647,647,647,647,647,111,111,111,111,111,313,626,627,634,635,404,404', +'404,404,404,404,404,404,404,404,404,404,404,404,302,636,404,404,404', +'637,647,404,645,652,404,655,658,404,404,647,404,663,404,666,404,308', +'404,404,404,404,404,404,404,307,404,404,404,304,301,675,479,300,287', +'680,296,1,698,479,294,287,404,404,404,404,50,404,479,404,287,404,291', +'50,50,50,951,960,50,50,50,754,50,754,754,754,754,754,673,290,288,717', +'50,50,50,673,718,719,721,722,673,726,50,50,673,50,50,50,50,50,479,283', +'287,282,734,735,736,764,754,764,764,764,764,764,737,281,279,754,754', +'754,754,268,50,50,50,50,50,50,50,50,50,50,50,50,50,50,673,257,50,50', +'50,752,760,50,764,254,50,766,253,50,50,768,50,764,50,769,50,772,50,50', +'50,50,50,50,50,221,50,775,50,217,216,759,212,759,759,759,759,759,214', +'212,784,193,50,50,50,50,455,50,212,50,788,50,789,455,455,455,792,615', +'455,455,455,793,455,961,615,962,805,806,759,615,812,813,455,615,814', +'816,100,824,,759,759,,455,455,,455,455,455,455,455,212,,,,803,,803,803', +'803,803,803,,,,,,,,533,,533,533,533,533,533,615,,,,,,,,455,,403,,,,', +'455,803,403,403,403,455,455,403,403,403,,403,803,803,,533,533,,,,403', +'403,403,403,533,533,533,533,455,,,403,403,,403,403,403,403,403,,,,455', +',,,,455,,,950,455,950,950,950,950,950,,,,,403,403,403,403,403,403,403', +'403,403,403,403,403,403,403,,,403,403,403,,,403,,,403,,950,403,403,', +'403,,403,,403,,403,403,403,403,403,403,403,,403,403,403,633,,633,633', +'633,633,633,,,,,,,403,403,403,403,458,403,,403,,403,,458,458,458,,,458', +'458,458,,458,,,506,633,506,506,506,506,506,458,,,633,633,633,633,,,', +'458,458,,458,458,458,458,458,428,,,,946,,946,946,946,946,946,,506,506', +',,428,428,,,,506,506,506,506,,,,,,,,428,458,428,394,428,428,428,428', +'458,946,394,394,394,458,458,394,394,394,,394,946,946,,,,,,,394,394,394', +',,,,,458,,,394,394,,394,394,394,394,394,,,,458,,,,,458,,,931,458,931', +'931,931,931,931,,,,,394,394,394,394,394,394,394,394,394,394,394,394', +'394,394,,,394,394,394,,,394,,394,394,,931,394,394,,394,,394,,394,,394', +'394,394,394,394,394,394,,394,394,394,,,,895,,895,895,895,895,895,,,27', +'394,394,,394,,394,27,27,27,394,,27,27,27,798,27,798,798,798,798,798', +',,,27,27,27,895,,,,,,,,27,27,,27,27,27,27,27,843,,843,843,843,843,843', +'933,798,933,933,933,933,933,,,,798,798,798,798,,27,27,27,27,27,27,27', +'27,27,27,27,27,27,27,,843,27,27,27,,,27,933,27,27,,,27,27,,27,,27,,27', +',27,27,27,27,27,27,27,,27,27,27,,800,,800,800,800,800,800,,,,,,27,27', +',27,,27,,,,27,903,903,903,903,903,903,,,,903,903,,,,903,800,903,903', +'903,903,903,903,903,,800,800,800,800,903,903,903,903,903,903,903,,,903', +',,,,,903,903,903,903,903,903,903,903,903,903,903,903,,903,903,903,,903', +'903,903,903,903,,,,,,,,956,,956,956,956,956,956,,,,,,903,,,903,,,903', +'903,,,903,,903,,,,903,886,,886,886,886,886,886,903,956,,,,903,903,903', +'903,,903,903,956,956,,903,903,897,897,897,897,897,897,903,,903,897,897', +',,886,897,,897,897,897,897,897,897,897,,886,886,,,897,897,897,897,897', +'897,897,,,897,,,,,,897,897,897,897,897,897,897,897,897,897,897,897,', +'897,897,897,,897,897,897,897,897,,,,,,,,888,,888,888,888,888,888,,,', +',,897,,,897,,,897,897,,,897,,897,,,,897,890,,890,890,890,890,890,897', +'888,,,,897,897,897,897,,897,897,888,888,,897,897,828,828,828,828,828', +'828,897,,897,828,828,,,890,828,,828,828,828,828,828,828,828,,890,890', +',,828,828,828,828,828,828,828,,,828,,,,,,828,828,828,828,828,828,828', +'828,828,828,828,828,,828,828,828,,828,828,828,828,828,,,,,,,,909,,909', +'909,909,909,909,,,,,,828,,,828,,,828,828,,,828,,828,,,,828,911,,911', +'911,911,911,911,828,909,,,,828,828,828,828,,828,828,909,909,,828,828', +'786,786,786,786,786,786,828,,828,786,786,,,911,786,,786,786,786,786', +'786,786,786,,911,911,,,786,786,786,786,786,786,786,,,786,,,,,,786,786', +'786,786,786,786,786,786,786,786,786,786,,786,786,786,,786,786,786,786', +'786,437,437,437,437,437,437,437,,,437,437,,,,,,437,437,,786,,,786,,', +'786,786,,,786,,786,437,,437,786,437,437,437,437,437,437,437,786,437', +',,,786,786,786,786,,786,786,,,,786,786,195,195,195,195,195,195,786,', +'786,195,195,,,,195,,195,195,195,195,195,195,195,,,,,,195,195,195,195', +'195,195,195,,,195,,,,,,195,195,195,195,195,195,195,195,195,195,195,195', +',195,195,195,,195,195,195,195,195,431,431,431,431,431,431,431,,,431', +'431,,,,,,431,431,,195,,,195,,,195,195,,,195,,195,431,,431,195,431,431', +'431,431,431,431,431,195,431,,,,195,195,195,195,,195,195,,,,195,195,196', +'196,196,196,196,196,195,,195,196,196,,,,196,,196,196,196,196,196,196', +'196,,,,,,196,196,196,196,196,196,196,,,196,,,,,,196,196,196,196,196', +'196,196,196,196,196,196,196,,196,196,196,,196,196,196,196,196,439,439', +'439,439,439,439,439,,,439,439,,,,,,439,439,,196,,,196,,,196,196,,,196', +',196,439,,439,196,439,439,439,439,439,439,439,196,439,,,,196,196,196', +'196,,196,196,,,,196,196,827,827,827,827,827,827,196,,196,827,827,,,', +'827,,827,827,827,827,827,827,827,,,,,,827,827,827,827,827,827,827,,', +'827,,,,,,827,827,827,827,827,827,827,827,827,827,827,827,,827,827,827', +',827,827,827,827,827,435,,,,,,,,,,,,,,,,435,435,,827,,,827,,,827,827', +',,827,,827,435,,435,827,435,435,435,435,,,435,827,435,,,,827,827,827', +'827,,827,827,,,,827,827,625,625,625,625,625,625,827,,827,625,625,,,', +'625,,625,625,625,625,625,625,625,,,,,,625,625,625,625,625,625,625,,', +'625,,,,,,625,625,625,625,625,625,625,625,625,625,625,625,,625,625,625', +',625,625,625,625,625,434,,,,,,,,,,,,,,,,434,434,,625,,,625,,,625,625', +',,625,,625,434,,434,625,434,434,434,434,,,434,625,434,,,,625,625,625', +'625,,625,625,,,,625,625,676,676,676,676,676,676,625,,625,676,676,,,', +'676,,676,676,676,676,676,676,676,,,,,,676,676,676,676,676,676,676,,', +'676,,,,,,676,676,676,676,676,676,676,676,676,676,676,676,,676,676,676', +',676,676,676,676,676,444,444,444,444,444,444,444,444,,444,444,,,,,,444', +'444,,676,,,676,,,676,676,,,676,,676,444,,444,676,444,444,444,444,444', +'444,444,676,444,,,,676,676,676,676,,676,676,,,,676,676,285,285,285,285', +'285,285,676,,676,285,285,,,,285,,285,285,285,285,285,285,285,,,,,,285', +'285,285,285,285,285,285,,,285,,,,,,285,285,285,285,285,285,285,285,285', +'285,285,285,,285,285,285,,285,285,285,285,285,443,443,443,443,443,443', +'443,,,443,443,,,,,,443,443,,285,,,285,,,285,285,,,285,,285,443,,443', +'285,443,443,443,443,443,443,443,285,443,,,,285,285,285,285,,285,285', +',,,285,285,730,730,730,730,730,730,285,,285,730,730,,,,730,,730,730', +'730,730,730,730,730,,,,,,730,730,730,730,730,730,730,,,730,,,,,,730', +'730,730,730,730,730,730,730,730,730,730,730,,730,730,730,,730,730,730', +'730,730,421,421,421,421,421,421,421,421,421,421,421,,421,421,,,421,421', +',730,,,730,,,730,730,,,730,,730,421,,421,730,421,421,421,421,421,421', +'421,730,421,,,,730,730,730,730,,730,730,,,,730,730,51,51,51,51,51,51', +'730,,730,51,51,,,,51,,51,51,51,51,51,51,51,,,,,,51,51,51,51,51,51,51', +',,51,,,,,,51,51,51,51,51,51,51,51,51,51,51,51,,51,51,51,,51,51,51,51', +'51,420,420,420,420,420,420,420,420,420,420,420,,420,420,,,420,420,,51', +',,51,,,51,51,,,51,,51,420,,420,51,420,420,420,420,420,420,420,51,420', +',,,51,51,51,51,,51,51,,,,51,51,532,532,532,532,532,532,51,,51,532,532', +',,,532,,532,532,532,532,532,532,532,,,,,,532,532,532,532,532,532,532', +',,532,,,,,,532,532,532,532,532,532,532,532,532,532,532,532,,532,532', +'532,,532,532,532,532,532,433,,,,,,,,,,,,,,,,433,433,,532,,,532,,,532', +'532,,,532,,532,433,,433,532,433,433,433,433,,,433,532,433,,,,532,532', +'532,532,,532,532,,,,532,532,0,0,0,0,0,0,532,,532,0,0,,,,0,,0,0,0,0,0', +'0,0,,,,,,0,0,0,0,0,0,0,,,0,,,,,,0,0,0,0,0,0,0,0,0,0,0,0,,0,0,0,,0,0', +'0,0,0,438,438,438,438,438,438,438,,,438,438,,,,,,438,438,,0,,,0,,,0', +'0,,,0,,0,438,,438,0,438,438,438,438,438,438,438,0,438,,,,0,0,0,0,,0', +'0,,,,0,0,280,280,280,280,280,280,0,,0,280,280,,,,280,,280,280,280,280', +'280,280,280,,,,,,280,280,280,280,280,280,280,,,280,,,,,,280,280,280', +'280,280,280,280,280,280,280,280,280,,280,280,280,,280,280,280,280,280', +'432,,,,,,,,,,,,,,,,432,432,,280,,,280,,,280,280,,,280,,280,432,,432', +'280,432,432,432,432,,,432,280,432,,,,280,280,280,280,,280,280,,,,280', +'280,681,681,681,681,681,681,280,,280,681,681,,,,681,,681,681,681,681', +'681,681,681,,,,,,681,681,681,681,681,681,681,,,681,,,,,,681,681,681', +'681,681,681,681,681,681,681,681,681,,681,681,681,,681,681,681,681,681', +'436,436,436,436,436,436,436,,,436,436,,,,,,436,436,,681,,,681,,,681', +'681,,,681,,681,436,,436,681,436,436,436,436,436,436,436,681,436,,,,681', +'681,681,681,,681,681,,,,681,681,742,742,742,742,742,742,681,,681,742', +'742,,,,742,,742,742,742,742,742,742,742,,,,,,742,742,742,742,742,742', +'742,,,742,,,,,,742,742,742,742,742,742,742,742,742,742,742,742,,742', +'742,742,,742,742,742,742,742,440,440,440,440,440,440,440,,,440,440,', +',,,,440,440,,742,,,742,,,742,742,,,742,,742,440,,440,742,440,440,440', +'440,440,440,440,742,440,,,,742,742,742,742,,742,742,,,,742,742,691,691', +'691,691,691,691,742,,742,691,691,,,,691,,691,691,691,691,691,691,691', +',,,,,691,691,691,691,691,691,691,,,691,,,,,,691,691,691,691,691,691', +'691,691,691,691,691,691,,691,691,691,,691,691,691,691,691,430,,,,,,', +',,,,,,,,,430,430,,691,,,691,,,691,691,,,691,,691,430,,,691,430,430,430', +'430,,,,691,,,,,691,691,691,691,,691,691,,,,691,691,780,780,780,780,780', +'780,691,,691,780,780,,,,780,,780,780,780,780,780,780,780,,,,,,780,780', +'780,780,780,780,780,,,780,,,,,,780,780,780,780,780,780,780,780,780,780', +'780,780,,780,780,780,,780,780,780,780,780,429,,,,,,,,,,,,,,,,429,429', +',780,,,780,,,780,780,,,780,,780,429,,429,780,429,429,429,429,,,,780', +',,,,780,780,780,780,,780,780,,,,780,780,584,584,584,584,584,584,780', +',780,584,584,,,,584,,584,584,584,584,584,584,584,,,,,,584,584,584,584', +'584,584,584,,,584,,,,,,584,584,584,584,584,584,584,584,584,584,584,584', +',584,584,584,,584,584,584,584,584,,,,,,,,,,,,,,,,,,,,584,,,584,,,584', +'584,,,584,,584,,,,584,,,,,,,,584,,,,,584,584,584,584,,584,584,,,,584', +'584,777,777,777,777,777,777,584,,584,777,777,,,,777,,777,777,777,777', +'777,777,777,,,,,,777,777,777,777,777,777,777,,,777,,,,,,777,777,777', +'777,777,777,777,777,777,777,777,777,,777,777,777,,777,777,777,777,777', +',,,,,,,,,,,,,,,,,,,777,,,777,,,777,777,,,777,,777,,,,777,,,,,,,,777', +',,,,777,777,777,777,,777,777,,,,777,777,776,776,776,776,776,776,777', +',777,776,776,,,,776,,776,776,776,776,776,776,776,,,,,,776,776,776,776', +'776,776,776,,,776,,,,,,776,776,776,776,776,776,776,776,776,776,776,776', +',776,776,776,,776,776,776,776,776,,,,,,,,,,,,,,,,,,,,776,,,776,,,776', +'776,,,776,,776,,,,776,,,,,,,,776,,,,,776,776,776,776,,776,776,,,,776', +'776,507,507,507,507,507,507,776,,776,507,507,,,,507,,507,507,507,507', +'507,507,507,,,,,,507,507,507,507,507,507,507,,,507,,,,,,507,507,507', +'507,507,507,507,507,507,507,507,507,,507,507,507,,507,507,507,507,507', +',,,,,,,,,,,,,,,,,,,507,,,507,,,507,507,,,507,,507,,,,507,,,,,,,,507', +',,,,507,507,507,507,,507,507,,,,507,507,220,220,220,220,220,220,507', +',507,220,220,,,,220,,220,220,220,220,220,220,220,,,,,,220,220,220,220', +'220,220,220,,,220,,,,,,220,220,220,220,220,220,220,220,220,220,220,220', +',220,220,220,,220,220,220,220,220,,,,,,,,,,,,,,,,,,,,220,,,220,,,220', +'220,,,220,,220,,,,220,,,,,,,,220,,,,,220,220,220,220,,220,220,,,,220', +'220,510,510,510,510,510,510,220,,220,510,510,,,,510,,510,510,510,510', +'510,510,510,,,,,,510,510,510,510,510,510,510,,,510,,,,,,510,510,510', +'510,510,510,510,510,510,510,510,510,,510,510,510,,510,510,510,510,510', +',,,,,,,,,,,,,,,,,,,510,,,510,,,510,510,,,510,,510,,,,510,,,,,,,,510', +',,,,510,510,510,510,,510,510,,,,510,510,603,603,603,603,603,603,510', +',510,603,603,,,,603,,603,603,603,603,603,603,603,,,,,,603,603,603,603', +'603,603,603,,,603,,,,,,603,603,603,603,603,603,603,603,603,603,603,603', +',603,603,603,,603,603,603,603,603,,,,,,,,,,,,,,,,,,,,603,,,603,,,603', +'603,,,603,,603,,,,603,,,,,,,,603,,,,,603,603,603,603,,603,603,,,,603', +'603,604,604,604,604,604,604,603,,603,604,604,,,,604,,604,604,604,604', +'604,604,604,,,,,,604,604,604,604,604,604,604,,,604,,,,,,604,604,604', +'604,604,604,604,604,604,604,604,604,,604,604,604,,604,604,604,604,604', +',,,,,,,,,,,,,,,,,,,604,,,604,,,604,604,,,604,,604,,,,604,,,,,,,,604', +',,,,604,604,604,604,,604,604,,,,604,604,821,821,821,821,821,821,604', +',604,821,821,,,,821,,821,821,821,821,821,821,821,,,,,,821,821,821,821', +'821,821,821,,,821,,,,,,821,821,821,821,821,821,821,821,821,821,821,821', +',821,821,821,,821,821,821,821,821,,,,,,,,,,,,,,,,,,,,821,,,821,,,821', +'821,,,821,,821,,,,821,,,,,,,,821,,,,,821,821,821,821,,821,821,,,,821', +'821,30,30,30,30,30,30,821,,821,30,30,,,,30,,30,30,30,30,30,30,30,,,', +',,30,30,30,30,30,30,30,,,30,,,,,,30,30,30,30,30,30,30,30,30,30,30,30', +',30,30,30,,30,30,30,30,30,,,,,,,,,,,,,,,,,,,,30,,,30,,,30,30,,,30,,30', +',,,30,,,,,,,,30,,,,,30,30,30,30,,30,30,,,,30,30,905,905,905,905,905', +'905,30,,30,905,905,,,,905,,905,905,905,905,905,905,905,,,,,,905,905', +'905,905,905,905,905,,,905,,,,,,905,905,905,905,905,905,905,905,905,905', +'905,905,,905,905,905,,905,905,905,905,905,,,,,,,,,,,,,,,,,,,,905,,,905', +',,905,905,,,905,,905,,,,905,,,,,,,,905,,,,,905,905,905,905,,905,905', +',,,905,905,,219,219,219,,219,905,,905,219,219,,,,219,,219,219,219,219', +'219,219,219,,,,,,219,219,219,219,219,219,219,,,219,,,,,,,219,,,219,219', +'219,219,219,219,219,219,,219,219,219,,219,219,219,219,219,,,,,,,,,,', +',,,,,,,,,219,,,219,,,219,219,,,219,,,,,,219,,,,,,,,219,,,,,219,219,219', +'219,,219,219,,,,219,219,,774,774,774,,774,219,,219,774,774,,,,774,,774', +'774,774,774,774,774,774,,,,,,774,774,774,774,774,774,774,,,774,,,,,', +',774,,,774,774,774,774,774,774,774,774,,774,774,774,,774,774,774,774', +'774,,,,,,,,,,,,,,,,,,,,774,,,774,,,774,774,,,774,,,,,,774,,,,,,,,774', +',,,,774,774,774,774,,774,774,,,,774,774,,222,222,222,,222,774,,774,222', +'222,,,,222,,222,222,222,222,222,222,222,,,,,,222,222,222,222,222,222', +'222,,,222,,,,,,,222,,,222,222,222,222,222,222,222,222,,222,222,222,', +'222,222,222,222,222,,,,,,,,,,,,,,,,,,,,222,,,222,,,222,222,,,222,,,', +',,222,,,,,,,,222,,,,,222,222,222,222,,222,222,,,,222,222,,223,223,223', +',223,222,,222,223,223,,,,223,,223,223,223,223,223,223,223,,,,,,223,223', +'223,223,223,223,223,,,223,,,,,,,223,,,223,223,223,223,223,223,223,223', +',223,223,223,,223,223,223,223,223,,,,,,,,,,,,,,,,,,,,223,,,223,,,223', +'223,,,223,,,,,,223,,,,,,,,223,,,,,223,223,223,223,,223,223,,,,223,223', +',224,224,224,,224,223,,223,224,224,,,,224,,224,224,224,224,224,224,224', +',,,,,224,224,224,224,224,224,224,,,224,,,,,,,224,,,224,224,224,224,224', +'224,224,224,,224,224,224,,224,224,224,224,224,,,,,,,,,,,,,,,,,,,,224', +',,224,,,224,224,,,224,,,,,,224,,,,,,,,224,,,,,224,224,224,224,,224,224', +',,,224,224,,225,225,225,,225,224,,224,225,225,,,,225,,225,225,225,225', +'225,225,225,,,,,,225,225,225,225,225,225,225,,,225,,,,,,,225,,,225,225', +'225,225,225,225,225,225,,225,225,225,,225,225,225,225,225,,,,,,,,,,', +',,,,,,,,,225,,,225,,,225,225,,,225,,,,,,225,,,,,,,,225,,,,,225,225,225', +'225,,225,225,,,,225,225,,226,226,226,,226,225,,225,226,226,,,,226,,226', +'226,226,226,226,226,226,,,,,,226,226,226,226,226,226,226,,,226,,,,,', +',226,,,226,226,226,226,226,226,226,226,,226,226,226,,226,226,226,226', +'226,,,,,,,,,,,,,,,,,,,,226,,,226,,,226,226,,,226,,,,,,226,,,,,,,,226', +',,,,226,226,226,226,,226,226,,,,226,226,,227,227,227,,227,226,,226,227', +'227,,,,227,,227,227,227,227,227,227,227,,,,,,227,227,227,227,227,227', +'227,,,227,,,,,,,227,,,227,227,227,227,227,227,227,227,,227,227,227,', +'227,227,227,227,227,,,,,,,,,,,,,,,,,,,,227,,,227,,,227,227,,,227,,,', +',,227,,,,,,,,227,,,,,227,227,227,227,,227,227,,,,227,227,,228,228,228', +',228,227,,227,228,228,,,,228,,228,228,228,228,228,228,228,,,,,,228,228', +'228,228,228,228,228,,,228,,,,,,,228,,,228,228,228,228,228,228,228,228', +',228,228,228,,228,228,228,228,228,,,,,,,,,,,,,,,,,,,,228,,,228,,,228', +'228,,,228,,,,,,228,,,,,,,,228,,,,,228,228,228,228,,228,228,,,,228,228', +',229,229,229,,229,228,,228,229,229,,,,229,,229,229,229,229,229,229,229', +',,,,,229,229,229,229,229,229,229,,,229,,,,,,,229,,,229,229,229,229,229', +'229,229,229,,229,229,229,,229,229,229,229,229,,,,,,,,,,,,,,,,,,,,229', +',,229,,,229,229,,,229,,,,,,229,,,,,,,,229,,,,,229,229,229,229,,229,229', +',,,229,229,,230,230,230,,230,229,,229,230,230,,,,230,,230,230,230,230', +'230,230,230,,,,,,230,230,230,230,230,230,230,,,230,,,,,,,230,,,230,230', +'230,230,230,230,230,230,,230,230,230,,230,230,230,230,230,,,,,,,,,,', +',,,,,,,,,230,,,230,,,230,230,,,230,,,,,,230,,,,,,,,230,,,,,230,230,230', +'230,,230,230,,,,230,230,,231,231,231,,231,230,,230,231,231,,,,231,,231', +'231,231,231,231,231,231,,,,,,231,231,231,231,231,231,231,,,231,,,,,', +',231,,,231,231,231,231,231,231,231,231,,231,231,231,,231,231,231,231', +'231,,,,,,,,,,,,,,,,,,,,231,,,231,,,231,231,,,231,,,,,,231,,,,,,,,231', +',,,,231,231,231,231,,231,231,,,,231,231,,232,232,232,,232,231,,231,232', +'232,,,,232,,232,232,232,232,232,232,232,,,,,,232,232,232,232,232,232', +'232,,,232,,,,,,,232,,,232,232,232,232,232,232,232,232,,232,232,232,', +'232,232,232,232,232,,,,,,,,,,,,,,,,,,,,232,,,232,,,232,232,,,232,,,', +',,232,,,,,,,,232,,,,,232,232,232,232,,232,232,,,,232,232,,233,233,233', +',233,232,,232,233,233,,,,233,,233,233,233,233,233,233,233,,,,,,233,233', +'233,233,233,233,233,,,233,,,,,,,233,,,233,233,233,233,233,233,233,233', +',233,233,233,,233,233,233,233,233,,,,,,,,,,,,,,,,,,,,233,,,233,,,233', +'233,,,233,,,,,,233,,,,,,,,233,,,,,233,233,233,233,,233,233,,,,233,233', +',234,234,234,,234,233,,233,234,234,,,,234,,234,234,234,234,234,234,234', +',,,,,234,234,234,234,234,234,234,,,234,,,,,,,234,,,234,234,234,234,234', +'234,234,234,,234,234,234,,234,234,234,234,234,,,,,,,,,,,,,,,,,,,,234', +',,234,,,234,234,,,234,,,,,,234,,,,,,,,234,,,,,234,234,234,234,,234,234', +',,,234,234,,235,235,235,,235,234,,234,235,235,,,,235,,235,235,235,235', +'235,235,235,,,,,,235,235,235,235,235,235,235,,,235,,,,,,,235,,,235,235', +'235,235,235,235,235,235,,235,235,235,,235,235,235,235,235,,,,,,,,,,', +',,,,,,,,,235,,,235,,,235,235,,,235,,,,,,235,,,,,,,,235,,,,,235,235,235', +'235,,235,235,,,,235,235,,236,236,236,,236,235,,235,236,236,,,,236,,236', +'236,236,236,236,236,236,,,,,,236,236,236,236,236,236,236,,,236,,,,,', +',236,,,236,236,236,236,236,236,236,236,,236,236,236,,236,236,236,236', +'236,,,,,,,,,,,,,,,,,,,,236,,,236,,,236,236,,,236,,,,,,236,,,,,,,,236', +',,,,236,236,236,236,,236,236,,,,236,236,,237,237,237,,237,236,,236,237', +'237,,,,237,,237,237,237,237,237,237,237,,,,,,237,237,237,237,237,237', +'237,,,237,,,,,,,237,,,237,237,237,237,237,237,237,237,,237,237,237,', +'237,237,237,237,237,,,,,,,,,,,,,,,,,,,,237,,,237,,,237,237,,,237,,,', +',,237,,,,,,,,237,,,,,237,237,237,237,,237,237,,,,237,237,,238,238,238', +',238,237,,237,238,238,,,,238,,238,238,238,238,238,238,238,,,,,,238,238', +'238,238,238,238,238,,,238,,,,,,,238,,,238,238,238,238,238,238,238,238', +',238,238,238,,238,238,238,238,238,,,,,,,,,,,,,,,,,,,,238,,,238,,,238', +'238,,,238,,,,,,238,,,,,,,,238,,,,,238,238,238,238,,238,238,,,,238,238', +',239,239,239,,239,238,,238,239,239,,,,239,,239,239,239,239,239,239,239', +',,,,,239,239,239,239,239,239,239,,,239,,,,,,,239,,,239,239,239,239,239', +'239,239,239,,239,239,239,,239,239,239,239,239,,,,,,,,,,,,,,,,,,,,239', +',,239,,,239,239,,,239,,,,,,239,,,,,,,,239,,,,,239,239,239,239,,239,239', +',,,239,239,,240,240,240,,240,239,,239,240,240,,,,240,,240,240,240,240', +'240,240,240,,,,,,240,240,240,240,240,240,240,,,240,,,,,,,240,,,240,240', +'240,240,240,240,240,240,,240,240,240,,240,240,240,240,240,,,,,,,,,,', +',,,,,,,,,240,,,240,,,240,240,,,240,,,,,,240,,,,,,,,240,,,,,240,240,240', +'240,,240,240,,,,240,240,,241,241,241,,241,240,,240,241,241,,,,241,,241', +'241,241,241,241,241,241,,,,,,241,241,241,241,241,241,241,,,241,,,,,', +',241,,,241,241,241,241,241,241,241,241,,241,241,241,,241,241,241,241', +'241,,,,,,,,,,,,,,,,,,,,241,,,241,,,241,241,,,241,,,,,,241,,,,,,,,241', +',,,,241,241,241,241,,241,241,,,,241,241,,242,242,242,,242,241,,241,242', +'242,,,,242,,242,242,242,242,242,242,242,,,,,,242,242,242,242,242,242', +'242,,,242,,,,,,,242,,,242,242,242,242,242,242,242,242,,242,242,242,', +'242,242,242,242,242,,,,,,,,,,,,,,,,,,,,242,,,242,,,242,242,,,242,,,', +',,242,,,,,,,,242,,,,,242,242,242,242,,242,242,,,,242,242,,243,243,243', +',243,242,,242,243,243,,,,243,,243,243,243,243,243,243,243,,,,,,243,243', +'243,243,243,243,243,,,243,,,,,,,243,,,243,243,243,243,243,243,243,243', +',243,243,243,,243,243,243,243,243,,,,,,,,,,,,,,,,,,,,243,,,243,,,243', +'243,,,243,,,,,,243,,,,,,,,243,,,,,243,243,243,243,,243,243,,,,243,243', +',244,244,244,,244,243,,243,244,244,,,,244,,244,244,244,244,244,244,244', +',,,,,244,244,244,244,244,244,244,,,244,,,,,,,244,,,244,244,244,244,244', +'244,244,244,,244,244,244,,244,244,244,244,244,,,,,,,,,,,,,,,,,,,,244', +',,244,,,244,244,,,244,,,,,,244,,,,,,,,244,,,,,244,244,244,244,,244,244', +',,,244,244,,245,245,245,,245,244,,244,245,245,,,,245,,245,245,245,245', +'245,245,245,,,,,,245,245,245,245,245,245,245,,,245,,,,,,,245,,,245,245', +'245,245,245,245,245,245,,245,245,245,,245,245,245,245,245,,,,,,,,,,', +',,,,,,,,,245,,,245,,,245,245,,,245,,,,,,245,,,,,,,,245,,,,,245,245,245', +'245,,245,245,,,,245,245,,246,246,246,,246,245,,245,246,246,,,,246,,246', +'246,246,246,246,246,246,,,,,,246,246,246,246,246,246,246,,,246,,,,,', +',246,,,246,246,246,246,246,246,246,246,,246,246,246,,246,246,246,246', +'246,,,,,,,,,,,,,,,,,,,,246,,,246,,,246,246,,,246,,,,,,246,,,,,,,,246', +',,,,246,246,246,246,,246,246,,,,246,246,,247,247,247,,247,246,,246,247', +'247,,,,247,,247,247,247,247,247,247,247,,,,,,247,247,247,247,247,247', +'247,,,247,,,,,,,247,,,247,247,247,247,247,247,247,247,,247,247,247,', +'247,247,247,247,247,,,,,,,,,,,,,,,,,,,,247,,,247,,,247,247,,,247,,,', +',,247,,,,,,,,247,,,,,247,247,247,247,,247,247,,,,247,247,,761,761,761', +',761,247,,247,761,761,,,,761,,761,761,761,761,761,761,761,,,,,,761,761', +'761,761,761,761,761,,,761,,,,,,,761,,,761,761,761,761,761,761,761,761', +',761,761,761,,761,761,761,761,761,,,,,,,,,,,,,,,,,,,,761,,,761,,,761', +'761,,,761,,,,,,761,,,,,,,,761,,,,,761,761,761,761,,761,761,,,,761,761', +',256,256,256,,256,761,,761,256,256,,,,256,,256,256,256,256,256,256,256', +',,,,,256,256,256,256,256,256,256,,,256,,,,,,,256,,,256,256,256,256,256', +'256,256,256,,256,256,256,,256,256,256,256,256,,,,,,,,,,,,,,,,,,,,256', +',,256,,,256,256,,,256,,,,,,256,,,,,,,,256,,,,,256,256,256,256,,256,256', +',,,256,256,,746,746,746,,746,256,,256,746,746,,,,746,,746,746,746,746', +'746,746,746,,,,,,746,746,746,746,746,746,746,,,746,,,,,,,746,,,746,746', +'746,746,746,746,746,746,,746,746,746,,746,746,,682,746,682,682,682,682', +'682,,,,,,,,,,,,,,,746,,,746,,,746,746,,,746,,,,,,682,,,,,,,,,682,682', +'682,682,746,746,746,746,,746,746,,,,746,746,,258,258,258,,258,746,,746', +'258,258,,,,258,,258,258,258,258,258,258,258,,,,,,258,258,258,258,258', +'258,258,,,258,,,,,,,258,,,258,258,258,258,258,258,258,258,,258,258,258', +',258,258,258,258,258,,,,,,,,,,,,,,,,,,,,258,,,258,,,258,258,,,258,,', +',,,258,,,,,,,,258,,,,,258,258,258,258,,258,258,,,,258,258,,263,263,263', +',263,258,,258,263,263,,,,263,,263,263,263,263,263,263,263,,,,,,263,263', +'263,263,263,263,263,,,263,,,,,,,263,,,263,263,263,263,263,263,263,263', +',263,263,263,,263,263,263,263,263,,,,,,,,,,,,,,,,,,,,263,,,263,,,263', +'263,,,263,,,,,,263,,,,,,,,263,,,,,263,263,263,263,,263,263,,,,263,263', +',559,559,559,,559,263,,263,559,559,,,,559,,559,559,559,559,559,559,559', +',,,,,559,559,559,559,559,559,559,,,559,,,,,,,559,,,559,559,559,559,559', +'559,559,559,,559,559,559,,559,559,559,559,559,,,,,,,,,,,,,,,,,,,,559', +',,559,,,559,559,,,559,,559,,,,559,,,,,,,,559,,,,,559,559,559,559,,559', +'559,,,,559,559,,5,5,5,5,5,559,,559,5,5,,,,5,,5,5,5,5,5,5,5,,,,,,5,5', +'5,5,5,5,5,,,5,,,,,,5,5,5,5,5,5,5,5,5,5,5,5,,5,5,5,,5,5,5,5,5,,,,,,,', +',,,,,,,,,,,,5,,,5,,,5,5,,,5,,5,,,,5,,,,,,,,5,,,,,5,5,5,5,,5,5,,,,5,5', +',452,452,452,,452,5,,5,452,452,,,,452,,452,452,452,452,452,452,452,', +',,,,452,452,452,452,452,452,452,,,452,,,,,,,452,,,452,452,452,452,452', +'452,452,452,,452,452,452,,452,452,452,452,452,,,,,,,,,,,,,,,,,,,,452', +',,452,,,452,452,,,452,,,,,,452,,,,,,,,452,,,,,452,452,452,452,,452,452', +',,,452,452,,448,448,448,,448,452,,452,448,448,,,,448,,448,448,448,448', +'448,448,448,,,,,,448,448,448,448,448,448,448,,,448,,,,,,,448,,,448,448', +'448,448,448,448,448,448,448,448,448,448,,448,448,448,448,448,,,,,,,', +',,,,,,,,,,,,448,,,448,,,448,448,,,448,,448,,448,,448,,,,,,,,448,,,,', +'448,448,448,448,,448,448,,,,448,448,,450,450,450,,450,448,,448,450,450', +',,,450,,450,450,450,450,450,450,450,,,,,,450,450,450,450,450,450,450', +',,450,,,,,,,450,,,450,450,450,450,450,450,450,450,450,450,450,450,,450', +'450,450,450,450,,,,,,,,,,,,,,,,,,,,450,,,450,,,450,450,,,450,,,,450', +',450,,,,,,,,450,,,,,450,450,450,450,,450,450,,,,450,450,,18,18,18,,18', +'450,,450,18,18,,,,18,,18,18,18,18,18,18,18,,,,,,18,18,18,18,18,18,18', +',,18,,,,,,,18,,,18,18,18,18,18,18,18,18,,18,18,18,,18,18,18,18,18,,', +',,,,,,,,,,,,,,,,,18,,,18,,,18,18,,,18,,,,,,18,,,,,,,,18,,,,,18,18,18', +'18,,18,18,,,,18,18,,22,22,22,,22,18,,18,22,22,,,,22,,22,22,22,22,22', +'22,22,,,,,,22,22,22,22,22,22,22,,,22,,,,,,,22,,,22,22,22,22,22,22,22', +'22,22,22,22,22,,22,22,22,22,22,,,,,,,,,,,,,,,,,,,,22,,,22,,,22,22,,', +'22,,22,,22,,22,,,,,,,,22,,,,,22,22,22,22,,22,22,,,,22,22,,23,23,23,', +'23,22,,22,23,23,,,,23,,23,23,23,23,23,23,23,,,,,,23,23,23,23,23,23,23', +',,23,,,,,,,23,,,23,23,23,23,23,23,23,23,23,23,23,23,,23,23,23,23,23', +',,,,,,,,,,,,,,,,,,,23,,,23,,,23,23,,,23,,23,,23,,23,,,,,,,,23,,,,,23', +'23,23,23,,23,23,,,,23,23,,24,24,24,,24,23,,23,24,24,,,,24,,24,24,24', +'24,24,24,24,,,,,,24,24,24,24,24,24,24,,,24,,,,,,,24,,,24,24,24,24,24', +'24,24,24,24,24,24,24,,24,24,24,24,24,,,,,,,,,,,,,,,,,,,,24,,,24,,,24', +'24,,,24,,24,,24,,24,,,,,,,,24,,,,,24,24,24,24,,24,24,,,,24,24,,876,876', +'876,,876,24,,24,876,876,,,,876,,876,876,876,876,876,876,876,,,,,,876', +'876,876,876,876,876,876,,,876,,,,,,,876,,,876,876,876,876,876,876,876', +'876,876,876,876,876,,876,876,876,876,876,,,,,,,,,,,,,,,,,,,,876,,,876', +',,876,876,,,876,,876,,876,,876,,,,,,,,876,,,,,876,876,876,876,,876,876', +',,,876,876,,31,31,31,,31,876,,876,31,31,,,,31,,31,31,31,31,31,31,31', +',,,,,31,31,31,31,31,31,31,,,31,,,,,,,31,,,31,31,31,31,31,31,31,31,,31', +'31,31,,31,31,,857,31,857,857,857,857,857,,,,,,,,,,,,,,,31,,,31,,,31', +'31,,,31,,31,,,,857,857,,,,,,,,857,857,857,857,31,31,31,31,,31,31,,,', +'31,31,,32,32,32,,32,31,,31,32,32,,,,32,,32,32,32,32,32,32,32,,,,,,32', +'32,32,32,32,32,32,,,32,,,,,,381,32,,,32,32,32,32,32,32,32,32,,32,32', +'32,,32,32,,,32,,381,381,381,381,381,381,381,381,381,381,381,,381,381', +',,381,381,32,,,32,,,32,32,,,32,,,,381,,381,,381,381,381,381,381,381', +'381,,381,,,32,32,32,32,,32,32,,,,32,32,,,381,32,381,,32,,32,873,873', +'873,,873,,,,873,873,,,,873,,873,873,873,873,873,873,873,,,,,,873,873', +'873,873,873,873,873,,,873,,,,,,,873,,,873,873,873,873,873,873,873,873', +'873,873,873,873,,873,873,873,873,873,,,,,,,,,,,,,,,,,,,,873,,,873,,', +'873,873,,,873,,873,,873,,873,,,,,,,,873,,,,,873,873,873,873,,873,873', +',,,873,873,,870,870,870,,870,873,,873,870,870,,,,870,,870,870,870,870', +'870,870,870,,,,,,870,870,870,870,870,870,870,,,870,,,,,,,870,,,870,870', +'870,870,870,870,870,870,,870,870,870,,870,870,870,870,870,,,,,,,,,,', +',,,,,,,,,870,,,870,,,870,870,,,870,,870,,870,,870,,,,,,,,870,,,,,870', +'870,870,870,,870,870,,,,870,870,,38,38,38,,38,870,,870,38,38,,,,38,', +'38,38,38,38,38,38,38,,,,,,38,38,38,38,38,38,38,,,38,,,,,,,38,,,38,38', +'38,38,38,38,38,38,,38,38,38,,38,38,38,38,38,,,,,,,,,,,,,,,,,,,,38,,', +'38,,,38,38,,,38,,,,,,38,,,,,,,,38,,,,,38,38,38,38,,38,38,,,,38,38,,39', +'39,39,,39,38,,38,39,39,,,,39,,39,39,39,39,39,39,39,,,,,,39,39,39,39', +'39,39,39,,,39,,,,,,,39,,,39,39,39,39,39,39,39,39,,39,39,39,,39,39,39', +'39,39,,,,,,,,,,,,,,,,,,,,39,,,39,,,39,39,,,39,,,,,,39,,,,,,,,39,,,,', +'39,39,39,39,,39,39,,,,39,39,,40,40,40,,40,39,,39,40,40,,,,40,,40,40', +'40,40,40,40,40,,,,,,40,40,40,40,40,40,40,,,40,,,,,,,40,,,40,40,40,40', +'40,40,40,40,,40,40,40,,40,40,40,40,40,,,,,,,,,,,,,,,,,,,,40,,,40,,,40', +'40,,,40,,,,,,40,,,,,,,,40,,,,,40,40,40,40,,40,40,,,,40,40,,52,52,52', +',52,40,,40,52,52,,,,52,,52,52,52,52,52,52,52,,,,,,52,52,52,52,52,52', +'52,,,52,,,,,,,52,,,52,52,52,52,52,52,52,52,,52,52,52,,52,52,52,52,52', +',,,,,,,,,,,,,,,,,,,52,,,52,,,52,52,,,52,,,,,,52,,,,,,,,52,,,,,52,52', +'52,52,,52,52,,,,52,52,,53,53,53,,53,52,,52,53,53,,,,53,,53,53,53,53', +'53,53,53,,,,,,53,53,53,53,53,53,53,,,53,,,,,,,53,,,53,53,53,53,53,53', +'53,53,53,53,53,53,,53,53,53,53,53,,,,,,,,,,,,,,,,,,,,53,,,53,,,53,53', +',,53,,53,,,,53,,,,,,,,53,,,,,53,53,53,53,,53,53,,,,53,53,,54,54,54,', +'54,53,,53,54,54,,,,54,,54,54,54,54,54,54,54,,,,,,54,54,54,54,54,54,54', +',,54,,,,,,,54,,,54,54,54,54,54,54,54,54,54,54,54,54,,54,54,54,54,54', +',,,,,,,,,,,,,,,,,,,54,,,54,,,54,54,,,54,,,,,,54,,,,,,,,54,,,,,54,54', +'54,54,,54,54,,,,54,54,,57,57,57,,57,54,,54,57,57,,,,57,,57,57,57,57', +'57,57,57,,,,,,57,57,57,57,57,57,57,,,57,,,,,,,57,,,57,57,57,57,57,57', +'57,57,,57,57,57,,57,57,57,57,57,,,,,,,,,,,,,,,,,,,,57,,,57,,,57,57,', +',57,,,,,,57,,,,,,,,57,,,,,57,57,57,57,,57,57,,,,57,57,,58,58,58,,58', +'57,,57,58,58,,,,58,,58,58,58,58,58,58,58,,,,,,58,58,58,58,58,58,58,', +',58,,,,,,,58,,,58,58,58,58,58,58,58,58,,58,58,58,,58,58,58,58,58,,,', +',,,,,,,,,,,,,,,,58,,,58,,,58,58,,,58,,,,,,58,,,,,,,,58,,,,,58,58,58', +'58,,58,58,,,,58,58,,61,61,61,,61,58,,58,61,61,,,,61,,61,61,61,61,61', +'61,61,,,,,,61,61,61,61,61,61,61,,,61,,,,,389,,61,,,61,61,61,61,61,61', +'61,61,,61,61,61,,61,61,61,61,61,389,389,389,389,389,389,389,389,389', +'389,389,,389,389,,,389,389,,61,,,61,,,61,61,,,61,,,389,,389,61,389,389', +'389,389,389,389,389,61,389,,,,61,61,61,61,,61,61,,,,61,61,61,389,,,', +'61,61,,61,62,62,62,,62,,,,62,62,,,,62,,62,62,62,62,62,62,62,,,,,,62', +'62,62,62,62,62,62,,,62,,,,,,,62,,,62,62,62,62,62,62,62,62,,62,62,62', +',62,62,,883,62,883,883,883,883,883,,,,,,,,,,,,,,,62,,,62,,,62,62,,,62', +',62,,,,883,,,,,,,,,883,883,883,883,62,62,62,62,,62,62,,,,62,62,,63,63', +'63,,63,62,,62,63,63,,,,63,,63,63,63,63,63,63,63,,,,,,63,63,63,63,63', +'63,63,,,63,,,,,,,63,,,63,63,63,63,63,63,63,63,,63,63,63,,63,63,,906', +'63,906,906,906,906,906,,,,,,,,,,,,63,,,63,,,63,,,63,63,,,63,,,,,,906', +',,,,,,,,906,906,906,906,63,63,63,63,,63,63,,,,63,63,,64,64,64,,64,63', +',63,64,64,,,,64,,64,64,64,64,64,64,64,,,,,,64,64,64,64,64,64,64,,,64', +',,,,,,64,,,64,64,64,64,64,64,64,64,,64,64,64,,64,64,,756,64,756,756', +'756,756,756,,,,,,,,,,,,,,,64,,,64,,,64,64,,,64,,,,,,756,,,,,,,,,756', +'756,756,756,64,64,64,64,,64,64,,,,64,64,,102,102,102,102,102,64,,64', +'102,102,,,,102,,102,102,102,102,102,102,102,,,,,,102,102,102,102,102', +'102,102,,,102,,,,,579,102,102,102,102,102,102,102,102,102,102,102,102', +',102,102,102,,102,102,102,102,102,579,579,579,579,579,579,579,579,579', +'579,579,,579,579,,,579,579,,102,,,102,,,102,102,,,102,,102,579,,579', +'102,579,579,579,579,579,579,579,102,579,,,,102,102,102,102,,102,102', +',,,102,102,,579,,,,102,102,,102,106,106,106,,106,,,,106,106,,,,106,', +'106,106,106,106,106,106,106,,,,,,106,106,106,106,106,106,106,,,106,', +',,,,,106,,,106,106,106,106,106,106,106,106,,106,106,106,,106,106,106', +'106,106,,,,,,,,,,,,,,,,,,,,106,,,106,,,106,106,,,106,,,,,,106,,,,,,', +',106,,,,,106,106,106,106,,106,106,,,,106,106,,107,107,107,,107,106,', +'106,107,107,,,,107,,107,107,107,107,107,107,107,,,,,,107,107,107,107', +'107,107,107,,,107,,,,,,,107,,,107,107,107,107,107,107,107,107,,107,107', +'107,,107,107,107,107,107,,,,,,,,,,,,,,,,,,,,107,,,107,,,107,107,,,107', +',,,,,107,,,,,,,,107,,,,,107,107,107,107,,107,107,,,,107,107,,108,108', +'108,,108,107,,107,108,108,,,,108,,108,108,108,108,108,108,108,,,,,,108', +'108,108,108,108,108,108,,,108,,,,,,,108,,,108,108,108,108,108,108,108', +'108,,108,108,108,,108,108,108,108,108,,,,,,,,,,,,,,,,,,,,108,,,108,', +',108,108,,,108,,,,,,108,,,,,,,,108,,,,,108,108,108,108,,108,108,,,,108', +'108,,109,109,109,,109,108,,108,109,109,,,,109,,109,109,109,109,109,109', +'109,,,,,,109,109,109,109,109,109,109,,,109,,,,,,,109,,,109,109,109,109', +'109,109,109,109,,109,109,109,,109,109,109,109,109,,,,,,,,,,,,,,,,,,', +',109,,,109,,,109,109,,,109,,,,,,109,,,,,,,,109,,,,,109,109,109,109,', +'109,109,,,,109,109,,110,110,110,110,110,109,,109,110,110,,,,110,,110', +'110,110,110,110,110,110,,,,,,110,110,110,110,110,110,110,,,110,,,,,', +'110,110,110,110,110,110,110,110,110,110,110,110,,110,110,110,,110,110', +'110,110,110,,,,,,,,,,,,,,,,,,,,110,,,110,,,110,110,,,110,,110,,,,110', +',,,,,,,110,,,,,110,110,110,110,,110,110,,,,110,110,,810,810,810,,810', +'110,,110,810,810,,,,810,,810,810,810,810,810,810,810,,,,,,810,810,810', +'810,810,810,810,,,810,,,,,,,810,,,810,810,810,810,810,810,810,810,,810', +'810,810,,810,810,,,810,,,,,,,,,,,,,,,,,,,,810,,,810,,,810,810,,,810', +',,,,,,,,,,,,,,,,,,810,810,810,810,,810,810,,,,810,810,,796,796,796,', +'796,810,,810,796,796,,,,796,,796,796,796,796,796,796,796,,,,,,796,796', +'796,796,796,796,796,,,796,,,,,,,796,,,796,796,796,796,796,796,796,796', +',796,796,796,,796,796,796,796,796,,,,,,,,,,,,,,,,,,,,796,,,796,,,796', +'796,,,796,,,,,,796,,,,,,,,796,,,,,796,796,796,796,,796,796,,,,796,796', +',197,197,197,,197,796,,796,197,197,,,,197,,197,197,197,197,197,197,197', +',,,,,197,197,197,197,197,197,197,,,197,,,,,,,197,,,197,197,197,197,197', +'197,197,197,,197,197,197,,197,197,197,197,197,,,,,,,,,,,,,,,,,,,,197', +',,197,,,197,197,,,197,,197,,,,197,,,,,,,,197,,,,,197,197,197,197,,197', +'197,,,,197,197,,198,198,198,,198,197,,197,198,198,,,,198,,198,198,198', +'198,198,198,198,,,,,,198,198,198,198,198,198,198,,,198,,,,,,,198,,,198', +'198,198,198,198,198,198,198,,198,198,198,,198,198,198,198,198,,,,,,', +',,,,,,,,,,,,,198,,,198,,,198,198,,,198,,198,,,,198,,,,,,,,198,,,,,198', +'198,198,198,,198,198,,,,198,198,,199,199,199,,199,198,,198,199,199,', +',,199,,199,199,199,199,199,199,199,,,,,,199,199,199,199,199,199,199', +',,199,,,,,,,199,,,199,199,199,199,199,199,199,199,,199,199,199,,199', +'199,199,199,199,,,,,,,,,,,,,,,,,,,,199,,,199,,,199,199,,,199,,,,,,199', +',,,,,,,199,,,,,199,199,199,199,,199,199,,,,199,199,,200,200,200,,200', +'199,,199,200,200,,,,200,,200,200,200,200,200,200,200,,,,,,200,200,200', +'200,200,200,200,,,200,,,,,,,200,,,200,200,200,200,200,200,200,200,200', +'200,200,200,,200,200,200,200,200,,,,,,,,,,,,,,,,,,,,200,,,200,,,200', +'200,,,200,,200,,200,,200,,,,,,,,200,,,,,200,200,200,200,,200,200,,,', +'200,200,,205,205,205,,205,200,,200,205,205,,,,205,,205,205,205,205,205', +'205,205,,,,,,205,205,205,205,205,205,205,,,205,,,,,,,205,,,205,205,205', +'205,205,205,205,205,,205,205,205,,205,205,205,205,205,,,,,,,,,,,,,,', +',,,,,205,,,205,,,205,205,,,205,,,,,,205,,,,,,,,205,,,,,205,205,205,205', +',205,205,,,,205,205,,206,206,206,,206,205,,205,206,206,,,,206,,206,206', +'206,206,206,206,206,,,,,,206,206,206,206,206,206,206,,,206,,,,,,,206', +',,206,206,206,206,206,206,206,206,,206,206,206,,206,206,206,206,206', +',,,,,,,,,,,,,,,,,,,206,,,206,,,206,206,,,206,,,,,,206,,,,,,,,206,,,', +',206,206,206,206,,206,206,,,,206,206,,207,207,207,,207,206,,206,207', +'207,,,,207,,207,207,207,207,207,207,207,,,,,,207,207,207,207,207,207', +'207,,,207,,,,,,,207,,,207,207,207,207,207,207,207,207,,207,207,207,', +'207,207,207,207,207,,,,,,,,,,,,,,,,,,,,207,,,207,,,207,207,,,207,,,', +',,207,,,,,,,,207,,,,,207,207,207,207,,207,207,,,,207,207,,208,208,208', +',208,207,,207,208,208,,,,208,,208,208,208,208,208,208,208,,,,,,208,208', +'208,208,208,208,208,,,208,,,,,,,208,,,208,208,208,208,208,208,208,208', +',208,208,208,,208,208,208,208,208,,,,,,,,,,,,,,,,,,,,208,,,208,,,208', +'208,,,208,,,,,,208,,,,,,,,208,,,,,208,208,208,208,,208,208,,,,208,208', +',209,209,209,,209,208,,208,209,209,,,,209,,209,209,209,209,209,209,209', +',,,,,209,209,209,209,209,209,209,,,209,,,,,,,209,,,209,209,209,209,209', +'209,209,209,,209,209,209,,209,209,209,209,209,,,,,,,,,,,,,,,,,,,,209', +',,209,,,209,209,,,209,,,,,,209,,,,,,,,209,,,,,209,209,209,209,,209,209', +',,,209,209,209,779,779,779,,779,209,,209,779,779,,,,779,,779,779,779', +'779,779,779,779,,,,,,779,779,779,779,779,779,779,,,779,,,,,,,779,,,779', +'779,779,779,779,779,779,779,,779,779,779,,779,779,779,779,779,,,,,,', +',,,,,,,,,,,,,779,,,779,,,779,779,,,779,,779,,,,779,,,,,,,,779,,,,,779', +'779,779,779,,779,779,,,,779,779,,269,269,269,,269,779,,779,269,269,', +',,269,,269,269,269,269,269,269,269,,,,,,269,269,269,269,269,269,269', +',,269,,,,,,,269,,,269,269,269,269,269,269,269,269,269,269,269,269,,269', +'269,269,269,269,,,,,,,,,,,,,,,,,,,,269,,,269,,,269,269,,,269,,269,,269', +',269,,,,,,,,269,,,,,269,269,269,269,,269,269,,,,269,269,,270,270,270', +',270,269,,269,270,270,,,,270,,270,270,270,270,270,270,270,,,,,,270,270', +'270,270,270,270,270,,,270,,,,,,,270,,,270,270,270,270,270,270,270,270', +'270,270,270,270,,270,270,270,270,270,,,,,,,,,,,,,,,,,,,,270,,,270,,', +'270,270,,,270,,270,,270,,270,,,,,,,,270,,,,,270,270,270,270,,270,270', +',,,270,270,,278,278,278,,278,270,,270,278,278,,,,278,,278,278,278,278', +'278,278,278,,,,,,278,278,278,278,278,278,278,,,278,,,,,,,278,,,278,278', +'278,278,278,278,278,278,278,278,278,278,,278,278,278,278,278,,,,,,,', +',,,,,,,,,,,,278,,,278,,,278,278,,,278,,278,,278,,278,,,,,,,,278,,,,', +'278,278,278,278,,278,278,,,,278,278,278,731,731,731,,731,278,,278,731', +'731,,,,731,,731,731,731,731,731,731,731,,,,,,731,731,731,731,731,731', +'731,,,731,,,,,,,731,,,731,731,731,731,731,731,731,731,731,731,731,731', +',731,731,731,731,731,,,,,,,,,,,,,,,,,,,,731,,,731,,,731,731,,,731,,731', +',731,,731,,,,,,,,731,,,,,731,731,731,731,,731,731,,,,731,731,,284,284', +'284,,284,731,,731,284,284,,,,284,,284,284,284,284,284,284,284,,,,,,284', +'284,284,284,284,284,284,,,284,,,,,,,284,,,284,284,284,284,284,284,284', +'284,,284,284,284,,284,284,,,284,491,491,491,491,491,491,491,491,491', +'491,491,,491,491,,,491,491,,284,,,284,,,284,284,,,284,,,491,,491,,491', +'491,491,491,491,491,491,,491,,,,284,284,284,284,,284,284,,,,284,284', +',491,,284,,,284,,284,728,728,728,,728,,,,728,728,,,,728,,728,728,728', +'728,728,728,728,,,,,,728,728,728,728,728,728,728,,,728,,,,,,,728,,,728', +'728,728,728,728,728,728,728,728,728,728,728,,728,728,728,728,728,,,', +',,,,,,,,,,,,,,,,728,,,728,,,728,728,,,728,,728,,728,,728,,,,,,,,728', +',,,,728,728,728,728,,728,728,,,,728,728,,716,716,716,,716,728,,728,716', +'716,,,,716,,716,716,716,716,716,716,716,,,,,,716,716,716,716,716,716', +'716,,,716,,,,,,,716,,,716,716,716,716,716,716,716,716,,716,716,716,', +'716,716,716,716,716,,,,,,,,,,,,,,,,,,,,716,,,716,,,716,716,,,716,,,', +',,716,,,,,,,,716,,,,,716,716,716,716,,716,716,,,,716,716,,714,714,714', +',714,716,,716,714,714,,,,714,,714,714,714,714,714,714,714,,,,,,714,714', +'714,714,714,714,714,,,714,,,,,,,714,,,714,714,714,714,714,714,714,714', +',714,714,714,,714,714,714,714,714,,,,,,,,,,,,,,,,,,,,714,,,714,,,714', +'714,,,714,,,,,,714,,,,,,,,714,,,,,714,714,714,714,,714,714,,,,714,714', +',713,713,713,,713,714,,714,713,713,,,,713,,713,713,713,713,713,713,713', +',,,,,713,713,713,713,713,713,713,,,713,,,,,,,713,,,713,713,713,713,713', +'713,713,713,,713,713,713,,713,713,713,713,713,,,,,,,,,,,,,,,,,,,,713', +',,713,,,713,713,,,713,,,,,,713,,,,,,,,713,,,,,713,713,713,713,,713,713', +',,,713,713,,712,712,712,,712,713,,713,712,712,,,,712,,712,712,712,712', +'712,712,712,,,,,,712,712,712,712,712,712,712,,,712,,,,,,,712,,,712,712', +'712,712,712,712,712,712,,712,712,712,,712,712,712,712,712,,,,,,,,,,', +',,,,,,,,,712,,,712,,,712,712,,,712,,,,,,712,,,,,,,,712,,,,,712,712,712', +'712,,712,712,,,,712,712,,701,701,701,,701,712,,712,701,701,,,,701,,701', +'701,701,701,701,701,701,,,,,,701,701,701,701,701,701,701,,,701,,,,,', +',701,,,701,701,701,701,701,701,701,701,,701,701,701,,701,701,701,701', +'701,,,,,,,,,,,,,,,,,,,,701,,,701,,,701,701,,,701,,,,,,701,,,,,,,,701', +',,,,701,701,701,701,,701,701,,,,701,701,,699,699,699,,699,701,,701,699', +'699,,,,699,,699,699,699,699,699,699,699,,,,,,699,699,699,699,699,699', +'699,,,699,,,,,,,699,,,699,699,699,699,699,699,699,699,,699,699,699,', +'699,699,699,699,699,,,,,,,,,,,,,,,,,,,,699,,,699,,,699,699,,,699,,,', +',,699,,,,,,,,699,,,,,699,699,699,699,,699,699,,,,699,699,,297,297,297', +',297,699,,699,297,297,,,,297,,297,297,297,297,297,297,297,,,,,,297,297', +'297,297,297,297,297,,,297,,,,,,,297,,,297,297,297,297,297,297,297,297', +',297,297,297,,297,297,,,297,,,,,,,,,,,,,,,,,,,,297,,,297,,,297,297,', +',297,,,,,,,,,,,,,,,,,,,297,297,297,297,,297,297,,,,297,297,,671,671', +'671,,671,297,,297,671,671,,,,671,,671,671,671,671,671,671,671,,,,,,671', +'671,671,671,671,671,671,,,671,,,,,,,671,,,671,671,671,671,671,671,671', +'671,,671,671,671,,671,671,671,671,671,,,,,,,,,,,,,,,,,,,,671,,,671,', +',671,671,,,671,,,,,,671,,,,,,,,671,,,,,671,671,671,671,,671,671,,,,671', +'671,,306,306,306,,306,671,,671,306,306,,,,306,,306,306,306,306,306,306', +'306,,,,,,306,306,306,306,306,306,306,,,306,,,,,,,306,,,306,306,306,306', +'306,306,306,306,,306,306,306,,306,306,306,306,306,,,,,,,,,,,,,,,,,,', +',306,,,306,306,,306,306,,,306,,,,,,306,,,,,,,,306,,,,,306,306,306,306', +',306,306,,,,306,306,,618,618,618,,618,306,,306,618,618,,,,618,,618,618', +'618,618,618,618,618,,,,,,618,618,618,618,618,618,618,,,618,,,,,,,618', +',,618,618,618,618,618,618,618,618,,618,618,618,,618,618,,,618,,,,,,', +',,,,,,,,,,,,,618,,,618,,,618,618,,,618,,,,,,,,,,,,,,,,,,,618,618,618', +'618,,618,618,,,,618,618,,322,322,322,,322,618,,618,322,322,,,,322,,322', +'322,322,322,322,322,322,,,,,,322,322,322,322,322,322,322,,,322,,,,,', +',322,,,322,322,322,322,322,322,322,322,,322,322,322,,322,322,322,322', +'322,,,,,,,,,,,,,,,,,,,,322,,,322,,,322,322,,,322,,,,,,322,,,,,,,,322', +',,,,322,322,322,322,,322,322,,,,322,322,,323,323,323,,323,322,,322,323', +'323,,,,323,,323,323,323,323,323,323,323,,,,,,323,323,323,323,323,323', +'323,,,323,,,,,,,323,,,323,323,323,323,323,323,323,323,,323,323,323,', +'323,323,323,323,323,,,,,,,,,,,,,,,,,,,,323,,,323,,,323,323,,,323,,,', +',,323,,,,,,,,323,,,,,323,323,323,323,,323,323,,,,323,323,,607,607,607', +',607,323,,323,607,607,,,,607,,607,607,607,607,607,607,607,,,,,,607,607', +'607,607,607,607,607,,,607,,,,,,,607,,,607,607,607,607,607,607,607,607', +',607,607,607,,607,607,,,607,,,,,,,,,,,,,,,,,,,,607,,,607,,,607,607,', +',607,,,,,,,,,,,,,,,,,,,607,607,607,607,,607,607,,,,607,607,,588,588', +'588,,588,607,,607,588,588,,,,588,,588,588,588,588,588,588,588,,,,,,588', +'588,588,588,588,588,588,,,588,,,,,,,588,,,588,588,588,588,588,588,588', +'588,,588,588,588,,588,588,588,588,588,,,,,,,,,,,,,,,,,,,,588,,,588,', +',588,588,,,588,,,,,,588,,,,,,,,588,,,,,588,588,588,588,,588,588,,,,588', +'588,,341,341,341,,341,588,,588,341,341,,,,341,,341,341,341,341,341,341', +'341,,,,,,341,341,341,341,341,341,341,,,341,,,,,,,341,,,341,341,341,341', +'341,341,341,341,,341,341,341,,341,341,341,341,341,,,,,,,,,,,,,,,,,,', +',341,,,341,,,341,341,,,341,,,,,,341,,,,,,,,341,,,,,341,341,341,341,', +'341,341,,,,341,341,,571,571,571,,571,341,,341,571,571,,,,571,,571,571', +'571,571,571,571,571,,,,,,571,571,571,571,571,571,571,,,571,,,,,,,571', +',,571,571,571,571,571,571,571,571,,571,571,571,,571,571,571,571,571', +',,,,,,,,,,,,,,,,,,,571,,,571,,,571,571,,,571,,,,,,571,,,,,,,,571,,,', +',571,571,571,571,,571,571,,,,571,571,,568,568,568,,568,571,,571,568', +'568,,,,568,,568,568,568,568,568,568,568,,,,,,568,568,568,568,568,568', +'568,,,568,,,,,,,568,,,568,568,568,568,568,568,568,568,,568,568,568,', +'568,568,568,568,568,,,,,,,,,,,,,,,,,,,,568,,,568,,,568,568,,,568,,,', +',,568,,,,,,,,568,,,,,568,568,568,568,,568,568,,,,568,568,,564,564,564', +',564,568,,568,564,564,,,,564,,564,564,564,564,564,564,564,,,,,,564,564', +'564,564,564,564,564,,,564,,,,,,,564,,,564,564,564,564,564,564,564,564', +',564,564,564,,564,564,564,564,564,,,,,,,,,,,,,,,,,,,,564,,,564,,,564', +'564,,,564,,,,,,564,,,,,,,,564,,,,,564,564,564,564,,564,564,,,,564,564', +',563,563,563,,563,564,,564,563,563,,,,563,,563,563,563,563,563,563,563', +',,,,,563,563,563,563,563,563,563,,,563,,,,,,,563,,,563,563,563,563,563', +'563,563,563,,563,563,563,,563,563,563,563,563,,,,,,,,,,,,,,,,,,,,563', +',,563,,,563,563,,,563,,,,,,563,,,,,,,,563,,,,,563,563,563,563,,563,563', +',,,563,563,,560,560,560,,560,563,,563,560,560,,,,560,,560,560,560,560', +'560,560,560,,,,,,560,560,560,560,560,560,560,,,560,,,,,,,560,,,560,560', +'560,560,560,560,560,560,,560,560,560,,560,560,560,560,560,,,,,,,,,,', +',,,,,,,,,560,,,560,,,560,560,,,560,,,,,,560,,,,,,,,560,,,,,560,560,560', +'560,,560,560,,,,560,560,,557,557,557,,557,560,,560,557,557,,,,557,,557', +'557,557,557,557,557,557,,,,,,557,557,557,557,557,557,557,,,557,,,,,', +',557,,,557,557,557,557,557,557,557,557,,557,557,557,,557,557,557,557', +'557,,,,,,,,,,,,,,,,,,,,557,,,557,,,557,557,,,557,,,,,,557,,,,,,,,557', +',,,,557,557,557,557,,557,557,,,,557,557,,356,356,356,,356,557,,557,356', +'356,,,,356,,356,356,356,356,356,356,356,,,,,,356,356,356,356,356,356', +'356,,,356,,,,,,,356,,,356,356,356,356,356,356,356,356,,356,356,356,', +'356,356,356,356,356,,,,,,,,,,,,,,,,,,,,356,,,356,,,356,356,,,356,,,', +',,356,,,,,,,,356,,,,,356,356,356,356,,356,356,,,,356,356,,383,383,383', +',383,356,,356,383,383,,,,383,,383,383,383,383,383,383,383,,,,,,383,383', +'383,383,383,383,383,,,383,,,,,,,383,,,383,383,383,383,383,383,383,383', +',383,383,383,,383,383,383,383,383,,,,,,,,,,,,,,,,,,,,383,,,383,,,383', +'383,,,383,,,,,,383,,,,,,,,383,,,,,383,383,383,383,,383,383,,,,383,383', +',529,529,529,,529,383,,383,529,529,,,,529,,529,529,529,529,529,529,529', +',,,,,529,529,529,529,529,529,529,,,529,,,,,,,529,,,529,529,529,529,529', +'529,529,529,,529,529,529,,529,529,529,529,529,,,,,,,,,,,,,,,,,,,,529', +',,529,,,529,529,,,529,,,,,,529,,,,,,,,529,,,,,529,529,529,529,,529,529', +',,,529,529,,526,526,526,,526,529,,529,526,526,,,,526,,526,526,526,526', +'526,526,526,,,,,,526,526,526,526,526,526,526,,,526,,,,,,,526,,,526,526', +'526,526,526,526,526,526,526,526,526,526,,526,526,526,526,526,,,,,,,', +',,,,,,,,,,,,526,,,526,,,526,526,,,526,,526,,526,,526,,,,,,,,526,,,,', +'526,526,526,526,,526,526,,,,526,526,,415,415,415,,415,526,,526,415,415', +',,,415,,415,415,415,415,415,415,415,,,,,,415,415,415,415,415,415,415', +',,415,,,,,,,415,,,415,415,415,415,415,415,415,415,415,415,415,415,,415', +'415,415,415,415,,,,,,,,,,,,,,,,,,,,415,,,415,,,415,415,,,415,,415,,415', +',415,,,,,,,,415,,,,,415,415,415,415,,415,415,,,,415,415,,417,417,417', +',417,415,,415,417,417,,,,417,,417,417,417,417,417,417,417,,,,,,417,417', +'417,417,417,417,417,,,417,,,,,,,417,,,417,417,417,417,417,417,417,417', +',417,417,417,,417,417,417,417,417,,,,,,,,,,,,,,,,,,,,417,,,417,,,417', +'417,,,417,,,,,,417,,,,,,,,417,,,,,417,417,417,417,,417,417,,,,417,417', +',418,418,418,,418,417,,417,418,418,,,,418,,418,418,418,418,418,418,418', +',,,,,418,418,418,418,418,418,418,,,418,,,,,,,418,,,418,418,418,418,418', +'418,418,418,,418,418,418,,418,418,418,418,418,,,,,,,,,,,,,,,,,,,,418', +',,418,,,418,418,,,418,,,,,,418,,,,,,,,418,,,,,418,418,418,418,,418,418', +',,,418,418,,419,419,419,,419,418,,418,419,419,,,,419,,419,419,419,419', +'419,419,419,,,,,,419,419,419,419,419,419,419,,,419,,,,,,,419,,,419,419', +'419,419,419,419,419,419,,419,419,419,,419,419,419,419,419,,,,,,,,,,', +',,,,,,,,,419,,,419,,,419,419,,,419,,,,,,419,,,,,,,,419,,,,,419,419,419', +'419,,419,419,,,,419,419,,516,516,516,,516,419,,419,516,516,,,,516,,516', +'516,516,516,516,516,516,,,,,,516,516,516,516,516,516,516,,,516,,,,,', +',516,,,516,516,516,516,516,516,516,516,516,516,516,516,,516,516,516', +'516,516,,,,,,,,,,,,,,,,,,,,516,,,516,,,516,516,,,516,,516,,516,,516', +',,,,,,,516,,,,,516,516,516,516,,516,516,,,,516,516,,515,515,515,,515', +'516,,516,515,515,,,,515,,515,515,515,515,515,515,515,,,,,,515,515,515', +'515,515,515,515,,,515,,,,,,,515,,,515,515,515,515,515,515,515,515,,515', +'515,515,,515,515,515,515,515,,,,,,,,,,,,,,,,,,,,515,,,515,,,515,515', +',,515,,515,,,,515,,,,,,,,515,,,,,515,515,515,515,,515,515,,,,515,515', +',501,501,501,,501,515,,515,501,501,,,,501,,501,501,501,501,501,501,501', +',,,,,501,501,501,501,501,501,501,,,501,,,,,,,501,,,501,501,501,501,501', +'501,501,501,501,501,501,501,,501,501,501,501,501,,,,,,,,,,,,,,,,,,,', +'501,,,501,,,501,501,,,501,,,,,,501,,,,,,,,501,,,,,501,501,501,501,,501', +'501,,,,501,501,,498,498,498,,498,501,,501,498,498,,,,498,,498,498,498', +'498,498,498,498,,,,,,498,498,498,498,498,498,498,,,498,,,,,,,498,,,498', +'498,498,498,498,498,498,498,498,498,498,498,,498,498,498,498,498,,,', +',,,,,,,,,,,,,,,,498,,,498,,,498,498,,,498,,498,,,,498,,,,,,,,498,,,', +',498,498,498,498,,498,498,,,,498,498,,494,494,494,,494,498,,498,494', +'494,,,,494,,494,494,494,494,494,494,494,,,,,,494,494,494,494,494,494', +'494,,,494,,,,,,,494,,,494,494,494,494,494,494,494,494,,494,494,494,', +'494,494,494,494,494,,,,,,,,,,,,,,,,,,,,494,,,494,,,494,494,,,494,,494', +',,,494,,,,,,,,494,,,,,494,494,494,494,,494,494,,,,494,494,,492,492,492', +',492,494,,494,492,492,,,,492,,492,492,492,492,492,492,492,,,,,,492,492', +'492,492,492,492,492,,,492,,,,,,,492,,,492,492,492,492,492,492,492,492', +',492,492,492,,492,492,492,492,492,,,,,,,,,,,,,,,,,,,,492,,,492,,,492', +'492,,,492,,,,,,492,,,,,,,,492,,,,,492,492,492,492,,492,492,,,,492,492', +',488,488,488,,488,492,,492,488,488,,,,488,,488,488,488,488,488,488,488', +',,,,,488,488,488,488,488,488,488,,,488,,,,,,,488,,,488,488,488,488,488', +'488,488,488,,488,488,488,,488,488,488,488,488,,,,,,,,,,,,,,,,,,,,488', +',,488,,,488,488,,,488,,,,,,488,,,,,,,,488,,,,,488,488,488,488,,488,488', +',,,488,488,,487,487,487,,487,488,,488,487,487,,,,487,,487,487,487,487', +'487,487,487,,,,,,487,487,487,487,487,487,487,,,487,,,,,,,487,,,487,487', +'487,487,487,487,487,487,,487,487,487,,487,487,487,487,487,,,,,,,,,,', +',,,,,,,,,487,,,487,,,487,487,,,487,,,,,,487,,,,,,,,487,,,,,487,487,487', +'487,,487,487,,,,487,487,,486,486,486,,486,487,,487,486,486,,,,486,,486', +'486,486,486,486,486,486,,,,,,486,486,486,486,486,486,486,,,486,,,,,', +',486,,,486,486,486,486,486,486,486,486,,486,486,486,,486,486,486,486', +'486,,,,,,,,,,,,,,,,,,,,486,,,486,,,486,486,,,486,,,,,,486,,,,,,,,486', +',,,,486,486,486,486,,486,486,,,,486,486,,483,483,483,,483,486,,486,483', +'483,,,,483,,483,483,483,483,483,483,483,,,,,,483,483,483,483,483,483', +'483,,,483,,,,,,,483,,,483,483,483,483,483,483,483,483,,483,483,483,', +'483,483,,,483,,,,,,,,,,,,,,,,,,,,483,,,483,,,483,483,,,483,,,,,,,,,', +',,,,,,,,,483,483,483,483,,483,483,,,,483,483,,476,476,476,,476,483,', +'483,476,476,,,,476,,476,476,476,476,476,476,476,,,,,,476,476,476,476', +'476,476,476,,,476,,,,,,,476,,,476,476,476,476,476,476,476,476,476,476', +'476,476,,476,476,476,476,476,,,,,,,,,,,,,,,,,,,,476,,,476,,,476,476', +',,476,,476,,476,,476,,,,,,,,476,,,,,476,476,476,476,,476,476,,,,476', +'476,,474,474,474,,474,476,,476,474,474,,,,474,,474,474,474,474,474,474', +'474,,,,,,474,474,474,474,474,474,474,,,474,,,,,,,474,,,474,474,474,474', +'474,474,474,474,,474,474,474,,474,474,,,474,,,,,,,,,,,,,,,,,,,,474,', +',474,,,474,474,,,474,,,,,,,,,,,,,,,,,,,474,474,474,474,,474,474,,,,474', +'474,,464,464,464,,464,474,,474,464,464,,,,464,,464,464,464,464,464,464', +'464,,,,,,464,464,464,464,464,464,464,,,464,,,,,,,464,,,464,464,464,464', +'464,464,464,464,464,464,464,464,,464,464,464,464,464,597,597,597,597', +'597,597,597,597,597,597,597,,597,597,,,597,597,,464,,597,464,,,464,464', +',,464,,,597,464,597,464,597,597,597,597,597,597,597,464,597,,,,464,464', +'464,464,,464,464,,,,464,464,,597,,597,,,464,,464,554,554,554,554,554', +'554,554,554,554,554,554,554,554,554,554,554,554,554,554,554,554,554', +'554,554,,,,554,554,554,554,554,554,554,554,554,554,,,,,,554,554,554', +'554,554,554,554,554,554,,,554,,,,,,,,554,554,,554,554,554,554,554,554', +'554,,,554,554,,,,554,554,554,554,,,,,,,,,,,,,,554,554,,554,554,554,554', +'554,554,554,554,554,554,554,,,554,554,,,,,,,,,,,554,7,7,7,7,7,7,7,7', +'7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,,,,7,7,7,7,7,7,7,7,7,7,,,,,,7,7,7,7', +'7,7,7,7,7,,,7,,,,,,,,7,7,,7,7,7,7,7,7,7,,,7,7,,,,7,7,7,7,,,,,,,,,,,', +',,7,7,,7,7,7,7,7,7,7,7,7,7,7,,,7,7,,,,,,,,,,,7,6,6,6,6,6,6,6,6,6,6,6', +'6,6,6,6,6,6,6,6,6,6,6,6,6,,,,6,6,6,6,6,6,6,6,6,6,,,,,,6,6,6,6,6,6,6', +'6,6,6,,6,,,,,,,,6,6,,6,6,6,6,6,6,6,,,6,6,,,,6,6,6,6,,,,,,,,,,,,,,6,6', +',6,6,6,6,6,6,6,6,6,6,6,,,6,6,,,,,,,,,,,6,372,372,372,372,372,372,372', +'372,372,372,372,372,372,372,372,372,372,372,372,372,372,372,372,372', +',,,372,372,372,372,372,372,372,372,372,372,,,,,,372,372,372,372,372', +'372,372,372,372,,,372,,,,,,,,372,372,,372,372,372,372,372,372,372,,', +'372,372,,,,372,372,372,372,,,,,,,,,,,,,,372,372,,372,372,372,372,372', +'372,372,372,372,372,372,,,372,372,,,,,,,,,,,372,684,684,684,684,684', +'684,684,684,684,684,684,684,684,684,684,684,684,684,684,684,684,684', +'684,684,,,,684,684,684,684,684,684,684,684,684,684,,,,,,684,684,684', +'684,684,684,684,684,684,,,684,,,,,,,,684,684,,684,684,684,684,684,684', +'684,,,684,684,,,,684,684,684,684,,,,,,,,,,,,,,684,684,,684,684,684,684', +'684,684,684,684,684,684,684,,,684,65,65,65,65,65,65,65,65,65,65,65,65', +'65,65,65,65,65,65,65,65,65,65,65,65,,,,65,65,65,65,65,65,65,65,65,65', +',,,,,65,65,65,65,65,65,65,65,65,65,65,65,,65,,,,,,65,65,,65,65,65,65', +'65,65,65,,,65,65,,,,65,65,65,65,,,,,,65,,,,,,,,65,65,,65,65,65,65,65', +'65,65,65,65,65,65,414,414,65,,414,,,,,,,,414,414,,414,414,414,414,414', +'414,414,,,414,414,,,,414,414,414,414,,,,,,414,,,,,,,,414,414,,414,414', +'414,414,414,414,414,414,414,414,414,525,525,414,,525,,,,,,,,525,525', +',525,525,525,525,525,525,525,,,525,525,,,,525,525,525,525,,,,,,525,', +',,,,,,525,525,,525,525,525,525,525,525,525,525,525,525,525,201,201,525', +',201,,,,,,,,201,201,,201,201,201,201,201,201,201,,,201,201,,,,201,201', +'201,201,,,,,,201,,,,,,,,201,201,,201,201,201,201,201,201,201,201,201', +'201,201,413,413,201,,413,,,,,,,,413,413,,413,413,413,413,413,413,413', +',,413,413,,,,413,413,413,413,,,,,,413,,,,,,,,413,413,,413,413,413,413', +'413,413,413,413,413,413,413,915,915,413,,915,,,,,,,,915,915,,915,915', +'915,915,915,915,915,,,915,915,,,,915,915,915,915,,,,,,915,,,,,,,,915', +'915,,915,915,915,915,915,915,915,915,915,915,915,477,477,915,,477,,', +',,,,,477,477,,477,477,477,477,477,477,477,,,477,477,,,,477,477,477,477', +',,,,,477,,,,,,,,477,477,,477,477,477,477,477,477,477,477,477,477,477', +'478,478,477,,478,,,,,,,,478,478,,478,478,478,478,478,478,478,,,478,478', +',,,478,478,478,478,,,,,,478,,,,,,,,478,478,,478,478,478,478,478,478', +'478,478,478,478,478,490,490,478,,490,,,,,,,,490,490,,490,490,490,490', +'490,490,490,,,490,490,,,,490,490,490,490,,,,,,490,,,,,,,,490,490,,490', +'490,490,490,490,490,490,490,490,490,490,202,202,490,,202,,,,,,,,202', +'202,,202,202,202,202,202,202,202,,,202,202,,,,202,202,202,202,,,,,,202', +',,,,,,,202,202,,202,202,202,202,202,202,202,202,202,202,202,489,489', +'202,,489,,,,,,,,489,489,,489,489,489,489,489,489,489,,,489,489,,,,489', +'489,489,489,,,,,,489,,,,,,,,489,489,,489,489,489,489,489,489,489,489', +'489,489,489,877,877,489,,877,,,,,,,,877,877,,877,877,877,877,877,877', +'877,,,877,877,,,,877,877,877,877,,,,,,877,,,,,,,,877,877,,877,877,877', +'877,877,877,877,877,877,877,877,267,267,877,,267,,,,,,,,267,267,,267', +'267,267,267,267,267,267,,,267,267,,,,267,267,267,267,,,,,,,,,,,,,,267', +'267,,267,267,267,267,267,267,267,267,267,267,267,266,266,267,,266,,', +',,,,,266,266,,266,266,266,266,266,266,266,,,266,266,,,,266,266,266,266', +',,,,,,,,,,,,,266,266,,266,266,266,266,266,266,266,266,266,266,266,518', +'518,266,,518,,,,,,,,518,518,,518,518,518,518,518,518,518,,,518,518,', +',,518,518,518,518,,,,,,518,,,,,,,,518,518,,518,518,518,518,518,518,518', +'518,518,518,518,524,524,518,,524,,,,,,,,524,524,,524,524,524,524,524', +'524,524,,,524,524,,,,524,524,524,524,,,,,,524,,,,,,,,524,524,,524,524', +'524,524,524,524,524,524,524,524,524,878,878,524,,878,,,,,,,,878,878', +',878,878,878,878,878,878,878,,,878,878,,,,878,878,878,878,,,,,,878,', +',,,,,,878,878,,878,878,878,878,878,878,878,878,878,878,878,517,517,878', +',517,,,,,,,,517,517,,517,517,517,517,517,517,517,,,517,517,,,,517,517', +'517,517,,,,,,517,,,,,,,,517,517,,517,517,517,517,517,517,517,517,517', +'517,517,,,517,19,19,19,19,19,19,19,19,19,19,19,,19,19,,,19,19,,,,,,', +',,,,,,,,19,,19,,19,19,19,19,19,19,19,,19,,251,251,251,251,251,251,251', +'251,251,251,251,,251,251,,19,251,251,,,,,,,,,,,,,,,251,,251,,251,251', +'251,251,251,251,251,,251,,406,406,406,406,406,406,406,406,406,406,406', +',406,406,,251,406,406,,,,,,,,,,,,,,,406,,406,,406,406,406,406,406,406', +'406,,406,,445,445,445,445,445,445,445,445,445,445,445,,445,445,,406', +'445,445,,,,,,,,,,,,,,,445,,445,,445,445,445,445,445,445,445,,445,,619', +'619,619,619,619,619,619,619,619,619,619,,619,619,445,445,619,619,,,', +',,,,,,,,,,,619,,619,,619,619,619,619,619,619,619,,619,,697,697,697,697', +'697,697,697,697,697,697,697,,697,697,,619,697,697,,,,,,,,,,,,,,,697', +',697,,697,697,697,697,697,697,697,,697,,700,700,700,700,700,700,700', +'700,700,700,700,,700,700,,697,700,700,,,,,,,,,,,,,,,700,,700,,700,700', +'700,700,700,700,700,,700,,704,704,704,704,704,704,704,704,704,704,704', +',704,704,,700,704,704,,,,,,,,,,,,,,,704,,704,,704,704,704,704,704,704', +'704,,704,,706,706,706,706,706,706,706,706,706,706,706,,706,706,,704', +'706,706,,,,,,,,,,,,,,,706,,706,,706,706,706,706,706,706,706,,706,,709', +'709,709,709,709,709,709,709,709,709,709,,709,709,,706,709,709,,,,,,', +',,,,,,,,709,,709,,709,709,709,709,709,709,709,,709,,711,711,711,711', +'711,711,711,711,711,711,711,,711,711,,709,711,711,,,,,,,,,,,,,,,711', +',711,,711,711,711,711,711,711,711,,711,,795,795,795,795,795,795,795', +'795,795,795,795,,795,795,,711,795,795,,,,,,,,,,,,,,,795,,795,,795,795', +'795,795,795,795,795,,795,,797,797,797,797,797,797,797,797,797,797,797', +',797,797,,795,797,797,,,,,,,,,,,,,,,797,,797,,797,797,797,797,797,797', +'797,,797,,,,,,,,,,,,,,,,,797' ] + racc_action_check = arr = ::Array.new(23453, nil) + idx = 0 + clist.each do |str| + str.split(',', -1).each do |i| + arr[idx] = i.to_i unless i.empty? + idx += 1 + end + end + +racc_action_pointer = [ + 3307, 995, nil, 57, 771, 9682, 21345, 21221, 499, 495, + 435, 430, 477, 460, 396, 567, nil, -68, 10182, 22773, + 479, nil, 10307, 10432, 10557, 235, 135, 1547, 749, nil, + 5182, 10807, 10932, nil, 347, 260, 297, 485, 11315, 11440, + 11565, -66, 442, nil, nil, nil, nil, nil, nil, nil, + 1004, 3057, 11690, 11815, 11940, 67, nil, 12065, 12190, nil, + nil, 12315, 12448, 12573, 12698, 21705, nil, nil, nil, nil, + nil, nil, nil, 350, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 515, nil, nil, 385, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 1164, nil, 12823, nil, nil, nil, 12956, 13081, 13206, 13331, + 13456, 891, nil, 630, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 1000, nil, 2182, 2307, 13831, 13956, 14081, + 14206, 21885, 22245, nil, nil, 14331, 14456, 14581, 14706, 14831, + nil, nil, 1043, -39, 1071, 154, 982, 1031, nil, 5432, + 4557, 1024, 5682, 5807, 5932, 6057, 6182, 6307, 6432, 6557, + 6682, 6807, 6932, 7057, 7182, 7307, 7432, 7557, 7682, 7807, + 7932, 8057, 8182, 8307, 8432, 8557, 8682, 8807, nil, nil, + nil, 22819, nil, 967, 964, nil, 9057, 998, 9307, nil, + nil, nil, nil, 9432, nil, nil, 22485, 22425, 973, 15081, + 15206, nil, nil, nil, nil, nil, nil, nil, 15331, 928, + 3432, 937, 961, 920, 15581, 2807, 661, 915, 973, 552, + 938, 884, 188, nil, 909, 488, 865, 16589, nil, 431, + 925, 922, 819, nil, 921, nil, 16839, 976, 966, -3, + nil, -94, 351, 841, 810, 188, 802, nil, nil, 383, + -8, -9, 17089, 17214, 148, 856, 740, 85, 700, 805, + 1, 834, nil, nil, 694, 632, -33, nil, 786, nil, + 14, 17589, nil, nil, 461, -39, 491, 209, 359, 270, + 229, 570, 551, nil, 495, nil, 18464, nil, 387, 382, + 255, 166, -34, -59, nil, 865, nil, nil, nil, nil, + nil, nil, 21469, nil, nil, nil, nil, 670, 668, nil, + nil, 10933, nil, 18589, 650, nil, 637, nil, nil, 12315, + 638, nil, 294, 444, 1422, nil, nil, nil, 624, 663, + 0, nil, nil, 1213, 874, nil, 22865, nil, nil, nil, + 58, nil, 658, 21945, 21765, 18964, 103, 19089, 19214, 19339, + 3057, 2932, 467, 342, 678, 676, 674, 673, 1321, 3932, + 3807, 2182, 3432, 3182, 2557, 2432, 3557, 2057, 3307, 2307, + 3682, 704, 764, 2807, 2682, 22911, -47, nil, 9932, nil, + 10057, nil, 9807, nil, nil, 1134, nil, nil, 1343, nil, + nil, 556, nil, nil, 20964, -55, -43, 558, nil, 578, + 556, nil, nil, 583, 20839, 589, 20714, 22065, 22125, 913, + 629, nil, nil, 20589, 594, nil, 20464, 20339, 20214, 22305, + 22185, 15581, 20089, 719, 19964, nil, 611, nil, 19839, nil, + nil, 19714, nil, nil, nil, nil, 1311, 4432, 729, nil, + 4682, 54, 24, 730, 738, 19589, 19464, 22725, 22545, 61, + nil, nil, 578, nil, 22605, 21825, 18839, nil, nil, 18714, + 269, 51, 3182, 1145, nil, nil, nil, -25, nil, nil, + nil, 715, nil, nil, nil, 663, nil, nil, 127, nil, + nil, 664, nil, nil, 21097, nil, nil, 18339, 671, 9557, + 18214, 180, 709, 18089, 17964, 708, nil, nil, 17839, 741, + nil, 17714, nil, nil, 199, 86, 255, 125, 714, 12823, + 716, nil, 318, nil, 4057, 717, nil, 761, 17464, nil, + nil, nil, nil, nil, nil, -54, nil, 20964, -70, 735, + nil, 739, nil, 4807, 4932, nil, 81, 17339, 744, nil, + 751, 182, 278, 796, 214, 1068, 809, 780, 16964, 22957, + 853, 854, -13, 916, nil, 2557, 807, 850, nil, nil, + nil, 344, 24, 1275, 807, 810, 826, 830, nil, nil, + nil, nil, nil, nil, 129, 911, nil, 872, nil, nil, + nil, nil, 912, nil, nil, 914, 548, nil, 952, nil, + nil, nil, nil, 962, nil, 17, 847, 27, -18, 155, + 25, 16714, 523, 949, nil, 863, 2682, 433, nil, nil, + 984, 3557, 9195, 174, 21593, nil, nil, nil, nil, nil, + nil, 3807, nil, nil, nil, nil, nil, 23003, 867, 16464, + 23049, 16339, nil, nil, 23095, nil, 23141, nil, nil, 23187, + nil, 23233, 16214, 16089, 15964, 134, 15839, 900, 905, 906, + nil, 928, 906, 744, 220, nil, 1030, nil, 15714, nil, + 2932, 15456, nil, nil, 926, 941, 1045, 933, 312, nil, + nil, nil, 3682, nil, nil, -10, 9182, nil, nil, nil, + nil, nil, 958, nil, 968, nil, 12711, nil, nil, 1068, + 1039, 8932, nil, nil, 1004, nil, 966, 378, 1012, 977, + nil, nil, 1096, nil, 5557, 1106, 4307, 4182, nil, 14956, + 3932, -14, 55, nil, 1119, nil, 2057, nil, 1129, 1014, + nil, nil, 1032, 1020, nil, 23279, 13706, 23325, 1511, nil, + 1610, nil, nil, 1131, nil, 1046, 1026, nil, nil, nil, + 13581, nil, 1029, 1047, 1033, nil, 1034, nil, nil, nil, + nil, 5057, 45, 166, 1110, -7, nil, 2432, 1932, -35, + -30, 44, nil, nil, 105, 112, nil, 116, nil, nil, + 184, 623, 191, 1540, nil, nil, 16, nil, 370, 378, + nil, 32, nil, nil, 394, nil, nil, 10820, nil, 281, + 308, 310, 317, nil, 321, nil, 840, 757, 411, nil, + 11190, nil, nil, 11065, nil, 479, 10682, 22365, 22665, 43, + 422, 527, nil, 12461, nil, nil, 1733, nil, 1829, nil, + 1858, nil, nil, nil, 445, 1487, 411, 1807, nil, nil, + nil, nil, nil, 1682, nil, 5307, 12586, nil, nil, 1954, + nil, 1983, nil, nil, nil, 22005, nil, 447, nil, 452, + 18, 32, 116, 147, nil, nil, 485, 510, 523, 524, + 527, 1426, 530, 1547, 262, 659, 660, 541, 543, 544, + 546, 592, 829, nil, 44, nil, 1340, nil, nil, nil, + 1217, 885, nil, nil, nil, nil, 1704, nil, nil, nil, + 886, 1022, 1024, nil, nil ] + +racc_action_default = [ + -4, -552, -1, -538, -5, -552, -552, -552, -552, -552, + -552, -552, -552, -552, -273, -32, -33, -540, -552, -38, + -40, -41, -283, -319, -320, -45, -248, -248, -248, -58, + -4, -62, -70, -72, -552, -465, -552, -552, -552, -552, + -552, -540, -225, -266, -267, -268, -269, -270, -271, -272, + -526, -4, -552, -551, -518, -291, -293, -552, -552, -297, + -300, -538, -552, -552, -552, -552, -321, -322, -324, -325, + -414, -415, -416, -417, -418, -433, -421, -422, -435, -437, + -426, -431, -447, -435, -449, -450, -524, -454, -455, -525, + -457, -458, -459, -460, -461, -462, -463, -464, -467, -468, + -552, -3, -539, -547, -548, -549, -552, -552, -552, -552, + -552, -7, -8, -552, -99, -100, -101, -102, -103, -104, + -105, -106, -107, -111, -112, -113, -114, -115, -116, -117, + -118, -119, -120, -121, -122, -123, -124, -125, -126, -127, + -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, -164, -165, -166, -167, + -168, -169, -170, -171, -172, -173, -174, -175, -176, -177, + -178, -179, -180, -13, -108, -4, -4, -552, -552, -552, + -234, -552, -552, -536, -537, -552, -552, -552, -552, -540, + -541, -37, -552, -465, -552, -273, -552, -552, -217, -552, + -4, -552, -552, -552, -552, -552, -552, -552, -552, -552, + -552, -552, -552, -552, -552, -552, -552, -552, -552, -552, + -552, -552, -552, -552, -552, -552, -552, -552, -384, -386, + -42, -226, -236, -258, -258, -241, -552, -259, -552, -283, + -319, -320, -520, -552, -43, -44, -552, -552, -50, -234, + -552, -290, -389, -398, -400, -56, -395, -57, -540, -60, + -4, -540, -552, -63, -66, -4, -78, -552, -552, -85, + -286, -540, -552, -323, -396, -552, -68, -552, -74, -280, + -451, -452, -552, -202, -203, -218, -552, -406, -552, -276, + -227, -544, -544, -552, -552, -544, -552, -292, -376, -39, + -552, -552, -552, -552, -538, -552, -539, -465, -552, -552, + -273, -552, -335, -336, -94, -95, -552, -97, -552, -273, + -552, -552, -465, -312, -99, -100, -140, -141, -142, -158, + -163, -170, -173, -314, -552, -516, -552, -419, -552, -552, + -552, -552, -552, -552, 965, -6, -550, -14, -15, -16, + -17, -18, -552, -10, -11, -12, -109, -552, -552, -21, + -29, -181, -259, -552, -552, -22, -30, -31, -23, -183, + -540, -235, -527, -528, -248, -393, -529, -530, -527, -248, + -528, -392, -394, -529, -530, -28, -191, -34, -35, -36, + -540, -289, -552, -552, -552, -234, -280, -552, -552, -552, + -192, -193, -194, -195, -196, -197, -198, -199, -204, -205, + -206, -207, -208, -209, -210, -211, -212, -213, -214, -215, + -216, -219, -220, -221, -222, -540, -365, -237, -257, -238, + -257, -255, -552, -260, -523, -248, -527, -528, -248, -48, + -51, -540, -249, -250, -251, -365, -365, -540, -285, -540, + -59, -278, -75, -64, -552, -540, -234, -552, -552, -84, + -552, -451, -452, -552, -71, -76, -552, -552, -552, -552, + -552, -223, -552, -551, -551, -275, -540, -228, -546, -545, + -230, -546, -281, -282, -519, -294, -488, -4, -326, -327, + -4, -552, -552, -552, -552, -552, -234, -552, -552, -280, + -305, -94, -95, -96, -552, -552, -234, -308, -469, -552, + -552, -552, -4, -488, -316, -534, -535, -540, -420, -434, + -439, -552, -441, -423, -436, -552, -438, -425, -552, -428, + -430, -552, -448, -9, -552, -19, -20, -552, -265, -552, + -552, -397, -552, -552, -552, -52, -233, -390, -552, -54, + -391, -552, -288, -542, -527, -528, -527, -528, -540, -181, + -552, -366, -370, -368, -4, -258, -256, -261, -552, -521, + -522, -46, -387, -47, -388, -365, -231, -38, -552, -258, + -247, -540, -253, -4, -4, -284, -61, -552, -67, -73, + -540, -527, -528, -232, -531, -83, -552, -69, -552, -190, + -200, -201, -540, -551, -333, -4, -407, -551, -408, -409, + -277, -544, -552, -488, -370, -515, -515, -515, -487, -489, + -490, -491, -492, -493, -494, -552, -497, -552, -499, -505, + -507, -508, -510, -511, -512, -552, -551, -328, -551, -298, + -329, -330, -301, -552, -304, -552, -540, -527, -528, -531, + -279, -552, -94, -95, -98, -540, -4, -552, -471, -310, + -552, -4, -488, -552, -552, -517, -440, -443, -444, -445, + -446, -4, -424, -427, -429, -432, -110, -182, -263, -552, + -184, -552, -543, -25, -186, -26, -187, -53, -27, -188, + -55, -189, -552, -552, -552, -397, -552, -515, -515, -515, + -364, -552, -370, -552, -494, -503, -552, -239, -257, -262, + -4, -552, -244, -252, -540, -552, -552, -65, -397, -77, + -287, -2, -4, -413, -334, -552, -552, -411, -229, -377, + -380, -382, -370, -379, -552, -480, -552, -483, -485, -552, + -552, -552, -496, -337, -552, -339, -341, -348, -494, -540, + -509, -513, -552, -331, -552, -552, -4, -4, -303, -552, + -4, -397, -552, -397, -552, -470, -4, -313, -552, -540, + -473, -317, -552, -264, -24, -185, -552, -224, -355, -357, + -552, -360, -362, -552, -367, -552, -371, -372, -374, -375, + -552, -385, -258, -552, -258, -243, -258, -254, -399, -401, + -412, -4, -465, -552, -552, -273, -410, -4, -4, -540, + -515, -515, -500, -514, -515, -515, -506, -515, -495, -501, + -540, -552, -346, -552, -498, -295, -552, -296, -552, -552, + -261, -551, -306, -309, -552, -315, -472, -488, -442, -515, + -515, -515, -515, -504, -515, -369, -552, -502, -552, -240, + -257, -49, -242, -257, -245, -406, -234, -552, -552, -280, + -552, -552, -378, -552, -476, -478, -552, -481, -552, -484, + -552, -486, -338, -340, -344, -552, -349, -4, -299, -302, + -402, -403, -404, -4, -311, -4, -552, -352, -354, -552, + -358, -552, -361, -363, -373, -552, -280, -258, -405, -540, + -527, -528, -531, -279, -381, -383, -515, -515, -515, -515, + -342, -552, -347, -552, -551, -552, -552, -515, -515, -515, + -515, -279, -531, -246, -397, -474, -552, -477, -479, -482, + -552, -345, -332, -307, -318, -350, -552, -353, -356, -359, + -515, -343, -515, -475, -351 ] + +clist = [ +'117,117,308,35,390,208,272,276,35,312,315,493,514,561,311,623,201,252', +'252,252,353,10,447,449,105,681,10,283,266,306,122,122,772,35,286,286', +'507,510,719,12,523,310,101,589,12,211,120,120,807,112,194,10,309,718', +'35,296,763,319,319,117,634,319,484,460,896,327,342,342,342,12,638,809', +'10,461,268,275,277,497,500,394,399,504,105,332,836,380,387,320,321,111', +'12,324,893,279,589,534,281,638,659,662,325,769,250,264,265,35,319,319', +'319,319,496,721,539,35,546,549,932,832,586,318,586,863,359,10,293,293', +'592,363,584,594,322,10,340,343,600,776,367,368,369,370,323,12,777,671', +'455,458,720,603,604,12,903,676,951,786,532,293,293,293,384,384,533,832', +'684,753,857,554,722,595,1,372,333,961,193,763,806,632,842,749,506,102', +'775,395,249,827,893,828,365,752,446,465,316,914,466,900,371,252,404', +'638,35,35,663,715,627,745,357,358,407,408,409,410,831,836,834,360,809', +'413,10,10,840,578,361,548,362,35,379,385,388,863,674,686,691,830,405', +'738,12,12,789,355,741,608,314,10,317,505,734,601,638,462,617,602,763', +'805,763,832,860,331,861,527,313,12,354,,,,252,252,,,,859,,,272,252,276', +',,730,,480,610,829,,35,,,,286,35,781,477,394,399,485,,2,,,783,,286,10', +'694,930,763,489,10,473,,,952,,,,,,,,,12,666,589,319,319,12,282,,,,,675', +'517,,382,386,,,,,926,763,531,763,279,,105,469,,279,905,463,475,511,512', +'727,613,537,535,467,763,707,528,937,513,710,,117,613,732,852,,,737,901', +'566,,,293,562,570,,780,628,,,,,,,,293,,451,395,453,613,122,748,586,454', +',815,,613,585,,,,404,,252,,120,,,553,,,,,599,638,,,,,,,,,411,,,580,', +'566,,,566,,,,565,,,,,569,,,,,,,631,384,,395,,,,821,,14,309,,,,14,395', +'485,252,404,,,,665,286,,485,,,629,680,404,,286,,,,377,378,622,14,289', +'289,,395,,468,,,470,591,,395,593,,,,35,252,404,35,14,282,,,404,558,', +'252,,,,330,339,339,10,319,,10,660,660,,35,,,902,,586,,944,586,,,12,', +'117,12,,678,679,10,,,,,,677,,,897,,717,14,562,293,,,,12,,14,,282,293', +',122,918,282,869,,872,587,874,316,35,590,,703,705,,566,120,708,570,696', +'562,,598,,,485,,10,35,35,,,286,743,,,739,747,,,,,,286,,12,10,10,,784', +'35,,626,572,788,,587,,,316,,791,,,12,12,,,10,,,,,382,,,562,,,,14,14', +',,,562,12,,,,,,,319,,,,,,,117,35,919,,596,14,35,,943,816,605,812,606', +',814,,35,698,609,10,785,,293,782,10,,790,,,,,,,293,10,,,12,,630,,,12', +',,,729,,,,794,,12,,,35,,,,854,835,,,837,,14,,35,,289,14,822,,10,,,,613', +',,685,,289,,,10,,,,826,,12,,,,,319,,,,,35,35,12,862,35,,864,,,,35,,', +',,,,,10,10,,,10,656,660,846,658,,10,,,,,,342,,12,12,,,12,,,733,13,35', +'12,877,,13,917,35,35,,,,793,,,,293,,212,10,740,,212,212,212,10,10,,', +',13,287,287,936,395,,,12,,,,,927,12,12,928,,929,252,404,,13,212,,,,726', +'212,212,,,212,328,338,338,938,,,939,,940,,,,839,735,736,35,,,293,,,35', +'562,35,404,,,,,,850,,,10,,744,,,,10,13,10,,960,212,212,212,212,13,,', +'12,289,962,,,,12,,12,,289,,,,,,,,,817,,,,,,,,,,,,,,,14,,,14,,755,757', +'758,,,,,,,,,792,,,,844,,,,,14,,,,,,,,,690,,850,,,587,856,,,,,,,,13,13', +'212,212,212,212,,813,,,212,212,212,212,212,,,,,820,,,,,,13,,,,14,,,882', +',,,,,,799,801,802,,892,,,,,14,14,,,289,848,849,,,851,,,,,,289,,,,,,', +'14,,,,212,212,,,,,,,,212,,13,,,,287,13,,,,,,,,875,,,,287,,880,881,,', +',,,,,,,,,,,,,14,,,,,14,212,212,,,,,,,,14,,,,,,,,,,212,,,,,,884,885,', +',887,889,,891,,212,,,,,,,,,,,,,934,14,,,,,935,907,908,910,912,26,913', +'14,,,26,825,,,,,,,,,,,,26,,,,26,26,26,,,,,,26,,,,,212,14,14,,,14,,,', +',,14,,,,,26,26,,,,,26,26,,,26,,945,947,948,949,,,,339,,,,955,957,958', +'959,,,,14,,,212,,,14,14,,,,,,287,,212,963,,964,,,26,287,,,26,26,26,26', +'26,,212,,,,,,,,,,,,,,,13,,,13,,,,,,212,,,,,,,,,,212,,,212,,,13,,,,,14', +',,,,,14,,14,,,,,,,,,,,,,,,,,,212,212,,,,212,,,,,,,26,26,26,26,26,26', +',,,13,26,26,26,26,26,,,,,,,,,,,26,,,13,13,,,287,,,,,,,,,,,287,,,,,,', +'13,,,,,,,,,,,,,,,,,,,,,,,,26,26,,,,,,,,26,,26,,,,,26,,,,,,212,,,,,13', +',,,,13,,,,,,,,,,13,,,,,,,,,,212,26,26,,,,,,,,,,,,,,,,,,26,,,,,,,,,13', +',,,,,26,,,,,,13,,,,823,,,,,,,,,,,,,,,,,,,,,,,,,,,,212,,13,13,,,13,,', +',,,13,,,,,,,,,26,,,,,,,,,,,,,,,867,,218,,,,251,251,251,,,13,,,,,,13', +'13,,,,303,304,305,,,,,,,,,,26,,,251,251,,,,,,,,26,,,,,,,,,,,,,,,,26', +',,,212,,,,,,,,,,,26,,,26,,,,,,26,13,,,,,,13,,13,26,,,26,,,26,,,,,,,', +',,,,,,,,,,,,,,,,,,,,,,,26,26,,,,26,,,,,,,,,,,,,,,,26,,,,,,,,,,,,,,,', +',,,26,26,,,,,,,381,251,389,251,,,,,406,,,,,,26,,,,,,,,218,,,420,421', +'422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438', +'439,440,441,442,443,444,445,,,,,,,,,251,26,251,,,,26,251,,,,26,,251', +'251,,,,,,,26,251,,,,,,,,,26,,,,,,,,,,,,,,,,,,,491,,,,,,,,,,26,,,,,,', +',,,,,26,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,26,,26,26,,,26,,,,,,26,,,,,,', +',,,,251,,,,,,,,,,,,,,,,,,,,,,,,26,,,,,,26,26,251,,406,579,389,,,,,,', +',,,,,,,,,,,,,,,,,,,,,,251,,251,,251,,,,,,,,,,26,,597,,,,,,,,,,,,251', +',,,,,,26,,,619,620,621,26,,26,,,251,,,,251,,,251,,,,,,,,,,,,,,251,251', +',,,,,,,,,251,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,697,,251,700,,,704,706,,', +',709,,,711,,,,,,,,,,,,,,,,,251,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,', +',,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,', +',,,,,251,,795,,,,,,,,,,,704,706,709,,797,,,,,,,,,,,,251,,,251,,,,,,', +',,,,,,,,,,,,,,,,,,,,,,,251,,,,,,,,,,,,,,,,,,251,,,,,,,,,,,,,,,,,795', +',,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,', +',,,,,251,,,251,,,251' ] + racc_goto_table = arr = ::Array.new(2494, nil) + idx = 0 + clist.each do |str| + str.split(',', -1).each do |i| + arr[idx] = i.to_i unless i.empty? + idx += 1 + end + end + +clist = [ +'50,50,3,46,19,27,62,62,46,61,61,4,85,20,59,5,21,29,29,29,49,14,64,64', +'89,91,14,43,21,27,54,54,83,46,46,46,82,82,115,17,47,58,8,155,17,15,53', +'53,121,11,11,14,25,114,46,44,109,25,25,50,126,25,45,35,111,46,46,46', +'46,17,117,122,14,19,34,34,34,60,60,33,33,60,89,14,151,23,23,13,13,9', +'17,13,108,39,155,93,40,117,84,84,8,110,31,31,31,46,25,25,25,25,94,119', +'145,46,145,145,111,150,65,95,65,152,141,14,56,56,63,141,36,63,96,14', +'48,48,65,97,13,13,13,13,98,17,99,100,33,33,117,36,36,17,101,102,111', +'103,104,56,56,56,59,59,105,150,106,119,107,55,112,37,1,26,16,111,12', +'109,120,123,109,124,125,10,5,62,127,128,108,129,9,126,130,132,24,121', +'133,134,9,29,50,117,46,46,85,20,135,136,139,140,25,25,25,25,115,151', +'115,142,122,21,14,14,110,19,143,144,146,46,15,15,15,152,47,147,148,149', +'15,20,17,17,126,77,6,45,78,14,79,81,70,69,117,67,45,66,109,119,109,150', +'115,86,115,88,57,17,92,,,,29,29,,,,114,,,62,29,62,,,36,,27,19,119,,46', +',,,46,46,20,21,33,33,43,,2,,,20,,46,14,145,109,109,21,14,44,,,83,,,', +',,,,,17,19,155,25,25,17,2,,,,,19,21,,24,24,,,,,115,109,25,109,39,,89', +'40,,39,91,31,40,13,13,64,33,25,21,31,109,35,89,115,8,35,,50,33,64,84', +',,45,5,62,,,56,27,62,,82,23,,,,,,,,56,,24,62,24,33,54,60,65,24,,65,', +'33,61,,,,50,,29,,53,,,11,,,,,61,117,,,,,,,,,41,,,27,,62,,,62,,,,34,', +',,,34,,,,,,,61,59,,62,,,,82,,22,25,,,,22,62,43,29,50,,,,59,46,,43,,', +'58,3,50,,46,,,,2,2,25,22,22,22,,62,,41,,,41,34,,62,34,,,,46,29,50,46', +'22,2,,,50,24,,29,,,,22,22,22,14,25,,14,89,89,,46,,,85,,65,,20,65,,,17', +',50,17,,89,89,14,,,,,,13,,,82,,113,22,27,56,,,,17,,22,,2,56,,54,4,2', +'64,,64,24,64,24,46,24,,15,15,,62,53,15,62,11,27,,24,,,43,,14,46,46,', +',46,58,,,43,58,,,,,,46,,17,14,14,,3,46,,24,41,3,,24,,,24,,49,,,17,17', +',,14,,,,,24,,,27,,,,22,22,,,,27,17,,,,,,,25,,,,,,,50,46,19,,41,22,46', +',64,61,41,59,41,,59,,46,24,41,14,89,,56,13,14,,89,,,,,,,56,14,,,17,', +'41,,,17,,,,24,,,,15,,17,,,46,,,,3,113,,,113,,22,,46,,22,22,46,,14,,', +',33,,,41,,22,,,14,,,,14,,17,,,,,25,,,,,46,46,17,113,46,,113,,,,46,,', +',,,,,14,14,,,14,2,89,13,2,,14,,,,,,46,,17,17,,,17,,,41,18,46,17,21,', +'18,61,46,46,,,,24,,,,56,,18,14,41,,18,18,18,14,14,,,,18,18,18,3,62,', +',17,,,,,113,17,17,113,,113,29,50,,18,18,,,,2,18,18,,,18,18,18,18,113', +',,113,,113,,,,24,2,2,46,,,56,,,46,27,46,50,,,,,,24,,,14,,2,,,,14,18', +'14,,113,18,18,18,18,18,,,17,22,113,,,,17,,17,,22,,,,,,,,,41,,,,,,,,', +',,,,,,22,,,22,,116,116,116,,,,,,,,,2,,,,41,,,,,22,,,,,,,,,22,,24,,,24', +'41,,,,,,,,18,18,18,18,18,18,,2,,,18,18,18,18,18,,,,,2,,,,,,18,,,,22', +',,41,,,,,,,116,116,116,,41,,,,,22,22,,,22,2,2,,,2,,,,,,22,,,,,,,22,', +',,18,18,,,,,,,,18,,18,,,,18,18,,,,,,,,2,,,,18,,2,2,,,,,,,,,,,,,,,,22', +',,,,22,18,18,,,,,,,,22,,,,,,,,,,18,,,,,,116,116,,,116,116,,116,,18,', +',,,,,,,,,,,2,22,,,,,2,116,116,116,116,38,116,22,,,38,22,,,,,,,,,,,,38', +',,,38,38,38,,,,,,38,,,,,18,22,22,,,22,,,,,,22,,,,,38,38,,,,,38,38,,', +'38,,116,116,116,116,,,,22,,,,116,116,116,116,,,,22,,,18,,,22,22,,,,', +',18,,18,116,,116,,,38,18,,,38,38,38,38,38,,18,,,,,,,,,,,,,,,18,,,18', +',,,,,18,,,,,,,,,,18,,,18,,,18,,,,,22,,,,,,22,,22,,,,,,,,,,,,,,,,,,18', +'18,,,,18,,,,,,,38,38,38,38,38,38,,,,18,38,38,38,38,38,,,,,,,,,,,38,', +',18,18,,,18,,,,,,,,,,,18,,,,,,,18,,,,,,,,,,,,,,,,,,,,,,,,38,38,,,,,', +',,38,,38,,,,,38,,,,,,18,,,,,18,,,,,18,,,,,,,,,,18,,,,,,,,,,18,38,38', +',,,,,,,,,,,,,,,,,38,,,,,,,,,18,,,,,,38,,,,,,18,,,,18,,,,,,,,,,,,,,,', +',,,,,,,,,,,,18,,18,18,,,18,,,,,,18,,,,,,,,,38,,,,,,,,,,,,,,,18,,28,', +',,28,28,28,,,18,,,,,,18,18,,,,28,28,28,,,,,,,,,,38,,,28,28,,,,,,,,38', +',,,,,,,,,,,,,,,38,,,,18,,,,,,,,,,,38,,,38,,,,,,38,18,,,,,,18,,18,38', +',,38,,,38,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,38,38,,,,38,,,,,,,,,,,,,,,,38', +',,,,,,,,,,,,,,,,,,38,38,,,,,,,28,28,28,28,,,,,28,,,,,,38,,,,,,,,28,', +',28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28', +'28,28,28,,,,,,,,,28,38,28,,,,38,28,,,,38,,28,28,,,,,,,38,28,,,,,,,,', +'38,,,,,,,,,,,,,,,,,,,28,,,,,,,,,,38,,,,,,,,,,,,38,,,,,,,,,,,,,,,,,,', +',,,,,,,,,,,,,38,,38,38,,,38,,,,,,38,,,,,,,,,,,28,,,,,,,,,,,,,,,,,,,', +',,,,38,,,,,,38,38,28,,28,28,28,,,,,,,,,,,,,,,,,,,,,,,,,,,,,28,,28,,28', +',,,,,,,,,38,,28,,,,,,,,,,,,28,,,,,,,38,,,28,28,28,38,,38,,,28,,,,28', +',,28,,,,,,,,,,,,,,28,28,,,,,,,,,,28,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,28', +',28,28,,,28,28,,,,28,,,28,,,,,,,,,,,,,,,,,28,,,,,,,,,,,,,,,,,,,,,,,', +',,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,', +',,,,,,,,,,,,,,,,,,,28,,28,,,,,,,,,,,28,28,28,,28,,,,,,,,,,,,28,,,28', +',,,,,,,,,,,,,,,,,,,,,,,,,,,,,28,,,,,,,,,,,,,,,,,,28,,,,,,,,,,,,,,,,', +'28,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,', +',,,,,,,,28,,,28,,,28' ] + racc_goto_check = arr = ::Array.new(2494, nil) + idx = 0 + clist.each do |str| + str.split(',', -1).each do |i| + arr[idx] = i.to_i unless i.empty? + idx += 1 + end + end + +racc_goto_pointer = [ + nil, 168, 295, -49, -296, -478, -385, nil, 39, 84, + 176, 43, 165, 30, 21, 27, 108, 39, 823, -196, + -377, 3, 463, -112, 136, 0, 57, -12, 1617, -5, + nil, 80, nil, -122, 48, -205, -318, -292, 1203, 63, + 66, 221, nil, -4, 23, -235, 3, -296, 69, -45, + -6, nil, nil, 40, 24, -211, 93, 205, -12, -39, + -234, -44, -20, -329, -231, -330, -215, -23, nil, -219, + -358, nil, nil, nil, nil, nil, nil, 172, 186, 187, + nil, -75, -284, -624, -413, -313, 193, nil, -83, 21, + nil, -508, 195, -259, -199, 63, 71, -524, 80, -520, + -377, -702, -376, -526, -189, -193, -372, -627, -749, -591, + -546, -779, -416, -18, -529, -544, 340, -436, nil, -471, + -549, -675, -652, -331, -455, -140, -446, 162, -567, -566, + -60, nil, -84, -82, -658, -292, -424, nil, nil, 131, + 130, 44, 134, 140, -140, -246, 141, -312, -312, -523, + -637, -672, -679, nil, nil, -407 ] + +racc_goto_default = [ + nil, nil, 307, nil, nil, 773, nil, 3, nil, 4, + 326, nil, nil, nil, 216, 16, 11, 217, 302, nil, + nil, 525, 215, nil, 257, 15, nil, 412, 19, 20, + 21, 391, 25, 616, nil, nil, nil, nil, 292, 29, + nil, nil, 31, 34, 33, nil, 213, 337, nil, 119, + 397, 118, 121, 71, 72, nil, 42, nil, 624, 253, + nil, 254, 402, 567, nil, 255, nil, nil, 270, nil, + nil, 43, 44, 45, 46, 47, 48, 49, nil, 271, + 55, nil, nil, nil, nil, nil, nil, 63, nil, 508, + 64, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 765, 646, + nil, 766, nil, 635, nil, 637, nil, 833, 581, nil, + nil, nil, 643, nil, nil, nil, 683, nil, nil, nil, + nil, 401, nil, nil, nil, nil, nil, 70, 73, 74, + nil, nil, nil, nil, nil, 544, nil, nil, nil, 636, + 648, 649, 725, 652, 655, 262 ] + +racc_reduce_table = [ + 0, 0, :racc_error, + 1, 139, :_reduce_none, + 4, 141, :_reduce_2, + 2, 140, :_reduce_3, + 0, 145, :_reduce_4, + 1, 145, :_reduce_5, + 3, 145, :_reduce_6, + 2, 145, :_reduce_7, + 0, 164, :_reduce_8, + 4, 147, :_reduce_9, + 3, 147, :_reduce_10, + 3, 147, :_reduce_11, + 3, 147, :_reduce_12, + 2, 147, :_reduce_13, + 3, 147, :_reduce_14, + 3, 147, :_reduce_15, + 3, 147, :_reduce_16, + 3, 147, :_reduce_17, + 3, 147, :_reduce_18, + 4, 147, :_reduce_19, + 4, 147, :_reduce_20, + 3, 147, :_reduce_21, + 3, 147, :_reduce_22, + 3, 147, :_reduce_23, + 6, 147, :_reduce_24, + 5, 147, :_reduce_25, + 5, 147, :_reduce_26, + 5, 147, :_reduce_27, + 3, 147, :_reduce_28, + 3, 147, :_reduce_29, + 3, 147, :_reduce_30, + 3, 147, :_reduce_31, + 1, 147, :_reduce_none, + 1, 163, :_reduce_none, + 3, 163, :_reduce_34, + 3, 163, :_reduce_35, + 3, 163, :_reduce_36, + 2, 163, :_reduce_37, + 1, 163, :_reduce_none, + 1, 151, :_reduce_none, + 1, 153, :_reduce_none, + 1, 153, :_reduce_none, + 2, 153, :_reduce_42, + 2, 153, :_reduce_43, + 2, 153, :_reduce_44, + 1, 168, :_reduce_none, + 4, 168, :_reduce_46, + 4, 168, :_reduce_47, + 0, 175, :_reduce_48, + 5, 173, :_reduce_49, + 2, 167, :_reduce_50, + 3, 167, :_reduce_51, + 4, 167, :_reduce_52, + 5, 167, :_reduce_53, + 4, 167, :_reduce_54, + 5, 167, :_reduce_55, + 2, 167, :_reduce_56, + 2, 167, :_reduce_57, + 1, 154, :_reduce_58, + 3, 154, :_reduce_59, + 1, 178, :_reduce_60, + 3, 178, :_reduce_61, + 1, 177, :_reduce_none, + 2, 177, :_reduce_63, + 3, 177, :_reduce_64, + 5, 177, :_reduce_65, + 2, 177, :_reduce_66, + 4, 177, :_reduce_67, + 2, 177, :_reduce_68, + 4, 177, :_reduce_69, + 1, 177, :_reduce_70, + 3, 177, :_reduce_71, + 1, 181, :_reduce_none, + 3, 181, :_reduce_73, + 2, 180, :_reduce_74, + 3, 180, :_reduce_75, + 1, 183, :_reduce_76, + 3, 183, :_reduce_77, + 1, 182, :_reduce_78, + 4, 182, :_reduce_79, + 3, 182, :_reduce_80, + 3, 182, :_reduce_81, + 3, 182, :_reduce_82, + 3, 182, :_reduce_83, + 2, 182, :_reduce_84, + 1, 182, :_reduce_85, + 1, 152, :_reduce_86, + 4, 152, :_reduce_87, + 3, 152, :_reduce_88, + 3, 152, :_reduce_89, + 3, 152, :_reduce_90, + 3, 152, :_reduce_91, + 2, 152, :_reduce_92, + 1, 152, :_reduce_93, + 1, 185, :_reduce_94, + 1, 185, :_reduce_none, + 2, 186, :_reduce_96, + 1, 186, :_reduce_97, + 3, 186, :_reduce_98, + 1, 187, :_reduce_none, + 1, 187, :_reduce_none, + 1, 187, :_reduce_none, + 1, 187, :_reduce_none, + 1, 187, :_reduce_none, + 1, 190, :_reduce_104, + 1, 190, :_reduce_none, + 1, 149, :_reduce_none, + 1, 149, :_reduce_none, + 1, 150, :_reduce_108, + 0, 193, :_reduce_109, + 4, 150, :_reduce_110, + 1, 188, :_reduce_none, + 1, 188, :_reduce_none, + 1, 188, :_reduce_none, + 1, 188, :_reduce_none, + 1, 188, :_reduce_none, + 1, 188, :_reduce_none, + 1, 188, :_reduce_none, + 1, 188, :_reduce_none, + 1, 188, :_reduce_none, + 1, 188, :_reduce_none, + 1, 188, :_reduce_none, + 1, 188, :_reduce_none, + 1, 188, :_reduce_none, + 1, 188, :_reduce_none, + 1, 188, :_reduce_none, + 1, 188, :_reduce_none, + 1, 188, :_reduce_none, + 1, 188, :_reduce_none, + 1, 188, :_reduce_none, + 1, 188, :_reduce_none, + 1, 188, :_reduce_none, + 1, 188, :_reduce_none, + 1, 188, :_reduce_none, + 1, 188, :_reduce_none, + 1, 188, :_reduce_none, + 1, 188, :_reduce_none, + 1, 188, :_reduce_none, + 1, 188, :_reduce_none, + 1, 188, :_reduce_none, + 1, 189, :_reduce_none, + 1, 189, :_reduce_none, + 1, 189, :_reduce_none, + 1, 189, :_reduce_none, + 1, 189, :_reduce_none, + 1, 189, :_reduce_none, + 1, 189, :_reduce_none, + 1, 189, :_reduce_none, + 1, 189, :_reduce_none, + 1, 189, :_reduce_none, + 1, 189, :_reduce_none, + 1, 189, :_reduce_none, + 1, 189, :_reduce_none, + 1, 189, :_reduce_none, + 1, 189, :_reduce_none, + 1, 189, :_reduce_none, + 1, 189, :_reduce_none, + 1, 189, :_reduce_none, + 1, 189, :_reduce_none, + 1, 189, :_reduce_none, + 1, 189, :_reduce_none, + 1, 189, :_reduce_none, + 1, 189, :_reduce_none, + 1, 189, :_reduce_none, + 1, 189, :_reduce_none, + 1, 189, :_reduce_none, + 1, 189, :_reduce_none, + 1, 189, :_reduce_none, + 1, 189, :_reduce_none, + 1, 189, :_reduce_none, + 1, 189, :_reduce_none, + 1, 189, :_reduce_none, + 1, 189, :_reduce_none, + 1, 189, :_reduce_none, + 1, 189, :_reduce_none, + 1, 189, :_reduce_none, + 1, 189, :_reduce_none, + 1, 189, :_reduce_none, + 1, 189, :_reduce_none, + 1, 189, :_reduce_none, + 1, 189, :_reduce_none, + 3, 166, :_reduce_181, + 5, 166, :_reduce_182, + 3, 166, :_reduce_183, + 5, 166, :_reduce_184, + 6, 166, :_reduce_185, + 5, 166, :_reduce_186, + 5, 166, :_reduce_187, + 5, 166, :_reduce_188, + 5, 166, :_reduce_189, + 4, 166, :_reduce_190, + 3, 166, :_reduce_191, + 3, 166, :_reduce_192, + 3, 166, :_reduce_193, + 3, 166, :_reduce_194, + 3, 166, :_reduce_195, + 3, 166, :_reduce_196, + 3, 166, :_reduce_197, + 3, 166, :_reduce_198, + 3, 166, :_reduce_199, + 4, 166, :_reduce_200, + 4, 166, :_reduce_201, + 2, 166, :_reduce_202, + 2, 166, :_reduce_203, + 3, 166, :_reduce_204, + 3, 166, :_reduce_205, + 3, 166, :_reduce_206, + 3, 166, :_reduce_207, + 3, 166, :_reduce_208, + 3, 166, :_reduce_209, + 3, 166, :_reduce_210, + 3, 166, :_reduce_211, + 3, 166, :_reduce_212, + 3, 166, :_reduce_213, + 3, 166, :_reduce_214, + 3, 166, :_reduce_215, + 3, 166, :_reduce_216, + 2, 166, :_reduce_217, + 2, 166, :_reduce_218, + 3, 166, :_reduce_219, + 3, 166, :_reduce_220, + 3, 166, :_reduce_221, + 3, 166, :_reduce_222, + 3, 166, :_reduce_223, + 6, 166, :_reduce_224, + 1, 166, :_reduce_none, + 1, 162, :_reduce_none, + 1, 195, :_reduce_none, + 2, 195, :_reduce_none, + 4, 195, :_reduce_229, + 2, 195, :_reduce_230, + 3, 200, :_reduce_231, + 0, 201, :_reduce_232, + 1, 201, :_reduce_none, + 0, 157, :_reduce_234, + 1, 157, :_reduce_none, + 1, 169, :_reduce_236, + 2, 169, :_reduce_237, + 2, 169, :_reduce_238, + 4, 169, :_reduce_239, + 6, 169, :_reduce_240, + 1, 169, :_reduce_241, + 4, 204, :_reduce_242, + 3, 204, :_reduce_243, + 2, 204, :_reduce_244, + 4, 204, :_reduce_245, + 6, 204, :_reduce_246, + 1, 204, :_reduce_247, + 0, 206, :_reduce_248, + 2, 172, :_reduce_249, + 1, 205, :_reduce_250, + 0, 207, :_reduce_251, + 3, 205, :_reduce_252, + 0, 208, :_reduce_253, + 4, 205, :_reduce_254, + 2, 203, :_reduce_255, + 2, 202, :_reduce_256, + 1, 202, :_reduce_257, + 0, 202, :_reduce_258, + 1, 197, :_reduce_259, + 2, 197, :_reduce_260, + 3, 197, :_reduce_261, + 4, 197, :_reduce_262, + 3, 161, :_reduce_263, + 4, 161, :_reduce_264, + 2, 161, :_reduce_265, + 1, 194, :_reduce_none, + 1, 194, :_reduce_none, + 1, 194, :_reduce_none, + 1, 194, :_reduce_none, + 1, 194, :_reduce_none, + 1, 194, :_reduce_none, + 1, 194, :_reduce_none, + 1, 194, :_reduce_none, + 1, 194, :_reduce_274, + 3, 194, :_reduce_275, + 0, 232, :_reduce_276, + 4, 194, :_reduce_277, + 3, 194, :_reduce_278, + 3, 194, :_reduce_279, + 2, 194, :_reduce_280, + 3, 194, :_reduce_281, + 3, 194, :_reduce_282, + 1, 194, :_reduce_283, + 4, 194, :_reduce_284, + 3, 194, :_reduce_285, + 1, 194, :_reduce_286, + 5, 194, :_reduce_287, + 4, 194, :_reduce_288, + 3, 194, :_reduce_289, + 2, 194, :_reduce_290, + 1, 194, :_reduce_none, + 2, 194, :_reduce_292, + 0, 233, :_reduce_293, + 3, 194, :_reduce_294, + 6, 194, :_reduce_295, + 6, 194, :_reduce_296, + 0, 234, :_reduce_297, + 0, 235, :_reduce_298, + 7, 194, :_reduce_299, + 0, 236, :_reduce_300, + 0, 237, :_reduce_301, + 7, 194, :_reduce_302, + 5, 194, :_reduce_303, + 4, 194, :_reduce_304, + 0, 238, :_reduce_305, + 0, 239, :_reduce_306, + 9, 194, :_reduce_307, + 0, 240, :_reduce_308, + 6, 194, :_reduce_309, + 0, 241, :_reduce_310, + 7, 194, :_reduce_311, + 0, 242, :_reduce_312, + 5, 194, :_reduce_313, + 0, 243, :_reduce_314, + 6, 194, :_reduce_315, + 0, 244, :_reduce_316, + 0, 245, :_reduce_317, + 9, 194, :_reduce_318, + 1, 194, :_reduce_319, + 1, 194, :_reduce_320, + 1, 194, :_reduce_321, + 1, 194, :_reduce_322, + 1, 156, :_reduce_none, + 1, 225, :_reduce_324, + 1, 228, :_reduce_325, + 1, 220, :_reduce_none, + 1, 220, :_reduce_none, + 2, 220, :_reduce_328, + 1, 222, :_reduce_none, + 1, 222, :_reduce_none, + 1, 221, :_reduce_none, + 5, 221, :_reduce_332, + 1, 143, :_reduce_none, + 2, 143, :_reduce_334, + 1, 224, :_reduce_none, + 1, 224, :_reduce_none, + 1, 246, :_reduce_none, + 3, 246, :_reduce_338, + 1, 249, :_reduce_339, + 3, 249, :_reduce_340, + 1, 248, :_reduce_none, + 4, 248, :_reduce_342, + 6, 248, :_reduce_343, + 3, 248, :_reduce_344, + 5, 248, :_reduce_345, + 2, 248, :_reduce_346, + 4, 248, :_reduce_347, + 1, 248, :_reduce_348, + 3, 248, :_reduce_349, + 6, 250, :_reduce_350, + 8, 250, :_reduce_351, + 4, 250, :_reduce_352, + 6, 250, :_reduce_353, + 4, 250, :_reduce_354, + 2, 250, :_reduce_none, + 6, 250, :_reduce_356, + 2, 250, :_reduce_357, + 4, 250, :_reduce_358, + 6, 250, :_reduce_359, + 2, 250, :_reduce_360, + 4, 250, :_reduce_361, + 2, 250, :_reduce_362, + 4, 250, :_reduce_363, + 1, 250, :_reduce_364, + 0, 174, :_reduce_365, + 1, 174, :_reduce_366, + 3, 256, :_reduce_367, + 1, 256, :_reduce_368, + 4, 256, :_reduce_369, + 0, 257, :_reduce_370, + 2, 257, :_reduce_371, + 1, 258, :_reduce_372, + 3, 258, :_reduce_373, + 1, 259, :_reduce_374, + 1, 259, :_reduce_none, + 0, 263, :_reduce_376, + 3, 219, :_reduce_377, + 4, 261, :_reduce_378, + 2, 261, :_reduce_379, + 0, 266, :_reduce_380, + 4, 262, :_reduce_381, + 0, 267, :_reduce_382, + 4, 262, :_reduce_383, + 0, 268, :_reduce_384, + 5, 265, :_reduce_385, + 2, 170, :_reduce_386, + 4, 170, :_reduce_387, + 4, 170, :_reduce_388, + 2, 218, :_reduce_389, + 4, 218, :_reduce_390, + 4, 218, :_reduce_391, + 3, 218, :_reduce_392, + 3, 218, :_reduce_393, + 3, 218, :_reduce_394, + 2, 218, :_reduce_395, + 1, 218, :_reduce_396, + 4, 218, :_reduce_397, + 0, 270, :_reduce_398, + 5, 217, :_reduce_399, + 0, 271, :_reduce_400, + 5, 217, :_reduce_401, + 5, 223, :_reduce_402, + 1, 272, :_reduce_403, + 1, 272, :_reduce_none, + 6, 142, :_reduce_405, + 0, 142, :_reduce_406, + 1, 273, :_reduce_407, + 1, 273, :_reduce_none, + 1, 273, :_reduce_none, + 2, 274, :_reduce_410, + 1, 274, :_reduce_none, + 2, 144, :_reduce_412, + 1, 144, :_reduce_none, + 1, 209, :_reduce_none, + 1, 209, :_reduce_none, + 1, 209, :_reduce_none, + 1, 210, :_reduce_417, + 1, 276, :_reduce_418, + 2, 276, :_reduce_419, + 3, 277, :_reduce_420, + 1, 277, :_reduce_421, + 1, 277, :_reduce_422, + 3, 211, :_reduce_423, + 4, 212, :_reduce_424, + 3, 213, :_reduce_425, + 0, 281, :_reduce_426, + 3, 281, :_reduce_427, + 1, 282, :_reduce_428, + 2, 282, :_reduce_429, + 3, 214, :_reduce_430, + 0, 284, :_reduce_431, + 3, 284, :_reduce_432, + 0, 278, :_reduce_433, + 2, 278, :_reduce_434, + 0, 279, :_reduce_435, + 2, 279, :_reduce_436, + 0, 280, :_reduce_437, + 2, 280, :_reduce_438, + 1, 283, :_reduce_439, + 2, 283, :_reduce_440, + 0, 286, :_reduce_441, + 4, 283, :_reduce_442, + 1, 285, :_reduce_443, + 1, 285, :_reduce_444, + 1, 285, :_reduce_445, + 1, 285, :_reduce_none, + 1, 191, :_reduce_447, + 3, 192, :_reduce_448, + 1, 275, :_reduce_449, + 1, 275, :_reduce_450, + 2, 275, :_reduce_451, + 2, 275, :_reduce_452, + 1, 184, :_reduce_453, + 1, 184, :_reduce_454, + 1, 184, :_reduce_455, + 1, 184, :_reduce_456, + 1, 184, :_reduce_457, + 1, 184, :_reduce_458, + 1, 184, :_reduce_459, + 1, 184, :_reduce_460, + 1, 184, :_reduce_461, + 1, 184, :_reduce_462, + 1, 184, :_reduce_463, + 1, 184, :_reduce_464, + 1, 215, :_reduce_465, + 1, 155, :_reduce_466, + 1, 160, :_reduce_467, + 1, 160, :_reduce_468, + 1, 226, :_reduce_469, + 3, 226, :_reduce_470, + 2, 226, :_reduce_471, + 3, 229, :_reduce_472, + 2, 229, :_reduce_473, + 6, 264, :_reduce_474, + 8, 264, :_reduce_475, + 4, 264, :_reduce_476, + 6, 264, :_reduce_477, + 4, 264, :_reduce_478, + 6, 264, :_reduce_479, + 2, 264, :_reduce_480, + 4, 264, :_reduce_481, + 6, 264, :_reduce_482, + 2, 264, :_reduce_483, + 4, 264, :_reduce_484, + 2, 264, :_reduce_485, + 4, 264, :_reduce_486, + 1, 264, :_reduce_487, + 0, 264, :_reduce_488, + 1, 260, :_reduce_489, + 1, 260, :_reduce_490, + 1, 260, :_reduce_491, + 1, 260, :_reduce_492, + 1, 247, :_reduce_none, + 1, 247, :_reduce_494, + 3, 247, :_reduce_495, + 2, 247, :_reduce_496, + 1, 288, :_reduce_none, + 3, 288, :_reduce_498, + 1, 251, :_reduce_499, + 3, 251, :_reduce_500, + 3, 289, :_reduce_501, + 3, 290, :_reduce_502, + 1, 252, :_reduce_503, + 3, 252, :_reduce_504, + 1, 287, :_reduce_505, + 3, 287, :_reduce_506, + 1, 291, :_reduce_none, + 1, 291, :_reduce_none, + 2, 253, :_reduce_509, + 1, 253, :_reduce_510, + 1, 292, :_reduce_none, + 1, 292, :_reduce_none, + 2, 255, :_reduce_513, + 2, 254, :_reduce_514, + 0, 254, :_reduce_515, + 1, 230, :_reduce_none, + 3, 230, :_reduce_517, + 0, 216, :_reduce_518, + 2, 216, :_reduce_none, + 1, 199, :_reduce_520, + 3, 199, :_reduce_521, + 3, 293, :_reduce_522, + 2, 293, :_reduce_523, + 1, 176, :_reduce_none, + 1, 176, :_reduce_none, + 1, 176, :_reduce_none, + 1, 171, :_reduce_none, + 1, 171, :_reduce_none, + 1, 171, :_reduce_none, + 1, 171, :_reduce_none, + 1, 269, :_reduce_none, + 1, 269, :_reduce_none, + 1, 269, :_reduce_none, + 1, 231, :_reduce_none, + 1, 231, :_reduce_none, + 1, 159, :_reduce_536, + 1, 159, :_reduce_537, + 0, 146, :_reduce_none, + 1, 146, :_reduce_none, + 0, 165, :_reduce_none, + 1, 165, :_reduce_none, + 2, 179, :_reduce_542, + 2, 158, :_reduce_543, + 0, 198, :_reduce_none, + 1, 198, :_reduce_none, + 1, 198, :_reduce_none, + 1, 227, :_reduce_547, + 1, 227, :_reduce_none, + 1, 148, :_reduce_none, + 2, 148, :_reduce_none, + 0, 196, :_reduce_551 ] + +racc_reduce_n = 552 + +racc_shift_n = 965 + +racc_token_table = { + false => 0, + :error => 1, + :kCLASS => 2, + :kMODULE => 3, + :kDEF => 4, + :kUNDEF => 5, + :kBEGIN => 6, + :kRESCUE => 7, + :kENSURE => 8, + :kEND => 9, + :kIF => 10, + :kUNLESS => 11, + :kTHEN => 12, + :kELSIF => 13, + :kELSE => 14, + :kCASE => 15, + :kWHEN => 16, + :kWHILE => 17, + :kUNTIL => 18, + :kFOR => 19, + :kBREAK => 20, + :kNEXT => 21, + :kREDO => 22, + :kRETRY => 23, + :kIN => 24, + :kDO => 25, + :kDO_COND => 26, + :kDO_BLOCK => 27, + :kDO_LAMBDA => 28, + :kRETURN => 29, + :kYIELD => 30, + :kSUPER => 31, + :kSELF => 32, + :kNIL => 33, + :kTRUE => 34, + :kFALSE => 35, + :kAND => 36, + :kOR => 37, + :kNOT => 38, + :kIF_MOD => 39, + :kUNLESS_MOD => 40, + :kWHILE_MOD => 41, + :kUNTIL_MOD => 42, + :kRESCUE_MOD => 43, + :kALIAS => 44, + :kDEFINED => 45, + :klBEGIN => 46, + :klEND => 47, + :k__LINE__ => 48, + :k__FILE__ => 49, + :k__ENCODING__ => 50, + :tIDENTIFIER => 51, + :tFID => 52, + :tGVAR => 53, + :tIVAR => 54, + :tCONSTANT => 55, + :tLABEL => 56, + :tCVAR => 57, + :tNTH_REF => 58, + :tBACK_REF => 59, + :tSTRING_CONTENT => 60, + :tINTEGER => 61, + :tFLOAT => 62, + :tUPLUS => 63, + :tUMINUS => 64, + :tUNARY_NUM => 65, + :tPOW => 66, + :tCMP => 67, + :tEQ => 68, + :tEQQ => 69, + :tNEQ => 70, + :tGEQ => 71, + :tLEQ => 72, + :tANDOP => 73, + :tOROP => 74, + :tMATCH => 75, + :tNMATCH => 76, + :tDOT => 77, + :tDOT2 => 78, + :tDOT3 => 79, + :tAREF => 80, + :tASET => 81, + :tLSHFT => 82, + :tRSHFT => 83, + :tCOLON2 => 84, + :tCOLON3 => 85, + :tOP_ASGN => 86, + :tASSOC => 87, + :tLPAREN => 88, + :tLPAREN2 => 89, + :tRPAREN => 90, + :tLPAREN_ARG => 91, + :tLBRACK => 92, + :tLBRACK2 => 93, + :tRBRACK => 94, + :tLBRACE => 95, + :tLBRACE_ARG => 96, + :tSTAR => 97, + :tSTAR2 => 98, + :tAMPER => 99, + :tAMPER2 => 100, + :tTILDE => 101, + :tPERCENT => 102, + :tDIVIDE => 103, + :tPLUS => 104, + :tMINUS => 105, + :tLT => 106, + :tGT => 107, + :tPIPE => 108, + :tBANG => 109, + :tCARET => 110, + :tLCURLY => 111, + :tRCURLY => 112, + :tBACK_REF2 => 113, + :tSYMBEG => 114, + :tSTRING_BEG => 115, + :tXSTRING_BEG => 116, + :tREGEXP_BEG => 117, + :tREGEXP_OPT => 118, + :tWORDS_BEG => 119, + :tQWORDS_BEG => 120, + :tSTRING_DBEG => 121, + :tSTRING_DVAR => 122, + :tSTRING_END => 123, + :tSTRING => 124, + :tSYMBOL => 125, + :tNL => 126, + :tEH => 127, + :tCOLON => 128, + :tCOMMA => 129, + :tSPACE => 130, + :tSEMI => 131, + :tLAMBDA => 132, + :tLAMBEG => 133, + :tCHARACTER => 134, + :tANDDOT => 135, + :tEQL => 136, + :tLOWEST => 137 } + +racc_nt_base = 138 + +racc_use_result_var = true + +Racc_arg = [ + racc_action_table, + racc_action_check, + racc_action_default, + racc_action_pointer, + racc_goto_table, + racc_goto_check, + racc_goto_default, + racc_goto_pointer, + racc_nt_base, + racc_reduce_table, + racc_token_table, + racc_shift_n, + racc_reduce_n, + racc_use_result_var ] + +Racc_token_to_s_table = [ + "$end", + "error", + "kCLASS", + "kMODULE", + "kDEF", + "kUNDEF", + "kBEGIN", + "kRESCUE", + "kENSURE", + "kEND", + "kIF", + "kUNLESS", + "kTHEN", + "kELSIF", + "kELSE", + "kCASE", + "kWHEN", + "kWHILE", + "kUNTIL", + "kFOR", + "kBREAK", + "kNEXT", + "kREDO", + "kRETRY", + "kIN", + "kDO", + "kDO_COND", + "kDO_BLOCK", + "kDO_LAMBDA", + "kRETURN", + "kYIELD", + "kSUPER", + "kSELF", + "kNIL", + "kTRUE", + "kFALSE", + "kAND", + "kOR", + "kNOT", + "kIF_MOD", + "kUNLESS_MOD", + "kWHILE_MOD", + "kUNTIL_MOD", + "kRESCUE_MOD", + "kALIAS", + "kDEFINED", + "klBEGIN", + "klEND", + "k__LINE__", + "k__FILE__", + "k__ENCODING__", + "tIDENTIFIER", + "tFID", + "tGVAR", + "tIVAR", + "tCONSTANT", + "tLABEL", + "tCVAR", + "tNTH_REF", + "tBACK_REF", + "tSTRING_CONTENT", + "tINTEGER", + "tFLOAT", + "tUPLUS", + "tUMINUS", + "tUNARY_NUM", + "tPOW", + "tCMP", + "tEQ", + "tEQQ", + "tNEQ", + "tGEQ", + "tLEQ", + "tANDOP", + "tOROP", + "tMATCH", + "tNMATCH", + "tDOT", + "tDOT2", + "tDOT3", + "tAREF", + "tASET", + "tLSHFT", + "tRSHFT", + "tCOLON2", + "tCOLON3", + "tOP_ASGN", + "tASSOC", + "tLPAREN", + "tLPAREN2", + "tRPAREN", + "tLPAREN_ARG", + "tLBRACK", + "tLBRACK2", + "tRBRACK", + "tLBRACE", + "tLBRACE_ARG", + "tSTAR", + "tSTAR2", + "tAMPER", + "tAMPER2", + "tTILDE", + "tPERCENT", + "tDIVIDE", + "tPLUS", + "tMINUS", + "tLT", + "tGT", + "tPIPE", + "tBANG", + "tCARET", + "tLCURLY", + "tRCURLY", + "tBACK_REF2", + "tSYMBEG", + "tSTRING_BEG", + "tXSTRING_BEG", + "tREGEXP_BEG", + "tREGEXP_OPT", + "tWORDS_BEG", + "tQWORDS_BEG", + "tSTRING_DBEG", + "tSTRING_DVAR", + "tSTRING_END", + "tSTRING", + "tSYMBOL", + "tNL", + "tEH", + "tCOLON", + "tCOMMA", + "tSPACE", + "tSEMI", + "tLAMBDA", + "tLAMBEG", + "tCHARACTER", + "tANDDOT", + "tEQL", + "tLOWEST", + "$start", + "program", + "compstmt", + "bodystmt", + "opt_rescue", + "opt_else", + "opt_ensure", + "stmts", + "opt_terms", + "stmt", + "terms", + "fitem", + "undef_list", + "expr_value", + "lhs", + "command_call", + "mlhs", + "var_lhs", + "primary_value", + "opt_call_args", + "rbracket", + "call_op", + "backref", + "mrhs", + "arg_value", + "expr", + "@1", + "opt_nl", + "arg", + "command", + "block_command", + "call_args", + "block_call", + "operation2", + "command_args", + "cmd_brace_block", + "opt_block_param", + "@2", + "operation", + "mlhs_basic", + "mlhs_inner", + "rparen", + "mlhs_head", + "mlhs_item", + "mlhs_node", + "mlhs_post", + "variable", + "cname", + "cpath", + "fname", + "op", + "reswords", + "fsym", + "symbol", + "dsym", + "@3", + "primary", + "aref_args", + "none", + "args", + "trailer", + "assocs", + "paren_args", + "opt_paren_args", + "opt_block_arg", + "block_arg", + "call_args2", + "open_args", + "@4", + "@5", + "@6", + "literal", + "strings", + "xstring", + "regexp", + "words", + "qwords", + "var_ref", + "assoc_list", + "brace_block", + "method_call", + "lambda", + "then", + "if_tail", + "do", + "case_body", + "for_var", + "k_class", + "superclass", + "term", + "k_module", + "f_arglist", + "singleton", + "dot_or_colon", + "@7", + "@8", + "@9", + "@10", + "@11", + "@12", + "@13", + "@14", + "@15", + "@16", + "@17", + "@18", + "@19", + "@20", + "f_marg", + "f_norm_arg", + "f_margs", + "f_marg_list", + "block_param", + "f_arg", + "f_block_optarg", + "f_rest_arg", + "opt_f_block_arg", + "f_block_arg", + "block_param_def", + "opt_bv_decl", + "bv_decls", + "bvar", + "f_bad_arg", + "f_larglist", + "lambda_body", + "@21", + "f_args", + "do_block", + "@22", + "@23", + "@24", + "operation3", + "@25", + "@26", + "cases", + "exc_list", + "exc_var", + "numeric", + "string", + "string1", + "string_contents", + "xstring_contents", + "regexp_contents", + "word_list", + "word", + "string_content", + "qword_list", + "string_dvar", + "@27", + "f_optarg", + "f_arg_item", + "f_opt", + "f_block_opt", + "restarg_mark", + "blkarg_mark", + "assoc" ] + +Racc_debug_parser = false + +##### State transition tables end ##### + +# reduce 0 omitted + +# reduce 1 omitted + +def _reduce_2(val, _values, result) + rescue_bodies = val[1] + else_t, else_ = val[2] + ensure_t, ensure_ = val[3] + + if rescue_bodies.empty? && !else_t.nil? + diagnostic :warning, :useless_else, nil, else_t + end + + result = @builder.begin_body(val[0], + rescue_bodies, + else_t, else_, + ensure_t, ensure_) + + result +end + +def _reduce_3(val, _values, result) + result = @builder.compstmt(val[0]) + + result +end + +def _reduce_4(val, _values, result) + result = [] + + result +end + +def _reduce_5(val, _values, result) + result = [ val[0] ] + + result +end + +def _reduce_6(val, _values, result) + result = val[0] << val[2] + + result +end + +def _reduce_7(val, _values, result) + result = [ val[1] ] + + result +end + +def _reduce_8(val, _values, result) + @lexer.state = :expr_fname + + result +end + +def _reduce_9(val, _values, result) + result = @builder.alias(val[0], val[1], val[3]) + + result +end + +def _reduce_10(val, _values, result) + result = @builder.alias(val[0], + @builder.gvar(val[1]), + @builder.gvar(val[2])) + + result +end + +def _reduce_11(val, _values, result) + result = @builder.alias(val[0], + @builder.gvar(val[1]), + @builder.back_ref(val[2])) + + result +end + +def _reduce_12(val, _values, result) + diagnostic :error, :nth_ref_alias, nil, val[2] + + result +end + +def _reduce_13(val, _values, result) + result = @builder.undef_method(val[0], val[1]) + + result +end + +def _reduce_14(val, _values, result) + result = @builder.condition_mod(val[0], nil, + val[1], val[2]) + + result +end + +def _reduce_15(val, _values, result) + result = @builder.condition_mod(nil, val[0], + val[1], val[2]) + + result +end + +def _reduce_16(val, _values, result) + result = @builder.loop_mod(:while, val[0], val[1], val[2]) + + result +end + +def _reduce_17(val, _values, result) + result = @builder.loop_mod(:until, val[0], val[1], val[2]) + + result +end + +def _reduce_18(val, _values, result) + rescue_body = @builder.rescue_body(val[1], + nil, nil, nil, + nil, val[2]) + + result = @builder.begin_body(val[0], [ rescue_body ]) + + result +end + +def _reduce_19(val, _values, result) + if @context.in_def + diagnostic :error, :begin_in_method, nil, val[0] + end + + result = @builder.preexe(val[0], val[1], val[2], val[3]) + + result +end + +def _reduce_20(val, _values, result) + result = @builder.postexe(val[0], val[1], val[2], val[3]) + + result +end + +def _reduce_21(val, _values, result) + result = @builder.assign(val[0], val[1], val[2]) + + result +end + +def _reduce_22(val, _values, result) + result = @builder.multi_assign(val[0], val[1], val[2]) + + result +end + +def _reduce_23(val, _values, result) + result = @builder.op_assign(val[0], val[1], val[2]) + + result +end + +def _reduce_24(val, _values, result) + result = @builder.op_assign( + @builder.index( + val[0], val[1], val[2], val[3]), + val[4], val[5]) + + result +end + +def _reduce_25(val, _values, result) + result = @builder.op_assign( + @builder.call_method( + val[0], val[1], val[2]), + val[3], val[4]) + + result +end + +def _reduce_26(val, _values, result) + result = @builder.op_assign( + @builder.call_method( + val[0], val[1], val[2]), + val[3], val[4]) + + result +end + +def _reduce_27(val, _values, result) + result = @builder.op_assign( + @builder.call_method( + val[0], val[1], val[2]), + val[3], val[4]) + + result +end + +def _reduce_28(val, _values, result) + @builder.op_assign(val[0], val[1], val[2]) + + result +end + +def _reduce_29(val, _values, result) + result = @builder.assign(val[0], val[1], + @builder.array(nil, val[2], nil)) + + result +end + +def _reduce_30(val, _values, result) + result = @builder.multi_assign(val[0], val[1], val[2]) + + result +end + +def _reduce_31(val, _values, result) + result = @builder.multi_assign(val[0], val[1], + @builder.array(nil, val[2], nil)) + + result +end + +# reduce 32 omitted + +# reduce 33 omitted + +def _reduce_34(val, _values, result) + result = @builder.logical_op(:and, val[0], val[1], val[2]) + + result +end + +def _reduce_35(val, _values, result) + result = @builder.logical_op(:or, val[0], val[1], val[2]) + + result +end + +def _reduce_36(val, _values, result) + result = @builder.not_op(val[0], nil, val[2], nil) + + result +end + +def _reduce_37(val, _values, result) + result = @builder.not_op(val[0], nil, val[1], nil) + + result +end + +# reduce 38 omitted + +# reduce 39 omitted + +# reduce 40 omitted + +# reduce 41 omitted + +def _reduce_42(val, _values, result) + result = @builder.keyword_cmd(:return, val[0], + nil, val[1], nil) + + result +end + +def _reduce_43(val, _values, result) + result = @builder.keyword_cmd(:break, val[0], + nil, val[1], nil) + + result +end + +def _reduce_44(val, _values, result) + result = @builder.keyword_cmd(:next, val[0], + nil, val[1], nil) + + result +end + +# reduce 45 omitted + +def _reduce_46(val, _values, result) + result = @builder.call_method(val[0], val[1], val[2], + *val[3]) + + result +end + +def _reduce_47(val, _values, result) + result = @builder.call_method(val[0], val[1], val[2], + *val[3]) + + result +end + +def _reduce_48(val, _values, result) + @static_env.extend_dynamic + result = @context.dup + @context.in_block = true + + result +end + +def _reduce_49(val, _values, result) + result = [ val[0], val[2], val[3], val[4] ] + + @static_env.unextend + @context.in_block = val[1].in_block + + result +end + +def _reduce_50(val, _values, result) + result = @builder.call_method(nil, nil, val[0], + *val[1]) + + result +end + +def _reduce_51(val, _values, result) + method_call = @builder.call_method(nil, nil, val[0], + *val[1]) + + begin_t, args, body, end_t = val[2] + result = @builder.block(method_call, + begin_t, args, body, end_t) + + result +end + +def _reduce_52(val, _values, result) + result = @builder.call_method(val[0], val[1], val[2], + *val[3]) + + result +end + +def _reduce_53(val, _values, result) + method_call = @builder.call_method(val[0], val[1], val[2], + *val[3]) + + begin_t, args, body, end_t = val[4] + result = @builder.block(method_call, + begin_t, args, body, end_t) + + result +end + +def _reduce_54(val, _values, result) + result = @builder.call_method(val[0], val[1], val[2], + *val[3]) + + result +end + +def _reduce_55(val, _values, result) + method_call = @builder.call_method(val[0], val[1], val[2], + *val[3]) + + begin_t, args, body, end_t = val[4] + result = @builder.block(method_call, + begin_t, args, body, end_t) + + result +end + +def _reduce_56(val, _values, result) + result = @builder.keyword_cmd(:super, val[0], + *val[1]) + + result +end + +def _reduce_57(val, _values, result) + result = @builder.keyword_cmd(:yield, val[0], + *val[1]) + + result +end + +def _reduce_58(val, _values, result) + result = @builder.multi_lhs(nil, val[0], nil) + + result +end + +def _reduce_59(val, _values, result) + result = @builder.begin(val[0], val[1], val[2]) + + result +end + +def _reduce_60(val, _values, result) + result = @builder.multi_lhs(nil, val[0], nil) + + result +end + +def _reduce_61(val, _values, result) + result = @builder.multi_lhs(val[0], val[1], val[2]) + + result +end + +# reduce 62 omitted + +def _reduce_63(val, _values, result) + result = val[0]. + push(val[1]) + + result +end + +def _reduce_64(val, _values, result) + result = val[0]. + push(@builder.splat(val[1], val[2])) + + result +end + +def _reduce_65(val, _values, result) + result = val[0]. + push(@builder.splat(val[1], val[2])). + concat(val[4]) + + result +end + +def _reduce_66(val, _values, result) + result = val[0]. + push(@builder.splat(val[1])) + + result +end + +def _reduce_67(val, _values, result) + result = val[0]. + push(@builder.splat(val[1])). + concat(val[3]) + + result +end + +def _reduce_68(val, _values, result) + result = [ @builder.splat(val[0], val[1]) ] + + result +end + +def _reduce_69(val, _values, result) + result = [ @builder.splat(val[0], val[1]), + *val[3] ] + + result +end + +def _reduce_70(val, _values, result) + result = [ @builder.splat(val[0]) ] + + result +end + +def _reduce_71(val, _values, result) + result = [ @builder.splat(val[0]), + *val[2] ] + + result +end + +# reduce 72 omitted + +def _reduce_73(val, _values, result) + result = @builder.begin(val[0], val[1], val[2]) + + result +end + +def _reduce_74(val, _values, result) + result = [ val[0] ] + + result +end + +def _reduce_75(val, _values, result) + result = val[0] << val[1] + + result +end + +def _reduce_76(val, _values, result) + result = [ val[0] ] + + result +end + +def _reduce_77(val, _values, result) + result = val[0] << val[2] + + result +end + +def _reduce_78(val, _values, result) + result = @builder.assignable(val[0]) + + result +end + +def _reduce_79(val, _values, result) + result = @builder.index_asgn(val[0], val[1], val[2], val[3]) + + result +end + +def _reduce_80(val, _values, result) + result = @builder.attr_asgn(val[0], val[1], val[2]) + + result +end + +def _reduce_81(val, _values, result) + result = @builder.attr_asgn(val[0], val[1], val[2]) + + result +end + +def _reduce_82(val, _values, result) + result = @builder.attr_asgn(val[0], val[1], val[2]) + + result +end + +def _reduce_83(val, _values, result) + result = @builder.assignable( + @builder.const_fetch(val[0], val[1], val[2])) + + result +end + +def _reduce_84(val, _values, result) + result = @builder.assignable( + @builder.const_global(val[0], val[1])) + + result +end + +def _reduce_85(val, _values, result) + result = @builder.assignable(val[0]) + + result +end + +def _reduce_86(val, _values, result) + result = @builder.assignable(val[0]) + + result +end + +def _reduce_87(val, _values, result) + result = @builder.index_asgn(val[0], val[1], val[2], val[3]) + + result +end + +def _reduce_88(val, _values, result) + result = @builder.attr_asgn(val[0], val[1], val[2]) + + result +end + +def _reduce_89(val, _values, result) + result = @builder.attr_asgn(val[0], val[1], val[2]) + + result +end + +def _reduce_90(val, _values, result) + result = @builder.attr_asgn(val[0], val[1], val[2]) + + result +end + +def _reduce_91(val, _values, result) + result = @builder.assignable( + @builder.const_fetch(val[0], val[1], val[2])) + + result +end + +def _reduce_92(val, _values, result) + result = @builder.assignable( + @builder.const_global(val[0], val[1])) + + result +end + +def _reduce_93(val, _values, result) + result = @builder.assignable(val[0]) + + result +end + +def _reduce_94(val, _values, result) + diagnostic :error, :module_name_const, nil, val[0] + + result +end + +# reduce 95 omitted + +def _reduce_96(val, _values, result) + result = @builder.const_global(val[0], val[1]) + + result +end + +def _reduce_97(val, _values, result) + result = @builder.const(val[0]) + + result +end + +def _reduce_98(val, _values, result) + result = @builder.const_fetch(val[0], val[1], val[2]) + + result +end + +# reduce 99 omitted + +# reduce 100 omitted + +# reduce 101 omitted + +# reduce 102 omitted + +# reduce 103 omitted + +def _reduce_104(val, _values, result) + result = @builder.symbol_internal(val[0]) + + result +end + +# reduce 105 omitted + +# reduce 106 omitted + +# reduce 107 omitted + +def _reduce_108(val, _values, result) + result = [ val[0] ] + + result +end + +def _reduce_109(val, _values, result) + @lexer.state = :expr_fname + + result +end + +def _reduce_110(val, _values, result) + result = val[0] << val[3] + + result +end + +# reduce 111 omitted + +# reduce 112 omitted + +# reduce 113 omitted + +# reduce 114 omitted + +# reduce 115 omitted + +# reduce 116 omitted + +# reduce 117 omitted + +# reduce 118 omitted + +# reduce 119 omitted + +# reduce 120 omitted + +# reduce 121 omitted + +# reduce 122 omitted + +# reduce 123 omitted + +# reduce 124 omitted + +# reduce 125 omitted + +# reduce 126 omitted + +# reduce 127 omitted + +# reduce 128 omitted + +# reduce 129 omitted + +# reduce 130 omitted + +# reduce 131 omitted + +# reduce 132 omitted + +# reduce 133 omitted + +# reduce 134 omitted + +# reduce 135 omitted + +# reduce 136 omitted + +# reduce 137 omitted + +# reduce 138 omitted + +# reduce 139 omitted + +# reduce 140 omitted + +# reduce 141 omitted + +# reduce 142 omitted + +# reduce 143 omitted + +# reduce 144 omitted + +# reduce 145 omitted + +# reduce 146 omitted + +# reduce 147 omitted + +# reduce 148 omitted + +# reduce 149 omitted + +# reduce 150 omitted + +# reduce 151 omitted + +# reduce 152 omitted + +# reduce 153 omitted + +# reduce 154 omitted + +# reduce 155 omitted + +# reduce 156 omitted + +# reduce 157 omitted + +# reduce 158 omitted + +# reduce 159 omitted + +# reduce 160 omitted + +# reduce 161 omitted + +# reduce 162 omitted + +# reduce 163 omitted + +# reduce 164 omitted + +# reduce 165 omitted + +# reduce 166 omitted + +# reduce 167 omitted + +# reduce 168 omitted + +# reduce 169 omitted + +# reduce 170 omitted + +# reduce 171 omitted + +# reduce 172 omitted + +# reduce 173 omitted + +# reduce 174 omitted + +# reduce 175 omitted + +# reduce 176 omitted + +# reduce 177 omitted + +# reduce 178 omitted + +# reduce 179 omitted + +# reduce 180 omitted + +def _reduce_181(val, _values, result) + result = @builder.assign(val[0], val[1], val[2]) + + result +end + +def _reduce_182(val, _values, result) + rescue_body = @builder.rescue_body(val[3], + nil, nil, nil, + nil, val[4]) + + rescue_ = @builder.begin_body(val[2], [ rescue_body ]) + + result = @builder.assign(val[0], val[1], rescue_) + + result +end + +def _reduce_183(val, _values, result) + result = @builder.op_assign(val[0], val[1], val[2]) + + result +end + +def _reduce_184(val, _values, result) + rescue_body = @builder.rescue_body(val[3], + nil, nil, nil, + nil, val[4]) + + rescue_ = @builder.begin_body(val[2], [ rescue_body ]) + + result = @builder.op_assign(val[0], val[1], rescue_) + + result +end + +def _reduce_185(val, _values, result) + result = @builder.op_assign( + @builder.index( + val[0], val[1], val[2], val[3]), + val[4], val[5]) + + result +end + +def _reduce_186(val, _values, result) + result = @builder.op_assign( + @builder.call_method( + val[0], val[1], val[2]), + val[3], val[4]) + + result +end + +def _reduce_187(val, _values, result) + result = @builder.op_assign( + @builder.call_method( + val[0], val[1], val[2]), + val[3], val[4]) + + result +end + +def _reduce_188(val, _values, result) + result = @builder.op_assign( + @builder.call_method( + val[0], val[1], val[2]), + val[3], val[4]) + + result +end + +def _reduce_189(val, _values, result) + diagnostic :error, :dynamic_const, nil, val[2], [ val[3] ] + + result +end + +def _reduce_190(val, _values, result) + diagnostic :error, :dynamic_const, nil, val[1], [ val[2] ] + + result +end + +def _reduce_191(val, _values, result) + result = @builder.op_assign(val[0], val[1], val[2]) + + result +end + +def _reduce_192(val, _values, result) + result = @builder.range_inclusive(val[0], val[1], val[2]) + + result +end + +def _reduce_193(val, _values, result) + result = @builder.range_exclusive(val[0], val[1], val[2]) + + result +end + +def _reduce_194(val, _values, result) + result = @builder.binary_op(val[0], val[1], val[2]) + + result +end + +def _reduce_195(val, _values, result) + result = @builder.binary_op(val[0], val[1], val[2]) + + result +end + +def _reduce_196(val, _values, result) + result = @builder.binary_op(val[0], val[1], val[2]) + + result +end + +def _reduce_197(val, _values, result) + result = @builder.binary_op(val[0], val[1], val[2]) + + result +end + +def _reduce_198(val, _values, result) + result = @builder.binary_op(val[0], val[1], val[2]) + + result +end + +def _reduce_199(val, _values, result) + result = @builder.binary_op(val[0], val[1], val[2]) + + result +end + +def _reduce_200(val, _values, result) + result = @builder.unary_op(val[0], + @builder.binary_op( + @builder.integer(val[1]), + val[2], val[3])) + + result +end + +def _reduce_201(val, _values, result) + result = @builder.unary_op(val[0], + @builder.binary_op( + @builder.float(val[1]), + val[2], val[3])) + + result +end + +def _reduce_202(val, _values, result) + result = @builder.unary_op(val[0], val[1]) + + result +end + +def _reduce_203(val, _values, result) + result = @builder.unary_op(val[0], val[1]) + + result +end + +def _reduce_204(val, _values, result) + result = @builder.binary_op(val[0], val[1], val[2]) + + result +end + +def _reduce_205(val, _values, result) + result = @builder.binary_op(val[0], val[1], val[2]) + + result +end + +def _reduce_206(val, _values, result) + result = @builder.binary_op(val[0], val[1], val[2]) + + result +end + +def _reduce_207(val, _values, result) + result = @builder.binary_op(val[0], val[1], val[2]) + + result +end + +def _reduce_208(val, _values, result) + result = @builder.binary_op(val[0], val[1], val[2]) + + result +end + +def _reduce_209(val, _values, result) + result = @builder.binary_op(val[0], val[1], val[2]) + + result +end + +def _reduce_210(val, _values, result) + result = @builder.binary_op(val[0], val[1], val[2]) + + result +end + +def _reduce_211(val, _values, result) + result = @builder.binary_op(val[0], val[1], val[2]) + + result +end + +def _reduce_212(val, _values, result) + result = @builder.binary_op(val[0], val[1], val[2]) + + result +end + +def _reduce_213(val, _values, result) + result = @builder.binary_op(val[0], val[1], val[2]) + + result +end + +def _reduce_214(val, _values, result) + result = @builder.binary_op(val[0], val[1], val[2]) + + result +end + +def _reduce_215(val, _values, result) + result = @builder.match_op(val[0], val[1], val[2]) + + result +end + +def _reduce_216(val, _values, result) + result = @builder.binary_op(val[0], val[1], val[2]) + + result +end + +def _reduce_217(val, _values, result) + result = @builder.not_op(val[0], nil, val[1], nil) + + result +end + +def _reduce_218(val, _values, result) + result = @builder.unary_op(val[0], val[1]) + + result +end + +def _reduce_219(val, _values, result) + result = @builder.binary_op(val[0], val[1], val[2]) + + result +end + +def _reduce_220(val, _values, result) + result = @builder.binary_op(val[0], val[1], val[2]) + + result +end + +def _reduce_221(val, _values, result) + result = @builder.logical_op(:and, val[0], val[1], val[2]) + + result +end + +def _reduce_222(val, _values, result) + result = @builder.logical_op(:or, val[0], val[1], val[2]) + + result +end + +def _reduce_223(val, _values, result) + result = @builder.keyword_cmd(:defined?, val[0], nil, [ val[2] ], nil) + + result +end + +def _reduce_224(val, _values, result) + result = @builder.ternary(val[0], val[1], + val[2], val[4], val[5]) + + result +end + +# reduce 225 omitted + +# reduce 226 omitted + +# reduce 227 omitted + +# reduce 228 omitted + +def _reduce_229(val, _values, result) + result = val[0] << @builder.associate(nil, val[2], nil) + + result +end + +def _reduce_230(val, _values, result) + result = [ @builder.associate(nil, val[0], nil) ] + + result +end + +def _reduce_231(val, _values, result) + result = val + + result +end + +def _reduce_232(val, _values, result) + result = [ nil, [], nil ] + + result +end + +# reduce 233 omitted + +def _reduce_234(val, _values, result) + result = [] + + result +end + +# reduce 235 omitted + +def _reduce_236(val, _values, result) + result = [ val[0] ] + + result +end + +def _reduce_237(val, _values, result) + result = val[0].concat(val[1]) + + result +end + +def _reduce_238(val, _values, result) + result = [ @builder.associate(nil, val[0], nil) ] + result.concat(val[1]) + + result +end + +def _reduce_239(val, _values, result) + assocs = @builder.associate(nil, val[2], nil) + result = val[0] << assocs + result.concat(val[3]) + + result +end + +def _reduce_240(val, _values, result) + val[2][-1] = @builder.objc_varargs(val[2][-1], val[4]) + assocs = @builder.associate(nil, val[2], nil) + result = val[0] << assocs + result.concat(val[5]) + + result +end + +def _reduce_241(val, _values, result) + result = [ val[0] ] + + result +end + +def _reduce_242(val, _values, result) + result = [ val[0], *val[2].concat(val[3]) ] + + result +end + +def _reduce_243(val, _values, result) + result = [ val[0], val[2] ] + + result +end + +def _reduce_244(val, _values, result) + result = [ @builder.associate(nil, val[0], nil), + *val[1] ] + + result +end + +def _reduce_245(val, _values, result) + result = [ val[0], + @builder.associate(nil, val[2], nil), + *val[3] ] + + result +end + +def _reduce_246(val, _values, result) + result = [ val[0], + *val[2]. + push(@builder.associate(nil, val[4], nil)). + concat(val[5]) ] + + result +end + +def _reduce_247(val, _values, result) + result = [ val[0] ] + + result +end + +def _reduce_248(val, _values, result) + result = @lexer.cmdarg.dup + @lexer.cmdarg.push(true) + + result +end + +def _reduce_249(val, _values, result) + @lexer.cmdarg = val[0] + + result = val[1] + + result +end + +def _reduce_250(val, _values, result) + result = [ nil, val[0], nil ] + + result +end + +def _reduce_251(val, _values, result) + @lexer.state = :expr_endarg + + result +end + +def _reduce_252(val, _values, result) + result = [ val[0], [], val[2] ] + + result +end + +def _reduce_253(val, _values, result) + @lexer.state = :expr_endarg + + result +end + +def _reduce_254(val, _values, result) + result = [ val[0], val[1], val[3] ] + + result +end + +def _reduce_255(val, _values, result) + result = @builder.block_pass(val[0], val[1]) + + result +end + +def _reduce_256(val, _values, result) + result = [ val[1] ] + + result +end + +def _reduce_257(val, _values, result) + result = [] + + result +end + +def _reduce_258(val, _values, result) + result = [] + + result +end + +def _reduce_259(val, _values, result) + result = [ val[0] ] + + result +end + +def _reduce_260(val, _values, result) + result = [ @builder.splat(val[0], val[1]) ] + + result +end + +def _reduce_261(val, _values, result) + result = val[0] << val[2] + + result +end + +def _reduce_262(val, _values, result) + result = val[0] << @builder.splat(val[2], val[3]) + + result +end + +def _reduce_263(val, _values, result) + result = val[0] << val[2] + + result +end + +def _reduce_264(val, _values, result) + result = val[0] << @builder.splat(val[2], val[3]) + + result +end + +def _reduce_265(val, _values, result) + result = [ @builder.splat(val[0], val[1]) ] + + result +end + +# reduce 266 omitted + +# reduce 267 omitted + +# reduce 268 omitted + +# reduce 269 omitted + +# reduce 270 omitted + +# reduce 271 omitted + +# reduce 272 omitted + +# reduce 273 omitted + +def _reduce_274(val, _values, result) + result = @builder.call_method(nil, nil, val[0]) + + result +end + +def _reduce_275(val, _values, result) + result = @builder.begin_keyword(val[0], val[1], val[2]) + + result +end + +def _reduce_276(val, _values, result) + @lexer.state = :expr_endarg + + result +end + +def _reduce_277(val, _values, result) + result = @builder.begin(val[0], val[1], val[3]) + + result +end + +def _reduce_278(val, _values, result) + result = @builder.begin(val[0], val[1], val[2]) + + result +end + +def _reduce_279(val, _values, result) + result = @builder.const_fetch(val[0], val[1], val[2]) + + result +end + +def _reduce_280(val, _values, result) + result = @builder.const_global(val[0], val[1]) + + result +end + +def _reduce_281(val, _values, result) + result = @builder.array(val[0], val[1], val[2]) + + result +end + +def _reduce_282(val, _values, result) + result = @builder.associate(val[0], val[1], val[2]) + + result +end + +def _reduce_283(val, _values, result) + result = @builder.keyword_cmd(:return, val[0]) + + result +end + +def _reduce_284(val, _values, result) + result = @builder.keyword_cmd(:yield, val[0], val[1], val[2], val[3]) + + result +end + +def _reduce_285(val, _values, result) + result = @builder.keyword_cmd(:yield, val[0], val[1], [], val[2]) + + result +end + +def _reduce_286(val, _values, result) + result = @builder.keyword_cmd(:yield, val[0]) + + result +end + +def _reduce_287(val, _values, result) + result = @builder.keyword_cmd(:defined?, val[0], + val[2], [ val[3] ], val[4]) + + result +end + +def _reduce_288(val, _values, result) + result = @builder.not_op(val[0], val[1], val[2], val[3]) + + result +end + +def _reduce_289(val, _values, result) + result = @builder.not_op(val[0], val[1], nil, val[2]) + + result +end + +def _reduce_290(val, _values, result) + method_call = @builder.call_method(nil, nil, val[0]) + + begin_t, args, body, end_t = val[1] + result = @builder.block(method_call, + begin_t, args, body, end_t) + + result +end + +# reduce 291 omitted + +def _reduce_292(val, _values, result) + begin_t, args, body, end_t = val[1] + result = @builder.block(val[0], + begin_t, args, body, end_t) + + result +end + +def _reduce_293(val, _values, result) + result = @context.dup + @context.in_lambda = true + + result +end + +def _reduce_294(val, _values, result) + lambda_call = @builder.call_lambda(val[0]) + + args, (begin_t, body, end_t) = val[2] + result = @builder.block(lambda_call, + begin_t, args, body, end_t) + + @context.in_lambda = val[1].in_lambda + + result +end + +def _reduce_295(val, _values, result) + else_t, else_ = val[4] + result = @builder.condition(val[0], val[1], val[2], + val[3], else_t, + else_, val[5]) + + result +end + +def _reduce_296(val, _values, result) + else_t, else_ = val[4] + result = @builder.condition(val[0], val[1], val[2], + else_, else_t, + val[3], val[5]) + + result +end + +def _reduce_297(val, _values, result) + @lexer.cond.push(true) + + result +end + +def _reduce_298(val, _values, result) + @lexer.cond.pop + + result +end + +def _reduce_299(val, _values, result) + result = @builder.loop(:while, val[0], val[2], val[3], + val[5], val[6]) + + result +end + +def _reduce_300(val, _values, result) + @lexer.cond.push(true) + + result +end + +def _reduce_301(val, _values, result) + @lexer.cond.pop + + result +end + +def _reduce_302(val, _values, result) + result = @builder.loop(:until, val[0], val[2], val[3], + val[5], val[6]) + + result +end + +def _reduce_303(val, _values, result) + *when_bodies, (else_t, else_body) = *val[3] + + result = @builder.case(val[0], val[1], + when_bodies, else_t, else_body, + val[4]) + + result +end + +def _reduce_304(val, _values, result) + *when_bodies, (else_t, else_body) = *val[2] + + result = @builder.case(val[0], nil, + when_bodies, else_t, else_body, + val[3]) + + result +end + +def _reduce_305(val, _values, result) + @lexer.cond.push(true) + + result +end + +def _reduce_306(val, _values, result) + @lexer.cond.pop + + result +end + +def _reduce_307(val, _values, result) + result = @builder.for(val[0], val[1], + val[2], val[4], + val[5], val[7], val[8]) + + result +end + +def _reduce_308(val, _values, result) + local_push + @context.in_class = true + + result +end + +def _reduce_309(val, _values, result) + k_class, ctx = val[0] + if @context.in_def + diagnostic :error, :class_in_def, nil, k_class + end + + lt_t, superclass = val[2] + result = @builder.def_class(k_class, val[1], + lt_t, superclass, + val[4], val[5]) + + local_pop + @context.in_class = ctx.in_class + + result +end + +def _reduce_310(val, _values, result) + @context.in_def = false + @context.in_class = false + local_push + + result +end + +def _reduce_311(val, _values, result) + k_class, ctx = val[0] + result = @builder.def_sclass(k_class, val[1], val[2], + val[5], val[6]) + + local_pop + @context.in_def = ctx.in_def + @context.in_class = ctx.in_class + + result +end + +def _reduce_312(val, _values, result) + @context.in_class = true + local_push + + result +end + +def _reduce_313(val, _values, result) + k_mod, ctx = val[0] + if @context.in_def + diagnostic :error, :module_in_def, nil, k_mod + end + + result = @builder.def_module(k_mod, val[1], + val[3], val[4]) + + local_pop + @context.in_class = ctx.in_class + + result +end + +def _reduce_314(val, _values, result) + local_push + result = context.dup + @context.in_def = true + + result +end + +def _reduce_315(val, _values, result) + result = @builder.def_method(val[0], val[1], + val[3], val[4], val[5]) + + local_pop + @context.in_def = val[2].in_def + + result +end + +def _reduce_316(val, _values, result) + @lexer.state = :expr_fname + + result +end + +def _reduce_317(val, _values, result) + local_push + result = context.dup + @context.in_def = true + + result +end + +def _reduce_318(val, _values, result) + result = @builder.def_singleton(val[0], val[1], val[2], + val[4], val[6], val[7], val[8]) + + local_pop + @context.in_def = val[5].in_def + + result +end + +def _reduce_319(val, _values, result) + result = @builder.keyword_cmd(:break, val[0]) + + result +end + +def _reduce_320(val, _values, result) + result = @builder.keyword_cmd(:next, val[0]) + + result +end + +def _reduce_321(val, _values, result) + result = @builder.keyword_cmd(:redo, val[0]) + + result +end + +def _reduce_322(val, _values, result) + result = @builder.keyword_cmd(:retry, val[0]) + + result +end + +# reduce 323 omitted + +def _reduce_324(val, _values, result) + result = [ val[0], @context.dup ] + + result +end + +def _reduce_325(val, _values, result) + result = [ val[0], @context.dup ] + + result +end + +# reduce 326 omitted + +# reduce 327 omitted + +def _reduce_328(val, _values, result) + result = val[1] + + result +end + +# reduce 329 omitted + +# reduce 330 omitted + +# reduce 331 omitted + +def _reduce_332(val, _values, result) + else_t, else_ = val[4] + result = [ val[0], + @builder.condition(val[0], val[1], val[2], + val[3], else_t, + else_, nil), + ] + + result +end + +# reduce 333 omitted + +def _reduce_334(val, _values, result) + result = val + + result +end + +# reduce 335 omitted + +# reduce 336 omitted + +# reduce 337 omitted + +def _reduce_338(val, _values, result) + result = @builder.multi_lhs(val[0], val[1], val[2]) + + result +end + +def _reduce_339(val, _values, result) + result = [ val[0] ] + + result +end + +def _reduce_340(val, _values, result) + result = val[0] << val[2] + + result +end + +# reduce 341 omitted + +def _reduce_342(val, _values, result) + result = val[0]. + push(@builder.objc_restarg(val[2], val[3])) + + result +end + +def _reduce_343(val, _values, result) + result = val[0]. + push(@builder.objc_restarg(val[2], val[3])). + concat(val[5]) + + result +end + +def _reduce_344(val, _values, result) + result = val[0]. + push(@builder.objc_restarg(val[2])) + + result +end + +def _reduce_345(val, _values, result) + result = val[0]. + push(@builder.objc_restarg(val[2])). + concat(val[4]) + + result +end + +def _reduce_346(val, _values, result) + result = [ @builder.objc_restarg(val[0], val[1]) ] + + result +end + +def _reduce_347(val, _values, result) + result = [ @builder.objc_restarg(val[0], val[1]), + *val[3] ] + + result +end + +def _reduce_348(val, _values, result) + result = [ @builder.objc_restarg(val[0]) ] + + result +end + +def _reduce_349(val, _values, result) + result = [ @builder.objc_restarg(val[0]), + *val[2] ] + + result +end + +def _reduce_350(val, _values, result) + result = val[0]. + concat(val[2]). + concat(val[4]). + concat(val[5]) + + result +end + +def _reduce_351(val, _values, result) + result = val[0]. + concat(val[2]). + concat(val[4]). + concat(val[6]). + concat(val[7]) + + result +end + +def _reduce_352(val, _values, result) + result = val[0]. + concat(val[2]). + concat(val[3]) + + result +end + +def _reduce_353(val, _values, result) + result = val[0]. + concat(val[2]). + concat(val[4]). + concat(val[5]) + + result +end + +def _reduce_354(val, _values, result) + result = val[0]. + concat(val[2]). + concat(val[3]) + + result +end + +# reduce 355 omitted + +def _reduce_356(val, _values, result) + result = val[0]. + concat(val[2]). + concat(val[4]). + concat(val[5]) + + result +end + +def _reduce_357(val, _values, result) + if val[1].empty? && val[0].size == 1 + result = [@builder.procarg0(val[0][0])] + else + result = val[0].concat(val[1]) + end + + result +end + +def _reduce_358(val, _values, result) + result = val[0]. + concat(val[2]). + concat(val[3]) + + result +end + +def _reduce_359(val, _values, result) + result = val[0]. + concat(val[2]). + concat(val[4]). + concat(val[5]) + + result +end + +def _reduce_360(val, _values, result) + result = val[0]. + concat(val[1]) + + result +end + +def _reduce_361(val, _values, result) + result = val[0]. + concat(val[2]). + concat(val[3]) + + result +end + +def _reduce_362(val, _values, result) + result = val[0]. + concat(val[1]) + + result +end + +def _reduce_363(val, _values, result) + result = val[0]. + concat(val[2]). + concat(val[3]) + + result +end + +def _reduce_364(val, _values, result) + result = [ val[0] ] + + result +end + +def _reduce_365(val, _values, result) + result = @builder.args(nil, [], nil) + + result +end + +def _reduce_366(val, _values, result) + @lexer.state = :expr_value + + result +end + +def _reduce_367(val, _values, result) + result = @builder.args(val[0], val[1], val[2]) + + result +end + +def _reduce_368(val, _values, result) + result = @builder.args(val[0], [], val[0]) + + result +end + +def _reduce_369(val, _values, result) + result = @builder.args(val[0], val[1].concat(val[2]), val[3]) + + result +end + +def _reduce_370(val, _values, result) + result = [] + + result +end + +def _reduce_371(val, _values, result) + result = val[1] + + result +end + +def _reduce_372(val, _values, result) + result = [ val[0] ] + + result +end + +def _reduce_373(val, _values, result) + result = val[0] << val[2] + + result +end + +def _reduce_374(val, _values, result) + @static_env.declare val[0][0] + result = @builder.shadowarg(val[0]) + + result +end + +# reduce 375 omitted + +def _reduce_376(val, _values, result) + @static_env.extend_dynamic + + result +end + +def _reduce_377(val, _values, result) + result = [ val[1], val[2] ] + + @static_env.unextend + + result +end + +def _reduce_378(val, _values, result) + result = @builder.args(val[0], val[1].concat(val[2]), val[3]) + + result +end + +def _reduce_379(val, _values, result) + result = @builder.args(nil, val[0].concat(val[1]), nil) + + result +end + +def _reduce_380(val, _values, result) + result = @context.dup + @context.in_lambda = true + + result +end + +def _reduce_381(val, _values, result) + result = [ val[0], val[2], val[3] ] + @context.in_lambda = val[1].in_lambda + + result +end + +def _reduce_382(val, _values, result) + result = @context.dup + @context.in_lambda = true + + result +end + +def _reduce_383(val, _values, result) + result = [ val[0], val[2], val[3] ] + @context.in_lambda = val[1].in_lambda + + result +end + +def _reduce_384(val, _values, result) + @static_env.extend_dynamic + result = @context.dup + @context.in_block = true + + result +end + +def _reduce_385(val, _values, result) + result = [ val[0], val[2], val[3], val[4] ] + + @static_env.unextend + @context.in_block = val[1].in_block + + result +end + +def _reduce_386(val, _values, result) + begin_t, block_args, body, end_t = val[1] + result = @builder.block(val[0], + begin_t, block_args, body, end_t) + + result +end + +def _reduce_387(val, _values, result) + lparen_t, args, rparen_t = val[3] + result = @builder.call_method(val[0], val[1], val[2], + lparen_t, args, rparen_t) + + result +end + +def _reduce_388(val, _values, result) + lparen_t, args, rparen_t = val[3] + result = @builder.call_method(val[0], val[1], val[2], + lparen_t, args, rparen_t) + + result +end + +def _reduce_389(val, _values, result) + lparen_t, args, rparen_t = val[1] + result = @builder.call_method(nil, nil, val[0], + lparen_t, args, rparen_t) + + result +end + +def _reduce_390(val, _values, result) + lparen_t, args, rparen_t = val[3] + result = @builder.call_method(val[0], val[1], val[2], + lparen_t, args, rparen_t) + + result +end + +def _reduce_391(val, _values, result) + lparen_t, args, rparen_t = val[3] + result = @builder.call_method(val[0], val[1], val[2], + lparen_t, args, rparen_t) + + result +end + +def _reduce_392(val, _values, result) + result = @builder.call_method(val[0], val[1], val[2]) + + result +end + +def _reduce_393(val, _values, result) + lparen_t, args, rparen_t = val[2] + result = @builder.call_method(val[0], val[1], nil, + lparen_t, args, rparen_t) + + result +end + +def _reduce_394(val, _values, result) + lparen_t, args, rparen_t = val[2] + result = @builder.call_method(val[0], val[1], nil, + lparen_t, args, rparen_t) + + result +end + +def _reduce_395(val, _values, result) + lparen_t, args, rparen_t = val[1] + result = @builder.keyword_cmd(:super, val[0], + lparen_t, args, rparen_t) + + result +end + +def _reduce_396(val, _values, result) + result = @builder.keyword_cmd(:zsuper, val[0]) + + result +end + +def _reduce_397(val, _values, result) + result = @builder.index(val[0], val[1], val[2], val[3]) + + result +end + +def _reduce_398(val, _values, result) + @static_env.extend_dynamic + result = @context.dup + @context.in_block = true + + result +end + +def _reduce_399(val, _values, result) + result = [ val[0], val[2], val[3], val[4] ] + + @static_env.unextend + @context.in_block = val[1].in_block + + result +end + +def _reduce_400(val, _values, result) + @static_env.extend_dynamic + result = @context.dup + @context.in_block = true + + result +end + +def _reduce_401(val, _values, result) + result = [ val[0], val[2], val[3], val[4] ] + + @static_env.unextend + @context.in_block = val[1].in_block + + result +end + +def _reduce_402(val, _values, result) + result = [ @builder.when(val[0], val[1], val[2], val[3]), + *val[4] ] + + result +end + +def _reduce_403(val, _values, result) + result = [ val[0] ] + + result +end + +# reduce 404 omitted + +def _reduce_405(val, _values, result) + assoc_t, exc_var = val[2] + + if val[1] + exc_list = @builder.array(nil, val[1], nil) + end + + result = [ @builder.rescue_body(val[0], + exc_list, assoc_t, exc_var, + val[3], val[4]), + *val[5] ] + + result +end + +def _reduce_406(val, _values, result) + result = [] + + result +end + +def _reduce_407(val, _values, result) + result = [ val[0] ] + + result +end + +# reduce 408 omitted + +# reduce 409 omitted + +def _reduce_410(val, _values, result) + result = [ val[0], val[1] ] + + result +end + +# reduce 411 omitted + +def _reduce_412(val, _values, result) + result = [ val[0], val[1] ] + + result +end + +# reduce 413 omitted + +# reduce 414 omitted + +# reduce 415 omitted + +# reduce 416 omitted + +def _reduce_417(val, _values, result) + result = @builder.string_compose(nil, val[0], nil) + + result +end + +def _reduce_418(val, _values, result) + result = [ val[0] ] + + result +end + +def _reduce_419(val, _values, result) + result = val[0] << val[1] + + result +end + +def _reduce_420(val, _values, result) + result = @builder.string_compose(val[0], val[1], val[2]) + + result +end + +def _reduce_421(val, _values, result) + result = @builder.string(val[0]) + + result +end + +def _reduce_422(val, _values, result) + result = @builder.character(val[0]) + + result +end + +def _reduce_423(val, _values, result) + result = @builder.xstring_compose(val[0], val[1], val[2]) + + result +end + +def _reduce_424(val, _values, result) + opts = @builder.regexp_options(val[3]) + result = @builder.regexp_compose(val[0], val[1], val[2], opts) + + result +end + +def _reduce_425(val, _values, result) + result = @builder.words_compose(val[0], val[1], val[2]) + + result +end + +def _reduce_426(val, _values, result) + result = [] + + result +end + +def _reduce_427(val, _values, result) + result = val[0] << @builder.word(val[1]) + + result +end + +def _reduce_428(val, _values, result) + result = [ val[0] ] + + result +end + +def _reduce_429(val, _values, result) + result = val[0] << val[1] + + result +end + +def _reduce_430(val, _values, result) + result = @builder.words_compose(val[0], val[1], val[2]) + + result +end + +def _reduce_431(val, _values, result) + result = [] + + result +end + +def _reduce_432(val, _values, result) + result = val[0] << @builder.string_internal(val[1]) + + result +end + +def _reduce_433(val, _values, result) + result = [] + + result +end + +def _reduce_434(val, _values, result) + result = val[0] << val[1] + + result +end + +def _reduce_435(val, _values, result) + result = [] + + result +end + +def _reduce_436(val, _values, result) + result = val[0] << val[1] + + result +end + +def _reduce_437(val, _values, result) + result = [] + + result +end + +def _reduce_438(val, _values, result) + result = val[0] << val[1] + + result +end + +def _reduce_439(val, _values, result) + result = @builder.string_internal(val[0]) + + result +end + +def _reduce_440(val, _values, result) + result = val[1] + + result +end + +def _reduce_441(val, _values, result) + @lexer.cond.push(false) + @lexer.cmdarg.push(false) + + result +end + +def _reduce_442(val, _values, result) + @lexer.cond.lexpop + @lexer.cmdarg.lexpop + + result = @builder.begin(val[0], val[2], val[3]) + + result +end + +def _reduce_443(val, _values, result) + result = @builder.gvar(val[0]) + + result +end + +def _reduce_444(val, _values, result) + result = @builder.ivar(val[0]) + + result +end + +def _reduce_445(val, _values, result) + result = @builder.cvar(val[0]) + + result +end + +# reduce 446 omitted + +def _reduce_447(val, _values, result) + result = @builder.symbol(val[0]) + + result +end + +def _reduce_448(val, _values, result) + result = @builder.symbol_compose(val[0], val[1], val[2]) + + result +end + +def _reduce_449(val, _values, result) + result = @builder.integer(val[0]) + + result +end + +def _reduce_450(val, _values, result) + result = @builder.float(val[0]) + + result +end + +def _reduce_451(val, _values, result) + num = @builder.integer(val[1]) + if @builder.respond_to? :negate + # AST builder interface compatibility + result = @builder.negate(val[0], num) + else + result = @builder.unary_num(val[0], num) + end + + result +end + +def _reduce_452(val, _values, result) + num = @builder.float(val[1]) + if @builder.respond_to? :negate + # AST builder interface compatibility + result = @builder.negate(val[0], num) + else + result = @builder.unary_num(val[0], num) + end + + result +end + +def _reduce_453(val, _values, result) + result = @builder.ident(val[0]) + + result +end + +def _reduce_454(val, _values, result) + result = @builder.ivar(val[0]) + + result +end + +def _reduce_455(val, _values, result) + result = @builder.gvar(val[0]) + + result +end + +def _reduce_456(val, _values, result) + result = @builder.const(val[0]) + + result +end + +def _reduce_457(val, _values, result) + result = @builder.cvar(val[0]) + + result +end + +def _reduce_458(val, _values, result) + result = @builder.nil(val[0]) + + result +end + +def _reduce_459(val, _values, result) + result = @builder.self(val[0]) + + result +end + +def _reduce_460(val, _values, result) + result = @builder.true(val[0]) + + result +end + +def _reduce_461(val, _values, result) + result = @builder.false(val[0]) + + result +end + +def _reduce_462(val, _values, result) + result = @builder.__FILE__(val[0]) + + result +end + +def _reduce_463(val, _values, result) + result = @builder.__LINE__(val[0]) + + result +end + +def _reduce_464(val, _values, result) + result = @builder.__ENCODING__(val[0]) + + result +end + +def _reduce_465(val, _values, result) + result = @builder.accessible(val[0]) + + result +end + +def _reduce_466(val, _values, result) + result = @builder.assignable(val[0]) + + result +end + +def _reduce_467(val, _values, result) + result = @builder.nth_ref(val[0]) + + result +end + +def _reduce_468(val, _values, result) + result = @builder.back_ref(val[0]) + + result +end + +def _reduce_469(val, _values, result) + result = nil + + result +end + +def _reduce_470(val, _values, result) + result = [ val[0], val[1] ] + + result +end + +def _reduce_471(val, _values, result) + yyerrok + result = nil + + result +end + +def _reduce_472(val, _values, result) + result = @builder.args(val[0], val[1], val[2]) + + @lexer.state = :expr_value + + result +end + +def _reduce_473(val, _values, result) + result = @builder.args(nil, val[0], nil) + + result +end + +def _reduce_474(val, _values, result) + result = val[0]. + concat(val[2]). + concat(val[4]). + concat(val[5]) + + result +end + +def _reduce_475(val, _values, result) + result = val[0]. + concat(val[2]). + concat(val[4]). + concat(val[6]). + concat(val[7]) + + result +end + +def _reduce_476(val, _values, result) + result = val[0]. + concat(val[2]). + concat(val[3]) + + result +end + +def _reduce_477(val, _values, result) + result = val[0]. + concat(val[2]). + concat(val[4]). + concat(val[5]) + + result +end + +def _reduce_478(val, _values, result) + result = val[0]. + concat(val[2]). + concat(val[3]) + + result +end + +def _reduce_479(val, _values, result) + result = val[0]. + concat(val[2]). + concat(val[4]). + concat(val[5]) + + result +end + +def _reduce_480(val, _values, result) + result = val[0]. + concat(val[1]) + + result +end + +def _reduce_481(val, _values, result) + result = val[0]. + concat(val[2]). + concat(val[3]) + + result +end + +def _reduce_482(val, _values, result) + result = val[0]. + concat(val[2]). + concat(val[4]). + concat(val[5]) + + result +end + +def _reduce_483(val, _values, result) + result = val[0]. + concat(val[1]) + + result +end + +def _reduce_484(val, _values, result) + result = val[0]. + concat(val[2]). + concat(val[3]) + + result +end + +def _reduce_485(val, _values, result) + result = val[0]. + concat(val[1]) + + result +end + +def _reduce_486(val, _values, result) + result = val[0]. + concat(val[2]). + concat(val[3]) + + result +end + +def _reduce_487(val, _values, result) + result = [ val[0] ] + + result +end + +def _reduce_488(val, _values, result) + result = [] + + result +end + +def _reduce_489(val, _values, result) + diagnostic :error, :argument_const, nil, val[0] + + result +end + +def _reduce_490(val, _values, result) + diagnostic :error, :argument_ivar, nil, val[0] + + result +end + +def _reduce_491(val, _values, result) + diagnostic :error, :argument_gvar, nil, val[0] + + result +end + +def _reduce_492(val, _values, result) + diagnostic :error, :argument_cvar, nil, val[0] + + result +end + +# reduce 493 omitted + +def _reduce_494(val, _values, result) + @static_env.declare val[0][0] + + result = @builder.arg(val[0]) + + result +end + +def _reduce_495(val, _values, result) + @static_env.declare val[2][0] + + result = @builder.objc_kwarg(val[0], val[1], val[2]) + + result +end + +def _reduce_496(val, _values, result) + @static_env.declare val[1][0] + + result = @builder.objc_kwarg(val[0], nil, val[1]) + + result +end + +# reduce 497 omitted + +def _reduce_498(val, _values, result) + result = @builder.multi_lhs(val[0], val[1], val[2]) + + result +end + +def _reduce_499(val, _values, result) + result = [ val[0] ] + + result +end + +def _reduce_500(val, _values, result) + result = val[0] << val[2] + + result +end + +def _reduce_501(val, _values, result) + @static_env.declare val[0][0] + + result = @builder.optarg(val[0], val[1], val[2]) + + result +end + +def _reduce_502(val, _values, result) + @static_env.declare val[0][0] + + result = @builder.optarg(val[0], val[1], val[2]) + + result +end + +def _reduce_503(val, _values, result) + result = [ val[0] ] + + result +end + +def _reduce_504(val, _values, result) + result = val[0] << val[2] + + result +end + +def _reduce_505(val, _values, result) + result = [ val[0] ] + + result +end + +def _reduce_506(val, _values, result) + result = val[0] << val[2] + + result +end + +# reduce 507 omitted + +# reduce 508 omitted + +def _reduce_509(val, _values, result) + @static_env.declare val[1][0] + + result = [ @builder.restarg(val[0], val[1]) ] + + result +end + +def _reduce_510(val, _values, result) + result = [ @builder.restarg(val[0]) ] + + result +end + +# reduce 511 omitted + +# reduce 512 omitted + +def _reduce_513(val, _values, result) + @static_env.declare val[1][0] + + result = @builder.blockarg(val[0], val[1]) + + result +end + +def _reduce_514(val, _values, result) + result = [ val[1] ] + + result +end + +def _reduce_515(val, _values, result) + result = [] + + result +end + +# reduce 516 omitted + +def _reduce_517(val, _values, result) + result = val[1] + + result +end + +def _reduce_518(val, _values, result) + result = [] + + result +end + +# reduce 519 omitted + +def _reduce_520(val, _values, result) + result = [ val[0] ] + + result +end + +def _reduce_521(val, _values, result) + result = val[0] << val[2] + + result +end + +def _reduce_522(val, _values, result) + result = @builder.pair(val[0], val[1], val[2]) + + result +end + +def _reduce_523(val, _values, result) + result = @builder.pair_keyword(val[0], val[1]) + + result +end + +# reduce 524 omitted + +# reduce 525 omitted + +# reduce 526 omitted + +# reduce 527 omitted + +# reduce 528 omitted + +# reduce 529 omitted + +# reduce 530 omitted + +# reduce 531 omitted + +# reduce 532 omitted + +# reduce 533 omitted + +# reduce 534 omitted + +# reduce 535 omitted + +def _reduce_536(val, _values, result) + result = [:dot, val[0][1]] + + result +end + +def _reduce_537(val, _values, result) + result = [:anddot, val[0][1]] + + result +end + +# reduce 538 omitted + +# reduce 539 omitted + +# reduce 540 omitted + +# reduce 541 omitted + +def _reduce_542(val, _values, result) + result = val[1] + + result +end + +def _reduce_543(val, _values, result) + result = val[1] + + result +end + +# reduce 544 omitted + +# reduce 545 omitted + +# reduce 546 omitted + +def _reduce_547(val, _values, result) + yyerrok + + result +end + +# reduce 548 omitted + +# reduce 549 omitted + +# reduce 550 omitted + +def _reduce_551(val, _values, result) + result = nil + + result +end + +def _reduce_none(val, _values, result) + val[0] +end + + end # class RubyMotion + end # module Parser diff --git a/vendor/bundle/ruby/3.1.0/gems/parser-3.1.2.0/lib/parser/runner.rb b/vendor/bundle/ruby/3.1.0/gems/parser-3.1.2.0/lib/parser/runner.rb new file mode 100644 index 000000000..516d45319 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/parser-3.1.2.0/lib/parser/runner.rb @@ -0,0 +1,288 @@ +# frozen_string_literal: true + +require 'benchmark' +require 'find' +require 'optparse' + +require 'parser' + +module Parser + + class Runner + def self.go(options) + new.execute(options) + end + + def initialize + @option_parser = OptionParser.new { |opts| setup_option_parsing(opts) } + @legacy = {} + @parser_class = nil + @parser = nil + @files = [] + @fragments = [] + @warnings = false + @benchmark = false + + @source_count = 0 + @source_size = 0 + end + + def execute(options) + parse_options(options) + setup_builder_default + prepare_parser + + process_all_input + end + + private + + LEGACY_MODES = %i[lambda procarg0 encoding index arg_inside_procarg0 forward_arg kwargs match_pattern].freeze + + def runner_name + raise NotImplementedError, "implement #{self.class}##{__callee__}" + end + + def setup_option_parsing(opts) + opts.banner = "Usage: #{runner_name} [options] FILE|DIRECTORY..." + + opts.on_tail '-h', '--help', 'Display this help message and exit' do + puts opts.help + puts <<-HELP + + If you specify a DIRECTORY, then all *.rb files are fetched + from it recursively and appended to the file list. + + The default parsing mode is for current Ruby (#{RUBY_VERSION}). + HELP + exit + end + + opts.on_tail '-V', '--version', 'Output version information and exit' do + puts "#{runner_name} based on parser version #{Parser::VERSION}" + exit + end + + opts.on '--18', 'Parse as Ruby 1.8.7 would' do + require 'parser/ruby18' + @parser_class = Parser::Ruby18 + end + + opts.on '--19', 'Parse as Ruby 1.9.3 would' do + require 'parser/ruby19' + @parser_class = Parser::Ruby19 + end + + opts.on '--20', 'Parse as Ruby 2.0 would' do + require 'parser/ruby20' + @parser_class = Parser::Ruby20 + end + + opts.on '--21', 'Parse as Ruby 2.1 would' do + require 'parser/ruby21' + @parser_class = Parser::Ruby21 + end + + opts.on '--22', 'Parse as Ruby 2.2 would' do + require 'parser/ruby22' + @parser_class = Parser::Ruby22 + end + + opts.on '--23', 'Parse as Ruby 2.3 would' do + require 'parser/ruby23' + @parser_class = Parser::Ruby23 + end + + opts.on '--24', 'Parse as Ruby 2.4 would' do + require 'parser/ruby24' + @parser_class = Parser::Ruby24 + end + + opts.on '--25', 'Parse as Ruby 2.5 would' do + require 'parser/ruby25' + @parser_class = Parser::Ruby25 + end + + opts.on '--26', 'Parse as Ruby 2.6 would' do + require 'parser/ruby26' + @parser_class = Parser::Ruby26 + end + + opts.on '--27', 'Parse as Ruby 2.7 would' do + require 'parser/ruby27' + @parser_class = Parser::Ruby27 + end + + opts.on '--30', 'Parse as Ruby 3.0 would' do + require 'parser/ruby30' + @parser_class = Parser::Ruby30 + end + + opts.on '--31', 'Parse as Ruby 3.1 would' do + require 'parser/ruby31' + @parser_class = Parser::Ruby31 + end + + opts.on '--32', 'Parse as Ruby 3.2 would' do + require 'parser/ruby32' + @parser_class = Parser::Ruby32 + end + + opts.on '--mac', 'Parse as MacRuby 0.12 would' do + require 'parser/macruby' + @parser_class = Parser::MacRuby + end + + opts.on '--ios', 'Parse as mid-2015 RubyMotion would' do + require 'parser/rubymotion' + @parser_class = Parser::RubyMotion + end + + opts.on '--legacy', "Parse with all legacy modes" do + @legacy = Hash.new(true) + end + + LEGACY_MODES.each do |mode| + opt_name = "--legacy-#{mode.to_s.gsub('_', '-')}" + opts.on opt_name, "Parse with legacy mode for emit_#{mode}" do + @legacy[mode] = true + end + end + + opts.on '-w', '--warnings', 'Enable warnings' do |w| + @warnings = w + end + + opts.on '-B', '--benchmark', 'Benchmark the processor' do |b| + @benchmark = b + end + + opts.on '-e fragment', 'Process a fragment of Ruby code' do |fragment| + @fragments << fragment + end + end + + def parse_options(options) + @option_parser.parse!(options) + + # Slop has just removed recognized options from `options`. + @fragments << $stdin.read if options.delete('-') + options.each do |file_or_dir| + if File.directory?(file_or_dir) + Find.find(file_or_dir) do |path| + @files << path if path.end_with? '.rb' + end + else + @files << file_or_dir + end + end + + if @files.empty? && @fragments.empty? + $stderr.puts 'Need something to parse!' + exit 1 + end + + if @parser_class.nil? + require 'parser/current' + @parser_class = Parser::CurrentRuby + end + end + + def setup_builder_default + LEGACY_MODES.each do |mode| + Parser::Builders::Default.send(:"emit_#{mode}=", !@legacy[mode]) + end + end + + def prepare_parser + @parser = @parser_class.new + + @parser.diagnostics.all_errors_are_fatal = true + @parser.diagnostics.ignore_warnings = !@warnings + + @parser.diagnostics.consumer = lambda do |diagnostic| + puts(diagnostic.render) + end + end + + def input_size + @files.size + @fragments.size + end + + def process_all_input + parsing_time = + Benchmark.measure do + process_fragments + process_files + end + + if @benchmark + report_with_time(parsing_time) + end + end + + def process_fragments + @fragments.each_with_index do |fragment, index| + fragment = fragment.dup.force_encoding(@parser.default_encoding) + + buffer = Source::Buffer.new("(fragment:#{index})") + buffer.source = fragment + + process_buffer(buffer) + end + end + + def process_files + @files.each do |filename| + source = File.read(filename).force_encoding(@parser.default_encoding) + + buffer = Parser::Source::Buffer.new(filename) + + if @parser.class.name == 'Parser::Ruby18' + buffer.raw_source = source + else + buffer.source = source + end + + process_buffer(buffer) + end + end + + def process_buffer(buffer) + @parser.reset + + process(buffer) + + @source_count += 1 + @source_size += buffer.source.size + + rescue Parser::SyntaxError + # skip + + rescue StandardError + $stderr.puts("Failed on: #{buffer.name}") + raise + end + + def process(buffer) + raise NotImplementedError, "implement #{self.class}##{__callee__}" + end + + def report_with_time(parsing_time) + cpu_time = parsing_time.utime + + speed = '%.3f' % (@source_size / cpu_time / 1000) + puts "Parsed #{@source_count} files (#{@source_size} characters)" \ + " in #{'%.2f' % cpu_time} seconds (#{speed} kchars/s)." + + if defined?(RUBY_ENGINE) + engine = RUBY_ENGINE + else + engine = 'ruby' + end + + puts "Running on #{engine} #{RUBY_VERSION}." + end + end + +end diff --git a/vendor/bundle/ruby/3.1.0/gems/parser-3.1.2.0/lib/parser/runner/ruby_parse.rb b/vendor/bundle/ruby/3.1.0/gems/parser-3.1.2.0/lib/parser/runner/ruby_parse.rb new file mode 100644 index 000000000..aa96c8045 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/parser-3.1.2.0/lib/parser/runner/ruby_parse.rb @@ -0,0 +1,157 @@ +# frozen_string_literal: true + +require 'parser/runner' +require 'parser/color' +require 'parser/lexer/explanation' +require 'json' + +module Parser + + class Runner::RubyParse < Parser::Runner + + class LocationProcessor < Parser::AST::Processor + def process(node) + if node + p node + + source_line_no = nil + source_line = '' + hilight_line = '' + + print_line = lambda do + unless hilight_line.empty? + puts hilight_line. + gsub(/[a-z_]+/) { |m| Color.yellow(m, bold: true) }. + gsub(/[~.]+/) { |m| Color.magenta(m, bold: true) } + hilight_line = '' + end + end + + print_source = lambda do |range| + source_line = range.source_line + puts Color.green(source_line) + source_line + end + + (node.loc || {}).to_hash. + sort_by do |name, range| + [(range ? range.line : 0), + (name == :expression ? 1 : 0)] + end. + each do |name, range| + next if range.nil? + + if source_line_no != range.line + print_line.call() + source_line = print_source.call(range) + source_line_no = range.line + end + + beg_col = range.begin.column + + if beg_col + range.length > source_line.length + multiline = true + range_length = source_line.length - beg_col + 3 + else + multiline = false + range_length = range.length + end + + length = range_length + 1 + name.length + end_col = beg_col + length + + if beg_col > 0 + col_range = (beg_col - 1)...end_col + else + col_range = beg_col...end_col + end + + if hilight_line.length < end_col + hilight_line = hilight_line.ljust(end_col) + end + + if hilight_line[col_range] =~ /^\s*$/ + if multiline + tail = ('~' * (source_line.length - beg_col)) + '...' + else + tail = '~' * range_length + end + + tail = ' ' + tail if beg_col > 0 + + hilight_line[col_range] = tail + " #{name}" + else + print_line.call + redo + end + end + + print_line.call + end + + super + end + end + + def initialize + super + + @locate = false + @emit_ruby = false + @emit_json = false + end + + private + + def runner_name + 'ruby-parse' + end + + def setup_option_parsing(opts) + super(opts) + + opts.on '-L', '--locate', 'Explain how source maps for AST nodes are laid out' do |v| + @locate = v + end + + opts.on '-E', '--explain', 'Explain how the source is tokenized' do + ENV['RACC_DEBUG'] = '1' + + Lexer.send :include, Lexer::Explanation + end + + opts.on '--emit-ruby', 'Emit S-expressions as valid Ruby code' do + @emit_ruby = true + end + + opts.on '--emit-json', 'Emit S-expressions as valid JSON' do + @emit_json = true + end + end + + def process_all_input + if input_size > 1 + puts "Using #{@parser_class} to parse #{input_size} files." + end + + super + end + + def process(buffer) + ast = @parser.parse(buffer) + + if @locate + LocationProcessor.new.process(ast) + elsif !@benchmark + if @emit_ruby + puts ast.inspect + elsif @emit_json + puts(ast ? JSON.generate(ast.to_sexp_array) : nil) + else + puts ast.to_s + end + end + end + end + +end diff --git a/vendor/bundle/ruby/3.1.0/gems/parser-3.1.2.0/lib/parser/runner/ruby_rewrite.rb b/vendor/bundle/ruby/3.1.0/gems/parser-3.1.2.0/lib/parser/runner/ruby_rewrite.rb new file mode 100644 index 000000000..05bd82714 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/parser-3.1.2.0/lib/parser/runner/ruby_rewrite.rb @@ -0,0 +1,101 @@ +# frozen_string_literal: true + +require 'parser/runner' +require 'tempfile' + +module Parser + + class Runner::RubyRewrite < Runner + def initialize + super + + @rewriters = [] + @modify = false + end + + private + + def runner_name + 'ruby-rewrite' + end + + def setup_option_parsing(opts) + super(opts) + + opts.on '-l file', '--load', 'Load a rewriter' do |file| + load_and_discover(file) + end + + opts.on '-m', '--modify', 'Assume rewriters normally modify AST' do + @modify = true + end + end + + def load_and_discover(file) + load file + + const_name = File.basename(file). + sub(/\.rb$/, ''). + gsub(/(^|_)([a-z])/) do |m| + "#{$2.upcase}" + end + + @rewriters << Object.const_get(const_name) + end + + def process(initial_buffer) + buffer = initial_buffer + original_name = buffer.name + + @rewriters.each do |rewriter_class| + @parser.reset + ast = @parser.parse(buffer) + + rewriter = rewriter_class.new + new_source = rewriter.rewrite(buffer, ast) + + new_buffer = Source::Buffer.new(initial_buffer.name + + '|after ' + rewriter_class.name, + source: new_source) + + @parser.reset + new_ast = @parser.parse(new_buffer) + + if !@modify && ast != new_ast + $stderr.puts 'ASTs do not match:' + + old = Tempfile.new('old') + old.write ast.inspect + "\n"; old.flush + + new = Tempfile.new('new') + new.write new_ast.inspect + "\n"; new.flush + + IO.popen("diff -u #{old.path} #{new.path}") do |io| + diff = io.read. + sub(/^---.*/, "--- #{buffer.name}"). + sub(/^\+\+\+.*/, "+++ #{new_buffer.name}") + + $stderr.write diff + end + + exit 1 + end + + buffer = new_buffer + end + + if File.exist?(original_name) + File.open(original_name, 'w') do |file| + file.write buffer.source + end + else + if input_size > 1 + puts "Rewritten content of #{buffer.name}:" + end + + puts buffer.source + end + end + end + +end diff --git a/vendor/bundle/ruby/3.1.0/gems/parser-3.1.2.0/lib/parser/source/buffer.rb b/vendor/bundle/ruby/3.1.0/gems/parser-3.1.2.0/lib/parser/source/buffer.rb new file mode 100644 index 000000000..487e8420f --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/parser-3.1.2.0/lib/parser/source/buffer.rb @@ -0,0 +1,355 @@ +# encoding: ascii-8bit +# frozen_string_literal: true + +module Parser + module Source + + ## + # A buffer with source code. {Buffer} contains the source code itself, + # associated location information (name and first line), and takes care + # of encoding. + # + # A source buffer is immutable once populated. + # + # @!attribute [r] name + # Buffer name. If the buffer was created from a file, the name corresponds + # to relative path to the file. + # @return [String] buffer name + # + # @!attribute [r] first_line + # First line of the buffer, 1 by default. + # @return [Integer] first line + # + # @api public + # + class Buffer + attr_reader :name, :first_line + + ## + # @api private + # + ENCODING_RE = + /[\s#](en)?coding\s*[:=]\s* + ( + # Special-case: there's a UTF8-MAC encoding. + (utf8-mac) + | + # Chew the suffix; it's there for emacs compat. + ([A-Za-z0-9_-]+?)(-unix|-dos|-mac) + | + ([A-Za-z0-9_-]+) + ) + /x + + ## + # Try to recognize encoding of `string` as Ruby would, i.e. by looking for + # magic encoding comment or UTF-8 BOM. `string` can be in any encoding. + # + # @param [String] string + # @return [String, nil] encoding name, if recognized + # + def self.recognize_encoding(string) + return if string.empty? + + # extract the first two lines in an efficient way + string =~ /\A(.*)\n?(.*\n)?/ + first_line, second_line = $1, $2 + + if first_line.start_with?("\xef\xbb\xbf".freeze) # BOM + return Encoding::UTF_8 + elsif first_line[0, 2] == '#!'.freeze + encoding_line = second_line + else + encoding_line = first_line + end + + return nil if encoding_line.nil? || encoding_line[0] != '#' + + if (result = ENCODING_RE.match(encoding_line)) + Encoding.find(result[3] || result[4] || result[6]) + else + nil + end + end + + ## + # Recognize encoding of `input` and process it so it could be lexed. + # + # * If `input` does not contain BOM or magic encoding comment, it is + # kept in the original encoding. + # * If the detected encoding is binary, `input` is kept in binary. + # * Otherwise, `input` is re-encoded into UTF-8 and returned as a + # new string. + # + # This method mutates the encoding of `input`, but not its content. + # + # @param [String] input + # @return [String] + # @raise [EncodingError] + # + def self.reencode_string(input) + original_encoding = input.encoding + detected_encoding = recognize_encoding(input.force_encoding(Encoding::BINARY)) + + if detected_encoding.nil? + input.force_encoding(original_encoding) + elsif detected_encoding == Encoding::BINARY + input + else + input. + force_encoding(detected_encoding). + encode(Encoding::UTF_8) + end + end + + def initialize(name, first_line = 1, source: nil) + @name = name.to_s + @source = nil + @first_line = first_line + + @lines = nil + @line_begins = nil + + # UTF-32-reencoded source for O(1) slicing + @slice_source = nil + + # Cache for fast lookup + @line_index_for_position = {} + + self.source = source if source + end + + ## + # Populate this buffer from correspondingly named file. + # + # @example + # Parser::Source::Buffer.new('foo/bar.rb').read + # + # @return [Buffer] self + # @raise [ArgumentError] if already populated + # + def read + File.open(@name, 'rb') do |io| + self.source = io.read + end + + self + end + + ## + # Source code contained in this buffer. + # + # @return [String] source code + # @raise [RuntimeError] if buffer is not populated yet + # + def source + if @source.nil? + raise RuntimeError, 'Cannot extract source from uninitialized Source::Buffer' + end + + @source + end + + ## + # Populate this buffer from a string with encoding autodetection. + # `input` is mutated if not frozen. + # + # @param [String] input + # @raise [ArgumentError] if already populated + # @raise [EncodingError] if `input` includes invalid byte sequence for the encoding + # @return [String] + # + def source=(input) + input = input.dup if input.frozen? + input = self.class.reencode_string(input) + + unless input.valid_encoding? + raise EncodingError, "invalid byte sequence in #{input.encoding.name}" + end + + self.raw_source = input + end + + ## + # Populate this buffer from a string without encoding autodetection. + # + # @param [String] input + # @raise [ArgumentError] if already populated + # @return [String] + # + def raw_source=(input) + if @source + raise ArgumentError, 'Source::Buffer is immutable' + end + + @source = input.gsub("\r\n".freeze, "\n".freeze).freeze + + if !@source.ascii_only? && + @source.encoding != Encoding::UTF_32LE && + @source.encoding != Encoding::BINARY + @slice_source = @source.encode(Encoding::UTF_32LE) + end + end + + def slice(range) + if @slice_source.nil? + @source[range] + else + @slice_source[range].encode(@source.encoding) + end + end + + ## + # Convert a character index into the source to a `[line, column]` tuple. + # + # @param [Integer] position + # @return [[Integer, Integer]] `[line, column]` + # + def decompose_position(position) + line_index = line_index_for_position(position) + line_begin = line_begins[line_index] + + [ @first_line + line_index , position - line_begin ] + end + + ## + # Convert a character index into the source to a line number. + # + # @param [Integer] position + # @return [Integer] line + # @api private + # + def line_for_position(position) + line_index_for_position(position) + @first_line + end + + ## + # Convert a character index into the source to a column number. + # + # @param [Integer] position + # @return [Integer] column + # @api private + # + def column_for_position(position) + line_index = line_index_for_position(position) + position - line_begins[line_index] + end + + ## + # Return an `Array` of source code lines. + # + # @return [Array] + # + def source_lines + @lines ||= begin + lines = @source.lines.to_a + lines << ''.dup if @source.end_with?("\n".freeze) + + lines.each do |line| + line.chomp!("\n".freeze) + line.freeze + end + + lines.freeze + end + end + + ## + # Extract line `lineno` from source, taking `first_line` into account. + # + # @param [Integer] lineno + # @return [String] + # @raise [IndexError] if `lineno` is out of bounds + # + def source_line(lineno) + source_lines.fetch(lineno - @first_line).dup + end + + ## + # Extract line `lineno` as a new `Range`, taking `first_line` into account. + # + # @param [Integer] lineno + # @return [Range] + # @raise [IndexError] if `lineno` is out of bounds + # + def line_range(lineno) + index = lineno - @first_line + if index < 0 || index + 1 >= line_begins.size + raise IndexError, 'Parser::Source::Buffer: range for line ' \ + "#{lineno} requested, valid line numbers are #{@first_line}.." \ + "#{@first_line + line_begins.size - 2}" + else + Range.new(self, line_begins[index], line_begins[index + 1] - 1) + end + end + + ## + # @return [Range] A range covering the whole source + # + def source_range + @source_range ||= Range.new(self, 0, source.size) + end + + ## + # Number of last line in the buffer + # + # @return [Integer] + # + def last_line + line_begins.size + @first_line - 2 + end + + # :nodoc: + def freeze + source_lines; line_begins; source_range # build cache + super + end + + # :nodoc: + def inspect + "#<#{self.class} #{name}>" + end + + private + + # @returns [0, line_begin_of_line_1, ..., source.size + 1] + def line_begins + @line_begins ||= begin + begins = [0] + index = 0 + while index = @source.index("\n".freeze, index) + index += 1 + begins << index + end + begins << @source.size + 1 + begins + end + end + + # @returns 0-based line index of position + def line_index_for_position(position) + @line_index_for_position[position] || begin + index = bsearch(line_begins, position) - 1 + @line_index_for_position[position] = index unless @line_index_for_position.frozen? + index + end + end + + if Array.method_defined?(:bsearch_index) # RUBY_VERSION >= 2.3 + def bsearch(line_begins, position) + line_begins.bsearch_index do |line_begin| + position < line_begin + end || line_begins.size - 1 # || only for out of bound values + end + else + def bsearch(line_begins, position) + @line_range ||= 0...line_begins.size + @line_range.bsearch do |i| + position < line_begins[i] + end || line_begins.size - 1 # || only for out of bound values + end + end + end + + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/parser-3.1.2.0/lib/parser/source/comment.rb b/vendor/bundle/ruby/3.1.0/gems/parser-3.1.2.0/lib/parser/source/comment.rb new file mode 100644 index 000000000..411d98727 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/parser-3.1.2.0/lib/parser/source/comment.rb @@ -0,0 +1,134 @@ +# frozen_string_literal: true + +module Parser + module Source + + ## + # A comment in the source code. + # + # @!attribute [r] text + # @return [String] + # + # @!attribute [r] location + # @return [Parser::Source::Range] + # + # @api public + # + class Comment + attr_reader :text + + attr_reader :location + alias_method :loc, :location + + ## + # Associate `comments` with `ast` nodes by their corresponding node. + # + # @param [Parser::AST::Node] ast + # @param [Array] comments + # @return [Hash>] + # @see Parser::Source::Comment::Associator#associate + # @deprecated Use {associate_locations}. + # + def self.associate(ast, comments) + associator = Associator.new(ast, comments) + associator.associate + end + + ## + # Associate `comments` with `ast` nodes by their location in the + # source. + # + # @param [Parser::AST::Node] ast + # @param [Array] comments + # @return [Hash>] + # @see Parser::Source::Comment::Associator#associate_locations + # + def self.associate_locations(ast, comments) + associator = Associator.new(ast, comments) + associator.associate_locations + end + + ## + # Associate `comments` with `ast` nodes using identity. + # + # @param [Parser::AST::Node] ast + # @param [Array] comments + # @return [Hash>] + # @see Parser::Source::Comment::Associator#associate_by_identity + # + def self.associate_by_identity(ast, comments) + associator = Associator.new(ast, comments) + associator.associate_by_identity + end + + ## + # @param [Parser::Source::Range] range + # + def initialize(range) + @location = Parser::Source::Map.new(range) + @text = range.source.freeze + + freeze + end + + ## + # Type of this comment. + # + # * Inline comments correspond to `:inline`: + # + # # whatever + # + # * Block comments correspond to `:document`: + # + # =begin + # hi i am a document + # =end + # + # @return [Symbol] + # + def type + if text.start_with?("#".freeze) + :inline + elsif text.start_with?("=begin".freeze) + :document + end + end + + ## + # @see #type + # @return [Boolean] true if this is an inline comment. + # + def inline? + type == :inline + end + + ## + # @see #type + # @return [Boolean] true if this is a block comment. + # + def document? + type == :document + end + + ## + # Compares comments. Two comments are equal if they + # correspond to the same source range. + # + # @param [Object] other + # @return [Boolean] + # + def ==(other) + other.is_a?(Source::Comment) && + @location == other.location + end + + ## + # @return [String] a human-readable representation of this comment + # + def inspect + "#" + end + end + + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/parser-3.1.2.0/lib/parser/source/comment/associator.rb b/vendor/bundle/ruby/3.1.0/gems/parser-3.1.2.0/lib/parser/source/comment/associator.rb new file mode 100644 index 000000000..32811b5b2 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/parser-3.1.2.0/lib/parser/source/comment/associator.rb @@ -0,0 +1,233 @@ +# frozen_string_literal: true + +module Parser + module Source + + ## + # A processor which associates AST nodes with comments based on their + # location in source code. It may be used, for example, to implement + # rdoc-style processing. + # + # @example + # require 'parser/current' + # + # ast, comments = Parser::CurrentRuby.parse_with_comments(<<-CODE) + # # Class stuff + # class Foo + # # Attr stuff + # # @see bar + # attr_accessor :foo + # end + # CODE + # + # p Parser::Source::Comment.associate(ast, comments) + # # => { + # # (class (const nil :Foo) ...) => + # # [#], + # # (send nil :attr_accessor (sym :foo)) => + # # [#, + # # #] + # # } + # + # @see {associate} + # + # @!attribute skip_directives + # Skip file processing directives disguised as comments. + # Namely: + # + # * Shebang line, + # * Magic encoding comment. + # + # @return [Boolean] + # + # @api public + # + class Comment::Associator + attr_accessor :skip_directives + + ## + # @param [Parser::AST::Node] ast + # @param [Array] comments + def initialize(ast, comments) + @ast = ast + @comments = comments + + @skip_directives = true + end + + ## + # Compute a mapping between AST nodes and comments. Comment is + # associated with the node, if it is one of the following types: + # + # - preceding comment, it ends before the node start + # - sparse comment, it is located inside the node, after all child nodes + # - decorating comment, it starts at the same line, where the node ends + # + # This rule is unambiguous and produces the result + # one could reasonably expect; for example, this code + # + # # foo + # hoge # bar + # + fuga + # + # will result in the following association: + # + # { + # (send (lvar :hoge) :+ (lvar :fuga)) => + # [#], + # (lvar :fuga) => + # [#] + # } + # + # Note that comments after the end of the end of a passed tree range are + # ignored (except root decorating comment). + # + # Note that {associate} produces unexpected result for nodes which are + # equal but have distinct locations; comments for these nodes are merged. + # You may prefer using {associate_by_identity} or {associate_locations}. + # + # @return [Hash>] + # @deprecated Use {associate_locations}. + # + def associate + @map_using = :eql + do_associate + end + + ## + # Same as {associate}, but compares by identity, thus producing an unambiguous + # result even in presence of equal nodes. + # + # @return [Hash>] + # + def associate_locations + @map_using = :location + do_associate + end + + ## + # Same as {associate}, but uses `node.loc` instead of `node` as + # the hash key, thus producing an unambiguous result even in presence + # of equal nodes. + # + # @return [Hash>] + # + def associate_by_identity + @map_using = :identity + do_associate + end + + private + + POSTFIX_TYPES = Set[:if, :while, :while_post, :until, :until_post, :masgn].freeze + def children_in_source_order(node) + if POSTFIX_TYPES.include?(node.type) + # All these types have either nodes with expressions, or `nil` + # so a compact will do, but they need to be sorted. + node.children.compact.sort_by { |child| child.loc.expression.begin_pos } + else + node.children.select do |child| + child.is_a?(AST::Node) && child.loc && child.loc.expression + end + end + end + + def do_associate + @mapping = Hash.new { |h, k| h[k] = [] } + @mapping.compare_by_identity if @map_using == :identity + @comment_num = -1 + advance_comment + + advance_through_directives if @skip_directives + + visit(@ast) if @ast + + @mapping + end + + def visit(node) + process_leading_comments(node) + + return unless @current_comment + + # If the next comment is beyond the last line of this node, we don't + # need to iterate over its subnodes + # (Unless this node is a heredoc... there could be a comment in its body, + # inside an interpolation) + node_loc = node.location + if @current_comment.location.line <= node_loc.last_line || + node_loc.is_a?(Map::Heredoc) + children_in_source_order(node).each { |child| visit(child) } + + process_trailing_comments(node) + end + end + + def process_leading_comments(node) + return if node.type == :begin + while current_comment_before?(node) # preceding comment + associate_and_advance_comment(node) + end + end + + def process_trailing_comments(node) + while current_comment_before_end?(node) + associate_and_advance_comment(node) # sparse comment + end + while current_comment_decorates?(node) + associate_and_advance_comment(node) # decorating comment + end + end + + def advance_comment + @comment_num += 1 + @current_comment = @comments[@comment_num] + end + + def current_comment_before?(node) + return false if !@current_comment + comment_loc = @current_comment.location.expression + node_loc = node.location.expression + comment_loc.end_pos <= node_loc.begin_pos + end + + def current_comment_before_end?(node) + return false if !@current_comment + comment_loc = @current_comment.location.expression + node_loc = node.location.expression + comment_loc.end_pos <= node_loc.end_pos + end + + def current_comment_decorates?(node) + return false if !@current_comment + @current_comment.location.line == node.location.last_line + end + + def associate_and_advance_comment(node) + key = @map_using == :location ? node.location : node + @mapping[key] << @current_comment + advance_comment + end + + MAGIC_COMMENT_RE = /^#\s*(-\*-|)\s*(frozen_string_literal|warn_indent|warn_past_scope):.*\1$/ + + def advance_through_directives + # Skip shebang. + if @current_comment && @current_comment.text.start_with?('#!'.freeze) + advance_comment + end + + # Skip magic comments. + if @current_comment && @current_comment.text =~ MAGIC_COMMENT_RE + advance_comment + end + + # Skip encoding line. + if @current_comment && @current_comment.text =~ Buffer::ENCODING_RE + advance_comment + end + end + end + + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/parser-3.1.2.0/lib/parser/source/map.rb b/vendor/bundle/ruby/3.1.0/gems/parser-3.1.2.0/lib/parser/source/map.rb new file mode 100644 index 000000000..456e11f85 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/parser-3.1.2.0/lib/parser/source/map.rb @@ -0,0 +1,186 @@ +# frozen_string_literal: true + +module Parser + module Source + + ## + # {Map} relates AST nodes to the source code they were parsed from. + # More specifically, a {Map} or its subclass contains a set of ranges: + # + # * `expression`: smallest range which includes all source corresponding + # to the node and all `expression` ranges of its children. + # * other ranges (`begin`, `end`, `operator`, ...): node-specific ranges + # pointing to various interesting tokens corresponding to the node. + # + # Note that the {Map::Heredoc} map is the only one whose `expression` does + # not include other ranges. It only covers the heredoc marker (`< 2]').children[0].loc + # # => > + # + # The {file:doc/AST_FORMAT.md} document describes how ranges associated to source + # code tokens. For example, the entry + # + # (array (int 1) (int 2)) + # + # "[1, 2]" + # ^ begin + # ^ end + # ~~~~~~ expression + # + # means that if `node` is an {Parser::AST::Node} `(array (int 1) (int 2))`, + # then `node.loc` responds to `begin`, `end` and `expression`, and + # `node.loc.begin` returns a range pointing at the opening bracket, and so on. + # + # If you want to write code polymorphic by the source map (i.e. accepting + # several subclasses of {Map}), use `respond_to?` instead of `is_a?` to + # check whether the map features the range you need. Concrete {Map} + # subclasses may not be preserved between versions, but their interfaces + # will be kept compatible. + # + # You can visualize the source maps with `ruby-parse -E` command-line tool. + # + # @example + # require 'parser/current' + # + # p Parser::CurrentRuby.parse('[1, 2]').loc + # # => #, + # # @begin=#, + # # @expression=#> + # + # @!attribute [r] node + # The node that is described by this map. Nodes and maps have 1:1 correspondence. + # @return [Parser::AST::Node] + # + # @!attribute [r] expression + # @return [Range] + # + # @api public + # + class Map + attr_reader :node + attr_reader :expression + + ## + # @param [Range] expression + def initialize(expression) + @expression = expression + end + + ## + # @api private + def initialize_copy(other) + super + @node = nil + end + + ## + # @api private + def node=(node) + @node = node + freeze + @node + end + + ## + # A shortcut for `self.expression.line`. + # @return [Integer] + # + def line + @expression.line + end + + alias_method :first_line, :line + + ## + # A shortcut for `self.expression.column`. + # @return [Integer] + # + def column + @expression.column + end + + ## + # A shortcut for `self.expression.last_line`. + # @return [Integer] + # + def last_line + @expression.last_line + end + + ## + # A shortcut for `self.expression.last_column`. + # @return [Integer] + # + def last_column + @expression.last_column + end + + ## + # @api private + # + def with_expression(expression_l) + with { |map| map.update_expression(expression_l) } + end + + ## + # Compares source maps. + # @return [Boolean] + # + def ==(other) + other.class == self.class && + instance_variables.map do |ivar| + instance_variable_get(ivar) == + other.send(:instance_variable_get, ivar) + end.reduce(:&) + end + + ## + # Converts this source map to a hash with keys corresponding to + # ranges. For example, if called on an instance of {Collection}, + # which adds the `begin` and `end` ranges, the resulting hash + # will contain keys `:expression`, `:begin` and `:end`. + # + # @example + # require 'parser/current' + # + # p Parser::CurrentRuby.parse('[1, 2]').loc.to_hash + # # => { + # # :begin => #, + # # :end => #, + # # :expression => # + # # } + # + # @return [Hash] + # + def to_hash + instance_variables.inject({}) do |hash, ivar| + next hash if ivar.to_sym == :@node + hash[ivar[1..-1].to_sym] = instance_variable_get(ivar) + hash + end + end + + protected + + def with(&block) + dup.tap(&block) + end + + def update_expression(expression_l) + @expression = expression_l + end + end + + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/parser-3.1.2.0/lib/parser/source/map/collection.rb b/vendor/bundle/ruby/3.1.0/gems/parser-3.1.2.0/lib/parser/source/map/collection.rb new file mode 100644 index 000000000..1bf1f970b --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/parser-3.1.2.0/lib/parser/source/map/collection.rb @@ -0,0 +1,18 @@ +# frozen_string_literal: true + +module Parser + module Source + + class Map::Collection < Map + attr_reader :begin + attr_reader :end + + def initialize(begin_l, end_l, expression_l) + @begin, @end = begin_l, end_l + + super(expression_l) + end + end + + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/parser-3.1.2.0/lib/parser/source/map/condition.rb b/vendor/bundle/ruby/3.1.0/gems/parser-3.1.2.0/lib/parser/source/map/condition.rb new file mode 100644 index 000000000..07a6f6f93 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/parser-3.1.2.0/lib/parser/source/map/condition.rb @@ -0,0 +1,21 @@ +# frozen_string_literal: true + +module Parser + module Source + + class Map::Condition < Map + attr_reader :keyword + attr_reader :begin + attr_reader :else + attr_reader :end + + def initialize(keyword_l, begin_l, else_l, end_l, expression_l) + @keyword = keyword_l + @begin, @else, @end = begin_l, else_l, end_l + + super(expression_l) + end + end + + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/parser-3.1.2.0/lib/parser/source/map/constant.rb b/vendor/bundle/ruby/3.1.0/gems/parser-3.1.2.0/lib/parser/source/map/constant.rb new file mode 100644 index 000000000..d22b3451b --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/parser-3.1.2.0/lib/parser/source/map/constant.rb @@ -0,0 +1,32 @@ +# frozen_string_literal: true + +module Parser + module Source + + class Map::Constant < Map + attr_reader :double_colon + attr_reader :name + attr_reader :operator + + def initialize(double_colon, name, expression) + @double_colon, @name = double_colon, name + + super(expression) + end + + ## + # @api private + # + def with_operator(operator_l) + with { |map| map.update_operator(operator_l) } + end + + protected + + def update_operator(operator_l) + @operator = operator_l + end + end + + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/parser-3.1.2.0/lib/parser/source/map/definition.rb b/vendor/bundle/ruby/3.1.0/gems/parser-3.1.2.0/lib/parser/source/map/definition.rb new file mode 100644 index 000000000..2260192ab --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/parser-3.1.2.0/lib/parser/source/map/definition.rb @@ -0,0 +1,23 @@ +# frozen_string_literal: true + +module Parser + module Source + + class Map::Definition < Map + attr_reader :keyword + attr_reader :operator + attr_reader :name + attr_reader :end + + def initialize(keyword_l, operator_l, name_l, end_l) + @keyword = keyword_l + @operator = operator_l + @name = name_l + @end = end_l + + super(@keyword.join(@end)) + end + end + + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/parser-3.1.2.0/lib/parser/source/map/for.rb b/vendor/bundle/ruby/3.1.0/gems/parser-3.1.2.0/lib/parser/source/map/for.rb new file mode 100644 index 000000000..7eec546a0 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/parser-3.1.2.0/lib/parser/source/map/for.rb @@ -0,0 +1,19 @@ +# frozen_string_literal: true + +module Parser + module Source + + class Map::For < Map + attr_reader :keyword, :in + attr_reader :begin, :end + + def initialize(keyword_l, in_l, begin_l, end_l, expression_l) + @keyword, @in = keyword_l, in_l + @begin, @end = begin_l, end_l + + super(expression_l) + end + end + + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/parser-3.1.2.0/lib/parser/source/map/heredoc.rb b/vendor/bundle/ruby/3.1.0/gems/parser-3.1.2.0/lib/parser/source/map/heredoc.rb new file mode 100644 index 000000000..7e5db3437 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/parser-3.1.2.0/lib/parser/source/map/heredoc.rb @@ -0,0 +1,19 @@ +# frozen_string_literal: true + +module Parser + module Source + + class Map::Heredoc < Map + attr_reader :heredoc_body + attr_reader :heredoc_end + + def initialize(begin_l, body_l, end_l) + @heredoc_body = body_l + @heredoc_end = end_l + + super(begin_l) + end + end + + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/parser-3.1.2.0/lib/parser/source/map/index.rb b/vendor/bundle/ruby/3.1.0/gems/parser-3.1.2.0/lib/parser/source/map/index.rb new file mode 100644 index 000000000..62cf9b0f8 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/parser-3.1.2.0/lib/parser/source/map/index.rb @@ -0,0 +1,33 @@ +# frozen_string_literal: true + +module Parser + module Source + + class Map::Index < Map + attr_reader :begin + attr_reader :end + attr_reader :operator + + def initialize(begin_l, end_l, expression_l) + @begin, @end = begin_l, end_l + @operator = nil + + super(expression_l) + end + + ## + # @api private + # + def with_operator(operator_l) + with { |map| map.update_operator(operator_l) } + end + + protected + + def update_operator(operator_l) + @operator = operator_l + end + end + + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/parser-3.1.2.0/lib/parser/source/map/keyword.rb b/vendor/bundle/ruby/3.1.0/gems/parser-3.1.2.0/lib/parser/source/map/keyword.rb new file mode 100644 index 000000000..15bf1e4e8 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/parser-3.1.2.0/lib/parser/source/map/keyword.rb @@ -0,0 +1,20 @@ +# frozen_string_literal: true + +module Parser + module Source + + class Map::Keyword < Map + attr_reader :keyword + attr_reader :begin + attr_reader :end + + def initialize(keyword_l, begin_l, end_l, expression_l) + @keyword = keyword_l + @begin, @end = begin_l, end_l + + super(expression_l) + end + end + + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/parser-3.1.2.0/lib/parser/source/map/method_definition.rb b/vendor/bundle/ruby/3.1.0/gems/parser-3.1.2.0/lib/parser/source/map/method_definition.rb new file mode 100644 index 000000000..12f6b9f18 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/parser-3.1.2.0/lib/parser/source/map/method_definition.rb @@ -0,0 +1,25 @@ +# frozen_string_literal: true + +module Parser + module Source + + class Map::MethodDefinition < Map + attr_reader :keyword + attr_reader :operator + attr_reader :name + attr_reader :end + attr_reader :assignment + + def initialize(keyword_l, operator_l, name_l, end_l, assignment_l, body_l) + @keyword = keyword_l + @operator = operator_l + @name = name_l + @end = end_l + @assignment = assignment_l + + super(@keyword.join(end_l || body_l)) + end + end + + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/parser-3.1.2.0/lib/parser/source/map/objc_kwarg.rb b/vendor/bundle/ruby/3.1.0/gems/parser-3.1.2.0/lib/parser/source/map/objc_kwarg.rb new file mode 100644 index 000000000..33bd6a8b7 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/parser-3.1.2.0/lib/parser/source/map/objc_kwarg.rb @@ -0,0 +1,19 @@ +# frozen_string_literal: true + +module Parser + module Source + + class Map::ObjcKwarg < Map + attr_reader :keyword + attr_reader :operator + attr_reader :argument + + def initialize(keyword_l, operator_l, argument_l, expression_l) + @keyword, @operator, @argument = keyword_l, operator_l, argument_l + + super(expression_l) + end + end + + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/parser-3.1.2.0/lib/parser/source/map/operator.rb b/vendor/bundle/ruby/3.1.0/gems/parser-3.1.2.0/lib/parser/source/map/operator.rb new file mode 100644 index 000000000..c54e61821 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/parser-3.1.2.0/lib/parser/source/map/operator.rb @@ -0,0 +1,17 @@ +# frozen_string_literal: true + +module Parser + module Source + + class Map::Operator < Map + attr_reader :operator + + def initialize(operator, expression) + @operator = operator + + super(expression) + end + end + + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/parser-3.1.2.0/lib/parser/source/map/rescue_body.rb b/vendor/bundle/ruby/3.1.0/gems/parser-3.1.2.0/lib/parser/source/map/rescue_body.rb new file mode 100644 index 000000000..92edd8904 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/parser-3.1.2.0/lib/parser/source/map/rescue_body.rb @@ -0,0 +1,21 @@ +# frozen_string_literal: true + +module Parser + module Source + + class Map::RescueBody < Map + attr_reader :keyword + attr_reader :assoc + attr_reader :begin + + def initialize(keyword_l, assoc_l, begin_l, expression_l) + @keyword = keyword_l + @assoc = assoc_l + @begin = begin_l + + super(expression_l) + end + end + + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/parser-3.1.2.0/lib/parser/source/map/send.rb b/vendor/bundle/ruby/3.1.0/gems/parser-3.1.2.0/lib/parser/source/map/send.rb new file mode 100644 index 000000000..659d6d48f --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/parser-3.1.2.0/lib/parser/source/map/send.rb @@ -0,0 +1,36 @@ +# frozen_string_literal: true + +module Parser + module Source + + class Map::Send < Map + attr_reader :dot + attr_reader :selector + attr_reader :operator + attr_reader :begin + attr_reader :end + + def initialize(dot_l, selector_l, begin_l, end_l, expression_l) + @dot = dot_l + @selector = selector_l + @begin, @end = begin_l, end_l + + super(expression_l) + end + + ## + # @api private + # + def with_operator(operator_l) + with { |map| map.update_operator(operator_l) } + end + + protected + + def update_operator(operator_l) + @operator = operator_l + end + end + + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/parser-3.1.2.0/lib/parser/source/map/ternary.rb b/vendor/bundle/ruby/3.1.0/gems/parser-3.1.2.0/lib/parser/source/map/ternary.rb new file mode 100644 index 000000000..312d8c73a --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/parser-3.1.2.0/lib/parser/source/map/ternary.rb @@ -0,0 +1,18 @@ +# frozen_string_literal: true + +module Parser + module Source + + class Map::Ternary < Map + attr_reader :question + attr_reader :colon + + def initialize(question_l, colon_l, expression_l) + @question, @colon = question_l, colon_l + + super(expression_l) + end + end + + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/parser-3.1.2.0/lib/parser/source/map/variable.rb b/vendor/bundle/ruby/3.1.0/gems/parser-3.1.2.0/lib/parser/source/map/variable.rb new file mode 100644 index 000000000..479f7049f --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/parser-3.1.2.0/lib/parser/source/map/variable.rb @@ -0,0 +1,31 @@ +# frozen_string_literal: true + +module Parser + module Source + + class Map::Variable < Map + attr_reader :name + attr_reader :operator + + def initialize(name_l, expression_l=name_l) + @name = name_l + + super(expression_l) + end + + ## + # @api private + # + def with_operator(operator_l) + with { |map| map.update_operator(operator_l) } + end + + protected + + def update_operator(operator_l) + @operator = operator_l + end + end + + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/parser-3.1.2.0/lib/parser/source/range.rb b/vendor/bundle/ruby/3.1.0/gems/parser-3.1.2.0/lib/parser/source/range.rb new file mode 100644 index 000000000..cc1d63961 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/parser-3.1.2.0/lib/parser/source/range.rb @@ -0,0 +1,326 @@ +# frozen_string_literal: true + +module Parser + module Source + + ## + # A range of characters in a particular source buffer. + # + # The range is always exclusive, i.e. a range with `begin_pos` of 3 and + # `end_pos` of 5 will contain the following characters: + # + # example + # ^^ + # + # @!attribute [r] source_buffer + # @return [Parser::Source::Buffer] + # + # @!attribute [r] begin_pos + # @return [Integer] index of the first character in the range + # + # @!attribute [r] end_pos + # @return [Integer] index of the character after the last character in the range + # + # @api public + # + class Range + include Comparable + + attr_reader :source_buffer + attr_reader :begin_pos, :end_pos + + ## + # @param [Buffer] source_buffer + # @param [Integer] begin_pos + # @param [Integer] end_pos + # + def initialize(source_buffer, begin_pos, end_pos) + if end_pos < begin_pos + raise ArgumentError, 'Parser::Source::Range: end_pos must not be less than begin_pos' + end + if source_buffer.nil? + raise ArgumentError, 'Parser::Source::Range: source_buffer must not be nil' + end + + @source_buffer = source_buffer + @begin_pos, @end_pos = begin_pos, end_pos + + freeze + end + + ## + # @return [Range] a zero-length range located just before the beginning + # of this range. + # + def begin + with(end_pos: @begin_pos) + end + + ## + # @return [Range] a zero-length range located just after the end + # of this range. + # + def end + with(begin_pos: @end_pos) + end + + ## + # @return [Integer] amount of characters included in this range. + # + def size + @end_pos - @begin_pos + end + + alias length size + + ## + # Line number of the beginning of this range. By default, the first line + # of a buffer is 1; as such, line numbers are most commonly one-based. + # + # @see Buffer + # @return [Integer] line number of the beginning of this range. + # + def line + @source_buffer.line_for_position(@begin_pos) + end + + alias_method :first_line, :line + + ## + # @return [Integer] zero-based column number of the beginning of this range. + # + def column + @source_buffer.column_for_position(@begin_pos) + end + + ## + # @return [Integer] line number of the end of this range. + # + def last_line + @source_buffer.line_for_position(@end_pos) + end + + ## + # @return [Integer] zero-based column number of the end of this range. + # + def last_column + @source_buffer.column_for_position(@end_pos) + end + + ## + # @return [::Range] a range of columns spanned by this range. + # @raise RangeError + # + def column_range + if line != last_line + raise RangeError, "#{self.inspect} spans more than one line" + end + + column...last_column + end + + ## + # @return [String] a line of source code containing the beginning of this range. + # + def source_line + @source_buffer.source_line(line) + end + + ## + # @return [String] all source code covered by this range. + # + def source + @source_buffer.slice(self.begin_pos...self.end_pos) + end + + ## + # `is?` provides a concise way to compare the source corresponding to this range. + # For example, `r.source == '(' || r.source == 'begin'` is equivalent to + # `r.is?('(', 'begin')`. + # + def is?(*what) + what.include?(source) + end + + ## + # @return [Array] a set of character indexes contained in this range. + # + def to_a + (@begin_pos...@end_pos).to_a + end + + ## + # @return [Range] a Ruby range with the same `begin_pos` and `end_pos` + # + def to_range + self.begin_pos...self.end_pos + end + + ## + # Composes a GNU/Clang-style string representation of the beginning of this + # range. + # + # For example, for the following range in file `foo.rb`, + # + # def foo + # ^^^ + # + # `to_s` will return `foo.rb:1:5`. + # Note that the column index is one-based. + # + # @return [String] + # + def to_s + line, column = @source_buffer.decompose_position(@begin_pos) + + [@source_buffer.name, line, column + 1].join(':') + end + + ## + # @param [Hash] Endpoint(s) to change, any combination of :begin_pos or :end_pos + # @return [Range] the same range as this range but with the given end point(s) changed + # to the given value(s). + # + def with(begin_pos: @begin_pos, end_pos: @end_pos) + Range.new(@source_buffer, begin_pos, end_pos) + end + + ## + # @param [Hash] Endpoint(s) to change, any combination of :begin_pos or :end_pos + # @return [Range] the same range as this range but with the given end point(s) adjusted + # by the given amount(s) + # + def adjust(begin_pos: 0, end_pos: 0) + Range.new(@source_buffer, @begin_pos + begin_pos, @end_pos + end_pos) + end + + ## + # @param [Integer] new_size + # @return [Range] a range beginning at the same point as this range and length `new_size`. + # + def resize(new_size) + with(end_pos: @begin_pos + new_size) + end + + ## + # @param [Range] other + # @return [Range] smallest possible range spanning both this range and `other`. + # + def join(other) + Range.new(@source_buffer, + [@begin_pos, other.begin_pos].min, + [@end_pos, other.end_pos].max) + end + + ## + # @param [Range] other + # @return [Range] overlapping region of this range and `other`, or `nil` + # if they do not overlap + # + def intersect(other) + unless disjoint?(other) + Range.new(@source_buffer, + [@begin_pos, other.begin_pos].max, + [@end_pos, other.end_pos].min) + end + end + + ## + # Return `true` iff this range and `other` are disjoint. + # + # Two ranges must be one and only one of ==, disjoint?, contains?, contained? or crossing? + # + # @param [Range] other + # @return [Boolean] + # + def disjoint?(other) + if empty? && other.empty? + @begin_pos != other.begin_pos + else + @begin_pos >= other.end_pos || other.begin_pos >= @end_pos + end + end + + ## + # Return `true` iff this range is not disjoint from `other`. + # + # @param [Range] other + # @return [Boolean] `true` if this range and `other` overlap + # + def overlaps?(other) + !disjoint?(other) + end + + ## + # Returns true iff this range contains (strictly) `other`. + # + # Two ranges must be one and only one of ==, disjoint?, contains?, contained? or crossing? + # + # @param [Range] other + # @return [Boolean] + # + def contains?(other) + (other.begin_pos <=> @begin_pos) + (@end_pos <=> other.end_pos) >= (other.empty? ? 2 : 1) + end + + ## + # Return `other.contains?(self)` + # + # Two ranges must be one and only one of ==, disjoint?, contains?, contained? or crossing? + # + # @param [Range] other + # @return [Boolean] + # + def contained?(other) + other.contains?(self) + end + + ## + # Returns true iff both ranges intersect and also have different elements from one another. + # + # Two ranges must be one and only one of ==, disjoint?, contains?, contained? or crossing? + # + # @param [Range] other + # @return [Boolean] + # + def crossing?(other) + return false unless overlaps?(other) + (@begin_pos <=> other.begin_pos) * (@end_pos <=> other.end_pos) == 1 + end + + ## + # Checks if a range is empty; if it contains no characters + # @return [Boolean] + def empty? + @begin_pos == @end_pos + end + + ## + # Compare ranges, first by begin_pos, then by end_pos. + # + def <=>(other) + return nil unless other.is_a?(::Parser::Source::Range) && + @source_buffer == other.source_buffer + (@begin_pos <=> other.begin_pos).nonzero? || + (@end_pos <=> other.end_pos) + end + + alias_method :eql?, :== + + ## + # Support for Ranges be used in as Hash indices and in Sets. + # + def hash + [@source_buffer, @begin_pos, @end_pos].hash + end + + ## + # @return [String] a human-readable representation of this range. + # + def inspect + "#" + end + end + + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/parser-3.1.2.0/lib/parser/source/rewriter.rb b/vendor/bundle/ruby/3.1.0/gems/parser-3.1.2.0/lib/parser/source/rewriter.rb new file mode 100644 index 000000000..23a6fb99b --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/parser-3.1.2.0/lib/parser/source/rewriter.rb @@ -0,0 +1,513 @@ +# frozen_string_literal: true + +module Parser + module Source + + ## + # {Rewriter} is deprecated. Use {TreeRewriter} instead. + # + # TreeRewriter has simplified semantics, and customizable policies + # with regards to clobbering. Please read the documentation. + # + # Keep in mind: + # - Rewriter was discarding the `end_pos` of the given range for `insert_before`, + # and the `begin_pos` for `insert_after`. These are meaningful in TreeRewriter. + # - TreeRewriter's wrap/insert_before/insert_after are multiple by default, while + # Rewriter would raise clobbering errors if the non '_multi' version was called. + # - The TreeRewriter policy closest to Rewriter's behavior is: + # different_replacements: :raise, + # swallowed_insertions: :raise, + # crossing_deletions: :accept + # + # @!attribute [r] source_buffer + # @return [Source::Buffer] + # + # @!attribute [r] diagnostics + # @return [Diagnostic::Engine] + # + # @api public + # @deprecated Use {TreeRewriter} + # + class Rewriter + attr_reader :source_buffer + attr_reader :diagnostics + + ## + # @param [Source::Buffer] source_buffer + # @deprecated Use {TreeRewriter} + # + def initialize(source_buffer) + self.class.warn_of_deprecation + @diagnostics = Diagnostic::Engine.new + @diagnostics.consumer = lambda do |diag| + $stderr.puts diag.render + end + + @source_buffer = source_buffer + @queue = [] + @clobber = 0 + @insertions = 0 # clobbered zero-length positions; index 0 is the far left + + @insert_before_multi_order = 0 + @insert_after_multi_order = 0 + + @pending_queue = nil + @pending_clobber = nil + @pending_insertions = nil + end + + ## + # Removes the source range. + # + # @param [Range] range + # @return [Rewriter] self + # @raise [ClobberingError] when clobbering is detected + # @deprecated Use {TreeRewriter#remove} + # + def remove(range) + append Rewriter::Action.new(range, ''.freeze) + end + + ## + # Inserts new code before the given source range. + # + # @param [Range] range + # @param [String] content + # @return [Rewriter] self + # @raise [ClobberingError] when clobbering is detected + # @deprecated Use {TreeRewriter#insert_before} + # + def insert_before(range, content) + append Rewriter::Action.new(range.begin, content) + end + + ## + # Inserts new code before and after the given source range. + # + # @param [Range] range + # @param [String] before + # @param [String] after + # @return [Rewriter] self + # @raise [ClobberingError] when clobbering is detected + # @deprecated Use {TreeRewriter#wrap} + # + def wrap(range, before, after) + append Rewriter::Action.new(range.begin, before) + append Rewriter::Action.new(range.end, after) + end + + ## + # Inserts new code before the given source range by allowing other + # insertions at the same position. + # Note that an insertion with latter invocation comes _before_ earlier + # insertion at the same position in the rewritten source. + # + # @example Inserting '[(' + # rewriter. + # insert_before_multi(range, '('). + # insert_before_multi(range, '['). + # process + # + # @param [Range] range + # @param [String] content + # @return [Rewriter] self + # @raise [ClobberingError] when clobbering is detected + # @deprecated Use {TreeRewriter#insert_before} + # + def insert_before_multi(range, content) + @insert_before_multi_order -= 1 + append Rewriter::Action.new(range.begin, content, true, @insert_before_multi_order) + end + + ## + # Inserts new code after the given source range. + # + # @param [Range] range + # @param [String] content + # @return [Rewriter] self + # @raise [ClobberingError] when clobbering is detected + # @deprecated Use {TreeRewriter#insert_after} + # + def insert_after(range, content) + append Rewriter::Action.new(range.end, content) + end + + ## + # Inserts new code after the given source range by allowing other + # insertions at the same position. + # Note that an insertion with latter invocation comes _after_ earlier + # insertion at the same position in the rewritten source. + # + # @example Inserting ')]' + # rewriter. + # insert_after_multi(range, ')'). + # insert_after_multi(range, ']'). + # process + # + # @param [Range] range + # @param [String] content + # @return [Rewriter] self + # @raise [ClobberingError] when clobbering is detected + # @deprecated Use {TreeRewriter#insert_after} + # + def insert_after_multi(range, content) + @insert_after_multi_order += 1 + append Rewriter::Action.new(range.end, content, true, @insert_after_multi_order) + end + + ## + # Replaces the code of the source range `range` with `content`. + # + # @param [Range] range + # @param [String] content + # @return [Rewriter] self + # @raise [ClobberingError] when clobbering is detected + # @deprecated Use {TreeRewriter#replace} + # + def replace(range, content) + append Rewriter::Action.new(range, content) + end + + ## + # Applies all scheduled changes to the `source_buffer` and returns + # modified source as a new string. + # + # @return [String] + # @deprecated Use {TreeRewriter#process} + # + def process + if in_transaction? + raise "Do not call #{self.class}##{__method__} inside a transaction" + end + + adjustment = 0 + source = @source_buffer.source.dup + + @queue.sort.each do |action| + begin_pos = action.range.begin_pos + adjustment + end_pos = begin_pos + action.range.length + + source[begin_pos...end_pos] = action.replacement + + adjustment += (action.replacement.length - action.range.length) + end + + source + end + + ## + # Provides a protected block where a sequence of multiple rewrite actions + # are handled atomically. If any of the actions failed by clobbering, + # all the actions are rolled back. + # + # @example + # begin + # rewriter.transaction do + # rewriter.insert_before(range_of_something, '(') + # rewriter.insert_after(range_of_something, ')') + # end + # rescue Parser::ClobberingError + # end + # + # @raise [RuntimeError] when no block is passed + # @raise [RuntimeError] when already in a transaction + # @deprecated Use {TreeRewriter#transaction} + # + def transaction + unless block_given? + raise "#{self.class}##{__method__} requires block" + end + + if in_transaction? + raise 'Nested transaction is not supported' + end + + @pending_queue = @queue.dup + @pending_clobber = @clobber + @pending_insertions = @insertions + + yield + + @queue = @pending_queue + @clobber = @pending_clobber + @insertions = @pending_insertions + + self + ensure + @pending_queue = nil + @pending_clobber = nil + @pending_insertions = nil + end + + private + + # Schedule a code update. If it overlaps with another update, check + # whether they conflict, and raise a clobbering error if they do. + # (As a special case, zero-length ranges at the same position are + # considered to "overlap".) Otherwise, merge them. + # + # Updates which are adjacent to each other, but do not overlap, are also + # merged. + # + # RULES: + # + # - Insertion ("replacing" a zero-length range): + # - Two insertions at the same point conflict. This is true even + # if the earlier insertion has already been merged with an adjacent + # update, and even if they are both inserting the same text. + # - An insertion never conflicts with a replace or remove operation + # on its right or left side, which does not overlap it (in other + # words, which does not update BOTH its right and left sides). + # - An insertion always conflicts with a remove operation which spans + # both its sides. + # - An insertion conflicts with a replace operation which spans both its + # sides, unless the replacement text is longer than the replaced text + # by the size of the insertion (or more), and the portion of + # replacement text immediately after the insertion position is + # identical to the inserted text. + # + # - Removal operations never conflict with each other. + # + # - Replacement operations: + # - Take the portion of each replacement text which falls within: + # - The other operation's replaced region + # - The other operation's replacement text, if it extends past the + # end of its own replaced region (in other words, if the replacement + # text is longer than the text it replaces) + # - If and only if the taken texts are identical for both operations, + # they do not conflict. + # + def append(action) + range = action.range + + # Is this an insertion? + if range.empty? + # Replacing nothing with... nothing? + return self if action.replacement.empty? + + if !action.allow_multiple_insertions? && (conflicting = clobbered_insertion?(range)) + raise_clobber_error(action, [conflicting]) + end + + record_insertion(range) + + if (adjacent = adjacent_updates?(range)) + conflicting = adjacent.find do |a| + a.range.overlaps?(range) && + !replace_compatible_with_insertion?(a, action) + end + raise_clobber_error(action, [conflicting]) if conflicting + + merge_actions!(action, adjacent) + else + active_queue << action + end + else + # It's a replace or remove operation. + if (insertions = adjacent_insertions?(range)) + insertions.each do |insertion| + if range.overlaps?(insertion.range) && + !replace_compatible_with_insertion?(action, insertion) + raise_clobber_error(action, [insertion]) + else + action = merge_actions(action, [insertion]) + active_queue.delete(insertion) + end + end + end + + if (adjacent = adjacent_updates?(range)) + if can_merge?(action, adjacent) + record_replace(range) + merge_actions!(action, adjacent) + else + raise_clobber_error(action, adjacent) + end + else + record_replace(range) + active_queue << action + end + end + + self + end + + def record_insertion(range) + self.active_insertions = active_insertions | (1 << range.begin_pos) + end + + def record_replace(range) + self.active_clobber = active_clobber | clobbered_position_mask(range) + end + + def clobbered_position_mask(range) + ((1 << range.size) - 1) << range.begin_pos + end + + def adjacent_position_mask(range) + ((1 << (range.size + 2)) - 1) << (range.begin_pos - 1) + end + + def adjacent_insertion_mask(range) + ((1 << (range.size + 1)) - 1) << range.begin_pos + end + + def clobbered_insertion?(insertion) + insertion_pos = insertion.begin_pos + if active_insertions & (1 << insertion_pos) != 0 + # The clobbered insertion may have already been merged with other + # updates, so it won't necessarily have the same begin_pos. + active_queue.find do |a| + a.range.begin_pos <= insertion_pos && insertion_pos <= a.range.end_pos + end + end + end + + def adjacent_insertions?(range) + # Just retrieve insertions which have not been merged with an adjacent + # remove or replace. + if active_insertions & adjacent_insertion_mask(range) != 0 + result = active_queue.select do |a| + a.range.empty? && adjacent?(range, a.range) + end + result.empty? ? nil : result + end + end + + def adjacent_updates?(range) + if active_clobber & adjacent_position_mask(range) != 0 + active_queue.select { |a| adjacent?(range, a.range) } + end + end + + def replace_compatible_with_insertion?(replace, insertion) + (replace.replacement.length - replace.range.size) >= insertion.range.size && + (offset = insertion.range.begin_pos - replace.range.begin_pos) && + replace.replacement[offset, insertion.replacement.length] == insertion.replacement + end + + def can_merge?(action, existing) + # Compare 2 replace/remove operations (neither is an insertion) + range = action.range + + existing.all? do |other| + overlap = range.intersect(other.range) + next true if overlap.nil? # adjacent, not overlapping + + repl1_offset = overlap.begin_pos - range.begin_pos + repl2_offset = overlap.begin_pos - other.range.begin_pos + repl1_length = [other.range.length - repl2_offset, + other.replacement.length - repl2_offset].max + repl2_length = [range.length - repl1_offset, + action.replacement.length - repl1_offset].max + + replacement1 = action.replacement[repl1_offset, repl1_length] || ''.freeze + replacement2 = other.replacement[repl2_offset, repl2_length] || ''.freeze + replacement1 == replacement2 + end + end + + def merge_actions(action, existing) + actions = existing.push(action).sort_by do |a| + [a.range.begin_pos, a.range.end_pos] + end + range = actions.first.range.join(actions.max_by { |a| a.range.end_pos }.range) + + Rewriter::Action.new(range, merge_replacements(actions)) + end + + def merge_actions!(action, existing) + new_action = merge_actions(action, existing) + active_queue.delete(action) + replace_actions(existing, new_action) + end + + def merge_replacements(actions) + result = ''.dup + prev_act = nil + + actions.each do |act| + if !prev_act || act.range.disjoint?(prev_act.range) + result << act.replacement + else + prev_end = [prev_act.range.begin_pos + prev_act.replacement.length, + prev_act.range.end_pos].max + offset = prev_end - act.range.begin_pos + result << act.replacement[offset..-1] if offset < act.replacement.size + end + + prev_act = act + end + + result + end + + def replace_actions(old, updated) + old.each { |act| active_queue.delete(act) } + active_queue << updated + end + + def raise_clobber_error(action, existing) + # cannot replace 3 characters with "foobar" + diagnostic = Diagnostic.new(:error, + :invalid_action, + { :action => action }, + action.range) + @diagnostics.process(diagnostic) + + # clobbered by: remove 3 characters + diagnostic = Diagnostic.new(:note, + :clobbered, + { :action => existing[0] }, + existing[0].range) + @diagnostics.process(diagnostic) + + raise ClobberingError, "Parser::Source::Rewriter detected clobbering" + end + + def in_transaction? + !@pending_queue.nil? + end + + def active_queue + @pending_queue || @queue + end + + def active_clobber + @pending_clobber || @clobber + end + + def active_insertions + @pending_insertions || @insertions + end + + def active_clobber=(value) + if @pending_clobber + @pending_clobber = value + else + @clobber = value + end + end + + def active_insertions=(value) + if @pending_insertions + @pending_insertions = value + else + @insertions = value + end + end + + def adjacent?(range1, range2) + range1.begin_pos <= range2.end_pos && range2.begin_pos <= range1.end_pos + end + + DEPRECATION_WARNING = [ + 'Parser::Source::Rewriter is deprecated.', + 'Please update your code to use Parser::Source::TreeRewriter instead' + ].join("\n").freeze + + extend Deprecation + end + + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/parser-3.1.2.0/lib/parser/source/rewriter/action.rb b/vendor/bundle/ruby/3.1.0/gems/parser-3.1.2.0/lib/parser/source/rewriter/action.rb new file mode 100644 index 000000000..908e6d107 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/parser-3.1.2.0/lib/parser/source/rewriter/action.rb @@ -0,0 +1,44 @@ +# frozen_string_literal: true + +module Parser + module Source + + ## + # @api private + # + class Rewriter::Action + include Comparable + + attr_reader :range, :replacement, :allow_multiple_insertions, :order + alias_method :allow_multiple_insertions?, :allow_multiple_insertions + + def initialize(range, replacement='', allow_multiple_insertions = false, order = 0) + @range = range + @replacement = replacement + @allow_multiple_insertions = allow_multiple_insertions + @order = order + + freeze + end + + def <=>(other) + result = range.begin_pos <=> other.range.begin_pos + return result unless result.zero? + order <=> other.order + end + + def to_s + if @range.length == 0 && @replacement.empty? + 'do nothing' + elsif @range.length == 0 + "insert #{@replacement.inspect}" + elsif @replacement.empty? + "remove #{@range.length} character(s)" + else + "replace #{@range.length} character(s) with #{@replacement.inspect}" + end + end + end + + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/parser-3.1.2.0/lib/parser/source/tree_rewriter.rb b/vendor/bundle/ruby/3.1.0/gems/parser-3.1.2.0/lib/parser/source/tree_rewriter.rb new file mode 100644 index 000000000..2bbff5827 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/parser-3.1.2.0/lib/parser/source/tree_rewriter.rb @@ -0,0 +1,431 @@ +# frozen_string_literal: true + +module Parser + module Source + + ## + # {TreeRewriter} performs the heavy lifting in the source rewriting process. + # It schedules code updates to be performed in the correct order. + # + # For simple cases, the resulting source will be obvious. + # + # Examples for more complex cases follow. Assume these examples are acting on + # the source `'puts(:hello, :world)`. The methods #wrap, #remove, etc. + # receive a Range as first argument; for clarity, examples below use english + # sentences and a string of raw code instead. + # + # ## Overlapping ranges: + # + # Any two rewriting actions on overlapping ranges will fail and raise + # a `ClobberingError`, unless they are both deletions (covered next). + # + # * wrap ':hello, ' with '(' and ')' + # * wrap ', :world' with '(' and ')' + # => CloberringError + # + # ## Overlapping deletions: + # + # * remove ':hello, ' + # * remove ', :world' + # + # The overlapping ranges are merged and `':hello, :world'` will be removed. + # This policy can be changed. `:crossing_deletions` defaults to `:accept` + # but can be set to `:warn` or `:raise`. + # + # ## Multiple actions at the same end points: + # + # Results will always be independent on the order they were given. + # Exception: rewriting actions done on exactly the same range (covered next). + # + # Example: + # * replace ', ' by ' => ' + # * wrap ':hello, :world' with '{' and '}' + # * replace ':world' with ':everybody' + # * wrap ':world' with '[', ']' + # + # The resulting string will be `'puts({:hello => [:everybody]})'` + # and this result is independent on the order the instructions were given in. + # + # Note that if the two "replace" were given as a single replacement of ', :world' + # for ' => :everybody', the result would be a `ClobberingError` because of the wrap + # in square brackets. + # + # ## Multiple wraps on same range: + # * wrap ':hello' with '(' and ')' + # * wrap ':hello' with '[' and ']' + # + # The wraps are combined in order given and results would be `'puts([(:hello)], :world)'`. + # + # ## Multiple replacements on same range: + # * replace ':hello' by ':hi', then + # * replace ':hello' by ':hey' + # + # The replacements are made in the order given, so the latter replacement + # supersedes the former and ':hello' will be replaced by ':hey'. + # + # This policy can be changed. `:different_replacements` defaults to `:accept` + # but can be set to `:warn` or `:raise`. + # + # ## Swallowed insertions: + # wrap 'world' by '__', '__' + # replace ':hello, :world' with ':hi' + # + # A containing replacement will swallow the contained rewriting actions + # and `':hello, :world'` will be replaced by `':hi'`. + # + # This policy can be changed for swallowed insertions. `:swallowed_insertions` + # defaults to `:accept` but can be set to `:warn` or `:raise` + # + # ## Implementation + # The updates are organized in a tree, according to the ranges they act on + # (where children are strictly contained by their parent), hence the name. + # + # @!attribute [r] source_buffer + # @return [Source::Buffer] + # + # @!attribute [r] diagnostics + # @return [Diagnostic::Engine] + # + # @api public + # + class TreeRewriter + attr_reader :source_buffer + attr_reader :diagnostics + + ## + # @param [Source::Buffer] source_buffer + # + def initialize(source_buffer, + crossing_deletions: :accept, + different_replacements: :accept, + swallowed_insertions: :accept) + @diagnostics = Diagnostic::Engine.new + @diagnostics.consumer = -> diag { $stderr.puts diag.render } + + @source_buffer = source_buffer + @in_transaction = false + + @policy = {crossing_deletions: crossing_deletions, + different_replacements: different_replacements, + swallowed_insertions: swallowed_insertions}.freeze + check_policy_validity + + @enforcer = method(:enforce_policy) + # We need a range that would be jugded as containing all other ranges, + # including 0...0 and size...size: + all_encompassing_range = @source_buffer.source_range.adjust(begin_pos: -1, end_pos: +1) + @action_root = TreeRewriter::Action.new(all_encompassing_range, @enforcer) + end + + ## + # Returns true iff no (non trivial) update has been recorded + # + # @return [Boolean] + # + def empty? + @action_root.empty? + end + + ## + # Merges the updates of argument with the receiver. + # Policies of the receiver are used. + # This action is atomic in that it won't change the receiver + # unless it succeeds. + # + # @param [Rewriter] with + # @return [Rewriter] self + # @raise [ClobberingError] when clobbering is detected + # + def merge!(with) + raise 'TreeRewriter are not for the same source_buffer' unless + source_buffer == with.source_buffer + + @action_root = @action_root.combine(with.action_root) + self + end + + ## + # Returns a new rewriter that consists of the updates of the received + # and the given argument. Policies of the receiver are used. + # + # @param [Rewriter] with + # @return [Rewriter] merge of receiver and argument + # @raise [ClobberingError] when clobbering is detected + # + def merge(with) + dup.merge!(with) + end + + ## + # For special cases where one needs to merge a rewriter attached to a different source_buffer + # or that needs to be offset. Policies of the receiver are used. + # + # @param [TreeRewriter] rewriter from different source_buffer + # @param [Integer] offset + # @return [Rewriter] self + # @raise [IndexError] if action ranges (once offset) don't fit the current buffer + # + def import!(foreign_rewriter, offset: 0) + return self if foreign_rewriter.empty? + + contracted = foreign_rewriter.action_root.contract + merge_effective_range = ::Parser::Source::Range.new( + @source_buffer, + contracted.range.begin_pos + offset, + contracted.range.end_pos + offset, + ) + check_range_validity(merge_effective_range) + + merge_with = contracted.moved(@source_buffer, offset) + + @action_root = @action_root.combine(merge_with) + self + end + + ## + # Replaces the code of the source range `range` with `content`. + # + # @param [Range] range + # @param [String] content + # @return [Rewriter] self + # @raise [ClobberingError] when clobbering is detected + # + def replace(range, content) + combine(range, replacement: content) + end + + ## + # Inserts the given strings before and after the given range. + # + # @param [Range] range + # @param [String, nil] insert_before + # @param [String, nil] insert_after + # @return [Rewriter] self + # @raise [ClobberingError] when clobbering is detected + # + def wrap(range, insert_before, insert_after) + combine(range, insert_before: insert_before.to_s, insert_after: insert_after.to_s) + end + + ## + # Shortcut for `replace(range, '')` + # + # @param [Range] range + # @return [Rewriter] self + # @raise [ClobberingError] when clobbering is detected + # + def remove(range) + replace(range, ''.freeze) + end + + + ## + # Shortcut for `wrap(range, content, nil)` + # + # @param [Range] range + # @param [String] content + # @return [Rewriter] self + # @raise [ClobberingError] when clobbering is detected + # + def insert_before(range, content) + wrap(range, content, nil) + end + + ## + # Shortcut for `wrap(range, nil, content)` + # + # @param [Range] range + # @param [String] content + # @return [Rewriter] self + # @raise [ClobberingError] when clobbering is detected + # + def insert_after(range, content) + wrap(range, nil, content) + end + + ## + # Applies all scheduled changes to the `source_buffer` and returns + # modified source as a new string. + # + # @return [String] + # + def process + source = @source_buffer.source + + chunks = [] + last_end = 0 + @action_root.ordered_replacements.each do |range, replacement| + chunks << source[last_end...range.begin_pos] << replacement + last_end = range.end_pos + end + chunks << source[last_end...source.length] + chunks.join + end + + ## + # Returns a representation of the rewriter as an ordered list of replacements. + # + # rewriter.as_replacements # => [ [1...1, '('], + # [2...4, 'foo'], + # [5...6, ''], + # [6...6, '!'], + # [10...10, ')'], + # ] + # + # This representation is sufficient to recreate the result of `process` but it is + # not sufficient to recreate completely the rewriter for further merging/actions. + # See `as_nested_actions` + # + # @return [Array] an ordered list of pairs of range & replacement + # + def as_replacements + @action_root.ordered_replacements + end + + ## + # Returns a representation of the rewriter as nested insertions (:wrap) and replacements. + # + # rewriter.as_actions # =>[ [:wrap, 1...10, '(', ')'], + # [:wrap, 2...6, '', '!'], # aka "insert_after" + # [:replace, 2...4, 'foo'], + # [:replace, 5...6, ''], # aka "removal" + # ], + # + # Contrary to `as_replacements`, this representation is sufficient to recreate exactly + # the rewriter. + # + # @return [Array<(Symbol, Range, String{, String})>] + # + def as_nested_actions + @action_root.nested_actions + end + + ## + # Provides a protected block where a sequence of multiple rewrite actions + # are handled atomically. If any of the actions failed by clobbering, + # all the actions are rolled back. Transactions can be nested. + # + # @raise [RuntimeError] when no block is passed + # + def transaction + unless block_given? + raise "#{self.class}##{__method__} requires block" + end + + previous = @in_transaction + @in_transaction = true + restore_root = @action_root + + yield + + restore_root = nil + + self + ensure + @action_root = restore_root if restore_root + @in_transaction = previous + end + + def in_transaction? + @in_transaction + end + + # :nodoc: + def inspect + "#<#{self.class} #{source_buffer.name}: #{action_summary}>" + end + + ## + # @api private + # @deprecated Use insert_after or wrap + # + def insert_before_multi(range, text) + self.class.warn_of_deprecation + insert_before(range, text) + end + + ## + # @api private + # @deprecated Use insert_after or wrap + # + def insert_after_multi(range, text) + self.class.warn_of_deprecation + insert_after(range, text) + end + + DEPRECATION_WARNING = [ + 'TreeRewriter#insert_before_multi and insert_before_multi exist only for legacy compatibility.', + 'Please update your code to use `wrap`, `insert_before` or `insert_after` instead.' + ].join("\n").freeze + + extend Deprecation + + protected + + attr_reader :action_root + + private + + def action_summary + replacements = as_replacements + case replacements.size + when 0 then return 'empty' + when 1..3 then #ok + else + replacements = replacements.first(3) + suffix = '…' + end + parts = replacements.map do |(range, str)| + if str.empty? # is this a deletion? + "-#{range.to_range}" + elsif range.size == 0 # is this an insertion? + "+#{str.inspect}@#{range.begin_pos}" + else # it is a replacement + "^#{str.inspect}@#{range.to_range}" + end + end + parts << suffix if suffix + parts.join(', ') + end + + ACTIONS = %i[accept warn raise].freeze + def check_policy_validity + invalid = @policy.values - ACTIONS + raise ArgumentError, "Invalid policy: #{invalid.join(', ')}" unless invalid.empty? + end + + def combine(range, attributes) + range = check_range_validity(range) + action = TreeRewriter::Action.new(range, @enforcer, **attributes) + @action_root = @action_root.combine(action) + self + end + + def check_range_validity(range) + if range.begin_pos < 0 || range.end_pos > @source_buffer.source.size + raise IndexError, "The range #{range.to_range} is outside the bounds of the source" + end + range + end + + def enforce_policy(event) + return if @policy[event] == :accept + return unless (values = yield) + trigger_policy(event, **values) + end + + POLICY_TO_LEVEL = {warn: :warning, raise: :error}.freeze + def trigger_policy(event, range: raise, conflict: nil, **arguments) + action = @policy[event] || :raise + diag = Parser::Diagnostic.new(POLICY_TO_LEVEL[action], event, arguments, range) + @diagnostics.process(diag) + if conflict + range, *highlights = conflict + diag = Parser::Diagnostic.new(POLICY_TO_LEVEL[action], :"#{event}_conflict", arguments, range, highlights) + @diagnostics.process(diag) + end + raise Parser::ClobberingError, "Parser::Source::TreeRewriter detected clobbering" if action == :raise + end + end + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/parser-3.1.2.0/lib/parser/source/tree_rewriter/action.rb b/vendor/bundle/ruby/3.1.0/gems/parser-3.1.2.0/lib/parser/source/tree_rewriter/action.rb new file mode 100644 index 000000000..26cc02600 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/parser-3.1.2.0/lib/parser/source/tree_rewriter/action.rb @@ -0,0 +1,242 @@ +# frozen_string_literal: true + +module Parser + module Source + ## + # @api private + # + # Actions are arranged in a tree and get combined so that: + # children are strictly contained by their parent + # sibblings all disjoint from one another and ordered + # only actions with replacement==nil may have children + # + class TreeRewriter::Action + attr_reader :range, :replacement, :insert_before, :insert_after + + def initialize(range, enforcer, + insert_before: '', + replacement: nil, + insert_after: '', + children: [] + ) + @range, @enforcer, @children, @insert_before, @replacement, @insert_after = + range, enforcer, children.freeze, insert_before.freeze, replacement, insert_after.freeze + + freeze + end + + def combine(action) + return self if action.empty? # Ignore empty action + do_combine(action) + end + + def empty? + @insert_before.empty? && + @insert_after.empty? && + @children.empty? && + (@replacement == nil || (@replacement.empty? && @range.empty?)) + end + + def ordered_replacements + reps = [] + reps << [@range.begin, @insert_before] unless @insert_before.empty? + reps << [@range, @replacement] if @replacement + reps.concat(@children.flat_map(&:ordered_replacements)) + reps << [@range.end, @insert_after] unless @insert_after.empty? + reps + end + + def nested_actions + actions = [] + actions << [:wrap, @range, @insert_before, @insert_after] if !@insert_before.empty? || + !@insert_after.empty? + actions << [:replace, @range, @replacement] if @replacement + actions.concat(@children.flat_map(&:nested_actions)) + end + + def insertion? + !insert_before.empty? || !insert_after.empty? || (replacement && !replacement.empty?) + end + + ## + # A root action has its range set to the whole source range, even + # though it typically do not act on that range. + # This method returns the action as if it was a child action with + # its range contracted. + # @return [Action] + def contract + raise 'Empty actions can not be contracted' if empty? + return self if insertion? + range = @range.with( + begin_pos: children.first.range.begin_pos, + end_pos: children.last.range.end_pos, + ) + with(range: range) + end + + ## + # @return [Action] that has been moved to the given source_buffer and with the given offset + # No check is done on validity of resulting range. + def moved(source_buffer, offset) + moved_range = ::Parser::Source::Range.new( + source_buffer, + @range.begin_pos + offset, + @range.end_pos + offset + ) + with( + range: moved_range, + children: children.map { |child| child.moved(source_buffer, offset) } + ) + end + + protected + + attr_reader :children + + def with(range: @range, enforcer: @enforcer, children: @children, insert_before: @insert_before, replacement: @replacement, insert_after: @insert_after) + children = swallow(children) if replacement + self.class.new(range, enforcer, children: children, insert_before: insert_before, replacement: replacement, insert_after: insert_after) + end + + # Assumes range.contains?(action.range) && action.children.empty? + def do_combine(action) + if action.range == @range + merge(action) + else + place_in_hierarchy(action) + end + end + + def place_in_hierarchy(action) + family = analyse_hierarchy(action) + + if family[:fusible] + fuse_deletions(action, family[:fusible], [*family[:sibbling_left], *family[:child], *family[:sibbling_right]]) + else + extra_sibbling = if family[:parent] # action should be a descendant of one of the children + family[:parent].do_combine(action) + elsif family[:child] # or it should become the parent of some of the children, + action.with(children: family[:child], enforcer: @enforcer) + .combine_children(action.children) + else # or else it should become an additional child + action + end + with(children: [*family[:sibbling_left], extra_sibbling, *family[:sibbling_right]]) + end + end + + # Assumes `more_children` all contained within `@range` + def combine_children(more_children) + more_children.inject(self) do |parent, new_child| + parent.place_in_hierarchy(new_child) + end + end + + def fuse_deletions(action, fusible, other_sibblings) + without_fusible = with(children: other_sibblings) + fused_range = [action, *fusible].map(&:range).inject(:join) + fused_deletion = action.with(range: fused_range) + without_fusible.do_combine(fused_deletion) + end + + # Similar to @children.bsearch_index || size + # except allows for a starting point + # and `bsearch_index` is only Ruby 2.3+ + def bsearch_child_index(from = 0) + size = @children.size + (from...size).bsearch { |i| yield @children[i] } || size + end + + # Returns the children in a hierarchy with respect to `action`: + # :sibbling_left, sibbling_right (for those that are disjoint from `action`) + # :parent (in case one of our children contains `action`) + # :child (in case `action` strictly contains some of our children) + # :fusible (in case `action` overlaps some children but they can be fused in one deletion) + # or raises a `CloberingError` + # In case a child has equal range to `action`, it is returned as `:parent` + # Reminder: an empty range 1...1 is considered disjoint from 1...10 + def analyse_hierarchy(action) + r = action.range + # left_index is the index of the first child that isn't completely to the left of action + left_index = bsearch_child_index { |child| child.range.end_pos > r.begin_pos } + # right_index is the index of the first child that is completely on the right of action + start = left_index == 0 ? 0 : left_index - 1 # See "corner case" below for reason of -1 + right_index = bsearch_child_index(start) { |child| child.range.begin_pos >= r.end_pos } + center = right_index - left_index + case center + when 0 + # All children are disjoint from action, nothing else to do + when -1 + # Corner case: if a child has empty range == action's range + # then it will appear to be both disjoint and to the left of action, + # as well as disjoint and to the right of action. + # Since ranges are equal, we return it as parent + left_index -= 1 # Fix indices, as otherwise this child would be + right_index += 1 # considered as a sibbling (both left and right!) + parent = @children[left_index] + else + overlap_left = @children[left_index].range.begin_pos <=> r.begin_pos + overlap_right = @children[right_index-1].range.end_pos <=> r.end_pos + + # For one child to be the parent of action, we must have: + if center == 1 && overlap_left <= 0 && overlap_right >= 0 + parent = @children[left_index] + else + # Otherwise consider all non disjoint elements (center) to be contained... + contained = @children[left_index...right_index] + fusible = check_fusible(action, + (contained.shift if overlap_left < 0), # ... but check first and last one + (contained.pop if overlap_right > 0) # ... for overlaps + ) + end + end + + { + parent: parent, + sibbling_left: @children[0...left_index], + sibbling_right: @children[right_index...@children.size], + fusible: fusible, + child: contained, + } + end + + # @param [Array(Action | nil)] fusible + def check_fusible(action, *fusible) + fusible.compact! + return if fusible.empty? + fusible.each do |child| + kind = action.insertion? || child.insertion? ? :crossing_insertions : :crossing_deletions + @enforcer.call(kind) { {range: action.range, conflict: child.range} } + end + fusible + end + + # Assumes action.range == range && action.children.empty? + def merge(action) + call_enforcer_for_merge(action) + with( + insert_before: "#{action.insert_before}#{insert_before}", + replacement: action.replacement || @replacement, + insert_after: "#{insert_after}#{action.insert_after}", + ).combine_children(action.children) + end + + def call_enforcer_for_merge(action) + @enforcer.call(:different_replacements) do + if @replacement && action.replacement && @replacement != action.replacement + {range: @range, replacement: action.replacement, other_replacement: @replacement} + end + end + end + + def swallow(children) + @enforcer.call(:swallowed_insertions) do + insertions = children.select(&:insertion?) + + {range: @range, conflict: insertions.map(&:range)} unless insertions.empty? + end + [] + end + end + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/parser-3.1.2.0/lib/parser/static_environment.rb b/vendor/bundle/ruby/3.1.0/gems/parser-3.1.2.0/lib/parser/static_environment.rb new file mode 100644 index 000000000..f6b5406be --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/parser-3.1.2.0/lib/parser/static_environment.rb @@ -0,0 +1,69 @@ +# frozen_string_literal: true + +module Parser + + class StaticEnvironment + FORWARD_ARGS = :FORWARD_ARGS + ANONYMOUS_BLOCKARG = :ANONYMOUS_BLOCKARG + + def initialize + reset + end + + def reset + @variables = Set[] + @stack = [] + end + + def extend_static + @stack.push(@variables) + @variables = Set[] + + self + end + + def extend_dynamic + @stack.push(@variables) + @variables = @variables.dup + + self + end + + def unextend + @variables = @stack.pop + + self + end + + def declare(name) + @variables.add(name.to_sym) + + self + end + + def declared?(name) + @variables.include?(name.to_sym) + end + + def declare_forward_args + declare(FORWARD_ARGS) + end + + def declared_forward_args? + declared?(FORWARD_ARGS) + end + + def declare_anonymous_blockarg + declare(ANONYMOUS_BLOCKARG) + end + + def declared_anonymous_blockarg? + declared?(ANONYMOUS_BLOCKARG) + end + + def empty? + @stack.empty? + end + end + +end diff --git a/vendor/bundle/ruby/3.1.0/gems/parser-3.1.2.0/lib/parser/syntax_error.rb b/vendor/bundle/ruby/3.1.0/gems/parser-3.1.2.0/lib/parser/syntax_error.rb new file mode 100644 index 000000000..0ac867de7 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/parser-3.1.2.0/lib/parser/syntax_error.rb @@ -0,0 +1,21 @@ +# frozen_string_literal: true + +module Parser + ## + # {Parser::SyntaxError} is raised whenever parser detects a syntax error, + # similar to the standard SyntaxError class. + # + # @api public + # + # @!attribute [r] diagnostic + # @return [Parser::Diagnostic] + # + class SyntaxError < StandardError + attr_reader :diagnostic + + def initialize(diagnostic) + @diagnostic = diagnostic + super(diagnostic.message) + end + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/parser-3.1.2.0/lib/parser/tree_rewriter.rb b/vendor/bundle/ruby/3.1.0/gems/parser-3.1.2.0/lib/parser/tree_rewriter.rb new file mode 100644 index 000000000..a84d882bc --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/parser-3.1.2.0/lib/parser/tree_rewriter.rb @@ -0,0 +1,133 @@ +# frozen_string_literal: true + +module Parser + + ## + # {Parser::TreeRewriter} offers a basic API that makes it easy to rewrite + # existing ASTs. It's built on top of {Parser::AST::Processor} and + # {Parser::Source::TreeRewriter} + # + # For example, assume you want to remove `do` tokens from a while statement. + # You can do this as following: + # + # require 'parser/current' + # + # class RemoveDo < Parser::TreeRewriter + # def on_while(node) + # # Check if the statement starts with "do" + # if node.location.begin.is?('do') + # remove(node.location.begin) + # end + # end + # end + # + # code = <<-EOF + # while true do + # puts 'hello' + # end + # EOF + # + # ast = Parser::CurrentRuby.parse code + # buffer = Parser::Source::Buffer.new('(example)', source: code) + # rewriter = RemoveDo.new + # + # # Rewrite the AST, returns a String with the new form. + # puts rewriter.rewrite(buffer, ast) + # + # This would result in the following Ruby code: + # + # while true + # puts 'hello' + # end + # + # Keep in mind that {Parser::TreeRewriter} does not take care of indentation when + # inserting/replacing code so you'll have to do this yourself. + # + # See also [a blog entry](http://whitequark.org/blog/2013/04/26/lets-play-with-ruby-code/) + # describing rewriters in greater detail. + # + # @api public + # + class TreeRewriter < Parser::AST::Processor + ## + # Rewrites the AST/source buffer and returns a String containing the new + # version. + # + # @param [Parser::Source::Buffer] source_buffer + # @param [Parser::AST::Node] ast + # @param [Symbol] crossing_deletions:, different_replacements:, swallowed_insertions: + # policy arguments for TreeRewriter (optional) + # @return [String] + # + def rewrite(source_buffer, + ast, + **policy) + @source_rewriter = Parser::Source::TreeRewriter.new(source_buffer, **policy) + + process(ast) + + @source_rewriter.process + end + + ## + # Returns `true` if the specified node is an assignment node, returns false + # otherwise. + # + # @param [Parser::AST::Node] node + # @return [Boolean] + # + def assignment?(node) + [:lvasgn, :ivasgn, :gvasgn, :cvasgn, :casgn].include?(node.type) + end + + ## + # Removes the source range. + # + # @param [Parser::Source::Range] range + # + def remove(range) + @source_rewriter.remove(range) + end + + ## + # Wraps the given source range with the given values. + # + # @param [Parser::Source::Range] range + # @param [String] content + # + def wrap(range, before, after) + @source_rewriter.wrap(range, before, after) + end + + ## + # Inserts new code before the given source range. + # + # @param [Parser::Source::Range] range + # @param [String] content + # + def insert_before(range, content) + @source_rewriter.insert_before(range, content) + end + + ## + # Inserts new code after the given source range. + # + # @param [Parser::Source::Range] range + # @param [String] content + # + def insert_after(range, content) + @source_rewriter.insert_after(range, content) + end + + ## + # Replaces the code of the source range `range` with `content`. + # + # @param [Parser::Source::Range] range + # @param [String] content + # + def replace(range, content) + @source_rewriter.replace(range, content) + end + end + +end diff --git a/vendor/bundle/ruby/3.1.0/gems/parser-3.1.2.0/lib/parser/variables_stack.rb b/vendor/bundle/ruby/3.1.0/gems/parser-3.1.2.0/lib/parser/variables_stack.rb new file mode 100644 index 000000000..2e27bf42e --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/parser-3.1.2.0/lib/parser/variables_stack.rb @@ -0,0 +1,36 @@ +# frozen_string_literal: true + +module Parser + + class VariablesStack + def initialize + @stack = [] + push + end + + def empty? + @stack.empty? + end + + def push + @stack << Set.new + end + + def pop + @stack.pop + end + + def reset + @stack.clear + end + + def declare(name) + @stack.last << name.to_sym + end + + def declared?(name) + @stack.last.include?(name.to_sym) + end + end + +end diff --git a/vendor/bundle/ruby/3.1.0/gems/parser-3.1.2.0/lib/parser/version.rb b/vendor/bundle/ruby/3.1.0/gems/parser-3.1.2.0/lib/parser/version.rb new file mode 100644 index 000000000..e436ba691 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/parser-3.1.2.0/lib/parser/version.rb @@ -0,0 +1,5 @@ +# frozen_string_literal: true + +module Parser + VERSION = '3.1.2.0' +end diff --git a/vendor/bundle/ruby/3.1.0/gems/parser-3.1.2.0/parser.gemspec b/vendor/bundle/ruby/3.1.0/gems/parser-3.1.2.0/parser.gemspec new file mode 100644 index 000000000..d86138ab7 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/parser-3.1.2.0/parser.gemspec @@ -0,0 +1,43 @@ +# encoding: utf-8 +# frozen_string_literal: true + +require File.expand_path('../lib/parser/version', __FILE__) + +Gem::Specification.new do |spec| + spec.name = 'parser' + spec.version = Parser::VERSION + spec.authors = ['whitequark'] + spec.email = ['whitequark@whitequark.org'] + spec.description = 'A Ruby parser written in pure Ruby.' + spec.summary = spec.description + spec.homepage = 'https://github.com/whitequark/parser' + spec.license = 'MIT' + + spec.metadata = { + 'bug_tracker_uri' => 'https://github.com/whitequark/parser/issues', + 'changelog_uri' => "https://github.com/whitequark/parser/blob/v#{spec.version}/CHANGELOG.md", + 'documentation_uri' => "https://www.rubydoc.info/gems/parser/#{spec.version}", + 'source_code_uri' => "https://github.com/whitequark/parser/tree/v#{spec.version}" + } + + spec.files = Dir['bin/*', 'lib/**/*.rb', 'parser.gemspec', 'LICENSE.txt'] + spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) } + spec.require_paths = ['lib'] + + spec.required_ruby_version = '>= 2.0.0' + + spec.add_dependency 'ast', '~> 2.4.1' + + spec.add_development_dependency 'bundler', '>= 1.15', '< 3.0.0' + spec.add_development_dependency 'rake', '~> 13.0.1' + spec.add_development_dependency 'racc', '= 1.4.15' + spec.add_development_dependency 'cliver', '~> 0.3.2' + + spec.add_development_dependency 'yard' + spec.add_development_dependency 'kramdown' + + spec.add_development_dependency 'minitest', '~> 5.10' + spec.add_development_dependency 'simplecov', '~> 0.15.1' + + spec.add_development_dependency 'gauntlet' +end diff --git a/vendor/bundle/ruby/3.1.0/gems/public_suffix-4.0.7/.github/FUNDING.yml b/vendor/bundle/ruby/3.1.0/gems/public_suffix-4.0.7/.github/FUNDING.yml new file mode 100644 index 000000000..085e1ac2f --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/public_suffix-4.0.7/.github/FUNDING.yml @@ -0,0 +1,12 @@ +# These are supported funding model platforms + +github: # Replace with up to 4 GitHub Sponsors-enabled usernames e.g., [user1, user2] +patreon: # Replace with a single Patreon username +open_collective: # Replace with a single Open Collective username +ko_fi: # Replace with a single Ko-fi username +tidelift: "rubygems/public_suffix" +community_bridge: # Replace with a single Community Bridge project-name e.g., cloud-foundry +liberapay: # Replace with a single Liberapay username +issuehunt: # Replace with a single IssueHunt username +otechie: # Replace with a single Otechie username +custom: # Replace with a single custom sponsorship URL diff --git a/vendor/bundle/ruby/3.1.0/gems/public_suffix-4.0.7/.github/dependabot.yml b/vendor/bundle/ruby/3.1.0/gems/public_suffix-4.0.7/.github/dependabot.yml new file mode 100644 index 000000000..1dbbb9ac2 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/public_suffix-4.0.7/.github/dependabot.yml @@ -0,0 +1,8 @@ +version: 2 +updates: +- package-ecosystem: bundler + directory: "/" + schedule: + interval: daily + time: "04:00" + open-pull-requests-limit: 10 diff --git a/vendor/bundle/ruby/3.1.0/gems/public_suffix-4.0.7/.github/workflows/release.yml b/vendor/bundle/ruby/3.1.0/gems/public_suffix-4.0.7/.github/workflows/release.yml new file mode 100644 index 000000000..e3862e3bd --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/public_suffix-4.0.7/.github/workflows/release.yml @@ -0,0 +1,16 @@ +name: release + +on: + push: + tags: + - v*.*.* +jobs: + release: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + - name: Release Gem + uses: cadwallion/publish-rubygems-action@8f9e0538302643309e4e43bf48cd34173ca48cfc + env: + RUBYGEMS_API_KEY: ${{ secrets.RUBYGEMS_API_KEY }} + RELEASE_COMMAND: rake release diff --git a/vendor/bundle/ruby/3.1.0/gems/public_suffix-4.0.7/.github/workflows/tests.yml b/vendor/bundle/ruby/3.1.0/gems/public_suffix-4.0.7/.github/workflows/tests.yml new file mode 100644 index 000000000..a0f334abf --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/public_suffix-4.0.7/.github/workflows/tests.yml @@ -0,0 +1,28 @@ +name: Tests + +on: + push: + pull_request: + workflow_dispatch: + +jobs: + build: + strategy: + matrix: + ruby-version: + - "2.6" + - "2.7" + - "3.0" + - "3.1" + platform: [ubuntu-latest] + runs-on: ${{ matrix.platform }} + steps: + - uses: actions/checkout@v2 + - name: Set up Ruby + uses: ruby/setup-ruby@v1 + with: + ruby-version: ${{ matrix.ruby-version }} + - name: Install dependencies + run: bundle install + - name: Run tests + run: bundle exec rake diff --git a/vendor/bundle/ruby/3.1.0/gems/public_suffix-4.0.7/.gitignore b/vendor/bundle/ruby/3.1.0/gems/public_suffix-4.0.7/.gitignore new file mode 100644 index 000000000..85062928f --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/public_suffix-4.0.7/.gitignore @@ -0,0 +1,8 @@ +# Bundler +/.bundle +/Gemfile.lock +/pkg/* + +# YARD +/.yardoc +/yardoc/ diff --git a/vendor/bundle/ruby/3.1.0/gems/public_suffix-4.0.7/.rubocop.yml b/vendor/bundle/ruby/3.1.0/gems/public_suffix-4.0.7/.rubocop.yml new file mode 100644 index 000000000..af922f52f --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/public_suffix-4.0.7/.rubocop.yml @@ -0,0 +1,36 @@ +inherit_from: + - .rubocop_opinionated.yml + +AllCops: + Exclude: + # Exclude .gemspec files because they are generally auto-generated + - '*.gemspec' + # Exclude vendored folders + - 'tmp/**/*' + - 'vendor/**/*' + # Exclude artifacts + - 'pkg/**/*' + # Other + - 'test/benchmarks/**/*' + - 'test/profilers/**/*' + +# I often use @_variable to avoid clashing. +Naming/MemoizedInstanceVariableName: + Enabled: false + +Style/ClassAndModuleChildren: + Exclude: + - 'spec/**/*_spec.rb' + - 'test/**/*_test.rb' + +# Dear Rubocop, I don't want to use String#strip_heredoc +Layout/HeredocIndentation: + Enabled: false + +Style/WordArray: + Enabled: false + MinSize: 3 + +Style/SymbolArray: + Enabled: false + MinSize: 3 diff --git a/vendor/bundle/ruby/3.1.0/gems/public_suffix-4.0.7/.rubocop_opinionated.yml b/vendor/bundle/ruby/3.1.0/gems/public_suffix-4.0.7/.rubocop_opinionated.yml new file mode 100644 index 000000000..761e2c7db --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/public_suffix-4.0.7/.rubocop_opinionated.yml @@ -0,0 +1,163 @@ +AllCops: + Exclude: + # Exclude .gemspec files because they are generally auto-generated + - '*.gemspec' + # Exclude vendored folders + - 'tmp/**/*' + - 'vendor/**/*' + NewCops: enable + +# [codesmell] +Layout/LineLength: + Enabled: false + Exclude: + - 'spec/**/*_spec.rb' + - 'test/**/*_test.rb' + Max: 100 + +Lint/ConstantDefinitionInBlock: + Exclude: + - 'Rakefile' + - 'spec/**/*' + - 'test/**/*' + +# [codesmell] +Metrics/AbcSize: + Enabled: false + Exclude: + - 'spec/**/*_spec.rb' + - 'test/**/*_test.rb' + +# [codesmell] +Metrics/BlockLength: + Enabled: false + +# [codesmell] +Metrics/CyclomaticComplexity: + Enabled: false + Exclude: + - 'spec/**/*_spec.rb' + - 'test/**/*_test.rb' + +# [codesmell] +Metrics/ClassLength: + Enabled: false + Exclude: + - 'spec/**/*_spec.rb' + - 'test/**/*_test.rb' + +# [codesmell] +Metrics/MethodLength: + Enabled: false + Exclude: + - 'spec/**/*_spec.rb' + - 'test/**/*_test.rb' + Max: 10 + +# [codesmell] +Metrics/ModuleLength: + Enabled: false + Exclude: + - 'spec/**/*_spec.rb' + - 'test/**/*_test.rb' + +# [codesmell] +Metrics/ParameterLists: + Enabled: false + Max: 5 + +# [codesmell] +Metrics/PerceivedComplexity: + Enabled: false + +# Do not use "and" or "or" in conditionals, but for readability we can use it +# to chain executions. Just beware of operator order. +Style/AndOr: + EnforcedStyle: conditionals + +Style/Documentation: + Exclude: + - 'spec/**/*' + - 'test/**/*' + +# Double empty lines are useful to separate conceptually different methods +# in the same class or module. +Layout/EmptyLines: + Enabled: false + +# In most cases, a space is nice. Sometimes, it's not. +# Just be consistent with the rest of the surrounding code. +Layout/EmptyLinesAroundClassBody: + Enabled: false + +# In most cases, a space is nice. Sometimes, it's not. +# Just be consistent with the rest of the surrounding code. +Layout/EmptyLinesAroundModuleBody: + Enabled: false + +# This is quite buggy, as it doesn't recognize double lines. +# Double empty lines are useful to separate conceptually different methods +# in the same class or module. +Layout/EmptyLineBetweenDefs: + Enabled: false + +# I personally don't care about the format style. +# In most cases I like to use %, but not at the point I want to enforce it +# as a convention in the entire code. +Style/FormatString: + Enabled: false + +# Annotated tokens (like %s) are a good thing, but in most cases we don't need them. +# %s is a simpler and straightforward version that works in almost all cases. So don't complain. +Style/FormatStringToken: + Enabled: false + +# unless is not always cool. +Style/NegatedIf: + Enabled: false + +# For years, %w() has been the de-facto standard. A lot of libraries are using (). +# Switching to [] would be a nightmare. +Style/PercentLiteralDelimiters: + Enabled: false + +# There are cases were the inline rescue is ok. We can either downgrade the severity, +# or rely on the developer judgement on a case-by-case basis. +Style/RescueModifier: + Enabled: false + +Style/SymbolArray: + EnforcedStyle: brackets + +# Sorry, but using trailing spaces helps readability. +# +# %w( foo bar ) +# +# looks better to me than +# +# %w( foo bar ) +# +Layout/SpaceInsidePercentLiteralDelimiters: + Enabled: false + +# Hate It or Love It, I prefer double quotes as this is more consistent +# with several other programming languages and the output of puts and inspect. +Style/StringLiterals: + EnforcedStyle: double_quotes + +# It's nice to be consistent. The trailing comma also allows easy reordering, +# and doesn't cause a diff in Git when you add a line to the bottom. +Style/TrailingCommaInArrayLiteral: + EnforcedStyleForMultiline: consistent_comma +Style/TrailingCommaInHashLiteral: + EnforcedStyleForMultiline: consistent_comma + +Style/TrivialAccessors: + # IgnoreClassMethods because I want to be able to define class-level accessors + # that sets an instance variable on the metaclass, such as: + # + # def self.default=(value) + # @default = value + # end + # + IgnoreClassMethods: true diff --git a/vendor/bundle/ruby/3.1.0/gems/public_suffix-4.0.7/.yardopts b/vendor/bundle/ruby/3.1.0/gems/public_suffix-4.0.7/.yardopts new file mode 100644 index 000000000..0a782de2b --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/public_suffix-4.0.7/.yardopts @@ -0,0 +1 @@ +--title 'Ruby Public Suffix API Documentation' diff --git a/vendor/bundle/ruby/3.1.0/gems/public_suffix-4.0.7/2.0-Upgrade.md b/vendor/bundle/ruby/3.1.0/gems/public_suffix-4.0.7/2.0-Upgrade.md new file mode 100644 index 000000000..1a10bfb36 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/public_suffix-4.0.7/2.0-Upgrade.md @@ -0,0 +1,52 @@ +# Welcome to PublicSuffix 2.0! + +PublicSuffix 2.0 contains a rewritten internal representation and comparison logic, that drastically increases the lookup performance. The new version also changes several internal and external API. + +This document documents the most relevant changes to help you upgrading from PublicSuffix 1.0 to 2.0. + +## What's New + +- The library is now 100% compliants with the official PublicSuffix tests. The major breaking change you may experience, is that if a domain passed as input doesn't match any rule, the rule `*` is assumed. You can override this behavior by passing a custom default rule with the `default_rule` option. The old behavior can be restored by passing `default_rule: nil`. +- `PublicSuffix.domain` is a new method that parses the input and returns the domain (combination of second level domain + suffix). This is a convenient helper to parse a domain name, for example when you need to determine the cookie or SSL scope. +- Added the ability to disable the use of private domains either at runtime, in addition to the ability to not load the private domains section when reading the list (`private_domains: false`). This feature also superseded the `private_domains` class-level attribute, that is no longer available. + +## Upgrade + +When upgrading, here's the most relevant changes to keep an eye on: + +- Several futile utility helpers were removed, such as `Domain#rule`, `Domain#is_a_domain?`, `Domain#is_a_subdomain?`, `Domain#valid?`. You can easily obtain the same result by having a custom method that reconstructs the logic, and/or calling `PublicSuffix.{domain|parse}(domain.to_s)`. +- `PublicSuffix::List.private_domains` is no longer available. Instead, you now have two ways to enable/disable the private domains: + + 1. At runtime, by using the `ignore_private` option + + ```ruby + PublicSuffix.domain("something.blogspot.com", ignore_private: true) + ``` + + 1. Loading a filtered list: + + ```ruby + # Disable support for private TLDs + PublicSuffix::List.default = PublicSuffix::List.parse(File.read(PublicSuffix::List::DEFAULT_LIST_PATH), private_domains: false) + # => "blogspot.com" + PublicSuffix.domain("something.blogspot.com") + # => "blogspot.com" + ``` +- Now that the library is 100% compliant with the official PublicSuffix algorithm, if a domain passed as input doesn't match any rule, the wildcard rule `*` is assumed. This means that unlisted TLDs will be considered valid by default, when they would have been invalid in 1.x. However, you can override this behavior to emulate the 1.x behavior if needed: + + ```ruby + # 1.x: + + PublicSuffix.valid?("google.commm") + # => false + + # 2.x: + + PublicSuffix.valid?("google.commm") + # => true + + # Overriding 2.x behavior if needed: + + PublicSuffix.valid?("google.commm", default_rule: nil) + # => false + ```` diff --git a/vendor/bundle/ruby/3.1.0/gems/public_suffix-4.0.7/CHANGELOG.md b/vendor/bundle/ruby/3.1.0/gems/public_suffix-4.0.7/CHANGELOG.md new file mode 100644 index 000000000..b6178f560 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/public_suffix-4.0.7/CHANGELOG.md @@ -0,0 +1,417 @@ +# Changelog + +This project uses [Semantic Versioning 2.0.0](https://semver.org/). + + +## 4.0.7 + +### Fixes + +- Fixed YARD rake task (GH-179) + +### Changed + +- Updated definitions. + + +## 4.0.6 + +### Changed + +- Updated definitions. + + +## 4.0.5 + +### Changed + +- Updated definitions. + + +## 4.0.4 + +### Changed + +- Updated definitions. + + +## 4.0.3 + +### Fixed + +- Fixed 2.7 deprecations and warnings (GH-167). [Thanks @BrianHawley] + + +## 4.0.2 + +### Changed + +- Updated definitions. + + +## 4.0.1 + +### Changed + +- Updated definitions. + + +## 4.0.0 + +### Changed + +- Minimum Ruby version is 2.3 + + +## Release 3.1.1 + +- CHANGED: Updated definitions. +- CHANGED: Rolled back support for Ruby 2.3 (GH-161, GH-162) + +IMPORTANT: 3.x is the latest version compatible with Ruby 2.1 and Ruby 2.2. + + +## Release 3.1.0 + +- CHANGED: Updated definitions. +- CHANGED: Minimum Ruby version is 2.3 +- CHANGED: Upgraded to Bundler 2.x + + +## Release 3.0.3 + +- CHANGED: Updated definitions. + + +## Release 3.0.2 + +- CHANGED: Updated definitions. + + +## Release 3.0.1 + +- CHANGED: Updated definitions. +- CHANGED: Improve performance and avoid allocation (GH-146). [Thanks @robholland] + + +## Release 3.0.0 + +This new version includes a major redesign of the library internals, with the goal to drastically +improve the lookup time while reducing storage space. + +For this reason, several public methods that are no longer applicable have been deprecated +and/or removed. You can find more information at GH-133. + +- CHANGED: Updated definitions. +- CHANGED: Dropped support for Ruby < 2.1 +- CHANGED: `PublicSuffix::List#rules` is now protected. You should not rely on it as the internal rule representation is subject to change to optimize performances. +- CHANGED: Removed `PublicSuffix::List.clear`, it was an unnecessary accessor method. Use `PublicSuffix::List.default = nil` if you **really** need to reset the default list. You shouldn't. +- CHANGED: `PublicSuffix::List#select` is now private. You should not use it, instead use `PublicSuffix::List#find`. +- CHANGED: `PublicSuffix::List` no longer implements Enumerable. Instead, use `#each` to loop over, or get an Enumerator. +- CHANGED: Redesigned internal list storage and lookup algorithm to achieve O(1) lookup time (see GH-133). + + +## Release 2.0.5 + +- CHANGED: Updated definitions. +- CHANGED: Initialization performance improvements (GH-128). [Thanks @casperisfine] + + +## Release 2.0.4 + +- FIXED: Fix a bug that caused the GEM to be published with the wrong version number in the gemspec (GH-121). + +- CHANGED: Updated definitions. + + +## Release 2.0.3 + +- CHANGED: Updated definitions. + + +## Release 2.0.2 + +- CHANGED: Updated definitions. + + +## Release 2.0.1 + +- FIXED: Fix bug that prevented .valid? to reset the default rule + + +## Release 2.0.0 + +- NEW: Added PublicSuffix.domain # => sld.tld +- NEW: Added the ability to disable the use of private domains either at runtime, in addition to the ability to not load the private domains section when reading the list (`private_domains: false`). This feature also superseded the `private_domains` class-level attribute, that is no longer available. + +- CHANGED: Considerable performance improvements (GH-92) +- CHANGED: Updated definitions. +- CHANGED: Removed deprecated PublicSuffix::InvalidDomain exception +- CHANGED: If the suffix is now listed, then the prevaling rule is "*" as defined by the PSL algorithm (GH-91) +- CHANGED: Input validation is performed only if you call `PublicSuffix.parse` or `PublicSuffix.list` +- CHANGED: Input with leading dot is invalid per PSL acceptance tests +- CHANGED: Removed `private_domains` class-level attribute. It is replaced by the `private_domains: false` option in the list parse method. +- CHANGED: The default list now assumes you use UTF-8 for reading the input (GH-94), + +- REMOVED: Removed futile utility helpers such as `Domain#rule`, `Domain#is_a_domain?`, `Domain#is_a_subdomain?`, `Domain#valid?`. You can easily obtain the same result by having a custom method that reconstructs the logic, and/or calling `PublicSuffix.{domain|parse}(domain.to_s)`. + + +## Release 1.5.3 + +- FIXED: Don't duplicate rule indices when creating index (GH-77). [Thanks @ags] + +- CHANGED: Updated definitions. + + +## Release 1.5.2 + +- CHANGED: Updated definitions. + + +## Release 1.5.1 + +- FIXED: Ignore case for parsing and validating (GH-62) + +- CHANGED: Updated definitions. + + +## Release 1.5.0 + +- CHANGED: Dropped support for Ruby < 2.0 + +- CHANGED: Updated definitions. + + +## Release 1.4.6 + +- CHANGED: Updated definitions. + + +## Release 1.4.5 + +- CHANGED: Updated definitions. + + +## Release 1.4.4 + +- CHANGED: Updated definitions. + + +## Release 1.4.3 + +- CHANGED: Updated definitions. + + +## Release 1.4.2 + +- CHANGED: Updated definitions. + + +## Release 1.4.1 + +- CHANGED: Updated definitions. + + +## Release 1.4.0 + +- CHANGED: Moved the definitions in the lib folder. + +- CHANGED: Updated definitions. + + +## Release 1.3.3 + +- CHANGED: Updated definitions. + + +## Release 1.3.2 + +- CHANGED: Updated definitions. + + +## Release 1.3.1 + +- CHANGED: Updated definitions. + + +## Release 1.3.0 + +- NEW: Ability to skip Private Domains (GH-28). [Thanks @rb2k] + +- CHANGED: Updated definitions. + + +## Release 1.2.1 + +- CHANGED: Updated definitions. + + +## Release 1.2.0 + +- NEW: Allow a custom List on `PublicSuffix.parse` (GH-26). [Thanks @itspriddle] + +- FIXED: PublicSuffix.parse and PublicSuffix.valid? crashes when input is nil (GH-20). + +- CHANGED: Updated definitions. + + +## Release 1.1.3 + +- CHANGED: Updated definitions. + + +## Release 1.1.2 + +- CHANGED: Updated definitions. + + +## Release 1.1.1 + +- CHANGED: Updated definitions. + + +## Release 1.1.0 + +- FIXED: #valid? and #parse consider URIs as valid domains (GH-15) + +- CHANGED: Updated definitions. + +- CHANGED: Removed deprecatd PublicSuffixService::RuleList. + + +## Release 1.0.0 + +- CHANGED: Updated definitions. + + +## Release 1.0.0.rc1 + +The library is now known as PublicSuffix. + + +## Release 0.9.1 + +- CHANGED: Renamed PublicSuffixService::RuleList to PublicSuffixService::List. + +- CHANGED: Renamed PublicSuffixService::List#list to PublicSuffixService::List#rules. + +- CHANGED: Renamed PublicSuffixService to PublicSuffix. + +- CHANGED: Updated definitions. + + +## Release 0.9.0 + +- CHANGED: Minimum Ruby version increased to Ruby 1.8.7. + +- CHANGED: rake/gempackagetask is deprecated. Use rubygems/package_task instead. + + +## Release 0.8.4 + +- FIXED: Reverted bugfix for issue #12 for Ruby 1.8.6. + This is the latest version compatible with Ruby 1.8.6. + + +## Release 0.8.3 + +- FIXED: Fixed ArgumentError: invalid byte sequence in US-ASCII with Ruby 1.9.2 (#12). + +- CHANGED: Updated definitions (#11). + +- CHANGED: Renamed definitions.txt to definitions.dat. + + +## Release 0.8.2 + +- NEW: Added support for rubygems-test. + +- CHANGED: Integrated Bundler. + +- CHANGED: Updated definitions. + + +## Release 0.8.1 + +- FIXED: The files in the release 0.8.0 have wrong permission 600 and can't be loaded (#10). + + +## Release 0.8.0 + +- CHANGED: Update public suffix list to d1a5599b49fa 2010-10-25 15:10 +0100 (#9) + +- NEW: Add support for Fully Qualified Domain Names (#7) + + +## Release 0.7.0 + +- CHANGED: Using YARD to document the code instead of RDoc. + +- FIXED: RuleList cache is not recreated when a new rule is appended to the list (#6) + +- FIXED: PublicSuffixService.valid? should return false if the domain is not defined or not allowed (#4, #5) + + +## Release 0.6.0 + +- NEW: PublicSuffixService.parse raises DomainNotAllowed when trying to parse a domain name + which exists, but is not allowed by the current definition list (#3) + + PublicSuffixService.parse("nic.do") + # => PublicSuffixService::DomainNotAllowed + +- CHANGED: Renamed PublicSuffixService::InvalidDomain to PublicSuffixService::DomainInvalid + + +## Release 0.5.2 + +- CHANGED: Update public suffix list to 248ea690d671 2010-09-16 18:02 +0100 + + +## Release 0.5.1 + +- CHANGED: Update public suffix list to 14dc66dd53c1 2010-09-15 17:09 +0100 + + +## Release 0.5.0 + +- CHANGED: Improve documentation for Domain#domain and Domain#subdomain (#1). + +- CHANGED: Performance improvements (#2). + + +## Release 0.4.0 + +- CHANGED: Rename library from DomainName to PublicSuffixService to reduce the probability of name conflicts. + + +## Release 0.3.1 + +- Deprecated DomainName library. + + +## Release 0.3.0 + +- CHANGED: DomainName#domain and DomainName#subdomain are no longer alias of Domain#sld and Domain#tld. + +- CHANGED: Removed DomainName#labels and decoupled Rule from DomainName. + +- CHANGED: DomainName#valid? no longer instantiates new DomainName objects. This means less overhead. + +- CHANGED: Refactoring the entire DomainName API. Removed the internal on-the-fly parsing. Added a bunch of new methods to check and validate the DomainName. + + +## Release 0.2.0 + +- NEW: DomainName#valid? + +- NEW: DomainName#parse and DomainName#parse! + +- NEW: DomainName#valid_domain? and DomainName#valid_subdomain? + +- CHANGED: Make sure RuleList lookup is only performed once. + + +## Release 0.1.0 + +- Initial version diff --git a/vendor/bundle/ruby/3.1.0/gems/public_suffix-4.0.7/Gemfile b/vendor/bundle/ruby/3.1.0/gems/public_suffix-4.0.7/Gemfile new file mode 100644 index 000000000..8c679696b --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/public_suffix-4.0.7/Gemfile @@ -0,0 +1,14 @@ +# frozen_string_literal: true + +source "https://rubygems.org" + +gemspec + +gem "rake" + +gem "memory_profiler", require: false +gem "minitest" +gem "minitest-reporters" +gem "mocha" +gem "rubocop", "~>0.90", require: false +gem "yard" diff --git a/vendor/bundle/ruby/3.1.0/gems/public_suffix-4.0.7/LICENSE.txt b/vendor/bundle/ruby/3.1.0/gems/public_suffix-4.0.7/LICENSE.txt new file mode 100644 index 000000000..fc7507bae --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/public_suffix-4.0.7/LICENSE.txt @@ -0,0 +1,22 @@ +Copyright (c) 2009-2022 Simone Carletti + +MIT License + +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/vendor/bundle/ruby/3.1.0/gems/public_suffix-4.0.7/README.md b/vendor/bundle/ruby/3.1.0/gems/public_suffix-4.0.7/README.md new file mode 100644 index 000000000..0747354fb --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/public_suffix-4.0.7/README.md @@ -0,0 +1,217 @@ +# Public Suffix for Ruby + +PublicSuffix is a Ruby domain name parser based on the [Public Suffix List](https://publicsuffix.org/). + +[![Build Status](https://github.com/weppos/publicsuffix-ruby/actions/workflows/tests.yml/badge.svg)](https://github.com/weppos/publicsuffix-ruby/actions/workflows/tests.yml) +[![Tidelift dependencies](https://tidelift.com/badges/package/rubygems/public_suffix)](https://tidelift.com/subscription/pkg/rubygems-public-suffix?utm_source=rubygems-public-suffix&utm_medium=referral&utm_campaign=enterprise) + + +## Links + +- [Homepage](https://simonecarletti.com/code/publicsuffix-ruby) +- [Repository](https://github.com/weppos/publicsuffix-ruby) +- [API Documentation](https://rubydoc.info/gems/public_suffix) +- [Introducing the Public Suffix List library for Ruby](https://simonecarletti.com/blog/2010/06/public-suffix-list-library-for-ruby/) + + +## Requirements + +PublicSuffix requires **Ruby >= 2.3**. For an older versions of Ruby use a previous release. + + +## Installation + +You can install the gem manually: + +```shell +gem install public_suffix +``` + +Or use Bundler and define it as a dependency in your `Gemfile`: + +```ruby +gem 'public_suffix' +``` + +If you are upgrading to 2.0, see [2.0-Upgrade.md](2.0-Upgrade.md). + +## Usage + +Extract the domain out from a name: + +```ruby +PublicSuffix.domain("google.com") +# => "google.com" +PublicSuffix.domain("www.google.com") +# => "google.com" +PublicSuffix.domain("www.google.co.uk") +# => "google.co.uk" +``` + +Parse a domain without subdomains: + +```ruby +domain = PublicSuffix.parse("google.com") +# => # +domain.tld +# => "com" +domain.sld +# => "google" +domain.trd +# => nil +domain.domain +# => "google.com" +domain.subdomain +# => nil +``` + +Parse a domain with subdomains: + +```ruby +domain = PublicSuffix.parse("www.google.com") +# => # +domain.tld +# => "com" +domain.sld +# => "google" +domain.trd +# => "www" +domain.domain +# => "google.com" +domain.subdomain +# => "www.google.com" +``` + +Simple validation example: + +```ruby +PublicSuffix.valid?("google.com") +# => true + +PublicSuffix.valid?("www.google.com") +# => true + +# Explicitly forbidden, it is listed as a private domain +PublicSuffix.valid?("blogspot.com") +# => false + +# Unknown/not-listed TLD domains are valid by default +PublicSuffix.valid?("example.tldnotlisted") +# => true +``` + +Strict validation (without applying the default * rule): + +```ruby +PublicSuffix.valid?("example.tldnotlisted", default_rule: nil) +# => false +``` + + +## Fully Qualified Domain Names + +This library automatically recognizes Fully Qualified Domain Names. A FQDN is a domain name that end with a trailing dot. + +```ruby +# Parse a standard domain name +PublicSuffix.domain("www.google.com") +# => "google.com" + +# Parse a fully qualified domain name +PublicSuffix.domain("www.google.com.") +# => "google.com" +``` + +## Private domains + +This library has support for switching off support for private (non-ICANN). + +```ruby +# Extract a domain including private domains (by default) +PublicSuffix.domain("something.blogspot.com") +# => "something.blogspot.com" + +# Extract a domain excluding private domains +PublicSuffix.domain("something.blogspot.com", ignore_private: true) +# => "blogspot.com" + +# It also works for #parse and #valid? +PublicSuffix.parse("something.blogspot.com", ignore_private: true) +PublicSuffix.valid?("something.blogspot.com", ignore_private: true) +``` + +If you don't care about private domains at all, it's more efficient to exclude them when the list is parsed: + +```ruby +# Disable support for private TLDs +PublicSuffix::List.default = PublicSuffix::List.parse(File.read(PublicSuffix::List::DEFAULT_LIST_PATH), private_domains: false) +# => "blogspot.com" +PublicSuffix.domain("something.blogspot.com") +# => "blogspot.com" +``` + + +## What is the Public Suffix List? + +The [Public Suffix List](https://publicsuffix.org) is a cross-vendor initiative to provide an accurate list of domain name suffixes. + +The Public Suffix List is an initiative of the Mozilla Project, but is maintained as a community resource. It is available for use in any software, but was originally created to meet the needs of browser manufacturers. + +A "public suffix" is one under which Internet users can directly register names. Some examples of public suffixes are ".com", ".co.uk" and "pvt.k12.wy.us". The Public Suffix List is a list of all known public suffixes. + + +## Why the Public Suffix List is better than any available Regular Expression parser? + +Previously, browsers used an algorithm which basically only denied setting wide-ranging cookies for top-level domains with no dots (e.g. com or org). However, this did not work for top-level domains where only third-level registrations are allowed (e.g. co.uk). In these cases, websites could set a cookie for co.uk which will be passed onto every website registered under co.uk. + +Clearly, this was a security risk as it allowed websites other than the one setting the cookie to read it, and therefore potentially extract sensitive information. + +Since there is no algorithmic method of finding the highest level at which a domain may be registered for a particular top-level domain (the policies differ with each registry), the only method is to create a list of all top-level domains and the level at which domains can be registered. This is the aim of the effective TLD list. + +As well as being used to prevent cookies from being set where they shouldn't be, the list can also potentially be used for other applications where the registry controlled and privately controlled parts of a domain name need to be known, for example when grouping by top-level domains. + +Source: https://wiki.mozilla.org/Public_Suffix_List + +Not convinced yet? Check out [this real world example](https://stackoverflow.com/q/288810/123527). + + +## Does PublicSuffix make requests to Public Suffix List website? + +No. PublicSuffix comes with a bundled list. It does not make any HTTP requests to parse or validate a domain. + + +## Support + +Library documentation is auto-generated from the [README](https://github.com/weppos/publicsuffix-ruby/blob/master/README.md) and the source code, and it's available at https://rubydoc.info/gems/public_suffix. + +- The PublicSuffix bug tracker is here: https://github.com/weppos/publicsuffix-ruby/issues +- The PublicSuffix code repository is here: https://github.com/weppos/publicsuffix-ruby. Contributions are welcome! Please include tests and/or feature coverage for every patch, and create a topic branch for every separate change you make. + +[Consider subscribing to Tidelift which provides Enterprise support for this project](https://tidelift.com/subscription/pkg/rubygems-public-suffix?utm_source=rubygems-public-suffix&utm_medium=referral&utm_campaign=readme) as part of the Tidelift Subscription. Tidelift subscriptions also help the maintainers by funding the project, which in turn allows us to ship releases, bugfixes, and security updates more often. + + +## Security and Vulnerability Reporting + +Full information and description of our security policy please visit [`SECURITY.md`](SECURITY.md) + + +## Changelog + +See the [CHANGELOG.md](CHANGELOG.md) file for details. + + +## License + +Copyright (c) 2009-2022 Simone Carletti. This is Free Software distributed under the MIT license. + +The [Public Suffix List source](https://publicsuffix.org/list/) is subject to the terms of the Mozilla Public License, v. 2.0. + +## Definitions + +tld = Top level domain, this is in reference to the last segment of a domain, sometimes the part that is directly after the "dot" symbol. For example, `mozilla.org`, the `.org` portion is the tld. + +sld = Second level domain, a domain that is directly below a top-level domain. For example, in `https://www.mozilla.org/en-US/`, `mozilla` is the second-level domain of the .org tld. + +trd = Transit routing domain, or known as a subdomain. This is the part of the domain that is before the sld or root domain. For example, in `https://www.mozilla.org/en-US/`, `www` is the trd. + +FQDN = Fully Qualified Domain Names, are domain names that are written with the hostname and the domain name, and include the top-level domain, the format looks like `[hostname].[domain].[tld].` for ex. `[www].[mozilla].[org]`. diff --git a/vendor/bundle/ruby/3.1.0/gems/public_suffix-4.0.7/Rakefile b/vendor/bundle/ruby/3.1.0/gems/public_suffix-4.0.7/Rakefile new file mode 100644 index 000000000..26a6c9941 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/public_suffix-4.0.7/Rakefile @@ -0,0 +1,52 @@ +# frozen_string_literal: true + +require "bundler/gem_tasks" + +# By default, run tests and linter. +task default: [:test, :rubocop] + + +require "rake/testtask" + +Rake::TestTask.new do |t| + t.libs = %w( lib test ) + t.pattern = "test/**/*_test.rb" + t.verbose = !ENV["VERBOSE"].nil? + t.warning = !ENV["WARNING"].nil? +end + +require "rubocop/rake_task" + +RuboCop::RakeTask.new + + +require "yard" +require "yard/rake/yardoc_task" + +YARD::Rake::YardocTask.new(:yardoc) do |y| + y.options = ["--output-dir", "yardoc"] +end + +CLOBBER.include "yardoc" + + +task :benchmarks do + Dir["benchmarks/bm_*.rb"].each do |file| + sh "ruby #{file}" + end +end +task default: [:benchmarks] if ENV["BENCHMARKS"] == "1" + + +desc "Downloads the Public Suffix List file from the repository and stores it locally." +task :"update-list" do + require "net/http" + + DEFINITION_URL = "https://raw.githubusercontent.com/publicsuffix/list/master/public_suffix_list.dat" + + File.open("data/list.txt", "w+") do |f| + response = Net::HTTP.get_response(URI.parse(DEFINITION_URL)) + response.body + f.write(response.body) + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/public_suffix-4.0.7/SECURITY.md b/vendor/bundle/ruby/3.1.0/gems/public_suffix-4.0.7/SECURITY.md new file mode 100644 index 000000000..f3291287a --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/public_suffix-4.0.7/SECURITY.md @@ -0,0 +1,104 @@ +# Security Policy + +## Supported Versions + +Security updates are provided only for the current minor version. + +If you are using a previous minor version, we recommend to upgrade to the current minor version. +This project uses [semantic versioning](https://semver.org/), therefore you can upgrade to a more recent minor version without incurring into breaking changes. + +Exceptionally, we may support previous minor versions upon request if there are significant reasons preventing to immediately switch the latest minor version. + +Older major versions are no longer supported. + + +## Reporting a Vulnerability + +To make a report, please email weppos@weppos.net. + +Please consider encrypting your report with GPG using the key [0x420da82a989398df](https://keyserver.ubuntu.com/pks/lookup?op=get&search=0x420da82a989398df). + +``` +-----BEGIN PGP PUBLIC KEY BLOCK----- + +xsBNBE/QiI0BCACtBbjJnJIzaLb4NfjaljzT/+dvodst+wyDRE8Vwc6ujwboZjr2 +0QwXScNzObPazyvkSZVh3g6PveneeSD0dSw2XDqKbbtLMg/Ss12yqXJfjavH/zjk +6Xq+nnbSnxBPzwFAAEaEFIc6H6BygJ7zHPP5WEY5QIMqifEAX//aBqHi4GXHJiHE +237Zqufdry23jBYjY7wGXAa11VsU9Iwqh6LPB9/hc1KtzjAuvvm5ufeT/iVjxGQX +te1OZZk6n8xSVYeLsn97PfgYs0yauhexwD9dG7FbRCB379JxPRn5akr391qXcVOG +ZA3yBXUSPOL6D1+TS1S0su5zbw2AEp4+z3SpABEBAAHNIlNpbW9uZSBDYXJsZXR0 +aSA8d2VwcG9zQGdtYWlsLmNvbT7CwHcEEwEKACEFAlXH0UQCGy8FCwkIBwMFFQoJ +CAsFFgIDAQACHgECF4AACgkQQg2oKpiTmN9BOQf/UHd+bmww71MkbS38KkowDu+0 +1VH35aL8sFcAMUSEA4I5oPWZoBtYYPGpALLxtrSNW+SCnmmeCQVfVmLedUVHwDZo +TS4qiynpqnz+Cnq4KRC8VMIyaFoiT5Vg6MLtau8hJtqZn1Wv68g0nXuprsCuf9vs +z7DDZ36z8em6OJQJQ/FQ4BGogzyYHa90cJnIM6BeLiRUUpFTl1tHLlw4JFUNi8sx +6VQ1/nhcr3OyskAix5TytRnJ8uIn22m25GGdTF2WQPNfkWJQVT4ZDbCxT20acRp0 +l3x1DAk3Eel8gOKzgOboB3bkI5/l1XZvNL0YWGZeyfp8I7ZqpXg/m4qLDkYU2cLA +egQTAQoAJAIbLwULCQgHAwUVCgkICwUWAgMBAAIeAQIXgAUCVf6KvAIZAQAKCRBC +DagqmJOY34ABB/9WbNAh0l07UN1ePfVm6Brg2Yt8k6Q2lIRUG2xAeQj/+Kx/4lAL +oY6F0jJ44kIDZqZdNA0QIqYzZRBV4iW+cQrsBUUyM+chiA3RuOsDG18sfvkyPvRy +ecOVubHCN+nK2GKy1oHQkCpVFIeetr0ugB/j+xNDKJ3Oa5dGBKF29ZH5Pxg7cqwH +cdkhBGMpPbBYq5pJtYGggqypELzFTG292StbtV837Eze+clWRTKtMBOHke/oKBCr +YYic2fmipGC9XUiqvMEMAKYq5WWWXIlcSVSnBDdxq41tXjKK4XMVgoOboZCcNFvh +0NxuDQATk1YruRZOS4SpBPXykEA1pK/zm3WmzSNTaW1vbmUgQ2FybGV0dGkgPHdl +cHBvc0B3ZXBwb3MubmV0PsLAeQQTAQIAIwUCT9CIjQIbLwcLCQgHAwIBBhUIAgkK +CwQWAgMBAh4BAheAAAoJEEINqCqYk5jfGWcH/Ax3EhAckGeCqNYE5BTx94bKB1LL +vUjeUoImMtGGFxQu2jNOAjtpuyjihm9uHBZ+dxaxHHrhE11f+0sDcwvW8qtKEzOs +GESr01VqTaVFS2JOEHhLphXseaLXJe32Osz0kHCZmrz1fCwv3b8QuWBifn8oVzcV +vrE7lGC6pGwaiUvMsvA++RUquTlNVlh8uRrqcQCU8Ne9lSoDWHlUJes5s4FoCh3R +oVBcKPsx3m/P9+GlEgTDqYP+WU3sfSfJYERH0r0NAYP96m2e7UQrqdgvMTVVDkPB +UB9efZzgkL7u9IAqmLU2klSGdEZnJ8t1AsjEyHXMztC7ICUhRFCeXHdTNhHCwHwE +EwEKACYCGy8HCwkIBwMCAQYVCAIJCgsEFgIDAQIeAQIXgAUCVcfRaQIZAQAKCRBC +DagqmJOY31y1B/41I/SsWwDqJP/Y3LzzatGmIv/gy+LkJBBTr/NV0NYzKV2XJ1BG +ese2ZE4tKKdG4HDwF+IwFLBHcPZRv358IwwTRPnzeO23mxpTYAnRCdg/pcaYIJ9r +OxIOP+R52YbgGrNKcezVA+7TY9za072P7Bk85jTM2FNfqevaf/YQ4GRcGLQ3JI8N +tBUdvrOEETDpR0QFTr22Wv1C7UfPDsSf7ZUM7zJ38CmDji8JSlr6y75/LYSY50BB +8EHb03QxyePe98A3WzvOoqamiCIe9bRzH5IqRAtJYDX8cK4PZmp43bQhrjdjawCc +AU/OY9iz+zCw00+b6CNiRb59N+OwpNJh5iNNwsB5BBMBCgAjAhsvBwsJCAcDAgEG +FQgCCQoLBBYCAwECHgECF4AFAlX+iq0ACgkQQg2oKpiTmN/z2gf/VbcQHgTlXFYa +Sq/dE7S54uGFrdzHOV3IJyl+ByMwVoKn6zdpksRoyt7jPV3RonrUO7jEcrt7VKCU +2KC7/MZMDoUsn9BXXTtUk+uTCNh8qllR0Fo/FvWM9RJKmcDMKwAJwcKIgbfUBJGx +1N6pP2DUc+YCnEerRbnQ1DWJUM7BaOEN6bvPxuGblPst1l6S5VktFj3gZGYItHrs +pit5pesILP8K6B6VCNP2WXXYvYQo7yyYcG8WBWXin8/SdNwU68lUbfhhQVIKv6LU +h0wvgG97NsBPrFbij0K6O63FufnNr9WLMZhAzi0h6gNK2HKAyw9AZNKpPccwg+mX +Huc/4CPRlM0uU2ltb25lIENhcmxldHRpIDxzaW1vbmUuY2FybGV0dGlAZG5zaW1w +bGUuY29tPsLAdwQTAQoAIQUCVh4ipAIbLwULCQgHAwUVCgkICwUWAgMBAAIeAQIX +gAAKCRBCDagqmJOY329iCACpOY5SV7hwOZ8VqmRfxRoHQFQe9Owr+hD3eL0AKZaJ +V918dCPrrxbAmwwMAC8pS8J4CmrrTR27kxcUgVwcfyydFPrgST5pg+H7UTrBR045 +4Npw1+m99I2Pyyl3oaym4lKJFbp2c2DGODEzTg8kKfjk0cb8bd+MJrXqFyod1z5r +0pfexwaLVt1Hz+ZsmFIPO1ISHYBPV8OkpL8Kgb8WtY6REntgNjfcmtHNi0VWQ7+N +vgeYqdhscX8c9ROe26BiiiGXphRlAsCU/VLHOJkzoW3f9QLy4z01Xj/7OaD0JkHS +HrES1ye3ZDxnjnTRdh4U8ntJ+L+xnePcFQA2t0eCbPwIzSZTaW1vbmUgQ2FybGV0 +dGkgPHNpbW9uZUBjYXJsZXR0aS5uYW1lPsLAdwQTAQoAIQUCVf7gmwIbLwULCQgH +AwUVCgkICwUWAgMBAAIeAQIXgAAKCRBCDagqmJOY37L+B/45pWT3wgm43+kzHVOT +j63m4zmRb53TGZToRSxz3acyuVSuqU9Tv010F0ZV9ccb0NDeN+88s9tEisuoO0Rz +5vhC8AtwRUyR3ADE9pBtvvxT+4R9y8yYNTCIX45VPG9ZPp9+7i+XCdKtz30KIV7r +smktd2FrK16r/KUN8+03iZSgzQ9lsTmXK5L7zH/f3Tqhbfvybr4+M71KGnSoP+iP +vwfsoBb5rhijQLOykTb+VzdDpHQbupwxwm/3S4nsA4U6tonIywlJgBDSjgDjQj0i +Ez+Db2Wt59y6LoksRQogvJqm0nuxFUWMZc47zdhsRnqmxUYTNpKaJPWc6pfxsQPK +ZvTjzsBNBE/QiI0BCACsaNbG6kyKJBWL5jPhebsijk8PCfSHte1jNCA5l/NvaImZ +6ORq9f8S9MWlYxmzyUkVJaWrv+9p5zmjwcaegjerj6ggjPDEXlZG41Z4YE1/R8pf +wkSvrkLziBxZDB1aYplg8kgXkaIf2yi2FrMPSi04sjvQbBSCcIJeh6+vGK8tIJTn +e0tQbEvRorTwBAPAFlpx/bdk1wZYu11vFKbckhKWou7f8XSdn9ng9cY5uK+xBlFU +2ORgL1ygeIoY9uRvNZG2ncvCvxUPgOqbo31R8KPyvV4rNNvGBOfxQER9LbieBF2I +5I1gpyboGWKcXu1eV7tOpjtW6LHt+6NHhE6L1Lw1ABEBAAHCwX4EGAECAAkFAk/Q +iI0CGy4BKQkQQg2oKpiTmN/AXSAEGQECAAYFAk/QiI0ACgkQcBROh493BN9hdwf9 +GjiF1GcQN+3TZkXdr2WY0AlbcA/wBp6+ShnqcoU5XLuA0RY3+rWGuaSc2buLke6Y +2MhMAYcgmPdG+WTBoW5dWQGXBZ1IHYVR8HLGaF+Vate1MofE1BNHXhnilIMMfH4G +Tcr3Z3/FaSk9OdHlyiE/Jo7++8PQ+auHVyjtqry+/ysAnyr+lnCn+K4E0PQ1fYpP +fiawKtfSqk9h6HjjMyx9Adrz+ljXh+NyVqYZUfRytjgO+v+dAQmMczT1EawLTdX+ +trx1tHR549pEey7in5QKsje3GLH4zq4mCdWBlivQxmmmlvR07DysLADMbcpjKK2g +utfzygZHCU9hWGR3wbWZ7lXjB/0ZzutNaNYzSCkiC8PIWH1bG+TJO9pslHwP+aBJ +NGAmcwyOH9Bub2CSXikQFZNUmVRwtl7mN4bVAHI8zbMd6xdlX22yDgQei54dPXDw +UYsvGE4zmrD97he1EYcIOKMFHzlJNcWK+uR7lEq6mv7SFGnBr8qTYZRi1bySRgwd +UORuDV12GKTen9WectKtepW0fgYSz+udbDKQyyRef+7xGtCErWRL7f1qr8xm60da ++gSwyD/WkPTY8SP2mdq4u+6m4dWS26kKoENwuL7jUktl/C/EG7NmUKURbXG8lmeu +q59MIs/Fb3SgaO+zN2FZTYp6dyRJHbeEz55JdOu6F+6ihZYH +=j6Xr +-----END PGP PUBLIC KEY BLOCK----- +``` + + +## Tracking Security Updates + +Information about security vulnerabilities are published in the [Security Advisories](https://github.com/weppos/publicsuffix-ruby/security/advisories) page. diff --git a/vendor/bundle/ruby/3.1.0/gems/public_suffix-4.0.7/bin/console b/vendor/bundle/ruby/3.1.0/gems/public_suffix-4.0.7/bin/console new file mode 100755 index 000000000..c638bb43d --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/public_suffix-4.0.7/bin/console @@ -0,0 +1,15 @@ +#!/usr/bin/env ruby +# frozen_string_literal: true + +require "bundler/setup" +require "public_suffix" + +# You can add fixtures and/or initialization code here to make experimenting +# with your gem easier. You can also use a different console, if you like. + +# (If you use this, don't forget to add pry to your Gemfile!) +# require "pry" +# Pry.start + +require "irb" +IRB.start diff --git a/vendor/bundle/ruby/3.1.0/gems/public_suffix-4.0.7/data/list.txt b/vendor/bundle/ruby/3.1.0/gems/public_suffix-4.0.7/data/list.txt new file mode 100644 index 000000000..237e159cb --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/public_suffix-4.0.7/data/list.txt @@ -0,0 +1,14035 @@ +// This Source Code Form is subject to the terms of the Mozilla Public +// License, v. 2.0. If a copy of the MPL was not distributed with this +// file, You can obtain one at https://mozilla.org/MPL/2.0/. + +// Please pull this list from, and only from https://publicsuffix.org/list/public_suffix_list.dat, +// rather than any other VCS sites. Pulling from any other URL is not guaranteed to be supported. + +// Instructions on pulling and using this list can be found at https://publicsuffix.org/list/. + +// ===BEGIN ICANN DOMAINS=== + +// ac : http://nic.ac/rules.htm +ac +com.ac +edu.ac +gov.ac +net.ac +mil.ac +org.ac + +// ad : https://en.wikipedia.org/wiki/.ad +ad +nom.ad + +// ae : https://tdra.gov.ae/en/aeda/ae-policies +ae +co.ae +net.ae +org.ae +sch.ae +ac.ae +gov.ae +mil.ae + +// aero : see https://www.information.aero/index.php?id=66 +aero +accident-investigation.aero +accident-prevention.aero +aerobatic.aero +aeroclub.aero +aerodrome.aero +agents.aero +aircraft.aero +airline.aero +airport.aero +air-surveillance.aero +airtraffic.aero +air-traffic-control.aero +ambulance.aero +amusement.aero +association.aero +author.aero +ballooning.aero +broker.aero +caa.aero +cargo.aero +catering.aero +certification.aero +championship.aero +charter.aero +civilaviation.aero +club.aero +conference.aero +consultant.aero +consulting.aero +control.aero +council.aero +crew.aero +design.aero +dgca.aero +educator.aero +emergency.aero +engine.aero +engineer.aero +entertainment.aero +equipment.aero +exchange.aero +express.aero +federation.aero +flight.aero +fuel.aero +gliding.aero +government.aero +groundhandling.aero +group.aero +hanggliding.aero +homebuilt.aero +insurance.aero +journal.aero +journalist.aero +leasing.aero +logistics.aero +magazine.aero +maintenance.aero +media.aero +microlight.aero +modelling.aero +navigation.aero +parachuting.aero +paragliding.aero +passenger-association.aero +pilot.aero +press.aero +production.aero +recreation.aero +repbody.aero +res.aero +research.aero +rotorcraft.aero +safety.aero +scientist.aero +services.aero +show.aero +skydiving.aero +software.aero +student.aero +trader.aero +trading.aero +trainer.aero +union.aero +workinggroup.aero +works.aero + +// af : http://www.nic.af/help.jsp +af +gov.af +com.af +org.af +net.af +edu.af + +// ag : http://www.nic.ag/prices.htm +ag +com.ag +org.ag +net.ag +co.ag +nom.ag + +// ai : http://nic.com.ai/ +ai +off.ai +com.ai +net.ai +org.ai + +// al : http://www.ert.gov.al/ert_alb/faq_det.html?Id=31 +al +com.al +edu.al +gov.al +mil.al +net.al +org.al + +// am : https://www.amnic.net/policy/en/Policy_EN.pdf +am +co.am +com.am +commune.am +net.am +org.am + +// ao : https://en.wikipedia.org/wiki/.ao +// http://www.dns.ao/REGISTR.DOC +ao +ed.ao +gv.ao +og.ao +co.ao +pb.ao +it.ao + +// aq : https://en.wikipedia.org/wiki/.aq +aq + +// ar : https://nic.ar/es/nic-argentina/normativa +ar +bet.ar +com.ar +coop.ar +edu.ar +gob.ar +gov.ar +int.ar +mil.ar +musica.ar +mutual.ar +net.ar +org.ar +senasa.ar +tur.ar + +// arpa : https://en.wikipedia.org/wiki/.arpa +// Confirmed by registry 2008-06-18 +arpa +e164.arpa +in-addr.arpa +ip6.arpa +iris.arpa +uri.arpa +urn.arpa + +// as : https://en.wikipedia.org/wiki/.as +as +gov.as + +// asia : https://en.wikipedia.org/wiki/.asia +asia + +// at : https://en.wikipedia.org/wiki/.at +// Confirmed by registry 2008-06-17 +at +ac.at +co.at +gv.at +or.at +sth.ac.at + +// au : https://en.wikipedia.org/wiki/.au +// http://www.auda.org.au/ +au +// 2LDs +com.au +net.au +org.au +edu.au +gov.au +asn.au +id.au +// Historic 2LDs (closed to new registration, but sites still exist) +info.au +conf.au +oz.au +// CGDNs - http://www.cgdn.org.au/ +act.au +nsw.au +nt.au +qld.au +sa.au +tas.au +vic.au +wa.au +// 3LDs +act.edu.au +catholic.edu.au +// eq.edu.au - Removed at the request of the Queensland Department of Education +nsw.edu.au +nt.edu.au +qld.edu.au +sa.edu.au +tas.edu.au +vic.edu.au +wa.edu.au +// act.gov.au Bug 984824 - Removed at request of Greg Tankard +// nsw.gov.au Bug 547985 - Removed at request of +// nt.gov.au Bug 940478 - Removed at request of Greg Connors +qld.gov.au +sa.gov.au +tas.gov.au +vic.gov.au +wa.gov.au +// 4LDs +// education.tas.edu.au - Removed at the request of the Department of Education Tasmania +schools.nsw.edu.au + +// aw : https://en.wikipedia.org/wiki/.aw +aw +com.aw + +// ax : https://en.wikipedia.org/wiki/.ax +ax + +// az : https://en.wikipedia.org/wiki/.az +az +com.az +net.az +int.az +gov.az +org.az +edu.az +info.az +pp.az +mil.az +name.az +pro.az +biz.az + +// ba : http://nic.ba/users_data/files/pravilnik_o_registraciji.pdf +ba +com.ba +edu.ba +gov.ba +mil.ba +net.ba +org.ba + +// bb : https://en.wikipedia.org/wiki/.bb +bb +biz.bb +co.bb +com.bb +edu.bb +gov.bb +info.bb +net.bb +org.bb +store.bb +tv.bb + +// bd : https://en.wikipedia.org/wiki/.bd +*.bd + +// be : https://en.wikipedia.org/wiki/.be +// Confirmed by registry 2008-06-08 +be +ac.be + +// bf : https://en.wikipedia.org/wiki/.bf +bf +gov.bf + +// bg : https://en.wikipedia.org/wiki/.bg +// https://www.register.bg/user/static/rules/en/index.html +bg +a.bg +b.bg +c.bg +d.bg +e.bg +f.bg +g.bg +h.bg +i.bg +j.bg +k.bg +l.bg +m.bg +n.bg +o.bg +p.bg +q.bg +r.bg +s.bg +t.bg +u.bg +v.bg +w.bg +x.bg +y.bg +z.bg +0.bg +1.bg +2.bg +3.bg +4.bg +5.bg +6.bg +7.bg +8.bg +9.bg + +// bh : https://en.wikipedia.org/wiki/.bh +bh +com.bh +edu.bh +net.bh +org.bh +gov.bh + +// bi : https://en.wikipedia.org/wiki/.bi +// http://whois.nic.bi/ +bi +co.bi +com.bi +edu.bi +or.bi +org.bi + +// biz : https://en.wikipedia.org/wiki/.biz +biz + +// bj : https://en.wikipedia.org/wiki/.bj +bj +asso.bj +barreau.bj +gouv.bj + +// bm : http://www.bermudanic.bm/dnr-text.txt +bm +com.bm +edu.bm +gov.bm +net.bm +org.bm + +// bn : http://www.bnnic.bn/faqs +bn +com.bn +edu.bn +gov.bn +net.bn +org.bn + +// bo : https://nic.bo/delegacion2015.php#h-1.10 +bo +com.bo +edu.bo +gob.bo +int.bo +org.bo +net.bo +mil.bo +tv.bo +web.bo +// Social Domains +academia.bo +agro.bo +arte.bo +blog.bo +bolivia.bo +ciencia.bo +cooperativa.bo +democracia.bo +deporte.bo +ecologia.bo +economia.bo +empresa.bo +indigena.bo +industria.bo +info.bo +medicina.bo +movimiento.bo +musica.bo +natural.bo +nombre.bo +noticias.bo +patria.bo +politica.bo +profesional.bo +plurinacional.bo +pueblo.bo +revista.bo +salud.bo +tecnologia.bo +tksat.bo +transporte.bo +wiki.bo + +// br : http://registro.br/dominio/categoria.html +// Submitted by registry +br +9guacu.br +abc.br +adm.br +adv.br +agr.br +aju.br +am.br +anani.br +aparecida.br +app.br +arq.br +art.br +ato.br +b.br +barueri.br +belem.br +bhz.br +bib.br +bio.br +blog.br +bmd.br +boavista.br +bsb.br +campinagrande.br +campinas.br +caxias.br +cim.br +cng.br +cnt.br +com.br +contagem.br +coop.br +coz.br +cri.br +cuiaba.br +curitiba.br +def.br +des.br +det.br +dev.br +ecn.br +eco.br +edu.br +emp.br +enf.br +eng.br +esp.br +etc.br +eti.br +far.br +feira.br +flog.br +floripa.br +fm.br +fnd.br +fortal.br +fot.br +foz.br +fst.br +g12.br +geo.br +ggf.br +goiania.br +gov.br +// gov.br 26 states + df https://en.wikipedia.org/wiki/States_of_Brazil +ac.gov.br +al.gov.br +am.gov.br +ap.gov.br +ba.gov.br +ce.gov.br +df.gov.br +es.gov.br +go.gov.br +ma.gov.br +mg.gov.br +ms.gov.br +mt.gov.br +pa.gov.br +pb.gov.br +pe.gov.br +pi.gov.br +pr.gov.br +rj.gov.br +rn.gov.br +ro.gov.br +rr.gov.br +rs.gov.br +sc.gov.br +se.gov.br +sp.gov.br +to.gov.br +gru.br +imb.br +ind.br +inf.br +jab.br +jampa.br +jdf.br +joinville.br +jor.br +jus.br +leg.br +lel.br +log.br +londrina.br +macapa.br +maceio.br +manaus.br +maringa.br +mat.br +med.br +mil.br +morena.br +mp.br +mus.br +natal.br +net.br +niteroi.br +*.nom.br +not.br +ntr.br +odo.br +ong.br +org.br +osasco.br +palmas.br +poa.br +ppg.br +pro.br +psc.br +psi.br +pvh.br +qsl.br +radio.br +rec.br +recife.br +rep.br +ribeirao.br +rio.br +riobranco.br +riopreto.br +salvador.br +sampa.br +santamaria.br +santoandre.br +saobernardo.br +saogonca.br +seg.br +sjc.br +slg.br +slz.br +sorocaba.br +srv.br +taxi.br +tc.br +tec.br +teo.br +the.br +tmp.br +trd.br +tur.br +tv.br +udi.br +vet.br +vix.br +vlog.br +wiki.br +zlg.br + +// bs : http://www.nic.bs/rules.html +bs +com.bs +net.bs +org.bs +edu.bs +gov.bs + +// bt : https://en.wikipedia.org/wiki/.bt +bt +com.bt +edu.bt +gov.bt +net.bt +org.bt + +// bv : No registrations at this time. +// Submitted by registry +bv + +// bw : https://en.wikipedia.org/wiki/.bw +// http://www.gobin.info/domainname/bw.doc +// list of other 2nd level tlds ? +bw +co.bw +org.bw + +// by : https://en.wikipedia.org/wiki/.by +// http://tld.by/rules_2006_en.html +// list of other 2nd level tlds ? +by +gov.by +mil.by +// Official information does not indicate that com.by is a reserved +// second-level domain, but it's being used as one (see www.google.com.by and +// www.yahoo.com.by, for example), so we list it here for safety's sake. +com.by + +// http://hoster.by/ +of.by + +// bz : https://en.wikipedia.org/wiki/.bz +// http://www.belizenic.bz/ +bz +com.bz +net.bz +org.bz +edu.bz +gov.bz + +// ca : https://en.wikipedia.org/wiki/.ca +ca +// ca geographical names +ab.ca +bc.ca +mb.ca +nb.ca +nf.ca +nl.ca +ns.ca +nt.ca +nu.ca +on.ca +pe.ca +qc.ca +sk.ca +yk.ca +// gc.ca: https://en.wikipedia.org/wiki/.gc.ca +// see also: http://registry.gc.ca/en/SubdomainFAQ +gc.ca + +// cat : https://en.wikipedia.org/wiki/.cat +cat + +// cc : https://en.wikipedia.org/wiki/.cc +cc + +// cd : https://en.wikipedia.org/wiki/.cd +// see also: https://www.nic.cd/domain/insertDomain_2.jsp?act=1 +cd +gov.cd + +// cf : https://en.wikipedia.org/wiki/.cf +cf + +// cg : https://en.wikipedia.org/wiki/.cg +cg + +// ch : https://en.wikipedia.org/wiki/.ch +ch + +// ci : https://en.wikipedia.org/wiki/.ci +// http://www.nic.ci/index.php?page=charte +ci +org.ci +or.ci +com.ci +co.ci +edu.ci +ed.ci +ac.ci +net.ci +go.ci +asso.ci +aéroport.ci +int.ci +presse.ci +md.ci +gouv.ci + +// ck : https://en.wikipedia.org/wiki/.ck +*.ck +!www.ck + +// cl : https://www.nic.cl +// Confirmed by .CL registry +cl +co.cl +gob.cl +gov.cl +mil.cl + +// cm : https://en.wikipedia.org/wiki/.cm plus bug 981927 +cm +co.cm +com.cm +gov.cm +net.cm + +// cn : https://en.wikipedia.org/wiki/.cn +// Submitted by registry +cn +ac.cn +com.cn +edu.cn +gov.cn +net.cn +org.cn +mil.cn +公司.cn +网络.cn +網絡.cn +// cn geographic names +ah.cn +bj.cn +cq.cn +fj.cn +gd.cn +gs.cn +gz.cn +gx.cn +ha.cn +hb.cn +he.cn +hi.cn +hl.cn +hn.cn +jl.cn +js.cn +jx.cn +ln.cn +nm.cn +nx.cn +qh.cn +sc.cn +sd.cn +sh.cn +sn.cn +sx.cn +tj.cn +xj.cn +xz.cn +yn.cn +zj.cn +hk.cn +mo.cn +tw.cn + +// co : https://en.wikipedia.org/wiki/.co +// Submitted by registry +co +arts.co +com.co +edu.co +firm.co +gov.co +info.co +int.co +mil.co +net.co +nom.co +org.co +rec.co +web.co + +// com : https://en.wikipedia.org/wiki/.com +com + +// coop : https://en.wikipedia.org/wiki/.coop +coop + +// cr : http://www.nic.cr/niccr_publico/showRegistroDominiosScreen.do +cr +ac.cr +co.cr +ed.cr +fi.cr +go.cr +or.cr +sa.cr + +// cu : https://en.wikipedia.org/wiki/.cu +cu +com.cu +edu.cu +org.cu +net.cu +gov.cu +inf.cu + +// cv : https://en.wikipedia.org/wiki/.cv +// cv : http://www.dns.cv/tldcv_portal/do?com=DS;5446457100;111;+PAGE(4000018)+K-CAT-CODIGO(RDOM)+RCNT(100); <- registration rules +cv +com.cv +edu.cv +int.cv +nome.cv +org.cv + +// cw : http://www.una.cw/cw_registry/ +// Confirmed by registry 2013-03-26 +cw +com.cw +edu.cw +net.cw +org.cw + +// cx : https://en.wikipedia.org/wiki/.cx +// list of other 2nd level tlds ? +cx +gov.cx + +// cy : http://www.nic.cy/ +// Submitted by registry Panayiotou Fotia +// namespace policies URL https://www.nic.cy/portal//sites/default/files/symfonia_gia_eggrafi.pdf +cy +ac.cy +biz.cy +com.cy +ekloges.cy +gov.cy +ltd.cy +mil.cy +net.cy +org.cy +press.cy +pro.cy +tm.cy + +// cz : https://en.wikipedia.org/wiki/.cz +cz + +// de : https://en.wikipedia.org/wiki/.de +// Confirmed by registry (with technical +// reservations) 2008-07-01 +de + +// dj : https://en.wikipedia.org/wiki/.dj +dj + +// dk : https://en.wikipedia.org/wiki/.dk +// Confirmed by registry 2008-06-17 +dk + +// dm : https://en.wikipedia.org/wiki/.dm +dm +com.dm +net.dm +org.dm +edu.dm +gov.dm + +// do : https://en.wikipedia.org/wiki/.do +do +art.do +com.do +edu.do +gob.do +gov.do +mil.do +net.do +org.do +sld.do +web.do + +// dz : http://www.nic.dz/images/pdf_nic/charte.pdf +dz +art.dz +asso.dz +com.dz +edu.dz +gov.dz +org.dz +net.dz +pol.dz +soc.dz +tm.dz + +// ec : http://www.nic.ec/reg/paso1.asp +// Submitted by registry +ec +com.ec +info.ec +net.ec +fin.ec +k12.ec +med.ec +pro.ec +org.ec +edu.ec +gov.ec +gob.ec +mil.ec + +// edu : https://en.wikipedia.org/wiki/.edu +edu + +// ee : http://www.eenet.ee/EENet/dom_reeglid.html#lisa_B +ee +edu.ee +gov.ee +riik.ee +lib.ee +med.ee +com.ee +pri.ee +aip.ee +org.ee +fie.ee + +// eg : https://en.wikipedia.org/wiki/.eg +eg +com.eg +edu.eg +eun.eg +gov.eg +mil.eg +name.eg +net.eg +org.eg +sci.eg + +// er : https://en.wikipedia.org/wiki/.er +*.er + +// es : https://www.nic.es/site_ingles/ingles/dominios/index.html +es +com.es +nom.es +org.es +gob.es +edu.es + +// et : https://en.wikipedia.org/wiki/.et +et +com.et +gov.et +org.et +edu.et +biz.et +name.et +info.et +net.et + +// eu : https://en.wikipedia.org/wiki/.eu +eu + +// fi : https://en.wikipedia.org/wiki/.fi +fi +// aland.fi : https://en.wikipedia.org/wiki/.ax +// This domain is being phased out in favor of .ax. As there are still many +// domains under aland.fi, we still keep it on the list until aland.fi is +// completely removed. +// TODO: Check for updates (expected to be phased out around Q1/2009) +aland.fi + +// fj : http://domains.fj/ +// Submitted by registry 2020-02-11 +fj +ac.fj +biz.fj +com.fj +gov.fj +info.fj +mil.fj +name.fj +net.fj +org.fj +pro.fj + +// fk : https://en.wikipedia.org/wiki/.fk +*.fk + +// fm : https://en.wikipedia.org/wiki/.fm +com.fm +edu.fm +net.fm +org.fm +fm + +// fo : https://en.wikipedia.org/wiki/.fo +fo + +// fr : http://www.afnic.fr/ +// domaines descriptifs : https://www.afnic.fr/medias/documents/Cadre_legal/Afnic_Naming_Policy_12122016_VEN.pdf +fr +asso.fr +com.fr +gouv.fr +nom.fr +prd.fr +tm.fr +// domaines sectoriels : https://www.afnic.fr/en/products-and-services/the-fr-tld/sector-based-fr-domains-4.html +aeroport.fr +avocat.fr +avoues.fr +cci.fr +chambagri.fr +chirurgiens-dentistes.fr +experts-comptables.fr +geometre-expert.fr +greta.fr +huissier-justice.fr +medecin.fr +notaires.fr +pharmacien.fr +port.fr +veterinaire.fr + +// ga : https://en.wikipedia.org/wiki/.ga +ga + +// gb : This registry is effectively dormant +// Submitted by registry +gb + +// gd : https://en.wikipedia.org/wiki/.gd +edu.gd +gov.gd +gd + +// ge : http://www.nic.net.ge/policy_en.pdf +ge +com.ge +edu.ge +gov.ge +org.ge +mil.ge +net.ge +pvt.ge + +// gf : https://en.wikipedia.org/wiki/.gf +gf + +// gg : http://www.channelisles.net/register-domains/ +// Confirmed by registry 2013-11-28 +gg +co.gg +net.gg +org.gg + +// gh : https://en.wikipedia.org/wiki/.gh +// see also: http://www.nic.gh/reg_now.php +// Although domains directly at second level are not possible at the moment, +// they have been possible for some time and may come back. +gh +com.gh +edu.gh +gov.gh +org.gh +mil.gh + +// gi : http://www.nic.gi/rules.html +gi +com.gi +ltd.gi +gov.gi +mod.gi +edu.gi +org.gi + +// gl : https://en.wikipedia.org/wiki/.gl +// http://nic.gl +gl +co.gl +com.gl +edu.gl +net.gl +org.gl + +// gm : http://www.nic.gm/htmlpages%5Cgm-policy.htm +gm + +// gn : http://psg.com/dns/gn/gn.txt +// Submitted by registry +gn +ac.gn +com.gn +edu.gn +gov.gn +org.gn +net.gn + +// gov : https://en.wikipedia.org/wiki/.gov +gov + +// gp : http://www.nic.gp/index.php?lang=en +gp +com.gp +net.gp +mobi.gp +edu.gp +org.gp +asso.gp + +// gq : https://en.wikipedia.org/wiki/.gq +gq + +// gr : https://grweb.ics.forth.gr/english/1617-B-2005.html +// Submitted by registry +gr +com.gr +edu.gr +net.gr +org.gr +gov.gr + +// gs : https://en.wikipedia.org/wiki/.gs +gs + +// gt : https://www.gt/sitio/registration_policy.php?lang=en +gt +com.gt +edu.gt +gob.gt +ind.gt +mil.gt +net.gt +org.gt + +// gu : http://gadao.gov.gu/register.html +// University of Guam : https://www.uog.edu +// Submitted by uognoc@triton.uog.edu +gu +com.gu +edu.gu +gov.gu +guam.gu +info.gu +net.gu +org.gu +web.gu + +// gw : https://en.wikipedia.org/wiki/.gw +// gw : https://nic.gw/regras/ +gw + +// gy : https://en.wikipedia.org/wiki/.gy +// http://registry.gy/ +gy +co.gy +com.gy +edu.gy +gov.gy +net.gy +org.gy + +// hk : https://www.hkirc.hk +// Submitted by registry +hk +com.hk +edu.hk +gov.hk +idv.hk +net.hk +org.hk +公司.hk +教育.hk +敎育.hk +政府.hk +個人.hk +个人.hk +箇人.hk +網络.hk +网络.hk +组織.hk +網絡.hk +网絡.hk +组织.hk +組織.hk +組织.hk + +// hm : https://en.wikipedia.org/wiki/.hm +hm + +// hn : http://www.nic.hn/politicas/ps02,,05.html +hn +com.hn +edu.hn +org.hn +net.hn +mil.hn +gob.hn + +// hr : http://www.dns.hr/documents/pdf/HRTLD-regulations.pdf +hr +iz.hr +from.hr +name.hr +com.hr + +// ht : http://www.nic.ht/info/charte.cfm +ht +com.ht +shop.ht +firm.ht +info.ht +adult.ht +net.ht +pro.ht +org.ht +med.ht +art.ht +coop.ht +pol.ht +asso.ht +edu.ht +rel.ht +gouv.ht +perso.ht + +// hu : http://www.domain.hu/domain/English/sld.html +// Confirmed by registry 2008-06-12 +hu +co.hu +info.hu +org.hu +priv.hu +sport.hu +tm.hu +2000.hu +agrar.hu +bolt.hu +casino.hu +city.hu +erotica.hu +erotika.hu +film.hu +forum.hu +games.hu +hotel.hu +ingatlan.hu +jogasz.hu +konyvelo.hu +lakas.hu +media.hu +news.hu +reklam.hu +sex.hu +shop.hu +suli.hu +szex.hu +tozsde.hu +utazas.hu +video.hu + +// id : https://pandi.id/en/domain/registration-requirements/ +id +ac.id +biz.id +co.id +desa.id +go.id +mil.id +my.id +net.id +or.id +ponpes.id +sch.id +web.id + +// ie : https://en.wikipedia.org/wiki/.ie +ie +gov.ie + +// il : http://www.isoc.org.il/domains/ +il +ac.il +co.il +gov.il +idf.il +k12.il +muni.il +net.il +org.il + +// im : https://www.nic.im/ +// Submitted by registry +im +ac.im +co.im +com.im +ltd.co.im +net.im +org.im +plc.co.im +tt.im +tv.im + +// in : https://en.wikipedia.org/wiki/.in +// see also: https://registry.in/Policies +// Please note, that nic.in is not an official eTLD, but used by most +// government institutions. +in +co.in +firm.in +net.in +org.in +gen.in +ind.in +nic.in +ac.in +edu.in +res.in +gov.in +mil.in + +// info : https://en.wikipedia.org/wiki/.info +info + +// int : https://en.wikipedia.org/wiki/.int +// Confirmed by registry 2008-06-18 +int +eu.int + +// io : http://www.nic.io/rules.htm +// list of other 2nd level tlds ? +io +com.io + +// iq : http://www.cmc.iq/english/iq/iqregister1.htm +iq +gov.iq +edu.iq +mil.iq +com.iq +org.iq +net.iq + +// ir : http://www.nic.ir/Terms_and_Conditions_ir,_Appendix_1_Domain_Rules +// Also see http://www.nic.ir/Internationalized_Domain_Names +// Two .ir entries added at request of , 2010-04-16 +ir +ac.ir +co.ir +gov.ir +id.ir +net.ir +org.ir +sch.ir +// xn--mgba3a4f16a.ir (.ir, Persian YEH) +ایران.ir +// xn--mgba3a4fra.ir (.ir, Arabic YEH) +ايران.ir + +// is : http://www.isnic.is/domain/rules.php +// Confirmed by registry 2008-12-06 +is +net.is +com.is +edu.is +gov.is +org.is +int.is + +// it : https://en.wikipedia.org/wiki/.it +it +gov.it +edu.it +// Reserved geo-names (regions and provinces): +// https://www.nic.it/sites/default/files/archivio/docs/Regulation_assignation_v7.1.pdf +// Regions +abr.it +abruzzo.it +aosta-valley.it +aostavalley.it +bas.it +basilicata.it +cal.it +calabria.it +cam.it +campania.it +emilia-romagna.it +emiliaromagna.it +emr.it +friuli-v-giulia.it +friuli-ve-giulia.it +friuli-vegiulia.it +friuli-venezia-giulia.it +friuli-veneziagiulia.it +friuli-vgiulia.it +friuliv-giulia.it +friulive-giulia.it +friulivegiulia.it +friulivenezia-giulia.it +friuliveneziagiulia.it +friulivgiulia.it +fvg.it +laz.it +lazio.it +lig.it +liguria.it +lom.it +lombardia.it +lombardy.it +lucania.it +mar.it +marche.it +mol.it +molise.it +piedmont.it +piemonte.it +pmn.it +pug.it +puglia.it +sar.it +sardegna.it +sardinia.it +sic.it +sicilia.it +sicily.it +taa.it +tos.it +toscana.it +trentin-sud-tirol.it +trentin-süd-tirol.it +trentin-sudtirol.it +trentin-südtirol.it +trentin-sued-tirol.it +trentin-suedtirol.it +trentino-a-adige.it +trentino-aadige.it +trentino-alto-adige.it +trentino-altoadige.it +trentino-s-tirol.it +trentino-stirol.it +trentino-sud-tirol.it +trentino-süd-tirol.it +trentino-sudtirol.it +trentino-südtirol.it +trentino-sued-tirol.it +trentino-suedtirol.it +trentino.it +trentinoa-adige.it +trentinoaadige.it +trentinoalto-adige.it +trentinoaltoadige.it +trentinos-tirol.it +trentinostirol.it +trentinosud-tirol.it +trentinosüd-tirol.it +trentinosudtirol.it +trentinosüdtirol.it +trentinosued-tirol.it +trentinosuedtirol.it +trentinsud-tirol.it +trentinsüd-tirol.it +trentinsudtirol.it +trentinsüdtirol.it +trentinsued-tirol.it +trentinsuedtirol.it +tuscany.it +umb.it +umbria.it +val-d-aosta.it +val-daosta.it +vald-aosta.it +valdaosta.it +valle-aosta.it +valle-d-aosta.it +valle-daosta.it +valleaosta.it +valled-aosta.it +valledaosta.it +vallee-aoste.it +vallée-aoste.it +vallee-d-aoste.it +vallée-d-aoste.it +valleeaoste.it +valléeaoste.it +valleedaoste.it +valléedaoste.it +vao.it +vda.it +ven.it +veneto.it +// Provinces +ag.it +agrigento.it +al.it +alessandria.it +alto-adige.it +altoadige.it +an.it +ancona.it +andria-barletta-trani.it +andria-trani-barletta.it +andriabarlettatrani.it +andriatranibarletta.it +ao.it +aosta.it +aoste.it +ap.it +aq.it +aquila.it +ar.it +arezzo.it +ascoli-piceno.it +ascolipiceno.it +asti.it +at.it +av.it +avellino.it +ba.it +balsan-sudtirol.it +balsan-südtirol.it +balsan-suedtirol.it +balsan.it +bari.it +barletta-trani-andria.it +barlettatraniandria.it +belluno.it +benevento.it +bergamo.it +bg.it +bi.it +biella.it +bl.it +bn.it +bo.it +bologna.it +bolzano-altoadige.it +bolzano.it +bozen-sudtirol.it +bozen-südtirol.it +bozen-suedtirol.it +bozen.it +br.it +brescia.it +brindisi.it +bs.it +bt.it +bulsan-sudtirol.it +bulsan-südtirol.it +bulsan-suedtirol.it +bulsan.it +bz.it +ca.it +cagliari.it +caltanissetta.it +campidano-medio.it +campidanomedio.it +campobasso.it +carbonia-iglesias.it +carboniaiglesias.it +carrara-massa.it +carraramassa.it +caserta.it +catania.it +catanzaro.it +cb.it +ce.it +cesena-forli.it +cesena-forlì.it +cesenaforli.it +cesenaforlì.it +ch.it +chieti.it +ci.it +cl.it +cn.it +co.it +como.it +cosenza.it +cr.it +cremona.it +crotone.it +cs.it +ct.it +cuneo.it +cz.it +dell-ogliastra.it +dellogliastra.it +en.it +enna.it +fc.it +fe.it +fermo.it +ferrara.it +fg.it +fi.it +firenze.it +florence.it +fm.it +foggia.it +forli-cesena.it +forlì-cesena.it +forlicesena.it +forlìcesena.it +fr.it +frosinone.it +ge.it +genoa.it +genova.it +go.it +gorizia.it +gr.it +grosseto.it +iglesias-carbonia.it +iglesiascarbonia.it +im.it +imperia.it +is.it +isernia.it +kr.it +la-spezia.it +laquila.it +laspezia.it +latina.it +lc.it +le.it +lecce.it +lecco.it +li.it +livorno.it +lo.it +lodi.it +lt.it +lu.it +lucca.it +macerata.it +mantova.it +massa-carrara.it +massacarrara.it +matera.it +mb.it +mc.it +me.it +medio-campidano.it +mediocampidano.it +messina.it +mi.it +milan.it +milano.it +mn.it +mo.it +modena.it +monza-brianza.it +monza-e-della-brianza.it +monza.it +monzabrianza.it +monzaebrianza.it +monzaedellabrianza.it +ms.it +mt.it +na.it +naples.it +napoli.it +no.it +novara.it +nu.it +nuoro.it +og.it +ogliastra.it +olbia-tempio.it +olbiatempio.it +or.it +oristano.it +ot.it +pa.it +padova.it +padua.it +palermo.it +parma.it +pavia.it +pc.it +pd.it +pe.it +perugia.it +pesaro-urbino.it +pesarourbino.it +pescara.it +pg.it +pi.it +piacenza.it +pisa.it +pistoia.it +pn.it +po.it +pordenone.it +potenza.it +pr.it +prato.it +pt.it +pu.it +pv.it +pz.it +ra.it +ragusa.it +ravenna.it +rc.it +re.it +reggio-calabria.it +reggio-emilia.it +reggiocalabria.it +reggioemilia.it +rg.it +ri.it +rieti.it +rimini.it +rm.it +rn.it +ro.it +roma.it +rome.it +rovigo.it +sa.it +salerno.it +sassari.it +savona.it +si.it +siena.it +siracusa.it +so.it +sondrio.it +sp.it +sr.it +ss.it +suedtirol.it +südtirol.it +sv.it +ta.it +taranto.it +te.it +tempio-olbia.it +tempioolbia.it +teramo.it +terni.it +tn.it +to.it +torino.it +tp.it +tr.it +trani-andria-barletta.it +trani-barletta-andria.it +traniandriabarletta.it +tranibarlettaandria.it +trapani.it +trento.it +treviso.it +trieste.it +ts.it +turin.it +tv.it +ud.it +udine.it +urbino-pesaro.it +urbinopesaro.it +va.it +varese.it +vb.it +vc.it +ve.it +venezia.it +venice.it +verbania.it +vercelli.it +verona.it +vi.it +vibo-valentia.it +vibovalentia.it +vicenza.it +viterbo.it +vr.it +vs.it +vt.it +vv.it + +// je : http://www.channelisles.net/register-domains/ +// Confirmed by registry 2013-11-28 +je +co.je +net.je +org.je + +// jm : http://www.com.jm/register.html +*.jm + +// jo : http://www.dns.jo/Registration_policy.aspx +jo +com.jo +org.jo +net.jo +edu.jo +sch.jo +gov.jo +mil.jo +name.jo + +// jobs : https://en.wikipedia.org/wiki/.jobs +jobs + +// jp : https://en.wikipedia.org/wiki/.jp +// http://jprs.co.jp/en/jpdomain.html +// Submitted by registry +jp +// jp organizational type names +ac.jp +ad.jp +co.jp +ed.jp +go.jp +gr.jp +lg.jp +ne.jp +or.jp +// jp prefecture type names +aichi.jp +akita.jp +aomori.jp +chiba.jp +ehime.jp +fukui.jp +fukuoka.jp +fukushima.jp +gifu.jp +gunma.jp +hiroshima.jp +hokkaido.jp +hyogo.jp +ibaraki.jp +ishikawa.jp +iwate.jp +kagawa.jp +kagoshima.jp +kanagawa.jp +kochi.jp +kumamoto.jp +kyoto.jp +mie.jp +miyagi.jp +miyazaki.jp +nagano.jp +nagasaki.jp +nara.jp +niigata.jp +oita.jp +okayama.jp +okinawa.jp +osaka.jp +saga.jp +saitama.jp +shiga.jp +shimane.jp +shizuoka.jp +tochigi.jp +tokushima.jp +tokyo.jp +tottori.jp +toyama.jp +wakayama.jp +yamagata.jp +yamaguchi.jp +yamanashi.jp +栃木.jp +愛知.jp +愛媛.jp +兵庫.jp +熊本.jp +茨城.jp +北海道.jp +千葉.jp +和歌山.jp +長崎.jp +長野.jp +新潟.jp +青森.jp +静岡.jp +東京.jp +石川.jp +埼玉.jp +三重.jp +京都.jp +佐賀.jp +大分.jp +大阪.jp +奈良.jp +宮城.jp +宮崎.jp +富山.jp +山口.jp +山形.jp +山梨.jp +岩手.jp +岐阜.jp +岡山.jp +島根.jp +広島.jp +徳島.jp +沖縄.jp +滋賀.jp +神奈川.jp +福井.jp +福岡.jp +福島.jp +秋田.jp +群馬.jp +香川.jp +高知.jp +鳥取.jp +鹿児島.jp +// jp geographic type names +// http://jprs.jp/doc/rule/saisoku-1.html +*.kawasaki.jp +*.kitakyushu.jp +*.kobe.jp +*.nagoya.jp +*.sapporo.jp +*.sendai.jp +*.yokohama.jp +!city.kawasaki.jp +!city.kitakyushu.jp +!city.kobe.jp +!city.nagoya.jp +!city.sapporo.jp +!city.sendai.jp +!city.yokohama.jp +// 4th level registration +aisai.aichi.jp +ama.aichi.jp +anjo.aichi.jp +asuke.aichi.jp +chiryu.aichi.jp +chita.aichi.jp +fuso.aichi.jp +gamagori.aichi.jp +handa.aichi.jp +hazu.aichi.jp +hekinan.aichi.jp +higashiura.aichi.jp +ichinomiya.aichi.jp +inazawa.aichi.jp +inuyama.aichi.jp +isshiki.aichi.jp +iwakura.aichi.jp +kanie.aichi.jp +kariya.aichi.jp +kasugai.aichi.jp +kira.aichi.jp +kiyosu.aichi.jp +komaki.aichi.jp +konan.aichi.jp +kota.aichi.jp +mihama.aichi.jp +miyoshi.aichi.jp +nishio.aichi.jp +nisshin.aichi.jp +obu.aichi.jp +oguchi.aichi.jp +oharu.aichi.jp +okazaki.aichi.jp +owariasahi.aichi.jp +seto.aichi.jp +shikatsu.aichi.jp +shinshiro.aichi.jp +shitara.aichi.jp +tahara.aichi.jp +takahama.aichi.jp +tobishima.aichi.jp +toei.aichi.jp +togo.aichi.jp +tokai.aichi.jp +tokoname.aichi.jp +toyoake.aichi.jp +toyohashi.aichi.jp +toyokawa.aichi.jp +toyone.aichi.jp +toyota.aichi.jp +tsushima.aichi.jp +yatomi.aichi.jp +akita.akita.jp +daisen.akita.jp +fujisato.akita.jp +gojome.akita.jp +hachirogata.akita.jp +happou.akita.jp +higashinaruse.akita.jp +honjo.akita.jp +honjyo.akita.jp +ikawa.akita.jp +kamikoani.akita.jp +kamioka.akita.jp +katagami.akita.jp +kazuno.akita.jp +kitaakita.akita.jp +kosaka.akita.jp +kyowa.akita.jp +misato.akita.jp +mitane.akita.jp +moriyoshi.akita.jp +nikaho.akita.jp +noshiro.akita.jp +odate.akita.jp +oga.akita.jp +ogata.akita.jp +semboku.akita.jp +yokote.akita.jp +yurihonjo.akita.jp +aomori.aomori.jp +gonohe.aomori.jp +hachinohe.aomori.jp +hashikami.aomori.jp +hiranai.aomori.jp +hirosaki.aomori.jp +itayanagi.aomori.jp +kuroishi.aomori.jp +misawa.aomori.jp +mutsu.aomori.jp +nakadomari.aomori.jp +noheji.aomori.jp +oirase.aomori.jp +owani.aomori.jp +rokunohe.aomori.jp +sannohe.aomori.jp +shichinohe.aomori.jp +shingo.aomori.jp +takko.aomori.jp +towada.aomori.jp +tsugaru.aomori.jp +tsuruta.aomori.jp +abiko.chiba.jp +asahi.chiba.jp +chonan.chiba.jp +chosei.chiba.jp +choshi.chiba.jp +chuo.chiba.jp +funabashi.chiba.jp +futtsu.chiba.jp +hanamigawa.chiba.jp +ichihara.chiba.jp +ichikawa.chiba.jp +ichinomiya.chiba.jp +inzai.chiba.jp +isumi.chiba.jp +kamagaya.chiba.jp +kamogawa.chiba.jp +kashiwa.chiba.jp +katori.chiba.jp +katsuura.chiba.jp +kimitsu.chiba.jp +kisarazu.chiba.jp +kozaki.chiba.jp +kujukuri.chiba.jp +kyonan.chiba.jp +matsudo.chiba.jp +midori.chiba.jp +mihama.chiba.jp +minamiboso.chiba.jp +mobara.chiba.jp +mutsuzawa.chiba.jp +nagara.chiba.jp +nagareyama.chiba.jp +narashino.chiba.jp +narita.chiba.jp +noda.chiba.jp +oamishirasato.chiba.jp +omigawa.chiba.jp +onjuku.chiba.jp +otaki.chiba.jp +sakae.chiba.jp +sakura.chiba.jp +shimofusa.chiba.jp +shirako.chiba.jp +shiroi.chiba.jp +shisui.chiba.jp +sodegaura.chiba.jp +sosa.chiba.jp +tako.chiba.jp +tateyama.chiba.jp +togane.chiba.jp +tohnosho.chiba.jp +tomisato.chiba.jp +urayasu.chiba.jp +yachimata.chiba.jp +yachiyo.chiba.jp +yokaichiba.chiba.jp +yokoshibahikari.chiba.jp +yotsukaido.chiba.jp +ainan.ehime.jp +honai.ehime.jp +ikata.ehime.jp +imabari.ehime.jp +iyo.ehime.jp +kamijima.ehime.jp +kihoku.ehime.jp +kumakogen.ehime.jp +masaki.ehime.jp +matsuno.ehime.jp +matsuyama.ehime.jp +namikata.ehime.jp +niihama.ehime.jp +ozu.ehime.jp +saijo.ehime.jp +seiyo.ehime.jp +shikokuchuo.ehime.jp +tobe.ehime.jp +toon.ehime.jp +uchiko.ehime.jp +uwajima.ehime.jp +yawatahama.ehime.jp +echizen.fukui.jp +eiheiji.fukui.jp +fukui.fukui.jp +ikeda.fukui.jp +katsuyama.fukui.jp +mihama.fukui.jp +minamiechizen.fukui.jp +obama.fukui.jp +ohi.fukui.jp +ono.fukui.jp +sabae.fukui.jp +sakai.fukui.jp +takahama.fukui.jp +tsuruga.fukui.jp +wakasa.fukui.jp +ashiya.fukuoka.jp +buzen.fukuoka.jp +chikugo.fukuoka.jp +chikuho.fukuoka.jp +chikujo.fukuoka.jp +chikushino.fukuoka.jp +chikuzen.fukuoka.jp +chuo.fukuoka.jp +dazaifu.fukuoka.jp +fukuchi.fukuoka.jp +hakata.fukuoka.jp +higashi.fukuoka.jp +hirokawa.fukuoka.jp +hisayama.fukuoka.jp +iizuka.fukuoka.jp +inatsuki.fukuoka.jp +kaho.fukuoka.jp +kasuga.fukuoka.jp +kasuya.fukuoka.jp +kawara.fukuoka.jp +keisen.fukuoka.jp +koga.fukuoka.jp +kurate.fukuoka.jp +kurogi.fukuoka.jp +kurume.fukuoka.jp +minami.fukuoka.jp +miyako.fukuoka.jp +miyama.fukuoka.jp +miyawaka.fukuoka.jp +mizumaki.fukuoka.jp +munakata.fukuoka.jp +nakagawa.fukuoka.jp +nakama.fukuoka.jp +nishi.fukuoka.jp +nogata.fukuoka.jp +ogori.fukuoka.jp +okagaki.fukuoka.jp +okawa.fukuoka.jp +oki.fukuoka.jp +omuta.fukuoka.jp +onga.fukuoka.jp +onojo.fukuoka.jp +oto.fukuoka.jp +saigawa.fukuoka.jp +sasaguri.fukuoka.jp +shingu.fukuoka.jp +shinyoshitomi.fukuoka.jp +shonai.fukuoka.jp +soeda.fukuoka.jp +sue.fukuoka.jp +tachiarai.fukuoka.jp +tagawa.fukuoka.jp +takata.fukuoka.jp +toho.fukuoka.jp +toyotsu.fukuoka.jp +tsuiki.fukuoka.jp +ukiha.fukuoka.jp +umi.fukuoka.jp +usui.fukuoka.jp +yamada.fukuoka.jp +yame.fukuoka.jp +yanagawa.fukuoka.jp +yukuhashi.fukuoka.jp +aizubange.fukushima.jp +aizumisato.fukushima.jp +aizuwakamatsu.fukushima.jp +asakawa.fukushima.jp +bandai.fukushima.jp +date.fukushima.jp +fukushima.fukushima.jp +furudono.fukushima.jp +futaba.fukushima.jp +hanawa.fukushima.jp +higashi.fukushima.jp +hirata.fukushima.jp +hirono.fukushima.jp +iitate.fukushima.jp +inawashiro.fukushima.jp +ishikawa.fukushima.jp +iwaki.fukushima.jp +izumizaki.fukushima.jp +kagamiishi.fukushima.jp +kaneyama.fukushima.jp +kawamata.fukushima.jp +kitakata.fukushima.jp +kitashiobara.fukushima.jp +koori.fukushima.jp +koriyama.fukushima.jp +kunimi.fukushima.jp +miharu.fukushima.jp +mishima.fukushima.jp +namie.fukushima.jp +nango.fukushima.jp +nishiaizu.fukushima.jp +nishigo.fukushima.jp +okuma.fukushima.jp +omotego.fukushima.jp +ono.fukushima.jp +otama.fukushima.jp +samegawa.fukushima.jp +shimogo.fukushima.jp +shirakawa.fukushima.jp +showa.fukushima.jp +soma.fukushima.jp +sukagawa.fukushima.jp +taishin.fukushima.jp +tamakawa.fukushima.jp +tanagura.fukushima.jp +tenei.fukushima.jp +yabuki.fukushima.jp +yamato.fukushima.jp +yamatsuri.fukushima.jp +yanaizu.fukushima.jp +yugawa.fukushima.jp +anpachi.gifu.jp +ena.gifu.jp +gifu.gifu.jp +ginan.gifu.jp +godo.gifu.jp +gujo.gifu.jp +hashima.gifu.jp +hichiso.gifu.jp +hida.gifu.jp +higashishirakawa.gifu.jp +ibigawa.gifu.jp +ikeda.gifu.jp +kakamigahara.gifu.jp +kani.gifu.jp +kasahara.gifu.jp +kasamatsu.gifu.jp +kawaue.gifu.jp +kitagata.gifu.jp +mino.gifu.jp +minokamo.gifu.jp +mitake.gifu.jp +mizunami.gifu.jp +motosu.gifu.jp +nakatsugawa.gifu.jp +ogaki.gifu.jp +sakahogi.gifu.jp +seki.gifu.jp +sekigahara.gifu.jp +shirakawa.gifu.jp +tajimi.gifu.jp +takayama.gifu.jp +tarui.gifu.jp +toki.gifu.jp +tomika.gifu.jp +wanouchi.gifu.jp +yamagata.gifu.jp +yaotsu.gifu.jp +yoro.gifu.jp +annaka.gunma.jp +chiyoda.gunma.jp +fujioka.gunma.jp +higashiagatsuma.gunma.jp +isesaki.gunma.jp +itakura.gunma.jp +kanna.gunma.jp +kanra.gunma.jp +katashina.gunma.jp +kawaba.gunma.jp +kiryu.gunma.jp +kusatsu.gunma.jp +maebashi.gunma.jp +meiwa.gunma.jp +midori.gunma.jp +minakami.gunma.jp +naganohara.gunma.jp +nakanojo.gunma.jp +nanmoku.gunma.jp +numata.gunma.jp +oizumi.gunma.jp +ora.gunma.jp +ota.gunma.jp +shibukawa.gunma.jp +shimonita.gunma.jp +shinto.gunma.jp +showa.gunma.jp +takasaki.gunma.jp +takayama.gunma.jp +tamamura.gunma.jp +tatebayashi.gunma.jp +tomioka.gunma.jp +tsukiyono.gunma.jp +tsumagoi.gunma.jp +ueno.gunma.jp +yoshioka.gunma.jp +asaminami.hiroshima.jp +daiwa.hiroshima.jp +etajima.hiroshima.jp +fuchu.hiroshima.jp +fukuyama.hiroshima.jp +hatsukaichi.hiroshima.jp +higashihiroshima.hiroshima.jp +hongo.hiroshima.jp +jinsekikogen.hiroshima.jp +kaita.hiroshima.jp +kui.hiroshima.jp +kumano.hiroshima.jp +kure.hiroshima.jp +mihara.hiroshima.jp +miyoshi.hiroshima.jp +naka.hiroshima.jp +onomichi.hiroshima.jp +osakikamijima.hiroshima.jp +otake.hiroshima.jp +saka.hiroshima.jp +sera.hiroshima.jp +seranishi.hiroshima.jp +shinichi.hiroshima.jp +shobara.hiroshima.jp +takehara.hiroshima.jp +abashiri.hokkaido.jp +abira.hokkaido.jp +aibetsu.hokkaido.jp +akabira.hokkaido.jp +akkeshi.hokkaido.jp +asahikawa.hokkaido.jp +ashibetsu.hokkaido.jp +ashoro.hokkaido.jp +assabu.hokkaido.jp +atsuma.hokkaido.jp +bibai.hokkaido.jp +biei.hokkaido.jp +bifuka.hokkaido.jp +bihoro.hokkaido.jp +biratori.hokkaido.jp +chippubetsu.hokkaido.jp +chitose.hokkaido.jp +date.hokkaido.jp +ebetsu.hokkaido.jp +embetsu.hokkaido.jp +eniwa.hokkaido.jp +erimo.hokkaido.jp +esan.hokkaido.jp +esashi.hokkaido.jp +fukagawa.hokkaido.jp +fukushima.hokkaido.jp +furano.hokkaido.jp +furubira.hokkaido.jp +haboro.hokkaido.jp +hakodate.hokkaido.jp +hamatonbetsu.hokkaido.jp +hidaka.hokkaido.jp +higashikagura.hokkaido.jp +higashikawa.hokkaido.jp +hiroo.hokkaido.jp +hokuryu.hokkaido.jp +hokuto.hokkaido.jp +honbetsu.hokkaido.jp +horokanai.hokkaido.jp +horonobe.hokkaido.jp +ikeda.hokkaido.jp +imakane.hokkaido.jp +ishikari.hokkaido.jp +iwamizawa.hokkaido.jp +iwanai.hokkaido.jp +kamifurano.hokkaido.jp +kamikawa.hokkaido.jp +kamishihoro.hokkaido.jp +kamisunagawa.hokkaido.jp +kamoenai.hokkaido.jp +kayabe.hokkaido.jp +kembuchi.hokkaido.jp +kikonai.hokkaido.jp +kimobetsu.hokkaido.jp +kitahiroshima.hokkaido.jp +kitami.hokkaido.jp +kiyosato.hokkaido.jp +koshimizu.hokkaido.jp +kunneppu.hokkaido.jp +kuriyama.hokkaido.jp +kuromatsunai.hokkaido.jp +kushiro.hokkaido.jp +kutchan.hokkaido.jp +kyowa.hokkaido.jp +mashike.hokkaido.jp +matsumae.hokkaido.jp +mikasa.hokkaido.jp +minamifurano.hokkaido.jp +mombetsu.hokkaido.jp +moseushi.hokkaido.jp +mukawa.hokkaido.jp +muroran.hokkaido.jp +naie.hokkaido.jp +nakagawa.hokkaido.jp +nakasatsunai.hokkaido.jp +nakatombetsu.hokkaido.jp +nanae.hokkaido.jp +nanporo.hokkaido.jp +nayoro.hokkaido.jp +nemuro.hokkaido.jp +niikappu.hokkaido.jp +niki.hokkaido.jp +nishiokoppe.hokkaido.jp +noboribetsu.hokkaido.jp +numata.hokkaido.jp +obihiro.hokkaido.jp +obira.hokkaido.jp +oketo.hokkaido.jp +okoppe.hokkaido.jp +otaru.hokkaido.jp +otobe.hokkaido.jp +otofuke.hokkaido.jp +otoineppu.hokkaido.jp +oumu.hokkaido.jp +ozora.hokkaido.jp +pippu.hokkaido.jp +rankoshi.hokkaido.jp +rebun.hokkaido.jp +rikubetsu.hokkaido.jp +rishiri.hokkaido.jp +rishirifuji.hokkaido.jp +saroma.hokkaido.jp +sarufutsu.hokkaido.jp +shakotan.hokkaido.jp +shari.hokkaido.jp +shibecha.hokkaido.jp +shibetsu.hokkaido.jp +shikabe.hokkaido.jp +shikaoi.hokkaido.jp +shimamaki.hokkaido.jp +shimizu.hokkaido.jp +shimokawa.hokkaido.jp +shinshinotsu.hokkaido.jp +shintoku.hokkaido.jp +shiranuka.hokkaido.jp +shiraoi.hokkaido.jp +shiriuchi.hokkaido.jp +sobetsu.hokkaido.jp +sunagawa.hokkaido.jp +taiki.hokkaido.jp +takasu.hokkaido.jp +takikawa.hokkaido.jp +takinoue.hokkaido.jp +teshikaga.hokkaido.jp +tobetsu.hokkaido.jp +tohma.hokkaido.jp +tomakomai.hokkaido.jp +tomari.hokkaido.jp +toya.hokkaido.jp +toyako.hokkaido.jp +toyotomi.hokkaido.jp +toyoura.hokkaido.jp +tsubetsu.hokkaido.jp +tsukigata.hokkaido.jp +urakawa.hokkaido.jp +urausu.hokkaido.jp +uryu.hokkaido.jp +utashinai.hokkaido.jp +wakkanai.hokkaido.jp +wassamu.hokkaido.jp +yakumo.hokkaido.jp +yoichi.hokkaido.jp +aioi.hyogo.jp +akashi.hyogo.jp +ako.hyogo.jp +amagasaki.hyogo.jp +aogaki.hyogo.jp +asago.hyogo.jp +ashiya.hyogo.jp +awaji.hyogo.jp +fukusaki.hyogo.jp +goshiki.hyogo.jp +harima.hyogo.jp +himeji.hyogo.jp +ichikawa.hyogo.jp +inagawa.hyogo.jp +itami.hyogo.jp +kakogawa.hyogo.jp +kamigori.hyogo.jp +kamikawa.hyogo.jp +kasai.hyogo.jp +kasuga.hyogo.jp +kawanishi.hyogo.jp +miki.hyogo.jp +minamiawaji.hyogo.jp +nishinomiya.hyogo.jp +nishiwaki.hyogo.jp +ono.hyogo.jp +sanda.hyogo.jp +sannan.hyogo.jp +sasayama.hyogo.jp +sayo.hyogo.jp +shingu.hyogo.jp +shinonsen.hyogo.jp +shiso.hyogo.jp +sumoto.hyogo.jp +taishi.hyogo.jp +taka.hyogo.jp +takarazuka.hyogo.jp +takasago.hyogo.jp +takino.hyogo.jp +tamba.hyogo.jp +tatsuno.hyogo.jp +toyooka.hyogo.jp +yabu.hyogo.jp +yashiro.hyogo.jp +yoka.hyogo.jp +yokawa.hyogo.jp +ami.ibaraki.jp +asahi.ibaraki.jp +bando.ibaraki.jp +chikusei.ibaraki.jp +daigo.ibaraki.jp +fujishiro.ibaraki.jp +hitachi.ibaraki.jp +hitachinaka.ibaraki.jp +hitachiomiya.ibaraki.jp +hitachiota.ibaraki.jp +ibaraki.ibaraki.jp +ina.ibaraki.jp +inashiki.ibaraki.jp +itako.ibaraki.jp +iwama.ibaraki.jp +joso.ibaraki.jp +kamisu.ibaraki.jp +kasama.ibaraki.jp +kashima.ibaraki.jp +kasumigaura.ibaraki.jp +koga.ibaraki.jp +miho.ibaraki.jp +mito.ibaraki.jp +moriya.ibaraki.jp +naka.ibaraki.jp +namegata.ibaraki.jp +oarai.ibaraki.jp +ogawa.ibaraki.jp +omitama.ibaraki.jp +ryugasaki.ibaraki.jp +sakai.ibaraki.jp +sakuragawa.ibaraki.jp +shimodate.ibaraki.jp +shimotsuma.ibaraki.jp +shirosato.ibaraki.jp +sowa.ibaraki.jp +suifu.ibaraki.jp +takahagi.ibaraki.jp +tamatsukuri.ibaraki.jp +tokai.ibaraki.jp +tomobe.ibaraki.jp +tone.ibaraki.jp +toride.ibaraki.jp +tsuchiura.ibaraki.jp +tsukuba.ibaraki.jp +uchihara.ibaraki.jp +ushiku.ibaraki.jp +yachiyo.ibaraki.jp +yamagata.ibaraki.jp +yawara.ibaraki.jp +yuki.ibaraki.jp +anamizu.ishikawa.jp +hakui.ishikawa.jp +hakusan.ishikawa.jp +kaga.ishikawa.jp +kahoku.ishikawa.jp +kanazawa.ishikawa.jp +kawakita.ishikawa.jp +komatsu.ishikawa.jp +nakanoto.ishikawa.jp +nanao.ishikawa.jp +nomi.ishikawa.jp +nonoichi.ishikawa.jp +noto.ishikawa.jp +shika.ishikawa.jp +suzu.ishikawa.jp +tsubata.ishikawa.jp +tsurugi.ishikawa.jp +uchinada.ishikawa.jp +wajima.ishikawa.jp +fudai.iwate.jp +fujisawa.iwate.jp +hanamaki.iwate.jp +hiraizumi.iwate.jp +hirono.iwate.jp +ichinohe.iwate.jp +ichinoseki.iwate.jp +iwaizumi.iwate.jp +iwate.iwate.jp +joboji.iwate.jp +kamaishi.iwate.jp +kanegasaki.iwate.jp +karumai.iwate.jp +kawai.iwate.jp +kitakami.iwate.jp +kuji.iwate.jp +kunohe.iwate.jp +kuzumaki.iwate.jp +miyako.iwate.jp +mizusawa.iwate.jp +morioka.iwate.jp +ninohe.iwate.jp +noda.iwate.jp +ofunato.iwate.jp +oshu.iwate.jp +otsuchi.iwate.jp +rikuzentakata.iwate.jp +shiwa.iwate.jp +shizukuishi.iwate.jp +sumita.iwate.jp +tanohata.iwate.jp +tono.iwate.jp +yahaba.iwate.jp +yamada.iwate.jp +ayagawa.kagawa.jp +higashikagawa.kagawa.jp +kanonji.kagawa.jp +kotohira.kagawa.jp +manno.kagawa.jp +marugame.kagawa.jp +mitoyo.kagawa.jp +naoshima.kagawa.jp +sanuki.kagawa.jp +tadotsu.kagawa.jp +takamatsu.kagawa.jp +tonosho.kagawa.jp +uchinomi.kagawa.jp +utazu.kagawa.jp +zentsuji.kagawa.jp +akune.kagoshima.jp +amami.kagoshima.jp +hioki.kagoshima.jp +isa.kagoshima.jp +isen.kagoshima.jp +izumi.kagoshima.jp +kagoshima.kagoshima.jp +kanoya.kagoshima.jp +kawanabe.kagoshima.jp +kinko.kagoshima.jp +kouyama.kagoshima.jp +makurazaki.kagoshima.jp +matsumoto.kagoshima.jp +minamitane.kagoshima.jp +nakatane.kagoshima.jp +nishinoomote.kagoshima.jp +satsumasendai.kagoshima.jp +soo.kagoshima.jp +tarumizu.kagoshima.jp +yusui.kagoshima.jp +aikawa.kanagawa.jp +atsugi.kanagawa.jp +ayase.kanagawa.jp +chigasaki.kanagawa.jp +ebina.kanagawa.jp +fujisawa.kanagawa.jp +hadano.kanagawa.jp +hakone.kanagawa.jp +hiratsuka.kanagawa.jp +isehara.kanagawa.jp +kaisei.kanagawa.jp +kamakura.kanagawa.jp +kiyokawa.kanagawa.jp +matsuda.kanagawa.jp +minamiashigara.kanagawa.jp +miura.kanagawa.jp +nakai.kanagawa.jp +ninomiya.kanagawa.jp +odawara.kanagawa.jp +oi.kanagawa.jp +oiso.kanagawa.jp +sagamihara.kanagawa.jp +samukawa.kanagawa.jp +tsukui.kanagawa.jp +yamakita.kanagawa.jp +yamato.kanagawa.jp +yokosuka.kanagawa.jp +yugawara.kanagawa.jp +zama.kanagawa.jp +zushi.kanagawa.jp +aki.kochi.jp +geisei.kochi.jp +hidaka.kochi.jp +higashitsuno.kochi.jp +ino.kochi.jp +kagami.kochi.jp +kami.kochi.jp +kitagawa.kochi.jp +kochi.kochi.jp +mihara.kochi.jp +motoyama.kochi.jp +muroto.kochi.jp +nahari.kochi.jp +nakamura.kochi.jp +nankoku.kochi.jp +nishitosa.kochi.jp +niyodogawa.kochi.jp +ochi.kochi.jp +okawa.kochi.jp +otoyo.kochi.jp +otsuki.kochi.jp +sakawa.kochi.jp +sukumo.kochi.jp +susaki.kochi.jp +tosa.kochi.jp +tosashimizu.kochi.jp +toyo.kochi.jp +tsuno.kochi.jp +umaji.kochi.jp +yasuda.kochi.jp +yusuhara.kochi.jp +amakusa.kumamoto.jp +arao.kumamoto.jp +aso.kumamoto.jp +choyo.kumamoto.jp +gyokuto.kumamoto.jp +kamiamakusa.kumamoto.jp +kikuchi.kumamoto.jp +kumamoto.kumamoto.jp +mashiki.kumamoto.jp +mifune.kumamoto.jp +minamata.kumamoto.jp +minamioguni.kumamoto.jp +nagasu.kumamoto.jp +nishihara.kumamoto.jp +oguni.kumamoto.jp +ozu.kumamoto.jp +sumoto.kumamoto.jp +takamori.kumamoto.jp +uki.kumamoto.jp +uto.kumamoto.jp +yamaga.kumamoto.jp +yamato.kumamoto.jp +yatsushiro.kumamoto.jp +ayabe.kyoto.jp +fukuchiyama.kyoto.jp +higashiyama.kyoto.jp +ide.kyoto.jp +ine.kyoto.jp +joyo.kyoto.jp +kameoka.kyoto.jp +kamo.kyoto.jp +kita.kyoto.jp +kizu.kyoto.jp +kumiyama.kyoto.jp +kyotamba.kyoto.jp +kyotanabe.kyoto.jp +kyotango.kyoto.jp +maizuru.kyoto.jp +minami.kyoto.jp +minamiyamashiro.kyoto.jp +miyazu.kyoto.jp +muko.kyoto.jp +nagaokakyo.kyoto.jp +nakagyo.kyoto.jp +nantan.kyoto.jp +oyamazaki.kyoto.jp +sakyo.kyoto.jp +seika.kyoto.jp +tanabe.kyoto.jp +uji.kyoto.jp +ujitawara.kyoto.jp +wazuka.kyoto.jp +yamashina.kyoto.jp +yawata.kyoto.jp +asahi.mie.jp +inabe.mie.jp +ise.mie.jp +kameyama.mie.jp +kawagoe.mie.jp +kiho.mie.jp +kisosaki.mie.jp +kiwa.mie.jp +komono.mie.jp +kumano.mie.jp +kuwana.mie.jp +matsusaka.mie.jp +meiwa.mie.jp +mihama.mie.jp +minamiise.mie.jp +misugi.mie.jp +miyama.mie.jp +nabari.mie.jp +shima.mie.jp +suzuka.mie.jp +tado.mie.jp +taiki.mie.jp +taki.mie.jp +tamaki.mie.jp +toba.mie.jp +tsu.mie.jp +udono.mie.jp +ureshino.mie.jp +watarai.mie.jp +yokkaichi.mie.jp +furukawa.miyagi.jp +higashimatsushima.miyagi.jp +ishinomaki.miyagi.jp +iwanuma.miyagi.jp +kakuda.miyagi.jp +kami.miyagi.jp +kawasaki.miyagi.jp +marumori.miyagi.jp +matsushima.miyagi.jp +minamisanriku.miyagi.jp +misato.miyagi.jp +murata.miyagi.jp +natori.miyagi.jp +ogawara.miyagi.jp +ohira.miyagi.jp +onagawa.miyagi.jp +osaki.miyagi.jp +rifu.miyagi.jp +semine.miyagi.jp +shibata.miyagi.jp +shichikashuku.miyagi.jp +shikama.miyagi.jp +shiogama.miyagi.jp +shiroishi.miyagi.jp +tagajo.miyagi.jp +taiwa.miyagi.jp +tome.miyagi.jp +tomiya.miyagi.jp +wakuya.miyagi.jp +watari.miyagi.jp +yamamoto.miyagi.jp +zao.miyagi.jp +aya.miyazaki.jp +ebino.miyazaki.jp +gokase.miyazaki.jp +hyuga.miyazaki.jp +kadogawa.miyazaki.jp +kawaminami.miyazaki.jp +kijo.miyazaki.jp +kitagawa.miyazaki.jp +kitakata.miyazaki.jp +kitaura.miyazaki.jp +kobayashi.miyazaki.jp +kunitomi.miyazaki.jp +kushima.miyazaki.jp +mimata.miyazaki.jp +miyakonojo.miyazaki.jp +miyazaki.miyazaki.jp +morotsuka.miyazaki.jp +nichinan.miyazaki.jp +nishimera.miyazaki.jp +nobeoka.miyazaki.jp +saito.miyazaki.jp +shiiba.miyazaki.jp +shintomi.miyazaki.jp +takaharu.miyazaki.jp +takanabe.miyazaki.jp +takazaki.miyazaki.jp +tsuno.miyazaki.jp +achi.nagano.jp +agematsu.nagano.jp +anan.nagano.jp +aoki.nagano.jp +asahi.nagano.jp +azumino.nagano.jp +chikuhoku.nagano.jp +chikuma.nagano.jp +chino.nagano.jp +fujimi.nagano.jp +hakuba.nagano.jp +hara.nagano.jp +hiraya.nagano.jp +iida.nagano.jp +iijima.nagano.jp +iiyama.nagano.jp +iizuna.nagano.jp +ikeda.nagano.jp +ikusaka.nagano.jp +ina.nagano.jp +karuizawa.nagano.jp +kawakami.nagano.jp +kiso.nagano.jp +kisofukushima.nagano.jp +kitaaiki.nagano.jp +komagane.nagano.jp +komoro.nagano.jp +matsukawa.nagano.jp +matsumoto.nagano.jp +miasa.nagano.jp +minamiaiki.nagano.jp +minamimaki.nagano.jp +minamiminowa.nagano.jp +minowa.nagano.jp +miyada.nagano.jp +miyota.nagano.jp +mochizuki.nagano.jp +nagano.nagano.jp +nagawa.nagano.jp +nagiso.nagano.jp +nakagawa.nagano.jp +nakano.nagano.jp +nozawaonsen.nagano.jp +obuse.nagano.jp +ogawa.nagano.jp +okaya.nagano.jp +omachi.nagano.jp +omi.nagano.jp +ookuwa.nagano.jp +ooshika.nagano.jp +otaki.nagano.jp +otari.nagano.jp +sakae.nagano.jp +sakaki.nagano.jp +saku.nagano.jp +sakuho.nagano.jp +shimosuwa.nagano.jp +shinanomachi.nagano.jp +shiojiri.nagano.jp +suwa.nagano.jp +suzaka.nagano.jp +takagi.nagano.jp +takamori.nagano.jp +takayama.nagano.jp +tateshina.nagano.jp +tatsuno.nagano.jp +togakushi.nagano.jp +togura.nagano.jp +tomi.nagano.jp +ueda.nagano.jp +wada.nagano.jp +yamagata.nagano.jp +yamanouchi.nagano.jp +yasaka.nagano.jp +yasuoka.nagano.jp +chijiwa.nagasaki.jp +futsu.nagasaki.jp +goto.nagasaki.jp +hasami.nagasaki.jp +hirado.nagasaki.jp +iki.nagasaki.jp +isahaya.nagasaki.jp +kawatana.nagasaki.jp +kuchinotsu.nagasaki.jp +matsuura.nagasaki.jp +nagasaki.nagasaki.jp +obama.nagasaki.jp +omura.nagasaki.jp +oseto.nagasaki.jp +saikai.nagasaki.jp +sasebo.nagasaki.jp +seihi.nagasaki.jp +shimabara.nagasaki.jp +shinkamigoto.nagasaki.jp +togitsu.nagasaki.jp +tsushima.nagasaki.jp +unzen.nagasaki.jp +ando.nara.jp +gose.nara.jp +heguri.nara.jp +higashiyoshino.nara.jp +ikaruga.nara.jp +ikoma.nara.jp +kamikitayama.nara.jp +kanmaki.nara.jp +kashiba.nara.jp +kashihara.nara.jp +katsuragi.nara.jp +kawai.nara.jp +kawakami.nara.jp +kawanishi.nara.jp +koryo.nara.jp +kurotaki.nara.jp +mitsue.nara.jp +miyake.nara.jp +nara.nara.jp +nosegawa.nara.jp +oji.nara.jp +ouda.nara.jp +oyodo.nara.jp +sakurai.nara.jp +sango.nara.jp +shimoichi.nara.jp +shimokitayama.nara.jp +shinjo.nara.jp +soni.nara.jp +takatori.nara.jp +tawaramoto.nara.jp +tenkawa.nara.jp +tenri.nara.jp +uda.nara.jp +yamatokoriyama.nara.jp +yamatotakada.nara.jp +yamazoe.nara.jp +yoshino.nara.jp +aga.niigata.jp +agano.niigata.jp +gosen.niigata.jp +itoigawa.niigata.jp +izumozaki.niigata.jp +joetsu.niigata.jp +kamo.niigata.jp +kariwa.niigata.jp +kashiwazaki.niigata.jp +minamiuonuma.niigata.jp +mitsuke.niigata.jp +muika.niigata.jp +murakami.niigata.jp +myoko.niigata.jp +nagaoka.niigata.jp +niigata.niigata.jp +ojiya.niigata.jp +omi.niigata.jp +sado.niigata.jp +sanjo.niigata.jp +seiro.niigata.jp +seirou.niigata.jp +sekikawa.niigata.jp +shibata.niigata.jp +tagami.niigata.jp +tainai.niigata.jp +tochio.niigata.jp +tokamachi.niigata.jp +tsubame.niigata.jp +tsunan.niigata.jp +uonuma.niigata.jp +yahiko.niigata.jp +yoita.niigata.jp +yuzawa.niigata.jp +beppu.oita.jp +bungoono.oita.jp +bungotakada.oita.jp +hasama.oita.jp +hiji.oita.jp +himeshima.oita.jp +hita.oita.jp +kamitsue.oita.jp +kokonoe.oita.jp +kuju.oita.jp +kunisaki.oita.jp +kusu.oita.jp +oita.oita.jp +saiki.oita.jp +taketa.oita.jp +tsukumi.oita.jp +usa.oita.jp +usuki.oita.jp +yufu.oita.jp +akaiwa.okayama.jp +asakuchi.okayama.jp +bizen.okayama.jp +hayashima.okayama.jp +ibara.okayama.jp +kagamino.okayama.jp +kasaoka.okayama.jp +kibichuo.okayama.jp +kumenan.okayama.jp +kurashiki.okayama.jp +maniwa.okayama.jp +misaki.okayama.jp +nagi.okayama.jp +niimi.okayama.jp +nishiawakura.okayama.jp +okayama.okayama.jp +satosho.okayama.jp +setouchi.okayama.jp +shinjo.okayama.jp +shoo.okayama.jp +soja.okayama.jp +takahashi.okayama.jp +tamano.okayama.jp +tsuyama.okayama.jp +wake.okayama.jp +yakage.okayama.jp +aguni.okinawa.jp +ginowan.okinawa.jp +ginoza.okinawa.jp +gushikami.okinawa.jp +haebaru.okinawa.jp +higashi.okinawa.jp +hirara.okinawa.jp +iheya.okinawa.jp +ishigaki.okinawa.jp +ishikawa.okinawa.jp +itoman.okinawa.jp +izena.okinawa.jp +kadena.okinawa.jp +kin.okinawa.jp +kitadaito.okinawa.jp +kitanakagusuku.okinawa.jp +kumejima.okinawa.jp +kunigami.okinawa.jp +minamidaito.okinawa.jp +motobu.okinawa.jp +nago.okinawa.jp +naha.okinawa.jp +nakagusuku.okinawa.jp +nakijin.okinawa.jp +nanjo.okinawa.jp +nishihara.okinawa.jp +ogimi.okinawa.jp +okinawa.okinawa.jp +onna.okinawa.jp +shimoji.okinawa.jp +taketomi.okinawa.jp +tarama.okinawa.jp +tokashiki.okinawa.jp +tomigusuku.okinawa.jp +tonaki.okinawa.jp +urasoe.okinawa.jp +uruma.okinawa.jp +yaese.okinawa.jp +yomitan.okinawa.jp +yonabaru.okinawa.jp +yonaguni.okinawa.jp +zamami.okinawa.jp +abeno.osaka.jp +chihayaakasaka.osaka.jp +chuo.osaka.jp +daito.osaka.jp +fujiidera.osaka.jp +habikino.osaka.jp +hannan.osaka.jp +higashiosaka.osaka.jp +higashisumiyoshi.osaka.jp +higashiyodogawa.osaka.jp +hirakata.osaka.jp +ibaraki.osaka.jp +ikeda.osaka.jp +izumi.osaka.jp +izumiotsu.osaka.jp +izumisano.osaka.jp +kadoma.osaka.jp +kaizuka.osaka.jp +kanan.osaka.jp +kashiwara.osaka.jp +katano.osaka.jp +kawachinagano.osaka.jp +kishiwada.osaka.jp +kita.osaka.jp +kumatori.osaka.jp +matsubara.osaka.jp +minato.osaka.jp +minoh.osaka.jp +misaki.osaka.jp +moriguchi.osaka.jp +neyagawa.osaka.jp +nishi.osaka.jp +nose.osaka.jp +osakasayama.osaka.jp +sakai.osaka.jp +sayama.osaka.jp +sennan.osaka.jp +settsu.osaka.jp +shijonawate.osaka.jp +shimamoto.osaka.jp +suita.osaka.jp +tadaoka.osaka.jp +taishi.osaka.jp +tajiri.osaka.jp +takaishi.osaka.jp +takatsuki.osaka.jp +tondabayashi.osaka.jp +toyonaka.osaka.jp +toyono.osaka.jp +yao.osaka.jp +ariake.saga.jp +arita.saga.jp +fukudomi.saga.jp +genkai.saga.jp +hamatama.saga.jp +hizen.saga.jp +imari.saga.jp +kamimine.saga.jp +kanzaki.saga.jp +karatsu.saga.jp +kashima.saga.jp +kitagata.saga.jp +kitahata.saga.jp +kiyama.saga.jp +kouhoku.saga.jp +kyuragi.saga.jp +nishiarita.saga.jp +ogi.saga.jp +omachi.saga.jp +ouchi.saga.jp +saga.saga.jp +shiroishi.saga.jp +taku.saga.jp +tara.saga.jp +tosu.saga.jp +yoshinogari.saga.jp +arakawa.saitama.jp +asaka.saitama.jp +chichibu.saitama.jp +fujimi.saitama.jp +fujimino.saitama.jp +fukaya.saitama.jp +hanno.saitama.jp +hanyu.saitama.jp +hasuda.saitama.jp +hatogaya.saitama.jp +hatoyama.saitama.jp +hidaka.saitama.jp +higashichichibu.saitama.jp +higashimatsuyama.saitama.jp +honjo.saitama.jp +ina.saitama.jp +iruma.saitama.jp +iwatsuki.saitama.jp +kamiizumi.saitama.jp +kamikawa.saitama.jp +kamisato.saitama.jp +kasukabe.saitama.jp +kawagoe.saitama.jp +kawaguchi.saitama.jp +kawajima.saitama.jp +kazo.saitama.jp +kitamoto.saitama.jp +koshigaya.saitama.jp +kounosu.saitama.jp +kuki.saitama.jp +kumagaya.saitama.jp +matsubushi.saitama.jp +minano.saitama.jp +misato.saitama.jp +miyashiro.saitama.jp +miyoshi.saitama.jp +moroyama.saitama.jp +nagatoro.saitama.jp +namegawa.saitama.jp +niiza.saitama.jp +ogano.saitama.jp +ogawa.saitama.jp +ogose.saitama.jp +okegawa.saitama.jp +omiya.saitama.jp +otaki.saitama.jp +ranzan.saitama.jp +ryokami.saitama.jp +saitama.saitama.jp +sakado.saitama.jp +satte.saitama.jp +sayama.saitama.jp +shiki.saitama.jp +shiraoka.saitama.jp +soka.saitama.jp +sugito.saitama.jp +toda.saitama.jp +tokigawa.saitama.jp +tokorozawa.saitama.jp +tsurugashima.saitama.jp +urawa.saitama.jp +warabi.saitama.jp +yashio.saitama.jp +yokoze.saitama.jp +yono.saitama.jp +yorii.saitama.jp +yoshida.saitama.jp +yoshikawa.saitama.jp +yoshimi.saitama.jp +aisho.shiga.jp +gamo.shiga.jp +higashiomi.shiga.jp +hikone.shiga.jp +koka.shiga.jp +konan.shiga.jp +kosei.shiga.jp +koto.shiga.jp +kusatsu.shiga.jp +maibara.shiga.jp +moriyama.shiga.jp +nagahama.shiga.jp +nishiazai.shiga.jp +notogawa.shiga.jp +omihachiman.shiga.jp +otsu.shiga.jp +ritto.shiga.jp +ryuoh.shiga.jp +takashima.shiga.jp +takatsuki.shiga.jp +torahime.shiga.jp +toyosato.shiga.jp +yasu.shiga.jp +akagi.shimane.jp +ama.shimane.jp +gotsu.shimane.jp +hamada.shimane.jp +higashiizumo.shimane.jp +hikawa.shimane.jp +hikimi.shimane.jp +izumo.shimane.jp +kakinoki.shimane.jp +masuda.shimane.jp +matsue.shimane.jp +misato.shimane.jp +nishinoshima.shimane.jp +ohda.shimane.jp +okinoshima.shimane.jp +okuizumo.shimane.jp +shimane.shimane.jp +tamayu.shimane.jp +tsuwano.shimane.jp +unnan.shimane.jp +yakumo.shimane.jp +yasugi.shimane.jp +yatsuka.shimane.jp +arai.shizuoka.jp +atami.shizuoka.jp +fuji.shizuoka.jp +fujieda.shizuoka.jp +fujikawa.shizuoka.jp +fujinomiya.shizuoka.jp +fukuroi.shizuoka.jp +gotemba.shizuoka.jp +haibara.shizuoka.jp +hamamatsu.shizuoka.jp +higashiizu.shizuoka.jp +ito.shizuoka.jp +iwata.shizuoka.jp +izu.shizuoka.jp +izunokuni.shizuoka.jp +kakegawa.shizuoka.jp +kannami.shizuoka.jp +kawanehon.shizuoka.jp +kawazu.shizuoka.jp +kikugawa.shizuoka.jp +kosai.shizuoka.jp +makinohara.shizuoka.jp +matsuzaki.shizuoka.jp +minamiizu.shizuoka.jp +mishima.shizuoka.jp +morimachi.shizuoka.jp +nishiizu.shizuoka.jp +numazu.shizuoka.jp +omaezaki.shizuoka.jp +shimada.shizuoka.jp +shimizu.shizuoka.jp +shimoda.shizuoka.jp +shizuoka.shizuoka.jp +susono.shizuoka.jp +yaizu.shizuoka.jp +yoshida.shizuoka.jp +ashikaga.tochigi.jp +bato.tochigi.jp +haga.tochigi.jp +ichikai.tochigi.jp +iwafune.tochigi.jp +kaminokawa.tochigi.jp +kanuma.tochigi.jp +karasuyama.tochigi.jp +kuroiso.tochigi.jp +mashiko.tochigi.jp +mibu.tochigi.jp +moka.tochigi.jp +motegi.tochigi.jp +nasu.tochigi.jp +nasushiobara.tochigi.jp +nikko.tochigi.jp +nishikata.tochigi.jp +nogi.tochigi.jp +ohira.tochigi.jp +ohtawara.tochigi.jp +oyama.tochigi.jp +sakura.tochigi.jp +sano.tochigi.jp +shimotsuke.tochigi.jp +shioya.tochigi.jp +takanezawa.tochigi.jp +tochigi.tochigi.jp +tsuga.tochigi.jp +ujiie.tochigi.jp +utsunomiya.tochigi.jp +yaita.tochigi.jp +aizumi.tokushima.jp +anan.tokushima.jp +ichiba.tokushima.jp +itano.tokushima.jp +kainan.tokushima.jp +komatsushima.tokushima.jp +matsushige.tokushima.jp +mima.tokushima.jp +minami.tokushima.jp +miyoshi.tokushima.jp +mugi.tokushima.jp +nakagawa.tokushima.jp +naruto.tokushima.jp +sanagochi.tokushima.jp +shishikui.tokushima.jp +tokushima.tokushima.jp +wajiki.tokushima.jp +adachi.tokyo.jp +akiruno.tokyo.jp +akishima.tokyo.jp +aogashima.tokyo.jp +arakawa.tokyo.jp +bunkyo.tokyo.jp +chiyoda.tokyo.jp +chofu.tokyo.jp +chuo.tokyo.jp +edogawa.tokyo.jp +fuchu.tokyo.jp +fussa.tokyo.jp +hachijo.tokyo.jp +hachioji.tokyo.jp +hamura.tokyo.jp +higashikurume.tokyo.jp +higashimurayama.tokyo.jp +higashiyamato.tokyo.jp +hino.tokyo.jp +hinode.tokyo.jp +hinohara.tokyo.jp +inagi.tokyo.jp +itabashi.tokyo.jp +katsushika.tokyo.jp +kita.tokyo.jp +kiyose.tokyo.jp +kodaira.tokyo.jp +koganei.tokyo.jp +kokubunji.tokyo.jp +komae.tokyo.jp +koto.tokyo.jp +kouzushima.tokyo.jp +kunitachi.tokyo.jp +machida.tokyo.jp +meguro.tokyo.jp +minato.tokyo.jp +mitaka.tokyo.jp +mizuho.tokyo.jp +musashimurayama.tokyo.jp +musashino.tokyo.jp +nakano.tokyo.jp +nerima.tokyo.jp +ogasawara.tokyo.jp +okutama.tokyo.jp +ome.tokyo.jp +oshima.tokyo.jp +ota.tokyo.jp +setagaya.tokyo.jp +shibuya.tokyo.jp +shinagawa.tokyo.jp +shinjuku.tokyo.jp +suginami.tokyo.jp +sumida.tokyo.jp +tachikawa.tokyo.jp +taito.tokyo.jp +tama.tokyo.jp +toshima.tokyo.jp +chizu.tottori.jp +hino.tottori.jp +kawahara.tottori.jp +koge.tottori.jp +kotoura.tottori.jp +misasa.tottori.jp +nanbu.tottori.jp +nichinan.tottori.jp +sakaiminato.tottori.jp +tottori.tottori.jp +wakasa.tottori.jp +yazu.tottori.jp +yonago.tottori.jp +asahi.toyama.jp +fuchu.toyama.jp +fukumitsu.toyama.jp +funahashi.toyama.jp +himi.toyama.jp +imizu.toyama.jp +inami.toyama.jp +johana.toyama.jp +kamiichi.toyama.jp +kurobe.toyama.jp +nakaniikawa.toyama.jp +namerikawa.toyama.jp +nanto.toyama.jp +nyuzen.toyama.jp +oyabe.toyama.jp +taira.toyama.jp +takaoka.toyama.jp +tateyama.toyama.jp +toga.toyama.jp +tonami.toyama.jp +toyama.toyama.jp +unazuki.toyama.jp +uozu.toyama.jp +yamada.toyama.jp +arida.wakayama.jp +aridagawa.wakayama.jp +gobo.wakayama.jp +hashimoto.wakayama.jp +hidaka.wakayama.jp +hirogawa.wakayama.jp +inami.wakayama.jp +iwade.wakayama.jp +kainan.wakayama.jp +kamitonda.wakayama.jp +katsuragi.wakayama.jp +kimino.wakayama.jp +kinokawa.wakayama.jp +kitayama.wakayama.jp +koya.wakayama.jp +koza.wakayama.jp +kozagawa.wakayama.jp +kudoyama.wakayama.jp +kushimoto.wakayama.jp +mihama.wakayama.jp +misato.wakayama.jp +nachikatsuura.wakayama.jp +shingu.wakayama.jp +shirahama.wakayama.jp +taiji.wakayama.jp +tanabe.wakayama.jp +wakayama.wakayama.jp +yuasa.wakayama.jp +yura.wakayama.jp +asahi.yamagata.jp +funagata.yamagata.jp +higashine.yamagata.jp +iide.yamagata.jp +kahoku.yamagata.jp +kaminoyama.yamagata.jp +kaneyama.yamagata.jp +kawanishi.yamagata.jp +mamurogawa.yamagata.jp +mikawa.yamagata.jp +murayama.yamagata.jp +nagai.yamagata.jp +nakayama.yamagata.jp +nanyo.yamagata.jp +nishikawa.yamagata.jp +obanazawa.yamagata.jp +oe.yamagata.jp +oguni.yamagata.jp +ohkura.yamagata.jp +oishida.yamagata.jp +sagae.yamagata.jp +sakata.yamagata.jp +sakegawa.yamagata.jp +shinjo.yamagata.jp +shirataka.yamagata.jp +shonai.yamagata.jp +takahata.yamagata.jp +tendo.yamagata.jp +tozawa.yamagata.jp +tsuruoka.yamagata.jp +yamagata.yamagata.jp +yamanobe.yamagata.jp +yonezawa.yamagata.jp +yuza.yamagata.jp +abu.yamaguchi.jp +hagi.yamaguchi.jp +hikari.yamaguchi.jp +hofu.yamaguchi.jp +iwakuni.yamaguchi.jp +kudamatsu.yamaguchi.jp +mitou.yamaguchi.jp +nagato.yamaguchi.jp +oshima.yamaguchi.jp +shimonoseki.yamaguchi.jp +shunan.yamaguchi.jp +tabuse.yamaguchi.jp +tokuyama.yamaguchi.jp +toyota.yamaguchi.jp +ube.yamaguchi.jp +yuu.yamaguchi.jp +chuo.yamanashi.jp +doshi.yamanashi.jp +fuefuki.yamanashi.jp +fujikawa.yamanashi.jp +fujikawaguchiko.yamanashi.jp +fujiyoshida.yamanashi.jp +hayakawa.yamanashi.jp +hokuto.yamanashi.jp +ichikawamisato.yamanashi.jp +kai.yamanashi.jp +kofu.yamanashi.jp +koshu.yamanashi.jp +kosuge.yamanashi.jp +minami-alps.yamanashi.jp +minobu.yamanashi.jp +nakamichi.yamanashi.jp +nanbu.yamanashi.jp +narusawa.yamanashi.jp +nirasaki.yamanashi.jp +nishikatsura.yamanashi.jp +oshino.yamanashi.jp +otsuki.yamanashi.jp +showa.yamanashi.jp +tabayama.yamanashi.jp +tsuru.yamanashi.jp +uenohara.yamanashi.jp +yamanakako.yamanashi.jp +yamanashi.yamanashi.jp + +// ke : http://www.kenic.or.ke/index.php/en/ke-domains/ke-domains +ke +ac.ke +co.ke +go.ke +info.ke +me.ke +mobi.ke +ne.ke +or.ke +sc.ke + +// kg : http://www.domain.kg/dmn_n.html +kg +org.kg +net.kg +com.kg +edu.kg +gov.kg +mil.kg + +// kh : http://www.mptc.gov.kh/dns_registration.htm +*.kh + +// ki : http://www.ki/dns/index.html +ki +edu.ki +biz.ki +net.ki +org.ki +gov.ki +info.ki +com.ki + +// km : https://en.wikipedia.org/wiki/.km +// http://www.domaine.km/documents/charte.doc +km +org.km +nom.km +gov.km +prd.km +tm.km +edu.km +mil.km +ass.km +com.km +// These are only mentioned as proposed suggestions at domaine.km, but +// https://en.wikipedia.org/wiki/.km says they're available for registration: +coop.km +asso.km +presse.km +medecin.km +notaires.km +pharmaciens.km +veterinaire.km +gouv.km + +// kn : https://en.wikipedia.org/wiki/.kn +// http://www.dot.kn/domainRules.html +kn +net.kn +org.kn +edu.kn +gov.kn + +// kp : http://www.kcce.kp/en_index.php +kp +com.kp +edu.kp +gov.kp +org.kp +rep.kp +tra.kp + +// kr : https://en.wikipedia.org/wiki/.kr +// see also: http://domain.nida.or.kr/eng/registration.jsp +kr +ac.kr +co.kr +es.kr +go.kr +hs.kr +kg.kr +mil.kr +ms.kr +ne.kr +or.kr +pe.kr +re.kr +sc.kr +// kr geographical names +busan.kr +chungbuk.kr +chungnam.kr +daegu.kr +daejeon.kr +gangwon.kr +gwangju.kr +gyeongbuk.kr +gyeonggi.kr +gyeongnam.kr +incheon.kr +jeju.kr +jeonbuk.kr +jeonnam.kr +seoul.kr +ulsan.kr + +// kw : https://www.nic.kw/policies/ +// Confirmed by registry +kw +com.kw +edu.kw +emb.kw +gov.kw +ind.kw +net.kw +org.kw + +// ky : http://www.icta.ky/da_ky_reg_dom.php +// Confirmed by registry 2008-06-17 +ky +com.ky +edu.ky +net.ky +org.ky + +// kz : https://en.wikipedia.org/wiki/.kz +// see also: http://www.nic.kz/rules/index.jsp +kz +org.kz +edu.kz +net.kz +gov.kz +mil.kz +com.kz + +// la : https://en.wikipedia.org/wiki/.la +// Submitted by registry +la +int.la +net.la +info.la +edu.la +gov.la +per.la +com.la +org.la + +// lb : https://en.wikipedia.org/wiki/.lb +// Submitted by registry +lb +com.lb +edu.lb +gov.lb +net.lb +org.lb + +// lc : https://en.wikipedia.org/wiki/.lc +// see also: http://www.nic.lc/rules.htm +lc +com.lc +net.lc +co.lc +org.lc +edu.lc +gov.lc + +// li : https://en.wikipedia.org/wiki/.li +li + +// lk : https://www.nic.lk/index.php/domain-registration/lk-domain-naming-structure +lk +gov.lk +sch.lk +net.lk +int.lk +com.lk +org.lk +edu.lk +ngo.lk +soc.lk +web.lk +ltd.lk +assn.lk +grp.lk +hotel.lk +ac.lk + +// lr : http://psg.com/dns/lr/lr.txt +// Submitted by registry +lr +com.lr +edu.lr +gov.lr +org.lr +net.lr + +// ls : http://www.nic.ls/ +// Confirmed by registry +ls +ac.ls +biz.ls +co.ls +edu.ls +gov.ls +info.ls +net.ls +org.ls +sc.ls + +// lt : https://en.wikipedia.org/wiki/.lt +lt +// gov.lt : http://www.gov.lt/index_en.php +gov.lt + +// lu : http://www.dns.lu/en/ +lu + +// lv : http://www.nic.lv/DNS/En/generic.php +lv +com.lv +edu.lv +gov.lv +org.lv +mil.lv +id.lv +net.lv +asn.lv +conf.lv + +// ly : http://www.nic.ly/regulations.php +ly +com.ly +net.ly +gov.ly +plc.ly +edu.ly +sch.ly +med.ly +org.ly +id.ly + +// ma : https://en.wikipedia.org/wiki/.ma +// http://www.anrt.ma/fr/admin/download/upload/file_fr782.pdf +ma +co.ma +net.ma +gov.ma +org.ma +ac.ma +press.ma + +// mc : http://www.nic.mc/ +mc +tm.mc +asso.mc + +// md : https://en.wikipedia.org/wiki/.md +md + +// me : https://en.wikipedia.org/wiki/.me +me +co.me +net.me +org.me +edu.me +ac.me +gov.me +its.me +priv.me + +// mg : http://nic.mg/nicmg/?page_id=39 +mg +org.mg +nom.mg +gov.mg +prd.mg +tm.mg +edu.mg +mil.mg +com.mg +co.mg + +// mh : https://en.wikipedia.org/wiki/.mh +mh + +// mil : https://en.wikipedia.org/wiki/.mil +mil + +// mk : https://en.wikipedia.org/wiki/.mk +// see also: http://dns.marnet.net.mk/postapka.php +mk +com.mk +org.mk +net.mk +edu.mk +gov.mk +inf.mk +name.mk + +// ml : http://www.gobin.info/domainname/ml-template.doc +// see also: https://en.wikipedia.org/wiki/.ml +ml +com.ml +edu.ml +gouv.ml +gov.ml +net.ml +org.ml +presse.ml + +// mm : https://en.wikipedia.org/wiki/.mm +*.mm + +// mn : https://en.wikipedia.org/wiki/.mn +mn +gov.mn +edu.mn +org.mn + +// mo : http://www.monic.net.mo/ +mo +com.mo +net.mo +org.mo +edu.mo +gov.mo + +// mobi : https://en.wikipedia.org/wiki/.mobi +mobi + +// mp : http://www.dot.mp/ +// Confirmed by registry 2008-06-17 +mp + +// mq : https://en.wikipedia.org/wiki/.mq +mq + +// mr : https://en.wikipedia.org/wiki/.mr +mr +gov.mr + +// ms : http://www.nic.ms/pdf/MS_Domain_Name_Rules.pdf +ms +com.ms +edu.ms +gov.ms +net.ms +org.ms + +// mt : https://www.nic.org.mt/go/policy +// Submitted by registry +mt +com.mt +edu.mt +net.mt +org.mt + +// mu : https://en.wikipedia.org/wiki/.mu +mu +com.mu +net.mu +org.mu +gov.mu +ac.mu +co.mu +or.mu + +// museum : http://about.museum/naming/ +// http://index.museum/ +museum +academy.museum +agriculture.museum +air.museum +airguard.museum +alabama.museum +alaska.museum +amber.museum +ambulance.museum +american.museum +americana.museum +americanantiques.museum +americanart.museum +amsterdam.museum +and.museum +annefrank.museum +anthro.museum +anthropology.museum +antiques.museum +aquarium.museum +arboretum.museum +archaeological.museum +archaeology.museum +architecture.museum +art.museum +artanddesign.museum +artcenter.museum +artdeco.museum +arteducation.museum +artgallery.museum +arts.museum +artsandcrafts.museum +asmatart.museum +assassination.museum +assisi.museum +association.museum +astronomy.museum +atlanta.museum +austin.museum +australia.museum +automotive.museum +aviation.museum +axis.museum +badajoz.museum +baghdad.museum +bahn.museum +bale.museum +baltimore.museum +barcelona.museum +baseball.museum +basel.museum +baths.museum +bauern.museum +beauxarts.museum +beeldengeluid.museum +bellevue.museum +bergbau.museum +berkeley.museum +berlin.museum +bern.museum +bible.museum +bilbao.museum +bill.museum +birdart.museum +birthplace.museum +bonn.museum +boston.museum +botanical.museum +botanicalgarden.museum +botanicgarden.museum +botany.museum +brandywinevalley.museum +brasil.museum +bristol.museum +british.museum +britishcolumbia.museum +broadcast.museum +brunel.museum +brussel.museum +brussels.museum +bruxelles.museum +building.museum +burghof.museum +bus.museum +bushey.museum +cadaques.museum +california.museum +cambridge.museum +can.museum +canada.museum +capebreton.museum +carrier.museum +cartoonart.museum +casadelamoneda.museum +castle.museum +castres.museum +celtic.museum +center.museum +chattanooga.museum +cheltenham.museum +chesapeakebay.museum +chicago.museum +children.museum +childrens.museum +childrensgarden.museum +chiropractic.museum +chocolate.museum +christiansburg.museum +cincinnati.museum +cinema.museum +circus.museum +civilisation.museum +civilization.museum +civilwar.museum +clinton.museum +clock.museum +coal.museum +coastaldefence.museum +cody.museum +coldwar.museum +collection.museum +colonialwilliamsburg.museum +coloradoplateau.museum +columbia.museum +columbus.museum +communication.museum +communications.museum +community.museum +computer.museum +computerhistory.museum +comunicações.museum +contemporary.museum +contemporaryart.museum +convent.museum +copenhagen.museum +corporation.museum +correios-e-telecomunicações.museum +corvette.museum +costume.museum +countryestate.museum +county.museum +crafts.museum +cranbrook.museum +creation.museum +cultural.museum +culturalcenter.museum +culture.museum +cyber.museum +cymru.museum +dali.museum +dallas.museum +database.museum +ddr.museum +decorativearts.museum +delaware.museum +delmenhorst.museum +denmark.museum +depot.museum +design.museum +detroit.museum +dinosaur.museum +discovery.museum +dolls.museum +donostia.museum +durham.museum +eastafrica.museum +eastcoast.museum +education.museum +educational.museum +egyptian.museum +eisenbahn.museum +elburg.museum +elvendrell.museum +embroidery.museum +encyclopedic.museum +england.museum +entomology.museum +environment.museum +environmentalconservation.museum +epilepsy.museum +essex.museum +estate.museum +ethnology.museum +exeter.museum +exhibition.museum +family.museum +farm.museum +farmequipment.museum +farmers.museum +farmstead.museum +field.museum +figueres.museum +filatelia.museum +film.museum +fineart.museum +finearts.museum +finland.museum +flanders.museum +florida.museum +force.museum +fortmissoula.museum +fortworth.museum +foundation.museum +francaise.museum +frankfurt.museum +franziskaner.museum +freemasonry.museum +freiburg.museum +fribourg.museum +frog.museum +fundacio.museum +furniture.museum +gallery.museum +garden.museum +gateway.museum +geelvinck.museum +gemological.museum +geology.museum +georgia.museum +giessen.museum +glas.museum +glass.museum +gorge.museum +grandrapids.museum +graz.museum +guernsey.museum +halloffame.museum +hamburg.museum +handson.museum +harvestcelebration.museum +hawaii.museum +health.museum +heimatunduhren.museum +hellas.museum +helsinki.museum +hembygdsforbund.museum +heritage.museum +histoire.museum +historical.museum +historicalsociety.museum +historichouses.museum +historisch.museum +historisches.museum +history.museum +historyofscience.museum +horology.museum +house.museum +humanities.museum +illustration.museum +imageandsound.museum +indian.museum +indiana.museum +indianapolis.museum +indianmarket.museum +intelligence.museum +interactive.museum +iraq.museum +iron.museum +isleofman.museum +jamison.museum +jefferson.museum +jerusalem.museum +jewelry.museum +jewish.museum +jewishart.museum +jfk.museum +journalism.museum +judaica.museum +judygarland.museum +juedisches.museum +juif.museum +karate.museum +karikatur.museum +kids.museum +koebenhavn.museum +koeln.museum +kunst.museum +kunstsammlung.museum +kunstunddesign.museum +labor.museum +labour.museum +lajolla.museum +lancashire.museum +landes.museum +lans.museum +läns.museum +larsson.museum +lewismiller.museum +lincoln.museum +linz.museum +living.museum +livinghistory.museum +localhistory.museum +london.museum +losangeles.museum +louvre.museum +loyalist.museum +lucerne.museum +luxembourg.museum +luzern.museum +mad.museum +madrid.museum +mallorca.museum +manchester.museum +mansion.museum +mansions.museum +manx.museum +marburg.museum +maritime.museum +maritimo.museum +maryland.museum +marylhurst.museum +media.museum +medical.museum +medizinhistorisches.museum +meeres.museum +memorial.museum +mesaverde.museum +michigan.museum +midatlantic.museum +military.museum +mill.museum +miners.museum +mining.museum +minnesota.museum +missile.museum +missoula.museum +modern.museum +moma.museum +money.museum +monmouth.museum +monticello.museum +montreal.museum +moscow.museum +motorcycle.museum +muenchen.museum +muenster.museum +mulhouse.museum +muncie.museum +museet.museum +museumcenter.museum +museumvereniging.museum +music.museum +national.museum +nationalfirearms.museum +nationalheritage.museum +nativeamerican.museum +naturalhistory.museum +naturalhistorymuseum.museum +naturalsciences.museum +nature.museum +naturhistorisches.museum +natuurwetenschappen.museum +naumburg.museum +naval.museum +nebraska.museum +neues.museum +newhampshire.museum +newjersey.museum +newmexico.museum +newport.museum +newspaper.museum +newyork.museum +niepce.museum +norfolk.museum +north.museum +nrw.museum +nyc.museum +nyny.museum +oceanographic.museum +oceanographique.museum +omaha.museum +online.museum +ontario.museum +openair.museum +oregon.museum +oregontrail.museum +otago.museum +oxford.museum +pacific.museum +paderborn.museum +palace.museum +paleo.museum +palmsprings.museum +panama.museum +paris.museum +pasadena.museum +pharmacy.museum +philadelphia.museum +philadelphiaarea.museum +philately.museum +phoenix.museum +photography.museum +pilots.museum +pittsburgh.museum +planetarium.museum +plantation.museum +plants.museum +plaza.museum +portal.museum +portland.museum +portlligat.museum +posts-and-telecommunications.museum +preservation.museum +presidio.museum +press.museum +project.museum +public.museum +pubol.museum +quebec.museum +railroad.museum +railway.museum +research.museum +resistance.museum +riodejaneiro.museum +rochester.museum +rockart.museum +roma.museum +russia.museum +saintlouis.museum +salem.museum +salvadordali.museum +salzburg.museum +sandiego.museum +sanfrancisco.museum +santabarbara.museum +santacruz.museum +santafe.museum +saskatchewan.museum +satx.museum +savannahga.museum +schlesisches.museum +schoenbrunn.museum +schokoladen.museum +school.museum +schweiz.museum +science.museum +scienceandhistory.museum +scienceandindustry.museum +sciencecenter.museum +sciencecenters.museum +science-fiction.museum +sciencehistory.museum +sciences.museum +sciencesnaturelles.museum +scotland.museum +seaport.museum +settlement.museum +settlers.museum +shell.museum +sherbrooke.museum +sibenik.museum +silk.museum +ski.museum +skole.museum +society.museum +sologne.museum +soundandvision.museum +southcarolina.museum +southwest.museum +space.museum +spy.museum +square.museum +stadt.museum +stalbans.museum +starnberg.museum +state.museum +stateofdelaware.museum +station.museum +steam.museum +steiermark.museum +stjohn.museum +stockholm.museum +stpetersburg.museum +stuttgart.museum +suisse.museum +surgeonshall.museum +surrey.museum +svizzera.museum +sweden.museum +sydney.museum +tank.museum +tcm.museum +technology.museum +telekommunikation.museum +television.museum +texas.museum +textile.museum +theater.museum +time.museum +timekeeping.museum +topology.museum +torino.museum +touch.museum +town.museum +transport.museum +tree.museum +trolley.museum +trust.museum +trustee.museum +uhren.museum +ulm.museum +undersea.museum +university.museum +usa.museum +usantiques.museum +usarts.museum +uscountryestate.museum +usculture.museum +usdecorativearts.museum +usgarden.museum +ushistory.museum +ushuaia.museum +uslivinghistory.museum +utah.museum +uvic.museum +valley.museum +vantaa.museum +versailles.museum +viking.museum +village.museum +virginia.museum +virtual.museum +virtuel.museum +vlaanderen.museum +volkenkunde.museum +wales.museum +wallonie.museum +war.museum +washingtondc.museum +watchandclock.museum +watch-and-clock.museum +western.museum +westfalen.museum +whaling.museum +wildlife.museum +williamsburg.museum +windmill.museum +workshop.museum +york.museum +yorkshire.museum +yosemite.museum +youth.museum +zoological.museum +zoology.museum +ירושלים.museum +иком.museum + +// mv : https://en.wikipedia.org/wiki/.mv +// "mv" included because, contra Wikipedia, google.mv exists. +mv +aero.mv +biz.mv +com.mv +coop.mv +edu.mv +gov.mv +info.mv +int.mv +mil.mv +museum.mv +name.mv +net.mv +org.mv +pro.mv + +// mw : http://www.registrar.mw/ +mw +ac.mw +biz.mw +co.mw +com.mw +coop.mw +edu.mw +gov.mw +int.mw +museum.mw +net.mw +org.mw + +// mx : http://www.nic.mx/ +// Submitted by registry +mx +com.mx +org.mx +gob.mx +edu.mx +net.mx + +// my : http://www.mynic.my/ +// Available strings: https://mynic.my/resources/domains/buying-a-domain/ +my +biz.my +com.my +edu.my +gov.my +mil.my +name.my +net.my +org.my + +// mz : http://www.uem.mz/ +// Submitted by registry +mz +ac.mz +adv.mz +co.mz +edu.mz +gov.mz +mil.mz +net.mz +org.mz + +// na : http://www.na-nic.com.na/ +// http://www.info.na/domain/ +na +info.na +pro.na +name.na +school.na +or.na +dr.na +us.na +mx.na +ca.na +in.na +cc.na +tv.na +ws.na +mobi.na +co.na +com.na +org.na + +// name : has 2nd-level tlds, but there's no list of them +name + +// nc : http://www.cctld.nc/ +nc +asso.nc +nom.nc + +// ne : https://en.wikipedia.org/wiki/.ne +ne + +// net : https://en.wikipedia.org/wiki/.net +net + +// nf : https://en.wikipedia.org/wiki/.nf +nf +com.nf +net.nf +per.nf +rec.nf +web.nf +arts.nf +firm.nf +info.nf +other.nf +store.nf + +// ng : http://www.nira.org.ng/index.php/join-us/register-ng-domain/189-nira-slds +ng +com.ng +edu.ng +gov.ng +i.ng +mil.ng +mobi.ng +name.ng +net.ng +org.ng +sch.ng + +// ni : http://www.nic.ni/ +ni +ac.ni +biz.ni +co.ni +com.ni +edu.ni +gob.ni +in.ni +info.ni +int.ni +mil.ni +net.ni +nom.ni +org.ni +web.ni + +// nl : https://en.wikipedia.org/wiki/.nl +// https://www.sidn.nl/ +// ccTLD for the Netherlands +nl + +// no : https://www.norid.no/en/om-domenenavn/regelverk-for-no/ +// Norid geographical second level domains : https://www.norid.no/en/om-domenenavn/regelverk-for-no/vedlegg-b/ +// Norid category second level domains : https://www.norid.no/en/om-domenenavn/regelverk-for-no/vedlegg-c/ +// Norid category second-level domains managed by parties other than Norid : https://www.norid.no/en/om-domenenavn/regelverk-for-no/vedlegg-d/ +// RSS feed: https://teknisk.norid.no/en/feed/ +no +// Norid category second level domains : https://www.norid.no/en/om-domenenavn/regelverk-for-no/vedlegg-c/ +fhs.no +vgs.no +fylkesbibl.no +folkebibl.no +museum.no +idrett.no +priv.no +// Norid category second-level domains managed by parties other than Norid : https://www.norid.no/en/om-domenenavn/regelverk-for-no/vedlegg-d/ +mil.no +stat.no +dep.no +kommune.no +herad.no +// Norid geographical second level domains : https://www.norid.no/en/om-domenenavn/regelverk-for-no/vedlegg-b/ +// counties +aa.no +ah.no +bu.no +fm.no +hl.no +hm.no +jan-mayen.no +mr.no +nl.no +nt.no +of.no +ol.no +oslo.no +rl.no +sf.no +st.no +svalbard.no +tm.no +tr.no +va.no +vf.no +// primary and lower secondary schools per county +gs.aa.no +gs.ah.no +gs.bu.no +gs.fm.no +gs.hl.no +gs.hm.no +gs.jan-mayen.no +gs.mr.no +gs.nl.no +gs.nt.no +gs.of.no +gs.ol.no +gs.oslo.no +gs.rl.no +gs.sf.no +gs.st.no +gs.svalbard.no +gs.tm.no +gs.tr.no +gs.va.no +gs.vf.no +// cities +akrehamn.no +åkrehamn.no +algard.no +ålgård.no +arna.no +brumunddal.no +bryne.no +bronnoysund.no +brønnøysund.no +drobak.no +drøbak.no +egersund.no +fetsund.no +floro.no +florø.no +fredrikstad.no +hokksund.no +honefoss.no +hønefoss.no +jessheim.no +jorpeland.no +jørpeland.no +kirkenes.no +kopervik.no +krokstadelva.no +langevag.no +langevåg.no +leirvik.no +mjondalen.no +mjøndalen.no +mo-i-rana.no +mosjoen.no +mosjøen.no +nesoddtangen.no +orkanger.no +osoyro.no +osøyro.no +raholt.no +råholt.no +sandnessjoen.no +sandnessjøen.no +skedsmokorset.no +slattum.no +spjelkavik.no +stathelle.no +stavern.no +stjordalshalsen.no +stjørdalshalsen.no +tananger.no +tranby.no +vossevangen.no +// communities +afjord.no +åfjord.no +agdenes.no +al.no +ål.no +alesund.no +ålesund.no +alstahaug.no +alta.no +áltá.no +alaheadju.no +álaheadju.no +alvdal.no +amli.no +åmli.no +amot.no +åmot.no +andebu.no +andoy.no +andøy.no +andasuolo.no +ardal.no +årdal.no +aremark.no +arendal.no +ås.no +aseral.no +åseral.no +asker.no +askim.no +askvoll.no +askoy.no +askøy.no +asnes.no +åsnes.no +audnedaln.no +aukra.no +aure.no +aurland.no +aurskog-holand.no +aurskog-høland.no +austevoll.no +austrheim.no +averoy.no +averøy.no +balestrand.no +ballangen.no +balat.no +bálát.no +balsfjord.no +bahccavuotna.no +báhccavuotna.no +bamble.no +bardu.no +beardu.no +beiarn.no +bajddar.no +bájddar.no +baidar.no +báidár.no +berg.no +bergen.no +berlevag.no +berlevåg.no +bearalvahki.no +bearalváhki.no +bindal.no +birkenes.no +bjarkoy.no +bjarkøy.no +bjerkreim.no +bjugn.no +bodo.no +bodø.no +badaddja.no +bådåddjå.no +budejju.no +bokn.no +bremanger.no +bronnoy.no +brønnøy.no +bygland.no +bykle.no +barum.no +bærum.no +bo.telemark.no +bø.telemark.no +bo.nordland.no +bø.nordland.no +bievat.no +bievát.no +bomlo.no +bømlo.no +batsfjord.no +båtsfjord.no +bahcavuotna.no +báhcavuotna.no +dovre.no +drammen.no +drangedal.no +dyroy.no +dyrøy.no +donna.no +dønna.no +eid.no +eidfjord.no +eidsberg.no +eidskog.no +eidsvoll.no +eigersund.no +elverum.no +enebakk.no +engerdal.no +etne.no +etnedal.no +evenes.no +evenassi.no +evenášši.no +evje-og-hornnes.no +farsund.no +fauske.no +fuossko.no +fuoisku.no +fedje.no +fet.no +finnoy.no +finnøy.no +fitjar.no +fjaler.no +fjell.no +flakstad.no +flatanger.no +flekkefjord.no +flesberg.no +flora.no +fla.no +flå.no +folldal.no +forsand.no +fosnes.no +frei.no +frogn.no +froland.no +frosta.no +frana.no +fræna.no +froya.no +frøya.no +fusa.no +fyresdal.no +forde.no +førde.no +gamvik.no +gangaviika.no +gáŋgaviika.no +gaular.no +gausdal.no +gildeskal.no +gildeskål.no +giske.no +gjemnes.no +gjerdrum.no +gjerstad.no +gjesdal.no +gjovik.no +gjøvik.no +gloppen.no +gol.no +gran.no +grane.no +granvin.no +gratangen.no +grimstad.no +grong.no +kraanghke.no +kråanghke.no +grue.no +gulen.no +hadsel.no +halden.no +halsa.no +hamar.no +hamaroy.no +habmer.no +hábmer.no +hapmir.no +hápmir.no +hammerfest.no +hammarfeasta.no +hámmárfeasta.no +haram.no +hareid.no +harstad.no +hasvik.no +aknoluokta.no +ákŋoluokta.no +hattfjelldal.no +aarborte.no +haugesund.no +hemne.no +hemnes.no +hemsedal.no +heroy.more-og-romsdal.no +herøy.møre-og-romsdal.no +heroy.nordland.no +herøy.nordland.no +hitra.no +hjartdal.no +hjelmeland.no +hobol.no +hobøl.no +hof.no +hol.no +hole.no +holmestrand.no +holtalen.no +holtålen.no +hornindal.no +horten.no +hurdal.no +hurum.no +hvaler.no +hyllestad.no +hagebostad.no +hægebostad.no +hoyanger.no +høyanger.no +hoylandet.no +høylandet.no +ha.no +hå.no +ibestad.no +inderoy.no +inderøy.no +iveland.no +jevnaker.no +jondal.no +jolster.no +jølster.no +karasjok.no +karasjohka.no +kárášjohka.no +karlsoy.no +galsa.no +gálsá.no +karmoy.no +karmøy.no +kautokeino.no +guovdageaidnu.no +klepp.no +klabu.no +klæbu.no +kongsberg.no +kongsvinger.no +kragero.no +kragerø.no +kristiansand.no +kristiansund.no +krodsherad.no +krødsherad.no +kvalsund.no +rahkkeravju.no +ráhkkerávju.no +kvam.no +kvinesdal.no +kvinnherad.no +kviteseid.no +kvitsoy.no +kvitsøy.no +kvafjord.no +kvæfjord.no +giehtavuoatna.no +kvanangen.no +kvænangen.no +navuotna.no +návuotna.no +kafjord.no +kåfjord.no +gaivuotna.no +gáivuotna.no +larvik.no +lavangen.no +lavagis.no +loabat.no +loabát.no +lebesby.no +davvesiida.no +leikanger.no +leirfjord.no +leka.no +leksvik.no +lenvik.no +leangaviika.no +leaŋgaviika.no +lesja.no +levanger.no +lier.no +lierne.no +lillehammer.no +lillesand.no +lindesnes.no +lindas.no +lindås.no +lom.no +loppa.no +lahppi.no +láhppi.no +lund.no +lunner.no +luroy.no +lurøy.no +luster.no +lyngdal.no +lyngen.no +ivgu.no +lardal.no +lerdal.no +lærdal.no +lodingen.no +lødingen.no +lorenskog.no +lørenskog.no +loten.no +løten.no +malvik.no +masoy.no +måsøy.no +muosat.no +muosát.no +mandal.no +marker.no +marnardal.no +masfjorden.no +meland.no +meldal.no +melhus.no +meloy.no +meløy.no +meraker.no +meråker.no +moareke.no +moåreke.no +midsund.no +midtre-gauldal.no +modalen.no +modum.no +molde.no +moskenes.no +moss.no +mosvik.no +malselv.no +målselv.no +malatvuopmi.no +málatvuopmi.no +namdalseid.no +aejrie.no +namsos.no +namsskogan.no +naamesjevuemie.no +nååmesjevuemie.no +laakesvuemie.no +nannestad.no +narvik.no +narviika.no +naustdal.no +nedre-eiker.no +nes.akershus.no +nes.buskerud.no +nesna.no +nesodden.no +nesseby.no +unjarga.no +unjárga.no +nesset.no +nissedal.no +nittedal.no +nord-aurdal.no +nord-fron.no +nord-odal.no +norddal.no +nordkapp.no +davvenjarga.no +davvenjárga.no +nordre-land.no +nordreisa.no +raisa.no +ráisa.no +nore-og-uvdal.no +notodden.no +naroy.no +nærøy.no +notteroy.no +nøtterøy.no +odda.no +oksnes.no +øksnes.no +oppdal.no +oppegard.no +oppegård.no +orkdal.no +orland.no +ørland.no +orskog.no +ørskog.no +orsta.no +ørsta.no +os.hedmark.no +os.hordaland.no +osen.no +osteroy.no +osterøy.no +ostre-toten.no +østre-toten.no +overhalla.no +ovre-eiker.no +øvre-eiker.no +oyer.no +øyer.no +oygarden.no +øygarden.no +oystre-slidre.no +øystre-slidre.no +porsanger.no +porsangu.no +porsáŋgu.no +porsgrunn.no +radoy.no +radøy.no +rakkestad.no +rana.no +ruovat.no +randaberg.no +rauma.no +rendalen.no +rennebu.no +rennesoy.no +rennesøy.no +rindal.no +ringebu.no +ringerike.no +ringsaker.no +rissa.no +risor.no +risør.no +roan.no +rollag.no +rygge.no +ralingen.no +rælingen.no +rodoy.no +rødøy.no +romskog.no +rømskog.no +roros.no +røros.no +rost.no +røst.no +royken.no +røyken.no +royrvik.no +røyrvik.no +rade.no +råde.no +salangen.no +siellak.no +saltdal.no +salat.no +sálát.no +sálat.no +samnanger.no +sande.more-og-romsdal.no +sande.møre-og-romsdal.no +sande.vestfold.no +sandefjord.no +sandnes.no +sandoy.no +sandøy.no +sarpsborg.no +sauda.no +sauherad.no +sel.no +selbu.no +selje.no +seljord.no +sigdal.no +siljan.no +sirdal.no +skaun.no +skedsmo.no +ski.no +skien.no +skiptvet.no +skjervoy.no +skjervøy.no +skierva.no +skiervá.no +skjak.no +skjåk.no +skodje.no +skanland.no +skånland.no +skanit.no +skánit.no +smola.no +smøla.no +snillfjord.no +snasa.no +snåsa.no +snoasa.no +snaase.no +snåase.no +sogndal.no +sokndal.no +sola.no +solund.no +songdalen.no +sortland.no +spydeberg.no +stange.no +stavanger.no +steigen.no +steinkjer.no +stjordal.no +stjørdal.no +stokke.no +stor-elvdal.no +stord.no +stordal.no +storfjord.no +omasvuotna.no +strand.no +stranda.no +stryn.no +sula.no +suldal.no +sund.no +sunndal.no +surnadal.no +sveio.no +svelvik.no +sykkylven.no +sogne.no +søgne.no +somna.no +sømna.no +sondre-land.no +søndre-land.no +sor-aurdal.no +sør-aurdal.no +sor-fron.no +sør-fron.no +sor-odal.no +sør-odal.no +sor-varanger.no +sør-varanger.no +matta-varjjat.no +mátta-várjjat.no +sorfold.no +sørfold.no +sorreisa.no +sørreisa.no +sorum.no +sørum.no +tana.no +deatnu.no +time.no +tingvoll.no +tinn.no +tjeldsund.no +dielddanuorri.no +tjome.no +tjøme.no +tokke.no +tolga.no +torsken.no +tranoy.no +tranøy.no +tromso.no +tromsø.no +tromsa.no +romsa.no +trondheim.no +troandin.no +trysil.no +trana.no +træna.no +trogstad.no +trøgstad.no +tvedestrand.no +tydal.no +tynset.no +tysfjord.no +divtasvuodna.no +divttasvuotna.no +tysnes.no +tysvar.no +tysvær.no +tonsberg.no +tønsberg.no +ullensaker.no +ullensvang.no +ulvik.no +utsira.no +vadso.no +vadsø.no +cahcesuolo.no +čáhcesuolo.no +vaksdal.no +valle.no +vang.no +vanylven.no +vardo.no +vardø.no +varggat.no +várggát.no +vefsn.no +vaapste.no +vega.no +vegarshei.no +vegårshei.no +vennesla.no +verdal.no +verran.no +vestby.no +vestnes.no +vestre-slidre.no +vestre-toten.no +vestvagoy.no +vestvågøy.no +vevelstad.no +vik.no +vikna.no +vindafjord.no +volda.no +voss.no +varoy.no +værøy.no +vagan.no +vågan.no +voagat.no +vagsoy.no +vågsøy.no +vaga.no +vågå.no +valer.ostfold.no +våler.østfold.no +valer.hedmark.no +våler.hedmark.no + +// np : http://www.mos.com.np/register.html +*.np + +// nr : http://cenpac.net.nr/dns/index.html +// Submitted by registry +nr +biz.nr +info.nr +gov.nr +edu.nr +org.nr +net.nr +com.nr + +// nu : https://en.wikipedia.org/wiki/.nu +nu + +// nz : https://en.wikipedia.org/wiki/.nz +// Submitted by registry +nz +ac.nz +co.nz +cri.nz +geek.nz +gen.nz +govt.nz +health.nz +iwi.nz +kiwi.nz +maori.nz +mil.nz +māori.nz +net.nz +org.nz +parliament.nz +school.nz + +// om : https://en.wikipedia.org/wiki/.om +om +co.om +com.om +edu.om +gov.om +med.om +museum.om +net.om +org.om +pro.om + +// onion : https://tools.ietf.org/html/rfc7686 +onion + +// org : https://en.wikipedia.org/wiki/.org +org + +// pa : http://www.nic.pa/ +// Some additional second level "domains" resolve directly as hostnames, such as +// pannet.pa, so we add a rule for "pa". +pa +ac.pa +gob.pa +com.pa +org.pa +sld.pa +edu.pa +net.pa +ing.pa +abo.pa +med.pa +nom.pa + +// pe : https://www.nic.pe/InformeFinalComision.pdf +pe +edu.pe +gob.pe +nom.pe +mil.pe +org.pe +com.pe +net.pe + +// pf : http://www.gobin.info/domainname/formulaire-pf.pdf +pf +com.pf +org.pf +edu.pf + +// pg : https://en.wikipedia.org/wiki/.pg +*.pg + +// ph : http://www.domains.ph/FAQ2.asp +// Submitted by registry +ph +com.ph +net.ph +org.ph +gov.ph +edu.ph +ngo.ph +mil.ph +i.ph + +// pk : http://pk5.pknic.net.pk/pk5/msgNamepk.PK +pk +com.pk +net.pk +edu.pk +org.pk +fam.pk +biz.pk +web.pk +gov.pk +gob.pk +gok.pk +gon.pk +gop.pk +gos.pk +info.pk + +// pl http://www.dns.pl/english/index.html +// Submitted by registry +pl +com.pl +net.pl +org.pl +// pl functional domains (http://www.dns.pl/english/index.html) +aid.pl +agro.pl +atm.pl +auto.pl +biz.pl +edu.pl +gmina.pl +gsm.pl +info.pl +mail.pl +miasta.pl +media.pl +mil.pl +nieruchomosci.pl +nom.pl +pc.pl +powiat.pl +priv.pl +realestate.pl +rel.pl +sex.pl +shop.pl +sklep.pl +sos.pl +szkola.pl +targi.pl +tm.pl +tourism.pl +travel.pl +turystyka.pl +// Government domains +gov.pl +ap.gov.pl +ic.gov.pl +is.gov.pl +us.gov.pl +kmpsp.gov.pl +kppsp.gov.pl +kwpsp.gov.pl +psp.gov.pl +wskr.gov.pl +kwp.gov.pl +mw.gov.pl +ug.gov.pl +um.gov.pl +umig.gov.pl +ugim.gov.pl +upow.gov.pl +uw.gov.pl +starostwo.gov.pl +pa.gov.pl +po.gov.pl +psse.gov.pl +pup.gov.pl +rzgw.gov.pl +sa.gov.pl +so.gov.pl +sr.gov.pl +wsa.gov.pl +sko.gov.pl +uzs.gov.pl +wiih.gov.pl +winb.gov.pl +pinb.gov.pl +wios.gov.pl +witd.gov.pl +wzmiuw.gov.pl +piw.gov.pl +wiw.gov.pl +griw.gov.pl +wif.gov.pl +oum.gov.pl +sdn.gov.pl +zp.gov.pl +uppo.gov.pl +mup.gov.pl +wuoz.gov.pl +konsulat.gov.pl +oirm.gov.pl +// pl regional domains (http://www.dns.pl/english/index.html) +augustow.pl +babia-gora.pl +bedzin.pl +beskidy.pl +bialowieza.pl +bialystok.pl +bielawa.pl +bieszczady.pl +boleslawiec.pl +bydgoszcz.pl +bytom.pl +cieszyn.pl +czeladz.pl +czest.pl +dlugoleka.pl +elblag.pl +elk.pl +glogow.pl +gniezno.pl +gorlice.pl +grajewo.pl +ilawa.pl +jaworzno.pl +jelenia-gora.pl +jgora.pl +kalisz.pl +kazimierz-dolny.pl +karpacz.pl +kartuzy.pl +kaszuby.pl +katowice.pl +kepno.pl +ketrzyn.pl +klodzko.pl +kobierzyce.pl +kolobrzeg.pl +konin.pl +konskowola.pl +kutno.pl +lapy.pl +lebork.pl +legnica.pl +lezajsk.pl +limanowa.pl +lomza.pl +lowicz.pl +lubin.pl +lukow.pl +malbork.pl +malopolska.pl +mazowsze.pl +mazury.pl +mielec.pl +mielno.pl +mragowo.pl +naklo.pl +nowaruda.pl +nysa.pl +olawa.pl +olecko.pl +olkusz.pl +olsztyn.pl +opoczno.pl +opole.pl +ostroda.pl +ostroleka.pl +ostrowiec.pl +ostrowwlkp.pl +pila.pl +pisz.pl +podhale.pl +podlasie.pl +polkowice.pl +pomorze.pl +pomorskie.pl +prochowice.pl +pruszkow.pl +przeworsk.pl +pulawy.pl +radom.pl +rawa-maz.pl +rybnik.pl +rzeszow.pl +sanok.pl +sejny.pl +slask.pl +slupsk.pl +sosnowiec.pl +stalowa-wola.pl +skoczow.pl +starachowice.pl +stargard.pl +suwalki.pl +swidnica.pl +swiebodzin.pl +swinoujscie.pl +szczecin.pl +szczytno.pl +tarnobrzeg.pl +tgory.pl +turek.pl +tychy.pl +ustka.pl +walbrzych.pl +warmia.pl +warszawa.pl +waw.pl +wegrow.pl +wielun.pl +wlocl.pl +wloclawek.pl +wodzislaw.pl +wolomin.pl +wroclaw.pl +zachpomor.pl +zagan.pl +zarow.pl +zgora.pl +zgorzelec.pl + +// pm : http://www.afnic.fr/medias/documents/AFNIC-naming-policy2012.pdf +pm + +// pn : http://www.government.pn/PnRegistry/policies.htm +pn +gov.pn +co.pn +org.pn +edu.pn +net.pn + +// post : https://en.wikipedia.org/wiki/.post +post + +// pr : http://www.nic.pr/index.asp?f=1 +pr +com.pr +net.pr +org.pr +gov.pr +edu.pr +isla.pr +pro.pr +biz.pr +info.pr +name.pr +// these aren't mentioned on nic.pr, but on https://en.wikipedia.org/wiki/.pr +est.pr +prof.pr +ac.pr + +// pro : http://registry.pro/get-pro +pro +aaa.pro +aca.pro +acct.pro +avocat.pro +bar.pro +cpa.pro +eng.pro +jur.pro +law.pro +med.pro +recht.pro + +// ps : https://en.wikipedia.org/wiki/.ps +// http://www.nic.ps/registration/policy.html#reg +ps +edu.ps +gov.ps +sec.ps +plo.ps +com.ps +org.ps +net.ps + +// pt : https://www.dns.pt/en/domain/pt-terms-and-conditions-registration-rules/ +pt +net.pt +gov.pt +org.pt +edu.pt +int.pt +publ.pt +com.pt +nome.pt + +// pw : https://en.wikipedia.org/wiki/.pw +pw +co.pw +ne.pw +or.pw +ed.pw +go.pw +belau.pw + +// py : http://www.nic.py/pautas.html#seccion_9 +// Submitted by registry +py +com.py +coop.py +edu.py +gov.py +mil.py +net.py +org.py + +// qa : http://domains.qa/en/ +qa +com.qa +edu.qa +gov.qa +mil.qa +name.qa +net.qa +org.qa +sch.qa + +// re : http://www.afnic.re/obtenir/chartes/nommage-re/annexe-descriptifs +re +asso.re +com.re +nom.re + +// ro : http://www.rotld.ro/ +ro +arts.ro +com.ro +firm.ro +info.ro +nom.ro +nt.ro +org.ro +rec.ro +store.ro +tm.ro +www.ro + +// rs : https://www.rnids.rs/en/domains/national-domains +rs +ac.rs +co.rs +edu.rs +gov.rs +in.rs +org.rs + +// ru : https://cctld.ru/files/pdf/docs/en/rules_ru-rf.pdf +// Submitted by George Georgievsky +ru + +// rw : https://www.ricta.org.rw/sites/default/files/resources/registry_registrar_contract_0.pdf +rw +ac.rw +co.rw +coop.rw +gov.rw +mil.rw +net.rw +org.rw + +// sa : http://www.nic.net.sa/ +sa +com.sa +net.sa +org.sa +gov.sa +med.sa +pub.sa +edu.sa +sch.sa + +// sb : http://www.sbnic.net.sb/ +// Submitted by registry +sb +com.sb +edu.sb +gov.sb +net.sb +org.sb + +// sc : http://www.nic.sc/ +sc +com.sc +gov.sc +net.sc +org.sc +edu.sc + +// sd : http://www.isoc.sd/sudanic.isoc.sd/billing_pricing.htm +// Submitted by registry +sd +com.sd +net.sd +org.sd +edu.sd +med.sd +tv.sd +gov.sd +info.sd + +// se : https://en.wikipedia.org/wiki/.se +// Submitted by registry +se +a.se +ac.se +b.se +bd.se +brand.se +c.se +d.se +e.se +f.se +fh.se +fhsk.se +fhv.se +g.se +h.se +i.se +k.se +komforb.se +kommunalforbund.se +komvux.se +l.se +lanbib.se +m.se +n.se +naturbruksgymn.se +o.se +org.se +p.se +parti.se +pp.se +press.se +r.se +s.se +t.se +tm.se +u.se +w.se +x.se +y.se +z.se + +// sg : http://www.nic.net.sg/page/registration-policies-procedures-and-guidelines +sg +com.sg +net.sg +org.sg +gov.sg +edu.sg +per.sg + +// sh : http://nic.sh/rules.htm +sh +com.sh +net.sh +gov.sh +org.sh +mil.sh + +// si : https://en.wikipedia.org/wiki/.si +si + +// sj : No registrations at this time. +// Submitted by registry +sj + +// sk : https://en.wikipedia.org/wiki/.sk +// list of 2nd level domains ? +sk + +// sl : http://www.nic.sl +// Submitted by registry +sl +com.sl +net.sl +edu.sl +gov.sl +org.sl + +// sm : https://en.wikipedia.org/wiki/.sm +sm + +// sn : https://en.wikipedia.org/wiki/.sn +sn +art.sn +com.sn +edu.sn +gouv.sn +org.sn +perso.sn +univ.sn + +// so : http://sonic.so/policies/ +so +com.so +edu.so +gov.so +me.so +net.so +org.so + +// sr : https://en.wikipedia.org/wiki/.sr +sr + +// ss : https://registry.nic.ss/ +// Submitted by registry +ss +biz.ss +com.ss +edu.ss +gov.ss +me.ss +net.ss +org.ss +sch.ss + +// st : http://www.nic.st/html/policyrules/ +st +co.st +com.st +consulado.st +edu.st +embaixada.st +mil.st +net.st +org.st +principe.st +saotome.st +store.st + +// su : https://en.wikipedia.org/wiki/.su +su + +// sv : http://www.svnet.org.sv/niveldos.pdf +sv +com.sv +edu.sv +gob.sv +org.sv +red.sv + +// sx : https://en.wikipedia.org/wiki/.sx +// Submitted by registry +sx +gov.sx + +// sy : https://en.wikipedia.org/wiki/.sy +// see also: http://www.gobin.info/domainname/sy.doc +sy +edu.sy +gov.sy +net.sy +mil.sy +com.sy +org.sy + +// sz : https://en.wikipedia.org/wiki/.sz +// http://www.sispa.org.sz/ +sz +co.sz +ac.sz +org.sz + +// tc : https://en.wikipedia.org/wiki/.tc +tc + +// td : https://en.wikipedia.org/wiki/.td +td + +// tel: https://en.wikipedia.org/wiki/.tel +// http://www.telnic.org/ +tel + +// tf : https://en.wikipedia.org/wiki/.tf +tf + +// tg : https://en.wikipedia.org/wiki/.tg +// http://www.nic.tg/ +tg + +// th : https://en.wikipedia.org/wiki/.th +// Submitted by registry +th +ac.th +co.th +go.th +in.th +mi.th +net.th +or.th + +// tj : http://www.nic.tj/policy.html +tj +ac.tj +biz.tj +co.tj +com.tj +edu.tj +go.tj +gov.tj +int.tj +mil.tj +name.tj +net.tj +nic.tj +org.tj +test.tj +web.tj + +// tk : https://en.wikipedia.org/wiki/.tk +tk + +// tl : https://en.wikipedia.org/wiki/.tl +tl +gov.tl + +// tm : http://www.nic.tm/local.html +tm +com.tm +co.tm +org.tm +net.tm +nom.tm +gov.tm +mil.tm +edu.tm + +// tn : http://www.registre.tn/fr/ +// https://whois.ati.tn/ +tn +com.tn +ens.tn +fin.tn +gov.tn +ind.tn +info.tn +intl.tn +mincom.tn +nat.tn +net.tn +org.tn +perso.tn +tourism.tn + +// to : https://en.wikipedia.org/wiki/.to +// Submitted by registry +to +com.to +gov.to +net.to +org.to +edu.to +mil.to + +// tr : https://nic.tr/ +// https://nic.tr/forms/eng/policies.pdf +// https://nic.tr/index.php?USRACTN=PRICELST +tr +av.tr +bbs.tr +bel.tr +biz.tr +com.tr +dr.tr +edu.tr +gen.tr +gov.tr +info.tr +mil.tr +k12.tr +kep.tr +name.tr +net.tr +org.tr +pol.tr +tel.tr +tsk.tr +tv.tr +web.tr +// Used by Northern Cyprus +nc.tr +// Used by government agencies of Northern Cyprus +gov.nc.tr + +// tt : http://www.nic.tt/ +tt +co.tt +com.tt +org.tt +net.tt +biz.tt +info.tt +pro.tt +int.tt +coop.tt +jobs.tt +mobi.tt +travel.tt +museum.tt +aero.tt +name.tt +gov.tt +edu.tt + +// tv : https://en.wikipedia.org/wiki/.tv +// Not listing any 2LDs as reserved since none seem to exist in practice, +// Wikipedia notwithstanding. +tv + +// tw : https://en.wikipedia.org/wiki/.tw +tw +edu.tw +gov.tw +mil.tw +com.tw +net.tw +org.tw +idv.tw +game.tw +ebiz.tw +club.tw +網路.tw +組織.tw +商業.tw + +// tz : http://www.tznic.or.tz/index.php/domains +// Submitted by registry +tz +ac.tz +co.tz +go.tz +hotel.tz +info.tz +me.tz +mil.tz +mobi.tz +ne.tz +or.tz +sc.tz +tv.tz + +// ua : https://hostmaster.ua/policy/?ua +// Submitted by registry +ua +// ua 2LD +com.ua +edu.ua +gov.ua +in.ua +net.ua +org.ua +// ua geographic names +// https://hostmaster.ua/2ld/ +cherkassy.ua +cherkasy.ua +chernigov.ua +chernihiv.ua +chernivtsi.ua +chernovtsy.ua +ck.ua +cn.ua +cr.ua +crimea.ua +cv.ua +dn.ua +dnepropetrovsk.ua +dnipropetrovsk.ua +donetsk.ua +dp.ua +if.ua +ivano-frankivsk.ua +kh.ua +kharkiv.ua +kharkov.ua +kherson.ua +khmelnitskiy.ua +khmelnytskyi.ua +kiev.ua +kirovograd.ua +km.ua +kr.ua +krym.ua +ks.ua +kv.ua +kyiv.ua +lg.ua +lt.ua +lugansk.ua +lutsk.ua +lv.ua +lviv.ua +mk.ua +mykolaiv.ua +nikolaev.ua +od.ua +odesa.ua +odessa.ua +pl.ua +poltava.ua +rivne.ua +rovno.ua +rv.ua +sb.ua +sebastopol.ua +sevastopol.ua +sm.ua +sumy.ua +te.ua +ternopil.ua +uz.ua +uzhgorod.ua +vinnica.ua +vinnytsia.ua +vn.ua +volyn.ua +yalta.ua +zaporizhzhe.ua +zaporizhzhia.ua +zhitomir.ua +zhytomyr.ua +zp.ua +zt.ua + +// ug : https://www.registry.co.ug/ +ug +co.ug +or.ug +ac.ug +sc.ug +go.ug +ne.ug +com.ug +org.ug + +// uk : https://en.wikipedia.org/wiki/.uk +// Submitted by registry +uk +ac.uk +co.uk +gov.uk +ltd.uk +me.uk +net.uk +nhs.uk +org.uk +plc.uk +police.uk +*.sch.uk + +// us : https://en.wikipedia.org/wiki/.us +us +dni.us +fed.us +isa.us +kids.us +nsn.us +// us geographic names +ak.us +al.us +ar.us +as.us +az.us +ca.us +co.us +ct.us +dc.us +de.us +fl.us +ga.us +gu.us +hi.us +ia.us +id.us +il.us +in.us +ks.us +ky.us +la.us +ma.us +md.us +me.us +mi.us +mn.us +mo.us +ms.us +mt.us +nc.us +nd.us +ne.us +nh.us +nj.us +nm.us +nv.us +ny.us +oh.us +ok.us +or.us +pa.us +pr.us +ri.us +sc.us +sd.us +tn.us +tx.us +ut.us +vi.us +vt.us +va.us +wa.us +wi.us +wv.us +wy.us +// The registrar notes several more specific domains available in each state, +// such as state.*.us, dst.*.us, etc., but resolution of these is somewhat +// haphazard; in some states these domains resolve as addresses, while in others +// only subdomains are available, or even nothing at all. We include the +// most common ones where it's clear that different sites are different +// entities. +k12.ak.us +k12.al.us +k12.ar.us +k12.as.us +k12.az.us +k12.ca.us +k12.co.us +k12.ct.us +k12.dc.us +k12.de.us +k12.fl.us +k12.ga.us +k12.gu.us +// k12.hi.us Bug 614565 - Hawaii has a state-wide DOE login +k12.ia.us +k12.id.us +k12.il.us +k12.in.us +k12.ks.us +k12.ky.us +k12.la.us +k12.ma.us +k12.md.us +k12.me.us +k12.mi.us +k12.mn.us +k12.mo.us +k12.ms.us +k12.mt.us +k12.nc.us +// k12.nd.us Bug 1028347 - Removed at request of Travis Rosso +k12.ne.us +k12.nh.us +k12.nj.us +k12.nm.us +k12.nv.us +k12.ny.us +k12.oh.us +k12.ok.us +k12.or.us +k12.pa.us +k12.pr.us +// k12.ri.us Removed at request of Kim Cournoyer +k12.sc.us +// k12.sd.us Bug 934131 - Removed at request of James Booze +k12.tn.us +k12.tx.us +k12.ut.us +k12.vi.us +k12.vt.us +k12.va.us +k12.wa.us +k12.wi.us +// k12.wv.us Bug 947705 - Removed at request of Verne Britton +k12.wy.us +cc.ak.us +cc.al.us +cc.ar.us +cc.as.us +cc.az.us +cc.ca.us +cc.co.us +cc.ct.us +cc.dc.us +cc.de.us +cc.fl.us +cc.ga.us +cc.gu.us +cc.hi.us +cc.ia.us +cc.id.us +cc.il.us +cc.in.us +cc.ks.us +cc.ky.us +cc.la.us +cc.ma.us +cc.md.us +cc.me.us +cc.mi.us +cc.mn.us +cc.mo.us +cc.ms.us +cc.mt.us +cc.nc.us +cc.nd.us +cc.ne.us +cc.nh.us +cc.nj.us +cc.nm.us +cc.nv.us +cc.ny.us +cc.oh.us +cc.ok.us +cc.or.us +cc.pa.us +cc.pr.us +cc.ri.us +cc.sc.us +cc.sd.us +cc.tn.us +cc.tx.us +cc.ut.us +cc.vi.us +cc.vt.us +cc.va.us +cc.wa.us +cc.wi.us +cc.wv.us +cc.wy.us +lib.ak.us +lib.al.us +lib.ar.us +lib.as.us +lib.az.us +lib.ca.us +lib.co.us +lib.ct.us +lib.dc.us +// lib.de.us Issue #243 - Moved to Private section at request of Ed Moore +lib.fl.us +lib.ga.us +lib.gu.us +lib.hi.us +lib.ia.us +lib.id.us +lib.il.us +lib.in.us +lib.ks.us +lib.ky.us +lib.la.us +lib.ma.us +lib.md.us +lib.me.us +lib.mi.us +lib.mn.us +lib.mo.us +lib.ms.us +lib.mt.us +lib.nc.us +lib.nd.us +lib.ne.us +lib.nh.us +lib.nj.us +lib.nm.us +lib.nv.us +lib.ny.us +lib.oh.us +lib.ok.us +lib.or.us +lib.pa.us +lib.pr.us +lib.ri.us +lib.sc.us +lib.sd.us +lib.tn.us +lib.tx.us +lib.ut.us +lib.vi.us +lib.vt.us +lib.va.us +lib.wa.us +lib.wi.us +// lib.wv.us Bug 941670 - Removed at request of Larry W Arnold +lib.wy.us +// k12.ma.us contains school districts in Massachusetts. The 4LDs are +// managed independently except for private (PVT), charter (CHTR) and +// parochial (PAROCH) schools. Those are delegated directly to the +// 5LD operators. +pvt.k12.ma.us +chtr.k12.ma.us +paroch.k12.ma.us +// Merit Network, Inc. maintains the registry for =~ /(k12|cc|lib).mi.us/ and the following +// see also: http://domreg.merit.edu +// see also: whois -h whois.domreg.merit.edu help +ann-arbor.mi.us +cog.mi.us +dst.mi.us +eaton.mi.us +gen.mi.us +mus.mi.us +tec.mi.us +washtenaw.mi.us + +// uy : http://www.nic.org.uy/ +uy +com.uy +edu.uy +gub.uy +mil.uy +net.uy +org.uy + +// uz : http://www.reg.uz/ +uz +co.uz +com.uz +net.uz +org.uz + +// va : https://en.wikipedia.org/wiki/.va +va + +// vc : https://en.wikipedia.org/wiki/.vc +// Submitted by registry +vc +com.vc +net.vc +org.vc +gov.vc +mil.vc +edu.vc + +// ve : https://registro.nic.ve/ +// Submitted by registry nic@nic.ve and nicve@conatel.gob.ve +ve +arts.ve +bib.ve +co.ve +com.ve +e12.ve +edu.ve +firm.ve +gob.ve +gov.ve +info.ve +int.ve +mil.ve +net.ve +nom.ve +org.ve +rar.ve +rec.ve +store.ve +tec.ve +web.ve + +// vg : https://en.wikipedia.org/wiki/.vg +vg + +// vi : http://www.nic.vi/newdomainform.htm +// http://www.nic.vi/Domain_Rules/body_domain_rules.html indicates some other +// TLDs are "reserved", such as edu.vi and gov.vi, but doesn't actually say they +// are available for registration (which they do not seem to be). +vi +co.vi +com.vi +k12.vi +net.vi +org.vi + +// vn : https://www.dot.vn/vnnic/vnnic/domainregistration.jsp +vn +com.vn +net.vn +org.vn +edu.vn +gov.vn +int.vn +ac.vn +biz.vn +info.vn +name.vn +pro.vn +health.vn + +// vu : https://en.wikipedia.org/wiki/.vu +// http://www.vunic.vu/ +vu +com.vu +edu.vu +net.vu +org.vu + +// wf : http://www.afnic.fr/medias/documents/AFNIC-naming-policy2012.pdf +wf + +// ws : https://en.wikipedia.org/wiki/.ws +// http://samoanic.ws/index.dhtml +ws +com.ws +net.ws +org.ws +gov.ws +edu.ws + +// yt : http://www.afnic.fr/medias/documents/AFNIC-naming-policy2012.pdf +yt + +// IDN ccTLDs +// When submitting patches, please maintain a sort by ISO 3166 ccTLD, then +// U-label, and follow this format: +// // A-Label ("", [, variant info]) : +// // [sponsoring org] +// U-Label + +// xn--mgbaam7a8h ("Emerat", Arabic) : AE +// http://nic.ae/english/arabicdomain/rules.jsp +امارات + +// xn--y9a3aq ("hye", Armenian) : AM +// ISOC AM (operated by .am Registry) +հայ + +// xn--54b7fta0cc ("Bangla", Bangla) : BD +বাংলা + +// xn--90ae ("bg", Bulgarian) : BG +бг + +// xn--mgbcpq6gpa1a ("albahrain", Arabic) : BH +البحرين + +// xn--90ais ("bel", Belarusian/Russian Cyrillic) : BY +// Operated by .by registry +бел + +// xn--fiqs8s ("Zhongguo/China", Chinese, Simplified) : CN +// CNNIC +// http://cnnic.cn/html/Dir/2005/10/11/3218.htm +中国 + +// xn--fiqz9s ("Zhongguo/China", Chinese, Traditional) : CN +// CNNIC +// http://cnnic.cn/html/Dir/2005/10/11/3218.htm +中國 + +// xn--lgbbat1ad8j ("Algeria/Al Jazair", Arabic) : DZ +الجزائر + +// xn--wgbh1c ("Egypt/Masr", Arabic) : EG +// http://www.dotmasr.eg/ +مصر + +// xn--e1a4c ("eu", Cyrillic) : EU +// https://eurid.eu +ею + +// xn--qxa6a ("eu", Greek) : EU +// https://eurid.eu +ευ + +// xn--mgbah1a3hjkrd ("Mauritania", Arabic) : MR +موريتانيا + +// xn--node ("ge", Georgian Mkhedruli) : GE +გე + +// xn--qxam ("el", Greek) : GR +// Hellenic Ministry of Infrastructure, Transport, and Networks +ελ + +// xn--j6w193g ("Hong Kong", Chinese) : HK +// https://www.hkirc.hk +// Submitted by registry +// https://www.hkirc.hk/content.jsp?id=30#!/34 +香港 +公司.香港 +教育.香港 +政府.香港 +個人.香港 +網絡.香港 +組織.香港 + +// xn--2scrj9c ("Bharat", Kannada) : IN +// India +ಭಾರತ + +// xn--3hcrj9c ("Bharat", Oriya) : IN +// India +ଭାରତ + +// xn--45br5cyl ("Bharatam", Assamese) : IN +// India +ভাৰত + +// xn--h2breg3eve ("Bharatam", Sanskrit) : IN +// India +भारतम् + +// xn--h2brj9c8c ("Bharot", Santali) : IN +// India +भारोत + +// xn--mgbgu82a ("Bharat", Sindhi) : IN +// India +ڀارت + +// xn--rvc1e0am3e ("Bharatam", Malayalam) : IN +// India +ഭാരതം + +// xn--h2brj9c ("Bharat", Devanagari) : IN +// India +भारत + +// xn--mgbbh1a ("Bharat", Kashmiri) : IN +// India +بارت + +// xn--mgbbh1a71e ("Bharat", Arabic) : IN +// India +بھارت + +// xn--fpcrj9c3d ("Bharat", Telugu) : IN +// India +భారత్ + +// xn--gecrj9c ("Bharat", Gujarati) : IN +// India +ભારત + +// xn--s9brj9c ("Bharat", Gurmukhi) : IN +// India +ਭਾਰਤ + +// xn--45brj9c ("Bharat", Bengali) : IN +// India +ভারত + +// xn--xkc2dl3a5ee0h ("India", Tamil) : IN +// India +இந்தியா + +// xn--mgba3a4f16a ("Iran", Persian) : IR +ایران + +// xn--mgba3a4fra ("Iran", Arabic) : IR +ايران + +// xn--mgbtx2b ("Iraq", Arabic) : IQ +// Communications and Media Commission +عراق + +// xn--mgbayh7gpa ("al-Ordon", Arabic) : JO +// National Information Technology Center (NITC) +// Royal Scientific Society, Al-Jubeiha +الاردن + +// xn--3e0b707e ("Republic of Korea", Hangul) : KR +한국 + +// xn--80ao21a ("Kaz", Kazakh) : KZ +қаз + +// xn--q7ce6a ("Lao", Lao) : LA +ລາວ + +// xn--fzc2c9e2c ("Lanka", Sinhalese-Sinhala) : LK +// https://nic.lk +ලංකා + +// xn--xkc2al3hye2a ("Ilangai", Tamil) : LK +// https://nic.lk +இலங்கை + +// xn--mgbc0a9azcg ("Morocco/al-Maghrib", Arabic) : MA +المغرب + +// xn--d1alf ("mkd", Macedonian) : MK +// MARnet +мкд + +// xn--l1acc ("mon", Mongolian) : MN +мон + +// xn--mix891f ("Macao", Chinese, Traditional) : MO +// MONIC / HNET Asia (Registry Operator for .mo) +澳門 + +// xn--mix082f ("Macao", Chinese, Simplified) : MO +澳门 + +// xn--mgbx4cd0ab ("Malaysia", Malay) : MY +مليسيا + +// xn--mgb9awbf ("Oman", Arabic) : OM +عمان + +// xn--mgbai9azgqp6j ("Pakistan", Urdu/Arabic) : PK +پاکستان + +// xn--mgbai9a5eva00b ("Pakistan", Urdu/Arabic, variant) : PK +پاكستان + +// xn--ygbi2ammx ("Falasteen", Arabic) : PS +// The Palestinian National Internet Naming Authority (PNINA) +// http://www.pnina.ps +فلسطين + +// xn--90a3ac ("srb", Cyrillic) : RS +// https://www.rnids.rs/en/domains/national-domains +срб +пр.срб +орг.срб +обр.срб +од.срб +упр.срб +ак.срб + +// xn--p1ai ("rf", Russian-Cyrillic) : RU +// https://cctld.ru/files/pdf/docs/en/rules_ru-rf.pdf +// Submitted by George Georgievsky +рф + +// xn--wgbl6a ("Qatar", Arabic) : QA +// http://www.ict.gov.qa/ +قطر + +// xn--mgberp4a5d4ar ("AlSaudiah", Arabic) : SA +// http://www.nic.net.sa/ +السعودية + +// xn--mgberp4a5d4a87g ("AlSaudiah", Arabic, variant) : SA +السعودیة + +// xn--mgbqly7c0a67fbc ("AlSaudiah", Arabic, variant) : SA +السعودیۃ + +// xn--mgbqly7cvafr ("AlSaudiah", Arabic, variant) : SA +السعوديه + +// xn--mgbpl2fh ("sudan", Arabic) : SD +// Operated by .sd registry +سودان + +// xn--yfro4i67o Singapore ("Singapore", Chinese) : SG +新加坡 + +// xn--clchc0ea0b2g2a9gcd ("Singapore", Tamil) : SG +சிங்கப்பூர் + +// xn--ogbpf8fl ("Syria", Arabic) : SY +سورية + +// xn--mgbtf8fl ("Syria", Arabic, variant) : SY +سوريا + +// xn--o3cw4h ("Thai", Thai) : TH +// http://www.thnic.co.th +ไทย +ศึกษา.ไทย +ธุรกิจ.ไทย +รัฐบาล.ไทย +ทหาร.ไทย +เน็ต.ไทย +องค์กร.ไทย + +// xn--pgbs0dh ("Tunisia", Arabic) : TN +// http://nic.tn +تونس + +// xn--kpry57d ("Taiwan", Chinese, Traditional) : TW +// http://www.twnic.net/english/dn/dn_07a.htm +台灣 + +// xn--kprw13d ("Taiwan", Chinese, Simplified) : TW +// http://www.twnic.net/english/dn/dn_07a.htm +台湾 + +// xn--nnx388a ("Taiwan", Chinese, variant) : TW +臺灣 + +// xn--j1amh ("ukr", Cyrillic) : UA +укр + +// xn--mgb2ddes ("AlYemen", Arabic) : YE +اليمن + +// xxx : http://icmregistry.com +xxx + +// ye : http://www.y.net.ye/services/domain_name.htm +ye +com.ye +edu.ye +gov.ye +net.ye +mil.ye +org.ye + +// za : https://www.zadna.org.za/content/page/domain-information/ +ac.za +agric.za +alt.za +co.za +edu.za +gov.za +grondar.za +law.za +mil.za +net.za +ngo.za +nic.za +nis.za +nom.za +org.za +school.za +tm.za +web.za + +// zm : https://zicta.zm/ +// Submitted by registry +zm +ac.zm +biz.zm +co.zm +com.zm +edu.zm +gov.zm +info.zm +mil.zm +net.zm +org.zm +sch.zm + +// zw : https://www.potraz.gov.zw/ +// Confirmed by registry 2017-01-25 +zw +ac.zw +co.zw +gov.zw +mil.zw +org.zw + + +// newGTLDs + +// List of new gTLDs imported from https://www.icann.org/resources/registries/gtlds/v2/gtlds.json on 2022-03-27T15:13:38Z +// This list is auto-generated, don't edit it manually. +// aaa : 2015-02-26 American Automobile Association, Inc. +aaa + +// aarp : 2015-05-21 AARP +aarp + +// abarth : 2015-07-30 Fiat Chrysler Automobiles N.V. +abarth + +// abb : 2014-10-24 ABB Ltd +abb + +// abbott : 2014-07-24 Abbott Laboratories, Inc. +abbott + +// abbvie : 2015-07-30 AbbVie Inc. +abbvie + +// abc : 2015-07-30 Disney Enterprises, Inc. +abc + +// able : 2015-06-25 Able Inc. +able + +// abogado : 2014-04-24 Registry Services, LLC +abogado + +// abudhabi : 2015-07-30 Abu Dhabi Systems and Information Centre +abudhabi + +// academy : 2013-11-07 Binky Moon, LLC +academy + +// accenture : 2014-08-15 Accenture plc +accenture + +// accountant : 2014-11-20 dot Accountant Limited +accountant + +// accountants : 2014-03-20 Binky Moon, LLC +accountants + +// aco : 2015-01-08 ACO Severin Ahlmann GmbH & Co. KG +aco + +// actor : 2013-12-12 Dog Beach, LLC +actor + +// adac : 2015-07-16 Allgemeiner Deutscher Automobil-Club e.V. (ADAC) +adac + +// ads : 2014-12-04 Charleston Road Registry Inc. +ads + +// adult : 2014-10-16 ICM Registry AD LLC +adult + +// aeg : 2015-03-19 Aktiebolaget Electrolux +aeg + +// aetna : 2015-05-21 Aetna Life Insurance Company +aetna + +// afl : 2014-10-02 Australian Football League +afl + +// africa : 2014-03-24 ZA Central Registry NPC trading as Registry.Africa +africa + +// agakhan : 2015-04-23 Fondation Aga Khan (Aga Khan Foundation) +agakhan + +// agency : 2013-11-14 Binky Moon, LLC +agency + +// aig : 2014-12-18 American International Group, Inc. +aig + +// airbus : 2015-07-30 Airbus S.A.S. +airbus + +// airforce : 2014-03-06 Dog Beach, LLC +airforce + +// airtel : 2014-10-24 Bharti Airtel Limited +airtel + +// akdn : 2015-04-23 Fondation Aga Khan (Aga Khan Foundation) +akdn + +// alfaromeo : 2015-07-31 Fiat Chrysler Automobiles N.V. +alfaromeo + +// alibaba : 2015-01-15 Alibaba Group Holding Limited +alibaba + +// alipay : 2015-01-15 Alibaba Group Holding Limited +alipay + +// allfinanz : 2014-07-03 Allfinanz Deutsche Vermögensberatung Aktiengesellschaft +allfinanz + +// allstate : 2015-07-31 Allstate Fire and Casualty Insurance Company +allstate + +// ally : 2015-06-18 Ally Financial Inc. +ally + +// alsace : 2014-07-02 Region Grand Est +alsace + +// alstom : 2015-07-30 ALSTOM +alstom + +// amazon : 2019-12-19 Amazon Registry Services, Inc. +amazon + +// americanexpress : 2015-07-31 American Express Travel Related Services Company, Inc. +americanexpress + +// americanfamily : 2015-07-23 AmFam, Inc. +americanfamily + +// amex : 2015-07-31 American Express Travel Related Services Company, Inc. +amex + +// amfam : 2015-07-23 AmFam, Inc. +amfam + +// amica : 2015-05-28 Amica Mutual Insurance Company +amica + +// amsterdam : 2014-07-24 Gemeente Amsterdam +amsterdam + +// analytics : 2014-12-18 Campus IP LLC +analytics + +// android : 2014-08-07 Charleston Road Registry Inc. +android + +// anquan : 2015-01-08 Beijing Qihu Keji Co., Ltd. +anquan + +// anz : 2015-07-31 Australia and New Zealand Banking Group Limited +anz + +// aol : 2015-09-17 Oath Inc. +aol + +// apartments : 2014-12-11 Binky Moon, LLC +apartments + +// app : 2015-05-14 Charleston Road Registry Inc. +app + +// apple : 2015-05-14 Apple Inc. +apple + +// aquarelle : 2014-07-24 Aquarelle.com +aquarelle + +// arab : 2015-11-12 League of Arab States +arab + +// aramco : 2014-11-20 Aramco Services Company +aramco + +// archi : 2014-02-06 Afilias Limited +archi + +// army : 2014-03-06 Dog Beach, LLC +army + +// art : 2016-03-24 UK Creative Ideas Limited +art + +// arte : 2014-12-11 Association Relative à la Télévision Européenne G.E.I.E. +arte + +// asda : 2015-07-31 Wal-Mart Stores, Inc. +asda + +// associates : 2014-03-06 Binky Moon, LLC +associates + +// athleta : 2015-07-30 The Gap, Inc. +athleta + +// attorney : 2014-03-20 Dog Beach, LLC +attorney + +// auction : 2014-03-20 Dog Beach, LLC +auction + +// audi : 2015-05-21 AUDI Aktiengesellschaft +audi + +// audible : 2015-06-25 Amazon Registry Services, Inc. +audible + +// audio : 2014-03-20 XYZ.COM LLC +audio + +// auspost : 2015-08-13 Australian Postal Corporation +auspost + +// author : 2014-12-18 Amazon Registry Services, Inc. +author + +// auto : 2014-11-13 XYZ.COM LLC +auto + +// autos : 2014-01-09 XYZ.COM LLC +autos + +// avianca : 2015-01-08 Avianca Holdings S.A. +avianca + +// aws : 2015-06-25 AWS Registry LLC +aws + +// axa : 2013-12-19 AXA Group Operations SAS +axa + +// azure : 2014-12-18 Microsoft Corporation +azure + +// baby : 2015-04-09 XYZ.COM LLC +baby + +// baidu : 2015-01-08 Baidu, Inc. +baidu + +// banamex : 2015-07-30 Citigroup Inc. +banamex + +// bananarepublic : 2015-07-31 The Gap, Inc. +bananarepublic + +// band : 2014-06-12 Dog Beach, LLC +band + +// bank : 2014-09-25 fTLD Registry Services LLC +bank + +// bar : 2013-12-12 Punto 2012 Sociedad Anonima Promotora de Inversion de Capital Variable +bar + +// barcelona : 2014-07-24 Municipi de Barcelona +barcelona + +// barclaycard : 2014-11-20 Barclays Bank PLC +barclaycard + +// barclays : 2014-11-20 Barclays Bank PLC +barclays + +// barefoot : 2015-06-11 Gallo Vineyards, Inc. +barefoot + +// bargains : 2013-11-14 Binky Moon, LLC +bargains + +// baseball : 2015-10-29 MLB Advanced Media DH, LLC +baseball + +// basketball : 2015-08-20 Fédération Internationale de Basketball (FIBA) +basketball + +// bauhaus : 2014-04-17 Werkhaus GmbH +bauhaus + +// bayern : 2014-01-23 Bayern Connect GmbH +bayern + +// bbc : 2014-12-18 British Broadcasting Corporation +bbc + +// bbt : 2015-07-23 BB&T Corporation +bbt + +// bbva : 2014-10-02 BANCO BILBAO VIZCAYA ARGENTARIA, S.A. +bbva + +// bcg : 2015-04-02 The Boston Consulting Group, Inc. +bcg + +// bcn : 2014-07-24 Municipi de Barcelona +bcn + +// beats : 2015-05-14 Beats Electronics, LLC +beats + +// beauty : 2015-12-03 XYZ.COM LLC +beauty + +// beer : 2014-01-09 Registry Services, LLC +beer + +// bentley : 2014-12-18 Bentley Motors Limited +bentley + +// berlin : 2013-10-31 dotBERLIN GmbH & Co. KG +berlin + +// best : 2013-12-19 BestTLD Pty Ltd +best + +// bestbuy : 2015-07-31 BBY Solutions, Inc. +bestbuy + +// bet : 2015-05-07 Afilias Limited +bet + +// bharti : 2014-01-09 Bharti Enterprises (Holding) Private Limited +bharti + +// bible : 2014-06-19 American Bible Society +bible + +// bid : 2013-12-19 dot Bid Limited +bid + +// bike : 2013-08-27 Binky Moon, LLC +bike + +// bing : 2014-12-18 Microsoft Corporation +bing + +// bingo : 2014-12-04 Binky Moon, LLC +bingo + +// bio : 2014-03-06 Afilias Limited +bio + +// black : 2014-01-16 Afilias Limited +black + +// blackfriday : 2014-01-16 UNR Corp. +blackfriday + +// blockbuster : 2015-07-30 Dish DBS Corporation +blockbuster + +// blog : 2015-05-14 Knock Knock WHOIS There, LLC +blog + +// bloomberg : 2014-07-17 Bloomberg IP Holdings LLC +bloomberg + +// blue : 2013-11-07 Afilias Limited +blue + +// bms : 2014-10-30 Bristol-Myers Squibb Company +bms + +// bmw : 2014-01-09 Bayerische Motoren Werke Aktiengesellschaft +bmw + +// bnpparibas : 2014-05-29 BNP Paribas +bnpparibas + +// boats : 2014-12-04 XYZ.COM LLC +boats + +// boehringer : 2015-07-09 Boehringer Ingelheim International GmbH +boehringer + +// bofa : 2015-07-31 Bank of America Corporation +bofa + +// bom : 2014-10-16 Núcleo de Informação e Coordenação do Ponto BR - NIC.br +bom + +// bond : 2014-06-05 ShortDot SA +bond + +// boo : 2014-01-30 Charleston Road Registry Inc. +boo + +// book : 2015-08-27 Amazon Registry Services, Inc. +book + +// booking : 2015-07-16 Booking.com B.V. +booking + +// bosch : 2015-06-18 Robert Bosch GMBH +bosch + +// bostik : 2015-05-28 Bostik SA +bostik + +// boston : 2015-12-10 Registry Services, LLC +boston + +// bot : 2014-12-18 Amazon Registry Services, Inc. +bot + +// boutique : 2013-11-14 Binky Moon, LLC +boutique + +// box : 2015-11-12 Intercap Registry Inc. +box + +// bradesco : 2014-12-18 Banco Bradesco S.A. +bradesco + +// bridgestone : 2014-12-18 Bridgestone Corporation +bridgestone + +// broadway : 2014-12-22 Celebrate Broadway, Inc. +broadway + +// broker : 2014-12-11 Dog Beach, LLC +broker + +// brother : 2015-01-29 Brother Industries, Ltd. +brother + +// brussels : 2014-02-06 DNS.be vzw +brussels + +// bugatti : 2015-07-23 Bugatti International SA +bugatti + +// build : 2013-11-07 Plan Bee LLC +build + +// builders : 2013-11-07 Binky Moon, LLC +builders + +// business : 2013-11-07 Binky Moon, LLC +business + +// buy : 2014-12-18 Amazon Registry Services, Inc. +buy + +// buzz : 2013-10-02 DOTSTRATEGY CO. +buzz + +// bzh : 2014-02-27 Association www.bzh +bzh + +// cab : 2013-10-24 Binky Moon, LLC +cab + +// cafe : 2015-02-11 Binky Moon, LLC +cafe + +// cal : 2014-07-24 Charleston Road Registry Inc. +cal + +// call : 2014-12-18 Amazon Registry Services, Inc. +call + +// calvinklein : 2015-07-30 PVH gTLD Holdings LLC +calvinklein + +// cam : 2016-04-21 Cam Connecting SARL +cam + +// camera : 2013-08-27 Binky Moon, LLC +camera + +// camp : 2013-11-07 Binky Moon, LLC +camp + +// cancerresearch : 2014-05-15 Australian Cancer Research Foundation +cancerresearch + +// canon : 2014-09-12 Canon Inc. +canon + +// capetown : 2014-03-24 ZA Central Registry NPC trading as ZA Central Registry +capetown + +// capital : 2014-03-06 Binky Moon, LLC +capital + +// capitalone : 2015-08-06 Capital One Financial Corporation +capitalone + +// car : 2015-01-22 XYZ.COM LLC +car + +// caravan : 2013-12-12 Caravan International, Inc. +caravan + +// cards : 2013-12-05 Binky Moon, LLC +cards + +// care : 2014-03-06 Binky Moon, LLC +care + +// career : 2013-10-09 dotCareer LLC +career + +// careers : 2013-10-02 Binky Moon, LLC +careers + +// cars : 2014-11-13 XYZ.COM LLC +cars + +// casa : 2013-11-21 Registry Services, LLC +casa + +// case : 2015-09-03 Helium TLDs Ltd +case + +// cash : 2014-03-06 Binky Moon, LLC +cash + +// casino : 2014-12-18 Binky Moon, LLC +casino + +// catering : 2013-12-05 Binky Moon, LLC +catering + +// catholic : 2015-10-21 Pontificium Consilium de Comunicationibus Socialibus (PCCS) (Pontifical Council for Social Communication) +catholic + +// cba : 2014-06-26 COMMONWEALTH BANK OF AUSTRALIA +cba + +// cbn : 2014-08-22 The Christian Broadcasting Network, Inc. +cbn + +// cbre : 2015-07-02 CBRE, Inc. +cbre + +// cbs : 2015-08-06 CBS Domains Inc. +cbs + +// center : 2013-11-07 Binky Moon, LLC +center + +// ceo : 2013-11-07 CEOTLD Pty Ltd +ceo + +// cern : 2014-06-05 European Organization for Nuclear Research ("CERN") +cern + +// cfa : 2014-08-28 CFA Institute +cfa + +// cfd : 2014-12-11 ShortDot SA +cfd + +// chanel : 2015-04-09 Chanel International B.V. +chanel + +// channel : 2014-05-08 Charleston Road Registry Inc. +channel + +// charity : 2018-04-11 Binky Moon, LLC +charity + +// chase : 2015-04-30 JPMorgan Chase Bank, National Association +chase + +// chat : 2014-12-04 Binky Moon, LLC +chat + +// cheap : 2013-11-14 Binky Moon, LLC +cheap + +// chintai : 2015-06-11 CHINTAI Corporation +chintai + +// christmas : 2013-11-21 XYZ.COM LLC +christmas + +// chrome : 2014-07-24 Charleston Road Registry Inc. +chrome + +// church : 2014-02-06 Binky Moon, LLC +church + +// cipriani : 2015-02-19 Hotel Cipriani Srl +cipriani + +// circle : 2014-12-18 Amazon Registry Services, Inc. +circle + +// cisco : 2014-12-22 Cisco Technology, Inc. +cisco + +// citadel : 2015-07-23 Citadel Domain LLC +citadel + +// citi : 2015-07-30 Citigroup Inc. +citi + +// citic : 2014-01-09 CITIC Group Corporation +citic + +// city : 2014-05-29 Binky Moon, LLC +city + +// cityeats : 2014-12-11 Lifestyle Domain Holdings, Inc. +cityeats + +// claims : 2014-03-20 Binky Moon, LLC +claims + +// cleaning : 2013-12-05 Binky Moon, LLC +cleaning + +// click : 2014-06-05 UNR Corp. +click + +// clinic : 2014-03-20 Binky Moon, LLC +clinic + +// clinique : 2015-10-01 The Estée Lauder Companies Inc. +clinique + +// clothing : 2013-08-27 Binky Moon, LLC +clothing + +// cloud : 2015-04-16 Aruba PEC S.p.A. +cloud + +// club : 2013-11-08 Registry Services, LLC +club + +// clubmed : 2015-06-25 Club Méditerranée S.A. +clubmed + +// coach : 2014-10-09 Binky Moon, LLC +coach + +// codes : 2013-10-31 Binky Moon, LLC +codes + +// coffee : 2013-10-17 Binky Moon, LLC +coffee + +// college : 2014-01-16 XYZ.COM LLC +college + +// cologne : 2014-02-05 dotKoeln GmbH +cologne + +// comcast : 2015-07-23 Comcast IP Holdings I, LLC +comcast + +// commbank : 2014-06-26 COMMONWEALTH BANK OF AUSTRALIA +commbank + +// community : 2013-12-05 Binky Moon, LLC +community + +// company : 2013-11-07 Binky Moon, LLC +company + +// compare : 2015-10-08 Registry Services, LLC +compare + +// computer : 2013-10-24 Binky Moon, LLC +computer + +// comsec : 2015-01-08 VeriSign, Inc. +comsec + +// condos : 2013-12-05 Binky Moon, LLC +condos + +// construction : 2013-09-16 Binky Moon, LLC +construction + +// consulting : 2013-12-05 Dog Beach, LLC +consulting + +// contact : 2015-01-08 Dog Beach, LLC +contact + +// contractors : 2013-09-10 Binky Moon, LLC +contractors + +// cooking : 2013-11-21 Registry Services, LLC +cooking + +// cookingchannel : 2015-07-02 Lifestyle Domain Holdings, Inc. +cookingchannel + +// cool : 2013-11-14 Binky Moon, LLC +cool + +// corsica : 2014-09-25 Collectivité de Corse +corsica + +// country : 2013-12-19 DotCountry LLC +country + +// coupon : 2015-02-26 Amazon Registry Services, Inc. +coupon + +// coupons : 2015-03-26 Binky Moon, LLC +coupons + +// courses : 2014-12-04 OPEN UNIVERSITIES AUSTRALIA PTY LTD +courses + +// cpa : 2019-06-10 American Institute of Certified Public Accountants +cpa + +// credit : 2014-03-20 Binky Moon, LLC +credit + +// creditcard : 2014-03-20 Binky Moon, LLC +creditcard + +// creditunion : 2015-01-22 DotCooperation LLC +creditunion + +// cricket : 2014-10-09 dot Cricket Limited +cricket + +// crown : 2014-10-24 Crown Equipment Corporation +crown + +// crs : 2014-04-03 Federated Co-operatives Limited +crs + +// cruise : 2015-12-10 Viking River Cruises (Bermuda) Ltd. +cruise + +// cruises : 2013-12-05 Binky Moon, LLC +cruises + +// cuisinella : 2014-04-03 SCHMIDT GROUPE S.A.S. +cuisinella + +// cymru : 2014-05-08 Nominet UK +cymru + +// cyou : 2015-01-22 ShortDot SA +cyou + +// dabur : 2014-02-06 Dabur India Limited +dabur + +// dad : 2014-01-23 Charleston Road Registry Inc. +dad + +// dance : 2013-10-24 Dog Beach, LLC +dance + +// data : 2016-06-02 Dish DBS Corporation +data + +// date : 2014-11-20 dot Date Limited +date + +// dating : 2013-12-05 Binky Moon, LLC +dating + +// datsun : 2014-03-27 NISSAN MOTOR CO., LTD. +datsun + +// day : 2014-01-30 Charleston Road Registry Inc. +day + +// dclk : 2014-11-20 Charleston Road Registry Inc. +dclk + +// dds : 2015-05-07 Registry Services, LLC +dds + +// deal : 2015-06-25 Amazon Registry Services, Inc. +deal + +// dealer : 2014-12-22 Intercap Registry Inc. +dealer + +// deals : 2014-05-22 Binky Moon, LLC +deals + +// degree : 2014-03-06 Dog Beach, LLC +degree + +// delivery : 2014-09-11 Binky Moon, LLC +delivery + +// dell : 2014-10-24 Dell Inc. +dell + +// deloitte : 2015-07-31 Deloitte Touche Tohmatsu +deloitte + +// delta : 2015-02-19 Delta Air Lines, Inc. +delta + +// democrat : 2013-10-24 Dog Beach, LLC +democrat + +// dental : 2014-03-20 Binky Moon, LLC +dental + +// dentist : 2014-03-20 Dog Beach, LLC +dentist + +// desi : 2013-11-14 Desi Networks LLC +desi + +// design : 2014-11-07 Registry Services, LLC +design + +// dev : 2014-10-16 Charleston Road Registry Inc. +dev + +// dhl : 2015-07-23 Deutsche Post AG +dhl + +// diamonds : 2013-09-22 Binky Moon, LLC +diamonds + +// diet : 2014-06-26 XYZ.COM LLC +diet + +// digital : 2014-03-06 Binky Moon, LLC +digital + +// direct : 2014-04-10 Binky Moon, LLC +direct + +// directory : 2013-09-20 Binky Moon, LLC +directory + +// discount : 2014-03-06 Binky Moon, LLC +discount + +// discover : 2015-07-23 Discover Financial Services +discover + +// dish : 2015-07-30 Dish DBS Corporation +dish + +// diy : 2015-11-05 Lifestyle Domain Holdings, Inc. +diy + +// dnp : 2013-12-13 Dai Nippon Printing Co., Ltd. +dnp + +// docs : 2014-10-16 Charleston Road Registry Inc. +docs + +// doctor : 2016-06-02 Binky Moon, LLC +doctor + +// dog : 2014-12-04 Binky Moon, LLC +dog + +// domains : 2013-10-17 Binky Moon, LLC +domains + +// dot : 2015-05-21 Dish DBS Corporation +dot + +// download : 2014-11-20 dot Support Limited +download + +// drive : 2015-03-05 Charleston Road Registry Inc. +drive + +// dtv : 2015-06-04 Dish DBS Corporation +dtv + +// dubai : 2015-01-01 Dubai Smart Government Department +dubai + +// dunlop : 2015-07-02 The Goodyear Tire & Rubber Company +dunlop + +// dupont : 2015-06-25 DuPont Specialty Products USA, LLC +dupont + +// durban : 2014-03-24 ZA Central Registry NPC trading as ZA Central Registry +durban + +// dvag : 2014-06-23 Deutsche Vermögensberatung Aktiengesellschaft DVAG +dvag + +// dvr : 2016-05-26 DISH Technologies L.L.C. +dvr + +// earth : 2014-12-04 Interlink Co., Ltd. +earth + +// eat : 2014-01-23 Charleston Road Registry Inc. +eat + +// eco : 2016-07-08 Big Room Inc. +eco + +// edeka : 2014-12-18 EDEKA Verband kaufmännischer Genossenschaften e.V. +edeka + +// education : 2013-11-07 Binky Moon, LLC +education + +// email : 2013-10-31 Binky Moon, LLC +email + +// emerck : 2014-04-03 Merck KGaA +emerck + +// energy : 2014-09-11 Binky Moon, LLC +energy + +// engineer : 2014-03-06 Dog Beach, LLC +engineer + +// engineering : 2014-03-06 Binky Moon, LLC +engineering + +// enterprises : 2013-09-20 Binky Moon, LLC +enterprises + +// epson : 2014-12-04 Seiko Epson Corporation +epson + +// equipment : 2013-08-27 Binky Moon, LLC +equipment + +// ericsson : 2015-07-09 Telefonaktiebolaget L M Ericsson +ericsson + +// erni : 2014-04-03 ERNI Group Holding AG +erni + +// esq : 2014-05-08 Charleston Road Registry Inc. +esq + +// estate : 2013-08-27 Binky Moon, LLC +estate + +// etisalat : 2015-09-03 Emirates Telecommunications Corporation (trading as Etisalat) +etisalat + +// eurovision : 2014-04-24 European Broadcasting Union (EBU) +eurovision + +// eus : 2013-12-12 Puntueus Fundazioa +eus + +// events : 2013-12-05 Binky Moon, LLC +events + +// exchange : 2014-03-06 Binky Moon, LLC +exchange + +// expert : 2013-11-21 Binky Moon, LLC +expert + +// exposed : 2013-12-05 Binky Moon, LLC +exposed + +// express : 2015-02-11 Binky Moon, LLC +express + +// extraspace : 2015-05-14 Extra Space Storage LLC +extraspace + +// fage : 2014-12-18 Fage International S.A. +fage + +// fail : 2014-03-06 Binky Moon, LLC +fail + +// fairwinds : 2014-11-13 FairWinds Partners, LLC +fairwinds + +// faith : 2014-11-20 dot Faith Limited +faith + +// family : 2015-04-02 Dog Beach, LLC +family + +// fan : 2014-03-06 Dog Beach, LLC +fan + +// fans : 2014-11-07 ZDNS International Limited +fans + +// farm : 2013-11-07 Binky Moon, LLC +farm + +// farmers : 2015-07-09 Farmers Insurance Exchange +farmers + +// fashion : 2014-07-03 Registry Services, LLC +fashion + +// fast : 2014-12-18 Amazon Registry Services, Inc. +fast + +// fedex : 2015-08-06 Federal Express Corporation +fedex + +// feedback : 2013-12-19 Top Level Spectrum, Inc. +feedback + +// ferrari : 2015-07-31 Fiat Chrysler Automobiles N.V. +ferrari + +// ferrero : 2014-12-18 Ferrero Trading Lux S.A. +ferrero + +// fiat : 2015-07-31 Fiat Chrysler Automobiles N.V. +fiat + +// fidelity : 2015-07-30 Fidelity Brokerage Services LLC +fidelity + +// fido : 2015-08-06 Rogers Communications Canada Inc. +fido + +// film : 2015-01-08 Motion Picture Domain Registry Pty Ltd +film + +// final : 2014-10-16 Núcleo de Informação e Coordenação do Ponto BR - NIC.br +final + +// finance : 2014-03-20 Binky Moon, LLC +finance + +// financial : 2014-03-06 Binky Moon, LLC +financial + +// fire : 2015-06-25 Amazon Registry Services, Inc. +fire + +// firestone : 2014-12-18 Bridgestone Licensing Services, Inc +firestone + +// firmdale : 2014-03-27 Firmdale Holdings Limited +firmdale + +// fish : 2013-12-12 Binky Moon, LLC +fish + +// fishing : 2013-11-21 Registry Services, LLC +fishing + +// fit : 2014-11-07 Registry Services, LLC +fit + +// fitness : 2014-03-06 Binky Moon, LLC +fitness + +// flickr : 2015-04-02 Flickr, Inc. +flickr + +// flights : 2013-12-05 Binky Moon, LLC +flights + +// flir : 2015-07-23 FLIR Systems, Inc. +flir + +// florist : 2013-11-07 Binky Moon, LLC +florist + +// flowers : 2014-10-09 XYZ.COM LLC +flowers + +// fly : 2014-05-08 Charleston Road Registry Inc. +fly + +// foo : 2014-01-23 Charleston Road Registry Inc. +foo + +// food : 2016-04-21 Lifestyle Domain Holdings, Inc. +food + +// foodnetwork : 2015-07-02 Lifestyle Domain Holdings, Inc. +foodnetwork + +// football : 2014-12-18 Binky Moon, LLC +football + +// ford : 2014-11-13 Ford Motor Company +ford + +// forex : 2014-12-11 Dog Beach, LLC +forex + +// forsale : 2014-05-22 Dog Beach, LLC +forsale + +// forum : 2015-04-02 Fegistry, LLC +forum + +// foundation : 2013-12-05 Binky Moon, LLC +foundation + +// fox : 2015-09-11 FOX Registry, LLC +fox + +// free : 2015-12-10 Amazon Registry Services, Inc. +free + +// fresenius : 2015-07-30 Fresenius Immobilien-Verwaltungs-GmbH +fresenius + +// frl : 2014-05-15 FRLregistry B.V. +frl + +// frogans : 2013-12-19 OP3FT +frogans + +// frontdoor : 2015-07-02 Lifestyle Domain Holdings, Inc. +frontdoor + +// frontier : 2015-02-05 Frontier Communications Corporation +frontier + +// ftr : 2015-07-16 Frontier Communications Corporation +ftr + +// fujitsu : 2015-07-30 Fujitsu Limited +fujitsu + +// fun : 2016-01-14 Radix FZC +fun + +// fund : 2014-03-20 Binky Moon, LLC +fund + +// furniture : 2014-03-20 Binky Moon, LLC +furniture + +// futbol : 2013-09-20 Dog Beach, LLC +futbol + +// fyi : 2015-04-02 Binky Moon, LLC +fyi + +// gal : 2013-11-07 Asociación puntoGAL +gal + +// gallery : 2013-09-13 Binky Moon, LLC +gallery + +// gallo : 2015-06-11 Gallo Vineyards, Inc. +gallo + +// gallup : 2015-02-19 Gallup, Inc. +gallup + +// game : 2015-05-28 XYZ.COM LLC +game + +// games : 2015-05-28 Dog Beach, LLC +games + +// gap : 2015-07-31 The Gap, Inc. +gap + +// garden : 2014-06-26 Registry Services, LLC +garden + +// gay : 2019-05-23 Top Level Design, LLC +gay + +// gbiz : 2014-07-17 Charleston Road Registry Inc. +gbiz + +// gdn : 2014-07-31 Joint Stock Company "Navigation-information systems" +gdn + +// gea : 2014-12-04 GEA Group Aktiengesellschaft +gea + +// gent : 2014-01-23 COMBELL NV +gent + +// genting : 2015-03-12 Resorts World Inc Pte. Ltd. +genting + +// george : 2015-07-31 Wal-Mart Stores, Inc. +george + +// ggee : 2014-01-09 GMO Internet, Inc. +ggee + +// gift : 2013-10-17 DotGift, LLC +gift + +// gifts : 2014-07-03 Binky Moon, LLC +gifts + +// gives : 2014-03-06 Dog Beach, LLC +gives + +// giving : 2014-11-13 Giving Limited +giving + +// glass : 2013-11-07 Binky Moon, LLC +glass + +// gle : 2014-07-24 Charleston Road Registry Inc. +gle + +// global : 2014-04-17 Dot Global Domain Registry Limited +global + +// globo : 2013-12-19 Globo Comunicação e Participações S.A +globo + +// gmail : 2014-05-01 Charleston Road Registry Inc. +gmail + +// gmbh : 2016-01-29 Binky Moon, LLC +gmbh + +// gmo : 2014-01-09 GMO Internet, Inc. +gmo + +// gmx : 2014-04-24 1&1 Mail & Media GmbH +gmx + +// godaddy : 2015-07-23 Go Daddy East, LLC +godaddy + +// gold : 2015-01-22 Binky Moon, LLC +gold + +// goldpoint : 2014-11-20 YODOBASHI CAMERA CO.,LTD. +goldpoint + +// golf : 2014-12-18 Binky Moon, LLC +golf + +// goo : 2014-12-18 NTT Resonant Inc. +goo + +// goodyear : 2015-07-02 The Goodyear Tire & Rubber Company +goodyear + +// goog : 2014-11-20 Charleston Road Registry Inc. +goog + +// google : 2014-07-24 Charleston Road Registry Inc. +google + +// gop : 2014-01-16 Republican State Leadership Committee, Inc. +gop + +// got : 2014-12-18 Amazon Registry Services, Inc. +got + +// grainger : 2015-05-07 Grainger Registry Services, LLC +grainger + +// graphics : 2013-09-13 Binky Moon, LLC +graphics + +// gratis : 2014-03-20 Binky Moon, LLC +gratis + +// green : 2014-05-08 Afilias Limited +green + +// gripe : 2014-03-06 Binky Moon, LLC +gripe + +// grocery : 2016-06-16 Wal-Mart Stores, Inc. +grocery + +// group : 2014-08-15 Binky Moon, LLC +group + +// guardian : 2015-07-30 The Guardian Life Insurance Company of America +guardian + +// gucci : 2014-11-13 Guccio Gucci S.p.a. +gucci + +// guge : 2014-08-28 Charleston Road Registry Inc. +guge + +// guide : 2013-09-13 Binky Moon, LLC +guide + +// guitars : 2013-11-14 XYZ.COM LLC +guitars + +// guru : 2013-08-27 Binky Moon, LLC +guru + +// hair : 2015-12-03 XYZ.COM LLC +hair + +// hamburg : 2014-02-20 Hamburg Top-Level-Domain GmbH +hamburg + +// hangout : 2014-11-13 Charleston Road Registry Inc. +hangout + +// haus : 2013-12-05 Dog Beach, LLC +haus + +// hbo : 2015-07-30 HBO Registry Services, Inc. +hbo + +// hdfc : 2015-07-30 HOUSING DEVELOPMENT FINANCE CORPORATION LIMITED +hdfc + +// hdfcbank : 2015-02-12 HDFC Bank Limited +hdfcbank + +// health : 2015-02-11 DotHealth, LLC +health + +// healthcare : 2014-06-12 Binky Moon, LLC +healthcare + +// help : 2014-06-26 UNR Corp. +help + +// helsinki : 2015-02-05 City of Helsinki +helsinki + +// here : 2014-02-06 Charleston Road Registry Inc. +here + +// hermes : 2014-07-10 HERMES INTERNATIONAL +hermes + +// hgtv : 2015-07-02 Lifestyle Domain Holdings, Inc. +hgtv + +// hiphop : 2014-03-06 Dot Hip Hop, LLC +hiphop + +// hisamitsu : 2015-07-16 Hisamitsu Pharmaceutical Co.,Inc. +hisamitsu + +// hitachi : 2014-10-31 Hitachi, Ltd. +hitachi + +// hiv : 2014-03-13 UNR Corp. +hiv + +// hkt : 2015-05-14 PCCW-HKT DataCom Services Limited +hkt + +// hockey : 2015-03-19 Binky Moon, LLC +hockey + +// holdings : 2013-08-27 Binky Moon, LLC +holdings + +// holiday : 2013-11-07 Binky Moon, LLC +holiday + +// homedepot : 2015-04-02 Home Depot Product Authority, LLC +homedepot + +// homegoods : 2015-07-16 The TJX Companies, Inc. +homegoods + +// homes : 2014-01-09 XYZ.COM LLC +homes + +// homesense : 2015-07-16 The TJX Companies, Inc. +homesense + +// honda : 2014-12-18 Honda Motor Co., Ltd. +honda + +// horse : 2013-11-21 Registry Services, LLC +horse + +// hospital : 2016-10-20 Binky Moon, LLC +hospital + +// host : 2014-04-17 Radix FZC +host + +// hosting : 2014-05-29 XYZ.COM LLC +hosting + +// hot : 2015-08-27 Amazon Registry Services, Inc. +hot + +// hoteles : 2015-03-05 Travel Reservations SRL +hoteles + +// hotels : 2016-04-07 Booking.com B.V. +hotels + +// hotmail : 2014-12-18 Microsoft Corporation +hotmail + +// house : 2013-11-07 Binky Moon, LLC +house + +// how : 2014-01-23 Charleston Road Registry Inc. +how + +// hsbc : 2014-10-24 HSBC Global Services (UK) Limited +hsbc + +// hughes : 2015-07-30 Hughes Satellite Systems Corporation +hughes + +// hyatt : 2015-07-30 Hyatt GTLD, L.L.C. +hyatt + +// hyundai : 2015-07-09 Hyundai Motor Company +hyundai + +// ibm : 2014-07-31 International Business Machines Corporation +ibm + +// icbc : 2015-02-19 Industrial and Commercial Bank of China Limited +icbc + +// ice : 2014-10-30 IntercontinentalExchange, Inc. +ice + +// icu : 2015-01-08 ShortDot SA +icu + +// ieee : 2015-07-23 IEEE Global LLC +ieee + +// ifm : 2014-01-30 ifm electronic gmbh +ifm + +// ikano : 2015-07-09 Ikano S.A. +ikano + +// imamat : 2015-08-06 Fondation Aga Khan (Aga Khan Foundation) +imamat + +// imdb : 2015-06-25 Amazon Registry Services, Inc. +imdb + +// immo : 2014-07-10 Binky Moon, LLC +immo + +// immobilien : 2013-11-07 Dog Beach, LLC +immobilien + +// inc : 2018-03-10 Intercap Registry Inc. +inc + +// industries : 2013-12-05 Binky Moon, LLC +industries + +// infiniti : 2014-03-27 NISSAN MOTOR CO., LTD. +infiniti + +// ing : 2014-01-23 Charleston Road Registry Inc. +ing + +// ink : 2013-12-05 Top Level Design, LLC +ink + +// institute : 2013-11-07 Binky Moon, LLC +institute + +// insurance : 2015-02-19 fTLD Registry Services LLC +insurance + +// insure : 2014-03-20 Binky Moon, LLC +insure + +// international : 2013-11-07 Binky Moon, LLC +international + +// intuit : 2015-07-30 Intuit Administrative Services, Inc. +intuit + +// investments : 2014-03-20 Binky Moon, LLC +investments + +// ipiranga : 2014-08-28 Ipiranga Produtos de Petroleo S.A. +ipiranga + +// irish : 2014-08-07 Binky Moon, LLC +irish + +// ismaili : 2015-08-06 Fondation Aga Khan (Aga Khan Foundation) +ismaili + +// ist : 2014-08-28 Istanbul Metropolitan Municipality +ist + +// istanbul : 2014-08-28 Istanbul Metropolitan Municipality +istanbul + +// itau : 2014-10-02 Itau Unibanco Holding S.A. +itau + +// itv : 2015-07-09 ITV Services Limited +itv + +// jaguar : 2014-11-13 Jaguar Land Rover Ltd +jaguar + +// java : 2014-06-19 Oracle Corporation +java + +// jcb : 2014-11-20 JCB Co., Ltd. +jcb + +// jeep : 2015-07-30 FCA US LLC. +jeep + +// jetzt : 2014-01-09 Binky Moon, LLC +jetzt + +// jewelry : 2015-03-05 Binky Moon, LLC +jewelry + +// jio : 2015-04-02 Reliance Industries Limited +jio + +// jll : 2015-04-02 Jones Lang LaSalle Incorporated +jll + +// jmp : 2015-03-26 Matrix IP LLC +jmp + +// jnj : 2015-06-18 Johnson & Johnson Services, Inc. +jnj + +// joburg : 2014-03-24 ZA Central Registry NPC trading as ZA Central Registry +joburg + +// jot : 2014-12-18 Amazon Registry Services, Inc. +jot + +// joy : 2014-12-18 Amazon Registry Services, Inc. +joy + +// jpmorgan : 2015-04-30 JPMorgan Chase Bank, National Association +jpmorgan + +// jprs : 2014-09-18 Japan Registry Services Co., Ltd. +jprs + +// juegos : 2014-03-20 UNR Corp. +juegos + +// juniper : 2015-07-30 JUNIPER NETWORKS, INC. +juniper + +// kaufen : 2013-11-07 Dog Beach, LLC +kaufen + +// kddi : 2014-09-12 KDDI CORPORATION +kddi + +// kerryhotels : 2015-04-30 Kerry Trading Co. Limited +kerryhotels + +// kerrylogistics : 2015-04-09 Kerry Trading Co. Limited +kerrylogistics + +// kerryproperties : 2015-04-09 Kerry Trading Co. Limited +kerryproperties + +// kfh : 2014-12-04 Kuwait Finance House +kfh + +// kia : 2015-07-09 KIA MOTORS CORPORATION +kia + +// kids : 2021-08-13 DotKids Foundation Limited +kids + +// kim : 2013-09-23 Afilias Limited +kim + +// kinder : 2014-11-07 Ferrero Trading Lux S.A. +kinder + +// kindle : 2015-06-25 Amazon Registry Services, Inc. +kindle + +// kitchen : 2013-09-20 Binky Moon, LLC +kitchen + +// kiwi : 2013-09-20 DOT KIWI LIMITED +kiwi + +// koeln : 2014-01-09 dotKoeln GmbH +koeln + +// komatsu : 2015-01-08 Komatsu Ltd. +komatsu + +// kosher : 2015-08-20 Kosher Marketing Assets LLC +kosher + +// kpmg : 2015-04-23 KPMG International Cooperative (KPMG International Genossenschaft) +kpmg + +// kpn : 2015-01-08 Koninklijke KPN N.V. +kpn + +// krd : 2013-12-05 KRG Department of Information Technology +krd + +// kred : 2013-12-19 KredTLD Pty Ltd +kred + +// kuokgroup : 2015-04-09 Kerry Trading Co. Limited +kuokgroup + +// kyoto : 2014-11-07 Academic Institution: Kyoto Jyoho Gakuen +kyoto + +// lacaixa : 2014-01-09 Fundación Bancaria Caixa d’Estalvis i Pensions de Barcelona, “la Caixa” +lacaixa + +// lamborghini : 2015-06-04 Automobili Lamborghini S.p.A. +lamborghini + +// lamer : 2015-10-01 The Estée Lauder Companies Inc. +lamer + +// lancaster : 2015-02-12 LANCASTER +lancaster + +// lancia : 2015-07-31 Fiat Chrysler Automobiles N.V. +lancia + +// land : 2013-09-10 Binky Moon, LLC +land + +// landrover : 2014-11-13 Jaguar Land Rover Ltd +landrover + +// lanxess : 2015-07-30 LANXESS Corporation +lanxess + +// lasalle : 2015-04-02 Jones Lang LaSalle Incorporated +lasalle + +// lat : 2014-10-16 ECOM-LAC Federaciòn de Latinoamèrica y el Caribe para Internet y el Comercio Electrònico +lat + +// latino : 2015-07-30 Dish DBS Corporation +latino + +// latrobe : 2014-06-16 La Trobe University +latrobe + +// law : 2015-01-22 Registry Services, LLC +law + +// lawyer : 2014-03-20 Dog Beach, LLC +lawyer + +// lds : 2014-03-20 IRI Domain Management, LLC +lds + +// lease : 2014-03-06 Binky Moon, LLC +lease + +// leclerc : 2014-08-07 A.C.D. LEC Association des Centres Distributeurs Edouard Leclerc +leclerc + +// lefrak : 2015-07-16 LeFrak Organization, Inc. +lefrak + +// legal : 2014-10-16 Binky Moon, LLC +legal + +// lego : 2015-07-16 LEGO Juris A/S +lego + +// lexus : 2015-04-23 TOYOTA MOTOR CORPORATION +lexus + +// lgbt : 2014-05-08 Afilias Limited +lgbt + +// lidl : 2014-09-18 Schwarz Domains und Services GmbH & Co. KG +lidl + +// life : 2014-02-06 Binky Moon, LLC +life + +// lifeinsurance : 2015-01-15 American Council of Life Insurers +lifeinsurance + +// lifestyle : 2014-12-11 Lifestyle Domain Holdings, Inc. +lifestyle + +// lighting : 2013-08-27 Binky Moon, LLC +lighting + +// like : 2014-12-18 Amazon Registry Services, Inc. +like + +// lilly : 2015-07-31 Eli Lilly and Company +lilly + +// limited : 2014-03-06 Binky Moon, LLC +limited + +// limo : 2013-10-17 Binky Moon, LLC +limo + +// lincoln : 2014-11-13 Ford Motor Company +lincoln + +// linde : 2014-12-04 Linde Aktiengesellschaft +linde + +// link : 2013-11-14 UNR Corp. +link + +// lipsy : 2015-06-25 Lipsy Ltd +lipsy + +// live : 2014-12-04 Dog Beach, LLC +live + +// living : 2015-07-30 Lifestyle Domain Holdings, Inc. +living + +// llc : 2017-12-14 Afilias Limited +llc + +// llp : 2019-08-26 UNR Corp. +llp + +// loan : 2014-11-20 dot Loan Limited +loan + +// loans : 2014-03-20 Binky Moon, LLC +loans + +// locker : 2015-06-04 Dish DBS Corporation +locker + +// locus : 2015-06-25 Locus Analytics LLC +locus + +// loft : 2015-07-30 Annco, Inc. +loft + +// lol : 2015-01-30 XYZ.COM LLC +lol + +// london : 2013-11-14 Dot London Domains Limited +london + +// lotte : 2014-11-07 Lotte Holdings Co., Ltd. +lotte + +// lotto : 2014-04-10 Afilias Limited +lotto + +// love : 2014-12-22 Merchant Law Group LLP +love + +// lpl : 2015-07-30 LPL Holdings, Inc. +lpl + +// lplfinancial : 2015-07-30 LPL Holdings, Inc. +lplfinancial + +// ltd : 2014-09-25 Binky Moon, LLC +ltd + +// ltda : 2014-04-17 InterNetX, Corp +ltda + +// lundbeck : 2015-08-06 H. Lundbeck A/S +lundbeck + +// luxe : 2014-01-09 Registry Services, LLC +luxe + +// luxury : 2013-10-17 Luxury Partners, LLC +luxury + +// macys : 2015-07-31 Macys, Inc. +macys + +// madrid : 2014-05-01 Comunidad de Madrid +madrid + +// maif : 2014-10-02 Mutuelle Assurance Instituteur France (MAIF) +maif + +// maison : 2013-12-05 Binky Moon, LLC +maison + +// makeup : 2015-01-15 XYZ.COM LLC +makeup + +// man : 2014-12-04 MAN SE +man + +// management : 2013-11-07 Binky Moon, LLC +management + +// mango : 2013-10-24 PUNTO FA S.L. +mango + +// map : 2016-06-09 Charleston Road Registry Inc. +map + +// market : 2014-03-06 Dog Beach, LLC +market + +// marketing : 2013-11-07 Binky Moon, LLC +marketing + +// markets : 2014-12-11 Dog Beach, LLC +markets + +// marriott : 2014-10-09 Marriott Worldwide Corporation +marriott + +// marshalls : 2015-07-16 The TJX Companies, Inc. +marshalls + +// maserati : 2015-07-31 Fiat Chrysler Automobiles N.V. +maserati + +// mattel : 2015-08-06 Mattel Sites, Inc. +mattel + +// mba : 2015-04-02 Binky Moon, LLC +mba + +// mckinsey : 2015-07-31 McKinsey Holdings, Inc. +mckinsey + +// med : 2015-08-06 Medistry LLC +med + +// media : 2014-03-06 Binky Moon, LLC +media + +// meet : 2014-01-16 Charleston Road Registry Inc. +meet + +// melbourne : 2014-05-29 The Crown in right of the State of Victoria, represented by its Department of State Development, Business and Innovation +melbourne + +// meme : 2014-01-30 Charleston Road Registry Inc. +meme + +// memorial : 2014-10-16 Dog Beach, LLC +memorial + +// men : 2015-02-26 Exclusive Registry Limited +men + +// menu : 2013-09-11 Dot Menu Registry, LLC +menu + +// merckmsd : 2016-07-14 MSD Registry Holdings, Inc. +merckmsd + +// miami : 2013-12-19 Registry Services, LLC +miami + +// microsoft : 2014-12-18 Microsoft Corporation +microsoft + +// mini : 2014-01-09 Bayerische Motoren Werke Aktiengesellschaft +mini + +// mint : 2015-07-30 Intuit Administrative Services, Inc. +mint + +// mit : 2015-07-02 Massachusetts Institute of Technology +mit + +// mitsubishi : 2015-07-23 Mitsubishi Corporation +mitsubishi + +// mlb : 2015-05-21 MLB Advanced Media DH, LLC +mlb + +// mls : 2015-04-23 The Canadian Real Estate Association +mls + +// mma : 2014-11-07 MMA IARD +mma + +// mobile : 2016-06-02 Dish DBS Corporation +mobile + +// moda : 2013-11-07 Dog Beach, LLC +moda + +// moe : 2013-11-13 Interlink Co., Ltd. +moe + +// moi : 2014-12-18 Amazon Registry Services, Inc. +moi + +// mom : 2015-04-16 XYZ.COM LLC +mom + +// monash : 2013-09-30 Monash University +monash + +// money : 2014-10-16 Binky Moon, LLC +money + +// monster : 2015-09-11 XYZ.COM LLC +monster + +// mormon : 2013-12-05 IRI Domain Management, LLC +mormon + +// mortgage : 2014-03-20 Dog Beach, LLC +mortgage + +// moscow : 2013-12-19 Foundation for Assistance for Internet Technologies and Infrastructure Development (FAITID) +moscow + +// moto : 2015-06-04 Motorola Trademark Holdings, LLC +moto + +// motorcycles : 2014-01-09 XYZ.COM LLC +motorcycles + +// mov : 2014-01-30 Charleston Road Registry Inc. +mov + +// movie : 2015-02-05 Binky Moon, LLC +movie + +// msd : 2015-07-23 MSD Registry Holdings, Inc. +msd + +// mtn : 2014-12-04 MTN Dubai Limited +mtn + +// mtr : 2015-03-12 MTR Corporation Limited +mtr + +// music : 2021-05-04 DotMusic Limited +music + +// mutual : 2015-04-02 Northwestern Mutual MU TLD Registry, LLC +mutual + +// nab : 2015-08-20 National Australia Bank Limited +nab + +// nagoya : 2013-10-24 GMO Registry, Inc. +nagoya + +// natura : 2015-03-12 NATURA COSMÉTICOS S.A. +natura + +// navy : 2014-03-06 Dog Beach, LLC +navy + +// nba : 2015-07-31 NBA REGISTRY, LLC +nba + +// nec : 2015-01-08 NEC Corporation +nec + +// netbank : 2014-06-26 COMMONWEALTH BANK OF AUSTRALIA +netbank + +// netflix : 2015-06-18 Netflix, Inc. +netflix + +// network : 2013-11-14 Binky Moon, LLC +network + +// neustar : 2013-12-05 NeuStar, Inc. +neustar + +// new : 2014-01-30 Charleston Road Registry Inc. +new + +// news : 2014-12-18 Dog Beach, LLC +news + +// next : 2015-06-18 Next plc +next + +// nextdirect : 2015-06-18 Next plc +nextdirect + +// nexus : 2014-07-24 Charleston Road Registry Inc. +nexus + +// nfl : 2015-07-23 NFL Reg Ops LLC +nfl + +// ngo : 2014-03-06 Public Interest Registry +ngo + +// nhk : 2014-02-13 Japan Broadcasting Corporation (NHK) +nhk + +// nico : 2014-12-04 DWANGO Co., Ltd. +nico + +// nike : 2015-07-23 NIKE, Inc. +nike + +// nikon : 2015-05-21 NIKON CORPORATION +nikon + +// ninja : 2013-11-07 Dog Beach, LLC +ninja + +// nissan : 2014-03-27 NISSAN MOTOR CO., LTD. +nissan + +// nissay : 2015-10-29 Nippon Life Insurance Company +nissay + +// nokia : 2015-01-08 Nokia Corporation +nokia + +// northwesternmutual : 2015-06-18 Northwestern Mutual Registry, LLC +northwesternmutual + +// norton : 2014-12-04 NortonLifeLock Inc. +norton + +// now : 2015-06-25 Amazon Registry Services, Inc. +now + +// nowruz : 2014-09-04 Asia Green IT System Bilgisayar San. ve Tic. Ltd. Sti. +nowruz + +// nowtv : 2015-05-14 Starbucks (HK) Limited +nowtv + +// nra : 2014-05-22 NRA Holdings Company, INC. +nra + +// nrw : 2013-11-21 Minds + Machines GmbH +nrw + +// ntt : 2014-10-31 NIPPON TELEGRAPH AND TELEPHONE CORPORATION +ntt + +// nyc : 2014-01-23 The City of New York by and through the New York City Department of Information Technology & Telecommunications +nyc + +// obi : 2014-09-25 OBI Group Holding SE & Co. KGaA +obi + +// observer : 2015-04-30 Dog Beach, LLC +observer + +// office : 2015-03-12 Microsoft Corporation +office + +// okinawa : 2013-12-05 BRregistry, Inc. +okinawa + +// olayan : 2015-05-14 Crescent Holding GmbH +olayan + +// olayangroup : 2015-05-14 Crescent Holding GmbH +olayangroup + +// oldnavy : 2015-07-31 The Gap, Inc. +oldnavy + +// ollo : 2015-06-04 Dish DBS Corporation +ollo + +// omega : 2015-01-08 The Swatch Group Ltd +omega + +// one : 2014-11-07 One.com A/S +one + +// ong : 2014-03-06 Public Interest Registry +ong + +// onl : 2013-09-16 iRegistry GmbH +onl + +// online : 2015-01-15 Radix FZC +online + +// ooo : 2014-01-09 INFIBEAM AVENUES LIMITED +ooo + +// open : 2015-07-31 American Express Travel Related Services Company, Inc. +open + +// oracle : 2014-06-19 Oracle Corporation +oracle + +// orange : 2015-03-12 Orange Brand Services Limited +orange + +// organic : 2014-03-27 Afilias Limited +organic + +// origins : 2015-10-01 The Estée Lauder Companies Inc. +origins + +// osaka : 2014-09-04 Osaka Registry Co., Ltd. +osaka + +// otsuka : 2013-10-11 Otsuka Holdings Co., Ltd. +otsuka + +// ott : 2015-06-04 Dish DBS Corporation +ott + +// ovh : 2014-01-16 MédiaBC +ovh + +// page : 2014-12-04 Charleston Road Registry Inc. +page + +// panasonic : 2015-07-30 Panasonic Corporation +panasonic + +// paris : 2014-01-30 City of Paris +paris + +// pars : 2014-09-04 Asia Green IT System Bilgisayar San. ve Tic. Ltd. Sti. +pars + +// partners : 2013-12-05 Binky Moon, LLC +partners + +// parts : 2013-12-05 Binky Moon, LLC +parts + +// party : 2014-09-11 Blue Sky Registry Limited +party + +// passagens : 2015-03-05 Travel Reservations SRL +passagens + +// pay : 2015-08-27 Amazon Registry Services, Inc. +pay + +// pccw : 2015-05-14 PCCW Enterprises Limited +pccw + +// pet : 2015-05-07 Afilias Limited +pet + +// pfizer : 2015-09-11 Pfizer Inc. +pfizer + +// pharmacy : 2014-06-19 National Association of Boards of Pharmacy +pharmacy + +// phd : 2016-07-28 Charleston Road Registry Inc. +phd + +// philips : 2014-11-07 Koninklijke Philips N.V. +philips + +// phone : 2016-06-02 Dish DBS Corporation +phone + +// photo : 2013-11-14 UNR Corp. +photo + +// photography : 2013-09-20 Binky Moon, LLC +photography + +// photos : 2013-10-17 Binky Moon, LLC +photos + +// physio : 2014-05-01 PhysBiz Pty Ltd +physio + +// pics : 2013-11-14 XYZ.COM LLC +pics + +// pictet : 2014-06-26 Pictet Europe S.A. +pictet + +// pictures : 2014-03-06 Binky Moon, LLC +pictures + +// pid : 2015-01-08 Top Level Spectrum, Inc. +pid + +// pin : 2014-12-18 Amazon Registry Services, Inc. +pin + +// ping : 2015-06-11 Ping Registry Provider, Inc. +ping + +// pink : 2013-10-01 Afilias Limited +pink + +// pioneer : 2015-07-16 Pioneer Corporation +pioneer + +// pizza : 2014-06-26 Binky Moon, LLC +pizza + +// place : 2014-04-24 Binky Moon, LLC +place + +// play : 2015-03-05 Charleston Road Registry Inc. +play + +// playstation : 2015-07-02 Sony Interactive Entertainment Inc. +playstation + +// plumbing : 2013-09-10 Binky Moon, LLC +plumbing + +// plus : 2015-02-05 Binky Moon, LLC +plus + +// pnc : 2015-07-02 PNC Domain Co., LLC +pnc + +// pohl : 2014-06-23 Deutsche Vermögensberatung Aktiengesellschaft DVAG +pohl + +// poker : 2014-07-03 Afilias Limited +poker + +// politie : 2015-08-20 Politie Nederland +politie + +// porn : 2014-10-16 ICM Registry PN LLC +porn + +// pramerica : 2015-07-30 Prudential Financial, Inc. +pramerica + +// praxi : 2013-12-05 Praxi S.p.A. +praxi + +// press : 2014-04-03 Radix FZC +press + +// prime : 2015-06-25 Amazon Registry Services, Inc. +prime + +// prod : 2014-01-23 Charleston Road Registry Inc. +prod + +// productions : 2013-12-05 Binky Moon, LLC +productions + +// prof : 2014-07-24 Charleston Road Registry Inc. +prof + +// progressive : 2015-07-23 Progressive Casualty Insurance Company +progressive + +// promo : 2014-12-18 Afilias Limited +promo + +// properties : 2013-12-05 Binky Moon, LLC +properties + +// property : 2014-05-22 UNR Corp. +property + +// protection : 2015-04-23 XYZ.COM LLC +protection + +// pru : 2015-07-30 Prudential Financial, Inc. +pru + +// prudential : 2015-07-30 Prudential Financial, Inc. +prudential + +// pub : 2013-12-12 Dog Beach, LLC +pub + +// pwc : 2015-10-29 PricewaterhouseCoopers LLP +pwc + +// qpon : 2013-11-14 dotCOOL, Inc. +qpon + +// quebec : 2013-12-19 PointQuébec Inc +quebec + +// quest : 2015-03-26 XYZ.COM LLC +quest + +// racing : 2014-12-04 Premier Registry Limited +racing + +// radio : 2016-07-21 European Broadcasting Union (EBU) +radio + +// read : 2014-12-18 Amazon Registry Services, Inc. +read + +// realestate : 2015-09-11 dotRealEstate LLC +realestate + +// realtor : 2014-05-29 Real Estate Domains LLC +realtor + +// realty : 2015-03-19 Dog Beach, LLC +realty + +// recipes : 2013-10-17 Binky Moon, LLC +recipes + +// red : 2013-11-07 Afilias Limited +red + +// redstone : 2014-10-31 Redstone Haute Couture Co., Ltd. +redstone + +// redumbrella : 2015-03-26 Travelers TLD, LLC +redumbrella + +// rehab : 2014-03-06 Dog Beach, LLC +rehab + +// reise : 2014-03-13 Binky Moon, LLC +reise + +// reisen : 2014-03-06 Binky Moon, LLC +reisen + +// reit : 2014-09-04 National Association of Real Estate Investment Trusts, Inc. +reit + +// reliance : 2015-04-02 Reliance Industries Limited +reliance + +// ren : 2013-12-12 ZDNS International Limited +ren + +// rent : 2014-12-04 XYZ.COM LLC +rent + +// rentals : 2013-12-05 Binky Moon, LLC +rentals + +// repair : 2013-11-07 Binky Moon, LLC +repair + +// report : 2013-12-05 Binky Moon, LLC +report + +// republican : 2014-03-20 Dog Beach, LLC +republican + +// rest : 2013-12-19 Punto 2012 Sociedad Anonima Promotora de Inversion de Capital Variable +rest + +// restaurant : 2014-07-03 Binky Moon, LLC +restaurant + +// review : 2014-11-20 dot Review Limited +review + +// reviews : 2013-09-13 Dog Beach, LLC +reviews + +// rexroth : 2015-06-18 Robert Bosch GMBH +rexroth + +// rich : 2013-11-21 iRegistry GmbH +rich + +// richardli : 2015-05-14 Pacific Century Asset Management (HK) Limited +richardli + +// ricoh : 2014-11-20 Ricoh Company, Ltd. +ricoh + +// ril : 2015-04-02 Reliance Industries Limited +ril + +// rio : 2014-02-27 Empresa Municipal de Informática SA - IPLANRIO +rio + +// rip : 2014-07-10 Dog Beach, LLC +rip + +// rocher : 2014-12-18 Ferrero Trading Lux S.A. +rocher + +// rocks : 2013-11-14 Dog Beach, LLC +rocks + +// rodeo : 2013-12-19 Registry Services, LLC +rodeo + +// rogers : 2015-08-06 Rogers Communications Canada Inc. +rogers + +// room : 2014-12-18 Amazon Registry Services, Inc. +room + +// rsvp : 2014-05-08 Charleston Road Registry Inc. +rsvp + +// rugby : 2016-12-15 World Rugby Strategic Developments Limited +rugby + +// ruhr : 2013-10-02 regiodot GmbH & Co. KG +ruhr + +// run : 2015-03-19 Binky Moon, LLC +run + +// rwe : 2015-04-02 RWE AG +rwe + +// ryukyu : 2014-01-09 BRregistry, Inc. +ryukyu + +// saarland : 2013-12-12 dotSaarland GmbH +saarland + +// safe : 2014-12-18 Amazon Registry Services, Inc. +safe + +// safety : 2015-01-08 Safety Registry Services, LLC. +safety + +// sakura : 2014-12-18 SAKURA Internet Inc. +sakura + +// sale : 2014-10-16 Dog Beach, LLC +sale + +// salon : 2014-12-11 Binky Moon, LLC +salon + +// samsclub : 2015-07-31 Wal-Mart Stores, Inc. +samsclub + +// samsung : 2014-04-03 SAMSUNG SDS CO., LTD +samsung + +// sandvik : 2014-11-13 Sandvik AB +sandvik + +// sandvikcoromant : 2014-11-07 Sandvik AB +sandvikcoromant + +// sanofi : 2014-10-09 Sanofi +sanofi + +// sap : 2014-03-27 SAP AG +sap + +// sarl : 2014-07-03 Binky Moon, LLC +sarl + +// sas : 2015-04-02 Research IP LLC +sas + +// save : 2015-06-25 Amazon Registry Services, Inc. +save + +// saxo : 2014-10-31 Saxo Bank A/S +saxo + +// sbi : 2015-03-12 STATE BANK OF INDIA +sbi + +// sbs : 2014-11-07 ShortDot SA +sbs + +// sca : 2014-03-13 SVENSKA CELLULOSA AKTIEBOLAGET SCA (publ) +sca + +// scb : 2014-02-20 The Siam Commercial Bank Public Company Limited ("SCB") +scb + +// schaeffler : 2015-08-06 Schaeffler Technologies AG & Co. KG +schaeffler + +// schmidt : 2014-04-03 SCHMIDT GROUPE S.A.S. +schmidt + +// scholarships : 2014-04-24 Scholarships.com, LLC +scholarships + +// school : 2014-12-18 Binky Moon, LLC +school + +// schule : 2014-03-06 Binky Moon, LLC +schule + +// schwarz : 2014-09-18 Schwarz Domains und Services GmbH & Co. KG +schwarz + +// science : 2014-09-11 dot Science Limited +science + +// scot : 2014-01-23 Dot Scot Registry Limited +scot + +// search : 2016-06-09 Charleston Road Registry Inc. +search + +// seat : 2014-05-22 SEAT, S.A. (Sociedad Unipersonal) +seat + +// secure : 2015-08-27 Amazon Registry Services, Inc. +secure + +// security : 2015-05-14 XYZ.COM LLC +security + +// seek : 2014-12-04 Seek Limited +seek + +// select : 2015-10-08 Registry Services, LLC +select + +// sener : 2014-10-24 Sener Ingeniería y Sistemas, S.A. +sener + +// services : 2014-02-27 Binky Moon, LLC +services + +// ses : 2015-07-23 SES +ses + +// seven : 2015-08-06 Seven West Media Ltd +seven + +// sew : 2014-07-17 SEW-EURODRIVE GmbH & Co KG +sew + +// sex : 2014-11-13 ICM Registry SX LLC +sex + +// sexy : 2013-09-11 UNR Corp. +sexy + +// sfr : 2015-08-13 Societe Francaise du Radiotelephone - SFR +sfr + +// shangrila : 2015-09-03 Shangri‐La International Hotel Management Limited +shangrila + +// sharp : 2014-05-01 Sharp Corporation +sharp + +// shaw : 2015-04-23 Shaw Cablesystems G.P. +shaw + +// shell : 2015-07-30 Shell Information Technology International Inc +shell + +// shia : 2014-09-04 Asia Green IT System Bilgisayar San. ve Tic. Ltd. Sti. +shia + +// shiksha : 2013-11-14 Afilias Limited +shiksha + +// shoes : 2013-10-02 Binky Moon, LLC +shoes + +// shop : 2016-04-08 GMO Registry, Inc. +shop + +// shopping : 2016-03-31 Binky Moon, LLC +shopping + +// shouji : 2015-01-08 Beijing Qihu Keji Co., Ltd. +shouji + +// show : 2015-03-05 Binky Moon, LLC +show + +// showtime : 2015-08-06 CBS Domains Inc. +showtime + +// silk : 2015-06-25 Amazon Registry Services, Inc. +silk + +// sina : 2015-03-12 Sina Corporation +sina + +// singles : 2013-08-27 Binky Moon, LLC +singles + +// site : 2015-01-15 Radix FZC +site + +// ski : 2015-04-09 Afilias Limited +ski + +// skin : 2015-01-15 XYZ.COM LLC +skin + +// sky : 2014-06-19 Sky International AG +sky + +// skype : 2014-12-18 Microsoft Corporation +skype + +// sling : 2015-07-30 DISH Technologies L.L.C. +sling + +// smart : 2015-07-09 Smart Communications, Inc. (SMART) +smart + +// smile : 2014-12-18 Amazon Registry Services, Inc. +smile + +// sncf : 2015-02-19 Société Nationale des Chemins de fer Francais S N C F +sncf + +// soccer : 2015-03-26 Binky Moon, LLC +soccer + +// social : 2013-11-07 Dog Beach, LLC +social + +// softbank : 2015-07-02 SoftBank Group Corp. +softbank + +// software : 2014-03-20 Dog Beach, LLC +software + +// sohu : 2013-12-19 Sohu.com Limited +sohu + +// solar : 2013-11-07 Binky Moon, LLC +solar + +// solutions : 2013-11-07 Binky Moon, LLC +solutions + +// song : 2015-02-26 Amazon Registry Services, Inc. +song + +// sony : 2015-01-08 Sony Corporation +sony + +// soy : 2014-01-23 Charleston Road Registry Inc. +soy + +// spa : 2019-09-19 Asia Spa and Wellness Promotion Council Limited +spa + +// space : 2014-04-03 Radix FZC +space + +// sport : 2017-11-16 Global Association of International Sports Federations (GAISF) +sport + +// spot : 2015-02-26 Amazon Registry Services, Inc. +spot + +// srl : 2015-05-07 InterNetX, Corp +srl + +// stada : 2014-11-13 STADA Arzneimittel AG +stada + +// staples : 2015-07-30 Staples, Inc. +staples + +// star : 2015-01-08 Star India Private Limited +star + +// statebank : 2015-03-12 STATE BANK OF INDIA +statebank + +// statefarm : 2015-07-30 State Farm Mutual Automobile Insurance Company +statefarm + +// stc : 2014-10-09 Saudi Telecom Company +stc + +// stcgroup : 2014-10-09 Saudi Telecom Company +stcgroup + +// stockholm : 2014-12-18 Stockholms kommun +stockholm + +// storage : 2014-12-22 XYZ.COM LLC +storage + +// store : 2015-04-09 Radix FZC +store + +// stream : 2016-01-08 dot Stream Limited +stream + +// studio : 2015-02-11 Dog Beach, LLC +studio + +// study : 2014-12-11 OPEN UNIVERSITIES AUSTRALIA PTY LTD +study + +// style : 2014-12-04 Binky Moon, LLC +style + +// sucks : 2014-12-22 Vox Populi Registry Ltd. +sucks + +// supplies : 2013-12-19 Binky Moon, LLC +supplies + +// supply : 2013-12-19 Binky Moon, LLC +supply + +// support : 2013-10-24 Binky Moon, LLC +support + +// surf : 2014-01-09 Registry Services, LLC +surf + +// surgery : 2014-03-20 Binky Moon, LLC +surgery + +// suzuki : 2014-02-20 SUZUKI MOTOR CORPORATION +suzuki + +// swatch : 2015-01-08 The Swatch Group Ltd +swatch + +// swiss : 2014-10-16 Swiss Confederation +swiss + +// sydney : 2014-09-18 State of New South Wales, Department of Premier and Cabinet +sydney + +// systems : 2013-11-07 Binky Moon, LLC +systems + +// tab : 2014-12-04 Tabcorp Holdings Limited +tab + +// taipei : 2014-07-10 Taipei City Government +taipei + +// talk : 2015-04-09 Amazon Registry Services, Inc. +talk + +// taobao : 2015-01-15 Alibaba Group Holding Limited +taobao + +// target : 2015-07-31 Target Domain Holdings, LLC +target + +// tatamotors : 2015-03-12 Tata Motors Ltd +tatamotors + +// tatar : 2014-04-24 Limited Liability Company "Coordination Center of Regional Domain of Tatarstan Republic" +tatar + +// tattoo : 2013-08-30 UNR Corp. +tattoo + +// tax : 2014-03-20 Binky Moon, LLC +tax + +// taxi : 2015-03-19 Binky Moon, LLC +taxi + +// tci : 2014-09-12 Asia Green IT System Bilgisayar San. ve Tic. Ltd. Sti. +tci + +// tdk : 2015-06-11 TDK Corporation +tdk + +// team : 2015-03-05 Binky Moon, LLC +team + +// tech : 2015-01-30 Radix FZC +tech + +// technology : 2013-09-13 Binky Moon, LLC +technology + +// temasek : 2014-08-07 Temasek Holdings (Private) Limited +temasek + +// tennis : 2014-12-04 Binky Moon, LLC +tennis + +// teva : 2015-07-02 Teva Pharmaceutical Industries Limited +teva + +// thd : 2015-04-02 Home Depot Product Authority, LLC +thd + +// theater : 2015-03-19 Binky Moon, LLC +theater + +// theatre : 2015-05-07 XYZ.COM LLC +theatre + +// tiaa : 2015-07-23 Teachers Insurance and Annuity Association of America +tiaa + +// tickets : 2015-02-05 XYZ.COM LLC +tickets + +// tienda : 2013-11-14 Binky Moon, LLC +tienda + +// tiffany : 2015-01-30 Tiffany and Company +tiffany + +// tips : 2013-09-20 Binky Moon, LLC +tips + +// tires : 2014-11-07 Binky Moon, LLC +tires + +// tirol : 2014-04-24 punkt Tirol GmbH +tirol + +// tjmaxx : 2015-07-16 The TJX Companies, Inc. +tjmaxx + +// tjx : 2015-07-16 The TJX Companies, Inc. +tjx + +// tkmaxx : 2015-07-16 The TJX Companies, Inc. +tkmaxx + +// tmall : 2015-01-15 Alibaba Group Holding Limited +tmall + +// today : 2013-09-20 Binky Moon, LLC +today + +// tokyo : 2013-11-13 GMO Registry, Inc. +tokyo + +// tools : 2013-11-21 Binky Moon, LLC +tools + +// top : 2014-03-20 .TOP Registry +top + +// toray : 2014-12-18 Toray Industries, Inc. +toray + +// toshiba : 2014-04-10 TOSHIBA Corporation +toshiba + +// total : 2015-08-06 TOTAL SE +total + +// tours : 2015-01-22 Binky Moon, LLC +tours + +// town : 2014-03-06 Binky Moon, LLC +town + +// toyota : 2015-04-23 TOYOTA MOTOR CORPORATION +toyota + +// toys : 2014-03-06 Binky Moon, LLC +toys + +// trade : 2014-01-23 Elite Registry Limited +trade + +// trading : 2014-12-11 Dog Beach, LLC +trading + +// training : 2013-11-07 Binky Moon, LLC +training + +// travel : 2015-10-09 Dog Beach, LLC +travel + +// travelchannel : 2015-07-02 Lifestyle Domain Holdings, Inc. +travelchannel + +// travelers : 2015-03-26 Travelers TLD, LLC +travelers + +// travelersinsurance : 2015-03-26 Travelers TLD, LLC +travelersinsurance + +// trust : 2014-10-16 UNR Corp. +trust + +// trv : 2015-03-26 Travelers TLD, LLC +trv + +// tube : 2015-06-11 Latin American Telecom LLC +tube + +// tui : 2014-07-03 TUI AG +tui + +// tunes : 2015-02-26 Amazon Registry Services, Inc. +tunes + +// tushu : 2014-12-18 Amazon Registry Services, Inc. +tushu + +// tvs : 2015-02-19 T V SUNDRAM IYENGAR & SONS LIMITED +tvs + +// ubank : 2015-08-20 National Australia Bank Limited +ubank + +// ubs : 2014-12-11 UBS AG +ubs + +// unicom : 2015-10-15 China United Network Communications Corporation Limited +unicom + +// university : 2014-03-06 Binky Moon, LLC +university + +// uno : 2013-09-11 Radix FZC +uno + +// uol : 2014-05-01 UBN INTERNET LTDA. +uol + +// ups : 2015-06-25 UPS Market Driver, Inc. +ups + +// vacations : 2013-12-05 Binky Moon, LLC +vacations + +// vana : 2014-12-11 Lifestyle Domain Holdings, Inc. +vana + +// vanguard : 2015-09-03 The Vanguard Group, Inc. +vanguard + +// vegas : 2014-01-16 Dot Vegas, Inc. +vegas + +// ventures : 2013-08-27 Binky Moon, LLC +ventures + +// verisign : 2015-08-13 VeriSign, Inc. +verisign + +// versicherung : 2014-03-20 tldbox GmbH +versicherung + +// vet : 2014-03-06 Dog Beach, LLC +vet + +// viajes : 2013-10-17 Binky Moon, LLC +viajes + +// video : 2014-10-16 Dog Beach, LLC +video + +// vig : 2015-05-14 VIENNA INSURANCE GROUP AG Wiener Versicherung Gruppe +vig + +// viking : 2015-04-02 Viking River Cruises (Bermuda) Ltd. +viking + +// villas : 2013-12-05 Binky Moon, LLC +villas + +// vin : 2015-06-18 Binky Moon, LLC +vin + +// vip : 2015-01-22 Registry Services, LLC +vip + +// virgin : 2014-09-25 Virgin Enterprises Limited +virgin + +// visa : 2015-07-30 Visa Worldwide Pte. Limited +visa + +// vision : 2013-12-05 Binky Moon, LLC +vision + +// viva : 2014-11-07 Saudi Telecom Company +viva + +// vivo : 2015-07-31 Telefonica Brasil S.A. +vivo + +// vlaanderen : 2014-02-06 DNS.be vzw +vlaanderen + +// vodka : 2013-12-19 Registry Services, LLC +vodka + +// volkswagen : 2015-05-14 Volkswagen Group of America Inc. +volkswagen + +// volvo : 2015-11-12 Volvo Holding Sverige Aktiebolag +volvo + +// vote : 2013-11-21 Monolith Registry LLC +vote + +// voting : 2013-11-13 Valuetainment Corp. +voting + +// voto : 2013-11-21 Monolith Registry LLC +voto + +// voyage : 2013-08-27 Binky Moon, LLC +voyage + +// vuelos : 2015-03-05 Travel Reservations SRL +vuelos + +// wales : 2014-05-08 Nominet UK +wales + +// walmart : 2015-07-31 Wal-Mart Stores, Inc. +walmart + +// walter : 2014-11-13 Sandvik AB +walter + +// wang : 2013-10-24 Zodiac Wang Limited +wang + +// wanggou : 2014-12-18 Amazon Registry Services, Inc. +wanggou + +// watch : 2013-11-14 Binky Moon, LLC +watch + +// watches : 2014-12-22 Afilias Limited +watches + +// weather : 2015-01-08 International Business Machines Corporation +weather + +// weatherchannel : 2015-03-12 International Business Machines Corporation +weatherchannel + +// webcam : 2014-01-23 dot Webcam Limited +webcam + +// weber : 2015-06-04 Saint-Gobain Weber SA +weber + +// website : 2014-04-03 Radix FZC +website + +// wedding : 2014-04-24 Registry Services, LLC +wedding + +// weibo : 2015-03-05 Sina Corporation +weibo + +// weir : 2015-01-29 Weir Group IP Limited +weir + +// whoswho : 2014-02-20 Who's Who Registry +whoswho + +// wien : 2013-10-28 punkt.wien GmbH +wien + +// wiki : 2013-11-07 Top Level Design, LLC +wiki + +// williamhill : 2014-03-13 William Hill Organization Limited +williamhill + +// win : 2014-11-20 First Registry Limited +win + +// windows : 2014-12-18 Microsoft Corporation +windows + +// wine : 2015-06-18 Binky Moon, LLC +wine + +// winners : 2015-07-16 The TJX Companies, Inc. +winners + +// wme : 2014-02-13 William Morris Endeavor Entertainment, LLC +wme + +// wolterskluwer : 2015-08-06 Wolters Kluwer N.V. +wolterskluwer + +// woodside : 2015-07-09 Woodside Petroleum Limited +woodside + +// work : 2013-12-19 Registry Services, LLC +work + +// works : 2013-11-14 Binky Moon, LLC +works + +// world : 2014-06-12 Binky Moon, LLC +world + +// wow : 2015-10-08 Amazon Registry Services, Inc. +wow + +// wtc : 2013-12-19 World Trade Centers Association, Inc. +wtc + +// wtf : 2014-03-06 Binky Moon, LLC +wtf + +// xbox : 2014-12-18 Microsoft Corporation +xbox + +// xerox : 2014-10-24 Xerox DNHC LLC +xerox + +// xfinity : 2015-07-09 Comcast IP Holdings I, LLC +xfinity + +// xihuan : 2015-01-08 Beijing Qihu Keji Co., Ltd. +xihuan + +// xin : 2014-12-11 Elegant Leader Limited +xin + +// xn--11b4c3d : 2015-01-15 VeriSign Sarl +कॉम + +// xn--1ck2e1b : 2015-02-26 Amazon Registry Services, Inc. +セール + +// xn--1qqw23a : 2014-01-09 Guangzhou YU Wei Information Technology Co., Ltd. +佛山 + +// xn--30rr7y : 2014-06-12 Excellent First Limited +慈善 + +// xn--3bst00m : 2013-09-13 Eagle Horizon Limited +集团 + +// xn--3ds443g : 2013-09-08 TLD REGISTRY LIMITED OY +在线 + +// xn--3pxu8k : 2015-01-15 VeriSign Sarl +点看 + +// xn--42c2d9a : 2015-01-15 VeriSign Sarl +คอม + +// xn--45q11c : 2013-11-21 Zodiac Gemini Ltd +八卦 + +// xn--4gbrim : 2013-10-04 Helium TLDs Ltd +موقع + +// xn--55qw42g : 2013-11-08 China Organizational Name Administration Center +公益 + +// xn--55qx5d : 2013-11-14 China Internet Network Information Center (CNNIC) +公司 + +// xn--5su34j936bgsg : 2015-09-03 Shangri‐La International Hotel Management Limited +香格里拉 + +// xn--5tzm5g : 2014-12-22 Global Website TLD Asia Limited +网站 + +// xn--6frz82g : 2013-09-23 Afilias Limited +移动 + +// xn--6qq986b3xl : 2013-09-13 Tycoon Treasure Limited +我爱你 + +// xn--80adxhks : 2013-12-19 Foundation for Assistance for Internet Technologies and Infrastructure Development (FAITID) +москва + +// xn--80aqecdr1a : 2015-10-21 Pontificium Consilium de Comunicationibus Socialibus (PCCS) (Pontifical Council for Social Communication) +католик + +// xn--80asehdb : 2013-07-14 CORE Association +онлайн + +// xn--80aswg : 2013-07-14 CORE Association +сайт + +// xn--8y0a063a : 2015-03-26 China United Network Communications Corporation Limited +联通 + +// xn--9dbq2a : 2015-01-15 VeriSign Sarl +קום + +// xn--9et52u : 2014-06-12 RISE VICTORY LIMITED +时尚 + +// xn--9krt00a : 2015-03-12 Sina Corporation +微博 + +// xn--b4w605ferd : 2014-08-07 Temasek Holdings (Private) Limited +淡马锡 + +// xn--bck1b9a5dre4c : 2015-02-26 Amazon Registry Services, Inc. +ファッション + +// xn--c1avg : 2013-11-14 Public Interest Registry +орг + +// xn--c2br7g : 2015-01-15 VeriSign Sarl +नेट + +// xn--cck2b3b : 2015-02-26 Amazon Registry Services, Inc. +ストア + +// xn--cckwcxetd : 2019-12-19 Amazon Registry Services, Inc. +アマゾン + +// xn--cg4bki : 2013-09-27 SAMSUNG SDS CO., LTD +삼성 + +// xn--czr694b : 2014-01-16 Internet DotTrademark Organisation Limited +商标 + +// xn--czrs0t : 2013-12-19 Binky Moon, LLC +商店 + +// xn--czru2d : 2013-11-21 Zodiac Aquarius Limited +商城 + +// xn--d1acj3b : 2013-11-20 The Foundation for Network Initiatives “The Smart Internet” +дети + +// xn--eckvdtc9d : 2014-12-18 Amazon Registry Services, Inc. +ポイント + +// xn--efvy88h : 2014-08-22 Guangzhou YU Wei Information Technology Co., Ltd. +新闻 + +// xn--fct429k : 2015-04-09 Amazon Registry Services, Inc. +家電 + +// xn--fhbei : 2015-01-15 VeriSign Sarl +كوم + +// xn--fiq228c5hs : 2013-09-08 TLD REGISTRY LIMITED OY +中文网 + +// xn--fiq64b : 2013-10-14 CITIC Group Corporation +中信 + +// xn--fjq720a : 2014-05-22 Binky Moon, LLC +娱乐 + +// xn--flw351e : 2014-07-31 Charleston Road Registry Inc. +谷歌 + +// xn--fzys8d69uvgm : 2015-05-14 PCCW Enterprises Limited +電訊盈科 + +// xn--g2xx48c : 2015-01-30 Nawang Heli(Xiamen) Network Service Co., LTD. +购物 + +// xn--gckr3f0f : 2015-02-26 Amazon Registry Services, Inc. +クラウド + +// xn--gk3at1e : 2015-10-08 Amazon Registry Services, Inc. +通販 + +// xn--hxt814e : 2014-05-15 Zodiac Taurus Limited +网店 + +// xn--i1b6b1a6a2e : 2013-11-14 Public Interest Registry +संगठन + +// xn--imr513n : 2014-12-11 Internet DotTrademark Organisation Limited +餐厅 + +// xn--io0a7i : 2013-11-14 China Internet Network Information Center (CNNIC) +网络 + +// xn--j1aef : 2015-01-15 VeriSign Sarl +ком + +// xn--jlq480n2rg : 2019-12-19 Amazon Registry Services, Inc. +亚马逊 + +// xn--jlq61u9w7b : 2015-01-08 Nokia Corporation +诺基亚 + +// xn--jvr189m : 2015-02-26 Amazon Registry Services, Inc. +食品 + +// xn--kcrx77d1x4a : 2014-11-07 Koninklijke Philips N.V. +飞利浦 + +// xn--kput3i : 2014-02-13 Beijing RITT-Net Technology Development Co., Ltd +手机 + +// xn--mgba3a3ejt : 2014-11-20 Aramco Services Company +ارامكو + +// xn--mgba7c0bbn0a : 2015-05-14 Crescent Holding GmbH +العليان + +// xn--mgbaakc7dvf : 2015-09-03 Emirates Telecommunications Corporation (trading as Etisalat) +اتصالات + +// xn--mgbab2bd : 2013-10-31 CORE Association +بازار + +// xn--mgbca7dzdo : 2015-07-30 Abu Dhabi Systems and Information Centre +ابوظبي + +// xn--mgbi4ecexp : 2015-10-21 Pontificium Consilium de Comunicationibus Socialibus (PCCS) (Pontifical Council for Social Communication) +كاثوليك + +// xn--mgbt3dhd : 2014-09-04 Asia Green IT System Bilgisayar San. ve Tic. Ltd. Sti. +همراه + +// xn--mk1bu44c : 2015-01-15 VeriSign Sarl +닷컴 + +// xn--mxtq1m : 2014-03-06 Net-Chinese Co., Ltd. +政府 + +// xn--ngbc5azd : 2013-07-13 International Domain Registry Pty. Ltd. +شبكة + +// xn--ngbe9e0a : 2014-12-04 Kuwait Finance House +بيتك + +// xn--ngbrx : 2015-11-12 League of Arab States +عرب + +// xn--nqv7f : 2013-11-14 Public Interest Registry +机构 + +// xn--nqv7fs00ema : 2013-11-14 Public Interest Registry +组织机构 + +// xn--nyqy26a : 2014-11-07 Stable Tone Limited +健康 + +// xn--otu796d : 2017-08-06 Jiang Yu Liang Cai Technology Company Limited +招聘 + +// xn--p1acf : 2013-12-12 Rusnames Limited +рус + +// xn--pssy2u : 2015-01-15 VeriSign Sarl +大拿 + +// xn--q9jyb4c : 2013-09-17 Charleston Road Registry Inc. +みんな + +// xn--qcka1pmc : 2014-07-31 Charleston Road Registry Inc. +グーグル + +// xn--rhqv96g : 2013-09-11 Stable Tone Limited +世界 + +// xn--rovu88b : 2015-02-26 Amazon Registry Services, Inc. +書籍 + +// xn--ses554g : 2014-01-16 KNET Co., Ltd. +网址 + +// xn--t60b56a : 2015-01-15 VeriSign Sarl +닷넷 + +// xn--tckwe : 2015-01-15 VeriSign Sarl +コム + +// xn--tiq49xqyj : 2015-10-21 Pontificium Consilium de Comunicationibus Socialibus (PCCS) (Pontifical Council for Social Communication) +天主教 + +// xn--unup4y : 2013-07-14 Binky Moon, LLC +游戏 + +// xn--vermgensberater-ctb : 2014-06-23 Deutsche Vermögensberatung Aktiengesellschaft DVAG +vermögensberater + +// xn--vermgensberatung-pwb : 2014-06-23 Deutsche Vermögensberatung Aktiengesellschaft DVAG +vermögensberatung + +// xn--vhquv : 2013-08-27 Binky Moon, LLC +企业 + +// xn--vuq861b : 2014-10-16 Beijing Tele-info Network Technology Co., Ltd. +信息 + +// xn--w4r85el8fhu5dnra : 2015-04-30 Kerry Trading Co. Limited +嘉里大酒店 + +// xn--w4rs40l : 2015-07-30 Kerry Trading Co. Limited +嘉里 + +// xn--xhq521b : 2013-11-14 Guangzhou YU Wei Information Technology Co., Ltd. +广东 + +// xn--zfr164b : 2013-11-08 China Organizational Name Administration Center +政务 + +// xyz : 2013-12-05 XYZ.COM LLC +xyz + +// yachts : 2014-01-09 XYZ.COM LLC +yachts + +// yahoo : 2015-04-02 Oath Inc. +yahoo + +// yamaxun : 2014-12-18 Amazon Registry Services, Inc. +yamaxun + +// yandex : 2014-04-10 Yandex Europe B.V. +yandex + +// yodobashi : 2014-11-20 YODOBASHI CAMERA CO.,LTD. +yodobashi + +// yoga : 2014-05-29 Registry Services, LLC +yoga + +// yokohama : 2013-12-12 GMO Registry, Inc. +yokohama + +// you : 2015-04-09 Amazon Registry Services, Inc. +you + +// youtube : 2014-05-01 Charleston Road Registry Inc. +youtube + +// yun : 2015-01-08 Beijing Qihu Keji Co., Ltd. +yun + +// zappos : 2015-06-25 Amazon Registry Services, Inc. +zappos + +// zara : 2014-11-07 Industria de Diseño Textil, S.A. (INDITEX, S.A.) +zara + +// zero : 2014-12-18 Amazon Registry Services, Inc. +zero + +// zip : 2014-05-08 Charleston Road Registry Inc. +zip + +// zone : 2013-11-14 Binky Moon, LLC +zone + +// zuerich : 2014-11-07 Kanton Zürich (Canton of Zurich) +zuerich + + +// ===END ICANN DOMAINS=== +// ===BEGIN PRIVATE DOMAINS=== +// (Note: these are in alphabetical order by company name) + +// 1GB LLC : https://www.1gb.ua/ +// Submitted by 1GB LLC +cc.ua +inf.ua +ltd.ua + +// 611coin : https://611project.org/ +611.to + +// Aaron Marais' Gitlab pages: https://lab.aaronleem.co.za +// Submitted by Aaron Marais +graphox.us + +// accesso Technology Group, plc. : https://accesso.com/ +// Submitted by accesso Team +*.devcdnaccesso.com + +// Adobe : https://www.adobe.com/ +// Submitted by Ian Boston and Lars Trieloff +adobeaemcloud.com +*.dev.adobeaemcloud.com +hlx.live +adobeaemcloud.net +hlx.page +hlx3.page + +// Agnat sp. z o.o. : https://domena.pl +// Submitted by Przemyslaw Plewa +beep.pl + +// Airkit : https://www.airkit.com/ +// Submitted by Grant Cooksey +airkitapps.com +airkitapps-au.com +airkitapps.eu + +// Aiven: https://aiven.io/ +// Submitted by Etienne Stalmans +aivencloud.com + +// alboto.ca : http://alboto.ca +// Submitted by Anton Avramov +barsy.ca + +// Alces Software Ltd : http://alces-software.com +// Submitted by Mark J. Titorenko +*.compute.estate +*.alces.network + +// all-inkl.com : https://all-inkl.com +// Submitted by Werner Kaltofen +kasserver.com + +// Altervista: https://www.altervista.org +// Submitted by Carlo Cannas +altervista.org + +// alwaysdata : https://www.alwaysdata.com +// Submitted by Cyril +alwaysdata.net + +// Amazon CloudFront : https://aws.amazon.com/cloudfront/ +// Submitted by Donavan Miller +cloudfront.net + +// Amazon Elastic Compute Cloud : https://aws.amazon.com/ec2/ +// Submitted by Luke Wells +*.compute.amazonaws.com +*.compute-1.amazonaws.com +*.compute.amazonaws.com.cn +us-east-1.amazonaws.com + +// Amazon Elastic Beanstalk : https://aws.amazon.com/elasticbeanstalk/ +// Submitted by Luke Wells +cn-north-1.eb.amazonaws.com.cn +cn-northwest-1.eb.amazonaws.com.cn +elasticbeanstalk.com +ap-northeast-1.elasticbeanstalk.com +ap-northeast-2.elasticbeanstalk.com +ap-northeast-3.elasticbeanstalk.com +ap-south-1.elasticbeanstalk.com +ap-southeast-1.elasticbeanstalk.com +ap-southeast-2.elasticbeanstalk.com +ca-central-1.elasticbeanstalk.com +eu-central-1.elasticbeanstalk.com +eu-west-1.elasticbeanstalk.com +eu-west-2.elasticbeanstalk.com +eu-west-3.elasticbeanstalk.com +sa-east-1.elasticbeanstalk.com +us-east-1.elasticbeanstalk.com +us-east-2.elasticbeanstalk.com +us-gov-west-1.elasticbeanstalk.com +us-west-1.elasticbeanstalk.com +us-west-2.elasticbeanstalk.com + +// Amazon Elastic Load Balancing : https://aws.amazon.com/elasticloadbalancing/ +// Submitted by Luke Wells +*.elb.amazonaws.com +*.elb.amazonaws.com.cn + +// Amazon Global Accelerator : https://aws.amazon.com/global-accelerator/ +// Submitted by Daniel Massaguer +awsglobalaccelerator.com + +// Amazon S3 : https://aws.amazon.com/s3/ +// Submitted by Luke Wells +s3.amazonaws.com +s3-ap-northeast-1.amazonaws.com +s3-ap-northeast-2.amazonaws.com +s3-ap-south-1.amazonaws.com +s3-ap-southeast-1.amazonaws.com +s3-ap-southeast-2.amazonaws.com +s3-ca-central-1.amazonaws.com +s3-eu-central-1.amazonaws.com +s3-eu-west-1.amazonaws.com +s3-eu-west-2.amazonaws.com +s3-eu-west-3.amazonaws.com +s3-external-1.amazonaws.com +s3-fips-us-gov-west-1.amazonaws.com +s3-sa-east-1.amazonaws.com +s3-us-gov-west-1.amazonaws.com +s3-us-east-2.amazonaws.com +s3-us-west-1.amazonaws.com +s3-us-west-2.amazonaws.com +s3.ap-northeast-2.amazonaws.com +s3.ap-south-1.amazonaws.com +s3.cn-north-1.amazonaws.com.cn +s3.ca-central-1.amazonaws.com +s3.eu-central-1.amazonaws.com +s3.eu-west-2.amazonaws.com +s3.eu-west-3.amazonaws.com +s3.us-east-2.amazonaws.com +s3.dualstack.ap-northeast-1.amazonaws.com +s3.dualstack.ap-northeast-2.amazonaws.com +s3.dualstack.ap-south-1.amazonaws.com +s3.dualstack.ap-southeast-1.amazonaws.com +s3.dualstack.ap-southeast-2.amazonaws.com +s3.dualstack.ca-central-1.amazonaws.com +s3.dualstack.eu-central-1.amazonaws.com +s3.dualstack.eu-west-1.amazonaws.com +s3.dualstack.eu-west-2.amazonaws.com +s3.dualstack.eu-west-3.amazonaws.com +s3.dualstack.sa-east-1.amazonaws.com +s3.dualstack.us-east-1.amazonaws.com +s3.dualstack.us-east-2.amazonaws.com +s3-website-us-east-1.amazonaws.com +s3-website-us-west-1.amazonaws.com +s3-website-us-west-2.amazonaws.com +s3-website-ap-northeast-1.amazonaws.com +s3-website-ap-southeast-1.amazonaws.com +s3-website-ap-southeast-2.amazonaws.com +s3-website-eu-west-1.amazonaws.com +s3-website-sa-east-1.amazonaws.com +s3-website.ap-northeast-2.amazonaws.com +s3-website.ap-south-1.amazonaws.com +s3-website.ca-central-1.amazonaws.com +s3-website.eu-central-1.amazonaws.com +s3-website.eu-west-2.amazonaws.com +s3-website.eu-west-3.amazonaws.com +s3-website.us-east-2.amazonaws.com + +// Amune : https://amune.org/ +// Submitted by Team Amune +t3l3p0rt.net +tele.amune.org + +// Apigee : https://apigee.com/ +// Submitted by Apigee Security Team +apigee.io + +// Apphud : https://apphud.com +// Submitted by Alexander Selivanov +siiites.com + +// Appspace : https://www.appspace.com +// Submitted by Appspace Security Team +appspacehosted.com +appspaceusercontent.com + +// Appudo UG (haftungsbeschränkt) : https://www.appudo.com +// Submitted by Alexander Hochbaum +appudo.net + +// Aptible : https://www.aptible.com/ +// Submitted by Thomas Orozco +on-aptible.com + +// ASEINet : https://www.aseinet.com/ +// Submitted by Asei SEKIGUCHI +user.aseinet.ne.jp +gv.vc +d.gv.vc + +// Asociación Amigos de la Informática "Euskalamiga" : http://encounter.eus/ +// Submitted by Hector Martin +user.party.eus + +// Association potager.org : https://potager.org/ +// Submitted by Lunar +pimienta.org +poivron.org +potager.org +sweetpepper.org + +// ASUSTOR Inc. : http://www.asustor.com +// Submitted by Vincent Tseng +myasustor.com + +// Atlassian : https://atlassian.com +// Submitted by Sam Smyth +cdn.prod.atlassian-dev.net + +// Authentick UG (haftungsbeschränkt) : https://authentick.net +// Submitted by Lukas Reschke +translated.page + +// AVM : https://avm.de +// Submitted by Andreas Weise +myfritz.net + +// AVStack Pte. Ltd. : https://avstack.io +// Submitted by Jasper Hugo +onavstack.net + +// AW AdvisorWebsites.com Software Inc : https://advisorwebsites.com +// Submitted by James Kennedy +*.awdev.ca +*.advisor.ws + +// AZ.pl sp. z.o.o: https://az.pl +// Submitted by Krzysztof Wolski +ecommerce-shop.pl + +// b-data GmbH : https://www.b-data.io +// Submitted by Olivier Benz +b-data.io + +// backplane : https://www.backplane.io +// Submitted by Anthony Voutas +backplaneapp.io + +// Balena : https://www.balena.io +// Submitted by Petros Angelatos +balena-devices.com + +// University of Banja Luka : https://unibl.org +// Domains for Republic of Srpska administrative entity. +// Submitted by Marko Ivanovic +rs.ba + +// Banzai Cloud +// Submitted by Janos Matyas +*.banzai.cloud +app.banzaicloud.io +*.backyards.banzaicloud.io + +// BASE, Inc. : https://binc.jp +// Submitted by Yuya NAGASAWA +base.ec +official.ec +buyshop.jp +fashionstore.jp +handcrafted.jp +kawaiishop.jp +supersale.jp +theshop.jp +shopselect.net +base.shop + +// Beget Ltd +// Submitted by Lev Nekrasov +*.beget.app + +// BetaInABox +// Submitted by Adrian +betainabox.com + +// BinaryLane : http://www.binarylane.com +// Submitted by Nathan O'Sullivan +bnr.la + +// Bitbucket : http://bitbucket.org +// Submitted by Andy Ortlieb +bitbucket.io + +// Blackbaud, Inc. : https://www.blackbaud.com +// Submitted by Paul Crowder +blackbaudcdn.net + +// Blatech : http://www.blatech.net +// Submitted by Luke Bratch +of.je + +// Blue Bite, LLC : https://bluebite.com +// Submitted by Joshua Weiss +bluebite.io + +// Boomla : https://boomla.com +// Submitted by Tibor Halter +boomla.net + +// Boutir : https://www.boutir.com +// Submitted by Eric Ng Ka Ka +boutir.com + +// Boxfuse : https://boxfuse.com +// Submitted by Axel Fontaine +boxfuse.io + +// bplaced : https://www.bplaced.net/ +// Submitted by Miroslav Bozic +square7.ch +bplaced.com +bplaced.de +square7.de +bplaced.net +square7.net + +// Brendly : https://brendly.rs +// Submitted by Dusan Radovanovic +shop.brendly.rs + +// BrowserSafetyMark +// Submitted by Dave Tharp +browsersafetymark.io + +// Bytemark Hosting : https://www.bytemark.co.uk +// Submitted by Paul Cammish +uk0.bigv.io +dh.bytemark.co.uk +vm.bytemark.co.uk + +// Caf.js Labs LLC : https://www.cafjs.com +// Submitted by Antonio Lain +cafjs.com + +// callidomus : https://www.callidomus.com/ +// Submitted by Marcus Popp +mycd.eu + +// Carrd : https://carrd.co +// Submitted by AJ +drr.ac +uwu.ai +carrd.co +crd.co +ju.mp + +// CentralNic : http://www.centralnic.com/names/domains +// Submitted by registry +ae.org +br.com +cn.com +com.de +com.se +de.com +eu.com +gb.net +hu.net +jp.net +jpn.com +mex.com +ru.com +sa.com +se.net +uk.com +uk.net +us.com +za.bz +za.com + +// No longer operated by CentralNic, these entries should be adopted and/or removed by current operators +// Submitted by Gavin Brown +ar.com +hu.com +kr.com +no.com +qc.com +uy.com + +// Africa.com Web Solutions Ltd : https://registry.africa.com +// Submitted by Gavin Brown +africa.com + +// iDOT Services Limited : http://www.domain.gr.com +// Submitted by Gavin Brown +gr.com + +// Radix FZC : http://domains.in.net +// Submitted by Gavin Brown +in.net +web.in + +// US REGISTRY LLC : http://us.org +// Submitted by Gavin Brown +us.org + +// co.com Registry, LLC : https://registry.co.com +// Submitted by Gavin Brown +co.com + +// Roar Domains LLC : https://roar.basketball/ +// Submitted by Gavin Brown +aus.basketball +nz.basketball + +// BRS Media : https://brsmedia.com/ +// Submitted by Gavin Brown +radio.am +radio.fm + +// c.la : http://www.c.la/ +c.la + +// certmgr.org : https://certmgr.org +// Submitted by B. Blechschmidt +certmgr.org + +// Cityhost LLC : https://cityhost.ua +// Submitted by Maksym Rivtin +cx.ua + +// Civilized Discourse Construction Kit, Inc. : https://www.discourse.org/ +// Submitted by Rishabh Nambiar & Michael Brown +discourse.group +discourse.team + +// Clever Cloud : https://www.clever-cloud.com/ +// Submitted by Quentin Adam +cleverapps.io + +// Clerk : https://www.clerk.dev +// Submitted by Colin Sidoti +clerk.app +clerkstage.app +*.lcl.dev +*.lclstage.dev +*.stg.dev +*.stgstage.dev + +// ClickRising : https://clickrising.com/ +// Submitted by Umut Gumeli +clickrising.net + +// Cloud66 : https://www.cloud66.com/ +// Submitted by Khash Sajadi +c66.me +cloud66.ws +cloud66.zone + +// CloudAccess.net : https://www.cloudaccess.net/ +// Submitted by Pawel Panek +jdevcloud.com +wpdevcloud.com +cloudaccess.host +freesite.host +cloudaccess.net + +// cloudControl : https://www.cloudcontrol.com/ +// Submitted by Tobias Wilken +cloudcontrolled.com +cloudcontrolapp.com + +// Cloudera, Inc. : https://www.cloudera.com/ +// Submitted by Kedarnath Waikar +*.cloudera.site + +// Cloudflare, Inc. : https://www.cloudflare.com/ +// Submitted by Cloudflare Team +pages.dev +trycloudflare.com +workers.dev + +// Clovyr : https://clovyr.io +// Submitted by Patrick Nielsen +wnext.app + +// co.ca : http://registry.co.ca/ +co.ca + +// Co & Co : https://co-co.nl/ +// Submitted by Govert Versluis +*.otap.co + +// i-registry s.r.o. : http://www.i-registry.cz/ +// Submitted by Martin Semrad +co.cz + +// CDN77.com : http://www.cdn77.com +// Submitted by Jan Krpes +c.cdn77.org +cdn77-ssl.net +r.cdn77.net +rsc.cdn77.org +ssl.origin.cdn77-secure.org + +// Cloud DNS Ltd : http://www.cloudns.net +// Submitted by Aleksander Hristov +cloudns.asia +cloudns.biz +cloudns.club +cloudns.cc +cloudns.eu +cloudns.in +cloudns.info +cloudns.org +cloudns.pro +cloudns.pw +cloudns.us + +// CNPY : https://cnpy.gdn +// Submitted by Angelo Gladding +cnpy.gdn + +// Codeberg e. V. : https://codeberg.org +// Submitted by Moritz Marquardt +codeberg.page + +// CoDNS B.V. +co.nl +co.no + +// Combell.com : https://www.combell.com +// Submitted by Thomas Wouters +webhosting.be +hosting-cluster.nl + +// Coordination Center for TLD RU and XN--P1AI : https://cctld.ru/en/domains/domens_ru/reserved/ +// Submitted by George Georgievsky +ac.ru +edu.ru +gov.ru +int.ru +mil.ru +test.ru + +// COSIMO GmbH : http://www.cosimo.de +// Submitted by Rene Marticke +dyn.cosidns.de +dynamisches-dns.de +dnsupdater.de +internet-dns.de +l-o-g-i-n.de +dynamic-dns.info +feste-ip.net +knx-server.net +static-access.net + +// Craynic, s.r.o. : http://www.craynic.com/ +// Submitted by Ales Krajnik +realm.cz + +// Cryptonomic : https://cryptonomic.net/ +// Submitted by Andrew Cady +*.cryptonomic.net + +// Cupcake : https://cupcake.io/ +// Submitted by Jonathan Rudenberg +cupcake.is + +// Curv UG : https://curv-labs.de/ +// Submitted by Marvin Wiesner +curv.dev + +// Customer OCI - Oracle Dyn https://cloud.oracle.com/home https://dyn.com/dns/ +// Submitted by Gregory Drake +// Note: This is intended to also include customer-oci.com due to wildcards implicitly including the current label +*.customer-oci.com +*.oci.customer-oci.com +*.ocp.customer-oci.com +*.ocs.customer-oci.com + +// cyon GmbH : https://www.cyon.ch/ +// Submitted by Dominic Luechinger +cyon.link +cyon.site + +// Danger Science Group: https://dangerscience.com/ +// Submitted by Skylar MacDonald +fnwk.site +folionetwork.site +platform0.app + +// Daplie, Inc : https://daplie.com +// Submitted by AJ ONeal +daplie.me +localhost.daplie.me + +// Datto, Inc. : https://www.datto.com/ +// Submitted by Philipp Heckel +dattolocal.com +dattorelay.com +dattoweb.com +mydatto.com +dattolocal.net +mydatto.net + +// Dansk.net : http://www.dansk.net/ +// Submitted by Anani Voule +biz.dk +co.dk +firm.dk +reg.dk +store.dk + +// dappnode.io : https://dappnode.io/ +// Submitted by Abel Boldu / DAppNode Team +dyndns.dappnode.io + +// dapps.earth : https://dapps.earth/ +// Submitted by Daniil Burdakov +*.dapps.earth +*.bzz.dapps.earth + +// Dark, Inc. : https://darklang.com +// Submitted by Paul Biggar +builtwithdark.com + +// DataDetect, LLC. : https://datadetect.com +// Submitted by Andrew Banchich +demo.datadetect.com +instance.datadetect.com + +// Datawire, Inc : https://www.datawire.io +// Submitted by Richard Li +edgestack.me + +// DDNS5 : https://ddns5.com +// Submitted by Cameron Elliott +ddns5.com + +// Debian : https://www.debian.org/ +// Submitted by Peter Palfrader / Debian Sysadmin Team +debian.net + +// Deno Land Inc : https://deno.com/ +// Submitted by Luca Casonato +deno.dev +deno-staging.dev + +// deSEC : https://desec.io/ +// Submitted by Peter Thomassen +dedyn.io + +// Deta: https://www.deta.sh/ +// Submitted by Aavash Shrestha +deta.app +deta.dev + +// Diher Solutions : https://diher.solutions +// Submitted by Didi Hermawan +*.rss.my.id +*.diher.solutions + +// Discord Inc : https://discord.com +// Submitted by Sahn Lam +discordsays.com +discordsez.com + +// DNS Africa Ltd https://dns.business +// Submitted by Calvin Browne +jozi.biz + +// DNShome : https://www.dnshome.de/ +// Submitted by Norbert Auler +dnshome.de + +// DotArai : https://www.dotarai.com/ +// Submitted by Atsadawat Netcharadsang +online.th +shop.th + +// DrayTek Corp. : https://www.draytek.com/ +// Submitted by Paul Fang +drayddns.com + +// DreamCommerce : https://shoper.pl/ +// Submitted by Konrad Kotarba +shoparena.pl + +// DreamHost : http://www.dreamhost.com/ +// Submitted by Andrew Farmer +dreamhosters.com + +// Drobo : http://www.drobo.com/ +// Submitted by Ricardo Padilha +mydrobo.com + +// Drud Holdings, LLC. : https://www.drud.com/ +// Submitted by Kevin Bridges +drud.io +drud.us + +// DuckDNS : http://www.duckdns.org/ +// Submitted by Richard Harper +duckdns.org + +// Bip : https://bip.sh +// Submitted by Joel Kennedy +bip.sh + +// bitbridge.net : Submitted by Craig Welch, abeliidev@gmail.com +bitbridge.net + +// dy.fi : http://dy.fi/ +// Submitted by Heikki Hannikainen +dy.fi +tunk.org + +// DynDNS.com : http://www.dyndns.com/services/dns/dyndns/ +dyndns-at-home.com +dyndns-at-work.com +dyndns-blog.com +dyndns-free.com +dyndns-home.com +dyndns-ip.com +dyndns-mail.com +dyndns-office.com +dyndns-pics.com +dyndns-remote.com +dyndns-server.com +dyndns-web.com +dyndns-wiki.com +dyndns-work.com +dyndns.biz +dyndns.info +dyndns.org +dyndns.tv +at-band-camp.net +ath.cx +barrel-of-knowledge.info +barrell-of-knowledge.info +better-than.tv +blogdns.com +blogdns.net +blogdns.org +blogsite.org +boldlygoingnowhere.org +broke-it.net +buyshouses.net +cechire.com +dnsalias.com +dnsalias.net +dnsalias.org +dnsdojo.com +dnsdojo.net +dnsdojo.org +does-it.net +doesntexist.com +doesntexist.org +dontexist.com +dontexist.net +dontexist.org +doomdns.com +doomdns.org +dvrdns.org +dyn-o-saur.com +dynalias.com +dynalias.net +dynalias.org +dynathome.net +dyndns.ws +endofinternet.net +endofinternet.org +endoftheinternet.org +est-a-la-maison.com +est-a-la-masion.com +est-le-patron.com +est-mon-blogueur.com +for-better.biz +for-more.biz +for-our.info +for-some.biz +for-the.biz +forgot.her.name +forgot.his.name +from-ak.com +from-al.com +from-ar.com +from-az.net +from-ca.com +from-co.net +from-ct.com +from-dc.com +from-de.com +from-fl.com +from-ga.com +from-hi.com +from-ia.com +from-id.com +from-il.com +from-in.com +from-ks.com +from-ky.com +from-la.net +from-ma.com +from-md.com +from-me.org +from-mi.com +from-mn.com +from-mo.com +from-ms.com +from-mt.com +from-nc.com +from-nd.com +from-ne.com +from-nh.com +from-nj.com +from-nm.com +from-nv.com +from-ny.net +from-oh.com +from-ok.com +from-or.com +from-pa.com +from-pr.com +from-ri.com +from-sc.com +from-sd.com +from-tn.com +from-tx.com +from-ut.com +from-va.com +from-vt.com +from-wa.com +from-wi.com +from-wv.com +from-wy.com +ftpaccess.cc +fuettertdasnetz.de +game-host.org +game-server.cc +getmyip.com +gets-it.net +go.dyndns.org +gotdns.com +gotdns.org +groks-the.info +groks-this.info +ham-radio-op.net +here-for-more.info +hobby-site.com +hobby-site.org +home.dyndns.org +homedns.org +homeftp.net +homeftp.org +homeip.net +homelinux.com +homelinux.net +homelinux.org +homeunix.com +homeunix.net +homeunix.org +iamallama.com +in-the-band.net +is-a-anarchist.com +is-a-blogger.com +is-a-bookkeeper.com +is-a-bruinsfan.org +is-a-bulls-fan.com +is-a-candidate.org +is-a-caterer.com +is-a-celticsfan.org +is-a-chef.com +is-a-chef.net +is-a-chef.org +is-a-conservative.com +is-a-cpa.com +is-a-cubicle-slave.com +is-a-democrat.com +is-a-designer.com +is-a-doctor.com +is-a-financialadvisor.com +is-a-geek.com +is-a-geek.net +is-a-geek.org +is-a-green.com +is-a-guru.com +is-a-hard-worker.com +is-a-hunter.com +is-a-knight.org +is-a-landscaper.com +is-a-lawyer.com +is-a-liberal.com +is-a-libertarian.com +is-a-linux-user.org +is-a-llama.com +is-a-musician.com +is-a-nascarfan.com +is-a-nurse.com +is-a-painter.com +is-a-patsfan.org +is-a-personaltrainer.com +is-a-photographer.com +is-a-player.com +is-a-republican.com +is-a-rockstar.com +is-a-socialist.com +is-a-soxfan.org +is-a-student.com +is-a-teacher.com +is-a-techie.com +is-a-therapist.com +is-an-accountant.com +is-an-actor.com +is-an-actress.com +is-an-anarchist.com +is-an-artist.com +is-an-engineer.com +is-an-entertainer.com +is-by.us +is-certified.com +is-found.org +is-gone.com +is-into-anime.com +is-into-cars.com +is-into-cartoons.com +is-into-games.com +is-leet.com +is-lost.org +is-not-certified.com +is-saved.org +is-slick.com +is-uberleet.com +is-very-bad.org +is-very-evil.org +is-very-good.org +is-very-nice.org +is-very-sweet.org +is-with-theband.com +isa-geek.com +isa-geek.net +isa-geek.org +isa-hockeynut.com +issmarterthanyou.com +isteingeek.de +istmein.de +kicks-ass.net +kicks-ass.org +knowsitall.info +land-4-sale.us +lebtimnetz.de +leitungsen.de +likes-pie.com +likescandy.com +merseine.nu +mine.nu +misconfused.org +mypets.ws +myphotos.cc +neat-url.com +office-on-the.net +on-the-web.tv +podzone.net +podzone.org +readmyblog.org +saves-the-whales.com +scrapper-site.net +scrapping.cc +selfip.biz +selfip.com +selfip.info +selfip.net +selfip.org +sells-for-less.com +sells-for-u.com +sells-it.net +sellsyourhome.org +servebbs.com +servebbs.net +servebbs.org +serveftp.net +serveftp.org +servegame.org +shacknet.nu +simple-url.com +space-to-rent.com +stuff-4-sale.org +stuff-4-sale.us +teaches-yoga.com +thruhere.net +traeumtgerade.de +webhop.biz +webhop.info +webhop.net +webhop.org +worse-than.tv +writesthisblog.com + +// ddnss.de : https://www.ddnss.de/ +// Submitted by Robert Niedziela +ddnss.de +dyn.ddnss.de +dyndns.ddnss.de +dyndns1.de +dyn-ip24.de +home-webserver.de +dyn.home-webserver.de +myhome-server.de +ddnss.org + +// Definima : http://www.definima.com/ +// Submitted by Maxence Bitterli +definima.net +definima.io + +// DigitalOcean App Platform : https://www.digitalocean.com/products/app-platform/ +// Submitted by Braxton Huggins +ondigitalocean.app + +// DigitalOcean Spaces : https://www.digitalocean.com/products/spaces/ +// Submitted by Robin H. Johnson +*.digitaloceanspaces.com + +// dnstrace.pro : https://dnstrace.pro/ +// Submitted by Chris Partridge +bci.dnstrace.pro + +// Dynu.com : https://www.dynu.com/ +// Submitted by Sue Ye +ddnsfree.com +ddnsgeek.com +giize.com +gleeze.com +kozow.com +loseyourip.com +ooguy.com +theworkpc.com +casacam.net +dynu.net +accesscam.org +camdvr.org +freeddns.org +mywire.org +webredirect.org +myddns.rocks +blogsite.xyz + +// dynv6 : https://dynv6.com +// Submitted by Dominik Menke +dynv6.net + +// E4YOU spol. s.r.o. : https://e4you.cz/ +// Submitted by Vladimir Dudr +e4.cz + +// eero : https://eero.com/ +// Submitted by Yue Kang +eero.online +eero-stage.online + +// Elementor : Elementor Ltd. +// Submitted by Anton Barkan +elementor.cloud +elementor.cool + +// En root‽ : https://en-root.org +// Submitted by Emmanuel Raviart +en-root.fr + +// Enalean SAS: https://www.enalean.com +// Submitted by Thomas Cottier +mytuleap.com +tuleap-partners.com + +// Encoretivity AB: https://encore.dev +// Submitted by André Eriksson +encr.app +encoreapi.com + +// ECG Robotics, Inc: https://ecgrobotics.org +// Submitted by +onred.one +staging.onred.one + +// encoway GmbH : https://www.encoway.de +// Submitted by Marcel Daus +eu.encoway.cloud + +// EU.org https://eu.org/ +// Submitted by Pierre Beyssac +eu.org +al.eu.org +asso.eu.org +at.eu.org +au.eu.org +be.eu.org +bg.eu.org +ca.eu.org +cd.eu.org +ch.eu.org +cn.eu.org +cy.eu.org +cz.eu.org +de.eu.org +dk.eu.org +edu.eu.org +ee.eu.org +es.eu.org +fi.eu.org +fr.eu.org +gr.eu.org +hr.eu.org +hu.eu.org +ie.eu.org +il.eu.org +in.eu.org +int.eu.org +is.eu.org +it.eu.org +jp.eu.org +kr.eu.org +lt.eu.org +lu.eu.org +lv.eu.org +mc.eu.org +me.eu.org +mk.eu.org +mt.eu.org +my.eu.org +net.eu.org +ng.eu.org +nl.eu.org +no.eu.org +nz.eu.org +paris.eu.org +pl.eu.org +pt.eu.org +q-a.eu.org +ro.eu.org +ru.eu.org +se.eu.org +si.eu.org +sk.eu.org +tr.eu.org +uk.eu.org +us.eu.org + +// Eurobyte : https://eurobyte.ru +// Submitted by Evgeniy Subbotin +eurodir.ru + +// Evennode : http://www.evennode.com/ +// Submitted by Michal Kralik +eu-1.evennode.com +eu-2.evennode.com +eu-3.evennode.com +eu-4.evennode.com +us-1.evennode.com +us-2.evennode.com +us-3.evennode.com +us-4.evennode.com + +// eDirect Corp. : https://hosting.url.com.tw/ +// Submitted by C.S. chang +twmail.cc +twmail.net +twmail.org +mymailer.com.tw +url.tw + +// Fabrica Technologies, Inc. : https://www.fabrica.dev/ +// Submitted by Eric Jiang +onfabrica.com + +// Facebook, Inc. +// Submitted by Peter Ruibal +apps.fbsbx.com + +// FAITID : https://faitid.org/ +// Submitted by Maxim Alzoba +// https://www.flexireg.net/stat_info +ru.net +adygeya.ru +bashkiria.ru +bir.ru +cbg.ru +com.ru +dagestan.ru +grozny.ru +kalmykia.ru +kustanai.ru +marine.ru +mordovia.ru +msk.ru +mytis.ru +nalchik.ru +nov.ru +pyatigorsk.ru +spb.ru +vladikavkaz.ru +vladimir.ru +abkhazia.su +adygeya.su +aktyubinsk.su +arkhangelsk.su +armenia.su +ashgabad.su +azerbaijan.su +balashov.su +bashkiria.su +bryansk.su +bukhara.su +chimkent.su +dagestan.su +east-kazakhstan.su +exnet.su +georgia.su +grozny.su +ivanovo.su +jambyl.su +kalmykia.su +kaluga.su +karacol.su +karaganda.su +karelia.su +khakassia.su +krasnodar.su +kurgan.su +kustanai.su +lenug.su +mangyshlak.su +mordovia.su +msk.su +murmansk.su +nalchik.su +navoi.su +north-kazakhstan.su +nov.su +obninsk.su +penza.su +pokrovsk.su +sochi.su +spb.su +tashkent.su +termez.su +togliatti.su +troitsk.su +tselinograd.su +tula.su +tuva.su +vladikavkaz.su +vladimir.su +vologda.su + +// Fancy Bits, LLC : http://getchannels.com +// Submitted by Aman Gupta +channelsdvr.net +u.channelsdvr.net + +// Fastly Inc. : http://www.fastly.com/ +// Submitted by Fastly Security +edgecompute.app +fastly-terrarium.com +fastlylb.net +map.fastlylb.net +freetls.fastly.net +map.fastly.net +a.prod.fastly.net +global.prod.fastly.net +a.ssl.fastly.net +b.ssl.fastly.net +global.ssl.fastly.net + +// FASTVPS EESTI OU : https://fastvps.ru/ +// Submitted by Likhachev Vasiliy +fastvps-server.com +fastvps.host +myfast.host +fastvps.site +myfast.space + +// Fedora : https://fedoraproject.org/ +// submitted by Patrick Uiterwijk +fedorainfracloud.org +fedorapeople.org +cloud.fedoraproject.org +app.os.fedoraproject.org +app.os.stg.fedoraproject.org + +// FearWorks Media Ltd. : https://fearworksmedia.co.uk +// submitted by Keith Fairley +conn.uk +copro.uk +hosp.uk + +// Fermax : https://fermax.com/ +// submitted by Koen Van Isterdael +mydobiss.com + +// FH Muenster : https://www.fh-muenster.de +// Submitted by Robin Naundorf +fh-muenster.io + +// Filegear Inc. : https://www.filegear.com +// Submitted by Jason Zhu +filegear.me +filegear-au.me +filegear-de.me +filegear-gb.me +filegear-ie.me +filegear-jp.me +filegear-sg.me + +// Firebase, Inc. +// Submitted by Chris Raynor +firebaseapp.com + +// Firewebkit : https://www.firewebkit.com +// Submitted by Majid Qureshi +fireweb.app + +// FLAP : https://www.flap.cloud +// Submitted by Louis Chemineau +flap.id + +// FlashDrive : https://flashdrive.io +// Submitted by Eric Chan +onflashdrive.app +fldrv.com + +// fly.io: https://fly.io +// Submitted by Kurt Mackey +fly.dev +edgeapp.net +shw.io + +// Flynn : https://flynn.io +// Submitted by Jonathan Rudenberg +flynnhosting.net + +// Forgerock : https://www.forgerock.com +// Submitted by Roderick Parr +forgeblocks.com +id.forgerock.io + +// Framer : https://www.framer.com +// Submitted by Koen Rouwhorst +framer.app +framercanvas.com + +// Frusky MEDIA&PR : https://www.frusky.de +// Submitted by Victor Pupynin +*.frusky.de + +// RavPage : https://www.ravpage.co.il +// Submitted by Roni Horowitz +ravpage.co.il + +// Frederik Braun https://frederik-braun.com +// Submitted by Frederik Braun +0e.vc + +// Freebox : http://www.freebox.fr +// Submitted by Romain Fliedel +freebox-os.com +freeboxos.com +fbx-os.fr +fbxos.fr +freebox-os.fr +freeboxos.fr + +// freedesktop.org : https://www.freedesktop.org +// Submitted by Daniel Stone +freedesktop.org + +// freemyip.com : https://freemyip.com +// Submitted by Cadence +freemyip.com + +// FunkFeuer - Verein zur Förderung freier Netze : https://www.funkfeuer.at +// Submitted by Daniel A. Maierhofer +wien.funkfeuer.at + +// Futureweb OG : http://www.futureweb.at +// Submitted by Andreas Schnederle-Wagner +*.futurecms.at +*.ex.futurecms.at +*.in.futurecms.at +futurehosting.at +futuremailing.at +*.ex.ortsinfo.at +*.kunden.ortsinfo.at +*.statics.cloud + +// GDS : https://www.gov.uk/service-manual/technology/managing-domain-names +// Submitted by Stephen Ford +independent-commission.uk +independent-inquest.uk +independent-inquiry.uk +independent-panel.uk +independent-review.uk +public-inquiry.uk +royal-commission.uk +campaign.gov.uk +service.gov.uk + +// CDDO : https://www.gov.uk/guidance/get-an-api-domain-on-govuk +// Submitted by Jamie Tanna +api.gov.uk + +// Gehirn Inc. : https://www.gehirn.co.jp/ +// Submitted by Kohei YOSHIDA +gehirn.ne.jp +usercontent.jp + +// Gentlent, Inc. : https://www.gentlent.com +// Submitted by Tom Klein +gentapps.com +gentlentapis.com +lab.ms +cdn-edges.net + +// Ghost Foundation : https://ghost.org +// Submitted by Matt Hanley +ghost.io + +// GignoSystemJapan: http://gsj.bz +// Submitted by GignoSystemJapan +gsj.bz + +// GitHub, Inc. +// Submitted by Patrick Toomey +githubusercontent.com +githubpreview.dev +github.io + +// GitLab, Inc. +// Submitted by Alex Hanselka +gitlab.io + +// Gitplac.si - https://gitplac.si +// Submitted by Aljaž Starc +gitapp.si +gitpage.si + +// Glitch, Inc : https://glitch.com +// Submitted by Mads Hartmann +glitch.me + +// Global NOG Alliance : https://nogalliance.org/ +// Submitted by Sander Steffann +nog.community + +// Globe Hosting SRL : https://www.globehosting.com/ +// Submitted by Gavin Brown +co.ro +shop.ro + +// GMO Pepabo, Inc. : https://pepabo.com/ +// Submitted by Hosting Div +lolipop.io +angry.jp +babyblue.jp +babymilk.jp +backdrop.jp +bambina.jp +bitter.jp +blush.jp +boo.jp +boy.jp +boyfriend.jp +but.jp +candypop.jp +capoo.jp +catfood.jp +cheap.jp +chicappa.jp +chillout.jp +chips.jp +chowder.jp +chu.jp +ciao.jp +cocotte.jp +coolblog.jp +cranky.jp +cutegirl.jp +daa.jp +deca.jp +deci.jp +digick.jp +egoism.jp +fakefur.jp +fem.jp +flier.jp +floppy.jp +fool.jp +frenchkiss.jp +girlfriend.jp +girly.jp +gloomy.jp +gonna.jp +greater.jp +hacca.jp +heavy.jp +her.jp +hiho.jp +hippy.jp +holy.jp +hungry.jp +icurus.jp +itigo.jp +jellybean.jp +kikirara.jp +kill.jp +kilo.jp +kuron.jp +littlestar.jp +lolitapunk.jp +lomo.jp +lovepop.jp +lovesick.jp +main.jp +mods.jp +mond.jp +mongolian.jp +moo.jp +namaste.jp +nikita.jp +nobushi.jp +noor.jp +oops.jp +parallel.jp +parasite.jp +pecori.jp +peewee.jp +penne.jp +pepper.jp +perma.jp +pigboat.jp +pinoko.jp +punyu.jp +pupu.jp +pussycat.jp +pya.jp +raindrop.jp +readymade.jp +sadist.jp +schoolbus.jp +secret.jp +staba.jp +stripper.jp +sub.jp +sunnyday.jp +thick.jp +tonkotsu.jp +under.jp +upper.jp +velvet.jp +verse.jp +versus.jp +vivian.jp +watson.jp +weblike.jp +whitesnow.jp +zombie.jp +heteml.net + +// GOV.UK Platform as a Service : https://www.cloud.service.gov.uk/ +// Submitted by Tom Whitwell +cloudapps.digital +london.cloudapps.digital + +// GOV.UK Pay : https://www.payments.service.gov.uk/ +// Submitted by Richard Baker +pymnt.uk + +// UKHomeOffice : https://www.gov.uk/government/organisations/home-office +// Submitted by Jon Shanks +homeoffice.gov.uk + +// GlobeHosting, Inc. +// Submitted by Zoltan Egresi +ro.im + +// GoIP DNS Services : http://www.goip.de +// Submitted by Christian Poulter +goip.de + +// Google, Inc. +// Submitted by Eduardo Vela +run.app +a.run.app +web.app +*.0emm.com +appspot.com +*.r.appspot.com +codespot.com +googleapis.com +googlecode.com +pagespeedmobilizer.com +publishproxy.com +withgoogle.com +withyoutube.com +*.gateway.dev +cloud.goog +translate.goog +*.usercontent.goog +cloudfunctions.net +blogspot.ae +blogspot.al +blogspot.am +blogspot.ba +blogspot.be +blogspot.bg +blogspot.bj +blogspot.ca +blogspot.cf +blogspot.ch +blogspot.cl +blogspot.co.at +blogspot.co.id +blogspot.co.il +blogspot.co.ke +blogspot.co.nz +blogspot.co.uk +blogspot.co.za +blogspot.com +blogspot.com.ar +blogspot.com.au +blogspot.com.br +blogspot.com.by +blogspot.com.co +blogspot.com.cy +blogspot.com.ee +blogspot.com.eg +blogspot.com.es +blogspot.com.mt +blogspot.com.ng +blogspot.com.tr +blogspot.com.uy +blogspot.cv +blogspot.cz +blogspot.de +blogspot.dk +blogspot.fi +blogspot.fr +blogspot.gr +blogspot.hk +blogspot.hr +blogspot.hu +blogspot.ie +blogspot.in +blogspot.is +blogspot.it +blogspot.jp +blogspot.kr +blogspot.li +blogspot.lt +blogspot.lu +blogspot.md +blogspot.mk +blogspot.mr +blogspot.mx +blogspot.my +blogspot.nl +blogspot.no +blogspot.pe +blogspot.pt +blogspot.qa +blogspot.re +blogspot.ro +blogspot.rs +blogspot.ru +blogspot.se +blogspot.sg +blogspot.si +blogspot.sk +blogspot.sn +blogspot.td +blogspot.tw +blogspot.ug +blogspot.vn + +// Goupile : https://goupile.fr +// Submitted by Niels Martignene +goupile.fr + +// Group 53, LLC : https://www.group53.com +// Submitted by Tyler Todd +awsmppl.com + +// GünstigBestellen : https://günstigbestellen.de +// Submitted by Furkan Akkoc +günstigbestellen.de +günstigliefern.de + +// Hakaran group: http://hakaran.cz +// Submitted by Arseniy Sokolov +fin.ci +free.hr +caa.li +ua.rs +conf.se + +// Handshake : https://handshake.org +// Submitted by Mike Damm +hs.zone +hs.run + +// Hashbang : https://hashbang.sh +hashbang.sh + +// Hasura : https://hasura.io +// Submitted by Shahidh K Muhammed +hasura.app +hasura-app.io + +// Heilbronn University of Applied Sciences - Faculty Informatics (GitLab Pages): https://www.hs-heilbronn.de +// Submitted by Richard Zowalla +pages.it.hs-heilbronn.de + +// Hepforge : https://www.hepforge.org +// Submitted by David Grellscheid +hepforge.org + +// Heroku : https://www.heroku.com/ +// Submitted by Tom Maher +herokuapp.com +herokussl.com + +// Hibernating Rhinos +// Submitted by Oren Eini +ravendb.cloud +myravendb.com +ravendb.community +ravendb.me +development.run +ravendb.run + +// home.pl S.A.: https://home.pl +// Submitted by Krzysztof Wolski +homesklep.pl + +// Hong Kong Productivity Council: https://www.hkpc.org/ +// Submitted by SECaaS Team +secaas.hk + +// Hoplix : https://www.hoplix.com +// Submitted by Danilo De Franco +hoplix.shop + + +// HOSTBIP REGISTRY : https://www.hostbip.com/ +// Submitted by Atanunu Igbunuroghene +orx.biz +biz.gl +col.ng +firm.ng +gen.ng +ltd.ng +ngo.ng +edu.scot +sch.so +org.yt + +// HostyHosting (hostyhosting.com) +hostyhosting.io + +// Häkkinen.fi +// Submitted by Eero Häkkinen +häkkinen.fi + +// Ici la Lune : http://www.icilalune.com/ +// Submitted by Simon Morvan +*.moonscale.io +moonscale.net + +// iki.fi +// Submitted by Hannu Aronsson +iki.fi + +// Impertrix Solutions : +// Submitted by Zhixiang Zhao +impertrixcdn.com +impertrix.com + +// Incsub, LLC: https://incsub.com/ +// Submitted by Aaron Edwards +smushcdn.com +wphostedmail.com +wpmucdn.com +tempurl.host +wpmudev.host + +// Individual Network Berlin e.V. : https://www.in-berlin.de/ +// Submitted by Christian Seitz +dyn-berlin.de +in-berlin.de +in-brb.de +in-butter.de +in-dsl.de +in-dsl.net +in-dsl.org +in-vpn.de +in-vpn.net +in-vpn.org + +// info.at : http://www.info.at/ +biz.at +info.at + +// info.cx : http://info.cx +// Submitted by Jacob Slater +info.cx + +// Interlegis : http://www.interlegis.leg.br +// Submitted by Gabriel Ferreira +ac.leg.br +al.leg.br +am.leg.br +ap.leg.br +ba.leg.br +ce.leg.br +df.leg.br +es.leg.br +go.leg.br +ma.leg.br +mg.leg.br +ms.leg.br +mt.leg.br +pa.leg.br +pb.leg.br +pe.leg.br +pi.leg.br +pr.leg.br +rj.leg.br +rn.leg.br +ro.leg.br +rr.leg.br +rs.leg.br +sc.leg.br +se.leg.br +sp.leg.br +to.leg.br + +// intermetrics GmbH : https://pixolino.com/ +// Submitted by Wolfgang Schwarz +pixolino.com + +// Internet-Pro, LLP: https://netangels.ru/ +// Submitted by Vasiliy Sheredeko +na4u.ru + +// iopsys software solutions AB : https://iopsys.eu/ +// Submitted by Roman Azarenko +iopsys.se + +// IPiFony Systems, Inc. : https://www.ipifony.com/ +// Submitted by Matthew Hardeman +ipifony.net + +// IServ GmbH : https://iserv.eu +// Submitted by Kim-Alexander Brodowski +mein-iserv.de +schulserver.de +test-iserv.de +iserv.dev + +// I-O DATA DEVICE, INC. : http://www.iodata.com/ +// Submitted by Yuji Minagawa +iobb.net + +// Jelastic, Inc. : https://jelastic.com/ +// Submitted by Ihor Kolodyuk +mel.cloudlets.com.au +cloud.interhostsolutions.be +users.scale.virtualcloud.com.br +mycloud.by +alp1.ae.flow.ch +appengine.flow.ch +es-1.axarnet.cloud +diadem.cloud +vip.jelastic.cloud +jele.cloud +it1.eur.aruba.jenv-aruba.cloud +it1.jenv-aruba.cloud +keliweb.cloud +cs.keliweb.cloud +oxa.cloud +tn.oxa.cloud +uk.oxa.cloud +primetel.cloud +uk.primetel.cloud +ca.reclaim.cloud +uk.reclaim.cloud +us.reclaim.cloud +ch.trendhosting.cloud +de.trendhosting.cloud +jele.club +amscompute.com +clicketcloud.com +dopaas.com +hidora.com +paas.hosted-by-previder.com +rag-cloud.hosteur.com +rag-cloud-ch.hosteur.com +jcloud.ik-server.com +jcloud-ver-jpc.ik-server.com +demo.jelastic.com +kilatiron.com +paas.massivegrid.com +jed.wafaicloud.com +lon.wafaicloud.com +ryd.wafaicloud.com +j.scaleforce.com.cy +jelastic.dogado.eu +fi.cloudplatform.fi +demo.datacenter.fi +paas.datacenter.fi +jele.host +mircloud.host +paas.beebyte.io +sekd1.beebyteapp.io +jele.io +cloud-fr1.unispace.io +jc.neen.it +cloud.jelastic.open.tim.it +jcloud.kz +upaas.kazteleport.kz +cloudjiffy.net +fra1-de.cloudjiffy.net +west1-us.cloudjiffy.net +jls-sto1.elastx.net +jls-sto2.elastx.net +jls-sto3.elastx.net +faststacks.net +fr-1.paas.massivegrid.net +lon-1.paas.massivegrid.net +lon-2.paas.massivegrid.net +ny-1.paas.massivegrid.net +ny-2.paas.massivegrid.net +sg-1.paas.massivegrid.net +jelastic.saveincloud.net +nordeste-idc.saveincloud.net +j.scaleforce.net +jelastic.tsukaeru.net +sdscloud.pl +unicloud.pl +mircloud.ru +jelastic.regruhosting.ru +enscaled.sg +jele.site +jelastic.team +orangecloud.tn +j.layershift.co.uk +phx.enscaled.us +mircloud.us + +// Jino : https://www.jino.ru +// Submitted by Sergey Ulyashin +myjino.ru +*.hosting.myjino.ru +*.landing.myjino.ru +*.spectrum.myjino.ru +*.vps.myjino.ru + +// Jotelulu S.L. : https://jotelulu.com +// Submitted by Daniel Fariña +jotelulu.cloud + +// Joyent : https://www.joyent.com/ +// Submitted by Brian Bennett +*.triton.zone +*.cns.joyent.com + +// JS.ORG : http://dns.js.org +// Submitted by Stefan Keim +js.org + +// KaasHosting : http://www.kaashosting.nl/ +// Submitted by Wouter Bakker +kaas.gg +khplay.nl + +// Kakao : https://www.kakaocorp.com/ +// Submitted by JaeYoong Lee +ktistory.com + +// Kapsi : https://kapsi.fi +// Submitted by Tomi Juntunen +kapsi.fi + +// Keyweb AG : https://www.keyweb.de +// Submitted by Martin Dannehl +keymachine.de + +// KingHost : https://king.host +// Submitted by Felipe Keller Braz +kinghost.net +uni5.net + +// KnightPoint Systems, LLC : http://www.knightpoint.com/ +// Submitted by Roy Keene +knightpoint.systems + +// KoobinEvent, SL: https://www.koobin.com +// Submitted by Iván Oliva +koobin.events + +// KUROKU LTD : https://kuroku.ltd/ +// Submitted by DisposaBoy +oya.to + +// Katholieke Universiteit Leuven: https://www.kuleuven.be +// Submitted by Abuse KU Leuven +kuleuven.cloud +ezproxy.kuleuven.be + +// .KRD : http://nic.krd/data/krd/Registration%20Policy.pdf +co.krd +edu.krd + +// Krellian Ltd. : https://krellian.com +// Submitted by Ben Francis +krellian.net +webthings.io + +// LCube - Professional hosting e.K. : https://www.lcube-webhosting.de +// Submitted by Lars Laehn +git-repos.de +lcube-server.de +svn-repos.de + +// Leadpages : https://www.leadpages.net +// Submitted by Greg Dallavalle +leadpages.co +lpages.co +lpusercontent.com + +// Lelux.fi : https://lelux.fi/ +// Submitted by Lelux Admin +lelux.site + +// Lifetime Hosting : https://Lifetime.Hosting/ +// Submitted by Mike Fillator +co.business +co.education +co.events +co.financial +co.network +co.place +co.technology + +// Lightmaker Property Manager, Inc. : https://app.lmpm.com/ +// Submitted by Greg Holland +app.lmpm.com + +// linkyard ldt: https://www.linkyard.ch/ +// Submitted by Mario Siegenthaler +linkyard.cloud +linkyard-cloud.ch + +// Linode : https://linode.com +// Submitted by +members.linode.com +*.nodebalancer.linode.com +*.linodeobjects.com +ip.linodeusercontent.com + +// LiquidNet Ltd : http://www.liquidnetlimited.com/ +// Submitted by Victor Velchev +we.bs + +// Localcert : https://localcert.dev +// Submitted by Lann Martin +*.user.localcert.dev + +// localzone.xyz +// Submitted by Kenny Niehage +localzone.xyz + +// Log'in Line : https://www.loginline.com/ +// Submitted by Rémi Mach +loginline.app +loginline.dev +loginline.io +loginline.services +loginline.site + +// Lokalized : https://lokalized.nl +// Submitted by Noah Taheij +servers.run + +// Lõhmus Family, The +// Submitted by Heiki Lõhmus +lohmus.me + +// LubMAN UMCS Sp. z o.o : https://lubman.pl/ +// Submitted by Ireneusz Maliszewski +krasnik.pl +leczna.pl +lubartow.pl +lublin.pl +poniatowa.pl +swidnik.pl + +// Lug.org.uk : https://lug.org.uk +// Submitted by Jon Spriggs +glug.org.uk +lug.org.uk +lugs.org.uk + +// Lukanet Ltd : https://lukanet.com +// Submitted by Anton Avramov +barsy.bg +barsy.co.uk +barsyonline.co.uk +barsycenter.com +barsyonline.com +barsy.club +barsy.de +barsy.eu +barsy.in +barsy.info +barsy.io +barsy.me +barsy.menu +barsy.mobi +barsy.net +barsy.online +barsy.org +barsy.pro +barsy.pub +barsy.ro +barsy.shop +barsy.site +barsy.support +barsy.uk + +// Magento Commerce +// Submitted by Damien Tournoud +*.magentosite.cloud + +// May First - People Link : https://mayfirst.org/ +// Submitted by Jamie McClelland +mayfirst.info +mayfirst.org + +// Mail.Ru Group : https://hb.cldmail.ru +// Submitted by Ilya Zaretskiy +hb.cldmail.ru + +// Mail Transfer Platform : https://www.neupeer.com +// Submitted by Li Hui +cn.vu + +// Maze Play: https://www.mazeplay.com +// Submitted by Adam Humpherys +mazeplay.com + +// mcpe.me : https://mcpe.me +// Submitted by Noa Heyl +mcpe.me + +// McHost : https://mchost.ru +// Submitted by Evgeniy Subbotin +mcdir.me +mcdir.ru +mcpre.ru +vps.mcdir.ru + +// Mediatech : https://mediatech.by +// Submitted by Evgeniy Kozhuhovskiy +mediatech.by +mediatech.dev + +// Medicom Health : https://medicomhealth.com +// Submitted by Michael Olson +hra.health + +// Memset hosting : https://www.memset.com +// Submitted by Tom Whitwell +miniserver.com +memset.net + +// MetaCentrum, CESNET z.s.p.o. : https://www.metacentrum.cz/en/ +// Submitted by Zdeněk Šustr +*.cloud.metacentrum.cz +custom.metacentrum.cz + +// MetaCentrum, CESNET z.s.p.o. : https://www.metacentrum.cz/en/ +// Submitted by Radim Janča +flt.cloud.muni.cz +usr.cloud.muni.cz + +// Meteor Development Group : https://www.meteor.com/hosting +// Submitted by Pierre Carrier +meteorapp.com +eu.meteorapp.com + +// Michau Enterprises Limited : http://www.co.pl/ +co.pl + +// Microsoft Corporation : http://microsoft.com +// Submitted by Mitch Webster +*.azurecontainer.io +azurewebsites.net +azure-mobile.net +cloudapp.net +azurestaticapps.net +centralus.azurestaticapps.net +eastasia.azurestaticapps.net +eastus2.azurestaticapps.net +westeurope.azurestaticapps.net +westus2.azurestaticapps.net + +// minion.systems : http://minion.systems +// Submitted by Robert Böttinger +csx.cc + +// Mintere : https://mintere.com/ +// Submitted by Ben Aubin +mintere.site + +// MobileEducation, LLC : https://joinforte.com +// Submitted by Grayson Martin +forte.id + +// Mozilla Corporation : https://mozilla.com +// Submitted by Ben Francis +mozilla-iot.org + +// Mozilla Foundation : https://mozilla.org/ +// Submitted by glob +bmoattachments.org + +// MSK-IX : https://www.msk-ix.ru/ +// Submitted by Khannanov Roman +net.ru +org.ru +pp.ru + +// Mythic Beasts : https://www.mythic-beasts.com +// Submitted by Paul Cammish +hostedpi.com +customer.mythic-beasts.com +caracal.mythic-beasts.com +fentiger.mythic-beasts.com +lynx.mythic-beasts.com +ocelot.mythic-beasts.com +oncilla.mythic-beasts.com +onza.mythic-beasts.com +sphinx.mythic-beasts.com +vs.mythic-beasts.com +x.mythic-beasts.com +yali.mythic-beasts.com +cust.retrosnub.co.uk + +// Nabu Casa : https://www.nabucasa.com +// Submitted by Paulus Schoutsen +ui.nabu.casa + +// Names.of.London : https://names.of.london/ +// Submitted by James Stevens or +pony.club +of.fashion +in.london +of.london +from.marketing +with.marketing +for.men +repair.men +and.mom +for.mom +for.one +under.one +for.sale +that.win +from.work +to.work + +// Net at Work Gmbh : https://www.netatwork.de +// Submitted by Jan Jaeschke +cloud.nospamproxy.com + +// Netlify : https://www.netlify.com +// Submitted by Jessica Parsons +netlify.app + +// Neustar Inc. +// Submitted by Trung Tran +4u.com + +// ngrok : https://ngrok.com/ +// Submitted by Alan Shreve +ngrok.io + +// Nimbus Hosting Ltd. : https://www.nimbushosting.co.uk/ +// Submitted by Nicholas Ford +nh-serv.co.uk + +// NFSN, Inc. : https://www.NearlyFreeSpeech.NET/ +// Submitted by Jeff Wheelhouse +nfshost.com + +// Noop : https://noop.app +// Submitted by Nathaniel Schweinberg +*.developer.app +noop.app + +// Northflank Ltd. : https://northflank.com/ +// Submitted by Marco Suter +*.northflank.app +*.build.run +*.code.run +*.database.run +*.migration.run + +// Noticeable : https://noticeable.io +// Submitted by Laurent Pellegrino +noticeable.news + +// Now-DNS : https://now-dns.com +// Submitted by Steve Russell +dnsking.ch +mypi.co +n4t.co +001www.com +ddnslive.com +myiphost.com +forumz.info +16-b.it +32-b.it +64-b.it +soundcast.me +tcp4.me +dnsup.net +hicam.net +now-dns.net +ownip.net +vpndns.net +dynserv.org +now-dns.org +x443.pw +now-dns.top +ntdll.top +freeddns.us +crafting.xyz +zapto.xyz + +// nsupdate.info : https://www.nsupdate.info/ +// Submitted by Thomas Waldmann +nsupdate.info +nerdpol.ovh + +// No-IP.com : https://noip.com/ +// Submitted by Deven Reza +blogsyte.com +brasilia.me +cable-modem.org +ciscofreak.com +collegefan.org +couchpotatofries.org +damnserver.com +ddns.me +ditchyourip.com +dnsfor.me +dnsiskinky.com +dvrcam.info +dynns.com +eating-organic.net +fantasyleague.cc +geekgalaxy.com +golffan.us +health-carereform.com +homesecuritymac.com +homesecuritypc.com +hopto.me +ilovecollege.info +loginto.me +mlbfan.org +mmafan.biz +myactivedirectory.com +mydissent.net +myeffect.net +mymediapc.net +mypsx.net +mysecuritycamera.com +mysecuritycamera.net +mysecuritycamera.org +net-freaks.com +nflfan.org +nhlfan.net +no-ip.ca +no-ip.co.uk +no-ip.net +noip.us +onthewifi.com +pgafan.net +point2this.com +pointto.us +privatizehealthinsurance.net +quicksytes.com +read-books.org +securitytactics.com +serveexchange.com +servehumour.com +servep2p.com +servesarcasm.com +stufftoread.com +ufcfan.org +unusualperson.com +workisboring.com +3utilities.com +bounceme.net +ddns.net +ddnsking.com +gotdns.ch +hopto.org +myftp.biz +myftp.org +myvnc.com +no-ip.biz +no-ip.info +no-ip.org +noip.me +redirectme.net +servebeer.com +serveblog.net +servecounterstrike.com +serveftp.com +servegame.com +servehalflife.com +servehttp.com +serveirc.com +serveminecraft.net +servemp3.com +servepics.com +servequake.com +sytes.net +webhop.me +zapto.org + +// NodeArt : https://nodeart.io +// Submitted by Konstantin Nosov +stage.nodeart.io + +// Nucleos Inc. : https://nucleos.com +// Submitted by Piotr Zduniak +pcloud.host + +// NYC.mn : http://www.information.nyc.mn +// Submitted by Matthew Brown +nyc.mn + +// Observable, Inc. : https://observablehq.com +// Submitted by Mike Bostock +static.observableusercontent.com + +// Octopodal Solutions, LLC. : https://ulterius.io/ +// Submitted by Andrew Sampson +cya.gg + +// OMG.LOL : +// Submitted by Adam Newbold +omg.lol + +// Omnibond Systems, LLC. : https://www.omnibond.com +// Submitted by Cole Estep +cloudycluster.net + +// OmniWe Limited: https://omniwe.com +// Submitted by Vicary Archangel +omniwe.site + +// One.com: https://www.one.com/ +// Submitted by Jacob Bunk Nielsen +service.one + +// One Fold Media : http://www.onefoldmedia.com/ +// Submitted by Eddie Jones +nid.io + +// Open Social : https://www.getopensocial.com/ +// Submitted by Alexander Varwijk +opensocial.site + +// OpenCraft GmbH : http://opencraft.com/ +// Submitted by Sven Marnach +opencraft.hosting + +// OpenResearch GmbH: https://openresearch.com/ +// Submitted by Philipp Schmid +orsites.com + +// Opera Software, A.S.A. +// Submitted by Yngve Pettersen +operaunite.com + +// Orange : https://www.orange.com +// Submitted by Alexandre Linte +tech.orange + +// Oursky Limited : https://authgear.com/, https://skygear.io/ +// Submitted by Authgear Team , Skygear Developer +authgear-staging.com +authgearapps.com +skygearapp.com + +// OutSystems +// Submitted by Duarte Santos +outsystemscloud.com + +// OVHcloud: https://ovhcloud.com +// Submitted by Vincent Cassé +*.webpaas.ovh.net +*.hosting.ovh.net + +// OwnProvider GmbH: http://www.ownprovider.com +// Submitted by Jan Moennich +ownprovider.com +own.pm + +// OwO : https://whats-th.is/ +// Submitted by Dean Sheather +*.owo.codes + +// OX : http://www.ox.rs +// Submitted by Adam Grand +ox.rs + +// oy.lc +// Submitted by Charly Coste +oy.lc + +// Pagefog : https://pagefog.com/ +// Submitted by Derek Myers +pgfog.com + +// Pagefront : https://www.pagefronthq.com/ +// Submitted by Jason Kriss +pagefrontapp.com + +// PageXL : https://pagexl.com +// Submitted by Yann Guichard +pagexl.com + +// Paywhirl, Inc : https://paywhirl.com/ +// Submitted by Daniel Netzer +*.paywhirl.com + +// pcarrier.ca Software Inc: https://pcarrier.ca/ +// Submitted by Pierre Carrier +bar0.net +bar1.net +bar2.net +rdv.to + +// .pl domains (grandfathered) +art.pl +gliwice.pl +krakow.pl +poznan.pl +wroc.pl +zakopane.pl + +// Pantheon Systems, Inc. : https://pantheon.io/ +// Submitted by Gary Dylina +pantheonsite.io +gotpantheon.com + +// Peplink | Pepwave : http://peplink.com/ +// Submitted by Steve Leung +mypep.link + +// Perspecta : https://perspecta.com/ +// Submitted by Kenneth Van Alstyne +perspecta.cloud + +// PE Ulyanov Kirill Sergeevich : https://airy.host +// Submitted by Kirill Ulyanov +lk3.ru + +// Planet-Work : https://www.planet-work.com/ +// Submitted by Frédéric VANNIÈRE +on-web.fr + +// Platform.sh : https://platform.sh +// Submitted by Nikola Kotur +bc.platform.sh +ent.platform.sh +eu.platform.sh +us.platform.sh +*.platformsh.site +*.tst.site + +// Platter: https://platter.dev +// Submitted by Patrick Flor +platter-app.com +platter-app.dev +platterp.us + +// Plesk : https://www.plesk.com/ +// Submitted by Anton Akhtyamov +pdns.page +plesk.page +pleskns.com + +// Port53 : https://port53.io/ +// Submitted by Maximilian Schieder +dyn53.io + +// Porter : https://porter.run/ +// Submitted by Rudraksh MK +onporter.run + +// Positive Codes Technology Company : http://co.bn/faq.html +// Submitted by Zulfais +co.bn + +// Postman, Inc : https://postman.com +// Submitted by Rahul Dhawan +postman-echo.com +pstmn.io +mock.pstmn.io +httpbin.org + +//prequalifyme.today : https://prequalifyme.today +//Submitted by DeepakTiwari deepak@ivylead.io +prequalifyme.today + +// prgmr.com : https://prgmr.com/ +// Submitted by Sarah Newman +xen.prgmr.com + +// priv.at : http://www.nic.priv.at/ +// Submitted by registry +priv.at + +// privacytools.io : https://www.privacytools.io/ +// Submitted by Jonah Aragon +prvcy.page + +// Protocol Labs : https://protocol.ai/ +// Submitted by Michael Burns +*.dweb.link + +// Protonet GmbH : http://protonet.io +// Submitted by Martin Meier +protonet.io + +// Publication Presse Communication SARL : https://ppcom.fr +// Submitted by Yaacov Akiba Slama +chirurgiens-dentistes-en-france.fr +byen.site + +// pubtls.org: https://www.pubtls.org +// Submitted by Kor Nielsen +pubtls.org + +// PythonAnywhere LLP: https://www.pythonanywhere.com +// Submitted by Giles Thomas +pythonanywhere.com +eu.pythonanywhere.com + +// QOTO, Org. +// Submitted by Jeffrey Phillips Freeman +qoto.io + +// Qualifio : https://qualifio.com/ +// Submitted by Xavier De Cock +qualifioapp.com + +// QuickBackend: https://www.quickbackend.com +// Submitted by Dani Biro +qbuser.com + +// Rad Web Hosting: https://radwebhosting.com +// Submitted by Scott Claeys +cloudsite.builders + +// Redgate Software: https://red-gate.com +// Submitted by Andrew Farries +instances.spawn.cc + +// Redstar Consultants : https://www.redstarconsultants.com/ +// Submitted by Jons Slemmer +instantcloud.cn + +// Russian Academy of Sciences +// Submitted by Tech Support +ras.ru + +// QA2 +// Submitted by Daniel Dent (https://www.danieldent.com/) +qa2.com + +// QCX +// Submitted by Cassandra Beelen +qcx.io +*.sys.qcx.io + +// QNAP System Inc : https://www.qnap.com +// Submitted by Nick Chang +dev-myqnapcloud.com +alpha-myqnapcloud.com +myqnapcloud.com + +// Quip : https://quip.com +// Submitted by Patrick Linehan +*.quipelements.com + +// Qutheory LLC : http://qutheory.io +// Submitted by Jonas Schwartz +vapor.cloud +vaporcloud.io + +// Rackmaze LLC : https://www.rackmaze.com +// Submitted by Kirill Pertsev +rackmaze.com +rackmaze.net + +// Rakuten Games, Inc : https://dev.viberplay.io +// Submitted by Joshua Zhang +g.vbrplsbx.io + +// Rancher Labs, Inc : https://rancher.com +// Submitted by Vincent Fiduccia +*.on-k3s.io +*.on-rancher.cloud +*.on-rio.io + +// Read The Docs, Inc : https://www.readthedocs.org +// Submitted by David Fischer +readthedocs.io + +// Red Hat, Inc. OpenShift : https://openshift.redhat.com/ +// Submitted by Tim Kramer +rhcloud.com + +// Render : https://render.com +// Submitted by Anurag Goel +app.render.com +onrender.com + +// Repl.it : https://repl.it +// Submitted by Mason Clayton +repl.co +id.repl.co +repl.run + +// Resin.io : https://resin.io +// Submitted by Tim Perry +resindevice.io +devices.resinstaging.io + +// RethinkDB : https://www.rethinkdb.com/ +// Submitted by Chris Kastorff +hzc.io + +// Revitalised Limited : http://www.revitalised.co.uk +// Submitted by Jack Price +wellbeingzone.eu +wellbeingzone.co.uk + +// Rico Developments Limited : https://adimo.co +// Submitted by Colin Brown +adimo.co.uk + +// Riseup Networks : https://riseup.net +// Submitted by Micah Anderson +itcouldbewor.se + +// Rochester Institute of Technology : http://www.rit.edu/ +// Submitted by Jennifer Herting +git-pages.rit.edu + +// Rocky Enterprise Software Foundation : https://resf.org +// Submitted by Neil Hanlon +rocky.page + +// Rusnames Limited: http://rusnames.ru/ +// Submitted by Sergey Zotov +биз.рус +ком.рус +крым.рус +мир.рус +мск.рус +орг.рус +самара.рус +сочи.рус +спб.рус +я.рус + +// Sandstorm Development Group, Inc. : https://sandcats.io/ +// Submitted by Asheesh Laroia +sandcats.io + +// SBE network solutions GmbH : https://www.sbe.de/ +// Submitted by Norman Meilick +logoip.de +logoip.com + +// Scaleway : https://www.scaleway.com/ +// Submitted by Rémy Léone +fr-par-1.baremetal.scw.cloud +fr-par-2.baremetal.scw.cloud +nl-ams-1.baremetal.scw.cloud +fnc.fr-par.scw.cloud +functions.fnc.fr-par.scw.cloud +k8s.fr-par.scw.cloud +nodes.k8s.fr-par.scw.cloud +s3.fr-par.scw.cloud +s3-website.fr-par.scw.cloud +whm.fr-par.scw.cloud +priv.instances.scw.cloud +pub.instances.scw.cloud +k8s.scw.cloud +k8s.nl-ams.scw.cloud +nodes.k8s.nl-ams.scw.cloud +s3.nl-ams.scw.cloud +s3-website.nl-ams.scw.cloud +whm.nl-ams.scw.cloud +k8s.pl-waw.scw.cloud +nodes.k8s.pl-waw.scw.cloud +s3.pl-waw.scw.cloud +s3-website.pl-waw.scw.cloud +scalebook.scw.cloud +smartlabeling.scw.cloud +dedibox.fr + +// schokokeks.org GbR : https://schokokeks.org/ +// Submitted by Hanno Böck +schokokeks.net + +// Scottish Government: https://www.gov.scot +// Submitted by Martin Ellis +gov.scot +service.gov.scot + +// Scry Security : http://www.scrysec.com +// Submitted by Shante Adam +scrysec.com + +// Securepoint GmbH : https://www.securepoint.de +// Submitted by Erik Anders +firewall-gateway.com +firewall-gateway.de +my-gateway.de +my-router.de +spdns.de +spdns.eu +firewall-gateway.net +my-firewall.org +myfirewall.org +spdns.org + +// Seidat : https://www.seidat.com +// Submitted by Artem Kondratev +seidat.net + +// Sellfy : https://sellfy.com +// Submitted by Yuriy Romadin +sellfy.store + +// Senseering GmbH : https://www.senseering.de +// Submitted by Felix Mönckemeyer +senseering.net + +// Sendmsg: https://www.sendmsg.co.il +// Submitted by Assaf Stern +minisite.ms + +// Service Magnet : https://myservicemagnet.com +// Submitted by Dave Sanders +magnet.page + +// Service Online LLC : http://drs.ua/ +// Submitted by Serhii Bulakh +biz.ua +co.ua +pp.ua + +// Shift Crypto AG : https://shiftcrypto.ch +// Submitted by alex +shiftcrypto.dev +shiftcrypto.io + +// ShiftEdit : https://shiftedit.net/ +// Submitted by Adam Jimenez +shiftedit.io + +// Shopblocks : http://www.shopblocks.com/ +// Submitted by Alex Bowers +myshopblocks.com + +// Shopify : https://www.shopify.com +// Submitted by Alex Richter +myshopify.com + +// Shopit : https://www.shopitcommerce.com/ +// Submitted by Craig McMahon +shopitsite.com + +// shopware AG : https://shopware.com +// Submitted by Jens Küper +shopware.store + +// Siemens Mobility GmbH +// Submitted by Oliver Graebner +mo-siemens.io + +// SinaAppEngine : http://sae.sina.com.cn/ +// Submitted by SinaAppEngine +1kapp.com +appchizi.com +applinzi.com +sinaapp.com +vipsinaapp.com + +// Siteleaf : https://www.siteleaf.com/ +// Submitted by Skylar Challand +siteleaf.net + +// Skyhat : http://www.skyhat.io +// Submitted by Shante Adam +bounty-full.com +alpha.bounty-full.com +beta.bounty-full.com + +// Small Technology Foundation : https://small-tech.org +// Submitted by Aral Balkan +small-web.org + +// Smoove.io : https://www.smoove.io/ +// Submitted by Dan Kozak +vp4.me + +// Snowplow Analytics : https://snowplowanalytics.com/ +// Submitted by Ian Streeter +try-snowplow.com + +// SourceHut : https://sourcehut.org +// Submitted by Drew DeVault +srht.site + +// Stackhero : https://www.stackhero.io +// Submitted by Adrien Gillon +stackhero-network.com + +// Staclar : https://staclar.com +// Submitted by Q Misell +musician.io +// Submitted by Matthias Merkel +novecore.site + +// staticland : https://static.land +// Submitted by Seth Vincent +static.land +dev.static.land +sites.static.land + +// Storebase : https://www.storebase.io +// Submitted by Tony Schirmer +storebase.store + +// Strategic System Consulting (eApps Hosting): https://www.eapps.com/ +// Submitted by Alex Oancea +vps-host.net +atl.jelastic.vps-host.net +njs.jelastic.vps-host.net +ric.jelastic.vps-host.net + +// Sony Interactive Entertainment LLC : https://sie.com/ +// Submitted by David Coles +playstation-cloud.com + +// SourceLair PC : https://www.sourcelair.com +// Submitted by Antonis Kalipetis +apps.lair.io +*.stolos.io + +// SpaceKit : https://www.spacekit.io/ +// Submitted by Reza Akhavan +spacekit.io + +// SpeedPartner GmbH: https://www.speedpartner.de/ +// Submitted by Stefan Neufeind +customer.speedpartner.de + +// Spreadshop (sprd.net AG) : https://www.spreadshop.com/ +// Submitted by Martin Breest +myspreadshop.at +myspreadshop.com.au +myspreadshop.be +myspreadshop.ca +myspreadshop.ch +myspreadshop.com +myspreadshop.de +myspreadshop.dk +myspreadshop.es +myspreadshop.fi +myspreadshop.fr +myspreadshop.ie +myspreadshop.it +myspreadshop.net +myspreadshop.nl +myspreadshop.no +myspreadshop.pl +myspreadshop.se +myspreadshop.co.uk + +// Standard Library : https://stdlib.com +// Submitted by Jacob Lee +api.stdlib.com + +// Storj Labs Inc. : https://storj.io/ +// Submitted by Philip Hutchins +storj.farm + +// Studenten Net Twente : http://www.snt.utwente.nl/ +// Submitted by Silke Hofstra +utwente.io + +// Student-Run Computing Facility : https://www.srcf.net/ +// Submitted by Edwin Balani +soc.srcf.net +user.srcf.net + +// Sub 6 Limited: http://www.sub6.com +// Submitted by Dan Miller +temp-dns.com + +// Supabase : https://supabase.io +// Submitted by Inian Parameshwaran +supabase.co +supabase.in +supabase.net +su.paba.se + +// Symfony, SAS : https://symfony.com/ +// Submitted by Fabien Potencier +*.s5y.io +*.sensiosite.cloud + +// Syncloud : https://syncloud.org +// Submitted by Boris Rybalkin +syncloud.it + +// Synology, Inc. : https://www.synology.com/ +// Submitted by Rony Weng +dscloud.biz +direct.quickconnect.cn +dsmynas.com +familyds.com +diskstation.me +dscloud.me +i234.me +myds.me +synology.me +dscloud.mobi +dsmynas.net +familyds.net +dsmynas.org +familyds.org +vpnplus.to +direct.quickconnect.to + +// Tabit Technologies Ltd. : https://tabit.cloud/ +// Submitted by Oren Agiv +tabitorder.co.il + +// TAIFUN Software AG : http://taifun-software.de +// Submitted by Bjoern Henke +taifun-dns.de + +// Tailscale Inc. : https://www.tailscale.com +// Submitted by David Anderson +beta.tailscale.net +ts.net + +// TASK geographical domains (www.task.gda.pl/uslugi/dns) +gda.pl +gdansk.pl +gdynia.pl +med.pl +sopot.pl + +// team.blue https://team.blue +// Submitted by Cedric Dubois +site.tb-hosting.com + +// Teckids e.V. : https://www.teckids.org +// Submitted by Dominik George +edugit.io +s3.teckids.org + +// Telebit : https://telebit.cloud +// Submitted by AJ ONeal +telebit.app +telebit.io +*.telebit.xyz + +// The Gwiddle Foundation : https://gwiddlefoundation.org.uk +// Submitted by Joshua Bayfield +gwiddle.co.uk + +// Thingdust AG : https://thingdust.com/ +// Submitted by Adrian Imboden +*.firenet.ch +*.svc.firenet.ch +reservd.com +thingdustdata.com +cust.dev.thingdust.io +cust.disrec.thingdust.io +cust.prod.thingdust.io +cust.testing.thingdust.io +reservd.dev.thingdust.io +reservd.disrec.thingdust.io +reservd.testing.thingdust.io + +// ticket i/O GmbH : https://ticket.io +// Submitted by Christian Franke +tickets.io + +// Tlon.io : https://tlon.io +// Submitted by Mark Staarink +arvo.network +azimuth.network +tlon.network + +// Tor Project, Inc. : https://torproject.org +// Submitted by Antoine Beaupré +bloxcms.com +townnews-staging.com + +// TradableBits: https://tradablebits.com +// Submitted by Dmitry Khrisanov dmitry@tradablebits.com +tbits.me + +// TrafficPlex GmbH : https://www.trafficplex.de/ +// Submitted by Phillipp Röll +12hp.at +2ix.at +4lima.at +lima-city.at +12hp.ch +2ix.ch +4lima.ch +lima-city.ch +trafficplex.cloud +de.cool +12hp.de +2ix.de +4lima.de +lima-city.de +1337.pictures +clan.rip +lima-city.rocks +webspace.rocks +lima.zone + +// TransIP : https://www.transip.nl +// Submitted by Rory Breuk +*.transurl.be +*.transurl.eu +*.transurl.nl + +// TransIP: https://www.transip.nl +// Submitted by Cedric Dubois +site.transip.me + +// TuxFamily : http://tuxfamily.org +// Submitted by TuxFamily administrators +tuxfamily.org + +// TwoDNS : https://www.twodns.de/ +// Submitted by TwoDNS-Support +dd-dns.de +diskstation.eu +diskstation.org +dray-dns.de +draydns.de +dyn-vpn.de +dynvpn.de +mein-vigor.de +my-vigor.de +my-wan.de +syno-ds.de +synology-diskstation.de +synology-ds.de + +// Typedream : https://typedream.com +// Submitted by Putri Karunia +typedream.app + +// Typeform : https://www.typeform.com +// Submitted by Sergi Ferriz +pro.typeform.com + +// Uberspace : https://uberspace.de +// Submitted by Moritz Werner +uber.space +*.uberspace.de + +// UDR Limited : http://www.udr.hk.com +// Submitted by registry +hk.com +hk.org +ltd.hk +inc.hk + +// United Gameserver GmbH : https://united-gameserver.de +// Submitted by Stefan Schwarz +virtualuser.de +virtual-user.de + +// Upli : https://upli.io +// Submitted by Lenny Bakkalian +upli.io + +// urown.net : https://urown.net +// Submitted by Hostmaster +urown.cloud +dnsupdate.info + +// .US +// Submitted by Ed Moore +lib.de.us + +// VeryPositive SIA : http://very.lv +// Submitted by Danko Aleksejevs +2038.io + +// Vercel, Inc : https://vercel.com/ +// Submitted by Connor Davis +vercel.app +vercel.dev +now.sh + +// Viprinet Europe GmbH : http://www.viprinet.com +// Submitted by Simon Kissel +router.management + +// Virtual-Info : https://www.virtual-info.info/ +// Submitted by Adnan RIHAN +v-info.info + +// Voorloper.com: https://voorloper.com +// Submitted by Nathan van Bakel +voorloper.cloud + +// Voxel.sh DNS : https://voxel.sh/dns/ +// Submitted by Mia Rehlinger +neko.am +nyaa.am +be.ax +cat.ax +es.ax +eu.ax +gg.ax +mc.ax +us.ax +xy.ax +nl.ci +xx.gl +app.gp +blog.gt +de.gt +to.gt +be.gy +cc.hn +blog.kg +io.kg +jp.kg +tv.kg +uk.kg +us.kg +de.ls +at.md +de.md +jp.md +to.md +indie.porn +vxl.sh +ch.tc +me.tc +we.tc +nyan.to +at.vg +blog.vu +dev.vu +me.vu + +// V.UA Domain Administrator : https://domain.v.ua/ +// Submitted by Serhii Rostilo +v.ua + +// Vultr Objects : https://www.vultr.com/products/object-storage/ +// Submitted by Niels Maumenee +*.vultrobjects.com + +// Waffle Computer Inc., Ltd. : https://docs.waffleinfo.com +// Submitted by Masayuki Note +wafflecell.com + +// WebHare bv: https://www.webhare.com/ +// Submitted by Arnold Hendriks +*.webhare.dev + +// WebHotelier Technologies Ltd: https://www.webhotelier.net/ +// Submitted by Apostolos Tsakpinis +reserve-online.net +reserve-online.com +bookonline.app +hotelwithflight.com + +// WeDeploy by Liferay, Inc. : https://www.wedeploy.com +// Submitted by Henrique Vicente +wedeploy.io +wedeploy.me +wedeploy.sh + +// Western Digital Technologies, Inc : https://www.wdc.com +// Submitted by Jung Jin +remotewd.com + +// WIARD Enterprises : https://wiardweb.com +// Submitted by Kidd Hustle +pages.wiardweb.com + +// Wikimedia Labs : https://wikitech.wikimedia.org +// Submitted by Arturo Borrero Gonzalez +wmflabs.org +toolforge.org +wmcloud.org + +// WISP : https://wisp.gg +// Submitted by Stepan Fedotov +panel.gg +daemon.panel.gg + +// Wizard Zines : https://wizardzines.com +// Submitted by Julia Evans +messwithdns.com + +// WoltLab GmbH : https://www.woltlab.com +// Submitted by Tim Düsterhus +woltlab-demo.com +myforum.community +community-pro.de +diskussionsbereich.de +community-pro.net +meinforum.net + +// Woods Valldata : https://www.woodsvalldata.co.uk/ +// Submitted by Chris Whittle +affinitylottery.org.uk +raffleentry.org.uk +weeklylottery.org.uk + +// WP Engine : https://wpengine.com/ +// Submitted by Michael Smith +// Submitted by Brandon DuRette +wpenginepowered.com +js.wpenginepowered.com + +// Wix.com, Inc. : https://www.wix.com +// Submitted by Shahar Talmi +wixsite.com +editorx.io + +// XenonCloud GbR: https://xenoncloud.net +// Submitted by Julian Uphoff +half.host + +// XnBay Technology : http://www.xnbay.com/ +// Submitted by XnBay Developer +xnbay.com +u2.xnbay.com +u2-local.xnbay.com + +// XS4ALL Internet bv : https://www.xs4all.nl/ +// Submitted by Daniel Mostertman +cistron.nl +demon.nl +xs4all.space + +// Yandex.Cloud LLC: https://cloud.yandex.com +// Submitted by Alexander Lodin +yandexcloud.net +storage.yandexcloud.net +website.yandexcloud.net + +// YesCourse Pty Ltd : https://yescourse.com +// Submitted by Atul Bhouraskar +official.academy + +// Yola : https://www.yola.com/ +// Submitted by Stefano Rivera +yolasite.com + +// Yombo : https://yombo.net +// Submitted by Mitch Schwenk +ybo.faith +yombo.me +homelink.one +ybo.party +ybo.review +ybo.science +ybo.trade + +// Yunohost : https://yunohost.org +// Submitted by Valentin Grimaud +ynh.fr +nohost.me +noho.st + +// ZaNiC : http://www.za.net/ +// Submitted by registry +za.net +za.org + +// Zine EOOD : https://zine.bg/ +// Submitted by Martin Angelov +bss.design + +// Zitcom A/S : https://www.zitcom.dk +// Submitted by Emil Stahl +basicserver.io +virtualserver.io +enterprisecloud.nu + +// ===END PRIVATE DOMAINS=== diff --git a/vendor/bundle/ruby/3.1.0/gems/public_suffix-4.0.7/lib/public_suffix.rb b/vendor/bundle/ruby/3.1.0/gems/public_suffix-4.0.7/lib/public_suffix.rb new file mode 100644 index 000000000..c0f3fab67 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/public_suffix-4.0.7/lib/public_suffix.rb @@ -0,0 +1,177 @@ +# frozen_string_literal: true + +# = Public Suffix +# +# Domain name parser based on the Public Suffix List. +# +# Copyright (c) 2009-2022 Simone Carletti + +require_relative "public_suffix/domain" +require_relative "public_suffix/version" +require_relative "public_suffix/errors" +require_relative "public_suffix/rule" +require_relative "public_suffix/list" + +# PublicSuffix is a Ruby domain name parser based on the Public Suffix List. +# +# The [Public Suffix List](https://publicsuffix.org) is a cross-vendor initiative +# to provide an accurate list of domain name suffixes. +# +# The Public Suffix List is an initiative of the Mozilla Project, +# but is maintained as a community resource. It is available for use in any software, +# but was originally created to meet the needs of browser manufacturers. +module PublicSuffix + + DOT = "." + BANG = "!" + STAR = "*" + + # Parses +name+ and returns the {PublicSuffix::Domain} instance. + # + # @example Parse a valid domain + # PublicSuffix.parse("google.com") + # # => # + # + # @example Parse a valid subdomain + # PublicSuffix.parse("www.google.com") + # # => # + # + # @example Parse a fully qualified domain + # PublicSuffix.parse("google.com.") + # # => # + # + # @example Parse a fully qualified domain (subdomain) + # PublicSuffix.parse("www.google.com.") + # # => # + # + # @example Parse an invalid (unlisted) domain + # PublicSuffix.parse("x.yz") + # # => # + # + # @example Parse an invalid (unlisted) domain with strict checking (without applying the default * rule) + # PublicSuffix.parse("x.yz", default_rule: nil) + # # => PublicSuffix::DomainInvalid: `x.yz` is not a valid domain + # + # @example Parse an URL (not supported, only domains) + # PublicSuffix.parse("http://www.google.com") + # # => PublicSuffix::DomainInvalid: http://www.google.com is not expected to contain a scheme + # + # + # @param name [#to_s] The domain name or fully qualified domain name to parse. + # @param list [PublicSuffix::List] The rule list to search, defaults to the default {PublicSuffix::List} + # @param ignore_private [Boolean] + # @return [PublicSuffix::Domain] + # + # @raise [PublicSuffix::DomainInvalid] If domain is not a valid domain. + # @raise [PublicSuffix::DomainNotAllowed] If a rule for +domain+ is found, but the rule doesn't allow +domain+. + def self.parse(name, list: List.default, default_rule: list.default_rule, ignore_private: false) + what = normalize(name) + raise what if what.is_a?(DomainInvalid) + + rule = list.find(what, default: default_rule, ignore_private: ignore_private) + + # rubocop:disable Style/IfUnlessModifier + if rule.nil? + raise DomainInvalid, "`#{what}` is not a valid domain" + end + if rule.decompose(what).last.nil? + raise DomainNotAllowed, "`#{what}` is not allowed according to Registry policy" + end + + # rubocop:enable Style/IfUnlessModifier + + decompose(what, rule) + end + + # Checks whether +domain+ is assigned and allowed, without actually parsing it. + # + # This method doesn't care whether domain is a domain or subdomain. + # The validation is performed using the default {PublicSuffix::List}. + # + # @example Validate a valid domain + # PublicSuffix.valid?("example.com") + # # => true + # + # @example Validate a valid subdomain + # PublicSuffix.valid?("www.example.com") + # # => true + # + # @example Validate a not-listed domain + # PublicSuffix.valid?("example.tldnotlisted") + # # => true + # + # @example Validate a not-listed domain with strict checking (without applying the default * rule) + # PublicSuffix.valid?("example.tldnotlisted") + # # => true + # PublicSuffix.valid?("example.tldnotlisted", default_rule: nil) + # # => false + # + # @example Validate a fully qualified domain + # PublicSuffix.valid?("google.com.") + # # => true + # PublicSuffix.valid?("www.google.com.") + # # => true + # + # @example Check an URL (which is not a valid domain) + # PublicSuffix.valid?("http://www.example.com") + # # => false + # + # + # @param name [#to_s] The domain name or fully qualified domain name to validate. + # @param ignore_private [Boolean] + # @return [Boolean] + def self.valid?(name, list: List.default, default_rule: list.default_rule, ignore_private: false) + what = normalize(name) + return false if what.is_a?(DomainInvalid) + + rule = list.find(what, default: default_rule, ignore_private: ignore_private) + + !rule.nil? && !rule.decompose(what).last.nil? + end + + # Attempt to parse the name and returns the domain, if valid. + # + # This method doesn't raise. Instead, it returns nil if the domain is not valid for whatever reason. + # + # @param name [#to_s] The domain name or fully qualified domain name to parse. + # @param list [PublicSuffix::List] The rule list to search, defaults to the default {PublicSuffix::List} + # @param ignore_private [Boolean] + # @return [String] + def self.domain(name, **options) + parse(name, **options).domain + rescue PublicSuffix::Error + nil + end + + + # private + + def self.decompose(name, rule) + left, right = rule.decompose(name) + + parts = left.split(DOT) + # If we have 0 parts left, there is just a tld and no domain or subdomain + # If we have 1 part left, there is just a tld, domain and not subdomain + # If we have 2 parts left, the last part is the domain, the other parts (combined) are the subdomain + tld = right + sld = parts.empty? ? nil : parts.pop + trd = parts.empty? ? nil : parts.join(DOT) + + Domain.new(tld, sld, trd) + end + + # Pretend we know how to deal with user input. + def self.normalize(name) + name = name.to_s.dup + name.strip! + name.chomp!(DOT) + name.downcase! + + return DomainInvalid.new("Name is blank") if name.empty? + return DomainInvalid.new("Name starts with a dot") if name.start_with?(DOT) + return DomainInvalid.new("%s is not expected to contain a scheme" % name) if name.include?("://") + + name + end + +end diff --git a/vendor/bundle/ruby/3.1.0/gems/public_suffix-4.0.7/lib/public_suffix/domain.rb b/vendor/bundle/ruby/3.1.0/gems/public_suffix-4.0.7/lib/public_suffix/domain.rb new file mode 100644 index 000000000..f7a9c4941 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/public_suffix-4.0.7/lib/public_suffix/domain.rb @@ -0,0 +1,235 @@ +# frozen_string_literal: true + +# = Public Suffix +# +# Domain name parser based on the Public Suffix List. +# +# Copyright (c) 2009-2022 Simone Carletti + +module PublicSuffix + + # Domain represents a domain name, composed by a TLD, SLD and TRD. + class Domain + + # Splits a string into the labels, that is the dot-separated parts. + # + # The input is not validated, but it is assumed to be a valid domain name. + # + # @example + # + # name_to_labels('example.com') + # # => ['example', 'com'] + # + # name_to_labels('example.co.uk') + # # => ['example', 'co', 'uk'] + # + # @param name [String, #to_s] The domain name to split. + # @return [Array] + def self.name_to_labels(name) + name.to_s.split(DOT) + end + + + attr_reader :tld, :sld, :trd + + # Creates and returns a new {PublicSuffix::Domain} instance. + # + # @overload initialize(tld) + # Initializes with a +tld+. + # @param [String] tld The TLD (extension) + # @overload initialize(tld, sld) + # Initializes with a +tld+ and +sld+. + # @param [String] tld The TLD (extension) + # @param [String] sld The TRD (domain) + # @overload initialize(tld, sld, trd) + # Initializes with a +tld+, +sld+ and +trd+. + # @param [String] tld The TLD (extension) + # @param [String] sld The SLD (domain) + # @param [String] trd The TRD (subdomain) + # + # @yield [self] Yields on self. + # @yieldparam [PublicSuffix::Domain] self The newly creates instance + # + # @example Initialize with a TLD + # PublicSuffix::Domain.new("com") + # # => # + # + # @example Initialize with a TLD and SLD + # PublicSuffix::Domain.new("com", "example") + # # => # + # + # @example Initialize with a TLD, SLD and TRD + # PublicSuffix::Domain.new("com", "example", "wwww") + # # => # + # + def initialize(*args) + @tld, @sld, @trd = args + yield(self) if block_given? + end + + # Returns a string representation of this object. + # + # @return [String] + def to_s + name + end + + # Returns an array containing the domain parts. + # + # @return [Array] + # + # @example + # + # PublicSuffix::Domain.new("google.com").to_a + # # => [nil, "google", "com"] + # + # PublicSuffix::Domain.new("www.google.com").to_a + # # => [nil, "google", "com"] + # + def to_a + [@trd, @sld, @tld] + end + + # Returns the full domain name. + # + # @return [String] + # + # @example Gets the domain name of a domain + # PublicSuffix::Domain.new("com", "google").name + # # => "google.com" + # + # @example Gets the domain name of a subdomain + # PublicSuffix::Domain.new("com", "google", "www").name + # # => "www.google.com" + # + def name + [@trd, @sld, @tld].compact.join(DOT) + end + + # Returns a domain-like representation of this object + # if the object is a {#domain?}, nil otherwise. + # + # PublicSuffix::Domain.new("com").domain + # # => nil + # + # PublicSuffix::Domain.new("com", "google").domain + # # => "google.com" + # + # PublicSuffix::Domain.new("com", "google", "www").domain + # # => "www.google.com" + # + # This method doesn't validate the input. It handles the domain + # as a valid domain name and simply applies the necessary transformations. + # + # This method returns a FQD, not just the domain part. + # To get the domain part, use #sld (aka second level domain). + # + # PublicSuffix::Domain.new("com", "google", "www").domain + # # => "google.com" + # + # PublicSuffix::Domain.new("com", "google", "www").sld + # # => "google" + # + # @see #domain? + # @see #subdomain + # + # @return [String] + def domain + [@sld, @tld].join(DOT) if domain? + end + + # Returns a subdomain-like representation of this object + # if the object is a {#subdomain?}, nil otherwise. + # + # PublicSuffix::Domain.new("com").subdomain + # # => nil + # + # PublicSuffix::Domain.new("com", "google").subdomain + # # => nil + # + # PublicSuffix::Domain.new("com", "google", "www").subdomain + # # => "www.google.com" + # + # This method doesn't validate the input. It handles the domain + # as a valid domain name and simply applies the necessary transformations. + # + # This method returns a FQD, not just the subdomain part. + # To get the subdomain part, use #trd (aka third level domain). + # + # PublicSuffix::Domain.new("com", "google", "www").subdomain + # # => "www.google.com" + # + # PublicSuffix::Domain.new("com", "google", "www").trd + # # => "www" + # + # @see #subdomain? + # @see #domain + # + # @return [String] + def subdomain + [@trd, @sld, @tld].join(DOT) if subdomain? + end + + # Checks whether self looks like a domain. + # + # This method doesn't actually validate the domain. + # It only checks whether the instance contains + # a value for the {#tld} and {#sld} attributes. + # + # @example + # + # PublicSuffix::Domain.new("com").domain? + # # => false + # + # PublicSuffix::Domain.new("com", "google").domain? + # # => true + # + # PublicSuffix::Domain.new("com", "google", "www").domain? + # # => true + # + # # This is an invalid domain, but returns true + # # because this method doesn't validate the content. + # PublicSuffix::Domain.new("com", nil).domain? + # # => true + # + # @see #subdomain? + # + # @return [Boolean] + def domain? + !(@tld.nil? || @sld.nil?) + end + + # Checks whether self looks like a subdomain. + # + # This method doesn't actually validate the subdomain. + # It only checks whether the instance contains + # a value for the {#tld}, {#sld} and {#trd} attributes. + # If you also want to validate the domain, + # use {#valid_subdomain?} instead. + # + # @example + # + # PublicSuffix::Domain.new("com").subdomain? + # # => false + # + # PublicSuffix::Domain.new("com", "google").subdomain? + # # => false + # + # PublicSuffix::Domain.new("com", "google", "www").subdomain? + # # => true + # + # # This is an invalid domain, but returns true + # # because this method doesn't validate the content. + # PublicSuffix::Domain.new("com", "example", nil).subdomain? + # # => true + # + # @see #domain? + # + # @return [Boolean] + def subdomain? + !(@tld.nil? || @sld.nil? || @trd.nil?) + end + + end + +end diff --git a/vendor/bundle/ruby/3.1.0/gems/public_suffix-4.0.7/lib/public_suffix/errors.rb b/vendor/bundle/ruby/3.1.0/gems/public_suffix-4.0.7/lib/public_suffix/errors.rb new file mode 100644 index 000000000..2fca2c13b --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/public_suffix-4.0.7/lib/public_suffix/errors.rb @@ -0,0 +1,41 @@ +# frozen_string_literal: true + +# = Public Suffix +# +# Domain name parser based on the Public Suffix List. +# +# Copyright (c) 2009-2022 Simone Carletti + +module PublicSuffix + + class Error < StandardError + end + + # Raised when trying to parse an invalid name. + # A name is considered invalid when no rule is found in the definition list. + # + # @example + # + # PublicSuffix.parse("nic.test") + # # => PublicSuffix::DomainInvalid + # + # PublicSuffix.parse("http://www.nic.it") + # # => PublicSuffix::DomainInvalid + # + class DomainInvalid < Error + end + + # Raised when trying to parse a name that matches a suffix. + # + # @example + # + # PublicSuffix.parse("nic.do") + # # => PublicSuffix::DomainNotAllowed + # + # PublicSuffix.parse("www.nic.do") + # # => PublicSuffix::Domain + # + class DomainNotAllowed < DomainInvalid + end + +end diff --git a/vendor/bundle/ruby/3.1.0/gems/public_suffix-4.0.7/lib/public_suffix/list.rb b/vendor/bundle/ruby/3.1.0/gems/public_suffix-4.0.7/lib/public_suffix/list.rb new file mode 100644 index 000000000..e11f071d4 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/public_suffix-4.0.7/lib/public_suffix/list.rb @@ -0,0 +1,247 @@ +# frozen_string_literal: true + +# = Public Suffix +# +# Domain name parser based on the Public Suffix List. +# +# Copyright (c) 2009-2022 Simone Carletti + +module PublicSuffix + + # A {PublicSuffix::List} is a collection of one + # or more {PublicSuffix::Rule}. + # + # Given a {PublicSuffix::List}, + # you can add or remove {PublicSuffix::Rule}, + # iterate all items in the list or search for the first rule + # which matches a specific domain name. + # + # # Create a new list + # list = PublicSuffix::List.new + # + # # Push two rules to the list + # list << PublicSuffix::Rule.factory("it") + # list << PublicSuffix::Rule.factory("com") + # + # # Get the size of the list + # list.size + # # => 2 + # + # # Search for the rule matching given domain + # list.find("example.com") + # # => # + # list.find("example.org") + # # => nil + # + # You can create as many {PublicSuffix::List} you want. + # The {PublicSuffix::List.default} rule list is used + # to tokenize and validate a domain. + # + class List + + DEFAULT_LIST_PATH = File.expand_path("../../data/list.txt", __dir__) + + # Gets the default rule list. + # + # Initializes a new {PublicSuffix::List} parsing the content + # of {PublicSuffix::List.default_list_content}, if required. + # + # @return [PublicSuffix::List] + def self.default(**options) + @default ||= parse(File.read(DEFAULT_LIST_PATH), **options) + end + + # Sets the default rule list to +value+. + # + # @param value [PublicSuffix::List] the new list + # @return [PublicSuffix::List] + def self.default=(value) + @default = value + end + + # Parse given +input+ treating the content as Public Suffix List. + # + # See http://publicsuffix.org/format/ for more details about input format. + # + # @param input [#each_line] the list to parse + # @param private_domains [Boolean] whether to ignore the private domains section + # @return [PublicSuffix::List] + def self.parse(input, private_domains: true) + comment_token = "//" + private_token = "===BEGIN PRIVATE DOMAINS===" + section = nil # 1 == ICANN, 2 == PRIVATE + + new do |list| + input.each_line do |line| + line.strip! + case # rubocop:disable Style/EmptyCaseCondition + + # skip blank lines + when line.empty? + next + + # include private domains or stop scanner + when line.include?(private_token) + break if !private_domains + + section = 2 + + # skip comments + when line.start_with?(comment_token) + next + + else + list.add(Rule.factory(line, private: section == 2)) + + end + end + end + end + + + # Initializes an empty {PublicSuffix::List}. + # + # @yield [self] Yields on self. + # @yieldparam [PublicSuffix::List] self The newly created instance. + def initialize + @rules = {} + yield(self) if block_given? + end + + + # Checks whether two lists are equal. + # + # List one is equal to two, if two is an instance of + # {PublicSuffix::List} and each +PublicSuffix::Rule::*+ + # in list one is available in list two, in the same order. + # + # @param other [PublicSuffix::List] the List to compare + # @return [Boolean] + def ==(other) + return false unless other.is_a?(List) + + equal?(other) || @rules == other.rules + end + alias eql? == + + # Iterates each rule in the list. + def each(&block) + Enumerator.new do |y| + @rules.each do |key, node| + y << entry_to_rule(node, key) + end + end.each(&block) + end + + + # Adds the given object to the list and optionally refreshes the rule index. + # + # @param rule [PublicSuffix::Rule::*] the rule to add to the list + # @return [self] + def add(rule) + @rules[rule.value] = rule_to_entry(rule) + self + end + alias << add + + # Gets the number of rules in the list. + # + # @return [Integer] + def size + @rules.size + end + + # Checks whether the list is empty. + # + # @return [Boolean] + def empty? + @rules.empty? + end + + # Removes all rules. + # + # @return [self] + def clear + @rules.clear + self + end + + # Finds and returns the rule corresponding to the longest public suffix for the hostname. + # + # @param name [#to_s] the hostname + # @param default [PublicSuffix::Rule::*] the default rule to return in case no rule matches + # @return [PublicSuffix::Rule::*] + def find(name, default: default_rule, **options) + rule = select(name, **options).inject do |l, r| + return r if r.instance_of?(Rule::Exception) + + l.length > r.length ? l : r + end + rule || default + end + + # Selects all the rules matching given hostame. + # + # If `ignore_private` is set to true, the algorithm will skip the rules that are flagged as + # private domain. Note that the rules will still be part of the loop. + # If you frequently need to access lists ignoring the private domains, + # you should create a list that doesn't include these domains setting the + # `private_domains: false` option when calling {.parse}. + # + # Note that this method is currently private, as you should not rely on it. Instead, + # the public interface is {#find}. The current internal algorithm allows to return all + # matching rules, but different data structures may not be able to do it, and instead would + # return only the match. For this reason, you should rely on {#find}. + # + # @param name [#to_s] the hostname + # @param ignore_private [Boolean] + # @return [Array] + def select(name, ignore_private: false) + name = name.to_s + + parts = name.split(DOT).reverse! + index = 0 + query = parts[index] + rules = [] + + loop do + match = @rules[query] + rules << entry_to_rule(match, query) if !match.nil? && (ignore_private == false || match.private == false) + + index += 1 + break if index >= parts.size + + query = parts[index] + DOT + query + end + + rules + end + private :select + + # Gets the default rule. + # + # @see PublicSuffix::Rule.default_rule + # + # @return [PublicSuffix::Rule::*] + def default_rule + PublicSuffix::Rule.default + end + + + protected + + attr_reader :rules + + + private + + def entry_to_rule(entry, value) + entry.type.new(value: value, length: entry.length, private: entry.private) + end + + def rule_to_entry(rule) + Rule::Entry.new(rule.class, rule.length, rule.private) + end + + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/public_suffix-4.0.7/lib/public_suffix/rule.rb b/vendor/bundle/ruby/3.1.0/gems/public_suffix-4.0.7/lib/public_suffix/rule.rb new file mode 100644 index 000000000..d41a48074 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/public_suffix-4.0.7/lib/public_suffix/rule.rb @@ -0,0 +1,350 @@ +# frozen_string_literal: true + +# = Public Suffix +# +# Domain name parser based on the Public Suffix List. +# +# Copyright (c) 2009-2022 Simone Carletti + +module PublicSuffix + + # A Rule is a special object which holds a single definition + # of the Public Suffix List. + # + # There are 3 types of rules, each one represented by a specific + # subclass within the +PublicSuffix::Rule+ namespace. + # + # To create a new Rule, use the {PublicSuffix::Rule#factory} method. + # + # PublicSuffix::Rule.factory("ar") + # # => # + # + module Rule + + # @api internal + Entry = Struct.new(:type, :length, :private) # rubocop:disable Lint/StructNewOverride + + # = Abstract rule class + # + # This represent the base class for a Rule definition + # in the {Public Suffix List}[https://publicsuffix.org]. + # + # This is intended to be an Abstract class + # and you shouldn't create a direct instance. The only purpose + # of this class is to expose a common interface + # for all the available subclasses. + # + # * {PublicSuffix::Rule::Normal} + # * {PublicSuffix::Rule::Exception} + # * {PublicSuffix::Rule::Wildcard} + # + # ## Properties + # + # A rule is composed by 4 properties: + # + # value - A normalized version of the rule name. + # The normalization process depends on rule tpe. + # + # Here's an example + # + # PublicSuffix::Rule.factory("*.google.com") + # # + # + # ## Rule Creation + # + # The best way to create a new rule is passing the rule name + # to the PublicSuffix::Rule.factory method. + # + # PublicSuffix::Rule.factory("com") + # # => PublicSuffix::Rule::Normal + # + # PublicSuffix::Rule.factory("*.com") + # # => PublicSuffix::Rule::Wildcard + # + # This method will detect the rule type and create an instance + # from the proper rule class. + # + # ## Rule Usage + # + # A rule describes the composition of a domain name and explains how to tokenize + # the name into tld, sld and trd. + # + # To use a rule, you first need to be sure the name you want to tokenize + # can be handled by the current rule. + # You can use the #match? method. + # + # rule = PublicSuffix::Rule.factory("com") + # + # rule.match?("google.com") + # # => true + # + # rule.match?("google.com") + # # => false + # + # Rule order is significant. A name can match more than one rule. + # See the {Public Suffix Documentation}[http://publicsuffix.org/format/] + # to learn more about rule priority. + # + # When you have the right rule, you can use it to tokenize the domain name. + # + # rule = PublicSuffix::Rule.factory("com") + # + # rule.decompose("google.com") + # # => ["google", "com"] + # + # rule.decompose("www.google.com") + # # => ["www.google", "com"] + # + # @abstract + # + class Base + + # @return [String] the rule definition + attr_reader :value + + # @return [String] the length of the rule + attr_reader :length + + # @return [Boolean] true if the rule is a private domain + attr_reader :private + + + # Initializes a new rule from the content. + # + # @param content [String] the content of the rule + # @param private [Boolean] + def self.build(content, private: false) + new(value: content, private: private) + end + + # Initializes a new rule. + # + # @param value [String] + # @param private [Boolean] + def initialize(value:, length: nil, private: false) + @value = value.to_s + @length = length || @value.count(DOT) + 1 + @private = private + end + + # Checks whether this rule is equal to other. + # + # @param other [PublicSuffix::Rule::*] The rule to compare + # @return [Boolean] true if this rule and other are instances of the same class + # and has the same value, false otherwise. + def ==(other) + equal?(other) || (self.class == other.class && value == other.value) + end + alias eql? == + + # Checks if this rule matches +name+. + # + # A domain name is said to match a rule if and only if + # all of the following conditions are met: + # + # - When the domain and rule are split into corresponding labels, + # that the domain contains as many or more labels than the rule. + # - Beginning with the right-most labels of both the domain and the rule, + # and continuing for all labels in the rule, one finds that for every pair, + # either they are identical, or that the label from the rule is "*". + # + # @see https://publicsuffix.org/list/ + # + # @example + # PublicSuffix::Rule.factory("com").match?("example.com") + # # => true + # PublicSuffix::Rule.factory("com").match?("example.net") + # # => false + # + # @param name [String] the domain name to check + # @return [Boolean] + def match?(name) + # Note: it works because of the assumption there are no + # rules like foo.*.com. If the assumption is incorrect, + # we need to properly walk the input and skip parts according + # to wildcard component. + diff = name.chomp(value) + diff.empty? || diff.end_with?(DOT) + end + + # @abstract + def parts + raise NotImplementedError + end + + # @abstract + # @param domain [#to_s] The domain name to decompose + # @return [Array] + def decompose(*) + raise NotImplementedError + end + + end + + # Normal represents a standard rule (e.g. com). + class Normal < Base + + # Gets the original rule definition. + # + # @return [String] The rule definition. + def rule + value + end + + # Decomposes the domain name according to rule properties. + # + # @param domain [#to_s] The domain name to decompose + # @return [Array] The array with [trd + sld, tld]. + def decompose(domain) + suffix = parts.join('\.') + matches = domain.to_s.match(/^(.*)\.(#{suffix})$/) + matches ? matches[1..2] : [nil, nil] + end + + # dot-split rule value and returns all rule parts + # in the order they appear in the value. + # + # @return [Array] + def parts + @value.split(DOT) + end + + end + + # Wildcard represents a wildcard rule (e.g. *.co.uk). + class Wildcard < Base + + # Initializes a new rule from the content. + # + # @param content [String] the content of the rule + # @param private [Boolean] + def self.build(content, private: false) + new(value: content.to_s[2..-1], private: private) + end + + # Initializes a new rule. + # + # @param value [String] + # @param length [Integer] + # @param private [Boolean] + def initialize(value:, length: nil, private: false) + super(value: value, length: length, private: private) + length or @length += 1 # * counts as 1 + end + + # Gets the original rule definition. + # + # @return [String] The rule definition. + def rule + value == "" ? STAR : STAR + DOT + value + end + + # Decomposes the domain name according to rule properties. + # + # @param domain [#to_s] The domain name to decompose + # @return [Array] The array with [trd + sld, tld]. + def decompose(domain) + suffix = ([".*?"] + parts).join('\.') + matches = domain.to_s.match(/^(.*)\.(#{suffix})$/) + matches ? matches[1..2] : [nil, nil] + end + + # dot-split rule value and returns all rule parts + # in the order they appear in the value. + # + # @return [Array] + def parts + @value.split(DOT) + end + + end + + # Exception represents an exception rule (e.g. !parliament.uk). + class Exception < Base + + # Initializes a new rule from the content. + # + # @param content [#to_s] the content of the rule + # @param private [Boolean] + def self.build(content, private: false) + new(value: content.to_s[1..-1], private: private) + end + + # Gets the original rule definition. + # + # @return [String] The rule definition. + def rule + BANG + value + end + + # Decomposes the domain name according to rule properties. + # + # @param domain [#to_s] The domain name to decompose + # @return [Array] The array with [trd + sld, tld]. + def decompose(domain) + suffix = parts.join('\.') + matches = domain.to_s.match(/^(.*)\.(#{suffix})$/) + matches ? matches[1..2] : [nil, nil] + end + + # dot-split rule value and returns all rule parts + # in the order they appear in the value. + # The leftmost label is not considered a label. + # + # See http://publicsuffix.org/format/: + # If the prevailing rule is a exception rule, + # modify it by removing the leftmost label. + # + # @return [Array] + def parts + @value.split(DOT)[1..-1] + end + + end + + + # Takes the +name+ of the rule, detects the specific rule class + # and creates a new instance of that class. + # The +name+ becomes the rule +value+. + # + # @example Creates a Normal rule + # PublicSuffix::Rule.factory("ar") + # # => # + # + # @example Creates a Wildcard rule + # PublicSuffix::Rule.factory("*.ar") + # # => # + # + # @example Creates an Exception rule + # PublicSuffix::Rule.factory("!congresodelalengua3.ar") + # # => # + # + # @param content [#to_s] the content of the rule + # @return [PublicSuffix::Rule::*] A rule instance. + def self.factory(content, private: false) + case content.to_s[0, 1] + when STAR + Wildcard + when BANG + Exception + else + Normal + end.build(content, private: private) + end + + # The default rule to use if no rule match. + # + # The default rule is "*". From https://publicsuffix.org/list/: + # + # > If no rules match, the prevailing rule is "*". + # + # @return [PublicSuffix::Rule::Wildcard] The default rule. + def self.default + factory(STAR) + end + + end + +end diff --git a/vendor/bundle/ruby/3.1.0/gems/public_suffix-4.0.7/lib/public_suffix/version.rb b/vendor/bundle/ruby/3.1.0/gems/public_suffix-4.0.7/lib/public_suffix/version.rb new file mode 100644 index 000000000..80d373f7c --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/public_suffix-4.0.7/lib/public_suffix/version.rb @@ -0,0 +1,15 @@ +# frozen_string_literal: true + +# +# = Public Suffix +# +# Domain name parser based on the Public Suffix List. +# +# Copyright (c) 2009-2022 Simone Carletti + +module PublicSuffix + + # @return [String] The current library version. + VERSION = "4.0.7" + +end diff --git a/vendor/bundle/ruby/3.1.0/gems/public_suffix-4.0.7/public_suffix.gemspec b/vendor/bundle/ruby/3.1.0/gems/public_suffix-4.0.7/public_suffix.gemspec new file mode 100644 index 000000000..ae552fc90 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/public_suffix-4.0.7/public_suffix.gemspec @@ -0,0 +1,29 @@ +# -*- encoding: utf-8 -*- +$LOAD_PATH.push File.expand_path("../lib", __FILE__) +require "public_suffix/version" + +Gem::Specification.new do |s| + s.name = "public_suffix" + s.version = PublicSuffix::VERSION + s.authors = ["Simone Carletti"] + s.email = ["weppos@weppos.net"] + s.homepage = "https://simonecarletti.com/code/publicsuffix-ruby" + s.summary = "Domain name parser based on the Public Suffix List." + s.description = "PublicSuffix can parse and decompose a domain name into top level domain, domain and subdomains." + s.licenses = ["MIT"] + + s.metadata = { + "bug_tracker_uri" => "https://github.com/weppos/publicsuffix-ruby/issues", + "changelog_uri" => "https://github.com/weppos/publicsuffix-ruby/blob/master/CHANGELOG.md", + "documentation_uri" => "https://rubydoc.info/gems/#{s.name}/#{s.version}", + "homepage_uri" => s.homepage, + "source_code_uri" => "https://github.com/weppos/publicsuffix-ruby/tree/v#{s.version}", + } + + s.required_ruby_version = ">= 2.3" + + s.require_paths = ["lib"] + s.files = `git ls-files`.split("\n") + s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n") + s.extra_rdoc_files = %w( LICENSE.txt ) +end diff --git a/vendor/bundle/ruby/3.1.0/gems/public_suffix-4.0.7/test/.empty b/vendor/bundle/ruby/3.1.0/gems/public_suffix-4.0.7/test/.empty new file mode 100644 index 000000000..e3220151c --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/public_suffix-4.0.7/test/.empty @@ -0,0 +1,2 @@ +# This is an empty file I use to force a non-empty commit when I only need to store notes +.. \ No newline at end of file diff --git a/vendor/bundle/ruby/3.1.0/gems/public_suffix-4.0.7/test/acceptance_test.rb b/vendor/bundle/ruby/3.1.0/gems/public_suffix-4.0.7/test/acceptance_test.rb new file mode 100644 index 000000000..371bfe133 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/public_suffix-4.0.7/test/acceptance_test.rb @@ -0,0 +1,131 @@ +# frozen_string_literal: true + +require "test_helper" + +class AcceptanceTest < Minitest::Test + + VALID_CASES = [ + ["example.com", "example.com", [nil, "example", "com"]], + ["foo.example.com", "example.com", ["foo", "example", "com"]], + + ["verybritish.co.uk", "verybritish.co.uk", [nil, "verybritish", "co.uk"]], + ["foo.verybritish.co.uk", "verybritish.co.uk", ["foo", "verybritish", "co.uk"]], + + ["parliament.uk", "parliament.uk", [nil, "parliament", "uk"]], + ["foo.parliament.uk", "parliament.uk", ["foo", "parliament", "uk"]], + ].freeze + + def test_valid + VALID_CASES.each do |input, domain, results| + parsed = PublicSuffix.parse(input) + trd, sld, tld = results + assert_equal tld, parsed.tld, "Invalid tld for `#{name}`" + assert_equal sld, parsed.sld, "Invalid sld for `#{name}`" + if trd.nil? + assert_nil parsed.trd, "Invalid trd for `#{name}`" + else + assert_equal trd, parsed.trd, "Invalid trd for `#{name}`" + end + + assert_equal domain, PublicSuffix.domain(input) + assert PublicSuffix.valid?(input) + end + end + + + INVALID_CASES = [ + ["nic.bd", PublicSuffix::DomainNotAllowed], + [nil, PublicSuffix::DomainInvalid], + ["", PublicSuffix::DomainInvalid], + [" ", PublicSuffix::DomainInvalid], + ].freeze + + def test_invalid + INVALID_CASES.each do |(name, error)| + assert_raises(error) { PublicSuffix.parse(name) } + assert !PublicSuffix.valid?(name) + end + end + + + REJECTED_CASES = [ + ["www. .com", true], + ["foo.co..uk", true], + ["goo,gle.com", true], + ["-google.com", true], + ["google-.com", true], + + # This case was covered in GH-15. + # I decided to cover this case because it's not easily reproducible with URI.parse + # and can lead to several false positives. + ["http://google.com", false], + ].freeze + + def test_rejected + REJECTED_CASES.each do |name, expected| + assert_equal expected, PublicSuffix.valid?(name), + "Expected %s to be %s" % [name.inspect, expected.inspect] + assert !valid_domain?(name), + "#{name} expected to be invalid" + end + end + + + CASE_CASES = [ + ["Www.google.com", %w( www google com )], + ["www.Google.com", %w( www google com )], + ["www.google.Com", %w( www google com )], + ].freeze + + def test_ignore_case + CASE_CASES.each do |name, results| + domain = PublicSuffix.parse(name) + trd, sld, tld = results + assert_equal tld, domain.tld, "Invalid tld for `#{name}'" + assert_equal sld, domain.sld, "Invalid sld for `#{name}'" + assert_equal trd, domain.trd, "Invalid trd for `#{name}'" + assert PublicSuffix.valid?(name) + end + end + + + INCLUDE_PRIVATE_CASES = [ + ["blogspot.com", true, "blogspot.com"], + ["blogspot.com", false, nil], + ["subdomain.blogspot.com", true, "blogspot.com"], + ["subdomain.blogspot.com", false, "subdomain.blogspot.com"], + ].freeze + + # rubocop:disable Style/CombinableLoops + def test_ignore_private + # test domain and parse + INCLUDE_PRIVATE_CASES.each do |given, ignore_private, expected| + if expected.nil? + assert_nil PublicSuffix.domain(given, ignore_private: ignore_private) + else + assert_equal expected, PublicSuffix.domain(given, ignore_private: ignore_private) + end + end + # test valid? + INCLUDE_PRIVATE_CASES.each do |given, ignore_private, expected| + assert_equal !expected.nil?, PublicSuffix.valid?(given, ignore_private: ignore_private) + end + end + # rubocop:enable Style/CombinableLoops + + + def valid_uri?(name) + uri = URI.parse(name) + !uri.host.nil? + rescue StandardError + false + end + + def valid_domain?(name) + uri = URI.parse(name) + !uri.host.nil? && uri.scheme.nil? + rescue StandardError + false + end + +end diff --git a/vendor/bundle/ruby/3.1.0/gems/public_suffix-4.0.7/test/benchmarks/bm_find.rb b/vendor/bundle/ruby/3.1.0/gems/public_suffix-4.0.7/test/benchmarks/bm_find.rb new file mode 100644 index 000000000..0074f1d09 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/public_suffix-4.0.7/test/benchmarks/bm_find.rb @@ -0,0 +1,66 @@ +require 'benchmark' +require_relative "../../lib/public_suffix" + +NAME_SHORT = "example.de" +NAME_MEDIUM = "www.subdomain.example.de" +NAME_LONG = "one.two.three.four.five.example.de" +NAME_WILD = "one.two.three.four.five.example.bd" +NAME_EXCP = "one.two.three.four.five.www.ck" + +IAAA = "www.example.ac" +IZZZ = "www.example.zone" + +PAAA = "one.two.three.four.five.example.beep.pl" +PZZZ = "one.two.three.four.five.example.now.sh" + +JP = "www.yokoshibahikari.chiba.jp" +IT = "www.example.it" +COM = "www.example.com" + +TIMES = (ARGV.first || 50_000).to_i + +# Initialize +PublicSuffixList = PublicSuffix::List.default +PublicSuffixList.find("example.com") + +Benchmark.bmbm(25) do |x| + x.report("NAME_SHORT") do + TIMES.times { PublicSuffixList.find(NAME_SHORT) != nil } + end + x.report("NAME_MEDIUM") do + TIMES.times { PublicSuffixList.find(NAME_MEDIUM) != nil } + end + x.report("NAME_LONG") do + TIMES.times { PublicSuffixList.find(NAME_LONG) != nil } + end + x.report("NAME_WILD") do + TIMES.times { PublicSuffixList.find(NAME_WILD) != nil } + end + x.report("NAME_EXCP") do + TIMES.times { PublicSuffixList.find(NAME_EXCP) != nil } + end + + x.report("IAAA") do + TIMES.times { PublicSuffixList.find(IAAA) != nil } + end + x.report("IZZZ") do + TIMES.times { PublicSuffixList.find(IZZZ) != nil } + end + + x.report("PAAA") do + TIMES.times { PublicSuffixList.find(PAAA) != nil } + end + x.report("PZZZ") do + TIMES.times { PublicSuffixList.find(PZZZ) != nil } + end + + x.report("JP") do + TIMES.times { PublicSuffixList.find(JP) != nil } + end + x.report("IT") do + TIMES.times { PublicSuffixList.find(IT) != nil } + end + x.report("COM") do + TIMES.times { PublicSuffixList.find(COM) != nil } + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/public_suffix-4.0.7/test/benchmarks/bm_find_all.rb b/vendor/bundle/ruby/3.1.0/gems/public_suffix-4.0.7/test/benchmarks/bm_find_all.rb new file mode 100644 index 000000000..0bcfd42c8 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/public_suffix-4.0.7/test/benchmarks/bm_find_all.rb @@ -0,0 +1,102 @@ +require 'benchmark' +require_relative "../../lib/public_suffix" + +NAME_SHORT = "example.de" +NAME_MEDIUM = "www.subdomain.example.de" +NAME_LONG = "one.two.three.four.five.example.de" +NAME_WILD = "one.two.three.four.five.example.bd" +NAME_EXCP = "one.two.three.four.five.www.ck" + +IAAA = "www.example.ac" +IZZZ = "www.example.zone" + +PAAA = "one.two.three.four.five.example.beep.pl" +PZZZ = "one.two.three.four.five.example.now.sh" + +JP = "www.yokoshibahikari.chiba.jp" +IT = "www.example.it" +COM = "www.example.com" + +TIMES = (ARGV.first || 50_000).to_i + +# Initialize +PublicSuffixList = PublicSuffix::List.default +PublicSuffixList.find("example.com") + +Benchmark.bmbm(25) do |x| + x.report("NAME_SHORT") do + TIMES.times { PublicSuffixList.find(NAME_SHORT) != nil } + end + x.report("NAME_SHORT (noprivate)") do + TIMES.times { PublicSuffixList.find(NAME_SHORT, ignore_private: true) != nil } + end + x.report("NAME_MEDIUM") do + TIMES.times { PublicSuffixList.find(NAME_MEDIUM) != nil } + end + x.report("NAME_MEDIUM (noprivate)") do + TIMES.times { PublicSuffixList.find(NAME_MEDIUM, ignore_private: true) != nil } + end + x.report("NAME_LONG") do + TIMES.times { PublicSuffixList.find(NAME_LONG) != nil } + end + x.report("NAME_LONG (noprivate)") do + TIMES.times { PublicSuffixList.find(NAME_LONG, ignore_private: true) != nil } + end + x.report("NAME_WILD") do + TIMES.times { PublicSuffixList.find(NAME_WILD) != nil } + end + x.report("NAME_WILD (noprivate)") do + TIMES.times { PublicSuffixList.find(NAME_WILD, ignore_private: true) != nil } + end + x.report("NAME_EXCP") do + TIMES.times { PublicSuffixList.find(NAME_EXCP) != nil } + end + x.report("NAME_EXCP (noprivate)") do + TIMES.times { PublicSuffixList.find(NAME_EXCP, ignore_private: true) != nil } + end + + x.report("IAAA") do + TIMES.times { PublicSuffixList.find(IAAA) != nil } + end + x.report("IAAA (noprivate)") do + TIMES.times { PublicSuffixList.find(IAAA, ignore_private: true) != nil } + end + x.report("IZZZ") do + TIMES.times { PublicSuffixList.find(IZZZ) != nil } + end + x.report("IZZZ (noprivate)") do + TIMES.times { PublicSuffixList.find(IZZZ, ignore_private: true) != nil } + end + + x.report("PAAA") do + TIMES.times { PublicSuffixList.find(PAAA) != nil } + end + x.report("PAAA (noprivate)") do + TIMES.times { PublicSuffixList.find(PAAA, ignore_private: true) != nil } + end + x.report("PZZZ") do + TIMES.times { PublicSuffixList.find(PZZZ) != nil } + end + x.report("PZZZ (noprivate)") do + TIMES.times { PublicSuffixList.find(PZZZ, ignore_private: true) != nil } + end + + x.report("JP") do + TIMES.times { PublicSuffixList.find(JP) != nil } + end + x.report("JP (noprivate)") do + TIMES.times { PublicSuffixList.find(JP, ignore_private: true) != nil } + end + x.report("IT") do + TIMES.times { PublicSuffixList.find(IT) != nil } + end + x.report("IT (noprivate)") do + TIMES.times { PublicSuffixList.find(IT, ignore_private: true) != nil } + end + x.report("COM") do + TIMES.times { PublicSuffixList.find(COM) != nil } + end + x.report("COM (noprivate)") do + TIMES.times { PublicSuffixList.find(COM, ignore_private: true) != nil } + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/public_suffix-4.0.7/test/benchmarks/bm_names.rb b/vendor/bundle/ruby/3.1.0/gems/public_suffix-4.0.7/test/benchmarks/bm_names.rb new file mode 100644 index 000000000..36b2bce36 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/public_suffix-4.0.7/test/benchmarks/bm_names.rb @@ -0,0 +1,91 @@ +require 'benchmark/ips' + +STRING = "www.subdomain.example.com" +ARRAY = %w( + com + example.com + subdomain.example.com + www.subdomain.example.com +) + +def tokenizer1(string) + parts = string.split(".").reverse! + index = 0 + query = parts[index] + names = [] + + loop do + names << query + + index += 1 + break if index >= parts.size + query = parts[index] + "." + query + end + names +end + +def tokenizer2(string) + parts = string.split(".") + index = parts.size - 1 + query = parts[index] + names = [] + + loop do + names << query + + index -= 1 + break if index < 0 + query = parts[index] + "." + query + end + names +end + +def tokenizer3(string) + isx = string.size + idx = string.size - 1 + names = [] + + loop do + isx = string.rindex(".", isx - 1) || -1 + names << string[isx + 1, idx - isx] + + break if isx <= 0 + end + names +end + +def tokenizer4(string) + isx = string.size + idx = string.size - 1 + names = [] + + loop do + isx = string.rindex(".", isx - 1) || -1 + names << string[(isx+1)..idx] + + break if isx <= 0 + end + names +end + +(x = tokenizer1(STRING)) == ARRAY or fail("tokenizer1 failed: #{x.inspect}") +(x = tokenizer2(STRING)) == ARRAY or fail("tokenizer2 failed: #{x.inspect}") +(x = tokenizer3(STRING)) == ARRAY or fail("tokenizer3 failed: #{x.inspect}") +(x = tokenizer4(STRING)) == ARRAY or fail("tokenizer4 failed: #{x.inspect}") + +Benchmark.ips do |x| + x.report("tokenizer1") do + tokenizer1(STRING).is_a?(Array) + end + x.report("tokenizer2") do + tokenizer2(STRING).is_a?(Array) + end + x.report("tokenizer3") do + tokenizer3(STRING).is_a?(Array) + end + x.report("tokenizer4") do + tokenizer4(STRING).is_a?(Array) + end + + x.compare! +end diff --git a/vendor/bundle/ruby/3.1.0/gems/public_suffix-4.0.7/test/benchmarks/bm_select.rb b/vendor/bundle/ruby/3.1.0/gems/public_suffix-4.0.7/test/benchmarks/bm_select.rb new file mode 100644 index 000000000..66d908b8a --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/public_suffix-4.0.7/test/benchmarks/bm_select.rb @@ -0,0 +1,26 @@ +require 'benchmark' +require_relative "../../lib/public_suffix" + +JP = "www.yokoshibahikari.chiba.jp" + +TIMES = (ARGV.first || 50_000).to_i + +# Initialize +class PublicSuffix::List + public :select +end +PublicSuffixList = PublicSuffix::List.default +PublicSuffixList.select("example.jp") +PublicSuffixList.find("example.jp") + +Benchmark.bmbm(25) do |x| + x.report("JP select") do + TIMES.times { PublicSuffixList.select(JP) } + end + x.report("JP find") do + TIMES.times { PublicSuffixList.find(JP) } + end + # x.report("JP (noprivate)") do + # TIMES.times { PublicSuffixList.find(JP, ignore_private: true) != nil } + # end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/public_suffix-4.0.7/test/benchmarks/bm_select_incremental.rb b/vendor/bundle/ruby/3.1.0/gems/public_suffix-4.0.7/test/benchmarks/bm_select_incremental.rb new file mode 100644 index 000000000..f002c827b --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/public_suffix-4.0.7/test/benchmarks/bm_select_incremental.rb @@ -0,0 +1,25 @@ +require 'benchmark' +require_relative "../../lib/public_suffix" + +JP = "www.yokoshibahikari.chiba.jp" + +TIMES = (ARGV.first || 50_000).to_i + +# Initialize +class PublicSuffix::List + public :select +end +PublicSuffixList = PublicSuffix::List.default +PublicSuffixList.select("example.jp") + +Benchmark.bmbm(25) do |x| + x.report("select jp") do + TIMES.times { PublicSuffixList.select("jp") } + end + x.report("select example.jp") do + TIMES.times { PublicSuffixList.select("example.jp") } + end + x.report("select www.example.jp") do + TIMES.times { PublicSuffixList.select("www.example.jp") } + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/public_suffix-4.0.7/test/benchmarks/bm_valid.rb b/vendor/bundle/ruby/3.1.0/gems/public_suffix-4.0.7/test/benchmarks/bm_valid.rb new file mode 100644 index 000000000..a484451ff --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/public_suffix-4.0.7/test/benchmarks/bm_valid.rb @@ -0,0 +1,101 @@ +require 'benchmark' +require_relative "../../lib/public_suffix" + +NAME_SHORT = "example.de" +NAME_MEDIUM = "www.subdomain.example.de" +NAME_LONG = "one.two.three.four.five.example.de" +NAME_WILD = "one.two.three.four.five.example.bd" +NAME_EXCP = "one.two.three.four.five.www.ck" + +IAAA = "www.example.ac" +IZZZ = "www.example.zone" + +PAAA = "one.two.three.four.five.example.beep.pl" +PZZZ = "one.two.three.four.five.example.now.sh" + +JP = "www.yokoshibahikari.chiba.jp" +IT = "www.example.it" +COM = "www.example.com" + +TIMES = (ARGV.first || 50_000).to_i + +# Initialize +PublicSuffix.valid?("example.com") + +Benchmark.bmbm(25) do |x| + x.report("NAME_SHORT") do + TIMES.times { PublicSuffix.valid?(NAME_SHORT) == true } + end + x.report("NAME_SHORT (noprivate)") do + TIMES.times { PublicSuffix.valid?(NAME_SHORT, ignore_private: true) == true } + end + x.report("NAME_MEDIUM") do + TIMES.times { PublicSuffix.valid?(NAME_MEDIUM) == true } + end + x.report("NAME_MEDIUM (noprivate)") do + TIMES.times { PublicSuffix.valid?(NAME_MEDIUM, ignore_private: true) == true } + end + x.report("NAME_LONG") do + TIMES.times { PublicSuffix.valid?(NAME_LONG) == true } + end + x.report("NAME_LONG (noprivate)") do + TIMES.times { PublicSuffix.valid?(NAME_LONG, ignore_private: true) == true } + end + x.report("NAME_WILD") do + TIMES.times { PublicSuffix.valid?(NAME_WILD) == true } + end + x.report("NAME_WILD (noprivate)") do + TIMES.times { PublicSuffix.valid?(NAME_WILD, ignore_private: true) == true } + end + x.report("NAME_EXCP") do + TIMES.times { PublicSuffix.valid?(NAME_EXCP) == true } + end + x.report("NAME_EXCP (noprivate)") do + TIMES.times { PublicSuffix.valid?(NAME_EXCP, ignore_private: true) == true } + end + + x.report("IAAA") do + TIMES.times { PublicSuffix.valid?(IAAA) == true } + end + x.report("IAAA (noprivate)") do + TIMES.times { PublicSuffix.valid?(IAAA, ignore_private: true) == true } + end + x.report("IZZZ") do + TIMES.times { PublicSuffix.valid?(IZZZ) == true } + end + x.report("IZZZ (noprivate)") do + TIMES.times { PublicSuffix.valid?(IZZZ, ignore_private: true) == true } + end + + x.report("PAAA") do + TIMES.times { PublicSuffix.valid?(PAAA) == true } + end + x.report("PAAA (noprivate)") do + TIMES.times { PublicSuffix.valid?(PAAA, ignore_private: true) == true } + end + x.report("PZZZ") do + TIMES.times { PublicSuffix.valid?(PZZZ) == true } + end + x.report("PZZZ (noprivate)") do + TIMES.times { PublicSuffix.valid?(PZZZ, ignore_private: true) == true } + end + + x.report("JP") do + TIMES.times { PublicSuffix.valid?(JP) == true } + end + x.report("JP (noprivate)") do + TIMES.times { PublicSuffix.valid?(JP, ignore_private: true) == true } + end + x.report("IT") do + TIMES.times { PublicSuffix.valid?(IT) == true } + end + x.report("IT (noprivate)") do + TIMES.times { PublicSuffix.valid?(IT, ignore_private: true) == true } + end + x.report("COM") do + TIMES.times { PublicSuffix.valid?(COM) == true } + end + x.report("COM (noprivate)") do + TIMES.times { PublicSuffix.valid?(COM, ignore_private: true) == true } + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/public_suffix-4.0.7/test/profilers/domain_profiler.rb b/vendor/bundle/ruby/3.1.0/gems/public_suffix-4.0.7/test/profilers/domain_profiler.rb new file mode 100644 index 000000000..1ed10500d --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/public_suffix-4.0.7/test/profilers/domain_profiler.rb @@ -0,0 +1,12 @@ +$LOAD_PATH.unshift File.expand_path("../../lib", __dir__) + +require "memory_profiler" +require "public_suffix" + +PublicSuffix::List.default + +report = MemoryProfiler.report do + PublicSuffix.domain("www.example.com") +end + +report.pretty_print diff --git a/vendor/bundle/ruby/3.1.0/gems/public_suffix-4.0.7/test/profilers/find_profiler.rb b/vendor/bundle/ruby/3.1.0/gems/public_suffix-4.0.7/test/profilers/find_profiler.rb new file mode 100644 index 000000000..53d28ebca --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/public_suffix-4.0.7/test/profilers/find_profiler.rb @@ -0,0 +1,12 @@ +$LOAD_PATH.unshift File.expand_path("../../lib", __dir__) + +require "memory_profiler" +require "public_suffix" + +PublicSuffix::List.default + +report = MemoryProfiler.report do + PublicSuffix::List.default.find("www.example.com") +end + +report.pretty_print diff --git a/vendor/bundle/ruby/3.1.0/gems/public_suffix-4.0.7/test/profilers/find_profiler_jp.rb b/vendor/bundle/ruby/3.1.0/gems/public_suffix-4.0.7/test/profilers/find_profiler_jp.rb new file mode 100644 index 000000000..65c13fea7 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/public_suffix-4.0.7/test/profilers/find_profiler_jp.rb @@ -0,0 +1,12 @@ +$LOAD_PATH.unshift File.expand_path("../../lib", __dir__) + +require "memory_profiler" +require "public_suffix" + +PublicSuffix::List.default + +report = MemoryProfiler.report do + PublicSuffix::List.default.find("a.b.ide.kyoto.jp") +end + +report.pretty_print diff --git a/vendor/bundle/ruby/3.1.0/gems/public_suffix-4.0.7/test/profilers/initialization_profiler.rb b/vendor/bundle/ruby/3.1.0/gems/public_suffix-4.0.7/test/profilers/initialization_profiler.rb new file mode 100644 index 000000000..008b1e757 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/public_suffix-4.0.7/test/profilers/initialization_profiler.rb @@ -0,0 +1,11 @@ +$LOAD_PATH.unshift File.expand_path("../../lib", __dir__) + +require "memory_profiler" +require "public_suffix" + +report = MemoryProfiler.report do + PublicSuffix::List.default +end + +report.pretty_print +# report.pretty_print(to_file: 'profiler-%s-%d.txt' % [ARGV[0], Time.now.to_i]) diff --git a/vendor/bundle/ruby/3.1.0/gems/public_suffix-4.0.7/test/profilers/list_profsize.rb b/vendor/bundle/ruby/3.1.0/gems/public_suffix-4.0.7/test/profilers/list_profsize.rb new file mode 100644 index 000000000..0b98b4b38 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/public_suffix-4.0.7/test/profilers/list_profsize.rb @@ -0,0 +1,11 @@ +$LOAD_PATH.unshift File.expand_path("../../lib", __dir__) + +require_relative "object_binsize" +require "public_suffix" + +list = PublicSuffix::List.default +puts "#{list.size} rules:" + +prof = ObjectBinsize.new +prof.report(PublicSuffix::List.default, label: "PublicSuffix::List size") +prof.report(PublicSuffix::List.default.instance_variable_get(:@rules), label: "Size of rules") diff --git a/vendor/bundle/ruby/3.1.0/gems/public_suffix-4.0.7/test/profilers/object_binsize.rb b/vendor/bundle/ruby/3.1.0/gems/public_suffix-4.0.7/test/profilers/object_binsize.rb new file mode 100644 index 000000000..dc60bdb46 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/public_suffix-4.0.7/test/profilers/object_binsize.rb @@ -0,0 +1,57 @@ +require 'tempfile' + +# A very simple memory profiles that checks the full size of a variable +# by serializing into a binary file. +# +# Yes, I know this is very rough, but there are cases where ObjectSpace.memsize_of +# doesn't cooperate, and this is one of the possible workarounds. +# +# For certain cases, it works (TM). +class ObjectBinsize + + def measure(var, label: nil) + dump(var, label: label) + end + + def report(var, label: nil, padding: 10) + file = measure(var, label: label) + + size = format_integer(file.size) + name = label || File.basename(file.path) + printf("%#{padding}s %s\n", size, name) + end + + private + + def dump(var, **args) + file = Tempfile.new(args[:label].to_s) + file.write(Marshal.dump(var)) + file + ensure + file.close + end + + def format_integer(int) + int.to_s.reverse.gsub(/...(?=.)/, '\&,').reverse + end + +end + +if __FILE__ == $0 + prof = ObjectBinsize.new + + prof.report(nil, label: "nil") + prof.report(false, label: "false") + prof.report(true, label: "true") + prof.report(0, label: "integer") + prof.report("", label: "empty string") + prof.report({}, label: "empty hash") + prof.report({}, label: "empty array") + + prof.report({ foo: "1" }, label: "hash 1 item (symbol)") + prof.report({ foo: "1", bar: 2 }, label: "hash 2 items (symbol)") + prof.report({ "foo" => "1" }, label: "hash 1 item (string)") + prof.report({ "foo" => "1", "bar" => 2 }, label: "hash 2 items (string)") + + prof.report("big string" * 200, label: "big string * 200") +end diff --git a/vendor/bundle/ruby/3.1.0/gems/public_suffix-4.0.7/test/psl_test.rb b/vendor/bundle/ruby/3.1.0/gems/public_suffix-4.0.7/test/psl_test.rb new file mode 100644 index 000000000..fae398f74 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/public_suffix-4.0.7/test/psl_test.rb @@ -0,0 +1,52 @@ +# frozen_string_literal: true + +require "test_helper" +require "public_suffix" + +# This test runs against the current PSL file and ensures +# the definitions satisfies the test suite. +class PslTest < Minitest::Test + + ROOT = File.expand_path("..", __dir__) + + # rubocop:disable Security/Eval + def self.tests + File.readlines(File.join(ROOT, "test/tests.txt")).map do |line| + line = line.strip + next if line.empty? + next if line.start_with?("//") + + input, output = line.split(", ") + + # handle the case of eval("null"), it must be eval("nil") + input = "nil" if input == "null" + output = "nil" if output == "null" + + input = eval(input) + output = eval(output) + [input, output] + end + end + # rubocop:enable Security/Eval + + + def test_valid + # Parse the PSL and run the tests + data = File.read(PublicSuffix::List::DEFAULT_LIST_PATH) + PublicSuffix::List.default = PublicSuffix::List.parse(data) + + failures = [] + self.class.tests.each do |input, output| + # Punycode domains are not supported ATM + next if input =~ /xn--/ + + domain = PublicSuffix.domain(input) rescue nil + failures << [input, output, domain] if output != domain + end + + message = "The following #{failures.size} tests fail:\n" + failures.each { |i, o, d| message += "Expected %s to be %s, got %s\n" % [i.inspect, o.inspect, d.inspect] } + assert_equal 0, failures.size, message + end + +end diff --git a/vendor/bundle/ruby/3.1.0/gems/public_suffix-4.0.7/test/test_helper.rb b/vendor/bundle/ruby/3.1.0/gems/public_suffix-4.0.7/test/test_helper.rb new file mode 100644 index 000000000..d5907169f --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/public_suffix-4.0.7/test/test_helper.rb @@ -0,0 +1,10 @@ +# frozen_string_literal: true + +require "minitest/autorun" +require "minitest/reporters" +require "mocha/minitest" + +Minitest::Reporters.use! Minitest::Reporters::DefaultReporter.new(color: true) + +$LOAD_PATH.unshift File.expand_path("../lib", __dir__) +require "public_suffix" diff --git a/vendor/bundle/ruby/3.1.0/gems/public_suffix-4.0.7/test/tests.txt b/vendor/bundle/ruby/3.1.0/gems/public_suffix-4.0.7/test/tests.txt new file mode 100644 index 000000000..b11150ab8 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/public_suffix-4.0.7/test/tests.txt @@ -0,0 +1,98 @@ +// Any copyright is dedicated to the Public Domain. +// http://creativecommons.org/publicdomain/zero/1.0/ + +// null input +null, null +// Mixed case +'COM', null +'example.COM', 'example.com' +'WwW.example.COM', 'example.com' +// Leading dot +'.com', null +'.example', null +'.example.com', null +'.example.example', null +// Unlisted TLD +'example', null +'example.example', 'example.example' +'b.example.example', 'example.example' +'a.b.example.example', 'example.example' +// Listed, but non-Internet, TLD +//'local', null +//'example.local', null +//'b.example.local', null +//'a.b.example.local', null +// TLD with only 1 rule +'biz', null +'domain.biz', 'domain.biz' +'b.domain.biz', 'domain.biz' +'a.b.domain.biz', 'domain.biz' +// TLD with some 2-level rules +'com', null +'example.com', 'example.com' +'b.example.com', 'example.com' +'a.b.example.com', 'example.com' +'uk.com', null +'example.uk.com', 'example.uk.com' +'b.example.uk.com', 'example.uk.com' +'a.b.example.uk.com', 'example.uk.com' +'test.ac', 'test.ac' +// TLD with only 1 (wildcard) rule +'mm', null +'c.mm', null +'b.c.mm', 'b.c.mm' +'a.b.c.mm', 'b.c.mm' +// More complex TLD +'jp', null +'test.jp', 'test.jp' +'www.test.jp', 'test.jp' +'ac.jp', null +'test.ac.jp', 'test.ac.jp' +'www.test.ac.jp', 'test.ac.jp' +'kyoto.jp', null +'test.kyoto.jp', 'test.kyoto.jp' +'ide.kyoto.jp', null +'b.ide.kyoto.jp', 'b.ide.kyoto.jp' +'a.b.ide.kyoto.jp', 'b.ide.kyoto.jp' +'c.kobe.jp', null +'b.c.kobe.jp', 'b.c.kobe.jp' +'a.b.c.kobe.jp', 'b.c.kobe.jp' +'city.kobe.jp', 'city.kobe.jp' +'www.city.kobe.jp', 'city.kobe.jp' +// TLD with a wildcard rule and exceptions +'ck', null +'test.ck', null +'b.test.ck', 'b.test.ck' +'a.b.test.ck', 'b.test.ck' +'www.ck', 'www.ck' +'www.www.ck', 'www.ck' +// US K12 +'us', null +'test.us', 'test.us' +'www.test.us', 'test.us' +'ak.us', null +'test.ak.us', 'test.ak.us' +'www.test.ak.us', 'test.ak.us' +'k12.ak.us', null +'test.k12.ak.us', 'test.k12.ak.us' +'www.test.k12.ak.us', 'test.k12.ak.us' +// IDN labels +'食狮.com.cn', '食狮.com.cn' +'食狮.公司.cn', '食狮.公司.cn' +'www.食狮.公司.cn', '食狮.公司.cn' +'shishi.公司.cn', 'shishi.公司.cn' +'公司.cn', null +'食狮.中国', '食狮.中国' +'www.食狮.中国', '食狮.中国' +'shishi.中国', 'shishi.中国' +'中国', null +// Same as above, but punycoded +'xn--85x722f.com.cn', 'xn--85x722f.com.cn' +'xn--85x722f.xn--55qx5d.cn', 'xn--85x722f.xn--55qx5d.cn' +'www.xn--85x722f.xn--55qx5d.cn', 'xn--85x722f.xn--55qx5d.cn' +'shishi.xn--55qx5d.cn', 'shishi.xn--55qx5d.cn' +'xn--55qx5d.cn', null +'xn--85x722f.xn--fiqs8s', 'xn--85x722f.xn--fiqs8s' +'www.xn--85x722f.xn--fiqs8s', 'xn--85x722f.xn--fiqs8s' +'shishi.xn--fiqs8s', 'shishi.xn--fiqs8s' +'xn--fiqs8s', null diff --git a/vendor/bundle/ruby/3.1.0/gems/public_suffix-4.0.7/test/unit/domain_test.rb b/vendor/bundle/ruby/3.1.0/gems/public_suffix-4.0.7/test/unit/domain_test.rb new file mode 100644 index 000000000..968462d94 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/public_suffix-4.0.7/test/unit/domain_test.rb @@ -0,0 +1,106 @@ +# frozen_string_literal: true + +require "test_helper" + +class PublicSuffix::DomainTest < Minitest::Test + + def setup + @klass = PublicSuffix::Domain + end + + # Tokenizes given input into labels. + def test_self_name_to_labels + assert_equal %w( someone spaces live com ), + PublicSuffix::Domain.name_to_labels("someone.spaces.live.com") + assert_equal %w( leontina23samiko wiki zoho com ), + PublicSuffix::Domain.name_to_labels("leontina23samiko.wiki.zoho.com") + end + + # Converts input into String. + def test_self_name_to_labels_converts_input_to_string + assert_equal %w( someone spaces live com ), + PublicSuffix::Domain.name_to_labels(:"someone.spaces.live.com") + end + + + def test_initialize_with_tld + domain = @klass.new("com") + assert_equal "com", domain.tld + assert_nil domain.sld + assert_nil domain.trd + end + + def test_initialize_with_tld_and_sld + domain = @klass.new("com", "google") + assert_equal "com", domain.tld + assert_equal "google", domain.sld + assert_nil domain.trd + end + + def test_initialize_with_tld_and_sld_and_trd + domain = @klass.new("com", "google", "www") + assert_equal "com", domain.tld + assert_equal "google", domain.sld + assert_equal "www", domain.trd + end + + + def test_to_s + assert_equal "com", @klass.new("com").to_s + assert_equal "google.com", @klass.new("com", "google").to_s + assert_equal "www.google.com", @klass.new("com", "google", "www").to_s + end + + def test_to_a + assert_equal [nil, nil, "com"], @klass.new("com").to_a + assert_equal [nil, "google", "com"], @klass.new("com", "google").to_a + assert_equal ["www", "google", "com"], @klass.new("com", "google", "www").to_a + end + + + def test_tld + assert_equal "com", @klass.new("com", "google", "www").tld + end + + def test_sld + assert_equal "google", @klass.new("com", "google", "www").sld + end + + def test_trd + assert_equal "www", @klass.new("com", "google", "www").trd + end + + + def test_name + assert_equal "com", @klass.new("com").name + assert_equal "google.com", @klass.new("com", "google").name + assert_equal "www.google.com", @klass.new("com", "google", "www").name + end + + def test_domain + assert_nil @klass.new("com").domain + assert_nil @klass.new("tldnotlisted").domain + assert_equal "google.com", @klass.new("com", "google").domain + assert_equal "google.tldnotlisted", @klass.new("tldnotlisted", "google").domain + assert_equal "google.com", @klass.new("com", "google", "www").domain + assert_equal "google.tldnotlisted", @klass.new("tldnotlisted", "google", "www").domain + end + + def test_subdomain + assert_nil @klass.new("com").subdomain + assert_nil @klass.new("tldnotlisted").subdomain + assert_nil @klass.new("com", "google").subdomain + assert_nil @klass.new("tldnotlisted", "google").subdomain + assert_equal "www.google.com", @klass.new("com", "google", "www").subdomain + assert_equal "www.google.tldnotlisted", @klass.new("tldnotlisted", "google", "www").subdomain + end + + + def test_domain_question + assert !@klass.new("com").domain? + assert @klass.new("com", "example").domain? + assert @klass.new("com", "example", "www").domain? + assert @klass.new("tldnotlisted", "example").domain? + end + +end diff --git a/vendor/bundle/ruby/3.1.0/gems/public_suffix-4.0.7/test/unit/errors_test.rb b/vendor/bundle/ruby/3.1.0/gems/public_suffix-4.0.7/test/unit/errors_test.rb new file mode 100644 index 000000000..75099ba98 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/public_suffix-4.0.7/test/unit/errors_test.rb @@ -0,0 +1,25 @@ +# frozen_string_literal: true + +require "test_helper" + +class ErrorsTest < Minitest::Test + + # Inherits from StandardError + def test_error_inheritance + assert_kind_of StandardError, + PublicSuffix::Error.new + end + + # Inherits from PublicSuffix::Error + def test_domain_invalid_inheritance + assert_kind_of PublicSuffix::Error, + PublicSuffix::DomainInvalid.new + end + + # Inherits from PublicSuffix::DomainInvalid + def test_domain_not_allowed_inheritance + assert_kind_of PublicSuffix::DomainInvalid, + PublicSuffix::DomainNotAllowed.new + end + +end diff --git a/vendor/bundle/ruby/3.1.0/gems/public_suffix-4.0.7/test/unit/list_test.rb b/vendor/bundle/ruby/3.1.0/gems/public_suffix-4.0.7/test/unit/list_test.rb new file mode 100644 index 000000000..985293524 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/public_suffix-4.0.7/test/unit/list_test.rb @@ -0,0 +1,241 @@ +# frozen_string_literal: true + +require "test_helper" + +class PublicSuffix::ListTest < Minitest::Test + + def setup + @list = PublicSuffix::List.new + end + + def teardown + PublicSuffix::List.default = nil + end + + + def test_initialize + assert_instance_of PublicSuffix::List, @list + assert_equal 0, @list.size + end + + + def test_equality_with_self + list = PublicSuffix::List.new + assert_equal list, list + end + + def test_equality_with_internals + rule = PublicSuffix::Rule.factory("com") + assert_equal PublicSuffix::List.new.add(rule), PublicSuffix::List.new.add(rule) + end + + def test_each_without_block + list = PublicSuffix::List.parse(< `require "rainbow/ext/string"` +* custom rainbow wrapper instances (with separate enabled/disabled state) +* shortcut methods for changing text color (`Rainbow("foo").red`) + +## 1.99.0 (2013-12-26) + +* preparation for dropping String monkey patching +* `require "rainbow/string"` if you want to use monkey patched String +* introduction of Rainbow() wrapper +* support for MRI 1.8.7, 1.9.2, 1.9.3, 2.0 and 2.1, JRuby and Rubinius +* deprecation of Sickill::Rainbow namespace (use Rainbow.enabled = true instead) + +## 1.1.4 (2012-4-28) + +* option for forcing coloring even when STDOUT is not a TTY (CLICOLOR_FORCE env var) +* fix for frozen strings + +## 1.1.3 (2011-12-6) + +* improved compatibility with MRI 1.8.7 +* fix for regression with regards to original string mutation + +## 1.1.2 (2011-11-13) + +* improved compatibility with MRI 1.9.3 + +## 1.1.1 (2011-2-7) + +* improved Windows support + +## 1.1 (2010-6-7) + +* option for enabling/disabling of escape code wrapping +* auto-disabling when STDOUT is not a TTY + +## 1.0.4 (2009-11-27) + +* support for 256 colors + +## 1.0.3 (2009-7-26) + +* rainbow methods don't mutate the original string object anymore + +## 1.0.2 (2009-5-15) + +* improved support for ruby 1.8.6 and 1.9.1 + +## 1.0.1 (2009-3-19) + +* Windows support + +## 1.0.0 (2008-7-21) + +* initial version diff --git a/vendor/bundle/ruby/3.1.0/gems/rainbow-3.1.1/LICENSE b/vendor/bundle/ruby/3.1.0/gems/rainbow-3.1.1/LICENSE new file mode 100644 index 000000000..1330bc625 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/rainbow-3.1.1/LICENSE @@ -0,0 +1,20 @@ +Copyright (c) Marcin Kulik + +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/vendor/bundle/ruby/3.1.0/gems/rainbow-3.1.1/README.markdown b/vendor/bundle/ruby/3.1.0/gems/rainbow-3.1.1/README.markdown new file mode 100644 index 000000000..cbc0bf37e --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/rainbow-3.1.1/README.markdown @@ -0,0 +1,227 @@ +# Rainbow + +[![Gem Version](https://badge.fury.io/rb/rainbow.svg)](https://rubygems.org/gems/rainbow) +[![Build Status](https://travis-ci.org/sickill/rainbow.svg?branch=master)](https://travis-ci.org/sickill/rainbow) +[![Build status](https://ci.appveyor.com/api/projects/status/vq4acb2c38642s5q?svg=true)](https://ci.appveyor.com/project/sickill/rainbow) +[![Code Climate](https://codeclimate.com/github/sickill/rainbow.svg)](https://codeclimate.com/github/sickill/rainbow) +[![Coverage Status](https://coveralls.io/repos/sickill/rainbow/badge.svg)](https://coveralls.io/r/sickill/rainbow) + +Rainbow is a ruby gem for colorizing printed text on ANSI terminals. + +It provides a string presenter object, which adds several methods to your +strings for wrapping them in [ANSI escape +codes](http://en.wikipedia.org/wiki/ANSI_escape_code). These codes when printed +in a terminal change text attributes like text color, background color, +intensity etc. + +## Usage + +To make your string colored wrap it with `Rainbow()` presenter and call +`.color()` on it. + +### Example + +```ruby +require 'rainbow' + +puts Rainbow("this is red").red + " and " + Rainbow("this on yellow bg").bg(:yellow) + " and " + Rainbow("even bright underlined!").underline.bright + +# => "\e[31mthis is red\e[0m and \e[43mthis on yellow bg\e[0m and \e[4m\e[1meven bright underlined!\e[0m" +``` + +![Screenshot of the previous code in a terminal](https://user-images.githubusercontent.com/132/132943811-93747cc5-bdaf-43a2-a1a4-a1f18e805eba.png) + +Or, [watch this video example](https://asciinema.org/a/J928KpHoUQ0sl54ulOSOLE71E?rows=20&speed=2.5) + +### Rainbow presenter API + +Rainbow presenter adds the following methods to presented string: + +* `color(c)` (with `foreground`, and `fg` aliases) +* `background(c)` (with `bg` alias) +* `bright` +* `underline` +* `blink` +* `inverse` +* `hide` +* `faint` (not well supported by terminal emulators) +* `italic` (not well supported by terminal emulators) +* `cross_out`, `strike` + +Text color can also be changed by calling a method named by a color: + +* `black` +* `red` +* `green` +* `yellow` +* `blue` +* `magenta` +* `cyan` +* `white` +* `aqua` +* `silver` +* `aliceblue` +* `indianred` + +All of the methods return `self` (the presenter object) so you can chain method +calls: + +```ruby +Rainbow("hola!").blue.bright.underline +``` + +### Refinement + +If you want to use the Refinements version, you can: + +```ruby +require 'rainbow/refinement' +using Rainbow +puts "Hi!".green +``` + +Here's an IRB session example: + +``` +>> 'Hello, World!'.blue.bright.underline +NoMethodError: undefined method `blue' for "Hello, World!":String + (ripl):1:in `
' +>> using Rainbow +=> main +>> 'Hello, World!'.blue.bright.underline +=> "\e[34m\e[1m\e[4mHello, World!\e[0m" +``` + +### Color specification + +Both `color` and `background` accept color specified in any +of the following ways: + +* ANSI color number (where 0 is black, 1 is red, 2 is green and so on): + `Rainbow("hello").color(1)` + +* [ANSI color](https://en.wikipedia.org/wiki/ANSI_escape_code#Colors) name or [X11 color](https://en.wikipedia.org/wiki/X11_color_names) name as a symbol: + `Rainbow("hello").color(:yellow)`. + This can be simplified to `Rainbow("hello").yellow` + + See [Color list](#user-content-color-list) for all available color names. + Note that ANSI colors can be changed in accordance with terminal setting. + But X11 color is just a syntax sugar for RGB triplet. So you always see what you specified. + +* RGB triplet as separate values in the range 0-255: + `Rainbow("hello").color(115, 23, 98)` + +* RGB triplet as a hex string: + `Rainbow("hello").color("FFC482")` or `Rainbow("hello").color("#FFC482")` + +When you specify a color with a RGB triplet rainbow finds the nearest match +from 256 colors palette. Note that it requires a 256-colors capable terminal to +display correctly. + +#### Example: Choose a random color + +You can pick a random color with Rainbow, it's a one-liner: + +```ruby +colors = Range.new(0,7).to_a +"whoop dee doop".chars.map { |char| Rainbow(char).color(colors.sample) }.join +# => "\e[36mw\e[0m\e[37mh\e[0m\e[34mo\e[0m\e[34mo\e[0m\e[37mp\e[0m\e[34m \e[0m\e[36md\e[0m\e[33me\e[0m\e[34me\e[0m\e[37m \e[0m\e[32md\e[0m\e[35mo\e[0m\e[33mo\e[0m\e[36mp\e[0m" + +colors = [:aliceblue, :antiquewhite, :aqua, :aquamarine, :azure, :beige, :bisque, :blanchedalmond, :blueviolet] +"whoop dee doop".chars.map { |char| Rainbow(char).color(colors.sample) }.join +# => "\e[38;5;135mw\e[0m\e[38;5;230mh\e[0m\e[38;5;231mo\e[0m\e[38;5;135mo\e[0m\e[38;5;231mp\e[0m\e[38;5;231m \e[0m\e[38;5;122md\e[0m\e[38;5;231me\e[0m\e[38;5;231me\e[0m\e[38;5;230m \e[0m\e[38;5;122md\e[0m\e[38;5;51mo\e[0m\e[38;5;51mo\e[0m\e[38;5;51mp\e[0m" +``` + +### Configuration + +Rainbow can be enabled/disabled globally by setting: + +```ruby +Rainbow.enabled = true/false +``` + +When disabled all the methods return an unmodified string +(`Rainbow("hello").red == "hello"`). + +It's enabled by default, unless STDOUT/STDERR is not a TTY or a terminal is +dumb. + +### Advanced usage + +`Rainbow()` and `Rainbow.enabled` operate on the global Rainbow wrapper +instance. If you would like to selectively enable/disable coloring in separate +parts of your application you can get a new Rainbow wrapper instance for each +of them and control the state of coloring during the runtime. + +```ruby +rainbow_one = Rainbow.new +rainbow_two = Rainbow.new + +rainbow_one.enabled = false + +Rainbow("hello").red # => "\e[31mhello\e[0m" ("hello" if not on TTY) +rainbow_one.wrap("hello").red # => "hello" +rainbow_two.wrap("hello").red # => "\e[31mhello\e[0m" ("hello" if not on TTY) +``` + +By default each new instance inherits enabled/disabled state from the global +`Rainbow.enabled`. + +This feature comes handy for example when you have multiple output formatters +in your application and some of them print to a terminal but others write to a +file. Normally rainbow would detect that STDIN/STDERR is a TTY and would +colorize all the strings, even the ones that go through file writing +formatters. You can easily solve that by disabling coloring for the Rainbow +instances that are used by formatters with file output. + +## Installation + +Add it to your Gemfile: + +```ruby +gem 'rainbow' +``` + +Or just install it via rubygems: + +```ruby +gem install rainbow +``` + +## Color list + +### ANSI colors + +`black`, `red`, `green`, `yellow`, `blue`, `magenta`, `cyan`, `white` + +### X11 colors + +`aliceblue`, `antiquewhite`, `aqua`, `aquamarine`, `azure`, `beige`, `bisque`, +`blanchedalmond`, `blueviolet`, `brown`, `burlywood`, `cadetblue`, `chartreuse`, +`chocolate`, `coral`, `cornflower`, `cornsilk`, `crimson`, `darkblue`, +`darkcyan`, `darkgoldenrod`, `darkgray`, `darkgreen`, `darkkhaki`, +`darkmagenta`, `darkolivegreen`, `darkorange`, `darkorchid`, `darkred`, +`darksalmon`, `darkseagreen`, `darkslateblue`, `darkslategray`, `darkturquoise`, +`darkviolet`, `deeppink`, `deepskyblue`, `dimgray`, `dodgerblue`, `firebrick`, +`floralwhite`, `forestgreen`, `fuchsia`, `gainsboro`, `ghostwhite`, `gold`, +`goldenrod`, `gray`, `greenyellow`, `honeydew`, `hotpink`, `indianred`, +`indigo`, `ivory`, `khaki`, `lavender`, `lavenderblush`, `lawngreen`, +`lemonchiffon`, `lightblue`, `lightcoral`, `lightcyan`, `lightgoldenrod`, +`lightgray`, `lightgreen`, `lightpink`, `lightsalmon`, `lightseagreen`, +`lightskyblue`, `lightslategray`, `lightsteelblue`, `lightyellow`, `lime`, +`limegreen`, `linen`, `maroon`, `mediumaquamarine`, `mediumblue`, +`mediumorchid`, `mediumpurple`, `mediumseagreen`, `mediumslateblue`, +`mediumspringgreen`, `mediumturquoise`, `mediumvioletred`, `midnightblue`, +`mintcream`, `mistyrose`, `moccasin`, `navajowhite`, `navyblue`, `oldlace`, +`olive`, `olivedrab`, `orange`, `orangered`, `orchid`, `palegoldenrod`, +`palegreen`, `paleturquoise`, `palevioletred`, `papayawhip`, `peachpuff`, +`peru`, `pink`, `plum`, `powderblue`, `purple`, `rebeccapurple`, `rosybrown`, +`royalblue`, `saddlebrown`, `salmon`, `sandybrown`, `seagreen`, `seashell`, +`sienna`, `silver`, `skyblue`, `slateblue`, `slategray`, `snow`, `springgreen`, +`steelblue`, `tan`, `teal`, `thistle`, `tomato`, `turquoise`, `violet`, +`webgray`, `webgreen`, `webmaroon`, `webpurple`, `wheat`, `whitesmoke`, +`yellowgreen` + +## Authors + +[Marcin Kulik](http://ku1ik.com/) and [great open-source contributors](https://github.com/sickill/rainbow/graphs/contributors). diff --git a/vendor/bundle/ruby/3.1.0/gems/rainbow-3.1.1/lib/rainbow.rb b/vendor/bundle/ruby/3.1.0/gems/rainbow-3.1.1/lib/rainbow.rb new file mode 100644 index 000000000..7fa371ff0 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/rainbow-3.1.1/lib/rainbow.rb @@ -0,0 +1,13 @@ +# frozen_string_literal: true + +require_relative 'rainbow/global' + +module Rainbow + def self.new + Wrapper.new(global.enabled) + end + + self.enabled = false unless STDOUT.tty? && STDERR.tty? + self.enabled = false if ENV['TERM'] == 'dumb' + self.enabled = true if ENV['CLICOLOR_FORCE'] == '1' +end diff --git a/vendor/bundle/ruby/3.1.0/gems/rainbow-3.1.1/lib/rainbow/color.rb b/vendor/bundle/ruby/3.1.0/gems/rainbow-3.1.1/lib/rainbow/color.rb new file mode 100644 index 000000000..74ec3e380 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/rainbow-3.1.1/lib/rainbow/color.rb @@ -0,0 +1,150 @@ +# frozen_string_literal: true + +module Rainbow + class Color + attr_reader :ground + + def self.build(ground, values) + unless [1, 3].include?(values.size) + raise ArgumentError, + "Wrong number of arguments for color definition, should be 1 or 3" + end + + color = values.size == 1 ? values.first : values + + case color + # NOTE: Properly handle versions before/after Ruby 2.4.0. + # Ruby 2.4+ unifies Fixnum & Bignum into Integer. + # However previous versions would still use Fixnum. + # To avoid missing `Fixnum` input, call `0.class` which would + # return either `Integer` or `Fixnum`. + when 0.class + Indexed.new(ground, color) + when Symbol + if Named.color_names.include?(color) + Named.new(ground, color) + elsif X11Named.color_names.include?(color) + X11Named.new(ground, color) + else + raise ArgumentError, + "Unknown color name, valid names: " + + (Named.color_names + X11Named.color_names).join(', ') + end + when Array + RGB.new(ground, *color) + when String + RGB.new(ground, *parse_hex_color(color)) + end + end + + def self.parse_hex_color(hex) + unless hex =~ /^#?[a-f0-9]{6}/i + raise ArgumentError, + "Invalid hexadecimal RGB triplet. Valid format: /^#?[a-f0-9]{6}/i" + end + + hex = hex.sub(/^#/, '') + r = hex[0..1].to_i(16) + g = hex[2..3].to_i(16) + b = hex[4..5].to_i(16) + + [r, g, b] + end + + class Indexed < Color + attr_reader :num + + def initialize(ground, num) + @ground = ground + @num = num + end + + def codes + code = num + (ground == :foreground ? 30 : 40) + + [code] + end + end + + class Named < Indexed + NAMES = { + black: 0, + red: 1, + green: 2, + yellow: 3, + blue: 4, + magenta: 5, + cyan: 6, + white: 7, + default: 9 + }.freeze + + def self.color_names + NAMES.keys + end + + def self.valid_names + color_names.join(', ') + end + + def initialize(ground, name) + unless Named.color_names.include?(name) + raise ArgumentError, + "Unknown color name, valid names: #{self.class.valid_names}" + end + + super(ground, NAMES[name]) + end + end + + class RGB < Indexed + attr_reader :r, :g, :b + + def self.to_ansi_domain(value) + (6 * (value / 256.0)).to_i + end + + def initialize(ground, *values) + if values.min.negative? || values.max > 255 + raise ArgumentError, "RGB value outside 0-255 range" + end + + super(ground, 8) + @r, @g, @b = values + end + + def codes + super + [5, code_from_rgb] + end + + private + + def code_from_rgb + 16 + self.class.to_ansi_domain(r) * 36 + + self.class.to_ansi_domain(g) * 6 + + self.class.to_ansi_domain(b) + end + end + + class X11Named < RGB + include X11ColorNames + + def self.color_names + NAMES.keys + end + + def self.valid_names + color_names.join(', ') + end + + def initialize(ground, name) + unless X11Named.color_names.include?(name) + raise ArgumentError, + "Unknown color name, valid names: #{self.class.valid_names}" + end + + super(ground, *NAMES[name]) + end + end + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/rainbow-3.1.1/lib/rainbow/ext/string.rb b/vendor/bundle/ruby/3.1.0/gems/rainbow-3.1.1/lib/rainbow/ext/string.rb new file mode 100644 index 000000000..aee2fd6c0 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/rainbow-3.1.1/lib/rainbow/ext/string.rb @@ -0,0 +1,64 @@ +# frozen_string_literal: true + +require 'rainbow' + +module Rainbow + module Ext + module String + module InstanceMethods + def foreground(*color) + Rainbow(self).foreground(*color) + end + + alias color foreground + alias colour foreground + + def background(*color) + Rainbow(self).background(*color) + end + + def reset + Rainbow(self).reset + end + + def bright + Rainbow(self).bright + end + + def faint + Rainbow(self).faint + end + + def italic + Rainbow(self).italic + end + + def underline + Rainbow(self).underline + end + + def blink + Rainbow(self).blink + end + + def inverse + Rainbow(self).inverse + end + + def hide + Rainbow(self).hide + end + + def cross_out + Rainbow(self).cross_out + end + + alias strike cross_out + end + end + end +end + +class String + include Rainbow::Ext::String::InstanceMethods +end diff --git a/vendor/bundle/ruby/3.1.0/gems/rainbow-3.1.1/lib/rainbow/global.rb b/vendor/bundle/ruby/3.1.0/gems/rainbow-3.1.1/lib/rainbow/global.rb new file mode 100644 index 000000000..08599bfac --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/rainbow-3.1.1/lib/rainbow/global.rb @@ -0,0 +1,25 @@ +# frozen_string_literal: true + +require_relative 'wrapper' + +module Rainbow + def self.global + @global ||= Wrapper.new + end + + def self.enabled + global.enabled + end + + def self.enabled=(value) + global.enabled = value + end + + def self.uncolor(string) + StringUtils.uncolor(string) + end +end + +def Rainbow(string) + Rainbow.global.wrap(string.to_s) +end diff --git a/vendor/bundle/ruby/3.1.0/gems/rainbow-3.1.1/lib/rainbow/null_presenter.rb b/vendor/bundle/ruby/3.1.0/gems/rainbow-3.1.1/lib/rainbow/null_presenter.rb new file mode 100644 index 000000000..104738f28 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/rainbow-3.1.1/lib/rainbow/null_presenter.rb @@ -0,0 +1,100 @@ +# frozen_string_literal: true + +module Rainbow + class NullPresenter < ::String + def color(*_values) + self + end + + def background(*_values) + self + end + + def reset + self + end + + def bright + self + end + + def faint + self + end + + def italic + self + end + + def underline + self + end + + def blink + self + end + + def inverse + self + end + + def hide + self + end + + def cross_out + self + end + + def black + self + end + + def red + self + end + + def green + self + end + + def yellow + self + end + + def blue + self + end + + def magenta + self + end + + def cyan + self + end + + def white + self + end + + def method_missing(method_name, *args) + if Color::X11Named.color_names.include?(method_name) && args.empty? + self + else + super + end + end + + def respond_to_missing?(method_name, *args) + Color::X11Named.color_names.include?(method_name) && args.empty? || super + end + + alias foreground color + alias fg color + alias bg background + alias bold bright + alias dark faint + alias strike cross_out + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/rainbow-3.1.1/lib/rainbow/presenter.rb b/vendor/bundle/ruby/3.1.0/gems/rainbow-3.1.1/lib/rainbow/presenter.rb new file mode 100644 index 000000000..753f2736a --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/rainbow-3.1.1/lib/rainbow/presenter.rb @@ -0,0 +1,144 @@ +# frozen_string_literal: true + +require_relative 'string_utils' +require_relative 'x11_color_names' +require_relative 'color' + +module Rainbow + class Presenter < ::String + TERM_EFFECTS = { + reset: 0, + bright: 1, + faint: 2, + italic: 3, + underline: 4, + blink: 5, + inverse: 7, + hide: 8, + cross_out: 9 + }.freeze + + # Sets color of this text. + def color(*values) + wrap_with_sgr(Color.build(:foreground, values).codes) + end + + alias foreground color + alias fg color + + # Sets background color of this text. + def background(*values) + wrap_with_sgr(Color.build(:background, values).codes) + end + + alias bg background + + # Resets terminal to default colors/backgrounds. + # + # It shouldn't be needed to use this method because all methods + # append terminal reset code to end of string. + def reset + wrap_with_sgr(TERM_EFFECTS[:reset]) + end + + # Turns on bright/bold for this text. + def bright + wrap_with_sgr(TERM_EFFECTS[:bright]) + end + + alias bold bright + + # Turns on faint/dark for this text (not well supported by terminal + # emulators). + def faint + wrap_with_sgr(TERM_EFFECTS[:faint]) + end + + alias dark faint + + # Turns on italic style for this text (not well supported by terminal + # emulators). + def italic + wrap_with_sgr(TERM_EFFECTS[:italic]) + end + + # Turns on underline decoration for this text. + def underline + wrap_with_sgr(TERM_EFFECTS[:underline]) + end + + # Turns on blinking attribute for this text (not well supported by terminal + # emulators). + def blink + wrap_with_sgr(TERM_EFFECTS[:blink]) + end + + # Inverses current foreground/background colors. + def inverse + wrap_with_sgr(TERM_EFFECTS[:inverse]) + end + + # Hides this text (set its color to the same as background). + def hide + wrap_with_sgr(TERM_EFFECTS[:hide]) + end + + def cross_out + wrap_with_sgr(TERM_EFFECTS[:cross_out]) + end + + alias strike cross_out + + def black + color(:black) + end + + def red + color(:red) + end + + def green + color(:green) + end + + def yellow + color(:yellow) + end + + def blue + color(:blue) + end + + def magenta + color(:magenta) + end + + def cyan + color(:cyan) + end + + def white + color(:white) + end + + # We take care of X11 color method call here. + # Such as #aqua, #ghostwhite. + def method_missing(method_name, *args) + if Color::X11Named.color_names.include?(method_name) && args.empty? + color(method_name) + else + super + end + end + + def respond_to_missing?(method_name, *args) + Color::X11Named.color_names.include?(method_name) && args.empty? || super + end + + private + + def wrap_with_sgr(codes) #:nodoc: + self.class.new(StringUtils.wrap_with_sgr(self, [*codes])) + end + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/rainbow-3.1.1/lib/rainbow/refinement.rb b/vendor/bundle/ruby/3.1.0/gems/rainbow-3.1.1/lib/rainbow/refinement.rb new file mode 100644 index 000000000..cba942ba7 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/rainbow-3.1.1/lib/rainbow/refinement.rb @@ -0,0 +1,14 @@ +# frozen_string_literal: true + +require_relative 'presenter' +require_relative 'global' + +module Rainbow + refine String do + Presenter.instance_methods(false).each do |method_name| + define_method(method_name) do |*args| + ::Rainbow.global.wrap(self).send(method_name, *args) + end + end + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/rainbow-3.1.1/lib/rainbow/string_utils.rb b/vendor/bundle/ruby/3.1.0/gems/rainbow-3.1.1/lib/rainbow/string_utils.rb new file mode 100644 index 000000000..f9a4152e9 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/rainbow-3.1.1/lib/rainbow/string_utils.rb @@ -0,0 +1,22 @@ +# frozen_string_literal: true + +module Rainbow + class StringUtils + def self.wrap_with_sgr(string, codes) + return string if codes.empty? + + seq = "\e[" + codes.join(";") + "m" + + string = string.sub(/^(\e\[([\d;]+)m)*/) { |m| m + seq } + + return string if string.end_with? "\e[0m" + + string + "\e[0m" + end + + def self.uncolor(string) + # See http://www.commandlinefu.com/commands/view/3584/remove-color-codes-special-characters-with-sed + string.gsub(/\e\[[0-9;]*m/, '') + end + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/rainbow-3.1.1/lib/rainbow/version.rb b/vendor/bundle/ruby/3.1.0/gems/rainbow-3.1.1/lib/rainbow/version.rb new file mode 100644 index 000000000..024d6e5ac --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/rainbow-3.1.1/lib/rainbow/version.rb @@ -0,0 +1,5 @@ +# frozen_string_literal: true + +module Rainbow + VERSION = "3.1.1" +end diff --git a/vendor/bundle/ruby/3.1.0/gems/rainbow-3.1.1/lib/rainbow/wrapper.rb b/vendor/bundle/ruby/3.1.0/gems/rainbow-3.1.1/lib/rainbow/wrapper.rb new file mode 100644 index 000000000..053d28ec8 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/rainbow-3.1.1/lib/rainbow/wrapper.rb @@ -0,0 +1,22 @@ +# frozen_string_literal: true + +require_relative 'presenter' +require_relative 'null_presenter' + +module Rainbow + class Wrapper + attr_accessor :enabled + + def initialize(enabled = true) + @enabled = enabled + end + + def wrap(string) + if enabled + Presenter.new(string.to_s) + else + NullPresenter.new(string.to_s) + end + end + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/rainbow-3.1.1/lib/rainbow/x11_color_names.rb b/vendor/bundle/ruby/3.1.0/gems/rainbow-3.1.1/lib/rainbow/x11_color_names.rb new file mode 100644 index 000000000..1a5f78c6b --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/rainbow-3.1.1/lib/rainbow/x11_color_names.rb @@ -0,0 +1,153 @@ +# frozen_string_literal: true + +module Rainbow + module X11ColorNames + NAMES = { + aqua: [0, 255, 255], + aquamarine: [127, 255, 212], + mediumaquamarine: [102, 205, 170], + azure: [240, 255, 255], + beige: [245, 245, 220], + bisque: [255, 228, 196], + black: [0, 0, 0], + blanchedalmond: [255, 235, 205], + blue: [0, 0, 255], + darkblue: [0, 0, 139], + lightblue: [173, 216, 230], + mediumblue: [0, 0, 205], + aliceblue: [240, 248, 255], + cadetblue: [95, 158, 160], + dodgerblue: [30, 144, 255], + midnightblue: [25, 25, 112], + navyblue: [0, 0, 128], + powderblue: [176, 224, 230], + royalblue: [65, 105, 225], + skyblue: [135, 206, 235], + deepskyblue: [0, 191, 255], + lightskyblue: [135, 206, 250], + slateblue: [106, 90, 205], + darkslateblue: [72, 61, 139], + mediumslateblue: [123, 104, 238], + steelblue: [70, 130, 180], + lightsteelblue: [176, 196, 222], + brown: [165, 42, 42], + rosybrown: [188, 143, 143], + saddlebrown: [139, 69, 19], + sandybrown: [244, 164, 96], + burlywood: [222, 184, 135], + chartreuse: [127, 255, 0], + chocolate: [210, 105, 30], + coral: [255, 127, 80], + lightcoral: [240, 128, 128], + cornflower: [100, 149, 237], + cornsilk: [255, 248, 220], + crimson: [220, 20, 60], + cyan: [0, 255, 255], + darkcyan: [0, 139, 139], + lightcyan: [224, 255, 255], + firebrick: [178, 34, 34], + fuchsia: [255, 0, 255], + gainsboro: [220, 220, 220], + gold: [255, 215, 0], + goldenrod: [218, 165, 32], + darkgoldenrod: [184, 134, 11], + lightgoldenrod: [250, 250, 210], + palegoldenrod: [238, 232, 170], + gray: [190, 190, 190], + darkgray: [169, 169, 169], + dimgray: [105, 105, 105], + lightgray: [211, 211, 211], + slategray: [112, 128, 144], + lightslategray: [119, 136, 153], + webgray: [128, 128, 128], + green: [0, 255, 0], + darkgreen: [0, 100, 0], + lightgreen: [144, 238, 144], + palegreen: [152, 251, 152], + darkolivegreen: [85, 107, 47], + yellowgreen: [154, 205, 50], + forestgreen: [34, 139, 34], + lawngreen: [124, 252, 0], + limegreen: [50, 205, 50], + seagreen: [46, 139, 87], + darkseagreen: [143, 188, 143], + lightseagreen: [32, 178, 170], + mediumseagreen: [60, 179, 113], + springgreen: [0, 255, 127], + mediumspringgreen: [0, 250, 154], + webgreen: [0, 128, 0], + honeydew: [240, 255, 240], + indianred: [205, 92, 92], + indigo: [75, 0, 130], + ivory: [255, 255, 240], + khaki: [240, 230, 140], + darkkhaki: [189, 183, 107], + lavender: [230, 230, 250], + lavenderblush: [255, 240, 245], + lemonchiffon: [255, 250, 205], + lime: [0, 255, 0], + linen: [250, 240, 230], + magenta: [255, 0, 255], + darkmagenta: [139, 0, 139], + maroon: [176, 48, 96], + webmaroon: [127, 0, 0], + mintcream: [245, 255, 250], + mistyrose: [255, 228, 225], + moccasin: [255, 228, 181], + oldlace: [253, 245, 230], + olive: [128, 128, 0], + olivedrab: [107, 142, 35], + orange: [255, 165, 0], + darkorange: [255, 140, 0], + orchid: [218, 112, 214], + darkorchid: [153, 50, 204], + mediumorchid: [186, 85, 211], + papayawhip: [255, 239, 213], + peachpuff: [255, 218, 185], + peru: [205, 133, 63], + pink: [255, 192, 203], + deeppink: [255, 20, 147], + lightpink: [255, 182, 193], + hotpink: [255, 105, 180], + plum: [221, 160, 221], + purple: [160, 32, 240], + mediumpurple: [147, 112, 219], + rebeccapurple: [102, 51, 153], + webpurple: [127, 0, 127], + red: [255, 0, 0], + darkred: [139, 0, 0], + orangered: [255, 69, 0], + mediumvioletred: [199, 21, 133], + palevioletred: [219, 112, 147], + salmon: [250, 128, 114], + darksalmon: [233, 150, 122], + lightsalmon: [255, 160, 122], + seashell: [255, 245, 238], + sienna: [160, 82, 45], + silver: [192, 192, 192], + darkslategray: [47, 79, 79], + snow: [255, 250, 250], + tan: [210, 180, 140], + teal: [0, 128, 128], + thistle: [216, 191, 216], + tomato: [255, 99, 71], + turquoise: [64, 224, 208], + darkturquoise: [0, 206, 209], + mediumturquoise: [72, 209, 204], + paleturquoise: [175, 238, 238], + violet: [238, 130, 238], + darkviolet: [148, 0, 211], + blueviolet: [138, 43, 226], + wheat: [245, 222, 179], + white: [255, 255, 255], + antiquewhite: [250, 235, 215], + floralwhite: [255, 250, 240], + ghostwhite: [248, 248, 255], + navajowhite: [255, 222, 173], + whitesmoke: [245, 245, 245], + yellow: [255, 255, 0], + lightyellow: [255, 255, 224], + greenyellow: [173, 255, 47] + }.freeze + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/rake-13.0.6/History.rdoc b/vendor/bundle/ruby/3.1.0/gems/rake-13.0.6/History.rdoc new file mode 100644 index 000000000..b8751f9b6 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/rake-13.0.6/History.rdoc @@ -0,0 +1,2403 @@ +=== 13.0.6 + +* Additional fix for #389 + Pull request #390 by hsbt + +=== 13.0.5 + +* Fixed the regression of #388 + Pull request #389 by hsbt + +=== 13.0.4 + +* Fix rake test loader swallowing useful error information. + Pull request #367 by deivid-rodriguez +* Add -C/--directory option the same as GNU make. + Pull request #376 by nobu + +=== 13.0.3 + +* Fix breaking change of execution order on TestTask. + Pull request #368 by ysakasin + +=== 13.0.2 + +==== Enhancements + +* Fix tests to work with current FileUtils + Pull Request #358 by jeremyevans +* Simplify default rake test loader + Pull Request #357 by deivid-rodriguez +* Update rdoc + Pull Request #366 by bahasalien +* Update broken links to rake articles from Avdi in README + Pull Request #360 by svl7 + +=== 13.0.1 + +==== Bug fixes + +* Fixed bug: Reenabled task raises previous exception on second invokation + Pull Request #271 by thorsteneckel +* Fix an incorrectly resolved arg pattern + Pull Request #327 by mjbellantoni + +=== 13.0.0 + +==== Enhancements + +* Follows recent changes on keyword arguments in ruby 2.7. + Pull Request #326 by nobu +* Make `PackageTask` be able to omit parent directory while packing files + Pull Request #310 by tonytonyjan +* Add order only dependency + Pull Request #269 by take-cheeze + +==== Compatibility changes + +* Drop old ruby versions(< 2.2) + +=== 12.3.3 + +==== Bug fixes + +* Use the application's name in error message if a task is not found. + Pull Request #303 by tmatilai + +==== Enhancements: + +* Use File.open explicitly. + +=== 12.3.2 + +==== Bug fixes + +* Fixed test fails caused by 2.6 warnings. + Pull Request #297 by hsbt + +==== Enhancements: + +* Rdoc improvements. + Pull Request #293 by colby-swandale +* Improve multitask performance. + Pull Request #273 by jsm +* Add alias `prereqs`. + Pull Request #268 by take-cheeze + +=== 12.3.1 + +==== Bug fixes + +* Support did_you_mean >= v1.2.0 which has a breaking change on formatters. + Pull request #262 by FUJI Goro. + +==== Enhancements: + +* Don't run task if it depends on already invoked but failed task. + Pull request #252 by Gonzalo Rodriguez. +* Make space trimming consistent for all task arguments. + Pull request #259 by Gonzalo Rodriguez. +* Removes duplicated inclusion of Rake::DSL in tests. + Pull request #254 by Gonzalo Rodriguez. +* Re-raise a LoadError that didn't come from require in the test loader. + Pull request #250 by Dylan Thacker-Smith. + +=== 12.3.0 + +==== Compatibility Changes + +* Bump `required_ruby_version` to Ruby 2.0.0. Rake has already + removed support for Ruby 1.9.x. + +==== Enhancements: + +* Support `test-bundled-gems` task on ruby core. + +=== 12.2.1 + +==== Bug fixes + +* Fixed to break Capistrano::Application on capistrano3. + +=== 12.2.0 + +==== Enhancements: + +* Make rake easier to use as a library + Pull request #211 by @drbrain +* Fix quadratic performance in FileTask#out_of_date? + Pull request #224 by @doudou +* Clarify output when printing nested exception traces + Pull request #232 by @urbanautomaton + +==== Bug fixes + +* Account for a file that match 2 or more patterns. + Pull request #231 by @styd + +=== 12.1.0 + +==== Enhancements: + +* Added did_you_mean feature for invalid rake task. + Pull request #221 by @xtina-starr +* Enabled to dependency chained by extensions. Pull request #39 by Petr Skocik. +* Make all of string literals to frozen objects on Ruby 2.4 or later. + +==== Bug fixes + +* Typo fixes in rakefile.rdoc. Pull request #180 by Yuta Kurotaki. +* Fix unexpected behavior of file task with dryrun option. + Pull request #183 by @aycabta. +* Make LoadError from running tests more obvious. Pull request #195 + by Eric Hodel. +* Fix unexpected TypeError with hash style option. Pull request #202 + by Kuniaki IGARASHI. + +=== 12.0.0 + +==== Compatibility Changes + +* Removed arguments on clear #157 by Jesse Bowes +* Removed `rake/contrib` packages. These are extracted to `rake-contrib` gem. +* Removed deprecated method named `last\_comment`. + +==== Enhancements: + +* Re-use trace option on `cleanup` task. #164 by Brian Henderson +* Actions adore keyword arguments #174 by Josh Cheek +* Rake::TaskArguments#key? alias of #has_key? #175 by Paul Annesley + +=== 11.3.0 / 2016-09-20 + +==== Enhancements: + +* Remove to reference `Fixnum` constant. Pull request #160 by nobu + +=== 11.2.2 / 2016-06-12 + +==== Bug fixes + +* Fix unexpected behavior with multiple dependencies on Rake::TestTask + +=== 11.2.1 / 2016-06-12 + +==== Bug fixes + +* Fix regression of dependencies handling on Rake::TestTask. Report #139 + +=== 11.2.0 / 2016-06-11 + +==== Bug fixes + +* Fix unexpected cut-out behavior on task description using triple dots + and exclamation. Report #106 from Stephan Kämper and Pull request #134 by Lee +* Fix empty argument assignment with `with_defaults` option. Pull request #135 + by bakunyo +* Ignore to use `hwprefs` on Darwin platform. Use sysctl now. Report #128 + +==== Enhancements + +* Spawn options for sh Pull equest #138 by Eric Hodel. +* Allow to specify dependencies(prerequisites) for Rake::TestTask + Pull request #117 by Tim Maslyuchenko +* Use Bundler task instead of hoe for gem release. +* Remove explicitly load to rubygems for Ruby 1.8. +* Unify to declare `Rake::VERSION`. +* Support xz format for PackageTask. + +=== 11.1.2 / 2016-03-28 + +==== Bug fixes + +* Remove `-W` option when Rake::TestTask#verbose enabled. It's misunderstanding + specification change with Rake 11. Partly revert #67 + +=== 11.1.1 / 2016-03-14 + +==== Bug fixes + +* Use `-W` instead of `--verbose` when Rake::TestTask#verbose enabled. + JRuby doesn't have `--verbose` option. + +=== 11.1.0 / 2016-03-11 + +==== Compatibility Changes + +* Revert to remove `last\_comment`. It will remove Rake 12. + +=== 11.0.1 / 2016-03-09 + +==== Bug fixes + +* Fixed packaging manifest. + +=== 11.0.0 / 2016-03-09 + +==== Bug fixes + +* Correctly handle bad encoding in exception messages. Pull request #113 + by Tomer Brisker +* Fix verbose option at TestTask. Pull request #67 by Mike Blumtritt + +==== Enhancements + +* Make FileList#exclude more analogous to FileList#include. +* Use IO.open instead of Open3.popen3 for CPU counter. +* Make Rake::Task#already_invoked publicly accessible. + Pull request #93 by Joe Rafaniello +* Lookup prerequisites with same name outside of scope instead of + matching self. Pull request #96 by Sandy Vanderbleek +* Make FileList#pathmap behave like String#pathmap. + Pull request #61 by Daniel Tamai +* Add fetch method to task arguments. + Pull request #12 by Chris Keathley +* Use ruby warnings by default. Pull request #97 by Harold Giménez + +==== Compatibility Changes + +* Removed to support Ruby 1.8.x +* Removed constant named `RAKEVERSION` +* Removed Rake::AltSystem +* Removed Rake::RubyForgePublisher +* Removed Rake::TaskManager#last\_comment. Use last\_description. +* Removed Rake::TaskLib#paste +* Removed Top-level SshDirPublisher, SshFreshDirPublisher, SshFilePublisher + and CompositePublisher from lib/rake/contrib/publisher.rb +* Removed "rake/runtest.rb" + +=== 10.5.0 / 2016-01-13 + +==== Enhancements + +* Removed monkey patching for Ruby 1.8. Pull request #46 by Pablo Herrero. +* Inheritance class of Rake::FileList returns always self class. + Pull request #74 by Thomas Scholz + +=== 10.4.2 / 2014-12-02 + +==== Bug fixes + +* Rake no longer edits ARGV. This allows you to re-exec rake from a rake + task. Pull requset #9 by Matt Palmer. +* Documented how Rake::DSL#desc handles sentences in task descriptions. + Issue #7 by Raza Sayed. +* Fixed test error on 1.9.3 with legacy RubyGems. Issue #8 by Matt Palmer. +* Deleted duplicated History entry. Pull request #10 by Yuji Yamamoto. + +=== 10.4.1 / 2014-12-01 + +==== Bug fixes + +* Reverted fix for #277 as it caused numerous issues for rake users. + rails/spring issue #366 by Gustavo Dutra. + +=== 10.4.0 / 2014-11-22 + +==== Enhancements + +* Upgraded to minitest 5. Pull request #292 by Teo Ljungberg. +* Added support for Pathname in rake tasks. Pull request #271 by Randy + Coulman. +* Rake now ignores falsy dependencies which allows for easier programmatic + creation of tasks. Pull request #273 by Manav. +* Rake no longer edits ARGV. This allows you to re-exec rake from a rake + task. Issue #277 by Matt Palmer. +* Etc.nprocessors is used for counting the number of CPUs. + +==== Bug fixes + +* Updated rake manpage. Issue #283 by Nathan Long, pull request #291 by + skittleys. +* Add Rake::LATE to allow rebuilding of files that depend on deleted files. + Bug #286, pull request #287 by David Grayson. +* Fix relinking of files when repackaging. Bug #276 by Muenze. +* Fixed some typos. Pull request #280 by Jed Northridge. +* Try counting CPUs via cpuinfo if host_os was not matched. Pull request + #282 by Edouard B. + +=== 10.3.2 / 2014-05-15 + +==== Bug fixes + +* Rake no longer infinitely loops when showing exception causes that refer to + each other. Bug #272 by Chris Bandy. +* Fixed documentation typos. Bug #275 by Jake Worth. + +=== 10.3.1 / 2014-04-17 + +==== Bug fixes + +* Really stop reporting an error when cleaning already-deleted files. Pull + request #269 by Randy Coulman +* Fixed infinite loop when cleaning already-deleted files on windows. + +=== 10.3 / 2014-04-15 + +==== Enhancements + +* Added --build-all option to rake which treats all file prerequisites as + out-of-date. Pull request #254 by Andrew Gilbert. +* Added Rake::NameSpace#scope. Issue #263 by Jon San Miguel. + +==== Bug fixes + +* Suppress org.jruby package files in rake error messages for JRuby users. + Issue #213 by Charles Nutter. +* Fixed typo, removed extra "h". Pull request #267 by Hsing-Hui Hsu. +* Rake no longer reports an error when cleaning already-deleted files. Pull + request #266 by Randy Coulman. +* Consume stderr while determining CPU count to avoid hang. Issue #268 by + Albert Sun. + +=== 10.2.2 / 2014-03-27 + +==== Bug fixes + +* Restored Ruby 1.8.7 compatibility + +=== 10.2.1 / 2014-03-25 + +==== Bug fixes + +* File tasks including a ':' are now top-level tasks again. Issue #262 by + Josh Holtrop. +* Use sysctl for CPU count for all BSDs. Pull request #261 by Joshua Stein. +* Fixed CPU detection for unknown platforms. + +=== 10.2.0 / 2014-03-24 + +==== Enhancements + +* Rake now requires Ruby 1.9 or newer. For me, this is a breaking change, but + it seems that Jim planned to release it with Rake 10.2. See also pull + request #247 by Philip Arndt. +* Rake now allows you to declare tasks under a namespace like: + + task 'a:b' do ... end + + Pull request #232 by Judson Lester. +* Task#source defaults to the first prerequisite in non-rule tasks. Pull + request #215 by Avdi Grimm. +* Rake now automatically rebuilds and reloads imported files. Pull request + #209 by Randy Coulman. +* The rake task arguments can contain escaped commas. Pull request #214 by + Filip Hrbek. +* Rake now prints the exception class on errors. Patch #251 by David Cornu. + +==== Bug fixes + +* Fixed typos. Pull request #256 by Valera Rozuvan, #250 via Jake Worth, #260 + by Zachary Scott. +* Fixed documentation for calling tasks with arguments. Pull request #235 by + John Varghese. +* Clarified `rake -f` usage message. Pull request #252 by Marco Pfatschbacher. +* Fixed a test failure on windows. Pull request #231 by Hiroshi Shirosaki. +* Fixed corrupted rake.1.gz. Pull request #225 by Michel Boaventura. +* Fixed bug in can\_detect\_signals? in test. Patch from #243 by Alexey + Borzenkov. + +=== 10.1.1 + +* Use http://github.com/jimweirich/rake instead of http://rake.rubyforge.org for + canonical project url. + +=== 10.1.0 + +==== Changes + +===== New Features + +* Add support for variable length task argument lists. If more actual + arguments are supplied than named arguments, then the extra + arguments values will be in args.extras. + +* Application name is not displayed in the help banner. (Previously + "rake" was hardcoded, now rake-based applications can display their + own names). + +===== Bug Fixes + +Bug fixes include: + +* Fix backtrace suppression issues. + +* Rules now explicit get task arguments passed to them. + +* Rename FileList#exclude? to FileList#exclude\_from\_list? to avoid + conflict with new Rails method. + +* Clean / Clobber tasks now report failure to remove files. + +* Plus heaps of internal code cleanup. + +==== Thanks + +As usual, it was input from users that drove a lot of these changes. +The following people contributed patches, made suggestions or made +otherwise helpful comments. Thanks to ... + +* Michael Nikitochkin (general code cleanup) +* Vipul A M (general code cleanup) +* Dennis Bell (variable length task argument lists) +* Jacob Swanner (rules arguments) +* Rafael Rosa Fu (documentation typo) +* Stuart Nelson (install.rb fixes) +* Lee Hambley (application name in help banner) + +-- Jim Weirich + +=== 10.0.3 + + "Jim, when will Rake reach version 1.0?" + +Over the past several years I've been asked that question at +conferences, panels and over twitter. Due to historical reasons (or +maybe just plain laziness) Rake has (incorrectly) been treating the +second digit of the version as the major release number. So in my head +Rake was already at version 9. + +Well, it's time to fix things. This next version of Rake drops old, +crufty, backwards compatibility hacks such as top level constants, DSL +methods defined in Object and numerous other features that are just no +longer desired. It's also time to drop the leading zero from the +version number as well and call this new version of rake what it +really is: Version 10. + +So, welcome to Rake 10.0! + +Rake 10 is actually feature identical to the latest version of Rake 9 +(that would be the version spelled 0.9.3), *except* that Rake 10 drops +all the sundry deprecated features that have accumulated over the years. + +If your Rakefile is up to date and current with all the new features +of Rake 10, you are ready to go. If your Rakefile still uses a few +deprecated feeatures, feel free to use Rake 9 (0.9.3) with the same +feature set. Just be aware that future features will be in Rake 10 +family line. + +==== Changes + +As mentioned above, there are no new features in Rake 10. However, +there are a number of features missing: + +* Classic namespaces are now gone. Rake is no longer able to reflect + the options settings in the global variables ($rakefile, $show\_tasks, + $show\_prereqs, $trace, $dryrun and $silent). The + --classic-namespace option is no longer supported. + +* Global constants are no longer supported. This includes + Task, FileTask, FileCreationTask and + RakeApp). The constant missing hook to warn about using + global rake constants has been removed. + +* The Rake DSL methods (task, file, directory, etc) are in their own + module (Rake::DSL). The stub versions of these methods (that printed + warnings) in Object have been removed. However, the DSL methods are + added to the top-level main object. Since main is + not in the inheritance tree, the presence of the DSL methods in main + should be low impact on other libraries. + + If you want to use the Rake DSL commands from your own code, just + include Rake::DSL into your own classes and modules. + +* The deprecated syntax for task arguments (the one using + :needs) has been removed. + +* The --reduce-compat flag has been removed (it's not needed + anymore). + +* The deprecated rake/sys.rb library has been removed. + +* The deprecated rake/rdoctask.rb library has been removed. + RDoc supplies its own rake task now. + +* The deprecated rake/gempackagetask.rb library has been + removed. Gem supplies its own package task now. + +There is one small behavioral change: + +* Non-file tasks now always report the current time as their time + stamp. This is different from the previous behavior where non-file + tasks reported current time only if there were no prerequisites, and + the max prerequisite timestamp otherwise. This lead to inconsistent + and surprising behavior when adding prerequisites to tasks that in + turn were prequisites to file tasks. The new behavior is more + consistent and predictable. + +==== Changes (from 0.9.3, 0.9.4, 0.9.5) + +Since Rake 10 includes the changes from the last version of Rake 9, +we'll repeat the changes for versions 0.9.3 through 0.9.5 here. + +===== New Features (in 0.9.3) + +* Multitask tasks now use a thread pool. Use -j to limit the number of + available threads. + +* Use -m to turn regular tasks into multitasks (use at your own risk). + +* You can now do "Rake.add_rakelib 'dir'" in your Rakefile to + programatically add rake task libraries. + +* You can specific backtrace suppression patterns (see + --suppress-backtrace) + +* Directory tasks can now take prerequisites and actions + +* Use --backtrace to request a full backtrace without the task trace. + +* You can say "--backtrace=stdout" and "--trace=stdout" to route trace + output to standard output rather than standard error. + +* Optional 'phony' target (enable with 'require 'rake/phony'") for + special purpose builds. + +* Task#clear now clears task comments as well as actions and + prerequisites. Task#clear_comment will specifically target comments. + +* The --all option will force -T and -D to consider all the tasks, + with and without descriptions. + +===== Bug Fixes (in 0.9.3) + +* Semi-colons in windows rakefile paths now work. + +* Improved Control-C support when invoking multiple test suites. + +* egrep method now reads files in text mode (better support for + Windows) + +* Better deprecation line number reporting. + +* The -W option now works with all tasks, whether they have a + description or not. + +* File globs in rake should not be sorted alphabetically, independent + of file system and platform. + +* Numerous internal improvements. + +* Documentation typos and fixes. + +===== Bug Fixes (in 0.9.4) + +* Exit status with failing tests is not correctly set to non-zero. + +* Simplified syntax for phony task (for older versions of RDoc). + +* Stand alone FileList usage gets glob function (without loading in + extra dependencies) + +===== Bug Fixes (in 0.9.5) + +* --trace and --backtrace no longer swallow following task names. + +==== Thanks + +As usual, it was input from users that drove a lot of these changes. The +following people contributed patches, made suggestions or made +otherwise helpful comments. Thanks to ... + +* Aaron Patterson +* Dylan Smith +* Jo Liss +* Jonas Pfenniger +* Kazuki Tsujimoto +* Michael Bishop +* Michael Elufimov +* NAKAMURA Usaku +* Ryan Davis +* Sam Grönblom +* Sam Phippen +* Sergio Wong +* Tay Ray Chuan +* grosser +* quix + +Also, many thanks to Eric Hodel for assisting with getting this release +out the door. + +-- Jim Weirich + +=== 10.0.2 + +==== Changes + +===== Bug Fixes + +* --trace and --backtrace no longer swallow following task names. + +==== Thanks + +As usual, it was input from users that drove a lot of these changes. The +following people contributed patches, made suggestions or made +otherwise helpful comments. Thanks to ... + +* Aaron Patterson +* Dylan Smith +* Jo Liss +* Jonas Pfenniger +* Kazuki Tsujimoto +* Michael Bishop +* Michael Elufimov +* NAKAMURA Usaku +* Ryan Davis +* Sam Grönblom +* Sam Phippen +* Sergio Wong +* Tay Ray Chuan +* grosser +* quix + +Also, many thanks to Eric Hodel for assisting with getting this release +out the door. + +-- Jim Weirich + +=== 10.0.1 + +==== Changes + +===== Bug Fixes + +* Exit status with failing tests is not correctly set to non-zero. + +* Simplified syntax for phony task (for older versions of RDoc). + +* Stand alone FileList usage gets glob function (without loading in + extra dependencies) + +==== Thanks + +As usual, it was input from users that drove a lot of these changes. The +following people contributed patches, made suggestions or made +otherwise helpful comments. Thanks to ... + +* Aaron Patterson +* Dylan Smith +* Jo Liss +* Jonas Pfenniger +* Kazuki Tsujimoto +* Michael Bishop +* Michael Elufimov +* NAKAMURA Usaku +* Ryan Davis +* Sam Grönblom +* Sam Phippen +* Sergio Wong +* Tay Ray Chuan +* grosser +* quix + +Also, many thanks to Eric Hodel for assisting with getting this release +out the door. + +-- Jim Weirich + +=== 10.0.0 + + "Jim, when will Rake reach version 1.0?" + +Over the past several years I've been asked that question at +conferences, panels and over twitter. Due to historical reasons (or +maybe just plain laziness) Rake has (incorrectly) been treating the +second digit of the version as the major release number. So in my head +Rake was already at version 9. + +Well, it's time to fix things. This next version of Rake drops old, +crufty, backwards compatibility hacks such as top level constants, DSL +methods defined in Object and numerous other features that are just no +longer desired. It's also time to drop the leading zero from the +version number as well and call this new version of rake what it +really is: Version 10. + +So, welcome to Rake 10.0! + +Rake 10 is actually feature identical to the latest version of Rake 9 +(that would be the version spelled 0.9.3), *except* that Rake 10 drops +all the sundry deprecated features that have accumulated over the years. + +If your Rakefile is up to date and current with all the new features +of Rake 10, you are ready to go. If your Rakefile still uses a few +deprecated feeatures, feel free to use Rake 9 (0.9.3) with the same +feature set. Just be aware that future features will be in Rake 10 +family line. + +==== Changes in 10.0 + +As mentioned above, there are no new features in Rake 10. However, +there are a number of features missing: + +* Classic namespaces are now gone. Rake is no longer able to reflect + the options settings in the global variables ($rakefile, $show\_tasks, + $show\_prereqs, $trace, $dryrun and $silent). The + --classic-namespace option is no longer supported. + +* Global constants are no longer supported. This includes + Task, FileTask, FileCreationTask and + RakeApp). The constant missing hook to warn about using + global rake constants has been removed. + +* The Rake DSL methods (task, file, directory, etc) are in their own + module (Rake::DSL). The stub versions of these methods (that printed + warnings) in Object have been removed. However, the DSL methods are + added to the top-level main object. Since main is + not in the inheritance tree, the presence of the DSL methods in main + should be low impact on other libraries. + + If you want to use the Rake DSL commands from your own code, just + include Rake::DSL into your own classes and modules. + +* The deprecated syntax for task arguments (the one using + :needs) has been removed. + +* The --reduce-compat flag has been removed (it's not needed + anymore). + +* The deprecated rake/sys.rb library has been removed. + +* The deprecated rake/rdoctask.rb library has been removed. + RDoc supplies its own rake task now. + +* The deprecated rake/gempackagetask.rb library has been + removed. Gem supplies its own package task now. + +There is one small behavioral change: + +* Non-file tasks now always report the current time as their time + stamp. This is different from the previous behavior where non-file + tasks reported current time only if there were no prerequisites, and + the max prerequisite timestamp otherwise. This lead to inconsistent + and surprising behavior when adding prerequisites to tasks that in + turn were prequisites to file tasks. The new behavior is more + consistent and predictable. + +==== Changes (from 0.9.3) + +Since Rake 10 includes the changes from the last version of Rake 9, +we'll repeat the changes for version 0.9.3 here. + +===== New Features + +* Multitask tasks now use a thread pool. Use -j to limit the number of + available threads. + +* Use -m to turn regular tasks into multitasks (use at your own risk). + +* You can now do "Rake.add_rakelib 'dir'" in your Rakefile to + programatically add rake task libraries. + +* You can specific backtrace suppression patterns (see + --suppress-backtrace) + +* Directory tasks can now take prerequisites and actions + +* Use --backtrace to request a full backtrace without the task trace. + +* You can say "--backtrace=stdout" and "--trace=stdout" to route trace + output to standard output rather than standard error. + +* Optional 'phony' target (enable with 'require 'rake/phony'") for + special purpose builds. + +* Task#clear now clears task comments as well as actions and + prerequisites. Task#clear_comment will specifically target comments. + +* The --all option will force -T and -D to consider all the tasks, + with and without descriptions. + +===== Bug Fixes + +* Semi-colons in windows rakefile paths now work. + +* Improved Control-C support when invoking multiple test suites. + +* egrep method now reads files in text mode (better support for + Windows) + +* Better deprecation line number reporting. + +* The -W option now works with all tasks, whether they have a + description or not. + +* File globs in rake should not be sorted alphabetically, independent + of file system and platform. + +* Numerous internal improvements. + +* Documentation typos and fixes. + + +==== Thanks + +As usual, it was input from users that drove a lot of these changes. The +following people contributed patches, made suggestions or made +otherwise helpful comments. Thanks to ... + +* Aaron Patterson +* Dylan Smith +* Jo Liss +* Jonas Pfenniger +* Kazuki Tsujimoto +* Michael Bishop +* Michael Elufimov +* NAKAMURA Usaku +* Ryan Davis +* Sam Grönblom +* Sam Phippen +* Sergio Wong +* Tay Ray Chuan +* grosser +* quix + +Also, many thanks to Eric Hodel for assisting with getting this release +out the door. + +-- Jim Weirich + +=== 0.9.6 + +Rake version 0.9.6 contains a number of fixes mainly for merging +Rake into the Ruby source tree and fixing tests. + +==== Changes + +===== Bug Fixes (0.9.6) + +* Better trace output when using a multi-threaded Rakefile. +* Arg parsing is now consistent for tasks and multitasks. +* Skip exit code test in versions of Ruby that don't support it well. + +Changes for better integration with the Ruby source tree: + +* Fix version literal for Ruby source tree build. +* Better loading of libraries for testing in Ruby build. +* Use the ruby version provided by Ruby's tests. + +==== Thanks + +As usual, it was input from users that drove a alot of these changes. The +following people either contributed patches, made suggestions or made +otherwise helpful comments. Thanks to ... + +* Aaron Patterson +* Dylan Smith +* Jo Liss +* Jonas Pfenniger +* Kazuki Tsujimoto +* Michael Bishop +* Michael Elufimov +* NAKAMURA Usaku +* Ryan Davis +* Sam Grönblom +* Sam Phippen +* Sergio Wong +* Tay Ray Chuan +* grosser +* quix + +Also, many thanks to Eric Hodel for assisting with getting this release +out the door. + +-- Jim Weirich + +=== 0.9.5 + +Rake version 0.9.5 contains a number of bug fixes. + +==== Changes + +===== Bug Fixes (0.9.5) + +* --trace and --backtrace no longer swallow following task names. + +==== Thanks + +As usual, it was input from users that drove a alot of these changes. The +following people either contributed patches, made suggestions or made +otherwise helpful comments. Thanks to ... + +* Aaron Patterson +* Dylan Smith +* Jo Liss +* Jonas Pfenniger +* Kazuki Tsujimoto +* Michael Bishop +* Michael Elufimov +* NAKAMURA Usaku +* Ryan Davis +* Sam Grönblom +* Sam Phippen +* Sergio Wong +* Tay Ray Chuan +* grosser +* quix + +Also, many thanks to Eric Hodel for assisting with getting this release +out the door. + +-- Jim Weirich + +=== 0.9.4 + +Rake version 0.9.4 contains a number of bug fixes. + +==== Changes + +===== Bug Fixes (0.9.4) + +* Exit status with failing tests is not correctly set to non-zero. + +* Simplified syntax for phony task (for older versions of RDoc). + +* Stand alone FileList usage gets glob function (without loading in + extra dependencies) + +==== Thanks + +As usual, it was input from users that drove a alot of these changes. The +following people either contributed patches, made suggestions or made +otherwise helpful comments. Thanks to ... + +* Aaron Patterson +* Dylan Smith +* Jo Liss +* Jonas Pfenniger +* Kazuki Tsujimoto +* Michael Bishop +* Michael Elufimov +* NAKAMURA Usaku +* Ryan Davis +* Sam Grönblom +* Sam Phippen +* Sergio Wong +* Tay Ray Chuan +* grosser +* quix + +Also, many thanks to Eric Hodel for assisting with getting this release +out the door. + +-- Jim Weirich + +=== 0.9.3 + +Rake version 0.9.3 contains some new, backwards compatible features and +a number of bug fixes. + +==== Changes + +===== New Features + +* Multitask tasks now use a thread pool. Use -j to limit the number of + available threads. + +* Use -m to turn regular tasks into multitasks (use at your own risk). + +* You can now do "Rake.add_rakelib 'dir'" in your Rakefile to + programatically add rake task libraries. + +* You can specific backtrace suppression patterns (see + --suppress-backtrace) + +* Directory tasks can now take prerequisites and actions + +* Use --backtrace to request a full backtrace without the task trace. + +* You can say "--backtrace=stdout" and "--trace=stdout" to route trace + output to standard output rather than standard error. + +* Optional 'phony' target (enable with 'require 'rake/phony'") for + special purpose builds. + +* Task#clear now clears task comments as well as actions and + prerequisites. Task#clear_comment will specifically target comments. + +* The --all option will force -T and -D to consider all the tasks, + with and without descriptions. + +===== Bug Fixes + +* Semi-colons in windows rakefile paths now work. + +* Improved Control-C support when invoking multiple test suites. + +* egrep method now reads files in text mode (better support for + Windows) + +* Better deprecation line number reporting. + +* The -W option now works with all tasks, whether they have a + description or not. + +* File globs in rake should not be sorted alphabetically, independent + of file system and platform. + +* Numerous internal improvements. + +* Documentation typos and fixes. + +==== Thanks + +As usual, it was input from users that drove a alot of these changes. The +following people either contributed patches, made suggestions or made +otherwise helpful comments. Thanks to ... + +* Aaron Patterson +* Dylan Smith +* Jo Liss +* Jonas Pfenniger +* Kazuki Tsujimoto +* Michael Bishop +* Michael Elufimov +* NAKAMURA Usaku +* Ryan Davis +* Sam Grönblom +* Sam Phippen +* Sergio Wong +* Tay Ray Chuan +* grosser +* quix + +Also, many thanks to Eric Hodel for assisting with getting this release +out the door. + +-- Jim Weirich + +=== Rake 0.9.2.2 + +Rake version 0.9.2.2 is mainly bug fixes. + +==== Changes + +* The rake test loader now removes arguments it has processed. Issue #51 +* Rake::TaskArguments now responds to #values\_at +* RakeFileUtils.verbose_flag = nil silences output the same as 0.8.7 +* Rake tests are now directory-independent +* Rake tests are no longer require flexmock +* Commands constant is no longer polluting top level namespace. +* Show only the interesting portion of the backtrace by default (James M. Lawrence). +* Added --reduce-compat option to remove backward compatible DSL hacks (James M. Lawrence). + +==== Thanks + +As usual, it was input from users that drove a alot of these changes. The +following people either contributed patches, made suggestions or made +otherwise helpful comments. Thanks to ... + +* James M. Lawrence (quix) +* Roger Pack +* Cezary Baginski +* Sean Scot August Moon +* R.T. Lechow +* Alex Chaffee +* James Tucker +* Matthias Lüdtke +* Santiago Pastorino + +Also, bit thanks to Eric Hodel for assisting with getting this release +out the door (where "assisting" includes, but is not by any means +limited to, "pushing" me to get it done). + +-- Jim Weirich + +=== 0.9.2 + +Rake version 0.9.2 has a few small fixes. See below for details. + +==== Changes + +* Support for Ruby 1.8.6 was fixed. +* Global DSL warnings now honor --no-deprecate + +==== Thanks + +As usual, it was input from users that drove a alot of these changes. The +following people either contributed patches, made suggestions or made +otherwise helpful comments. Thanks to ... + +* James M. Lawrence (quix) +* Roger Pack +* Cezary Baginski +* Sean Scot August Moon +* R.T. Lechow +* Alex Chaffee +* James Tucker +* Matthias Lüdtke +* Santiago Pastorino + +Also, bit thanks to Eric Hodel for assisting with getting this release +out the door (where "assisting" includes, but is not by any means +limited to, "pushing" me to get it done). + +-- Jim Weirich + +=== 0.9.1 + +Rake version 0.9.1 has a number of bug fixes and enhancments (see +below for more details). Additionally, the internals have be slightly +restructured and improved. + +==== Changes + +Rake 0.9.1 adds back the global DSL methods, but with deprecation +messages. This allows Rake 0.9.1 to be used with older rakefiles with +warning messages. + +==== Thanks + +As usual, it was input from users that drove a alot of these changes. The +following people either contributed patches, made suggestions or made +otherwise helpful comments. Thanks to ... + +* James M. Lawrence (quix) +* Roger Pack +* Cezary Baginski +* Sean Scot August Moon +* R.T. Lechow +* Alex Chaffee +* James Tucker +* Matthias Lüdtke +* Santiago Pastorino + +Also, bit thanks to Eric Hodel for assisting with getting this release +out the door (where "assisting" includes, but is not by any means +limited to, "pushing" me to get it done). + +-- Jim Weirich + +=== 0.9.0 + +Rake version 0.9.0 has a number of bug fixes and enhancments (see +below for more details). Additionally, the internals have be slightly +restructured and improved. + +==== Changes + +===== New Features / Enhancements / Bug Fixes in Version 0.9.0 + +* Rake now warns when the deprecated :needs syntax used (and suggests + the proper syntax in the warning). + +* Moved Rake DSL commands to top level ruby object 'main'. Rake DSL + commands are no longer private methods in Object. (Suggested by + James M. Lawrence/quix) + +* Rake now uses case-insensitive comparisons to find the Rakefile on Windows. + Based on patch by Roger Pack. + +* Rake now requires (instead of loads) files in the test task. Patch by Cezary + Baginski. + +* Fixed typos. Patches by Sean Scot August Moon and R.T. Lechow. + +* Rake now prints the Rakefile directory only when it's different from the + current directory. Patch by Alex Chaffee. + +* Improved rakefile_location discovery on Windows. Patch by James Tucker. + +* Rake now recognizes "Windows Server" as a windows system. Patch by Matthias + Lüdtke + +* Rake::RDocTask is deprecated. Use RDoc::Task from RDoc 2.4.2+ (require + 'rdoc/task') + +* Rake::GemPackageTask is deprecated. Use Gem::PackageTask (require + 'rubygems/package\_task') + +* Rake now outputs various messages to $stderr instead of $stdout. + +* Rake no longer emits warnings for Config. Patch by Santiago Pastorino. + +* Removed Rake's DSL methods from the top level scope. If you need to + call 'task :xzy' in your code, include Rake::DSL into your class, or + put the code in a Rake::DSL.environment do ... end block. + +* Split rake.rb into individual files. + +* Support for the --where (-W) flag for showing where a task is defined. + +* Fixed quoting in test task. + (http://onestepback.org/redmine/issues/show/44, + http://www.pivotaltracker.com/story/show/1223138) + +* Fixed the silent option parsing problem. + (http://onestepback.org/redmine/issues/show/47) + +* Fixed :verbose=>false flag on sh and ruby commands. + +* Rake command line options may be given by default in a RAKEOPT + environment variable. + +* Errors in Rake will now display the task invocation chain in effect + at the time of the error. + +* Accepted change by warnickr to not expand test patterns in shell + (allowing more files in the test suite). + +* Fixed that file tasks did not perform prereq lookups in scope + (Redmine #57). + +==== Thanks + +As usual, it was input from users that drove a alot of these changes. The +following people either contributed patches, made suggestions or made +otherwise helpful comments. Thanks to ... + +* James M. Lawrence (quix) +* Roger Pack +* Cezary Baginski +* Sean Scot August Moon +* R.T. Lechow +* Alex Chaffee +* James Tucker +* Matthias Lüdtke +* Santiago Pastorino + +Also, bit thanks to Eric Hodel for assisting with getting this release +out the door (where "assisting" includes, but is not by any means +limited to, "pushing" me to get it done). + +-- Jim Weirich + + +=== 0.8.7 + +Rake version 0.8.5 introduced greatly improved support for executing +commands on Windows. The "sh" command now has the same semantics on +Windows that it has on Unix based platforms. + +Rake version 0.8.6 includes minor fixes the the RDoc generation. +Rake version 0.8.7 includes a minor fix for JRuby running on windows. + +==== Changes + +===== New Features / Enhancements in Version 0.8.5 + +* Improved implementation of the Rake system command for Windows. + (patch from James M. Lawrence/quix) + +* Support for Ruby 1.9's improved system command. (patch from James + M. Lawrence/quix) + +* Rake now includes the configured extension when invoking an + executable (Config::CONFIG['EXEEXT]) + +===== Bug Fixes in Version 0.8.5 + +* Environment variable keys are now correctly cased (it matters in + some implementations). + +==== Thanks + +As usual, it was input from users that drove a alot of these changes. The +following people either contributed patches, made suggestions or made +otherwise helpful comments. Thanks to ... + +* Charles Nutter + +-- Jim Weirich + +=== 0.8.6 + +Rake version 0.8.5 introduced greatly improved support for executing +commands on Windows. The "sh" command now has the same semantics on +Windows that it has on Unix based platforms. + +Rake version 0.8.5 includes minor fixes the the RDoc generation. + +==== Thanks + +As usual, it was input from users that drove a alot of these changes. The +following people either contributed patches, made suggestions or made +otherwise helpful comments. Thanks to ... + +* James M. Lawrence/quix +* Luis Lavena + +-- Jim Weirich + +=== 0.8.5 + +Rake version 0.8.5 is a new release of Rake with greatly improved +support for executing commands on Windows. The "sh" command now has +the same semantics on Windows that it has on Unix based platforms. + +==== Changes + +===== New Features / Enhancements in Version 0.8.5 + +* Improved implementation of the Rake system command for Windows. + (patch from James M. Lawrence/quix) + +* Support for Ruby 1.9's improved system command. (patch from James + M. Lawrence/quix) + +* Rake now includes the configured extension when invoking an + executable (Config::CONFIG['EXEEXT]) + +===== Bug Fixes in Version 0.8.5 + +* Environment variable keys are now correctly cased (it matters in + some implementations). + +==== Thanks + +As usual, it was input from users that drove a alot of these changes. The +following people either contributed patches, made suggestions or made +otherwise helpful comments. Thanks to ... + +* James M. Lawrence/quix +* Luis Lavena + +-- Jim Weirich + +=== 0.8.4 + +Rake version 0.8.4 is a bug-fix release of rake. + +NOTE: The version of Rake that comes with Ruby 1.9 has diverged + slightly from the core Rake code base. Rake 0.8.4 will work + with Ruby 1.9, but is not a strict upgrade for the Rake that + comes with Ruby 1.9. A (near) future release of Rake will unify + those two codebases. + +==== Letter Writing Campaign + +Thanks to Aaron Patterson (@tenderlove) and Eric Hodel (@drbrain) for +their encouraging support in organizing a letter writing campaign to +lobby for the "Warning Free" release of rake 0.8.4. A special callout +goes to Jonathan D. Lord, Sr (Dr. Wingnut) whose postcard was the +first to actually reach me. (see +http://tenderlovemaking.com/2009/02/26/we-need-a-new-version-of-rake/ +for details) + +==== Changes + +===== New Features / Enhancements in Version 0.8.4 + +* Case is preserved on rakefile names. (patch from James + M. Lawrence/quix) + +* Improved Rakefile case insensitivity testing (patch from Luis + Lavena). + +* Windows system dir search order is now: HOME, HOMEDRIVE + HOMEPATH, + APPDATA, USERPROFILE (patch from Luis Lavena) + +* MingGW is now recognized as a windows platform. (patch from Luis + Lavena) + +===== Bug Fixes in Version 0.8.4 + +* Removed reference to manage_gem to fix the warning produced by the + gem package task. + +* Fixed stray ARGV option problem that was interfering with + Test::Unit::Runner. (patch from Pivotal Labs) + +===== Infrastructure Improvements in Version 0.8.4 + +* Numerous fixes to the windows test suite (patch from Luis Lavena). + +* Improved Rakefile case insensitivity testing (patch from Luis + Lavena). + +* Better support for windows paths in the test task (patch from Simon + Chiang/bahuvrihi) + +==== Thanks + +As usual, it was input from users that drove a alot of these changes. The +following people either contributed patches, made suggestions or made +otherwise helpful comments. Thanks to ... + +* James M. Lawrence/quix +* Luis Lavena +* Pivotal Labs +* Simon Chiang/bahuvrihi + +-- Jim Weirich + +=== 0.8.3 + +Rake version 0.8.3 is a bug-fix release of rake. + +==== Changes + +===== Bug Fixes in Version 0.8.3 + +* Enhanced the system directory detection in windows. We now check + HOMEDRIVE/HOMEPATH and USERPROFILE if APPDATA isn't found. (Patch + supplied by James Tucker). Rake no long aborts if it can't find the + directory. + +* Added fix to handle ruby installations in directories with spaces in + their name. + +==== Thanks + +As usual, it was input from users that drove a alot of these changes. The +following people either contributed patches, made suggestions or made +otherwise helpful comments. Thanks to ... + +* Edwin Pratomo +* Gavin Stark +* Adam Q. Salter +* Adam Majer +* Emanuel Indermühle +* Ittay Dror +* Bheeshmar Redheendran (for spending an afternoon with me debugging + windows issues) + +-- Jim Weirich + + +=== 0.8.2 + +Rake version 0.8.2 is a new release of rake that includes a number of +new features and numerous bug fixes. + +==== Changes + +===== New Features in Version 0.8.2 + +* Switched from getoptlong to optparse (patches supplied by Edwin + Pratomo). + +* The -T option will now attempt to dynamically sense the size of the + terminal. The -T output will only self-truncate if the output is a + tty. However, if RAKE_COLUMNS is explicitly set, it will be honored + in any case. (Patch provided by Gavin Stark). + +* The following public methods have been added to rake task objects: + + * task.clear -- Clear both the prerequisites and actions of the + target rake task. + * task.clear_prerequisites -- Clear all the existing prerequisites + from the target rake task. + * task.clear_actions -- Clear all the existing actions from the + target rake task. + * task.reenable -- Re-enable a task, allowing its actions to be + executed again if the task is invoked. + +* Changed RDoc test task to have no default template. This makes it + easier for the tempate to pick up the template from the environment. + +* Default values for task arguments can easily be specified with the + :with_defaults method. (Idea for default argument merging supplied + by (Adam Q. Salter) + +===== Bug Fixes in Version 0.8.2 + +* Fixed bug in package task so that it will include the subdir + directory in the package for testing. (Bug found by Adam Majer) + +* Fixed filename dependency order bug in test\_inspect\_pending and + test\_to\_s\_pending. (Bug found by Adam Majer) + +* Fixed check for file utils options to make them immune to the + symbol/string differences. (Patch supplied by Edwin Pratomo) + +* Fixed bug with rules involving multiple source, where only the first + dependency of a rule has any effect (Patch supplied by Emanuel + Indermühle) + +* FileList#clone and FileList#dup have better sematics w.r.t. taint + and freeze. + +* Changed from using Mutex to Monitor. Evidently Mutex causes thread + join errors when Ruby is compiled with -disable-pthreads. (Patch + supplied by Ittay Dror) + +* Fixed bug in makefile parser that had problems with extra spaces in + file task names. (Patch supplied by Ittay Dror) + +==== Other changes in Version 0.8.2 + +* Added ENV var to rake's own Rakefile to prevent OS X from including + extended attribute junk in the rake package tar file. (Bug found by + Adam Majer) + +* Added a performance patch for reading large makefile dependency + files. (Patch supplied by Ittay Dror) + +==== Task Argument Examples + +Prior to version 0.8.0, rake was only able to handle command line +arguments of the form NAME=VALUE that were passed into Rake via the +ENV hash. Many folks had asked for some kind of simple command line +arguments, perhaps using "--" to separate regular task names from +argument values on the command line. The problem is that there was no +easy way to associate positional arguments on the command line with +different tasks. Suppose both tasks :a and :b expect a command line +argument: does the first value go with :a? What if :b is run first? +Should it then get the first command line argument. + +Rake 0.8.0 solves this problem by explicitly passing values directly +to the tasks that need them. For example, if I had a release task +that required a version number, I could say: + + rake release[0.8.2] + +And the string "0.8.2" will be passed to the :release task. Multiple +arguments can be passed by separating them with a comma, for example: + + rake name[john,doe] + +Just a few words of caution. The rake task name and its arguments +need to be a single command line argument to rake. This generally +means no spaces. If spaces are needed, then the entire rake + +argument string should be quoted. Something like this: + + rake "name[billy bob, smith]" + +(Quoting rules vary between operating systems and shells, so make sure +you consult the proper docs for your OS/shell). + +===== Tasks that Expect Parameters + +Parameters are only given to tasks that are setup to expect them. In +order to handle named parameters, the task declaration syntax for +tasks has been extended slightly. + +For example, a task that needs a first name and last name might be +declared as: + + task :name, :first_name, :last_name + +The first argument is still the name of the task (:name in this case). +The next to argumements are the names of the parameters expected by +:name (:first_name and :last_name in the example). + +To access the values of the parameters, the block defining the task +behaviour can now accept a second parameter: + + task :name, :first_name, :last_name do |t, args| + puts "First name is #{args.first_name}" + puts "Last name is #{args.last_name}" + end + +The first argument of the block "t" is always bound to the current +task object. The second argument "args" is an open-struct like object +that allows access to the task arguments. Extra command line +arguments to a task are ignored. Missing command line arguments are +given the nil value. + +==== Thanks + +As usual, it was input from users that drove a alot of these changes. The +following people either contributed patches, made suggestions or made +otherwise helpful comments. Thanks to ... + +* Edwin Pratomo +* Gavin Stark +* Adam Q. Salter +* Adam Majer +* Emanuel Indermühle +* Ittay Dror +* Bheeshmar Redheendran (for spending an afternoon with me debugging + windows issues) + +-- Jim Weirich + +=== 0.8.0/0.8.1 + +Rake version 0.8.0 is a new release of rake that includes serveral new +features. + +==== Changes + +===== New Features in Version 0.8.0 + +* Tasks can now receive command line parameters. See the examples + below for more details. + +* Comments are limited to 80 columns on output, but full comments can + be seen by using the -D parameter. (feature suggested by Jamis + Buck). + +* Explicit exit(n) calls will now set the exit status to n. (patch + provided by Stephen Touset). + +* Rake is now compatible with Ruby 1.9. + +Version 0.8.1 is a minor update that includes additional Ruby 1.9 +compatibility fixes. + +==== Task Argument Examples + +Prior to version 0.8.0, rake was only able to handle command line +arguments of the form NAME=VALUE that were passed into Rake via the +ENV hash. Many folks had asked for some kind of simple command line +arguments, perhaps using "--" to separate regular task names from +argument values on the command line. The problem is that there was no +easy way to associate positional arguments on the command line with +different tasks. Suppose both tasks :a and :b expect a command line +argument: does the first value go with :a? What if :b is run first? +Should it then get the first command line argument. + +Rake 0.8.0 solves this problem by explicitly passing values directly +to the tasks that need them. For example, if I had a release task +that required a version number, I could say: + + rake release[0.8.0] + +And the string "0.8.0" will be passed to the :release task. Multiple +arguments can be passed by separating them with a comma, for example: + + rake name[john,doe] + +Just a few words of caution. The rake task name and its arguments +need to be a single command line argument to rake. This generally +means no spaces. If spaces are needed, then the entire rake + +argument string should be quoted. Something like this: + + rake "name[billy bob, smith]" + +(Quoting rules vary between operating systems and shells, so make sure +you consult the proper docs for your OS/shell). + +===== Tasks that Expect Parameters + +Parameters are only given to tasks that are setup to expect them. In +order to handle named parameters, the task declaration syntax for +tasks has been extended slightly. + +For example, a task that needs a first name and last name might be +declared as: + + task :name, :first_name, :last_name + +The first argument is still the name of the task (:name in this case). +The next to argumements are the names of the parameters expected by +:name (:first_name and :last_name in the example). + +To access the values of the parameters, the block defining the task +behaviour can now accept a second parameter: + + task :name, :first_name, :last_name do |t, args| + puts "First name is #{args.first_name}" + puts "Last name is #{args.last_name}" + end + +The first argument of the block "t" is always bound to the current +task object. The second argument "args" is an open-struct like object +that allows access to the task arguments. Extra command line +arguments to a task are ignored. Missing command line arguments are +given the nil value. + +==== Thanks + +As usual, it was input from users that drove a alot of these changes. The +following people either contributed patches, made suggestions or made +otherwise helpful comments. Thanks to ... + +* Jamis Buck (for comment formatting suggestions) +* Stephen Touset (for exit status patch). + +-- Jim Weirich + + +=== 0.7.3 + +Rake version 0.7.3 is a minor release that includes some refactoring to better +support custom Rake applications. + +==== Changes + +===== New Features in Version 0.7.3 + +* Added the +init+ and +top_level+ methods to make the creation of custom Rake applications a bit easier. E.g. + + gem 'rake', ">= 0.7.3" + require 'rake' + + Rake.application.init('myrake') + + task :default do + something_interesting + end + + Rake.application.top_level + +==== Thanks + +As usual, it was input from users that drove a alot of these changes. The +following people either contributed patches, made suggestions or made +otherwise helpful comments. Thanks to ... + +-- Jim Weirich + + +=== 0.7.2 + + +Version 0.7.2 supplies a bug fix and a few minor enhancements. In +particular, the new version fixes an incompatibility with the soon to +be released Ruby 1.8.6. We strongly recommend upgrading to Rake 0.7.2 +in order to be compatible with the new version of Ruby. + +==== Changes + +===== Bug Fixes in 0.7.2 + +There are quite a number of bug fixes in the new 0.7.2 version of +Rake: + +* Removed dependency on internal fu_xxx functions from FileUtils. + +* Error messages are now send to stderr rather than stdout (from + Payton Quackenbush). + +* Better error handling on invalid command line arguments (from Payton + Quackenbush). + +* Fixed some bugs where the application object was going to the global + appliation instead of using its own data. + +* Fixed the method name leak from FileUtils (bug found by Glenn + Vanderburg). + +* Added test for noop, bad_option and verbose flags to sh command. + +* Added a description to the gem task in GemPackageTask. + +* Fixed a bug when rules have multiple prerequisites (patch by Joel + VanderWerf) + +* Added the handful of RakeFileUtils to the private method as well. + +===== New Features in 0.7.2 + +The following new features are available in Rake version 0.7.2: + +* Added square and curly bracket patterns to FileList#include (Tilman + Sauerbeck). + +* FileLists can now pass a block to FileList#exclude to exclude files + based on calculated values. + +* Added plain filename support to rule dependents (suggested by Nobu + Nakada). + +* Added pathmap support to rule dependents. In other words, if a + pathmap format (beginning with a '%') is given as a Rake rule + dependent, then the name of the depend will be the name of the + target with the pathmap format applied. + +* Added a 'tasks' method to a namespace to get a list of tasks + associated with the namespace. + +* Added tar_command and zip_command options to the Package task. + +* The clean task will no longer delete 'core' if it is a directory. + +===== Internal Rake Improvements + +The following changes will are mainly internal improvements and +refactorings and have little effect on the end user. But they may be +of interest to the general public. + +* Added rcov task and updated unit testing for better code coverage. + +* Added a 'shame' task to the Rakefile. + +* Added rake_extension to handle detection of extension collisions. + +* Added a protected 'require "rubygems"' to test/test_application to + unbreak cruisecontrol.rb. + +* Removed rake\_dup. Now we just simply rescue a bad dup. + +* Refactored the FileList reject logic to remove duplication. + +* Removed if \_\_FILE\_\_ at the end of the rake.rb file. + +==== Thanks + +As usual, it was input from users that drove a alot of these changes. +The following people either contributed patches, made suggestions or +made otherwise helpful comments. Thanks to ... + +* Payton Quackenbush -- For several error handling improvements. + +* Glenn Vanderburg -- For finding and fixing the method name leak from + FileUtils. + +* Joel VanderWerf -- for finding and fixing a bug in the handling of + multiple prerequisites. + +* Tilman Sauerbeck -- For some enhancing FileList to support more + advanced file globbing. + +* Nobu Nakada -- For suggesting plain file name support to rule dependents. + +-- Jim Weirich + +=== 0.7.1 + +Version 0.7.1 supplies a bug fix and a few minor enhancements. + +==== Changes + +===== Bug Fixes in 0.7.1 + +* Changes in the exception reported for the FileUtils.ln caused + safe_ln to fail with a NotImplementedError. Rake 0.7.1 will now + catch that error or any StandardError and properly fall back to + using +cp+. + +===== New Features in 0.7.1 + +* You can filter the results of the --task option by supplying an + optional regular expression. This allows the user to easily find a + particular task name in a long list of possible names. + +* Transforming procs in a rule may now return a list of prerequisites. + This allows more flexible rule formation. + +* FileList and String now support a +pathmap+ melthod that makes the + transforming paths a bit easier. See the API docs for +pathmap+ for + details. + +* The -f option without a value will disable the search for a + Rakefile. This allows the Rakefile to be defined entirely in a + library (and loaded with the -r option). The current working + directory is not changed when this is done. + +==== Thanks + +As usual, it was input from users that drove a alot of these changes. +The following people either contributed patches, made suggestions or +made otherwise helpful comments. Thanks to ... + +* James Britt and Assaph Mehr for reporting and helping to debug the + safe_ln issue. + +-- Jim Weirich + + +=== 0.7.0 + +These changes for Rake have been brewing for a long time. Here they +are, I hope you enjoy them. + +==== Changes + +===== New Features + +* Name space support for task names (see below). +* Prerequisites can be executed in parallel (see below). +* Added safe_ln support for openAFS (via Ludvig Omholt). +* RDoc defaults to internal (in-process) invocation. The old behavior + is still available by setting the +external+ flag to true. +* Rakefiles are now loaded with the expanded path to prevent + accidental pollution from the Ruby load path. +* Task objects my now be used in prerequisite lists directly. +* Task objects (in addition to task names) may now be included in the + prerequisite list of a task. +* Internals cleanup and refactoring. + +===== Bug Fixes + +* Compatibility fixes for Ruby 1.8.4 FileUtils changes. + +===== Namespaces + +Tasks can now be nested inside their own namespaces. Tasks within one +namespace will not accidentally interfer with tasks named in a different +namespace. + +For example: + + namespace "main" do + task :build do + # Build the main program + end + end + + namespace "samples" do + task :build do + # Build the sample programs + end + end + + task :build_all => ["main:build", "samples:build"] + +Even though both tasks are named :build, they are separate tasks in +their own namespaces. The :build_all task (defined in the toplevel +namespace) references both build tasks in its prerequisites. + +You may invoke each of the individual build tasks with the following +commands: + + rake main:build + rake samples:build + +Or invoke both via the :build_all command: + + rake build_all + +Namespaces may be nested arbitrarily. Since the name of file tasks +correspond to the name of a file in the external file system, +FileTasks are not affected by the namespaces. + +See the Rakefile format documentation (in the Rake API documents) for +more information. + +===== Parallel Tasks + +Sometimes you have several tasks that can be executed in parallel. By +specifying these tasks as prerequisites to a +multitask+ task. + +In the following example the tasks copy\_src, copy\_doc and copy\_bin +will all execute in parallel in their own thread. + + multitask :copy_files => [:copy_src, :copy_doc, :copy_bin] do + puts "All Copies Complete" + end + +==== Thanks + +As usual, it was input from users that drove a alot of these changes. +The following people either contributed patches, made suggestions or +made otherwise helpful comments. Thanks to ... + +* Doug Young (inspiration for the parallel task) +* David Heinemeier Hansson (for --trace message enhancement and for + pushing for namespace support). +* Ludvig Omholt (for the openAFS fix) + +-- Jim Weirich + +=== 0.6.1 + +* Rebuilt 0.6.0 gem without signing. + +=== 0.6.0 + +Its time for some long requested enhancements and lots of bug fixes +... And a whole new web page. + +==== New Web Page + +The primary documentation for rake has moved from the RubyForge based +wiki to its own Hieraki based web site. Constant spam on the wiki +made it a difficult to keep clean. The new site will be easier to +update and organize. + +Check out the new documentation at: http://docs.rubyrake.org + +We will be adding new documentation to the site as time goes on. + +In addition to the new docs page, make sure you check out Martin +Fowlers article on rake at http://martinfowler.com/articles/rake.html + +==== Changes + +===== New Features + +* Multiple prerequisites on Rake rules now allowed. However, keep the + following in mind: + + 1. All the prerequisites of a rule must be available before a rule + is triggered, where "enabled" means (a) an existing file, (b) a + defined rule, or (c) another rule which also must be + trigger-able. + 2. Rules are checked in order of definition, so it is important to + order your rules properly. If a file can be created by two + different rules, put the more specific rule first (otherwise the + more general rule will trigger first and the specific one will + never be triggered). + 3. The source method now returns the name of the first + prerequisite listed in the rule. sources returns the + names of all the rule prerequisites, ordered as they are defined + in the rule. If the task has other prerequisites not defined in + the rule (but defined in an explicit task definition), then they + will _not_ be included in the sources list. + +* FileLists may now use the egrep command. This popular enhancement + is now a core part of the FileList object. If you want to get a + list of all your to-dos, fixmes and TBD comments, add the following + to your Rakefile. + + desc "Look for TODO and FIXME tags in the code" + task :todo do + FileList['**/*.rb'].egrep /#.*(FIXME|TODO|TBD)/ + end + +* The investigation method was added to task object to dump + out some important values. This makes it a bit easier to debug Rake + tasks. + + For example, if you are having problems with a particular task, just + print it out: + + task :huh do + puts Rake::Task['huh'].investigation + end + +* The Rake::TestTask class now supports a "ruby\_opts" option to pass + arbitrary ruby options to a test subprocess. + +===== Some Incompatibilities + +* When using the ruby command to start a Ruby subprocess, the + Ruby interpreter that is currently running rake is used by default. + This makes it easier to use rake in an environment with multiple + ruby installation. (Previously, the first ruby command found in the + PATH was used). + + If you wish to chose a different Ruby interpreter, you can + explicitly choose the interpreter via the sh command. + +* The major rake classes (Task, FileTask, FileCreationTask, RakeApp) + have been moved out of the toplevel scope and are now accessible as + Rake::Task, Rake::FileTask, Rake::FileCreationTask and + Rake::Application. If your Rakefile + directly references any one of these tasks, you may: + + 1. Update your Rakefile to use the new classnames + 2. Use the --classic-namespace option on the rake command to get the + old behavior, + 3. Add require 'rake/classic_namespace' to the + Rakefile to get the old behavior. + + rake will print a rather annoying warning whenever a + deprecated class name is referenced without enabling classic + namespace. + +===== Bug Fixes + +* Several unit tests and functional tests were fixed to run better + under windows. + +* Directory tasks are now a specialized version of a File task. A + directory task will only be triggered if it doesn't exist. It will + not be triggered if it is out of date w.r.t. any of its + prerequisites. + +* Fixed a bug in the Rake::GemPackageTask class so that the gem now + properly contains the platform name. + +* Fixed a bug where a prerequisite on a file task would cause + an exception if the prerequisite did not exist. + +==== Thanks + +As usual, it was input from users that drove a alot of these changes. +The following people either contributed patches, made suggestions or +made otherwise helpful comments. Thanks to ... + +* Greg Fast (better ruby_opt test options) +* Kelly Felkins (requested by better namespace support) +* Martin Fowler (suggested Task.investigation) +* Stuart Jansen (send initial patch for multiple prerequisites). +* Masao Mutch (better support for non-ruby Gem platforms) +* Philipp Neubeck (patch for file task exception fix) + +-- Jim Weirich + +=== 0.5.4 + +Time for some minor bug fixes and small enhancements + +==== Changes + +Here are the changes for version 0.5.4 ... + +* Added double quotes to the test runner. This allows the location of + the tests (and runner) to be in a directory path that contains + spaces (e.g. "C:/Program Files/ruby/bin"). +* Added .svn to default ignore list. Now subversion project metadata + is automatically ignored by Rake's FileList. +* Updated FileList#include to support nested arrays and filelists. + FileLists are flat lists of file names. Using a FileList in an + include will flatten out the nested file names. + +== Thanks + +As usual, it was input from users that drove a alot of these changes. +Thanks to ... + +* Tilman Sauerbeck for the nested FileList suggestion. +* Josh Knowles for pointing out the spaces in directory name problem. + +-- Jim Weirich + +=== 0.5.3 + +Although it has only been two weeks since the last release, we have +enough updates to the Rake program to make it time for another +release. + +==== Changes + +Here are the changes for version 0.5.3 ... + +* FileLists have been extensively changed so that they mimic the + behavior of real arrays even more closely. In particular, + operations on FileLists that return a new collection (e.g. collect, + reject) will now return a FileList rather than an array. In + addition, several places where FileLists were not properly expanded + before use have been fixed. +* A method (+ext+) to simplify the handling of file extensions was + added to String and to Array. +* The 'testrb' script in test/unit tends to silently swallow syntax + errors in test suites. Because of that, the default test loader is + now a rake-provided script. You can still use 'testrb' by setting + the loader flag in the test task to :testrb. (See the API documents + for TestTask for all the loader flag values). +* FileUtil methods (e.g. cp, mv, install) are now declared to be + private. This will cut down on the interference with user defined + methods of the same name. +* Fixed the verbose flag in the TestTask so that the test code is + controlled by the flag. Also shortened up some failure messages. + (Thanks to Tobias Luetke for the suggestion). +* Rules will now properly detect a task that can generate a source + file. Previously rules would only consider source files that were + already present. +* Added an +import+ command that allows Rake to dynamically import + dependendencies into a running Rake session. The +import+ command + can run tasks to update the dependency file before loading them. + Dependency files can be in rake or make format, allowing rake to + work with tools designed to generate dependencies for make. + +==== Thanks + +As usual, it was input from users that drove a alot of these changes. +Thanks to ... + +* Brian Gernhardt for the rules fix (especially for the patience to + explain the problem to me until I got what he was talking about). +* Stefan Lang for pointing out problems in the dark corners of the + FileList implementation. +* Alexey Verkhovsky pointing out the silently swallows syntax errors + in tests. +* Tobias Luetke for beautifying the test task output. +* Sam Roberts for some of the ideas behind dependency loading. + +-- Jim Weirich + + +=== 0.5.0 + +It has been a long time in coming, but we finally have a new version +of Rake available. + +==== Changes + +* Fixed documentation that was lacking the Rake module name (Tilman + Sauerbeck). +* Added tar.gz and tar.bz2 support to package task (Tilman Sauerbeck). +* Recursive rules are now supported (Tilman Sauerbeck). +* Added warning option for the Test Task (requested by Eric Hodel). +* The jamis rdoc template is only used if it exists. +* Added fix for Ruby 1.8.2 test/unit and rails problem. +* Added contributed rake man file (Jani Monoses). +* Added Brian Candler's fix for problems in --trace and --dry-run + mode. + +==== Thanks + +Lots of people provided input to this release. Thanks to Tilman +Sauerbeck for numerous patches, documentation fixes and suggestions. +And for also pushing me to get this release out. Also, thanks to +Brian Candler for the finding and fixing --trace/dry-run fix. That +was an obscure bug. Also to Eric Hodel for some good suggestions. + +-- Jim Weirich + +=== 0.4.15 + +==== Changes + +Version 0.4.15 is a bug fix update for the Ruby 1.8.2 compatibility +changes. This release includes: + +* Fixed a bug that prevented the TESTOPTS flag from working with the + revised for 1.8.2 test task. +* Updated the docs on --trace to indicate that it also enables a full + backtrace on errors. +* Several fixes for new warnings generated. + +==== Mini-Roadmap + +I will continue to issue Rake updates in the 0.4.xx series as new +Ruby-1.8.2 issues become manifest. Once the codebase stabilizes, I +will release a 0.5.0 version incorporating all the changes. If you +are not using Ruby-1.8.2 and wish to avoid version churn, I recommend +staying with a release prior to Rake-0.4.14. + +=== 0.4.14 + +Version 0.4.14 is a compatibility fix to allow Rake's test task to +work under Ruby 1.8.2. A change in the Test::Unit autorun feature +prevented Rake from running any tests. This release fixes the +problem. + +Rake 0.4.14 is the recommended release for anyone using Ruby 1.8.2. + +=== 0.4.13 + +* Fixed the dry-run flag so it is operating again. +* Multiple arguments to sh and ruby commands will not be interpreted + by the shell (patch provided by Jonathan Paisley). + +=== 0.4.12 + +* Added --silent (-s) to suppress the (in directory) rake message. + +=== 0.4.11 + +* Changed the "don't know how to rake" message (finally) +* Changes references to a literal "Rakefile" to reference the global + variable $rakefile (which contains the actual name of the rakefile). + +=== 0.4.10 + +* Added block support to the "sh" command, allowing users to take + special actions on the result of the system call. E.g. + + sh "shell_command" do |ok, res| + puts "Program returned #{res.exitstatus}" if ! ok + end + +=== 0.4.9 + +* Switched to Jamis Buck's RDoc template. +* Removed autorequire from Rake's gem spec. This prevents the Rake + libraries from loading while using rails. + +=== 0.4.8 + +* Added support for .rb versions of Rakefile. +* Removed \\\n's from test task. +* Fixed Ruby 1.9 compatibility issue with FileList. + +=== 0.4.7 + +* Fixed problem in FileList that caused Ruby 1.9 to go into infinite + recursion. Since to_a was removed from Object, it does not need to + added back into the list of methods to rewrite in FileList. (Thanks + to Kent Sibilev for pointing this out). + +=== 0.4.6 +* Removed test version of ln in FileUtils that prevented safe_ln from + using ln. + +=== 0.4.5 +* Upgraded comments in TestTask. +* FileList to_s and inspect now automatically resolve pending changes. +* FileList#exclude properly returns the FileList. + +=== 0.4.4 +* Fixed initialization problem with @comment. +* Now using multi -r technique in TestTask. Switch Rakefile back to + using the built-in test task macros because the rake runtime is no + longer needed. +* Added 'TEST=filename' and 'TESTOPTS=options' to the Test Task + macros. +* Allow a +test_files+ attribute in test tasks. This allows more + flexibility in specifying test files. + +=== 0.4.3 +* Fixed Comment leakage. + +=== 0.4.2 +* Added safe_ln that falls back to a copy if a file link is not supported. +* Package builder now uses safe\_ln. + +=== 0.4.1 +* Task comments are now additive, combined with "/". +* Works with (soon to be released) rubygems 0.6.2 (or 0.7.0) + +=== 0.4.0 +* FileList now uses deferred loading. The file system is not searched + until the first call that needs the file names. +* VAR=VALUE options are now accepted on the command line and are + treated like environment variables. The values may be tested in a + Rakefile by referencing ENV['VAR']. +* File.mtime is now used (instead of File.new().mtime). + +=== 0.3.2.x + +* Removed some hidden dependencies on rubygems. Tests now will test + gems only if they are installed. +* Removed Sys from some example files. I believe that is that last + reference to Sys outside of the contrib area. +* Updated all copyright notices to include 2004. + +=== 0.3.2 + +* GEM Installation now works with the application stub. + +=== 0.3.1 + +* FileLists now automatically ignore CVS, .bak, ! +* GEM Installation now works. + +=== 0.3.0 + +Promoted 0.2.10. + +=== 0.2.10 +General + +* Added title to Rake's rdocs +* Contrib packages are no longer included in the documentation. + +RDoc Issues + +* Removed default for the '--main' option +* Fixed rendering of the rdoc options +* Fixed clean/clobber confusion with rerdoc +* 'title' attribute added + +Package Task Library Issues + +* Version (or explicit :noversion) is required. +* +package_file+ attribute is now writable + +FileList Issues + +* Dropped bang version of exclude. Now using ant-like include/exclude semantics. +* Enabled the "yield self" idiom in FileList#initialize. + +=== 0.2.9 + +This version contains numerous changes as the RubyConf.new(2003) +presentation was being prepared. The changes include: + +* The monolithic rubyapp task library is in the process of being + dropped in favor of lighter weight task libraries. + +=== 0.2.7 + +* Added "desc" for task descriptions. +* -T will now display tasks with descriptions. +* -P will display tasks and prerequisites. +* Dropped the Sys module in favor of the 1.8.x FileUtils module. Sys + is still supported in the contrib area. + +=== 0.2.6 + +* Moved to RubyForge + +=== 0.2.5 + +* Switched to standard ruby app builder. +* Added no_match option to file matcher. + +=== 0.2.4 + +* Fixed indir, which neglected to actually change directories. + +=== 0.2.3 + +* Added rake module for a help target +* Added 'for\_files' to Sys +* Added a $rakefile constant +* Added test for selecting proper rule with multiple targets. diff --git a/vendor/bundle/ruby/3.1.0/gems/rake-13.0.6/MIT-LICENSE b/vendor/bundle/ruby/3.1.0/gems/rake-13.0.6/MIT-LICENSE new file mode 100644 index 000000000..4292f3b3c --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/rake-13.0.6/MIT-LICENSE @@ -0,0 +1,21 @@ +Copyright (c) Jim Weirich + +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/vendor/bundle/ruby/3.1.0/gems/rake-13.0.6/README.rdoc b/vendor/bundle/ruby/3.1.0/gems/rake-13.0.6/README.rdoc new file mode 100644 index 000000000..0bcaef000 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/rake-13.0.6/README.rdoc @@ -0,0 +1,155 @@ += RAKE -- Ruby Make + +home :: https://github.com/ruby/rake +bugs :: https://github.com/ruby/rake/issues +docs :: https://ruby.github.io/rake + +== Description + +Rake is a Make-like program implemented in Ruby. Tasks and dependencies are +specified in standard Ruby syntax. + +Rake has the following features: + +* Rakefiles (rake's version of Makefiles) are completely defined in + standard Ruby syntax. No XML files to edit. No quirky Makefile + syntax to worry about (is that a tab or a space?) + +* Users can specify tasks with prerequisites. + +* Rake supports rule patterns to synthesize implicit tasks. + +* Flexible FileLists that act like arrays but know about manipulating + file names and paths. + +* A library of prepackaged tasks to make building rakefiles easier. For example, + tasks for building tarballs. (Formerly + tasks for building RDoc, Gems, and publishing to FTP were included in rake but they're now + available in RDoc, RubyGems, and rake-contrib respectively.) + +* Supports parallel execution of tasks. + +== Installation + +=== Gem Installation + +Download and install rake with the following. + + gem install rake + +== Usage + +=== Simple Example + +First, you must write a "Rakefile" file which contains the build rules. Here's +a simple example: + + task default: %w[test] + + task :test do + ruby "test/unittest.rb" + end + +This Rakefile has two tasks: + +* A task named "test", which -- upon invocation -- will run a unit test file + in Ruby. +* A task named "default". This task does nothing by itself, but it has exactly + one dependency, namely the "test" task. Invoking the "default" task will + cause Rake to invoke the "test" task as well. + +Running the "rake" command without any options will cause it to run the +"default" task in the Rakefile: + + % ls + Rakefile test/ + % rake + (in /home/some_user/Projects/rake) + ruby test/unittest.rb + ....unit test output here... + +Type "rake --help" for all available options. + +== Resources + +=== Rake Information + +* {Rake command-line}[link:doc/command_line_usage.rdoc] +* {Writing Rakefiles}[link:doc/rakefile.rdoc] +* The original {Rake announcement}[link:doc/rational.rdoc] +* Rake {glossary}[link:doc/glossary.rdoc] + +=== Presentations and Articles about Rake + +* Avdi Grimm's rake series: + 1. {Rake Basics}[https://avdi.codes/rake-part-1-basics/] + 2. {Rake File Lists}[https://avdi.codes/rake-part-2-file-lists-2/] + 3. {Rake Rules}[https://avdi.codes/rake-part-3-rules/] + 4. {Rake Pathmap}[https://avdi.codes/rake-part-4-pathmap/] + 5. {File Operations}[https://avdi.codes/rake-part-5-file-operations/] + 6. {Clean and Clobber}[https://avdi.codes/rake-part-6-clean-and-clobber/] + 7. {MultiTask}[https://avdi.codes/rake-part-7-multitask/] +* {Jim Weirich's 2003 RubyConf presentation}[https://web.archive.org/web/20140221123354/http://onestepback.org/articles/buildingwithrake/] +* Martin Fowler's article on Rake: https://martinfowler.com/articles/rake.html + +== Other Make Re-envisionings ... + +Rake is a late entry in the make replacement field. Here are links to +other projects with similar (and not so similar) goals. + +* https://directory.fsf.org/wiki/Bras -- Bras, one of earliest + implementations of "make in a scripting language". +* http://www.a-a-p.org -- Make in Python +* https://ant.apache.org -- The Ant project +* https://search.cpan.org/search?query=PerlBuildSystem -- The Perl Build System +* https://www.rubydoc.info/gems/rant/0.5.7/frames -- Rant, another Ruby make tool. + +== Credits + +[Jim Weirich] Who originally created Rake. + +[Ryan Dlugosz] For the initial conversation that sparked Rake. + +[Nobuyoshi Nakada ] For the initial patch for rule support. + +[Tilman Sauerbeck ] For the recursive rule patch. + +[Eric Hodel] For aid in maintaining rake. + +[Hiroshi SHIBATA] Maintainer of Rake 10.X and Rake 11.X + +== License + +Rake is available under an MIT-style license. + +:include: MIT-LICENSE + +--- + += Other stuff + +Author:: Jim Weirich +Requires:: Ruby 2.0.0 or later +License:: Copyright Jim Weirich. + Released under an MIT-style license. See the MIT-LICENSE + file included in the distribution. + +== Warranty + +This software is provided "as is" and without any express or implied +warranties, including, without limitation, the implied warranties of +merchantability and fitness for a particular purpose. + +== Historical + +Rake was originally created by Jim Weirich, who unfortunately passed away in +February 2014. This repository was originally hosted at +{github.com/jimweirich/rake}[https://github.com/jimweirich/rake/], however +with his passing, has been moved to {ruby/rake}[https://github.com/ruby/rake]. + +You can view Jim's last commit here: +https://github.com/jimweirich/rake/tree/336559f28f55bce418e2ebcc0a57548dcbac4025 + +You can {read more about Jim}[https://en.wikipedia.org/wiki/Jim_Weirich] at Wikipedia. + +Thank you for this great tool, Jim. We'll remember you. diff --git a/vendor/bundle/ruby/3.1.0/gems/rake-13.0.6/exe/rake b/vendor/bundle/ruby/3.1.0/gems/rake-13.0.6/exe/rake new file mode 100755 index 000000000..a00975f30 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/rake-13.0.6/exe/rake @@ -0,0 +1,27 @@ +#!/usr/bin/env ruby + +#-- +# Copyright (c) 2003, 2004, 2005, 2006, 2007 Jim Weirich +# +# 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. +#++ + +require "rake" + +Rake.application.run diff --git a/vendor/bundle/ruby/3.1.0/gems/rake-13.0.6/lib/rake.rb b/vendor/bundle/ruby/3.1.0/gems/rake-13.0.6/lib/rake.rb new file mode 100644 index 000000000..0dfd05315 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/rake-13.0.6/lib/rake.rb @@ -0,0 +1,71 @@ +# frozen_string_literal: true +#-- +# Copyright 2003-2010 by Jim Weirich (jim.weirich@gmail.com) +# +# 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. +#++ + +module Rake; end + +require "rake/version" + +require "rbconfig" +require "fileutils" +require "singleton" +require "monitor" +require "optparse" +require "ostruct" + +require "rake/ext/string" + +require "rake/win32" + +require "rake/linked_list" +require "rake/cpu_counter" +require "rake/scope" +require "rake/task_argument_error" +require "rake/rule_recursion_overflow_error" +require "rake/rake_module" +require "rake/trace_output" +require "rake/pseudo_status" +require "rake/task_arguments" +require "rake/invocation_chain" +require "rake/task" +require "rake/file_task" +require "rake/file_creation_task" +require "rake/multi_task" +require "rake/dsl_definition" +require "rake/file_utils_ext" +require "rake/file_list" +require "rake/default_loader" +require "rake/early_time" +require "rake/late_time" +require "rake/name_space" +require "rake/task_manager" +require "rake/application" +require "rake/backtrace" + +$trace = false + +# :stopdoc: +# +# Some top level Constants. + +FileList = Rake::FileList +RakeFileUtils = Rake::FileUtilsExt diff --git a/vendor/bundle/ruby/3.1.0/gems/rake-13.0.6/lib/rake/application.rb b/vendor/bundle/ruby/3.1.0/gems/rake-13.0.6/lib/rake/application.rb new file mode 100644 index 000000000..02586ad5e --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/rake-13.0.6/lib/rake/application.rb @@ -0,0 +1,831 @@ +# frozen_string_literal: true +require "optparse" + +require "rake/task_manager" +require "rake/file_list" +require "rake/thread_pool" +require "rake/thread_history_display" +require "rake/trace_output" +require "rake/win32" + +module Rake + + CommandLineOptionError = Class.new(StandardError) + + ## + # Rake main application object. When invoking +rake+ from the + # command line, a Rake::Application object is created and run. + + class Application + include TaskManager + include TraceOutput + + # The name of the application (typically 'rake') + attr_reader :name + + # The original directory where rake was invoked. + attr_reader :original_dir + + # Name of the actual rakefile used. + attr_reader :rakefile + + # Number of columns on the terminal + attr_accessor :terminal_columns + + # List of the top level task names (task names from the command line). + attr_reader :top_level_tasks + + # Override the detected TTY output state (mostly for testing) + attr_writer :tty_output + + DEFAULT_RAKEFILES = [ + "rakefile", + "Rakefile", + "rakefile.rb", + "Rakefile.rb" + ].freeze + + # Initialize a Rake::Application object. + def initialize + super + @name = "rake" + @rakefiles = DEFAULT_RAKEFILES.dup + @rakefile = nil + @pending_imports = [] + @imported = [] + @loaders = {} + @default_loader = Rake::DefaultLoader.new + @original_dir = Dir.pwd + @top_level_tasks = [] + add_loader("rb", DefaultLoader.new) + add_loader("rf", DefaultLoader.new) + add_loader("rake", DefaultLoader.new) + @tty_output = STDOUT.tty? + @terminal_columns = ENV["RAKE_COLUMNS"].to_i + + set_default_options + end + + # Run the Rake application. The run method performs the following + # three steps: + # + # * Initialize the command line options (+init+). + # * Define the tasks (+load_rakefile+). + # * Run the top level tasks (+top_level+). + # + # If you wish to build a custom rake command, you should call + # +init+ on your application. Then define any tasks. Finally, + # call +top_level+ to run your top level tasks. + def run(argv = ARGV) + standard_exception_handling do + init "rake", argv + load_rakefile + top_level + end + end + + # Initialize the command line parameters and app name. + def init(app_name="rake", argv = ARGV) + standard_exception_handling do + @name = app_name + begin + args = handle_options argv + rescue ArgumentError + # Backward compatibility for capistrano + args = handle_options + end + collect_command_line_tasks(args) + end + end + + # Find the rakefile and then load it and any pending imports. + def load_rakefile + standard_exception_handling do + raw_load_rakefile + end + end + + # Run the top level tasks of a Rake application. + def top_level + run_with_threads do + if options.show_tasks + display_tasks_and_comments + elsif options.show_prereqs + display_prerequisites + else + top_level_tasks.each { |task_name| invoke_task(task_name) } + end + end + end + + # Run the given block with the thread startup and shutdown. + def run_with_threads + thread_pool.gather_history if options.job_stats == :history + + yield + + thread_pool.join + if options.job_stats + stats = thread_pool.statistics + puts "Maximum active threads: #{stats[:max_active_threads]} + main" + puts "Total threads in play: #{stats[:total_threads_in_play]} + main" + end + ThreadHistoryDisplay.new(thread_pool.history).show if + options.job_stats == :history + end + + # Add a loader to handle imported files ending in the extension + # +ext+. + def add_loader(ext, loader) + ext = ".#{ext}" unless ext =~ /^\./ + @loaders[ext] = loader + end + + # Application options from the command line + def options + @options ||= OpenStruct.new + end + + # Return the thread pool used for multithreaded processing. + def thread_pool # :nodoc: + @thread_pool ||= ThreadPool.new(options.thread_pool_size || Rake.suggested_thread_count-1) + end + + # internal ---------------------------------------------------------------- + + # Invokes a task with arguments that are extracted from +task_string+ + def invoke_task(task_string) # :nodoc: + name, args = parse_task_string(task_string) + t = self[name] + t.invoke(*args) + end + + def parse_task_string(string) # :nodoc: + /^([^\[]+)(?:\[(.*)\])$/ =~ string.to_s + + name = $1 + remaining_args = $2 + + return string, [] unless name + return name, [] if remaining_args.empty? + + args = [] + + begin + /\s*((?:[^\\,]|\\.)*?)\s*(?:,\s*(.*))?$/ =~ remaining_args + + remaining_args = $2 + args << $1.gsub(/\\(.)/, '\1') + end while remaining_args + + return name, args + end + + # Provide standard exception handling for the given block. + def standard_exception_handling # :nodoc: + yield + rescue SystemExit + # Exit silently with current status + raise + rescue OptionParser::InvalidOption => ex + $stderr.puts ex.message + exit(false) + rescue Exception => ex + # Exit with error message + display_error_message(ex) + exit_because_of_exception(ex) + end + + # Exit the program because of an unhandled exception. + # (may be overridden by subclasses) + def exit_because_of_exception(ex) # :nodoc: + exit(false) + end + + # Display the error message that caused the exception. + def display_error_message(ex) # :nodoc: + trace "#{name} aborted!" + display_exception_details(ex) + trace "Tasks: #{ex.chain}" if has_chain?(ex) + trace "(See full trace by running task with --trace)" unless + options.backtrace + end + + def display_exception_details(ex) # :nodoc: + display_exception_details_seen << ex + + display_exception_message_details(ex) + display_exception_backtrace(ex) + display_cause_details(ex.cause) if has_cause?(ex) + end + + def display_cause_details(ex) # :nodoc: + return if display_exception_details_seen.include? ex + + trace "\nCaused by:" + display_exception_details(ex) + end + + def display_exception_details_seen # :nodoc: + Thread.current[:rake_display_exception_details_seen] ||= [] + end + + def has_cause?(ex) # :nodoc: + ex.respond_to?(:cause) && ex.cause + end + + def display_exception_message_details(ex) # :nodoc: + if ex.instance_of?(RuntimeError) + trace ex.message + else + trace "#{ex.class.name}: #{ex.message}" + end + end + + def display_exception_backtrace(ex) # :nodoc: + if options.backtrace + trace ex.backtrace.join("\n") + else + trace Backtrace.collapse(ex.backtrace).join("\n") + end + end + + # Warn about deprecated usage. + # + # Example: + # Rake.application.deprecate("import", "Rake.import", caller.first) + # + def deprecate(old_usage, new_usage, call_site) # :nodoc: + unless options.ignore_deprecate + $stderr.puts "WARNING: '#{old_usage}' is deprecated. " + + "Please use '#{new_usage}' instead.\n" + + " at #{call_site}" + end + end + + # Does the exception have a task invocation chain? + def has_chain?(exception) # :nodoc: + exception.respond_to?(:chain) && exception.chain + end + private :has_chain? + + # True if one of the files in RAKEFILES is in the current directory. + # If a match is found, it is copied into @rakefile. + def have_rakefile # :nodoc: + @rakefiles.each do |fn| + if File.exist?(fn) + others = FileList.glob(fn, File::FNM_CASEFOLD) + return others.size == 1 ? others.first : fn + elsif fn == "" + return fn + end + end + return nil + end + + # True if we are outputting to TTY, false otherwise + def tty_output? # :nodoc: + @tty_output + end + + # We will truncate output if we are outputting to a TTY or if we've been + # given an explicit column width to honor + def truncate_output? # :nodoc: + tty_output? || @terminal_columns.nonzero? + end + + # Display the tasks and comments. + def display_tasks_and_comments # :nodoc: + displayable_tasks = tasks.select { |t| + (options.show_all_tasks || t.comment) && + t.name =~ options.show_task_pattern + } + case options.show_tasks + when :tasks + width = displayable_tasks.map { |t| t.name_with_args.length }.max || 10 + if truncate_output? + max_column = terminal_width - name.size - width - 7 + else + max_column = nil + end + + displayable_tasks.each do |t| + printf("#{name} %-#{width}s # %s\n", + t.name_with_args, + max_column ? truncate(t.comment, max_column) : t.comment) + end + when :describe + displayable_tasks.each do |t| + puts "#{name} #{t.name_with_args}" + comment = t.full_comment || "" + comment.split("\n").each do |line| + puts " #{line}" + end + puts + end + when :lines + displayable_tasks.each do |t| + t.locations.each do |loc| + printf "#{name} %-30s %s\n", t.name_with_args, loc + end + end + else + fail "Unknown show task mode: '#{options.show_tasks}'" + end + end + + def terminal_width # :nodoc: + if @terminal_columns.nonzero? + result = @terminal_columns + else + result = unix? ? dynamic_width : 80 + end + (result < 10) ? 80 : result + rescue + 80 + end + + # Calculate the dynamic width of the + def dynamic_width # :nodoc: + @dynamic_width ||= (dynamic_width_stty.nonzero? || dynamic_width_tput) + end + + def dynamic_width_stty # :nodoc: + %x{stty size 2>/dev/null}.split[1].to_i + end + + def dynamic_width_tput # :nodoc: + %x{tput cols 2>/dev/null}.to_i + end + + def unix? # :nodoc: + RbConfig::CONFIG["host_os"] =~ + /(aix|darwin|linux|(net|free|open)bsd|cygwin|solaris|irix|hpux)/i + end + + def windows? # :nodoc: + Win32.windows? + end + + def truncate(string, width) # :nodoc: + if string.nil? + "" + elsif string.length <= width + string + else + (string[0, width - 3] || "") + "..." + end + end + + # Display the tasks and prerequisites + def display_prerequisites # :nodoc: + tasks.each do |t| + puts "#{name} #{t.name}" + t.prerequisites.each { |pre| puts " #{pre}" } + end + end + + def trace(*strings) # :nodoc: + options.trace_output ||= $stderr + trace_on(options.trace_output, *strings) + end + + def sort_options(options) # :nodoc: + options.sort_by { |opt| + opt.select { |o| o.is_a?(String) && o =~ /^-/ }.map(&:downcase).sort.reverse + } + end + private :sort_options + + # A list of all the standard options used in rake, suitable for + # passing to OptionParser. + def standard_rake_options # :nodoc: + sort_options( + [ + ["--all", "-A", + "Show all tasks, even uncommented ones (in combination with -T or -D)", + lambda { |value| + options.show_all_tasks = value + } + ], + ["--backtrace=[OUT]", + "Enable full backtrace. OUT can be stderr (default) or stdout.", + lambda { |value| + options.backtrace = true + select_trace_output(options, "backtrace", value) + } + ], + ["--build-all", "-B", + "Build all prerequisites, including those which are up-to-date.", + lambda { |value| + options.build_all = true + } + ], + ["--comments", + "Show commented tasks only", + lambda { |value| + options.show_all_tasks = !value + } + ], + ["--describe", "-D [PATTERN]", + "Describe the tasks (matching optional PATTERN), then exit.", + lambda { |value| + select_tasks_to_show(options, :describe, value) + } + ], + ["--directory", "-C [DIRECTORY]", + "Change to DIRECTORY before doing anything.", + lambda { |value| + Dir.chdir value + @original_dir = Dir.pwd + } + ], + ["--dry-run", "-n", + "Do a dry run without executing actions.", + lambda { |value| + Rake.verbose(true) + Rake.nowrite(true) + options.dryrun = true + options.trace = true + } + ], + ["--execute", "-e CODE", + "Execute some Ruby code and exit.", + lambda { |value| + eval(value) + exit + } + ], + ["--execute-print", "-p CODE", + "Execute some Ruby code, print the result, then exit.", + lambda { |value| + puts eval(value) + exit + } + ], + ["--execute-continue", "-E CODE", + "Execute some Ruby code, " + + "then continue with normal task processing.", + lambda { |value| eval(value) } + ], + ["--jobs", "-j [NUMBER]", + "Specifies the maximum number of tasks to execute in parallel. " + + "(default is number of CPU cores + 4)", + lambda { |value| + if value.nil? || value == "" + value = Float::INFINITY + elsif value =~ /^\d+$/ + value = value.to_i + else + value = Rake.suggested_thread_count + end + value = 1 if value < 1 + options.thread_pool_size = value - 1 + } + ], + ["--job-stats [LEVEL]", + "Display job statistics. " + + "LEVEL=history displays a complete job list", + lambda { |value| + if value =~ /^history/i + options.job_stats = :history + else + options.job_stats = true + end + } + ], + ["--libdir", "-I LIBDIR", + "Include LIBDIR in the search path for required modules.", + lambda { |value| $:.push(value) } + ], + ["--multitask", "-m", + "Treat all tasks as multitasks.", + lambda { |value| options.always_multitask = true } + ], + ["--no-search", "--nosearch", + "-N", "Do not search parent directories for the Rakefile.", + lambda { |value| options.nosearch = true } + ], + ["--prereqs", "-P", + "Display the tasks and dependencies, then exit.", + lambda { |value| options.show_prereqs = true } + ], + ["--quiet", "-q", + "Do not log messages to standard output.", + lambda { |value| Rake.verbose(false) } + ], + ["--rakefile", "-f [FILENAME]", + "Use FILENAME as the rakefile to search for.", + lambda { |value| + value ||= "" + @rakefiles.clear + @rakefiles << value + } + ], + ["--rakelibdir", "--rakelib", "-R RAKELIBDIR", + "Auto-import any .rake files in RAKELIBDIR. " + + "(default is 'rakelib')", + lambda { |value| + options.rakelib = value.split(File::PATH_SEPARATOR) + } + ], + ["--require", "-r MODULE", + "Require MODULE before executing rakefile.", + lambda { |value| + begin + require value + rescue LoadError => ex + begin + rake_require value + rescue LoadError + raise ex + end + end + } + ], + ["--rules", + "Trace the rules resolution.", + lambda { |value| options.trace_rules = true } + ], + ["--silent", "-s", + "Like --quiet, but also suppresses the " + + "'in directory' announcement.", + lambda { |value| + Rake.verbose(false) + options.silent = true + } + ], + ["--suppress-backtrace PATTERN", + "Suppress backtrace lines matching regexp PATTERN. " + + "Ignored if --trace is on.", + lambda { |value| + options.suppress_backtrace_pattern = Regexp.new(value) + } + ], + ["--system", "-g", + "Using system wide (global) rakefiles " + + "(usually '~/.rake/*.rake').", + lambda { |value| options.load_system = true } + ], + ["--no-system", "--nosystem", "-G", + "Use standard project Rakefile search paths, " + + "ignore system wide rakefiles.", + lambda { |value| options.ignore_system = true } + ], + ["--tasks", "-T [PATTERN]", + "Display the tasks (matching optional PATTERN) " + + "with descriptions, then exit. " + + "-AT combination displays all of tasks contained no description.", + lambda { |value| + select_tasks_to_show(options, :tasks, value) + } + ], + ["--trace=[OUT]", "-t", + "Turn on invoke/execute tracing, enable full backtrace. " + + "OUT can be stderr (default) or stdout.", + lambda { |value| + options.trace = true + options.backtrace = true + select_trace_output(options, "trace", value) + Rake.verbose(true) + } + ], + ["--verbose", "-v", + "Log message to standard output.", + lambda { |value| Rake.verbose(true) } + ], + ["--version", "-V", + "Display the program version.", + lambda { |value| + puts "rake, version #{Rake::VERSION}" + exit + } + ], + ["--where", "-W [PATTERN]", + "Describe the tasks (matching optional PATTERN), then exit.", + lambda { |value| + select_tasks_to_show(options, :lines, value) + options.show_all_tasks = true + } + ], + ["--no-deprecation-warnings", "-X", + "Disable the deprecation warnings.", + lambda { |value| + options.ignore_deprecate = true + } + ], + ]) + end + + def select_tasks_to_show(options, show_tasks, value) # :nodoc: + options.show_tasks = show_tasks + options.show_task_pattern = Regexp.new(value || "") + Rake::TaskManager.record_task_metadata = true + end + private :select_tasks_to_show + + def select_trace_output(options, trace_option, value) # :nodoc: + value = value.strip unless value.nil? + case value + when "stdout" + options.trace_output = $stdout + when "stderr", nil + options.trace_output = $stderr + else + fail CommandLineOptionError, + "Unrecognized --#{trace_option} option '#{value}'" + end + end + private :select_trace_output + + # Read and handle the command line options. Returns the command line + # arguments that we didn't understand, which should (in theory) be just + # task names and env vars. + def handle_options(argv) # :nodoc: + set_default_options + + OptionParser.new do |opts| + opts.banner = "#{Rake.application.name} [-f rakefile] {options} targets..." + opts.separator "" + opts.separator "Options are ..." + + opts.on_tail("-h", "--help", "-H", "Display this help message.") do + puts opts + exit + end + + standard_rake_options.each { |args| opts.on(*args) } + opts.environment("RAKEOPT") + end.parse(argv) + end + + # Similar to the regular Ruby +require+ command, but will check + # for *.rake files in addition to *.rb files. + def rake_require(file_name, paths=$LOAD_PATH, loaded=$") # :nodoc: + fn = file_name + ".rake" + return false if loaded.include?(fn) + paths.each do |path| + full_path = File.join(path, fn) + if File.exist?(full_path) + Rake.load_rakefile(full_path) + loaded << fn + return true + end + end + fail LoadError, "Can't find #{file_name}" + end + + def find_rakefile_location # :nodoc: + here = Dir.pwd + until (fn = have_rakefile) + Dir.chdir("..") + return nil if Dir.pwd == here || options.nosearch + here = Dir.pwd + end + [fn, here] + ensure + Dir.chdir(Rake.original_dir) + end + + def print_rakefile_directory(location) # :nodoc: + $stderr.puts "(in #{Dir.pwd})" unless + options.silent or original_dir == location + end + + def raw_load_rakefile # :nodoc: + rakefile, location = find_rakefile_location + if (!options.ignore_system) && + (options.load_system || rakefile.nil?) && + system_dir && File.directory?(system_dir) + print_rakefile_directory(location) + glob("#{system_dir}/*.rake") do |name| + add_import name + end + else + fail "No Rakefile found (looking for: #{@rakefiles.join(', ')})" if + rakefile.nil? + @rakefile = rakefile + Dir.chdir(location) + print_rakefile_directory(location) + Rake.load_rakefile(File.expand_path(@rakefile)) if + @rakefile && @rakefile != "" + options.rakelib.each do |rlib| + glob("#{rlib}/*.rake") do |name| + add_import name + end + end + end + load_imports + end + + def glob(path, &block) # :nodoc: + FileList.glob(path.tr("\\", "/")).each(&block) + end + private :glob + + # The directory path containing the system wide rakefiles. + def system_dir # :nodoc: + @system_dir ||= + begin + if ENV["RAKE_SYSTEM"] + ENV["RAKE_SYSTEM"] + else + standard_system_dir + end + end + end + + # The standard directory containing system wide rake files. + if Win32.windows? + def standard_system_dir #:nodoc: + Win32.win32_system_dir + end + else + def standard_system_dir #:nodoc: + File.join(File.expand_path("~"), ".rake") + end + end + private :standard_system_dir + + # Collect the list of tasks on the command line. If no tasks are + # given, return a list containing only the default task. + # Environmental assignments are processed at this time as well. + # + # `args` is the list of arguments to peruse to get the list of tasks. + # It should be the command line that was given to rake, less any + # recognised command-line options, which OptionParser.parse will + # have taken care of already. + def collect_command_line_tasks(args) # :nodoc: + @top_level_tasks = [] + args.each do |arg| + if arg =~ /^(\w+)=(.*)$/m + ENV[$1] = $2 + else + @top_level_tasks << arg unless arg =~ /^-/ + end + end + @top_level_tasks.push(default_task_name) if @top_level_tasks.empty? + end + + # Default task name ("default"). + # (May be overridden by subclasses) + def default_task_name # :nodoc: + "default" + end + + # Add a file to the list of files to be imported. + def add_import(fn) # :nodoc: + @pending_imports << fn + end + + # Load the pending list of imported files. + def load_imports # :nodoc: + while fn = @pending_imports.shift + next if @imported.member?(fn) + fn_task = lookup(fn) and fn_task.invoke + ext = File.extname(fn) + loader = @loaders[ext] || @default_loader + loader.load(fn) + if fn_task = lookup(fn) and fn_task.needed? + fn_task.reenable + fn_task.invoke + loader.load(fn) + end + @imported << fn + end + end + + def rakefile_location(backtrace=caller) # :nodoc: + backtrace.map { |t| t[/([^:]+):/, 1] } + + re = /^#{@rakefile}$/ + re = /#{re.source}/i if windows? + + backtrace.find { |str| str =~ re } || "" + end + + def set_default_options # :nodoc: + options.always_multitask = false + options.backtrace = false + options.build_all = false + options.dryrun = false + options.ignore_deprecate = false + options.ignore_system = false + options.job_stats = false + options.load_system = false + options.nosearch = false + options.rakelib = %w[rakelib] + options.show_all_tasks = false + options.show_prereqs = false + options.show_task_pattern = nil + options.show_tasks = nil + options.silent = false + options.suppress_backtrace_pattern = nil + options.thread_pool_size = Rake.suggested_thread_count + options.trace = false + options.trace_output = $stderr + options.trace_rules = false + end + + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/rake-13.0.6/lib/rake/backtrace.rb b/vendor/bundle/ruby/3.1.0/gems/rake-13.0.6/lib/rake/backtrace.rb new file mode 100644 index 000000000..31ff05450 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/rake-13.0.6/lib/rake/backtrace.rb @@ -0,0 +1,24 @@ +# frozen_string_literal: true +module Rake + module Backtrace # :nodoc: all + SYS_KEYS = RbConfig::CONFIG.keys.grep(/(?:[a-z]prefix|libdir)\z/) + SYS_PATHS = RbConfig::CONFIG.values_at(*SYS_KEYS).uniq + + [ File.join(File.dirname(__FILE__), "..") ] + + SUPPRESSED_PATHS = SYS_PATHS. + map { |s| s.tr("\\", "/") }. + map { |f| File.expand_path(f) }. + reject { |s| s.nil? || s =~ /^ *$/ } + SUPPRESSED_PATHS_RE = SUPPRESSED_PATHS.map { |f| Regexp.quote(f) }.join("|") + SUPPRESSED_PATHS_RE << "|^org\\/jruby\\/\\w+\\.java" if + Object.const_defined?(:RUBY_ENGINE) and RUBY_ENGINE == "jruby" + + SUPPRESS_PATTERN = %r!(\A(#{SUPPRESSED_PATHS_RE})|bin/rake:\d+)!i + + def self.collapse(backtrace) + pattern = Rake.application.options.suppress_backtrace_pattern || + SUPPRESS_PATTERN + backtrace.reject { |elem| elem =~ pattern } + end + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/rake-13.0.6/lib/rake/clean.rb b/vendor/bundle/ruby/3.1.0/gems/rake-13.0.6/lib/rake/clean.rb new file mode 100644 index 000000000..b52e832a9 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/rake-13.0.6/lib/rake/clean.rb @@ -0,0 +1,78 @@ +# frozen_string_literal: true +# The 'rake/clean' file defines two file lists (CLEAN and CLOBBER) and +# two rake tasks (:clean and :clobber). +# +# [:clean] Clean up the project by deleting scratch files and backup +# files. Add files to the CLEAN file list to have the :clean +# target handle them. +# +# [:clobber] Clobber all generated and non-source files in a project. +# The task depends on :clean, so all the clean files will +# be deleted as well as files in the CLOBBER file list. +# The intent of this task is to return a project to its +# pristine, just unpacked state. + +require "rake" + +# :stopdoc: + +module Rake + module Cleaner + extend FileUtils + + module_function + + def cleanup_files(file_names) + file_names.each do |file_name| + cleanup(file_name) + end + end + + def cleanup(file_name, **opts) + begin + opts = { verbose: Rake.application.options.trace }.merge(opts) + rm_r file_name, **opts + rescue StandardError => ex + puts "Failed to remove #{file_name}: #{ex}" unless file_already_gone?(file_name) + end + end + + def file_already_gone?(file_name) + return false if File.exist?(file_name) + + path = file_name + prev = nil + + while path = File.dirname(path) + return false if cant_be_deleted?(path) + break if [prev, "."].include?(path) + prev = path + end + true + end + private_class_method :file_already_gone? + + def cant_be_deleted?(path_name) + File.exist?(path_name) && + (!File.readable?(path_name) || !File.executable?(path_name)) + end + private_class_method :cant_be_deleted? + end +end + +CLEAN = ::Rake::FileList["**/*~", "**/*.bak", "**/core"] +CLEAN.clear_exclude.exclude { |fn| + fn.pathmap("%f").downcase == "core" && File.directory?(fn) +} + +desc "Remove any temporary products." +task :clean do + Rake::Cleaner.cleanup_files(CLEAN) +end + +CLOBBER = ::Rake::FileList.new + +desc "Remove any generated files." +task clobber: [:clean] do + Rake::Cleaner.cleanup_files(CLOBBER) +end diff --git a/vendor/bundle/ruby/3.1.0/gems/rake-13.0.6/lib/rake/cloneable.rb b/vendor/bundle/ruby/3.1.0/gems/rake-13.0.6/lib/rake/cloneable.rb new file mode 100644 index 000000000..eddb77e2f --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/rake-13.0.6/lib/rake/cloneable.rb @@ -0,0 +1,17 @@ +# frozen_string_literal: true +module Rake + ## + # Mixin for creating easily cloned objects. + + module Cloneable # :nodoc: + # The hook that is invoked by 'clone' and 'dup' methods. + def initialize_copy(source) + super + source.instance_variables.each do |var| + src_value = source.instance_variable_get(var) + value = src_value.clone rescue src_value + instance_variable_set(var, value) + end + end + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/rake-13.0.6/lib/rake/cpu_counter.rb b/vendor/bundle/ruby/3.1.0/gems/rake-13.0.6/lib/rake/cpu_counter.rb new file mode 100644 index 000000000..564a62859 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/rake-13.0.6/lib/rake/cpu_counter.rb @@ -0,0 +1,107 @@ +# frozen_string_literal: true +module Rake + + # Based on a script at: + # http://stackoverflow.com/questions/891537/ruby-detect-number-of-cpus-installed + class CpuCounter # :nodoc: all + def self.count + new.count_with_default + end + + def count_with_default(default=4) + count || default + rescue StandardError + default + end + + begin + require "etc" + rescue LoadError + else + if Etc.respond_to?(:nprocessors) + def count + return Etc.nprocessors + end + end + end + end +end + +unless Rake::CpuCounter.method_defined?(:count) + Rake::CpuCounter.class_eval <<-'end;', __FILE__, __LINE__+1 + require 'rbconfig' + + def count + if RUBY_PLATFORM == 'java' + count_via_java_runtime + else + case RbConfig::CONFIG['host_os'] + when /linux/ + count_via_cpuinfo + when /darwin|bsd/ + count_via_sysctl + when /mswin|mingw/ + count_via_win32 + else + # Try everything + count_via_win32 || + count_via_sysctl || + count_via_cpuinfo + end + end + end + + def count_via_java_runtime + Java::Java.lang.Runtime.getRuntime.availableProcessors + rescue StandardError + nil + end + + def count_via_win32 + require 'win32ole' + wmi = WIN32OLE.connect("winmgmts://") + cpu = wmi.ExecQuery("select NumberOfCores from Win32_Processor") # TODO count hyper-threaded in this + cpu.to_enum.first.NumberOfCores + rescue StandardError, LoadError + nil + end + + def count_via_cpuinfo + open('/proc/cpuinfo') { |f| f.readlines }.grep(/processor/).size + rescue StandardError + nil + end + + def count_via_sysctl + run 'sysctl', '-n', 'hw.ncpu' + end + + def run(command, *args) + cmd = resolve_command(command) + if cmd + IO.popen [cmd, *args] do |io| + io.read.to_i + end + else + nil + end + end + + def resolve_command(command) + look_for_command("/usr/sbin", command) || + look_for_command("/sbin", command) || + in_path_command(command) + end + + def look_for_command(dir, command) + path = File.join(dir, command) + File.exist?(path) ? path : nil + end + + def in_path_command(command) + IO.popen ['which', command] do |io| + io.eof? ? nil : command + end + end + end; +end diff --git a/vendor/bundle/ruby/3.1.0/gems/rake-13.0.6/lib/rake/default_loader.rb b/vendor/bundle/ruby/3.1.0/gems/rake-13.0.6/lib/rake/default_loader.rb new file mode 100644 index 000000000..d3b4650d3 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/rake-13.0.6/lib/rake/default_loader.rb @@ -0,0 +1,15 @@ +# frozen_string_literal: true +module Rake + + # Default Rakefile loader used by +import+. + class DefaultLoader + + ## + # Loads a rakefile into the current application from +fn+ + + def load(fn) + Rake.load_rakefile(File.expand_path(fn)) + end + end + +end diff --git a/vendor/bundle/ruby/3.1.0/gems/rake-13.0.6/lib/rake/dsl_definition.rb b/vendor/bundle/ruby/3.1.0/gems/rake-13.0.6/lib/rake/dsl_definition.rb new file mode 100644 index 000000000..c80464020 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/rake-13.0.6/lib/rake/dsl_definition.rb @@ -0,0 +1,195 @@ +# frozen_string_literal: true +# Rake DSL functions. +require "rake/file_utils_ext" + +module Rake + + ## + # DSL is a module that provides #task, #desc, #namespace, etc. Use this + # when you'd like to use rake outside the top level scope. + # + # For a Rakefile you run from the command line this module is automatically + # included. + + module DSL + + #-- + # Include the FileUtils file manipulation functions in the top + # level module, but mark them private so that they don't + # unintentionally define methods on other objects. + #++ + + include FileUtilsExt + private(*FileUtils.instance_methods(false)) + private(*FileUtilsExt.instance_methods(false)) + + private + + # :call-seq: + # task(task_name) + # task(task_name: dependencies) + # task(task_name, arguments => dependencies) + # + # Declare a basic task. The +task_name+ is always the first argument. If + # the task name contains a ":" it is defined in that namespace. + # + # The +dependencies+ may be a single task name or an Array of task names. + # The +argument+ (a single name) or +arguments+ (an Array of names) define + # the arguments provided to the task. + # + # The task, argument and dependency names may be either symbols or + # strings. + # + # A task with a single dependency: + # + # task clobber: %w[clean] do + # rm_rf "html" + # end + # + # A task with an argument and a dependency: + # + # task :package, [:version] => :test do |t, args| + # # ... + # end + # + # To invoke this task from the command line: + # + # $ rake package[1.2.3] + # + def task(*args, &block) # :doc: + Rake::Task.define_task(*args, &block) + end + + # Declare a file task. + # + # Example: + # file "config.cfg" => ["config.template"] do + # open("config.cfg", "w") do |outfile| + # open("config.template") do |infile| + # while line = infile.gets + # outfile.puts line + # end + # end + # end + # end + # + def file(*args, &block) # :doc: + Rake::FileTask.define_task(*args, &block) + end + + # Declare a file creation task. + # (Mainly used for the directory command). + def file_create(*args, &block) + Rake::FileCreationTask.define_task(*args, &block) + end + + # Declare a set of files tasks to create the given directories on + # demand. + # + # Example: + # directory "testdata/doc" + # + def directory(*args, &block) # :doc: + result = file_create(*args, &block) + dir, _ = *Rake.application.resolve_args(args) + dir = Rake.from_pathname(dir) + Rake.each_dir_parent(dir) do |d| + file_create d do |t| + mkdir_p t.name unless File.exist?(t.name) + end + end + result + end + + # Declare a task that performs its prerequisites in + # parallel. Multitasks does *not* guarantee that its prerequisites + # will execute in any given order (which is obvious when you think + # about it) + # + # Example: + # multitask deploy: %w[deploy_gem deploy_rdoc] + # + def multitask(*args, &block) # :doc: + Rake::MultiTask.define_task(*args, &block) + end + + # Create a new rake namespace and use it for evaluating the given + # block. Returns a NameSpace object that can be used to lookup + # tasks defined in the namespace. + # + # Example: + # + # ns = namespace "nested" do + # # the "nested:run" task + # task :run + # end + # task_run = ns[:run] # find :run in the given namespace. + # + # Tasks can also be defined in a namespace by using a ":" in the task + # name: + # + # task "nested:test" do + # # ... + # end + # + def namespace(name=nil, &block) # :doc: + name = name.to_s if name.kind_of?(Symbol) + name = name.to_str if name.respond_to?(:to_str) + unless name.kind_of?(String) || name.nil? + raise ArgumentError, "Expected a String or Symbol for a namespace name" + end + Rake.application.in_namespace(name, &block) + end + + # Declare a rule for auto-tasks. + # + # Example: + # rule '.o' => '.c' do |t| + # sh 'cc', '-o', t.name, t.source + # end + # + def rule(*args, &block) # :doc: + Rake::Task.create_rule(*args, &block) + end + + # Describes the next rake task. Duplicate descriptions are discarded. + # Descriptions are shown with rake -T (up to the first + # sentence) and rake -D (the entire description). + # + # Example: + # desc "Run the Unit Tests" + # task test: [:build] + # # ... run tests + # end + # + def desc(description) # :doc: + Rake.application.last_description = description + end + + # Import the partial Rakefiles +fn+. Imported files are loaded + # _after_ the current file is completely loaded. This allows the + # import statement to appear anywhere in the importing file, and yet + # allowing the imported files to depend on objects defined in the + # importing file. + # + # A common use of the import statement is to include files + # containing dependency declarations. + # + # See also the --rakelibdir command line option. + # + # Example: + # import ".depend", "my_rules" + # + def import(*fns) # :doc: + fns.each do |fn| + Rake.application.add_import(fn) + end + end + end + extend FileUtilsExt +end + +# Extend the main object with the DSL commands. This allows top-level +# calls to task, etc. to work from a Rakefile without polluting the +# object inheritance tree. +self.extend Rake::DSL diff --git a/vendor/bundle/ruby/3.1.0/gems/rake-13.0.6/lib/rake/early_time.rb b/vendor/bundle/ruby/3.1.0/gems/rake-13.0.6/lib/rake/early_time.rb new file mode 100644 index 000000000..80cc6bfad --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/rake-13.0.6/lib/rake/early_time.rb @@ -0,0 +1,22 @@ +# frozen_string_literal: true +module Rake + + # EarlyTime is a fake timestamp that occurs _before_ any other time value. + class EarlyTime + include Comparable + include Singleton + + ## + # The EarlyTime always comes before +other+! + + def <=>(other) + -1 + end + + def to_s # :nodoc: + "" + end + end + + EARLY = EarlyTime.instance +end diff --git a/vendor/bundle/ruby/3.1.0/gems/rake-13.0.6/lib/rake/ext/core.rb b/vendor/bundle/ruby/3.1.0/gems/rake-13.0.6/lib/rake/ext/core.rb new file mode 100644 index 000000000..226f2125b --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/rake-13.0.6/lib/rake/ext/core.rb @@ -0,0 +1,26 @@ +# frozen_string_literal: true +class Module + # Check for an existing method in the current class before extending. If + # the method already exists, then a warning is printed and the extension is + # not added. Otherwise the block is yielded and any definitions in the + # block will take effect. + # + # Usage: + # + # class String + # rake_extension("xyz") do + # def xyz + # ... + # end + # end + # end + # + def rake_extension(method) # :nodoc: + if method_defined?(method) + $stderr.puts "WARNING: Possible conflict with Rake extension: " + + "#{self}##{method} already exists" + else + yield + end + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/rake-13.0.6/lib/rake/ext/string.rb b/vendor/bundle/ruby/3.1.0/gems/rake-13.0.6/lib/rake/ext/string.rb new file mode 100644 index 000000000..c70236ae9 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/rake-13.0.6/lib/rake/ext/string.rb @@ -0,0 +1,176 @@ +# frozen_string_literal: true +require "rake/ext/core" + +class String + + rake_extension("ext") do + # Replace the file extension with +newext+. If there is no extension on + # the string, append the new extension to the end. If the new extension + # is not given, or is the empty string, remove any existing extension. + # + # +ext+ is a user added method for the String class. + # + # This String extension comes from Rake + def ext(newext="") + return self.dup if [".", ".."].include? self + if newext != "" + newext = "." + newext unless newext =~ /^\./ + end + self.chomp(File.extname(self)) << newext + end + end + + rake_extension("pathmap") do + # Explode a path into individual components. Used by +pathmap+. + # + # This String extension comes from Rake + def pathmap_explode + head, tail = File.split(self) + return [self] if head == self + return [tail] if head == "." || tail == "/" + return [head, tail] if head == "/" + return head.pathmap_explode + [tail] + end + protected :pathmap_explode + + # Extract a partial path from the path. Include +n+ directories from the + # front end (left hand side) if +n+ is positive. Include |+n+| + # directories from the back end (right hand side) if +n+ is negative. + # + # This String extension comes from Rake + def pathmap_partial(n) + dirs = File.dirname(self).pathmap_explode + partial_dirs = + if n > 0 + dirs[0...n] + elsif n < 0 + dirs.reverse[0...-n].reverse + else + "." + end + File.join(partial_dirs) + end + protected :pathmap_partial + + # Perform the pathmap replacement operations on the given path. The + # patterns take the form 'pat1,rep1;pat2,rep2...'. + # + # This String extension comes from Rake + def pathmap_replace(patterns, &block) + result = self + patterns.split(";").each do |pair| + pattern, replacement = pair.split(",") + pattern = Regexp.new(pattern) + if replacement == "*" && block_given? + result = result.sub(pattern, &block) + elsif replacement + result = result.sub(pattern, replacement) + else + result = result.sub(pattern, "") + end + end + result + end + protected :pathmap_replace + + # Map the path according to the given specification. The specification + # controls the details of the mapping. The following special patterns are + # recognized: + # + # %p :: The complete path. + # %f :: The base file name of the path, with its file extension, + # but without any directories. + # %n :: The file name of the path without its file extension. + # %d :: The directory list of the path. + # %x :: The file extension of the path. An empty string if there + # is no extension. + # %X :: Everything *but* the file extension. + # %s :: The alternate file separator if defined, otherwise use # + # the standard file separator. + # %% :: A percent sign. + # + # The %d specifier can also have a numeric prefix (e.g. '%2d'). + # If the number is positive, only return (up to) +n+ directories in the + # path, starting from the left hand side. If +n+ is negative, return (up + # to) +n+ directories from the right hand side of the path. + # + # Examples: + # + # 'a/b/c/d/file.txt'.pathmap("%2d") => 'a/b' + # 'a/b/c/d/file.txt'.pathmap("%-2d") => 'c/d' + # + # Also the %d, %p, %f, %n, + # %x, and %X operators can take a pattern/replacement + # argument to perform simple string substitutions on a particular part of + # the path. The pattern and replacement are separated by a comma and are + # enclosed by curly braces. The replacement spec comes after the % + # character but before the operator letter. (e.g. "%{old,new}d"). + # Multiple replacement specs should be separated by semi-colons (e.g. + # "%{old,new;src,bin}d"). + # + # Regular expressions may be used for the pattern, and back refs may be + # used in the replacement text. Curly braces, commas and semi-colons are + # excluded from both the pattern and replacement text (let's keep parsing + # reasonable). + # + # For example: + # + # "src/org/onestepback/proj/A.java".pathmap("%{^src,class}X.class") + # + # returns: + # + # "class/org/onestepback/proj/A.class" + # + # If the replacement text is '*', then a block may be provided to perform + # some arbitrary calculation for the replacement. + # + # For example: + # + # "/path/to/file.TXT".pathmap("%X%{.*,*}x") { |ext| + # ext.downcase + # } + # + # Returns: + # + # "/path/to/file.txt" + # + # This String extension comes from Rake + def pathmap(spec=nil, &block) + return self if spec.nil? + result = "".dup + spec.scan(/%\{[^}]*\}-?\d*[sdpfnxX%]|%-?\d+d|%.|[^%]+/) do |frag| + case frag + when "%f" + result << File.basename(self) + when "%n" + result << File.basename(self).ext + when "%d" + result << File.dirname(self) + when "%x" + result << File.extname(self) + when "%X" + result << self.ext + when "%p" + result << self + when "%s" + result << (File::ALT_SEPARATOR || File::SEPARATOR) + when "%-" + # do nothing + when "%%" + result << "%" + when /%(-?\d+)d/ + result << pathmap_partial($1.to_i) + when /^%\{([^}]*)\}(\d*[dpfnxX])/ + patterns, operator = $1, $2 + result << pathmap("%" + operator).pathmap_replace(patterns, &block) + when /^%/ + fail ArgumentError, "Unknown pathmap specifier #{frag} in '#{spec}'" + else + result << frag + end + end + result + end + end + +end diff --git a/vendor/bundle/ruby/3.1.0/gems/rake-13.0.6/lib/rake/file_creation_task.rb b/vendor/bundle/ruby/3.1.0/gems/rake-13.0.6/lib/rake/file_creation_task.rb new file mode 100644 index 000000000..5a4c68492 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/rake-13.0.6/lib/rake/file_creation_task.rb @@ -0,0 +1,25 @@ +# frozen_string_literal: true +require "rake/file_task" +require "rake/early_time" + +module Rake + + # A FileCreationTask is a file task that when used as a dependency will be + # needed if and only if the file has not been created. Once created, it is + # not re-triggered if any of its dependencies are newer, nor does trigger + # any rebuilds of tasks that depend on it whenever it is updated. + # + class FileCreationTask < FileTask + # Is this file task needed? Yes if it doesn't exist. + def needed? + !File.exist?(name) + end + + # Time stamp for file creation task. This time stamp is earlier + # than any other time stamp. + def timestamp + Rake::EARLY + end + end + +end diff --git a/vendor/bundle/ruby/3.1.0/gems/rake-13.0.6/lib/rake/file_list.rb b/vendor/bundle/ruby/3.1.0/gems/rake-13.0.6/lib/rake/file_list.rb new file mode 100644 index 000000000..22c339f24 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/rake-13.0.6/lib/rake/file_list.rb @@ -0,0 +1,435 @@ +# frozen_string_literal: true +require "rake/cloneable" +require "rake/file_utils_ext" +require "rake/ext/string" + +module Rake + + ## + # A FileList is essentially an array with a few helper methods defined to + # make file manipulation a bit easier. + # + # FileLists are lazy. When given a list of glob patterns for possible files + # to be included in the file list, instead of searching the file structures + # to find the files, a FileList holds the pattern for latter use. + # + # This allows us to define a number of FileList to match any number of + # files, but only search out the actual files when then FileList itself is + # actually used. The key is that the first time an element of the + # FileList/Array is requested, the pending patterns are resolved into a real + # list of file names. + # + class FileList + + include Cloneable + + # == Method Delegation + # + # The lazy evaluation magic of FileLists happens by implementing all the + # array specific methods to call +resolve+ before delegating the heavy + # lifting to an embedded array object (@items). + # + # In addition, there are two kinds of delegation calls. The regular kind + # delegates to the @items array and returns the result directly. Well, + # almost directly. It checks if the returned value is the @items object + # itself, and if so will return the FileList object instead. + # + # The second kind of delegation call is used in methods that normally + # return a new Array object. We want to capture the return value of these + # methods and wrap them in a new FileList object. We enumerate these + # methods in the +SPECIAL_RETURN+ list below. + + # List of array methods (that are not in +Object+) that need to be + # delegated. + ARRAY_METHODS = (Array.instance_methods - Object.instance_methods).map(&:to_s) + + # List of additional methods that must be delegated. + MUST_DEFINE = %w[inspect <=>] + + # List of methods that should not be delegated here (we define special + # versions of them explicitly below). + MUST_NOT_DEFINE = %w[to_a to_ary partition * <<] + + # List of delegated methods that return new array values which need + # wrapping. + SPECIAL_RETURN = %w[ + map collect sort sort_by select find_all reject grep + compact flatten uniq values_at + + - & | + ] + + DELEGATING_METHODS = (ARRAY_METHODS + MUST_DEFINE - MUST_NOT_DEFINE).map(&:to_s).sort.uniq + + # Now do the delegation. + DELEGATING_METHODS.each do |sym| + if SPECIAL_RETURN.include?(sym) + ln = __LINE__ + 1 + class_eval %{ + def #{sym}(*args, &block) + resolve + result = @items.send(:#{sym}, *args, &block) + self.class.new.import(result) + end + }, __FILE__, ln + else + ln = __LINE__ + 1 + class_eval %{ + def #{sym}(*args, &block) + resolve + result = @items.send(:#{sym}, *args, &block) + result.object_id == @items.object_id ? self : result + end + }, __FILE__, ln + end + end + + GLOB_PATTERN = %r{[*?\[\{]} + + # Create a file list from the globbable patterns given. If you wish to + # perform multiple includes or excludes at object build time, use the + # "yield self" pattern. + # + # Example: + # file_list = FileList.new('lib/**/*.rb', 'test/test*.rb') + # + # pkg_files = FileList.new('lib/**/*') do |fl| + # fl.exclude(/\bCVS\b/) + # end + # + def initialize(*patterns) + @pending_add = [] + @pending = false + @exclude_patterns = DEFAULT_IGNORE_PATTERNS.dup + @exclude_procs = DEFAULT_IGNORE_PROCS.dup + @items = [] + patterns.each { |pattern| include(pattern) } + yield self if block_given? + end + + # Add file names defined by glob patterns to the file list. If an array + # is given, add each element of the array. + # + # Example: + # file_list.include("*.java", "*.cfg") + # file_list.include %w( math.c lib.h *.o ) + # + def include(*filenames) + # TODO: check for pending + filenames.each do |fn| + if fn.respond_to? :to_ary + include(*fn.to_ary) + else + @pending_add << Rake.from_pathname(fn) + end + end + @pending = true + self + end + alias :add :include + + # Register a list of file name patterns that should be excluded from the + # list. Patterns may be regular expressions, glob patterns or regular + # strings. In addition, a block given to exclude will remove entries that + # return true when given to the block. + # + # Note that glob patterns are expanded against the file system. If a file + # is explicitly added to a file list, but does not exist in the file + # system, then an glob pattern in the exclude list will not exclude the + # file. + # + # Examples: + # FileList['a.c', 'b.c'].exclude("a.c") => ['b.c'] + # FileList['a.c', 'b.c'].exclude(/^a/) => ['b.c'] + # + # If "a.c" is a file, then ... + # FileList['a.c', 'b.c'].exclude("a.*") => ['b.c'] + # + # If "a.c" is not a file, then ... + # FileList['a.c', 'b.c'].exclude("a.*") => ['a.c', 'b.c'] + # + def exclude(*patterns, &block) + patterns.each do |pat| + if pat.respond_to? :to_ary + exclude(*pat.to_ary) + else + @exclude_patterns << Rake.from_pathname(pat) + end + end + @exclude_procs << block if block_given? + resolve_exclude unless @pending + self + end + + # Clear all the exclude patterns so that we exclude nothing. + def clear_exclude + @exclude_patterns = [] + @exclude_procs = [] + self + end + + # A FileList is equal through array equality. + def ==(array) + to_ary == array + end + + # Return the internal array object. + def to_a + resolve + @items + end + + # Return the internal array object. + def to_ary + to_a + end + + # Lie about our class. + def is_a?(klass) + klass == Array || super(klass) + end + alias kind_of? is_a? + + # Redefine * to return either a string or a new file list. + def *(other) + result = @items * other + case result + when Array + self.class.new.import(result) + else + result + end + end + + def <<(obj) + resolve + @items << Rake.from_pathname(obj) + self + end + + # Resolve all the pending adds now. + def resolve + if @pending + @pending = false + @pending_add.each do |fn| resolve_add(fn) end + @pending_add = [] + resolve_exclude + end + self + end + + def resolve_add(fn) # :nodoc: + case fn + when GLOB_PATTERN + add_matching(fn) + else + self << fn + end + end + private :resolve_add + + def resolve_exclude # :nodoc: + reject! { |fn| excluded_from_list?(fn) } + self + end + private :resolve_exclude + + # Return a new FileList with the results of running +sub+ against each + # element of the original list. + # + # Example: + # FileList['a.c', 'b.c'].sub(/\.c$/, '.o') => ['a.o', 'b.o'] + # + def sub(pat, rep) + inject(self.class.new) { |res, fn| res << fn.sub(pat, rep) } + end + + # Return a new FileList with the results of running +gsub+ against each + # element of the original list. + # + # Example: + # FileList['lib/test/file', 'x/y'].gsub(/\//, "\\") + # => ['lib\\test\\file', 'x\\y'] + # + def gsub(pat, rep) + inject(self.class.new) { |res, fn| res << fn.gsub(pat, rep) } + end + + # Same as +sub+ except that the original file list is modified. + def sub!(pat, rep) + each_with_index { |fn, i| self[i] = fn.sub(pat, rep) } + self + end + + # Same as +gsub+ except that the original file list is modified. + def gsub!(pat, rep) + each_with_index { |fn, i| self[i] = fn.gsub(pat, rep) } + self + end + + # Apply the pathmap spec to each of the included file names, returning a + # new file list with the modified paths. (See String#pathmap for + # details.) + def pathmap(spec=nil, &block) + collect { |fn| fn.pathmap(spec, &block) } + end + + # Return a new FileList with String#ext method applied to + # each member of the array. + # + # This method is a shortcut for: + # + # array.collect { |item| item.ext(newext) } + # + # +ext+ is a user added method for the Array class. + def ext(newext="") + collect { |fn| fn.ext(newext) } + end + + # Grep each of the files in the filelist using the given pattern. If a + # block is given, call the block on each matching line, passing the file + # name, line number, and the matching line of text. If no block is given, + # a standard emacs style file:linenumber:line message will be printed to + # standard out. Returns the number of matched items. + def egrep(pattern, *options) + matched = 0 + each do |fn| + begin + File.open(fn, "r", *options) do |inf| + count = 0 + inf.each do |line| + count += 1 + if pattern.match(line) + matched += 1 + if block_given? + yield fn, count, line + else + puts "#{fn}:#{count}:#{line}" + end + end + end + end + rescue StandardError => ex + $stderr.puts "Error while processing '#{fn}': #{ex}" + end + end + matched + end + + # Return a new file list that only contains file names from the current + # file list that exist on the file system. + def existing + select { |fn| File.exist?(fn) }.uniq + end + + # Modify the current file list so that it contains only file name that + # exist on the file system. + def existing! + resolve + @items = @items.select { |fn| File.exist?(fn) }.uniq + self + end + + # FileList version of partition. Needed because the nested arrays should + # be FileLists in this version. + def partition(&block) # :nodoc: + resolve + result = @items.partition(&block) + [ + self.class.new.import(result[0]), + self.class.new.import(result[1]), + ] + end + + # Convert a FileList to a string by joining all elements with a space. + def to_s + resolve + self.join(" ") + end + + # Add matching glob patterns. + def add_matching(pattern) + self.class.glob(pattern).each do |fn| + self << fn unless excluded_from_list?(fn) + end + end + private :add_matching + + # Should the given file name be excluded from the list? + # + # NOTE: This method was formerly named "exclude?", but Rails + # introduced an exclude? method as an array method and setup a + # conflict with file list. We renamed the method to avoid + # confusion. If you were using "FileList#exclude?" in your user + # code, you will need to update. + def excluded_from_list?(fn) + return true if @exclude_patterns.any? do |pat| + case pat + when Regexp + fn =~ pat + when GLOB_PATTERN + flags = File::FNM_PATHNAME + # Ruby <= 1.9.3 does not support File::FNM_EXTGLOB + flags |= File::FNM_EXTGLOB if defined? File::FNM_EXTGLOB + File.fnmatch?(pat, fn, flags) + else + fn == pat + end + end + @exclude_procs.any? { |p| p.call(fn) } + end + + DEFAULT_IGNORE_PATTERNS = [ + /(^|[\/\\])CVS([\/\\]|$)/, + /(^|[\/\\])\.svn([\/\\]|$)/, + /\.bak$/, + /~$/ + ] + DEFAULT_IGNORE_PROCS = [ + proc { |fn| fn =~ /(^|[\/\\])core$/ && !File.directory?(fn) } + ] + + def import(array) # :nodoc: + @items = array + self + end + + class << self + # Create a new file list including the files listed. Similar to: + # + # FileList.new(*args) + def [](*args) + new(*args) + end + + # Get a sorted list of files matching the pattern. This method + # should be preferred to Dir[pattern] and Dir.glob(pattern) because + # the files returned are guaranteed to be sorted. + def glob(pattern, *args) + Dir.glob(pattern, *args).sort + end + end + end +end + +module Rake + class << self + + # Yield each file or directory component. + def each_dir_parent(dir) # :nodoc: + old_length = nil + while dir != "." && dir.length != old_length + yield(dir) + old_length = dir.length + dir = File.dirname(dir) + end + end + + # Convert Pathname and Pathname-like objects to strings; + # leave everything else alone + def from_pathname(path) # :nodoc: + path = path.to_path if path.respond_to?(:to_path) + path = path.to_str if path.respond_to?(:to_str) + path + end + end +end # module Rake diff --git a/vendor/bundle/ruby/3.1.0/gems/rake-13.0.6/lib/rake/file_task.rb b/vendor/bundle/ruby/3.1.0/gems/rake-13.0.6/lib/rake/file_task.rb new file mode 100644 index 000000000..db790e39f --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/rake-13.0.6/lib/rake/file_task.rb @@ -0,0 +1,54 @@ +# frozen_string_literal: true +require "rake/task" +require "rake/early_time" + +module Rake + + # A FileTask is a task that includes time based dependencies. If any of a + # FileTask's prerequisites have a timestamp that is later than the file + # represented by this task, then the file must be rebuilt (using the + # supplied actions). + # + class FileTask < Task + + # Is this file task needed? Yes if it doesn't exist, or if its time stamp + # is out of date. + def needed? + !File.exist?(name) || out_of_date?(timestamp) || @application.options.build_all + end + + # Time stamp for file task. + def timestamp + if File.exist?(name) + File.mtime(name.to_s) + else + Rake::LATE + end + end + + private + + # Are there any prerequisites with a later time than the given time stamp? + def out_of_date?(stamp) + all_prerequisite_tasks.any? { |prereq| + prereq_task = application[prereq, @scope] + if prereq_task.instance_of?(Rake::FileTask) + prereq_task.timestamp > stamp || @application.options.build_all + else + prereq_task.timestamp > stamp + end + } + end + + # ---------------------------------------------------------------- + # Task class methods. + # + class << self + # Apply the scope to the task name according to the rules for this kind + # of task. File based tasks ignore the scope when creating the name. + def scope_name(scope, task_name) + Rake.from_pathname(task_name) + end + end + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/rake-13.0.6/lib/rake/file_utils.rb b/vendor/bundle/ruby/3.1.0/gems/rake-13.0.6/lib/rake/file_utils.rb new file mode 100644 index 000000000..e979eedb2 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/rake-13.0.6/lib/rake/file_utils.rb @@ -0,0 +1,134 @@ +# frozen_string_literal: true +require "rbconfig" +require "fileutils" + +#-- +# This a FileUtils extension that defines several additional commands to be +# added to the FileUtils utility functions. +module FileUtils + # Path to the currently running Ruby program + RUBY = ENV["RUBY"] || File.join( + RbConfig::CONFIG["bindir"], + RbConfig::CONFIG["ruby_install_name"] + RbConfig::CONFIG["EXEEXT"]). + sub(/.*\s.*/m, '"\&"') + + # Run the system command +cmd+. If multiple arguments are given the command + # is run directly (without the shell, same semantics as Kernel::exec and + # Kernel::system). + # + # It is recommended you use the multiple argument form over interpolating + # user input for both usability and security reasons. With the multiple + # argument form you can easily process files with spaces or other shell + # reserved characters in them. With the multiple argument form your rake + # tasks are not vulnerable to users providing an argument like + # ; rm # -rf /. + # + # If a block is given, upon command completion the block is called with an + # OK flag (true on a zero exit status) and a Process::Status object. + # Without a block a RuntimeError is raised when the command exits non-zero. + # + # Examples: + # + # sh 'ls -ltr' + # + # sh 'ls', 'file with spaces' + # + # # check exit status after command runs + # sh %{grep pattern file} do |ok, res| + # if !ok + # puts "pattern not found (status = #{res.exitstatus})" + # end + # end + # + def sh(*cmd, &block) + options = (Hash === cmd.last) ? cmd.pop : {} + shell_runner = block_given? ? block : create_shell_runner(cmd) + + set_verbose_option(options) + verbose = options.delete :verbose + noop = options.delete(:noop) || Rake::FileUtilsExt.nowrite_flag + + Rake.rake_output_message sh_show_command cmd if verbose + + unless noop + res = (Hash === cmd.last) ? system(*cmd) : system(*cmd, options) + status = $? + status = Rake::PseudoStatus.new(1) if !res && status.nil? + shell_runner.call(res, status) + end + end + + def create_shell_runner(cmd) # :nodoc: + show_command = sh_show_command cmd + show_command = show_command[0, 42] + "..." unless $trace + + lambda do |ok, status| + ok or + fail "Command failed with status (#{status.exitstatus}): " + + "[#{show_command}]" + end + end + private :create_shell_runner + + def sh_show_command(cmd) # :nodoc: + cmd = cmd.dup + + if Hash === cmd.first + env = cmd.first + env = env.map { |name, value| "#{name}=#{value}" }.join " " + cmd[0] = env + end + + cmd.join " " + end + private :sh_show_command + + def set_verbose_option(options) # :nodoc: + unless options.key? :verbose + options[:verbose] = + (Rake::FileUtilsExt.verbose_flag == Rake::FileUtilsExt::DEFAULT) || + Rake::FileUtilsExt.verbose_flag + end + end + private :set_verbose_option + + # Run a Ruby interpreter with the given arguments. + # + # Example: + # ruby %{-pe '$_.upcase!' 1 + sh(RUBY, *args, **options, &block) + else + sh("#{RUBY} #{args.first}", **options, &block) + end + end + + LN_SUPPORTED = [true] + + # Attempt to do a normal file link, but fall back to a copy if the link + # fails. + def safe_ln(*args, **options) + if LN_SUPPORTED[0] + begin + return options.empty? ? ln(*args) : ln(*args, **options) + rescue StandardError, NotImplementedError + LN_SUPPORTED[0] = false + end + end + options.empty? ? cp(*args) : cp(*args, **options) + end + + # Split a file path into individual directory names. + # + # Example: + # split_all("a/b/c") => ['a', 'b', 'c'] + # + def split_all(path) + head, tail = File.split(path) + return [tail] if head == "." || tail == "/" + return [head, tail] if head == "/" + return split_all(head) + [tail] + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/rake-13.0.6/lib/rake/file_utils_ext.rb b/vendor/bundle/ruby/3.1.0/gems/rake-13.0.6/lib/rake/file_utils_ext.rb new file mode 100644 index 000000000..e91ad595f --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/rake-13.0.6/lib/rake/file_utils_ext.rb @@ -0,0 +1,134 @@ +# frozen_string_literal: true +require "rake/file_utils" + +module Rake + # + # FileUtilsExt provides a custom version of the FileUtils methods + # that respond to the verbose and nowrite + # commands. + # + module FileUtilsExt + include FileUtils + + class << self + attr_accessor :verbose_flag, :nowrite_flag + end + + DEFAULT = Object.new + + FileUtilsExt.verbose_flag = DEFAULT + FileUtilsExt.nowrite_flag = false + + FileUtils.commands.each do |name| + opts = FileUtils.options_of name + default_options = [] + if opts.include?("verbose") + default_options << "verbose: FileUtilsExt.verbose_flag" + end + if opts.include?("noop") + default_options << "noop: FileUtilsExt.nowrite_flag" + end + + next if default_options.empty? + module_eval(<<-EOS, __FILE__, __LINE__ + 1) + def #{name}(*args, **options, &block) + super(*args, + #{default_options.join(', ')}, + **options, &block) + end + EOS + end + + # Get/set the verbose flag controlling output from the FileUtils + # utilities. If verbose is true, then the utility method is + # echoed to standard output. + # + # Examples: + # verbose # return the current value of the + # # verbose flag + # verbose(v) # set the verbose flag to _v_. + # verbose(v) { code } # Execute code with the verbose flag set + # # temporarily to _v_. Return to the + # # original value when code is done. + def verbose(value=nil) + oldvalue = FileUtilsExt.verbose_flag + FileUtilsExt.verbose_flag = value unless value.nil? + if block_given? + begin + yield + ensure + FileUtilsExt.verbose_flag = oldvalue + end + end + FileUtilsExt.verbose_flag + end + + # Get/set the nowrite flag controlling output from the FileUtils + # utilities. If verbose is true, then the utility method is + # echoed to standard output. + # + # Examples: + # nowrite # return the current value of the + # # nowrite flag + # nowrite(v) # set the nowrite flag to _v_. + # nowrite(v) { code } # Execute code with the nowrite flag set + # # temporarily to _v_. Return to the + # # original value when code is done. + def nowrite(value=nil) + oldvalue = FileUtilsExt.nowrite_flag + FileUtilsExt.nowrite_flag = value unless value.nil? + if block_given? + begin + yield + ensure + FileUtilsExt.nowrite_flag = oldvalue + end + end + oldvalue + end + + # Use this function to prevent potentially destructive ruby code + # from running when the :nowrite flag is set. + # + # Example: + # + # when_writing("Building Project") do + # project.build + # end + # + # The following code will build the project under normal + # conditions. If the nowrite(true) flag is set, then the example + # will print: + # + # DRYRUN: Building Project + # + # instead of actually building the project. + # + def when_writing(msg=nil) + if FileUtilsExt.nowrite_flag + $stderr.puts "DRYRUN: #{msg}" if msg + else + yield + end + end + + # Send the message to the default rake output (which is $stderr). + def rake_output_message(message) + $stderr.puts(message) + end + + # Check that the options do not contain options not listed in + # +optdecl+. An ArgumentError exception is thrown if non-declared + # options are found. + def rake_check_options(options, *optdecl) + h = options.dup + optdecl.each do |name| + h.delete name + end + raise ArgumentError, "no such option: #{h.keys.join(' ')}" unless + h.empty? + end + + extend self + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/rake-13.0.6/lib/rake/invocation_chain.rb b/vendor/bundle/ruby/3.1.0/gems/rake-13.0.6/lib/rake/invocation_chain.rb new file mode 100644 index 000000000..44a995496 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/rake-13.0.6/lib/rake/invocation_chain.rb @@ -0,0 +1,57 @@ +# frozen_string_literal: true +module Rake + + # InvocationChain tracks the chain of task invocations to detect + # circular dependencies. + class InvocationChain < LinkedList + + # Is the invocation already in the chain? + def member?(invocation) + head == invocation || tail.member?(invocation) + end + + # Append an invocation to the chain of invocations. It is an error + # if the invocation already listed. + def append(invocation) + if member?(invocation) + fail RuntimeError, "Circular dependency detected: #{to_s} => #{invocation}" + end + conj(invocation) + end + + # Convert to string, ie: TOP => invocation => invocation + def to_s + "#{prefix}#{head}" + end + + # Class level append. + def self.append(invocation, chain) + chain.append(invocation) + end + + private + + def prefix + "#{tail} => " + end + + # Null object for an empty chain. + class EmptyInvocationChain < LinkedList::EmptyLinkedList + @parent = InvocationChain + + def member?(obj) + false + end + + def append(invocation) + conj(invocation) + end + + def to_s + "TOP" + end + end + + EMPTY = EmptyInvocationChain.new + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/rake-13.0.6/lib/rake/invocation_exception_mixin.rb b/vendor/bundle/ruby/3.1.0/gems/rake-13.0.6/lib/rake/invocation_exception_mixin.rb new file mode 100644 index 000000000..b0d307a48 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/rake-13.0.6/lib/rake/invocation_exception_mixin.rb @@ -0,0 +1,17 @@ +# frozen_string_literal: true +module Rake + module InvocationExceptionMixin + # Return the invocation chain (list of Rake tasks) that were in + # effect when this exception was detected by rake. May be null if + # no tasks were active. + def chain + @rake_invocation_chain ||= nil + end + + # Set the invocation chain in effect when this exception was + # detected. + def chain=(value) + @rake_invocation_chain = value + end + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/rake-13.0.6/lib/rake/late_time.rb b/vendor/bundle/ruby/3.1.0/gems/rake-13.0.6/lib/rake/late_time.rb new file mode 100644 index 000000000..8fe024943 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/rake-13.0.6/lib/rake/late_time.rb @@ -0,0 +1,18 @@ +# frozen_string_literal: true +module Rake + # LateTime is a fake timestamp that occurs _after_ any other time value. + class LateTime + include Comparable + include Singleton + + def <=>(other) + 1 + end + + def to_s + "" + end + end + + LATE = LateTime.instance +end diff --git a/vendor/bundle/ruby/3.1.0/gems/rake-13.0.6/lib/rake/linked_list.rb b/vendor/bundle/ruby/3.1.0/gems/rake-13.0.6/lib/rake/linked_list.rb new file mode 100644 index 000000000..11fa46f0d --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/rake-13.0.6/lib/rake/linked_list.rb @@ -0,0 +1,112 @@ +# frozen_string_literal: true +module Rake + + # Polylithic linked list structure used to implement several data + # structures in Rake. + class LinkedList + include Enumerable + attr_reader :head, :tail + + # Polymorphically add a new element to the head of a list. The + # type of head node will be the same list type as the tail. + def conj(item) + self.class.cons(item, self) + end + + # Is the list empty? + # .make guards against a list being empty making any instantiated LinkedList + # object not empty by default + # You should consider overriding this method if you implement your own .make method + def empty? + false + end + + # Lists are structurally equivalent. + def ==(other) + current = self + while !current.empty? && !other.empty? + return false if current.head != other.head + current = current.tail + other = other.tail + end + current.empty? && other.empty? + end + + # Convert to string: LL(item, item...) + def to_s + items = map(&:to_s).join(", ") + "LL(#{items})" + end + + # Same as +to_s+, but with inspected items. + def inspect + items = map(&:inspect).join(", ") + "LL(#{items})" + end + + # For each item in the list. + def each + current = self + while !current.empty? + yield(current.head) + current = current.tail + end + self + end + + # Make a list out of the given arguments. This method is + # polymorphic + def self.make(*args) + # return an EmptyLinkedList if there are no arguments + return empty if !args || args.empty? + + # build a LinkedList by starting at the tail and iterating + # through each argument + # inject takes an EmptyLinkedList to start + args.reverse.inject(empty) do |list, item| + list = cons(item, list) + list # return the newly created list for each item in the block + end + end + + # Cons a new head onto the tail list. + def self.cons(head, tail) + new(head, tail) + end + + # The standard empty list class for the given LinkedList class. + def self.empty + self::EMPTY + end + + protected + + def initialize(head, tail=EMPTY) + @head = head + @tail = tail + end + + # Represent an empty list, using the Null Object Pattern. + # + # When inheriting from the LinkedList class, you should implement + # a type specific Empty class as well. Make sure you set the class + # instance variable @parent to the associated list class (this + # allows conj, cons and make to work polymorphically). + class EmptyLinkedList < LinkedList + @parent = LinkedList + + def initialize + end + + def empty? + true + end + + def self.cons(head, tail) + @parent.cons(head, tail) + end + end + + EMPTY = EmptyLinkedList.new + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/rake-13.0.6/lib/rake/loaders/makefile.rb b/vendor/bundle/ruby/3.1.0/gems/rake-13.0.6/lib/rake/loaders/makefile.rb new file mode 100644 index 000000000..46f4beaad --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/rake-13.0.6/lib/rake/loaders/makefile.rb @@ -0,0 +1,54 @@ +# frozen_string_literal: true +module Rake + + # Makefile loader to be used with the import file loader. Use this to + # import dependencies from make dependency tools: + # + # require 'rake/loaders/makefile' + # + # file ".depends.mf" => [SRC_LIST] do |t| + # sh "makedepend -f- -- #{CFLAGS} -- #{t.prerequisites} > #{t.name}" + # end + # + # import ".depends.mf" + # + # See {Importing Dependencies}[link:doc/rakefile_rdoc.html#label-Importing+Dependencies] + # for further details. + + class MakefileLoader + include Rake::DSL + + SPACE_MARK = "\0" # :nodoc: + + # Load the makefile dependencies in +fn+. + def load(fn) # :nodoc: + lines = File.read fn + lines.gsub!(/\\ /, SPACE_MARK) + lines.gsub!(/#[^\n]*\n/m, "") + lines.gsub!(/\\\n/, " ") + lines.each_line do |line| + process_line(line) + end + end + + private + + # Process one logical line of makefile data. + def process_line(line) # :nodoc: + file_tasks, args = line.split(":", 2) + return if args.nil? + dependents = args.split.map { |d| respace(d) } + file_tasks.scan(/\S+/) do |file_task| + file_task = respace(file_task) + file file_task => dependents + end + end + + def respace(str) # :nodoc: + str.tr SPACE_MARK, " " + end + end + + # Install the handler + Rake.application.add_loader("mf", MakefileLoader.new) +end diff --git a/vendor/bundle/ruby/3.1.0/gems/rake-13.0.6/lib/rake/multi_task.rb b/vendor/bundle/ruby/3.1.0/gems/rake-13.0.6/lib/rake/multi_task.rb new file mode 100644 index 000000000..3ae363cbe --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/rake-13.0.6/lib/rake/multi_task.rb @@ -0,0 +1,14 @@ +# frozen_string_literal: true +module Rake + + # Same as a regular task, but the immediate prerequisites are done in + # parallel using Ruby threads. + # + class MultiTask < Task + private + + def invoke_prerequisites(task_args, invocation_chain) # :nodoc: + invoke_prerequisites_concurrently(task_args, invocation_chain) + end + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/rake-13.0.6/lib/rake/name_space.rb b/vendor/bundle/ruby/3.1.0/gems/rake-13.0.6/lib/rake/name_space.rb new file mode 100644 index 000000000..32f8139fc --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/rake-13.0.6/lib/rake/name_space.rb @@ -0,0 +1,38 @@ +# frozen_string_literal: true +## +# The NameSpace class will lookup task names in the scope defined by a +# +namespace+ command. + +class Rake::NameSpace + + ## + # Create a namespace lookup object using the given task manager + # and the list of scopes. + + def initialize(task_manager, scope_list) + @task_manager = task_manager + @scope = scope_list.dup + end + + ## + # Lookup a task named +name+ in the namespace. + + def [](name) + @task_manager.lookup(name, @scope) + end + + ## + # The scope of the namespace (a LinkedList) + + def scope + @scope.dup + end + + ## + # Return the list of tasks defined in this and nested namespaces. + + def tasks + @task_manager.tasks_in_scope(@scope) + end + +end diff --git a/vendor/bundle/ruby/3.1.0/gems/rake-13.0.6/lib/rake/packagetask.rb b/vendor/bundle/ruby/3.1.0/gems/rake-13.0.6/lib/rake/packagetask.rb new file mode 100644 index 000000000..aeff81c29 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/rake-13.0.6/lib/rake/packagetask.rb @@ -0,0 +1,222 @@ +# frozen_string_literal: true +# Define a package task library to aid in the definition of +# redistributable package files. + +require "rake" +require "rake/tasklib" + +module Rake + + # Create a packaging task that will package the project into + # distributable files (e.g zip archive or tar files). + # + # The PackageTask will create the following targets: + # + # +:package+ :: + # Create all the requested package files. + # + # +:clobber_package+ :: + # Delete all the package files. This target is automatically + # added to the main clobber target. + # + # +:repackage+ :: + # Rebuild the package files from scratch, even if they are not out + # of date. + # + # "package_dir/name-version.tgz" :: + # Create a gzipped tar package (if need_tar is true). + # + # "package_dir/name-version.tar.gz" :: + # Create a gzipped tar package (if need_tar_gz is true). + # + # "package_dir/name-version.tar.bz2" :: + # Create a bzip2'd tar package (if need_tar_bz2 is true). + # + # "package_dir/name-version.zip" :: + # Create a zip package archive (if need_zip is true). + # + # Example: + # + # Rake::PackageTask.new("rake", "1.2.3") do |p| + # p.need_tar = true + # p.package_files.include("lib/**/*.rb") + # end + # + class PackageTask < TaskLib + # Name of the package (from the GEM Spec). + attr_accessor :name + + # Version of the package (e.g. '1.3.2'). + attr_accessor :version + + # Directory used to store the package files (default is 'pkg'). + attr_accessor :package_dir + + # True if a gzipped tar file (tgz) should be produced (default is + # false). + attr_accessor :need_tar + + # True if a gzipped tar file (tar.gz) should be produced (default + # is false). + attr_accessor :need_tar_gz + + # True if a bzip2'd tar file (tar.bz2) should be produced (default + # is false). + attr_accessor :need_tar_bz2 + + # True if a xz'd tar file (tar.xz) should be produced (default is false) + attr_accessor :need_tar_xz + + # True if a zip file should be produced (default is false) + attr_accessor :need_zip + + # List of files to be included in the package. + attr_accessor :package_files + + # Tar command for gzipped or bzip2ed archives. The default is 'tar'. + attr_accessor :tar_command + + # Zip command for zipped archives. The default is 'zip'. + attr_accessor :zip_command + + # True if parent directory should be omited (default is false) + attr_accessor :without_parent_dir + + # Create a Package Task with the given name and version. Use +:noversion+ + # as the version to build a package without a version or to provide a + # fully-versioned package name. + + def initialize(name=nil, version=nil) + init(name, version) + yield self if block_given? + define unless name.nil? + end + + # Initialization that bypasses the "yield self" and "define" step. + def init(name, version) + @name = name + @version = version + @package_files = Rake::FileList.new + @package_dir = "pkg" + @need_tar = false + @need_tar_gz = false + @need_tar_bz2 = false + @need_tar_xz = false + @need_zip = false + @tar_command = "tar" + @zip_command = "zip" + @without_parent_dir = false + end + + # Create the tasks defined by this task library. + def define + fail "Version required (or :noversion)" if @version.nil? + @version = nil if :noversion == @version + + desc "Build all the packages" + task :package + + desc "Force a rebuild of the package files" + task repackage: [:clobber_package, :package] + + desc "Remove package products" + task :clobber_package do + rm_r package_dir rescue nil + end + + task clobber: [:clobber_package] + + [ + [need_tar, tgz_file, "z"], + [need_tar_gz, tar_gz_file, "z"], + [need_tar_bz2, tar_bz2_file, "j"], + [need_tar_xz, tar_xz_file, "J"] + ].each do |need, file, flag| + if need + task package: ["#{package_dir}/#{file}"] + file "#{package_dir}/#{file}" => + [package_dir_path] + package_files do + chdir(working_dir) { sh @tar_command, "#{flag}cvf", file, target_dir } + mv "#{package_dir_path}/#{target_dir}", package_dir if without_parent_dir + end + end + end + + if need_zip + task package: ["#{package_dir}/#{zip_file}"] + file "#{package_dir}/#{zip_file}" => + [package_dir_path] + package_files do + chdir(working_dir) { sh @zip_command, "-r", zip_file, target_dir } + mv "#{package_dir_path}/#{zip_file}", package_dir if without_parent_dir + end + end + + directory package_dir_path => @package_files do + @package_files.each do |fn| + f = File.join(package_dir_path, fn) + fdir = File.dirname(f) + mkdir_p(fdir) unless File.exist?(fdir) + if File.directory?(fn) + mkdir_p(f) + else + rm_f f + safe_ln(fn, f) + end + end + end + self + end + + # The name of this package + + def package_name + @version ? "#{@name}-#{@version}" : @name + end + + # The directory this package will be built in + + def package_dir_path + "#{package_dir}/#{package_name}" + end + + # The package name with .tgz added + + def tgz_file + "#{package_name}.tgz" + end + + # The package name with .tar.gz added + + def tar_gz_file + "#{package_name}.tar.gz" + end + + # The package name with .tar.bz2 added + + def tar_bz2_file + "#{package_name}.tar.bz2" + end + + # The package name with .tar.xz added + + def tar_xz_file + "#{package_name}.tar.xz" + end + + # The package name with .zip added + + def zip_file + "#{package_name}.zip" + end + + def working_dir + without_parent_dir ? package_dir_path : package_dir + end + + # target directory relative to working_dir + def target_dir + without_parent_dir ? "." : package_name + end + end + +end diff --git a/vendor/bundle/ruby/3.1.0/gems/rake-13.0.6/lib/rake/phony.rb b/vendor/bundle/ruby/3.1.0/gems/rake-13.0.6/lib/rake/phony.rb new file mode 100644 index 000000000..8caa5de17 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/rake-13.0.6/lib/rake/phony.rb @@ -0,0 +1,16 @@ +# frozen_string_literal: true +# Defines a :phony task that you can use as a dependency. This allows +# file-based tasks to use non-file-based tasks as prerequisites +# without forcing them to rebuild. +# +# See FileTask#out_of_date? and Task#timestamp for more info. + +require "rake" + +task :phony + +Rake::Task[:phony].tap do |task| + def task.timestamp # :nodoc: + Time.at 0 + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/rake-13.0.6/lib/rake/private_reader.rb b/vendor/bundle/ruby/3.1.0/gems/rake-13.0.6/lib/rake/private_reader.rb new file mode 100644 index 000000000..2815ce643 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/rake-13.0.6/lib/rake/private_reader.rb @@ -0,0 +1,21 @@ +# frozen_string_literal: true +module Rake + + # Include PrivateReader to use +private_reader+. + module PrivateReader # :nodoc: all + + def self.included(base) + base.extend(ClassMethods) + end + + module ClassMethods + + # Declare a list of private accessors + def private_reader(*names) + attr_reader(*names) + private(*names) + end + end + + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/rake-13.0.6/lib/rake/promise.rb b/vendor/bundle/ruby/3.1.0/gems/rake-13.0.6/lib/rake/promise.rb new file mode 100644 index 000000000..f45af4f3a --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/rake-13.0.6/lib/rake/promise.rb @@ -0,0 +1,100 @@ +# frozen_string_literal: true +module Rake + + # A Promise object represents a promise to do work (a chore) in the + # future. The promise is created with a block and a list of + # arguments for the block. Calling value will return the value of + # the promised chore. + # + # Used by ThreadPool. + # + class Promise # :nodoc: all + NOT_SET = Object.new.freeze # :nodoc: + + attr_accessor :recorder + + # Create a promise to do the chore specified by the block. + def initialize(args, &block) + @mutex = Mutex.new + @result = NOT_SET + @error = NOT_SET + @args = args + @block = block + end + + # Return the value of this promise. + # + # If the promised chore is not yet complete, then do the work + # synchronously. We will wait. + def value + unless complete? + stat :sleeping_on, item_id: object_id + @mutex.synchronize do + stat :has_lock_on, item_id: object_id + chore + stat :releasing_lock_on, item_id: object_id + end + end + error? ? raise(@error) : @result + end + + # If no one else is working this promise, go ahead and do the chore. + def work + stat :attempting_lock_on, item_id: object_id + if @mutex.try_lock + stat :has_lock_on, item_id: object_id + chore + stat :releasing_lock_on, item_id: object_id + @mutex.unlock + else + stat :bailed_on, item_id: object_id + end + end + + private + + # Perform the chore promised + def chore + if complete? + stat :found_completed, item_id: object_id + return + end + stat :will_execute, item_id: object_id + begin + @result = @block.call(*@args) + rescue Exception => e + @error = e + end + stat :did_execute, item_id: object_id + discard + end + + # Do we have a result for the promise + def result? + !@result.equal?(NOT_SET) + end + + # Did the promise throw an error + def error? + !@error.equal?(NOT_SET) + end + + # Are we done with the promise + def complete? + result? || error? + end + + # free up these items for the GC + def discard + @args = nil + @block = nil + end + + # Record execution statistics if there is a recorder + def stat(*args) + @recorder.call(*args) if @recorder + end + + end + +end diff --git a/vendor/bundle/ruby/3.1.0/gems/rake-13.0.6/lib/rake/pseudo_status.rb b/vendor/bundle/ruby/3.1.0/gems/rake-13.0.6/lib/rake/pseudo_status.rb new file mode 100644 index 000000000..8b3c98949 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/rake-13.0.6/lib/rake/pseudo_status.rb @@ -0,0 +1,30 @@ +# frozen_string_literal: true +module Rake + + ## + # Exit status class for times the system just gives us a nil. + class PseudoStatus # :nodoc: all + attr_reader :exitstatus + + def initialize(code=0) + @exitstatus = code + end + + def to_i + @exitstatus << 8 + end + + def >>(n) + to_i >> n + end + + def stopped? + false + end + + def exited? + true + end + end + +end diff --git a/vendor/bundle/ruby/3.1.0/gems/rake-13.0.6/lib/rake/rake_module.rb b/vendor/bundle/ruby/3.1.0/gems/rake-13.0.6/lib/rake/rake_module.rb new file mode 100644 index 000000000..03c295624 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/rake-13.0.6/lib/rake/rake_module.rb @@ -0,0 +1,67 @@ +# frozen_string_literal: true +require "rake/application" + +module Rake + + class << self + # Current Rake Application + def application + @application ||= Rake::Application.new + end + + # Set the current Rake application object. + def application=(app) + @application = app + end + + def suggested_thread_count # :nodoc: + @cpu_count ||= Rake::CpuCounter.count + @cpu_count + 4 + end + + # Return the original directory where the Rake application was started. + def original_dir + application.original_dir + end + + # Load a rakefile. + def load_rakefile(path) + load(path) + end + + # Add files to the rakelib list + def add_rakelib(*files) + application.options.rakelib ||= [] + application.options.rakelib.concat(files) + end + + # Make +block_application+ the default rake application inside a block so + # you can load rakefiles into a different application. + # + # This is useful when you want to run rake tasks inside a library without + # running rake in a sub-shell. + # + # Example: + # + # Dir.chdir 'other/directory' + # + # other_rake = Rake.with_application do |rake| + # rake.load_rakefile + # end + # + # puts other_rake.tasks + + def with_application(block_application = Rake::Application.new) + orig_application = Rake.application + + Rake.application = block_application + + yield block_application + + block_application + ensure + Rake.application = orig_application + end + end + +end diff --git a/vendor/bundle/ruby/3.1.0/gems/rake-13.0.6/lib/rake/rake_test_loader.rb b/vendor/bundle/ruby/3.1.0/gems/rake-13.0.6/lib/rake/rake_test_loader.rb new file mode 100644 index 000000000..3ecee5d85 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/rake-13.0.6/lib/rake/rake_test_loader.rb @@ -0,0 +1,27 @@ +# frozen_string_literal: true + +require "rake/file_list" + +# Load the test files from the command line. +argv = ARGV.select do |argument| + case argument + when /^-/ then + argument + when /\*/ then + Rake::FileList[argument].to_a.each do |file| + require File.expand_path file + end + + false + else + path = File.expand_path argument + + abort "\nFile does not exist: #{path}\n\n" unless File.exist?(path) + + require path + + false + end +end + +ARGV.replace argv diff --git a/vendor/bundle/ruby/3.1.0/gems/rake-13.0.6/lib/rake/rule_recursion_overflow_error.rb b/vendor/bundle/ruby/3.1.0/gems/rake-13.0.6/lib/rake/rule_recursion_overflow_error.rb new file mode 100644 index 000000000..a51e77489 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/rake-13.0.6/lib/rake/rule_recursion_overflow_error.rb @@ -0,0 +1,20 @@ +# frozen_string_literal: true +module Rake + + # Error indicating a recursion overflow error in task selection. + class RuleRecursionOverflowError < StandardError + def initialize(*args) + super + @targets = [] + end + + def add_target(target) + @targets << target + end + + def message + super + ": [" + @targets.reverse.join(" => ") + "]" + end + end + +end diff --git a/vendor/bundle/ruby/3.1.0/gems/rake-13.0.6/lib/rake/scope.rb b/vendor/bundle/ruby/3.1.0/gems/rake-13.0.6/lib/rake/scope.rb new file mode 100644 index 000000000..fc1eb6c3a --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/rake-13.0.6/lib/rake/scope.rb @@ -0,0 +1,43 @@ +# frozen_string_literal: true +module Rake + class Scope < LinkedList # :nodoc: all + + # Path for the scope. + def path + map(&:to_s).reverse.join(":") + end + + # Path for the scope + the named path. + def path_with_task_name(task_name) + "#{path}:#{task_name}" + end + + # Trim +n+ innermost scope levels from the scope. In no case will + # this trim beyond the toplevel scope. + def trim(n) + result = self + while n > 0 && !result.empty? + result = result.tail + n -= 1 + end + result + end + + # Scope lists always end with an EmptyScope object. See Null + # Object Pattern) + class EmptyScope < EmptyLinkedList + @parent = Scope + + def path + "" + end + + def path_with_task_name(task_name) + task_name + end + end + + # Singleton null object for an empty scope. + EMPTY = EmptyScope.new + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/rake-13.0.6/lib/rake/task.rb b/vendor/bundle/ruby/3.1.0/gems/rake-13.0.6/lib/rake/task.rb new file mode 100644 index 000000000..ec2c756e0 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/rake-13.0.6/lib/rake/task.rb @@ -0,0 +1,434 @@ +# frozen_string_literal: true +require "rake/invocation_exception_mixin" + +module Rake + + ## + # A Task is the basic unit of work in a Rakefile. Tasks have associated + # actions (possibly more than one) and a list of prerequisites. When + # invoked, a task will first ensure that all of its prerequisites have an + # opportunity to run and then it will execute its own actions. + # + # Tasks are not usually created directly using the new method, but rather + # use the +file+ and +task+ convenience methods. + # + class Task + # List of prerequisites for a task. + attr_reader :prerequisites + alias prereqs prerequisites + + # List of order only prerequisites for a task. + attr_reader :order_only_prerequisites + + # List of actions attached to a task. + attr_reader :actions + + # Application owning this task. + attr_accessor :application + + # Array of nested namespaces names used for task lookup by this task. + attr_reader :scope + + # File/Line locations of each of the task definitions for this + # task (only valid if the task was defined with the detect + # location option set). + attr_reader :locations + + # Has this task already been invoked? Already invoked tasks + # will be skipped unless you reenable them. + attr_reader :already_invoked + + # Return task name + def to_s + name + end + + def inspect # :nodoc: + "<#{self.class} #{name} => [#{prerequisites.join(', ')}]>" + end + + # List of sources for task. + attr_writer :sources + def sources + if defined?(@sources) + @sources + else + prerequisites + end + end + + # List of prerequisite tasks + def prerequisite_tasks + (prerequisites + order_only_prerequisites).map { |pre| lookup_prerequisite(pre) } + end + + def lookup_prerequisite(prerequisite_name) # :nodoc: + scoped_prerequisite_task = application[prerequisite_name, @scope] + if scoped_prerequisite_task == self + unscoped_prerequisite_task = application[prerequisite_name] + end + unscoped_prerequisite_task || scoped_prerequisite_task + end + private :lookup_prerequisite + + # List of all unique prerequisite tasks including prerequisite tasks' + # prerequisites. + # Includes self when cyclic dependencies are found. + def all_prerequisite_tasks + seen = {} + collect_prerequisites(seen) + seen.values + end + + def collect_prerequisites(seen) # :nodoc: + prerequisite_tasks.each do |pre| + next if seen[pre.name] + seen[pre.name] = pre + pre.collect_prerequisites(seen) + end + end + protected :collect_prerequisites + + # First source from a rule (nil if no sources) + def source + sources.first + end + + # Create a task named +task_name+ with no actions or prerequisites. Use + # +enhance+ to add actions and prerequisites. + def initialize(task_name, app) + @name = task_name.to_s + @prerequisites = [] + @actions = [] + @already_invoked = false + @comments = [] + @lock = Monitor.new + @application = app + @scope = app.current_scope + @arg_names = nil + @locations = [] + @invocation_exception = nil + @order_only_prerequisites = [] + end + + # Enhance a task with prerequisites or actions. Returns self. + def enhance(deps=nil, &block) + @prerequisites |= deps if deps + @actions << block if block_given? + self + end + + # Name of the task, including any namespace qualifiers. + def name + @name.to_s + end + + # Name of task with argument list description. + def name_with_args # :nodoc: + if arg_description + "#{name}#{arg_description}" + else + name + end + end + + # Argument description (nil if none). + def arg_description # :nodoc: + @arg_names ? "[#{arg_names.join(',')}]" : nil + end + + # Name of arguments for this task. + def arg_names + @arg_names || [] + end + + # Reenable the task, allowing its tasks to be executed if the task + # is invoked again. + def reenable + @already_invoked = false + @invocation_exception = nil + end + + # Clear the existing prerequisites, actions, comments, and arguments of a rake task. + def clear + clear_prerequisites + clear_actions + clear_comments + clear_args + self + end + + # Clear the existing prerequisites of a rake task. + def clear_prerequisites + prerequisites.clear + self + end + + # Clear the existing actions on a rake task. + def clear_actions + actions.clear + self + end + + # Clear the existing comments on a rake task. + def clear_comments + @comments = [] + self + end + + # Clear the existing arguments on a rake task. + def clear_args + @arg_names = nil + self + end + + # Invoke the task if it is needed. Prerequisites are invoked first. + def invoke(*args) + task_args = TaskArguments.new(arg_names, args) + invoke_with_call_chain(task_args, InvocationChain::EMPTY) + end + + # Same as invoke, but explicitly pass a call chain to detect + # circular dependencies. + # + # If multiple tasks depend on this + # one in parallel, they will all fail if the first execution of + # this task fails. + def invoke_with_call_chain(task_args, invocation_chain) + new_chain = Rake::InvocationChain.append(self, invocation_chain) + @lock.synchronize do + begin + if application.options.trace + application.trace "** Invoke #{name} #{format_trace_flags}" + end + + if @already_invoked + if @invocation_exception + if application.options.trace + application.trace "** Previous invocation of #{name} failed #{format_trace_flags}" + end + raise @invocation_exception + else + return + end + end + + @already_invoked = true + + invoke_prerequisites(task_args, new_chain) + execute(task_args) if needed? + rescue Exception => ex + add_chain_to(ex, new_chain) + @invocation_exception = ex + raise ex + end + end + end + protected :invoke_with_call_chain + + def add_chain_to(exception, new_chain) # :nodoc: + exception.extend(InvocationExceptionMixin) unless + exception.respond_to?(:chain) + exception.chain = new_chain if exception.chain.nil? + end + private :add_chain_to + + # Invoke all the prerequisites of a task. + def invoke_prerequisites(task_args, invocation_chain) # :nodoc: + if application.options.always_multitask + invoke_prerequisites_concurrently(task_args, invocation_chain) + else + prerequisite_tasks.each { |p| + prereq_args = task_args.new_scope(p.arg_names) + p.invoke_with_call_chain(prereq_args, invocation_chain) + } + end + end + + # Invoke all the prerequisites of a task in parallel. + def invoke_prerequisites_concurrently(task_args, invocation_chain)# :nodoc: + futures = prerequisite_tasks.map do |p| + prereq_args = task_args.new_scope(p.arg_names) + application.thread_pool.future(p) do |r| + r.invoke_with_call_chain(prereq_args, invocation_chain) + end + end + # Iterate in reverse to improve performance related to thread waiting and switching + futures.reverse_each(&:value) + end + + # Format the trace flags for display. + def format_trace_flags + flags = [] + flags << "first_time" unless @already_invoked + flags << "not_needed" unless needed? + flags.empty? ? "" : "(" + flags.join(", ") + ")" + end + private :format_trace_flags + + # Execute the actions associated with this task. + def execute(args=nil) + args ||= EMPTY_TASK_ARGS + if application.options.dryrun + application.trace "** Execute (dry run) #{name}" + return + end + application.trace "** Execute #{name}" if application.options.trace + application.enhance_with_matching_rule(name) if @actions.empty? + if opts = Hash.try_convert(args) and !opts.empty? + @actions.each { |act| act.call(self, args, **opts)} + else + @actions.each { |act| act.call(self, args)} + end + end + + # Is this task needed? + def needed? + true + end + + # Timestamp for this task. Basic tasks return the current time for their + # time stamp. Other tasks can be more sophisticated. + def timestamp + Time.now + end + + # Add a description to the task. The description can consist of an option + # argument list (enclosed brackets) and an optional comment. + def add_description(description) + return unless description + comment = description.strip + add_comment(comment) if comment && !comment.empty? + end + + def comment=(comment) # :nodoc: + add_comment(comment) + end + + def add_comment(comment) # :nodoc: + return if comment.nil? + @comments << comment unless @comments.include?(comment) + end + private :add_comment + + # Full collection of comments. Multiple comments are separated by + # newlines. + def full_comment + transform_comments("\n") + end + + # First line (or sentence) of all comments. Multiple comments are + # separated by a "/". + def comment + transform_comments(" / ") { |c| first_sentence(c) } + end + + # Transform the list of comments as specified by the block and + # join with the separator. + def transform_comments(separator, &block) + if @comments.empty? + nil + else + block ||= lambda { |c| c } + @comments.map(&block).join(separator) + end + end + private :transform_comments + + # Get the first sentence in a string. The sentence is terminated + # by the first period, exclamation mark, or the end of the line. + # Decimal points do not count as periods. + def first_sentence(string) + string.split(/(?<=\w)(\.|!)[ \t]|(\.$|!)|\n/).first + end + private :first_sentence + + # Set the names of the arguments for this task. +args+ should be + # an array of symbols, one for each argument name. + def set_arg_names(args) + @arg_names = args.map(&:to_sym) + end + + # Return a string describing the internal state of a task. Useful for + # debugging. + def investigation + result = "------------------------------\n".dup + result << "Investigating #{name}\n" + result << "class: #{self.class}\n" + result << "task needed: #{needed?}\n" + result << "timestamp: #{timestamp}\n" + result << "pre-requisites: \n" + prereqs = prerequisite_tasks + prereqs.sort! { |a, b| a.timestamp <=> b.timestamp } + prereqs.each do |p| + result << "--#{p.name} (#{p.timestamp})\n" + end + latest_prereq = prerequisite_tasks.map(&:timestamp).max + result << "latest-prerequisite time: #{latest_prereq}\n" + result << "................................\n\n" + return result + end + + # Format dependencies parameter to pass to task. + def self.format_deps(deps) + deps = [deps] unless deps.respond_to?(:to_ary) + deps.map { |d| Rake.from_pathname(d).to_s } + end + + # Add order only dependencies. + def |(deps) + @order_only_prerequisites |= Task.format_deps(deps) - @prerequisites + self + end + + # ---------------------------------------------------------------- + # Rake Module Methods + # + class << self + + # Clear the task list. This cause rake to immediately forget all the + # tasks that have been assigned. (Normally used in the unit tests.) + def clear + Rake.application.clear + end + + # List of all defined tasks. + def tasks + Rake.application.tasks + end + + # Return a task with the given name. If the task is not currently + # known, try to synthesize one from the defined rules. If no rules are + # found, but an existing file matches the task name, assume it is a file + # task with no dependencies or actions. + def [](task_name) + Rake.application[task_name] + end + + # TRUE if the task name is already defined. + def task_defined?(task_name) + Rake.application.lookup(task_name) != nil + end + + # Define a task given +args+ and an option block. If a rule with the + # given name already exists, the prerequisites and actions are added to + # the existing task. Returns the defined task. + def define_task(*args, &block) + Rake.application.define_task(self, *args, &block) + end + + # Define a rule for synthesizing tasks. + def create_rule(*args, &block) + Rake.application.create_rule(*args, &block) + end + + # Apply the scope to the task name according to the rules for + # this kind of task. Generic tasks will accept the scope as + # part of the name. + def scope_name(scope, task_name) + scope.path_with_task_name(task_name) + end + + end # class << Rake::Task + end # class Rake::Task +end diff --git a/vendor/bundle/ruby/3.1.0/gems/rake-13.0.6/lib/rake/task_argument_error.rb b/vendor/bundle/ruby/3.1.0/gems/rake-13.0.6/lib/rake/task_argument_error.rb new file mode 100644 index 000000000..ef20076c6 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/rake-13.0.6/lib/rake/task_argument_error.rb @@ -0,0 +1,8 @@ +# frozen_string_literal: true +module Rake + + # Error indicating an ill-formed task declaration. + class TaskArgumentError < ArgumentError + end + +end diff --git a/vendor/bundle/ruby/3.1.0/gems/rake-13.0.6/lib/rake/task_arguments.rb b/vendor/bundle/ruby/3.1.0/gems/rake-13.0.6/lib/rake/task_arguments.rb new file mode 100644 index 000000000..0d3001afd --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/rake-13.0.6/lib/rake/task_arguments.rb @@ -0,0 +1,109 @@ +# frozen_string_literal: true +module Rake + + ## + # TaskArguments manage the arguments passed to a task. + # + class TaskArguments + include Enumerable + + # Argument names + attr_reader :names + + # Create a TaskArgument object with a list of argument +names+ and a set + # of associated +values+. +parent+ is the parent argument object. + def initialize(names, values, parent=nil) + @names = names + @parent = parent + @hash = {} + @values = values + names.each_with_index { |name, i| + next if values[i].nil? || values[i] == "" + @hash[name.to_sym] = values[i] + } + end + + # Retrieve the complete array of sequential values + def to_a + @values.dup + end + + # Retrieve the list of values not associated with named arguments + def extras + @values[@names.length..-1] || [] + end + + # Create a new argument scope using the prerequisite argument + # names. + def new_scope(names) + values = names.map { |n| self[n] } + self.class.new(names, values + extras, self) + end + + # Find an argument value by name or index. + def [](index) + lookup(index.to_sym) + end + + # Specify a hash of default values for task arguments. Use the + # defaults only if there is no specific value for the given + # argument. + def with_defaults(defaults) + @hash = defaults.merge(@hash) + end + + # Enumerates the arguments and their values + def each(&block) + @hash.each(&block) + end + + # Extracts the argument values at +keys+ + def values_at(*keys) + keys.map { |k| lookup(k) } + end + + # Returns the value of the given argument via method_missing + def method_missing(sym, *args) + lookup(sym.to_sym) + end + + # Returns a Hash of arguments and their values + def to_hash + @hash.dup + end + + def to_s # :nodoc: + inspect + end + + def inspect # :nodoc: + inspection = @hash.map do |k,v| + "#{k.to_s}: #{v.to_s}" + end.join(", ") + + "#<#{self.class} #{inspection}>" + end + + # Returns true if +key+ is one of the arguments + def has_key?(key) + @hash.has_key?(key) + end + alias key? has_key? + + def fetch(*args, &block) + @hash.fetch(*args, &block) + end + + protected + + def lookup(name) # :nodoc: + if @hash.has_key?(name) + @hash[name] + elsif @parent + @parent.lookup(name) + end + end + end + + EMPTY_TASK_ARGS = TaskArguments.new([], []) # :nodoc: +end diff --git a/vendor/bundle/ruby/3.1.0/gems/rake-13.0.6/lib/rake/task_manager.rb b/vendor/bundle/ruby/3.1.0/gems/rake-13.0.6/lib/rake/task_manager.rb new file mode 100644 index 000000000..0db5c241e --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/rake-13.0.6/lib/rake/task_manager.rb @@ -0,0 +1,331 @@ +# frozen_string_literal: true +module Rake + + # The TaskManager module is a mixin for managing tasks. + module TaskManager + # Track the last comment made in the Rakefile. + attr_accessor :last_description + + def initialize # :nodoc: + super + @tasks = Hash.new + @rules = Array.new + @scope = Scope.make + @last_description = nil + end + + def create_rule(*args, &block) # :nodoc: + pattern, args, deps, order_only = resolve_args(args) + pattern = Regexp.new(Regexp.quote(pattern) + "$") if String === pattern + @rules << [pattern, args, deps, order_only, block] + end + + def define_task(task_class, *args, &block) # :nodoc: + task_name, arg_names, deps, order_only = resolve_args(args) + + original_scope = @scope + if String === task_name and + not task_class.ancestors.include? Rake::FileTask + task_name, *definition_scope = *(task_name.split(":").reverse) + @scope = Scope.make(*(definition_scope + @scope.to_a)) + end + + task_name = task_class.scope_name(@scope, task_name) + task = intern(task_class, task_name) + task.set_arg_names(arg_names) unless arg_names.empty? + if Rake::TaskManager.record_task_metadata + add_location(task) + task.add_description(get_description(task)) + end + task.enhance(Task.format_deps(deps), &block) + task | order_only unless order_only.nil? + task + ensure + @scope = original_scope + end + + # Lookup a task. Return an existing task if found, otherwise + # create a task of the current type. + def intern(task_class, task_name) + @tasks[task_name.to_s] ||= task_class.new(task_name, self) + end + + # Find a matching task for +task_name+. + def [](task_name, scopes=nil) + task_name = task_name.to_s + self.lookup(task_name, scopes) or + enhance_with_matching_rule(task_name) or + synthesize_file_task(task_name) or + fail generate_message_for_undefined_task(task_name) + end + + def generate_message_for_undefined_task(task_name) + message = "Don't know how to build task '#{task_name}' "\ + "(See the list of available tasks with `#{Rake.application.name} --tasks`)" + message + generate_did_you_mean_suggestions(task_name) + end + + def generate_did_you_mean_suggestions(task_name) + return "" unless defined?(::DidYouMean::SpellChecker) + + suggestions = ::DidYouMean::SpellChecker.new(dictionary: @tasks.keys).correct(task_name.to_s) + if ::DidYouMean.respond_to?(:formatter)# did_you_mean v1.2.0 or later + ::DidYouMean.formatter.message_for(suggestions) + elsif defined?(::DidYouMean::Formatter) # before did_you_mean v1.2.0 + ::DidYouMean::Formatter.new(suggestions).to_s + else + "" + end + end + + def synthesize_file_task(task_name) # :nodoc: + return nil unless File.exist?(task_name) + define_task(Rake::FileTask, task_name) + end + + # Resolve the arguments for a task/rule. Returns a tuple of + # [task_name, arg_name_list, prerequisites, order_only_prerequisites]. + def resolve_args(args) + if args.last.is_a?(Hash) + deps = args.pop + resolve_args_with_dependencies(args, deps) + else + resolve_args_without_dependencies(args) + end + end + + # Resolve task arguments for a task or rule when there are no + # dependencies declared. + # + # The patterns recognized by this argument resolving function are: + # + # task :t + # task :t, [:a] + # + def resolve_args_without_dependencies(args) + task_name = args.shift + if args.size == 1 && args.first.respond_to?(:to_ary) + arg_names = args.first.to_ary + else + arg_names = args + end + [task_name, arg_names, [], nil] + end + private :resolve_args_without_dependencies + + # Resolve task arguments for a task or rule when there are + # dependencies declared. + # + # The patterns recognized by this argument resolving function are: + # + # task :t, order_only: [:e] + # task :t => [:d] + # task :t => [:d], order_only: [:e] + # task :t, [a] => [:d] + # task :t, [a] => [:d], order_only: [:e] + # + def resolve_args_with_dependencies(args, hash) # :nodoc: + fail "Task Argument Error" if + hash.size != 1 && + (hash.size != 2 || !hash.key?(:order_only)) + order_only = hash.delete(:order_only) + key, value = hash.map { |k, v| [k, v] }.first + if args.empty? + task_name = key + arg_names = [] + deps = value || [] + else + task_name = args.shift + arg_names = key || args.shift|| [] + deps = value || [] + end + deps = [deps] unless deps.respond_to?(:to_ary) + [task_name, arg_names, deps, order_only] + end + private :resolve_args_with_dependencies + + # If a rule can be found that matches the task name, enhance the + # task with the prerequisites and actions from the rule. Set the + # source attribute of the task appropriately for the rule. Return + # the enhanced task or nil of no rule was found. + def enhance_with_matching_rule(task_name, level=0) + fail Rake::RuleRecursionOverflowError, + "Rule Recursion Too Deep" if level >= 16 + @rules.each do |pattern, args, extensions, order_only, block| + if pattern && pattern.match(task_name) + task = attempt_rule(task_name, pattern, args, extensions, block, level) + task | order_only unless order_only.nil? + return task if task + end + end + nil + rescue Rake::RuleRecursionOverflowError => ex + ex.add_target(task_name) + fail ex + end + + # List of all defined tasks in this application. + def tasks + @tasks.values.sort_by { |t| t.name } + end + + # List of all the tasks defined in the given scope (and its + # sub-scopes). + def tasks_in_scope(scope) + prefix = scope.path + tasks.select { |t| + /^#{prefix}:/ =~ t.name + } + end + + # Clear all tasks in this application. + def clear + @tasks.clear + @rules.clear + end + + # Lookup a task, using scope and the scope hints in the task name. + # This method performs straight lookups without trying to + # synthesize file tasks or rules. Special scope names (e.g. '^') + # are recognized. If no scope argument is supplied, use the + # current scope. Return nil if the task cannot be found. + def lookup(task_name, initial_scope=nil) + initial_scope ||= @scope + task_name = task_name.to_s + if task_name =~ /^rake:/ + scopes = Scope.make + task_name = task_name.sub(/^rake:/, "") + elsif task_name =~ /^(\^+)/ + scopes = initial_scope.trim($1.size) + task_name = task_name.sub(/^(\^+)/, "") + else + scopes = initial_scope + end + lookup_in_scope(task_name, scopes) + end + + # Lookup the task name + def lookup_in_scope(name, scope) + loop do + tn = scope.path_with_task_name(name) + task = @tasks[tn] + return task if task + break if scope.empty? + scope = scope.tail + end + nil + end + private :lookup_in_scope + + # Return the list of scope names currently active in the task + # manager. + def current_scope + @scope + end + + # Evaluate the block in a nested namespace named +name+. Create + # an anonymous namespace if +name+ is nil. + def in_namespace(name) + name ||= generate_name + @scope = Scope.new(name, @scope) + ns = NameSpace.new(self, @scope) + yield(ns) + ns + ensure + @scope = @scope.tail + end + + private + + # Add a location to the locations field of the given task. + def add_location(task) + loc = find_location + task.locations << loc if loc + task + end + + # Find the location that called into the dsl layer. + def find_location + locations = caller + i = 0 + while locations[i] + return locations[i + 1] if locations[i] =~ /rake\/dsl_definition.rb/ + i += 1 + end + nil + end + + # Generate an anonymous namespace name. + def generate_name + @seed ||= 0 + @seed += 1 + "_anon_#{@seed}" + end + + def trace_rule(level, message) # :nodoc: + options.trace_output.puts "#{" " * level}#{message}" if + Rake.application.options.trace_rules + end + + # Attempt to create a rule given the list of prerequisites. + def attempt_rule(task_name, task_pattern, args, extensions, block, level) + sources = make_sources(task_name, task_pattern, extensions) + prereqs = sources.map { |source| + trace_rule level, "Attempting Rule #{task_name} => #{source}" + if File.exist?(source) || Rake::Task.task_defined?(source) + trace_rule level, "(#{task_name} => #{source} ... EXIST)" + source + elsif parent = enhance_with_matching_rule(source, level + 1) + trace_rule level, "(#{task_name} => #{source} ... ENHANCE)" + parent.name + else + trace_rule level, "(#{task_name} => #{source} ... FAIL)" + return nil + end + } + task = FileTask.define_task(task_name, { args => prereqs }, &block) + task.sources = prereqs + task + end + + # Make a list of sources from the list of file name extensions / + # translation procs. + def make_sources(task_name, task_pattern, extensions) + result = extensions.map { |ext| + case ext + when /%/ + task_name.pathmap(ext) + when %r{/} + ext + when /^\./ + source = task_name.sub(task_pattern, ext) + source == ext ? task_name.ext(ext) : source + when String, Symbol + ext.to_s + when Proc, Method + if ext.arity == 1 + ext.call(task_name) + else + ext.call + end + else + fail "Don't know how to handle rule dependent: #{ext.inspect}" + end + } + result.flatten + end + + # Return the current description, clearing it in the process. + def get_description(task) + desc = @last_description + @last_description = nil + desc + end + + class << self + attr_accessor :record_task_metadata # :nodoc: + TaskManager.record_task_metadata = false + end + end + +end diff --git a/vendor/bundle/ruby/3.1.0/gems/rake-13.0.6/lib/rake/tasklib.rb b/vendor/bundle/ruby/3.1.0/gems/rake-13.0.6/lib/rake/tasklib.rb new file mode 100644 index 000000000..5354b4f94 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/rake-13.0.6/lib/rake/tasklib.rb @@ -0,0 +1,12 @@ +# frozen_string_literal: true +require "rake" + +module Rake + + # Base class for Task Libraries. + class TaskLib + include Cloneable + include Rake::DSL + end + +end diff --git a/vendor/bundle/ruby/3.1.0/gems/rake-13.0.6/lib/rake/testtask.rb b/vendor/bundle/ruby/3.1.0/gems/rake-13.0.6/lib/rake/testtask.rb new file mode 100644 index 000000000..56521d23d --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/rake-13.0.6/lib/rake/testtask.rb @@ -0,0 +1,189 @@ +# frozen_string_literal: true +require "rake" +require "rake/tasklib" + +module Rake + + # Create a task that runs a set of tests. + # + # Example: + # require "rake/testtask" + # + # Rake::TestTask.new do |t| + # t.libs << "test" + # t.test_files = FileList['test/test*.rb'] + # t.verbose = true + # end + # + # If rake is invoked with a "TEST=filename" command line option, + # then the list of test files will be overridden to include only the + # filename specified on the command line. This provides an easy way + # to run just one test. + # + # If rake is invoked with a "TESTOPTS=options" command line option, + # then the given options are passed to the test process after a + # '--'. This allows Test::Unit options to be passed to the test + # suite. + # + # Examples: + # + # rake test # run tests normally + # rake test TEST=just_one_file.rb # run just one test file. + # rake test TESTOPTS="-v" # run in verbose mode + # rake test TESTOPTS="--runner=fox" # use the fox test runner + # + class TestTask < TaskLib + + # Name of test task. (default is :test) + attr_accessor :name + + # List of directories added to $LOAD_PATH before running the + # tests. (default is 'lib') + attr_accessor :libs + + # True if verbose test output desired. (default is false) + attr_accessor :verbose + + # Test options passed to the test suite. An explicit + # TESTOPTS=opts on the command line will override this. (default + # is NONE) + attr_accessor :options + + # Request that the tests be run with the warning flag set. + # E.g. warning=true implies "ruby -w" used to run the tests. + # (default is true) + attr_accessor :warning + + # Glob pattern to match test files. (default is 'test/test*.rb') + attr_accessor :pattern + + # Style of test loader to use. Options are: + # + # * :rake -- Rake provided test loading script (default). + # * :testrb -- Ruby provided test loading script. + # * :direct -- Load tests using command line loader. + # + attr_accessor :loader + + # Array of command line options to pass to ruby when running test loader. + attr_accessor :ruby_opts + + # Description of the test task. (default is 'Run tests') + attr_accessor :description + + # Task prerequisites. + attr_accessor :deps + + # Explicitly define the list of test files to be included in a + # test. +list+ is expected to be an array of file names (a + # FileList is acceptable). If both +pattern+ and +test_files+ are + # used, then the list of test files is the union of the two. + def test_files=(list) + @test_files = list + end + + # Create a testing task. + def initialize(name=:test) + @name = name + @libs = ["lib"] + @pattern = nil + @options = nil + @test_files = nil + @verbose = false + @warning = true + @loader = :rake + @ruby_opts = [] + @description = "Run tests" + (@name == :test ? "" : " for #{@name}") + @deps = [] + if @name.is_a?(Hash) + @deps = @name.values.first + @name = @name.keys.first + end + yield self if block_given? + @pattern = "test/test*.rb" if @pattern.nil? && @test_files.nil? + define + end + + # Create the tasks defined by this task lib. + def define + desc @description + task @name => Array(deps) do + FileUtilsExt.verbose(@verbose) do + puts "Use TESTOPTS=\"--verbose\" to pass --verbose" \ + ", etc. to runners." if ARGV.include? "--verbose" + args = + "#{ruby_opts_string} #{run_code} " + + "#{file_list_string} #{option_list}" + ruby args do |ok, status| + if !ok && status.respond_to?(:signaled?) && status.signaled? + raise SignalException.new(status.termsig) + elsif !ok + status = "Command failed with status (#{status.exitstatus})" + details = ": [ruby #{args}]" + message = + if Rake.application.options.trace or @verbose + status + details + else + status + end + + fail message + end + end + end + end + self + end + + def option_list # :nodoc: + (ENV["TESTOPTS"] || + ENV["TESTOPT"] || + ENV["TEST_OPTS"] || + ENV["TEST_OPT"] || + @options || + "") + end + + def ruby_opts_string # :nodoc: + opts = @ruby_opts.dup + opts.unshift("-I\"#{lib_path}\"") unless @libs.empty? + opts.unshift("-w") if @warning + opts.join(" ") + end + + def lib_path # :nodoc: + @libs.join(File::PATH_SEPARATOR) + end + + def file_list_string # :nodoc: + file_list.map { |fn| "\"#{fn}\"" }.join(" ") + end + + def file_list # :nodoc: + if ENV["TEST"] + FileList[ENV["TEST"]] + else + result = [] + result += @test_files.to_a if @test_files + result += FileList[@pattern].to_a if @pattern + result + end + end + + def ruby_version # :nodoc: + RUBY_VERSION + end + + def run_code # :nodoc: + case @loader + when :direct + "-e \"ARGV.each{|f| require f}\"" + when :testrb + "-S testrb" + when :rake + "#{__dir__}/rake_test_loader.rb" + end + end + + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/rake-13.0.6/lib/rake/thread_history_display.rb b/vendor/bundle/ruby/3.1.0/gems/rake-13.0.6/lib/rake/thread_history_display.rb new file mode 100644 index 000000000..412ea37be --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/rake-13.0.6/lib/rake/thread_history_display.rb @@ -0,0 +1,49 @@ +# frozen_string_literal: true +require "rake/private_reader" + +module Rake + + class ThreadHistoryDisplay # :nodoc: all + include Rake::PrivateReader + + private_reader :stats, :items, :threads + + def initialize(stats) + @stats = stats + @items = { _seq_: 1 } + @threads = { _seq_: "A" } + end + + def show + puts "Job History:" + stats.each do |stat| + stat[:data] ||= {} + rename(stat, :thread, threads) + rename(stat[:data], :item_id, items) + rename(stat[:data], :new_thread, threads) + rename(stat[:data], :deleted_thread, threads) + printf("%8d %2s %-20s %s\n", + (stat[:time] * 1_000_000).round, + stat[:thread], + stat[:event], + stat[:data].map do |k, v| "#{k}:#{v}" end.join(" ")) + end + end + + private + + def rename(hash, key, renames) + if hash && hash[key] + original = hash[key] + value = renames[original] + unless value + value = renames[:_seq_] + renames[:_seq_] = renames[:_seq_].succ + renames[original] = value + end + hash[key] = value + end + end + end + +end diff --git a/vendor/bundle/ruby/3.1.0/gems/rake-13.0.6/lib/rake/thread_pool.rb b/vendor/bundle/ruby/3.1.0/gems/rake-13.0.6/lib/rake/thread_pool.rb new file mode 100644 index 000000000..332956670 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/rake-13.0.6/lib/rake/thread_pool.rb @@ -0,0 +1,163 @@ +# frozen_string_literal: true + +require "rake/promise" + +module Rake + + class ThreadPool # :nodoc: all + + # Creates a ThreadPool object. The +thread_count+ parameter is the size + # of the pool. + def initialize(thread_count) + require "set" + @max_active_threads = [thread_count, 0].max + @threads = Set.new + @threads_mon = Monitor.new + @queue = Queue.new + @join_cond = @threads_mon.new_cond + + @history_start_time = nil + @history = [] + @history_mon = Monitor.new + @total_threads_in_play = 0 + end + + # Creates a future executed by the +ThreadPool+. + # + # The args are passed to the block when executing (similarly to + # Thread#new) The return value is an object representing + # a future which has been created and added to the queue in the + # pool. Sending #value to the object will sleep the + # current thread until the future is finished and will return the + # result (or raise an exception thrown from the future) + def future(*args, &block) + promise = Promise.new(args, &block) + promise.recorder = lambda { |*stats| stat(*stats) } + + @queue.enq promise + stat :queued, item_id: promise.object_id + start_thread + promise + end + + # Waits until the queue of futures is empty and all threads have exited. + def join + @threads_mon.synchronize do + begin + stat :joining + @join_cond.wait unless @threads.empty? + stat :joined + rescue Exception => e + stat :joined + $stderr.puts e + $stderr.print "Queue contains #{@queue.size} items. " + + "Thread pool contains #{@threads.count} threads\n" + $stderr.print "Current Thread #{Thread.current} status = " + + "#{Thread.current.status}\n" + $stderr.puts e.backtrace.join("\n") + @threads.each do |t| + $stderr.print "Thread #{t} status = #{t.status}\n" + $stderr.puts t.backtrace.join("\n") + end + raise e + end + end + end + + # Enable the gathering of history events. + def gather_history #:nodoc: + @history_start_time = Time.now if @history_start_time.nil? + end + + # Return a array of history events for the thread pool. + # + # History gathering must be enabled to be able to see the events + # (see #gather_history). Best to call this when the job is + # complete (i.e. after ThreadPool#join is called). + def history # :nodoc: + @history_mon.synchronize { @history.dup }. + sort_by { |i| i[:time] }. + each { |i| i[:time] -= @history_start_time } + end + + # Return a hash of always collected statistics for the thread pool. + def statistics # :nodoc: + { + total_threads_in_play: @total_threads_in_play, + max_active_threads: @max_active_threads, + } + end + + private + + # processes one item on the queue. Returns true if there was an + # item to process, false if there was no item + def process_queue_item #:nodoc: + return false if @queue.empty? + + # Even though we just asked if the queue was empty, it + # still could have had an item which by this statement + # is now gone. For this reason we pass true to Queue#deq + # because we will sleep indefinitely if it is empty. + promise = @queue.deq(true) + stat :dequeued, item_id: promise.object_id + promise.work + return true + + rescue ThreadError # this means the queue is empty + false + end + + def safe_thread_count + @threads_mon.synchronize do + @threads.count + end + end + + def start_thread # :nodoc: + @threads_mon.synchronize do + next unless @threads.count < @max_active_threads + + t = Thread.new do + begin + while safe_thread_count <= @max_active_threads + break unless process_queue_item + end + ensure + @threads_mon.synchronize do + @threads.delete Thread.current + stat :ended, thread_count: @threads.count + @join_cond.broadcast if @threads.empty? + end + end + end + + @threads << t + stat( + :spawned, + new_thread: t.object_id, + thread_count: @threads.count) + @total_threads_in_play = @threads.count if + @threads.count > @total_threads_in_play + end + end + + def stat(event, data=nil) # :nodoc: + return if @history_start_time.nil? + info = { + event: event, + data: data, + time: Time.now, + thread: Thread.current.object_id, + } + @history_mon.synchronize { @history << info } + end + + # for testing only + + def __queue__ # :nodoc: + @queue + end + end + +end diff --git a/vendor/bundle/ruby/3.1.0/gems/rake-13.0.6/lib/rake/trace_output.rb b/vendor/bundle/ruby/3.1.0/gems/rake-13.0.6/lib/rake/trace_output.rb new file mode 100644 index 000000000..d713a0926 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/rake-13.0.6/lib/rake/trace_output.rb @@ -0,0 +1,23 @@ +# frozen_string_literal: true +module Rake + module TraceOutput # :nodoc: all + + # Write trace output to output stream +out+. + # + # The write is done as a single IO call (to print) to lessen the + # chance that the trace output is interrupted by other tasks also + # producing output. + def trace_on(out, *strings) + sep = $\ || "\n" + if strings.empty? + output = sep + else + output = strings.map { |s| + next if s.nil? + s.end_with?(sep) ? s : s + sep + }.join + end + out.print(output) + end + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/rake-13.0.6/lib/rake/version.rb b/vendor/bundle/ruby/3.1.0/gems/rake-13.0.6/lib/rake/version.rb new file mode 100644 index 000000000..a0bd095c1 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/rake-13.0.6/lib/rake/version.rb @@ -0,0 +1,10 @@ +# frozen_string_literal: true +module Rake + VERSION = "13.0.6" + + module Version # :nodoc: all + MAJOR, MINOR, BUILD, *OTHER = Rake::VERSION.split "." + + NUMBERS = [MAJOR, MINOR, BUILD, *OTHER] + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/rake-13.0.6/lib/rake/win32.rb b/vendor/bundle/ruby/3.1.0/gems/rake-13.0.6/lib/rake/win32.rb new file mode 100644 index 000000000..6e6203181 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/rake-13.0.6/lib/rake/win32.rb @@ -0,0 +1,51 @@ +# frozen_string_literal: true +require "rbconfig" + +module Rake + # Win 32 interface methods for Rake. Windows specific functionality + # will be placed here to collect that knowledge in one spot. + module Win32 # :nodoc: all + + # Error indicating a problem in locating the home directory on a + # Win32 system. + class Win32HomeError < RuntimeError + end + + class << self + # True if running on a windows system. + def windows? + RbConfig::CONFIG["host_os"] =~ %r!(msdos|mswin|djgpp|mingw|[Ww]indows)! + end + + # The standard directory containing system wide rake files on + # Win 32 systems. Try the following environment variables (in + # order): + # + # * HOME + # * HOMEDRIVE + HOMEPATH + # * APPDATA + # * USERPROFILE + # + # If the above are not defined, the return nil. + def win32_system_dir #:nodoc: + win32_shared_path = ENV["HOME"] + if win32_shared_path.nil? && ENV["HOMEDRIVE"] && ENV["HOMEPATH"] + win32_shared_path = ENV["HOMEDRIVE"] + ENV["HOMEPATH"] + end + + win32_shared_path ||= ENV["APPDATA"] + win32_shared_path ||= ENV["USERPROFILE"] + raise Win32HomeError, + "Unable to determine home path environment variable." if + win32_shared_path.nil? or win32_shared_path.empty? + normalize(File.join(win32_shared_path, "Rake")) + end + + # Normalize a win32 path so that the slashes are all forward slashes. + def normalize(path) + path.gsub(/\\/, "/") + end + + end + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/rake-13.0.6/rake.gemspec b/vendor/bundle/ruby/3.1.0/gems/rake-13.0.6/rake.gemspec new file mode 100644 index 000000000..20a1db423 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/rake-13.0.6/rake.gemspec @@ -0,0 +1,100 @@ +# frozen_string_literal: true +require_relative 'lib/rake/version' + +Gem::Specification.new do |s| + s.name = "rake".freeze + s.version = Rake::VERSION + s.authors = ["Hiroshi SHIBATA".freeze, "Eric Hodel".freeze, "Jim Weirich".freeze] + s.email = ["hsbt@ruby-lang.org".freeze, "drbrain@segment7.net".freeze, "".freeze] + + s.summary = "Rake is a Make-like program implemented in Ruby".freeze + s.description = <<-DESCRIPTION +Rake is a Make-like program implemented in Ruby. Tasks and dependencies are +specified in standard Ruby syntax. +Rake has the following features: + * Rakefiles (rake's version of Makefiles) are completely defined in standard Ruby syntax. + No XML files to edit. No quirky Makefile syntax to worry about (is that a tab or a space?) + * Users can specify tasks with prerequisites. + * Rake supports rule patterns to synthesize implicit tasks. + * Flexible FileLists that act like arrays but know about manipulating file names and paths. + * Supports parallel execution of tasks. + DESCRIPTION + s.homepage = "https://github.com/ruby/rake".freeze + s.licenses = ["MIT".freeze] + + s.metadata = { + "bug_tracker_uri" => "https://github.com/ruby/rake/issues", + "changelog_uri" => "https://github.com/ruby/rake/blob/v#{s.version}/History.rdoc", + "documentation_uri" => "https://ruby.github.io/rake", + "source_code_uri" => "https://github.com/ruby/rake/tree/v#{s.version}", + } + + s.files = [ + "History.rdoc", + "MIT-LICENSE", + "README.rdoc", + "doc/command_line_usage.rdoc", + "doc/example/Rakefile1", + "doc/example/Rakefile2", + "doc/example/a.c", + "doc/example/b.c", + "doc/example/main.c", + "doc/glossary.rdoc", + "doc/jamis.rb", + "doc/proto_rake.rdoc", + "doc/rake.1", + "doc/rakefile.rdoc", + "doc/rational.rdoc", + "exe/rake", + "lib/rake.rb", + "lib/rake/application.rb", + "lib/rake/backtrace.rb", + "lib/rake/clean.rb", + "lib/rake/cloneable.rb", + "lib/rake/cpu_counter.rb", + "lib/rake/default_loader.rb", + "lib/rake/dsl_definition.rb", + "lib/rake/early_time.rb", + "lib/rake/ext/core.rb", + "lib/rake/ext/string.rb", + "lib/rake/file_creation_task.rb", + "lib/rake/file_list.rb", + "lib/rake/file_task.rb", + "lib/rake/file_utils.rb", + "lib/rake/file_utils_ext.rb", + "lib/rake/invocation_chain.rb", + "lib/rake/invocation_exception_mixin.rb", + "lib/rake/late_time.rb", + "lib/rake/linked_list.rb", + "lib/rake/loaders/makefile.rb", + "lib/rake/multi_task.rb", + "lib/rake/name_space.rb", + "lib/rake/packagetask.rb", + "lib/rake/phony.rb", + "lib/rake/private_reader.rb", + "lib/rake/promise.rb", + "lib/rake/pseudo_status.rb", + "lib/rake/rake_module.rb", + "lib/rake/rake_test_loader.rb", + "lib/rake/rule_recursion_overflow_error.rb", + "lib/rake/scope.rb", + "lib/rake/task.rb", + "lib/rake/task_argument_error.rb", + "lib/rake/task_arguments.rb", + "lib/rake/task_manager.rb", + "lib/rake/tasklib.rb", + "lib/rake/testtask.rb", + "lib/rake/thread_history_display.rb", + "lib/rake/thread_pool.rb", + "lib/rake/trace_output.rb", + "lib/rake/version.rb", + "lib/rake/win32.rb", + "rake.gemspec" + ] + s.bindir = "exe" + s.executables = s.files.grep(%r{^exe/}) { |f| File.basename(f) } + s.require_paths = ["lib".freeze] + + s.required_ruby_version = Gem::Requirement.new(">= 2.2".freeze) + s.rdoc_options = ["--main".freeze, "README.rdoc".freeze] +end diff --git a/vendor/bundle/ruby/3.1.0/gems/redcarpet-3.5.1/COPYING b/vendor/bundle/ruby/3.1.0/gems/redcarpet-3.5.1/COPYING new file mode 100644 index 000000000..2d28708dd --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/redcarpet-3.5.1/COPYING @@ -0,0 +1,20 @@ +Copyright (c) 2009, Natacha Porté +Copyright (c) 2015, Vicent Marti + +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/vendor/bundle/ruby/3.1.0/gems/redcarpet-3.5.1/Gemfile b/vendor/bundle/ruby/3.1.0/gems/redcarpet-3.5.1/Gemfile new file mode 100644 index 000000000..09e387dc6 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/redcarpet-3.5.1/Gemfile @@ -0,0 +1,9 @@ +source "https://rubygems.org/" + +gemspec + +group :benchmark do + gem "benchmark-ips", "~> 2.7.2" + gem "bluecloth", "~> 2.2.0" + gem "kramdown", "~> 1.13.2" +end diff --git a/vendor/bundle/ruby/3.1.0/gems/redcarpet-3.5.1/README.markdown b/vendor/bundle/ruby/3.1.0/gems/redcarpet-3.5.1/README.markdown new file mode 100644 index 000000000..a36ea8fba --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/redcarpet-3.5.1/README.markdown @@ -0,0 +1,405 @@ +Redcarpet is written with sugar, spice and everything nice +============================================================ + +[![Build Status](https://travis-ci.org/vmg/redcarpet.svg?branch=master)](https://travis-ci.org/vmg/redcarpet) +[![Dependency Status](https://www.versioneye.com/ruby/redcarpet/badge.svg)](https://www.versioneye.com/ruby/redcarpet) +[![Help Contribute to Open Source](https://www.codetriage.com/vmg/redcarpet/badges/users.svg)](https://www.codetriage.com/vmg/redcarpet) + +Redcarpet is a Ruby library for Markdown processing that smells like +butterflies and popcorn. + +This library is written by people +--------------------------------- + +Redcarpet was written by [Vicent Martí](https://github.com/vmg). It is maintained by +[Robin Dupret](https://github.com/robin850) and [Matt Rogers](https://github.com/mattr-). + +Redcarpet would not be possible without the [Sundown](https://www.github.com/vmg/sundown) +library and its authors (Natacha Porté, Vicent Martí, and its many awesome contributors). + +You can totally install it as a Gem +----------------------------------- + +Redcarpet is readily available as a Ruby gem. It will build some native +extensions, but the parser is standalone and requires no installed libraries. +Starting with Redcarpet 3.0, the minimum required Ruby version is 1.9.2 (or Rubinius in 1.9 mode). + + $ [sudo] gem install redcarpet + +If you need to use it with Ruby 1.8.7, you will have to stick with 2.3.0: + + $ [sudo] gem install redcarpet -v 2.3.0 + +The Redcarpet source is available at GitHub: + + $ git clone git://github.com/vmg/redcarpet.git + + +And it's like *really* simple to use +------------------------------------ + +The core of the Redcarpet library is the `Redcarpet::Markdown` class. Each +instance of the class is attached to a `Renderer` object; the Markdown class +performs parsing of a document and uses the attached renderer to generate +output. + +The `Redcarpet::Markdown` object is encouraged to be instantiated once with the +required settings, and reused between parses. + +~~~~ ruby +# Initializes a Markdown parser +markdown = Redcarpet::Markdown.new(renderer, extensions = {}) +~~~~ + +Here, the `renderer` variable refers to a renderer object, inheriting +from `Redcarpet::Render::Base`. If the given object has not been +instantiated, the library will do it with default arguments. + +Rendering with the `Markdown` object is done through `Markdown#render`. +Unlike in the RedCloth API, the text to render is passed as an argument +and not stored inside the `Markdown` instance, to encourage reusability. +Example: + +~~~~ ruby +markdown.render("This is *bongos*, indeed.") +# => "

This is bongos, indeed.

" +~~~~ + +You can also specify a hash containing the Markdown extensions which the +parser will identify. The following extensions are accepted: + +* `:no_intra_emphasis`: do not parse emphasis inside of words. +Strings such as `foo_bar_baz` will not generate `` tags. + +* `:tables`: parse tables, PHP-Markdown style. + +* `:fenced_code_blocks`: parse fenced code blocks, PHP-Markdown +style. Blocks delimited with 3 or more `~` or backticks will be considered +as code, without the need to be indented. An optional language name may +be added at the end of the opening fence for the code block. + +* `:autolink`: parse links even when they are not enclosed in `<>` +characters. Autolinks for the http, https and ftp protocols will be +automatically detected. Email addresses and http links without protocol, +but starting with `www` are also handled. + +* `:disable_indented_code_blocks`: do not parse usual markdown +code blocks. Markdown converts text with four spaces at +the front of each line to code blocks. This option +prevents it from doing so. Recommended to use +with `fenced_code_blocks: true`. + +* `:strikethrough`: parse strikethrough, PHP-Markdown style. +Two `~` characters mark the start of a strikethrough, +e.g. `this is ~~good~~ bad`. + +* `:lax_spacing`: HTML blocks do not require to be surrounded by an +empty line as in the Markdown standard. + +* `:space_after_headers`: A space is always required between the hash +at the beginning of a header and its name, e.g. `#this is my header` +would not be a valid header. + +* `:superscript`: parse superscripts after the `^` character; contiguous superscripts +are nested together, and complex values can be enclosed in parenthesis, e.g. +`this is the 2^(nd) time`. + +* `:underline`: parse underscored emphasis as underlines. +`This is _underlined_ but this is still *italic*`. + +* `:highlight`: parse highlights. +`This is ==highlighted==`. It looks like this: `highlighted` + +* `:quote`: parse quotes. +`This is a "quote"`. It looks like this: `quote` + +* `:footnotes`: parse footnotes, PHP-Markdown style. A footnote works very much +like a reference-style link: it consists of a marker next to the text (e.g. +`This is a sentence.[^1]`) and a footnote definition on its own line anywhere +within the document (e.g. `[^1]: This is a footnote.`). + +Example: + +~~~~ ruby +markdown = Redcarpet::Markdown.new(Redcarpet::Render::HTML, autolink: true, tables: true) +~~~~ + +Darling, I packed you a couple renderers for lunch +-------------------------------------------------- + +Redcarpet comes with two built-in renderers, `Redcarpet::Render::HTML` and +`Redcarpet::Render::XHTML`, which output HTML and XHTML, respectively. These +renderers are actually implemented in C and hence offer brilliant +performance — several degrees of magnitude faster than other Ruby Markdown +solutions. + +All the rendering flags that previously applied only to HTML output have +now been moved to the `Redcarpet::Render::HTML` class, and may be enabled when +instantiating the renderer: + +~~~~ ruby +Redcarpet::Render::HTML.new(render_options = {}) +~~~~ + +Initializes an HTML renderer. The following flags are available: + +* `:filter_html`: do not allow any user-inputted HTML in the output. + +* `:no_images`: do not generate any `` tags. + +* `:no_links`: do not generate any `` tags. + +* `:no_styles`: do not generate any ` !" + output = render(markdown, with: [:no_styles]) + + assert_no_match %r{" + output = render(markdown, with: [:no_styles]) + + assert_no_match %r{ + + + + +EOF + end + end + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/rspec-core-3.11.0/lib/rspec/core/formatters/html_snippet_extractor.rb b/vendor/bundle/ruby/3.1.0/gems/rspec-core-3.11.0/lib/rspec/core/formatters/html_snippet_extractor.rb new file mode 100644 index 000000000..d89cb1cc6 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/rspec-core-3.11.0/lib/rspec/core/formatters/html_snippet_extractor.rb @@ -0,0 +1,120 @@ +module RSpec + module Core + module Formatters + # @api private + # + # Extracts code snippets by looking at the backtrace of the passed error + # and applies synax highlighting and line numbers using html. + class HtmlSnippetExtractor + # @private + module NullConverter + def self.convert(code) + %Q(#{code}\n# Install the coderay gem to get syntax highlighting) + end + end + + # @private + module CoderayConverter + def self.convert(code) + CodeRay.scan(code, :ruby).html(:line_numbers => false) + end + end + + # rubocop:disable Style/ClassVars + # @private + @@converter = NullConverter + + begin + require 'coderay' + RSpec::Support.require_rspec_core 'formatters/syntax_highlighter' + RSpec::Core::Formatters::SyntaxHighlighter.attempt_to_add_rspec_terms_to_coderay_keywords + @@converter = CoderayConverter + # rubocop:disable Lint/HandleExceptions + rescue LoadError + # it'll fall back to the NullConverter assigned above + # rubocop:enable Lint/HandleExceptions + end + + # rubocop:enable Style/ClassVars + + # @api private + # + # Extract lines of code corresponding to a backtrace. + # + # @param backtrace [String] the backtrace from a test failure + # @return [String] highlighted code snippet indicating where the test + # failure occured + # + # @see #post_process + def snippet(backtrace) + raw_code, line = snippet_for(backtrace[0]) + highlighted = @@converter.convert(raw_code) + post_process(highlighted, line) + end + # rubocop:enable Style/ClassVars + + # @api private + # + # Create a snippet from a line of code. + # + # @param error_line [String] file name with line number (i.e. + # 'foo_spec.rb:12') + # @return [String] lines around the target line within the file + # + # @see #lines_around + def snippet_for(error_line) + if error_line =~ /(.*):(\d+)/ + file = Regexp.last_match[1] + line = Regexp.last_match[2].to_i + [lines_around(file, line), line] + else + ["# Couldn't get snippet for #{error_line}", 1] + end + end + + # @api private + # + # Extract lines of code centered around a particular line within a + # source file. + # + # @param file [String] filename + # @param line [Fixnum] line number + # @return [String] lines around the target line within the file (2 above + # and 1 below). + def lines_around(file, line) + if File.file?(file) + lines = File.read(file).split("\n") + min = [0, line - 3].max + max = [line + 1, lines.length - 1].min + selected_lines = [] + selected_lines.join("\n") + lines[min..max].join("\n") + else + "# Couldn't get snippet for #{file}" + end + rescue SecurityError + "# Couldn't get snippet for #{file}" + end + + # @api private + # + # Adds line numbers to all lines and highlights the line where the + # failure occurred using html `span` tags. + # + # @param highlighted [String] syntax-highlighted snippet surrounding the + # offending line of code + # @param offending_line [Fixnum] line where failure occured + # @return [String] completed snippet + def post_process(highlighted, offending_line) + new_lines = [] + highlighted.split("\n").each_with_index do |line, i| + new_line = "#{offending_line + i - 2}#{line}" + new_line = "#{new_line}" if i == 2 + new_lines << new_line + end + new_lines.join("\n") + end + end + end + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/rspec-core-3.11.0/lib/rspec/core/formatters/json_formatter.rb b/vendor/bundle/ruby/3.1.0/gems/rspec-core-3.11.0/lib/rspec/core/formatters/json_formatter.rb new file mode 100644 index 000000000..ff15d90b2 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/rspec-core-3.11.0/lib/rspec/core/formatters/json_formatter.rb @@ -0,0 +1,102 @@ +RSpec::Support.require_rspec_core "formatters/base_formatter" +require 'json' + +module RSpec + module Core + module Formatters + # @private + class JsonFormatter < BaseFormatter + Formatters.register self, :message, :dump_summary, :dump_profile, :stop, :seed, :close + + attr_reader :output_hash + + def initialize(output) + super + @output_hash = { + :version => RSpec::Core::Version::STRING + } + end + + def message(notification) + (@output_hash[:messages] ||= []) << notification.message + end + + def dump_summary(summary) + @output_hash[:summary] = { + :duration => summary.duration, + :example_count => summary.example_count, + :failure_count => summary.failure_count, + :pending_count => summary.pending_count, + :errors_outside_of_examples_count => summary.errors_outside_of_examples_count + } + @output_hash[:summary_line] = summary.totals_line + end + + def stop(notification) + @output_hash[:examples] = notification.examples.map do |example| + format_example(example).tap do |hash| + e = example.exception + if e + hash[:exception] = { + :class => e.class.name, + :message => e.message, + :backtrace => e.backtrace, + } + end + end + end + end + + def seed(notification) + return unless notification.seed_used? + @output_hash[:seed] = notification.seed + end + + def close(_notification) + output.write @output_hash.to_json + end + + def dump_profile(profile) + @output_hash[:profile] = {} + dump_profile_slowest_examples(profile) + dump_profile_slowest_example_groups(profile) + end + + # @api private + def dump_profile_slowest_examples(profile) + @output_hash[:profile] = {} + @output_hash[:profile][:examples] = profile.slowest_examples.map do |example| + format_example(example).tap do |hash| + hash[:run_time] = example.execution_result.run_time + end + end + @output_hash[:profile][:slowest] = profile.slow_duration + @output_hash[:profile][:total] = profile.duration + end + + # @api private + def dump_profile_slowest_example_groups(profile) + @output_hash[:profile] ||= {} + @output_hash[:profile][:groups] = profile.slowest_groups.map do |loc, hash| + hash.update(:location => loc) + end + end + + private + + def format_example(example) + { + :id => example.id, + :description => example.description, + :full_description => example.full_description, + :status => example.execution_result.status.to_s, + :file_path => example.metadata[:file_path], + :line_number => example.metadata[:line_number], + :run_time => example.execution_result.run_time, + :pending_message => example.execution_result.pending_message, + } + end + end + end + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/rspec-core-3.11.0/lib/rspec/core/formatters/profile_formatter.rb b/vendor/bundle/ruby/3.1.0/gems/rspec-core-3.11.0/lib/rspec/core/formatters/profile_formatter.rb new file mode 100644 index 000000000..4b95d9386 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/rspec-core-3.11.0/lib/rspec/core/formatters/profile_formatter.rb @@ -0,0 +1,68 @@ +RSpec::Support.require_rspec_core "formatters/console_codes" + +module RSpec + module Core + module Formatters + # @api private + # Formatter for providing profile output. + class ProfileFormatter + Formatters.register self, :dump_profile + + def initialize(output) + @output = output + end + + # @private + attr_reader :output + + # @api public + # + # This method is invoked after the dumping the summary if profiling is + # enabled. + # + # @param profile [ProfileNotification] containing duration, + # slowest_examples and slowest_example_groups + def dump_profile(profile) + dump_profile_slowest_examples(profile) + dump_profile_slowest_example_groups(profile) + end + + private + + def dump_profile_slowest_examples(profile) + @output.puts "\nTop #{profile.slowest_examples.size} slowest " \ + "examples (#{Helpers.format_seconds(profile.slow_duration)} " \ + "seconds, #{profile.percentage}% of total time):\n" + + profile.slowest_examples.each do |example| + @output.puts " #{example.full_description}" + @output.puts " #{bold(Helpers.format_seconds(example.execution_result.run_time))} " \ + "#{bold("seconds")} #{format_caller(example.location)}" + end + end + + def dump_profile_slowest_example_groups(profile) + return if profile.slowest_groups.empty? + + @output.puts "\nTop #{profile.slowest_groups.size} slowest example groups:" + profile.slowest_groups.each do |loc, hash| + average = "#{bold(Helpers.format_seconds(hash[:average]))} #{bold("seconds")} average" + total = "#{Helpers.format_seconds(hash[:total_time])} seconds" + count = Helpers.pluralize(hash[:count], "example") + @output.puts " #{hash[:description]}" + @output.puts " #{average} (#{total} / #{count}) #{loc}" + end + end + + def format_caller(caller_info) + RSpec.configuration.backtrace_formatter.backtrace_line( + caller_info.to_s.split(':in `block').first) + end + + def bold(text) + ConsoleCodes.wrap(text, :bold) + end + end + end + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/rspec-core-3.11.0/lib/rspec/core/formatters/progress_formatter.rb b/vendor/bundle/ruby/3.1.0/gems/rspec-core-3.11.0/lib/rspec/core/formatters/progress_formatter.rb new file mode 100644 index 000000000..81e0beb40 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/rspec-core-3.11.0/lib/rspec/core/formatters/progress_formatter.rb @@ -0,0 +1,29 @@ +RSpec::Support.require_rspec_core "formatters/base_text_formatter" +RSpec::Support.require_rspec_core "formatters/console_codes" + +module RSpec + module Core + module Formatters + # @private + class ProgressFormatter < BaseTextFormatter + Formatters.register self, :example_passed, :example_pending, :example_failed, :start_dump + + def example_passed(_notification) + output.print ConsoleCodes.wrap('.', :success) + end + + def example_pending(_notification) + output.print ConsoleCodes.wrap('*', :pending) + end + + def example_failed(_notification) + output.print ConsoleCodes.wrap('F', :failure) + end + + def start_dump(_notification) + output.puts + end + end + end + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/rspec-core-3.11.0/lib/rspec/core/formatters/protocol.rb b/vendor/bundle/ruby/3.1.0/gems/rspec-core-3.11.0/lib/rspec/core/formatters/protocol.rb new file mode 100644 index 000000000..12fc71f8d --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/rspec-core-3.11.0/lib/rspec/core/formatters/protocol.rb @@ -0,0 +1,182 @@ +module RSpec + module Core + module Formatters + # This class isn't loaded at runtime but serves to document all of the + # notifications implemented as part of the standard interface. The + # reporter will issue these during a normal test suite run, but a + # formatter will only receive those notifications it has registered + # itself to receive. To register a formatter call: + # + # `::RSpec::Core::Formatters.register class, :list, :of, :notifications` + # + # e.g. + # + # `::RSpec::Core::Formatters.register self, :start, :example_started` + # + # @see RSpec::Core::Formatters::BaseFormatter + # @see RSpec::Core::Formatters::BaseTextFormatter + # @see RSpec::Core::Reporter + class Protocol + # @method initialize(output) + # @api public + # + # @param output [IO] the formatter output + + # @method start(notification) + # @api public + # @group Suite Notifications + # + # This method is invoked before any examples are run, right after + # they have all been collected. This can be useful for special + # formatters that need to provide progress on feedback (graphical ones). + # + # This will only be invoked once, and the next one to be invoked + # is {#example_group_started}. + # + # @param notification [Notifications::StartNotification] + + # @method example_group_started(notification) + # @api public + # @group Group Notifications + # + # This method is invoked at the beginning of the execution of each + # example group. + # + # The next method to be invoked after this is {#example_passed}, + # {#example_pending}, or {#example_group_finished}. + # + # @param notification [Notifications::GroupNotification] containing example_group + # subclass of {ExampleGroup} + + # @method example_group_finished(notification) + # @api public + # @group Group Notifications + # + # Invoked at the end of the execution of each example group. + # + # @param notification [Notifications::GroupNotification] containing example_group + # subclass of {ExampleGroup} + + # @method example_started(notification) + # @api public + # @group Example Notifications + # + # Invoked at the beginning of the execution of each example. + # + # @param notification [Notifications::ExampleNotification] containing example subclass + # of {Example} + + # @method example_finished(notification) + # @api public + # @group Example Notifications + # + # Invoked at the end of the execution of each example. + # + # @param notification [Notifications::ExampleNotification] containing example subclass + # of {Example} + + # @method example_passed(notification) + # @api public + # @group Example Notifications + # + # Invoked when an example passes. + # + # @param notification [Notifications::ExampleNotification] containing example subclass + # of {Example} + + # @method example_pending(notification) + # @api public + # @group Example Notifications + # + # Invoked when an example is pending. + # + # @param notification [Notifications::ExampleNotification] containing example subclass + # of {Example} + + # @method example_failed(notification) + # @api public + # @group Example Notifications + # + # Invoked when an example fails. + # + # @param notification [Notifications::ExampleNotification] containing example subclass + # of {Example} + + # @method message(notification) + # @api public + # @group Suite Notifications + # + # Used by the reporter to send messages to the output stream. + # + # @param notification [Notifications::MessageNotification] containing message + + # @method stop(notification) + # @api public + # @group Suite Notifications + # + # Invoked after all examples have executed, before dumping post-run + # reports. + # + # @param notification [Notifications::NullNotification] + + # @method start_dump(notification) + # @api public + # @group Suite Notifications + # + # This method is invoked after all of the examples have executed. The + # next method to be invoked after this one is {#dump_failures} + # (BaseTextFormatter then calls {#dump_failures} once for each failed + # example). + # + # @param notification [Notifications::NullNotification] + + # @method dump_failures(notification) + # @api public + # @group Suite Notifications + # + # Dumps detailed information about each example failure. + # + # @param notification [Notifications::NullNotification] + + # @method dump_summary(summary) + # @api public + # @group Suite Notifications + # + # This method is invoked after the dumping of examples and failures. + # Each parameter is assigned to a corresponding attribute. + # + # @param summary [Notifications::SummaryNotification] containing duration, + # example_count, failure_count and pending_count + + # @method dump_profile(profile) + # @api public + # @group Suite Notifications + # + # This method is invoked after the dumping the summary if profiling is + # enabled. + # + # @param profile [Notifications::ProfileNotification] containing duration, + # slowest_examples and slowest_example_groups + + # @method dump_pending(notification) + # @api public + # @group Suite Notifications + # + # Outputs a report of pending examples. This gets invoked + # after the summary if option is set to do so. + # + # @param notification [Notifications::NullNotification] + + # @method close(notification) + # @api public + # @group Suite Notifications + # + # Invoked at the end of a suite run. Allows the formatter to do any + # tidying up, but be aware that formatter output streams may be used + # elsewhere so don't actually close them. + # + # @param notification [Notifications::NullNotification] + end + end + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/rspec-core-3.11.0/lib/rspec/core/formatters/snippet_extractor.rb b/vendor/bundle/ruby/3.1.0/gems/rspec-core-3.11.0/lib/rspec/core/formatters/snippet_extractor.rb new file mode 100644 index 000000000..c585db41b --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/rspec-core-3.11.0/lib/rspec/core/formatters/snippet_extractor.rb @@ -0,0 +1,134 @@ +module RSpec + module Core + module Formatters + # @private + class SnippetExtractor + NoSuchFileError = Class.new(StandardError) + NoSuchLineError = Class.new(StandardError) + + def self.extract_line_at(file_path, line_number) + source = source_from_file(file_path) + line = source.lines[line_number - 1] + raise NoSuchLineError unless line + line + end + + def self.source_from_file(path) + raise NoSuchFileError unless File.exist?(path) + RSpec.world.source_from_file(path) + end + + if RSpec::Support::RubyFeatures.ripper_supported? + NoExpressionAtLineError = Class.new(StandardError) + + attr_reader :source, :beginning_line_number, :max_line_count + + def self.extract_expression_lines_at(file_path, beginning_line_number, max_line_count=nil) + if max_line_count == 1 + [extract_line_at(file_path, beginning_line_number)] + else + source = source_from_file(file_path) + new(source, beginning_line_number, max_line_count).expression_lines + end + end + + def initialize(source, beginning_line_number, max_line_count=nil) + @source = source + @beginning_line_number = beginning_line_number + @max_line_count = max_line_count + end + + def expression_lines + line_range = line_range_of_expression + + if max_line_count && line_range.count > max_line_count + line_range = (line_range.begin)..(line_range.begin + max_line_count - 1) + end + + source.lines[(line_range.begin - 1)..(line_range.end - 1)] + rescue SyntaxError, NoExpressionAtLineError + [self.class.extract_line_at(source.path, beginning_line_number)] + end + + private + + def line_range_of_expression + @line_range_of_expression ||= begin + line_range = line_range_of_location_nodes_in_expression + initial_unclosed_tokens = unclosed_tokens_in_line_range(line_range) + unclosed_tokens = initial_unclosed_tokens + + until (initial_unclosed_tokens & unclosed_tokens).empty? + line_range = (line_range.begin)..(line_range.end + 1) + unclosed_tokens = unclosed_tokens_in_line_range(line_range) + end + + line_range + end + end + + def unclosed_tokens_in_line_range(line_range) + tokens = FlatMap.flat_map(line_range) do |line_number| + source.tokens_by_line_number[line_number] + end + + tokens.each_with_object([]) do |token, unclosed_tokens| + if token.opening? + unclosed_tokens << token + else + index = unclosed_tokens.rindex do |unclosed_token| + unclosed_token.closed_by?(token) + end + unclosed_tokens.delete_at(index) if index + end + end + end + + def line_range_of_location_nodes_in_expression + line_numbers = expression_node.each_with_object(Set.new) do |node, set| + set << node.location.line if node.location + end + + line_numbers.min..line_numbers.max + end + + def expression_node + raise NoExpressionAtLineError if location_nodes_at_beginning_line.empty? + + @expression_node ||= begin + common_ancestor_nodes = location_nodes_at_beginning_line.map do |node| + node.each_ancestor.to_a + end.reduce(:&) + + common_ancestor_nodes.find { |node| expression_outmost_node?(node) } + end + end + + def expression_outmost_node?(node) + return true unless node.parent + return false if node.type.to_s.start_with?('@') + ![node, node.parent].all? do |n| + # See `Ripper::PARSER_EVENTS` for the complete list of sexp types. + type = n.type.to_s + type.end_with?('call') || type.start_with?('method_add_') + end + end + + def location_nodes_at_beginning_line + source.nodes_by_line_number[beginning_line_number] + end + else + # :nocov: + def self.extract_expression_lines_at(file_path, beginning_line_number, *) + [extract_line_at(file_path, beginning_line_number)] + end + # :nocov: + end + + def self.least_indentation_from(lines) + lines.map { |line| line[/^[ \t]*/] }.min + end + end + end + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/rspec-core-3.11.0/lib/rspec/core/formatters/syntax_highlighter.rb b/vendor/bundle/ruby/3.1.0/gems/rspec-core-3.11.0/lib/rspec/core/formatters/syntax_highlighter.rb new file mode 100644 index 000000000..e7766f6a6 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/rspec-core-3.11.0/lib/rspec/core/formatters/syntax_highlighter.rb @@ -0,0 +1,91 @@ +module RSpec + module Core + module Formatters + # @private + # Provides terminal syntax highlighting of code snippets + # when coderay is available. + class SyntaxHighlighter + def initialize(configuration) + @configuration = configuration + end + + def highlight(lines) + implementation.highlight_syntax(lines) + end + + # rubocop:disable Lint/RescueException + # rubocop:disable Lint/HandleExceptions + def self.attempt_to_add_rspec_terms_to_coderay_keywords + CodeRay::Scanners::Ruby::Patterns::IDENT_KIND.add(%w[ + describe context + it specify + before after around + let subject + expect allow + ], :keyword) + rescue Exception + # Mutating CodeRay's contants like this is not a public API + # and might not always work. If we cannot add our keywords + # to CodeRay it is not a big deal and not worth raising an + # error over, so we ignore it. + end + # rubocop:enable Lint/HandleExceptions + # rubocop:enable Lint/RescueException + + private + + if RSpec::Support::OS.windows? + # :nocov: + def implementation + WindowsImplementation + end + # :nocov: + else + def implementation + return color_enabled_implementation if @configuration.color_enabled? + NoSyntaxHighlightingImplementation + end + end + + def color_enabled_implementation + @color_enabled_implementation ||= begin + require 'coderay' + self.class.attempt_to_add_rspec_terms_to_coderay_keywords + CodeRayImplementation + rescue LoadError + NoSyntaxHighlightingImplementation + end + end + + # @private + module CodeRayImplementation + RESET_CODE = "\e[0m" + + def self.highlight_syntax(lines) + highlighted = begin + CodeRay.encode(lines.join("\n"), :ruby, :terminal) + rescue Support::AllExceptionsExceptOnesWeMustNotRescue + return lines + end + + highlighted.split("\n").map do |line| + line.sub(/\S/) { |char| char.insert(0, RESET_CODE) } + end + end + end + + # @private + module NoSyntaxHighlightingImplementation + def self.highlight_syntax(lines) + lines + end + end + + # @private + # Not sure why, but our code above (and/or coderay itself) does not work + # on Windows, so we disable the feature on Windows. + WindowsImplementation = NoSyntaxHighlightingImplementation + end + end + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/rspec-core-3.11.0/lib/rspec/core/hooks.rb b/vendor/bundle/ruby/3.1.0/gems/rspec-core-3.11.0/lib/rspec/core/hooks.rb new file mode 100644 index 000000000..97bd0fc50 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/rspec-core-3.11.0/lib/rspec/core/hooks.rb @@ -0,0 +1,646 @@ +module RSpec + module Core + # Provides `before`, `after` and `around` hooks as a means of + # supporting common setup and teardown. This module is extended + # onto {ExampleGroup}, making the methods available from any `describe` + # or `context` block and included in {Configuration}, making them + # available off of the configuration object to define global setup + # or teardown logic. + module Hooks + # @api public + # + # @overload before(&block) + # @overload before(scope, &block) + # @param scope [Symbol] `:example`, `:context`, or `:suite` + # (defaults to `:example`) + # @overload before(scope, *conditions, &block) + # @param scope [Symbol] `:example`, `:context`, or `:suite` + # (defaults to `:example`) + # @param conditions [Array, Hash] constrains this hook to + # examples matching these conditions e.g. + # `before(:example, :ui => true) { ... }` will only run with examples + # or groups declared with `:ui => true`. Symbols will be transformed + # into hash entries with `true` values. + # @overload before(conditions, &block) + # @param conditions [Hash] + # constrains this hook to examples matching these conditions e.g. + # `before(:example, :ui => true) { ... }` will only run with examples + # or groups declared with `:ui => true`. + # + # @see #after + # @see #around + # @see ExampleGroup + # @see SharedContext + # @see SharedExampleGroup + # @see Configuration + # + # Declare a block of code to be run before each example (using `:example`) + # or once before any example (using `:context`). These are usually + # declared directly in the {ExampleGroup} to which they apply, but they + # can also be shared across multiple groups. + # + # You can also use `before(:suite)` to run a block of code before any + # example groups are run. This should be declared in {RSpec.configure}. + # + # Instance variables declared in `before(:example)` or `before(:context)` + # are accessible within each example. + # + # ### Order + # + # `before` hooks are stored in three scopes, which are run in order: + # `:suite`, `:context`, and `:example`. They can also be declared in + # several different places: `RSpec.configure`, a parent group, the current + # group. They are run in the following order: + # + # before(:suite) # Declared in RSpec.configure. + # before(:context) # Declared in RSpec.configure. + # before(:context) # Declared in a parent group. + # before(:context) # Declared in the current group. + # before(:example) # Declared in RSpec.configure. + # before(:example) # Declared in a parent group. + # before(:example) # Declared in the current group. + # + # If more than one `before` is declared within any one example group, they + # are run in the order in which they are declared. Any `around` hooks will + # execute after `before` context hooks but before any `before` example + # hook regardless of where they are declared. + # + # ### Conditions + # + # When you add a conditions hash to `before(:example)` or + # `before(:context)`, RSpec will only apply that hook to groups or + # examples that match the conditions. e.g. + # + # RSpec.configure do |config| + # config.before(:example, :authorized => true) do + # log_in_as :authorized_user + # end + # end + # + # RSpec.describe Something, :authorized => true do + # # The before hook will run in before each example in this group. + # end + # + # RSpec.describe SomethingElse do + # it "does something", :authorized => true do + # # The before hook will run before this example. + # end + # + # it "does something else" do + # # The hook will not run before this example. + # end + # end + # + # Note that filtered config `:context` hooks can still be applied + # to individual examples that have matching metadata. Just like + # Ruby's object model is that every object has a singleton class + # which has only a single instance, RSpec's model is that every + # example has a singleton example group containing just the one + # example. + # + # ### Warning: `before(:suite, :with => :conditions)` + # + # The conditions hash is used to match against specific examples. Since + # `before(:suite)` is not run in relation to any specific example or + # group, conditions passed along with `:suite` are effectively ignored. + # + # ### Exceptions + # + # When an exception is raised in a `before` block, RSpec skips any + # subsequent `before` blocks and the example, but runs all of the + # `after(:example)` and `after(:context)` hooks. + # + # ### Warning: implicit before blocks + # + # `before` hooks can also be declared in shared contexts which get + # included implicitly either by you or by extension libraries. Since + # RSpec runs these in the order in which they are declared within each + # scope, load order matters, and can lead to confusing results when one + # before block depends on state that is prepared in another before block + # that gets run later. + # + # ### Warning: `before(:context)` + # + # It is very tempting to use `before(:context)` to speed things up, but we + # recommend that you avoid this as there are a number of gotchas, as well + # as things that simply don't work. + # + # #### Context + # + # `before(:context)` is run in an example that is generated to provide + # group context for the block. + # + # #### Instance variables + # + # Instance variables declared in `before(:context)` are shared across all + # the examples in the group. This means that each example can change the + # state of a shared object, resulting in an ordering dependency that can + # make it difficult to reason about failures. + # + # #### Unsupported RSpec constructs + # + # RSpec has several constructs that reset state between each example + # automatically. These are not intended for use from within + # `before(:context)`: + # + # * `let` declarations + # * `subject` declarations + # * Any mocking, stubbing or test double declaration + # + # ### other frameworks + # + # Mock object frameworks and database transaction managers (like + # ActiveRecord) are typically designed around the idea of setting up + # before an example, running that one example, and then tearing down. This + # means that mocks and stubs can (sometimes) be declared in + # `before(:context)`, but get torn down before the first real example is + # ever run. + # + # You _can_ create database-backed model objects in a `before(:context)` + # in rspec-rails, but it will not be wrapped in a transaction for you, so + # you are on your own to clean up in an `after(:context)` block. + # + # @example before(:example) declared in an {ExampleGroup} + # + # RSpec.describe Thing do + # before(:example) do + # @thing = Thing.new + # end + # + # it "does something" do + # # Here you can access @thing. + # end + # end + # + # @example before(:context) declared in an {ExampleGroup} + # + # RSpec.describe Parser do + # before(:context) do + # File.open(file_to_parse, 'w') do |f| + # f.write <<-CONTENT + # stuff in the file + # CONTENT + # end + # end + # + # it "parses the file" do + # Parser.parse(file_to_parse) + # end + # + # after(:context) do + # File.delete(file_to_parse) + # end + # end + # + # @note The `:example` and `:context` scopes are also available as + # `:each` and `:all`, respectively. Use whichever you prefer. + # @note The `:suite` scope is only supported for hooks registered on + # `RSpec.configuration` since they exist independently of any + # example or example group. + def before(*args, &block) + hooks.register :append, :before, *args, &block + end + + alias_method :append_before, :before + + # Adds `block` to the front of the list of `before` blocks in the same + # scope (`:example`, `:context`, or `:suite`). + # + # See {#before} for scoping semantics. + def prepend_before(*args, &block) + hooks.register :prepend, :before, *args, &block + end + + # @api public + # @overload after(&block) + # @overload after(scope, &block) + # @param scope [Symbol] `:example`, `:context`, or `:suite` (defaults to + # `:example`) + # @overload after(scope, *conditions, &block) + # @param scope [Symbol] `:example`, `:context`, or `:suite` (defaults to + # `:example`) + # @param conditions [Array, Hash] constrains this hook to + # examples matching these conditions e.g. + # `after(:example, :ui => true) { ... }` will only run with examples + # or groups declared with `:ui => true`. Symbols will be transformed + # into hash entries with `true` values. + # @overload after(conditions, &block) + # @param conditions [Hash] + # constrains this hook to examples matching these conditions e.g. + # `after(:example, :ui => true) { ... }` will only run with examples + # or groups declared with `:ui => true`. + # + # @see #before + # @see #around + # @see ExampleGroup + # @see SharedContext + # @see SharedExampleGroup + # @see Configuration + # + # Declare a block of code to be run after each example (using `:example`) + # or once after all examples n the context (using `:context`). See + # {#before} for more information about ordering. + # + # ### Exceptions + # + # `after` hooks are guaranteed to run even when there are exceptions in + # `before` hooks or examples. When an exception is raised in an after + # block, the exception is captured for later reporting, and subsequent + # `after` blocks are run. + # + # ### Order + # + # `after` hooks are stored in three scopes, which are run in order: + # `:example`, `:context`, and `:suite`. They can also be declared in + # several different places: `RSpec.configure`, a parent group, the current + # group. They are run in the following order: + # + # after(:example) # Declared in the current group. + # after(:example) # Declared in a parent group. + # after(:example) # Declared in RSpec.configure. + # after(:context) # Declared in the current group. + # after(:context) # Declared in a parent group. + # after(:context) # Declared in RSpec.configure. + # after(:suite) # Declared in RSpec.configure. + # + # This is the reverse of the order in which `before` hooks are run. + # Similarly, if more than one `after` is declared within any example + # group, they are run in reverse order of that in which they are declared. + # Also `around` hooks will run after any `after` example hooks are + # invoked but before any `after` context hooks. + # + # @note The `:example` and `:context` scopes are also available as + # `:each` and `:all`, respectively. Use whichever you prefer. + # @note The `:suite` scope is only supported for hooks registered on + # `RSpec.configuration` since they exist independently of any + # example or example group. + def after(*args, &block) + hooks.register :prepend, :after, *args, &block + end + + alias_method :prepend_after, :after + + # Adds `block` to the back of the list of `after` blocks in the same + # scope (`:example`, `:context`, or `:suite`). + # + # See {#after} for scoping semantics. + def append_after(*args, &block) + hooks.register :append, :after, *args, &block + end + + # @api public + # @overload around(&block) + # @overload around(scope, &block) + # @param scope [Symbol] `:example` (defaults to `:example`) + # present for syntax parity with `before` and `after`, but + # `:example`/`:each` is the only supported value. + # @overload around(scope, *conditions, &block) + # @param scope [Symbol] `:example` (defaults to `:example`) + # present for syntax parity with `before` and `after`, but + # `:example`/`:each` is the only supported value. + # @param conditions [Array, Hash] constrains this hook to + # examples matching these conditions e.g. + # `around(:example, :ui => true) { ... }` will only run with examples + # or groups declared with `:ui => true`. Symbols will be transformed + # into hash entries with `true` values. + # @overload around(conditions, &block) + # @param conditions [Hash] constrains this hook to examples matching + # these conditions e.g. `around(:example, :ui => true) { ... }` will + # only run with examples or groups declared with `:ui => true`. + # + # @yield [Example] the example to run + # + # @note the syntax of `around` is similar to that of `before` and `after` + # but the semantics are quite different. `before` and `after` hooks are + # run in the context of the examples with which they are associated, + # whereas `around` hooks are actually responsible for running the + # examples. Consequently, `around` hooks do not have direct access to + # resources that are made available within the examples and their + # associated `before` and `after` hooks. + # + # @note `:example`/`:each` is the only supported scope. + # + # Declare a block of code, parts of which will be run before and parts + # after the example. It is your responsibility to run the example: + # + # around(:example) do |ex| + # # Do some stuff before. + # ex.run + # # Do some stuff after. + # end + # + # The yielded example aliases `run` with `call`, which lets you treat it + # like a `Proc`. This is especially handy when working with libraries + # that manage their own setup and teardown using a block or proc syntax, + # e.g. + # + # around(:example) {|ex| Database.transaction(&ex)} + # around(:example) {|ex| FakeFS(&ex)} + # + # ### Order + # + # The `around` hooks execute surrounding an example and its hooks. + # + # This means after any `before` context hooks, but before any `before` + # example hooks, and similarly after any `after` example hooks but before + # any `after` context hooks. + # + # They are not a synonym for `before`/`after`. + def around(*args, &block) + hooks.register :prepend, :around, *args, &block + end + + # @private + # Holds the various registered hooks. + def hooks + @hooks ||= HookCollections.new(self, FilterableItemRepository::UpdateOptimized) + end + + # @private + Hook = Struct.new(:block, :options) + + # @private + class BeforeHook < Hook + def run(example) + example.instance_exec(example, &block) + end + end + + # @private + class AfterHook < Hook + def run(example) + example.instance_exec(example, &block) + rescue Support::AllExceptionsExceptOnesWeMustNotRescue => ex + example.set_exception(ex) + end + end + + # @private + class AfterContextHook < Hook + def run(example) + example.instance_exec(example, &block) + rescue Support::AllExceptionsExceptOnesWeMustNotRescue => e + RSpec.configuration.reporter.notify_non_example_exception(e, "An error occurred in an `after(:context)` hook.") + end + end + + # @private + class AroundHook < Hook + def execute_with(example, procsy) + example.instance_exec(procsy, &block) + return if procsy.executed? + Pending.mark_skipped!(example, + "#{hook_description} did not execute the example") + end + + if Proc.method_defined?(:source_location) + def hook_description + "around hook at #{Metadata.relative_path(block.source_location.join(':'))}" + end + else # for 1.8.7 + # :nocov: + def hook_description + "around hook" + end + # :nocov: + end + end + + # @private + # + # This provides the primary API used by other parts of rspec-core. By hiding all + # implementation details behind this facade, it's allowed us to heavily optimize + # this, so that, for example, hook collection objects are only instantiated when + # a hook is added. This allows us to avoid many object allocations for the common + # case of a group having no hooks. + # + # This is only possible because this interface provides a "tell, don't ask"-style + # API, so that callers _tell_ this class what to do with the hooks, rather than + # asking this class for a list of hooks, and then doing something with them. + class HookCollections + def initialize(owner, filterable_item_repo_class) + @owner = owner + @filterable_item_repo_class = filterable_item_repo_class + @before_example_hooks = nil + @after_example_hooks = nil + @before_context_hooks = nil + @after_context_hooks = nil + @around_example_hooks = nil + end + + def register_globals(host, globals) + parent_groups = host.parent_groups + + process(host, parent_groups, globals, :before, :example, &:options) + process(host, parent_groups, globals, :after, :example, &:options) + process(host, parent_groups, globals, :around, :example, &:options) + + process(host, parent_groups, globals, :before, :context, &:options) + process(host, parent_groups, globals, :after, :context, &:options) + end + + def register_global_singleton_context_hooks(example, globals) + parent_groups = example.example_group.parent_groups + + process(example, parent_groups, globals, :before, :context) { {} } + process(example, parent_groups, globals, :after, :context) { {} } + end + + def register(prepend_or_append, position, *args, &block) + scope, options = scope_and_options_from(*args) + + if scope == :suite + # TODO: consider making this an error in RSpec 4. For SemVer reasons, + # we are only warning in RSpec 3. + RSpec.warn_with "WARNING: `#{position}(:suite)` hooks are only supported on " \ + "the RSpec configuration object. This " \ + "`#{position}(:suite)` hook, registered on an example " \ + "group, will be ignored." + return + elsif scope == :context && position == :around + # TODO: consider making this an error in RSpec 4. For SemVer reasons, + # we are only warning in RSpec 3. + RSpec.warn_with "WARNING: `around(:context)` hooks are not supported and " \ + "behave like `around(:example)." + end + + hook = HOOK_TYPES[position][scope].new(block, options) + ensure_hooks_initialized_for(position, scope).__send__(prepend_or_append, hook, options) + end + + # @private + # + # Runs all of the blocks stored with the hook in the context of the + # example. If no example is provided, just calls the hook directly. + def run(position, scope, example_or_group) + return if RSpec.configuration.dry_run? + + if scope == :context + unless example_or_group.class.metadata[:skip] + run_owned_hooks_for(position, :context, example_or_group) + end + else + case position + when :before then run_example_hooks_for(example_or_group, :before, :reverse_each) + when :after then run_example_hooks_for(example_or_group, :after, :each) + when :around then run_around_example_hooks_for(example_or_group) { yield } + end + end + end + + SCOPES = [:example, :context] + + SCOPE_ALIASES = { :each => :example, :all => :context } + + HOOK_TYPES = { + :before => Hash.new { BeforeHook }, + :after => Hash.new { AfterHook }, + :around => Hash.new { AroundHook } + } + + HOOK_TYPES[:after][:context] = AfterContextHook + + protected + + EMPTY_HOOK_ARRAY = [].freeze + + def matching_hooks_for(position, scope, example_or_group) + repository = hooks_for(position, scope) { return EMPTY_HOOK_ARRAY } + + # It would be nice to not have to switch on type here, but + # we don't want to define `ExampleGroup#metadata` because then + # `metadata` from within an individual example would return the + # group's metadata but the user would probably expect it to be + # the example's metadata. + metadata = case example_or_group + when ExampleGroup then example_or_group.class.metadata + else example_or_group.metadata + end + + repository.items_for(metadata) + end + + def all_hooks_for(position, scope) + hooks_for(position, scope) { return EMPTY_HOOK_ARRAY }.items_and_filters.map(&:first) + end + + def run_owned_hooks_for(position, scope, example_or_group) + matching_hooks_for(position, scope, example_or_group).each do |hook| + hook.run(example_or_group) + end + end + + def processable_hooks_for(position, scope, host) + if scope == :example + all_hooks_for(position, scope) + else + matching_hooks_for(position, scope, host) + end + end + + private + + def hooks_for(position, scope) + if position == :before + scope == :example ? @before_example_hooks : @before_context_hooks + elsif position == :after + scope == :example ? @after_example_hooks : @after_context_hooks + else # around + @around_example_hooks + end || yield + end + + def ensure_hooks_initialized_for(position, scope) + if position == :before + if scope == :example + @before_example_hooks ||= @filterable_item_repo_class.new(:all?) + else + @before_context_hooks ||= @filterable_item_repo_class.new(:all?) + end + elsif position == :after + if scope == :example + @after_example_hooks ||= @filterable_item_repo_class.new(:all?) + else + @after_context_hooks ||= @filterable_item_repo_class.new(:all?) + end + else # around + @around_example_hooks ||= @filterable_item_repo_class.new(:all?) + end + end + + def process(host, parent_groups, globals, position, scope) + hooks_to_process = globals.processable_hooks_for(position, scope, host) + return if hooks_to_process.empty? + + hooks_to_process -= FlatMap.flat_map(parent_groups) do |group| + group.hooks.all_hooks_for(position, scope) + end + return if hooks_to_process.empty? + + repository = ensure_hooks_initialized_for(position, scope) + hooks_to_process.each { |hook| repository.append hook, (yield hook) } + end + + def scope_and_options_from(*args) + return :suite if args.first == :suite + scope = extract_scope_from(args) + meta = Metadata.build_hash_from(args, :warn_about_example_group_filtering) + return scope, meta + end + + def extract_scope_from(args) + if known_scope?(args.first) + normalized_scope_for(args.shift) + elsif args.any? { |a| a.is_a?(Symbol) } + error_message = "You must explicitly give a scope " \ + "(#{SCOPES.join(", ")}) or scope alias " \ + "(#{SCOPE_ALIASES.keys.join(", ")}) when using symbols as " \ + "metadata for a hook." + raise ArgumentError.new error_message + else + :example + end + end + + def known_scope?(scope) + SCOPES.include?(scope) || SCOPE_ALIASES.keys.include?(scope) + end + + def normalized_scope_for(scope) + SCOPE_ALIASES[scope] || scope + end + + def run_example_hooks_for(example, position, each_method) + owner_parent_groups.__send__(each_method) do |group| + group.hooks.run_owned_hooks_for(position, :example, example) + end + end + + def run_around_example_hooks_for(example) + hooks = FlatMap.flat_map(owner_parent_groups) do |group| + group.hooks.matching_hooks_for(:around, :example, example) + end + + return yield if hooks.empty? # exit early to avoid the extra allocation cost of `Example::Procsy` + + initial_procsy = Example::Procsy.new(example) { yield } + hooks.inject(initial_procsy) do |procsy, around_hook| + procsy.wrap { around_hook.execute_with(example, procsy) } + end.call + end + + if respond_to?(:singleton_class) && singleton_class.ancestors.include?(singleton_class) + def owner_parent_groups + @owner.parent_groups + end + else # Ruby < 2.1 (see https://bugs.ruby-lang.org/issues/8035) + # :nocov: + def owner_parent_groups + @owner_parent_groups ||= [@owner] + @owner.parent_groups + end + # :nocov: + end + end + end + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/rspec-core-3.11.0/lib/rspec/core/invocations.rb b/vendor/bundle/ruby/3.1.0/gems/rspec-core-3.11.0/lib/rspec/core/invocations.rb new file mode 100644 index 000000000..4719085b3 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/rspec-core-3.11.0/lib/rspec/core/invocations.rb @@ -0,0 +1,87 @@ +module RSpec + module Core + # @private + module Invocations + # @private + class InitializeProject + def call(*_args) + RSpec::Support.require_rspec_core "project_initializer" + ProjectInitializer.new.run + 0 + end + end + + # @private + class DRbWithFallback + def call(options, err, out) + require 'rspec/core/drb' + begin + return DRbRunner.new(options).run(err, out) + rescue DRb::DRbConnError + err.puts "No DRb server is running. Running in local process instead ..." + end + RSpec::Core::Runner.new(options).run(err, out) + end + end + + # @private + class Bisect + def call(options, err, out) + RSpec::Support.require_rspec_core "bisect/coordinator" + runner = Runner.new(options).tap { |r| r.configure(err, out) } + formatter = bisect_formatter_klass_for(options.options[:bisect]).new( + out, runner.configuration.bisect_runner + ) + + success = RSpec::Core::Bisect::Coordinator.bisect_with( + runner, options.args, formatter + ) + + runner.exit_code(success) + end + + private + + def bisect_formatter_klass_for(argument) + return Formatters::BisectDebugFormatter if argument == "verbose" + Formatters::BisectProgressFormatter + end + end + + # @private + class PrintVersion + def call(_options, _err, out) + overall_version = RSpec::Core::Version::STRING + unless overall_version =~ /[a-zA-Z]+/ + overall_version = overall_version.split('.').first(2).join('.') + end + + out.puts "RSpec #{overall_version}" + + [:Core, :Expectations, :Mocks, :Rails, :Support].each do |const_name| + lib_name = const_name.to_s.downcase + begin + require "rspec/#{lib_name}/version" + rescue LoadError + # Not worth mentioning libs that are not installed + nil + else + out.puts " - rspec-#{lib_name} #{RSpec.const_get(const_name)::Version::STRING}" + end + end + + 0 + end + end + + # @private + PrintHelp = Struct.new(:parser, :hidden_options) do + def call(_options, _err, out) + # Removing the hidden options from the output. + out.puts parser.to_s.gsub(/^\s+(#{hidden_options.join('|')})\b.*$\n/, '') + 0 + end + end + end + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/rspec-core-3.11.0/lib/rspec/core/memoized_helpers.rb b/vendor/bundle/ruby/3.1.0/gems/rspec-core-3.11.0/lib/rspec/core/memoized_helpers.rb new file mode 100644 index 000000000..adcfce7af --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/rspec-core-3.11.0/lib/rspec/core/memoized_helpers.rb @@ -0,0 +1,580 @@ +RSpec::Support.require_rspec_support 'reentrant_mutex' + +module RSpec + module Core + # This module is included in {ExampleGroup}, making the methods + # available to be called from within example blocks. + # + # @see ClassMethods + module MemoizedHelpers + # @note `subject` was contributed by Joe Ferris to support the one-liner + # syntax embraced by shoulda matchers: + # + # RSpec.describe Widget do + # it { is_expected.to validate_presence_of(:name) } + # # or + # it { should validate_presence_of(:name) } + # end + # + # While the examples below demonstrate how to use `subject` + # explicitly in examples, we recommend that you define a method with + # an intention revealing name instead. + # + # @example + # + # # Explicit declaration of subject. + # RSpec.describe Person do + # subject { Person.new(:birthdate => 19.years.ago) } + # it "should be eligible to vote" do + # subject.should be_eligible_to_vote + # # ^ ^ explicit reference to subject not recommended + # end + # end + # + # # Implicit subject => { Person.new }. + # RSpec.describe Person do + # it "should be eligible to vote" do + # subject.should be_eligible_to_vote + # # ^ ^ explicit reference to subject not recommended + # end + # end + # + # # One-liner syntax - expectation is set on the subject. + # RSpec.describe Person do + # it { is_expected.to be_eligible_to_vote } + # # or + # it { should be_eligible_to_vote } + # end + # + # @note Because `subject` is designed to create state that is reset + # between each example, and `before(:context)` is designed to setup + # state that is shared across _all_ examples in an example group, + # `subject` is _not_ intended to be used in a `before(:context)` hook. + # + # @see #should + # @see #should_not + # @see #is_expected + def subject + __memoized.fetch_or_store(:subject) do + described = described_class || self.class.metadata.fetch(:description_args).first + Class === described ? described.new : described + end + end + + # When `should` is called with no explicit receiver, the call is + # delegated to the object returned by `subject`. Combined with an + # implicit subject this supports very concise expressions. + # + # @example + # + # RSpec.describe Person do + # it { should be_eligible_to_vote } + # end + # + # @see #subject + # @see #is_expected + # + # @note This only works if you are using rspec-expectations. + # @note If you are using RSpec's newer expect-based syntax you may + # want to use `is_expected.to` instead of `should`. + def should(matcher=nil, message=nil) + enforce_value_expectation(matcher, 'should') + RSpec::Expectations::PositiveExpectationHandler.handle_matcher(subject, matcher, message) + end + + # Just like `should`, `should_not` delegates to the subject (implicit or + # explicit) of the example group. + # + # @example + # + # RSpec.describe Person do + # it { should_not be_eligible_to_vote } + # end + # + # @see #subject + # @see #is_expected + # + # @note This only works if you are using rspec-expectations. + # @note If you are using RSpec's newer expect-based syntax you may + # want to use `is_expected.to_not` instead of `should_not`. + def should_not(matcher=nil, message=nil) + enforce_value_expectation(matcher, 'should_not') + RSpec::Expectations::NegativeExpectationHandler.handle_matcher(subject, matcher, message) + end + + # Wraps the `subject` in `expect` to make it the target of an expectation. + # Designed to read nicely for one-liners. + # + # @example + # + # describe [1, 2, 3] do + # it { is_expected.to be_an Array } + # it { is_expected.not_to include 4 } + # end + # + # @see #subject + # @see #should + # @see #should_not + # + # @note This only works if you are using rspec-expectations. + def is_expected + expect(subject) + end + + # @private + # should just be placed in private section, + # but Ruby issues warnings on private attributes. + # and expanding it to the equivalent method upsets Rubocop, + # b/c it should obviously be a reader + attr_reader :__memoized + private :__memoized + + private + + # @private + def initialize(*) + __init_memoized + super + end + + # @private + def __init_memoized + @__memoized = if RSpec.configuration.threadsafe? + ThreadsafeMemoized.new + else + NonThreadSafeMemoized.new + end + end + + # @private + def enforce_value_expectation(matcher, method_name) + return if matcher_supports_value_expectations?(matcher) + + RSpec.deprecate( + "#{method_name} #{RSpec::Support::ObjectFormatter.format(matcher)}", + :message => + "The implicit block expectation syntax is deprecated, you should pass " \ + "a block to `expect` to use the provided block expectation matcher " \ + "(#{RSpec::Support::ObjectFormatter.format(matcher)}), " \ + "or the matcher must implement `supports_value_expectations?`." + ) + end + + def matcher_supports_value_expectations?(matcher) + matcher.supports_value_expectations? + rescue + true + end + + # @private + class ThreadsafeMemoized + def initialize + @memoized = {} + @mutex = Support::ReentrantMutex.new + end + + def fetch_or_store(key) + @memoized.fetch(key) do # only first access pays for synchronization + @mutex.synchronize do + @memoized.fetch(key) { @memoized[key] = yield } + end + end + end + end + + # @private + class NonThreadSafeMemoized + def initialize + @memoized = {} + end + + def fetch_or_store(key) + @memoized.fetch(key) { @memoized[key] = yield } + end + end + + # Used internally to customize the behavior of the + # memoized hash when used in a `before(:context)` hook. + # + # @private + class ContextHookMemoized + def self.isolate_for_context_hook(example_group_instance) + exploding_memoized = self + + example_group_instance.instance_exec do + @__memoized = exploding_memoized + + begin + yield + ensure + # This is doing a reset instead of just isolating for context hook. + # Really, this should set the old @__memoized back into place. + # + # Caller is the before and after context hooks + # which are both called from self.run + # I didn't look at why it made tests fail, maybe an object was getting reused in RSpec tests, + # if so, then that probably already works, and its the tests that are wrong. + __init_memoized + end + end + end + + def self.fetch_or_store(key, &_block) + description = if key == :subject + "subject" + else + "let declaration `#{key}`" + end + + raise <<-EOS +#{description} accessed in #{article} #{hook_expression} hook at: + #{CallerFilter.first_non_rspec_line} + +`let` and `subject` declarations are not intended to be called +in #{article} #{hook_expression} hook, as they exist to define state that +is reset between each example, while #{hook_expression} exists to +#{hook_intention}. +EOS + end + + # @private + class Before < self + def self.hook_expression + "`before(:context)`" + end + + def self.article + "a" + end + + def self.hook_intention + "define state that is shared across examples in an example group" + end + end + + # @private + class After < self + def self.hook_expression + "`after(:context)`" + end + + def self.article + "an" + end + + def self.hook_intention + "cleanup state that is shared across examples in an example group" + end + end + end + + # This module is extended onto {ExampleGroup}, making the methods + # available to be called from within example group blocks. + # You can think of them as being analagous to class macros. + module ClassMethods + # Generates a method whose return value is memoized after the first + # call. Useful for reducing duplication between examples that assign + # values to the same local variable. + # + # @note `let` _can_ enhance readability when used sparingly (1,2, or + # maybe 3 declarations) in any given example group, but that can + # quickly degrade with overuse. YMMV. + # + # @note `let` can be configured to be threadsafe or not. + # If it is threadsafe, it will take longer to access the value. + # If it is not threadsafe, it may behave in surprising ways in examples + # that spawn separate threads. Specify this on `RSpec.configure` + # + # @note Because `let` is designed to create state that is reset between + # each example, and `before(:context)` is designed to setup state that + # is shared across _all_ examples in an example group, `let` is _not_ + # intended to be used in a `before(:context)` hook. + # + # @example + # + # RSpec.describe Thing do + # let(:thing) { Thing.new } + # + # it "does something" do + # # First invocation, executes block, memoizes and returns result. + # thing.do_something + # + # # Second invocation, returns the memoized value. + # thing.should be_something + # end + # end + def let(name, &block) + # We have to pass the block directly to `define_method` to + # allow it to use method constructs like `super` and `return`. + raise "#let or #subject called without a block" if block.nil? + + # A list of reserved words that can't be used as a name for a memoized helper + # Matches for both symbols and passed strings + if [:initialize, :to_s].include?(name.to_sym) + raise ArgumentError, "#let or #subject called with reserved name `#{name}`" + end + + our_module = MemoizedHelpers.module_for(self) + + # If we have a module clash in our helper module + # then we need to remove it to prevent a warning. + # + # Note we do not check ancestor modules (see: `instance_methods(false)`) + # as we can override them. + if our_module.instance_methods(false).include?(name) + our_module.__send__(:remove_method, name) + end + our_module.__send__(:define_method, name, &block) + + # If we have a module clash in the example module + # then we need to remove it to prevent a warning. + # + # Note we do not check ancestor modules (see: `instance_methods(false)`) + # as we can override them. + if instance_methods(false).include?(name) + remove_method(name) + end + + # Apply the memoization. The method has been defined in an ancestor + # module so we can use `super` here to get the value. + if block.arity == 1 + define_method(name) { __memoized.fetch_or_store(name) { super(RSpec.current_example, &nil) } } + else + define_method(name) { __memoized.fetch_or_store(name) { super(&nil) } } + end + end + + # Just like `let`, except the block is invoked by an implicit `before` + # hook. This serves a dual purpose of setting up state and providing a + # memoized reference to that state. + # + # @example + # + # class Thing + # def self.count + # @count ||= 0 + # end + # + # def self.count=(val) + # @count += val + # end + # + # def self.reset_count + # @count = 0 + # end + # + # def initialize + # self.class.count += 1 + # end + # end + # + # RSpec.describe Thing do + # after(:example) { Thing.reset_count } + # + # context "using let" do + # let(:thing) { Thing.new } + # + # it "is not invoked implicitly" do + # Thing.count.should eq(0) + # end + # + # it "can be invoked explicitly" do + # thing + # Thing.count.should eq(1) + # end + # end + # + # context "using let!" do + # let!(:thing) { Thing.new } + # + # it "is invoked implicitly" do + # Thing.count.should eq(1) + # end + # + # it "returns memoized version on first invocation" do + # thing + # Thing.count.should eq(1) + # end + # end + # end + def let!(name, &block) + let(name, &block) + before { __send__(name) } + end + + # Declares a `subject` for an example group which can then be wrapped + # with `expect` using `is_expected` to make it the target of an + # expectation in a concise, one-line example. + # + # Given a `name`, defines a method with that name which returns the + # `subject`. This lets you declare the subject once and access it + # implicitly in one-liners and explicitly using an intention revealing + # name. + # + # When given a `name`, calling `super` in the block is not supported. + # + # @note `subject` can be configured to be threadsafe or not. + # If it is threadsafe, it will take longer to access the value. + # If it is not threadsafe, it may behave in surprising ways in examples + # that spawn separate threads. Specify this on `RSpec.configure` + # + # @param name [String,Symbol] used to define an accessor with an + # intention revealing name + # @param block defines the value to be returned by `subject` in examples + # + # @example + # + # RSpec.describe CheckingAccount, "with $50" do + # subject { CheckingAccount.new(Money.new(50, :USD)) } + # it { is_expected.to have_a_balance_of(Money.new(50, :USD)) } + # it { is_expected.not_to be_overdrawn } + # end + # + # RSpec.describe CheckingAccount, "with a non-zero starting balance" do + # subject(:account) { CheckingAccount.new(Money.new(50, :USD)) } + # it { is_expected.not_to be_overdrawn } + # it "has a balance equal to the starting balance" do + # account.balance.should eq(Money.new(50, :USD)) + # end + # end + # + # @see MemoizedHelpers#should + # @see MemoizedHelpers#should_not + # @see MemoizedHelpers#is_expected + def subject(name=nil, &block) + if name + let(name, &block) + alias_method :subject, name + + self::NamedSubjectPreventSuper.__send__(:define_method, name) do + raise NotImplementedError, "`super` in named subjects is not supported" + end + else + let(:subject, &block) + end + end + + # Just like `subject`, except the block is invoked by an implicit + # `before` hook. This serves a dual purpose of setting up state and + # providing a memoized reference to that state. + # + # @example + # + # class Thing + # def self.count + # @count ||= 0 + # end + # + # def self.count=(val) + # @count += val + # end + # + # def self.reset_count + # @count = 0 + # end + # + # def initialize + # self.class.count += 1 + # end + # end + # + # RSpec.describe Thing do + # after(:example) { Thing.reset_count } + # + # context "using subject" do + # subject { Thing.new } + # + # it "is not invoked implicitly" do + # Thing.count.should eq(0) + # end + # + # it "can be invoked explicitly" do + # subject + # Thing.count.should eq(1) + # end + # end + # + # context "using subject!" do + # subject!(:thing) { Thing.new } + # + # it "is invoked implicitly" do + # Thing.count.should eq(1) + # end + # + # it "returns memoized version on first invocation" do + # subject + # Thing.count.should eq(1) + # end + # end + # end + def subject!(name=nil, &block) + subject(name, &block) + before { subject } + end + end + + # @private + # + # Gets the LetDefinitions module. The module is mixed into + # the example group and is used to hold all let definitions. + # This is done so that the block passed to `let` can be + # forwarded directly on to `define_method`, so that all method + # constructs (including `super` and `return`) can be used in + # a `let` block. + # + # The memoization is provided by a method definition on the + # example group that supers to the LetDefinitions definition + # in order to get the value to memoize. + def self.module_for(example_group) + get_constant_or_yield(example_group, :LetDefinitions) do + mod = Module.new do + include(Module.new { + example_group.const_set(:NamedSubjectPreventSuper, self) + }) + end + + example_group.const_set(:LetDefinitions, mod) + mod + end + end + + # @private + def self.define_helpers_on(example_group) + example_group.__send__(:include, module_for(example_group)) + end + + if Module.method(:const_defined?).arity == 1 # for 1.8 + # @private + # + # Gets the named constant or yields. + # On 1.8, const_defined? / const_get do not take into + # account the inheritance hierarchy. + # :nocov: + def self.get_constant_or_yield(example_group, name) + if example_group.const_defined?(name) + example_group.const_get(name) + else + yield + end + end + # :nocov: + else + # @private + # + # Gets the named constant or yields. + # On 1.9, const_defined? / const_get take into account the + # the inheritance by default, and accept an argument to + # disable this behavior. It's important that we don't + # consider inheritance here; each example group level that + # uses a `let` should get its own `LetDefinitions` module. + def self.get_constant_or_yield(example_group, name) + if example_group.const_defined?(name, (check_ancestors = false)) + example_group.const_get(name, check_ancestors) + else + yield + end + end + end + end + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/rspec-core-3.11.0/lib/rspec/core/metadata.rb b/vendor/bundle/ruby/3.1.0/gems/rspec-core-3.11.0/lib/rspec/core/metadata.rb new file mode 100644 index 000000000..5e0d7e2bd --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/rspec-core-3.11.0/lib/rspec/core/metadata.rb @@ -0,0 +1,498 @@ +module RSpec + module Core + # Each ExampleGroup class and Example instance owns an instance of + # Metadata, which is Hash extended to support lazy evaluation of values + # associated with keys that may or may not be used by any example or group. + # + # In addition to metadata that is used internally, this also stores + # user-supplied metadata, e.g. + # + # RSpec.describe Something, :type => :ui do + # it "does something", :slow => true do + # # ... + # end + # end + # + # `:type => :ui` is stored in the Metadata owned by the example group, and + # `:slow => true` is stored in the Metadata owned by the example. These can + # then be used to select which examples are run using the `--tag` option on + # the command line, or several methods on `Configuration` used to filter a + # run (e.g. `filter_run_including`, `filter_run_excluding`, etc). + # + # @see Example#metadata + # @see ExampleGroup.metadata + # @see FilterManager + # @see Configuration#filter_run_including + # @see Configuration#filter_run_excluding + module Metadata + # Matches strings either at the beginning of the input or prefixed with a + # whitespace, containing the current path, either postfixed with the + # separator, or at the end of the string. Match groups are the character + # before and the character after the string if any. + # + # http://rubular.com/r/fT0gmX6VJX + # http://rubular.com/r/duOrD4i3wb + # http://rubular.com/r/sbAMHFrOx1 + def self.relative_path_regex + @relative_path_regex ||= /(\A|\s)#{File.expand_path('.')}(#{File::SEPARATOR}|\s|\Z)/ + end + + # @api private + # + # @param line [String] current code line + # @return [String] relative path to line + def self.relative_path(line) + line = line.sub(relative_path_regex, "\\1.\\2".freeze) + line = line.sub(/\A([^:]+:\d+)$/, '\\1'.freeze) + return nil if line == '-e:1'.freeze + line + rescue SecurityError + # :nocov: + nil + # :nocov: + end + + # @private + # Iteratively walks up from the given metadata through all + # example group ancestors, yielding each metadata hash along the way. + def self.ascending(metadata) + yield metadata + return unless (group_metadata = metadata.fetch(:example_group) { metadata[:parent_example_group] }) + + loop do + yield group_metadata + break unless (group_metadata = group_metadata[:parent_example_group]) + end + end + + # @private + # Returns an enumerator that iteratively walks up the given metadata through all + # example group ancestors, yielding each metadata hash along the way. + def self.ascend(metadata) + enum_for(:ascending, metadata) + end + + # @private + # Used internally to build a hash from an args array. + # Symbols are converted into hash keys with a value of `true`. + # This is done to support simple tagging using a symbol, rather + # than needing to do `:symbol => true`. + def self.build_hash_from(args, warn_about_example_group_filtering=false) + hash = args.last.is_a?(Hash) ? args.pop : {} + + hash[args.pop] = true while args.last.is_a?(Symbol) + + if warn_about_example_group_filtering && hash.key?(:example_group) + RSpec.deprecate("Filtering by an `:example_group` subhash", + :replacement => "the subhash to filter directly") + end + + hash + end + + # @private + def self.deep_hash_dup(object) + return object.dup if Array === object + return object unless Hash === object + + object.inject(object.dup) do |duplicate, (key, value)| + duplicate[key] = deep_hash_dup(value) + duplicate + end + end + + # @private + def self.id_from(metadata) + "#{metadata[:rerun_file_path]}[#{metadata[:scoped_id]}]" + end + + # @private + def self.location_tuple_from(metadata) + [metadata[:absolute_file_path], metadata[:line_number]] + end + + # @private + # Used internally to populate metadata hashes with computed keys + # managed by RSpec. + class HashPopulator + attr_reader :metadata, :user_metadata, :description_args, :block + + def initialize(metadata, user_metadata, index_provider, description_args, block) + @metadata = metadata + @user_metadata = user_metadata + @index_provider = index_provider + @description_args = description_args + @block = block + end + + def populate + ensure_valid_user_keys + + metadata[:block] = block + metadata[:description_args] = description_args + metadata[:description] = build_description_from(*metadata[:description_args]) + metadata[:full_description] = full_description + metadata[:described_class] = described_class + + populate_location_attributes + metadata.update(user_metadata) + end + + private + + def populate_location_attributes + backtrace = user_metadata.delete(:caller) + + file_path, line_number = if backtrace + file_path_and_line_number_from(backtrace) + elsif block.respond_to?(:source_location) + block.source_location + else + file_path_and_line_number_from(caller) + end + + relative_file_path = Metadata.relative_path(file_path) + absolute_file_path = File.expand_path(relative_file_path) + metadata[:file_path] = relative_file_path + metadata[:line_number] = line_number.to_i + metadata[:location] = "#{relative_file_path}:#{line_number}" + metadata[:absolute_file_path] = absolute_file_path + metadata[:rerun_file_path] ||= relative_file_path + metadata[:scoped_id] = build_scoped_id_for(absolute_file_path) + end + + def file_path_and_line_number_from(backtrace) + first_caller_from_outside_rspec = backtrace.find { |l| l !~ CallerFilter::LIB_REGEX } + first_caller_from_outside_rspec ||= backtrace.first + /(.+?):(\d+)(?:|:\d+)/.match(first_caller_from_outside_rspec).captures + end + + def description_separator(parent_part, child_part) + if parent_part.is_a?(Module) && /^(?:#|::|\.)/.match(child_part.to_s) + ''.freeze + else + ' '.freeze + end + end + + def build_description_from(parent_description=nil, my_description=nil) + return parent_description.to_s unless my_description + return my_description.to_s if parent_description.to_s == '' + separator = description_separator(parent_description, my_description) + (parent_description.to_s + separator) << my_description.to_s + end + + def build_scoped_id_for(file_path) + index = @index_provider.call(file_path).to_s + parent_scoped_id = metadata.fetch(:scoped_id) { return index } + "#{parent_scoped_id}:#{index}" + end + + def ensure_valid_user_keys + RESERVED_KEYS.each do |key| + next unless user_metadata.key?(key) + raise <<-EOM.gsub(/^\s+\|/, '') + |#{"*" * 50} + |:#{key} is not allowed + | + |RSpec reserves some hash keys for its own internal use, + |including :#{key}, which is used on: + | + | #{CallerFilter.first_non_rspec_line}. + | + |Here are all of RSpec's reserved hash keys: + | + | #{RESERVED_KEYS.join("\n ")} + |#{"*" * 50} + EOM + end + end + end + + # @private + class ExampleHash < HashPopulator + def self.create(group_metadata, user_metadata, index_provider, description, block) + example_metadata = group_metadata.dup + group_metadata = Hash.new(&ExampleGroupHash.backwards_compatibility_default_proc do |hash| + hash[:parent_example_group] + end) + group_metadata.update(example_metadata) + + example_metadata[:execution_result] = Example::ExecutionResult.new + example_metadata[:example_group] = group_metadata + example_metadata[:shared_group_inclusion_backtrace] = SharedExampleGroupInclusionStackFrame.current_backtrace + example_metadata.delete(:parent_example_group) + + description_args = description.nil? ? [] : [description] + hash = new(example_metadata, user_metadata, index_provider, description_args, block) + hash.populate + hash.metadata + end + + private + + def described_class + metadata[:example_group][:described_class] + end + + def full_description + build_description_from( + metadata[:example_group][:full_description], + metadata[:description] + ) + end + end + + # @private + class ExampleGroupHash < HashPopulator + def self.create(parent_group_metadata, user_metadata, example_group_index, *args, &block) + group_metadata = hash_with_backwards_compatibility_default_proc + + if parent_group_metadata + group_metadata.update(parent_group_metadata) + group_metadata[:parent_example_group] = parent_group_metadata + end + + hash = new(group_metadata, user_metadata, example_group_index, args, block) + hash.populate + hash.metadata + end + + def self.hash_with_backwards_compatibility_default_proc + Hash.new(&backwards_compatibility_default_proc { |hash| hash }) + end + + def self.backwards_compatibility_default_proc(&example_group_selector) + Proc.new do |hash, key| + case key + when :example_group + # We commonly get here when rspec-core is applying a previously + # configured filter rule, such as when a gem configures: + # + # RSpec.configure do |c| + # c.include MyGemHelpers, :example_group => { :file_path => /spec\/my_gem_specs/ } + # end + # + # It's confusing for a user to get a deprecation at this point in + # the code, so instead we issue a deprecation from the config APIs + # that take a metadata hash, and MetadataFilter sets this thread + # local to silence the warning here since it would be so + # confusing. + unless RSpec::Support.thread_local_data[:silence_metadata_example_group_deprecations] + RSpec.deprecate("The `:example_group` key in an example group's metadata hash", + :replacement => "the example group's hash directly for the " \ + "computed keys and `:parent_example_group` to access the parent " \ + "example group metadata") + end + + group_hash = example_group_selector.call(hash) + LegacyExampleGroupHash.new(group_hash) if group_hash + when :example_group_block + RSpec.deprecate("`metadata[:example_group_block]`", + :replacement => "`metadata[:block]`") + hash[:block] + when :describes + RSpec.deprecate("`metadata[:describes]`", + :replacement => "`metadata[:described_class]`") + hash[:described_class] + end + end + end + + private + + def described_class + candidate = metadata[:description_args].first + return candidate unless NilClass === candidate || String === candidate + parent_group = metadata[:parent_example_group] + parent_group && parent_group[:described_class] + end + + def full_description + description = metadata[:description] + parent_example_group = metadata[:parent_example_group] + return description unless parent_example_group + + parent_description = parent_example_group[:full_description] + separator = description_separator(parent_example_group[:description_args].last, + metadata[:description_args].first) + + parent_description + separator + description + end + end + + # @private + RESERVED_KEYS = [ + :description, + :description_args, + :described_class, + :example_group, + :parent_example_group, + :execution_result, + :last_run_status, + :file_path, + :absolute_file_path, + :rerun_file_path, + :full_description, + :line_number, + :location, + :scoped_id, + :block, + :shared_group_inclusion_backtrace + ] + end + + # Mixin that makes the including class imitate a hash for backwards + # compatibility. The including class should use `attr_accessor` to + # declare attributes. + # @private + module HashImitatable + def self.included(klass) + klass.extend ClassMethods + end + + def to_h + hash = extra_hash_attributes.dup + + self.class.hash_attribute_names.each do |name| + hash[name] = __send__(name) + end + + hash + end + + (Hash.public_instance_methods - Object.public_instance_methods).each do |method_name| + next if [:[], :[]=, :to_h].include?(method_name.to_sym) + + define_method(method_name) do |*args, &block| + issue_deprecation(method_name, *args) + + hash = hash_for_delegation + self.class.hash_attribute_names.each do |name| + hash.delete(name) unless instance_variable_defined?(:"@#{name}") + end + + hash.__send__(method_name, *args, &block).tap do + # apply mutations back to the object + hash.each do |name, value| + if directly_supports_attribute?(name) + set_value(name, value) + else + extra_hash_attributes[name] = value + end + end + end + end + end + + def [](key) + issue_deprecation(:[], key) + + if directly_supports_attribute?(key) + get_value(key) + else + extra_hash_attributes[key] + end + end + + def []=(key, value) + issue_deprecation(:[]=, key, value) + + if directly_supports_attribute?(key) + set_value(key, value) + else + extra_hash_attributes[key] = value + end + end + + private + + def extra_hash_attributes + @extra_hash_attributes ||= {} + end + + def directly_supports_attribute?(name) + self.class.hash_attribute_names.include?(name) + end + + def get_value(name) + __send__(name) + end + + def set_value(name, value) + __send__(:"#{name}=", value) + end + + def hash_for_delegation + to_h + end + + def issue_deprecation(_method_name, *_args) + # no-op by default: subclasses can override + end + + # @private + module ClassMethods + def hash_attribute_names + @hash_attribute_names ||= [] + end + + def attr_accessor(*names) + hash_attribute_names.concat(names) + super + end + end + end + + # @private + # Together with the example group metadata hash default block, + # provides backwards compatibility for the old `:example_group` + # key. In RSpec 2.x, the computed keys of a group's metadata + # were exposed from a nested subhash keyed by `[:example_group]`, and + # then the parent group's metadata was exposed by sub-subhash + # keyed by `[:example_group][:example_group]`. + # + # In RSpec 3, we reorganized this to that the computed keys are + # exposed directly of the group metadata hash (no nesting), and + # `:parent_example_group` returns the parent group's metadata. + # + # Maintaining backwards compatibility was difficult: we wanted + # `:example_group` to return an object that: + # + # * Exposes the top-level metadata keys that used to be nested + # under `:example_group`. + # * Supports mutation (rspec-rails, for example, assigns + # `metadata[:example_group][:described_class]` when you use + # anonymous controller specs) such that changes are written + # back to the top-level metadata hash. + # * Exposes the parent group metadata as + # `[:example_group][:example_group]`. + class LegacyExampleGroupHash + include HashImitatable + + def initialize(metadata) + @metadata = metadata + parent_group_metadata = metadata.fetch(:parent_example_group) { {} }[:example_group] + self[:example_group] = parent_group_metadata if parent_group_metadata + end + + def to_h + super.merge(@metadata) + end + + private + + def directly_supports_attribute?(name) + name != :example_group + end + + def get_value(name) + @metadata[name] + end + + def set_value(name, value) + @metadata[name] = value + end + end + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/rspec-core-3.11.0/lib/rspec/core/metadata_filter.rb b/vendor/bundle/ruby/3.1.0/gems/rspec-core-3.11.0/lib/rspec/core/metadata_filter.rb new file mode 100644 index 000000000..9906f7de5 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/rspec-core-3.11.0/lib/rspec/core/metadata_filter.rb @@ -0,0 +1,255 @@ +module RSpec + module Core + # Contains metadata filtering logic. This has been extracted from + # the metadata classes because it operates ON a metadata hash but + # does not manage any of the state in the hash. We're moving towards + # having metadata be a raw hash (not a custom subclass), so externalizing + # this filtering logic helps us move in that direction. + module MetadataFilter + class << self + # @private + def apply?(predicate, filters, metadata) + filters.__send__(predicate) { |k, v| filter_applies?(k, v, metadata) } + end + + # @private + def filter_applies?(key, filter_value, metadata) + silence_metadata_example_group_deprecations do + return location_filter_applies?(filter_value, metadata) if key == :locations + return id_filter_applies?(filter_value, metadata) if key == :ids + return filters_apply?(key, filter_value, metadata) if Hash === filter_value + + meta_value = metadata.fetch(key) { return false } + + return true if TrueClass === filter_value && meta_value + return proc_filter_applies?(key, filter_value, metadata) if Proc === filter_value + return filter_applies_to_any_value?(key, filter_value, metadata) if Array === meta_value + + filter_value === meta_value || filter_value.to_s == meta_value.to_s + end + end + + # @private + def silence_metadata_example_group_deprecations + RSpec::Support.thread_local_data[:silence_metadata_example_group_deprecations] = true + yield + ensure + RSpec::Support.thread_local_data.delete(:silence_metadata_example_group_deprecations) + end + + private + + def filter_applies_to_any_value?(key, value, metadata) + metadata[key].any? { |v| filter_applies?(key, v, key => value) } + end + + def id_filter_applies?(rerun_paths_to_scoped_ids, metadata) + scoped_ids = rerun_paths_to_scoped_ids.fetch(metadata[:rerun_file_path]) { return false } + + Metadata.ascend(metadata).any? do |meta| + scoped_ids.include?(meta[:scoped_id]) + end + end + + def location_filter_applies?(locations, metadata) + Metadata.ascend(metadata).any? do |meta| + file_path = meta[:absolute_file_path] + line_num = meta[:line_number] + + locations[file_path].any? do |filter_line_num| + line_num == RSpec.world.preceding_declaration_line(file_path, filter_line_num) + end + end + end + + def proc_filter_applies?(key, proc, metadata) + case proc.arity + when 0 then proc.call + when 2 then proc.call(metadata[key], metadata) + else proc.call(metadata[key]) + end + end + + def filters_apply?(key, value, metadata) + subhash = metadata[key] + return false unless Hash === subhash || HashImitatable === subhash + value.all? { |k, v| filter_applies?(k, v, subhash) } + end + end + end + + # Tracks a collection of filterable items (e.g. modules, hooks, etc) + # and provides an optimized API to get the applicable items for the + # metadata of an example or example group. + # + # There are two implementations, optimized for different uses. + # @private + module FilterableItemRepository + # This implementation is simple, and is optimized for frequent + # updates but rare queries. `append` and `prepend` do no extra + # processing, and no internal memoization is done, since this + # is not optimized for queries. + # + # This is ideal for use by a example or example group, which may + # be updated multiple times with globally configured hooks, etc, + # but will not be queried frequently by other examples or examle + # groups. + # @private + class UpdateOptimized + attr_reader :items_and_filters + + def initialize(applies_predicate) + @applies_predicate = applies_predicate + @items_and_filters = [] + end + + def append(item, metadata) + @items_and_filters << [item, metadata] + end + + def prepend(item, metadata) + @items_and_filters.unshift [item, metadata] + end + + def delete(item, metadata) + @items_and_filters.delete [item, metadata] + end + + def items_for(request_meta) + @items_and_filters.each_with_object([]) do |(item, item_meta), to_return| + to_return << item if item_meta.empty? || + MetadataFilter.apply?(@applies_predicate, item_meta, request_meta) + end + end + + unless [].respond_to?(:each_with_object) # For 1.8.7 + # :nocov: + undef items_for + def items_for(request_meta) + @items_and_filters.inject([]) do |to_return, (item, item_meta)| + to_return << item if item_meta.empty? || + MetadataFilter.apply?(@applies_predicate, item_meta, request_meta) + to_return + end + end + # :nocov: + end + end + + # This implementation is much more complex, and is optimized for + # rare (or hopefully no) updates once the queries start. Updates + # incur a cost as it has to clear the memoization and keep track + # of applicable keys. Queries will be O(N) the first time an item + # is provided with a given set of applicable metadata; subsequent + # queries with items with the same set of applicable metadata will + # be O(1) due to internal memoization. + # + # This is ideal for use by config, where filterable items (e.g. hooks) + # are typically added at the start of the process (e.g. in `spec_helper`) + # and then repeatedly queried as example groups and examples are defined. + # @private + class QueryOptimized < UpdateOptimized + alias find_items_for items_for + private :find_items_for + + def initialize(applies_predicate) + super + @applicable_keys = Set.new + @proc_keys = Set.new + @memoized_lookups = Hash.new do |hash, applicable_metadata| + hash[applicable_metadata] = find_items_for(applicable_metadata) + end + end + + def append(item, metadata) + super + handle_mutation(metadata) + end + + def prepend(item, metadata) + super + handle_mutation(metadata) + end + + def delete(item, metadata) + super + reconstruct_caches + end + + def items_for(metadata) + # The filtering of `metadata` to `applicable_metadata` is the key thing + # that makes the memoization actually useful in practice, since each + # example and example group have different metadata (e.g. location and + # description). By filtering to the metadata keys our items care about, + # we can ignore extra metadata keys that differ for each example/group. + # For example, given `config.include DBHelpers, :db`, example groups + # can be split into these two sets: those that are tagged with `:db` and those + # that are not. For each set, this method for the first group in the set is + # still an `O(N)` calculation, but all subsequent groups in the set will be + # constant time lookups when they call this method. + applicable_metadata = applicable_metadata_from(metadata) + + if applicable_metadata.any? { |k, _| @proc_keys.include?(k) } + # It's unsafe to memoize lookups involving procs (since they can + # be non-deterministic), so we skip the memoization in this case. + find_items_for(applicable_metadata) + else + @memoized_lookups[applicable_metadata] + end + end + + private + + def reconstruct_caches + @applicable_keys.clear + @proc_keys.clear + @items_and_filters.each do |_item, metadata| + handle_mutation(metadata) + end + end + + def handle_mutation(metadata) + @applicable_keys.merge(metadata.keys) + @proc_keys.merge(proc_keys_from metadata) + @memoized_lookups.clear + end + + def applicable_metadata_from(metadata) + MetadataFilter.silence_metadata_example_group_deprecations do + @applicable_keys.inject({}) do |hash, key| + # :example_group is treated special here because... + # - In RSpec 2, example groups had an `:example_group` key + # - In RSpec 3, that key is deprecated (it was confusing!). + # - The key is not technically present in an example group metadata hash + # (and thus would fail the `metadata.key?(key)` check) but a value + # is provided when accessed via the hash's `default_proc` + # - Thus, for backwards compatibility, we have to explicitly check + # for `:example_group` here if it is one of the keys being used to + # filter. + hash[key] = metadata[key] if metadata.key?(key) || key == :example_group + hash + end + end + end + + def proc_keys_from(metadata) + metadata.each_with_object([]) do |(key, value), to_return| + to_return << key if Proc === value + end + end + + unless [].respond_to?(:each_with_object) # For 1.8.7 + # :nocov: + undef proc_keys_from + def proc_keys_from(metadata) + metadata.inject([]) do |to_return, (key, value)| + to_return << key if Proc === value + to_return + end + end + # :nocov: + end + end + end + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/rspec-core-3.11.0/lib/rspec/core/minitest_assertions_adapter.rb b/vendor/bundle/ruby/3.1.0/gems/rspec-core-3.11.0/lib/rspec/core/minitest_assertions_adapter.rb new file mode 100644 index 000000000..25db7514a --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/rspec-core-3.11.0/lib/rspec/core/minitest_assertions_adapter.rb @@ -0,0 +1,31 @@ +begin + # Only the minitest 5.x gem includes the minitest.rb and assertions.rb files. + require 'minitest' + require 'minitest/assertions' +rescue LoadError + # We must be using Ruby Core's MiniTest or the Minitest gem 4.x. + require 'minitest/unit' + Minitest = MiniTest +end + +module RSpec + module Core + # @private + module MinitestAssertionsAdapter + include ::Minitest::Assertions + # Need to forcefully include Pending after Minitest::Assertions + # to make sure our own #skip method beats Minitest's. + include ::RSpec::Core::Pending + + # Minitest 5.x requires this accessor to be available. See + # https://github.com/seattlerb/minitest/blob/38f0a5fcbd9c37c3f80a3eaad4ba84d3fc9947a0/lib/minitest/assertions.rb#L8 + # + # It is not required for other extension libraries, and RSpec does not + # report or make this information available to formatters. + attr_writer :assertions + def assertions + @assertions ||= 0 + end + end + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/rspec-core-3.11.0/lib/rspec/core/mocking_adapters/flexmock.rb b/vendor/bundle/ruby/3.1.0/gems/rspec-core-3.11.0/lib/rspec/core/mocking_adapters/flexmock.rb new file mode 100644 index 000000000..91475ae7f --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/rspec-core-3.11.0/lib/rspec/core/mocking_adapters/flexmock.rb @@ -0,0 +1,31 @@ +# Created by Jim Weirich on 2007-04-10. +# Copyright (c) 2007. All rights reserved. + +require 'flexmock/rspec' + +module RSpec + module Core + module MockingAdapters + # @private + module Flexmock + include ::FlexMock::MockContainer + + def self.framework_name + :flexmock + end + + def setup_mocks_for_rspec + # No setup required. + end + + def verify_mocks_for_rspec + flexmock_verify + end + + def teardown_mocks_for_rspec + flexmock_close + end + end + end + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/rspec-core-3.11.0/lib/rspec/core/mocking_adapters/mocha.rb b/vendor/bundle/ruby/3.1.0/gems/rspec-core-3.11.0/lib/rspec/core/mocking_adapters/mocha.rb new file mode 100644 index 000000000..8caf7b644 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/rspec-core-3.11.0/lib/rspec/core/mocking_adapters/mocha.rb @@ -0,0 +1,57 @@ +# In order to support all versions of mocha, we have to jump through some +# hoops here. +# +# mocha >= '0.13.0': +# require 'mocha/api' is required. +# require 'mocha/object' raises a LoadError b/c the file no longer exists. +# mocha < '0.13.0', >= '0.9.7' +# require 'mocha/api' is required. +# require 'mocha/object' is required. +# mocha < '0.9.7': +# require 'mocha/api' raises a LoadError b/c the file does not yet exist. +# require 'mocha/standalone' is required. +# require 'mocha/object' is required. +begin + require 'mocha/api' + + begin + require 'mocha/object' + rescue LoadError + # Mocha >= 0.13.0 no longer contains this file nor needs it to be loaded. + end +rescue LoadError + require 'mocha/standalone' + require 'mocha/object' +end + +module RSpec + module Core + module MockingAdapters + # @private + module Mocha + def self.framework_name + :mocha + end + + # Mocha::Standalone was deprecated as of Mocha 0.9.7. + begin + include ::Mocha::API + rescue NameError + include ::Mocha::Standalone + end + + def setup_mocks_for_rspec + mocha_setup + end + + def verify_mocks_for_rspec + mocha_verify + end + + def teardown_mocks_for_rspec + mocha_teardown + end + end + end + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/rspec-core-3.11.0/lib/rspec/core/mocking_adapters/null.rb b/vendor/bundle/ruby/3.1.0/gems/rspec-core-3.11.0/lib/rspec/core/mocking_adapters/null.rb new file mode 100644 index 000000000..442de9a70 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/rspec-core-3.11.0/lib/rspec/core/mocking_adapters/null.rb @@ -0,0 +1,14 @@ +module RSpec + module Core + module MockingAdapters + # @private + module Null + def setup_mocks_for_rspec; end + + def verify_mocks_for_rspec; end + + def teardown_mocks_for_rspec; end + end + end + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/rspec-core-3.11.0/lib/rspec/core/mocking_adapters/rr.rb b/vendor/bundle/ruby/3.1.0/gems/rspec-core-3.11.0/lib/rspec/core/mocking_adapters/rr.rb new file mode 100644 index 000000000..d72651a62 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/rspec-core-3.11.0/lib/rspec/core/mocking_adapters/rr.rb @@ -0,0 +1,31 @@ +require 'rr' + +RSpec.configuration.backtrace_exclusion_patterns.push(RR::Errors::BACKTRACE_IDENTIFIER) + +module RSpec + module Core + # @private + module MockingAdapters + # @private + module RR + def self.framework_name + :rr + end + + include ::RR::Extensions::InstanceMethods + + def setup_mocks_for_rspec + ::RR::Space.instance.reset + end + + def verify_mocks_for_rspec + ::RR::Space.instance.verify_doubles + end + + def teardown_mocks_for_rspec + ::RR::Space.instance.reset + end + end + end + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/rspec-core-3.11.0/lib/rspec/core/mocking_adapters/rspec.rb b/vendor/bundle/ruby/3.1.0/gems/rspec-core-3.11.0/lib/rspec/core/mocking_adapters/rspec.rb new file mode 100644 index 000000000..bb3f0ae66 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/rspec-core-3.11.0/lib/rspec/core/mocking_adapters/rspec.rb @@ -0,0 +1,32 @@ +require 'rspec/mocks' + +module RSpec + module Core + module MockingAdapters + # @private + module RSpec + include ::RSpec::Mocks::ExampleMethods + + def self.framework_name + :rspec + end + + def self.configuration + ::RSpec::Mocks.configuration + end + + def setup_mocks_for_rspec + ::RSpec::Mocks.setup + end + + def verify_mocks_for_rspec + ::RSpec::Mocks.verify + end + + def teardown_mocks_for_rspec + ::RSpec::Mocks.teardown + end + end + end + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/rspec-core-3.11.0/lib/rspec/core/notifications.rb b/vendor/bundle/ruby/3.1.0/gems/rspec-core-3.11.0/lib/rspec/core/notifications.rb new file mode 100644 index 000000000..16a3255cc --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/rspec-core-3.11.0/lib/rspec/core/notifications.rb @@ -0,0 +1,521 @@ +RSpec::Support.require_rspec_core "formatters/console_codes" +RSpec::Support.require_rspec_core "formatters/exception_presenter" +RSpec::Support.require_rspec_core "formatters/helpers" +RSpec::Support.require_rspec_core "shell_escape" + +module RSpec::Core + # Notifications are value objects passed to formatters to provide them + # with information about a particular event of interest. + module Notifications + # @private + module NullColorizer + module_function + + def wrap(line, _code_or_symbol) + line + end + end + + # The `StartNotification` represents a notification sent by the reporter + # when the suite is started. It contains the expected amount of examples + # to be executed, and the load time of RSpec. + # + # @attr count [Fixnum] the number counted + # @attr load_time [Float] the number of seconds taken to boot RSpec + # and load the spec files + StartNotification = Struct.new(:count, :load_time) + + # The `ExampleNotification` represents notifications sent by the reporter + # which contain information about the current (or soon to be) example. + # It is used by formatters to access information about that example. + # + # @example + # def example_started(notification) + # puts "Hey I started #{notification.example.description}" + # end + # + # @attr example [RSpec::Core::Example] the current example + ExampleNotification = Struct.new(:example) + class ExampleNotification + # @private + def self.for(example) + execution_result = example.execution_result + + return SkippedExampleNotification.new(example) if execution_result.example_skipped? + return new(example) unless execution_result.status == :pending || execution_result.status == :failed + + klass = if execution_result.pending_fixed? + PendingExampleFixedNotification + elsif execution_result.status == :pending + PendingExampleFailedAsExpectedNotification + else + FailedExampleNotification + end + + klass.new(example) + end + + private_class_method :new + end + + # The `ExamplesNotification` represents notifications sent by the reporter + # which contain information about the suites examples. + # + # @example + # def stop(notification) + # puts "Hey I ran #{notification.examples.size}" + # end + # + class ExamplesNotification + def initialize(reporter) + @reporter = reporter + end + + # @return [Array] list of examples + def examples + @reporter.examples + end + + # @return [Array] list of failed examples + def failed_examples + @reporter.failed_examples + end + + # @return [Array] list of pending examples + def pending_examples + @reporter.pending_examples + end + + # @return [Array] + # returns examples as notifications + def notifications + @notifications ||= format_examples(examples) + end + + # @return [Array] + # returns failed examples as notifications + def failure_notifications + @failed_notifications ||= format_examples(failed_examples) + end + + # @return [Array] + # returns pending examples as notifications + def pending_notifications + @pending_notifications ||= format_examples(pending_examples) + end + + # @return [String] The list of failed examples, fully formatted in the way + # that RSpec's built-in formatters emit. + def fully_formatted_failed_examples(colorizer=::RSpec::Core::Formatters::ConsoleCodes) + formatted = "\nFailures:\n" + + failure_notifications.each_with_index do |failure, index| + formatted += failure.fully_formatted(index.next, colorizer) + end + + formatted + end + + # @return [String] The list of pending examples, fully formatted in the + # way that RSpec's built-in formatters emit. + def fully_formatted_pending_examples(colorizer=::RSpec::Core::Formatters::ConsoleCodes) + formatted = "\nPending: (Failures listed here are expected and do not affect your suite's status)\n".dup + + pending_notifications.each_with_index do |notification, index| + formatted << notification.fully_formatted(index.next, colorizer) + end + + formatted + end + + private + + def format_examples(examples) + examples.map do |example| + ExampleNotification.for(example) + end + end + end + + # The `FailedExampleNotification` extends `ExampleNotification` with + # things useful for examples that have failure info -- typically a + # failed or pending spec. + # + # @example + # def example_failed(notification) + # puts "Hey I failed :(" + # puts "Here's my stack trace" + # puts notification.exception.backtrace.join("\n") + # end + # + # @attr [RSpec::Core::Example] example the current example + # @see ExampleNotification + class FailedExampleNotification < ExampleNotification + public_class_method :new + + # @return [Exception] The example failure + def exception + @exception_presenter.exception + end + + # @return [String] The example description + def description + @exception_presenter.description + end + + # Returns the message generated for this failure line by line. + # + # @return [Array] The example failure message + def message_lines + @exception_presenter.message_lines + end + + # Returns the message generated for this failure colorized line by line. + # + # @param colorizer [#wrap] An object to colorize the message_lines by + # @return [Array] The example failure message colorized + def colorized_message_lines(colorizer=::RSpec::Core::Formatters::ConsoleCodes) + @exception_presenter.colorized_message_lines(colorizer) + end + + # Returns the failures formatted backtrace. + # + # @return [Array] the examples backtrace lines + def formatted_backtrace + @exception_presenter.formatted_backtrace + end + + # Returns the failures colorized formatted backtrace. + # + # @param colorizer [#wrap] An object to colorize the message_lines by + # @return [Array] the examples colorized backtrace lines + def colorized_formatted_backtrace(colorizer=::RSpec::Core::Formatters::ConsoleCodes) + @exception_presenter.colorized_formatted_backtrace(colorizer) + end + + # @return [String] The failure information fully formatted in the way that + # RSpec's built-in formatters emit. + def fully_formatted(failure_number, colorizer=::RSpec::Core::Formatters::ConsoleCodes) + @exception_presenter.fully_formatted(failure_number, colorizer) + end + + # @return [Array] The failure information fully formatted in the way that + # RSpec's built-in formatters emit, split by line. + def fully_formatted_lines(failure_number, colorizer=::RSpec::Core::Formatters::ConsoleCodes) + @exception_presenter.fully_formatted_lines(failure_number, colorizer) + end + + private + + def initialize(example, exception_presenter=Formatters::ExceptionPresenter::Factory.new(example).build) + @exception_presenter = exception_presenter + super(example) + end + end + + # @deprecated Use {FailedExampleNotification} instead. + class PendingExampleFixedNotification < FailedExampleNotification; end + + # @deprecated Use {FailedExampleNotification} instead. + class PendingExampleFailedAsExpectedNotification < FailedExampleNotification; end + + # The `SkippedExampleNotification` extends `ExampleNotification` with + # things useful for specs that are skipped. + # + # @attr [RSpec::Core::Example] example the current example + # @see ExampleNotification + class SkippedExampleNotification < ExampleNotification + public_class_method :new + + # @return [String] The pending detail fully formatted in the way that + # RSpec's built-in formatters emit. + def fully_formatted(pending_number, colorizer=::RSpec::Core::Formatters::ConsoleCodes) + formatted_caller = RSpec.configuration.backtrace_formatter.backtrace_line(example.location) + + [ + colorizer.wrap("\n #{pending_number}) #{example.full_description}", :pending), + "\n ", + Formatters::ExceptionPresenter::PENDING_DETAIL_FORMATTER.call(example, colorizer), + "\n", + colorizer.wrap(" # #{formatted_caller}\n", :detail) + ].join("") + end + end + + # The `GroupNotification` represents notifications sent by the reporter + # which contain information about the currently running (or soon to be) + # example group. It is used by formatters to access information about that + # group. + # + # @example + # def example_group_started(notification) + # puts "Hey I started #{notification.group.description}" + # end + # @attr group [RSpec::Core::ExampleGroup] the current group + GroupNotification = Struct.new(:group) + + # The `MessageNotification` encapsulates generic messages that the reporter + # sends to formatters. + # + # @attr message [String] the message + MessageNotification = Struct.new(:message) + + # The `SeedNotification` holds the seed used to randomize examples and + # whether that seed has been used or not. + # + # @attr seed [Fixnum] the seed used to randomize ordering + # @attr used [Boolean] whether the seed has been used or not + SeedNotification = Struct.new(:seed, :used) + class SeedNotification + # @api + # @return [Boolean] has the seed been used? + def seed_used? + !!used + end + private :used + + # @return [String] The seed information fully formatted in the way that + # RSpec's built-in formatters emit. + def fully_formatted + "\nRandomized with seed #{seed}\n" + end + end + + # The `SummaryNotification` holds information about the results of running + # a test suite. It is used by formatters to provide information at the end + # of the test run. + # + # @attr duration [Float] the time taken (in seconds) to run the suite + # @attr examples [Array] the examples run + # @attr failed_examples [Array] the failed examples + # @attr pending_examples [Array] the pending examples + # @attr load_time [Float] the number of seconds taken to boot RSpec + # and load the spec files + # @attr errors_outside_of_examples_count [Integer] the number of errors that + # have occurred processing + # the spec suite + SummaryNotification = Struct.new(:duration, :examples, :failed_examples, + :pending_examples, :load_time, + :errors_outside_of_examples_count) + class SummaryNotification + # @api + # @return [Fixnum] the number of examples run + def example_count + @example_count ||= examples.size + end + + # @api + # @return [Fixnum] the number of failed examples + def failure_count + @failure_count ||= failed_examples.size + end + + # @api + # @return [Fixnum] the number of pending examples + def pending_count + @pending_count ||= pending_examples.size + end + + # @api + # @return [String] A line summarising the result totals of the spec run. + def totals_line + summary = Formatters::Helpers.pluralize(example_count, "example") + + ", " + Formatters::Helpers.pluralize(failure_count, "failure") + summary += ", #{pending_count} pending" if pending_count > 0 + if errors_outside_of_examples_count > 0 + summary += ( + ", " + + Formatters::Helpers.pluralize(errors_outside_of_examples_count, "error") + + " occurred outside of examples" + ) + end + summary + end + + # @api public + # + # Wraps the results line with colors based on the configured + # colors for failure, pending, and success. Defaults to red, + # yellow, green accordingly. + # + # @param colorizer [#wrap] An object which supports wrapping text with + # specific colors. + # @return [String] A colorized results line. + def colorized_totals_line(colorizer=::RSpec::Core::Formatters::ConsoleCodes) + if failure_count > 0 || errors_outside_of_examples_count > 0 + colorizer.wrap(totals_line, RSpec.configuration.failure_color) + elsif pending_count > 0 + colorizer.wrap(totals_line, RSpec.configuration.pending_color) + else + colorizer.wrap(totals_line, RSpec.configuration.success_color) + end + end + + # @api public + # + # Formats failures into a rerunable command format. + # + # @param colorizer [#wrap] An object which supports wrapping text with + # specific colors. + # @return [String] A colorized summary line. + def colorized_rerun_commands(colorizer=::RSpec::Core::Formatters::ConsoleCodes) + "\nFailed examples:\n\n" + + failed_examples.map do |example| + colorizer.wrap("rspec #{rerun_argument_for(example)}", RSpec.configuration.failure_color) + " " + + colorizer.wrap("# #{example.full_description}", RSpec.configuration.detail_color) + end.join("\n") + end + + # @return [String] a formatted version of the time it took to run the + # suite + def formatted_duration + Formatters::Helpers.format_duration(duration) + end + + # @return [String] a formatted version of the time it took to boot RSpec + # and load the spec files + def formatted_load_time + Formatters::Helpers.format_duration(load_time) + end + + # @return [String] The summary information fully formatted in the way that + # RSpec's built-in formatters emit. + def fully_formatted(colorizer=::RSpec::Core::Formatters::ConsoleCodes) + formatted = "\nFinished in #{formatted_duration} " \ + "(files took #{formatted_load_time} to load)\n" \ + "#{colorized_totals_line(colorizer)}\n" + + unless failed_examples.empty? + formatted += (colorized_rerun_commands(colorizer) + "\n") + end + + formatted + end + + private + + include RSpec::Core::ShellEscape + + def rerun_argument_for(example) + location = example.location_rerun_argument + return location unless duplicate_rerun_locations.include?(location) + conditionally_quote(example.id) + end + + def duplicate_rerun_locations + @duplicate_rerun_locations ||= begin + locations = RSpec.world.all_examples.map(&:location_rerun_argument) + + Set.new.tap do |s| + locations.group_by { |l| l }.each do |l, ls| + s << l if ls.count > 1 + end + end + end + end + end + + # The `ProfileNotification` holds information about the results of running a + # test suite when profiling is enabled. It is used by formatters to provide + # information at the end of the test run for profiling information. + # + # @attr duration [Float] the time taken (in seconds) to run the suite + # @attr examples [Array] the examples run + # @attr number_of_examples [Fixnum] the number of examples to profile + # @attr example_groups [Array] example groups run + class ProfileNotification + def initialize(duration, examples, number_of_examples, example_groups) + @duration = duration + @examples = examples + @number_of_examples = number_of_examples + @example_groups = example_groups + end + attr_reader :duration, :examples, :number_of_examples + + # @return [Array] the slowest examples + def slowest_examples + @slowest_examples ||= + examples.sort_by do |example| + -example.execution_result.run_time + end.first(number_of_examples) + end + + # @return [Float] the time taken (in seconds) to run the slowest examples + def slow_duration + @slow_duration ||= + slowest_examples.inject(0.0) do |i, e| + i + e.execution_result.run_time + end + end + + # @return [String] the percentage of total time taken + def percentage + @percentage ||= + begin + time_taken = slow_duration / duration + '%.1f' % ((time_taken.nan? ? 0.0 : time_taken) * 100) + end + end + + # @return [Array] the slowest example groups + def slowest_groups + @slowest_groups ||= calculate_slowest_groups + end + + private + + def calculate_slowest_groups + # stop if we've only one example group + return {} if @example_groups.keys.length <= 1 + + @example_groups.each_value do |hash| + hash[:average] = hash[:total_time].to_f / hash[:count] + end + + groups = @example_groups.sort_by { |_, hash| -hash[:average] }.first(number_of_examples) + groups.map { |group, data| [group.location, data] } + end + end + + # The `DeprecationNotification` is issued by the reporter when a deprecated + # part of RSpec is encountered. It represents information about the + # deprecated call site. + # + # @attr message [String] A custom message about the deprecation + # @attr deprecated [String] A custom message about the deprecation (alias of + # message) + # @attr replacement [String] An optional replacement for the deprecation + # @attr call_site [String] An optional call site from which the deprecation + # was issued + DeprecationNotification = Struct.new(:deprecated, :message, :replacement, :call_site) + class DeprecationNotification + private_class_method :new + + # @api + # Convenience way to initialize the notification + def self.from_hash(data) + new data[:deprecated], data[:message], data[:replacement], data[:call_site] + end + end + + # `NullNotification` represents a placeholder value for notifications that + # currently require no information, but we may wish to extend in future. + class NullNotification + end + + # `CustomNotification` is used when sending custom events to formatters / + # other registered listeners, it creates attributes based on supplied hash + # of options. + class CustomNotification < Struct + # @param options [Hash] A hash of method / value pairs to create on this notification + # @return [CustomNotification] + # + # Build a custom notification based on the supplied option key / values. + def self.for(options={}) + return NullNotification if options.keys.empty? + new(*options.keys).new(*options.values) + end + end + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/rspec-core-3.11.0/lib/rspec/core/option_parser.rb b/vendor/bundle/ruby/3.1.0/gems/rspec-core-3.11.0/lib/rspec/core/option_parser.rb new file mode 100644 index 000000000..3af69eefd --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/rspec-core-3.11.0/lib/rspec/core/option_parser.rb @@ -0,0 +1,325 @@ +# http://www.ruby-doc.org/stdlib/libdoc/optparse/rdoc/classes/OptionParser.html +require 'optparse' + +module RSpec::Core + # @private + class Parser + def self.parse(args, source=nil) + new(args).parse(source) + end + + attr_reader :original_args + + def initialize(original_args) + @original_args = original_args + end + + def parse(source=nil) + return { :files_or_directories_to_run => [] } if original_args.empty? + args = original_args.dup + + options = args.delete('--tty') ? { :tty => true } : {} + begin + parser(options).parse!(args) + rescue OptionParser::InvalidOption => e + abort "#{e.message}#{" (defined in #{source})" if source}\n\n" \ + "Please use --help for a listing of valid options" + end + + options[:files_or_directories_to_run] = args + options + end + + private + + # rubocop:disable MethodLength + # rubocop:disable Metrics/AbcSize + # rubocop:disable CyclomaticComplexity + # rubocop:disable PerceivedComplexity + # rubocop:disable Metrics/BlockLength + def parser(options) + OptionParser.new do |parser| + parser.summary_width = 34 + + parser.banner = "Usage: rspec [options] [files or directories]\n\n" + + parser.on('-I PATH', 'Specify PATH to add to $LOAD_PATH (may be used more than once).') do |dirs| + options[:libs] ||= [] + options[:libs].concat(dirs.split(File::PATH_SEPARATOR)) + end + + parser.on('-r', '--require PATH', 'Require a file.') do |path| + options[:requires] ||= [] + options[:requires] << path + end + + parser.on('-O', '--options PATH', 'Specify the path to a custom options file.') do |path| + options[:custom_options_file] = path + end + + parser.on('--order TYPE[:SEED]', 'Run examples by the specified order type.', + ' [defined] examples and groups are run in the order they are defined', + ' [rand] randomize the order of groups and examples', + ' [random] alias for rand', + ' [random:SEED] e.g. --order random:123', + ' [recently-modified] run the most recently modified files first') do |o| + options[:order] = o + end + + parser.on('--seed SEED', Integer, 'Equivalent of --order rand:SEED.') do |seed| + options[:order] = "rand:#{seed}" + end + + parser.on('--bisect[=verbose]', 'Repeatedly runs the suite in order to isolate the failures to the ', + ' smallest reproducible case.') do |argument| + options[:bisect] = argument || true + options[:runner] = RSpec::Core::Invocations::Bisect.new + end + + parser.on('--[no-]fail-fast[=COUNT]', 'Abort the run after a certain number of failures (1 by default).') do |argument| + if argument == true + value = 1 + elsif argument == false || argument == 0 + value = false + else + begin + value = Integer(argument) + rescue ArgumentError + RSpec.warning "Expected an integer value for `--fail-fast`, got: #{argument.inspect}", :call_site => nil + end + end + set_fail_fast(options, value) + end + + parser.on('--failure-exit-code CODE', Integer, + 'Override the exit code used when there are failing specs.') do |code| + options[:failure_exit_code] = code + end + + parser.on('--error-exit-code CODE', Integer, + 'Override the exit code used when there are errors loading or running specs outside of examples.') do |code| + options[:error_exit_code] = code + end + + parser.on('-X', '--[no-]drb', 'Run examples via DRb.') do |use_drb| + options[:drb] = use_drb + options[:runner] = RSpec::Core::Invocations::DRbWithFallback.new if use_drb + end + + parser.on('--drb-port PORT', 'Port to connect to the DRb server.') do |o| + options[:drb_port] = o.to_i + end + + parser.separator("\n **** Output ****\n\n") + + parser.on('-f', '--format FORMATTER', 'Choose a formatter.', + ' [p]rogress (default - dots)', + ' [d]ocumentation (group and example names)', + ' [h]tml', + ' [j]son', + ' [f]ailures ("file:line:reason", suitable for editors integration)', + ' custom formatter class name') do |o| + options[:formatters] ||= [] + options[:formatters] << [o] + end + + parser.on('-o', '--out FILE', + 'Write output to a file instead of $stdout. This option applies', + ' to the previously specified --format, or the default format', + ' if no format is specified.' + ) do |o| + options[:formatters] ||= [['progress']] + options[:formatters].last << o + end + + parser.on('--deprecation-out FILE', 'Write deprecation warnings to a file instead of $stderr.') do |file| + options[:deprecation_stream] = file + end + + parser.on('-b', '--backtrace', 'Enable full backtrace.') do |_o| + options[:full_backtrace] = true + end + + parser.on('-c', '--color', '--colour', '') do |_o| + # flag will be excluded from `--help` output because it is deprecated + options[:color] = true + options[:color_mode] = :automatic + end + + parser.on('--force-color', '--force-colour', 'Force the output to be in color, even if the output is not a TTY') do |_o| + if options[:color_mode] == :off + abort "Please only use one of `--force-color` and `--no-color`" + end + options[:color_mode] = :on + end + + parser.on('--no-color', '--no-colour', 'Force the output to not be in color, even if the output is a TTY') do |_o| + if options[:color_mode] == :on + abort "Please only use one of --force-color and --no-color" + end + options[:color_mode] = :off + end + + parser.on('-p', '--[no-]profile [COUNT]', + 'Enable profiling of examples and list the slowest examples (default: 10).') do |argument| + options[:profile_examples] = if argument.nil? + true + elsif argument == false + false + else + begin + Integer(argument) + rescue ArgumentError + RSpec.warning "Non integer specified as profile count, separate " \ + "your path from options with -- e.g. " \ + "`rspec --profile -- #{argument}`", + :call_site => nil + true + end + end + end + + parser.on('--dry-run', 'Print the formatter output of your suite without', + ' running any examples or hooks') do |_o| + options[:dry_run] = true + end + + parser.on('-w', '--warnings', 'Enable ruby warnings') do + if Object.const_defined?(:Warning) && Warning.respond_to?(:[]=) + Warning[:deprecated] = true + end + $VERBOSE = true + end + + parser.separator <<-FILTERING + + **** Filtering/tags **** + + In addition to the following options for selecting specific files, groups, or + examples, you can select individual examples by appending the line number(s) to + the filename: + + rspec path/to/a_spec.rb:37:87 + + You can also pass example ids enclosed in square brackets: + + rspec path/to/a_spec.rb[1:5,1:6] # run the 5th and 6th examples/groups defined in the 1st group + +FILTERING + + parser.on('--only-failures', "Filter to just the examples that failed the last time they ran.") do + configure_only_failures(options) + end + + parser.on("-n", "--next-failure", "Apply `--only-failures` and abort after one failure.", + " (Equivalent to `--only-failures --fail-fast --order defined`)") do + configure_only_failures(options) + set_fail_fast(options, 1) + options[:order] ||= 'defined' + end + + parser.on('-P', '--pattern PATTERN', 'Load files matching pattern (default: "spec/**/*_spec.rb").') do |o| + if options[:pattern] + options[:pattern] += ',' + o + else + options[:pattern] = o + end + end + + parser.on('--exclude-pattern PATTERN', + 'Load files except those matching pattern. Opposite effect of --pattern.') do |o| + options[:exclude_pattern] = o + end + + parser.on('-e', '--example STRING', "Run examples whose full nested names include STRING (may be", + " used more than once)") do |o| + (options[:full_description] ||= []) << Regexp.compile(Regexp.escape(o)) + end + + parser.on('-E', '--example-matches REGEX', "Run examples whose full nested names match REGEX (may be", + " used more than once)") do |o| + (options[:full_description] ||= []) << Regexp.compile(o) + end + + parser.on('-t', '--tag TAG[:VALUE]', + 'Run examples with the specified tag, or exclude examples', + 'by adding ~ before the tag.', + ' - e.g. ~slow', + ' - TAG is always converted to a symbol') do |tag| + filter_type = tag =~ /^~/ ? :exclusion_filter : :inclusion_filter + + name, value = tag.gsub(/^(~@|~|@)/, '').split(':', 2) + name = name.to_sym + + parsed_value = case value + when nil then true # The default value for tags is true + when 'true' then true + when 'false' then false + when 'nil' then nil + when /^:/ then value[1..-1].to_sym + when /^\d+$/ then Integer(value) + when /^\d+.\d+$/ then Float(value) + else + value + end + + add_tag_filter(options, filter_type, name, parsed_value) + end + + parser.on('--default-path PATH', 'Set the default path where RSpec looks for examples (can', + ' be a path to a file or a directory).') do |path| + options[:default_path] = path + end + + parser.separator("\n **** Utility ****\n\n") + + parser.on('--init', 'Initialize your project with RSpec.') do |_cmd| + options[:runner] = RSpec::Core::Invocations::InitializeProject.new + end + + parser.on('-v', '--version', 'Display the version.') do + options[:runner] = RSpec::Core::Invocations::PrintVersion.new + end + + # These options would otherwise be confusing to users, so we forcibly + # prevent them from executing. + # + # * --I is too similar to -I. + # * -d was a shorthand for --debugger, which is removed, but now would + # trigger --default-path. + invalid_options = %w[-d --I] + + hidden_options = invalid_options + %w[-c] + + parser.on_tail('-h', '--help', "You're looking at it.") do + options[:runner] = RSpec::Core::Invocations::PrintHelp.new(parser, hidden_options) + end + + # This prevents usage of the invalid_options. + invalid_options.each do |option| + parser.on(option) do + raise OptionParser::InvalidOption.new + end + end + end + end + # rubocop:enable Metrics/BlockLength + # rubocop:enable Metrics/AbcSize + # rubocop:enable MethodLength + # rubocop:enable CyclomaticComplexity + # rubocop:enable PerceivedComplexity + + def add_tag_filter(options, filter_type, tag_name, value=true) + (options[filter_type] ||= {})[tag_name] = value + end + + def set_fail_fast(options, value) + options[:fail_fast] = value + end + + def configure_only_failures(options) + options[:only_failures] = true + add_tag_filter(options, :inclusion_filter, :last_run_status, 'failed') + end + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/rspec-core-3.11.0/lib/rspec/core/ordering.rb b/vendor/bundle/ruby/3.1.0/gems/rspec-core-3.11.0/lib/rspec/core/ordering.rb new file mode 100644 index 000000000..d852324dc --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/rspec-core-3.11.0/lib/rspec/core/ordering.rb @@ -0,0 +1,169 @@ +module RSpec + module Core + # @private + module Ordering + # @private + # The default global ordering (defined order). + class Identity + def order(items) + items + end + end + + # @private + # Orders items randomly. + class Random + def initialize(configuration) + @configuration = configuration + @used = false + end + + def used? + @used + end + + def order(items) + @used = true + + seed = @configuration.seed.to_s + items.sort_by { |item| jenkins_hash_digest(seed + item.id) } + end + + private + + # http://en.wikipedia.org/wiki/Jenkins_hash_function + # Jenkins provides a good distribution and is simpler than MD5. + # It's a bit slower than MD5 (primarily because `Digest::MD5` is + # implemented in C) but has the advantage of not requiring us + # to load another part of stdlib, which we try to minimize. + def jenkins_hash_digest(string) + hash = 0 + + string.each_byte do |byte| + hash += byte + hash &= MAX_32_BIT + hash += ((hash << 10) & MAX_32_BIT) + hash &= MAX_32_BIT + hash ^= hash >> 6 + end + + hash += ((hash << 3) & MAX_32_BIT) + hash &= MAX_32_BIT + hash ^= hash >> 11 + hash += ((hash << 15) & MAX_32_BIT) + hash &= MAX_32_BIT + hash + end + + MAX_32_BIT = 4_294_967_295 + end + + # @private + # Orders items by modification time (most recent modified first). + class RecentlyModified + def order(list) + list.sort_by { |item| -File.mtime(item.metadata[:absolute_file_path]).to_i } + end + end + + # @private + # Orders items based on a custom block. + class Custom + def initialize(callable) + @callable = callable + end + + def order(list) + @callable.call(list) + end + end + + # @private + # Stores the different ordering strategies. + class Registry + def initialize(configuration) + @configuration = configuration + @strategies = {} + + register(:random, Random.new(configuration)) + register(:recently_modified, RecentlyModified.new) + + identity = Identity.new + register(:defined, identity) + + # The default global ordering is --defined. + register(:global, identity) + end + + def fetch(name, &fallback) + @strategies.fetch(name, &fallback) + end + + def register(sym, strategy) + @strategies[sym] = strategy + end + + def used_random_seed? + @strategies[:random].used? + end + end + + # @private + # Manages ordering configuration. + # + # @note This is not intended to be used externally. Use + # the APIs provided by `RSpec::Core::Configuration` instead. + class ConfigurationManager + attr_reader :seed, :ordering_registry + + def initialize + @ordering_registry = Registry.new(self) + @seed = rand(0xFFFF) + @seed_forced = false + @order_forced = false + end + + def seed_used? + ordering_registry.used_random_seed? + end + + def seed=(seed) + return if @seed_forced + register_ordering(:global, ordering_registry.fetch(:random)) + @seed = seed.to_i + end + + def order=(type) + order, seed = type.to_s.split(':') + @seed = seed.to_i if seed + + ordering_name = if order.include?('rand') + :random + elsif order == 'defined' + :defined + elsif order == 'recently-modified' + :recently_modified + end + + register_ordering(:global, ordering_registry.fetch(ordering_name)) if ordering_name + end + + def force(hash) + if hash.key?(:seed) + self.seed = hash[:seed] + @seed_forced = true + @order_forced = true + elsif hash.key?(:order) + self.order = hash[:order] + @order_forced = true + end + end + + def register_ordering(name, strategy=Custom.new(Proc.new { |l| yield l })) + return if @order_forced && name == :global + ordering_registry.register(name, strategy) + end + end + end + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/rspec-core-3.11.0/lib/rspec/core/output_wrapper.rb b/vendor/bundle/ruby/3.1.0/gems/rspec-core-3.11.0/lib/rspec/core/output_wrapper.rb new file mode 100644 index 000000000..b655025cb --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/rspec-core-3.11.0/lib/rspec/core/output_wrapper.rb @@ -0,0 +1,29 @@ +module RSpec + module Core + # @private + class OutputWrapper + # @private + attr_accessor :output + + # @private + def initialize(output) + @output = output + end + + def respond_to?(name, priv=false) + output.respond_to?(name, priv) + end + + def method_missing(name, *args, &block) + output.send(name, *args, &block) + end + + # Redirect calls for IO interface methods + IO.instance_methods(false).each do |method| + define_method(method) do |*args, &block| + output.send(method, *args, &block) + end + end + end + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/rspec-core-3.11.0/lib/rspec/core/pending.rb b/vendor/bundle/ruby/3.1.0/gems/rspec-core-3.11.0/lib/rspec/core/pending.rb new file mode 100644 index 000000000..c0f394aee --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/rspec-core-3.11.0/lib/rspec/core/pending.rb @@ -0,0 +1,157 @@ +module RSpec + module Core + # Provides methods to mark examples as pending. These methods are available + # to be called from within any example or hook. + module Pending + # Raised in the middle of an example to indicate that it should be marked + # as skipped. + class SkipDeclaredInExample < StandardError + attr_reader :argument + + def initialize(argument) + @argument = argument + end + end + + # If Test::Unit is loaded, we'll use its error as baseclass, so that + # Test::Unit will report unmet RSpec expectations as failures rather than + # errors. + begin + class PendingExampleFixedError < Test::Unit::AssertionFailedError; end + rescue + class PendingExampleFixedError < StandardError; end + end + + # @private + NO_REASON_GIVEN = 'No reason given' + + # @private + NOT_YET_IMPLEMENTED = 'Not yet implemented' + + # @overload pending() + # @overload pending(message) + # + # Marks an example as pending. The rest of the example will still be + # executed, and if it passes the example will fail to indicate that the + # pending can be removed. + # + # @param message [String] optional message to add to the summary report. + # + # @example + # describe "some behaviour" do + # # reported as "Pending: no reason given" + # it "is pending with no message" do + # pending + # raise "broken" + # end + # + # # reported as "Pending: something else getting finished" + # it "is pending with a custom message" do + # pending("something else getting finished") + # raise "broken" + # end + # end + # + # @note When using `pending` inside an example body using this method + # hooks, such as `before(:example)`, have already be run. This means that + # a failure from the code in the `before` hook will prevent the example + # from being considered pending, as the example body would not be + # executed. If you need to consider hooks as pending as well you can use + # the pending metadata as an alternative, e.g. + # `it "does something", pending: "message"`. + def pending(message=nil) + current_example = RSpec.current_example + + if block_given? + raise ArgumentError, <<-EOS.gsub(/^\s+\|/, '') + |The semantics of `RSpec::Core::Pending#pending` have changed in + |RSpec 3. In RSpec 2.x, it caused the example to be skipped. In + |RSpec 3, the rest of the example is still run but is expected to + |fail, and will be marked as a failure (rather than as pending) if + |the example passes. + | + |Passing a block within an example is now deprecated. Marking the + |example as pending provides the same behavior in RSpec 3 which was + |provided only by the block in RSpec 2.x. + | + |Move the code in the block provided to `pending` into the rest of + |the example body. + | + |Called from #{CallerFilter.first_non_rspec_line}. + | + EOS + elsif current_example + Pending.mark_pending! current_example, message + else + raise "`pending` may not be used outside of examples, such as in " \ + "before(:context). Maybe you want `skip`?" + end + end + + # @overload skip() + # @overload skip(message) + # + # Marks an example as pending and skips execution. + # + # @param message [String] optional message to add to the summary report. + # + # @example + # describe "an example" do + # # reported as "Pending: no reason given" + # it "is skipped with no message" do + # skip + # end + # + # # reported as "Pending: something else getting finished" + # it "is skipped with a custom message" do + # skip "something else getting finished" + # end + # end + def skip(message=nil) + current_example = RSpec.current_example + + Pending.mark_skipped!(current_example, message) if current_example + + raise SkipDeclaredInExample.new(message) + end + + # @private + # + # Mark example as skipped. + # + # @param example [RSpec::Core::Example] the example to mark as skipped + # @param message_or_bool [Boolean, String] the message to use, or true + def self.mark_skipped!(example, message_or_bool) + Pending.mark_pending! example, message_or_bool + example.metadata[:skip] = true + end + + # @private + # + # Mark example as pending. + # + # @param example [RSpec::Core::Example] the example to mark as pending + # @param message_or_bool [Boolean, String] the message to use, or true + def self.mark_pending!(example, message_or_bool) + message = if !message_or_bool || !(String === message_or_bool) + NO_REASON_GIVEN + else + message_or_bool + end + + example.metadata[:pending] = true + example.execution_result.pending_message = message + example.execution_result.pending_fixed = false + end + + # @private + # + # Mark example as fixed. + # + # @param example [RSpec::Core::Example] the example to mark as fixed + def self.mark_fixed!(example) + example.execution_result.pending_fixed = true + end + end + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/rspec-core-3.11.0/lib/rspec/core/profiler.rb b/vendor/bundle/ruby/3.1.0/gems/rspec-core-3.11.0/lib/rspec/core/profiler.rb new file mode 100644 index 000000000..5e6527974 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/rspec-core-3.11.0/lib/rspec/core/profiler.rb @@ -0,0 +1,34 @@ +module RSpec + module Core + # @private + class Profiler + NOTIFICATIONS = [:example_group_started, :example_group_finished, :example_started] + + def initialize + @example_groups = Hash.new { |h, k| h[k] = { :count => 0 } } + end + + attr_reader :example_groups + + def example_group_started(notification) + return unless notification.group.top_level? + + @example_groups[notification.group][:start] = Time.now + @example_groups[notification.group][:description] = notification.group.top_level_description + end + + def example_group_finished(notification) + return unless notification.group.top_level? + + group = @example_groups[notification.group] + return unless group.key?(:start) + group[:total_time] = Time.now - group[:start] + end + + def example_started(notification) + group = notification.example.example_group.parent_groups.last + @example_groups[group][:count] += 1 + end + end + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/rspec-core-3.11.0/lib/rspec/core/project_initializer.rb b/vendor/bundle/ruby/3.1.0/gems/rspec-core-3.11.0/lib/rspec/core/project_initializer.rb new file mode 100644 index 000000000..ca707e036 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/rspec-core-3.11.0/lib/rspec/core/project_initializer.rb @@ -0,0 +1,48 @@ +RSpec::Support.require_rspec_support "directory_maker" + +module RSpec + module Core + # @private + # Generates conventional files for an RSpec project. + class ProjectInitializer + attr_reader :destination, :stream, :template_path + + DOT_RSPEC_FILE = '.rspec' + SPEC_HELPER_FILE = 'spec/spec_helper.rb' + + def initialize(opts={}) + @destination = opts.fetch(:destination, Dir.getwd) + @stream = opts.fetch(:report_stream, $stdout) + @template_path = opts.fetch(:template_path) do + File.expand_path("../project_initializer", __FILE__) + end + end + + def run + copy_template DOT_RSPEC_FILE + copy_template SPEC_HELPER_FILE + end + + private + + def copy_template(file) + destination_file = File.join(destination, file) + return report_exists(file) if File.exist?(destination_file) + + report_creating(file) + RSpec::Support::DirectoryMaker.mkdir_p(File.dirname(destination_file)) + File.open(destination_file, 'w') do |f| + f.write File.read(File.join(template_path, file)) + end + end + + def report_exists(file) + stream.puts " exist #{file}" + end + + def report_creating(file) + stream.puts " create #{file}" + end + end + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/rspec-core-3.11.0/lib/rspec/core/project_initializer/.rspec b/vendor/bundle/ruby/3.1.0/gems/rspec-core-3.11.0/lib/rspec/core/project_initializer/.rspec new file mode 100644 index 000000000..c99d2e739 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/rspec-core-3.11.0/lib/rspec/core/project_initializer/.rspec @@ -0,0 +1 @@ +--require spec_helper diff --git a/vendor/bundle/ruby/3.1.0/gems/rspec-core-3.11.0/lib/rspec/core/project_initializer/spec/spec_helper.rb b/vendor/bundle/ruby/3.1.0/gems/rspec-core-3.11.0/lib/rspec/core/project_initializer/spec/spec_helper.rb new file mode 100644 index 000000000..5ae5b6962 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/rspec-core-3.11.0/lib/rspec/core/project_initializer/spec/spec_helper.rb @@ -0,0 +1,98 @@ +# This file was generated by the `rspec --init` command. Conventionally, all +# specs live under a `spec` directory, which RSpec adds to the `$LOAD_PATH`. +# The generated `.rspec` file contains `--require spec_helper` which will cause +# this file to always be loaded, without a need to explicitly require it in any +# files. +# +# Given that it is always loaded, you are encouraged to keep this file as +# light-weight as possible. Requiring heavyweight dependencies from this file +# will add to the boot time of your test suite on EVERY test run, even for an +# individual file that may not need all of that loaded. Instead, consider making +# a separate helper file that requires the additional dependencies and performs +# the additional setup, and require it from the spec files that actually need +# it. +# +# See https://rubydoc.info/gems/rspec-core/RSpec/Core/Configuration +RSpec.configure do |config| + # rspec-expectations config goes here. You can use an alternate + # assertion/expectation library such as wrong or the stdlib/minitest + # assertions if you prefer. + config.expect_with :rspec do |expectations| + # This option will default to `true` in RSpec 4. It makes the `description` + # and `failure_message` of custom matchers include text for helper methods + # defined using `chain`, e.g.: + # be_bigger_than(2).and_smaller_than(4).description + # # => "be bigger than 2 and smaller than 4" + # ...rather than: + # # => "be bigger than 2" + expectations.include_chain_clauses_in_custom_matcher_descriptions = true + end + + # rspec-mocks config goes here. You can use an alternate test double + # library (such as bogus or mocha) by changing the `mock_with` option here. + config.mock_with :rspec do |mocks| + # Prevents you from mocking or stubbing a method that does not exist on + # a real object. This is generally recommended, and will default to + # `true` in RSpec 4. + mocks.verify_partial_doubles = true + end + + # This option will default to `:apply_to_host_groups` in RSpec 4 (and will + # have no way to turn it off -- the option exists only for backwards + # compatibility in RSpec 3). It causes shared context metadata to be + # inherited by the metadata hash of host groups and examples, rather than + # triggering implicit auto-inclusion in groups with matching metadata. + config.shared_context_metadata_behavior = :apply_to_host_groups + +# The settings below are suggested to provide a good initial experience +# with RSpec, but feel free to customize to your heart's content. +=begin + # This allows you to limit a spec run to individual examples or groups + # you care about by tagging them with `:focus` metadata. When nothing + # is tagged with `:focus`, all examples get run. RSpec also provides + # aliases for `it`, `describe`, and `context` that include `:focus` + # metadata: `fit`, `fdescribe` and `fcontext`, respectively. + config.filter_run_when_matching :focus + + # Allows RSpec to persist some state between runs in order to support + # the `--only-failures` and `--next-failure` CLI options. We recommend + # you configure your source control system to ignore this file. + config.example_status_persistence_file_path = "spec/examples.txt" + + # Limits the available syntax to the non-monkey patched syntax that is + # recommended. For more details, see: + # https://relishapp.com/rspec/rspec-core/docs/configuration/zero-monkey-patching-mode + config.disable_monkey_patching! + + # This setting enables warnings. It's recommended, but in some cases may + # be too noisy due to issues in dependencies. + config.warnings = true + + # Many RSpec users commonly either run the entire suite or an individual + # file, and it's useful to allow more verbose output when running an + # individual spec file. + if config.files_to_run.one? + # Use the documentation formatter for detailed output, + # unless a formatter has already been configured + # (e.g. via a command-line flag). + config.default_formatter = "doc" + end + + # Print the 10 slowest examples and example groups at the + # end of the spec run, to help surface which specs are running + # particularly slow. + config.profile_examples = 10 + + # Run specs in random order to surface order dependencies. If you find an + # order dependency and want to debug it, you can fix the order by providing + # the seed, which is printed after each run. + # --seed 1234 + config.order = :random + + # Seed global randomization in this process using the `--seed` CLI option. + # Setting this allows you to use `--seed` to deterministically reproduce + # test failures related to randomization by passing the same `--seed` value + # as the one that triggered the failure. + Kernel.srand config.seed +=end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/rspec-core-3.11.0/lib/rspec/core/rake_task.rb b/vendor/bundle/ruby/3.1.0/gems/rspec-core-3.11.0/lib/rspec/core/rake_task.rb new file mode 100644 index 000000000..8cf474a94 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/rspec-core-3.11.0/lib/rspec/core/rake_task.rb @@ -0,0 +1,188 @@ +require 'rake' +require 'rake/tasklib' +require 'rspec/support' + +RSpec::Support.require_rspec_support "ruby_features" + +# :nocov: +unless RSpec::Support.respond_to?(:require_rspec_core) + RSpec::Support.define_optimized_require_for_rspec(:core) { |f| require_relative "../#{f}" } +end +# :nocov: + +RSpec::Support.require_rspec_core "shell_escape" + +module RSpec + module Core + # RSpec rake task + # + # @see Rakefile + class RakeTask < ::Rake::TaskLib + include ::Rake::DSL if defined?(::Rake::DSL) + include RSpec::Core::ShellEscape + + # Default path to the RSpec executable. + DEFAULT_RSPEC_PATH = File.expand_path('../../../../exe/rspec', __FILE__) + + # Default pattern for spec files. + DEFAULT_PATTERN = 'spec/**{,/*/**}/*_spec.rb' + + # Name of task. Defaults to `:spec`. + attr_accessor :name + + # Files matching this pattern will be loaded. + # Defaults to `'spec/**{,/*/**}/*_spec.rb'`. + attr_accessor :pattern + + # Files matching this pattern will be excluded. + # Defaults to `nil`. + attr_accessor :exclude_pattern + + # Whether or not to fail Rake when an error occurs (typically when + # examples fail). Defaults to `true`. + attr_accessor :fail_on_error + + # A message to print to stderr when there are failures. + attr_accessor :failure_message + + if RUBY_VERSION < "1.9.0" || Support::Ruby.jruby? + # Run RSpec with a clean (empty) environment is not supported + def with_clean_environment=(_value) + raise ArgumentError, "Running in a clean environment is not supported on Ruby versions before 1.9.0" + end + + # Run RSpec with a clean (empty) environment is not supported + def with_clean_environment + false + end + else + # Run RSpec with a clean (empty) environment. + attr_accessor :with_clean_environment + end + + # Use verbose output. If this is set to true, the task will print the + # executed spec command to stdout. Defaults to `true`. + attr_accessor :verbose + + # Command line options to pass to ruby. Defaults to `nil`. + attr_accessor :ruby_opts + + # Path to RSpec. Defaults to the absolute path to the + # rspec binary from the loaded rspec-core gem. + attr_accessor :rspec_path + + # Command line options to pass to RSpec. Defaults to `nil`. + attr_accessor :rspec_opts + + def initialize(*args, &task_block) + @name = args.shift || :spec + @ruby_opts = nil + @rspec_opts = nil + @verbose = true + @fail_on_error = true + @rspec_path = DEFAULT_RSPEC_PATH + @pattern = DEFAULT_PATTERN + + define(args, &task_block) + end + + # @private + def run_task(verbose) + command = spec_command + puts command if verbose + + if with_clean_environment + return if system({}, command, :unsetenv_others => true) + else + return if system(command) + end + + puts failure_message if failure_message + + return unless fail_on_error + $stderr.puts "#{command} failed" if verbose + exit $?.exitstatus || 1 + end + + private + + # @private + def define(args, &task_block) + desc "Run RSpec code examples" unless ::Rake.application.last_description + + task name, *args do |_, task_args| + RakeFileUtils.__send__(:verbose, verbose) do + task_block.call(*[self, task_args].slice(0, task_block.arity)) if task_block + run_task verbose + end + end + end + + def file_inclusion_specification + if ENV['SPEC'] + FileList[ENV['SPEC']].sort + elsif String === pattern && !File.exist?(pattern) + return if [*rspec_opts].any? { |opt| opt =~ /--pattern/ } + "--pattern #{escape pattern}" + else + # Before RSpec 3.1, we used `FileList` to get the list of matched + # files, and then pass that along to the `rspec` command. Starting + # with 3.1, we prefer to pass along the pattern as-is to the `rspec` + # command, for 3 reasons: + # + # * It's *much* less verbose to pass one `--pattern` option than a + # long list of files. + # * It ensures `task.pattern` and `--pattern` have the same + # behavior. + # * It fixes a bug, where + # `task.pattern = pattern_that_matches_no_files` would run *all* + # files because it would cause no pattern or file args to get + # passed to `rspec`, which causes all files to get run. + # + # However, `FileList` is *far* more flexible than the `--pattern` + # option. Specifically, it supports individual files and directories, + # as well as arrays of files, directories and globs, as well as other + # `FileList` objects. + # + # For backwards compatibility, we have to fall back to using FileList + # if the user has passed a `pattern` option that will not work with + # `--pattern`. + # + # TODO: consider deprecating support for this and removing it in + # RSpec 4. + FileList[pattern].sort.map { |file| escape file } + end + end + + def file_exclusion_specification + " --exclude-pattern #{escape exclude_pattern}" if exclude_pattern + end + + def spec_command + cmd_parts = [] + cmd_parts << RUBY + cmd_parts << ruby_opts + cmd_parts << rspec_load_path + cmd_parts << escape(rspec_path) + cmd_parts << file_inclusion_specification + cmd_parts << file_exclusion_specification + cmd_parts << rspec_opts + cmd_parts.flatten.reject(&blank).join(" ") + end + + def blank + lambda { |s| s.nil? || s == "" } + end + + def rspec_load_path + @rspec_load_path ||= begin + core_and_support = $LOAD_PATH.grep( + /#{File::SEPARATOR}rspec-(core|support)[^#{File::SEPARATOR}]*#{File::SEPARATOR}lib/ + ).uniq + + "-I#{core_and_support.map { |file| escape file }.join(File::PATH_SEPARATOR)}" + end + end + end + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/rspec-core-3.11.0/lib/rspec/core/reporter.rb b/vendor/bundle/ruby/3.1.0/gems/rspec-core-3.11.0/lib/rspec/core/reporter.rb new file mode 100644 index 000000000..a016d0f86 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/rspec-core-3.11.0/lib/rspec/core/reporter.rb @@ -0,0 +1,265 @@ +module RSpec::Core + # A reporter will send notifications to listeners, usually formatters for the + # spec suite run. + class Reporter + # @private + RSPEC_NOTIFICATIONS = Set.new( + [ + :close, :deprecation, :deprecation_summary, :dump_failures, :dump_pending, + :dump_profile, :dump_summary, :example_failed, :example_group_finished, + :example_group_started, :example_passed, :example_pending, :example_started, + :message, :seed, :start, :start_dump, :stop, :example_finished + ]) + + def initialize(configuration) + @configuration = configuration + @listeners = Hash.new { |h, k| h[k] = Set.new } + @examples = [] + @failed_examples = [] + @pending_examples = [] + @duration = @start = @load_time = nil + @non_example_exception_count = 0 + @setup_default = lambda {} + @setup = false + @profiler = nil + end + + # @private + attr_reader :examples, :failed_examples, :pending_examples + + # Registers a listener to a list of notifications. The reporter will send + # notification of events to all registered listeners. + # + # @param listener [Object] An obect that wishes to be notified of reporter + # events + # @param notifications [Array] Array of symbols represents the events a + # listener wishes to subscribe too + def register_listener(listener, *notifications) + notifications.each do |notification| + @listeners[notification.to_sym] << listener + end + true + end + + # @private + def prepare_default(loader, output_stream, deprecation_stream) + @setup_default = lambda do + loader.setup_default output_stream, deprecation_stream + end + end + + # @private + def registered_listeners(notification) + @listeners[notification].to_a + end + + # @overload report(count, &block) + # @overload report(count, &block) + # @param expected_example_count [Integer] the number of examples being run + # @yield [Block] block yields itself for further reporting. + # + # Initializes the report run and yields itself for further reporting. The + # block is required, so that the reporter can manage cleaning up after the + # run. + # + # @example + # + # reporter.report(group.examples.size) do |r| + # example_groups.map {|g| g.run(r) } + # end + # + def report(expected_example_count) + start(expected_example_count) + begin + yield self + ensure + finish + end + end + + # @param exit_code [Integer] the exit_code to be return by the reporter + # + # Reports a run that exited early without having run any examples. + # + def exit_early(exit_code) + report(0) { exit_code } + end + + # @private + def start(expected_example_count, time=RSpec::Core::Time.now) + @start = time + @load_time = (@start - @configuration.start_time).to_f + notify :seed, Notifications::SeedNotification.new(@configuration.seed, seed_used?) + notify :start, Notifications::StartNotification.new(expected_example_count, @load_time) + end + + # @param message [#to_s] A message object to send to formatters + # + # Send a custom message to supporting formatters. + def message(message) + notify :message, Notifications::MessageNotification.new(message) + end + + # @param event [Symbol] Name of the custom event to trigger on formatters + # @param options [Hash] Hash of arguments to provide via `CustomNotification` + # + # Publish a custom event to supporting registered formatters. + # @see RSpec::Core::Notifications::CustomNotification + def publish(event, options={}) + if RSPEC_NOTIFICATIONS.include? event + raise "RSpec::Core::Reporter#publish is intended for sending custom " \ + "events not internal RSpec ones, please rename your custom event." + end + notify event, Notifications::CustomNotification.for(options) + end + + # @private + def example_group_started(group) + notify :example_group_started, Notifications::GroupNotification.new(group) unless group.descendant_filtered_examples.empty? + end + + # @private + def example_group_finished(group) + notify :example_group_finished, Notifications::GroupNotification.new(group) unless group.descendant_filtered_examples.empty? + end + + # @private + def example_started(example) + @examples << example + notify :example_started, Notifications::ExampleNotification.for(example) + end + + # @private + def example_finished(example) + notify :example_finished, Notifications::ExampleNotification.for(example) + end + + # @private + def example_passed(example) + notify :example_passed, Notifications::ExampleNotification.for(example) + end + + # @private + def example_failed(example) + @failed_examples << example + notify :example_failed, Notifications::ExampleNotification.for(example) + end + + # @private + def example_pending(example) + @pending_examples << example + notify :example_pending, Notifications::ExampleNotification.for(example) + end + + # @private + def deprecation(hash) + notify :deprecation, Notifications::DeprecationNotification.from_hash(hash) + end + + # @private + # Provides a way to notify of an exception that is not tied to any + # particular example (such as an exception encountered in a :suite hook). + # Exceptions will be formatted the same way they normally are. + def notify_non_example_exception(exception, context_description) + @configuration.world.non_example_failure = true + @non_example_exception_count += 1 + + example = Example.new(AnonymousExampleGroup, context_description, {}) + presenter = Formatters::ExceptionPresenter.new(exception, example, :indentation => 0) + message presenter.fully_formatted(nil) + end + + # @private + def finish + close_after do + stop + notify :start_dump, Notifications::NullNotification + notify :dump_pending, Notifications::ExamplesNotification.new(self) + notify :dump_failures, Notifications::ExamplesNotification.new(self) + notify :deprecation_summary, Notifications::NullNotification + unless mute_profile_output? + notify :dump_profile, Notifications::ProfileNotification.new(@duration, @examples, + @configuration.profile_examples, + @profiler.example_groups) + end + notify :dump_summary, Notifications::SummaryNotification.new(@duration, @examples, @failed_examples, + @pending_examples, @load_time, + @non_example_exception_count) + notify :seed, Notifications::SeedNotification.new(@configuration.seed, seed_used?) + end + end + + # @private + def close_after + yield + ensure + close + end + + # @private + def stop + @duration = (RSpec::Core::Time.now - @start).to_f if @start + notify :stop, Notifications::ExamplesNotification.new(self) + end + + # @private + def notify(event, notification) + ensure_listeners_ready + registered_listeners(event).each do |formatter| + formatter.__send__(event, notification) + end + end + + # @private + def abort_with(msg, exit_status) + message(msg) + close + exit!(exit_status) + end + + # @private + def fail_fast_limit_met? + return false unless (fail_fast = @configuration.fail_fast) + + if fail_fast == true + @failed_examples.any? + else + fail_fast <= @failed_examples.size + end + end + + private + + def ensure_listeners_ready + return if @setup + + @setup_default.call + @profiler = Profiler.new + register_listener @profiler, *Profiler::NOTIFICATIONS + @setup = true + end + + def close + notify :close, Notifications::NullNotification + end + + def mute_profile_output? + # Don't print out profiled info if there are failures and `--fail-fast` is + # used, it just clutters the output. + !@configuration.profile_examples? || fail_fast_limit_met? + end + + def seed_used? + @configuration.seed && @configuration.seed_used? + end + end + + # @private + # # Used in place of a {Reporter} for situations where we don't want reporting output. + class NullReporter + def self.method_missing(*) + # ignore + end + private_class_method :method_missing + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/rspec-core-3.11.0/lib/rspec/core/ruby_project.rb b/vendor/bundle/ruby/3.1.0/gems/rspec-core-3.11.0/lib/rspec/core/ruby_project.rb new file mode 100644 index 000000000..156f89bea --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/rspec-core-3.11.0/lib/rspec/core/ruby_project.rb @@ -0,0 +1,53 @@ +# This is borrowed (slightly modified) from Scott Taylor's +# project_path project: +# http://github.com/smtlaissezfaire/project_path +module RSpec + module Core + # @private + module RubyProject + def add_to_load_path(*dirs) + dirs.each { |dir| add_dir_to_load_path(File.join(root, dir)) } + end + + def add_dir_to_load_path(dir) + $LOAD_PATH.unshift(dir) unless $LOAD_PATH.include?(dir) + end + + def root + @project_root ||= determine_root + end + + def determine_root + find_first_parent_containing('spec') || '.' + end + + def find_first_parent_containing(dir) + ascend_until { |path| File.exist?(File.join(path, dir)) } + end + + def ascend_until + fs = File::SEPARATOR + escaped_slash = "\\#{fs}" + special = "_RSPEC_ESCAPED_SLASH_" + project_path = File.expand_path(".") + parts = project_path.gsub(escaped_slash, special).squeeze(fs).split(fs).map do |x| + x.gsub(special, escaped_slash) + end + + until parts.empty? + path = parts.join(fs) + path = fs if path == "" + return path if yield(path) + parts.pop + end + end + + module_function :add_to_load_path + module_function :add_dir_to_load_path + module_function :root + module_function :determine_root + module_function :find_first_parent_containing + module_function :ascend_until + end + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/rspec-core-3.11.0/lib/rspec/core/runner.rb b/vendor/bundle/ruby/3.1.0/gems/rspec-core-3.11.0/lib/rspec/core/runner.rb new file mode 100644 index 000000000..caf9c871a --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/rspec-core-3.11.0/lib/rspec/core/runner.rb @@ -0,0 +1,212 @@ +module RSpec + module Core + # Provides the main entry point to run a suite of RSpec examples. + class Runner + # @attr_reader + # @private + attr_reader :options, :configuration, :world + + # Register an `at_exit` hook that runs the suite when the process exits. + # + # @note This is not generally needed. The `rspec` command takes care + # of running examples for you without involving an `at_exit` + # hook. This is only needed if you are running specs using + # the `ruby` command, and even then, the normal way to invoke + # this is by requiring `rspec/autorun`. + def self.autorun + if autorun_disabled? + RSpec.deprecate("Requiring `rspec/autorun` when running RSpec via the `rspec` command") + return + elsif installed_at_exit? || running_in_drb? + return + end + + at_exit { perform_at_exit } + @installed_at_exit = true + end + + # @private + def self.perform_at_exit + # Don't bother running any specs and just let the program terminate + # if we got here due to an unrescued exception (anything other than + # SystemExit, which is raised when somebody calls Kernel#exit). + return unless $!.nil? || $!.is_a?(SystemExit) + + # We got here because either the end of the program was reached or + # somebody called Kernel#exit. Run the specs and then override any + # existing exit status with RSpec's exit status if any specs failed. + invoke + end + + # Runs the suite of specs and exits the process with an appropriate exit + # code. + def self.invoke + disable_autorun! + status = run(ARGV, $stderr, $stdout).to_i + exit(status) if status != 0 + end + + # Run a suite of RSpec examples. Does not exit. + # + # This is used internally by RSpec to run a suite, but is available + # for use by any other automation tool. + # + # If you want to run this multiple times in the same process, and you + # want files like `spec_helper.rb` to be reloaded, be sure to load `load` + # instead of `require`. + # + # @param args [Array] command-line-supported arguments + # @param err [IO] error stream + # @param out [IO] output stream + # @return [Fixnum] exit status code. 0 if all specs passed, + # or the configured failure exit code (1 by default) if specs + # failed. + def self.run(args, err=$stderr, out=$stdout) + trap_interrupt + options = ConfigurationOptions.new(args) + + if options.options[:runner] + options.options[:runner].call(options, err, out) + else + new(options).run(err, out) + end + end + + def initialize(options, configuration=RSpec.configuration, world=RSpec.world) + @options = options + @configuration = configuration + @world = world + end + + # Configures and runs a spec suite. + # + # @param err [IO] error stream + # @param out [IO] output stream + def run(err, out) + setup(err, out) + return @configuration.reporter.exit_early(exit_code) if RSpec.world.wants_to_quit + + run_specs(@world.ordered_example_groups).tap do + persist_example_statuses + end + end + + # Wires together the various configuration objects and state holders. + # + # @param err [IO] error stream + # @param out [IO] output stream + def setup(err, out) + configure(err, out) + return if RSpec.world.wants_to_quit + + @configuration.load_spec_files + ensure + @world.announce_filters + end + + # Runs the provided example groups. + # + # @param example_groups [Array] groups to run + # @return [Fixnum] exit status code. 0 if all specs passed, + # or the configured failure exit code (1 by default) if specs + # failed. + def run_specs(example_groups) + examples_count = @world.example_count(example_groups) + examples_passed = @configuration.reporter.report(examples_count) do |reporter| + @configuration.with_suite_hooks do + if examples_count == 0 && @configuration.fail_if_no_examples + return @configuration.failure_exit_code + end + + example_groups.map { |g| g.run(reporter) }.all? + end + end + + exit_code(examples_passed) + end + + # @private + def configure(err, out) + @configuration.error_stream = err + @configuration.output_stream = out if @configuration.output_stream == $stdout + @options.configure(@configuration) + end + + # @private + def self.disable_autorun! + @autorun_disabled = true + end + + # @private + def self.autorun_disabled? + @autorun_disabled ||= false + end + + # @private + def self.installed_at_exit? + @installed_at_exit ||= false + end + + # @private + def self.running_in_drb? + return false unless defined?(DRb) + + server = begin + DRb.current_server + rescue DRb::DRbServerNotFound + return false + end + + return false unless server && server.alive? + + require 'socket' + require 'uri' + + local_ipv4 = begin + IPSocket.getaddress(Socket.gethostname) + rescue SocketError + return false + end + + ["127.0.0.1", "localhost", local_ipv4].any? { |addr| addr == URI(DRb.current_server.uri).host } + end + + # @private + def self.trap_interrupt + trap('INT') { handle_interrupt } + end + + # @private + def self.handle_interrupt + if RSpec.world.wants_to_quit + exit!(1) + else + RSpec.world.wants_to_quit = true + $stderr.puts "\nRSpec is shutting down and will print the summary report... Interrupt again to force quit." + end + end + + # @private + def exit_code(examples_passed=false) + return @configuration.error_exit_code || @configuration.failure_exit_code if @world.non_example_failure + return @configuration.failure_exit_code unless examples_passed + + 0 + end + + private + + def persist_example_statuses + return if @configuration.dry_run + return unless (path = @configuration.example_status_persistence_file_path) + + ExampleStatusPersister.persist(@world.all_examples, path) + rescue SystemCallError => e + RSpec.warning "Could not write example statuses to #{path} (configured as " \ + "`config.example_status_persistence_file_path`) due to a " \ + "system error: #{e.inspect}. Please check that the config " \ + "option is set to an accessible, valid file path", :call_site => nil + end + end + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/rspec-core-3.11.0/lib/rspec/core/sandbox.rb b/vendor/bundle/ruby/3.1.0/gems/rspec-core-3.11.0/lib/rspec/core/sandbox.rb new file mode 100644 index 000000000..e7d518c2e --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/rspec-core-3.11.0/lib/rspec/core/sandbox.rb @@ -0,0 +1,37 @@ +module RSpec + module Core + # A sandbox isolates the enclosed code into an environment that looks 'new' + # meaning globally accessed objects are reset for the duration of the + # sandbox. + # + # @note This module is not normally available. You must require + # `rspec/core/sandbox` to load it. + module Sandbox + # Execute a provided block with RSpec global objects (configuration, + # world) reset. This is used to test RSpec with RSpec. + # + # When calling this the configuration is passed into the provided block. + # Use this to set custom configs for your sandboxed examples. + # + # ``` + # Sandbox.sandboxed do |config| + # config.before(:context) { RSpec.current_example = nil } + # end + # ``` + def self.sandboxed + orig_config = RSpec.configuration + orig_world = RSpec.world + orig_example = RSpec.current_example + + RSpec.configuration = RSpec::Core::Configuration.new + RSpec.world = RSpec::Core::World.new(RSpec.configuration) + + yield RSpec.configuration + ensure + RSpec.configuration = orig_config + RSpec.world = orig_world + RSpec.current_example = orig_example + end + end + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/rspec-core-3.11.0/lib/rspec/core/set.rb b/vendor/bundle/ruby/3.1.0/gems/rspec-core-3.11.0/lib/rspec/core/set.rb new file mode 100644 index 000000000..ae978106c --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/rspec-core-3.11.0/lib/rspec/core/set.rb @@ -0,0 +1,54 @@ +module RSpec + module Core + # @private + # + # We use this to replace `::Set` so we can have the advantage of + # constant time key lookups for unique arrays but without the + # potential to pollute a developers environment with an extra + # piece of the stdlib. This helps to prevent false positive + # builds. + # + class Set + include Enumerable + + def initialize(array=[]) + @values = {} + merge(array) + end + + def empty? + @values.empty? + end + + def <<(key) + @values[key] = true + self + end + + def delete(key) + @values.delete(key) + end + + def each(&block) + @values.keys.each(&block) + self + end + + def include?(key) + @values.key?(key) + end + + def merge(values) + values.each do |key| + @values[key] = true + end + self + end + + def clear + @values.clear + self + end + end + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/rspec-core-3.11.0/lib/rspec/core/shared_context.rb b/vendor/bundle/ruby/3.1.0/gems/rspec-core-3.11.0/lib/rspec/core/shared_context.rb new file mode 100644 index 000000000..6de7f649d --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/rspec-core-3.11.0/lib/rspec/core/shared_context.rb @@ -0,0 +1,55 @@ +module RSpec + module Core + # Exposes {ExampleGroup}-level methods to a module, so you can include that + # module in an {ExampleGroup}. + # + # @example + # + # module LoggedInAsAdmin + # extend RSpec::Core::SharedContext + # before(:example) do + # log_in_as :admin + # end + # end + # + # describe "admin section" do + # include LoggedInAsAdmin + # # ... + # end + module SharedContext + # @private + def included(group) + __shared_context_recordings.each do |recording| + recording.playback_onto(group) + end + end + + # @private + def __shared_context_recordings + @__shared_context_recordings ||= [] + end + + # @private + Recording = Struct.new(:method_name, :args, :block) do + def playback_onto(group) + group.__send__(method_name, *args, &block) + end + end + + # @private + def self.record(methods) + methods.each do |meth| + define_method(meth) do |*args, &block| + __shared_context_recordings << Recording.new(meth, args, block) + end + end + end + + # @private + record [:describe, :context] + Hooks.instance_methods(false) + + MemoizedHelpers::ClassMethods.instance_methods(false) + end + end + # @private + SharedContext = Core::SharedContext +end diff --git a/vendor/bundle/ruby/3.1.0/gems/rspec-core-3.11.0/lib/rspec/core/shared_example_group.rb b/vendor/bundle/ruby/3.1.0/gems/rspec-core-3.11.0/lib/rspec/core/shared_example_group.rb new file mode 100644 index 000000000..3d9efce28 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/rspec-core-3.11.0/lib/rspec/core/shared_example_group.rb @@ -0,0 +1,271 @@ +RSpec::Support.require_rspec_support "with_keywords_when_needed" + +module RSpec + module Core + # Represents some functionality that is shared with multiple example groups. + # The functionality is defined by the provided block, which is lazily + # eval'd when the `SharedExampleGroupModule` instance is included in an example + # group. + class SharedExampleGroupModule < Module + # @private + attr_reader :definition + + def initialize(description, definition, metadata) + @description = description + @definition = definition + @metadata = metadata + end + + # Provides a human-readable representation of this module. + def inspect + "#<#{self.class.name} #{@description.inspect}>" + end + alias to_s inspect + + # Ruby callback for when a module is included in another module is class. + # Our definition evaluates the shared group block in the context of the + # including example group. + def included(klass) + inclusion_line = klass.metadata[:location] + include_in klass, inclusion_line, [], nil + end + + # @private + def include_in(klass, inclusion_line, args, customization_block) + klass.update_inherited_metadata(@metadata) unless @metadata.empty? + + SharedExampleGroupInclusionStackFrame.with_frame(@description, inclusion_line) do + RSpec::Support::WithKeywordsWhenNeeded.class_exec(klass, *args, &@definition) + klass.class_exec(&customization_block) if customization_block + end + end + end + + # Shared example groups let you define common context and/or common + # examples that you wish to use in multiple example groups. + # + # When defined, the shared group block is stored for later evaluation. + # It can later be included in an example group either explicitly + # (using `include_examples`, `include_context` or `it_behaves_like`) + # or implicitly (via matching metadata). + # + # Named shared example groups are scoped based on where they are + # defined. Shared groups defined in an example group are available + # for inclusion in that example group or any child example groups, + # but not in any parent or sibling example groups. Shared example + # groups defined at the top level can be included from any example group. + module SharedExampleGroup + # @overload shared_examples(name, &block) + # @param name [String, Symbol, Module] identifer to use when looking up + # this shared group + # @param block The block to be eval'd + # @overload shared_examples(name, metadata, &block) + # @param name [String, Symbol, Module] identifer to use when looking up + # this shared group + # @param metadata [Array, Hash] metadata to attach to this + # group; any example group or example with matching metadata will + # automatically include this shared example group. + # @param block The block to be eval'd + # + # Stores the block for later use. The block will be evaluated + # in the context of an example group via `include_examples`, + # `include_context`, or `it_behaves_like`. + # + # @example + # shared_examples "auditable" do + # it "stores an audit record on save!" do + # expect { auditable.save! }.to change(Audit, :count).by(1) + # end + # end + # + # RSpec.describe Account do + # it_behaves_like "auditable" do + # let(:auditable) { Account.new } + # end + # end + # + # @see ExampleGroup.it_behaves_like + # @see ExampleGroup.include_examples + # @see ExampleGroup.include_context + def shared_examples(name, *args, &block) + top_level = self == ExampleGroup + if top_level && RSpec::Support.thread_local_data[:in_example_group] + raise "Creating isolated shared examples from within a context is " \ + "not allowed. Remove `RSpec.` prefix or move this to a " \ + "top-level scope." + end + + RSpec.world.shared_example_group_registry.add(self, name, *args, &block) + end + alias shared_context shared_examples + alias shared_examples_for shared_examples + + # @api private + # + # Shared examples top level DSL. + module TopLevelDSL + # @private + def self.definitions + proc do + def shared_examples(name, *args, &block) + RSpec.world.shared_example_group_registry.add(:main, name, *args, &block) + end + alias shared_context shared_examples + alias shared_examples_for shared_examples + end + end + + # @private + def self.exposed_globally? + @exposed_globally ||= false + end + + # @api private + # + # Adds the top level DSL methods to Module and the top level binding. + def self.expose_globally! + return if exposed_globally? + Core::DSL.change_global_dsl(&definitions) + @exposed_globally = true + end + + # @api private + # + # Removes the top level DSL methods to Module and the top level binding. + def self.remove_globally! + return unless exposed_globally? + + Core::DSL.change_global_dsl do + undef shared_examples + undef shared_context + undef shared_examples_for + end + + @exposed_globally = false + end + end + + # @private + class Registry + def add(context, name, *metadata_args, &block) + unless block + RSpec.warning "Shared example group #{name} was defined without a "\ + "block and will have no effect. Please define a "\ + "block or remove the definition." + end + + if RSpec.configuration.shared_context_metadata_behavior == :trigger_inclusion + return legacy_add(context, name, *metadata_args, &block) + end + + unless valid_name?(name) + raise ArgumentError, "Shared example group names can only be a string, " \ + "symbol or module but got: #{name.inspect}" + end + + ensure_block_has_source_location(block) { CallerFilter.first_non_rspec_line } + warn_if_key_taken context, name, block + + metadata = Metadata.build_hash_from(metadata_args) + shared_module = SharedExampleGroupModule.new(name, block, metadata) + shared_example_groups[context][name] = shared_module + end + + def find(lookup_contexts, name) + lookup_contexts.each do |context| + found = shared_example_groups[context][name] + return found if found + end + + shared_example_groups[:main][name] + end + + private + + # TODO: remove this in RSpec 4. This exists only to support + # `config.shared_context_metadata_behavior == :trigger_inclusion`, + # the legacy behavior of shared context metadata, which we do + # not want to support in RSpec 4. + def legacy_add(context, name, *metadata_args, &block) + ensure_block_has_source_location(block) { CallerFilter.first_non_rspec_line } + shared_module = SharedExampleGroupModule.new(name, block, {}) + + if valid_name?(name) + warn_if_key_taken context, name, block + shared_example_groups[context][name] = shared_module + else + metadata_args.unshift name + end + + return if metadata_args.empty? + RSpec.configuration.include shared_module, *metadata_args + end + + def shared_example_groups + @shared_example_groups ||= Hash.new { |hash, context| hash[context] = {} } + end + + def valid_name?(candidate) + case candidate + when String, Symbol, Module then true + else false + end + end + + def warn_if_key_taken(context, key, new_block) + existing_module = shared_example_groups[context][key] + return unless existing_module + + old_definition_location = formatted_location existing_module.definition + new_definition_location = formatted_location new_block + loaded_spec_files = RSpec.configuration.loaded_spec_files + + if loaded_spec_files.include?(new_definition_location) && old_definition_location == new_definition_location + RSpec.warn_with <<-WARNING.gsub(/^ +\|/, ''), :call_site => nil + |WARNING: Your shared example group, '#{key}', defined at: + | #{old_definition_location} + |was automatically loaded by RSpec because the file name + |matches the configured autoloading pattern (#{RSpec.configuration.pattern}), + |and is also being required from somewhere else. To fix this + |warning, either rename the file to not match the pattern, or + |do not explicitly require the file. + WARNING + else + RSpec.warn_with <<-WARNING.gsub(/^ +\|/, ''), :call_site => nil + |WARNING: Shared example group '#{key}' has been previously defined at: + | #{old_definition_location} + |...and you are now defining it at: + | #{new_definition_location} + |The new definition will overwrite the original one. + WARNING + end + end + + if RUBY_VERSION.to_f >= 1.9 + def formatted_location(block) + block.source_location.join(":") + end + else # 1.8.7 + # :nocov: + def formatted_location(block) + block.source_location.join(":").gsub(/:in.*$/, '') + end + # :nocov: + end + + if Proc.method_defined?(:source_location) + def ensure_block_has_source_location(_block); end + else # for 1.8.7 + # :nocov: + def ensure_block_has_source_location(block) + source_location = yield.split(':') + block.extend(Module.new { define_method(:source_location) { source_location } }) + end + # :nocov: + end + end + end + end + + instance_exec(&Core::SharedExampleGroup::TopLevelDSL.definitions) +end diff --git a/vendor/bundle/ruby/3.1.0/gems/rspec-core-3.11.0/lib/rspec/core/shell_escape.rb b/vendor/bundle/ruby/3.1.0/gems/rspec-core-3.11.0/lib/rspec/core/shell_escape.rb new file mode 100644 index 000000000..a92feae80 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/rspec-core-3.11.0/lib/rspec/core/shell_escape.rb @@ -0,0 +1,49 @@ +module RSpec + module Core + # @private + # Deals with the fact that `shellwords` only works on POSIX systems. + module ShellEscape + module_function + + def quote(argument) + "'#{argument.to_s.gsub("'", "\\\\'")}'" + end + + if RSpec::Support::OS.windows? + # :nocov: + alias escape quote + # :nocov: + else + require 'shellwords' + + def escape(shell_command) + Shellwords.escape(shell_command.to_s) + end + end + + # Known shells that require quoting: zsh, csh, tcsh. + # + # Feel free to add other shells to this list that are known to + # allow `rspec ./some_spec.rb[1:1]` syntax without quoting the id. + # + # @private + SHELLS_ALLOWING_UNQUOTED_IDS = %w[ bash ksh fish ] + + def conditionally_quote(id) + return id if shell_allows_unquoted_ids? + quote(id) + end + + def shell_allows_unquoted_ids? + # Note: ENV['SHELL'] isn't necessarily the shell the user is currently running. + # According to http://pubs.opengroup.org/onlinepubs/9699919799/basedefs/V1_chap08.html: + # "This variable shall represent a pathname of the user's preferred command language interpreter." + # + # It's the best we can easily do, though. We err on the side of safety (quoting + # the id when not actually needed) so it's not a big deal if the user is actually + # using a different shell. + SHELLS_ALLOWING_UNQUOTED_IDS.include?(ENV['SHELL'].to_s.split('/').last) + end + end + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/rspec-core-3.11.0/lib/rspec/core/test_unit_assertions_adapter.rb b/vendor/bundle/ruby/3.1.0/gems/rspec-core-3.11.0/lib/rspec/core/test_unit_assertions_adapter.rb new file mode 100644 index 000000000..d84ecb144 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/rspec-core-3.11.0/lib/rspec/core/test_unit_assertions_adapter.rb @@ -0,0 +1,30 @@ +require 'test/unit/assertions' + +module RSpec + module Core + # @private + module TestUnitAssertionsAdapter + include ::Test::Unit::Assertions + + # If using test/unit from Ruby core with Ruby 1.9+, it includes + # MiniTest::Assertions by default. Note the upcasing of 'Test'. + # + # If the test/unit gem is being loaded, it will not include any minitest + # assertions. + # + # Only if Minitest 5.x is included / loaded do we need to worry about + # adding a shim for the new updates. Thus instead of checking on the + # RUBY_VERSION we need to check ancestors. + begin + # MiniTest is 4.x. + # Minitest is 5.x. + if ancestors.include?(::Minitest::Assertions) + require 'rspec/core/minitest_assertions_adapter' + include ::RSpec::Core::MinitestAssertionsAdapter + end + rescue NameError + # No-op. Minitest 5.x was not loaded. + end + end + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/rspec-core-3.11.0/lib/rspec/core/version.rb b/vendor/bundle/ruby/3.1.0/gems/rspec-core-3.11.0/lib/rspec/core/version.rb new file mode 100644 index 000000000..ef92e9cb0 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/rspec-core-3.11.0/lib/rspec/core/version.rb @@ -0,0 +1,9 @@ +module RSpec + module Core + # Version information for RSpec Core. + module Version + # Current version of RSpec Core, in semantic versioning format. + STRING = '3.11.0' + end + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/rspec-core-3.11.0/lib/rspec/core/warnings.rb b/vendor/bundle/ruby/3.1.0/gems/rspec-core-3.11.0/lib/rspec/core/warnings.rb new file mode 100644 index 000000000..b8800591b --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/rspec-core-3.11.0/lib/rspec/core/warnings.rb @@ -0,0 +1,40 @@ +require "rspec/support/warnings" + +module RSpec + module Core + # @private + module Warnings + # @private + # + # Used internally to print deprecation warnings. + def deprecate(deprecated, data={}) + RSpec.configuration.reporter.deprecation( + { + :deprecated => deprecated, + :call_site => CallerFilter.first_non_rspec_line + }.merge(data) + ) + end + + # @private + # + # Used internally to print deprecation warnings. + def warn_deprecation(message, opts={}) + RSpec.configuration.reporter.deprecation opts.merge(:message => message) + end + + # @private + def warn_with(message, options={}) + if options[:use_spec_location_as_call_site] + message += "." unless message.end_with?(".") + + if RSpec.current_example + message += " Warning generated from spec at `#{RSpec.current_example.location}`." + end + end + + super(message, options) + end + end + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/rspec-core-3.11.0/lib/rspec/core/world.rb b/vendor/bundle/ruby/3.1.0/gems/rspec-core-3.11.0/lib/rspec/core/world.rb new file mode 100644 index 000000000..6fb439659 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/rspec-core-3.11.0/lib/rspec/core/world.rb @@ -0,0 +1,287 @@ +module RSpec + module Core + # @api private + # + # Internal container for global non-configuration data. + class World + # @private + attr_reader :example_groups, :filtered_examples, :example_group_counts_by_spec_file + + # Used internally to determine what to do when a SIGINT is received. + attr_accessor :wants_to_quit + + # Used internally to signify that a SystemExit occurred in + # `Configuration#load_file_handling_errors`, and thus examples cannot + # be counted accurately. Specifically, we cannot accurately report + # "No examples found". + # @private + attr_accessor :rspec_is_quitting + + # Used internally to signal that a failure outside of an example + # has occurred, and that therefore the exit status should indicate + # the run failed. + # @private + attr_accessor :non_example_failure + + def initialize(configuration=RSpec.configuration) + @wants_to_quit = false + @rspec_is_quitting = false + @configuration = configuration + configuration.world = self + @example_groups = [] + @example_group_counts_by_spec_file = Hash.new(0) + prepare_example_filtering + end + + # @api public + # + # Prepares filters so that they apply to example groups when they run. + # + # This is a separate method so that filters can be modified/replaced and + # examples refiltered during a process's lifetime, which can be useful for + # a custom runner. + def prepare_example_filtering + @filtered_examples = Hash.new do |hash, group| + hash[group] = filter_manager.prune(group.examples) + end + end + + # @api private + # + # Apply ordering strategy from configuration to example groups. + def ordered_example_groups + ordering_strategy = @configuration.ordering_registry.fetch(:global) + ordering_strategy.order(@example_groups) + end + + # @api private + # + # Reset world to 'scratch' before running suite. + def reset + RSpec::ExampleGroups.remove_all_constants + example_groups.clear + @sources_by_path.clear if defined?(@sources_by_path) + @syntax_highlighter = nil + @example_group_counts_by_spec_file = Hash.new(0) + end + + # @private + def filter_manager + @configuration.filter_manager + end + + # @private + def registered_example_group_files + @example_group_counts_by_spec_file.keys + end + + # @api private + # + # Records an example group. + def record(example_group) + @configuration.on_example_group_definition_callbacks.each { |block| block.call(example_group) } + @example_group_counts_by_spec_file[example_group.metadata[:absolute_file_path]] += 1 + end + + # @private + def num_example_groups_defined_in(file) + @example_group_counts_by_spec_file[file] + end + + # @private + def shared_example_group_registry + @shared_example_group_registry ||= SharedExampleGroup::Registry.new + end + + # @private + def inclusion_filter + @configuration.inclusion_filter + end + + # @private + def exclusion_filter + @configuration.exclusion_filter + end + + # @api private + # + # Get count of examples to be run. + def example_count(groups=example_groups) + FlatMap.flat_map(groups) { |g| g.descendants }. + inject(0) { |a, e| a + e.filtered_examples.size } + end + + # @private + def all_example_groups + FlatMap.flat_map(example_groups) { |g| g.descendants } + end + + # @private + def all_examples + FlatMap.flat_map(all_example_groups) { |g| g.examples } + end + + # @private + # Traverses the tree of each top level group. + # For each it yields the group, then the children, recursively. + # Halts the traversal of a branch of the tree as soon as the passed block returns true. + # Note that siblings groups and their sub-trees will continue to be explored. + # This is intended to make it easy to find the top-most group that satisfies some + # condition. + def traverse_example_group_trees_until(&block) + example_groups.each do |group| + group.traverse_tree_until(&block) + end + end + + # @api private + # + # Find line number of previous declaration. + def preceding_declaration_line(absolute_file_name, filter_line) + line_numbers = descending_declaration_line_numbers_by_file.fetch(absolute_file_name) do + return nil + end + + line_numbers.find { |num| num <= filter_line } + end + + # @private + def reporter + @configuration.reporter + end + + # @private + def source_from_file(path) + unless defined?(@sources_by_path) + RSpec::Support.require_rspec_support 'source' + @sources_by_path = {} + end + + @sources_by_path[path] ||= Support::Source.from_file(path) + end + + # @private + def syntax_highlighter + @syntax_highlighter ||= Formatters::SyntaxHighlighter.new(@configuration) + end + + # @api private + # + # Notify reporter of filters. + def announce_filters + fail_if_config_and_cli_options_invalid + filter_announcements = [] + + announce_inclusion_filter filter_announcements + announce_exclusion_filter filter_announcements + + unless filter_manager.empty? + if filter_announcements.length == 1 + report_filter_message("Run options: #{filter_announcements[0]}") + else + report_filter_message("Run options:\n #{filter_announcements.join("\n ")}") + end + end + + if @configuration.run_all_when_everything_filtered? && example_count.zero? && !@configuration.only_failures? + report_filter_message("#{everything_filtered_message}; ignoring #{inclusion_filter.description}") + filtered_examples.clear + inclusion_filter.clear + end + + return unless example_count.zero? + + example_groups.clear + unless rspec_is_quitting + if filter_manager.empty? + report_filter_message("No examples found.") + elsif exclusion_filter.empty? || inclusion_filter.empty? + report_filter_message(everything_filtered_message) + end + end + end + + # @private + def report_filter_message(message) + reporter.message(message) unless @configuration.silence_filter_announcements? + end + + # @private + def everything_filtered_message + "\nAll examples were filtered out" + end + + # @api private + # + # Add inclusion filters to announcement message. + def announce_inclusion_filter(announcements) + return if inclusion_filter.empty? + + announcements << "include #{inclusion_filter.description}" + end + + # @api private + # + # Add exclusion filters to announcement message. + def announce_exclusion_filter(announcements) + return if exclusion_filter.empty? + + announcements << "exclude #{exclusion_filter.description}" + end + + private + + def descending_declaration_line_numbers_by_file + @descending_declaration_line_numbers_by_file ||= begin + declaration_locations = FlatMap.flat_map(example_groups, &:declaration_locations) + hash_of_arrays = Hash.new { |h, k| h[k] = [] } + + # TODO: change `inject` to `each_with_object` when we drop 1.8.7 support. + line_nums_by_file = declaration_locations.inject(hash_of_arrays) do |hash, (file_name, line_number)| + hash[file_name] << line_number + hash + end + + line_nums_by_file.each_value do |list| + list.sort! + list.reverse! + end + end + end + + def fail_if_config_and_cli_options_invalid + return unless @configuration.only_failures_but_not_configured? + + reporter.abort_with( + "\nTo use `--only-failures`, you must first set " \ + "`config.example_status_persistence_file_path`.", + 1 # exit code + ) + end + + # @private + # Provides a null implementation for initial use by configuration. + module Null + def self.non_example_failure; end + def self.non_example_failure=(_); end + + def self.registered_example_group_files + [] + end + + def self.traverse_example_group_trees_until + end + + # :nocov: + def self.example_groups + [] + end + + def self.all_example_groups + [] + end + # :nocov: + end + end + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/rspec-expectations-3.11.0/.document b/vendor/bundle/ruby/3.1.0/gems/rspec-expectations-3.11.0/.document new file mode 100644 index 000000000..52a564f65 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/rspec-expectations-3.11.0/.document @@ -0,0 +1,5 @@ +lib/**/*.rb +- +README.md +LICENSE.md +Changelog.md diff --git a/vendor/bundle/ruby/3.1.0/gems/rspec-expectations-3.11.0/.yardopts b/vendor/bundle/ruby/3.1.0/gems/rspec-expectations-3.11.0/.yardopts new file mode 100644 index 000000000..9555b8e5c --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/rspec-expectations-3.11.0/.yardopts @@ -0,0 +1,6 @@ +--exclude features +--no-private +--markup markdown +- +Changelog.md +LICENSE.md diff --git a/vendor/bundle/ruby/3.1.0/gems/rspec-expectations-3.11.0/Changelog.md b/vendor/bundle/ruby/3.1.0/gems/rspec-expectations-3.11.0/Changelog.md new file mode 100644 index 000000000..55f20c959 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/rspec-expectations-3.11.0/Changelog.md @@ -0,0 +1,1267 @@ +### Development +[Full Changelog](http://github.com/rspec/rspec-expectations/compare/v3.11.0...3-11-maintenance) + +### 3.11.0 / 2022-02-09 +[Full Changelog](http://github.com/rspec/rspec-expectations/compare/v3.10.2...v3.11.0) + +Enhancements: + +* Return `true` from `aggregate_failures` when no exception occurs. (Jon Rowe, #1225) + +Deprecations: + +* Print a deprecation message when using the implicit block expectation syntax. + (Phil Pirozhkov, #1139) + +### 3.10.2 / 2022-01-14 +[Full Changelog](http://github.com/rspec/rspec-expectations/compare/v3.10.1...v3.10.2) + +Bug Fixes: + +* Fix support for dynamic matchers for expectation target checks (Phil Pirozhkov, #1294) +* Fix `expect(array).to include(hash).times`, previously this would fail due to + matching the entire array as a single hash, rather than a member of the hash. + (Slava Kardakov, #1322) +* Ensure `raise_error` matches works with the `error_highlight` option from Ruby 3.1. + (Peter Goldstein, #1339) + +### 3.10.1 / 2020-12-27 +[Full Changelog](http://github.com/rspec/rspec-expectations/compare/v3.10.0...v3.10.1) + +Bug Fixes: + +* Allow JRuby 9.2.x.x to generate backtraces normally rather than via our + backfill workaround. (#1230, Jon Rowe) + +### 3.10.0 / 2020-10-30 +[Full Changelog](http://github.com/rspec/rspec-expectations/compare/v3.9.3...v3.10.0) + +Enhancements: + +* Allow `include` matcher to be chained with `once`, `at_least`, etc. for simple cases. + (Marc-André Lafortune, #1168) +* Add an explicit warning when `nil` is passed to `raise_error`. (Phil Pirozhkov, #1143) +* Improve `include` matcher's composability. (Phil Pirozhkov, #1155) +* Mocks expectations can now set a custom failure message. + (Benoit Tigeot and Nicolas Zermati, #1156) +* `aggregate_failures` now shows the backtrace line for each failure. (Fabricio Bedin, #1163) +* Support multiple combinations of `yield_control` modifiers like `at_least`, `at_most`. + (Jon Rowe, #1169) +* Dynamic `have_` matchers now have output consistent with other dynamic matchers. + (Marc-André Lafortune, #1195) +* New config option `strict_predicate_matchers` allows predicate matcher to be strict + (i.e. match for `true` or `false`) instead of the default (match truthy vs `false` or `nil`). + (Marc-André Lafortune, #1196) + +### 3.9.4 / 2020-10-29 +[Full Changelog](http://github.com/rspec/rspec-expectations/compare/v3.9.3...v3.9.4) + +Bug Fixes: + +* Fix regression with `be_` and `have_` matchers and arguments implementing `to_hash` + were they would act like keywords and be cast to a hash. (Jon Rowe, #1222) + +### 3.9.3 / 2020-10-23 + +Bug Fixes: + +* Swap the comparison of the delta vs the expected for the `be_within` matcher allowing + more complicated oobjects to be compared providing they provide `abs` and other + comparison methods. (Kelly Stannard, #1182) +* Properly format expected in the description of the `be_within` matcher. (Jon Rowe, #1185) +* Remove warning when using keyword arguments with `be_` and `have_` matchers on 2.7.x + (Jon Rowe, #1187) +* Prevent formatting a single hash as a list of key value pairs in default failure messages + for custom matches (fixes formatting in `EnglishPhrasing#list`). (Robert Eshleman, #1193) +* Prevent errors from causing false positives when using `be ` comparison, e.g. + `expect(1).not_to be < 'a'` will now correctly fail rather than pass. (Jon Rowe, #1208) + + +### 3.9.2 / 2020-05-08 +[Full Changelog](http://github.com/rspec/rspec-expectations/compare/v3.9.1...v3.9.2) + +Bug Fixes: + +* Issue a proper `ArgumentError` when invalid arguments are given to `yield_control` + modifiers such as `at_least` et al. (Marc-André Lafortune, #1167) +* Prevent Ruby 2.7 keyword arguments warning from being issued by custom + matcher definitions. (Jon Rowe, #1176) + +### 3.9.1 / 2020-03-13 +[Full Changelog](http://github.com/rspec/rspec-expectations/compare/v3.9.0...v3.9.1) + +Bug Fixes: + +* Issue an improved warning when using `respond_to(...).with(n).arguments` and ignore + the warning when using with `have_attributes(...)`. (Jon Rowe, #1164) + +### 3.9.0 / 2019-10-08 +[Full Changelog](http://github.com/rspec/rspec-expectations/compare/v3.8.6...v3.9.0) + +Enhancements: + +* The `respond_to` matcher now uses the signature from `initialize` to validate checks + for `new` (unless `new` is non standard). (Jon Rowe, #1072) +* Generated descriptions for matchers now use `is expected to` rather than `should` in + line with our preferred DSL. (Pete Johns, #1080, rspec/rspec-core#2572) +* Add the ability to re-raise expectation errors when matching + with `match_when_negated` blocks. (Jon Rowe, #1130) +* Add a warning when an empty diff is produce due to identical inspect output. + (Benoit Tigeot, #1126) + +### 3.8.6 / 2019-10-07 + +Bug Fixes: + +* Revert #1125 due to the change being incompatible with our semantic versioning + policy. + +### 3.8.5 / 2019-10-02 +[Full Changelog](http://github.com/rspec/rspec-expectations/compare/v3.8.4...v3.8.5) + +Bug Fixes: + +* Prevent unsupported implicit block expectation syntax from being used. + (Phil Pirozhkov, #1125) + +### 3.8.4 / 2019-06-10 +[Full Changelog](http://github.com/rspec/rspec-expectations/compare/v3.8.3...v3.8.4) + +Bug Fixes: + +* Prevent false negatives when checking objects for the methods required to run the + the `be_an_instance_of` and `be_kind_of` matchers. (Nazar Matus, #1112) + +### 3.8.3 / 2019-04-20 +[Full Changelog](http://github.com/rspec/rspec-expectations/compare/v3.8.2...v3.8.3) + +Bug Fixes: + +* Prevent composed `all` matchers from leaking into their siblings leading to duplicate + failures. (Jamie English, #1086) +* Prevent objects which change their hash on comparison from failing change checks. + (Phil Pirozhkov, #1100) +* Issue an `ArgumentError` rather than a `NoMethodError` when `be_an_instance_of` and + `be_kind_of` matchers encounter objects not supporting those methods. + (Taichi Ishitani, #1107) + +### 3.8.2 / 2018-10-09 +[Full Changelog](http://github.com/rspec/rspec-expectations/compare/v3.8.1...v3.8.2) + +Bug Fixes: + +* Change `include` matcher to rely on a `respond_to?(:include?)` check rather than a direct + Hash comparison before calling `to_hash` to convert to a hash. (Jordan Owens, #1073) +* Prevent unexpected call stack jumps from causing an obscure error (`IndexError`), and + replace that error with a proper informative message. (Jon Rowe, #1076) + +### 3.8.1 / 2018-08-06 +[Full Changelog](http://github.com/rspec/rspec-expectations/compare/v3.8.0...v3.8.1) + +Bug Fixes: + +* Fix regression in `include` matcher so stopped + `expect(hash.with_indifferent_access).to include(:symbol_key)` + from working. (Eito Katagiri, #1069) + +### 3.8.0 / 2018-08-04 +[Full Changelog](http://github.com/rspec/rspec-expectations/compare/v3.7.0...v3.8.0) + +Enhancements: + +* Improve failure message of `change(receiver, :message)` by including the + receiver as `SomeClass#some_message`. (Tomohiro Hashidate, #1005) +* Improve `change` matcher so that it can correctly detect changes in + deeply nested mutable objects (such as arrays-of-hashes-of-arrays). + The improved logic uses the before/after `hash` value to see if the + object has been mutated, rather than shallow duping the object. + (Myron Marston, #1034) +* Improve `include` matcher so that pseudo-hash objects (e.g. objects + that decorate a hash using a `SimpleDelegator` or similar) are treated + as a hash, as long as they implement `to_hash`. (Pablo Brasero, #1012) +* Add `max_formatted_output_length=` to configuration, allowing changing + the length at which we truncate large output strings. + (Sam Phippen #951, Benoit Tigeot #1056) +* Improve error message when passing a matcher that doesn't support block + expectations to a block based `expect`. (@nicktime, #1066) + +### 3.7.0 / 2017-10-17 +[Full Changelog](http://github.com/rspec/rspec-expectations/compare/v3.6.0...v3.7.0) + +Enhancements: + +* Improve compatibility with `--enable-frozen-string-literal` option + on Ruby 2.3+. (Pat Allan, #997) + +### 3.6.0 / 2017-05-04 +[Full Changelog](http://github.com/rspec/rspec-expectations/compare/v3.6.0.beta2...v3.6.0) + +Enhancements: + +* Treat NoMethodError as a failure for comparison matchers. (Jon Rowe, #972) +* Allow for scoped aliased and negated matchers--just call + `alias_matcher` or `define_negated_matcher` from within an example + group. (Markus Reiter, #974) +* Improve failure message of `change` matcher with block and `satisfy` matcher + by including the block snippet instead of just describing it as `result` or + `block` when Ripper is available. (Yuji Nakayama, #987) + +Bug Fixes: + +* Fix `yield_with_args` and `yield_successive_args` matchers so that + they compare expected to actual args at the time the args are yielded + instead of at the end, in case the method that is yielding mutates the + arguments after yielding. (Alyssa Ross, #965) + +### 3.6.0.beta2 / 2016-12-12 +[Full Changelog](http://github.com/rspec/rspec-expectations/compare/v3.6.0.beta1...v3.6.0.beta2) + +Bug Fixes: + +* Using the exist matcher on `File` no longer produces a deprecation warning. + (Jon Rowe, #954) + +### 3.6.0.beta1 / 2016-10-09 +[Full Changelog](http://github.com/rspec/rspec-expectations/compare/v3.5.0...v3.6.0.beta1) + +Bug Fixes: + +* Fix `contain_exactly` to work correctly with ranges. (Myron Marston, #940) +* Fix `change` to work correctly with sets. (Marcin Gajewski, #939) + +### 3.5.0 / 2016-07-01 +[Full Changelog](http://github.com/rspec/rspec-expectations/compare/v3.5.0.beta4...v3.5.0) + +Enhancements: + +* Add support for keyword arguments to the `respond_to` matcher. (Rob Smith, #915). + +### 3.5.0.beta4 / 2016-06-05 +[Full Changelog](http://github.com/rspec/rspec-expectations/compare/v3.5.0.beta3...v3.5.0.beta4) + +Bug Fixes: + +* Fix `include` matcher so that it provides a valid diff for hashes. (Yuji Nakayama, #916) + +### 3.5.0.beta3 / 2016-04-02 +[Full Changelog](http://github.com/rspec/rspec-expectations/compare/v3.5.0.beta2...v3.5.0.beta3) + +Enhancements: + +* Make `rspec/expectations/minitest_integration` work on Minitest::Spec + 5.6+. (Myron Marston, #904) +* Add an alias `having_attributes` for `have_attributes` matcher. + (Yuji Nakayama, #905) +* Improve `change` matcher error message when block is mis-used. + (Alex Altair, #908) + +### 3.5.0.beta2 / 2016-03-10 +[Full Changelog](http://github.com/rspec/rspec-expectations/compare/v3.5.0.beta1...v3.5.0.beta2) + +Enhancements: + +* Add the ability to raise an error on encountering false positives via + `RSpec::Configuration#on_potential_false_positives = :raise`. (Jon Rowe, #900) +* When using the custom matcher DSL, support new + `notify_expectation_failures: true` option for the `match` method to + allow expectation failures to be raised as normal instead of being + converted into a `false` return value for `matches?`. (Jon Rowe, #892) + +Bug Fixes: + +* Allow `should` deprecation check to work on `BasicObject`s. (James Coleman, #898) + +### 3.5.0.beta1 / 2016-02-06 +[Full Changelog](http://github.com/rspec/rspec-expectations/compare/v3.4.0...v3.5.0.beta1) + +Enhancements: + +* Make `match_when_negated` in custom matcher DSL support use of + expectations within the match logic. (Chris Arcand, #789) + +Bug Fixes: + +* Return `true` as expected from passing negated expectations + (such as `expect("foo").not_to eq "bar"`), so they work + properly when used within a `match` or `match_when_negated` + block. (Chris Arcand, #789) + +### 3.4.0 / 2015-11-11 +[Full Changelog](http://github.com/rspec/rspec-expectations/compare/v3.3.1...v3.4.0) + +Enhancements: + +* Warn when `RSpec::Matchers` is included in a superclass after it has + already been included in a subclass on MRI 1.9, since that situation + can cause uses of `super` to trigger infinite recursion. (Myron Marston, #816) +* Stop rescuing `NoMemoryError`, `SignalExcepetion`, `Interrupt` and + `SystemExit`. It is dangerous to interfere with these. (Myron Marston, #845) +* Add `#with_captures` to the + [match matcher](https://www.relishapp.com/rspec/rspec-expectations/docs/built-in-matchers/match-matcher) + which allows a user to specify expected captures when matching a regex + against a string. (Sam Phippen, #848) +* Always print compound failure messages in the multi-line form. Trying + to print it all on a single line didn't read very well. (Myron Marston, #859) + +Bug Fixes: + +* Fix failure message from dynamic predicate matchers when the object + does not respond to the predicate so that it is inspected rather + than relying upon its `to_s` -- that way for `nil`, `"nil"` is + printed rather than an empty string. (Myron Marston, #841) +* Fix SystemStackError raised when diffing an Enumerable object + whose `#each` includes the object itself. (Yuji Nakayama, #857) + +### 3.3.1 / 2015-07-15 +[Full Changelog](http://github.com/rspec/rspec-expectations/compare/v3.3.0...v3.3.1) + +Bug Fixes: + +* Fix `be >`, `be <`, etc so that it fails rather than allowing an + argument error to be raised when compared against an object of the + wrong type. This allows it to be used in composed matcher expressions + against heterogeneous objects. (Dennis Günnewig, #809) +* Fix `respond_to` to work properly on target objects + that redefine the `method` method. (unmanbearpig, #821) + +### 3.3.0 / 2015-06-12 +[Full Changelog](http://github.com/rspec/rspec-expectations/compare/v3.2.1...v3.3.0) + +Enhancements: + +* Expose `RSpec::Matchers::EnglishPhrasing` to make it easier to write + nice failure messages in custom matchers. (Jared Beck, #736) +* Add `RSpec::Matchers::FailMatchers`, a mixin which provides + `fail`, `fail_with` and `fail_including` matchers for use in + specifying that an expectation fails for use by + extension/plugin authors. (Charlie Rudolph, #729) +* Avoid loading `tempfile` (and its dependencies) unless + it is absolutely needed. (Myron Marston, #735) +* Improve failure output when attempting to use `be_true` or `be_false`. + (Tim Wade, #744) +* Define `RSpec::Matchers#respond_to_missing?` so that + `RSpec::Matchers#respond_to?` and `RSpec::Matchers#method` handle + dynamic predicate matchers. (Andrei Botalov, #751) +* Use custom Time/DateTime/BigDecimal formatting for all matchers + so they are consistently represented in failure messages. + (Gavin Miller, #740) +* Add configuration to turn off warnings about matcher combinations that + may cause false positives. (Jon Rowe, #768) +* Warn when using a bare `raise_error` matcher that you may be subject to + false positives. (Jon Rowe, #768) +* Warn rather than raise when using the`raise_error` matcher in negative + expectations that may be subject to false positives. (Jon Rowe, #775) +* Improve failure message for `include(a, b, c)` so that if `a` and `b` + are included the failure message only mentions `c`. (Chris Arcand, #780) +* Allow `satisfy` matcher to take an optional description argument + that will be used in the `description`, `failure_message` and + `failure_message_when_negated` in place of the undescriptive + "sastify block". (Chris Arcand, #783) +* Add new `aggregate_failures` API that allows multiple independent + expectations to all fail and be listed in the failure output, rather + than the example aborting on the first failure. (Myron Marston, #776) +* Improve `raise_error` matcher so that it can accept a matcher as a single argument + that matches the message. (Time Wade, #782) + +Bug Fixes: + +* Make `contain_exactly` / `match_array` work with strict test doubles + that have not defined `<=>`. (Myron Marston, #758) +* Fix `include` matcher so that it omits the diff when it would + confusingly highlight items that are actually included but are not + an exact match in a line-by-line diff. (Tim Wade, #763) +* Fix `match` matcher so that it does not blow up when matching a string + or regex against another matcher (rather than a string or regex). + (Myron Marston, #772) +* Silence whitespace-only diffs. (Myron Marston, #801) + +### 3.2.1 / 2015-04-06 +[Full Changelog](http://github.com/rspec/rspec-expectations/compare/v3.2.0...v3.2.1) + +Bug Fixes: + +* Prevent `Range`s from being enumerated when generating matcher + descriptions. (Jon Rowe, #755) +* Ensure exception messages are compared as strings in the `raise_error` + matcher. (Jon Rowe, #755) + +### 3.2.0 / 2015-02-03 +[Full Changelog](http://github.com/rspec/rspec-expectations/compare/v3.1.2...v3.2.0) + +Enhancements: + +* Add `block_arg` method to custom matcher API, which allows you to + access the block passed to a custom matcher, if there is one. + (Mike Dalton, #645) +* Provide more detail in failure message of `yield_control` matcher. + (Jon Rowe, #650) +* Add a shorthand syntax for `chain` in the matcher DSL which assigns values + for use elsewhere, for example `chain :and_smaller_than, :small_value` + creates an `attr_reader` for `small_value` (Tom Stuart, #644) +* Provide a more helpful deprecation message when using the `should` syntax. + (Elia Schito, #663) +* Provide more detail in the `have_attributes` matcher failure message. + (Jon Rowe, #668) +* Make the `have_attributes` matcher diffable. + (Jon Rowe, Alexey Fedorov, #668) +* Add `output(...).to_std(out|err)_from_any_process` as alternatives + to `output(...).to_std(out|err)`. The latter doesn't work when a sub + process writes to the named stream but is much faster. + (Alex Genco, #700) +* Improve compound matchers (created by `and` and `or`) so that diffs + are included in failures when one or more of their matchers + are diffable. (Alexey Fedorov, #713) + +Bug Fixes: + +* Avoid calling `private_methods` from the `be` predicate matcher on + the target object if the object publicly responds to the predicate + method. This avoids a possible error that can occur if the object + raises errors from `private_methods` (which can happen with celluloid + objects). (@chapmajs, #670) +* Make `yield_control` (with no modifier) default to + `at_least(:once)` rather than raising a confusing error + when multiple yields are encountered. + (Myron Marston, #675) +* Fix "instance variable @color not initialized" warning when using + rspec-expectations outside of an rspec-core context. (Myron Marston, #689) +* Fix `start_with` and `end_with` to work properly when checking a + string against an array of strings. (Myron Marston, #690) +* Don't use internally delegated matchers when generating descriptions + for examples without doc strings. (Myron Marston, #692) + +### 3.1.2 / 2014-09-26 +[Full Changelog](http://github.com/rspec/rspec-expectations/compare/v3.1.1...v3.1.2) + +Bug Fixes: + +* Fix `define_negated_matcher` so that matchers that support fluent + interfaces continue to be negated after you use the chained method. + (Myron Marston, #656) +* Fix `define_negated_matcher` so that the matchers fail with an + appropriate failure message. (Myron Marston, #659) + +### 3.1.1 / 2014-09-15 +[Full Changelog](http://github.com/rspec/rspec-expectations/compare/v3.1.0...v3.1.1) + +Bug Fixes: + +* Fix regression in `all` matcher in 3.1.0 that prevented it from + working on objects that are not `Enumerable` but do implement + `each_with_index` (such as an ActiveRecord proxy). (Jori Hardman, #647) + +### 3.1.0 / 2014-09-04 +[Full Changelog](http://github.com/rspec/rspec-expectations/compare/v3.0.4...v3.1.0) + +Enhancements: + +* Add `have_attributes` matcher, that passes if actual's attribute + values match the expected attributes hash: + `Person = Struct.new(:name, :age)` + `person = Person.new("Bob", 32)` + `expect(person).to have_attributes(:name => "Bob", :age => 32)`. + (Adam Farhi, #571) +* Extended compound matcher support to block matchers, for cases like: + `expect { ... }.to change { x }.to(3).and change { y }.to(4)`. (Myron + Marston, #567) +* Include chained methods in custom matcher description and failure message + when new `include_chain_clauses_in_custom_matcher_descriptions` config + option is enabled. (Dan Oved, #600) +* Add `thrice` modifier to `yield_control` matcher as a synonym for + `exactly(3).times`. (Dennis Taylor, #615) +* Add `RSpec::Matchers.define_negated_matcher`, which defines a negated + version of the named matcher. (Adam Farhi, Myron Marston, #618) +* Document and support negation of `contain_exactly`/`match_array`. + (Jon Rowe, #626). + +Bug Fixes: + +* Rename private `LegacyMacherAdapter` constant to `LegacyMatcherAdapter` + to fix typo. (Abdelkader Boudih, #563) +* Fix `all` matcher so that it fails properly (rather than raising a + `NoMethodError`) when matched against a non-enumerable. (Hao Su, #622) + +### 3.0.4 / 2014-08-14 +[Full Changelog](http://github.com/rspec/rspec-expectations/compare/v3.0.3...v3.0.4) + +Bug Fixes: + +* Fix `start_with` and `end_with` so that they work properly with + structs. (Myron Marston, #620) +* Fix failure message generation so that structs are printed properly + in failures. Previously failure messages would represent them as + an array. (Myron Marston, #620) +* Fix composable matcher support so that it does not wrongly treat + structs as arrays. (Myron Marston, #620) + +### 3.0.3 / 2014-07-21 +[Full Changelog](http://github.com/rspec/rspec-expectations/compare/v3.0.2...v3.0.3) + +Bug Fixes: + +* Fix issue with detection of generic operator matchers so they work + correctly when undefined. (Myron Marston, #597) +* Don't inadvertently define `BasicObject` in 1.8.7. (Chris Griego, #603) +* Fix `include` matcher so that it fails gracefully when matched against + an object that does not respond to `include?`. (Myron Marston, #607) + +### 3.0.2 / 2014-06-19 +[Full Changelog](http://github.com/rspec/rspec-expectations/compare/v3.0.1...v3.0.2) + +Bug Fixes: + +* Fix regression in `contain_exactly` (AKA `match_array`) that caused it + to wrongly pass when the expected array was empty. (Myron Marston, #581) +* Provide a better error message when you use the `change(obj, :msg)` + form of the change matcher but forget the message argument. (Alex + Sunderland, #585) +* Make the `contain_exactly` matcher work with arrays that contain hashes in + arbitrary ordering. (Sam Phippen, #578) + +### 3.0.1 / 2014-06-12 +[Full Changelog](http://github.com/rspec/rspec-expectations/compare/v3.0.0...v3.0.1) + +Bug Fixes: + +* Add a missing `require` that would cause the `respond_to` matcher to + fail when used in a project where the rest of RSpec (e.g. core and + expecatations) weren't being used. (Myron Marston, #566) +* Structs are no longer treated as arrays when diffed. (Jon Rowe, #576) + +### 3.0.0 / 2014-06-01 +[Full Changelog](http://github.com/rspec/rspec-expectations/compare/v3.0.0.rc1...v3.0.0) + +No code changes. Just taking it out of pre-release. + +### 3.0.0.rc1 / 2014-05-18 +[Full Changelog](http://github.com/rspec/rspec-expectations/compare/v3.0.0.beta2...v3.0.0.rc1) + +Breaking Changes for 3.0.0: + +* Remove `matcher_execution_context` attribute from DSL-defined + custom matchers. (Myron Marston) +* Remove `RSpec::Matchers::Pretty#_pretty_print`. (Myron Marston) +* Remove `RSpec::Matchers::Pretty#expected_to_sentence`. (Myron Marston) +* Rename `RSpec::Matchers::Configuration` constant to + `RSpec::Expectations::Configuration`. (Myron Marston) +* Prevent `have_xyz` predicate matchers using private methods. + (Adrian Gonzalez) +* Block matchers must now implement `supports_block_expectations?`. + (Myron Marston) +* Stop supporting `require 'rspec-expectations'`. + Use `require 'rspec/expectations'` instead. (Myron Marston) + +Bug Fixes: + +* Fix `NoMethodError` triggered by beta2 when `YARD` was loaded in + the test environment. (Myron Marston) +* Fix `be_xyz` matcher to accept a `do...end` block. (Myron Marston) +* Fix composable matcher failure message generation logic + so that it does not blow up when given `$stdout` or `$stderr`. + (Myron Marston) +* Fix `change` matcher to work properly with `IO` objects. + (Myron Marston) +* Fix `exist` matcher so that it can be used in composed matcher + expressions involving objects that do not implement `exist?` or + `exists?`. (Daniel Fone) +* Fix composable matcher match logic so that it clones matchers + before using them in order to work properly with matchers + that use internal memoization based on a given `actual` value. + (Myron Marston) +* Fix `be_xyz` and `has_xyz` predicate matchers so that they can + be used in composed matcher expressions involving objects that + do not implement the predicate method. (Daniel Fone) + +Enhancements: + +* Document the remaining public APIs. rspec-expectations now has 100% of + the public API documented and will remain that way (as new undocumented + methods will fail the build). (Myron Marston) +* Improve the formatting of BigDecimal objects in `eq` matcher failure + messages. (Daniel Fone) +* Improve the failure message for `be_xyz` predicate matchers so + that it includes the `inspect` output of the receiver. + (Erik Michaels-Ober, Sam Phippen) +* Add `all` matcher, to allow you to specify that a given matcher + matches all elements in a collection: + `expect([1, 3, 5]).to all( be_odd )`. (Adam Farhi) +* Add boolean aliases (`&`/`|`) for compound operators (`and`/`or`). (Adam Farhi) +* Give users a clear error when they wrongly use a value matcher + in a block expectation expression (e.g. `expect { 3 }.to eq(3)`) + or vice versa. (Myron Marston) + +### 3.0.0.beta2 / 2014-02-17 +[Full Changelog](http://github.com/rspec/rspec-expectations/compare/v3.0.0.beta1...v3.0.0.beta2) + +Breaking Changes for 3.0.0: + +* Remove deprecated support for accessing the `RSpec` constant using + `Rspec` or `Spec`. (Myron Marston) +* Remove deprecated `RSpec::Expectations.differ=`. (Myron Marston) +* Remove support for deprecated `expect(...).should`. (Myron Marston) +* Explicitly disallow `expect { }.not_to change { }` with `by`, + `by_at_least`, `by_at_most` or `to`. These have never been supported + but did not raise explicit errors. (Myron Marston) +* Provide `===` rather than `==` as an alias of `matches?` for + all matchers. The semantics of `===` are closer to an RSpec + matcher than `==`. (Myron Marston) +* Remove deprecated `RSpec::Matchers::OperatorMatcher` constant. + (Myron Marston) +* Make `RSpec::Expectations::ExpectationNotMetError` subclass + `Exception` rather than `StandardError` so they can bypass + a bare `rescue` in end-user code (e.g. when an expectation is + set from within a rspec-mocks stub implementation). (Myron Marston) +* Remove Test::Unit and Minitest 4.x integration. (Myron Marston) + +Enhancements: + +* Simplify the failure message of the `be` matcher when matching against: + `true`, `false` and `nil`. (Sam Phippen) +* Update matcher protocol and custom matcher DSL to better align + with the newer `expect` syntax. If you want your matchers to + maintain compatibility with multiple versions of RSpec, you can + alias the new names to the old. (Myron Marston) + * `failure_message_for_should` => `failure_message` + * `failure_message_for_should_not` => `failure_message_when_negated` + * `match_for_should` => `match` + * `match_for_should_not` => `match_when_negated` +* Improve generated descriptions from `change` matcher. (Myron Marston) +* Add support for compound matcher expressions using `and` and `or`. + Simply chain them off of any existing matcher to create an expression + like `expect(alphabet).to start_with("a").and end_with("z")`. + (Eloy Espinaco) +* Add `contain_exactly` as a less ambiguous version of `match_array`. + Note that it expects the expected array to be splatted as + individual args: `expect(array).to contain_exactly(1, 2)` is + the same as `expect(array).to match_array([1, 2])`. (Myron Marston) +* Update `contain_exactly`/`match_array` so that it can match against + other non-array collections (such as a `Set`). (Myron Marston) +* Update built-in matchers so that they can accept matchers as arguments + to allow you to compose matchers in arbitrary ways. (Myron Marston) +* Add `RSpec::Matchers::Composable` mixin that can be used to make + a custom matcher composable as well. Note that custom matchers + defined via `RSpec::Matchers.define` already have this. (Myron + Marston) +* Define noun-phrase aliases for built-in matchers, which can be + used when creating composed matcher expressions that read better + and provide better failure messages. (Myron Marston) +* Add `RSpec::Matchers.alias_matcher` so users can define their own + matcher aliases. The `description` of the matcher will reflect the + alternate matcher name. (Myron Marston) +* Add explicit `be_between` matcher. `be_between` has worked for a + long time as a dynamic predicate matcher, but the failure message + was suboptimal. The new matcher provides a much better failure + message. (Erik Michaels-Ober) +* Enhance the `be_between` matcher to allow for `inclusive` or `exclusive` + comparison (e.g. inclusive of min/max or exclusive of min/max). + (Pedro Gimenez) +* Make failure message for `not_to be #{operator}` less confusing by + only saying it's confusing when comparison operators are used. + (Prathamesh Sonpatki) +* Improve failure message of `eq` matcher when `Time` or `DateTime` + objects are used so that the full sub-second precision is included. + (Thomas Holmes, Jeff Wallace) +* Add `output` matcher for expecting that a block outputs `to_stdout` + or `to_stderr`. (Luca Pette, Matthias Günther) +* Forward a provided block on to the `has_xyz?` method call when + the `have_xyz` matcher is used. (Damian Galarza) +* Provide integration with Minitest 5.x. Require + `rspec/expectations/minitest_integration` after loading minitest + to use rspec-expectations with minitest. (Myron Marston) + +Bug Fixes: + +* Fix wrong matcher descriptions with falsey expected value (yujinakayama) +* Fix `expect { }.not_to change { }.from(x)` so that the matcher only + passes if the starting value is `x`. (Tyler Rick, Myron Marston) +* Fix hash diffing, so that it colorizes properly and doesn't consider trailing + commas when performing the diff. (Jared Norman) +* Fix built-in matchers to fail normally rather than raising + `ArgumentError` when given an object of the wrong type to match + against, so that they work well in composite matcher expressions like + `expect([1.51, "foo"]).to include(a_string_matching(/foo/), a_value_within(0.1).of(1.5))`. + (Myron Marston) + +Deprecations: + +* Retain support for RSpec 2 matcher protocol (e.g. for matchers + in 3rd party extension gems like `shoulda`), but it will print + a deprecation warning. (Myron Marston) + +### 3.0.0.beta1 / 2013-11-07 +[Full Changelog](http://github.com/rspec/rspec-expectations/compare/v2.99.2...v3.0.0.beta1) + +Breaking Changes for 3.0.0: + +* Remove explicit support for 1.8.6. (Jon Rowe) +* Remove the deprecated `be_close` matcher, preferring `be_within` instead. + (Sam Phippen) +* Remove the deprecated `have`, `have_at_least` and `have_at_most` matchers. + You can continue using those matchers through https://github.com/rspec/rspec-collection_matchers, + or you can rewrite your expectations with something like + `expect(your_object.size).to eq(num)`. (Hugo Baraúna) +* Rename `be_true` and `be_false` to `be_truthy` and `be_falsey`. (Sam Phippen) +* Make `expect { }.to_not raise_error(SomeSpecificClass, message)`, + `expect { }.to_not raise_error(SomeSpecificClass)` and + `expect { }.to_not raise_error(message)` invalid, since they are prone + to hiding failures. Instead, use `expect { }.to_not raise_error` (with no + args). (Sam Phippen) +* Within `RSpec::Matchers.define` blocks, helper methods made available + either via `def self.helper` or `extend HelperModule` are no longer + available to the `match` block (or any of the others). Instead + `include` your helper module and define the helper method as an + instance method. (Myron Marston) +* Force upgrading Diff::LCS for encoding compatability with diffs. (Jon Rowe) + +Enhancements: + +* Support `do..end` style block with `raise_error` matcher. (Yuji Nakayama) +* Rewrote custom matcher DSL to simplify its implementation and solve a + few issues. (Myron Marston) +* Allow early `return` from within custom matcher DSL blocks. (Myron + Marston) +* The custom matcher DSL's `chain` can now accept a block. (Myron + Marston) +* Support setting an expectation on a `raise_error` matcher via a chained + `with_message` method call. (Sam Phippen) + +Bug Fixes: + +* Allow `include` and `match` matchers to be used from within a + DSL-defined custom matcher's `match` block. (Myron Marston) +* Correct encoding error message on diff failure (Jon Rowe) + +Deprecations: + + * Using the old `:should` syntax without explicitly configuring it is deprecated. + It will continue to work but will emit a deprecation warning in RSpec 3 if + you do not explicitly enable it. (Sam Phippen) + +### 2.99.2 / 2014-07-21 +[Full Changelog](http://github.com/rspec/rspec-expectations/compare/v2.99.1...v2.99.2) + +Bug Fixes: + +* Fix regression in `Expectations#method_handle_for` where proxy objects + with method delegated would wrongly not return a method handle. + (Jon Rowe, #594) +* Fix issue with detection of generic operator matchers so they work + correctly when undefined. (Myron Marston, #597) + +### 2.99.1 / 2014-06-19 +[Full Changelog](http://github.com/rspec/rspec-expectations/compare/v2.99.0...v2.99.1) + +Bug Fixes: + +* Fix typo in custom matcher `expected` deprecation warning -- it's + `expected_as_array`, not `expected_array`. (Frederick Cheung, #562) + +### 2.99.0 / 2014-06-01 +[Full Changelog](http://github.com/rspec/rspec-expectations/compare/v2.99.0.rc1...v2.99.0) + +Enhancements: + +* Special case deprecation message for `errors_on` with `rspec-rails` to be more useful. + (Aaron Kromer) + +### 2.99.0.rc1 / 2014-05-18 +[Full Changelog](http://github.com/rspec/rspec-expectations/compare/v2.99.0.beta2...2.99.0.rc1) + +Deprecations: + +* Deprecate `matcher_execution_context` attribute on DSL-defined + custom matchers. (Myron Marston) +* Deprecate `RSpec::Matchers::Pretty#_pretty_print`. (Myron Marston) +* Deprecate `RSpec::Matchers::Pretty#expected_to_sentence`. (Myron Marston) +* Deprecate `RSpec::Matchers::Configuration` in favor of + `RSpec::Expectations::Configuration`. (Myron Marston) +* Deprecate `be_xyz` predicate matcher on an object that doesn't respond to + `xyz?` or `xyzs?`. (Daniel Fone) +* Deprecate `have_xyz` matcher on an object that doesn't respond to `has_xyz?`. + (Daniel Fone) +* Deprecate `have_xyz` matcher on an object that has a private method `has_xyz?`. + (Jon Rowe) +* Issue a deprecation warning when a block expectation expression is + used with a matcher that doesn't explicitly support block expectations + via `supports_block_expectations?`. (Myron Marston) +* Deprecate `require 'rspec-expectations'`. Use + `require 'rspec/expectations'` instead. (Myron Marston) + +### 2.99.0.beta2 / 2014-02-17 +[Full Changelog](http://github.com/rspec/rspec-expectations/compare/v2.99.0.beta1...v2.99.0.beta2) + +Deprecations: + +* Deprecate chaining `by`, `by_at_least`, `by_at_most` or `to` off of + `expect { }.not_to change { }`. The docs have always said these are + not supported for the negative form but now they explicitly raise + errors in RSpec 3. (Myron Marston) +* Change the semantics of `expect { }.not_to change { x }.from(y)`. + In RSpec 2.x, this expectation would only fail if `x` started with + the value of `y` and changed. If it started with a different value + and changed, it would pass. In RSpec 3, it will pass only if the + value starts at `y` and it does not change. (Myron Marston) +* Deprecate `matcher == value` as an alias for `matcher.matches?(value)`, + in favor of `matcher === value`. (Myron Marston) +* Deprecate `RSpec::Matchers::OperatorMatcher` in favor of + `RSpec::Matchers::BuiltIn::OperatorMatcher`. (Myron Marston) +* Deprecate auto-integration with Test::Unit and minitest. + Instead, include `RSpec::Matchers` in the appropriate test case + base class yourself. (Myron Marston) +* Deprecate treating `#expected` on a DSL-generated custom matcher + as an array when only 1 argument is passed to the matcher method. + In RSpec 3 it will be the single value in order to make diffs + work properly. (Jon Rowe) + +### 2.99.0.beta1 / 2013-11-07 +[Full Changelog](http://github.com/rspec/rspec-expectations/compare/v2.14.4...v2.99.0.beta1) + +Deprecations + +* Deprecate `have`, `have_at_least` and `have_at_most`. You can continue using those + matchers through https://github.com/rspec/rspec-collection_matchers, or + you can rewrite your expectations with something like + `expect(your_object.size).to eq(num)`. (Hugo Baraúna) +* Deprecate `be_xyz` predicate matcher when `xyz?` is a private method. + (Jon Rowe) +* Deprecate `be_true`/`be_false` in favour of `be_truthy`/`be_falsey` + (for Ruby's conditional semantics) or `be true`/`be false` + (for exact equality). (Sam Phippen) +* Deprecate calling helper methods from a custom matcher with the wrong + scope. (Myron Marston) + * `def self.foo` / `extend Helper` can be used to add macro methods + (e.g. methods that call the custom matcher DSL methods), but should + not be used to define helper methods called from within the DSL + blocks. + * `def foo` / `include Helper` is the opposite: it's for helper methods + callable from within a DSL block, but not for defining macros. + * RSpec 2.x allowed helper methods defined either way to be used for + either purpose, but RSpec 3.0 will not. + +### 2.14.5 / 2014-02-01 +[Full Changelog](http://github.com/rspec/rspec-expectations/compare/v2.14.4...v2.14.5) + +Bug fixes + +* Fix wrong matcher descriptions with falsey expected value + (yujinakayama) + +### 2.14.4 / 2013-11-06 +[Full Changelog](http://github.com/rspec/rspec-expectations/compare/v2.14.3...v2.14.4) + +Bug fixes + +* Make the `match` matcher produce a diff output. (Jon Rowe, Ben Moss) +* Choose encoding for diff's more intelligently, and when all else fails fall + back to default internal encoding with replacing characters. (Jon Rowe) + +### 2.14.3 / 2013-09-22 +[Full Changelog](http://github.com/rspec/rspec-expectations/compare/v2.14.2...v2.14.3) + +Bug fixes + +* Fix operator matchers (`should` syntax) when `method` is redefined on target. + (Brandon Turner) +* Fix diffing of hashes with object based keys. (Jon Rowe) +* Fix operator matchers (`should` syntax) when operator is defined via + `method_missing` (Jon Rowe) + +### 2.14.2 / 2013-08-14 +[Full Changelog](http://github.com/rspec/rspec-expectations/compare/v2.14.1...v2.14.2) + +Bug fixes + +* Fix `be_` matcher to not support operator chaining like the + `be` matcher does (e.g. `be == 5`). This led to some odd behaviors + since `be_ == anything` returned a `BeComparedTo` matcher + and was thus always truthy. This was a consequence of the implementation + (e.g. subclassing the basic `Be` matcher) and was not intended behavior. + (Myron Marston). +* Fix `change` matcher to compare using `==` in addition to `===`. This + is important for an expression like: + `expect {}.to change { a.class }.from(ClassA).to(ClassB)` because + `SomeClass === SomeClass` returns false. (Myron Marston) + +### 2.14.1 / 2013-08-08 +[Full Changelog](http://github.com/rspec/rspec-expectations/compare/v2.14.0...2.14.1) + +Bug fixes + +* Ensure diff output uses the same encoding as the encoding of + the string being diff'd to prevent `Encoding::UndefinedConversionError` + errors (Jon Rowe). + +### 2.14.0 / 2013-07-06 +[Full Changelog](http://github.com/rspec/rspec-expectations/compare/v2.14.0.rc1...v2.14.0) + +Bug fixes + +* Values that are not matchers use `#inspect`, rather than `#description` for + documentation output (Andy Lindeman, Sam Phippen). +* Make `expect(a).to be_within(x).percent_of(y)` work with negative y + (Katsuhiko Nishimra). +* Make the `be_predicate` matcher work as expected used with `expect{...}.to + change...` (Sam Phippen). + +### 2.14.0.rc1 / 2013-05-27 +[Full Changelog](http://github.com/rspec/rspec-expectations/compare/v2.13.0...v2.14.0.rc1) + +Enhancements + +* Enhance `yield_control` so that you can specify an exact or relative + number of times: `expect { }.to yield_control.exactly(3).times`, + `expect { }.to yield_control.at_least(2).times`, etc (Bartek + Borkowski). +* Make the differ that is used when an expectation fails better handle arrays + by splitting each element of the array onto its own line. (Sam Phippen) +* Accept duck-typed strings that respond to `:to_str` as expectation messages. + (Toby Ovod-Everett) + +Bug fixes + +* Fix differ to not raise errors when dealing with differently-encoded + strings (Jon Rowe). +* Fix `expect(something).to be_within(x).percent_of(y)` where x and y are both + integers (Sam Phippen). +* Fix `have` matcher to handle the fact that on ruby 2.0, + `Enumerator#size` may return nil (Kenta Murata). +* Fix `expect { raise s }.to raise_error(s)` where s is an error instance + on ruby 2.0 (Sam Phippen). +* Fix `expect(object).to raise_error` passing. This now warns the user and + fails the spec (tomykaira). + +Deprecations + +* Deprecate `expect { }.not_to raise_error(SpecificErrorClass)` or + `expect { }.not_to raise_error("some specific message")`. Using + these was prone to hiding failures as they would allow _any other + error_ to pass. (Sam Phippen and David Chelimsky) + +### 2.13.0 / 2013-02-23 +[Full Changelog](http://github.com/rspec/rspec-expectations/compare/v2.12.1...v2.13.0) + +Enhancements + +* Add support for percent deltas to `be_within` matcher: + `expect(value).to be_within(10).percent_of(expected)` + (Myron Marston). +* Add support to `include` matcher to allow it to be given a list + of matchers as the expecteds to match against (Luke Redpath). + +Bug fixes + +* Fix `change` matcher so that it dups strings in order to handle + mutated strings (Myron Marston). +* Fix `should be =~ /some regex/` / `expect(...).to be =~ /some regex/`. + Previously, these either failed with a confusing `undefined method + matches?' for false:FalseClass` error or were no-ops that didn't + actually verify anything (Myron Marston). +* Add compatibility for diff-lcs 1.2 and relax the version + constraint (Peter Goldstein). +* Fix DSL-generated matchers to allow multiple instances of the + same matcher in the same example to have different description + and failure messages based on the expected value (Myron Marston). +* Prevent `undefined method #split for Array` error when dumping + the diff of an array of multiline strings (Myron Marston). +* Don't blow up when comparing strings that are in an encoding + that is not ASCII compatible (Myron Marston). +* Remove confusing "Check the implementation of #==" message + printed for empty diffs (Myron Marston). + +### 2.12.1 / 2012-12-15 +[Full Changelog](http://github.com/rspec/rspec-expectations/compare/v2.12.0...v2.12.1) + +Bug fixes + +* Improve the failure message for an expression like + `{}.should =~ {}`. (Myron Marston and Andy Lindeman) +* Provide a `match_regex` alias so that custom matchers + built using the matcher DSL can use it (since `match` + is a different method in that context). + (Steven Harman) + +### 2.12.0 / 2012-11-12 +[Full Changelog](http://github.com/rspec/rspec-expectations/compare/v2.11.3...v2.12.0) + +Enhancements + +* Colorize diffs if the `--color` option is configured. (Alex Coplan) +* Include backtraces in unexpected errors handled by `raise_error` + matcher (Myron Marston) +* Print a warning when users accidentally pass a non-string argument + as an expectation message (Sam Phippen) +* `=~` and `match_array` matchers output a more useful error message when + the actual value is not an array (or an object that responds to `#to_ary`) + (Sam Phippen) + +Bug fixes + +* Fix `include` matcher so that `expect({}).to include(:a => nil)` + fails as it should (Sam Phippen). +* Fix `be_an_instance_of` matcher so that `Class#to_s` is used in the + description rather than `Class#inspect`, since some classes (like + `ActiveRecord::Base`) define a long, verbose `#inspect`. + (Tom Stuart) + +### 2.11.3 / 2012-09-04 +[Full Changelog](http://github.com/rspec/rspec-expectations/compare/v2.11.2...v2.11.3) + +Bug fixes + +* Fix (and deprecate) `expect { }.should` syntax so that it works even + though it was never a documented or intended syntax. It worked as a + consequence of the implementation of `expect` in RSpec 2.10 and + earlier. (Myron Marston) +* Ensure #== is defined on built in matchers so that they can be composed. + For example: + + expect { + user.emailed! + }.to change { user.last_emailed_at }.to be_within(1.second).of(Time.zone.now) + +### 2.11.2 / 2012-07-25 +[Full Changelog](http://github.com/rspec/rspec-expectations/compare/v2.11.1...v2.11.2) + +Bug fixes + +* Define `should` and `should_not` on `Object` rather than `BasicObject` + on MacRuby. On MacRuby, `BasicObject` is defined but is not the root + of the object hierarchy. (Gabriel Gilder) + +### 2.11.1 / 2012-07-08 +[Full Changelog](http://github.com/rspec/rspec-expectations/compare/v2.11.0...v2.11.1) + +Bug fixes + +* Constrain `actual` in `be_within` matcher to values that respond to `-` instead + of requiring a specific type. + * `Time`, for example, is a legit alternative. + +### 2.11.0 / 2012-07-07 +[Full Changelog](http://github.com/rspec/rspec-expectations/compare/v2.10.0...v2.11.0) + +Enhancements + +* Expand `expect` syntax so that it supports expections on bare values + in addition to blocks (Myron Marston). +* Add configuration options to control available expectation syntaxes + (Myron Marston): + * `RSpec.configuration.expect_with(:rspec) { |c| c.syntax = :expect }` + * `RSpec.configuration.expect_with(:rspec) { |c| c.syntax = :should }` + * `RSpec.configuration.expect_with(:rspec) { |c| c.syntax = [:should, :expect] }` + * `RSpec.configuration.add_should_and_should_not_to Delegator` + +Bug fixes + +* Allow only `Numeric` values to be the "actual" in the `be_within` matcher. + This prevents confusing error messages. (Su Zhang @zhangsu) +* Define `should` and `should_not` on `BasicObject` rather than `Kernel` + on 1.9. This makes `should` and `should_not` work properly with + `BasicObject`-subclassed proxy objects like `Delegator`. (Myron + Marston) + +### 2.10.0 / 2012-05-03 +[Full Changelog](http://github.com/rspec/rspec-expectations/compare/v2.9.1...v2.10.0) + +Enhancements + +* Add new `start_with` and `end_with` matchers (Jeremy Wadsack) +* Add new matchers for specifying yields (Myron Marston): + * `expect {...}.to yield_control` + * `expect {...}.to yield_with_args(1, 2, 3)` + * `expect {...}.to yield_with_no_args` + * `expect {...}.to yield_successive_args(1, 2, 3)` +* `match_unless_raises` takes multiple exception args + +Bug fixes + +* Fix `be_within` matcher to be inclusive of delta. +* Fix message-specific specs to pass on Rubinius (John Firebaugh) + +### 2.9.1 / 2012-04-03 +[Full Changelog](http://github.com/rspec/rspec-expectations/compare/v2.9.0...v2.9.1) + +Bug fixes + +* Provide a helpful message if the diff between two objects is empty. +* Fix bug diffing single strings with multiline strings. +* Fix for error with using custom matchers inside other custom matchers + (mirasrael) +* Fix using execution context methods in nested DSL matchers (mirasrael) + +### 2.9.0 / 2012-03-17 +[Full Changelog](http://github.com/rspec/rspec-expectations/compare/v2.8.0...v2.9.0) + +Enhancements + +* Move built-in matcher classes to RSpec::Matchers::BuiltIn to reduce pollution + of RSpec::Matchers (which is included in every example). +* Autoload files with matcher classes to improve load time. + +Bug fixes + +* Align `respond_to?` and `method_missing` in DSL-defined matchers. +* Clear out user-defined instance variables between invocations of DSL-defined + matchers. +* Dup the instance of a DSL generated matcher so its state is not changed by + subsequent invocations. +* Treat expected args consistently across positive and negative expectations + (thanks to Ralf Kistner for the heads up) + +### 2.8.0 / 2012-01-04 + +[Full Changelog](http://github.com/rspec/rspec-expectations/compare/v2.8.0.rc2...v2.8.0) + +Enhancements + +* Better diff output for Hash (Philippe Creux) +* Eliminate Ruby warnings (Olek Janiszewski) + +### 2.8.0.rc2 / 2011-12-19 + +[Full Changelog](http://github.com/rspec/rspec-expectations/compare/v2.8.0.rc1...v2.8.0.rc2) + +No changes for this release. Just releasing with the other rspec gems. + +### 2.8.0.rc1 / 2011-11-06 + +[Full Changelog](http://github.com/rspec/rspec-expectations/compare/v2.7.0...v2.8.0.rc1) + +Enhancements + +* Use classes for the built-in matchers (they're faster). +* Eliminate Ruby warnings (Matijs van Zuijlen) + +### 2.7.0 / 2011-10-16 + +[Full Changelog](http://github.com/rspec/rspec-expectations/compare/v2.6.0...v2.7.0) + +Enhancements + +* `HaveMatcher` converts argument using `to_i` (Alex Bepple & Pat Maddox) +* Improved failure message for the `have_xxx` matcher (Myron Marston) +* `HaveMatcher` supports `count` (Matthew Bellantoni) +* Change matcher dups `Enumerable` before the action, supporting custom + `Enumerable` types like `CollectionProxy` in Rails (David Chelimsky) + +Bug fixes + +* Fix typo in `have(n).xyz` documentation (Jean Boussier) +* fix `safe_sort` for ruby 1.9.2 (`Kernel` now defines `<=>` for Object) (Peter + van Hardenberg) + +### 2.6.0 / 2011-05-12 + +[Full Changelog](http://github.com/rspec/rspec-expectations/compare/v2.5.0...v2.6.0) + +Enhancements + +* `change` matcher accepts regexps (Robert Davis) +* better descriptions for `have_xxx` matchers (Magnus Bergmark) +* `range.should cover(*values)` (Anders Furseth) + +Bug fixes + +* Removed non-ascii characters that were choking rcov (Geoffrey Byers) +* change matcher dups arrays and hashes so their before/after states can be + compared correctly. +* Fix the order of inclusion of RSpec::Matchers in Test::Unit::TestCase and + MiniTest::Unit::TestCase to prevent a SystemStackError (Myron Marston) + +### 2.5.0 / 2011-02-05 + +[Full Changelog](http://github.com/rspec/rspec-expectations/compare/v2.4.0...v2.5.0) + +Enhancements + +* `should exist` works with `exist?` or `exists?` (Myron Marston) +* `expect { ... }.not_to do_something` (in addition to `to_not`) + +Documentation + +* improved docs for raise_error matcher (James Almond) + +### 2.4.0 / 2011-01-02 + +[Full Changelog](http://github.com/rspec/rspec-expectations/compare/v2.3.0...v2.4.0) + +No functional changes in this release, which was made to align with the +rspec-core-2.4.0 release. + +Enhancements + +* improved RDoc for change matcher (Jo Liss) + +### 2.3.0 / 2010-12-12 + +[Full Changelog](http://github.com/rspec/rspec-expectations/compare/v2.2.1...v2.3.0) + +Enhancements + +* diff strings when include matcher fails (Mike Sassak) + +### 2.2.0 / 2010-11-28 + +[Full Changelog](http://github.com/rspec/rspec-expectations/compare/v2.1.0...v2.2.0) + +### 2.1.0 / 2010-11-07 + +[Full Changelog](http://github.com/rspec/rspec-expectations/compare/v2.0.1...v2.1.0) + +Enhancements + +* `be_within(delta).of(expected)` matcher (Myron Marston) +* Lots of new Cucumber features (Myron Marston) +* Raise error if you try `should != expected` on Ruby-1.9 (Myron Marston) +* Improved failure messages from `throw_symbol` (Myron Marston) + +Bug fixes + +* Eliminate hard dependency on `RSpec::Core` (Myron Marston) +* `have_matcher` - use pluralize only when ActiveSupport inflections are indeed + defined (Josep M Bach) +* throw_symbol matcher no longer swallows exceptions (Myron Marston) +* fix matcher chaining to avoid name collisions (Myron Marston) + +### 2.0.0 / 2010-10-10 + +[Full Changelog](http://github.com/rspec/rspec-expectations/compare/v2.0.0.rc...v2.0.0) + +Enhancements + +* Add match_for_should_not method to matcher DSL (Myron Marston) + +Bug fixes + +* `respond_to` matcher works correctly with `should_not` with multiple methods + (Myron Marston) +* `include` matcher works correctly with `should_not` with multiple values + (Myron Marston) + +### 2.0.0.rc / 2010-10-05 + +[Full Changelog](http://github.com/rspec/rspec-expectations/compare/v2.0.0.beta.22...v2.0.0.rc) + +Enhancements + +* `require 'rspec/expectations'` in a T::U or MiniUnit suite (Josep M. Bach) + +Bug fixes + +* change by 0 passes/fails correctly (Len Smith) +* Add description to satisfy matcher + +### 2.0.0.beta.22 / 2010-09-12 + +[Full Changelog](http://github.com/rspec/rspec-expectations/compare/v2.0.0.beta.20...v2.0.0.beta.22) + +Enhancements + +* diffing improvements + * diff multiline strings + * don't diff single line strings + * don't diff numbers (silly) + * diff regexp + multiline string + +Bug fixes + * `should[_not]` change now handles boolean values correctly diff --git a/vendor/bundle/ruby/3.1.0/gems/rspec-expectations-3.11.0/LICENSE.md b/vendor/bundle/ruby/3.1.0/gems/rspec-expectations-3.11.0/LICENSE.md new file mode 100644 index 000000000..dae02d8a7 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/rspec-expectations-3.11.0/LICENSE.md @@ -0,0 +1,25 @@ +The MIT License (MIT) +===================== + +* Copyright © 2012 David Chelimsky, Myron Marston +* Copyright © 2006 David Chelimsky, The RSpec Development Team +* Copyright © 2005 Steven Baker + +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/vendor/bundle/ruby/3.1.0/gems/rspec-expectations-3.11.0/README.md b/vendor/bundle/ruby/3.1.0/gems/rspec-expectations-3.11.0/README.md new file mode 100644 index 000000000..605c834e2 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/rspec-expectations-3.11.0/README.md @@ -0,0 +1,320 @@ +# RSpec Expectations [![Build Status](https://github.com/rspec/rspec-expectations/workflows/RSpec%20CI/badge.svg)](https://github.com/rspec/rspec-expectations/actions) [![Code Climate](https://codeclimate.com/github/rspec/rspec-expectations.svg)](https://codeclimate.com/github/rspec/rspec-expectations) + +RSpec::Expectations lets you express expected outcomes on an object in an +example. + +```ruby +expect(account.balance).to eq(Money.new(37.42, :USD)) +``` + +## Install + +If you want to use rspec-expectations with rspec, just install the rspec gem +and RubyGems will also install rspec-expectations for you (along with +rspec-core and rspec-mocks): + + gem install rspec + +Want to run against the `main` branch? You'll need to include the dependent +RSpec repos as well. Add the following to your `Gemfile`: + +```ruby +%w[rspec-core rspec-expectations rspec-mocks rspec-support].each do |lib| + gem lib, :git => "https://github.com/rspec/#{lib}.git", :branch => 'main' +end +``` + +If you want to use rspec-expectations with another tool, like Test::Unit, +Minitest, or Cucumber, you can install it directly: + + gem install rspec-expectations + +## Contributing + +Once you've set up the environment, you'll need to cd into the working +directory of whichever repo you want to work in. From there you can run the +specs and cucumber features, and make patches. + +NOTE: You do not need to use rspec-dev to work on a specific RSpec repo. You +can treat each RSpec repo as an independent project. + +- [Build details](BUILD_DETAIL.md) +- [Code of Conduct](CODE_OF_CONDUCT.md) +- [Detailed contributing guide](CONTRIBUTING.md) +- [Development setup guide](DEVELOPMENT.md) + +## Basic usage + +Here's an example using rspec-core: + +```ruby +RSpec.describe Order do + it "sums the prices of the items in its line items" do + order = Order.new + order.add_entry(LineItem.new(:item => Item.new( + :price => Money.new(1.11, :USD) + ))) + order.add_entry(LineItem.new(:item => Item.new( + :price => Money.new(2.22, :USD), + :quantity => 2 + ))) + expect(order.total).to eq(Money.new(5.55, :USD)) + end +end +``` + +The `describe` and `it` methods come from rspec-core. The `Order`, `LineItem`, `Item` and `Money` classes would be from _your_ code. The last line of the example +expresses an expected outcome. If `order.total == Money.new(5.55, :USD)`, then +the example passes. If not, it fails with a message like: + + expected: # + got: # + +## Built-in matchers + +### Equivalence + +```ruby +expect(actual).to eq(expected) # passes if actual == expected +expect(actual).to eql(expected) # passes if actual.eql?(expected) +expect(actual).not_to eql(not_expected) # passes if not(actual.eql?(expected)) +``` + +Note: The new `expect` syntax no longer supports the `==` matcher. + +### Identity + +```ruby +expect(actual).to be(expected) # passes if actual.equal?(expected) +expect(actual).to equal(expected) # passes if actual.equal?(expected) +``` + +### Comparisons + +```ruby +expect(actual).to be > expected +expect(actual).to be >= expected +expect(actual).to be <= expected +expect(actual).to be < expected +expect(actual).to be_within(delta).of(expected) +``` + +### Regular expressions + +```ruby +expect(actual).to match(/expression/) +``` + +Note: The new `expect` syntax no longer supports the `=~` matcher. + +### Types/classes + +```ruby +expect(actual).to be_an_instance_of(expected) # passes if actual.class == expected +expect(actual).to be_a(expected) # passes if actual.kind_of?(expected) +expect(actual).to be_an(expected) # an alias for be_a +expect(actual).to be_a_kind_of(expected) # another alias +``` + +### Truthiness + +```ruby +expect(actual).to be_truthy # passes if actual is truthy (not nil or false) +expect(actual).to be true # passes if actual == true +expect(actual).to be_falsy # passes if actual is falsy (nil or false) +expect(actual).to be false # passes if actual == false +expect(actual).to be_nil # passes if actual is nil +expect(actual).to_not be_nil # passes if actual is not nil +``` + +### Expecting errors + +```ruby +expect { ... }.to raise_error +expect { ... }.to raise_error(ErrorClass) +expect { ... }.to raise_error("message") +expect { ... }.to raise_error(ErrorClass, "message") +``` + +### Expecting throws + +```ruby +expect { ... }.to throw_symbol +expect { ... }.to throw_symbol(:symbol) +expect { ... }.to throw_symbol(:symbol, 'value') +``` + +### Yielding + +```ruby +expect { |b| 5.tap(&b) }.to yield_control # passes regardless of yielded args + +expect { |b| yield_if_true(true, &b) }.to yield_with_no_args # passes only if no args are yielded + +expect { |b| 5.tap(&b) }.to yield_with_args(5) +expect { |b| 5.tap(&b) }.to yield_with_args(Integer) +expect { |b| "a string".tap(&b) }.to yield_with_args(/str/) + +expect { |b| [1, 2, 3].each(&b) }.to yield_successive_args(1, 2, 3) +expect { |b| { :a => 1, :b => 2 }.each(&b) }.to yield_successive_args([:a, 1], [:b, 2]) +``` + +### Predicate matchers + +```ruby +expect(actual).to be_xxx # passes if actual.xxx? +expect(actual).to have_xxx(:arg) # passes if actual.has_xxx?(:arg) +``` + +### Ranges (Ruby >= 1.9 only) + +```ruby +expect(1..10).to cover(3) +``` + +### Collection membership + +```ruby +# exact order, entire collection +expect(actual).to eq(expected) + +# exact order, partial collection (based on an exact position) +expect(actual).to start_with(expected) +expect(actual).to end_with(expected) + +# any order, entire collection +expect(actual).to match_array(expected) + +# You can also express this by passing the expected elements +# as individual arguments +expect(actual).to contain_exactly(expected_element1, expected_element2) + + # any order, partial collection +expect(actual).to include(expected) +``` + +#### Examples + +```ruby +expect([1, 2, 3]).to eq([1, 2, 3]) # Order dependent equality check +expect([1, 2, 3]).to include(1) # Exact ordering, partial collection matches +expect([1, 2, 3]).to include(2, 3) # +expect([1, 2, 3]).to start_with(1) # As above, but from the start of the collection +expect([1, 2, 3]).to start_with(1, 2) # +expect([1, 2, 3]).to end_with(3) # As above but from the end of the collection +expect([1, 2, 3]).to end_with(2, 3) # +expect({:a => 'b'}).to include(:a => 'b') # Matching within hashes +expect("this string").to include("is str") # Matching within strings +expect("this string").to start_with("this") # +expect("this string").to end_with("ring") # +expect([1, 2, 3]).to contain_exactly(2, 3, 1) # Order independent matches +expect([1, 2, 3]).to match_array([3, 2, 1]) # + +# Order dependent compound matchers +expect( + [{:a => 'hash'},{:a => 'another'}] +).to match([a_hash_including(:a => 'hash'), a_hash_including(:a => 'another')]) +``` + +## `should` syntax + +In addition to the `expect` syntax, rspec-expectations continues to support the +`should` syntax: + +```ruby +actual.should eq expected +actual.should be > 3 +[1, 2, 3].should_not include 4 +``` + +See [detailed information on the `should` syntax and its usage.](https://github.com/rspec/rspec-expectations/blob/main/Should.md) + +## Compound Matcher Expressions + +You can also create compound matcher expressions using `and` or `or`: + +``` ruby +expect(alphabet).to start_with("a").and end_with("z") +expect(stoplight.color).to eq("red").or eq("green").or eq("yellow") +``` + +## Composing Matchers + +Many of the built-in matchers are designed to take matchers as +arguments, to allow you to flexibly specify only the essential +aspects of an object or data structure. In addition, all of the +built-in matchers have one or more aliases that provide better +phrasing for when they are used as arguments to another matcher. + +### Examples + +```ruby +expect { k += 1.05 }.to change { k }.by( a_value_within(0.1).of(1.0) ) + +expect { s = "barn" }.to change { s } + .from( a_string_matching(/foo/) ) + .to( a_string_matching(/bar/) ) + +expect(["barn", 2.45]).to contain_exactly( + a_value_within(0.1).of(2.5), + a_string_starting_with("bar") +) + +expect(["barn", "food", 2.45]).to end_with( + a_string_matching("foo"), + a_value > 2 +) + +expect(["barn", 2.45]).to include( a_string_starting_with("bar") ) + +expect(:a => "food", :b => "good").to include(:a => a_string_matching(/foo/)) + +hash = { + :a => { + :b => ["foo", 5], + :c => { :d => 2.05 } + } +} + +expect(hash).to match( + :a => { + :b => a_collection_containing_exactly( + a_string_starting_with("f"), + an_instance_of(Integer) + ), + :c => { :d => (a_value < 3) } + } +) + +expect { |probe| + [1, 2, 3].each(&probe) +}.to yield_successive_args( a_value < 2, 2, a_value > 2 ) +``` + +## Usage outside rspec-core + +You always need to load `rspec/expectations` even if you only want to use one part of the library: + +```ruby +require 'rspec/expectations' +``` + +Then simply include `RSpec::Matchers` in any class: + +```ruby +class MyClass + include RSpec::Matchers + + def do_something(arg) + expect(arg).to be > 0 + # do other stuff + end +end +``` + +## Also see + +* [https://github.com/rspec/rspec](https://github.com/rspec/rspec) +* [https://github.com/rspec/rspec-core](https://github.com/rspec/rspec-core) +* [https://github.com/rspec/rspec-mocks](https://github.com/rspec/rspec-mocks) +* [https://github.com/rspec/rspec-rails](https://github.com/rspec/rspec-rails) diff --git a/vendor/bundle/ruby/3.1.0/gems/rspec-expectations-3.11.0/lib/rspec/expectations.rb b/vendor/bundle/ruby/3.1.0/gems/rspec-expectations-3.11.0/lib/rspec/expectations.rb new file mode 100644 index 000000000..9e11ea00c --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/rspec-expectations-3.11.0/lib/rspec/expectations.rb @@ -0,0 +1,82 @@ +require 'rspec/support' +RSpec::Support.require_rspec_support "caller_filter" +RSpec::Support.require_rspec_support "warnings" +RSpec::Support.require_rspec_support "object_formatter" + +require 'rspec/matchers' + +RSpec::Support.define_optimized_require_for_rspec(:expectations) { |f| require_relative(f) } + +%w[ + expectation_target + configuration + fail_with + handler + version +].each { |file| RSpec::Support.require_rspec_expectations(file) } + +module RSpec + # RSpec::Expectations provides a simple, readable API to express + # the expected outcomes in a code example. To express an expected + # outcome, wrap an object or block in `expect`, call `to` or `to_not` + # (aliased as `not_to`) and pass it a matcher object: + # + # expect(order.total).to eq(Money.new(5.55, :USD)) + # expect(list).to include(user) + # expect(message).not_to match(/foo/) + # expect { do_something }.to raise_error + # + # The last form (the block form) is needed to match against ruby constructs + # that are not objects, but can only be observed when executing a block + # of code. This includes raising errors, throwing symbols, yielding, + # and changing values. + # + # When `expect(...).to` is invoked with a matcher, it turns around + # and calls `matcher.matches?()`. For example, + # in the expression: + # + # expect(order.total).to eq(Money.new(5.55, :USD)) + # + # ...`eq(Money.new(5.55, :USD))` returns a matcher object, and it results + # in the equivalent of `eq.matches?(order.total)`. If `matches?` returns + # `true`, the expectation is met and execution continues. If `false`, then + # the spec fails with the message returned by `eq.failure_message`. + # + # Given the expression: + # + # expect(order.entries).not_to include(entry) + # + # ...the `not_to` method (also available as `to_not`) invokes the equivalent of + # `include.matches?(order.entries)`, but it interprets `false` as success, and + # `true` as a failure, using the message generated by + # `include.failure_message_when_negated`. + # + # rspec-expectations ships with a standard set of useful matchers, and writing + # your own matchers is quite simple. + # + # See [RSpec::Matchers](../RSpec/Matchers) for more information about the + # built-in matchers that ship with rspec-expectations, and how to write your + # own custom matchers. + module Expectations + # Exception raised when an expectation fails. + # + # @note We subclass Exception so that in a stub implementation if + # the user sets an expectation, it can't be caught in their + # code by a bare `rescue`. + # @api public + class ExpectationNotMetError < Exception + end + + # Exception raised from `aggregate_failures` when multiple expectations fail. + # + # @note The constant is defined here but the extensive logic of this class + # is lazily defined when `FailureAggregator` is autoloaded, since we do + # not need to waste time defining that functionality unless + # `aggregate_failures` is used. + class MultipleExpectationsNotMetError < ExpectationNotMetError + end + + autoload :BlockSnippetExtractor, "rspec/expectations/block_snippet_extractor" + autoload :FailureAggregator, "rspec/expectations/failure_aggregator" + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/rspec-expectations-3.11.0/lib/rspec/expectations/block_snippet_extractor.rb b/vendor/bundle/ruby/3.1.0/gems/rspec-expectations-3.11.0/lib/rspec/expectations/block_snippet_extractor.rb new file mode 100644 index 000000000..02f115596 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/rspec-expectations-3.11.0/lib/rspec/expectations/block_snippet_extractor.rb @@ -0,0 +1,253 @@ +module RSpec + module Expectations + # @private + class BlockSnippetExtractor # rubocop:disable Metrics/ClassLength + # rubocop should properly handle `Struct.new {}` as an inner class definition. + + attr_reader :proc, :method_name + + def self.try_extracting_single_line_body_of(proc, method_name) + lines = new(proc, method_name).body_content_lines + return nil unless lines.count == 1 + lines.first + rescue Error + nil + end + + def initialize(proc, method_name) + @proc = proc + @method_name = method_name.to_s.freeze + end + + # Ideally we should properly handle indentations of multiline snippet, + # but it's not implemented yet since because we use result of this method only when it's a + # single line and implementing the logic introduces additional complexity. + def body_content_lines + raw_body_lines.map(&:strip).reject(&:empty?) + end + + private + + def raw_body_lines + raw_body_snippet.split("\n") + end + + def raw_body_snippet + block_token_extractor.body_tokens.map(&:string).join + end + + def block_token_extractor + @block_token_extractor ||= BlockTokenExtractor.new(method_name, source, beginning_line_number) + end + + if RSpec.respond_to?(:world) + def source + raise TargetNotFoundError unless File.exist?(file_path) + RSpec.world.source_from_file(file_path) + end + else + RSpec::Support.require_rspec_support 'source' + def source + raise TargetNotFoundError unless File.exist?(file_path) + @source ||= RSpec::Support::Source.from_file(file_path) + end + end + + def file_path + source_location.first + end + + def beginning_line_number + source_location.last + end + + def source_location + proc.source_location || raise(TargetNotFoundError) + end + + Error = Class.new(StandardError) + TargetNotFoundError = Class.new(Error) + AmbiguousTargetError = Class.new(Error) + + # @private + # Performs extraction of block body snippet using tokens, + # which cannot be done with node information. + BlockTokenExtractor = Struct.new(:method_name, :source, :beginning_line_number) do + attr_reader :state, :body_tokens + + def initialize(*) + super + parse! + end + + private + + def parse! + @state = :initial + + catch(:finish) do + source.tokens.each do |token| + invoke_state_handler(token) + end + end + end + + def finish! + throw :finish + end + + def invoke_state_handler(token) + __send__("#{state}_state", token) + end + + def initial_state(token) + @state = :after_method_call if token.location == block_locator.method_call_location + end + + def after_method_call_state(token) + @state = :after_opener if handle_opener_token(token) + end + + def after_opener_state(token) + if handle_closer_token(token) + finish_or_find_next_block_if_incorrect! + elsif pipe_token?(token) + finalize_pending_tokens! + @state = :after_beginning_of_args + else + pending_tokens << token + handle_opener_token(token) + @state = :after_beginning_of_body unless token.type == :on_sp + end + end + + def after_beginning_of_args_state(token) + @state = :after_beginning_of_body if pipe_token?(token) + end + + def after_beginning_of_body_state(token) + if handle_closer_token(token) + finish_or_find_next_block_if_incorrect! + else + pending_tokens << token + handle_opener_token(token) + end + end + + def pending_tokens + @pending_tokens ||= [] + end + + def finalize_pending_tokens! + pending_tokens.freeze.tap do + @pending_tokens = nil + end + end + + def finish_or_find_next_block_if_incorrect! + body_tokens = finalize_pending_tokens! + + if correct_block?(body_tokens) + @body_tokens = body_tokens + finish! + else + @state = :after_method_call + end + end + + def handle_opener_token(token) + opener_token?(token).tap do |boolean| + opener_token_stack.push(token) if boolean + end + end + + def opener_token?(token) + token.type == :on_lbrace || (token.type == :on_kw && token.string == 'do') + end + + def handle_closer_token(token) + if opener_token_stack.last.closed_by?(token) + opener_token_stack.pop + opener_token_stack.empty? + else + false + end + end + + def opener_token_stack + @opener_token_stack ||= [] + end + + def pipe_token?(token) + token.type == :on_op && token.string == '|' + end + + def correct_block?(body_tokens) + return true if block_locator.body_content_locations.empty? + content_location = block_locator.body_content_locations.first + content_location.between?(body_tokens.first.location, body_tokens.last.location) + end + + def block_locator + @block_locator ||= BlockLocator.new(method_name, source, beginning_line_number) + end + end + + # @private + # Locates target block with node information (semantics), which tokens don't have. + BlockLocator = Struct.new(:method_name, :source, :beginning_line_number) do + def method_call_location + @method_call_location ||= method_ident_node.location + end + + def body_content_locations + @body_content_locations ||= block_body_node.map(&:location).compact + end + + private + + def method_ident_node + method_call_node = block_wrapper_node.children.first + method_call_node.find do |node| + method_ident_node?(node) + end + end + + def block_body_node + block_node = block_wrapper_node.children[1] + block_node.children.last + end + + def block_wrapper_node + case candidate_block_wrapper_nodes.size + when 1 + candidate_block_wrapper_nodes.first + when 0 + raise TargetNotFoundError + else + raise AmbiguousTargetError + end + end + + def candidate_block_wrapper_nodes + @candidate_block_wrapper_nodes ||= candidate_method_ident_nodes.map do |method_ident_node| + block_wrapper_node = method_ident_node.each_ancestor.find { |node| node.type == :method_add_block } + next nil unless block_wrapper_node + method_call_node = block_wrapper_node.children.first + method_call_node.include?(method_ident_node) ? block_wrapper_node : nil + end.compact + end + + def candidate_method_ident_nodes + source.nodes_by_line_number[beginning_line_number].select do |node| + method_ident_node?(node) + end + end + + def method_ident_node?(node) + node.type == :@ident && node.args.first == method_name + end + end + end + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/rspec-expectations-3.11.0/lib/rspec/expectations/configuration.rb b/vendor/bundle/ruby/3.1.0/gems/rspec-expectations-3.11.0/lib/rspec/expectations/configuration.rb new file mode 100644 index 000000000..974a9cdf2 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/rspec-expectations-3.11.0/lib/rspec/expectations/configuration.rb @@ -0,0 +1,230 @@ +RSpec::Support.require_rspec_expectations "syntax" + +module RSpec + module Expectations + # Provides configuration options for rspec-expectations. + # If you are using rspec-core, you can access this via a + # block passed to `RSpec::Core::Configuration#expect_with`. + # Otherwise, you can access it via RSpec::Expectations.configuration. + # + # @example + # RSpec.configure do |rspec| + # rspec.expect_with :rspec do |c| + # # c is the config object + # end + # end + # + # # or + # + # RSpec::Expectations.configuration + class Configuration + # @private + FALSE_POSITIVE_BEHAVIOURS = + { + :warn => lambda { |message| RSpec.warning message }, + :raise => lambda { |message| raise ArgumentError, message }, + :nothing => lambda { |_| true }, + } + + def initialize + @on_potential_false_positives = :warn + @strict_predicate_matchers = false + end + + # Configures the supported syntax. + # @param [Array, Symbol] values the syntaxes to enable + # @example + # RSpec.configure do |rspec| + # rspec.expect_with :rspec do |c| + # c.syntax = :should + # # or + # c.syntax = :expect + # # or + # c.syntax = [:should, :expect] + # end + # end + def syntax=(values) + if Array(values).include?(:expect) + Expectations::Syntax.enable_expect + else + Expectations::Syntax.disable_expect + end + + if Array(values).include?(:should) + Expectations::Syntax.enable_should + else + Expectations::Syntax.disable_should + end + end + + # Configures the maximum character length that RSpec will print while + # formatting an object. You can set length to nil to prevent RSpec from + # doing truncation. + # @param [Fixnum] length the number of characters to limit the formatted output to. + # @example + # RSpec.configure do |rspec| + # rspec.expect_with :rspec do |c| + # c.max_formatted_output_length = 200 + # end + # end + def max_formatted_output_length=(length) + RSpec::Support::ObjectFormatter.default_instance.max_formatted_output_length = length + end + + # The list of configured syntaxes. + # @return [Array] the list of configured syntaxes. + # @example + # unless RSpec::Matchers.configuration.syntax.include?(:expect) + # raise "this RSpec extension gem requires the rspec-expectations `:expect` syntax" + # end + def syntax + syntaxes = [] + syntaxes << :should if Expectations::Syntax.should_enabled? + syntaxes << :expect if Expectations::Syntax.expect_enabled? + syntaxes + end + + if ::RSpec.respond_to?(:configuration) + def color? + ::RSpec.configuration.color_enabled? + end + else + # Indicates whether or not diffs should be colored. + # Delegates to rspec-core's color option if rspec-core + # is loaded; otherwise you can set it here. + attr_writer :color + + # Indicates whether or not diffs should be colored. + # Delegates to rspec-core's color option if rspec-core + # is loaded; otherwise you can set it here. + def color? + defined?(@color) && @color + end + end + + # Adds `should` and `should_not` to the given classes + # or modules. This can be used to ensure `should` works + # properly on things like proxy objects (particular + # `Delegator`-subclassed objects on 1.8). + # + # @param [Array] modules the list of classes or modules + # to add `should` and `should_not` to. + def add_should_and_should_not_to(*modules) + modules.each do |mod| + Expectations::Syntax.enable_should(mod) + end + end + + # Sets or gets the backtrace formatter. The backtrace formatter should + # implement `#format_backtrace(Array)`. This is used + # to format backtraces of errors handled by the `raise_error` + # matcher. + # + # If you are using rspec-core, rspec-core's backtrace formatting + # will be used (including respecting the presence or absence of + # the `--backtrace` option). + # + # @!attribute [rw] backtrace_formatter + attr_writer :backtrace_formatter + def backtrace_formatter + @backtrace_formatter ||= if defined?(::RSpec.configuration.backtrace_formatter) + ::RSpec.configuration.backtrace_formatter + else + NullBacktraceFormatter + end + end + + # Sets if custom matcher descriptions and failure messages + # should include clauses from methods defined using `chain`. + # @param value [Boolean] + attr_writer :include_chain_clauses_in_custom_matcher_descriptions + + # Indicates whether or not custom matcher descriptions and failure messages + # should include clauses from methods defined using `chain`. It is + # false by default for backwards compatibility. + def include_chain_clauses_in_custom_matcher_descriptions? + @include_chain_clauses_in_custom_matcher_descriptions ||= false + end + + # @private + def reset_syntaxes_to_default + self.syntax = [:should, :expect] + RSpec::Expectations::Syntax.warn_about_should! + end + + # @api private + # Null implementation of a backtrace formatter used by default + # when rspec-core is not loaded. Does no filtering. + NullBacktraceFormatter = Module.new do + def self.format_backtrace(backtrace) + backtrace + end + end + + # Configures whether RSpec will warn about matcher use which will + # potentially cause false positives in tests. + # + # @param [Boolean] boolean + def warn_about_potential_false_positives=(boolean) + if boolean + self.on_potential_false_positives = :warn + elsif warn_about_potential_false_positives? + self.on_potential_false_positives = :nothing + else + # no-op, handler is something else + end + end + # + # Configures what RSpec will do about matcher use which will + # potentially cause false positives in tests. + # + # @param [Symbol] behavior can be set to :warn, :raise or :nothing + def on_potential_false_positives=(behavior) + unless FALSE_POSITIVE_BEHAVIOURS.key?(behavior) + raise ArgumentError, "Supported values are: #{FALSE_POSITIVE_BEHAVIOURS.keys}" + end + @on_potential_false_positives = behavior + end + + # Configures RSpec to check predicate matchers to `be(true)` / `be(false)` (strict), + # or `be_truthy` / `be_falsey` (not strict). + # Historically, the default was `false`, but `true` is recommended. + def strict_predicate_matchers=(flag) + raise ArgumentError, "Pass `true` or `false`" unless flag == true || flag == false + @strict_predicate_matchers = flag + end + + attr_reader :strict_predicate_matchers + + def strict_predicate_matchers? + @strict_predicate_matchers + end + + # Indicates what RSpec will do about matcher use which will + # potentially cause false positives in tests, generally you want to + # avoid such scenarios so this defaults to `true`. + attr_reader :on_potential_false_positives + + # Indicates whether RSpec will warn about matcher use which will + # potentially cause false positives in tests, generally you want to + # avoid such scenarios so this defaults to `true`. + def warn_about_potential_false_positives? + on_potential_false_positives == :warn + end + + # @private + def false_positives_handler + FALSE_POSITIVE_BEHAVIOURS.fetch(@on_potential_false_positives) + end + end + + # The configuration object. + # @return [RSpec::Expectations::Configuration] the configuration object + def self.configuration + @configuration ||= Configuration.new + end + + # set default syntax + configuration.reset_syntaxes_to_default + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/rspec-expectations-3.11.0/lib/rspec/expectations/expectation_target.rb b/vendor/bundle/ruby/3.1.0/gems/rspec-expectations-3.11.0/lib/rspec/expectations/expectation_target.rb new file mode 100644 index 000000000..7d1e8d40f --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/rspec-expectations-3.11.0/lib/rspec/expectations/expectation_target.rb @@ -0,0 +1,163 @@ +module RSpec + module Expectations + # Wraps the target of an expectation. + # + # @example + # expect(something) # => ExpectationTarget wrapping something + # expect { do_something } # => ExpectationTarget wrapping the block + # + # # used with `to` + # expect(actual).to eq(3) + # + # # with `not_to` + # expect(actual).not_to eq(3) + # + # @note `ExpectationTarget` is not intended to be instantiated + # directly by users. Use `expect` instead. + class ExpectationTarget + # @private + # Used as a sentinel value to be able to tell when the user + # did not pass an argument. We can't use `nil` for that because + # `nil` is a valid value to pass. + UndefinedValue = Module.new + + # @note this name aligns with `Minitest::Expectation` so that our + # {InstanceMethods} module can be included in that class when + # used in a Minitest context. + # @return [Object] the target of the expectation + attr_reader :target + + # @api private + def initialize(value) + @target = value + end + + # @private + def self.for(value, block) + if UndefinedValue.equal?(value) + unless block + raise ArgumentError, "You must pass either an argument or a block to `expect`." + end + BlockExpectationTarget.new(block) + elsif block + raise ArgumentError, "You cannot pass both an argument and a block to `expect`." + else + ValueExpectationTarget.new(value) + end + end + + # Defines instance {ExpectationTarget} instance methods. These are defined + # in a module so we can include it in `Minitest::Expectation` when + # `rspec/expectations/minitest_integration` is loaded in order to + # support usage with Minitest. + module InstanceMethods + # Runs the given expectation, passing if `matcher` returns true. + # @example + # expect(value).to eq(5) + # expect { perform }.to raise_error + # @param [Matcher] + # matcher + # @param [String, Proc] message optional message to display when the expectation fails + # @return [Boolean] true if the expectation succeeds (else raises) + # @see RSpec::Matchers + def to(matcher=nil, message=nil, &block) + prevent_operator_matchers(:to) unless matcher + RSpec::Expectations::PositiveExpectationHandler.handle_matcher(target, matcher, message, &block) + end + + # Runs the given expectation, passing if `matcher` returns false. + # @example + # expect(value).not_to eq(5) + # @param [Matcher] + # matcher + # @param [String, Proc] message optional message to display when the expectation fails + # @return [Boolean] false if the negative expectation succeeds (else raises) + # @see RSpec::Matchers + def not_to(matcher=nil, message=nil, &block) + prevent_operator_matchers(:not_to) unless matcher + RSpec::Expectations::NegativeExpectationHandler.handle_matcher(target, matcher, message, &block) + end + alias to_not not_to + + private + + def prevent_operator_matchers(verb) + raise ArgumentError, "The expect syntax does not support operator matchers, " \ + "so you must pass a matcher to `##{verb}`." + end + end + + include InstanceMethods + end + + # @private + # Validates the provided matcher to ensure it supports block + # expectations, in order to avoid user confusion when they + # use a block thinking the expectation will be on the return + # value of the block rather than the block itself. + class ValueExpectationTarget < ExpectationTarget + def to(matcher=nil, message=nil, &block) + enforce_value_expectation(matcher) + super + end + + def not_to(matcher=nil, message=nil, &block) + enforce_value_expectation(matcher) + super + end + + private + + def enforce_value_expectation(matcher) + return if supports_value_expectations?(matcher) + + RSpec.deprecate( + "expect(value).to #{RSpec::Support::ObjectFormatter.format(matcher)}", + :message => + "The implicit block expectation syntax is deprecated, you should pass " \ + "a block rather than an argument to `expect` to use the provided " \ + "block expectation matcher or the matcher must implement " \ + "`supports_value_expectations?`. e.g `expect { value }.to " \ + "#{RSpec::Support::ObjectFormatter.format(matcher)}` not " \ + "`expect(value).to #{RSpec::Support::ObjectFormatter.format(matcher)}`" + ) + end + + def supports_value_expectations?(matcher) + !matcher.respond_to?(:supports_value_expectations?) || matcher.supports_value_expectations? + end + end + + # @private + # Validates the provided matcher to ensure it supports block + # expectations, in order to avoid user confusion when they + # use a block thinking the expectation will be on the return + # value of the block rather than the block itself. + class BlockExpectationTarget < ExpectationTarget + def to(matcher, message=nil, &block) + enforce_block_expectation(matcher) + super + end + + def not_to(matcher, message=nil, &block) + enforce_block_expectation(matcher) + super + end + alias to_not not_to + + private + + def enforce_block_expectation(matcher) + return if supports_block_expectations?(matcher) + + raise ExpectationNotMetError, "You must pass an argument rather than a block to `expect` to use the provided " \ + "matcher (#{RSpec::Support::ObjectFormatter.format(matcher)}), or the matcher must implement " \ + "`supports_block_expectations?`." + end + + def supports_block_expectations?(matcher) + matcher.respond_to?(:supports_block_expectations?) && matcher.supports_block_expectations? + end + end + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/rspec-expectations-3.11.0/lib/rspec/expectations/fail_with.rb b/vendor/bundle/ruby/3.1.0/gems/rspec-expectations-3.11.0/lib/rspec/expectations/fail_with.rb new file mode 100644 index 000000000..212e71c42 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/rspec-expectations-3.11.0/lib/rspec/expectations/fail_with.rb @@ -0,0 +1,39 @@ +module RSpec + module Expectations + class << self + # @private + class Differ + # @private + OBJECT_PREPARER = lambda do |object| + RSpec::Matchers::Composable.surface_descriptions_in(object) + end + end + + # @private + def differ + RSpec::Support::Differ.new( + :object_preparer => Differ::OBJECT_PREPARER, + :color => RSpec::Matchers.configuration.color? + ) + end + + # Raises an RSpec::Expectations::ExpectationNotMetError with message. + # @param [String] message + # @param [Object] expected + # @param [Object] actual + # + # Adds a diff to the failure message when `expected` and `actual` are + # both present. + def fail_with(message, expected=nil, actual=nil) + unless message + raise ArgumentError, "Failure message is nil. Does your matcher define the " \ + "appropriate failure_message[_when_negated] method to return a string?" + end + + message = ::RSpec::Matchers::ExpectedsForMultipleDiffs.from(expected).message_with_diff(message, differ, actual) + + RSpec::Support.notify_failure(RSpec::Expectations::ExpectationNotMetError.new message) + end + end + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/rspec-expectations-3.11.0/lib/rspec/expectations/failure_aggregator.rb b/vendor/bundle/ruby/3.1.0/gems/rspec-expectations-3.11.0/lib/rspec/expectations/failure_aggregator.rb new file mode 100644 index 000000000..7ea05b673 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/rspec-expectations-3.11.0/lib/rspec/expectations/failure_aggregator.rb @@ -0,0 +1,212 @@ +module RSpec + module Expectations + # @private + class FailureAggregator + attr_reader :block_label, :metadata + + def aggregate + RSpec::Support.with_failure_notifier(self) do + begin + yield + rescue ExpectationNotMetError => e + # Normally, expectation failures will be notified via the `call` method, below, + # but since the failure notifier uses a thread local variable, failing expectations + # in another thread will still raise. We handle that here and categorize it as part + # of `failures` rather than letting it fall through and be categorized as part of + # `other_errors`. + failures << e + rescue Support::AllExceptionsExceptOnesWeMustNotRescue => e + # While it is normally a bad practice to rescue `Exception`, it's important we do + # so here. It's low risk (`notify_aggregated_failures` below will re-raise the exception, + # or raise a `MultipleExpectationsNotMetError` that includes the exception), and it's + # essential that the user is notified of expectation failures that may have already + # occurred in the `aggregate_failures` block. Those expectation failures may provide + # important diagnostics for understanding why this exception occurred, and if we simply + # allowed this exception to be raised as-is, it would (wrongly) suggest to the user + # that the expectation passed when it did not, which would be quite confusing. + other_errors << e + end + end + + notify_aggregated_failures + end + + def failures + @failures ||= [] + end + + def other_errors + @other_errors ||= [] + end + + # This method is defined to satisfy the callable interface + # expected by `RSpec::Support.with_failure_notifier`. + def call(failure, options) + source_id = options[:source_id] + return if source_id && @seen_source_ids.key?(source_id) + + @seen_source_ids[source_id] = true + assign_backtrace(failure) unless failure.backtrace + failures << failure + end + + private + + if RSpec::Support::Ruby.jruby? && RSpec::Support::Ruby.jruby_version < '9.2.0.0' + # On JRuby 9.1.x.x and before, `caller` and `raise` produce different backtraces with + # regards to `.java` stack frames. It's important that we use `raise` for JRuby to produce + # a backtrace that has a continuous common section with the raised `MultipleExpectationsNotMetError`, + # so that rspec-core's truncation logic can work properly on it to list the backtrace + # relative to the `aggregate_failures` block. + def assign_backtrace(failure) + raise failure + rescue failure.class => e + failure.set_backtrace(e.backtrace) + end + else + # Using `caller` performs better (and is simpler) than `raise` on most Rubies. + def assign_backtrace(failure) + failure.set_backtrace(caller) + end + end + + def initialize(block_label, metadata) + @block_label = block_label + @metadata = metadata + @seen_source_ids = {} # don't want to load stdlib set + end + + def notify_aggregated_failures + all_errors = failures + other_errors + + case all_errors.size + when 0 then return true + when 1 then RSpec::Support.notify_failure all_errors.first + else RSpec::Support.notify_failure MultipleExpectationsNotMetError.new(self) + end + end + end + + # Exception raised from `aggregate_failures` when multiple expectations fail. + class MultipleExpectationsNotMetError + # @return [String] The fully formatted exception message. + def message + @message ||= (["#{summary}:"] + enumerated_failures + enumerated_errors).join("\n\n") + end + + # @return [Array] The list of expectation failures. + def failures + @failure_aggregator.failures + end + + # @return [Array] The list of other exceptions. + def other_errors + @failure_aggregator.other_errors + end + + # @return [Array] The list of expectation failures and other exceptions, combined. + attr_reader :all_exceptions + + # @return [String] The user-assigned label for the aggregation block. + def aggregation_block_label + @failure_aggregator.block_label + end + + # @return [Hash] The metadata hash passed to `aggregate_failures`. + def aggregation_metadata + @failure_aggregator.metadata + end + + # @return [String] A summary of the failure, including the block label and a count of failures. + def summary + "Got #{exception_count_description} from failure aggregation " \ + "block#{block_description}" + end + + # return [String] A description of the failure/error counts. + def exception_count_description + failure_count = pluralize("failure", failures.size) + return failure_count if other_errors.empty? + error_count = pluralize("other error", other_errors.size) + "#{failure_count} and #{error_count}" + end + + private + + def initialize(failure_aggregator) + @failure_aggregator = failure_aggregator + @all_exceptions = failures + other_errors + end + + def block_description + return "" unless aggregation_block_label + " #{aggregation_block_label.inspect}" + end + + def pluralize(noun, count) + "#{count} #{noun}#{'s' unless count == 1}" + end + + def enumerated(exceptions, index_offset) + exceptions.each_with_index.map do |exception, index| + index += index_offset + formatted_message = "#{yield exception}\n#{format_backtrace(exception.backtrace).first}" + "#{index_label index}#{indented formatted_message, index}" + end + end + + def exclusion_patterns + patterns = %w[/lib\d*/ruby/ bin/ exe/rspec /lib/bundler/ /exe/bundle:] + patterns << "org/jruby/" if RSpec::Support::Ruby.jruby? + patterns.map! { |s| Regexp.new(s.gsub('/', File::SEPARATOR)) } + end + + def format_backtrace(backtrace) + backtrace.map { |l| backtrace_line(l) }.compact.tap { |filtered| filtered.concat backtrace if filtered.empty? } + end + + def backtrace_line(line) + return if [Regexp.union(RSpec::CallerFilter::IGNORE_REGEX, *exclusion_patterns)].any? { |p| line =~ p } + + # It changes the current path that is relative to + # system root to be relative to the project root. + line.sub(/(\A|\s)#{File.expand_path('.')}(#{File::SEPARATOR}|\s|\Z)/, '\\1.\\2'.freeze).sub(/\A([^:]+:\d+)$/, '\\1'.freeze) + end + + def enumerated_failures + enumerated(failures, 0, &:message) + end + + def enumerated_errors + enumerated(other_errors, failures.size) do |error| + "#{error.class}: #{error.message}" + end + end + + def indented(failure_message, index) + line_1, *rest = failure_message.strip.lines.to_a + first_line_indentation = ' ' * (longest_index_label_width - width_of_label(index)) + + first_line_indentation + line_1 + rest.map do |line| + line =~ /\S/ ? indentation + line : line + end.join + end + + def indentation + @indentation ||= ' ' * longest_index_label_width + end + + def longest_index_label_width + @longest_index_label_width ||= width_of_label(failures.size) + end + + def width_of_label(index) + index_label(index).chars.count + end + + def index_label(index) + " #{index + 1}) " + end + end + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/rspec-expectations-3.11.0/lib/rspec/expectations/handler.rb b/vendor/bundle/ruby/3.1.0/gems/rspec-expectations-3.11.0/lib/rspec/expectations/handler.rb new file mode 100644 index 000000000..a8f7c0531 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/rspec-expectations-3.11.0/lib/rspec/expectations/handler.rb @@ -0,0 +1,182 @@ +module RSpec + module Expectations + # @private + module ExpectationHelper + def self.check_message(msg) + unless msg.nil? || msg.respond_to?(:to_str) || msg.respond_to?(:call) + ::Kernel.warn [ + "WARNING: ignoring the provided expectation message argument (", + msg.inspect, + ") since it is not a string or a proc." + ].join + end + end + + # Returns an RSpec-3+ compatible matcher, wrapping a legacy one + # in an adapter if necessary. + # + # @private + def self.modern_matcher_from(matcher) + LegacyMatcherAdapter::RSpec2.wrap(matcher) || + LegacyMatcherAdapter::RSpec1.wrap(matcher) || matcher + end + + def self.with_matcher(handler, matcher, message) + check_message(message) + matcher = modern_matcher_from(matcher) + yield matcher + ensure + ::RSpec::Matchers.last_expectation_handler = handler + ::RSpec::Matchers.last_matcher = matcher + end + + def self.handle_failure(matcher, message, failure_message_method) + message = message.call if message.respond_to?(:call) + message ||= matcher.__send__(failure_message_method) + + if matcher.respond_to?(:diffable?) && matcher.diffable? + ::RSpec::Expectations.fail_with message, matcher.expected, matcher.actual + else + ::RSpec::Expectations.fail_with message + end + end + end + + # @private + class PositiveExpectationHandler + def self.handle_matcher(actual, initial_matcher, custom_message=nil, &block) + ExpectationHelper.with_matcher(self, initial_matcher, custom_message) do |matcher| + return ::RSpec::Matchers::BuiltIn::PositiveOperatorMatcher.new(actual) unless initial_matcher + + match_result = matcher.matches?(actual, &block) + if custom_message && match_result.respond_to?(:error_generator) + match_result.error_generator.opts[:message] = custom_message + end + + match_result || ExpectationHelper.handle_failure(matcher, custom_message, :failure_message) + end + end + + def self.verb + 'is expected to' + end + + def self.should_method + :should + end + + def self.opposite_should_method + :should_not + end + end + + # @private + class NegativeExpectationHandler + def self.handle_matcher(actual, initial_matcher, custom_message=nil, &block) + ExpectationHelper.with_matcher(self, initial_matcher, custom_message) do |matcher| + return ::RSpec::Matchers::BuiltIn::NegativeOperatorMatcher.new(actual) unless initial_matcher + + negated_match_result = does_not_match?(matcher, actual, &block) + if custom_message && negated_match_result.respond_to?(:error_generator) + negated_match_result.error_generator.opts[:message] = custom_message + end + + negated_match_result || ExpectationHelper.handle_failure(matcher, custom_message, :failure_message_when_negated) + end + end + + def self.does_not_match?(matcher, actual, &block) + if matcher.respond_to?(:does_not_match?) + matcher.does_not_match?(actual, &block) + else + !matcher.matches?(actual, &block) + end + end + + def self.verb + 'is expected not to' + end + + def self.should_method + :should_not + end + + def self.opposite_should_method + :should + end + end + + # Wraps a matcher written against one of the legacy protocols in + # order to present the current protocol. + # + # @private + class LegacyMatcherAdapter < Matchers::MatcherDelegator + def initialize(matcher) + super + ::RSpec.warn_deprecation(<<-EOS.gsub(/^\s+\|/, ''), :type => "legacy_matcher") + |#{matcher.class.name || matcher.inspect} implements a legacy RSpec matcher + |protocol. For the current protocol you should expose the failure messages + |via the `failure_message` and `failure_message_when_negated` methods. + |(Used from #{CallerFilter.first_non_rspec_line}) + EOS + end + + def self.wrap(matcher) + new(matcher) if interface_matches?(matcher) + end + + # Starting in RSpec 1.2 (and continuing through all 2.x releases), + # the failure message protocol was: + # * `failure_message_for_should` + # * `failure_message_for_should_not` + # @private + class RSpec2 < self + def failure_message + base_matcher.failure_message_for_should + end + + def failure_message_when_negated + base_matcher.failure_message_for_should_not + end + + def self.interface_matches?(matcher) + ( + !matcher.respond_to?(:failure_message) && + matcher.respond_to?(:failure_message_for_should) + ) || ( + !matcher.respond_to?(:failure_message_when_negated) && + matcher.respond_to?(:failure_message_for_should_not) + ) + end + end + + # Before RSpec 1.2, the failure message protocol was: + # * `failure_message` + # * `negative_failure_message` + # @private + class RSpec1 < self + def failure_message + base_matcher.failure_message + end + + def failure_message_when_negated + base_matcher.negative_failure_message + end + + # Note: `failure_message` is part of the RSpec 3 protocol + # (paired with `failure_message_when_negated`), so we don't check + # for `failure_message` here. + def self.interface_matches?(matcher) + !matcher.respond_to?(:failure_message_when_negated) && + matcher.respond_to?(:negative_failure_message) + end + end + end + + # RSpec 3.0 was released with the class name misspelled. For SemVer compatibility, + # we will provide this misspelled alias until 4.0. + # @deprecated Use LegacyMatcherAdapter instead. + # @private + LegacyMacherAdapter = LegacyMatcherAdapter + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/rspec-expectations-3.11.0/lib/rspec/expectations/minitest_integration.rb b/vendor/bundle/ruby/3.1.0/gems/rspec-expectations-3.11.0/lib/rspec/expectations/minitest_integration.rb new file mode 100644 index 000000000..94cdb5f3e --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/rspec-expectations-3.11.0/lib/rspec/expectations/minitest_integration.rb @@ -0,0 +1,58 @@ +require 'rspec/expectations' + +Minitest::Test.class_eval do + include ::RSpec::Matchers + + # This `expect` will only be called if the user is using Minitest < 5.6 + # or if they are _not_ using Minitest::Spec on 5.6+. Minitest::Spec on 5.6+ + # defines its own `expect` and will have the assertions incremented via our + # definitions of `to`/`not_to`/`to_not` below. + def expect(*a, &b) + self.assertions += 1 + super + end + + # Convert a `MultipleExpectationsNotMetError` to a `Minitest::Assertion` error so + # it gets counted in minitest's summary stats as a failure rather than an error. + # It would be nice to make `MultipleExpectationsNotMetError` subclass + # `Minitest::Assertion`, but Minitest's implementation does not treat subclasses + # the same, so this is the best we can do. + def aggregate_failures(*args, &block) + super + rescue RSpec::Expectations::MultipleExpectationsNotMetError => e + assertion_failed = Minitest::Assertion.new(e.message) + assertion_failed.set_backtrace e.backtrace + raise assertion_failed + end +end + +# Older versions of Minitest (e.g. before 5.6) do not define +# `Minitest::Expectation`. +if defined?(::Minitest::Expectation) + Minitest::Expectation.class_eval do + include RSpec::Expectations::ExpectationTarget::InstanceMethods + + def to(*args) + ctx.assertions += 1 + super + end + + def not_to(*args) + ctx.assertions += 1 + super + end + + def to_not(*args) + ctx.assertions += 1 + super + end + end +end + +module RSpec + module Expectations + remove_const :ExpectationNotMetError + # Exception raised when an expectation fails. + const_set :ExpectationNotMetError, ::Minitest::Assertion + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/rspec-expectations-3.11.0/lib/rspec/expectations/syntax.rb b/vendor/bundle/ruby/3.1.0/gems/rspec-expectations-3.11.0/lib/rspec/expectations/syntax.rb new file mode 100644 index 000000000..b8430346f --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/rspec-expectations-3.11.0/lib/rspec/expectations/syntax.rb @@ -0,0 +1,132 @@ +module RSpec + module Expectations + # @api private + # Provides methods for enabling and disabling the available + # syntaxes provided by rspec-expectations. + module Syntax + module_function + + # @api private + # Determines where we add `should` and `should_not`. + def default_should_host + @default_should_host ||= ::Object.ancestors.last + end + + # @api private + # Instructs rspec-expectations to warn on first usage of `should` or `should_not`. + # Enabled by default. This is largely here to facilitate testing. + def warn_about_should! + @warn_about_should = true + end + + # @api private + # Generates a deprecation warning for the given method if no warning + # has already been issued. + def warn_about_should_unless_configured(method_name) + return unless @warn_about_should + + RSpec.deprecate( + "Using `#{method_name}` from rspec-expectations' old `:should` syntax without explicitly enabling the syntax", + :replacement => "the new `:expect` syntax or explicitly enable `:should` with `config.expect_with(:rspec) { |c| c.syntax = :should }`" + ) + + @warn_about_should = false + end + + # @api private + # Enables the `should` syntax. + def enable_should(syntax_host=default_should_host) + @warn_about_should = false if syntax_host == default_should_host + return if should_enabled?(syntax_host) + + syntax_host.module_exec do + def should(matcher=nil, message=nil, &block) + ::RSpec::Expectations::Syntax.warn_about_should_unless_configured(::Kernel.__method__) + ::RSpec::Expectations::PositiveExpectationHandler.handle_matcher(self, matcher, message, &block) + end + + def should_not(matcher=nil, message=nil, &block) + ::RSpec::Expectations::Syntax.warn_about_should_unless_configured(::Kernel.__method__) + ::RSpec::Expectations::NegativeExpectationHandler.handle_matcher(self, matcher, message, &block) + end + end + end + + # @api private + # Disables the `should` syntax. + def disable_should(syntax_host=default_should_host) + return unless should_enabled?(syntax_host) + + syntax_host.module_exec do + undef should + undef should_not + end + end + + # @api private + # Enables the `expect` syntax. + def enable_expect(syntax_host=::RSpec::Matchers) + return if expect_enabled?(syntax_host) + + syntax_host.module_exec do + def expect(value=::RSpec::Expectations::ExpectationTarget::UndefinedValue, &block) + ::RSpec::Expectations::ExpectationTarget.for(value, block) + end + end + end + + # @api private + # Disables the `expect` syntax. + def disable_expect(syntax_host=::RSpec::Matchers) + return unless expect_enabled?(syntax_host) + + syntax_host.module_exec do + undef expect + end + end + + # @api private + # Indicates whether or not the `should` syntax is enabled. + def should_enabled?(syntax_host=default_should_host) + syntax_host.method_defined?(:should) + end + + # @api private + # Indicates whether or not the `expect` syntax is enabled. + def expect_enabled?(syntax_host=::RSpec::Matchers) + syntax_host.method_defined?(:expect) + end + end + end +end + +if defined?(BasicObject) + # The legacy `:should` syntax adds the following methods directly to + # `BasicObject` so that they are available off of any object. Note, however, + # that this syntax does not always play nice with delegate/proxy objects. + # We recommend you use the non-monkeypatching `:expect` syntax instead. + class BasicObject + # @method should(matcher, message) + # Passes if `matcher` returns true. Available on every `Object`. + # @example + # actual.should eq expected + # actual.should match /expression/ + # @param [Matcher] + # matcher + # @param [String] message optional message to display when the expectation fails + # @return [Boolean] true if the expectation succeeds (else raises) + # @note This is only available when you have enabled the `:should` syntax. + # @see RSpec::Matchers + + # @method should_not(matcher, message) + # Passes if `matcher` returns false. Available on every `Object`. + # @example + # actual.should_not eq expected + # @param [Matcher] + # matcher + # @param [String] message optional message to display when the expectation fails + # @return [Boolean] false if the negative expectation succeeds (else raises) + # @note This is only available when you have enabled the `:should` syntax. + # @see RSpec::Matchers + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/rspec-expectations-3.11.0/lib/rspec/expectations/version.rb b/vendor/bundle/ruby/3.1.0/gems/rspec-expectations-3.11.0/lib/rspec/expectations/version.rb new file mode 100644 index 000000000..6253341d9 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/rspec-expectations-3.11.0/lib/rspec/expectations/version.rb @@ -0,0 +1,8 @@ +module RSpec + module Expectations + # @private + module Version + STRING = '3.11.0' + end + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/rspec-expectations-3.11.0/lib/rspec/matchers.rb b/vendor/bundle/ruby/3.1.0/gems/rspec-expectations-3.11.0/lib/rspec/matchers.rb new file mode 100644 index 000000000..443c8f158 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/rspec-expectations-3.11.0/lib/rspec/matchers.rb @@ -0,0 +1,1041 @@ +require 'rspec/support' +RSpec::Support.require_rspec_support 'matcher_definition' +RSpec::Support.define_optimized_require_for_rspec(:matchers) { |f| require_relative(f) } + +%w[ + english_phrasing + composable + built_in + generated_descriptions + dsl + matcher_delegator + aliased_matcher + expecteds_for_multiple_diffs +].each { |file| RSpec::Support.require_rspec_matchers(file) } + +# RSpec's top level namespace. All of rspec-expectations is contained +# in the `RSpec::Expectations` and `RSpec::Matchers` namespaces. +module RSpec + # RSpec::Matchers provides a number of useful matchers we use to define + # expectations. Any object that implements the [matcher protocol](Matchers/MatcherProtocol) + # can be used as a matcher. + # + # ## Predicates + # + # In addition to matchers that are defined explicitly, RSpec will create + # custom matchers on the fly for any arbitrary predicate, giving your specs a + # much more natural language feel. + # + # A Ruby predicate is a method that ends with a "?" and returns true or false. + # Common examples are `empty?`, `nil?`, and `instance_of?`. + # + # All you need to do is write `expect(..).to be_` followed by the predicate + # without the question mark, and RSpec will figure it out from there. + # For example: + # + # expect([]).to be_empty # => [].empty?() | passes + # expect([]).not_to be_empty # => [].empty?() | fails + # + # In addtion to prefixing the predicate matchers with "be_", you can also use "be_a_" + # and "be_an_", making your specs read much more naturally: + # + # expect("a string").to be_an_instance_of(String) # =>"a string".instance_of?(String) # passes + # + # expect(3).to be_a_kind_of(Integer) # => 3.kind_of?(Numeric) | passes + # expect(3).to be_a_kind_of(Numeric) # => 3.kind_of?(Numeric) | passes + # expect(3).to be_an_instance_of(Integer) # => 3.instance_of?(Integer) | passes + # expect(3).not_to be_an_instance_of(Numeric) # => 3.instance_of?(Numeric) | fails + # + # RSpec will also create custom matchers for predicates like `has_key?`. To + # use this feature, just state that the object should have_key(:key) and RSpec will + # call has_key?(:key) on the target. For example: + # + # expect(:a => "A").to have_key(:a) + # expect(:a => "A").to have_key(:b) # fails + # + # You can use this feature to invoke any predicate that begins with "has_", whether it is + # part of the Ruby libraries (like `Hash#has_key?`) or a method you wrote on your own class. + # + # Note that RSpec does not provide composable aliases for these dynamic predicate + # matchers. You can easily define your own aliases, though: + # + # RSpec::Matchers.alias_matcher :a_user_who_is_an_admin, :be_an_admin + # expect(user_list).to include(a_user_who_is_an_admin) + # + # ## Alias Matchers + # + # With {RSpec::Matchers.alias_matcher}, you can easily create an + # alternate name for a given matcher. + # + # The description will also change according to the new name: + # + # RSpec::Matchers.alias_matcher :a_list_that_sums_to, :sum_to + # sum_to(3).description # => "sum to 3" + # a_list_that_sums_to(3).description # => "a list that sums to 3" + # + # or you can specify a custom description like this: + # + # RSpec::Matchers.alias_matcher :a_list_sorted_by, :be_sorted_by do |description| + # description.sub("be sorted by", "a list sorted by") + # end + # + # be_sorted_by(:age).description # => "be sorted by age" + # a_list_sorted_by(:age).description # => "a list sorted by age" + # + # ## Custom Matchers + # + # When you find that none of the stock matchers provide a natural feeling + # expectation, you can very easily write your own using RSpec's matcher DSL + # or writing one from scratch. + # + # ### Matcher DSL + # + # Imagine that you are writing a game in which players can be in various + # zones on a virtual board. To specify that bob should be in zone 4, you + # could say: + # + # expect(bob.current_zone).to eql(Zone.new("4")) + # + # But you might find it more expressive to say: + # + # expect(bob).to be_in_zone("4") + # + # and/or + # + # expect(bob).not_to be_in_zone("3") + # + # You can create such a matcher like so: + # + # RSpec::Matchers.define :be_in_zone do |zone| + # match do |player| + # player.in_zone?(zone) + # end + # end + # + # This will generate a be_in_zone method that returns a matcher + # with logical default messages for failures. You can override the failure + # messages and the generated description as follows: + # + # RSpec::Matchers.define :be_in_zone do |zone| + # match do |player| + # player.in_zone?(zone) + # end + # + # failure_message do |player| + # # generate and return the appropriate string. + # end + # + # failure_message_when_negated do |player| + # # generate and return the appropriate string. + # end + # + # description do + # # generate and return the appropriate string. + # end + # end + # + # Each of the message-generation methods has access to the block arguments + # passed to the create method (in this case, zone). The + # failure message methods (failure_message and + # failure_message_when_negated) are passed the actual value (the + # receiver of expect(..) or expect(..).not_to). + # + # ### Custom Matcher from scratch + # + # You could also write a custom matcher from scratch, as follows: + # + # class BeInZone + # def initialize(expected) + # @expected = expected + # end + # + # def matches?(target) + # @target = target + # @target.current_zone.eql?(Zone.new(@expected)) + # end + # + # def failure_message + # "expected #{@target.inspect} to be in Zone #{@expected}" + # end + # + # def failure_message_when_negated + # "expected #{@target.inspect} not to be in Zone #{@expected}" + # end + # end + # + # ... and a method like this: + # + # def be_in_zone(expected) + # BeInZone.new(expected) + # end + # + # And then expose the method to your specs. This is normally done + # by including the method and the class in a module, which is then + # included in your spec: + # + # module CustomGameMatchers + # class BeInZone + # # ... + # end + # + # def be_in_zone(expected) + # # ... + # end + # end + # + # describe "Player behaviour" do + # include CustomGameMatchers + # # ... + # end + # + # or you can include in globally in a spec_helper.rb file required + # from your spec file(s): + # + # RSpec::configure do |config| + # config.include(CustomGameMatchers) + # end + # + # ### Making custom matchers composable + # + # RSpec's built-in matchers are designed to be composed, in expressions like: + # + # expect(["barn", 2.45]).to contain_exactly( + # a_value_within(0.1).of(2.5), + # a_string_starting_with("bar") + # ) + # + # Custom matchers can easily participate in composed matcher expressions like these. + # Include {RSpec::Matchers::Composable} in your custom matcher to make it support + # being composed (matchers defined using the DSL have this included automatically). + # Within your matcher's `matches?` method (or the `match` block, if using the DSL), + # use `values_match?(expected, actual)` rather than `expected == actual`. + # Under the covers, `values_match?` is able to match arbitrary + # nested data structures containing a mix of both matchers and non-matcher objects. + # It uses `===` and `==` to perform the matching, considering the values to + # match if either returns `true`. The `Composable` mixin also provides some helper + # methods for surfacing the matcher descriptions within your matcher's description + # or failure messages. + # + # RSpec's built-in matchers each have a number of aliases that rephrase the matcher + # from a verb phrase (such as `be_within`) to a noun phrase (such as `a_value_within`), + # which reads better when the matcher is passed as an argument in a composed matcher + # expressions, and also uses the noun-phrase wording in the matcher's `description`, + # for readable failure messages. You can alias your custom matchers in similar fashion + # using {RSpec::Matchers.alias_matcher}. + # + # ## Negated Matchers + # + # Sometimes if you want to test for the opposite using a more descriptive name + # instead of using `not_to`, you can use {RSpec::Matchers.define_negated_matcher}: + # + # RSpec::Matchers.define_negated_matcher :exclude, :include + # include(1, 2).description # => "include 1 and 2" + # exclude(1, 2).description # => "exclude 1 and 2" + # + # While the most obvious negated form may be to add a `not_` prefix, + # the failure messages you get with that form can be confusing (e.g. + # "expected [actual] to not [verb], but did not"). We've found it works + # best to find a more positive name for the negated form, such as + # `avoid_changing` rather than `not_change`. + # + module Matchers # rubocop:disable Metrics/ModuleLength + extend ::RSpec::Matchers::DSL + + # @!macro [attach] alias_matcher + # @!parse + # alias $1 $2 + # @!visibility private + # We define this override here so we can attach a YARD macro to it. + # It ensures that our docs list all the matcher aliases. + def self.alias_matcher(*args, &block) + super(*args, &block) + end + + # @!method self.alias_matcher(new_name, old_name, options={}, &description_override) + # Extended from {RSpec::Matchers::DSL#alias_matcher}. + + # @!method self.define(name, &declarations) + # Extended from {RSpec::Matchers::DSL#define}. + + # @!method self.define_negated_matcher(negated_name, base_name, &description_override) + # Extended from {RSpec::Matchers::DSL#define_negated_matcher}. + + # @method expect + # Supports `expect(actual).to matcher` syntax by wrapping `actual` in an + # `ExpectationTarget`. + # @example + # expect(actual).to eq(expected) + # expect(actual).not_to eq(expected) + # @return [Expectations::ExpectationTarget] + # @see Expectations::ExpectationTarget#to + # @see Expectations::ExpectationTarget#not_to + + # Allows multiple expectations in the provided block to fail, and then + # aggregates them into a single exception, rather than aborting on the + # first expectation failure like normal. This allows you to see all + # failures from an entire set of expectations without splitting each + # off into its own example (which may slow things down if the example + # setup is expensive). + # + # @param label [String] label for this aggregation block, which will be + # included in the aggregated exception message. + # @param metadata [Hash] additional metadata about this failure aggregation + # block. If multiple expectations fail, it will be exposed from the + # {Expectations::MultipleExpectationsNotMetError} exception. Mostly + # intended for internal RSpec use but you can use it as well. + # @yield Block containing as many expectation as you want. The block is + # simply yielded to, so you can trust that anything that works outside + # the block should work within it. + # @raise [Expectations::MultipleExpectationsNotMetError] raised when + # multiple expectations fail. + # @raise [Expectations::ExpectationNotMetError] raised when a single + # expectation fails. + # @raise [Exception] other sorts of exceptions will be raised as normal. + # + # @example + # aggregate_failures("verifying response") do + # expect(response.status).to eq(200) + # expect(response.headers).to include("Content-Type" => "text/plain") + # expect(response.body).to include("Success") + # end + # + # @note The implementation of this feature uses a thread-local variable, + # which means that if you have an expectation failure in another thread, + # it'll abort like normal. + def aggregate_failures(label=nil, metadata={}, &block) + Expectations::FailureAggregator.new(label, metadata).aggregate(&block) + end + + # Passes if actual is truthy (anything but false or nil) + def be_truthy + BuiltIn::BeTruthy.new + end + alias_matcher :a_truthy_value, :be_truthy + + # Passes if actual is falsey (false or nil) + def be_falsey + BuiltIn::BeFalsey.new + end + alias_matcher :be_falsy, :be_falsey + alias_matcher :a_falsey_value, :be_falsey + alias_matcher :a_falsy_value, :be_falsey + + # Passes if actual is nil + def be_nil + BuiltIn::BeNil.new + end + alias_matcher :a_nil_value, :be_nil + + # @example + # expect(actual).to be_truthy + # expect(actual).to be_falsey + # expect(actual).to be_nil + # expect(actual).to be_[arbitrary_predicate](*args) + # expect(actual).not_to be_nil + # expect(actual).not_to be_[arbitrary_predicate](*args) + # + # Given true, false, or nil, will pass if actual value is true, false or + # nil (respectively). Given no args means the caller should satisfy an if + # condition (to be or not to be). + # + # Predicates are any Ruby method that ends in a "?" and returns true or + # false. Given be_ followed by arbitrary_predicate (without the "?"), + # RSpec will match convert that into a query against the target object. + # + # The arbitrary_predicate feature will handle any predicate prefixed with + # "be_an_" (e.g. be_an_instance_of), "be_a_" (e.g. be_a_kind_of) or "be_" + # (e.g. be_empty), letting you choose the prefix that best suits the + # predicate. + def be(*args) + args.empty? ? Matchers::BuiltIn::Be.new : equal(*args) + end + alias_matcher :a_value, :be, :klass => AliasedMatcherWithOperatorSupport + + # passes if target.kind_of?(klass) + def be_a(klass) + be_a_kind_of(klass) + end + alias_method :be_an, :be_a + + # Passes if actual.instance_of?(expected) + # + # @example + # expect(5).to be_an_instance_of(Integer) + # expect(5).not_to be_an_instance_of(Numeric) + # expect(5).not_to be_an_instance_of(Float) + def be_an_instance_of(expected) + BuiltIn::BeAnInstanceOf.new(expected) + end + alias_method :be_instance_of, :be_an_instance_of + alias_matcher :an_instance_of, :be_an_instance_of + + # Passes if actual.kind_of?(expected) + # + # @example + # expect(5).to be_a_kind_of(Integer) + # expect(5).to be_a_kind_of(Numeric) + # expect(5).not_to be_a_kind_of(Float) + def be_a_kind_of(expected) + BuiltIn::BeAKindOf.new(expected) + end + alias_method :be_kind_of, :be_a_kind_of + alias_matcher :a_kind_of, :be_a_kind_of + + # Passes if actual.between?(min, max). Works with any Comparable object, + # including String, Symbol, Time, or Numeric (Fixnum, Bignum, Integer, + # Float, Complex, and Rational). + # + # By default, `be_between` is inclusive (i.e. passes when given either the max or min value), + # but you can make it `exclusive` by chaining that off the matcher. + # + # @example + # expect(5).to be_between(1, 10) + # expect(11).not_to be_between(1, 10) + # expect(10).not_to be_between(1, 10).exclusive + def be_between(min, max) + BuiltIn::BeBetween.new(min, max) + end + alias_matcher :a_value_between, :be_between + + # Passes if actual == expected +/- delta + # + # @example + # expect(result).to be_within(0.5).of(3.0) + # expect(result).not_to be_within(0.5).of(3.0) + def be_within(delta) + BuiltIn::BeWithin.new(delta) + end + alias_matcher :a_value_within, :be_within + alias_matcher :within, :be_within + + # Applied to a proc, specifies that its execution will cause some value to + # change. + # + # @param [Object] receiver + # @param [Symbol] message the message to send the receiver + # + # You can either pass receiver and message, or a block, + # but not both. + # + # When passing a block, it must use the `{ ... }` format, not + # do/end, as `{ ... }` binds to the `change` method, whereas do/end + # would errantly bind to the `expect(..).to` or `expect(...).not_to` method. + # + # You can chain any of the following off of the end to specify details + # about the change: + # + # * `from` + # * `to` + # + # or any one of: + # + # * `by` + # * `by_at_least` + # * `by_at_most` + # + # @example + # expect { + # team.add_player(player) + # }.to change(roster, :count) + # + # expect { + # team.add_player(player) + # }.to change(roster, :count).by(1) + # + # expect { + # team.add_player(player) + # }.to change(roster, :count).by_at_least(1) + # + # expect { + # team.add_player(player) + # }.to change(roster, :count).by_at_most(1) + # + # string = "string" + # expect { + # string.reverse! + # }.to change { string }.from("string").to("gnirts") + # + # string = "string" + # expect { + # string + # }.not_to change { string }.from("string") + # + # expect { + # person.happy_birthday + # }.to change(person, :birthday).from(32).to(33) + # + # expect { + # employee.develop_great_new_social_networking_app + # }.to change(employee, :title).from("Mail Clerk").to("CEO") + # + # expect { + # doctor.leave_office + # }.to change(doctor, :sign).from(/is in/).to(/is out/) + # + # user = User.new(:type => "admin") + # expect { + # user.symbolize_type + # }.to change(user, :type).from(String).to(Symbol) + # + # == Notes + # + # Evaluates `receiver.message` or `block` before and after it + # evaluates the block passed to `expect`. If the value is the same + # object, its before/after `hash` value is used to see if it has changed. + # Therefore, your object needs to properly implement `hash` to work correctly + # with this matcher. + # + # `expect( ... ).not_to change` supports the form that specifies `from` + # (which specifies what you expect the starting, unchanged value to be) + # but does not support forms with subsequent calls to `by`, `by_at_least`, + # `by_at_most` or `to`. + def change(receiver=nil, message=nil, &block) + BuiltIn::Change.new(receiver, message, &block) + end + alias_matcher :a_block_changing, :change + alias_matcher :changing, :change + + # Passes if actual contains all of the expected regardless of order. + # This works for collections. Pass in multiple args and it will only + # pass if all args are found in collection. + # + # @note This is also available using the `=~` operator with `should`, + # but `=~` is not supported with `expect`. + # + # @example + # expect([1, 2, 3]).to contain_exactly(1, 2, 3) + # expect([1, 2, 3]).to contain_exactly(1, 3, 2) + # + # @see #match_array + def contain_exactly(*items) + BuiltIn::ContainExactly.new(items) + end + alias_matcher :a_collection_containing_exactly, :contain_exactly + alias_matcher :containing_exactly, :contain_exactly + + # Passes if actual covers expected. This works for + # Ranges. You can also pass in multiple args + # and it will only pass if all args are found in Range. + # + # @example + # expect(1..10).to cover(5) + # expect(1..10).to cover(4, 6) + # expect(1..10).to cover(4, 6, 11) # fails + # expect(1..10).not_to cover(11) + # expect(1..10).not_to cover(5) # fails + # + # ### Warning:: Ruby >= 1.9 only + def cover(*values) + BuiltIn::Cover.new(*values) + end + alias_matcher :a_range_covering, :cover + alias_matcher :covering, :cover + + # Matches if the actual value ends with the expected value(s). In the case + # of a string, matches against the last `expected.length` characters of the + # actual string. In the case of an array, matches against the last + # `expected.length` elements of the actual array. + # + # @example + # expect("this string").to end_with "string" + # expect([0, 1, 2, 3, 4]).to end_with 4 + # expect([0, 2, 3, 4, 4]).to end_with 3, 4 + def end_with(*expected) + BuiltIn::EndWith.new(*expected) + end + alias_matcher :a_collection_ending_with, :end_with + alias_matcher :a_string_ending_with, :end_with + alias_matcher :ending_with, :end_with + + # Passes if actual == expected. + # + # See http://www.ruby-doc.org/core/classes/Object.html#M001057 for more + # information about equality in Ruby. + # + # @example + # expect(5).to eq(5) + # expect(5).not_to eq(3) + def eq(expected) + BuiltIn::Eq.new(expected) + end + alias_matcher :an_object_eq_to, :eq + alias_matcher :eq_to, :eq + + # Passes if `actual.eql?(expected)` + # + # See http://www.ruby-doc.org/core/classes/Object.html#M001057 for more + # information about equality in Ruby. + # + # @example + # expect(5).to eql(5) + # expect(5).not_to eql(3) + def eql(expected) + BuiltIn::Eql.new(expected) + end + alias_matcher :an_object_eql_to, :eql + alias_matcher :eql_to, :eql + + # Passes if actual.equal?(expected) (object identity). + # + # See http://www.ruby-doc.org/core/classes/Object.html#M001057 for more + # information about equality in Ruby. + # + # @example + # expect(5).to equal(5) # Integers are equal + # expect("5").not_to equal("5") # Strings that look the same are not the same object + def equal(expected) + BuiltIn::Equal.new(expected) + end + alias_matcher :an_object_equal_to, :equal + alias_matcher :equal_to, :equal + + # Passes if `actual.exist?` or `actual.exists?` + # + # @example + # expect(File).to exist("path/to/file") + def exist(*args) + BuiltIn::Exist.new(*args) + end + alias_matcher :an_object_existing, :exist + alias_matcher :existing, :exist + + # Passes if actual's attribute values match the expected attributes hash. + # This works no matter how you define your attribute readers. + # + # @example + # Person = Struct.new(:name, :age) + # person = Person.new("Bob", 32) + # + # expect(person).to have_attributes(:name => "Bob", :age => 32) + # expect(person).to have_attributes(:name => a_string_starting_with("B"), :age => (a_value > 30) ) + # + # @note It will fail if actual doesn't respond to any of the expected attributes. + # + # @example + # expect(person).to have_attributes(:color => "red") + def have_attributes(expected) + BuiltIn::HaveAttributes.new(expected) + end + alias_matcher :an_object_having_attributes, :have_attributes + alias_matcher :having_attributes, :have_attributes + + # Passes if actual includes expected. This works for + # collections and Strings. You can also pass in multiple args + # and it will only pass if all args are found in collection. + # + # @example + # expect([1,2,3]).to include(3) + # expect([1,2,3]).to include(2,3) + # expect([1,2,3]).to include(2,3,4) # fails + # expect([1,2,3]).not_to include(4) + # expect("spread").to include("read") + # expect("spread").not_to include("red") + # expect(:a => 1, :b => 2).to include(:a) + # expect(:a => 1, :b => 2).to include(:a, :b) + # expect(:a => 1, :b => 2).to include(:a => 1) + # expect(:a => 1, :b => 2).to include(:b => 2, :a => 1) + # expect(:a => 1, :b => 2).to include(:c) # fails + # expect(:a => 1, :b => 2).not_to include(:a => 2) + def include(*expected) + BuiltIn::Include.new(*expected) + end + alias_matcher :a_collection_including, :include + alias_matcher :a_string_including, :include + alias_matcher :a_hash_including, :include + alias_matcher :including, :include + + # Passes if the provided matcher passes when checked against all + # elements of the collection. + # + # @example + # expect([1, 3, 5]).to all be_odd + # expect([1, 3, 6]).to all be_odd # fails + # + # @note The negative form `not_to all` is not supported. Instead + # use `not_to include` or pass a negative form of a matcher + # as the argument (e.g. `all exclude(:foo)`). + # + # @note You can also use this with compound matchers as well. + # + # @example + # expect([1, 3, 5]).to all( be_odd.and be_an(Integer) ) + def all(expected) + BuiltIn::All.new(expected) + end + + # Given a `Regexp` or `String`, passes if `actual.match(pattern)` + # Given an arbitrary nested data structure (e.g. arrays and hashes), + # matches if `expected === actual` || `actual == expected` for each + # pair of elements. + # + # @example + # expect(email).to match(/^([^\s]+)((?:[-a-z0-9]+\.)+[a-z]{2,})$/i) + # expect(email).to match("@example.com") + # + # @example + # hash = { + # :a => { + # :b => ["foo", 5], + # :c => { :d => 2.05 } + # } + # } + # + # expect(hash).to match( + # :a => { + # :b => a_collection_containing_exactly( + # a_string_starting_with("f"), + # an_instance_of(Integer) + # ), + # :c => { :d => (a_value < 3) } + # } + # ) + # + # @note The `match_regex` alias is deprecated and is not recommended for use. + # It was added in 2.12.1 to facilitate its use from within custom + # matchers (due to how the custom matcher DSL was evaluated in 2.x, + # `match` could not be used there), but is no longer needed in 3.x. + def match(expected) + BuiltIn::Match.new(expected) + end + alias_matcher :match_regex, :match + alias_matcher :an_object_matching, :match + alias_matcher :a_string_matching, :match + alias_matcher :matching, :match + + # An alternate form of `contain_exactly` that accepts + # the expected contents as a single array arg rather + # that splatted out as individual items. + # + # @example + # expect(results).to contain_exactly(1, 2) + # # is identical to: + # expect(results).to match_array([1, 2]) + # + # @see #contain_exactly + def match_array(items) + contain_exactly(*items) + end + + # With no arg, passes if the block outputs `to_stdout` or `to_stderr`. + # With a string, passes if the block outputs that specific string `to_stdout` or `to_stderr`. + # With a regexp or matcher, passes if the block outputs a string `to_stdout` or `to_stderr` that matches. + # + # To capture output from any spawned subprocess as well, use `to_stdout_from_any_process` or + # `to_stderr_from_any_process`. Output from any process that inherits the main process's corresponding + # standard stream will be captured. + # + # @example + # expect { print 'foo' }.to output.to_stdout + # expect { print 'foo' }.to output('foo').to_stdout + # expect { print 'foo' }.to output(/foo/).to_stdout + # + # expect { do_something }.to_not output.to_stdout + # + # expect { warn('foo') }.to output.to_stderr + # expect { warn('foo') }.to output('foo').to_stderr + # expect { warn('foo') }.to output(/foo/).to_stderr + # + # expect { do_something }.to_not output.to_stderr + # + # expect { system('echo foo') }.to output("foo\n").to_stdout_from_any_process + # expect { system('echo foo', out: :err) }.to output("foo\n").to_stderr_from_any_process + # + # @note `to_stdout` and `to_stderr` work by temporarily replacing `$stdout` or `$stderr`, + # so they're not able to intercept stream output that explicitly uses `STDOUT`/`STDERR` + # or that uses a reference to `$stdout`/`$stderr` that was stored before the + # matcher was used. + # @note `to_stdout_from_any_process` and `to_stderr_from_any_process` use Tempfiles, and + # are thus significantly (~30x) slower than `to_stdout` and `to_stderr`. + def output(expected=nil) + BuiltIn::Output.new(expected) + end + alias_matcher :a_block_outputting, :output + + # With no args, matches if any error is raised. + # With a named error, matches only if that specific error is raised. + # With a named error and messsage specified as a String, matches only if both match. + # With a named error and messsage specified as a Regexp, matches only if both match. + # Pass an optional block to perform extra verifications on the exception matched + # + # @example + # expect { do_something_risky }.to raise_error + # expect { do_something_risky }.to raise_error(PoorRiskDecisionError) + # expect { do_something_risky }.to raise_error(PoorRiskDecisionError) { |error| expect(error.data).to eq 42 } + # expect { do_something_risky }.to raise_error { |error| expect(error.data).to eq 42 } + # expect { do_something_risky }.to raise_error(PoorRiskDecisionError, "that was too risky") + # expect { do_something_risky }.to raise_error(PoorRiskDecisionError, /oo ri/) + # expect { do_something_risky }.to raise_error("that was too risky") + # + # expect { do_something_risky }.not_to raise_error + def raise_error(error=BuiltIn::RaiseError::UndefinedValue, message=nil, &block) + BuiltIn::RaiseError.new(error, message, &block) + end + alias_method :raise_exception, :raise_error + + alias_matcher :a_block_raising, :raise_error do |desc| + desc.sub("raise", "a block raising") + end + + alias_matcher :raising, :raise_error do |desc| + desc.sub("raise", "raising") + end + + # Matches if the target object responds to all of the names + # provided. Names can be Strings or Symbols. + # + # @example + # expect("string").to respond_to(:length) + # + def respond_to(*names) + BuiltIn::RespondTo.new(*names) + end + alias_matcher :an_object_responding_to, :respond_to + alias_matcher :responding_to, :respond_to + + # Passes if the submitted block returns true. Yields target to the + # block. + # + # Generally speaking, this should be thought of as a last resort when + # you can't find any other way to specify the behaviour you wish to + # specify. + # + # If you do find yourself in such a situation, you could always write + # a custom matcher, which would likely make your specs more expressive. + # + # @param description [String] optional description to be used for this matcher. + # + # @example + # expect(5).to satisfy { |n| n > 3 } + # expect(5).to satisfy("be greater than 3") { |n| n > 3 } + def satisfy(description=nil, &block) + BuiltIn::Satisfy.new(description, &block) + end + alias_matcher :an_object_satisfying, :satisfy + alias_matcher :satisfying, :satisfy + + # Matches if the actual value starts with the expected value(s). In the + # case of a string, matches against the first `expected.length` characters + # of the actual string. In the case of an array, matches against the first + # `expected.length` elements of the actual array. + # + # @example + # expect("this string").to start_with "this s" + # expect([0, 1, 2, 3, 4]).to start_with 0 + # expect([0, 2, 3, 4, 4]).to start_with 0, 1 + def start_with(*expected) + BuiltIn::StartWith.new(*expected) + end + alias_matcher :a_collection_starting_with, :start_with + alias_matcher :a_string_starting_with, :start_with + alias_matcher :starting_with, :start_with + + # Given no argument, matches if a proc throws any Symbol. + # + # Given a Symbol, matches if the given proc throws the specified Symbol. + # + # Given a Symbol and an arg, matches if the given proc throws the + # specified Symbol with the specified arg. + # + # @example + # expect { do_something_risky }.to throw_symbol + # expect { do_something_risky }.to throw_symbol(:that_was_risky) + # expect { do_something_risky }.to throw_symbol(:that_was_risky, 'culprit') + # + # expect { do_something_risky }.not_to throw_symbol + # expect { do_something_risky }.not_to throw_symbol(:that_was_risky) + # expect { do_something_risky }.not_to throw_symbol(:that_was_risky, 'culprit') + def throw_symbol(expected_symbol=nil, expected_arg=nil) + BuiltIn::ThrowSymbol.new(expected_symbol, expected_arg) + end + + alias_matcher :a_block_throwing, :throw_symbol do |desc| + desc.sub("throw", "a block throwing") + end + + alias_matcher :throwing, :throw_symbol do |desc| + desc.sub("throw", "throwing") + end + + # Passes if the method called in the expect block yields, regardless + # of whether or not arguments are yielded. + # + # @example + # expect { |b| 5.tap(&b) }.to yield_control + # expect { |b| "a".to_sym(&b) }.not_to yield_control + # + # @note Your expect block must accept a parameter and pass it on to + # the method-under-test as a block. + def yield_control + BuiltIn::YieldControl.new + end + alias_matcher :a_block_yielding_control, :yield_control + alias_matcher :yielding_control, :yield_control + + # Passes if the method called in the expect block yields with + # no arguments. Fails if it does not yield, or yields with arguments. + # + # @example + # expect { |b| User.transaction(&b) }.to yield_with_no_args + # expect { |b| 5.tap(&b) }.not_to yield_with_no_args # because it yields with `5` + # expect { |b| "a".to_sym(&b) }.not_to yield_with_no_args # because it does not yield + # + # @note Your expect block must accept a parameter and pass it on to + # the method-under-test as a block. + # @note This matcher is not designed for use with methods that yield + # multiple times. + def yield_with_no_args + BuiltIn::YieldWithNoArgs.new + end + alias_matcher :a_block_yielding_with_no_args, :yield_with_no_args + alias_matcher :yielding_with_no_args, :yield_with_no_args + + # Given no arguments, matches if the method called in the expect + # block yields with arguments (regardless of what they are or how + # many there are). + # + # Given arguments, matches if the method called in the expect block + # yields with arguments that match the given arguments. + # + # Argument matching is done using `===` (the case match operator) + # and `==`. If the expected and actual arguments match with either + # operator, the matcher will pass. + # + # @example + # expect { |b| 5.tap(&b) }.to yield_with_args # because #tap yields an arg + # expect { |b| 5.tap(&b) }.to yield_with_args(5) # because 5 == 5 + # expect { |b| 5.tap(&b) }.to yield_with_args(Integer) # because Integer === 5 + # expect { |b| File.open("f.txt", &b) }.to yield_with_args(/txt/) # because /txt/ === "f.txt" + # + # expect { |b| User.transaction(&b) }.not_to yield_with_args # because it yields no args + # expect { |b| 5.tap(&b) }.not_to yield_with_args(1, 2, 3) + # + # @note Your expect block must accept a parameter and pass it on to + # the method-under-test as a block. + # @note This matcher is not designed for use with methods that yield + # multiple times. + def yield_with_args(*args) + BuiltIn::YieldWithArgs.new(*args) + end + alias_matcher :a_block_yielding_with_args, :yield_with_args + alias_matcher :yielding_with_args, :yield_with_args + + # Designed for use with methods that repeatedly yield (such as + # iterators). Passes if the method called in the expect block yields + # multiple times with arguments matching those given. + # + # Argument matching is done using `===` (the case match operator) + # and `==`. If the expected and actual arguments match with either + # operator, the matcher will pass. + # + # @example + # expect { |b| [1, 2, 3].each(&b) }.to yield_successive_args(1, 2, 3) + # expect { |b| { :a => 1, :b => 2 }.each(&b) }.to yield_successive_args([:a, 1], [:b, 2]) + # expect { |b| [1, 2, 3].each(&b) }.not_to yield_successive_args(1, 2) + # + # @note Your expect block must accept a parameter and pass it on to + # the method-under-test as a block. + def yield_successive_args(*args) + BuiltIn::YieldSuccessiveArgs.new(*args) + end + alias_matcher :a_block_yielding_successive_args, :yield_successive_args + alias_matcher :yielding_successive_args, :yield_successive_args + + # Delegates to {RSpec::Expectations.configuration}. + # This is here because rspec-core's `expect_with` option + # looks for a `configuration` method on the mixin + # (`RSpec::Matchers`) to yield to a block. + # @return [RSpec::Expectations::Configuration] the configuration object + def self.configuration + Expectations.configuration + end + + private + + BE_PREDICATE_REGEX = /^(?:be_(?:an?_)?)(.*)/ + HAS_REGEX = /^(?:have_)(.*)/ + DYNAMIC_MATCHER_REGEX = Regexp.union(BE_PREDICATE_REGEX, HAS_REGEX) + + def method_missing(method, *args, &block) + case method.to_s + when BE_PREDICATE_REGEX + BuiltIn::BePredicate.new(method, *args, &block) + when HAS_REGEX + BuiltIn::Has.new(method, *args, &block) + else + super + end + end + ruby2_keywords :method_missing if respond_to?(:ruby2_keywords, true) + + if RUBY_VERSION.to_f >= 1.9 + def respond_to_missing?(method, *) + method =~ DYNAMIC_MATCHER_REGEX || super + end + else # for 1.8.7 + # :nocov: + def respond_to?(method, *) + method = method.to_s + method =~ DYNAMIC_MATCHER_REGEX || super + end + public :respond_to? + # :nocov: + end + + # @api private + def self.is_a_matcher?(obj) + return true if ::RSpec::Matchers::BuiltIn::BaseMatcher === obj + begin + return false if obj.respond_to?(:i_respond_to_everything_so_im_not_really_a_matcher) + rescue NoMethodError + # Some objects, like BasicObject, don't implemented standard + # reflection methods. + return false + end + return false unless obj.respond_to?(:matches?) + + obj.respond_to?(:failure_message) || + obj.respond_to?(:failure_message_for_should) # support legacy matchers + end + + ::RSpec::Support.register_matcher_definition do |obj| + is_a_matcher?(obj) + end + + # @api private + def self.is_a_describable_matcher?(obj) + is_a_matcher?(obj) && obj.respond_to?(:description) + end + + class << self + private + + if RSpec::Support::Ruby.mri? && RUBY_VERSION[0, 3] == '1.9' + # Note that `included` doesn't work for this because it is triggered + # _after_ `RSpec::Matchers` is an ancestor of the inclusion host, rather + # than _before_, like `append_features`. It's important we check this before + # in order to find the cases where it was already previously included. + # @api private + def append_features(mod) + return super if mod < self # `mod < self` indicates a re-inclusion. + + subclasses = ObjectSpace.each_object(Class).select { |c| c < mod && c < self } + return super unless subclasses.any? + + subclasses.reject! { |s| subclasses.any? { |s2| s < s2 } } # Filter to the root ancestor. + subclasses = subclasses.map { |s| "`#{s}`" }.join(", ") + + RSpec.warning "`#{self}` has been included in a superclass (`#{mod}`) " \ + "after previously being included in subclasses (#{subclasses}), " \ + "which can trigger infinite recursion from `super` due to an MRI 1.9 bug " \ + "(https://redmine.ruby-lang.org/issues/3351). To work around this, " \ + "either upgrade to MRI 2.0+, include a dup of the module (e.g. " \ + "`include #{self}.dup`), or find a way to include `#{self}` in `#{mod}` " \ + "before it is included in subclasses (#{subclasses}). See " \ + "https://github.com/rspec/rspec-expectations/issues/814 for more info" + + super + end + end + end + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/rspec-expectations-3.11.0/lib/rspec/matchers/aliased_matcher.rb b/vendor/bundle/ruby/3.1.0/gems/rspec-expectations-3.11.0/lib/rspec/matchers/aliased_matcher.rb new file mode 100644 index 000000000..c384d2ac2 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/rspec-expectations-3.11.0/lib/rspec/matchers/aliased_matcher.rb @@ -0,0 +1,116 @@ +module RSpec + module Matchers + # Decorator that wraps a matcher and overrides `description` + # using the provided block in order to support an alias + # of a matcher. This is intended for use when composing + # matchers, so that you can use an expression like + # `include( a_value_within(0.1).of(3) )` rather than + # `include( be_within(0.1).of(3) )`, and have the corresponding + # description read naturally. + # + # @api private + class AliasedMatcher < MatcherDelegator + def initialize(base_matcher, description_block) + @description_block = description_block + super(base_matcher) + end + + # Forward messages on to the wrapped matcher. + # Since many matchers provide a fluent interface + # (e.g. `a_value_within(0.1).of(3)`), we need to wrap + # the returned value if it responds to `description`, + # so that our override can be applied when it is eventually + # used. + def method_missing(*) + return_val = super + return return_val unless RSpec::Matchers.is_a_matcher?(return_val) + self.class.new(return_val, @description_block) + end + + # Provides the description of the aliased matcher. Aliased matchers + # are designed to behave identically to the original matcher except + # for the description and failure messages. The description is different + # to reflect the aliased name. + # + # @api private + def description + @description_block.call(super) + end + + # Provides the failure_message of the aliased matcher. Aliased matchers + # are designed to behave identically to the original matcher except + # for the description and failure messages. The failure_message is different + # to reflect the aliased name. + # + # @api private + def failure_message + @description_block.call(super) + end + + # Provides the failure_message_when_negated of the aliased matcher. Aliased matchers + # are designed to behave identically to the original matcher except + # for the description and failure messages. The failure_message_when_negated is different + # to reflect the aliased name. + # + # @api private + def failure_message_when_negated + @description_block.call(super) + end + end + + # Decorator used for matchers that have special implementations of + # operators like `==` and `===`. + # @private + class AliasedMatcherWithOperatorSupport < AliasedMatcher + # We undef these so that they get delegated via `method_missing`. + undef == + undef === + end + + # @private + class AliasedNegatedMatcher < AliasedMatcher + def matches?(*args, &block) + if @base_matcher.respond_to?(:does_not_match?) + @base_matcher.does_not_match?(*args, &block) + else + !super + end + end + + def does_not_match?(*args, &block) + @base_matcher.matches?(*args, &block) + end + + def failure_message + optimal_failure_message(__method__, :failure_message_when_negated) + end + + def failure_message_when_negated + optimal_failure_message(__method__, :failure_message) + end + + private + + DefaultFailureMessages = BuiltIn::BaseMatcher::DefaultFailureMessages + + # For a matcher that uses the default failure messages, we prefer to + # use the override provided by the `description_block`, because it + # includes the phrasing that the user has expressed a preference for + # by going through the effort of defining a negated matcher. + # + # However, if the override didn't actually change anything, then we + # should return the opposite failure message instead -- the overriden + # message is going to be confusing if we return it as-is, as it represents + # the non-negated failure message for a negated match (or vice versa). + def optimal_failure_message(same, inverted) + if DefaultFailureMessages.has_default_failure_messages?(@base_matcher) + base_message = @base_matcher.__send__(same) + overriden = @description_block.call(base_message) + return overriden if overriden != base_message + end + + @base_matcher.__send__(inverted) + end + end + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/rspec-expectations-3.11.0/lib/rspec/matchers/built_in.rb b/vendor/bundle/ruby/3.1.0/gems/rspec-expectations-3.11.0/lib/rspec/matchers/built_in.rb new file mode 100644 index 000000000..e6237ff08 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/rspec-expectations-3.11.0/lib/rspec/matchers/built_in.rb @@ -0,0 +1,53 @@ +RSpec::Support.require_rspec_matchers "built_in/base_matcher" + +module RSpec + module Matchers + # Container module for all built-in matchers. The matcher classes are here + # (rather than directly under `RSpec::Matchers`) in order to prevent name + # collisions, since `RSpec::Matchers` gets included into the user's namespace. + # + # Autoloading is used to delay when the matcher classes get loaded, allowing + # rspec-matchers to boot faster, and avoiding loading matchers the user is + # not using. + module BuiltIn + autoload :BeAKindOf, 'rspec/matchers/built_in/be_kind_of' + autoload :BeAnInstanceOf, 'rspec/matchers/built_in/be_instance_of' + autoload :BeBetween, 'rspec/matchers/built_in/be_between' + autoload :Be, 'rspec/matchers/built_in/be' + autoload :BeComparedTo, 'rspec/matchers/built_in/be' + autoload :BeFalsey, 'rspec/matchers/built_in/be' + autoload :BeHelpers, 'rspec/matchers/built_in/be' + autoload :BeNil, 'rspec/matchers/built_in/be' + autoload :BePredicate, 'rspec/matchers/built_in/has' + autoload :BeTruthy, 'rspec/matchers/built_in/be' + autoload :BeWithin, 'rspec/matchers/built_in/be_within' + autoload :Change, 'rspec/matchers/built_in/change' + autoload :Compound, 'rspec/matchers/built_in/compound' + autoload :ContainExactly, 'rspec/matchers/built_in/contain_exactly' + autoload :Cover, 'rspec/matchers/built_in/cover' + autoload :EndWith, 'rspec/matchers/built_in/start_or_end_with' + autoload :Eq, 'rspec/matchers/built_in/eq' + autoload :Eql, 'rspec/matchers/built_in/eql' + autoload :Equal, 'rspec/matchers/built_in/equal' + autoload :Exist, 'rspec/matchers/built_in/exist' + autoload :Has, 'rspec/matchers/built_in/has' + autoload :HaveAttributes, 'rspec/matchers/built_in/have_attributes' + autoload :Include, 'rspec/matchers/built_in/include' + autoload :All, 'rspec/matchers/built_in/all' + autoload :Match, 'rspec/matchers/built_in/match' + autoload :NegativeOperatorMatcher, 'rspec/matchers/built_in/operators' + autoload :OperatorMatcher, 'rspec/matchers/built_in/operators' + autoload :Output, 'rspec/matchers/built_in/output' + autoload :PositiveOperatorMatcher, 'rspec/matchers/built_in/operators' + autoload :RaiseError, 'rspec/matchers/built_in/raise_error' + autoload :RespondTo, 'rspec/matchers/built_in/respond_to' + autoload :Satisfy, 'rspec/matchers/built_in/satisfy' + autoload :StartWith, 'rspec/matchers/built_in/start_or_end_with' + autoload :ThrowSymbol, 'rspec/matchers/built_in/throw_symbol' + autoload :YieldControl, 'rspec/matchers/built_in/yield' + autoload :YieldSuccessiveArgs, 'rspec/matchers/built_in/yield' + autoload :YieldWithArgs, 'rspec/matchers/built_in/yield' + autoload :YieldWithNoArgs, 'rspec/matchers/built_in/yield' + end + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/rspec-expectations-3.11.0/lib/rspec/matchers/built_in/all.rb b/vendor/bundle/ruby/3.1.0/gems/rspec-expectations-3.11.0/lib/rspec/matchers/built_in/all.rb new file mode 100644 index 000000000..27cce20d1 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/rspec-expectations-3.11.0/lib/rspec/matchers/built_in/all.rb @@ -0,0 +1,86 @@ +module RSpec + module Matchers + module BuiltIn + # @api private + # Provides the implementation for `all`. + # Not intended to be instantiated directly. + class All < BaseMatcher + # @private + attr_reader :matcher, :failed_objects + + def initialize(matcher) + @matcher = matcher + @failed_objects = {} + end + + # @private + def does_not_match?(_actual) + raise NotImplementedError, '`expect().not_to all( matcher )` is not supported.' + end + + # @api private + # @return [String] + def failure_message + unless iterable? + return "#{improve_hash_formatting(super)}, but was not iterable" + end + + all_messages = [improve_hash_formatting(super)] + failed_objects.each do |index, matcher_failure_message| + all_messages << failure_message_for_item(index, matcher_failure_message) + end + all_messages.join("\n\n") + end + + # @api private + # @return [String] + def description + improve_hash_formatting "all #{description_of matcher}" + end + + private + + def match(_expected, _actual) + return false unless iterable? + + index_failed_objects + failed_objects.empty? + end + + def index_failed_objects + actual.each_with_index do |actual_item, index| + cloned_matcher = matcher.clone + matches = cloned_matcher.matches?(actual_item) + failed_objects[index] = cloned_matcher.failure_message unless matches + end + end + + def failure_message_for_item(index, failure_message) + failure_message = indent_multiline_message(add_new_line_if_needed(failure_message)) + indent_multiline_message("object at index #{index} failed to match:#{failure_message}") + end + + def add_new_line_if_needed(message) + message.start_with?("\n") ? message : "\n#{message}" + end + + def indent_multiline_message(message) + message = message.sub(/\n+\z/, '') + message.lines.map do |line| + line =~ /\S/ ? ' ' + line : line + end.join + end + + def initialize_copy(other) + @matcher = @matcher.clone + @failed_objects = @failed_objects.clone + super + end + + def iterable? + @actual.respond_to?(:each_with_index) + end + end + end + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/rspec-expectations-3.11.0/lib/rspec/matchers/built_in/base_matcher.rb b/vendor/bundle/ruby/3.1.0/gems/rspec-expectations-3.11.0/lib/rspec/matchers/built_in/base_matcher.rb new file mode 100644 index 000000000..ec957be9d --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/rspec-expectations-3.11.0/lib/rspec/matchers/built_in/base_matcher.rb @@ -0,0 +1,198 @@ +module RSpec + module Matchers + module BuiltIn + # @api private + # + # Used _internally_ as a base class for matchers that ship with + # rspec-expectations and rspec-rails. + # + # ### Warning: + # + # This class is for internal use, and subject to change without notice. + # We strongly recommend that you do not base your custom matchers on this + # class. If/when this changes, we will announce it and remove this warning. + class BaseMatcher + include RSpec::Matchers::Composable + + # @api private + # Used to detect when no arg is passed to `initialize`. + # `nil` cannot be used because it's a valid value to pass. + UNDEFINED = Object.new.freeze + + # @private + attr_reader :actual, :expected, :rescued_exception + + # @private + attr_writer :matcher_name + + def initialize(expected=UNDEFINED) + @expected = expected unless UNDEFINED.equal?(expected) + end + + # @api private + # Indicates if the match is successful. Delegates to `match`, which + # should be defined on a subclass. Takes care of consistently + # initializing the `actual` attribute. + def matches?(actual) + @actual = actual + match(expected, actual) + end + + # @api private + # Used to wrap a block of code that will indicate failure by + # raising one of the named exceptions. + # + # This is used by rspec-rails for some of its matchers that + # wrap rails' assertions. + def match_unless_raises(*exceptions) + exceptions.unshift Exception if exceptions.empty? + begin + yield + true + rescue *exceptions => @rescued_exception + false + end + end + + # @api private + # Generates a description using {EnglishPhrasing}. + # @return [String] + def description + desc = EnglishPhrasing.split_words(self.class.matcher_name) + desc << EnglishPhrasing.list(@expected) if defined?(@expected) + desc + end + + # @api private + # Matchers are not diffable by default. Override this to make your + # subclass diffable. + def diffable? + false + end + + # @api private + # Most matchers are value matchers (i.e. meant to work with `expect(value)`) + # rather than block matchers (i.e. meant to work with `expect { }`), so + # this defaults to false. Block matchers must override this to return true. + def supports_block_expectations? + false + end + + # @private + def supports_value_expectations? + true + end + + # @api private + def expects_call_stack_jump? + false + end + + # @private + def expected_formatted + RSpec::Support::ObjectFormatter.format(@expected) + end + + # @private + def actual_formatted + RSpec::Support::ObjectFormatter.format(@actual) + end + + # @private + def self.matcher_name + @matcher_name ||= underscore(name.split('::').last) + end + + # @private + def matcher_name + if defined?(@matcher_name) + @matcher_name + else + self.class.matcher_name + end + end + + # @private + # Borrowed from ActiveSupport. + def self.underscore(camel_cased_word) + word = camel_cased_word.to_s.dup + word.gsub!(/([A-Z]+)([A-Z][a-z])/, '\1_\2') + word.gsub!(/([a-z\d])([A-Z])/, '\1_\2') + word.tr!('-', '_') + word.downcase! + word + end + private_class_method :underscore + + private + + def assert_ivars(*expected_ivars) + return unless (expected_ivars - present_ivars).any? + ivar_list = EnglishPhrasing.list(expected_ivars) + raise "#{self.class.name} needs to supply#{ivar_list}" + end + + if RUBY_VERSION.to_f < 1.9 + # :nocov: + def present_ivars + instance_variables.map(&:to_sym) + end + # :nocov: + else + alias present_ivars instance_variables + end + + # @private + module HashFormatting + # `{ :a => 5, :b => 2 }.inspect` produces: + # + # {:a=>5, :b=>2} + # + # ...but it looks much better as: + # + # {:a => 5, :b => 2} + # + # This is idempotent and safe to run on a string multiple times. + def improve_hash_formatting(inspect_string) + inspect_string.gsub(/(\S)=>(\S)/, '\1 => \2') + end + module_function :improve_hash_formatting + end + + include HashFormatting + + # @api private + # Provides default implementations of failure messages, based on the `description`. + module DefaultFailureMessages + # @api private + # Provides a good generic failure message. Based on `description`. + # When subclassing, if you are not satisfied with this failure message + # you often only need to override `description`. + # @return [String] + def failure_message + "expected #{description_of @actual} to #{description}".dup + end + + # @api private + # Provides a good generic negative failure message. Based on `description`. + # When subclassing, if you are not satisfied with this failure message + # you often only need to override `description`. + # @return [String] + def failure_message_when_negated + "expected #{description_of @actual} not to #{description}".dup + end + + # @private + def self.has_default_failure_messages?(matcher) + matcher.method(:failure_message).owner == self && + matcher.method(:failure_message_when_negated).owner == self + rescue NameError + false + end + end + + include DefaultFailureMessages + end + end + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/rspec-expectations-3.11.0/lib/rspec/matchers/built_in/be.rb b/vendor/bundle/ruby/3.1.0/gems/rspec-expectations-3.11.0/lib/rspec/matchers/built_in/be.rb new file mode 100644 index 000000000..40d401718 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/rspec-expectations-3.11.0/lib/rspec/matchers/built_in/be.rb @@ -0,0 +1,191 @@ +module RSpec + module Matchers + module BuiltIn + # @api private + # Provides the implementation for `be_truthy`. + # Not intended to be instantiated directly. + class BeTruthy < BaseMatcher + # @api private + # @return [String] + def failure_message + "expected: truthy value\n got: #{actual_formatted}" + end + + # @api private + # @return [String] + def failure_message_when_negated + "expected: falsey value\n got: #{actual_formatted}" + end + + private + + def match(_, actual) + !!actual + end + end + + # @api private + # Provides the implementation for `be_falsey`. + # Not intended to be instantiated directly. + class BeFalsey < BaseMatcher + # @api private + # @return [String] + def failure_message + "expected: falsey value\n got: #{actual_formatted}" + end + + # @api private + # @return [String] + def failure_message_when_negated + "expected: truthy value\n got: #{actual_formatted}" + end + + private + + def match(_, actual) + !actual + end + end + + # @api private + # Provides the implementation for `be_nil`. + # Not intended to be instantiated directly. + class BeNil < BaseMatcher + # @api private + # @return [String] + def failure_message + "expected: nil\n got: #{actual_formatted}" + end + + # @api private + # @return [String] + def failure_message_when_negated + "expected: not nil\n got: nil" + end + + private + + def match(_, actual) + actual.nil? + end + end + + # @private + module BeHelpers + private + + def args_to_s + @args.empty? ? "" : parenthesize(inspected_args.join(', ')) + end + + def parenthesize(string) + "(#{string})" + end + + def inspected_args + @args.map { |a| RSpec::Support::ObjectFormatter.format(a) } + end + + def expected_to_sentence + EnglishPhrasing.split_words(@expected) + end + + def args_to_sentence + EnglishPhrasing.list(@args) + end + end + + # @api private + # Provides the implementation for `be`. + # Not intended to be instantiated directly. + class Be < BaseMatcher + include BeHelpers + + def initialize(*args) + @args = args + end + + # @api private + # @return [String] + def failure_message + "expected #{actual_formatted} to evaluate to true" + end + + # @api private + # @return [String] + def failure_message_when_negated + "expected #{actual_formatted} to evaluate to false" + end + + [:==, :<, :<=, :>=, :>, :===, :=~].each do |operator| + define_method operator do |operand| + BeComparedTo.new(operand, operator) + end + end + + private + + def match(_, actual) + !!actual + end + end + + # @api private + # Provides the implementation of `be value`. + # Not intended to be instantiated directly. + class BeComparedTo < BaseMatcher + include BeHelpers + + def initialize(operand, operator) + @expected = operand + @operator = operator + @args = [] + end + + def matches?(actual) + perform_match(actual) + rescue ArgumentError, NoMethodError + false + end + + def does_not_match?(actual) + !perform_match(actual) + rescue ArgumentError, NoMethodError + false + end + + # @api private + # @return [String] + def failure_message + "expected: #{@operator} #{expected_formatted}\n" \ + " got: #{@operator.to_s.gsub(/./, ' ')} #{actual_formatted}" + end + + # @api private + # @return [String] + def failure_message_when_negated + message = "`expect(#{actual_formatted}).not_to " \ + "be #{@operator} #{expected_formatted}`" + if [:<, :>, :<=, :>=].include?(@operator) + message + " not only FAILED, it is a bit confusing." + else + message + end + end + + # @api private + # @return [String] + def description + "be #{@operator} #{expected_to_sentence}#{args_to_sentence}" + end + + private + + def perform_match(actual) + @actual = actual + @actual.__send__ @operator, @expected + end + end + end + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/rspec-expectations-3.11.0/lib/rspec/matchers/built_in/be_between.rb b/vendor/bundle/ruby/3.1.0/gems/rspec-expectations-3.11.0/lib/rspec/matchers/built_in/be_between.rb new file mode 100644 index 000000000..55f084e4b --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/rspec-expectations-3.11.0/lib/rspec/matchers/built_in/be_between.rb @@ -0,0 +1,77 @@ +module RSpec + module Matchers + module BuiltIn + # @api private + # Provides the implementation for `be_between`. + # Not intended to be instantiated directly. + class BeBetween < BaseMatcher + def initialize(min, max) + @min, @max = min, max + inclusive + end + + # @api public + # Makes the between comparison inclusive. + # + # @example + # expect(3).to be_between(2, 3).inclusive + # + # @note The matcher is inclusive by default; this simply provides + # a way to be more explicit about it. + def inclusive + @less_than_operator = :<= + @greater_than_operator = :>= + @mode = :inclusive + self + end + + # @api public + # Makes the between comparison exclusive. + # + # @example + # expect(3).to be_between(2, 4).exclusive + def exclusive + @less_than_operator = :< + @greater_than_operator = :> + @mode = :exclusive + self + end + + # @api private + # @return [Boolean] + def matches?(actual) + @actual = actual + comparable? && compare + rescue ArgumentError + false + end + + # @api private + # @return [String] + def failure_message + "#{super}#{not_comparable_clause}" + end + + # @api private + # @return [String] + def description + "be between #{description_of @min} and #{description_of @max} (#{@mode})" + end + + private + + def comparable? + @actual.respond_to?(@less_than_operator) && @actual.respond_to?(@greater_than_operator) + end + + def not_comparable_clause + ", but it does not respond to `#{@less_than_operator}` and `#{@greater_than_operator}`" unless comparable? + end + + def compare + @actual.__send__(@greater_than_operator, @min) && @actual.__send__(@less_than_operator, @max) + end + end + end + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/rspec-expectations-3.11.0/lib/rspec/matchers/built_in/be_instance_of.rb b/vendor/bundle/ruby/3.1.0/gems/rspec-expectations-3.11.0/lib/rspec/matchers/built_in/be_instance_of.rb new file mode 100644 index 000000000..e71d380a0 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/rspec-expectations-3.11.0/lib/rspec/matchers/built_in/be_instance_of.rb @@ -0,0 +1,26 @@ +module RSpec + module Matchers + module BuiltIn + # @api private + # Provides the implementation for `be_an_instance_of`. + # Not intended to be instantiated directly. + class BeAnInstanceOf < BaseMatcher + # @api private + # @return [String] + def description + "be an instance of #{expected}" + end + + private + + def match(expected, actual) + actual.instance_of?(expected) + rescue NoMethodError + raise ::ArgumentError, "The #{matcher_name} matcher requires that " \ + "the actual object responds to #instance_of? method " \ + "but a `NoMethodError` was encountered instead." + end + end + end + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/rspec-expectations-3.11.0/lib/rspec/matchers/built_in/be_kind_of.rb b/vendor/bundle/ruby/3.1.0/gems/rspec-expectations-3.11.0/lib/rspec/matchers/built_in/be_kind_of.rb new file mode 100644 index 000000000..4fe23bd92 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/rspec-expectations-3.11.0/lib/rspec/matchers/built_in/be_kind_of.rb @@ -0,0 +1,20 @@ +module RSpec + module Matchers + module BuiltIn + # @api private + # Provides the implementation for `be_a_kind_of`. + # Not intended to be instantiated directly. + class BeAKindOf < BaseMatcher + private + + def match(expected, actual) + actual.kind_of?(expected) + rescue NoMethodError + raise ::ArgumentError, "The #{matcher_name} matcher requires that " \ + "the actual object responds to #kind_of? method " \ + "but a `NoMethodError` was encountered instead." + end + end + end + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/rspec-expectations-3.11.0/lib/rspec/matchers/built_in/be_within.rb b/vendor/bundle/ruby/3.1.0/gems/rspec-expectations-3.11.0/lib/rspec/matchers/built_in/be_within.rb new file mode 100644 index 000000000..7a2b5b5be --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/rspec-expectations-3.11.0/lib/rspec/matchers/built_in/be_within.rb @@ -0,0 +1,72 @@ +module RSpec + module Matchers + module BuiltIn + # @api private + # Provides the implementation for `be_within`. + # Not intended to be instantiated directly. + class BeWithin < BaseMatcher + def initialize(delta) + @delta = delta + end + + # @api public + # Sets the expected value. + def of(expected) + @expected = expected + @tolerance = @delta + @unit = '' + self + end + + # @api public + # Sets the expected value, and makes the matcher do + # a percent comparison. + def percent_of(expected) + @expected = expected + @tolerance = @expected.abs * @delta / 100.0 + @unit = '%' + self + end + + # @private + def matches?(actual) + @actual = actual + raise needs_expected unless defined? @expected + numeric? && (@actual - @expected).abs <= @tolerance + end + + # @api private + # @return [String] + def failure_message + "expected #{actual_formatted} to #{description}#{not_numeric_clause}" + end + + # @api private + # @return [String] + def failure_message_when_negated + "expected #{actual_formatted} not to #{description}" + end + + # @api private + # @return [String] + def description + "be within #{@delta}#{@unit} of #{expected_formatted}" + end + + private + + def numeric? + @actual.respond_to?(:-) + end + + def needs_expected + ArgumentError.new "You must set an expected value using #of: be_within(#{@delta}).of(expected_value)" + end + + def not_numeric_clause + ", but it could not be treated as a numeric value" unless numeric? + end + end + end + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/rspec-expectations-3.11.0/lib/rspec/matchers/built_in/change.rb b/vendor/bundle/ruby/3.1.0/gems/rspec-expectations-3.11.0/lib/rspec/matchers/built_in/change.rb new file mode 100644 index 000000000..c43666a48 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/rspec-expectations-3.11.0/lib/rspec/matchers/built_in/change.rb @@ -0,0 +1,450 @@ +module RSpec + module Matchers + module BuiltIn + # @api private + # Provides the implementation for `change`. + # Not intended to be instantiated directly. + class Change < BaseMatcher + # @api public + # Specifies the delta of the expected change. + def by(expected_delta) + ChangeRelatively.new(change_details, expected_delta, :by) do |actual_delta| + values_match?(expected_delta, actual_delta) + end + end + + # @api public + # Specifies a minimum delta of the expected change. + def by_at_least(minimum) + ChangeRelatively.new(change_details, minimum, :by_at_least) do |actual_delta| + actual_delta >= minimum + end + end + + # @api public + # Specifies a maximum delta of the expected change. + def by_at_most(maximum) + ChangeRelatively.new(change_details, maximum, :by_at_most) do |actual_delta| + actual_delta <= maximum + end + end + + # @api public + # Specifies the new value you expect. + def to(value) + ChangeToValue.new(change_details, value) + end + + # @api public + # Specifies the original value. + def from(value) + ChangeFromValue.new(change_details, value) + end + + # @private + def matches?(event_proc) + raise_block_syntax_error if block_given? + perform_change(event_proc) && change_details.changed? + end + + def does_not_match?(event_proc) + raise_block_syntax_error if block_given? + perform_change(event_proc) && !change_details.changed? + end + + # @api private + # @return [String] + def failure_message + "expected #{change_details.value_representation} to have changed, " \ + "but #{positive_failure_reason}" + end + + # @api private + # @return [String] + def failure_message_when_negated + "expected #{change_details.value_representation} not to have changed, " \ + "but #{negative_failure_reason}" + end + + # @api private + # @return [String] + def description + "change #{change_details.value_representation}" + end + + # @private + def supports_block_expectations? + true + end + + # @private + def supports_value_expectations? + false + end + + private + + def initialize(receiver=nil, message=nil, &block) + @receiver = receiver + @message = message + @block = block + end + + def change_details + @change_details ||= ChangeDetails.new(matcher_name, @receiver, @message, &@block) + end + + def perform_change(event_proc) + @event_proc = event_proc + change_details.perform_change(event_proc) do |actual_before| + # pre-compute values derived from the `before` value before the + # mutation is applied, in case the specified mutation is mutation + # of a single object (rather than a changing what object a method + # returns). We need to cache these values before the `before` value + # they are based on potentially gets mutated. + @actual_before_description = description_of(actual_before) + end + end + + def raise_block_syntax_error + raise SyntaxError, "Block not received by the `change` matcher. " \ + "Perhaps you want to use `{ ... }` instead of do/end?" + end + + def positive_failure_reason + return "was not given a block" unless Proc === @event_proc + "is still #{@actual_before_description}" + end + + def negative_failure_reason + return "was not given a block" unless Proc === @event_proc + "did change from #{@actual_before_description} " \ + "to #{description_of change_details.actual_after}" + end + end + + # Used to specify a relative change. + # @api private + class ChangeRelatively < BaseMatcher + def initialize(change_details, expected_delta, relativity, &comparer) + @change_details = change_details + @expected_delta = expected_delta + @relativity = relativity + @comparer = comparer + end + + # @private + def failure_message + "expected #{@change_details.value_representation} to have changed " \ + "#{@relativity.to_s.tr('_', ' ')} " \ + "#{description_of @expected_delta}, but #{failure_reason}" + end + + # @private + def matches?(event_proc) + @event_proc = event_proc + @change_details.perform_change(event_proc) && @comparer.call(@change_details.actual_delta) + end + + # @private + def does_not_match?(_event_proc) + raise NotImplementedError, "`expect { }.not_to change " \ + "{ }.#{@relativity}()` is not supported" + end + + # @private + def description + "change #{@change_details.value_representation} " \ + "#{@relativity.to_s.tr('_', ' ')} #{description_of @expected_delta}" + end + + # @private + def supports_block_expectations? + true + end + + # @private + def supports_value_expectations? + false + end + + private + + def failure_reason + return "was not given a block" unless Proc === @event_proc + "was changed by #{description_of @change_details.actual_delta}" + end + end + + # @api private + # Base class for specifying a change from and/or to specific values. + class SpecificValuesChange < BaseMatcher + # @private + MATCH_ANYTHING = ::Object.ancestors.last + + def initialize(change_details, from, to) + @change_details = change_details + @expected_before = from + @expected_after = to + end + + # @private + def matches?(event_proc) + perform_change(event_proc) && @change_details.changed? && @matches_before && matches_after? + end + + # @private + def description + "change #{@change_details.value_representation} #{change_description}" + end + + # @private + def failure_message + return not_given_a_block_failure unless Proc === @event_proc + return before_value_failure unless @matches_before + return did_not_change_failure unless @change_details.changed? + after_value_failure + end + + # @private + def supports_block_expectations? + true + end + + # @private + def supports_value_expectations? + false + end + + private + + def perform_change(event_proc) + @event_proc = event_proc + @change_details.perform_change(event_proc) do |actual_before| + # pre-compute values derived from the `before` value before the + # mutation is applied, in case the specified mutation is mutation + # of a single object (rather than a changing what object a method + # returns). We need to cache these values before the `before` value + # they are based on potentially gets mutated. + @matches_before = values_match?(@expected_before, actual_before) + @actual_before_description = description_of(actual_before) + end + end + + def matches_after? + values_match?(@expected_after, @change_details.actual_after) + end + + def before_value_failure + "expected #{@change_details.value_representation} " \ + "to have initially been #{description_of @expected_before}, " \ + "but was #{@actual_before_description}" + end + + def after_value_failure + "expected #{@change_details.value_representation} " \ + "to have changed to #{description_of @expected_after}, " \ + "but is now #{description_of @change_details.actual_after}" + end + + def did_not_change_failure + "expected #{@change_details.value_representation} " \ + "to have changed #{change_description}, but did not change" + end + + def did_change_failure + "expected #{@change_details.value_representation} not to have changed, but " \ + "did change from #{@actual_before_description} " \ + "to #{description_of @change_details.actual_after}" + end + + def not_given_a_block_failure + "expected #{@change_details.value_representation} to have changed " \ + "#{change_description}, but was not given a block" + end + end + + # @api private + # Used to specify a change from a specific value + # (and, optionally, to a specific value). + class ChangeFromValue < SpecificValuesChange + def initialize(change_details, expected_before) + @description_suffix = nil + super(change_details, expected_before, MATCH_ANYTHING) + end + + # @api public + # Specifies the new value you expect. + def to(value) + @expected_after = value + @description_suffix = " to #{description_of value}" + self + end + + # @private + def does_not_match?(event_proc) + if @description_suffix + raise NotImplementedError, "`expect { }.not_to change { }.to()` " \ + "is not supported" + end + + perform_change(event_proc) && !@change_details.changed? && @matches_before + end + + # @private + def failure_message_when_negated + return not_given_a_block_failure unless Proc === @event_proc + return before_value_failure unless @matches_before + did_change_failure + end + + private + + def change_description + "from #{description_of @expected_before}#{@description_suffix}" + end + end + + # @api private + # Used to specify a change to a specific value + # (and, optionally, from a specific value). + class ChangeToValue < SpecificValuesChange + def initialize(change_details, expected_after) + @description_suffix = nil + super(change_details, MATCH_ANYTHING, expected_after) + end + + # @api public + # Specifies the original value. + def from(value) + @expected_before = value + @description_suffix = " from #{description_of value}" + self + end + + # @private + def does_not_match?(_event_proc) + raise NotImplementedError, "`expect { }.not_to change { }.to()` " \ + "is not supported" + end + + private + + def change_description + "to #{description_of @expected_after}#{@description_suffix}" + end + end + + # @private + # Encapsulates the details of the before/after values. + # + # Note that this class exposes the `actual_after` value, to allow the + # matchers above to derive failure messages, etc from the value on demand + # as needed, but it intentionally does _not_ expose the `actual_before` + # value. Some usages of the `change` matcher mutate a specific object + # returned by the value proc, which means that failure message snippets, + # etc, which are derived from the `before` value may not be accurate if + # they are lazily computed as needed. We must pre-compute them before + # applying the change in the `expect` block. To ensure that all `change` + # matchers do that properly, we do not expose the `actual_before` value. + # Instead, matchers must pass a block to `perform_change`, which yields + # the `actual_before` value before applying the change. + class ChangeDetails + attr_reader :actual_after + + UNDEFINED = Module.new.freeze + + def initialize(matcher_name, receiver=nil, message=nil, &block) + if receiver && !message + raise( + ArgumentError, + "`change` requires either an object and message " \ + "(`change(obj, :msg)`) or a block (`change { }`). " \ + "You passed an object but no message." + ) + end + + @matcher_name = matcher_name + @receiver = receiver + @message = message + @value_proc = block + # TODO: temporary measure to mute warning of access to an initialized + # instance variable when a deprecated implicit block expectation + # syntax is used. This may be removed once `fail` is used, and the + # matcher never issues this warning. + @actual_after = UNDEFINED + end + + def value_representation + @value_representation ||= + if @message + "`#{message_notation(@receiver, @message)}`" + elsif (value_block_snippet = extract_value_block_snippet) + "`#{value_block_snippet}`" + else + 'result' + end + end + + def perform_change(event_proc) + @actual_before = evaluate_value_proc + @before_hash = @actual_before.hash + yield @actual_before if block_given? + + return false unless Proc === event_proc + event_proc.call + + @actual_after = evaluate_value_proc + @actual_hash = @actual_after.hash + true + end + + def changed? + # Consider it changed if either: + # + # - The before/after values are unequal + # - The before/after values have different hash values + # + # The latter case specifically handles the case when the value proc + # returns the exact same object, but it has been mutated. + # + # Note that it is not sufficient to only check the hashes; it is + # possible for two values to be unequal (and of different classes) + # but to return the same hash value. Also, some objects may change + # their hash after being compared with `==`/`!=`. + @actual_before != @actual_after || @before_hash != @actual_hash + end + + def actual_delta + @actual_after - @actual_before + end + + private + + def evaluate_value_proc + @value_proc ? @value_proc.call : @receiver.__send__(@message) + end + + def message_notation(receiver, message) + case receiver + when Module + "#{receiver}.#{message}" + else + "#{Support.class_of(receiver)}##{message}" + end + end + + if RSpec::Support::RubyFeatures.ripper_supported? + def extract_value_block_snippet + return nil unless @value_proc + Expectations::BlockSnippetExtractor.try_extracting_single_line_body_of(@value_proc, @matcher_name) + end + else + def extract_value_block_snippet + nil + end + end + end + end + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/rspec-expectations-3.11.0/lib/rspec/matchers/built_in/compound.rb b/vendor/bundle/ruby/3.1.0/gems/rspec-expectations-3.11.0/lib/rspec/matchers/built_in/compound.rb new file mode 100644 index 000000000..56f27b1a6 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/rspec-expectations-3.11.0/lib/rspec/matchers/built_in/compound.rb @@ -0,0 +1,290 @@ +module RSpec + module Matchers + module BuiltIn + # @api private + # Base class for `and` and `or` compound matchers. + class Compound < BaseMatcher + # @private + attr_reader :matcher_1, :matcher_2, :evaluator + + def initialize(matcher_1, matcher_2) + @matcher_1 = matcher_1 + @matcher_2 = matcher_2 + end + + # @private + def does_not_match?(_actual) + raise NotImplementedError, "`expect(...).not_to matcher.#{conjunction} matcher` " \ + "is not supported, since it creates a bit of an ambiguity. Instead, define negated versions " \ + "of whatever matchers you wish to negate with `RSpec::Matchers.define_negated_matcher` and " \ + "use `expect(...).to matcher.#{conjunction} matcher`." + end + + # @api private + # @return [String] + def description + "#{matcher_1.description} #{conjunction} #{matcher_2.description}" + end + + # @api private + def supports_block_expectations? + matcher_supports_block_expectations?(matcher_1) && + matcher_supports_block_expectations?(matcher_2) + end + + # @api private + def supports_value_expectations? + matcher_supports_value_expectations?(matcher_1) && + matcher_supports_value_expectations?(matcher_2) + end + + # @api private + def expects_call_stack_jump? + NestedEvaluator.matcher_expects_call_stack_jump?(matcher_1) || + NestedEvaluator.matcher_expects_call_stack_jump?(matcher_2) + end + + # @api private + # @return [Boolean] + def diffable? + matcher_is_diffable?(matcher_1) || matcher_is_diffable?(matcher_2) + end + + # @api private + # @return [RSpec::Matchers::ExpectedsForMultipleDiffs] + def expected + return nil unless evaluator + ::RSpec::Matchers::ExpectedsForMultipleDiffs.for_many_matchers(diffable_matcher_list) + end + + protected + + def diffable_matcher_list + list = [] + list.concat(diffable_matcher_list_for(matcher_1)) unless matcher_1_matches? + list.concat(diffable_matcher_list_for(matcher_2)) unless matcher_2_matches? + list + end + + private + + def initialize_copy(other) + @matcher_1 = @matcher_1.clone + @matcher_2 = @matcher_2.clone + super + end + + def match(_expected, actual) + evaluator_klass = if supports_block_expectations? && Proc === actual + NestedEvaluator + else + SequentialEvaluator + end + + @evaluator = evaluator_klass.new(actual, matcher_1, matcher_2) + end + + def indent_multiline_message(message) + message.lines.map do |line| + line =~ /\S/ ? ' ' + line : line + end.join + end + + def compound_failure_message + "#{indent_multiline_message(matcher_1.failure_message.sub(/\n+\z/, ''))}" \ + "\n\n...#{conjunction}:" \ + "\n\n#{indent_multiline_message(matcher_2.failure_message.sub(/\A\n+/, ''))}" + end + + def matcher_1_matches? + evaluator.matcher_matches?(matcher_1) + end + + def matcher_2_matches? + evaluator.matcher_matches?(matcher_2) + end + + def matcher_supports_block_expectations?(matcher) + matcher.supports_block_expectations? + rescue NoMethodError + false + end + + def matcher_supports_value_expectations?(matcher) + matcher.supports_value_expectations? + rescue NoMethodError + true + end + + def matcher_is_diffable?(matcher) + matcher.diffable? + rescue NoMethodError + false + end + + def diffable_matcher_list_for(matcher) + return [] unless matcher_is_diffable?(matcher) + return matcher.diffable_matcher_list if Compound === matcher + [matcher] + end + + # For value expectations, we can evaluate the matchers sequentially. + class SequentialEvaluator + def initialize(actual, *) + @actual = actual + end + + def matcher_matches?(matcher) + matcher.matches?(@actual) + end + end + + # Normally, we evaluate the matching sequentially. For an expression like + # `expect(x).to foo.and bar`, this becomes: + # + # expect(x).to foo + # expect(x).to bar + # + # For block expectations, we need to nest them instead, so that + # `expect { x }.to foo.and bar` becomes: + # + # expect { + # expect { x }.to foo + # }.to bar + # + # This is necessary so that the `expect` block is only executed once. + class NestedEvaluator + def initialize(actual, matcher_1, matcher_2) + @actual = actual + @matcher_1 = matcher_1 + @matcher_2 = matcher_2 + @match_results = {} + + inner, outer = order_block_matchers + + @match_results[outer] = outer.matches?(Proc.new do |*args| + @match_results[inner] = inner.matches?(inner_matcher_block(args)) + end) + end + + def matcher_matches?(matcher) + @match_results.fetch(matcher) do + raise ArgumentError, "Your #{matcher.description} has no match " \ + "results, this can occur when an unexpected call stack or " \ + "local jump occurs. Prehaps one of your matchers needs to " \ + "declare `expects_call_stack_jump?` as `true`?" + end + end + + private + + # Some block matchers (such as `yield_xyz`) pass args to the `expect` block. + # When such a matcher is used as the outer matcher, we need to forward the + # the args on to the `expect` block. + def inner_matcher_block(outer_args) + return @actual if outer_args.empty? + + Proc.new do |*inner_args| + unless inner_args.empty? + raise ArgumentError, "(#{@matcher_1.description}) and " \ + "(#{@matcher_2.description}) cannot be combined in a compound expectation " \ + "since both matchers pass arguments to the block." + end + + @actual.call(*outer_args) + end + end + + # For a matcher like `raise_error` or `throw_symbol`, where the block will jump + # up the call stack, we need to order things so that it is the inner matcher. + # For example, we need it to be this: + # + # expect { + # expect { + # x += 1 + # raise "boom" + # }.to raise_error("boom") + # }.to change { x }.by(1) + # + # ...rather than: + # + # expect { + # expect { + # x += 1 + # raise "boom" + # }.to change { x }.by(1) + # }.to raise_error("boom") + # + # In the latter case, the after-block logic in the `change` matcher would never + # get executed because the `raise "boom"` line would jump to the `rescue` in the + # `raise_error` logic, so only the former case will work properly. + # + # This method figures out which matcher should be the inner matcher and which + # should be the outer matcher. + def order_block_matchers + return @matcher_1, @matcher_2 unless self.class.matcher_expects_call_stack_jump?(@matcher_2) + return @matcher_2, @matcher_1 unless self.class.matcher_expects_call_stack_jump?(@matcher_1) + + raise ArgumentError, "(#{@matcher_1.description}) and " \ + "(#{@matcher_2.description}) cannot be combined in a compound expectation " \ + "because they both expect a call stack jump." + end + + def self.matcher_expects_call_stack_jump?(matcher) + matcher.expects_call_stack_jump? + rescue NoMethodError + false + end + end + + # @api public + # Matcher used to represent a compound `and` expectation. + class And < self + # @api private + # @return [String] + def failure_message + if matcher_1_matches? + matcher_2.failure_message + elsif matcher_2_matches? + matcher_1.failure_message + else + compound_failure_message + end + end + + private + + def match(*) + super + matcher_1_matches? && matcher_2_matches? + end + + def conjunction + "and" + end + end + + # @api public + # Matcher used to represent a compound `or` expectation. + class Or < self + # @api private + # @return [String] + def failure_message + compound_failure_message + end + + private + + def match(*) + super + matcher_1_matches? || matcher_2_matches? + end + + def conjunction + "or" + end + end + end + end + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/rspec-expectations-3.11.0/lib/rspec/matchers/built_in/contain_exactly.rb b/vendor/bundle/ruby/3.1.0/gems/rspec-expectations-3.11.0/lib/rspec/matchers/built_in/contain_exactly.rb new file mode 100644 index 000000000..1bf7f9831 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/rspec-expectations-3.11.0/lib/rspec/matchers/built_in/contain_exactly.rb @@ -0,0 +1,302 @@ +module RSpec + module Matchers + module BuiltIn + # rubocop:disable ClassLength + # @api private + # Provides the implementation for `contain_exactly` and `match_array`. + # Not intended to be instantiated directly. + class ContainExactly < BaseMatcher + # @api private + # @return [String] + def failure_message + if Array === actual + generate_failure_message + else + "expected a collection that can be converted to an array with " \ + "`#to_ary` or `#to_a`, but got #{actual_formatted}" + end + end + + # @api private + # @return [String] + def failure_message_when_negated + list = EnglishPhrasing.list(surface_descriptions_in(expected)) + "expected #{actual_formatted} not to contain exactly#{list}" + end + + # @api private + # @return [String] + def description + list = EnglishPhrasing.list(surface_descriptions_in(expected)) + "contain exactly#{list}" + end + + private + + def generate_failure_message + message = expected_collection_line + message += actual_collection_line + message += missing_elements_line unless missing_items.empty? + message += extra_elements_line unless extra_items.empty? + message + end + + def expected_collection_line + message_line('expected collection contained', expected, true) + end + + def actual_collection_line + message_line('actual collection contained', actual) + end + + def missing_elements_line + message_line('the missing elements were', missing_items, true) + end + + def extra_elements_line + message_line('the extra elements were', extra_items) + end + + def describe_collection(collection, surface_descriptions=false) + if surface_descriptions + "#{description_of(safe_sort(surface_descriptions_in collection))}\n" + else + "#{description_of(safe_sort(collection))}\n" + end + end + + def message_line(prefix, collection, surface_descriptions=false) + "%-32s%s" % [prefix + ':', + describe_collection(collection, surface_descriptions)] + end + + def match(_expected, _actual) + return false unless convert_actual_to_an_array + match_when_sorted? || (extra_items.empty? && missing_items.empty?) + end + + # This cannot always work (e.g. when dealing with unsortable items, + # or matchers as expected items), but it's practically free compared to + # the slowness of the full matching algorithm, and in common cases this + # works, so it's worth a try. + def match_when_sorted? + values_match?(safe_sort(expected), safe_sort(actual)) + end + + def convert_actual_to_an_array + if actual.respond_to?(:to_ary) + @actual = actual.to_ary + elsif actual.respond_to?(:to_a) && !to_a_disallowed?(actual) + @actual = actual.to_a + else + false + end + end + + def safe_sort(array) + array.sort + rescue Support::AllExceptionsExceptOnesWeMustNotRescue + array + end + + if RUBY_VERSION == "1.8.7" + def to_a_disallowed?(object) + case object + when NilClass, String then true + else Kernel == RSpec::Support.method_handle_for(object, :to_a).owner + end + end + else + def to_a_disallowed?(object) + NilClass === object + end + end + + def missing_items + @missing_items ||= best_solution.unmatched_expected_indexes.map do |index| + expected[index] + end + end + + def extra_items + @extra_items ||= best_solution.unmatched_actual_indexes.map do |index| + actual[index] + end + end + + def best_solution + @best_solution ||= pairings_maximizer.find_best_solution + end + + def pairings_maximizer + @pairings_maximizer ||= begin + expected_matches = Hash[Array.new(expected.size) { |i| [i, []] }] + actual_matches = Hash[Array.new(actual.size) { |i| [i, []] }] + + expected.each_with_index do |e, ei| + actual.each_with_index do |a, ai| + next unless values_match?(e, a) + + expected_matches[ei] << ai + actual_matches[ai] << ei + end + end + + PairingsMaximizer.new(expected_matches, actual_matches) + end + end + + # Once we started supporting composing matchers, the algorithm for this matcher got + # much more complicated. Consider this expression: + # + # expect(["fool", "food"]).to contain_exactly(/foo/, /fool/) + # + # This should pass (because we can pair /fool/ with "fool" and /foo/ with "food"), but + # the original algorithm used by this matcher would pair the first elements it could + # (/foo/ with "fool"), which would leave /fool/ and "food" unmatched. When we have + # an expected element which is a matcher that matches a superset of actual items + # compared to another expected element matcher, we need to consider every possible pairing. + # + # This class is designed to maximize the number of actual/expected pairings -- or, + # conversely, to minimize the number of unpaired items. It's essentially a brute + # force solution, but with a few heuristics applied to reduce the size of the + # problem space: + # + # * Any items which match none of the items in the other list are immediately + # placed into the `unmatched_expected_indexes` or `unmatched_actual_indexes` array. + # The extra items and missing items in the matcher failure message are derived + # from these arrays. + # * Any items which reciprocally match only each other are paired up and not + # considered further. + # + # What's left is only the items which match multiple items from the other list + # (or vice versa). From here, it performs a brute-force depth-first search, + # looking for a solution which pairs all elements in both lists, or, barring that, + # that produces the fewest unmatched items. + # + # @private + class PairingsMaximizer + # @private + Solution = Struct.new(:unmatched_expected_indexes, :unmatched_actual_indexes, + :indeterminate_expected_indexes, :indeterminate_actual_indexes) do + def worse_than?(other) + unmatched_item_count > other.unmatched_item_count + end + + def candidate? + indeterminate_expected_indexes.empty? && + indeterminate_actual_indexes.empty? + end + + def ideal? + candidate? && ( + unmatched_expected_indexes.empty? || + unmatched_actual_indexes.empty? + ) + end + + def unmatched_item_count + unmatched_expected_indexes.count + unmatched_actual_indexes.count + end + + def +(derived_candidate_solution) + self.class.new( + unmatched_expected_indexes + derived_candidate_solution.unmatched_expected_indexes, + unmatched_actual_indexes + derived_candidate_solution.unmatched_actual_indexes, + # Ignore the indeterminate indexes: by the time we get here, + # we've dealt with all indeterminates. + [], [] + ) + end + end + + attr_reader :expected_to_actual_matched_indexes, :actual_to_expected_matched_indexes, :solution + + def initialize(expected_to_actual_matched_indexes, actual_to_expected_matched_indexes) + @expected_to_actual_matched_indexes = expected_to_actual_matched_indexes + @actual_to_expected_matched_indexes = actual_to_expected_matched_indexes + + unmatched_expected_indexes, indeterminate_expected_indexes = + categorize_indexes(expected_to_actual_matched_indexes, actual_to_expected_matched_indexes) + + unmatched_actual_indexes, indeterminate_actual_indexes = + categorize_indexes(actual_to_expected_matched_indexes, expected_to_actual_matched_indexes) + + @solution = Solution.new(unmatched_expected_indexes, unmatched_actual_indexes, + indeterminate_expected_indexes, indeterminate_actual_indexes) + end + + def find_best_solution + return solution if solution.candidate? + best_solution_so_far = NullSolution + + expected_index = solution.indeterminate_expected_indexes.first + actuals = expected_to_actual_matched_indexes[expected_index] + + actuals.each do |actual_index| + solution = best_solution_for_pairing(expected_index, actual_index) + return solution if solution.ideal? + best_solution_so_far = solution if best_solution_so_far.worse_than?(solution) + end + + best_solution_so_far + end + + private + + # @private + # Starting solution that is worse than any other real solution. + NullSolution = Class.new do + def self.worse_than?(_other) + true + end + end + + def categorize_indexes(indexes_to_categorize, other_indexes) + unmatched = [] + indeterminate = [] + + indexes_to_categorize.each_pair do |index, matches| + if matches.empty? + unmatched << index + elsif !reciprocal_single_match?(matches, index, other_indexes) + indeterminate << index + end + end + + return unmatched, indeterminate + end + + def reciprocal_single_match?(matches, index, other_list) + return false unless matches.one? + other_list[matches.first] == [index] + end + + def best_solution_for_pairing(expected_index, actual_index) + modified_expecteds = apply_pairing_to( + solution.indeterminate_expected_indexes, + expected_to_actual_matched_indexes, actual_index) + + modified_expecteds.delete(expected_index) + + modified_actuals = apply_pairing_to( + solution.indeterminate_actual_indexes, + actual_to_expected_matched_indexes, expected_index) + + modified_actuals.delete(actual_index) + + solution + self.class.new(modified_expecteds, modified_actuals).find_best_solution + end + + def apply_pairing_to(indeterminates, original_matches, other_list_index) + indeterminates.inject({}) do |accum, index| + accum[index] = original_matches[index] - [other_list_index] + accum + end + end + end + end + # rubocop:enable ClassLength + end + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/rspec-expectations-3.11.0/lib/rspec/matchers/built_in/count_expectation.rb b/vendor/bundle/ruby/3.1.0/gems/rspec-expectations-3.11.0/lib/rspec/matchers/built_in/count_expectation.rb new file mode 100644 index 000000000..32272abf6 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/rspec-expectations-3.11.0/lib/rspec/matchers/built_in/count_expectation.rb @@ -0,0 +1,169 @@ +module RSpec + module Matchers + module BuiltIn + # @api private + # Asbtract class to implement `once`, `at_least` and other + # count constraints. + module CountExpectation + # @api public + # Specifies that the method is expected to match once. + def once + exactly(1) + end + + # @api public + # Specifies that the method is expected to match twice. + def twice + exactly(2) + end + + # @api public + # Specifies that the method is expected to match thrice. + def thrice + exactly(3) + end + + # @api public + # Specifies that the method is expected to match the given number of times. + def exactly(number) + set_expected_count(:==, number) + self + end + + # @api public + # Specifies the maximum number of times the method is expected to match + def at_most(number) + set_expected_count(:<=, number) + self + end + + # @api public + # Specifies the minimum number of times the method is expected to match + def at_least(number) + set_expected_count(:>=, number) + self + end + + # @api public + # No-op. Provides syntactic sugar. + def times + self + end + + protected + # @api private + attr_reader :count_expectation_type, :expected_count + + private + + if RUBY_VERSION.to_f > 1.8 + def cover?(count, number) + count.cover?(number) + end + else + def cover?(count, number) + number >= count.first && number <= count.last + end + end + + def expected_count_matches?(actual_count) + @actual_count = actual_count + return @actual_count > 0 unless count_expectation_type + return cover?(expected_count, actual_count) if count_expectation_type == :<=> + + @actual_count.__send__(count_expectation_type, expected_count) + end + + def has_expected_count? + !!count_expectation_type + end + + def set_expected_count(relativity, n) + raise_unsupported_count_expectation if unsupported_count_expectation?(relativity) + + count = count_constraint_to_number(n) + + if count_expectation_type == :<= && relativity == :>= + raise_impossible_count_expectation(count) if count > expected_count + @count_expectation_type = :<=> + @expected_count = count..expected_count + elsif count_expectation_type == :>= && relativity == :<= + raise_impossible_count_expectation(count) if count < expected_count + @count_expectation_type = :<=> + @expected_count = expected_count..count + else + @count_expectation_type = relativity + @expected_count = count + end + end + + def raise_impossible_count_expectation(count) + text = + case count_expectation_type + when :<= then "at_least(#{count}).at_most(#{expected_count})" + when :>= then "at_least(#{expected_count}).at_most(#{count})" + end + raise ArgumentError, "The constraint #{text} is not possible" + end + + def raise_unsupported_count_expectation + text = + case count_expectation_type + when :<= then "at_least" + when :>= then "at_most" + when :<=> then "at_least/at_most combination" + else "count" + end + raise ArgumentError, "Multiple #{text} constraints are not supported" + end + + def count_constraint_to_number(n) + case n + when Numeric then n + when :once then 1 + when :twice then 2 + when :thrice then 3 + else + raise ArgumentError, "Expected a number, :once, :twice or :thrice," \ + " but got #{n}" + end + end + + def unsupported_count_expectation?(relativity) + return true if count_expectation_type == :== + return true if count_expectation_type == :<=> + (count_expectation_type == :<= && relativity == :<=) || + (count_expectation_type == :>= && relativity == :>=) + end + + def count_expectation_description + "#{human_readable_expectation_type}#{human_readable_count(expected_count)}" + end + + def count_failure_reason(action) + "#{count_expectation_description}" \ + " but #{action}#{human_readable_count(@actual_count)}" + end + + def human_readable_expectation_type + case count_expectation_type + when :<= then ' at most' + when :>= then ' at least' + when :<=> then ' between' + else '' + end + end + + def human_readable_count(count) + case count + when Range then " #{count.first} and #{count.last} times" + when nil then '' + when 1 then ' once' + when 2 then ' twice' + else " #{count} times" + end + end + end + end + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/rspec-expectations-3.11.0/lib/rspec/matchers/built_in/cover.rb b/vendor/bundle/ruby/3.1.0/gems/rspec-expectations-3.11.0/lib/rspec/matchers/built_in/cover.rb new file mode 100644 index 000000000..47474a2c8 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/rspec-expectations-3.11.0/lib/rspec/matchers/built_in/cover.rb @@ -0,0 +1,24 @@ +module RSpec + module Matchers + module BuiltIn + # @api private + # Provides the implementation for `cover`. + # Not intended to be instantiated directly. + class Cover < BaseMatcher + def initialize(*expected) + @expected = expected + end + + def matches?(range) + @actual = range + @expected.all? { |e| range.cover?(e) } + end + + def does_not_match?(range) + @actual = range + expected.none? { |e| range.cover?(e) } + end + end + end + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/rspec-expectations-3.11.0/lib/rspec/matchers/built_in/eq.rb b/vendor/bundle/ruby/3.1.0/gems/rspec-expectations-3.11.0/lib/rspec/matchers/built_in/eq.rb new file mode 100644 index 000000000..f0c804a34 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/rspec-expectations-3.11.0/lib/rspec/matchers/built_in/eq.rb @@ -0,0 +1,40 @@ +module RSpec + module Matchers + module BuiltIn + # @api private + # Provides the implementation for `eq`. + # Not intended to be instantiated directly. + class Eq < BaseMatcher + # @api private + # @return [String] + def failure_message + "\nexpected: #{expected_formatted}\n got: #{actual_formatted}\n\n(compared using ==)\n" + end + + # @api private + # @return [String] + def failure_message_when_negated + "\nexpected: value != #{expected_formatted}\n got: #{actual_formatted}\n\n(compared using ==)\n" + end + + # @api private + # @return [String] + def description + "eq #{expected_formatted}" + end + + # @api private + # @return [Boolean] + def diffable? + true + end + + private + + def match(expected, actual) + actual == expected + end + end + end + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/rspec-expectations-3.11.0/lib/rspec/matchers/built_in/eql.rb b/vendor/bundle/ruby/3.1.0/gems/rspec-expectations-3.11.0/lib/rspec/matchers/built_in/eql.rb new file mode 100644 index 000000000..b1ec6fc4b --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/rspec-expectations-3.11.0/lib/rspec/matchers/built_in/eql.rb @@ -0,0 +1,34 @@ +module RSpec + module Matchers + module BuiltIn + # @api private + # Provides the implementation for `eql`. + # Not intended to be instantiated directly. + class Eql < BaseMatcher + # @api private + # @return [String] + def failure_message + "\nexpected: #{expected_formatted}\n got: #{actual_formatted}\n\n(compared using eql?)\n" + end + + # @api private + # @return [String] + def failure_message_when_negated + "\nexpected: value != #{expected_formatted}\n got: #{actual_formatted}\n\n(compared using eql?)\n" + end + + # @api private + # @return [Boolean] + def diffable? + true + end + + private + + def match(expected, actual) + actual.eql? expected + end + end + end + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/rspec-expectations-3.11.0/lib/rspec/matchers/built_in/equal.rb b/vendor/bundle/ruby/3.1.0/gems/rspec-expectations-3.11.0/lib/rspec/matchers/built_in/equal.rb new file mode 100644 index 000000000..bbab3ed16 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/rspec-expectations-3.11.0/lib/rspec/matchers/built_in/equal.rb @@ -0,0 +1,81 @@ +module RSpec + module Matchers + module BuiltIn + # @api private + # Provides the implementation for `equal`. + # Not intended to be instantiated directly. + class Equal < BaseMatcher + # @api private + # @return [String] + def failure_message + if expected_is_a_literal_singleton? + simple_failure_message + else + detailed_failure_message + end + end + + # @api private + # @return [String] + def failure_message_when_negated + <<-MESSAGE + +expected not #{inspect_object(actual)} + got #{inspect_object(expected)} + +Compared using equal?, which compares object identity. + +MESSAGE + end + + # @api private + # @return [Boolean] + def diffable? + !expected_is_a_literal_singleton? + end + + private + + def match(expected, actual) + actual.equal? expected + end + + LITERAL_SINGLETONS = [true, false, nil] + + def expected_is_a_literal_singleton? + LITERAL_SINGLETONS.include?(expected) + end + + def actual_inspected + if LITERAL_SINGLETONS.include?(actual) + actual_formatted + else + inspect_object(actual) + end + end + + def simple_failure_message + "\nexpected #{expected_formatted}\n got #{actual_inspected}\n" + end + + def detailed_failure_message + <<-MESSAGE + +expected #{inspect_object(expected)} + got #{inspect_object(actual)} + +Compared using equal?, which compares object identity, +but expected and actual are not the same object. Use +`expect(actual).to eq(expected)` if you don't care about +object identity in this example. + +MESSAGE + end + + def inspect_object(o) + "#<#{o.class}:#{o.object_id}> => #{RSpec::Support::ObjectFormatter.format(o)}" + end + end + end + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/rspec-expectations-3.11.0/lib/rspec/matchers/built_in/exist.rb b/vendor/bundle/ruby/3.1.0/gems/rspec-expectations-3.11.0/lib/rspec/matchers/built_in/exist.rb new file mode 100644 index 000000000..b36e16b03 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/rspec-expectations-3.11.0/lib/rspec/matchers/built_in/exist.rb @@ -0,0 +1,90 @@ +module RSpec + module Matchers + module BuiltIn + # @api private + # Provides the implementation for `exist`. + # Not intended to be instantiated directly. + class Exist < BaseMatcher + def initialize(*expected) + @expected = expected + end + + # @api private + # @return [Boolean] + def matches?(actual) + @actual = actual + @test = ExistenceTest.new @actual, @expected + @test.valid_test? && @test.actual_exists? + end + + # @api private + # @return [Boolean] + def does_not_match?(actual) + @actual = actual + @test = ExistenceTest.new @actual, @expected + @test.valid_test? && !@test.actual_exists? + end + + # @api private + # @return [String] + def failure_message + "expected #{actual_formatted} to exist#{@test.validity_message}" + end + + # @api private + # @return [String] + def failure_message_when_negated + "expected #{actual_formatted} not to exist#{@test.validity_message}" + end + + # @api private + # Simple class for memoizing actual/expected for this matcher + # and examining the match + class ExistenceTest < Struct.new(:actual, :expected) + # @api private + # @return [Boolean] + def valid_test? + uniq_truthy_values.size == 1 + end + + # @api private + # @return [Boolean] + def actual_exists? + existence_values.first + end + + # @api private + # @return [String] + def validity_message + case uniq_truthy_values.size + when 0 + " but it does not respond to either `exist?` or `exists?`" + when 2 + " but `exist?` and `exists?` returned different values:\n\n"\ + " exist?: #{existence_values.first}\n"\ + "exists?: #{existence_values.last}" + end + end + + private + + def uniq_truthy_values + @uniq_truthy_values ||= existence_values.map { |v| !!v }.uniq + end + + def existence_values + @existence_values ||= predicates.map { |p| actual.__send__(p, *expected) } + end + + def predicates + @predicates ||= [:exist?, :exists?].select { |p| actual.respond_to?(p) && !deprecated(p, actual) } + end + + def deprecated(predicate, actual) + predicate == :exists? && File == actual + end + end + end + end + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/rspec-expectations-3.11.0/lib/rspec/matchers/built_in/has.rb b/vendor/bundle/ruby/3.1.0/gems/rspec-expectations-3.11.0/lib/rspec/matchers/built_in/has.rb new file mode 100644 index 000000000..5036a6405 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/rspec-expectations-3.11.0/lib/rspec/matchers/built_in/has.rb @@ -0,0 +1,167 @@ +module RSpec + module Matchers + module BuiltIn + # @api private + # Provides the implementation for dynamic predicate matchers. + # Not intended to be inherited directly. + class DynamicPredicate < BaseMatcher + include BeHelpers + + def initialize(method_name, *args, &block) + @method_name, @args, @block = method_name, args, block + end + ruby2_keywords :initialize if respond_to?(:ruby2_keywords, true) + + # @private + def matches?(actual, &block) + @actual = actual + @block ||= block + predicate_accessible? && predicate_matches? + end + + # @private + def does_not_match?(actual, &block) + @actual = actual + @block ||= block + predicate_accessible? && predicate_matches?(false) + end + + # @api private + # @return [String] + def failure_message + failure_message_expecting(true) + end + + # @api private + # @return [String] + def failure_message_when_negated + failure_message_expecting(false) + end + + # @api private + # @return [String] + def description + "#{method_description}#{args_to_sentence}" + end + + private + + def predicate_accessible? + @actual.respond_to? predicate + end + + # support 1.8.7, evaluate once at load time for performance + if String === methods.first + # :nocov: + def private_predicate? + @actual.private_methods.include? predicate.to_s + end + # :nocov: + else + def private_predicate? + @actual.private_methods.include? predicate + end + end + + def predicate_result + @predicate_result = actual.__send__(predicate_method_name, *@args, &@block) + end + + def predicate_method_name + predicate + end + + def predicate_matches?(value=true) + if RSpec::Expectations.configuration.strict_predicate_matchers? + value == predicate_result + else + value == !!predicate_result + end + end + + def root + # On 1.9, there appears to be a bug where String#match can return `false` + # rather than the match data object. Changing to Regex#match appears to + # work around this bug. For an example of this bug, see: + # https://travis-ci.org/rspec/rspec-expectations/jobs/27549635 + self.class::REGEX.match(@method_name.to_s).captures.first + end + + def method_description + EnglishPhrasing.split_words(@method_name) + end + + def failure_message_expecting(value) + validity_message || + "expected `#{actual_formatted}.#{predicate}#{args_to_s}` to #{expectation_of value}, got #{description_of @predicate_result}" + end + + def expectation_of(value) + if RSpec::Expectations.configuration.strict_predicate_matchers? + "return #{value}" + elsif value + "be truthy" + else + "be falsey" + end + end + + def validity_message + return nil if predicate_accessible? + + "expected #{actual_formatted} to respond to `#{predicate}`#{failure_to_respond_explanation}" + end + + def failure_to_respond_explanation + if private_predicate? + " but `#{predicate}` is a private method" + end + end + end + + # @api private + # Provides the implementation for `has_`. + # Not intended to be instantiated directly. + class Has < DynamicPredicate + # :nodoc: + REGEX = Matchers::HAS_REGEX + private + def predicate + @predicate ||= :"has_#{root}?" + end + end + + # @api private + # Provides the implementation of `be_`. + # Not intended to be instantiated directly. + class BePredicate < DynamicPredicate + # :nodoc: + REGEX = Matchers::BE_PREDICATE_REGEX + private + def predicate + @predicate ||= :"#{root}?" + end + + def predicate_method_name + actual.respond_to?(predicate) ? predicate : present_tense_predicate + end + + def failure_to_respond_explanation + super || if predicate == :true? + " or perhaps you meant `be true` or `be_truthy`" + elsif predicate == :false? + " or perhaps you meant `be false` or `be_falsey`" + end + end + + def predicate_accessible? + super || actual.respond_to?(present_tense_predicate) + end + + def present_tense_predicate + :"#{root}s?" + end + end + end + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/rspec-expectations-3.11.0/lib/rspec/matchers/built_in/have_attributes.rb b/vendor/bundle/ruby/3.1.0/gems/rspec-expectations-3.11.0/lib/rspec/matchers/built_in/have_attributes.rb new file mode 100644 index 000000000..89be3f2e3 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/rspec-expectations-3.11.0/lib/rspec/matchers/built_in/have_attributes.rb @@ -0,0 +1,114 @@ +module RSpec + module Matchers + module BuiltIn + # @api private + # Provides the implementation for `have_attributes`. + # Not intended to be instantiated directly. + class HaveAttributes < BaseMatcher + # @private + attr_reader :respond_to_failed + + def initialize(expected) + @expected = expected + @values = {} + @respond_to_failed = false + @negated = false + end + + # @private + def actual + @values + end + + # @api private + # @return [Boolean] + def matches?(actual) + @actual = actual + @negated = false + return false unless respond_to_attributes? + perform_match(:all?) + end + + # @api private + # @return [Boolean] + def does_not_match?(actual) + @actual = actual + @negated = true + return false unless respond_to_attributes? + perform_match(:none?) + end + + # @api private + # @return [String] + def description + described_items = surface_descriptions_in(expected) + improve_hash_formatting "have attributes #{RSpec::Support::ObjectFormatter.format(described_items)}" + end + + # @api private + # @return [Boolean] + def diffable? + !@respond_to_failed && !@negated + end + + # @api private + # @return [String] + def failure_message + respond_to_failure_message_or do + "expected #{actual_formatted} to #{description} but had attributes #{ formatted_values }" + end + end + + # @api private + # @return [String] + def failure_message_when_negated + respond_to_failure_message_or { "expected #{actual_formatted} not to #{description}" } + end + + private + + def cache_all_values + @values = {} + expected.each do |attribute_key, _attribute_value| + actual_value = @actual.__send__(attribute_key) + @values[attribute_key] = actual_value + end + end + + def perform_match(predicate) + cache_all_values + expected.__send__(predicate) do |attribute_key, attribute_value| + actual_has_attribute?(attribute_key, attribute_value) + end + end + + def actual_has_attribute?(attribute_key, attribute_value) + values_match?(attribute_value, @values.fetch(attribute_key)) + end + + def respond_to_attributes? + matches = respond_to_matcher.matches?(@actual) + @respond_to_failed = !matches + matches + end + + def respond_to_matcher + @respond_to_matcher ||= RespondTo.new(*expected.keys).with(0).arguments.tap { |m| m.ignoring_method_signature_failure! } + end + + def respond_to_failure_message_or + if respond_to_failed + respond_to_matcher.failure_message + else + improve_hash_formatting(yield) + end + end + + def formatted_values + values = RSpec::Support::ObjectFormatter.format(@values) + improve_hash_formatting(values) + end + end + end + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/rspec-expectations-3.11.0/lib/rspec/matchers/built_in/include.rb b/vendor/bundle/ruby/3.1.0/gems/rspec-expectations-3.11.0/lib/rspec/matchers/built_in/include.rb new file mode 100644 index 000000000..424755af8 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/rspec-expectations-3.11.0/lib/rspec/matchers/built_in/include.rb @@ -0,0 +1,206 @@ +require 'rspec/matchers/built_in/count_expectation' + +module RSpec + module Matchers + module BuiltIn + # @api private + # Provides the implementation for `include`. + # Not intended to be instantiated directly. + class Include < BaseMatcher # rubocop:disable Metrics/ClassLength + include CountExpectation + # @private + attr_reader :expecteds + + # @api private + def initialize(*expecteds) + @expecteds = expecteds + end + + # @api private + # @return [Boolean] + def matches?(actual) + check_actual?(actual) && + if check_expected_count? + expected_count_matches?(count_inclusions) + else + perform_match { |v| v } + end + end + + # @api private + # @return [Boolean] + def does_not_match?(actual) + check_actual?(actual) && + if check_expected_count? + !expected_count_matches?(count_inclusions) + else + perform_match { |v| !v } + end + end + + # @api private + # @return [String] + def description + improve_hash_formatting("include#{readable_list_of(expecteds)}#{count_expectation_description}") + end + + # @api private + # @return [String] + def failure_message + format_failure_message("to") { super } + end + + # @api private + # @return [String] + def failure_message_when_negated + format_failure_message("not to") { super } + end + + # @api private + # @return [Boolean] + def diffable? + !diff_would_wrongly_highlight_matched_item? + end + + # @api private + # @return [Array, Hash] + def expected + if expecteds.one? && Hash === expecteds.first + expecteds.first + else + expecteds + end + end + + private + + def check_actual?(actual) + actual = actual.to_hash if convert_to_hash?(actual) + @actual = actual + @actual.respond_to?(:include?) + end + + def check_expected_count? + case + when !has_expected_count? + return false + when expecteds.size != 1 + raise NotImplementedError, 'Count constraint supported only when testing for a single value being included' + when actual.is_a?(Hash) + raise NotImplementedError, 'Count constraint on hash keys not implemented' + end + true + end + + def format_failure_message(preposition) + msg = if actual.respond_to?(:include?) + "expected #{description_of @actual} #{preposition}" \ + " include#{readable_list_of @divergent_items}" \ + "#{count_failure_reason('it is included') if has_expected_count?}" + else + "#{yield}, but it does not respond to `include?`" + end + improve_hash_formatting(msg) + end + + def readable_list_of(items) + described_items = surface_descriptions_in(items) + if described_items.all? { |item| item.is_a?(Hash) } + " #{described_items.inject(:merge).inspect}" + else + EnglishPhrasing.list(described_items) + end + end + + def perform_match(&block) + @divergent_items = excluded_from_actual(&block) + @divergent_items.empty? + end + + def excluded_from_actual + return [] unless @actual.respond_to?(:include?) + + expecteds.inject([]) do |memo, expected_item| + if comparing_hash_to_a_subset?(expected_item) + expected_item.each do |(key, value)| + memo << { key => value } unless yield actual_hash_includes?(key, value) + end + elsif comparing_hash_keys?(expected_item) + memo << expected_item unless yield actual_hash_has_key?(expected_item) + else + memo << expected_item unless yield actual_collection_includes?(expected_item) + end + memo + end + end + + def comparing_hash_to_a_subset?(expected_item) + actual.is_a?(Hash) && expected_item.is_a?(Hash) + end + + def actual_hash_includes?(expected_key, expected_value) + actual_value = + actual.fetch(expected_key) do + actual.find(Proc.new { return false }) { |actual_key, _| values_match?(expected_key, actual_key) }[1] + end + values_match?(expected_value, actual_value) + end + + def comparing_hash_keys?(expected_item) + actual.is_a?(Hash) && !expected_item.is_a?(Hash) + end + + def actual_hash_has_key?(expected_key) + # We check `key?` first for perf: + # `key?` is O(1), but `any?` is O(N). + actual.key?(expected_key) || + actual.keys.any? { |key| values_match?(expected_key, key) } + end + + def actual_collection_includes?(expected_item) + return true if actual.include?(expected_item) + + # String lacks an `any?` method... + return false unless actual.respond_to?(:any?) + + actual.any? { |value| values_match?(expected_item, value) } + end + + if RUBY_VERSION < '1.9' + def count_enumerable(expected_item) + actual.select { |value| values_match?(expected_item, value) }.size + end + else + def count_enumerable(expected_item) + actual.count { |value| values_match?(expected_item, value) } + end + end + + def count_inclusions + @divergent_items = expected + case actual + when String + actual.scan(expected.first).length + when Enumerable + count_enumerable(Hash === expected ? expected : expected.first) + else + raise NotImplementedError, 'Count constraints are implemented for Enumerable and String values only' + end + end + + def diff_would_wrongly_highlight_matched_item? + return false unless actual.is_a?(String) && expected.is_a?(Array) + + lines = actual.split("\n") + expected.any? do |str| + actual.include?(str) && lines.none? { |line| line == str } + end + end + + def convert_to_hash?(obj) + !obj.respond_to?(:include?) && obj.respond_to?(:to_hash) + end + end + end + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/rspec-expectations-3.11.0/lib/rspec/matchers/built_in/match.rb b/vendor/bundle/ruby/3.1.0/gems/rspec-expectations-3.11.0/lib/rspec/matchers/built_in/match.rb new file mode 100644 index 000000000..9ed4b068c --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/rspec-expectations-3.11.0/lib/rspec/matchers/built_in/match.rb @@ -0,0 +1,106 @@ +module RSpec + module Matchers + module BuiltIn + # @api private + # Provides the implementation for `match`. + # Not intended to be instantiated directly. + class Match < BaseMatcher + def initialize(expected) + super(expected) + + @expected_captures = nil + end + # @api private + # @return [String] + def description + if @expected_captures && @expected.match(actual) + "match #{surface_descriptions_in(expected).inspect} with captures #{surface_descriptions_in(@expected_captures).inspect}" + else + "match #{surface_descriptions_in(expected).inspect}" + end + end + + # @api private + # @return [Boolean] + def diffable? + true + end + + # Used to specify the captures we match against + # @return [self] + def with_captures(*captures) + @expected_captures = captures + self + end + + private + + def match(expected, actual) + return match_captures(expected, actual) if @expected_captures + return true if values_match?(expected, actual) + return false unless can_safely_call_match?(expected, actual) + actual.match(expected) + end + + def can_safely_call_match?(expected, actual) + return false unless actual.respond_to?(:match) + + !(RSpec::Matchers.is_a_matcher?(expected) && + (String === actual || Regexp === actual)) + end + + def match_captures(expected, actual) + match = actual.match(expected) + if match + match = ReliableMatchData.new(match) + if match.names.empty? + values_match?(@expected_captures, match.captures) + else + expected_matcher = @expected_captures.last + values_match?(expected_matcher, Hash[match.names.zip(match.captures)]) || + values_match?(expected_matcher, Hash[match.names.map(&:to_sym).zip(match.captures)]) || + values_match?(@expected_captures, match.captures) + end + else + false + end + end + end + + # @api private + # Used to wrap match data and make it reliable for 1.8.7 + class ReliableMatchData + def initialize(match_data) + @match_data = match_data + end + + if RUBY_VERSION == "1.8.7" + # @api private + # Returns match data names for named captures + # @return Array + def names + [] + end + else + # @api private + # Returns match data names for named captures + # @return Array + def names + match_data.names + end + end + + # @api private + # returns an array of captures from the match data + # @return Array + def captures + match_data.captures + end + + protected + + attr_reader :match_data + end + end + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/rspec-expectations-3.11.0/lib/rspec/matchers/built_in/operators.rb b/vendor/bundle/ruby/3.1.0/gems/rspec-expectations-3.11.0/lib/rspec/matchers/built_in/operators.rb new file mode 100644 index 000000000..64f8f3b23 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/rspec-expectations-3.11.0/lib/rspec/matchers/built_in/operators.rb @@ -0,0 +1,128 @@ +require 'rspec/support' + +module RSpec + module Matchers + module BuiltIn + # @api private + # Provides the implementation for operator matchers. + # Not intended to be instantiated directly. + # Only available for use with `should`. + class OperatorMatcher + class << self + # @private + def registry + @registry ||= {} + end + + # @private + def register(klass, operator, matcher) + registry[klass] ||= {} + registry[klass][operator] = matcher + end + + # @private + def unregister(klass, operator) + registry[klass] && registry[klass].delete(operator) + end + + # @private + def get(klass, operator) + klass.ancestors.each do |ancestor| + matcher = registry[ancestor] && registry[ancestor][operator] + return matcher if matcher + end + + nil + end + end + + register Enumerable, '=~', BuiltIn::ContainExactly + + def initialize(actual) + @actual = actual + end + + # @private + def self.use_custom_matcher_or_delegate(operator) + define_method(operator) do |expected| + if !has_non_generic_implementation_of?(operator) && (matcher = OperatorMatcher.get(@actual.class, operator)) + @actual.__send__(::RSpec::Matchers.last_expectation_handler.should_method, matcher.new(expected)) + else + eval_match(@actual, operator, expected) + end + end + + negative_operator = operator.sub(/^=/, '!') + if negative_operator != operator && respond_to?(negative_operator) + define_method(negative_operator) do |_expected| + opposite_should = ::RSpec::Matchers.last_expectation_handler.opposite_should_method + raise "RSpec does not support `#{::RSpec::Matchers.last_expectation_handler.should_method} #{negative_operator} expected`. " \ + "Use `#{opposite_should} #{operator} expected` instead." + end + end + end + + ['==', '===', '=~', '>', '>=', '<', '<='].each do |operator| + use_custom_matcher_or_delegate operator + end + + # @private + def fail_with_message(message) + RSpec::Expectations.fail_with(message, @expected, @actual) + end + + # @api private + # @return [String] + def description + "#{@operator} #{RSpec::Support::ObjectFormatter.format(@expected)}" + end + + private + + def has_non_generic_implementation_of?(op) + Support.method_handle_for(@actual, op).owner != ::Kernel + rescue NameError + false + end + + def eval_match(actual, operator, expected) + ::RSpec::Matchers.last_matcher = self + @operator, @expected = operator, expected + __delegate_operator(actual, operator, expected) + end + end + + # @private + # Handles operator matcher for `should`. + class PositiveOperatorMatcher < OperatorMatcher + def __delegate_operator(actual, operator, expected) + if actual.__send__(operator, expected) + true + else + expected_formatted = RSpec::Support::ObjectFormatter.format(expected) + actual_formatted = RSpec::Support::ObjectFormatter.format(actual) + + if ['==', '===', '=~'].include?(operator) + fail_with_message("expected: #{expected_formatted}\n got: #{actual_formatted} (using #{operator})") + else + fail_with_message("expected: #{operator} #{expected_formatted}\n got: #{operator.gsub(/./, ' ')} #{actual_formatted}") + end + end + end + end + + # @private + # Handles operator matcher for `should_not`. + class NegativeOperatorMatcher < OperatorMatcher + def __delegate_operator(actual, operator, expected) + return false unless actual.__send__(operator, expected) + + expected_formatted = RSpec::Support::ObjectFormatter.format(expected) + actual_formatted = RSpec::Support::ObjectFormatter.format(actual) + + fail_with_message("expected not: #{operator} #{expected_formatted}\n got: #{operator.gsub(/./, ' ')} #{actual_formatted}") + end + end + end + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/rspec-expectations-3.11.0/lib/rspec/matchers/built_in/output.rb b/vendor/bundle/ruby/3.1.0/gems/rspec-expectations-3.11.0/lib/rspec/matchers/built_in/output.rb new file mode 100644 index 000000000..8c3cceda1 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/rspec-expectations-3.11.0/lib/rspec/matchers/built_in/output.rb @@ -0,0 +1,207 @@ +require 'stringio' + +module RSpec + module Matchers + module BuiltIn + # @api private + # Provides the implementation for `output`. + # Not intended to be instantiated directly. + class Output < BaseMatcher + def initialize(expected) + @expected = expected + @actual = "" + @block = nil + @stream_capturer = NullCapture + end + + def matches?(block) + @block = block + return false unless Proc === block + @actual = @stream_capturer.capture(block) + @expected ? values_match?(@expected, @actual) : captured? + end + + def does_not_match?(block) + !matches?(block) && Proc === block + end + + # @api public + # Tells the matcher to match against stdout. + # Works only when the main Ruby process prints to stdout + def to_stdout + @stream_capturer = CaptureStdout + self + end + + # @api public + # Tells the matcher to match against stderr. + # Works only when the main Ruby process prints to stderr + def to_stderr + @stream_capturer = CaptureStderr + self + end + + # @api public + # Tells the matcher to match against stdout. + # Works when subprocesses print to stdout as well. + # This is significantly (~30x) slower than `to_stdout` + def to_stdout_from_any_process + @stream_capturer = CaptureStreamToTempfile.new("stdout", $stdout) + self + end + + # @api public + # Tells the matcher to match against stderr. + # Works when subprocesses print to stderr as well. + # This is significantly (~30x) slower than `to_stderr` + def to_stderr_from_any_process + @stream_capturer = CaptureStreamToTempfile.new("stderr", $stderr) + self + end + + # @api private + # @return [String] + def failure_message + "expected block to #{description}, but #{positive_failure_reason}" + end + + # @api private + # @return [String] + def failure_message_when_negated + "expected block to not #{description}, but #{negative_failure_reason}" + end + + # @api private + # @return [String] + def description + if @expected + "output #{description_of @expected} to #{@stream_capturer.name}" + else + "output to #{@stream_capturer.name}" + end + end + + # @api private + # @return [Boolean] + def diffable? + true + end + + # @api private + # Indicates this matcher matches against a block. + # @return [True] + def supports_block_expectations? + true + end + + # @api private + # Indicates this matcher matches against a block only. + # @return [False] + def supports_value_expectations? + false + end + + private + + def captured? + @actual.length > 0 + end + + def positive_failure_reason + return "was not a block" unless Proc === @block + return "output #{actual_output_description}" if @expected + "did not" + end + + def negative_failure_reason + return "was not a block" unless Proc === @block + "output #{actual_output_description}" + end + + def actual_output_description + return "nothing" unless captured? + actual_formatted + end + end + + # @private + module NullCapture + def self.name + "some stream" + end + + def self.capture(_block) + raise "You must chain `to_stdout` or `to_stderr` off of the `output(...)` matcher." + end + end + + # @private + module CaptureStdout + def self.name + 'stdout' + end + + def self.capture(block) + captured_stream = StringIO.new + + original_stream = $stdout + $stdout = captured_stream + + block.call + + captured_stream.string + ensure + $stdout = original_stream + end + end + + # @private + module CaptureStderr + def self.name + 'stderr' + end + + def self.capture(block) + captured_stream = StringIO.new + + original_stream = $stderr + $stderr = captured_stream + + block.call + + captured_stream.string + ensure + $stderr = original_stream + end + end + + # @private + class CaptureStreamToTempfile < Struct.new(:name, :stream) + def capture(block) + # We delay loading tempfile until it is actually needed because + # we want to minimize stdlibs loaded so that users who use a + # portion of the stdlib can't have passing specs while forgetting + # to load it themselves. `CaptureStreamToTempfile` is rarely used + # and `tempfile` pulls in a bunch of things (delegate, tmpdir, + # thread, fileutils, etc), so it's worth delaying it until this point. + require 'tempfile' + + original_stream = stream.clone + captured_stream = Tempfile.new(name) + + begin + captured_stream.sync = true + stream.reopen(captured_stream) + block.call + captured_stream.rewind + captured_stream.read + ensure + stream.reopen(original_stream) + captured_stream.close + captured_stream.unlink + end + end + end + end + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/rspec-expectations-3.11.0/lib/rspec/matchers/built_in/raise_error.rb b/vendor/bundle/ruby/3.1.0/gems/rspec-expectations-3.11.0/lib/rspec/matchers/built_in/raise_error.rb new file mode 100644 index 000000000..dd870b73c --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/rspec-expectations-3.11.0/lib/rspec/matchers/built_in/raise_error.rb @@ -0,0 +1,271 @@ +module RSpec + module Matchers + module BuiltIn + # @api private + # Provides the implementation for `raise_error`. + # Not intended to be instantiated directly. + # rubocop:disable ClassLength + # rubocop:disable RescueException + class RaiseError + include Composable + + # Used as a sentinel value to be able to tell when the user did not pass an + # argument. We can't use `nil` for that because we need to warn when `nil` is + # passed in a different way. It's an Object, not a Module, since Module's `===` + # does not evaluate to true when compared to itself. + UndefinedValue = Object.new.freeze + + def initialize(expected_error_or_message, expected_message, &block) + @block = block + @actual_error = nil + @warn_about_bare_error = UndefinedValue === expected_error_or_message + @warn_about_nil_error = expected_error_or_message.nil? + + case expected_error_or_message + when nil, UndefinedValue + @expected_error = Exception + @expected_message = expected_message + when String + @expected_error = Exception + @expected_message = expected_error_or_message + else + @expected_error = expected_error_or_message + @expected_message = expected_message + end + end + + # @api public + # Specifies the expected error message. + def with_message(expected_message) + raise_message_already_set if @expected_message + @warn_about_bare_error = false + @expected_message = expected_message + self + end + + # rubocop:disable MethodLength + # @private + def matches?(given_proc, negative_expectation=false, &block) + @given_proc = given_proc + @block ||= block + @raised_expected_error = false + @with_expected_message = false + @eval_block = false + @eval_block_passed = false + + return false unless Proc === given_proc + + begin + given_proc.call + rescue Exception => @actual_error + if values_match?(@expected_error, @actual_error) || + values_match?(@expected_error, actual_error_message) + @raised_expected_error = true + @with_expected_message = verify_message + end + end + + unless negative_expectation + warn_about_bare_error! if warn_about_bare_error? + warn_about_nil_error! if warn_about_nil_error? + eval_block if ready_to_eval_block? + end + + expectation_matched? + end + # rubocop:enable MethodLength + + # @private + def does_not_match?(given_proc) + warn_for_negative_false_positives! + !matches?(given_proc, :negative_expectation) && Proc === given_proc + end + + # @private + def supports_block_expectations? + true + end + + # @private + def supports_value_expectations? + false + end + + # @private + def expects_call_stack_jump? + true + end + + # @api private + # @return [String] + def failure_message + @eval_block ? actual_error_message : "expected #{expected_error}#{given_error}" + end + + # @api private + # @return [String] + def failure_message_when_negated + "expected no #{expected_error}#{given_error}" + end + + # @api private + # @return [String] + def description + "raise #{expected_error}" + end + + private + + def actual_error_message + return nil unless @actual_error + + @actual_error.respond_to?(:original_message) ? @actual_error.original_message : @actual_error.message + end + + def expectation_matched? + error_and_message_match? && block_matches? + end + + def error_and_message_match? + @raised_expected_error && @with_expected_message + end + + def block_matches? + @eval_block ? @eval_block_passed : true + end + + def ready_to_eval_block? + @raised_expected_error && @with_expected_message && @block + end + + def eval_block + @eval_block = true + begin + @block[@actual_error] + @eval_block_passed = true + rescue Exception => err + @actual_error = err + end + end + + def verify_message + return true if @expected_message.nil? + values_match?(@expected_message, actual_error_message.to_s) + end + + def warn_for_negative_false_positives! + expression = if expecting_specific_exception? && @expected_message + "`expect { }.not_to raise_error(SpecificErrorClass, message)`" + elsif expecting_specific_exception? + "`expect { }.not_to raise_error(SpecificErrorClass)`" + elsif @expected_message + "`expect { }.not_to raise_error(message)`" + elsif @warn_about_nil_error + "`expect { }.not_to raise_error(nil)`" + end + + return unless expression + + warn_about_negative_false_positive! expression + end + + def handle_warning(message) + RSpec::Expectations.configuration.false_positives_handler.call(message) + end + + def warn_about_bare_error? + @warn_about_bare_error && @block.nil? + end + + def warn_about_nil_error? + @warn_about_nil_error + end + + def warn_about_bare_error! + handle_warning("Using the `raise_error` matcher without providing a specific " \ + "error or message risks false positives, since `raise_error` " \ + "will match when Ruby raises a `NoMethodError`, `NameError` or " \ + "`ArgumentError`, potentially allowing the expectation to pass " \ + "without even executing the method you are intending to call. " \ + "#{warning}"\ + "Instead consider providing a specific error class or message. " \ + "This message can be suppressed by setting: " \ + "`RSpec::Expectations.configuration.on_potential_false" \ + "_positives = :nothing`") + end + + def warn_about_nil_error! + handle_warning("Using the `raise_error` matcher with a `nil` error is probably " \ + "unintentional, it risks false positives, since `raise_error` " \ + "will match when Ruby raises a `NoMethodError`, `NameError` or " \ + "`ArgumentError`, potentially allowing the expectation to pass " \ + "without even executing the method you are intending to call. " \ + "#{warning}"\ + "Instead consider providing a specific error class or message. " \ + "This message can be suppressed by setting: " \ + "`RSpec::Expectations.configuration.on_potential_false" \ + "_positives = :nothing`") + end + + def warn_about_negative_false_positive!(expression) + handle_warning("Using #{expression} risks false positives, since literally " \ + "any other error would cause the expectation to pass, " \ + "including those raised by Ruby (e.g. `NoMethodError`, `NameError` " \ + "and `ArgumentError`), meaning the code you are intending to test " \ + "may not even get reached. Instead consider using " \ + "`expect { }.not_to raise_error` or `expect { }.to raise_error" \ + "(DifferentSpecificErrorClass)`. This message can be suppressed by " \ + "setting: `RSpec::Expectations.configuration.on_potential_false" \ + "_positives = :nothing`") + end + + def expected_error + case @expected_message + when nil + if RSpec::Support.is_a_matcher?(@expected_error) + "Exception with #{description_of(@expected_error)}" + else + description_of(@expected_error) + end + when Regexp + "#{@expected_error} with message matching #{description_of(@expected_message)}" + else + "#{@expected_error} with #{description_of(@expected_message)}" + end + end + + def format_backtrace(backtrace) + formatter = Matchers.configuration.backtrace_formatter + formatter.format_backtrace(backtrace) + end + + def given_error + return " but was not given a block" unless Proc === @given_proc + return " but nothing was raised" unless @actual_error + + backtrace = format_backtrace(@actual_error.backtrace) + [ + ", got #{description_of(@actual_error)} with backtrace:", + *backtrace + ].join("\n # ") + end + + def expecting_specific_exception? + @expected_error != Exception + end + + def raise_message_already_set + raise "`expect { }.to raise_error(message).with_message(message)` is not valid. " \ + 'The matcher only allows the expected message to be specified once' + end + + def warning + warning = "Actual error raised was #{description_of(@actual_error)}. " + warning if @actual_error + end + end + # rubocop:enable RescueException + # rubocop:enable ClassLength + end + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/rspec-expectations-3.11.0/lib/rspec/matchers/built_in/respond_to.rb b/vendor/bundle/ruby/3.1.0/gems/rspec-expectations-3.11.0/lib/rspec/matchers/built_in/respond_to.rb new file mode 100644 index 000000000..9adbe04ea --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/rspec-expectations-3.11.0/lib/rspec/matchers/built_in/respond_to.rb @@ -0,0 +1,200 @@ +RSpec::Support.require_rspec_support "method_signature_verifier" + +module RSpec + module Matchers + module BuiltIn + # @api private + # Provides the implementation for `respond_to`. + # Not intended to be instantiated directly. + class RespondTo < BaseMatcher + def initialize(*names) + @names = names + @expected_arity = nil + @expected_keywords = [] + @ignoring_method_signature_failure = false + @unlimited_arguments = nil + @arbitrary_keywords = nil + end + + # @api public + # Specifies the number of expected arguments. + # + # @example + # expect(obj).to respond_to(:message).with(3).arguments + def with(n) + @expected_arity = n + self + end + + # @api public + # Specifies keyword arguments, if any. + # + # @example + # expect(obj).to respond_to(:message).with_keywords(:color, :shape) + # @example with an expected number of arguments + # expect(obj).to respond_to(:message).with(3).arguments.and_keywords(:color, :shape) + def with_keywords(*keywords) + @expected_keywords = keywords + self + end + alias :and_keywords :with_keywords + + # @api public + # Specifies that the method accepts any keyword, i.e. the method has + # a splatted keyword parameter of the form **kw_args. + # + # @example + # expect(obj).to respond_to(:message).with_any_keywords + def with_any_keywords + @arbitrary_keywords = true + self + end + alias :and_any_keywords :with_any_keywords + + # @api public + # Specifies that the number of arguments has no upper limit, i.e. the + # method has a splatted parameter of the form *args. + # + # @example + # expect(obj).to respond_to(:message).with_unlimited_arguments + def with_unlimited_arguments + @unlimited_arguments = true + self + end + alias :and_unlimited_arguments :with_unlimited_arguments + + # @api public + # No-op. Intended to be used as syntactic sugar when using `with`. + # + # @example + # expect(obj).to respond_to(:message).with(3).arguments + def argument + self + end + alias :arguments :argument + + # @private + def matches?(actual) + find_failing_method_names(actual, :reject).empty? + end + + # @private + def does_not_match?(actual) + find_failing_method_names(actual, :select).empty? + end + + # @api private + # @return [String] + def failure_message + "expected #{actual_formatted} to respond to #{@failing_method_names.map { |name| description_of(name) }.join(', ')}#{with_arity}" + end + + # @api private + # @return [String] + def failure_message_when_negated + failure_message.sub(/to respond to/, 'not to respond to') + end + + # @api private + # @return [String] + def description + "respond to #{pp_names}#{with_arity}" + end + + # @api private + # Used by other matchers to suppress a check + def ignoring_method_signature_failure! + @ignoring_method_signature_failure = true + end + + private + + def find_failing_method_names(actual, filter_method) + @actual = actual + @failing_method_names = @names.__send__(filter_method) do |name| + @actual.respond_to?(name) && matches_arity?(actual, name) + end + end + + def matches_arity?(actual, name) + ArityCheck.new(@expected_arity, @expected_keywords, @arbitrary_keywords, @unlimited_arguments).matches?(actual, name) + rescue NameError + return true if @ignoring_method_signature_failure + raise ArgumentError, "The #{matcher_name} matcher requires that " \ + "the actual object define the method(s) in " \ + "order to check arity, but the method " \ + "`#{name}` is not defined. Remove the arity " \ + "check or define the method to continue." + end + + def with_arity + str = ''.dup + str << " with #{with_arity_string}" if @expected_arity + str << " #{str.length == 0 ? 'with' : 'and'} #{with_keywords_string}" if @expected_keywords && @expected_keywords.count > 0 + str << " #{str.length == 0 ? 'with' : 'and'} unlimited arguments" if @unlimited_arguments + str << " #{str.length == 0 ? 'with' : 'and'} any keywords" if @arbitrary_keywords + str + end + + def with_arity_string + "#{@expected_arity} argument#{@expected_arity == 1 ? '' : 's'}" + end + + def with_keywords_string + kw_str = case @expected_keywords.count + when 1 + @expected_keywords.first.inspect + when 2 + @expected_keywords.map(&:inspect).join(' and ') + else + "#{@expected_keywords[0...-1].map(&:inspect).join(', ')}, and #{@expected_keywords.last.inspect}" + end + + "keyword#{@expected_keywords.count == 1 ? '' : 's'} #{kw_str}" + end + + def pp_names + @names.length == 1 ? "##{@names.first}" : description_of(@names) + end + + # @private + class ArityCheck + def initialize(expected_arity, expected_keywords, arbitrary_keywords, unlimited_arguments) + expectation = Support::MethodSignatureExpectation.new + + if expected_arity.is_a?(Range) + expectation.min_count = expected_arity.min + expectation.max_count = expected_arity.max + else + expectation.min_count = expected_arity + end + + expectation.keywords = expected_keywords + expectation.expect_unlimited_arguments = unlimited_arguments + expectation.expect_arbitrary_keywords = arbitrary_keywords + @expectation = expectation + end + + def matches?(actual, name) + return true if @expectation.empty? + verifier_for(actual, name).with_expectation(@expectation).valid? + end + + def verifier_for(actual, name) + Support::StrictSignatureVerifier.new(method_signature_for(actual, name)) + end + + def method_signature_for(actual, name) + method_handle = Support.method_handle_for(actual, name) + + if name == :new && method_handle.owner === ::Class && ::Class === actual + Support::MethodSignature.new(actual.instance_method(:initialize)) + else + Support::MethodSignature.new(method_handle) + end + end + end + end + end + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/rspec-expectations-3.11.0/lib/rspec/matchers/built_in/satisfy.rb b/vendor/bundle/ruby/3.1.0/gems/rspec-expectations-3.11.0/lib/rspec/matchers/built_in/satisfy.rb new file mode 100644 index 000000000..cdb34d53c --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/rspec-expectations-3.11.0/lib/rspec/matchers/built_in/satisfy.rb @@ -0,0 +1,60 @@ +module RSpec + module Matchers + module BuiltIn + # @api private + # Provides the implementation for `satisfy`. + # Not intended to be instantiated directly. + class Satisfy < BaseMatcher + def initialize(description=nil, &block) + @description = description + @block = block + end + + # @private + def matches?(actual, &block) + @block = block if block + @actual = actual + @block.call(actual) + end + + # @private + def description + @description ||= "satisfy #{block_representation}" + end + + # @api private + # @return [String] + def failure_message + "expected #{actual_formatted} to #{description}" + end + + # @api private + # @return [String] + def failure_message_when_negated + "expected #{actual_formatted} not to #{description}" + end + + private + + if RSpec::Support::RubyFeatures.ripper_supported? + def block_representation + if (block_snippet = extract_block_snippet) + "expression `#{block_snippet}`" + else + 'block' + end + end + + def extract_block_snippet + return nil unless @block + Expectations::BlockSnippetExtractor.try_extracting_single_line_body_of(@block, matcher_name) + end + else + def block_representation + 'block' + end + end + end + end + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/rspec-expectations-3.11.0/lib/rspec/matchers/built_in/start_or_end_with.rb b/vendor/bundle/ruby/3.1.0/gems/rspec-expectations-3.11.0/lib/rspec/matchers/built_in/start_or_end_with.rb new file mode 100644 index 000000000..81f06c288 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/rspec-expectations-3.11.0/lib/rspec/matchers/built_in/start_or_end_with.rb @@ -0,0 +1,94 @@ +module RSpec + module Matchers + module BuiltIn + # @api private + # Base class for the `end_with` and `start_with` matchers. + # Not intended to be instantiated directly. + class StartOrEndWith < BaseMatcher + def initialize(*expected) + @actual_does_not_have_ordered_elements = false + @expected = expected.length == 1 ? expected.first : expected + end + + # @api private + # @return [String] + def failure_message + super.tap do |msg| + if @actual_does_not_have_ordered_elements + msg << ", but it does not have ordered elements" + elsif !actual.respond_to?(:[]) + msg << ", but it cannot be indexed using #[]" + end + end + end + + # @api private + # @return [String] + def description + return super unless Hash === expected + english_name = EnglishPhrasing.split_words(self.class.matcher_name) + description_of_expected = surface_descriptions_in(expected).inspect + "#{english_name} #{description_of_expected}" + end + + private + + def match(_expected, actual) + return false unless actual.respond_to?(:[]) + + begin + return true if subsets_comparable? && subset_matches? + element_matches? + rescue ArgumentError + @actual_does_not_have_ordered_elements = true + return false + end + end + + def subsets_comparable? + # Structs support the Enumerable interface but don't really have + # the semantics of a subset of a larger set... + return false if Struct === expected + + expected.respond_to?(:length) + end + end + + # For RSpec 3.1, the base class was named `StartAndEndWith`. For SemVer reasons, + # we still provide this constant until 4.0. + # @deprecated Use StartOrEndWith instead. + # @private + StartAndEndWith = StartOrEndWith + + # @api private + # Provides the implementation for `start_with`. + # Not intended to be instantiated directly. + class StartWith < StartOrEndWith + private + + def subset_matches? + values_match?(expected, actual[0, expected.length]) + end + + def element_matches? + values_match?(expected, actual[0]) + end + end + + # @api private + # Provides the implementation for `end_with`. + # Not intended to be instantiated directly. + class EndWith < StartOrEndWith + private + + def subset_matches? + values_match?(expected, actual[-expected.length, expected.length]) + end + + def element_matches? + values_match?(expected, actual[-1]) + end + end + end + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/rspec-expectations-3.11.0/lib/rspec/matchers/built_in/throw_symbol.rb b/vendor/bundle/ruby/3.1.0/gems/rspec-expectations-3.11.0/lib/rspec/matchers/built_in/throw_symbol.rb new file mode 100644 index 000000000..bfa4648f5 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/rspec-expectations-3.11.0/lib/rspec/matchers/built_in/throw_symbol.rb @@ -0,0 +1,138 @@ +module RSpec + module Matchers + module BuiltIn + # @api private + # Provides the implementation for `throw_symbol`. + # Not intended to be instantiated directly. + class ThrowSymbol + include Composable + + def initialize(expected_symbol=nil, expected_arg=nil) + @expected_symbol = expected_symbol + @expected_arg = expected_arg + @caught_symbol = @caught_arg = nil + end + + # rubocop:disable MethodLength + # @private + def matches?(given_proc) + @block = given_proc + return false unless Proc === given_proc + + begin + if @expected_symbol.nil? + given_proc.call + else + @caught_arg = catch :proc_did_not_throw_anything do + catch @expected_symbol do + given_proc.call + throw :proc_did_not_throw_anything, :nothing_thrown + end + end + + if @caught_arg == :nothing_thrown + @caught_arg = nil + else + @caught_symbol = @expected_symbol + end + end + + # Ruby 1.8 uses NameError with `symbol' + # Ruby 1.9 uses ArgumentError with :symbol + rescue NameError, ArgumentError => e + unless (match_data = e.message.match(/uncaught throw (`|\:)([a-zA-Z0-9_]*)(')?/)) + other_exception = e + raise + end + @caught_symbol = match_data.captures[1].to_sym + rescue => other_exception + raise + ensure + # rubocop:disable EnsureReturn + unless other_exception + if @expected_symbol.nil? + return !!@caught_symbol + else + if @expected_arg.nil? + return @caught_symbol == @expected_symbol + else + return (@caught_symbol == @expected_symbol) && values_match?(@expected_arg, @caught_arg) + end + end + end + # rubocop:enable EnsureReturn + end + end + # rubocop:enable MethodLength + + def does_not_match?(given_proc) + !matches?(given_proc) && Proc === given_proc + end + + # @api private + # @return [String] + def failure_message + "expected #{expected} to be thrown, #{actual_result}" + end + + # @api private + # @return [String] + def failure_message_when_negated + "expected #{expected('no Symbol')}#{' not' if @expected_symbol} to be thrown, #{actual_result}" + end + + # @api private + # @return [String] + def description + "throw #{expected}" + end + + # @api private + # Indicates this matcher matches against a block. + # @return [True] + def supports_block_expectations? + true + end + + # @api private + def supports_value_expectations? + false + end + + # @api private + def expects_call_stack_jump? + true + end + + private + + def actual_result + return "but was not a block" unless Proc === @block + "got #{caught}" + end + + def expected(symbol_desc='a Symbol') + throw_description(@expected_symbol || symbol_desc, @expected_arg) + end + + def caught + throw_description(@caught_symbol || 'nothing', @caught_arg) + end + + def throw_description(symbol, arg) + symbol_description = symbol.is_a?(String) ? symbol : description_of(symbol) + + arg_description = if arg + " with #{description_of arg}" + elsif @expected_arg && @caught_symbol == @expected_symbol + " with no argument" + else + "" + end + + symbol_description + arg_description + end + end + end + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/rspec-expectations-3.11.0/lib/rspec/matchers/built_in/yield.rb b/vendor/bundle/ruby/3.1.0/gems/rspec-expectations-3.11.0/lib/rspec/matchers/built_in/yield.rb new file mode 100644 index 000000000..c443dc030 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/rspec-expectations-3.11.0/lib/rspec/matchers/built_in/yield.rb @@ -0,0 +1,375 @@ +require 'rspec/matchers/built_in/count_expectation' + +RSpec::Support.require_rspec_support 'method_signature_verifier' + +module RSpec + module Matchers + module BuiltIn + # @private + # Object that is yielded to `expect` when one of the + # yield matchers is used. Provides information about + # the yield behavior of the object-under-test. + class YieldProbe + def self.probe(block, &callback) + probe = new(block, &callback) + return probe unless probe.has_block? + probe.probe + end + + attr_accessor :num_yields, :yielded_args + + def initialize(block, &callback) + @block = block + @callback = callback || Proc.new {} + @used = false + self.num_yields = 0 + self.yielded_args = [] + end + + def has_block? + Proc === @block + end + + def probe + assert_valid_expect_block! + @block.call(self) + assert_used! + self + end + + def to_proc + @used = true + + probe = self + callback = @callback + Proc.new do |*args| + probe.num_yields += 1 + probe.yielded_args << args + callback.call(*args) + nil # to indicate the block does not return a meaningful value + end + end + + def single_yield_args + yielded_args.first + end + + def yielded_once?(matcher_name) + case num_yields + when 1 then true + when 0 then false + else + raise "The #{matcher_name} matcher is not designed to be used with a " \ + 'method that yields multiple times. Use the yield_successive_args ' \ + 'matcher for that case.' + end + end + + def assert_used! + return if @used + raise 'You must pass the argument yielded to your expect block on ' \ + 'to the method-under-test as a block. It acts as a probe that ' \ + 'allows the matcher to detect whether or not the method-under-test ' \ + 'yields, and, if so, how many times, and what the yielded arguments ' \ + 'are.' + end + + if RUBY_VERSION.to_f > 1.8 + def assert_valid_expect_block! + block_signature = RSpec::Support::BlockSignature.new(@block) + return if RSpec::Support::StrictSignatureVerifier.new(block_signature, [self]).valid? + raise 'Your expect block must accept an argument to be used with this ' \ + 'matcher. Pass the argument as a block on to the method you are testing.' + end + else + # :nocov: + # On 1.8.7, `lambda { }.arity` and `lambda { |*a| }.arity` both return -1, + # so we can't distinguish between accepting no args and an arg splat. + # It's OK to skip, this, though; it just provides a nice error message + # when the user forgets to accept an arg in their block. They'll still get + # the `assert_used!` error message from above, which is sufficient. + def assert_valid_expect_block! + # nothing to do + end + # :nocov: + end + end + + # @api private + # Provides the implementation for `yield_control`. + # Not intended to be instantiated directly. + class YieldControl < BaseMatcher + include CountExpectation + # @private + def matches?(block) + @probe = YieldProbe.probe(block) + return false unless @probe.has_block? + expected_count_matches?(@probe.num_yields) + end + + # @private + def does_not_match?(block) + !matches?(block) && @probe.has_block? + end + + # @api private + # @return [String] + def failure_message + 'expected given block to yield control' + failure_reason + end + + # @api private + # @return [String] + def failure_message_when_negated + 'expected given block not to yield control' + failure_reason + end + + # @private + def supports_block_expectations? + true + end + + # @private + def supports_value_expectations? + false + end + + private + + def failure_reason + return ' but was not a block' unless @probe.has_block? + return "#{count_expectation_description} but did not yield" if @probe.num_yields == 0 + count_failure_reason('yielded') + end + end + + # @api private + # Provides the implementation for `yield_with_no_args`. + # Not intended to be instantiated directly. + class YieldWithNoArgs < BaseMatcher + # @private + def matches?(block) + @probe = YieldProbe.probe(block) + return false unless @probe.has_block? + @probe.yielded_once?(:yield_with_no_args) && @probe.single_yield_args.empty? + end + + # @private + def does_not_match?(block) + !matches?(block) && @probe.has_block? + end + + # @private + def failure_message + "expected given block to yield with no arguments, but #{positive_failure_reason}" + end + + # @private + def failure_message_when_negated + "expected given block not to yield with no arguments, but #{negative_failure_reason}" + end + + # @private + def supports_block_expectations? + true + end + + # @private + def supports_value_expectations? + false + end + + private + + def positive_failure_reason + return 'was not a block' unless @probe.has_block? + return 'did not yield' if @probe.num_yields.zero? + "yielded with arguments: #{description_of @probe.single_yield_args}" + end + + def negative_failure_reason + return 'was not a block' unless @probe.has_block? + 'did' + end + end + + # @api private + # Provides the implementation for `yield_with_args`. + # Not intended to be instantiated directly. + class YieldWithArgs < BaseMatcher + def initialize(*args) + @expected = args + end + + # @private + def matches?(block) + @args_matched_when_yielded = true + @probe = YieldProbe.new(block) do + @actual = @probe.single_yield_args + @actual_formatted = actual_formatted + @args_matched_when_yielded &&= args_currently_match? + end + return false unless @probe.has_block? + @probe.probe + @probe.yielded_once?(:yield_with_args) && @args_matched_when_yielded + end + + # @private + def does_not_match?(block) + !matches?(block) && @probe.has_block? + end + + # @private + def failure_message + "expected given block to yield with arguments, but #{positive_failure_reason}" + end + + # @private + def failure_message_when_negated + "expected given block not to yield with arguments, but #{negative_failure_reason}" + end + + # @private + def description + desc = 'yield with args' + desc = "#{desc}(#{expected_arg_description})" unless @expected.empty? + desc + end + + # @private + def supports_block_expectations? + true + end + + # @private + def supports_value_expectations? + false + end + + private + + def positive_failure_reason + return 'was not a block' unless @probe.has_block? + return 'did not yield' if @probe.num_yields.zero? + @positive_args_failure + end + + def expected_arg_description + @expected.map { |e| description_of e }.join(', ') + end + + def negative_failure_reason + if !@probe.has_block? + 'was not a block' + elsif @args_matched_when_yielded && !@expected.empty? + 'yielded with expected arguments' \ + "\nexpected not: #{surface_descriptions_in(@expected).inspect}" \ + "\n got: #{@actual_formatted}" + else + 'did' + end + end + + def args_currently_match? + if @expected.empty? # expect {...}.to yield_with_args + @positive_args_failure = 'yielded with no arguments' if @actual.empty? + return !@actual.empty? + end + + unless (match = all_args_match?) + @positive_args_failure = 'yielded with unexpected arguments' \ + "\nexpected: #{surface_descriptions_in(@expected).inspect}" \ + "\n got: #{@actual_formatted}" + end + + match + end + + def all_args_match? + values_match?(@expected, @actual) + end + end + + # @api private + # Provides the implementation for `yield_successive_args`. + # Not intended to be instantiated directly. + class YieldSuccessiveArgs < BaseMatcher + def initialize(*args) + @expected = args + end + + # @private + def matches?(block) + @actual_formatted = [] + @actual = [] + args_matched_when_yielded = true + yield_count = 0 + + @probe = YieldProbe.probe(block) do |*arg_array| + arg_or_args = arg_array.size == 1 ? arg_array.first : arg_array + @actual_formatted << RSpec::Support::ObjectFormatter.format(arg_or_args) + @actual << arg_or_args + args_matched_when_yielded &&= values_match?(@expected[yield_count], arg_or_args) + yield_count += 1 + end + + return false unless @probe.has_block? + args_matched_when_yielded && yield_count == @expected.length + end + + def does_not_match?(block) + !matches?(block) && @probe.has_block? + end + + # @private + def failure_message + 'expected given block to yield successively with arguments, ' \ + "but #{positive_failure_reason}" + end + + # @private + def failure_message_when_negated + 'expected given block not to yield successively with arguments, ' \ + "but #{negative_failure_reason}" + end + + # @private + def description + "yield successive args(#{expected_arg_description})" + end + + # @private + def supports_block_expectations? + true + end + + # @private + def supports_value_expectations? + false + end + + private + + def expected_arg_description + @expected.map { |e| description_of e }.join(', ') + end + + def positive_failure_reason + return 'was not a block' unless @probe.has_block? + + 'yielded with unexpected arguments' \ + "\nexpected: #{surface_descriptions_in(@expected).inspect}" \ + "\n got: [#{@actual_formatted.join(", ")}]" + end + + def negative_failure_reason + return 'was not a block' unless @probe.has_block? + + 'yielded with expected arguments' \ + "\nexpected not: #{surface_descriptions_in(@expected).inspect}" \ + "\n got: [#{@actual_formatted.join(", ")}]" + end + end + end + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/rspec-expectations-3.11.0/lib/rspec/matchers/composable.rb b/vendor/bundle/ruby/3.1.0/gems/rspec-expectations-3.11.0/lib/rspec/matchers/composable.rb new file mode 100644 index 000000000..119b15aa6 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/rspec-expectations-3.11.0/lib/rspec/matchers/composable.rb @@ -0,0 +1,171 @@ +RSpec::Support.require_rspec_support "fuzzy_matcher" + +module RSpec + module Matchers + # Mixin designed to support the composable matcher features + # of RSpec 3+. Mix it into your custom matcher classes to + # allow them to be used in a composable fashion. + # + # @api public + module Composable + # Creates a compound `and` expectation. The matcher will + # only pass if both sub-matchers pass. + # This can be chained together to form an arbitrarily long + # chain of matchers. + # + # @example + # expect(alphabet).to start_with("a").and end_with("z") + # expect(alphabet).to start_with("a") & end_with("z") + # + # @note The negative form (`expect(...).not_to matcher.and other`) + # is not supported at this time. + def and(matcher) + BuiltIn::Compound::And.new self, matcher + end + alias & and + + # Creates a compound `or` expectation. The matcher will + # pass if either sub-matcher passes. + # This can be chained together to form an arbitrarily long + # chain of matchers. + # + # @example + # expect(stoplight.color).to eq("red").or eq("green").or eq("yellow") + # expect(stoplight.color).to eq("red") | eq("green") | eq("yellow") + # + # @note The negative form (`expect(...).not_to matcher.or other`) + # is not supported at this time. + def or(matcher) + BuiltIn::Compound::Or.new self, matcher + end + alias | or + + # Delegates to `#matches?`. Allows matchers to be used in composable + # fashion and also supports using matchers in case statements. + def ===(value) + matches?(value) + end + + private + + # This provides a generic way to fuzzy-match an expected value against + # an actual value. It understands nested data structures (e.g. hashes + # and arrays) and is able to match against a matcher being used as + # the expected value or within the expected value at any level of + # nesting. + # + # Within a custom matcher you are encouraged to use this whenever your + # matcher needs to match two values, unless it needs more precise semantics. + # For example, the `eq` matcher _does not_ use this as it is meant to + # use `==` (and only `==`) for matching. + # + # @param expected [Object] what is expected + # @param actual [Object] the actual value + # + # @!visibility public + def values_match?(expected, actual) + expected = with_matchers_cloned(expected) + Support::FuzzyMatcher.values_match?(expected, actual) + end + + # Returns the description of the given object in a way that is + # aware of composed matchers. If the object is a matcher with + # a `description` method, returns the description; otherwise + # returns `object.inspect`. + # + # You are encouraged to use this in your custom matcher's + # `description`, `failure_message` or + # `failure_message_when_negated` implementation if you are + # supporting matcher arguments. + # + # @!visibility public + def description_of(object) + RSpec::Support::ObjectFormatter.format(object) + end + + # Transforms the given data structue (typically a hash or array) + # into a new data structure that, when `#inspect` is called on it, + # will provide descriptions of any contained matchers rather than + # the normal `#inspect` output. + # + # You are encouraged to use this in your custom matcher's + # `description`, `failure_message` or + # `failure_message_when_negated` implementation if you are + # supporting any arguments which may be a data structure + # containing matchers. + # + # @!visibility public + def surface_descriptions_in(item) + if Matchers.is_a_describable_matcher?(item) + DescribableItem.new(item) + elsif Hash === item + Hash[surface_descriptions_in(item.to_a)] + elsif Struct === item || unreadable_io?(item) + RSpec::Support::ObjectFormatter.format(item) + elsif should_enumerate?(item) + item.map { |subitem| surface_descriptions_in(subitem) } + else + item + end + end + + # @private + # Historically, a single matcher instance was only checked + # against a single value. Given that the matcher was only + # used once, it's been common to memoize some intermediate + # calculation that is derived from the `actual` value in + # order to reuse that intermediate result in the failure + # message. + # + # This can cause a problem when using such a matcher as an + # argument to another matcher in a composed matcher expression, + # since the matcher instance may be checked against multiple + # values and produce invalid results due to the memoization. + # + # To deal with this, we clone any matchers in `expected` via + # this method when using `values_match?`, so that any memoization + # does not "leak" between checks. + def with_matchers_cloned(object) + if Matchers.is_a_matcher?(object) + object.clone + elsif Hash === object + Hash[with_matchers_cloned(object.to_a)] + elsif should_enumerate?(object) + object.map { |subobject| with_matchers_cloned(subobject) } + else + object + end + end + + # @api private + # We should enumerate arrays as long as they are not recursive. + def should_enumerate?(item) + Array === item && item.none? { |subitem| subitem.equal?(item) } + end + + # @api private + def unreadable_io?(object) + return false unless IO === object + object.each {} # STDOUT is enumerable but raises an error + false + rescue IOError + true + end + module_function :surface_descriptions_in, :should_enumerate?, :unreadable_io? + + # Wraps an item in order to surface its `description` via `inspect`. + # @api private + DescribableItem = Struct.new(:item) do + # Inspectable version of the item description + def inspect + "(#{item.description})" + end + + # A pretty printed version of the item description. + def pretty_print(pp) + pp.text "(#{item.description})" + end + end + end + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/rspec-expectations-3.11.0/lib/rspec/matchers/dsl.rb b/vendor/bundle/ruby/3.1.0/gems/rspec-expectations-3.11.0/lib/rspec/matchers/dsl.rb new file mode 100644 index 000000000..d03fd2795 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/rspec-expectations-3.11.0/lib/rspec/matchers/dsl.rb @@ -0,0 +1,544 @@ +RSpec::Support.require_rspec_support "with_keywords_when_needed" + +module RSpec + module Matchers + # Defines the custom matcher DSL. + module DSL + # Defines a matcher alias. The returned matcher's `description` will be overriden + # to reflect the phrasing of the new name, which will be used in failure messages + # when passed as an argument to another matcher in a composed matcher expression. + # + # @example + # RSpec::Matchers.alias_matcher :a_list_that_sums_to, :sum_to + # sum_to(3).description # => "sum to 3" + # a_list_that_sums_to(3).description # => "a list that sums to 3" + # + # @example + # RSpec::Matchers.alias_matcher :a_list_sorted_by, :be_sorted_by do |description| + # description.sub("be sorted by", "a list sorted by") + # end + # + # be_sorted_by(:age).description # => "be sorted by age" + # a_list_sorted_by(:age).description # => "a list sorted by age" + # + # @param new_name [Symbol] the new name for the matcher + # @param old_name [Symbol] the original name for the matcher + # @param options [Hash] options for the aliased matcher + # @option options [Class] :klass the ruby class to use as the decorator. (Not normally used). + # @yield [String] optional block that, when given, is used to define the overriden + # logic. The yielded arg is the original description or failure message. If no + # block is provided, a default override is used based on the old and new names. + # @see RSpec::Matchers + def alias_matcher(new_name, old_name, options={}, &description_override) + description_override ||= lambda do |old_desc| + old_desc.gsub(EnglishPhrasing.split_words(old_name), EnglishPhrasing.split_words(new_name)) + end + klass = options.fetch(:klass) { AliasedMatcher } + + define_method(new_name) do |*args, &block| + matcher = __send__(old_name, *args, &block) + matcher.matcher_name = new_name if matcher.respond_to?(:matcher_name=) + klass.new(matcher, description_override) + end + end + + # Defines a negated matcher. The returned matcher's `description` and `failure_message` + # will be overriden to reflect the phrasing of the new name, and the match logic will + # be based on the original matcher but negated. + # + # @example + # RSpec::Matchers.define_negated_matcher :exclude, :include + # include(1, 2).description # => "include 1 and 2" + # exclude(1, 2).description # => "exclude 1 and 2" + # + # @param negated_name [Symbol] the name for the negated matcher + # @param base_name [Symbol] the name of the original matcher that will be negated + # @yield [String] optional block that, when given, is used to define the overriden + # logic. The yielded arg is the original description or failure message. If no + # block is provided, a default override is used based on the old and new names. + # @see RSpec::Matchers + def define_negated_matcher(negated_name, base_name, &description_override) + alias_matcher(negated_name, base_name, :klass => AliasedNegatedMatcher, &description_override) + end + + # Defines a custom matcher. + # + # @param name [Symbol] the name for the matcher + # @yield [Object] block that is used to define the matcher. + # The block is evaluated in the context of your custom matcher class. + # When args are passed to your matcher, they will be yielded here, + # usually representing the expected value(s). + # @see RSpec::Matchers + def define(name, &declarations) + warn_about_block_args(name, declarations) + define_method name do |*expected, &block_arg| + RSpec::Matchers::DSL::Matcher.new(name, declarations, self, *expected, &block_arg) + end + end + alias_method :matcher, :define + + private + + if Proc.method_defined?(:parameters) + def warn_about_block_args(name, declarations) + declarations.parameters.each do |type, arg_name| + next unless type == :block + RSpec.warning("Your `#{name}` custom matcher receives a block argument (`#{arg_name}`), " \ + "but due to limitations in ruby, RSpec cannot provide the block. Instead, " \ + "use the `block_arg` method to access the block") + end + end + else + # :nocov: + def warn_about_block_args(*) + # There's no way to detect block params on 1.8 since the method reflection APIs don't expose it + end + # :nocov: + end + + RSpec.configure { |c| c.extend self } if RSpec.respond_to?(:configure) + + # Contains the methods that are available from within the + # `RSpec::Matchers.define` DSL for creating custom matchers. + module Macros + # Stores the block that is used to determine whether this matcher passes + # or fails. The block should return a boolean value. When the matcher is + # passed to `expect(...).to` and the block returns `true`, then the expectation + # passes. Similarly, when the matcher is passed to `expect(...).not_to` and the + # block returns `false`, then the expectation passes. + # + # @example + # + # RSpec::Matchers.define :be_even do + # match do |actual| + # actual.even? + # end + # end + # + # expect(4).to be_even # passes + # expect(3).not_to be_even # passes + # expect(3).to be_even # fails + # expect(4).not_to be_even # fails + # + # By default the match block will swallow expectation errors (e.g. + # caused by using an expectation such as `expect(1).to eq 2`), if you + # with to allow these to bubble up, pass in the option + # `:notify_expectation_failures => true`. + # + # @param [Hash] options for defining the behavior of the match block. + # @yield [Object] actual the actual value (i.e. the value wrapped by `expect`) + def match(options={}, &match_block) + define_user_override(:matches?, match_block) do |actual| + @actual = actual + RSpec::Support.with_failure_notifier(RAISE_NOTIFIER) do + begin + super(*actual_arg_for(match_block)) + rescue RSpec::Expectations::ExpectationNotMetError + raise if options[:notify_expectation_failures] + false + end + end + end + end + + # @private + RAISE_NOTIFIER = Proc.new { |err, _opts| raise err } + + # Use this to define the block for a negative expectation (`expect(...).not_to`) + # when the positive and negative forms require different handling. This + # is rarely necessary, but can be helpful, for example, when specifying + # asynchronous processes that require different timeouts. + # + # By default the match block will swallow expectation errors (e.g. + # caused by using an expectation such as `expect(1).to eq 2`), if you + # with to allow these to bubble up, pass in the option + # `:notify_expectation_failures => true`. + # + # @param [Hash] options for defining the behavior of the match block. + # @yield [Object] actual the actual value (i.e. the value wrapped by `expect`) + def match_when_negated(options={}, &match_block) + define_user_override(:does_not_match?, match_block) do |actual| + begin + @actual = actual + RSpec::Support.with_failure_notifier(RAISE_NOTIFIER) do + super(*actual_arg_for(match_block)) + end + rescue RSpec::Expectations::ExpectationNotMetError + raise if options[:notify_expectation_failures] + false + end + end + end + + # Use this instead of `match` when the block will raise an exception + # rather than returning false to indicate a failure. + # + # @example + # + # RSpec::Matchers.define :accept_as_valid do |candidate_address| + # match_unless_raises ValidationException do |validator| + # validator.validate(candidate_address) + # end + # end + # + # expect(email_validator).to accept_as_valid("person@company.com") + # + # @yield [Object] actual the actual object (i.e. the value wrapped by `expect`) + def match_unless_raises(expected_exception=Exception, &match_block) + define_user_override(:matches?, match_block) do |actual| + @actual = actual + begin + super(*actual_arg_for(match_block)) + rescue expected_exception => @rescued_exception + false + else + true + end + end + end + + # Customizes the failure messsage to use when this matcher is + # asked to positively match. Only use this when the message + # generated by default doesn't suit your needs. + # + # @example + # + # RSpec::Matchers.define :have_strength do |expected| + # match { your_match_logic } + # + # failure_message do |actual| + # "Expected strength of #{expected}, but had #{actual.strength}" + # end + # end + # + # @yield [Object] actual the actual object (i.e. the value wrapped by `expect`) + def failure_message(&definition) + define_user_override(__method__, definition) + end + + # Customize the failure messsage to use when this matcher is asked + # to negatively match. Only use this when the message generated by + # default doesn't suit your needs. + # + # @example + # + # RSpec::Matchers.define :have_strength do |expected| + # match { your_match_logic } + # + # failure_message_when_negated do |actual| + # "Expected not to have strength of #{expected}, but did" + # end + # end + # + # @yield [Object] actual the actual object (i.e. the value wrapped by `expect`) + def failure_message_when_negated(&definition) + define_user_override(__method__, definition) + end + + # Customize the description to use for one-liners. Only use this when + # the description generated by default doesn't suit your needs. + # + # @example + # + # RSpec::Matchers.define :qualify_for do |expected| + # match { your_match_logic } + # + # description do + # "qualify for #{expected}" + # end + # end + # + # @yield [Object] actual the actual object (i.e. the value wrapped by `expect`) + def description(&definition) + define_user_override(__method__, definition) + end + + # Tells the matcher to diff the actual and expected values in the failure + # message. + def diffable + define_method(:diffable?) { true } + end + + # Declares that the matcher can be used in a block expectation. + # Users will not be able to use your matcher in a block + # expectation without declaring this. + # (e.g. `expect { do_something }.to matcher`). + def supports_block_expectations + define_method(:supports_block_expectations?) { true } + end + + # Convenience for defining methods on this matcher to create a fluent + # interface. The trick about fluent interfaces is that each method must + # return self in order to chain methods together. `chain` handles that + # for you. If the method is invoked and the + # `include_chain_clauses_in_custom_matcher_descriptions` config option + # hash been enabled, the chained method name and args will be added to the + # default description and failure message. + # + # In the common case where you just want the chained method to store some + # value(s) for later use (e.g. in `match`), you can provide one or more + # attribute names instead of a block; the chained method will store its + # arguments in instance variables with those names, and the values will + # be exposed via getters. + # + # @example + # + # RSpec::Matchers.define :have_errors_on do |key| + # chain :with do |message| + # @message = message + # end + # + # match do |actual| + # actual.errors[key] == @message + # end + # end + # + # expect(minor).to have_errors_on(:age).with("Not old enough to participate") + def chain(method_name, *attr_names, &definition) + unless block_given? ^ attr_names.any? + raise ArgumentError, "You must pass either a block or some attribute names (but not both) to `chain`." + end + + definition = assign_attributes(attr_names) if attr_names.any? + + define_user_override(method_name, definition) do |*args, &block| + super(*args, &block) + @chained_method_clauses.push([method_name, args]) + self + end + end + + def assign_attributes(attr_names) + attr_reader(*attr_names) + private(*attr_names) + + lambda do |*attr_values| + attr_names.zip(attr_values) do |attr_name, attr_value| + instance_variable_set(:"@#{attr_name}", attr_value) + end + end + end + + # assign_attributes isn't defined in the private section below because + # that makes MRI 1.9.2 emit a warning about private attributes. + private :assign_attributes + + private + + # Does the following: + # + # - Defines the named method using a user-provided block + # in @user_method_defs, which is included as an ancestor + # in the singleton class in which we eval the `define` block. + # - Defines an overriden definition for the same method + # usign the provided `our_def` block. + # - Provides a default `our_def` block for the common case + # of needing to call the user's definition with `@actual` + # as an arg, but only if their block's arity can handle it. + # + # This compiles the user block into an actual method, allowing + # them to use normal method constructs like `return` + # (e.g. for an early guard statement), while allowing us to define + # an override that can provide the wrapped handling + # (e.g. assigning `@actual`, rescueing errors, etc) and + # can `super` to the user's definition. + def define_user_override(method_name, user_def, &our_def) + @user_method_defs.__send__(:define_method, method_name, &user_def) + our_def ||= lambda { super(*actual_arg_for(user_def)) } + define_method(method_name, &our_def) + end + + # Defines deprecated macro methods from RSpec 2 for backwards compatibility. + # @deprecated Use the methods from {Macros} instead. + module Deprecated + # @deprecated Use {Macros#match} instead. + def match_for_should(&definition) + RSpec.deprecate("`match_for_should`", :replacement => "`match`") + match(&definition) + end + + # @deprecated Use {Macros#match_when_negated} instead. + def match_for_should_not(&definition) + RSpec.deprecate("`match_for_should_not`", :replacement => "`match_when_negated`") + match_when_negated(&definition) + end + + # @deprecated Use {Macros#failure_message} instead. + def failure_message_for_should(&definition) + RSpec.deprecate("`failure_message_for_should`", :replacement => "`failure_message`") + failure_message(&definition) + end + + # @deprecated Use {Macros#failure_message_when_negated} instead. + def failure_message_for_should_not(&definition) + RSpec.deprecate("`failure_message_for_should_not`", :replacement => "`failure_message_when_negated`") + failure_message_when_negated(&definition) + end + end + end + + # Defines default implementations of the matcher + # protocol methods for custom matchers. You can + # override any of these using the {RSpec::Matchers::DSL::Macros Macros} methods + # from within an `RSpec::Matchers.define` block. + module DefaultImplementations + include BuiltIn::BaseMatcher::DefaultFailureMessages + + # @api private + # Used internally by objects returns by `should` and `should_not`. + def diffable? + false + end + + # The default description. + def description + english_name = EnglishPhrasing.split_words(name) + expected_list = EnglishPhrasing.list(expected) + "#{english_name}#{expected_list}#{chained_method_clause_sentences}" + end + + # Matchers do not support block expectations by default. You + # must opt-in. + def supports_block_expectations? + false + end + + def supports_value_expectations? + true + end + + # Most matchers do not expect call stack jumps. + def expects_call_stack_jump? + false + end + + private + + def chained_method_clause_sentences + return '' unless Expectations.configuration.include_chain_clauses_in_custom_matcher_descriptions? + + @chained_method_clauses.map do |(method_name, method_args)| + english_name = EnglishPhrasing.split_words(method_name) + arg_list = EnglishPhrasing.list(method_args) + " #{english_name}#{arg_list}" + end.join + end + end + + # The class used for custom matchers. The block passed to + # `RSpec::Matchers.define` will be evaluated in the context + # of the singleton class of an instance, and will have the + # {RSpec::Matchers::DSL::Macros Macros} methods available. + class Matcher + # Provides default implementations for the matcher protocol methods. + include DefaultImplementations + + # Allows expectation expressions to be used in the match block. + include RSpec::Matchers + + # Supports the matcher composability features of RSpec 3+. + include Composable + + # Makes the macro methods available to an `RSpec::Matchers.define` block. + extend Macros + extend Macros::Deprecated + + # Exposes the value being matched against -- generally the object + # object wrapped by `expect`. + attr_reader :actual + + # Exposes the exception raised during the matching by `match_unless_raises`. + # Could be useful to extract details for a failure message. + attr_reader :rescued_exception + + # The block parameter used in the expectation + attr_reader :block_arg + + # The name of the matcher. + attr_reader :name + + # @api private + def initialize(name, declarations, matcher_execution_context, *expected, &block_arg) + @name = name + @actual = nil + @expected_as_array = expected + @matcher_execution_context = matcher_execution_context + @chained_method_clauses = [] + @block_arg = block_arg + + klass = class << self + # See `Macros#define_user_override` above, for an explanation. + include(@user_method_defs = Module.new) + self + end + RSpec::Support::WithKeywordsWhenNeeded.class_exec(klass, *expected, &declarations) + end + + # Provides the expected value. This will return an array if + # multiple arguments were passed to the matcher; otherwise it + # will return a single value. + # @see #expected_as_array + def expected + if expected_as_array.size == 1 + expected_as_array[0] + else + expected_as_array + end + end + + # Returns the expected value as an an array. This exists primarily + # to aid in upgrading from RSpec 2.x, since in RSpec 2, `expected` + # always returned an array. + # @see #expected + attr_reader :expected_as_array + + # Adds the name (rather than a cryptic hex number) + # so we can identify an instance of + # the matcher in error messages (e.g. for `NoMethodError`) + def inspect + "#<#{self.class.name} #{name}>" + end + + if RUBY_VERSION.to_f >= 1.9 + # Indicates that this matcher responds to messages + # from the `@matcher_execution_context` as well. + # Also, supports getting a method object for such methods. + def respond_to_missing?(method, include_private=false) + super || @matcher_execution_context.respond_to?(method, include_private) + end + else # for 1.8.7 + # :nocov: + # Indicates that this matcher responds to messages + # from the `@matcher_execution_context` as well. + def respond_to?(method, include_private=false) + super || @matcher_execution_context.respond_to?(method, include_private) + end + # :nocov: + end + + private + + def actual_arg_for(block) + block.arity.zero? ? [] : [@actual] + end + + # Takes care of forwarding unhandled messages to the + # `@matcher_execution_context` (typically the current + # running `RSpec::Core::Example`). This is needed by + # rspec-rails so that it can define matchers that wrap + # Rails' test helper methods, but it's also a useful + # feature in its own right. + def method_missing(method, *args, &block) + if @matcher_execution_context.respond_to?(method) + @matcher_execution_context.__send__ method, *args, &block + else + super(method, *args, &block) + end + end + # The method_missing method should be refactored to pass kw args in RSpec 4 + # then this can be removed + ruby2_keywords :method_missing if respond_to?(:ruby2_keywords, true) + end + end + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/rspec-expectations-3.11.0/lib/rspec/matchers/english_phrasing.rb b/vendor/bundle/ruby/3.1.0/gems/rspec-expectations-3.11.0/lib/rspec/matchers/english_phrasing.rb new file mode 100644 index 000000000..fff803ccc --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/rspec-expectations-3.11.0/lib/rspec/matchers/english_phrasing.rb @@ -0,0 +1,58 @@ +module RSpec + module Matchers + # Facilitates converting ruby objects to English phrases. + module EnglishPhrasing + # Converts a symbol into an English expression. + # + # split_words(:banana_creme_pie) #=> "banana creme pie" + # + def self.split_words(sym) + sym.to_s.tr('_', ' ') + end + + # @note The returned string has a leading space except + # when given an empty list. + # + # Converts an object (often a collection of objects) + # into an English list. + # + # list(['banana', 'kiwi', 'mango']) + # #=> " \"banana\", \"kiwi\", and \"mango\"" + # + # Given an empty collection, returns the empty string. + # + # list([]) #=> "" + # + def self.list(obj) + return " #{RSpec::Support::ObjectFormatter.format(obj)}" if !obj || Struct === obj || Hash === obj + items = Array(obj).map { |w| RSpec::Support::ObjectFormatter.format(w) } + case items.length + when 0 + "" + when 1 + " #{items[0]}" + when 2 + " #{items[0]} and #{items[1]}" + else + " #{items[0...-1].join(', ')}, and #{items[-1]}" + end + end + + if RUBY_VERSION == '1.8.7' + # Not sure why, but on travis on 1.8.7 we have gotten these warnings: + # lib/rspec/matchers/english_phrasing.rb:28: warning: default `to_a' will be obsolete + # So it appears that `Array` can trigger that (e.g. by calling `to_a` on the passed object?) + # So here we replace `Kernel#Array` with our own warning-free implementation for 1.8.7. + # @private + # rubocop:disable Naming/MethodName + def self.Array(obj) + case obj + when Array then obj + else [obj] + end + end + # rubocop:enable Naming/MethodName + end + end + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/rspec-expectations-3.11.0/lib/rspec/matchers/expecteds_for_multiple_diffs.rb b/vendor/bundle/ruby/3.1.0/gems/rspec-expectations-3.11.0/lib/rspec/matchers/expecteds_for_multiple_diffs.rb new file mode 100644 index 000000000..b286bb5ae --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/rspec-expectations-3.11.0/lib/rspec/matchers/expecteds_for_multiple_diffs.rb @@ -0,0 +1,82 @@ +module RSpec + module Matchers + # @api private + # Handles list of expected values when there is a need to render + # multiple diffs. Also can handle one value. + class ExpectedsForMultipleDiffs + # @private + # Default diff label when there is only one matcher in diff + # output + DEFAULT_DIFF_LABEL = "Diff:".freeze + + # @private + # Maximum readable matcher description length + DESCRIPTION_MAX_LENGTH = 65 + + def initialize(expected_list) + @expected_list = expected_list + end + + # @api private + # Wraps provided expected value in instance of + # ExpectedForMultipleDiffs. If provided value is already an + # ExpectedForMultipleDiffs then it just returns it. + # @param [Any] expected value to be wrapped + # @return [RSpec::Matchers::ExpectedsForMultipleDiffs] + def self.from(expected) + return expected if self === expected + new([[expected, DEFAULT_DIFF_LABEL]]) + end + + # @api private + # Wraps provided matcher list in instance of + # ExpectedForMultipleDiffs. + # @param [Array] matchers list of matchers to wrap + # @return [RSpec::Matchers::ExpectedsForMultipleDiffs] + def self.for_many_matchers(matchers) + new(matchers.map { |m| [m.expected, diff_label_for(m)] }) + end + + # @api private + # Returns message with diff(s) appended for provided differ + # factory and actual value if there are any + # @param [String] message original failure message + # @param [Proc] differ + # @param [Any] actual value + # @return [String] + def message_with_diff(message, differ, actual) + diff = diffs(differ, actual) + message = "#{message}\n#{diff}" unless diff.empty? + message + end + + private + + class << self + private + + def diff_label_for(matcher) + "Diff for (#{truncated(RSpec::Support::ObjectFormatter.format(matcher))}):" + end + + def truncated(description) + return description if description.length <= DESCRIPTION_MAX_LENGTH + description[0...DESCRIPTION_MAX_LENGTH - 3] << "..." + end + end + + def diffs(differ, actual) + @expected_list.map do |(expected, diff_label)| + diff = differ.diff(actual, expected) + next if diff.strip.empty? + if diff == "\e[0m\n\e[0m" + "#{diff_label}\n" \ + " " + else + "#{diff_label}#{diff}" + end + end.compact.join("\n") + end + end + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/rspec-expectations-3.11.0/lib/rspec/matchers/fail_matchers.rb b/vendor/bundle/ruby/3.1.0/gems/rspec-expectations-3.11.0/lib/rspec/matchers/fail_matchers.rb new file mode 100644 index 000000000..bdd7cda08 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/rspec-expectations-3.11.0/lib/rspec/matchers/fail_matchers.rb @@ -0,0 +1,42 @@ +require 'rspec/expectations' + +module RSpec + module Matchers + # Matchers for testing RSpec matchers. Include them with: + # + # require 'rspec/matchers/fail_matchers' + # RSpec.configure do |config| + # config.include RSpec::Matchers::FailMatchers + # end + # + module FailMatchers + # Matches if an expectation fails + # + # @example + # expect { some_expectation }.to fail + def fail(&block) + raise_error(RSpec::Expectations::ExpectationNotMetError, &block) + end + + # Matches if an expectation fails with the provided message + # + # @example + # expect { some_expectation }.to fail_with("some failure message") + # expect { some_expectation }.to fail_with(/some failure message/) + def fail_with(message) + raise_error(RSpec::Expectations::ExpectationNotMetError, message) + end + + # Matches if an expectation fails including the provided message + # + # @example + # expect { some_expectation }.to fail_including("portion of some failure message") + def fail_including(*snippets) + raise_error( + RSpec::Expectations::ExpectationNotMetError, + a_string_including(*snippets) + ) + end + end + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/rspec-expectations-3.11.0/lib/rspec/matchers/generated_descriptions.rb b/vendor/bundle/ruby/3.1.0/gems/rspec-expectations-3.11.0/lib/rspec/matchers/generated_descriptions.rb new file mode 100644 index 000000000..cbf37519a --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/rspec-expectations-3.11.0/lib/rspec/matchers/generated_descriptions.rb @@ -0,0 +1,41 @@ +module RSpec + module Matchers + class << self + # @private + attr_accessor :last_matcher, :last_expectation_handler + end + + # @api private + # Used by rspec-core to clear the state used to generate + # descriptions after an example. + def self.clear_generated_description + self.last_matcher = nil + self.last_expectation_handler = nil + end + + # @api private + # Generates an an example description based on the last expectation. + # Used by rspec-core's one-liner syntax. + def self.generated_description + return nil if last_expectation_handler.nil? + "#{last_expectation_handler.verb} #{last_description}" + end + + # @private + def self.last_description + last_matcher.respond_to?(:description) ? last_matcher.description : <<-MESSAGE +When you call a matcher in an example without a String, like this: + +specify { expect(object).to matcher } + +or this: + +it { is_expected.to matcher } + +RSpec expects the matcher to have a #description method. You should either +add a String to the example this matcher is being used in, or give it a +description method. Then you won't have to suffer this lengthy warning again. +MESSAGE + end + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/rspec-expectations-3.11.0/lib/rspec/matchers/matcher_delegator.rb b/vendor/bundle/ruby/3.1.0/gems/rspec-expectations-3.11.0/lib/rspec/matchers/matcher_delegator.rb new file mode 100644 index 000000000..e17b2ee59 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/rspec-expectations-3.11.0/lib/rspec/matchers/matcher_delegator.rb @@ -0,0 +1,35 @@ +module RSpec + module Matchers + # Provides the necessary plumbing to wrap a matcher with a decorator. + # @private + class MatcherDelegator + include Composable + attr_reader :base_matcher + + def initialize(base_matcher) + @base_matcher = base_matcher + end + + def method_missing(*args, &block) + base_matcher.__send__(*args, &block) + end + + if ::RUBY_VERSION.to_f > 1.8 + def respond_to_missing?(name, include_all=false) + super || base_matcher.respond_to?(name, include_all) + end + else + # :nocov: + def respond_to?(name, include_all=false) + super || base_matcher.respond_to?(name, include_all) + end + # :nocov: + end + + def initialize_copy(other) + @base_matcher = @base_matcher.clone + super + end + end + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/rspec-expectations-3.11.0/lib/rspec/matchers/matcher_protocol.rb b/vendor/bundle/ruby/3.1.0/gems/rspec-expectations-3.11.0/lib/rspec/matchers/matcher_protocol.rb new file mode 100644 index 000000000..4a87f6481 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/rspec-expectations-3.11.0/lib/rspec/matchers/matcher_protocol.rb @@ -0,0 +1,105 @@ +module RSpec + module Matchers + # rspec-expectations can work with any matcher object that implements this protocol. + # + # @note This class is not loaded at runtime by rspec-expectations. It exists + # purely to provide documentation for the matcher protocol. + class MatcherProtocol + # @!group Required Methods + + # @!method matches?(actual) + # @param actual [Object] The object being matched against. + # @yield For an expression like `expect(x).to matcher do...end`, the `do/end` + # block binds to `to`. It passes that block, if there is one, on to this method. + # @return [Boolean] true if this matcher matches the provided object. + + # @!method failure_message + # This will only be called if {#matches?} returns false. + # @return [String] Explanation for the failure. + + # @!endgroup + + # @!group Optional Methods + + # @!method does_not_match?(actual) + # In a negative expectation such as `expect(x).not_to foo`, RSpec will + # call `foo.does_not_match?(x)` if this method is defined. If it's not + # defined it will fall back to using `!foo.matches?(x)`. This allows you + # to provide custom logic for the negative case. + # + # @param actual [Object] The object being matched against. + # @yield For an expression like `expect(x).not_to matcher do...end`, the `do/end` + # block binds to `not_to`. It passes that block, if there is one, on to this method. + # @return [Boolean] true if this matcher does not match the provided object. + + # @!method failure_message_when_negated + # This will only be called when a negative match fails. + # @return [String] Explanation for the failure. + # @note This method is listed as optional because matchers do not have to + # support negation. But if your matcher does support negation, this is a + # required method -- otherwise, you'll get a `NoMethodError`. + + # @!method description + # The description is used for two things: + # + # * When using RSpec's one-liner syntax + # (e.g. `it { is_expected.to matcher }`), the description + # is used to generate the example's doc string since you + # have not provided one. + # * In a composed matcher expression, the description is used + # as part of the failure message (and description) of the outer + # matcher. + # + # @return [String] Description of the matcher. + + # @!method supports_block_expectations? + # Indicates that this matcher can be used in a block expectation expression, + # such as `expect { foo }.to raise_error`. Generally speaking, this is + # only needed for matchers which operate on a side effect of a block, rather + # than on a particular object. + # @return [Boolean] true if this matcher can be used in block expressions. + # @note If not defined, RSpec assumes a value of `false` for this method. + + # @!method supports_value_expectations? + # Indicates that this matcher can be used in a value expectation expression, + # such as `expect(foo).to eq(bar)`. + # @return [Boolean] true if this matcher can be used in value expressions. + # @note If not defined, RSpec assumes a value of `true` for this method. + + # @!method expects_call_stack_jump? + # Indicates that when this matcher is used in a block expectation + # expression, it expects the block to use a ruby construct that causes + # a call stack jump (such as raising an error or throwing a symbol). + # + # This is used internally for compound block expressions, as matchers + # which expect call stack jumps must be treated with care to work properly. + # + # @return [Boolean] true if the matcher expects a call stack jump + # + # @note This method is very rarely used or needed. + # @note If not defined, RSpec assumes a value of `false` for this method. + + # @!method diffable? + # @return [Boolean] true if `actual` and `expected` can be diffed. + # Indicates that this matcher provides `actual` and `expected` attributes, + # and that the values returned by these can be usefully diffed, which can + # be included in the output. + + # @!method actual + # @return [String, Object] If an object (rather than a string) is provided, + # RSpec will use the `pp` library to convert it to multi-line output in + # order to diff. + # The actual value for the purposes of a diff. + # @note This method is required if `diffable?` returns true. + + # @!method expected + # @return [String, Object] If an object (rather than a string) is provided, + # RSpec will use the `pp` library to convert it to multi-line output in + # order to diff. + # The expected value for the purposes of a diff. + # @note This method is required if `diffable?` returns true. + + # @!endgroup + end + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/rspec-mocks-3.11.1/.document b/vendor/bundle/ruby/3.1.0/gems/rspec-mocks-3.11.1/.document new file mode 100644 index 000000000..52a564f65 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/rspec-mocks-3.11.1/.document @@ -0,0 +1,5 @@ +lib/**/*.rb +- +README.md +LICENSE.md +Changelog.md diff --git a/vendor/bundle/ruby/3.1.0/gems/rspec-mocks-3.11.1/.yardopts b/vendor/bundle/ruby/3.1.0/gems/rspec-mocks-3.11.1/.yardopts new file mode 100644 index 000000000..9555b8e5c --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/rspec-mocks-3.11.1/.yardopts @@ -0,0 +1,6 @@ +--exclude features +--no-private +--markup markdown +- +Changelog.md +LICENSE.md diff --git a/vendor/bundle/ruby/3.1.0/gems/rspec-mocks-3.11.1/Changelog.md b/vendor/bundle/ruby/3.1.0/gems/rspec-mocks-3.11.1/Changelog.md new file mode 100644 index 000000000..74c69efe4 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/rspec-mocks-3.11.1/Changelog.md @@ -0,0 +1,1193 @@ +### Development +[Full Changelog](http://github.com/rspec/rspec-mocks/compare/v3.11.1...3-11-maintenance) + +### 3.11.1 / 2022-03-31 +[Full Changelog](http://github.com/rspec/rspec-mocks/compare/v3.11.0...v3.11.1) + +Bug Fixes: + +* Add extra `ruby2_keywords` calls to properly designate methods using + `*args` to pass keyword around, fixes an issue with TruffleRuby. + (Benoit Daloze, #1464) + +### 3.11.0 / 2022-02-09 +[Full Changelog](http://github.com/rspec/rspec-mocks/compare/v3.10.3...v3.11.0) + +Enhancements: + +* Add `and_invoke` implementation for configuring responses to `receive` + (and `receive_messages`) with multiple callable objects. (Kyle Smith, #1411) + +### 3.10.3 / 2022-01-28 +[Full Changelog](http://github.com/rspec/rspec-mocks/compare/v3.10.2...v3.10.3) + +Bug Fixes: + +* Suppress warning by setting `$VERBOSE` to nil. (Nobuyoshi Nakada, #1414) +* Support keyword argument semantics when constraining argument expectations using + `with` on Ruby 3.0+ (Yusuke Endoh, #1394) + +### 3.10.2 / 2021-01-27 +[Full Changelog](http://github.com/rspec/rspec-mocks/compare/v3.10.1...v3.10.2) + +Bug Fixes: + +* Support keyword arguments with `and_call_original` on Ruby 3.0. + (Bryan Powell, #1385) +* `RSpec::Mocks::Constant#previously_defined?` is now always a boolean. + (Phil Pirozhkov, #1397) +* Support keyword arguments on Ruby 3.0 when used with `expect_any_instance_of` + or `allow_any_instance_of` with `and_call_original`. + (Jess Hottenstein, #1407) + +### 3.10.1 / 2020-12-27 +[Full Changelog](http://github.com/rspec/rspec-mocks/compare/v3.10.0...v3.10.1) + +Bug Fixes: + +* Issue `ArgumentError` rather than `TypeError` when unsupported methods on + unsupported objects are attempted to be stubbed. (@zhisme, #1357) + +### 3.10.0 / 2020-10-30 +[Full Changelog](http://github.com/rspec/rspec-mocks/compare/v3.9.1...v3.10.0) + +Enhancements: +* Add the ability to set a custom error generator in `MessageExpectation`. + This will allow rspec-expectations to inject a custom failure message. + (Benoit Tigeot and Nicolas Zermati, #1312) +* Return the result of the block passed to `RSpec::Mocks.with_temporary_scope` + when block run. (@expeehaa, #1329) + +### 3.9.1 / 2019-12-31 +[Full Changelog](http://github.com/rspec/rspec-mocks/compare/v3.9.0...v3.9.1) + +Bug Fixes: + +* Trigger `RSpec::Mocks.configuration.verifying_double_callbacks` when using + `allow_any_instance_of` or `expect_any_instance_of` (Daniel Orner, #1309) + +### 3.9.0 / 2019-10-07 +[Full Changelog](http://github.com/rspec/rspec-mocks/compare/v3.8.2...v3.9.0) + +Enhancements: + +* Improve thread safety of message expectations by using Mutex to prevent + deadlocking errors. (Ry Biesemeyer, #1236) +* Add the ability to use `time` as an alias for `times`. For example: + `expect(Class).to receive(:method).exactly(1).time`. + (Pistos, Benoit Tigeot, #1271) + +### 3.8.2 / 2019-10-02 +[Full Changelog](http://github.com/rspec/rspec-mocks/compare/v3.8.1...v3.8.2) + +* Allow `array_including` argument matchers to be nested. + (Emmanuel Delmas, #1291) + +### 3.8.1 / 2019-06-13 +[Full Changelog](http://github.com/rspec/rspec-mocks/compare/v3.8.0...v3.8.1) + +Bug Fixes: + +* Ensure stubbing methods does not change their visibility. + (Kevin Boschert, #1277) + +### 3.8.0 / 2018-08-04 +[Full Changelog](http://github.com/rspec/rspec-mocks/compare/v3.7.0...v3.8.0) + +Bug Fixes: + +* Issue error when encountering invalid "counted" negative message expectations. + (Sergiy Yarinovskiy, #1212) +* Ensure `allow_any_instance_of` and `expect_any_instance_of` can be temporarily + supressed. (Jon Rowe, #1228) +* Ensure `expect_any_instance_of(double).to_not have_received(:some_method)` + fails gracefully (as its not supported) rather than issuing a `NoMethodError`. + (Maxim Krizhanovsky, #1231) + +### 3.7.0 / 2017-10-17 +[Full Changelog](http://github.com/rspec/rspec-mocks/compare/v3.6.0...v3.7.0) + +Enhancements: + +* Improve compatibility with `--enable-frozen-string-literal` option + on Ruby 2.3+. (Pat Allan, #1165) + +Bug Fixes: + +* Fix `hash_including` and `hash_excluding` so that they work against + subclasses of `Hash`. (Aaron Rosenberg, #1167) + +### 3.6.0 / 2017-05-04 +[Full Changelog](http://github.com/rspec/rspec-mocks/compare/v3.6.0.beta2...v3.6.0) + +Bug Fixes: + +* Fix "instance variable @color not initialized" warning when using + rspec-mocks without rspec-core. (Myron Marston, #1142) +* Restore aliased module methods properly when stubbing on 1.8.7. + (Samuel Giddins, #1144) +* Allow a message chain expectation to be constrained by argument(s). + (Jon Rowe, #1156) + +### 3.6.0.beta2 / 2016-12-12 +[Full Changelog](http://github.com/rspec/rspec-mocks/compare/v3.6.0.beta1...v3.6.0.beta2) + +Enhancements: + +* Add new `without_partial_double_verification { }` API that lets you + temporarily turn off partial double verification for an example. + (Jon Rowe, #1104) + +### 3.6.0.beta1 / 2016-10-09 +[Full Changelog](http://github.com/rspec/rspec-mocks/compare/v3.5.0...v3.6.0.beta1) + +Bug Fixes: + +* Return the test double instance form `#freeze` (Alessandro Berardi, #1109) +* Allow the special logic for stubbing `new` to work when `.method` has + been redefined. (Proby, #1119) + +### 3.5.0 / 2016-07-01 +[Full Changelog](http://github.com/rspec/rspec-mocks/compare/v3.5.0.beta4...v3.5.0) + +Enhancements: + +* Provides a nice string representation of + `RSpec::Mocks::MessageExpectation` (Myron Marston, #1095) + +### 3.5.0.beta4 / 2016-06-05 +[Full Changelog](http://github.com/rspec/rspec-mocks/compare/v3.5.0.beta3...v3.5.0.beta4) + +Enhancements: + +* Add `and_throw` to any instance handling. (Tobias Bühlmann, #1068) + +### 3.5.0.beta3 / 2016-04-02 +[Full Changelog](http://github.com/rspec/rspec-mocks/compare/v3.5.0.beta2...v3.5.0.beta3) + +Enhancements: + +* Issue warning when attempting to use unsupported + `allow(...).to receive(...).ordered`. (Jon Rowe, #1000) +* Add `rspec/mocks/minitest_integration`, to properly integrate rspec-mocks + with minitest. (Myron Marston, #1065) + +### 3.5.0.beta2 / 2016-03-10 +[Full Changelog](http://github.com/rspec/rspec-mocks/compare/v3.5.0.beta1...v3.5.0.beta2) + +Enhancements: + +* Improve error message displayed when using `and_wrap_original` on pure test + doubles. (betesh, #1063) + +Bug Fixes: + +* Fix issue that prevented `receive_message_chain(...).with(...)` working + correctly on "any instance" mocks. (Jon Rowe, #1061) + +### 3.5.0.beta1 / 2016-02-06 +[Full Changelog](http://github.com/rspec/rspec-mocks/compare/v3.4.1...v3.5.0.beta1) + +Bug Fixes: + +* Allow `any_instance_of(...).to receive(...)` to use `and_yield` multiple + times. (Kilian Cirera Sant, #1054) +* Allow matchers which inherit from `rspec-mocks` matchers to be used for + `allow`. (Andrew Kozin, #1056) +* Prevent stubbing `respond_to?` on partial doubles from causing infinite + recursion. (Jon Rowe, #1013) +* Prevent aliased methods from disapearing after being mocked with + `any_instance` (regression from #1043). (Joe Rafaniello, #1060) + +### 3.4.1 / 2016-01-10 +[Full Changelog](http://github.com/rspec/rspec-mocks/compare/v3.4.0...v3.4.1) + +Bug Fixes: + +* Fix `any_instance` to work properly on Ruby 2.3. (Joe Rafaniello, #1043) + +### 3.4.0 / 2015-11-11 +[Full Changelog](http://github.com/rspec/rspec-mocks/compare/v3.3.2...v3.4.0) + +Enhancements: + +* Make `expect(...).to have_received` work without relying upon + rspec-expectations. (Myron Marston, #978) +* Add option for failing tests when expectations are set on `nil`. + (Liz Rush, #983) + +Bug Fixes: + +* Fix `have_received { ... }` so that any block passed when the message + was received is forwarded to the `have_received` block. (Myron Marston, #1006) +* Fix infinite loop in error generator when stubbing `respond_to?`. + (Alex Dowad, #1022) +* Fix issue with using `receive` on subclasses (at a class level) with 1.8.7. + (Alex Dowad, #1026) + +### 3.3.2 / 2015-07-15 +[Full Changelog](http://github.com/rspec/rspec-mocks/compare/v3.3.1...v3.3.2) + +Bug Fixes: + +* Prevent thread deadlock errors during proxy creation (e.g. when using + `before_verifying_doubles` callbacks). (Jon Rowe, #980, #979) + +### 3.3.1 / 2015-06-19 +[Full Changelog](http://github.com/rspec/rspec-mocks/compare/v3.3.0...v3.3.1) + +Bug Fixes: + +* Fix bug in `before_verifying_double` callback logic that caused it to be called + once for each class in the ancestor list when mocking or stubbing a class. Now + it is only called for the mocked or stubbed class, as you would expect. (Sam + Phippen, #974) + +### 3.3.0 / 2015-06-12 +[Full Changelog](http://github.com/rspec/rspec-mocks/compare/v3.2.1...v3.3.0) + +Enhancements: + +* When stubbing `new` on `MyClass` or `class_double(MyClass)`, use the + method signature from `MyClass#initialize` to verify arguments. + (Myron Marston, #886) +* Use matcher descriptions when generating description of received arguments + for mock expectation failures. (Tim Wade, #891) +* Avoid loading `stringio` unnecessarily. (Myron Marston, #894) +* Verifying doubles failure messages now distinguish between class and instance + level methods. (Tim Wade, #896, #908) +* Improve mock expectation failure messages so that it combines both + number of times and the received arguments in the output. (John Ceh, #918) +* Improve how test doubles are represented in failure messages. + (Siva Gollapalli, Myron Marston, #932) +* Rename `RSpec::Mocks::Configuration#when_declaring_verifying_double` to + `RSpec::Mocks::Configuration#before_verifying_doubles` and utilise when + verifying partial doubles. (Jon Rowe, #940) +* Use rspec-support's `ObjectFormatter` for improved formatting of + arguments in failure messages so that, for example, full time + precisions is displayed for time objects. (Gavin Miller, Myron Marston, #955) + +Bug Fixes: + +* Ensure expectations that raise eagerly also raise during RSpec verification. + This means that if exceptions are caught inside test execution the test will + still fail. (Sam Phippen, #884) +* Fix `have_received(msg).with(args).exactly(n).times` and + `receive(msg).with(args).exactly(n).times` failure messages + for when the message was received the wrong number of times with + the specified args, and also received additional times with other + arguments. Previously it confusingly listed the arguments as being + mis-matched (even when the double was allowed to receive with any + args) rather than listing the count. (John Ceh, #918) +* Fix `any_args`/`anything` support so that we avoid calling `obj == anything` + on user objects that may have improperly implemented `==` in a way that + raises errors. (Myron Marston, #924) +* Fix edge case involving stubbing the same method on a class and a subclass + which previously hit a `NoMethodError` internally in RSpec. (Myron Marston #954) +* Fix edge case where the message received count would be incremented multiple + times for one failure. (Myron Marston, #957) +* Fix failure messages for when spies received the expected message with + different arguments and also received another message. (Maurício Linhares, #960) +* Silence whitespace-only diffs. (Myron Marston, #969) + +### 3.2.1 / 2015-02-23 +[Full Changelog](http://github.com/rspec/rspec-mocks/compare/v3.2.0...v3.2.1) + +Bug Fixes: + +* Add missing `rspec/support/differ` require so that rspec-mocks can be + used w/o rspec-expectations (which also loads the differ and hided the + fact we forgot to require it). (Myron Marston, #893) +* Revert tracking of received arg mutation (added in 3.2.0 to provide an + error in a situation we can't support) as our implementation has side + effects on non-standard objects and there's no solution we could come + up with that always works. (Myron Marston, #900) + +### 3.2.0 / 2015-02-03 +[Full Changelog](http://github.com/rspec/rspec-mocks/compare/v3.1.3...v3.2.0) + +Enhancements: + +* Treat `any_args` as an arg splat, allowing it to match an arbitrary + number of args at any point in an arg list. (Myron Marston, #786) +* Print diffs when arguments in mock expectations are mismatched. + (Sam Phippen, #751) +* Support names for verified doubles (`instance_double`, `instance_spy`, + `class_double`, `class_spy`, `object_double`, `object_spy`). (Cezary + Baginski, #826) +* Make `array_including` and `hash_including` argument matchers composable. + (Sam Phippen, #819) +* Make `allow_any_instance_of(...).to receive(...).and_wrap_original` + work. (Ryan Fitzgerald, #869) + +Bug Fixes: + +* Provide a clear error when users wrongly combine `no_args` with + additional arguments (e.g. `expect().to receive().with(no_args, 1)`). + (Myron Marston, #786) +* Provide a clear error when users wrongly use `any_args` multiple times in the + same argument list (e.g. `expect().to receive().with(any_args, 1, any_args)`. + (Myron Marston, #786) +* Prevent the error generator from using user object #description methods. + See [#685](https://github.com/rspec/rspec-mocks/issues/685). + (Sam Phippen, #751) +* Make verified doubles declared as `(instance|class)_double(SomeConst)` + work properly when `SomeConst` has previously been stubbed. + `(instance|class)_double("SomeClass")` already worked properly. + (Myron Marston, #824) +* Add a matcher description for `receive`, `receive_messages` and + `receive_message_chain`. (Myron Marston, #828) +* Validate invocation args for null object verified doubles. + (Myron Marston, #829) +* Fix `RSpec::Mocks::Constant.original` when called with an invalid + constant to return an object indicating the constant name is invalid, + rather than blowing up. (Myron Marston, #833) +* Make `extend RSpec::Mocks::ExampleMethods` on any object work properly + to add the rspec-mocks API to that object. Previously, `expect` would + be undefined. (Myron Marston, #846) +* Fix `require 'rspec/mocks/standalone'` so that it only affects `main` + and not every object. It's really only intended to be used in a REPL + like IRB, but some gems have loaded it, thinking it needs to be loaded + when using rspec-mocks outside the context of rspec-core. + (Myron Marston, #846) +* Prevent message expectations from being modified by customization methods + (e.g. `with`) after they have been invoked. (Sam Phippen and Melanie Gilman, #837) +* Handle cases where a method stub cannot be removed due to something + external to RSpec monkeying with the method definition. This can + happen, for example, when you `file.reopen(io)` after previously + stubbing a method on the `file` object. (Myron Marston, #853) +* Provide a clear error when received message args are mutated before + a `have_received(...).with(...)` expectation. (Myron Marston, #868) + +### 3.1.3 / 2014-10-08 +[Full Changelog](http://github.com/rspec/rspec-mocks/compare/v3.1.2...v3.1.3) + +Bug Fixes: + +* Correct received messages count when used with `have_received` matcher. + (Jon Rowe, #793) +* Provide a clear error message when you use `allow_any_instance_of(...)` or + `expect_any_instance_of(...)` with the `have_received` matcher (they are + not intended to be used together and previously caused an odd internal + failure in rspec-mocks). (Jon Rowe, #799). +* Fix verified double `with` verification so that it applies to method + stubs. (Myron Marston, #790) + +### 3.1.2 / 2014-09-26 +[Full Changelog](http://github.com/rspec/rspec-mocks/compare/v3.1.1...v3.1.2) + +Bug Fixes: + +* Provide a clear error message when you use `allow(...)` with the + `have_received` matcher (they are not intended to be used together + and previously caused an odd internal failure in rspec-mocks). (Jon Rowe, #788). + +### 3.1.1 / 2014-09-18 +[Full Changelog](http://github.com/rspec/rspec-mocks/compare/v3.1.0...v3.1.1) + +Bug Fixes: + +* Prevent included modules being detected as prepended modules on Ruby 2.0 + when using `any_instance_of(...)`. (Tony Novak, #781) + +### 3.1.0 / 2014-09-04 +[Full Changelog](http://github.com/rspec/rspec-mocks/compare/v3.0.4...v3.1.0) + +Enhancements: + +* Add spying methods (`spy`, `ìnstance_spy`, `class_spy` and `object_spy`) + which create doubles as null objects for use with spying in testing. (Sam + Phippen, #671) +* `have_received` matcher will raise "does not implement" errors correctly when + used with verifying doubles and partial doubles. (Xavier Shay, #722) +* Allow matchers to be used in place of keyword arguments in `with` + expectations. (Xavier Shay, #726) +* Add `thrice` modifier to message expectation interface as a synonym + for `exactly(3).times`. (Dennis Taylor, #753) +* Add more `thrice` synonyms e.g. `.at_least(:thrice)`, `.at_most(:thrice)`, + `receive(...).thrice` and `have_received(...).thrice`. (Jon Rowe, #754) +* Add `and_wrap_original` modifier for partial doubles to mutate the + response from a method. (Jon Rowe, #762) + +Bug Fixes: + +* Remove `any_number_of_times` from `any_instance` recorders that were + erroneously causing mention of the method in documentation. (Jon Rowe, #760) +* Prevent included modules being detected as prepended modules on Ruby 2.0. + (Eugene Kenny, #771) + +### 3.0.4 / 2014-08-14 +[Full Changelog](http://github.com/rspec/rspec-mocks/compare/v3.0.3...v3.0.4) + +Bug Fixes: + +* Restore `kind_of(x)` to match using `arg.kind_of?(x)` (like RSpec 2) + rather than `x === arg`. (Jon Rowe, #750) + +### 3.0.3 / 2014-07-21 +[Full Changelog](http://github.com/rspec/rspec-mocks/compare/v3.0.2...v3.0.3) + +Bug Fixes: + +* `have_received` matcher will raise "does not implement" errors correctly when + used with verifying doubles and partial doubles. (Xavier Shay, #722) +* Make `double.as_null_object.dup` and `double.as_null_object.clone` + make the copies be null objects. (Myron Marston, #732) +* Don't inadvertently define `BasicObject` in 1.8.7. (Chris Griego, #739) + +### 3.0.2 / 2014-06-19 +[Full Changelog](http://github.com/rspec/rspec-mocks/compare/v3.0.1...v3.0.2) + +Bug Fixes: + +* Fix edge case that triggered "can't add a new key into hash during + iteration" during mock verification. (Sam Phippen, Myron Marston, #711) +* Fix verifying doubles so that when they accidentally leak into another + example, they provide the same clear error message that normal doubles + do. (Myron Marston, #718) +* Make `ordered` work with exact receive counts. (Sam Phippen, #713) + +### 3.0.1 / 2014-06-07 +[Full Changelog](http://github.com/rspec/rspec-mocks/compare/v3.0.0...v3.0.1) + +Bug Fixes: + +* Fix `receive_message_chain(...)` so that it supports `with` just like + `stub_chain` did. (Jon Rowe, #697) +* Fix regression in `expect_any_instance_of` so that it expects the + message on _any_ instance rather than on _every_ instance. + (Myron Marston, #699) + +### 3.0.0 / 2014-06-01 +[Full Changelog](http://github.com/rspec/rspec-mocks/compare/v3.0.0.rc1...v3.0.0) + +Bug Fixes: + +* Fix module prepend detection to work properly on ruby 2.0 for a case + where a module is extended onto itself. (Myron Marston) +* Fix `transfer_nested_constants` option so that transferred constants + get properly reset at the end of the example. (Myron Marston) +* Fix `config.transfer_nested_constants = true` so that you don't + erroneously get errors when stubbing a constant that is not a module + or a class. (Myron Marston) +* Fix regression that caused `double(:class => SomeClass)` to later + trigger infinite recursion. (Myron Marston) +* Fix bug in `have_received(...).with(...).ordered` where it was not + taking the args into account when checking the order. (Myron Marston) +* Fix bug in `have_received(...).ordered` where it was wrongly + considering stubs when checking the order. (Myron Marston) +* Message expectation matchers now show descriptions from argument + matchers when their expectations aren't met. (Jon Rowe) +* Display warning when encountering `TypeError` during instance method + staging on 2.0.0-p195, suffers from https://bugs.ruby-lang.org/issues/8686 + too. (Cezar Halmagean). + +### 3.0.0.rc1 / 2014-05-18 +[Full Changelog](http://github.com/rspec/rspec-mocks/compare/v3.0.0.beta2...v3.0.0.rc1) + +Breaking Changes for 3.0.0: + +* Remove `RSpec::Mocks::TestDouble.extend_onto`. (Myron Marston) +* Remove `RSpec::Mocks::ConstantStubber`. (Jon Rowe) +* Make monkey-patch of Marshal to support dumping of stubbed objects opt-in. + (Xavier Shay) + +Enhancements: + +* Instead of crashing when cleaning up stub methods on a frozen object, it now + issues a warning explaining that it's impossible to clean up the stubs. + (Justin Coyne and Sam Phippen) +* Add meaningful descriptions to `anything`, `duck_type` and `instance_of` argument + matchers. (Jon Rowe) + +Bug Fixes: + +* Fix regression introduced in 3.0.0.beta2 that caused + `double.as_null_object.to_str` to return the double rather + than a string. (Myron Marston) +* Fix bug in `expect(dbl).to receive_message_chain(:foo, :bar)` where it was + not setting an expectation for the last message in the chain. + (Jonathan del Strother) +* Allow verifying partial doubles to have private methods stubbed. (Xavier Shay) +* Fix bug with allowing/expecting messages on Class objects which have had + their singleton class prepended to. (Jon Rowe) +* Fix an issue with 1.8.7 not running implementation blocks on partial doubles. + (Maurício Linhares) +* Prevent `StackLevelTooDeep` errors when stubbing an `any_instance` method that's + accessed in `inspect` by providing our own inspect output. (Jon Rowe) +* Fix bug in `any_instance` logic that did not allow you to mock or stub + private methods if `verify_partial_doubles` was configured. (Oren Dobzinski) +* Include useful error message when trying to observe an unimplemented method + on an any instance. (Xavier Shay) +* Fix `and_call_original` to work properly when multiple classes in an + inheritance hierarchy have been stubbed with the same method. (Myron Marston) +* Fix `any_instance` so that it updates existing instances that have + already been stubbed. (Myron Marston) +* Fix verified doubles so that their class name is included in failure + messages. (Myron Marston) +* Fix `expect_any_instance_of` so that when the message is received + on an individual instance that has been directly stubbed, it still + satisfies the expectation. (Sam Phippen, Myron Marston) +* Explicitly disallow using `any_instance` to mock or stub a method + that is defined on a module prepended onto the class. This triggered + `SystemStackError` before and is very hard to support so we are not + supporting it at this time. (Myron Marston) + +### 3.0.0.beta2 / 2014-02-17 +[Full Changelog](http://github.com/rspec/rspec-mocks/compare/v3.0.0.beta1...v3.0.0.beta2) + +Breaking Changes for 3.0.0: + +* Rename `RSpec::Mocks::Mock` to `RSpec::Mocks::Double`. (Myron Marston) +* Change how to integrate rspec-mocks in other test frameworks. You now + need to include `RSpec::Mocks::ExampleMethods` in your test context. + (Myron Marston) +* Prevent RSpec mocks' doubles and partial doubles from being used outside of + the per-test lifecycle (e.g. from a `before(:all)` hook). (Sam Phippen) +* Remove the `host` argument of `RSpec::Mocks.setup`. Instead + `RSpec::Mocks::ExampleMethods` should be included directly in the scope where + RSpec's mocking capabilities are used. (Sam Phippen) +* Make test doubles raise errors if you attempt to use them after they + get reset, to help surface issues when you accidentally retain + references to test doubles and attempt to reuse them in another + example. (Myron Marston) +* Remove support for `and_return { value }` and `and_return` without arguments. (Yuji Nakayama) + +Enhancements: + +* Add `receive_message_chain` which provides the functionality of the old + `stub_chain` for the new allow/expect syntax. Use it like so: `allow(...).to + receive_message_chain(:foo, :bar, :bazz)`. (Sam Phippen). +* Change argument matchers to use `===` as their primary matching + protocol, since their semantics mirror that of a case or rescue statement + (which uses `===` for matching). (Myron Marston) +* Add `RSpec::Mocks.with_temporary_scope`, which allows you to create + temporary rspec-mocks scopes in arbitrary places (such as a + `before(:all)` hook). (Myron Marston) +* Support keyword arguments when checking arity with verifying doubles. + (Xavier Shay) + +Bug Fixes: + +* Fix regression in 3.0.0.beta1 that caused `double("string_name" => :value)` + to stop working. (Xavier Shay) +* Fix the way rspec-mocks and rspec-core interact so that if users + define a `let` with the same name as one of the methods + from `RSpec::Mocks::ArgumentMatchers`, the user's `let` takes + precedence. (Michi Huber, Myron Marston) +* Fix verified doubles so that their methods match the visibility + (public, protected or private) of the interface they verify + against. (Myron Marston) +* Fix verified null object doubles so that they do not wrongly + report that they respond to anything. They only respond to methods + available on the interface they verify against. (Myron Marston) +* Fix deprecation warning for use of old `:should` syntax w/o explicit + config so that it no longer is silenced by an extension gem such + as rspec-rails when it calls `config.add_stub_and_should_receive_to`. + (Sam Phippen) +* Fix `expect` syntax so that it does not wrongly emit a "You're + overriding a previous implementation for this stub" warning when + you are not actually doing that. (Myron Marston) +* Fix `any_instance.unstub` when used on sub classes for whom the super + class has had `any_instance.stub` invoked on. (Jon Rowe) +* Fix regression in `stub_chain`/`receive_message_chain` that caused + it to raise an `ArgumentError` when passing args to the stubbed + methods. (Sam Phippen) +* Correct stub of undefined parent modules all the way down when stubbing a + nested constant. (Xavier Shay) +* Raise `VerifyingDoubleNotDefinedError` when a constant is not defined for + a verifying class double. (Maurício Linhares) +* Remove `Double#to_str`, which caused confusing `raise some_double` + behavior. (Maurício Linhares) + +### 3.0.0.beta1 / 2013-11-07 +[Full Changelog](http://github.com/rspec/rspec-mocks/compare/v2.99.4...v3.0.0.beta1) + +Breaking Changes for 3.0.0: + +* Raise an explicit error if `should_not_receive(...).and_return` is used. (Sam + Phippen) +* Remove 1.8.6 workarounds. (Jon Rowe) +* Remove `stub!` and `unstub!`. (Sam Phippen) +* Remove `mock(name, methods)` and `stub(name, methods)`, leaving + `double(name, methods)` for creating test doubles. (Sam Phippen, Michi Huber) +* Remove `any_number_of_times` since `should_receive(:msg).any_number_of_times` + is really a stub in a mock's clothing. (Sam Phippen) +* Remove support for re-using the same null-object test double in multiple + examples. Test doubles are designed to only live for one example. + (Myron Marston) +* Make `at_least(0)` raise an error. (Sam Phippen) +* Remove support for `require 'spec/mocks'` which had been kept + in place for backwards compatibility with RSpec 1. (Myron Marston) +* Blocks provided to `with` are always used as implementation. (Xavier Shay) +* The config option (added in 2.99) to yield the receiver to + `any_instance` implementation blocks now defaults to "on". (Sam Phippen) + +Enhancements: + +* Allow the `have_received` matcher to use a block to set further expectations + on arguments. (Tim Cowlishaw) +* Provide `instance_double` and `class_double` to create verifying doubles, + ported from `rspec-fire`. (Xavier Shay) +* `as_null_object` on a verifying double only responds to defined methods. + (Xavier Shay) +* Provide `object_double` to create verified doubles of specific object + instances. (Xavier Shay) +* Provide `verify_partial_doubles` configuration that provides `object_double` + like verification behaviour on partial doubles. (Xavier Shay) +* Improved performance of double creation, particularly those with many + attributes. (Xavier Shay) +* Default value of `transfer_nested_constants` option for constant stubbing can + be configured. (Xavier Shay) +* Messages can be allowed or expected on in bulk via + `receive_messages(:message => :value)`. (Jon Rowe) +* `allow(Klass.any_instance)` and `expect(Klass.any_instance)` now print a + warning. This is usually a mistake, and users usually want + `allow_any_instance_of` or `expect_any_instance_of` instead. (Sam Phippen) +* `instance_double` and `class_double` raise `ArgumentError` if the underlying + module is loaded and the arity of the method being invoked does not match the + arity of the method as it is actually implemented. (Andy Lindeman) +* Spies can now check their invocation ordering is correct. (Jon Rowe) + +Deprecations: + +* Using the old `:should` syntax without explicitly configuring it + is deprecated. It will continue to work but will emit a deprecation + warning in RSpec 3 if you do not explicitly enable it. (Sam Phippen) + +Bug Fixes: + +* Fix `and_call_original` to handle a complex edge case involving + singleton class ancestors. (Marc-André Lafortune, Myron Marston) +* When generating an error message for unexpected arguments, + use `#inspect` rather than `#description` if `#description` + returns `nil` or `''` so that you still get a useful message. + (Nick DeLuca) + +### 2.99.4 / 2015-06-19 +[Full Changelog](http://github.com/rspec/rspec-mocks/compare/v2.99.3...v2.99.4) + +Bug Fixes: + +* Add missing deprecation for using `with` with no arguments e.g. `with()`. (Yousuke, #970) + +### 2.99.3 / 2015-01-09 +[Full Changelog](http://github.com/rspec/rspec-mocks/compare/v2.99.2...v2.99.3) + +Bug Fixes: + +* Fix regression that caused an error when a test double was deserialized from YAML. (Yuji Nakayama, #777) + +### 2.99.2 / 2014-07-21 +[Full Changelog](http://github.com/rspec/rspec-mocks/compare/v2.99.1...v2.99.2) + +Enhancements: + +* Warn about upcoming change to `#===` matching and `DateTime#===` behaviour. + (Jon Rowe, #735) + +### 2.99.1 / 2014-06-12 +[Full Changelog](http://github.com/rspec/rspec-mocks/compare/v2.99.0...v2.99.1) + +Bug Fixes: + +* Fix bug that caused errors at the end of each example + when a `double.as_null_object` had been frozen. (Yuji Nakayama, #698) + +Deprecations: + +* Deprecate freezing a test double. (Yuji Nakayama, #698) + +### 2.99.0 / 2014-06-01 +[Full Changelog](http://github.com/rspec/rspec-mocks/compare/v2.99.0.rc1...v2.99.0) + +No changes. Just taking it out of pre-release. + +### 2.99.0.rc1 / 2014-05-18 +[Full Changelog](http://github.com/rspec/rspec-mocks/compare/v2.99.0.beta2...v2.99.0.rc1) + +Deprecations: + +* Deprecate `RSpec::Mocks::TestDouble.extend_onto`. (Myron Marston) +* Deprecate `RSpec::Mocks::ConstantStubber`. (Jon Rowe) +* Deprecate `Marshal.dump` monkey-patch without opt-in. (Xavier Shay) + +### 2.99.0.beta2 / 2014-02-17 +[Full Changelog](http://github.com/rspec/rspec-mocks/compare/v2.99.0.beta1...v2.99.0.beta2) + +Deprecations: + +* Deprecate `RSpec::Mocks::Mock` in favor of `RSpec::Mocks::Double`. + (Myron Marston) +* Deprecate the `host` argument of `RSpec::Mocks.setup`. Instead + `RSpec::Mocks::ExampleMethods` should be included directly in the scope where + RSpec's mocking capabilities are used. (Sam Phippen) +* Deprecate using any of rspec-mocks' features outside the per-test + lifecycle (e.g. from a `before(:all)` hook). (Myron Marston) +* Deprecate re-using a test double in another example. (Myron Marston) +* Deprecate `and_return { value }` and `and_return` without arguments. (Yuji Nakayama) + +### 2.99.0.beta1 / 2013-11-07 +[Full Changelog](http://github.com/rspec/rspec-mocks/compare/v2.14.4...v2.99.0.beta1) + +Deprecations + +* Expecting to use lambdas or other strong arity implementations for stub + methods with mis-matched arity is deprecated and support for them will be + removed in 3.0. Either provide the right amount of arguments or use a weak + arity implementation (methods with splats or procs). (Jon Rowe) +* Using the same test double instance in multiple examples is deprecated. Test + doubles are only meant to live for one example. The mocks and stubs have + always been reset between examples; however, in 2.x the `as_null_object` + state was not reset and some users relied on this to have a null object + double that is used for many examples. This behavior will be removed in 3.0. + (Myron Marston) +* Print a detailed warning when an `any_instance` implementation block is used + when the new `yield_receiver_to_any_instance_implementation_blocks` config + option is not explicitly set, as RSpec 3.0 will default to enabling this new + feature. (Sam Phippen) + +Enhancements: + +* Add a config option to yield the receiver to `any_instance` implementation + blocks. (Sam Phippen) + +### 2.14.6 / 2014-02-20 +[Full Changelog](http://github.com/rspec/rspec-mocks/compare/v2.14.5...v2.14.6) + +Bug Fixes: + +* Ensure `any_instance` method stubs and expectations are torn down regardless of + expectation failures. (Sam Phippen) + +### 2.14.5 / 2014-02-01 +[Full Changelog](http://github.com/rspec/rspec-mocks/compare/v2.14.4...v2.14.5) + +Bug Fixes: + +* Fix regression that caused block implementations to not receive all + args on 1.8.7 if the block also receives a block, due to Proc#arity + reporting `1` no matter how many args the block receives if it + receives a block, too. (Myron Marston) + +### 2.14.4 / 2013-10-15 +[Full Changelog](http://github.com/rspec/rspec-mocks/compare/v2.14.3...v2.14.4) + +Bug Fixes: + +* Fix issue where unstubing methods on "any instances" would not + remove stubs on existing instances (Jon Rowe) +* Fix issue with receive(:message) do ... end precedence preventing + the usage of modifications (`and_return` etc) (Jon Rowe) + +### 2.14.3 / 2013-08-08 +[Full Changelog](http://github.com/rspec/rspec-mocks/compare/v2.14.2...v2.14.3) + +Bug Fixes: + +* Fix stubbing some instance methods for classes whose hierarchy includes + a prepended Module (Bradley Schaefer) + +### 2.14.2 / 2013-07-30 +[Full Changelog](http://github.com/rspec/rspec-mocks/compare/v2.14.1...v2.14.2) + +Bug Fixes: + +* Fix `as_null_object` doubles so that they return `nil` from `to_ary` + (Jon Rowe). +* Fix regression in 2.14 that made `stub!` (with an implicit receiver) + return a test double rather than stub a method (Myron Marston). + +### 2.14.1 / 2013-07-07 +[Full Changelog](http://github.com/rspec/rspec-mocks/compare/v2.14.0...v2.14.1) + +Bug Fixes: + +* Restore `double.as_null_object` behavior from 2.13 and earlier: a + double's nullness persisted between examples in earlier examples. + While this is not an intended use case (test doubles are meant to live + for only one example), we don't want to break behavior users rely + on in a minor relase. This will be deprecated in 2.99 and removed + in 3.0. (Myron Marston) + +### 2.14.0 / 2013-07-06 +[Full Changelog](http://github.com/rspec/rspec-mocks/compare/v2.14.0.rc1...v2.14.0) + +Enhancements: + +* Document test spies in the readme. (Adarsh Pandit) +* Add an `array_including` matcher. (Sam Phippen) +* Add a syntax-agnostic API for mocking or stubbing a method. This is + intended for use by libraries such as rspec-rails that need to mock + or stub a method, and work regardless of the syntax the user has + configured (Paul Annesley, Myron Marston and Sam Phippen). + +Bug Fixes: + +* Fix `double` so that it sets up passed stubs correctly regardless of + the configured syntax (Paul Annesley). +* Allow a block implementation to be used in combination with + `and_yield`, `and_raise`, `and_return` or `and_throw`. This got fixed + in 2.13.1 but failed to get merged into master for the 2.14.0.rc1 + release (Myron Marston). +* `Marshal.dump` does not unnecessarily duplicate objects when rspec-mocks has + not been fully initialized. This could cause errors when using `spork` or + similar preloading gems (Andy Lindeman). + +### 2.14.0.rc1 / 2013-05-27 +[Full Changelog](http://github.com/rspec/rspec-mocks/compare/v2.13.0...v2.14.0.rc1) + +Enhancements: + +* Refactor internals so that the mock proxy methods and state are held + outside of the mocked object rather than inside it. This paves the way + for future syntax enhancements and removes the need for some hacky + work arounds for `any_instance` dup'ing and `YAML` serialization, + among other things. Note that the code now relies upon `__id__` + returning a unique, consistent value for any object you want to + mock or stub (Myron Marston). +* Add support for test spies. This allows you to verify a message + was received afterwards using the `have_received` matcher. + Note that you must first stub the method or use a null double. + (Joe Ferris and Joël Quenneville) +* Make `at_least` and `at_most` style receive expectations print that they were + expecting at least or at most some number of calls, rather than just the + number of calls given in the expectation (Sam Phippen) +* Make `with` style receive expectations print the args they were expecting, and + the args that they got (Sam Phippen) +* Fix some warnings seen under ruby 2.0.0p0 (Sam Phippen). +* Add a new `:expect` syntax for message expectations + (Myron Marston and Sam Phippen). + +Bug fixes + +* Fix `any_instance` so that a frozen object can be `dup`'d when methods + have been stubbed on that type using `any_instance` (Jon Rowe). +* Fix `and_call_original` so that it properly raises an `ArgumentError` + when the wrong number of args are passed (Jon Rowe). +* Fix `double` on 1.9.2 so you can wrap them in an Array + using `Array(my_double)` (Jon Rowe). +* Fix `stub_const` and `hide_const` to handle constants that redefine `send` + (Sam Phippen). +* Fix `Marshal.dump` extension so that it correctly handles nil. + (Luke Imhoff, Jon Rowe) +* Fix isolation of `allow_message_expectations_on_nil` (Jon Rowe) +* Use inspect to format actual arguments on expectations in failure messages (#280, Ben Langfeld) +* Protect against improperly initialised test doubles (#293) (Joseph Shraibman and Jon Rowe) + +Deprecations + +* Deprecate `stub` and `mock` as aliases for `double`. `double` is the + best term for creating a test double, and it reduces confusion to + have only one term (Michi Huber). +* Deprecate `stub!` and `unstub!` in favor of `stub` and `unstub` + (Jon Rowe). +* Deprecate `at_least(0).times` and `any_number_of_times` (Michi Huber). + +### 2.13.1 / 2013-04-06 +[Full Changelog](http://github.com/rspec/rspec-mocks/compare/v2.13.0...v2.13.1) + +Bug fixes + +* Allow a block implementation to be used in combination with + `and_yield`, `and_raise`, `and_return` or `and_throw` (Myron Marston). + +### 2.13.0 / 2013-02-23 +[Full Changelog](http://github.com/rspec/rspec-mocks/compare/v2.12.2...v2.13.0) + +Bug fixes + +* Fix bug that caused weird behavior when a method that had + previously been stubbed with multiple return values (e.g. + `obj.stub(:foo).and_return(1, 2)`) was later mocked with a + single return value (e.g. `obj.should_receive(:foo).once.and_return(1)`). + (Myron Marston) +* Fix bug related to a mock expectation for a method that already had + multiple stubs with different `with` constraints. Previously, the + first stub was used, even though it may not have matched the passed + args. The fix defers this decision until the message is received so + that the proper stub response can be chosen based on the passed + arguments (Myron Marston). +* Do not call `nil?` extra times on a mocked object, in case `nil?` + itself is expected a set number of times (Myron Marston). +* Fix `missing_default_stub_error` message so array args are handled + properly (Myron Marston). +* Explicitly disallow `any_instance.unstub!` (Ryan Jones). +* Fix `any_instance` stubbing so that it works with `Delegator` + subclasses (Myron Marston). +* Fix `and_call_original` so that it works with `Delegator` subclasses + (Myron Marston). +* Fix `any_instance.should_not_receive` when `any_instance.should_receive` + is used on the same class in the same example. Previously it would + wrongly report a failure even when the message was not received + (Myron Marston). + +### 2.12.2 / 2013-01-27 +[Full Changelog](http://github.com/rspec/rspec-mocks/compare/v2.12.1...v.2.12.2) + +Bug fixes + +* Fix `and_call_original` to work properly for methods defined + on a module extended onto an object instance (Myron Marston). +* Fix `stub_const` with an undefined constnat name to work properly + with constant strings that are prefixed with `::` -- and edge case + I missed in the bug fix in the 2.12.1 release (Myron Marston). +* Ensure method visibility on a partial mock is restored after reseting + method stubs, even on a singleton module (created via `extend self`) + when the method visibility differs between the instance and singleton + versions (Andy Lindeman). + +### 2.12.1 / 2012-12-21 +[Full Changelog](http://github.com/rspec/rspec-mocks/compare/v2.12.0...v2.12.1) + +Bug fixes + +* Fix `any_instance` to support `and_call_original`. + (Myron Marston) +* Properly restore stubbed aliased methods on rubies + that report the incorrect owner (Myron Marston and Andy Lindeman). +* Fix `hide_const` and `stub_const` with a defined constnat name to + work properly with constant strings that are prefixed with `::` (Myron Marston). + +### 2.12.0 / 2012-11-12 +[Full Changelog](http://github.com/rspec/rspec-mocks/compare/v2.11.3...v2.12.0) + +Enhancements + +* `and_raise` can accept an exception class and message, more closely + matching `Kernel#raise` (e.g., `foo.stub(:bar).and_raise(RuntimeError, "message")`) + (Bas Vodde) +* Add `and_call_original`, which will delegate the message to the + original method (Myron Marston). + +Deprecations: + +* Add deprecation warning when using `and_return` with `should_not_receive` + (Neha Kumari) + +### 2.11.3 / 2012-09-19 +[Full Changelog](http://github.com/rspec/rspec-mocks/compare/v2.11.2...v2.11.3) + +Bug fixes + +* Fix `:transfer_nested_constants` option of `stub_const` so that it + doesn't blow up when there are inherited constants. (Myron Marston) +* `any_instance` stubs can be used on classes that override `Object#method`. + (Andy Lindeman) +* Methods stubbed with `any_instance` are unstubbed after the test finishes. + (Andy Lindeman) +* Fix confusing error message when calling a mocked class method an + extra time with the wrong arguments (Myron Marston). + +### 2.11.2 / 2012-08-11 +[Full Changelog](http://github.com/rspec/rspec-mocks/compare/v2.11.1...v2.11.2) + +Bug fixes + +* Don't modify `dup` on classes that don't support `dup` (David Chelimsky) +* Fix `any_instance` so that it works properly with methods defined on + a superclass. (Daniel Eguzkiza) +* Fix `stub_const` so that it works properly for nested constants that + share a name with a top-level constant (e.g. "MyGem::Hash"). (Myron + Marston) + +### 2.11.1 / 2012-07-09 +[Full Changelog](http://github.com/rspec/rspec-mocks/compare/v2.11.0...v2.11.1) + +Bug fixes + +* Fix `should_receive` so that when it is called on an `as_null_object` + double with no implementation, and there is a previous explicit stub + for the same method, the explicit stub remains (rather than being + overridden with the null object implementation--`return self`). (Myron + Marston) + +### 2.11.0 / 2012-07-07 +[Full Changelog](http://github.com/rspec/rspec-mocks/compare/v2.10.1...v2.11.0) + +Enhancements + +* Expose ArgumentListMatcher as a formal API + * supports use by 3rd party mock frameworks like Surrogate +* Add `stub_const` API to stub constants for the duration of an + example (Myron Marston). + +Bug fixes + +* Fix regression of edge case behavior. `double.should_receive(:foo) { a }` + was causing a NoMethodError when `double.stub(:foo).and_return(a, b)` + had been setup before (Myron Marston). +* Infinite loop generated by using `any_instance` and `dup`. (Sidu Ponnappa @kaiwren) +* `double.should_receive(:foo).at_least(:once).and_return(a)` always returns a + even if `:foo` is already stubbed. +* Prevent infinite loop when interpolating a null double into a string + as an integer (`"%i" % double.as_null_object`). (Myron Marston) +* Fix `should_receive` so that null object behavior (e.g. returning + self) is preserved if no implementation is given (Myron Marston). +* Fix `and_raise` so that it raises `RuntimeError` rather than + `Exception` by default, just like ruby does. (Andrew Marshall) + +### 2.10.1 / 2012-05-05 +[Full Changelog](http://github.com/rspec/rspec-mocks/compare/v2.10.0...v2.10.1) + +Bug fixes + +* fix regression of edge case behavior + (https://github.com/rspec/rspec-mocks/issues/132) + * fixed failure of `object.should_receive(:message).at_least(0).times.and_return value` + * fixed failure of `object.should_not_receive(:message).and_return value` + +### 2.10.0 / 2012-05-03 +[Full Changelog](http://github.com/rspec/rspec-mocks/compare/v2.9.0...v2.10.0) + +Bug fixes + +* fail fast when an `exactly` or `at_most` expectation is exceeded + +### 2.9.0 / 2012-03-17 +[Full Changelog](http://github.com/rspec/rspec-mocks/compare/v2.8.0...v2.9.0) + +Enhancements + +* Support order constraints across objects (preethiramdev) + +Bug fixes + +* Allow a `as_null_object` to be passed to `with` +* Pass proc to block passed to stub (Aubrey Rhodes) +* Initialize child message expectation args to match any args (#109 - + preethiramdev) + +### 2.8.0 / 2012-01-04 + +[Full Changelog](http://github.com/rspec/rspec-mocks/compare/v2.8.0.rc2...v2.8.0) + +No changes for this release. Just releasing with the other rspec gems. + +### 2.8.0.rc2 / 2011-12-19 + +[Full Changelog](http://github.com/rspec/rspec-mocks/compare/v2.8.0.rc1...v2.8.0.rc2) + +No changes for this release. Just releasing with the other rspec gems. + +### 2.8.0.rc1 / 2011-11-06 + +[Full Changelog](http://github.com/rspec/rspec-mocks/compare/v2.7.0...v2.8.0.rc1) + +Enhancements + +* Eliminate Ruby warnings (Matijs van Zuijlen) + +### 2.7.0 / 2011-10-16 + +[Full Changelog](http://github.com/rspec/rspec-mocks/compare/v2.6.0...v2.7.0) + +Enhancements + +* Use `__send__` rather than `send` (alextk) +* Add support for `any_instance.stub_chain` (Sidu Ponnappa) +* Add support for `any_instance` argument matching based on `with` (Sidu + Ponnappa and Andy Lindeman) + +Changes + +* Check for `failure_message_for_should` or `failure_message` instead of + `description` to detect a matcher (Tibor Claassen) + +Bug fixes + +* pass a hash to `any_instance.stub`. (Justin Ko) +* allow `to_ary` to be called without raising `NoMethodError` (Mikhail + Dieterle) +* `any_instance` properly restores private methods (Sidu Ponnappa) + +### 2.6.0 / 2011-05-12 + +[Full Changelog](http://github.com/rspec/rspec-mocks/compare/v2.5.0...v2.6.0) + +Enhancements + +* Add support for `any_instance.stub` and `any_instance.should_receive` (Sidu + Ponnappa and Andy Lindeman) + +Bug fixes + +* fix bug in which multiple chains with shared messages ending in hashes failed + to return the correct value + +### 2.5.0 / 2011-02-05 + +[Full Changelog](http://github.com/rspec/rspec-mocks/compare/v2.4.0...v2.5.0) + +Bug fixes + +* message expectation counts now work in combination with a stub (Damian + Nurzynski) +* fix failure message when message received with incorrect args (Josep M. + Bach) + +### 2.4.0 / 2011-01-02 + +[Full Changelog](http://github.com/rspec/rspec-mocks/compare/v2.3.0...v2.4.0) + +No functional changes in this release, which was made to align with the +rspec-core-2.4.0 release. + +### 2.3.0 / 2010-12-12 + +[Full Changelog](http://github.com/rspec/rspec-mocks/compare/v2.2.0...v2.3.0) + +Bug fixes + +* Fix our Marshal extension so that it does not interfere with objects that + have their own `@mock_proxy` instance variable. (Myron Marston) + +### 2.2.0 / 2010-11-28 + +[Full Changelog](http://github.com/rspec/rspec-mocks/compare/v2.1.0...v2.2.0) + +Enhancements + +* Added "rspec/mocks/standalone" for exploring the rspec-mocks in irb. + +Bug fix + +* Eliminate warning on splat args without parens (Gioele Barabucci) +* Fix bug where `obj.should_receive(:foo).with(stub.as_null_object)` would pass + with a false positive. + +### 2.1.0 / 2010-11-07 + +[Full Changelog](http://github.com/rspec/rspec-mocks/compare/v2.0.1...v2.1.0) + +Bug fixes + +* Fix serialization of stubbed object (Josep M Bach) + +### 2.0.0 / 2010-10-10 + +[Full Changelog](http://github.com/rspec/rspec-mocks/compare/v2.0.0.beta.22...v2.0.0) + +### 2.0.0.rc / 2010-10-05 + +[Full Changelog](http://github.com/rspec/rspec-mocks/compare/v2.0.0.beta.22...v2.0.0.rc) + +Enhancements + +* support passing a block to an expectation block (Nicolas Braem) + * `obj.should_receive(:msg) {|&block| ... }` + +Bug fixes + +* Fix YAML serialization of stub (Myron Marston) +* Fix rdoc rake task (Hans de Graaff) + +### 2.0.0.beta.22 / 2010-09-12 + +[Full Changelog](http://github.com/rspec/rspec-mocks/compare/v2.0.0.beta.20...v2.0.0.beta.22) + +Bug fixes + +* fixed regression that broke `obj.stub_chain(:a, :b => :c)` +* fixed regression that broke `obj.stub_chain(:a, :b) { :c }` +* `respond_to?` always returns true when using `as_null_object` diff --git a/vendor/bundle/ruby/3.1.0/gems/rspec-mocks-3.11.1/LICENSE.md b/vendor/bundle/ruby/3.1.0/gems/rspec-mocks-3.11.1/LICENSE.md new file mode 100644 index 000000000..dae02d8a7 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/rspec-mocks-3.11.1/LICENSE.md @@ -0,0 +1,25 @@ +The MIT License (MIT) +===================== + +* Copyright © 2012 David Chelimsky, Myron Marston +* Copyright © 2006 David Chelimsky, The RSpec Development Team +* Copyright © 2005 Steven Baker + +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/vendor/bundle/ruby/3.1.0/gems/rspec-mocks-3.11.1/README.md b/vendor/bundle/ruby/3.1.0/gems/rspec-mocks-3.11.1/README.md new file mode 100644 index 000000000..c1cd5909d --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/rspec-mocks-3.11.1/README.md @@ -0,0 +1,463 @@ +# RSpec Mocks [![Build Status](https://github.com/rspec/rspec-mocks/workflows/RSpec%20CI/badge.svg)](https://github.com/rspec/rspec-mocks/actions) [![Code Climate](https://codeclimate.com/github/rspec/rspec-mocks.svg)](https://codeclimate.com/github/rspec/rspec-mocks) +rspec-mocks is a test-double framework for rspec with support for method stubs, +fakes, and message expectations on generated test-doubles and real objects +alike. + +## Install + + gem install rspec # for rspec-core, rspec-expectations, rspec-mocks + gem install rspec-mocks # for rspec-mocks only + +Want to run against the `main` branch? You'll need to include the dependent +RSpec repos as well. Add the following to your `Gemfile`: + +```ruby +%w[rspec-core rspec-expectations rspec-mocks rspec-support].each do |lib| + gem lib, :git => "https://github.com/rspec/#{lib}.git", :branch => 'main' +end +``` +## Contributing + +Once you've set up the environment, you'll need to cd into the working +directory of whichever repo you want to work in. From there you can run the +specs and cucumber features, and make patches. + +NOTE: You do not need to use rspec-dev to work on a specific RSpec repo. You +can treat each RSpec repo as an independent project. + +For information about contributing to RSpec, please refer to the following markdown files: +* [Build details](BUILD_DETAIL.md) +* [Code of Conduct](CODE_OF_CONDUCT.md) +* [Detailed contributing guide](CONTRIBUTING.md) +* [Development setup guide](DEVELOPMENT.md) + +## Test Doubles + +A test double is an object that stands in for another object in your system +during a code example. Use the `double` method, passing in an optional identifier, to create one: + +```ruby +book = double("book") +``` + +Most of the time you will want some confidence that your doubles resemble an +existing object in your system. Verifying doubles are provided for this +purpose. If the existing object is available, they will prevent you from adding +stubs and expectations for methods that do not exist or that have an invalid +number of parameters. + +```ruby +book = instance_double("Book", :pages => 250) +``` + +Verifying doubles have some clever tricks to enable you to both test in +isolation without your dependencies loaded while still being able to validate +them against real objects. More detail is available in [their +documentation](https://github.com/rspec/rspec-mocks/blob/main/features/verifying_doubles). + +Verifying doubles can also accept custom identifiers, just like double(), e.g.: + +```ruby +books = [] +books << instance_double("Book", :rspec_book, :pages => 250) +books << instance_double("Book", "(Untitled)", :pages => 5000) + +puts books.inspect # with names, it's clearer which were actually added +``` + +## Method Stubs + +A method stub is an implementation that returns a pre-determined value. Method +stubs can be declared on test doubles or real objects using the same syntax. +rspec-mocks supports 3 forms for declaring method stubs: + +```ruby +allow(book).to receive(:title) { "The RSpec Book" } +allow(book).to receive(:title).and_return("The RSpec Book") +allow(book).to receive_messages( + :title => "The RSpec Book", + :subtitle => "Behaviour-Driven Development with RSpec, Cucumber, and Friends") +``` + +You can also use this shortcut, which creates a test double and declares a +method stub in one statement: + +```ruby +book = double("book", :title => "The RSpec Book") +``` + +The first argument is a name, which is used for documentation and appears in +failure messages. If you don't care about the name, you can leave it out, +making the combined instantiation/stub declaration very terse: + +```ruby +double(:foo => 'bar') +``` + +This is particularly nice when providing a list of test doubles to a method +that iterates through them: + +```ruby +order.calculate_total_price(double(:price => 1.99), double(:price => 2.99)) +``` + +### Stubbing a chain of methods + +You can use `receive_message_chain` in place of `receive` to stub a chain of messages: + +```ruby +allow(double).to receive_message_chain("foo.bar") { :baz } +allow(double).to receive_message_chain(:foo, :bar => :baz) +allow(double).to receive_message_chain(:foo, :bar) { :baz } + +# Given any of the above forms: +double.foo.bar # => :baz +``` + +Chains can be arbitrarily long, which makes it quite painless to violate the Law of Demeter in violent ways, so you should consider any use of `receive_message_chain` a code smell. Even though not all code smells indicate real problems (think fluent interfaces), `receive_message_chain` still results in brittle examples. For example, if you write `allow(foo).to receive_message_chain(:bar, :baz => 37)` in a spec and then the implementation calls `foo.baz.bar`, the stub will not work. + +## Consecutive return values + +When a stub might be invoked more than once, you can provide additional +arguments to `and_return`. The invocations cycle through the list. The last +value is returned for any subsequent invocations: + +```ruby +allow(die).to receive(:roll).and_return(1, 2, 3) +die.roll # => 1 +die.roll # => 2 +die.roll # => 3 +die.roll # => 3 +die.roll # => 3 +``` + +To return an array in a single invocation, declare an array: + +```ruby +allow(team).to receive(:players).and_return([double(:name => "David")]) +``` + +## Message Expectations + +A message expectation is an expectation that the test double will receive a +message some time before the example ends. If the message is received, the +expectation is satisfied. If not, the example fails. + +```ruby +validator = double("validator") +expect(validator).to receive(:validate) { "02134" } +zipcode = Zipcode.new("02134", validator) +zipcode.valid? +``` + +## Test Spies + +Verifies the given object received the expected message during the course of +the test. For a message to be verified, the given object must be setup to spy +on it, either by having it explicitly stubbed or by being a null object double +(e.g. `double(...).as_null_object`). Convenience methods are provided to easily +create null object doubles for this purpose: + +```ruby +spy("invitation") # => same as `double("invitation").as_null_object` +instance_spy("Invitation") # => same as `instance_double("Invitation").as_null_object` +class_spy("Invitation") # => same as `class_double("Invitation").as_null_object` +object_spy("Invitation") # => same as `object_double("Invitation").as_null_object` +``` + +Verifying messages received in this way implements the Test Spy pattern. + +```ruby +invitation = spy('invitation') + +user.accept_invitation(invitation) + +expect(invitation).to have_received(:accept) + +# You can also use other common message expectations. For example: +expect(invitation).to have_received(:accept).with(mailer) +expect(invitation).to have_received(:accept).twice +expect(invitation).to_not have_received(:accept).with(mailer) + +# One can specify a return value on the spy the same way one would a double. +invitation = spy('invitation', :accept => true) +expect(invitation).to have_received(:accept).with(mailer) +expect(invitation.accept).to eq(true) +``` + +Note that `have_received(...).with(...)` is unable to work properly when +passed arguments are mutated after the spy records the received message. +For example, this does not work properly: + +```ruby +greeter = spy("greeter") + +message = "Hello" +greeter.greet_with(message) +message << ", World" + +expect(greeter).to have_received(:greet_with).with("Hello") +``` + +## Nomenclature + +### Mock Objects and Test Stubs + +The names Mock Object and Test Stub suggest specialized Test Doubles. i.e. +a Test Stub is a Test Double that only supports method stubs, and a Mock +Object is a Test Double that supports message expectations and method +stubs. + +There is a lot of overlapping nomenclature here, and there are many +variations of these patterns (fakes, spies, etc). Keep in mind that most of +the time we're talking about method-level concepts that are variations of +method stubs and message expectations, and we're applying to them to _one_ +generic kind of object: a Test Double. + +### Test-Specific Extension + +a.k.a. Partial Double, a Test-Specific Extension is an extension of a +real object in a system that is instrumented with test-double like +behaviour in the context of a test. This technique is very common in Ruby +because we often see class objects acting as global namespaces for methods. +For example, in Rails: + +```ruby +person = double("person") +allow(Person).to receive(:find) { person } +``` + +In this case we're instrumenting Person to return the person object we've +defined whenever it receives the `find` message. We can also set a message +expectation so that the example fails if `find` is not called: + +```ruby +person = double("person") +expect(Person).to receive(:find) { person } +``` + +RSpec replaces the method we're stubbing or mocking with its own +test-double-like method. At the end of the example, RSpec verifies any message +expectations, and then restores the original methods. + +## Expecting Arguments + +```ruby +expect(double).to receive(:msg).with(*args) +expect(double).to_not receive(:msg).with(*args) +``` + +You can set multiple expectations for the same message if you need to: + +```ruby +expect(double).to receive(:msg).with("A", 1, 3) +expect(double).to receive(:msg).with("B", 2, 4) +``` + +## Argument Matchers + +Arguments that are passed to `with` are compared with actual arguments +received using ===. In cases in which you want to specify things about the +arguments rather than the arguments themselves, you can use any of the +matchers that ship with rspec-expectations. They don't all make syntactic +sense (they were primarily designed for use with RSpec::Expectations), but +you are free to create your own custom RSpec::Matchers. + +rspec-mocks also adds some keyword Symbols that you can use to +specify certain kinds of arguments: + +```ruby +expect(double).to receive(:msg).with(no_args) +expect(double).to receive(:msg).with(any_args) +expect(double).to receive(:msg).with(1, any_args) # any args acts like an arg splat and can go anywhere +expect(double).to receive(:msg).with(1, kind_of(Numeric), "b") #2nd argument can be any kind of Numeric +expect(double).to receive(:msg).with(1, boolean(), "b") #2nd argument can be true or false +expect(double).to receive(:msg).with(1, /abc/, "b") #2nd argument can be any String matching the submitted Regexp +expect(double).to receive(:msg).with(1, anything(), "b") #2nd argument can be anything at all +expect(double).to receive(:msg).with(1, duck_type(:abs, :div), "b") #2nd argument can be object that responds to #abs and #div +expect(double).to receive(:msg).with(hash_including(:a => 5)) # first arg is a hash with a: 5 as one of the key-values +expect(double).to receive(:msg).with(array_including(5)) # first arg is an array with 5 as one of the key-values +expect(double).to receive(:msg).with(hash_excluding(:a => 5)) # first arg is a hash without a: 5 as one of the key-values +``` + +## Receive Counts + +```ruby +expect(double).to receive(:msg).once +expect(double).to receive(:msg).twice +expect(double).to receive(:msg).exactly(n).time +expect(double).to receive(:msg).exactly(n).times +expect(double).to receive(:msg).at_least(:once) +expect(double).to receive(:msg).at_least(:twice) +expect(double).to receive(:msg).at_least(n).time +expect(double).to receive(:msg).at_least(n).times +expect(double).to receive(:msg).at_most(:once) +expect(double).to receive(:msg).at_most(:twice) +expect(double).to receive(:msg).at_most(n).time +expect(double).to receive(:msg).at_most(n).times +``` + +## Ordering + +```ruby +expect(double).to receive(:msg).ordered +expect(double).to receive(:other_msg).ordered + # This will fail if the messages are received out of order +``` + +This can include the same message with different arguments: + +```ruby +expect(double).to receive(:msg).with("A", 1, 3).ordered +expect(double).to receive(:msg).with("B", 2, 4).ordered +``` + +## Setting Responses + +Whether you are setting a message expectation or a method stub, you can +tell the object precisely how to respond. The most generic way is to pass +a block to `receive`: + +```ruby +expect(double).to receive(:msg) { value } +``` + +When the double receives the `msg` message, it evaluates the block and returns +the result. + +```ruby +expect(double).to receive(:msg).and_return(value) +expect(double).to receive(:msg).exactly(3).times.and_return(value1, value2, value3) + # returns value1 the first time, value2 the second, etc +expect(double).to receive(:msg).and_raise(error) + # `error` can be an instantiated object (e.g. `StandardError.new(some_arg)`) or a class (e.g. `StandardError`) + # if it is a class, it must be instantiable with no args +expect(double).to receive(:msg).and_throw(:msg) +expect(double).to receive(:msg).and_yield(values, to, yield) +expect(double).to receive(:msg).and_yield(values, to, yield).and_yield(some, other, values, this, time) + # for methods that yield to a block multiple times +``` + +Any of these responses can be applied to a stub as well + +```ruby +allow(double).to receive(:msg).and_return(value) +allow(double).to receive(:msg).and_return(value1, value2, value3) +allow(double).to receive(:msg).and_raise(error) +allow(double).to receive(:msg).and_throw(:msg) +allow(double).to receive(:msg).and_yield(values, to, yield) +allow(double).to receive(:msg).and_yield(values, to, yield).and_yield(some, other, values, this, time) +``` + +## Arbitrary Handling + +Once in a while you'll find that the available expectations don't solve the +particular problem you are trying to solve. Imagine that you expect the message +to come with an Array argument that has a specific length, but you don't care +what is in it. You could do this: + +```ruby +expect(double).to receive(:msg) do |arg| + expect(arg.size).to eq 7 +end +``` + +If the method being stubbed itself takes a block, and you need to yield to it +in some special way, you can use this: + +```ruby +expect(double).to receive(:msg) do |&arg| + begin + arg.call + ensure + # cleanup + end +end +``` + +## Delegating to the Original Implementation + +When working with a partial mock object, you may occasionally +want to set a message expectation without interfering with how +the object responds to the message. You can use `and_call_original` +to achieve this: + +```ruby +expect(Person).to receive(:find).and_call_original +Person.find # => executes the original find method and returns the result +``` + +## Combining Expectation Details + +Combining the message name with specific arguments, receive counts and responses +you can get quite a bit of detail in your expectations: + +```ruby +expect(double).to receive(:<<).with("illegal value").once.and_raise(ArgumentError) +``` + +While this is a good thing when you really need it, you probably don't really +need it! Take care to specify only the things that matter to the behavior of +your code. + +## Stubbing and Hiding Constants + +See the [mutating constants +README](https://github.com/rspec/rspec-mocks/blob/main/features/mutating_constants/README.md) +for info on this feature. + +## Use `before(:example)`, not `before(:context)` + +Stubs in `before(:context)` are not supported. The reason is that all stubs and mocks get cleared out after each example, so any stub that is set in `before(:context)` would work in the first example that happens to run in that group, but not for any others. + +Instead of `before(:context)`, use `before(:example)`. + +## Settings mocks or stubs on any instance of a class + +rspec-mocks provides two methods, `allow_any_instance_of` and +`expect_any_instance_of`, that will allow you to stub or mock any instance +of a class. They are used in place of `allow` or `expect`: + +```ruby +allow_any_instance_of(Widget).to receive(:name).and_return("Wibble") +expect_any_instance_of(Widget).to receive(:name).and_return("Wobble") +``` + +These methods add the appropriate stub or expectation to all instances of +`Widget`. + +This feature is sometimes useful when working with legacy code, though in +general we discourage its use for a number of reasons: + +* The `rspec-mocks` API is designed for individual object instances, but this + feature operates on entire classes of objects. As a result there are some + semantically confusing edge cases. For example in + `expect_any_instance_of(Widget).to receive(:name).twice` it isn't clear + whether each specific instance is expected to receive `name` twice, or if two + receives total are expected. (It's the former.) +* Using this feature is often a design smell. It may be + that your test is trying to do too much or that the object under test is too + complex. +* It is the most complicated feature of `rspec-mocks`, and has historically + received the most bug reports. (None of the core team actively use it, + which doesn't help.) + + +## Further Reading + +There are many different viewpoints about the meaning of mocks and stubs. If +you are interested in learning more, here is some recommended reading: + +* Mock Objects: http://www.mockobjects.com/ +* Endo-Testing: http://www.ccs.neu.edu/research/demeter/related-work/extreme-programming/MockObjectsFinal.PDF +* Mock Roles, Not Objects: http://www.jmock.org/oopsla2004.pdf +* Test Double: http://www.martinfowler.com/bliki/TestDouble.html +* Test Double Patterns: http://xunitpatterns.com/Test%20Double%20Patterns.html +* Mocks aren't stubs: http://www.martinfowler.com/articles/mocksArentStubs.html + +## Also see + +* [https://github.com/rspec/rspec](https://github.com/rspec/rspec) +* [https://github.com/rspec/rspec-core](https://github.com/rspec/rspec-core) +* [https://github.com/rspec/rspec-expectations](https://github.com/rspec/rspec-expectations) +* [https://github.com/rspec/rspec-rails](https://github.com/rspec/rspec-rails) diff --git a/vendor/bundle/ruby/3.1.0/gems/rspec-mocks-3.11.1/lib/rspec/mocks.rb b/vendor/bundle/ruby/3.1.0/gems/rspec-mocks-3.11.1/lib/rspec/mocks.rb new file mode 100644 index 000000000..297779e5a --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/rspec-mocks-3.11.1/lib/rspec/mocks.rb @@ -0,0 +1,133 @@ +require 'rspec/support' +RSpec::Support.require_rspec_support 'caller_filter' +RSpec::Support.require_rspec_support 'warnings' +RSpec::Support.require_rspec_support 'ruby_features' + +RSpec::Support.define_optimized_require_for_rspec(:mocks) { |f| require_relative f } + +%w[ + instance_method_stasher + method_double + argument_matchers + example_methods + proxy + test_double + argument_list_matcher + message_expectation + order_group + error_generator + space + mutate_const + targets + syntax + configuration + verifying_double + version +].each { |name| RSpec::Support.require_rspec_mocks name } + +# Share the top-level RSpec namespace, because we are a core supported +# extension. +module RSpec + # Contains top-level utility methods. While this contains a few + # public methods, these are not generally meant to be called from + # a test or example. They exist primarily for integration with + # test frameworks (such as rspec-core). + module Mocks + # Performs per-test/example setup. This should be called before + # an test or example begins. + def self.setup + @space_stack << (@space = space.new_scope) + end + + # Verifies any message expectations that were set during the + # test or example. This should be called at the end of an example. + def self.verify + space.verify_all + end + + # Cleans up all test double state (including any methods that were + # redefined on partial doubles). This _must_ be called after + # each example, even if an error was raised during the example. + def self.teardown + space.reset_all + @space_stack.pop + @space = @space_stack.last || @root_space + end + + # Adds an allowance (stub) on `subject` + # + # @param subject the subject to which the message will be added + # @param message a symbol, representing the message that will be + # added. + # @param opts a hash of options, :expected_from is used to set the + # original call site + # @yield an optional implementation for the allowance + # + # @example Defines the implementation of `foo` on `bar`, using the passed block + # x = 0 + # RSpec::Mocks.allow_message(bar, :foo) { x += 1 } + def self.allow_message(subject, message, opts={}, &block) + space.proxy_for(subject).add_stub(message, opts, &block) + end + + # Sets a message expectation on `subject`. + # @param subject the subject on which the message will be expected + # @param message a symbol, representing the message that will be + # expected. + # @param opts a hash of options, :expected_from is used to set the + # original call site + # @yield an optional implementation for the expectation + # + # @example Expect the message `foo` to receive `bar`, then call it + # RSpec::Mocks.expect_message(bar, :foo) + # bar.foo + def self.expect_message(subject, message, opts={}, &block) + space.proxy_for(subject).add_message_expectation(message, opts, &block) + end + + # Call the passed block and verify mocks after it has executed. This allows + # mock usage in arbitrary places, such as a `before(:all)` hook. + # + # @return [Object] the return value from the block + def self.with_temporary_scope + setup + + begin + result = yield + verify + result + ensure + teardown + end + end + + class << self + # @private + attr_reader :space + end + @space_stack = [] + @root_space = @space = RSpec::Mocks::RootSpace.new + + # @private + IGNORED_BACKTRACE_LINE = 'this backtrace line is ignored' + + # To speed up boot time a bit, delay loading optional or rarely + # used features until their first use. + autoload :AnyInstance, "rspec/mocks/any_instance" + autoload :ExpectChain, "rspec/mocks/message_chain" + autoload :StubChain, "rspec/mocks/message_chain" + autoload :MarshalExtension, "rspec/mocks/marshal_extension" + + # Namespace for mock-related matchers. + module Matchers + # @private + # just a "tag" for rspec-mock matchers detection + module Matcher; end + + autoload :HaveReceived, "rspec/mocks/matchers/have_received" + autoload :Receive, "rspec/mocks/matchers/receive" + autoload :ReceiveMessageChain, "rspec/mocks/matchers/receive_message_chain" + autoload :ReceiveMessages, "rspec/mocks/matchers/receive_messages" + end + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/rspec-mocks-3.11.1/lib/rspec/mocks/any_instance.rb b/vendor/bundle/ruby/3.1.0/gems/rspec-mocks-3.11.1/lib/rspec/mocks/any_instance.rb new file mode 100644 index 000000000..41eae8146 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/rspec-mocks-3.11.1/lib/rspec/mocks/any_instance.rb @@ -0,0 +1,11 @@ +%w[ + any_instance/chain + any_instance/error_generator + any_instance/stub_chain + any_instance/stub_chain_chain + any_instance/expect_chain_chain + any_instance/expectation_chain + any_instance/message_chains + any_instance/recorder + any_instance/proxy +].each { |f| RSpec::Support.require_rspec_mocks(f) } diff --git a/vendor/bundle/ruby/3.1.0/gems/rspec-mocks-3.11.1/lib/rspec/mocks/any_instance/chain.rb b/vendor/bundle/ruby/3.1.0/gems/rspec-mocks-3.11.1/lib/rspec/mocks/any_instance/chain.rb new file mode 100644 index 000000000..74d864b3a --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/rspec-mocks-3.11.1/lib/rspec/mocks/any_instance/chain.rb @@ -0,0 +1,111 @@ +module RSpec + module Mocks + # @private + module AnyInstance + # @private + class Chain + def initialize(recorder, *args, &block) + @recorder = recorder + @expectation_args = args + @expectation_block = block + @argument_list_matcher = ArgumentListMatcher::MATCH_ALL + end + + # @private + # + # Provides convenience methods for recording customizations on message + # expectations. + module Customizations + # @macro [attach] record + # @method $1(*args, &block) + # Records the `$1` message for playback against an instance that + # invokes a method stubbed or mocked using `any_instance`. + # + # @see RSpec::Mocks::MessageExpectation#$1 + # + def self.record(method_name) + define_method(method_name) do |*args, &block| + record(method_name, *args, &block) + end + end + + record :and_return + record :and_raise + record :and_throw + record :and_yield + record :and_call_original + record :and_wrap_original + record :with + record :once + record :twice + record :thrice + record :exactly + record :times + record :time + record :never + record :at_least + record :at_most + end + + include Customizations + + # @private + def playback!(instance) + message_expectation = create_message_expectation_on(instance) + messages.inject(message_expectation) do |object, message| + object.__send__(*message.first, &message.last) + end + end + + # @private + def constrained_to_any_of?(*constraints) + constraints.any? do |constraint| + messages.any? do |message| + message.first.first == constraint + end + end + end + + # @private + def matches_args?(*args) + @argument_list_matcher.args_match?(*args) + end + + # @private + def expectation_fulfilled! + @expectation_fulfilled = true + end + + def never + AnyInstance.error_generator.raise_double_negation_error("expect_any_instance_of(MyClass)") if negated? + super + end + + def with(*args, &block) + @argument_list_matcher = ArgumentListMatcher.new(*args) + super + end + + private + + def negated? + messages.any? { |(message, *_), _| message == :never } + end + + def messages + @messages ||= [] + end + + def last_message + messages.last.first.first unless messages.empty? + end + + def record(rspec_method_name, *args, &block) + verify_invocation_order(rspec_method_name, *args, &block) + messages << [args.unshift(rspec_method_name), block] + self + end + end + end + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/rspec-mocks-3.11.1/lib/rspec/mocks/any_instance/error_generator.rb b/vendor/bundle/ruby/3.1.0/gems/rspec-mocks-3.11.1/lib/rspec/mocks/any_instance/error_generator.rb new file mode 100644 index 000000000..d1046cb0b --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/rspec-mocks-3.11.1/lib/rspec/mocks/any_instance/error_generator.rb @@ -0,0 +1,31 @@ +module RSpec + module Mocks + module AnyInstance + # @private + class ErrorGenerator < ::RSpec::Mocks::ErrorGenerator + def raise_second_instance_received_message_error(unfulfilled_expectations) + __raise "Exactly one instance should have received the following " \ + "message(s) but didn't: #{unfulfilled_expectations.sort.join(', ')}" + end + + def raise_does_not_implement_error(klass, method_name) + __raise "#{klass} does not implement ##{method_name}" + end + + def raise_message_already_received_by_other_instance_error(method_name, object_inspect, invoked_instance) + __raise "The message '#{method_name}' was received by #{object_inspect} " \ + "but has already been received by #{invoked_instance}" + end + + def raise_not_supported_with_prepend_error(method_name, problem_mod) + __raise "Using `any_instance` to stub a method (#{method_name}) that has been " \ + "defined on a prepended module (#{problem_mod}) is not supported." + end + end + + def self.error_generator + @error_generator ||= ErrorGenerator.new + end + end + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/rspec-mocks-3.11.1/lib/rspec/mocks/any_instance/expect_chain_chain.rb b/vendor/bundle/ruby/3.1.0/gems/rspec-mocks-3.11.1/lib/rspec/mocks/any_instance/expect_chain_chain.rb new file mode 100644 index 000000000..c467ba93a --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/rspec-mocks-3.11.1/lib/rspec/mocks/any_instance/expect_chain_chain.rb @@ -0,0 +1,31 @@ +module RSpec + module Mocks + module AnyInstance + # @private + class ExpectChainChain < StubChain + def initialize(*args) + super + @expectation_fulfilled = false + end + + def expectation_fulfilled? + @expectation_fulfilled + end + + def playback!(instance) + super.tap { @expectation_fulfilled = true } + end + + private + + def create_message_expectation_on(instance) + ::RSpec::Mocks::ExpectChain.expect_chain_on(instance, *@expectation_args, &@expectation_block) + end + + def invocation_order + EmptyInvocationOrder + end + end + end + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/rspec-mocks-3.11.1/lib/rspec/mocks/any_instance/expectation_chain.rb b/vendor/bundle/ruby/3.1.0/gems/rspec-mocks-3.11.1/lib/rspec/mocks/any_instance/expectation_chain.rb new file mode 100644 index 000000000..edf854826 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/rspec-mocks-3.11.1/lib/rspec/mocks/any_instance/expectation_chain.rb @@ -0,0 +1,50 @@ +module RSpec + module Mocks + module AnyInstance + # @private + class ExpectationChain < Chain + def expectation_fulfilled? + @expectation_fulfilled || constrained_to_any_of?(:never) + end + + def initialize(*args, &block) + @expectation_fulfilled = false + super + end + + private + + def verify_invocation_order(_rspec_method_name, *_args, &_block) + end + end + + # @private + class PositiveExpectationChain < ExpectationChain + private + + def create_message_expectation_on(instance) + proxy = ::RSpec::Mocks.space.proxy_for(instance) + method_name, opts = @expectation_args + opts = (opts || {}).merge(:expected_form => IGNORED_BACKTRACE_LINE) + + me = proxy.add_message_expectation(method_name, opts, &@expectation_block) + if RSpec::Mocks.configuration.yield_receiver_to_any_instance_implementation_blocks? + me.and_yield_receiver_to_implementation + end + + me + end + + ExpectationInvocationOrder = + { + :and_return => [:with, nil], + :and_raise => [:with, nil], + }.freeze + + def invocation_order + ExpectationInvocationOrder + end + end + end + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/rspec-mocks-3.11.1/lib/rspec/mocks/any_instance/message_chains.rb b/vendor/bundle/ruby/3.1.0/gems/rspec-mocks-3.11.1/lib/rspec/mocks/any_instance/message_chains.rb new file mode 100644 index 000000000..7298643d5 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/rspec-mocks-3.11.1/lib/rspec/mocks/any_instance/message_chains.rb @@ -0,0 +1,83 @@ +module RSpec + module Mocks + module AnyInstance + # @private + class MessageChains + def initialize + @chains_by_method_name = Hash.new { |h, k| h[k] = [] } + end + + # @private + def [](method_name) + @chains_by_method_name[method_name] + end + + # @private + def add(method_name, chain) + @chains_by_method_name[method_name] << chain + chain + end + + # @private + def remove_stub_chains_for!(method_name) + @chains_by_method_name[method_name].reject! do |chain| + StubChain === chain + end + end + + # @private + def has_expectation?(method_name) + @chains_by_method_name[method_name].find do |chain| + ExpectationChain === chain + end + end + + # @private + def each_unfulfilled_expectation_matching(method_name, *args) + @chains_by_method_name[method_name].each do |chain| + yield chain if !chain.expectation_fulfilled? && chain.matches_args?(*args) + end + end + + # @private + def all_expectations_fulfilled? + @chains_by_method_name.all? do |_method_name, chains| + chains.all? { |chain| chain.expectation_fulfilled? } + end + end + + # @private + def unfulfilled_expectations + @chains_by_method_name.map do |method_name, chains| + method_name.to_s if ExpectationChain === chains.last unless chains.last.expectation_fulfilled? + end.compact + end + + # @private + def received_expected_message!(method_name) + @chains_by_method_name[method_name].each do |chain| + chain.expectation_fulfilled! + end + end + + # @private + def playback!(instance, method_name) + raise_if_second_instance_to_receive_message(instance) + @chains_by_method_name[method_name].each do |chain| + chain.playback!(instance) + end + end + + private + + def raise_if_second_instance_to_receive_message(instance) + @instance_with_expectation ||= instance if ExpectationChain === instance + return unless ExpectationChain === instance + return if @instance_with_expectation.equal?(instance) + + AnyInstance.error_generator.raise_second_instance_received_message_error(unfulfilled_expectations) + end + end + end + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/rspec-mocks-3.11.1/lib/rspec/mocks/any_instance/proxy.rb b/vendor/bundle/ruby/3.1.0/gems/rspec-mocks-3.11.1/lib/rspec/mocks/any_instance/proxy.rb new file mode 100644 index 000000000..fc66d392a --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/rspec-mocks-3.11.1/lib/rspec/mocks/any_instance/proxy.rb @@ -0,0 +1,116 @@ +module RSpec + module Mocks + module AnyInstance + # @private + # The `AnyInstance::Recorder` is responsible for redefining the klass's + # instance method in order to add any stubs/expectations the first time + # the method is called. It's not capable of updating a stub on an instance + # that's already been previously stubbed (either directly, or via + # `any_instance`). + # + # This proxy sits in front of the recorder and delegates both to it + # and to the `RSpec::Mocks::Proxy` for each already mocked or stubbed + # instance of the class, in order to propogates changes to the instances. + # + # Note that unlike `RSpec::Mocks::Proxy`, this proxy class is stateless + # and is not persisted in `RSpec::Mocks.space`. + # + # Proxying for the message expectation fluent interface (typically chained + # off of the return value of one of these methods) is provided by the + # `FluentInterfaceProxy` class below. + class Proxy + def initialize(recorder, target_proxies) + @recorder = recorder + @target_proxies = target_proxies + end + + def klass + @recorder.klass + end + + def stub(method_name_or_method_map, &block) + if Hash === method_name_or_method_map + method_name_or_method_map.each do |method_name, return_value| + stub(method_name).and_return(return_value) + end + else + perform_proxying(__method__, [method_name_or_method_map], block) do |proxy| + proxy.add_stub(method_name_or_method_map, &block) + end + end + end + + def unstub(method_name) + perform_proxying(__method__, [method_name], nil) do |proxy| + proxy.remove_stub_if_present(method_name) + end + end + + def stub_chain(*chain, &block) + perform_proxying(__method__, chain, block) do |proxy| + Mocks::StubChain.stub_chain_on(proxy.object, *chain, &block) + end + end + + def expect_chain(*chain, &block) + perform_proxying(__method__, chain, block) do |proxy| + Mocks::ExpectChain.expect_chain_on(proxy.object, *chain, &block) + end + end + + def should_receive(method_name, &block) + perform_proxying(__method__, [method_name], block) do |proxy| + # Yeah, this is a bit odd...but if we used `add_message_expectation` + # then it would act like `expect_every_instance_of(klass).to receive`. + # The any_instance recorder takes care of validating that an instance + # received the message. + proxy.add_stub(method_name, &block) + end + end + + def should_not_receive(method_name, &block) + perform_proxying(__method__, [method_name], block) do |proxy| + proxy.add_message_expectation(method_name, &block).never + end + end + + private + + def perform_proxying(method_name, args, block, &target_proxy_block) + recorder_value = @recorder.__send__(method_name, *args, &block) + proxy_values = @target_proxies.map(&target_proxy_block) + FluentInterfaceProxy.new([recorder_value] + proxy_values) + end + end + + # @private + # Delegates messages to each of the given targets in order to + # provide the fluent interface that is available off of message + # expectations when dealing with `any_instance`. + # + # `targets` will typically contain 1 of the `AnyInstance::Recorder` + # return values and N `MessageExpectation` instances (one per instance + # of the `any_instance` klass). + class FluentInterfaceProxy + def initialize(targets) + @targets = targets + end + + if RUBY_VERSION.to_f > 1.8 + def respond_to_missing?(method_name, include_private=false) + super || @targets.first.respond_to?(method_name, include_private) + end + else + def respond_to?(method_name, include_private=false) + super || @targets.first.respond_to?(method_name, include_private) + end + end + + def method_missing(*args, &block) + return_values = @targets.map { |t| t.__send__(*args, &block) } + FluentInterfaceProxy.new(return_values) + end + end + end + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/rspec-mocks-3.11.1/lib/rspec/mocks/any_instance/recorder.rb b/vendor/bundle/ruby/3.1.0/gems/rspec-mocks-3.11.1/lib/rspec/mocks/any_instance/recorder.rb new file mode 100644 index 000000000..aad6ed4c8 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/rspec-mocks-3.11.1/lib/rspec/mocks/any_instance/recorder.rb @@ -0,0 +1,295 @@ +module RSpec + module Mocks + module AnyInstance + # Given a class `TheClass`, `TheClass.any_instance` returns a `Recorder`, + # which records stubs and message expectations for later playback on + # instances of `TheClass`. + # + # Further constraints are stored in instances of [Chain](Chain). + # + # @see AnyInstance + # @see Chain + class Recorder + # @private + attr_reader :message_chains, :stubs, :klass + + def initialize(klass) + @message_chains = MessageChains.new + @stubs = Hash.new { |hash, key| hash[key] = [] } + @observed_methods = [] + @played_methods = {} + @backed_up_method_owner = {} + @klass = klass + @expectation_set = false + + return unless RSpec::Mocks.configuration.verify_partial_doubles? + RSpec::Mocks.configuration.verifying_double_callbacks.each do |block| + block.call(ObjectReference.for(klass)) + end + end + + # Initializes the recording a stub to be played back against any + # instance of this object that invokes the submitted method. + # + # @see Methods#stub + def stub(method_name, &block) + observe!(method_name) + message_chains.add(method_name, StubChain.new(self, method_name, &block)) + end + + # Initializes the recording a stub chain to be played back against any + # instance of this object that invokes the method matching the first + # argument. + # + # @see Methods#stub_chain + def stub_chain(*method_names_and_optional_return_values, &block) + normalize_chain(*method_names_and_optional_return_values) do |method_name, args| + observe!(method_name) + message_chains.add(method_name, StubChainChain.new(self, *args, &block)) + end + end + + # @private + def expect_chain(*method_names_and_optional_return_values, &block) + @expectation_set = true + normalize_chain(*method_names_and_optional_return_values) do |method_name, args| + observe!(method_name) + message_chains.add(method_name, ExpectChainChain.new(self, *args, &block)) + end + end + + # Initializes the recording a message expectation to be played back + # against any instance of this object that invokes the submitted + # method. + # + # @see Methods#should_receive + def should_receive(method_name, &block) + @expectation_set = true + observe!(method_name) + message_chains.add(method_name, PositiveExpectationChain.new(self, method_name, &block)) + end + + # The opposite of `should_receive` + # + # @see Methods#should_not_receive + def should_not_receive(method_name, &block) + should_receive(method_name, &block).never + end + + # Removes any previously recorded stubs, stub_chains or message + # expectations that use `method_name`. + # + # @see Methods#unstub + def unstub(method_name) + unless @observed_methods.include?(method_name.to_sym) + AnyInstance.error_generator.raise_method_not_stubbed_error(method_name) + end + message_chains.remove_stub_chains_for!(method_name) + stubs[method_name].clear + stop_observing!(method_name) unless message_chains.has_expectation?(method_name) + end + + # @api private + # + # Used internally to verify that message expectations have been + # fulfilled. + def verify + return unless @expectation_set + return if message_chains.all_expectations_fulfilled? + + AnyInstance.error_generator.raise_second_instance_received_message_error(message_chains.unfulfilled_expectations) + end + + # @private + def stop_all_observation! + @observed_methods.each { |method_name| restore_method!(method_name) } + end + + # @private + def playback!(instance, method_name) + RSpec::Mocks.space.ensure_registered(instance) + message_chains.playback!(instance, method_name) + @played_methods[method_name] = instance + received_expected_message!(method_name) if message_chains.has_expectation?(method_name) + end + + # @private + def instance_that_received(method_name) + @played_methods[method_name] + end + + # @private + def build_alias_method_name(method_name) + "__#{method_name}_without_any_instance__" + end + + # @private + def already_observing?(method_name) + @observed_methods.include?(method_name) || super_class_observing?(method_name) + end + + # @private + def notify_received_message(_object, message, args, _blk) + has_expectation = false + + message_chains.each_unfulfilled_expectation_matching(message, *args) do |expectation| + has_expectation = true + expectation.expectation_fulfilled! + end + + return unless has_expectation + + restore_method!(message) + mark_invoked!(message) + end + + protected + + def stop_observing!(method_name) + restore_method!(method_name) + @observed_methods.delete(method_name) + super_class_observers_for(method_name).each do |ancestor| + ::RSpec::Mocks.space. + any_instance_recorder_for(ancestor).stop_observing!(method_name) + end + end + + private + + def ancestor_is_an_observer?(method_name) + lambda do |ancestor| + unless ancestor == @klass + ::RSpec::Mocks.space. + any_instance_recorder_for(ancestor).already_observing?(method_name) + end + end + end + + def super_class_observers_for(method_name) + @klass.ancestors.select(&ancestor_is_an_observer?(method_name)) + end + + def super_class_observing?(method_name) + @klass.ancestors.any?(&ancestor_is_an_observer?(method_name)) + end + + def normalize_chain(*args) + args.shift.to_s.split('.').map { |s| s.to_sym }.reverse.each { |a| args.unshift a } + yield args.first, args + end + + def received_expected_message!(method_name) + message_chains.received_expected_message!(method_name) + restore_method!(method_name) + mark_invoked!(method_name) + end + + def restore_method!(method_name) + if public_protected_or_private_method_defined?(build_alias_method_name(method_name)) + restore_original_method!(method_name) + else + remove_dummy_method!(method_name) + end + end + + def restore_original_method!(method_name) + return unless @klass.instance_method(method_name).owner == @klass + + alias_method_name = build_alias_method_name(method_name) + @klass.class_exec(@backed_up_method_owner) do |backed_up_method_owner| + remove_method method_name + + # A @klass can have methods implemented (see Method#owner) in @klass + # or inherited from a superclass. In ruby 2.2 and earlier, we can copy + # a method regardless of the 'owner' and restore it to @klass after + # because a call to 'super' from @klass's copied method would end up + # calling the original class's superclass's method. + # + # With the commit below, available starting in 2.3.0, ruby changed + # this behavior and a call to 'super' from the method copied to @klass + # will call @klass's superclass method, which is the original + # implementer of this method! This leads to very strange errors + # if @klass's copied method calls 'super', since it would end up + # calling itself, the original method implemented in @klass's + # superclass. + # + # For ruby 2.3 and above, we need to only restore methods that + # @klass originally owned. + # + # https://github.com/ruby/ruby/commit/c8854d2ca4be9ee6946e6d17b0e17d9ef130ee81 + if RUBY_VERSION < "2.3" || backed_up_method_owner[method_name.to_sym] == self + alias_method method_name, alias_method_name + end + remove_method alias_method_name + end + end + + def remove_dummy_method!(method_name) + @klass.class_exec do + remove_method method_name + end + end + + def backup_method!(method_name) + return unless public_protected_or_private_method_defined?(method_name) + + alias_method_name = build_alias_method_name(method_name) + @backed_up_method_owner[method_name.to_sym] ||= @klass.instance_method(method_name).owner + @klass.class_exec do + alias_method alias_method_name, method_name + end + end + + def public_protected_or_private_method_defined?(method_name) + MethodReference.method_defined_at_any_visibility?(@klass, method_name) + end + + def observe!(method_name) + allow_no_prepended_module_definition_of(method_name) + + if RSpec::Mocks.configuration.verify_partial_doubles? && !Mocks.configuration.temporarily_suppress_partial_double_verification + unless public_protected_or_private_method_defined?(method_name) + AnyInstance.error_generator.raise_does_not_implement_error(@klass, method_name) + end + end + + stop_observing!(method_name) if already_observing?(method_name) + @observed_methods << method_name + backup_method!(method_name) + recorder = self + @klass.__send__(:define_method, method_name) do |*args, &blk| + recorder.playback!(self, method_name) + __send__(method_name, *args, &blk) + end + @klass.__send__(:ruby2_keywords, method_name) if @klass.respond_to?(:ruby2_keywords, true) + end + + def mark_invoked!(method_name) + backup_method!(method_name) + recorder = self + @klass.__send__(:define_method, method_name) do |*_args, &_blk| + invoked_instance = recorder.instance_that_received(method_name) + inspect = "#<#{self.class}:#{object_id} #{instance_variables.map { |name| "#{name}=#{instance_variable_get name}" }.join(', ')}>" + AnyInstance.error_generator.raise_message_already_received_by_other_instance_error( + method_name, inspect, invoked_instance + ) + end + end + + if Support::RubyFeatures.module_prepends_supported? + def allow_no_prepended_module_definition_of(method_name) + prepended_modules = RSpec::Mocks::Proxy.prepended_modules_of(@klass) + problem_mod = prepended_modules.find { |mod| mod.method_defined?(method_name) } + return unless problem_mod + + AnyInstance.error_generator.raise_not_supported_with_prepend_error(method_name, problem_mod) + end + else + def allow_no_prepended_module_definition_of(_method_name) + # nothing to do; prepends aren't supported on this version of ruby + end + end + end + end + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/rspec-mocks-3.11.1/lib/rspec/mocks/any_instance/stub_chain.rb b/vendor/bundle/ruby/3.1.0/gems/rspec-mocks-3.11.1/lib/rspec/mocks/any_instance/stub_chain.rb new file mode 100644 index 000000000..c4c0ab748 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/rspec-mocks-3.11.1/lib/rspec/mocks/any_instance/stub_chain.rb @@ -0,0 +1,51 @@ +module RSpec + module Mocks + module AnyInstance + # @private + class StubChain < Chain + # @private + def expectation_fulfilled? + true + end + + private + + def create_message_expectation_on(instance) + proxy = ::RSpec::Mocks.space.proxy_for(instance) + method_name, opts = @expectation_args + opts = (opts || {}).merge(:expected_form => IGNORED_BACKTRACE_LINE) + + stub = proxy.add_stub(method_name, opts, &@expectation_block) + @recorder.stubs[stub.message] << stub + + if RSpec::Mocks.configuration.yield_receiver_to_any_instance_implementation_blocks? + stub.and_yield_receiver_to_implementation + end + + stub + end + + InvocationOrder = + { + :and_return => [:with, nil], + :and_raise => [:with, nil], + :and_yield => [:with, :and_yield, nil], + :and_throw => [:with, nil], + :and_call_original => [:with, nil], + :and_wrap_original => [:with, nil] + }.freeze + + EmptyInvocationOrder = {}.freeze + + def invocation_order + InvocationOrder + end + + def verify_invocation_order(rspec_method_name, *_args, &_block) + return if invocation_order.fetch(rspec_method_name, [nil]).include?(last_message) + raise NoMethodError, "Undefined method #{rspec_method_name}" + end + end + end + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/rspec-mocks-3.11.1/lib/rspec/mocks/any_instance/stub_chain_chain.rb b/vendor/bundle/ruby/3.1.0/gems/rspec-mocks-3.11.1/lib/rspec/mocks/any_instance/stub_chain_chain.rb new file mode 100644 index 000000000..495511c09 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/rspec-mocks-3.11.1/lib/rspec/mocks/any_instance/stub_chain_chain.rb @@ -0,0 +1,23 @@ +module RSpec + module Mocks + module AnyInstance + # @private + class StubChainChain < StubChain + def initialize(*args) + super + @expectation_fulfilled = false + end + + private + + def create_message_expectation_on(instance) + ::RSpec::Mocks::StubChain.stub_chain_on(instance, *@expectation_args, &@expectation_block) + end + + def invocation_order + EmptyInvocationOrder + end + end + end + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/rspec-mocks-3.11.1/lib/rspec/mocks/argument_list_matcher.rb b/vendor/bundle/ruby/3.1.0/gems/rspec-mocks-3.11.1/lib/rspec/mocks/argument_list_matcher.rb new file mode 100644 index 000000000..af98478e7 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/rspec-mocks-3.11.1/lib/rspec/mocks/argument_list_matcher.rb @@ -0,0 +1,115 @@ +# We intentionally do not use the `RSpec::Support.require...` methods +# here so that this file can be loaded individually, as documented +# below. +require 'rspec/mocks/argument_matchers' +require 'rspec/support/fuzzy_matcher' + +module RSpec + module Mocks + # Wrapper for matching arguments against a list of expected values. Used by + # the `with` method on a `MessageExpectation`: + # + # expect(object).to receive(:message).with(:a, 'b', 3) + # object.message(:a, 'b', 3) + # + # Values passed to `with` can be literal values or argument matchers that + # match against the real objects .e.g. + # + # expect(object).to receive(:message).with(hash_including(:a => 'b')) + # + # Can also be used directly to match the contents of any `Array`. This + # enables 3rd party mocking libs to take advantage of rspec's argument + # matching without using the rest of rspec-mocks. + # + # require 'rspec/mocks/argument_list_matcher' + # include RSpec::Mocks::ArgumentMatchers + # + # arg_list_matcher = RSpec::Mocks::ArgumentListMatcher.new(123, hash_including(:a => 'b')) + # arg_list_matcher.args_match?(123, :a => 'b') + # + # This class is immutable. + # + # @see ArgumentMatchers + class ArgumentListMatcher + # @private + attr_reader :expected_args + + # @api public + # @param [Array] expected_args a list of expected literals and/or argument matchers + # + # Initializes an `ArgumentListMatcher` with a collection of literal + # values and/or argument matchers. + # + # @see ArgumentMatchers + # @see #args_match? + def initialize(*expected_args) + @expected_args = expected_args + ensure_expected_args_valid! + end + ruby2_keywords :initialize if respond_to?(:ruby2_keywords, true) + + # @api public + # @param [Array] actual_args + # + # Matches each element in the `expected_args` against the element in the same + # position of the arguments passed to `new`. + # + # @see #initialize + def args_match?(*actual_args) + expected_args = resolve_expected_args_based_on(actual_args) + + return false if expected_args.size != actual_args.size + + if RUBY_VERSION >= "3" + # if both arguments end with Hashes, and if one is a keyword hash and the other is not, they don't match + if Hash === expected_args.last && Hash === actual_args.last + if !Hash.ruby2_keywords_hash?(actual_args.last) && Hash.ruby2_keywords_hash?(expected_args.last) + return false + end + end + end + + Support::FuzzyMatcher.values_match?(expected_args, actual_args) + end + ruby2_keywords :args_match? if respond_to?(:ruby2_keywords, true) + + # @private + # Resolves abstract arg placeholders like `no_args` and `any_args` into + # a more concrete arg list based on the provided `actual_args`. + def resolve_expected_args_based_on(actual_args) + return [] if [ArgumentMatchers::NoArgsMatcher::INSTANCE] == expected_args + + any_args_index = expected_args.index { |a| ArgumentMatchers::AnyArgsMatcher::INSTANCE == a } + return expected_args unless any_args_index + + replace_any_args_with_splat_of_anything(any_args_index, actual_args.count) + end + + private + + def replace_any_args_with_splat_of_anything(before_count, actual_args_count) + any_args_count = actual_args_count - expected_args.count + 1 + after_count = expected_args.count - before_count - 1 + + any_args = 1.upto(any_args_count).map { ArgumentMatchers::AnyArgMatcher::INSTANCE } + expected_args.first(before_count) + any_args + expected_args.last(after_count) + end + + def ensure_expected_args_valid! + if expected_args.count { |a| ArgumentMatchers::AnyArgsMatcher::INSTANCE == a } > 1 + raise ArgumentError, "`any_args` can only be passed to " \ + "`with` once but you have passed it multiple times." + elsif expected_args.count > 1 && expected_args.any? { |a| ArgumentMatchers::NoArgsMatcher::INSTANCE == a } + raise ArgumentError, "`no_args` can only be passed as a " \ + "singleton argument to `with` (i.e. `with(no_args)`), " \ + "but you have passed additional arguments." + end + end + + # Value that will match all argument lists. + # + # @private + MATCH_ALL = new(ArgumentMatchers::AnyArgsMatcher::INSTANCE) + end + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/rspec-mocks-3.11.1/lib/rspec/mocks/argument_matchers.rb b/vendor/bundle/ruby/3.1.0/gems/rspec-mocks-3.11.1/lib/rspec/mocks/argument_matchers.rb new file mode 100644 index 000000000..fe41744b6 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/rspec-mocks-3.11.1/lib/rspec/mocks/argument_matchers.rb @@ -0,0 +1,322 @@ +# This cannot take advantage of our relative requires, since this file is a +# dependency of `rspec/mocks/argument_list_matcher.rb`. See comment there for +# details. +require 'rspec/support/matcher_definition' + +module RSpec + module Mocks + # ArgumentMatchers are placeholders that you can include in message + # expectations to match arguments against a broader check than simple + # equality. + # + # With the exception of `any_args` and `no_args`, they all match against + # the arg in same position in the argument list. + # + # @see ArgumentListMatcher + module ArgumentMatchers + # Acts like an arg splat, matching any number of args at any point in an arg list. + # + # @example + # expect(object).to receive(:message).with(1, 2, any_args) + # + # # matches any of these: + # object.message(1, 2) + # object.message(1, 2, 3) + # object.message(1, 2, 3, 4) + def any_args + AnyArgsMatcher::INSTANCE + end + + # Matches any argument at all. + # + # @example + # expect(object).to receive(:message).with(anything) + def anything + AnyArgMatcher::INSTANCE + end + + # Matches no arguments. + # + # @example + # expect(object).to receive(:message).with(no_args) + def no_args + NoArgsMatcher::INSTANCE + end + + # Matches if the actual argument responds to the specified messages. + # + # @example + # expect(object).to receive(:message).with(duck_type(:hello)) + # expect(object).to receive(:message).with(duck_type(:hello, :goodbye)) + def duck_type(*args) + DuckTypeMatcher.new(*args) + end + + # Matches a boolean value. + # + # @example + # expect(object).to receive(:message).with(boolean()) + def boolean + BooleanMatcher::INSTANCE + end + + # Matches a hash that includes the specified key(s) or key/value pairs. + # Ignores any additional keys. + # + # @example + # expect(object).to receive(:message).with(hash_including(:key => val)) + # expect(object).to receive(:message).with(hash_including(:key)) + # expect(object).to receive(:message).with(hash_including(:key, :key2 => val2)) + def hash_including(*args) + HashIncludingMatcher.new(ArgumentMatchers.anythingize_lonely_keys(*args)) + end + + # Matches an array that includes the specified items at least once. + # Ignores duplicates and additional values + # + # @example + # expect(object).to receive(:message).with(array_including(1,2,3)) + # expect(object).to receive(:message).with(array_including([1,2,3])) + def array_including(*args) + actually_an_array = Array === args.first && args.count == 1 ? args.first : args + ArrayIncludingMatcher.new(actually_an_array) + end + + # Matches a hash that doesn't include the specified key(s) or key/value. + # + # @example + # expect(object).to receive(:message).with(hash_excluding(:key => val)) + # expect(object).to receive(:message).with(hash_excluding(:key)) + # expect(object).to receive(:message).with(hash_excluding(:key, :key2 => :val2)) + def hash_excluding(*args) + HashExcludingMatcher.new(ArgumentMatchers.anythingize_lonely_keys(*args)) + end + + alias_method :hash_not_including, :hash_excluding + + # Matches if `arg.instance_of?(klass)` + # + # @example + # expect(object).to receive(:message).with(instance_of(Thing)) + def instance_of(klass) + InstanceOf.new(klass) + end + + alias_method :an_instance_of, :instance_of + + # Matches if `arg.kind_of?(klass)` + # + # @example + # expect(object).to receive(:message).with(kind_of(Thing)) + def kind_of(klass) + KindOf.new(klass) + end + + alias_method :a_kind_of, :kind_of + + # @private + def self.anythingize_lonely_keys(*args) + hash = Hash === args.last ? args.delete_at(-1) : {} + args.each { | arg | hash[arg] = AnyArgMatcher::INSTANCE } + hash + end + + # Intended to be subclassed by stateless, immutable argument matchers. + # Provides a `::INSTANCE` constant for accessing a global + # singleton instance of the matcher. There is no need to construct + # multiple instance since there is no state. It also facilities the + # special case logic we need for some of these matchers, by making it + # easy to do comparisons like: `[klass::INSTANCE] == args` rather than + # `args.count == 1 && klass === args.first`. + # + # @private + class SingletonMatcher + private_class_method :new + + def self.inherited(subklass) + subklass.const_set(:INSTANCE, subklass.send(:new)) + end + end + + # @private + class AnyArgsMatcher < SingletonMatcher + def description + "*(any args)" + end + end + + # @private + class AnyArgMatcher < SingletonMatcher + def ===(_other) + true + end + + def description + "anything" + end + end + + # @private + class NoArgsMatcher < SingletonMatcher + def description + "no args" + end + end + + # @private + class BooleanMatcher < SingletonMatcher + def ===(value) + true == value || false == value + end + + def description + "boolean" + end + end + + # @private + class BaseHashMatcher + def initialize(expected) + @expected = expected + end + + def ===(predicate, actual) + @expected.__send__(predicate) do |k, v| + actual.key?(k) && Support::FuzzyMatcher.values_match?(v, actual[k]) + end + rescue NoMethodError + false + end + + def description(name) + "#{name}(#{formatted_expected_hash.inspect.sub(/^\{/, "").sub(/\}$/, "")})" + end + + private + + def formatted_expected_hash + Hash[ + @expected.map do |k, v| + k = RSpec::Support.rspec_description_for_object(k) + v = RSpec::Support.rspec_description_for_object(v) + + [k, v] + end + ] + end + end + + # @private + class HashIncludingMatcher < BaseHashMatcher + def ===(actual) + super(:all?, actual) + end + + def description + super("hash_including") + end + end + + # @private + class HashExcludingMatcher < BaseHashMatcher + def ===(actual) + super(:none?, actual) + end + + def description + super("hash_not_including") + end + end + + # @private + class ArrayIncludingMatcher + def initialize(expected) + @expected = expected + end + + def ===(actual) + actual = actual.uniq + @expected.uniq.all? do |expected_element| + actual.any? do |actual_element| + RSpec::Support::FuzzyMatcher.values_match?(expected_element, actual_element) + end + end + rescue NoMethodError + false + end + + def description + "array_including(#{formatted_expected_values})" + end + + private + + def formatted_expected_values + @expected.map do |x| + RSpec::Support.rspec_description_for_object(x) + end.join(", ") + end + end + + # @private + class DuckTypeMatcher + def initialize(*methods_to_respond_to) + @methods_to_respond_to = methods_to_respond_to + end + + def ===(value) + @methods_to_respond_to.all? { |message| value.respond_to?(message) } + end + + def description + "duck_type(#{@methods_to_respond_to.map(&:inspect).join(', ')})" + end + end + + # @private + class InstanceOf + def initialize(klass) + @klass = klass + end + + def ===(actual) + actual.instance_of?(@klass) + end + + def description + "an_instance_of(#{@klass.name})" + end + end + + # @private + class KindOf + def initialize(klass) + @klass = klass + end + + def ===(actual) + actual.kind_of?(@klass) + end + + def description + "kind of #{@klass.name}" + end + end + + matcher_namespace = name + '::' + ::RSpec::Support.register_matcher_definition do |object| + # This is the best we have for now. We should tag all of our matchers + # with a module or something so we can test for it directly. + # + # (Note Module#parent in ActiveSupport is defined in a similar way.) + begin + object.class.name.include?(matcher_namespace) + rescue NoMethodError + # Some objects, like BasicObject, don't implemented standard + # reflection methods. + false + end + end + end + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/rspec-mocks-3.11.1/lib/rspec/mocks/configuration.rb b/vendor/bundle/ruby/3.1.0/gems/rspec-mocks-3.11.1/lib/rspec/mocks/configuration.rb new file mode 100644 index 000000000..5962215f8 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/rspec-mocks-3.11.1/lib/rspec/mocks/configuration.rb @@ -0,0 +1,212 @@ +module RSpec + module Mocks + # Provides configuration options for rspec-mocks. + class Configuration + def initialize + @allow_message_expectations_on_nil = nil + @yield_receiver_to_any_instance_implementation_blocks = true + @verify_doubled_constant_names = false + @transfer_nested_constants = false + @verify_partial_doubles = false + @temporarily_suppress_partial_double_verification = false + @color = false + end + + # Sets whether RSpec will warn, ignore, or fail a test when + # expectations are set on nil. + # By default, when this flag is not set, warning messages are issued when + # expectations are set on nil. This is to prevent false-positives and to + # catch potential bugs early on. + # When set to `true`, warning messages are suppressed. + # When set to `false`, it will raise an error. + # + # @example + # RSpec.configure do |config| + # config.mock_with :rspec do |mocks| + # mocks.allow_message_expectations_on_nil = false + # end + # end + attr_accessor :allow_message_expectations_on_nil + + def yield_receiver_to_any_instance_implementation_blocks? + @yield_receiver_to_any_instance_implementation_blocks + end + + # Sets whether or not RSpec will yield the receiving instance of a + # message to blocks that are used for any_instance stub implementations. + # When set, the first yielded argument will be the receiving instance. + # Defaults to `true`. + # + # @example + # RSpec.configure do |rspec| + # rspec.mock_with :rspec do |mocks| + # mocks.yield_receiver_to_any_instance_implementation_blocks = false + # end + # end + attr_writer :yield_receiver_to_any_instance_implementation_blocks + + # Adds `stub` and `should_receive` to the given + # modules or classes. This is usually only necessary + # if you application uses some proxy classes that + # "strip themselves down" to a bare minimum set of + # methods and remove `stub` and `should_receive` in + # the process. + # + # @example + # RSpec.configure do |rspec| + # rspec.mock_with :rspec do |mocks| + # mocks.add_stub_and_should_receive_to Delegator + # end + # end + # + def add_stub_and_should_receive_to(*modules) + modules.each do |mod| + Syntax.enable_should(mod) + end + end + + # Provides the ability to set either `expect`, + # `should` or both syntaxes. RSpec uses `expect` + # syntax by default. This is needed if you want to + # explicitly enable `should` syntax and/or explicitly + # disable `expect` syntax. + # + # @example + # RSpec.configure do |rspec| + # rspec.mock_with :rspec do |mocks| + # mocks.syntax = [:expect, :should] + # end + # end + # + def syntax=(*values) + syntaxes = values.flatten + if syntaxes.include?(:expect) + Syntax.enable_expect + else + Syntax.disable_expect + end + + if syntaxes.include?(:should) + Syntax.enable_should + else + Syntax.disable_should + end + end + + # Returns an array with a list of syntaxes + # that are enabled. + # + # @example + # unless RSpec::Mocks.configuration.syntax.include?(:expect) + # raise "this RSpec extension gem requires the rspec-mocks `:expect` syntax" + # end + # + def syntax + syntaxes = [] + syntaxes << :should if Syntax.should_enabled? + syntaxes << :expect if Syntax.expect_enabled? + syntaxes + end + + def verify_doubled_constant_names? + !!@verify_doubled_constant_names + end + + # When this is set to true, an error will be raised when + # `instance_double` or `class_double` is given the name of an undefined + # constant. You probably only want to set this when running your entire + # test suite, with all production code loaded. Setting this for an + # isolated unit test will prevent you from being able to isolate it! + attr_writer :verify_doubled_constant_names + + # Provides a way to perform customisations when verifying doubles. + # + # @example + # RSpec::Mocks.configuration.before_verifying_doubles do |ref| + # ref.some_method! + # end + def before_verifying_doubles(&block) + verifying_double_callbacks << block + end + alias :when_declaring_verifying_double :before_verifying_doubles + + # @api private + # Returns an array of blocks to call when verifying doubles + def verifying_double_callbacks + @verifying_double_callbacks ||= [] + end + + def transfer_nested_constants? + !!@transfer_nested_constants + end + + # Sets the default for the `transfer_nested_constants` option when + # stubbing constants. + attr_writer :transfer_nested_constants + + # When set to true, partial mocks will be verified the same as object + # doubles. Any stubs will have their arguments checked against the original + # method, and methods that do not exist cannot be stubbed. + def verify_partial_doubles=(val) + @verify_partial_doubles = !!val + end + + def verify_partial_doubles? + @verify_partial_doubles + end + + # @private + # Used to track wether we are temporarily suppressing verifying partial + # doubles with `without_partial_double_verification { ... }` + attr_accessor :temporarily_suppress_partial_double_verification + + if ::RSpec.respond_to?(:configuration) + def color? + ::RSpec.configuration.color_enabled? + end + else + # Indicates whether or not diffs should be colored. + # Delegates to rspec-core's color option if rspec-core + # is loaded; otherwise you can set it here. + attr_writer :color + + # Indicates whether or not diffs should be colored. + # Delegates to rspec-core's color option if rspec-core + # is loaded; otherwise you can set it here. + def color? + @color + end + end + + # Monkey-patch `Marshal.dump` to enable dumping of mocked or stubbed + # objects. By default this will not work since RSpec mocks works by + # adding singleton methods that cannot be serialized. This patch removes + # these singleton methods before serialization. Setting to falsey removes + # the patch. + # + # This method is idempotent. + def patch_marshal_to_support_partial_doubles=(val) + if val + RSpec::Mocks::MarshalExtension.patch! + else + RSpec::Mocks::MarshalExtension.unpatch! + end + end + + # @api private + # Resets the configured syntax to the default. + def reset_syntaxes_to_default + self.syntax = [:should, :expect] + RSpec::Mocks::Syntax.warn_about_should! + end + end + + # Mocks specific configuration, as distinct from `RSpec.configuration` + # which is core RSpec configuration. + def self.configuration + @configuration ||= Configuration.new + end + + configuration.reset_syntaxes_to_default + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/rspec-mocks-3.11.1/lib/rspec/mocks/error_generator.rb b/vendor/bundle/ruby/3.1.0/gems/rspec-mocks-3.11.1/lib/rspec/mocks/error_generator.rb new file mode 100644 index 000000000..9bf0984f3 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/rspec-mocks-3.11.1/lib/rspec/mocks/error_generator.rb @@ -0,0 +1,369 @@ +RSpec::Support.require_rspec_support "object_formatter" + +module RSpec + module Mocks + # Raised when a message expectation is not satisfied. + MockExpectationError = Class.new(Exception) + + # Raised when a test double is used after it has been torn + # down (typically at the end of an rspec-core example). + ExpiredTestDoubleError = Class.new(MockExpectationError) + + # Raised when doubles or partial doubles are used outside of the per-test lifecycle. + OutsideOfExampleError = Class.new(StandardError) + + # Raised when an expectation customization method (e.g. `with`, + # `and_return`) is called on a message expectation which has already been + # invoked. + MockExpectationAlreadyInvokedError = Class.new(Exception) + + # Raised for situations that RSpec cannot support due to mutations made + # externally on arguments that RSpec is holding onto to use for later + # comparisons. + # + # @deprecated We no longer raise this error but the constant remains until + # RSpec 4 for SemVer reasons. + CannotSupportArgMutationsError = Class.new(StandardError) + + # @private + UnsupportedMatcherError = Class.new(StandardError) + # @private + NegationUnsupportedError = Class.new(StandardError) + # @private + VerifyingDoubleNotDefinedError = Class.new(StandardError) + + # @private + class ErrorGenerator + attr_writer :opts + + def initialize(target=nil) + @target = target + end + + # @private + def opts + @opts ||= {} + end + + # @private + def raise_unexpected_message_error(message, args) + __raise "#{intro} received unexpected message :#{message} with #{format_args(args)}" + end + + # @private + def raise_unexpected_message_args_error(expectation, args_for_multiple_calls, source_id=nil) + __raise error_message(expectation, args_for_multiple_calls), nil, source_id + end + + # @private + def raise_missing_default_stub_error(expectation, args_for_multiple_calls) + __raise( + error_message(expectation, args_for_multiple_calls) + + "\n Please stub a default value first if message might be received with other args as well. \n" + ) + end + + # @private + def raise_similar_message_args_error(expectation, args_for_multiple_calls, backtrace_line=nil) + __raise error_message(expectation, args_for_multiple_calls), backtrace_line + end + + def default_error_message(expectation, expected_args, actual_args) + "#{intro} received #{expectation.message.inspect} #{unexpected_arguments_message(expected_args, actual_args)}".dup + end + + # rubocop:disable Metrics/ParameterLists + # @private + def raise_expectation_error(message, expected_received_count, argument_list_matcher, + actual_received_count, expectation_count_type, args, + backtrace_line=nil, source_id=nil) + expected_part = expected_part_of_expectation_error(expected_received_count, expectation_count_type, argument_list_matcher) + received_part = received_part_of_expectation_error(actual_received_count, args) + __raise "(#{intro(:unwrapped)}).#{message}#{format_args(args)}\n #{expected_part}\n #{received_part}", backtrace_line, source_id + end + # rubocop:enable Metrics/ParameterLists + + # @private + def raise_unimplemented_error(doubled_module, method_name, object) + message = case object + when InstanceVerifyingDouble + "the %s class does not implement the instance method: %s".dup << + if ObjectMethodReference.for(doubled_module, method_name).implemented? + ". Perhaps you meant to use `class_double` instead?" + else + "" + end + when ClassVerifyingDouble + "the %s class does not implement the class method: %s".dup << + if InstanceMethodReference.for(doubled_module, method_name).implemented? + ". Perhaps you meant to use `instance_double` instead?" + else + "" + end + else + "%s does not implement: %s" + end + + __raise message % [doubled_module.description, method_name] + end + + # @private + def raise_non_public_error(method_name, visibility) + raise NoMethodError, "%s method `%s' called on %s" % [ + visibility, method_name, intro + ] + end + + # @private + def raise_invalid_arguments_error(verifier) + __raise verifier.error_message + end + + # @private + def raise_expired_test_double_error + raise ExpiredTestDoubleError, + "#{intro} was originally created in one example but has leaked into " \ + "another example and can no longer be used. rspec-mocks' doubles are " \ + "designed to only last for one example, and you need to create a new " \ + "one in each example you wish to use it for." + end + + # @private + def describe_expectation(verb, message, expected_received_count, _actual_received_count, args) + "#{verb} #{message}#{format_args(args)} #{count_message(expected_received_count)}" + end + + # @private + def raise_out_of_order_error(message) + __raise "#{intro} received :#{message} out of order" + end + + # @private + def raise_missing_block_error(args_to_yield) + __raise "#{intro} asked to yield |#{arg_list(args_to_yield)}| but no block was passed" + end + + # @private + def raise_wrong_arity_error(args_to_yield, signature) + __raise "#{intro} yielded |#{arg_list(args_to_yield)}| to block with #{signature.description}" + end + + # @private + def raise_only_valid_on_a_partial_double(method) + __raise "#{intro} is a pure test double. `#{method}` is only " \ + "available on a partial double." + end + + # @private + def raise_expectation_on_unstubbed_method(method) + __raise "#{intro} expected to have received #{method}, but that " \ + "object is not a spy or method has not been stubbed." + end + + # @private + def raise_expectation_on_mocked_method(method) + __raise "#{intro} expected to have received #{method}, but that " \ + "method has been mocked instead of stubbed or spied." + end + + # @private + def raise_double_negation_error(wrapped_expression) + __raise "Isn't life confusing enough? You've already set a " \ + "negative message expectation and now you are trying to " \ + "negate it again with `never`. What does an expression like " \ + "`#{wrapped_expression}.not_to receive(:msg).never` even mean?" + end + + # @private + def raise_verifying_double_not_defined_error(ref) + notify(VerifyingDoubleNotDefinedError.new( + "#{ref.description.inspect} is not a defined constant. " \ + "Perhaps you misspelt it? " \ + "Disable check with `verify_doubled_constant_names` configuration option." + )) + end + + # @private + def raise_have_received_disallowed(type, reason) + __raise "Using #{type}(...) with the `have_received` " \ + "matcher is not supported#{reason}." + end + + # @private + def raise_cant_constrain_count_for_negated_have_received_error(count_constraint) + __raise "can't use #{count_constraint} when negative" + end + + # @private + def raise_method_not_stubbed_error(method_name) + __raise "The method `#{method_name}` was not stubbed or was already unstubbed" + end + + # @private + def raise_already_invoked_error(message, calling_customization) + error_message = "The message expectation for #{intro}.#{message} has already been invoked " \ + "and cannot be modified further (e.g. using `#{calling_customization}`). All message expectation " \ + "customizations must be applied before it is used for the first time." + + notify MockExpectationAlreadyInvokedError.new(error_message) + end + + def raise_expectation_on_nil_error(method_name) + __raise expectation_on_nil_message(method_name) + end + + def expectation_on_nil_message(method_name) + "An expectation of `:#{method_name}` was set on `nil`. " \ + "To allow expectations on `nil` and suppress this message, set `RSpec::Mocks.configuration.allow_message_expectations_on_nil` to `true`. " \ + "To disallow expectations on `nil`, set `RSpec::Mocks.configuration.allow_message_expectations_on_nil` to `false`" + end + + # @private + def intro(unwrapped=false) + case @target + when TestDouble then TestDoubleFormatter.format(@target, unwrapped) + when Class then + formatted = "#{@target.inspect} (class)" + return formatted if unwrapped + "#<#{formatted}>" + when NilClass then "nil" + else @target.inspect + end + end + + # @private + def method_call_args_description(args, generic_prefix=" with arguments: ", matcher_prefix=" with ") + case args.first + when ArgumentMatchers::AnyArgsMatcher then "#{matcher_prefix}any arguments" + when ArgumentMatchers::NoArgsMatcher then "#{matcher_prefix}no arguments" + else + if yield + "#{generic_prefix}#{format_args(args)}" + else + "" + end + end + end + + private + + def received_part_of_expectation_error(actual_received_count, args) + "received: #{count_message(actual_received_count)}" + + method_call_args_description(args) do + actual_received_count > 0 && args.length > 0 + end + end + + def expected_part_of_expectation_error(expected_received_count, expectation_count_type, argument_list_matcher) + "expected: #{count_message(expected_received_count, expectation_count_type)}" + + method_call_args_description(argument_list_matcher.expected_args) do + argument_list_matcher.expected_args.length > 0 + end + end + + def unexpected_arguments_message(expected_args_string, actual_args_string) + "with unexpected arguments\n expected: #{expected_args_string}\n got: #{actual_args_string}" + end + + def error_message(expectation, args_for_multiple_calls) + expected_args = format_args(expectation.expected_args) + actual_args = format_received_args(args_for_multiple_calls) + message = default_error_message(expectation, expected_args, actual_args) + + if args_for_multiple_calls.one? + diff = diff_message(expectation.expected_args, args_for_multiple_calls.first) + message << "\nDiff:#{diff}" unless diff.strip.empty? + end + + message + end + + def diff_message(expected_args, actual_args) + formatted_expected_args = expected_args.map do |x| + RSpec::Support.rspec_description_for_object(x) + end + + formatted_expected_args, actual_args = unpack_string_args(formatted_expected_args, actual_args) + + differ.diff(actual_args, formatted_expected_args) + end + + def unpack_string_args(formatted_expected_args, actual_args) + if [formatted_expected_args, actual_args].all? { |x| list_of_exactly_one_string?(x) } + [formatted_expected_args.first, actual_args.first] + else + [formatted_expected_args, actual_args] + end + end + + def list_of_exactly_one_string?(args) + Array === args && args.count == 1 && String === args.first + end + + def differ + RSpec::Support::Differ.new(:color => RSpec::Mocks.configuration.color?) + end + + def __raise(message, backtrace_line=nil, source_id=nil) + message = opts[:message] unless opts[:message].nil? + exception = RSpec::Mocks::MockExpectationError.new(message) + prepend_to_backtrace(exception, backtrace_line) if backtrace_line + notify exception, :source_id => source_id + end + + if RSpec::Support::Ruby.jruby? + def prepend_to_backtrace(exception, line) + raise exception + rescue RSpec::Mocks::MockExpectationError => with_backtrace + with_backtrace.backtrace.unshift(line) + end + else + def prepend_to_backtrace(exception, line) + exception.set_backtrace(caller.unshift line) + end + end + + def notify(*args) + RSpec::Support.notify_failure(*args) + end + + def format_args(args) + return "(no args)" if args.empty? + "(#{arg_list(args)})" + end + + def arg_list(args) + args.map { |arg| RSpec::Support::ObjectFormatter.format(arg) }.join(", ") + end + + def format_received_args(args_for_multiple_calls) + grouped_args(args_for_multiple_calls).map do |args_for_one_call, index| + "#{format_args(args_for_one_call)}#{group_count(index, args_for_multiple_calls)}" + end.join("\n ") + end + + def count_message(count, expectation_count_type=nil) + return "at least #{times(count.abs)}" if count < 0 || expectation_count_type == :at_least + return "at most #{times(count)}" if expectation_count_type == :at_most + times(count) + end + + def times(count) + "#{count} time#{count == 1 ? '' : 's'}" + end + + def grouped_args(args) + Hash[args.group_by { |x| x }.map { |k, v| [k, v.count] }] + end + + def group_count(index, args) + " (#{times(index)})" if args.size > 1 || index > 1 + end + end + + # @private + def self.error_generator + @error_generator ||= ErrorGenerator.new + end + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/rspec-mocks-3.11.1/lib/rspec/mocks/example_methods.rb b/vendor/bundle/ruby/3.1.0/gems/rspec-mocks-3.11.1/lib/rspec/mocks/example_methods.rb new file mode 100644 index 000000000..5531b28bf --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/rspec-mocks-3.11.1/lib/rspec/mocks/example_methods.rb @@ -0,0 +1,434 @@ +RSpec::Support.require_rspec_mocks 'object_reference' + +module RSpec + module Mocks + # Contains methods intended to be used from within code examples. + # Mix this in to your test context (such as a test framework base class) + # to use rspec-mocks with your test framework. If you're using rspec-core, + # it'll take care of doing this for you. + module ExampleMethods + include RSpec::Mocks::ArgumentMatchers + + # @overload double() + # @overload double(name) + # @param name [String/Symbol] name or description to be used in failure messages + # @overload double(stubs) + # @param stubs (Hash) hash of message/return-value pairs + # @overload double(name, stubs) + # @param name [String/Symbol] name or description to be used in failure messages + # @param stubs (Hash) hash of message/return-value pairs + # @return (Double) + # + # Constructs an instance of [RSpec::Mocks::Double](RSpec::Mocks::Double) configured + # with an optional name, used for reporting in failure messages, and an optional + # hash of message/return-value pairs. + # + # @example + # book = double("book", :title => "The RSpec Book") + # book.title #=> "The RSpec Book" + # + # card = double("card", :suit => "Spades", :rank => "A") + # card.suit #=> "Spades" + # card.rank #=> "A" + # + def double(*args) + ExampleMethods.declare_double(Double, *args) + end + + # @overload instance_double(doubled_class) + # @param doubled_class [String, Class] + # @overload instance_double(doubled_class, name) + # @param doubled_class [String, Class] + # @param name [String/Symbol] name or description to be used in failure messages + # @overload instance_double(doubled_class, stubs) + # @param doubled_class [String, Class] + # @param stubs [Hash] hash of message/return-value pairs + # @overload instance_double(doubled_class, name, stubs) + # @param doubled_class [String, Class] + # @param name [String/Symbol] name or description to be used in failure messages + # @param stubs [Hash] hash of message/return-value pairs + # @return InstanceVerifyingDouble + # + # Constructs a test double against a specific class. If the given class + # name has been loaded, only instance methods defined on the class are + # allowed to be stubbed. In all other ways it behaves like a + # [double](double). + def instance_double(doubled_class, *args) + ref = ObjectReference.for(doubled_class) + ExampleMethods.declare_verifying_double(InstanceVerifyingDouble, ref, *args) + end + + # @overload class_double(doubled_class) + # @param doubled_class [String, Module] + # @overload class_double(doubled_class, name) + # @param doubled_class [String, Module] + # @param name [String/Symbol] name or description to be used in failure messages + # @overload class_double(doubled_class, stubs) + # @param doubled_class [String, Module] + # @param stubs [Hash] hash of message/return-value pairs + # @overload class_double(doubled_class, name, stubs) + # @param doubled_class [String, Module] + # @param name [String/Symbol] name or description to be used in failure messages + # @param stubs [Hash] hash of message/return-value pairs + # @return ClassVerifyingDouble + # + # Constructs a test double against a specific class. If the given class + # name has been loaded, only class methods defined on the class are + # allowed to be stubbed. In all other ways it behaves like a + # [double](double). + def class_double(doubled_class, *args) + ref = ObjectReference.for(doubled_class) + ExampleMethods.declare_verifying_double(ClassVerifyingDouble, ref, *args) + end + + # @overload object_double(object_or_name) + # @param object_or_name [String, Object] + # @overload object_double(object_or_name, name) + # @param object_or_name [String, Object] + # @param name [String/Symbol] name or description to be used in failure messages + # @overload object_double(object_or_name, stubs) + # @param object_or_name [String, Object] + # @param stubs [Hash] hash of message/return-value pairs + # @overload object_double(object_or_name, name, stubs) + # @param object_or_name [String, Object] + # @param name [String/Symbol] name or description to be used in failure messages + # @param stubs [Hash] hash of message/return-value pairs + # @return ObjectVerifyingDouble + # + # Constructs a test double against a specific object. Only the methods + # the object responds to are allowed to be stubbed. If a String argument + # is provided, it is assumed to reference a constant object which is used + # for verification. In all other ways it behaves like a [double](double). + def object_double(object_or_name, *args) + ref = ObjectReference.for(object_or_name, :allow_direct_object_refs) + ExampleMethods.declare_verifying_double(ObjectVerifyingDouble, ref, *args) + end + + # @overload spy() + # @overload spy(name) + # @param name [String/Symbol] name or description to be used in failure messages + # @overload spy(stubs) + # @param stubs (Hash) hash of message/return-value pairs + # @overload spy(name, stubs) + # @param name [String/Symbol] name or description to be used in failure messages + # @param stubs (Hash) hash of message/return-value pairs + # @return (Double) + # + # Constructs a test double that is optimized for use with + # `have_received`. With a normal double one has to stub methods in order + # to be able to spy them. A spy automatically spies on all methods. + def spy(*args) + double(*args).as_null_object + end + + # @overload instance_spy(doubled_class) + # @param doubled_class [String, Class] + # @overload instance_spy(doubled_class, name) + # @param doubled_class [String, Class] + # @param name [String/Symbol] name or description to be used in failure messages + # @overload instance_spy(doubled_class, stubs) + # @param doubled_class [String, Class] + # @param stubs [Hash] hash of message/return-value pairs + # @overload instance_spy(doubled_class, name, stubs) + # @param doubled_class [String, Class] + # @param name [String/Symbol] name or description to be used in failure messages + # @param stubs [Hash] hash of message/return-value pairs + # @return InstanceVerifyingDouble + # + # Constructs a test double that is optimized for use with `have_received` + # against a specific class. If the given class name has been loaded, only + # instance methods defined on the class are allowed to be stubbed. With + # a normal double one has to stub methods in order to be able to spy + # them. An instance_spy automatically spies on all instance methods to + # which the class responds. + def instance_spy(*args) + instance_double(*args).as_null_object + end + + # @overload object_spy(object_or_name) + # @param object_or_name [String, Object] + # @overload object_spy(object_or_name, name) + # @param object_or_name [String, Class] + # @param name [String/Symbol] name or description to be used in failure messages + # @overload object_spy(object_or_name, stubs) + # @param object_or_name [String, Object] + # @param stubs [Hash] hash of message/return-value pairs + # @overload object_spy(object_or_name, name, stubs) + # @param object_or_name [String, Class] + # @param name [String/Symbol] name or description to be used in failure messages + # @param stubs [Hash] hash of message/return-value pairs + # @return ObjectVerifyingDouble + # + # Constructs a test double that is optimized for use with `have_received` + # against a specific object. Only instance methods defined on the object + # are allowed to be stubbed. With a normal double one has to stub + # methods in order to be able to spy them. An object_spy automatically + # spies on all methods to which the object responds. + def object_spy(*args) + object_double(*args).as_null_object + end + + # @overload class_spy(doubled_class) + # @param doubled_class [String, Module] + # @overload class_spy(doubled_class, name) + # @param doubled_class [String, Class] + # @param name [String/Symbol] name or description to be used in failure messages + # @overload class_spy(doubled_class, stubs) + # @param doubled_class [String, Module] + # @param stubs [Hash] hash of message/return-value pairs + # @overload class_spy(doubled_class, name, stubs) + # @param doubled_class [String, Class] + # @param name [String/Symbol] name or description to be used in failure messages + # @param stubs [Hash] hash of message/return-value pairs + # @return ClassVerifyingDouble + # + # Constructs a test double that is optimized for use with `have_received` + # against a specific class. If the given class name has been loaded, + # only class methods defined on the class are allowed to be stubbed. + # With a normal double one has to stub methods in order to be able to spy + # them. An class_spy automatically spies on all class methods to which the + # class responds. + def class_spy(*args) + class_double(*args).as_null_object + end + + # Disables warning messages about expectations being set on nil. + # + # By default warning messages are issued when expectations are set on + # nil. This is to prevent false-positives and to catch potential bugs + # early on. + # @deprecated Use {RSpec::Mocks::Configuration#allow_message_expectations_on_nil} instead. + def allow_message_expectations_on_nil + RSpec::Mocks.space.proxy_for(nil).warn_about_expectations = false + end + + # Stubs the named constant with the given value. + # Like method stubs, the constant will be restored + # to its original value (or lack of one, if it was + # undefined) when the example completes. + # + # @param constant_name [String] The fully qualified name of the constant. The current + # constant scoping at the point of call is not considered. + # @param value [Object] The value to make the constant refer to. When the + # example completes, the constant will be restored to its prior state. + # @param options [Hash] Stubbing options. + # @option options :transfer_nested_constants [Boolean, Array] Determines + # what nested constants, if any, will be transferred from the original value + # of the constant to the new value of the constant. This only works if both + # the original and new values are modules (or classes). + # @return [Object] the stubbed value of the constant + # + # @example + # stub_const("MyClass", Class.new) # => Replaces (or defines) MyClass with a new class object. + # stub_const("SomeModel::PER_PAGE", 5) # => Sets SomeModel::PER_PAGE to 5. + # + # class CardDeck + # SUITS = [:Spades, :Diamonds, :Clubs, :Hearts] + # NUM_CARDS = 52 + # end + # + # stub_const("CardDeck", Class.new) + # CardDeck::SUITS # => uninitialized constant error + # CardDeck::NUM_CARDS # => uninitialized constant error + # + # stub_const("CardDeck", Class.new, :transfer_nested_constants => true) + # CardDeck::SUITS # => our suits array + # CardDeck::NUM_CARDS # => 52 + # + # stub_const("CardDeck", Class.new, :transfer_nested_constants => [:SUITS]) + # CardDeck::SUITS # => our suits array + # CardDeck::NUM_CARDS # => uninitialized constant error + def stub_const(constant_name, value, options={}) + ConstantMutator.stub(constant_name, value, options) + end + + # Hides the named constant with the given value. The constant will be + # undefined for the duration of the test. + # + # Like method stubs, the constant will be restored to its original value + # when the example completes. + # + # @param constant_name [String] The fully qualified name of the constant. + # The current constant scoping at the point of call is not considered. + # + # @example + # hide_const("MyClass") # => MyClass is now an undefined constant + def hide_const(constant_name) + ConstantMutator.hide(constant_name) + end + + # Verifies that the given object received the expected message during the + # course of the test. On a spy objects or as null object doubles this + # works for any method, on other objects the method must have + # been stubbed beforehand in order for messages to be verified. + # + # Stubbing and verifying messages received in this way implements the + # Test Spy pattern. + # + # @param method_name [Symbol] name of the method expected to have been + # called. + # + # @example + # invitation = double('invitation', accept: true) + # user.accept_invitation(invitation) + # expect(invitation).to have_received(:accept) + # + # # You can also use most message expectations: + # expect(invitation).to have_received(:accept).with(mailer).once + # + # @note `have_received(...).with(...)` is unable to work properly when + # passed arguments are mutated after the spy records the received message. + def have_received(method_name, &block) + Matchers::HaveReceived.new(method_name, &block) + end + + # Turns off the verifying of partial doubles for the duration of the + # block, this is useful in situations where methods are defined at run + # time and you wish to define stubs for them but not turn off partial + # doubles for the entire run suite. (e.g. view specs in rspec-rails). + def without_partial_double_verification + original_state = Mocks.configuration.temporarily_suppress_partial_double_verification + Mocks.configuration.temporarily_suppress_partial_double_verification = true + yield + ensure + Mocks.configuration.temporarily_suppress_partial_double_verification = original_state + end + + # @method expect + # Used to wrap an object in preparation for setting a mock expectation + # on it. + # + # @example + # expect(obj).to receive(:foo).with(5).and_return(:return_value) + # + # @note This method is usually provided by rspec-expectations. However, + # if you use rspec-mocks without rspec-expectations, there's a definition + # of it that is made available here. If you disable the `:expect` syntax + # this method will be undefined. + + # @method allow + # Used to wrap an object in preparation for stubbing a method + # on it. + # + # @example + # allow(dbl).to receive(:foo).with(5).and_return(:return_value) + # + # @note If you disable the `:expect` syntax this method will be undefined. + + # @method expect_any_instance_of + # Used to wrap a class in preparation for setting a mock expectation + # on instances of it. + # + # @example + # expect_any_instance_of(MyClass).to receive(:foo) + # + # @note If you disable the `:expect` syntax this method will be undefined. + + # @method allow_any_instance_of + # Used to wrap a class in preparation for stubbing a method + # on instances of it. + # + # @example + # allow_any_instance_of(MyClass).to receive(:foo) + # + # @note This is only available when you have enabled the `expect` syntax. + + # @method receive + # Used to specify a message that you expect or allow an object + # to receive. The object returned by `receive` supports the same + # fluent interface that `should_receive` and `stub` have always + # supported, allowing you to constrain the arguments or number of + # times, and configure how the object should respond to the message. + # + # @example + # expect(obj).to receive(:hello).with("world").exactly(3).times + # + # @note If you disable the `:expect` syntax this method will be undefined. + + # @method receive_messages + # Shorthand syntax used to setup message(s), and their return value(s), + # that you expect or allow an object to receive. The method takes a hash + # of messages and their respective return values. Unlike with `receive`, + # you cannot apply further customizations using a block or the fluent + # interface. + # + # @example + # allow(obj).to receive_messages(:speak => "Hello World") + # allow(obj).to receive_messages(:speak => "Hello", :meow => "Meow") + # + # @note If you disable the `:expect` syntax this method will be undefined. + + # @method receive_message_chain + # @overload receive_message_chain(method1, method2) + # @overload receive_message_chain("method1.method2") + # @overload receive_message_chain(method1, method_to_value_hash) + # + # stubs/mocks a chain of messages on an object or test double. + # + # ## Warning: + # + # Chains can be arbitrarily long, which makes it quite painless to + # violate the Law of Demeter in violent ways, so you should consider any + # use of `receive_message_chain` a code smell. Even though not all code smells + # indicate real problems (think fluent interfaces), `receive_message_chain` still + # results in brittle examples. For example, if you write + # `allow(foo).to receive_message_chain(:bar, :baz => 37)` in a spec and then the + # implementation calls `foo.baz.bar`, the stub will not work. + # + # @example + # allow(double).to receive_message_chain("foo.bar") { :baz } + # allow(double).to receive_message_chain(:foo, :bar => :baz) + # allow(double).to receive_message_chain(:foo, :bar) { :baz } + # + # # Given any of ^^ these three forms ^^: + # double.foo.bar # => :baz + # + # # Common use in Rails/ActiveRecord: + # allow(Article).to receive_message_chain("recent.published") { [Article.new] } + # + # @note If you disable the `:expect` syntax this method will be undefined. + + # @private + def self.included(klass) + klass.class_exec do + # This gets mixed in so that if `RSpec::Matchers` is included in + # `klass` later, its definition of `expect` will take precedence. + include ExpectHost unless method_defined?(:expect) + end + end + + # @private + def self.extended(object) + # This gets extended in so that if `RSpec::Matchers` is included in + # `klass` later, its definition of `expect` will take precedence. + object.extend ExpectHost unless object.respond_to?(:expect) + end + + # @private + def self.declare_verifying_double(type, ref, *args) + if RSpec::Mocks.configuration.verify_doubled_constant_names? && + !ref.defined? + + RSpec::Mocks.error_generator.raise_verifying_double_not_defined_error(ref) + end + + RSpec::Mocks.configuration.verifying_double_callbacks.each do |block| + block.call(ref) + end + + declare_double(type, ref, *args) + end + + # @private + def self.declare_double(type, *args) + args << {} unless Hash === args.last + type.new(*args) + end + + # This module exists to host the `expect` method for cases where + # rspec-mocks is used w/o rspec-expectations. + module ExpectHost + end + end + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/rspec-mocks-3.11.1/lib/rspec/mocks/instance_method_stasher.rb b/vendor/bundle/ruby/3.1.0/gems/rspec-mocks-3.11.1/lib/rspec/mocks/instance_method_stasher.rb new file mode 100644 index 000000000..12edec2fa --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/rspec-mocks-3.11.1/lib/rspec/mocks/instance_method_stasher.rb @@ -0,0 +1,146 @@ +module RSpec + module Mocks + # @private + class InstanceMethodStasher + def initialize(object, method) + @object = object + @method = method + @klass = (class << object; self; end) + + @original_method = nil + @method_is_stashed = false + end + + attr_reader :original_method + + if RUBY_VERSION.to_f < 1.9 + # @private + def method_is_stashed? + @method_is_stashed + end + + # @private + def stash + return if !method_defined_directly_on_klass? || @method_is_stashed + + @klass.__send__(:alias_method, stashed_method_name, @method) + @method_is_stashed = true + end + + # @private + def stashed_method_name + "obfuscated_by_rspec_mocks__#{@method}" + end + + # @private + def restore + return unless @method_is_stashed + + if @klass.__send__(:method_defined?, @method) + @klass.__send__(:undef_method, @method) + end + @klass.__send__(:alias_method, @method, stashed_method_name) + @klass.__send__(:remove_method, stashed_method_name) + @method_is_stashed = false + end + else + + # @private + def method_is_stashed? + !!@original_method + end + + # @private + def stash + return unless method_defined_directly_on_klass? + @original_method ||= ::RSpec::Support.method_handle_for(@object, @method) + @klass.__send__(:undef_method, @method) + end + + # @private + def restore + return unless @original_method + + if @klass.__send__(:method_defined?, @method) + @klass.__send__(:undef_method, @method) + end + + handle_restoration_failures do + @klass.__send__(:define_method, @method, @original_method) + end + + @original_method = nil + end + end + + if RUBY_DESCRIPTION.include?('2.0.0p247') || RUBY_DESCRIPTION.include?('2.0.0p195') + # ruby 2.0.0-p247 and 2.0.0-p195 both have a bug that we can't work around :(. + # https://bugs.ruby-lang.org/issues/8686 + def handle_restoration_failures + yield + rescue TypeError + RSpec.warn_with( + "RSpec failed to properly restore a partial double (#{@object.inspect}) " \ + "to its original state due to a known bug in MRI 2.0.0-p195 & p247 " \ + "(https://bugs.ruby-lang.org/issues/8686). This object may remain " \ + "screwed up for the rest of this process. Please upgrade to 2.0.0-p353 or above.", + :call_site => nil, :use_spec_location_as_call_site => true + ) + end + else + def handle_restoration_failures + # No known reasons for restoration to fail on other rubies. + yield + end + end + + private + + # @private + def method_defined_directly_on_klass? + method_defined_on_klass? && method_owned_by_klass? + end + + # @private + def method_defined_on_klass?(klass=@klass) + MethodReference.method_defined_at_any_visibility?(klass, @method) + end + + def method_owned_by_klass? + owner = @klass.instance_method(@method).owner + + # On Ruby 2.0.0+ the owner of a method on a class which has been + # `prepend`ed may actually be an instance, e.g. + # `#`, rather than the expected `MyClass`. + owner = owner.class unless Module === owner + + # On some 1.9s (e.g. rubinius) aliased methods + # can report the wrong owner. Example: + # class MyClass + # class << self + # alias alternate_new new + # end + # end + # + # MyClass.owner(:alternate_new) returns `Class` when incorrect, + # but we need to consider the owner to be `MyClass` because + # it is not actually available on `Class` but is on `MyClass`. + # Hence, we verify that the owner actually has the method defined. + # If the given owner does not have the method defined, we assume + # that the method is actually owned by @klass. + # + # On 1.8, aliased methods can also report the wrong owner. Example: + # module M + # def a; end + # module_function :a + # alias b a + # module_function :b + # end + # The owner of M.b is the raw Module object, instead of the expected + # singleton class of the module + return true if RUBY_VERSION < '1.9' && owner == @object + owner == @klass || !(method_defined_on_klass?(owner)) + end + end + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/rspec-mocks-3.11.1/lib/rspec/mocks/marshal_extension.rb b/vendor/bundle/ruby/3.1.0/gems/rspec-mocks-3.11.1/lib/rspec/mocks/marshal_extension.rb new file mode 100644 index 000000000..cfa9c1a7b --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/rspec-mocks-3.11.1/lib/rspec/mocks/marshal_extension.rb @@ -0,0 +1,41 @@ +module RSpec + module Mocks + # Support for `patch_marshal_to_support_partial_doubles` configuration. + # + # @private + class MarshalExtension + def self.patch! + return if Marshal.respond_to?(:dump_with_rspec_mocks) + + Marshal.instance_eval do + class << self + def dump_with_rspec_mocks(object, *rest) + if !::RSpec::Mocks.space.registered?(object) || NilClass === object + dump_without_rspec_mocks(object, *rest) + else + dump_without_rspec_mocks(object.dup, *rest) + end + end + + alias_method :dump_without_rspec_mocks, :dump + undef_method :dump + alias_method :dump, :dump_with_rspec_mocks + end + end + end + + def self.unpatch! + return unless Marshal.respond_to?(:dump_with_rspec_mocks) + + Marshal.instance_eval do + class << self + undef_method :dump_with_rspec_mocks + undef_method :dump + alias_method :dump, :dump_without_rspec_mocks + undef_method :dump_without_rspec_mocks + end + end + end + end + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/rspec-mocks-3.11.1/lib/rspec/mocks/matchers/expectation_customization.rb b/vendor/bundle/ruby/3.1.0/gems/rspec-mocks-3.11.1/lib/rspec/mocks/matchers/expectation_customization.rb new file mode 100644 index 000000000..81e642797 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/rspec-mocks-3.11.1/lib/rspec/mocks/matchers/expectation_customization.rb @@ -0,0 +1,20 @@ +module RSpec + module Mocks + module Matchers + # @private + class ExpectationCustomization + attr_accessor :block + + def initialize(method_name, args, block) + @method_name = method_name + @args = args + @block = block + end + + def playback_onto(expectation) + expectation.__send__(@method_name, *@args, &@block) + end + end + end + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/rspec-mocks-3.11.1/lib/rspec/mocks/matchers/have_received.rb b/vendor/bundle/ruby/3.1.0/gems/rspec-mocks-3.11.1/lib/rspec/mocks/matchers/have_received.rb new file mode 100644 index 000000000..dce6974f9 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/rspec-mocks-3.11.1/lib/rspec/mocks/matchers/have_received.rb @@ -0,0 +1,134 @@ +module RSpec + module Mocks + module Matchers + # @private + class HaveReceived + include Matcher + + COUNT_CONSTRAINTS = %w[exactly at_least at_most times time once twice thrice] + ARGS_CONSTRAINTS = %w[with] + CONSTRAINTS = COUNT_CONSTRAINTS + ARGS_CONSTRAINTS + %w[ordered] + + def initialize(method_name, &block) + @method_name = method_name + @block = block + @constraints = [] + @subject = nil + end + + def name + "have_received" + end + + def matches?(subject, &block) + @block ||= block + @subject = subject + @expectation = expect + mock_proxy.ensure_implemented(@method_name) + + expected_messages_received_in_order? + end + + def does_not_match?(subject) + @subject = subject + ensure_count_unconstrained + @expectation = expect.never + mock_proxy.ensure_implemented(@method_name) + expected_messages_received_in_order? + end + + def failure_message + capture_failure_message + end + + def failure_message_when_negated + capture_failure_message + end + + def description + (@expectation ||= expect).description_for("have received") + end + + CONSTRAINTS.each do |expectation| + define_method expectation do |*args| + @constraints << [expectation, *args] + self + end + end + + def setup_expectation(subject, &block) + notify_failure_message unless matches?(subject, &block) + end + + def setup_negative_expectation(subject, &block) + notify_failure_message unless does_not_match?(subject, &block) + end + + def setup_allowance(_subject, &_block) + disallow("allow", " as it would have no effect") + end + + def setup_any_instance_allowance(_subject, &_block) + disallow("allow_any_instance_of") + end + + def setup_any_instance_expectation(_subject, &_block) + disallow("expect_any_instance_of") + end + + def setup_any_instance_negative_expectation(_subject, &_block) + disallow("expect_any_instance_of") + end + + private + + def disallow(type, reason="") + RSpec::Mocks.error_generator.raise_have_received_disallowed(type, reason) + end + + def expect + expectation = mock_proxy.build_expectation(@method_name) + apply_constraints_to expectation + expectation + end + + def apply_constraints_to(expectation) + @constraints.each do |constraint| + expectation.send(*constraint) + end + end + + def ensure_count_unconstrained + return unless count_constraint + RSpec::Mocks.error_generator.raise_cant_constrain_count_for_negated_have_received_error(count_constraint) + end + + def count_constraint + @constraints.map(&:first).find do |constraint| + COUNT_CONSTRAINTS.include?(constraint) + end + end + + def capture_failure_message + RSpec::Support.with_failure_notifier(Proc.new { |err, _opt| return err.message }) do + notify_failure_message + end + end + + def notify_failure_message + mock_proxy.check_for_unexpected_arguments(@expectation) + @expectation.generate_error + end + + def expected_messages_received_in_order? + mock_proxy.replay_received_message_on @expectation, &@block + @expectation.expected_messages_received? && @expectation.ensure_expected_ordering_received! + end + + def mock_proxy + RSpec::Mocks.space.proxy_for(@subject) + end + end + end + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/rspec-mocks-3.11.1/lib/rspec/mocks/matchers/receive.rb b/vendor/bundle/ruby/3.1.0/gems/rspec-mocks-3.11.1/lib/rspec/mocks/matchers/receive.rb new file mode 100644 index 000000000..409c6d25a --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/rspec-mocks-3.11.1/lib/rspec/mocks/matchers/receive.rb @@ -0,0 +1,133 @@ +RSpec::Support.require_rspec_mocks 'matchers/expectation_customization' + +module RSpec + module Mocks + module Matchers + # @private + class Receive + include Matcher + + def initialize(message, block) + @message = message + @block = block + @recorded_customizations = [] + end + + def name + "receive" + end + + def description + describable.description_for("receive") + end + + def setup_expectation(subject, &block) + warn_if_any_instance("expect", subject) + @describable = setup_mock_proxy_method_substitute(subject, :add_message_expectation, block) + end + alias matches? setup_expectation + + def setup_negative_expectation(subject, &block) + # ensure `never` goes first for cases like `never.and_return(5)`, + # where `and_return` is meant to raise an error + @recorded_customizations.unshift ExpectationCustomization.new(:never, [], nil) + + warn_if_any_instance("expect", subject) + + setup_expectation(subject, &block) + end + alias does_not_match? setup_negative_expectation + + def setup_allowance(subject, &block) + warn_if_any_instance("allow", subject) + setup_mock_proxy_method_substitute(subject, :add_stub, block) + end + + def setup_any_instance_expectation(subject, &block) + setup_any_instance_method_substitute(subject, :should_receive, block) + end + + def setup_any_instance_negative_expectation(subject, &block) + setup_any_instance_method_substitute(subject, :should_not_receive, block) + end + + def setup_any_instance_allowance(subject, &block) + setup_any_instance_method_substitute(subject, :stub, block) + end + + MessageExpectation.public_instance_methods(false).each do |method| + next if method_defined?(method) + + define_method(method) do |*args, &block| + @recorded_customizations << ExpectationCustomization.new(method, args, block) + self + end + ruby2_keywords(method) if respond_to?(:ruby2_keywords, true) + end + + private + + def describable + @describable ||= DefaultDescribable.new(@message) + end + + def warn_if_any_instance(expression, subject) + return unless AnyInstance::Proxy === subject + + RSpec.warning( + "`#{expression}(#{subject.klass}.any_instance).to` " \ + "is probably not what you meant, it does not operate on " \ + "any instance of `#{subject.klass}`. " \ + "Use `#{expression}_any_instance_of(#{subject.klass}).to` instead." + ) + end + + def setup_mock_proxy_method_substitute(subject, method, block) + proxy = ::RSpec::Mocks.space.proxy_for(subject) + setup_method_substitute(proxy, method, block) + end + + def setup_any_instance_method_substitute(subject, method, block) + proxy = ::RSpec::Mocks.space.any_instance_proxy_for(subject) + setup_method_substitute(proxy, method, block) + end + + def setup_method_substitute(host, method, block, *args) + args << @message.to_sym + block = move_block_to_last_customization(block) + + expectation = host.__send__(method, *args, &(@block || block)) + + @recorded_customizations.each do |customization| + customization.playback_onto(expectation) + end + expectation + end + + def move_block_to_last_customization(block) + last = @recorded_customizations.last + return block unless last + + last.block ||= block + nil + end + + # MessageExpectation objects are able to describe themselves in detail. + # We use this as a fall back when a MessageExpectation is not available. + # @private + class DefaultDescribable + def initialize(message) + @message = message + end + + # This is much simpler for the `any_instance` case than what the + # user may want, but I'm not up for putting a bunch of effort + # into full descriptions for `any_instance` expectations at this point :(. + def description_for(verb) + "#{verb} #{@message}" + end + end + end + end + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/rspec-mocks-3.11.1/lib/rspec/mocks/matchers/receive_message_chain.rb b/vendor/bundle/ruby/3.1.0/gems/rspec-mocks-3.11.1/lib/rspec/mocks/matchers/receive_message_chain.rb new file mode 100644 index 000000000..06419598e --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/rspec-mocks-3.11.1/lib/rspec/mocks/matchers/receive_message_chain.rb @@ -0,0 +1,82 @@ +RSpec::Support.require_rspec_mocks 'matchers/expectation_customization' + +module RSpec + module Mocks + module Matchers + # @private + class ReceiveMessageChain + include Matcher + + def initialize(chain, &block) + @chain = chain + @block = block + @recorded_customizations = [] + end + + [:with, :and_return, :and_invoke, :and_throw, :and_raise, :and_yield, :and_call_original].each do |msg| + define_method(msg) do |*args, &block| + @recorded_customizations << ExpectationCustomization.new(msg, args, block) + self + end + end + + def name + "receive_message_chain" + end + + def description + "receive message chain #{formatted_chain}" + end + + def setup_allowance(subject, &block) + chain = StubChain.stub_chain_on(subject, *@chain, &(@block || block)) + replay_customizations(chain) + end + + def setup_any_instance_allowance(subject, &block) + proxy = ::RSpec::Mocks.space.any_instance_proxy_for(subject) + chain = proxy.stub_chain(*@chain, &(@block || block)) + replay_customizations(chain) + end + + def setup_any_instance_expectation(subject, &block) + proxy = ::RSpec::Mocks.space.any_instance_proxy_for(subject) + chain = proxy.expect_chain(*@chain, &(@block || block)) + replay_customizations(chain) + end + + def setup_expectation(subject, &block) + chain = ExpectChain.expect_chain_on(subject, *@chain, &(@block || block)) + replay_customizations(chain) + end + + def setup_negative_expectation(*_args) + raise NegationUnsupportedError, + "`expect(...).not_to receive_message_chain` is not supported " \ + "since it doesn't really make sense. What would it even mean?" + end + + alias matches? setup_expectation + alias does_not_match? setup_negative_expectation + + private + + def replay_customizations(chain) + @recorded_customizations.each do |customization| + customization.playback_onto(chain) + end + end + + def formatted_chain + @formatted_chain ||= @chain.map do |part| + if Hash === part + part.keys.first.to_s + else + part.to_s + end + end.join(".") + end + end + end + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/rspec-mocks-3.11.1/lib/rspec/mocks/matchers/receive_messages.rb b/vendor/bundle/ruby/3.1.0/gems/rspec-mocks-3.11.1/lib/rspec/mocks/matchers/receive_messages.rb new file mode 100644 index 000000000..218d238e3 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/rspec-mocks-3.11.1/lib/rspec/mocks/matchers/receive_messages.rb @@ -0,0 +1,77 @@ +module RSpec + module Mocks + module Matchers + # @private + class ReceiveMessages + include Matcher + + def initialize(message_return_value_hash) + @message_return_value_hash = message_return_value_hash + @backtrace_line = CallerFilter.first_non_rspec_line + end + + def name + "receive_messages" + end + + def description + "receive messages: #{@message_return_value_hash.inspect}" + end + + def setup_expectation(subject) + warn_about_block if block_given? + each_message_on(proxy_on(subject)) do |host, message, return_value| + host.add_simple_expectation(message, return_value, @backtrace_line) + end + end + alias matches? setup_expectation + + def setup_negative_expectation(_subject) + raise NegationUnsupportedError, + "`expect(...).to_not receive_messages` is not supported since it " \ + "doesn't really make sense. What would it even mean?" + end + alias does_not_match? setup_negative_expectation + + def setup_allowance(subject) + warn_about_block if block_given? + each_message_on(proxy_on(subject)) do |host, message, return_value| + host.add_simple_stub(message, return_value) + end + end + + def setup_any_instance_expectation(subject) + warn_about_block if block_given? + each_message_on(any_instance_of(subject)) do |host, message, return_value| + host.should_receive(message).and_return(return_value) + end + end + + def setup_any_instance_allowance(subject) + warn_about_block if block_given? + any_instance_of(subject).stub(@message_return_value_hash) + end + + def warn_about_block + raise "Implementation blocks aren't supported with `receive_messages`" + end + + private + + def proxy_on(subject) + ::RSpec::Mocks.space.proxy_for(subject) + end + + def any_instance_of(subject) + ::RSpec::Mocks.space.any_instance_proxy_for(subject) + end + + def each_message_on(host) + @message_return_value_hash.each do |message, value| + yield host, message, value + end + end + end + end + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/rspec-mocks-3.11.1/lib/rspec/mocks/message_chain.rb b/vendor/bundle/ruby/3.1.0/gems/rspec-mocks-3.11.1/lib/rspec/mocks/message_chain.rb new file mode 100644 index 000000000..907d14b0e --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/rspec-mocks-3.11.1/lib/rspec/mocks/message_chain.rb @@ -0,0 +1,87 @@ +module RSpec + module Mocks + # @private + class MessageChain + attr_reader :object, :chain, :block + + def initialize(object, *chain, &blk) + @object = object + @chain, @block = format_chain(*chain, &blk) + end + + # @api private + def setup_chain + if chain.length > 1 + if (matching_stub = find_matching_stub) + chain.shift + chain_on(matching_stub.invoke(nil), *chain, &@block) + elsif (matching_expectation = find_matching_expectation) + chain.shift + chain_on(matching_expectation.invoke_without_incrementing_received_count(nil), *chain, &@block) + else + next_in_chain = Double.new + expectation(object, chain.shift) { next_in_chain } + chain_on(next_in_chain, *chain, &@block) + end + else + expectation(object, chain.shift, &@block) + end + end + + private + + def chain_on(object, *chain, &block) + initialize(object, *chain, &block) + setup_chain + end + + def format_chain(*chain, &blk) + if Hash === chain.last + hash = chain.pop + hash.each do |k, v| + chain << k + blk = Proc.new { v } + end + end + return chain.join('.').split('.'), blk + end + + def find_matching_stub + ::RSpec::Mocks.space.proxy_for(object). + __send__(:find_matching_method_stub, chain.first.to_sym) + end + + def find_matching_expectation + ::RSpec::Mocks.space.proxy_for(object). + __send__(:find_matching_expectation, chain.first.to_sym) + end + end + + # @private + class ExpectChain < MessageChain + # @api private + def self.expect_chain_on(object, *chain, &blk) + new(object, *chain, &blk).setup_chain + end + + private + + def expectation(object, message, &return_block) + ::RSpec::Mocks.expect_message(object, message, {}, &return_block) + end + end + + # @private + class StubChain < MessageChain + def self.stub_chain_on(object, *chain, &blk) + new(object, *chain, &blk).setup_chain + end + + private + + def expectation(object, message, &return_block) + ::RSpec::Mocks.allow_message(object, message, {}, &return_block) + end + end + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/rspec-mocks-3.11.1/lib/rspec/mocks/message_expectation.rb b/vendor/bundle/ruby/3.1.0/gems/rspec-mocks-3.11.1/lib/rspec/mocks/message_expectation.rb new file mode 100644 index 000000000..8adcf534b --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/rspec-mocks-3.11.1/lib/rspec/mocks/message_expectation.rb @@ -0,0 +1,822 @@ +RSpec::Support.require_rspec_support 'mutex' + +module RSpec + module Mocks + # A message expectation that only allows concrete return values to be set + # for a message. While this same effect can be achieved using a standard + # MessageExpectation, this version is much faster and so can be used as an + # optimization. + # + # @private + class SimpleMessageExpectation + def initialize(message, response, error_generator, backtrace_line=nil) + @message, @response, @error_generator, @backtrace_line = message.to_sym, response, error_generator, backtrace_line + @received = false + end + + def invoke(*_) + @received = true + @response + end + + def matches?(message, *_) + @message == message.to_sym + end + + def called_max_times? + false + end + + def verify_messages_received + return if @received + @error_generator.raise_expectation_error( + @message, 1, ArgumentListMatcher::MATCH_ALL, 0, nil, [], @backtrace_line + ) + end + + def unadvise(_) + end + end + + # Represents an individual method stub or message expectation. The methods + # defined here can be used to configure how it behaves. The methods return + # `self` so that they can be chained together to form a fluent interface. + class MessageExpectation + # @!group Configuring Responses + + # @overload and_return(value) + # @overload and_return(first_value, second_value) + # + # Tells the object to return a value when it receives the message. Given + # more than one value, the first value is returned the first time the + # message is received, the second value is returned the next time, etc, + # etc. + # + # If the message is received more times than there are values, the last + # value is returned for every subsequent call. + # + # @return [nil] No further chaining is supported after this. + # @example + # allow(counter).to receive(:count).and_return(1) + # counter.count # => 1 + # counter.count # => 1 + # + # allow(counter).to receive(:count).and_return(1,2,3) + # counter.count # => 1 + # counter.count # => 2 + # counter.count # => 3 + # counter.count # => 3 + # counter.count # => 3 + # # etc + def and_return(first_value, *values) + raise_already_invoked_error_if_necessary(__method__) + if negative? + raise "`and_return` is not supported with negative message expectations" + end + + if block_given? + raise ArgumentError, "Implementation blocks aren't supported with `and_return`" + end + + values.unshift(first_value) + @expected_received_count = [@expected_received_count, values.size].max unless ignoring_args? || (@expected_received_count == 0 && @at_least) + self.terminal_implementation_action = AndReturnImplementation.new(values) + + nil + end + + # Tells the object to invoke a Proc when it receives the message. Given + # more than one value, the result of the first Proc is returned the first + # time the message is received, the result of the second Proc is returned + # the next time, etc, etc. + # + # If the message is received more times than there are Procs, the result of + # the last Proc is returned for every subsequent call. + # + # @return [nil] No further chaining is supported after this. + # @example + # allow(api).to receive(:get_foo).and_invoke(-> { raise ApiTimeout }) + # api.get_foo # => raises ApiTimeout + # api.get_foo # => raises ApiTimeout + # + # allow(api).to receive(:get_foo).and_invoke(-> { raise ApiTimeout }, -> { raise ApiTimeout }, -> { :a_foo }) + # api.get_foo # => raises ApiTimeout + # api.get_foo # => rasies ApiTimeout + # api.get_foo # => :a_foo + # api.get_foo # => :a_foo + # api.get_foo # => :a_foo + # # etc + def and_invoke(first_proc, *procs) + raise_already_invoked_error_if_necessary(__method__) + if negative? + raise "`and_invoke` is not supported with negative message expectations" + end + + if block_given? + raise ArgumentError, "Implementation blocks aren't supported with `and_invoke`" + end + + procs.unshift(first_proc) + if procs.any? { |p| !p.respond_to?(:call) } + raise ArgumentError, "Arguments to `and_invoke` must be callable." + end + + @expected_received_count = [@expected_received_count, procs.size].max unless ignoring_args? || (@expected_received_count == 0 && @at_least) + self.terminal_implementation_action = AndInvokeImplementation.new(procs) + + nil + end + + # Tells the object to delegate to the original unmodified method + # when it receives the message. + # + # @note This is only available on partial doubles. + # + # @return [nil] No further chaining is supported after this. + # @example + # expect(counter).to receive(:increment).and_call_original + # original_count = counter.count + # counter.increment + # expect(counter.count).to eq(original_count + 1) + def and_call_original + block = lambda do |original, *args, &b| + original.call(*args, &b) + end + block = block.ruby2_keywords if block.respond_to?(:ruby2_keywords) + + wrap_original(__method__, &block) + end + + # Decorates the stubbed method with the supplied block. The original + # unmodified method is passed to the block along with any method call + # arguments so you can delegate to it, whilst still being able to + # change what args are passed to it and/or change the return value. + # + # @note This is only available on partial doubles. + # + # @return [nil] No further chaining is supported after this. + # @example + # expect(api).to receive(:large_list).and_wrap_original do |original_method, *args, &block| + # original_method.call(*args, &block).first(10) + # end + def and_wrap_original(&block) + wrap_original(__method__, &block) + end + + # @overload and_raise + # @overload and_raise(ExceptionClass) + # @overload and_raise(ExceptionClass, message) + # @overload and_raise(exception_instance) + # + # Tells the object to raise an exception when the message is received. + # + # @return [nil] No further chaining is supported after this. + # @note + # When you pass an exception class, the MessageExpectation will raise + # an instance of it, creating it with `exception` and passing `message` + # if specified. If the exception class initializer requires more than + # one parameters, you must pass in an instance and not the class, + # otherwise this method will raise an ArgumentError exception. + # + # @example + # allow(car).to receive(:go).and_raise + # allow(car).to receive(:go).and_raise(OutOfGas) + # allow(car).to receive(:go).and_raise(OutOfGas, "At least 2 oz of gas needed to drive") + # allow(car).to receive(:go).and_raise(OutOfGas.new(2, :oz)) + def and_raise(*args) + raise_already_invoked_error_if_necessary(__method__) + self.terminal_implementation_action = Proc.new { raise(*args) } + nil + end + + # @overload and_throw(symbol) + # @overload and_throw(symbol, object) + # + # Tells the object to throw a symbol (with the object if that form is + # used) when the message is received. + # + # @return [nil] No further chaining is supported after this. + # @example + # allow(car).to receive(:go).and_throw(:out_of_gas) + # allow(car).to receive(:go).and_throw(:out_of_gas, :level => 0.1) + def and_throw(*args) + raise_already_invoked_error_if_necessary(__method__) + self.terminal_implementation_action = Proc.new { throw(*args) } + nil + end + + # Tells the object to yield one or more args to a block when the message + # is received. + # + # @return [MessageExpectation] self, to support further chaining. + # @example + # stream.stub(:open).and_yield(StringIO.new) + def and_yield(*args, &block) + raise_already_invoked_error_if_necessary(__method__) + yield @eval_context = Object.new if block + + # Initialize args to yield now that it's being used, see also: comment + # in constructor. + @args_to_yield ||= [] + + @args_to_yield << args + self.initial_implementation_action = AndYieldImplementation.new(@args_to_yield, @eval_context, @error_generator) + self + end + # @!endgroup + + # @!group Constraining Receive Counts + + # Constrain a message expectation to be received a specific number of + # times. + # + # @return [MessageExpectation] self, to support further chaining. + # @example + # expect(dealer).to receive(:deal_card).exactly(10).times + def exactly(n, &block) + raise_already_invoked_error_if_necessary(__method__) + self.inner_implementation_action = block + set_expected_received_count :exactly, n + self + end + + # Constrain a message expectation to be received at least a specific + # number of times. + # + # @return [MessageExpectation] self, to support further chaining. + # @example + # expect(dealer).to receive(:deal_card).at_least(9).times + def at_least(n, &block) + raise_already_invoked_error_if_necessary(__method__) + set_expected_received_count :at_least, n + + if n == 0 + raise "at_least(0) has been removed, use allow(...).to receive(:message) instead" + end + + self.inner_implementation_action = block + + self + end + + # Constrain a message expectation to be received at most a specific + # number of times. + # + # @return [MessageExpectation] self, to support further chaining. + # @example + # expect(dealer).to receive(:deal_card).at_most(10).times + def at_most(n, &block) + raise_already_invoked_error_if_necessary(__method__) + self.inner_implementation_action = block + set_expected_received_count :at_most, n + self + end + + # Syntactic sugar for `exactly`, `at_least` and `at_most` + # + # @return [MessageExpectation] self, to support further chaining. + # @example + # expect(dealer).to receive(:deal_card).exactly(10).times + # expect(dealer).to receive(:deal_card).at_least(10).times + # expect(dealer).to receive(:deal_card).at_most(10).times + def times(&block) + self.inner_implementation_action = block + self + end + alias time times + + # Expect a message not to be received at all. + # + # @return [MessageExpectation] self, to support further chaining. + # @example + # expect(car).to receive(:stop).never + def never + error_generator.raise_double_negation_error("expect(obj)") if negative? + @expected_received_count = 0 + self + end + + # Expect a message to be received exactly one time. + # + # @return [MessageExpectation] self, to support further chaining. + # @example + # expect(car).to receive(:go).once + def once(&block) + self.inner_implementation_action = block + set_expected_received_count :exactly, 1 + self + end + + # Expect a message to be received exactly two times. + # + # @return [MessageExpectation] self, to support further chaining. + # @example + # expect(car).to receive(:go).twice + def twice(&block) + self.inner_implementation_action = block + set_expected_received_count :exactly, 2 + self + end + + # Expect a message to be received exactly three times. + # + # @return [MessageExpectation] self, to support further chaining. + # @example + # expect(car).to receive(:go).thrice + def thrice(&block) + self.inner_implementation_action = block + set_expected_received_count :exactly, 3 + self + end + # @!endgroup + + # @!group Other Constraints + + # Constrains a stub or message expectation to invocations with specific + # arguments. + # + # With a stub, if the message might be received with other args as well, + # you should stub a default value first, and then stub or mock the same + # message using `with` to constrain to specific arguments. + # + # A message expectation will fail if the message is received with different + # arguments. + # + # @return [MessageExpectation] self, to support further chaining. + # @example + # allow(cart).to receive(:add) { :failure } + # allow(cart).to receive(:add).with(Book.new(:isbn => 1934356379)) { :success } + # cart.add(Book.new(:isbn => 1234567890)) + # # => :failure + # cart.add(Book.new(:isbn => 1934356379)) + # # => :success + # + # expect(cart).to receive(:add).with(Book.new(:isbn => 1934356379)) { :success } + # cart.add(Book.new(:isbn => 1234567890)) + # # => failed expectation + # cart.add(Book.new(:isbn => 1934356379)) + # # => passes + def with(*args, &block) + raise_already_invoked_error_if_necessary(__method__) + if args.empty? + raise ArgumentError, + "`with` must have at least one argument. Use `no_args` matcher to set the expectation of receiving no arguments." + end + + self.inner_implementation_action = block + @argument_list_matcher = ArgumentListMatcher.new(*args) + self + end + ruby2_keywords(:with) if respond_to?(:ruby2_keywords, true) + + # Expect messages to be received in a specific order. + # + # @return [MessageExpectation] self, to support further chaining. + # @example + # expect(api).to receive(:prepare).ordered + # expect(api).to receive(:run).ordered + # expect(api).to receive(:finish).ordered + def ordered(&block) + if type == :stub + RSpec.warning( + "`allow(...).to receive(..).ordered` is not supported and will " \ + "have no effect, use `and_return(*ordered_values)` instead." + ) + end + + self.inner_implementation_action = block + additional_expected_calls.times do + @order_group.register(self) + end + @ordered = true + self + end + + # @return [String] a nice representation of the message expectation + def to_s + args_description = error_generator.method_call_args_description(@argument_list_matcher.expected_args, "", "") { true } + args_description = "(#{args_description})" unless args_description.start_with?("(") + "#<#{self.class} #{error_generator.intro}.#{message}#{args_description}>" + end + alias inspect to_s + + # @private + # Contains the parts of `MessageExpectation` that aren't part of + # rspec-mocks' public API. The class is very big and could really use + # some collaborators it delegates to for this stuff but for now this was + # the simplest way to split the public from private stuff to make it + # easier to publish the docs for the APIs we want published. + # rubocop:disable Metrics/ModuleLength + module ImplementationDetails + attr_accessor :error_generator, :implementation + attr_reader :message + attr_reader :orig_object + attr_writer :expected_received_count, :expected_from, :argument_list_matcher + protected :expected_received_count=, :expected_from=, :error_generator=, :implementation= + + # @private + attr_reader :type + + # rubocop:disable Metrics/ParameterLists + def initialize(error_generator, expectation_ordering, expected_from, method_double, + type=:expectation, opts={}, &implementation_block) + @type = type + @error_generator = error_generator + @error_generator.opts = error_generator.opts.merge(opts) + @expected_from = expected_from + @method_double = method_double + @orig_object = @method_double.object + @message = @method_double.method_name + @actual_received_count = 0 + @actual_received_count_write_mutex = Support::Mutex.new + @expected_received_count = type == :expectation ? 1 : :any + @argument_list_matcher = ArgumentListMatcher::MATCH_ALL + @order_group = expectation_ordering + @order_group.register(self) unless type == :stub + @expectation_type = type + @ordered = false + @at_least = @at_most = @exactly = nil + + # Initialized to nil so that we don't allocate an array for every + # mock or stub. See also comment in `and_yield`. + @args_to_yield = nil + @eval_context = nil + @yield_receiver_to_implementation_block = false + + @implementation = Implementation.new + self.inner_implementation_action = implementation_block + end + # rubocop:enable Metrics/ParameterLists + + def expected_args + @argument_list_matcher.expected_args + end + + def and_yield_receiver_to_implementation + @yield_receiver_to_implementation_block = true + self + end + + def yield_receiver_to_implementation_block? + @yield_receiver_to_implementation_block + end + + def matches?(message, *args) + @message == message && @argument_list_matcher.args_match?(*args) + end + ruby2_keywords :matches? if respond_to?(:ruby2_keywords, true) + + def safe_invoke(parent_stub, *args, &block) + invoke_incrementing_actual_calls_by(1, false, parent_stub, *args, &block) + end + ruby2_keywords :safe_invoke if respond_to?(:ruby2_keywords, true) + + def invoke(parent_stub, *args, &block) + invoke_incrementing_actual_calls_by(1, true, parent_stub, *args, &block) + end + ruby2_keywords :invoke if respond_to?(:ruby2_keywords, true) + + def invoke_without_incrementing_received_count(parent_stub, *args, &block) + invoke_incrementing_actual_calls_by(0, true, parent_stub, *args, &block) + end + ruby2_keywords :invoke_without_incrementing_received_count if respond_to?(:ruby2_keywords, true) + + def negative? + @expected_received_count == 0 && !@at_least + end + + def called_max_times? + @expected_received_count != :any && + !@at_least && + @expected_received_count > 0 && + @actual_received_count >= @expected_received_count + end + + def matches_name_but_not_args(message, *args) + @message == message && !@argument_list_matcher.args_match?(*args) + end + + def verify_messages_received + return if expected_messages_received? + generate_error + end + + def expected_messages_received? + ignoring_args? || matches_exact_count? || matches_at_least_count? || matches_at_most_count? + end + + def ensure_expected_ordering_received! + @order_group.verify_invocation_order(self) if @ordered + true + end + + def ignoring_args? + @expected_received_count == :any + end + + def matches_at_least_count? + @at_least && @actual_received_count >= @expected_received_count + end + + def matches_at_most_count? + @at_most && @actual_received_count <= @expected_received_count + end + + def matches_exact_count? + @expected_received_count == @actual_received_count + end + + def similar_messages + @similar_messages ||= [] + end + + def advise(*args) + similar_messages << args + end + + def unadvise(args) + similar_messages.delete_if { |message| args.include?(message) } + end + + def generate_error + if similar_messages.empty? + @error_generator.raise_expectation_error( + @message, @expected_received_count, @argument_list_matcher, + @actual_received_count, expectation_count_type, expected_args, + @expected_from, exception_source_id + ) + else + @error_generator.raise_similar_message_args_error( + self, @similar_messages, @expected_from + ) + end + end + + def raise_unexpected_message_args_error(args_for_multiple_calls) + @error_generator.raise_unexpected_message_args_error(self, args_for_multiple_calls, exception_source_id) + end + + def expectation_count_type + return :at_least if @at_least + return :at_most if @at_most + nil + end + + def description_for(verb) + @error_generator.describe_expectation( + verb, @message, @expected_received_count, + @actual_received_count, expected_args + ) + end + + def raise_out_of_order_error + @error_generator.raise_out_of_order_error @message + end + + def additional_expected_calls + return 0 if @expectation_type == :stub || !@exactly + @expected_received_count - 1 + end + + def ordered? + @ordered + end + + def negative_expectation_for?(message) + @message == message && negative? + end + + def actual_received_count_matters? + @at_least || @at_most || @exactly + end + + def increase_actual_received_count! + @actual_received_count_write_mutex.synchronize do + @actual_received_count += 1 + end + end + + private + + def exception_source_id + @exception_source_id ||= "#{self.class.name} #{__id__}" + end + + def invoke_incrementing_actual_calls_by(increment, allowed_to_fail, parent_stub, *args, &block) + args.unshift(orig_object) if yield_receiver_to_implementation_block? + + if negative? || (allowed_to_fail && (@exactly || @at_most) && (@actual_received_count == @expected_received_count)) + # args are the args we actually received, @argument_list_matcher is the + # list of args we were expecting + @error_generator.raise_expectation_error( + @message, @expected_received_count, + @argument_list_matcher, + @actual_received_count + increment, + expectation_count_type, args, nil, exception_source_id + ) + end + + @order_group.handle_order_constraint self + + if implementation.present? + implementation.call(*args, &block) + elsif parent_stub + parent_stub.invoke(nil, *args, &block) + end + ensure + @actual_received_count_write_mutex.synchronize do + @actual_received_count += increment + end + end + ruby2_keywords :invoke_incrementing_actual_calls_by if respond_to?(:ruby2_keywords, true) + + def has_been_invoked? + @actual_received_count > 0 + end + + def raise_already_invoked_error_if_necessary(calling_customization) + return unless has_been_invoked? + + error_generator.raise_already_invoked_error(message, calling_customization) + end + + def set_expected_received_count(relativity, n) + raise "`count` is not supported with negative message expectations" if negative? + @at_least = (relativity == :at_least) + @at_most = (relativity == :at_most) + @exactly = (relativity == :exactly) + @expected_received_count = case n + when Numeric then n + when :once then 1 + when :twice then 2 + when :thrice then 3 + end + end + + def initial_implementation_action=(action) + implementation.initial_action = action + end + + def inner_implementation_action=(action) + return unless action + warn_about_stub_override if implementation.inner_action + implementation.inner_action = action + end + + def terminal_implementation_action=(action) + implementation.terminal_action = action + end + + def warn_about_stub_override + RSpec.warning( + "You're overriding a previous stub implementation of `#{@message}`. " \ + "Called from #{CallerFilter.first_non_rspec_line}." + ) + end + + def wrap_original(method_name, &block) + if RSpec::Mocks::TestDouble === @method_double.object + @error_generator.raise_only_valid_on_a_partial_double(method_name) + else + warn_about_stub_override if implementation.inner_action + @implementation = AndWrapOriginalImplementation.new(@method_double.original_implementation_callable, block) + @yield_receiver_to_implementation_block = false + end + + nil + end + end + # rubocop:enable Metrics/ModuleLength + + include ImplementationDetails + end + + # Handles the implementation of an `and_yield` declaration. + # @private + class AndYieldImplementation + def initialize(args_to_yield, eval_context, error_generator) + @args_to_yield = args_to_yield + @eval_context = eval_context + @error_generator = error_generator + end + + def call(*_args_to_ignore, &block) + return if @args_to_yield.empty? && @eval_context.nil? + + @error_generator.raise_missing_block_error @args_to_yield unless block + value = nil + block_signature = Support::BlockSignature.new(block) + + @args_to_yield.each do |args| + unless Support::StrictSignatureVerifier.new(block_signature, args).valid? + @error_generator.raise_wrong_arity_error(args, block_signature) + end + + value = @eval_context ? @eval_context.instance_exec(*args, &block) : yield(*args) + end + value + end + end + + # Handles the implementation of an `and_return` implementation. + # @private + class AndReturnImplementation + def initialize(values_to_return) + @values_to_return = values_to_return + end + + def call(*_args_to_ignore, &_block) + if @values_to_return.size > 1 + @values_to_return.shift + else + @values_to_return.first + end + end + end + + # Handles the implementation of an `and_invoke` implementation. + # @private + class AndInvokeImplementation + def initialize(procs_to_invoke) + @procs_to_invoke = procs_to_invoke + end + + def call(*args, &block) + proc = if @procs_to_invoke.size > 1 + @procs_to_invoke.shift + else + @procs_to_invoke.first + end + + proc.call(*args, &block) + end + end + + # Represents a configured implementation. Takes into account + # any number of sub-implementations. + # @private + class Implementation + attr_accessor :initial_action, :inner_action, :terminal_action + + def call(*args, &block) + actions.map do |action| + action.call(*args, &block) + end.last + end + ruby2_keywords :call if respond_to?(:ruby2_keywords, true) + + def present? + actions.any? + end + + private + + def actions + [initial_action, inner_action, terminal_action].compact + end + end + + # Represents an `and_call_original` implementation. + # @private + class AndWrapOriginalImplementation + def initialize(method, block) + @method = method + @block = block + end + + CannotModifyFurtherError = Class.new(StandardError) + + def initial_action=(_value) + raise cannot_modify_further_error + end + + def inner_action=(_value) + raise cannot_modify_further_error + end + + def terminal_action=(_value) + raise cannot_modify_further_error + end + + def present? + true + end + + def inner_action + true + end + + def call(*args, &block) + @block.call(@method, *args, &block) + end + ruby2_keywords :call if respond_to?(:ruby2_keywords, true) + + private + + def cannot_modify_further_error + CannotModifyFurtherError.new "This method has already been configured " \ + "to call the original implementation, and cannot be modified further." + end + end + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/rspec-mocks-3.11.1/lib/rspec/mocks/method_double.rb b/vendor/bundle/ruby/3.1.0/gems/rspec-mocks-3.11.1/lib/rspec/mocks/method_double.rb new file mode 100644 index 000000000..f08205c16 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/rspec-mocks-3.11.1/lib/rspec/mocks/method_double.rb @@ -0,0 +1,291 @@ +module RSpec + module Mocks + # @private + class MethodDouble + # @private + attr_reader :method_name, :object, :expectations, :stubs, :method_stasher + + # @private + def initialize(object, method_name, proxy) + @method_name = method_name + @object = object + @proxy = proxy + + @original_visibility = nil + @method_stasher = InstanceMethodStasher.new(object, method_name) + @method_is_proxied = false + @expectations = [] + @stubs = [] + end + + def original_implementation_callable + # If original method is not present, uses the `method_missing` + # handler of the object. This accounts for cases where the user has not + # correctly defined `respond_to?`, and also 1.8 which does not provide + # method handles for missing methods even if `respond_to?` is correct. + @original_implementation_callable ||= original_method || + Proc.new do |*args, &block| + @object.__send__(:method_missing, @method_name, *args, &block) + end + end + + alias_method :save_original_implementation_callable!, :original_implementation_callable + + def original_method + @original_method ||= + @method_stasher.original_method || + @proxy.original_method_handle_for(method_name) + end + + # @private + def visibility + @proxy.visibility_for(@method_name) + end + + # @private + def object_singleton_class + class << @object; self; end + end + + # @private + def configure_method + @original_visibility = visibility + @method_stasher.stash unless @method_is_proxied + define_proxy_method + end + + # @private + def define_proxy_method + return if @method_is_proxied + + save_original_implementation_callable! + definition_target.class_exec(self, method_name, @original_visibility || visibility) do |method_double, method_name, visibility| + define_method(method_name) do |*args, &block| + method_double.proxy_method_invoked(self, *args, &block) + end + # This can't be `if respond_to?(:ruby2_keywords, true)`, + # see https://github.com/rspec/rspec-mocks/pull/1385#issuecomment-755340298 + ruby2_keywords(method_name) if Module.private_method_defined?(:ruby2_keywords) + __send__(visibility, method_name) + end + + @method_is_proxied = true + end + + # The implementation of the proxied method. Subclasses may override this + # method to perform additional operations. + # + # @private + def proxy_method_invoked(_obj, *args, &block) + @proxy.message_received method_name, *args, &block + end + ruby2_keywords :proxy_method_invoked if respond_to?(:ruby2_keywords, true) + + # @private + def restore_original_method + return show_frozen_warning if object_singleton_class.frozen? + return unless @method_is_proxied + + remove_method_from_definition_target + @method_stasher.restore if @method_stasher.method_is_stashed? + restore_original_visibility + + @method_is_proxied = false + end + + # @private + def show_frozen_warning + RSpec.warn_with( + "WARNING: rspec-mocks was unable to restore the original `#{@method_name}` " \ + "method on #{@object.inspect} because it has been frozen. If you reuse this " \ + "object, `#{@method_name}` will continue to respond with its stub implementation.", + :call_site => nil, + :use_spec_location_as_call_site => true + ) + end + + # @private + def restore_original_visibility + return unless @original_visibility && + MethodReference.method_defined_at_any_visibility?(object_singleton_class, @method_name) + + object_singleton_class.__send__(@original_visibility, method_name) + end + + # @private + def verify + expectations.each { |e| e.verify_messages_received } + end + + # @private + def reset + restore_original_method + clear + end + + # @private + def clear + expectations.clear + stubs.clear + end + + # The type of message expectation to create has been extracted to its own + # method so that subclasses can override it. + # + # @private + def message_expectation_class + MessageExpectation + end + + # @private + def add_expectation(error_generator, expectation_ordering, expected_from, opts, &implementation) + configure_method + expectation = message_expectation_class.new(error_generator, expectation_ordering, + expected_from, self, :expectation, opts, &implementation) + expectations << expectation + expectation + end + + # @private + def build_expectation(error_generator, expectation_ordering) + expected_from = IGNORED_BACKTRACE_LINE + message_expectation_class.new(error_generator, expectation_ordering, expected_from, self) + end + + # @private + def add_stub(error_generator, expectation_ordering, expected_from, opts={}, &implementation) + configure_method + stub = message_expectation_class.new(error_generator, expectation_ordering, expected_from, + self, :stub, opts, &implementation) + stubs.unshift stub + stub + end + + # A simple stub can only return a concrete value for a message, and + # cannot match on arguments. It is used as an optimization over + # `add_stub` / `add_expectation` where it is known in advance that this + # is all that will be required of a stub, such as when passing attributes + # to the `double` example method. They do not stash or restore existing method + # definitions. + # + # @private + def add_simple_stub(method_name, response) + setup_simple_method_double method_name, response, stubs + end + + # @private + def add_simple_expectation(method_name, response, error_generator, backtrace_line) + setup_simple_method_double method_name, response, expectations, error_generator, backtrace_line + end + + # @private + def setup_simple_method_double(method_name, response, collection, error_generator=nil, backtrace_line=nil) + define_proxy_method + + me = SimpleMessageExpectation.new(method_name, response, error_generator, backtrace_line) + collection.unshift me + me + end + + # @private + def add_default_stub(*args, &implementation) + return if stubs.any? + add_stub(*args, &implementation) + end + + # @private + def remove_stub + raise_method_not_stubbed_error if stubs.empty? + remove_stub_if_present + end + + # @private + def remove_stub_if_present + expectations.empty? ? reset : stubs.clear + end + + # @private + def raise_method_not_stubbed_error + RSpec::Mocks.error_generator.raise_method_not_stubbed_error(method_name) + end + + # In Ruby 2.0.0 and above prepend will alter the method lookup chain. + # We use an object's singleton class to define method doubles upon, + # however if the object has had its singleton class (as opposed to + # its actual class) prepended too then the the method lookup chain + # will look in the prepended module first, **before** the singleton + # class. + # + # This code works around that by providing a mock definition target + # that is either the singleton class, or if necessary, a prepended module + # of our own. + # + if Support::RubyFeatures.module_prepends_supported? + + private + + # We subclass `Module` in order to be able to easily detect our prepended module. + RSpecPrependedModule = Class.new(Module) + + def definition_target + @definition_target ||= usable_rspec_prepended_module || object_singleton_class + end + + def usable_rspec_prepended_module + @proxy.prepended_modules_of_singleton_class.each do |mod| + # If we have one of our modules prepended before one of the user's + # modules that defines the method, use that, since our module's + # definition will take precedence. + return mod if RSpecPrependedModule === mod + + # If we hit a user module with the method defined first, + # we must create a new prepend module, even if one exists later, + # because ours will only take precedence if it comes first. + return new_rspec_prepended_module if mod.method_defined?(method_name) + end + + nil + end + + def new_rspec_prepended_module + RSpecPrependedModule.new.tap do |mod| + object_singleton_class.__send__ :prepend, mod + end + end + + else + + private + + def definition_target + object_singleton_class + end + + end + + private + + def remove_method_from_definition_target + definition_target.__send__(:remove_method, @method_name) + rescue NameError + # This can happen when the method has been monkeyed with by + # something outside RSpec. This happens, for example, when + # `file.write` has been stubbed, and then `file.reopen(other_io)` + # is later called, as `File#reopen` appears to redefine `write`. + # + # Note: we could avoid rescuing this by checking + # `definition_target.instance_method(@method_name).owner == definition_target`, + # saving us from the cost of the expensive exception, but this error is + # extremely rare (it was discovered on 2014-12-30, only happens on + # RUBY_VERSION < 2.0 and our spec suite only hits this condition once), + # so we'd rather avoid the cost of that check for every method double, + # and risk the rare situation where this exception will get raised. + RSpec.warn_with( + "WARNING: RSpec could not fully restore #{@object.inspect}." \ + "#{@method_name}, possibly because the method has been redefined " \ + "by something outside of RSpec." + ) + end + end + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/rspec-mocks-3.11.1/lib/rspec/mocks/method_reference.rb b/vendor/bundle/ruby/3.1.0/gems/rspec-mocks-3.11.1/lib/rspec/mocks/method_reference.rb new file mode 100644 index 000000000..026c2c07d --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/rspec-mocks-3.11.1/lib/rspec/mocks/method_reference.rb @@ -0,0 +1,202 @@ +RSpec::Support.require_rspec_support 'comparable_version' + +module RSpec + module Mocks + # Represents a method on an object that may or may not be defined. + # The method may be an instance method on a module or a method on + # any object. + # + # @private + class MethodReference + def self.for(object_reference, method_name) + new(object_reference, method_name) + end + + def initialize(object_reference, method_name) + @object_reference = object_reference + @method_name = method_name + end + + # A method is implemented if sending the message does not result in + # a `NoMethodError`. It might be dynamically implemented by + # `method_missing`. + def implemented? + @object_reference.when_loaded do |m| + method_implemented?(m) + end + end + + # Returns true if we definitively know that sending the method + # will result in a `NoMethodError`. + # + # This is not simply the inverse of `implemented?`: there are + # cases when we don't know if a method is implemented and + # both `implemented?` and `unimplemented?` will return false. + def unimplemented? + @object_reference.when_loaded do |_m| + return !implemented? + end + + # If it's not loaded, then it may be implemented but we can't check. + false + end + + # A method is defined if we are able to get a `Method` object for it. + # In that case, we can assert against metadata like the arity. + def defined? + @object_reference.when_loaded do |m| + method_defined?(m) + end + end + + def with_signature + return unless (original = original_method) + yield Support::MethodSignature.new(original) + end + + def visibility + @object_reference.when_loaded do |m| + return visibility_from(m) + end + + # When it's not loaded, assume it's public. We don't want to + # wrongly treat the method as private. + :public + end + + def self.instance_method_visibility_for(klass, method_name) + if klass.public_method_defined?(method_name) + :public + elsif klass.private_method_defined?(method_name) + :private + elsif klass.protected_method_defined?(method_name) + :protected + end + end + + class << self + alias method_defined_at_any_visibility? instance_method_visibility_for + end + + def self.method_visibility_for(object, method_name) + vis = instance_method_visibility_for(class << object; self; end, method_name) + + # If the method is not defined on the class, `instance_method_visibility_for` + # returns `nil`. However, it may be handled dynamically by `method_missing`, + # so here we check `respond_to` (passing false to not check private methods). + # + # This only considers the public case, but I don't think it's possible to + # write `method_missing` in such a way that it handles a dynamic message + # with private or protected visibility. Ruby doesn't provide you with + # the caller info. + return vis unless vis.nil? + + proxy = RSpec::Mocks.space.proxy_for(object) + respond_to = proxy.method_double_if_exists_for_message(:respond_to?) + + visible = respond_to && respond_to.original_method.call(method_name) || + object.respond_to?(method_name) + + return :public if visible + end + + private + + def original_method + @object_reference.when_loaded do |m| + self.defined? && find_method(m) + end + end + end + + # @private + class InstanceMethodReference < MethodReference + private + + def method_implemented?(mod) + MethodReference.method_defined_at_any_visibility?(mod, @method_name) + end + + # Ideally, we'd use `respond_to?` for `method_implemented?` but we need a + # reference to an instance to do that and we don't have one. Note that + # we may get false negatives: if the method is implemented via + # `method_missing`, we'll return `false` even though it meets our + # definition of "implemented". However, it's the best we can do. + alias method_defined? method_implemented? + + # works around the fact that repeated calls for method parameters will + # falsely return empty arrays on JRuby in certain circumstances, this + # is necessary here because we can't dup/clone UnboundMethods. + # + # This is necessary due to a bug in JRuby prior to 1.7.5 fixed in: + # https://github.com/jruby/jruby/commit/99a0613fe29935150d76a9a1ee4cf2b4f63f4a27 + if RUBY_PLATFORM == 'java' && RSpec::Support::ComparableVersion.new(JRUBY_VERSION) < '1.7.5' + def find_method(mod) + mod.dup.instance_method(@method_name) + end + else + def find_method(mod) + mod.instance_method(@method_name) + end + end + + def visibility_from(mod) + MethodReference.instance_method_visibility_for(mod, @method_name) + end + end + + # @private + class ObjectMethodReference < MethodReference + def self.for(object_reference, method_name) + if ClassNewMethodReference.applies_to?(method_name) { object_reference.when_loaded { |o| o } } + ClassNewMethodReference.new(object_reference, method_name) + else + super + end + end + + private + + def method_implemented?(object) + object.respond_to?(@method_name, true) + end + + def method_defined?(object) + (class << object; self; end).method_defined?(@method_name) + end + + def find_method(object) + object.method(@method_name) + end + + def visibility_from(object) + MethodReference.method_visibility_for(object, @method_name) + end + end + + # When a class's `.new` method is stubbed, we want to use the method + # signature from `#initialize` because `.new`'s signature is a generic + # `def new(*args)` and it simply delegates to `#initialize` and forwards + # all args...so the method with the actually used signature is `#initialize`. + # + # This method reference implementation handles that specific case. + # @private + class ClassNewMethodReference < ObjectMethodReference + def self.applies_to?(method_name) + return false unless method_name == :new + klass = yield + return false unless klass.respond_to?(:new, true) + + # We only want to apply our special logic to normal `new` methods. + # Methods that the user has monkeyed with should be left as-is. + ::RSpec::Support.method_handle_for(klass, :new).owner == ::Class + end + + def with_signature + @object_reference.when_loaded do |klass| + yield Support::MethodSignature.new(klass.instance_method(:initialize)) + end + end + end + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/rspec-mocks-3.11.1/lib/rspec/mocks/minitest_integration.rb b/vendor/bundle/ruby/3.1.0/gems/rspec-mocks-3.11.1/lib/rspec/mocks/minitest_integration.rb new file mode 100644 index 000000000..c7a7bab45 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/rspec-mocks-3.11.1/lib/rspec/mocks/minitest_integration.rb @@ -0,0 +1,68 @@ +require 'rspec/mocks' + +module RSpec + module Mocks + # @private + module MinitestIntegration + include ::RSpec::Mocks::ExampleMethods + + def before_setup + ::RSpec::Mocks.setup + super + end + + def after_teardown + super + + # Only verify if there's not already an error. Otherwise + # we risk getting the same failure twice, since negative + # expectation violations raise both when the message is + # unexpectedly received, and also during `verify` (in case + # the first failure was caught by user code via a + # `rescue Exception`). + ::RSpec::Mocks.verify unless failures.any? + ensure + ::RSpec::Mocks.teardown + end + end + end +end + +Minitest::Test.send(:include, RSpec::Mocks::MinitestIntegration) + +if defined?(::Minitest::Expectation) + if defined?(::RSpec::Expectations) && ::Minitest::Expectation.method_defined?(:to) + # rspec/expectations/minitest_integration has already been loaded and + # has defined `to`/`not_to`/`to_not` on `Minitest::Expectation` so we do + # not want to here (or else we would interfere with rspec-expectations' definition). + else + # ...otherwise, define those methods now. If `rspec/expectations/minitest_integration` + # is loaded after this file, it'll overide the defintion here. + Minitest::Expectation.class_eval do + include RSpec::Mocks::ExpectationTargetMethods + + def to(*args) + ctx.assertions += 1 + super + end + + def not_to(*args) + ctx.assertions += 1 + super + end + + def to_not(*args) + ctx.assertions += 1 + super + end + end + end +end + +module RSpec + module Mocks + remove_const :MockExpectationError + # Raised when a message expectation is not satisfied. + MockExpectationError = ::Minitest::Assertion + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/rspec-mocks-3.11.1/lib/rspec/mocks/mutate_const.rb b/vendor/bundle/ruby/3.1.0/gems/rspec-mocks-3.11.1/lib/rspec/mocks/mutate_const.rb new file mode 100644 index 000000000..c5b0b7921 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/rspec-mocks-3.11.1/lib/rspec/mocks/mutate_const.rb @@ -0,0 +1,339 @@ +RSpec::Support.require_rspec_support 'recursive_const_methods' + +module RSpec + module Mocks + # Provides information about constants that may (or may not) + # have been mutated by rspec-mocks. + class Constant + extend Support::RecursiveConstMethods + + # @api private + def initialize(name) + @name = name + @previously_defined = false + @stubbed = false + @hidden = false + @valid_name = true + yield self if block_given? + end + + # @return [String] The fully qualified name of the constant. + attr_reader :name + + # @return [Object, nil] The original value (e.g. before it + # was mutated by rspec-mocks) of the constant, or + # nil if the constant was not previously defined. + attr_accessor :original_value + + # @private + attr_writer :previously_defined, :stubbed, :hidden, :valid_name + + # @return [Boolean] Whether or not the constant was defined + # before the current example. + def previously_defined? + @previously_defined + end + + # @return [Boolean] Whether or not rspec-mocks has mutated + # (stubbed or hidden) this constant. + def mutated? + @stubbed || @hidden + end + + # @return [Boolean] Whether or not rspec-mocks has stubbed + # this constant. + def stubbed? + @stubbed + end + + # @return [Boolean] Whether or not rspec-mocks has hidden + # this constant. + def hidden? + @hidden + end + + # @return [Boolean] Whether or not the provided constant name + # is a valid Ruby constant name. + def valid_name? + @valid_name + end + + # The default `to_s` isn't very useful, so a custom version is provided. + def to_s + "#<#{self.class.name} #{name}>" + end + alias inspect to_s + + # @private + def self.unmutated(name) + previously_defined = !!recursive_const_defined?(name) + rescue NameError + new(name) do |c| + c.valid_name = false + end + else + new(name) do |const| + const.previously_defined = previously_defined + const.original_value = recursive_const_get(name) if previously_defined + end + end + + # Queries rspec-mocks to find out information about the named constant. + # + # @param [String] name the name of the constant + # @return [Constant] an object contaning information about the named + # constant. + def self.original(name) + mutator = ::RSpec::Mocks.space.constant_mutator_for(name) + mutator ? mutator.to_constant : unmutated(name) + end + end + + # Provides a means to stub constants. + class ConstantMutator + extend Support::RecursiveConstMethods + + # Stubs a constant. + # + # @param (see ExampleMethods#stub_const) + # @option (see ExampleMethods#stub_const) + # @return (see ExampleMethods#stub_const) + # + # @see ExampleMethods#stub_const + # @note It's recommended that you use `stub_const` in your + # examples. This is an alternate public API that is provided + # so you can stub constants in other contexts (e.g. helper + # classes). + def self.stub(constant_name, value, options={}) + unless String === constant_name + raise ArgumentError, "`stub_const` requires a String, but you provided a #{constant_name.class.name}" + end + + mutator = if recursive_const_defined?(constant_name, &raise_on_invalid_const) + DefinedConstantReplacer + else + UndefinedConstantSetter + end + + mutate(mutator.new(constant_name, value, options[:transfer_nested_constants])) + value + end + + # Hides a constant. + # + # @param (see ExampleMethods#hide_const) + # + # @see ExampleMethods#hide_const + # @note It's recommended that you use `hide_const` in your + # examples. This is an alternate public API that is provided + # so you can hide constants in other contexts (e.g. helper + # classes). + def self.hide(constant_name) + mutate(ConstantHider.new(constant_name, nil, {})) + nil + end + + # Contains common functionality used by all of the constant mutators. + # + # @private + class BaseMutator + include Support::RecursiveConstMethods + + attr_reader :original_value, :full_constant_name + + def initialize(full_constant_name, mutated_value, transfer_nested_constants) + @full_constant_name = normalize_const_name(full_constant_name) + @mutated_value = mutated_value + @transfer_nested_constants = transfer_nested_constants + @context_parts = @full_constant_name.split('::') + @const_name = @context_parts.pop + @reset_performed = false + end + + def to_constant + const = Constant.new(full_constant_name) + const.original_value = original_value + + const + end + + def idempotently_reset + reset unless @reset_performed + @reset_performed = true + end + end + + # Hides a defined constant for the duration of an example. + # + # @private + class ConstantHider < BaseMutator + def mutate + return unless (@defined = recursive_const_defined?(full_constant_name)) + @context = recursive_const_get(@context_parts.join('::')) + @original_value = get_const_defined_on(@context, @const_name) + + @context.__send__(:remove_const, @const_name) + end + + def to_constant + return Constant.unmutated(full_constant_name) unless @defined + + const = super + const.hidden = true + const.previously_defined = true + + const + end + + def reset + return unless @defined + @context.const_set(@const_name, @original_value) + end + end + + # Replaces a defined constant for the duration of an example. + # + # @private + class DefinedConstantReplacer < BaseMutator + def initialize(*args) + super + @constants_to_transfer = [] + end + + def mutate + @context = recursive_const_get(@context_parts.join('::')) + @original_value = get_const_defined_on(@context, @const_name) + + @constants_to_transfer = verify_constants_to_transfer! + + @context.__send__(:remove_const, @const_name) + @context.const_set(@const_name, @mutated_value) + + transfer_nested_constants + end + + def to_constant + const = super + const.stubbed = true + const.previously_defined = true + + const + end + + def reset + @constants_to_transfer.each do |const| + @mutated_value.__send__(:remove_const, const) + end + + @context.__send__(:remove_const, @const_name) + @context.const_set(@const_name, @original_value) + end + + def transfer_nested_constants + @constants_to_transfer.each do |const| + @mutated_value.const_set(const, get_const_defined_on(original_value, const)) + end + end + + def verify_constants_to_transfer! + return [] unless should_transfer_nested_constants? + + { @original_value => "the original value", @mutated_value => "the stubbed value" }.each do |value, description| + next if value.respond_to?(:constants) + + raise ArgumentError, + "Cannot transfer nested constants for #{@full_constant_name} " \ + "since #{description} is not a class or module and only classes " \ + "and modules support nested constants." + end + + if Array === @transfer_nested_constants + @transfer_nested_constants = @transfer_nested_constants.map(&:to_s) if RUBY_VERSION == '1.8.7' + undefined_constants = @transfer_nested_constants - constants_defined_on(@original_value) + + if undefined_constants.any? + available_constants = constants_defined_on(@original_value) - @transfer_nested_constants + raise ArgumentError, + "Cannot transfer nested constant(s) #{undefined_constants.join(' and ')} " \ + "for #{@full_constant_name} since they are not defined. Did you mean " \ + "#{available_constants.join(' or ')}?" + end + + @transfer_nested_constants + else + constants_defined_on(@original_value) + end + end + + def should_transfer_nested_constants? + return true if @transfer_nested_constants + return false unless RSpec::Mocks.configuration.transfer_nested_constants? + @original_value.respond_to?(:constants) && @mutated_value.respond_to?(:constants) + end + end + + # Sets an undefined constant for the duration of an example. + # + # @private + class UndefinedConstantSetter < BaseMutator + def mutate + @parent = @context_parts.inject(Object) do |klass, name| + if const_defined_on?(klass, name) + get_const_defined_on(klass, name) + else + ConstantMutator.stub(name_for(klass, name), Module.new) + end + end + + @parent.const_set(@const_name, @mutated_value) + end + + def to_constant + const = super + const.stubbed = true + const.previously_defined = false + + const + end + + def reset + @parent.__send__(:remove_const, @const_name) + end + + private + + def name_for(parent, name) + root = if parent == Object + '' + else + parent.name + end + root + '::' + name + end + end + + # Uses the mutator to mutate (stub or hide) a constant. Ensures that + # the mutator is correctly registered so it can be backed out at the end + # of the test. + # + # @private + def self.mutate(mutator) + ::RSpec::Mocks.space.register_constant_mutator(mutator) + mutator.mutate + end + + # Used internally by the constant stubbing to raise a helpful + # error when a constant like "A::B::C" is stubbed and A::B is + # not a module (and thus, it's impossible to define "A::B::C" + # since only modules can have nested constants). + # + # @api private + def self.raise_on_invalid_const + lambda do |const_name, failed_name| + raise "Cannot stub constant #{failed_name} on #{const_name} " \ + "since #{const_name} is not a module." + end + end + end + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/rspec-mocks-3.11.1/lib/rspec/mocks/object_reference.rb b/vendor/bundle/ruby/3.1.0/gems/rspec-mocks-3.11.1/lib/rspec/mocks/object_reference.rb new file mode 100644 index 000000000..cce2c3313 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/rspec-mocks-3.11.1/lib/rspec/mocks/object_reference.rb @@ -0,0 +1,149 @@ +module RSpec + module Mocks + # @private + class ObjectReference + # Returns an appropriate Object or Module reference based + # on the given argument. + def self.for(object_module_or_name, allow_direct_object_refs=false) + case object_module_or_name + when Module + if anonymous_module?(object_module_or_name) + DirectObjectReference.new(object_module_or_name) + else + # Use a `NamedObjectReference` if it has a name because this + # will use the original value of the constant in case it has + # been stubbed. + NamedObjectReference.new(name_of(object_module_or_name)) + end + when String + NamedObjectReference.new(object_module_or_name) + else + if allow_direct_object_refs + DirectObjectReference.new(object_module_or_name) + else + raise ArgumentError, + "Module or String expected, got #{object_module_or_name.inspect}" + end + end + end + + if Module.new.name.nil? + def self.anonymous_module?(mod) + !name_of(mod) + end + else # 1.8.7 + def self.anonymous_module?(mod) + name_of(mod) == "" + end + end + private_class_method :anonymous_module? + + def self.name_of(mod) + MODULE_NAME_METHOD.bind(mod).call + end + private_class_method :name_of + + # @private + MODULE_NAME_METHOD = Module.instance_method(:name) + end + + # An implementation of rspec-mocks' reference interface. + # Used when an object is passed to {ExampleMethods#object_double}, or + # an anonymous class or module is passed to {ExampleMethods#instance_double} + # or {ExampleMethods#class_double}. + # Represents a reference to that object. + # @see NamedObjectReference + class DirectObjectReference + # @param object [Object] the object to which this refers + def initialize(object) + @object = object + end + + # @return [String] the object's description (via `#inspect`). + def description + @object.inspect + end + + # Defined for interface parity with the other object reference + # implementations. Raises an `ArgumentError` to indicate that `as_stubbed_const` + # is invalid when passing an object argument to `object_double`. + def const_to_replace + raise ArgumentError, + "Can not perform constant replacement with an anonymous object." + end + + # The target of the verifying double (the object itself). + # + # @return [Object] + def target + @object + end + + # Always returns true for an object as the class is defined. + # + # @return [true] + def defined? + true + end + + # Yields if the reference target is loaded, providing a generic mechanism + # to optionally run a bit of code only when a reference's target is + # loaded. + # + # This specific implementation always yields because direct references + # are always loaded. + # + # @yield [Object] the target of this reference. + def when_loaded + yield @object + end + end + + # An implementation of rspec-mocks' reference interface. + # Used when a string is passed to {ExampleMethods#object_double}, + # and when a string, named class or named module is passed to + # {ExampleMethods#instance_double}, or {ExampleMethods#class_double}. + # Represents a reference to the object named (via a constant lookup) + # by the string. + # @see DirectObjectReference + class NamedObjectReference + # @param const_name [String] constant name + def initialize(const_name) + @const_name = const_name + end + + # @return [Boolean] true if the named constant is defined, false otherwise. + def defined? + !!object + end + + # @return [String] the constant name to replace with a double. + def const_to_replace + @const_name + end + alias description const_to_replace + + # @return [Object, nil] the target of the verifying double (the named object), or + # nil if it is not defined. + def target + object + end + + # Yields if the reference target is loaded, providing a generic mechanism + # to optionally run a bit of code only when a reference's target is + # loaded. + # + # @yield [Object] the target object + def when_loaded + yield object if object + end + + private + + def object + return @object if defined?(@object) + @object = Constant.original(@const_name).original_value + end + end + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/rspec-mocks-3.11.1/lib/rspec/mocks/order_group.rb b/vendor/bundle/ruby/3.1.0/gems/rspec-mocks-3.11.1/lib/rspec/mocks/order_group.rb new file mode 100644 index 000000000..a9947995c --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/rspec-mocks-3.11.1/lib/rspec/mocks/order_group.rb @@ -0,0 +1,81 @@ +module RSpec + module Mocks + # @private + class OrderGroup + def initialize + @expectations = [] + @invocation_order = [] + @index = 0 + end + + # @private + def register(expectation) + @expectations << expectation + end + + def invoked(message) + @invocation_order << message + end + + # @private + def ready_for?(expectation) + remaining_expectations.find(&:ordered?) == expectation + end + + # @private + def consume + remaining_expectations.each_with_index do |expectation, index| + next unless expectation.ordered? + + @index += index + 1 + return expectation + end + nil + end + + # @private + def handle_order_constraint(expectation) + return unless expectation.ordered? && remaining_expectations.include?(expectation) + return consume if ready_for?(expectation) + expectation.raise_out_of_order_error + end + + def verify_invocation_order(expectation) + expectation.raise_out_of_order_error unless expectations_invoked_in_order? + true + end + + def clear + @index = 0 + @invocation_order.clear + @expectations.clear + end + + def empty? + @expectations.empty? + end + + private + + def remaining_expectations + @expectations[@index..-1] || [] + end + + def expectations_invoked_in_order? + invoked_expectations == expected_invocations + end + + def invoked_expectations + @expectations.select { |e| e.ordered? && @invocation_order.include?(e) } + end + + def expected_invocations + @invocation_order.map { |invocation| expectation_for(invocation) }.compact + end + + def expectation_for(message) + @expectations.find { |e| message == e } + end + end + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/rspec-mocks-3.11.1/lib/rspec/mocks/proxy.rb b/vendor/bundle/ruby/3.1.0/gems/rspec-mocks-3.11.1/lib/rspec/mocks/proxy.rb new file mode 100644 index 000000000..3f8510578 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/rspec-mocks-3.11.1/lib/rspec/mocks/proxy.rb @@ -0,0 +1,525 @@ +module RSpec + module Mocks + # @private + class Proxy + # @private + SpecificMessage = Struct.new(:object, :message, :args) do + def ==(expectation) + expectation.orig_object == object && expectation.matches?(message, *args) + end + end + + unless defined?(Mutex) + Support.require_rspec_support 'mutex' + Mutex = Support::Mutex + end + + # @private + def ensure_implemented(*_args) + # noop for basic proxies, see VerifyingProxy for behaviour. + end + + # @private + def initialize(object, order_group, options={}) + ensure_can_be_proxied!(object) + + @object = object + @order_group = order_group + @error_generator = ErrorGenerator.new(object) + @messages_received = [] + @messages_received_mutex = Mutex.new + @options = options + @null_object = false + @method_doubles = Hash.new { |h, k| h[k] = MethodDouble.new(@object, k, self) } + end + + # @private + def ensure_can_be_proxied!(object) + return unless object.is_a?(Symbol) || object.frozen? + return if object.nil? + + msg = "Cannot proxy frozen objects" + if Symbol === object + msg << ". Symbols such as #{object} cannot be mocked or stubbed." + else + msg << ", rspec-mocks relies on proxies for method stubbing and expectations." + end + raise ArgumentError, msg + end + + # @private + attr_reader :object + + # @private + def null_object? + @null_object + end + + # @private + # Tells the object to ignore any messages that aren't explicitly set as + # stubs or message expectations. + def as_null_object + @null_object = true + @object + end + + # @private + def original_method_handle_for(_message) + nil + end + + DEFAULT_MESSAGE_EXPECTATION_OPTS = {}.freeze + + # @private + def add_message_expectation(method_name, opts=DEFAULT_MESSAGE_EXPECTATION_OPTS, &block) + location = opts.fetch(:expected_from) { CallerFilter.first_non_rspec_line } + meth_double = method_double_for(method_name) + + if null_object? && !block + meth_double.add_default_stub(@error_generator, @order_group, location, opts) do + @object + end + end + + meth_double.add_expectation @error_generator, @order_group, location, opts, &block + end + + # @private + def add_simple_expectation(method_name, response, location) + method_double_for(method_name).add_simple_expectation method_name, response, @error_generator, location + end + + # @private + def build_expectation(method_name) + meth_double = method_double_for(method_name) + + meth_double.build_expectation( + @error_generator, + @order_group + ) + end + + # @private + def replay_received_message_on(expectation, &block) + expected_method_name = expectation.message + meth_double = method_double_for(expected_method_name) + + if meth_double.expectations.any? + @error_generator.raise_expectation_on_mocked_method(expected_method_name) + end + + unless null_object? || meth_double.stubs.any? + @error_generator.raise_expectation_on_unstubbed_method(expected_method_name) + end + + @messages_received_mutex.synchronize do + @messages_received.each do |(actual_method_name, args, received_block)| + next unless expectation.matches?(actual_method_name, *args) + + expectation.safe_invoke(nil) + block.call(*args, &received_block) if block + end + end + end + + # @private + def check_for_unexpected_arguments(expectation) + @messages_received_mutex.synchronize do + return if @messages_received.empty? + + return if @messages_received.any? { |method_name, args, _| expectation.matches?(method_name, *args) } + + name_but_not_args, others = @messages_received.partition do |(method_name, args, _)| + expectation.matches_name_but_not_args(method_name, *args) + end + + return if name_but_not_args.empty? && !others.empty? + + expectation.raise_unexpected_message_args_error(name_but_not_args.map { |args| args[1] }) + end + end + + # @private + def add_stub(method_name, opts={}, &implementation) + location = opts.fetch(:expected_from) { CallerFilter.first_non_rspec_line } + method_double_for(method_name).add_stub @error_generator, @order_group, location, opts, &implementation + end + + # @private + def add_simple_stub(method_name, response) + method_double_for(method_name).add_simple_stub method_name, response + end + + # @private + def remove_stub(method_name) + method_double_for(method_name).remove_stub + end + + # @private + def remove_stub_if_present(method_name) + method_double_for(method_name).remove_stub_if_present + end + + # @private + def verify + @method_doubles.each_value { |d| d.verify } + end + + # @private + def reset + @messages_received_mutex.synchronize do + @messages_received.clear + end + end + + # @private + def received_message?(method_name, *args, &block) + @messages_received_mutex.synchronize do + @messages_received.any? { |array| array == [method_name, args, block] } + end + end + + # @private + def messages_arg_list + @messages_received_mutex.synchronize do + @messages_received.map { |_, args, _| args } + end + end + + # @private + def has_negative_expectation?(message) + method_double_for(message).expectations.find { |expectation| expectation.negative_expectation_for?(message) } + end + + # @private + def record_message_received(message, *args, &block) + @order_group.invoked SpecificMessage.new(object, message, args) + @messages_received_mutex.synchronize do + @messages_received << [message, args, block] + end + end + + # @private + def message_received(message, *args, &block) + record_message_received message, *args, &block + + expectation = find_matching_expectation(message, *args) + stub = find_matching_method_stub(message, *args) + + if (stub && expectation && expectation.called_max_times?) || (stub && !expectation) + expectation.increase_actual_received_count! if expectation && expectation.actual_received_count_matters? + if (expectation = find_almost_matching_expectation(message, *args)) + expectation.advise(*args) unless expectation.expected_messages_received? + end + stub.invoke(nil, *args, &block) + elsif expectation + expectation.unadvise(messages_arg_list) + expectation.invoke(stub, *args, &block) + elsif (expectation = find_almost_matching_expectation(message, *args)) + expectation.advise(*args) if null_object? unless expectation.expected_messages_received? + + if null_object? || !has_negative_expectation?(message) + expectation.raise_unexpected_message_args_error([args]) + end + elsif (stub = find_almost_matching_stub(message, *args)) + stub.advise(*args) + raise_missing_default_stub_error(stub, [args]) + elsif Class === @object + @object.superclass.__send__(message, *args, &block) + else + @object.__send__(:method_missing, message, *args, &block) + end + end + ruby2_keywords :message_received if respond_to?(:ruby2_keywords, true) + + # @private + def raise_unexpected_message_error(method_name, args) + @error_generator.raise_unexpected_message_error method_name, args + end + + # @private + def raise_missing_default_stub_error(expectation, args_for_multiple_calls) + @error_generator.raise_missing_default_stub_error(expectation, args_for_multiple_calls) + end + + # @private + def visibility_for(_method_name) + # This is the default (for test doubles). Subclasses override this. + :public + end + + if Support::RubyFeatures.module_prepends_supported? + def self.prepended_modules_of(klass) + ancestors = klass.ancestors + + # `|| 0` is necessary for Ruby 2.0, where the singleton class + # is only in the ancestor list when there are prepended modules. + singleton_index = ancestors.index(klass) || 0 + + ancestors[0, singleton_index] + end + + def prepended_modules_of_singleton_class + @prepended_modules_of_singleton_class ||= RSpec::Mocks::Proxy.prepended_modules_of(@object.singleton_class) + end + end + + # @private + def method_double_if_exists_for_message(message) + method_double_for(message) if @method_doubles.key?(message.to_sym) + end + + private + + def method_double_for(message) + @method_doubles[message.to_sym] + end + + def find_matching_expectation(method_name, *args) + find_best_matching_expectation_for(method_name) do |expectation| + expectation.matches?(method_name, *args) + end + end + ruby2_keywords :find_matching_expectation if respond_to?(:ruby2_keywords, true) + + def find_almost_matching_expectation(method_name, *args) + find_best_matching_expectation_for(method_name) do |expectation| + expectation.matches_name_but_not_args(method_name, *args) + end + end + ruby2_keywords :find_almost_matching_expectation if respond_to?(:ruby2_keywords, true) + + def find_best_matching_expectation_for(method_name) + first_match = nil + + method_double_for(method_name).expectations.each do |expectation| + next unless yield expectation + return expectation unless expectation.called_max_times? + first_match ||= expectation + end + + first_match + end + + def find_matching_method_stub(method_name, *args) + method_double_for(method_name).stubs.find { |stub| stub.matches?(method_name, *args) } + end + ruby2_keywords :find_matching_method_stub if respond_to?(:ruby2_keywords, true) + + def find_almost_matching_stub(method_name, *args) + method_double_for(method_name).stubs.find { |stub| stub.matches_name_but_not_args(method_name, *args) } + end + ruby2_keywords :find_almost_matching_stub if respond_to?(:ruby2_keywords, true) + end + + # @private + class TestDoubleProxy < Proxy + def reset + @method_doubles.clear + object.__disallow_further_usage! + super + end + end + + # @private + class PartialDoubleProxy < Proxy + def original_method_handle_for(message) + if any_instance_class_recorder_observing_method?(@object.class, message) + message = ::RSpec::Mocks.space. + any_instance_recorder_for(@object.class). + build_alias_method_name(message) + end + + ::RSpec::Support.method_handle_for(@object, message) + rescue NameError + nil + end + + # @private + def add_simple_expectation(method_name, response, location) + method_double_for(method_name).configure_method + super + end + + # @private + def add_simple_stub(method_name, response) + method_double_for(method_name).configure_method + super + end + + # @private + def visibility_for(method_name) + # We fall back to :public because by default we allow undefined methods + # to be stubbed, and when we do so, we make them public. + MethodReference.method_visibility_for(@object, method_name) || :public + end + + def reset + @method_doubles.each_value { |d| d.reset } + super + end + + def message_received(message, *args, &block) + RSpec::Mocks.space.any_instance_recorders_from_ancestry_of(object).each do |subscriber| + subscriber.notify_received_message(object, message, args, block) + end + super + end + ruby2_keywords :message_received if respond_to?(:ruby2_keywords, true) + + private + + def any_instance_class_recorder_observing_method?(klass, method_name) + only_return_existing = true + recorder = ::RSpec::Mocks.space.any_instance_recorder_for(klass, only_return_existing) + return true if recorder && recorder.already_observing?(method_name) + + superklass = klass.superclass + return false if superklass.nil? + any_instance_class_recorder_observing_method?(superklass, method_name) + end + end + + # @private + # When we mock or stub a method on a class, we have to treat it a bit different, + # because normally singleton method definitions only affect the object on which + # they are defined, but on classes they affect subclasses, too. As a result, + # we need some special handling to get the original method. + module PartialClassDoubleProxyMethods + def initialize(source_space, *args) + @source_space = source_space + super(*args) + end + + # Consider this situation: + # + # class A; end + # class B < A; end + # + # allow(A).to receive(:new) + # expect(B).to receive(:new).and_call_original + # + # When getting the original definition for `B.new`, we cannot rely purely on + # using `B.method(:new)` before our redefinition is defined on `B`, because + # `B.method(:new)` will return a method that will execute the stubbed version + # of the method on `A` since singleton methods on classes are in the lookup + # hierarchy. + # + # To do it properly, we need to find the original definition of `new` from `A` + # from _before_ `A` was stubbed, and we need to rebind it to `B` so that it will + # run with the proper `self`. + # + # That's what this method (together with `original_unbound_method_handle_from_ancestor_for`) + # does. + def original_method_handle_for(message) + unbound_method = superclass_proxy && + superclass_proxy.original_unbound_method_handle_from_ancestor_for(message.to_sym) + + return super unless unbound_method + unbound_method.bind(object) + # :nocov: + rescue TypeError + if RUBY_VERSION == '1.8.7' + # In MRI 1.8.7, a singleton method on a class cannot be rebound to its subclass + if unbound_method && unbound_method.owner.ancestors.first != unbound_method.owner + # This is a singleton method; we can't do anything with it + # But we can work around this using a different implementation + double = method_double_from_ancestor_for(message) + return object.method(double.method_stasher.stashed_method_name) + end + end + raise + # :nocov: + end + + protected + + def original_unbound_method_handle_from_ancestor_for(message) + double = method_double_from_ancestor_for(message) + double && double.original_method.unbind + end + + def method_double_from_ancestor_for(message) + @method_doubles.fetch(message) do + # The fact that there is no method double for this message indicates + # that it has not been redefined by rspec-mocks. We need to continue + # looking up the ancestor chain. + return superclass_proxy && + superclass_proxy.method_double_from_ancestor_for(message) + end + end + + def superclass_proxy + return @superclass_proxy if defined?(@superclass_proxy) + + if (superclass = object.superclass) + @superclass_proxy = @source_space.superclass_proxy_for(superclass) + else + @superclass_proxy = nil + end + end + end + + # @private + class PartialClassDoubleProxy < PartialDoubleProxy + include PartialClassDoubleProxyMethods + end + + # @private + class ProxyForNil < PartialDoubleProxy + def initialize(order_group) + set_expectation_behavior + super(nil, order_group) + end + + attr_accessor :disallow_expectations + attr_accessor :warn_about_expectations + + def add_message_expectation(method_name, opts={}, &block) + warn_or_raise!(method_name) + super + end + + def add_stub(method_name, opts={}, &implementation) + warn_or_raise!(method_name) + super + end + + private + + def set_expectation_behavior + case RSpec::Mocks.configuration.allow_message_expectations_on_nil + when false + @warn_about_expectations = false + @disallow_expectations = true + when true + @warn_about_expectations = false + @disallow_expectations = false + else + @warn_about_expectations = true + @disallow_expectations = false + end + end + + def warn_or_raise!(method_name) + # This method intentionally swallows the message when + # neither disallow_expectations nor warn_about_expectations + # are set to true. + if disallow_expectations + raise_error(method_name) + elsif warn_about_expectations + warn(method_name) + end + end + + def warn(method_name) + warning_msg = @error_generator.expectation_on_nil_message(method_name) + RSpec.warning(warning_msg) + end + + def raise_error(method_name) + @error_generator.raise_expectation_on_nil_error(method_name) + end + end + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/rspec-mocks-3.11.1/lib/rspec/mocks/space.rb b/vendor/bundle/ruby/3.1.0/gems/rspec-mocks-3.11.1/lib/rspec/mocks/space.rb new file mode 100644 index 000000000..f5a4c2406 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/rspec-mocks-3.11.1/lib/rspec/mocks/space.rb @@ -0,0 +1,238 @@ +RSpec::Support.require_rspec_support 'reentrant_mutex' + +module RSpec + module Mocks + # @private + # Provides a default space implementation for outside + # the scope of an example. Called "root" because it serves + # as the root of the space stack. + class RootSpace + def proxy_for(*_args) + raise_lifecycle_message + end + + def any_instance_recorder_for(*_args) + raise_lifecycle_message + end + + def any_instance_proxy_for(*_args) + raise_lifecycle_message + end + + def register_constant_mutator(_mutator) + raise_lifecycle_message + end + + def any_instance_recorders_from_ancestry_of(_object) + raise_lifecycle_message + end + + def reset_all + end + + def verify_all + end + + def registered?(_object) + false + end + + def superclass_proxy_for(*_args) + raise_lifecycle_message + end + + def new_scope + Space.new + end + + private + + def raise_lifecycle_message + raise OutsideOfExampleError, + "The use of doubles or partial doubles from rspec-mocks outside of the per-test lifecycle is not supported." + end + end + + # @private + class Space + attr_reader :proxies, :any_instance_recorders, :proxy_mutex, :any_instance_mutex + + def initialize + @proxies = {} + @any_instance_recorders = {} + @constant_mutators = [] + @expectation_ordering = OrderGroup.new + @proxy_mutex = new_mutex + @any_instance_mutex = new_mutex + end + + def new_scope + NestedSpace.new(self) + end + + def verify_all + proxies.values.each { |proxy| proxy.verify } + any_instance_recorders.each_value { |recorder| recorder.verify } + end + + def reset_all + proxies.each_value { |proxy| proxy.reset } + @constant_mutators.reverse.each { |mut| mut.idempotently_reset } + any_instance_recorders.each_value { |recorder| recorder.stop_all_observation! } + any_instance_recorders.clear + end + + def register_constant_mutator(mutator) + @constant_mutators << mutator + end + + def constant_mutator_for(name) + @constant_mutators.find { |m| m.full_constant_name == name } + end + + def any_instance_recorder_for(klass, only_return_existing=false) + any_instance_mutex.synchronize do + id = klass.__id__ + any_instance_recorders.fetch(id) do + return nil if only_return_existing + any_instance_recorder_not_found_for(id, klass) + end + end + end + + def any_instance_proxy_for(klass) + AnyInstance::Proxy.new(any_instance_recorder_for(klass), proxies_of(klass)) + end + + def proxies_of(klass) + proxies.values.select { |proxy| klass === proxy.object } + end + + def proxy_for(object) + proxy_mutex.synchronize do + id = id_for(object) + proxies.fetch(id) { proxy_not_found_for(id, object) } + end + end + + def superclass_proxy_for(klass) + proxy_mutex.synchronize do + id = id_for(klass) + proxies.fetch(id) { superclass_proxy_not_found_for(id, klass) } + end + end + + alias ensure_registered proxy_for + + def registered?(object) + proxies.key?(id_for object) + end + + def any_instance_recorders_from_ancestry_of(object) + # Optimization: `any_instance` is a feature we generally + # recommend not using, so we can often early exit here + # without doing an O(N) linear search over the number of + # ancestors in the object's class hierarchy. + return [] if any_instance_recorders.empty? + + # We access the ancestors through the singleton class, to avoid calling + # `class` in case `class` has been stubbed. + (class << object; ancestors; end).map do |klass| + any_instance_recorders[klass.__id__] + end.compact + end + + private + + def new_mutex + Support::ReentrantMutex.new + end + + def proxy_not_found_for(id, object) + proxies[id] = case object + when NilClass then ProxyForNil.new(@expectation_ordering) + when TestDouble then object.__build_mock_proxy_unless_expired(@expectation_ordering) + when Class + class_proxy_with_callback_verification_strategy(object, CallbackInvocationStrategy.new) + else + if RSpec::Mocks.configuration.verify_partial_doubles? + VerifyingPartialDoubleProxy.new(object, @expectation_ordering) + else + PartialDoubleProxy.new(object, @expectation_ordering) + end + end + end + + def superclass_proxy_not_found_for(id, object) + raise "superclass_proxy_not_found_for called with something that is not a class" unless Class === object + proxies[id] = class_proxy_with_callback_verification_strategy(object, NoCallbackInvocationStrategy.new) + end + + def class_proxy_with_callback_verification_strategy(object, strategy) + if RSpec::Mocks.configuration.verify_partial_doubles? + VerifyingPartialClassDoubleProxy.new( + self, + object, + @expectation_ordering, + strategy + ) + else + PartialClassDoubleProxy.new(self, object, @expectation_ordering) + end + end + + def any_instance_recorder_not_found_for(id, klass) + any_instance_recorders[id] = AnyInstance::Recorder.new(klass) + end + + if defined?(::BasicObject) && !::BasicObject.method_defined?(:__id__) # for 1.9.2 + require 'securerandom' + + def id_for(object) + id = object.__id__ + + return id if object.equal?(::ObjectSpace._id2ref(id)) + # this suggests that object.__id__ is proxying through to some wrapped object + + object.instance_exec do + @__id_for_rspec_mocks_space ||= ::SecureRandom.uuid + end + end + else + def id_for(object) + object.__id__ + end + end + end + + # @private + class NestedSpace < Space + def initialize(parent) + @parent = parent + super() + end + + def proxies_of(klass) + super + @parent.proxies_of(klass) + end + + def constant_mutator_for(name) + super || @parent.constant_mutator_for(name) + end + + def registered?(object) + super || @parent.registered?(object) + end + + private + + def proxy_not_found_for(id, object) + @parent.proxies[id] || super + end + + def any_instance_recorder_not_found_for(id, klass) + @parent.any_instance_recorders[id] || super + end + end + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/rspec-mocks-3.11.1/lib/rspec/mocks/standalone.rb b/vendor/bundle/ruby/3.1.0/gems/rspec-mocks-3.11.1/lib/rspec/mocks/standalone.rb new file mode 100644 index 000000000..74317b01b --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/rspec-mocks-3.11.1/lib/rspec/mocks/standalone.rb @@ -0,0 +1,3 @@ +require 'rspec/mocks' +extend RSpec::Mocks::ExampleMethods +RSpec::Mocks.setup diff --git a/vendor/bundle/ruby/3.1.0/gems/rspec-mocks-3.11.1/lib/rspec/mocks/syntax.rb b/vendor/bundle/ruby/3.1.0/gems/rspec-mocks-3.11.1/lib/rspec/mocks/syntax.rb new file mode 100644 index 000000000..6305ab961 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/rspec-mocks-3.11.1/lib/rspec/mocks/syntax.rb @@ -0,0 +1,325 @@ +module RSpec + module Mocks + # @api private + # Provides methods for enabling and disabling the available syntaxes + # provided by rspec-mocks. + module Syntax + # @private + def self.warn_about_should! + @warn_about_should = true + end + + # @private + def self.warn_unless_should_configured(method_name , replacement="the new `:expect` syntax or explicitly enable `:should`") + if @warn_about_should + RSpec.deprecate( + "Using `#{method_name}` from rspec-mocks' old `:should` syntax without explicitly enabling the syntax", + :replacement => replacement + ) + + @warn_about_should = false + end + end + + # @api private + # Enables the should syntax (`dbl.stub`, `dbl.should_receive`, etc). + def self.enable_should(syntax_host=default_should_syntax_host) + @warn_about_should = false if syntax_host == default_should_syntax_host + return if should_enabled?(syntax_host) + + syntax_host.class_exec do + def should_receive(message, opts={}, &block) + ::RSpec::Mocks::Syntax.warn_unless_should_configured(__method__) + ::RSpec::Mocks.expect_message(self, message, opts, &block) + end + + def should_not_receive(message, &block) + ::RSpec::Mocks::Syntax.warn_unless_should_configured(__method__) + ::RSpec::Mocks.expect_message(self, message, {}, &block).never + end + + def stub(message_or_hash, opts={}, &block) + ::RSpec::Mocks::Syntax.warn_unless_should_configured(__method__) + if ::Hash === message_or_hash + message_or_hash.each { |message, value| stub(message).and_return value } + else + ::RSpec::Mocks.allow_message(self, message_or_hash, opts, &block) + end + end + + def unstub(message) + ::RSpec::Mocks::Syntax.warn_unless_should_configured(__method__, "`allow(...).to receive(...).and_call_original` or explicitly enable `:should`") + ::RSpec::Mocks.space.proxy_for(self).remove_stub(message) + end + + def stub_chain(*chain, &blk) + ::RSpec::Mocks::Syntax.warn_unless_should_configured(__method__) + ::RSpec::Mocks::StubChain.stub_chain_on(self, *chain, &blk) + end + + def as_null_object + ::RSpec::Mocks::Syntax.warn_unless_should_configured(__method__) + @_null_object = true + ::RSpec::Mocks.space.proxy_for(self).as_null_object + end + + def null_object? + ::RSpec::Mocks::Syntax.warn_unless_should_configured(__method__) + defined?(@_null_object) + end + + def received_message?(message, *args, &block) + ::RSpec::Mocks::Syntax.warn_unless_should_configured(__method__) + ::RSpec::Mocks.space.proxy_for(self).received_message?(message, *args, &block) + end + + unless Class.respond_to? :any_instance + Class.class_exec do + def any_instance + ::RSpec::Mocks::Syntax.warn_unless_should_configured(__method__) + ::RSpec::Mocks.space.any_instance_proxy_for(self) + end + end + end + end + end + + # @api private + # Disables the should syntax (`dbl.stub`, `dbl.should_receive`, etc). + def self.disable_should(syntax_host=default_should_syntax_host) + return unless should_enabled?(syntax_host) + + syntax_host.class_exec do + undef should_receive + undef should_not_receive + undef stub + undef unstub + undef stub_chain + undef as_null_object + undef null_object? + undef received_message? + end + + Class.class_exec do + undef any_instance + end + end + + # @api private + # Enables the expect syntax (`expect(dbl).to receive`, `allow(dbl).to receive`, etc). + def self.enable_expect(syntax_host=::RSpec::Mocks::ExampleMethods) + return if expect_enabled?(syntax_host) + + syntax_host.class_exec do + def receive(method_name, &block) + Matchers::Receive.new(method_name, block) + end + + def receive_messages(message_return_value_hash) + matcher = Matchers::ReceiveMessages.new(message_return_value_hash) + matcher.warn_about_block if block_given? + matcher + end + + def receive_message_chain(*messages, &block) + Matchers::ReceiveMessageChain.new(messages, &block) + end + + def allow(target) + AllowanceTarget.new(target) + end + + def expect_any_instance_of(klass) + AnyInstanceExpectationTarget.new(klass) + end + + def allow_any_instance_of(klass) + AnyInstanceAllowanceTarget.new(klass) + end + end + + RSpec::Mocks::ExampleMethods::ExpectHost.class_exec do + def expect(target) + ExpectationTarget.new(target) + end + end + end + + # @api private + # Disables the expect syntax (`expect(dbl).to receive`, `allow(dbl).to receive`, etc). + def self.disable_expect(syntax_host=::RSpec::Mocks::ExampleMethods) + return unless expect_enabled?(syntax_host) + + syntax_host.class_exec do + undef receive + undef receive_messages + undef receive_message_chain + undef allow + undef expect_any_instance_of + undef allow_any_instance_of + end + + RSpec::Mocks::ExampleMethods::ExpectHost.class_exec do + undef expect + end + end + + # @api private + # Indicates whether or not the should syntax is enabled. + def self.should_enabled?(syntax_host=default_should_syntax_host) + syntax_host.method_defined?(:should_receive) + end + + # @api private + # Indicates whether or not the expect syntax is enabled. + def self.expect_enabled?(syntax_host=::RSpec::Mocks::ExampleMethods) + syntax_host.method_defined?(:allow) + end + + # @api private + # Determines where the methods like `should_receive`, and `stub` are added. + def self.default_should_syntax_host + # JRuby 1.7.4 introduces a regression whereby `defined?(::BasicObject) => nil` + # yet `BasicObject` still exists and patching onto ::Object breaks things + # e.g. SimpleDelegator expectations won't work + # + # See: https://github.com/jruby/jruby/issues/814 + if defined?(JRUBY_VERSION) && JRUBY_VERSION == '1.7.4' && RUBY_VERSION.to_f > 1.8 + return ::BasicObject + end + + # On 1.8.7, Object.ancestors.last == Kernel but + # things blow up if we include `RSpec::Mocks::Methods` + # into Kernel...not sure why. + return Object unless defined?(::BasicObject) + + # MacRuby has BasicObject but it's not the root class. + return Object unless Object.ancestors.last == ::BasicObject + + ::BasicObject + end + end + end +end + +if defined?(BasicObject) + # The legacy `:should` syntax adds the following methods directly to + # `BasicObject` so that they are available off of any object. Note, however, + # that this syntax does not always play nice with delegate/proxy objects. + # We recommend you use the non-monkeypatching `:expect` syntax instead. + # @see Class + class BasicObject + # @method should_receive + # Sets an expectation that this object should receive a message before + # the end of the example. + # + # @example + # logger = double('logger') + # thing_that_logs = ThingThatLogs.new(logger) + # logger.should_receive(:log) + # thing_that_logs.do_something_that_logs_a_message + # + # @note This is only available when you have enabled the `should` syntax. + # @see RSpec::Mocks::ExampleMethods#expect + + # @method should_not_receive + # Sets and expectation that this object should _not_ receive a message + # during this example. + # @see RSpec::Mocks::ExampleMethods#expect + + # @method stub + # Tells the object to respond to the message with the specified value. + # + # @example + # counter.stub(:count).and_return(37) + # counter.stub(:count => 37) + # counter.stub(:count) { 37 } + # + # @note This is only available when you have enabled the `should` syntax. + # @see RSpec::Mocks::ExampleMethods#allow + + # @method unstub + # Removes a stub. On a double, the object will no longer respond to + # `message`. On a real object, the original method (if it exists) is + # restored. + # + # This is rarely used, but can be useful when a stub is set up during a + # shared `before` hook for the common case, but you want to replace it + # for a special case. + # + # @note This is only available when you have enabled the `should` syntax. + + # @method stub_chain + # @overload stub_chain(method1, method2) + # @overload stub_chain("method1.method2") + # @overload stub_chain(method1, method_to_value_hash) + # + # Stubs a chain of methods. + # + # ## Warning: + # + # Chains can be arbitrarily long, which makes it quite painless to + # violate the Law of Demeter in violent ways, so you should consider any + # use of `stub_chain` a code smell. Even though not all code smells + # indicate real problems (think fluent interfaces), `stub_chain` still + # results in brittle examples. For example, if you write + # `foo.stub_chain(:bar, :baz => 37)` in a spec and then the + # implementation calls `foo.baz.bar`, the stub will not work. + # + # @example + # double.stub_chain("foo.bar") { :baz } + # double.stub_chain(:foo, :bar => :baz) + # double.stub_chain(:foo, :bar) { :baz } + # + # # Given any of ^^ these three forms ^^: + # double.foo.bar # => :baz + # + # # Common use in Rails/ActiveRecord: + # Article.stub_chain("recent.published") { [Article.new] } + # + # @note This is only available when you have enabled the `should` syntax. + # @see RSpec::Mocks::ExampleMethods#receive_message_chain + + # @method as_null_object + # Tells the object to respond to all messages. If specific stub values + # are declared, they'll work as expected. If not, the receiver is + # returned. + # + # @note This is only available when you have enabled the `should` syntax. + + # @method null_object? + # Returns true if this object has received `as_null_object` + # + # @note This is only available when you have enabled the `should` syntax. + end +end + +# The legacy `:should` syntax adds the `any_instance` to `Class`. +# We generally recommend you use the newer `:expect` syntax instead, +# which allows you to stub any instance of a class using +# `allow_any_instance_of(klass)` or mock any instance using +# `expect_any_instance_of(klass)`. +# @see BasicObject +class Class + # @method any_instance + # Used to set stubs and message expectations on any instance of a given + # class. Returns a [Recorder](Recorder), which records messages like + # `stub` and `should_receive` for later playback on instances of the + # class. + # + # @example + # Car.any_instance.should_receive(:go) + # race = Race.new + # race.cars << Car.new + # race.go # assuming this delegates to all of its cars + # # this example would pass + # + # Account.any_instance.stub(:balance) { Money.new(:USD, 25) } + # Account.new.balance # => Money.new(:USD, 25)) + # + # @return [Recorder] + # + # @note This is only available when you have enabled the `should` syntax. + # @see RSpec::Mocks::ExampleMethods#expect_any_instance_of + # @see RSpec::Mocks::ExampleMethods#allow_any_instance_of +end diff --git a/vendor/bundle/ruby/3.1.0/gems/rspec-mocks-3.11.1/lib/rspec/mocks/targets.rb b/vendor/bundle/ruby/3.1.0/gems/rspec-mocks-3.11.1/lib/rspec/mocks/targets.rb new file mode 100644 index 000000000..7130e895a --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/rspec-mocks-3.11.1/lib/rspec/mocks/targets.rb @@ -0,0 +1,124 @@ +module RSpec + module Mocks + # @private + module TargetDelegationClassMethods + def delegate_to(matcher_method) + define_method(:to) do |matcher, &block| + unless matcher_allowed?(matcher) + raise_unsupported_matcher(:to, matcher) + end + define_matcher(matcher, matcher_method, &block) + end + end + + def delegate_not_to(matcher_method, options={}) + method_name = options.fetch(:from) + define_method(method_name) do |matcher, &block| + case matcher + when Matchers::Receive, Matchers::HaveReceived + define_matcher(matcher, matcher_method, &block) + when Matchers::ReceiveMessages, Matchers::ReceiveMessageChain + raise_negation_unsupported(method_name, matcher) + else + raise_unsupported_matcher(method_name, matcher) + end + end + end + + def disallow_negation(method_name) + define_method(method_name) do |matcher, *_args| + raise_negation_unsupported(method_name, matcher) + end + end + end + + # @private + module TargetDelegationInstanceMethods + attr_reader :target + + private + + def matcher_allowed?(matcher) + Matchers::Matcher === matcher + end + + def define_matcher(matcher, name, &block) + matcher.__send__(name, target, &block) + end + + def raise_unsupported_matcher(method_name, matcher) + raise UnsupportedMatcherError, + "only the `receive`, `have_received` and `receive_messages` matchers are supported " \ + "with `#{expression}(...).#{method_name}`, but you have provided: #{matcher}" + end + + def raise_negation_unsupported(method_name, matcher) + raise NegationUnsupportedError, + "`#{expression}(...).#{method_name} #{matcher.name}` is not supported since it " \ + "doesn't really make sense. What would it even mean?" + end + end + + # @private + class TargetBase + def initialize(target) + @target = target + end + + extend TargetDelegationClassMethods + include TargetDelegationInstanceMethods + end + + # @private + module ExpectationTargetMethods + extend TargetDelegationClassMethods + include TargetDelegationInstanceMethods + + delegate_to :setup_expectation + delegate_not_to :setup_negative_expectation, :from => :not_to + delegate_not_to :setup_negative_expectation, :from => :to_not + + def expression + :expect + end + end + + # @private + class ExpectationTarget < TargetBase + include ExpectationTargetMethods + end + + # @private + class AllowanceTarget < TargetBase + def expression + :allow + end + + delegate_to :setup_allowance + disallow_negation :not_to + disallow_negation :to_not + end + + # @private + class AnyInstanceAllowanceTarget < TargetBase + def expression + :allow_any_instance_of + end + + delegate_to :setup_any_instance_allowance + disallow_negation :not_to + disallow_negation :to_not + end + + # @private + class AnyInstanceExpectationTarget < TargetBase + def expression + :expect_any_instance_of + end + + delegate_to :setup_any_instance_expectation + delegate_not_to :setup_any_instance_negative_expectation, :from => :not_to + delegate_not_to :setup_any_instance_negative_expectation, :from => :to_not + end + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/rspec-mocks-3.11.1/lib/rspec/mocks/test_double.rb b/vendor/bundle/ruby/3.1.0/gems/rspec-mocks-3.11.1/lib/rspec/mocks/test_double.rb new file mode 100644 index 000000000..e8bfbeb59 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/rspec-mocks-3.11.1/lib/rspec/mocks/test_double.rb @@ -0,0 +1,171 @@ +module RSpec + module Mocks + # Implements the methods needed for a pure test double. RSpec::Mocks::Double + # includes this module, and it is provided for cases where you want a + # pure test double without subclassing RSpec::Mocks::Double. + module TestDouble + # Creates a new test double with a `name` (that will be used in error + # messages only) + def initialize(name=nil, stubs={}) + @__expired = false + if Hash === name && stubs.empty? + stubs = name + @name = nil + else + @name = name + end + assign_stubs(stubs) + end + + # Tells the object to respond to all messages. If specific stub values + # are declared, they'll work as expected. If not, the receiver is + # returned. + def as_null_object + __mock_proxy.as_null_object + end + + # Returns true if this object has received `as_null_object` + def null_object? + __mock_proxy.null_object? + end + + # This allows for comparing the mock to other objects that proxy such as + # ActiveRecords belongs_to proxy objects. By making the other object run + # the comparison, we're sure the call gets delegated to the proxy + # target. + def ==(other) + other == __mock_proxy + end + + # @private + def inspect + TestDoubleFormatter.format(self) + end + + # @private + def to_s + inspect.tr('<', '[').tr('>', ']') + end + + # @private + def respond_to?(message, incl_private=false) + __mock_proxy.null_object? ? true : super + end + + # @private + def __build_mock_proxy_unless_expired(order_group) + __raise_expired_error || __build_mock_proxy(order_group) + end + + # @private + def __disallow_further_usage! + @__expired = true + end + + # Override for default freeze implementation to prevent freezing of test + # doubles. + def freeze + RSpec.warn_with("WARNING: you attempted to freeze a test double. This is explicitly a no-op as freezing doubles can lead to undesired behaviour when resetting tests.") + self + end + + private + + def method_missing(message, *args, &block) + proxy = __mock_proxy + proxy.record_message_received(message, *args, &block) + + if proxy.null_object? + case message + when :to_int then return 0 + when :to_a, :to_ary then return nil + when :to_str then return to_s + else return self + end + end + + # Defined private and protected methods will still trigger `method_missing` + # when called publicly. We want ruby's method visibility error to get raised, + # so we simply delegate to `super` in that case. + # ...well, we would delegate to `super`, but there's a JRuby + # bug, so we raise our own visibility error instead: + # https://github.com/jruby/jruby/issues/1398 + visibility = proxy.visibility_for(message) + if visibility == :private || visibility == :protected + ErrorGenerator.new(self).raise_non_public_error( + message, visibility + ) + end + + # Required wrapping doubles in an Array on Ruby 1.9.2 + raise NoMethodError if [:to_a, :to_ary].include? message + proxy.raise_unexpected_message_error(message, args) + end + + def assign_stubs(stubs) + stubs.each_pair do |message, response| + __mock_proxy.add_simple_stub(message, response) + end + end + + def __mock_proxy + ::RSpec::Mocks.space.proxy_for(self) + end + + def __build_mock_proxy(order_group) + TestDoubleProxy.new(self, order_group) + end + + def __raise_expired_error + return false unless @__expired + ErrorGenerator.new(self).raise_expired_test_double_error + end + + def initialize_copy(other) + as_null_object if other.null_object? + super + end + end + + # A generic test double object. `double`, `instance_double` and friends + # return an instance of this. + class Double + include TestDouble + end + + # @private + module TestDoubleFormatter + def self.format(dbl, unwrap=false) + format = "#{type_desc(dbl)}#{verified_module_desc(dbl)} #{name_desc(dbl)}" + return format if unwrap + "#<#{format}>" + end + + class << self + private + + def type_desc(dbl) + case dbl + when InstanceVerifyingDouble then "InstanceDouble" + when ClassVerifyingDouble then "ClassDouble" + when ObjectVerifyingDouble then "ObjectDouble" + else "Double" + end + end + + # @private + IVAR_GET = Object.instance_method(:instance_variable_get) + + def verified_module_desc(dbl) + return nil unless VerifyingDouble === dbl + "(#{IVAR_GET.bind(dbl).call(:@doubled_module).description})" + end + + def name_desc(dbl) + return "(anonymous)" unless (name = IVAR_GET.bind(dbl).call(:@name)) + name.inspect + end + end + end + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/rspec-mocks-3.11.1/lib/rspec/mocks/verifying_double.rb b/vendor/bundle/ruby/3.1.0/gems/rspec-mocks-3.11.1/lib/rspec/mocks/verifying_double.rb new file mode 100644 index 000000000..e75478f9f --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/rspec-mocks-3.11.1/lib/rspec/mocks/verifying_double.rb @@ -0,0 +1,121 @@ +RSpec::Support.require_rspec_mocks 'verifying_proxy' + +module RSpec + module Mocks + # @private + module VerifyingDouble + def respond_to?(message, include_private=false) + return super unless null_object? + + method_ref = __mock_proxy.method_reference[message] + + case method_ref.visibility + when :public then true + when :private then include_private + when :protected then include_private || RUBY_VERSION.to_f < 2.0 + else !method_ref.unimplemented? + end + end + + def method_missing(message, *args, &block) + # Null object conditional is an optimization. If not a null object, + # validity of method expectations will have been checked at definition + # time. + if null_object? + if @__sending_message == message + __mock_proxy.ensure_implemented(message) + else + __mock_proxy.ensure_publicly_implemented(message, self) + end + + __mock_proxy.validate_arguments!(message, args) + end + + super + end + + # Redefining `__send__` causes ruby to issue a warning. + old, $VERBOSE = $VERBOSE, nil + def __send__(name, *args, &block) + @__sending_message = name + super + ensure + @__sending_message = nil + end + $VERBOSE = old + + def send(name, *args, &block) + __send__(name, *args, &block) + end + + def initialize(doubled_module, *args) + @doubled_module = doubled_module + + possible_name = args.first + name = if String === possible_name || Symbol === possible_name + args.shift + end + + super(name, *args) + @__sending_message = nil + end + end + + # A mock providing a custom proxy that can verify the validity of any + # method stubs or expectations against the public instance methods of the + # given class. + # + # @private + class InstanceVerifyingDouble + include TestDouble + include VerifyingDouble + + def __build_mock_proxy(order_group) + VerifyingProxy.new(self, order_group, + @doubled_module, + InstanceMethodReference + ) + end + end + + # An awkward module necessary because we cannot otherwise have + # ClassVerifyingDouble inherit from Module and still share these methods. + # + # @private + module ObjectVerifyingDoubleMethods + include TestDouble + include VerifyingDouble + + def as_stubbed_const(options={}) + ConstantMutator.stub(@doubled_module.const_to_replace, self, options) + self + end + + private + + def __build_mock_proxy(order_group) + VerifyingProxy.new(self, order_group, + @doubled_module, + ObjectMethodReference + ) + end + end + + # Similar to an InstanceVerifyingDouble, except that it verifies against + # public methods of the given object. + # + # @private + class ObjectVerifyingDouble + include ObjectVerifyingDoubleMethods + end + + # Effectively the same as an ObjectVerifyingDouble (since a class is a type + # of object), except with Module in the inheritance chain so that + # transferring nested constants to work. + # + # @private + class ClassVerifyingDouble < Module + include ObjectVerifyingDoubleMethods + end + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/rspec-mocks-3.11.1/lib/rspec/mocks/verifying_message_expectation.rb b/vendor/bundle/ruby/3.1.0/gems/rspec-mocks-3.11.1/lib/rspec/mocks/verifying_message_expectation.rb new file mode 100644 index 000000000..c1faa5d3c --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/rspec-mocks-3.11.1/lib/rspec/mocks/verifying_message_expectation.rb @@ -0,0 +1,54 @@ +RSpec::Support.require_rspec_support 'method_signature_verifier' + +module RSpec + module Mocks + # A message expectation that knows about the real implementation of the + # message being expected, so that it can verify that any expectations + # have the valid arguments. + # @api private + class VerifyingMessageExpectation < MessageExpectation + # A level of indirection is used here rather than just passing in the + # method itself, since method look up is expensive and we only want to + # do it if actually needed. + # + # Conceptually the method reference makes more sense as a constructor + # argument since it should be immutable, but it is significantly more + # straight forward to build the object in pieces so for now it stays as + # an accessor. + attr_accessor :method_reference + + def initialize(*args) + super + end + + # @private + def with(*args, &block) + super(*args, &block).tap do + validate_expected_arguments! do |signature| + example_call_site_args = [:an_arg] * signature.min_non_kw_args + example_call_site_args << :kw_args_hash if signature.required_kw_args.any? + @argument_list_matcher.resolve_expected_args_based_on(example_call_site_args) + end + end + end + + private + + def validate_expected_arguments! + return if method_reference.nil? + + method_reference.with_signature do |signature| + args = yield signature + verifier = Support::LooseSignatureVerifier.new(signature, args) + + unless verifier.valid? + # Fail fast is required, otherwise the message expectation will fail + # as well ("expected method not called") and clobber this one. + @failed_fast = true + @error_generator.raise_invalid_arguments_error(verifier) + end + end + end + end + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/rspec-mocks-3.11.1/lib/rspec/mocks/verifying_proxy.rb b/vendor/bundle/ruby/3.1.0/gems/rspec-mocks-3.11.1/lib/rspec/mocks/verifying_proxy.rb new file mode 100644 index 000000000..b39871c87 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/rspec-mocks-3.11.1/lib/rspec/mocks/verifying_proxy.rb @@ -0,0 +1,220 @@ +RSpec::Support.require_rspec_mocks 'verifying_message_expectation' +RSpec::Support.require_rspec_mocks 'method_reference' + +module RSpec + module Mocks + # @private + class CallbackInvocationStrategy + def call(doubled_module) + RSpec::Mocks.configuration.verifying_double_callbacks.each do |block| + block.call doubled_module + end + end + end + + # @private + class NoCallbackInvocationStrategy + def call(_doubled_module) + end + end + + # @private + module VerifyingProxyMethods + def add_stub(method_name, opts={}, &implementation) + ensure_implemented(method_name) + super + end + + def add_simple_stub(method_name, *args) + ensure_implemented(method_name) + super + end + + def add_message_expectation(method_name, opts={}, &block) + ensure_implemented(method_name) + super + end + + def ensure_implemented(method_name) + return unless method_reference[method_name].unimplemented? + + @error_generator.raise_unimplemented_error( + @doubled_module, + method_name, + @object + ) + end + + def ensure_publicly_implemented(method_name, _object) + ensure_implemented(method_name) + visibility = method_reference[method_name].visibility + + return if visibility == :public + @error_generator.raise_non_public_error(method_name, visibility) + end + end + + # A verifying proxy mostly acts like a normal proxy, except that it + # contains extra logic to try and determine the validity of any expectation + # set on it. This includes whether or not methods have been defined and the + # validatiy of arguments on method calls. + # + # In all other ways this behaves like a normal proxy. It only adds the + # verification behaviour to specific methods then delegates to the parent + # implementation. + # + # These checks are only activated if the doubled class has already been + # loaded, otherwise they are disabled. This allows for testing in + # isolation. + # + # @private + class VerifyingProxy < TestDoubleProxy + include VerifyingProxyMethods + + def initialize(object, order_group, doubled_module, method_reference_class) + super(object, order_group) + @object = object + @doubled_module = doubled_module + @method_reference_class = method_reference_class + + # A custom method double is required to pass through a way to lookup + # methods to determine their parameters. This is only relevant if the doubled + # class is loaded. + @method_doubles = Hash.new do |h, k| + h[k] = VerifyingMethodDouble.new(@object, k, self, method_reference[k]) + end + end + + def method_reference + @method_reference ||= Hash.new do |h, k| + h[k] = @method_reference_class.for(@doubled_module, k) + end + end + + def visibility_for(method_name) + method_reference[method_name].visibility + end + + def validate_arguments!(method_name, args) + @method_doubles[method_name].validate_arguments!(args) + end + end + + # @private + DEFAULT_CALLBACK_INVOCATION_STRATEGY = CallbackInvocationStrategy.new + + # @private + class VerifyingPartialDoubleProxy < PartialDoubleProxy + include VerifyingProxyMethods + + def initialize(object, expectation_ordering, optional_callback_invocation_strategy=DEFAULT_CALLBACK_INVOCATION_STRATEGY) + super(object, expectation_ordering) + @doubled_module = DirectObjectReference.new(object) + + # A custom method double is required to pass through a way to lookup + # methods to determine their parameters. + @method_doubles = Hash.new do |h, k| + h[k] = VerifyingExistingMethodDouble.for(object, k, self) + end + + optional_callback_invocation_strategy.call(@doubled_module) + end + + def ensure_implemented(_method_name) + return if Mocks.configuration.temporarily_suppress_partial_double_verification + super + end + + def method_reference + @method_doubles + end + end + + # @private + class VerifyingPartialClassDoubleProxy < VerifyingPartialDoubleProxy + include PartialClassDoubleProxyMethods + end + + # @private + class VerifyingMethodDouble < MethodDouble + def initialize(object, method_name, proxy, method_reference) + super(object, method_name, proxy) + @method_reference = method_reference + end + + def message_expectation_class + VerifyingMessageExpectation + end + + def add_expectation(*args, &block) + # explict params necessary for 1.8.7 see #626 + super(*args, &block).tap { |x| x.method_reference = @method_reference } + end + + def add_stub(*args, &block) + # explict params necessary for 1.8.7 see #626 + super(*args, &block).tap { |x| x.method_reference = @method_reference } + end + + def proxy_method_invoked(obj, *args, &block) + validate_arguments!(args) + super + end + + def validate_arguments!(actual_args) + @method_reference.with_signature do |signature| + verifier = Support::StrictSignatureVerifier.new(signature, actual_args) + raise ArgumentError, verifier.error_message unless verifier.valid? + end + end + end + + # A VerifyingMethodDouble fetches the method to verify against from the + # original object, using a MethodReference. This works for pure doubles, + # but when the original object is itself the one being modified we need to + # collapse the reference and the method double into a single object so that + # we can access the original pristine method definition. + # + # @private + class VerifyingExistingMethodDouble < VerifyingMethodDouble + def initialize(object, method_name, proxy) + super(object, method_name, proxy, self) + + @valid_method = object.respond_to?(method_name, true) + + # Trigger an eager find of the original method since if we find it any + # later we end up getting a stubbed method with incorrect arity. + save_original_implementation_callable! + end + + def with_signature + yield Support::MethodSignature.new(original_implementation_callable) + end + + def unimplemented? + !@valid_method + end + + def self.for(object, method_name, proxy) + if ClassNewMethodReference.applies_to?(method_name) { object } + VerifyingExistingClassNewMethodDouble + elsif Mocks.configuration.temporarily_suppress_partial_double_verification + MethodDouble + else + self + end.new(object, method_name, proxy) + end + end + + # Used in place of a `VerifyingExistingMethodDouble` for the specific case + # of mocking or stubbing a `new` method on a class. In this case, we substitute + # the method signature from `#initialize` since new's signature is just `*args`. + # + # @private + class VerifyingExistingClassNewMethodDouble < VerifyingExistingMethodDouble + def with_signature + yield Support::MethodSignature.new(object.instance_method(:initialize)) + end + end + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/rspec-mocks-3.11.1/lib/rspec/mocks/version.rb b/vendor/bundle/ruby/3.1.0/gems/rspec-mocks-3.11.1/lib/rspec/mocks/version.rb new file mode 100644 index 000000000..524648120 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/rspec-mocks-3.11.1/lib/rspec/mocks/version.rb @@ -0,0 +1,9 @@ +module RSpec + module Mocks + # Version information for RSpec mocks. + module Version + # Version of RSpec mocks currently in use in SemVer format. + STRING = '3.11.1' + end + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/rspec-support-3.11.0/Changelog.md b/vendor/bundle/ruby/3.1.0/gems/rspec-support-3.11.0/Changelog.md new file mode 100644 index 000000000..fcc63afda --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/rspec-support-3.11.0/Changelog.md @@ -0,0 +1,350 @@ +### Development +[Full Changelog](http://github.com/rspec/rspec-support/compare/v3.11.0...3-11-maintenance) + +### 3.11.0 / 2022-02-09 +[Full Changelog](http://github.com/rspec/rspec-support/compare/v3.10.3...v3.11.0) + +No changes. Released to support other RSpec releases. + +### 3.10.3 / 2021-11-03 +[Full Changelog](http://github.com/rspec/rspec-support/compare/v3.10.2...v3.10.3) + +Bug Fixes: + +* Use `Mutex#owned?` to allow `RSpec::Support::ReentrantMutex` to work in + nested Fibers on Ruby 3.0 and later. (Benoit Daloze, #503, #504) +* Support `end`-less methods in `RSpec::Support::Source::Token` + so that RSpec won't hang when an `end`-less method raises an error. (Yuji Nakayama, #505) + +### 3.10.2 / 2021-01-28 +[Full Changelog](http://github.com/rspec/rspec-support/compare/v3.10.1...v3.10.2) + +Bug Fixes: + +* Fix issue with `RSpec::Support.define_optimized_require_for_rspec` on JRuby + 9.1.17.0 (Jon Rowe, #492) + +### 3.10.1 / 2020-12-27 +[Full Changelog](http://github.com/rspec/rspec-support/compare/v3.10.0...v3.10.1) + +Bug Fixes: + +* Fix deprecation expectations to fail correctly when + asserting on messages. (Phil Pirozhkov, #453) + +### 3.10.0 / 2020-10-30 +[Full Changelog](http://github.com/rspec/rspec-support/compare/v3.9.4...v3.10.0) + +No changes. Released to support other RSpec releases. + +### 3.9.4 / 2020-10-23 +[Full Changelog](http://github.com/rspec/rspec-support/compare/v3.9.3...v3.9.4) + +Bug Fixes: + +* Flag ripper as supported on Truffle Ruby. (Brandon Fish, #427) +* Prevent stubbing `File.read` from breaking source extraction. + (Jon Rowe, #431) + +### 3.9.3 / 2020-05-02 +[Full Changelog](http://github.com/rspec/rspec-support/compare/v3.9.2...v3.9.3) + +Bug Fixes: + +* Mark ripper as unsupported on Truffle Ruby. (Brandon Fish, #395) +* Mark ripper as unsupported on JRuby 9.2.0.0. (Brian Hawley, #400) +* Capture `Mutex.new` for our `RSpec::Support:Mutex` in order to + allow stubbing `Mutex.new`. (Jon Rowe, #411) + +### 3.9.2 / 2019-12-30 +[Full Changelog](http://github.com/rspec/rspec-support/compare/v3.9.1...v3.9.2) + +Bug Fixes: + +* Remove unneeded eval. (Matijs van Zuijlen, #394) + +### 3.9.1 / 2019-12-28 +[Full Changelog](http://github.com/rspec/rspec-support/compare/v3.9.0...v3.9.1) + +Bug Fixes: + +* Remove warning caused by keyword arguments on Ruby 2.7.0. + (Jon Rowe, #392) + +### 3.9.0 / 2019-10-07 +[Full Changelog](http://github.com/rspec/rspec-support/compare/v3.8.3...v3.9.0) + +*NO CHANGES* + +Version 3.9.0 was released to allow other RSpec gems to release 3.9.0. + +### 3.8.3 / 2019-10-02 +[Full Changelog](http://github.com/rspec/rspec-support/compare/v3.8.2...v3.8.3) + +Bug Fixes: + +* Escape \r when outputting strings inside arrays. + (Tomita Masahiro, Jon Rowe, #378) +* Ensure that optional hash arguments are recognised correctly vs keyword + arguments. (Evgeni Dzhelyov, #366) + +### 3.8.2 / 2019-06-10 +[Full Changelog](http://github.com/rspec/rspec-support/compare/v3.8.1...v3.8.2) + +Bug Fixes: + +* Ensure that an empty hash is recognised as empty keyword arguments when + applicable. (Thomas Walpole, #375) +* Ensure that diffing truthy values produce diffs consistently. + (Lucas Nestor, #377) + +### 3.8.1 / 2019-03-03 +[Full Changelog](http://github.com/rspec/rspec-support/compare/v3.8.0...v3.8.1) + +Bug Fixes: + +* Ensure that inspecting a `SimpleDelegator` based object works regardless of + visibilty of the `__getobj__` method. (Jon Rowe, #369) + +### 3.8.0 / 2018-08-04 +[Full Changelog](http://github.com/rspec/rspec-support/compare/v3.7.1...v3.8.0) + +Bug Fixes: + +* Order hash keys before diffing to improve diff accuracy when using mocked calls. + (James Crisp, #334) + +### 3.7.1 / 2018-01-29 +[Full Changelog](http://github.com/rspec/rspec-support/compare/v3.7.0...v3.7.1) + +Bug Fixes: + +* Fix source extraction logic so that it does not trigger a `SystemStackError` + when processing deeply nested example groups. (Craig Bass, #343) + +### 3.7.0 / 2017-10-17 +[Full Changelog](http://github.com/rspec/rspec-support/compare/v3.6.0...v3.7.0) + +Enhancements: + +* Improve compatibility with `--enable-frozen-string-literal` option + on Ruby 2.3+. (Pat Allan, #320) +* Add `Support.class_of` for extracting class of any object. + (Yuji Nakayama, #325) + +Bug Fixes: + +* Fix recursive const support to not blow up when given buggy classes + that raise odd errors from `#to_str`. (Myron Marston, #317) + +### 3.6.0 / 2017-05-04 +[Full Changelog](http://github.com/rspec/rspec-support/compare/v3.6.0.beta2...3.6.0) + +Enhancements: + +* Import `Source` classes from rspec-core. (Yuji Nakayama, #315) + +### 3.6.0.beta2 / 2016-12-12 +[Full Changelog](http://github.com/rspec/rspec-support/compare/v3.6.0.beta1...v3.6.0.beta2) + +No user-facing changes. + +### 3.6.0.beta1 / 2016-10-09 +[Full Changelog](http://github.com/rspec/rspec-support/compare/v3.5.0...v3.6.0.beta1) + +Bug Fixes: + +* Prevent truncated formatted object output from mangling console codes. (#294, Anson Kelly) + +### 3.5.0 / 2016-07-01 +[Full Changelog](http://github.com/rspec/rspec-support/compare/v3.5.0.beta4...v3.5.0) + +**No user facing changes since beta4** + +### 3.5.0.beta4 / 2016-06-05 +[Full Changelog](http://github.com/rspec/rspec-support/compare/v3.5.0.beta3...v3.5.0.beta4) + +Enhancements: +* Improve `MethodSignature` to better support keyword arguments. (#250, Rob Smith). + +### 3.5.0.beta3 / 2016-04-02 +[Full Changelog](http://github.com/rspec/rspec-support/compare/v3.5.0.beta2...v3.5.0.beta3) + +Bug Fixes: + +* Fix `EncodedString` to properly handle the behavior of `String#split` + on JRuby when the string contains invalid bytes. (Jon Rowe, #268) +* Fix `ObjectFormatter` so that formatting objects that don't respond to + `#inspect` (such as `BasicObject`) does not cause `NoMethodError`. + (Yuji Nakayama, #269) +* Fix `ObjectFormatter` so that formatting recursive array or hash does not + cause `SystemStackError`. (Yuji Nakayama, #270, #272) + +### 3.5.0.beta2 / 2016-03-10 +[Full Changelog](http://github.com/rspec/rspec-support/compare/v3.5.0.beta1...v3.5.0.beta2) + +No user-facing changes. + +### 3.5.0.beta1 / 2016-02-06 +[Full Changelog](http://github.com/rspec/rspec-support/compare/v3.4.1...v3.5.0.beta1) + +Enhancements: + +* Improve formatting of objects by allowing truncation to a pre-configured length. + (Liam M, #256) + +### 3.4.1 / 2015-11-20 +[Full Changelog](http://github.com/rspec/rspec-support/compare/v3.4.0...v3.4.1) + +Bug Fixes: + +* Fix `RSpec::Support::RubyFeature.ripper_supported?` so it returns + `false` on Rubinius since the Rubinius team has no plans to support + it. This prevents rspec-core from trying to load and use ripper to + extract failure snippets. (Aaron Stone, #251) + +Changes: + +* Remove `VersionChecker` in favor of `ComparableVersion`. (Yuji Nakayama, #266) + +### 3.4.0 / 2015-11-11 +[Full Changelog](http://github.com/rspec/rspec-support/compare/v3.3.0...v3.4.0) + +Enhancements: + +* Improve formatting of `Delegator` based objects (e.g. `SimpleDelgator`) in + failure messages and diffs. (Andrew Horner, #215) +* Add `ComparableVersion`. (Yuji Nakayama, #245) +* Add `Ripper` support detection. (Yuji Nakayama, #245) + +Bug Fixes: + +* Work around bug in JRuby that reports that `attr_writer` methods + have no parameters, causing RSpec's verifying doubles to wrongly + fail when mocking or stubbing a writer method on JRuby. (Myron Marston, #225) + +### 3.3.0 / 2015-06-12 +[Full Changelog](http://github.com/rspec/rspec-support/compare/v3.2.2...v3.3.0) + +Enhancements: + +* Improve formatting of arrays and hashes in failure messages so they + use our custom formatting of matchers, time objects, etc. + (Myron Marston, Nicholas Chmielewski, #205) +* Use improved formatting for diffs as well. (Nicholas Chmielewski, #205) + +Bug Fixes: + +* Fix `FuzzyMatcher` so that it checks `expected == actual` rather than + `actual == expected`, which avoids errors in situations where the + `actual` object's `==` is improperly implemented to assume that only + objects of the same type will be given. This allows rspec-mocks' + `anything` to match against objects with buggy `==` definitions. + (Myron Marston, #193) + +### 3.2.2 / 2015-02-23 +[Full Changelog](http://github.com/rspec/rspec-support/compare/v3.2.1...v3.2.2) + +Bug Fixes: + +* Fix an encoding issue with `EncodedString#split` when encountering an + invalid byte string. (Benjamin Fleischer, #1760) + +### 3.2.1 / 2015-02-04 +[Full Changelog](http://github.com/rspec/rspec-support/compare/v3.2.0...v3.2.1) + +Bug Fixes: + +* Fix `RSpec::CallerFilter` to work on Rubinius 2.2. + (Myron Marston, #169) + +### 3.2.0 / 2015-02-03 +[Full Changelog](http://github.com/rspec/rspec-support/compare/v3.1.2...v3.2.0) + +Enhancements: + +* Add extra Ruby type detection. (Jon Rowe, #133) +* Make differ instance re-usable. (Alexey Fedorov, #160) + +Bug Fixes: + +* Do not consider `[]` and `{}` to match when performing fuzzy matching. + (Myron Marston, #157) + +### 3.1.2 / 2014-10-08 +[Full Changelog](http://github.com/rspec/rspec-support/compare/v3.1.1...v3.1.2) + +Bug Fixes: + +* Fix method signature to not blow up with a `NoMethodError` on 1.8.7 when + verifying against an RSpec matcher. (Myron Marston, #116) + +### 3.1.1 / 2014-09-26 +[Full Changelog](http://github.com/rspec/rspec-support/compare/v3.1.0...v3.1.1) + +Bug Fixes: + +* Fix `RSpec::Support::DirectoryMaker` (used by `rspec --init` and + `rails generate rspec:install`) so that it detects absolute paths + on Windows properly. (Scott Archer, #107, #108, #109) (Jon Rowe, #110) + +### 3.1.0 / 2014-09-04 +[Full Changelog](http://github.com/rspec/rspec-support/compare/v3.0.4...v3.1.0) + +Bug Fixes: + +* Fix `FuzzyMatcher` so that it does not wrongly match a struct against + an array. (Myron Marston, #97) +* Prevent infinitely recursing `#flatten` methods from causing the differ + to hang. (Jon Rowe, #101) + +### 3.0.4 / 2014-08-14 +[Full Changelog](http://github.com/rspec/rspec-support/compare/v3.0.3...v3.0.4) + +Bug Fixes: + +* Fix `FuzzyMatcher` so that it does not silence `ArgumentError` raised + from broken implementations of `==`. (Myron Marston, #94) + +### 3.0.3 / 2014-07-21 +[Full Changelog](http://github.com/rspec/rspec-support/compare/v3.0.2...v3.0.3) + +Bug Fixes: + +* Fix regression in `Support#method_handle_for` where proxy objects + with method delegated would wrongly not return a method handle. + (Jon Rowe, #90) +* Properly detect Module#prepend support in Ruby 2.1+ (Ben Langfeld, #91) +* Fix `rspec/support/warnings.rb` so it can be loaded and used in + isolation. (Myron Marston, #93) + +### 3.0.2 / 2014-06-20 +[Full Changelog](http://github.com/rspec/rspec-support/compare/v3.0.1...v3.0.2) + +* Revert `BlockSignature` change from 3.0.1 because of a ruby bug that + caused it to change the block's behavior (https://bugs.ruby-lang.org/issues/9967). + (Myron Marston, rspec-mocks#721) + +### 3.0.1 / 2014-06-19 +[Full Changelog](http://github.com/rspec/rspec-support/compare/v3.0.0...v3.0.1) + +* Fix `BlockSignature` so that it correctly differentiates between + required and optional block args. (Myron Marston, rspec-mocks#714) + +### 3.0.0 / 2014-06-01 +[Full Changelog](http://github.com/rspec/rspec-support/compare/v3.0.0.rc1...v3.0.0) + +### 3.0.0.rc1 / 2014-05-18 +[Full Changelog](http://github.com/rspec/rspec-support/compare/v3.0.0.beta2...v3.0.0.rc1) + +### 3.0.0.beta2 / 2014-02-17 +[Full Changelog](http://github.com/rspec/rspec-support/compare/v3.0.0.beta1...v3.0.0.beta2) + +Bug Fixes: + +* Issue message when :replacement is passed to `RSpec.warn_with`. (Jon Rowe) + +### 3.0.0.beta1 / 2013-11-07 +[Full Changelog](https://github.com/rspec/rspec-support/compare/0dc12d1bdbbacc757a9989f8c09cd08ef3a4837e...v3.0.0.beta1) + +Initial release. diff --git a/vendor/bundle/ruby/3.1.0/gems/rspec-support-3.11.0/LICENSE.md b/vendor/bundle/ruby/3.1.0/gems/rspec-support-3.11.0/LICENSE.md new file mode 100644 index 000000000..08aa3abbb --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/rspec-support-3.11.0/LICENSE.md @@ -0,0 +1,23 @@ +The MIT License (MIT) +==================== + +* Copyright © 2013 David Chelimsky, Myron Marston, Jon Rowe, Sam Phippen, Xavier Shay, Bradley Schaefer + +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/vendor/bundle/ruby/3.1.0/gems/rspec-support-3.11.0/README.md b/vendor/bundle/ruby/3.1.0/gems/rspec-support-3.11.0/README.md new file mode 100644 index 000000000..bb88209df --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/rspec-support-3.11.0/README.md @@ -0,0 +1,40 @@ +# RSpec::Support [![Build Status](https://github.com/rspec/rspec-support/workflows/RSpec%20CI/badge.svg)](https://github.com/rspec/rspec-support/actions) + +`RSpec::Support` provides common functionality to `RSpec::Core`, +`RSpec::Expectations` and `RSpec::Mocks`. It is considered +suitable for internal use only at this time. + +## Installation / Usage + +Install one or more of the `RSpec` gems. + +Want to run against the `main` branch? You'll need to include the dependent +RSpec repos as well. Add the following to your `Gemfile`: + +```ruby +%w[rspec-core rspec-expectations rspec-mocks rspec-support].each do |lib| + gem lib, :git => "https://github.com/rspec/#{lib}.git", :branch => 'main' +end +``` + +## Contributing + +Once you've set up the environment, you'll need to cd into the working +directory of whichever repo you want to work in. From there you can run the +specs and cucumber features, and make patches. + +NOTE: You do not need to use rspec-dev to work on a specific RSpec repo. You +can treat each RSpec repo as an independent project. + +- [Build details](BUILD_DETAIL.md) +- [Code of Conduct](CODE_OF_CONDUCT.md) +- [Detailed contributing guide](CONTRIBUTING.md) +- [Development setup guide](DEVELOPMENT.md) + +## Patches + +Please submit a pull request or a github issue. If you submit an issue, please +include a link to either of: + +* a gist (or equivalent) of the patch +* a branch or commit in your github fork of the repo diff --git a/vendor/bundle/ruby/3.1.0/gems/rspec-support-3.11.0/lib/rspec/support.rb b/vendor/bundle/ruby/3.1.0/gems/rspec-support-3.11.0/lib/rspec/support.rb new file mode 100644 index 000000000..b85eae3c2 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/rspec-support-3.11.0/lib/rspec/support.rb @@ -0,0 +1,154 @@ +module RSpec + module Support + # @api private + # + # Defines a helper method that is optimized to require files from the + # named lib. The passed block MUST be `{ |f| require_relative f }` + # because for `require_relative` to work properly from within the named + # lib the line of code must be IN that lib. + # + # `require_relative` is preferred when available because it is always O(1), + # regardless of the number of dirs in $LOAD_PATH. `require`, on the other + # hand, does a linear O(N) search over the dirs in the $LOAD_PATH until + # it can resolve the file relative to one of the dirs. + def self.define_optimized_require_for_rspec(lib, &require_relative) + name = "require_rspec_#{lib}" + + if RUBY_PLATFORM == 'java' && !Kernel.respond_to?(:require) + # JRuby 9.1.17.0 has developed a regression for require + (class << self; self; end).__send__(:define_method, name) do |f| + Kernel.send(:require, "rspec/#{lib}/#{f}") + end + elsif Kernel.respond_to?(:require_relative) + (class << self; self; end).__send__(:define_method, name) do |f| + require_relative.call("#{lib}/#{f}") + end + else + (class << self; self; end).__send__(:define_method, name) do |f| + require "rspec/#{lib}/#{f}" + end + end + end + + define_optimized_require_for_rspec(:support) { |f| require_relative(f) } + require_rspec_support "version" + require_rspec_support "ruby_features" + + # @api private + KERNEL_METHOD_METHOD = ::Kernel.instance_method(:method) + + # @api private + # + # Used internally to get a method handle for a particular object + # and method name. + # + # Includes handling for a few special cases: + # + # - Objects that redefine #method (e.g. an HTTPRequest struct) + # - BasicObject subclasses that mixin a Kernel dup (e.g. SimpleDelegator) + # - Objects that undefine method and delegate everything to another + # object (e.g. Mongoid association objects) + if RubyFeatures.supports_rebinding_module_methods? + def self.method_handle_for(object, method_name) + KERNEL_METHOD_METHOD.bind(object).call(method_name) + rescue NameError => original + begin + handle = object.method(method_name) + raise original unless handle.is_a? Method + handle + rescue Support::AllExceptionsExceptOnesWeMustNotRescue + raise original + end + end + else + def self.method_handle_for(object, method_name) + if ::Kernel === object + KERNEL_METHOD_METHOD.bind(object).call(method_name) + else + object.method(method_name) + end + rescue NameError => original + begin + handle = object.method(method_name) + raise original unless handle.is_a? Method + handle + rescue Support::AllExceptionsExceptOnesWeMustNotRescue + raise original + end + end + end + + # @api private + # + # Used internally to get a class of a given object, even if it does not respond to #class. + def self.class_of(object) + object.class + rescue NoMethodError + singleton_class = class << object; self; end + singleton_class.ancestors.find { |ancestor| !ancestor.equal?(singleton_class) } + end + + # A single thread local variable so we don't excessively pollute that namespace. + def self.thread_local_data + Thread.current[:__rspec] ||= {} + end + + # @api private + def self.failure_notifier=(callable) + thread_local_data[:failure_notifier] = callable + end + + # @private + DEFAULT_FAILURE_NOTIFIER = lambda { |failure, _opts| raise failure } + + # @api private + def self.failure_notifier + thread_local_data[:failure_notifier] || DEFAULT_FAILURE_NOTIFIER + end + + # @api private + def self.notify_failure(failure, options={}) + failure_notifier.call(failure, options) + end + + # @api private + def self.with_failure_notifier(callable) + orig_notifier = failure_notifier + self.failure_notifier = callable + yield + ensure + self.failure_notifier = orig_notifier + end + + class << self + # @api private + attr_writer :warning_notifier + end + + # @private + DEFAULT_WARNING_NOTIFIER = lambda { |warning| ::Kernel.warn warning } + + # @api private + def self.warning_notifier + @warning_notifier ||= DEFAULT_WARNING_NOTIFIER + end + + # @private + module AllExceptionsExceptOnesWeMustNotRescue + # These exceptions are dangerous to rescue as rescuing them + # would interfere with things we should not interfere with. + AVOID_RESCUING = [NoMemoryError, SignalException, Interrupt, SystemExit] + + def self.===(exception) + AVOID_RESCUING.none? { |ar| ar === exception } + end + end + + # The Differ is only needed when a spec fails with a diffable failure. + # In the more common case of all specs passing or the only failures being + # non-diffable, we can avoid the extra cost of loading the differ, diff-lcs, + # pp, etc by avoiding an unnecessary require. Instead, autoload will take + # care of loading the differ on first use. + autoload :Differ, "rspec/support/differ" + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/rspec-support-3.11.0/lib/rspec/support/caller_filter.rb b/vendor/bundle/ruby/3.1.0/gems/rspec-support-3.11.0/lib/rspec/support/caller_filter.rb new file mode 100644 index 000000000..cd59a30f8 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/rspec-support-3.11.0/lib/rspec/support/caller_filter.rb @@ -0,0 +1,83 @@ +RSpec::Support.require_rspec_support "ruby_features" + +module RSpec + # Consistent implementation for "cleaning" the caller method to strip out + # non-rspec lines. This enables errors to be reported at the call site in + # the code using the library, which is far more useful than the particular + # internal method that raised an error. + class CallerFilter + RSPEC_LIBS = %w[ + core + mocks + expectations + support + matchers + rails + ] + + ADDITIONAL_TOP_LEVEL_FILES = %w[ autorun ] + + LIB_REGEX = %r{/lib/rspec/(#{(RSPEC_LIBS + ADDITIONAL_TOP_LEVEL_FILES).join('|')})(\.rb|/)} + + # rubygems/core_ext/kernel_require.rb isn't actually part of rspec (obviously) but we want + # it ignored when we are looking for the first meaningful line of the backtrace outside + # of RSpec. It can show up in the backtrace as the immediate first caller + # when `CallerFilter.first_non_rspec_line` is called from the top level of a required + # file, but it depends on if rubygems is loaded or not. We don't want to have to deal + # with this complexity in our `RSpec.deprecate` calls, so we ignore it here. + IGNORE_REGEX = Regexp.union(LIB_REGEX, "rubygems/core_ext/kernel_require.rb") + + if RSpec::Support::RubyFeatures.caller_locations_supported? + # This supports args because it's more efficient when the caller specifies + # these. It allows us to skip frames the caller knows are part of RSpec, + # and to decrease the increment size if the caller is confident the line will + # be found in a small number of stack frames from `skip_frames`. + # + # Note that there is a risk to passing a `skip_frames` value that is too high: + # If it skippped the first non-rspec line, then this method would return the + # 2nd or 3rd (or whatever) non-rspec line. Thus, you generally shouldn't pass + # values for these parameters, particularly since most places that use this are + # not hot spots (generally it gets used for deprecation warnings). However, + # if you do have a hot spot that calls this, passing `skip_frames` can make + # a significant difference. Just make sure that that particular use is tested + # so that if the provided `skip_frames` changes to no longer be accurate in + # such a way that would return the wrong stack frame, a test will fail to tell you. + # + # See benchmarks/skip_frames_for_caller_filter.rb for measurements. + def self.first_non_rspec_line(skip_frames=3, increment=5) + # Why a default `skip_frames` of 3? + # By the time `caller_locations` is called below, the first 3 frames are: + # lib/rspec/support/caller_filter.rb:63:in `block in first_non_rspec_line' + # lib/rspec/support/caller_filter.rb:62:in `loop' + # lib/rspec/support/caller_filter.rb:62:in `first_non_rspec_line' + + # `caller` is an expensive method that scales linearly with the size of + # the stack. The performance hit for fetching it in chunks is small, + # and since the target line is probably near the top of the stack, the + # overall improvement of a chunked search like this is significant. + # + # See benchmarks/caller.rb for measurements. + + # The default increment of 5 for this method are mostly arbitrary, but + # is chosen to give good performance on the common case of creating a double. + + loop do + stack = caller_locations(skip_frames, increment) + raise "No non-lib lines in stack" unless stack + + line = stack.find { |l| l.path !~ IGNORE_REGEX } + return line.to_s if line + + skip_frames += increment + increment *= 2 # The choice of two here is arbitrary. + end + end + else + # Earlier rubies do not support the two argument form of `caller`. This + # fallback is logically the same, but slower. + def self.first_non_rspec_line(*) + caller.find { |line| line !~ IGNORE_REGEX } + end + end + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/rspec-support-3.11.0/lib/rspec/support/comparable_version.rb b/vendor/bundle/ruby/3.1.0/gems/rspec-support-3.11.0/lib/rspec/support/comparable_version.rb new file mode 100644 index 000000000..2afa0a4f2 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/rspec-support-3.11.0/lib/rspec/support/comparable_version.rb @@ -0,0 +1,46 @@ +module RSpec + module Support + # @private + class ComparableVersion + include Comparable + + attr_reader :string + + def initialize(string) + @string = string + end + + def <=>(other) # rubocop:disable Metrics/AbcSize + other = self.class.new(other) unless other.is_a?(self.class) + + return 0 if string == other.string + + longer_segment_count = [self, other].map { |version| version.segments.count }.max + + longer_segment_count.times do |index| + self_segment = segments[index] || 0 + other_segment = other.segments[index] || 0 + + if self_segment.class == other_segment.class + result = self_segment <=> other_segment + return result unless result == 0 + else + return self_segment.is_a?(String) ? -1 : 1 + end + end + + 0 + end + + def segments + @segments ||= string.scan(/[a-z]+|\d+/i).map do |segment| + if segment =~ /\A\d+\z/ + segment.to_i + else + segment + end + end + end + end + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/rspec-support-3.11.0/lib/rspec/support/differ.rb b/vendor/bundle/ruby/3.1.0/gems/rspec-support-3.11.0/lib/rspec/support/differ.rb new file mode 100644 index 000000000..b81184239 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/rspec-support-3.11.0/lib/rspec/support/differ.rb @@ -0,0 +1,215 @@ +RSpec::Support.require_rspec_support 'encoded_string' +RSpec::Support.require_rspec_support 'hunk_generator' +RSpec::Support.require_rspec_support "object_formatter" + +require 'pp' + +module RSpec + module Support + # rubocop:disable ClassLength + class Differ + def diff(actual, expected) + diff = "" + + unless actual.nil? || expected.nil? + if all_strings?(actual, expected) + if any_multiline_strings?(actual, expected) + diff = diff_as_string(coerce_to_string(actual), coerce_to_string(expected)) + end + elsif no_procs?(actual, expected) && no_numbers?(actual, expected) + diff = diff_as_object(actual, expected) + end + end + + diff.to_s + end + + # rubocop:disable MethodLength + def diff_as_string(actual, expected) + encoding = EncodedString.pick_encoding(actual, expected) + + actual = EncodedString.new(actual, encoding) + expected = EncodedString.new(expected, encoding) + + output = EncodedString.new("\n", encoding) + hunks = build_hunks(actual, expected) + + hunks.each_cons(2) do |prev_hunk, current_hunk| + begin + if current_hunk.overlaps?(prev_hunk) + add_old_hunk_to_hunk(current_hunk, prev_hunk) + else + add_to_output(output, prev_hunk.diff(format_type).to_s) + end + ensure + add_to_output(output, "\n") + end + end + + finalize_output(output, hunks.last.diff(format_type).to_s) if hunks.last + + color_diff output + rescue Encoding::CompatibilityError + handle_encoding_errors(actual, expected) + end + # rubocop:enable MethodLength + + def diff_as_object(actual, expected) + actual_as_string = object_to_string(actual) + expected_as_string = object_to_string(expected) + diff_as_string(actual_as_string, expected_as_string) + end + + def color? + @color + end + + def initialize(opts={}) + @color = opts.fetch(:color, false) + @object_preparer = opts.fetch(:object_preparer, lambda { |string| string }) + end + + private + + def no_procs?(*args) + safely_flatten(args).none? { |a| Proc === a } + end + + def all_strings?(*args) + safely_flatten(args).all? { |a| String === a } + end + + def any_multiline_strings?(*args) + all_strings?(*args) && safely_flatten(args).any? { |a| multiline?(a) } + end + + def no_numbers?(*args) + safely_flatten(args).none? { |a| Numeric === a } + end + + def coerce_to_string(string_or_array) + return string_or_array unless Array === string_or_array + diffably_stringify(string_or_array).join("\n") + end + + def diffably_stringify(array) + array.map do |entry| + if Array === entry + entry.inspect + else + entry.to_s.gsub("\n", "\\n").gsub("\r", "\\r") + end + end + end + + if String.method_defined?(:encoding) + def multiline?(string) + string.include?("\n".encode(string.encoding)) + end + else + def multiline?(string) + string.include?("\n") + end + end + + def build_hunks(actual, expected) + HunkGenerator.new(actual, expected).hunks + end + + def finalize_output(output, final_line) + add_to_output(output, final_line) + add_to_output(output, "\n") + end + + def add_to_output(output, string) + output << string + end + + def add_old_hunk_to_hunk(hunk, oldhunk) + hunk.merge(oldhunk) + end + + def safely_flatten(array) + array = array.flatten(1) until (array == array.flatten(1)) + array + end + + def format_type + :unified + end + + def color(text, color_code) + "\e[#{color_code}m#{text}\e[0m" + end + + def red(text) + color(text, 31) + end + + def green(text) + color(text, 32) + end + + def blue(text) + color(text, 34) + end + + def normal(text) + color(text, 0) + end + + def color_diff(diff) + return diff unless color? + + diff.lines.map do |line| + case line[0].chr + when "+" + green line + when "-" + red line + when "@" + line[1].chr == "@" ? blue(line) : normal(line) + else + normal(line) + end + end.join + end + + def object_to_string(object) + object = @object_preparer.call(object) + case object + when Hash + hash_to_string(object) + when Array + PP.pp(ObjectFormatter.prepare_for_inspection(object), "".dup) + when String + object =~ /\n/ ? object : object.inspect + else + PP.pp(object, "".dup) + end + end + + def hash_to_string(hash) + formatted_hash = ObjectFormatter.prepare_for_inspection(hash) + formatted_hash.keys.sort_by { |k| k.to_s }.map do |key| + pp_key = PP.singleline_pp(key, "".dup) + pp_value = PP.singleline_pp(formatted_hash[key], "".dup) + + "#{pp_key} => #{pp_value}," + end.join("\n") + end + + def handle_encoding_errors(actual, expected) + if actual.source_encoding != expected.source_encoding + "Could not produce a diff because the encoding of the actual string " \ + "(#{actual.source_encoding}) differs from the encoding of the expected " \ + "string (#{expected.source_encoding})" + else + "Could not produce a diff because of the encoding of the string " \ + "(#{expected.source_encoding})" + end + end + end + # rubocop:enable ClassLength + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/rspec-support-3.11.0/lib/rspec/support/directory_maker.rb b/vendor/bundle/ruby/3.1.0/gems/rspec-support-3.11.0/lib/rspec/support/directory_maker.rb new file mode 100644 index 000000000..39a280e3a --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/rspec-support-3.11.0/lib/rspec/support/directory_maker.rb @@ -0,0 +1,63 @@ +RSpec::Support.require_rspec_support 'ruby_features' + +module RSpec + module Support + # @api private + # + # Replacement for fileutils#mkdir_p because we don't want to require parts + # of stdlib in RSpec. + class DirectoryMaker + # @api private + # + # Implements nested directory construction + def self.mkdir_p(path) + stack = generate_stack(path) + path.split(File::SEPARATOR).each do |part| + stack = generate_path(stack, part) + begin + Dir.mkdir(stack) unless directory_exists?(stack) + rescue Errno::EEXIST => e + raise e unless directory_exists?(stack) + rescue Errno::ENOTDIR => e + raise Errno::EEXIST, e.message + end + end + end + + if OS.windows_file_path? + def self.generate_stack(path) + if path.start_with?(File::SEPARATOR) + File::SEPARATOR + elsif path[1] == ':' + '' + else + '.' + end + end + def self.generate_path(stack, part) + if stack == '' + part + elsif stack == File::SEPARATOR + File.join('', part) + else + File.join(stack, part) + end + end + else + def self.generate_stack(path) + path.start_with?(File::SEPARATOR) ? File::SEPARATOR : "." + end + def self.generate_path(stack, part) + File.join(stack, part) + end + end + + def self.directory_exists?(dirname) + File.exist?(dirname) && File.directory?(dirname) + end + private_class_method :directory_exists? + private_class_method :generate_stack + private_class_method :generate_path + end + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/rspec-support-3.11.0/lib/rspec/support/encoded_string.rb b/vendor/bundle/ruby/3.1.0/gems/rspec-support-3.11.0/lib/rspec/support/encoded_string.rb new file mode 100644 index 000000000..13c323503 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/rspec-support-3.11.0/lib/rspec/support/encoded_string.rb @@ -0,0 +1,161 @@ +module RSpec + module Support + # @private + class EncodedString + # Reduce allocations by storing constants. + UTF_8 = "UTF-8" + US_ASCII = "US-ASCII" + + # Ruby's default replacement string is: + # U+FFFD ("\xEF\xBF\xBD"), for Unicode encoding forms, else + # ? ("\x3F") + REPLACE = "?" + + def initialize(string, encoding=nil) + @encoding = encoding + @source_encoding = detect_source_encoding(string) + @string = matching_encoding(string) + end + attr_reader :source_encoding + + delegated_methods = String.instance_methods.map(&:to_s) & %w[eql? lines == encoding empty?] + delegated_methods.each do |name| + define_method(name) { |*args, &block| @string.__send__(name, *args, &block) } + end + + def <<(string) + @string << matching_encoding(string) + end + + if Ruby.jruby? + def split(regex_or_string) + @string.split(matching_encoding(regex_or_string)) + rescue ArgumentError + # JRuby raises an ArgumentError when splitting a source string that + # contains invalid bytes. + remove_invalid_bytes(@string).split regex_or_string + end + else + def split(regex_or_string) + @string.split(matching_encoding(regex_or_string)) + end + end + + def to_s + @string + end + alias :to_str :to_s + + if String.method_defined?(:encoding) + + private + + # Encoding Exceptions: + # + # Raised by Encoding and String methods: + # Encoding::UndefinedConversionError: + # when a transcoding operation fails + # if the String contains characters invalid for the target encoding + # e.g. "\x80".encode('UTF-8','ASCII-8BIT') + # vs "\x80".encode('UTF-8','ASCII-8BIT', undef: :replace, replace: '') + # # => '' + # Encoding::CompatibilityError + # when Encoding.compatibile?(str1, str2) is nil + # e.g. utf_16le_emoji_string.split("\n") + # e.g. valid_unicode_string.encode(utf8_encoding) << ascii_string + # Encoding::InvalidByteSequenceError: + # when the string being transcoded contains a byte invalid for + # either the source or target encoding + # e.g. "\x80".encode('UTF-8','US-ASCII') + # vs "\x80".encode('UTF-8','US-ASCII', invalid: :replace, replace: '') + # # => '' + # ArgumentError + # when operating on a string with invalid bytes + # e.g."\x80".split("\n") + # TypeError + # when a symbol is passed as an encoding + # Encoding.find(:"UTF-8") + # when calling force_encoding on an object + # that doesn't respond to #to_str + # + # Raised by transcoding methods: + # Encoding::ConverterNotFoundError: + # when a named encoding does not correspond with a known converter + # e.g. 'abc'.force_encoding('UTF-8').encode('foo') + # or a converter path cannot be found + # e.g. "\x80".force_encoding('ASCII-8BIT').encode('Emacs-Mule') + # + # Raised by byte <-> char conversions + # RangeError: out of char range + # e.g. the UTF-16LE emoji: 128169.chr + def matching_encoding(string) + string = remove_invalid_bytes(string) + string.encode(@encoding) + rescue Encoding::UndefinedConversionError, Encoding::InvalidByteSequenceError + # Originally defined as a constant to avoid uneeded allocations, this hash must + # be defined inline (without {}) to avoid warnings on Ruby 2.7 + # + # In MRI 2.1 'invalid: :replace' changed to also replace an invalid byte sequence + # see https://github.com/ruby/ruby/blob/v2_1_0/NEWS#L176 + # https://www.ruby-forum.com/topic/6861247 + # https://twitter.com/nalsh/status/553413844685438976 + # + # For example, given: + # "\x80".force_encoding("Emacs-Mule").encode(:invalid => :replace).bytes.to_a + # + # On MRI 2.1 or above: 63 # '?' + # else : 128 # "\x80" + # + string.encode(@encoding, :invalid => :replace, :undef => :replace, :replace => REPLACE) + rescue Encoding::ConverterNotFoundError + # Originally defined as a constant to avoid uneeded allocations, this hash must + # be defined inline (without {}) to avoid warnings on Ruby 2.7 + string.dup.force_encoding(@encoding).encode(:invalid => :replace, :replace => REPLACE) + end + + # Prevents raising ArgumentError + if String.method_defined?(:scrub) + # https://github.com/ruby/ruby/blob/eeb05e8c11/doc/NEWS-2.1.0#L120-L123 + # https://github.com/ruby/ruby/blob/v2_1_0/string.c#L8242 + # https://github.com/hsbt/string-scrub + # https://github.com/rubinius/rubinius/blob/v2.5.2/kernel/common/string.rb#L1913-L1972 + def remove_invalid_bytes(string) + string.scrub(REPLACE) + end + else + # http://stackoverflow.com/a/8711118/879854 + # Loop over chars in a string replacing chars + # with invalid encoding, which is a pretty good proxy + # for the invalid byte sequence that causes an ArgumentError + def remove_invalid_bytes(string) + string.chars.map do |char| + char.valid_encoding? ? char : REPLACE + end.join + end + end + + def detect_source_encoding(string) + string.encoding + end + + def self.pick_encoding(source_a, source_b) + Encoding.compatible?(source_a, source_b) || Encoding.default_external + end + else + + def self.pick_encoding(_source_a, _source_b) + end + + private + + def matching_encoding(string) + string + end + + def detect_source_encoding(_string) + US_ASCII + end + end + end + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/rspec-support-3.11.0/lib/rspec/support/fuzzy_matcher.rb b/vendor/bundle/ruby/3.1.0/gems/rspec-support-3.11.0/lib/rspec/support/fuzzy_matcher.rb new file mode 100644 index 000000000..415194954 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/rspec-support-3.11.0/lib/rspec/support/fuzzy_matcher.rb @@ -0,0 +1,48 @@ +module RSpec + module Support + # Provides a means to fuzzy-match between two arbitrary objects. + # Understands array/hash nesting. Uses `===` or `==` to + # perform the matching. + module FuzzyMatcher + # @api private + def self.values_match?(expected, actual) + if Hash === actual + return hashes_match?(expected, actual) if Hash === expected + elsif Array === expected && Enumerable === actual && !(Struct === actual) + return arrays_match?(expected, actual.to_a) + end + + return true if expected == actual + + begin + expected === actual + rescue ArgumentError + # Some objects, like 0-arg lambdas on 1.9+, raise + # ArgumentError for `expected === actual`. + false + end + end + + # @private + def self.arrays_match?(expected_list, actual_list) + return false if expected_list.size != actual_list.size + + expected_list.zip(actual_list).all? do |expected, actual| + values_match?(expected, actual) + end + end + + # @private + def self.hashes_match?(expected_hash, actual_hash) + return false if expected_hash.size != actual_hash.size + + expected_hash.all? do |expected_key, expected_value| + actual_value = actual_hash.fetch(expected_key) { return false } + values_match?(expected_value, actual_value) + end + end + + private_class_method :arrays_match?, :hashes_match? + end + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/rspec-support-3.11.0/lib/rspec/support/hunk_generator.rb b/vendor/bundle/ruby/3.1.0/gems/rspec-support-3.11.0/lib/rspec/support/hunk_generator.rb new file mode 100644 index 000000000..382579e83 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/rspec-support-3.11.0/lib/rspec/support/hunk_generator.rb @@ -0,0 +1,47 @@ +require 'diff/lcs' +require 'diff/lcs/hunk' + +module RSpec + module Support + # @private + class HunkGenerator + def initialize(actual, expected) + @actual = actual + @expected = expected + end + + def hunks + @file_length_difference = 0 + @hunks ||= diffs.map do |piece| + build_hunk(piece) + end + end + + private + + def diffs + Diff::LCS.diff(expected_lines, actual_lines) + end + + def expected_lines + @expected.split("\n").map! { |e| e.chomp } + end + + def actual_lines + @actual.split("\n").map! { |e| e.chomp } + end + + def build_hunk(piece) + Diff::LCS::Hunk.new( + expected_lines, actual_lines, piece, context_lines, @file_length_difference + ).tap do |h| + @file_length_difference = h.file_length_difference + end + end + + def context_lines + 3 + end + end + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/rspec-support-3.11.0/lib/rspec/support/matcher_definition.rb b/vendor/bundle/ruby/3.1.0/gems/rspec-support-3.11.0/lib/rspec/support/matcher_definition.rb new file mode 100644 index 000000000..d653cc11d --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/rspec-support-3.11.0/lib/rspec/support/matcher_definition.rb @@ -0,0 +1,42 @@ +module RSpec + module Support + # @private + def self.matcher_definitions + @matcher_definitions ||= [] + end + + # Used internally to break cyclic dependency between mocks, expectations, + # and support. We don't currently have a consistent implementation of our + # matchers, though we are considering changing that: + # https://github.com/rspec/rspec-mocks/issues/513 + # + # @private + def self.register_matcher_definition(&block) + matcher_definitions << block + end + + # Remove a previously registered matcher. Useful for cleaning up after + # yourself in specs. + # + # @private + def self.deregister_matcher_definition(&block) + matcher_definitions.delete(block) + end + + # @private + def self.is_a_matcher?(object) + matcher_definitions.any? { |md| md.call(object) } + end + + # @api private + # + # gives a string representation of an object for use in RSpec descriptions + def self.rspec_description_for_object(object) + if RSpec::Support.is_a_matcher?(object) && object.respond_to?(:description) + object.description + else + object + end + end + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/rspec-support-3.11.0/lib/rspec/support/method_signature_verifier.rb b/vendor/bundle/ruby/3.1.0/gems/rspec-support-3.11.0/lib/rspec/support/method_signature_verifier.rb new file mode 100644 index 000000000..16736224e --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/rspec-support-3.11.0/lib/rspec/support/method_signature_verifier.rb @@ -0,0 +1,438 @@ +require 'rspec/support' +RSpec::Support.require_rspec_support "ruby_features" +RSpec::Support.require_rspec_support "matcher_definition" + +module RSpec + module Support + # Extracts info about the number of arguments and allowed/required + # keyword args of a given method. + # + # @private + class MethodSignature # rubocop:disable ClassLength + attr_reader :min_non_kw_args, :max_non_kw_args, :optional_kw_args, :required_kw_args + + def initialize(method) + @method = method + @optional_kw_args = [] + @required_kw_args = [] + classify_parameters + end + + def non_kw_args_arity_description + case max_non_kw_args + when min_non_kw_args then min_non_kw_args.to_s + when INFINITY then "#{min_non_kw_args} or more" + else "#{min_non_kw_args} to #{max_non_kw_args}" + end + end + + def valid_non_kw_args?(positional_arg_count, optional_max_arg_count=positional_arg_count) + return true if positional_arg_count.nil? + + min_non_kw_args <= positional_arg_count && + optional_max_arg_count <= max_non_kw_args + end + + def classify_arity(arity=@method.arity) + if arity < 0 + # `~` inverts the one's complement and gives us the + # number of required args + @min_non_kw_args = ~arity + @max_non_kw_args = INFINITY + else + @min_non_kw_args = arity + @max_non_kw_args = arity + end + end + + if RubyFeatures.optional_and_splat_args_supported? + def description + @description ||= begin + parts = [] + + unless non_kw_args_arity_description == "0" + parts << "arity of #{non_kw_args_arity_description}" + end + + if @optional_kw_args.any? + parts << "optional keyword args (#{@optional_kw_args.map(&:inspect).join(", ")})" + end + + if @required_kw_args.any? + parts << "required keyword args (#{@required_kw_args.map(&:inspect).join(", ")})" + end + + parts << "any additional keyword args" if @allows_any_kw_args + + parts.join(" and ") + end + end + + def missing_kw_args_from(given_kw_args) + @required_kw_args - given_kw_args + end + + def invalid_kw_args_from(given_kw_args) + return [] if @allows_any_kw_args + given_kw_args - @allowed_kw_args + end + + # If the last argument is Hash, Ruby will treat only symbol keys as keyword arguments + # the rest will be grouped in another Hash and passed as positional argument. + def has_kw_args_in?(args) + Hash === args.last && + could_contain_kw_args?(args) && + (args.last.empty? || args.last.keys.any? { |x| x.is_a?(Symbol) }) + end + + # Without considering what the last arg is, could it + # contain keyword arguments? + def could_contain_kw_args?(args) + return false if args.count <= min_non_kw_args + + @allows_any_kw_args || @allowed_kw_args.any? + end + + def arbitrary_kw_args? + @allows_any_kw_args + end + + def unlimited_args? + @max_non_kw_args == INFINITY + end + + def classify_parameters + optional_non_kw_args = @min_non_kw_args = 0 + @allows_any_kw_args = false + + @method.parameters.each do |(type, name)| + case type + # def foo(a:) + when :keyreq then @required_kw_args << name + # def foo(a: 1) + when :key then @optional_kw_args << name + # def foo(**kw_args) + when :keyrest then @allows_any_kw_args = true + # def foo(a) + when :req then @min_non_kw_args += 1 + # def foo(a = 1) + when :opt then optional_non_kw_args += 1 + # def foo(*a) + when :rest then optional_non_kw_args = INFINITY + end + end + + @max_non_kw_args = @min_non_kw_args + optional_non_kw_args + @allowed_kw_args = @required_kw_args + @optional_kw_args + end + else + def description + "arity of #{non_kw_args_arity_description}" + end + + def missing_kw_args_from(_given_kw_args) + [] + end + + def invalid_kw_args_from(_given_kw_args) + [] + end + + def has_kw_args_in?(_args) + false + end + + def could_contain_kw_args?(*) + false + end + + def arbitrary_kw_args? + false + end + + def unlimited_args? + false + end + + alias_method :classify_parameters, :classify_arity + end + + INFINITY = 1 / 0.0 + end + + if RSpec::Support::Ruby.jruby? + # JRuby has only partial support for UnboundMethod#parameters, so we fall back on using #arity + # https://github.com/jruby/jruby/issues/2816 and https://github.com/jruby/jruby/issues/2817 + if RubyFeatures.optional_and_splat_args_supported? && + Java::JavaLang::String.instance_method(:char_at).parameters == [] + + class MethodSignature < remove_const(:MethodSignature) + private + + def classify_parameters + super + if (arity = @method.arity) != 0 && @method.parameters.empty? + classify_arity(arity) + end + end + end + end + + # JRuby used to always report -1 arity for Java proxy methods. + # The workaround essentially makes use of Java's introspection to figure + # out matching methods (which could be more than one partly because Java + # supports multiple overloads, and partly because JRuby introduces + # aliases to make method names look more Rubyesque). If there is only a + # single match, we can use that methods arity directly instead of the + # default -1 arity. + # + # This workaround only works for Java proxy methods, and in order to + # support regular methods and blocks, we need to be careful about calling + # owner and java_class as they might not be available + if Java::JavaLang::String.instance_method(:char_at).arity == -1 + class MethodSignature < remove_const(:MethodSignature) + private + + def classify_parameters + super + return unless @method.arity == -1 + return unless @method.respond_to?(:owner) + return unless @method.owner.respond_to?(:java_class) + java_instance_methods = @method.owner.java_class.java_instance_methods + compatible_overloads = java_instance_methods.select do |java_method| + @method == @method.owner.instance_method(java_method.name) + end + if compatible_overloads.size == 1 + classify_arity(compatible_overloads.first.arity) + end + end + end + end + end + + # Encapsulates expectations about the number of arguments and + # allowed/required keyword args of a given method. + # + # @api private + class MethodSignatureExpectation + def initialize + @min_count = nil + @max_count = nil + @keywords = [] + + @expect_unlimited_arguments = false + @expect_arbitrary_keywords = false + end + + attr_reader :min_count, :max_count, :keywords + + attr_accessor :expect_unlimited_arguments, :expect_arbitrary_keywords + + def max_count=(number) + raise ArgumentError, 'must be a non-negative integer or nil' \ + unless number.nil? || (number.is_a?(Integer) && number >= 0) + + @max_count = number + end + + def min_count=(number) + raise ArgumentError, 'must be a non-negative integer or nil' \ + unless number.nil? || (number.is_a?(Integer) && number >= 0) + + @min_count = number + end + + def empty? + @min_count.nil? && + @keywords.to_a.empty? && + !@expect_arbitrary_keywords && + !@expect_unlimited_arguments + end + + def keywords=(values) + @keywords = values.to_a || [] + end + end + + # Deals with the slightly different semantics of block arguments. + # For methods, arguments are required unless a default value is provided. + # For blocks, arguments are optional, even if no default value is provided. + # + # However, we want to treat block args as required since you virtually + # always want to pass a value for each received argument and our + # `and_yield` has treated block args as required for many years. + # + # @api private + class BlockSignature < MethodSignature + if RubyFeatures.optional_and_splat_args_supported? + def classify_parameters + super + @min_non_kw_args = @max_non_kw_args unless @max_non_kw_args == INFINITY + end + end + end + + # Abstract base class for signature verifiers. + # + # @api private + class MethodSignatureVerifier + attr_reader :non_kw_args, :kw_args, :min_non_kw_args, :max_non_kw_args + + def initialize(signature, args=[]) + @signature = signature + @non_kw_args, @kw_args = split_args(*args) + @min_non_kw_args = @max_non_kw_args = @non_kw_args + @arbitrary_kw_args = @unlimited_args = false + end + + def with_expectation(expectation) # rubocop:disable MethodLength, Metrics/PerceivedComplexity + return self unless MethodSignatureExpectation === expectation + + if expectation.empty? + @min_non_kw_args = @max_non_kw_args = @non_kw_args = nil + @kw_args = [] + else + @min_non_kw_args = @non_kw_args = expectation.min_count || 0 + @max_non_kw_args = expectation.max_count || @min_non_kw_args + + if RubyFeatures.optional_and_splat_args_supported? + @unlimited_args = expectation.expect_unlimited_arguments + else + @unlimited_args = false + end + + if RubyFeatures.kw_args_supported? + @kw_args = expectation.keywords + @arbitrary_kw_args = expectation.expect_arbitrary_keywords + else + @kw_args = [] + @arbitrary_kw_args = false + end + end + + self + end + + def valid? + missing_kw_args.empty? && + invalid_kw_args.empty? && + valid_non_kw_args? && + arbitrary_kw_args? && + unlimited_args? + end + + def error_message + if missing_kw_args.any? + "Missing required keyword arguments: %s" % [ + missing_kw_args.join(", ") + ] + elsif invalid_kw_args.any? + "Invalid keyword arguments provided: %s" % [ + invalid_kw_args.join(", ") + ] + elsif !valid_non_kw_args? + "Wrong number of arguments. Expected %s, got %s." % [ + @signature.non_kw_args_arity_description, + non_kw_args + ] + end + end + + private + + def valid_non_kw_args? + @signature.valid_non_kw_args?(min_non_kw_args, max_non_kw_args) + end + + def missing_kw_args + @signature.missing_kw_args_from(kw_args) + end + + def invalid_kw_args + @signature.invalid_kw_args_from(kw_args) + end + + def arbitrary_kw_args? + !@arbitrary_kw_args || @signature.arbitrary_kw_args? + end + + def unlimited_args? + !@unlimited_args || @signature.unlimited_args? + end + + def split_args(*args) + kw_args = if @signature.has_kw_args_in?(args) + last = args.pop + non_kw_args = last.reject { |k, _| k.is_a?(Symbol) } + if non_kw_args.empty? + last.keys + else + args << non_kw_args + last.select { |k, _| k.is_a?(Symbol) }.keys + end + else + [] + end + + [args.length, kw_args] + end + end + + # Figures out wether a given method can accept various arguments. + # Surprisingly non-trivial. + # + # @private + StrictSignatureVerifier = MethodSignatureVerifier + + # Allows matchers to be used instead of providing keyword arguments. In + # practice, when this happens only the arity of the method is verified. + # + # @private + class LooseSignatureVerifier < MethodSignatureVerifier + private + + def split_args(*args) + if RSpec::Support.is_a_matcher?(args.last) && @signature.could_contain_kw_args?(args) + args.pop + @signature = SignatureWithKeywordArgumentsMatcher.new(@signature) + end + + super(*args) + end + + # If a matcher is used in a signature in place of keyword arguments, all + # keyword argument validation needs to be skipped since the matcher is + # opaque. + # + # Instead, keyword arguments will be validated when the method is called + # and they are actually known. + # + # @private + class SignatureWithKeywordArgumentsMatcher + def initialize(signature) + @signature = signature + end + + def missing_kw_args_from(_kw_args) + [] + end + + def invalid_kw_args_from(_kw_args) + [] + end + + def non_kw_args_arity_description + @signature.non_kw_args_arity_description + end + + def valid_non_kw_args?(*args) + @signature.valid_non_kw_args?(*args) + end + + def has_kw_args_in?(args) + @signature.has_kw_args_in?(args) + end + end + end + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/rspec-support-3.11.0/lib/rspec/support/mutex.rb b/vendor/bundle/ruby/3.1.0/gems/rspec-support-3.11.0/lib/rspec/support/mutex.rb new file mode 100644 index 000000000..1bc3ccf69 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/rspec-support-3.11.0/lib/rspec/support/mutex.rb @@ -0,0 +1,73 @@ +module RSpec + module Support + # On 1.8.7, it's in the stdlib. + # We don't want to load the stdlib, b/c this is a test tool, and can affect + # the test environment, causing tests to pass where they should fail. + # + # So we're transcribing/modifying it from + # https://github.com/ruby/ruby/blob/v1_8_7_374/lib/thread.rb#L56 + # Some methods we don't need are deleted. Anything I don't + # understand (there's quite a bit, actually) is left in. + # + # Some formating changes are made to appease the robot overlord: + # https://travis-ci.org/rspec/rspec-core/jobs/54410874 + # @private + class Mutex + def initialize + @waiting = [] + @locked = false + @waiting.taint + taint + end + + # @private + def lock + while Thread.critical = true && @locked + @waiting.push Thread.current + Thread.stop + end + @locked = true + Thread.critical = false + self + end + + # @private + def unlock + return unless @locked + Thread.critical = true + @locked = false + wakeup_and_run_waiting_thread + self + end + + # @private + def synchronize + lock + begin + yield + ensure + unlock + end + end + + private + + def wakeup_and_run_waiting_thread + begin + t = @waiting.shift + t.wakeup if t + rescue ThreadError + retry + end + Thread.critical = false + begin + t.run if t + rescue ThreadError + :noop + end + end + + # Avoid warnings for library wide checks spec + end unless defined?(::RSpec::Support::Mutex) || defined?(::Mutex) + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/rspec-support-3.11.0/lib/rspec/support/object_formatter.rb b/vendor/bundle/ruby/3.1.0/gems/rspec-support-3.11.0/lib/rspec/support/object_formatter.rb new file mode 100644 index 000000000..2798a57b7 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/rspec-support-3.11.0/lib/rspec/support/object_formatter.rb @@ -0,0 +1,275 @@ +RSpec::Support.require_rspec_support 'matcher_definition' + +module RSpec + module Support + # Provide additional output details beyond what `inspect` provides when + # printing Time, DateTime, or BigDecimal + # @api private + class ObjectFormatter # rubocop:disable Metrics/ClassLength + ELLIPSIS = "..." + + attr_accessor :max_formatted_output_length + + # Methods are deferred to a default instance of the class to maintain the interface + # For example, calling ObjectFormatter.format is still possible + def self.default_instance + @default_instance ||= new + end + + def self.format(object) + default_instance.format(object) + end + + def self.prepare_for_inspection(object) + default_instance.prepare_for_inspection(object) + end + + def initialize(max_formatted_output_length=200) + @max_formatted_output_length = max_formatted_output_length + @current_structure_stack = [] + end + + def format(object) + if max_formatted_output_length.nil? + prepare_for_inspection(object).inspect + else + formatted_object = prepare_for_inspection(object).inspect + if formatted_object.length < max_formatted_output_length + formatted_object + else + beginning = truncate_string formatted_object, 0, max_formatted_output_length / 2 + ending = truncate_string formatted_object, -max_formatted_output_length / 2, -1 + beginning + ELLIPSIS + ending + end + end + end + + # Prepares the provided object to be formatted by wrapping it as needed + # in something that, when `inspect` is called on it, will produce the + # desired output. + # + # This allows us to apply the desired formatting to hash/array data structures + # at any level of nesting, simply by walking that structure and replacing items + # with custom items that have `inspect` defined to return the desired output + # for that item. Then we can just use `Array#inspect` or `Hash#inspect` to + # format the entire thing. + def prepare_for_inspection(object) + case object + when Array + prepare_array(object) + when Hash + prepare_hash(object) + else + inspector_class = INSPECTOR_CLASSES.find { |inspector| inspector.can_inspect?(object) } + inspector_class.new(object, self) + end + end + + def prepare_array(array) + with_entering_structure(array) do + array.map { |element| prepare_element(element) } + end + end + + def prepare_hash(input_hash) + with_entering_structure(input_hash) do + sort_hash_keys(input_hash).inject({}) do |output_hash, key_and_value| + key, value = key_and_value.map { |element| prepare_element(element) } + output_hash[key] = value + output_hash + end + end + end + + def sort_hash_keys(input_hash) + if input_hash.keys.all? { |k| k.is_a?(String) || k.is_a?(Symbol) } + Hash[input_hash.sort_by { |k, _v| k.to_s }] + else + input_hash + end + end + + def prepare_element(element) + if recursive_structure?(element) + case element + when Array then InspectableItem.new('[...]') + when Hash then InspectableItem.new('{...}') + else raise # This won't happen + end + else + prepare_for_inspection(element) + end + end + + def with_entering_structure(structure) + @current_structure_stack.push(structure) + return_value = yield + @current_structure_stack.pop + return_value + end + + def recursive_structure?(object) + @current_structure_stack.any? { |seen_structure| seen_structure.equal?(object) } + end + + InspectableItem = Struct.new(:text) do + def inspect + text + end + + def pretty_print(pp) + pp.text(text) + end + end + + BaseInspector = Struct.new(:object, :formatter) do + def self.can_inspect?(_object) + raise NotImplementedError + end + + def inspect + raise NotImplementedError + end + + def pretty_print(pp) + pp.text(inspect) + end + end + + class TimeInspector < BaseInspector + FORMAT = "%Y-%m-%d %H:%M:%S" + + def self.can_inspect?(object) + Time === object + end + + if Time.method_defined?(:nsec) + def inspect + object.strftime("#{FORMAT}.#{"%09d" % object.nsec} %z") + end + else # for 1.8.7 + def inspect + object.strftime("#{FORMAT}.#{"%06d" % object.usec} %z") + end + end + end + + class DateTimeInspector < BaseInspector + FORMAT = "%a, %d %b %Y %H:%M:%S.%N %z" + + def self.can_inspect?(object) + defined?(DateTime) && DateTime === object + end + + # ActiveSupport sometimes overrides inspect. If `ActiveSupport` is + # defined use a custom format string that includes more time precision. + def inspect + if defined?(ActiveSupport) + object.strftime(FORMAT) + else + object.inspect + end + end + end + + class BigDecimalInspector < BaseInspector + def self.can_inspect?(object) + defined?(BigDecimal) && BigDecimal === object + end + + def inspect + "#{object.to_s('F')} (#{object.inspect})" + end + end + + class DescribableMatcherInspector < BaseInspector + def self.can_inspect?(object) + Support.is_a_matcher?(object) && object.respond_to?(:description) + end + + def inspect + object.description + end + end + + class UninspectableObjectInspector < BaseInspector + OBJECT_ID_FORMAT = '%#016x' + + def self.can_inspect?(object) + object.inspect + false + rescue NoMethodError + true + end + + def inspect + "#<#{klass}:#{native_object_id}>" + end + + def klass + Support.class_of(object) + end + + # http://stackoverflow.com/a/2818916 + def native_object_id + OBJECT_ID_FORMAT % (object.__id__ << 1) + rescue NoMethodError + # In Ruby 1.9.2, BasicObject responds to none of #__id__, #object_id, #id... + '-' + end + end + + class DelegatorInspector < BaseInspector + def self.can_inspect?(object) + defined?(Delegator) && Delegator === object + end + + def inspect + "#<#{object.class}(#{formatter.format(object.send(:__getobj__))})>" + end + end + + class InspectableObjectInspector < BaseInspector + def self.can_inspect?(object) + object.inspect + true + rescue NoMethodError + false + end + + def inspect + object.inspect + end + end + + INSPECTOR_CLASSES = [ + TimeInspector, + DateTimeInspector, + BigDecimalInspector, + UninspectableObjectInspector, + DescribableMatcherInspector, + DelegatorInspector, + InspectableObjectInspector + ].tap do |classes| + # 2.4 has improved BigDecimal formatting so we do not need + # to provide our own. + # https://github.com/ruby/bigdecimal/pull/42 + classes.delete(BigDecimalInspector) if RUBY_VERSION >= '2.4' + end + + private + + # Returns the substring defined by the start_index and end_index + # If the string ends with a partial ANSI code code then that + # will be removed as printing partial ANSI + # codes to the terminal can lead to corruption + def truncate_string(str, start_index, end_index) + cut_str = str[start_index..end_index] + + # ANSI color codes are like: \e[33m so anything with \e[ and a + # number without a 'm' is an incomplete color code + cut_str.sub(/\e\[\d+$/, '') + end + end + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/rspec-support-3.11.0/lib/rspec/support/recursive_const_methods.rb b/vendor/bundle/ruby/3.1.0/gems/rspec-support-3.11.0/lib/rspec/support/recursive_const_methods.rb new file mode 100644 index 000000000..b19ad0666 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/rspec-support-3.11.0/lib/rspec/support/recursive_const_methods.rb @@ -0,0 +1,76 @@ +module RSpec + module Support + # Provides recursive constant lookup methods useful for + # constant stubbing. + module RecursiveConstMethods + # We only want to consider constants that are defined directly on a + # particular module, and not include top-level/inherited constants. + # Unfortunately, the constant API changed between 1.8 and 1.9, so + # we need to conditionally define methods to ignore the top-level/inherited + # constants. + # + # Given: + # class A; B = 1; end + # class C < A; end + # + # On 1.8: + # - C.const_get("Hash") # => ::Hash + # - C.const_defined?("Hash") # => false + # - C.constants # => ["B"] + # - None of these methods accept the extra `inherit` argument + # On 1.9: + # - C.const_get("Hash") # => ::Hash + # - C.const_defined?("Hash") # => true + # - C.const_get("Hash", false) # => raises NameError + # - C.const_defined?("Hash", false) # => false + # - C.constants # => [:B] + # - C.constants(false) #=> [] + if Module.method(:const_defined?).arity == 1 + def const_defined_on?(mod, const_name) + mod.const_defined?(const_name) + end + + def get_const_defined_on(mod, const_name) + return mod.const_get(const_name) if const_defined_on?(mod, const_name) + + raise NameError, "uninitialized constant #{mod.name}::#{const_name}" + end + + def constants_defined_on(mod) + mod.constants.select { |c| const_defined_on?(mod, c) } + end + else + def const_defined_on?(mod, const_name) + mod.const_defined?(const_name, false) + end + + def get_const_defined_on(mod, const_name) + mod.const_get(const_name, false) + end + + def constants_defined_on(mod) + mod.constants(false) + end + end + + def recursive_const_get(const_name) + normalize_const_name(const_name).split('::').inject(Object) do |mod, name| + get_const_defined_on(mod, name) + end + end + + def recursive_const_defined?(const_name) + parts = normalize_const_name(const_name).split('::') + parts.inject([Object, '']) do |(mod, full_name), name| + yield(full_name, name) if block_given? && !(Module === mod) + return false unless const_defined_on?(mod, name) + [get_const_defined_on(mod, name), [mod.name, name].join('::')] + end + end + + def normalize_const_name(const_name) + const_name.sub(/\A::/, '') + end + end + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/rspec-support-3.11.0/lib/rspec/support/reentrant_mutex.rb b/vendor/bundle/ruby/3.1.0/gems/rspec-support-3.11.0/lib/rspec/support/reentrant_mutex.rb new file mode 100644 index 000000000..55fbf892c --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/rspec-support-3.11.0/lib/rspec/support/reentrant_mutex.rb @@ -0,0 +1,78 @@ +module RSpec + module Support + # Allows a thread to lock out other threads from a critical section of code, + # while allowing the thread with the lock to reenter that section. + # + # Based on Monitor as of 2.2 - + # https://github.com/ruby/ruby/blob/eb7ddaa3a47bf48045d26c72eb0f263a53524ebc/lib/monitor.rb#L9 + # + # Depends on Mutex, but Mutex is only available as part of core since 1.9.1: + # exists - http://ruby-doc.org/core-1.9.1/Mutex.html + # dne - http://ruby-doc.org/core-1.9.0/Mutex.html + # + # @private + class ReentrantMutex + def initialize + @owner = nil + @count = 0 + @mutex = Mutex.new + end + + def synchronize + enter + yield + ensure + exit + end + + private + + # This is fixing a bug #501 that is specific to Ruby 3.0. The new implementation + # depends on `owned?` that was introduced in Ruby 2.0, so both should work for Ruby 2.x. + if RUBY_VERSION.to_f >= 3.0 + def enter + @mutex.lock unless @mutex.owned? + @count += 1 + end + + def exit + unless @mutex.owned? + raise ThreadError, "Attempt to unlock a mutex which is locked by another thread/fiber" + end + @count -= 1 + @mutex.unlock if @count == 0 + end + else + def enter + @mutex.lock if @owner != Thread.current + @owner = Thread.current + @count += 1 + end + + def exit + @count -= 1 + return unless @count == 0 + @owner = nil + @mutex.unlock + end + end + end + + if defined? ::Mutex + # On 1.9 and up, this is in core, so we just use the real one + class Mutex < ::Mutex + # If you mock Mutex.new you break our usage of Mutex, so + # instead we capture the original method to return Mutexs. + NEW_MUTEX_METHOD = Mutex.method(:new) + + def self.new + NEW_MUTEX_METHOD.call + end + end + else # For 1.8.7 + # :nocov: + RSpec::Support.require_rspec_support "mutex" + # :nocov: + end + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/rspec-support-3.11.0/lib/rspec/support/ruby_features.rb b/vendor/bundle/ruby/3.1.0/gems/rspec-support-3.11.0/lib/rspec/support/ruby_features.rb new file mode 100644 index 000000000..daba00ea5 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/rspec-support-3.11.0/lib/rspec/support/ruby_features.rb @@ -0,0 +1,191 @@ +require 'rbconfig' +RSpec::Support.require_rspec_support "comparable_version" + +module RSpec + module Support + # @api private + # + # Provides query methods for different OS or OS features. + module OS + module_function + + def windows? + !!(RbConfig::CONFIG['host_os'] =~ /cygwin|mswin|mingw|bccwin|wince|emx/) + end + + def windows_file_path? + ::File::ALT_SEPARATOR == '\\' + end + end + + # @api private + # + # Provides query methods for different rubies + module Ruby + module_function + + def jruby? + RUBY_PLATFORM == 'java' + end + + def jruby_version + @jruby_version ||= ComparableVersion.new(JRUBY_VERSION) + end + + def jruby_9000? + jruby? && JRUBY_VERSION >= '9.0.0.0' + end + + def rbx? + defined?(RUBY_ENGINE) && RUBY_ENGINE == 'rbx' + end + + def non_mri? + !mri? + end + + def mri? + !defined?(RUBY_ENGINE) || RUBY_ENGINE == 'ruby' + end + + def truffleruby? + defined?(RUBY_ENGINE) && RUBY_ENGINE == 'truffleruby' + end + end + + # @api private + # + # Provides query methods for ruby features that differ among + # implementations. + module RubyFeatures + module_function + + if Ruby.jruby? && RUBY_VERSION.to_f < 1.9 + # On JRuby 1.7 `--1.8` mode, `Process.respond_to?(:fork)` returns true, + # but when you try to fork, it raises an error: + # NotImplementedError: fork is not available on this platform + # + # When we drop support for JRuby 1.7 and/or Ruby 1.8, we can drop + # this special case. + def fork_supported? + false + end + else + def fork_supported? + Process.respond_to?(:fork) + end + end + + def optional_and_splat_args_supported? + Method.method_defined?(:parameters) + end + + def caller_locations_supported? + respond_to?(:caller_locations, true) + end + + if Exception.method_defined?(:cause) + def supports_exception_cause? + true + end + else + def supports_exception_cause? + false + end + end + + if RUBY_VERSION.to_f >= 2.7 + def supports_taint? + false + end + else + def supports_taint? + true + end + end + ripper_requirements = [ComparableVersion.new(RUBY_VERSION) >= '1.9.2'] + + ripper_requirements.push(false) if Ruby.rbx? + + if Ruby.jruby? + ripper_requirements.push(Ruby.jruby_version >= '1.7.5') + # Ripper on JRuby 9.0.0.0.rc1 - 9.1.8.0 reports wrong line number + # or cannot parse source including `:if`. + # Ripper on JRuby 9.x.x.x < 9.1.17.0 can't handle keyword arguments + # Neither can JRuby 9.2, e.g. < 9.2.1.0 + ripper_requirements.push(!Ruby.jruby_version.between?('9.0.0.0.rc1', '9.2.0.0')) + end + + if ripper_requirements.all? + def ripper_supported? + true + end + else + def ripper_supported? + false + end + end + + if Ruby.mri? + def kw_args_supported? + RUBY_VERSION >= '2.0.0' + end + + def required_kw_args_supported? + RUBY_VERSION >= '2.1.0' + end + + def supports_rebinding_module_methods? + RUBY_VERSION.to_i >= 2 + end + else + # RBX / JRuby et al support is unknown for keyword arguments + begin + eval("o = Object.new; def o.m(a: 1); end;"\ + " raise SyntaxError unless o.method(:m).parameters.include?([:key, :a])") + + def kw_args_supported? + true + end + rescue SyntaxError + def kw_args_supported? + false + end + end + + begin + eval("o = Object.new; def o.m(a: ); end;"\ + "raise SyntaxError unless o.method(:m).parameters.include?([:keyreq, :a])") + + def required_kw_args_supported? + true + end + rescue SyntaxError + def required_kw_args_supported? + false + end + end + + begin + Module.new { def foo; end }.instance_method(:foo).bind(Object.new) + + def supports_rebinding_module_methods? + true + end + rescue TypeError + def supports_rebinding_module_methods? + false + end + end + end + + def module_refinement_supported? + Module.method_defined?(:refine) || Module.private_method_defined?(:refine) + end + + def module_prepends_supported? + Module.method_defined?(:prepend) || Module.private_method_defined?(:prepend) + end + end + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/rspec-support-3.11.0/lib/rspec/support/source.rb b/vendor/bundle/ruby/3.1.0/gems/rspec-support-3.11.0/lib/rspec/support/source.rb new file mode 100644 index 000000000..ec0e1aeb1 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/rspec-support-3.11.0/lib/rspec/support/source.rb @@ -0,0 +1,85 @@ +RSpec::Support.require_rspec_support 'encoded_string' +RSpec::Support.require_rspec_support 'ruby_features' + +module RSpec + module Support + # @private + # Represents a Ruby source file and provides access to AST and tokens. + class Source + attr_reader :source, :path + + # This class protects us against having File read and expand_path + # stubbed out within tests. + class File + class << self + [:read, :expand_path].each do |method_name| + define_method(method_name, &::File.method(method_name)) + end + end + end + + def self.from_file(path) + source = File.read(path) + new(source, path) + end + + if String.method_defined?(:encoding) + def initialize(source_string, path=nil) + @source = RSpec::Support::EncodedString.new(source_string, Encoding.default_external) + @path = path ? File.expand_path(path) : '(string)' + end + else # for 1.8.7 + # :nocov: + def initialize(source_string, path=nil) + @source = RSpec::Support::EncodedString.new(source_string) + @path = path ? File.expand_path(path) : '(string)' + end + # :nocov: + end + + def lines + @lines ||= source.split("\n") + end + + def inspect + "#<#{self.class} #{path}>" + end + + if RSpec::Support::RubyFeatures.ripper_supported? + RSpec::Support.require_rspec_support 'source/node' + RSpec::Support.require_rspec_support 'source/token' + + def ast + @ast ||= begin + require 'ripper' + sexp = Ripper.sexp(source) + raise SyntaxError unless sexp + Node.new(sexp) + end + end + + def tokens + @tokens ||= begin + require 'ripper' + tokens = Ripper.lex(source) + Token.tokens_from_ripper_tokens(tokens) + end + end + + def nodes_by_line_number + @nodes_by_line_number ||= begin + nodes_by_line_number = ast.select(&:location).group_by { |node| node.location.line } + Hash.new { |hash, key| hash[key] = [] }.merge(nodes_by_line_number) + end + end + + def tokens_by_line_number + @tokens_by_line_number ||= begin + nodes_by_line_number = tokens.group_by { |token| token.location.line } + Hash.new { |hash, key| hash[key] = [] }.merge(nodes_by_line_number) + end + end + end + end + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/rspec-support-3.11.0/lib/rspec/support/source/location.rb b/vendor/bundle/ruby/3.1.0/gems/rspec-support-3.11.0/lib/rspec/support/source/location.rb new file mode 100644 index 000000000..29077c99c --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/rspec-support-3.11.0/lib/rspec/support/source/location.rb @@ -0,0 +1,21 @@ +module RSpec + module Support + class Source + # @private + # Represents a source location of node or token. + Location = Struct.new(:line, :column) do + include Comparable + + def self.location?(array) + array.is_a?(Array) && array.size == 2 && array.all? { |e| e.is_a?(Integer) } + end + + def <=>(other) + line_comparison = (line <=> other.line) + return line_comparison unless line_comparison == 0 + column <=> other.column + end + end + end + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/rspec-support-3.11.0/lib/rspec/support/source/node.rb b/vendor/bundle/ruby/3.1.0/gems/rspec-support-3.11.0/lib/rspec/support/source/node.rb new file mode 100644 index 000000000..6f3086b66 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/rspec-support-3.11.0/lib/rspec/support/source/node.rb @@ -0,0 +1,110 @@ +RSpec::Support.require_rspec_support 'source/location' + +module RSpec + module Support + class Source + # @private + # A wrapper for Ripper AST node which is generated with `Ripper.sexp`. + class Node + include Enumerable + + attr_reader :sexp, :parent + + def self.sexp?(array) + array.is_a?(Array) && array.first.is_a?(Symbol) + end + + def initialize(ripper_sexp, parent=nil) + @sexp = ripper_sexp.freeze + @parent = parent + end + + def type + sexp[0] + end + + def args + @args ||= raw_args.map do |raw_arg| + if Node.sexp?(raw_arg) + Node.new(raw_arg, self) + elsif Location.location?(raw_arg) + Location.new(*raw_arg) + elsif raw_arg.is_a?(Array) + ExpressionSequenceNode.new(raw_arg, self) + else + raw_arg + end + end.freeze + end + + def children + @children ||= args.select { |arg| arg.is_a?(Node) }.freeze + end + + def location + @location ||= args.find { |arg| arg.is_a?(Location) } + end + + # We use a loop here (instead of recursion) to prevent SystemStackError + def each + return to_enum(__method__) unless block_given? + + node_queue = [] + node_queue << self + + while (current_node = node_queue.shift) + yield current_node + node_queue.concat(current_node.children) + end + end + + def each_ancestor + return to_enum(__method__) unless block_given? + + current_node = self + + while (current_node = current_node.parent) + yield current_node + end + end + + def inspect + "#<#{self.class} #{type}>" + end + + private + + def raw_args + sexp[1..-1] || [] + end + end + + # @private + # Basically `Ripper.sexp` generates arrays whose first element is a symbol (type of sexp), + # but it exceptionally generates typeless arrays for expression sequence: + # + # Ripper.sexp('foo; bar') + # => [ + # :program, + # [ # Typeless array + # [:vcall, [:@ident, "foo", [1, 0]]], + # [:vcall, [:@ident, "bar", [1, 5]]] + # ] + # ] + # + # We wrap typeless arrays in this pseudo type node + # so that it can be handled in the same way as other type node. + class ExpressionSequenceNode < Node + def type + :_expression_sequence + end + + private + + def raw_args + sexp + end + end + end + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/rspec-support-3.11.0/lib/rspec/support/source/token.rb b/vendor/bundle/ruby/3.1.0/gems/rspec-support-3.11.0/lib/rspec/support/source/token.rb new file mode 100644 index 000000000..ac3fb92dd --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/rspec-support-3.11.0/lib/rspec/support/source/token.rb @@ -0,0 +1,94 @@ +RSpec::Support.require_rspec_support 'source/location' + +module RSpec + module Support + class Source + # @private + # A wrapper for Ripper token which is generated with `Ripper.lex`. + class Token + CLOSING_TYPES_BY_OPENING_TYPE = { + :on_lbracket => :on_rbracket, + :on_lparen => :on_rparen, + :on_lbrace => :on_rbrace, + :on_heredoc_beg => :on_heredoc_end + }.freeze + + CLOSING_KEYWORDS_BY_OPENING_KEYWORD = { + 'def' => 'end', + 'do' => 'end', + }.freeze + + attr_reader :token + + def self.tokens_from_ripper_tokens(ripper_tokens) + ripper_tokens.map { |ripper_token| new(ripper_token) }.freeze + end + + def initialize(ripper_token) + @token = ripper_token.freeze + end + + def location + @location ||= Location.new(*token[0]) + end + + def type + token[1] + end + + def string + token[2] + end + + def ==(other) + token == other.token + end + + alias_method :eql?, :== + + def inspect + "#<#{self.class} #{type} #{string.inspect}>" + end + + def keyword? + type == :on_kw + end + + def equals_operator? + type == :on_op && string == '=' + end + + def opening? + opening_delimiter? || opening_keyword? + end + + def closed_by?(other) + delimiter_closed_by?(other) || keyword_closed_by?(other) + end + + private + + def opening_delimiter? + CLOSING_TYPES_BY_OPENING_TYPE.key?(type) + end + + def opening_keyword? + return false unless keyword? + CLOSING_KEYWORDS_BY_OPENING_KEYWORD.key?(string) + end + + def delimiter_closed_by?(other) + other.type == CLOSING_TYPES_BY_OPENING_TYPE[type] + end + + def keyword_closed_by?(other) + return false unless keyword? + return true if other.string == CLOSING_KEYWORDS_BY_OPENING_KEYWORD[string] + + # Ruby 3's `end`-less method definition: `def method_name = body` + string == 'def' && other.equals_operator? && location.line == other.location.line + end + end + end + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/rspec-support-3.11.0/lib/rspec/support/spec.rb b/vendor/bundle/ruby/3.1.0/gems/rspec-support-3.11.0/lib/rspec/support/spec.rb new file mode 100644 index 000000000..b53829a98 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/rspec-support-3.11.0/lib/rspec/support/spec.rb @@ -0,0 +1,82 @@ +require 'rspec/support' +require 'rspec/support/spec/in_sub_process' + +RSpec::Support.require_rspec_support "spec/deprecation_helpers" +RSpec::Support.require_rspec_support "spec/diff_helpers" +RSpec::Support.require_rspec_support "spec/with_isolated_stderr" +RSpec::Support.require_rspec_support "spec/stderr_splitter" +RSpec::Support.require_rspec_support "spec/formatting_support" +RSpec::Support.require_rspec_support "spec/with_isolated_directory" +RSpec::Support.require_rspec_support "ruby_features" + +warning_preventer = $stderr = RSpec::Support::StdErrSplitter.new($stderr) + +RSpec.configure do |c| + c.include RSpecHelpers + c.include RSpec::Support::WithIsolatedStdErr + c.include RSpec::Support::FormattingSupport + c.include RSpec::Support::InSubProcess + + unless defined?(Debugger) # debugger causes warnings when used + c.before do + warning_preventer.reset! + end + + c.after do + warning_preventer.verify_no_warnings! + end + end + + if c.files_to_run.one? + c.full_backtrace = true + c.default_formatter = 'doc' + end + + c.filter_run_when_matching :focus + + c.example_status_persistence_file_path = "./spec/examples.txt" + + c.define_derived_metadata :failing_on_windows_ci do |meta| + meta[:pending] ||= "This spec fails on Windows CI and needs someone to fix it." + end if RSpec::Support::OS.windows? && ENV['CI'] +end + +module RSpec + module Support + module Spec + def self.setup_simplecov(&block) + # Simplecov emits some ruby warnings when loaded, so silence them. + old_verbose, $VERBOSE = $VERBOSE, false + + return if ENV['NO_COVERAGE'] || RUBY_VERSION < '1.9.3' + return if RUBY_ENGINE != 'ruby' || RSpec::Support::OS.windows? + + # Don't load it when we're running a single isolated + # test file rather than the whole suite. + return if RSpec.configuration.files_to_run.one? + + require 'simplecov' + start_simplecov(&block) + rescue LoadError + warn "Simplecov could not be loaded" + ensure + $VERBOSE = old_verbose + end + + def self.start_simplecov(&block) + SimpleCov.start do + add_filter "bundle/" + add_filter "tmp/" + add_filter do |source_file| + # Filter out `spec` directory except when it is under `lib` + # (as is the case in rspec-support) + source_file.filename.include?('/spec/') && !source_file.filename.include?('/lib/') + end + + instance_eval(&block) if block + end + end + private_class_method :start_simplecov + end + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/rspec-support-3.11.0/lib/rspec/support/spec/deprecation_helpers.rb b/vendor/bundle/ruby/3.1.0/gems/rspec-support-3.11.0/lib/rspec/support/spec/deprecation_helpers.rb new file mode 100644 index 000000000..8413ed60e --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/rspec-support-3.11.0/lib/rspec/support/spec/deprecation_helpers.rb @@ -0,0 +1,48 @@ +module RSpecHelpers + def expect_deprecation_with_call_site(file, line, snippet=//) + expect(RSpec.configuration.reporter).to receive(:deprecation). + with(include(:deprecated => match(snippet), :call_site => include([file, line].join(':')))) + end + + def expect_deprecation_without_call_site(snippet=//) + expect(RSpec.configuration.reporter).to receive(:deprecation). + with(include(:deprecated => match(snippet), :call_site => eq(nil))) + end + + def expect_warn_deprecation_with_call_site(file, line, snippet=//) + expect(RSpec.configuration.reporter).to receive(:deprecation). + with(include(:message => match(snippet), :call_site => include([file, line].join(':')))) + end + + def expect_warn_deprecation(snippet=//) + expect(RSpec.configuration.reporter).to receive(:deprecation). + with(include(:message => match(snippet))) + end + + def allow_deprecation + allow(RSpec.configuration.reporter).to receive(:deprecation) + end + + def expect_no_deprecations + expect(RSpec.configuration.reporter).not_to receive(:deprecation) + end + alias expect_no_deprecation expect_no_deprecations + + def expect_warning_without_call_site(expected=//) + expect(::Kernel).to receive(:warn). + with(match(expected).and(satisfy { |message| !(/Called from/ =~ message) })) + end + + def expect_warning_with_call_site(file, line, expected=//) + expect(::Kernel).to receive(:warn). + with(match(expected).and(match(/Called from #{file}:#{line}/))) + end + + def expect_no_warnings + expect(::Kernel).not_to receive(:warn) + end + + def allow_warning + allow(::Kernel).to receive(:warn) + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/rspec-support-3.11.0/lib/rspec/support/spec/diff_helpers.rb b/vendor/bundle/ruby/3.1.0/gems/rspec-support-3.11.0/lib/rspec/support/spec/diff_helpers.rb new file mode 100644 index 000000000..76ef10a67 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/rspec-support-3.11.0/lib/rspec/support/spec/diff_helpers.rb @@ -0,0 +1,31 @@ +require 'diff/lcs' + +module RSpec + module Support + module Spec + module DiffHelpers + # In the updated version of diff-lcs several diff headers change format slightly + # compensate for this and change minimum version in RSpec 4 + if ::Diff::LCS::VERSION.to_f < 1.4 + def one_line_header(line_number=2) + "-1,#{line_number} +1,#{line_number}" + end + else + def one_line_header(_=2) + "-1 +1" + end + end + + if Diff::LCS::VERSION.to_f < 1.4 || Diff::LCS::VERSION >= "1.4.4" + def removing_two_line_header + "-1,3 +1" + end + else + def removing_two_line_header + "-1,3 +1,5" + end + end + end + end + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/rspec-support-3.11.0/lib/rspec/support/spec/formatting_support.rb b/vendor/bundle/ruby/3.1.0/gems/rspec-support-3.11.0/lib/rspec/support/spec/formatting_support.rb new file mode 100644 index 000000000..7e61cef49 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/rspec-support-3.11.0/lib/rspec/support/spec/formatting_support.rb @@ -0,0 +1,9 @@ +module RSpec + module Support + module FormattingSupport + def dedent(string) + string.gsub(/^\s+\|/, '').chomp + end + end + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/rspec-support-3.11.0/lib/rspec/support/spec/in_sub_process.rb b/vendor/bundle/ruby/3.1.0/gems/rspec-support-3.11.0/lib/rspec/support/spec/in_sub_process.rb new file mode 100644 index 000000000..85196997c --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/rspec-support-3.11.0/lib/rspec/support/spec/in_sub_process.rb @@ -0,0 +1,67 @@ +module RSpec + module Support + module InSubProcess + if Process.respond_to?(:fork) && !(Ruby.jruby? && RUBY_VERSION == '1.8.7') + + UnmarshableObject = Struct.new(:error) + + # Useful as a way to isolate a global change to a subprocess. + + def in_sub_process(prevent_warnings=true) # rubocop:disable MethodLength, Metrics/AbcSize + exception_reader, exception_writer = IO.pipe + result_reader, result_writer = IO.pipe + + pid = Process.fork do + warning_preventer = $stderr = RSpec::Support::StdErrSplitter.new($stderr) + + begin + result = yield + warning_preventer.verify_no_warnings! if prevent_warnings + # rubocop:disable Lint/HandleExceptions + rescue Support::AllExceptionsExceptOnesWeMustNotRescue => exception + # rubocop:enable Lint/HandleExceptions + end + + exception_writer.write marshal_dump_with_unmarshable_object_handling(exception) + exception_reader.close + exception_writer.close + + result_writer.write marshal_dump_with_unmarshable_object_handling(result) + result_reader.close + result_writer.close + + exit! # prevent at_exit hooks from running (e.g. minitest) + end + + exception_writer.close + result_writer.close + Process.waitpid(pid) + + exception = Marshal.load(exception_reader.read) + exception_reader.close + raise exception if exception + + result = Marshal.load(result_reader.read) + result_reader.close + result + end + alias :in_sub_process_if_possible :in_sub_process + + def marshal_dump_with_unmarshable_object_handling(object) + Marshal.dump(object) + rescue TypeError => error + Marshal.dump(UnmarshableObject.new(error)) + end + else + def in_sub_process(*) + skip "This spec requires forking to work properly, " \ + "and your platform does not support forking" + end + + def in_sub_process_if_possible(*) + yield + end + end + end + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/rspec-support-3.11.0/lib/rspec/support/spec/library_wide_checks.rb b/vendor/bundle/ruby/3.1.0/gems/rspec-support-3.11.0/lib/rspec/support/spec/library_wide_checks.rb new file mode 100644 index 000000000..56b059364 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/rspec-support-3.11.0/lib/rspec/support/spec/library_wide_checks.rb @@ -0,0 +1,150 @@ +require 'rspec/support/spec/shell_out' + +module RSpec + module Support + module WhitespaceChecks + # This malformed whitespace detection logic has been borrowed from bundler: + # https://github.com/bundler/bundler/blob/v1.8.0/spec/quality_spec.rb + def check_for_tab_characters(filename) + failing_lines = [] + File.readlines(filename).each_with_index do |line, number| + failing_lines << number + 1 if line =~ /\t/ + end + + return if failing_lines.empty? + "#{filename} has tab characters on lines #{failing_lines.join(', ')}" + end + + def check_for_extra_spaces(filename) + failing_lines = [] + File.readlines(filename).each_with_index do |line, number| + next if line =~ /^\s+#.*\s+\n$/ + failing_lines << number + 1 if line =~ /\s+\n$/ + end + + return if failing_lines.empty? + "#{filename} has spaces on the EOL on lines #{failing_lines.join(', ')}" + end + end + end +end + +RSpec.shared_examples_for "library wide checks" do |lib, options| + consider_a_test_env_file = options.fetch(:consider_a_test_env_file, /MATCHES NOTHING/) + allowed_loaded_feature_regexps = options.fetch(:allowed_loaded_feature_regexps, []) + preamble_for_lib = options[:preamble_for_lib] + preamble_for_spec = "require 'rspec/core'; require 'spec_helper'" + skip_spec_files = options.fetch(:skip_spec_files, /MATCHES NOTHING/) + + include RSpec::Support::ShellOut + include RSpec::Support::WhitespaceChecks + + define_method :files_to_require_for do |sub_dir| + slash = File::SEPARATOR + lib_path_re = /#{slash + lib}[^#{slash}]*#{slash}lib/ + load_path = $LOAD_PATH.grep(lib_path_re).first + directory = load_path.sub(/lib$/, sub_dir) + files = Dir["#{directory}/**/*.rb"] + extract_regex = /#{Regexp.escape(directory) + File::SEPARATOR}(.+)\.rb$/ + + # We sort to ensure the files are loaded in a consistent order, regardless + # of OS. Otherwise, it could load in a different order on Travis than + # locally, and potentially trigger a "circular require considered harmful" + # warning or similar. + files.sort.map { |file| file[extract_regex, 1] } + end + + def command_from(code_lines) + code_lines.join("\n") + end + + def load_all_files(files, preamble, postamble=nil) + requires = files.map { |f| "require '#{f}'" } + command = command_from(Array(preamble) + requires + Array(postamble)) + + stdout, stderr, status = with_env 'NO_COVERAGE' => '1' do + options = %w[ -w ] + options << "--disable=gem" if RUBY_VERSION.to_f >= 1.9 && RSpec::Support::Ruby.mri? + run_ruby_with_current_load_path(command, *options) + end + + [stdout, strip_known_warnings(stderr), status.exitstatus] + end + + define_method :load_all_lib_files do + files = all_lib_files - lib_test_env_files + preamble = ['orig_loaded_features = $".dup', preamble_for_lib] + postamble = ['puts(($" - orig_loaded_features).join("\n"))'] + + @loaded_feature_lines, stderr, exitstatus = load_all_files(files, preamble, postamble) + ["", stderr, exitstatus] + end + + define_method :load_all_spec_files do + files = files_to_require_for("spec") + lib_test_env_files + files = files.reject { |f| f =~ skip_spec_files } + load_all_files(files, preamble_for_spec) + end + + attr_reader :all_lib_files, :lib_test_env_files, + :lib_file_results, :spec_file_results + + before(:context) do + @all_lib_files = files_to_require_for("lib") + @lib_test_env_files = all_lib_files.grep(consider_a_test_env_file) + + @lib_file_results, @spec_file_results = [ + # Load them in parallel so it's faster... + Thread.new { load_all_lib_files }, + Thread.new { load_all_spec_files } + ].map(&:join).map(&:value) + end + + def have_successful_no_warnings_output + eq ["", "", 0] + end + + it "issues no warnings when loaded", :slow do + expect(lib_file_results).to have_successful_no_warnings_output + end + + it "issues no warnings when the spec files are loaded", :slow do + expect(spec_file_results).to have_successful_no_warnings_output + end + + it 'only loads a known set of stdlibs so gem authors are forced ' \ + 'to load libs they use to have passing specs', :slow do + loaded_features = @loaded_feature_lines.split("\n") + if RUBY_VERSION == '1.8.7' + # On 1.8.7, $" returns the relative require path if that was used + # to require the file. LIB_REGEX will not match the relative version + # since it has a `/lib` prefix. Here we deal with this by expanding + # relative files relative to the $LOAD_PATH dir (lib). + Dir.chdir("lib") { loaded_features.map! { |f| File.expand_path(f) } } + end + + loaded_features.reject! { |feature| RSpec::CallerFilter::LIB_REGEX =~ feature } + loaded_features.reject! { |feature| allowed_loaded_feature_regexps.any? { |r| r =~ feature } } + + expect(loaded_features).to eq([]) + end + + RSpec::Matchers.define :be_well_formed do + match do |actual| + actual.empty? + end + + failure_message do |actual| + actual.join("\n") + end + end + + it "has no malformed whitespace", :slow do + error_messages = [] + `git ls-files -z`.split("\x0").each do |filename| + error_messages << check_for_tab_characters(filename) + error_messages << check_for_extra_spaces(filename) + end + expect(error_messages.compact).to be_well_formed + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/rspec-support-3.11.0/lib/rspec/support/spec/shell_out.rb b/vendor/bundle/ruby/3.1.0/gems/rspec-support-3.11.0/lib/rspec/support/spec/shell_out.rb new file mode 100644 index 000000000..864e540b3 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/rspec-support-3.11.0/lib/rspec/support/spec/shell_out.rb @@ -0,0 +1,105 @@ +require 'open3' +require 'rake/file_utils' +require 'shellwords' + +module RSpec + module Support + module ShellOut + def with_env(vars) + original = ENV.to_hash + vars.each { |k, v| ENV[k] = v } + + begin + yield + ensure + ENV.replace(original) + end + end + + if Open3.respond_to?(:capture3) # 1.9+ + def shell_out(*command) + stdout, stderr, status = Open3.capture3(*command) + return stdout, filter(stderr), status + end + else # 1.8.7 + # popen3 doesn't provide the exit status so we fake it out. + FakeProcessStatus = Struct.new(:exitstatus) + + def shell_out(*command) + stdout = stderr = nil + + Open3.popen3(*command) do |_in, out, err| + stdout = out.read + stderr = err.read + end + + status = FakeProcessStatus.new(0) + return stdout, filter(stderr), status + end + end + + def run_ruby_with_current_load_path(ruby_command, *flags) + command = [ + FileUtils::RUBY, + "-I#{$LOAD_PATH.map(&:shellescape).join(File::PATH_SEPARATOR)}", + "-e", ruby_command, *flags + ] + + # Unset these env vars because `ruby -w` will issue warnings whenever + # they are set to non-default values. + with_env 'RUBY_GC_HEAP_FREE_SLOTS' => nil, 'RUBY_GC_MALLOC_LIMIT' => nil, + 'RUBY_FREE_MIN' => nil do + shell_out(*command) + end + end + + LINES_TO_IGNORE = + [ + # Ignore bundler warning. + %r{bundler/source/rubygems}, + # Ignore bundler + rubygems warning. + %r{site_ruby/\d\.\d\.\d/rubygems}, + %r{jruby-\d\.\d\.\d+\.\d/lib/ruby/stdlib/rubygems}, + # This is required for windows for some reason + %r{lib/bundler/rubygems}, + # This is a JRuby file that generates warnings on 9.0.3.0 + %r{lib/ruby/stdlib/jar}, + # This is a JRuby file that generates warnings on 9.1.7.0 + %r{org/jruby/RubyKernel\.java}, + # This is a JRuby gem that generates warnings on 9.1.7.0 + %r{ffi-1\.13\.\d+-java}, + %r{uninitialized constant FFI}, + # These are related to the above, there is a warning about io from FFI + %r{jruby-\d\.\d\.\d+\.\d/lib/ruby/stdlib/io}, + %r{io/console on JRuby shells out to stty for most operations}, + # This is a JRuby 9.1.17.0 error on Github Actions + %r{io/console not supported; tty will not be manipulated}, + # This is a JRuby 9.2.1.x error + %r{jruby/kernel/gem_prelude}, + %r{lib/jruby\.jar!/jruby/preludes}, + ] + + def strip_known_warnings(input) + input.split("\n").reject do |l| + LINES_TO_IGNORE.any? { |to_ignore| l =~ to_ignore } || + # Remove blank lines + l == "" || l.nil? + end.join("\n") + end + + private + + if Ruby.jruby? + def filter(output) + output.each_line.reject do |line| + line.include?("lib/ruby/shared/rubygems") + end.join($/) + end + else + def filter(output) + output + end + end + end + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/rspec-support-3.11.0/lib/rspec/support/spec/stderr_splitter.rb b/vendor/bundle/ruby/3.1.0/gems/rspec-support-3.11.0/lib/rspec/support/spec/stderr_splitter.rb new file mode 100644 index 000000000..03b50e939 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/rspec-support-3.11.0/lib/rspec/support/spec/stderr_splitter.rb @@ -0,0 +1,75 @@ +require 'stringio' + +module RSpec + module Support + class StdErrSplitter + def initialize(original) + @orig_stderr = original + @output_tracker = ::StringIO.new + @last_line = nil + end + + respond_to_name = (::RUBY_VERSION.to_f < 1.9) ? :respond_to? : :respond_to_missing? + define_method respond_to_name do |*args| + @orig_stderr.respond_to?(*args) || super(*args) + end + + def method_missing(name, *args, &block) + @output_tracker.__send__(name, *args, &block) if @output_tracker.respond_to?(name) + @orig_stderr.__send__(name, *args, &block) + end + + def ==(other) + @orig_stderr == other + end + + def reopen(*args) + reset! + @orig_stderr.reopen(*args) + end + + # To work around JRuby error: + # can't convert RSpec::Support::StdErrSplitter into String + def to_io + @orig_stderr.to_io + end + + # To work around JRuby error: + # TypeError: $stderr must have write method, RSpec::StdErrSplitter given + def write(line) + return if line =~ %r{^\S+/gems/\S+:\d+: warning:} # http://rubular.com/r/kqeUIZOfPG + + # Ruby 2.7.0 warnings from keyword argments span multiple lines, extend check above + # to look for the next line. + return if @last_line =~ %r{^\S+/gems/\S+:\d+: warning:} && + line =~ %r{warning: The called method .* is defined here} + + # Ruby 2.7.0 complains about hashes used in place of keyword arguments + # Aruba 0.14.2 uses this internally triggering that here + return if line =~ %r{lib/ruby/2\.7\.0/fileutils\.rb:622: warning:} + + @orig_stderr.write(line) + @output_tracker.write(line) + ensure + @last_line = line + end + + def has_output? + !output.empty? + end + + def reset! + @output_tracker = ::StringIO.new + end + + def verify_no_warnings! + raise "Warnings were generated: #{output}" if has_output? + reset! + end + + def output + @output_tracker.string + end + end + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/rspec-support-3.11.0/lib/rspec/support/spec/string_matcher.rb b/vendor/bundle/ruby/3.1.0/gems/rspec-support-3.11.0/lib/rspec/support/spec/string_matcher.rb new file mode 100644 index 000000000..7df319918 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/rspec-support-3.11.0/lib/rspec/support/spec/string_matcher.rb @@ -0,0 +1,45 @@ +require 'rspec/matchers' +# Special matcher for comparing encoded strings so that +# we don't run any expectation failures through the Differ, +# which also relies on EncodedString. Instead, confirm the +# strings have the same bytes. +RSpec::Matchers.define :be_identical_string do |expected| + if String.method_defined?(:encoding) + match do + expected_encoding? && + actual.bytes.to_a == expected.bytes.to_a + end + + failure_message do + "expected\n#{actual.inspect} (#{actual.encoding.name}) to be identical to\n"\ + "#{expected.inspect} (#{expected.encoding.name})\n"\ + "The exact bytes are printed below for more detail:\n"\ + "#{actual.bytes.to_a}\n"\ + "#{expected.bytes.to_a}\n"\ + end + + # Depends on chaining :with_same_encoding for it to + # check for string encoding. + def expected_encoding? + if defined?(@expect_same_encoding) && @expect_same_encoding + actual.encoding == expected.encoding + else + true + end + end + else + match do + actual.split(//) == expected.split(//) + end + + failure_message do + "expected\n#{actual.inspect} to be identical to\n#{expected.inspect}\n" + end + end + + chain :with_same_encoding do + @expect_same_encoding ||= true + end +end +RSpec::Matchers.alias_matcher :a_string_identical_to, :be_identical_string +RSpec::Matchers.alias_matcher :be_diffed_as, :be_identical_string diff --git a/vendor/bundle/ruby/3.1.0/gems/rspec-support-3.11.0/lib/rspec/support/spec/with_isolated_directory.rb b/vendor/bundle/ruby/3.1.0/gems/rspec-support-3.11.0/lib/rspec/support/spec/with_isolated_directory.rb new file mode 100644 index 000000000..6e38c82ea --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/rspec-support-3.11.0/lib/rspec/support/spec/with_isolated_directory.rb @@ -0,0 +1,13 @@ +require 'tmpdir' + +RSpec.shared_context "isolated directory" do + around do |ex| + Dir.mktmpdir do |tmp_dir| + Dir.chdir(tmp_dir, &ex) + end + end +end + +RSpec.configure do |c| + c.include_context "isolated directory", :isolated_directory => true +end diff --git a/vendor/bundle/ruby/3.1.0/gems/rspec-support-3.11.0/lib/rspec/support/spec/with_isolated_stderr.rb b/vendor/bundle/ruby/3.1.0/gems/rspec-support-3.11.0/lib/rspec/support/spec/with_isolated_stderr.rb new file mode 100644 index 000000000..8884c2fbe --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/rspec-support-3.11.0/lib/rspec/support/spec/with_isolated_stderr.rb @@ -0,0 +1,13 @@ +module RSpec + module Support + module WithIsolatedStdErr + def with_isolated_stderr + original = $stderr + $stderr = StringIO.new + yield + ensure + $stderr = original + end + end + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/rspec-support-3.11.0/lib/rspec/support/version.rb b/vendor/bundle/ruby/3.1.0/gems/rspec-support-3.11.0/lib/rspec/support/version.rb new file mode 100644 index 000000000..32c3242dc --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/rspec-support-3.11.0/lib/rspec/support/version.rb @@ -0,0 +1,7 @@ +module RSpec + module Support + module Version + STRING = '3.11.0' + end + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/rspec-support-3.11.0/lib/rspec/support/warnings.rb b/vendor/bundle/ruby/3.1.0/gems/rspec-support-3.11.0/lib/rspec/support/warnings.rb new file mode 100644 index 000000000..380150be9 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/rspec-support-3.11.0/lib/rspec/support/warnings.rb @@ -0,0 +1,39 @@ +require 'rspec/support' +RSpec::Support.require_rspec_support "caller_filter" + +module RSpec + module Support + module Warnings + def deprecate(deprecated, options={}) + warn_with "DEPRECATION: #{deprecated} is deprecated.", options + end + + # @private + # + # Used internally to print deprecation warnings + # when rspec-core isn't loaded + def warn_deprecation(message, options={}) + warn_with "DEPRECATION: \n #{message}", options + end + + # @private + # + # Used internally to print warnings + def warning(text, options={}) + warn_with "WARNING: #{text}.", options + end + + # @private + # + # Used internally to print longer warnings + def warn_with(message, options={}) + call_site = options.fetch(:call_site) { CallerFilter.first_non_rspec_line } + message += " Use #{options[:replacement]} instead." if options[:replacement] + message += " Called from #{call_site}." if call_site + Support.warning_notifier.call message + end + end + end + + extend RSpec::Support::Warnings +end diff --git a/vendor/bundle/ruby/3.1.0/gems/rspec-support-3.11.0/lib/rspec/support/with_keywords_when_needed.rb b/vendor/bundle/ruby/3.1.0/gems/rspec-support-3.11.0/lib/rspec/support/with_keywords_when_needed.rb new file mode 100644 index 000000000..56b67e70b --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/rspec-support-3.11.0/lib/rspec/support/with_keywords_when_needed.rb @@ -0,0 +1,33 @@ +RSpec::Support.require_rspec_support("method_signature_verifier") + +module RSpec + module Support + module WithKeywordsWhenNeeded + # This module adds keyword sensitive support for core ruby methods + # where we cannot use `ruby2_keywords` directly. + + module_function + + if RSpec::Support::RubyFeatures.kw_args_supported? + # Remove this in RSpec 4 in favour of explictly passed in kwargs where + # this is used. Works around a warning in Ruby 2.7 + + def class_exec(klass, *args, &block) + if MethodSignature.new(block).has_kw_args_in?(args) + binding.eval(<<-CODE, __FILE__, __LINE__) + kwargs = args.pop + klass.class_exec(*args, **kwargs, &block) + CODE + else + klass.class_exec(*args, &block) + end + end + ruby2_keywords :class_exec if respond_to?(:ruby2_keywords, true) + else + def class_exec(klass, *args, &block) + klass.class_exec(*args, &block) + end + end + end + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/rubocop-1.28.2/LICENSE.txt b/vendor/bundle/ruby/3.1.0/gems/rubocop-1.28.2/LICENSE.txt new file mode 100644 index 000000000..72cfaf902 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/rubocop-1.28.2/LICENSE.txt @@ -0,0 +1,20 @@ +Copyright (c) 2012-22 Bozhidar Batsov + +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/vendor/bundle/ruby/3.1.0/gems/rubocop-1.28.2/README.md b/vendor/bundle/ruby/3.1.0/gems/rubocop-1.28.2/README.md new file mode 100644 index 000000000..a5349235e --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/rubocop-1.28.2/README.md @@ -0,0 +1,248 @@ +

+ RuboCop Logo +

+ +---------- +[![Ruby Style Guide](https://img.shields.io/badge/code_style-rubocop-brightgreen.svg)](https://github.com/rubocop/rubocop) +[![Gem Version](https://badge.fury.io/rb/rubocop.svg)](https://badge.fury.io/rb/rubocop) +[![CircleCI Status](https://circleci.com/gh/rubocop/rubocop/tree/master.svg?style=svg)](https://circleci.com/gh/rubocop/rubocop/tree/master) +[![Actions Status](https://github.com/rubocop/rubocop/workflows/CI/badge.svg?branch=master)](https://github.com/rubocop/rubocop/actions?query=workflow%3ACI) +[![Test Coverage](https://api.codeclimate.com/v1/badges/d2d67f728e88ea84ac69/test_coverage)](https://codeclimate.com/github/rubocop/rubocop/test_coverage) +[![Maintainability](https://api.codeclimate.com/v1/badges/d2d67f728e88ea84ac69/maintainability)](https://codeclimate.com/github/rubocop/rubocop/maintainability) +[![Discord](https://img.shields.io/badge/chat-on%20discord-7289da.svg?sanitize=true)](https://discord.gg/wJjWvGRDmm) + +> Role models are important.
+> -- Officer Alex J. Murphy / RoboCop + +**RuboCop** is a Ruby static code analyzer (a.k.a. `linter`) and code formatter. Out of the box it +will enforce many of the guidelines outlined in the community [Ruby Style +Guide](https://rubystyle.guide). Apart from reporting the problems discovered in your code, +RuboCop can also automatically fix many of them for you. + +RuboCop is extremely flexible and most aspects of its behavior can be tweaked via various +[configuration options](https://github.com/rubocop/rubocop/blob/master/config/default.yml). + +---------- +[![Patreon](https://img.shields.io/badge/patreon-donate-orange.svg)](https://www.patreon.com/bbatsov) +[![OpenCollective](https://opencollective.com/rubocop/backers/badge.svg)](#open-collective-backers) +[![OpenCollective](https://opencollective.com/rubocop/sponsors/badge.svg)](#open-collective-sponsors) +[![Tidelift](https://tidelift.com/badges/package/rubygems/rubocop)](https://tidelift.com/subscription/pkg/rubygems-rubocop?utm_source=rubygems-rubocop&utm_medium=referral&utm_campaign=readme) + +Working on RuboCop is often fun, but it also requires a great deal of time and energy. + +**Please consider [financially supporting its ongoing development](#funding).** + +## Installation + +**RuboCop**'s installation is pretty standard: + +```sh +$ gem install rubocop +``` + +If you'd rather install RuboCop using `bundler`, add a line for it in your `Gemfile` (but set the `require` option to `false`, as it is a standalone tool): + +```rb +gem 'rubocop', require: false +``` + +RuboCop is stable between major versions, both in terms of API and cop configuration. +We aim to ease the maintenance of RuboCop extensions and the upgrades between RuboCop +releases. All big changes are reserved for major releases. +To prevent an unwanted RuboCop update you might want to use a conservative version lock +in your `Gemfile`: + +```rb +gem 'rubocop', '~> 1.28', require: false +``` + +See [our versioning policy](https://docs.rubocop.org/rubocop/versioning.html) for further details. + +## Quickstart + +Just type `rubocop` in a Ruby project's folder and watch the magic happen. + +``` +$ cd my/cool/ruby/project +$ rubocop +``` + +## Documentation + +You can read a lot more about RuboCop in its [official docs](https://docs.rubocop.org). + +## Compatibility + +RuboCop officially supports the following Ruby implementations: + +* MRI 2.5+ +* JRuby 9.2+ + +See the [compatibility documentation](https://docs.rubocop.org/rubocop/compatibility.html) for further details. + +## Readme Badge + +If you use RuboCop in your project, you can include one of these badges in your readme to let people know that your code is written following the community Ruby Style Guide. + +[![Ruby Style Guide](https://img.shields.io/badge/code_style-rubocop-brightgreen.svg)](https://github.com/rubocop/rubocop) + +[![Ruby Style Guide](https://img.shields.io/badge/code_style-community-brightgreen.svg)](https://rubystyle.guide) + + +Here are the Markdown snippets for the two badges: + +``` markdown +[![Ruby Style Guide](https://img.shields.io/badge/code_style-rubocop-brightgreen.svg)](https://github.com/rubocop/rubocop) + +[![Ruby Style Guide](https://img.shields.io/badge/code_style-community-brightgreen.svg)](https://rubystyle.guide) +``` + +## Team + +Here's a list of RuboCop's core developers: + +* [Bozhidar Batsov](https://github.com/bbatsov) (author & head maintainer) +* [Jonas Arvidsson](https://github.com/jonas054) +* [Yuji Nakayama](https://github.com/yujinakayama) (retired) +* [Evgeni Dzhelyov](https://github.com/edzhelyov) (retired) +* [Ted Johansson](https://github.com/drenmi) +* [Masataka Kuwabara](https://github.com/pocke) +* [Koichi Ito](https://github.com/koic) +* [Maxim Krizhanovski](https://github.com/darhazer) +* [Benjamin Quorning](https://github.com/bquorning) +* [Marc-André Lafortune](https://github.com/marcandre) +* [Daniel Vandersluis](https://github.com/dvandersluis) + +See the [team page](https://docs.rubocop.org/rubocop/about/team.html) for more details. + +## Logo + +RuboCop's logo was created by [Dimiter Petrov](https://www.chadomoto.com/). You can find the logo in various +formats [here](https://github.com/rubocop/rubocop/tree/master/logo). + +The logo is licensed under a +[Creative Commons Attribution-NonCommercial 4.0 International License](https://creativecommons.org/licenses/by-nc/4.0/deed.en_GB). + +## Contributors + +Here's a [list](https://github.com/rubocop/rubocop/graphs/contributors) of +all the people who have contributed to the development of RuboCop. + +I'm extremely grateful to each and every one of them! + +If you'd like to contribute to RuboCop, please take the time to go +through our short +[contribution guidelines](CONTRIBUTING.md). + +Converting more of the Ruby Style Guide into RuboCop cops is our top +priority right now. Writing a new cop is a great way to dive into RuboCop! + +Of course, bug reports and suggestions for improvements are always +welcome. GitHub pull requests are even better! :-) + +## Funding + +While RuboCop is free software and will always be, the project would benefit immensely from some funding. +Raising a monthly budget of a couple of thousand dollars would make it possible to pay people to work on +certain complex features, fund other development related stuff (e.g. hardware, conference trips) and so on. +Raising a monthly budget of over $5000 would open the possibility of someone working full-time on the project +which would speed up the pace of development significantly. + +We welcome both individual and corporate sponsors! We also offer a +wide array of funding channels to account for your preferences +(although +currently [Open Collective](https://opencollective.com/rubocop) is our +preferred funding platform). + +**If you're working in a company that's making significant use of RuboCop we'd appreciate it if you suggest to your company +to become a RuboCop sponsor.** + +You can support the development of RuboCop via +[GitHub Sponsors](https://github.com/sponsors/bbatsov), +[Patreon](https://www.patreon.com/bbatsov), +[PayPal](https://paypal.me/bbatsov), +[Open Collective](https://opencollective.com/rubocop) +and [Tidelift](https://tidelift.com/subscription/pkg/rubygems-rubocop?utm_source=rubygems-rubocop&utm_medium=referral&utm_campaign=readme) +. + +**Note:** If doing a sponsorship in the form of donation is problematic for your company from an accounting standpoint, we'd recommend +the use of Tidelift, where you can get a support-like subscription instead. + +### Open Collective Backers + +Support us with a monthly donation and help us continue our activities. [[Become a backer](https://opencollective.com/rubocop#backer)] + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +### Open Collective Sponsors + +Become a sponsor and get your logo on our README on GitHub with a link to your site. [[Become a sponsor](https://opencollective.com/rubocop#sponsor)] + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +## Changelog + +RuboCop's changelog is available [here](CHANGELOG.md). + +## Copyright + +Copyright (c) 2012-2022 Bozhidar Batsov. See [LICENSE.txt](LICENSE.txt) for +further details. diff --git a/vendor/bundle/ruby/3.1.0/gems/rubocop-1.28.2/assets/logo.png b/vendor/bundle/ruby/3.1.0/gems/rubocop-1.28.2/assets/logo.png new file mode 100644 index 000000000..c091ad7f4 Binary files /dev/null and b/vendor/bundle/ruby/3.1.0/gems/rubocop-1.28.2/assets/logo.png differ diff --git a/vendor/bundle/ruby/3.1.0/gems/rubocop-1.28.2/assets/output.html.erb b/vendor/bundle/ruby/3.1.0/gems/rubocop-1.28.2/assets/output.html.erb new file mode 100644 index 000000000..acd3d3202 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/rubocop-1.28.2/assets/output.html.erb @@ -0,0 +1,261 @@ + + + + + RuboCop Inspection Report + <%# TODO: Clean up the messy markup and style definitions. %> + + + + + + +
+
+
+ <%= pluralize(files.count, 'file') %> inspected, + <%= pluralize(summary.offense_count, 'offense', no_for_zero: true) %> detected: +
+ +
+
+
+ <% files.each do |file| %> + <% if file.offenses.any? %> +
+

 

+

<%= relative_path(file.path) %> - <%= pluralize(file.offenses.count, 'offense') %>

+
+ <% file.offenses.each do |offense| %> +
+
+ Line #<%= offense.location.line %> – + <%= offense.severity %>: + <%= decorated_message(offense) %> +
+ <% unless offense.location.source_line.strip.empty? %> +
<%= highlighted_source_line(offense) %>
+ <% end %> +
+ <% end %> +
+
+ <% end %> + <% end %> +
+
+ Generated by RuboCop + <%= RuboCop::Version::STRING %> +
+ + diff --git a/vendor/bundle/ruby/3.1.0/gems/rubocop-1.28.2/config/default.yml b/vendor/bundle/ruby/3.1.0/gems/rubocop-1.28.2/config/default.yml new file mode 100644 index 000000000..f93a0471e --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/rubocop-1.28.2/config/default.yml @@ -0,0 +1,5196 @@ +# Common configuration. + +AllCops: + RubyInterpreters: + - ruby + - macruby + - rake + - jruby + - rbx + # Include common Ruby source files. + Include: + - '**/*.rb' + - '**/*.arb' + - '**/*.axlsx' + - '**/*.builder' + - '**/*.fcgi' + - '**/*.gemfile' + - '**/*.gemspec' + - '**/*.god' + - '**/*.jb' + - '**/*.jbuilder' + - '**/*.mspec' + - '**/*.opal' + - '**/*.pluginspec' + - '**/*.podspec' + - '**/*.rabl' + - '**/*.rake' + - '**/*.rbuild' + - '**/*.rbw' + - '**/*.rbx' + - '**/*.ru' + - '**/*.ruby' + - '**/*.spec' + - '**/*.thor' + - '**/*.watchr' + - '**/.irbrc' + - '**/.pryrc' + - '**/.simplecov' + - '**/buildfile' + - '**/Appraisals' + - '**/Berksfile' + - '**/Brewfile' + - '**/Buildfile' + - '**/Capfile' + - '**/Cheffile' + - '**/Dangerfile' + - '**/Deliverfile' + - '**/Fastfile' + - '**/*Fastfile' + - '**/Gemfile' + - '**/Guardfile' + - '**/Jarfile' + - '**/Mavenfile' + - '**/Podfile' + - '**/Puppetfile' + - '**/Rakefile' + - '**/rakefile' + - '**/Snapfile' + - '**/Steepfile' + - '**/Thorfile' + - '**/Vagabondfile' + - '**/Vagrantfile' + Exclude: + - 'node_modules/**/*' + - 'tmp/**/*' + - 'vendor/**/*' + - '.git/**/*' + # Default formatter will be used if no `-f/--format` option is given. + DefaultFormatter: progress + # Cop names are displayed in offense messages by default. Change behavior + # by overriding DisplayCopNames, or by giving the `--no-display-cop-names` + # option. + DisplayCopNames: true + # Style guide URLs are not displayed in offense messages by default. Change + # behavior by overriding `DisplayStyleGuide`, or by giving the + # `-S/--display-style-guide` option. + DisplayStyleGuide: false + # When specifying style guide URLs, any paths and/or fragments will be + # evaluated relative to the base URL. + StyleGuideBaseURL: https://rubystyle.guide + # Documentation URLs will be constructed using the base URL. + DocumentationBaseURL: https://docs.rubocop.org/rubocop + # Extra details are not displayed in offense messages by default. Change + # behavior by overriding ExtraDetails, or by giving the + # `-E/--extra-details` option. + ExtraDetails: false + # Additional cops that do not reference a style guide rule may be enabled by + # default. Change behavior by overriding `StyleGuideCopsOnly`, or by giving + # the `--only-guide-cops` option. + StyleGuideCopsOnly: false + # All cops except the ones configured `Enabled: false` in this file are enabled by default. + # Change this behavior by overriding either `DisabledByDefault` or `EnabledByDefault`. + # When `DisabledByDefault` is `true`, all cops in the default configuration + # are disabled, and only cops in user configuration are enabled. This makes + # cops opt-in instead of opt-out. Note that when `DisabledByDefault` is `true`, + # cops in user configuration will be enabled even if they don't set the + # Enabled parameter. + # When `EnabledByDefault` is `true`, all cops, even those configured `Enabled: false` + # in this file are enabled by default. Cops can still be disabled in user configuration. + # Note that it is invalid to set both EnabledByDefault and DisabledByDefault + # to true in the same configuration. + EnabledByDefault: false + DisabledByDefault: false + # New cops introduced between major versions are set to a special pending status + # and are not enabled by default with warning message. + # Change this behavior by overriding either `NewCops: enable` or `NewCops: disable`. + # When `NewCops` is `enable`, pending cops are enabled in bulk. Can be overridden by + # the `--enable-pending-cops` command-line option. + # When `NewCops` is `disable`, pending cops are disabled in bulk. Can be overridden by + # the `--disable-pending-cops` command-line option. + NewCops: pending + # Enables the result cache if `true`. Can be overridden by the `--cache` command + # line option. + UseCache: true + # Threshold for how many files can be stored in the result cache before some + # of the files are automatically removed. + MaxFilesInCache: 20000 + # The cache will be stored in "rubocop_cache" under this directory. If + # CacheRootDirectory is ~ (nil), which it is by default, the root will be + # taken from the environment variable `$XDG_CACHE_HOME` if it is set, or if + # `$XDG_CACHE_HOME` is not set, it will be `$HOME/.cache/`. + # The CacheRootDirectory can be overwritten by passing the `--cache-root` command + # line option or by setting `$RUBOCOP_CACHE_ROOT` environment variable. + CacheRootDirectory: ~ + # It is possible for a malicious user to know the location of RuboCop's cache + # directory by looking at CacheRootDirectory, and create a symlink in its + # place that could cause RuboCop to overwrite unintended files, or read + # malicious input. If you are certain that your cache location is secure from + # this kind of attack, and wish to use a symlinked cache location, set this + # value to "true". + AllowSymlinksInCacheRootDirectory: false + # What MRI version of the Ruby interpreter is the inspected code intended to + # run on? (If there is more than one, set this to the lowest version.) + # If a value is specified for TargetRubyVersion then it is used. Acceptable + # values are specified as a float (i.e. 3.0); the teeny version of Ruby + # should not be included. If the project specifies a Ruby version in the + # .tool-versions or .ruby-version files, Gemfile or gems.rb file, RuboCop will + # try to determine the desired version of Ruby by inspecting the + # .tool-versions file first, then .ruby-version, followed by the Gemfile.lock + # or gems.locked file. (Although the Ruby version is specified in the Gemfile + # or gems.rb file, RuboCop reads the final value from the lock file.) If the + # Ruby version is still unresolved, RuboCop will use the oldest officially + # supported Ruby version (currently Ruby 2.5). + TargetRubyVersion: ~ + # Determines if a notification for extension libraries should be shown when + # rubocop is run. Keys are the name of the extension, and values are an array + # of gems in the Gemfile that the extension is suggested for, if not already + # included. + SuggestExtensions: + rubocop-rails: [rails] + rubocop-rspec: [rspec, rspec-rails] + rubocop-minitest: [minitest] + rubocop-sequel: [sequel] + rubocop-rake: [rake] + rubocop-graphql: [graphql] + +#################### Bundler ############################### + +Bundler/DuplicatedGem: + Description: 'Checks for duplicate gem entries in Gemfile.' + Enabled: true + VersionAdded: '0.46' + Include: + - '**/*.gemfile' + - '**/Gemfile' + - '**/gems.rb' + +Bundler/GemComment: + Description: 'Add a comment describing each gem.' + Enabled: false + VersionAdded: '0.59' + VersionChanged: '0.85' + Include: + - '**/*.gemfile' + - '**/Gemfile' + - '**/gems.rb' + IgnoredGems: [] + OnlyFor: [] + +Bundler/GemFilename: + Description: 'Enforces the filename for managing gems.' + Enabled: true + VersionAdded: '1.20' + EnforcedStyle: 'Gemfile' + SupportedStyles: + - 'Gemfile' + - 'gems.rb' + Include: + - '**/Gemfile' + - '**/gems.rb' + - '**/Gemfile.lock' + - '**/gems.locked' + +Bundler/GemVersion: + Description: 'Requires or forbids specifying gem versions.' + Enabled: false + VersionAdded: '1.14' + EnforcedStyle: 'required' + SupportedStyles: + - 'required' + - 'forbidden' + Include: + - '**/*.gemfile' + - '**/Gemfile' + - '**/gems.rb' + AllowedGems: [] + +Bundler/InsecureProtocolSource: + Description: >- + The source `:gemcutter`, `:rubygems` and `:rubyforge` are deprecated + because HTTP requests are insecure. Please change your source to + 'https://rubygems.org' if possible, or 'http://rubygems.org' if not. + Enabled: true + VersionAdded: '0.50' + AllowHttpProtocol: true + Include: + - '**/*.gemfile' + - '**/Gemfile' + - '**/gems.rb' + +Bundler/OrderedGems: + Description: >- + Gems within groups in the Gemfile should be alphabetically sorted. + Enabled: true + VersionAdded: '0.46' + VersionChanged: '0.47' + TreatCommentsAsGroupSeparators: true + # By default, "-" and "_" are ignored for order purposes. + # This can be overridden by setting this parameter to true. + ConsiderPunctuation: false + Include: + - '**/*.gemfile' + - '**/Gemfile' + - '**/gems.rb' + +#################### Gemspec ############################### + +Gemspec/DateAssignment: + Description: 'Checks that `date =` is not used in gemspec file, it is set automatically when the gem is packaged.' + Enabled: pending + VersionAdded: '1.10' + Include: + - '**/*.gemspec' + +Gemspec/DuplicatedAssignment: + Description: 'An attribute assignment method calls should be listed only once in a gemspec.' + Enabled: true + VersionAdded: '0.52' + Include: + - '**/*.gemspec' + +Gemspec/OrderedDependencies: + Description: >- + Dependencies in the gemspec should be alphabetically sorted. + Enabled: true + VersionAdded: '0.51' + TreatCommentsAsGroupSeparators: true + # By default, "-" and "_" are ignored for order purposes. + # This can be overridden by setting this parameter to true. + ConsiderPunctuation: false + Include: + - '**/*.gemspec' + +Gemspec/RequireMFA: + Description: 'Checks that the gemspec has metadata to require Multi-Factor Authentication from RubyGems.' + Enabled: pending + VersionAdded: '1.23' + Reference: + - https://guides.rubygems.org/mfa-requirement-opt-in/ + Include: + - '**/*.gemspec' + +Gemspec/RequiredRubyVersion: + Description: 'Checks that `required_ruby_version` of gemspec is specified and equal to `TargetRubyVersion` of .rubocop.yml.' + Enabled: true + VersionAdded: '0.52' + VersionChanged: '1.22' + Include: + - '**/*.gemspec' + +Gemspec/RubyVersionGlobalsUsage: + Description: Checks usage of RUBY_VERSION in gemspec. + StyleGuide: '#no-ruby-version-in-the-gemspec' + Enabled: true + VersionAdded: '0.72' + Include: + - '**/*.gemspec' + +#################### Layout ########################### + +Layout/AccessModifierIndentation: + Description: Check indentation of private/protected visibility modifiers. + StyleGuide: '#indent-public-private-protected' + Enabled: true + VersionAdded: '0.49' + EnforcedStyle: indent + SupportedStyles: + - outdent + - indent + # By default the indentation width from `Layout/IndentationWidth` is used, + # but it can be overridden by setting this parameter. + IndentationWidth: ~ + +Layout/ArgumentAlignment: + Description: >- + Align the arguments of a method call if they span more + than one line. + StyleGuide: '#no-double-indent' + Enabled: true + VersionAdded: '0.68' + VersionChanged: '0.77' + # Alignment of arguments in multi-line method calls. + # + # The `with_first_argument` style aligns the following lines along the same + # column as the first parameter. + # + # method_call(a, + # b) + # + # The `with_fixed_indentation` style aligns the following lines with one + # level of indentation relative to the start of the line with the method call. + # + # method_call(a, + # b) + EnforcedStyle: with_first_argument + SupportedStyles: + - with_first_argument + - with_fixed_indentation + # By default the indentation width from `Layout/IndentationWidth` is used, + # but it can be overridden by setting this parameter. + IndentationWidth: ~ + +Layout/ArrayAlignment: + Description: >- + Align the elements of an array literal if they span more than + one line. + StyleGuide: '#no-double-indent' + Enabled: true + VersionAdded: '0.49' + VersionChanged: '0.77' + # Alignment of elements of a multi-line array. + # + # The `with_first_parameter` style aligns the following lines along the same + # column as the first element. + # + # array = [1, 2, 3, + # 4, 5, 6] + # + # The `with_fixed_indentation` style aligns the following lines with one + # level of indentation relative to the start of the line with start of array. + # + # array = [1, 2, 3, + # 4, 5, 6] + EnforcedStyle: with_first_element + SupportedStyles: + - with_first_element + - with_fixed_indentation + # By default the indentation width from `Layout/IndentationWidth` is used, + # but it can be overridden by setting this parameter. + IndentationWidth: ~ + +Layout/AssignmentIndentation: + Description: >- + Checks the indentation of the first line of the + right-hand-side of a multi-line assignment. + Enabled: true + VersionAdded: '0.49' + VersionChanged: '0.77' + # By default the indentation width from `Layout/IndentationWidth` is used, + # but it can be overridden by setting this parameter. + IndentationWidth: ~ + +Layout/BeginEndAlignment: + Description: 'Align ends corresponding to begins correctly.' + Enabled: true + VersionAdded: '0.91' + # The value `start_of_line` means that `end` should be aligned the start of the line + # where the `begin` keyword is. + # The value `begin` means that `end` should be aligned with the `begin` keyword. + EnforcedStyleAlignWith: start_of_line + SupportedStylesAlignWith: + - start_of_line + - begin + Severity: warning + +Layout/BlockAlignment: + Description: 'Align block ends correctly.' + Enabled: true + VersionAdded: '0.53' + # The value `start_of_block` means that the `end` should be aligned with line + # where the `do` keyword appears. + # The value `start_of_line` means it should be aligned with the whole + # expression's starting line. + # The value `either` means both are allowed. + EnforcedStyleAlignWith: either + SupportedStylesAlignWith: + - either + - start_of_block + - start_of_line + +Layout/BlockEndNewline: + Description: 'Put end statement of multiline block on its own line.' + Enabled: true + VersionAdded: '0.49' + +Layout/CaseIndentation: + Description: 'Indentation of when in a case/(when|in)/[else/]end.' + StyleGuide: '#indent-when-to-case' + Enabled: true + VersionAdded: '0.49' + VersionChanged: '1.16' + EnforcedStyle: case + SupportedStyles: + - case + - end + IndentOneStep: false + # By default the indentation width from `Layout/IndentationWidth` is used, + # but it can be overridden by setting this parameter. + # This only matters if `IndentOneStep` is `true`. + IndentationWidth: ~ + +Layout/ClassStructure: + Description: 'Enforces a configured order of definitions within a class body.' + StyleGuide: '#consistent-classes' + Enabled: false + VersionAdded: '0.52' + Categories: + module_inclusion: + - include + - prepend + - extend + ExpectedOrder: + - module_inclusion + - constants + - public_class_methods + - initializer + - public_methods + - protected_methods + - private_methods + +Layout/ClosingHeredocIndentation: + Description: 'Checks the indentation of here document closings.' + Enabled: true + VersionAdded: '0.57' + +Layout/ClosingParenthesisIndentation: + Description: 'Checks the indentation of hanging closing parentheses.' + Enabled: true + VersionAdded: '0.49' + +Layout/CommentIndentation: + Description: 'Indentation of comments.' + Enabled: true + # When true, allows comments to have extra indentation if that aligns them + # with a comment on the preceding line. + AllowForAlignment: false + VersionAdded: '0.49' + VersionChanged: '1.24' + +Layout/ConditionPosition: + Description: >- + Checks for condition placed in a confusing position relative to + the keyword. + StyleGuide: '#same-line-condition' + Enabled: true + VersionAdded: '0.53' + VersionChanged: '0.83' + +Layout/DefEndAlignment: + Description: 'Align ends corresponding to defs correctly.' + Enabled: true + VersionAdded: '0.53' + # The value `def` means that `end` should be aligned with the def keyword. + # The value `start_of_line` means that `end` should be aligned with method + # calls like `private`, `public`, etc, if present in front of the `def` + # keyword on the same line. + EnforcedStyleAlignWith: start_of_line + SupportedStylesAlignWith: + - start_of_line + - def + Severity: warning + +Layout/DotPosition: + Description: 'Checks the position of the dot in multi-line method calls.' + StyleGuide: '#consistent-multi-line-chains' + Enabled: true + VersionAdded: '0.49' + EnforcedStyle: leading + SupportedStyles: + - leading + - trailing + +Layout/ElseAlignment: + Description: 'Align elses and elsifs correctly.' + Enabled: true + VersionAdded: '0.49' + +Layout/EmptyComment: + Description: 'Checks empty comment.' + Enabled: true + VersionAdded: '0.53' + AllowBorderComment: true + AllowMarginComment: true + +Layout/EmptyLineAfterGuardClause: + Description: 'Add empty line after guard clause.' + Enabled: true + VersionAdded: '0.56' + VersionChanged: '0.59' + +Layout/EmptyLineAfterMagicComment: + Description: 'Add an empty line after magic comments to separate them from code.' + StyleGuide: '#separate-magic-comments-from-code' + Enabled: true + VersionAdded: '0.49' + +Layout/EmptyLineAfterMultilineCondition: + Description: 'Enforces empty line after multiline condition.' + # This is disabled, because this style is not very common in practice. + Enabled: false + VersionAdded: '0.90' + Reference: + - https://github.com/airbnb/ruby#multiline-if-newline + +Layout/EmptyLineBetweenDefs: + Description: 'Use empty lines between class/module/method defs.' + StyleGuide: '#empty-lines-between-methods' + Enabled: true + VersionAdded: '0.49' + VersionChanged: '1.23' + EmptyLineBetweenMethodDefs: true + EmptyLineBetweenClassDefs: true + EmptyLineBetweenModuleDefs: true + # `AllowAdjacentOneLineDefs` means that single line method definitions don't + # need an empty line between them. `true` by default. + AllowAdjacentOneLineDefs: true + # Can be array to specify minimum and maximum number of empty lines, e.g. [1, 2] + NumberOfEmptyLines: 1 + +Layout/EmptyLines: + Description: "Don't use several empty lines in a row." + StyleGuide: '#two-or-more-empty-lines' + Enabled: true + VersionAdded: '0.49' + +Layout/EmptyLinesAroundAccessModifier: + Description: "Keep blank lines around access modifiers." + StyleGuide: '#empty-lines-around-access-modifier' + Enabled: true + VersionAdded: '0.49' + EnforcedStyle: around + SupportedStyles: + - around + - only_before + Reference: + # A reference to `EnforcedStyle: only_before`. + - https://edgeguides.rubyonrails.org/contributing_to_ruby_on_rails.html#follow-the-coding-conventions + +Layout/EmptyLinesAroundArguments: + Description: "Keeps track of empty lines around method arguments." + Enabled: true + VersionAdded: '0.52' + +Layout/EmptyLinesAroundAttributeAccessor: + Description: "Keep blank lines around attribute accessors." + StyleGuide: '#empty-lines-around-attribute-accessor' + Enabled: true + VersionAdded: '0.83' + VersionChanged: '0.84' + AllowAliasSyntax: true + AllowedMethods: + - alias_method + - public + - protected + - private + +Layout/EmptyLinesAroundBeginBody: + Description: "Keeps track of empty lines around begin-end bodies." + StyleGuide: '#empty-lines-around-bodies' + Enabled: true + VersionAdded: '0.49' + +Layout/EmptyLinesAroundBlockBody: + Description: "Keeps track of empty lines around block bodies." + StyleGuide: '#empty-lines-around-bodies' + Enabled: true + VersionAdded: '0.49' + EnforcedStyle: no_empty_lines + SupportedStyles: + - empty_lines + - no_empty_lines + +Layout/EmptyLinesAroundClassBody: + Description: "Keeps track of empty lines around class bodies." + StyleGuide: '#empty-lines-around-bodies' + Enabled: true + VersionAdded: '0.49' + VersionChanged: '0.53' + EnforcedStyle: no_empty_lines + SupportedStyles: + - empty_lines + - empty_lines_except_namespace + - empty_lines_special + - no_empty_lines + - beginning_only + - ending_only + +Layout/EmptyLinesAroundExceptionHandlingKeywords: + Description: "Keeps track of empty lines around exception handling keywords." + StyleGuide: '#empty-lines-around-bodies' + Enabled: true + VersionAdded: '0.49' + +Layout/EmptyLinesAroundMethodBody: + Description: "Keeps track of empty lines around method bodies." + StyleGuide: '#empty-lines-around-bodies' + Enabled: true + VersionAdded: '0.49' + +Layout/EmptyLinesAroundModuleBody: + Description: "Keeps track of empty lines around module bodies." + StyleGuide: '#empty-lines-around-bodies' + Enabled: true + VersionAdded: '0.49' + EnforcedStyle: no_empty_lines + SupportedStyles: + - empty_lines + - empty_lines_except_namespace + - empty_lines_special + - no_empty_lines + +Layout/EndAlignment: + Description: 'Align ends correctly.' + Enabled: true + VersionAdded: '0.53' + # The value `keyword` means that `end` should be aligned with the matching + # keyword (`if`, `while`, etc.). + # The value `variable` means that in assignments, `end` should be aligned + # with the start of the variable on the left hand side of `=`. In all other + # situations, `end` should still be aligned with the keyword. + # The value `start_of_line` means that `end` should be aligned with the start + # of the line which the matching keyword appears on. + EnforcedStyleAlignWith: keyword + SupportedStylesAlignWith: + - keyword + - variable + - start_of_line + Severity: warning + +Layout/EndOfLine: + Description: 'Use Unix-style line endings.' + StyleGuide: '#crlf' + Enabled: true + VersionAdded: '0.49' + # The `native` style means that CR+LF (Carriage Return + Line Feed) is + # enforced on Windows, and LF is enforced on other platforms. The other styles + # mean LF and CR+LF, respectively. + EnforcedStyle: native + SupportedStyles: + - native + - lf + - crlf + +Layout/ExtraSpacing: + Description: 'Do not use unnecessary spacing.' + Enabled: true + VersionAdded: '0.49' + # When true, allows most uses of extra spacing if the intent is to align + # things with the previous or next line, not counting empty lines or comment + # lines. + AllowForAlignment: true + # When true, allows things like 'obj.meth(arg) # comment', + # rather than insisting on 'obj.meth(arg) # comment'. + # If done for alignment, either this OR AllowForAlignment will allow it. + AllowBeforeTrailingComments: false + # When true, forces the alignment of `=` in assignments on consecutive lines. + ForceEqualSignAlignment: false + +Layout/FirstArgumentIndentation: + Description: 'Checks the indentation of the first argument in a method call.' + Enabled: true + VersionAdded: '0.68' + VersionChanged: '0.77' + EnforcedStyle: special_for_inner_method_call_in_parentheses + SupportedStyles: + # The first parameter should always be indented one step more than the + # preceding line. + - consistent + # The first parameter should always be indented one level relative to the + # parent that is receiving the parameter + - consistent_relative_to_receiver + # The first parameter should normally be indented one step more than the + # preceding line, but if it's a parameter for a method call that is itself + # a parameter in a method call, then the inner parameter should be indented + # relative to the inner method. + - special_for_inner_method_call + # Same as `special_for_inner_method_call` except that the special rule only + # applies if the outer method call encloses its arguments in parentheses. + - special_for_inner_method_call_in_parentheses + # By default the indentation width from `Layout/IndentationWidth` is used, + # but it can be overridden by setting this parameter. + IndentationWidth: ~ + +Layout/FirstArrayElementIndentation: + Description: >- + Checks the indentation of the first element in an array + literal. + Enabled: true + VersionAdded: '0.68' + VersionChanged: '0.77' + # The value `special_inside_parentheses` means that array literals with + # brackets that have their opening bracket on the same line as a surrounding + # opening round parenthesis, shall have their first element indented relative + # to the first position inside the parenthesis. + # + # The value `consistent` means that the indentation of the first element shall + # always be relative to the first position of the line where the opening + # bracket is. + # + # The value `align_brackets` means that the indentation of the first element + # shall always be relative to the position of the opening bracket. + EnforcedStyle: special_inside_parentheses + SupportedStyles: + - special_inside_parentheses + - consistent + - align_brackets + # By default the indentation width from `Layout/IndentationWidth` is used, + # but it can be overridden by setting this parameter. + IndentationWidth: ~ + +Layout/FirstArrayElementLineBreak: + Description: >- + Checks for a line break before the first element in a + multi-line array. + Enabled: false + VersionAdded: '0.49' + +Layout/FirstHashElementIndentation: + Description: 'Checks the indentation of the first key in a hash literal.' + Enabled: true + VersionAdded: '0.68' + VersionChanged: '0.77' + # The value `special_inside_parentheses` means that hash literals with braces + # that have their opening brace on the same line as a surrounding opening + # round parenthesis, shall have their first key indented relative to the + # first position inside the parenthesis. + # + # The value `consistent` means that the indentation of the first key shall + # always be relative to the first position of the line where the opening + # brace is. + # + # The value `align_braces` means that the indentation of the first key shall + # always be relative to the position of the opening brace. + EnforcedStyle: special_inside_parentheses + SupportedStyles: + - special_inside_parentheses + - consistent + - align_braces + # By default the indentation width from `Layout/IndentationWidth` is used, + # but it can be overridden by setting this parameter. + IndentationWidth: ~ + +Layout/FirstHashElementLineBreak: + Description: >- + Checks for a line break before the first element in a + multi-line hash. + Enabled: false + VersionAdded: '0.49' + +Layout/FirstMethodArgumentLineBreak: + Description: >- + Checks for a line break before the first argument in a + multi-line method call. + Enabled: false + VersionAdded: '0.49' + +Layout/FirstMethodParameterLineBreak: + Description: >- + Checks for a line break before the first parameter in a + multi-line method parameter definition. + Enabled: false + VersionAdded: '0.49' + +Layout/FirstParameterIndentation: + Description: >- + Checks the indentation of the first parameter in a + method definition. + Enabled: true + VersionAdded: '0.49' + VersionChanged: '0.77' + EnforcedStyle: consistent + SupportedStyles: + - consistent + - align_parentheses + # By default the indentation width from `Layout/IndentationWidth` is used, + # but it can be overridden by setting this parameter. + IndentationWidth: ~ + +Layout/HashAlignment: + Description: >- + Align the elements of a hash literal if they span more than + one line. + Enabled: true + AllowMultipleStyles: true + VersionAdded: '0.49' + VersionChanged: '1.16' + # Alignment of entries using hash rocket as separator. Valid values are: + # + # key - left alignment of keys + # 'a' => 2 + # 'bb' => 3 + # separator - alignment of hash rockets, keys are right aligned + # 'a' => 2 + # 'bb' => 3 + # table - left alignment of keys, hash rockets, and values + # 'a' => 2 + # 'bb' => 3 + EnforcedHashRocketStyle: key + SupportedHashRocketStyles: + - key + - separator + - table + # Alignment of entries using colon as separator. Valid values are: + # + # key - left alignment of keys + # a: 0 + # bb: 1 + # separator - alignment of colons, keys are right aligned + # a: 0 + # bb: 1 + # table - left alignment of keys and values + # a: 0 + # bb: 1 + EnforcedColonStyle: key + SupportedColonStyles: + - key + - separator + - table + # Select whether hashes that are the last argument in a method call should be + # inspected? Valid values are: + # + # always_inspect - Inspect both implicit and explicit hashes. + # Registers an offense for: + # function(a: 1, + # b: 2) + # Registers an offense for: + # function({a: 1, + # b: 2}) + # always_ignore - Ignore both implicit and explicit hashes. + # Accepts: + # function(a: 1, + # b: 2) + # Accepts: + # function({a: 1, + # b: 2}) + # ignore_implicit - Ignore only implicit hashes. + # Accepts: + # function(a: 1, + # b: 2) + # Registers an offense for: + # function({a: 1, + # b: 2}) + # ignore_explicit - Ignore only explicit hashes. + # Accepts: + # function({a: 1, + # b: 2}) + # Registers an offense for: + # function(a: 1, + # b: 2) + EnforcedLastArgumentHashStyle: always_inspect + SupportedLastArgumentHashStyles: + - always_inspect + - always_ignore + - ignore_implicit + - ignore_explicit + +Layout/HeredocArgumentClosingParenthesis: + Description: >- + Checks for the placement of the closing parenthesis in a + method call that passes a HEREDOC string as an argument. + Enabled: false + StyleGuide: '#heredoc-argument-closing-parentheses' + VersionAdded: '0.68' + +Layout/HeredocIndentation: + Description: 'This cop checks the indentation of the here document bodies.' + StyleGuide: '#squiggly-heredocs' + Enabled: true + VersionAdded: '0.49' + VersionChanged: '0.85' + +Layout/IndentationConsistency: + Description: 'Keep indentation straight.' + StyleGuide: '#spaces-indentation' + Enabled: true + VersionAdded: '0.49' + # The difference between `indented` and `normal` is that the `indented_internal_methods` + # style prescribes that in classes and modules the `protected` and `private` + # modifier keywords shall be indented the same as public methods and that + # protected and private members shall be indented one step more than the + # modifiers. Other than that, both styles mean that entities on the same + # logical depth shall have the same indentation. + EnforcedStyle: normal + SupportedStyles: + - normal + - indented_internal_methods + Reference: + # A reference to `EnforcedStyle: indented_internal_methods`. + - https://edgeguides.rubyonrails.org/contributing_to_ruby_on_rails.html#follow-the-coding-conventions + +Layout/IndentationStyle: + Description: 'Consistent indentation either with tabs only or spaces only.' + StyleGuide: '#spaces-indentation' + Enabled: true + VersionAdded: '0.49' + VersionChanged: '0.82' + # By default the indentation width from `Layout/IndentationWidth` is used, + # but it can be overridden by setting this parameter. + # It is used during auto-correction to determine how many spaces should + # replace each tab. + IndentationWidth: ~ + EnforcedStyle: spaces + SupportedStyles: + - spaces + - tabs + +Layout/IndentationWidth: + Description: 'Use 2 spaces for indentation.' + StyleGuide: '#spaces-indentation' + Enabled: true + VersionAdded: '0.49' + # Number of spaces for each indentation level. + Width: 2 + AllowedPatterns: [] + IgnoredPatterns: [] # deprecated + +Layout/InitialIndentation: + Description: >- + Checks the indentation of the first non-blank non-comment line in a file. + Enabled: true + VersionAdded: '0.49' + +Layout/LeadingCommentSpace: + Description: 'Comments should start with a space.' + StyleGuide: '#hash-space' + Enabled: true + VersionAdded: '0.49' + VersionChanged: '0.73' + AllowDoxygenCommentStyle: false + AllowGemfileRubyComment: false + +Layout/LeadingEmptyLines: + Description: Check for unnecessary blank lines at the beginning of a file. + Enabled: true + VersionAdded: '0.57' + VersionChanged: '0.77' + +Layout/LineEndStringConcatenationIndentation: + Description: >- + Checks the indentation of the next line after a line that + ends with a string literal and a backslash. + Enabled: pending + VersionAdded: '1.18' + EnforcedStyle: aligned + SupportedStyles: + - aligned + - indented + # By default the indentation width from `Layout/IndentationWidth` is used, + # but it can be overridden by setting this parameter. + IndentationWidth: ~ + +Layout/LineLength: + Description: 'Checks that line length does not exceed the configured limit.' + StyleGuide: '#max-line-length' + Enabled: true + VersionAdded: '0.25' + VersionChanged: '1.4' + Max: 120 + # To make it possible to copy or click on URIs in the code, we allow lines + # containing a URI to be longer than Max. + AllowHeredoc: true + AllowURI: true + URISchemes: + - http + - https + # The IgnoreCopDirectives option causes the LineLength rule to ignore cop + # directives like '# rubocop: enable ...' when calculating a line's length. + IgnoreCopDirectives: true + # The AllowedPatterns option is a list of !ruby/regexp and/or string + # elements. Strings will be converted to Regexp objects. A line that matches + # any regular expression listed in this option will be ignored by LineLength. + AllowedPatterns: [] + IgnoredPatterns: [] # deprecated + +Layout/MultilineArrayBraceLayout: + Description: >- + Checks that the closing brace in an array literal is + either on the same line as the last array element, or + a new line. + Enabled: true + VersionAdded: '0.49' + EnforcedStyle: symmetrical + SupportedStyles: + # symmetrical: closing brace is positioned in same way as opening brace + # new_line: closing brace is always on a new line + # same_line: closing brace is always on the same line as last element + - symmetrical + - new_line + - same_line + +Layout/MultilineArrayLineBreaks: + Description: >- + Checks that each item in a multi-line array literal + starts on a separate line. + Enabled: false + VersionAdded: '0.67' + +Layout/MultilineAssignmentLayout: + Description: 'Check for a newline after the assignment operator in multi-line assignments.' + StyleGuide: '#indent-conditional-assignment' + Enabled: false + VersionAdded: '0.49' + # The types of assignments which are subject to this rule. + SupportedTypes: + - block + - case + - class + - if + - kwbegin + - module + EnforcedStyle: new_line + SupportedStyles: + # Ensures that the assignment operator and the rhs are on the same line for + # the set of supported types. + - same_line + # Ensures that the assignment operator and the rhs are on separate lines + # for the set of supported types. + - new_line + +Layout/MultilineBlockLayout: + Description: 'Ensures newlines after multiline block do statements.' + Enabled: true + VersionAdded: '0.49' + +Layout/MultilineHashBraceLayout: + Description: >- + Checks that the closing brace in a hash literal is + either on the same line as the last hash element, or + a new line. + Enabled: true + VersionAdded: '0.49' + EnforcedStyle: symmetrical + SupportedStyles: + # symmetrical: closing brace is positioned in same way as opening brace + # new_line: closing brace is always on a new line + # same_line: closing brace is always on same line as last element + - symmetrical + - new_line + - same_line + +Layout/MultilineHashKeyLineBreaks: + Description: >- + Checks that each item in a multi-line hash literal + starts on a separate line. + Enabled: false + VersionAdded: '0.67' + +Layout/MultilineMethodArgumentLineBreaks: + Description: >- + Checks that each argument in a multi-line method call + starts on a separate line. + Enabled: false + VersionAdded: '0.67' + +Layout/MultilineMethodCallBraceLayout: + Description: >- + Checks that the closing brace in a method call is + either on the same line as the last method argument, or + a new line. + Enabled: true + VersionAdded: '0.49' + EnforcedStyle: symmetrical + SupportedStyles: + # symmetrical: closing brace is positioned in same way as opening brace + # new_line: closing brace is always on a new line + # same_line: closing brace is always on the same line as last argument + - symmetrical + - new_line + - same_line + +Layout/MultilineMethodCallIndentation: + Description: >- + Checks indentation of method calls with the dot operator + that span more than one line. + Enabled: true + VersionAdded: '0.49' + EnforcedStyle: aligned + SupportedStyles: + - aligned + - indented + - indented_relative_to_receiver + # By default the indentation width from `Layout/IndentationWidth` is used, + # but it can be overridden by setting this parameter. + IndentationWidth: ~ + +Layout/MultilineMethodDefinitionBraceLayout: + Description: >- + Checks that the closing brace in a method definition is + either on the same line as the last method parameter, or + a new line. + Enabled: true + VersionAdded: '0.49' + EnforcedStyle: symmetrical + SupportedStyles: + # symmetrical: closing brace is positioned in same way as opening brace + # new_line: closing brace is always on a new line + # same_line: closing brace is always on the same line as last parameter + - symmetrical + - new_line + - same_line + +Layout/MultilineOperationIndentation: + Description: >- + Checks indentation of binary operations that span more than + one line. + Enabled: true + VersionAdded: '0.49' + EnforcedStyle: aligned + SupportedStyles: + - aligned + - indented + # By default the indentation width from `Layout/IndentationWidth` is used, + # but it can be overridden by setting this parameter. + IndentationWidth: ~ + +Layout/ParameterAlignment: + Description: >- + Align the parameters of a method definition if they span more + than one line. + StyleGuide: '#no-double-indent' + Enabled: true + VersionAdded: '0.49' + VersionChanged: '0.77' + # Alignment of parameters in multi-line method calls. + # + # The `with_first_parameter` style aligns the following lines along the same + # column as the first parameter. + # + # def method_foo(a, + # b) + # + # The `with_fixed_indentation` style aligns the following lines with one + # level of indentation relative to the start of the line with the method call. + # + # def method_foo(a, + # b) + EnforcedStyle: with_first_parameter + SupportedStyles: + - with_first_parameter + - with_fixed_indentation + # By default the indentation width from `Layout/IndentationWidth` is used, + # but it can be overridden by setting this parameter. + IndentationWidth: ~ + +Layout/RedundantLineBreak: + Description: >- + Do not break up an expression into multiple lines when it fits + on a single line. + Enabled: false + InspectBlocks: false + VersionAdded: '1.13' + +Layout/RescueEnsureAlignment: + Description: 'Align rescues and ensures correctly.' + Enabled: true + VersionAdded: '0.49' + +Layout/SingleLineBlockChain: + Description: 'Put method call on a separate line if chained to a single line block.' + Enabled: false + VersionAdded: '1.14' + +Layout/SpaceAfterColon: + Description: 'Use spaces after colons.' + StyleGuide: '#spaces-operators' + Enabled: true + VersionAdded: '0.49' + +Layout/SpaceAfterComma: + Description: 'Use spaces after commas.' + StyleGuide: '#spaces-operators' + Enabled: true + VersionAdded: '0.49' + +Layout/SpaceAfterMethodName: + Description: >- + Do not put a space between a method name and the opening + parenthesis in a method definition. + StyleGuide: '#parens-no-spaces' + Enabled: true + VersionAdded: '0.49' + +Layout/SpaceAfterNot: + Description: Tracks redundant space after the ! operator. + StyleGuide: '#no-space-bang' + Enabled: true + VersionAdded: '0.49' + +Layout/SpaceAfterSemicolon: + Description: 'Use spaces after semicolons.' + StyleGuide: '#spaces-operators' + Enabled: true + VersionAdded: '0.49' + +Layout/SpaceAroundBlockParameters: + Description: 'Checks the spacing inside and after block parameters pipes.' + Enabled: true + VersionAdded: '0.49' + EnforcedStyleInsidePipes: no_space + SupportedStylesInsidePipes: + - space + - no_space + +Layout/SpaceAroundEqualsInParameterDefault: + Description: >- + Checks that the equals signs in parameter default assignments + have or don't have surrounding space depending on + configuration. + StyleGuide: '#spaces-around-equals' + Enabled: true + VersionAdded: '0.49' + EnforcedStyle: space + SupportedStyles: + - space + - no_space + +Layout/SpaceAroundKeyword: + Description: 'Use a space around keywords if appropriate.' + Enabled: true + VersionAdded: '0.49' + +Layout/SpaceAroundMethodCallOperator: + Description: 'Checks method call operators to not have spaces around them.' + Enabled: true + VersionAdded: '0.82' + +Layout/SpaceAroundOperators: + Description: 'Use a single space around operators.' + StyleGuide: '#spaces-operators' + Enabled: true + VersionAdded: '0.49' + # When `true`, allows most uses of extra spacing if the intent is to align + # with an operator on the previous or next line, not counting empty lines + # or comment lines. + AllowForAlignment: true + EnforcedStyleForExponentOperator: no_space + SupportedStylesForExponentOperator: + - space + - no_space + +Layout/SpaceBeforeBlockBraces: + Description: >- + Checks that the left block brace has or doesn't have space + before it. + Enabled: true + VersionAdded: '0.49' + EnforcedStyle: space + SupportedStyles: + - space + - no_space + EnforcedStyleForEmptyBraces: space + SupportedStylesForEmptyBraces: + - space + - no_space + VersionChanged: '0.52' + +Layout/SpaceBeforeBrackets: + Description: 'Checks for receiver with a space before the opening brackets.' + StyleGuide: '#space-in-brackets-access' + Enabled: pending + VersionAdded: '1.7' + +Layout/SpaceBeforeComma: + Description: 'No spaces before commas.' + Enabled: true + VersionAdded: '0.49' + +Layout/SpaceBeforeComment: + Description: >- + Checks for missing space between code and a comment on the + same line. + Enabled: true + VersionAdded: '0.49' + +Layout/SpaceBeforeFirstArg: + Description: >- + Checks that exactly one space is used between a method name + and the first argument for method calls without parentheses. + Enabled: true + VersionAdded: '0.49' + # When `true`, allows most uses of extra spacing if the intent is to align + # things with the previous or next line, not counting empty lines or comment + # lines. + AllowForAlignment: true + +Layout/SpaceBeforeSemicolon: + Description: 'No spaces before semicolons.' + Enabled: true + VersionAdded: '0.49' + +Layout/SpaceInLambdaLiteral: + Description: 'Checks for spaces in lambda literals.' + Enabled: true + VersionAdded: '0.49' + EnforcedStyle: require_no_space + SupportedStyles: + - require_no_space + - require_space + +Layout/SpaceInsideArrayLiteralBrackets: + Description: 'Checks the spacing inside array literal brackets.' + Enabled: true + VersionAdded: '0.52' + EnforcedStyle: no_space + SupportedStyles: + - space + - no_space + # 'compact' normally requires a space inside the brackets, with the exception + # that successive left brackets or right brackets are collapsed together + - compact + EnforcedStyleForEmptyBrackets: no_space + SupportedStylesForEmptyBrackets: + - space + - no_space + +Layout/SpaceInsideArrayPercentLiteral: + Description: 'No unnecessary additional spaces between elements in %i/%w literals.' + Enabled: true + VersionAdded: '0.49' + +Layout/SpaceInsideBlockBraces: + Description: >- + Checks that block braces have or don't have surrounding space. + For blocks taking parameters, checks that the left brace has + or doesn't have trailing space. + Enabled: true + VersionAdded: '0.49' + EnforcedStyle: space + SupportedStyles: + - space + - no_space + EnforcedStyleForEmptyBraces: no_space + SupportedStylesForEmptyBraces: + - space + - no_space + # Space between `{` and `|`. Overrides `EnforcedStyle` if there is a conflict. + SpaceBeforeBlockParameters: true + +Layout/SpaceInsideHashLiteralBraces: + Description: "Use spaces inside hash literal braces - or don't." + StyleGuide: '#spaces-braces' + Enabled: true + VersionAdded: '0.49' + EnforcedStyle: space + SupportedStyles: + - space + - no_space + # 'compact' normally requires a space inside hash braces, with the exception + # that successive left braces or right braces are collapsed together + - compact + EnforcedStyleForEmptyBraces: no_space + SupportedStylesForEmptyBraces: + - space + - no_space + + +Layout/SpaceInsideParens: + Description: 'No spaces after ( or before ).' + StyleGuide: '#spaces-braces' + Enabled: true + VersionAdded: '0.49' + VersionChanged: '1.22' + EnforcedStyle: no_space + SupportedStyles: + - space + - compact + - no_space + +Layout/SpaceInsidePercentLiteralDelimiters: + Description: 'No unnecessary spaces inside delimiters of %i/%w/%x literals.' + Enabled: true + VersionAdded: '0.49' + +Layout/SpaceInsideRangeLiteral: + Description: 'No spaces inside range literals.' + StyleGuide: '#no-space-inside-range-literals' + Enabled: true + VersionAdded: '0.49' + +Layout/SpaceInsideReferenceBrackets: + Description: 'Checks the spacing inside referential brackets.' + Enabled: true + VersionAdded: '0.52' + VersionChanged: '0.53' + EnforcedStyle: no_space + SupportedStyles: + - space + - no_space + EnforcedStyleForEmptyBrackets: no_space + SupportedStylesForEmptyBrackets: + - space + - no_space + +Layout/SpaceInsideStringInterpolation: + Description: 'Checks for padding/surrounding spaces inside string interpolation.' + StyleGuide: '#string-interpolation' + Enabled: true + VersionAdded: '0.49' + EnforcedStyle: no_space + SupportedStyles: + - space + - no_space + +Layout/TrailingEmptyLines: + Description: 'Checks trailing blank lines and final newline.' + StyleGuide: '#newline-eof' + Enabled: true + VersionAdded: '0.49' + VersionChanged: '0.77' + EnforcedStyle: final_newline + SupportedStyles: + - final_newline + - final_blank_line + +Layout/TrailingWhitespace: + Description: 'Avoid trailing whitespace.' + StyleGuide: '#no-trailing-whitespace' + Enabled: true + VersionAdded: '0.49' + VersionChanged: '1.0' + AllowInHeredoc: false + +#################### Lint ################################## +### Warnings + +Lint/AmbiguousAssignment: + Description: 'Checks for mistyped shorthand assignments.' + Enabled: pending + VersionAdded: '1.7' + +Lint/AmbiguousBlockAssociation: + Description: >- + Checks for ambiguous block association with method when param passed without + parentheses. + StyleGuide: '#syntax' + Enabled: true + VersionAdded: '0.48' + VersionChanged: '1.13' + IgnoredMethods: [] + +Lint/AmbiguousOperator: + Description: >- + Checks for ambiguous operators in the first argument of a + method invocation without parentheses. + StyleGuide: '#method-invocation-parens' + Enabled: true + VersionAdded: '0.17' + VersionChanged: '0.83' + +Lint/AmbiguousOperatorPrecedence: + Description: >- + Checks for expressions containing multiple binary operations with + ambiguous precedence. + Enabled: pending + VersionAdded: '1.21' + +Lint/AmbiguousRange: + Description: Checks for ranges with ambiguous boundaries. + Enabled: pending + VersionAdded: '1.19' + SafeAutoCorrect: false + RequireParenthesesForMethodChains: false + +Lint/AmbiguousRegexpLiteral: + Description: >- + Checks for ambiguous regexp literals in the first argument of + a method invocation without parentheses. + Enabled: true + VersionAdded: '0.17' + VersionChanged: '0.83' + +Lint/AssignmentInCondition: + Description: "Don't use assignment in conditions." + StyleGuide: '#safe-assignment-in-condition' + Enabled: true + VersionAdded: '0.9' + AllowSafeAssignment: true + +Lint/BigDecimalNew: + Description: '`BigDecimal.new()` is deprecated. Use `BigDecimal()` instead.' + Enabled: true + VersionAdded: '0.53' + +Lint/BinaryOperatorWithIdenticalOperands: + Description: 'This cop checks for places where binary operator has identical operands.' + Enabled: true + Safe: false + VersionAdded: '0.89' + VersionChanged: '1.7' + +Lint/BooleanSymbol: + Description: 'Check for `:true` and `:false` symbols.' + Enabled: true + SafeAutoCorrect: false + VersionAdded: '0.50' + VersionChanged: '1.22' + +Lint/CircularArgumentReference: + Description: "Default values in optional keyword arguments and optional ordinal arguments should not refer back to the name of the argument." + Enabled: true + VersionAdded: '0.33' + +Lint/ConstantDefinitionInBlock: + Description: 'Do not define constants within a block.' + StyleGuide: '#no-constant-definition-in-block' + Enabled: true + VersionAdded: '0.91' + VersionChanged: '1.3' + # `enums` for Typed Enums via T::Enum in Sorbet. + # https://sorbet.org/docs/tenum + AllowedMethods: + - enums + +Lint/ConstantResolution: + Description: 'Check that constants are fully qualified with `::`.' + Enabled: false + VersionAdded: '0.86' + # Restrict this cop to only looking at certain names + Only: [] + # Restrict this cop from only looking at certain names + Ignore: [] + +Lint/Debugger: + Description: 'Check for debugger calls.' + Enabled: true + VersionAdded: '0.14' + VersionChanged: '1.10' + DebuggerReceivers: [] # deprecated + DebuggerMethods: + # Groups are available so that a specific group can be disabled in + # a user's configuration, but are otherwise not significant. + Kernel: + - binding.irb + Byebug: + - byebug + - remote_byebug + - Kernel.byebug + - Kernel.remote_byebug + Capybara: + - save_and_open_page + - save_and_open_screenshot + debug.rb: + - binding.b + - binding.break + - Kernel.binding.b + - Kernel.binding.break + Pry: + - binding.pry + - binding.remote_pry + - binding.pry_remote + - Pry.rescue + Rails: + - debugger + - Kernel.debugger + RubyJard: + - jard + WebConsole: + - binding.console + +Lint/DeprecatedClassMethods: + Description: 'Check for deprecated class method calls.' + Enabled: true + VersionAdded: '0.19' + +Lint/DeprecatedConstants: + Description: 'Checks for deprecated constants.' + Enabled: pending + VersionAdded: '1.8' + VersionChanged: '1.22' + # You can configure deprecated constants. + # If there is an alternative method, you can set alternative value as `Alternative`. + # And you can set the deprecated version as `DeprecatedVersion`. + # These options can be omitted if they are not needed. + # + # DeprecatedConstants: + # 'DEPRECATED_CONSTANT': + # Alternative: 'alternative_value' + # DeprecatedVersion: 'deprecated_version' + # + DeprecatedConstants: + 'NIL': + Alternative: 'nil' + DeprecatedVersion: '2.4' + 'TRUE': + Alternative: 'true' + DeprecatedVersion: '2.4' + 'FALSE': + Alternative: 'false' + DeprecatedVersion: '2.4' + 'Net::HTTPServerException': + Alternative: 'Net::HTTPClientException' + DeprecatedVersion: '2.6' + 'Random::DEFAULT': + Alternative: 'Random.new' + DeprecatedVersion: '3.0' + +Lint/DeprecatedOpenSSLConstant: + Description: "Don't use algorithm constants for `OpenSSL::Cipher` and `OpenSSL::Digest`." + Enabled: true + VersionAdded: '0.84' + +Lint/DisjunctiveAssignmentInConstructor: + Description: 'In constructor, plain assignment is preferred over disjunctive.' + Enabled: true + Safe: false + VersionAdded: '0.62' + VersionChanged: '0.88' + +Lint/DuplicateBranch: + Description: Checks that there are no repeated bodies within `if/unless`, `case-when` and `rescue` constructs. + Enabled: pending + VersionAdded: '1.3' + VersionChanged: '1.7' + IgnoreLiteralBranches: false + IgnoreConstantBranches: false + +Lint/DuplicateCaseCondition: + Description: 'Do not repeat values in case conditionals.' + Enabled: true + VersionAdded: '0.45' + +Lint/DuplicateElsifCondition: + Description: 'Do not repeat conditions used in if `elsif`.' + Enabled: true + VersionAdded: '0.88' + +Lint/DuplicateHashKey: + Description: 'Check for duplicate keys in hash literals.' + Enabled: true + VersionAdded: '0.34' + VersionChanged: '0.77' + +Lint/DuplicateMethods: + Description: 'Check for duplicate method definitions.' + Enabled: true + VersionAdded: '0.29' + +Lint/DuplicateRegexpCharacterClassElement: + Description: 'Checks for duplicate elements in Regexp character classes.' + Enabled: pending + VersionAdded: '1.1' + +Lint/DuplicateRequire: + Description: 'Check for duplicate `require`s and `require_relative`s.' + Enabled: true + SafeAutoCorrect: false + VersionAdded: '0.90' + VersionChanged: '1.28' + +Lint/DuplicateRescueException: + Description: 'Checks that there are no repeated exceptions used in `rescue` expressions.' + Enabled: true + VersionAdded: '0.89' + +Lint/EachWithObjectArgument: + Description: 'Check for immutable argument given to each_with_object.' + Enabled: true + VersionAdded: '0.31' + +Lint/ElseLayout: + Description: 'Check for odd code arrangement in an else block.' + Enabled: true + VersionAdded: '0.17' + VersionChanged: '1.2' + +Lint/EmptyBlock: + Description: 'This cop checks for blocks without a body.' + Enabled: pending + VersionAdded: '1.1' + VersionChanged: '1.15' + AllowComments: true + AllowEmptyLambdas: true + +Lint/EmptyClass: + Description: 'Checks for classes and metaclasses without a body.' + Enabled: pending + VersionAdded: '1.3' + AllowComments: false + +Lint/EmptyConditionalBody: + Description: 'This cop checks for the presence of `if`, `elsif` and `unless` branches without a body.' + Enabled: true + AllowComments: true + VersionAdded: '0.89' + +Lint/EmptyEnsure: + Description: 'Checks for empty ensure block.' + Enabled: true + VersionAdded: '0.10' + VersionChanged: '0.48' + +Lint/EmptyExpression: + Description: 'Checks for empty expressions.' + Enabled: true + VersionAdded: '0.45' + +Lint/EmptyFile: + Description: 'Enforces that Ruby source files are not empty.' + Enabled: true + AllowComments: true + VersionAdded: '0.90' + +Lint/EmptyInPattern: + Description: 'Checks for the presence of `in` pattern branches without a body.' + Enabled: pending + AllowComments: true + VersionAdded: '1.16' + +Lint/EmptyInterpolation: + Description: 'Checks for empty string interpolation.' + Enabled: true + VersionAdded: '0.20' + VersionChanged: '0.45' + +Lint/EmptyWhen: + Description: 'Checks for `when` branches with empty bodies.' + Enabled: true + AllowComments: true + VersionAdded: '0.45' + VersionChanged: '0.83' + +Lint/EnsureReturn: + Description: 'Do not use return in an ensure block.' + StyleGuide: '#no-return-ensure' + Enabled: true + VersionAdded: '0.9' + VersionChanged: '0.83' + +Lint/ErbNewArguments: + Description: 'Use `:trim_mode` and `:eoutvar` keyword arguments to `ERB.new`.' + Enabled: true + VersionAdded: '0.56' + +Lint/FlipFlop: + Description: 'Checks for flip-flops.' + StyleGuide: '#no-flip-flops' + Enabled: true + VersionAdded: '0.16' + +Lint/FloatComparison: + Description: 'Checks for the presence of precise comparison of floating point numbers.' + StyleGuide: '#float-comparison' + Enabled: true + VersionAdded: '0.89' + +Lint/FloatOutOfRange: + Description: >- + Catches floating-point literals too large or small for Ruby to + represent. + Enabled: true + VersionAdded: '0.36' + +Lint/FormatParameterMismatch: + Description: 'The number of parameters to format/sprint must match the fields.' + Enabled: true + VersionAdded: '0.33' + +Lint/HashCompareByIdentity: + Description: 'Prefer using `Hash#compare_by_identity` than using `object_id` for keys.' + StyleGuide: '#identity-comparison' + Enabled: true + Safe: false + VersionAdded: '0.93' + +Lint/HeredocMethodCallPosition: + Description: >- + Checks for the ordering of a method call where + the receiver of the call is a HEREDOC. + Enabled: false + StyleGuide: '#heredoc-method-calls' + VersionAdded: '0.68' + +Lint/IdentityComparison: + Description: 'Prefer `equal?` over `==` when comparing `object_id`.' + Enabled: true + StyleGuide: '#identity-comparison' + VersionAdded: '0.91' + +Lint/ImplicitStringConcatenation: + Description: >- + Checks for adjacent string literals on the same line, which + could better be represented as a single string literal. + Enabled: true + VersionAdded: '0.36' + +Lint/IncompatibleIoSelectWithFiberScheduler: + Description: 'Checks for `IO.select` that is incompatible with Fiber Scheduler.' + Enabled: pending + SafeAutoCorrect: false + VersionAdded: '1.21' + VersionChanged: '1.24' + +Lint/IneffectiveAccessModifier: + Description: >- + Checks for attempts to use `private` or `protected` to set + the visibility of a class method, which does not work. + Enabled: true + VersionAdded: '0.36' + +Lint/InheritException: + Description: 'Avoid inheriting from the `Exception` class.' + Enabled: true + SafeAutoCorrect: false + VersionAdded: '0.41' + VersionChanged: '1.26' + # The default base class in favour of `Exception`. + EnforcedStyle: standard_error + SupportedStyles: + - standard_error + - runtime_error + +Lint/InterpolationCheck: + Description: 'Raise warning for interpolation in single q strs.' + Enabled: true + Safe: false + VersionAdded: '0.50' + VersionChanged: '0.87' + +Lint/LambdaWithoutLiteralBlock: + Description: 'Checks uses of lambda without a literal block.' + Enabled: pending + VersionAdded: '1.8' + +Lint/LiteralAsCondition: + Description: 'Checks of literals used in conditions.' + Enabled: true + VersionAdded: '0.51' + +Lint/LiteralInInterpolation: + Description: 'Checks for literals used in interpolation.' + Enabled: true + VersionAdded: '0.19' + VersionChanged: '0.32' + +Lint/Loop: + Description: >- + Use Kernel#loop with break rather than begin/end/until or + begin/end/while for post-loop tests. + StyleGuide: '#loop-with-break' + Enabled: true + VersionAdded: '0.9' + VersionChanged: '1.3' + Safe: false + +Lint/MissingCopEnableDirective: + Description: 'Checks for a `# rubocop:enable` after `# rubocop:disable`.' + Enabled: true + VersionAdded: '0.52' + # Maximum number of consecutive lines the cop can be disabled for. + # 0 allows only single-line disables + # 1 would mean the maximum allowed is the following: + # # rubocop:disable SomeCop + # a = 1 + # # rubocop:enable SomeCop + # .inf for any size + MaximumRangeSize: .inf + +Lint/MissingSuper: + Description: >- + This cop checks for the presence of constructors and lifecycle callbacks + without calls to `super`. + Enabled: true + VersionAdded: '0.89' + VersionChanged: '1.4' + +Lint/MixedRegexpCaptureTypes: + Description: 'Do not mix named captures and numbered captures in a Regexp literal.' + Enabled: true + VersionAdded: '0.85' + +Lint/MultipleComparison: + Description: "Use `&&` operator to compare multiple values." + Enabled: true + VersionAdded: '0.47' + VersionChanged: '1.1' + +Lint/NestedMethodDefinition: + Description: 'Do not use nested method definitions.' + StyleGuide: '#no-nested-methods' + Enabled: true + VersionAdded: '0.32' + +Lint/NestedPercentLiteral: + Description: 'Checks for nested percent literals.' + Enabled: true + VersionAdded: '0.52' + +Lint/NextWithoutAccumulator: + Description: >- + Do not omit the accumulator when calling `next` + in a `reduce`/`inject` block. + Enabled: true + VersionAdded: '0.36' + +Lint/NoReturnInBeginEndBlocks: + Description: 'Do not `return` inside `begin..end` blocks in assignment contexts.' + Enabled: pending + VersionAdded: '1.2' + +Lint/NonDeterministicRequireOrder: + Description: 'Always sort arrays returned by Dir.glob when requiring files.' + Enabled: true + VersionAdded: '0.78' + Safe: false + +Lint/NonLocalExitFromIterator: + Description: 'Do not use return in iterator to cause non-local exit.' + Enabled: true + VersionAdded: '0.30' + +Lint/NumberConversion: + Description: 'Checks unsafe usage of number conversion methods.' + Enabled: false + VersionAdded: '0.53' + VersionChanged: '1.1' + SafeAutoCorrect: false + IgnoredMethods: [] + IgnoredClasses: + - Time + - DateTime + +Lint/NumberedParameterAssignment: + Description: 'Checks for uses of numbered parameter assignment.' + Enabled: pending + VersionAdded: '1.9' + +Lint/OrAssignmentToConstant: + Description: 'Checks unintended or-assignment to constant.' + Enabled: pending + Safe: false + VersionAdded: '1.9' + +Lint/OrderedMagicComments: + Description: 'Checks the proper ordering of magic comments and whether a magic comment is not placed before a shebang.' + Enabled: true + VersionAdded: '0.53' + +Lint/OutOfRangeRegexpRef: + Description: 'Checks for out of range reference for Regexp because it always returns nil.' + Enabled: true + Safe: false + VersionAdded: '0.89' + +Lint/ParenthesesAsGroupedExpression: + Description: >- + Checks for method calls with a space before the opening + parenthesis. + StyleGuide: '#parens-no-spaces' + Enabled: true + VersionAdded: '0.12' + VersionChanged: '0.83' + +Lint/PercentStringArray: + Description: >- + Checks for unwanted commas and quotes in %w/%W literals. + Enabled: true + Safe: false + VersionAdded: '0.41' + +Lint/PercentSymbolArray: + Description: >- + Checks for unwanted commas and colons in %i/%I literals. + Enabled: true + VersionAdded: '0.41' + +Lint/RaiseException: + Description: Checks for `raise` or `fail` statements which are raising `Exception` class. + StyleGuide: '#raise-exception' + Enabled: true + Safe: false + VersionAdded: '0.81' + VersionChanged: '0.86' + AllowedImplicitNamespaces: + - 'Gem' + +Lint/RandOne: + Description: >- + Checks for `rand(1)` calls. Such calls always return `0` + and most likely a mistake. + Enabled: true + VersionAdded: '0.36' + +Lint/RedundantCopDisableDirective: + Description: >- + Checks for rubocop:disable comments that can be removed. + Note: this cop is not disabled when disabling all cops. + It must be explicitly disabled. + Enabled: true + VersionAdded: '0.76' + +Lint/RedundantCopEnableDirective: + Description: Checks for rubocop:enable comments that can be removed. + Enabled: true + VersionAdded: '0.76' + +Lint/RedundantDirGlobSort: + Description: 'Checks for redundant `sort` method to `Dir.glob` and `Dir[]`.' + Enabled: pending + VersionAdded: '1.8' + VersionChanged: '1.26' + SafeAutoCorrect: false + +Lint/RedundantRequireStatement: + Description: 'Checks for unnecessary `require` statement.' + Enabled: true + VersionAdded: '0.76' + +Lint/RedundantSafeNavigation: + Description: 'Checks for redundant safe navigation calls.' + Enabled: true + VersionAdded: '0.93' + AllowedMethods: + - instance_of? + - kind_of? + - is_a? + - eql? + - respond_to? + - equal? + Safe: false + +Lint/RedundantSplatExpansion: + Description: 'Checks for splat unnecessarily being called on literals.' + Enabled: true + VersionAdded: '0.76' + VersionChanged: '1.7' + AllowPercentLiteralArrayArgument: true + +Lint/RedundantStringCoercion: + Description: 'Checks for Object#to_s usage in string interpolation.' + StyleGuide: '#no-to-s' + Enabled: true + VersionAdded: '0.19' + VersionChanged: '0.77' + +Lint/RedundantWithIndex: + Description: 'Checks for redundant `with_index`.' + Enabled: true + VersionAdded: '0.50' + +Lint/RedundantWithObject: + Description: 'Checks for redundant `with_object`.' + Enabled: true + VersionAdded: '0.51' + +Lint/RefinementImportMethods: + Description: 'Use `Refinement#import_methods` when using `include` or `prepend` in `refine` block.' + Enabled: pending + SafeAutoCorrect: false + VersionAdded: '1.27' + +Lint/RegexpAsCondition: + Description: >- + Do not use regexp literal as a condition. + The regexp literal matches `$_` implicitly. + Enabled: true + VersionAdded: '0.51' + VersionChanged: '0.86' + +Lint/RequireParentheses: + Description: >- + Use parentheses in the method call to avoid confusion + about precedence. + Enabled: true + VersionAdded: '0.18' + +Lint/RequireRelativeSelfPath: + Description: 'Checks for uses a file requiring itself with `require_relative`.' + Enabled: pending + VersionAdded: '1.22' + +Lint/RescueException: + Description: 'Avoid rescuing the Exception class.' + StyleGuide: '#no-blind-rescues' + Enabled: true + VersionAdded: '0.9' + VersionChanged: '0.27' + +Lint/RescueType: + Description: 'Avoid rescuing from non constants that could result in a `TypeError`.' + Enabled: true + VersionAdded: '0.49' + +Lint/ReturnInVoidContext: + Description: 'Checks for return in void context.' + Enabled: true + VersionAdded: '0.50' + +Lint/SafeNavigationChain: + Description: 'Do not chain ordinary method call after safe navigation operator.' + Enabled: true + VersionAdded: '0.47' + VersionChanged: '0.77' + AllowedMethods: + - present? + - blank? + - presence + - try + - try! + - in? + +Lint/SafeNavigationConsistency: + Description: >- + Check to make sure that if safe navigation is used for a method + call in an `&&` or `||` condition that safe navigation is used + for all method calls on that same object. + Enabled: true + VersionAdded: '0.55' + VersionChanged: '0.77' + AllowedMethods: + - present? + - blank? + - presence + - try + - try! + +Lint/SafeNavigationWithEmpty: + Description: 'Avoid `foo&.empty?` in conditionals.' + Enabled: true + VersionAdded: '0.62' + VersionChanged: '0.87' + +Lint/ScriptPermission: + Description: 'Grant script file execute permission.' + Enabled: true + VersionAdded: '0.49' + VersionChanged: '0.50' + +Lint/SelfAssignment: + Description: 'Checks for self-assignments.' + Enabled: true + VersionAdded: '0.89' + +Lint/SendWithMixinArgument: + Description: 'Checks for `send` method when using mixin.' + Enabled: true + VersionAdded: '0.75' + +Lint/ShadowedArgument: + Description: 'Avoid reassigning arguments before they were used.' + Enabled: true + VersionAdded: '0.52' + IgnoreImplicitReferences: false + + +Lint/ShadowedException: + Description: >- + Avoid rescuing a higher level exception + before a lower level exception. + Enabled: true + VersionAdded: '0.41' + +Lint/ShadowingOuterLocalVariable: + Description: >- + Do not use the same name as outer local variable + for block arguments or block local variables. + Enabled: true + VersionAdded: '0.9' + +Lint/StructNewOverride: + Description: 'Disallow overriding the `Struct` built-in methods via `Struct.new`.' + Enabled: true + VersionAdded: '0.81' + +Lint/SuppressedException: + Description: "Don't suppress exceptions." + StyleGuide: '#dont-hide-exceptions' + Enabled: true + AllowComments: true + AllowNil: true + VersionAdded: '0.9' + VersionChanged: '1.12' + +Lint/SymbolConversion: + Description: 'Checks for unnecessary symbol conversions.' + Enabled: pending + VersionAdded: '1.9' + VersionChanged: '1.16' + EnforcedStyle: strict + SupportedStyles: + - strict + - consistent + +Lint/Syntax: + Description: 'Checks for syntax errors.' + Enabled: true + VersionAdded: '0.9' + +Lint/ToEnumArguments: + Description: 'This cop ensures that `to_enum`/`enum_for`, called for the current method, has correct arguments.' + Enabled: pending + VersionAdded: '1.1' + +Lint/ToJSON: + Description: 'Ensure #to_json includes an optional argument.' + Enabled: true + VersionAdded: '0.66' + +Lint/TopLevelReturnWithArgument: + Description: 'This cop detects top level return statements with argument.' + Enabled: true + VersionAdded: '0.89' + +Lint/TrailingCommaInAttributeDeclaration: + Description: 'This cop checks for trailing commas in attribute declarations.' + Enabled: true + VersionAdded: '0.90' + +Lint/TripleQuotes: + Description: 'Checks for useless triple quote constructs.' + Enabled: pending + VersionAdded: '1.9' + +Lint/UnderscorePrefixedVariableName: + Description: 'Do not use prefix `_` for a variable that is used.' + Enabled: true + VersionAdded: '0.21' + AllowKeywordBlockArguments: false + +Lint/UnexpectedBlockArity: + Description: 'Looks for blocks that have fewer arguments that the calling method expects.' + Enabled: pending + Safe: false + VersionAdded: '1.5' + Methods: + chunk_while: 2 + each_with_index: 2 + each_with_object: 2 + inject: 2 + max: 2 + min: 2 + minmax: 2 + reduce: 2 + slice_when: 2 + sort: 2 + +Lint/UnifiedInteger: + Description: 'Use Integer instead of Fixnum or Bignum.' + Enabled: true + VersionAdded: '0.43' + +Lint/UnmodifiedReduceAccumulator: + Description: Checks for `reduce` or `inject` blocks that do not update the accumulator each iteration. + Enabled: pending + VersionAdded: '1.1' + VersionChanged: '1.5' + +Lint/UnreachableCode: + Description: 'Unreachable code.' + Enabled: true + VersionAdded: '0.9' + +Lint/UnreachableLoop: + Description: 'This cop checks for loops that will have at most one iteration.' + Enabled: true + VersionAdded: '0.89' + VersionChanged: '1.7' + AllowedPatterns: + # RSpec uses `times` in its message expectations + # eg. `exactly(2).times` + - !ruby/regexp /(exactly|at_least|at_most)\(\d+\)\.times/ + IgnoredPatterns: [] # deprecated + +Lint/UnusedBlockArgument: + Description: 'Checks for unused block arguments.' + StyleGuide: '#underscore-unused-vars' + Enabled: true + VersionAdded: '0.21' + VersionChanged: '0.22' + IgnoreEmptyBlocks: true + AllowUnusedKeywordArguments: false + +Lint/UnusedMethodArgument: + Description: 'Checks for unused method arguments.' + StyleGuide: '#underscore-unused-vars' + Enabled: true + VersionAdded: '0.21' + VersionChanged: '0.81' + AllowUnusedKeywordArguments: false + IgnoreEmptyMethods: true + IgnoreNotImplementedMethods: true + +Lint/UriEscapeUnescape: + Description: >- + `URI.escape` method is obsolete and should not be used. Instead, use + `CGI.escape`, `URI.encode_www_form` or `URI.encode_www_form_component` + depending on your specific use case. + Also `URI.unescape` method is obsolete and should not be used. Instead, use + `CGI.unescape`, `URI.decode_www_form` or `URI.decode_www_form_component` + depending on your specific use case. + Enabled: true + VersionAdded: '0.50' + +Lint/UriRegexp: + Description: 'Use `URI::DEFAULT_PARSER.make_regexp` instead of `URI.regexp`.' + Enabled: true + VersionAdded: '0.50' + +Lint/UselessAccessModifier: + Description: 'Checks for useless access modifiers.' + Enabled: true + VersionAdded: '0.20' + VersionChanged: '0.83' + ContextCreatingMethods: [] + MethodCreatingMethods: [] + +Lint/UselessAssignment: + Description: 'Checks for useless assignment to a local variable.' + StyleGuide: '#underscore-unused-vars' + Enabled: true + VersionAdded: '0.11' + +Lint/UselessElseWithoutRescue: + Description: 'Checks for useless `else` in `begin..end` without `rescue`.' + Enabled: true + VersionAdded: '0.17' + +Lint/UselessMethodDefinition: + Description: 'Checks for useless method definitions.' + Enabled: true + VersionAdded: '0.90' + VersionChanged: '0.91' + Safe: false + +Lint/UselessRuby2Keywords: + Description: 'Finds unnecessary uses of `ruby2_keywords`.' + Enabled: pending + VersionAdded: '1.23' + +Lint/UselessSetterCall: + Description: 'Checks for useless setter call to a local variable.' + Enabled: true + SafeAutoCorrect: false + VersionAdded: '0.13' + VersionChanged: '1.2' + Safe: false + +Lint/UselessTimes: + Description: 'Checks for useless `Integer#times` calls.' + Enabled: true + VersionAdded: '0.91' + Safe: false + +Lint/Void: + Description: 'Possible use of operator/literal/variable in void context.' + Enabled: true + VersionAdded: '0.9' + CheckForMethodsWithNoSideEffects: false + +#################### Metrics ############################### + +Metrics/AbcSize: + Description: >- + A calculated magnitude based on number of assignments, + branches, and conditions. + Reference: + - http://c2.com/cgi/wiki?AbcMetric + - https://en.wikipedia.org/wiki/ABC_Software_Metric + Enabled: true + VersionAdded: '0.27' + VersionChanged: '1.5' + # The ABC size is a calculated magnitude, so this number can be an Integer or + # a Float. + IgnoredMethods: [] + CountRepeatedAttributes: true + Max: 17 + +Metrics/BlockLength: + Description: 'Avoid long blocks with many lines.' + Enabled: true + VersionAdded: '0.44' + VersionChanged: '1.5' + CountComments: false # count full line comments? + Max: 25 + CountAsOne: [] + ExcludedMethods: [] # deprecated, retained for backwards compatibility + IgnoredMethods: + # By default, exclude the `#refine` method, as it tends to have larger + # associated blocks. + - refine + Exclude: + - '**/*.gemspec' + +Metrics/BlockNesting: + Description: 'Avoid excessive block nesting.' + StyleGuide: '#three-is-the-number-thou-shalt-count' + Enabled: true + VersionAdded: '0.25' + VersionChanged: '0.47' + CountBlocks: false + Max: 3 + +Metrics/ClassLength: + Description: 'Avoid classes longer than 100 lines of code.' + Enabled: true + VersionAdded: '0.25' + VersionChanged: '0.87' + CountComments: false # count full line comments? + Max: 100 + CountAsOne: [] + +# Avoid complex methods. +Metrics/CyclomaticComplexity: + Description: >- + A complexity metric that is strongly correlated to the number + of test cases needed to validate a method. + Enabled: true + VersionAdded: '0.25' + VersionChanged: '0.81' + IgnoredMethods: [] + Max: 7 + +Metrics/MethodLength: + Description: 'Avoid methods longer than 10 lines of code.' + StyleGuide: '#short-methods' + Enabled: true + VersionAdded: '0.25' + VersionChanged: '1.5' + CountComments: false # count full line comments? + Max: 10 + CountAsOne: [] + ExcludedMethods: [] # deprecated, retained for backwards compatibility + IgnoredMethods: [] + +Metrics/ModuleLength: + Description: 'Avoid modules longer than 100 lines of code.' + Enabled: true + VersionAdded: '0.31' + VersionChanged: '0.87' + CountComments: false # count full line comments? + Max: 100 + CountAsOne: [] + +Metrics/ParameterLists: + Description: 'Avoid parameter lists longer than three or four parameters.' + StyleGuide: '#too-many-params' + Enabled: true + VersionAdded: '0.25' + VersionChanged: '1.5' + Max: 5 + CountKeywordArgs: true + MaxOptionalParameters: 3 + +Metrics/PerceivedComplexity: + Description: >- + A complexity metric geared towards measuring complexity for a + human reader. + Enabled: true + VersionAdded: '0.25' + VersionChanged: '0.81' + IgnoredMethods: [] + Max: 8 + +################## Migration ############################# + +Migration/DepartmentName: + Description: >- + Check that cop names in rubocop:disable (etc) comments are + given with department name. + Enabled: true + VersionAdded: '0.75' + +#################### Naming ############################## + +Naming/AccessorMethodName: + Description: Check the naming of accessor methods for get_/set_. + StyleGuide: '#accessor_mutator_method_names' + Enabled: true + VersionAdded: '0.50' + +Naming/AsciiIdentifiers: + Description: 'Use only ascii symbols in identifiers and constants.' + StyleGuide: '#english-identifiers' + Enabled: true + VersionAdded: '0.50' + VersionChanged: '0.87' + AsciiConstants: true + +Naming/BinaryOperatorParameterName: + Description: 'When defining binary operators, name the argument other.' + StyleGuide: '#other-arg' + Enabled: true + VersionAdded: '0.50' + VersionChanged: '1.2' + +Naming/BlockForwarding: + Description: 'Use anonymous block forwarding.' + StyleGuide: '#block-forwarding' + Enabled: pending + VersionAdded: '1.24' + EnforcedStyle: anonymous + SupportedStyles: + - anonymous + - explicit + BlockForwardingName: block + +Naming/BlockParameterName: + Description: >- + Checks for block parameter names that contain capital letters, + end in numbers, or do not meet a minimal length. + Enabled: true + VersionAdded: '0.53' + VersionChanged: '0.77' + # Parameter names may be equal to or greater than this value + MinNameLength: 1 + AllowNamesEndingInNumbers: true + # Allowed names that will not register an offense + AllowedNames: [] + # Forbidden names that will register an offense + ForbiddenNames: [] + +Naming/ClassAndModuleCamelCase: + Description: 'Use CamelCase for classes and modules.' + StyleGuide: '#camelcase-classes' + Enabled: true + VersionAdded: '0.50' + VersionChanged: '0.85' + # Allowed class/module names can be specified here. + # These can be full or part of the name. + AllowedNames: + - module_parent + +Naming/ConstantName: + Description: 'Constants should use SCREAMING_SNAKE_CASE.' + StyleGuide: '#screaming-snake-case' + Enabled: true + VersionAdded: '0.50' + +Naming/FileName: + Description: 'Use snake_case for source file names.' + StyleGuide: '#snake-case-files' + Enabled: true + VersionAdded: '0.50' + VersionChanged: '1.23' + # Camel case file names listed in `AllCops:Include` and all file names listed + # in `AllCops:Exclude` are excluded by default. Add extra excludes here. + Exclude: [] + # When `true`, requires that each source file should define a class or module + # with a name which matches the file name (converted to ... case). + # It further expects it to be nested inside modules which match the names + # of subdirectories in its path. + ExpectMatchingDefinition: false + # When `false`, changes the behavior of ExpectMatchingDefinition to match only + # whether each source file's class or module name matches the file name -- + # not whether the nested module hierarchy matches the subdirectory path. + CheckDefinitionPathHierarchy: true + # paths that are considered root directories, for example "lib" in most ruby projects + # or "app/models" in rails projects + CheckDefinitionPathHierarchyRoots: + - lib + - spec + - test + - src + # If non-`nil`, expect all source file names to match the following regex. + # Only the file name itself is matched, not the entire file path. + # Use anchors as necessary if you want to match the entire name rather than + # just a part of it. + Regex: ~ + # With `IgnoreExecutableScripts` set to `true`, this cop does not + # report offending filenames for executable scripts (i.e. source + # files with a shebang in the first line). + IgnoreExecutableScripts: true + AllowedAcronyms: + - CLI + - DSL + - ACL + - API + - ASCII + - CPU + - CSS + - DNS + - EOF + - GUID + - HTML + - HTTP + - HTTPS + - ID + - IP + - JSON + - LHS + - QPS + - RAM + - RHS + - RPC + - SLA + - SMTP + - SQL + - SSH + - TCP + - TLS + - TTL + - UDP + - UI + - UID + - UUID + - URI + - URL + - UTF8 + - VM + - XML + - XMPP + - XSRF + - XSS + +Naming/HeredocDelimiterCase: + Description: 'Use configured case for heredoc delimiters.' + StyleGuide: '#heredoc-delimiters' + Enabled: true + VersionAdded: '0.50' + VersionChanged: '1.2' + EnforcedStyle: uppercase + SupportedStyles: + - lowercase + - uppercase + +Naming/HeredocDelimiterNaming: + Description: 'Use descriptive heredoc delimiters.' + StyleGuide: '#heredoc-delimiters' + Enabled: true + VersionAdded: '0.50' + ForbiddenDelimiters: + - !ruby/regexp '/(^|\s)(EO[A-Z]{1}|END)(\s|$)/' + +Naming/InclusiveLanguage: + Description: 'Recommend the use of inclusive language instead of problematic terms.' + Enabled: false + VersionAdded: '1.18' + VersionChanged: '1.21' + CheckIdentifiers: true + CheckConstants: true + CheckVariables: true + CheckStrings: false + CheckSymbols: true + CheckComments: true + CheckFilepaths: true + FlaggedTerms: + whitelist: + Regex: !ruby/regexp '/white[-_\s]?list/' + Suggestions: + - allowlist + - permit + blacklist: + Regex: !ruby/regexp '/black[-_\s]?list/' + Suggestions: + - denylist + - block + slave: + WholeWord: true + Suggestions: ['replica', 'secondary', 'follower'] + +Naming/MemoizedInstanceVariableName: + Description: >- + Memoized method name should match memo instance variable name. + Enabled: true + VersionAdded: '0.53' + VersionChanged: '1.2' + EnforcedStyleForLeadingUnderscores: disallowed + SupportedStylesForLeadingUnderscores: + - disallowed + - required + - optional + Safe: false + +Naming/MethodName: + Description: 'Use the configured style when naming methods.' + StyleGuide: '#snake-case-symbols-methods-vars' + Enabled: true + VersionAdded: '0.50' + EnforcedStyle: snake_case + SupportedStyles: + - snake_case + - camelCase + # Method names matching patterns are always allowed. + # + # AllowedPatterns: + # - '\A\s*onSelectionBulkChange\s*' + # - '\A\s*onSelectionCleared\s*' + # + AllowedPatterns: [] + IgnoredPatterns: [] # deprecated + +Naming/MethodParameterName: + Description: >- + Checks for method parameter names that contain capital letters, + end in numbers, or do not meet a minimal length. + Enabled: true + VersionAdded: '0.53' + VersionChanged: '0.77' + # Parameter names may be equal to or greater than this value + MinNameLength: 3 + AllowNamesEndingInNumbers: true + # Allowed names that will not register an offense + AllowedNames: + - at + - by + - db + - id + - in + - io + - ip + - of + - 'on' + - os + - pp + - to + # Forbidden names that will register an offense + ForbiddenNames: [] + +Naming/PredicateName: + Description: 'Check the names of predicate methods.' + StyleGuide: '#bool-methods-qmark' + Enabled: true + VersionAdded: '0.50' + VersionChanged: '0.77' + # Predicate name prefixes. + NamePrefix: + - is_ + - has_ + - have_ + # Predicate name prefixes that should be removed. + ForbiddenPrefixes: + - is_ + - has_ + - have_ + # Predicate names which, despite having a forbidden prefix, or no `?`, + # should still be accepted + AllowedMethods: + - is_a? + # Method definition macros for dynamically generated methods. + MethodDefinitionMacros: + - define_method + - define_singleton_method + # Exclude Rspec specs because there is a strong convention to write spec + # helpers in the form of `have_something` or `be_something`. + Exclude: + - 'spec/**/*' + +Naming/RescuedExceptionsVariableName: + Description: 'Use consistent rescued exceptions variables naming.' + Enabled: true + VersionAdded: '0.67' + VersionChanged: '0.68' + PreferredName: e + +Naming/VariableName: + Description: 'Use the configured style when naming variables.' + StyleGuide: '#snake-case-symbols-methods-vars' + Enabled: true + VersionAdded: '0.50' + VersionChanged: '1.8' + EnforcedStyle: snake_case + SupportedStyles: + - snake_case + - camelCase + AllowedIdentifiers: [] + +Naming/VariableNumber: + Description: 'Use the configured style when numbering symbols, methods and variables.' + StyleGuide: '#snake-case-symbols-methods-vars-with-numbers' + Enabled: true + VersionAdded: '0.50' + VersionChanged: '1.4' + EnforcedStyle: normalcase + SupportedStyles: + - snake_case + - normalcase + - non_integer + CheckMethodNames: true + CheckSymbols: true + AllowedIdentifiers: + - capture3 # Open3.capture3 + - iso8601 # Time#iso8601 + - rfc1123_date # CGI.rfc1123_date + - rfc822 # Time#rfc822 + - rfc2822 # Time#rfc2822 + - rfc3339 # DateTime.rfc3339 + +#################### Security ############################## + +Security/CompoundHash: + Description: 'When overwriting Object#hash to combine values, prefer delegating to Array#hash over writing a custom implementation.' + Enabled: pending + VersionAdded: '1.28' + +Security/Eval: + Description: 'The use of eval represents a serious security risk.' + Enabled: true + VersionAdded: '0.47' + +Security/IoMethods: + Description: >- + Checks for the first argument to `IO.read`, `IO.binread`, `IO.write`, `IO.binwrite`, + `IO.foreach`, and `IO.readlines`. + Enabled: pending + Safe: false + VersionAdded: '1.22' + +Security/JSONLoad: + Description: >- + Prefer usage of `JSON.parse` over `JSON.load` due to potential + security issues. See reference for more information. + Reference: 'https://ruby-doc.org/stdlib-2.7.0/libdoc/json/rdoc/JSON.html#method-i-load' + Enabled: true + VersionAdded: '0.43' + VersionChanged: '1.22' + # Autocorrect here will change to a method that may cause crashes depending + # on the value of the argument. + SafeAutoCorrect: false + +Security/MarshalLoad: + Description: >- + Avoid using of `Marshal.load` or `Marshal.restore` due to potential + security issues. See reference for more information. + Reference: 'https://ruby-doc.org/core-2.7.0/Marshal.html#module-Marshal-label-Security+considerations' + Enabled: true + VersionAdded: '0.47' + +Security/Open: + Description: 'The use of `Kernel#open` and `URI.open` represent a serious security risk.' + Enabled: true + VersionAdded: '0.53' + VersionChanged: '1.0' + Safe: false + +Security/YAMLLoad: + Description: >- + Prefer usage of `YAML.safe_load` over `YAML.load` due to potential + security issues. See reference for more information. + Reference: 'https://ruby-doc.org/stdlib-2.7.0/libdoc/yaml/rdoc/YAML.html#module-YAML-label-Security' + Enabled: true + VersionAdded: '0.47' + SafeAutoCorrect: false + +#################### Style ############################### + +Style/AccessModifierDeclarations: + Description: 'Checks style of how access modifiers are used.' + Enabled: true + VersionAdded: '0.57' + VersionChanged: '0.81' + EnforcedStyle: group + SupportedStyles: + - inline + - group + AllowModifiersOnSymbols: true + +Style/AccessorGrouping: + Description: 'Checks for grouping of accessors in `class` and `module` bodies.' + Enabled: true + VersionAdded: '0.87' + EnforcedStyle: grouped + SupportedStyles: + # separated: each accessor goes in a separate statement. + # grouped: accessors are grouped into a single statement. + - separated + - grouped + +Style/Alias: + Description: 'Use alias instead of alias_method.' + StyleGuide: '#alias-method-lexically' + Enabled: true + VersionAdded: '0.9' + VersionChanged: '0.36' + EnforcedStyle: prefer_alias + SupportedStyles: + - prefer_alias + - prefer_alias_method + +Style/AndOr: + Description: 'Use &&/|| instead of and/or.' + StyleGuide: '#no-and-or-or' + Enabled: true + SafeAutoCorrect: false + VersionAdded: '0.9' + VersionChanged: '1.21' + # Whether `and` and `or` are banned only in conditionals (conditionals) + # or completely (always). + EnforcedStyle: conditionals + SupportedStyles: + - always + - conditionals + +Style/ArgumentsForwarding: + Description: 'Use arguments forwarding.' + StyleGuide: '#arguments-forwarding' + Enabled: pending + AllowOnlyRestArgument: true + VersionAdded: '1.1' + +Style/ArrayCoercion: + Description: >- + Use Array() instead of explicit Array check or [*var], when dealing + with a variable you want to treat as an Array, but you're not certain it's an array. + StyleGuide: '#array-coercion' + Safe: false + Enabled: false + VersionAdded: '0.88' + +Style/ArrayJoin: + Description: 'Use Array#join instead of Array#*.' + StyleGuide: '#array-join' + Enabled: true + VersionAdded: '0.20' + VersionChanged: '0.31' + +Style/AsciiComments: + Description: 'Use only ascii symbols in comments.' + StyleGuide: '#english-comments' + Enabled: false + VersionAdded: '0.9' + VersionChanged: '1.21' + AllowedChars: + - © + +Style/Attr: + Description: 'Checks for uses of Module#attr.' + StyleGuide: '#attr' + Enabled: true + VersionAdded: '0.9' + VersionChanged: '0.12' + +Style/AutoResourceCleanup: + Description: 'Suggests the usage of an auto resource cleanup version of a method (if available).' + Enabled: false + VersionAdded: '0.30' + +Style/BarePercentLiterals: + Description: 'Checks if usage of %() or %Q() matches configuration.' + StyleGuide: '#percent-q-shorthand' + Enabled: true + VersionAdded: '0.25' + EnforcedStyle: bare_percent + SupportedStyles: + - percent_q + - bare_percent + +Style/BeginBlock: + Description: 'Avoid the use of BEGIN blocks.' + StyleGuide: '#no-BEGIN-blocks' + Enabled: true + VersionAdded: '0.9' + +Style/BisectedAttrAccessor: + Description: >- + Checks for places where `attr_reader` and `attr_writer` + for the same method can be combined into single `attr_accessor`. + Enabled: true + VersionAdded: '0.87' + +Style/BlockComments: + Description: 'Do not use block comments.' + StyleGuide: '#no-block-comments' + Enabled: true + VersionAdded: '0.9' + VersionChanged: '0.23' + +Style/BlockDelimiters: + Description: >- + Avoid using {...} for multi-line blocks (multiline chaining is + always ugly). + Prefer {...} over do...end for single-line blocks. + StyleGuide: '#single-line-blocks' + Enabled: true + VersionAdded: '0.30' + VersionChanged: '0.35' + EnforcedStyle: line_count_based + SupportedStyles: + # The `line_count_based` style enforces braces around single line blocks and + # do..end around multi-line blocks. + - line_count_based + # The `semantic` style enforces braces around functional blocks, where the + # primary purpose of the block is to return a value and do..end for + # multi-line procedural blocks, where the primary purpose of the block is + # its side-effects. Single-line procedural blocks may only use do-end, + # unless AllowBracesOnProceduralOneLiners has a truthy value (see below). + # + # This looks at the usage of a block's method to determine its type (e.g. is + # the result of a `map` assigned to a variable or passed to another + # method) but exceptions are permitted in the `ProceduralMethods`, + # `FunctionalMethods` and `IgnoredMethods` sections below. + - semantic + # The `braces_for_chaining` style enforces braces around single line blocks + # and do..end around multi-line blocks, except for multi-line blocks whose + # return value is being chained with another method (in which case braces + # are enforced). + - braces_for_chaining + # The `always_braces` style always enforces braces. + - always_braces + ProceduralMethods: + # Methods that are known to be procedural in nature but look functional from + # their usage, e.g. + # + # time = Benchmark.realtime do + # foo.bar + # end + # + # Here, the return value of the block is discarded but the return value of + # `Benchmark.realtime` is used. + - benchmark + - bm + - bmbm + - create + - each_with_object + - measure + - new + - realtime + - tap + - with_object + FunctionalMethods: + # Methods that are known to be functional in nature but look procedural from + # their usage, e.g. + # + # let(:foo) { Foo.new } + # + # Here, the return value of `Foo.new` is used to define a `foo` helper but + # doesn't appear to be used from the return value of `let`. + - let + - let! + - subject + - watch + IgnoredMethods: + # Methods that can be either procedural or functional and cannot be + # categorised from their usage alone, e.g. + # + # foo = lambda do |x| + # puts "Hello, #{x}" + # end + # + # foo = lambda do |x| + # x * 100 + # end + # + # Here, it is impossible to tell from the return value of `lambda` whether + # the inner block's return value is significant. + - lambda + - proc + - it + # The AllowBracesOnProceduralOneLiners option is ignored unless the + # EnforcedStyle is set to `semantic`. If so: + # + # If AllowBracesOnProceduralOneLiners is unspecified, or set to any + # falsey value, then semantic purity is maintained, so one-line + # procedural blocks must use do-end, not braces. + # + # # bad + # collection.each { |element| puts element } + # + # # good + # collection.each do |element| puts element end + # + # If AllowBracesOnProceduralOneLiners is set to any truthy value, + # then one-line procedural blocks may use either style. + # + # # good + # collection.each { |element| puts element } + # + # # also good + # collection.each do |element| puts element end + AllowBracesOnProceduralOneLiners: false + # The BracesRequiredMethods overrides all other configurations except + # IgnoredMethods. It can be used to enforce that all blocks for specific + # methods use braces. For example, you can use this to enforce Sorbet + # signatures use braces even when the rest of your codebase enforces + # the `line_count_based` style. + BracesRequiredMethods: [] + +Style/CaseEquality: + Description: 'Avoid explicit use of the case equality operator(===).' + StyleGuide: '#no-case-equality' + Enabled: true + VersionAdded: '0.9' + VersionChanged: '0.89' + # If `AllowOnConstant` option is enabled, the cop will ignore violations when the receiver of + # the case equality operator is a constant. + # + # # bad + # /string/ === "string" + # + # # good + # String === "string" + AllowOnConstant: false + +Style/CaseLikeIf: + Description: 'This cop identifies places where `if-elsif` constructions can be replaced with `case-when`.' + StyleGuide: '#case-vs-if-else' + Enabled: true + Safe: false + VersionAdded: '0.88' + +Style/CharacterLiteral: + Description: 'Checks for uses of character literals.' + StyleGuide: '#no-character-literals' + Enabled: true + VersionAdded: '0.9' + +Style/ClassAndModuleChildren: + Description: 'Checks style of children classes and modules.' + StyleGuide: '#namespace-definition' + # Moving from compact to nested children requires knowledge of whether the + # outer parent is a module or a class. Moving from nested to compact requires + # verification that the outer parent is defined elsewhere. Rubocop does not + # have the knowledge to perform either operation safely and thus requires + # manual oversight. + SafeAutoCorrect: false + Enabled: true + VersionAdded: '0.19' + # + # Basically there are two different styles: + # + # `nested` - have each child on a separate line + # class Foo + # class Bar + # end + # end + # + # `compact` - combine definitions as much as possible + # class Foo::Bar + # end + # + # The compact style is only forced, for classes or modules with one child. + EnforcedStyle: nested + SupportedStyles: + - nested + - compact + +Style/ClassCheck: + Description: 'Enforces consistent use of `Object#is_a?` or `Object#kind_of?`.' + StyleGuide: '#is-a-vs-kind-of' + Enabled: true + VersionAdded: '0.24' + EnforcedStyle: is_a? + SupportedStyles: + - is_a? + - kind_of? + +Style/ClassEqualityComparison: + Description: 'Enforces the use of `Object#instance_of?` instead of class comparison for equality.' + StyleGuide: '#instance-of-vs-class-comparison' + Enabled: true + VersionAdded: '0.93' + IgnoredMethods: + - == + - equal? + - eql? + +Style/ClassMethods: + Description: 'Use self when defining module/class methods.' + StyleGuide: '#def-self-class-methods' + Enabled: true + VersionAdded: '0.9' + VersionChanged: '0.20' + +Style/ClassMethodsDefinitions: + Description: 'Enforces using `def self.method_name` or `class << self` to define class methods.' + StyleGuide: '#def-self-class-methods' + Enabled: false + VersionAdded: '0.89' + EnforcedStyle: def_self + SupportedStyles: + - def_self + - self_class + +Style/ClassVars: + Description: 'Avoid the use of class variables.' + StyleGuide: '#no-class-vars' + Enabled: true + VersionAdded: '0.13' + +Style/CollectionCompact: + Description: 'Use `{Array,Hash}#{compact,compact!}` instead of custom logic to reject nils.' + Enabled: pending + Safe: false + VersionAdded: '1.2' + VersionChanged: '1.3' + +# Align with the style guide. +Style/CollectionMethods: + Description: 'Preferred collection methods.' + StyleGuide: '#map-find-select-reduce-include-size' + Enabled: false + VersionAdded: '0.9' + VersionChanged: '1.7' + Safe: false + # Mapping from undesired method to desired method + # e.g. to use `detect` over `find`: + # + # Style/CollectionMethods: + # PreferredMethods: + # find: detect + PreferredMethods: + collect: 'map' + collect!: 'map!' + inject: 'reduce' + detect: 'find' + find_all: 'select' + member?: 'include?' + # Methods in this array accept a final symbol as an implicit block + # eg. `inject(:+)` + MethodsAcceptingSymbol: + - inject + - reduce + +Style/ColonMethodCall: + Description: 'Do not use :: for method call.' + StyleGuide: '#double-colons' + Enabled: true + VersionAdded: '0.9' + +Style/ColonMethodDefinition: + Description: 'Do not use :: for defining class methods.' + StyleGuide: '#colon-method-definition' + Enabled: true + VersionAdded: '0.52' + +Style/CombinableLoops: + Description: >- + Checks for places where multiple consecutive loops over the same data + can be combined into a single loop. + Enabled: true + Safe: false + VersionAdded: '0.90' + +Style/CommandLiteral: + Description: 'Use `` or %x around command literals.' + StyleGuide: '#percent-x' + Enabled: true + VersionAdded: '0.30' + EnforcedStyle: backticks + # backticks: Always use backticks. + # percent_x: Always use `%x`. + # mixed: Use backticks on single-line commands, and `%x` on multi-line commands. + SupportedStyles: + - backticks + - percent_x + - mixed + # If `false`, the cop will always recommend using `%x` if one or more backticks + # are found in the command string. + AllowInnerBackticks: false + +# Checks formatting of special comments +Style/CommentAnnotation: + Description: >- + Checks formatting of special comments + (TODO, FIXME, OPTIMIZE, HACK, REVIEW, NOTE). + StyleGuide: '#annotate-keywords' + Enabled: true + VersionAdded: '0.10' + VersionChanged: '1.20' + Keywords: + - TODO + - FIXME + - OPTIMIZE + - HACK + - REVIEW + - NOTE + RequireColon: true + +Style/CommentedKeyword: + Description: 'Do not place comments on the same line as certain keywords.' + Enabled: true + SafeAutoCorrect: false + VersionAdded: '0.51' + VersionChanged: '1.19' + +Style/ConditionalAssignment: + Description: >- + Use the return value of `if` and `case` statements for + assignment to a variable and variable comparison instead + of assigning that variable inside of each branch. + Enabled: true + VersionAdded: '0.36' + VersionChanged: '0.47' + EnforcedStyle: assign_to_condition + SupportedStyles: + - assign_to_condition + - assign_inside_condition + # When configured to `assign_to_condition`, `SingleLineConditionsOnly` + # will only register an offense when all branches of a condition are + # a single line. + # When configured to `assign_inside_condition`, `SingleLineConditionsOnly` + # will only register an offense for assignment to a condition that has + # at least one multiline branch. + SingleLineConditionsOnly: true + IncludeTernaryExpressions: true + +Style/ConstantVisibility: + Description: >- + Check that class- and module constants have + visibility declarations. + Enabled: false + VersionAdded: '0.66' + VersionChanged: '1.10' + IgnoreModules: false + +# Checks that you have put a copyright in a comment before any code. +# +# You can override the default Notice in your .rubocop.yml file. +# +# In order to use autocorrect, you must supply a value for the +# `AutocorrectNotice` key that matches the regexp Notice. A blank +# `AutocorrectNotice` will cause an error during autocorrect. +# +# Autocorrect will add a copyright notice in a comment at the top +# of the file immediately after any shebang or encoding comments. +# +# Example rubocop.yml: +# +# Style/Copyright: +# Enabled: true +# Notice: 'Copyright (\(c\) )?2015 Yahoo! Inc' +# AutocorrectNotice: '# Copyright (c) 2015 Yahoo! Inc.' +# +Style/Copyright: + Description: 'Include a copyright notice in each file before any code.' + Enabled: false + VersionAdded: '0.30' + Notice: '^Copyright (\(c\) )?2[0-9]{3} .+' + AutocorrectNotice: '' + +Style/DateTime: + Description: 'Use Time over DateTime.' + StyleGuide: '#date--time' + Enabled: false + VersionAdded: '0.51' + VersionChanged: '0.92' + SafeAutoCorrect: false + AllowCoercion: false + +Style/DefWithParentheses: + Description: 'Use def with parentheses when there are arguments.' + StyleGuide: '#method-parens' + Enabled: true + VersionAdded: '0.9' + VersionChanged: '0.12' + +Style/Dir: + Description: >- + Use the `__dir__` method to retrieve the canonicalized + absolute path to the current file. + Enabled: true + VersionAdded: '0.50' + +Style/DisableCopsWithinSourceCodeDirective: + Description: >- + Forbids disabling/enabling cops within source code. + Enabled: false + VersionAdded: '0.82' + VersionChanged: '1.9' + AllowedCops: [] + +Style/DocumentDynamicEvalDefinition: + Description: >- + When using `class_eval` (or other `eval`) with string interpolation, + add a comment block showing its appearance if interpolated. + StyleGuide: '#eval-comment-docs' + Enabled: pending + VersionAdded: '1.1' + VersionChanged: '1.3' + +Style/Documentation: + Description: 'Document classes and non-namespace modules.' + Enabled: true + VersionAdded: '0.9' + AllowedConstants: [] + Exclude: + - 'spec/**/*' + - 'test/**/*' + +Style/DocumentationMethod: + Description: 'Checks for missing documentation comment for public methods.' + Enabled: false + VersionAdded: '0.43' + Exclude: + - 'spec/**/*' + - 'test/**/*' + RequireForNonPublicMethods: false + +Style/DoubleCopDisableDirective: + Description: 'Checks for double rubocop:disable comments on a single line.' + Enabled: true + VersionAdded: '0.73' + +Style/DoubleNegation: + Description: 'Checks for uses of double negation (!!).' + StyleGuide: '#no-bang-bang' + Enabled: true + VersionAdded: '0.19' + VersionChanged: '1.2' + EnforcedStyle: allowed_in_returns + SafeAutoCorrect: false + SupportedStyles: + - allowed_in_returns + - forbidden + +Style/EachForSimpleLoop: + Description: >- + Use `Integer#times` for a simple loop which iterates a fixed + number of times. + Enabled: true + VersionAdded: '0.41' + +Style/EachWithObject: + Description: 'Prefer `each_with_object` over `inject` or `reduce`.' + Enabled: true + VersionAdded: '0.22' + VersionChanged: '0.42' + +Style/EmptyBlockParameter: + Description: 'Omit pipes for empty block parameters.' + Enabled: true + VersionAdded: '0.52' + +Style/EmptyCaseCondition: + Description: 'Avoid empty condition in case statements.' + Enabled: true + VersionAdded: '0.40' + +Style/EmptyElse: + Description: 'Avoid empty else-clauses.' + Enabled: true + VersionAdded: '0.28' + VersionChanged: '0.32' + EnforcedStyle: both + # empty - warn only on empty `else` + # nil - warn on `else` with nil in it + # both - warn on empty `else` and `else` with `nil` in it + SupportedStyles: + - empty + - nil + - both + +Style/EmptyLambdaParameter: + Description: 'Omit parens for empty lambda parameters.' + Enabled: true + VersionAdded: '0.52' + +Style/EmptyLiteral: + Description: 'Prefer literals to Array.new/Hash.new/String.new.' + StyleGuide: '#literal-array-hash' + Enabled: true + VersionAdded: '0.9' + VersionChanged: '0.12' + +Style/EmptyMethod: + Description: 'Checks the formatting of empty method definitions.' + StyleGuide: '#no-single-line-methods' + Enabled: true + VersionAdded: '0.46' + EnforcedStyle: compact + SupportedStyles: + - compact + - expanded + +Style/Encoding: + Description: 'Use UTF-8 as the source file encoding.' + StyleGuide: '#utf-8' + Enabled: true + VersionAdded: '0.9' + VersionChanged: '0.50' + +Style/EndBlock: + Description: 'Avoid the use of END blocks.' + StyleGuide: '#no-END-blocks' + Enabled: true + VersionAdded: '0.9' + VersionChanged: '0.81' + +Style/EndlessMethod: + Description: 'Avoid the use of multi-lined endless method definitions.' + StyleGuide: '#endless-methods' + Enabled: pending + VersionAdded: '1.8' + EnforcedStyle: allow_single_line + SupportedStyles: + - allow_single_line + - allow_always + - disallow + +Style/EvalWithLocation: + Description: 'Pass `__FILE__` and `__LINE__` to `eval` method, as they are used by backtraces.' + Enabled: true + VersionAdded: '0.52' + +Style/EvenOdd: + Description: 'Favor the use of `Integer#even?` && `Integer#odd?`.' + StyleGuide: '#predicate-methods' + Enabled: true + VersionAdded: '0.12' + VersionChanged: '0.29' + +Style/ExpandPathArguments: + Description: "Use `expand_path(__dir__)` instead of `expand_path('..', __FILE__)`." + Enabled: true + VersionAdded: '0.53' + +Style/ExplicitBlockArgument: + Description: >- + Consider using explicit block argument to avoid writing block literal + that just passes its arguments to another block. + StyleGuide: '#block-argument' + Enabled: true + VersionAdded: '0.89' + VersionChanged: '1.8' + +Style/ExponentialNotation: + Description: 'When using exponential notation, favor a mantissa between 1 (inclusive) and 10 (exclusive).' + StyleGuide: '#exponential-notation' + Enabled: true + VersionAdded: '0.82' + EnforcedStyle: scientific + SupportedStyles: + - scientific + - engineering + - integral + +Style/FetchEnvVar: + Description: >- + This cop suggests `ENV.fetch` for the replacement of `ENV[]`. + Reference: + - https://rubystyle.guide/#hash-fetch-defaults + Enabled: pending + VersionAdded: '1.28' + # Environment variables to be excluded from the inspection. + AllowedVars: [] + +Style/FileRead: + Description: 'Favor `File.(bin)read` convenience methods.' + StyleGuide: '#file-read' + Enabled: pending + VersionAdded: '1.24' + +Style/FileWrite: + Description: 'Favor `File.(bin)write` convenience methods.' + StyleGuide: '#file-write' + Enabled: pending + VersionAdded: '1.24' + +Style/FloatDivision: + Description: 'For performing float division, coerce one side only.' + StyleGuide: '#float-division' + Reference: 'https://blog.rubystyle.guide/ruby/2019/06/21/float-division.html' + Enabled: true + VersionAdded: '0.72' + VersionChanged: '1.9' + Safe: false + EnforcedStyle: single_coerce + SupportedStyles: + - left_coerce + - right_coerce + - single_coerce + - fdiv + +Style/For: + Description: 'Checks use of for or each in multiline loops.' + StyleGuide: '#no-for-loops' + Enabled: true + SafeAutoCorrect: false + VersionAdded: '0.13' + VersionChanged: '1.26' + EnforcedStyle: each + SupportedStyles: + - each + - for + +Style/FormatString: + Description: 'Enforce the use of Kernel#sprintf, Kernel#format or String#%.' + StyleGuide: '#sprintf' + Enabled: true + VersionAdded: '0.19' + VersionChanged: '0.49' + EnforcedStyle: format + SupportedStyles: + - format + - sprintf + - percent + +Style/FormatStringToken: + Description: 'Use a consistent style for format string tokens.' + Enabled: true + EnforcedStyle: annotated + SupportedStyles: + # Prefer tokens which contain a sprintf like type annotation like + # `%s`, `%d`, `%f` + - annotated + # Prefer simple looking "template" style tokens like `%{name}`, `%{age}` + - template + - unannotated + # `MaxUnannotatedPlaceholdersAllowed` defines the number of `unannotated` + # style token in a format string to be allowed when enforced style is not + # `unannotated`. + MaxUnannotatedPlaceholdersAllowed: 1 + VersionAdded: '0.49' + VersionChanged: '1.0' + IgnoredMethods: [] + +Style/FrozenStringLiteralComment: + Description: >- + Add the frozen_string_literal comment to the top of files + to help transition to frozen string literals by default. + Enabled: true + VersionAdded: '0.36' + VersionChanged: '0.79' + EnforcedStyle: always + SupportedStyles: + # `always` will always add the frozen string literal comment to a file + # regardless of the Ruby version or if `freeze` or `<<` are called on a + # string literal. It is possible that this will create errors. + - always + # `always_true` will add the frozen string literal comment to a file, + # similarly to the `always` style, but will also change any disabled + # comments (e.g. `# frozen_string_literal: false`) to be enabled. + - always_true + # `never` will enforce that the frozen string literal comment does not + # exist in a file. + - never + SafeAutoCorrect: false + +Style/GlobalStdStream: + Description: 'Enforces the use of `$stdout/$stderr/$stdin` instead of `STDOUT/STDERR/STDIN`.' + StyleGuide: '#global-stdout' + Enabled: true + VersionAdded: '0.89' + SafeAutoCorrect: false + +Style/GlobalVars: + Description: 'Do not introduce global variables.' + StyleGuide: '#instance-vars' + Reference: 'https://www.zenspider.com/ruby/quickref.html' + Enabled: true + VersionAdded: '0.13' + # Built-in global variables are allowed by default. + AllowedVariables: [] + +Style/GuardClause: + Description: 'Check for conditionals that can be replaced with guard clauses.' + StyleGuide: '#no-nested-conditionals' + Enabled: true + VersionAdded: '0.20' + VersionChanged: '1.28' + # `MinBodyLength` defines the number of lines of the a body of an `if` or `unless` + # needs to have to trigger this cop + MinBodyLength: 1 + AllowConsecutiveConditionals: false + +Style/HashAsLastArrayItem: + Description: >- + Checks for presence or absence of braces around hash literal as a last + array item depending on configuration. + StyleGuide: '#hash-literal-as-last-array-item' + Enabled: true + VersionAdded: '0.88' + EnforcedStyle: braces + SupportedStyles: + - braces + - no_braces + +Style/HashConversion: + Description: 'Avoid Hash[] in favor of ary.to_h or literal hashes.' + StyleGuide: '#avoid-hash-constructor' + Enabled: pending + VersionAdded: '1.10' + VersionChanged: '1.11' + AllowSplatArgument: true + +Style/HashEachMethods: + Description: 'Use Hash#each_key and Hash#each_value.' + StyleGuide: '#hash-each' + Enabled: true + Safe: false + VersionAdded: '0.80' + VersionChanged: '1.16' + AllowedReceivers: [] + +Style/HashExcept: + Description: >- + Checks for usages of `Hash#reject`, `Hash#select`, and `Hash#filter` methods + that can be replaced with `Hash#except` method. + Enabled: pending + VersionAdded: '1.7' + +Style/HashLikeCase: + Description: >- + Checks for places where `case-when` represents a simple 1:1 + mapping and can be replaced with a hash lookup. + Enabled: true + VersionAdded: '0.88' + # `MinBranchesCount` defines the number of branches `case` needs to have + # to trigger this cop + MinBranchesCount: 3 + +Style/HashSyntax: + Description: >- + Prefer Ruby 1.9 hash syntax { a: 1, b: 2 } over 1.8 syntax + { :a => 1, :b => 2 }. + StyleGuide: '#hash-literals' + Enabled: true + VersionAdded: '0.9' + VersionChanged: '1.24' + EnforcedStyle: ruby19 + SupportedStyles: + # checks for 1.9 syntax (e.g. {a: 1}) for all symbol keys + - ruby19 + # checks for hash rocket syntax for all hashes + - hash_rockets + # forbids mixed key syntaxes (e.g. {a: 1, :b => 2}) + - no_mixed_keys + # enforces both ruby19 and no_mixed_keys styles + - ruby19_no_mixed_keys + # Force hashes that have a hash value omission + EnforcedShorthandSyntax: always + SupportedShorthandSyntax: + # forces use of the 3.1 syntax (e.g. {foo:}) when the hash key and value are the same. + - always + # forces use of explicit hash literal value. + - never + # accepts both shorthand and explicit use of hash literal value. + - either + # Force hashes that have a symbol value to use hash rockets + UseHashRocketsWithSymbolValues: false + # Do not suggest { a?: 1 } over { :a? => 1 } in ruby19 style + PreferHashRocketsForNonAlnumEndingSymbols: false + +Style/HashTransformKeys: + Description: 'Prefer `transform_keys` over `each_with_object`, `map`, or `to_h`.' + Enabled: true + VersionAdded: '0.80' + VersionChanged: '0.90' + Safe: false + +Style/HashTransformValues: + Description: 'Prefer `transform_values` over `each_with_object`, `map`, or `to_h`.' + Enabled: true + VersionAdded: '0.80' + VersionChanged: '0.90' + Safe: false + +Style/IdenticalConditionalBranches: + Description: >- + Checks that conditional statements do not have an identical + line at the end of each branch, which can validly be moved + out of the conditional. + Enabled: true + SafeAutoCorrect: false + VersionAdded: '0.36' + VersionChanged: '1.19' + +Style/IfInsideElse: + Description: 'Finds if nodes inside else, which can be converted to elsif.' + Enabled: true + AllowIfModifier: false + VersionAdded: '0.36' + VersionChanged: '1.3' + +Style/IfUnlessModifier: + Description: >- + Favor modifier if/unless usage when you have a + single-line body. + StyleGuide: '#if-as-a-modifier' + Enabled: true + VersionAdded: '0.9' + VersionChanged: '0.30' + +Style/IfUnlessModifierOfIfUnless: + Description: >- + Avoid modifier if/unless usage on conditionals. + Enabled: true + VersionAdded: '0.39' + VersionChanged: '0.87' + +Style/IfWithBooleanLiteralBranches: + Description: 'Checks for redundant `if` with boolean literal branches.' + Enabled: pending + VersionAdded: '1.9' + SafeAutoCorrect: false + AllowedMethods: + - nonzero? + +Style/IfWithSemicolon: + Description: 'Do not use if x; .... Use the ternary operator instead.' + StyleGuide: '#no-semicolon-ifs' + Enabled: true + VersionAdded: '0.9' + VersionChanged: '0.83' + +Style/ImplicitRuntimeError: + Description: >- + Use `raise` or `fail` with an explicit exception class and + message, rather than just a message. + Enabled: false + VersionAdded: '0.41' + +Style/InPatternThen: + Description: 'Checks for `in;` uses in `case` expressions.' + StyleGuide: '#no-in-pattern-semicolons' + Enabled: pending + VersionAdded: '1.16' + +Style/InfiniteLoop: + Description: >- + Use Kernel#loop for infinite loops. + This cop is unsafe if the body may raise a `StopIteration` exception. + Safe: false + StyleGuide: '#infinite-loop' + Enabled: true + VersionAdded: '0.26' + VersionChanged: '0.61' + +Style/InlineComment: + Description: 'Avoid trailing inline comments.' + Enabled: false + VersionAdded: '0.23' + +Style/InverseMethods: + Description: >- + Use the inverse method instead of `!.method` + if an inverse method is defined. + Enabled: true + Safe: false + VersionAdded: '0.48' + # `InverseMethods` are methods that can be inverted by a not (`not` or `!`) + # The relationship of inverse methods only needs to be defined in one direction. + # Keys and values both need to be defined as symbols. + InverseMethods: + :any?: :none? + :even?: :odd? + :==: :!= + :=~: :!~ + :<: :>= + :>: :<= + # `ActiveSupport` defines some common inverse methods. They are listed below, + # and not enabled by default. + # :present?: :blank?, + # :include?: :exclude? + # `InverseBlocks` are methods that are inverted by inverting the return + # of the block that is passed to the method + InverseBlocks: + :select: :reject + :select!: :reject! + +Style/IpAddresses: + Description: "Don't include literal IP addresses in code." + Enabled: false + VersionAdded: '0.58' + VersionChanged: '0.91' + # Allow addresses to be permitted + AllowedAddresses: + - "::" + # :: is a valid IPv6 address, but could potentially be legitimately in code + Exclude: + - '**/*.gemfile' + - '**/Gemfile' + - '**/gems.rb' + - '**/*.gemspec' + +Style/KeywordParametersOrder: + Description: 'Enforces that optional keyword parameters are placed at the end of the parameters list.' + StyleGuide: '#keyword-parameters-order' + Enabled: true + VersionAdded: '0.90' + VersionChanged: '1.7' + +Style/Lambda: + Description: 'Use the new lambda literal syntax for single-line blocks.' + StyleGuide: '#lambda-multi-line' + Enabled: true + VersionAdded: '0.9' + VersionChanged: '0.40' + EnforcedStyle: line_count_dependent + SupportedStyles: + - line_count_dependent + - lambda + - literal + +Style/LambdaCall: + Description: 'Use lambda.call(...) instead of lambda.(...).' + StyleGuide: '#proc-call' + Enabled: true + VersionAdded: '0.13' + VersionChanged: '0.14' + EnforcedStyle: call + SupportedStyles: + - call + - braces + +Style/LineEndConcatenation: + Description: >- + Use \ instead of + or << to concatenate two string literals at + line end. + Enabled: true + SafeAutoCorrect: false + VersionAdded: '0.18' + VersionChanged: '0.64' + +Style/MapToHash: + Description: 'Prefer `to_h` with a block over `map.to_h`.' + Enabled: pending + VersionAdded: '1.24' + Safe: false + +Style/MethodCallWithArgsParentheses: + Description: 'Use parentheses for method calls with arguments.' + StyleGuide: '#method-invocation-parens' + Enabled: false + VersionAdded: '0.47' + VersionChanged: '1.7' + IgnoreMacros: true + IgnoredMethods: [] + AllowedPatterns: [] + IgnoredPatterns: [] # deprecated + IncludedMacros: [] + AllowParenthesesInMultilineCall: false + AllowParenthesesInChaining: false + AllowParenthesesInCamelCaseMethod: false + AllowParenthesesInStringInterpolation: false + EnforcedStyle: require_parentheses + SupportedStyles: + - require_parentheses + - omit_parentheses + +Style/MethodCallWithoutArgsParentheses: + Description: 'Do not use parentheses for method calls with no arguments.' + StyleGuide: '#method-invocation-parens' + Enabled: true + IgnoredMethods: [] + VersionAdded: '0.47' + VersionChanged: '0.55' + +Style/MethodCalledOnDoEndBlock: + Description: 'Avoid chaining a method call on a do...end block.' + StyleGuide: '#single-line-blocks' + Enabled: false + VersionAdded: '0.14' + +Style/MethodDefParentheses: + Description: >- + Checks if the method definitions have or don't have + parentheses. + StyleGuide: '#method-parens' + Enabled: true + VersionAdded: '0.16' + VersionChanged: '1.7' + EnforcedStyle: require_parentheses + SupportedStyles: + - require_parentheses + - require_no_parentheses + - require_no_parentheses_except_multiline + +Style/MinMax: + Description: >- + Use `Enumerable#minmax` instead of `Enumerable#min` + and `Enumerable#max` in conjunction. + Enabled: true + VersionAdded: '0.50' + +Style/MissingElse: + Description: >- + Require if/case expressions to have an else branches. + If enabled, it is recommended that + Style/UnlessElse and Style/EmptyElse be enabled. + This will conflict with Style/EmptyElse if + Style/EmptyElse is configured to style "both". + Enabled: false + VersionAdded: '0.30' + VersionChanged: '0.38' + EnforcedStyle: both + SupportedStyles: + # if - warn when an if expression is missing an else branch + # case - warn when a case expression is missing an else branch + # both - warn when an if or case expression is missing an else branch + - if + - case + - both + +Style/MissingRespondToMissing: + Description: >- + Checks if `method_missing` is implemented + without implementing `respond_to_missing`. + StyleGuide: '#no-method-missing' + Enabled: true + VersionAdded: '0.56' + +Style/MixinGrouping: + Description: 'Checks for grouping of mixins in `class` and `module` bodies.' + StyleGuide: '#mixin-grouping' + Enabled: true + VersionAdded: '0.48' + VersionChanged: '0.49' + EnforcedStyle: separated + SupportedStyles: + # separated: each mixed in module goes in a separate statement. + # grouped: mixed in modules are grouped into a single statement. + - separated + - grouped + +Style/MixinUsage: + Description: 'Checks that `include`, `extend` and `prepend` exists at the top level.' + Enabled: true + VersionAdded: '0.51' + +Style/ModuleFunction: + Description: 'Checks for usage of `extend self` in modules.' + StyleGuide: '#module-function' + Enabled: true + VersionAdded: '0.11' + VersionChanged: '0.65' + EnforcedStyle: module_function + SupportedStyles: + - module_function + - extend_self + - forbidden + Autocorrect: false + SafeAutoCorrect: false + +Style/MultilineBlockChain: + Description: 'Avoid multi-line chains of blocks.' + StyleGuide: '#single-line-blocks' + Enabled: true + VersionAdded: '0.13' + +Style/MultilineIfModifier: + Description: 'Only use if/unless modifiers on single line statements.' + StyleGuide: '#no-multiline-if-modifiers' + Enabled: true + VersionAdded: '0.45' + +Style/MultilineIfThen: + Description: 'Do not use then for multi-line if/unless.' + StyleGuide: '#no-then' + Enabled: true + VersionAdded: '0.9' + VersionChanged: '0.26' + +Style/MultilineInPatternThen: + Description: 'Do not use `then` for multi-line `in` statement.' + StyleGuide: '#no-then' + Enabled: pending + VersionAdded: '1.16' + +Style/MultilineMemoization: + Description: 'Wrap multiline memoizations in a `begin` and `end` block.' + Enabled: true + VersionAdded: '0.44' + VersionChanged: '0.48' + EnforcedStyle: keyword + SupportedStyles: + - keyword + - braces + +Style/MultilineMethodSignature: + Description: 'Avoid multi-line method signatures.' + Enabled: false + VersionAdded: '0.59' + VersionChanged: '1.7' + +Style/MultilineTernaryOperator: + Description: >- + Avoid multi-line ?: (the ternary operator); + use if/unless instead. + StyleGuide: '#no-multiline-ternary' + Enabled: true + VersionAdded: '0.9' + VersionChanged: '0.86' + +Style/MultilineWhenThen: + Description: 'Do not use then for multi-line when statement.' + StyleGuide: '#no-then' + Enabled: true + VersionAdded: '0.73' + +Style/MultipleComparison: + Description: >- + Avoid comparing a variable with multiple items in a conditional, + use Array#include? instead. + Enabled: true + VersionAdded: '0.49' + VersionChanged: '1.1' + AllowMethodComparison: true + +Style/MutableConstant: + Description: 'Do not assign mutable objects to constants.' + Enabled: true + VersionAdded: '0.34' + VersionChanged: '1.8' + SafeAutoCorrect: false + EnforcedStyle: literals + SupportedStyles: + # literals: freeze literals assigned to constants + # strict: freeze all constants + # Strict mode is considered an experimental feature. It has not been updated + # with an exhaustive list of all methods that will produce frozen objects so + # there is a decent chance of getting some false positives. Luckily, there is + # no harm in freezing an already frozen object. + - literals + - strict + +Style/NegatedIf: + Description: >- + Favor unless over if for negative conditions + (or control flow or). + StyleGuide: '#unless-for-negatives' + Enabled: true + VersionAdded: '0.20' + VersionChanged: '0.48' + EnforcedStyle: both + SupportedStyles: + # both: prefix and postfix negated `if` should both use `unless` + # prefix: only use `unless` for negated `if` statements positioned before the body of the statement + # postfix: only use `unless` for negated `if` statements positioned after the body of the statement + - both + - prefix + - postfix + +Style/NegatedIfElseCondition: + Description: >- + This cop checks for uses of `if-else` and ternary operators with a negated condition + which can be simplified by inverting condition and swapping branches. + Enabled: pending + VersionAdded: '1.2' + +Style/NegatedUnless: + Description: 'Favor if over unless for negative conditions.' + StyleGuide: '#if-for-negatives' + Enabled: true + VersionAdded: '0.69' + EnforcedStyle: both + SupportedStyles: + # both: prefix and postfix negated `unless` should both use `if` + # prefix: only use `if` for negated `unless` statements positioned before the body of the statement + # postfix: only use `if` for negated `unless` statements positioned after the body of the statement + - both + - prefix + - postfix + +Style/NegatedWhile: + Description: 'Favor until over while for negative conditions.' + StyleGuide: '#until-for-negatives' + Enabled: true + VersionAdded: '0.20' + +Style/NestedFileDirname: + Description: 'Checks for nested `File.dirname`.' + Enabled: pending + VersionAdded: '1.26' + +Style/NestedModifier: + Description: 'Avoid using nested modifiers.' + StyleGuide: '#no-nested-modifiers' + Enabled: true + VersionAdded: '0.35' + +Style/NestedParenthesizedCalls: + Description: >- + Parenthesize method calls which are nested inside the + argument list of another parenthesized method call. + Enabled: true + VersionAdded: '0.36' + VersionChanged: '0.77' + AllowedMethods: + - be + - be_a + - be_an + - be_between + - be_falsey + - be_kind_of + - be_instance_of + - be_truthy + - be_within + - eq + - eql + - end_with + - include + - match + - raise_error + - respond_to + - start_with + +Style/NestedTernaryOperator: + Description: 'Use one expression per branch in a ternary operator.' + StyleGuide: '#no-nested-ternary' + Enabled: true + VersionAdded: '0.9' + VersionChanged: '0.86' + +Style/Next: + Description: 'Use `next` to skip iteration instead of a condition at the end.' + StyleGuide: '#no-nested-conditionals' + Enabled: true + VersionAdded: '0.22' + VersionChanged: '0.35' + # With `always` all conditions at the end of an iteration needs to be + # replaced by next - with `skip_modifier_ifs` the modifier if like this one + # are ignored: [1, 2].each { |a| return 'yes' if a == 1 } + EnforcedStyle: skip_modifier_ifs + # `MinBodyLength` defines the number of lines of the a body of an `if` or `unless` + # needs to have to trigger this cop + MinBodyLength: 3 + SupportedStyles: + - skip_modifier_ifs + - always + +Style/NilComparison: + Description: 'Prefer x.nil? to x == nil.' + StyleGuide: '#predicate-methods' + Enabled: true + VersionAdded: '0.12' + VersionChanged: '0.59' + EnforcedStyle: predicate + SupportedStyles: + - predicate + - comparison + +Style/NilLambda: + Description: 'Prefer `-> {}` to `-> { nil }`.' + Enabled: pending + VersionAdded: '1.3' + VersionChanged: '1.15' + +Style/NonNilCheck: + Description: 'Checks for redundant nil checks.' + StyleGuide: '#no-non-nil-checks' + Enabled: true + VersionAdded: '0.20' + VersionChanged: '0.22' + # With `IncludeSemanticChanges` set to `true`, this cop reports offenses for + # `!x.nil?` and autocorrects that and `x != nil` to solely `x`, which is + # **usually** OK, but might change behavior. + # + # With `IncludeSemanticChanges` set to `false`, this cop does not report + # offenses for `!x.nil?` and does no changes that might change behavior. + IncludeSemanticChanges: false + +Style/Not: + Description: 'Use ! instead of not.' + StyleGuide: '#bang-not-not' + Enabled: true + VersionAdded: '0.9' + VersionChanged: '0.20' + +Style/NumberedParameters: + Description: 'Restrict the usage of numbered parameters.' + Enabled: pending + VersionAdded: '1.22' + EnforcedStyle: allow_single_line + SupportedStyles: + - allow_single_line + - disallow + +Style/NumberedParametersLimit: + Description: 'Avoid excessive numbered params in a single block.' + Enabled: pending + VersionAdded: '1.22' + Max: 1 + +Style/NumericLiteralPrefix: + Description: 'Use smallcase prefixes for numeric literals.' + StyleGuide: '#numeric-literal-prefixes' + Enabled: true + VersionAdded: '0.41' + EnforcedOctalStyle: zero_with_o + SupportedOctalStyles: + - zero_with_o + - zero_only + +Style/NumericLiterals: + Description: >- + Add underscores to large numeric literals to improve their + readability. + StyleGuide: '#underscores-in-numerics' + Enabled: true + VersionAdded: '0.9' + VersionChanged: '0.48' + MinDigits: 5 + Strict: false + # You can specify allowed numbers. (e.g. port number 3000, 8080, and etc) + AllowedNumbers: [] + +Style/NumericPredicate: + Description: >- + Checks for the use of predicate- or comparison methods for + numeric comparisons. + StyleGuide: '#predicate-methods' + Safe: false + # This will change to a new method call which isn't guaranteed to be on the + # object. Switching these methods has to be done with knowledge of the types + # of the variables which rubocop doesn't have. + SafeAutoCorrect: false + Enabled: true + VersionAdded: '0.42' + VersionChanged: '0.59' + EnforcedStyle: predicate + SupportedStyles: + - predicate + - comparison + IgnoredMethods: [] + # Exclude RSpec specs because assertions like `expect(1).to be > 0` cause + # false positives. + Exclude: + - 'spec/**/*' + +Style/ObjectThen: + Description: 'Enforces the use of consistent method names `Object#yield_self` or `Object#then`.' + StyleGuide: '#object-yield-self-vs-object-then' + Enabled: pending + VersionAdded: '1.28' + # Use `Object#yield_self` or `Object#then`? + # Prefer `Object#yield_self` to `Object#then` (yield_self) + # Prefer `Object#then` to `Object#yield_self` (then) + EnforcedStyle: 'then' + SupportedStyles: + - then + - yield_self + +Style/OneLineConditional: + Description: >- + Favor the ternary operator (?:) or multi-line constructs over + single-line if/then/else/end constructs. + StyleGuide: '#ternary-operator' + Enabled: true + AlwaysCorrectToMultiline: false + VersionAdded: '0.9' + VersionChanged: '0.90' + +Style/OpenStructUse: + Description: >- + Avoid using OpenStruct. As of Ruby 3.0, use is officially discouraged due to performance, + version compatibility, and potential security issues. + Reference: + - https://docs.ruby-lang.org/en/3.0.0/OpenStruct.html#class-OpenStruct-label-Caveats + + Enabled: pending + VersionAdded: '1.23' + +Style/OptionHash: + Description: "Don't use option hashes when you can use keyword arguments." + Enabled: false + VersionAdded: '0.33' + VersionChanged: '0.34' + # A list of parameter names that will be flagged by this cop. + SuspiciousParamNames: + - options + - opts + - args + - params + - parameters + Allowlist: [] + +Style/OptionalArguments: + Description: >- + Checks for optional arguments that do not appear at the end + of the argument list. + StyleGuide: '#optional-arguments' + Enabled: true + Safe: false + VersionAdded: '0.33' + VersionChanged: '0.83' + +Style/OptionalBooleanParameter: + Description: 'Use keyword arguments when defining method with boolean argument.' + StyleGuide: '#boolean-keyword-arguments' + Enabled: true + Safe: false + VersionAdded: '0.89' + AllowedMethods: + - respond_to_missing? + +Style/OrAssignment: + Description: 'Recommend usage of double pipe equals (||=) where applicable.' + StyleGuide: '#double-pipe-for-uninit' + Enabled: true + VersionAdded: '0.50' + +Style/ParallelAssignment: + Description: >- + Check for simple usages of parallel assignment. + It will only warn when the number of variables + matches on both sides of the assignment. + StyleGuide: '#parallel-assignment' + Enabled: true + VersionAdded: '0.32' + +Style/ParenthesesAroundCondition: + Description: >- + Don't use parentheses around the condition of an + if/unless/while. + StyleGuide: '#no-parens-around-condition' + Enabled: true + VersionAdded: '0.9' + VersionChanged: '0.56' + AllowSafeAssignment: true + AllowInMultilineConditions: false + +Style/PercentLiteralDelimiters: + Description: 'Use `%`-literal delimiters consistently.' + StyleGuide: '#percent-literal-braces' + Enabled: true + VersionAdded: '0.19' + # Specify the default preferred delimiter for all types with the 'default' key + # Override individual delimiters (even with default specified) by specifying + # an individual key + PreferredDelimiters: + default: () + '%i': '[]' + '%I': '[]' + '%r': '{}' + '%w': '[]' + '%W': '[]' + VersionChanged: '0.48' + +Style/PercentQLiterals: + Description: 'Checks if uses of %Q/%q match the configured preference.' + Enabled: true + VersionAdded: '0.25' + EnforcedStyle: lower_case_q + SupportedStyles: + - lower_case_q # Use `%q` when possible, `%Q` when necessary + - upper_case_q # Always use `%Q` + +Style/PerlBackrefs: + Description: 'Avoid Perl-style regex back references.' + StyleGuide: '#no-perl-regexp-last-matchers' + Enabled: true + VersionAdded: '0.13' + +Style/PreferredHashMethods: + Description: 'Checks use of `has_key?` and `has_value?` Hash methods.' + StyleGuide: '#hash-key' + Enabled: true + Safe: false + VersionAdded: '0.41' + VersionChanged: '0.70' + EnforcedStyle: short + SupportedStyles: + - short + - verbose + +Style/Proc: + Description: 'Use proc instead of Proc.new.' + StyleGuide: '#proc' + Enabled: true + VersionAdded: '0.9' + VersionChanged: '0.18' + +Style/QuotedSymbols: + Description: 'Use a consistent style for quoted symbols.' + Enabled: pending + VersionAdded: '1.16' + EnforcedStyle: same_as_string_literals + SupportedStyles: + - same_as_string_literals + - single_quotes + - double_quotes + +Style/RaiseArgs: + Description: 'Checks the arguments passed to raise/fail.' + StyleGuide: '#exception-class-messages' + Enabled: true + VersionAdded: '0.14' + VersionChanged: '1.2' + EnforcedStyle: exploded + SupportedStyles: + - compact # raise Exception.new(msg) + - exploded # raise Exception, msg + AllowedCompactTypes: [] + +Style/RandomWithOffset: + Description: >- + Prefer to use ranges when generating random numbers instead of + integers with offsets. + StyleGuide: '#random-numbers' + Enabled: true + VersionAdded: '0.52' + +Style/RedundantArgument: + Description: 'Check for a redundant argument passed to certain methods.' + Enabled: pending + Safe: false + VersionAdded: '1.4' + VersionChanged: '1.7' + Methods: + # Array#join + join: '' + # String#split + split: ' ' + # String#chomp + chomp: "\n" + # String#chomp! + chomp!: "\n" + +Style/RedundantAssignment: + Description: 'Checks for redundant assignment before returning.' + Enabled: true + VersionAdded: '0.87' + +Style/RedundantBegin: + Description: "Don't use begin blocks when they are not needed." + StyleGuide: '#begin-implicit' + Enabled: true + VersionAdded: '0.10' + VersionChanged: '0.21' + +Style/RedundantCapitalW: + Description: 'Checks for %W when interpolation is not needed.' + Enabled: true + VersionAdded: '0.76' + +Style/RedundantCondition: + Description: 'Checks for unnecessary conditional expressions.' + Enabled: true + VersionAdded: '0.76' + +Style/RedundantConditional: + Description: "Don't return true/false from a conditional." + Enabled: true + VersionAdded: '0.50' + +Style/RedundantException: + Description: "Checks for an obsolete RuntimeException argument in raise/fail." + StyleGuide: '#no-explicit-runtimeerror' + Enabled: true + VersionAdded: '0.14' + VersionChanged: '0.29' + +Style/RedundantFetchBlock: + Description: >- + Use `fetch(key, value)` instead of `fetch(key) { value }` + when value has Numeric, Rational, Complex, Symbol or String type, `false`, `true`, `nil` or is a constant. + Reference: 'https://github.com/JuanitoFatas/fast-ruby#hashfetch-with-argument-vs-hashfetch--block-code' + Enabled: true + Safe: false + # If enabled, this cop will autocorrect usages of + # `fetch` being called with block returning a constant. + # This can be dangerous since constants will not be defined at that moment. + SafeForConstants: false + VersionAdded: '0.86' + +Style/RedundantFileExtensionInRequire: + Description: >- + Checks for the presence of superfluous `.rb` extension in + the filename provided to `require` and `require_relative`. + StyleGuide: '#no-explicit-rb-to-require' + Enabled: true + VersionAdded: '0.88' + +Style/RedundantFreeze: + Description: "Checks usages of Object#freeze on immutable objects." + Enabled: true + VersionAdded: '0.34' + VersionChanged: '0.66' + +Style/RedundantInitialize: + Description: 'Checks for redundant `initialize` methods.' + Enabled: pending + Safe: false + AllowComments: true + VersionAdded: '1.27' + VersionChanged: '1.28' + +Style/RedundantInterpolation: + Description: 'Checks for strings that are just an interpolated expression.' + Enabled: true + VersionAdded: '0.76' + +Style/RedundantParentheses: + Description: "Checks for parentheses that seem not to serve any purpose." + Enabled: true + VersionAdded: '0.36' + +Style/RedundantPercentQ: + Description: 'Checks for %q/%Q when single quotes or double quotes would do.' + StyleGuide: '#percent-q' + Enabled: true + VersionAdded: '0.76' + +Style/RedundantRegexpCharacterClass: + Description: 'Checks for unnecessary single-element Regexp character classes.' + Enabled: true + VersionAdded: '0.85' + +Style/RedundantRegexpEscape: + Description: 'Checks for redundant escapes in Regexps.' + Enabled: true + VersionAdded: '0.85' + +Style/RedundantReturn: + Description: "Don't use return where it's not required." + StyleGuide: '#no-explicit-return' + Enabled: true + VersionAdded: '0.10' + VersionChanged: '0.14' + # When `true` allows code like `return x, y`. + AllowMultipleReturnValues: false + +Style/RedundantSelf: + Description: "Don't use self where it's not needed." + StyleGuide: '#no-self-unless-required' + Enabled: true + VersionAdded: '0.10' + VersionChanged: '0.13' + +Style/RedundantSelfAssignment: + Description: 'Checks for places where redundant assignments are made for in place modification methods.' + Enabled: true + Safe: false + VersionAdded: '0.90' + +Style/RedundantSelfAssignmentBranch: + Description: 'Checks for places where conditional branch makes redundant self-assignment.' + Enabled: pending + VersionAdded: '1.19' + +Style/RedundantSort: + Description: >- + Use `min` instead of `sort.first`, + `max_by` instead of `sort_by...last`, etc. + Enabled: true + VersionAdded: '0.76' + VersionChanged: '1.22' + Safe: false + +Style/RedundantSortBy: + Description: 'Use `sort` instead of `sort_by { |x| x }`.' + Enabled: true + VersionAdded: '0.36' + +Style/RegexpLiteral: + Description: 'Use / or %r around regular expressions.' + StyleGuide: '#percent-r' + Enabled: true + VersionAdded: '0.9' + VersionChanged: '0.30' + EnforcedStyle: slashes + # slashes: Always use slashes. + # percent_r: Always use `%r`. + # mixed: Use slashes on single-line regexes, and `%r` on multi-line regexes. + SupportedStyles: + - slashes + - percent_r + - mixed + # If `false`, the cop will always recommend using `%r` if one or more slashes + # are found in the regexp string. + AllowInnerSlashes: false + +Style/RescueModifier: + Description: 'Avoid using rescue in its modifier form.' + StyleGuide: '#no-rescue-modifiers' + Enabled: true + VersionAdded: '0.9' + VersionChanged: '0.34' + +Style/RescueStandardError: + Description: 'Avoid rescuing without specifying an error class.' + Enabled: true + VersionAdded: '0.52' + EnforcedStyle: explicit + # implicit: Do not include the error class, `rescue` + # explicit: Require an error class `rescue StandardError` + SupportedStyles: + - implicit + - explicit + +Style/ReturnNil: + Description: 'Use return instead of return nil.' + Enabled: false + EnforcedStyle: return + SupportedStyles: + - return + - return_nil + VersionAdded: '0.50' + +Style/SafeNavigation: + Description: >- + This cop transforms usages of a method call safeguarded by + a check for the existence of the object to + safe navigation (`&.`). + Auto-correction is unsafe as it assumes the object will + be `nil` or truthy, but never `false`. + Enabled: true + VersionAdded: '0.43' + VersionChanged: '1.27' + # Safe navigation may cause a statement to start returning `nil` in addition + # to whatever it used to return. + ConvertCodeThatCanStartToReturnNil: false + AllowedMethods: + - present? + - blank? + - presence + - try + - try! + SafeAutoCorrect: false + # Maximum length of method chains for register an offense. + MaxChainLength: 2 + +Style/Sample: + Description: >- + Use `sample` instead of `shuffle.first`, + `shuffle.last`, and `shuffle[Integer]`. + Reference: 'https://github.com/JuanitoFatas/fast-ruby#arrayshufflefirst-vs-arraysample-code' + Enabled: true + VersionAdded: '0.30' + +Style/SelectByRegexp: + Description: 'Prefer grep/grep_v to select/reject with a regexp match.' + Enabled: pending + SafeAutoCorrect: false + VersionAdded: '1.22' + +Style/SelfAssignment: + Description: >- + Checks for places where self-assignment shorthand should have + been used. + StyleGuide: '#self-assignment' + Enabled: true + VersionAdded: '0.19' + VersionChanged: '0.29' + +Style/Semicolon: + Description: "Don't use semicolons to terminate expressions." + StyleGuide: '#no-semicolon' + Enabled: true + VersionAdded: '0.9' + VersionChanged: '0.19' + # Allow `;` to separate several expressions on the same line. + AllowAsExpressionSeparator: false + +Style/Send: + Description: 'Prefer `Object#__send__` or `Object#public_send` to `send`, as `send` may overlap with existing methods.' + StyleGuide: '#prefer-public-send' + Enabled: false + VersionAdded: '0.33' + +Style/SignalException: + Description: 'Checks for proper usage of fail and raise.' + StyleGuide: '#prefer-raise-over-fail' + Enabled: true + VersionAdded: '0.11' + VersionChanged: '0.37' + EnforcedStyle: only_raise + SupportedStyles: + - only_raise + - only_fail + - semantic + +Style/SingleArgumentDig: + Description: 'Avoid using single argument dig method.' + Enabled: true + VersionAdded: '0.89' + Safe: false + +Style/SingleLineBlockParams: + Description: 'Enforces the names of some block params.' + Enabled: false + VersionAdded: '0.16' + VersionChanged: '1.6' + Methods: + - reduce: + - acc + - elem + - inject: + - acc + - elem + +Style/SingleLineMethods: + Description: 'Avoid single-line methods.' + StyleGuide: '#no-single-line-methods' + Enabled: true + VersionAdded: '0.9' + VersionChanged: '1.8' + AllowIfMethodIsEmpty: true + +Style/SlicingWithRange: + Description: 'Checks array slicing is done with endless ranges when suitable.' + Enabled: true + VersionAdded: '0.83' + Safe: false + +Style/SoleNestedConditional: + Description: >- + Finds sole nested conditional nodes + which can be merged into outer conditional node. + Enabled: true + VersionAdded: '0.89' + VersionChanged: '1.5' + AllowModifier: false + +Style/SpecialGlobalVars: + Description: 'Avoid Perl-style global variables.' + StyleGuide: '#no-cryptic-perlisms' + Enabled: true + VersionAdded: '0.13' + VersionChanged: '0.36' + SafeAutoCorrect: false + RequireEnglish: true + EnforcedStyle: use_english_names + SupportedStyles: + - use_perl_names + - use_english_names + - use_builtin_english_names + +Style/StabbyLambdaParentheses: + Description: 'Check for the usage of parentheses around stabby lambda arguments.' + StyleGuide: '#stabby-lambda-with-args' + Enabled: true + VersionAdded: '0.35' + EnforcedStyle: require_parentheses + SupportedStyles: + - require_parentheses + - require_no_parentheses + +Style/StaticClass: + Description: 'Prefer modules to classes with only class methods.' + StyleGuide: '#modules-vs-classes' + Enabled: false + Safe: false + VersionAdded: '1.3' + +Style/StderrPuts: + Description: 'Use `warn` instead of `$stderr.puts`.' + StyleGuide: '#warn' + Enabled: true + VersionAdded: '0.51' + +Style/StringChars: + Description: 'Checks for uses of `String#split` with empty string or regexp literal argument.' + StyleGuide: '#string-chars' + Enabled: pending + Safe: false + VersionAdded: '1.12' + +Style/StringConcatenation: + Description: 'Checks for places where string concatenation can be replaced with string interpolation.' + StyleGuide: '#string-interpolation' + Enabled: true + Safe: false + VersionAdded: '0.89' + VersionChanged: '1.18' + Mode: aggressive + +Style/StringHashKeys: + Description: 'Prefer symbols instead of strings as hash keys.' + StyleGuide: '#symbols-as-keys' + Enabled: false + VersionAdded: '0.52' + VersionChanged: '0.75' + Safe: false + +Style/StringLiterals: + Description: 'Checks if uses of quotes match the configured preference.' + StyleGuide: '#consistent-string-literals' + Enabled: true + VersionAdded: '0.9' + VersionChanged: '0.36' + EnforcedStyle: single_quotes + SupportedStyles: + - single_quotes + - double_quotes + # If `true`, strings which span multiple lines using `\` for continuation must + # use the same type of quotes on each line. + ConsistentQuotesInMultiline: false + +Style/StringLiteralsInInterpolation: + Description: >- + Checks if uses of quotes inside expressions in interpolated + strings match the configured preference. + Enabled: true + VersionAdded: '0.27' + EnforcedStyle: single_quotes + SupportedStyles: + - single_quotes + - double_quotes + +Style/StringMethods: + Description: 'Checks if configured preferred methods are used over non-preferred.' + Enabled: false + VersionAdded: '0.34' + VersionChanged: '0.34' + # Mapping from undesired method to desired_method + # e.g. to use `to_sym` over `intern`: + # + # StringMethods: + # PreferredMethods: + # intern: to_sym + PreferredMethods: + intern: to_sym + +Style/Strip: + Description: 'Use `strip` instead of `lstrip.rstrip`.' + Enabled: true + VersionAdded: '0.36' + +Style/StructInheritance: + Description: 'Checks for inheritance from Struct.new.' + StyleGuide: '#no-extend-struct-new' + Enabled: true + SafeAutoCorrect: false + VersionAdded: '0.29' + VersionChanged: '1.20' + +Style/SwapValues: + Description: 'This cop enforces the use of shorthand-style swapping of 2 variables.' + StyleGuide: '#values-swapping' + Enabled: pending + VersionAdded: '1.1' + SafeAutoCorrect: false + +Style/SymbolArray: + Description: 'Use %i or %I for arrays of symbols.' + StyleGuide: '#percent-i' + Enabled: true + VersionAdded: '0.9' + VersionChanged: '0.49' + EnforcedStyle: percent + MinSize: 2 + SupportedStyles: + - percent + - brackets + +Style/SymbolLiteral: + Description: 'Use plain symbols instead of string symbols when possible.' + Enabled: true + VersionAdded: '0.30' + +Style/SymbolProc: + Description: 'Use symbols as procs instead of blocks when possible.' + Enabled: true + Safe: false + VersionAdded: '0.26' + VersionChanged: '1.28' + AllowMethodsWithArguments: false + # A list of method names to be ignored by the check. + # The names should be fairly unique, otherwise you'll end up ignoring lots of code. + IgnoredMethods: + - respond_to + - define_method + AllowComments: false + +Style/TernaryParentheses: + Description: 'Checks for use of parentheses around ternary conditions.' + Enabled: true + VersionAdded: '0.42' + VersionChanged: '0.46' + EnforcedStyle: require_no_parentheses + SupportedStyles: + - require_parentheses + - require_no_parentheses + - require_parentheses_when_complex + AllowSafeAssignment: true + +Style/TopLevelMethodDefinition: + Description: 'This cop looks for top-level method definitions.' + StyleGuide: '#top-level-methods' + Enabled: false + VersionAdded: '1.15' + +Style/TrailingBodyOnClass: + Description: 'Class body goes below class statement.' + Enabled: true + VersionAdded: '0.53' + +Style/TrailingBodyOnMethodDefinition: + Description: 'Method body goes below definition.' + Enabled: true + VersionAdded: '0.52' + +Style/TrailingBodyOnModule: + Description: 'Module body goes below module statement.' + Enabled: true + VersionAdded: '0.53' + +Style/TrailingCommaInArguments: + Description: 'Checks for trailing comma in argument lists.' + StyleGuide: '#no-trailing-params-comma' + Enabled: true + VersionAdded: '0.36' + # If `comma`, the cop requires a comma after the last argument, but only for + # parenthesized method calls where each argument is on its own line. + # If `consistent_comma`, the cop requires a comma after the last argument, + # for all parenthesized method calls with arguments. + EnforcedStyleForMultiline: no_comma + SupportedStylesForMultiline: + - comma + - consistent_comma + - no_comma + +Style/TrailingCommaInArrayLiteral: + Description: 'Checks for trailing comma in array literals.' + StyleGuide: '#no-trailing-array-commas' + Enabled: true + VersionAdded: '0.53' + # If `comma`, the cop requires a comma after the last item in an array, + # but only when each item is on its own line. + # If `consistent_comma`, the cop requires a comma after the last item of all + # non-empty, multiline array literals. + EnforcedStyleForMultiline: no_comma + SupportedStylesForMultiline: + - comma + - consistent_comma + - no_comma + +Style/TrailingCommaInBlockArgs: + Description: 'Checks for useless trailing commas in block arguments.' + Enabled: false + Safe: false + VersionAdded: '0.81' + +Style/TrailingCommaInHashLiteral: + Description: 'Checks for trailing comma in hash literals.' + Enabled: true + # If `comma`, the cop requires a comma after the last item in a hash, + # but only when each item is on its own line. + # If `consistent_comma`, the cop requires a comma after the last item of all + # non-empty, multiline hash literals. + EnforcedStyleForMultiline: no_comma + SupportedStylesForMultiline: + - comma + - consistent_comma + - no_comma + VersionAdded: '0.53' + +Style/TrailingMethodEndStatement: + Description: 'Checks for trailing end statement on line of method body.' + Enabled: true + VersionAdded: '0.52' + +Style/TrailingUnderscoreVariable: + Description: >- + Checks for the usage of unneeded trailing underscores at the + end of parallel variable assignment. + AllowNamedUnderscoreVariables: true + Enabled: true + VersionAdded: '0.31' + VersionChanged: '0.35' + +# `TrivialAccessors` requires exact name matches and doesn't allow +# predicated methods by default. +Style/TrivialAccessors: + Description: 'Prefer attr_* methods to trivial readers/writers.' + StyleGuide: '#attr_family' + Enabled: true + VersionAdded: '0.9' + VersionChanged: '1.15' + # When set to `false` the cop will suggest the use of accessor methods + # in situations like: + # + # def name + # @other_name + # end + # + # This way you can uncover "hidden" attributes in your code. + ExactNameMatch: true + AllowPredicates: true + # Allows trivial writers that don't end in an equal sign. e.g. + # + # def on_exception(action) + # @on_exception=action + # end + # on_exception :restart + # + # Commonly used in DSLs + AllowDSLWriters: true + IgnoreClassMethods: false + AllowedMethods: + - to_ary + - to_a + - to_c + - to_enum + - to_h + - to_hash + - to_i + - to_int + - to_io + - to_open + - to_path + - to_proc + - to_r + - to_regexp + - to_str + - to_s + - to_sym + +Style/UnlessElse: + Description: >- + Do not use unless with else. Rewrite these with the positive + case first. + StyleGuide: '#no-else-with-unless' + Enabled: true + VersionAdded: '0.9' + +Style/UnlessLogicalOperators: + Description: >- + Checks for use of logical operators in an unless condition. + Enabled: false + VersionAdded: '1.11' + EnforcedStyle: forbid_mixed_logical_operators + SupportedStyles: + - forbid_mixed_logical_operators + - forbid_logical_operators + +Style/UnpackFirst: + Description: >- + Checks for accessing the first element of `String#unpack` + instead of using `unpack1`. + Enabled: true + VersionAdded: '0.54' + +Style/VariableInterpolation: + Description: >- + Don't interpolate global, instance and class variables + directly in strings. + StyleGuide: '#curlies-interpolate' + Enabled: true + VersionAdded: '0.9' + VersionChanged: '0.20' + +Style/WhenThen: + Description: 'Use when x then ... for one-line cases.' + StyleGuide: '#no-when-semicolons' + Enabled: true + VersionAdded: '0.9' + +Style/WhileUntilDo: + Description: 'Checks for redundant do after while or until.' + StyleGuide: '#no-multiline-while-do' + Enabled: true + VersionAdded: '0.9' + +Style/WhileUntilModifier: + Description: >- + Favor modifier while/until usage when you have a + single-line body. + StyleGuide: '#while-as-a-modifier' + Enabled: true + VersionAdded: '0.9' + VersionChanged: '0.30' + +Style/WordArray: + Description: 'Use %w or %W for arrays of words.' + StyleGuide: '#percent-w' + Enabled: true + VersionAdded: '0.9' + VersionChanged: '1.19' + EnforcedStyle: percent + SupportedStyles: + # percent style: %w(word1 word2) + - percent + # bracket style: ['word1', 'word2'] + - brackets + # The `MinSize` option causes the `WordArray` rule to be ignored for arrays + # smaller than a certain size. The rule is only applied to arrays + # whose element count is greater than or equal to `MinSize`. + MinSize: 2 + # The regular expression `WordRegex` decides what is considered a word. + WordRegex: !ruby/regexp '/\A(?:\p{Word}|\p{Word}-\p{Word}|\n|\t)+\z/' + +Style/YodaCondition: + Description: 'Forbid or enforce yoda conditions.' + Reference: 'https://en.wikipedia.org/wiki/Yoda_conditions' + Enabled: true + EnforcedStyle: forbid_for_all_comparison_operators + SupportedStyles: + # check all comparison operators + - forbid_for_all_comparison_operators + # check only equality operators: `!=` and `==` + - forbid_for_equality_operators_only + # enforce yoda for all comparison operators + - require_for_all_comparison_operators + # enforce yoda only for equality operators: `!=` and `==` + - require_for_equality_operators_only + Safe: false + VersionAdded: '0.49' + VersionChanged: '0.75' + +Style/ZeroLengthPredicate: + Description: 'Use #empty? when testing for objects of length 0.' + Enabled: true + Safe: false + VersionAdded: '0.37' + VersionChanged: '0.39' diff --git a/vendor/bundle/ruby/3.1.0/gems/rubocop-1.28.2/config/obsoletion.yml b/vendor/bundle/ruby/3.1.0/gems/rubocop-1.28.2/config/obsoletion.yml new file mode 100644 index 000000000..b998563c2 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/rubocop-1.28.2/config/obsoletion.yml @@ -0,0 +1,209 @@ +# Configuration of obsolete/deprecated cops used by `ConfigObsoletion` + +# Cops that were renamed +renamed: + Layout/AlignArguments: Layout/ArgumentAlignment + Layout/AlignArray: Layout/ArrayAlignment + Layout/AlignHash: Layout/HashAlignment + Layout/AlignParameters: Layout/ParameterAlignment + Layout/IndentArray: Layout/FirstArrayElementIndentation + Layout/IndentAssignment: Layout/AssignmentIndentation + Layout/IndentFirstArgument: Layout/FirstArgumentIndentation + Layout/IndentFirstArrayElement: Layout/FirstArrayElementIndentation + Layout/IndentFirstHashElement: Layout/FirstHashElementIndentation + Layout/IndentFirstParameter: Layout/FirstParameterIndentation + Layout/IndentHash: Layout/FirstHashElementIndentation + Layout/IndentHeredoc: Layout/HeredocIndentation + Layout/LeadingBlankLines: Layout/LeadingEmptyLines + Layout/Tab: Layout/IndentationStyle + Layout/TrailingBlankLines: Layout/TrailingEmptyLines + Lint/BlockAlignment: Layout/BlockAlignment + Lint/DefEndAlignment: Layout/DefEndAlignment + Lint/DuplicatedKey: Lint/DuplicateHashKey + Lint/EndAlignment: Layout/EndAlignment + Lint/EndInMethod: Style/EndBlock + Lint/Eval: Security/Eval + Lint/HandleExceptions: Lint/SuppressedException + Lint/MultipleCompare: Lint/MultipleComparison + Lint/StringConversionInInterpolation: Lint/RedundantStringCoercion + Lint/UnneededCopDisableDirective: Lint/RedundantCopDisableDirective + Lint/UnneededCopEnableDirective: Lint/RedundantCopEnableDirective + Lint/UnneededRequireStatement: Lint/RedundantRequireStatement + Lint/UnneededSplatExpansion: Lint/RedundantSplatExpansion + Metrics/LineLength: Layout/LineLength + Naming/UncommunicativeBlockParamName: Naming/BlockParameterName + Naming/UncommunicativeMethodParamName: Naming/MethodParameterName + Style/AccessorMethodName: Naming/AccessorMethodName + Style/AsciiIdentifiers: Naming/AsciiIdentifiers + Style/ClassAndModuleCamelCase: Naming/ClassAndModuleCamelCase + Style/ConstantName: Naming/ConstantName + Style/DeprecatedHashMethods: Style/PreferredHashMethods + Style/FileName: Naming/FileName + Style/FlipFlop: Lint/FlipFlop + Style/MethodCallParentheses: Style/MethodCallWithoutArgsParentheses + Style/MethodName: Naming/MethodName + Style/OpMethod: Naming/BinaryOperatorParameterName + Style/PredicateName: Naming/PredicateName + Style/SingleSpaceBeforeFirstArg: Layout/SpaceBeforeFirstArg + Style/UnneededCapitalW: Style/RedundantCapitalW + Style/UnneededCondition: Style/RedundantCondition + Style/UnneededInterpolation: Style/RedundantInterpolation + Style/UnneededPercentQ: Style/RedundantPercentQ + Style/UnneededSort: Style/RedundantSort + Style/VariableName: Naming/VariableName + Style/VariableNumber: Naming/VariableNumber + +# Cops that were removed +removed: + Layout/SpaceAfterControlKeyword: + alternatives: Layout/SpaceAroundKeyword + Layout/SpaceBeforeModifierKeyword: + alternatives: Layout/SpaceAroundKeyword + Lint/InvalidCharacterLiteral: + reason: it was never being actually triggered + Lint/RescueWithoutErrorClass: + alternatives: Style/RescueStandardError + Lint/SpaceBeforeFirstArg: + reason: > + it was a duplicate of `Layout/SpaceBeforeFirstArg`. Please use + `Layout/SpaceBeforeFirstArg` instead + Lint/UselessComparison: + reason: > + it has been superseded by + `Lint/BinaryOperatorWithIdenticalOperands`. Please use + `Lint/BinaryOperatorWithIdenticalOperands` instead + Style/BracesAroundHashParameters: true + Style/MethodMissingSuper: + reason: > + it has been superseded by `Lint/MissingSuper`. Please use + `Lint/MissingSuper` instead + Style/SpaceAfterControlKeyword: + alternatives: Layout/SpaceAroundKeyword + Style/SpaceBeforeModifierKeyword: + alternatives: Layout/SpaceAroundKeyword + Style/TrailingComma: + alternatives: + - Style/TrailingCommaInArguments + - Style/TrailingCommaInArrayLiteral + - Style/TrailingCommaInHashLiteral + Style/TrailingCommaInLiteral: + alternatives: + - Style/TrailingCommaInArrayLiteral + - Style/TrailingCommaInHashLiteral + +# Cops split into multiple other cops +split: + Style/MethodMissing: + alternatives: + - Style/MethodMissingSuper + - Style/MissingRespondToMissing + +# Cops that were extracted into a different gem +extracted: + Performance/*: rubocop-performance + Rails/*: rubocop-rails + +# Cop parameters that have been changed +# Can be treated as a warning instead of a failure with `severity: warning` +changed_parameters: + - cops: + - Layout/SpaceAroundOperators + - Style/SpaceAroundOperators + parameters: MultiSpaceAllowedForOperators + reason: > + If your intention was to allow extra spaces for alignment, please + use `AllowForAlignment: true` instead. + - cops: Style/Encoding + parameters: + - EnforcedStyle + - SupportedStyles + - AutoCorrectEncodingComment + reason: '`Style/Encoding` no longer supports styles. The "never" behavior is always assumed.' + - cops: Style/IfUnlessModifier + parameters: MaxLineLength + reason: > + `Style/IfUnlessModifier: MaxLineLength` has been removed. + Use `Layout/LineLength: Max` instead + - cops: Style/WhileUntilModifier + parameters: MaxLineLength + reason: > + `Style/WhileUntilModifier: MaxLineLength` has been removed. + Use `Layout/LineLength: Max` instead + - cops: AllCops + parameters: RunRailsCops + reason: |- + Use the following configuration instead: + Rails: + Enabled: true + - cops: Layout/CaseIndentation + parameters: IndentWhenRelativeTo + alternative: EnforcedStyle + - cops: + - Lint/BlockAlignment + - Layout/BlockAlignment + - Lint/EndAlignment + - Layout/EndAlignment + - Lint/DefEndAlignment + - Layout/DefEndAlignment + parameters: AlignWith + alternative: EnforcedStyleAlignWith + - cops: Rails/UniqBeforePluck + parameters: EnforcedMode + alternative: EnforcedStyle + - cops: Style/MethodCallWithArgsParentheses + parameters: IgnoredMethodPatterns + alternative: AllowedPatterns + - cops: + - Performance/Count + - Performance/Detect + parameters: SafeMode + reason: "`SafeMode` has been removed. Use `SafeAutoCorrect` instead." + - cops: Bundler/GemComment + parameters: Whitelist + alternative: IgnoredGems + - cops: + - Lint/SafeNavigationChain + - Lint/SafeNavigationConsistency + - Style/NestedParenthesizedCalls + - Style/SafeNavigation + - Style/TrivialAccessors + parameters: Whitelist + alternative: AllowedMethods + - cops: Style/IpAddresses + parameters: Whitelist + alternative: AllowedAddresses + - cops: Naming/HeredocDelimiterNaming + parameters: Blacklist + alternative: ForbiddenDelimiters + - cops: Naming/PredicateName + parameters: NamePrefixBlacklist + alternative: ForbiddenPrefixes + - cops: Naming/PredicateName + parameters: NameWhitelist + alternative: AllowedMethods + - cops: + - Metrics/BlockLength + - Metrics/MethodLength + parameters: ExcludedMethods + alternative: IgnoredMethods + severity: warning + - cops: Lint/Debugger + parameters: DebuggerReceivers + reason: "`DebuggerReceivers` is no longer necessary, method receivers should be specified in `DebuggerMethods` instead." + severity: warning + - cops: + - Layout/IndentationWidth + - Layout/LineLength + - Lint/UnreachableLoop + - Naming/MethodName + - Style/MethodCallWithArgsParentheses + parameters: IgnoredPatterns + alternative: AllowedPatterns + severity: warning + +# Enforced styles that have been removed or replaced +changed_enforced_styles: + - cops: Layout/IndentationConsistency + parameters: EnforcedStyle + value: rails + alternative: indented_internal_methods diff --git a/vendor/bundle/ruby/3.1.0/gems/rubocop-1.28.2/exe/rubocop b/vendor/bundle/ruby/3.1.0/gems/rubocop-1.28.2/exe/rubocop new file mode 100755 index 000000000..faf692600 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/rubocop-1.28.2/exe/rubocop @@ -0,0 +1,15 @@ +#!/usr/bin/env ruby +# frozen_string_literal: true + +$LOAD_PATH.unshift("#{__dir__}/../lib") + +require 'rubocop' +require 'benchmark' + +cli = RuboCop::CLI.new +result = 0 + +time = Benchmark.realtime { result = cli.run } + +puts "Finished in #{time} seconds" if cli.options[:debug] || cli.options[:display_time] +exit result diff --git a/vendor/bundle/ruby/3.1.0/gems/rubocop-1.28.2/lib/rubocop.rb b/vendor/bundle/ruby/3.1.0/gems/rubocop-1.28.2/lib/rubocop.rb new file mode 100644 index 000000000..8c8bbbea4 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/rubocop-1.28.2/lib/rubocop.rb @@ -0,0 +1,732 @@ +# frozen_string_literal: true + +require 'English' +before_us = $LOADED_FEATURES.dup +require 'rainbow' + +require 'set' +require 'forwardable' +require 'regexp_parser' +require 'unicode/display_width' + +# we have to require RuboCop's version, before rubocop-ast's +require_relative 'rubocop/version' +require 'rubocop-ast' + +require_relative 'rubocop/ast_aliases' +require_relative 'rubocop/ext/regexp_node' +require_relative 'rubocop/ext/regexp_parser' + +require_relative 'rubocop/core_ext/string' +require_relative 'rubocop/ext/processed_source' + +require_relative 'rubocop/path_util' +require_relative 'rubocop/file_finder' +require_relative 'rubocop/platform' +require_relative 'rubocop/name_similarity' +require_relative 'rubocop/string_interpreter' +require_relative 'rubocop/error' +require_relative 'rubocop/warning' +require_relative 'rubocop/util' + +require_relative 'rubocop/cop/util' +require_relative 'rubocop/cop/offense' +require_relative 'rubocop/cop/message_annotator' +require_relative 'rubocop/cop/ignored_node' +require_relative 'rubocop/cop/autocorrect_logic' +require_relative 'rubocop/cop/exclude_limit' +require_relative 'rubocop/cop/badge' +require_relative 'rubocop/cop/registry' +require_relative 'rubocop/cop/base' +require_relative 'rubocop/cop/cop' +require_relative 'rubocop/cop/commissioner' +require_relative 'rubocop/cop/documentation' +require_relative 'rubocop/cop/corrector' +require_relative 'rubocop/cop/force' +require_relative 'rubocop/cop/severity' +require_relative 'rubocop/cop/generator' +require_relative 'rubocop/cop/generator/configuration_injector' +require_relative 'rubocop/cop/generator/require_file_injector' + +require_relative 'rubocop/cop/variable_force' +require_relative 'rubocop/cop/variable_force/branch' +require_relative 'rubocop/cop/variable_force/branchable' +require_relative 'rubocop/cop/variable_force/variable' +require_relative 'rubocop/cop/variable_force/assignment' +require_relative 'rubocop/cop/variable_force/reference' +require_relative 'rubocop/cop/variable_force/scope' +require_relative 'rubocop/cop/variable_force/variable_table' + +require_relative 'rubocop/cop/mixin/array_min_size' +require_relative 'rubocop/cop/mixin/array_syntax' +require_relative 'rubocop/cop/mixin/alignment' +require_relative 'rubocop/cop/mixin/allowed_identifiers' +require_relative 'rubocop/cop/mixin/allowed_methods' +require_relative 'rubocop/cop/mixin/allowed_pattern' +require_relative 'rubocop/cop/mixin/auto_corrector' +require_relative 'rubocop/cop/mixin/check_assignment' +require_relative 'rubocop/cop/mixin/check_line_breakable' +require_relative 'rubocop/cop/mixin/configurable_max' +require_relative 'rubocop/cop/mixin/code_length' # relies on configurable_max +require_relative 'rubocop/cop/mixin/configurable_enforced_style' +require_relative 'rubocop/cop/mixin/configurable_formatting' +require_relative 'rubocop/cop/mixin/configurable_naming' +require_relative 'rubocop/cop/mixin/configurable_numbering' +require_relative 'rubocop/cop/mixin/def_node' +require_relative 'rubocop/cop/mixin/documentation_comment' +require_relative 'rubocop/cop/mixin/duplication' +require_relative 'rubocop/cop/mixin/range_help' +require_relative 'rubocop/cop/mixin/annotation_comment' # relies on range +require_relative 'rubocop/cop/mixin/empty_lines_around_body' # relies on range +require_relative 'rubocop/cop/mixin/empty_parameter' +require_relative 'rubocop/cop/mixin/end_keyword_alignment' +require_relative 'rubocop/cop/mixin/enforce_superclass' +require_relative 'rubocop/cop/mixin/first_element_line_break' +require_relative 'rubocop/cop/mixin/frozen_string_literal' +require_relative 'rubocop/cop/mixin/gem_declaration' +require_relative 'rubocop/cop/mixin/gemspec_help' +require_relative 'rubocop/cop/mixin/hash_alignment_styles' +require_relative 'rubocop/cop/mixin/hash_transform_method' +require_relative 'rubocop/cop/mixin/ignored_methods' +require_relative 'rubocop/cop/mixin/integer_node' +require_relative 'rubocop/cop/mixin/interpolation' +require_relative 'rubocop/cop/mixin/line_length_help' +require_relative 'rubocop/cop/mixin/match_range' +require_relative 'rubocop/cop/metrics/utils/repeated_csend_discount' +require_relative 'rubocop/cop/metrics/utils/repeated_attribute_discount' +require_relative 'rubocop/cop/mixin/hash_shorthand_syntax' +require_relative 'rubocop/cop/mixin/method_complexity' +require_relative 'rubocop/cop/mixin/method_preference' +require_relative 'rubocop/cop/mixin/min_body_length' +require_relative 'rubocop/cop/mixin/multiline_element_indentation' +require_relative 'rubocop/cop/mixin/multiline_element_line_breaks' +require_relative 'rubocop/cop/mixin/multiline_expression_indentation' +require_relative 'rubocop/cop/mixin/multiline_literal_brace_layout' +require_relative 'rubocop/cop/mixin/negative_conditional' +require_relative 'rubocop/cop/mixin/heredoc' +require_relative 'rubocop/cop/mixin/nil_methods' +require_relative 'rubocop/cop/mixin/on_normal_if_unless' +require_relative 'rubocop/cop/mixin/ordered_gem_node' +require_relative 'rubocop/cop/mixin/parentheses' +require_relative 'rubocop/cop/mixin/percent_array' +require_relative 'rubocop/cop/mixin/percent_literal' +require_relative 'rubocop/cop/mixin/preceding_following_alignment' +require_relative 'rubocop/cop/mixin/preferred_delimiters' +require_relative 'rubocop/cop/mixin/rational_literal' +require_relative 'rubocop/cop/mixin/require_library' +require_relative 'rubocop/cop/mixin/rescue_node' +require_relative 'rubocop/cop/mixin/safe_assignment' +require_relative 'rubocop/cop/mixin/space_after_punctuation' +require_relative 'rubocop/cop/mixin/space_before_punctuation' +require_relative 'rubocop/cop/mixin/surrounding_space' +require_relative 'rubocop/cop/mixin/statement_modifier' +require_relative 'rubocop/cop/mixin/string_help' +require_relative 'rubocop/cop/mixin/string_literals_help' +require_relative 'rubocop/cop/mixin/symbol_help' +require_relative 'rubocop/cop/mixin/target_ruby_version' +require_relative 'rubocop/cop/mixin/trailing_body' +require_relative 'rubocop/cop/mixin/trailing_comma' +require_relative 'rubocop/cop/mixin/uncommunicative_name' +require_relative 'rubocop/cop/mixin/unused_argument' +require_relative 'rubocop/cop/mixin/visibility_help' +require_relative 'rubocop/cop/mixin/comments_help' # relies on visibility_help + +require_relative 'rubocop/cop/utils/format_string' + +require_relative 'rubocop/cop/migration/department_name' + +require_relative 'rubocop/cop/correctors/alignment_corrector' +require_relative 'rubocop/cop/correctors/condition_corrector' +require_relative 'rubocop/cop/correctors/each_to_for_corrector' +require_relative 'rubocop/cop/correctors/empty_line_corrector' +require_relative 'rubocop/cop/correctors/for_to_each_corrector' +require_relative 'rubocop/cop/correctors/if_then_corrector' +require_relative 'rubocop/cop/correctors/lambda_literal_to_method_corrector' +require_relative 'rubocop/cop/correctors/line_break_corrector' +require_relative 'rubocop/cop/correctors/multiline_literal_brace_corrector' +require_relative 'rubocop/cop/correctors/ordered_gem_corrector' +require_relative 'rubocop/cop/correctors/parentheses_corrector' +require_relative 'rubocop/cop/correctors/percent_literal_corrector' +require_relative 'rubocop/cop/correctors/punctuation_corrector' +require_relative 'rubocop/cop/correctors/require_library_corrector' +require_relative 'rubocop/cop/correctors/space_corrector' +require_relative 'rubocop/cop/correctors/string_literal_corrector' +require_relative 'rubocop/cop/correctors/unused_arg_corrector' + +require_relative 'rubocop/cop/bundler/duplicated_gem' +require_relative 'rubocop/cop/bundler/gem_comment' +require_relative 'rubocop/cop/bundler/gem_filename' +require_relative 'rubocop/cop/bundler/gem_version' +require_relative 'rubocop/cop/bundler/insecure_protocol_source' +require_relative 'rubocop/cop/bundler/ordered_gems' + +require_relative 'rubocop/cop/gemspec/date_assignment' +require_relative 'rubocop/cop/gemspec/duplicated_assignment' +require_relative 'rubocop/cop/gemspec/ordered_dependencies' +require_relative 'rubocop/cop/gemspec/require_mfa' +require_relative 'rubocop/cop/gemspec/required_ruby_version' +require_relative 'rubocop/cop/gemspec/ruby_version_globals_usage' + +require_relative 'rubocop/cop/layout/access_modifier_indentation' +require_relative 'rubocop/cop/layout/argument_alignment' +require_relative 'rubocop/cop/layout/array_alignment' +require_relative 'rubocop/cop/layout/assignment_indentation' +require_relative 'rubocop/cop/layout/begin_end_alignment' +require_relative 'rubocop/cop/layout/block_alignment' +require_relative 'rubocop/cop/layout/block_end_newline' +require_relative 'rubocop/cop/layout/case_indentation' +require_relative 'rubocop/cop/layout/class_structure' +require_relative 'rubocop/cop/layout/closing_heredoc_indentation' +require_relative 'rubocop/cop/layout/closing_parenthesis_indentation' +require_relative 'rubocop/cop/layout/comment_indentation' +require_relative 'rubocop/cop/layout/condition_position' +require_relative 'rubocop/cop/layout/def_end_alignment' +require_relative 'rubocop/cop/layout/dot_position' +require_relative 'rubocop/cop/layout/else_alignment' +require_relative 'rubocop/cop/layout/empty_comment' +require_relative 'rubocop/cop/layout/empty_line_after_guard_clause' +require_relative 'rubocop/cop/layout/empty_line_after_magic_comment' +require_relative 'rubocop/cop/layout/empty_line_after_multiline_condition' +require_relative 'rubocop/cop/layout/empty_line_between_defs' +require_relative 'rubocop/cop/layout/empty_lines_around_access_modifier' +require_relative 'rubocop/cop/layout/empty_lines_around_arguments' +require_relative 'rubocop/cop/layout/empty_lines_around_attribute_accessor' +require_relative 'rubocop/cop/layout/empty_lines_around_begin_body' +require_relative 'rubocop/cop/layout/empty_lines_around_block_body' +require_relative 'rubocop/cop/layout/empty_lines_around_class_body' +require_relative 'rubocop/cop/layout/empty_lines_around_exception_handling_keywords' +require_relative 'rubocop/cop/layout/empty_lines_around_method_body' +require_relative 'rubocop/cop/layout/empty_lines_around_module_body' +require_relative 'rubocop/cop/layout/empty_lines' +require_relative 'rubocop/cop/layout/end_alignment' +require_relative 'rubocop/cop/layout/end_of_line' +require_relative 'rubocop/cop/layout/extra_spacing' +require_relative 'rubocop/cop/layout/first_argument_indentation' +require_relative 'rubocop/cop/layout/first_array_element_indentation' +require_relative 'rubocop/cop/layout/first_array_element_line_break' +require_relative 'rubocop/cop/layout/first_hash_element_indentation' +require_relative 'rubocop/cop/layout/first_hash_element_line_break' +require_relative 'rubocop/cop/layout/first_method_argument_line_break' +require_relative 'rubocop/cop/layout/first_method_parameter_line_break' +require_relative 'rubocop/cop/layout/first_parameter_indentation' +require_relative 'rubocop/cop/layout/hash_alignment' +require_relative 'rubocop/cop/layout/heredoc_argument_closing_parenthesis' +require_relative 'rubocop/cop/layout/heredoc_indentation' +require_relative 'rubocop/cop/layout/indentation_consistency' +require_relative 'rubocop/cop/layout/indentation_style' +require_relative 'rubocop/cop/layout/indentation_width' +require_relative 'rubocop/cop/layout/initial_indentation' +require_relative 'rubocop/cop/layout/leading_comment_space' +require_relative 'rubocop/cop/layout/leading_empty_lines' +require_relative 'rubocop/cop/layout/line_end_string_concatenation_indentation' +require_relative 'rubocop/cop/layout/line_length' +require_relative 'rubocop/cop/layout/multiline_array_brace_layout' +require_relative 'rubocop/cop/layout/multiline_array_line_breaks' +require_relative 'rubocop/cop/layout/multiline_assignment_layout' +require_relative 'rubocop/cop/layout/multiline_block_layout' +require_relative 'rubocop/cop/layout/multiline_hash_brace_layout' +require_relative 'rubocop/cop/layout/multiline_hash_key_line_breaks' +require_relative 'rubocop/cop/layout/multiline_method_argument_line_breaks' +require_relative 'rubocop/cop/layout/multiline_method_call_brace_layout' +require_relative 'rubocop/cop/layout/multiline_method_call_indentation' +require_relative 'rubocop/cop/layout/multiline_method_definition_brace_layout' +require_relative 'rubocop/cop/layout/multiline_operation_indentation' +require_relative 'rubocop/cop/layout/parameter_alignment' +require_relative 'rubocop/cop/layout/redundant_line_break' +require_relative 'rubocop/cop/layout/rescue_ensure_alignment' +require_relative 'rubocop/cop/layout/single_line_block_chain' +require_relative 'rubocop/cop/layout/space_after_colon' +require_relative 'rubocop/cop/layout/space_after_comma' +require_relative 'rubocop/cop/layout/space_after_method_name' +require_relative 'rubocop/cop/layout/space_after_not' +require_relative 'rubocop/cop/layout/space_after_semicolon' +require_relative 'rubocop/cop/layout/space_around_block_parameters' +require_relative 'rubocop/cop/layout/space_around_equals_in_parameter_default' +require_relative 'rubocop/cop/layout/space_around_keyword' +require_relative 'rubocop/cop/layout/space_around_method_call_operator' +require_relative 'rubocop/cop/layout/space_around_operators' +require_relative 'rubocop/cop/layout/space_before_block_braces' +require_relative 'rubocop/cop/layout/space_before_brackets' +require_relative 'rubocop/cop/layout/space_before_comma' +require_relative 'rubocop/cop/layout/space_before_comment' +require_relative 'rubocop/cop/layout/space_before_first_arg' +require_relative 'rubocop/cop/layout/space_before_semicolon' +require_relative 'rubocop/cop/layout/space_in_lambda_literal' +require_relative 'rubocop/cop/layout/space_inside_array_percent_literal' +require_relative 'rubocop/cop/layout/space_inside_array_literal_brackets' +require_relative 'rubocop/cop/layout/space_inside_block_braces' +require_relative 'rubocop/cop/layout/space_inside_hash_literal_braces' +require_relative 'rubocop/cop/layout/space_inside_parens' +require_relative 'rubocop/cop/layout/space_inside_percent_literal_delimiters' +require_relative 'rubocop/cop/layout/space_inside_range_literal' +require_relative 'rubocop/cop/layout/space_inside_reference_brackets' +require_relative 'rubocop/cop/layout/space_inside_string_interpolation' +require_relative 'rubocop/cop/layout/trailing_empty_lines' +require_relative 'rubocop/cop/layout/trailing_whitespace' + +require_relative 'rubocop/cop/lint/ambiguous_assignment' +require_relative 'rubocop/cop/lint/ambiguous_block_association' +require_relative 'rubocop/cop/lint/ambiguous_operator' +require_relative 'rubocop/cop/lint/ambiguous_operator_precedence' +require_relative 'rubocop/cop/lint/ambiguous_range' +require_relative 'rubocop/cop/lint/ambiguous_regexp_literal' +require_relative 'rubocop/cop/lint/assignment_in_condition' +require_relative 'rubocop/cop/lint/big_decimal_new' +require_relative 'rubocop/cop/lint/binary_operator_with_identical_operands' +require_relative 'rubocop/cop/lint/boolean_symbol' +require_relative 'rubocop/cop/lint/circular_argument_reference' +require_relative 'rubocop/cop/lint/constant_definition_in_block' +require_relative 'rubocop/cop/lint/constant_resolution' +require_relative 'rubocop/cop/lint/debugger' +require_relative 'rubocop/cop/lint/deprecated_class_methods' +require_relative 'rubocop/cop/lint/deprecated_constants' +require_relative 'rubocop/cop/lint/deprecated_open_ssl_constant' +require_relative 'rubocop/cop/lint/disjunctive_assignment_in_constructor' +require_relative 'rubocop/cop/lint/duplicate_branch' +require_relative 'rubocop/cop/lint/duplicate_case_condition' +require_relative 'rubocop/cop/lint/duplicate_elsif_condition' +require_relative 'rubocop/cop/lint/duplicate_hash_key' +require_relative 'rubocop/cop/lint/duplicate_methods' +require_relative 'rubocop/cop/lint/duplicate_regexp_character_class_element' +require_relative 'rubocop/cop/lint/duplicate_require' +require_relative 'rubocop/cop/lint/duplicate_rescue_exception' +require_relative 'rubocop/cop/lint/each_with_object_argument' +require_relative 'rubocop/cop/lint/else_layout' +require_relative 'rubocop/cop/lint/empty_block' +require_relative 'rubocop/cop/lint/empty_class' +require_relative 'rubocop/cop/lint/empty_conditional_body' +require_relative 'rubocop/cop/lint/empty_ensure' +require_relative 'rubocop/cop/lint/empty_expression' +require_relative 'rubocop/cop/lint/empty_file' +require_relative 'rubocop/cop/lint/empty_in_pattern' +require_relative 'rubocop/cop/lint/empty_interpolation' +require_relative 'rubocop/cop/lint/empty_when' +require_relative 'rubocop/cop/lint/ensure_return' +require_relative 'rubocop/cop/lint/erb_new_arguments' +require_relative 'rubocop/cop/lint/flip_flop' +require_relative 'rubocop/cop/lint/float_comparison' +require_relative 'rubocop/cop/lint/float_out_of_range' +require_relative 'rubocop/cop/lint/format_parameter_mismatch' +require_relative 'rubocop/cop/lint/hash_compare_by_identity' +require_relative 'rubocop/cop/lint/heredoc_method_call_position' +require_relative 'rubocop/cop/lint/identity_comparison' +require_relative 'rubocop/cop/lint/implicit_string_concatenation' +require_relative 'rubocop/cop/lint/incompatible_io_select_with_fiber_scheduler' +require_relative 'rubocop/cop/lint/ineffective_access_modifier' +require_relative 'rubocop/cop/lint/inherit_exception' +require_relative 'rubocop/cop/lint/interpolation_check' +require_relative 'rubocop/cop/lint/lambda_without_literal_block' +require_relative 'rubocop/cop/lint/literal_as_condition' +require_relative 'rubocop/cop/lint/literal_in_interpolation' +require_relative 'rubocop/cop/lint/loop' +require_relative 'rubocop/cop/lint/missing_cop_enable_directive' +require_relative 'rubocop/cop/lint/missing_super' +require_relative 'rubocop/cop/lint/mixed_regexp_capture_types' +require_relative 'rubocop/cop/lint/multiple_comparison' +require_relative 'rubocop/cop/lint/nested_method_definition' +require_relative 'rubocop/cop/lint/nested_percent_literal' +require_relative 'rubocop/cop/lint/next_without_accumulator' +require_relative 'rubocop/cop/lint/no_return_in_begin_end_blocks' +require_relative 'rubocop/cop/lint/non_deterministic_require_order' +require_relative 'rubocop/cop/lint/non_local_exit_from_iterator' +require_relative 'rubocop/cop/lint/number_conversion' +require_relative 'rubocop/cop/lint/numbered_parameter_assignment' +require_relative 'rubocop/cop/lint/or_assignment_to_constant' +require_relative 'rubocop/cop/lint/ordered_magic_comments' +require_relative 'rubocop/cop/lint/out_of_range_regexp_ref' +require_relative 'rubocop/cop/lint/parentheses_as_grouped_expression' +require_relative 'rubocop/cop/lint/percent_string_array' +require_relative 'rubocop/cop/lint/percent_symbol_array' +require_relative 'rubocop/cop/lint/raise_exception' +require_relative 'rubocop/cop/lint/rand_one' +require_relative 'rubocop/cop/lint/redundant_cop_disable_directive' +require_relative 'rubocop/cop/lint/redundant_cop_enable_directive' +require_relative 'rubocop/cop/lint/redundant_dir_glob_sort' +require_relative 'rubocop/cop/lint/redundant_require_statement' +require_relative 'rubocop/cop/lint/redundant_safe_navigation' +require_relative 'rubocop/cop/lint/redundant_splat_expansion' +require_relative 'rubocop/cop/lint/redundant_string_coercion' +require_relative 'rubocop/cop/lint/redundant_with_index' +require_relative 'rubocop/cop/lint/redundant_with_object' +require_relative 'rubocop/cop/lint/refinement_import_methods' +require_relative 'rubocop/cop/lint/regexp_as_condition' +require_relative 'rubocop/cop/lint/require_parentheses' +require_relative 'rubocop/cop/lint/require_relative_self_path' +require_relative 'rubocop/cop/lint/rescue_exception' +require_relative 'rubocop/cop/lint/rescue_type' +require_relative 'rubocop/cop/lint/return_in_void_context' +require_relative 'rubocop/cop/lint/safe_navigation_consistency' +require_relative 'rubocop/cop/lint/safe_navigation_chain' +require_relative 'rubocop/cop/lint/safe_navigation_with_empty' +require_relative 'rubocop/cop/lint/script_permission' +require_relative 'rubocop/cop/lint/self_assignment' +require_relative 'rubocop/cop/lint/send_with_mixin_argument' +require_relative 'rubocop/cop/lint/shadowed_argument' +require_relative 'rubocop/cop/lint/shadowed_exception' +require_relative 'rubocop/cop/lint/shadowing_outer_local_variable' +require_relative 'rubocop/cop/lint/struct_new_override' +require_relative 'rubocop/cop/lint/suppressed_exception' +require_relative 'rubocop/cop/lint/symbol_conversion' +require_relative 'rubocop/cop/lint/syntax' +require_relative 'rubocop/cop/lint/to_enum_arguments' +require_relative 'rubocop/cop/lint/to_json' +require_relative 'rubocop/cop/lint/top_level_return_with_argument' +require_relative 'rubocop/cop/lint/trailing_comma_in_attribute_declaration' +require_relative 'rubocop/cop/lint/triple_quotes' +require_relative 'rubocop/cop/lint/underscore_prefixed_variable_name' +require_relative 'rubocop/cop/lint/unexpected_block_arity' +require_relative 'rubocop/cop/lint/unified_integer' +require_relative 'rubocop/cop/lint/unmodified_reduce_accumulator' +require_relative 'rubocop/cop/lint/unreachable_code' +require_relative 'rubocop/cop/lint/unreachable_loop' +require_relative 'rubocop/cop/lint/unused_block_argument' +require_relative 'rubocop/cop/lint/unused_method_argument' +require_relative 'rubocop/cop/lint/uri_escape_unescape' +require_relative 'rubocop/cop/lint/uri_regexp' +require_relative 'rubocop/cop/lint/useless_access_modifier' +require_relative 'rubocop/cop/lint/useless_assignment' +require_relative 'rubocop/cop/lint/useless_else_without_rescue' +require_relative 'rubocop/cop/lint/useless_method_definition' +require_relative 'rubocop/cop/lint/useless_ruby2_keywords' +require_relative 'rubocop/cop/lint/useless_setter_call' +require_relative 'rubocop/cop/lint/useless_times' +require_relative 'rubocop/cop/lint/void' + +require_relative 'rubocop/cop/metrics/utils/iterating_block' +require_relative 'rubocop/cop/metrics/cyclomatic_complexity' +# relies on cyclomatic_complexity +require_relative 'rubocop/cop/metrics/utils/abc_size_calculator' +require_relative 'rubocop/cop/metrics/utils/code_length_calculator' +require_relative 'rubocop/cop/metrics/abc_size' +require_relative 'rubocop/cop/metrics/block_length' +require_relative 'rubocop/cop/metrics/block_nesting' +require_relative 'rubocop/cop/metrics/class_length' +require_relative 'rubocop/cop/metrics/method_length' +require_relative 'rubocop/cop/metrics/module_length' +require_relative 'rubocop/cop/metrics/parameter_lists' +require_relative 'rubocop/cop/metrics/perceived_complexity' + +require_relative 'rubocop/cop/naming/accessor_method_name' +require_relative 'rubocop/cop/naming/ascii_identifiers' +require_relative 'rubocop/cop/naming/block_forwarding' +require_relative 'rubocop/cop/naming/block_parameter_name' +require_relative 'rubocop/cop/naming/class_and_module_camel_case' +require_relative 'rubocop/cop/naming/constant_name' +require_relative 'rubocop/cop/naming/file_name' +require_relative 'rubocop/cop/naming/heredoc_delimiter_case' +require_relative 'rubocop/cop/naming/heredoc_delimiter_naming' +require_relative 'rubocop/cop/naming/inclusive_language' +require_relative 'rubocop/cop/naming/memoized_instance_variable_name' +require_relative 'rubocop/cop/naming/method_name' +require_relative 'rubocop/cop/naming/method_parameter_name' +require_relative 'rubocop/cop/naming/binary_operator_parameter_name' +require_relative 'rubocop/cop/naming/predicate_name' +require_relative 'rubocop/cop/naming/rescued_exceptions_variable_name' +require_relative 'rubocop/cop/naming/variable_name' +require_relative 'rubocop/cop/naming/variable_number' + +require_relative 'rubocop/cop/style/access_modifier_declarations' +require_relative 'rubocop/cop/style/accessor_grouping' +require_relative 'rubocop/cop/style/alias' +require_relative 'rubocop/cop/style/and_or' +require_relative 'rubocop/cop/style/arguments_forwarding' +require_relative 'rubocop/cop/style/array_coercion' +require_relative 'rubocop/cop/style/array_join' +require_relative 'rubocop/cop/style/ascii_comments' +require_relative 'rubocop/cop/style/attr' +require_relative 'rubocop/cop/style/auto_resource_cleanup' +require_relative 'rubocop/cop/style/bare_percent_literals' +require_relative 'rubocop/cop/style/begin_block' +require_relative 'rubocop/cop/style/bisected_attr_accessor' +require_relative 'rubocop/cop/style/block_comments' +require_relative 'rubocop/cop/style/block_delimiters' +require_relative 'rubocop/cop/style/case_equality' +require_relative 'rubocop/cop/style/case_like_if' +require_relative 'rubocop/cop/style/character_literal' +require_relative 'rubocop/cop/style/class_and_module_children' +require_relative 'rubocop/cop/style/class_check' +require_relative 'rubocop/cop/style/class_equality_comparison' +require_relative 'rubocop/cop/style/class_methods' +require_relative 'rubocop/cop/style/class_methods_definitions' +require_relative 'rubocop/cop/style/class_vars' +require_relative 'rubocop/cop/style/collection_compact' +require_relative 'rubocop/cop/style/collection_methods' +require_relative 'rubocop/cop/style/colon_method_call' +require_relative 'rubocop/cop/style/colon_method_definition' +require_relative 'rubocop/cop/style/combinable_loops' +require_relative 'rubocop/cop/style/command_literal' +require_relative 'rubocop/cop/style/comment_annotation' +require_relative 'rubocop/cop/style/commented_keyword' +require_relative 'rubocop/cop/style/conditional_assignment' +require_relative 'rubocop/cop/style/constant_visibility' +require_relative 'rubocop/cop/style/copyright' +require_relative 'rubocop/cop/style/date_time' +require_relative 'rubocop/cop/style/def_with_parentheses' +require_relative 'rubocop/cop/style/dir' +require_relative 'rubocop/cop/style/disable_cops_within_source_code_directive' +require_relative 'rubocop/cop/style/documentation_method' +require_relative 'rubocop/cop/style/documentation' +require_relative 'rubocop/cop/style/document_dynamic_eval_definition' +require_relative 'rubocop/cop/style/double_cop_disable_directive' +require_relative 'rubocop/cop/style/double_negation' +require_relative 'rubocop/cop/style/each_for_simple_loop' +require_relative 'rubocop/cop/style/each_with_object' +require_relative 'rubocop/cop/style/empty_block_parameter' +require_relative 'rubocop/cop/style/empty_case_condition' +require_relative 'rubocop/cop/style/empty_else' +require_relative 'rubocop/cop/style/empty_lambda_parameter' +require_relative 'rubocop/cop/style/empty_literal' +require_relative 'rubocop/cop/style/empty_method' +require_relative 'rubocop/cop/style/endless_method' +require_relative 'rubocop/cop/style/encoding' +require_relative 'rubocop/cop/style/end_block' +require_relative 'rubocop/cop/style/eval_with_location' +require_relative 'rubocop/cop/style/even_odd' +require_relative 'rubocop/cop/style/expand_path_arguments' +require_relative 'rubocop/cop/style/explicit_block_argument' +require_relative 'rubocop/cop/style/exponential_notation' +require_relative 'rubocop/cop/style/fetch_env_var' +require_relative 'rubocop/cop/style/file_read' +require_relative 'rubocop/cop/style/file_write' +require_relative 'rubocop/cop/style/float_division' +require_relative 'rubocop/cop/style/for' +require_relative 'rubocop/cop/style/format_string' +require_relative 'rubocop/cop/style/format_string_token' +require_relative 'rubocop/cop/style/frozen_string_literal_comment' +require_relative 'rubocop/cop/style/global_std_stream' +require_relative 'rubocop/cop/style/global_vars' +require_relative 'rubocop/cop/style/guard_clause' +require_relative 'rubocop/cop/style/hash_as_last_array_item' +require_relative 'rubocop/cop/style/hash_conversion' +require_relative 'rubocop/cop/style/hash_each_methods' +require_relative 'rubocop/cop/style/hash_except' +require_relative 'rubocop/cop/style/hash_like_case' +require_relative 'rubocop/cop/style/hash_syntax' +require_relative 'rubocop/cop/style/hash_transform_keys' +require_relative 'rubocop/cop/style/hash_transform_values' +require_relative 'rubocop/cop/style/identical_conditional_branches' +require_relative 'rubocop/cop/style/if_inside_else' +require_relative 'rubocop/cop/style/if_unless_modifier' +require_relative 'rubocop/cop/style/if_unless_modifier_of_if_unless' +require_relative 'rubocop/cop/style/if_with_boolean_literal_branches' +require_relative 'rubocop/cop/style/if_with_semicolon' +require_relative 'rubocop/cop/style/implicit_runtime_error' +require_relative 'rubocop/cop/style/in_pattern_then' +require_relative 'rubocop/cop/style/infinite_loop' +require_relative 'rubocop/cop/style/inverse_methods' +require_relative 'rubocop/cop/style/inline_comment' +require_relative 'rubocop/cop/style/ip_addresses' +require_relative 'rubocop/cop/style/keyword_parameters_order' +require_relative 'rubocop/cop/style/lambda' +require_relative 'rubocop/cop/style/lambda_call' +require_relative 'rubocop/cop/style/line_end_concatenation' +require_relative 'rubocop/cop/style/map_to_hash' +require_relative 'rubocop/cop/style/method_call_without_args_parentheses' +require_relative 'rubocop/cop/style/method_call_with_args_parentheses' +require_relative 'rubocop/cop/style/multiline_in_pattern_then' +require_relative 'rubocop/cop/style/numbered_parameters' +require_relative 'rubocop/cop/style/open_struct_use' +require_relative 'rubocop/cop/style/redundant_assignment' +require_relative 'rubocop/cop/style/redundant_fetch_block' +require_relative 'rubocop/cop/style/redundant_file_extension_in_require' +require_relative 'rubocop/cop/style/redundant_initialize' +require_relative 'rubocop/cop/style/redundant_self_assignment' +require_relative 'rubocop/cop/style/redundant_self_assignment_branch' +require_relative 'rubocop/cop/style/sole_nested_conditional' +require_relative 'rubocop/cop/style/static_class' +require_relative 'rubocop/cop/style/method_called_on_do_end_block' +require_relative 'rubocop/cop/style/method_def_parentheses' +require_relative 'rubocop/cop/style/min_max' +require_relative 'rubocop/cop/style/missing_else' +require_relative 'rubocop/cop/style/missing_respond_to_missing' +require_relative 'rubocop/cop/style/mixin_grouping' +require_relative 'rubocop/cop/style/mixin_usage' +require_relative 'rubocop/cop/style/module_function' +require_relative 'rubocop/cop/style/multiline_block_chain' +require_relative 'rubocop/cop/style/multiline_if_then' +require_relative 'rubocop/cop/style/multiline_if_modifier' +require_relative 'rubocop/cop/style/multiline_method_signature' +require_relative 'rubocop/cop/style/multiline_memoization' +require_relative 'rubocop/cop/style/multiline_ternary_operator' +require_relative 'rubocop/cop/style/multiline_when_then' +require_relative 'rubocop/cop/style/multiple_comparison' +require_relative 'rubocop/cop/style/mutable_constant' +require_relative 'rubocop/cop/style/negated_if' +require_relative 'rubocop/cop/style/negated_if_else_condition' +require_relative 'rubocop/cop/style/negated_unless' +require_relative 'rubocop/cop/style/negated_while' +require_relative 'rubocop/cop/style/nested_file_dirname' +require_relative 'rubocop/cop/style/nested_modifier' +require_relative 'rubocop/cop/style/nested_parenthesized_calls' +require_relative 'rubocop/cop/style/nested_ternary_operator' +require_relative 'rubocop/cop/style/next' +require_relative 'rubocop/cop/style/nil_comparison' +require_relative 'rubocop/cop/style/nil_lambda' +require_relative 'rubocop/cop/style/non_nil_check' +require_relative 'rubocop/cop/style/not' +require_relative 'rubocop/cop/style/numbered_parameters_limit' +require_relative 'rubocop/cop/style/numeric_literals' +require_relative 'rubocop/cop/style/numeric_literal_prefix' +require_relative 'rubocop/cop/style/numeric_predicate' +require_relative 'rubocop/cop/style/object_then' +require_relative 'rubocop/cop/style/one_line_conditional' +require_relative 'rubocop/cop/style/or_assignment' +require_relative 'rubocop/cop/style/option_hash' +require_relative 'rubocop/cop/style/optional_arguments' +require_relative 'rubocop/cop/style/optional_boolean_parameter' +require_relative 'rubocop/cop/style/parallel_assignment' +require_relative 'rubocop/cop/style/parentheses_around_condition' +require_relative 'rubocop/cop/style/percent_literal_delimiters' +require_relative 'rubocop/cop/style/percent_q_literals' +require_relative 'rubocop/cop/style/perl_backrefs' +require_relative 'rubocop/cop/style/preferred_hash_methods' +require_relative 'rubocop/cop/style/proc' +require_relative 'rubocop/cop/style/quoted_symbols' +require_relative 'rubocop/cop/style/raise_args' +require_relative 'rubocop/cop/style/random_with_offset' +require_relative 'rubocop/cop/style/redundant_argument' +require_relative 'rubocop/cop/style/redundant_begin' +require_relative 'rubocop/cop/style/redundant_capital_w' +require_relative 'rubocop/cop/style/redundant_condition' +require_relative 'rubocop/cop/style/redundant_conditional' +require_relative 'rubocop/cop/style/redundant_exception' +require_relative 'rubocop/cop/style/redundant_freeze' +require_relative 'rubocop/cop/style/redundant_interpolation' +require_relative 'rubocop/cop/style/redundant_parentheses' +require_relative 'rubocop/cop/style/redundant_percent_q' +require_relative 'rubocop/cop/style/redundant_regexp_character_class' +require_relative 'rubocop/cop/style/redundant_regexp_escape' +require_relative 'rubocop/cop/style/redundant_return' +require_relative 'rubocop/cop/style/redundant_self' +require_relative 'rubocop/cop/style/redundant_sort' +require_relative 'rubocop/cop/style/redundant_sort_by' +require_relative 'rubocop/cop/style/regexp_literal' +require_relative 'rubocop/cop/style/rescue_modifier' +require_relative 'rubocop/cop/style/rescue_standard_error' +require_relative 'rubocop/cop/style/return_nil' +require_relative 'rubocop/cop/style/safe_navigation' +require_relative 'rubocop/cop/style/sample' +require_relative 'rubocop/cop/style/select_by_regexp' +require_relative 'rubocop/cop/style/self_assignment' +require_relative 'rubocop/cop/style/semicolon' +require_relative 'rubocop/cop/style/send' +require_relative 'rubocop/cop/style/signal_exception' +require_relative 'rubocop/cop/style/single_argument_dig' +require_relative 'rubocop/cop/style/single_line_block_params' +require_relative 'rubocop/cop/style/single_line_methods' +require_relative 'rubocop/cop/style/slicing_with_range' +require_relative 'rubocop/cop/style/special_global_vars' +require_relative 'rubocop/cop/style/stabby_lambda_parentheses' +require_relative 'rubocop/cop/style/stderr_puts' +require_relative 'rubocop/cop/style/string_chars' +require_relative 'rubocop/cop/style/string_concatenation' +require_relative 'rubocop/cop/style/string_hash_keys' +require_relative 'rubocop/cop/style/string_literals' +require_relative 'rubocop/cop/style/string_literals_in_interpolation' +require_relative 'rubocop/cop/style/string_methods' +require_relative 'rubocop/cop/style/strip' +require_relative 'rubocop/cop/style/struct_inheritance' +require_relative 'rubocop/cop/style/swap_values' +require_relative 'rubocop/cop/style/symbol_array' +require_relative 'rubocop/cop/style/symbol_literal' +require_relative 'rubocop/cop/style/symbol_proc' +require_relative 'rubocop/cop/style/ternary_parentheses' +require_relative 'rubocop/cop/style/top_level_method_definition' +require_relative 'rubocop/cop/style/trailing_body_on_class' +require_relative 'rubocop/cop/style/trailing_body_on_method_definition' +require_relative 'rubocop/cop/style/trailing_body_on_module' +require_relative 'rubocop/cop/style/trailing_comma_in_arguments' +require_relative 'rubocop/cop/style/trailing_comma_in_array_literal' +require_relative 'rubocop/cop/style/trailing_comma_in_block_args' +require_relative 'rubocop/cop/style/trailing_comma_in_hash_literal' +require_relative 'rubocop/cop/style/trailing_method_end_statement' +require_relative 'rubocop/cop/style/trailing_underscore_variable' +require_relative 'rubocop/cop/style/trivial_accessors' +require_relative 'rubocop/cop/style/unless_else' +require_relative 'rubocop/cop/style/unless_logical_operators' +require_relative 'rubocop/cop/style/unpack_first' +require_relative 'rubocop/cop/style/variable_interpolation' +require_relative 'rubocop/cop/style/when_then' +require_relative 'rubocop/cop/style/while_until_do' +require_relative 'rubocop/cop/style/while_until_modifier' +require_relative 'rubocop/cop/style/word_array' +require_relative 'rubocop/cop/style/yoda_condition' +require_relative 'rubocop/cop/style/zero_length_predicate' + +require_relative 'rubocop/cop/security/compound_hash' +require_relative 'rubocop/cop/security/eval' +require_relative 'rubocop/cop/security/io_methods' +require_relative 'rubocop/cop/security/json_load' +require_relative 'rubocop/cop/security/marshal_load' +require_relative 'rubocop/cop/security/open' +require_relative 'rubocop/cop/security/yaml_load' + +require_relative 'rubocop/cop/team' + +require_relative 'rubocop/formatter/base_formatter' +require_relative 'rubocop/formatter/simple_text_formatter' +# relies on simple text +require_relative 'rubocop/formatter/clang_style_formatter' +require_relative 'rubocop/formatter/disabled_config_formatter' +require_relative 'rubocop/formatter/emacs_style_formatter' +require_relative 'rubocop/formatter/file_list_formatter' +require_relative 'rubocop/formatter/fuubar_style_formatter' +require_relative 'rubocop/formatter/git_hub_actions_formatter' +require_relative 'rubocop/formatter/html_formatter' +require_relative 'rubocop/formatter/json_formatter' +require_relative 'rubocop/formatter/junit_formatter' +require_relative 'rubocop/formatter/offense_count_formatter' +require_relative 'rubocop/formatter/progress_formatter' +require_relative 'rubocop/formatter/quiet_formatter' +require_relative 'rubocop/formatter/tap_formatter' +require_relative 'rubocop/formatter/worst_offenders_formatter' +require_relative 'rubocop/formatter/pacman_formatter' +# relies on progress formatter +require_relative 'rubocop/formatter/auto_gen_config_formatter' + +require_relative 'rubocop/formatter/formatter_set' + +require_relative 'rubocop/cached_data' +require_relative 'rubocop/config' +require_relative 'rubocop/config_loader_resolver' +require_relative 'rubocop/config_loader' +require_relative 'rubocop/config_obsoletion/rule' +require_relative 'rubocop/config_obsoletion/cop_rule' +require_relative 'rubocop/config_obsoletion/parameter_rule' +require_relative 'rubocop/config_obsoletion/changed_enforced_styles' +require_relative 'rubocop/config_obsoletion/changed_parameter' +require_relative 'rubocop/config_obsoletion/extracted_cop' +require_relative 'rubocop/config_obsoletion/removed_cop' +require_relative 'rubocop/config_obsoletion/renamed_cop' +require_relative 'rubocop/config_obsoletion/split_cop' +require_relative 'rubocop/config_obsoletion' +require_relative 'rubocop/config_store' +require_relative 'rubocop/config_validator' +require_relative 'rubocop/lockfile' +require_relative 'rubocop/target_finder' +require_relative 'rubocop/directive_comment' +require_relative 'rubocop/comment_config' +require_relative 'rubocop/magic_comment' +require_relative 'rubocop/result_cache' +require_relative 'rubocop/runner' +require_relative 'rubocop/cli' +require_relative 'rubocop/cli/command' +require_relative 'rubocop/cli/environment' +require_relative 'rubocop/cli/command/base' +require_relative 'rubocop/cli/command/auto_genenerate_config' +require_relative 'rubocop/cli/command/execute_runner' +require_relative 'rubocop/cli/command/init_dotfile' +require_relative 'rubocop/cli/command/show_cops' +require_relative 'rubocop/cli/command/show_docs_url' +require_relative 'rubocop/cli/command/suggest_extensions' +require_relative 'rubocop/cli/command/version' +require_relative 'rubocop/config_regeneration' +require_relative 'rubocop/options' +require_relative 'rubocop/remote_config' +require_relative 'rubocop/target_ruby' +require_relative 'rubocop/yaml_duplication_checker' + +unless File.exist?("#{__dir__}/../rubocop.gemspec") # Check if we are a gem + RuboCop::ResultCache.rubocop_required_features = $LOADED_FEATURES - before_us +end +RuboCop::AST.rubocop_loaded if RuboCop::AST.respond_to?(:rubocop_loaded) diff --git a/vendor/bundle/ruby/3.1.0/gems/rubocop-1.28.2/lib/rubocop/ast_aliases.rb b/vendor/bundle/ruby/3.1.0/gems/rubocop-1.28.2/lib/rubocop/ast_aliases.rb new file mode 100644 index 000000000..e0f0cd3dc --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/rubocop-1.28.2/lib/rubocop/ast_aliases.rb @@ -0,0 +1,8 @@ +# frozen_string_literal: true + +# These aliases are for compatibility. +module RuboCop + NodePattern = AST::NodePattern + ProcessedSource = AST::ProcessedSource + Token = AST::Token +end diff --git a/vendor/bundle/ruby/3.1.0/gems/rubocop-1.28.2/lib/rubocop/cached_data.rb b/vendor/bundle/ruby/3.1.0/gems/rubocop-1.28.2/lib/rubocop/cached_data.rb new file mode 100644 index 000000000..16d9ecaa4 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/rubocop-1.28.2/lib/rubocop/cached_data.rb @@ -0,0 +1,58 @@ +# frozen_string_literal: true + +require 'json' + +module RuboCop + # Converts RuboCop objects to and from the serialization format JSON. + # @api private + class CachedData + def initialize(filename) + @filename = filename + end + + def from_json(text) + deserialize_offenses(JSON.parse(text)) + end + + def to_json(offenses) + JSON.dump(offenses.map { |o| serialize_offense(o) }) + end + + private + + def serialize_offense(offense) + status = :uncorrected if %i[corrected corrected_with_todo].include?(offense.status) + { + # Calling #to_s here ensures that the serialization works when using + # other json serializers such as Oj. Some of these gems do not call + # #to_s implicitly. + severity: offense.severity.to_s, + location: { + begin_pos: offense.location.begin_pos, + end_pos: offense.location.end_pos + }, + message: message(offense), + cop_name: offense.cop_name, + status: status || offense.status + } + end + + def message(offense) + # JSON.dump will fail if the offense message contains text which is not + # valid UTF-8 + offense.message.dup.force_encoding(::Encoding::UTF_8).scrub + end + + # Restore an offense object loaded from a JSON file. + def deserialize_offenses(offenses) + source_buffer = Parser::Source::Buffer.new(@filename) + source_buffer.source = File.read(@filename, encoding: Encoding::UTF_8) + offenses.map! do |o| + location = Parser::Source::Range.new(source_buffer, + o['location']['begin_pos'], + o['location']['end_pos']) + Cop::Offense.new(o['severity'], location, o['message'], o['cop_name'], o['status'].to_sym) + end + end + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/rubocop-1.28.2/lib/rubocop/cli.rb b/vendor/bundle/ruby/3.1.0/gems/rubocop-1.28.2/lib/rubocop/cli.rb new file mode 100644 index 000000000..da5dc34a4 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/rubocop-1.28.2/lib/rubocop/cli.rb @@ -0,0 +1,152 @@ +# frozen_string_literal: true + +module RuboCop + # The CLI is a class responsible of handling all the command line interface + # logic. + class CLI + STATUS_SUCCESS = 0 + STATUS_OFFENSES = 1 + STATUS_ERROR = 2 + STATUS_INTERRUPTED = 128 + Signal.list['INT'] + DEFAULT_PARALLEL_OPTIONS = %i[ + color debug display_style_guide display_time display_only_fail_level_offenses + display_only_failed except extra_details fail_level fix_layout format + ignore_disable_comments lint only only_guide_cops require safe + ].freeze + + class Finished < StandardError; end + + attr_reader :options, :config_store + + def initialize + @options = {} + @config_store = ConfigStore.new + end + + # @api public + # + # Entry point for the application logic. Here we + # do the command line arguments processing and inspect + # the target files. + # + # @param args [Array] command line arguments + # @return [Integer] UNIX exit code + # + # rubocop:disable Metrics/MethodLength, Metrics/AbcSize + def run(args = ARGV) + @options, paths = Options.new.parse(args) + @env = Environment.new(@options, @config_store, paths) + + if @options[:init] + run_command(:init) + else + act_on_options + validate_options_vs_config + parallel_by_default! + apply_default_formatter + execute_runners + end + rescue ConfigNotFoundError, IncorrectCopNameError, OptionArgumentError => e + warn e.message + STATUS_ERROR + rescue RuboCop::Error => e + warn Rainbow("Error: #{e.message}").red + STATUS_ERROR + rescue Finished + STATUS_SUCCESS + rescue OptionParser::InvalidOption => e + warn e.message + warn 'For usage information, use --help' + STATUS_ERROR + rescue StandardError, SyntaxError, LoadError => e + warn e.message + warn e.backtrace + STATUS_ERROR + end + # rubocop:enable Metrics/MethodLength, Metrics/AbcSize + + private + + def run_command(name) + @env.run(name) + end + + def execute_runners + if @options[:auto_gen_config] + run_command(:auto_gen_config) + else + run_command(:execute_runner).tap { suggest_extensions } + end + end + + def suggest_extensions + run_command(:suggest_extensions) + end + + def validate_options_vs_config + return unless @options[:parallel] && !@config_store.for_pwd.for_all_cops['UseCache'] + + raise OptionArgumentError, '-P/--parallel uses caching to speed up execution, so combining ' \ + 'with AllCops: UseCache: false is not allowed.' + end + + def parallel_by_default! + # See https://github.com/rubocop/rubocop/pull/4537 for JRuby and Windows constraints. + return if RUBY_ENGINE != 'ruby' || RuboCop::Platform.windows? + + if (@options.keys - DEFAULT_PARALLEL_OPTIONS).empty? && + @config_store.for_pwd.for_all_cops['UseCache'] != false + puts 'Use parallel by default.' if @options[:debug] + + @options[:parallel] = true + end + end + + def act_on_options + set_options_to_config_loader + + @config_store.options_config = @options[:config] if @options[:config] + @config_store.force_default_config! if @options[:force_default_config] + + handle_exiting_options + + if @options[:color] + # color output explicitly forced on + Rainbow.enabled = true + elsif @options[:color] == false + # color output explicitly forced off + Rainbow.enabled = false + end + end + + def set_options_to_config_loader + ConfigLoader.debug = @options[:debug] + ConfigLoader.disable_pending_cops = @options[:disable_pending_cops] + ConfigLoader.enable_pending_cops = @options[:enable_pending_cops] + ConfigLoader.ignore_parent_exclusion = @options[:ignore_parent_exclusion] + end + + def handle_exiting_options + return unless Options::EXITING_OPTIONS.any? { |o| @options.key? o } + + run_command(:version) if @options[:version] || @options[:verbose_version] + run_command(:show_cops) if @options[:show_cops] + run_command(:show_docs_url) if @options[:show_docs_url] + raise Finished + end + + def apply_default_formatter + # This must be done after the options have already been processed, + # because they can affect how ConfigStore behaves + @options[:formatters] ||= begin + if @options[:auto_gen_config] + formatter = 'autogenconf' + else + cfg = @config_store.for_pwd.for_all_cops + formatter = cfg['DefaultFormatter'] || 'progress' + end + [[formatter, @options[:output_path]]] + end + end + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/rubocop-1.28.2/lib/rubocop/cli/command.rb b/vendor/bundle/ruby/3.1.0/gems/rubocop-1.28.2/lib/rubocop/cli/command.rb new file mode 100644 index 000000000..775e929a2 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/rubocop-1.28.2/lib/rubocop/cli/command.rb @@ -0,0 +1,22 @@ +# frozen_string_literal: true + +module RuboCop + class CLI + # Home of subcommands in the CLI. + # @api private + module Command + class << self + # Find the command with a given name and run it in an environment. + def run(env, name) + class_for(name).new(env).run + end + + private + + def class_for(name) + Base.by_command_name(name) + end + end + end + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/rubocop-1.28.2/lib/rubocop/cli/command/auto_genenerate_config.rb b/vendor/bundle/ruby/3.1.0/gems/rubocop-1.28.2/lib/rubocop/cli/command/auto_genenerate_config.rb new file mode 100644 index 000000000..5b152c017 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/rubocop-1.28.2/lib/rubocop/cli/command/auto_genenerate_config.rb @@ -0,0 +1,132 @@ +# frozen_string_literal: true + +module RuboCop + class CLI + module Command + # Generate a configuration file acting as a TODO list. + # @api private + class AutoGenerateConfig < Base + self.command_name = :auto_gen_config + + AUTO_GENERATED_FILE = '.rubocop_todo.yml' + YAML_OPTIONAL_DOC_START = /\A---(\s+#|\s*\z)/.freeze + + PHASE_1 = 'Phase 1 of 2: run Layout/LineLength cop' + PHASE_2 = 'Phase 2 of 2: run all cops' + + PHASE_1_OVERRIDDEN = '(skipped because the default Layout/LineLength:Max is overridden)' + PHASE_1_DISABLED = '(skipped because Layout/LineLength is disabled)' + + def run + add_formatter + reset_config_and_auto_gen_file + line_length_contents = maybe_run_line_length_cop + run_all_cops(line_length_contents) + end + + private + + def maybe_run_line_length_cop + if !line_length_enabled?(@config_store.for_pwd) + skip_line_length_cop(PHASE_1_DISABLED) + elsif !same_max_line_length?(@config_store.for_pwd, ConfigLoader.default_configuration) + skip_line_length_cop(PHASE_1_OVERRIDDEN) + else + run_line_length_cop + end + end + + def skip_line_length_cop(reason) + puts Rainbow("#{PHASE_1} #{reason}").yellow + '' + end + + def line_length_enabled?(config) + line_length_cop(config)['Enabled'] + end + + def same_max_line_length?(config1, config2) + max_line_length(config1) == max_line_length(config2) + end + + def max_line_length(config) + line_length_cop(config)['Max'] + end + + def line_length_cop(config) + config.for_cop('Layout/LineLength') + end + + # Do an initial run with only Layout/LineLength so that cops that + # depend on Layout/LineLength:Max get the correct value for that + # parameter. + def run_line_length_cop + puts Rainbow(PHASE_1).yellow + @options[:only] = ['Layout/LineLength'] + execute_runner + @options.delete(:only) + @config_store = ConfigStore.new + # Save the todo configuration of the LineLength cop. + File.read(AUTO_GENERATED_FILE).lines.drop_while { |line| line.start_with?('#') }.join + end + + def run_all_cops(line_length_contents) + puts Rainbow(PHASE_2).yellow + result = execute_runner + # This run was made with the current maximum length allowed, so append + # the saved setting for LineLength. + File.open(AUTO_GENERATED_FILE, 'a') { |f| f.write(line_length_contents) } + result + end + + def reset_config_and_auto_gen_file + @config_store = ConfigStore.new + @config_store.options_config = @options[:config] if @options[:config] + File.open(AUTO_GENERATED_FILE, 'w') {} # create or truncate if exists + add_inheritance_from_auto_generated_file(@options[:config]) + end + + def add_formatter + @options[:formatters] << [Formatter::DisabledConfigFormatter, AUTO_GENERATED_FILE] + end + + def execute_runner + Environment.new(@options, @config_store, @paths).run(:execute_runner) + end + + def add_inheritance_from_auto_generated_file(config_file) + file_string = " #{AUTO_GENERATED_FILE}" + + config_file ||= ConfigLoader::DOTFILE + + if File.exist?(config_file) + files = Array(ConfigLoader.load_yaml_configuration(config_file)['inherit_from']) + + return if files.include?(AUTO_GENERATED_FILE) + + files.unshift(AUTO_GENERATED_FILE) + file_string = "\n - #{files.join("\n - ")}" if files.size > 1 + rubocop_yml_contents = existing_configuration(config_file) + end + + write_config_file(config_file, file_string, rubocop_yml_contents) + + puts "Added inheritance from `#{AUTO_GENERATED_FILE}` in `#{ConfigLoader::DOTFILE}`." + end + + def existing_configuration(config_file) + File.read(config_file, encoding: Encoding::UTF_8) + .sub(/^inherit_from: *[^\n]+/, '') + .sub(/^inherit_from: *(\n *- *[^\n]+)+/, '') + end + + def write_config_file(file_name, file_string, rubocop_yml_contents) + lines = /\S/.match?(rubocop_yml_contents) ? rubocop_yml_contents.split("\n", -1) : [] + doc_start_index = lines.index { |line| YAML_OPTIONAL_DOC_START.match?(line) } || -1 + lines.insert(doc_start_index + 1, "inherit_from:#{file_string}\n") + File.write(file_name, lines.join("\n")) + end + end + end + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/rubocop-1.28.2/lib/rubocop/cli/command/base.rb b/vendor/bundle/ruby/3.1.0/gems/rubocop-1.28.2/lib/rubocop/cli/command/base.rb new file mode 100644 index 000000000..f35798a48 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/rubocop-1.28.2/lib/rubocop/cli/command/base.rb @@ -0,0 +1,35 @@ +# frozen_string_literal: true + +module RuboCop + class CLI + module Command + # A subcommand in the CLI. + # @api private + class Base + attr_reader :env + + @subclasses = [] + + class << self + attr_accessor :command_name + + def inherited(subclass) + super + @subclasses << subclass + end + + def by_command_name(name) + @subclasses.detect { |s| s.command_name == name } + end + end + + def initialize(env) + @env = env + @options = env.options + @config_store = env.config_store + @paths = env.paths + end + end + end + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/rubocop-1.28.2/lib/rubocop/cli/command/execute_runner.rb b/vendor/bundle/ruby/3.1.0/gems/rubocop-1.28.2/lib/rubocop/cli/command/execute_runner.rb new file mode 100644 index 000000000..40c1d9ecd --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/rubocop-1.28.2/lib/rubocop/cli/command/execute_runner.rb @@ -0,0 +1,100 @@ +# frozen_string_literal: true + +module RuboCop + class CLI + module Command + # Run all the selected cops and report the result. + # @api private + class ExecuteRunner < Base + include Formatter::TextUtil + + # Combination of short and long formatter names. + INTEGRATION_FORMATTERS = %w[h html j json ju junit].freeze + + self.command_name = :execute_runner + + def run + execute_runner(@paths) + end + + private + + def execute_runner(paths) + runner = Runner.new(@options, @config_store) + + all_pass_or_excluded = with_redirect do + all_passed = runner.run(paths) + display_summary(runner) + all_passed || @options[:auto_gen_config] + end + + maybe_print_corrected_source + + if runner.aborting? + STATUS_INTERRUPTED + elsif all_pass_or_excluded && runner.errors.empty? + STATUS_SUCCESS + else + STATUS_OFFENSES + end + end + + def with_redirect + if @options[:stderr] + orig_stdout = $stdout.dup + $stdout.reopen($stderr) + + result = yield + + $stdout.reopen(orig_stdout) + result + else + yield + end + end + + def display_summary(runner) + display_warning_summary(runner.warnings) + display_error_summary(runner.errors) + end + + def display_warning_summary(warnings) + return if warnings.empty? + + warn Rainbow("\n#{pluralize(warnings.size, 'warning')}:").yellow + + warnings.each { |warning| warn warning } + end + + def display_error_summary(errors) + return if errors.empty? + + warn Rainbow("\n#{pluralize(errors.size, 'error')} occurred:").red + + errors.each { |error| warn error } + + warn <<~WARNING + Errors are usually caused by RuboCop bugs. + Please, report your problems to RuboCop's issue tracker. + #{Gem.loaded_specs['rubocop'].metadata['bug_tracker_uri']} + + Mention the following information in the issue report: + #{RuboCop::Version.version(debug: true)} + WARNING + end + + def maybe_print_corrected_source + # Integration tools (like RubyMine) expect to have only the JSON result + # when specifying JSON format. Similar HTML and JUnit are targeted as well. + # See: https://github.com/rubocop/rubocop/issues/8673 + return if INTEGRATION_FORMATTERS.include?(@options[:format]) + + return unless @options[:stdin] && @options[:auto_correct] + + (@options[:stderr] ? $stderr : $stdout).puts '=' * 20 + print @options[:stdin] + end + end + end + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/rubocop-1.28.2/lib/rubocop/cli/command/init_dotfile.rb b/vendor/bundle/ruby/3.1.0/gems/rubocop-1.28.2/lib/rubocop/cli/command/init_dotfile.rb new file mode 100644 index 000000000..0e85f48b8 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/rubocop-1.28.2/lib/rubocop/cli/command/init_dotfile.rb @@ -0,0 +1,44 @@ +# frozen_string_literal: true + +module RuboCop + class CLI + module Command + # Generate a .rubocop.yml file in the current directory. + # @api private + class InitDotfile < Base + DOTFILE = ConfigLoader::DOTFILE + + self.command_name = :init + + def run + path = File.expand_path(DOTFILE) + + if File.exist?(DOTFILE) + warn Rainbow("#{DOTFILE} already exists at #{path}").red + + STATUS_ERROR + else + description = <<~DESC + # The behavior of RuboCop can be controlled via the .rubocop.yml + # configuration file. It makes it possible to enable/disable + # certain cops (checks) and to alter their behavior if they accept + # any parameters. The file can be placed either in your home + # directory or in some project directory. + # + # RuboCop will start looking for the configuration file in the directory + # where the inspected file is and continue its way up to the root directory. + # + # See https://docs.rubocop.org/rubocop/configuration + DESC + + File.write(DOTFILE, description) + + puts "Writing new #{DOTFILE} to #{path}" + + STATUS_SUCCESS + end + end + end + end + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/rubocop-1.28.2/lib/rubocop/cli/command/show_cops.rb b/vendor/bundle/ruby/3.1.0/gems/rubocop-1.28.2/lib/rubocop/cli/command/show_cops.rb new file mode 100644 index 000000000..dc480a599 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/rubocop-1.28.2/lib/rubocop/cli/command/show_cops.rb @@ -0,0 +1,74 @@ +# frozen_string_literal: true + +module RuboCop + class CLI + module Command + # Shows the given cops, or all cops by default, and their configurations + # for the current directory. + # @api private + class ShowCops < Base + self.command_name = :show_cops + + def initialize(env) + super + + # Load the configs so the require()s are done for custom cops + @config = @config_store.for(Dir.pwd) + end + + def run + print_available_cops + end + + private + + def print_available_cops + registry = Cop::Registry.global + show_all = @options[:show_cops].empty? + + puts "# Available cops (#{registry.length}) + config for #{Dir.pwd}: " if show_all + + registry.departments.sort!.each do |department| + print_cops_of_department(registry, department, show_all) + end + end + + def print_cops_of_department(registry, department, show_all) + selected_cops = if show_all + cops_of_department(registry, department) + else + selected_cops_of_department(registry, department) + end + + puts "# Department '#{department}' (#{selected_cops.length}):" if show_all + + print_cop_details(selected_cops) + end + + def print_cop_details(cops) + cops.each do |cop| + puts '# Supports --auto-correct' if cop.support_autocorrect? + puts "#{cop.cop_name}:" + puts config_lines(cop) + puts + end + end + + def selected_cops_of_department(cops, department) + cops_of_department(cops, department).select do |cop| + @options[:show_cops].include?(cop.cop_name) + end + end + + def cops_of_department(cops, department) + cops.with_department(department).sort! + end + + def config_lines(cop) + cnf = @config.for_cop(cop) + cnf.to_yaml.lines.to_a.drop(1).map { |line| " #{line}" } + end + end + end + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/rubocop-1.28.2/lib/rubocop/cli/command/show_docs_url.rb b/vendor/bundle/ruby/3.1.0/gems/rubocop-1.28.2/lib/rubocop/cli/command/show_docs_url.rb new file mode 100644 index 000000000..b286ab737 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/rubocop-1.28.2/lib/rubocop/cli/command/show_docs_url.rb @@ -0,0 +1,48 @@ +# frozen_string_literal: true + +module RuboCop + class CLI + module Command + # Prints out url to documentation of provided cops + # or documentation base url by default. + # @api private + class ShowDocsUrl < Base + self.command_name = :show_docs_url + + def initialize(env) + super + + @config = @config_store.for(Dir.pwd) + end + + def run + print_documentation_url + end + + private + + def print_documentation_url + puts Cop::Documentation.default_base_url if cops_array.empty? + + cops_array.each do |cop_name| + cop = registry_hash[cop_name] + + next if cop.empty? + + puts Cop::Documentation.url_for(cop.first, @config) + end + + puts + end + + def cops_array + @cops_array ||= @options[:show_docs_url] + end + + def registry_hash + @registry_hash ||= Cop::Registry.global.to_h + end + end + end + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/rubocop-1.28.2/lib/rubocop/cli/command/suggest_extensions.rb b/vendor/bundle/ruby/3.1.0/gems/rubocop-1.28.2/lib/rubocop/cli/command/suggest_extensions.rb new file mode 100644 index 000000000..9f9159a03 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/rubocop-1.28.2/lib/rubocop/cli/command/suggest_extensions.rb @@ -0,0 +1,81 @@ +# frozen_string_literal: true + +module RuboCop + class CLI + module Command + # Suggest RuboCop extensions to install based on Gemfile dependencies. + # Only primary dependencies are evaluated, so if a dependency depends on a + # gem with an extension, it is not suggested. However, if an extension is + # a transitive dependency, it will not be suggested. + # @api private + class SuggestExtensions < Base + # Combination of short and long formatter names. + INCLUDED_FORMATTERS = %w[p progress fu fuubar pa pacman].freeze + + self.command_name = :suggest_extensions + + def run + return if skip? || extensions.none? + + puts + puts 'Tip: Based on detected gems, the following '\ + 'RuboCop extension libraries might be helpful:' + + extensions.sort.each do |extension| + puts " * #{extension} (https://rubygems.org/gems/#{extension})" + end + + puts + puts 'You can opt out of this message by adding the following to your config '\ + '(see https://docs.rubocop.org/rubocop/extensions.html#extension-suggestions '\ + 'for more options):' + puts ' AllCops:' + puts ' SuggestExtensions: false' + + puts if @options[:display_time] + end + + private + + def skip? + # Disable outputting the notification: + # 1. On CI + # 2. When given RuboCop options that it doesn't make sense for + # 3. For all formatters except specified in `INCLUDED_FORMATTERS'` + ENV.fetch('CI', nil) || + @options[:only] || @options[:debug] || @options[:list_target_files] || + @options[:out] || @options[:stdin] || + !INCLUDED_FORMATTERS.include?(current_formatter) + end + + def current_formatter + @options[:format] || @config_store.for_pwd.for_all_cops['DefaultFormatter'] || 'p' + end + + def extensions + return [] unless lockfile.dependencies.any? + + extensions = @config_store.for_pwd.for_all_cops['SuggestExtensions'] || {} + extensions.select { |_, v| (Array(v) & dependent_gems).any? }.keys - installed_gems + end + + def lockfile + @lockfile ||= Lockfile.new + end + + def dependent_gems + lockfile.dependencies.map(&:name) + end + + def installed_gems + lockfile.gems.map(&:name) + end + + def puts(*args) + output = (@options[:stderr] ? $stderr : $stdout) + output.puts(*args) + end + end + end + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/rubocop-1.28.2/lib/rubocop/cli/command/version.rb b/vendor/bundle/ruby/3.1.0/gems/rubocop-1.28.2/lib/rubocop/cli/command/version.rb new file mode 100644 index 000000000..d097a31ac --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/rubocop-1.28.2/lib/rubocop/cli/command/version.rb @@ -0,0 +1,18 @@ +# frozen_string_literal: true + +module RuboCop + class CLI + module Command + # Display version. + # @api private + class Version < Base + self.command_name = :version + + def run + puts RuboCop::Version.version(debug: false) if @options[:version] + puts RuboCop::Version.version(debug: true, env: env) if @options[:verbose_version] + end + end + end + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/rubocop-1.28.2/lib/rubocop/cli/environment.rb b/vendor/bundle/ruby/3.1.0/gems/rubocop-1.28.2/lib/rubocop/cli/environment.rb new file mode 100644 index 000000000..70276eb95 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/rubocop-1.28.2/lib/rubocop/cli/environment.rb @@ -0,0 +1,22 @@ +# frozen_string_literal: true + +module RuboCop + class CLI + # Execution environment for a CLI command. + # @api private + class Environment + attr_reader :options, :config_store, :paths + + def initialize(options, config_store, paths) + @options = options + @config_store = config_store + @paths = paths + end + + # Run a command in this environment. + def run(name) + Command.run(self, name) + end + end + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/rubocop-1.28.2/lib/rubocop/comment_config.rb b/vendor/bundle/ruby/3.1.0/gems/rubocop-1.28.2/lib/rubocop/comment_config.rb new file mode 100644 index 000000000..9a118ad08 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/rubocop-1.28.2/lib/rubocop/comment_config.rb @@ -0,0 +1,157 @@ +# frozen_string_literal: true + +module RuboCop + # This class parses the special `rubocop:disable` comments in a source + # and provides a way to check if each cop is enabled at arbitrary line. + class CommentConfig + CopAnalysis = Struct.new(:line_ranges, :start_line_number) + + attr_reader :processed_source + + def initialize(processed_source) + @processed_source = processed_source + end + + def cop_enabled_at_line?(cop, line_number) + cop = cop.cop_name if cop.respond_to?(:cop_name) + disabled_line_ranges = cop_disabled_line_ranges[cop] + return true unless disabled_line_ranges + + disabled_line_ranges.none? { |range| range.include?(line_number) } + end + + def cop_disabled_line_ranges + @cop_disabled_line_ranges ||= analyze + end + + def extra_enabled_comments + extra_enabled_comments_with_names(extras: Hash.new { |h, k| h[k] = [] }, names: Hash.new(0)) + end + + def comment_only_line?(line_number) + non_comment_token_line_numbers.none?(line_number) + end + + private + + def extra_enabled_comments_with_names(extras:, names:) + each_directive do |directive| + next unless comment_only_line?(directive.line_number) + + if directive.enabled_all? + handle_enable_all(directive, names, extras) + else + handle_switch(directive, names, extras) + end + end + + extras + end + + def analyze # rubocop:todo Metrics/AbcSize + analyses = Hash.new { |hash, key| hash[key] = CopAnalysis.new([], nil) } + + each_directive do |directive| + directive.cop_names.each do |cop_name| + cop_name = qualified_cop_name(cop_name) + analyses[cop_name] = analyze_cop(analyses[cop_name], directive) + end + end + + analyses.each_with_object({}) do |element, hash| + cop_name, analysis = *element + hash[cop_name] = cop_line_ranges(analysis) + end + end + + def analyze_cop(analysis, directive) + # Disabling cops after comments like `#=SomeDslDirective` does not related to single line + if !comment_only_line?(directive.line_number) || directive.single_line? + analyze_single_line(analysis, directive) + elsif directive.disabled? + analyze_disabled(analysis, directive) + else + analyze_rest(analysis, directive) + end + end + + def analyze_single_line(analysis, directive) + return analysis unless directive.disabled? + + line = directive.line_number + start_line = analysis.start_line_number + + CopAnalysis.new(analysis.line_ranges + [(line..line)], start_line) + end + + def analyze_disabled(analysis, directive) + line = directive.line_number + start_line = analysis.start_line_number + + # Cop already disabled on this line, so we end the current disabled + # range before we start a new range. + return CopAnalysis.new(analysis.line_ranges + [start_line..line], line) if start_line + + CopAnalysis.new(analysis.line_ranges, line) + end + + def analyze_rest(analysis, directive) + line = directive.line_number + start_line = analysis.start_line_number + + return CopAnalysis.new(analysis.line_ranges + [start_line..line], nil) if start_line + + CopAnalysis.new(analysis.line_ranges, nil) + end + + def cop_line_ranges(analysis) + return analysis.line_ranges unless analysis.start_line_number + + analysis.line_ranges + [(analysis.start_line_number..Float::INFINITY)] + end + + def each_directive + processed_source.comments.each do |comment| + directive = DirectiveComment.new(comment) + yield directive if directive.cop_names + end + end + + def qualified_cop_name(cop_name) + Cop::Registry.qualified_cop_name(cop_name.strip, processed_source.file_path) + end + + def non_comment_token_line_numbers + @non_comment_token_line_numbers ||= begin + non_comment_tokens = processed_source.tokens.reject(&:comment?) + non_comment_tokens.map(&:line).uniq + end + end + + def handle_enable_all(directive, names, extras) + enabled_cops = 0 + names.each do |name, counter| + next unless counter.positive? + + names[name] -= 1 + enabled_cops += 1 + end + + extras[directive.comment] << 'all' if enabled_cops.zero? + end + + # Collect cops that have been disabled or enabled by name in a directive comment + # so that `Lint/RedundantCopEnableDirective` can register offenses correctly. + def handle_switch(directive, names, extras) + directive.cop_names.each do |name| + if directive.disabled? + names[name] += 1 + elsif (names[name]).positive? + names[name] -= 1 + else + extras[directive.comment] << name + end + end + end + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/rubocop-1.28.2/lib/rubocop/config.rb b/vendor/bundle/ruby/3.1.0/gems/rubocop-1.28.2/lib/rubocop/config.rb new file mode 100644 index 000000000..9bdcad1ec --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/rubocop-1.28.2/lib/rubocop/config.rb @@ -0,0 +1,298 @@ +# frozen_string_literal: true + +require 'pathname' + +# FIXME: Moving Rails department code to RuboCop Rails will remove +# the following rubocop:disable comment. +# rubocop:disable Metrics/ClassLength +module RuboCop + # This class represents the configuration of the RuboCop application + # and all its cops. A Config is associated with a YAML configuration + # file from which it was read. Several different Configs can be used + # during a run of the rubocop program, if files in several + # directories are inspected. + class Config + include PathUtil + include FileFinder + extend Forwardable + + CopConfig = Struct.new(:name, :metadata) + + DEFAULT_RAILS_VERSION = 5.0 + attr_reader :loaded_path + + def initialize(hash = {}, loaded_path = nil) + @loaded_path = loaded_path + @for_cop = Hash.new do |h, cop| + qualified_cop_name = Cop::Registry.qualified_cop_name(cop, loaded_path) + cop_options = self[qualified_cop_name] || {} + cop_options['Enabled'] = enable_cop?(qualified_cop_name, cop_options) + h[cop] = cop_options + end + @hash = hash + @validator = ConfigValidator.new(self) + end + + def self.create(hash, path, check: true) + config = new(hash, path) + config.check if check + + config + end + + def loaded_features + @loaded_features ||= ConfigLoader.loaded_features + end + + def check + deprecation_check { |deprecation_message| warn("#{loaded_path} - #{deprecation_message}") } + @validator.validate + make_excludes_absolute + self + end + + def validate_after_resolution + @validator.validate_after_resolution + self + end + + def_delegators :@hash, :[], :[]=, :delete, :dig, :each, :key?, :keys, :each_key, + :fetch, :map, :merge, :replace, :to_h, :to_hash, :transform_values + def_delegators :@validator, :validate, :target_ruby_version + + def to_s + @to_s ||= @hash.to_s + end + + def signature + @signature ||= Digest::SHA1.hexdigest(to_s) + end + + # True if this is a config file that is shipped with RuboCop + def internal? + base_config_path = File.expand_path(File.join(ConfigLoader::RUBOCOP_HOME, 'config')) + File.expand_path(loaded_path).start_with?(base_config_path) + end + + def make_excludes_absolute + each_key do |key| + @validator.validate_section_presence(key) + next unless self[key]['Exclude'] + + self[key]['Exclude'].map! do |exclude_elem| + if exclude_elem.is_a?(String) && !absolute?(exclude_elem) + File.expand_path(File.join(base_dir_for_path_parameters, exclude_elem)) + else + exclude_elem + end + end + end + end + + def add_excludes_from_higher_level(highest_config) + return unless highest_config.for_all_cops['Exclude'] + + excludes = for_all_cops['Exclude'] ||= [] + highest_config.for_all_cops['Exclude'].each do |path| + unless path.is_a?(Regexp) || absolute?(path) + path = File.join(File.dirname(highest_config.loaded_path), path) + end + excludes << path unless excludes.include?(path) + end + end + + def deprecation_check + %w[Exclude Include].each do |key| + plural = "#{key}s" + next unless for_all_cops[plural] + + for_all_cops[key] = for_all_cops[plural] # Stay backwards compatible. + for_all_cops.delete(plural) + yield "AllCops/#{plural} was renamed to AllCops/#{key}" + end + end + + # @return [Config] for the given cop / cop name. + # Note: the 'Enabled' attribute is calculated according to the department's + # and 'AllCops' configuration; other attributes are not inherited. + def for_cop(cop) + @for_cop[cop.respond_to?(:cop_name) ? cop.cop_name : cop] + end + + # @return [Config] for the given cop merged with that of its department (if any) + # Note: the 'Enabled' attribute is same as that returned by `for_cop` + def for_badge(badge) + cop_config = for_cop(badge.to_s) + fetch(badge.department.to_s) { return cop_config }.merge(cop_config) + end + + # @return [Config] for the given department name. + # Note: the 'Enabled' attribute will be present only if specified + # at the department's level + def for_department(department_name) + @for_department ||= Hash.new { |h, dept| h[dept] = self[dept] || {} } + @for_department[department_name.to_s] + end + + def for_all_cops + @for_all_cops ||= self['AllCops'] || {} + end + + def disabled_new_cops? + for_all_cops['NewCops'] == 'disable' + end + + def enabled_new_cops? + for_all_cops['NewCops'] == 'enable' + end + + def file_to_include?(file) + relative_file_path = path_relative_to_config(file) + + # Optimization to quickly decide if the given file is hidden (on the top + # level) and cannot be matched by any pattern. + is_hidden = relative_file_path.start_with?('.') && !relative_file_path.start_with?('..') + return false if is_hidden && !possibly_include_hidden? + + absolute_file_path = File.expand_path(file) + + patterns_to_include.any? do |pattern| + if block_given? + yield pattern, relative_file_path, absolute_file_path + else + match_path?(pattern, relative_file_path) || match_path?(pattern, absolute_file_path) + end + end + end + + def allowed_camel_case_file?(file) + # Gemspecs are allowed to have dashes because that fits with bundler best + # practices in the case when the gem is nested under a namespace (e.g., + # `bundler-console` conveys `Bundler::Console`). + return true if File.extname(file) == '.gemspec' + + file_to_include?(file) do |pattern, relative_path, absolute_path| + /[A-Z]/.match?(pattern.to_s) && + (match_path?(pattern, relative_path) || match_path?(pattern, absolute_path)) + end + end + + # Returns true if there's a chance that an Include pattern matches hidden + # files, false if that's definitely not possible. + def possibly_include_hidden? + return @possibly_include_hidden if defined?(@possibly_include_hidden) + + @possibly_include_hidden = patterns_to_include.any? do |s| + s.is_a?(Regexp) || s.start_with?('.') || s.include?('/.') + end + end + + def file_to_exclude?(file) + file = File.expand_path(file) + patterns_to_exclude.any? { |pattern| match_path?(pattern, file) } + end + + def patterns_to_include + for_all_cops['Include'] || [] + end + + def patterns_to_exclude + for_all_cops['Exclude'] || [] + end + + def path_relative_to_config(path) + relative_path(path, base_dir_for_path_parameters) + end + + # Paths specified in configuration files starting with .rubocop are + # relative to the directory where that file is. Paths in other config files + # are relative to the current directory. This is so that paths in + # config/default.yml, for example, are not relative to RuboCop's config + # directory since that wouldn't work. + def base_dir_for_path_parameters + @base_dir_for_path_parameters ||= + if File.basename(loaded_path).start_with?('.rubocop') && + loaded_path != File.join(Dir.home, ConfigLoader::DOTFILE) + File.expand_path(File.dirname(loaded_path)) + else + Dir.pwd + end + end + + def target_rails_version + @target_rails_version ||= + if for_all_cops['TargetRailsVersion'] + for_all_cops['TargetRailsVersion'].to_f + elsif target_rails_version_from_bundler_lock_file + target_rails_version_from_bundler_lock_file + else + DEFAULT_RAILS_VERSION + end + end + + def smart_loaded_path + PathUtil.smart_path(@loaded_path) + end + + def bundler_lock_file_path + return nil unless loaded_path + + base_path = base_dir_for_path_parameters + ['gems.locked', 'Gemfile.lock'].each do |file_name| + path = find_file_upwards(file_name, base_path) + return path if path + end + nil + end + + def pending_cops + keys.each_with_object([]) do |qualified_cop_name, pending_cops| + department = department_of(qualified_cop_name) + next if department && department['Enabled'] == false + + cop_metadata = self[qualified_cop_name] + next unless cop_metadata['Enabled'] == 'pending' + + pending_cops << CopConfig.new(qualified_cop_name, cop_metadata) + end + end + + private + + def target_rails_version_from_bundler_lock_file + @target_rails_version_from_bundler_lock_file ||= read_rails_version_from_bundler_lock_file + end + + def read_rails_version_from_bundler_lock_file + lock_file_path = bundler_lock_file_path + return nil unless lock_file_path + + File.foreach(lock_file_path) do |line| + # If rails is in Gemfile.lock or gems.lock, there should be a line like: + # rails (X.X.X) + result = line.match(/^\s+rails\s+\((\d+\.\d+)/) + return result.captures.first.to_f if result + end + end + + def enable_cop?(qualified_cop_name, cop_options) + # If the cop is explicitly enabled, the other checks can be skipped. + return true if cop_options['Enabled'] == true + + department = department_of(qualified_cop_name) + cop_enabled = cop_options.fetch('Enabled') { !for_all_cops['DisabledByDefault'] } + return true if cop_enabled == 'override_department' + return false if department && department['Enabled'] == false + + cop_enabled + end + + def department_of(qualified_cop_name) + *cop_department, _ = qualified_cop_name.split('/') + return nil if cop_department.empty? + + self[cop_department.join('/')] + end + end +end +# rubocop:enable Metrics/ClassLength diff --git a/vendor/bundle/ruby/3.1.0/gems/rubocop-1.28.2/lib/rubocop/config_loader.rb b/vendor/bundle/ruby/3.1.0/gems/rubocop-1.28.2/lib/rubocop/config_loader.rb new file mode 100644 index 000000000..e1d21675e --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/rubocop-1.28.2/lib/rubocop/config_loader.rb @@ -0,0 +1,279 @@ +# frozen_string_literal: true + +require 'yaml' +require 'pathname' + +module RuboCop + # Raised when a RuboCop configuration file is not found. + class ConfigNotFoundError < Error + end + + # This class represents the configuration of the RuboCop application + # and all its cops. A Config is associated with a YAML configuration + # file from which it was read. Several different Configs can be used + # during a run of the rubocop program, if files in several + # directories are inspected. + class ConfigLoader + DOTFILE = '.rubocop.yml' + XDG_CONFIG = 'config.yml' + RUBOCOP_HOME = File.realpath(File.join(File.dirname(__FILE__), '..', '..')) + DEFAULT_FILE = File.join(RUBOCOP_HOME, 'config', 'default.yml') + + class << self + include FileFinder + + attr_accessor :debug, :ignore_parent_exclusion, :disable_pending_cops, :enable_pending_cops + attr_writer :default_configuration, :project_root + attr_reader :loaded_features + + alias debug? debug + alias ignore_parent_exclusion? ignore_parent_exclusion + + def clear_options + @debug = nil + @loaded_features = Set.new + FileFinder.root_level = nil + end + + def load_file(file, check: true) + path = file_path(file) + + hash = load_yaml_configuration(path) + + # Resolve requires first in case they define additional cops + loaded_features = resolver.resolve_requires(path, hash) + add_loaded_features(loaded_features) + + add_missing_namespaces(path, hash) + + resolver.override_department_setting_for_cops({}, hash) + resolver.resolve_inheritance_from_gems(hash) + resolver.resolve_inheritance(path, hash, file, debug?) + + hash.delete('inherit_from') + + Config.create(hash, path, check: check) + end + + def load_yaml_configuration(absolute_path) + file_contents = read_file(absolute_path) + yaml_code = Dir.chdir(File.dirname(absolute_path)) { ERB.new(file_contents).result } + check_duplication(yaml_code, absolute_path) + hash = yaml_safe_load(yaml_code, absolute_path) || {} + + puts "configuration from #{absolute_path}" if debug? + + raise(TypeError, "Malformed configuration in #{absolute_path}") unless hash.is_a?(Hash) + + hash + end + + def add_missing_namespaces(path, hash) + # Using `hash.each_key` will cause the + # `can't add a new key into hash during iteration` error + hash_keys = hash.keys + hash_keys.each do |key| + q = Cop::Registry.qualified_cop_name(key, path) + next if q == key + + hash[q] = hash.delete(key) + end + end + + # Return a recursive merge of two hashes. That is, a normal hash merge, + # with the addition that any value that is a hash, and occurs in both + # arguments, will also be merged. And so on. + def merge(base_hash, derived_hash) + resolver.merge(base_hash, derived_hash) + end + + # Returns the path of .rubocop.yml searching upwards in the + # directory structure starting at the given directory where the + # inspected file is. If no .rubocop.yml is found there, the + # user's home directory is checked. If there's no .rubocop.yml + # there either, the path to the default file is returned. + def configuration_file_for(target_dir) + find_project_dotfile(target_dir) || find_user_dotfile || + find_user_xdg_config || DEFAULT_FILE + end + + def configuration_from_file(config_file, check: true) + return default_configuration if config_file == DEFAULT_FILE + + config = load_file(config_file, check: check) + config.validate_after_resolution if check + + if ignore_parent_exclusion? + print 'Ignoring AllCops/Exclude from parent folders' if debug? + else + add_excludes_from_files(config, config_file) + end + + merge_with_default(config, config_file).tap do |merged_config| + warn_on_pending_cops(merged_config.pending_cops) unless possible_new_cops?(merged_config) + end + end + + def possible_new_cops?(config) + disable_pending_cops || enable_pending_cops || + config.disabled_new_cops? || config.enabled_new_cops? + end + + def add_excludes_from_files(config, config_file) + exclusion_file = find_last_file_upwards(DOTFILE, config_file, project_root) + + return unless exclusion_file + return if PathUtil.relative_path(exclusion_file) == PathUtil.relative_path(config_file) + + print 'AllCops/Exclude ' if debug? + config.add_excludes_from_higher_level(load_file(exclusion_file)) + end + + def default_configuration + @default_configuration ||= begin + print 'Default ' if debug? + load_file(DEFAULT_FILE) + end + end + + # Returns the path RuboCop inferred as the root of the project. No file + # searches will go past this directory. + def project_root + @project_root ||= find_project_root + end + + PENDING_BANNER = <<~BANNER + The following cops were added to RuboCop, but are not configured. Please set Enabled to either `true` or `false` in your `.rubocop.yml` file. + + Please also note that you can opt-in to new cops by default by adding this to your config: + AllCops: + NewCops: enable + BANNER + + def warn_on_pending_cops(pending_cops) + return if pending_cops.empty? + + warn Rainbow(PENDING_BANNER).yellow + + pending_cops.each { |cop| warn_pending_cop cop } + + warn Rainbow('For more information: https://docs.rubocop.org/rubocop/versioning.html').yellow + end + + def warn_pending_cop(cop) + version = cop.metadata['VersionAdded'] || 'N/A' + + warn Rainbow("#{cop.name}: # new in #{version}").yellow + warn Rainbow(' Enabled: true').yellow + end + + # Merges the given configuration with the default one. + def merge_with_default(config, config_file, unset_nil: true) + resolver.merge_with_default(config, config_file, unset_nil: unset_nil) + end + + # @api private + # Used to add features that were required inside a config or from + # the CLI using `--require`. + def add_loaded_features(loaded_features) + @loaded_features.merge(Array(loaded_features)) + end + + private + + def file_path(file) + File.absolute_path(file.is_a?(RemoteConfig) ? file.file : file) + end + + def find_project_dotfile(target_dir) + find_file_upwards(DOTFILE, target_dir, project_root) + end + + def find_project_root + pwd = Dir.pwd + gems_file = find_last_file_upwards('Gemfile', pwd) || find_last_file_upwards('gems.rb', pwd) + return unless gems_file + + File.dirname(gems_file) + end + + def find_user_dotfile + return unless ENV.key?('HOME') + + file = File.join(Dir.home, DOTFILE) + return file if File.exist?(file) + end + + def find_user_xdg_config + xdg_config_home = expand_path(ENV.fetch('XDG_CONFIG_HOME', '~/.config')) + xdg_config = File.join(xdg_config_home, 'rubocop', XDG_CONFIG) + return xdg_config if File.exist?(xdg_config) + end + + def expand_path(path) + File.expand_path(path) + rescue ArgumentError + # Could happen because HOME or ID could not be determined. Fall back on + # using the path literally in that case. + path + end + + def resolver + @resolver ||= ConfigLoaderResolver.new + end + + def check_duplication(yaml_code, absolute_path) + smart_path = PathUtil.smart_path(absolute_path) + YAMLDuplicationChecker.check(yaml_code, absolute_path) do |key1, key2| + value = key1.value + # .start_line is only available since ruby 2.5 / psych 3.0 + message = if key1.respond_to? :start_line + line1 = key1.start_line + 1 + line2 = key2.start_line + 1 + "#{smart_path}:#{line1}: " \ + "`#{value}` is concealed by line #{line2}" + else + "#{smart_path}: `#{value}` is concealed by duplicate" + end + warn Rainbow(message).yellow + end + end + + # Read the specified file, or exit with a friendly, concise message on + # stderr. Care is taken to use the standard OS exit code for a "file not + # found" error. + def read_file(absolute_path) + File.read(absolute_path, encoding: Encoding::UTF_8) + rescue Errno::ENOENT + raise ConfigNotFoundError, "Configuration file not found: #{absolute_path}" + end + + def yaml_safe_load(yaml_code, filename) + yaml_safe_load!(yaml_code, filename) + rescue ::StandardError + if defined?(::SafeYAML) + raise 'SafeYAML is unmaintained, no longer needed and should be removed' + end + + raise + end + + if Gem::Version.new(Psych::VERSION) >= Gem::Version.new('3.1.0') + def yaml_safe_load!(yaml_code, filename) + YAML.safe_load(yaml_code, + permitted_classes: [Regexp, Symbol], + permitted_symbols: [], + aliases: true, + filename: filename) + end + else # Ruby < 2.6 + def yaml_safe_load!(yaml_code, filename) + YAML.safe_load(yaml_code, [Regexp, Symbol], [], true, filename) + end + end + end + + # Initializing class ivars + clear_options + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/rubocop-1.28.2/lib/rubocop/config_loader_resolver.rb b/vendor/bundle/ruby/3.1.0/gems/rubocop-1.28.2/lib/rubocop/config_loader_resolver.rb new file mode 100644 index 000000000..72d979634 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/rubocop-1.28.2/lib/rubocop/config_loader_resolver.rb @@ -0,0 +1,281 @@ +# frozen_string_literal: true + +require 'yaml' +require 'pathname' + +module RuboCop + # A help class for ConfigLoader that handles configuration resolution. + # @api private + class ConfigLoaderResolver + def resolve_requires(path, hash) + config_dir = File.dirname(path) + hash.delete('require').tap do |loaded_features| + Array(loaded_features).each do |feature| + if feature.start_with?('.') + require(File.join(config_dir, feature)) + else + require(feature) + end + end + end + end + + def resolve_inheritance(path, hash, file, debug) # rubocop:disable Metrics/MethodLength, Metrics/AbcSize + inherited_files = Array(hash['inherit_from']) + base_configs(path, inherited_files, file) + .each_with_index.reverse_each do |base_config, index| + override_department_setting_for_cops(base_config, hash) + override_enabled_for_disabled_departments(base_config, hash) + + base_config.each do |k, v| + next unless v.is_a?(Hash) + + if hash.key?(k) + v = merge(v, hash[k], + cop_name: k, file: file, debug: debug, + inherited_file: inherited_files[index], + inherit_mode: determine_inherit_mode(hash, k)) + end + hash[k] = v + fix_include_paths(base_config.loaded_path, hash, path, k, v) if v.key?('Include') + end + end + end + + # When one .rubocop.yml file inherits from another .rubocop.yml file, the Include paths in the + # base configuration are relative to the directory where the base configuration file is. For the + # derived configuration, we need to make those paths relative to where the derived configuration + # file is. + def fix_include_paths(base_config_path, hash, path, key, value) + return unless File.basename(base_config_path).start_with?('.rubocop') + + base_dir = File.dirname(base_config_path) + derived_dir = File.dirname(path) + hash[key]['Include'] = value['Include'].map do |include_path| + PathUtil.relative_path(File.join(base_dir, include_path), derived_dir) + end + end + + def resolve_inheritance_from_gems(hash) + gems = hash.delete('inherit_gem') + (gems || {}).each_pair do |gem_name, config_path| + if gem_name == 'rubocop' + raise ArgumentError, "can't inherit configuration from the rubocop gem" + end + + hash['inherit_from'] = Array(hash['inherit_from']) + Array(config_path).reverse_each do |path| + # Put gem configuration first so local configuration overrides it. + hash['inherit_from'].unshift gem_config_path(gem_name, path) + end + end + end + + # Merges the given configuration with the default one. If + # AllCops:DisabledByDefault is true, it changes the Enabled params so that + # only cops from user configuration are enabled. If + # AllCops:EnabledByDefault is true, it changes the Enabled params so that + # only cops explicitly disabled in user configuration are disabled. + def merge_with_default(config, config_file, unset_nil:) + default_configuration = ConfigLoader.default_configuration + + disabled_by_default = config.for_all_cops['DisabledByDefault'] + enabled_by_default = config.for_all_cops['EnabledByDefault'] + + if disabled_by_default || enabled_by_default + default_configuration = transform(default_configuration) do |params| + params.merge('Enabled' => !disabled_by_default) + end + end + + config = handle_disabled_by_default(config, default_configuration) if disabled_by_default + override_enabled_for_disabled_departments(default_configuration, config) + + opts = { inherit_mode: config['inherit_mode'] || {}, unset_nil: unset_nil } + Config.new(merge(default_configuration, config, **opts), config_file) + end + + # Return a recursive merge of two hashes. That is, a normal hash merge, + # with the addition that any value that is a hash, and occurs in both + # arguments, will also be merged. And so on. + # + # rubocop:disable Metrics/AbcSize + def merge(base_hash, derived_hash, **opts) + result = base_hash.merge(derived_hash) + keys_appearing_in_both = base_hash.keys & derived_hash.keys + keys_appearing_in_both.each do |key| + if opts[:unset_nil] && derived_hash[key].nil? + result.delete(key) + elsif merge_hashes?(base_hash, derived_hash, key) + result[key] = merge(base_hash[key], derived_hash[key], **opts) + elsif should_union?(derived_hash, base_hash, opts[:inherit_mode], key) + result[key] = base_hash[key] | derived_hash[key] + elsif opts[:debug] + warn_on_duplicate_setting(base_hash, derived_hash, key, **opts) + end + end + result + end + # rubocop:enable Metrics/AbcSize + + # An `Enabled: true` setting in user configuration for a cop overrides an + # `Enabled: false` setting for its department. + def override_department_setting_for_cops(base_hash, derived_hash) + derived_hash.each_key do |key| + next unless key =~ %r{(.*)/.*} + + department = Regexp.last_match(1) + next unless disabled?(derived_hash, department) || disabled?(base_hash, department) + + # The `override_department` setting for the `Enabled` parameter is an + # internal setting that's not documented in the manual. It will cause a + # cop to be enabled later, when logic surrounding enabled/disabled it + # run, even though its department is disabled. + derived_hash[key]['Enabled'] = 'override_department' if derived_hash[key]['Enabled'] + end + end + + # If a cop was previously explicitly enabled, but then superseded by the + # department being disabled, disable it. + def override_enabled_for_disabled_departments(base_hash, derived_hash) + cops_to_disable = derived_hash.each_key.with_object([]) do |key, cops| + next unless disabled?(derived_hash, key) + + cops.concat(base_hash.keys.grep(Regexp.new("^#{key}/"))) + end + + cops_to_disable.each do |cop_name| + next unless base_hash.dig(cop_name, 'Enabled') == true + + derived_hash.replace(merge({ cop_name => { 'Enabled' => false } }, derived_hash)) + end + end + + private + + def disabled?(hash, department) + hash[department].is_a?(Hash) && hash[department]['Enabled'] == false + end + + def duplicate_setting?(base_hash, derived_hash, key, inherited_file) + return false if inherited_file.nil? # Not inheritance resolving merge + return false if inherited_file.start_with?('..') # Legitimate override + return false if base_hash[key] == derived_hash[key] # Same value + return false if remote_file?(inherited_file) # Can't change + + Gem.path.none? { |dir| inherited_file.start_with?(dir) } # Can change? + end + + def warn_on_duplicate_setting(base_hash, derived_hash, key, **opts) + return unless duplicate_setting?(base_hash, derived_hash, key, opts[:inherited_file]) + + inherit_mode = opts[:inherit_mode]['merge'] || opts[:inherit_mode]['override'] + return if base_hash[key].is_a?(Array) && inherit_mode && inherit_mode.include?(key) + + puts "#{PathUtil.smart_path(opts[:file])}: " \ + "#{opts[:cop_name]}:#{key} overrides " \ + "the same parameter in #{opts[:inherited_file]}" + end + + def determine_inherit_mode(hash, key) + cop_cfg = hash[key] + local_inherit = cop_cfg.delete('inherit_mode') if cop_cfg.is_a?(Hash) + local_inherit || hash['inherit_mode'] || {} + end + + def should_union?(derived_hash, base_hash, root_mode, key) + return false unless base_hash[key].is_a?(Array) + + derived_mode = derived_hash['inherit_mode'] + return false if should_override?(derived_mode, key) + return true if should_merge?(derived_mode, key) + + base_mode = base_hash['inherit_mode'] + return false if should_override?(base_mode, key) + return true if should_merge?(base_mode, key) + + should_merge?(root_mode, key) + end + + def should_merge?(mode, key) + mode && mode['merge'] && mode['merge'].include?(key) + end + + def should_override?(mode, key) + mode && mode['override'] && mode['override'].include?(key) + end + + def merge_hashes?(base_hash, derived_hash, key) + base_hash[key].is_a?(Hash) && derived_hash[key].is_a?(Hash) + end + + def base_configs(path, inherit_from, file) + configs = Array(inherit_from).compact.map do |f| + ConfigLoader.load_file(inherited_file(path, f, file)) + end + + configs.compact + end + + def inherited_file(path, inherit_from, file) + if remote_file?(inherit_from) + # A remote configuration, e.g. `inherit_from: http://example.com/rubocop.yml`. + RemoteConfig.new(inherit_from, File.dirname(path)) + elsif Pathname.new(inherit_from).absolute? + # An absolute path to a config, e.g. `inherit_from: /Users/me/rubocop.yml`. + # The path may come from `inherit_gem` option, where a gem name is expanded + # to an absolute path to that gem. + print 'Inheriting ' if ConfigLoader.debug? + inherit_from + elsif file.is_a?(RemoteConfig) + # A path relative to a URL, e.g. `inherit_from: configs/default.yml` + # in a config included with `inherit_from: http://example.com/rubocop.yml` + file.inherit_from_remote(inherit_from, path) + else + # A local relative path, e.g. `inherit_from: default.yml` + print 'Inheriting ' if ConfigLoader.debug? + File.expand_path(inherit_from, File.dirname(path)) + end + end + + def remote_file?(uri) + regex = URI::DEFAULT_PARSER.make_regexp(%w[http https]) + /\A#{regex}\z/.match?(uri) + end + + def handle_disabled_by_default(config, new_default_configuration) + department_config = config.to_hash.reject { |cop| cop.include?('/') } + department_config.each do |dept, dept_params| + next unless dept_params['Enabled'] + + new_default_configuration.each do |cop, params| + next unless cop.start_with?("#{dept}/") + + # Retain original default configuration for cops in the department. + params['Enabled'] = ConfigLoader.default_configuration[cop]['Enabled'] + end + end + + transform(config) do |params| + { 'Enabled' => true }.merge(params) # Set true if not set. + end + end + + def transform(config, &block) + config.transform_values(&block) + end + + def gem_config_path(gem_name, relative_config_path) + if defined?(Bundler) + gem = Bundler.load.specs[gem_name].first + gem_path = gem.full_gem_path if gem + end + + gem_path ||= Gem::Specification.find_by_name(gem_name).gem_dir + + File.join(gem_path, relative_config_path) + rescue Gem::LoadError => e + raise Gem::LoadError, "Unable to find gem #{gem_name}; is the gem installed? #{e}" + end + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/rubocop-1.28.2/lib/rubocop/config_obsoletion.rb b/vendor/bundle/ruby/3.1.0/gems/rubocop-1.28.2/lib/rubocop/config_obsoletion.rb new file mode 100644 index 000000000..d78f536cb --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/rubocop-1.28.2/lib/rubocop/config_obsoletion.rb @@ -0,0 +1,103 @@ +# frozen_string_literal: true + +module RuboCop + # This class handles obsolete configuration. + # @api private + class ConfigObsoletion + DEFAULT_RULES_FILE = File.join(ConfigLoader::RUBOCOP_HOME, 'config', 'obsoletion.yml') + COP_RULE_CLASSES = { + 'renamed' => RenamedCop, + 'removed' => RemovedCop, + 'split' => SplitCop, + 'extracted' => ExtractedCop + }.freeze + PARAMETER_RULE_CLASSES = { + 'changed_parameters' => ChangedParameter, + 'changed_enforced_styles' => ChangedEnforcedStyles + }.freeze + + attr_reader :rules, :warnings + + class << self + attr_accessor :files + + def legacy_cop_names + # Used by DepartmentName#qualified_legacy_cop_name + new(Config.new).rules.select(&:cop_rule?).map(&:old_name) + end + end + + # Can be extended by extension libraries to add their own obsoletions + self.files = [DEFAULT_RULES_FILE] + + def initialize(config) + @config = config + @rules = load_rules + @warnings = [] + end + + def reject_obsolete! + messages = obsoletions.flatten.compact + return if messages.empty? + + raise ValidationError, messages.join("\n") + end + + private + + # Default rules for obsoletions are in config/obsoletion.yml + # Additional rules files can be added with `RuboCop::ConfigObsoletion.files << filename` + def load_rules + rules = self.class.files.each_with_object({}) do |filename, hash| + hash.merge!(YAML.safe_load(File.read(filename))) do |_key, first, second| + first.merge(second) + end + end + + cop_rules = rules.slice(*COP_RULE_CLASSES.keys) + parameter_rules = rules.slice(*PARAMETER_RULE_CLASSES.keys) + + load_cop_rules(cop_rules).concat(load_parameter_rules(parameter_rules)) + end + + # Cop rules are keyed by the name of the original cop + def load_cop_rules(rules) + rules.flat_map do |rule_type, data| + data.map do |cop_name, configuration| + next unless configuration # allow configurations to be disabled with `CopName: ~` + + COP_RULE_CLASSES[rule_type].new(@config, cop_name, configuration) + end.compact + end + end + + # Parameter rules may apply to multiple cops and multiple parameters + # and are given as an array. Each combination is turned into a separate + # rule object. + def load_parameter_rules(rules) + rules.flat_map do |rule_type, data| + data.flat_map do |configuration| + cops = Array(configuration['cops']) + parameters = Array(configuration['parameters']) + + cops.product(parameters).map do |cop, parameter| + PARAMETER_RULE_CLASSES[rule_type].new(@config, cop, parameter, configuration) + end + end + end + end + + def obsoletions + rules.map do |rule| + next unless rule.violated? + + if rule.warning? + @warnings.push(rule.message) + next + end + + rule.message + end + end + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/rubocop-1.28.2/lib/rubocop/config_obsoletion/changed_enforced_styles.rb b/vendor/bundle/ruby/3.1.0/gems/rubocop-1.28.2/lib/rubocop/config_obsoletion/changed_enforced_styles.rb new file mode 100644 index 000000000..89e889901 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/rubocop-1.28.2/lib/rubocop/config_obsoletion/changed_enforced_styles.rb @@ -0,0 +1,33 @@ +# frozen_string_literal: true + +module RuboCop + class ConfigObsoletion + # Encapsulation of a ConfigObsoletion rule for changing a parameter + # @api private + class ChangedEnforcedStyles < ParameterRule + BASE_MESSAGE = 'obsolete `%s: %s` (for `%s`) found in %s' + + def violated? + super && config[cop][parameter] == value + end + + def message + base = format(BASE_MESSAGE, + parameter: parameter, value: value, cop: cop, path: smart_loaded_path) + + if alternative + "#{base}\n`#{parameter}: #{value}` has been renamed to " \ + "`#{parameter}: #{alternative.chomp}`." + else + "#{base}\n#{reason.chomp}" + end + end + + private + + def value + metadata['value'] + end + end + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/rubocop-1.28.2/lib/rubocop/config_obsoletion/changed_parameter.rb b/vendor/bundle/ruby/3.1.0/gems/rubocop-1.28.2/lib/rubocop/config_obsoletion/changed_parameter.rb new file mode 100644 index 000000000..48cd576ea --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/rubocop-1.28.2/lib/rubocop/config_obsoletion/changed_parameter.rb @@ -0,0 +1,21 @@ +# frozen_string_literal: true + +module RuboCop + class ConfigObsoletion + # Encapsulation of a ConfigObsoletion rule for changing a parameter + # @api private + class ChangedParameter < ParameterRule + BASE_MESSAGE = 'obsolete parameter `%s` (for `%s`) found in %s' + + def message + base = format(BASE_MESSAGE, parameter: parameter, cop: cop, path: smart_loaded_path) + + if alternative + "#{base}\n`#{parameter}` has been renamed to `#{alternative.chomp}`." + else + "#{base}\n#{reason.chomp}" + end + end + end + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/rubocop-1.28.2/lib/rubocop/config_obsoletion/cop_rule.rb b/vendor/bundle/ruby/3.1.0/gems/rubocop-1.28.2/lib/rubocop/config_obsoletion/cop_rule.rb new file mode 100644 index 000000000..28c65d66f --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/rubocop-1.28.2/lib/rubocop/config_obsoletion/cop_rule.rb @@ -0,0 +1,33 @@ +# frozen_string_literal: true + +module RuboCop + class ConfigObsoletion + # Base class for ConfigObsoletion rules relating to cops + # @api private + class CopRule < Rule + attr_reader :old_name + + def initialize(config, old_name) + super(config) + @old_name = old_name + end + + def cop_rule? + true + end + + def message + rule_message + "\n(obsolete configuration found in #{smart_loaded_path}, please update it)" + end + + # Cop rules currently can only be failures, not warnings + def warning? + false + end + + def violated? + config.key?(old_name) || config.key?(Cop::Badge.parse(old_name).cop_name) + end + end + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/rubocop-1.28.2/lib/rubocop/config_obsoletion/extracted_cop.rb b/vendor/bundle/ruby/3.1.0/gems/rubocop-1.28.2/lib/rubocop/config_obsoletion/extracted_cop.rb new file mode 100644 index 000000000..b744ef604 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/rubocop-1.28.2/lib/rubocop/config_obsoletion/extracted_cop.rb @@ -0,0 +1,46 @@ +# frozen_string_literal: true + +module RuboCop + class ConfigObsoletion + # Encapsulation of a ConfigObsoletion rule for splitting a cop's + # functionality into multiple new cops. + # @api private + class ExtractedCop < CopRule + attr_reader :gem, :department + + def initialize(config, old_name, gem) + super(config, old_name) + @department, * = old_name.rpartition('/') + @gem = gem + end + + def violated? + return false if feature_loaded? + + affected_cops.any? + end + + def rule_message + msg = '%s been extracted to the `%s` gem.' + format(msg, + name: affected_cops.size > 1 ? "`#{department}` cops have" : "`#{old_name}` has", + gem: gem) + end + + private + + def affected_cops + return old_name unless old_name.end_with?('*') + + # Handle whole departments (expressed as `Department/*`) + config.keys.select do |key| + key == department || key.start_with?("#{department}/") + end + end + + def feature_loaded? + config.loaded_features.include?(gem) + end + end + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/rubocop-1.28.2/lib/rubocop/config_obsoletion/parameter_rule.rb b/vendor/bundle/ruby/3.1.0/gems/rubocop-1.28.2/lib/rubocop/config_obsoletion/parameter_rule.rb new file mode 100644 index 000000000..1f1ca1c4a --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/rubocop-1.28.2/lib/rubocop/config_obsoletion/parameter_rule.rb @@ -0,0 +1,44 @@ +# frozen_string_literal: true + +module RuboCop + class ConfigObsoletion + # Base class for ConfigObsoletion rules relating to parameters + # @api private + class ParameterRule < Rule + attr_reader :cop, :parameter, :metadata + + def initialize(config, cop, parameter, metadata) + super(config) + @cop = cop + @parameter = parameter + @metadata = metadata + end + + def parameter_rule? + true + end + + def violated? + config[cop]&.key?(parameter) + end + + def warning? + severity == 'warning' + end + + private + + def alternative + metadata['alternative'] + end + + def reason + metadata['reason'] + end + + def severity + metadata['severity'] + end + end + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/rubocop-1.28.2/lib/rubocop/config_obsoletion/removed_cop.rb b/vendor/bundle/ruby/3.1.0/gems/rubocop-1.28.2/lib/rubocop/config_obsoletion/removed_cop.rb new file mode 100644 index 000000000..03fa8fed4 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/rubocop-1.28.2/lib/rubocop/config_obsoletion/removed_cop.rb @@ -0,0 +1,41 @@ +# frozen_string_literal: true + +module RuboCop + class ConfigObsoletion + # Encapsulation of a ConfigObsoletion rule for removing + # a previously defined cop. + # @api private + class RemovedCop < CopRule + attr_reader :old_name, :metadata + + BASE_MESSAGE = 'The `%s` cop has been removed' + + def initialize(config, old_name, metadata) + super(config, old_name) + @metadata = metadata.is_a?(Hash) ? metadata : {} + end + + def rule_message + base = format(BASE_MESSAGE, old_name: old_name) + + if reason + "#{base} since #{reason.chomp}." + elsif alternatives + "#{base}. Please use #{to_sentence(alternatives, connector: 'and/or')} instead." + else + "#{base}." + end + end + + private + + def reason + metadata['reason'] + end + + def alternatives + Array(metadata['alternatives']).map { |name| "`#{name}`" } + end + end + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/rubocop-1.28.2/lib/rubocop/config_obsoletion/renamed_cop.rb b/vendor/bundle/ruby/3.1.0/gems/rubocop-1.28.2/lib/rubocop/config_obsoletion/renamed_cop.rb new file mode 100644 index 000000000..386fcaaa7 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/rubocop-1.28.2/lib/rubocop/config_obsoletion/renamed_cop.rb @@ -0,0 +1,34 @@ +# frozen_string_literal: true + +module RuboCop + class ConfigObsoletion + # Encapsulation of a ConfigObsoletion rule for renaming + # a cop or moving it to a new department. + # @api private + class RenamedCop < CopRule + attr_reader :new_name + + def initialize(config, old_name, new_name) + super(config, old_name) + @new_name = new_name + end + + def rule_message + "The `#{old_name}` cop has been #{verb} to `#{new_name}`." + end + + private + + def moved? + old_badge = Cop::Badge.parse(old_name) + new_badge = Cop::Badge.parse(new_name) + + old_badge.department != new_badge.department && old_badge.cop_name == new_badge.cop_name + end + + def verb + moved? ? 'moved' : 'renamed' + end + end + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/rubocop-1.28.2/lib/rubocop/config_obsoletion/rule.rb b/vendor/bundle/ruby/3.1.0/gems/rubocop-1.28.2/lib/rubocop/config_obsoletion/rule.rb new file mode 100644 index 000000000..2ee3637fb --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/rubocop-1.28.2/lib/rubocop/config_obsoletion/rule.rb @@ -0,0 +1,41 @@ +# frozen_string_literal: true + +module RuboCop + class ConfigObsoletion + # Abstract base class for ConfigObsoletion rules + # @api private + class Rule + def initialize(config) + @config = config + end + + # Does this rule relate to cops? + def cop_rule? + false + end + + # Does this rule relate to parameters? + def parameter_rule? + false + end + + def violated? + raise NotImplementedError + end + + private + + attr_reader :config + + def to_sentence(collection, connector: 'and') + return collection.first if collection.size == 1 + + [collection[0..-2].join(', '), collection[-1]].join(" #{connector} ") + end + + def smart_loaded_path + PathUtil.smart_path(config.loaded_path) + end + end + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/rubocop-1.28.2/lib/rubocop/config_obsoletion/split_cop.rb b/vendor/bundle/ruby/3.1.0/gems/rubocop-1.28.2/lib/rubocop/config_obsoletion/split_cop.rb new file mode 100644 index 000000000..92aaa0fad --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/rubocop-1.28.2/lib/rubocop/config_obsoletion/split_cop.rb @@ -0,0 +1,27 @@ +# frozen_string_literal: true + +module RuboCop + class ConfigObsoletion + # Encapsulation of a ConfigObsoletion rule for splitting a cop's + # functionality into multiple new cops. + # @api private + class SplitCop < CopRule + attr_reader :metadata + + def initialize(config, old_name, metadata) + super(config, old_name) + @metadata = metadata + end + + def rule_message + "The `#{old_name}` cop has been split into #{to_sentence(alternatives)}." + end + + private + + def alternatives + Array(metadata['alternatives']).map { |name| "`#{name}`" } + end + end + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/rubocop-1.28.2/lib/rubocop/config_regeneration.rb b/vendor/bundle/ruby/3.1.0/gems/rubocop-1.28.2/lib/rubocop/config_regeneration.rb new file mode 100644 index 000000000..a4889b68d --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/rubocop-1.28.2/lib/rubocop/config_regeneration.rb @@ -0,0 +1,33 @@ +# frozen_string_literal: true + +module RuboCop + # This class handles collecting the options for regenerating a TODO file. + # @api private + class ConfigRegeneration + AUTO_GENERATED_FILE = RuboCop::CLI::Command::AutoGenerateConfig::AUTO_GENERATED_FILE + COMMAND_REGEX = /(?<=`rubocop )(.*?)(?=`)/.freeze + DEFAULT_OPTIONS = { auto_gen_config: true }.freeze + + # Get options from the comment in the TODO file, and parse them as options + def options + # If there's no existing TODO file, generate one + return DEFAULT_OPTIONS unless todo_exists? + + match = generation_command.match(COMMAND_REGEX) + return DEFAULT_OPTIONS unless match + + options = match[1].split + Options.new.parse(options).first + end + + private + + def todo_exists? + File.exist?(AUTO_GENERATED_FILE) && !File.empty?(AUTO_GENERATED_FILE) + end + + def generation_command + File.foreach(AUTO_GENERATED_FILE).take(2).last + end + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/rubocop-1.28.2/lib/rubocop/config_store.rb b/vendor/bundle/ruby/3.1.0/gems/rubocop-1.28.2/lib/rubocop/config_store.rb new file mode 100644 index 000000000..693144381 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/rubocop-1.28.2/lib/rubocop/config_store.rb @@ -0,0 +1,72 @@ +# frozen_string_literal: true + +module RuboCop + # Handles caching of configurations and association of inspected + # ruby files to configurations. + class ConfigStore + attr_reader :validated + alias validated? validated + + def initialize + # @options_config stores a config that is specified in the command line. + # This takes precedence over configs located in any directories + @options_config = nil + + # @path_cache maps directories to configuration paths. We search + # for .rubocop.yml only if we haven't already found it for the + # given directory. + @path_cache = {} + + # @object_cache maps configuration file paths to + # configuration objects so we only need to load them once. + @object_cache = {} + + # By default the config is validated before it can be used. + @validated = true + end + + def options_config=(options_config) + loaded_config = ConfigLoader.load_file(options_config) + @options_config = ConfigLoader.merge_with_default(loaded_config, options_config) + end + + def force_default_config! + @options_config = ConfigLoader.default_configuration + end + + def unvalidated + @validated = false + self + end + + def for_file(file) + for_dir(File.dirname(file)) + end + + def for_pwd + for_dir(Dir.pwd) + end + + # If type (file/dir) is known beforehand, + # prefer using #for_file or #for_dir for improved performance + def for(file_or_dir) + dir = if File.directory?(file_or_dir) + file_or_dir + else + File.dirname(file_or_dir) + end + for_dir(dir) + end + + def for_dir(dir) + return @options_config if @options_config + + @path_cache[dir] ||= ConfigLoader.configuration_file_for(dir) + path = @path_cache[dir] + @object_cache[path] ||= begin + print "For #{dir}: " if ConfigLoader.debug? + ConfigLoader.configuration_from_file(path, check: validated?) + end + end + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/rubocop-1.28.2/lib/rubocop/config_validator.rb b/vendor/bundle/ruby/3.1.0/gems/rubocop-1.28.2/lib/rubocop/config_validator.rb new file mode 100644 index 000000000..8d4868350 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/rubocop-1.28.2/lib/rubocop/config_validator.rb @@ -0,0 +1,255 @@ +# frozen_string_literal: true + +require 'pathname' + +module RuboCop + # Handles validation of configuration, for example cop names, parameter + # names, and Ruby versions. + class ConfigValidator + extend Forwardable + + # @api private + COMMON_PARAMS = %w[Exclude Include Severity inherit_mode AutoCorrect StyleGuide Details].freeze + # @api private + INTERNAL_PARAMS = %w[Description StyleGuide + VersionAdded VersionChanged VersionRemoved + Reference Safe SafeAutoCorrect].freeze + # @api private + NEW_COPS_VALUES = %w[pending disable enable].freeze + + # @api private + CONFIG_CHECK_KEYS = %w[Enabled Safe SafeAutoCorrect AutoCorrect].to_set.freeze + CONFIG_CHECK_DEPARTMENTS = %w[pending override_department].freeze + private_constant :CONFIG_CHECK_KEYS, :CONFIG_CHECK_DEPARTMENTS + + def_delegators :@config, :smart_loaded_path, :for_all_cops + + def initialize(config) + @config = config + @config_obsoletion = ConfigObsoletion.new(config) + @target_ruby = TargetRuby.new(config) + end + + def validate + check_cop_config_value(@config) + reject_conflicting_safe_settings + + # Don't validate RuboCop's own files further. Avoids infinite recursion. + return if @config.internal? + + valid_cop_names, invalid_cop_names = @config.keys.partition do |key| + ConfigLoader.default_configuration.key?(key) + end + + check_obsoletions + + alert_about_unrecognized_cops(invalid_cop_names) + validate_new_cops_parameter + validate_parameter_names(valid_cop_names) + validate_enforced_styles(valid_cop_names) + validate_syntax_cop + reject_mutually_exclusive_defaults + end + + # Validations that should only be run after all config resolving has + # taken place: + # * The target ruby version is only checked once the entire inheritance + # chain has been loaded so that only the final value is validated, and + # any obsolete but overridden values are ignored. + def validate_after_resolution + check_target_ruby + end + + def target_ruby_version + target_ruby.version + end + + def validate_section_presence(name) + return unless @config.key?(name) && @config[name].nil? + + raise ValidationError, "empty section #{name} found in #{smart_loaded_path}" + end + + private + + attr_reader :target_ruby + + def check_obsoletions + @config_obsoletion.reject_obsolete! + return unless @config_obsoletion.warnings.any? + + warn Rainbow("Warning: #{@config_obsoletion.warnings.join("\n")}").yellow + end + + def check_target_ruby + return if target_ruby.supported? + + source = target_ruby.source + last_version = target_ruby.rubocop_version_with_support + + msg = if last_version + "RuboCop found unsupported Ruby version #{target_ruby_version} " \ + "in #{source}. #{target_ruby_version}-compatible " \ + "analysis was dropped after version #{last_version}." + else + 'RuboCop found unknown Ruby version ' \ + "#{target_ruby_version.inspect} in #{source}." + end + + msg += "\nSupported versions: #{TargetRuby.supported_versions.join(', ')}" + + raise ValidationError, msg + end + + def alert_about_unrecognized_cops(invalid_cop_names) + unknown_cops = [] + invalid_cop_names.each do |name| + # There could be a custom cop with this name. If so, don't warn + next if Cop::Registry.global.contains_cop_matching?([name]) + + # Special case for inherit_mode, which is a directive that we keep in + # the configuration (even though it's not a cop), because it's easier + # to do so than to pass the value around to various methods. + next if name == 'inherit_mode' + + message = <<~MESSAGE.rstrip + unrecognized cop or department #{name} found in #{smart_loaded_path} + #{suggestion(name)} + MESSAGE + + unknown_cops << message + end + raise ValidationError, unknown_cops.join("\n") if unknown_cops.any? + end + + def suggestion(name) + registry = Cop::Registry.global + departments = registry.departments.map(&:to_s) + suggestions = NameSimilarity.find_similar_names(name, departments + registry.map(&:cop_name)) + if suggestions.any? + "Did you mean `#{suggestions.join('`, `')}`?" + else + # Department names can contain slashes, e.g. Chef/Correctness, but there's no support for + # the concept of higher level departments in RuboCop. It's a flat structure. So if the user + # tries to configure a "top level department", we hint that it's the bottom level + # departments that should be configured. + suggestions = departments.select { |department| department.start_with?("#{name}/") } + "#{name} is not a department. Use `#{suggestions.join('`, `')}`." if suggestions.any? + end + end + + def validate_syntax_cop + syntax_config = @config['Lint/Syntax'] + default_config = ConfigLoader.default_configuration['Lint/Syntax'] + + return unless syntax_config && default_config.merge(syntax_config) != default_config + + raise ValidationError, + "configuration for Syntax cop found in #{smart_loaded_path}\n" \ + 'It\'s not possible to disable this cop.' + end + + def validate_new_cops_parameter + new_cop_parameter = @config.for_all_cops['NewCops'] + return if new_cop_parameter.nil? || NEW_COPS_VALUES.include?(new_cop_parameter) + + message = "invalid #{new_cop_parameter} for `NewCops` found in" \ + "#{smart_loaded_path}\n" \ + "Valid choices are: #{NEW_COPS_VALUES.join(', ')}" + + raise ValidationError, message + end + + def validate_parameter_names(valid_cop_names) + valid_cop_names.each do |name| + validate_section_presence(name) + each_invalid_parameter(name) do |param, supported_params| + warn Rainbow(<<~MESSAGE).yellow + Warning: #{name} does not support #{param} parameter. + + Supported parameters are: + + - #{supported_params.join("\n - ")} + MESSAGE + end + end + end + + def each_invalid_parameter(cop_name) + default_config = ConfigLoader.default_configuration[cop_name] + + @config[cop_name].each_key do |param| + next if COMMON_PARAMS.include?(param) || default_config.key?(param) + + supported_params = default_config.keys - INTERNAL_PARAMS + + yield param, supported_params + end + end + + def validate_enforced_styles(valid_cop_names) # rubocop:todo Metrics/AbcSize + valid_cop_names.each do |name| + styles = @config[name].select { |key, _| key.start_with?('Enforced') } + + styles.each do |style_name, style| + supported_key = RuboCop::Cop::Util.to_supported_styles(style_name) + valid = ConfigLoader.default_configuration[name][supported_key] + + next unless valid + next if valid.include?(style) + next if validate_support_and_has_list(name, style, valid) + + msg = "invalid #{style_name} '#{style}' for #{name} found in " \ + "#{smart_loaded_path}\n" \ + "Valid choices are: #{valid.join(', ')}" + raise ValidationError, msg + end + end + end + + def validate_support_and_has_list(name, formats, valid) + ConfigLoader.default_configuration[name]['AllowMultipleStyles'] && + formats.is_a?(Array) && + formats.all? { |format| valid.include?(format) } + end + + def reject_mutually_exclusive_defaults + disabled_by_default = for_all_cops['DisabledByDefault'] + enabled_by_default = for_all_cops['EnabledByDefault'] + return unless disabled_by_default && enabled_by_default + + msg = 'Cops cannot be both enabled by default and disabled by default' + raise ValidationError, msg + end + + def reject_conflicting_safe_settings + @config.each do |name, cop_config| + next unless cop_config.is_a?(Hash) + next unless cop_config['Safe'] == false && cop_config['SafeAutoCorrect'] == true + + msg = 'Unsafe cops cannot have a safe auto-correction ' \ + "(section #{name} in #{smart_loaded_path})" + raise ValidationError, msg + end + end + + def check_cop_config_value(hash, parent = nil) + hash.each do |key, value| + check_cop_config_value(value, key) if value.is_a?(Hash) + + next unless CONFIG_CHECK_KEYS.include?(key) && value.is_a?(String) + + next if key == 'Enabled' && CONFIG_CHECK_DEPARTMENTS.include?(value) + + raise ValidationError, msg_not_boolean(parent, key, value) + end + end + + # FIXME: Handling colors in exception messages like this is ugly. + def msg_not_boolean(parent, key, value) + "#{Rainbow('').reset}" \ + "Property #{Rainbow(key).yellow} of cop #{Rainbow(parent).yellow}" \ + " is supposed to be a boolean and #{Rainbow(value).yellow} is not." + end + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/rubocop-1.28.2/lib/rubocop/cop/autocorrect_logic.rb b/vendor/bundle/ruby/3.1.0/gems/rubocop-1.28.2/lib/rubocop/cop/autocorrect_logic.rb new file mode 100644 index 000000000..4004797d9 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/rubocop-1.28.2/lib/rubocop/cop/autocorrect_logic.rb @@ -0,0 +1,109 @@ +# frozen_string_literal: true + +module RuboCop + module Cop + # This module encapsulates the logic for autocorrect behavior for a cop. + module AutocorrectLogic + def autocorrect? + autocorrect_requested? && correctable? && autocorrect_enabled? + end + + def autocorrect_with_disable_uncorrectable? + autocorrect_requested? && disable_uncorrectable? && autocorrect_enabled? + end + + def autocorrect_requested? + @options.fetch(:auto_correct, false) + end + + def correctable? + self.class.support_autocorrect? || disable_uncorrectable? + end + + def disable_uncorrectable? + @options[:disable_uncorrectable] == true + end + + def safe_autocorrect? + cop_config.fetch('Safe', true) && cop_config.fetch('SafeAutoCorrect', true) + end + + def autocorrect_enabled? + # allow turning off autocorrect on a cop by cop basis + return true unless cop_config + + return false if cop_config['AutoCorrect'] == false + + return safe_autocorrect? if @options.fetch(:safe_auto_correct, false) + + true + end + + private + + def disable_offense(range) + heredoc_range = surrounding_heredoc(range) + if heredoc_range + disable_offense_before_and_after(range_by_lines(heredoc_range)) + else + eol_comment = " # rubocop:todo #{cop_name}" + needed_line_length = (range.source_line + eol_comment).length + if needed_line_length <= max_line_length + disable_offense_at_end_of_line(range_of_first_line(range), eol_comment) + else + disable_offense_before_and_after(range_by_lines(range)) + end + end + end + + def surrounding_heredoc(offense_range) + # The empty offense range is an edge case that can be reached from the Lint/Syntax cop. + return nil if offense_range.empty? + + heredoc_nodes = processed_source.ast.each_descendant.select do |node| + node.respond_to?(:heredoc?) && node.heredoc? + end + heredoc_nodes.map { |node| node.loc.expression.join(node.loc.heredoc_end) } + .find { |range| range.contains?(offense_range) } + end + + def range_of_first_line(range) + begin_of_first_line = range.begin_pos - range.column + end_of_first_line = begin_of_first_line + range.source_line.length + + Parser::Source::Range.new(range.source_buffer, begin_of_first_line, end_of_first_line) + end + + # Expand the given range to include all of any lines it covers. Does not + # include newline at end of the last line. + def range_by_lines(range) + begin_of_first_line = range.begin_pos - range.column + + last_line = range.source_buffer.source_line(range.last_line) + last_line_offset = last_line.length - range.last_column + end_of_last_line = range.end_pos + last_line_offset + + Parser::Source::Range.new(range.source_buffer, begin_of_first_line, end_of_last_line) + end + + def max_line_length + config.for_cop('Layout/LineLength')['Max'] || 120 + end + + def disable_offense_at_end_of_line(range, eol_comment) + Corrector.new(range).insert_after(range, eol_comment) + end + + def disable_offense_before_and_after(range_by_lines) + range_with_newline = range_by_lines.resize(range_by_lines.size + 1) + leading_whitespace = range_by_lines.source_line[/^\s*/] + + Corrector.new(range_by_lines).wrap( + range_with_newline, + "#{leading_whitespace}# rubocop:todo #{cop_name}\n", + "#{leading_whitespace}# rubocop:enable #{cop_name}\n" + ) + end + end + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/rubocop-1.28.2/lib/rubocop/cop/badge.rb b/vendor/bundle/ruby/3.1.0/gems/rubocop-1.28.2/lib/rubocop/cop/badge.rb new file mode 100644 index 000000000..4b3d5bb55 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/rubocop-1.28.2/lib/rubocop/cop/badge.rb @@ -0,0 +1,63 @@ +# frozen_string_literal: true + +module RuboCop + module Cop + # Identifier of all cops containing a department and cop name. + # + # All cops are identified by their badge. For example, the badge for + # `RuboCop::Cop::Layout::IndentationStyle` is `Layout/IndentationStyle`. + # Badges can be parsed as either `Department/CopName` or just `CopName` to + # allow for badge references in source files that omit the department for + # RuboCop to infer. + class Badge + attr_reader :department, :cop_name + + def self.for(class_name) + parts = class_name.split('::') + name_deep_enough = parts.length >= 4 + new(name_deep_enough ? parts[2..-1] : parts.last(2)) + end + + def self.parse(identifier) + new(identifier.split('/').map { |i| camel_case(i) }) + end + + def self.camel_case(name_part) + return 'RSpec' if name_part == 'rspec' + + name_part.gsub(/^\w|_\w/) { |match| match[-1, 1].upcase } + end + + def initialize(class_name_parts) + department_parts = class_name_parts[0...-1] + @department = (department_parts.join('/').to_sym unless department_parts.empty?) + @cop_name = class_name_parts.last + end + + def ==(other) + hash == other.hash + end + alias eql? == + + def hash + [department, cop_name].hash + end + + def match?(other) + cop_name == other.cop_name && (!qualified? || department == other.department) + end + + def to_s + @to_s ||= qualified? ? "#{department}/#{cop_name}" : cop_name + end + + def qualified? + !department.nil? + end + + def with_department(department) + self.class.new([department.to_s.split('/'), cop_name].flatten) + end + end + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/rubocop-1.28.2/lib/rubocop/cop/base.rb b/vendor/bundle/ruby/3.1.0/gems/rubocop-1.28.2/lib/rubocop/cop/base.rb new file mode 100644 index 000000000..1705a1f3f --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/rubocop-1.28.2/lib/rubocop/cop/base.rb @@ -0,0 +1,450 @@ +# frozen_string_literal: true + +module RuboCop + module Cop + # A scaffold for concrete cops. + # + # The Cop::Base class is meant to be extended. + # + # Cops track offenses and can autocorrect them on the fly. + # + # A commissioner object is responsible for traversing the AST and invoking + # the specific callbacks on each cop. + # + # First the callback `on_new_investigation` is called; + # if a cop needs to do its own processing of the AST or depends on + # something else. + # + # Then callbacks like `on_def`, `on_send` (see AST::Traversal) are called + # with their respective nodes. + # + # Finally the callback `on_investigation_end` is called. + # + # Within these callbacks, cops are meant to call `add_offense` or + # `add_global_offense`. Use the `processed_source` method to + # get the currently processed source being investigated. + # + # In case of invalid syntax / unparsable content, + # the callback `on_other_file` is called instead of all the other + # `on_...` callbacks. + # + # Private methods are not meant for custom cops consumption, + # nor are any instance variables. + # + class Base # rubocop:disable Metrics/ClassLength + extend RuboCop::AST::Sexp + extend NodePattern::Macros + extend ExcludeLimit + include RuboCop::AST::Sexp + include Util + include IgnoredNode + include AutocorrectLogic + + attr_reader :config, :processed_source + + # Reports of an investigation. + # Immutable + # Consider creation API private + InvestigationReport = Struct.new(:cop, :processed_source, :offenses, :corrector) + + # List of methods names to restrict calls for `on_send` / `on_csend` + RESTRICT_ON_SEND = Set[].freeze + + # List of cops that should not try to autocorrect at the same + # time as this cop + # + # @return [Array] + # + # @api public + def self.autocorrect_incompatible_with + [] + end + + # Cops (other than builtin) are encouraged to implement this + # @return [String, nil] + # + # @api public + def self.documentation_url + Documentation.url_for(self) if builtin? + end + + def initialize(config = nil, options = nil) + @config = config || Config.new + @options = options || { debug: false } + reset_investigation + end + + # Called before all on_... have been called + # When refining this method, always call `super` + def on_new_investigation + # Typically do nothing here + end + + # Called after all on_... have been called + # When refining this method, always call `super` + def on_investigation_end + # Typically do nothing here + end + + # Called instead of all on_... callbacks for unrecognized files / syntax errors + # When refining this method, always call `super` + def on_other_file + # Typically do nothing here + end + + # Override and return the Force class(es) you need to join + def self.joining_forces; end + + # Gets called if no message is specified when calling `add_offense` or + # `add_global_offense` + # Cops are discouraged to override this; instead pass your message directly + def message(_range = nil) + self.class::MSG + end + + # Adds an offense that has no particular location. + # No correction can be applied to global offenses + def add_global_offense(message = nil, severity: nil) + severity = find_severity(nil, severity) + message = find_message(nil, message) + @current_offenses << + Offense.new(severity, Offense::NO_LOCATION, message, name, :unsupported) + end + + # Adds an offense on the specified range (or node with an expression) + # Unless that offense is disabled for this range, a corrector will be yielded + # to provide the cop the opportunity to autocorrect the offense. + # If message is not specified, the method `message` will be called. + def add_offense(node_or_range, message: nil, severity: nil, &block) + range = range_from_node_or_range(node_or_range) + return unless current_offense_locations.add?(range) + + range_to_pass = callback_argument(range) + + severity = find_severity(range_to_pass, severity) + message = find_message(range_to_pass, message) + + status, corrector = enabled_line?(range.line) ? correct(range, &block) : :disabled + + @current_offenses << Offense.new(severity, range, message, name, status, corrector) + end + + # This method should be overridden when a cop's behavior depends + # on state that lives outside of these locations: + # + # (1) the file under inspection + # (2) the cop's source code + # (3) the config (eg a .rubocop.yml file) + # + # For example, some cops may want to look at other parts of + # the codebase being inspected to find violations. A cop may + # use the presence or absence of file `foo.rb` to determine + # whether a certain violation exists in `bar.rb`. + # + # Overriding this method allows the cop to indicate to RuboCop's + # ResultCache system when those external dependencies change, + # ie when the ResultCache should be invalidated. + def external_dependency_checksum + nil + end + + def self.inherited(subclass) + super + Registry.global.enlist(subclass) + end + + # Call for abstract Cop classes + def self.exclude_from_registry + Registry.global.dismiss(self) + end + + # Returns if class supports auto_correct. + # It is recommended to extend AutoCorrector instead of overriding + def self.support_autocorrect? + false + end + + ### Naming + + def self.badge + @badge ||= Badge.for(name) + end + + def self.cop_name + badge.to_s + end + + def self.department + badge.department + end + + def self.lint? + department == :Lint + end + + # Returns true if the cop name or the cop namespace matches any of the + # given names. + def self.match?(given_names) + return false unless given_names + + given_names.include?(cop_name) || given_names.include?(department.to_s) + end + + def cop_name + @cop_name ||= self.class.cop_name + end + + alias name cop_name + + ### Configuration Helpers + + def cop_config + # Use department configuration as basis, but let individual cop + # configuration override. + @cop_config ||= @config.for_badge(self.class.badge) + end + + def config_to_allow_offenses + Formatter::DisabledConfigFormatter.config_to_allow_offenses[cop_name] ||= {} + end + + def config_to_allow_offenses=(hash) + Formatter::DisabledConfigFormatter.config_to_allow_offenses[cop_name] = hash + end + + def target_ruby_version + @config.target_ruby_version + end + + def target_rails_version + @config.target_rails_version + end + + def relevant_file?(file) + file == RuboCop::AST::ProcessedSource::STRING_SOURCE_NAME || + (file_name_matches_any?(file, 'Include', true) && + !file_name_matches_any?(file, 'Exclude', false)) + end + + def excluded_file?(file) + !relevant_file?(file) + end + + # There should be very limited reasons for a Cop to do it's own parsing + def parse(source, path = nil) + ProcessedSource.new(source, target_ruby_version, path) + end + + ### Persistence + + # Override if your cop should be called repeatedly for multiple investigations + # Between calls to `on_new_investigation` and `on_investigation_end`, + # the result of `processed_source` will remain constant. + # You should invalidate any caches that depend on the current `processed_source` + # in the `on_new_investigation` callback. + # If your cop does autocorrections, be aware that your instance may be called + # multiple times with the same `processed_source.path` but different content. + def self.support_multiple_source? + false + end + + # @api private + # Called between investigations + def ready + return self if self.class.support_multiple_source? + + self.class.new(@config, @options) + end + + ### Reserved for Cop::Cop + + # @deprecated Make potential errors with previous API more obvious + def offenses + raise 'The offenses are not directly available; ' \ + 'they are returned as the result of the investigation' + end + + ### Reserved for Commissioner + + # @api private + def callbacks_needed + self.class.callbacks_needed + end + + # @api private + def self.callbacks_needed + @callbacks_needed ||= public_instance_methods.select do |m| + m.match?(/^on_|^after_/) && + !Base.method_defined?(m) # exclude standard "callbacks" like 'on_begin_investigation' + end + end + + private + + ### Reserved for Cop::Cop + + def callback_argument(range) + range + end + + def apply_correction(corrector) + @current_corrector&.merge!(corrector) if corrector + end + + ### Reserved for Commissioner: + + def current_offense_locations + @current_offense_locations ||= Set.new + end + + def currently_disabled_lines + @currently_disabled_lines ||= Set.new + end + + private_class_method def self.restrict_on_send + @restrict_on_send ||= self::RESTRICT_ON_SEND.to_a.freeze + end + + # Called before any investigation + def begin_investigation(processed_source) + @current_offenses = [] + @current_offense_locations = nil + @currently_disabled_lines = nil + @processed_source = processed_source + @current_corrector = Corrector.new(@processed_source) if @processed_source.valid_syntax? + end + + # Called to complete an investigation + def complete_investigation + InvestigationReport.new(self, processed_source, @current_offenses, @current_corrector) + ensure + reset_investigation + end + + ### Actually private methods + + def self.builtin? + return false unless (m = instance_methods(false).first) # any custom method will do + + path, _line = instance_method(m).source_location + path.start_with?(__dir__) + end + private_class_method :builtin? + + def reset_investigation + @currently_disabled_lines = @current_offenses = @processed_source = @current_corrector = nil + end + + # @return [Symbol, Corrector] offense status + def correct(range) + if block_given? + corrector = Corrector.new(self) + yield corrector + if corrector.empty? + corrector = nil + elsif !self.class.support_autocorrect? + raise "The Cop #{name} must `extend AutoCorrector` to be able to autocorrect" + end + end + + [use_corrector(range, corrector), corrector] + end + + # @return [Symbol] offense status + def use_corrector(range, corrector) + if autocorrect? + attempt_correction(range, corrector) + elsif corrector && cop_config.fetch('AutoCorrect', true) + :uncorrected + else + :unsupported + end + end + + # @return [Symbol] offense status + def attempt_correction(range, corrector) + if corrector + status = :corrected + elsif disable_uncorrectable? + corrector = disable_uncorrectable(range) + status = :corrected_with_todo + else + return :unsupported + end + + apply_correction(corrector) + status + end + + def disable_uncorrectable(range) + line = range.line + return unless currently_disabled_lines.add?(line) + + disable_offense(range) + end + + def range_from_node_or_range(node_or_range) + if node_or_range.respond_to?(:loc) + node_or_range.loc.expression + elsif node_or_range.is_a?(::Parser::Source::Range) + node_or_range + else + extra = ' (call `add_global_offense`)' if node_or_range.nil? + raise "Expected a Source::Range, got #{node_or_range.inspect}#{extra}" + end + end + + def find_message(range, message) + annotate(message || message(range)) + end + + def annotate(message) + RuboCop::Cop::MessageAnnotator.new( + config, cop_name, cop_config, @options + ).annotate(message) + end + + def file_name_matches_any?(file, parameter, default_result) + patterns = cop_config[parameter] + return default_result unless patterns + + path = nil + patterns.any? do |pattern| + # Try to match the absolute path, as Exclude properties are absolute. + next true if match_path?(pattern, file) + + # Try with relative path. + path ||= config.path_relative_to_config(file) + match_path?(pattern, path) + end + end + + def enabled_line?(line_number) + return true if @options[:ignore_disable_comments] || !@processed_source + + @processed_source.comment_config.cop_enabled_at_line?(self, line_number) + end + + def find_severity(_range, severity) + custom_severity || severity || default_severity + end + + def default_severity + self.class.lint? ? :warning : :convention + end + + def custom_severity + severity = cop_config['Severity'] + return unless severity + + if Severity::NAMES.include?(severity.to_sym) + severity.to_sym + else + message = "Warning: Invalid severity '#{severity}'. " \ + "Valid severities are #{Severity::NAMES.join(', ')}." + warn(Rainbow(message).red) + end + end + end + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/rubocop-1.28.2/lib/rubocop/cop/bundler/duplicated_gem.rb b/vendor/bundle/ruby/3.1.0/gems/rubocop-1.28.2/lib/rubocop/cop/bundler/duplicated_gem.rb new file mode 100644 index 000000000..546ed45b0 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/rubocop-1.28.2/lib/rubocop/cop/bundler/duplicated_gem.rb @@ -0,0 +1,93 @@ +# frozen_string_literal: true + +module RuboCop + module Cop + module Bundler + # A Gem's requirements should be listed only once in a Gemfile. + # @example + # # bad + # gem 'rubocop' + # gem 'rubocop' + # + # # bad + # group :development do + # gem 'rubocop' + # end + # + # group :test do + # gem 'rubocop' + # end + # + # # good + # group :development, :test do + # gem 'rubocop' + # end + # + # # good + # gem 'rubocop', groups: [:development, :test] + # + # # good - conditional declaration + # if Dir.exist?(local) + # gem 'rubocop', path: local + # elsif ENV['RUBOCOP_VERSION'] == 'master' + # gem 'rubocop', git: 'https://github.com/rubocop/rubocop.git' + # else + # gem 'rubocop', '~> 0.90.0' + # end + # + class DuplicatedGem < Base + include RangeHelp + + MSG = 'Gem `%s` requirements already given on line '\ + '%d of the Gemfile.' + + def on_new_investigation + return if processed_source.blank? + + duplicated_gem_nodes.each do |nodes| + nodes[1..-1].each do |node| + register_offense(node, node.first_argument.to_a.first, nodes.first.first_line) + end + end + end + + private + + # @!method gem_declarations(node) + def_node_search :gem_declarations, '(send nil? :gem str ...)' + + def duplicated_gem_nodes + gem_declarations(processed_source.ast) + .group_by(&:first_argument) + .values + .select { |nodes| nodes.size > 1 && !conditional_declaration?(nodes) } + end + + def conditional_declaration?(nodes) + parent = nodes[0].each_ancestor.find { |ancestor| !ancestor.begin_type? } + return false unless parent&.if_type? || parent&.when_type? + + root_conditional_node = parent.if_type? ? parent : parent.parent + nodes.all? { |node| within_conditional?(node, root_conditional_node) } + end + + def within_conditional?(node, conditional_node) + conditional_node.branches.any? do |branch| + branch == node || branch.child_nodes.include?(node) + end + end + + def register_offense(node, gem_name, line_of_first_occurrence) + line_range = node.loc.column...node.loc.last_column + offense_location = source_range(processed_source.buffer, node.first_line, line_range) + message = format( + MSG, + gem_name: gem_name, + line_of_first_occurrence: line_of_first_occurrence + ) + add_offense(offense_location, message: message) + end + end + end + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/rubocop-1.28.2/lib/rubocop/cop/bundler/gem_comment.rb b/vendor/bundle/ruby/3.1.0/gems/rubocop-1.28.2/lib/rubocop/cop/bundler/gem_comment.rb new file mode 100644 index 000000000..c87a3ce87 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/rubocop-1.28.2/lib/rubocop/cop/bundler/gem_comment.rb @@ -0,0 +1,171 @@ +# frozen_string_literal: true + +module RuboCop + module Cop + module Bundler + # Each gem in the Gemfile should have a comment explaining + # its purpose in the project, or the reason for its version + # or source. + # + # The optional "OnlyFor" configuration array + # can be used to only register offenses when the gems + # use certain options or have version specifiers. + # + # When "version_specifiers" is included, a comment + # will be enforced if the gem has any version specifier. + # + # When "restrictive_version_specifiers" is included, a comment + # will be enforced if the gem has a version specifier that + # holds back the version of the gem. + # + # For any other value in the array, a comment will be enforced for + # a gem if an option by the same name is present. + # A useful use case is to enforce a comment when using + # options that change the source of a gem: + # + # - `bitbucket` + # - `gist` + # - `git` + # - `github` + # - `source` + # + # For a full list of options supported by bundler, + # see https://bundler.io/man/gemfile.5.html + # . + # + # @example OnlyFor: [] (default) + # # bad + # + # gem 'foo' + # + # # good + # + # # Helpers for the foo things. + # gem 'foo' + # + # @example OnlyFor: ['version_specifiers'] + # # bad + # + # gem 'foo', '< 2.1' + # + # # good + # + # # Version 2.1 introduces breaking change baz + # gem 'foo', '< 2.1' + # + # @example OnlyFor: ['restrictive_version_specifiers'] + # # bad + # + # gem 'foo', '< 2.1' + # + # # good + # + # gem 'foo', '>= 1.0' + # + # # Version 2.1 introduces breaking change baz + # gem 'foo', '< 2.1' + # + # @example OnlyFor: ['version_specifiers', 'github'] + # # bad + # + # gem 'foo', github: 'some_account/some_fork_of_foo' + # + # gem 'bar', '< 2.1' + # + # # good + # + # # Using this fork because baz + # gem 'foo', github: 'some_account/some_fork_of_foo' + # + # # Version 2.1 introduces breaking change baz + # gem 'bar', '< 2.1' + # + class GemComment < Base + include DefNode + include GemDeclaration + + MSG = 'Missing gem description comment.' + CHECKED_OPTIONS_CONFIG = 'OnlyFor' + VERSION_SPECIFIERS_OPTION = 'version_specifiers' + RESTRICTIVE_VERSION_SPECIFIERS_OPTION = 'restrictive_version_specifiers' + RESTRICTIVE_VERSION_PATTERN = /\A\s*(?:<|~>|\d|=)/.freeze + RESTRICT_ON_SEND = %i[gem].freeze + + def on_send(node) + return unless gem_declaration?(node) + return if ignored_gem?(node) + return if commented_any_descendant?(node) + return if cop_config[CHECKED_OPTIONS_CONFIG].any? && !checked_options_present?(node) + + add_offense(node) + end + + private + + def commented_any_descendant?(node) + commented?(node) || node.each_descendant.any? { |n| commented?(n) } + end + + def commented?(node) + preceding_lines = preceding_lines(node) + preceding_comment?(node, preceding_lines.last) + end + + # The args node1 & node2 may represent a RuboCop::AST::Node + # or a Parser::Source::Comment. Both respond to #loc. + def precede?(node1, node2) + node2.loc.line - node1.loc.line <= 1 + end + + def preceding_lines(node) + processed_source.ast_with_comments[node].select do |line| + line.loc.line <= node.loc.line + end + end + + def preceding_comment?(node1, node2) + node1 && node2 && precede?(node2, node1) && comment_line?(node2.loc.expression.source) + end + + def ignored_gem?(node) + ignored_gems = Array(cop_config['IgnoredGems']) + ignored_gems.include?(node.first_argument.value) + end + + def checked_options_present?(node) + (cop_config[CHECKED_OPTIONS_CONFIG].include?(VERSION_SPECIFIERS_OPTION) && + version_specified_gem?(node)) || + (cop_config[CHECKED_OPTIONS_CONFIG].include?(RESTRICTIVE_VERSION_SPECIFIERS_OPTION) && + restrictive_version_specified_gem?(node)) || + contains_checked_options?(node) + end + + # Besides the gem name, all other *positional* arguments to `gem` are version specifiers, + # as long as it has one we know there's at least one version specifier. + def version_specified_gem?(node) + # arguments[0] is the gem name + node.arguments[1]&.str_type? + end + + # Version specifications that restrict all updates going forward. This excludes versions + # like ">= 1.0" or "!= 2.0.3". + def restrictive_version_specified_gem?(node) + return unless version_specified_gem?(node) + + node.arguments[1..-1] + .any? { |arg| arg&.str_type? && RESTRICTIVE_VERSION_PATTERN.match?(arg.value) } + end + + def contains_checked_options?(node) + (Array(cop_config[CHECKED_OPTIONS_CONFIG]) & gem_options(node).map(&:to_s)).any? + end + + def gem_options(node) + return [] unless node.arguments.last&.type == :hash + + node.arguments.last.keys.map(&:value) + end + end + end + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/rubocop-1.28.2/lib/rubocop/cop/bundler/gem_filename.rb b/vendor/bundle/ruby/3.1.0/gems/rubocop-1.28.2/lib/rubocop/cop/bundler/gem_filename.rb new file mode 100644 index 000000000..2c0536ded --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/rubocop-1.28.2/lib/rubocop/cop/bundler/gem_filename.rb @@ -0,0 +1,103 @@ +# frozen_string_literal: true + +module RuboCop + module Cop + module Bundler + # This cop verifies that a project contains Gemfile or gems.rb file and correct + # associated lock file based on the configuration. + # + # @example EnforcedStyle: Gemfile (default) + # # bad + # Project contains gems.rb and gems.locked files + # + # # bad + # Project contains Gemfile and gems.locked file + # + # # good + # Project contains Gemfile and Gemfile.lock + # + # @example EnforcedStyle: gems.rb + # # bad + # Project contains Gemfile and Gemfile.lock files + # + # # bad + # Project contains gems.rb and Gemfile.lock file + # + # # good + # Project contains gems.rb and gems.locked files + class GemFilename < Base + include ConfigurableEnforcedStyle + include RangeHelp + + MSG_GEMFILE_REQUIRED = '`gems.rb` file was found but `Gemfile` is required '\ + '(file path: %s).' + MSG_GEMS_RB_REQUIRED = '`Gemfile` was found but `gems.rb` file is required '\ + '(file path: %s).' + MSG_GEMFILE_MISMATCHED = 'Expected a `Gemfile.lock` with `Gemfile` but found '\ + '`gems.locked` file (file path: %s).' + MSG_GEMS_RB_MISMATCHED = 'Expected a `gems.locked` file with `gems.rb` but found '\ + '`Gemfile.lock` (file path: %s).' + GEMFILE_FILES = %w[Gemfile Gemfile.lock].freeze + GEMS_RB_FILES = %w[gems.rb gems.locked].freeze + + def on_new_investigation + file_path = processed_source.file_path + basename = File.basename(file_path) + return if expected_gemfile?(basename) + + register_offense(file_path, basename) + end + + private + + def register_offense(file_path, basename) + register_gemfile_offense(file_path, basename) if gemfile_offense?(basename) + register_gems_rb_offense(file_path, basename) if gems_rb_offense?(basename) + end + + def register_gemfile_offense(file_path, basename) + message = case basename + when 'gems.rb' + MSG_GEMFILE_REQUIRED + when 'gems.locked' + MSG_GEMFILE_MISMATCHED + end + + add_global_offense(format(message, file_path: file_path)) + end + + def register_gems_rb_offense(file_path, basename) + message = case basename + when 'Gemfile' + MSG_GEMS_RB_REQUIRED + when 'Gemfile.lock' + MSG_GEMS_RB_MISMATCHED + end + + add_global_offense(format(message, file_path: file_path)) + end + + def gemfile_offense?(basename) + gemfile_required? && GEMS_RB_FILES.include?(basename) + end + + def gems_rb_offense?(basename) + gems_rb_required? && GEMFILE_FILES.include?(basename) + end + + def expected_gemfile?(basename) + (gemfile_required? && GEMFILE_FILES.include?(basename)) || + (gems_rb_required? && GEMS_RB_FILES.include?(basename)) + end + + def gemfile_required? + style == :Gemfile + end + + def gems_rb_required? + style == :'gems.rb' + end + end + end + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/rubocop-1.28.2/lib/rubocop/cop/bundler/gem_version.rb b/vendor/bundle/ruby/3.1.0/gems/rubocop-1.28.2/lib/rubocop/cop/bundler/gem_version.rb new file mode 100644 index 000000000..dfe8f2ab6 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/rubocop-1.28.2/lib/rubocop/cop/bundler/gem_version.rb @@ -0,0 +1,133 @@ +# frozen_string_literal: true + +module RuboCop + module Cop + module Bundler + # Enforce that Gem version specifications or a commit reference (branch, + # ref, or tag) are either required or forbidden. + # + # @example EnforcedStyle: required (default) + # # bad + # gem 'rubocop' + # + # # good + # gem 'rubocop', '~> 1.12' + # + # # good + # gem 'rubocop', '>= 1.10.0' + # + # # good + # gem 'rubocop', '>= 1.5.0', '< 1.10.0' + # + # # good + # gem 'rubocop', branch: 'feature-branch' + # + # # good + # gem 'rubocop', ref: '74b5bfbb2c4b6fd6cdbbc7254bd7084b36e0c85b' + # + # # good + # gem 'rubocop', tag: 'v1.17.0' + # + # @example EnforcedStyle: forbidden + # # good + # gem 'rubocop' + # + # # bad + # gem 'rubocop', '~> 1.12' + # + # # bad + # gem 'rubocop', '>= 1.10.0' + # + # # bad + # gem 'rubocop', '>= 1.5.0', '< 1.10.0' + # + # # bad + # gem 'rubocop', branch: 'feature-branch' + # + # # bad + # gem 'rubocop', ref: '74b5bfbb2c4b6fd6cdbbc7254bd7084b36e0c85b' + # + # # bad + # gem 'rubocop', tag: 'v1.17.0' + # + class GemVersion < Base + include ConfigurableEnforcedStyle + include GemDeclaration + + REQUIRED_MSG = 'Gem version specification is required.' + FORBIDDEN_MSG = 'Gem version specification is forbidden.' + VERSION_SPECIFICATION_REGEX = /^\s*[~<>=]*\s*[0-9.]+/.freeze + + # @!method includes_version_specification?(node) + def_node_matcher :includes_version_specification?, <<~PATTERN + (send nil? :gem <(str #version_specification?) ...>) + PATTERN + + # @!method includes_commit_reference?(node) + def_node_matcher :includes_commit_reference?, <<~PATTERN + (send nil? :gem <(hash <(pair (sym {:branch :ref :tag}) (str _)) ...>) ...>) + PATTERN + + def on_send(node) + return unless gem_declaration?(node) + return if allowed_gem?(node) + + if offense?(node) + add_offense(node) + opposite_style_detected + else + correct_style_detected + end + end + + private + + def allowed_gem?(node) + allowed_gems.include?(node.first_argument.value) + end + + def allowed_gems + Array(cop_config['AllowedGems']) + end + + def message(range) + gem_specification = range.source + + if required_style? + format(REQUIRED_MSG, gem_specification: gem_specification) + elsif forbidden_style? + format(FORBIDDEN_MSG, gem_specification: gem_specification) + end + end + + def offense?(node) + required_offense?(node) || forbidden_offense?(node) + end + + def required_offense?(node) + return unless required_style? + + !includes_version_specification?(node) && !includes_commit_reference?(node) + end + + def forbidden_offense?(node) + return unless forbidden_style? + + includes_version_specification?(node) || includes_commit_reference?(node) + end + + def forbidden_style? + style == :forbidden + end + + def required_style? + style == :required + end + + def version_specification?(expression) + expression.match?(VERSION_SPECIFICATION_REGEX) + end + end + end + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/rubocop-1.28.2/lib/rubocop/cop/bundler/insecure_protocol_source.rb b/vendor/bundle/ruby/3.1.0/gems/rubocop-1.28.2/lib/rubocop/cop/bundler/insecure_protocol_source.rb new file mode 100644 index 000000000..c7b24a879 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/rubocop-1.28.2/lib/rubocop/cop/bundler/insecure_protocol_source.rb @@ -0,0 +1,86 @@ +# frozen_string_literal: true + +module RuboCop + module Cop + module Bundler + # Passing symbol arguments to `source` (e.g. `source :rubygems`) is + # deprecated because they default to using HTTP requests. Instead, specify + # `'https://rubygems.org'` if possible, or `'http://rubygems.org'` if not. + # + # When autocorrecting, this cop will replace symbol arguments with + # `'https://rubygems.org'`. + # + # This cop will not replace existing sources that use `http://`. This may + # be necessary where HTTPS is not available. For example, where using an + # internal gem server via an intranet, or where HTTPS is prohibited. + # However, you should strongly prefer `https://` where possible, as it is + # more secure. + # + # If you don't allow `http://`, please set `false` to `AllowHttpProtocol`. + # This option is `true` by default for safe autocorrection. + # + # @example + # # bad + # source :gemcutter + # source :rubygems + # source :rubyforge + # + # # good + # source 'https://rubygems.org' # strongly recommended + # + # @example AllowHttpProtocol: true (default) + # + # # good + # source 'http://rubygems.org' # use only if HTTPS is unavailable + # + # @example AllowHttpProtocol: false + # + # # bad + # source 'http://rubygems.org' + # + class InsecureProtocolSource < Base + include RangeHelp + extend AutoCorrector + + MSG = 'The source `:%s` is deprecated because HTTP requests ' \ + 'are insecure. ' \ + "Please change your source to 'https://rubygems.org' " \ + "if possible, or 'http://rubygems.org' if not." + MSG_HTTP_PROTOCOL = 'Use `https://rubygems.org` instead of `http://rubygems.org`.' + + RESTRICT_ON_SEND = %i[source].freeze + + # @!method insecure_protocol_source?(node) + def_node_matcher :insecure_protocol_source?, <<~PATTERN + (send nil? :source + ${(sym :gemcutter) (sym :rubygems) (sym :rubyforge) (:str "http://rubygems.org")}) + PATTERN + + def on_send(node) + insecure_protocol_source?(node) do |source_node| + source = source_node.value + use_http_protocol = source == 'http://rubygems.org' + + return if allow_http_protocol? && use_http_protocol + + message = if use_http_protocol + MSG_HTTP_PROTOCOL + else + format(MSG, source: source) + end + + add_offense(source_node, message: message) do |corrector| + corrector.replace(source_node, "'https://rubygems.org'") + end + end + end + + private + + def allow_http_protocol? + cop_config.fetch('AllowHttpProtocol', true) + end + end + end + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/rubocop-1.28.2/lib/rubocop/cop/bundler/ordered_gems.rb b/vendor/bundle/ruby/3.1.0/gems/rubocop-1.28.2/lib/rubocop/cop/bundler/ordered_gems.rb new file mode 100644 index 000000000..a8ab4f0a7 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/rubocop-1.28.2/lib/rubocop/cop/bundler/ordered_gems.rb @@ -0,0 +1,62 @@ +# frozen_string_literal: true + +module RuboCop + module Cop + module Bundler + # Gems should be alphabetically sorted within groups. + # + # @example + # # bad + # gem 'rubocop' + # gem 'rspec' + # + # # good + # gem 'rspec' + # gem 'rubocop' + # + # # good + # gem 'rubocop' + # + # gem 'rspec' + # + # # good only if TreatCommentsAsGroupSeparators is true + # # For code quality + # gem 'rubocop' + # # For tests + # gem 'rspec' + class OrderedGems < Base + extend AutoCorrector + include OrderedGemNode + + MSG = 'Gems should be sorted in an alphabetical order within their '\ + 'section of the Gemfile. '\ + 'Gem `%s` should appear before `%s`.' + + def on_new_investigation + return if processed_source.blank? + + gem_declarations(processed_source.ast) + .each_cons(2) do |previous, current| + next unless consecutive_lines(previous, current) + next unless case_insensitive_out_of_order?(gem_name(current), gem_name(previous)) + + register_offense(previous, current) + end + end + + private + + def previous_declaration(node) + declarations = gem_declarations(processed_source.ast) + node_index = declarations.map(&:location).find_index(node.location) + declarations.to_a[node_index - 1] + end + + # @!method gem_declarations(node) + def_node_search :gem_declarations, <<~PATTERN + (:send nil? :gem str ...) + PATTERN + end + end + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/rubocop-1.28.2/lib/rubocop/cop/commissioner.rb b/vendor/bundle/ruby/3.1.0/gems/rubocop-1.28.2/lib/rubocop/cop/commissioner.rb new file mode 100644 index 000000000..87fbf5bea --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/rubocop-1.28.2/lib/rubocop/cop/commissioner.rb @@ -0,0 +1,169 @@ +# frozen_string_literal: true + +module RuboCop + module Cop + # Commissioner class is responsible for processing the AST and delegating + # work to the specified cops. + class Commissioner + include RuboCop::AST::Traversal + + RESTRICTED_CALLBACKS = %i[on_send on_csend after_send after_csend].freeze + private_constant :RESTRICTED_CALLBACKS + + # How a Commissioner returns the results of the investigation + # as a list of Cop::InvestigationReport and any errors caught + # during the investigation. + # Immutable + # Consider creation API private + InvestigationReport = Struct.new(:processed_source, :cop_reports, :errors) do + def cops + @cops ||= cop_reports.map(&:cop) + end + + def offenses_per_cop + @offenses_per_cop ||= cop_reports.map(&:offenses) + end + + def correctors + @correctors ||= cop_reports.map(&:corrector) + end + + def offenses + @offenses ||= offenses_per_cop.flatten(1) + end + + def merge(investigation) + InvestigationReport.new(processed_source, + cop_reports + investigation.cop_reports, + errors + investigation.errors) + end + end + + attr_reader :errors + + def initialize(cops, forces = [], options = {}) + @cops = cops + @forces = forces + @options = options + initialize_callbacks + + reset + end + + # Create methods like :on_send, :on_super, etc. They will be called + # during AST traversal and try to call corresponding methods on cops. + # A call to `super` is used + # to continue iterating over the children of a node. + # However, if we know that a certain node type (like `int`) never has + # child nodes, there is no reason to pay the cost of calling `super`. + Parser::Meta::NODE_TYPES.each do |node_type| + method_name = :"on_#{node_type}" + next unless method_defined?(method_name) + + # Hacky: Comment-out code as needed + r = '#' unless RESTRICTED_CALLBACKS.include?(method_name) # has Restricted? + c = '#' if NO_CHILD_NODES.include?(node_type) # has Children? + + class_eval(<<~RUBY, __FILE__, __LINE__ + 1) + def on_#{node_type}(node) # def on_send(node) + trigger_responding_cops(:on_#{node_type}, node) # trigger_responding_cops(:on_send, node) + #{r} trigger_restricted_cops(:on_#{node_type}, node) # trigger_restricted_cops(:on_send, node) + #{c} super(node) # super(node) + #{c} trigger_responding_cops(:after_#{node_type}, node) # trigger_responding_cops(:after_send, node) + #{c}#{r} trigger_restricted_cops(:after_#{node_type}, node) # trigger_restricted_cops(:after_send, node) + end # end + RUBY + end + + # @return [InvestigationReport] + def investigate(processed_source) + reset + + @cops.each { |cop| cop.send :begin_investigation, processed_source } + if processed_source.valid_syntax? + invoke(:on_new_investigation, @cops) + invoke(:investigate, @forces, processed_source) + walk(processed_source.ast) unless @cops.empty? + invoke(:on_investigation_end, @cops) + else + invoke(:on_other_file, @cops) + end + reports = @cops.map { |cop| cop.send(:complete_investigation) } + InvestigationReport.new(processed_source, reports, @errors) + end + + private + + def trigger_responding_cops(callback, node) + @callbacks[callback]&.each do |cop| + with_cop_error_handling(cop, node) do + cop.public_send(callback, node) + end + end + end + + def reset + @errors = [] + end + + def initialize_callbacks + @callbacks = build_callbacks(@cops) + @restricted_map = restrict_callbacks(@callbacks) + end + + def build_callbacks(cops) + callbacks = {} + cops.each do |cop| + cop.callbacks_needed.each do |callback| + (callbacks[callback] ||= []) << cop + end + end + callbacks + end + + def restrict_callbacks(callbacks) + restricted = {} + RESTRICTED_CALLBACKS.each do |callback| + restricted[callback] = restricted_map(callbacks[callback]) + end + restricted + end + + def trigger_restricted_cops(event, node) + name = node.method_name + @restricted_map[event][name]&.each do |cop| + with_cop_error_handling(cop, node) do + cop.public_send(event, node) + end + end + end + + # NOTE: mutates `callbacks` in place + def restricted_map(callbacks) + map = {} + callbacks&.select! do |cop| + restrictions = cop.class.send :restrict_on_send + restrictions.each { |name| (map[name] ||= []) << cop } + restrictions.empty? + end + map + end + + def invoke(callback, cops, *args) + cops.each { |cop| with_cop_error_handling(cop) { cop.send(callback, *args) } } + end + + # Allow blind rescues here, since we're absorbing and packaging or + # re-raising exceptions that can be raised from within the individual + # cops' `#investigate` methods. + def with_cop_error_handling(cop, node = nil) + yield + rescue StandardError => e + raise e if @options[:raise_error] + + err = ErrorWithAnalyzedFileLocation.new(cause: e, node: node, cop: cop) + @errors << err + end + end + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/rubocop-1.28.2/lib/rubocop/cop/cop.rb b/vendor/bundle/ruby/3.1.0/gems/rubocop-1.28.2/lib/rubocop/cop/cop.rb new file mode 100644 index 000000000..9e6cbf7b0 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/rubocop-1.28.2/lib/rubocop/cop/cop.rb @@ -0,0 +1,146 @@ +# frozen_string_literal: true + +require 'uri' +require_relative 'legacy/corrections_proxy' + +module RuboCop + module Cop + # @deprecated Use Cop::Base instead + # Legacy scaffold for Cops. + # See https://docs.rubocop.org/rubocop/cop_api_v1_changelog.html + class Cop < Base + attr_reader :offenses + + exclude_from_registry + + # @deprecated + Correction = Struct.new(:lambda, :node, :cop) do + def call(corrector) + lambda.call(corrector) + rescue StandardError => e + raise ErrorWithAnalyzedFileLocation.new(cause: e, node: node, cop: cop) + end + end + + def add_offense(node_or_range, location: :expression, message: nil, severity: nil, &block) + @v0_argument = node_or_range + range = find_location(node_or_range, location) + if block.nil? && !support_autocorrect? + super(range, message: message, severity: severity) + else + super(range, message: message, severity: severity) do |corrector| + emulate_v0_callsequence(corrector, &block) + end + end + end + + def find_location(node, loc) + # Location can be provided as a symbol, e.g.: `:keyword` + loc.is_a?(Symbol) ? node.loc.public_send(loc) : loc + end + + # @deprecated Use class method + def support_autocorrect? + # warn 'deprecated, use cop.class.support_autocorrect?' TODO + self.class.support_autocorrect? + end + + def self.support_autocorrect? + method_defined?(:autocorrect) + end + + def self.joining_forces + return unless method_defined?(:join_force?) + + cop = new + Force.all.select { |force_class| cop.join_force?(force_class) } + end + + # @deprecated + def corrections + # warn 'Cop#corrections is deprecated' TODO + return [] unless @last_corrector + + Legacy::CorrectionsProxy.new(@last_corrector) + end + + # Called before all on_... have been called + def on_new_investigation + investigate(processed_source) if respond_to?(:investigate) + super + end + + # Called after all on_... have been called + def on_investigation_end + investigate_post_walk(processed_source) if respond_to?(:investigate_post_walk) + super + end + + ### Deprecated registry access + + # @deprecated Use Registry.global + def self.registry + Registry.global + end + + # @deprecated Use Registry.all + def self.all + Registry.all + end + + # @deprecated Use Registry.qualified_cop_name + def self.qualified_cop_name(name, origin) + Registry.qualified_cop_name(name, origin) + end + + private + + def begin_investigation(processed_source) + super + @offenses = @current_offenses + @last_corrector = @current_corrector + end + + # Override Base + def callback_argument(_range) + @v0_argument + end + + def apply_correction(corrector) + suppress_clobbering { super } + end + + # Just for legacy + def emulate_v0_callsequence(corrector) + lambda = correction_lambda + yield corrector if block_given? + unless corrector.empty? + raise 'Your cop must inherit from Cop::Base and extend AutoCorrector' + end + + return unless lambda + + suppress_clobbering { lambda.call(corrector) } + end + + def correction_lambda + return unless support_autocorrect? + + dedup_on_node(@v0_argument) { autocorrect(@v0_argument) } + end + + def dedup_on_node(node) + @corrected_nodes ||= {}.compare_by_identity + yield unless @corrected_nodes.key?(node) + ensure + @corrected_nodes[node] = true + end + + def suppress_clobbering + yield + rescue ::Parser::ClobberingError + # ignore Clobbering errors + end + end + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/rubocop-1.28.2/lib/rubocop/cop/corrector.rb b/vendor/bundle/ruby/3.1.0/gems/rubocop-1.28.2/lib/rubocop/cop/corrector.rb new file mode 100644 index 000000000..b8e78a509 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/rubocop-1.28.2/lib/rubocop/cop/corrector.rb @@ -0,0 +1,118 @@ +# frozen_string_literal: true + +module RuboCop + module Cop + # This class takes a source buffer and rewrite its source + # based on the different correction rules supplied. + # + # Important! + # The nodes modified by the corrections should be part of the + # AST of the source_buffer. + class Corrector < ::Parser::Source::TreeRewriter + NOOP_CONSUMER = ->(diagnostic) {} # noop + + # @param source [Parser::Source::Buffer, or anything + # leading to one via `(processed_source.)buffer`] + # + # corrector = Corrector.new(cop) + def initialize(source) + source = self.class.source_buffer(source) + super( + source, + different_replacements: :raise, + swallowed_insertions: :raise, + crossing_deletions: :accept + ) + + # Don't print warnings to stderr if corrections conflict with each other + diagnostics.consumer = NOOP_CONSUMER + end + + alias rewrite process # Legacy + + # Removes `size` characters prior to the source range. + # + # @param [Parser::Source::Range, RuboCop::AST::Node] range or node + # @param [Integer] size + def remove_preceding(node_or_range, size) + range = to_range(node_or_range) + to_remove = range.with(begin_pos: range.begin_pos - size, end_pos: range.begin_pos) + remove(to_remove) + end + + # Removes `size` characters from the beginning of the given range. + # If `size` is greater than the size of `range`, the removed region can + # overrun the end of `range`. + # + # @param [Parser::Source::Range, RuboCop::AST::Node] range or node + # @param [Integer] size + def remove_leading(node_or_range, size) + range = to_range(node_or_range) + to_remove = range.with(end_pos: range.begin_pos + size) + remove(to_remove) + end + + # Removes `size` characters from the end of the given range. + # If `size` is greater than the size of `range`, the removed region can + # overrun the beginning of `range`. + # + # @param [Parser::Source::Range, RuboCop::AST::Node] range or node + # @param [Integer] size + def remove_trailing(node_or_range, size) + range = to_range(node_or_range) + to_remove = range.with(begin_pos: range.end_pos - size) + remove(to_remove) + end + + # Duck typing for get to a ::Parser::Source::Buffer + def self.source_buffer(source) + source = source.processed_source if source.respond_to?(:processed_source) + source = source.buffer if source.respond_to?(:buffer) + source = source.source_buffer if source.respond_to?(:source_buffer) + + unless source.is_a? ::Parser::Source::Buffer + raise TypeError, 'Expected argument to lead to a Parser::Source::Buffer ' \ + "but got #{source.inspect}" + end + + source + end + + private + + # :nodoc: + def to_range(node_or_range) + range = case node_or_range + when ::RuboCop::AST::Node, ::Parser::Source::Comment + node_or_range.loc.expression + when ::Parser::Source::Range + node_or_range + else + raise TypeError, + 'Expected a Parser::Source::Range, Comment or ' \ + "RuboCop::AST::Node, got #{node_or_range.class}" + end + validate_buffer(range.source_buffer) + range + end + + def check_range_validity(node_or_range) + super(to_range(node_or_range)) + end + + def validate_buffer(buffer) + return if buffer == source_buffer + + unless buffer.is_a?(::Parser::Source::Buffer) + # actually this should be enforced by parser gem + raise 'Corrector expected range source buffer to be a ' \ + "Parser::Source::Buffer, but got #{buffer.class}" + end + raise "Correction target buffer #{buffer.object_id} " \ + "name:#{buffer.name.inspect}" \ + " is not current #{@source_buffer.object_id} " \ + "name:#{@source_buffer.name.inspect} under investigation" + end + end + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/rubocop-1.28.2/lib/rubocop/cop/correctors/alignment_corrector.rb b/vendor/bundle/ruby/3.1.0/gems/rubocop-1.28.2/lib/rubocop/cop/correctors/alignment_corrector.rb new file mode 100644 index 000000000..b121fec89 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/rubocop-1.28.2/lib/rubocop/cop/correctors/alignment_corrector.rb @@ -0,0 +1,136 @@ +# frozen_string_literal: true + +module RuboCop + module Cop + # This class does auto-correction of nodes that should just be moved to + # the left or to the right, amount being determined by the instance + # variable column_delta. + class AlignmentCorrector + extend RangeHelp + extend Alignment + + class << self + attr_reader :processed_source + + def correct(corrector, processed_source, node, column_delta) + return unless node + + @processed_source = processed_source + expr = node.respond_to?(:loc) ? node.loc.expression : node + return if block_comment_within?(expr) + + taboo_ranges = inside_string_ranges(node) + + each_line(expr) do |line_begin_pos| + autocorrect_line(corrector, line_begin_pos, expr, column_delta, taboo_ranges) + end + end + + def align_end(corrector, processed_source, node, align_to) + @processed_source = processed_source + whitespace = whitespace_range(node) + return false unless whitespace.source.strip.empty? + + column = alignment_column(align_to) + corrector.replace(whitespace, ' ' * column) + end + + private + + def autocorrect_line(corrector, line_begin_pos, expr, column_delta, + taboo_ranges) + range = calculate_range(expr, line_begin_pos, column_delta) + # We must not change indentation of heredoc strings or inside other + # string literals + return if taboo_ranges.any? { |t| within?(range, t) } + + if column_delta.positive? && range.resize(1).source != "\n" + corrector.insert_before(range, ' ' * column_delta) + elsif /\A[ \t]+\z/.match?(range.source) + remove(range, corrector) + end + end + + def inside_string_ranges(node) + return [] unless node.is_a?(Parser::AST::Node) + + node.each_node(:str, :dstr, :xstr).map { |n| inside_string_range(n) }.compact + end + + def inside_string_range(node) + loc = node.location + + if node.heredoc? + loc.heredoc_body.join(loc.heredoc_end) + elsif delimited_string_literal?(node) + loc.begin.end.join(loc.end.begin) + end + end + + # Some special kinds of string literals are not composed of literal + # characters between two delimiters: + # - The source map of `?a` responds to :begin and :end but its end is + # nil. + # - The source map of `__FILE__` responds to neither :begin nor :end. + def delimited_string_literal?(node) + loc = node.location + + loc.respond_to?(:begin) && loc.begin && loc.respond_to?(:end) && loc.end + end + + def block_comment_within?(expr) + processed_source.comments.select(&:document?).any? do |c| + within?(c.loc.expression, expr) + end + end + + def calculate_range(expr, line_begin_pos, column_delta) + return range_between(line_begin_pos, line_begin_pos) if column_delta.positive? + + starts_with_space = expr.source_buffer.source[line_begin_pos].start_with?(' ') + + if starts_with_space + range_between(line_begin_pos, line_begin_pos + column_delta.abs) + else + range_between(line_begin_pos - column_delta.abs, line_begin_pos) + end + end + + def remove(range, corrector) + original_stderr = $stderr + $stderr = StringIO.new # Avoid error messages on console + corrector.remove(range) + rescue RuntimeError + range = range_between(range.begin_pos + 1, range.end_pos + 1) + retry if /^ +$/.match?(range.source) + ensure + $stderr = original_stderr + end + + def each_line(expr) + line_begin_pos = expr.begin_pos + expr.source.each_line do |line| + yield line_begin_pos + line_begin_pos += line.length + end + end + + def whitespace_range(node) + begin_pos = node.loc.end.begin_pos + + range_between(begin_pos - node.loc.end.column, begin_pos) + end + + def alignment_column(align_to) + if !align_to + 0 + elsif align_to.respond_to?(:loc) + align_to.source_range.column + else + align_to.column + end + end + end + end + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/rubocop-1.28.2/lib/rubocop/cop/correctors/condition_corrector.rb b/vendor/bundle/ruby/3.1.0/gems/rubocop-1.28.2/lib/rubocop/cop/correctors/condition_corrector.rb new file mode 100644 index 000000000..7de6c60f4 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/rubocop-1.28.2/lib/rubocop/cop/correctors/condition_corrector.rb @@ -0,0 +1,25 @@ +# frozen_string_literal: true + +module RuboCop + module Cop + # This class does condition auto-correction + class ConditionCorrector + class << self + def correct_negative_condition(corrector, node) + condition = negated_condition(node) + + corrector.replace(node.loc.keyword, node.inverse_keyword) + corrector.replace(condition, condition.children.first.source) + end + + private + + def negated_condition(node) + condition = node.condition + condition = condition.children.first while condition.begin_type? + condition + end + end + end + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/rubocop-1.28.2/lib/rubocop/cop/correctors/each_to_for_corrector.rb b/vendor/bundle/ruby/3.1.0/gems/rubocop-1.28.2/lib/rubocop/cop/correctors/each_to_for_corrector.rb new file mode 100644 index 000000000..ca3362787 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/rubocop-1.28.2/lib/rubocop/cop/correctors/each_to_for_corrector.rb @@ -0,0 +1,51 @@ +# frozen_string_literal: true + +module RuboCop + module Cop + # This class auto-corrects `#each` enumeration to `for` iteration. + class EachToForCorrector + extend NodePattern::Macros + + CORRECTION_WITH_ARGUMENTS = 'for %s in %s do' + CORRECTION_WITHOUT_ARGUMENTS = 'for _ in %s do' + + def initialize(block_node) + @block_node = block_node + @collection_node = block_node.receiver + @argument_node = block_node.arguments + end + + def call(corrector) + corrector.replace(offending_range, correction) + end + + private + + attr_reader :block_node, :collection_node, :argument_node + + def correction + if block_node.arguments? + format(CORRECTION_WITH_ARGUMENTS, + collection: collection_node.source, + variables: argument_node.children.first.source) + else + format(CORRECTION_WITHOUT_ARGUMENTS, enumerable: collection_node.source) + end + end + + def offending_range + if block_node.arguments? + replacement_range(argument_node.loc.expression.end_pos) + else + replacement_range(block_node.loc.begin.end_pos) + end + end + + def replacement_range(end_pos) + Parser::Source::Range.new(block_node.loc.expression.source_buffer, + block_node.loc.expression.begin_pos, + end_pos) + end + end + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/rubocop-1.28.2/lib/rubocop/cop/correctors/empty_line_corrector.rb b/vendor/bundle/ruby/3.1.0/gems/rubocop-1.28.2/lib/rubocop/cop/correctors/empty_line_corrector.rb new file mode 100644 index 000000000..ab68bdea2 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/rubocop-1.28.2/lib/rubocop/cop/correctors/empty_line_corrector.rb @@ -0,0 +1,25 @@ +# frozen_string_literal: true + +module RuboCop + module Cop + # This class does empty line auto-correction + class EmptyLineCorrector + class << self + def correct(corrector, node) + offense_style, range = node + + case offense_style + when :no_empty_lines + corrector.remove(range) + when :empty_lines + corrector.insert_before(range, "\n") + end + end + + def insert_before(corrector, node) + corrector.insert_before(node, "\n") + end + end + end + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/rubocop-1.28.2/lib/rubocop/cop/correctors/for_to_each_corrector.rb b/vendor/bundle/ruby/3.1.0/gems/rubocop-1.28.2/lib/rubocop/cop/correctors/for_to_each_corrector.rb new file mode 100644 index 000000000..b4ca90447 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/rubocop-1.28.2/lib/rubocop/cop/correctors/for_to_each_corrector.rb @@ -0,0 +1,72 @@ +# frozen_string_literal: true + +module RuboCop + module Cop + # This class auto-corrects `for` iteration to `#each` enumeration. + class ForToEachCorrector + extend NodePattern::Macros + + CORRECTION = '%s.each do |%s|' + + def initialize(for_node) + @for_node = for_node + @variable_node = for_node.variable + @collection_node = for_node.collection + end + + def call(corrector) + corrector.replace(offending_range, correction) + end + + private + + attr_reader :for_node, :variable_node, :collection_node + + def correction + format(CORRECTION, collection: collection_source, argument: variable_node.source) + end + + def collection_source + if requires_parentheses? + "(#{collection_node.source})" + else + collection_node.source + end + end + + def requires_parentheses? + collection_node.range_type? + end + + def end_position + if for_node.do? + keyword_begin.end_pos + else + collection_end.end_pos + end + end + + def keyword_begin + for_node.loc.begin + end + + def collection_end + if collection_node.begin_type? + collection_node.loc.end + else + collection_node.loc.expression + end + end + + def offending_range + replacement_range(end_position) + end + + def replacement_range(end_pos) + Parser::Source::Range.new(for_node.loc.expression.source_buffer, + for_node.loc.expression.begin_pos, + end_pos) + end + end + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/rubocop-1.28.2/lib/rubocop/cop/correctors/if_then_corrector.rb b/vendor/bundle/ruby/3.1.0/gems/rubocop-1.28.2/lib/rubocop/cop/correctors/if_then_corrector.rb new file mode 100644 index 000000000..800024e77 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/rubocop-1.28.2/lib/rubocop/cop/correctors/if_then_corrector.rb @@ -0,0 +1,55 @@ +# frozen_string_literal: true + +module RuboCop + module Cop + # This class auto-corrects `if...then` structures to a multiline `if` statement + class IfThenCorrector + DEFAULT_INDENTATION_WIDTH = 2 + + def initialize(if_node, indentation: nil) + @if_node = if_node + @indentation = indentation || DEFAULT_INDENTATION_WIDTH + end + + def call(corrector) + corrector.replace(if_node, replacement) + end + + private + + attr_reader :if_node, :indentation + + def replacement(node = if_node, indentation = nil) + indentation = ' ' * node.source_range.column if indentation.nil? + if_branch_source = node.if_branch&.source || 'nil' + elsif_indentation = indentation if node.respond_to?(:elsif?) && node.elsif? + + if_branch = <<~RUBY + #{elsif_indentation}#{node.keyword} #{node.condition.source} + #{indentation}#{branch_body_indentation}#{if_branch_source} + RUBY + + else_branch = rewrite_else_branch(node.else_branch, indentation) + if_branch + else_branch + end + + def rewrite_else_branch(else_branch, indentation) + if else_branch.nil? + 'end' + elsif else_branch.if_type? && else_branch.elsif? + replacement(else_branch, indentation) + else + <<~RUBY.chomp + #{indentation}else + #{indentation}#{branch_body_indentation}#{else_branch.source} + #{indentation}end + RUBY + end + end + + def branch_body_indentation + @branch_body_indentation ||= (' ' * indentation).freeze + end + end + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/rubocop-1.28.2/lib/rubocop/cop/correctors/lambda_literal_to_method_corrector.rb b/vendor/bundle/ruby/3.1.0/gems/rubocop-1.28.2/lib/rubocop/cop/correctors/lambda_literal_to_method_corrector.rb new file mode 100644 index 000000000..d60797ead --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/rubocop-1.28.2/lib/rubocop/cop/correctors/lambda_literal_to_method_corrector.rb @@ -0,0 +1,136 @@ +# frozen_string_literal: true + +module RuboCop + module Cop + # This class auto-corrects lambda literal to method notation. + class LambdaLiteralToMethodCorrector + def initialize(block_node) + @block_node = block_node + @method = block_node.send_node + @arguments = block_node.arguments + end + + def call(corrector) + # Check for unparenthesized args' preceding and trailing whitespaces. + remove_unparenthesized_whitespace(corrector) + + # Avoid correcting to `lambdado` by inserting whitespace + # if none exists before or after the lambda arguments. + insert_separating_space(corrector) + + replace_selector(corrector) + remove_arguments(corrector) + + replace_delimiters(corrector) + + insert_arguments(corrector) + end + + private + + attr_reader :block_node, :method, :arguments + + def remove_unparenthesized_whitespace(corrector) + return if arguments.empty? || arguments.parenthesized_call? + + remove_leading_whitespace(corrector) + remove_trailing_whitespace(corrector) + end + + def insert_separating_space(corrector) + return unless needs_separating_space? + + corrector.insert_before(block_begin, ' ') + end + + def replace_selector(corrector) + corrector.replace(method, 'lambda') + end + + def remove_arguments(corrector) + return if arguments.empty_and_without_delimiters? + + corrector.remove(arguments) + end + + def insert_arguments(corrector) + return if arguments.empty? + + arg_str = " |#{lambda_arg_string}|" + corrector.insert_after(block_node.loc.begin, arg_str) + end + + def remove_leading_whitespace(corrector) + corrector.remove_preceding( + arguments, + arguments.source_range.begin_pos - + block_node.send_node.source_range.end_pos + ) + end + + def remove_trailing_whitespace(corrector) + size = block_begin.begin_pos - arguments.source_range.end_pos - 1 + corrector.remove_preceding(block_begin, size) if size.positive? + end + + def replace_delimiters(corrector) + return if block_node.braces? || !arg_to_unparenthesized_call? + + corrector.insert_after(block_begin, ' ') unless separating_space? + + corrector.replace(block_begin, '{') + corrector.replace(block_end, '}') + end + + def lambda_arg_string + arguments.children.map(&:source).join(', ') + end + + def needs_separating_space? + (block_begin.begin_pos == arguments_end_pos && + selector_end.end_pos == arguments_begin_pos) || + block_begin.begin_pos == selector_end.end_pos + end + + def arguments_end_pos + arguments.loc.end&.end_pos + end + + def arguments_begin_pos + arguments.loc.begin&.begin_pos + end + + def block_end + block_node.loc.end + end + + def block_begin + block_node.loc.begin + end + + def selector_end + method.loc.selector.end + end + + def arg_to_unparenthesized_call? + current_node = block_node + + parent = current_node.parent + + if parent&.pair_type? + current_node = parent.parent + parent = current_node.parent + end + + return false unless parent&.send_type? + return false if parent.parenthesized_call? + + current_node.sibling_index > 1 + end + + def separating_space? + block_begin.source_buffer.source[block_begin.begin_pos + 2].match?(/\s/) + end + end + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/rubocop-1.28.2/lib/rubocop/cop/correctors/line_break_corrector.rb b/vendor/bundle/ruby/3.1.0/gems/rubocop-1.28.2/lib/rubocop/cop/correctors/line_break_corrector.rb new file mode 100644 index 000000000..55c4b2df9 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/rubocop-1.28.2/lib/rubocop/cop/correctors/line_break_corrector.rb @@ -0,0 +1,58 @@ +# frozen_string_literal: true + +module RuboCop + module Cop + # This class handles autocorrection for code that needs to be moved + # to new lines. + class LineBreakCorrector + extend Alignment + extend TrailingBody + extend Util + + class << self + attr_reader :processed_source + + def correct_trailing_body(configured_width:, corrector:, node:, + processed_source:) + @processed_source = processed_source + range = first_part_of(node.to_a.last) + eol_comment = processed_source.comment_at_line(node.source_range.line) + + break_line_before(range: range, node: node, corrector: corrector, + configured_width: configured_width) + move_comment(eol_comment: eol_comment, node: node, corrector: corrector) + remove_semicolon(node, corrector) + end + + def break_line_before(range:, node:, corrector:, configured_width:, + indent_steps: 1) + corrector.insert_before( + range, + "\n#{' ' * (node.loc.keyword.column + (indent_steps * configured_width))}" + ) + end + + def move_comment(eol_comment:, node:, corrector:) + return unless eol_comment + + text = eol_comment.loc.expression.source + corrector.insert_before(node, "#{text}\n#{' ' * node.loc.keyword.column}") + corrector.remove(eol_comment) + end + + private + + def remove_semicolon(node, corrector) + return unless semicolon(node) + + corrector.remove(semicolon(node).pos) + end + + def semicolon(node) + @semicolon ||= {}.compare_by_identity + @semicolon[node] ||= processed_source.tokens_within(node).find(&:semicolon?) + end + end + end + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/rubocop-1.28.2/lib/rubocop/cop/correctors/multiline_literal_brace_corrector.rb b/vendor/bundle/ruby/3.1.0/gems/rubocop-1.28.2/lib/rubocop/cop/correctors/multiline_literal_brace_corrector.rb new file mode 100644 index 000000000..01c8ad0b6 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/rubocop-1.28.2/lib/rubocop/cop/correctors/multiline_literal_brace_corrector.rb @@ -0,0 +1,97 @@ +# frozen_string_literal: true + +module RuboCop + module Cop + # Autocorrection logic for the closing brace of a literal either + # on the same line as the last contained elements, or a new line. + class MultilineLiteralBraceCorrector + include MultilineLiteralBraceLayout + include RangeHelp + + def self.correct(corrector, node, processed_source) + new(corrector, node, processed_source).call + end + + def initialize(corrector, node, processed_source) + @corrector = corrector + @node = node + @processed_source = processed_source + end + + def call + if closing_brace_on_same_line?(node) + correct_same_line_brace(corrector) + else + # When a comment immediately before the closing brace gets in the + # way of an easy correction, the offense is reported but not auto- + # corrected. The user must handle the delicate decision of where to + # put the comment. + return if new_line_needed_before_closing_brace?(node) + + correct_next_line_brace(corrector) + end + end + + private + + attr_reader :corrector, :node, :processed_source + + def correct_same_line_brace(corrector) + corrector.insert_before(node.loc.end, "\n") + end + + def correct_next_line_brace(corrector) + corrector.remove(range_with_surrounding_space(range: node.loc.end, side: :left)) + + corrector.insert_before( + last_element_range_with_trailing_comma(node).end, + content_if_comment_present(corrector, node) + ) + end + + def content_if_comment_present(corrector, node) + range = range_with_surrounding_space( + range: children(node).last.source_range, + side: :right + ).end.resize(1) + if range.source == '#' + select_content_to_be_inserted_after_last_element(corrector, node) + else + node.loc.end.source + end + end + + def select_content_to_be_inserted_after_last_element(corrector, node) + range = range_between( + node.loc.end.begin_pos, + range_by_whole_lines(node.loc.expression).end.end_pos + ) + + remove_trailing_content_of_comment(corrector, range) + range.source + end + + def remove_trailing_content_of_comment(corrector, range) + corrector.remove(range) + end + + def last_element_range_with_trailing_comma(node) + trailing_comma_range = last_element_trailing_comma_range(node) + if trailing_comma_range + children(node).last.source_range.join(trailing_comma_range) + else + children(node).last.source_range + end + end + + def last_element_trailing_comma_range(node) + range = range_with_surrounding_space( + range: children(node).last.source_range, + side: :right + ).end.resize(1) + + range.source == ',' ? range : nil + end + end + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/rubocop-1.28.2/lib/rubocop/cop/correctors/ordered_gem_corrector.rb b/vendor/bundle/ruby/3.1.0/gems/rubocop-1.28.2/lib/rubocop/cop/correctors/ordered_gem_corrector.rb new file mode 100644 index 000000000..af1effc98 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/rubocop-1.28.2/lib/rubocop/cop/correctors/ordered_gem_corrector.rb @@ -0,0 +1,43 @@ +# frozen_string_literal: true + +module RuboCop + module Cop + # This auto-corrects gem dependency order + class OrderedGemCorrector + class << self + include OrderedGemNode + include RangeHelp + + attr_reader :processed_source, :comments_as_separators + + def correct(processed_source, node, + previous_declaration, comments_as_separators) + @processed_source = processed_source + @comments_as_separators = comments_as_separators + + current_range = declaration_with_comment(node) + previous_range = declaration_with_comment(previous_declaration) + + ->(corrector) { swap_range(corrector, current_range, previous_range) } + end + + private + + def declaration_with_comment(node) + buffer = processed_source.buffer + begin_pos = range_by_whole_lines(get_source_range(node, comments_as_separators)).begin_pos + end_line = buffer.line_for_position(node.loc.expression.end_pos) + end_pos = range_by_whole_lines(buffer.line_range(end_line), + include_final_newline: true).end_pos + + range_between(begin_pos, end_pos) + end + + def swap_range(corrector, range1, range2) + corrector.insert_before(range2, range1.source) + corrector.remove(range1) + end + end + end + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/rubocop-1.28.2/lib/rubocop/cop/correctors/parentheses_corrector.rb b/vendor/bundle/ruby/3.1.0/gems/rubocop-1.28.2/lib/rubocop/cop/correctors/parentheses_corrector.rb new file mode 100644 index 000000000..e49e7fc64 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/rubocop-1.28.2/lib/rubocop/cop/correctors/parentheses_corrector.rb @@ -0,0 +1,28 @@ +# frozen_string_literal: true + +module RuboCop + module Cop + # This auto-corrects parentheses + class ParenthesesCorrector + class << self + def correct(corrector, node) + corrector.remove(node.loc.begin) + corrector.remove(node.loc.end) + return unless ternary_condition?(node) && next_char_is_question_mark?(node) + + corrector.insert_after(node.loc.end, ' ') + end + + private + + def ternary_condition?(node) + node.parent&.if_type? && node.parent&.ternary? + end + + def next_char_is_question_mark?(node) + node.loc.last_column == node.parent.loc.question.column + end + end + end + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/rubocop-1.28.2/lib/rubocop/cop/correctors/percent_literal_corrector.rb b/vendor/bundle/ruby/3.1.0/gems/rubocop-1.28.2/lib/rubocop/cop/correctors/percent_literal_corrector.rb new file mode 100644 index 000000000..e90b89b95 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/rubocop-1.28.2/lib/rubocop/cop/correctors/percent_literal_corrector.rb @@ -0,0 +1,106 @@ +# frozen_string_literal: true + +module RuboCop + module Cop + # This auto-corrects percent literals + class PercentLiteralCorrector + include Util + + attr_reader :config, :preferred_delimiters + + def initialize(config, preferred_delimiters) + @config = config + @preferred_delimiters = preferred_delimiters + end + + def correct(corrector, node, char) + escape = escape_words?(node) + char = char.upcase if escape + delimiters = delimiters_for("%#{char}") + contents = new_contents(node, escape, delimiters) + wrap_contents(corrector, node, contents, char, delimiters) + end + + private + + def wrap_contents(corrector, node, contents, char, delimiters) + corrector.replace(node, "%#{char}#{delimiters[0]}#{contents}#{delimiters[1]}") + end + + def escape_words?(node) + node.children.any? { |w| needs_escaping?(w.children[0]) } + end + + def delimiters_for(type) + PreferredDelimiters.new(type, config, preferred_delimiters).delimiters + end + + def new_contents(node, escape, delimiters) + if node.multiline? + autocorrect_multiline_words(node, escape, delimiters) + else + autocorrect_words(node, escape, delimiters) + end + end + + def autocorrect_multiline_words(node, escape, delimiters) + contents = process_multiline_words(node, escape, delimiters) + contents << end_content(node.source) + contents.join + end + + def autocorrect_words(node, escape, delimiters) + node.children.map do |word_node| + fix_escaped_content(word_node, escape, delimiters) + end.join(' ') + end + + def process_multiline_words(node, escape, delimiters) + base_line_num = node.first_line + prev_line_num = base_line_num + node.children.map.with_index do |word_node, index| + line_breaks = line_breaks(word_node, node.source, prev_line_num, base_line_num, index) + prev_line_num = word_node.last_line + content = fix_escaped_content(word_node, escape, delimiters) + line_breaks + content + end + end + + def line_breaks(node, source, previous_line_num, base_line_num, node_indx) + source_in_lines = source.split("\n") + if first_line?(node, previous_line_num) + node_indx.zero? && node.first_line == base_line_num ? '' : ' ' + else + process_lines(node, previous_line_num, base_line_num, source_in_lines) + end + end + + def first_line?(node, previous_line_num) + node.first_line == previous_line_num + end + + def process_lines(node, previous_line_num, base_line_num, source_in_lines) + begin_line_num = previous_line_num - base_line_num + 1 + end_line_num = node.first_line - base_line_num + 1 + lines = source_in_lines[begin_line_num...end_line_num] + "\n#{lines.join("\n").split(node.source).first || ''}" + end + + def fix_escaped_content(word_node, escape, delimiters) + content = +word_node.children.first.to_s + content = escape_string(content) if escape + substitute_escaped_delimiters(content, delimiters) + content + end + + def substitute_escaped_delimiters(content, delimiters) + delimiters.each { |delim| content.gsub!(delim, "\\#{delim}") } + end + + def end_content(source) + result = /\A(\s*)\]/.match(source.split("\n").last) + "\n#{result[1]}" if result + end + end + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/rubocop-1.28.2/lib/rubocop/cop/correctors/punctuation_corrector.rb b/vendor/bundle/ruby/3.1.0/gems/rubocop-1.28.2/lib/rubocop/cop/correctors/punctuation_corrector.rb new file mode 100644 index 000000000..2a4df3f61 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/rubocop-1.28.2/lib/rubocop/cop/correctors/punctuation_corrector.rb @@ -0,0 +1,27 @@ +# frozen_string_literal: true + +module RuboCop + module Cop + # This auto-corrects punctuation + class PunctuationCorrector + class << self + def remove_space(corrector, space_before) + corrector.remove(space_before) + end + + def add_space(corrector, token) + corrector.replace(token.pos, "#{token.pos.source} ") + end + + def swap_comma(corrector, range) + return unless range + + case range.source + when ',' then corrector.remove(range) + else corrector.insert_after(range, ',') + end + end + end + end + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/rubocop-1.28.2/lib/rubocop/cop/correctors/require_library_corrector.rb b/vendor/bundle/ruby/3.1.0/gems/rubocop-1.28.2/lib/rubocop/cop/correctors/require_library_corrector.rb new file mode 100644 index 000000000..8a8b7a836 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/rubocop-1.28.2/lib/rubocop/cop/correctors/require_library_corrector.rb @@ -0,0 +1,23 @@ +# frozen_string_literal: true + +module RuboCop + module Cop + # This class ensures a require statement is present for a standard library + # determined by the variable library_name + class RequireLibraryCorrector + extend RangeHelp + + class << self + def correct(corrector, node, library_name) + node = node.parent while node.parent? + node = node.children.first if node.begin_type? + corrector.insert_before(node, require_statement(library_name)) + end + + def require_statement(library_name) + "require '#{library_name}'\n" + end + end + end + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/rubocop-1.28.2/lib/rubocop/cop/correctors/space_corrector.rb b/vendor/bundle/ruby/3.1.0/gems/rubocop-1.28.2/lib/rubocop/cop/correctors/space_corrector.rb new file mode 100644 index 000000000..d0ceb55fc --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/rubocop-1.28.2/lib/rubocop/cop/correctors/space_corrector.rb @@ -0,0 +1,46 @@ +# frozen_string_literal: true + +module RuboCop + module Cop + # This auto-corrects whitespace + class SpaceCorrector + extend SurroundingSpace + + class << self + attr_reader :processed_source + + def empty_corrections(processed_source, corrector, empty_config, + left_token, right_token) + @processed_source = processed_source + range = range_between(left_token.end_pos, right_token.begin_pos) + if offending_empty_space?(empty_config, left_token, right_token) + corrector.remove(range) + corrector.insert_after(left_token.pos, ' ') + elsif offending_empty_no_space?(empty_config, left_token, right_token) + corrector.remove(range) + end + end + + def remove_space(processed_source, corrector, left_token, right_token) + @processed_source = processed_source + if left_token.space_after? + range = side_space_range(range: left_token.pos, side: :right) + corrector.remove(range) + end + return unless right_token.space_before? + + range = side_space_range(range: right_token.pos, side: :left) + corrector.remove(range) + end + + def add_space(processed_source, corrector, left_token, right_token) + @processed_source = processed_source + corrector.insert_after(left_token.pos, ' ') unless left_token.space_after? + return if right_token.space_before? + + corrector.insert_before(right_token.pos, ' ') + end + end + end + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/rubocop-1.28.2/lib/rubocop/cop/correctors/string_literal_corrector.rb b/vendor/bundle/ruby/3.1.0/gems/rubocop-1.28.2/lib/rubocop/cop/correctors/string_literal_corrector.rb new file mode 100644 index 000000000..8e4195038 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/rubocop-1.28.2/lib/rubocop/cop/correctors/string_literal_corrector.rb @@ -0,0 +1,23 @@ +# frozen_string_literal: true + +module RuboCop + module Cop + # This auto-corrects string literals + class StringLiteralCorrector + extend Util + + class << self + def correct(corrector, node, style) + return if node.dstr_type? + + str = node.str_content + if style == :single_quotes + corrector.replace(node, to_string_literal(str)) + else + corrector.replace(node, str.inspect) + end + end + end + end + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/rubocop-1.28.2/lib/rubocop/cop/correctors/unused_arg_corrector.rb b/vendor/bundle/ruby/3.1.0/gems/rubocop-1.28.2/lib/rubocop/cop/correctors/unused_arg_corrector.rb new file mode 100644 index 000000000..82a144f5b --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/rubocop-1.28.2/lib/rubocop/cop/correctors/unused_arg_corrector.rb @@ -0,0 +1,40 @@ +# frozen_string_literal: true + +module RuboCop + module Cop + # This auto-corrects unused arguments. + class UnusedArgCorrector + extend RangeHelp + + class << self + attr_reader :processed_source + + def correct(corrector, processed_source, node) + return if %i[kwarg kwoptarg].include?(node.type) + + @processed_source = processed_source + + if node.blockarg_type? + correct_for_blockarg_type(corrector, node) + else + variable_name = if node.optarg_type? + node.node_parts[0] + else + # Extract only a var name without splat (`*`) + node.source.gsub(/\A\*+/, '') + end + + corrector.replace(node.loc.name, "_#{variable_name}") + end + end + + def correct_for_blockarg_type(corrector, node) + range = range_with_surrounding_space(range: node.source_range, side: :left) + range = range_with_surrounding_comma(range, :left) + + corrector.remove(range) + end + end + end + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/rubocop-1.28.2/lib/rubocop/cop/documentation.rb b/vendor/bundle/ruby/3.1.0/gems/rubocop-1.28.2/lib/rubocop/cop/documentation.rb new file mode 100644 index 000000000..711b489f3 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/rubocop-1.28.2/lib/rubocop/cop/documentation.rb @@ -0,0 +1,39 @@ +# frozen_string_literal: true + +module RuboCop + module Cop + # Helpers for builtin documentation + module Documentation + module_function + + # @api private + def department_to_basename(department) + "cops_#{department.to_s.downcase.tr('/', '_')}" + end + + # @api private + def url_for(cop_class, config = nil) + base = department_to_basename(cop_class.department) + fragment = cop_class.cop_name.downcase.gsub(/[^a-z]/, '') + base_url = base_url_for(cop_class, config) + + "#{base_url}/#{base}.html##{fragment}" + end + + # @api private + def base_url_for(cop_class, config) + return default_base_url unless config + + department_name = cop_class.department.to_s + + config.for_department(department_name)['DocumentationBaseURL'] || + config.for_all_cops['DocumentationBaseURL'] + end + + # @api private + def default_base_url + 'https://docs.rubocop.org/rubocop' + end + end + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/rubocop-1.28.2/lib/rubocop/cop/exclude_limit.rb b/vendor/bundle/ruby/3.1.0/gems/rubocop-1.28.2/lib/rubocop/cop/exclude_limit.rb new file mode 100644 index 000000000..6d2ff8ae3 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/rubocop-1.28.2/lib/rubocop/cop/exclude_limit.rb @@ -0,0 +1,26 @@ +# frozen_string_literal: true + +module RuboCop + # Allows specified configuration options to have an exclude limit + # ie. a maximum value tracked that it can be used by `--auto-gen-config`. + module ExcludeLimit + # Sets up a configuration option to have an exclude limit tracked. + # The parameter name given is transformed into a method name (eg. `Max` + # becomes `self.max=` and `MinDigits` becomes `self.min_digits=`). + def exclude_limit(parameter_name, method_name: transform(parameter_name)) + define_method("#{method_name}=") do |value| + cfg = config_to_allow_offenses + cfg[:exclude_limit] ||= {} + current_max = cfg[:exclude_limit][parameter_name] + value = [current_max, value].max if current_max + cfg[:exclude_limit][parameter_name] = value + end + end + + private + + def transform(parameter_name) + parameter_name.gsub(/(? 1.10') + # spec.add_runtime_dependency('parser', '>= 2.3.3.1', '< 3.0') + # end + class DuplicatedAssignment < Base + include RangeHelp + include GemspecHelp + + MSG = '`%s` method calls already given on line '\ + '%d of the gemspec.' + + # @!method assignment_method_declarations(node) + def_node_search :assignment_method_declarations, <<~PATTERN + (send + (lvar #match_block_variable_name?) #assignment_method? ...) + PATTERN + + def on_new_investigation + return if processed_source.blank? + + duplicated_assignment_method_nodes.each do |nodes| + nodes[1..-1].each do |node| + register_offense(node, node.method_name, nodes.first.first_line) + end + end + end + + private + + def match_block_variable_name?(receiver_name) + gem_specification(processed_source.ast) do |block_variable_name| + return block_variable_name == receiver_name + end + end + + def assignment_method?(method_name) + method_name.to_s.end_with?('=') + end + + def duplicated_assignment_method_nodes + assignment_method_declarations(processed_source.ast) + .group_by(&:method_name) + .values + .select { |nodes| nodes.size > 1 } + end + + def register_offense(node, assignment, line_of_first_occurrence) + line_range = node.loc.column...node.loc.last_column + offense_location = source_range(processed_source.buffer, node.first_line, line_range) + message = format( + MSG, + assignment: assignment, + line_of_first_occurrence: line_of_first_occurrence + ) + add_offense(offense_location, message: message) + end + end + end + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/rubocop-1.28.2/lib/rubocop/cop/gemspec/ordered_dependencies.rb b/vendor/bundle/ruby/3.1.0/gems/rubocop-1.28.2/lib/rubocop/cop/gemspec/ordered_dependencies.rb new file mode 100644 index 000000000..f2105827b --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/rubocop-1.28.2/lib/rubocop/cop/gemspec/ordered_dependencies.rb @@ -0,0 +1,93 @@ +# frozen_string_literal: true + +module RuboCop + module Cop + module Gemspec + # Dependencies in the gemspec should be alphabetically sorted. + # + # @example + # # bad + # spec.add_dependency 'rubocop' + # spec.add_dependency 'rspec' + # + # # good + # spec.add_dependency 'rspec' + # spec.add_dependency 'rubocop' + # + # # good + # spec.add_dependency 'rubocop' + # + # spec.add_dependency 'rspec' + # + # # bad + # spec.add_development_dependency 'rubocop' + # spec.add_development_dependency 'rspec' + # + # # good + # spec.add_development_dependency 'rspec' + # spec.add_development_dependency 'rubocop' + # + # # good + # spec.add_development_dependency 'rubocop' + # + # spec.add_development_dependency 'rspec' + # + # # bad + # spec.add_runtime_dependency 'rubocop' + # spec.add_runtime_dependency 'rspec' + # + # # good + # spec.add_runtime_dependency 'rspec' + # spec.add_runtime_dependency 'rubocop' + # + # # good + # spec.add_runtime_dependency 'rubocop' + # + # spec.add_runtime_dependency 'rspec' + # + # # good only if TreatCommentsAsGroupSeparators is true + # # For code quality + # spec.add_dependency 'rubocop' + # # For tests + # spec.add_dependency 'rspec' + class OrderedDependencies < Base + extend AutoCorrector + include OrderedGemNode + + MSG = 'Dependencies should be sorted in an alphabetical order within ' \ + 'their section of the gemspec. '\ + 'Dependency `%s` should appear before `%s`.' + + def on_new_investigation + return if processed_source.blank? + + dependency_declarations(processed_source.ast) + .each_cons(2) do |previous, current| + next unless consecutive_lines(previous, current) + next unless case_insensitive_out_of_order?(gem_name(current), gem_name(previous)) + next unless get_dependency_name(previous) == get_dependency_name(current) + + register_offense(previous, current) + end + end + + private + + def previous_declaration(node) + declarations = dependency_declarations(processed_source.ast) + node_index = declarations.find_index(node) + declarations.to_a[node_index - 1] + end + + def get_dependency_name(node) + node.method_name + end + + # @!method dependency_declarations(node) + def_node_search :dependency_declarations, <<~PATTERN + (send (lvar _) {:add_dependency :add_runtime_dependency :add_development_dependency} (str _) ...) + PATTERN + end + end + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/rubocop-1.28.2/lib/rubocop/cop/gemspec/require_mfa.rb b/vendor/bundle/ruby/3.1.0/gems/rubocop-1.28.2/lib/rubocop/cop/gemspec/require_mfa.rb new file mode 100644 index 000000000..798c4d6dc --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/rubocop-1.28.2/lib/rubocop/cop/gemspec/require_mfa.rb @@ -0,0 +1,145 @@ +# frozen_string_literal: true + +module RuboCop + module Cop + module Gemspec + # Requires a gemspec to have `rubygems_mfa_required` metadata set. + # + # This setting tells RubyGems that MFA (Multi-Factor Authentication) is + # required for accounts to be able perform privileged operations, such as + # (see RubyGems' documentation for the full list of privileged + # operations): + # + # * `gem push` + # * `gem yank` + # * `gem owner --add/remove` + # * adding or removing owners using gem ownership page + # + # This helps make your gem more secure, as users can be more + # confident that gem updates were pushed by maintainers. + # + # @example + # # bad + # Gem::Specification.new do |spec| + # # no `rubygems_mfa_required` metadata specified + # end + # + # # good + # Gem::Specification.new do |spec| + # spec.metadata = { + # 'rubygems_mfa_required' => 'true' + # } + # end + # + # # good + # Gem::Specification.new do |spec| + # spec.metadata['rubygems_mfa_required'] = 'true' + # end + # + # # bad + # Gem::Specification.new do |spec| + # spec.metadata = { + # 'rubygems_mfa_required' => 'false' + # } + # end + # + # # good + # Gem::Specification.new do |spec| + # spec.metadata = { + # 'rubygems_mfa_required' => 'true' + # } + # end + # + # # bad + # Gem::Specification.new do |spec| + # spec.metadata['rubygems_mfa_required'] = 'false' + # end + # + # # good + # Gem::Specification.new do |spec| + # spec.metadata['rubygems_mfa_required'] = 'true' + # end + # + class RequireMFA < Base + include GemspecHelp + extend AutoCorrector + + MSG = "`metadata['rubygems_mfa_required']` must be set to `'true'`." + + # @!method metadata(node) + def_node_matcher :metadata, <<~PATTERN + `{ + (send _ :metadata= $_) + (send (send _ :metadata) :[]= (str "rubygems_mfa_required") $_) + } + PATTERN + + # @!method rubygems_mfa_required(node) + def_node_search :rubygems_mfa_required, <<~PATTERN + (pair (str "rubygems_mfa_required") $_) + PATTERN + + # @!method true_string?(node) + def_node_matcher :true_string?, <<~PATTERN + (str "true") + PATTERN + + def on_block(node) # rubocop:disable Metrics/MethodLength + gem_specification(node) do |block_var| + metadata_value = metadata(node) + mfa_value = mfa_value(metadata_value) + + if mfa_value + unless true_string?(mfa_value) + add_offense(mfa_value) do |corrector| + change_value(corrector, mfa_value) + end + end + else + add_offense(node) do |corrector| + autocorrect(corrector, node, block_var, metadata_value) + end + end + end + end + + private + + def mfa_value(metadata_value) + return unless metadata_value + return metadata_value if metadata_value.str_type? + + rubygems_mfa_required(metadata_value).first + end + + def autocorrect(corrector, node, block_var, metadata) + if metadata + return unless metadata.hash_type? + + correct_metadata(corrector, metadata) + else + insert_mfa_required(corrector, node, block_var) + end + end + + def correct_metadata(corrector, metadata) + if metadata.pairs.any? + corrector.insert_after(metadata.pairs.last, ",\n'rubygems_mfa_required' => 'true'") + else + corrector.insert_before(metadata.loc.end, "'rubygems_mfa_required' => 'true'") + end + end + + def insert_mfa_required(corrector, node, block_var) + corrector.insert_before(node.loc.end, <<~RUBY) + #{block_var}.metadata['rubygems_mfa_required'] = 'true' + RUBY + end + + def change_value(corrector, value) + corrector.replace(value, "'true'") + end + end + end + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/rubocop-1.28.2/lib/rubocop/cop/gemspec/required_ruby_version.rb b/vendor/bundle/ruby/3.1.0/gems/rubocop-1.28.2/lib/rubocop/cop/gemspec/required_ruby_version.rb new file mode 100644 index 000000000..4366269d8 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/rubocop-1.28.2/lib/rubocop/cop/gemspec/required_ruby_version.rb @@ -0,0 +1,127 @@ +# frozen_string_literal: true + +module RuboCop + module Cop + module Gemspec + # Checks that `required_ruby_version` in a gemspec file is set to a valid + # value (non-blank) and matches `TargetRubyVersion` as set in RuboCop's + # configuration for the gem. + # + # This ensures that RuboCop is using the same Ruby version as the gem. + # + # @example + # # When `TargetRubyVersion` of .rubocop.yml is `2.5`. + # + # # bad + # Gem::Specification.new do |spec| + # # no `required_ruby_version` specified + # end + # + # # bad + # Gem::Specification.new do |spec| + # spec.required_ruby_version = '>= 2.4.0' + # end + # + # # bad + # Gem::Specification.new do |spec| + # spec.required_ruby_version = '>= 2.6.0' + # end + # + # # bad + # Gem::Specification.new do |spec| + # spec.required_ruby_version = '' + # end + # + # # good + # Gem::Specification.new do |spec| + # spec.required_ruby_version = '>= 2.5.0' + # end + # + # # good + # Gem::Specification.new do |spec| + # spec.required_ruby_version = '>= 2.5' + # end + # + # # accepted but not recommended + # Gem::Specification.new do |spec| + # spec.required_ruby_version = ['>= 2.5.0', '< 2.7.0'] + # end + # + # # accepted but not recommended, since + # # Ruby does not really follow semantic versioning + # Gem::Specification.new do |spec| + # spec.required_ruby_version = '~> 2.5' + # end + class RequiredRubyVersion < Base + include RangeHelp + + RESTRICT_ON_SEND = %i[required_ruby_version=].freeze + NOT_EQUAL_MSG = '`required_ruby_version` and `TargetRubyVersion` ' \ + '(%s, which may be specified in ' \ + '.rubocop.yml) should be equal.' + MISSING_MSG = '`required_ruby_version` should be specified.' + + # @!method required_ruby_version?(node) + def_node_search :required_ruby_version?, <<~PATTERN + (send _ :required_ruby_version= _) + PATTERN + + # @!method defined_ruby_version(node) + def_node_matcher :defined_ruby_version, <<~PATTERN + { + $(str _) + $(array (str _) (str _)) + (send (const (const nil? :Gem) :Requirement) :new $str+) + } + PATTERN + + def on_new_investigation + add_global_offense(MISSING_MSG) unless required_ruby_version?(processed_source.ast) + end + + def on_send(node) + version_def = node.first_argument + return if dynamic_version?(version_def) + + ruby_version = extract_ruby_version(defined_ruby_version(version_def)) + return if ruby_version == target_ruby_version.to_s + + add_offense(version_def, message: not_equal_message(ruby_version, target_ruby_version)) + end + + private + + def dynamic_version?(node) + (node.send_type? && !node.receiver) || + node.variable? || + node.each_descendant(:send, *RuboCop::AST::Node::VARIABLES).any? + end + + def extract_ruby_version(required_ruby_version) + return unless required_ruby_version + + if required_ruby_version.is_a?(Array) + required_ruby_version = required_ruby_version.detect do |v| + /[>=]/.match?(v.str_content) + end + elsif required_ruby_version.array_type? + required_ruby_version = required_ruby_version.children.detect do |v| + /[>=]/.match?(v.str_content) + end + end + + required_ruby_version.str_content.scan(/\d/).first(2).join('.') + end + + def not_equal_message(required_ruby_version, target_ruby_version) + format( + NOT_EQUAL_MSG, + required_ruby_version: required_ruby_version, + gemspec_filename: File.basename(processed_source.file_path), + target_ruby_version: target_ruby_version + ) + end + end + end + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/rubocop-1.28.2/lib/rubocop/cop/gemspec/ruby_version_globals_usage.rb b/vendor/bundle/ruby/3.1.0/gems/rubocop-1.28.2/lib/rubocop/cop/gemspec/ruby_version_globals_usage.rb new file mode 100644 index 000000000..73ccb290d --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/rubocop-1.28.2/lib/rubocop/cop/gemspec/ruby_version_globals_usage.rb @@ -0,0 +1,50 @@ +# frozen_string_literal: true + +module RuboCop + module Cop + module Gemspec + # Checks that `RUBY_VERSION` constant is not used in gemspec. + # Using `RUBY_VERSION` is dangerous because value of the + # constant is determined by `rake release`. + # It's possible to have dependency based on ruby version used + # to execute `rake release` and not user's ruby version. + # + # @example + # + # # bad + # Gem::Specification.new do |spec| + # if RUBY_VERSION >= '2.5' + # spec.add_runtime_dependency 'gem_a' + # else + # spec.add_runtime_dependency 'gem_b' + # end + # end + # + # # good + # Gem::Specification.new do |spec| + # spec.add_runtime_dependency 'gem_a' + # end + # + class RubyVersionGlobalsUsage < Base + include GemspecHelp + + MSG = 'Do not use `RUBY_VERSION` in gemspec file.' + + # @!method ruby_version?(node) + def_node_matcher :ruby_version?, '(const {cbase nil?} :RUBY_VERSION)' + + def on_const(node) + return unless gem_spec_with_ruby_version?(node) + + add_offense(node) + end + + private + + def gem_spec_with_ruby_version?(node) + gem_specification(processed_source.ast) && ruby_version?(node) + end + end + end + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/rubocop-1.28.2/lib/rubocop/cop/generator.rb b/vendor/bundle/ruby/3.1.0/gems/rubocop-1.28.2/lib/rubocop/cop/generator.rb new file mode 100644 index 000000000..01dab8759 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/rubocop-1.28.2/lib/rubocop/cop/generator.rb @@ -0,0 +1,214 @@ +# frozen_string_literal: true + +module RuboCop + module Cop + # Source and spec generator for new cops + # + # This generator will take a cop name and generate a source file + # and spec file when given a valid qualified cop name. + # @api private + class Generator + SOURCE_TEMPLATE = <<~RUBY + # frozen_string_literal: true + + module RuboCop + module Cop + module %s + # TODO: Write cop description and example of bad / good code. For every + # `SupportedStyle` and unique configuration, there needs to be examples. + # Examples must have valid Ruby syntax. Do not use upticks. + # + # @safety + # Delete this section if the cop is not unsafe (`Safe: false` or + # `SafeAutoCorrect: false`), or use it to explain how the cop is + # unsafe. + # + # @example EnforcedStyle: bar (default) + # # Description of the `bar` style. + # + # # bad + # bad_bar_method + # + # # bad + # bad_bar_method(args) + # + # # good + # good_bar_method + # + # # good + # good_bar_method(args) + # + # @example EnforcedStyle: foo + # # Description of the `foo` style. + # + # # bad + # bad_foo_method + # + # # bad + # bad_foo_method(args) + # + # # good + # good_foo_method + # + # # good + # good_foo_method(args) + # + class %s < Base + # TODO: Implement the cop in here. + # + # In many cases, you can use a node matcher for matching node pattern. + # See https://github.com/rubocop/rubocop-ast/blob/master/lib/rubocop/ast/node_pattern.rb + # + # For example + MSG = 'Use `#good_method` instead of `#bad_method`.' + + # @!method bad_method?(node) + def_node_matcher :bad_method?, <<~PATTERN + (send nil? :bad_method ...) + PATTERN + + def on_send(node) + return unless bad_method?(node) + + add_offense(node) + end + end + end + end + end + RUBY + + SPEC_TEMPLATE = <<~SPEC + # frozen_string_literal: true + + RSpec.describe RuboCop::Cop::%s::%s, :config do + let(:config) { RuboCop::Config.new } + + # TODO: Write test code + # + # For example + it 'registers an offense when using `#bad_method`' do + expect_offense(<<~RUBY) + bad_method + ^^^^^^^^^^ Use `#good_method` instead of `#bad_method`. + RUBY + end + + it 'does not register an offense when using `#good_method`' do + expect_no_offenses(<<~RUBY) + good_method + RUBY + end + end + SPEC + + CONFIGURATION_ADDED_MESSAGE = + '[modify] A configuration for the cop is added into ' \ + '%s.' + + def initialize(name, output: $stdout) + @badge = Badge.parse(name) + @output = output + return if badge.qualified? + + raise ArgumentError, 'Specify a cop name with Department/Name style' + end + + def write_source + write_unless_file_exists(source_path, generated_source) + end + + def write_spec + write_unless_file_exists(spec_path, generated_spec) + end + + def inject_require(root_file_path: 'lib/rubocop.rb') + RequireFileInjector.new(source_path: source_path, root_file_path: root_file_path).inject + end + + def inject_config(config_file_path: 'config/default.yml', + version_added: '<>') + injector = + ConfigurationInjector.new(configuration_file_path: config_file_path, + badge: badge, + version_added: version_added) + + injector.inject do # rubocop:disable Lint/UnexpectedBlockArity + output.puts(format(CONFIGURATION_ADDED_MESSAGE, + configuration_file_path: config_file_path)) + end + end + + def todo + <<~TODO + Do 4 steps: + 1. Modify the description of #{badge} in config/default.yml + 2. Implement your new cop in the generated file! + 3. Commit your new cop with a message such as + e.g. "Add new `#{badge}` cop" + 4. Run `bundle exec rake changelog:new` to generate a changelog entry + for your new cop. + TODO + end + + private + + attr_reader :badge, :output + + def write_unless_file_exists(path, contents) + if File.exist?(path) + warn "rake new_cop: #{path} already exists!" + exit! + end + + dir = File.dirname(path) + FileUtils.mkdir_p(dir) unless File.exist?(dir) + + File.write(path, contents) + output.puts "[create] #{path}" + end + + def generated_source + generate(SOURCE_TEMPLATE) + end + + def generated_spec + generate(SPEC_TEMPLATE) + end + + def generate(template) + format(template, department: badge.department.to_s.gsub('/', '::'), + cop_name: badge.cop_name) + end + + def spec_path + File.join( + 'spec', + 'rubocop', + 'cop', + snake_case(badge.department.to_s), + "#{snake_case(badge.cop_name.to_s)}_spec.rb" + ) + end + + def source_path + File.join( + 'lib', + 'rubocop', + 'cop', + snake_case(badge.department.to_s), + "#{snake_case(badge.cop_name.to_s)}.rb" + ) + end + + def snake_case(camel_case_string) + return 'rspec' if camel_case_string == 'RSpec' + + camel_case_string + .gsub(%r{([^A-Z/])([A-Z]+)}, '\1_\2') + .gsub(%r{([A-Z])([A-Z][^A-Z\d/]+)}, '\1_\2') + .downcase + end + end + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/rubocop-1.28.2/lib/rubocop/cop/generator/configuration_injector.rb b/vendor/bundle/ruby/3.1.0/gems/rubocop-1.28.2/lib/rubocop/cop/generator/configuration_injector.rb new file mode 100644 index 000000000..882fcb333 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/rubocop-1.28.2/lib/rubocop/cop/generator/configuration_injector.rb @@ -0,0 +1,65 @@ +# frozen_string_literal: true + +module RuboCop + module Cop + class Generator + # A class that injects a require directive into the root RuboCop file. + # It looks for other directives that require files in the same (cop) + # namespace and injects the provided one in alpha + class ConfigurationInjector + TEMPLATE = <<~YAML + %s: + Description: 'TODO: Write a description of the cop.' + Enabled: pending + VersionAdded: '%s' + YAML + + def initialize(configuration_file_path:, badge:, version_added: '<>') + @configuration_file_path = configuration_file_path + @badge = badge + @version_added = version_added + @output = output + end + + def inject + target_line = find_target_line + if target_line + configuration_entries.insert(target_line, "#{new_configuration_entry}\n") + else + configuration_entries.push("\n#{new_configuration_entry}") + end + + File.write(configuration_file_path, configuration_entries.join) + + yield if block_given? + end + + private + + attr_reader :configuration_file_path, :badge, :version_added, :output + + def configuration_entries + @configuration_entries ||= File.readlines(configuration_file_path) + end + + def new_configuration_entry + format(TEMPLATE, badge: badge, version_added: version_added) + end + + def find_target_line + configuration_entries.find.with_index do |line, index| + next unless cop_name_line?(line) + + return index if badge.to_s < line + end + + nil + end + + def cop_name_line?(yaml) + !/^[\s#]/.match?(yaml) + end + end + end + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/rubocop-1.28.2/lib/rubocop/cop/generator/require_file_injector.rb b/vendor/bundle/ruby/3.1.0/gems/rubocop-1.28.2/lib/rubocop/cop/generator/require_file_injector.rb new file mode 100644 index 000000000..385ba12bd --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/rubocop-1.28.2/lib/rubocop/cop/generator/require_file_injector.rb @@ -0,0 +1,75 @@ +# frozen_string_literal: true + +module RuboCop + module Cop + class Generator + # A class that injects a require directive into the root RuboCop file. + # It looks for other directives that require files in the same (cop) + # namespace and injects the provided one in alpha + class RequireFileInjector + REQUIRE_PATH = /require_relative ['"](.+)['"]/.freeze + + def initialize(source_path:, root_file_path:, output: $stdout) + @source_path = Pathname(source_path) + @root_file_path = Pathname(root_file_path) + @require_entries = File.readlines(root_file_path) + @output = output + end + + def inject + return if require_exists? || !target_line + + File.write(root_file_path, updated_directives) + require = injectable_require_directive.chomp + output.puts "[modify] #{root_file_path} - `#{require}` was injected." + end + + private + + attr_reader :require_entries, :root_file_path, :source_path, :output + + def require_exists? + require_entries.any?(injectable_require_directive) + end + + def updated_directives + require_entries.insert(target_line, injectable_require_directive).join + end + + def target_line + @target_line ||= begin + in_the_same_department = false + inject_parts = require_path_fragments(injectable_require_directive) + + require_entries.find.with_index do |entry, index| + current_entry_parts = require_path_fragments(entry) + + if inject_parts[0..-2] == current_entry_parts[0..-2] + in_the_same_department = true + + break index if inject_parts.last < current_entry_parts.last + elsif in_the_same_department + break index + end + end || require_entries.size + end + end + + def require_path_fragments(require_directove) + path = require_directove.match(REQUIRE_PATH) + + path ? path.captures.first.split('/') : [] + end + + def injectable_require_directive + "require_relative '#{require_path}'\n" + end + + def require_path + path = source_path.relative_path_from(root_file_path.dirname) + path.to_s.sub('.rb', '') + end + end + end + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/rubocop-1.28.2/lib/rubocop/cop/ignored_node.rb b/vendor/bundle/ruby/3.1.0/gems/rubocop-1.28.2/lib/rubocop/cop/ignored_node.rb new file mode 100644 index 000000000..6be9265df --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/rubocop-1.28.2/lib/rubocop/cop/ignored_node.rb @@ -0,0 +1,36 @@ +# frozen_string_literal: true + +module RuboCop + module Cop + # Handles adding and checking ignored nodes. + module IgnoredNode + def ignore_node(node) + ignored_nodes << node + end + + def part_of_ignored_node?(node) + ignored_nodes.map(&:loc).any? do |ignored_loc| + next false if ignored_loc.expression.begin_pos > node.source_range.begin_pos + + ignored_end_pos = if ignored_loc.respond_to?(:heredoc_body) + ignored_loc.heredoc_end.end_pos + else + ignored_loc.expression.end_pos + end + ignored_end_pos >= node.source_range.end_pos + end + end + + def ignored_node?(node) + # Same object found in array? + ignored_nodes.any? { |n| n.equal?(node) } + end + + private + + def ignored_nodes + @ignored_nodes ||= [] + end + end + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/rubocop-1.28.2/lib/rubocop/cop/internal_affairs.rb b/vendor/bundle/ruby/3.1.0/gems/rubocop-1.28.2/lib/rubocop/cop/internal_affairs.rb new file mode 100644 index 000000000..abf885526 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/rubocop-1.28.2/lib/rubocop/cop/internal_affairs.rb @@ -0,0 +1,20 @@ +# frozen_string_literal: true + +require_relative 'internal_affairs/empty_line_between_expect_offense_and_correction' +require_relative 'internal_affairs/example_description' +require_relative 'internal_affairs/inherit_deprecated_cop_class' +require_relative 'internal_affairs/location_line_equality_comparison' +require_relative 'internal_affairs/method_name_equal' +require_relative 'internal_affairs/node_destructuring' +require_relative 'internal_affairs/node_matcher_directive' +require_relative 'internal_affairs/node_type_predicate' +require_relative 'internal_affairs/offense_location_keyword' +require_relative 'internal_affairs/redundant_context_config_parameter' +require_relative 'internal_affairs/redundant_described_class_as_subject' +require_relative 'internal_affairs/redundant_let_rubocop_config_new' +require_relative 'internal_affairs/redundant_location_argument' +require_relative 'internal_affairs/redundant_message_argument' +require_relative 'internal_affairs/redundant_method_dispatch_node' +require_relative 'internal_affairs/style_detected_api_use' +require_relative 'internal_affairs/undefined_config' +require_relative 'internal_affairs/useless_message_assertion' diff --git a/vendor/bundle/ruby/3.1.0/gems/rubocop-1.28.2/lib/rubocop/cop/internal_affairs/empty_line_between_expect_offense_and_correction.rb b/vendor/bundle/ruby/3.1.0/gems/rubocop-1.28.2/lib/rubocop/cop/internal_affairs/empty_line_between_expect_offense_and_correction.rb new file mode 100644 index 000000000..52b659c41 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/rubocop-1.28.2/lib/rubocop/cop/internal_affairs/empty_line_between_expect_offense_and_correction.rb @@ -0,0 +1,68 @@ +# frozen_string_literal: true + +module RuboCop + module Cop + module InternalAffairs + # This cop checks whether `expect_offense` and correction expectation methods + # (i.e. `expect_correction` and `expect_no_corrections`) are separated by empty line. + # + # @example + # # bad + # it 'registers and corrects an offense' do + # expect_offense(<<~RUBY) + # bad_method + # ^^^^^^^^^^ Use `good_method`. + # RUBY + # expect_correction(<<~RUBY) + # good_method + # RUBY + # end + # + # # good + # it 'registers and corrects an offense' do + # expect_offense(<<~RUBY) + # bad_method + # ^^^^^^^^^^ Use `good_method`. + # RUBY + # + # expect_correction(<<~RUBY) + # good_method + # RUBY + # end + # + class EmptyLineBetweenExpectOffenseAndCorrection < Base + extend AutoCorrector + + MSG = 'Add empty line between `expect_offense` and `%s`.' + RESTRICT_ON_SEND = %i[expect_offense].freeze + CORRECTION_EXPECTATION_METHODS = %i[expect_correction expect_no_corrections].freeze + + def on_send(node) + return unless (next_sibling = node.right_sibling) && next_sibling.send_type? + + method_name = next_sibling.method_name + return unless CORRECTION_EXPECTATION_METHODS.include?(method_name) + + range = offense_range(node) + return unless range.last_line + 1 == next_sibling.loc.line + + add_offense(range, message: format(MSG, expect_correction: method_name)) do |corrector| + corrector.insert_after(range, "\n") + end + end + + private + + def offense_range(node) + first_argument = node.first_argument + + if first_argument.respond_to?(:heredoc?) && first_argument.heredoc? + first_argument.loc.heredoc_end + else + node + end + end + end + end + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/rubocop-1.28.2/lib/rubocop/cop/internal_affairs/example_description.rb b/vendor/bundle/ruby/3.1.0/gems/rubocop-1.28.2/lib/rubocop/cop/internal_affairs/example_description.rb new file mode 100644 index 000000000..2de112afb --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/rubocop-1.28.2/lib/rubocop/cop/internal_affairs/example_description.rb @@ -0,0 +1,92 @@ +# frozen_string_literal: true + +module RuboCop + module Cop + module InternalAffairs + # Checks that RSpec examples that use `expects_offense` + # or `expects_no_offenses` do not have conflicting + # descriptions. + # + # @example + # # bad + # it 'does not register an offense' do + # expect_offense('...') + # end + # + # it 'registers an offense' do + # expect_no_offenses('...') + # end + # + # # good + # it 'registers an offense' do + # expect_offense('...') + # end + # + # it 'does not register an offense' do + # expect_no_offenses('...') + # end + class ExampleDescription < Base + class << self + attr_accessor :descriptions + end + + MSG = 'Description does not match use of `%s`.' + + RESTRICT_ON_SEND = %i[ + expect_offense + expect_no_offenses + expect_correction + expect_no_corrections + ].to_set.freeze + + EXPECT_NO_OFFENSES_INCORRECT_DESCRIPTIONS = [ + /^(adds|registers|reports|finds) (an? )?offense/, + /^(flags|handles|works)\b/ + ].freeze + + EXPECT_OFFENSE_INCORRECT_DESCRIPTIONS = [ + /^(does not|doesn't) (register|find|flag|report)/, + /^(does not|doesn't) add (a|an|any )?offense/ + ].freeze + + EXPECT_NO_CORRECTIONS_INCORRECT_DESCRIPTIONS = [/^(auto[- ]?)?correct/].freeze + + EXPECT_CORRECTION_INCORRECT_DESCRIPTIONS = [ + /\b(does not|doesn't) (auto[- ]?)?correct/ + ].freeze + + # @!method offense_example?(node) + def_node_matcher :offense_example?, <<~PATTERN + (block + (send _ {:it :specify} $_description) + _args + `(send nil? %RESTRICT_ON_SEND ...) + ) + PATTERN + + def on_send(node) + parent = node.each_ancestor(:block).first + return unless parent && (description = offense_example?(parent)) + + method_name = node.method_name + message = format(MSG, method_name: method_name) + + regexp_group = self.class.const_get("#{method_name}_incorrect_descriptions".upcase) + check_description(description, regexp_group, message) + end + + private + + def check_description(description, regexps, message) + return unless regexps.any? { |regexp| regexp.match?(string_contents(description)) } + + add_offense(description, message: message) + end + + def string_contents(node) + node.str_type? ? node.value : node.source + end + end + end + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/rubocop-1.28.2/lib/rubocop/cop/internal_affairs/inherit_deprecated_cop_class.rb b/vendor/bundle/ruby/3.1.0/gems/rubocop-1.28.2/lib/rubocop/cop/internal_affairs/inherit_deprecated_cop_class.rb new file mode 100644 index 000000000..a11e33b3d --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/rubocop-1.28.2/lib/rubocop/cop/internal_affairs/inherit_deprecated_cop_class.rb @@ -0,0 +1,34 @@ +# frozen_string_literal: true + +module RuboCop + module Cop + module InternalAffairs + # `RuboCop::Cop::Cop` is deprecated and will be removed in Rubocop 2.0. + # Your custom cop class should inherit from `RuboCop::Cop::Base` instead of + # `RuboCop::Cop::Cop`. + # + # See "v1 Upgrade Notes" for more details: + # https://docs.rubocop.org/rubocop/v1_upgrade_notes.html + # + # @example + # # bad + # class Foo < Cop + # end + # + # # good + # class Foo < Base + # end + # + class InheritDeprecatedCopClass < Base + MSG = 'Use `Base` instead of `Cop`.' + + def on_class(node) + return unless (parent_class = node.parent_class) + return unless parent_class.children.last == :Cop + + add_offense(parent_class) + end + end + end + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/rubocop-1.28.2/lib/rubocop/cop/internal_affairs/location_line_equality_comparison.rb b/vendor/bundle/ruby/3.1.0/gems/rubocop-1.28.2/lib/rubocop/cop/internal_affairs/location_line_equality_comparison.rb new file mode 100644 index 000000000..15b80331a --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/rubocop-1.28.2/lib/rubocop/cop/internal_affairs/location_line_equality_comparison.rb @@ -0,0 +1,60 @@ +# frozen_string_literal: true + +module RuboCop + module Cop + module InternalAffairs + # This cop enforces the use of `same_line?` instead of location line comparison for equality. + # + # @example + # # bad + # node.loc.line == node.parent.loc.line + # + # # bad + # node.loc.first_line == node.parent.loc.first_line + # + # # good + # same_line?(node, node.parent) + # + class LocationLineEqualityComparison < Base + extend AutoCorrector + + MSG = 'Use `%s`.' + + # @!method line_send(node) + def_node_matcher :line_send, <<~PATTERN + { + (send (send _ {:loc :source_range}) {:line :first_line}) + (send _ :first_line) + } + PATTERN + + # @!method location_line_equality_comparison?(node) + def_node_matcher :location_line_equality_comparison?, <<~PATTERN + (send #line_send :== #line_send) + PATTERN + + def on_send(node) + return unless location_line_equality_comparison?(node) + + lhs, _op, rhs = *node + + lhs_receiver = extract_receiver(lhs) + rhs_receiver = extract_receiver(rhs) + preferred = "same_line?(#{lhs_receiver}, #{rhs_receiver})" + + add_offense(node, message: format(MSG, preferred: preferred)) do |corrector| + corrector.replace(node, preferred) + end + end + + private + + def extract_receiver(node) + receiver = node.receiver + receiver = receiver.receiver if receiver.method?(:loc) || receiver.method?(:source_range) + receiver.source + end + end + end + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/rubocop-1.28.2/lib/rubocop/cop/internal_affairs/method_name_equal.rb b/vendor/bundle/ruby/3.1.0/gems/rubocop-1.28.2/lib/rubocop/cop/internal_affairs/method_name_equal.rb new file mode 100644 index 000000000..da6388d8d --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/rubocop-1.28.2/lib/rubocop/cop/internal_affairs/method_name_equal.rb @@ -0,0 +1,50 @@ +# frozen_string_literal: true + +module RuboCop + module Cop + module InternalAffairs + # Checks that method names are checked using `method?` method. + # + # @example + # # bad + # node.method_name == :do_something + # + # # good + # node.method?(:do_something) + # + class MethodNameEqual < Base + include RangeHelp + extend AutoCorrector + + MSG = 'Use `method?(%s)` instead of `method_name == %s`.' + RESTRICT_ON_SEND = %i[==].freeze + + # @!method method_name?(node) + def_node_matcher :method_name?, <<~PATTERN + (send + $(send + (...) :method_name) :== + $...) + PATTERN + + def on_send(node) + method_name?(node) do |method_name_node, method_name_arg| + message = format(MSG, method_name: method_name_arg.first.source) + + range = range(method_name_node, node) + + add_offense(range, message: message) do |corrector| + corrector.replace(range, "method?(#{method_name_arg.first.source})") + end + end + end + + private + + def range(method_name_node, node) + range_between(method_name_node.loc.selector.begin_pos, node.source_range.end_pos) + end + end + end + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/rubocop-1.28.2/lib/rubocop/cop/internal_affairs/node_destructuring.rb b/vendor/bundle/ruby/3.1.0/gems/rubocop-1.28.2/lib/rubocop/cop/internal_affairs/node_destructuring.rb new file mode 100644 index 000000000..2e3bab9b4 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/rubocop-1.28.2/lib/rubocop/cop/internal_affairs/node_destructuring.rb @@ -0,0 +1,44 @@ +# frozen_string_literal: true + +module RuboCop + module Cop + module InternalAffairs + # Checks that node destructuring is using the node extensions. + # + # @example Using splat expansion + # + # # bad + # _receiver, method_name, _arguments = send_node.children + # + # # bad + # _receiver, method_name, _arguments = *send_node + # + # # good + # method_name = send_node.method_name + class NodeDestructuring < Base + MSG = 'Use the methods provided with the node extensions instead ' \ + 'of manually destructuring nodes.' + + # @!method node_variable?(node) + def_node_matcher :node_variable?, <<~PATTERN + {(lvar [#node_suffix? _]) (send nil? [#node_suffix? _])} + PATTERN + + # @!method node_destructuring?(node) + def_node_matcher :node_destructuring?, <<~PATTERN + {(masgn (mlhs ...) {(send #node_variable? :children) (array (splat #node_variable?))})} + PATTERN + + def on_masgn(node) + node_destructuring?(node) { add_offense(node) } + end + + private + + def node_suffix?(method_name) + method_name.to_s.end_with?('node') + end + end + end + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/rubocop-1.28.2/lib/rubocop/cop/internal_affairs/node_matcher_directive.rb b/vendor/bundle/ruby/3.1.0/gems/rubocop-1.28.2/lib/rubocop/cop/internal_affairs/node_matcher_directive.rb new file mode 100644 index 000000000..f4938abcd --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/rubocop-1.28.2/lib/rubocop/cop/internal_affairs/node_matcher_directive.rb @@ -0,0 +1,151 @@ +# frozen_string_literal: true + +module RuboCop + module Cop + module InternalAffairs + # Checks that node matcher definitions are tagged with a YARD `@!method` + # directive so that editors are able to find the dynamically defined + # method. + # + # @example + # # bad + # def_node_matcher :foo?, <<~PATTERN + # ... + # PATTERN + # + # # good + # # @!method foo?(node) + # def_node_matcher :foo?, <<~PATTERN + # ... + # PATTERN + # + class NodeMatcherDirective < Base + extend AutoCorrector + include RangeHelp + + MSG = 'Precede `%s` with a `@!method` YARD directive.' + MSG_WRONG_NAME = '`@!method` YARD directive has invalid method name, ' \ + 'use `%s` instead of `%s`.' + MSG_TOO_MANY = 'Multiple `@!method` YARD directives found for this matcher.' + + RESTRICT_ON_SEND = %i[def_node_matcher def_node_search].to_set.freeze + REGEXP = /^\s*#\s*@!method\s+(?[a-z0-9_]+[?!]?)(?:\((?.*)\))?/.freeze + + # @!method pattern_matcher?(node) + def_node_matcher :pattern_matcher?, <<~PATTERN + (send _ %RESTRICT_ON_SEND {str sym} {str dstr}) + PATTERN + + def on_send(node) + return if node.arguments.none? + return unless valid_method_name?(node) + + actual_name = node.arguments.first.value + directives = method_directives(node) + return too_many_directives(node) if directives.size > 1 + + directive = directives.first + return if directive_correct?(directive, actual_name) + + register_offense(node, directive, actual_name) + end + + private + + def valid_method_name?(node) + node.arguments.first.str_type? || node.arguments.first.sym_type? + end + + def method_directives(node) + comments = processed_source.ast_with_comments[node] + + comments.map do |comment| + match = comment.text.match(REGEXP) + next unless match + + { node: comment, method_name: match[:method_name], args: match[:args] } + end.compact + end + + def too_many_directives(node) + add_offense(node, message: MSG_TOO_MANY) + end + + def directive_correct?(directive, actual_name) + directive && directive[:method_name] == actual_name.to_s + end + + def register_offense(node, directive, actual_name) + message = formatted_message(directive, actual_name, node.method_name) + + add_offense(node, message: message) do |corrector| + if directive + correct_directive(corrector, directive, actual_name) + else + insert_directive(corrector, node, actual_name) + end + end + end + + def formatted_message(directive, actual_name, method_name) + if directive + format(MSG_WRONG_NAME, expected: actual_name, actual: directive[:method_name]) + else + format(MSG, method: method_name) + end + end + + def insert_directive(corrector, node, actual_name) + # If the pattern matcher uses arguments (`%1`, `%2`, etc.), include them in the directive + arguments = pattern_arguments(node.arguments[1].source) + + range = range_with_surrounding_space( + range: node.loc.expression, + side: :left, + newlines: false + ) + indentation = range.source.match(/^\s*/)[0] + directive = "#{indentation}# @!method #{actual_name}(#{arguments.join(', ')})\n" + directive = "\n#{directive}" if add_newline?(node) + + corrector.insert_before(range, directive) + end + + def pattern_arguments(pattern) + arguments = %w[node] + max_pattern_var = pattern.scan(/(?<=%)\d+/).map(&:to_i).max + max_pattern_var&.times { |i| arguments << "arg#{i + 1}" } + arguments + end + + def add_newline?(node) + # Determine if a blank line should be inserted before the new directive + # in order to spread out pattern matchers + return if node.sibling_index&.zero? + return unless node.parent + + prev_sibling = node.parent.child_nodes[node.sibling_index - 1] + return unless prev_sibling && pattern_matcher?(prev_sibling) + + node.loc.line == last_line(prev_sibling) + 1 + end + + def last_line(node) + if node.last_argument.heredoc? + node.last_argument.loc.heredoc_end.line + else + node.loc.last_line + end + end + + def correct_directive(corrector, directive, actual_name) + correct = "@!method #{actual_name}" + regexp = /@!method\s+#{Regexp.escape(directive[:method_name])}/ + + replacement = directive[:node].text.gsub(regexp, correct) + corrector.replace(directive[:node], replacement) + end + end + end + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/rubocop-1.28.2/lib/rubocop/cop/internal_affairs/node_type_predicate.rb b/vendor/bundle/ruby/3.1.0/gems/rubocop-1.28.2/lib/rubocop/cop/internal_affairs/node_type_predicate.rb new file mode 100644 index 000000000..ac188c50e --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/rubocop-1.28.2/lib/rubocop/cop/internal_affairs/node_type_predicate.rb @@ -0,0 +1,41 @@ +# frozen_string_literal: true + +module RuboCop + module Cop + module InternalAffairs + # Checks that node types are checked using the predicate helpers. + # + # @example + # + # # bad + # node.type == :send + # + # # good + # node.send_type? + # + class NodeTypePredicate < Base + extend AutoCorrector + + MSG = 'Use `#%s_type?` to check node type.' + RESTRICT_ON_SEND = %i[==].freeze + + # @!method node_type_check(node) + def_node_matcher :node_type_check, <<~PATTERN + (send (send $_ :type) :== (sym $_)) + PATTERN + + def on_send(node) + node_type_check(node) do |receiver, node_type| + return unless Parser::Meta::NODE_TYPES.include?(node_type) + + message = format(MSG, type: node_type) + add_offense(node, message: message) do |corrector| + range = node.loc.expression.with(begin_pos: receiver.loc.expression.end_pos + 1) + corrector.replace(range, "#{node_type}_type?") + end + end + end + end + end + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/rubocop-1.28.2/lib/rubocop/cop/internal_affairs/offense_location_keyword.rb b/vendor/bundle/ruby/3.1.0/gems/rubocop-1.28.2/lib/rubocop/cop/internal_affairs/offense_location_keyword.rb new file mode 100644 index 000000000..2abcff8f3 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/rubocop-1.28.2/lib/rubocop/cop/internal_affairs/offense_location_keyword.rb @@ -0,0 +1,56 @@ +# frozen_string_literal: true + +module RuboCop + module Cop + module InternalAffairs + # Checks for potential uses of the location keywords which can be used as + # shortcut arguments to `#add_offense`. + # + # @example + # + # # bad + # add_offense(node, location: node.loc.selector) + # + # # good + # add_offense(node, location: :selector) + class OffenseLocationKeyword < Base + extend AutoCorrector + + MSG = 'Use `:%s` as the location argument to `#add_offense`.' + RESTRICT_ON_SEND = %i[add_offense].freeze + + def on_send(node) + node_type_check(node) do |node_arg, kwargs| + find_offending_argument(node_arg, kwargs) do |location, keyword| + add_offense(location, message: format(MSG, keyword: keyword)) do |corrector| + (*, keyword) = offending_location_argument(location.parent) + + corrector.replace(location, ":#{keyword}") + end + end + end + end + + private + + # @!method node_type_check(node) + def_node_matcher :node_type_check, <<~PATTERN + (send nil? :add_offense $_node $hash) + PATTERN + + # @!method offending_location_argument(node) + def_node_matcher :offending_location_argument, <<~PATTERN + (pair (sym :location) $(send (send $_node :loc) $_keyword)) + PATTERN + + def find_offending_argument(searched_node, kwargs) + kwargs.pairs.each do |pair| + offending_location_argument(pair) do |location, node, keyword| + yield(location, keyword) if searched_node == node + end + end + end + end + end + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/rubocop-1.28.2/lib/rubocop/cop/internal_affairs/redundant_context_config_parameter.rb b/vendor/bundle/ruby/3.1.0/gems/rubocop-1.28.2/lib/rubocop/cop/internal_affairs/redundant_context_config_parameter.rb new file mode 100644 index 000000000..b31edc0b4 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/rubocop-1.28.2/lib/rubocop/cop/internal_affairs/redundant_context_config_parameter.rb @@ -0,0 +1,46 @@ +# frozen_string_literal: true + +module RuboCop + module Cop + module InternalAffairs + # Checks for redundant `:config` parameter in the `context` arguments. + # + # @example + # + # # bad + # context 'foo', :config do + # end + # + # # good + # context 'foo' do + # end + # + class RedundantContextConfigParameter < Base + include RangeHelp + extend AutoCorrector + + MSG = 'Remove the redundant `:config` parameter.' + RESTRICT_ON_SEND = %i[context].freeze + + def on_send(node) + arguments = node.arguments + config_node = arguments.detect { |argument| argument.source == ':config' } + return unless config_node + + add_offense(config_node) do |corrector| + dup_arguments = arguments.dup + dup_arguments.delete(config_node) + + corrector.replace(offense_range(arguments), dup_arguments.map(&:source).join(', ')) + end + end + + private + + def offense_range(arguments) + range_between(arguments.first.source_range.begin_pos, arguments.last.source_range.end_pos) + end + end + end + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/rubocop-1.28.2/lib/rubocop/cop/internal_affairs/redundant_described_class_as_subject.rb b/vendor/bundle/ruby/3.1.0/gems/rubocop-1.28.2/lib/rubocop/cop/internal_affairs/redundant_described_class_as_subject.rb new file mode 100644 index 000000000..1180f4d48 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/rubocop-1.28.2/lib/rubocop/cop/internal_affairs/redundant_described_class_as_subject.rb @@ -0,0 +1,62 @@ +# frozen_string_literal: true + +module RuboCop + module Cop + module InternalAffairs + # This cop checks for redundant `subject(:cop) { described_class.new }`. + # + # @example + # # bad + # RSpec.describe RuboCop::Cop::Department::Foo do + # subject(:cop) { described_class.new(config) } + # end + # + # # good + # RSpec.describe RuboCop::Cop::Department::Foo, :config do + # end + # + class RedundantDescribedClassAsSubject < Base + include RangeHelp + extend AutoCorrector + + MSG = 'Remove the redundant `subject`%s.' + + # @!method described_class_subject?(node) + def_node_matcher :described_class_subject?, <<~PATTERN + (block + (send nil? :subject + (sym :cop)) + (args) + (send + (send nil? :described_class) :new + $...)) + PATTERN + + def on_block(node) + return unless (described_class_arguments = described_class_subject?(node)) + return if described_class_arguments.count >= 2 + + describe = find_describe_method_node(node) + + unless (exist_config = describe.last_argument.source == ':config') + additional_message = ' and specify `:config` in `describe`' + end + + message = format(MSG, additional_message: additional_message) + + add_offense(node, message: message) do |corrector| + corrector.remove(range_by_whole_lines(node.source_range, include_final_newline: true)) + + corrector.insert_after(describe.last_argument, ', :config') unless exist_config + end + end + + private + + def find_describe_method_node(block_node) + block_node.ancestors.find { |node| node.block_type? && node.method?(:describe) }.send_node + end + end + end + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/rubocop-1.28.2/lib/rubocop/cop/internal_affairs/redundant_let_rubocop_config_new.rb b/vendor/bundle/ruby/3.1.0/gems/rubocop-1.28.2/lib/rubocop/cop/internal_affairs/redundant_let_rubocop_config_new.rb new file mode 100644 index 000000000..777cff107 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/rubocop-1.28.2/lib/rubocop/cop/internal_affairs/redundant_let_rubocop_config_new.rb @@ -0,0 +1,65 @@ +# frozen_string_literal: true + +module RuboCop + module Cop + module InternalAffairs + # This cop checks that `let` is `RuboCop::Config.new` with no arguments. + # + # @example + # # bad + # RSpec.describe RuboCop::Cop::Department::Foo, :config do + # let(:config) { RuboCop::Config.new } + # end + # + # # good + # RSpec.describe RuboCop::Cop::Department::Foo, :config do + # end + # + # RSpec.describe RuboCop::Cop::Department::Foo, :config do + # let(:config) { RuboCop::Config.new(argument) } + # end + # + class RedundantLetRuboCopConfigNew < Base + include RangeHelp + extend AutoCorrector + + MSG = 'Remove `let` that is `RuboCop::Config.new` with no arguments%s.' + + # @!method let_rubocop_config_new?(node) + def_node_matcher :let_rubocop_config_new?, <<~PATTERN + (block + (send nil? :let + (sym :config)) + (args) + (send + (const + (const nil? :RuboCop) :Config) :new)) + PATTERN + + def on_block(node) + return unless let_rubocop_config_new?(node) + + describe = find_describe_method_node(node) + + unless (exist_config = describe.last_argument.source == ':config') + additional_message = ' and specify `:config` in `describe`' + end + + message = format(MSG, additional_message: additional_message) + + add_offense(node, message: message) do |corrector| + corrector.remove(range_by_whole_lines(node.source_range, include_final_newline: true)) + + corrector.insert_after(describe.last_argument, ', :config') unless exist_config + end + end + + private + + def find_describe_method_node(block_node) + block_node.ancestors.find { |node| node.block_type? && node.method?(:describe) }.send_node + end + end + end + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/rubocop-1.28.2/lib/rubocop/cop/internal_affairs/redundant_location_argument.rb b/vendor/bundle/ruby/3.1.0/gems/rubocop-1.28.2/lib/rubocop/cop/internal_affairs/redundant_location_argument.rb new file mode 100644 index 000000000..d5632d767 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/rubocop-1.28.2/lib/rubocop/cop/internal_affairs/redundant_location_argument.rb @@ -0,0 +1,53 @@ +# frozen_string_literal: true + +module RuboCop + module Cop + module InternalAffairs + # Checks for redundant `location` argument to `#add_offense`. `location` + # argument has a default value of `:expression` and this method will + # automatically use it. + # + # @example + # + # # bad + # add_offense(node, location: :expression) + # + # # good + # add_offense(node) + # add_offense(node, location: :selector) + # + class RedundantLocationArgument < Base + include RangeHelp + extend AutoCorrector + + MSG = 'Redundant location argument to `#add_offense`.' + RESTRICT_ON_SEND = %i[add_offense].freeze + + # @!method redundant_location_argument(node) + def_node_matcher :redundant_location_argument, <<~PATTERN + (send nil? :add_offense _ + (hash <$(pair (sym :location) (sym :expression)) ...>) + ) + PATTERN + + def on_send(node) + redundant_location_argument(node) do |argument| + add_offense(argument) do |corrector| + range = offending_range(argument) + + corrector.remove(range) + end + end + end + + private + + def offending_range(node) + with_space = range_with_surrounding_space(range: node.loc.expression) + + range_with_surrounding_comma(with_space, :left) + end + end + end + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/rubocop-1.28.2/lib/rubocop/cop/internal_affairs/redundant_message_argument.rb b/vendor/bundle/ruby/3.1.0/gems/rubocop-1.28.2/lib/rubocop/cop/internal_affairs/redundant_message_argument.rb new file mode 100644 index 000000000..eb67619cc --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/rubocop-1.28.2/lib/rubocop/cop/internal_affairs/redundant_message_argument.rb @@ -0,0 +1,76 @@ +# frozen_string_literal: true + +module RuboCop + module Cop + module InternalAffairs + # Checks for redundant message arguments to `#add_offense`. This method + # will automatically use `#message` or `MSG` (in that order of priority) + # if they are defined. + # + # @example + # + # # bad + # add_offense(node, message: MSG) + # add_offense(node, message: message) + # add_offense(node, message: message(node)) + # + # # good + # add_offense(node) + # add_offense(node, message: CUSTOM_MSG) + # add_offense(node, message: message(other_node)) + # + class RedundantMessageArgument < Base + include RangeHelp + extend AutoCorrector + + MSG = 'Redundant message argument to `#add_offense`.' + RESTRICT_ON_SEND = %i[add_offense].freeze + + # @!method node_type_check(node) + def_node_matcher :node_type_check, <<~PATTERN + (send nil? :add_offense $_node $hash) + PATTERN + + # @!method redundant_message_argument(node) + def_node_matcher :redundant_message_argument, <<~PATTERN + (pair + (sym :message) + ${(const nil? :MSG) (send nil? :message) (send nil? :message _)}) + PATTERN + + # @!method message_method_call(node) + def_node_matcher :message_method_call, '(send nil? :message $_node)' + + def on_send(node) + node_type_check(node) do |node_arg, kwargs| + find_offending_argument(node_arg, kwargs) do |pair| + add_offense(pair) do |corrector| + range = offending_range(pair) + + corrector.remove(range) + end + end + end + end + + private + + def offending_range(node) + with_space = range_with_surrounding_space(range: node.loc.expression) + + range_with_surrounding_comma(with_space, :left) + end + + def find_offending_argument(searched_node, kwargs) + kwargs.pairs.each do |pair| + redundant_message_argument(pair) do |message_argument| + node = message_method_call(message_argument) + + yield pair if !node || node == searched_node + end + end + end + end + end + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/rubocop-1.28.2/lib/rubocop/cop/internal_affairs/redundant_method_dispatch_node.rb b/vendor/bundle/ruby/3.1.0/gems/rubocop-1.28.2/lib/rubocop/cop/internal_affairs/redundant_method_dispatch_node.rb new file mode 100644 index 000000000..b7af63dcd --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/rubocop-1.28.2/lib/rubocop/cop/internal_affairs/redundant_method_dispatch_node.rb @@ -0,0 +1,47 @@ +# frozen_string_literal: true + +module RuboCop + module Cop + module InternalAffairs + # Checks for redundant `send_node` method dispatch node. + # + # @example + # + # # bad + # node.send_node.method_name + # + # # good + # node.method_name + # + # # bad + # node.send_node.receiver + # + # # good + # node.receiver + # + class RedundantMethodDispatchNode < Base + include RangeHelp + extend AutoCorrector + + MSG = 'Remove the redundant `send_node`.' + RESTRICT_ON_SEND = %i[method_name receiver].freeze + + # @!method dispatch_method(node) + def_node_matcher :dispatch_method, <<~PATTERN + (send $(send _ :send_node) _) + PATTERN + + def on_send(node) + return unless (dispatch_node = dispatch_method(node)) + return unless (dot = dispatch_node.loc.dot) + + range = range_between(dot.begin_pos, dispatch_node.loc.selector.end_pos) + + add_offense(range) do |corrector| + corrector.remove(range) + end + end + end + end + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/rubocop-1.28.2/lib/rubocop/cop/internal_affairs/style_detected_api_use.rb b/vendor/bundle/ruby/3.1.0/gems/rubocop-1.28.2/lib/rubocop/cop/internal_affairs/style_detected_api_use.rb new file mode 100644 index 000000000..98d3ed896 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/rubocop-1.28.2/lib/rubocop/cop/internal_affairs/style_detected_api_use.rb @@ -0,0 +1,148 @@ +# frozen_string_literal: true + +module RuboCop + module Cop + module InternalAffairs + # Checks for correct use of the style_detected API provided by + # `ConfigurableEnforcedStyle`. If `correct_style_detected` is used + # then `opposite_style_detected`, `unexpected_style_detected`, + # `ambiguous_style_detected`, `conflicting_styles_detected`, + # `unrecognized_style_detected` or `no_acceptable_style!` should be + # used too, and vice versa. The `xxx_style_detected` methods + # should not be used as predicates either. + # + # @example + # + # # bad + # def on_send(node) + # return add_offense(node) if opposite_style_detected + # + # correct_style_detected + # end + # + # def on_send(node) + # if offense? + # add_offense(node) + # else + # correct_style_detected + # end + # end + # + # def on_send(node) + # return unless offense? + # + # add_offense(node) + # opposite_style_detected + # end + # + # # good + # def on_send(node) + # if offense? + # add_offense(node) + # opposite_style_detected + # else + # correct_style_detected + # end + # end + # + # def on_send(node) + # add_offense(node) if offense? + # end + # + class StyleDetectedApiUse < Base + include RangeHelp + + MSG_FOR_POSITIVE_WITHOUT_NEGATIVE = + '`correct_style_detected` method called without ' \ + 'calling a negative `*_style_detected` method.' + MSG_FOR_NEGATIVE_WITHOUT_POSITIVE = + 'negative `*_style_detected` methods called without ' \ + 'calling `correct_style_detected` method.' + MSG_FOR_CONDITIONAL_USE = '`*_style_detected` method called in conditional.' + RESTRICT_ON_SEND = %i[ + correct_style_detected opposite_style_detected + unexpected_style_detected ambiguous_style_detected + conflicting_styles_detected unrecognized_style_detected + no_acceptable_style! style_detected + ].freeze + + # @!method correct_style_detected_check(node) + def_node_matcher :correct_style_detected_check, <<~PATTERN + (send nil? :correct_style_detected) + PATTERN + + # @!method negative_style_detected_method_check(node) + def_node_matcher :negative_style_detected_method_check, <<~PATTERN + (send nil? /(?:opposite|unexpected|ambiguous|unrecognized)_style_detected|conflicting_styles_detected/ ...) + PATTERN + + # @!method no_acceptable_style_check(node) + def_node_matcher :no_acceptable_style_check, <<~PATTERN + (send nil? :no_acceptable_style!) + PATTERN + + # @!method style_detected_check(node) + def_node_matcher :style_detected_check, <<~PATTERN + (send nil? :style_detected ...) + PATTERN + + def on_new_investigation + @correct_style_detected_called = false + @negative_style_detected_methods_called = false + @style_detected_called = false + end + + def on_investigation_end + return if style_detected_called + return unless correct_style_detected_called ^ negative_style_detected_methods_called + + add_global_offense(MSG_FOR_POSITIVE_WITHOUT_NEGATIVE) if positive_without_negative? + add_global_offense(MSG_FOR_NEGATIVE_WITHOUT_POSITIVE) if negative_without_positive? + end + + def on_send(node) + if correct_style_detected_check(node) + @correct_style_detected_called = true + elsif negative_style_detected_method_check(node) || no_acceptable_style_check(node) + @negative_style_detected_methods_called = true + elsif style_detected_check(node) + @style_detected_called = true + end + end + + def on_if(node) + traverse_condition(node.condition) do |cond| + add_offense(cond, message: MSG_FOR_CONDITIONAL_USE) if style_detected_api_used?(cond) + end + end + + private + + attr_reader :correct_style_detected_called, + :negative_style_detected_methods_called, + :style_detected_called + + def positive_without_negative? + correct_style_detected_called && !negative_style_detected_methods_called + end + + def negative_without_positive? + negative_style_detected_methods_called && !correct_style_detected_called + end + + def style_detected_api_used?(node) + correct_style_detected_check(node) || + negative_style_detected_method_check(node) || + no_acceptable_style_check(node) || + style_detected_check(node) + end + + def traverse_condition(condition, &block) + yield condition if condition.send_type? + + condition.each_child_node { |child| traverse_condition(child, &block) } + end + end + end + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/rubocop-1.28.2/lib/rubocop/cop/internal_affairs/undefined_config.rb b/vendor/bundle/ruby/3.1.0/gems/rubocop-1.28.2/lib/rubocop/cop/internal_affairs/undefined_config.rb new file mode 100644 index 000000000..bb248c80c --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/rubocop-1.28.2/lib/rubocop/cop/internal_affairs/undefined_config.rb @@ -0,0 +1,73 @@ +# frozen_string_literal: true + +module RuboCop + module Cop + module InternalAffairs + # Looks for references to a cop configuration key that isn't defined in config/default.yml. + class UndefinedConfig < Base + ALLOWED_CONFIGURATIONS = %w[ + Safe SafeAutoCorrect AutoCorrect Severity StyleGuide Details Reference Include Exclude + ].freeze + RESTRICT_ON_SEND = %i[[] fetch].freeze + MSG = '`%s` is not defined in the configuration for `%s` ' \ + 'in `config/default.yml`.' + + # @!method cop_class_def(node) + def_node_search :cop_class_def, <<~PATTERN + (class _ + (const {nil? (const nil? :Cop) (const (const {cbase nil?} :RuboCop) :Cop)} + {:Base :Cop}) ...) + PATTERN + + # @!method cop_config_accessor?(node) + def_node_matcher :cop_config_accessor?, <<~PATTERN + (send (send nil? :cop_config) {:[] :fetch} ${str sym}...) + PATTERN + + def on_new_investigation + super + return unless processed_source.ast + + cop_class = cop_class_def(processed_source.ast).first + return unless (@cop_class_name = extract_cop_name(cop_class)) + + @config_for_cop = RuboCop::ConfigLoader.default_configuration.for_cop(@cop_class_name) + end + + def on_send(node) + return unless cop_class_name + return unless (config_name_node = cop_config_accessor?(node)) + return if always_allowed?(config_name_node) + return if configuration_key_defined?(config_name_node) + + message = format(MSG, name: config_name_node.value, cop: cop_class_name) + add_offense(config_name_node, message: message) + end + + private + + attr_reader :config_for_cop, :cop_class_name + + def extract_cop_name(class_node) + return unless class_node + + segments = [class_node].concat( + class_node.each_ancestor(:class, :module).take_while do |n| + n.identifier.short_name != :Cop + end + ) + + segments.reverse_each.map { |s| s.identifier.short_name }.join('/') + end + + def always_allowed?(node) + ALLOWED_CONFIGURATIONS.include?(node.value) + end + + def configuration_key_defined?(node) + config_for_cop.key?(node.value) + end + end + end + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/rubocop-1.28.2/lib/rubocop/cop/internal_affairs/useless_message_assertion.rb b/vendor/bundle/ruby/3.1.0/gems/rubocop-1.28.2/lib/rubocop/cop/internal_affairs/useless_message_assertion.rb new file mode 100644 index 000000000..5c6f25fae --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/rubocop-1.28.2/lib/rubocop/cop/internal_affairs/useless_message_assertion.rb @@ -0,0 +1,52 @@ +# frozen_string_literal: true + +module RuboCop + module Cop + module InternalAffairs + # Checks that cops are not tested using `described_class::MSG`. + # + # @example + # + # # bad + # expect(cop.messages).to eq([described_class::MSG]) + # + # # good + # expect(cop.messages).to eq(['Do not write bad code like that.']) + # + class UselessMessageAssertion < Base + MSG = 'Do not specify cop behavior using `described_class::MSG`.' + + # @!method described_class_msg(node) + def_node_search :described_class_msg, <<~PATTERN + (const (send nil? :described_class) :MSG) + PATTERN + + # @!method rspec_expectation_on_msg?(node) + def_node_matcher :rspec_expectation_on_msg?, <<~PATTERN + (send (send nil? :expect #contains_described_class_msg?) :to ...) + PATTERN + + def on_new_investigation + assertions_using_described_class_msg.each { |node| add_offense(node) } + end + + private + + def contains_described_class_msg?(node) + described_class_msg(node).any? + end + + def assertions_using_described_class_msg + described_class_msg(processed_source.ast).reject do |node| + node.ancestors.any? { |ancestor| rspec_expectation_on_msg?(ancestor) } + end + end + + # Only process spec files + def relevant_file?(file) + file.end_with?('_spec.rb') + end + end + end + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/rubocop-1.28.2/lib/rubocop/cop/layout/access_modifier_indentation.rb b/vendor/bundle/ruby/3.1.0/gems/rubocop-1.28.2/lib/rubocop/cop/layout/access_modifier_indentation.rb new file mode 100644 index 000000000..82d887e0f --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/rubocop-1.28.2/lib/rubocop/cop/layout/access_modifier_indentation.rb @@ -0,0 +1,100 @@ +# frozen_string_literal: true + +module RuboCop + module Cop + module Layout + # Bare access modifiers (those not applying to specific methods) should be + # indented as deep as method definitions, or as deep as the class/module + # keyword, depending on configuration. + # + # @example EnforcedStyle: indent (default) + # # bad + # class Plumbus + # private + # def smooth; end + # end + # + # # good + # class Plumbus + # private + # def smooth; end + # end + # + # @example EnforcedStyle: outdent + # # bad + # class Plumbus + # private + # def smooth; end + # end + # + # # good + # class Plumbus + # private + # def smooth; end + # end + class AccessModifierIndentation < Base + include Alignment + include ConfigurableEnforcedStyle + include RangeHelp + extend AutoCorrector + + MSG = '% + + +

#{title}

+ _end_of_html_ + + res.body << "\n" + res.body << "" + res.body << "" + res.body << "\n" + res.body << "\n" + res.body << "\n" + + query.sub!(/\A&/, '?') + list.unshift [ "..", File::mtime(local_path+"/.."), -1 ] + list.each{ |name, time, size| + if name == ".." + dname = "Parent Directory" + elsif namewidth and name.size > namewidth + dname = name[0...(namewidth - 2)] << '..' + else + dname = name + end + s = "" + s << "" + s << "\n" + res.body << s + } + res.body << "
NameLast modifiedSize
#{HTMLUtils::escape(dname)}" << (time ? time.strftime("%Y/%m/%d %H:%M") : "") << "" << (size >= 0 ? size.to_s : "-") << "
" + res.body << "
" + + res.body << <<-_end_of_html_ +
+ #{HTMLUtils::escape(@config[:ServerSoftware])}
+ at #{req.host}:#{req.port} +
+ + + _end_of_html_ + end + + # :startdoc: + end + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/webrick-1.7.0/lib/webrick/httpservlet/prochandler.rb b/vendor/bundle/ruby/3.1.0/gems/webrick-1.7.0/lib/webrick/httpservlet/prochandler.rb new file mode 100644 index 000000000..599ffc434 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/webrick-1.7.0/lib/webrick/httpservlet/prochandler.rb @@ -0,0 +1,47 @@ +# frozen_string_literal: false +# +# prochandler.rb -- ProcHandler Class +# +# Author: IPR -- Internet Programming with Ruby -- writers +# Copyright (c) 2001 TAKAHASHI Masayoshi, GOTOU Yuuzou +# Copyright (c) 2002 Internet Programming with Ruby writers. All rights +# reserved. +# +# $IPR: prochandler.rb,v 1.7 2002/09/21 12:23:42 gotoyuzo Exp $ + +require_relative 'abstract' + +module WEBrick + module HTTPServlet + + ## + # Mounts a proc at a path that accepts a request and response. + # + # Instead of mounting this servlet with WEBrick::HTTPServer#mount use + # WEBrick::HTTPServer#mount_proc: + # + # server.mount_proc '/' do |req, res| + # res.body = 'it worked!' + # res.status = 200 + # end + + class ProcHandler < AbstractServlet + # :stopdoc: + def get_instance(server, *options) + self + end + + def initialize(proc) + @proc = proc + end + + def do_GET(request, response) + @proc.call(request, response) + end + + alias do_POST do_GET + # :startdoc: + end + + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/webrick-1.7.0/lib/webrick/httpstatus.rb b/vendor/bundle/ruby/3.1.0/gems/webrick-1.7.0/lib/webrick/httpstatus.rb new file mode 100644 index 000000000..c811f2196 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/webrick-1.7.0/lib/webrick/httpstatus.rb @@ -0,0 +1,194 @@ +# frozen_string_literal: false +#-- +# httpstatus.rb -- HTTPStatus Class +# +# Author: IPR -- Internet Programming with Ruby -- writers +# Copyright (c) 2000, 2001 TAKAHASHI Masayoshi, GOTOU Yuuzou +# Copyright (c) 2002 Internet Programming with Ruby writers. All rights +# reserved. +# +# $IPR: httpstatus.rb,v 1.11 2003/03/24 20:18:55 gotoyuzo Exp $ + +require_relative 'accesslog' + +module WEBrick + + ## + # This module is used to manager HTTP status codes. + # + # See http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html for more + # information. + module HTTPStatus + + ## + # Root of the HTTP status class hierarchy + class Status < StandardError + class << self + attr_reader :code, :reason_phrase # :nodoc: + end + + # Returns the HTTP status code + def code() self::class::code end + + # Returns the HTTP status description + def reason_phrase() self::class::reason_phrase end + + alias to_i code # :nodoc: + end + + # Root of the HTTP info statuses + class Info < Status; end + # Root of the HTTP success statuses + class Success < Status; end + # Root of the HTTP redirect statuses + class Redirect < Status; end + # Root of the HTTP error statuses + class Error < Status; end + # Root of the HTTP client error statuses + class ClientError < Error; end + # Root of the HTTP server error statuses + class ServerError < Error; end + + class EOFError < StandardError; end + + # HTTP status codes and descriptions + StatusMessage = { # :nodoc: + 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 Choices', + 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 Large', + 415 => 'Unsupported Media Type', + 416 => 'Request Range Not Satisfiable', + 417 => 'Expectation Failed', + 422 => 'Unprocessable Entity', + 423 => 'Locked', + 424 => 'Failed Dependency', + 426 => 'Upgrade Required', + 428 => 'Precondition Required', + 429 => 'Too Many Requests', + 431 => 'Request Header Fields Too Large', + 451 => 'Unavailable For Legal Reasons', + 500 => 'Internal Server Error', + 501 => 'Not Implemented', + 502 => 'Bad Gateway', + 503 => 'Service Unavailable', + 504 => 'Gateway Timeout', + 505 => 'HTTP Version Not Supported', + 507 => 'Insufficient Storage', + 511 => 'Network Authentication Required', + } + + # Maps a status code to the corresponding Status class + CodeToError = {} # :nodoc: + + # Creates a status or error class for each status code and + # populates the CodeToError map. + StatusMessage.each{|code, message| + message.freeze + var_name = message.gsub(/[ \-]/,'_').upcase + err_name = message.gsub(/[ \-]/,'') + + case code + when 100...200; parent = Info + when 200...300; parent = Success + when 300...400; parent = Redirect + when 400...500; parent = ClientError + when 500...600; parent = ServerError + end + + const_set("RC_#{var_name}", code) + err_class = Class.new(parent) + err_class.instance_variable_set(:@code, code) + err_class.instance_variable_set(:@reason_phrase, message) + const_set(err_name, err_class) + CodeToError[code] = err_class + } + + ## + # Returns the description corresponding to the HTTP status +code+ + # + # WEBrick::HTTPStatus.reason_phrase 404 + # => "Not Found" + def reason_phrase(code) + StatusMessage[code.to_i] + end + + ## + # Is +code+ an informational status? + def info?(code) + code.to_i >= 100 and code.to_i < 200 + end + + ## + # Is +code+ a successful status? + def success?(code) + code.to_i >= 200 and code.to_i < 300 + end + + ## + # Is +code+ a redirection status? + def redirect?(code) + code.to_i >= 300 and code.to_i < 400 + end + + ## + # Is +code+ an error status? + def error?(code) + code.to_i >= 400 and code.to_i < 600 + end + + ## + # Is +code+ a client error status? + def client_error?(code) + code.to_i >= 400 and code.to_i < 500 + end + + ## + # Is +code+ a server error status? + def server_error?(code) + code.to_i >= 500 and code.to_i < 600 + end + + ## + # Returns the status class corresponding to +code+ + # + # WEBrick::HTTPStatus[302] + # => WEBrick::HTTPStatus::NotFound + # + def self.[](code) + CodeToError[code] + end + + module_function :reason_phrase + module_function :info?, :success?, :redirect?, :error? + module_function :client_error?, :server_error? + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/webrick-1.7.0/lib/webrick/httputils.rb b/vendor/bundle/ruby/3.1.0/gems/webrick-1.7.0/lib/webrick/httputils.rb new file mode 100644 index 000000000..f1b9ddf9f --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/webrick-1.7.0/lib/webrick/httputils.rb @@ -0,0 +1,512 @@ +# frozen_string_literal: false +# +# httputils.rb -- HTTPUtils Module +# +# Author: IPR -- Internet Programming with Ruby -- writers +# Copyright (c) 2000, 2001 TAKAHASHI Masayoshi, GOTOU Yuuzou +# Copyright (c) 2002 Internet Programming with Ruby writers. All rights +# reserved. +# +# $IPR: httputils.rb,v 1.34 2003/06/05 21:34:08 gotoyuzo Exp $ + +require 'socket' +require 'tempfile' + +module WEBrick + CR = "\x0d" # :nodoc: + LF = "\x0a" # :nodoc: + CRLF = "\x0d\x0a" # :nodoc: + + ## + # HTTPUtils provides utility methods for working with the HTTP protocol. + # + # This module is generally used internally by WEBrick + + module HTTPUtils + + ## + # Normalizes a request path. Raises an exception if the path cannot be + # normalized. + + def normalize_path(path) + raise "abnormal path `#{path}'" if path[0] != ?/ + ret = path.dup + + ret.gsub!(%r{/+}o, '/') # // => / + while ret.sub!(%r'/\.(?:/|\Z)', '/'); end # /. => / + while ret.sub!(%r'/(?!\.\./)[^/]+/\.\.(?:/|\Z)', '/'); end # /foo/.. => /foo + + raise "abnormal path `#{path}'" if %r{/\.\.(/|\Z)} =~ ret + ret + end + module_function :normalize_path + + ## + # Default mime types + + DefaultMimeTypes = { + "ai" => "application/postscript", + "asc" => "text/plain", + "avi" => "video/x-msvideo", + "bin" => "application/octet-stream", + "bmp" => "image/bmp", + "class" => "application/octet-stream", + "cer" => "application/pkix-cert", + "crl" => "application/pkix-crl", + "crt" => "application/x-x509-ca-cert", + #"crl" => "application/x-pkcs7-crl", + "css" => "text/css", + "dms" => "application/octet-stream", + "doc" => "application/msword", + "dvi" => "application/x-dvi", + "eps" => "application/postscript", + "etx" => "text/x-setext", + "exe" => "application/octet-stream", + "gif" => "image/gif", + "htm" => "text/html", + "html" => "text/html", + "jpe" => "image/jpeg", + "jpeg" => "image/jpeg", + "jpg" => "image/jpeg", + "js" => "application/javascript", + "json" => "application/json", + "lha" => "application/octet-stream", + "lzh" => "application/octet-stream", + "mjs" => "application/javascript", + "mov" => "video/quicktime", + "mpe" => "video/mpeg", + "mpeg" => "video/mpeg", + "mpg" => "video/mpeg", + "pbm" => "image/x-portable-bitmap", + "pdf" => "application/pdf", + "pgm" => "image/x-portable-graymap", + "png" => "image/png", + "pnm" => "image/x-portable-anymap", + "ppm" => "image/x-portable-pixmap", + "ppt" => "application/vnd.ms-powerpoint", + "ps" => "application/postscript", + "qt" => "video/quicktime", + "ras" => "image/x-cmu-raster", + "rb" => "text/plain", + "rd" => "text/plain", + "rtf" => "application/rtf", + "sgm" => "text/sgml", + "sgml" => "text/sgml", + "svg" => "image/svg+xml", + "tif" => "image/tiff", + "tiff" => "image/tiff", + "txt" => "text/plain", + "wasm" => "application/wasm", + "xbm" => "image/x-xbitmap", + "xhtml" => "text/html", + "xls" => "application/vnd.ms-excel", + "xml" => "text/xml", + "xpm" => "image/x-xpixmap", + "xwd" => "image/x-xwindowdump", + "zip" => "application/zip", + } + + ## + # Loads Apache-compatible mime.types in +file+. + + def load_mime_types(file) + # note: +file+ may be a "| command" for now; some people may + # rely on this, but currently we do not use this method by default. + open(file){ |io| + hash = Hash.new + io.each{ |line| + next if /^#/ =~ line + line.chomp! + mimetype, ext0 = line.split(/\s+/, 2) + next unless ext0 + next if ext0.empty? + ext0.split(/\s+/).each{ |ext| hash[ext] = mimetype } + } + hash + } + end + module_function :load_mime_types + + ## + # Returns the mime type of +filename+ from the list in +mime_tab+. If no + # mime type was found application/octet-stream is returned. + + def mime_type(filename, mime_tab) + suffix1 = (/\.(\w+)$/ =~ filename && $1.downcase) + suffix2 = (/\.(\w+)\.[\w\-]+$/ =~ filename && $1.downcase) + mime_tab[suffix1] || mime_tab[suffix2] || "application/octet-stream" + end + module_function :mime_type + + ## + # Parses an HTTP header +raw+ into a hash of header fields with an Array + # of values. + + def parse_header(raw) + header = Hash.new([].freeze) + field = nil + raw.each_line{|line| + case line + when /^([A-Za-z0-9!\#$%&'*+\-.^_`|~]+):\s*(.*?)\s*\z/om + field, value = $1, $2 + field.downcase! + header[field] = [] unless header.has_key?(field) + header[field] << value + when /^\s+(.*?)\s*\z/om + value = $1 + unless field + raise HTTPStatus::BadRequest, "bad header '#{line}'." + end + header[field][-1] << " " << value + else + raise HTTPStatus::BadRequest, "bad header '#{line}'." + end + } + header.each{|key, values| + values.each(&:strip!) + } + header + end + module_function :parse_header + + ## + # Splits a header value +str+ according to HTTP specification. + + def split_header_value(str) + str.scan(%r'\G((?:"(?:\\.|[^"])+?"|[^",]+)+) + (?:,\s*|\Z)'xn).flatten + end + module_function :split_header_value + + ## + # Parses a Range header value +ranges_specifier+ + + def parse_range_header(ranges_specifier) + if /^bytes=(.*)/ =~ ranges_specifier + byte_range_set = split_header_value($1) + byte_range_set.collect{|range_spec| + case range_spec + when /^(\d+)-(\d+)/ then $1.to_i .. $2.to_i + when /^(\d+)-/ then $1.to_i .. -1 + when /^-(\d+)/ then -($1.to_i) .. -1 + else return nil + end + } + end + end + module_function :parse_range_header + + ## + # Parses q values in +value+ as used in Accept headers. + + def parse_qvalues(value) + tmp = [] + if value + parts = value.split(/,\s*/) + parts.each {|part| + if m = %r{^([^\s,]+?)(?:;\s*q=(\d+(?:\.\d+)?))?$}.match(part) + val = m[1] + q = (m[2] or 1).to_f + tmp.push([val, q]) + end + } + tmp = tmp.sort_by{|val, q| -q} + tmp.collect!{|val, q| val} + end + return tmp + end + module_function :parse_qvalues + + ## + # Removes quotes and escapes from +str+ + + def dequote(str) + ret = (/\A"(.*)"\Z/ =~ str) ? $1 : str.dup + ret.gsub!(/\\(.)/, "\\1") + ret + end + module_function :dequote + + ## + # Quotes and escapes quotes in +str+ + + def quote(str) + '"' << str.gsub(/[\\\"]/o, "\\\1") << '"' + end + module_function :quote + + ## + # Stores multipart form data. FormData objects are created when + # WEBrick::HTTPUtils.parse_form_data is called. + + class FormData < String + EmptyRawHeader = [].freeze # :nodoc: + EmptyHeader = {}.freeze # :nodoc: + + ## + # The name of the form data part + + attr_accessor :name + + ## + # The filename of the form data part + + attr_accessor :filename + + attr_accessor :next_data # :nodoc: + protected :next_data + + ## + # Creates a new FormData object. + # + # +args+ is an Array of form data entries. One FormData will be created + # for each entry. + # + # This is called by WEBrick::HTTPUtils.parse_form_data for you + + def initialize(*args) + @name = @filename = @next_data = nil + if args.empty? + @raw_header = [] + @header = nil + super("") + else + @raw_header = EmptyRawHeader + @header = EmptyHeader + super(args.shift) + unless args.empty? + @next_data = self.class.new(*args) + end + end + end + + ## + # Retrieves the header at the first entry in +key+ + + def [](*key) + begin + @header[key[0].downcase].join(", ") + rescue StandardError, NameError + super + end + end + + ## + # Adds +str+ to this FormData which may be the body, a header or a + # header entry. + # + # This is called by WEBrick::HTTPUtils.parse_form_data for you + + def <<(str) + if @header + super + elsif str == CRLF + @header = HTTPUtils::parse_header(@raw_header.join) + if cd = self['content-disposition'] + if /\s+name="(.*?)"/ =~ cd then @name = $1 end + if /\s+filename="(.*?)"/ =~ cd then @filename = $1 end + end + else + @raw_header << str + end + self + end + + ## + # Adds +data+ at the end of the chain of entries + # + # This is called by WEBrick::HTTPUtils.parse_form_data for you. + + def append_data(data) + tmp = self + while tmp + unless tmp.next_data + tmp.next_data = data + break + end + tmp = tmp.next_data + end + self + end + + ## + # Yields each entry in this FormData + + def each_data + tmp = self + while tmp + next_data = tmp.next_data + yield(tmp) + tmp = next_data + end + end + + ## + # Returns all the FormData as an Array + + def list + ret = [] + each_data{|data| + ret << data.to_s + } + ret + end + + ## + # A FormData will behave like an Array + + alias :to_ary :list + + ## + # This FormData's body + + def to_s + String.new(self) + end + end + + ## + # Parses the query component of a URI in +str+ + + def parse_query(str) + query = Hash.new + if str + str.split(/[&;]/).each{|x| + next if x.empty? + key, val = x.split(/=/,2) + key = unescape_form(key) + val = unescape_form(val.to_s) + val = FormData.new(val) + val.name = key + if query.has_key?(key) + query[key].append_data(val) + next + end + query[key] = val + } + end + query + end + module_function :parse_query + + ## + # Parses form data in +io+ with the given +boundary+ + + def parse_form_data(io, boundary) + boundary_regexp = /\A--#{Regexp.quote(boundary)}(--)?#{CRLF}\z/ + form_data = Hash.new + return form_data unless io + data = nil + io.each_line{|line| + if boundary_regexp =~ line + if data + data.chop! + key = data.name + if form_data.has_key?(key) + form_data[key].append_data(data) + else + form_data[key] = data + end + end + data = FormData.new + next + else + if data + data << line + end + end + } + return form_data + end + module_function :parse_form_data + + ##### + + reserved = ';/?:@&=+$,' + num = '0123456789' + lowalpha = 'abcdefghijklmnopqrstuvwxyz' + upalpha = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' + mark = '-_.!~*\'()' + unreserved = num + lowalpha + upalpha + mark + control = (0x0..0x1f).collect{|c| c.chr }.join + "\x7f" + space = " " + delims = '<>#%"' + unwise = '{}|\\^[]`' + nonascii = (0x80..0xff).collect{|c| c.chr }.join + + module_function + + # :stopdoc: + + def _make_regex(str) /([#{Regexp.escape(str)}])/n end + def _make_regex!(str) /([^#{Regexp.escape(str)}])/n end + def _escape(str, regex) + str = str.b + str.gsub!(regex) {"%%%02X" % $1.ord} + # %-escaped string should contain US-ASCII only + str.force_encoding(Encoding::US_ASCII) + end + def _unescape(str, regex) + str = str.b + str.gsub!(regex) {$1.hex.chr} + # encoding of %-unescaped string is unknown + str + end + + UNESCAPED = _make_regex(control+space+delims+unwise+nonascii) + UNESCAPED_FORM = _make_regex(reserved+control+delims+unwise+nonascii) + NONASCII = _make_regex(nonascii) + ESCAPED = /%([0-9a-fA-F]{2})/ + UNESCAPED_PCHAR = _make_regex!(unreserved+":@&=+$,") + + # :startdoc: + + ## + # Escapes HTTP reserved and unwise characters in +str+ + + def escape(str) + _escape(str, UNESCAPED) + end + + ## + # Unescapes HTTP reserved and unwise characters in +str+ + + def unescape(str) + _unescape(str, ESCAPED) + end + + ## + # Escapes form reserved characters in +str+ + + def escape_form(str) + ret = _escape(str, UNESCAPED_FORM) + ret.gsub!(/ /, "+") + ret + end + + ## + # Unescapes form reserved characters in +str+ + + def unescape_form(str) + _unescape(str.gsub(/\+/, " "), ESCAPED) + end + + ## + # Escapes path +str+ + + def escape_path(str) + result = "" + str.scan(%r{/([^/]*)}).each{|i| + result << "/" << _escape(i[0], UNESCAPED_PCHAR) + } + return result + end + + ## + # Escapes 8 bit characters in +str+ + + def escape8bit(str) + _escape(str, NONASCII) + end + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/webrick-1.7.0/lib/webrick/httpversion.rb b/vendor/bundle/ruby/3.1.0/gems/webrick-1.7.0/lib/webrick/httpversion.rb new file mode 100644 index 000000000..8a251944a --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/webrick-1.7.0/lib/webrick/httpversion.rb @@ -0,0 +1,76 @@ +# frozen_string_literal: false +#-- +# HTTPVersion.rb -- presentation of HTTP version +# +# Author: IPR -- Internet Programming with Ruby -- writers +# Copyright (c) 2002 Internet Programming with Ruby writers. All rights +# reserved. +# +# $IPR: httpversion.rb,v 1.5 2002/09/21 12:23:37 gotoyuzo Exp $ + +module WEBrick + + ## + # Represents an HTTP protocol version + + class HTTPVersion + include Comparable + + ## + # The major protocol version number + + attr_accessor :major + + ## + # The minor protocol version number + + attr_accessor :minor + + ## + # Converts +version+ into an HTTPVersion + + def self.convert(version) + version.is_a?(self) ? version : new(version) + end + + ## + # Creates a new HTTPVersion from +version+. + + def initialize(version) + case version + when HTTPVersion + @major, @minor = version.major, version.minor + when String + if /^(\d+)\.(\d+)$/ =~ version + @major, @minor = $1.to_i, $2.to_i + end + end + if @major.nil? || @minor.nil? + raise ArgumentError, + format("cannot convert %s into %s", version.class, self.class) + end + end + + ## + # Compares this version with +other+ according to the HTTP specification + # rules. + + def <=>(other) + unless other.is_a?(self.class) + other = self.class.new(other) + end + if (ret = @major <=> other.major) == 0 + return @minor <=> other.minor + end + return ret + end + + ## + # The HTTP version as show in the HTTP request and response. For example, + # "1.1" + + def to_s + format("%d.%d", @major, @minor) + end + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/webrick-1.7.0/lib/webrick/log.rb b/vendor/bundle/ruby/3.1.0/gems/webrick-1.7.0/lib/webrick/log.rb new file mode 100644 index 000000000..2c1fdfe60 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/webrick-1.7.0/lib/webrick/log.rb @@ -0,0 +1,156 @@ +# frozen_string_literal: false +#-- +# log.rb -- Log Class +# +# Author: IPR -- Internet Programming with Ruby -- writers +# Copyright (c) 2000, 2001 TAKAHASHI Masayoshi, GOTOU Yuuzou +# Copyright (c) 2002 Internet Programming with Ruby writers. All rights +# reserved. +# +# $IPR: log.rb,v 1.26 2002/10/06 17:06:10 gotoyuzo Exp $ + +module WEBrick + + ## + # A generic logging class + + class BasicLog + + # Fatal log level which indicates a server crash + + FATAL = 1 + + # Error log level which indicates a recoverable error + + ERROR = 2 + + # Warning log level which indicates a possible problem + + WARN = 3 + + # Information log level which indicates possibly useful information + + INFO = 4 + + # Debugging error level for messages used in server development or + # debugging + + DEBUG = 5 + + # log-level, messages above this level will be logged + attr_accessor :level + + ## + # Initializes a new logger for +log_file+ that outputs messages at +level+ + # or higher. +log_file+ can be a filename, an IO-like object that + # responds to #<< or nil which outputs to $stderr. + # + # If no level is given INFO is chosen by default + + def initialize(log_file=nil, level=nil) + @level = level || INFO + case log_file + when String + @log = File.open(log_file, "a+") + @log.sync = true + @opened = true + when NilClass + @log = $stderr + else + @log = log_file # requires "<<". (see BasicLog#log) + end + end + + ## + # Closes the logger (also closes the log device associated to the logger) + def close + @log.close if @opened + @log = nil + end + + ## + # Logs +data+ at +level+ if the given level is above the current log + # level. + + def log(level, data) + if @log && level <= @level + data += "\n" if /\n\Z/ !~ data + @log << data + end + end + + ## + # Synonym for log(INFO, obj.to_s) + def <<(obj) + log(INFO, obj.to_s) + end + + # Shortcut for logging a FATAL message + def fatal(msg) log(FATAL, "FATAL " << format(msg)); end + # Shortcut for logging an ERROR message + def error(msg) log(ERROR, "ERROR " << format(msg)); end + # Shortcut for logging a WARN message + def warn(msg) log(WARN, "WARN " << format(msg)); end + # Shortcut for logging an INFO message + def info(msg) log(INFO, "INFO " << format(msg)); end + # Shortcut for logging a DEBUG message + def debug(msg) log(DEBUG, "DEBUG " << format(msg)); end + + # Will the logger output FATAL messages? + def fatal?; @level >= FATAL; end + # Will the logger output ERROR messages? + def error?; @level >= ERROR; end + # Will the logger output WARN messages? + def warn?; @level >= WARN; end + # Will the logger output INFO messages? + def info?; @level >= INFO; end + # Will the logger output DEBUG messages? + def debug?; @level >= DEBUG; end + + private + + ## + # Formats +arg+ for the logger + # + # * If +arg+ is an Exception, it will format the error message and + # the back trace. + # * If +arg+ responds to #to_str, it will return it. + # * Otherwise it will return +arg+.inspect. + def format(arg) + if arg.is_a?(Exception) + "#{arg.class}: #{AccessLog.escape(arg.message)}\n\t" << + arg.backtrace.join("\n\t") << "\n" + elsif arg.respond_to?(:to_str) + AccessLog.escape(arg.to_str) + else + arg.inspect + end + end + end + + ## + # A logging class that prepends a timestamp to each message. + + class Log < BasicLog + # Format of the timestamp which is applied to each logged line. The + # default is "[%Y-%m-%d %H:%M:%S]" + attr_accessor :time_format + + ## + # Same as BasicLog#initialize + # + # You can set the timestamp format through #time_format + def initialize(log_file=nil, level=nil) + super(log_file, level) + @time_format = "[%Y-%m-%d %H:%M:%S]" + end + + ## + # Same as BasicLog#log + def log(level, data) + tmp = Time.now.strftime(@time_format) + tmp << " " << data + super(level, tmp) + end + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/webrick-1.7.0/lib/webrick/server.rb b/vendor/bundle/ruby/3.1.0/gems/webrick-1.7.0/lib/webrick/server.rb new file mode 100644 index 000000000..fd6b7a61b --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/webrick-1.7.0/lib/webrick/server.rb @@ -0,0 +1,381 @@ +# frozen_string_literal: false +# +# server.rb -- GenericServer Class +# +# Author: IPR -- Internet Programming with Ruby -- writers +# Copyright (c) 2000, 2001 TAKAHASHI Masayoshi, GOTOU Yuuzou +# Copyright (c) 2002 Internet Programming with Ruby writers. All rights +# reserved. +# +# $IPR: server.rb,v 1.62 2003/07/22 19:20:43 gotoyuzo Exp $ + +require 'socket' +require_relative 'config' +require_relative 'log' + +module WEBrick + + ## + # Server error exception + + class ServerError < StandardError; end + + ## + # Base server class + + class SimpleServer + + ## + # A SimpleServer only yields when you start it + + def SimpleServer.start + yield + end + end + + ## + # A generic module for daemonizing a process + + class Daemon + + ## + # Performs the standard operations for daemonizing a process. Runs a + # block, if given. + + def Daemon.start + Process.daemon + File.umask(0) + yield if block_given? + end + end + + ## + # Base TCP server class. You must subclass GenericServer and provide a #run + # method. + + class GenericServer + + ## + # The server status. One of :Stop, :Running or :Shutdown + + attr_reader :status + + ## + # The server configuration + + attr_reader :config + + ## + # The server logger. This is independent from the HTTP access log. + + attr_reader :logger + + ## + # Tokens control the number of outstanding clients. The + # :MaxClients configuration sets this. + + attr_reader :tokens + + ## + # Sockets listening for connections. + + attr_reader :listeners + + ## + # Creates a new generic server from +config+. The default configuration + # comes from +default+. + + def initialize(config={}, default=Config::General) + @config = default.dup.update(config) + @status = :Stop + @config[:Logger] ||= Log::new + @logger = @config[:Logger] + + @tokens = Thread::SizedQueue.new(@config[:MaxClients]) + @config[:MaxClients].times{ @tokens.push(nil) } + + webrickv = WEBrick::VERSION + rubyv = "#{RUBY_VERSION} (#{RUBY_RELEASE_DATE}) [#{RUBY_PLATFORM}]" + @logger.info("WEBrick #{webrickv}") + @logger.info("ruby #{rubyv}") + + @listeners = [] + @shutdown_pipe = nil + unless @config[:DoNotListen] + raise ArgumentError, "Port must an integer" unless @config[:Port].to_s == @config[:Port].to_i.to_s + + @config[:Port] = @config[:Port].to_i + if @config[:Listen] + warn(":Listen option is deprecated; use GenericServer#listen", uplevel: 1) + end + listen(@config[:BindAddress], @config[:Port]) + if @config[:Port] == 0 + @config[:Port] = @listeners[0].addr[1] + end + end + end + + ## + # Retrieves +key+ from the configuration + + def [](key) + @config[key] + end + + ## + # Adds listeners from +address+ and +port+ to the server. See + # WEBrick::Utils::create_listeners for details. + + def listen(address, port) + @listeners += Utils::create_listeners(address, port) + end + + ## + # Starts the server and runs the +block+ for each connection. This method + # does not return until the server is stopped from a signal handler or + # another thread using #stop or #shutdown. + # + # If the block raises a subclass of StandardError the exception is logged + # and ignored. If an IOError or Errno::EBADF exception is raised the + # exception is ignored. If an Exception subclass is raised the exception + # is logged and re-raised which stops the server. + # + # To completely shut down a server call #shutdown from ensure: + # + # server = WEBrick::GenericServer.new + # # or WEBrick::HTTPServer.new + # + # begin + # server.start + # ensure + # server.shutdown + # end + + def start(&block) + raise ServerError, "already started." if @status != :Stop + server_type = @config[:ServerType] || SimpleServer + + setup_shutdown_pipe + + server_type.start{ + @logger.info \ + "#{self.class}#start: pid=#{$$} port=#{@config[:Port]}" + @status = :Running + call_callback(:StartCallback) + + shutdown_pipe = @shutdown_pipe + + thgroup = ThreadGroup.new + begin + while @status == :Running + begin + sp = shutdown_pipe[0] + if svrs = IO.select([sp, *@listeners]) + if svrs[0].include? sp + # swallow shutdown pipe + buf = String.new + nil while String === + sp.read_nonblock([sp.nread, 8].max, buf, exception: false) + break + end + svrs[0].each{|svr| + @tokens.pop # blocks while no token is there. + if sock = accept_client(svr) + unless config[:DoNotReverseLookup].nil? + sock.do_not_reverse_lookup = !!config[:DoNotReverseLookup] + end + th = start_thread(sock, &block) + th[:WEBrickThread] = true + thgroup.add(th) + else + @tokens.push(nil) + end + } + end + rescue Errno::EBADF, Errno::ENOTSOCK, IOError => ex + # if the listening socket was closed in GenericServer#shutdown, + # IO::select raise it. + rescue StandardError => ex + msg = "#{ex.class}: #{ex.message}\n\t#{ex.backtrace[0]}" + @logger.error msg + rescue Exception => ex + @logger.fatal ex + raise + end + end + ensure + cleanup_shutdown_pipe(shutdown_pipe) + cleanup_listener + @status = :Shutdown + @logger.info "going to shutdown ..." + thgroup.list.each{|th| th.join if th[:WEBrickThread] } + call_callback(:StopCallback) + @logger.info "#{self.class}#start done." + @status = :Stop + end + } + end + + ## + # Stops the server from accepting new connections. + + def stop + if @status == :Running + @status = :Shutdown + end + + alarm_shutdown_pipe {|f| f.write_nonblock("\0")} + end + + ## + # Shuts down the server and all listening sockets. New listeners must be + # provided to restart the server. + + def shutdown + stop + + alarm_shutdown_pipe(&:close) + end + + ## + # You must subclass GenericServer and implement \#run which accepts a TCP + # client socket + + def run(sock) + @logger.fatal "run() must be provided by user." + end + + private + + # :stopdoc: + + ## + # Accepts a TCP client socket from the TCP server socket +svr+ and returns + # the client socket. + + def accept_client(svr) + case sock = svr.to_io.accept_nonblock(exception: false) + when :wait_readable + nil + else + if svr.respond_to?(:start_immediately) + sock = OpenSSL::SSL::SSLSocket.new(sock, ssl_context) + sock.sync_close = true + # we cannot do OpenSSL::SSL::SSLSocket#accept here because + # a slow client can prevent us from accepting connections + # from other clients + end + sock + end + rescue Errno::ECONNRESET, Errno::ECONNABORTED, + Errno::EPROTO, Errno::EINVAL + nil + rescue StandardError => ex + msg = "#{ex.class}: #{ex.message}\n\t#{ex.backtrace[0]}" + @logger.error msg + nil + end + + ## + # Starts a server thread for the client socket +sock+ that runs the given + # +block+. + # + # Sets the socket to the :WEBrickSocket thread local variable + # in the thread. + # + # If any errors occur in the block they are logged and handled. + + def start_thread(sock, &block) + Thread.start{ + begin + Thread.current[:WEBrickSocket] = sock + begin + addr = sock.peeraddr + @logger.debug "accept: #{addr[3]}:#{addr[1]}" + rescue SocketError + @logger.debug "accept:
" + raise + end + if sock.respond_to?(:sync_close=) && @config[:SSLStartImmediately] + WEBrick::Utils.timeout(@config[:RequestTimeout]) do + begin + sock.accept # OpenSSL::SSL::SSLSocket#accept + rescue Errno::ECONNRESET, Errno::ECONNABORTED, + Errno::EPROTO, Errno::EINVAL + Thread.exit + end + end + end + call_callback(:AcceptCallback, sock) + block ? block.call(sock) : run(sock) + rescue Errno::ENOTCONN + @logger.debug "Errno::ENOTCONN raised" + rescue ServerError => ex + msg = "#{ex.class}: #{ex.message}\n\t#{ex.backtrace[0]}" + @logger.error msg + rescue Exception => ex + @logger.error ex + ensure + @tokens.push(nil) + Thread.current[:WEBrickSocket] = nil + if addr + @logger.debug "close: #{addr[3]}:#{addr[1]}" + else + @logger.debug "close:
" + end + sock.close + end + } + end + + ## + # Calls the callback +callback_name+ from the configuration with +args+ + + def call_callback(callback_name, *args) + @config[callback_name]&.call(*args) + end + + def setup_shutdown_pipe + return @shutdown_pipe ||= IO.pipe + end + + def cleanup_shutdown_pipe(shutdown_pipe) + @shutdown_pipe = nil + shutdown_pipe&.each(&:close) + end + + def alarm_shutdown_pipe + _, pipe = @shutdown_pipe # another thread may modify @shutdown_pipe. + if pipe + if !pipe.closed? + begin + yield pipe + rescue IOError # closed by another thread. + end + end + end + end + + def cleanup_listener + @listeners.each{|s| + if @logger.debug? + addr = s.addr + @logger.debug("close TCPSocket(#{addr[2]}, #{addr[1]})") + end + begin + s.shutdown + rescue Errno::ENOTCONN + # when `Errno::ENOTCONN: Socket is not connected' on some platforms, + # call #close instead of #shutdown. + # (ignore @config[:ShutdownSocketWithoutClose]) + s.close + else + unless @config[:ShutdownSocketWithoutClose] + s.close + end + end + } + @listeners.clear + end + end # end of GenericServer +end diff --git a/vendor/bundle/ruby/3.1.0/gems/webrick-1.7.0/lib/webrick/ssl.rb b/vendor/bundle/ruby/3.1.0/gems/webrick-1.7.0/lib/webrick/ssl.rb new file mode 100644 index 000000000..e448095a1 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/webrick-1.7.0/lib/webrick/ssl.rb @@ -0,0 +1,215 @@ +# frozen_string_literal: false +# +# ssl.rb -- SSL/TLS enhancement for GenericServer +# +# Copyright (c) 2003 GOTOU Yuuzou All rights reserved. +# +# $Id$ + +require 'webrick' +require 'openssl' + +module WEBrick + module Config + svrsoft = General[:ServerSoftware] + osslv = ::OpenSSL::OPENSSL_VERSION.split[1] + + ## + # Default SSL server configuration. + # + # WEBrick can automatically create a self-signed certificate if + # :SSLCertName is set. For more information on the various + # SSL options see OpenSSL::SSL::SSLContext. + # + # :ServerSoftware :: + # The server software name used in the Server: header. + # :SSLEnable :: false, + # Enable SSL for this server. Defaults to false. + # :SSLCertificate :: + # The SSL certificate for the server. + # :SSLPrivateKey :: + # The SSL private key for the server certificate. + # :SSLClientCA :: nil, + # Array of certificates that will be sent to the client. + # :SSLExtraChainCert :: nil, + # Array of certificates that will be added to the certificate chain + # :SSLCACertificateFile :: nil, + # Path to a CA certificate file + # :SSLCACertificatePath :: nil, + # Path to a directory containing CA certificates + # :SSLCertificateStore :: nil, + # OpenSSL::X509::Store used for certificate validation of the client + # :SSLTmpDhCallback :: nil, + # Callback invoked when DH parameters are required. + # :SSLVerifyClient :: + # Sets whether the client is verified. This defaults to VERIFY_NONE + # which is typical for an HTTPS server. + # :SSLVerifyDepth :: + # Number of CA certificates to walk when verifying a certificate chain + # :SSLVerifyCallback :: + # Custom certificate verification callback + # :SSLServerNameCallback:: + # Custom servername indication callback + # :SSLTimeout :: + # Maximum session lifetime + # :SSLOptions :: + # Various SSL options + # :SSLCiphers :: + # Ciphers to be used + # :SSLStartImmediately :: + # Immediately start SSL upon connection? Defaults to true + # :SSLCertName :: + # SSL certificate name. Must be set to enable automatic certificate + # creation. + # :SSLCertComment :: + # Comment used during automatic certificate creation. + + SSL = { + :ServerSoftware => "#{svrsoft} OpenSSL/#{osslv}", + :SSLEnable => false, + :SSLCertificate => nil, + :SSLPrivateKey => nil, + :SSLClientCA => nil, + :SSLExtraChainCert => nil, + :SSLCACertificateFile => nil, + :SSLCACertificatePath => nil, + :SSLCertificateStore => nil, + :SSLTmpDhCallback => nil, + :SSLVerifyClient => ::OpenSSL::SSL::VERIFY_NONE, + :SSLVerifyDepth => nil, + :SSLVerifyCallback => nil, # custom verification + :SSLTimeout => nil, + :SSLOptions => nil, + :SSLCiphers => nil, + :SSLStartImmediately => true, + # Must specify if you use auto generated certificate. + :SSLCertName => nil, + :SSLCertComment => "Generated by Ruby/OpenSSL" + } + General.update(SSL) + end + + module Utils + ## + # Creates a self-signed certificate with the given number of +bits+, + # the issuer +cn+ and a +comment+ to be stored in the certificate. + + def create_self_signed_cert(bits, cn, comment) + rsa = OpenSSL::PKey::RSA.new(bits){|p, n| + case p + when 0; $stderr.putc "." # BN_generate_prime + when 1; $stderr.putc "+" # BN_generate_prime + when 2; $stderr.putc "*" # searching good prime, + # n = #of try, + # but also data from BN_generate_prime + when 3; $stderr.putc "\n" # found good prime, n==0 - p, n==1 - q, + # but also data from BN_generate_prime + else; $stderr.putc "*" # BN_generate_prime + end + } + cert = OpenSSL::X509::Certificate.new + cert.version = 2 + cert.serial = 1 + name = (cn.kind_of? String) ? OpenSSL::X509::Name.parse(cn) + : OpenSSL::X509::Name.new(cn) + cert.subject = name + cert.issuer = name + cert.not_before = Time.now + cert.not_after = Time.now + (365*24*60*60) + cert.public_key = rsa.public_key + + ef = OpenSSL::X509::ExtensionFactory.new(nil,cert) + ef.issuer_certificate = cert + cert.extensions = [ + ef.create_extension("basicConstraints","CA:FALSE"), + ef.create_extension("keyUsage", "keyEncipherment, digitalSignature, keyAgreement, dataEncipherment"), + ef.create_extension("subjectKeyIdentifier", "hash"), + ef.create_extension("extendedKeyUsage", "serverAuth"), + ef.create_extension("nsComment", comment), + ] + aki = ef.create_extension("authorityKeyIdentifier", + "keyid:always,issuer:always") + cert.add_extension(aki) + cert.sign(rsa, "SHA256") + + return [ cert, rsa ] + end + module_function :create_self_signed_cert + end + + ## + #-- + # Updates WEBrick::GenericServer with SSL functionality + + class GenericServer + + ## + # SSL context for the server when run in SSL mode + + def ssl_context # :nodoc: + @ssl_context ||= begin + if @config[:SSLEnable] + ssl_context = setup_ssl_context(@config) + @logger.info("\n" + @config[:SSLCertificate].to_text) + ssl_context + end + end + end + + undef listen + + ## + # Updates +listen+ to enable SSL when the SSL configuration is active. + + def listen(address, port) # :nodoc: + listeners = Utils::create_listeners(address, port) + if @config[:SSLEnable] + listeners.collect!{|svr| + ssvr = ::OpenSSL::SSL::SSLServer.new(svr, ssl_context) + ssvr.start_immediately = @config[:SSLStartImmediately] + ssvr + } + end + @listeners += listeners + setup_shutdown_pipe + end + + ## + # Sets up an SSL context for +config+ + + def setup_ssl_context(config) # :nodoc: + unless config[:SSLCertificate] + cn = config[:SSLCertName] + comment = config[:SSLCertComment] + cert, key = Utils::create_self_signed_cert(2048, cn, comment) + config[:SSLCertificate] = cert + config[:SSLPrivateKey] = key + end + ctx = OpenSSL::SSL::SSLContext.new + ctx.key = config[:SSLPrivateKey] + ctx.cert = config[:SSLCertificate] + ctx.client_ca = config[:SSLClientCA] + ctx.extra_chain_cert = config[:SSLExtraChainCert] + ctx.ca_file = config[:SSLCACertificateFile] + ctx.ca_path = config[:SSLCACertificatePath] + ctx.cert_store = config[:SSLCertificateStore] + ctx.tmp_dh_callback = config[:SSLTmpDhCallback] + ctx.verify_mode = config[:SSLVerifyClient] + ctx.verify_depth = config[:SSLVerifyDepth] + ctx.verify_callback = config[:SSLVerifyCallback] + ctx.servername_cb = config[:SSLServerNameCallback] || proc { |args| ssl_servername_callback(*args) } + ctx.timeout = config[:SSLTimeout] + ctx.options = config[:SSLOptions] + ctx.ciphers = config[:SSLCiphers] + ctx + end + + ## + # ServerNameIndication callback + + def ssl_servername_callback(sslsocket, hostname = nil) + # default + end + + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/webrick-1.7.0/lib/webrick/utils.rb b/vendor/bundle/ruby/3.1.0/gems/webrick-1.7.0/lib/webrick/utils.rb new file mode 100644 index 000000000..a96d6f03f --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/webrick-1.7.0/lib/webrick/utils.rb @@ -0,0 +1,265 @@ +# frozen_string_literal: false +# +# utils.rb -- Miscellaneous utilities +# +# Author: IPR -- Internet Programming with Ruby -- writers +# Copyright (c) 2001 TAKAHASHI Masayoshi, GOTOU Yuuzou +# Copyright (c) 2002 Internet Programming with Ruby writers. All rights +# reserved. +# +# $IPR: utils.rb,v 1.10 2003/02/16 22:22:54 gotoyuzo Exp $ + +require 'socket' +require 'io/nonblock' +require 'etc' + +module WEBrick + module Utils + ## + # Sets IO operations on +io+ to be non-blocking + def set_non_blocking(io) + io.nonblock = true if io.respond_to?(:nonblock=) + end + module_function :set_non_blocking + + ## + # Sets the close on exec flag for +io+ + def set_close_on_exec(io) + io.close_on_exec = true if io.respond_to?(:close_on_exec=) + end + module_function :set_close_on_exec + + ## + # Changes the process's uid and gid to the ones of +user+ + def su(user) + if pw = Etc.getpwnam(user) + Process::initgroups(user, pw.gid) + Process::Sys::setgid(pw.gid) + Process::Sys::setuid(pw.uid) + else + warn("WEBrick::Utils::su doesn't work on this platform", uplevel: 1) + end + end + module_function :su + + ## + # The server hostname + def getservername + Socket::gethostname + end + module_function :getservername + + ## + # Creates TCP server sockets bound to +address+:+port+ and returns them. + # + # It will create IPV4 and IPV6 sockets on all interfaces. + def create_listeners(address, port) + unless port + raise ArgumentError, "must specify port" + end + sockets = Socket.tcp_server_sockets(address, port) + sockets = sockets.map {|s| + s.autoclose = false + ts = TCPServer.for_fd(s.fileno) + s.close + ts + } + return sockets + end + module_function :create_listeners + + ## + # Characters used to generate random strings + RAND_CHARS = "ABCDEFGHIJKLMNOPQRSTUVWXYZ" + + "0123456789" + + "abcdefghijklmnopqrstuvwxyz" + + ## + # Generates a random string of length +len+ + def random_string(len) + rand_max = RAND_CHARS.bytesize + ret = "" + len.times{ ret << RAND_CHARS[rand(rand_max)] } + ret + end + module_function :random_string + + ########### + + require "timeout" + require "singleton" + + ## + # Class used to manage timeout handlers across multiple threads. + # + # Timeout handlers should be managed by using the class methods which are + # synchronized. + # + # id = TimeoutHandler.register(10, Timeout::Error) + # begin + # sleep 20 + # puts 'foo' + # ensure + # TimeoutHandler.cancel(id) + # end + # + # will raise Timeout::Error + # + # id = TimeoutHandler.register(10, Timeout::Error) + # begin + # sleep 5 + # puts 'foo' + # ensure + # TimeoutHandler.cancel(id) + # end + # + # will print 'foo' + # + class TimeoutHandler + include Singleton + + ## + # Mutex used to synchronize access across threads + TimeoutMutex = Thread::Mutex.new # :nodoc: + + ## + # Registers a new timeout handler + # + # +time+:: Timeout in seconds + # +exception+:: Exception to raise when timeout elapsed + def TimeoutHandler.register(seconds, exception) + at = Process.clock_gettime(Process::CLOCK_MONOTONIC) + seconds + instance.register(Thread.current, at, exception) + end + + ## + # Cancels the timeout handler +id+ + def TimeoutHandler.cancel(id) + instance.cancel(Thread.current, id) + end + + def self.terminate + instance.terminate + end + + ## + # Creates a new TimeoutHandler. You should use ::register and ::cancel + # instead of creating the timeout handler directly. + def initialize + TimeoutMutex.synchronize{ + @timeout_info = Hash.new + } + @queue = Thread::Queue.new + @watcher = nil + end + + # :nodoc: + private \ + def watch + to_interrupt = [] + while true + now = Process.clock_gettime(Process::CLOCK_MONOTONIC) + wakeup = nil + to_interrupt.clear + TimeoutMutex.synchronize{ + @timeout_info.each {|thread, ary| + next unless ary + ary.each{|info| + time, exception = *info + if time < now + to_interrupt.push [thread, info.object_id, exception] + elsif !wakeup || time < wakeup + wakeup = time + end + } + } + } + to_interrupt.each {|arg| interrupt(*arg)} + if !wakeup + @queue.pop + elsif (wakeup -= now) > 0 + begin + (th = Thread.start {@queue.pop}).join(wakeup) + ensure + th&.kill&.join + end + end + @queue.clear + end + end + + # :nodoc: + private \ + def watcher + (w = @watcher)&.alive? and return w # usual case + TimeoutMutex.synchronize{ + (w = @watcher)&.alive? and next w # pathological check + @watcher = Thread.start(&method(:watch)) + } + end + + ## + # Interrupts the timeout handler +id+ and raises +exception+ + def interrupt(thread, id, exception) + if cancel(thread, id) && thread.alive? + thread.raise(exception, "execution timeout") + end + end + + ## + # Registers a new timeout handler + # + # +time+:: Timeout in seconds + # +exception+:: Exception to raise when timeout elapsed + def register(thread, time, exception) + info = nil + TimeoutMutex.synchronize{ + (@timeout_info[thread] ||= []) << (info = [time, exception]) + } + @queue.push nil + watcher + return info.object_id + end + + ## + # Cancels the timeout handler +id+ + def cancel(thread, id) + TimeoutMutex.synchronize{ + if ary = @timeout_info[thread] + ary.delete_if{|info| info.object_id == id } + if ary.empty? + @timeout_info.delete(thread) + end + return true + end + return false + } + end + + ## + def terminate + TimeoutMutex.synchronize{ + @timeout_info.clear + @watcher&.kill&.join + } + end + end + + ## + # Executes the passed block and raises +exception+ if execution takes more + # than +seconds+. + # + # If +seconds+ is zero or nil, simply executes the block + def timeout(seconds, exception=Timeout::Error) + return yield if seconds.nil? or seconds.zero? + # raise ThreadError, "timeout within critical session" if Thread.critical + id = TimeoutHandler.register(seconds, exception) + begin + yield(seconds) + ensure + TimeoutHandler.cancel(id) + end + end + module_function :timeout + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/webrick-1.7.0/lib/webrick/version.rb b/vendor/bundle/ruby/3.1.0/gems/webrick-1.7.0/lib/webrick/version.rb new file mode 100644 index 000000000..b62988bdb --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/webrick-1.7.0/lib/webrick/version.rb @@ -0,0 +1,18 @@ +# frozen_string_literal: false +#-- +# version.rb -- version and release date +# +# Author: IPR -- Internet Programming with Ruby -- writers +# Copyright (c) 2000 TAKAHASHI Masayoshi, GOTOU YUUZOU +# Copyright (c) 2003 Internet Programming with Ruby writers. All rights +# reserved. +# +# $IPR: version.rb,v 1.74 2003/07/22 19:20:43 gotoyuzo Exp $ + +module WEBrick + + ## + # The WEBrick version + + VERSION = "1.7.0" +end diff --git a/vendor/bundle/ruby/3.1.0/gems/webrick-1.7.0/webrick.gemspec b/vendor/bundle/ruby/3.1.0/gems/webrick-1.7.0/webrick.gemspec new file mode 100644 index 000000000..2aab85607 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/webrick-1.7.0/webrick.gemspec @@ -0,0 +1,74 @@ +# frozen_string_literal: true +begin + require_relative 'lib/webrick/version' +rescue LoadError + # for Ruby core repository + require_relative 'version' +end + +Gem::Specification.new do |s| + s.name = "webrick" + s.version = WEBrick::VERSION + s.summary = "HTTP server toolkit" + s.description = "WEBrick is an HTTP server toolkit that can be configured as an HTTPS server, a proxy server, and a virtual-host server." + + s.require_path = %w{lib} + s.files = [ + "Gemfile", + "LICENSE.txt", + "README.md", + "Rakefile", + "bin/console", + "bin/setup", + "lib/webrick.rb", + "lib/webrick/accesslog.rb", + "lib/webrick/cgi.rb", + "lib/webrick/compat.rb", + "lib/webrick/config.rb", + "lib/webrick/cookie.rb", + "lib/webrick/htmlutils.rb", + "lib/webrick/httpauth.rb", + "lib/webrick/httpauth/authenticator.rb", + "lib/webrick/httpauth/basicauth.rb", + "lib/webrick/httpauth/digestauth.rb", + "lib/webrick/httpauth/htdigest.rb", + "lib/webrick/httpauth/htgroup.rb", + "lib/webrick/httpauth/htpasswd.rb", + "lib/webrick/httpauth/userdb.rb", + "lib/webrick/httpproxy.rb", + "lib/webrick/httprequest.rb", + "lib/webrick/httpresponse.rb", + "lib/webrick/https.rb", + "lib/webrick/httpserver.rb", + "lib/webrick/httpservlet.rb", + "lib/webrick/httpservlet/abstract.rb", + "lib/webrick/httpservlet/cgi_runner.rb", + "lib/webrick/httpservlet/cgihandler.rb", + "lib/webrick/httpservlet/erbhandler.rb", + "lib/webrick/httpservlet/filehandler.rb", + "lib/webrick/httpservlet/prochandler.rb", + "lib/webrick/httpstatus.rb", + "lib/webrick/httputils.rb", + "lib/webrick/httpversion.rb", + "lib/webrick/log.rb", + "lib/webrick/server.rb", + "lib/webrick/ssl.rb", + "lib/webrick/utils.rb", + "lib/webrick/version.rb", + "webrick.gemspec", + ] + s.required_ruby_version = ">= 2.3.0" + + s.authors = ["TAKAHASHI Masayoshi", "GOTOU YUUZOU", "Eric Wong"] + s.email = [nil, nil, 'normal@ruby-lang.org'] + s.homepage = "https://github.com/ruby/webrick" + s.licenses = ["Ruby", "BSD-2-Clause"] + + if s.respond_to?(:metadata=) + s.metadata = { + "bug_tracker_uri" => "https://github.com/ruby/webrick/issues", + } + end + + s.add_development_dependency "rake" +end diff --git a/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/.dockerignore b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/.dockerignore new file mode 100644 index 000000000..430567f25 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/.dockerignore @@ -0,0 +1,2 @@ +doc +.yardoc diff --git a/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/.gitattributes b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/.gitattributes new file mode 100644 index 000000000..a46310098 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/.gitattributes @@ -0,0 +1,4 @@ +# Auto detect text files and perform LF normalization +* text eol=lf + +*.png binary diff --git a/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/.github/FUNDING.yml b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/.github/FUNDING.yml new file mode 100644 index 000000000..84d68b54f --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/.github/FUNDING.yml @@ -0,0 +1,3 @@ +# These are supported funding model platforms + +github: lsegal diff --git a/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/.github/ISSUE_TEMPLATE.md b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/.github/ISSUE_TEMPLATE.md new file mode 100644 index 000000000..d80f9c061 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/.github/ISSUE_TEMPLATE.md @@ -0,0 +1,33 @@ +[Describe your issue here. Try to be as specific as possible so we can find +the root cause more quickly!] + +## Steps to reproduce + +This is the minimal reproduction for the issue. I've done my best to remove +all extraneous code and unique environment state on my machine before providing +these steps: + +1. Run the following command: `yard doc --no-private` +2. Open browser to (URL)... +3. Click on Method List link. + +## Actual Output + +[Provide the full output (**please run yard with `--debug`**) or screenshots for +visual issues.] + +## Expected Output + +[Describe what you *expected* to happen.] + +## Environment details: + +- OS: [Enter operating system / version here] +- Ruby version (`ruby -v`): [Enter output of `ruby -v`] +- YARD version (`yard -v`): [Enter output of `yard -v`] +- Relevant software dependency/versions: + - [Any 3rd party libs required to reproduce, omit if none] + +I have read the [Contributing Guide][contrib]. + +[contrib]: https://github.com/lsegal/yard/blob/main/CONTRIBUTING.md diff --git a/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/.github/PULL_REQUEST_TEMPLATE.md b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/.github/PULL_REQUEST_TEMPLATE.md new file mode 100644 index 000000000..207b244ed --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/.github/PULL_REQUEST_TEMPLATE.md @@ -0,0 +1,12 @@ +# Description + +Describe your pull request and problem statement here. + +# Completed Tasks + +- [ ] I have read the [Contributing Guide][contrib]. +- [ ] The pull request is complete (implemented / written). +- [ ] Git commits have been cleaned up (squash WIP / revert commits). +- [ ] I wrote tests and ran `bundle exec rake` locally (if code is attached to PR). + +[contrib]: https://github.com/lsegal/yard/blob/main/CONTRIBUTING.md diff --git a/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/.github/workflows/ci.yml b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/.github/workflows/ci.yml new file mode 100644 index 000000000..7fdf8cb6b --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/.github/workflows/ci.yml @@ -0,0 +1,30 @@ +name: Unit Tests + +on: [push, pull_request, workflow_dispatch] +jobs: + build: + name: "Ruby: ${{ matrix.ruby }} OS: ${{ matrix.os }}" + runs-on: ${{ matrix.os }} + strategy: + fail-fast: false + matrix: + os: [ubuntu-20.04, macos-10.15, windows-2019] + # 3.0 is interpreted as 3 + ruby: [2.2, 2.3, 2.4, 2.5, 2.6, 2.7, "3.0"] + exclude: + - { os: windows-2019 , ruby: 2.2 } + - { os: windows-2019 , ruby: 2.3 } + steps: + - name: Checkout + uses: actions/checkout@v2 + - name: Install Ruby & 'bundle install' + uses: ruby/setup-ruby@v1 + with: + ruby-version: ${{ matrix.ruby }} + bundler-cache: true + - name: Run Test + run: | + ruby -v + bundle exec rake + env: + CI: true diff --git a/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/.github/workflows/gem.yml b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/.github/workflows/gem.yml new file mode 100644 index 000000000..4af10a62a --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/.github/workflows/gem.yml @@ -0,0 +1,19 @@ +name: Release Version + +on: + push: + tags: + - "v*" + +jobs: + release_version: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + - uses: lsegal/github-release-from-changelog-action@latest + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + - name: Publish RubyGem + uses: dawidd6/action-publish-gem@v1 + with: + api_key: ${{secrets.RUBYGEMS_API_KEY}} diff --git a/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/.gitignore b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/.gitignore new file mode 100644 index 000000000..5fb06209c --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/.gitignore @@ -0,0 +1,14 @@ +_Yardoc +.DS_Store +*.rbc +*.pdf +.yardoc +*.gem +Gemfile.lock +/pkg +/doc +/doc_guide +/coverage +/.bundle +/vendor +spec/examples.txt diff --git a/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/.rspec b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/.rspec new file mode 100644 index 000000000..83e16f804 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/.rspec @@ -0,0 +1,2 @@ +--color +--require spec_helper diff --git a/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/.rubocop.yml b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/.rubocop.yml new file mode 100644 index 000000000..97ef7ad09 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/.rubocop.yml @@ -0,0 +1,112 @@ +#inherit_from: +# - .rubocop_todo.yml + +Metrics: + Enabled: false +Layout/LineLength: + AutoCorrect: true + Max: 100 +Style/Semicolon: + AllowAsExpressionSeparator: true +Style/Documentation: + Enabled: false +Style/ClassVars: + Enabled: false +Style/HashSyntax: + EnforcedStyle: hash_rockets +Layout/SpaceInsideHashLiteralBraces: + EnforcedStyle: no_space +Layout/SpaceInsideBlockBraces: + SpaceBeforeBlockParameters: false +Style/NumericPredicate: # ruby 1.8/1.9 do not have positive?/negative? + EnforcedStyle: comparison +Layout/MultilineMethodCallIndentation: + EnforcedStyle: indented +Layout/DotPosition: + EnforcedStyle: trailing +Style/FormatString: + EnforcedStyle: percent +Layout/FirstArrayElementIndentation: + EnforcedStyle: consistent +Layout/FirstHashElementIndentation: + EnforcedStyle: consistent + +# Disable these until we know what to do with them +Style/SafeNavigation: + Enabled: false # not supported in 1.8...2.1 +Style/GuardClause: # does not provide much value + Enabled: false +Naming/VariableNumber: + Enabled: false +Naming/AccessorMethodName: # this creates breaking changes in the API + Enabled: false +Naming/PredicateName: # this creates breaking changes in the API + Enabled: false +Style/MethodMissingSuper: # this doesn't exist in 1.8/1.9 + Enabled: false +Style/MissingRespondToMissing: # this doesn't exist in 1.8/1.9 + Enabled: false +Style/Lambda: # not supported in 1.8 + Enabled: false +Style/EachWithObject: # not supported in 1.8 + Enabled: false +Layout/ParameterAlignment: # does not work correctly with subsequent block + Enabled: false +Layout/ArrayAlignment: # does not support indentation + Enabled: false +Layout/HashAlignment: # does not support indentation + Enabled: false +Style/MultilineTernaryOperator: + Enabled: false +Style/ClassAndModuleChildren: + Enabled: false +Layout/EmptyLineBetweenDefs: + AllowAdjacentOneLineDefs: true +Style/SingleLineMethods: + Enabled: false +Style/SingleLineBlockParams: + Enabled: false +Style/NestedTernaryOperator: + Enabled: false +Style/MutableConstant: + Enabled: false +Style/WhenThen: + Enabled: false +Style/StringLiterals: + Enabled: false +Style/StringLiteralsInInterpolation: + Enabled: false +Style/PerlBackrefs: + Enabled: false +Style/BlockComments: + Exclude: + - benchmarks/*.rb +Style/CaseEquality: + Enabled: false +Style/WordArray: + Enabled: false +Style/GlobalVars: + Exclude: + - benchmarks/**/*.rb + - spec/**/*.rb +Lint/RedundantSplatExpansion: + Enabled: false +Security/Eval: + Exclude: + - benchmarks/**/*.rb + - spec/**/*.rb + +Layout/SpaceAroundMethodCallOperator: + Enabled: false +Lint/RaiseException: + Enabled: false +Lint/StructNewOverride: + Enabled: false +Style/ExponentialNotation: + Enabled: false +Style/HashEachMethods: + Enabled: false +Style/HashTransformKeys: + Enabled: false +Style/HashTransformValues: + Enabled: false diff --git a/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/.yardopts b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/.yardopts new file mode 100644 index 000000000..fbd925d56 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/.yardopts @@ -0,0 +1,26 @@ +--protected +--no-private +--embed-mixin ClassMethods +--exclude /server/templates/ +--exclude /yard/rubygems/ +--asset docs/images:images +--tag yard.signature:"YARD Tag Signature" +--type-name-tag yard.tag:"YARD Tag" +--type-name-tag yard.directive:"YARD Directive" +--hide-tag yard.tag +--hide-tag yard.directive +--hide-tag yard.signature +--load ./docs/templates/plugin.rb +- +CHANGELOG.md +docs/WhatsNew.md +docs/GettingStarted.md +docs/Tags.md +docs/Overview.md +docs/CodeObjects.md +docs/Parser.md +docs/Handlers.md +docs/TagsArch.md +docs/Templates.md +LICENSE +LEGAL diff --git a/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/.yardopts_guide b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/.yardopts_guide new file mode 100644 index 000000000..69c61de6f --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/.yardopts_guide @@ -0,0 +1,19 @@ +-t guide +--title YARD +-o doc_guide +--exclude /server/templates/ +--exclude /yard/rubygems/ +--asset docs/images:images +- +CHANGELOG.md +docs/WhatsNew.md +docs/GettingStarted.md +docs/Tags.md +docs/Overview.md +docs/CodeObjects.md +docs/Parser.md +docs/Handlers.md +docs/TagsArch.md +docs/Templates.md +LICENSE +LEGAL diff --git a/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/.yardopts_i18n b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/.yardopts_i18n new file mode 100644 index 000000000..e388fb076 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/.yardopts_i18n @@ -0,0 +1,23 @@ +--protected +--no-private +--exclude /server/templates/ +--exclude /yard/rubygems/ +--asset docs/images:images +--tag yard.signature:"YARD Tag Signature" +--type-name-tag yard.tag:"YARD Tag" +--type-name-tag yard.directive:"YARD Directive" +--hide-tag yard.tag +--hide-tag yard.directive +--hide-tag yard.signature +--load ./docs/templates/plugin.rb +- +CHANGELOG.md +docs/WhatsNew.md +docs/GettingStarted.md +docs/Tags.md +docs/Overview.md +docs/CodeObjects.md +docs/Parser.md +docs/Handlers.md +docs/TagsArch.md +docs/Templates.md diff --git a/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/CHANGELOG.md b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/CHANGELOG.md new file mode 100644 index 000000000..e5516a2da --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/CHANGELOG.md @@ -0,0 +1,827 @@ +# main + +# 0.9.27 - November 29th, 2021 + +[0.9.27]: https://github.com/lsegal/yard/compare/v0.9.26...v0.9.27 + +- Add support for Ruby 3.0 endless method definitions. (#1376, #1381) +- Add existence check for README file (#1367) +- Support module_function decorator (#1365) +- Add CommonMarker markup support (`-m commonmarker`) (#1157, #1388) +- Fix nested array parsing (#1389) +- Add WEBrick as a runtime dependency for Ruby 3.0 support (#1400) +- Support `fail_on_warning` option in `yard stats` command (#1392) +- Better integration with Sorbet (#1401) +- Handle include mixins on complex paths (#1386) +- Fix `@!scope` maintaining state in lone comment blocks (#1411) +- Remove support for Travis CI + +# 0.9.26 - December 26th, 2020 + +[0.9.26]: https://github.com/lsegal/yard/compare/v0.9.25...v0.9.26 + +- Add support for Ruby 3.0 and fix tests +- Fix support for `frozen_string_literal: false` magic comments (#1363) + +# 0.9.25 - May 3rd, 2020 + +[0.9.25]: https://github.com/lsegal/yard/compare/v0.9.24...v0.9.25 + +- Fix parsing issue with conditional blocks mixed with conditional modifiers. + (#1308, #1324, #1326, #1327) +- Add table of contents IDs to redcarpet generated markdown. (#1323) +- Backport fixes for Ruby 1.9 (#1320) +- Fix parsing of checksums in yard server (#1301) +- Map Ruby C variable error names to Ruby classes (#1270, #1275) +- Fix initialization of RDocMarkup across threads (#1318) +- Remove warning for Kernel#open (#1312) +- Omit spec files in gem package (#1307) +- README updates (#1322) + +# 0.9.24 - January 8th, 2020 + +[0.9.24]: https://github.com/lsegal/yard/compare/v0.9.23...v0.9.24 + +- Add {YARD::CodeObjects::NamespaceMapper.on_invalidate} callback when separator + cache is changed. +- Fix issue where Registry fails to resolve first-time lookups on instance methods. + +# 0.9.23 - January 5th, 2020 + +[0.9.23]: https://github.com/lsegal/yard/compare/v0.9.22...v0.9.23 + +- Fix issues with double encoded code blocks when highlighted from an extra + file. + +# 0.9.22 - December 31st, 2019 + +[0.9.22]: https://github.com/lsegal/yard/compare/v0.9.21...v0.9.22 + +- Revert jquery update in last release since it requires more changes. (#1298) + +# 0.9.21 - December 31st, 2019 + +[0.9.21]: https://github.com/lsegal/yard/compare/v0.9.20...v0.9.21 + +- Updates to add support for Ruby 2.7.0 (#1290, #1296) +- Fix parsing of multiline method signatures (#1220) +- Remove RubyGems post install message (#1269) +- Improve object deletion from RegistryStore (#1284) +- Improve memory usage performance (#1260) +- Handle include and extend calls with explicit receivers (#1274) +- Fix deep nesting of TOC items (#1288) +- Fix highlighting for Asciidoc markup code blocks (#1276) +- Fix HTML formatting of script tags (#1263) +- Update jquery to 3.4.1 (#1294) +- Test fixes (#1244) + +# 0.9.20 - June 27th, 2019 + +[0.9.20]: https://github.com/lsegal/yard/compare/v0.9.19...v0.9.20 + +- Fix parsing of stringified Symbols in Ruby source (#1256). +- Fix path traversal vulnerability in `yard server`. This bug would allow + unsanitized HTTP requests to access arbitrary files on the machine of a + `yard server` host under certain conditions. Thanks to CuongMX from + Viettel Cyber Security for discovering this vulnerability. + +# 0.9.19 - April 2nd, 2019 + +[0.9.19]: https://github.com/lsegal/yard/compare/v0.9.16...v0.9.19 + +- Fixed bug in browser back button (#1071, #1228) +- Fixed handling of ArgumentError in ExtraFileObject (#1198) +- Fixed double return tag displaying on boolean methods (#1226) +- Removed unused `Module#namespace_name` function (#1229) +- Fixed parsing order of README files. YARD will now prefer README over + README.md over README.x.md or README-x.md (and the like). READMEs will now + also be ordered by filename; the first README is still chosen unless + `--readme` is provided. +- Updated AsciiDoc markup support to use non-deprecated calls. + +# [0.9.16] - August 11th, 2018 + +[0.9.16]: https://github.com/lsegal/yard/compare/v0.9.15...v0.9.16 + +- Documentation fixes (#1175, #1178). +- Fixed stack overflow issue when parsing extremely large lists (#1176). + +# [0.9.15] - July 17th, 2018 + +[0.9.15]: https://github.com/lsegal/yard/compare/v0.9.14...v0.9.15 + +- Fixed security issue in parsing of Ruby code that could allow for arbitrary + execution. Credit to Nelson Elhage for discovering this + issue. + +# [0.9.14] - June 2nd, 2018 + +[0.9.14]: https://github.com/lsegal/yard/compare/v0.9.13...v0.9.14 + +- Fixed a regression in symbol parsing (#1170). + +# [0.9.13] - May 28th, 2018 + +[0.9.13]: https://github.com/lsegal/yard/compare/v0.9.12...v0.9.13 + +- Added support for grouped constants via `@!group` directive (#1056). +- Added support for quoted symbols (#1168). +- Added support for i18n in tag text (#1169). +- Fixed HTML rendering of inline code blocks (#1152). +- Fixed rendering of anchor URLs in rendered HTML (#1154). + +# [0.9.12] - November 26th, 2017 + +[0.9.12]: https://github.com/lsegal/yard/compare/v0.9.11...v0.9.12 + +- Be more explicit about lack of support for absolute paths in extra files + specified by `yard doc` command. + +# [0.9.11] - November 23rd, 2017 + +[0.9.11]: https://github.com/lsegal/yard/compare/v0.9.10...v0.9.11 + +- Fixed security issue in `--readme` that allowed for arbitrary file reads on + disk. Credit to ztz for discovering this issue. +- Improved styling for inline code blocks (#1142). + +# [0.9.10] - November 18th, 2017 + +[0.9.10]: https://github.com/lsegal/yard/compare/v0.9.9...v0.9.10 + +- Added `--fail-on-warning` option for `yard doc` which exits with a non-zero + code if there are any warnings (#1093). +- Added support for parsing inside `Struct.new` blocks (#1099). +- Added support new ripper AST tokens (#1104, #1124). +- Fixed an issue where `@see (obj)` reference tags would fail (#1111) +- Fix sorting in `yard stats` (#1123). + +# [0.9.9] - April 23rd, 2017 + +[0.9.9]: https://github.com/lsegal/yard/compare/v0.9.8...v0.9.9 + +- Added `gem uninstall` hooks to remove YARD documentation files. (#1083) +- Added support for C++ namespaces. (#809) +- Fixed issue where loading a .html page via an anchor would not scroll to + the anchor section. (#1082) +- Hide some Ruby warnings. +- Improve progress indicator icons in terminal. + +# [0.9.8] - January 13th, 2017 + +[0.9.8]: https://github.com/lsegal/yard/compare/v0.9.7...v0.9.8 + +- Fixed installed gems not being correctly found in `yard server` and by plugins. +- Fixed tokenization of `%w(...)` array syntax. + +# [0.9.7] - January 9th, 2017 + +[0.9.7]: https://github.com/lsegal/yard/compare/v0.9.6...v0.9.7 + +- Fixed resolution of absolute object paths with ambiguous names. (#1029) + +# [0.9.6] - January 7th, 2017 + +[0.9.6]: https://github.com/lsegal/yard/compare/v0.9.5...v0.9.6 + +- Removed official support for Ruby 1.x (1.8/1.9). YARD can still be installed + in these versions, but support is not guaranteed. Simple bug fixes may still + be considered via pull request only. Issues without code will be automatically + closed. +- Added {YARD::Tags::Tag#explain_types} returning a plain English summary + of the type specification of a given tag. Also adds {YARD::Tags::TypesExplainer} + as an implementation class for the method. +- Added support for automatic linking of constants and method calls of + Ruby syntax highlighted source code in generated HTML. Also adds the + {YARD::Parser::Ruby::TokenResolver} implementation class to iterate over + tokenized code with extra resolved object information. +- Added support for compound constant assignments (`A::B::C = true`). +- Added `LibraryVersion#yardoc_file_for_SOURCE` callback method for sources with + a pre-determined yardoc file location. Implement this method instead of + manually setting `library.yardoc_file = ...` in your load method (you can + still assign the attribute manually). +- Use RubyGems 2.x+ API to query gems when available instead of using backport. +- Various bug fixes + +# [0.9.5] - July 22nd, 2016 + +[0.9.5]: https://github.com/lsegal/yard/compare/v0.9.4...v0.9.5 + +- `yard doc` will now generate `.yardoc/processing` and `.yardoc/complete` files + to allow other tools to properly detect when YARD is in the middle of parsing + source files, and when it has completed writing the database. +- Added support for on-demand generation of LibraryVersion objects using the + `:disk` source type. LibraryVersion objects pointing to a .yardoc database + directory will now auto-generate if there is a `source_path` attached. +- Added warning for macros attached to non-method objects. +- Fixed a few more parsing errors. + +# [0.9.4] - July 21st, 2016 + +[0.9.4]: https://github.com/lsegal/yard/compare/v0.9.3...v0.9.4 + +- Minor Ruby file parsing and CSS bug fixes. + +# [0.9.3] - July 20th, 2016 + +[0.9.3]: https://github.com/lsegal/yard/compare/v0.9.2...v0.9.3 + +- Added support for {YARD::Server::RackAdapter} to be mounted under prefix URIs. +- Fixed regression in `yard server -g` that caused static file assets on index + page to return 404 errors. +- Fixed regression in `yard server -g` index page that disabled scrolling and + caused other HTML rendering glitches. + +# [0.9.2] - July 19th, 2016 + +[0.9.2]: https://github.com/lsegal/yard/compare/v0.9.1...v0.9.2 + +- Added `yard config --gem-install-[yri|yard]` commands which auto-configure + your `~/.gemrc` file to run yri/yard instead of ri/rdoc on a `gem install`. +- Added support for gemspec metadata key `"yard.run"`, which can be either + `"yard"` or `"yri"` to run the respective commands on a `gem install`. +- Added `yard doc --no-progress` to hide the progress bar. +- Fix resolution error for compound proxy namespaces. +- YRI will now search across all gem versions (latest first) for the .yardoc + database. + +# [0.9.1] - July 18th, 2016 + +[0.9.1]: https://github.com/lsegal/yard/compare/v0.9.0...v0.9.1 + +- Added "Attributes" section to `yard stats`. +- Added support for RubyGems 2.x `--document=yri,yard` flags. You can now run + YARD documentation generation against installed gems by running: + `gem install mygem --document=yard,yri`. +- Added `/static/*` routing for library-specific routing. This enables static + template files to be served on a per-library basis instead of globally shared + across the `yard server`. +- Added support for inlining of `{include:*}` syntax. Using this syntax in + the middle of a docstring paragraph will no longer create a separate paragraph + for the included text. +- Added support for resolving `{}` syntax in text templates, specifically for + use in `{include:*}` syntax. +- Improved object resolution logic in `{Foo::Bar}` syntax and {YARD::Registry.resolve}. + New resolution logic should now more accurately support resolving compound paths + across namespaces and through the inheritance tree (as Ruby does). +- The `frozen_string_literal: true` comment line in Ruby source files will now be + excluded from docstrings. +- Added a workaround for https://bugs.ruby-lang.org/issues/11485 +- Fixed an issue where type using a docstring reference on an `@!attribute` macro + would be incorrectly parsed as a type specifier. This change updates the tag + parser to disallow newlines between the tag name and opening bracket of the + type specification. +- Fixed an issue where `--embed-mixins` would improperly embed methods from + inherited classes instead of modules. +- Fixed various parsing errors and YARD exceptions. +- Added a warning for modules or classes being redefined as constants. +- Reverted stripping of HTML in {YARD::Docstring#summary}. +- Added optimization to remove initial docstring parse on newly created code objects. +- {YARD::CodeObjects::Base#format} now passes the :type parameter to templates. +- Hide methods with filtered namespaces in Method Listing. + +# [0.9.0] - July 4th, 2016 + +[0.9.0]: https://github.com/lsegal/yard/compare/v0.8.7.6...v0.9.0 + +Special thanks to Alex Dowad, MSP-Greg, and Alex McLain for their extended +contributions to this version. + +- (Breaking Change): Replaced default template with an updated "frameless" version. + This change may affect backward compatibility if custom templates made modifications + to `default/fulldoc/html`, specifically the index or navigation lists. +- Added support for Ruby 2.1+ decorator style method declaration syntax. YARD now + supports: + private def foo(x, y) end +- Metadata headers in extra files can now be escaped from rendering by enclosing them + in HTML comment blocks (``). Ensure that the opening + comment tag is alone on the first line of the file to use this functionality. +- Improved parsing of various CRuby coding styles. +- Fixed issue with binary image assets when using `yard server`. +- Fixed deprecation warnings from Rake 10.x. +- Tests updated for RSpec 3. + +# [0.8.7.6] - October 26, 2014 + +[0.8.7.6]: https://github.com/lsegal/yard/compare/v0.8.7.5...v0.8.7.6 + +- Support using `@option` tag on keyword arg splat parameter. (#729) +- Add `.stats_options` for `YardocTask`. (#800, #801) + +# [0.8.7.5] - October 26, 2014 + +[0.8.7.5]: https://github.com/lsegal/yard/compare/v0.8.7.4...v0.8.7.5 + +- Fix linking of methods in top level namespace in method listing. (#776) +- Support using C macros in function declarations. (#810) +- YARD will no longer group comment blocks starting on the same column if they + are preceded by code. (#798) +- Handle anonymous lambda calls in toplevel scope. (#774) +- Support I18n in `@overload` tags. (#794) +- Support `yard stats` for objects with no file property. (#792) +- Support for named arguments in Ruby >= 2.1. (#785) +- Exclude README backup files from YARD generation. (#790) +- Turned on the lax spacing option in Redcarpet to comply with the + Markdown standard. +- Escape HTML in YARD server search placeholder template. +- Fix issue with `private_class_method` support. (#760, #767) +- Enable tables support by default in Redcarpet Markdown provider. (#765) + +# 0.8.7.4 - March 22, 2014 + +[0.8.7.4]: https://github.com/lsegal/yard/compare/v0.8.7.3...v0.8.7.4 + +- Mark C methods as explicit but also remove explicit check in stats. (#727) +- Report unresolved parent namespaces as undocumentable errors instead. (#753) +- No longer ignore overridden methods from documentation check in stats (#719) +- Fix JRuby throwing exception when remove_method called on non-existent method. (#732) +- Add basic support for `private_class_method` (#747) +- Ensure namespace is always set when parent module is not found. (#753) +- Set overflow as auto on table of contents. +- Report 100% documented if nothing is undocumented. (#754) +- Added support for RubyGems 2.0.0+. (#742) +- Allow users to enter their own YARD RakeTask name. (#705) +- Fixed a typo that was causing Windows detection to always fail. (#715) +- Add debug information when loading a plugin fails. (#711) + +# [0.8.7.3] - November 1, 2013 + +[0.8.7.3]: https://github.com/lsegal/yard/compare/v0.8.7.2...v0.8.7.3 + +- Handle Unicode method/class/file names in server URL encoding (lsegal/rubydoc.info#69). +- Style keyword style hashes with same symbol color in code highlighting (#707). +- Fix broken JS when visiting docs in file:// scheme (#706). +- Add support for new AsciiDoc file extensions (#704). +- Fix issues where non-Ruby code blocks would not display in Ruby 2 (#702). +- Add support for extra Ruby 2 symbol types in Ripper (#701). +- Ensure config directory exists before saving config file (#700). + +# [0.8.7.2] - September 18, 2013 + +[0.8.7.2]: https://github.com/lsegal/yard/compare/v0.8.7.1...v0.8.7.2 + +- Disallow absolute URLs when using frame anchor support. +- Support casted functions in CRuby method declarations (#697) + +# [0.8.7.1] - September 11, 2013 + +[0.8.7.1]: https://github.com/lsegal/yard/compare/v0.8.7...v0.8.7.1 + +- Fix potential XSS issue with frame anchor support. +- Add support for gettext 3.x gem. + +# [0.8.7] - July 26, 2013 + +[0.8.7]: https://github.com/lsegal/yard/compare/v0.8.6.2...v0.8.7 + +- Added `--hide-api API` option to hide objects with a given `@api` tag (#685). +- Added "Returns ...." prefix to summary when a lone @return tag is used. +- Fixed issue that caused ref tags to be added to a docstring twice (#678). +- Fixed formatting issue in docstring summaries (#686) + +# [0.8.6.2] - June 27, 2013 + +[0.8.6.2]: https://github.com/lsegal/yard/compare/v0.8.6.1...v0.8.6.2 + +- Fixed issue where `yard graph` was not displaying methods + +# [0.8.6.1] - April 14, 2013 + +[0.8.6.1]: https://github.com/lsegal/yard/compare/v0.8.6...v0.8.6.1 + +- Fixed broken links in File menu on default HTML template +- Added --layout switch to `yard display` to wrap output in layout template. +- See {file:docs/WhatsNew.md} for more information on added features. + +# [0.8.6] - April 13, 2013 + +[0.8.6]: https://github.com/lsegal/yard/compare/v0.8.5.2...v0.8.6 + +- Various fixes and improved Ruby 2.x compatibility support +- Added support for `asciidoc` markup type +- Added `yard markups` command to list available markup types +- Added `yard display` command to display and format an individual object +- See {file:docs/WhatsNew.md} for more information on added features. + +# [0.8.5.2] - February 26, 2013 + +[0.8.5.2]: https://github.com/lsegal/yard/compare/v0.8.5.1...v0.8.5.2 + +- Support new keyword argument syntax in method signatures (Ruby 2.x) + +# [0.8.5.1] - February 25, 2013 + +[0.8.5.1]: https://github.com/lsegal/yard/compare/v0.8.5...v0.8.5.1 + +- Fix `yard diff` of gem files with RubyGems 2.x + +# [0.8.5] - February 24, 2013 + +[0.8.5]: https://github.com/lsegal/yard/compare/v0.8.4.1...v0.8.5 + +- Basic support for Ruby 2.0 (fix compat issues in RDoc 4.0, RubyGems 2.0) +- Add CSS styling for tables in default HTML template + +# [0.8.4.1] - February 5, 2013 + +[0.8.4.1]: https://github.com/lsegal/yard/compare/v0.8.4...v0.8.4.1 + +- Fix regression that broke loading of existing yardoc dbs (#648) + +# [0.8.4] - February 4, 2013 + +[0.8.4]: https://github.com/lsegal/yard/compare/v0.8.3...v0.8.4 + +- Add `-B/--bind` switch to yard server (#593, #608) +- Add CodeObjects::Base#title for plugins to customize how object + links display (#646) +- Disable linking objects filtered out by verifiers (#645) +- Allow macro expansion on class methods (#632) +- Expand newly attached macro on first DSL method call (#631) +- Disable RubyGems plugin in Ruby 2.0 (#627) +- Fix line range for class/module node bodies (#626) +- Search extended modules for attached DSL macros (#553) + +# [0.8.3] - October 14, 2012 + +[0.8.3]: https://github.com/lsegal/yard/compare/v0.8.2.1...v0.8.3 + +- Add `--non-transitive-tag` to disable tag transitivity (#571) +- Support --db inside .yardopts for graph/server commands (#583, #586) +- Fix handling for =begin/=end docstrings (#577, #578) +- Parser only sorts file lists when a glob is provided (#572) +- Fix formatting in `{include:Object#method}` syntax (#569) +- Fix @option tag inside of module functions (#563) +- Fix to `--api` and `--no-api` support (#559) +- Fix class nesting issues when path starts with "::" (#552) + +# [0.8.2.1] - June 9, 2012 + +[0.8.2.1]: https://github.com/lsegal/yard/compare/v0.8.2...v0.8.2.1 + +- Fix a set of regressions in yard server search and dynamic generation + +# [0.8.2] - June 7, 2012 + +[0.8.2]: https://github.com/lsegal/yard/compare/v0.8.1...v0.8.2 + +- Added progress style output in tty terminals +- Embedded mixins should ignore methods defined on module (#539) +- Fixed permalinks for embedded mixins in `yard server` (#540) +- Improve parsing in CRuby code (#543) +- Ensure Registry.resolve picks module when parsing mixins (#545) +- Fixed regression that caused various commands to not show output (#548) +- Respect current visibility when parsing class conditions (#551) + +# [0.8.1] - May 2, 2012 + +[0.8.1]: https://github.com/lsegal/yard/compare/v0.8.0...v0.8.1 + +- Added `--[no-]api` switch to generate docs for API sets (see {file:docs/WhatsNew.md} for details) (#532) +- The `yard list` command now uses cache by default (#533) +- Fix `yardoc` generating incorrectly named method list file (#528) +- Fix HTML output occasionally showing trailing mdash on options list (#522) + +# [0.8.0] - April 30, 2012 + +[0.8.0]: https://github.com/lsegal/yard/compare/v0.7.5...v0.8.0 + +- See {file:docs/WhatsNew.md} for a list of added features +- Over 20 bug fixes: + - Properly filter hidden setter/getter attributes (#394) + - Fix test failures in Linux environments (#397, #472, #473, #512, #513) + - Fix attribute inheritance and @private (#432) + - Fix attribute parsing (#435) + - Allow aliases for attributes (#436) + - Fix namespace fetching in `handle_alias()` (#437) + - Fix overwritten attributes marked as inherited (#442) + - Fix documenting constants defined from C code with `rb_define_const()` (#443) + - Do not escape snippets twice (#445) + - Ajax method/class search should not fire when a non-printable character is pressed (#446) + - Fix yard server crashing when RDoc is not installed (#456) + - Fix tags ignored when `(see #foo)` is used (#457) + - Fix three "Returns" for two `@overload` tags (#458) + - Do not auto-detect DSL methods as method objects if parameter name is not a valid method name (#464) + - Fix attaching of macros to Object (#465) + - Fix handling of `%w()` source in `[]/[]=` parsed context. (#461, pull in #468) + - Don't add default `@return` if `@overload` has `@return`. (#458, pull in #469) + - Don't discard tags by (see ...). (#457, pull in #470) + - Fix constants listed as inherited when overwritten (#474) + - Fix `yardoc --asset` behaving differently on first and subsequent calls. (#477) + - `!!!lang` code blocks should set the lang in `
`'s class. (#478, #479)
+  - Fix "File List" search tab error. (#502)
+  - Fix search bar not redirecting to method page. (#509)
+  - Fix server returning exception message bodies as String (#518)
+
+# [0.7.5] - January 31, 2012
+
+[0.7.5]: https://github.com/lsegal/yard/compare/v0.7.4...v0.7.5
+
+- Various minor bug fixes
+
+# [0.7.4] - December 2, 2011
+
+[0.7.4]: https://github.com/lsegal/yard/compare/v0.7.3...v0.7.4
+
+- Redcarpet is now the default Markdown formatting library. GFM now works out-of-box (#404)
+- Fix server side searching for elements that are marked private (#420)
+- Add 'textile_strict' and 'pre' markup types, reorganize text and none (#416)
+- Improve encoding line detection (#415)
+- Add support for `rb_define_alias` in CRuby code (#413)
+- Fix rendering of some keywords in source view (#410)
+- Add support for RDoc 3.10+ (#406, #407)
+- Fix typewriter text being processed in code blocks (#403)
+- Improve support for has_rdoc in RubyGems 1.8.x (#401)
+- See the {file:docs/WhatsNew.md} document for details on added features
+
+# [0.7.3] - October 15, 2011
+
+[0.7.3]: https://github.com/lsegal/yard/compare/v0.7.2...v0.7.3
+
+- Improve support for parsing under Ruby 1.9.2p290 and 1.9.3 (#365, #370)
+- Add support for SWIG generated CRuby code (#369)
+- Add support for `rb_define_attr` calls in CRuby code (#362)
+- Handle file pointers in CRuby code (#358)
+
+# [0.7.2] - June 14, 2011
+
+[0.7.2]: https://github.com/lsegal/yard/compare/v0.7.1...v0.7.2
+
+- Fix `yard --help` not showing proper output
+- YARD now expands path to `.yardoc` file in daemon mode for server (#328)
+- Fix `@overload` tag linking to wrong method (#330)
+- Fix incorrect return type when using `@macro` (#334)
+- YARD now requires 'thread' to support RubyGems 1.7+ (#338)
+- Fix bug in constant documentation when using `%w()` (#348)
+- Fix YARD style URL links when using autolinking markdown (#353)
+
+# [0.7.1] - May 18, 2011
+
+[0.7.1]: https://github.com/lsegal/yard/compare/v0.7.0...v0.7.1
+
+- Fixes a bug in `yard server` not displaying class list properly.
+
+# [0.7.0] - May 17, 2011
+
+[0.7.0]: https://github.com/lsegal/yard/compare/v0.6.8...v0.7.0
+
+- See the {file:docs/WhatsNew.md} document for details on added features
+- Make sure that Docstring#line_range is filled when possible (#243)
+- Set #verifier in YardocTask (#282)
+- Parse BOM in UTF-8 files (#288)
+- Fix instance attributes not showing up in method list (#302)
+- Fix rendering of %w() literals in constants (#306)
+- Ignore keyboard shortcuts when an input is active (#312)
+- And more...
+
+# [0.6.8] - April 14, 2011
+
+[0.6.8]: https://github.com/lsegal/yard/compare/v0.6.7...v0.6.8
+
+- Fix regression in RDoc 1.x markup loading
+- Fix regression in loading of markup libraries for `yard server`
+
+# [0.6.7] - April 6, 2011
+
+[0.6.7]: https://github.com/lsegal/yard/compare/v0.6.6...v0.6.7
+
+- Fix has_rdoc gem specification issue with new RubyGems plugin API (oops!)
+
+# [0.6.6] - April 6, 2011
+
+[0.6.6]: https://github.com/lsegal/yard/compare/v0.6.5...v0.6.6
+
+- Fix error message when RDoc is not present (#270)
+- Add markup type 'none' to perform basic HTML translation (fallback when RDoc is not present)
+- Add support for RubyGems 1.7.x (#272)
+- Fix rendering of `{url description}` syntax when description contains newline
+
+# [0.6.5] - March 13, 2011
+
+[0.6.5]: https://github.com/lsegal/yard/compare/v0.6.4...v0.6.5
+
+- Support `ripper` gem in Ruby 1.8.7
+- Upgrade jQuery to 1.5.1
+- Fix handling of alias statements with quoted symbols (#262)
+- Add CSS styles (#260)
+- Unhandled exception in YARD::Handlers::Ruby::MixinHandler indexing documentation for eventmachine (#248)
+- Splice any alias references on method re-definitions into separate methods (#247)
+- Fix "yard graph" (#245)
+- Don't process ++ typewriter text inside of HTML attributes (#244)
+- Prioritize loading of Kramdown before Maruku (#241)
+- Skip shebang encoding in docstrings (#238)
+- Fix truncation of references in @deprecated (#232)
+- Show @api private note when no other tags are present (#231)
+- Detect docstrings starting with "##" as `Docstring#hash_flag` (#230)
+- Remove trailing whitespace from freeform tags (#229)
+- Fix line through for deprecated methods (#225)
+- Mistake in Tags.md (#223)
+- Improve database storage by being more efficient with filesystem usage (#222)
+- Make Registry thread local (#221)
+- Support `private_constant` class method for 1.9.3 (#219)
+- Do not assume RDoc is installed (#214)
+
+# [0.6.4] - December 21, 2010
+
+[0.6.4]: https://github.com/lsegal/yard/compare/v0.6.3...v0.6.4
+
+- Fix yri tool crashing with new Config class (gh-217)
+- Fix support for ::TopLevelConstants (gh-216)
+- YARD's test suite is now RSpec2 compatible (gh-215)
+- Improved documentation for YARD::Server features (gh-207)
+- Fix displaying of collaped method summary lists (gh-204)
+- Fix automatic loading of markup providers (gh-206)
+- Fix keyboard shortcuts for Chrome (gh-203)
+- Disallow `extend self` inside of a class (gh-202)
+- Constants now recognized in C extensions (gh-201)
+
+# [0.6.3] - November 21, 2010
+
+[0.6.3]: https://github.com/lsegal/yard/compare/v0.6.2...v0.6.3
+
+- Fixed regression that caused `yardoc --markup` to silently exit
+
+# [0.6.2] - November 15, 2010
+
+[0.6.2]: https://github.com/lsegal/yard/compare/v0.6.1...v0.6.2
+
+- **Plugins no longer automatically load, use `--plugin` to load a plugin**
+- Added YARD::Config and ~/.yard/config YAML configuration file
+- Added `yard config` command to view/edit YARD configuration file
+- Fixes for YARD in 1.8.6 (gh-178)
+- Various HTML template adjustments and fixes (gh-198,199,200)
+- Improved `yard server -m` multi-project stability (gh-193)
+- Fixed handling of `yardoc --no-private` with missing class definitions (gh-197)
+- Added support for constants defined in C extensions (gh-177)
+- Added support for Structs defined as "Klass = Struct.new(...)" (gh-187)
+- Improved parsing support for third-party gems (gh-174,180)
+- Improved support for JRuby 1.6.4+. YARD now passes all specs in JRuby (gh-185)
+- Improved YARD documentation (gh-172,191,196)
+
+# [0.6.1] - September 06, 2010
+
+[0.6.1]: https://github.com/lsegal/yard/compare/v0.6.0...v0.6.1
+
+- Fixed TOC showing on top of class/method list in no-frames view
+- A message now displays when running `yard server` with Rack/Mongrel installed
+- Improved performance of JS inline search for large class/method lists
+- Improved link titles for relative object links
+- Removed `String#camelcase` and `String#underscore` for better Rails compat.
+- Fixed support for loading .yardoc files under Windows
+- Fixed inheritance tree arrows not displaying in certain environments
+
+# [0.6.0] - August 29, 2010
+
+[0.6.0]: https://github.com/lsegal/yard/compare/v0.5.8...v0.6.0
+
+- Added dynamic local documentation server
+- Added @group/@endgroup declarations to organize methods into groups
+- Added `yard` executable to serve as main CLI tool with pluggable commands
+- Added `--asset` switch to `yardoc` to copy files/dirs to output dir
+- Added ability to register/manipulate tags via CLI (`--tag`, etc.)
+- Added `yard diff` command
+- Added statistics to `yardoc` output (and `yard stats` command)
+- Added Javascript generated Table of Contents to file pages
+- Updated various APIs
+- Removed `yard-graph` executable
+- See more changes in the {file:docs/WhatsNew.md what's new document}
+
+# [0.5.8] - June 22, 2010
+
+[0.5.8]: https://github.com/lsegal/yard/compare/v0.5.7...v0.5.8
+
+- Merge fix from 0.6 branch for --no-private visibility checking
+
+# [0.5.7] - June 21, 2010
+
+[0.5.7]: https://github.com/lsegal/yard/compare/v0.5.6...v0.5.7
+
+- Fixed visibility flag parsing in `yardoc`
+- Updated Parser Architecture documentation with new SourceParser API
+- Improved Registry documentation for new load commands
+- Fix loading of .yardoc file as cache (and preserving aliases)
+- Fix "lib" directory missing when running YARD on installed gems
+
+# [0.5.6] - June 12, 2010
+
+[0.5.6]: https://github.com/lsegal/yard/compare/v0.5.5...v0.5.6
+
+- Bug fixes for RubyGems plugin, `has_rdoc=false` should now work
+- New API for registering custom parsers. See {file:docs/WhatsNew.md}
+
+# [0.5.5] - May 22, 2010
+
+[0.5.5]: https://github.com/lsegal/yard/compare/v0.5.4...v0.5.5
+
+- Various bug fixes
+
+# [0.5.4] - March 22, 2010
+
+[0.5.4]: https://github.com/lsegal/yard/compare/v0.5.3...v0.5.4
+
+- See {file:docs/WhatsNew.md what's new document} for changes
+
+# [0.5.3] - January 11, 2010
+
+[0.5.3]: https://github.com/lsegal/yard/compare/v0.5.2...v0.5.3
+
+- See {file:docs/WhatsNew.md what's new document} for changes
+
+# [0.5.2] - December 16, 2009
+
+[0.5.2]: https://github.com/lsegal/yard/compare/v0.5.1...v0.5.2
+
+- See {file:docs/WhatsNew.md what's new document} for changes
+
+# [0.5.1] - December 15, 2009
+
+[0.5.1]: https://github.com/lsegal/yard/compare/v0.5.0...v0.5.1
+
+- See {file:docs/WhatsNew.md what's new document} for changes
+
+# [0.5.0] - December 13, 2009
+
+[0.5.0]: https://github.com/lsegal/yard/compare/v0.4.0...v0.5.0
+
+- See {file:docs/WhatsNew.md what's new document} for changes
+
+# [0.4.0] - November 15, 2009
+
+[0.4.0]: https://github.com/lsegal/yard/compare/v0.2.3.5...v0.4.0
+
+- Added new templating engine based on [tadpole](http://github.com/lsegal/tadpole)
+- Added YARD queries (`--query` CLI argument to yardoc)
+- Greatly expanded YARD documentation
+- Added plugin support
+- New `@abstract` and `@private` tags
+- Changed default rake task to `rake yard`
+- Read about changes in {file:docs/WhatsNew.md}
+
+# [0.2.3.5] - August 13, 2009
+
+[0.2.3.5]: https://github.com/lsegal/yard/compare/v0.2.3.4...v0.2.3.5
+
+- Minor bug fixes.
+
+# [0.2.3.4] - August 07, 2009
+
+[0.2.3.4]: https://github.com/lsegal/yard/compare/v0.2.3.3...v0.2.3.4
+
+- Minor bug fixes.
+
+# [0.2.3.3] - July 26, 2009
+
+[0.2.3.3]: https://github.com/lsegal/yard/compare/v0.2.3.2...v0.2.3.3
+
+- Minor bug fixes.
+
+# [0.2.3.2] - July 06, 2009
+
+[0.2.3.2]: https://github.com/lsegal/yard/compare/v0.2.3.1...v0.2.3.2
+
+- Fix Textile hard-break issues
+- Add description for @see tag to use as link title in HTML docs.
+- Add --title CLI option to specify a title for HTML doc files.
+- Add custom.css file that can be overridden with various custom
+  styelsheet declarations. To use this, simply add `default/fulldoc/html/custom.css`
+  inside your code directory and use the `-t` template directory yardoc CLI
+  option to point to that template directory (the dir holding 'default').
+- Add support in `yardoc` CLI to specify extra files (formerly --files)
+  by appending "- extra files here" after regular source files. Example:
+
+        yardoc --private lib/**/*.rb - FAQ LICENSE
+
+# [0.2.3.1] - June 13, 2009
+
+[0.2.3.1]: https://github.com/lsegal/yard/compare/v0.2.3...v0.2.3.1
+
+- Add a RubyGems 1.3.2+ plugin to generate YARD documentation instead of
+  RDoc. To take advantage of this plugin, set `has_rdoc = 'yard'` in your
+  .gemspec file.
+
+# [0.2.3] - June 07, 2009
+
+[0.2.3]: https://github.com/lsegal/yard/compare/v0.2.2...v0.2.3
+
+- See the {file:docs/WhatsNew.md} file for a list of important new features.
+
+# [0.2.2] - Jun 16, 2008
+
+[0.2.2]: https://github.com/lsegal/yard/compare/v0.2.1...v0.2.2
+
+- This is the largest changset since yard's conception and involves a complete
+  overhaul of the parser and API to make it more robust and far easier to
+  extend and use for the developer.
+
+# [0.2.1] - February 20, 2008
+
+[0.2.1]: https://github.com/lsegal/yard/compare/v0.1a...v0.2.1
+
+- See the {file:docs/WhatsNew.md} file for a list of important new features.
+
+# 0.1a - February 24, 2007
+
+- Released 0.1a experimental version for testing. The goal here is
+  to get people testing YARD on their code because there are too many possible
+  code styles to fit into a sane amount of test cases. It also demonstrates the
+  power of YARD and what to expect from the syntax (Yardoc style meta tags).
diff --git a/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/CODE_OF_CONDUCT.md b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/CODE_OF_CONDUCT.md
new file mode 100644
index 000000000..92b49983d
--- /dev/null
+++ b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/CODE_OF_CONDUCT.md
@@ -0,0 +1,15 @@
+This document provides community guidelines for a safe, respectful, productive,
+and collaborative place for any person who is willing to contribute to the YARD
+project. It applies to all “collaborative space”, which is defined as community
+communications channels (such as mailing lists, submitted patches, commit
+comments, etc.).
+
+* Participants will be tolerant of opposing views.
+
+* Participants must ensure that their language and actions are free of personal
+  attacks and disparaging personal remarks.
+
+* When interpreting the words and actions of others, participants should always
+  assume good intentions.
+
+* Behaviour which can be reasonably considered harassment will not be tolerated.
diff --git a/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/CONTRIBUTING.md b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/CONTRIBUTING.md
new file mode 100644
index 000000000..fd0e29b24
--- /dev/null
+++ b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/CONTRIBUTING.md
@@ -0,0 +1,140 @@
+# Contributing Guide
+
+## Help YARD Help You!
+
+**YARD thrives off of the contributions of its users**. This project will gladly
+review pull requests and issues. This document outlines how to maximize
+the chance of a reported issue being resolved or pull request being accepted.
+
+## Code of Conduct
+
+**All reported issues, pull requests, communication, and code related to YARD**
+**must follow the [Code of Conduct][code] or they will be moderated immediately**.
+Please take time to familiarize yourself with the Code of Conduct before
+you get started. Fundamentally, **you are expected to behave with respect** to all
+other users.
+
+## Filing a Bug Report
+
+**You can submit bug reports on our [GitHub issue tracker][issues]**.
+
+If you believe you have found a bug, please include a few things in your report:
+
+1. **A minimal reproduction of the issue**. Providing a huge blob of code is
+   better than nothing, but providing the shortest possible set of instructions
+   is even better. Take out any instructions or code that, when removed, have
+   no effect on the problematic behavior. The easier your bug is to triage and
+   diagnose, the higher up in the priority list it will go. We can do this stuff,
+   but limited time means this may not happen immediately. Make your bug report
+   extremely accessible and you will almost guarantee a quick fix.
+
+2. **Your environment and relevant versions**. Please include your Ruby,
+   YARD, and system versions (including OS) when reporting a bug. This
+   makes it easier to diagnose problems. If the issue or stack trace
+   includes another library, consider also listing any dependencies
+   that may be affecting the issue. This is where a minimal reproduction
+   case helps a lot.
+
+3. **Your expected result**. Tell us what you think should happen. This
+   helps us to understand the context of your problem. Many complex features
+   can contain ambiguous usage, and your use case may differ from the
+   intended one. If we know your expectations, we can more easily determine
+   if the behavior is intentional or not.
+
+Finally, please **DO NOT** submit a report that states a feature simply
+_"does not work"_ without any additional information in the report. Consider
+the issue from the maintainer's perspective: in order to fix your bug, we
+need to drill down to the broken line of code, and in order to do this,
+we must be able to reproduce the issue on our end to find that line of
+code. The easier we can do this, the quicker your bug gets fixed. Help
+us help you by providing as much information as you possibly can. We may
+not have the tools or environment to properly diagnose your issue, so
+your help may be required to debug the issue.
+
+Also **consider opening a pull request** to fix the issue yourself if you can.
+This will likely speed up the fix time significantly. See below for
+information on how to do this.
+
+## Asking a Question
+
+**Questions are accepted on [GitHub issues][issues], but consider signing up**
+**for the [YARD mailing list][ml]** and asking it there so that we can organize
+issues appropriately. You can also hop onto IRC (irc.freenode.net / #yard)
+for quick questions.
+
+## Asking for a Feature
+
+**YARD does not currently accept feature requests filed as GitHub issues**. If
+you are looking to have a feature implemented into YARD, consider doing this
+yourself and [submitting a pull request][pr] (PR) with your work. If the work
+required is involved, consider starting a discussion on the [mailing list][ml]
+or opening an issue to ask a question; we will be happy to have a conversation
+and let you know if the feature would be considered. They usually are, but
+it might be prudent to ask first!
+
+Please do not fret if your feature request gets closed immediately. We do this
+to keep our issue tracker clean. **Closing an issue does not mean it would not**
+**be accepted as a pull request**. If the feature would not be accepted as a
+PR, this will be communicated in the closed issue.
+
+## Making a Change via Pull Request
+
+**You can also submit pull requests on our [GitHub issue tracker][issues]**.
+
+If you've been working on a patch or feature that you want in YARD, here are
+some tips to ensure the quickest turnaround time on getting it merged in:
+
+1. **Keep your changes small**. If your feature is large, consider splitting
+   it up into smaller portions and submit pull requests for each component
+   individually. Feel free to describe this in your first PR or on the
+   mailing list, but note that it will be much easier to review changes
+   if they affect smaller portions of code at a time.
+
+2. **Keep commits brief and clean**: YARD uses Git and tries to maintain a
+   clean repository. Please ensure that you use [commit conventions][commit]
+   to make things nice and neat both in the description and commit history.
+   Specifically, consider squashing commits if you have partial or complete
+   reverts of code. Each commit should provide an atomic change that moves
+   the project forwards, not back. Any changes that only fix other parts of
+   your PR should be hidden from the commit history.
+
+3. **Follow our coding conventions**. YARD uses typical Ruby source formatting,
+   though it occasionally has minor differences with other projects you may
+   have seen. Please look through a few files (at least the file you are
+   editing) to ensure that you are consistent in the formatting your PR is
+   using.
+
+4. **Make sure you have tests**. Not all changes require tests, but if your
+   changes involve code, you should consider adding at least one new test
+   case for your change (and ideally a couple of tests). This will add
+   confidence when reviewing and will make accepting the change much easier.
+
+5. **Make sure ALL the tests pass**. YARD has a fairly large suite of tests.
+   Please make sure you can run all of the tests (`bundle exec rake`) prior
+   to submitting your PR. Please also remember that YARD supports a number
+   of environments, including OS X, Linux, Windows, and a number of older
+   Ruby versions (1.8+), so if you can test under these environments, that
+   helps (but is not required). At the very least, be aware of this fact
+   when submitting code.
+
+If your change is large, consider starting a discussion on the [mailing list][ml]
+or opening an issue to ask a question; we will be happy to have a conversation
+and let you know if the feature would be considered. They usually are, but
+it might be prudent to ask first!
+
+## Maintainers
+
+**Interested in helping to maintain YARD? Email [lsegal@soen.ca][mail]** for more
+information. Offering to be a project maintainer is an important contribution
+to open source software, and your work will be highly valued in the community.
+If you have been a contributor, consider being a member of the core team to
+help handle day-to-day operations, such as releases, bug fixes, and triage.
+You can do some of this as a non-maintainer too, but if you like this project,
+we can always use more hands on deck!
+
+[code]: https://github.com/lsegal/yard/blob/main/CODE_OF_CONDUCT.md
+[issues]: http://github.com/lsegal/yard/issues
+[commit]: http://chris.beams.io/posts/git-commit/
+[pr]: https://help.github.com/articles/using-pull-requests/
+[ml]: https://groups.google.com/forum/#!forum/yardoc
+[mail]: mailto:lsegal@soen.ca
diff --git a/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/Dockerfile.samus b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/Dockerfile.samus
new file mode 100644
index 000000000..0f2a735a5
--- /dev/null
+++ b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/Dockerfile.samus
@@ -0,0 +1,28 @@
+FROM lsegal/samus:latest as samus
+
+FROM ruby:2
+ARG VERSION
+ENV VERSION=${VERSION}
+WORKDIR /github/lsegal/yard
+ENTRYPOINT samus publish release-v${VERSION}.tar.gz
+
+# Prepare credential config
+RUN mkdir -p ~/.ssh
+RUN echo "Host *" > ~/.ssh/config
+RUN echo "    StrictHostKeyChecking no" >> ~/.ssh/config
+RUN chmod 400 ~/.ssh/config
+COPY ./.samusprep/.samus /root/.samus
+COPY ./.samusprep/.gitconfig /root/.gitconfig
+
+# Setup Samus
+ENV PATH=$PATH:/samus/bin
+COPY --from=samus /samus /samus
+
+# Install gems
+ENV BUNDLE_PATH=/var/gems
+COPY Gemfile /github/lsegal/yard
+RUN bundle
+
+# Run build
+COPY . /github/lsegal/yard
+RUN samus build --skip-restore ${VERSION}
diff --git a/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/Gemfile b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/Gemfile
new file mode 100644
index 000000000..ffea136d0
--- /dev/null
+++ b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/Gemfile
@@ -0,0 +1,34 @@
+# frozen_string_literal: true
+source 'https://rubygems.org'
+
+group :development do
+  gem 'rspec'
+  gem 'rake'
+  gem 'rdoc'
+  gem 'json'
+  gem 'simplecov'
+  gem 'samus', '~> 3.0.9', :require => false
+  gem 'coveralls', :require => false
+  gem 'webrick'
+end
+
+group :asciidoc do
+  gem 'asciidoctor'
+end
+
+group :markdown do
+  gem 'redcarpet'
+  gem 'commonmarker'
+end
+
+group :textile do
+  gem 'RedCloth'
+end
+
+group :server do
+  gem 'rack'
+end
+
+group :i18n do
+  gem 'gettext'
+end
diff --git a/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/LEGAL b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/LEGAL
new file mode 100644
index 000000000..69ef86686
--- /dev/null
+++ b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/LEGAL
@@ -0,0 +1,66 @@
+LEGAL NOTICE INFORMATION
+------------------------
+
+All the files in this distribution are covered under either the MIT
+license (see the file LICENSE) except some files mentioned below.
+
+lib/parser/ruby/legacy/ruby_lex.rb:
+
+  This file is under the Ruby license. YARD uses a modified version of it.
+
+    Ruby is copyrighted free software by Yukihiro Matsumoto .
+    You can redistribute it and/or modify it under either the terms of the GPL
+    version 2 (see the file GPL), or the conditions below:
+
+      1. You may make and give away verbatim copies of the source form of the
+         software without restriction, provided that you duplicate all of the
+         original copyright notices and associated disclaimers.
+
+      2. You may modify your copy of the software in any way, provided that
+         you do at least ONE of the following:
+
+           a) place your modifications in the Public Domain or otherwise
+              make them Freely Available, such as by posting said
+          modifications to Usenet or an equivalent medium, or by allowing
+          the author to include your modifications in the software.
+
+           b) use the modified software only within your corporation or
+              organization.
+
+           c) give non-standard binaries non-standard names, with
+              instructions on where to get the original software distribution.
+
+           d) make other distribution arrangements with the author.
+
+      3. You may distribute the software in object code or binary form,
+         provided that you do at least ONE of the following:
+
+           a) distribute the binaries and library files of the software,
+          together with instructions (in the manual page or equivalent)
+          on where to get the original distribution.
+
+           b) accompany the distribution with the machine-readable source of
+          the software.
+
+           c) give non-standard binaries non-standard names, with
+              instructions on where to get the original software distribution.
+
+           d) make other distribution arrangements with the author.
+
+      4. You may modify and include the part of the software into any other
+         software (possibly commercial).  But some files in the distribution
+         are not written by the author, so that they are not under these terms.
+
+         For the list of those files and their copying conditions, see the
+         file LEGAL.
+
+      5. The scripts and library files supplied as input to or produced as
+         output from the software do not automatically fall under the
+         copyright of the software, but belong to whomever generated them,
+         and may be sold commercially, and may be aggregated with this
+         software.
+
+      6. THIS SOFTWARE IS PROVIDED "AS IS" AND WITHOUT ANY EXPRESS OR
+         IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
+         WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+         PURPOSE.
diff --git a/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/LICENSE b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/LICENSE
new file mode 100644
index 000000000..f288162b4
--- /dev/null
+++ b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/LICENSE
@@ -0,0 +1,22 @@
+Copyright (c) 2007-2018 Loren Segal
+
+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/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/README.md b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/README.md
new file mode 100644
index 000000000..ec5ffc997
--- /dev/null
+++ b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/README.md
@@ -0,0 +1,325 @@
+# YARD: Yay! A Ruby Documentation Tool
+
+[![Homepage](https://img.shields.io/badge/home-yardoc.org-blue.svg)](http://yardoc.org)
+[![GitHub](https://img.shields.io/badge/github-lsegal/yard-blue.svg)](http://github.com/lsegal/yard)
+[![Documentation](https://img.shields.io/badge/docs-rdoc.info-blue.svg)](http://rubydoc.org/gems/yard/frames)
+
+[![Gem Version](https://badge.fury.io/rb/yard.svg)](http://github.com/lsegal/yard/releases)
+[![Unit Tests](https://github.com/lsegal/yard/actions/workflows/ci.yml/badge.svg)](https://github.com/lsegal/yard/actions/workflows/ci.yml)
+[![Coverage Status](https://coveralls.io/repos/github/lsegal/yard/badge.svg)](https://coveralls.io/github/lsegal/yard)
+[![License](https://img.shields.io/badge/license-MIT-yellowgreen.svg)](#license)
+
+## Synopsis
+
+YARD is a documentation generation tool for the Ruby programming language. It
+enables the user to generate consistent, usable documentation that can be
+exported to a number of formats very easily, and also supports extending for
+custom Ruby constructs such as custom class level definitions. Below is a
+summary of some of YARD's notable features.
+
+## Feature List
+
+**1. RDoc/SimpleMarkup Formatting Compatibility**: YARD is made to be compatible
+with RDoc formatting. In fact, YARD does no processing on RDoc documentation
+strings, and leaves this up to the output generation tool to decide how to
+render the documentation.
+
+**2. Yardoc Meta-tag Formatting Like Python, Java, Objective-C and other
+languages**: YARD uses a '@tag' style definition syntax for meta tags alongside
+regular code documentation. These tags should be able to happily sit side by
+side RDoc formatted documentation, but provide a much more consistent and usable
+way to describe important information about objects, such as what parameters
+they take and what types they are expected to be, what type a method should
+return, what exceptions it can raise, if it is deprecated, etc.. It also allows
+information to be better (and more consistently) organized during the output
+generation phase. You can find a list of tags in the {file:docs/Tags.md#taglist
+Tags.md} file.
+
+YARD also supports an optional "types" declarations for certain tags. This
+allows the developer to document type signatures for ruby methods and parameters
+in a non intrusive but helpful and consistent manner. Instead of describing this
+data in the body of the description, a developer may formally declare the
+parameter or return type(s) in a single line. Consider the following method
+documented with YARD formatting:
+
+```ruby
+# Reverses the contents of a String or IO object.
+#
+# @param contents [String, #read] the contents to reverse
+# @return [String] the contents reversed lexically
+def reverse(contents)
+  contents = contents.read if contents.respond_to? :read
+  contents.reverse
+end
+```
+
+With the above @param tag, we learn that the contents parameter can either be a
+String or any object that responds to the 'read' method, which is more powerful
+than the textual description, which says it should be an IO object. This also
+informs the developer that they should expect to receive a String object
+returned by the method, and although this may be obvious for a 'reverse' method,
+it becomes very useful when the method name may not be as descriptive.
+
+**3. Custom Constructs and Extensibility of YARD**: YARD is designed to be
+extended and customized by plugins. Take for instance the scenario where you
+need to document the following code:
+
+```ruby
+class List
+ # Sets the publisher name for the list.
+ cattr_accessor :publisher
+end
+```
+
+This custom declaration provides dynamically generated code that is hard for a
+documentation tool to properly document without help from the developer. To ease
+the pains of manually documenting the procedure, YARD can be extended by the
+developer to handle the `cattr_accessor` construct and automatically create an
+attribute on the class with the associated documentation. This makes documenting
+external API's, especially dynamic ones, a lot more consistent for consumption
+by the users.
+
+YARD is also designed for extensibility everywhere else, allowing you to add
+support for new programming languages, new data structures and even where/how
+data is stored.
+
+**4. Raw Data Output**: YARD also outputs documented objects as raw data (the
+dumped Namespace) which can be reloaded to do generation at a later date, or
+even auditing on code. This means that any developer can use the raw data to
+perform output generation for any custom format, such as YAML, for instance.
+While YARD plans to support XHTML style documentation output as well as command
+line (text based) and possibly XML, this may still be useful for those who would
+like to reap the benefits of YARD's processing in other forms, such as throwing
+all the documentation into a database. Another useful way of exploiting this raw
+data format would be to write tools that can auto generate test cases, for
+example, or show possible unhandled exceptions in code.
+
+**5. Local Documentation Server**: YARD can serve documentation for projects or
+installed gems (similar to `gem server`) with the added benefit of dynamic
+searching, as well as live reloading. Using the live reload feature, you can
+document your code and immediately preview the results by refreshing the page;
+YARD will do all the work in re-generating the HTML. This makes writing
+documentation a much faster process.
+
+## Installing
+
+To install YARD, use the following command:
+
+```sh
+$ gem install yard
+```
+
+(Add `sudo` if you're installing under a POSIX system as root)
+
+Alternatively, if you've checked the source out directly, you can call
+`rake install` from the root project directory.
+
+**Important Note for Debian/Ubuntu users:** there's a possible chance your Ruby
+install lacks RDoc, which is occasionally used by YARD to convert markup to
+HTML. If running `which rdoc` turns up empty, install RDoc by issuing:
+
+```sh
+$ sudo apt-get install rdoc
+```
+
+## Usage
+
+There are a couple of ways to use YARD. The first is via command-line, and the
+second is the Rake task.
+
+**1. yard Command-line Tool**
+
+YARD comes packaged with a executable named `yard` which can control the many
+functions of YARD, including generating documentation, graphs running the YARD
+server, and so on. To view a list of available YARD commands, type:
+
+```sh
+$ yard --help
+```
+
+Plugins can also add commands to the `yard` executable to provide extra
+functionality.
+
+### Generating Documentation
+
+The `yardoc` executable is a shortcut for `yard doc`.
+
+The most common command you will probably use is `yard doc`, or `yardoc`. You
+can type `yardoc --help` to see the options that YARD provides, but the easiest
+way to generate docs for your code is to simply type `yardoc` in your project
+root. This will assume your files are located in the `lib/` directory. If they
+are located elsewhere, you can specify paths and globs from the commandline via:
+
+```sh
+$ yardoc 'lib/**/*.rb' 'app/**/*.rb' ...etc...
+```
+
+The tool will generate a `.yardoc` file which will store the cached database of
+your source code and documentation. If you want to re-generate your docs with
+another template you can simply use the `--use-cache` (or -c) option to speed up
+the generation process by skipping source parsing.
+
+YARD will by default only document code in your public visibility. You can
+document your protected and private code by adding `--protected` or `--private`
+to the option switches. In addition, you can add `--no-private` to also ignore
+any object that has the `@private` meta-tag. This is similar to RDoc's ":nodoc:"
+behaviour, though the distinction is important. RDoc implies that the object
+with :nodoc: would not be documented, whereas YARD still recommends documenting
+private objects for the private API (for maintainer/developer consumption).
+
+You can also add extra informative files (README, LICENSE) by separating the
+globs and the filenames with '-'.
+
+```sh
+$ yardoc 'app/**/*.rb' - README LICENSE FAQ
+```
+
+If no globs precede the '-' argument, the default glob (`lib/**/*.rb`) is used:
+
+```sh
+$ yardoc - README LICENSE FAQ
+```
+
+Note that the README file can be specified with its own `--readme` switch.
+
+You can also add a `.yardopts` file to your project directory which lists the
+switches separated by whitespace (newlines or space) to pass to yardoc whenever
+it is run. A full overview of the `.yardopts` file can be found in
+{YARD::CLI::Yardoc}.
+
+### Queries
+
+The `yardoc` tool also supports a `--query` argument to only include objects
+that match a certain data or meta-data query. The query syntax is Ruby, though a
+few shortcuts are available. For instance, to document only objects that have an
+"@api" tag with the value "public", all of the following syntaxes would give the
+same result:
+
+```sh
+--query '@api.text == "public"'
+--query 'object.has_tag?(:api) && object.tag(:api).text == "public"'
+--query 'has_tag?(:api) && tag(:api).text == "public"'
+```
+
+Note that the "@tag" syntax returns the first tag named "tag" on the object. To
+return the array of all tags named "tag", use "@@tag".
+
+Multiple `--query` arguments are allowed in the command line parameters. The
+following two lines both check for the existence of a return and param tag:
+
+```sh
+--query '@return' --query '@param'
+--query '@return && @param'
+```
+
+For more information about the query syntax, see the {YARD::Verifier} class.
+
+**2. Rake Task**
+
+The second most obvious is to generate docs via a Rake task. You can do this by
+adding the following to your `Rakefile`:
+
+```ruby
+require 'yard'
+
+YARD::Rake::YardocTask.new do |t|
+ t.files   = ['lib/**/*.rb', OTHER_PATHS]   # optional
+ t.options = ['--any', '--extra', '--opts'] # optional
+ t.stats_options = ['--list-undoc']         # optional
+end
+```
+
+All the settings: `files`, `options` and `stats_options` are optional. `files`
+will default to `lib/**/*.rb`, `options` will represents any options you might
+want to add and `stats_options` will pass extra options to the stats command.
+Again, a full list of options is available by typing `yardoc --help` in a shell.
+You can also override the options at the Rake command-line with the OPTS
+environment variable:
+
+```sh
+$ rake yard OPTS='--any --extra --opts'
+```
+
+**3. `yri` RI Implementation**
+
+The yri binary will use the cached .yardoc database to give you quick ri-style
+access to your documentation. It's way faster than ri but currently does not
+work with the stdlib or core Ruby libraries, only the active project. Example:
+
+```sh
+$ yri YARD::Handlers::Base#register
+$ yri File.relative_path
+```
+
+Note that class methods must not be referred to with the "::" namespace
+separator. Only modules, classes and constants should use "::".
+
+You can also do lookups on any installed gems. Just make sure to build the
+.yardoc databases for installed gems with:
+
+```sh
+$ yard gems
+```
+
+If you don't have sudo access, it will write these files to your `~/.yard`
+directory. `yri` will also cache lookups there.
+
+**4. `yard server` Documentation Server**
+
+The `yard server` command serves documentation for a local project or all
+installed RubyGems. To serve documentation for a project you are working on,
+simply run:
+
+```sh
+$ yard server
+```
+
+And the project inside the current directory will be parsed (if the source has
+not yet been scanned by YARD) and served at
+[http://localhost:8808](http://localhost:8808).
+
+### Live Reloading
+
+If you want to serve documentation on a project while you document it so that
+you can preview the results, simply pass `--reload` (`-r`) to the above command
+and YARD will reload any changed files on each request. This will allow you to
+change any documentation in the source and refresh to see the new contents.
+
+### Serving Gems
+
+To serve documentation for all installed gems, call:
+
+```sh
+$ yard server --gems
+```
+
+This will also automatically build documentation for any gems that have not been
+previously scanned. Note that in this case there will be a slight delay between
+the first request of a newly parsed gem.
+
+**5. `yard graph` Graphviz Generator**
+
+You can use `yard graph` to generate dot graphs of your code. This, of course,
+requires [Graphviz](http://www.graphviz.org) and the `dot` binary. By default
+this will generate a graph of the classes and modules in the best UML2 notation
+that Graphviz can support, but without any methods listed. With the `--full`
+option, methods and attributes will be listed. There is also a `--dependencies`
+option to show mixin inclusions. You can output to stdout or a file, or pipe
+directly to `dot`. The same public, protected and private visibility rules apply
+to `yard graph`. More options can be seen by typing `yard graph --help`, but
+here is an example:
+
+```sh
+$ yard graph --protected --full --dependencies
+```
+
+## Changelog
+
+See {file:CHANGELOG.md} for a list of changes.
+
+## License
+
+YARD © 2007-2020 by [Loren Segal](mailto:lsegal@soen.ca). YARD is licensed
+under the MIT license except for some files which come from the RDoc/Ruby
+distributions. Please see the {file:LICENSE} and {file:LEGAL} documents for more
+information.
diff --git a/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/Rakefile b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/Rakefile
new file mode 100644
index 000000000..7fbea4e44
--- /dev/null
+++ b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/Rakefile
@@ -0,0 +1,36 @@
+# frozen_string_literal: true
+require File.dirname(__FILE__) + '/lib/yard'
+require File.dirname(__FILE__) + '/lib/yard/rubygems/specification'
+require 'rbconfig'
+
+YARD::VERSION.replace(ENV['YARD_VERSION']) if ENV['YARD_VERSION']
+
+Dir['tasks/**/*.rake'].each { |task_file| load task_file }
+
+desc "Builds the gem"
+task :gem do
+  sh "gem build yard.gemspec"
+end
+
+desc "Installs the gem"
+task :install => :gem do
+  sh "gem install yard-#{YARD::VERSION}.gem --no-document"
+end
+
+begin
+  require 'rspec/core/rake_task'
+  RSpec::Core::RakeTask.new(:spec)
+rescue LoadError
+  nil # noop
+end
+
+desc "Generate documentation for Yard, and fail if there are any warnings"
+task :test_doc do
+  sh "ruby bin/yard --fail-on-warning #{"--no-progress" if ENV["CI"]}"
+end
+
+task :default => [:spec, :test_doc]
+
+YARD::Rake::YardocTask.new do |t|
+  t.options += ['--title', "YARD #{YARD::VERSION} Documentation"]
+end
diff --git a/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/SECURITY.md b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/SECURITY.md
new file mode 100644
index 000000000..c5cb55456
--- /dev/null
+++ b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/SECURITY.md
@@ -0,0 +1,26 @@
+# Security Policy
+
+## Supported Versions
+
+The following versions are supported with security patches for
+any reported vulnerabilities in YARD or dependent software.
+
+| Version | Supported          |
+| ------- | ------------------ |
+| 0.9.x   | :white_check_mark: |
+| < 0.9   | :x:                |
+
+## Reporting a Vulnerability
+
+If you've discovered a vulnerability in YARD source code, please email
+lsegal@soen.ca with as much information as possible. You should typically
+receive a response within 24-48 hours, though depending on scheduling
+it may take up to a week to respond. If you do not get a response on
+your initial email within a few days, please re-send your email or
+reach out on other channels (such as yardoc@googlegroups.com) to
+try to get a hold of a maintainer. Please do not include sensitive
+material if you are reaching out through secondary channels unless
+you first receive confirmation that it is okay.
+
+Thank you for your help and cooperation in making YARD a stable and
+safe piece of software.
diff --git a/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/benchmarks/builtins_vs_eval.rb b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/benchmarks/builtins_vs_eval.rb
new file mode 100644
index 000000000..b9b152e40
--- /dev/null
+++ b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/benchmarks/builtins_vs_eval.rb
@@ -0,0 +1,24 @@
+# frozen_string_literal: true
+require 'benchmark'
+require File.join(File.dirname(__FILE__), '..', 'lib', 'yard')
+
+TIMES = (ARGV[0] || 10_000).to_i
+
+def bench_builtins(name)
+  YARD::CodeObjects::BUILTIN_EXCEPTIONS_HASH.key? name
+end
+
+def bench_eval(name)
+  eval(name).is_a?(Class)
+rescue
+  false
+end
+
+Benchmark.bmbm do |b|
+  b.report("builtins PASS") { TIMES.times { YARD::CodeObjects::BUILTIN_EXCEPTIONS.each {|y| bench_builtins(y) } } }
+  b.report("eval PASS") { TIMES.times { YARD::CodeObjects::BUILTIN_EXCEPTIONS.each {|y| bench_eval(y) } } }
+  b.report("builtins FAIL") { TIMES.times { YARD::CodeObjects::BUILTIN_MODULES.each {|y| bench_builtins(y) } } }
+  b.report("eval FAIL") { TIMES.times { YARD::CodeObjects::BUILTIN_MODULES.each {|y| bench_eval(y) } } }
+  b.report("builtins ANY") { TIMES.times { YARD::CodeObjects::BUILTIN_CLASSES.each {|y| bench_builtins(y) } } }
+  b.report("eval ANY") { TIMES.times { YARD::CodeObjects::BUILTIN_CLASSES.each {|y| bench_eval(y) } } }
+end
diff --git a/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/benchmarks/concat_vs_join.rb b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/benchmarks/concat_vs_join.rb
new file mode 100644
index 000000000..39909ceeb
--- /dev/null
+++ b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/benchmarks/concat_vs_join.rb
@@ -0,0 +1,13 @@
+# frozen_string_literal: true
+require "benchmark"
+
+STR1 = "Hello"
+JOIN = "::"
+STR2 = "World"
+
+TESTS = 100_000
+Benchmark.bmbm do |results|
+  results.report("concat") { TESTS.times { "".concat(STR1).concat(JOIN).concat(STR2) } }
+  results.report("add   ") { TESTS.times { STR1 + JOIN + STR2 } }
+  results.report("join  ") { TESTS.times { [STR1, STR2].join(JOIN) } }
+end
diff --git a/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/benchmarks/erb_vs_erubis.rb b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/benchmarks/erb_vs_erubis.rb
new file mode 100644
index 000000000..69cb16566
--- /dev/null
+++ b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/benchmarks/erb_vs_erubis.rb
@@ -0,0 +1,54 @@
+# frozen_string_literal: true
+require 'rubygems'
+require 'erubis'
+require 'erubis/tiny'
+require 'erb'
+require "benchmark"
+require File.join(File.dirname(__FILE__), '..', 'lib', 'yard')
+
+def rungen
+  YARD::Registry.load_yardoc(File.join(File.dirname(__FILE__), '..', '.yardoc'))
+  YARD::Registry.at("YARD::CodeObjects::Base").format(:format => :html)
+end
+
+Benchmark.bmbm do |x|
+  x.report("erubis") do
+    eval <<-eof
+      module YARD; module Templates; module Template
+        def erb_with(str, x) Erubis::Eruby.new(str) end
+      end end end
+    eof
+
+    rungen
+  end
+
+  x.report("fast-erubis") do
+    eval <<-eof
+      module YARD; module Templates; module Template
+        def erb_with(str, x) Erubis::FastEruby.new(str) end
+      end end end
+    eof
+
+    rungen
+  end
+
+  x.report("tiny-erubis") do
+    eval <<-eof
+      module YARD; module Templates; module Template
+        def erb_with(str, x) Erubis::TinyEruby.new(str) end
+      end end end
+    eof
+
+    rungen
+  end
+
+  x.report("erb") do
+    eval <<-eof
+       module YARD; module Templates; module Template
+        def erb_with(str, x) ERB.new(str) end
+      end end end
+    eof
+
+    rungen
+  end
+end
diff --git a/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/benchmarks/format_args.rb b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/benchmarks/format_args.rb
new file mode 100644
index 000000000..7497943a5
--- /dev/null
+++ b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/benchmarks/format_args.rb
@@ -0,0 +1,47 @@
+# frozen_string_literal: true
+require "benchmark"
+require 'lib/yard'
+
+def format_args_regex(object)
+  if object.signature
+    object.signature[/#{Regexp.quote object.name.to_s}\s*(.*)/, 1]
+  else
+    ""
+  end
+end
+
+def format_args_parameters(object)
+  if !object.parameters.empty?
+    args = object.parameters.map {|n, v| v ? "#{n} = #{v}" : n.to_s }.join(", ")
+    "(#{args})"
+  else
+    ""
+  end
+end
+
+YARD::Registry.load
+$object = YARD::Registry.at('YARD::Generators::Base#G')
+
+log.puts "regex:  " + format_args_regex($object)
+log.puts "params: " + format_args_parameters($object)
+log.puts
+
+TIMES = 100_000
+Benchmark.bmbm do |x|
+  x.report("regex")      { TIMES.times { format_args_regex($object) } }
+  x.report("parameters") { TIMES.times { format_args_parameters($object) } }
+end
+
+=begin LAST RUN Jun 23 2008
+regex:  (generator, opts = {})
+params: (generator, opts = {})
+
+Rehearsal ----------------------------------------------
+regex        1.270000   0.020000   1.290000 (  1.294558)
+parameters   0.690000   0.000000   0.690000 (  0.693324)
+------------------------------------- total: 1.980000sec
+
+                 user     system      total        real
+regex        1.260000   0.010000   1.270000 (  1.268214)
+parameters   0.670000   0.000000   0.670000 (  0.679114)
+=end
diff --git a/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/benchmarks/generation.rb b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/benchmarks/generation.rb
new file mode 100644
index 000000000..3a0cf765d
--- /dev/null
+++ b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/benchmarks/generation.rb
@@ -0,0 +1,38 @@
+# frozen_string_literal: true
+require "benchmark"
+require File.join(File.dirname(__FILE__), '..', 'lib', 'yard')
+
+unless YARD::CodeObjects::Proxy.private_instance_methods.include?('to_obj')
+  raise "This benchmark is dependent on YARD::CodeObjects::Proxy#to_obj"
+end
+
+def rungen
+  YARD::Registry.clear
+  YARD::CLI::Yardoc.run('--quiet', '--use-cache')
+end
+
+def redef(lock = false)
+  eval <<-eof
+    class YARD::CodeObjects::Proxy;
+      def to_obj
+        @obj #{lock ? '||' : ''}= YARD::Registry.resolve(@namespace, @name)
+      end
+    end
+  eof
+end
+
+Benchmark.bmbm do |x|
+  x.report("gen-w/o-locking")  { redef;       rungen }
+  x.report("gen-with-locking") { redef(true); rungen }
+end
+
+=begin Results from 2008-06-07
+Rehearsal ----------------------------------------------------
+gen-w/o-locking    9.650000   0.450000  10.100000 ( 10.150556)
+gen-with-locking   7.790000   0.400000   8.190000 (  8.373811)
+------------------------------------------ total: 18.290000sec
+
+                       user     system      total        real
+gen-w/o-locking    9.820000   0.430000  10.250000 ( 10.293283)
+gen-with-locking   7.820000   0.380000   8.200000 (  8.243326)
+=end
diff --git a/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/benchmarks/marshal_vs_dbm.rb b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/benchmarks/marshal_vs_dbm.rb
new file mode 100644
index 000000000..330d8113d
--- /dev/null
+++ b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/benchmarks/marshal_vs_dbm.rb
@@ -0,0 +1,64 @@
+# frozen_string_literal: true
+require 'benchmark'
+require 'dbm'
+
+MARSHAL_FILE = "marshal_test.db"
+DBM_FILE = "dbm_test"
+WRITE_TIMES = 1
+READ_TIMES = 100
+NUM_INDICES = 10_000
+INDICES = ['33', '857', '5022', '8555']
+
+def generate_index
+  '0' * (rand * 4096).floor
+end
+
+def write_dbm
+  File.unlink(DBM_FILE + ".db") if File.exist?(DBM_FILE + ".db")
+  handle = DBM.new(DBM_FILE)
+  NUM_INDICES.times {|t| handle[t.to_s] = Marshal.dump(generate_index) }
+  handle.close
+end
+
+def read_dbm
+  db = DBM.open(DBM_FILE)
+  INDICES.each {|index| Marshal.load(db[index]) }
+  db.close
+end
+
+def write_marshal
+  File.unlink(MARSHAL_FILE) if File.exist?(MARSHAL_FILE)
+  handle = {}
+  NUM_INDICES.times {|t| handle[t.to_s] = generate_index }
+  File.open(MARSHAL_FILE, "wb") {|f| f.write(Marshal.dump(handle)) }
+end
+
+def read_marshal
+  db = Marshal.load(File.read(MARSHAL_FILE))
+  INDICES.each {|index| db[index] }
+end
+
+Benchmark.bmbm do |x|
+  x.report("marshal-write") { WRITE_TIMES.times { write_marshal } }
+  x.report("dbm-write") { WRITE_TIMES.times { write_dbm } }
+  x.report("marshal-read ") { READ_TIMES.times { read_marshal } }
+  x.report("dbm-read ") { READ_TIMES.times { read_dbm } }
+end
+
+File.unlink(MARSHAL_FILE)
+File.unlink(DBM_FILE + ".db")
+
+__END__
+
+Rehearsal -------------------------------------------------
+marshal-write   0.090000   0.070000   0.160000 (  0.465820)
+dbm-write       0.560000   0.570000   1.130000 (  3.045556)
+marshal-read    4.640000   3.180000   7.820000 (  7.821978)
+dbm-read        0.020000   0.020000   0.040000 (  0.070920)
+---------------------------------------- total: 9.150000sec
+
+                    user     system      total        real
+marshal-write   0.080000   0.050000   0.130000 (  0.436561)
+dbm-write       0.560000   0.550000   1.110000 (  2.030530)
+marshal-read    4.670000   3.180000   7.850000 (  7.842232)
+dbm-read        0.010000   0.020000   0.030000 (  0.053928)
diff --git a/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/benchmarks/parsing.rb b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/benchmarks/parsing.rb
new file mode 100644
index 000000000..5823bd43d
--- /dev/null
+++ b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/benchmarks/parsing.rb
@@ -0,0 +1,46 @@
+# frozen_string_literal: true
+require "benchmark"
+require 'yard'
+require 'logger'
+
+PATH_ORDER = [
+  'lib/yard/autoload.rb',
+  'lib/yard/code_objects/base.rb',
+  'lib/yard/code_objects/namespace_object.rb',
+  'lib/yard/handlers/base.rb',
+  'lib/yard/generators/helpers/*.rb',
+  'lib/yard/generators/base.rb',
+  'lib/yard/generators/method_listing_generator.rb',
+  'lib/yard/serializers/base.rb',
+  'lib/**/*.rb'
+]
+
+Benchmark.bmbm do |x|
+  x.report("parse in order") { YARD::Registry.clear; YARD.parse PATH_ORDER, [], Logger::ERROR }
+  x.report("parse") { YARD::Registry.clear; YARD.parse 'lib/**/*.rb', [], Logger::ERROR }
+end
+
+=begin
+load_order branch (2008-06-07):
+
+Rehearsal --------------------------------------------------
+parse in order   6.510000   0.050000   6.560000 (  6.563223)
+parse            6.300000   0.040000   6.340000 (  6.362272)
+---------------------------------------- total: 12.900000sec
+
+                     user     system      total        real
+parse in order   6.310000   0.060000   6.370000 (  6.390945)
+parse            6.300000   0.050000   6.350000 (  6.366709)
+
+
+api_changes branch before merge (2008-06-07)
+
+Rehearsal --------------------------------------------------
+parse in order   6.330000   0.050000   6.380000 (  6.397552)
+parse            6.380000   0.050000   6.430000 (  6.446954)
+---------------------------------------- total: 12.810000sec
+
+                     user     system      total        real
+parse in order   6.320000   0.040000   6.360000 (  6.394460)
+parse            6.040000   0.040000   6.080000 (  6.099738)
+=end
diff --git a/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/benchmarks/pathname_vs_string.rb b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/benchmarks/pathname_vs_string.rb
new file mode 100644
index 000000000..2cf97834f
--- /dev/null
+++ b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/benchmarks/pathname_vs_string.rb
@@ -0,0 +1,51 @@
+# frozen_string_literal: true
+require 'pathname'
+require "benchmark"
+require File.dirname(__FILE__) + '/../lib/yard'
+
+pathobj = Pathname.new("a/b/c")
+strobj  = "a/b/c"
+
+TIMES = 1_000
+
+log.puts "join:"
+Benchmark.bmbm do |x|
+  x.report("pathname") { TIMES.times { Pathname.new("a/b/c").join("d", "e", "f") } }
+  x.report("string  ") { TIMES.times { File.join("a/b/c", "d", "e", "f") } }
+  x.report("pathname-sameobject") { TIMES.times { pathobj.join("d", "e", "f") } }
+  x.report("string-sameobject  ") { TIMES.times { File.join(strobj, "d", "e", "f") } }
+end
+
+log.puts
+log.puts
+log.puts "cleanpath:"
+Benchmark.bmbm do |x|
+  x.report("pathname") { TIMES.times { Pathname.new("a/b//.././c").cleanpath } }
+  x.report("string  ") { TIMES.times { File.cleanpath("a/b//.././c") } }
+end
+
+__END__
+join:
+Rehearsal -------------------------------------------------------
+pathname              0.330000   0.020000   0.350000 (  0.353481)
+string                0.010000   0.000000   0.010000 (  0.001390)
+pathname-sameobject   0.360000   0.020000   0.380000 (  0.384473)
+string-sameobject     0.000000   0.000000   0.000000 (  0.001187)
+---------------------------------------------- total: 0.740000sec
+
+                          user     system      total        real
+pathname              0.330000   0.020000   0.350000 (  0.350820)
+string                0.000000   0.000000   0.000000 (  0.001055)
+pathname-sameobject   0.330000   0.010000   0.340000 (  0.346949)
+string-sameobject     0.000000   0.000000   0.000000 (  0.001141)
+
+
+cleanpath:
+Rehearsal --------------------------------------------
+pathname   0.060000   0.000000   0.060000 (  0.059767)
+string     0.010000   0.000000   0.010000 (  0.013775)
+----------------------------------- total: 0.070000sec
+
+               user     system      total        real
+pathname   0.060000   0.000000   0.060000 (  0.059697)
+string     0.020000   0.000000   0.020000 (  0.013624)
\ No newline at end of file
diff --git a/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/benchmarks/rdoc_vs_yardoc.rb b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/benchmarks/rdoc_vs_yardoc.rb
new file mode 100644
index 000000000..704ddc218
--- /dev/null
+++ b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/benchmarks/rdoc_vs_yardoc.rb
@@ -0,0 +1,11 @@
+# frozen_string_literal: true
+require "benchmark"
+
+files = Dir.glob(File.dirname(__FILE__) + '/../lib/**/*.rb').join(" ")
+Benchmark.bmbm do |x|
+  x.report("rdoc") { `rm -rf rdoc && rdoc -q -o rdoc #{files} && rm -rf rdoc` }
+  x.report("yardoc") { `rm -rf yard && ./bin/yardoc -q -o yard #{files} && rm -rf yard` }
+  x.report("yardoc-cached") { `rm -rf yard && ./bin/yardoc -c -q -o yard #{files} && rm -rf yard` }
+  x.report("yardoc-legacy") { `rm -rf yard && ./bin/yardoc --legacy -q -o yard #{files} && rm -rf yard` }
+  x.report("yardoc-legacy-cached") { `rm -rf yard && ./bin/yardoc --legacy -c -q -o yard #{files} && rm -rf yard` }
+end
diff --git a/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/benchmarks/registry_store_types.rb b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/benchmarks/registry_store_types.rb
new file mode 100644
index 000000000..a13f24859
--- /dev/null
+++ b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/benchmarks/registry_store_types.rb
@@ -0,0 +1,49 @@
+# frozen_string_literal: true
+require 'benchmark'
+require File.join(File.dirname(__FILE__), '..', 'lib', 'yard')
+
+def parse_and_select_objects
+  YARD::Registry.load_yardoc(File.join(File.dirname(__FILE__), '..', '.yardoc'))
+  YARD::Registry.load_all
+  $paths = []
+  4.times { $paths << YARD::Registry.paths[rand(YARD::Registry.paths.size)] }
+
+  $regular_registry = {}
+  $types_registry = {}
+  YARD::Registry.all.each do |object|
+    $regular_registry[object.path] = object
+    ($types_registry[object.type] ||= {})[object.path] = object
+  end
+end
+
+def run_lookup
+  $paths.select {|path| $regular_registry[path] }
+end
+
+def run_lookup_with_types
+  $paths.select {|path| $types_registry.values.find {|list| list[path] } }
+end
+
+TIMES = 100_000
+
+parse_and_select_objects
+p $paths
+Benchmark.bmbm do |x|
+  x.report("normal") { TIMES.times { run_lookup } }
+  x.report("types")  { TIMES.times { run_lookup_with_types } }
+end
+
+__END__
+# Run on March 22 2012
+["YARD::Parser::Ruby::Legacy::RubyToken::TkUnknownChar#initialize",
+  "YARD::Parser::C::CParser#enumerator",
+  "YARD::CodeObjects::ClassObject#inherited_meths",
+  "YARD::Parser::C::Statement#source="]
+Rehearsal ----------------------------------------------
+normal       0.180000   0.000000   0.180000 (  0.182640)
+types        1.150000   0.010000   1.160000 (  1.160219)
+------------------------------------- total: 1.340000sec
+
+                 user     system      total        real
+normal       0.170000   0.000000   0.170000 (  0.165621)
+types        1.140000   0.000000   1.140000 (  1.142269)
diff --git a/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/benchmarks/ri_vs_yri.rb b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/benchmarks/ri_vs_yri.rb
new file mode 100644
index 000000000..afa0ef38e
--- /dev/null
+++ b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/benchmarks/ri_vs_yri.rb
@@ -0,0 +1,19 @@
+# frozen_string_literal: true
+require "benchmark"
+
+TIMES = 10
+Benchmark.bmbm do |x|
+  x.report("ri") { TIMES.times { `ri -T YARD::Tags::Library` } }
+  x.report("yri") { TIMES.times { `./bin/yri -T YARD::Tags::Library` } }
+end
+
+__END__
+
+Rehearsal ---------------------------------------
+ri    0.000000   0.020000   6.880000 (  6.929591)
+yri   0.000000   0.000000   1.060000 (  1.074840)
+------------------------------ total: 7.940000sec
+
+          user     system      total        real
+ri    0.000000   0.020000   6.850000 (  6.871660)
+yri   0.000000   0.010000   1.060000 (  1.067585)
diff --git a/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/benchmarks/ripper_parser.rb b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/benchmarks/ripper_parser.rb
new file mode 100644
index 000000000..45059468a
--- /dev/null
+++ b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/benchmarks/ripper_parser.rb
@@ -0,0 +1,13 @@
+# encoding: utf-8
+# frozen_string_literal: true
+require 'benchmark'
+require File.dirname(__FILE__) + '/../lib/yard'
+
+$files = Dir[File.dirname(__FILE__) + '/../lib/**/*.rb'].map {|f| File.read(f) }
+$files_rip = Dir[File.dirname(__FILE__) + '/../lib/**/*.rb'].map {|f| [File.read(f), f] }
+
+TIMES = 2
+Benchmark.bmbm do |x|
+  x.report("rip-parser") { TIMES.times { $files_rip.each {|f| YARD::Parser::Ruby::RubyParser.parse(*f) } } }
+  x.report("yard-parser  ") { TIMES.times { $files.each {|f| YARD::Parser::Ruby::Legacy::StatementList.new(f) } } }
+end
diff --git a/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/benchmarks/splat_vs_flatten.rb b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/benchmarks/splat_vs_flatten.rb
new file mode 100644
index 000000000..ab157539b
--- /dev/null
+++ b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/benchmarks/splat_vs_flatten.rb
@@ -0,0 +1,13 @@
+# frozen_string_literal: true
+require "benchmark"
+
+# To prove that flattening a small list is not significantly slower than
+# calling *list (used to get around create_tag list issue)
+$a = "FOO BAR BAZ"
+def foo(*args) args.last.inspect end
+
+TESTS = 10_000
+Benchmark.bmbm do |x|
+  x.report("splat") { TESTS.times { foo(*$a) } }
+  x.report("flatten") { TESTS.times { foo(*[$a].flatten) } }
+end
diff --git a/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/benchmarks/template_erb.rb b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/benchmarks/template_erb.rb
new file mode 100644
index 000000000..259772b17
--- /dev/null
+++ b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/benchmarks/template_erb.rb
@@ -0,0 +1,23 @@
+# frozen_string_literal: true
+require "benchmark"
+require File.join(File.dirname(__FILE__), '..', 'lib', 'yard')
+
+YARD::Registry.load_yardoc(File.join(File.dirname(__FILE__), '..', '.yardoc'))
+obj = YARD::Registry.at("YARD::CodeObjects::Base")
+
+TIMES = 3
+Benchmark.bm do |x|
+  x.report("trim-line") { TIMES.times { obj.format(:format => :html) } }
+  module YARD
+    module Templates
+      module Template
+        def erb(section, &block)
+          erb = ERB.new(cache(section))
+          erb.filename = cache_filename(section).to_s
+          erb.result(binding, &block)
+        end
+      end
+    end
+  end
+  x.report("no-trim  ") { TIMES.times { obj.format(:format => :html) } }
+end
diff --git a/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/benchmarks/template_format.rb b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/benchmarks/template_format.rb
new file mode 100644
index 000000000..25905b30b
--- /dev/null
+++ b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/benchmarks/template_format.rb
@@ -0,0 +1,7 @@
+# frozen_string_literal: true
+require "benchmark"
+require File.join(File.dirname(__FILE__), '..', 'lib', 'yard')
+
+YARD::Registry.load_yardoc(File.join(File.dirname(__FILE__), '..', '.yardoc'))
+obj = YARD::Registry.at("YARD::CodeObjects::Base")
+log.puts Benchmark.measure { obj.format(:format => :html) }
diff --git a/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/benchmarks/template_profile.rb b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/benchmarks/template_profile.rb
new file mode 100644
index 000000000..1ba32125e
--- /dev/null
+++ b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/benchmarks/template_profile.rb
@@ -0,0 +1,18 @@
+# frozen_string_literal: true
+require 'rubygems'
+require 'ruby-prof'
+# require 'benchmark'
+require File.join(File.dirname(__FILE__), '..', 'lib', 'yard')
+
+YARD::Registry.load_yardoc(File.join(File.dirname(__FILE__), '..', '.yardoc'))
+obj = YARD::Registry.at("YARD::CodeObjects::Base")
+
+# PerfTools::CpuProfiler.start("template_profile") do
+# end
+
+result = RubyProf.profile do
+  obj.format(:format => :html, :no_highlight => true)
+end
+
+printer = RubyProf::CallTreePrinter.new(result)
+printer.print(STDOUT)
diff --git a/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/benchmarks/yri_cache.rb b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/benchmarks/yri_cache.rb
new file mode 100644
index 000000000..0b98ff16a
--- /dev/null
+++ b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/benchmarks/yri_cache.rb
@@ -0,0 +1,20 @@
+# frozen_string_literal: true
+require File.dirname(__FILE__) + "/../lib/yard"
+require "benchmark"
+include YARD::CLI
+
+class YARD::CLI::YRI
+  def print_object(object) end
+end
+
+def remove_cache
+  File.unlink(YRI::CACHE_FILE)
+end
+
+TIMES = 10
+NAME = 'YARD'
+remove_cache; YRI.run(NAME)
+Benchmark.bmbm do |x|
+  x.report("cache   ") { TIMES.times { YRI.run(NAME) } }
+  x.report("no-cache") { TIMES.times { remove_cache; YRI.run(NAME) } }
+end
diff --git a/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/bin/yard b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/bin/yard
new file mode 100755
index 000000000..d17a7d04c
--- /dev/null
+++ b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/bin/yard
@@ -0,0 +1,13 @@
+#!/usr/bin/env ruby
+# frozen_string_literal: true
+
+# We do all this work just to find the proper load path
+path = __FILE__
+while File.symlink?(path)
+  path = File.expand_path(File.readlink(path), File.dirname(path))
+end
+$LOAD_PATH.unshift(File.join(File.dirname(File.expand_path(path)), '..', 'lib'))
+
+require 'yard'
+
+YARD::CLI::CommandParser.run(*ARGV)
diff --git a/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/bin/yardoc b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/bin/yardoc
new file mode 100755
index 000000000..6ead3194b
--- /dev/null
+++ b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/bin/yardoc
@@ -0,0 +1,13 @@
+#!/usr/bin/env ruby
+# frozen_string_literal: true
+
+# We do all this work just to find the proper load path
+path = __FILE__
+while File.symlink?(path)
+  path = File.expand_path(File.readlink(path), File.dirname(path))
+end
+$LOAD_PATH.unshift(File.join(File.dirname(File.expand_path(path)), '..', 'lib'))
+
+require 'yard'
+
+YARD::CLI::Yardoc.run(*ARGV)
diff --git a/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/bin/yri b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/bin/yri
new file mode 100755
index 000000000..29014eed3
--- /dev/null
+++ b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/bin/yri
@@ -0,0 +1,13 @@
+#!/usr/bin/env ruby
+# frozen_string_literal: true
+
+# We do all this work just to find the proper load path
+path = __FILE__
+while File.symlink?(path)
+  path = File.expand_path(File.readlink(path), File.dirname(path))
+end
+$LOAD_PATH.unshift(File.join(File.dirname(File.expand_path(path)), '..', 'lib'))
+
+require 'yard'
+
+YARD::CLI::YRI.run(*ARGV)
diff --git a/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/docs/CodeObjects.md b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/docs/CodeObjects.md
new file mode 100644
index 000000000..cd76843cb
--- /dev/null
+++ b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/docs/CodeObjects.md
@@ -0,0 +1,115 @@
+# @title CodeObjects Architecture
+
+# CodeObjects Architecture
+
+Code objects are Ruby objects that describe the code being documented. For instance,
+all classes, modules, methods, etc. are all extracted from the Ruby source as code
+objects. All of these code objects extend from the {YARD::CodeObjects::Base} class, which
+provides basic attributes like source location, source code, name and path.
+
+## CodeObjects Organization
+
+Code objects are divided into two basic types. {YARD::CodeObjects::NamespaceObject NamespaceObjects}
+and non-namespace objects. A namespace object refers to any object in Ruby that can have
+other objects defined inside of it. In the context of Ruby, this specifically means
+modules and classes (both of which are subclasses of `NamespaceObject`). These objects
+act like tree structures, maintaining a list of all of their direct children. All non
+namespace objects are simply subclasses of the Base class. The {YARD::CodeObjects::RootObject RootObject}
+is a special kind of `NamespaceObject` which refers to the top level namespace in Ruby.
+Methods that accept a namespace object as a parameter should also accept the symbol
+`:root` as a shortcut for the root object.
+
+The following is an overview of the classes within the `CodeObjects` namespace:
+
+![CodeObjects Class Diagram](images/code-objects-class-diagram.png)
+
+## Unique Path Representation
+
+All CodeObjects are uniquely defined by their implementation of {YARD::CodeObjects::Base#path}.
+This path is used to locate or store a code object in the {YARD::Registry}. It is therefore
+essential that any Base subclass return a unique String value for #path so that the
+object may co-exist with other objects in the Registry.
+
+In practice, a path is simply the conventional Ruby representation of a class,
+module, constant, class variable or method. For example, the following objects
+would have the following respective paths:
+
+* Class `Klass` inside module `Mod`: `Mod::Klass`
+* Instance method `bar` inside class `Foo`: `Foo#bar`
+* Class method `bar` inside class `Foo`: `Foo.bar`
+* Constant `VERSION` inside class `YARD`: `YARD::VERSION`
+* Class variable `@@abc` inside class `A`: `A::@@abc`
+
+## Registry
+
+CodeObjects classes are coupled with the {YARD::Registry} class which keeps track of
+all instantiated code objects. This is an explicit design choice to allow objects
+to be fetched, cached, imported and exported from a centralized location. As mentioned
+above, this coupling is a result of the fact that each object is uniquely identified by
+its path, which is used to implement lookups. You can read more about the registry
+in the {YARD::Registry} class.
+
+## Identity Map
+
+Code objects are instantiated using an identity-map like implementation that guarantees
+only one unique Ruby object exists for an object described by a specific path. This
+allows developers to create a code object without checking if it already exists in
+the {YARD::Registry}. The following example will only create one object:
+
+    id = ClassObject.new(:root, "MyClass").object_id #=> 13352
+    ClassObject.new(:root, "MyClass").object_id #=> 13352
+
+## Proxy Objects
+
+In addition to providing access to existing objects, a {YARD::CodeObjects::Proxy}
+class exists which can represent an object at a path that may or may not have been
+created. This is necessary to represent a reference to an object in code that is
+never defined in the same body of source code, or perhaps defined later. If any
+attributes of a proxy are accessed, it will immediately be resolved to the object
+at its declared path. In the case where such an object exists, it will act as
+a delegate to the object. However, if the object does not exist, a warning will
+be raised. Whenever arbitrary code objects are used, care should be taken in
+order to make sure attributes are not accessed on unresolvable proxies. An
+unresolvable proxy will return a class name of `Proxy` and #type of `:proxy`,
+for example:
+
+    P(:InvalidObject).type == :proxy  #=> true
+    P(:InvalidObject).is_a?(Proxy)    #=> true
+
+## Adding Data to Code Objects
+
+Code objects act as hash-like structures that allow any arbitrary value to be set.
+This allows easy extending of existing objects without creating custom subclasses.
+For instance, to add a timestamp to a method object (when it was modified, maybe),
+it is possible to simply do:
+
+    object = MethodObject.new(:root, "my_method")
+    object[:modified_at] = Time.now
+
+This value can now be retrieved on this object both by the hash `[]` syntax as
+well as like any other method:
+
+    object.modified_at #=> 2009-06-03 20:08:46 -0400
+
+## Creating a Custom CodeObject
+
+It should first be mentioned that creating a custom code object should not be
+necessary in most cases, except when functionality that cannot be represented
+by classical Ruby objects is added. A good example *might* be a test class,
+which although is technically a Ruby class, has a significantly different purpose
+in documentation and needs a different set of metadata, as well as its own
+representation in documentation.
+
+The {YARD::CodeObjects::Base#path} implementation is the most important part of the
+code object architecture. The first thing any custom code object must guarantee is
+that its path value is unique among all other objects. The recommended way to do this
+with custom objects is to add a descriptive prefix to the path. For example, the
+following is an implementation of the path for a hypothetical `FooObject`:
+
+    def path
+      "__FooPrefix" + sep + super
+    end
+
+Note that if our FooObject is a `NamespaceObject`, meaning if it can have child
+FooObjects defined inside of it, you may need to verify that the prefix is only
+applied once.
diff --git a/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/docs/GettingStarted.md b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/docs/GettingStarted.md
new file mode 100644
index 000000000..6b35afa78
--- /dev/null
+++ b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/docs/GettingStarted.md
@@ -0,0 +1,679 @@
+# @title Getting Started Guide
+
+# Getting Started with YARD
+
+There are a few ways which YARD can be of use to you or your project. This
+document will cover the most common ways to use YARD:
+
+* [Documenting Code with YARD](#docing)
+* [Using YARD to Generate Documentation](#using)
+* [Configuring YARD](#config)
+* [Extending YARD](#extending)
+* [Templating YARD](#templating)
+* [Plugin Support](#plugins)
+
+
+
+## Documenting Code with YARD
+
+By default, YARD is compatible with the same RDoc syntax most Ruby developers
+are already familiar with. However, one of the biggest advantages of YARD is
+the extended meta-data syntax, commonly known as "tags", that you can use
+to express small bits of information in a structured and formal manner. While
+RDoc syntax expects you to describe your method in a completely free-form
+manner, YARD recommends declaring your parameters, return types, etc. with
+the `@tag` syntax, which makes outputting the documentation more consistent
+and easier to read. Consider the RDoc documentation for a method to_format:
+
+    # Converts the object into textual markup given a specific `format`
+    # (defaults to `:html`)
+    #
+    # == Parameters:
+    # format::
+    #   A Symbol declaring the format to convert the object to. This
+    #   can be `:text` or `:html`.
+    #
+    # == Returns:
+    # A string representing the object in a specified
+    # format.
+    #
+    def to_format(format = :html)
+      # format the object
+    end
+
+While this may seem easy enough to read and understand, it's hard for a machine
+to properly pull this data back out of our documentation. Also we've tied our
+markup to our content, and now our documentation becomes hard to maintain if
+we decide later to change our markup style (maybe we don't want the ":" suffix
+on our headers anymore).
+
+In YARD, we would simply define our method as:
+
+    # Converts the object into textual markup given a specific format.
+    #
+    # @param format [Symbol] the format type, `:text` or `:html`
+    # @return [String] the object converted into the expected format.
+    def to_format(format = :html)
+      # format the object
+    end
+
+Using tags we can add semantic metadata to our code without worrying about
+presentation. YARD will handle presentation for us when we decide to generate
+documentation later.
+
+## Which Markup Format?
+
+YARD does not impose a specific markup. The above example uses standard RDoc
+markup formatting, but YARD also supports textile and markdown via the
+command-line switch or `.yardopts` file (see below). This means that you are
+free to use whatever formatting you like. This guide is actually written
+using markdown. YARD, however, does add a few important syntaxes that are
+processed no matter which markup formatting you use, such as tag support
+and inter-document linking. These syntaxes are discussed below.
+
+## Adding Tags to Documentation
+
+The tag syntax that YARD uses is the same @tag-style syntax you may have seen
+if you've ever coded in Java, Python, PHP, Objective-C or a myriad of other
+languages. The following tag adds an author tag to your class:
+
+    # @author Loren Segal
+    class MyClass
+    end
+
+To allow for large amounts of text, the @tag syntax will recognize any indented
+lines following a tag as part of the tag data. For example:
+
+    # @deprecated Use {#my_new_method} instead of this method because
+    #   it uses a library that is no longer supported in Ruby 1.9.
+    #   The new method accepts the same parameters.
+    def mymethod
+    end
+
+### List of Tags
+
+A list of tags can be found in {file:docs/Tags.md#taglist}
+
+### Reference Tags
+
+To reduce the amount of duplication in writing documentation for repetitive
+code, YARD introduces "reference tags", which are not quite tags, but not
+quite docstrings either. In a sense, they are tag (and docstring) modifiers.
+Basically, any docstring (or tag) that begins with "(see OTHEROBJECT)" will
+implicitly link the docstring or tag to the "OTHEROBJECT", copying any data
+from that docstring/tag into your current object. Consider the example:
+
+    class MyWebServer
+      # Handles a request
+      # @param request [Request] the request object
+      # @return [String] the resulting webpage
+      def get(request) "hello" end
+
+      # (see #get)
+      def post(request) "hello" end
+    end
+
+The above `#post` method takes the docstring and all tags (`param` and `return`)
+of the `#get` method. When you generate HTML documentation, you will see this
+duplication automatically, so you don't have to manually type it out. We can
+also add our own custom docstring information below the "see" reference, and
+whatever we write will be appended to the docstring:
+
+    # (see #get)
+    # @note This method may modify our application state!
+    def post(request) self.state += 1; "hello" end
+
+Here we added another tag, but we could have also added plain text. The
+text must be appended *after* the `(see ...)` statement, preferably on
+a separate line.
+
+Note that we don't have to "refer" the whole docstring. We can also link
+individual tags instead. Since "get" and "post" actually have different
+descriptions, a more accurate example would be to only refer our parameter
+and return tags:
+
+    class MyWebServer
+      # Handles a GET request
+      # @param request [Request] the request object
+      # @return [String] the resulting webpage
+      def get(request) "hello" end
+
+      # Handles a POST request
+      # @note This method may modify our application state!
+      # @param (see #get)
+      # @return (see #get)
+      def post(request) self.state += 1; "hello" end
+    end
+
+The above copies all of the param and return tags from `#get`. Note that you
+cannot copy individual tags of a specific type with this syntax.
+
+## Declaring Types
+
+Some tags also have an optional "types" field which let us declare a list of
+types associated with the tag. For instance, a return tag can be declared
+with or without a types field.
+
+    # @return [String, nil] the contents of our object or nil
+    #   if the object has not been filled with data.
+    def validate; end
+
+    # We don't care about the "type" here:
+    # @return the object
+    def to_obj; end
+
+The list of types is in the form `[type1, type2, ...]` and is mostly free-form,
+so we can also specify duck-types or constant values. For example:
+
+    # @param argname [#to_s] any object that responds to `#to_s`
+    # @param argname [true, false] only true or false
+
+Note the latter example can be replaced by the meta-type "Boolean".
+Another meta-type is "void", which stands for "no meaningful value"
+and is used for return values. These meta-types are by convention
+only, but are recommended.
+
+List types can be specified in the form `CollectionClass`.
+For instance, consider the following Array that holds a set of Strings and
+Symbols:
+
+    # @param list [Array] the list of strings and symbols.
+
+We mentioned that these type fields are "mostly" free-form. In truth, they
+are defined "by convention". To view samples of common type specifications
+and recommended conventions for writing type specifications, see
+[http://yardoc.org/types.html](http://yardoc.org/types.html). Note that these
+conventions may change every now and then, although we are working on a more
+"formal" type specification proposal.
+
+## Documenting Attributes
+
+To document a Ruby attribute, add documentation text above the attribute
+definition.
+
+    # Controls the amplitude of the waveform.
+    # @return [Numeric] the amplitude of the waveform
+    attr_accessor :amplitude
+
+As a short-hand syntax for declaring reader and writer attribute pairs,
+YARD will automatically wire up the correct method types and information
+by simply defining documentation in the `@return` tag. For example,
+the following declaration will show the correct information for the
+`waveform` attribute, both for the getter's return type and the
+setter's value parameter type: 
+
+    # @return [Numeric] the amplitude of the waveform
+    attr_accessor :amplitude
+
+In this case, the most important details for the attribute are the
+object type declaration and its descriptive text.
+
+### Documentation for a Separate Attribute Writer
+
+Usually an attribute will get and set a value using the same syntax,
+so there is no reason to have separate documentation for an attribute
+writer. In the above `amplitude` case, the `Numeric` type is both used
+for the getter and setter types.
+
+Sometimes, however, you might want to have separate documentation
+for the getter and setter. In this case, you would still add
+the documentation text to the getter declaration (or `attr_accessor`)
+and use `@overload` tags to declare the separate docstrings. For example:
+
+    # @overload amplitude
+    #   Gets the current waveform amplitude.
+    #   @return [Numeric] the amplitude of the waveform
+    # @overload amplitude=(value)
+    #   Sets the new amplitude.
+    #   @param value [Numeric] the new amplitude value
+    #   @note The new amplitude will only take effect if {#restart}
+    #     is called on the stream.
+
+Note that by default, YARD exposes the reader portion of the attribute
+in HTML output. If you have separate `attr_reader` and `attr_writer`
+declarations, make sure to put your documentation (for both reader
+and writer methods) on the reader declaration using `@overload`
+tags as described above. For example:
+
+    # @overload ...documentation here...
+    attr_reader :amplitude
+
+    # This documentation will be ignored by YARD.
+    attr_writer :amplitude
+
+## Documenting Custom DSL Methods
+
+Application code in Ruby often makes use of DSL style metaprogrammed methods.
+The most common is the `attr_accessor` method, which of course has built-in
+support in YARD. However, frameworks and libraries often expose custom
+methods that perform similar metaprogramming tasks, and it is often useful
+to document their functionality in your application. Consider the `property`
+method in a project like [DataMapper](http://datamapper.org), which creates
+a typed attribute for a database model. The code might look like:
+
+    class Post
+      include DataMapper::Resource
+
+      property :title, String
+    end
+
+As of version 0.7.0, YARD will automatically pick up on these basic methods if
+you document them with a docstring. Therefore, simply adding some comments to
+the code will cause it to generate documentation:
+
+    class Post
+      include DataMapper::Resource
+
+      # @return [String] the title property of the post
+      property :title, String
+    end
+
+Note that YARD uses the first argument in the method call to determine the
+method name. In some cases, this would not be the method name, and you would
+need to declare it manually. You can do so with the `@!method` directive:
+
+    # @!method foo
+    create_a_foo_method
+
+The @!method directive can also accept a full method signature with parameters:
+
+    # @!method foo(name, opts = {})
+    create_a_foo_method
+
+You can also set visibility and scope, or modify the method signature with
+extra tags. The following adds documentation for a private class method:
+
+    # @!method foo(opts = {})
+    # The foo method!
+    # @!scope class
+    # @!visibility private
+    create_a_private_foo_class_method
+
+Finally, you can tag a method as an attribute by replacing the @!method
+tag with @!attribute. The @!attribute directive allows for the flags [r], [w],
+or [rw] to declare a readonly, writeonly, or readwrite attribute, respectively.
+
+    # @!attribute [w]
+    # The writeonly foo attribute!
+    a_writeonly_attribute :foo
+
+(Note that if the name can be automatically detected, you do not need to
+specify it in the @!method or @!attribute directives)
+
+However, you will notice a few drawbacks with this basic support:
+
+1. There is a fair bit of duplication in such documentation. Specifically, we
+   repeat the term String and title twice in the property example.
+2. We must write a code comment for this property to show up in the documentation.
+   If we do not write a comment, it is ignored.
+
+### Macros
+
+Fortunately YARD 0.7.0 also adds macros, a powerful way to add support for
+these DSL methods on the fly without writing extra plugins. Macros allow
+you to interpolate arguments from the method call inside the docstring,
+reducing duplication. If we re-wrote the `property` example from above
+using a macro, it might look like:
+
+    class Post
+      include DataMapper::Resource
+
+      # @!macro dm.property
+      # @return [$2] the $1 $0 of the post
+      property :title, String
+    end
+
+(Note that $0 represents the method call, in this case `property`. The rest
+are arguments in the method call.)
+
+The above example is equivalent to the first version shown in the previous
+section. There is also some extra benefit to using this macro, in that we
+can re-apply it to any other property in our class by simply calling on
+the macro. The following:
+
+    # @!macro dm.property
+    property :view_count, Integer
+
+Would be equivalent to:
+
+    # @return [Integer] the view_count property of the post
+    property :view_count, Integer
+
+Finally, macros can be "attached" to method calls, allowing them to be implicitly
+activated every time the method call is seen in the source code of the class,
+or an inheriting class. By simply adding the `[attach]` flag, the macro
+becomes implicit on future calls. All of the properties below get documented
+by using this snippet:
+
+    class Post
+      include DataMapper::Resource
+
+      # @!macro [attach] dm.property
+      # @return [$2] the $1 $0 of the post
+      property :title, String
+      property :view_count, Integer
+      property :email, String
+    end
+
+You can read more about macros in the {file:docs/Tags.md Tags Overview} document.
+
+## Customized YARD Markup
+
+YARD supports a special syntax to link to other code objects, URLs, files,
+or embed docstrings between documents. This syntax has the general form
+of `{Name OptionalTitle}` (where `OptionalTitle` can have spaces, but `Name`
+cannot).
+
+### Linking Objects `{...}`
+
+To link another "object" (class, method, module, etc.), use the format:
+
+    {ObjectName#method OPTIONAL_TITLE}
+    {Class::CONSTANT My constant's title}
+    {#method_inside_current_namespace}
+
+Without an explicit title, YARD will use the relative path to the object as
+the link name. Note that you can also use relative paths inside the object
+path to refer to an object inside the same namespace as your current docstring.
+
+Note that the `@see` tag automatically links its data. You should not use
+the link syntax in this tag:
+
+    # @see #methodname   <- Correct.
+    # @see {#methodname} <- Incorrect.
+
+If you want to use a Hash, prefix the first { with "!":
+
+   # !{ :some_key => 'value' }
+
+### Linking URLs `{http://...}`
+
+URLs are also linked using this `{...}` syntax:
+
+    {http://example.com Optional Title}
+    {mailto:email@example.com}
+
+### Linking Files `{file:...}`
+
+Files can also be linked using this same syntax but by adding the `file:`
+prefix to the object name. Files refer to extra readme files you added
+via the command-line. Consider the following examples:
+
+    {file:docs/GettingStarted.md Getting Started}
+    {file:mypage.html#anchor Name}
+
+As shown, you can also add an optional `#anchor` if the page is an HTML link.
+
+### Embedding Docstrings `{include:...}`
+
+We saw the `(see ...)` syntax above, which allowed us to link an entire docstring
+with another. Sometimes, however, we just want to copy docstring text without
+tags. Using the same `{...}` syntax, but using the `include:` prefix, we can
+embed a docstring (minus tags) at a specific point in the text.
+
+    # This class is cool
+    # @abstract
+    class Foo; end
+
+    # This is another class. {include:Foo} too!
+    class Bar; end
+
+The docstring for Bar becomes:
+
+    "This is another class. This class is cool too!"
+
+### Embedding Files `{include:file:...}`
+
+You can embed the contents of files using `{include:file:path/to/file}`,
+similar to the `{include:OBJECT}` tag above. If the file uses a specific markup
+type, it will be applied and embedded as marked up text. The following
+shows how the tag can be used inside of comments:
+
+    # Here is an example of a highlighted Ruby file:
+    #
+    # {include:file:examples/test.rb}
+
+### Rendering Objects `{render:...}`
+
+Entire objects can also be rendered in place in documentation. This can be
+used for guide-style documentation which does not document the entire source
+tree, but instead selectively renders important classes or methods. Consider
+the following documentation inside of a README file:
+
+    !!!plain
+    = igLatinPay!
+
+    This library adds pig latin methods to the string class, allowing you
+    to transform sentences into pig latin.
+
+    {render:String#pig_latin}
+
+    You can also un-pig-latin-ify a word or sentence:
+
+    {render:String#de_pig_latin}
+
+The above would render the methods in place inside the README document,
+allowing you to summarize a small library in a single file.
+
+
+
+## Using YARD to Generate Documentation
+
+### `yard` Executable
+
+YARD ships with a single executable aptly named `yard`. In addition to
+generating standard documentation for your project, you would use this tool
+if you wanted to:
+
+* Document all installed gems
+* Run a local documentation server
+* Generate UML diagrams using [Graphviz][graphviz]
+* View `ri`-style documentation
+* Diff your documentation
+* Analyze documentation statistics.
+
+The following commands are available in YARD 0.6.x (see `yard help` for a
+full list):
+
+    Usage: yard  [options]
+
+    Commands:
+    config   Views or edits current global configuration
+    diff     Returns the object diff of two gems or .yardoc files
+    doc      Generates documentation
+    gems     Builds YARD index for gems
+    graph    Graphs class diagram using Graphviz
+    help     Retrieves help for a command
+    ri       A tool to view documentation in the console like `ri`
+    server   Runs a local documentation server
+    stats    Prints documentation statistics on a set of files
+
+Note that `yardoc` is an alias for `yard doc`, and `yri` is an alias for
+`yard ri`. These commands are maintained for backwards compatibility.
+
+### `.yardopts` Options File
+
+Unless your documentation is very small, you'll end up needing to run `yardoc`
+with many options.  The `yardoc` tool will use the options found in this file.
+It is recommended to check this in to your repository and distribute it with
+your source. This file is placed at the root of your project (in the directory
+you run `yardoc` from) and contains all of arguments you would otherwise pass
+to the command-line tool. For instance, if you often type:
+
+    yardoc --no-private --protected app/**/*.rb - README LEGAL COPYING
+
+You can place the following into your `.yardopts`:
+
+    --no-private --protected app/**/*.rb - README LEGAL COPYING
+
+This way, you only need to type:
+
+    yardoc
+
+Any extra switches passed to the command-line now will be appended to your
+`.yardopts` options.
+
+Note that options for `yardoc` are discussed in the {file:README.md README},
+and a full overview of the `.yardopts` file can be found in {YARD::CLI::Yardoc}.
+
+### Documenting Extra Files
+
+"Extra files" are extra guide style documents that help to give a brief overview
+of how to use your library/framework, as well as any extra information that
+might be vital for your users. The most common "extra file" is the README,
+which is automatically detected by YARD if found in the root of your project
+(any file starting with `README*`). You can specify extra files on the command
+line (or in the `.yardopts` file) by listing them after the '-' separator:
+
+    yardoc lib/**/*.rb ext/**/*.{c,rb} - LICENSE.txt
+
+Note that the README will automatically be picked up, so you do not need to
+specify it. If you don't want to modify the default file globs, you can ignore
+the first set of arguments:
+
+    yardoc - LICENSE.txt
+
+Below you can read about how to customize the look of these extra files, both
+with markup and pretty titles.
+
+#### Adding Meta-Data to Extra Files
+
+You can add YARD-style `@tag` metadata to the top of any extra file if prefixed
+by a `#` hash comment. YARD allows for arbitrary meta-data, but pays special
+attention to the tags `@markup`, `@encoding`, and `@title`. Note that there
+cannot be any whitespace before the tags. Here is an example of some tag data
+in a README:
+
+    # @markup markdown
+    # @title The Best Library in the World!
+    # @author The Author Name
+
+    This is the best library you will ever meet. Lipsum ...
+
+The `@markup` tag allows you to specify a markup format to use for the file,
+including "markdown", "textile", "rdoc", "ruby", "text", "html", or "none"
+(no markup). This can be used when the markup cannot be auto-detected using
+the extension of the filename, if the file has no extension, or if you want
+to override the auto-detection.
+
+By using `@encoding` you can specify a non-standard encoding. Note that
+`yardoc --charset` sets the global encoding (for all comments / files),
+so if you are using unicode across all your files, you can specify it there.
+Using the `@encoding` tag might be used to override the default global
+charset, say, if you had a localized `README.jp` file with SJIS data.
+Also note that this only affects Ruby 1.9.x, as Ruby 1.8 is not properly
+encoding aware.
+
+The `@title` tag allows you to specify a full title name for the document.
+By default, YARD uses the filename as the title of the document and lists
+it in the file list in the index and file menu. In some cases, the file name
+might not be descriptive enough, so YARD allows you to specify a full title:
+
+    contents of TITLE.txt:
+    # @title The Title of The Document
+
+Currently all other meta-data is hidden from view, though accessible
+programmatically using the {YARD::CodeObjects::ExtraFileObject} class.
+
+You can wrap the meta data section in an HTML comment to prevent it
+from being displayed in rendered markdown on GitHub:
+
+    
+
+    This is the best library you will ever meet. Lipsum ...
+
+
+
+## Configuring YARD
+
+YARD (0.6.2+) supports a global configuration file stored in `~/.yard/config`.
+This file is stored as a YAML file and can contain arbitrary keys and values
+that can be used by YARD at run-time. YARD defines specific keys that are used
+to control various features, and they are listed in {YARD::Config::DEFAULT_CONFIG_OPTIONS}.
+A sample configuration file might look like:
+
+    :load_plugins: false
+    :ignored_plugins:
+      - my_plugin
+      - my_other_plugin
+    :autoload_plugins:
+      - my_autoload_plugin
+    :safe_mode: false
+
+You can also view and edit these configuration options from the commandline
+using the `yard config` command. To list your configuration, use `yard config --list`.
+To view a key, use `yard config ITEM`, and to set it, use `yard config ITEM VALUE`.
+
+
+
+## Extending YARD
+
+There are many ways to extend YARD to support non-standard Ruby syntax (DSLs),
+add new meta-data tags or programmatically access the intermediate metadata
+and documentation from code. An overview of YARD's full architecture can be
+found in the {file:docs/Overview.md} document.
+
+For information on adding support for Ruby DSLs, see the {file:docs/Handlers.md}
+and {file:docs/Parser.md} architecture documents.
+
+For information on adding extra tags, see {file:docs/Tags.md}.
+
+For information on accessing the data YARD stores about your documentation,
+look at the {file:docs/CodeObjects.md} architecture document.
+
+
+
+## Templating YARD
+
+In many cases you may want to change the style of YARD's templates or add extra
+information after extending it. The {file:docs/Templates.md} architecture
+document covers the basics of how YARD's templating system works.
+
+
+
+## Plugin Support
+
+YARD will allow any RubyGem installed on your system (or in your Gemfile)
+to be loaded as a plugin provided it has a name with the prefix of
+`yard-` or `yard_`. In order to load a plugin, use the `--plugin`
+switch with the short-name (name minus the `yard-` prefix) or full-name
+of the gem:
+
+    $ gem install yard-custom-plugin
+    ...
+    $ yard doc --plugin custom-plugin
+    or
+    $ yard doc --plugin yard-custom-plugin
+
+Note: you can also put this switch in your `.yardopts` file. See the
+      `.yardopts` section above for more information.
+
+You can use this functionality to load a custom plugin that
+[extend](#extending) YARD's functionality. A good example of this
+is the [yard-rspec][yard-rspec] plugin, which adds [RSpec][rspec] specifications
+to your documentation (`yardoc` and `yri`). You can try it out by installing
+the gem or cloning the project and trying the example:
+
+    $ gem install yard-rspec
+
+ You can then load the plugin with:
+
+    $ yard doc --plugin rspec
+
+YARD also provides a way to temporarily disable plugins on a per-user basis.
+To disable a plugin create the file `~/.yard/ignored_plugins` with a list
+of plugin names separated by newlines. Note that the `.yard` directory might
+not exist, so you may need to create it.
+
+You may find some useful YARD plugins on [RubyGems][RubyGemsQuery] or with
+a [Google advanced query][GoogleAdvancedQuery].
+
+[graphviz]:http://www.graphviz.org
+[yard-rspec]:http://github.com/lsegal/yard-spec-plugin
+[rspec]:http://rspec.info
+[GoogleAdvancedQuery]:https://www.google.com/search?q=site%3Arubygems.org+intitle%3A%22yard-%22+OR+intitle%3A%22yard_%22
+[RubyGemsQuery]:https://rubygems.org/search?utf8=%E2%9C%93&query=name%3A+yard
diff --git a/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/docs/Handlers.md b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/docs/Handlers.md
new file mode 100644
index 000000000..24761a16f
--- /dev/null
+++ b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/docs/Handlers.md
@@ -0,0 +1,152 @@
+# @title Handlers Architecture
+
+# Handlers Architecture
+
+Handlers allow the processing of parsed source code. Handling is done after
+parsing to abstract away the implementation details of lexical and semantic
+analysis on source and to only deal with the logic regarding recognizing
+source statements as {file:docs/CodeObjects.md code objects}.
+
+![Handlers Architecture Class Diagram](images/handlers-class-diagram.png)
+
+## The Pipeline
+
+After the {file:docs/Parser.md parser component} finishes analyzing the
+source, it is handed off for post-processing to the {YARD::Handlers::Processor}
+class, which is responsible for traversing the set of statements given by
+the parser and delegating them to matching handlers. Handlers match when the
+{YARD::Handlers::Base.handles?} method returns true for a given statement.
+The handler can then perform any action after being invoked by the `process`
+method.
+
+## The Processor Class
+
+The main purpose of the processor, as mentioned above, is to traverse through
+the list of statements given to it by the parser. The processor also keeps
+state about what is being processed. For instance, the processor is what keeps
+track of the current namespace (the module or class an object is being defined
+in), scope (class or instance), file and owner. The owner refers to the object
+that is most directly responsible for the source statement being processed. This
+is most often the same as the namespace, except when parsing the body of a method,
+where the namespace would be the class/module the method is defined in and the
+owner would be the method object itself.
+
+## Implementing a Handler
+
+This section covers the basics of implementing a *new-style* Ruby handler. For
+details on implementing a legacy handler, see the "API Differences" section below.
+
+a Ruby handler can be implemented simply by subclassing the {YARD::Handlers::Ruby::Base}
+class and declaring what node types or source to process with the {YARD::Handlers::Base.handles handles}
+class method. A very simple handler that handles a module definition would be:
+
+    class MyModuleHandler < YARD::Handlers::Ruby::Base
+      handles :module
+
+      def process
+        puts "Handling a module named #{statement[0].source}"
+      end
+    end
+
+For details on what nodes are, and what node types are, see the
+{file:docs/Parser.md parser architecture document}.
+
+In this case the node type being handled is the `:module` type. More than one
+node type or `handles` declarations may describe a single handler, for instance,
+a handler that handles class definitions should handle the `:class` and `:sclass`
+node types respectively (the latter refers to classes defined as `class << Something`).
+The {YARD::Handlers::Base#statement statement} attribute refers to the current
+node (or statement) that is being handled by the handler.
+
+### Handling a Method Call
+
+In some cases, a developer might need to handle a method call. The parser can
+express a method call in many AST forms, so to simplify this process, a method
+call can be handled by declaring the following in a `handles` statement:
+
+    class MyHandler < YARD::Handlers::Ruby::Base
+      handles method_call(:describe)
+
+      def process
+        # Process the method call
+      end
+    end
+
+In this case we handle any of the method calls to method name `describe` with
+the following syntaxes:
+
+    describe(something)
+    describe arg1, arg2, arg3
+    describe(something) { perform_a_block }
+    describe "Something" do
+      a_block
+    end
+
+### Creating a new Code Object
+
+Usually (but not always) handling is performed to create new code objects to add
+to the registry (for information about code objects, see {file:docs/CodeObjects.md this document}).
+Code objects should simply be created and added to the existing `namespace`. This
+will be enough to add them to the registry. There is also a convenience
+{YARD::Handlers::Base#register register} method which quickly sets standard attributed
+on the newly created object, such as the file, line, source and docstring of the
+object. This method will be seen in the next example.
+
+### Handling an Inner Block
+
+By default, the parser gives the processor class a list of all the top level
+statements and the processor parses only those top level statements. If an inner
+block of a module, class, method declaration or even a block passed to a method call
+needs to be handled, the {YARD::Handlers::Base#parse_block parse_block} method must be called on the list of statements
+to parse. This will send the list to the processor to continue processing on that
+statement list. The source tree can be selectively parsed in this manner by parsing
+only the inner blocks that are relevant to documentation.
+
+For example, the module handler parses the inner body of a module by performing
+the following commands:
+
+    class YARD::Handlers::Ruby::ModuleHandler < YARD::Handlers::Ruby::Base
+      handles :module
+
+      def process
+        modname = statement[0].source
+        mod = register ModuleObject.new(namespace, modname)
+        parse_block(statement[1], :namespace => mod)
+      end
+    end
+
+In this case `statement[1]` refers to a list of extra statements, the block we
+wish to parse. Note here that when parsing objects like modules and classes,
+we set the namespace for the duration of the block parsing by setting options
+on the `parse_block` method.
+
+### API Differences for Legacy Handler
+
+Because the legacy handler uses the legacy parser and therefore a different kind
+of AST, there are subtle differences in the handler API. Most importantly, the
+`handles` method usually deals with either lexical tokens or source code as a string
+or RegExp object. The statement object, similarly, is made up of lexical tokens instead
+of semantically parsed nodes (this is described in the {file:docs/Parser.md parser document}).
+
+The module example above can be rewritten as a legacy handler as follows:
+
+    class YARD::Handlers::Ruby::Legacy::ModuleHandler < YARD::Handlers::Ruby::Legacy::Base
+      handles TkMODULE
+
+      def process
+        modname = statement.tokens.to_s[/^module\s+(#{NAMESPACEMATCH})/, 1]
+        mod = register ModuleObject.new(namespace, modname)
+        parse_block(:namespace => mod)
+      end
+    end
+
+A few notes on the differences:
+
+  * We inherit from `Legacy::Base` instead of the standard Ruby Base handler class.
+  * We exchange node type `:module` for `TkMODULE`, which represents the
+    first token in the statement.
+  * We perform direct string manipulation to get the module name.
+  * `parse_block` does not take a list of statements. In the old parser API,
+    each statement has a `block` attribute which defines the list of
+    statements within that statement, if any. Therefore, `parse_block` will
+    always parse the `statement.block` if it exists.
diff --git a/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/docs/Overview.md b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/docs/Overview.md
new file mode 100644
index 000000000..64c784516
--- /dev/null
+++ b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/docs/Overview.md
@@ -0,0 +1,61 @@
+# @title Architecture Overview
+
+# Architecture Overview
+
+YARD is separated in three major components, each of which allows YARD to be
+extended for a separate purpose. The split also emphasizes YARD's design choice
+to explicitly separate data gathering from HTML document generation, something
+that tools like RDoc do not do. These components are:
+
+* [Code Parsing & Processing Component](#parsing)
+* [Data Storage Component](#storage)
+* [Post Processing & Templating System](#templates)
+
+This separation is a major goal of the project, and means that YARD is not *just*
+a tool to generate HTML output. The expectation is that any subset of YARD's
+major components may be used, extended or modified independently. YARD may be
+used just as a data gathering tool (to parse and audit code), just as a data
+source (a webserver containing raw unformatted data about code), or just as a
+conventional HTML documentation generation tool (like RDoc).
+
+The important classes and dependencies of these components are shown in the
+following class diagram:
+
+![Overview Class Diagram](images/overview-class-diagram.png)
+
+
+
+## Code Parsing & Processing Component
+
+This component is made up of four sub-components, each of which have separate
+tasks during the data gathering process (*note: the tag architecture is not*
+*shown in the class diagram*). These sub-components are:
+
+  * {file:docs/Parser.md}
+  * {file:docs/Handlers.md}
+  * {file:docs/CodeObjects.md}
+  * {file:docs/Tags.md}
+
+The parser component reads source files and converts it into a set of statements
+which the handlers then process, creating code objects which in turn create tags
+(meta-data) attached to the objects. These objects are all added to the {YARD::Registry},
+the data store component.
+
+
+
+## Data Storage Component
+
+This component is currently implemented as a simple Ruby marshalled flat namespace
+of object. The implementation is found in the single class {YARD::Registry}, which
+is the centralized repository for all data being parsed, stored and accessed. There
+are future plans to improve this storage mechanism to be backend agnostic and allow
+for more robust storage.
+
+
+
+## Post Processing & Templating System
+
+This component handles processing of objects from the registry through a templating
+engine that allows output to a variety of formats. Practically speaking, this is
+where templates can be implemented to change the design, output or structure of
+the data. See {file:docs/Templates.md Templates Architecture} for a complete overview.
diff --git a/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/docs/Parser.md b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/docs/Parser.md
new file mode 100644
index 000000000..cc079ad3d
--- /dev/null
+++ b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/docs/Parser.md
@@ -0,0 +1,191 @@
+# @title Parser Architecture
+
+# Parser Architecture
+
+The parser component of YARD is the first component in the data processing pipeline
+that runs before any handling is done on the source. The parser is meant to translate
+the source into a set of statements that can be understood by the {file:docs/Handlers.md Handlers}
+that run immediately afterwards.
+
+The important classes are described in the class diagram of the entire parser
+system below:
+
+![Parser Class Diagram](images/parser-class-diagram.png)
+
+(Note: the RubyToken classes are omitted from the diagram)
+
+## SourceParser
+
+The main class {YARD::Parser::SourceParser} acts as a factory class, instantiating
+the correct parser class, an implementation of {YARD::Parser::Base}. The selected parser
+is chosen based on either the file extension or by selecting it explicitly (as an argument
+to parsing methods). YARD supports Ruby and C source files, but custom parsers can
+be implemented and registered for various other languages by subclassing `Parser::Base`
+and registering the parser with {YARD::Parser::SourceParser.register_parser_type}.
+
+This factory class should always be used when parsing source files rather than
+the individual parser classes since it initiates the pipeline that runs the
+handlers on the parsed source. The parser used must also match the handlers,
+and this is coordinated by the `SourceParser` class as well.
+
+## Using the SourceParser Class
+
+The `SourceParser` class API is optimized for parsing globs of files. As such,
+the main method to use the class is the `parse` class method, which takes an
+array of file globs or a single file glob.
+
+    YARD::Parser::SourceParser.parse('spec_*.rb')
+    YARD::Parser::SourceParser.parse(['spec_*.rb', '*_helper.rb'])
+
+This is equivalent to the convenience method {YARD.parse}:
+
+    YARD.parse('lib/**/*.rb')
+
+In some cases (ie. for testing), it may be more helpful to parse a string of input
+directly. In such a case, the method {YARD::Parser::SourceParser.parse_string} should be
+used:
+
+    YARD::Parser::SourceParser.parse_string("def method(a, b) end")
+
+You can also provide the parser type explicitly as the second argument:
+
+    # Parses a string of C
+    YARD::Parser::SourceParser.parse_string("int main() { }", :c)
+
+Note that these two methods are aliased as {YARD.parse} and {YARD.parse_string} for
+convenience.
+
+## Implementing and Registering a Custom Parser
+
+To implement a custom parser, subclass {YARD::Parser::Base}. Documentation on which
+abstract methods should be implemented are documented in that class. After the class
+is implemented, it is registered with the {YARD::Parser::SourceParser} factory class
+to be called when a file of the right extension needs to be parsed, or when a user
+selects that parser type explicitly. To register your new parser class, call the
+method {YARD::Parser::SourceParser.register_parser_type}:
+
+    SourceParser.register_parser_type(:my_parser, MyParser, 'my_parser_ext')
+
+The last argument can be a single extension, a list of extensions (Array), a single Regexp, or a
+list of Regexps. Do not include the '.' in the extension.
+
+
+## The Two Ruby Parser Types
+
+When parsing Ruby, the SourceParser can either instantiate the new {YARD::Parser::Ruby::RubyParser}
+class or the {YARD::Parser::Ruby::Legacy::StatementList} class. The first of the
+two, although faster, more robust and more efficient, is only available for
+Ruby 1.9. The legacy parser parser is available in both 1.8.x and 1.9, if
+compatibility is required. The choice of parser will affect which handlers
+ultimately get used, since new handlers can only use the new parser and the
+same requirement applies to the legacy parser & handlers.
+
+## Switching to Legacy Parser
+
+By default, running YARD under Ruby 1.9 will automatically select the new parser
+and new handlers by extension. Although YARD supports both handler styles, plugins
+may choose to only implement one of the two (though this is not recommended). If
+only the legacy handlers are implemented, the `SourceParser` class should force
+the use of the legacy parser by setting the `parser_type` attribute as such:
+
+    YARD::Parser::SourceParser.parser_type = :ruby18
+
+The default value is `:ruby`. Note that this cannot be forced the other way around,
+a parser type of `:ruby` cannot be set under Ruby 1.8.x as the new parser is not
+supported under 1.8.
+
+## RubyParser (the New Parser)
+
+The new Ruby parser uses the Ripper library that is packaged as part of stdlib
+in Ruby 1.9. Because of this, it can generate an AST from a string of Ruby input
+that is similar to the style of other sexp libraries (such as ParseTree). Each
+node generated in the tree is of the base type {YARD::Parser::Ruby::AstNode},
+which has some subclasses for common node types.
+
+### AstNode Basics
+
+The `AstNode` class behaves like a standard Array class in which all of its data
+make up the list of elements in the array. Unlike other sexp style libraries, however,
+the node type is not the first element of the list. Instead, the node type is defined
+by the `#type` method. The following examples show some of the basic uses of `AstNode`:
+
+    # The sexp defines the statement `hello if 1`
+    node = s(:if_mod, s(:int, "1"), s(:var_ref, s(:ident, "hello")))
+    node.type  #=> :if_mod
+    node[0]    #=> s(:int, "1")
+    node[0][0] #=> "1"
+
+(Note the `s()` syntax is shorthand for `AstNode.new(...)`. `s()` with no type
+is shorthand for a node of type `:list`)
+
+As shown, not all of the elements are AstNodes in themselves, some are String
+objects containing values. A list of only the AstNodes within a node can be
+accessed via the {YARD::Parser::Ruby::AstNode#children #children} method. Using
+the sexp declared above, we can do:
+
+    node.children #=> [s(:int, "1"), s(:var_ref, s(:ident, "hello"))]
+
+### AstNode#source and #line
+
+Every node defines the `#source` method which returns the source code that the
+node represents. One of the most common things to do with a node is to grab its
+source. The following example shows how this can be done:
+
+    source = "if 1 == 1 then\n  raise Exception\n end"
+    ast = YARD::Parser::Ruby::RubyParser.parse(source).root
+    ast[0].condition.source  #=> "1 == 1"
+    ast[0].then_block.source #=> "raise Exception"
+
+Note that this only works on source parsed from the RubyParser, not sexps
+declared using the `s()` syntax. This is because no source code is generated
+or stored by nodes. Instead, only the character ranges are stored, which are
+then looked up in the original full source string object. For example:
+
+    # Following the code snippet above
+    ast[0].then_block.source_range #=> 17..31
+
+We can also get the line and line ranges in a similar fashion:
+
+    ast[0].type       #=> :if
+    ast[0].line       #=> 1
+    ast[0].line_range #=> 1..3 (note the newlines in the source)
+
+### AstNode#jump
+
+Often the AST will be such that the node we care about might be buried arbitrarily
+deep in a node's hierarchy. The {YARD::Parser::Ruby::AstNode#jump} method exists
+to quickly get at a node of a specific type in such a situation:
+
+    # Get the first identifier in the statement
+    ast = s(s(:int, "1"), s(s(:var_ref, s(:ident, "hello"))))
+    ast.jump(:ident)[0] #=> "hello"
+
+Multiple types can be searched for at once. If none are found, the original root
+node is returned so that it may be chained.
+
+## The Legacy Parser
+
+The goal of the legacy parser is much the same as the new parser, but it is far
+more simplistic. Instead of a full-blown AST, the legacy parser simply groups
+together lists of "statements" called a {YARD::Parser::Ruby::Legacy::StatementList}.
+These statement lists are made up of {YARD::Parser::Ruby::Legacy::Statement} objects.
+A statement is any method call condition, loop, or declaration. Each statement
+may or may not have a block. In the case of a condition or loop, the block is
+the inner list of statements; in the case of a method call, the block is a do
+block (if provided). The statements themselves are made up of tokens, so instead
+of being semantic in nature like the new parser, statements are tied directly
+to the lexical tokens that make them up. To convert a statement into source, you
+simply join all the tokens together (this is done through the use of `#to_s`).
+
+Note that because there is little semantic parsing, the legacy parser is less
+able to deal with certain Ruby syntaxes. Specifically, the `:if_mod` syntax
+seen above ("hello if 1") would be considered two statements with the new parser,
+but using the legacy parser it is only one statement:
+
+    stmts = ARD::Parser::Ruby::Legacy::StatementList.new("hello if 1")
+    stmts[0].block       #=> nil
+    stmts[0].tokens.to_s #=> "hello if 1"
+
+In addition, this means that most handling still needs to be done via string
+manipulation and regular expression matching, making it considerably more
+difficult to use in edge case scenarios.
diff --git a/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/docs/Tags.md b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/docs/Tags.md
new file mode 100644
index 000000000..d0686acd1
--- /dev/null
+++ b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/docs/Tags.md
@@ -0,0 +1,283 @@
+# @title Tags Overview
+
+# Tags Overview
+
+Tags represent meta-data as well as behavioural data that can be added to
+documentation through the `@tag` style syntax. As mentioned, there are two
+basic types of tags in YARD, "meta-data tags" and "behavioural tags", the
+latter is more often known as "directives". These two tag types can be
+visually identified by their prefix. Meta-data tags have a `@` prefix,
+while directives have a prefix of `@!` to indicate that the directive
+performs some potentially mutable action on or with the docstring. The
+two tag types would be used in the following way, respectively:
+
+    # @meta_data_tag some data
+    # @!directive_tag some data
+    class Foo; end
+
+This document describes how tags can be specified, how they affect your
+documentation, and how to use specific built-in tags in YARD, as well
+as how to define custom tags.
+
+## Meta-Data Tags
+
+Meta-data tags are useful to add arbitrary meta-data about a documented
+object. These tags simply add data to objects that can be looked up later,
+either programmatically, or displayed in templates. The benefit to describing
+objects using meta-data tags is that your documentation can be organized
+semantically. Rather than having a huge listing of text with no distinction
+of what each paragraph is discussing, tags allow you to focus in on specific
+elements of your documentation.
+
+For example, describing parameters of a method can often be important to your
+documentation, but should not be mixed up with the documentation that describes
+what the method itself does. In this case, separating the parameter documentation
+into {tag:param} tags can yield much better organized documentation, both in
+source and in your output, without having to manually format the data using
+standard markup.
+
+All of this meta-data can be easily parsed by tools and used both in your templates
+as well as in code checker tools. An example of how you can leverage tags
+programmatically is shown in the {tag:todo} tag, which lists a small snippet of
+Ruby code that can list all of your TODO items, if they are properly tagged.
+
+Custom meta-data tags can be added either programmatically or via the YARD
+command-line. This is discussed in the "[Adding Custom Tags](#Adding_Custom_Tags)"
+section.
+
+A list of built-in meta-data tags are found below in the [Tag List](#Tag_List).
+
+## Directives
+
+Directives are similar to meta-data tags in the way they are specified, but they
+do not add meta-data to the object directly. Instead, they affect the parsing
+context and objects themselves, allowing a developer to create objects
+(like methods) outright, rather than simply add text to an existing object.
+Directives have a `@!` prefix to differentiate these tags from meta-data tags,
+as well as to indicate that the tag may modify or create new objects when
+it is called.
+
+A list of built-in directives are found below in the [Directive List](#Directive_List).
+
+## Tag Syntax
+
+Tags begin with the `@` or `@!` prefix at the start of a comment line, followed
+immediately by the tag name, and then optional tag data (if the tag requires it).
+Unless otherwise specified by documentation for the tag, all "description" text
+is considered free-form data and can include any arbitrary textual data.
+
+### Multi-line Tags
+
+Tags can span multiple lines if the subsequent lines are indented by more than
+one space. The typical convention is to indent subsequent lines by 2 spaces.
+In the following example, `@tagname` will have the text *"This is indented tag data"*:
+
+    # @tagname This is
+    #   indented tag data
+    # but this is not
+
+For most tags, newlines and indented data are not significant and do not impact
+the result of the tag. In other words, you can decide to span a tag onto multiple
+lines at any point by creating an indented block. However, some tags like
+{tag:example}, {tag:overload}, {tag:!macro}, {tag:!method}, and {tag:!attribute}
+rely on the first line for special information about the tag, and you cannot
+split this first line up. For instance, the {tag:example} tag uses the first line
+to indicate the example's title.
+
+### Common Tag Syntaxes
+
+Although custom tags can be parsed in any way, the built-in tags follow a few
+common syntax structures by convention in order to simplify the syntax. The
+following syntaxes are available:
+
+1. **Freeform data** — In this case, any amount of textual data is allowed,
+  including no data. In some cases, no data is necessary for the tag.
+2. **Freeform data with a types specifier list** — Mostly freeform data
+  beginning with an *optional* types specifier list surrounded in `[brackets]`.
+  Note that for extensibility, other bracket types are allowed, such as `<>`,
+  `()` and `{}`. The contents of the list are discussed in detail below.
+3. **Freeform data with a name and types specifier list** — freeform
+  data beginning with an *optional* types list, as well as a name key, placed
+  either before or after the types list. The name key is *required*. Note that
+  for extensibility, the name can be placed *before* the types list, like:
+  `name [Types] description`. In this case, a separating space is not required
+  between the name and types, and you can still use any of the other brackets
+  that the type specifier list allows.
+4. **Freeform data with title** — freeform data where the first line cannot
+  be split into multiple lines. The first line must also always refer to the
+  "title" portion, and therefore, if there is no title, the first line must
+  be blank. The "title" might occasionally be listed by another name in tag
+  documentation, however, you can identify this syntax by the existence of
+  a multi-line signature with "Indented block" on the second line.
+
+In the tag list below, the term "description" implies freeform data, `[Types]`
+implies a types specifier list, "name" implies a name key, and "title" implies
+the first line is a newline significant field that cannot be split into multiple
+lines.
+
+### Types Specifier List
+
+In some cases, a tag will allow for a "types specifier list"; this will be evident
+from the use of the `[Types]` syntax in the tag signature. A types specifier list
+is a comma separated list of types, most often classes or modules, but occasionally
+literals. For example, the following {tag:return} tag lists a set of types returned
+by a method:
+
+    # Finds an object or list of objects in the db using a query
+    # @return [String, Array, nil] the object or objects to
+    #   find in the database. Can be nil.
+    def find(query) finder_code_here end
+
+A list of conventions for type names is specified below. Typically, however,
+any Ruby literal or class/module is allowed here. Duck-types (method names
+prefixed with "#") are also allowed.
+
+Note that the type specifier list is always an optional field and can be omitted
+when present in a tag signature. This is the reason why it is surrounded by
+brackets. It is also a freeform list, and can contain any list of values, though
+a set of conventions for how to list types is described below.
+
+### Type List Conventions
+
+

+ A list of examples of common type listings and what they translate into is + available at http://yardoc.org/types. +

+ +Typically, a type list contains a list of classes or modules that are associated +with the tag. In some cases, however, certain special values are allowed or required +to be listed. This section discusses the syntax for specifying Ruby types inside of +type specifier lists, as well as the other non-Ruby types that are accepted by +convention in these lists. + +It's important to realize that the conventions listed here may not always adequately +describe every type signature, and is not meant to be a complete syntax. This is +why the types specifier list is freeform and can contain any set of values. The +conventions defined here are only conventions, and if they do not work for your +type specifications, you can define your own appropriate conventions. + +Note that a types specifier list might also be used for non-Type values. In this +case, the tag documentation will describe what values are allowed within the +type specifier list. + +#### Class or Module Types + +Any Ruby type is allowed as a class or module type. Such a type is simply the name +of the class or module. + +Note that one extra type that is accepted by convention is the `Boolean` type, +which represents both the `TrueClass` and `FalseClass` types. This type does not +exist in Ruby, however. + +#### Parametrized Types + +In addition to basic types (like String or Array), YARD conventions allow for +a "generics" like syntax to specify container objects or other parametrized types. +The syntax is `Type`. For instance, an Array might +contain only String objects, in which case the type specification would be +`Array`. Multiple parametrized types can be listed, separated by commas. + +Note that parametrized types are typically not order-dependent, in other words, +a list of parametrized types can occur in any order inside of a type. An array +specified as `Array` can contain any amount of Strings or Fixnums, +in any order. When the order matters, use "order-dependent lists", described below. + +#### Duck-Types + +Duck-types are allowed in type specifier lists, and are identified by method +names beginning with the "#" prefix. Typically, duck-types are recommended +for {tag:param} tags only, though they can be used in other tags if needed. +The following example shows a method that takes a parameter of any type +that responds to the "read" method: + + # Reads from any I/O object. + # @param io [#read] the input object to read from + def read(io) io.read end + +#### Hashes + +Hashes can be specified either via the parametrized type discussed above, +in the form `Hash`, or using the hash specific syntax: +`Hash{KeyTypes=>ValueTypes}`. In the latter case, KeyTypes or ValueTypes can +also be a list of types separated by commas. + +#### Order-Dependent Lists + +An order dependent list is a set of types surrounded by "()" and separated by +commas. This list must contain exactly those types in exactly the order specified. +For instance, an Array containing a String, Fixnum and Hash in that order (and +having exactly those 3 elements) would be listed as: `Array<(String, Fixnum, Hash)>`. + +#### Literals + +Some literals are accepted by virtue of being Ruby literals, but also by YARD +conventions. Here is a non-exhaustive list of certain accepted literal values: + +* `true`, `false`, `nil` — used when a method returns these explicit literal + values. Note that if your method returns both `true` or `false`, you should use + the `Boolean` conventional type instead. +* `self` — has the same meaning as Ruby's "self" keyword in the context of + parameters or return types. Recommended mostly for {tag:return} tags that are + chainable. +* `void` — indicates that the type for this tag is explicitly undefined. + Mostly used to specify {tag:return} tags that do not care about their return + value. Using a `void` return tag is recommended over no type, because it makes + the documentation more explicit about what the user should expect. YARD will + also add a note for the user if they have undefined return types, making things + clear that they should not use the return value of such a method. + + + +### Reference Tags + +

+ Reference tag syntax applies only to meta-data tags, not directives. +

+ +If a tag's data begins with `(see OBJECT)` it is considered a "reference tag". +A reference tag literally copies the tag data by the given tag name from the +specified OBJECT. For instance, a method may copy all {tag:param} tags from +a given object using the reference tag syntax: + + # @param user [String] the username for the operation + # @param host [String] the host that this user is associated with + # @param time [Time] the time that this operation took place + def clean(user, host, time = Time.now) end + + # @param (see #clean) + def activate(user, host, time = Time.now) end + +## Adding Custom Tags + +

If a tag is specific to a given project, consider namespacing + it by naming it in the form projectname.tagname, ie., + yard.tag_signature.

+ +Custom tags can be added to YARD either via the command-line or programmatically. +The programmatic method is not discussed in this document, but rather in the +{file:docs/TagsArch.md} document. + +To add a custom tag via the command-line or .yardopts file, you can use the +`--*-tag` options. A few different options are available for the common tag +syntaxes described above. For example, to add a basic freeform tag, use: + + !!!sh + $ yard doc --tag rest_url:"REST URL" + +This will register the `@rest_url` tag for use in your documentation and display +this tag in HTML output wherever it is used with the heading "REST URL". +Note that the tag title should follow the tag name with a colon (`:`). Other +tag syntaxes exist, such as the type specifier list freeform tag +(`--type-tag`), or a named key tag with types (`--type-name-tag`). + +If you want to create a tag but not display it in output (it is only for +programmatic use), add `--hide-tag tagname` after the definition: + + !!!sh + $ yard doc --tag complexity:"McCabe Complexity" --hide-tag complexity + +Note that you might not need a tag title if you are hiding it. The title +part can be omitted. + +{yard:include_tags} + diff --git a/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/docs/TagsArch.md b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/docs/TagsArch.md new file mode 100644 index 000000000..a88720ef5 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/docs/TagsArch.md @@ -0,0 +1,123 @@ +# @title Tags Architecture + +# Tags Architecture + +## Programmatic API + +### Accessing Tag Information + +Tag metadata is added when a {YARD::Docstring} is added to a {file:docs/CodeObjects.md code object} +using the {YARD::CodeObjects::Base#docstring=} attribute. In addition to adding +conventional comments, tags are parsed and associated with the object. The easiest +way to access tags on an object is to use the {YARD::CodeObjects::Base#tag} and `#tags` +methods, for example: + + # Using the Foo class object from above + obj.tags(:tagname).first.text #=> "some data" + +Because multiple tags can be stored with the same name, they are stored as a list +of tags. The `#tag` method is an alias for the first item in the list of tags. +Also note that the `#tag`, `#tags` and `#has_tag?` methods are all convenience +methods that delegate to the {YARD::Docstring} object described above. + +### Adding Custom Tags + +The `@tagname` tag used in the above examples is clearly not part of the tags +that come with YARD. If such a tag would actually be part of documentation under +a default install, YARD would raise a warning that the tag does not exist. It is, +however, trivial to add this tag to be recognized by YARD. + +All tags in YARD are added to the {YARD::Tags::Library tag library} which makes +use of a tag factory class to parse the data inside the tags. To simply add a +tag that stores simple text like our `@tagname` tag above, use: + + YARD::Tags::Library.define_tag("A Sample Tag", :tagname) + +This will now allow YARD to add the metadata from `@tagname` to the docstring. + +## Tag Factory Architecture + +Recognizing a tag is one part of the process. Parsing the tag contents is the +second step. YARD has a tag architecture that allows developers to add or completely +change the way tags contents can be parsed. + +The separation of registration and tag creation can be seen in the following +class diagram: + +![Tags Architecture Class Diagram](images/tags-class-diagram.png) + +### DefaultFactory + +By default, YARD has a few standard syntaxes that can be parsed for tags. These +are all implemented by the {YARD::Tags::DefaultFactory} class. These syntaxes +are: + + * Standard text: no parsing is done, but text is stripped of newlines and + multiple spaces. + + * Raw text: does no parsing at all, no stripping of newlines or spaces. This + is best used for code snippets. + + * Raw text with title: does no parsing on the text but extracts the first line + of the metadata as the "title", useful for tags such as `@example`: + + # @example Inspect an element + # myobj.inspect #=> # + + * Text with types: parses a list of types at the beginning of the text. Types + are optional. The standard syntax is in the form `[type1, type2, ...]`, + for example: + + # @return [String, Symbol] a description here + # @return description here with no types + + * Text with types and a name: parses a list of types at the beginning of text + followed by a name and extra descriptive text. For example: + + # @param [String] str the string to reverse + def reverse(str) '...' end + +As mentioned above, this syntax is implemented by the `DefaultFactory` which can +be swapped out for any factory. In some cases, a developer may want to change +the type declaration syntax to be in the form: + + # @tagname name description + +This can be done by simply implementing a new factory that parses the data in +this form. + +### Implementing a Factory + +Factories should implement the method `parse_tag` as well as any `parse_tag_SUFFIX` +method where SUFFIX refers to the suffix added when declaring the tag. For example, +a tag can also be declared as follows: + + YARD::Tags::Library.define_tag "Parameter", :param, :with_types + +In such a case, the factory will be called with method `parse_tag_with_types`. In +all cases, the method should return a new {YARD::Tags::Tag} object. Generally, +the `parse_tag` methods take 2 or 3 parameters. A simple tag can be implemented +as: + + def parse_tag(tag_name, text) + Tag.new(tag_name, text) + end + +The text parameter contains pre-parsed text with extra spaces and newlines removed. +If required, the method could also be declared with a third parameter containing +unmodified raw text: + + def parse_tag_with_raw_text(tag_name, text, raw_text) + Tag.new(tag_name, raw_text) + end + +Note that this method would be invoked for a tag declared with the `:with_raw_text` +suffix. + +### Changing the Factory + +To change the factory, set the {YARD::Tags::Library.default_factory} attribute: + + YARD::Tags::Library.default_factory = MyFactory + +This must be done before any parsing is done, or the factory will not be used. diff --git a/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/docs/Templates.md b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/docs/Templates.md new file mode 100644 index 000000000..bd82fa878 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/docs/Templates.md @@ -0,0 +1,496 @@ +# @title Templates Architecture + +# Templates Architecture + +Templates are the main component in the output rendering process of YARD, +which is invoked when conventional HTML/text output needs to be rendered +for a set of code objects. + +## Design Goals + +The general design attempts to be as abstracted from actual content and templates +as possible. Unlike RDoc which uses one file to describe the entire template, +YARD splits up the rendering of code objects into small components, allowing +template modification for smaller subsets of a full template without having to +duplicate the entire template itself. This is necessary because of YARD's support +for plugins. YARD is designed for extensibility by external plugins, and because +of this, no one plugin can be responsible for the entire template because no +one plugin knows about the other plugins being used. For instance, if an RSpec +plugin was added to support and document specifications in class templates, +this information would need to be transparently added to the template to work +in conjunction with any other plugin that performed similar template modifications. +The design goals can be summarized as follows: + + 1. Output should be able to be rendered for any arbitrary format with little + modification to YARD's source code. The addition of extra templates should + be sufficient. + 2. The output rendered for an object should independently rendered data + from arbitrary sources. These independent components are called "sections". + 3. Sections should be able to be inserted into any object without affecting + any existing sections in the document. This allows for easy modification + of templates by plugins. + +## Templates + +Template modules are the objects used to orchestrate the design goals listed +above. Specifically, they organize the sections and render the template contents +depending on the format. + +## Engine + +The Engine class orchestrates the creation and rendering of Template modules and +handles serialization or specific rendering scenarios (like HTML). To create +a template, use the {YARD::Templates::Engine.template template} method. The two most +common methods used to initiate output are the {YARD::Templates::Engine.render render} +and {YARD::Templates::Engine.generate generate} methods which generate and +optionally serialize output to a file. The latter, `#generate`, is used +specially to generate HTML documentation and copy over assets that may be +needed. For instance, an object may be rendered with: + + YARD::Templates::Engine.render(:object => myobject) + +A set of objects may be rendered into HTML documentation by using: + + # all_objects is an array of module and class objects + # options includes a :serializer key to copy output to the file system + YARD::Templates::Engine.generate(all_objects, options) + +Note that these methods should not be called directly. The {YARD::CodeObjects::Base} +class has a {YARD::CodeObjects::Base#format #format} helper method to render an +object. For instance, the above render example is equivalent to the simple +call `myobject.format`. The `generate` method is a special kind of render +and is called from the {YARD::CLI::Yardoc} command line utility. + +## Template Options + +A template keeps state when it is rendering output. This state is kept in +an options hash which is initially passed to it during instantiation. Some +default options set the template style (`:template`), the output format (`:format`), +and the serializer to use (`:serializer`). This options hash is modifiable +from all methods seen above. For example, initializing a template to output as +HTML instead of text can be done as follows: + + myobject.format(:format => :html) + +## Serializer + +This class abstracts the logic involved in deciding how to serialize data to +the expected endpoint. For instance, there is both a {YARD::Serializers::StdoutSerializer StdoutSerializer} +and {YARD::Serializers::FileSystemSerializer FileSystemSerializer} class for +outputting to console or to a file respectively. When endpoints with locations +are used (like files or URLs), the serializer implements the {YARD::Serializers::Base#serialized_path #serialized_path} +method. This allows the translation from a code object to its path at the endpoint, +which enables inter-document linking. + +Rendered objects are automatically serialized using the object if present, +otherwise the rendered object is returned as a string to its parent. Nested +Templates automatically set the serializer to nil so that they return +as a String to their parent. + +## Creating a Template + +Templates are represented by a directory inside the {YARD::Templates::Engine.template_paths} +on disk. A standard template directory looks like the following tree: + + (Assuming templates/ is a template path) + templates + `-- default + |-- class + | |-- dot + | | |-- setup.rb + | | `-- superklass.erb + | |-- html + | | |-- constructor_details.erb + | | |-- setup.rb + | | `-- subclasses.erb + | |-- setup.rb + | `-- text + | |-- setup.rb + | `-- subclasses.erb + |-- docstring + | |-- html + | | |-- abstract.erb + | | |-- deprecated.erb + | | |-- index.erb + | | `-- text.erb + | |-- setup.rb + | `-- text + | |-- abstract.erb + | |-- deprecated.erb + | |-- index.erb + | `-- text.erb + +The path `default` refers to the template style (:template key in options hash) +and the directories at the next level (such as `class`) refer to template +`:type` (options hash key) for a template. The next directory refers to the +output format being used defined by the `:format` template option. + +As we saw in the above example, the format option can be set to `:html`, which +would use the `html/` directory instead of `text/`. Finally, the individual .erb +files are the sections that make up the template. + +Note that the subdirectory `html/` is also its own "template" that inherits +from the parent directory. We will see more on this later. + +## setup.rb + +Every template should have at least one `setup.rb` file that defines the +{YARD::Templates::Template#init #init} method to set the +{YARD::Templates::Template#sections #sections} used by the template. If +a setup.rb is not defined in the template itself, there should be a template +that is inherited (via parent directory or explicitly) that sets the sections +on a newly created template. + +A standard setup.rb file looks like: + + def init + sections :section1, :section2, :section3 + end + +## Sections + +Sections are smaller components that correlate to template +fragments. Practically speaking, a section can either be a template fragment +(a conventional .erb file or other supported templating language), a method +(which returns a String) or another {YARD::Templates::Template} (which in turn has its own +list of sections). + +## Nested Sections + +Sections often require the ability to encapsulate a set of sub-sections in markup +(HTML, for instance). Rather than use heavier Template subclass objects, a more +lightweight solution is to nest a set of sub-sections as a list that follows +a section, for example: + + def init + sections :header, [:section_a, :section_b] + end + +The above example nests `section_a` and `section_b` within the `header` section. +Practically speaking, these sections can be placed in the result by `yield`ing +to them. A sample header.erb template might contain: + +

Header

+
+ <%= yieldall %> +
+ +This template code would place the output of `section_a` and `section_b` within +the above div element. Using `yieldall`, we can also change the object that is being +rendered. For example, we may want to yield the first method of the class. +We can do this like so: + +

First method

+ <%= yieldall :object => object.meths.first %> + +This would run the nested sections for the method object instead of the class. + +Note that `yieldall` yields to all subsections, whereas `yield` will yield +to each individually (in order) until there are no more left to yield to. +In the vast majority of cases, you'd want to use `yieldall`, since `yield` +makes it hard for users to override your template. + +## Inheriting Templates + +Parent directory templates are automatically inherited (or mixed in, to be +more accurate) by the current template. This means that the 'default/class/html' +template automatically inherits from 'default/class'. This also means that anything +defined in 'default/class/setup.rb' can be overridden by 'default/class/html/setup.rb'. + +Since the Template module is a module, and not a class, they can be mixed in +explicitly (via include/extend) from other templates, which allows templates +to share erb files or helper logic. The 'default/class' template explicitly +mixes in the 'default/module' template, since it uses much of the same sections. +This is done with the helper {YARD::Templates::Template::ClassMethods#T T} method, which +is simply a shorthand for {YARD::Templates::Engine.template Engine.template}. +It can then override (using standard inheritance) the sections from the module +template and insert sections pertaining to classes. This is one of the design +goals described above. + +For instance, the first line in `default/class/html/setup.rb` is: + + include T('default/module/html') + +This includes the 'default/module/html', which means it also includes 'default/module' +by extension. This allows class to make use of any of module's erb files. + +## Inserting and Traversing Sections + +The ability to insert sections was mentioned above. The class template, for +instance, will modify the #init method to insert class specific sections: + + def init + super + sections.place(:subclasses).before(:children) + sections.delete(:children) + sections.place([:constructor_details, [T('method_details')]]).before(:methodmissing) + end + +Observe how sections has been modified after the super method was called (the +super method would have been defined in `default/module/setup.rb`). The +`sections` object is of the {YARD::Templates::Section} class and allows sections to be inserted +before or after another section using {Array#place} by it's given name rather +than index. This allows the overriding of templates in a way that does not +depend on where the section is located (since it may have been overridden by +another module). + +You can also use `sections[:name]` to find the first child section named `:name`. +For instance, with the following sections declaration: + + sections :a, [:b, :c, [:d]] + +You can get to the :d section with: + + sections[:a][:c][:d] + +You can use this to insert a section inside a nested set without using indexed +access. The following command would result in `[:a, [:b, :c, [:d, :e]]]`: + + sections[:a][:c].place(:e).after(:d) + +There are also two methods, {Insertion#before_any} and {Insertion#after_any}, +which allow you to insert sections before or after the first matching section name +recursively. The above example could simply be rewritten as: + + sections.place(:e).after_any(:d) + +## Overriding Templates by Registering a Template Path + +Inheriting templates explicitly is useful when creating a customized template +that wants to take advantage of code re-use. However, most users who want +to customize YARD templates will want to override existing behaviour without +creating a template from scratch. + +YARD solves this problem by allowing other template paths to be registered. +Because template modules are represented by a relative path such as 'default/class', +they can be found within any of the registered template paths. A new template +path is registered as: + + YARD::Templates::Engine.register_template_path '/path/to/mytemplates' + +At this point, any time the 'default/class' template is loaded, the template +will first be looked for inside the newly registered template path. If found, +it will be used as the template module, with the modules from the other +template paths implicitly mixed in. + +Therefore, by using the same directory structure as a builtin YARD template, +a user can customize or override individual templates as if the old ones were +inherited. A real world example would further modify the 'default/class' template +seen above by creating such a path in our '/path/to/mytemplates' custom template +path: + + /path/to/mytemplates/: + |-- class + | |-- html + | | |-- customsection.erb + | |-- setup.rb + +The `setup.rb` file would look like: + + def init + super + sections.push :customsection + end + +Now, when a class object is formatted as HTML, our customsection.erb will be +appended to the rendered data. + + +### Overriding Stylesheets and Javascripts + +Template authors can override existing stylesheets and javascripts by creating +a file with the same name as existing files within the `fulldoc` template. The +documentation output will utilize the new replacement file. + +YARD's `fulldoc` template defines three stylesheets: + + /yard/templates/default/: + |-- fulldoc + | |-- html + | | |-- css + | | | |-- common.css + | | | |-- full_list.css + | | | |-- style.css + +The `style.css` is the primary stylesheet for the HTML output. + +The `full_list.css` is an additional stylesheet loaded specifically for the +search field menus (i.e. class list, method list, and file list). + +The `common.css` is an empty css file that an template author can easily override +to provide custom styles for their plugin. However, if a user installs multiple +plugins that utilize this same file to deliver styles, it is possible that they +will be overridden. + +YARD's `fulldoc` template defines three javascript files: + + /yard/templates/default/: + |-- fulldoc + | |-- html + | | |-- js + | | | |-- app.js + | | | |-- full_list.js + | | | |-- jquery.js + +The `app.js` is the primary javascript file for the HTML output. + +The `full_list.js` defines additional javascript loaded specifically for the +search field menus (i.e. class list, method list, and file list). + +The `jquery.js` is copy of the jquery javascript library. + +### Adding a Custom Stylesheet or Javascript + +To load additional stylesheets and javascripts with every page (except the search +field menus) generated from the base `layout` template: + + 1. Define your own custom stylesheet and/or javascript file + (default/ is the default template name inside of the /template root directory): + + /template/default/: + |-- fulldoc + | |-- html + | | |-- css + | | | |-- custom.css + | | |-- js + | | | |-- custom.js + + 2. Create a `setup.rb` in the `layout` template directory and override the methods + `stylesheets` and `javascripts`. The path to the template would be: + + /template/default/: + |-- layout + | |-- html + | | |-- setup.rb + + And the code would look like: + + def stylesheets + # Load the existing stylesheets while appending the custom one + super + %w(css/custom.css) + end + + def javascripts + # Load the existing javascripts while appending the custom one + super + %w(js/custom.js) + end + + +To load additional stylesheets and javascripts for the search menus loaded from +the `fulldoc` template: + + 1. Define your own custom stylesheet and/or javascript file. + + /path/to/mytemplates/: + |-- fulldoc + | |-- html + | | |-- css + | | | |-- custom_full_menu.css + | | |-- js + | | | |-- custom_full_menu.js + + + 3. Override the methods `stylesheets_full_list` and `javascripts_full_list` + in the `setup.rb` file inside fulldoc/html. + + def stylesheets_full_list + # Load the existing stylesheets while appending the custom one + super + %w(css/custom.css) + end + + def javascripts_full_list + # Load the existing javascripts while appending the custom one + super + %w(js/custom.js) + end + +### Overriding Search Menus + +By default YARD's `fulldoc` template generates three search fields: + + * Class List + * Method List + * File List + +Their contents are rendered in methods within the `fulldoc` template: + + * `generate_class_list` + * `generate_method_list` + * `generate_file_list` + +To override these lists you will need to: + + 1. Create a `setup.rb` in the `fulldoc` template directory and override the + particular method. + + /path/to/mytemplates/: + |-- fulldoc + | |-- html + | | |-- setup.rb + + def generate_method_list + @items = prune_method_listing(Registry.all(:method), false) + @items = @items.reject {|m| m.name.to_s =~ /=$/ && m.is_attribute? } + + # Here we changed the functionality to reverse the order of displayed methods + @items = @items.sort_by {|m| m.name.to_s }.reverse + @list_title = "Method List" + @list_type = "methods" + asset('method_list.html', erb(:full_list)) + end + +### Adding Additional Search Menus + +By default YARD's `fulldoc` template generates three search fields: + + * Class List + * Method List + * File List + +These are defined in the `layout` template method `menu_lists` and pulled into +the `fulldoc` template through a similarly named method. + +To load an additional menu item: + + + 1. Create a `setup.rb` in the `layout` template directory and override the methods + `menu_lists`. The `type` informs the search field the name of the file. + The `title` is the name that appears above the section when viewed in frames. + The `search_title` is the name that appears in the search field tab on the page. + + + /path/to/mytemplates/: + |-- layout + | |-- html + | | |-- setup.rb + + def menu_lists + # Load the existing menus + super + [ { :type => 'feature', :title => 'Features', :search_title => 'Feature List' } ] + end + + 2. Create a `setup.rb` in the `fulldoc` template directory and create a method + to generate a menu for the specified `type`. + The method `generate_assets` will look for a function with a signature prefixed + with `generate`, the type value specified, and the suffix `list`. Within that + method you can configure and load the specific objects you wish to display. + + /path/to/mytemplates/: + |-- fulldoc + | |-- html + | | |-- setup.rb + + def generate_feature_list + + # load all the features from the Registry + @items = Registry.all(:feature) + @list_title = "Feature List" + @list_type = "feature" + + # optional: the specified stylesheet class + # when not specified it will default to the value of @list_type + @list_class = "class" + + # Generate the full list html file with named feature_list.html + # @note this file must be match the name of the type + asset('feature_list.html', erb(:full_list)) + end diff --git a/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/docs/WhatsNew.md b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/docs/WhatsNew.md new file mode 100644 index 000000000..4e00c82a5 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/docs/WhatsNew.md @@ -0,0 +1,1245 @@ +# @title What's New? + +# What's New in 0.8.x? + +1. **Directives (new behavioural tag syntax)** (0.8.0) +2. **Added `--embed-mixin(s)` to embed mixins into class docs** (0.8.0) +3. **Internationalization (I18n) support for translating docs** (0.8.0) +4. **New C parser / handlers architecture** (0.8.0) +5. **YARD will now warn if `@param` name not in method params** (0.8.0) +6. **Added support for `module_function` calls in Ruby code** (0.8.0) +7. **Greatly improved tag documentation using custom template** (0.8.0) +8. **Tags can now contain '.' for namespacing** (0.8.0) +9. **Added "frames" links for non-framed pages for better nav** (0.8.0) +10. **Added Gemfile support to YARD server for local gem sets** (0.8.0) +11. **Server now displays README on index route like static docs** (0.8.0) +12. **Added line numbers to `yard stats --list-undoc --compact`** (0.8.0) +13. **Single object db now default (multi-object db unsupported)** (0.8.0) +14. **Added `--api` tag to generate documentation for API sets** (0.8.1) +15. **Added `--non-transitive-tag` to disable transitive tag** (0.8.3) +16. **Added `-B/--bind` to bind to a port in yard server** (0.8.4) +17. **Added `asciidoc` markup type support** (0.8.6) +18. **Added `yard markups` command to list available markup types** (0.8.6) +19. **Added `yard display` command to display formatted objects** (0.8.6) +20. **Added `--layout` to `yard display` command** (0.8.6.1) +21. **Added `stats_options` for the rake task** (0.8.7.6) + +## Directives (new behavioural tag syntax) (0.8.0) + +

+ The tags {tag:!macro}, {tag:!method}, {tag:!attribute}, {tag:!group}, + {tag:!endgroup}, {tag:!scope} and {tag:!visibility} have been changed + from meta-data tags to directives. This means they should now be called + with the "@!" prefix instead of "@". Note however that for + backward compatibility, the old "@macro", "@method", etc., + syntax for all of these tags will still work and is supported. +

+ +

+ Some backwards incompatible changes were made to {tag:!macro} syntax. + Please read this section carefully if you are using this tag. +

+ +YARD 0.8.0 adds a new tag syntax called "directives" using the `@!` +prefix. These directive tags can be used to modify parser state while +processing objects, or even create new objects on the fly. A plugin +API is available similar to tags, and directives should be registered +in the {YARD::Tags::Library} class using {YARD::Tags::Library.define_directive}. + +To use a directive, simply call it the same way as any tag. Tag syntax +is documented in {file:docs/Tags.md}. + +### Notable features of directives + +#### Directives do not need to be attached to object docstrings + +Unlike meta-data tags which apply to created objects, directives +do not need to be attached to an object in order to be used. This +means you can have free-standing comments with directives, such as: + + # @macro mymacro + # A new macro, not attached to any docstring + + # ...other Ruby code here... + + # Using the macro: + # @macro mymacro + def mymethod; end + +You can do the same to define methods and attributes, as discussed +below. + +#### `@!method` and `@!attribute` directives improved + +The method and attribute directives can now be used to create multiple +objects in a single docstring. Previously a `@method` or `@attribute` +tag would only create one method per docstring. In 0.8.0, you could +attach multiple methods to the same block of Ruby source, such as: + + # @!method foo(a, b, c) + # @!method bar(x, y, z) + # Docstring for code + some_ruby_source + +The above creates #foo and #bar and the source listing for both will +be `some_ruby_source` with "Docstring for code" as the docstring. + +The attribute directive can take advantage of this functionality as well. +Note that these directives also do not need to be attached to a line of +code to be recognized; they can be in free-standing comments if the +methods are defined dynamically and not associated with any code. + +#### New `@!parse` directive to parse Ruby code + +A new {tag:!parse} directive was added that allows a developer to have +YARD parse code that might not necessarily be parseable in its original +form. This is useful when using `instance_eval` and other dynamic +meta-programming techniques to define methods or perform functionality. +For instance, a common case of the "self.included" callback in module +to extend a module on a class might be in the form: + + def self.included(mod) + mod.extend(self) + end + +Unfortunately, this does not get picked up by YARD, but on the original +class, we can add: + + class MyClass + # @!parse extend TheDynamicModule + include TheDynamicModule + end + +YARD will then parse the code `extend TheDynamicModule` as if +it were in the source file. + +You can also use this technique to register regular methods as +attributes, if you did not define them with `attr_*` methods: + + def foo; @foo end + def foo=(v) @foo = v end + + # Register them as methods: + # @!parse attr_accessor :foo + +### Backward incompatible changes to `@!macro` directive + +Unfortunately, in order to create the new directives architecture, +some previously supported syntax in `@macro` tags are no longer supported. +Specifically, macros can no longer expand text on an entire docstring. +Instead, macros only expand the data that is indented inside of the tag +text. + +This syntax is **no longer supported**: + + # @macro mymacro + # Expanding text $1 $2 $3 + property :a, :b, :c + +In 0.7.0 to 0.7.5, the above would have created a method with the docstring +"Expanding text a b c". This will not work in 0.8.0. Instead, you must +indent all the macro expansion data so that it is part of the `@macro` +tag as follows: + + # @!macro mymacro + # Expanding text $1 $2 $3 + property :a, :b, :c + +Note that we also use the recommended `@!macro` syntax, though `@macro` +is still supported. + +## Added `--embed-mixin(s)` to embed mixins into class docs (0.8.0) + +Methods from mixins can now be embedded directly into the documentation +output for a class by using `--embed-mixin ModuleName`, or `--embed-mixins` +for all mixins. This enables a documentation writer to refactor methods +into modules without worrying about them showing up in separate files +in generated documentation. When mixin methods are embedded, they +show up in both the original module page and the pages of the classes +they are mixed into. A note is added to the method signature telling the +user where the method comes from. + +The `--embed-mixin` command-line option can also take wildcard values +in order to match specific namespaces. For instance, you can embed +only mixins inside of a "Foo::Bar" namespace by doing: + + !!!sh + $ yard doc --embed-mixin "Foo::Bar::*" + +## Internationalization (I18n) support for translating docs + +YARD now ships with the beginnings of internationalization support +for translating documentation into multiple languages. The +`yard i18n` command now allows you to generate ".pot" and ultimately +".po" files for translation with [gettext](http://www.gnu.org/software/gettext). + +Note that this tool is a small step in the larger transition for +proper I18n support in YARD. We still have to add proper gettext +support to our templates for proper generation in multiple languages, +but this tool allows you to get started in translating your +documents. Improved I18n support will come throughout the 0.8.x series. + +## New C parser / handlers architecture (0.8.0) + +The C parser was completely rewritten to take advantage of YARD's +parser and handler architecture. This means more YARD will be more robust +when parsing failures occur, tags and directives will now work consistently +across Ruby and CRuby files ({tag:!group} will now work, for instance), +and developers can now write custom handlers that target CRuby source files. + +## YARD will now warn if `@param` name not in method params (0.8.0) + +YARD will now give you a warning if you use a `@param` tag in your +source but give an invalid parameter name. This should catch a lot of +common documentation errors and help keep your documentation consistent. + +## Added support for `module_function` calls in Ruby code (0.8.0) + +The `module_function` command in Ruby is now supported in Ruby files. +It defines two separate methods, one class and one instance method, +both having the exact same docstring, and marks the instance method +as private. + +## Greatly improved tag documentation using custom template (0.8.0) + +We have completely revamped the {docs/Tags.md} to include documentation +for each meta-data tag and directive with at least one useful example +for each one. This was done using template customization and extension +available within YARD. + +## Tags can now contain '.' for namespacing (0.8.0) + +Prior to 0.8.0, tags could only contain alphanumeric characters and +underscore. YARD now allows the '.' character in tag names, and it +is now recommended for namespacing project-specific custom tags. +YARD has its own set of custom tags that are namespaced in this +way (using the "yard.tagname" namespace). The namespace recommendation +is to use "projectname.tagname", or "projectname.component.tagname". + +## Added "frames" links for non-framed pages for better nav (0.8.0) + +Frames navigation has always had a "(no frames)" link to get rid +of the frameset. YARD 0.8.0 introduces a "(frames)" link on non-framed +pages to reverse this, allowing you to navigate between framed and +frameless pages seamlessly. + +## Added Gemfile support to YARD server for local gem sets (0.8.0) + +The `yard server` command now supports `--gemfile` to serve gems +from a Gemfile.lock, instead of all system-wide gems. + +## Server now displays README on index route like static docs (0.8.0) + +The `yard server` command will now behave like static docs regarding +the index action for a project, listing the README file if present +before displaying the alphabetic index. Note that the route for +the alphabetic index page has now moved to the explicit '/index' action. + +## Added line numbers to `yard stats --list-undoc --compact` (0.8.0) + +Line numbers are now listed in the compact listing of undocumented objects +so that they can be more easily located in the files. + +## Single object db now default (multi-object db unsupported) (0.8.0) + +YARD previously would split the .yardoc db into multiple marshal files +for load-time performance reasons if it grew past a specific number of +objects. This check is now disabled, and YARD will never automatically +switch to a multi-object DB. YARD will now always use the single object +db unless explicitly set with `--no-single-db`. If YARD is taking a +long time to load your .yardoc database, you can try using this +option to split your database into multiple files, but note that this +can cause problems with certain codebases (specifically, if you +have class methods using the same name as a module/class). + +## Added `--api` tag to generate documentation for API sets (0.8.1) + +You can now use `yardoc --api APINAME` to generate documentation only +for objects with the `@api APINAME` tag (or any parent namespace objects, +since this tag is transitive). Multiple `--api` switches may be used to +generate documentation for multiple APIs together. The following generates +documentation for both the "public" and "developer" APIs, also including +any objects with undefined API (via `--no-api`): + + $ yard doc --api public --api developer --no-api + +Note that if you use `--api`, you must ensure that you also add `@api` +tags to your namespace objects (modules and classes), not just your methods. +If you do not want to do this, you can also include all objects with *no* +`@api` tag by using `--no-api` as shown above. + +Remember that applying an `@api` tag to a class or module will apply it +to all children that do not have this tag already defined, so you can +declare an entire class public by applying it to the class itself. Note +also that these tags can be overridden by child elements if the tag is +re-applied to the individual object. + +This feature is a simplified version of the more powerful `--query` +switch. The query to display the same API documentation as the +above example would be: + + $ yard doc --query '!@api || @api.text =~ /^(public|private)$/' + +But note that `--query` does not work when YARD is in "safe mode" +due to security concerns, whereas `--api` works in either mode. +This enables `--api` to function on remote documentation sites like +[rubydoc.info](http://rubydoc.info). + +## Added `--non-transitive-tag` to disable transitive tag (0.8.3) + +You can now use `--non-transitive-tag` to disable transitivity on +tags that are defined as transitive by default. For instance, in +some cases you might not want the @api tag to apply to all methods +when you define it on a class. Only the class itself has a specific +@api tag. To do this, you can mark @api as non-transitive with: + + $ yard doc --non-transitive-tag api --api some_api + +Which will avoid classifying treating @api as a transitive tag +when parsing modules and classes. + +## Added `-B/--bind` to bind to a port in yard server (0.8.4) + +You can now bind the `yard server` command to a given local port +with `yard server -B PORT` or `yard server --bind PORT`. + +## Added `asciidoc` markup type support (0.8.6) + +Support for the AsciiDoc markup type is now introduced using the `asciidoc` +markup type (`yard doc -m asciidoc`). Requires the +[asciidoctor](http://rubygems.org/gems/asciidoctor) RubyGem library to be +installed before running YARD. + +## Added `yard markups` command to list available markup types (0.8.6) + +You can now list all available markup types and their respective providers by +typing `yard markups`. This list also includes the file extensions used to +auto-identify markup types for extra files and READMEs. To use a markup in +the list, call `yard doc` with `-m MARKUP_TYPE`. To select a specific markup +provider library, pass the `-M PROVIDER_NAME` option. + +## Added `yard display` command to display formatted objects (0.8.6) + +

This feature requires the .yardoc registry to have already been + generated. To generate the registry, run yard doc -n. +

+ +You can now display a single object (or a list of objects) in the YARD registry +using the `yard display OBJECT ...` command. For example, to display the +`YARD::CodeObjects` module as text (the way it is displayed in `yri`), type: + + $ yard display YARD::CodeObjects + +You can also format individual objects as HTML. For example, you can format +the above object as HTML and pipe the contents into a file readable by a +web browser: + + $ yard display -f html YARD::CodeObjects > codeobjects.html + +Custom templating options from `yard doc` can also be used, see +`yard display --help` for more options. + +## Added `--layout` to `yard display` command (0.8.6.1) + +The `yard display` command now accepts `--layout` to wrap content in a layout +template. Currently the `layout` and `onefile` layout templates are supported, +though any template can be used. If no parameter is specified, the layout will +default to the `layout` template. Example usage: + + $ yard display --layout onefile -f html YARD::CodeObjects > codeobjects.html + +The above generates a `codeobjects.html` file that is self-contained with +CSS stylesheets and JavaScript code. This is similar to calling +`yard doc --one-file` with only the YARD::CodeObjects object in the registry. + +Note that even though this uses the onefile template, the README file will not +be auto-included the way it is with the `yard doc` command. To include the +README text at the top of the onefile template, pass the --readme switch: + + $ yard display --layout onefile -f html --readme README.md OBJECT > out.html + +# What's New in 0.7.x? + +1. **Macro support and detection of DSL methods** (0.7.0) +2. **Inherited attributes now show in HTML output** (0.7.0) +3. **The 'app' directory is now parsed by default** (0.7.0) +4. **Added support for metadata (@title, @markup) in extra files/readmes** (0.7.0) +5. **Added `yard list` command (alias for `yardoc --list`)** (0.7.0) +6. **Added Git support in `yard diff`** (0.7.0) +7. **Added `{include:file:FILENAME}` syntax** (0.7.0) +8. **Added `{render:OBJECT}` syntax to embed object docs in extra files** (0.7.0) +9. **Added improved templates API for custom CSS/JS/menus** (0.7.0) +10. **Added Ruby markup type (`-m ruby`)** (0.7.0) +11. **Added state tracking variables to Parser/Handler architecture** (0.7.0) +12. **Added before/after callbacks to SourceParser** (0.7.0) +13. **Can now use `--yardopts FILE` to specify a custom yardopts file** (0.7.0) +14. **Added new `-t guide` template for guide based docs** (0.7.0) +15. **Github Flavoured Markdown now works out-of-box** (0.7.4) +16. **Added `-m textile_strict` and `-m pre` markup types** (0.7.4) +17. **Reorganized markup types 'text' and 'none'** (0.7.4) +18. **Add support for `rb_define_alias`** (0.7.4) + +## Macro support and detection of DSL methods (0.7.0) + +YARD will now automatically detect class level method calls, similar to the +way it knows what an `attr_accessor` is. By simply adding documentation to +your class level declarations, YARD can automatically detect them as methods +or attributes in your class. Consider DataMapper's "property" declaration: + + class Post + # @attribute + # @return [String] the title of the post + property :title, String + end + +The above declaration would be created as the `Post#title`. The optional +`@attribute` tag tells YARD that the property is an "attribute", and not just +a regular method. + +In addition to basic DSL method detection, YARD also supports macros to create +docstrings that can be copies to other objects; these macros can also be +"attached" to class level methods to create implicit documentation for macros. + +Macros and DSL method detection are discussed in much more detail in the +{file:docs/GettingStarted.md}, so you should read about them there if you're +interested in this feature. + +## Inherited attributes now show in HTML output (0.7.0) + +Inherited attributes will now show up in HTML documentation using the default +template in the same manner that inherited methods do. + +## The 'app' directory is now parsed by default (0.7.0) + +YARD tries to follow the "It Just Works" attitude in writing developer tools, +and therefore has added `app/**/*.rb` to the default list of globs that it +searches for code in. You no longer need to create a `.yardopts` just to +list your app directory when documenting your code on rubydoc.info. +We should have done this a while ago! And don't worry, YARD still checks +lib and ext by default, too. + +## Added support for metadata (@title, @markup) in extra files/readmes (0.7.0) + +Extra files (READMEs, ChangeLogs, LICENSE files, and other guides) now support +metadata tags, just like docstrings in code comments. By adding @tag values +to the top of a file (no whitespace preceding it) inside of a `# comment` line, +YARD will detect and parse these tags and store it for later usage. + +Tags can contain arbitrary data as well as arbitrary tag names, however the +tag names @title and @markup are reserved to specify the document title and +markup format respectively. The title will be used in the file list menu, +index page, as well as any linking of the file via the `{file:Filename}` +syntax. An example of a document with metadata would be: + + # @title The Best Project Ever! + # @markup rdoc + # @author Foo Bar (custom tag, does not display in templates) + + = This Project Rules + + == Contents + + ... + +Note that previous versions of YARD recommended specifying the markup of an +extra file with the `#!markup` shebang, but the `@markup` metadata tag is now +the "best practice" for specifying the markup format of an extra file. + +## Added `yard list` command (alias for `yardoc --list`) (0.7.0) + +The `yardoc --list` command is used to list objects that are parsed from +a codebase. This can be used to grep methods/classes in a codebase from the +command line. `yard list` now calls `yardoc --list` as a convenience command. + +Note that the `yardoc --list` command may eventually be replaced by a more +feature-filled `yard list` command, so `yard list` should be used instead of +`yardoc --list` when possible. + +## Added Git support in `yard diff` (0.7.0) + +The `yard diff` command can now perform object diffing on git repositories. +Provide the `--git` switch to `yard diff` with 2 commit/branches like so: + + $ yard diff --git HEAD~5 HEAD + Added objects: + + YARD::Parser::SourceParser#contents + YARD::Parser::SourceParser#globals + ... + +## Added `{include:file:FILENAME}` syntax (0.7.0) + +You can now use the `{include:file:FILENAME}` syntax to embed the contents +of an extra file marked up in its markup format. This syntax supports embedding +Ruby source files and performing syntax highlighting on the code. + +## Added `{render:OBJECT}` syntax to embed object docs in extra files (0.7.0) + +You can now use the `{render:Object}` syntax to embed the documentation +rendering of an entire object (method, class, module) inside of an extra file. +This is useful when writing non-API based guides that might require listing +a few helper methods or classes. The {file:docs/GettingStarted.md} discussed +this syntax in more detail (with example usage). + +## Added improved templates API for custom CSS/JS/menus (0.7.0) + +Plugin & template developers can now more easily insert custom stylesheet +or JavaScript files in their customized templates, thanks to an abstraction +of the template API. This is documented in the {docs/Templates.md} document. +In addition to custom CSS/JS, developers can also create custom menu tabs +in both the framed and non framed version of the default theme. + +## Added Ruby markup type (`-m ruby`) (0.7.0) + +The Ruby markup type (`-m ruby`) will now use syntax highlighting for all +formatting. This is probably not useful as a global switch, but can be used +on individual extra files using the metadata markup specification discussed +above. + +## Added state tracking variables to Parser/Handler architecture (0.7.0) + +The parser and handler architecture now contain state variables +{YARD::Handlers::Base#extra_state} and {YARD::Handlers::Processor#globals} +to share data across handlers and the entire processing phase. `#extra_state` +provided a place to store per-file data, while `#globals` gives the developer +access to inter-file state when parsing multiple files at once. + +## Added before/after callbacks to SourceParser (0.7.0) + +The {YARD::Parser::SourceParser} class can now register callbacks to execute +code before and after parsing of file globs, as well as before and after +parsing of individual files. This allows plugin developers to perform +setup/teardown (and set global state or update the {YARD::Registry}). + +See the documentation for the following methods: + +* {YARD::Parser::SourceParser.before_parse_list} +* {YARD::Parser::SourceParser.after_parse_list} +* {YARD::Parser::SourceParser.before_parse_file} +* {YARD::Parser::SourceParser.after_parse_file} + +## Can now use `--yardopts FILE` to specify a custom yardopts file (0.7.0) + +The `yardoc` command now supports `--yardopts FILE` to specify custom .yardopts +options files. This is useful if you have multiple documentation sets, such +as a guide documentation set and an API documentation set. + +## Added new `-t guide` template for guide based docs (0.7.0) + +You can now write guide style documentation using a new 'guide' template that +only generates documentation for extra files. You would use it in the form: + + yardoc -t guide - README GettingStarted FAQ TroubleShooting LICENSE + +This creates the sections for the readme, a getting started, frequently asked +questions, trouble shooting and license page. + +If you need to refer to class / method documentation, you can embed API documentation +using the `{render:Object}` tag discussed above. + +## Github Flavoured Markdown now works out-of-box (0.7.4) + +Due to the growing popularity of Github-Flavoured-Markdown (GFM), YARD now uses +the Redcarpet library as the default Markdown formatting library with GFM fenced +code blocks enabled. This means that you can use fenced code blocks inside of +Markdown files with redcarpet installed without any extra code. Previously, users +who wanted GFM in their Markdown would have to specify `-m markdown -M redcarpet`, +but this is now the default behaviour for YARD. + +Note that you can still specify language types in code blocks without GFM in YARD +by using the "!!!lang" prefix syntax. For example (plain means no markup): + + !!!plain + !!!plain + Some code + block here. + +The GFM version would be: + + !!!plain + ```plain + Some code + block here. + ``` + +## Added `-m textile_strict` and `-m pre` markup types (0.7.4) + +A new "textile_strict" markup type was added which behaves exactly like "textile" +except it enables hard breaks, so newlines behave as line breaks in the HTML +(using `
` tags). This option is added for users who want the classic textile +behaviour. + +## Reorganized markup types 'text' and 'none' (0.7.4) + +Due to the new pre markup type, the behaviour for text and none were slightly +reorganized to be more intuitive. The following behaviours now represent these +markup types: + + * pre: Used to wrap text inside `
` tags
+ * text: No formatting except for hard breaks (`
`) on newlines + * none: No formatting at all. + +In all cases, HTML is escaped from input. If you want no HTML escaping, use the +html markup type. + +## Add support for `rb_define_alias` (0.7.4) + +CRuby code can now make use of the `rb_define_alias` function. Documentation +for aliases is not supported, however. + +# What's New in 0.6.x? + +1. **Local documentation server for RubyGems or projects (`yard server`)** (0.6.0) +2. **Groups support for method listing** (0.6.0) +3. **Single file template (`--one-file`) support** (0.6.0) +4. **`yard` CLI executable with pluggable commands** (0.6.0) +5. **`yard diff` command to object-diff two versions of a project** (0.6.0) +6. **Added `--asset` option to `yardoc`** (0.6.0) +7. **New template API** (0.6.0) +8. **HTML template now adds inline Table of Contents for extra files pages** (0.6.0) +9. **Removed `--incremental` in favour of `--use-cache`** (0.6.0) +10. **Ad-hoc tag registration via `yardoc` CLI (`--tag`, etc.)** (0.6.0) +11. **Added `--transitive-tags` to register transitive tags** (0.6.0) +12. **`yardoc` now displays RDoc-like statistics (`--no-stats` to hide)** (0.6.0) +13. **`yri` now works on constants** (0.6.0) +14. **Plugins are no longer auto-loaded (added `--plugin` switch)** (0.6.2) +15. **Added `YARD::Config` API and `~/.yard/config` configuration file** (0.6.2) +16. **Added `yard config` command to view/edit configuration** (0.6.2) +17. **Added `yard server -t` template path switch** (0.6.2) +18. **Added `YARD::Server.register_static_path` for static server assets** (0.6.2) +19. **YARD::Registry is now thread local** (0.6.5) +20. **Support for ripper gem in Ruby 1.8.7** (0.6.5) + +## Local documentation server for RubyGems or projects (`yard server`) (0.6.0) + +The new `yard server` command spawns a documentation server that can serve +either documentation for a local project or installed RubyGems. The server +will host (by default) on http://localhost:8808. + +To serve documentation for the active project (in the current directory): + + $ yard server + +The server can also run in "incremental" mode for local projects. In this +situation, any modified sources will immediately be updated at each request, +ensuring that the server always serve the code exactly as it is on disk. +Documenting your code in this fashion essentially gives you an efficient a +live preview without running a separate command everytime you make a change. +To serve documentation for the active project in incremental mode: + + $ yard server --reload + +Note that in incremental mode, objects or method groupings + cannot be removed. If you have removed objects or modified groupings, you + will need to flush the cache by deleting `.yardoc` and (optionally) + restarting the server. + +The documentation server can also serve documentation for all installed gems +on your system, similar to `gem server`, but using YARD's functionality and +templates. To serve documentation for installed gems: + + $ yard server --gems + +Documentation for the gem need not be previously generated + at install-time. If documentation for the gem has not been generated, YARD + will do this for you on-the-fly. It is therefore possible to speed up your + gem installs by using `gem install GEMNAME --no-rdoc` without repercussion. + You can also add this switch to your `~/.gemrc` file so that you don't need + to re-type it each time. See [this link](http://stackoverflow.com/questions/1789376/how-do-i-make-no-ri-no-rdoc-the-default-for-gem-install) + for exact instructions. + +## Groups support for method listing (0.6.0) + +You can now organize methods in a class/module into logical separated groups. +These groups apply lexically and are listed in the order they are defined. +For instance, to define a group: + + # @group Rendering an Object + + # Documentation here + def foo; end + + # Extra documentation... + def bar; end + + # @group Another Group + + def aaa; end + +Note that these `@group` and `@endgroup` declarations are + not "tags" and should always be separated with at least 1 line of whitespace + from any other documentation or code. + +In the above example, "Rendering an Object" will be listed with "foo" and +"bar" above "Another Group", even though "aaa" comes before the two other +methods, alphabetically. To end a group, use `@endgroup`. It is not necessary +to end a group to start a new one, only if there is an object following the +group that should not belong in any group. + + # @group Group 1 + + def foo; end + + # @endgroup + + # This method should not be listed in any group + def bar; end + +## Single file template (`--one-file`) support (0.6.0) + +`yardoc` now has the `--one-file` option to generate a single-file template +for small scripts and libraries. In this case, any comments at the top of +the script file will be recognized as a README. + +## `yard` CLI executable with pluggable commands (0.6.0) + +The `yardoc` and `yri` commands are not deprecated and can + continue to be used. They are shortcuts for `yard doc` and `yard ri` + respectively. However, `yard-graph` has been removed. + +YARD now has a `yard` executable which combines all pre-existing and new +commands into a single pluggable command that is both easier to remember and +access. To get a list of commands, type `yard --help`. + +If you are a plugin developer, you can create your own `yard` command by first +subclassing the {YARD::CLI::Command} class and then registering this class +with the {YARD::CLI::CommandParser.commands} list. For instance: + + YARD::CLI::CommandParser.commands[:my_command] = MyCommandClass + +The above line will enable the user to execute `yard my_command [options]`. + +## `yard diff` command to object-diff two versions of a project (0.6.0) + +One of the built-in commands that comes with the new `yard` executable is the +ability to do object-oriented diffing across multiple versions of the same +project, either by 2 versions of a gem, or 2 working copies. Just like +regular diffing tells you which lines have been added/removed in a file, +object diffing allows you to see what classes/methods/modules have been +added/removed between versions of a codebase. + +For an overview of how to use `yard diff`, see [YARD Object Oriented Diffing](http://gnuu.org/2010/06/26/yard-object-oriented-diffing/). + +## `yard stats` to display statistics and undocumented objects (0.6.0) + +YARD now outputs the following statistics when `yard stats` is run: + + Files: 125 + Modules: 35 ( 4 undocumented) + Classes: 139 ( 29 undocumented) + Constants: 53 ( 20 undocumented) + Methods: 602 ( 70 undocumented) + 85.16% documented + +Note that these statistics are based on what you have set to show in your +documentation. If you use `@private` tags and/or do not display +private/protected methods in your documentation, these will not show up as +undocumented. Therefore this metric is contextual. + +You can also specifically list all undocumented objects (and their file +locations) with the `--list-undoc` option. + +## Added `--asset` option to `yardoc` (0.6.0) + +The `yardoc` command can now take the `--asset` option to copy over +files/directories (recursively) to the output path after generating +documentation. The format of the argument is "from:to" where from is the +source path and to is the destination. For instance, YARD uses the following +syntax in the `.yardopts` file to copy over image assets from the +'docs/images' directory into the 'images' directory after generating HTML: + + --asset docs/images:images + +## New template API (0.6.0) + +The new template API allows for easier insertion of sections within an +inherited template. You should no longer need to insert by index, an +error-prone process that could break when a template is updated. Instead of: + + sections.last.place(:my_section).before(:another_section) + +use: + + sections.place(:my_section).before_any(:another_section) + +You can see more in the {file:docs/Templates.md#Inserting_and_Traversing_Sections} +document. + +## HTML template now adds inline Table of Contents for extra files pages (0.6.0) + +A table of contents is now generated dynamically using JavaScript for extra +file pages (such as README's, or this document). It is generated based off the +headers (h1,h2,... tags) used in the document, and can be floated to the +right or listed inline on the page. + +## Ad-hoc tag registration via `yardoc` CLI (`--tag`, etc.) (0.6.0) + +Simple meta-data tags can now be added at the command-line and registered to +display in templates in a number of pre-defined ways. For instance, to create +a freeform text tag, use the following: + + --tag my_tag_name:"My Tag Title" + +You can also create a "typed" tag (similar to `@return`), a typed named tag +(similar to `@param`) as well as various combinations. The full list of +options are listed in `yardoc --help` under the "Tag Options" section. + +If you wish to create a tag to store data but do not wish to show this data +in the templates, use the `--hide-tag` option to hide it from generated output: + + --hide-tag my_tag_name + +## Added `--transitive-tags` to register transitive tags (0.6.0) + +Transitive tags are tags that apply to all descendants of a namespace (class +or module) when documented on that namespace. For instance, the `@since` tag +is a transitive tag. Applying `@since` to a class will automatically apply +`@since` to all methods in the class. Creating a `@since` tag directly on a +method will override the inherited value. + +You can specify transitive tags on the command-line by using this option. Note +that the tags must already exist (built-in or created with the `--tag` option) +to be specified as transitive. If you wish to do this programmatically, see +the {YARD::Tags::Library.transitive_tags} attribute. + +## `yardoc` now displays RDoc-like statistics (`--no-stats` to hide) (0.6.0) + +As seen in the `yard stats` feature overview, `yardoc` displays RDoc-like +statistics when it is run. The output is equivalent to typing `yard stats`. +To hide this output when yardoc is run, use `--no-stats`. + +## `yri` now works on constants (0.6.0) + +Templates have now been added for text view of constants, which displays any +documentation and the constant value. + +## Plugins are no longer auto-loaded (added `--plugin` switch) (0.6.2) + +This is a backwards-incompatible change that disables plugins from automatically +loading when YARD starts up. From now on, you should manually declare which +plugins your project is using by adding `--plugin PLUGINNAME` to a `.yardopts` +file in the root of your project. You can also re-enable autoloaded plugins +by setting `load_plugins` to true in your configuration file (`yard config load_plugins true`, +see next item). You can also set `autoload_plugins` to a list of plugins +to be automatically loaded on start. + +If you are a YARD plugin author, please make sure to inform your users of these +changes. + +Note that `--plugin` switches passed on the commandline (not via `.yardopts`) +are parsed before commands are loaded, and therefore can add in new CLI commands. + +## Added `YARD::Config` API and `~/.yard/config` configuration file (0.6.2) + +There is a new global configuration API that can be accessed programmatically +and set via the `~/.yard/config` file. The file is encoded as a YAML file, +and looks like: + + :load_plugins: false + :ignored_plugins: + - my_plugin + - my_other_plugin + :autoload_plugins: + - my_autoload_plugin + :safe_mode: false + +You can also set configuration options via the command-line (see next item). + +## Added `yard config` command to view/edit configuration (0.6.2) + +A new `yard config` command was created to view or edit the configuration +file via the commandline. + +* To view the current configuration use `yard config --list`. +* To view a specific item use `yard config ITEMNAME` +* To modify an item value use `yard config ITEMNAME VALUE` + +## Added `yard server -t` template path switch (0.6.2) + +The `yard server` command now accepts `-t` or `--template-path` to register +a new template path for template customization. + +## Added `YARD::Server.register_static_path` for static server assets (0.6.2) + +The server now supports a command to register static asset paths. If you are +extending the YARD::Server modules, make sure to register your asset paths +through this method. + +## YARD::Registry is now thread local (0.6.5) + +Creating a new thread will now implicitly load a new Registry that can be used +to parse and process new code objects independently of the other threads. Note +that this means you can no longer use the Registry across threads; you must +either access the threadlocal object directly, or synchronize threads to do +the processing in the initial registry's thread. + +## Support for ripper gem in Ruby 1.8.7 (0.6.5) + +YARD now supports the Ruby 1.8.7 port of the `ripper` gem to improve parsing +of source, both in terms of performance and functionality. When the `ripper` +gem is available, YARD will use the "new-style" handlers. You can take advantage +of this functionality by performing a `gem install ripper`. + + +What's New in 0.5.x? +==================== + +1. **Support for documenting native Ruby C code** (0.5.0) +2. **Incremental parsing and output generation with `yardoc -c`** (0.5.0, 0.5.3) +2. **Improved `yri` support to perform lookups on installed Gems** (0.5.0) +3. **Added `yardoc --default-return` and `yardoc --hide-void-return`** (0.5.0) +4. **Multiple syntax highlighting language support** (0.5.0) +5. **New .yardoc format** (0.5.0) +6. **Support for yard-doc-* gem packages as hosted .yardoc dbs** (0.5.1) +7. **Support for extra search paths in `yri`** (0.5.1) +8. **Generating HTML docs now adds frames view** (0.5.3) +9. **Tree view for class list** (0.5.3) +10. **Ability to specify markup format of extra files** (0.5.3) +11. **Keyboard shortcuts for default HTML template** (0.5.4) + +Support for documenting native Ruby C code (0.5.0) +-------------------------------------------------- + +It is now possible to document native Ruby extensions with YARD with a new +C parser mostly borrowed from RDoc. This enables the ability to document +Ruby's core and stdlibs which will be hosted on http://yardoc.org/docs. In +addition, the .yardoc dump for the Ruby-core classes will become available +as an installable gem for yri support (see #3). + +Incremental parsing and output generation with `yardoc -c` (0.5.0, 0.5.3) +------------------------------------------------------------------------- + +

Note: in 0.5.3 and above you must use --incremental + to incrementally generate HTML, otherwise only parsing will be done + incrementally but HTML will be generated with all objects. --incremental + implies -c, so no need to specify them both.

+ +YARD now compares file checksums before parsing when using `yardoc -c` +(aka `yardoc --use-cache`) to do incremental parsing of only the files that +have changed. HTML (or other output format) generation will also only be +done on the objects that were parsed from changed files (\*). This makes doing +a documentation development cycle much faster for quick HTML previews. Just +remember that when using incremental output generation, the index will not +be rebuilt and inter-file links might not hook up right, so it is best to +perform a full rebuild at the end of such previews. + +(\*) Only for versions prior to 0.5.3. For 0.5.3+, use `--incremental` for +incremental HTML output. + +Improved `yri` support to perform lookups on installed Gems (0.5.0) +------------------------------------------------------------------- + +The `yri` executable can now perform lookups on gems that have been parsed +by yard. Therefore, to use this command you must first parse all gems with +YARD. To parse all gems, use the following command: + + $ sudo yardoc --build-gems + +The above command builds a .yardoc file for all installed gems in the +respective gem directory. If you do not have write access to the gem path, +YARD will write the yardoc file to `~/.yard/gem_index/NAME-VERSION.yardoc`. + +Note: you can also use `--re-build-gems` to force re-parsing of all gems. + +You can now do lookups with yri: + + $ yri JSON + +All lookups are cached to `~/.yard/yri_cache` for quicker lookups the second +time onward. + +Added `yardoc --default-return` and `yardoc --hide-void-return` (0.5.0) +----------------------------------------------------------------------- + +YARD defaults to displaying (Object) as the default return type of any +method that has not declared a @return tag. To customize the default +return type, you can specify: + + $ yardoc --default-return 'MyDefaultType' + +You can also use the empty string to list no return type. + +In addition, you can use --hide-void-return to ignore any method that +defines itself as a void type by: `@return [void]` + +Multiple syntax highlighting language support (0.5.0) +----------------------------------------------------- + +YARD now supports the ability to specify a language type for code blocks in +docstrings. Although no actual highlighting support is added for any language +but Ruby, you can add your own support by writing your own helper method: + + # Where LANGNAME is the language: + def html_syntax_highlight_LANGNAME(source) + # return highlighted HTML + end + +To use this language in code blocks, prefix the block with `!!!LANGNAME`: + + !!!plain + !!!python + def python_code(self): + return self + +By the same token. you can now use `!!!plain` to ignore highlighting for +a specific code block. + +New .yardoc format (0.5.0) +-------------------------- + +To make the above yri support possible, the .yardoc format was redesigned +to be a directory instead of a file. YARD can still load old .yardoc files, +but they will be automatically upgraded if re-saved. The new .yardoc format +does have a larger memory footprint, but this will hopefully be optimized +downward. + +Support for yard-doc-* gem packages as hosted .yardoc dbs (0.5.1) +----------------------------------------------------------------- + +You can now install special YARD plugin gems titled yard-doc-NAME to get +packaged a .yardoc database. This will enable yri lookups or building docs +for the gem without the code. + +One main use for this is the `yard-doc-core` package, which enabled yri +support for Ruby core classes (stdlib coming soon as `yard-doc-stdlib`). +To install it, simply: + + $ sudo gem install yard-doc-core + # now you can use: + $ yri String + +This will by default install the 1.9.1 core library. To install a library +for a specific version of Ruby, use the `--version` switch on gem: + + $ sudo gem install --version '= 1.8.6' yard-doc-core + +Support for extra search paths in `yri` (0.5.1) +----------------------------------------------- + +You can now add custom paths to non-gem .yardoc files +by adding them as newline separated paths in `~/.yard/yri_search_paths`. + +Generating HTML docs now adds frames view (0.5.3) +------------------------------------------------- + +`yardoc` will now create a `frames.html` file when generating HTML documents +which allows the user to view documentation inside frames, for those users who +still find frames beneficial. + +Tree view for class list (0.5.3) +-------------------------------- + +The class list now displays as an expandable tree view to better organized an +otherwise cluttered namespace. If you properly namespace your less important +classes (like Rails timezone classes), they will not take up space in the +class list unless the user looks for them. + +Ability to specify markup format of extra files (0.5.3) +------------------------------------------------------- + +You can now specify the markup format of an extra file (like README) at the +top of the file with a shebang-like line: + + #!textile + contents here + +The above file contents will be rendered with a textile markup engine +(eg. RedCloth). + +Keyboard shortcuts for default HTML template (0.5.4) +---------------------------------------------------- + +You can now access the "Class List", "Method List" and "File List" with the +'c', 'm' and 'f' keyboard shortcuts in the default HTML template, allowing +for keyboard-only navigation around YARD documentation. + +API for registering custom parsers (0.5.6) +------------------------------------------ + +You can now register parsers for custom source languages by calling the +following method: + + SourceParser.register_parser_type(:java, MyJavaParser, 'java') + +The parser class MyJavaParser should be a subclass of {YARD::Parser::Base}, +and the last argument is a set of extensions (string, array or regexp). You +can read more about registering parsers at the {YARD::Parser::SourceParser} +class documentation. + + +What's New in 0.4.x? +==================== + +1. **New templating engine and templates** +2. **yardoc `--query` argument** +3. **Greatly expanded API documentation** +4. **New plugin support** +5. **New tags (@abstract, @private)** +6. **Default rake task is now `rake yard`** + +New templating engine and templates +----------------------------------- + +The templates were redesigned, most notably removing the ugly frameset, adding +search to the class/method lists, simplifying the layout and making things +generally prettier. You should also notice that more tags are now visible in +the templates such as @todo, the new @abstract and @note tags and some others +that existed but were previously omitted from the generated documentation. + +There is also a new templating engine (based on the tadpole templating library) +to allow for much more user customization. You can read about it in +{file:docs/Templates.md}. + +yardoc `--query` argument +------------------------- + +The yardoc command-line tool now supports queries to select which classes, +modules or methods to include in documentation based on their data or meta-data. +For instance, you can now generate documentation for your "public" API only by +adding "@api public" to each of your public API methods/classes and using +the following argument: + + --query '@api.text == "public"' + +More information on queries is in the {file:README.md}. + +Greatly expanded API documentation +---------------------------------- + +Last release focused on many how-to and architecture documents to explain +the design of YARD, but many of the actual API classes/methods were still +left undocumented. This release marks a focus on getting YARD's own documentation +up to par so that it can serve as an official reference on the recommended +conventions to use when documenting code. + +New plugin support +------------------ + +YARD now supports loading of plugins via RubyGems. Any gem named `yard-*` or +`yard_*` will now be loaded when YARD starts up. Note that the '-' separator +is the recommended naming scheme. + +To ignore plugins, add the gem names to `~/.yard/ignored_plugins` on separate +lines (or separated by whitespace). + +New tags (@abstract, @private) +------------------------------ + +Two new tags were added to the list of builtin meta-tags in YARD. `@abstract` +marks a class/module/method as abstract while `@private` marks an object +as "private". The latter tag is used in situations where an object is public +due to Ruby's own visibility limitations (constants, classes and modules +can never be private) but not actually part of your public API. You should +use this tag sparingly, as it is not meant to be an equivalent to RDoc's +`:nodoc:` tag. Remember, YARD recommends documenting private objects too. +This tag exists so that you can create a query (`--query !@private`) to +ignore all of these private objects in your documentation. You can also +use the new `--no-private` switch, which is a shortcut to the aforementioned +query. You can read more about the new tags in the {file:docs/GettingStarted.md} +guide. + +Default rake task is now `rake yard` +------------------------------------ + +Not a big change, but anyone using the default "rake yardoc" task should +update their scripts: + +[http://github.com/lsegal/yard/commit/ad38a68dd73898b06bd5d0a1912b7d815878fae0](http://github.com/lsegal/yard/commit/ad38a68dd73898b06bd5d0a1912b7d815878fae0) + + +What's New in 0.2.3.x? +====================== + +1. **Full Ruby 1.9 support** +2. **New parser code and handler API for 1.9** +3. **A new `@overload` tag** +4. **Better documentation** +5. **Template changes and bug fixes** + +Full Ruby 1.9 support +--------------------- + +YARD's development actually focuses primarily on 1.9 from the get-go, so it is +not an afterthought. All features are first implemented for compatibility with +1.9, but of course all functionality is also tested in 1.8.x. YARD 0.2.2 was +mostly compatible with 1.9, but the new release improves and extends in certain +areas where compatibility was lacking. The new release should be fully functional +in Ruby 1.9. + +New parser code and handler API for 1.9 +--------------------------------------- + +Using Ruby 1.9 also gives YARD the advantage of using the new `ripper` library +which was added to stdlib. The ripper parser is Ruby's official answer to +projects like ParseTree and ruby2ruby. Ripper allows access to the AST as it +is parsed by the Ruby compiler. This has some large benefits over alternative +projects: + + 1. It is officially supported and maintained by the Ruby core team. + 2. The AST is generated directly from the exact same code that drives the + compiler, meaning anything that compiles is guaranteed to generate the + equivalent AST. + 3. It needs no hacks, gems or extra libs and works out of the box in 1.9. + 4. It's *fast*. + +Having the AST means that developers looking to extend YARD have much better +access to the parsed code than in previous versions. The only caveat is that +this library is not back-compatible to 1.8.x. Because of this, there are +subtle changes to the handler extension API that developers use to extend YARD. +Namely, there is now a standard API for 1.9 and a "legacy" API that can run in +both 1.8.x and 1.9 if needed. A developer can still use the legacy API to write +handlers that are compatible for both 1.8.x and 1.9 in one shot, or decide to +implement the handler using both APIs. Realize that the benefit of using the new +API means 1.9 users will get a 2.5x parsing speed increase over running the legacy +handlers (this is *in addition to* the ~1.8x speed increase of using YARV over MRI). + +A new `@overload` tag +--------------------- + +The new `@overload` tag enables users to document methods that take multiple +parameters depending on context. This is basically equivalent to RDoc's call-seq, +but with a name that is more akin to the OOP concept of method overloading +that is actually being employed. Here's an example: + + # @overload def to_html(html, autolink = true) + # This docstring describes the specific overload only. + # @param [String] html the HTML + # @param [Boolean] autolink whether or not to atuomatically link + # URL references + # @overload def to_html(html, opts = {}) + # @param [String] html the HTML + # @param [Hash] opts any attributes to add to the root HTML node + def to_html(*args) + # split args depending on context + end + +As you can see each overload takes its own nested tags (including a docstring) +as if it were its own method. This allows "virtual" overloading behaviour at +the API level to make Ruby look like overload-aware languages without caring +about the implementation details required to add the behaviour. + +It is still recommended practice, however, to stay away from overloading when +possible and document the types of each method's real parameters. This allows +toolkits making use of YARD to get accurate type information for your methods, +for instance, allowing IDE autocompletion. There are, of course, situations +where overload just makes more sense. + +Better documentation +-------------------- + +The first few iterations of YARD were very much a proof of concept. Few people +were paying attention and it was really just pieced together to see what was +feasible. Now that YARD is gaining interest, there are many developers that +want to take advantage of its extensibility support to do some really cool stuff. +Considerable time was spent for this release documenting, at a high level, what +YARD can do and how it can be done. Expect this documentation to be extended and +improved in future releases. + +Template changes and bug fixes +------------------------------ + +Of course no new release would be complete without fixing the old broken code. +Some tags existed but were not present in generated documentation. The templates +were mostly fixed to add the major omitted tags. In addition to template adjustments, +many parsing bugs were ironed out to make YARD much more stable with existing projects +(Rails, HAML, Sinatra, Ramaze, etc.). diff --git a/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/docs/images/code-objects-class-diagram.png b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/docs/images/code-objects-class-diagram.png new file mode 100644 index 000000000..055ebb550 Binary files /dev/null and b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/docs/images/code-objects-class-diagram.png differ diff --git a/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/docs/images/handlers-class-diagram.png b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/docs/images/handlers-class-diagram.png new file mode 100644 index 000000000..7a834fd46 Binary files /dev/null and b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/docs/images/handlers-class-diagram.png differ diff --git a/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/docs/images/overview-class-diagram.png b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/docs/images/overview-class-diagram.png new file mode 100644 index 000000000..4cd20b406 Binary files /dev/null and b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/docs/images/overview-class-diagram.png differ diff --git a/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/docs/images/parser-class-diagram.png b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/docs/images/parser-class-diagram.png new file mode 100644 index 000000000..d59173790 Binary files /dev/null and b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/docs/images/parser-class-diagram.png differ diff --git a/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/docs/images/tags-class-diagram.png b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/docs/images/tags-class-diagram.png new file mode 100644 index 000000000..c1a019e91 Binary files /dev/null and b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/docs/images/tags-class-diagram.png differ diff --git a/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/docs/templates/default/fulldoc/html/full_list_tag.erb b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/docs/templates/default/fulldoc/html/full_list_tag.erb new file mode 100644 index 000000000..51a88bee2 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/docs/templates/default/fulldoc/html/full_list_tag.erb @@ -0,0 +1,9 @@ +<% even_odd = 'odd' %> +<% collect_tags.each do |tag| %> +
  • +
    + <%= tag_link(tag) %> +
    +
  • + <% even_odd = (even_odd == 'even' ? 'odd' : 'even') %> +<% end %> \ No newline at end of file diff --git a/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/docs/templates/default/fulldoc/html/setup.rb b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/docs/templates/default/fulldoc/html/setup.rb new file mode 100644 index 000000000..fafa88e9b --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/docs/templates/default/fulldoc/html/setup.rb @@ -0,0 +1,6 @@ +# frozen_string_literal: true +def generate_tag_list + @list_title = "Tag List" + @list_type = "tag" + asset('tag_list.html', erb(:full_list)) +end diff --git a/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/docs/templates/default/layout/html/setup.rb b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/docs/templates/default/layout/html/setup.rb new file mode 100644 index 000000000..453e7f009 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/docs/templates/default/layout/html/setup.rb @@ -0,0 +1,9 @@ +# frozen_string_literal: true +def init + super + sections.place(:tag_list).after_any(:files) +end + +def menu_lists + super + [{:type => 'tag', :title => 'Tags', :search_title => 'Tag List'}] +end diff --git a/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/docs/templates/default/layout/html/tag_list.erb b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/docs/templates/default/layout/html/tag_list.erb new file mode 100644 index 000000000..4c95fff16 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/docs/templates/default/layout/html/tag_list.erb @@ -0,0 +1,11 @@ +

    Tag Listing

    +

    The following are a brief list of tags that can be used in YARD formatted + documentation. See <%= link_file "docs/Tags.md" %> for information on using tags.

    +
      +<% n = 1 %> +<% collect_tags.each do |tag| %> +
    • <%= tag_link(tag) %>
    • + <% n = n == 2 ? 1 : 2 %> +<% end %> +
    +
    diff --git a/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/docs/templates/default/yard_tags/html/list.erb b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/docs/templates/default/yard_tags/html/list.erb new file mode 100644 index 000000000..d5a8dab1b --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/docs/templates/default/yard_tags/html/list.erb @@ -0,0 +1,18 @@ +<% [["Tag", all_tags], ["Directive", all_directives]].each do |(name, list)| %> +

    <%= name %> List

    + +<% list.each_with_index do |tag, i| %> +
    +

    + <%= tag_signature tag %> +

    + <% if name == "Directive" %> + <%= yieldall :object => P("YARD::Tags::#{tag.text}") %> + <% else %> + <%= yieldall :object => tag.object %> + <% end %> +
    +<% end %> + +<% end%> diff --git a/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/docs/templates/default/yard_tags/html/setup.rb b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/docs/templates/default/yard_tags/html/setup.rb new file mode 100644 index 000000000..0c2c83b9d --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/docs/templates/default/yard_tags/html/setup.rb @@ -0,0 +1,26 @@ +# frozen_string_literal: true +def init + sections :list, [T('docstring')] +end + +def tag_signature(tag) + types = tag.types || [] + signature = "#{tag_link_name(tag)} " + sig_tag = tag.object.tag('yard.signature') + extra = sig_tag.text if sig_tag + extra ||= case types.first + when 'with_name' + "name description" + when 'with_types' + "[Types] description" + when 'with_types_and_name' + "name [Types] description" + when 'with_title_and_text' + "title\ndescription" + when 'with_types_and_title' + "[Types] title\ndescription" + else + "description" + end + signature + h(extra).gsub(/\n/, "
       ") +end diff --git a/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/docs/templates/plugin.rb b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/docs/templates/plugin.rb new file mode 100644 index 000000000..f26893521 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/docs/templates/plugin.rb @@ -0,0 +1,70 @@ +# frozen_string_literal: true +include YARD +include Templates + +module TagTemplateHelper + def all_tags + Registry.all(:method).map {|m| m.tag('yard.tag') }.compact + end + + def all_directives + Registry.all(:method).map {|m| m.tag('yard.directive') }.compact + end + + def collect_tags + (all_tags + all_directives).sort_by(&:name) + end + + def tag_link(tag) + link_file("docs/Tags.md", tag_link_name(tag), tag.name) + end + + def tag_link_name(tag) + prefix = tag.tag_name == 'yard.directive' ? '@!' : '@' + h(prefix + tag.name) + end + + # Wrap url_for and url_for_file to rewrite object when generating docs for + # yard.tag/directive objects. + %w(url_for url_for_file).each do |meth| + self.class.send(:define_method, meth) do + if object.is_a?(CodeObjects::Base) && + (object.tag('yard.tag') || object.tag('yard.directive') || + (object.type == :class && object.superclass.name == :Directive)) + obj = object + self.object = Registry.root + url = super + self.object = obj + url + else + super + end + end + end + + def linkify(*args) + if args.first.is_a?(String) + case args.first + when "yard:include_tags" + return T('yard_tags').run(options) + when /^tag:(\S+)/ + tag_name = $1 + suffix = "tag" + if tag_name =~ /^!/ + tag_name = tag_name[1..-1] + suffix = "directive" + end + + obj = Registry.at("YARD::Tags::Library##{tag_name}_#{suffix}") + return tag_link(obj.tag("yard.#{suffix}")) if obj + + log.warn "Cannot find tag: #{args.first}" + return args.first + end + end + super + end +end + +Template.extra_includes << TagTemplateHelper +Engine.register_template_path(File.dirname(__FILE__)) diff --git a/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/rubygems_plugin.rb b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/rubygems_plugin.rb new file mode 100644 index 000000000..d0b59bf37 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/rubygems_plugin.rb @@ -0,0 +1,9 @@ +# frozen_string_literal: true +if defined?(Gem::VERSION) && Gem::VERSION >= "2.0." + require File.expand_path(File.dirname(__FILE__) + '/yard/rubygems/hook') +else + unless defined?(Gem::DocManager.load_yardoc) + require File.expand_path(File.dirname(__FILE__) + '/yard/rubygems/specification') + require File.expand_path(File.dirname(__FILE__) + '/yard/rubygems/doc_manager') + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard.rb b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard.rb new file mode 100644 index 000000000..6afd7a0a9 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard.rb @@ -0,0 +1,72 @@ +# frozen_string_literal: true +module YARD + # The root path for YARD source libraries + ROOT = File.expand_path(File.dirname(__FILE__)) + + require File.join(YARD::ROOT, 'yard', 'version') + require File.join(YARD::ROOT, 'yard', 'autoload') + + # The root path for YARD builtin templates + TEMPLATE_ROOT = File.join(ROOT, '..', 'templates') + + # @deprecated Use {Config::CONFIG_DIR} + CONFIG_DIR = Config::CONFIG_DIR + + # An alias to {Parser::SourceParser}'s parsing method + # + # @example Parse a glob of files + # YARD.parse('lib/**/*.rb') + # @see Parser::SourceParser.parse + def self.parse(*args) Parser::SourceParser.parse(*args) end + + # An alias to {Parser::SourceParser}'s parsing method + # + # @example Parse a string of input + # YARD.parse_string('class Foo; end') + # @see Parser::SourceParser.parse_string + def self.parse_string(*args) Parser::SourceParser.parse_string(*args) end + + # (see YARD::Config.load_plugins) + # @deprecated Use {Config.load_plugins} + def self.load_plugins; YARD::Config.load_plugins end + + # @return [Boolean] whether YARD is being run inside of Windows + def self.windows? + return @windows if defined? @windows + require 'rbconfig' + @windows = + ::RbConfig::CONFIG['host_os'] =~ /mingw|win32|cygwin/ ? true : false + ensure + @windows ||= false + end + + # @return [Boolean] whether YARD is being run in Ruby 1.8 mode + def self.ruby18?; !ruby19? end + + # @return [Boolean] whether YARD is being run in Ruby 1.9 mode + def self.ruby19?; @ruby19 ||= (RUBY_VERSION >= "1.9.1") end + + # @return [Boolean] whether YARD is being run in Ruby 2.0 + def self.ruby2?; @ruby2 ||= (RUBY_VERSION >= '2.0.0') end + + # @return [Boolean] whether YARD is being run in Ruby 3.0 + def self.ruby3?; @ruby3 ||= (RUBY_VERSION >= '3.0.0') end +end + +# Keep track of Ruby version for compatibility code +# @deprecated Use {YARD.ruby18?} or {YARD.ruby19?} instead. +RUBY18 = YARD.ruby18? +RUBY19 = YARD.ruby19? + +# Load Ruby core extension classes +Dir.glob(File.join(YARD::ROOT, 'yard', 'core_ext', '*.rb')).each do |file| + require file +end + +# Backport RubyGems SourceIndex and other classes +require File.join(YARD::ROOT, 'yard', 'rubygems', 'backports') + +require File.join(YARD::ROOT, 'yard', 'globals') + +# Load YARD configuration options (and plugins) +YARD::Config.load diff --git a/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/autoload.rb b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/autoload.rb new file mode 100644 index 000000000..d00371c64 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/autoload.rb @@ -0,0 +1,308 @@ +# frozen_string_literal: true +# @private +def __p(path) File.join(YARD::ROOT, 'yard', *path.split('/')); end + +module YARD + module CLI # Namespace for command-line interface components + autoload :Command, __p('cli/command') + autoload :CommandParser, __p('cli/command_parser') + autoload :Config, __p('cli/config') + autoload :Diff, __p('cli/diff') + autoload :Display, __p('cli/display') + autoload :Gems, __p('cli/gems') + autoload :Graph, __p('cli/graph') + autoload :Help, __p('cli/help') + autoload :List, __p('cli/list') + autoload :MarkupTypes, __p('cli/markup_types') + autoload :Server, __p('cli/server') + autoload :Stats, __p('cli/stats') + autoload :Yardoc, __p('cli/yardoc') + autoload :YardoptsCommand, __p('cli/yardopts_command') + autoload :YRI, __p('cli/yri') + autoload :I18n, __p('cli/i18n') + end + + # A "code object" is defined as any entity in the Ruby language. + # Classes, modules, methods, class variables and constants are the + # major objects, but DSL languages can create their own by inheriting + # from {CodeObjects::Base}. + module CodeObjects + autoload :Base, __p('code_objects/base') + autoload :CodeObjectList, __p('code_objects/base') + autoload :ClassObject, __p('code_objects/class_object') + autoload :ClassVariableObject, __p('code_objects/class_variable_object') + autoload :ConstantObject, __p('code_objects/constant_object') + autoload :ExtendedMethodObject, __p('code_objects/extended_method_object') + autoload :ExtraFileObject, __p('code_objects/extra_file_object') + autoload :MacroObject, __p('code_objects/macro_object') + autoload :MethodObject, __p('code_objects/method_object') + autoload :ModuleObject, __p('code_objects/module_object') + autoload :NamespaceMapper, __p('code_objects/namespace_mapper') + autoload :NamespaceObject, __p('code_objects/namespace_object') + autoload :Proxy, __p('code_objects/proxy') + autoload :ProxyMethodError, __p('code_objects/proxy') + autoload :RootObject, __p('code_objects/root_object') + + autoload :BUILTIN_ALL, __p('code_objects/base') + autoload :BUILTIN_CLASSES, __p('code_objects/base') + autoload :BUILTIN_MODULES, __p('code_objects/base') + autoload :BUILTIN_EXCEPTIONS, __p('code_objects/base') + autoload :CONSTANTMATCH, __p('code_objects/base') + autoload :CONSTANTSTART, __p('code_objects/base') + autoload :METHODMATCH, __p('code_objects/base') + autoload :METHODNAMEMATCH, __p('code_objects/base') + autoload :NAMESPACEMATCH, __p('code_objects/base') + autoload :NSEP, __p('code_objects/base') + autoload :NSEPQ, __p('code_objects/base') + autoload :ISEP, __p('code_objects/base') + autoload :ISEPQ, __p('code_objects/base') + autoload :CSEP, __p('code_objects/base') + autoload :CSEPQ, __p('code_objects/base') + end + + # Handlers are called during the data processing part of YARD's + # parsing phase. This allows YARD as well as any custom extension to + # analyze source and generate {CodeObjects} to be stored for later use. + module Handlers + # Shared logic between C and Ruby handlers. + module Common + autoload :MethodHandler, __p('handlers/common/method_handler') + end + + # CRuby Handlers + # @since 0.8.0 + module C + autoload :Base, __p('handlers/c/base') + + autoload :AliasHandler, __p('handlers/c/alias_handler') + autoload :AttributeHandler, __p('handlers/c/attribute_handler') + autoload :ClassHandler, __p('handlers/c/class_handler') + autoload :ConstantHandler, __p('handlers/c/constant_handler') + autoload :HandlerMethods, __p('handlers/c/handler_methods') + autoload :InitHandler, __p('handlers/c/init_handler') + autoload :MethodHandler, __p('handlers/c/method_handler') + autoload :MixinHandler, __p('handlers/c/mixin_handler') + autoload :ModuleHandler, __p('handlers/c/module_handler') + autoload :OverrideCommentHandler, __p('handlers/c/override_comment_handler') + autoload :PathHandler, __p('handlers/c/path_handler') + autoload :StructHandler, __p('handlers/c/struct_handler') + autoload :SymbolHandler, __p('handlers/c/symbol_handler') + end + + module Ruby # All Ruby handlers + module Legacy # Handlers for old Ruby 1.8 parser + autoload :Base, __p('handlers/ruby/legacy/base') + + autoload :AliasHandler, __p('handlers/ruby/legacy/alias_handler') + autoload :AttributeHandler, __p('handlers/ruby/legacy/attribute_handler') + autoload :ClassHandler, __p('handlers/ruby/legacy/class_handler') + autoload :ClassConditionHandler, __p('handlers/ruby/legacy/class_condition_handler') + autoload :ClassVariableHandler, __p('handlers/ruby/legacy/class_variable_handler') + autoload :CommentHandler, __p('handlers/ruby/legacy/comment_handler') + autoload :ConstantHandler, __p('handlers/ruby/legacy/constant_handler') + autoload :DSLHandler, __p('handlers/ruby/legacy/dsl_handler') + autoload :ExceptionHandler, __p('handlers/ruby/legacy/exception_handler') + autoload :ExtendHandler, __p('handlers/ruby/legacy/extend_handler') + autoload :MethodHandler, __p('handlers/ruby/legacy/method_handler') + autoload :MixinHandler, __p('handlers/ruby/legacy/mixin_handler') + autoload :ModuleHandler, __p('handlers/ruby/legacy/module_handler') + autoload :ModuleFunctionHandler, __p('handlers/ruby/legacy/module_function_handler') + autoload :PrivateClassMethodHandler, __p('handlers/ruby/legacy/private_class_method_handler') + autoload :PrivateConstantHandler, __p('handlers/ruby/legacy/private_constant_handler') + autoload :VisibilityHandler, __p('handlers/ruby/legacy/visibility_handler') + autoload :YieldHandler, __p('handlers/ruby/legacy/yield_handler') + end + + autoload :Base, __p('handlers/ruby/base') + + autoload :AliasHandler, __p('handlers/ruby/alias_handler') + autoload :AttributeHandler, __p('handlers/ruby/attribute_handler') + autoload :ClassHandler, __p('handlers/ruby/class_handler') + autoload :ClassConditionHandler, __p('handlers/ruby/class_condition_handler') + autoload :ClassVariableHandler, __p('handlers/ruby/class_variable_handler') + autoload :CommentHandler, __p('handlers/ruby/comment_handler') + autoload :ConstantHandler, __p('handlers/ruby/constant_handler') + autoload :DecoratorHandlerMethods, __p('handlers/ruby/decorator_handler_methods') + autoload :DSLHandler, __p('handlers/ruby/dsl_handler') + autoload :DSLHandlerMethods, __p('handlers/ruby/dsl_handler_methods') + autoload :ExceptionHandler, __p('handlers/ruby/exception_handler') + autoload :ExtendHandler, __p('handlers/ruby/extend_handler') + autoload :MethodHandler, __p('handlers/ruby/method_handler') + autoload :MethodConditionHandler, __p('handlers/ruby/method_condition_handler') + autoload :MixinHandler, __p('handlers/ruby/mixin_handler') + autoload :ModuleHandler, __p('handlers/ruby/module_handler') + autoload :ModuleFunctionHandler, __p('handlers/ruby/module_function_handler') + autoload :PrivateClassMethodHandler, __p('handlers/ruby/private_class_method_handler') + autoload :PrivateConstantHandler, __p('handlers/ruby/private_constant_handler') + autoload :PublicClassMethodHandler, __p('handlers/ruby/public_class_method_handler') + autoload :StructHandlerMethods, __p('handlers/ruby/struct_handler_methods') + autoload :VisibilityHandler, __p('handlers/ruby/visibility_handler') + autoload :YieldHandler, __p('handlers/ruby/yield_handler') + end + + autoload :Base, __p('handlers/base') + autoload :HandlerAborted, __p('handlers/base') + autoload :NamespaceMissingError, __p('handlers/base') + autoload :Processor, __p('handlers/processor') + end + + # Namespace for internationalization (i18n) + # @since 0.8.0 + module I18n + autoload :Locale, __p('i18n/locale') + autoload :Message, __p('i18n/message') + autoload :Messages, __p('i18n/messages') + autoload :PotGenerator, __p('i18n/pot_generator') + autoload :Text, __p('i18n/text') + end + + # The parser namespace holds all parsing engines used by YARD. + # Currently only Ruby and C (Ruby) parsers are implemented. + module Parser + module C # CRuby Parsing components + autoload :BodyStatement, __p('parser/c/statement') + autoload :Comment, __p('parser/c/statement') + autoload :CommentParser, __p('parser/c/comment_parser') + autoload :CParser, __p('parser/c/c_parser') + autoload :Statement, __p('parser/c/statement') + autoload :ToplevelStatement, __p('parser/c/statement') + end + + module Ruby # Ruby parsing components. + module Legacy # Handles Ruby parsing in Ruby 1.8. + autoload :RipperParser, __p('parser/ruby/legacy/ruby_parser') + autoload :RubyParser, __p('parser/ruby/legacy/ruby_parser') + autoload :RubyToken, __p('parser/ruby/legacy/ruby_lex') + autoload :Statement, __p('parser/ruby/legacy/statement') + autoload :StatementList, __p('parser/ruby/legacy/statement_list') + autoload :TokenList, __p('parser/ruby/legacy/token_list') + end + + autoload :AstNode, __p('parser/ruby/ast_node') + autoload :RubyParser, __p('parser/ruby/ruby_parser') + autoload :TokenResolver, __p('parser/ruby/token_resolver') + end + + autoload :Base, __p('parser/base') + autoload :ParserSyntaxError, __p('parser/source_parser') + autoload :SourceParser, __p('parser/source_parser') + autoload :UndocumentableError, __p('parser/source_parser') + end + + module Rake # Holds Rake tasks used by YARD + autoload :YardocTask, __p('rake/yardoc_task') + end + + module Serializers # Namespace for components that serialize to various endpoints + autoload :Base, __p('serializers/base') + autoload :FileSystemSerializer, __p('serializers/file_system_serializer') + autoload :ProcessSerializer, __p('serializers/process_serializer') + autoload :StdoutSerializer, __p('serializers/stdout_serializer') + autoload :YardocSerializer, __p('serializers/yardoc_serializer') + end + + # Namespace for classes and modules that handle serving documentation over HTTP + # + # == Implementing a Custom Server + # To customize the YARD server, see the {Adapter} and {Router} classes. + # + # == Rack Middleware + # If you want to use the YARD server as a Rack middleware, see the documentation + # in {RackMiddleware}. + # + # @since 0.6.0 + module Server + require __p('server') + + # Commands implement specific kinds of server responses which are routed + # to by the {Router} class. To implement a custom command, subclass {Commands::Base}. + module Commands + autoload :Base, __p('server/commands/base') + autoload :DisplayFileCommand, __p('server/commands/display_file_command') + autoload :DisplayObjectCommand, __p('server/commands/display_object_command') + autoload :FramesCommand, __p('server/commands/frames_command') + autoload :ListCommand, __p('server/commands/list_command') + autoload :LibraryCommand, __p('server/commands/library_command') + autoload :LibraryIndexCommand, __p('server/commands/library_index_command') + autoload :RootRequestCommand, __p('server/commands/root_request_command') + autoload :SearchCommand, __p('server/commands/search_command') + autoload :StaticFileCommand, __p('server/commands/static_file_command') + autoload :StaticFileHelpers, __p('server/commands/static_file_helpers') + end + + autoload :Adapter, __p('server/adapter') + autoload :DocServerSerializer, __p('server/doc_server_serializer') + autoload :DocServerHelper, __p('server/doc_server_helper') + autoload :FinishRequest, __p('server/adapter') + autoload :LibraryVersion, __p('server/library_version') + autoload :NotFoundError, __p('server/adapter') + autoload :RackAdapter, __p('server/rack_adapter') + autoload :RackMiddleware, __p('server/rack_adapter') + autoload :Router, __p('server/router') + autoload :StaticCaching, __p('server/static_caching') + autoload :WebrickAdapter, __p('server/webrick_adapter') + autoload :WebrickServlet, __p('server/webrick_adapter') + end + + module Tags # Namespace for Tag components + autoload :AttributeDirective, __p('tags/directives') + autoload :DefaultFactory, __p('tags/default_factory') + autoload :DefaultTag, __p('tags/default_tag') + autoload :Directive, __p('tags/directives') + autoload :EndGroupDirective, __p('tags/directives') + autoload :GroupDirective, __p('tags/directives') + autoload :Library, __p('tags/library') + autoload :MacroDirective, __p('tags/directives') + autoload :MethodDirective, __p('tags/directives') + autoload :OptionTag, __p('tags/option_tag') + autoload :OverloadTag, __p('tags/overload_tag') + autoload :ParseDirective, __p('tags/directives') + autoload :RefTag, __p('tags/ref_tag') + autoload :RefTagList, __p('tags/ref_tag_list') + autoload :ScopeDirective, __p('tags/directives') + autoload :Tag, __p('tags/tag') + autoload :TagFormatError, __p('tags/tag_format_error') + autoload :TypesExplainer, __p('tags/types_explainer') + autoload :VisibilityDirective, __p('tags/directives') + end + + # Namespace for templating system + module Templates + module Helpers # Namespace for template helpers + module Markup # Namespace for markup providers + autoload :RDocMarkup, __p('templates/helpers/markup/rdoc_markup') + autoload :RDocMarkdown, __p('templates/helpers/markup/rdoc_markdown') + end + + autoload :BaseHelper, __p('templates/helpers/base_helper') + autoload :FilterHelper, __p('templates/helpers/filter_helper') + autoload :HtmlHelper, __p('templates/helpers/html_helper') + autoload :HtmlSyntaxHighlightHelper, __p('templates/helpers/html_syntax_highlight_helper') + autoload :MarkupHelper, __p('templates/helpers/markup_helper') + autoload :MethodHelper, __p('templates/helpers/method_helper') + autoload :ModuleHelper, __p('templates/helpers/module_helper') + autoload :TextHelper, __p('templates/helpers/text_helper') + autoload :UMLHelper, __p('templates/helpers/uml_helper') + end + + autoload :Engine, __p('templates/engine') + autoload :ErbCache, __p('templates/erb_cache') + autoload :Section, __p('templates/section') + autoload :Template, __p('templates/template') + autoload :TemplateOptions, __p('templates/template_options') + end + + autoload :Config, __p('config') + autoload :Docstring, __p('docstring') + autoload :DocstringParser, __p('docstring_parser') + autoload :GemIndex, __p('gem_index') + autoload :Logger, __p('logging') + autoload :Options, __p('options') + autoload :Registry, __p('registry') + autoload :RegistryResolver, __p('registry_resolver') + autoload :RegistryStore, __p('registry_store') + autoload :StubProxy, __p('serializers/yardoc_serializer') + autoload :Verifier, __p('verifier') +end + +undef __p diff --git a/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/cli/command.rb b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/cli/command.rb new file mode 100644 index 000000000..abd521abd --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/cli/command.rb @@ -0,0 +1,85 @@ +# frozen_string_literal: true +require 'optparse' + +module YARD + module CLI + # Abstract base class for CLI utilities. Provides some helper methods for + # the option parser + # + # @abstract + # @since 0.6.0 + class Command + # Helper method to run the utility on an instance. + # @see #run + def self.run(*args) new.run(*args) end + + def description; '' end + + protected + + # Adds a set of common options to the tail of the OptionParser + # + # @param [OptionParser] opts the option parser object + # @return [void] + def common_options(opts) + opts.separator "" + opts.separator "Other options:" + opts.on('-e', '--load FILE', 'A Ruby script to load before running command.') do |file| + load_script(file) + end + opts.on('--plugin PLUGIN', 'Load a YARD plugin (gem with `yard-\' prefix)') do |name| + # Not actually necessary to load here, this is done at boot in YARD::Config.load_plugins + # YARD::Config.load_plugin(name) + end + opts.on('--legacy', 'Use old style Ruby parser and handlers. ', + ' Always on in 1.8.x.') do + YARD::Parser::SourceParser.parser_type = :ruby18 + end + opts.on('--safe', 'Enable safe mode for this instance') do + # Parsed in YARD::Config.load + end + opts.on_tail('-q', '--quiet', 'Show no warnings.') { log.level = Logger::ERROR } + opts.on_tail('--verbose', 'Show more information.') { log.level = Logger::INFO } + opts.on_tail('--debug', 'Show debugging information.') { log.level = Logger::DEBUG } + opts.on_tail('--backtrace', 'Show stack traces') { log.show_backtraces = true } + opts.on_tail('-v', '--version', 'Show version.') { log.puts "yard #{YARD::VERSION}"; exit } + opts.on_tail('-h', '--help', 'Show this help.') { log.puts opts; exit } + end + + # Parses the option and gracefully handles invalid switches + # + # @param [OptionParser] opts the option parser object + # @param [Array] args the arguments passed from input. This + # array will be modified. + # @return [void] + def parse_options(opts, args) + opts.parse!(args) + rescue OptionParser::ParseError => err + unrecognized_option(err) + args.shift if args.first && args.first[0, 1] != '-' + retry + end + + # Loads a Ruby script. If Config.options[:safe_mode] is enabled, + # this method will do nothing. + # + # @param [String] file the path to the script to load + # @since 0.6.2 + def load_script(file) + return if YARD::Config.options[:safe_mode] + load(file) + rescue LoadError => load_exception + log.error "The file `#{file}' could not be loaded:\n#{load_exception}" + exit + end + + # Callback when an unrecognize option is parsed + # + # @param [OptionParser::ParseError] err the exception raised by the + # option parser + def unrecognized_option(err) + log.warn "Unrecognized/#{err.message}" + end + end + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/cli/command_parser.rb b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/cli/command_parser.rb new file mode 100644 index 000000000..1ffc4ec47 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/cli/command_parser.rb @@ -0,0 +1,93 @@ +# frozen_string_literal: true +module YARD + module CLI + # This class parses a command name out of the +yard+ CLI command and calls + # that command in the form: + # + # $ yard command_name [options] + # + # If no command or arguments are specified, or if the arguments immediately + # begin with a +--opt+ (not +--help+), the {default_command} will be used + # (which itself defaults to +:doc+). + # + # == Adding a Command + # + # To add a custom command via plugin, create a mapping in {commands} from + # the Symbolic command name to the {Command} class that implements the + # command. To implement a command, see the documentation for the {Command} + # class. + # + # @see Command + # @see commands + # @see default_command + class CommandParser + class << self + # @return [Hash{Symbol => Command}] the mapping of command names to + # command classes to parse the user command. + attr_accessor :commands + + # @return [Symbol] the default command name to use when no options + # are specified or + attr_accessor :default_command + end + + self.commands = SymbolHash[ + :config => Config, + :diff => Diff, + :display => Display, + :doc => Yardoc, + :gems => Gems, + :graph => Graph, + :help => Help, + :list => List, + :markups => MarkupTypes, + :ri => YRI, + :server => Server, + :stats => Stats, + :i18n => I18n + ] + + self.default_command = :doc + + # Convenience method to create a new CommandParser and call {#run} + # @return (see #run) + def self.run(*args) new.run(*args) end + + def initialize + log.show_backtraces = false + end + + # Runs the {Command} object matching the command name of the first + # argument. + # @return [void] + def run(*args) + unless args == ['--help'] + if args.empty? || args.first =~ /^-/ + command_name = self.class.default_command + else + command_name = args.first.to_sym + args.shift + end + if commands.key?(command_name) + return commands[command_name].run(*args) + end + end + list_commands + end + + private + + def commands; self.class.commands end + + def list_commands + log.puts "Usage: yard [options]" + log.puts + log.puts "Commands:" + commands.keys.sort_by(&:to_s).each do |command_name| + command = commands[command_name].new + log.puts "%-8s %s" % [command_name, command.description] + end + end + end + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/cli/config.rb b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/cli/config.rb new file mode 100644 index 000000000..0de2b2860 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/cli/config.rb @@ -0,0 +1,198 @@ +# frozen_string_literal: true +module YARD + module CLI + # CLI command to view or edit configuration options + # @since 0.6.2 + class Config < Command + # @return [Symbol, nil] the key to view/edit, if any + attr_accessor :key + + # @return [Array, nil] the list of values to set (or single value), if modifying + attr_accessor :values + + # @return [Boolean] whether to reset the {#key} + attr_accessor :reset + + # @return [Boolean] whether the value being set should be inside a list + attr_accessor :as_list + + # @return [Boolean] whether to append values to existing key + attr_accessor :append + + # @return [String, nil] command to use when configuring ~/.gemrc file. + # If the string is nil, configuration should not occur. + attr_accessor :gem_install_cmd + + def initialize + super + self.key = nil + self.values = [] + self.reset = false + self.append = false + self.as_list = false + self.gem_install_cmd = nil + end + + def description + 'Views or edits current global configuration' + end + + def run(*args) + optparse(*args) + if gem_install_cmd + configure_gemrc + elsif key + if reset || !values.empty? + modify_item + else + view_item + end + else + list_configuration + end + end + + private + + def configure_gemrc + return unless gem_install_cmd + + require 'rubygems' + + ['install', :install, 'gem', :gem].find do |cmd| + conf = Gem.configuration[cmd] || "" + next if conf.empty? && cmd != :gem + + conf = conf.split(/\s+/) + conf.delete_if {|c| c =~ /^--(no-)?document\b/ } # scrub doc args + conf |= ["--document=#{gem_install_cmd}"] + conf = conf.join(' ') + + Gem.configuration[cmd] = conf + Gem.configuration.write + log.puts "Updated #{Gem.configuration.path || '~/.gemrc'}: '#{cmd}: #{conf}'" + true + end + end + + def modify_item + if reset + log.debug "Resetting #{key}" + YARD::Config.options[key] = YARD::Config::DEFAULT_CONFIG_OPTIONS[key] + else + log.debug "Setting #{key} to #{values.inspect}" + items = encode_values + current_items = YARD::Config.options[key] + items = [current_items].flatten + [items].flatten if append + YARD::Config.options[key] = items + end + YARD::Config.save + end + + def view_item + log.debug "Viewing #{key}" + log.puts YARD::Config.options[key].inspect + end + + def list_configuration + log.debug "Listing configuration" + require 'yaml' + log.puts YAML.dump(YARD::Config.options).sub(/\A--.*\n/, '').gsub(/\n\n/, "\n") + end + + def encode_values + if values.size == 1 && !as_list + encode_value(values.first) + else + values.map {|v| encode_value(v) } + end + end + + def encode_value(value) + case value + when /^-?\d+/; value.to_i + when "true"; true + when "false"; false + else value + end + end + + def optparse(*args) + list = false + self.as_list = false + self.append = false + opts = OptionParser.new + opts.banner = "Usage: yard config [options] [item [value ...]]" + opts.separator "" + opts.separator "Example: yard config load_plugins true" + opts.separator "" + opts.separator "Views and sets configuration items. If an item is provided" + opts.separator "With no value, the item is viewed. If a value is provided," + opts.separator "the item is modified. Specifying no item is equivalent to --list." + opts.separator "If you specify multiple space delimited values, these are" + opts.separator "parsed as an array of values." + opts.separator "" + opts.separator "Note that `true` and `false` are reserved words." + opts.separator "" + opts.separator "---------------------------------------------------------" + opts.separator "" + opts.separator "Configuring RubyGems support:" + opts.separator "" + opts.separator "YARD can automatically generate the YRI index or HTML" + opts.separator "documentation in a `gem install` by adding the following" + opts.separator "to your ~/.gemrc file:" + opts.separator "" + opts.separator " gem: \"--document=yri\"" + opts.separator "" + opts.separator "Note: you can add 'yard' to also generate HTML docs." + opts.separator " You can also add 'ri' to continue generating RDoc." + opts.separator "" + opts.separator "You can also run the following command to configure this" + opts.separator "behavior automatically:" + opts.separator "" + opts.separator " $ yard config --gem-install-yri" + opts.separator "" + opts.separator "Add --gem-install-yard to also generate HTML." + opts.separator "" + opts.separator "---------------------------------------------------------" + opts.separator "" + opts.separator "General options:" + + opts.on('-l', '--list', 'List current configuration') do + list = true + end + opts.on('-r', '--reset', 'Resets the specific item to default') do + self.reset = true + end + + opts.separator "" + opts.separator "Modifying keys:" + + opts.on('-a', '--append', 'Appends items to existing key values') do + self.append = true + end + opts.on('--as-list', 'Forces the value(s) to be wrapped in an array') do + self.as_list = true + end + + opts.separator "" + opts.separator "Add RubyGems install hook:" + + opts.on('--gem-install-yri', 'Configures ~/.gemrc to run yri on a gem install') do + self.gem_install_cmd = 'yri' if gem_install_cmd != 'yard' + end + + opts.on('--gem-install-yard', 'Configures ~/.gemrc to run yard on a gem install') do + self.gem_install_cmd = 'yard' + end + + common_options(opts) + parse_options(opts, args) + args = [] if list + self.key = args.shift.to_sym if args.size >= 1 + self.values = args if args.size >= 1 + args + end + end + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/cli/diff.rb b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/cli/diff.rb new file mode 100644 index 000000000..e42697895 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/cli/diff.rb @@ -0,0 +1,273 @@ +# frozen_string_literal: true +require 'tmpdir' +require 'fileutils' +require 'open-uri' + +module YARD + module CLI + # CLI command to return the objects that were added/removed from 2 versions + # of a project (library, gem, working copy). + # @since 0.6.0 + class Diff < Command + def initialize + super + @list_all = false + @use_git = false + @compact = false + @modified = true + @verifier = Verifier.new + @old_git_commit = nil + @old_path = Dir.pwd + log.show_backtraces = true + end + + def description + 'Returns the object diff of two gems or .yardoc files' + end + + def run(*args) + registry = optparse(*args).map do |gemfile| + if @use_git + load_git_commit(gemfile) + all_objects + elsif load_gem_data(gemfile) + log.info "Found #{gemfile}" + all_objects + else + log.error "Cannot find gem #{gemfile}" + nil + end + end.compact + + return if registry.size != 2 + + first_object = nil + [["Added objects", "A", added_objects(*registry)], + ["Modified objects", "M", modified_objects(*registry)], + ["Removed objects", "D", removed_objects(*registry)]].each do |name, short, objects| + next if short == "M" && @modified == false + next if objects.empty? + last_object = nil + all_objects_notice = false + log.puts name + ":" unless @compact + objects.sort_by(&:path).each do |object| + if !@list_all && last_object && object.parent == last_object + log.print " (...)" unless all_objects_notice + all_objects_notice = true + next + elsif @compact + log.puts if first_object + else + log.puts + end + all_objects_notice = false + log.print "" + (@compact ? "#{short} " : " ") + + object.path + " (#{object.file}:#{object.line})" + last_object = object + first_object = true + end + unless @compact + log.puts; log.puts + end + end + log.puts if @compact + end + + private + + def all_objects + return Registry.all if @verifier.expressions.empty? + @verifier.run(Registry.all) + end + + def added_objects(registry1, registry2) + registry2.reject {|o| registry1.find {|o2| o2.path == o.path } } + end + + def modified_objects(registry1, registry2) + registry1.select do |obj| + case obj + when CodeObjects::MethodObject + registry2.find {|o| obj == o && o.source != obj.source } + when CodeObjects::ConstantObject + registry2.find {|o| obj == o && o.value != obj.value } + end + end.compact + end + + def removed_objects(registry1, registry2) + registry1.reject {|o| registry2.find {|o2| o2.path == o.path } } + end + + def load_git_commit(commit) + Registry.clear + commit_path = 'git_commit' + commit.gsub(/\W/, '_') + tmpdir = File.join(Dir.tmpdir, commit_path) + log.info "Expanding #{commit} to #{tmpdir}..." + Dir.chdir(@old_path) + FileUtils.mkdir_p(tmpdir) + FileUtils.cp_r('.', tmpdir) + Dir.chdir(tmpdir) + log.info("git says: " + `git reset --hard #{commit}`.chomp) + generate_yardoc(tmpdir) + ensure + Dir.chdir(@old_path) + cleanup(commit_path) + end + + def load_gem_data(gemfile) + require_rubygems + Registry.clear + + # First check for argument as .yardoc file + [File.join(gemfile, '.yardoc'), gemfile].each do |yardoc| + log.info "Searching for .yardoc db at #{yardoc}" + next unless File.directory?(yardoc) + Registry.load_yardoc(yardoc) + Registry.load_all + return true + end + + # Next check installed RubyGems + gemfile_without_ext = gemfile.sub(/\.gem$/, '') + log.info "Searching for installed gem #{gemfile_without_ext}" + YARD::GemIndex.each.find do |spec| + next unless spec.full_name == gemfile_without_ext + yardoc = Registry.yardoc_file_for_gem(spec.name, "= #{spec.version}") + if yardoc + Registry.load_yardoc(yardoc) + Registry.load_all + else + log.enter_level(Logger::ERROR) do + olddir = Dir.pwd + Gems.run(spec.name, spec.version.to_s) + Dir.chdir(olddir) + end + end + return true + end + + # Look for local .gem file + gemfile += '.gem' unless gemfile =~ /\.gem$/ + log.info "Searching for local gem file #{gemfile}" + if File.exist?(gemfile) + File.open(gemfile, 'rb') do |io| + expand_and_parse(gemfile, io) + end + return true + end + + # Remote gemfile from rubygems.org + url = "http://rubygems.org/downloads/#{gemfile}" + log.info "Searching for remote gem file #{url}" + begin + # Note: In Ruby 2.4.x, URI.open is a private method. After + # 2.5, URI.open behaves much like Kernel#open once you've + # required 'open-uri' + OpenURI.open_uri(url) {|io| expand_and_parse(gemfile, io) } + return true + rescue OpenURI::HTTPError + nil # noop + end + false + end + + def expand_and_parse(gemfile, io) + dir = expand_gem(gemfile, io) + generate_yardoc(dir) + cleanup(gemfile) + end + + def generate_yardoc(dir) + Dir.chdir(dir) do + log.enter_level(Logger::ERROR) { Yardoc.run('-n', '--no-save') } + end + end + + def expand_gem(gemfile, io) + tmpdir = File.join(Dir.tmpdir, gemfile) + FileUtils.mkdir_p(tmpdir) + log.info "Expanding #{gemfile} to #{tmpdir}..." + + if Gem::VERSION >= '2.0.0' + require 'rubygems/package/tar_reader' + reader = Gem::Package::TarReader.new(io) + reader.each do |pkg| + next unless pkg.full_name == 'data.tar.gz' + Zlib::GzipReader.wrap(pkg) do |gzio| + tar = Gem::Package::TarReader.new(gzio) + tar.each do |entry| + file = File.join(tmpdir, entry.full_name) + FileUtils.mkdir_p(File.dirname(file)) + File.open(file, 'wb') do |out| + out.write(entry.read) + begin + out.fsync + rescue NotImplementedError + nil # noop + end + end + end + end + break + end + else + Gem::Package.open(io) do |pkg| + pkg.each do |entry| + pkg.extract_entry(tmpdir, entry) + end + end + end + + tmpdir + end + + def require_rubygems + require 'rubygems' + require 'rubygems/package' + rescue LoadError => e + log.error "Missing RubyGems, cannot run this command." + raise(e) + end + + def cleanup(gemfile) + dir = File.join(Dir.tmpdir, gemfile) + log.info "Cleaning up #{dir}..." + FileUtils.rm_rf(dir) + end + + def optparse(*args) + opts = OptionParser.new + opts.banner = "Usage: yard diff [options] oldgem newgem" + opts.separator "" + opts.separator "Example: yard diff yard-0.5.6 yard-0.5.8" + opts.separator "" + opts.separator "If the files don't exist locally, they will be grabbed using the `gem fetch`" + opts.separator "command. If the gem is a .yardoc directory, it will be used. Finally, if the" + opts.separator "gem name matches an installed gem (full name-version syntax), that gem will be used." + + opts.on('-a', '--all', 'List all objects, even if they are inside added/removed module/class') do + @list_all = true + end + opts.on('--compact', 'Show compact results') { @compact = true } + opts.on('--git', 'Compare versions from two git commit/branches') do + @use_git = true + end + opts.on('--query QUERY', 'Only diff filtered objects') do |query| + @verifier.add_expressions(query) + end + opts.on('--no-modified', 'Ignore modified objects') do + @modified = false + end + common_options(opts) + parse_options(opts, args) + unless args.size == 2 + log.puts opts.banner + exit(0) + end + + args + end + end + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/cli/display.rb b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/cli/display.rb new file mode 100644 index 000000000..0295a660c --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/cli/display.rb @@ -0,0 +1,69 @@ +# frozen_string_literal: true +module YARD + module CLI + # Display one object + # @since 0.8.6 + class Display < Yardoc + def description; 'Displays a formatted object' end + + def initialize(*args) + super + options.format = :text # default for this command + @layout = nil + @objects = [] + end + + # Runs the commandline utility, parsing arguments and displaying an object + # from the {Registry}. + # + # @param [Array] args the list of arguments. + # @return [void] + def run(*args) + return unless parse_arguments(*args) + log.puts wrap_layout(format_objects) + end + + # @return [String] the output data for all formatted objects + def format_objects + @objects.inject([]) do |arr, obj| + arr.push obj.format(options) + end.join("\n") + end + + def wrap_layout(contents) + return contents unless @layout + opts = options.merge( + :contents => contents, + :object => @objects.first, + :objects => @objects + ) + args = [options.template, @layout, options.format] + Templates::Engine.template(*args).run(opts) + end + + # Parses commandline options. + # @param [Array] args each tokenized argument + def parse_arguments(*args) + opts = OptionParser.new + opts.banner = "Usage: yard display [options] OBJECT [OTHER OBJECTS]" + general_options(opts) + output_options(opts) + parse_options(opts, args) + + Registry.load + @objects = args.map {|o| Registry.at(o) } + + # validation + return false if @objects.any?(&:nil?) + verify_markup_options + end + + def output_options(opts) + super(opts) + opts.on('-l', '--layout [LAYOUT]', 'Wraps output in layout template (good for HTML)') do |layout| + @layout = layout || 'layout' + end + end + end + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/cli/gems.rb b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/cli/gems.rb new file mode 100644 index 000000000..a68e94297 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/cli/gems.rb @@ -0,0 +1,84 @@ +# frozen_string_literal: true +module YARD + module CLI + # @since 0.6.0 + class Gems < Command + def initialize + @rebuild = false + @gems = [] + end + + def description; "Builds YARD index for gems" end + + # Runs the commandline utility, parsing arguments and generating + # YARD indexes for gems. + # + # @param [Array] args the list of arguments + # @return [void] + def run(*args) + require 'rubygems' + optparse(*args) + build_gems + end + + private + + # Builds .yardoc files for all non-existing gems + def build_gems + require 'rubygems' + @gems.each do |spec| + ver = "= #{spec.version}" + dir = Registry.yardoc_file_for_gem(spec.name, ver) + if dir && File.directory?(dir) && !@rebuild + log.debug "#{spec.name} index already exists at '#{dir}'" + else + yfile = Registry.yardoc_file_for_gem(spec.name, ver, true) + next unless yfile + next unless File.directory?(spec.full_gem_path) + Registry.clear + Dir.chdir(spec.full_gem_path) do + log.info "Building yardoc index for gem: #{spec.full_name}" + Yardoc.run('--no-stats', '-n', '-b', yfile) + end + end + end + end + + def add_gems(gems) + 0.step(gems.size - 1, 2) do |index| + gem = gems[index] + ver_require = gems[index + 1] || ">= 0" + specs = YARD::GemIndex.find_all_by_name(gem, ver_require) + if specs.empty? + log.warn "#{gem} #{ver_require} could not be found in RubyGems index" + else + @gems += specs + end + end + end + + # Parses options + def optparse(*args) + opts = OptionParser.new + opts.banner = 'Usage: yard gems [options] [gem_name [version]]' + opts.separator "" + opts.separator "#{description}. If no gem_name is given," + opts.separator "all gems are built." + opts.separator "" + opts.on('--rebuild', 'Rebuilds index') do + @rebuild = true + end + + common_options(opts) + parse_options(opts, args) + add_gems(args) + + if !args.empty? && @gems.empty? + log.error "No specified gems could be found for command" + elsif @gems.empty? + @gems += YARD::GemIndex.all if @gems.empty? + end + end + end + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/cli/graph.rb b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/cli/graph.rb new file mode 100644 index 000000000..863d61acc --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/cli/graph.rb @@ -0,0 +1,125 @@ +# frozen_string_literal: true +module YARD + module CLI + # Options to pass to the {Graph} CLI. + class GraphOptions < Templates::TemplateOptions + # @return [:dot] the default output format + default_attr :format, :dot + + # @return [Boolean] whether to list the full class diagram + attr_accessor :full + + # @return [Boolean] whether to show the object dependencies + attr_accessor :dependencies + + # @return [String] any contents to pass to the digraph + attr_accessor :contents + end + + # A command-line utility to generate Graphviz graphs from + # a set of objects + # + # @see Graph#run + # @since 0.6.0 + class Graph < YardoptsCommand + # The options parsed out of the commandline. + # Default options are: + # :format => :dot + attr_reader :options + + # The set of objects to include in the graph. + attr_reader :objects + + # Creates a new instance of the command-line utility + def initialize + super + @use_document_file = false + @options = GraphOptions.new + options.reset_defaults + options.serializer = YARD::Serializers::StdoutSerializer.new + end + + def description + "Graphs class diagram using Graphviz" + end + + # Runs the command-line utility. + # + # @example + # grapher = Graph.new + # grapher.run('--private') + # @param [Array] args each tokenized argument + def run(*args) + parse_arguments(*args) + + contents = objects.map do |o| + o.format(options.merge(:serialize => false)) + end.join("\n") + opts = {:type => :layout, :contents => contents} + options.update(opts) + Templates::Engine.render(options) + end + + private + + def unrecognized_option(err) end + + # Parses commandline options. + # @param [Array] args each tokenized argument + def optparse(*args) + visibilities = [:public] + opts = OptionParser.new + + opts.separator "" + opts.separator "General Options:" + + opts.on('-b', '--db FILE', 'Use a specified .yardoc db to load from or save to. (defaults to .yardoc)') do |yfile| + YARD::Registry.yardoc_file = yfile + end + + opts.on('--full', 'Full class diagrams (show methods and attributes).') do + options[:full] = true + end + + opts.on('-d', '--dependencies', 'Show mixins in dependency graph.') do + options[:dependencies] = true + end + + opts.on('--no-public', "Don't show public methods. (default shows public)") do + visibilities.delete(:public) + end + + opts.on('--protected', "Show or don't show protected methods. (default hides protected)") do + visibilities.push(:protected) + end + + opts.on('--private', "Show or don't show private methods. (default hides private)") do + visibilities.push(:private) + end + + opts.separator "" + opts.separator "Output options:" + + opts.on('--dot [OPTIONS]', 'Send the results directly to `dot` with optional arguments.') do |dotopts| + options.serializer = Serializers::ProcessSerializer.new('dot ' + dotopts.to_s) + end + + opts.on('-f', '--file [FILE]', 'Writes output to a file instead of stdout.') do |file| + options.serializer = Serializers::FileSystemSerializer.new(:basepath => '.', :extension => nil) + options.serializer.instance_eval "def serialized_path(object) #{file.inspect} end" + end + + common_options(opts) + parse_options(opts, args) + + Registry.load + + expression = "#{visibilities.uniq.inspect}.include?(object.visibility)" + options.verifier = Verifier.new(expression) + @objects = args.first ? + args.map {|o| Registry.at(o) }.compact : + [Registry.root] + end + end + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/cli/help.rb b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/cli/help.rb new file mode 100644 index 000000000..3367c2521 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/cli/help.rb @@ -0,0 +1,20 @@ +# frozen_string_literal: true +module YARD + module CLI + # Handles help for commands + # @since 0.6.0 + class Help < Command + def description; "Retrieves help for a command" end + + def run(*args) + cmd = args.first && CommandParser.commands[args.first.to_sym] + if cmd + cmd.run('--help') + else + log.puts "Command #{args.first} not found." if args.first + CommandParser.run('--help') + end + end + end + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/cli/i18n.rb b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/cli/i18n.rb new file mode 100644 index 000000000..21e61aa7c --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/cli/i18n.rb @@ -0,0 +1,70 @@ +# frozen_string_literal: true +require "pathname" + +module YARD + module CLI + # CLI command to support internationalization (a.k.a. i18n). + # I18n feature is based on gettext technology. + # This command generates .pot file from docstring and extra + # documentation. + # + # @since 0.8.0 + # @todo Support msgminit and msgmerge features? + class I18n < Yardoc + def initialize + super + @options.serializer.basepath = "po/yard.pot" + end + + def description + 'Generates .pot file from source code and extra documentation' + end + + def run(*args) + if args.empty? || !args.first.nil? + # fail early if arguments are not valid + return unless parse_arguments(*args) + end + + YARD.parse(files, excluded) + + serializer = options.serializer + pot_file_path = Pathname.new(serializer.basepath).expand_path + pot_file_dir_path, pot_file_basename = pot_file_path.split + relative_base_path = Pathname.pwd.relative_path_from(pot_file_dir_path) + serializer.basepath = pot_file_dir_path.to_s + serializer.serialize(pot_file_basename.to_s, + generate_pot(relative_base_path.to_s)) + + true + end + + private + + def general_options(opts) + opts.banner = "Usage: yard i18n [options] [source_files [- extra_files]]" + opts.top.list.clear + opts.separator "(if a list of source files is omitted, " + opts.separator " {lib,app}/**/*.rb ext/**/*.{c,rb} is used.)" + opts.separator "" + opts.separator "Example: yard i18n -o yard.pot - FAQ LICENSE" + opts.separator " The above example outputs .pot file for files in" + opts.separator " lib/**/*.rb to yard.pot including the extra files" + opts.separator " FAQ and LICENSE." + opts.separator "" + opts.separator "A base set of options can be specified by adding a .yardopts" + opts.separator "file to your base path containing all extra options separated" + opts.separator "by whitespace." + super(opts) + end + + def generate_pot(relative_base_path) + generator = YARD::I18n::PotGenerator.new(relative_base_path) + objects = run_verifier(all_objects) + generator.parse_objects(objects) + generator.parse_files(options.files || []) + generator.generate + end + end + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/cli/list.rb b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/cli/list.rb new file mode 100644 index 000000000..d8b66b8f7 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/cli/list.rb @@ -0,0 +1,23 @@ +# frozen_string_literal: true +module YARD + module CLI + # Lists all constant and method names in the codebase. Uses {Yardoc} --list. + class List < Command + def description; 'Lists all constant and methods. Uses `yard doc --list`' end + + # Runs the commandline utility, parsing arguments and displaying a + # list of objects + # + # @param [Array] args the list of arguments. + # @return [void] + def run(*args) + if args.include?('--help') + log.puts "Usage: yard list [yardoc_options]" + log.puts "Takes the same arguments as yardoc. See yardoc --help" + else + Yardoc.run('-c', '--list', *args) + end + end + end + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/cli/markup_types.rb b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/cli/markup_types.rb new file mode 100644 index 000000000..46fd1a3bf --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/cli/markup_types.rb @@ -0,0 +1,32 @@ +# frozen_string_literal: true +module YARD + module CLI + # Lists all markup types + # @since 0.8.6 + class MarkupTypes < Command + def description; 'Lists all available markup types and libraries' end + + # Runs the commandline utility, parsing arguments and displaying a + # list of markup types + # + # @param [Array] args the list of arguments. + # @return [void] + def run(*args) # rubocop:disable Lint/UnusedMethodArgument + log.puts "Available markup types for `doc' command:" + log.puts + types = Templates::Helpers::MarkupHelper::MARKUP_PROVIDERS + exts = Templates::Helpers::MarkupHelper::MARKUP_EXTENSIONS + types.sort_by {|name, _| name.to_s }.each do |name, providers| + log.puts "[#{name}]" + libs = providers.map {|p| p[:lib] }.compact + log.puts " Providers: #{libs.join(" ")}" unless libs.empty? + if exts[name] + log.puts " Extensions: #{exts[name].map {|e| ".#{e}" }.join(" ")}" + end + + log.puts + end + end + end + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/cli/server.rb b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/cli/server.rb new file mode 100644 index 000000000..75ff2f8d2 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/cli/server.rb @@ -0,0 +1,266 @@ +# frozen_string_literal: true + +module YARD + module CLI + # A local documentation server + # @since 0.6.0 + class Server < Command + # @return [Hash] a list of options to pass to the doc server + attr_accessor :options + + # @return [Hash] a list of options to pass to the web server + attr_accessor :server_options + + # @return [Hash] a list of library names and yardoc files to serve + attr_accessor :libraries + + # @return [YARD::Server::Adapter] the adapter to use for loading the web server + attr_accessor :adapter + + # @return [Array] a list of scripts to load + # @since 0.6.2 + attr_accessor :scripts + + # @return [Array] a list of template paths to register + # @since 0.6.2 + attr_accessor :template_paths + + # Creates a new instance of the Server command line utility + def initialize + super + self.scripts = [] + self.template_paths = [] + self.libraries = {} + self.options = SymbolHash.new(false).update( + :single_library => true, + :caching => false + ) + self.server_options = {:Port => 8808} + end + + def description + "Runs a local documentation server" + end + + def run(*args) + optparse(*args) + + select_adapter.setup + load_scripts + load_template_paths + adapter.new(libraries, options, server_options).start + end + + private + + def load_scripts + scripts.each {|file| load_script(file) } + end + + def load_template_paths + return if YARD::Config.options[:safe_mode] + + Templates::Engine.template_paths |= template_paths + end + + def select_adapter + return adapter if adapter + + require 'rubygems' + require 'rack' + self.adapter = YARD::Server::RackAdapter + rescue LoadError + self.adapter = YARD::Server::WebrickAdapter + end + + def add_libraries(args) + (0...args.size).step(2) do |index| + library = args[index] + dir = args[index + 1] + + libver = nil + if dir + if File.exist?(dir) + # Provided dir contains a .yardopts file + libver = create_library_version_if_yardopts_exist(library, dir) + libver ||= YARD::Server::LibraryVersion.new(library, nil, dir) + end + else + # Check if this dir contains a .yardopts file + pwd = Dir.pwd + libver = create_library_version_if_yardopts_exist(library, pwd) + + # Check default location + yfile = File.join(pwd, Registry::DEFAULT_YARDOC_FILE) + libver ||= YARD::Server::LibraryVersion.new(library, nil, yfile) + end + + # Register library + if libver + libver.yardoc_file = File.expand_path(libver.yardoc_file) if libver.yardoc_file + libver.source_path = File.expand_path(libver.source_path) if libver.source_path + libraries[library] ||= [] + libraries[library] |= [libver] + else + log.warn "Cannot find yardoc db for #{library}: #{dir.inspect}" + end + end + end + + # @param [String] library The library name. + # @param [String, nil] dir The argument provided on the CLI after the + # library name. Is supposed to point to either a project directory + # with a Yard options file, or a yardoc db. + # @return [LibraryVersion, nil] + def create_library_version_if_yardopts_exist(library, dir) + if dir + options_file = File.join(dir, Yardoc::DEFAULT_YARDOPTS_FILE) + if File.exist?(options_file) + # Found yardopts, extract db path + yfile = extract_db_from_options_file(options_file) + db = File.expand_path(yfile, dir) + + # Create libver + libver = YARD::Server::LibraryVersion.new(library, nil, db) + libver.source_path = dir + libver + end + end + end + + def add_gems + require 'rubygems' + YARD::GemIndex.each do |spec| + libraries[spec.name] ||= [] + libraries[spec.name] |= [YARD::Server::LibraryVersion.new(spec.name, spec.version.to_s, + nil, :gem)] + end + end + + def add_gems_from_gemfile(gemfile = nil) + require 'bundler' + gemfile ||= "Gemfile" + if File.exist?("#{gemfile}.lock") + Bundler::LockfileParser.new(File.read("#{gemfile}.lock")).specs.each do |spec| + libraries[spec.name] ||= [] + libraries[spec.name] |= [YARD::Server::LibraryVersion.new(spec.name, + spec.version.to_s, nil, :gem)] + end + else + log.warn "Cannot find #{gemfile}.lock, ignoring --gemfile option" + end + rescue LoadError + log.error "Bundler not available, ignoring --gemfile option" + end + + def optparse(*args) + opts = OptionParser.new + opts.banner = 'Usage: yard server [options] [[library yardoc_file] ...]' + opts.separator '' + opts.separator 'Example: yard server -m yard .yardoc ruby-core ../ruby/.yardoc' + opts.separator 'The above example serves documentation for YARD and Ruby-core' + opts.separator '' + opts.separator 'If no library/yardoc_file is specified, the server uses' + opts.separator 'the name of the current directory and `.yardoc` respectively' + opts.separator '' + opts.separator "General Options:" + opts.on('-m', '--multi-library', 'Serves documentation for multiple libraries') do + options[:single_library] = false + end + opts.on('-c', '--cache', 'Caches all documentation to document root (see --docroot)') do + options[:caching] = true + end + opts.on('-r', '--reload', 'Reparses the library code on each request') do + options[:incremental] = true + end + opts.on('-g', '--gems', 'Serves documentation for installed gems') do + add_gems + end + opts.on('-G', '--gemfile [GEMFILE]', + 'Serves documentation for gems from Gemfile') do |gemfile| + add_gems_from_gemfile(gemfile) + end + opts.on('-t', '--template-path PATH', + 'The template path to look for templates in. (used with -t).') do |path| + template_paths << path + end + opts.separator '' + opts.separator "Web Server Options:" + opts.on('-d', '--daemon', 'Daemonizes the server process') do + server_options[:daemonize] = true + end + opts.on('-B HOST', '--bind', 'The host address to bind to') do |host| + server_options[:Host] = host.to_s + end + opts.on('-p PORT', '--port', 'Serves documentation on PORT') do |port| + server_options[:Port] = port.to_i + end + opts.on('--docroot DOCROOT', 'Uses DOCROOT as document root') do |docroot| + server_options[:DocumentRoot] = File.expand_path(docroot) + end + opts.on('-a', '--adapter ADAPTER', + 'Use the ADAPTER (full Ruby class) for web server') do |adapter| + self.adapter = if adapter.casecmp('webrick') == 0 + YARD::Server::WebrickAdapter + elsif adapter.casecmp('rack') == 0 + YARD::Server::RackAdapter + else + eval(adapter) # rubocop:disable Security/Eval + end + end + opts.on('-s', '--server TYPE', + 'Use a specific server type eg. thin,mongrel,cgi (Rack specific)') do |type| + server_options[:server] = type + end + opts.on('--fork', 'Use process forking when serving requests') do + options[:use_fork] = true + end + common_options(opts) + opts.on('-e', '--load FILE', + 'A Ruby script to load before the source tree is parsed.') do |file| + scripts << file + end + parse_options(opts, args) + + if args.empty? && libraries.empty? + # No args - try to use current dir + add_libraries([File.basename(Dir.pwd), nil]) + + # Generate doc for first time + # This is not necessary but makes for a better first-run experience + libver = libraries.empty? ? nil : libraries.values.first.first + generate_doc_for_first_time(libver) if libver && !libver.ready? + else + add_libraries(args) + options[:single_library] = false if libraries.size > 1 + end + end + + def generate_doc_for_first_time(libver) + log.enter_level(Logger::INFO) do + yardoc_file = libver.yardoc_file.sub(%r{^#{Regexp.quote Dir.pwd}[\\/]+}, '') + log.info "No yardoc db found in #{yardoc_file}, parsing source before starting server..." + end + Dir.chdir(libver.source_path) do + Yardoc.run('-n') + end + end + + def extract_db_from_options_file(options_file) + args = File.read_binary(options_file).shell_split + db = YARD::Registry.yardoc_file + opts = OptionParser.new + opts.on('-b', '--db FILE') {|file| db = file } + + begin + opts.parse!(args) + rescue OptionParser::ParseError + args.shift if args.first && args.first[0, 1] != '-' + retry + end + + db + end + end + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/cli/stats.rb b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/cli/stats.rb new file mode 100644 index 000000000..b9145ffe6 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/cli/stats.rb @@ -0,0 +1,233 @@ +# frozen_string_literal: true +module YARD + module CLI + # @since 0.6.0 + class Stats < Yardoc + include Templates::Helpers::BaseHelper + + # Maintains the order in which +stats_for_+ statistics methods should be + # printed. + # + # @see #print_statistics + STATS_ORDER = [:files, :modules, :classes, :constants, :attributes, :methods] + + # @return [Boolean] whether to parse and load registry + attr_accessor :parse + + # @param [Boolean] parse whether to parse and load registry (see {#parse}) + def initialize(parse = true) + super() + @parse = parse + @undoc_list = nil + @compact = false + end + + def description + "Prints documentation statistics on a set of files" + end + + # Runs the commandline utility, parsing arguments and generating + # output if set. + # + # @param [Array] args the list of arguments + # @return [void] + def run(*args) + parse_arguments(*args) + + if use_cache + Registry.load! + elsif parse + YARD.parse(files, excluded) + Registry.save(use_cache) if save_yardoc + end + + print_statistics + print_undocumented_objects + + abort if fail_on_warning && log.warned + end + + # Prints statistics for different object types + # + # To add statistics for a specific type, add a method +#stats_for_TYPE+ + # to this class that calls {#output}. + def print_statistics + @total = 0 + @undocumented = 0 + meths = methods.map(&:to_s).grep(/^stats_for_/) + STATS_ORDER.each do |meth| + mname = "stats_for_#{meth}" + if meths.include?(mname) + send(mname) + meths.delete(mname) + end + end + meths.each {|m| send(m) } + + total = + if @undocumented == 0 + 100 + elsif @total == 0 + 0 + else + (@total - @undocumented).to_f / @total.to_f * 100 + end + log.puts("% 3.2f%% documented" % total) + end + + # Prints list of undocumented objects + def print_undocumented_objects + return if !@undoc_list || @undoc_list.empty? + log.puts + log.puts "Undocumented Objects:" + + # array needed for sort due to unstable sort + objects = @undoc_list.sort_by {|o| [o.file.to_s, o.path] } + max = objects.max {|a, b| a.path.length <=> b.path.length }.path.length + if @compact + objects.each do |object| + log.puts("%-#{max}s (%s)" % [object.path, + [object.file || "-unknown-", object.line].compact.join(":")]) + end + else + last_file = nil + objects.each do |object| + if object.file != last_file + log.puts + log.puts "(in file: #{object.file || "-unknown-"})" + end + log.puts object.path + last_file = object.file + end + end + end + + # @return [Array] all the parsed objects in the registry, + # removing any objects that are not visible (private, protected) depending + # on the arguments passed to the command. + def all_objects + @all_objects ||= run_verifier Registry.all + end + + # Statistics for files + def stats_for_files + files = [] + all_objects.each {|o| files |= [o.file] } + output "Files", files.size + end + + # Statistics for modules + def stats_for_modules + output "Modules", *type_statistics(:module) + end + + # Statistics for classes + def stats_for_classes + output "Classes", *type_statistics(:class) + end + + # Statistics for constants + def stats_for_constants + output "Constants", *type_statistics(:constant) + end + + # Statistics for attributes + def stats_for_attributes + objs = all_objects.select {|m| m.type == :method && m.is_attribute? } + objs.uniq! {|m| m.name.to_s.gsub(/=$/, '') } + undoc = objs.select {|m| m.docstring.blank? } + @undoc_list |= undoc if @undoc_list + output "Attributes", objs.size, undoc.size + end + + # Statistics for methods + def stats_for_methods + objs = all_objects.select {|m| m.type == :method } + objs.reject!(&:is_alias?) + objs.reject!(&:is_attribute?) + undoc = objs.select {|m| m.docstring.blank? } + @undoc_list |= undoc if @undoc_list + output "Methods", objs.size, undoc.size + end + + # Prints a statistic to standard out. This method is optimized for + # getting Integer values, though it allows any data to be printed. + # + # @param [String] name the statistic name + # @param [Integer, String] data the numeric (or any) data representing + # the statistic. If +data+ is an Integer, it should represent the + # total objects of a type. + # @param [Integer, nil] undoc number of undocumented objects for the type + # @return [void] + def output(name, data, undoc = nil) + @total += data if data.is_a?(Integer) && undoc + @undocumented += undoc if undoc.is_a?(Integer) + data = + if undoc + ("%5s (% 5d undocumented)" % [data, undoc]) + else + "%5s" % data + end + log.puts("%-12s %s" % [name + ":", data]) + end + + private + + def type_statistics(type) + objs = all_objects.select {|m| m.type == type } + undoc = objs.find_all {|m| m.docstring.blank? } + @undoc_list |= undoc if @undoc_list + [objs.size, undoc.size] + end + + # Parses commandline options. + # @param [Array] args each tokenized argument + def optparse(*args) + opts = OptionParser.new + opts.banner = "Usage: yard stats [options] [source_files]" + + opts.separator "(if a list of source files is omitted, lib/**/*.rb ext/**/*.{c,rb} is used.)" + + general_options(opts) + output_options(opts) + tag_options(opts) + common_options(opts) + parse_options(opts, args) + parse_files(*args) unless args.empty? + end + + def general_options(opts) + super(opts) + + opts.on('--list-undoc', 'List all undocumented objects') do + @undoc_list = [] + end + + opts.on('--compact', 'Compact undocumented objects listing') do + @compact = true + end + + opts.on('--no-public', "Don't include public methods in statistics.") do + visibilities.delete(:public) + end + + opts.on('--protected', "Include protected methods in statistics.") do + visibilities.push(:protected) + end + + opts.on('--private', "Include private methods in statistics.") do + visibilities.push(:private) + end + + opts.on('--no-private', "Don't include objects with @private tag in statistics.") do + options[:verifier].add_expressions '!object.tag(:private) && + (object.namespace.type == :proxy || !object.namespace.tag(:private))' + end + + opts.on('--query QUERY', "Only includes objects that match a specific query") do |query| + options[:verifier].add_expressions(query.taint) + end + end + end + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/cli/yardoc.rb b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/cli/yardoc.rb new file mode 100644 index 000000000..9308ac169 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/cli/yardoc.rb @@ -0,0 +1,790 @@ +# frozen_string_literal: true +require 'digest/sha1' +require 'fileutils' + +module YARD + module CLI + # Default options used in +yard doc+ command. + class YardocOptions < Templates::TemplateOptions + # @return [Array] + # the list of extra files rendered along with objects + default_attr :files, lambda { [] } + + # @return [String] the default title appended to each generated page + default_attr :title, "Documentation by YARD #{YARD::VERSION}" + + # @return [Verifier] the default verifier object to filter queries + default_attr :verifier, lambda { Verifier.new } + + # @return [Serializers::Base] the default serializer for generating output + # to disk. + default_attr :serializer, lambda { Serializers::FileSystemSerializer.new } + + # @return [Symbol] the default output format (:html). + default_attr :format, :html + + # @return [Boolean] whether the data should be rendered in a single page, + # if the template supports it. + default_attr :onefile, false + + # @return [CodeObjects::ExtraFileObject] the README file object rendered + # along with objects + attr_accessor :readme + + # @return [Array] the list of code objects to render + # the templates with. + attr_accessor :objects + + # @return [Numeric] An index value for rendering sequentially related templates + attr_accessor :index + + # @return [CodeObjects::Base] an extra item to send to a template that is not + # the main rendered object + attr_accessor :item + + # @return [CodeObjects::ExtraFileObject] the file object being rendered. + # The +object+ key is not used so that a file may be rendered in the context + # of an object's namespace (for generating links). + attr_accessor :file + + # @return [String] the current locale + attr_accessor :locale + end + + # Yardoc is the default YARD CLI command (+yard doc+ and historic +yardoc+ + # executable) used to generate and output (mainly) HTML documentation given + # a set of source files. + # + # == Usage + # + # Main usage for this command is: + # + # $ yardoc [options] [source_files [- extra_files]] + # + # See +yardoc --help+ for details on valid options. + # + # == Options File (+.yardopts+) + # + # If a +.yardopts+ file is found in the source directory being processed, + # YARD will use the contents of the file as arguments to the command, + # treating newlines as spaces. You can use shell-style quotations to + # group space delimited arguments, just like on the command line. + # + # A valid +.yardopts+ file might look like: + # + # --no-private + # --title "My Title" + # --exclude foo --exclude bar + # lib/**/*.erb + # lib/**/*.rb - + # HACKING.rdoc LEGAL COPYRIGHT + # + # Note that Yardoc also supports the legacy RDoc style +.document+ file, + # though this file can only specify source globs to parse, not options. + # + # == Queries (+--query+) + # + # Yardoc supports queries to select specific code objects for which to + # generate documentation. For example, you might want to generate + # documentation only for your public API. If you've documented your public + # methods with +@api public+, you can use the following query to select + # all of these objects: + # + # --query '@api.text == "public"' + # + # Note that the syntax for queries is mostly Ruby with a few syntactic + # simplifications for meta-data tags. See the {Verifier} class for an + # overview of this syntax. + # + # == Adding Custom Ad-Hoc Meta-data Tags (+--tag+) + # + # YARD allows specification of {file:docs/Tags.md meta-data tags} + # programmatically via the {YARD::Tags::Library} class, but often this is not + # practical for users writing documentation. To make adding custom tags + # easier, Yardoc has a few command-line switches for creating basic tags + # and displaying them in generated HTML output. + # + # To specify a custom tag to be displayed in output, use any of the + # following: + # + # * +--tag+ TAG:TITLE + # * +--name-tag+ TAG:TITLE + # * +--type-tag+ TAG:TITLE + # * +--type-name-tag+ TAG:TITLE + # * +--title-tag+ TAG:TITLE + # + # "TAG:TITLE" is of the form: name:"Display Title", for example: + # + # --tag overload:"Overloaded Method" + # + # See +yard help doc+ for a description of the various options. + # + # Tags added in this way are automatically displayed in output. To add + # a meta-data tag that does not show up in output, use +--hide-tag TAG+. + # Note that you can also use this option on existing tags to hide + # builtin tags, for instance. + # + # == Processed Data Storage (+.yardoc+ directory) + # + # When Yardoc parses a source directory, it creates a +.yardoc+ directory + # (by default, override with +-b+) at the root of the project. This directory + # contains marshal dumps for all raw object data in the source, so that + # you can access it later for various commands (+stats+, +graph+, etc.). + # This directory is also used as a cache for any future calls to +yardoc+ + # so as to process only the files which have changed since the last call. + # + # When Yardoc uses the cache in subsequent calls to +yardoc+, methods + # or classes that have been deleted from source since the last parsing + # will not be erased from the cache (YARD never deletes objects). In such + # a case, you should wipe the cache and do a clean parsing of the source tree. + # You can do this by deleting the +.yardoc+ directory manually, or running + # Yardoc without +--use-cache+ (+-c+). + # + # @since 0.2.1 + # @see Verifier + class Yardoc < YardoptsCommand + # @return [Hash] the hash of options passed to the template. + # @see Templates::Engine#render + attr_reader :options + + # @return [Array] list of Ruby source files to process + attr_accessor :files + + # @return [Array] list of excluded paths (regexp matches) + # @since 0.5.3 + attr_accessor :excluded + + # @return [Boolean] whether to use the existing yardoc db if the + # .yardoc already exists. Also makes use of file checksums to + # parse only changed files. + attr_accessor :use_cache + + # @return [Boolean] whether objects should be serialized to .yardoc db + attr_accessor :save_yardoc + + # @return [Boolean] whether to generate output + attr_accessor :generate + + # @return [Boolean] whether to print a list of objects + # @since 0.5.5 + attr_accessor :list + + # Keep track of which visibilities are to be shown + # @return [Array] a list of visibilities + # @since 0.5.6 + attr_accessor :visibilities + + # Keep track of which APIs are to be shown + # @return [Array] a list of APIs + # @since 0.8.1 + attr_accessor :apis + + # Keep track of which APIs are to be hidden + # @return [Array] a list of APIs to be hidden + # @since 0.8.7 + attr_accessor :hidden_apis + + # @return [Array] a list of tags to hide from templates + # @since 0.6.0 + attr_accessor :hidden_tags + + # @return [Boolean] whether to print statistics after parsing + # @since 0.6.0 + attr_accessor :statistics + + # @return [Array] a list of assets to copy after generation + # @since 0.6.0 + attr_accessor :assets + + # @return [Boolean] whether markup option was specified + # @since 0.7.0 + attr_accessor :has_markup + + # @return [Boolean] whether yard exits with error status code if a warning occurs + attr_accessor :fail_on_warning + + # Creates a new instance of the commandline utility + def initialize + super + @options = YardocOptions.new + @options.reset_defaults + @visibilities = [:public] + @apis = [] + @hidden_apis = [] + @assets = {} + @excluded = [] + @files = [] + @hidden_tags = [] + @use_cache = false + @generate = true + @statistics = true + @list = false + @save_yardoc = true + @has_markup = false + @fail_on_warning = false + + if defined?(::Encoding) && ::Encoding.respond_to?(:default_external=) + utf8 = ::Encoding.find('utf-8') + + ::Encoding.default_external = utf8 unless ::Encoding.default_external == utf8 + ::Encoding.default_internal = utf8 unless ::Encoding.default_internal == utf8 + end + end + + def description + "Generates documentation" + end + + # Runs the commandline utility, parsing arguments and generating + # output if set. + # + # @param [Array] args the list of arguments. If the list only + # contains a single nil value, skip calling of {#parse_arguments} + # @return [void] + def run(*args) + log.show_progress = true + if args.empty? || !args.first.nil? + # fail early if arguments are not valid + return unless parse_arguments(*args) + end + + checksums = nil + if use_cache + Registry.load + checksums = Registry.checksums.dup + end + + if save_yardoc + Registry.lock_for_writing do + YARD.parse(files, excluded) + Registry.save(use_cache) + end + else + YARD.parse(files, excluded) + end + + if generate + run_generate(checksums) + copy_assets + elsif list + print_list + end + + if !list && statistics && log.level < Logger::ERROR + Registry.load_all + log.enter_level(Logger::ERROR) do + Stats.new(false).run(*args) + end + end + + abort if fail_on_warning && log.warned + + true + ensure + log.show_progress = false + end + + # Parses commandline arguments + # @param [Array] args the list of arguments + # @return [Boolean] whether or not arguments are valid + # @since 0.5.6 + def parse_arguments(*args) + super(*args) + + # Last minute modifications + self.files = Parser::SourceParser::DEFAULT_PATH_GLOB if files.empty? + files.delete_if {|x| x =~ /\A\s*\Z/ } # remove empty ones + readme = Dir.glob('README{,*[^~]}'). + select {|f| extra_file_valid?(f)}. + sort_by {|r| [r.count('.'), r.index('.'), r] }.first + readme ||= Dir.glob(files.first).first if options.onefile && !files.empty? + options.readme ||= CodeObjects::ExtraFileObject.new(readme) if readme && extra_file_valid?(readme) + options.files.unshift(options.readme).uniq! if options.readme + + Tags::Library.visible_tags -= hidden_tags + add_visibility_verifier + add_api_verifier + + apply_locale + + # US-ASCII is invalid encoding for onefile + if defined?(::Encoding) && options.onefile + if ::Encoding.default_internal == ::Encoding::US_ASCII + log.warn "--one-file is not compatible with US-ASCII encoding, using ASCII-8BIT" + ::Encoding.default_external, ::Encoding.default_internal = ['ascii-8bit'] * 2 + end + end + + if generate && !verify_markup_options + false + else + true + end + end + + # The list of all objects to process. Override this method to change + # which objects YARD should generate documentation for. + # + # @deprecated To hide methods use the +@private+ tag instead. + # @return [Array] a list of code objects to process + def all_objects + Registry.all(:root, :module, :class) + end + + private + + # Generates output for objects + # @param [Hash, nil] checksums if supplied, a list of checkums for files. + # @return [void] + # @since 0.5.1 + def run_generate(checksums) + if checksums + changed_files = [] + Registry.checksums.each do |file, hash| + changed_files << file if checksums[file] != hash + end + end + Registry.load_all if use_cache + objects = run_verifier(all_objects).reject do |object| + serialized = !options.serializer || options.serializer.exists?(object) + if checksums && serialized && !object.files.any? {|f, _line| changed_files.include?(f) } + true + else + log.debug "Re-generating object #{object.path}..." + false + end + end + Templates::Engine.generate(objects, options) + end + + # Verifies that the markup options are valid before parsing any code. + # Failing early is better than failing late. + # + # @return (see YARD::Templates::Helpers::MarkupHelper#load_markup_provider) + def verify_markup_options + result = false + lvl = has_markup ? log.level : Logger::FATAL + obj = Struct.new(:options).new(options) + obj.extend(Templates::Helpers::MarkupHelper) + options.files.each do |file| + markup = file.attributes[:markup] || obj.markup_for_file('', file.filename) + result = obj.load_markup_provider(markup) + return false if !result && markup != :rdoc + end + options.markup = :rdoc unless has_markup + log.enter_level(lvl) { result = obj.load_markup_provider } + if !result && !has_markup + log.warn "Could not load default RDoc formatter, " \ + "ignoring any markup (install RDoc to get default formatting)." + options.markup = :none + true + else + result + end + end + + # Copies any assets to the output directory + # @return [void] + # @since 0.6.0 + def copy_assets + return unless options.serializer + outpath = options.serializer.basepath + assets.each do |from, to| + to = File.join(outpath, to) + log.debug "Copying asset '#{from}' to '#{to}'" + from += '/.' if File.directory?(from) + FileUtils.cp_r(from, to) + end + end + + # Prints a list of all objects + # @return [void] + # @since 0.5.5 + def print_list + Registry.load_all + run_verifier(Registry.all). + sort_by {|item| [item.file || '', item.line || 0] }.each do |item| + log.puts "#{item.file}:#{item.line}: #{item.path}" + end + end + + # Adds a set of extra documentation files to be processed + # @param [Array] files the set of documentation files + def add_extra_files(*files) + files.map! {|f| f.include?("*") ? Dir.glob(f) : f }.flatten! + files.each do |file| + if extra_file_valid?(file) + options.files << CodeObjects::ExtraFileObject.new(file) + end + end + end + + # @param file [String] the filename to validate + # @param check_exists [Boolean] whether the file should exist on disk + # @return [Boolean] whether the file is allowed to be used + def extra_file_valid?(file, check_exists = true) + if file =~ %r{^(?:\.\./|/)} + log.warn "Invalid file: #{file}" + false + elsif check_exists && !File.file?(file) + log.warn "Could not find file: #{file}" + false + else + true + end + end + + # Parses the file arguments into Ruby files and extra files, which are + # separated by a '-' element. + # + # @example Parses a set of Ruby source files + # parse_files %w(file1 file2 file3) + # @example Parses a set of Ruby files with a separator and extra files + # parse_files %w(file1 file2 - extrafile1 extrafile2) + # @param [Array] files the list of files to parse + # @return [void] + def parse_files(*files) + seen_extra_files_marker = false + + files.each do |file| + if file == "-" + seen_extra_files_marker = true + next + end + + if seen_extra_files_marker + add_extra_files(file) + else + self.files << file + end + end + end + + # Adds verifier rule for visibilities + # @return [void] + # @since 0.5.6 + def add_visibility_verifier + vis_expr = "#{visibilities.uniq.inspect}.include?(object.visibility)" + options.verifier.add_expressions(vis_expr) + end + + # Adds verifier rule for APIs + # @return [void] + # @since 0.8.1 + def add_api_verifier + no_api = true if apis.delete('') + exprs = [] + + exprs << "#{apis.uniq.inspect}.include?(@api.text)" unless apis.empty? + + unless hidden_apis.empty? + exprs << "!#{hidden_apis.uniq.inspect}.include?(@api.text)" + end + + exprs = !exprs.empty? ? [exprs.join(' && ')] : [] + exprs << "!@api" if no_api + + expr = exprs.join(' || ') + options.verifier.add_expressions(expr) unless expr.empty? + end + + # Applies the specified locale to collected objects + # @return [void] + # @since 0.8.3 + def apply_locale + YARD::I18n::Locale.default = options.locale + options.files.each do |file| + file.locale = options.locale + end + end + + # (see Templates::Helpers::BaseHelper#run_verifier) + def run_verifier(list) + options.verifier ? options.verifier.run(list) : list + end + + # @since 0.6.0 + def add_tag(tag_data, factory_method = nil) + tag, title = *tag_data.split(':') + title ||= tag.capitalize + Tags::Library.define_tag(title, tag.to_sym, factory_method) + Tags::Library.visible_tags |= [tag.to_sym] + end + + # Parses commandline options. + # @param [Array] args each tokenized argument + def optparse(*args) + opts = OptionParser.new + opts.banner = "Usage: yard doc [options] [source_files [- extra_files]]" + + opts.separator "(if a list of source files is omitted, " + opts.separator " {lib,app}/**/*.rb ext/**/*.{c,rb} is used.)" + opts.separator "" + opts.separator "Example: yardoc -o documentation/ - FAQ LICENSE" + opts.separator " The above example outputs documentation for files in" + opts.separator " lib/**/*.rb to documentation/ including the extra files" + opts.separator " FAQ and LICENSE." + opts.separator "" + opts.separator "A base set of options can be specified by adding a .yardopts" + opts.separator "file to your base path containing all extra options separated" + opts.separator "by whitespace." + + general_options(opts) + output_options(opts) + tag_options(opts) + common_options(opts) + parse_options(opts, args) + parse_files(*args) unless args.empty? + end + + # Adds general options + def general_options(opts) + opts.separator "" + opts.separator "General Options:" + + opts.on('-b', '--db FILE', 'Use a specified .yardoc db to load from or save to', + ' (defaults to .yardoc)') do |yfile| + YARD::Registry.yardoc_file = yfile + end + + opts.on('--[no-]single-db', 'Whether code objects should be stored to single', + ' database file (advanced)') do |use_single_db| + Registry.single_object_db = use_single_db + end + + opts.on('-n', '--no-output', 'Only generate .yardoc database, no documentation.') do + self.generate = false + end + + opts.on('-c', '--use-cache [FILE]', + "Use the cached .yardoc db to generate documentation.", + " (defaults to no cache)") do |file| + YARD::Registry.yardoc_file = file if file + self.use_cache = true + end + + opts.on('--no-cache', "Clear .yardoc db before parsing source.") do + self.use_cache = false + end + + yardopts_options(opts) + + opts.on('--no-save', 'Do not save the parsed data to the yardoc db') do + self.save_yardoc = false + end + + opts.on('--exclude REGEXP', 'Ignores a file if it matches path match (regexp)') do |path| + excluded << path + end + + opts.on('--fail-on-warning', 'Exit with error status code if a warning occurs') do + self.fail_on_warning = true + end + end + + # Adds output options + def output_options(opts) + opts.separator "" + opts.separator "Output options:" + + opts.on('--one-file', 'Generates output as a single file') do + options.onefile = true + end + + opts.on('--list', 'List objects to standard out (implies -n)') do |_format| + self.generate = false + self.list = true + end + + opts.on('--no-public', "Don't show public methods. (default shows public)") do + visibilities.delete(:public) + end + + opts.on('--protected', "Show protected methods. (default hides protected)") do + visibilities.push(:protected) + end + + opts.on('--private', "Show private methods. (default hides private)") do + visibilities.push(:private) + end + + opts.on('--no-private', "Hide objects with @private tag") do + options.verifier.add_expressions '!object.tag(:private) && + (object.namespace.is_a?(CodeObjects::Proxy) || !object.namespace.tag(:private))' + end + + opts.on('--[no-]api API', 'Generates documentation for a given API', + '(objects which define the correct @api tag).', + 'If --no-api is given, displays objects with', + 'no @api tag.') do |api| + api = '' if api == false + apis.push(api) + end + + opts.on('--hide-api API', 'Hides given @api tag from documentation') do |api| + hidden_apis.push(api) + end + + opts.on('--embed-mixins', "Embeds mixin methods into class documentation") do + options.embed_mixins << '*' + end + + opts.on('--embed-mixin [MODULE]', "Embeds mixin methods from a particular", + " module into class documentation") do |mod| + options.embed_mixins << mod + end + + opts.on('--no-highlight', "Don't highlight code blocks in output.") do + options.highlight = false + end + + opts.on('--default-return TYPE', "Shown if method has no return type. ", + " (defaults to 'Object')") do |type| + options.default_return = type + end + + opts.on('--hide-void-return', "Hides return types specified as 'void'. ", + " (default is shown)") do + options.hide_void_return = true + end + + opts.on('--query QUERY', "Only show objects that match a specific query") do |query| + next if YARD::Config.options[:safe_mode] + options.verifier.add_expressions(query.taint) + end + + opts.on('--title TITLE', 'Add a specific title to HTML documents') do |title| + options.title = title + end + + opts.on('-r', '--readme FILE', '--main FILE', 'The readme file used as the title page', + ' of documentation.') do |readme| + if extra_file_valid?(readme) + options.readme = CodeObjects::ExtraFileObject.new(readme) + end + end + + opts.on('--files FILE1,FILE2,...', 'Any extra comma separated static files to be ', + ' included (eg. FAQ)') do |files| + add_extra_files(*files.split(",")) + end + + opts.on('--asset FROM[:TO]', 'A file or directory to copy over to output ', + ' directory after generating') do |asset| + from, to = *asset.split(':').map {|f| File.cleanpath(f, true) } + to ||= from + if extra_file_valid?(from, false) && extra_file_valid?(to, false) + assets[from] = to + end + end + + opts.on('-o', '--output-dir PATH', + 'The output directory. (defaults to ./doc)') do |dir| + options.serializer.basepath = dir + end + + opts.on('-m', '--markup MARKUP', + 'Markup style used in documentation, like textile, ', + ' markdown or rdoc. (defaults to rdoc)') do |markup| + self.has_markup = true + options.markup = markup.to_sym + end + + opts.on('-M', '--markup-provider MARKUP_PROVIDER', + 'Overrides the library used to process markup ', + ' formatting (specify the gem name)') do |markup_provider| + options.markup_provider = markup_provider.to_sym + end + + opts.on('--charset ENC', 'Character set to use when parsing files ', + ' (default is system locale)') do |encoding| + begin + if defined?(Encoding) && Encoding.respond_to?(:default_external=) + Encoding.default_external = encoding + Encoding.default_internal = encoding + end + rescue ArgumentError => e + raise OptionParser::InvalidOption, e + end + end + + opts.on('-t', '--template TEMPLATE', + 'The template to use. (defaults to "default")') do |template| + options.template = template.to_sym + end + + opts.on('-p', '--template-path PATH', + 'The template path to look for templates in.', + ' (used with -t).') do |path| + next if YARD::Config.options[:safe_mode] + YARD::Templates::Engine.register_template_path(File.expand_path(path)) + end + + opts.on('-f', '--format FORMAT', + 'The output format for the template.', + ' (defaults to html)') do |format| + options.format = format.to_sym + end + + opts.on('--no-stats', 'Don\'t print statistics') do + self.statistics = false + end + + opts.on('--no-progress', 'Don\'t show progress bar') do + log.show_progress = false + end + + opts.on('--locale LOCALE', + 'The locale for generated documentation.', + ' (defaults to en)') do |locale| + options.locale = locale + end + + opts.on('--po-dir DIR', + 'The directory that has .po files.', + " (defaults to #{YARD::Registry.po_dir})") do |dir| + YARD::Registry.po_dir = dir + end + end + + # Adds tag options + # @since 0.6.0 + def tag_options(opts) + opts.separator "" + opts.separator "Tag options: (TAG:TITLE looks like: 'overload:Overloaded Method')" + + opts.on('--tag TAG:TITLE', 'Registers a new free-form metadata @tag') do |tag| + add_tag(tag) + end + + opts.on('--type-tag TAG:TITLE', 'Tag with an optional types field') do |tag| + add_tag(tag, :with_types) + end + + opts.on('--type-name-tag TAG:TITLE', 'Tag with optional types and a name field') do |tag| + add_tag(tag, :with_types_and_name) + end + + opts.on('--name-tag TAG:TITLE', 'Tag with a name field') do |tag| + add_tag(tag, :with_name) + end + + opts.on('--title-tag TAG:TITLE', 'Tag with first line as title field') do |tag| + add_tag(tag, :with_title_and_text) + end + + opts.on('--hide-tag TAG', 'Hides a previously defined tag from templates') do |tag| + self.hidden_tags |= [tag.to_sym] + end + + opts.on('--transitive-tag TAG', 'Marks a tag as transitive') do |tag| + Tags::Library.transitive_tags |= [tag.to_sym] + end + + opts.on('--non-transitive-tag TAG', 'Marks a tag as not transitive') do |tag| + Tags::Library.transitive_tags -= [tag.to_sym] + end + end + end + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/cli/yardopts_command.rb b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/cli/yardopts_command.rb new file mode 100644 index 000000000..b86497e85 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/cli/yardopts_command.rb @@ -0,0 +1,110 @@ +# frozen_string_literal: true +require 'optparse' + +module YARD + module CLI + # Abstract base class for command that reads .yardopts file + # + # @abstract + # @since 0.8.3 + class YardoptsCommand < Command + # The configuration filename to load extra options from + DEFAULT_YARDOPTS_FILE = ".yardopts" + + # @return [Boolean] whether to parse options from .yardopts + attr_accessor :use_yardopts_file + + # @return [Boolean] whether to parse options from .document + attr_accessor :use_document_file + + # The options file name (defaults to {DEFAULT_YARDOPTS_FILE}) + # @return [String] the filename to load extra options from + attr_accessor :options_file + + # Creates a new command that reads .yardopts + def initialize + super + @options_file = DEFAULT_YARDOPTS_FILE + @use_yardopts_file = true + @use_document_file = true + end + + # Parses commandline arguments + # @param [Array] args the list of arguments + # @return [Boolean] whether or not arguments are valid + # @since 0.5.6 + def parse_arguments(*args) + parse_yardopts_options(*args) + + # Parse files and then command line arguments + parse_rdoc_document_file + parse_yardopts + optparse(*args) + end + + protected + + # Adds --[no-]yardopts / --[no-]document + def yardopts_options(opts) + opts.on('--[no-]yardopts [FILE]', + "If arguments should be read from FILE", + " (defaults to yes, FILE defaults to .yardopts)") do |use_yardopts| + if use_yardopts.is_a?(String) + self.options_file = use_yardopts + self.use_yardopts_file = true + else + self.use_yardopts_file = (use_yardopts != false) + end + end + + opts.on('--[no-]document', "If arguments should be read from .document file. ", + " (defaults to yes)") do |use_document| + self.use_document_file = use_document + end + end + + private + + # Parses the .yardopts file for default yard options + # @return [Array] an array of options parsed from .yardopts + def yardopts(file = options_file) + return [] unless use_yardopts_file + File.read_binary(file).shell_split + rescue Errno::ENOENT + [] + end + + # Parses out the yardopts/document options + def parse_yardopts_options(*args) + opts = OptionParser.new + opts.base.long.clear # HACK: why are --help and --version defined? + yardopts_options(opts) + begin + opts.parse(args) + rescue OptionParser::ParseError => err + idx = args.index(err.args.first) + args = args[(idx + 1)..-1] + args.shift while args.first && args.first[0, 1] != '-' + retry + end + end + + def parse_rdoc_document_file(file = '.document') + optparse(*support_rdoc_document_file!(file)) if use_document_file + end + + def parse_yardopts(file = options_file) + optparse(*yardopts(file)) if use_yardopts_file + end + + # Reads a .document file in the directory to get source file globs + # @return [Array] an array of files parsed from .document + def support_rdoc_document_file!(file = '.document') + return [] unless use_document_file + File.read(file).gsub(/^[ \t]*#.+/m, '').split(/\s+/) + rescue Errno::ENOENT + [] + end + end + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/cli/yri.rb b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/cli/yri.rb new file mode 100644 index 000000000..c6629cd97 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/cli/yri.rb @@ -0,0 +1,215 @@ +# frozen_string_literal: true +require 'rbconfig' + +module YARD + module CLI + # A tool to view documentation in the console like `ri` + class YRI < Command + # The location in {YARD::CONFIG_DIR} where the YRI cache file is loaded + # from. + CACHE_FILE = File.expand_path(File.join(YARD::Config::CONFIG_DIR, 'yri_cache')) + + # A file containing all paths, delimited by newlines, to search for + # yardoc databases. + # @since 0.5.1 + SEARCH_PATHS_FILE = File.expand_path(File.join(YARD::Config::CONFIG_DIR, 'yri_search_paths')) + + # Default search paths that should be loaded dynamically into YRI. These paths + # take precedence over all other paths ({SEARCH_PATHS_FILE} and RubyGems + # paths). To add a path, call: + # + # DEFAULT_SEARCH_PATHS.push("/path/to/.yardoc") + # + # @return [Array] a list of extra search paths + # @since 0.6.0 + DEFAULT_SEARCH_PATHS = [] + + # Helper method to run the utility on an instance. + # @see #run + def self.run(*args) new.run(*args) end + + def initialize + super + @cache = {} + @search_paths = [] + add_default_paths + add_gem_paths + load_cache + @search_paths.uniq! + end + + def description + "A tool to view documentation in the console like `ri`" + end + + # Runs the command-line utility. + # + # @example + # YRI.new.run('String#reverse') + # @param [Array] args each tokenized argument + def run(*args) + optparse(*args) + + if ::RbConfig::CONFIG['host_os'] =~ /mingw|win32/ + @serializer ||= YARD::Serializers::StdoutSerializer.new + else + @serializer ||= YARD::Serializers::ProcessSerializer.new('less') + end + + if @name.nil? || @name.strip.empty? + print_usage + return exit(1) + end + + object = find_object(@name) + if object + print_object(object) + else + STDERR.puts "No documentation for `#{@name}'" + return exit(1) + end + end + + protected + + # Prints the command usage + # @return [void] + # @since 0.5.6 + def print_usage + log.puts "Usage: yri [options] " + log.puts "See yri --help for more options." + end + + # Caches the .yardoc file where an object can be found in the {CACHE_FILE} + # @return [void] + def cache_object(name, path) + return if path == Registry.yardoc_file + @cache[name] = path + + File.open!(CACHE_FILE, 'w') do |file| + @cache.each do |key, value| + file.puts("#{key} #{value}") + end + end + end + + # @param [CodeObjects::Base] object the object to print. + # @return [String] the formatted output for an object. + def print_object(object) + if object.type == :method && object.is_alias? + tmp = P(object.namespace, (object.scope == :instance ? "#" : "") + + object.namespace.aliases[object].to_s) + object = tmp unless YARD::CodeObjects::Proxy === tmp + end + object.format(:serializer => @serializer) + end + + # Locates an object by name starting in the cached paths and then + # searching through any search paths. + # + # @param [String] name the full name of the object + # @return [CodeObjects::Base] an object if found + # @return [nil] if no object is found + def find_object(name) + @search_paths.unshift(@cache[name]) if @cache[name] + @search_paths.unshift(Registry.yardoc_file) + + # Try to load it from in memory cache + log.debug "Searching for #{name} in memory" + obj = try_load_object(name, nil) + return obj if obj + + log.debug "Searching for #{name} in search paths" + @search_paths.each do |path| + next unless File.exist?(path) + log.debug "Searching for #{name} in #{path}..." + Registry.load(path) + obj = try_load_object(name, path) + return obj if obj + end + nil + end + + private + + # Tries to load the object with name. If successful, caches the object + # with the cache_path + # + # @param [String] name the object path + # @param [String] cache_path the location of the yardoc + # db containing the object to cache for future lookups. + # No caching is done if this is nil. + # @return [void] + def try_load_object(name, cache_path) + obj = Registry.at(name) + cache_object(name, cache_path) if obj && cache_path + obj + end + + # Loads {CACHE_FILE} + # @return [void] + def load_cache + return unless File.file?(CACHE_FILE) + File.readlines(CACHE_FILE).each do |line| + line = line.strip.split(/\s+/) + @cache[line[0]] = line[1] + end + end + + # Adds all RubyGems yardoc files to search paths + # @return [void] + def add_gem_paths + require 'rubygems' + gem_paths = [] + YARD::GemIndex.each do |spec| + yfile = Registry.yardoc_file_for_gem(spec.name) + next if yfile.nil? + + if spec.name =~ /^yard-doc-/ + gem_paths.unshift(yfile) + else + gem_paths.push(yfile) + end + end + @search_paths += gem_paths + rescue LoadError + nil # noop + end + + # Adds paths in {SEARCH_PATHS_FILE} + # @since 0.5.1 + def add_default_paths + @search_paths.concat(DEFAULT_SEARCH_PATHS) + return unless File.file?(SEARCH_PATHS_FILE) + paths = File.readlines(SEARCH_PATHS_FILE).map(&:strip) + @search_paths.concat(paths) + end + + # Parses commandline options. + # @param [Array] args each tokenized argument + def optparse(*args) + opts = OptionParser.new + opts.banner = "Usage: yri [options] " + opts.separator "Example: yri String#gsub" + opts.separator "" + opts.separator "General Options:" + + opts.on('-b', '--db FILE', 'Use a specified .yardoc db to search in') do |yfile| + @search_paths.unshift(yfile) + end + + opts.on('-T', '--no-pager', 'No pager') do + @serializer = YARD::Serializers::StdoutSerializer.new + end + + opts.on('-p PAGER', '--pager') do |pager| + @serializer = YARD::Serializers::ProcessSerializer.new(pager) + end + + common_options(opts) + parse_options(opts, args) + @name = args.first + end + end + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/code_objects/base.rb b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/code_objects/base.rb new file mode 100644 index 000000000..5a724cf24 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/code_objects/base.rb @@ -0,0 +1,622 @@ +# frozen_string_literal: true +module YARD + module CodeObjects + # A list of code objects. This array acts like a set (no unique items) + # but also disallows any {Proxy} objects from being added. + class CodeObjectList < Array + # Creates a new object list associated with a namespace + # + # @param [NamespaceObject] owner the namespace the list should be associated with + # @return [CodeObjectList] + def initialize(owner = Registry.root) + @owner = owner + end + + # Adds a new value to the list + # + # @param [Base] value a code object to add + # @return [CodeObjectList] self + def push(value) + value = Proxy.new(@owner, value) if value.is_a?(String) || value.is_a?(Symbol) + if value.is_a?(CodeObjects::Base) || value.is_a?(Proxy) + super(value) unless include?(value) + else + raise ArgumentError, "#{value.class} is not a valid CodeObject" + end + self + end + alias << push + end + + extend NamespaceMapper + + # Namespace separator + NSEP = '::' + + # Regex-quoted namespace separator + NSEPQ = NSEP + + # Instance method separator + ISEP = '#' + + # Regex-quoted instance method separator + ISEPQ = ISEP + + # Class method separator + CSEP = '.' + + # Regex-quoted class method separator + CSEPQ = Regexp.quote CSEP + + # Regular expression to match constant name + CONSTANTMATCH = /[A-Z]\w*/ + + # Regular expression to match the beginning of a constant + CONSTANTSTART = /^[A-Z]/ + + # Regular expression to match namespaces (const A or complex path A::B) + NAMESPACEMATCH = /(?:(?:#{NSEPQ}\s*)?#{CONSTANTMATCH})+/ + + # Regular expression to match a method name + METHODNAMEMATCH = %r{[a-zA-Z_]\w*[!?=]?|[-+~]\@|<<|>>|=~|===?|![=~]?|<=>|[<>]=?|\*\*|[-/+%^&*~`|]|\[\]=?} + + # Regular expression to match a fully qualified method def (self.foo, Class.foo). + METHODMATCH = /(?:(?:#{NAMESPACEMATCH}|[a-z]\w*)\s*(?:#{CSEPQ}|#{NSEPQ})\s*)?#{METHODNAMEMATCH}/ + + # All builtin Ruby exception classes for inheritance tree. + BUILTIN_EXCEPTIONS = ["ArgumentError", "ClosedQueueError", "EncodingError", + "EOFError", "Exception", "FiberError", "FloatDomainError", "IndexError", + "Interrupt", "IOError", "KeyError", "LoadError", "LocalJumpError", + "NameError", "NoMemoryError", "NoMethodError", "NotImplementedError", + "RangeError", "RegexpError", "RuntimeError", "ScriptError", "SecurityError", + "SignalException", "StandardError", "StopIteration", "SyntaxError", + "SystemCallError", "SystemExit", "SystemStackError", "ThreadError", + "TypeError", "UncaughtThrowError", "ZeroDivisionError"] + + # All builtin Ruby classes for inheritance tree. + # @note MatchingData is a 1.8.x legacy class + BUILTIN_CLASSES = ["Array", "Bignum", "Binding", "Class", "Complex", + "ConditionVariable", "Data", "Dir", "Encoding", "Enumerator", "FalseClass", + "Fiber", "File", "Fixnum", "Float", "Hash", "IO", "Integer", "MatchData", + "Method", "Module", "NilClass", "Numeric", "Object", "Proc", "Queue", + "Random", "Range", "Rational", "Regexp", "RubyVM", "SizedQueue", "String", + "Struct", "Symbol", "Thread", "ThreadGroup", "Time", "TracePoint", + "TrueClass", "UnboundMethod"] + BUILTIN_EXCEPTIONS + + # All builtin Ruby modules for mixin handling. + BUILTIN_MODULES = ["Comparable", "Enumerable", "Errno", "FileTest", "GC", + "Kernel", "Marshal", "Math", "ObjectSpace", "Precision", "Process", "Signal"] + + # All builtin Ruby classes and modules. + BUILTIN_ALL = BUILTIN_CLASSES + BUILTIN_MODULES + + # Hash of {BUILTIN_EXCEPTIONS} as keys and true as value (for O(1) lookups) + BUILTIN_EXCEPTIONS_HASH = BUILTIN_EXCEPTIONS.inject({}) {|h, n| h.update(n => true) } + + # +Base+ is the superclass of all code objects recognized by YARD. A code + # object is any entity in the Ruby language (class, method, module). A + # DSL might subclass +Base+ to create a new custom object representing + # a new entity type. + # + # == Registry Integration + # Any created object associated with a namespace is immediately registered + # with the registry. This allows the Registry to act as an identity map + # to ensure that no object is represented by more than one Ruby object + # in memory. A unique {#path} is essential for this identity map to work + # correctly. + # + # == Custom Attributes + # Code objects allow arbitrary custom attributes to be set using the + # {#[]=} assignment method. + # + # == Namespaces + # There is a special type of object called a "namespace". These are subclasses + # of the {NamespaceObject} and represent Ruby entities that can have + # objects defined within them. Classically these are modules and classes, + # though a DSL might create a custom {NamespaceObject} to describe a + # specific set of objects. + # + # == Separators + # Custom classes with different separator tokens should define their own + # separators using the {NamespaceMapper.register_separator} method. The + # standard Ruby separators have already been defined ('::', '#', '.', etc). + # + # @abstract This class should not be used directly. Instead, create a + # subclass that implements {#path}, {#sep} or {#type}. You might also + # need to register custom separators if {#sep} uses alternate separator + # tokens. + # @see Registry + # @see #path + # @see #[]= + # @see NamespaceObject + # @see NamespaceMapper.register_separator + class Base + # The files the object was defined in. To add a file, use {#add_file}. + # @return [Array] a list of files + # @see #add_file + attr_reader :files + + # The namespace the object is defined in. If the object is in the + # top level namespace, this is {Registry.root} + # @return [NamespaceObject] the namespace object + attr_reader :namespace + + # The source code associated with the object + # @return [String, nil] source, if present, or nil + attr_reader :source + + # Language of the source code associated with the object. Defaults to + # +:ruby+. + # + # @return [Symbol] the language type + attr_accessor :source_type + + # The one line signature representing an object. For a method, this will + # be of the form "def meth(arguments...)". This is usually the first + # source line. + # + # @return [String] a line of source + attr_accessor :signature + + # The non-localized documentation string associated with the object + # @return [Docstring] the documentation string + # @since 0.8.4 + attr_reader :base_docstring + undef base_docstring + def base_docstring; @docstring end + + # Marks whether or not the method is conditionally defined at runtime + # @return [Boolean] true if the method is conditionally defined at runtime + attr_accessor :dynamic + + # @return [String] the group this object is associated with + # @since 0.6.0 + attr_accessor :group + + # Is the object defined conditionally at runtime? + # @see #dynamic + def dynamic?; @dynamic end + + # @return [Symbol] the visibility of an object (:public, :private, :protected) + attr_accessor :visibility + undef visibility= + def visibility=(v) @visibility = v.to_sym end + + class << self + # Allocates a new code object + # @return [Base] + # @see #initialize + def new(namespace, name, *args, &block) + raise ArgumentError, "invalid empty object name" if name.to_s.empty? + if namespace.is_a?(ConstantObject) + unless namespace.value =~ /\A#{NAMESPACEMATCH}\Z/ + raise Parser::UndocumentableError, "constant mapping" + end + + namespace = Proxy.new(namespace.namespace, namespace.value) + end + + if name.to_s[0, 2] == NSEP + name = name.to_s[2..-1] + namespace = Registry.root + end + + if name =~ /(?:#{NSEPQ})([^:]+)$/ + return new(Proxy.new(namespace, $`), $1, *args, &block) + end + + obj = super(namespace, name, *args) + existing_obj = Registry.at(obj.path) + obj = existing_obj if existing_obj && existing_obj.class == self + yield(obj) if block_given? + obj + end + + # Compares the class with subclasses + # + # @param [Object] other the other object to compare classes with + # @return [Boolean] true if other is a subclass of self + def ===(other) + other.is_a?(self) + end + end + + # Creates a new code object + # + # @example Create a method in the root namespace + # CodeObjects::Base.new(:root, '#method') # => # + # @example Create class Z inside namespace X::Y + # CodeObjects::Base.new(P("X::Y"), :Z) # or + # CodeObjects::Base.new(Registry.root, "X::Y") + # @param [NamespaceObject] namespace the namespace the object belongs in, + # {Registry.root} or :root should be provided if it is associated with + # the top level namespace. + # @param [Symbol, String] name the name (or complex path) of the object. + # @yield [self] a block to perform any extra initialization on the object + # @yieldparam [Base] self the newly initialized code object + # @return [Base] the newly created object + def initialize(namespace, name, *) + if namespace && namespace != :root && + !namespace.is_a?(NamespaceObject) && !namespace.is_a?(Proxy) + raise ArgumentError, "Invalid namespace object: #{namespace}" + end + + @files = [] + @current_file_has_comments = false + @name = name.to_sym + @source_type = :ruby + @visibility = :public + @tags = [] + @docstrings = {} + @docstring = Docstring.new!('', [], self) + @namespace = nil + self.namespace = namespace + yield(self) if block_given? + end + + # Copies all data in this object to another code object, except for + # uniquely identifying information (path, namespace, name, scope). + # + # @param [Base] other the object to copy data to + # @return [Base] the other object + # @since 0.8.0 + def copy_to(other) + copyable_attributes.each do |ivar| + ivar = "@#{ivar}" + other.instance_variable_set(ivar, instance_variable_get(ivar)) + end + other.docstring = @docstring.to_raw + other + end + + # The name of the object + # @param [Boolean] prefix whether to show a prefix. Implement + # this in a subclass to define how the prefix is showed. + # @return [Symbol] if prefix is false, the symbolized name + # @return [String] if prefix is true, prefix + the name as a String. + # This must be implemented by the subclass. + def name(prefix = false) + prefix ? @name.to_s : (defined?(@name) && @name) + end + + # Associates a file with a code object, optionally adding the line where it was defined. + # By convention, '' should be used to associate code that comes form standard input. + # + # @param [String] file the filename ('' for standard input) + # @param [Fixnum, nil] line the line number where the object lies in the file + # @param [Boolean] has_comments whether or not the definition has comments associated. This + # will allow {#file} to return the definition where the comments were made instead + # of any empty definitions that might have been parsed before (module namespaces for instance). + def add_file(file, line = nil, has_comments = false) + raise(ArgumentError, "file cannot be nil or empty") if file.nil? || file == '' + obj = [file.to_s, line] + return if files.include?(obj) + if has_comments && !@current_file_has_comments + @current_file_has_comments = true + @files.unshift(obj) + else + @files << obj # back of the line + end + end + + # Returns the filename the object was first parsed at, taking + # definitions with docstrings first. + # + # @return [String] a filename + def file + @files.first ? @files.first[0] : nil + end + + # Returns the line the object was first parsed at (or nil) + # + # @return [Fixnum] the line where the object was first defined. + # @return [nil] if there is no line associated with the object + def line + @files.first ? @files.first[1] : nil + end + + # Tests if another object is equal to this, including a proxy + # @param [Base, Proxy] other if other is a {Proxy}, tests if + # the paths are equal + # @return [Boolean] whether or not the objects are considered the same + def equal?(other) + if other.is_a?(Base) || other.is_a?(Proxy) + path == other.path + else + super + end + end + alias == equal? + alias eql? equal? + + # @return [Integer] the object's hash value (for equality checking) + def hash; path.hash end + + # @return [nil] this object does not turn into an array + def to_ary; nil end + + # Accesses a custom attribute on the object + # @param [#to_s] key the name of the custom attribute + # @return [Object, nil] the custom attribute or nil if not found. + # @see #[]= + def [](key) + if respond_to?(key) + send(key) + elsif instance_variable_defined?("@#{key}") + instance_variable_get("@#{key}") + end + end + + # Sets a custom attribute on the object + # @param [#to_s] key the name of the custom attribute + # @param [Object] value the value to associate + # @return [void] + # @see #[] + def []=(key, value) + if respond_to?("#{key}=") + send("#{key}=", value) + else + instance_variable_set("@#{key}", value) + end + end + + # @overload dynamic_attr_name + # @return the value of attribute named by the method attribute name + # @raise [NoMethodError] if no method or custom attribute exists by + # the attribute name + # @see #[] + # @overload dynamic_attr_name=(value) + # @param value a value to set + # @return +value+ + # @see #[]= + def method_missing(meth, *args, &block) + if meth.to_s =~ /=$/ + self[meth.to_s[0..-2]] = args.first + elsif instance_variable_get("@#{meth}") + self[meth] + else + super + end + end + + # Attaches source code to a code object with an optional file location + # + # @param [#source, String] statement + # the +Parser::Statement+ holding the source code or the raw source + # as a +String+ for the definition of the code object only (not the block) + def source=(statement) + if statement.respond_to?(:source) + @source = format_source(statement.source.strip) + else + @source = format_source(statement.to_s) + end + + if statement.respond_to?(:signature) + self.signature = statement.signature + end + end + + # The documentation string associated with the object + # + # @param [String, I18n::Locale] locale (I18n::Locale.default) + # the locale of the documentation string. + # @return [Docstring] the documentation string + def docstring(locale = I18n::Locale.default) + if locale.nil? + @docstring.resolve_reference + return @docstring + end + + if locale.is_a?(String) + locale_name = locale + locale = nil + else + locale_name = locale.name + end + @docstrings[locale_name] ||= + translate_docstring(locale || Registry.locale(locale_name)) + end + + # Attaches a docstring to a code object by parsing the comments attached to the statement + # and filling the {#tags} and {#docstring} methods with the parsed information. + # + # @param [String, Array, Docstring] comments + # the comments attached to the code object to be parsed + # into a docstring and meta tags. + def docstring=(comments) + @docstrings.clear + @docstring = Docstring === comments ? + comments : Docstring.new(comments, self) + end + + # Default type is the lowercase class name without the "Object" suffix. + # Override this method to provide a custom object type + # + # @return [Symbol] the type of code object this represents + def type + self.class.name.split('::').last.gsub(/Object$/, '').downcase.to_sym + end + + # Represents the unique path of the object. The default implementation + # joins the path of {#namespace} with {#name} via the value of {#sep}. + # Custom code objects should ensure that the path is unique to the code + # object by either overriding {#sep} or this method. + # + # @example The path of an instance method + # MethodObject.new(P("A::B"), :c).path # => "A::B#c" + # @return [String] the unique path of the object + # @see #sep + def path + @path ||= if parent && !parent.root? + [parent.path, name.to_s].join(sep) + else + name.to_s + end + end + alias to_s path + + # @note + # Override this method if your object has a special title that does + # not match the {#path} attribute value. This title will be used + # when linking or displaying the object. + # @return [String] the display title for an object + # @see 0.8.4 + def title + path + end + + # @param [Base, String] other another code object (or object path) + # @return [String] the shortest relative path from this object to +other+ + # @since 0.5.3 + def relative_path(other) + other = Registry.at(other) if String === other && Registry.at(other) + same_parent = false + if other.respond_to?(:path) + same_parent = other.parent == parent + other = other.path + end + return other unless namespace + common = [path, other].join(" ").match(/^(\S*)\S*(?: \1\S*)*$/)[1] + common = path unless common =~ /(\.|::|#)$/ + common = common.sub(/(\.|::|#)[^:#\.]*?$/, '') if same_parent + suffix = %w(. :).include?(common[-1, 1]) || other[common.size, 1] == '#' ? + '' : '(::|\.)' + result = other.sub(/^#{Regexp.quote common}#{suffix}/, '') + result.empty? ? other : result + end + + # Renders the object using the {Templates::Engine templating system}. + # + # @example Formats a class in plaintext + # puts P('MyClass').format + # @example Formats a method in html with rdoc markup + # puts P('MyClass#meth').format(:format => :html, :markup => :rdoc) + # @param [Hash] options a set of options to pass to the template + # @option options [Symbol] :format (:text) :html, :text or another output format + # @option options [Symbol] :template (:default) a specific template to use + # @option options [Symbol] :markup (nil) the markup type (:rdoc, :markdown, :textile) + # @option options [Serializers::Base] :serializer (nil) see Serializers + # @return [String] the rendered template + # @see Templates::Engine#render + def format(options = {}) + options = options.merge(:object => self) + options = options.merge(:type => type) unless options[:type] + Templates::Engine.render(options) + end + + # Inspects the object, returning the type and path + # @return [String] a string describing the object + def inspect + "#" + end + + # Sets the namespace the object is defined in. + # + # @param [NamespaceObject, :root, nil] obj the new namespace (:root + # for {Registry.root}). If obj is nil, the object is unregistered + # from the Registry. + def namespace=(obj) + if @namespace + @namespace.children.delete(self) + Registry.delete(self) + end + + @namespace = (obj == :root ? Registry.root : obj) + + if @namespace + reg_obj = Registry.at(path) + return if reg_obj && reg_obj.class == self.class + + unless @namespace.is_a?(Proxy) + # remove prior objects from obj's children that match this one + @namespace.children.delete_if {|o| o.path == path } + @namespace.children << self + end + Registry.register(self) + end + end + + alias parent namespace + alias parent= namespace= + + # Gets a tag from the {#docstring} + # @see Docstring#tag + def tag(name); docstring.tag(name) end + + # Gets a list of tags from the {#docstring} + # @see Docstring#tags + def tags(name = nil); docstring.tags(name) end + + # Tests if the {#docstring} has a tag + # @see Docstring#has_tag? + def has_tag?(name); docstring.has_tag?(name) end + + # Add tags to the {#docstring} + # @see Docstring#add_tag + # @since 0.8.4 + def add_tag(*tags) + @docstrings.clear + @docstring.add_tag(*tags) + end + + # @return whether or not this object is a RootObject + def root?; false end + + # Override this method with a custom component separator. For instance, + # {MethodObject} implements sep as '#' or '.' (depending on if the + # method is instance or class respectively). {#path} depends on this + # value to generate the full path in the form: namespace.path + sep + name + # + # @return [String] the component that separates the namespace path + # and the name (default is {NSEP}) + def sep; NSEP end + + protected + + # Override this method if your code object subclass does not allow + # copying of certain attributes. + # + # @return [Array] the list of instance variable names (without + # "@" prefix) that should be copied when {#copy_to} is called + # @see #copy_to + # @since 0.8.0 + def copyable_attributes + vars = instance_variables.map {|ivar| ivar.to_s[1..-1] } + vars -= %w(docstring docstrings namespace name path) + vars + end + + private + + # Formats source code by removing leading indentation + # + # @param [String] source the source code to format + # @return [String] formatted source + def format_source(source) + source = source.chomp + last = source.split(/\r?\n/).last + indent = last ? last[/^([ \t]*)/, 1].length : 0 + source.gsub(/^[ \t]{#{indent}}/, '') + end + + def translate_docstring(locale) + @docstring.resolve_reference + return @docstring if locale.nil? + + text = I18n::Text.new(@docstring) + localized_text = text.translate(locale) + docstring = Docstring.new(localized_text, self) + @docstring.tags.each do |tag| + if tag.is_a?(Tags::Tag) + localized_tag = tag.clone + localized_tag.text = I18n::Text.new(tag.text).translate(locale) + docstring.add_tag(localized_tag) + else + docstring.add_tag(tag) + end + end + docstring + end + end + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/code_objects/class_object.rb b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/code_objects/class_object.rb new file mode 100644 index 000000000..125cc9760 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/code_objects/class_object.rb @@ -0,0 +1,146 @@ +# frozen_string_literal: true +module YARD::CodeObjects + register_separator NSEP, :class + + # A ClassObject represents a Ruby class in source code. It is a {ModuleObject} + # with extra inheritance semantics through the superclass. + class ClassObject < NamespaceObject + # The {ClassObject} that this class object inherits from in Ruby source. + # @return [ClassObject] a class object that is the superclass of this one + attr_reader :superclass + + # Creates a new class object in +namespace+ with +name+ + # + # @see Base.new + def initialize(namespace, name, *args, &block) + super + + if is_exception? + self.superclass ||= "::Exception" unless P(namespace, name) == P(:Exception) + else + case P(namespace, name).path + when "BasicObject" + nil + when "Object" + self.superclass ||= "::BasicObject" + else + self.superclass ||= "::Object" + end + end + end + + # Whether or not the class is a Ruby Exception + # + # @return [Boolean] whether the object represents a Ruby exception + def is_exception? + inheritance_tree.reverse.any? {|o| BUILTIN_EXCEPTIONS_HASH.key? o.path } + end + + # Returns the inheritance tree of the object including self. + # + # @param [Boolean] include_mods whether or not to include mixins in the + # inheritance tree. + # @return [Array] the list of code objects that make up + # the inheritance tree. + def inheritance_tree(include_mods = false) + list = (include_mods ? mixins(:instance, :class) : []) + if superclass.is_a?(Proxy) || superclass.respond_to?(:inheritance_tree) + list += [superclass] unless superclass == P(:Object) || superclass == P(:BasicObject) + end + [self] + list.map do |m| + next m if m == self + next m unless m.respond_to?(:inheritance_tree) + m.inheritance_tree(include_mods) + end.flatten.uniq + end + + # Returns the list of methods matching the options hash. Returns + # all methods if hash is empty. + # + # @param [Hash] opts the options hash to match + # @option opts [Boolean] :inherited (true) whether inherited methods should be + # included in the list + # @option opts [Boolean] :included (true) whether mixed in methods should be + # included in the list + # @return [Array] the list of methods that matched + def meths(opts = {}) + opts = SymbolHash[:inherited => true].update(opts) + list = super(opts) + list += inherited_meths(opts).reject do |o| + next(false) if opts[:all] + list.find {|o2| o2.name == o.name && o2.scope == o.scope } + end if opts[:inherited] + list + end + + # Returns only the methods that were inherited. + # + # @return [Array] the list of inherited method objects + def inherited_meths(opts = {}) + inheritance_tree[1..-1].inject([]) do |list, superclass| + if superclass.is_a?(Proxy) + list + else + list += superclass.meths(opts).reject do |o| + next(false) if opts[:all] + child(:name => o.name, :scope => o.scope) || + list.find {|o2| o2.name == o.name && o2.scope == o.scope } + end + end + end + end + + # Returns the list of constants matching the options hash. + # + # @param [Hash] opts the options hash to match + # @option opts [Boolean] :inherited (true) whether inherited constant should be + # included in the list + # @option opts [Boolean] :included (true) whether mixed in constant should be + # included in the list + # @return [Array] the list of constant that matched + def constants(opts = {}) + opts = SymbolHash[:inherited => true].update(opts) + super(opts) + (opts[:inherited] ? inherited_constants : []) + end + + # Returns only the constants that were inherited. + # + # @return [Array] the list of inherited constant objects + def inherited_constants + inheritance_tree[1..-1].inject([]) do |list, superclass| + if superclass.is_a?(Proxy) + list + else + list += superclass.constants.reject do |o| + child(:name => o.name) || list.find {|o2| o2.name == o.name } + end + end + end + end + + # Sets the superclass of the object + # + # @param [Base, Proxy, String, Symbol, nil] object the superclass value + # @return [void] + def superclass=(object) + case object + when Base, Proxy, NilClass + @superclass = object + when String, Symbol + @superclass = Proxy.new(namespace, object) + else + raise ArgumentError, "superclass must be CodeObject, Proxy, String or Symbol" + end + + if name == @superclass.name && namespace != YARD::Registry.root && !object.is_a?(Base) + @superclass = Proxy.new(namespace.namespace, object) + end + + if @superclass == self + msg = "superclass #{@superclass.inspect} cannot be the same as the declared class #{inspect}" + @superclass = P("::Object") + raise ArgumentError, msg + end + end + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/code_objects/class_variable_object.rb b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/code_objects/class_variable_object.rb new file mode 100644 index 000000000..ddd2ffa4b --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/code_objects/class_variable_object.rb @@ -0,0 +1,11 @@ +# frozen_string_literal: true +module YARD::CodeObjects + register_separator NSEP, :class_variable + + # Represents a class variable inside a namespace. The path is expressed + # in the form "A::B::@@classvariable" + class ClassVariableObject < Base + # @return [String] the class variable's value + attr_accessor :value + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/code_objects/constant_object.rb b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/code_objects/constant_object.rb new file mode 100644 index 000000000..b7904648b --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/code_objects/constant_object.rb @@ -0,0 +1,16 @@ +# frozen_string_literal: true +module YARD::CodeObjects + register_separator NSEP, :constant + + # A +ConstantObject+ represents a Ruby constant (not a module or class). + # To access the constant's (source code) value, use {#value}. + class ConstantObject < Base + # The source code representing the constant's value + # @return [String] the value the constant is set to + attr_reader :value + + def value=(value) + @value = format_source(value) + end + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/code_objects/extended_method_object.rb b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/code_objects/extended_method_object.rb new file mode 100644 index 000000000..b96794076 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/code_objects/extended_method_object.rb @@ -0,0 +1,24 @@ +# frozen_string_literal: true +module YARD::CodeObjects + # Represents an instance method of a module that was mixed into the class + # scope of another namespace. + # + # @see MethodObject + class ExtendedMethodObject + instance_methods.each {|m| undef_method(m) unless m =~ /^__/ || m.to_sym == :object_id } + + # @return [Symbol] always +:class+ + def scope; :class end + + # Sets up a delegate for {MethodObject} obj. + # + # @param [MethodObject] obj the instance method to treat as a mixed in + # class method on another namespace. + def initialize(obj) @del = obj end + + # Sends all methods to the {MethodObject} assigned in {#initialize} + # @see #initialize + # @see MethodObject + def method_missing(sym, *args, &block) @del.__send__(sym, *args, &block) end + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/code_objects/extra_file_object.rb b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/code_objects/extra_file_object.rb new file mode 100644 index 000000000..c0f53a3e5 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/code_objects/extra_file_object.rb @@ -0,0 +1,134 @@ +# frozen_string_literal: true +module YARD::CodeObjects + # An ExtraFileObject represents an extra documentation file (README or other + # file). It is not strictly a CodeObject (does not inherit from `Base`) although + # it implements `path`, `name` and `type`, and therefore should be structurally + # compatible with most CodeObject interfaces. + class ExtraFileObject + attr_accessor :filename + attr_writer :attributes + attr_accessor :name + # @since 0.8.3 + attr_reader :locale + + # Creates a new extra file object. + # @param [String] filename the location on disk of the file + # @param [String] contents the file contents. If not set, the contents + # will be read from disk using the +filename+. + def initialize(filename, contents = nil) + self.filename = filename + self.name = File.basename(filename).gsub(/\.[^.]+$/, '') + self.attributes = SymbolHash.new(false) + @original_contents = contents + @parsed = false + @locale = nil + ensure_parsed + end + + alias path name + + def attributes + ensure_parsed + @attributes + end + + def title + attributes[:title] || name + end + + def contents + ensure_parsed + @contents + end + + def contents=(contents) + @original_contents = contents + @parsed = false + end + + # @param [String] locale the locale name to be translated. + # @return [void] + # @since 0.8.3 + def locale=(locale) + @locale = locale + @parsed = false + end + + def inspect + "#" + end + alias to_s inspect + + def type; :extra_file end + + def ==(other) + return false unless self.class === other + other.filename == filename + end + alias eql? == + alias equal? == + def hash; filename.hash end + + private + + def ensure_parsed + return if @parsed + @parsed = true + @contents = parse_contents(@original_contents || File.read(@filename)) + end + + # @param [String] data the file contents + def parse_contents(data) + retried = false + cut_index = 0 + data = translate(data) + data = data.split("\n") + data.each_with_index do |line, index| + case line + when /^#!(\S+)\s*$/ + if index == 0 + attributes[:markup] = $1 + else + cut_index = index + break + end + when /^\s*#\s*@(\S+)\s*(.+?)\s*$/ + attributes[$1] = $2 + when /^\s*\s*$/ + # Ignore HTML comments + else + cut_index = index + break + end + end + data = data[cut_index..-1] if cut_index > 0 + contents = data.join("\n") + + if contents.respond_to?(:force_encoding) && attributes[:encoding] + begin + contents.force_encoding(attributes[:encoding]) + rescue ArgumentError + log.warn "Invalid encoding `#{attributes[:encoding]}' in #{filename}" + end + end + contents + rescue ArgumentError => e + raise unless e.message =~ /invalid byte sequence/ + + if retried + # This should never happen. + log.warn "Could not read #{filename}, #{e.message}. You probably want to set `--charset`." + return '' + else + data.force_encoding('binary') if data.respond_to?(:force_encoding) + retried = true + retry + end + end + + def translate(data) + text = YARD::I18n::Text.new(data, :have_header => true) + text.translate(YARD::Registry.locale(locale)) + end + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/code_objects/macro_object.rb b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/code_objects/macro_object.rb new file mode 100644 index 000000000..235de4207 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/code_objects/macro_object.rb @@ -0,0 +1,172 @@ +# frozen_string_literal: true +require 'ostruct' + +module YARD + module CodeObjects + # A MacroObject represents a docstring defined through +@!macro NAME+ and can be + # reused by specifying the tag +@!macro NAME+. You can also provide the + # +attached+ type flag to the macro definition to have it attached to the + # specific DSL method so it will be implicitly reused. + # + # Macros are fully described in the {file:docs/Tags.md#macro Tags Overview} + # document. + # + # @example Creating a basic named macro + # # @!macro prop + # # @!method $1(${3-}) + # # @return [$2] the value of the $0 + # property :foo, String, :a, :b + # + # # @!macro prop + # property :bar, Numeric, :value + # + # @example Creating a macro that is attached to the method call + # # @!macro [attach] prop2 + # # @!method $1(value) + # property :foo + # + # # Extra data added to docstring + # property :bar + class MacroObject < Base + MACRO_MATCH = /(\\)?\$(?:\{(-?\d+|\*)(-)?(-?\d+)?\}|(-?\d+|\*))/ + + class << self + # Creates a new macro and fills in the relevant properties. + # @param [String] macro_name the name of the macro, must be unique. + # @param [String] data the data the macro should expand when re-used + # @param [CodeObjects::Base] method_object an object to attach this + # macro to. If supplied, {#attached?} will be true + # @return [MacroObject] the newly created object + def create(macro_name, data, method_object = nil) + obj = new(:root, macro_name) + obj.macro_data = data + obj.method_object = method_object + obj + end + + # Finds a macro using +macro_name+ + # @param [#to_s] macro_name the name of the macro + # @return [MacroObject] if a macro is found + # @return [nil] if there is no registered macro by that name + def find(macro_name) + Registry.at('.macro.' + macro_name.to_s) + end + + # Parses a given docstring and determines if the macro is "new" or + # not. If the macro has $variable names or if it has a @!macro tag + # with the [new] or [attached] flag, it is considered new. + # + # If a new macro is found, the macro is created and registered. Otherwise + # the macro name is searched and returned. If a macro is not found, + # nil is returned. + # + # @param [#to_s] macro_name the name of the macro + # @param [CodeObjects::Base] method_object an optional method to attach + # the macro to. Only used if the macro is being created, otherwise + # this argument is ignored. + # @return [MacroObject] the newly created or existing macro, depending + # on whether the @!macro tag was a new tag or not. + # @return [nil] if the +data+ has no macro tag or if the macro is + # not new and no macro by the macro name is found. + def find_or_create(macro_name, data, method_object = nil) + find(name) || create(macro_name, data, method_object) + end + alias create_docstring find_or_create + + # Expands +macro_data+ using the interpolation parameters. + # + # Interpolation rules: + # * $0, $1, $2, ... = the Nth parameter in +call_params+ + # * $* = the full statement source (excluding block) + # * Also supports $!{N-M} ranges, as well as negative indexes on N or M + # * Use \$ to escape the variable name in a macro. + # + # @!macro [new] macro.expand + # @param [Array] call_params the method name and parameters + # to the method call. These arguments will fill \$0-N + # @param [String] full_source the full source line (excluding block) + # interpolated as \$* + # @param [String] block_source Currently unused. Will support + # interpolating the block data as a variable. + # @return [String] the expanded macro data + # @param [String] macro_data the macro data to expand (taken from {#macro_data}) + def expand(macro_data, call_params = [], full_source = '', block_source = '') # rubocop:disable Lint/UnusedMethodArgument + macro_data = macro_data.all if macro_data.is_a?(Docstring) + macro_data.gsub(MACRO_MATCH) do + escape = $1 + first = $2 || $5 + last = $4 + rng = $3 ? true : false + next $&[1..-1] if escape + if first == '*' + last ? $& : full_source + else + first_i = first.to_i + last_i = (last ? last.to_i : call_params.size) + last_i = first_i unless rng + params = call_params[first_i..last_i] + params ? params.join(", ") : '' + end + end + end + + # Applies a macro on a docstring by creating any macro data inside of + # the docstring first. Equivalent to calling {find_or_create} and {apply_macro} + # on the new macro object. + # + # @param [Docstring] docstring the docstring to create a macro out of + # @!macro macro.expand + # @see find_or_create + def apply(docstring, call_params = [], full_source = '', block_source = '', _method_object = nil) # rubocop:disable Lint/UnusedMethodArgument + docstring = docstring.all if Docstring === docstring + parser = Docstring.parser + handler = OpenStruct.new + handler.call_params = call_params[1..-1] + handler.caller_method = call_params.first + handler.statement = OpenStruct.new(:source => full_source) + parser.parse(docstring, nil, handler).to_docstring.to_raw + end + + # Applies a macro to a docstring, interpolating the macro's data on the + # docstring and appending any extra local docstring data that was in + # the original +docstring+ object. + # + # @param [MacroObject] macro the macro object + # @!macro macro.expand + def apply_macro(macro, docstring, call_params = [], full_source = '', block_source = '') # rubocop:disable Lint/UnusedMethodArgument + apply(docstring, call_params, full_source, block_source) + end + end + + # @return [String] the macro data stored on the object + attr_accessor :macro_data + + # @return [CodeObjects::Base] the method object that this macro is + # attached to. + attr_accessor :method_object + + # @return [Boolean] whether this macro is attached to a method + def attached?; method_object ? true : false end + + # Overrides {Base#path} so the macro path is ".macro.MACRONAME" + def path; '.macro.' + name.to_s end + + # Overrides the separator to be '.' + def sep; '.' end + + # Expands the macro using + # @param [Array] call_params a list of tokens that are passed + # to the method call + # @param [String] full_source the full method call (not including the block) + # @param [String] block_source the source passed in the block of the method + # call, if there is a block. + # @example Expanding a Macro + # macro.expand(%w(property foo bar), 'property :foo, :bar', '') #=> + # "...macro data interpolating this line of code..." + # @see expand + def expand(call_params = [], full_source = '', block_source = '') + self.class.expand(macro_data, call_params, full_source, block_source) + end + end + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/code_objects/method_object.rb b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/code_objects/method_object.rb new file mode 100644 index 000000000..c34ef3a29 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/code_objects/method_object.rb @@ -0,0 +1,196 @@ +# frozen_string_literal: true +module YARD::CodeObjects + register_separator CSEP, :method + register_separator ISEP, :method + + # Represents a Ruby method in source + class MethodObject < Base + # The scope of the method (+:class+ or +:instance+) + # + # @return [Symbol] the scope + attr_reader :scope + + # Whether the object is explicitly defined in source or whether it was + # inferred by a handler. For instance, attribute methods are generally + # inferred and therefore not explicitly defined in source. + # + # @return [Boolean] whether the object is explicitly defined in source. + attr_accessor :explicit + + # Returns the list of parameters parsed out of the method signature + # with their default values. + # + # @return [Array] a list of parameter names followed + # by their default values (or nil) + attr_accessor :parameters + + # Creates a new method object in +namespace+ with +name+ and an instance + # or class +scope+ + # + # If scope is +:module+, this object is instantiated as a public + # method in +:class+ scope, but also creates a new (empty) method + # as a private +:instance+ method on the same class or module. + # + # @param [NamespaceObject] namespace the namespace + # @param [String, Symbol] name the method name + # @param [Symbol] scope +:instance+, +:class+, or +:module+ + def initialize(namespace, name, scope = :instance, &block) + @module_function = false + @scope = nil + + # handle module function + if scope == :module + other = self.class.new(namespace, name, &block) + other.visibility = :private + scope = :class + @module_function = true + end + + @visibility = :public + self.scope = scope + self.parameters = [] + + super + end + + # Changes the scope of an object from :instance or :class + # @param [Symbol] v the new scope + def scope=(v) + reregister = @scope ? true : false + + # handle module function + if v == :module + other = self.class.new(namespace, name) + other.visibility = :private + @visibility = :public + @module_function = true + @path = nil + end + + YARD::Registry.delete(self) + @path = nil + @scope = v.to_sym + @scope = :class if @scope == :module + YARD::Registry.register(self) if reregister + end + + # @return whether or not the method is the #initialize constructor method + def constructor? + name == :initialize && scope == :instance && namespace.is_a?(ClassObject) + end + + # @return [Boolean] whether or not this method was created as a module + # function + # @since 0.8.0 + def module_function? + @module_function + end + + # Returns the read/writer info for the attribute if it is one + # @return [SymbolHash] if there is information about the attribute + # @return [nil] if the method is not an attribute + # @since 0.5.3 + def attr_info + return nil unless namespace.is_a?(NamespaceObject) + namespace.attributes[scope][name.to_s.gsub(/=$/, '')] + end + + # @return [Boolean] whether the method is a writer attribute + # @since 0.5.3 + def writer? + info = attr_info + info && info[:write] == self ? true : false + end + + # @return [Boolean] whether the method is a reader attribute + # @since 0.5.3 + def reader? + info = attr_info + info && info[:read] == self ? true : false + end + + # Tests if the object is defined as an attribute in the namespace + # @return [Boolean] whether the object is an attribute + def is_attribute? + info = attr_info + if info + read_or_write = name.to_s =~ /=$/ ? :write : :read + info[read_or_write] ? true : false + else + false + end + end + + # Tests if the object is defined as an alias of another method + # @return [Boolean] whether the object is an alias + def is_alias? + return false unless namespace.is_a?(NamespaceObject) + namespace.aliases.key? self + end + + # Tests boolean {#explicit} value. + # + # @return [Boolean] whether the method is explicitly defined in source + def is_explicit? + explicit ? true : false + end + + # @return [MethodObject] the object that this method overrides + # @return [nil] if it does not override a method + # @since 0.6.0 + def overridden_method + return nil if namespace.is_a?(Proxy) + meths = namespace.meths(:all => true) + meths.find {|m| m.path != path && m.name == name && m.scope == scope } + end + + # Returns all alias names of the object + # @return [Array] the alias names + def aliases + list = [] + return list unless namespace.is_a?(NamespaceObject) + namespace.aliases.each do |o, aname| + list << o if aname == name && o.scope == scope + end + list + end + + # Override path handling for instance methods in the root namespace + # (they should still have a separator as a prefix). + # @return [String] the path of a method + def path + @path ||= !namespace || namespace.path == "" ? sep + super : super + end + + # Returns the name of the object. + # + # @example The name of an instance method (with prefix) + # an_instance_method.name(true) # => "#mymethod" + # @example The name of a class method (with prefix) + # a_class_method.name(true) # => "mymethod" + # @param [Boolean] prefix whether or not to show the prefix + # @return [String] returns {#sep} + +name+ for an instance method if + # prefix is true + # @return [Symbol] the name without {#sep} if prefix is set to false + def name(prefix = false) + prefix ? (sep == ISEP ? "#{sep}#{super}" : super.to_s) : super + end + + # Override separator to differentiate between class and instance + # methods. + # @return [String] "#" for an instance method, "." for class + def sep + if scope == :class + namespace && namespace != YARD::Registry.root ? CSEP : NSEP + else + ISEP + end + end + + protected + + def copyable_attributes + super - %w(scope module_function) + end + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/code_objects/module_object.rb b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/code_objects/module_object.rb new file mode 100644 index 000000000..838933e6a --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/code_objects/module_object.rb @@ -0,0 +1,21 @@ +# frozen_string_literal: true +module YARD::CodeObjects + register_separator NSEP, :module + + # Represents a Ruby module. + class ModuleObject < NamespaceObject + # Returns the inheritance tree of mixins. + # + # @param [Boolean] include_mods if true, will include mixed in + # modules (which is likely what is wanted). + # @return [Array] a list of namespace objects + def inheritance_tree(include_mods = false) + return [self] unless include_mods + [self] + mixins(:instance, :class).map do |m| + next if m == self + next m unless m.respond_to?(:inheritance_tree) + m.inheritance_tree(true) + end.compact.flatten.uniq + end + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/code_objects/namespace_mapper.rb b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/code_objects/namespace_mapper.rb new file mode 100644 index 000000000..ecb500513 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/code_objects/namespace_mapper.rb @@ -0,0 +1,141 @@ +# frozen_string_literal: true +module YARD + module CodeObjects + # This module controls registration and accessing of namespace separators + # for {Registry} lookup. + # + # @since 0.9.1 + module NamespaceMapper + # @!group Registering a Separator for a Namespace + + # Registers a separator with an optional set of valid types that + # must follow the separator lexically. + # + # Calls all callbacks defined by {NamespaceMapper.on_invalidate} after + # the separator is registered. + # + # @param sep [String] the separator string for the namespace + # @param valid_types [Array] a list of object types that + # must follow the separator. If the list is empty, any type can + # follow the separator. + # @example Registering separators for a method object + # # Anything after a "#" denotes a method object + # register_separator "#", :method + # # Anything after a "." denotes a method object + # register_separator ".", :method + # @see .on_invalidate + def register_separator(sep, *valid_types) + NamespaceMapper.invalidate + + valid_types.each do |t| + NamespaceMapper.rev_map[t] ||= [] + NamespaceMapper.rev_map[t] << sep + end + + NamespaceMapper.map[sep] ||= [] + NamespaceMapper.map[sep] += valid_types + end + + # Unregisters a separator by a type. + # + # @param type [Symbol] the type to unregister + # @see #register_separator + def unregister_separator_by_type(type) + seps = NamespaceMapper.rev_map[type] + return unless seps + + seps.each {|s| NamespaceMapper.map.delete(s) } + NamespaceMapper.rev_map.delete(type) + NamespaceMapper.invalidate + end + + # Clears the map of separators. + # + # @return [void] + def clear_separators + NamespaceMapper.invalidate + NamespaceMapper.map = {} + NamespaceMapper.rev_map = {} + end + + # Gets or sets the default separator value to use when no + # separator for the namespace can be determined. + # + # @param value [String, nil] the default separator, or nil to return the + # value + # @example + # default_separator "::" + def default_separator(value = nil) + if value + NamespaceMapper.invalidate + NamespaceMapper.default_separator = Regexp.quote value + else + NamespaceMapper.default_separator + end + end + + # @!group Separator and Type Lookup Helpers + + # @return [Array] all of the registered separators + def separators + NamespaceMapper.map.keys + end + + # @return [Regexp] the regexp match of all separators + def separators_match + NamespaceMapper.map_match + end + + # @param sep [String] the separator to return types for + # @return [Array] a list of types registered to a separator + def types_for_separator(sep) + NamespaceMapper.map[sep] || [] + end + + # @param type [String] the type to return separators for + # @return [Array] a list of separators registered to a type + def separators_for_type(type) + NamespaceMapper.rev_map[type] || [] + end + + # Internal methods to act as a singleton registry + class << self + # @!group Invalidation callbacks + + # Adds a callback that triggers when a new separator is registered or + # the cache is cleared by invalidation. + def on_invalidate(&block) + (@invalidation_callbacks ||= []).push(block) + end + + # @!visibility private + + # @return [Hash] a mapping of types to separators + def map + @map ||= {} + end + + # @return [Hash] a reverse mapping of separators to types + def rev_map + @rev_map ||= {} + end + + # Invalidates all separators + # @return [void] + def invalidate + @map_match = nil + (@invalidation_callbacks || []).each(&:call) + end + + # @return [Regexp] the full list of separators as a regexp match + def map_match + @map_match ||= map.keys.map {|k| Regexp.quote k }.join('|') + end + + # @return [String] the default separator when no separator can begin + # determined. + attr_accessor :default_separator + end + end + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/code_objects/namespace_object.rb b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/code_objects/namespace_object.rb new file mode 100644 index 000000000..25cdee110 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/code_objects/namespace_object.rb @@ -0,0 +1,200 @@ +# frozen_string_literal: true +module YARD::CodeObjects + register_separator NSEP, :namespace + default_separator NSEP + + # A "namespace" is any object that can store other objects within itself. + # The two main Ruby objects that can act as namespaces are modules + # ({ModuleObject}) and classes ({ClassObject}). + class NamespaceObject < Base + # @return [Array] a list of ordered group names inside the namespace + # @since 0.6.0 + attr_accessor :groups + + # The list of objects defined in this namespace + # @return [Array] a list of objects + attr_reader :children + + # A hash containing two keys, class and instance, each containing + # the attribute name with a { :read, :write } hash for the read and + # write objects respectively. + # + # @example The attributes of an object + # >> Registry.at('YARD::Docstring').attributes + # => { + # :class => { }, + # :instance => { + # :ref_tags => { + # :read => #, + # :write => nil + # }, + # :object => { + # :read => #, + # :write => # + # }, + # ... + # } + # } + # @return [Hash] a list of methods + attr_reader :attributes + + # A hash containing two keys, :class and :instance, each containing + # a hash of objects and their alias names. + # @return [Hash] a list of methods + attr_reader :aliases + + # Class mixins + # @return [Array] a list of mixins + attr_reader :class_mixins + + # Instance mixins + # @return [Array] a list of mixins + attr_reader :instance_mixins + + # Creates a new namespace object inside +namespace+ with +name+. + # @see Base#initialize + def initialize(namespace, name, *args, &block) + @children = CodeObjectList.new(self) + @class_mixins = CodeObjectList.new(self) + @instance_mixins = CodeObjectList.new(self) + @attributes = SymbolHash[:class => SymbolHash.new, :instance => SymbolHash.new] + @aliases = {} + @groups = [] + super + end + + # Only the class attributes + # @return [Hash] a list of method names and their read/write objects + # @see #attributes + def class_attributes + attributes[:class] + end + + # Only the instance attributes + # @return [Hash] a list of method names and their read/write objects + # @see #attributes + def instance_attributes + attributes[:instance] + end + + # Looks for a child that matches the attributes specified by +opts+. + # + # @example Finds a child by name and scope + # namespace.child(:name => :to_s, :scope => :instance) + # # => # + # @return [Base, nil] the first matched child object, or nil + def child(opts = {}) + if !opts.is_a?(Hash) + children.find {|o| o.name == opts.to_sym } + else + opts = SymbolHash[opts] + children.find do |obj| + opts.each do |meth, value| + break false unless value.is_a?(Array) ? value.include?(obj[meth]) : obj[meth] == value + end + end + end + end + + # Returns all methods that match the attributes specified by +opts+. If + # no options are provided, returns all methods. + # + # @example Finds all private and protected class methods + # namespace.meths(:visibility => [:private, :protected], :scope => :class) + # # => [#, #] + # @option opts [Array, Symbol] :visibility ([:public, :private, + # :protected]) the visibility of the methods to list. Can be an array or + # single value. + # @option opts [Array, Symbol] :scope ([:class, :instance]) the + # scope of the methods to list. Can be an array or single value. + # @option opts [Boolean] :included (true) whether to include mixed in + # methods in the list. + # @return [Array] a list of method objects + def meths(opts = {}) + opts = SymbolHash[ + :visibility => [:public, :private, :protected], + :scope => [:class, :instance], + :included => true + ].update(opts) + + opts[:visibility] = [opts[:visibility]].flatten + opts[:scope] = [opts[:scope]].flatten + + ourmeths = children.select do |o| + o.is_a?(MethodObject) && + opts[:visibility].include?(o.visibility) && + opts[:scope].include?(o.scope) + end + + ourmeths + (opts[:included] ? included_meths(opts) : []) + end + + # Returns methods included from any mixins that match the attributes + # specified by +opts+. If no options are specified, returns all included + # methods. + # + # @option opts [Array, Symbol] :visibility ([:public, :private, + # :protected]) the visibility of the methods to list. Can be an array or + # single value. + # @option opts [Array, Symbol] :scope ([:class, :instance]) the + # scope of the methods to list. Can be an array or single value. + # @option opts [Boolean] :included (true) whether to include mixed in + # methods in the list. + # @see #meths + def included_meths(opts = {}) + opts = SymbolHash[:scope => [:instance, :class]].update(opts) + [opts[:scope]].flatten.map do |scope| + mixins(scope).inject([]) do |list, mixin| + next list if mixin.is_a?(Proxy) + arr = mixin.meths(opts.merge(:scope => :instance)).reject do |o| + next false if opts[:all] + child(:name => o.name, :scope => scope) || list.find {|o2| o2.name == o.name } + end + arr.map! {|o| ExtendedMethodObject.new(o) } if scope == :class + list + arr + end + end.flatten + end + + # Returns all constants in the namespace + # + # @option opts [Boolean] :included (true) whether or not to include + # mixed in constants in list + # @return [Array] a list of constant objects + def constants(opts = {}) + opts = SymbolHash[:included => true].update(opts) + consts = children.select {|o| o.is_a? ConstantObject } + consts + (opts[:included] ? included_constants : []) + end + + # Returns constants included from any mixins + # @return [Array] a list of constant objects + def included_constants + instance_mixins.inject([]) do |list, mixin| + if mixin.respond_to? :constants + list += mixin.constants.reject do |o| + child(:name => o.name) || list.find {|o2| o2.name == o.name } + end + else + list + end + end + end + + # Returns class variables defined in this namespace. + # @return [Array] a list of class variable objects + def cvars + children.select {|o| o.is_a? ClassVariableObject } + end + + # Returns for specific scopes. If no scopes are provided, returns all mixins. + # @param [Array] scopes a list of scopes (:class, :instance) to + # return mixins for. If this is empty, all scopes will be returned. + # @return [Array] a list of mixins + def mixins(*scopes) + return class_mixins if scopes == [:class] + return instance_mixins if scopes == [:instance] + class_mixins | instance_mixins + end + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/code_objects/proxy.rb b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/code_objects/proxy.rb new file mode 100644 index 000000000..0b0a091ea --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/code_objects/proxy.rb @@ -0,0 +1,245 @@ +# frozen_string_literal: true +module YARD + module CodeObjects + # A special type of +NoMethodError+ when raised from a {Proxy} + class ProxyMethodError < NoMethodError; end + + # @private + PROXY_MATCH = /(?:#{NSEPQ}|#{ISEPQ}|#{CSEPQ})([^#{Regexp.quote( + (NSEP + ISEP + CSEP).split('').uniq.join + )}]+)$/ + + # The Proxy class is a way to lazily resolve code objects in + # cases where the object may not yet exist. A proxy simply stores + # an unresolved path until a method is called on the object, at which + # point it does a lookup using {Registry.resolve}. If the object is + # not found, a warning is raised and {ProxyMethodError} might be raised. + # + # @example Creates a Proxy to the String class from a module + # # When the String class is parsed this method will + # # begin to act like the String ClassObject. + # Proxy.new(mymoduleobj, "String") + # @see Registry.resolve + # @see ProxyMethodError + class Proxy + def self.===(other) other.is_a?(self) end + + attr_reader :namespace + alias parent namespace + + # Creates a new Proxy + # + # @raise [ArgumentError] if namespace is not a NamespaceObject + # @return [Proxy] self + def initialize(namespace, name, type = nil) + namespace = Registry.root if !namespace || namespace == :root + + if name =~ /^#{NSEPQ}/ + namespace = Registry.root + name = name[2..-1] + end + + if name =~ PROXY_MATCH + @orignamespace = namespace + @origname = name + @imethod = true if name.include? ISEP + namespace = Proxy.new(namespace, $`) unless $`.empty? + name = $1 + else + @orignamespace = nil + @origname = nil + @imethod = nil + end + + @name = name.to_sym + @namespace = namespace + @obj = nil + @imethod ||= nil + self.type = type + + if @namespace.is_a?(ConstantObject) + unless @namespace.value =~ /\A#{NAMESPACEMATCH}\Z/ + raise Parser::UndocumentableError, "constant mapping for " + + "#{@origname} (type=#{type.inspect})" + end + + @origname = nil # forget these for a constant + @orignamespace = nil + @namespace = Proxy.new(@namespace.namespace, @namespace.value) + end + + unless @namespace.is_a?(NamespaceObject) || @namespace.is_a?(Proxy) + raise ArgumentError, "Invalid namespace object: #{namespace}" + end + + # If the name begins with "::" (like "::String") + # this is definitely a root level object, so + # remove the namespace and attach it to the root + if @name =~ /^#{NSEPQ}/ + @name.gsub!(/^#{NSEPQ}/, '') + @namespace = Registry.root + end + end + + # (see Base#name) + def name(prefix = false) + prefix ? "#{@imethod && ISEP}#{@name}" : @name + end + + # Returns a text representation of the Proxy + # @return [String] the object's #inspect method or P(OBJECTPATH) + def inspect + to_obj ? to_obj.inspect : "P(#{path})" + end + + # If the proxy resolves to an object, returns its path, otherwise + # guesses at the correct path using the original namespace and name. + # + # @return [String] the assumed path of the proxy (or the real path + # of the resolved object) + def path + to_obj ? to_obj.path : proxy_path + end + alias to_s path + alias to_str path + alias title path + + # @return [Boolean] + def is_a?(klass) + to_obj ? to_obj.is_a?(klass) : self.class <= klass + end + + # @return [Boolean] + def ===(other) + to_obj ? to_obj === other : self.class <= other.class + end + + # @return [Boolean] + def <=>(other) + if other.respond_to? :path + path <=> other.path + else + false + end + end + + # @return [Boolean] + def equal?(other) + if other.respond_to? :path + path == other.path + else + false + end + end + alias == equal? + + # @return [Integer] the object's hash value (for equality checking) + def hash; path.hash end + + # Returns the class name of the object the proxy is mimicking, if + # resolved. Otherwise returns +Proxy+. + # @return [Class] the resolved object's class or +Proxy+ + def class + to_obj ? to_obj.class : Proxy + end + + # Returns the type of the proxy. If it cannot be resolved at the + # time of the call, it will either return the inferred proxy type + # (see {#type=}) or +:proxy+ + # @return [Symbol] the Proxy's type + # @see #type= + def type + to_obj ? to_obj.type : @type || :proxy + end + + # Allows a parser to infer the type of the proxy by its path. + # @param [#to_sym] type the proxy's inferred type + # @return [void] + def type=(type) @type = type ? type.to_sym : nil end + + # @return [Boolean] + def instance_of?(klass) + self.class == klass + end + + # @return [Boolean] + def kind_of?(klass) + self.class <= klass + end + + # @return [Boolean] + def respond_to?(meth, include_private = false) + to_obj ? to_obj.respond_to?(meth, include_private) : super + end + + # Dispatches the method to the resolved object. + # + # @raise [ProxyMethodError] if the proxy cannot find the real object + def method_missing(meth, *args, &block) + if to_obj + to_obj.__send__(meth, *args, &block) + else + log.warn "Load Order / Name Resolution Problem on #{path}:\n" \ + "-\n" \ + "Something is trying to call #{meth} on object #{path} before it has been recognized.\n" \ + "This error usually means that you need to modify the order in which you parse files\n" \ + "so that #{path} is parsed before methods or other objects attempt to access it.\n" \ + "-\n" \ + "YARD will recover from this error and continue to parse but you *may* have problems\n" \ + "with your generated documentation. You should probably fix this.\n" \ + "-\n" + begin + super + rescue NoMethodError + raise ProxyMethodError, "Proxy cannot call method ##{meth} on object '#{path}'" + end + end + end + + # This class is never a root object + def root?; false end + + private + + # @note this method fixes a bug in 1.9.2: http://gist.github.com/437136 + def to_ary; nil end + + # Attempts to find the object that this unresolved object + # references by checking if any objects by this name are + # registered all the way up the namespace tree. + # + # @return [Base, nil] the registered code object or nil + def to_obj + return @obj if @obj + @obj = Registry.resolve(@namespace, (@imethod ? ISEP : '') + @name.to_s, false, false, @type) + if @obj + if @origname && @origname.include?("::") && !@obj.path.include?(@origname) + # the object's path should include the original proxy namespace, + # otherwise it's (probably) not the right object. + @obj = nil + else + @namespace = @obj.namespace + @name = @obj.name + end + end + @obj + end + + def proxy_path + if @namespace.root? + (@imethod ? ISEP : "") + name.to_s + elsif @origname + if @origname =~ CONSTANTSTART + @origname + else + [namespace.path, @origname].join + end + elsif name.to_s =~ CONSTANTSTART + name.to_s + else # class meth? + [namespace.path, name.to_s].join(CSEP) + end + end + end + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/code_objects/root_object.rb b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/code_objects/root_object.rb new file mode 100644 index 000000000..871178798 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/code_objects/root_object.rb @@ -0,0 +1,19 @@ +# frozen_string_literal: true +module YARD + module CodeObjects + # Represents the root namespace object (the invisible Ruby module that + # holds all top level modules, class and other objects). + class RootObject < ModuleObject + def path; @path ||= "" end + def inspect; @inspect ||= "#" end + def root?; true end + def title; 'Top Level Namespace' end + + def equal?(other) + other == :root ? true : super(other) + end + + def hash; :root.hash end + end + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/config.rb b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/config.rb new file mode 100644 index 000000000..8285662e2 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/config.rb @@ -0,0 +1,270 @@ +# frozen_string_literal: true +module YARD + # This class maintains all system-wide configuration for YARD and handles + # the loading of plugins. To access options call {options}, and to load + # a plugin use {load_plugin}. All other public methods are used by YARD + # during load time. + # + # == User Configuration Files + # + # Persistent user configuration files can be stored in the file + # +~/.yard/config+, which is read when YARD first loads. The file should + # be formatted as YAML, and should contain a map of keys and values. + # + # Although you can specify any key-value mapping in the configuration file, + # YARD defines special keys specified in {DEFAULT_CONFIG_OPTIONS}. + # + # An example of a configuration file is listed below: + # + # !!!yaml + # load_plugins: true # Auto-load plugins when YARD starts + # ignored_plugins: + # - yard-broken + # - broken2 # yard- prefix not necessary + # autoload_plugins: + # - yard-rspec + # + # == Automatic Loading of Plugins + # + # YARD 0.6.2 will no longer automatically load all plugins by default. This + # option can be reset by setting 'load_plugins' to true in the configuration + # file. In addition, you can specify a set of specific plugins to load on + # load through the 'autoload_plugins' list setting. This setting is + # independent of the 'load_plugins' value and will always be processed. + # + # == Ignored Plugins File + # + # YARD 0.5 and below used a +~/.yard/ignored_plugins+ file to specify + # plugins to be ignored at load time. Ignored plugins in 0.6.2 and above + # should now be specified in the main configuration file, though YARD + # will support the +ignored_plugins+ file until 0.7.x. + # + # == Safe Mode + # + # YARD supports running in safe-mode. By doing this, it will avoid executing + # any user code such as require files or queries. Plugins will still be + # loaded with safe mode on, because plugins are properly namespaced with + # a 'yard-' prefix, must be installed as a gem, and therefore cannot be + # touched by the user. To specify safe mode, use the +safe_mode+ key. + # + # == Plugin Specific Configuration + # + # Additional settings can be defined within the configuration file + # specifically to provide configuration for a plugin. A plugin that utilizes + # the YARD configuration is strongly encouraged to utilize namespacing of + # their configuration content. + # + # !!!yaml + # load_plugins: true # Auto-load plugins when YARD starts + # ignored_plugins: + # - yard-broken + # - broken2 # yard- prefix not necessary + # autoload_plugins: + # - yard-rspec + # # Plugin Specific Configuration + # yard-sample-plugin: + # show-results-inline: true + # + # As the configuration is available system wide, it can be + # accessed within the plugin code. + # + # + # if YARD::Config.options['yard-sample-plugin'] and + # YARD::Config.options['yard-sample-plugin']['show-results-inline'] + # # ... perform the action that places the results inline ... + # else + # # ... do the default behavior of not showing the results inline ... + # end + # + # When accessing the configuration, be aware that this file is user managed + # so configuration keys and values may not be present. Make no assumptions and + # instead ensure that you check for the existence of keys before proceeding to + # retrieve values. + # + # @since 0.6.2 + # @see options + class Config + class << self + # The system-wide configuration options for YARD + # @return [SymbolHash] a map a key-value pair settings. + # @see DEFAULT_CONFIG_OPTIONS + attr_accessor :options + end + + # The location where YARD stores user-specific settings + CONFIG_DIR = File.expand_path('~/.yard') + + # The main configuration YAML file. + CONFIG_FILE = File.join(CONFIG_DIR, 'config') + + # File listing all ignored plugins + # @deprecated Set `ignored_plugins` in the {CONFIG_FILE} instead. + IGNORED_PLUGINS = File.join(CONFIG_DIR, 'ignored_plugins') + + # Default configuration options + DEFAULT_CONFIG_OPTIONS = { + :load_plugins => false, # Whether to load plugins automatically with YARD + :ignored_plugins => [], # A list of ignored plugins by name + :autoload_plugins => [], # A list of plugins to be automatically loaded + :safe_mode => false # Does not execute or eval any user-level code + } + + # The prefix used for YARD plugins. Name your gem with this prefix + # to allow it to be used as a plugin. + YARD_PLUGIN_PREFIX = /^yard[-_]/ + + # Loads settings from {CONFIG_FILE}. This method is called by YARD at + # load time and should not be called by the user. + # @return [void] + def self.load + self.options = SymbolHash.new(false) + options.update(DEFAULT_CONFIG_OPTIONS) + options.update(read_config_file) + load_commandline_safemode + add_ignored_plugins_file + translate_plugin_names + load_plugins + rescue => e + log.error "Invalid configuration file, using default options." + log.backtrace(e) + options.update(DEFAULT_CONFIG_OPTIONS) + end + + # Saves settings to {CONFIG_FILE}. + # @return [void] + def self.save + require 'yaml' + Dir.mkdir(CONFIG_DIR) unless File.directory?(CONFIG_DIR) + File.open(CONFIG_FILE, 'w') {|f| f.write(YAML.dump(options)) } + end + + # Loads gems that match the name 'yard-*' (recommended) or 'yard_*' except + # those listed in +~/.yard/ignored_plugins+. This is called immediately + # after YARD is loaded to allow plugin support. + # + # @return [Boolean] true if all plugins loaded successfully, false otherwise. + def self.load_plugins + load_gem_plugins && + load_autoload_plugins && + load_commandline_plugins ? true : false + end + + # Loads an individual plugin by name. It is not necessary to include the + # +yard-+ plugin prefix here. + # + # @param [String] name the name of the plugin (with or without +yard-+ prefix) + # @return [Boolean] whether the plugin was successfully loaded + def self.load_plugin(name) + name = translate_plugin_name(name) + return false if options[:ignored_plugins].include?(name) + return false if name =~ /^yard-doc-/ + log.debug "Loading plugin '#{name}'..." + require name + true + rescue LoadError => e + load_plugin_failed(name, e) + end + + # Load gem plugins if :load_plugins is true + def self.load_gem_plugins + return true unless options[:load_plugins] + require 'rubygems' + result = true + YARD::GemIndex.each do |gem| + begin + next true unless gem.name =~ YARD_PLUGIN_PREFIX + load_plugin(gem.name) + rescue Gem::LoadError => e + tmp = load_plugin_failed(gem.name, e) + result = tmp unless tmp + end + end + result + rescue LoadError + log.debug "RubyGems is not present, skipping plugin loading" + false + end + + # Load plugins set in :autoload_plugins + def self.load_autoload_plugins + options[:autoload_plugins].each {|name| load_plugin(name) } + end + + # Load plugins from {arguments} + def self.load_commandline_plugins + with_yardopts do + arguments.each_with_index do |arg, i| + next unless arg == '--plugin' + load_plugin(arguments[i + 1]) + end + end + end + + # Check for command-line safe_mode switch in {arguments} + def self.load_commandline_safemode + with_yardopts do + arguments.each_with_index do |arg, _i| + options[:safe_mode] = true if arg == '--safe' + end + end + end + + # Print a warning if the plugin failed to load + # @return [false] + def self.load_plugin_failed(name, exception) + log.error "Error loading plugin '#{name}'" + log.backtrace(exception) if $DEBUG + false + end + + # Legacy support for {IGNORED_PLUGINS} + def self.add_ignored_plugins_file + if File.file?(IGNORED_PLUGINS) + options[:ignored_plugins] += File.read(IGNORED_PLUGINS).split(/\s+/) + end + end + + # Translates plugin names to add yard- prefix. + def self.translate_plugin_names + options[:ignored_plugins].map! {|name| translate_plugin_name(name) } + options[:autoload_plugins].map! {|name| translate_plugin_name(name) } + end + + # Loads the YAML configuration file into memory + # @return [Hash] the contents of the YAML file from disk + # @see CONFIG_FILE + def self.read_config_file + if File.file?(CONFIG_FILE) + require 'yaml' + YAML.load_file(CONFIG_FILE) + else + {} + end + end + + # Sanitizes and normalizes a plugin name to include the 'yard-' prefix. + # @param [String] name the plugin name + # @return [String] the sanitized and normalized plugin name. + def self.translate_plugin_name(name) + name = name.delete('/') # Security sanitization + name = "yard-" + name unless name =~ YARD_PLUGIN_PREFIX + name + end + + # Temporarily loads .yardopts file into @yardopts + def self.with_yardopts + yfile = CLI::Yardoc::DEFAULT_YARDOPTS_FILE + @yardopts = File.file?(yfile) ? File.read_binary(yfile).shell_split : [] + result = yield + @yardopts = nil + result + end + + # @return [Array] arguments from commandline and yardopts file + def self.arguments + ARGV + @yardopts + end + end + + Config.options = Config::DEFAULT_CONFIG_OPTIONS +end diff --git a/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/core_ext/array.rb b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/core_ext/array.rb new file mode 100644 index 000000000..acbfea36b --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/core_ext/array.rb @@ -0,0 +1,16 @@ +# frozen_string_literal: true +class Array + # Places values before or after another object (by value) in + # an array. This is used in tandem with the before and after + # methods of the {Insertion} class. + # + # @example Places an item before another + # [1, 2, 3].place(4).before(3) # => [1, 2, 4, 3] + # @example Places an item after another + # [:a, :b, :c].place(:x).after(:a) # => [:a, :x, :b, :c] + # @param [Array] values value to insert + # @return [Insertion] an insertion object to + # @see Insertion#before + # @see Insertion#after + def place(*values) Insertion.new(self, values) end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/core_ext/file.rb b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/core_ext/file.rb new file mode 100644 index 000000000..c918b5af3 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/core_ext/file.rb @@ -0,0 +1,69 @@ +# frozen_string_literal: true +require 'fileutils' + +class File + RELATIVE_PARENTDIR = '..' + RELATIVE_SAMEDIR = '.' + + # @group Manipulating Paths + + # Turns a path +to+ into a relative path from starting + # point +from+. The argument +from+ is assumed to be + # a filename. To treat it as a directory, make sure it + # ends in +File::SEPARATOR+ ('/' on UNIX filesystems). + # + # @param [String] from the starting filename + # (or directory with +from_isdir+ set to +true+). + # @param [String] to the final path that should be made relative. + # @return [String] the relative path from +from+ to +to+. + def self.relative_path(from, to) + from = expand_path(from).split(SEPARATOR) + to = expand_path(to).split(SEPARATOR) + from.length.times do + break if from[0] != to[0] + from.shift; to.shift + end + from.pop + join(*(from.map { RELATIVE_PARENTDIR } + to)) + end + + # Cleans a path by removing extraneous '..', '.' and '/' characters + # + # @example Clean a path + # File.cleanpath('a/b//./c/../e') # => "a/b/e" + # @param [String] path the path to clean + # @param [Boolean] rel_root allows relative path above root value + # @return [String] the sanitized path + def self.cleanpath(path, rel_root = false) + path = path.split(SEPARATOR) + path = path.inject([]) do |acc, comp| + next acc if comp == RELATIVE_SAMEDIR + if comp == RELATIVE_PARENTDIR && !acc.empty? && acc.last != RELATIVE_PARENTDIR + acc.pop + next acc + elsif !rel_root && comp == RELATIVE_PARENTDIR && acc.empty? + next acc + end + acc << comp + end + File.join(*path) + end + + # @group Reading Files + + # Forces opening a file (for writing) by first creating the file's directory + # @param [String] file the filename to open + # @since 0.5.2 + def self.open!(file, *args, &block) + dir = dirname(file) + FileUtils.mkdir_p(dir) unless directory?(dir) + open(file, *args, &block) + end + + # Reads a file with binary encoding + # @return [String] the ascii-8bit encoded data + # @since 0.5.3 + def self.read_binary(file) + File.open(file, 'rb', &:read) + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/core_ext/hash.rb b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/core_ext/hash.rb new file mode 100644 index 000000000..6de7e080c --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/core_ext/hash.rb @@ -0,0 +1,16 @@ +# frozen_string_literal: true +class Hash + class << self + def create(*args) + if args.first.is_a?(Array) && args.size == 1 + obj = new + args.first.each {|k, v| obj[k] = v } + obj + else + create_186(*args) + end + end + alias create_186 [] + alias [] create + end +end if RUBY_VERSION < "1.8.7" diff --git a/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/core_ext/insertion.rb b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/core_ext/insertion.rb new file mode 100644 index 000000000..13efd0142 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/core_ext/insertion.rb @@ -0,0 +1,63 @@ +# frozen_string_literal: true +# The Insertion class inserts a value before or after another +# value in a list. +# +# @example +# Insertion.new([1, 2, 3], 4).before(3) # => [1, 2, 4, 3] +class Insertion + # Creates an insertion object on a list with a value to be + # inserted. To finalize the insertion, call {#before} or + # {#after} on the object. + # + # @param [Array] list the list to perform the insertion on + # @param [Object] value the value to insert + def initialize(list, value) + @list = list + @values = (Array === value ? value : [value]) + end + + # Inserts the value before +val+ + # @param [Object] val the object the value will be inserted before + # @param [Boolean] recursive look inside sublists + def before(val, recursive = false) insertion(val, 0, recursive) end + + # Inserts the value after +val+. + # + # @example If subsections are ignored + # Insertion.new([1, [2], 3], :X).after(1) # => [1, [2], :X, 3] + # @param [Object] val the object the value will be inserted after + # @param [Boolean] recursive look inside sublists + def after(val, recursive = false) insertion(val, 1, recursive) end + + # Alias for {#before} with +recursive+ set to true + # @since 0.6.0 + def before_any(val) insertion(val, 0, true) end + + # Alias for {#after} with +recursive+ set to true + # @since 0.6.0 + def after_any(val) insertion(val, 1, true) end + + private + + # This method performs the actual insertion + # + # @param [Object] val the value to insert + # @param [Fixnum] rel the relative index (0 or 1) of where the object + # should be placed + # @param [Boolean] recursive look inside sublists + # @param [Array] list the list to place objects into + def insertion(val, rel, recursive = false, list = @list) + if recursive + list.each do |item| + next unless item.is_a?(Array) + tmp = item.dup + insertion(val, rel, recursive, item) + return(list) unless item == tmp + end + end + + index = list.index(val) + list[index + rel, 0] = @values if index + list + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/core_ext/module.rb b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/core_ext/module.rb new file mode 100644 index 000000000..93fef9d9a --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/core_ext/module.rb @@ -0,0 +1,11 @@ +# frozen_string_literal: true +class Module + # Returns the class name of a full module namespace path + # + # @example + # module A::B::C; class_name end # => "C" + # @return [String] the last part of a module path + def class_name + name.split("::").last + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/core_ext/string.rb b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/core_ext/string.rb new file mode 100644 index 000000000..17d3709e5 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/core_ext/string.rb @@ -0,0 +1,68 @@ +# frozen_string_literal: true +class String + # Splits text into tokens the way a shell would, handling quoted + # text as a single token. Use '\"' and "\'" to escape quotes and + # '\\' to escape a backslash. + # + # @return [Array] an array representing the tokens + def shell_split + out = [String.new("")] + state = :none + escape_next = false + quote = String.new("") + strip.split(//).each do |char| + case state + when :none, :space + case char + when /\s/ + out << String.new("") unless state == :space + state = :space + escape_next = false + when "\\" + if escape_next + out.last << char + escape_next = false + else + escape_next = true + end + when '"', "'" + if escape_next + out.last << char + escape_next = false + else + state = char + quote = String.new("") + end + else + state = :none + out.last << char + escape_next = false + end + when '"', "'" + case char + when '"', "'" + if escape_next + quote << char + escape_next = false + elsif char == state + out.last << quote + state = :none + else + quote << char + end + when '\\' + if escape_next + quote << char + escape_next = false + else + escape_next = true + end + else + quote << char + escape_next = false + end + end + end + out + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/core_ext/symbol_hash.rb b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/core_ext/symbol_hash.rb new file mode 100644 index 000000000..b93742a32 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/core_ext/symbol_hash.rb @@ -0,0 +1,75 @@ +# frozen_string_literal: true +# A subclass of Hash where all keys are converted into Symbols, and +# optionally, all String values are converted into Symbols. +class SymbolHash < Hash + # Creates a new SymbolHash object + # + # @param [Boolean] symbolize_value converts any String values into Symbols + # if this is set to +true+. + def initialize(symbolize_value = true) + @symbolize_value = symbolize_value + end + + # @overload [](hash) + # Creates a SymbolHash object from an existing Hash + # + # @example + # SymbolHash['x' => 1, :y => 2] # => # + # @param [Hash] hash the hash object + # @return [SymbolHash] a new SymbolHash from a hash object + # + # @overload [](*list) + # Creates a SymbolHash from an even list of keys and values + # + # @example + # SymbolHash[key1, value1, key2, value2, ...] + # @param [Array] list an even list of key followed by value + # @return [SymbolHash] a new SymbolHash object + def self.[](*hsh) + obj = new + if hsh.size == 1 && hsh.first.is_a?(Hash) + hsh.first.each {|k, v| obj[k] = v } + else + 0.step(hsh.size, 2) {|n| obj[hsh[n]] = hsh[n + 1] } + end + obj + end + + # Assigns a value to a symbolized key + # @param [#to_sym] key the key + # @param [Object] value the value to be assigned. If this is a String and + # values are set to be symbolized, it will be converted into a Symbol. + def []=(key, value) + super(key.to_sym, value.instance_of?(String) && @symbolize_value ? value.to_sym : value) + end + + # Accessed a symbolized key + # @param [#to_sym] key the key to access + # @return [Object] the value associated with the key + def [](key) super(key.to_sym) end + + # Deleted a key and value associated with it + # @param [#to_sym] key the key to delete + # @return [void] + def delete(key) super(key.to_sym) end + + # Tests if a symbolized key exists + # @param [#to_sym] key the key to test + # @return [Boolean] whether the key exists + def key?(key) super(key.to_sym) end + alias has_key? key? + + # Updates the object with the contents of another Hash object. + # This method modifies the original SymbolHash object + # + # @param [Hash] hash the hash object to copy the values from + # @return [SymbolHash] self + def update(hash) hash.each {|k, v| self[k] = v }; self end + alias merge! update + + # Merges the contents of another hash into a new SymbolHash object + # + # @param [Hash] hash the hash of objects to copy + # @return [SymbolHash] a new SymbolHash containing the merged data + def merge(hash) dup.merge!(hash) end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/docstring.rb b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/docstring.rb new file mode 100644 index 000000000..e02524a6d --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/docstring.rb @@ -0,0 +1,386 @@ +# frozen_string_literal: true +module YARD + # A documentation string, or "docstring" for short, encapsulates the + # comments and metadata, or "tags", of an object. Meta-data is expressed + # in the form +@tag VALUE+, where VALUE can span over multiple lines as + # long as they are indented. The following +@example+ tag shows how tags + # can be indented: + # + # # @example My example + # # a = "hello world" + # # a.reverse + # # @version 1.0 + # + # Tags can be nested in a documentation string, though the {Tags::Tag} + # itself is responsible for parsing the inner tags. + class Docstring < String + class << self + # @note Plugin developers should make sure to reset this value + # after parsing finishes. This can be done via the + # {Parser::SourceParser.after_parse_list} callback. This will + # ensure that YARD can properly parse multiple projects in + # the same process. + # @return [Class] the parser class used to parse + # text and optional meta-data from docstrings. Defaults to + # {DocstringParser}. + # @see DocstringParser + # @see Parser::SourceParser.after_parse_list + attr_accessor :default_parser + + # Creates a parser object using the current {default_parser}. + # Equivalent to: + # Docstring.default_parser.new(*args) + # @param args arguments are passed to the {DocstringParser} + # class. See {DocstringParser#initialize} for details on + # arguments. + # @return [DocstringParser] the parser object used to parse a + # docstring. + def parser(*args) default_parser.new(*args) end + end + + self.default_parser = DocstringParser + + # @return [Array] the list of reference tags + attr_reader :ref_tags + + # @return [CodeObjects::Base] the object that owns the docstring. + attr_accessor :object + + # @return [Range] line range in the {#object}'s file where the docstring was parsed from + attr_accessor :line_range + + # @return [String] the raw documentation (including raw tag text) + attr_reader :all + + # @return [Boolean] whether the docstring was started with "##" + attr_reader :hash_flag + def hash_flag=(v) @hash_flag = v.nil? ? false : v end + + # Matches a tag at the start of a comment line + # @deprecated Use {DocstringParser::META_MATCH} + META_MATCH = DocstringParser::META_MATCH + + # @group Creating a Docstring Object + + # Creates a new docstring without performing any parsing through + # a {DocstringParser}. This method is called by +DocstringParser+ + # when creating the new docstring object. + # + # @param [String] text the textual portion of the docstring + # @param [Array] tags the list of tag objects in the docstring + # @param [CodeObjects::Base, nil] object the object associated with the + # docstring. May be nil. + # @param [String] raw_data the complete docstring, including all + # original formatting and any unparsed tags/directives. + # @param [CodeObjects::Base, nil] ref_object a reference object used for + # the base set of documentation / tag information. + def self.new!(text, tags = [], object = nil, raw_data = nil, ref_object = nil) + docstring = allocate + docstring.replace(text, false) + docstring.object = object + docstring.add_tag(*tags) + docstring.instance_variable_set("@unresolved_reference", ref_object) + docstring.instance_variable_set("@all", raw_data) if raw_data + docstring + end + + # Creates a new docstring with the raw contents attached to an optional + # object. Parsing will be done by the {DocstringParser} class. + # + # @note To properly parse directives with proper parser context within + # handlers, you should not use this method to create a Docstring. + # Instead, use the {parser}, which takes a handler object that + # can pass parser state onto directives. If a Docstring is created + # with this method, directives do not have access to any parser + # state, and may not function as expected. + # @example + # Docstring.new("hello world\n@return Object return", someobj) + # + # @param [String] content the raw comments to be parsed into a docstring + # and associated meta-data. + # @param [CodeObjects::Base] object an object to associate the docstring + # with. + def initialize(content = '', object = nil) + @object = object + @summary = nil + @hash_flag = false + + self.all = content + end + + # Adds another {Docstring}, copying over tags. + # + # @param [Docstring, String] other the other docstring (or string) to + # add. + # @return [Docstring] a new docstring with both docstrings combines + def +(other) + case other + when Docstring + Docstring.new([all, other.all].join("\n"), object) + else + super + end + end + + def to_s + resolve_reference + super + end + + # Replaces the docstring with new raw content. Called by {#all=}. + # @param [String] content the raw comments to be parsed + def replace(content, parse = true) + content = content.join("\n") if content.is_a?(Array) + @tags = [] + @ref_tags = [] + if parse + super(parse_comments(content)) + else + @all = content + @unresolved_reference = nil + super(content) + end + end + alias all= replace + + # Deep-copies a docstring + # + # @note This method creates a new docstring with new tag lists, but does + # not create new individual tags. Modifying the tag objects will still + # affect the original tags. + # @return [Docstring] a new copied docstring + # @since 0.7.0 + def dup + resolve_reference + obj = super + %w(all summary tags ref_tags).each do |name| + val = instance_variable_defined?("@#{name}") && instance_variable_get("@#{name}") + obj.instance_variable_set("@#{name}", val ? val.dup : nil) + end + obj + end + + # @endgroup + + # @return [Fixnum] the first line of the {#line_range} + # @return [nil] if there is no associated {#line_range} + def line + line_range ? line_range.first : nil + end + + # Gets the first line of a docstring to the period or the first paragraph. + # @return [String] The first line or paragraph of the docstring; always ends with a period. + def summary + resolve_reference + return @summary if defined?(@summary) && @summary + stripped = gsub(/[\r\n](?![\r\n])/, ' ').strip + num_parens = 0 + idx = length.times do |index| + case stripped[index, 1] + when "." + next_char = stripped[index + 1, 1].to_s + break index - 1 if num_parens <= 0 && next_char =~ /^\s*$/ + when "\r", "\n" + next_char = stripped[index + 1, 1].to_s + if next_char =~ /^\s*$/ + break stripped[index - 1, 1] == '.' ? index - 2 : index - 1 + end + when "{", "(", "[" + num_parens += 1 + when "}", ")", "]" + num_parens -= 1 + end + end + @summary = stripped[0..idx] + if !@summary.empty? && @summary !~ /\A\s*\{include:.+\}\s*\Z/ + @summary += '.' + end + @summary + end + + # Reformats and returns a raw representation of the tag data using the + # current tag and docstring data, not the original text. + # + # @return [String] the updated raw formatted docstring data + # @since 0.7.0 + # @todo Add Tags::Tag#to_raw and refactor + def to_raw + tag_data = tags.map do |tag| + case tag + when Tags::OverloadTag + tag_text = "@#{tag.tag_name} #{tag.signature}\n" + unless tag.docstring.blank? + tag_text += "\n " + tag.docstring.all.gsub(/\r?\n/, "\n ") + end + when Tags::OptionTag + tag_text = "@#{tag.tag_name} #{tag.name}" + tag_text += ' [' + tag.pair.types.join(', ') + ']' if tag.pair.types + tag_text += ' ' + tag.pair.name.to_s if tag.pair.name + tag_text += "\n " if tag.name && tag.text + tag_text += ' (' + tag.pair.defaults.join(', ') + ')' if tag.pair.defaults + tag_text += " " + tag.pair.text.strip.gsub(/\n/, "\n ") if tag.pair.text + else + tag_text = '@' + tag.tag_name + tag_text += ' [' + tag.types.join(', ') + ']' if tag.types + tag_text += ' ' + tag.name.to_s if tag.name + tag_text += "\n " if tag.name && tag.text + tag_text += ' ' + tag.text.strip.gsub(/\n/, "\n ") if tag.text + end + tag_text + end + [strip, tag_data.join("\n")].reject(&:empty?).compact.join("\n") + end + + # @group Creating and Accessing Meta-data + + # Adds a tag or reftag object to the tag list. If you want to parse + # tag data based on the {Tags::DefaultFactory} tag factory, use + # {DocstringParser} instead. + # + # @param [Tags::Tag, Tags::RefTag] tags list of tag objects to add + # @return [void] + def add_tag(*tags) + tags.each_with_index do |tag, i| + case tag + when Tags::Tag + tag.object = object + @tags << tag + when Tags::RefTag, Tags::RefTagList + @ref_tags << tag + else + raise ArgumentError, "expected Tag or RefTag, got #{tag.class} (at index #{i})" + end + end + end + + # Convenience method to return the first tag + # object in the list of tag objects of that name + # + # @example + # doc = Docstring.new("@return zero when nil") + # doc.tag(:return).text # => "zero when nil" + # + # @param [#to_s] name the tag name to return data for + # @return [Tags::Tag] the first tag in the list of {#tags} + def tag(name) + tags.find {|tag| tag.tag_name.to_s == name.to_s } + end + + # Returns a list of tags specified by +name+ or all tags if +name+ is not specified. + # + # @param [#to_s] name the tag name to return data for, or nil for all tags + # @return [Array] the list of tags by the specified tag name + def tags(name = nil) + list = stable_sort_by(@tags + convert_ref_tags, &:tag_name) + return list unless name + list.select {|tag| tag.tag_name.to_s == name.to_s } + end + + # Returns true if at least one tag by the name +name+ was declared + # + # @param [String] name the tag name to search for + # @return [Boolean] whether or not the tag +name+ was declared + def has_tag?(name) + tags.any? {|tag| tag.tag_name.to_s == name.to_s } + end + + # Delete all tags with +name+ + # @param [String] name the tag name + # @return [void] + # @since 0.7.0 + def delete_tags(name) + delete_tag_if {|tag| tag.tag_name.to_s == name.to_s } + end + + # Deletes all tags where the block returns true + # @yieldparam [Tags::Tag] tag the tag that is being tested + # @yieldreturn [Boolean] true if the tag should be deleted + # @return [void] + # @since 0.7.0 + def delete_tag_if(&block) + @tags.delete_if(&block) + @ref_tags.delete_if(&block) + end + + # Returns true if the docstring has no content that is visible to a template. + # + # @param [Boolean] only_visible_tags whether only {Tags::Library.visible_tags} + # should be checked, or if all tags should be considered. + # @return [Boolean] whether or not the docstring has content + def blank?(only_visible_tags = true) + if only_visible_tags + empty? && !tags.any? {|tag| Tags::Library.visible_tags.include?(tag.tag_name.to_sym) } + else + empty? && @tags.empty? && @ref_tags.empty? + end + end + + # @endgroup + + # Resolves unresolved other docstring reference if there is + # unresolved reference. Does nothing if there is no unresolved + # reference. + # + # Normally, you don't need to call this method + # explicitly. Resolving unresolved reference is done implicitly. + # + # @return [void] + def resolve_reference + loop do + return if defined?(@unresolved_reference).nil? || @unresolved_reference.nil? + return if CodeObjects::Proxy === @unresolved_reference + + reference = @unresolved_reference + @unresolved_reference = nil + self.all = [reference.docstring.all, @all].join("\n") + end + end + + private + + # Maps valid reference tags + # + # @return [Array] the list of valid reference tags + def convert_ref_tags + list = @ref_tags.reject {|t| CodeObjects::Proxy === t.owner } + + @ref_tag_recurse_count ||= 0 + @ref_tag_recurse_count += 1 + if @ref_tag_recurse_count > 2 + log.error "#{@object.file}:#{@object.line}: Detected circular reference tag in " \ + "`#{@object}', ignoring all reference tags for this object " \ + "(#{@ref_tags.map {|t| "@#{t.tag_name}" }.join(", ")})." + @ref_tags = [] + return @ref_tags + end + list = list.map(&:tags).flatten + @ref_tag_recurse_count -= 1 + list + end + + # Parses out comments split by newlines into a new code object + # + # @param [String] comments + # the newline delimited array of comments. If the comments + # are passed as a String, they will be split by newlines. + # + # @return [String] the non-metadata portion of the comments to + # be used as a docstring + def parse_comments(comments) + parser = self.class.parser + parser.parse(comments, object) + @all = parser.raw_text + @unresolved_reference = parser.reference + add_tag(*parser.tags) + parser.text + end + + # A stable sort_by method. + # + # @param list [Enumerable] the list to sort. + # @return [Array] a stable sorted list. + def stable_sort_by(list) + list.each_with_index.sort_by {|tag, i| [yield(tag), i] }.map(&:first) + end + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/docstring_parser.rb b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/docstring_parser.rb new file mode 100644 index 000000000..7ce8b6eb3 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/docstring_parser.rb @@ -0,0 +1,345 @@ +# frozen_string_literal: true +require 'ostruct' + +module YARD + # Parses text and creates a {Docstring} object to represent documentation + # for a {CodeObjects::Base}. To create a new docstring, you should initialize + # the parser and call {#parse} followed by {#to_docstring}. + # + # == Subclassing Notes + # + # The DocstringParser can be subclassed and subtituted during parsing by + # setting the {Docstring.default_parser} attribute with the name of the + # subclass. This allows developers to change the way docstrings are + # parsed, allowing for completely different docstring syntaxes. + # + # @example Creating a Docstring with a DocstringParser + # DocstringParser.new.parse("text here").to_docstring + # @example Creating a Custom DocstringParser + # # Parses docstrings backwards! + # class ReverseDocstringParser + # def parse_content(content) + # super(content.reverse) + # end + # end + # + # # Set the parser as default when parsing + # YARD::Docstring.default_parser = ReverseDocstringParser + # @see #parse_content + # @since 0.8.0 + class DocstringParser + # @return [String] the parsed text portion of the docstring, + # with tags removed. + attr_accessor :text + + # @return [String] the complete input string to the parser. + attr_accessor :raw_text + + # @return [Array] the list of meta-data tags identified + # by the parser + attr_accessor :tags + + # @return [Array] a list of directives identified + # by the parser. This list will not be passed on to the + # Docstring object. + attr_accessor :directives + + # @return [OpenStruct] any arbitrary state to be passed between + # tags during parsing. Mainly used by directives to coordinate + # behaviour (so that directives can be aware of other directives + # used in a docstring). + attr_accessor :state + + # @return [CodeObjects::Base, nil] the object associated with + # the docstring being parsed. May be nil if the docstring is + # not attached to any object. + attr_accessor :object + + # @return [CodeObjects::Base, nil] the object referenced by + # the docstring being parsed. May be nil if the docstring doesn't + # refer to any object. + attr_accessor :reference + + # @return [Handlers::Base, nil] the handler parsing this + # docstring. May be nil if this docstring parser is not + # initialized through + attr_accessor :handler + + # @return [Tags::Library] the tag library being used to + # identify registered tags in the docstring. + attr_accessor :library + + # The regular expression to match the tag syntax + META_MATCH = /^@(!)?((?:\w\.?)+)(?:\s+(.*))?$/i + + # @!group Creation and Conversion Methods + + # Creates a new parser to parse docstring data + # + # @param [Tags::Library] library a tag library for recognizing + # tags. + def initialize(library = Tags::Library.instance) + @text = "" + @raw_text = "" + @tags = [] + @directives = [] + @library = library + @object = nil + @reference = nil + @handler = nil + @state = OpenStruct.new + end + + # @return [Docstring] translates parsed text into + # a Docstring object. + def to_docstring + Docstring.new!(text, tags, object, raw_text, reference) + end + + # @!group Parsing Methods + + # Parses all content and returns itself. + # + # @param [String] content the docstring text to parse + # @param [CodeObjects::Base] object the object that the docstring + # is attached to. Will be passed to directives to act on + # this object. + # @param [Handlers::Base, nil] handler the handler object that is + # parsing this object. May be nil if this parser is not being + # called from a {Parser::SourceParser} context. + # @return [self] the parser object. To get the docstring, + # call {#to_docstring}. + # @see #to_docstring + def parse(content, object = nil, handler = nil) + @object = object + @handler = handler + @reference, @raw_text = detect_reference(content) + text = parse_content(@raw_text) + @text = text.strip + call_directives_after_parse + post_process + self + end + + # Parses a given block of text. + # + # @param [String] content the content to parse + # @note Subclasses can override this method to perform custom + # parsing of content data. + def parse_content(content) + content = content.split(/\r?\n/) if content.is_a?(String) + return '' if !content || content.empty? + docstring = String.new("") + + indent = content.first[/^\s*/].length + last_indent = 0 + orig_indent = 0 + directive = false + last_line = "" + tag_name = nil + tag_buf = [] + + (content + ['']).each_with_index do |line, index| + indent = line[/^\s*/].length + empty = (line =~ /^\s*$/ ? true : false) + done = content.size == index + + if tag_name && (((indent < orig_indent && !empty) || done || + (indent == 0 && !empty)) || (indent <= last_indent && line =~ META_MATCH)) + buf = tag_buf.join("\n") + if directive || tag_is_directive?(tag_name) + directive = create_directive(tag_name, buf) + if directive + docstring << parse_content(directive.expanded_text).chomp + end + else + create_tag(tag_name, buf) + end + tag_name = nil + tag_buf = [] + directive = false + orig_indent = 0 + end + + # Found a meta tag + if line =~ META_MATCH + directive = $1 + tag_name = $2 + tag_buf = [($3 || '')] + elsif tag_name && indent >= orig_indent && !empty + orig_indent = indent if orig_indent == 0 + # Extra data added to the tag on the next line + last_empty = last_line =~ /^[ \t]*$/ ? true : false + + tag_buf << '' if last_empty + tag_buf << line.gsub(/^[ \t]{#{orig_indent}}/, '') + elsif !tag_name + # Regular docstring text + docstring << line + docstring << "\n" + end + + last_indent = indent + last_line = line + end + + docstring + end + + # @!group Parser Callback Methods + + # Call post processing callbacks on parser. + # This is called implicitly by parser. Use this when + # manually configuring a {Docstring} object. + # + # @return [void] + def post_process + call_after_parse_callbacks + end + + # @!group Tag Manipulation Methods + + # Creates a tag from the {Tags::DefaultFactory tag factory}. + # + # To add an already created tag object, append it to {#tags}. + # + # @param [String] tag_name the tag name + # @param [String] tag_buf the text attached to the tag with newlines removed. + # @return [Tags::Tag, Tags::RefTag] a tag + def create_tag(tag_name, tag_buf = '') + if tag_buf =~ /\A\s*(?:(\S+)\s+)?\(\s*see\s+(\S+)\s*\)\s*\Z/ + return create_ref_tag(tag_name, $1, $2) + end + + if library.has_tag?(tag_name) + @tags += [library.tag_create(tag_name, tag_buf)].flatten + else + log.warn "Unknown tag @#{tag_name}" + + (object ? " in file `#{object.file}` near line #{object.line}" : "") + end + rescue Tags::TagFormatError + log.warn "Invalid tag format for @#{tag_name}" + + (object ? " in file `#{object.file}` near line #{object.line}" : "") + end + + # Creates a {Tags::RefTag} + def create_ref_tag(tag_name, name, object_name) + @tags << Tags::RefTagList.new(tag_name, P(object, object_name), name) + end + + # Creates a new directive using the registered {#library} + # @return [Tags::Directive] the directive object that is created + def create_directive(tag_name, tag_buf) + if library.has_directive?(tag_name) + dir = library.directive_create(tag_name, tag_buf, self) + if dir.is_a?(Tags::Directive) + @directives << dir + dir + end + else + log.warn "Unknown directive @!#{tag_name}" + + (object ? " in file `#{object.file}` near line #{object.line}" : "") + nil + end + rescue Tags::TagFormatError + log.warn "Invalid directive format for @!#{tag_name}" + + (object ? " in file `#{object.file}` near line #{object.line}" : "") + nil + end + + # Backward compatibility to detect old tags that should be specified + # as directives in 0.8 and onward. + def tag_is_directive?(tag_name) + list = %w(attribute endgroup group macro method scope visibility) + list.include?(tag_name) + end + + # Creates a callback that is called after a docstring is successfully + # parsed. Use this method to perform sanity checks on a docstring's + # tag data, or add any extra tags automatically to a docstring. + # + # @yield [parser] a block to be called after a docstring is parsed + # @yieldparam [DocstringParser] parser the docstring parser object + # with all directives and tags created. + # @yieldreturn [void] + # @return [void] + def self.after_parse(&block) + after_parse_callbacks << block + end + + # @return [Array] the {after_parse} callback proc objects + def self.after_parse_callbacks + @after_parse_callbacks ||= [] + end + + # Define a callback to check that @param tags are properly named + after_parse do |parser| + next unless parser.object + next unless parser.object.is_a?(CodeObjects::MethodObject) + next if parser.object.is_alias? + names = parser.object.parameters.map {|l| l.first.gsub(/\W/, '') } + seen_names = [] + infile_info = "\n in file `#{parser.object.file}' " \ + "near line #{parser.object.line}" + parser.tags.each do |tag| + next if tag.is_a?(Tags::RefTagList) # we don't handle this yet + next unless tag.tag_name == "param" + if seen_names.include?(tag.name) + log.warn "@param tag has duplicate parameter name: " \ + "#{tag.name} #{infile_info}" + elsif names.include?(tag.name) + seen_names << tag.name + else + log.warn "@param tag has unknown parameter name: " \ + "#{tag.name} #{infile_info}" + end + end + end + + private + + def namespace + object && object.namespace + end + + def detect_reference(content) + if content =~ /\A\s*\(see (\S+)\s*\)(?:\s|$)/ + path = $1 + extra = $' + [CodeObjects::Proxy.new(namespace, path), extra] + else + [nil, content] + end + end + + # @!group Parser Callback Methods + + # Calls the {Tags::Directive#after_parse} callback on all the + # created directives. + def call_directives_after_parse + directives.each(&:after_parse) + end + + # Calls all {after_parse} callbacks + def call_after_parse_callbacks + self.class.after_parse_callbacks.each do |cb| + cb.call(self) + end + end + + # Define a callback to check that @see tags do not use {}. + after_parse do |parser| + next unless parser.object + + parser.tags.each_with_index do |tag, i| + next if tag.is_a?(Tags::RefTagList) # we don't handle this yet + next unless tag.tag_name == "see" + next unless "#{tag.name}#{tag.text}" =~ /\A\{.*\}\Z/ + infile_info = "\n in file `#{parser.object.file}' " \ + "near line #{parser.object.line}" + log.warn "@see tag (##{i + 1}) should not be wrapped in {} " \ + "(causes rendering issues): #{infile_info}" + end + end + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/gem_index.rb b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/gem_index.rb new file mode 100644 index 000000000..c4c882e08 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/gem_index.rb @@ -0,0 +1,29 @@ +# frozen_string_literal: true + +# Backward compatibility for gem specification lookup +# @see Gem::SourceIndex +module YARD + module GemIndex + module_function + + def find_all_by_name(*args) + if defined?(Gem::Specification) && Gem::Specification.respond_to?(:find_all_by_name) + Gem::Specification.find_all_by_name(*args) + else + Gem.source_index.find_name(*args) + end + end + + def each(&block) + if defined?(Gem::Specification) && Gem::Specification.respond_to?(:each) + Gem::Specification.each(&block) + else + Gem.source_index.find_name('').each(&block) + end + end + + def all + each.to_a + end + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/globals.rb b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/globals.rb new file mode 100644 index 000000000..6b2701170 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/globals.rb @@ -0,0 +1,22 @@ +# frozen_string_literal: true +# @group Global Convenience Methods + +# Shortcut for creating a YARD::CodeObjects::Proxy via a path +# +# @see YARD::CodeObjects::Proxy +# @see YARD::Registry.resolve +def P(namespace, name = nil, type = nil) # rubocop:disable Naming/MethodName + if name.nil? + name = namespace + namespace = nil + end + YARD::Registry.resolve(namespace, name, false, true, type) +end + +# The global {YARD::Logger} instance +# +# @return [YARD::Logger] the global {YARD::Logger} instance +# @see YARD::Logger +def log + YARD::Logger.instance +end diff --git a/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/handlers/base.rb b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/handlers/base.rb new file mode 100644 index 000000000..989eb1008 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/handlers/base.rb @@ -0,0 +1,595 @@ +# frozen_string_literal: true +module YARD + module Handlers + # Raise this error when a handler should exit before completing. + # The exception will be silenced, allowing the next handler(s) in the + # queue to be executed. + # @since 0.8.4 + class HandlerAborted < ::RuntimeError; end + + # Raised during processing phase when a handler needs to perform + # an operation on an object's namespace but the namespace could + # not be resolved. + class NamespaceMissingError < Parser::UndocumentableError + # The object the error occurred on + # @return [CodeObjects::Base] a code object + attr_accessor :object + + def initialize(object) @object = object end + end + + # Handlers are pluggable semantic parsers for YARD's code generation + # phase. They allow developers to control what information gets + # generated by YARD, giving them the ability to, for instance, document + # any Ruby DSLs that a customized framework may use. A good example + # of this would be the ability to document and generate meta data for + # the 'describe' declaration of the RSpec testing framework by simply + # adding a handler for such a keyword. Similarly, any Ruby API that + # takes advantage of class level declarations could add these to the + # documentation in a very explicit format by treating them as first- + # class objects in any outputted documentation. + # + # == Overview of a Typical Handler Scenario + # + # Generally, a handler class will declare a set of statements which + # it will handle using the {handles} class declaration. It will then + # implement the {#process} method to do the work. The processing would + # usually involve the manipulation of the {#namespace}, {#owner} + # {CodeObjects::Base code objects} or the creation of new ones, in + # which case they should be registered by {#register}, a method that + # sets some basic attributes for the new objects. + # + # Handlers are usually simple and take up to a page of code to process + # and register a new object or add new attributes to the current +namespace+. + # + # == Setting up a Handler for Use + # + # A Handler is automatically registered when it is subclassed from the + # base class. The only other thing that needs to be done is to specify + # which statement the handler will process. This is done with the +handles+ + # declaration, taking either a {Parser::Ruby::Legacy::RubyToken}, {String} or `Regexp`. + # Here is a simple example which processes module statements. + # + # class MyModuleHandler < YARD::Handlers::Base + # handles TkMODULE + # + # def process + # # do something + # end + # end + # + # == Processing Handler Data + # + # The goal of a specific handler is really up to the developer, and as + # such there is no real guideline on how to process the data. However, + # it is important to know where the data is coming from to be able to use + # it. + # + # === +statement+ Attribute + # + # The +statement+ attribute pertains to the {Parser::Ruby::Legacy::Statement} object + # containing a set of tokens parsed in by the parser. This is the main set + # of data to be analyzed and processed. The comments attached to the statement + # can be accessed by the {Parser::Ruby::Legacy::Statement#comments} method, but generally + # the data to be processed will live in the +tokens+ attribute. This list + # can be converted to a +String+ using +#to_s+ to parse the data with + # regular expressions (or other text processing mechanisms), if needed. + # + # === +namespace+ Attribute + # + # The +namespace+ attribute is a {CodeObjects::NamespaceObject namespace object} + # which represents the current namespace that the parser is in. For instance: + # + # module SomeModule + # class MyClass + # def mymethod; end + # end + # end + # + # If a handler was to parse the 'class MyClass' statement, it would + # be necessary to know that it belonged inside the SomeModule module. + # This is the value that +namespace+ would return when processing such + # a statement. If the class was then entered and another handler was + # called on the method, the +namespace+ would be set to the 'MyClass' + # code object. + # + # === +owner+ Attribute + # + # The +owner+ attribute is similar to the +namespace+ attribute in that + # it also follows the scope of the code during parsing. However, a namespace + # object is loosely defined as a module or class and YARD has the ability + # to parse beyond module and class blocks (inside methods, for instance), + # so the +owner+ attribute would not be limited to modules and classes. + # + # To put this into context, the example from above will be used. If a method + # handler was added to the mix and decided to parse inside the method body, + # the +owner+ would be set to the method object but the namespace would remain + # set to the class. This would allow the developer to process any method + # definitions set inside a method (def x; def y; 2 end end) by adding them + # to the correct namespace (the class, not the method). + # + # In summary, the distinction between +namespace+ and +owner+ can be thought + # of as the difference between first-class Ruby objects (namespaces) and + # second-class Ruby objects (methods). + # + # === +visibility+ and +scope+ Attributes + # + # Mainly needed for parsing methods, the +visibility+ and +scope+ attributes + # refer to the public/protected/private and class/instance values (respectively) + # of the current parsing position. + # + # == Parsing Blocks in Statements + # + # In addition to parsing a statement and creating new objects, some + # handlers may wish to continue parsing the code inside the statement's + # block (if there is one). In this context, a block means the inside + # of any statement, be it class definition, module definition, if + # statement or classic 'Ruby block'. + # + # For example, a class statement would be "class MyClass" and the block + # would be a list of statements including the method definitions inside + # the class. For a class handler, the programmer would execute the + # {#parse_block} method to continue parsing code inside the block, with + # the +namespace+ now pointing to the class object the handler created. + # + # YARD has the ability to continue into any block: class, module, method, + # even if statements. For this reason, the block parsing method must be + # invoked explicitly out of efficiency sake. + # + # @abstract Subclass this class to provide a handler for YARD to use + # during the processing phase. + # + # @see CodeObjects::Base + # @see CodeObjects::NamespaceObject + # @see handles + # @see #namespace + # @see #owner + # @see #register + # @see #parse_block + class Base + # For accessing convenience, eg. "MethodObject" + # instead of the full qualified namespace + include YARD::CodeObjects + + include Parser + + class << self + # Clear all registered subclasses. Testing purposes only + # @return [void] + def clear_subclasses + @@subclasses = [] + end + + # Returns all registered handler subclasses. + # @return [Array] a list of handlers + def subclasses + @@subclasses ||= [] + end + + def inherited(subclass) + @@subclasses ||= [] + @@subclasses << subclass + end + + # Declares the statement type which will be processed + # by this handler. + # + # A match need not be unique to a handler. Multiple + # handlers can process the same statement. However, + # in this case, care should be taken to make sure that + # {#parse_block} would only be executed by one of + # the handlers, otherwise the same code will be parsed + # multiple times and slow YARD down. + # + # @param [Parser::Ruby::Legacy::RubyToken, Symbol, String, Regexp] matches + # statements that match the declaration will be + # processed by this handler. A {String} match is + # equivalent to a +/\Astring/+ regular expression + # (match from the beginning of the line), and all + # token matches match only the first token of the + # statement. + # + def handles(*matches) + (@handlers ||= []).concat(matches) + end + + # This class is implemented by {Ruby::Base} and {Ruby::Legacy::Base}. + # To implement a base handler class for another language, implement + # this method to return true if the handler should process the given + # statement object. Use {handlers} to enumerate the matchers declared + # for the handler class. + # + # @param statement a statement object or node (depends on language type) + # @return [Boolean] whether or not this handler object should process + # the given statement + def handles?(statement) # rubocop:disable Lint/UnusedMethodArgument + raise NotImplementedError, "override #handles? in a subclass" + end + + # @return [Array] a list of matchers for the handler object. + # @see handles? + def handlers + @handlers ||= [] + end + + # Declares that the handler should only be called when inside a + # {CodeObjects::NamespaceObject}, not a method body. + # + # @return [void] + def namespace_only + @namespace_only = true + end + + # @return [Boolean] whether the handler should only be processed inside + # a namespace. + def namespace_only? + @namespace_only ||= false + end + + # Declares that a handler should only be called when inside a filename + # by its basename or a regex match for the full path. + # + # @param [String, Regexp] filename a matching filename or regex + # @return [void] + # @since 0.6.2 + def in_file(filename) + (@in_files ||= []) << filename + end + + # @return [Boolean] whether the filename matches the declared file + # match for a handler. If no file match is specified, returns true. + # @since 0.6.2 + def matches_file?(filename) + @in_files ||= nil # avoid ruby warnings + return true unless @in_files + @in_files.any? do |in_file| + case in_file + when String + File.basename(filename) == in_file + when Regexp + filename =~ in_file + else + true + end + end + end + + # Generates a +process+ method, equivalent to +def process; ... end+. + # Blocks defined with this syntax will be wrapped inside an anonymous + # module so that the handler class can be extended with mixins that + # override the +process+ method without alias chaining. + # + # @!macro yard.handlers.process + # @!method process + # Main processing callback + # @return [void] + # @see #process + # @return [void] + # @since 0.5.4 + def process(&block) + mod = Module.new + mod.send(:define_method, :process, &block) + include mod + end + end + + def initialize(source_parser, stmt) + @parser = source_parser + @statement = stmt + end + + # The main handler method called by the parser on a statement + # that matches the {handles} declaration. + # + # Subclasses should override this method to provide the handling + # functionality for the class. + # + # @return [Array, CodeObjects::Base, Object] + # If this method returns a code object (or a list of them), + # they are passed to the +#register+ method which adds basic + # attributes. It is not necessary to return any objects and in + # some cases you may want to explicitly avoid the returning of + # any objects for post-processing by the register method. + # + # @see handles + # @see #register + # + def process + raise NotImplementedError, "#{self} did not implement a #process method for handling." + end + + # Parses the semantic "block" contained in the statement node. + # + # @abstract Subclasses should call {Processor#process parser.process} + def parse_block(*) + raise NotImplementedError, "#{self} did not implement a #parse_block method for handling" + end + + # @return [Processor] the processor object that manages all global state + # during handling. + attr_reader :parser + + # @return [Object] the statement object currently being processed. Usually + # refers to one semantic language statement, though the strict definition + # depends on the parser used. + attr_reader :statement + + # (see Processor#owner) + attr_accessor :owner + + # (see Processor#namespace) + attr_accessor :namespace + + # (see Processor#visibility) + attr_accessor :visibility + + # (see Processor#scope) + attr_accessor :scope + + # (see Processor#globals) + attr_reader :globals + + # (see Processor#extra_state) + attr_reader :extra_state + + undef owner, owner=, namespace, namespace= + undef visibility, visibility=, scope, scope= + undef globals, extra_state + + def owner; parser.owner end + def owner=(v) parser.owner = v end + def namespace; parser.namespace end + def namespace=(v); parser.namespace = v end + def visibility; parser.visibility end + def visibility=(v); parser.visibility = v end + def scope; parser.scope end + def scope=(v); parser.scope = v end + def globals; parser.globals end + def extra_state; parser.extra_state end + + # Aborts a handler by raising {Handlers::HandlerAborted}. + # An exception will only be logged in debugging mode for + # this kind of handler exit. + # + # @since 0.8.4 + def abort! + raise Handlers::HandlerAborted + end + + # Executes a given block with specific state values for {#owner}, + # {#namespace} and {#scope}. + # + # @option opts [CodeObjects::NamespaceObject] :namespace (value of #namespace) + # the namespace object that {#namespace} will be equal to for the + # duration of the block. + # @option opts [Symbol] :scope (:instance) + # the scope for the duration of the block. + # @option opts [CodeObjects::Base] :owner (value of #owner) + # the owner object (method) for the duration of the block + # @yield a block to execute with the given state values. + def push_state(opts = {}) + opts = { + :namespace => namespace, + :scope => :instance, + :owner => owner || namespace, + :visibility => nil + }.update(opts) + + ns = namespace + vis = visibility + sc = scope + oo = owner + self.namespace = opts[:namespace] + self.visibility = opts[:visibility] || :public + self.scope = opts[:scope] + self.owner = opts[:owner] + + yield + + self.namespace = ns + self.visibility = vis + self.scope = sc + self.owner = oo + end + + # Do some post processing on a list of code objects. + # Adds basic attributes to the list of objects like + # the filename, line number, {CodeObjects::Base#dynamic}, + # source code and {CodeObjects::Base#docstring}, + # but only if they don't exist. + # + # @param [Array] objects + # the list of objects to post-process. + # + # @return [CodeObjects::Base, Array] + # returns whatever is passed in, for chainability. + # + def register(*objects) + objects.flatten.each do |object| + next unless object.is_a?(CodeObjects::Base) + register_ensure_loaded(object) + yield(object) if block_given? + register_file_info(object) + register_source(object) + register_visibility(object) + register_docstring(object) + register_group(object) + register_dynamic(object) + register_module_function(object) + end + objects.size == 1 ? objects.first : objects + end + + # Ensures that the object's namespace is loaded before attaching it + # to the namespace. + # + # @param [CodeObjects::Base] object the object to register + # @return [void] + # @since 0.8.0 + def register_ensure_loaded(object) + ensure_loaded!(object.namespace) + object.namespace.children << object + rescue NamespaceMissingError + nil # noop + end + + # Registers the file/line of the declaration with the object + # + # @param [CodeObjects::Base] object the object to register + # @return [void] + # @since 0.8.0 + def register_file_info(object, file = parser.file, line = statement.line, comments = statement.comments) + object.add_file(file, line, comments) + end + + # Registers any docstring found for the object and expands macros + # + # @param [CodeObjects::Base] object the object to register + # @return [void] + # @since 0.8.0 + def register_docstring(object, docstring = statement.comments, stmt = statement) + docstring = docstring.join("\n") if Array === docstring + parser = Docstring.parser + parser.parse(docstring || "", object, self) + + if object && docstring + object.docstring = parser.to_docstring + + # Add hash_flag/line_range + if stmt + object.docstring.hash_flag = stmt.comments_hash_flag + object.docstring.line_range = stmt.comments_range + end + end + + register_transitive_tags(object) + end + + # Registers the object as being inside a specific group + # + # @param [CodeObjects::Base] object the object to register + # @return [void] + # @since 0.8.0 + def register_group(object, group = extra_state.group) + if group + unless object.namespace.is_a?(Proxy) + object.namespace.groups |= [group] + end + object.group = group + end + end + + # Registers any transitive tags from the namespace on the object + # + # @param [CodeObjects::Base, nil] object the object to register + # @return [void] + # @since 0.8.0 + def register_transitive_tags(object) + return unless object && !object.namespace.is_a?(Proxy) + Tags::Library.transitive_tags.each do |tag| + next unless object.namespace.has_tag?(tag) + next if object.has_tag?(tag) + object.add_tag(*object.namespace.tags(tag)) + end + end + + # @param [CodeObjects::Base] object the object to register + # @return [void] + # @since 0.8.0 + def register_source(object, source = statement, type = parser.parser_type) + return unless object.is_a?(MethodObject) + object.source ||= source + object.source_type = type + end + + # Registers visibility on a method object. If the object does not + # respond to setting visibility, nothing is done. + # + # @param [#visibility=] object the object to register + # @param [Symbol] visibility the visibility to set on the object + # @since 0.8.0 + def register_visibility(object, visibility = self.visibility) + return unless object.respond_to?(:visibility=) + return if object.is_a?(NamespaceObject) + object.visibility = visibility + end + + # Registers the same method information on the module function, if + # the object was defined as a module function. + # + # @param [CodeObjects::Base] object the possible module function object + # to copy data for + # @since 0.8.0 + def register_module_function(object) + return unless object.is_a?(MethodObject) + return unless object.module_function? + modobj = MethodObject.new(object.namespace, object.name) + object.copy_to(modobj) + modobj.visibility = :private # rubocop:disable Lint/UselessSetterCall + end + + # Registers the object as dynamic if the object is defined inside + # a method or block (owner != namespace) + # + # @param [CodeObjects::Base] object the object to register + # @return [void] + # @since 0.8.0 + def register_dynamic(object) + object.dynamic = true if owner != namespace + end + + # Ensures that a specific +object+ has been parsed and loaded into the + # registry. This is necessary when adding data to a namespace, for instance, + # since the namespace may not have been processed yet (it can be located + # in a file that has not been handled). + # + # Calling this method defers the handler until all other files have been + # processed. If the object gets resolved, the rest of the handler continues, + # otherwise an exception is raised. + # + # @example Adding a mixin to the String class programmatically + # ensure_loaded! P('String') + # # "String" is now guaranteed to be loaded + # P('String').mixins << P('MyMixin') + # + # @param [Proxy, CodeObjects::Base] object the object to resolve. + # @param [Integer] max_retries the number of times to defer the handler + # before raising a +NamespaceMissingError+. + # @raise [NamespaceMissingError] if the object is not resolved within + # +max_retries+ attempts, this exception is raised and the handler + # finishes processing. + def ensure_loaded!(object, max_retries = 1) + return if object.root? + return object unless object.is_a?(Proxy) + + retries = 0 + while object.is_a?(Proxy) + raise NamespaceMissingError, object if retries > max_retries + log.debug "Missing object #{object} in file `#{parser.file}', moving it to the back of the line." + parser.parse_remaining_files + retries += 1 + end + object + end + + # @group Macro Support + + # @abstract Implement this method to return the parameters in a method call + # statement. It should return an empty list if the statement is not a + # method call. + # @return [Array] a list of argument names + def call_params + raise NotImplementedError + end + + # @abstract Implement this method to return the method being called in + # a method call. It should return nil if the statement is not a method + # call. + # @return [String] the method name being called + # @return [nil] if the statement is not a method call + def caller_method + raise NotImplementedError + end + end + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/handlers/c/alias_handler.rb b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/handlers/c/alias_handler.rb new file mode 100644 index 000000000..85a99bd75 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/handlers/c/alias_handler.rb @@ -0,0 +1,16 @@ +# frozen_string_literal: true +class YARD::Handlers::C::AliasHandler < YARD::Handlers::C::Base + MATCH = /rb_define_alias + \s*\(\s*([\w\.]+), + \s*"([^"]+)", + \s*"([^"]+)"\s*\)/xm + handles MATCH + statement_class BodyStatement + + process do + statement.source.scan(MATCH) do |var_name, new_name, old_name| + var_name = "rb_cObject" if var_name == "rb_mKernel" + handle_alias(var_name, new_name, old_name) + end + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/handlers/c/attribute_handler.rb b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/handlers/c/attribute_handler.rb new file mode 100644 index 000000000..537ea12e7 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/handlers/c/attribute_handler.rb @@ -0,0 +1,13 @@ +# frozen_string_literal: true +class YARD::Handlers::C::AttributeHandler < YARD::Handlers::C::Base + MATCH = /rb_define_attr\s*\(\s*([\w\.]+),\s*"([^"]+)",\s*(0|1)\s*,\s*(0|1)\s*\)/ + handles MATCH + + process do + return if ToplevelStatement == statement + return if Comment === statement && statement.type != :multi + statement.source.scan(MATCH) do |var_name, name, read, write| + handle_attribute(var_name, name, read, write) + end + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/handlers/c/base.rb b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/handlers/c/base.rb new file mode 100644 index 000000000..78420d132 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/handlers/c/base.rb @@ -0,0 +1,164 @@ +# frozen_string_literal: true +module YARD + module Handlers + module C + class Base < Handlers::Base + include YARD::Parser::C + include HandlerMethods + + # @return [Boolean] whether the handler handles this statement + def self.handles?(statement, processor) + processor.globals.cruby_processed_files ||= {} + processor.globals.cruby_processed_files[processor.file] = true + + src = statement.respond_to?(:declaration) ? + statement.declaration : statement.source + + handlers.any? do |a_handler| + statement_class >= statement.class && + case a_handler + when String + src == a_handler + when Regexp + src =~ a_handler + end + end + end + + def self.statement_class(type = nil) + if type + @statement_class = type + else + (defined?(@statement_class) && @statement_class) || Statement + end + end + + # @group Registering objects + + def register_docstring(object, docstring = nil, stmt = nil) + super(object, docstring, stmt) if docstring + end + + def register_file_info(object, file = nil, line = nil, comments = nil) + super(object, file, line, comments) if file + end + + def register_source(object, source = nil, type = nil) + super(object, source, type) if source + end + + def register_visibility(object, visibility = nil) + super(object, visibility) if visibility + end + + # @group Looking up Symbol and Var Values + + def symbols + globals.cruby_symbols ||= {} + end + + def override_comments + globals.cruby_override_comments ||= [] + end + + def namespace_for_variable(var) + return namespaces[var] if namespaces[var] + + # The global variables for Ruby's core error classes does not + # represent their Ruby name. So we need to look up these names. + name = ERROR_CLASS_NAMES[var] + return P(name) if name + + # Otherwise the name is inferred from the C variable name. + var = remove_var_prefix(var) + var.empty? ? nil : P(var) + end + + def ensure_variable_defined!(var, max_retries = 1) + retries = 0 + object = nil + + loop do + object = namespace_for_variable(var) + break unless object.is_a?(Proxy) + + raise NamespaceMissingError, object if retries > max_retries + log.debug "Missing namespace variable #{var} in file `#{parser.file}', moving it to the back of the line." + parser.parse_remaining_files + retries += 1 + end + + object + end + + def namespaces + globals.cruby_namespaces ||= {} + end + + def processed_files + globals.cruby_processed_files ||= {} + end + + # @group Parsing an Inner Block + + def parse_block(opts = {}) + return if !statement.block || statement.block.empty? + push_state(opts) do + parser.process(statement.block) + end + end + + # @group Processing other files + + def process_file(file, object) + file = File.cleanpath(file) + return if processed_files[file] + processed_files[file] = file + begin + log.debug "Processing embedded call to C source #{file}..." + globals.ordered_parser.files.delete(file) if globals.ordered_parser + parser.process(Parser::C::CParser.new(File.read(file), file).parse) + rescue Errno::ENOENT + log.warn "Missing source file `#{file}' when parsing #{object}" + end + end + + # @endgroup + + private + + # Generated by update_error_map.rb (Copy+past results) + ERROR_CLASS_NAMES = { + 'rb_eArgError' => 'ArgumentError', + 'rb_eEncodingError' => 'EncodingError', + 'rb_eException' => 'Exception', + 'rb_eFatal' => 'fatal', + 'rb_eFrozenError' => 'FrozenError', + 'rb_eIndexError' => 'IndexError', + 'rb_eInterrupt' => 'Interrupt', + 'rb_eKeyError' => 'KeyError', + 'rb_eLoadError' => 'LoadError', + 'rb_eNameError' => 'NameError', + 'rb_eNoMatchingPatternError' => 'NoMatchingPatternError', + 'rb_eNoMemError' => 'NoMemoryError', + 'rb_eNoMethodError' => 'NoMethodError', + 'rb_eNotImpError' => 'NotImplementedError', + 'rb_eRangeError' => 'RangeError', + 'rb_eRuntimeError' => 'RuntimeError', + 'rb_eScriptError' => 'ScriptError', + 'rb_eSecurityError' => 'SecurityError', + 'rb_eSignal' => 'SignalException', + 'rb_eStandardError' => 'StandardError', + 'rb_eSyntaxError' => 'SyntaxError', + 'rb_eSystemCallError' => 'SystemCallError', + 'rb_eSystemExit' => 'SystemExit', + 'rb_eTypeError' => 'TypeError', + } + + def remove_var_prefix(var) + var.gsub(/^rb_[mc]|^[a-z_]+/, '') + end + end + end + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/handlers/c/class_handler.rb b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/handlers/c/class_handler.rb new file mode 100644 index 000000000..aac65fce5 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/handlers/c/class_handler.rb @@ -0,0 +1,27 @@ +# frozen_string_literal: true +class YARD::Handlers::C::ClassHandler < YARD::Handlers::C::Base + MATCH1 = /([\w\.]+)\s* = \s*(?:rb_define_class|boot_defclass)\s* + \( + \s*"([\w:]+)", + \s*(\w+|0)\s* + \)/mx + + MATCH2 = /([\w\.]+)\s* = \s*rb_define_class_under\s* + \( + \s*(\w+), + \s*"(\w+)"(?:, + \s*([\w\*\s\(\)\.\->]+)\s*)? # for SWIG + \s*\)/mx + handles MATCH1 + handles MATCH2 + statement_class BodyStatement + + process do + statement.source.scan(MATCH1) do |var_name, class_name, parent| + handle_class(var_name, class_name, parent) + end + statement.source.scan(MATCH2) do |var_name, in_module, class_name, parent| + handle_class(var_name, class_name, parent.strip, in_module) + end + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/handlers/c/constant_handler.rb b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/handlers/c/constant_handler.rb new file mode 100644 index 000000000..e98d279f4 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/handlers/c/constant_handler.rb @@ -0,0 +1,13 @@ +# frozen_string_literal: true +class YARD::Handlers::C::ConstantHandler < YARD::Handlers::C::Base + MATCH = /\brb_define_((?:readonly_)?variable|(?:global_)?const) + \s*\((?:\s*(\w+),)?\s*"(\w+)",\s*(.*?)\s*\)\s*;/xm + handles MATCH + statement_class BodyStatement + + process do + statement.source.scan(MATCH) do |type, var_name, const_name, value| + handle_constants(type, var_name, const_name, value) + end + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/handlers/c/handler_methods.rb b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/handlers/c/handler_methods.rb new file mode 100644 index 000000000..9f1769b78 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/handlers/c/handler_methods.rb @@ -0,0 +1,212 @@ +# frozen_string_literal: true +module YARD + module Handlers + module C + module HandlerMethods + include Parser::C + include CodeObjects + include Common::MethodHandler + + def handle_class(var_name, class_name, parent, in_module = nil) + parent = nil if parent == "0" + namespace = in_module ? ensure_variable_defined!(in_module) : Registry.root + if namespace.nil? + raise Parser::UndocumentableError, + "class #{class_name}. Cannot find definition for parent namespace." + end + + register ClassObject.new(namespace, class_name) do |obj| + if parent + parent_class = namespace_for_variable(parent) + if parent_class.is_a?(Proxy) + obj.superclass = "::#{parent_class.path}" + obj.superclass.type = :class + else + obj.superclass = parent_class + end + end + namespaces[var_name] = obj + register_file_info(obj, statement.file, statement.line) + end + end + + def handle_module(var_name, module_name, in_module = nil) + namespace = in_module ? ensure_variable_defined!(in_module) : Registry.root + if namespace.nil? + raise Parser::UndocumentableError, + "module #{module_name}. Cannot find definition for parent namespace." + end + + register ModuleObject.new(namespace, module_name) do |obj| + namespaces[var_name] = obj + register_file_info(obj, statement.file, statement.line) + end + end + + def handle_method(scope, var_name, name, func_name, _source_file = nil) + visibility = :public + case scope + when "singleton_method"; scope = :class + when "module_function"; scope = :module + when "private_method"; scope = :instance; visibility = :private + else; scope = :instance + end + + namespace = namespace_for_variable(var_name) + + # Is this method being defined on a core Ruby class or module? + if namespace.is_a?(Proxy) + if var_name =~ /^rb_c(\w+)/ && YARD::CodeObjects::BUILTIN_CLASSES.include?($1) + namespace = namespaces[var_name] = YARD::CodeObjects::ClassObject.new(:root, $1) + elsif var_name =~ /^rb_m(\w+)/ && YARD::CodeObjects::BUILTIN_MODULES.include?($1) + namespace = namespaces[var_name] = YARD::CodeObjects::ModuleObject.new(:root, $1) + end + end + + return if namespace.nil? # XXX: raise UndocumentableError might be too noisy. + register MethodObject.new(namespace, name, scope) do |obj| + register_visibility(obj, visibility) + find_method_body(obj, func_name) + obj.explicit = true + add_predicate_return_tag(obj) if name =~ /\?$/ + end + end + + def handle_attribute(var_name, name, read, write) + values = {:read => read.to_i, :write => write.to_i} + {:read => name, :write => "#{name}="}.each do |type, meth_name| + next unless values[type] > 0 + obj = handle_method(:instance, var_name, meth_name, nil) + register_file_info(obj, statement.file, statement.line) + obj.namespace.attributes[:instance][name] ||= SymbolHash[:read => nil, :write => nil] + obj.namespace.attributes[:instance][name][type] = obj + end + end + + def handle_alias(var_name, new_name, old_name) + namespace = namespace_for_variable(var_name) + return if namespace.nil? + new_meth = new_name.to_sym + old_meth = old_name.to_sym + old_obj = namespace.child(:name => old_meth, :scope => :instance) + new_obj = register MethodObject.new(namespace, new_meth, :instance) do |o| + register_visibility(o, visibility) + register_file_info(o, statement.file, statement.line) + end + + if old_obj + new_obj.signature = old_obj.signature + new_obj.source = old_obj.source + new_obj.docstring = old_obj.docstring + new_obj.docstring.object = new_obj + else + new_obj.signature = "def #{new_meth}" # this is all we know. + end + + namespace.aliases[new_obj] = old_meth + end + + def handle_constants(type, var_name, const_name, value) + return unless type =~ /^const$|^global_const$/ + namespace = type == 'global_const' ? + :root : namespace_for_variable(var_name) + register ConstantObject.new(namespace, const_name) do |obj| + obj.source_type = :c + obj.value = value + register_file_info(obj, statement.file, statement.line) + find_constant_docstring(obj) + end + end + + private + + def find_constant_docstring(object) + comment = nil + + # look inside overrides for declaration value + override_comments.each do |name, override_comment| + next unless override_comment.file == statement.file + just_const_name = name.gsub(/\A.+::/, '') + if object.path == name || object.name.to_s == just_const_name + comment = override_comment.source + break + end + end + + # use any comments on this statement as a last resort + if comment.nil? && statement.comments && statement.comments.source =~ /\S/ + comment = statement.comments.source + stmt = statement.comments + end + + # In the case of rb_define_const, the definition and comment are in + # "/* definition: comment */" form. The literal ':' and '\' characters + # can be escaped with a backslash. + if comment + comment.scan(/\A\s*(.*?[^\s\\]):\s*(.+)/m) do |new_value, new_comment| + object.value = new_value.gsub(/\\:/, ':') + comment = new_comment + end + register_docstring(object, comment, stmt) + end + end + + def find_method_body(object, symbol) + file = statement.file + in_file = false + if statement.comments && statement.comments.source =~ /\A\s*in (\S+)\Z/ + file = $1 + in_file = true + process_file(file, object) + end + + src_stmt = symbols[symbol] + if src_stmt + register_file_info(object, src_stmt.file, src_stmt.line, true) + register_source(object, src_stmt) + record_parameters(object, symbol, src_stmt) + unless src_stmt.comments.nil? || src_stmt.comments.source.empty? + register_docstring(object, src_stmt.comments.source, src_stmt) + return # found docstring + end + end + + # found source (possibly) but no docstring + # so look in overrides + return if override_comments.any? do |name, override_comment| + next unless override_comment.file == file + name = name.gsub(/::([^:\.#]+?)\Z/, '.\1') + + # explicit namespace in override comment + path = (name =~ /\.|#/ ? object.path : object.name.to_s) + if path == name || path == name.sub(/new$/, 'initialize') || path == name.sub('.', '#') + register_docstring(object, override_comment.source, override_comment) + true + else + false + end + end + + # use any comments on this statement as a last resort + if !in_file && statement.comments && statement.comments.source =~ /\S/ + register_docstring(object, statement.comments.source, statement) + end + end + + def record_parameters(object, symbol, src) + # use regex to extract comma-delimited list of parameters from cfunc definition + if src.source =~ /VALUE\s+#{symbol}\(([^)]*)\)\s*\{/m + params = $~[1].split(/\s*,\s*/) # rubocop:disable Style/SpecialGlobalVars + # cfunc for a "varargs" method has params "int argc, VALUE *argv" + if params[0] =~ /int\s+argc/ && params[1] =~ /VALUE\s*\*\s*argv/ + object.parameters = [['*args', nil]] + else + # the first cfunc argument is the 'self' argument, we don't need that + object.parameters = params.drop(1).map {|s| [s[/VALUE\s+(\S+)/, 1], nil] } + end + end + end + end + end + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/handlers/c/init_handler.rb b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/handlers/c/init_handler.rb new file mode 100644 index 000000000..792bbbbd8 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/handlers/c/init_handler.rb @@ -0,0 +1,20 @@ +# frozen_string_literal: true +# Handles the Init_Libname() method +class YARD::Handlers::C::InitHandler < YARD::Handlers::C::Base + MATCH = /\A\s*(?:\S+\s+)*void\s+(?:[Ii]nit_)?(\w+)\s*/ + handles MATCH + statement_class ToplevelStatement + + process do + parse_block + decl = statement.declaration[MATCH, 1] + if decl + ns = namespace_for_variable(decl) + if ns.is_a?(YARD::CodeObjects::NamespaceObject) && ns.docstring.blank? + if statement.comments + register_docstring(ns, statement.comments.source, statement) + end + end + end + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/handlers/c/method_handler.rb b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/handlers/c/method_handler.rb new file mode 100644 index 000000000..7799ffcd5 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/handlers/c/method_handler.rb @@ -0,0 +1,45 @@ +# frozen_string_literal: true +class YARD::Handlers::C::MethodHandler < YARD::Handlers::C::Base + MATCH1 = /rb_define_ + ( + singleton_method | + method | + module_function | + private_method + ) + \s*\(\s*([\w\.]+)\s*, + \s*"([^"]+)"\s*, + \s*(?:RUBY_METHOD_FUNC\(|VALUEFUNC\(|\(\w+\))?(\w+)\)?\s*, + \s*(-?\w+)\s*\)/xm + MATCH2 = /rb_define_global_function\s*\( + \s*"([^"]+)", + \s*(?:RUBY_METHOD_FUNC\(|VALUEFUNC\(|\(\w+\))?(\w+)\)?, + \s*(-?\w+)\s*\)/xm + MATCH3 = /define_filetest_function\s*\( + \s*"([^"]+)", + \s*(?:RUBY_METHOD_FUNC\(|VALUEFUNC\(|\(\w+\))?(\w+)\)?, + \s*(-?\w+)\s*\)/xm + handles MATCH1 + handles MATCH2 + handles MATCH3 + statement_class BodyStatement + + process do + statement.source.scan(MATCH1) do |type, var_name, name, func_name, _param_count| + break if var_name == "ruby_top_self" + break if var_name == "nstr" + break if var_name == "envtbl" + + var_name = "rb_cObject" if var_name == "rb_mKernel" + handle_method(type, var_name, name, func_name) + end + + statement.source.scan(MATCH2) do |name, func_name, _param_count| + handle_method("method", "rb_mKernel", name, func_name) + end + + statement.source.scan(MATCH3) do |name, func_name, _param_count| + handle_method("singleton_method", "rb_cFile", name, func_name) + end + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/handlers/c/mixin_handler.rb b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/handlers/c/mixin_handler.rb new file mode 100644 index 000000000..7688326db --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/handlers/c/mixin_handler.rb @@ -0,0 +1,21 @@ +# frozen_string_literal: true +class YARD::Handlers::C::MixinHandler < YARD::Handlers::C::Base + MATCH = /rb_include_module\s*\(\s*(\w+?),\s*(\w+?)\s*\)/ + handles MATCH + statement_class BodyStatement + + process do + statement.source.scan(MATCH) do |klass_var, mixin_var| + namespace = namespace_for_variable(klass_var) + ensure_loaded!(namespace) + + var = namespace_for_variable(mixin_var) + if var + namespace.mixins(:instance) << var + else + raise YARD::Parser::UndocumentableError, + "CRuby mixin for unrecognized variable '#{mixin_var}'" + end + end + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/handlers/c/module_handler.rb b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/handlers/c/module_handler.rb new file mode 100644 index 000000000..aaf5998df --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/handlers/c/module_handler.rb @@ -0,0 +1,17 @@ +# frozen_string_literal: true +class YARD::Handlers::C::ModuleHandler < YARD::Handlers::C::Base + MATCH1 = /([\w\.]+)\s* = \s*rb_define_module\s*\(\s*"([\w:]+)"\s*\)/mx + MATCH2 = /([\w\.]+)\s* = \s*rb_define_module_under\s*\(\s*(\w+),\s*"(\w+)"\s*\)/mx + handles MATCH1 + handles MATCH2 + statement_class BodyStatement + + process do + statement.source.scan(MATCH1) do |var_name, module_name| + handle_module(var_name, module_name) + end + statement.source.scan(MATCH2) do |var_name, in_module, module_name| + handle_module(var_name, module_name, in_module) + end + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/handlers/c/override_comment_handler.rb b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/handlers/c/override_comment_handler.rb new file mode 100644 index 000000000..0af2afdf6 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/handlers/c/override_comment_handler.rb @@ -0,0 +1,31 @@ +# frozen_string_literal: true +# Parses comments +class YARD::Handlers::C::OverrideCommentHandler < YARD::Handlers::C::Base + handles(/./) + statement_class Comment + + process do + return if statement.overrides.empty? + statement.overrides.each do |type, name| + override_comments << [name, statement] + obj = nil + case type + when :class + name, superclass = *name.split(/\s*<\s*/) + obj = YARD::CodeObjects::ClassObject.new(:root, name) + obj.superclass = "::#{superclass}" if superclass + when :module + obj = YARD::CodeObjects::ModuleObject.new(:root, name) + end + register(obj) + end + end + + def register_docstring(object, docstring = statement.source, stmt = statement) + super + end + + def register_file_info(object, file = parser.file, line = statement.line, comments = statement.comments) + super + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/handlers/c/path_handler.rb b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/handlers/c/path_handler.rb new file mode 100644 index 000000000..63cf8e34a --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/handlers/c/path_handler.rb @@ -0,0 +1,11 @@ +# frozen_string_literal: true +class YARD::Handlers::C::PathHandler < YARD::Handlers::C::Base + MATCH = /([\w\.]+)\s* = \s*rb_path2class\s*\(\s*"([\w:]+)"\)/mx + handles MATCH + + process do + statement.source.scan(MATCH) do |var_name, path| + namespaces[var_name] = P(path) + end + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/handlers/c/struct_handler.rb b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/handlers/c/struct_handler.rb new file mode 100644 index 000000000..37092d3e0 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/handlers/c/struct_handler.rb @@ -0,0 +1,13 @@ +# frozen_string_literal: true +class YARD::Handlers::C::StructHandler < YARD::Handlers::C::Base + MATCH = /([\w\.]+)\s*=\s*(?:rb_struct_define_without_accessor)\s* + \(\s*"([\w:]+)"\s*,\s*(\w+)\s*/mx + handles MATCH + statement_class BodyStatement + + process do + statement.source.scan(MATCH) do |var_name, class_name, parent| + handle_class(var_name, class_name, parent) + end + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/handlers/c/symbol_handler.rb b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/handlers/c/symbol_handler.rb new file mode 100644 index 000000000..4d12b1a0e --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/handlers/c/symbol_handler.rb @@ -0,0 +1,8 @@ +# frozen_string_literal: true +# Keeps track of function bodies for symbol lookup during Ruby method declarations +class YARD::Handlers::C::SymbolHandler < YARD::Handlers::C::Base + MATCH = /\A\s*(?:(?:\w+)\s+)?(?:intern\s+)?VALUE\s+(\w+)\s*\(/ + handles MATCH + statement_class ToplevelStatement + process { symbols[statement.source[MATCH, 1]] = statement } +end diff --git a/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/handlers/common/method_handler.rb b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/handlers/common/method_handler.rb new file mode 100644 index 000000000..3df668ea3 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/handlers/common/method_handler.rb @@ -0,0 +1,19 @@ +# frozen_string_literal: true + +module YARD::Handlers + module Common + # Shared functionality between Ruby and C method handlers. + module MethodHandler + # @param [MethodObject] obj + def add_predicate_return_tag(obj) + if obj.tag(:return) && (obj.tag(:return).types || []).empty? + obj.tag(:return).types = ['Boolean'] + elsif obj.tag(:return).nil? + unless obj.tags(:overload).any? {|overload| overload.tag(:return) } + obj.add_tag(YARD::Tags::Tag.new(:return, "", "Boolean")) + end + end + end + end + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/handlers/processor.rb b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/handlers/processor.rb new file mode 100644 index 000000000..d6ea675ad --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/handlers/processor.rb @@ -0,0 +1,200 @@ +# frozen_string_literal: true +require 'ostruct' + +module YARD + module Handlers + # Iterates over all statements in a file and delegates them to the + # {Handlers::Base} objects that are registered to handle the statement. + # + # This class is passed to each handler and keeps overall processing state. + # For example, if the {#visibility} is set in a handler, all following + # statements will have access to this state. This allows "public", + # "protected" and "private" statements to be handled in classes and modules. + # In addition, the {#namespace} can be set during parsing to control + # where objects are being created from. You can also access extra stateful + # properties that any handler can set during the duration of the post + # processing of a file from {#extra_state}. If you need to access state + # across different files, look at {#globals}. + # + # @see Handlers::Base + class Processor + class << self + # Registers a new namespace for handlers of the given type. + # @since 0.6.0 + def register_handler_namespace(type, ns) + namespace_for_handler[type] = ns + end + + # @return [Hash] a list of registered parser type extensions + # @private + # @since 0.6.0 + attr_reader :namespace_for_handler + undef namespace_for_handler + def namespace_for_handler; @@parser_type_extensions ||= {} end + end + + register_handler_namespace :ruby, Ruby + register_handler_namespace :ruby18, Ruby::Legacy + register_handler_namespace :c, C + + # @return [String] the filename + attr_accessor :file + + # @return [CodeObjects::NamespaceObject] the current namespace + attr_accessor :namespace + + # @return [Symbol] the current visibility (public, private, protected) + attr_accessor :visibility + + # @return [Symbol] the current scope (class, instance) + attr_accessor :scope + + # @return [CodeObjects::Base, nil] unlike the namespace, the owner + # is a non-namespace object that should be stored between statements. + # For instance, when parsing a method body, the {CodeObjects::MethodObject} + # is set as the owner, in case any extra method information is processed. + attr_accessor :owner + + # @return [Symbol] the parser type (:ruby, :ruby18, :c) + attr_accessor :parser_type + + # Handlers can share state for the entire post processing stage through + # this attribute. Note that post processing stage spans multiple files. + # To share state only within a single file, use {#extra_state} + # + # @example Sharing state among two handlers + # class Handler1 < YARD::Handlers::Ruby::Base + # handles :class + # process { globals.foo = :bar } + # end + # + # class Handler2 < YARD::Handlers::Ruby::Base + # handles :method + # process { puts globals.foo } + # end + # @return [OpenStruct] global shared state for post-processing stage + # @see #extra_state + attr_accessor :globals + + # Share state across different handlers inside of a file. + # This attribute is similar to {#visibility}, {#scope}, {#namespace} + # and {#owner}, in that they all maintain state across all handlers + # for the entire source file. Use this attribute to store any data + # your handler might need to save during the parsing of a file. If + # you need to save state across files, see {#globals}. + # + # @return [OpenStruct] an open structure that can store arbitrary data + # @see #globals + attr_accessor :extra_state + + # Creates a new Processor for a +file+. + # @param [Parser::SourceParser] parser the parser used to initialize the processor + def initialize(parser) + @file = parser.file || "(stdin)" + @namespace = YARD::Registry.root + @visibility = :public + @scope = :instance + @owner = @namespace + @parser_type = parser.parser_type + @handlers_loaded = {} + @globals = parser.globals || OpenStruct.new + @extra_state = OpenStruct.new + load_handlers + end + + # Processes a list of statements by finding handlers to process each + # one. + # + # @param [Array] statements a list of statements + # @return [void] + def process(statements) + statements.each_with_index do |stmt, _index| + find_handlers(stmt).each do |handler| + begin + handler.new(self, stmt).process + rescue HandlerAborted + log.debug "#{handler} cancelled from #{caller.last}" + log.debug "\tin file '#{file}':#{stmt.line}:\n\n" + stmt.show + "\n" + rescue NamespaceMissingError => missingerr + log.warn "The #{missingerr.object.type} #{missingerr.object.path} has not yet been recognized.\n" \ + "If this class/method is part of your source tree, this will affect your documentation results.\n" \ + "You can correct this issue by loading the source file for this object before `#{file}'\n" + rescue Parser::UndocumentableError => undocerr + log.warn "in #{handler}: Undocumentable #{undocerr.message}\n" \ + "\tin file '#{file}':#{stmt.line}:\n\n" + stmt.show + "\n" + rescue => e + log.error "Unhandled exception in #{handler}:\n" \ + " in `#{file}`:#{stmt.line}:\n\n#{stmt.show}\n" + log.backtrace(e) + end + end + end + end + + # Continue parsing the remainder of the files in the +globals.ordered_parser+ + # object. After the remainder of files are parsed, processing will continue + # on the current file. + # + # @return [void] + # @see Parser::OrderedParser + def parse_remaining_files + if globals.ordered_parser + globals.ordered_parser.parse + log.debug("Re-processing #{@file}...") + end + end + + # Searches for all handlers in {Base.subclasses} that match the +statement+ + # + # @param statement the statement object to match. + # @return [Array] a list of handlers to process the statement with. + def find_handlers(statement) + Base.subclasses.find_all do |handler| + handler_base_class > handler && + (handler.namespace_only? ? owner.is_a?(CodeObjects::NamespaceObject) : true) && + handles?(handler, statement) + end + end + + private + + def handles?(handler, statement) + return false unless handler.matches_file?(file) + if handler.method(:handles?).arity == 1 + handler.handles?(statement) + elsif [-1, 2].include?(handler.method(:handles?).arity) + handler.handles?(statement, self) + end + end + + # Returns the handler base class + # @return [Base] the base class + def handler_base_class + handler_base_namespace.const_get(:Base) + end + + # The module holding the handlers to be loaded + # + # @return [Module] the module containing the handlers depending on + # {#parser_type}. + def handler_base_namespace + self.class.namespace_for_handler[parser_type] + end + + # Loads handlers from {#handler_base_namespace}. This ensures that + # Ruby1.9 handlers are never loaded into 1.8; also lowers the amount + # of modules that are loaded + # @return [void] + def load_handlers + return if @handlers_loaded[parser_type] + handler_base_namespace.constants.each do |c| + const = handler_base_namespace.const_get(c) + unless Handlers::Base.subclasses.include?(const) + Handlers::Base.subclasses << const + end + end + @handlers_loaded[parser_type] = true + end + end + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/handlers/ruby/alias_handler.rb b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/handlers/ruby/alias_handler.rb new file mode 100644 index 000000000..965cd86a8 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/handlers/ruby/alias_handler.rb @@ -0,0 +1,45 @@ +# frozen_string_literal: true +# Handles alias and alias_method calls +class YARD::Handlers::Ruby::AliasHandler < YARD::Handlers::Ruby::Base + handles :alias, method_call(:alias_method) + namespace_only + + process do + names = [] + if statement.type == :alias + nodes = [:ident, :op, :kw, :const, :tstring_content, :string_content] + names = statement.map {|o| o.jump(*nodes).source } + elsif statement.call? + statement.parameters(false).each do |obj| + case obj.type + when :symbol_literal + names << obj.jump(:ident, :op, :kw, :const).source + when :string_literal, :dyna_symbol + names << obj.jump(:string_content, :tstring_content).source + end + end + end + raise YARD::Parser::UndocumentableError, "alias/alias_method" if names.size != 2 + + new_meth = names[0].to_sym + old_meth = names[1].to_sym + old_obj = namespace.child(:name => old_meth, :scope => scope) + new_obj = register MethodObject.new(namespace, new_meth, scope) do |o| + o.add_file(parser.file, statement.line) + end + namespace.aliases[new_obj] = old_meth + + if old_obj + new_obj.signature = old_obj.signature + new_obj.source = old_obj.source + comments = [old_obj.docstring.to_raw, statement.comments].join("\n") + doc = YARD::Docstring.parser.parse(comments, new_obj, self) + new_obj.docstring = doc.to_docstring + new_obj.docstring.line_range = statement.comments_range + new_obj.docstring.hash_flag = statement.comments_hash_flag + new_obj.docstring.object = new_obj + else + new_obj.signature = "def #{new_meth}" # this is all we know. + end + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/handlers/ruby/attribute_handler.rb b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/handlers/ruby/attribute_handler.rb new file mode 100644 index 000000000..fa39e1505 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/handlers/ruby/attribute_handler.rb @@ -0,0 +1,87 @@ +# frozen_string_literal: true +# Handles +attr_*+ statements in modules/classes +class YARD::Handlers::Ruby::AttributeHandler < YARD::Handlers::Ruby::Base + handles method_call(:attr) + handles method_call(:attr_reader) + handles method_call(:attr_writer) + handles method_call(:attr_accessor) + namespace_only + + process do + return if statement.type == :var_ref || statement.type == :vcall + read = true + write = false + params = statement.parameters(false).dup + + # Change read/write based on attr_reader/writer/accessor + case statement.method_name(true) + when :attr + # In the case of 'attr', the second parameter (if given) isn't a symbol. + if params.size == 2 + write = true if params.pop == s(:var_ref, s(:kw, "true")) + end + when :attr_accessor + write = true + when :attr_reader + # change nothing + when :attr_writer + read = false + write = true + end + + # Add all attributes + validated_attribute_names(params).each do |name| + namespace.attributes[scope][name] ||= SymbolHash[:read => nil, :write => nil] + + # Show their methods as well + {:read => name, :write => "#{name}="}.each do |type, meth| + if type == :read ? read : write + o = MethodObject.new(namespace, meth, scope) + if type == :write + o.parameters = [['value', nil]] + src = "def #{meth}(value)" + full_src = "#{src}\n @#{name} = value\nend" + doc = "Sets the attribute #{name}\n@param value the value to set the attribute #{name} to." + else + src = "def #{meth}" + full_src = "#{src}\n @#{name}\nend" + doc = "Returns the value of attribute #{name}." + end + o.source ||= full_src + o.signature ||= src + register(o) + o.docstring = doc if o.docstring.blank?(false) + + # Regsiter the object explicitly + namespace.attributes[scope][name][type] = o + else + obj = namespace.children.find {|other| other.name == meth.to_sym && other.scope == scope } + + # register an existing method as attribute + namespace.attributes[scope][name][type] = obj if obj + end + end + end + end + + protected + + # Strips out any non-essential arguments from the attr statement. + # + # @param [Array] params a list of the parameters + # in the attr call. + # @return [Array] the validated attribute names + # @raise [Parser::UndocumentableError] if the arguments are not valid. + def validated_attribute_names(params) + params.map do |obj| + case obj.type + when :symbol_literal + obj.jump(:ident, :op, :kw, :const).source + when :string_literal + obj.jump(:string_content).source + else + raise YARD::Parser::UndocumentableError, obj.source + end + end + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/handlers/ruby/base.rb b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/handlers/ruby/base.rb new file mode 100644 index 000000000..f33420767 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/handlers/ruby/base.rb @@ -0,0 +1,165 @@ +# frozen_string_literal: true +module YARD + module Handlers + module Ruby + # To implement a custom handler matcher, subclass this class and implement + # {#matches?} to return whether a node matches the handler. + # + # @example A Custom Handler Matcher Extension + # # Implements a handler that checks for a specific string + # # in the node's source. + # class MyExtension < HandlesExtension + # def matches?(node) node.source.include?(name) end + # end + # + # # This handler will handle any node where the source includes 'foo' + # class MyHandler < Handlers::Ruby::Base + # handles MyExtension.new('foo') + # end + class HandlesExtension + # Creates a new extension with a specific matcher value +name+ + # @param [Object] name the matcher value to check against {#matches?} + def initialize(name) @name = name end + + # Tests if the node matches the handler + # @param [Parser::Ruby::AstNode] node a Ruby node + # @return [Boolean] whether the +node+ matches the handler + def matches?(node) # rubocop:disable Lint/UnusedMethodArgument + raise NotImplementedError + end + + protected + + # @return [String] the extension matcher value + attr_reader :name + end + + class MethodCallWrapper < HandlesExtension + def matches?(node) + case node.type + when :var_ref + if !node.parent || node.parent.type == :list + return true if node[0].type == :ident && (name.nil? || node[0][0] == name) + end + when :fcall, :command, :vcall + return true if name.nil? || node[0][0] == name + when :call, :command_call + return true if name.nil? || node[2][0] == name + end + false + end + end + + class TestNodeWrapper < HandlesExtension + def matches?(node) !node.send(name).is_a?(FalseClass) end + end + + # This is the base handler class for the new-style (1.9) Ruby parser. + # All handlers that subclass this base class will be used when the + # new-style parser is used. For implementing legacy handlers, see + # {Legacy::Base}. + # + # @abstract See {Handlers::Base} for subclassing information. + # @see Handlers::Base + # @see Legacy::Base + class Base < Handlers::Base + class << self + include Parser::Ruby + + # @group Statement Matcher Extensions + + # Matcher for handling any type of method call. Method calls can + # be expressed by many {AstNode} types depending on the syntax + # with which it is called, so YARD allows you to use this matcher + # to simplify matching a method call. + # + # @example Match the "describe" method call + # handles method_call(:describe) + # + # # The following will be matched: + # # describe(...) + # # object.describe(...) + # # describe "argument" do ... end + # + # @param [#to_s] name matches the method call of this name + # @return [void] + def method_call(name = nil) + MethodCallWrapper.new(name ? name.to_s : nil) + end + + # Matcher for handling a node with a specific meta-type. An {AstNode} + # has a {AstNode#type} to define its type but can also be associated + # with a set of types. For instance, +:if+ and +:unless+ are both + # of the meta-type +:condition+. + # + # A meta-type is any method on the {AstNode} class ending in "?", + # though you should not include the "?" suffix in your declaration. + # Some examples are: "condition", "call", "literal", "kw", "token", + # "ref". + # + # @example Handling any conditional statement (if, unless) + # handles meta_type(:condition) + # @param [Symbol] type the meta-type to match. A meta-type can be + # any method name + "?" that {AstNode} responds to. + # @return [void] + def meta_type(type) + TestNodeWrapper.new(type.to_s + "?") + end + + # @group Testing for a Handler + + # @return [Boolean] whether or not an {AstNode} object should be + # handled by this handler + def handles?(node) + handlers.any? do |a_handler| + case a_handler + when Symbol + a_handler == node.type + when String + node.source == a_handler + when Regexp + node.source =~ a_handler + when Parser::Ruby::AstNode + a_handler == node + when HandlesExtension + a_handler.matches?(node) + end + end + end + end + + include Parser::Ruby + + # @group Parsing an Inner Block + + def parse_block(inner_node, opts = {}) + push_state(opts) do + nodes = inner_node.type == :list ? inner_node.children : [inner_node] + parser.process(nodes) + end + end + + # @group Macro Handling + + def call_params + return [] unless statement.respond_to?(:parameters) + statement.parameters(false).compact.map do |param| + if param.type == :list + param.map {|n| n.jump(:ident, :kw, :tstring_content).source } + else + param.jump(:ident, :kw, :tstring_content).source + end + end.flatten + end + + def caller_method + if statement.call? || statement.def? + statement.method_name(true).to_s + elsif statement.type == :var_ref || statement.type == :vcall + statement[0].jump(:ident, :kw).source + end + end + end + end + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/handlers/ruby/class_condition_handler.rb b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/handlers/ruby/class_condition_handler.rb new file mode 100644 index 000000000..1c1170045 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/handlers/ruby/class_condition_handler.rb @@ -0,0 +1,92 @@ +# frozen_string_literal: true +# Matches if/unless conditions inside classes and attempts to process only +# one branch (by evaluating the condition if possible). +# +# @example A simple class conditional +# class Foo +# if 0 +# # This method is ignored +# def xyz; end +# end +# end +class YARD::Handlers::Ruby::ClassConditionHandler < YARD::Handlers::Ruby::Base + handles meta_type(:condition) + namespace_only + + process do + condition = parse_condition + if condition.nil? + # Parse both blocks if we're unsure of the condition + parse_then_block + parse_else_block + elsif condition + parse_then_block + else + parse_else_block + end + end + + protected + + # Parses the condition part of the if/unless statement + # + # @return [true, false, nil] true if the condition can be definitely + # parsed to true, false if not, and nil if the condition cannot be + # parsed with certainty (it's dynamic) + def parse_condition + condition = nil + + # Right now we can handle very simple unary conditions like: + # if true + # if false + # if 0 + # if 100 (not 0) + # if defined? SOME_CONSTANT + # + # The last case will do a lookup in the registry and then one + # in the Ruby world (using eval). + case statement.condition.type + when :int + condition = statement.condition[0] != "0" + when :defined + # defined? keyword used, let's see if we can look up the name + # in the registry, then we'll try using Ruby's powers. eval() is not + # *too* dangerous here since code is not actually executed. + arg = statement.condition.first + + if arg.type == :var_ref + name = arg.source + obj = YARD::Registry.resolve(namespace, name, true) + + begin + condition = true if obj || (name && Object.instance_eval("defined? #{name}")) + rescue SyntaxError, NameError + condition = false + end + end + when :var_ref + var = statement.condition[0] + if var == s(:kw, "true") + condition = true + elsif var == s(:kw, "false") + condition = false + end + end + + # Invert an unless condition + if statement.type == :unless || statement.type == :unless_mod + condition = !condition unless condition.nil? + end + condition + end + + def parse_then_block + parse_block(statement.then_block, :visibility => visibility) + end + + def parse_else_block + if statement.else_block + parse_block(statement.else_block, :visibility => visibility) + end + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/handlers/ruby/class_handler.rb b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/handlers/ruby/class_handler.rb new file mode 100644 index 000000000..6b0159fe0 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/handlers/ruby/class_handler.rb @@ -0,0 +1,119 @@ +# frozen_string_literal: true +# Handles class declarations +class YARD::Handlers::Ruby::ClassHandler < YARD::Handlers::Ruby::Base + include YARD::Handlers::Ruby::StructHandlerMethods + handles :class, :sclass + namespace_only + + process do + classname = statement[0].source.gsub(/\s/, '') + if statement.type == :class + superclass = parse_superclass(statement[1]) + if superclass == "Struct" + is_a_struct = true + superclass = struct_superclass_name(statement[1]) # refine the superclass if possible + create_struct_superclass(superclass, statement[1]) + end + undocsuper = statement[1] && superclass.nil? + klass = register ClassObject.new(namespace, classname) do |o| + o.superclass = superclass if superclass + o.superclass.type = :class if o.superclass.is_a?(Proxy) + end + if is_a_struct + parse_struct_superclass(klass, statement[1]) + elsif klass + create_attributes(klass, members_from_tags(klass)) + end + parse_block(statement[2], :namespace => klass) + + if undocsuper + raise YARD::Parser::UndocumentableError, 'superclass (class was added without superclass)' + end + elsif statement.type == :sclass + if statement[0] == s(:var_ref, s(:kw, "self")) + parse_block(statement[1], :namespace => namespace, :scope => :class) + else + proxy = Proxy.new(namespace, classname) + + # Allow constants to reference class names + if ConstantObject === proxy + if proxy.value =~ /\A#{NAMESPACEMATCH}\Z/ + proxy = Proxy.new(namespace, proxy.value) + else + raise YARD::Parser::UndocumentableError, "constant class reference '#{classname}'" + end + end + + if classname[0, 1] =~ /[A-Z]/ + register ClassObject.new(namespace, classname) if Proxy === proxy + parse_block(statement[1], :namespace => proxy, :scope => :class) + else + raise YARD::Parser::UndocumentableError, "class '#{classname}'" + end + end + else + sig_end = (statement[1] ? statement[1].source_end : statement[0].source_end) - statement.source_start + raise YARD::Parser::UndocumentableError, "class: #{statement.source[0..sig_end]}" + end + end + + private + + # Extract the parameters from the Struct.new AST node, returning them as a list + # of strings + # + # @param [MethodCallNode] superclass the AST node for the Struct.new call + # @return [Array] the member names to generate methods for + def extract_parameters(superclass) + members = superclass.parameters.select {|x| x && x.type == :symbol_literal } + members.map! {|x| x.source.strip[1..-1] } + members + end + + def create_struct_superclass(superclass, superclass_def) + return if superclass == "Struct" + the_super = register ClassObject.new(P("Struct"), superclass[8..-1]) do |o| + o.superclass = "Struct" + end + parse_struct_superclass(the_super, superclass_def) + the_super + end + + def struct_superclass_name(superclass) + if superclass.call? + first = superclass.parameters.first + if first.type == :string_literal && first[0].type == :string_content && first[0].size == 1 + return "Struct::#{first[0][0][0]}" + end + end + "Struct" + end + + def parse_struct_superclass(klass, superclass) + return unless superclass.call? && superclass.parameters + members = extract_parameters(superclass) + create_attributes(klass, members) + end + + def parse_superclass(superclass) + return nil unless superclass + + case superclass.type + when :var_ref + return namespace.path if superclass.first == s(:kw, "self") + return superclass.source if superclass.first.type == :const + when :const, :const_ref, :const_path_ref, :top_const_ref + return superclass.source + when :fcall, :command + methname = superclass.method_name.source + return superclass.parameters.first.source if methname == "DelegateClass" + return methname if superclass.method_name.type == :const + when :call, :command_call + cname = superclass.namespace.source + if cname =~ /^O?Struct$/ && superclass.method_name(true) == :new + return cname + end + end + nil + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/handlers/ruby/class_variable_handler.rb b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/handlers/ruby/class_variable_handler.rb new file mode 100644 index 000000000..290beb48d --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/handlers/ruby/class_variable_handler.rb @@ -0,0 +1,17 @@ +# frozen_string_literal: true +# Handles a class variable (@@variable) +class YARD::Handlers::Ruby::ClassVariableHandler < YARD::Handlers::Ruby::Base + handles :assign + namespace_only + + process do + if statement[0].type == :var_field && statement[0][0].type == :cvar + name = statement[0][0][0] + value = statement[1].source + register ClassVariableObject.new(namespace, name) do |o| + o.source = statement + o.value = value + end + end + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/handlers/ruby/comment_handler.rb b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/handlers/ruby/comment_handler.rb new file mode 100644 index 000000000..19733b440 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/handlers/ruby/comment_handler.rb @@ -0,0 +1,10 @@ +# frozen_string_literal: true +# Handles any lone comment statement in a Ruby file +class YARD::Handlers::Ruby::CommentHandler < YARD::Handlers::Ruby::Base + handles :comment, :void_stmt + namespace_only + + process do + register_docstring(nil) + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/handlers/ruby/constant_handler.rb b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/handlers/ruby/constant_handler.rb new file mode 100644 index 000000000..d90504c6b --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/handlers/ruby/constant_handler.rb @@ -0,0 +1,55 @@ +# frozen_string_literal: true +# Handles any constant assignment +class YARD::Handlers::Ruby::ConstantHandler < YARD::Handlers::Ruby::Base + include YARD::Handlers::Ruby::StructHandlerMethods + handles :assign + namespace_only + + process do + if statement[1].call? && statement[1][0][0] == s(:const, "Struct") && + statement[1][2] == s(:ident, "new") + process_structclass(statement) + elsif statement[0].type == :var_field && statement[0][0].type == :const + process_constant(statement) + elsif statement[0].type == :const_path_field + process_constant(statement) + end + end + + private + + def process_constant(statement) + name = statement[0].source + value = statement[1].source + obj = P(namespace, name) + if obj.is_a?(NamespaceObject) && obj.namespace == namespace + raise YARD::Parser::UndocumentableError, "constant for existing #{obj.type} #{obj}" + else + ensure_loaded! obj.parent + register ConstantObject.new(namespace, name) {|o| o.source = statement; o.value = value.strip } + end + end + + def process_structclass(statement) + lhs = statement[0][0] + if lhs.type == :const + klass = create_class(lhs[0], P(:Struct)) + create_attributes(klass, extract_parameters(statement[1])) + parse_block(statement[1].block[1], :namespace => klass) unless statement[1].block.nil? + else + raise YARD::Parser::UndocumentableError, "Struct assignment to #{statement[0].source}" + end + end + + # Extract the parameters from the Struct.new AST node, returning them as a list + # of strings + # + # @param [MethodCallNode] superclass the AST node for the Struct.new call + # @return [Array] the member names to generate methods for + def extract_parameters(superclass) + return [] unless superclass.parameters + members = superclass.parameters.select {|x| x && x.type == :symbol_literal } + members.map! {|x| x.source.strip[1..-1] } + members + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/handlers/ruby/decorator_handler_methods.rb b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/handlers/ruby/decorator_handler_methods.rb new file mode 100644 index 000000000..2a401c2c4 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/handlers/ruby/decorator_handler_methods.rb @@ -0,0 +1,123 @@ +# frozen_string_literal: true +# Helper methods to assist with processing decorators. +module YARD::Handlers::Ruby::DecoratorHandlerMethods + # @overload process_decorator(*nodes, opts = {}, &block) + # Takes care of parsing method definitions passed to decorators + # as parameters, as well as parsing chained decorators. + # + # Use this in a handler's process block. + # + # @yieldparam method [YARD::CodeObjects::MethodObject] Method being decorated. + # @yieldparam node [YARD::Parser::Ruby::AstNode] AST node of the decorated method. + # @yieldparam name [Symbol] Name of the decorated method. + # @return [Array] Array of hashes containing :method, :node, :name. + # See yield params. + # + # @param nodes [YARD::Parser::Ruby::AstNode] AST nodes that refer to decorated + # methods, like indexes of statement.parameter. Defaults to all parameters. + # Pass nil to specify zero parameters. + # + # @option opts [:instance, :class] :scope (:instance) Scope to use for each + # MethodObject. + # + # @option opts [true, false] :transfer_docstring Set false to disable + # transferring the decorator docstring to method definitions passed to the + # decorator as parameters. + # + # @option opts [true, false] :transfer_source Set false to disable + # transferring the decorator source code string to method definitions + # passed to the decorator as parameters. + # + # @example Basic Usage + # # Simply pass the method docs through to the method definition. + # process do + # process_decorator + # end + # + # @example Setting a method's visibility to private. + # process do + # process_decorator :scope => :class do |method| + # method.visibility = :private if method.respond_to? :visibility + # end + # end + def process_decorator(*nodes, &block) + opts = nodes.last.is_a?(Hash) ? nodes.pop : {} + + all_nodes = statement.parameters.select do |p| + p.is_a? YARD::Parser::Ruby::AstNode + end + + # Parse decorator parameters (decorator chain). + all_nodes.each do |param| + parse_block param if param.call? || param.def? + end + + selected_nodes = + if nodes.empty? + all_nodes + elsif nodes.count == 1 && nodes.first.nil? + [] + else + nodes + end + + decorated_methods = selected_nodes.map do |param| + process_decorator_parameter param, opts, &block + end.flatten + + # Store method nodes in decorator node. + statement.define_singleton_method :decorators do + decorated_methods.map {|h| h[:node] } + end + + decorated_methods + end + + private + + def process_decorator_parameter(node, opts = {}, &block) + scope = opts.fetch :scope, :instance + transfer_docstring = opts.fetch :transfer_docstring, true + transfer_source = opts.fetch :transfer_source, true + + name = nil + + if node.call? + if node.respond_to? :decorators + return node.decorators.map do |n| + process_decorator_parameter n, opts, &block + end + end + elsif node.def? + name = node.jump(:def).method_name.source + else + name = node.jump(:ident, :string_content, :const).source + end + + if name.nil? + raise YARD::Parser::UndocumentableError, 'statement, cannot determine method name' + end + + method = YARD::CodeObjects::Proxy.new( + namespace, + (scope == :instance ? '#' : '.') + name.to_s, + :method + ) + + # Transfer source to methods passed to the helper as parameters. + method.source = statement.source if transfer_source && node.def? + + # Transfer decorator docstring to methods passed to the helper as parameters. + if transfer_docstring && node.def? && + statement.docstring && method.docstring.empty? + tags = method.tags if method.respond_to? :tags + tags ||= [] + method.docstring = statement.docstring + tags.each {|t| method.add_tag t } + end + + yield method, node, name.to_sym if block_given? + + [{:method => method, :node => node, :name => name.to_sym}] + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/handlers/ruby/dsl_handler.rb b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/handlers/ruby/dsl_handler.rb new file mode 100644 index 000000000..dec24a2f9 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/handlers/ruby/dsl_handler.rb @@ -0,0 +1,15 @@ +# frozen_string_literal: true +module YARD + module Handlers + module Ruby + # Handles automatic detection of dsl-style methods + class DSLHandler < Base + include CodeObjects + include DSLHandlerMethods + handles method_call + namespace_only + process { handle_comments } + end + end + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/handlers/ruby/dsl_handler_methods.rb b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/handlers/ruby/dsl_handler_methods.rb new file mode 100644 index 000000000..f077eec57 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/handlers/ruby/dsl_handler_methods.rb @@ -0,0 +1,96 @@ +# frozen_string_literal: true +module YARD + module Handlers + module Ruby + module DSLHandlerMethods + include CodeObjects + include Parser + + IGNORE_METHODS = Hash[*%w(alias alias_method autoload attr attr_accessor + attr_reader attr_writer extend include module_function public private + protected private_constant private_class_method public_class_method). + map {|n| [n, true] }.flatten] + + def handle_comments + return if IGNORE_METHODS[caller_method] + + @docstring = statement.comments || "" + @docstring = @docstring.join("\n") if @docstring.is_a?(Array) + + attaching = false + if @docstring =~ /^@!?macro\s+\[[^\]]*attach/ + register_docstring(nil) + @docstring = "" + attaching = true + end + + macro = find_attached_macro + if macro + txt = macro.expand([caller_method, *call_params], statement.source) + @docstring += "\n" + txt + + # macro may have a directive + return register_docstring(nil) if !attaching && txt.match(/^\s*@!/) + elsif !statement.comments_hash_flag && !implicit_docstring? + return register_docstring(nil) + end + + # ignore DSL definitions if @method/@attribute directive is used + if @docstring =~ /^@!?(method|attribute)\b/ + return register_docstring(nil) + end + + register MethodObject.new(namespace, method_name, scope) do |o| + o.signature = method_signature + end + end + + def register_docstring(object, docstring = @docstring, stmt = statement) + super + end + + private + + def implicit_docstring? + tags = %w(method attribute overload visibility scope return) + tags.any? {|tag| @docstring =~ /^@!?#{tag}\b/ } + end + + def method_name + name = call_params.first || "" + if name =~ /^#{CodeObjects::METHODNAMEMATCH}$/ + name + else + raise UndocumentableError, "method, missing name" + end + end + + def method_signature + "def #{method_name}" + end + + def find_attached_macro + Registry.all(:macro).each do |macro| + next unless macro.method_object + next unless macro_name_matches(macro) + (namespace.inheritance_tree(true) + [P('Object')]).each do |obj| + return macro if obj == macro.method_object.namespace + end + end + nil + end + + # @return [Boolean] whether caller method matches a macro or + # its alias names. + def macro_name_matches(macro) + objs = [macro.method_object] + if objs.first.type != :proxy && objs.first.respond_to?(:aliases) + objs.concat(objs.first.aliases) + end + + objs.any? {|obj| obj.name.to_s == caller_method.to_s } + end + end + end + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/handlers/ruby/exception_handler.rb b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/handlers/ruby/exception_handler.rb new file mode 100644 index 000000000..8e4d1cf93 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/handlers/ruby/exception_handler.rb @@ -0,0 +1,27 @@ +# frozen_string_literal: true +# Handles 'raise' calls inside methods +class YARD::Handlers::Ruby::ExceptionHandler < YARD::Handlers::Ruby::Base + handles method_call(:raise) + + process do + return unless owner.is_a?(MethodObject) # Only methods yield + return if [:command_call, :call].include? statement.type + return if owner.has_tag?(:raise) + + klass = nil + if statement.call? + params = statement.parameters(false) + if params.size == 1 + if params.first.ref? && params.first.first.type != :ident + klass = params.first.source + elsif params.first.call? && params.first.method_name(true) == :new + klass = params.first.namespace.source + end + elsif params.size > 1 + klass = params.first.source + end + end + + owner.add_tag YARD::Tags::Tag.new(:raise, '', klass) if klass + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/handlers/ruby/extend_handler.rb b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/handlers/ruby/extend_handler.rb new file mode 100644 index 000000000..e07f49878 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/handlers/ruby/extend_handler.rb @@ -0,0 +1,22 @@ +# frozen_string_literal: true +# Handles 'extend' call to include modules into the class scope of another +# @see MixinHandler +class YARD::Handlers::Ruby::ExtendHandler < YARD::Handlers::Ruby::MixinHandler + handles method_call(:extend) + namespace_only + + def scope; :class end + + private + + def process_mixin(mixin) + if mixin == s(:var_ref, s(:kw, "self")) + if namespace.is_a?(ClassObject) + raise UndocumentableError, "extend(self) statement on class" + end + namespace.mixins(scope) << namespace + else + super + end + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/handlers/ruby/legacy/alias_handler.rb b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/handlers/ruby/legacy/alias_handler.rb new file mode 100644 index 000000000..a1947fc89 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/handlers/ruby/legacy/alias_handler.rb @@ -0,0 +1,37 @@ +# frozen_string_literal: true +# (see Ruby::AliasHandler) +class YARD::Handlers::Ruby::Legacy::AliasHandler < YARD::Handlers::Ruby::Legacy::Base + handles(/\Aalias(_method)?(\s|\()/) + namespace_only + + process do + if TkALIAS === statement.tokens.first + tokens = statement.tokens[2..-1].to_s.split(/\s+/) + names = [tokens[0], tokens[1]].map {|t| t.gsub(/^:(['"])?(.+?)\1?$|^(:)(.+)/, '\2') } + else + names = tokval_list(statement.tokens[2..-1], :attr) + end + raise YARD::Parser::UndocumentableError, statement.tokens.first.text if names.size != 2 + + names = names.map {|n| Symbol === n ? n.to_s.delete('"') : n } + new_meth = names[0].to_sym + old_meth = names[1].to_sym + old_obj = namespace.child(:name => old_meth, :scope => scope) + new_obj = register MethodObject.new(namespace, new_meth, scope) do |o| + o.add_file(parser.file, statement.tokens.first.line_no, statement.comments) + end + + if old_obj + new_obj.signature = old_obj.signature + new_obj.source = old_obj.source + new_obj.docstring = old_obj.docstring + YARD::Docstring.new(statement.comments) + new_obj.docstring.line_range = statement.comments_range + new_obj.docstring.hash_flag = statement.comments_hash_flag + new_obj.docstring.object = new_obj + else + new_obj.signature = "def #{new_meth}" # this is all we know. + end + + namespace.aliases[new_obj] = old_meth + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/handlers/ruby/legacy/attribute_handler.rb b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/handlers/ruby/legacy/attribute_handler.rb new file mode 100644 index 000000000..74a7b9db5 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/handlers/ruby/legacy/attribute_handler.rb @@ -0,0 +1,65 @@ +# frozen_string_literal: true +# (see Ruby::AttributeHandler) +class YARD::Handlers::Ruby::Legacy::AttributeHandler < YARD::Handlers::Ruby::Legacy::Base + handles(/\Aattr(?:_(?:reader|writer|accessor))?(?:\s|\()/) + namespace_only + + process do + begin + attr_type = statement.tokens.first.text.to_sym + symbols = tokval_list statement.tokens[2..-1], :attr, TkTRUE, TkFALSE + read = true + write = false + rescue SyntaxError + raise YARD::Parser::UndocumentableError, attr_type + end + + # Change read/write based on attr_reader/writer/accessor + case attr_type + when :attr + # In the case of 'attr', the second parameter (if given) isn't a symbol. + write = symbols.pop if symbols.size == 2 + when :attr_accessor + write = true + when :attr_reader + # change nothing + when :attr_writer + read = false + write = true + end + + # Add all attributes + symbols.each do |name| + namespace.attributes[scope][name] = SymbolHash[:read => nil, :write => nil] + + # Show their methods as well + {:read => name, :write => "#{name}="}.each do |type, meth| + if type == :read ? read : write + o = MethodObject.new(namespace, meth, scope) + if type == :write + o.parameters = [['value', nil]] + src = "def #{meth}(value)" + full_src = "#{src}\n @#{name} = value\nend" + doc = "Sets the attribute #{name}\n@param value the value to set the attribute #{name} to." + else + src = "def #{meth}" + full_src = "#{src}\n @#{name}\nend" + doc = "Returns the value of attribute #{name}" + end + o.source ||= full_src + o.signature ||= src + register(o) + o.docstring = doc if o.docstring.blank?(false) + + # Regsiter the object explicitly + namespace.attributes[scope][name][type] = o + else + obj = namespace.children.find {|other| other.name == meth.to_sym && other.scope == scope } + + # register an existing method as attribute + namespace.attributes[scope][name][type] = obj if obj + end + end + end + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/handlers/ruby/legacy/base.rb b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/handlers/ruby/legacy/base.rb new file mode 100644 index 000000000..8a00f73a6 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/handlers/ruby/legacy/base.rb @@ -0,0 +1,245 @@ +# frozen_string_literal: true +module YARD + module Handlers + module Ruby::Legacy + # This is the base handler for the legacy parser. To implement a legacy + # handler, subclass this class. + # + # @abstract (see Ruby::Base) + class Base < Handlers::Base + # For tokens like TkDEF, TkCLASS, etc. + include YARD::Parser::Ruby::Legacy::RubyToken + + # @return [Boolean] whether or not a {Parser::Ruby::Legacy::Statement} object should be handled + # by this handler. + def self.handles?(stmt) + handlers.any? do |a_handler| + case a_handler + when String + stmt.tokens.first.text == a_handler + when Regexp + stmt.tokens.to_s =~ a_handler + else + a_handler == stmt.tokens.first.class + end + end + end + + # Parses a statement's block with a set of state values. If the + # statement has no block, nothing happens. A description of state + # values can be found at {Handlers::Base#push_state} + # + # @param [Hash] opts State options + # @option opts (see Handlers::Base#push_state) + # @see Handlers::Base#push_state #push_state + def parse_block(opts = {}) + push_state(opts) do + if statement.block + blk = Parser::Ruby::Legacy::StatementList.new(statement.block) + parser.process(blk) + end + end + end + + def call_params + if statement.tokens.first.is_a?(TkDEF) + extract_method_details.last.map(&:first) + else + tokens = statement.tokens[1..-1] + tokval_list(tokens, :attr, :identifier, TkId).map(&:to_s) + end + end + + def caller_method + if statement.tokens.first.is_a?(TkIDENTIFIER) + statement.tokens.first.text + elsif statement.tokens.first.is_a?(TkDEF) + extract_method_details.first + end + end + + private + + # Extracts method information for macro expansion only + # + # @todo This is a duplicate implementation of {MethodHandler}. Refactor. + # @return [Array>>] the method name followed by method + # arguments (name and optional value) + def extract_method_details + if statement.tokens.to_s =~ /^def\s+(#{METHODMATCH})(?:(?:\s+|\s*\()(.*)(?:\)\s*$)?)?/m + meth = $1 + args = $2 + meth.gsub!(/\s+/, '') + args = tokval_list(Parser::Ruby::Legacy::TokenList.new(args), :all) + args.map! {|a| k, v = *a.split('=', 2); [k.strip, (v ? v.strip : nil)] } if args + meth = $` if meth =~ /(?:#{NSEPQ}|#{CSEPQ})([^#{NSEP}#{CSEPQ}]+)$/ + [meth, args] + end + end + + # The string value of a token. For example, the return value for the symbol :sym + # would be :sym. The return value for a string +"foo #{ bar}"+ would be the literal + # +"foo #{ bar}"+ without any interpolation. The return value of the identifier + # 'test' would be the same value: 'test'. Here is a list of common types and + # their return values: + # + # @example + # tokval(TokenList.new('"foo"').first) => "foo" + # tokval(TokenList.new(':foo').first) => :foo + # tokval(TokenList.new('CONSTANT').first, RubyToken::TkId) => "CONSTANT" + # tokval(TokenList.new('identifier').first, RubyToken::TkId) => "identifier" + # tokval(TokenList.new('3.25').first) => 3.25 + # tokval(TokenList.new('/xyz/i').first) => /xyz/i + # + # @param [Token] token The token of the class + # + # @param [Array>, Symbol] accepted_types + # The allowed token types that this token can be. Defaults to [{TkVal}]. + # A list of types would be, for example, [+TkSTRING+, +TkSYMBOL+], to return + # the token's value if it is either of those types. If +TkVal+ is accepted, + # +TkNode+ is also accepted. + # + # Certain symbol keys are allowed to specify multiple types in one fell swoop. + # These symbols are: + # :string => +TkSTRING+, +TkDSTRING+, +TkDXSTRING+ and +TkXSTRING+ + # :attr => +TkSYMBOL+ and +TkSTRING+ + # :identifier => +TkIDENTIFIER, +TkFID+ and +TkGVAR+. + # :number => +TkFLOAT+, +TkINTEGER+ + # + # @return [Object] if the token is one of the accepted types, in its real value form. + # It should be noted that identifiers and constants are kept in String form. + # @return [nil] if the token is not any of the specified accepted types + def tokval(token, *accepted_types) + accepted_types = [TkVal] if accepted_types.empty? + accepted_types.push(TkNode) if accepted_types.include? TkVal + + if accepted_types.include?(:attr) + accepted_types.push(TkSTRING, TkSYMBOL) + end + + if accepted_types.include?(:string) + accepted_types.push(TkSTRING, TkDSTRING, TkXSTRING, TkDXSTRING) + end + + if accepted_types.include?(:identifier) + accepted_types.push(TkIDENTIFIER, TkFID, TkGVAR) + end + + if accepted_types.include?(:number) + accepted_types.push(TkFLOAT, TkINTEGER) + end + + return unless accepted_types.any? {|t| t === token } + + case token + when TkSTRING, TkDSTRING, TkXSTRING, TkDXSTRING + token.text[1..-2] + when TkSYMBOL + token.text[1..-1].to_sym + when TkFLOAT + token.text.to_f + when TkINTEGER + token.text.to_i + when TkREGEXP + token.text =~ %r{\A/(.+)/([^/])\Z} + Regexp.new($1, $2) + when TkTRUE + true + when TkFALSE + false + when TkNIL + nil + else + token.text + end + end + + # Returns a list of symbols or string values from a statement. + # The list must be a valid comma delimited list, and values + # will only be returned to the end of the list only. + # + # Example: + # attr_accessor :a, 'b', :c, :d => ['a', 'b', 'c', 'd'] + # attr_accessor 'a', UNACCEPTED_TYPE, 'c' => ['a', 'c'] + # + # The tokval list of a {Parser::Ruby::Legacy::TokenList} of the above + # code would be the {#tokval} value of :a, 'b', + # :c and :d. + # + # It should also be noted that this function stops immediately at + # any ruby keyword encountered: + # "attr_accessor :a, :b, :c if x == 5" => ['a', 'b', 'c'] + # + # @param [TokenList] tokenlist The list of tokens to process. + # @param [Array>] accepted_types passed to {#tokval} + # @return [Array] the list of tokvalues in the list. + # @return [Array] if there are no symbols or Strings in the list + # @see #tokval + def tokval_list(tokenlist, *accepted_types) + return [] unless tokenlist + out = [[]] + parencount = 0 + beforeparen = 0 + needcomma = false + seen_comma = true + tokenlist.each do |token| + tokval = accepted_types == [:all] ? token.text : tokval(token, *accepted_types) + parencond = !out.last.empty? && !tokval.nil? + # puts "#{seen_comma.inspect} #{parencount} #{token.class.class_name} #{out.inspect}" + case token + when TkCOMMA + if parencount == 0 + out << [] unless out.last.empty? + needcomma = false + seen_comma = true + elsif parencond + out.last << token.text + end + when TkLPAREN + if seen_comma + beforeparen += 1 + else + parencount += 1 + out.last << token.text if parencond + end + when TkRPAREN + if beforeparen > 0 + beforeparen -= 1 + else + out.last << token.text if parencount > 0 && !tokval.nil? + parencount -= 1 + end + when TkLBRACE, TkLBRACK, TkDO + parencount += 1 + out.last << token.text unless tokval.nil? + when TkRBRACE, TkRBRACK, TkEND + out.last << token.text unless tokval.nil? + parencount -= 1 + else + break if TkKW === token && ![TkTRUE, TkFALSE, TkSUPER, TkSELF, TkNIL].include?(token.class) + + seen_comma = false unless TkWhitespace === token + if parencount == 0 + next if needcomma + next if TkWhitespace === token + if !tokval.nil? + out.last << tokval + else + out.last.clear + needcomma = true + end + elsif parencond + needcomma = true + out.last << token.text + end + end + + break if beforeparen == 0 && parencount < 0 + end + # Flatten any single element lists + out.map {|e| e.empty? ? nil : (e.size == 1 ? e.pop : e.flatten.join) }.compact + end + end + end + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/handlers/ruby/legacy/class_condition_handler.rb b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/handlers/ruby/legacy/class_condition_handler.rb new file mode 100644 index 000000000..ef79b7479 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/handlers/ruby/legacy/class_condition_handler.rb @@ -0,0 +1,83 @@ +# frozen_string_literal: true +# (see Ruby::ClassConditionHandler) +# @since 0.5.4 +class YARD::Handlers::Ruby::Legacy::ClassConditionHandler < YARD::Handlers::Ruby::Legacy::Base + namespace_only + handles TkIF, TkELSIF, TkUNLESS + + process do + condition = parse_condition + if condition.nil? + # Parse both blocks if we're unsure of the condition + parse_then_block + parse_else_block + elsif condition + parse_then_block + else + parse_else_block + end + end + + protected + + # Parses the condition part of the if/unless statement + # + # @return [true, false, nil] true if the condition can be definitely + # parsed to true, false if not, and nil if the condition cannot be + # parsed with certainty (it's dynamic) + # @since 0.5.5 + def parse_condition + condition = nil + + # Right now we can handle very simple unary conditions like: + # if true + # if false + # if 0 + # if 100 (not 0) + # if defined? SOME_CONSTANT + # + # The last case will do a lookup in the registry and then one + # in the Ruby world (using eval). + case statement.tokens[1..-1].to_s.strip + when /^(\d+)$/ + condition = $1 != "0" + when /^defined\?\s*\(?\s*([A-Za-z0-9:_]+?)\s*\)?$/ + # defined? keyword used, let's see if we can look up the name + # in the registry, then we'll try using Ruby's powers. eval() is not + # *too* dangerous here since code is not actually executed. + name = $1 + obj = YARD::Registry.resolve(namespace, name, true) + begin + condition = true if obj || Object.instance_eval("defined? #{name}") + rescue SyntaxError, NameError + condition = false + end + when "true" + condition = true + when "false" + condition = false + end + + if TkUNLESS === statement.tokens.first + condition = !condition unless condition.nil? + end + condition + end + + # @since 0.5.5 + def parse_then_block + parse_block(:visibility => visibility) + end + + # @since 0.5.5 + def parse_else_block + return unless statement.block + stmtlist = YARD::Parser::Ruby::Legacy::StatementList + stmtlist.new(statement.block).each do |stmt| + next unless TkELSE === stmt.tokens.first + push_state(:visibility => visibility) do + parser.process(stmtlist.new(stmt.block)) + end + end + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/handlers/ruby/legacy/class_handler.rb b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/handlers/ruby/legacy/class_handler.rb new file mode 100644 index 000000000..b0729b8e4 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/handlers/ruby/legacy/class_handler.rb @@ -0,0 +1,113 @@ +# frozen_string_literal: true +# (see Ruby::ClassHandler) +class YARD::Handlers::Ruby::Legacy::ClassHandler < YARD::Handlers::Ruby::Legacy::Base + include YARD::Handlers::Ruby::StructHandlerMethods + handles TkCLASS + namespace_only + + process do + if statement.tokens.to_s =~ /^class\s+(#{NAMESPACEMATCH})\s*(?:<\s*(.+)|\Z)/m + classname = $1 + superclass_def = $2 + superclass = parse_superclass($2) + classname = classname.gsub(/\s/, '') + if superclass == "Struct" + is_a_struct = true + superclass = struct_superclass_name(superclass_def) + create_struct_superclass(superclass, superclass_def) + end + undocsuper = superclass_def && superclass.nil? + + klass = register ClassObject.new(namespace, classname) do |o| + o.superclass = superclass if superclass + o.superclass.type = :class if o.superclass.is_a?(Proxy) + end + if is_a_struct + parse_struct_subclass(klass, superclass_def) + elsif klass + create_attributes(klass, members_from_tags(klass)) + end + parse_block(:namespace => klass) + + if undocsuper + raise YARD::Parser::UndocumentableError, 'superclass (class was added without superclass)' + end + elsif statement.tokens.to_s =~ /^class\s*<<\s*([\w\:\s]+)/ + classname = $1.gsub(/\s/, '') + proxy = Proxy.new(namespace, classname) + + # Allow constants to reference class names + if ConstantObject === proxy + if proxy.value =~ /\A#{NAMESPACEMATCH}\Z/ + proxy = Proxy.new(namespace, proxy.value) + else + raise YARD::Parser::UndocumentableError, "constant class reference '#{classname}'" + end + end + + if classname == "self" + parse_block(:namespace => namespace, :scope => :class) + elsif classname[0, 1] =~ /[A-Z]/ + register ClassObject.new(namespace, classname) if Proxy === proxy + parse_block(:namespace => proxy, :scope => :class) + else + raise YARD::Parser::UndocumentableError, "class '#{classname}'" + end + else + raise YARD::Parser::UndocumentableError, "class: #{statement.tokens}" + end + end + + private + + # Extracts the parameter list from the Struct.new declaration and returns it + # formatted as a list of member names. Expects the user will have used symbols + # to define the struct member names + # + # @param [String] superstring the string declaring the superclass + # @return [Array] a list of member names + def extract_parameters(superstring) + paramstring = superstring.match(/\A(O?Struct)\.new\((.*?)\)/)[2] + paramstring.split(",").select {|x| x.strip[0, 1] == ":" }.map {|x| x.strip[1..-1] } # the 1..-1 chops the leading : + end + + def create_struct_superclass(superclass, superclass_def) + return if superclass == "Struct" + the_super = register ClassObject.new(P("Struct"), superclass[8..-1]) do |o| + o.superclass = "Struct" + end + parse_struct_subclass(the_super, superclass_def) + the_super + end + + def struct_superclass_name(superclass) + match = superclass.match(/\A(Struct)\.new\((.*?)\)/) + if match + paramstring = match[2].split(",") + first = paramstring.first.strip + if first[0, 1] =~ /['"]/ && first[-1, 1] =~ /['"]/ && first !~ /\#\{/ + return "Struct::#{first[1..-2]}" + end + end + "Struct" + end + + def parse_struct_subclass(klass, superclass_def) + # Bounce if there's no parens + return unless superclass_def =~ /O?Struct\.new\((.*?)\)/ + members = extract_parameters(superclass_def) + create_attributes(klass, members) + end + + def parse_superclass(superclass) + case superclass + when /\A(#{NAMESPACEMATCH})(?:\s|\Z)/, + /\A(Struct|OStruct)\.new/, + /\ADelegateClass\((.+?)\)\s*\Z/, + /\A(#{NAMESPACEMATCH})\(/ + $1 + when "self" + namespace.path + end + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/handlers/ruby/legacy/class_variable_handler.rb b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/handlers/ruby/legacy/class_variable_handler.rb new file mode 100644 index 000000000..79b586dfa --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/handlers/ruby/legacy/class_variable_handler.rb @@ -0,0 +1,15 @@ +# frozen_string_literal: true +# (see Ruby::ClassVariableHandler) +class YARD::Handlers::Ruby::Legacy::ClassVariableHandler < YARD::Handlers::Ruby::Legacy::Base + HANDLER_MATCH = /\A@@\w+\s*=\s*/m + handles HANDLER_MATCH + namespace_only + + process do + name, value = *statement.tokens.to_s.split(/\s*=\s*/, 2) + register ClassVariableObject.new(namespace, name) do |o| + o.source = statement + o.value = value.strip + end + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/handlers/ruby/legacy/comment_handler.rb b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/handlers/ruby/legacy/comment_handler.rb new file mode 100644 index 000000000..1a0be2c9b --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/handlers/ruby/legacy/comment_handler.rb @@ -0,0 +1,10 @@ +# frozen_string_literal: true +# (see Ruby::CommentHandler) +class YARD::Handlers::Ruby::Legacy::CommentHandler < YARD::Handlers::Ruby::Legacy::Base + handles TkCOMMENT + namespace_only + + process do + register_docstring(nil) + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/handlers/ruby/legacy/constant_handler.rb b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/handlers/ruby/legacy/constant_handler.rb new file mode 100644 index 000000000..aedfc2462 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/handlers/ruby/legacy/constant_handler.rb @@ -0,0 +1,29 @@ +# frozen_string_literal: true +# (see Ruby::ConstantHandler) +class YARD::Handlers::Ruby::Legacy::ConstantHandler < YARD::Handlers::Ruby::Legacy::Base + include YARD::Handlers::Ruby::StructHandlerMethods + HANDLER_MATCH = /\A[A-Z]\w*\s*=[^=]\s*/m + handles HANDLER_MATCH + namespace_only + + process do + name, value = *statement.tokens.to_s.split(/\s*=\s*/, 2) + if value =~ /\A\s*Struct.new(?:\s*\(?|\b)/ + process_structclass(name, $') + else + register ConstantObject.new(namespace, name) {|o| o.source = statement; o.value = value.strip } + end + end + + private + + def process_structclass(classname, parameters) + klass = create_class(classname, P(:Struct)) + create_attributes(klass, extract_parameters(parameters)) + end + + def extract_parameters(parameters) + members = tokval_list(YARD::Parser::Ruby::Legacy::TokenList.new(parameters), TkSYMBOL) + members.map(&:to_s) + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/handlers/ruby/legacy/dsl_handler.rb b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/handlers/ruby/legacy/dsl_handler.rb new file mode 100644 index 000000000..502fca34d --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/handlers/ruby/legacy/dsl_handler.rb @@ -0,0 +1,17 @@ +# frozen_string_literal: true +module YARD + module Handlers + module Ruby + module Legacy + # (see Ruby::DSLHandler) + class DSLHandler < Base + include CodeObjects + include DSLHandlerMethods + handles TkIDENTIFIER + namespace_only + process { handle_comments } + end + end + end + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/handlers/ruby/legacy/exception_handler.rb b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/handlers/ruby/legacy/exception_handler.rb new file mode 100644 index 000000000..4c2f9c6e7 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/handlers/ruby/legacy/exception_handler.rb @@ -0,0 +1,13 @@ +# frozen_string_literal: true +# (see Ruby::ExceptionHandler) +class YARD::Handlers::Ruby::Legacy::ExceptionHandler < YARD::Handlers::Ruby::Legacy::Base + handles(/\Araise(\s|\(|\Z)/) + + process do + return unless owner.is_a?(MethodObject) # Only methods yield + return if owner.has_tag?(:raise) + + klass = statement.tokens.to_s[/^raise[\(\s]*(#{NAMESPACEMATCH})\s*(?:\)|,|\s(?:if|unless|until)|;|(?:(?:\.|\:\:)\s*)?new|$)/, 1] + owner.add_tag YARD::Tags::Tag.new(:raise, '', klass) if klass + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/handlers/ruby/legacy/extend_handler.rb b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/handlers/ruby/legacy/extend_handler.rb new file mode 100644 index 000000000..dfb0f8cf8 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/handlers/ruby/legacy/extend_handler.rb @@ -0,0 +1,21 @@ +# frozen_string_literal: true +# (see Ruby::ExtendHandler) +class YARD::Handlers::Ruby::Legacy::ExtendHandler < YARD::Handlers::Ruby::Legacy::MixinHandler + handles(/\Aextend(\s|\()/) + namespace_only + + def scope; :class end + + private + + def process_mixin(mixin) + if mixin == "self" + if namespace.is_a?(ClassObject) + raise UndocumentableError, "extend(self) statement on class" + end + namespace.mixins(scope) << namespace + else + super + end + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/handlers/ruby/legacy/method_handler.rb b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/handlers/ruby/legacy/method_handler.rb new file mode 100644 index 000000000..aac740422 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/handlers/ruby/legacy/method_handler.rb @@ -0,0 +1,90 @@ +# frozen_string_literal: true +# (see Ruby::MethodHandler) +class YARD::Handlers::Ruby::Legacy::MethodHandler < YARD::Handlers::Ruby::Legacy::Base + handles TkDEF + + process do + nobj = namespace + mscope = scope + + if statement.tokens.to_s =~ /^def\s+(#{METHODMATCH})(?:(?:\s+|\s*\()(.*)(?:\)\s*$)?)?/m + meth = $1 + args = $2 + meth.gsub!(/\s+/, '') + args = tokval_list(YARD::Parser::Ruby::Legacy::TokenList.new(args), :all) + args.map! do |a| + k, v, r = *a.split(/(:)|=/, 2) + if r + k += v + v = r + end + [k.strip, (v ? v.strip : nil)] + end if args + else + raise YARD::Parser::UndocumentableError, "method: invalid name" + end + + # Class method if prefixed by self(::|.) or Module(::|.) + if meth =~ /(?:#{NSEPQ}|#{CSEPQ})([^#{NSEP}#{CSEPQ}]+)$/ + mscope = :class + meth = $1 + prefix = $` + if prefix =~ /^[a-z]/ && prefix != "self" + raise YARD::Parser::UndocumentableError, 'method defined on object instance' + end + nobj = P(namespace, prefix) unless prefix == "self" + end + + nobj = P(namespace, nobj.value) while nobj.type == :constant + obj = register MethodObject.new(nobj, meth, mscope) do |o| + o.explicit = true + o.parameters = args + end + + # delete any aliases referencing old method + nobj.aliases.each do |aobj, name| + next unless name == obj.name + nobj.aliases.delete(aobj) + end if nobj.is_a?(NamespaceObject) + + if mscope == :instance && meth == "initialize" + unless obj.has_tag?(:return) + obj.add_tag(YARD::Tags::Tag.new(:return, + "a new instance of #{namespace.name}", namespace.name.to_s)) + end + elsif mscope == :class && obj.docstring.blank? && %w(inherited included + extended method_added method_removed method_undefined).include?(meth) + obj.add_tag(YARD::Tags::Tag.new(:private, nil)) + elsif meth.to_s =~ /\?$/ + if obj.tag(:return) && (obj.tag(:return).types || []).empty? + obj.tag(:return).types = ['Boolean'] + elsif obj.tag(:return).nil? + unless obj.tags(:overload).any? {|overload| overload.tag(:return) } + obj.add_tag(YARD::Tags::Tag.new(:return, "", "Boolean")) + end + end + end + + if obj.has_tag?(:option) + # create the options parameter if its missing + obj.tags(:option).each do |option| + expected_param = option.name + unless obj.tags(:param).find {|x| x.name == expected_param } + new_tag = YARD::Tags::Tag.new(:param, "a customizable set of options", "Hash", expected_param) + obj.add_tag(new_tag) + end + end + end + + info = obj.attr_info + if info + if meth.to_s =~ /=$/ # writer + info[:write] = obj if info[:read] + elsif info[:write] + info[:read] = obj + end + end + + parse_block(:owner => obj) # mainly for yield/exceptions + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/handlers/ruby/legacy/mixin_handler.rb b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/handlers/ruby/legacy/mixin_handler.rb new file mode 100644 index 000000000..718d3807c --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/handlers/ruby/legacy/mixin_handler.rb @@ -0,0 +1,39 @@ +# frozen_string_literal: true +# (see Ruby::MixinHandler) +class YARD::Handlers::Ruby::Legacy::MixinHandler < YARD::Handlers::Ruby::Legacy::Base + handles(/\Ainclude(\s|\()/) + namespace_only + + process do + errors = [] + statement.tokens[1..-1].to_s.split(/\s*,\s*/).reverse.each do |mixin| + mixin = mixin.strip + begin + process_mixin(mixin) + rescue YARD::Parser::UndocumentableError => err + errors << err.message + end + end + + unless errors.empty? + msg = errors.size == 1 ? ": #{errors[0]}" : "s: #{errors.join(", ")}" + raise YARD::Parser::UndocumentableError, "mixin#{msg} for class #{namespace.path}" + end + end + + private + + def process_mixin(mixin) + mixmatch = mixin[/\A(#{NAMESPACEMATCH})/, 1] + raise YARD::Parser::UndocumentableError unless mixmatch + + case obj = Proxy.new(namespace, mixmatch) + when ConstantObject # If a constant is included, use its value as the real object + obj = Proxy.new(namespace, obj.value, :module) + else + obj = Proxy.new(namespace, mixmatch, :module) + end + + namespace.mixins(scope).unshift(obj) unless namespace.mixins(scope).include?(obj) + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/handlers/ruby/legacy/module_function_handler.rb b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/handlers/ruby/legacy/module_function_handler.rb new file mode 100644 index 000000000..e245a3d42 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/handlers/ruby/legacy/module_function_handler.rb @@ -0,0 +1,19 @@ +# frozen_string_literal: true +# (see Ruby::ModuleFunctionHandler) +class YARD::Handlers::Ruby::Legacy::ModuleFunctionHandler < YARD::Handlers::Ruby::Legacy::Base + handles(/\A(module_function)(\s|\(|$)/) + namespace_only + + process do + if statement.tokens.size == 1 + self.scope = :module + else + tokval_list(statement.tokens[2..-1], :attr).each do |name| + instance_method = MethodObject.new(namespace, name) + class_method = MethodObject.new(namespace, name, :module) + instance_method.copy_to(class_method) + class_method.visibility = :public + end + end + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/handlers/ruby/legacy/module_handler.rb b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/handlers/ruby/legacy/module_handler.rb new file mode 100644 index 000000000..ed1b48f93 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/handlers/ruby/legacy/module_handler.rb @@ -0,0 +1,12 @@ +# frozen_string_literal: true +# (see Ruby::ModuleHandler) +class YARD::Handlers::Ruby::Legacy::ModuleHandler < YARD::Handlers::Ruby::Legacy::Base + handles TkMODULE + namespace_only + + process do + modname = statement.tokens.to_s[/^module\s+(#{NAMESPACEMATCH})/, 1] + mod = register ModuleObject.new(namespace, modname) + parse_block(:namespace => mod) + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/handlers/ruby/legacy/private_class_method_handler.rb b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/handlers/ruby/legacy/private_class_method_handler.rb new file mode 100644 index 000000000..da41c3f4c --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/handlers/ruby/legacy/private_class_method_handler.rb @@ -0,0 +1,22 @@ +# frozen_string_literal: true +# (see Ruby::PrivateClassMethodHandler) +class YARD::Handlers::Ruby::Legacy::PrivateClassMethodHandler < YARD::Handlers::Ruby::Legacy::Base + handles(/\Aprivate_class_method(\s|\(|$)/) + namespace_only + + process do + tokval_list(statement.tokens[2..-1], :attr).each do |name| + privatize_class_method name + end + end + + private + + def privatize_class_method(name) + method = Proxy.new(namespace, name) + ensure_loaded!(method) + method.visibility = :private + rescue YARD::Handlers::NamespaceMissingError + raise UndocumentableError, "private visibility set on unrecognized method: #{name}" + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/handlers/ruby/legacy/private_constant_handler.rb b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/handlers/ruby/legacy/private_constant_handler.rb new file mode 100644 index 000000000..52b1aa2b7 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/handlers/ruby/legacy/private_constant_handler.rb @@ -0,0 +1,22 @@ +# frozen_string_literal: true +# (see Ruby::PrivateConstantHandler) +class YARD::Handlers::Ruby::Legacy::PrivateConstantHandler < YARD::Handlers::Ruby::Legacy::Base + handles(/\Aprivate_constant(\s|\(|$)/) + namespace_only + + process do + tokval_list(statement.tokens[2..-1], :attr, TkCONSTANT).each do |name| + privatize_constant name + end + end + + private + + def privatize_constant(name) + const = Proxy.new(namespace, name) + ensure_loaded!(const) + const.visibility = :private + rescue NamespaceMissingError + raise UndocumentableError, "private visibility set on unrecognized constant: #{name}" + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/handlers/ruby/legacy/visibility_handler.rb b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/handlers/ruby/legacy/visibility_handler.rb new file mode 100644 index 000000000..62ec9e381 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/handlers/ruby/legacy/visibility_handler.rb @@ -0,0 +1,17 @@ +# frozen_string_literal: true +# (see Ruby::VisibilityHandler) +class YARD::Handlers::Ruby::Legacy::VisibilityHandler < YARD::Handlers::Ruby::Legacy::Base + handles(/\A(protected|private|public)(\s|\(|$)/) + namespace_only + + process do + vis = statement.tokens.first.text + if statement.tokens.size == 1 + self.visibility = vis + else + tokval_list(statement.tokens[2..-1], :attr).each do |name| + MethodObject.new(namespace, name, scope) {|o| o.visibility = vis } + end + end + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/handlers/ruby/legacy/yield_handler.rb b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/handlers/ruby/legacy/yield_handler.rb new file mode 100644 index 000000000..61933ab8b --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/handlers/ruby/legacy/yield_handler.rb @@ -0,0 +1,29 @@ +# frozen_string_literal: true +# (see Ruby::YieldHandler) +class YARD::Handlers::Ruby::Legacy::YieldHandler < YARD::Handlers::Ruby::Legacy::Base + handles TkYIELD + + process do + return unless owner.is_a?(MethodObject) # Only methods yield + return if owner.has_tag? :yield # Don't override yield tags + return if owner.has_tag? :yieldparam # Same thing. + + yieldtag = YARD::Tags::Tag.new(:yield, "", []) + tokval_list(statement.tokens[2..-1], Token).each do |item| + item = item.inspect unless item.is_a?(String) + if item == "self" + yieldtag.types << '_self' + owner.add_tag YARD::Tags::Tag.new(:yieldparam, + "the object that the method was called on", owner.namespace.path, '_self') + elsif item == "super" + yieldtag.types << '_super' + owner.add_tag YARD::Tags::Tag.new(:yieldparam, + "the result of the method from the superclass", nil, '_super') + else + yieldtag.types << item + end + end + + owner.add_tag(yieldtag) unless yieldtag.types.empty? + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/handlers/ruby/method_condition_handler.rb b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/handlers/ruby/method_condition_handler.rb new file mode 100644 index 000000000..952b9af86 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/handlers/ruby/method_condition_handler.rb @@ -0,0 +1,9 @@ +# frozen_string_literal: true +# Handles a conditional inside a method +class YARD::Handlers::Ruby::MethodConditionHandler < YARD::Handlers::Ruby::Base + handles :if_mod, :unless_mod + + process do + parse_block(statement.then_block, :owner => owner) + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/handlers/ruby/method_handler.rb b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/handlers/ruby/method_handler.rb new file mode 100644 index 000000000..5030a9658 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/handlers/ruby/method_handler.rb @@ -0,0 +1,104 @@ +# frozen_string_literal: true +# Handles a method definition +class YARD::Handlers::Ruby::MethodHandler < YARD::Handlers::Ruby::Base + include YARD::Handlers::Common::MethodHandler + + handles :def, :defs + + process do + meth = statement.method_name(true).to_s + args = format_args + blk = statement.block + nobj = namespace + mscope = scope + if statement.type == :defs + if statement[0][0].type == :ident + raise YARD::Parser::UndocumentableError, 'method defined on object instance' + end + nobj = P(namespace, statement[0].source) if statement[0][0].type == :const + mscope = :class + end + + nobj = P(namespace, nobj.value) while nobj.type == :constant + obj = register MethodObject.new(nobj, meth, mscope) do |o| + o.explicit = true + o.parameters = args + end + + # delete any aliases referencing old method + nobj.aliases.each do |aobj, name| + next unless name == obj.name + nobj.aliases.delete(aobj) + end if nobj.is_a?(NamespaceObject) + + if obj.constructor? + unless obj.has_tag?(:return) + obj.add_tag(YARD::Tags::Tag.new(:return, + "a new instance of #{namespace.name}", namespace.name.to_s)) + end + elsif mscope == :class && obj.docstring.blank? && %w(inherited included + extended method_added method_removed method_undefined).include?(meth) + obj.add_tag(YARD::Tags::Tag.new(:private, nil)) + elsif meth.to_s =~ /\?$/ + add_predicate_return_tag(obj) + end + + if obj.has_tag?(:option) + # create the options parameter if its missing + obj.tags(:option).each do |option| + expected_param = option.name + unless obj.tags(:param).find {|x| x.name == expected_param } + new_tag = YARD::Tags::Tag.new(:param, "a customizable set of options", "Hash", expected_param) + obj.add_tag(new_tag) + end + end + end + + info = obj.attr_info + if info + if meth.to_s =~ /=$/ # writer + info[:write] = obj if info[:read] + elsif info[:write] + info[:read] = obj + end + end + + parse_block(blk, :owner => obj) # mainly for yield/exceptions + end + + def format_args + return [] unless args = statement.parameters + + params = [] + + if args.unnamed_required_params + params += args.unnamed_required_params.map {|a| [a.source, nil] } + end + + if args.unnamed_optional_params + params += args.unnamed_optional_params.map do |a| + [a[0].source, a[1].source] + end + end + + params << ['*' + args.splat_param.source, nil] if args.splat_param + + if args.unnamed_end_params + params += args.unnamed_end_params.map {|a| [a.source, nil] } + end + + if args.named_params + params += args.named_params.map do |a| + [a[0].source, a[1] ? a[1].source : nil] + end + end + + if args.double_splat_param + params << ['**' + args.double_splat_param.source, nil] + end + + params << ['&' + args.block_param.source, nil] if args.block_param + + params + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/handlers/ruby/mixin_handler.rb b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/handlers/ruby/mixin_handler.rb new file mode 100644 index 000000000..c7edc0070 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/handlers/ruby/mixin_handler.rb @@ -0,0 +1,54 @@ +# frozen_string_literal: true +# Handles the 'include' statement to mixin a module in the instance scope +class YARD::Handlers::Ruby::MixinHandler < YARD::Handlers::Ruby::Base + handles method_call(:include) + handles method_call(:prepend) + namespace_only + + process do + errors = [] + statement.parameters(false).reverse.each do |mixin| + begin + process_mixin(mixin) + rescue YARD::Parser::UndocumentableError => err + errors << err.message + end + end + unless errors.empty? + msg = errors.size == 1 ? ": #{errors[0]}" : "s: #{errors.join(", ")}" + raise YARD::Parser::UndocumentableError, "mixin#{msg} for class #{namespace.path}" + end + end + + protected + + def process_mixin(mixin) + raise YARD::Parser::UndocumentableError unless mixin.ref? + raise YARD::Parser::UndocumentableError if mixin.first.type == :ident + + case obj = Proxy.new(namespace, mixin.source) + when ConstantObject # If a constant is included, use its value as the real object + obj = Proxy.new(namespace, obj.value, :module) + else + obj = Proxy.new(namespace, mixin.source, :module) + end + + rec = recipient(mixin) + return if rec.nil? || rec.mixins(scope).include?(obj) + + shift = statement.method_name(true) == :include ? :unshift : :push + rec.mixins(scope).send(shift, obj) + end + + def recipient(mixin) + if statement[0].type == :const_path_ref + Proxy.new(namespace, statement[0].source) + elsif statement[0].type == :var_ref && statement[0][0] != s(:kw, "self") + statement[0][0].type == :const ? + Proxy.new(namespace, statement.namespace.source) : + nil + else + namespace + end + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/handlers/ruby/module_function_handler.rb b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/handlers/ruby/module_function_handler.rb new file mode 100644 index 000000000..0d13acbf0 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/handlers/ruby/module_function_handler.rb @@ -0,0 +1,39 @@ +# frozen_string_literal: true +# Handles module_function calls to turn methods into public class methods. +# Also creates a private instance copy of the method. +class YARD::Handlers::Ruby::ModuleFunctionHandler < YARD::Handlers::Ruby::Base + include YARD::Handlers::Ruby::DecoratorHandlerMethods + + handles method_call(:module_function) + namespace_only + + process do + return if statement.jump(:ident) == statement + case statement.type + when :var_ref, :vcall + self.scope = :module + when :fcall, :command + statement[1].traverse do |node| + case node.type + when :def + process_decorator do |instance_method| + make_module_function(instance_method, namespace) + end + break + when :symbol; name = node.first.source + when :string_content; name = node.source + else next + end + + instance_method = MethodObject.new(namespace, name) + make_module_function(instance_method, namespace) + end + end + end + + def make_module_function(instance_method, namespace) + class_method = MethodObject.new(namespace, instance_method.name, :module) + instance_method.copy_to(class_method) + class_method.visibility = :public + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/handlers/ruby/module_handler.rb b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/handlers/ruby/module_handler.rb new file mode 100644 index 000000000..d66d3efe3 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/handlers/ruby/module_handler.rb @@ -0,0 +1,12 @@ +# frozen_string_literal: true +# Handles the declaration of a module +class YARD::Handlers::Ruby::ModuleHandler < YARD::Handlers::Ruby::Base + handles :module + namespace_only + + process do + modname = statement[0].source + mod = register ModuleObject.new(namespace, modname) + parse_block(statement[1], :namespace => mod) + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/handlers/ruby/private_class_method_handler.rb b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/handlers/ruby/private_class_method_handler.rb new file mode 100644 index 000000000..ea5365abc --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/handlers/ruby/private_class_method_handler.rb @@ -0,0 +1,14 @@ +# frozen_string_literal: true +# Sets visibility of a class method to private. +class YARD::Handlers::Ruby::PrivateClassMethodHandler < YARD::Handlers::Ruby::Base + include YARD::Handlers::Ruby::DecoratorHandlerMethods + + handles method_call(:private_class_method) + namespace_only + + process do + process_decorator :scope => :class do |method| + method.visibility = :private if method.respond_to? :visibility= + end + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/handlers/ruby/private_constant_handler.rb b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/handlers/ruby/private_constant_handler.rb new file mode 100644 index 000000000..2f7cbb275 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/handlers/ruby/private_constant_handler.rb @@ -0,0 +1,43 @@ +# frozen_string_literal: true +module YARD + module Handlers + module Ruby + # Sets visibility of a constant (class, module, const) + class PrivateConstantHandler < YARD::Handlers::Ruby::Base + handles method_call(:private_constant) + namespace_only + + process do + errors = [] + statement.parameters.each do |param| + next unless AstNode === param + begin + privatize_constant(param) + rescue UndocumentableError => err + errors << err.message + end + end + unless errors.empty? + msg = errors.size == 1 ? ": #{errors[0]}" : "s: #{errors.join(", ")}" + raise UndocumentableError, "private constant#{msg} for #{namespace.path}" + end + end + + private + + def privatize_constant(node) + if node.literal? || (node.type == :var_ref && node[0].type == :const) + node = node.jump(:tstring_content, :const) + const = Proxy.new(namespace, node[0]) + ensure_loaded!(const) + const.visibility = :private + else + raise UndocumentableError, "invalid argument to private_constant: #{node.source}" + end + rescue NamespaceMissingError + raise UndocumentableError, "private visibility set on unrecognized constant: #{node[0]}" + end + end + end + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/handlers/ruby/public_class_method_handler.rb b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/handlers/ruby/public_class_method_handler.rb new file mode 100644 index 000000000..83c527165 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/handlers/ruby/public_class_method_handler.rb @@ -0,0 +1,14 @@ +# frozen_string_literal: true +# Sets visibility of a class method to public. +class YARD::Handlers::Ruby::PublicClassMethodHandler < YARD::Handlers::Ruby::Base + include YARD::Handlers::Ruby::DecoratorHandlerMethods + + handles method_call(:public_class_method) + namespace_only + + process do + process_decorator :scope => :class do |method| + method.visibility = :public if method.respond_to? :visibility + end + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/handlers/ruby/struct_handler_methods.rb b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/handlers/ruby/struct_handler_methods.rb new file mode 100644 index 000000000..d23b2ad3a --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/handlers/ruby/struct_handler_methods.rb @@ -0,0 +1,143 @@ +# frozen_string_literal: true +# Helper methods to parse @attr_* tags on a class. +# +# @deprecated The use of +@attr+ tags are deprecated since 0.8.0 in favour of +# the +@!attribute+ directive. This module should not be relied on. +# @since 0.5.6 +module YARD::Handlers::Ruby::StructHandlerMethods + include YARD::CodeObjects + + # Extracts the user's defined @member tag for a given class and its member. Returns + # nil if the user did not define a @member tag for this struct entry. + # + # @param [ClassObject] klass the class whose tags we're searching + # @param [String] member the name of the struct member we need + # @param [Symbol] type reader method, or writer method? + # @return [Tags::Tag, nil] the tag matching the request, or nil if not found + def member_tag_for_member(klass, member, type = :read) + specific_tag = type == :read ? :attr_reader : :attr_writer + (klass.tags(specific_tag) + klass.tags(:attr)).find {|tag| tag.name == member } + end + + # Retrieves all members defined in @attr* tags + # + # @param [ClassObject] klass the class with the attributes + # @return [Array] the list of members defined as attributes on the class + def members_from_tags(klass) + tags = klass.tags(:attr) + klass.tags(:attr_reader) + klass.tags(:attr_writer) + tags.map(&:name).uniq + end + + # Determines whether to create an attribute method based on the class's + # tags. + # + # @param [ClassObject] klass the class whose tags we're searching + # @param [String] member the name of the struct member we need + # @param [Symbol] type (:read) reader method, or writer method? + # @return [Boolean] should the attribute be created? + def create_member_method?(klass, member, type = :read) + return true if (klass.tags(:attr) + klass.tags(:attr_reader) + klass.tags(:attr_writer)).empty? + return true if member_tag_for_member(klass, member, type) + return !member_tag_for_member(klass, member, :write) if type == :read + !member_tag_for_member(klass, member, :read) + end + + # Gets the return type for the member in a nicely formatted string. Used + # to be injected into auto-generated docstrings. + # + # @param [Tags::Tag] member_tag the tag object to check for types + # @return [String] the user-declared type of the struct member, or [Object] if + # the user did not define a type for this member. + def return_type_from_tag(member_tag) + member_tag && member_tag.types ? member_tag.types : "Object" + end + + # Creates the auto-generated docstring for the getter method of a struct's + # member. This is used so the generated documentation will look just like that + # of an attribute defined using attr_accessor. + # + # @param [ClassObject] klass the class whose members we're working with + # @param [String] member the name of the member we're generating documentation for + # @return [String] a docstring to be attached to the getter method for this member + def add_reader_tags(klass, new_method, member) + member_tag = member_tag_for_member(klass, member, :read) + return_type = return_type_from_tag(member_tag) + getter_doc_text = member_tag ? member_tag.text : "Returns the value of attribute #{member}" + new_method.docstring.replace(getter_doc_text) + new_method.add_tag YARD::Tags::Tag.new(:return, "the current value of #{member}", return_type) + end + + # Creates the auto-generated docstring for the setter method of a struct's + # member. This is used so the generated documentation will look just like that + # of an attribute defined using attr_accessor. + # + # @param [ClassObject] klass the class whose members we're working with + # @param [String] member the name of the member we're generating documentation for + # @return [String] a docstring to be attached to the setter method for this member + def add_writer_tags(klass, new_method, member) + member_tag = member_tag_for_member(klass, member, :write) + return_type = return_type_from_tag(member_tag) + setter_doc_text = member_tag ? member_tag.text : "Sets the attribute #{member}" + new_method.docstring.replace(setter_doc_text) + new_method.add_tag YARD::Tags::Tag.new(:param, "the value to set the attribute #{member} to.", return_type, "value") + new_method.add_tag YARD::Tags::Tag.new(:return, "the newly set value", return_type) + end + + # Creates and registers a class object with the given name and superclass name. + # Returns it for further use. + # + # @param [String] classname the name of the class + # @param [String] superclass the name of the superclass + # @return [ClassObject] the class object for further processing/method attaching + def create_class(classname, superclass) + register ClassObject.new(namespace, classname) do |o| + o.superclass = superclass if superclass + o.superclass.type = :class if o.superclass.is_a?(Proxy) + end + end + + # Creates the setter (writer) method and attaches it to the class as an attribute. + # Also sets up the docstring to prettify the documentation output. + # + # @param [ClassObject] klass the class to attach the method to + # @param [String] member the name of the member we're generating a method for + def create_writer(klass, member) + # We want to convert these members into attributes just like + # as if they were declared using attr_accessor. + new_meth = register MethodObject.new(klass, "#{member}=", :instance) do |o| + o.parameters = [['value', nil]] + o.signature ||= "def #{member}=(value)" + o.source ||= "#{o.signature}\n @#{member} = value\nend" + end + add_writer_tags(klass, new_meth, member) + klass.attributes[:instance][member][:write] = new_meth + end + + # Creates the getter (reader) method and attaches it to the class as an attribute. + # Also sets up the docstring to prettify the documentation output. + # + # @param [ClassObject] klass the class to attach the method to + # @param [String] member the name of the member we're generating a method for + def create_reader(klass, member) + new_meth = register MethodObject.new(klass, member, :instance) do |o| + o.signature ||= "def #{member}" + o.source ||= "#{o.signature}\n @#{member}\nend" + end + add_reader_tags(klass, new_meth, member) + klass.attributes[:instance][member][:read] = new_meth + end + + # Creates the given member methods and attaches them to the given ClassObject. + # + # @param [ClassObject] klass the class to generate attributes for + # @param [Array] members a list of member names + def create_attributes(klass, members) + # For each parameter, add reader and writers + members.each do |member| + next if klass.attributes[:instance][member] + klass.attributes[:instance][member] = SymbolHash[:read => nil, :write => nil] + create_writer klass, member if create_member_method?(klass, member, :write) + create_reader klass, member if create_member_method?(klass, member, :read) + end + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/handlers/ruby/visibility_handler.rb b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/handlers/ruby/visibility_handler.rb new file mode 100644 index 000000000..0d13d5127 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/handlers/ruby/visibility_handler.rb @@ -0,0 +1,22 @@ +# frozen_string_literal: true +# Handles 'private', 'protected', and 'public' calls. +class YARD::Handlers::Ruby::VisibilityHandler < YARD::Handlers::Ruby::Base + include YARD::Handlers::Ruby::DecoratorHandlerMethods + + handles method_call(:private) + handles method_call(:protected) + handles method_call(:public) + namespace_only + + process do + return if (ident = statement.jump(:ident)) == statement + case statement.type + when :var_ref, :vcall + self.visibility = ident.first.to_sym + when :fcall, :command + process_decorator do |method| + method.visibility = ident.first if method.respond_to? :visibility= + end + end + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/handlers/ruby/yield_handler.rb b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/handlers/ruby/yield_handler.rb new file mode 100644 index 000000000..a9e5f81c4 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/handlers/ruby/yield_handler.rb @@ -0,0 +1,31 @@ +# frozen_string_literal: true +# Handles 'yield' calls +class YARD::Handlers::Ruby::YieldHandler < YARD::Handlers::Ruby::Base + handles :yield, :yield0 + + process do + return unless owner.is_a?(MethodObject) # Only methods yield + return if owner.has_tag? :yield # Don't override yield tags + return if owner.has_tag? :yieldparam # Same thing. + + yieldtag = YARD::Tags::Tag.new(:yield, "", []) + + if statement.type == :yield + statement.jump(:list).children.each do |item| + if item == s(:var_ref, s(:kw, "self")) + yieldtag.types << '_self' + owner.add_tag YARD::Tags::Tag.new(:yieldparam, + "the object that the method was called on", owner.namespace.path, '_self') + elsif item == s(:zsuper) + yieldtag.types << '_super' + owner.add_tag YARD::Tags::Tag.new(:yieldparam, + "the result of the method from the superclass", nil, '_super') + else + yieldtag.types << item.source + end + end + end + + owner.add_tag(yieldtag) unless yieldtag.types.empty? + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/i18n/locale.rb b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/i18n/locale.rb new file mode 100644 index 000000000..6a6cd5ced --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/i18n/locale.rb @@ -0,0 +1,67 @@ +# frozen_string_literal: true +module YARD + module I18n + # +Locale+ is a unit of translation. It has {#name} and a set of + # messages. + # + # @since 0.8.2 + class Locale + class << self + # @return [String, nil] the default locale name. + # @since 0.8.4 + attr_accessor :default + + undef default + def default + @@default ||= nil + end + + undef default= + def default=(locale) + @@default = locale + end + end + + # @return [String] the name of the locale. It used IETF language + # tag format +[language[_territory][.codeset][@modifier]]+. + # @see http://tools.ietf.org/rfc/bcp/bcp47.txt + # BCP 47 - Tags for Identifying Languages + attr_reader :name + + # Creates a locale for +name+ locale. + # + # @param [String] name the locale name. + def initialize(name) + @name = name + @messages = {} + end + + # Loads translation messages from +locale_directory+/{#name}.po. + # + # @param [String] locale_directory the directory path that has + # {#name}.po. + # @return [Boolean] +true+ if PO file exists, +false+ otherwise. + def load(locale_directory) + return false if @name.nil? + + po_file = File.join(locale_directory, "#{@name}.po") + return false unless File.exist?(po_file) + + require "yard/i18n/po_parser" + return false unless POParser.available? + + po_parser = POParser.new + @messages.merge!(po_parser.parse(po_file)) + + true + end + + # @param [String] message the translation target message. + # @return [String] translated message. If tarnslation isn't + # registered, the +message+ is returned. + def translate(message) + @messages[message] || message + end + end + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/i18n/message.rb b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/i18n/message.rb new file mode 100644 index 000000000..fa811efa8 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/i18n/message.rb @@ -0,0 +1,57 @@ +# frozen_string_literal: true +require "set" + +module YARD + module I18n + # +Message+ is a translation target message. It has message ID as + # {#id} and some properties {#locations} and {#comments}. + # + # @since 0.8.1 + class Message + # @return [String] the message ID of the trnslation target message. + attr_reader :id + + # @return [Set] the set of locations. Location is an array of + # path and line number where the message is appeared. + attr_reader :locations + + # @return [Set] the set of comments for the messages. + attr_reader :comments + + # Creates a trasnlate target message for message ID +id+. + # + # @param [String] id the message ID of the translate target message. + def initialize(id) + @id = id + @locations = Set.new + @comments = Set.new + end + + # Adds location information for the message. + # + # @param [String] path the path where the message appears. + # @param [Integer] line the line number where the message appears. + # @return [void] + def add_location(path, line) + @locations << [path, line] + end + + # Adds a comment for the message. + # + # @param [String] comment the comment for the message to be added. + # @return [void] + def add_comment(comment) + @comments << comment unless comment.nil? + end + + # @param [Message] other the +Message+ to be compared. + # @return [Boolean] checks whether this message is equal to another. + def ==(other) + other.is_a?(self.class) && + @id == other.id && + @locations == other.locations && + @comments == other.comments + end + end + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/i18n/messages.rb b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/i18n/messages.rb new file mode 100644 index 000000000..7a5a455ca --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/i18n/messages.rb @@ -0,0 +1,56 @@ +# frozen_string_literal: true +module YARD + module I18n + # Acts as a container for {Message} objects. + # + # @since 0.8.1 + class Messages + include Enumerable + + # Creates a new container. + def initialize + @messages = {} + end + + # Enumerates each {Message} in the container. + # + # @yieldparam [Message] message the next message object in + # the enumeration. + # @return [void] + def each(&block) + @messages.each_value(&block) + end + + # @param [String] id the message ID to perform a lookup on. + # @return [Message, nil] a registered message for the given +id+, + # or nil if no message for the ID is found. + def [](id) + @messages[id] + end + + # Registers a {Message}, the mssage ID of which is +id+. If + # corresponding +Message+ is already registered, the previously + # registered object is returned. + # + # @param [String] id the ID of the message to be registered. + # @return [Message] the registered +Message+. + def register(id) + @messages[id] ||= Message.new(id) + end + + # Checks if this messages list is equal to another messages list. + # + # @param [Messages] other the container to compare. + # @return [Boolean] whether +self+ and +other+ is equivalence or not. + def ==(other) + other.is_a?(self.class) && + @messages == other.messages + end + + protected + + # @return [Hash{String=>Message}] the set of message objects + attr_reader :messages + end + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/i18n/po_parser.rb b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/i18n/po_parser.rb new file mode 100644 index 000000000..1ccd1f88f --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/i18n/po_parser.rb @@ -0,0 +1,61 @@ +# frozen_string_literal: true +module YARD + module I18n + # +Locale+ is a wrapper for gettext's PO parsing feature. It hides + # gettext API difference from YARD. + # + # @since 0.8.8 + class POParser + if RUBY_VERSION < "1.9" + begin + require "gettext/tools/poparser" + require "gettext/runtime/mofile" + @@gettext_version = 2 + rescue LoadError + log.warn "Need gettext gem 2.x for i18n feature:\n" \ + "\tgem install gettext -v 2.3.9" + end + else + begin + require "gettext/po_parser" + require "gettext/mo" + @@gettext_version = 3 + rescue LoadError + begin + require "gettext/tools/poparser" + require "gettext/runtime/mofile" + @@gettext_version = 2 + rescue LoadError + log.warn "Need gettext gem for i18n feature:\n" \ + "\tgem install gettext" + end + end + end + + class << self + # @return [Boolean] true if gettext is available, false otherwise. + def available? + !@@gettext_version.nil? + end + end + + # Parses PO file. + # + # @param [String] file path of PO file to be parsed. + # @return [Hash] parsed messages. + def parse(file) + case @@gettext_version + when 2 + parser = GetText::PoParser.new + data = GetText::MoFile.new + when 3 + parser = GetText::POParser.new + data = GetText::MO.new + end + parser.report_warning = false + parser.parse_file(file, data) + data + end + end + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/i18n/pot_generator.rb b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/i18n/pot_generator.rb new file mode 100644 index 000000000..7a7d93be3 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/i18n/pot_generator.rb @@ -0,0 +1,290 @@ +# frozen_string_literal: true +require "stringio" + +module YARD + module I18n + # The +PotGenerator+ generates POT format string from + # {CodeObjects::Base} and {CodeObjects::ExtraFileObject}. + # + # == POT and PO + # + # POT is an acronym for "Portable Object Template". POT is a + # template file to create PO file. The extension for POT is + # ".pot". PO file is an acronym for "Portable Object". PO file has + # many parts of message ID (msgid) that is translation target + # message and message string (msgstr) that is translated message + # of message ID. If you want to translate "Hello" in English into + # "Bonjour" in French, "Hello" is the msgid ID and "Bonjour" is + # msgstr. The extension for PO is ".po". + # + # == How to extract msgids + # + # The +PotGenerator+ has two parse methods: + # + # * {#parse_objects} for {CodeObjects::Base} + # * {#parse_files} for {CodeObjects::ExtraFileObject} + # + # {#parse_objects} extracts msgids from docstring and tags of + # {CodeObjects::Base} objects. The docstring of + # {CodeObjects::Base} object is parsed and a paragraph is + # extracted as a msgid. Tag name and tag text are extracted as + # msgids from a tag. + # + # {#parse_files} extracts msgids from + # {CodeObjects::ExtraFileObject} objects. The file content of + # {CodeObjects::ExtraFileObject} object is parsed and a paragraph + # is extracted as a msgid. + # + # == Usage + # + # To create a .pot file by +PotGenerator+, instantiate a + # +PotGenerator+ with a relative working directory path from a + # directory path that has created .pot file, parse + # {CodeObjects::Base} objects and {CodeObjects::ExtraFileObject} + # objects, generate a POT and write the generated POT to a .pot + # file. The relative working directory path is ".." when the + # working directory path is "." and the POT is wrote into + # "po/yard.pot". + # + # @example Generate a .pot file + # po_file_path = "po/yard.pot" + # po_file_directory_pathname = Pathname.new(po_file_path).directory) + # working_directory_pathname = Pathname.new(".") + # relative_base_path = working_directory_pathname.relative_path_from(po_file_directory_pathname).to_s + # # relative_base_path -> ".." + # generator = YARD::I18n::PotGenerator.new(relative_base_path) + # generator.parse_objects(objects) + # generator.parse_files(files) + # pot = generator.generate + # po_file_directory_pathname.mkpath + # File.open(po_file_path, "w") do |pot_file| + # pot_file.print(pot) + # end + # @see http://www.gnu.org/software/gettext/manual/html_node/PO-Files.html + # GNU gettext manual about details of PO file + class PotGenerator + # Extracted messages. + # + # @return [Messages] + # @since 0.8.1 + attr_reader :messages + + # Creates a POT generator that uses +relative_base_path+ to + # generate locations for a msgid. +relative_base_path+ is + # prepended to all locations. + # + # @param [String] relative_base_path a relative working + # directory path from a directory path that has created .pot + # file. + def initialize(relative_base_path) + @relative_base_path = relative_base_path + @extracted_objects = {} + @messages = Messages.new + end + + # Parses {CodeObjects::Base} objects and stores extracted msgids + # into {#messages} + # + # @param [Array] objects a list of + # {CodeObjects::Base} to be parsed. + # @return [void] + def parse_objects(objects) + objects.each do |object| + extract_documents(object) + end + end + + # Parses {CodeObjects::ExtraFileObject} objects and stores + # extracted msgids into {#messages}. + # + # @param [Array] files a list + # of {CodeObjects::ExtraFileObject} objects to be parsed. + # @return [void] + def parse_files(files) + files.each do |file| + extract_paragraphs(file) + end + end + + # Generates POT from +@messages+. + # + # One PO file entry is generated from a +Message+ in + # +@messages+. + # + # Locations of the +Message+ are used to generate the reference + # line that is started with "#: ". +relative_base_path+ passed + # when the generater is created is prepended to each path in location. + # + # Comments of the +Message+ are used to generate the + # translator-comment line that is started with "# ". + # + # @return [String] POT format string + def generate + pot = String.new(header) + sorted_messages = @messages.sort_by do |message| + sorted_locations = message.locations.sort + sorted_locations.first || [] + end + sorted_messages.each do |message| + generate_message(pot, message) + end + pot + end + + private + + def header + <<-EOH +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# FIRST AUTHOR , YEAR. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\\n" +"Report-Msgid-Bugs-To: \\n" +"POT-Creation-Date: #{generate_pot_creation_date_value}\\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\\n" +"Last-Translator: FULL NAME \\n" +"Language-Team: LANGUAGE \\n" +"Language: \\n" +"MIME-Version: 1.0\\n" +"Content-Type: text/plain; charset=UTF-8\\n" +"Content-Transfer-Encoding: 8bit\\n" + +EOH + end + + def current_time + @current_time ||= Time.now + end + + def generate_pot_creation_date_value + current_time.strftime("%Y-%m-%d %H:%M%z") + end + + def generate_message(pot, message) + message.comments.sort.each do |comment| + pot << "# #{comment}\n" unless comment.empty? + end + message.locations.sort.each do |path, line| + pot << "#: #{@relative_base_path}/#{path}:#{line}\n" + end + escaped_message_id = escape_message_id(message.id) + escaped_message_id = escaped_message_id.gsub(/\n/, "\\\\n\"\n\"") + pot << "msgid \"#{escaped_message_id}\"\n" + pot << "msgstr \"\"\n" + pot << "\n" + pot + end + + def escape_message_id(message_id) + message_id.gsub(/(\\|")/) do + special_character = $1 + "\\#{special_character}" + end + end + + def register_message(id) + @messages.register(id) + end + + def extract_documents(object) + return if @extracted_objects.key?(object) + + @extracted_objects[object] = true + case object + when CodeObjects::NamespaceObject + object.children.each do |child| + extract_documents(child) + end + end + + if object.group + message = register_message(object.group) + object.files.each do |path, line| + message.add_location(path, line) + end + message.add_comment(object.path) unless object.path.empty? + end + + docstring = object.docstring + unless docstring.empty? + text = Text.new(StringIO.new(docstring)) + text.extract_messages do |type, *args| + case type + when :paragraph + paragraph, line_no = *args + message = register_message(paragraph.rstrip) + object.files.each do |path, line| + message.add_location(path, (docstring.line || line) + line_no) + end + message.add_comment(object.path) unless object.path.empty? + else + raise "should not reach here: unexpected type: #{type}" + end + end + end + docstring.tags.each do |tag| + extract_tag_documents(tag) + end + end + + def extract_tag_documents(tag) + extract_tag_name(tag) + extract_tag_text(tag) + + extract_documents(tag) if Tags::OverloadTag === tag + end + + def extract_tag_name(tag) + return if tag.name.nil? + return if tag.name.is_a?(String) && tag.name.empty? + key = "tag|#{tag.tag_name}|#{tag.name}" + message = register_message(key) + tag.object.files.each do |path, line| + message.add_location(path, line) + end + tag_label = String.new("@#{tag.tag_name}") + tag_label << " [#{tag.types.join(', ')}]" if tag.types + message.add_comment(tag_label) + end + + def extract_tag_text(tag) + return if tag.text.nil? + return if tag.text.empty? + message = register_message(tag.text) + tag.object.files.each do |path, line| + message.add_location(path, line) + end + tag_label = String.new("@#{tag.tag_name}") + tag_label << " [#{tag.types.join(', ')}]" if tag.types + tag_label << " #{tag.name}" if tag.name + message.add_comment(tag_label) + end + + def extract_paragraphs(file) + File.open(file.filename) do |input| + text = Text.new(input, :have_header => true) + text.extract_messages do |type, *args| + case type + when :attribute + name, value, line_no = *args + message = register_message(value) + message.add_location(file.filename, line_no) + message.add_comment(name) + when :paragraph + paragraph, line_no = *args + message = register_message(paragraph.rstrip) + message.add_location(file.filename, line_no) + else + raise "should not reach here: unexpected type: #{type}" + end + end + end + end + end + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/i18n/text.rb b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/i18n/text.rb new file mode 100644 index 000000000..229245db0 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/i18n/text.rb @@ -0,0 +1,173 @@ +# frozen_string_literal: true +module YARD + module I18n + # Provides some convenient features for translating a text. + class Text + # Creates a text object that has translation related features for + # the input text. + # + # @param [#each_line] input a text to be translated. + # @option options [Boolean] :have_header (false) whether the + # input text has header or not. + def initialize(input, options = {}) + @input = input + @options = options + end + + # Extracts translation target messages from +@input+. + # + # @yield [:attribute, name, value, line_no] the block that + # receives extracted an attribute in header. It may called many + # times. + # @yieldparam [String] name the name of extracted attribute. + # @yieldparam [String] value the value of extracted attribute. + # @yieldparam [Integer] line_no the defined line number of extracted + # attribute. + # @yield [:paragraph, text, start_line_no] the block that + # receives extracted a paragraph in body. Paragraph is a text + # block separated by one or more empty lines. Empty line is a + # line that contains only zero or more whitespaces. It may + # called many times. + # @yieldparam [String] text the text of extracted paragraph. + # @yieldparam [Integer] start_line_no the start line number of + # extracted paragraph. + # @return [void] + def extract_messages + parse do |part| + case part[:type] + when :markup, :empty_line + # ignore + when :attribute + yield(:attribute, part[:name], part[:value], part[:line_no]) + when :paragraph + yield(:paragraph, part[:paragraph], part[:line_no]) + end + end + end + + # Translates into +locale+. + # + # @param [Locale] locale the translation target locale. + # @return [String] translated text. + def translate(locale) + translated_text = String.new("") + parse do |part| + case part[:type] + when :markup + translated_text << part[:line] + when :attribute + prefix = "#{part[:prefix]}#{part[:name]}#{part[:infix]}" + value = locale.translate(part[:value]) + suffix = part[:suffix] + translated_text << "#{prefix}#{value}#{suffix}" + when :paragraph + translated_text << locale.translate(part[:paragraph]) + when :empty_line + translated_text << part[:line] + else + raise "should not reach here: unexpected type: #{type}" + end + end + translated_text + end + + private + + def parse(&block) + paragraph = String.new("") + paragraph_start_line = 0 + line_no = 0 + in_header = @options[:have_header] + + @input.each_line do |line| + line_no += 1 + if in_header + case line + when /^#!\S+\s*$/ + if line_no == 1 + emit_markup_event(line, line_no, &block) + else + in_header = false + end + when /^(\s*#\s*@)(\S+)(\s*)(.+?)(\s*)$/ + emit_attribute_event(Regexp.last_match, line_no, &block) + else + in_header = false + if line.strip.empty? + emit_empty_line_event(line, line_no, &block) + next + end + end + next if in_header + end + + case line + when /^\s*$/ + if paragraph.empty? + emit_empty_line_event(line, line_no, &block) + else + paragraph << line + emit_paragraph_event(paragraph, paragraph_start_line, line_no, + &block) + paragraph = String.new("") + end + else + paragraph_start_line = line_no if paragraph.empty? + paragraph << line + end + end + + unless paragraph.empty? + emit_paragraph_event(paragraph, paragraph_start_line, line_no, &block) + end + end + + def emit_markup_event(line, line_no) + part = { + :type => :markup, + :line => line, + :line_no => line_no + } + yield(part) + end + + def emit_attribute_event(match_data, line_no) + part = { + :type => :attribute, + :prefix => match_data[1], + :name => match_data[2], + :infix => match_data[3], + :value => match_data[4], + :suffix => match_data[5], + :line_no => line_no + } + yield(part) + end + + def emit_empty_line_event(line, line_no) + part = { + :type => :empty_line, + :line => line, + :line_no => line_no + } + yield(part) + end + + def emit_paragraph_event(paragraph, paragraph_start_line, line_no, &block) + paragraph_part = { + :type => :paragraph, + :line_no => paragraph_start_line + } + match_data = /(\s*)\z/.match(paragraph) + if match_data + paragraph_part[:paragraph] = match_data.pre_match + yield(paragraph_part) + emit_empty_line_event(match_data[1], line_no, &block) + else + paragraph_part[:paragraph] = paragraph + yield(paragraph_part) + end + end + end + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/logging.rb b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/logging.rb new file mode 100644 index 000000000..2681b6398 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/logging.rb @@ -0,0 +1,205 @@ +# encoding: utf-8 +# frozen_string_literal: true +require 'logger' +require 'thread' + +module YARD + # Handles console logging for info, warnings and errors. + # Uses the stdlib Logger class in Ruby for all the backend logic. + class Logger < ::Logger + # The list of characters displayed beside the progress bar to indicate + # "movement". + # @since 0.8.2 + PROGRESS_INDICATORS = %w(⣷ ⣯ ⣟ ⡿ ⢿ ⣻ ⣽ ⣾) + + # @return [IO] the IO object being logged to + # @since 0.8.2 + def io; @logdev end + def io=(pipe) @logdev = pipe end + + # @return [Boolean] whether backtraces should be shown (by default + # this is on). + def show_backtraces; @show_backtraces || level == DEBUG end + attr_writer :show_backtraces + + # @return [Boolean] whether progress indicators should be shown when + # logging CLIs (by default this is off). + def show_progress + return false if YARD.ruby18? # threading is too ineffective for progress support + return false if YARD.windows? # windows has poor ANSI support + return false unless io.tty? # no TTY support on IO + return false unless level > INFO # no progress in verbose/debug modes + @show_progress + end + attr_writer :show_progress + + # The logger instance + # @return [Logger] the logger instance + def self.instance(pipe = STDOUT) + @logger ||= new(pipe) + end + + # Creates a new logger + def initialize(pipe, *args) + super(pipe, *args) + self.io = pipe + self.show_backtraces = true + self.show_progress = false + self.level = WARN + self.formatter = method(:format_log) + self.warned = false + @progress_indicator = 0 + @mutex = Mutex.new + @progress_msg = nil + @progress_last_update = Time.now + end + + # Changes the debug level to DEBUG if $DEBUG is set + # and writes a debugging message. + def debug(*args) + self.level = DEBUG if $DEBUG + super + end + + # Remembers when a warning occurs and writes a warning message. + def warn(*args) + self.warned = true + super + end + attr_accessor :warned + + # Captures the duration of a block of code for benchmark analysis. Also + # calls {#progress} on the message to display it to the user. + # + # @todo Implement capture storage for reporting of benchmarks + # @param [String] msg the message to display + # @param [Symbol, nil] nontty_log the level to log as if the output + # stream is not a TTY. Use +nil+ for no alternate logging. + # @yield a block of arbitrary code to benchmark + # @return [void] + def capture(msg, nontty_log = :debug) + progress(msg, nontty_log) + yield + ensure + clear_progress + end + + # Displays a progress indicator for a given message. This progress report + # is only displayed on TTY displays, otherwise the message is passed to + # the +nontty_log+ level. + # + # @param [String] msg the message to log + # @param [Symbol, nil] nontty_log the level to log as if the output + # stream is not a TTY. Use +nil+ for no alternate logging. + # @return [void] + # @since 0.8.2 + def progress(msg, nontty_log = :debug) + send(nontty_log, msg) if nontty_log + return unless show_progress + icon = "" + if defined?(::Encoding) + icon = PROGRESS_INDICATORS[@progress_indicator] + " " + end + @mutex.synchronize do + print("\e[2K\e[?25l\e[1m#{icon}#{msg}\e[0m\r") + @progress_msg = msg + if Time.now - @progress_last_update > 0.2 + @progress_indicator += 1 + @progress_indicator %= PROGRESS_INDICATORS.size + @progress_last_update = Time.now + end + end + Thread.new do + sleep(0.05) + progress(msg + ".", nil) if @progress_msg == msg + end + end + + # Clears the progress indicator in the TTY display. + # @return [void] + # @since 0.8.2 + def clear_progress + return unless show_progress + print_no_newline("\e[?25h\e[2K") + @progress_msg = nil + end + + # Displays an unformatted line to the logger output stream, adding + # a newline. + # @param [String] msg the message to display + # @return [void] + # @since 0.8.2 + def puts(msg = '') + print("#{msg}\n") + end + + alias print_no_newline << + private :print_no_newline + + # Displays an unformatted line to the logger output stream. + # @param [String] msg the message to display + # @return [void] + # @since 0.8.2 + def print(msg = '') + clear_line + print_no_newline(msg) + end + alias << print + + # Prints the backtrace +exc+ to the logger as error data. + # + # @param [Array] exc the backtrace list + # @param [Symbol] level_meth the level to log backtrace at + # @return [void] + def backtrace(exc, level_meth = :error) + return unless show_backtraces + send(level_meth, "#{exc.class.class_name}: #{exc.message}") + send(level_meth, "Stack trace:" + + exc.backtrace[0..5].map {|x| "\n\t#{x}" }.join + "\n") + end + + # Warns that the Ruby environment does not support continuations. Applies + # to JRuby, Rubinius and MacRuby. This warning will only display once + # per Ruby process. + # + # @deprecated Continuations are no longer needed by YARD 0.8.0+. + # @return [void] + def warn_no_continuations + end + + # Sets the logger level for the duration of the block + # + # @example + # log.enter_level(Logger::ERROR) do + # YARD.parse_string "def x; end" + # end + # @param [Fixnum] new_level the logger level for the duration of the block. + # values can be found in Ruby's Logger class. + # @yield the block with the logger temporarily set to +new_level+ + def enter_level(new_level = level) + old_level = level + self.level = new_level + yield + ensure + self.level = old_level + end + + private + + # Override this internal Logger method to clear line + def add(*args) + clear_line + super(*args) + end + + def clear_line + return unless @progress_msg + print_no_newline("\e[2K\r") + end + + # Log format (from Logger implementation). Used by Logger internally + def format_log(sev, _time, _prog, msg) + "[#{sev.downcase}]: #{msg}\n" + end + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/options.rb b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/options.rb new file mode 100644 index 000000000..0dc4eeeac --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/options.rb @@ -0,0 +1,217 @@ +# frozen_string_literal: true +module YARD + # Generalized options class for passing around large amounts of options between objects. + # + # The options class exists for better visibility and documentability of options being + # passed through to other objects. Because YARD has parser and template architectures + # that are heavily reliant on options, it is necessary to make these option keys easily + # visible and understood by developers. Since the options class is more than just a + # basic Hash, the subclass can provide aliasing and convenience methods to simplify + # option property access, and, if needed, support backward-compatibility for deprecated + # key names. + # + # == Hash and OpenStruct-like Access + # + # Although the options class allows for Hash-like access (opts[:key]), the recommended + # mechanism for accessing an option key will be via standard method calls on attributes + # + # The options class can also act as an open ended key value storage structure (like a + # Hash or OpenStruct), and allows for setting and getting of unregistered option keys. + # This methodology is not recommended, however, and is only supported for backward + # compatibility inside YARD. Whenever possible, developers should define all keys used + # by an options class. + # + # == Declaring Default Values + # + # Note that the options class can contain default value definitions for certain options, + # but to initialize these defaults, {#reset_defaults} must be called manually after + # initialization; the options object is always created empty until defaults are applied. + # + # @abstract Subclasses should define (and document) custom attributes that are expected + # to be made available as option keys. + # @example Defining an Options class with custom option keys + # class TemplateOptions < YARD::Options + # # @return [Symbol] the output format to generate templates in + # attr_accessor :format + # + # # @return [Symbol] the template to use when generating output + # attr_accessor :template + # end + # @example Initializing default option values + # class TemplateOptions < YARD::Options + # def reset_defaults + # super + # self.format = :html + # self.template = :default + # self.highlight = true + # # ... + # end + # end + # @example Using +default_attr+ to create default attributes + # class TemplateOptions < YARD::Options + # default_attr :format, :html + # default_attr :template, :default + # default_attr :highlight, true + # end + # @example Deprecating an option while still supporting it + # class TemplateOptions < YARD::Options + # # @return [Boolean] if syntax highlighting should be performed on code blocks. + # # Defaults to true. + # attr_accessor :highlight + # + # # @deprecated Use {#highlight} instead. + # # @return [Boolean] if no syntax highlighting should be performs on code blocks. + # # Defaults to false. + # attr_accessor :no_highlight + # def no_highlight=(value) @highlight = !value end + # def no_highlight; !highlight end + # end + class Options + # @!macro [attach] yard.default_attr + # @!attribute $1 + # Defines an attribute named +key+ and sets a default value for it + # + # @example Defining a default option key + # default_attr :name, 'Default Name' + # default_attr :time, lambda { Time.now } + # @param [Symbol] key the option key name + # @param [Object, Proc] default the default object value. If the default + # value is a proc, it is executed upon initialization. + def self.default_attr(key, default) + (@defaults ||= {})[key] = default + attr_accessor(key) + end + + # Delegates calls with Hash syntax to actual method with key name + # + # @example Calling on an option key with Hash syntax + # options[:format] # equivalent to: options.format + # @param [Symbol, String] key the option name to access + # @return the value of the option named +key+ + def [](key) send(key) end + + # Delegates setter calls with Hash syntax to the attribute setter with the key name + # + # @example Setting an option with Hash syntax + # options[:format] = :html # equivalent to: options.format = :html + # @param [Symbol, String] key the optin to set + # @param [Object] value the value to set for the option + # @return [Object] the value being set + def []=(key, value) send("#{key}=", value) end + + # Updates values from an options hash or options object on this object. + # All keys passed should be key names defined by attributes on the class. + # + # @example Updating a set of options on an Options object + # opts.update(:template => :guide, :type => :fulldoc) + # @param [Hash, Options] opts + # @return [self] + def update(opts) + opts = opts.to_hash if Options === opts + opts.each do |key, value| + self[key] = value + end + self + end + + # Creates a new options object and sets options hash or object value + # onto that object. + # + # @param [Options, Hash] opts + # @return [Options] the newly created options object + # @see #update + def merge(opts) + dup.update(opts) + end + + # @return [Hash] Converts options object to an options hash. All keys + # will be symbolized. + def to_hash + opts = {} + instance_variables.each do |ivar| + name = ivar.to_s.sub(/^@/, '') + opts[name.to_sym] = send(name) + end + opts + end + + # Yields over every option key and value + # @yield [key, value] every option key and value + # @yieldparam [Symbol] key the option key + # @yieldparam [Object] value the option value + # @return [void] + def each + instance_variables.each do |ivar| + name = ivar.to_s.sub(/^@/, '') + yield(name.to_sym, send(name)) + end + end + + # Inspects the object + def inspect + "<#{self.class}: #{to_hash.inspect}>" + end + + # @return [Boolean] whether another Options object equals the + # keys and values of this options object + def ==(other) + case other + when Options; to_hash == other.to_hash + when Hash; to_hash == other + else false + end + end + + # Handles setting and accessing of unregistered keys similar + # to an OpenStruct object. + # + # @note It is not recommended to set and access unregistered keys on + # an Options object. Instead, register the attribute before using it. + def method_missing(meth, *args, &block) + if meth.to_s =~ /^(.+)=$/ + log.debug "Attempting to set unregistered key #{$1} on #{self.class}" + instance_variable_set("@#{$1}", args.first) + elsif args.empty? + log.debug "Attempting to access unregistered key #{meth} on #{self.class}" + instance_variable_defined?("@#{meth}") ? instance_variable_get("@#{meth}") : nil + else + super + end + end + + # Resets all values to their defaults. + # + # @abstract Subclasses should override this method to perform custom + # value initialization if not using {default_attr}. Be sure to call + # +super+ so that default initialization can take place. + # @return [void] + def reset_defaults + names_set = {} + self.class.ancestors.each do |klass| # look at all ancestors + defaults = + klass.instance_variable_defined?("@defaults") && + klass.instance_variable_get("@defaults") + next unless defaults + defaults.each do |key, value| + next if names_set[key] + names_set[key] = true + self[key] = Proc === value ? value.call : value + end + end + end + + # Deletes an option value for +key+ + # + # @param [Symbol, String] key the key to delete a value for + # @return [Object] the value that was deleted + def delete(key) + val = self[key] + if instance_variable_defined?("@#{key}") + remove_instance_variable("@#{key}") + end + val + end + + def tap; yield(self); self end unless defined?(tap) # only for 1.8.6 + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/parser/base.rb b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/parser/base.rb new file mode 100644 index 000000000..fdfe2e35f --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/parser/base.rb @@ -0,0 +1,57 @@ +# frozen_string_literal: true +module YARD + module Parser + # Represents the abstract base parser class that parses source code in + # a specific way. A parser should implement {#parse}, {#tokenize} and + # {#enumerator}. + # + # == Registering a Custom Parser + # To register a parser, see {SourceParser.register_parser_type} + # + # @abstract + # @see #parse + # @see #tokenize + # @see #enumerator + # @since 0.5.6 + class Base + # Convenience method to create a new parser and {#parse} + def self.parse(source, filename = nil) + new(source, filename).parse + end + + # This default constructor does nothing. The subclass is responsible for + # storing the source contents and filename if they are required. + # @param [String] source the source contents + # @param [String] filename the name of the file if from disk + def initialize(source, filename) # rubocop:disable Lint/UnusedMethodArgument + raise NotImplementedError, "invalid parser implementation" + end + + # This method should be implemented to parse the source and return itself. + # @abstract + # @return [Base] this method should return itself + def parse + raise NotImplementedError, "#{self.class} must implement #parse" + end + + # This method should be implemented to tokenize given source + # @abstract + # @return [Array] a list/tree of lexical tokens + def tokenize + raise NotImplementedError, "#{self.class} does not support tokenization" + end + + # This method should be implemented to return a list of semantic tokens + # representing the source code to be post-processed. Otherwise the method + # should return nil. + # + # @abstract + # @return [Array] a list of semantic tokens representing the source code + # to be post-processed + # @return [nil] if no post-processing should be done + def enumerator + nil + end + end + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/parser/c/c_parser.rb b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/parser/c/c_parser.rb new file mode 100644 index 000000000..8518d811e --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/parser/c/c_parser.rb @@ -0,0 +1,235 @@ +# frozen_string_literal: true +module YARD + module Parser + module C + class CParser < Base + def initialize(source, file = '(stdin)') + @file = file + @namespaces = {} + @content = source + @index = 0 + @line = 1 + @state = nil + @newline = true + @statements = [] + @last_comment = nil + @last_statement = nil + end + + def parse + parse_toplevel + enumerator + end + + def enumerator + @statements + end + + def tokenize + raise NotImplementedError, "no tokenization support for C/C++ files" + end + + private + + def parse_toplevel + advance_loop do + case char + when /['"]/; consume_quote(char) + when '#'; consume_directive + when '/'; consume_comment + when /\s/; consume_whitespace + when '}'; advance # Skip possible C++ namespace closing brackets. + else consume_toplevel_statement + end + end + end + + def consume_quote(type = '"') + advance + advance_loop do + case char + when "\n"; advance; nextline + when '\\'; advance(2) + when type; advance; return + else advance + end + end + end + + def consume_directive + return(advance) unless @newline + @last_comment = nil + @last_statement = nil + advance_loop do + if char == '\\' && nextchar =~ /[\r\n]/ + advance_loop { advance; break(nextline) if char == "\n" } + elsif char == "\n" + return + end + advance + end + end + + def consume_toplevel_statement + @newline = false + start = @index + line = @line + decl = consume_until(/[{;]/) + return nil if decl =~ /\A\s*\Z/ + # Skip C++ namespace - treat content as top level statement. + return nil if decl =~ /\A(namespace)/ + statement = ToplevelStatement.new(nil, @file, line) + @statements << statement + attach_comment(statement) + stmts = nil + if prevchar == '{' + stmts = consume_body_statements + if decl =~ /\A(typedef|enum|class|#{struct}|union)/ + consume_until(';') + end + end + statement.source = @content[start..@index] + statement.block = stmts + statement.declaration = decl # rubocop:disable Lint/UselessSetterCall + end + + def consume_body_statements + stmts = [] + brace_level = 1 + loop do + strip_non_statement_data + start = @index + line = @line + consume_until(/[{};]/) + brace_level += 1 if prevchar == '{' + brace_level -= 1 if prevchar == '}' + + break if prevchar.empty? || (brace_level <= 0 && prevchar == '}') + src = @content[start...@index] + next unless src && src !~ /\A\s*\Z|\A\}\Z/ + + stmt = BodyStatement.new(src, @file, line) + attach_comment(stmt) + stmts << stmt + end + stmts + end + + def strip_non_statement_data + start = @index + loop do + start = @index + case char + when /\s/; consume_whitespace + when '#'; consume_directive + when '/'; consume_comment + end + + break if start == @index + end + end + + def consume_whitespace + advance_loop { nextline if char == "\n"; break if char =~ /\S/; advance } + end + + def consume_comment(add_comment = true) + return(advance) unless nextchar == '*' || nextchar == '/' + line = @line + type = nextchar == '*' ? :multi : :line + advance(2) + comment = String.new("") + advance_loop do + comment << char + if type == :multi + nextline if char == "\n" + if char(2) == '*/' + if add_comment + comment << '/' + stmt = Comment.new(comment, @file, line) + stmt.type = type + attach_comment(stmt) + @statements << stmt + end + return advance(2) + end + elsif char == "\n" + if add_comment + stmt = Comment.new(comment[0...-1], @file, line) + stmt.type = type + attach_comment(stmt) + @statements << stmt + end + return + end + advance + end + end + + def consume_until(end_char, bracket_level = 0, brace_level = 0, add_comment = true) + end_char = /#{end_char}/ if end_char.is_a?(String) + start = @index + advance_loop do + chr = char + case chr + when /\s/; consume_whitespace + when /['"]/; consume_quote(char) + when '#'; consume_directive + when '/'; consume_comment(add_comment) + when '{'; advance; brace_level += 1 + when '}'; advance; brace_level -= 1 + when '('; advance; bracket_level += 1 + when ')'; advance; bracket_level -= 1 + else advance + end + @newline = false if chr !~ /\s/ + + if chr =~ end_char + break if chr == '{' || chr == '(' + break if bracket_level <= 0 && brace_level <= 0 + end + end + @content[start...@index] + end + + def attach_comment(statement) + if Comment === statement + if @last_statement && @last_statement.line == statement.line + @last_statement.comments = statement + statement.statement = @last_statement + end + @last_comment = statement + @last_statement = nil + else + if @last_comment + statement.comments = @last_comment + @last_comment.statement = statement + end + @last_statement = statement + @last_comment = nil + end + end + + def advance(num = 1) @index += num end + def back(num = 1) @index -= num end + + def advance_loop + yield while @index <= @content.size + end + + def nextline + @line += 1 + @newline = true + end + + def char(num = 1) @content[@index, num] end + def prevchar(num = 1) @content[@index - 1, num] end + def nextchar(num = 1) @content[@index + 1, num] end + + def struct + /struct\s[a-zA-Z0-9]+\s\{/ + end + end + end + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/parser/c/comment_parser.rb b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/parser/c/comment_parser.rb new file mode 100644 index 000000000..4d8c06710 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/parser/c/comment_parser.rb @@ -0,0 +1,134 @@ +# frozen_string_literal: true +module YARD + module Parser + module C + module CommentParser + protected + + def parse_comments(comments) + @overrides = [] + spaces = nil + comments = remove_private_comments(comments) + comments = comments.split(/\r?\n/).map do |line| + line.gsub!(%r{^\s*/?\*/?}, '') + line.gsub!(%r{\*/\s*$}, '') + if line =~ /^\s*$/ + next if spaces.nil? + next "" + end + spaces = (line[/^(\s+)/, 1] || "").size if spaces.nil? + line.gsub(/^\s{0,#{spaces}}/, '').rstrip + end.compact + + comments = parse_overrides(comments) + comments = parse_callseq(comments) + comments.join("\n") + end + + private + + def parse_overrides(comments) + comments.map do |line| + type, name = *line.scan(/^\s*Document-(class|module|method|attr|const):\s*(\S.*)\s*$/).first + if type + @overrides << [type.to_sym, name] + nil + else + line + end + end.compact + end + + def parse_callseq(comments) + return comments unless comments[0] =~ /\Acall-seq:\s*(\S.+)?/ + if $1 + comments[0] = " #{$1}" + else + comments.shift + end + overloads = [] + seen_data = false + while comments.first =~ /^\s+(\S.+)/ || comments.first =~ /^\s*$/ + line = comments.shift.strip + break if line.empty? && seen_data + next if line.empty? + seen_data = true + line.sub!(/^\w+[\.#]/, '') + signature, types = *line.split(/ [-=]> /) + types = parse_types(types) + if signature.sub!(/\[?\s*(\{(?:\s*\|(.+?)\|)?.*\})\s*\]?\s*$/, '') && $1 + blk = $1 + blkparams = $2 + else + blk = nil + blkparams = nil + end + case signature + when /^(\w+)\s*=\s+(\w+)/ + signature = "#{$1}=(#{$2})" + when /^\w+\s+\S/ + signature = signature.split(/\s+/) + signature = "#{signature[1]}#{signature[2] ? '(' + signature[2..-1].join(' ') + ')' : ''}" + when /^\w+\[(.+?)\]\s*(=)?/ + signature = "[]#{$2}(#{$1})" + when /^\w+\s+(#{CodeObjects::METHODMATCH})\s+(\w+)/ + signature = "#{$1}(#{$2})" + end + break unless signature =~ /^#{CodeObjects::METHODNAMEMATCH}/ + signature = signature.rstrip + overloads << "@overload #{signature}" + overloads << " @yield [#{blkparams}]" if blk + overloads << " @return [#{types.join(', ')}]" unless types.empty? + end + + comments + [""] + overloads + end + + def parse_types(types) + if types =~ /true or false/ + ["Boolean"] + else + (types || "").split(/,| or /).map do |t| + case t.strip.gsub(/^an?_/, '') + when "class"; "Class" + when "obj", "object", "anObject"; "Object" + when "arr", "array", "anArray", "ary", "new_ary", /^\[/; "Array" + when /^char\s*\*/, "char", "str", "string", "new_str"; "String" + when "enum", "anEnumerator"; "Enumerator" + when "exc", "exception"; "Exception" + when "proc", "proc_obj", "prc"; "Proc" + when "binding"; "Binding" + when "hsh", "hash", "aHash"; "Hash" + when "ios", "io"; "IO" + when "file"; "File" + when "float"; "Float" + when "time", "new_time"; "Time" + when "dir", "aDir"; "Dir" + when "regexp", "new_regexp"; "Regexp" + when "matchdata"; "MatchData" + when "encoding"; "Encoding" + when "fixnum", "fix"; "Fixnum" + when /^(?:un)?signed$/, /^(?:(?:un)?signed\s*)?(?:short|int|long|long\s+long)$/, "integer", "Integer"; "Integer" + when "num", "numeric", "Numeric", "number"; "Numeric" + when "aBignum"; "Bignum" + when "nil"; "nil" + when "true"; "true" + when "false"; "false" + when "bool", "boolean", "Boolean"; "Boolean" + when "self"; "self" + when /^[-+]?\d/; t + when /[A-Z][_a-z0-9]+/; t + end + end.compact + end + end + + def remove_private_comments(comment) + comment = comment.gsub(%r{/?\*--\n(.*?)/?\*\+\+}m, '') + comment = comment.sub(%r{/?\*--\n.*}m, '') + comment + end + end + end + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/parser/c/statement.rb b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/parser/c/statement.rb new file mode 100644 index 000000000..8ee3bc013 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/parser/c/statement.rb @@ -0,0 +1,66 @@ +# frozen_string_literal: true +module YARD + module Parser + module C + class Statement + attr_accessor :source + attr_accessor :line + attr_accessor :file + + # @deprecated Groups are now defined by directives + # @see Tags::GroupDirective + attr_accessor :group + + attr_accessor :comments_hash_flag + + def initialize(source, file = nil, line = nil) + @source = source + @file = file + @line = line + end + + def line_range + line...(line + source.count("\n")) + end + + def comments_range + comments.line_range + end + + def first_line + source.split(/\n/).first + end + + alias signature first_line + + def show + "\t#{line}: #{first_line}" + end + end + + class BodyStatement < Statement + attr_accessor :comments + end + + class ToplevelStatement < Statement + attr_accessor :block + attr_accessor :declaration + attr_accessor :comments + end + + class Comment < Statement + include CommentParser + + attr_accessor :type + attr_accessor :overrides + attr_accessor :statement + + def initialize(source, file = nil, line = nil) + super(parse_comments(source), file, line) + end + + def comments; self end + end + end + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/parser/ruby/ast_node.rb b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/parser/ruby/ast_node.rb new file mode 100644 index 000000000..0d19e115d --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/parser/ruby/ast_node.rb @@ -0,0 +1,551 @@ +# frozen_string_literal: true +module YARD + module Parser + module Ruby + # Builds and s-expression by creating {AstNode} objects with + # the type provided by the first argument. + # + # @example An implicit list of keywords + # ast = s(s(:kw, "if"), s(:kw, "else")) + # ast.type # => :list + # @example A method call + # s(:command, s(:var_ref, "mymethod")) + # + # @overload s(*nodes, opts = {}) + # @param [Array] nodes a list of nodes. + # @param [Hash] opts any extra options (docstring, file, source) to + # set on the object + # @return [AstNode] an implicit node where node.type == +:list+ + # @overload s(type, *children, opts = {}) + # @param [Symbol] type the node type + # @param [Array] children any child nodes inside this one + # @param [Hash] opts any extra options to set on the object + # @return [AstNode] a node of type +type+. + # @see AstNode#initialize + def s(*args) + type = Symbol === args.first ? args.shift : :list + opts = Hash === args.last ? args.pop : {} + AstNode.node_class_for(type).new(type, args, opts) + end + + # An AST node is characterized by a type and a list of children. It + # is most easily represented by the s-expression {#s} such as: + # # AST for "if true; 5 end": + # s(s(:if, s(:var_ref, s(:kw, "true")), s(s(:int, "5")), nil)) + # + # The node type is not considered part of the list, only its children. + # So +ast[0]+ does not refer to the type, but rather the first child + # (or object). Items that are not +AstNode+ objects can be part of the + # list, like Strings or Symbols representing names. To return only + # the AstNode children of the node, use {#children}. + class AstNode < Array + attr_accessor :docstring_hash_flag + attr_accessor :docstring, :docstring_range, :source + + # @deprecated Groups are now defined by directives + # @see Tags::GroupDirective + attr_accessor :group + + attr_writer :source_range, :line_range, :file, :full_source + alias comments docstring + alias comments_range docstring_range + alias comments_hash_flag docstring_hash_flag + alias to_s source + + # @return [Symbol] the node's unique symbolic type + attr_accessor :type + + # @return [AstNode, nil] the node's parent or nil if it is a root node. + attr_accessor :parent + + # @return [Range] the character range in {#full_source} represented + # by the node + def source_range + reset_line_info unless @source_range + @source_range + end + + # @return [Range] the line range in {#full_source} represented + # by the node + def line_range + reset_line_info unless @line_range + @line_range + end + + # @return [String] the filename the node was parsed from + def file + return parent.file if parent + @file + end + + # @return [String] the full source that the node was parsed from + def full_source + return parent.full_source if parent + return @full_source if @full_source + return IO.read(@file) if file && File.exist?(file) + end + + # @return [String] the parse of {#full_source} that the node represents + def source + return parent.full_source[source_range] if parent + full_source + end + + # List of all known keywords + # @return [Hash] + KEYWORDS = {:class => true, :alias => true, :lambda => true, :do_block => true, + :def => true, :defs => true, :begin => true, :rescue => true, :rescue_mod => true, + :if => true, :if_mod => true, :else => true, :elsif => true, :case => true, + :when => true, :next => true, :break => true, :retry => true, :redo => true, + :return => true, :throw => true, :catch => true, :until => true, :until_mod => true, + :while => true, :while_mod => true, :yield => true, :yield0 => true, :zsuper => true, + :unless => true, :unless_mod => true, :for => true, :super => true, :return0 => true} + + # @group Creating an AstNode + + # Finds the node subclass that should be instantiated for a specific + # node type + # + # @param [Symbol] type the node type to find a subclass for + # @return [Class] a subclass of AstNode to instantiate the node with. + def self.node_class_for(type) + case type + when :params + ParameterNode + when :call, :fcall, :vcall, :command, :command_call + MethodCallNode + when :if, :elsif, :if_mod, :unless, :unless_mod + ConditionalNode + when :for, :while, :while_mod, :until, :until_mod + LoopNode + when :def, :defs + MethodDefinitionNode + when :class, :sclass + ClassNode + when :module + ModuleNode + else + if type.to_s =~ /_ref\Z/ + ReferenceNode + elsif type.to_s =~ /_literal\Z/ + LiteralNode + elsif KEYWORDS.key?(type) + KeywordNode + else + AstNode + end + end + end + + # Creates a new AST node + # + # @param [Symbol] type the type of node being created + # @param [Array] arr the child nodes + # @param [Hash] opts any extra line options + # @option opts [Fixnum] :line (nil) the line the node starts on in source + # @option opts [String] :char (nil) the character number the node starts on + # in source + # @option opts [Fixnum] :listline (nil) a special key like :line but for + # list nodes + # @option opts [Fixnum] :listchar (nil) a special key like :char but for + # list nodes + # @option opts [Boolean] :token (nil) whether the node represents a token + def initialize(type, arr, opts = {}) + super(arr) + self.type = type + self.line_range = opts[:line] + self.source_range = opts[:char] + @fallback_line = opts[:listline] + @fallback_source = opts[:listchar] + @token = true if opts[:token] + @docstring = nil + end + + # @return [Boolean] whether the node is equal to another by checking + # the list and type + # @private + def ==(other) + super && type == other.type + end + + # @group Traversing a Node + + # Searches through the node and all descendants and returns the + # first node with a type matching any of +node_types+, otherwise + # returns the original node (self). + # + # @example Returns the first method definition in a block of code + # ast = YARD.parse_string("if true; def x; end end").ast + # ast.jump(:def) + # # => s(:def, s(:ident, "x"), s(:params, nil, nil, nil, nil, + # # nil), s(s(:void_stmt, ))) + # @example Returns first 'def' or 'class' statement + # ast = YARD.parse_string("class X; def y; end end") + # ast.jump(:def, :class).first + # # => + # @example If the node types are not present in the AST + # ast = YARD.parse("def x; end") + # ast.jump(:def) + # + # @param [Array] node_types a set of node types to match + # @return [AstNode] the matching node, if one was found + # @return [self] if no node was found + def jump(*node_types) + traverse {|child| return(child) if node_types.include?(child.type) } + self + end + + # @return [Array] the {AstNode} children inside the node + def children + @children ||= select {|e| AstNode === e } + end + + # Traverses the object and yields each node (including descendants) in order. + # + # @yield each descendant node in order + # @yieldparam [AstNode] self, or a child/descendant node + # @return [void] + def traverse + nodes = [self] + until nodes.empty? + node = nodes.pop + yield node + nodes += node.children.reverse unless node.children.empty? + end + end + + # @group Node Meta Types + + # @return [Boolean] whether the node is a token + def token? + @token + end + + # @return [Boolean] whether the node is a reference (variable, + # constant name) + def ref? + false + end + + # @return [Boolean] whether the node is a literal value + def literal? + false + end + + # @return [Boolean] whether the node is a keyword + def kw? + false + end + + # @return [Boolean] whether the node is a method call + def call? + false + end + + # @return [Boolean] whether the node is a method definition + def def? + false + end + + # @return [Boolean] whether the node is a if/elsif/else condition + def condition? + false + end + + # @return [Boolean] whether the node is a loop + def loop? + false + end + + # @return [Boolean] whether the node has a block + def block? + respond_to?(:block) || condition? + end + + # @group Getting Line Information + + # @return [Boolean] whether the node has a {#line_range} set + def has_line? + @line_range ? true : false + end + + # @return [Fixnum] the starting line number of the node + def line + line_range && line_range.first + end + + # @return [String] the first line of source represented by the node. + def first_line + full_source.split(/\r?\n/)[line - 1].strip + end + + # @group Printing a Node + + # @return [String] the first line of source the node represents + def show + "\t#{line}: #{first_line}" + end + + # @return [nil] pretty prints the node + def pretty_print(q) + objs = dup + [:__last__] + objs.unshift(type) if type && type != :list + + options = [] + options << ['docstring', docstring] if @docstring + if @source_range || @line_range + options << ['line', line_range] + options << ['source', source_range] + end + objs.pop if options.empty? + + q.group(3, 's(', ')') do + q.seplist(objs, nil, :each) do |v| + if v == :__last__ + q.seplist(options, nil, :each) do |arr| + k, v2 = *arr + q.group(3) do + q.text k + q.group(3) do + q.text ': ' + q.pp v2 + end + end + end + else + q.pp v + end + end + end + end + + # @return [String] inspects the object + def inspect + typeinfo = type && type != :list ? ':' + type.to_s + ', ' : '' + 's(' + typeinfo + map(&:inspect).join(", ") + ')' + end + + # @group Managing node state + + # Resets node state in tree + def unfreeze + @children = nil + end + + # @endgroup + + private + + # Resets line information + # @return [void] + def reset_line_info + if size == 0 + self.line_range = @fallback_line + self.source_range = @fallback_source + elsif !children.empty? + f = children.first + l = children.last + self.line_range = Range.new(f.line_range.first, l.line_range.last) + self.source_range = Range.new(f.source_range.first, l.source_range.last) + elsif @fallback_line || @fallback_source + self.line_range = @fallback_line + self.source_range = @fallback_source + else + self.line_range = 0...0 + self.source_range = 0...0 + end + end + end + + class ReferenceNode < AstNode + def ref?; true end + + def path + Array.new flatten + end + + def namespace + Array.new flatten[0...-1] + end + end + + class LiteralNode < AstNode + def literal?; true end + end + + class KeywordNode < AstNode + def kw?; true end + end + + class ParameterNode < AstNode + def unnamed_required_params + self[0] + end + + def unnamed_optional_params + return @unnamed_optional_params if defined?(@unnamed_optional_params) + + params = self[1] || [] + if self[-3] && self[-3][0] && self[-3][0].type == :unnamed_optional_arg + params += self[-3] + end + + @unnamed_optional_params = params.empty? ? nil : params + end + + def named_params + return @named_params if defined?(@named_params) + + if YARD.ruby2? && self[-3] && self[-3][0] && self[-3][0].type == :named_arg + @named_params = self[-3] + else + @named_params = nil + end + end + + def splat_param + self[2] ? self[2][0] : nil + end + + def unnamed_end_params + self[3] + end + + def double_splat_param + return nil unless YARD.ruby2? + if (node = self[-2]).is_a?(AstNode) + if node.type == :ident + node + elsif node.type == :kwrest_param + # See https://bugs.ruby-lang.org/issues/12387 + node.last + end + end + end + + def block_param + self[-1] ? self[-1][0] : nil + end + end + + class MethodCallNode < AstNode + def call?; true end + def namespace; first if index_adjust > 0 end + + def method_name(name_only = false) + name = self[index_adjust] + if name == :call + nil + elsif name_only && Array === name + name.jump(:ident).first.to_sym + else + name + end + end + + def parameters(include_block_param = true) + return [] if type == :vcall + params = self[1 + index_adjust] + return [] unless params + params = call_has_paren? ? params.first : params + return [] unless params + include_block_param ? params : params[0...-1] + end + + def block_param; parameters.last end + + def block + last.type == :do_block || last.type == :brace_block ? last : nil + end + + private + + def index_adjust + [:call, :command_call].include?(type) ? 2 : 0 + end + + def call_has_paren? + [:fcall, :call].include?(type) + end + end + + class MethodDefinitionNode < AstNode + def kw?; true end + def def?; true end + def namespace; first if index_adjust > 0 end + + def method_name(name_only = false) + name = self[index_adjust] + name_only ? name.jump(:ident).first.to_sym : name + end + + def parameters(include_block_param = true) + return unless params = self[1 + index_adjust] + params = params[0] if params.type == :paren + include_block_param ? params : params[0...-1] + end + + def signature + params_src = '' + params = self[1 + index_adjust] + if params and params.first + params_src = params.type == :paren ? '' : ' ' + params_src += params.source.gsub(/\s+(\s|\))/m, '\1') + end + + "def #{method_name(true)}#{params_src}" + end + + alias block last + + private + + def index_adjust + type == :defs ? 2 : 0 + end + end + + class ConditionalNode < KeywordNode + def condition?; true end + def condition; first end + def then_block; self[1] end + + def else_block + return unless self[2] && !cmod? + self[2].type == :elsif ? self[2] : self[2][0] + end + + private + + def cmod?; type =~ /_mod$/ end + end + + class ClassNode < KeywordNode + def class_name; first end + def superclass; type == :sclass ? nil : self[1] end + def block; last end + end + + class ModuleNode < KeywordNode + def module_name; first end + def block; last end + end + + class LoopNode < KeywordNode + def loop?; true end + def condition; type == :for ? s(self[0], self[1]) : first end + def block; last end + end + + # Represents a lone comment block in source + class CommentNode < AstNode + def docstring; first end + def docstring=(value) end + alias comments docstring + + def source; "" end + def first_line; "" end + end + end + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/parser/ruby/legacy/irb/slex.rb b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/parser/ruby/legacy/irb/slex.rb new file mode 100644 index 000000000..721ebd9ea --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/parser/ruby/legacy/irb/slex.rb @@ -0,0 +1,276 @@ +# frozen_string_literal: false +# +# irb/slex.rb - simple lex analyzer +# $Release Version: 0.9.6$ +# $Revision$ +# by Keiju ISHITSUKA(keiju@ruby-lang.org) +# +# -- +# +# +# + +require "irb/notifier" + +# @private +module IRB + class SLex + DOUT = Notifier::def_notifier("SLex::") + D_WARN = DOUT::def_notifier(1, "Warn: ") + D_DEBUG = DOUT::def_notifier(2, "Debug: ") + D_DETAIL = DOUT::def_notifier(4, "Detail: ") + + DOUT.level = Notifier::D_NOMSG + + def initialize + @head = Node.new("") + end + + def def_rule(token, preproc = nil, postproc = nil, &block) + D_DETAIL.pp token + + postproc = block if block_given? + create(token, preproc, postproc) + end + + def def_rules(*tokens, &block) + if block_given? + p = block + end + for token in tokens + def_rule(token, nil, p) + end + end + + def preproc(token, proc) + node = search(token) + node.preproc=proc + end + + # need a check? + def postproc(token) + node = search(token, proc) + node.postproc=proc + end + + def search(token) + @head.search(token.split(//)) + end + + def create(token, preproc = nil, postproc = nil) + @head.create_subnode(token.split(//), preproc, postproc) + end + + def match(token) + case token + when Array + when String + return match(token.split(//)) + else + return @head.match_io(token) + end + ret = @head.match(token) + D_DETAIL.exec_if{D_DETAIL.printf "match end: %s:%s\n", ret, token.inspect} + ret + end + + def inspect + format("", @head.inspect) + end + + #---------------------------------------------------------------------- + # + # class Node - + # + #---------------------------------------------------------------------- + class Node + # if postproc is nil, this node is an abstract node. + # if postproc is non-nil, this node is a real node. + def initialize(preproc = nil, postproc = nil) + @Tree = {} + @preproc = preproc + @postproc = postproc + end + + attr_accessor :preproc + attr_accessor :postproc + + def search(chrs, opt = nil) + return self if chrs.empty? + ch = chrs.shift + if node = @Tree[ch] + node.search(chrs, opt) + else + if opt + chrs.unshift ch + self.create_subnode(chrs) + else + raise "node nothing" + end + end + end + + def create_subnode(chrs, preproc = nil, postproc = nil) + if chrs.empty? + if @postproc + D_DETAIL.pp node + raise "node already exists" + else + D_DEBUG.puts "change abstract node to real node." + @preproc = preproc + @postproc = postproc + end + return self + end + + ch = chrs.shift + if node = @Tree[ch] + if chrs.empty? + if node.postproc + DebugLogger.pp node + DebugLogger.pp self + DebugLogger.pp ch + DebugLogger.pp chrs + raise "node already exists" + else + D_WARN.puts "change abstract node to real node" + node.preproc = preproc + node.postproc = postproc + end + else + node.create_subnode(chrs, preproc, postproc) + end + else + if chrs.empty? + node = Node.new(preproc, postproc) + else + node = Node.new + node.create_subnode(chrs, preproc, postproc) + end + @Tree[ch] = node + end + node + end + + # + # chrs: String + # character array + # io must have getc()/ungetc(); and ungetc() must be + # able to be called arbitrary number of times. + # + def match(chrs, op = "") + D_DETAIL.print "match>: ", chrs, "op:", op, "\n" + if chrs.empty? + if @preproc.nil? || @preproc.call(op, chrs) + DOUT.printf(D_DETAIL, "op1: %s\n", op) + @postproc.call(op, chrs) + else + nil + end + else + ch = chrs.shift + if node = @Tree[ch] + if ret = node.match(chrs, op+ch) + return ret + else + chrs.unshift ch + if @postproc and @preproc.nil? || @preproc.call(op, chrs) + DOUT.printf(D_DETAIL, "op2: %s\n", op.inspect) + ret = @postproc.call(op, chrs) + return ret + else + return nil + end + end + else + chrs.unshift ch + if @postproc and @preproc.nil? || @preproc.call(op, chrs) + DOUT.printf(D_DETAIL, "op3: %s\n", op) + @postproc.call(op, chrs) + return "" + else + return nil + end + end + end + end + + def match_io(io, op = "") + if op == "" + ch = io.getc + if ch == nil + return nil + end + else + ch = io.getc_of_rests + end + if ch.nil? + if @preproc.nil? || @preproc.call(op, io) + D_DETAIL.printf("op1: %s\n", op) + @postproc.call(op, io) + else + nil + end + else + if node = @Tree[ch] + if ret = node.match_io(io, op+ch) + ret + else + io.ungetc ch + if @postproc and @preproc.nil? || @preproc.call(op, io) + DOUT.exec_if{D_DETAIL.printf "op2: %s\n", op.inspect} + @postproc.call(op, io) + else + nil + end + end + else + io.ungetc ch + if @postproc and @preproc.nil? || @preproc.call(op, io) + D_DETAIL.printf("op3: %s\n", op) + @postproc.call(op, io) + else + nil + end + end + end + end + end + end +end +# :startdoc: + +if $0 == __FILE__ + case $1 + when "1" + tr = SLex.new + print "0: ", tr.inspect, "\n" + tr.def_rule("=") {print "=\n"} + print "1: ", tr.inspect, "\n" + tr.def_rule("==") {print "==\n"} + print "2: ", tr.inspect, "\n" + + print "case 1:\n" + print tr.match("="), "\n" + print "case 2:\n" + print tr.match("=="), "\n" + print "case 3:\n" + print tr.match("=>"), "\n" + + when "2" + tr = SLex.new + print "0: ", tr.inspect, "\n" + tr.def_rule("=") {print "=\n"} + print "1: ", tr.inspect, "\n" + tr.def_rule("==", proc{false}) {print "==\n"} + print "2: ", tr.inspect, "\n" + + print "case 1:\n" + print tr.match("="), "\n" + print "case 2:\n" + print tr.match("=="), "\n" + print "case 3:\n" + print tr.match("=>"), "\n" + end + exit +end diff --git a/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/parser/ruby/legacy/ruby_lex.rb b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/parser/ruby/legacy/ruby_lex.rb new file mode 100644 index 000000000..0a843d0f5 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/parser/ruby/legacy/ruby_lex.rb @@ -0,0 +1,1345 @@ +require_relative 'irb/slex' + +module YARD + module Parser::Ruby::Legacy + # Legacy lexical tokenizer module. + module RubyToken + EXPR_BEG = :EXPR_BEG + EXPR_MID = :EXPR_MID + EXPR_END = :EXPR_END + EXPR_ARG = :EXPR_ARG + EXPR_FNAME = :EXPR_FNAME + EXPR_DOT = :EXPR_DOT + EXPR_CLASS = :EXPR_CLASS + + # Represents a token in the Ruby lexer + class Token + # @return [Integer] the line number in the file/stream the token is + # located. + attr_reader :line_no + + # @return [Integer] the character number in the file/stream the token + # is located. + attr_reader :char_no + + # @return [String] the token text value + attr_reader :text + + # @return [Symbol] the lexical state at the token + attr_accessor :lex_state + + # @private + NO_TEXT = "??".freeze + + # Creates a new Token object + # @param [Integer] line_no the line number to initialize the token to + # @param [Integer] char_no the char number to initialize the token to + def initialize(line_no, char_no) + @line_no = line_no + @char_no = char_no + @text = NO_TEXT + end + + # Chainable way to sets the text attribute + # + # @param [String] text the new text + # @return [Token] this token object + def set_text(text) + @text = text + self + end + end + + # Represents a block + class TkBlockContents < Token + def text; '...' end + end + + # Represents an end statement + class TkStatementEnd < Token + def text; '' end + end + + class TkNode < Token + attr :node + end + + # Represents whitespace + class TkWhitespace < Token + end + + # Represents a Ruby identifier + class TkId < Token + def initialize(line_no, char_no, name) + super(line_no, char_no) + @name = name + end + attr :name + end + + # Represents a Ruby keyword + class TkKW < TkId + end + + # Represents a Ruby value + class TkVal < Token + def initialize(line_no, char_no, value = nil) + super(line_no, char_no) + set_text(value) + end + end + + class TkOp < Token + def name + self.class.op_name + end + end + + class TkOPASGN < TkOp + def initialize(line_no, char_no, op) + super(line_no, char_no) + op = TkReading2Token[op] unless op.is_a?(Symbol) + @op = op + end + attr :op + end + + class TkUnknownChar < Token + def initialize(line_no, char_no, _id) + super(line_no, char_no) + @name = char_no > 255 ? '?' : char_no.chr + end + attr :name + end + + class TkError < Token + end + + # @private + def set_token_position(line, char) + @prev_line_no = line + @prev_char_no = char + end + + # @private + def Token(token, value = nil) # rubocop:disable Style/MethodName + tk = nil + case token + when String, Symbol + source = token.is_a?(String) ? TkReading2Token : TkSymbol2Token + if (tk = source[token]).nil? + raise "no key #{token}" + end + tk = Token(tk[0], value) + else + if token + tk = if (token.ancestors & [TkId, TkVal, TkOPASGN, TkUnknownChar]).empty? + token.new(@prev_line_no, @prev_char_no) + else + token.new(@prev_line_no, @prev_char_no, value) + end + end + end + tk + end + + # @private + TokenDefinitions = [ + [:TkCLASS, TkKW, "class", EXPR_CLASS], + [:TkMODULE, TkKW, "module", EXPR_BEG], + [:TkDEF, TkKW, "def", EXPR_FNAME], + [:TkUNDEF, TkKW, "undef", EXPR_FNAME], + [:TkBEGIN, TkKW, "begin", EXPR_BEG], + [:TkRESCUE, TkKW, "rescue", EXPR_MID], + [:TkENSURE, TkKW, "ensure", EXPR_BEG], + [:TkEND, TkKW, "end", EXPR_END], + [:TkIF, TkKW, "if", EXPR_BEG, :TkIF_MOD], + [:TkUNLESS, TkKW, "unless", EXPR_BEG, :TkUNLESS_MOD], + [:TkTHEN, TkKW, "then", EXPR_BEG], + [:TkELSIF, TkKW, "elsif", EXPR_BEG], + [:TkELSE, TkKW, "else", EXPR_BEG], + [:TkCASE, TkKW, "case", EXPR_BEG], + [:TkWHEN, TkKW, "when", EXPR_BEG], + [:TkWHILE, TkKW, "while", EXPR_BEG, :TkWHILE_MOD], + [:TkUNTIL, TkKW, "until", EXPR_BEG, :TkUNTIL_MOD], + [:TkFOR, TkKW, "for", EXPR_BEG], + [:TkBREAK, TkKW, "break", EXPR_END], + [:TkNEXT, TkKW, "next", EXPR_END], + [:TkREDO, TkKW, "redo", EXPR_END], + [:TkRETRY, TkKW, "retry", EXPR_END], + [:TkIN, TkKW, "in", EXPR_BEG], + [:TkDO, TkKW, "do", EXPR_BEG], + [:TkRETURN, TkKW, "return", EXPR_MID], + [:TkYIELD, TkKW, "yield", EXPR_END], + [:TkSUPER, TkKW, "super", EXPR_END], + [:TkSELF, TkKW, "self", EXPR_END], + [:TkNIL, TkKW, "nil", EXPR_END], + [:TkTRUE, TkKW, "true", EXPR_END], + [:TkFALSE, TkKW, "false", EXPR_END], + [:TkAND, TkKW, "and", EXPR_BEG], + [:TkOR, TkKW, "or", EXPR_BEG], + [:TkNOT, TkKW, "not", EXPR_BEG], + [:TkIF_MOD, TkKW], + [:TkUNLESS_MOD, TkKW], + [:TkWHILE_MOD, TkKW], + [:TkUNTIL_MOD, TkKW], + [:TkALIAS, TkKW, "alias", EXPR_FNAME], + [:TkDEFINED, TkKW, "defined?", EXPR_END], + [:TklBEGIN, TkKW, "BEGIN", EXPR_END], + [:TklEND, TkKW, "END", EXPR_END], + [:Tk__LINE__, TkKW, "__LINE__", EXPR_END], + [:Tk__FILE__, TkKW, "__FILE__", EXPR_END], + [:TkIDENTIFIER, TkId], + [:TkFID, TkId], + [:TkGVAR, TkId], + [:TkIVAR, TkId], + [:TkCONSTANT, TkId], + [:TkINTEGER, TkVal], + [:TkFLOAT, TkVal], + [:TkSYMBOL, TkVal], + [:TkLABEL, TkVal], + [:TkSTRING, TkVal], + [:TkXSTRING, TkVal], + [:TkREGEXP, TkVal], + [:TkCOMMENT, TkVal], + [:TkDSTRING, TkNode], + [:TkDXSTRING, TkNode], + [:TkDREGEXP, TkNode], + [:TkNTH_REF, TkId], + [:TkBACK_REF, TkId], + [:TkUPLUS, TkOp, "+@"], + [:TkUMINUS, TkOp, "-@"], + [:TkPOW, TkOp, "**"], + [:TkCMP, TkOp, "<=>"], + [:TkEQ, TkOp, "=="], + [:TkEQQ, TkOp, "==="], + [:TkNEQ, TkOp, "!="], + [:TkGEQ, TkOp, ">="], + [:TkLEQ, TkOp, "<="], + [:TkANDOP, TkOp, "&&"], + [:TkOROP, TkOp, "||"], + [:TkMATCH, TkOp, "=~"], + [:TkNMATCH, TkOp, "!~"], + [:TkDOT2, TkOp, ".."], + [:TkDOT3, TkOp, "..."], + [:TkAREF, TkOp, "[]"], + [:TkASET, TkOp, "[]="], + [:TkLSHFT, TkOp, "<<"], + [:TkRSHFT, TkOp, ">>"], + [:TkCOLON2, TkOp], + [:TkCOLON3, TkOp], + [:OPASGN, TkOp], # +=, -= etc. # + [:TkASSOC, TkOp, "=>"], + [:TkQUESTION, TkOp, "?"], #? + [:TkCOLON, TkOp, ":"], #: + [:TkSTAR], # *arg + [:TkAMPER], # &arg # + [:TkSYMBEG, TkId], + [:TkGT, TkOp, ">"], + [:TkLT, TkOp, "<"], + [:TkPLUS, TkOp, "+"], + [:TkMINUS, TkOp, "-"], + [:TkMULT, TkOp, "*"], + [:TkDIV, TkOp, "/"], + [:TkMOD, TkOp, "%"], + [:TkBITOR, TkOp, "|"], + [:TkBITXOR, TkOp, "^"], + [:TkBITAND, TkOp, "&"], + [:TkBITNOT, TkOp, "~"], + [:TkNOTOP, TkOp, "!"], + [:TkBACKQUOTE, TkOp, "`"], + [:TkASSIGN, Token, "="], + [:TkDOT, Token, "."], + [:TkLPAREN, Token, "("], # (exp) + [:TkLBRACK, Token, "["], # [arry] + [:TkLBRACE, Token, "{"], # {hash} + [:TkRPAREN, Token, ")"], + [:TkRBRACK, Token, "]"], + [:TkRBRACE, Token, "}"], + [:TkCOMMA, Token, ","], + [:TkSEMICOLON, Token, ";"], + [:TkSPACE, TkWhitespace], + [:TkNL, TkWhitespace], + [:TkEND_OF_SCRIPT, TkWhitespace], + [:TkBACKSLASH, TkUnknownChar, "\\"], + [:TkAT, TkUnknownChar, "@"], + [:TkDOLLAR, TkUnknownChar, "\$"] + ] + + # { reading => token_class } + # { reading => [token_class, *opt] } + TkReading2Token = {} + TkSymbol2Token = {} + + # @private + def self.def_token(token_n, super_token = Token, reading = nil, *opts) + token_n = token_n.id2name unless token_n.is_a?(String) + if RubyToken.const_defined?(token_n) + # IRB.fail AlreadyDefinedToken, token_n + end + + token_c = Class.new super_token + RubyToken.const_set token_n, token_c + # token_c.inspect + + if reading + if TkReading2Token[reading] + raise "duplicate #{token_n} #{reading}" + end + if opts.empty? + TkReading2Token[reading] = [token_c] + else + TkReading2Token[reading] = [token_c].concat(opts) + end + end + TkSymbol2Token[token_n.intern] = token_c + + if token_c <= TkOp + token_c.class_eval %{ + def self.op_name; "#{reading}"; end + } + end + end + + for defs in TokenDefinitions + def_token(*defs) + end + + NEWLINE_TOKEN = TkNL.new(0, 0) + NEWLINE_TOKEN.set_text("\n") + end + + # Lexical analyzer for Ruby source + # @private + class RubyLex + # Read an input stream character by character. We allow for unlimited + # ungetting of characters just read. + # + # We simplify the implementation greatly by reading the entire input + # into a buffer initially, and then simply traversing it using + # pointers. + # + # We also have to allow for the here document diversion. This + # little gem comes about when the lexer encounters a here + # document. At this point we effectively need to split the input + # stream into two parts: one to read the body of the here document, + # the other to read the rest of the input line where the here + # document was initially encountered. For example, we might have + # + # do_something(<<-A, <<-B) + # stuff + # for + # A + # stuff + # for + # B + # + # When the lexer encounters the <= @size + ch = @content[@offset, 1] + + @offset += 1 + @hwm = @offset if @hwm < @offset + + if @newline_pending + @line_num += 1 + @last_newline = @offset - 1 + @newline_pending = false + end + + if ch == "\n" + @newline_pending = true + end + ch + end + + def getc_already_read + getc + end + + def ungetc(_ch) + raise "unget past beginning of file" if @offset <= 0 + @offset -= 1 + if @content[@offset] == ?\n + @newline_pending = false + end + end + + def get_read + res = @content[@read_back_offset...@offset] + @read_back_offset = @offset + res + end + + def peek(at) + pos = @offset + at + if pos >= @size + nil + else + @content[pos, 1] + end + end + + def peek_equal(str) + @content[@offset, str.length] == str + end + + def divert_read_from(reserve) + @content[@offset, 0] = reserve + @size = @content.size + end + end + + # end of nested class BufferedReader + + include RubyToken + include IRB + + attr_reader :continue + attr_reader :lex_state + + def self.debug? + false + end + + def initialize(content) + lex_init + + @reader = BufferedReader.new(content) + + @exp_line_no = @line_no = 1 + @base_char_no = 0 + @indent = 0 + + @ltype = nil + @quoted = nil + @lex_state = EXPR_BEG + @space_seen = false + + @continue = false + @line = "" + + @skip_space = false + @read_auto_clean_up = false + @exception_on_syntax_error = true + + @colonblock_seen = false + end + + attr_accessor :skip_space + attr_accessor :read_auto_clean_up + attr_accessor :exception_on_syntax_error + + attr :indent + + # io functions + def line_no + @reader.line_num + end + + def char_no + @reader.column + end + + def get_read + @reader.get_read + end + + def getc + @reader.getc + end + + def getc_of_rests + @reader.getc_already_read + end + + def gets + (c = getc) || return + l = "" + begin + l.concat c unless c == "\r" + break if c == "\n" + end while c = getc # rubocop:disable Lint/Loop + l + end + + def ungetc(c = nil) + @reader.ungetc(c) + end + + def peek_equal?(str) + @reader.peek_equal(str) + end + + def peek(i = 0) + @reader.peek(i) + end + + def lex + catch(:eof) do + until ((tk = token).is_a?(TkNL) || tk.is_a?(TkEND_OF_SCRIPT)) && + !@continue || + tk.nil? + end + line = get_read + + if line == "" && tk.is_a?(TkEND_OF_SCRIPT) || tk.nil? + nil + else + line + end + end + end + + def token + set_token_position(line_no, char_no) + catch(:eof) do + begin + begin + tk = @OP.match(self) + @space_seen = tk.is_a?(TkSPACE) + rescue SyntaxError + abort if @exception_on_syntax_error + tk = TkError.new(line_no, char_no) + end + end while @skip_space && tk.is_a?(TkSPACE) + if @read_auto_clean_up + get_read + end + # throw :eof unless tk + p tk if $DEBUG + tk.lex_state = lex_state if tk + tk + end + end + + ENINDENT_CLAUSE = [ + "case", "class", "def", "do", "for", "if", + "module", "unless", "until", "while", "begin" + ] #, "when" + ACCEPTS_COLON = ["if", "for", "unless", "until", "while"] + DEINDENT_CLAUSE = ["end"] #, "when" + + PERCENT_LTYPE = { + "q" => "\'", + "Q" => "\"", + "x" => "\`", + "r" => "/", + "w" => "]", + "W" => "]" + } + + PERCENT_PAREN = { + "{" => "}", + "[" => "]", + "<" => ">", + "(" => ")" + } + + Ltype2Token = { + "\'" => TkSTRING, + "\"" => TkSTRING, + "\`" => TkXSTRING, + "/" => TkREGEXP, + "]" => TkDSTRING + } + Ltype2Token.default = TkSTRING + + DLtype2Token = { + "\"" => TkDSTRING, + "\`" => TkDXSTRING, + "/" => TkDREGEXP + } + + def lex_init() + @OP = SLex.new + @OP.def_rules("\0", "\004", "\032") do |chars, _io| + Token(TkEND_OF_SCRIPT).set_text(chars) + end + + @OP.def_rules(" ", "\t", "\f", "\r", "\13") do |chars, _io| + @space_seen = true + while (ch = getc) =~ /[ \t\f\r\13]/ + chars << ch + end + ungetc + Token(TkSPACE).set_text(chars) + end + + @OP.def_rule("#") do |_op, _io| + identify_comment + end + + @OP.def_rule("=begin", proc { @prev_char_no == 0 && peek(0) =~ /\s/ }) do |op, _io| + str = String.new(op) + @ltype = "=" + + begin + line = String.new + begin + ch = getc + line << ch + end until ch == "\n" + str << line + end until line =~ /^=end/ + + ungetc + + @ltype = nil + + if str =~ /\A=begin\s+rdoc/i + str.sub!(/\A=begin.*\n/, '') + str.sub!(/^=end.*/m, '') + Token(TkCOMMENT).set_text(str) + else + Token(TkCOMMENT).set_text(str) + end + end + + @OP.def_rule("\n") do + print "\\n\n" if RubyLex.debug? + @colonblock_seen = false + case @lex_state + when EXPR_BEG, EXPR_FNAME, EXPR_DOT + @continue = true + else + @continue = false + @lex_state = EXPR_BEG + end + Token(TkNL).set_text("\n") + end + + @OP.def_rules("*", "**", + "!", "!=", "!~", + "=", "==", "===", + "=~", "<=>", + "<", "<=", + ">", ">=", ">>") do |op, _io| + @lex_state = EXPR_BEG + Token(op).set_text(op) + end + + @OP.def_rules("<<") do |op, _io| + tk = nil + if @lex_state != EXPR_END && @lex_state != EXPR_CLASS && + (@lex_state != EXPR_ARG || @space_seen) + c = peek(0) + tk = identify_here_document if /[-\w\"\'\`]/ =~ c + end + if !tk + @lex_state = EXPR_BEG + tk = Token(op).set_text(op) + end + tk + end + + @OP.def_rules("'", '"') do |op, _io| + identify_string(op) + end + + @OP.def_rules("`") do |op, _io| + if @lex_state == EXPR_FNAME + Token(op).set_text(op) + else + identify_string(op) + end + end + + @OP.def_rules('?') do |op, _io| + if @lex_state == EXPR_END + @lex_state = EXPR_BEG + Token(TkQUESTION).set_text(op) + else + ch = getc + if @lex_state == EXPR_ARG && ch !~ /\s/ + ungetc + @lex_state = EXPR_BEG + Token(TkQUESTION).set_text(op) + else + str = String.new(op) + str << ch + if ch == '\\' #' + str << read_escape + end + @lex_state = EXPR_END + Token(TkINTEGER).set_text(str) + end + end + end + + @OP.def_rules("&", "&&", "|", "||") do |op, _io| + @lex_state = EXPR_BEG + Token(op).set_text(op) + end + + @OP.def_rules("+=", "-=", "*=", "**=", + "&=", "|=", "^=", "<<=", ">>=", "||=", "&&=") do |op, _io| + @lex_state = EXPR_BEG + op =~ /^(.*)=$/ + Token(TkOPASGN, $1).set_text(op) + end + + @OP.def_rule("+@", proc { @lex_state == EXPR_FNAME }) do |op, _io| + Token(TkUPLUS).set_text(op) + end + + @OP.def_rule("-@", proc { @lex_state == EXPR_FNAME }) do |op, _io| + Token(TkUMINUS).set_text(op) + end + + @OP.def_rules("+", "-") do |op, _io| + catch(:RET) do + if @lex_state == EXPR_ARG + if @space_seen && peek(0) =~ /[0-9]/ + throw :RET, identify_number(op) + else + @lex_state = EXPR_BEG + end + elsif @lex_state != EXPR_END && peek(0) =~ /[0-9]/ + throw :RET, identify_number(op) + else + @lex_state = EXPR_BEG + end + Token(op).set_text(op) + end + end + + @OP.def_rule(".") do + @lex_state = EXPR_BEG + if peek(0) =~ /[0-9]/ + ungetc + identify_number("") + else + # for obj.if + @lex_state = EXPR_DOT + Token(TkDOT).set_text(".") + end + end + + @OP.def_rules("..", "...") do |op, _io| + @lex_state = EXPR_BEG + Token(op).set_text(op) + end + + lex_int2 + end + + def lex_int2 + @OP.def_rules("]", "}", ")") do |op, _io| + @lex_state = EXPR_END + @indent -= 1 + Token(op).set_text(op) + end + + @OP.def_rule(":") do + if (@colonblock_seen && @lex_state != EXPR_BEG) || peek(0) =~ /\s/ + @lex_state = EXPR_BEG + tk = Token(TkCOLON) + else + @lex_state = EXPR_FNAME + tk = Token(TkSYMBEG) + end + tk.set_text(":") + end + + @OP.def_rule("::") do + # p @lex_state.id2name, @space_seen + if @lex_state == EXPR_BEG || @lex_state == EXPR_ARG && @space_seen + @lex_state = EXPR_BEG + tk = Token(TkCOLON3) + else + @lex_state = EXPR_DOT + tk = Token(TkCOLON2) + end + tk.set_text("::") + end + + @OP.def_rule("/") do |op, _io| + if @lex_state == EXPR_BEG || @lex_state == EXPR_MID + identify_string(op) + elsif peek(0) == '=' + getc + @lex_state = EXPR_BEG + Token(TkOPASGN, :/).set_text("/=") #") + elsif @lex_state == EXPR_ARG && @space_seen && peek(0) !~ /\s/ + identify_string(op) + else + @lex_state = EXPR_BEG + Token("/").set_text(op) + end + end + + @OP.def_rules("^") do + @lex_state = EXPR_BEG + Token("^").set_text("^") + end + + # @OP.def_rules("^=") do + # @lex_state = EXPR_BEG + # Token(TkOPASGN, :^) + # end + + @OP.def_rules(",", ";") do |op, _io| + @colonblock_seen = false + @lex_state = EXPR_BEG + Token(op).set_text(op) + end + + @OP.def_rule("~") do + @lex_state = EXPR_BEG + Token("~").set_text("~") + end + + @OP.def_rule("~@", proc { @lex_state = EXPR_FNAME }) do + @lex_state = EXPR_BEG + Token("~").set_text("~@") + end + + @OP.def_rule("(") do + @indent += 1 + # if @lex_state == EXPR_BEG || @lex_state == EXPR_MID + # @lex_state = EXPR_BEG + # tk = Token(TkfLPAREN) + # else + @lex_state = EXPR_BEG + tk = Token(TkLPAREN) + # end + tk.set_text("(") + end + + @OP.def_rule("[]", proc { @lex_state == EXPR_FNAME }) do + Token("[]").set_text("[]") + end + + @OP.def_rule("[]=", proc { @lex_state == EXPR_FNAME }) do + Token("[]=").set_text("[]=") + end + + @OP.def_rule("[") do + @indent += 1 + # if @lex_state == EXPR_FNAME + # t = Token(TkfLBRACK) + # else + # if @lex_state == EXPR_BEG || @lex_state == EXPR_MID + # t = Token(TkLBRACK) + # elsif @lex_state == EXPR_ARG && @space_seen + # else + # t = Token(TkfLBRACK) + # end + # end + t = Token(TkLBRACK) + @lex_state = EXPR_BEG + t.set_text("[") + end + + @OP.def_rule("{") do + @indent += 1 + # if @lex_state != EXPR_END && @lex_state != EXPR_ARG + # t = Token(TkLBRACE) + # else + # t = Token(TkfLBRACE) + # end + t = Token(TkLBRACE) + @lex_state = EXPR_BEG + t.set_text("{") + end + + @OP.def_rule('\\') do #' + if getc == "\n" + @space_seen = true + @continue = true + Token(TkSPACE).set_text("\\\n") + else + ungetc + Token("\\").set_text("\\") #" + end + end + + @OP.def_rule('%') do |_op, _io| + if @lex_state == EXPR_BEG || @lex_state == EXPR_MID + identify_quotation('%') + elsif peek(0) == '=' + getc + Token(TkOPASGN, "%").set_text("%=") + elsif @lex_state == EXPR_ARG && @space_seen && peek(0) !~ /\s/ + identify_quotation('%') + else + @lex_state = EXPR_BEG + Token("%").set_text("%") + end + end + + @OP.def_rule('$') do #' + identify_gvar + end + + @OP.def_rule('@') do + if peek(0) =~ /[@\w]/ + ungetc + identify_identifier + else + Token("@").set_text("@") + end + end + + # @OP.def_rule("def", proc{|op, io| /\s/ =~ io.peek(0)}) do + # |op, io| + # @indent += 1 + # @lex_state = EXPR_FNAME + # # @lex_state = EXPR_END + # # until @rests[0] == "\n" or @rests[0] == ";" + # # rests.shift + # # end + # end + + @OP.def_rule("__END__", proc { @prev_char_no == 0 && peek(0) =~ /[\r\n]/ }) do + throw :eof + end + + @OP.def_rule("") do |op, io| + printf "MATCH: start %s: %s\n", op, io.inspect if RubyLex.debug? + if peek(0) =~ /[0-9]/ + t = identify_number("") + elsif peek(0) =~ /[\w]/ + t = identify_identifier + end + printf "MATCH: end %s: %s\n", op, io.inspect if RubyLex.debug? + t + end + + p @OP if RubyLex.debug? + end + + def identify_gvar + @lex_state = EXPR_END + str = String.new("$") + + tk = case ch = getc + when %r{[~_*$?!@/\\;,=:<>".]} + str << ch + Token(TkGVAR, str) + + when "-" + str << "-" << getc + Token(TkGVAR, str) + + when "&", "`", "'", "+" + str << ch + Token(TkBACK_REF, str) + + when /[1-9]/ + str << ch + while (ch = getc) =~ /[0-9]/ + str << ch + end + ungetc + Token(TkNTH_REF) + when /\w/ + ungetc + ungetc + return identify_identifier + else + ungetc + Token("$") + end + tk.set_text(str) + end + + def identify_identifier + token = "" + token.concat getc if peek(0) =~ /[$@]/ + token.concat getc if peek(0) == "@" + + while (ch = getc) =~ /\w|_/ + print ":", ch, ":" if RubyLex.debug? + token.concat ch + end + ungetc + + if ch == "!" || ch == "?" + token.concat getc + end + # fix token + + # $stderr.puts "identifier - #{token}, state = #@lex_state" + + case token + when /^\$/ + return Token(TkGVAR, token).set_text(token) + when /^\@/ + @lex_state = EXPR_END + return Token(TkIVAR, token).set_text(token) + end + + if @lex_state != EXPR_DOT + print token, "\n" if RubyLex.debug? + + token_c, *trans = TkReading2Token[token] + if token_c + # reserved word? + + if @lex_state != EXPR_BEG && + @lex_state != EXPR_FNAME && + trans[1] + # modifiers + token_c = TkSymbol2Token[trans[1]] + @lex_state = trans[0] + else + if @lex_state != EXPR_FNAME + if ENINDENT_CLAUSE.include?(token) + @indent += 1 + + if ACCEPTS_COLON.include?(token) + @colonblock_seen = true + else + @colonblock_seen = false + end + elsif DEINDENT_CLAUSE.include?(token) + @indent -= 1 + @colonblock_seen = false + end + @lex_state = trans[0] + else + @lex_state = EXPR_END + end + end + return Token(token_c, token).set_text(token) + end + end + + if @lex_state == EXPR_FNAME + @lex_state = EXPR_END + if peek(0) == '=' + token.concat getc + end + elsif @lex_state == EXPR_BEG || @lex_state == EXPR_DOT + @lex_state = EXPR_ARG + else + @lex_state = EXPR_END + end + + if token[0, 1] =~ /[A-Z]/ + return Token(TkCONSTANT, token).set_text(token) + elsif token[token.size - 1, 1] =~ /[!?]/ + return Token(TkFID, token).set_text(token) + else + return Token(TkIDENTIFIER, token).set_text(token) + end + end + + def identify_here_document + ch = getc + if ch == "-" + ch = getc + indent = true + end + if /['"`]/ =~ ch # ' + lt = ch + quoted = "" + while (c = getc) && c != lt + quoted.concat c + end + else + lt = '"' + quoted = ch.dup + while (c = getc) && c =~ /\w/ + quoted.concat c + end + ungetc + end + + ltback, @ltype = @ltype, lt + reserve = String.new + + while ch = getc + reserve << ch + if ch == "\\" #" + ch = getc + reserve << ch + elsif ch == "\n" + break + end + end + + str = String.new + while (l = gets) + l.chomp! + l.strip! if indent + break if l == quoted + str << l.chomp << "\n" + end + + @reader.divert_read_from(reserve) + + @ltype = ltback + @lex_state = EXPR_END + Token(Ltype2Token[lt], str).set_text(str.dump) + end + + def identify_quotation(initial_char) + ch = getc + if lt = PERCENT_LTYPE[ch] + initial_char += ch + ch = getc + elsif ch =~ /\W/ + lt = "\"" + else + # RubyLex.fail SyntaxError, "unknown type of %string ('#{ch}')" + end + # if ch !~ /\W/ + # ungetc + # next + # end + # @ltype = lt + @quoted = ch unless @quoted = PERCENT_PAREN[ch] + identify_string(lt, @quoted, ch, initial_char) if lt + end + + def identify_number(start) + str = start.dup + + if start == "+" || start == "-" || start == "" + start = getc + str << start + end + + @lex_state = EXPR_END + + if start == "0" + if peek(0) == "x" + ch = getc + str << ch + match = /[0-9a-f_]/ + else + match = /[0-7_]/ + end + while ch = getc + if ch !~ match + ungetc + break + else + str << ch + end + end + return Token(TkINTEGER).set_text(str) + end + + type = TkINTEGER + allow_point = true + allow_e = true + while ch = getc + case ch + when /[0-9_]/ + str << ch + + when allow_point && "." + type = TkFLOAT + if peek(0) !~ /[0-9]/ + ungetc + break + end + str << ch + allow_point = false + + when allow_e && "e", allow_e && "E" + str << ch + type = TkFLOAT + if peek(0) =~ /[+-]/ + str << getc + end + allow_e = false + allow_point = false + else + ungetc + break + end + end + Token(type).set_text(str) + end + + def identify_string(ltype, quoted = ltype, opener = nil, initial_char = nil) + @ltype = ltype + @quoted = quoted + subtype = nil + + str = String.new + str << initial_char if initial_char + str << (opener || quoted) + + nest = 0 + begin + while ch = getc + str << ch + if @quoted == ch + if nest == 0 + break + else + nest -= 1 + end + elsif opener == ch + nest += 1 + elsif @ltype != "'" && @ltype != "]" && ch == "#" + ch = getc + if ch == "{" + subtype = true + str << ch << skip_inner_expression + else + ungetc(ch) + end + elsif ch == '\\' #' + str << read_escape + end + end + if @ltype == "/" + if peek(0) =~ /i|o|n|e|s/ + str << getc + end + end + if subtype + Token(DLtype2Token[ltype], str) + else + Token(Ltype2Token[ltype], str) + end.set_text(str) + ensure + @ltype = nil + @quoted = nil + @lex_state = EXPR_END + end + end + + def skip_inner_expression + res = String.new + nest = 0 + while (ch = getc) + res << ch + if ch == '}' + break if nest == 0 + nest -= 1 + elsif ch == '{' + nest += 1 + end + end + res + end + + def identify_comment + @ltype = "#" + comment = String.new("#") + while ch = getc + if ch == "\\" + ch = getc + if ch == "\n" + ch = " " + else + comment << "\\" + end + else + if ch == "\n" + @ltype = nil + ungetc + break + end + end + comment << ch + end + Token(TkCOMMENT).set_text(comment) + end + + def read_escape + res = String.new + case ch = getc + when /[0-7]/ + ungetc ch + 3.times do + case ch = getc + when /[0-7]/ + when nil + break + else + ungetc + break + end + res << ch + end + + when "x" + res << ch + 2.times do + case ch = getc + when /[0-9a-fA-F]/ + when nil + break + else + ungetc + break + end + res << ch + end + + when "M" + res << ch + if (ch = getc) != '-' + ungetc + else + res << ch + if (ch = getc) == "\\" #" + res << ch + res << read_escape + else + res << ch + end + end + + when "C", "c" #, "^" + res << ch + if ch == "C" && (ch = getc) != "-" + ungetc + else + res << ch + if (ch = getc) == "\\" #" + res << ch + res << read_escape + else + res << ch + end + end + else + res << ch + end + res + end + end + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/parser/ruby/legacy/ruby_parser.rb b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/parser/ruby/legacy/ruby_parser.rb new file mode 100644 index 000000000..9b12efeca --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/parser/ruby/legacy/ruby_parser.rb @@ -0,0 +1,32 @@ +# frozen_string_literal: true +module YARD + module Parser + module Ruby + module Legacy + # Legacy Ruby parser + # @since 0.5.6 + class RubyParser < Parser::Base + def initialize(source, _filename) + @source = source + end + + def parse + @parse ||= StatementList.new(@source) + self + end + + def tokenize + @tokenize ||= TokenList.new(@source) + end + + def enumerator + @parse + end + + def encoding_line; @parse.encoding_line end + def shebang_line; @parse.shebang_line end + end + end + end + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/parser/ruby/legacy/statement.rb b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/parser/ruby/legacy/statement.rb new file mode 100644 index 000000000..e02fb34b6 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/parser/ruby/legacy/statement.rb @@ -0,0 +1,68 @@ +# frozen_string_literal: true +module YARD + module Parser::Ruby::Legacy + class Statement + attr_reader :tokens, :comments, :block + attr_accessor :comments_range + + # @deprecated Groups are now defined by directives + # @see Tags::GroupDirective + attr_accessor :group + + attr_accessor :comments_hash_flag + + def initialize(tokens, block = nil, comments = nil) + @tokens = tokens + @block = block + @comments = comments + @comments_hash_flag = false + end + + def first_line + to_s.split(/\n/)[0] + end + + alias signature first_line + + def to_s(include_block = true) + tokens.map do |token| + RubyToken::TkBlockContents === token ? (include_block ? block.to_s : '') : token.text + end.join + end + alias source to_s + + def inspect + l = line - 1 + to_s(false).split(/\n/).map do |text| + "\t#{l += 1}: #{text}" + end.join("\n") + end + + def show + "\t#{line}: #{first_line}" + end + + # @return [Fixnum] the first line of Ruby source + def line + tokens.first.line_no + end + + # @return [Range] the first to last lines of Ruby source + # @since 0.5.4 + def line_range + tokens.first.line_no..tokens.last.line_no + end + + private + + def clean_tokens(tokens) + last_tk = nil + tokens.reject do |tk| + tk.is_a?(RubyToken::TkNL) || + (last_tk.is_a?(RubyToken::TkSPACE) && + last_tk.class == tk.class) && last_tk = tk + end + end + end + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/parser/ruby/legacy/statement_list.rb b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/parser/ruby/legacy/statement_list.rb new file mode 100644 index 000000000..14e212db2 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/parser/ruby/legacy/statement_list.rb @@ -0,0 +1,394 @@ +# frozen_string_literal: true +module YARD + module Parser::Ruby::Legacy + class StatementList < Array + include RubyToken + + attr_accessor :shebang_line, :encoding_line + + # The following list of tokens will require a block to be opened + # if used at the beginning of a statement. + OPEN_BLOCK_TOKENS = [TkCLASS, TkDEF, TkMODULE, TkUNTIL, + TkIF, TkELSIF, TkUNLESS, TkWHILE, TkFOR, TkCASE] + + # Creates a new statement list + # + # @param [TokenList, String] content the tokens to create the list from + def initialize(content) + @shebang_line = nil + @encoding_line = nil + @comments_last_line = nil + if content.is_a? TokenList + @tokens = content.dup + elsif content.is_a? String + @tokens = TokenList.new(content.delete("\r")) + else + raise ArgumentError, "Invalid content for StatementList: #{content.inspect}:#{content.class}" + end + + parse_statements + end + + private + + def parse_statements + loop do + stmt = next_statement + break if stmt.nil? + self << stmt + end + end + + # Returns the next statement in the token stream + # + # @return [Statement] the next statement + def next_statement + @state = :first_statement + @statement_stack = [] + @level = 0 + @block_num = 0 + @done = false + @current_block = nil + @comments_line = nil + @comments_hash_flag = nil + @statement = TokenList.new + @block = nil + @comments = nil + @last_tk = nil + @last_ns_tk = nil + @before_last_tk = nil + @before_last_ns_tk = nil + @first_line = nil + + until @done + tk = @tokens.shift + break if tk.nil? + process_token(tk) + + @before_last_tk = @last_tk + @last_tk = tk # Save last token + unless [TkSPACE, TkNL, TkEND_OF_SCRIPT].include? tk.class + @before_last_ns_tk = @last_ns_tk + @last_ns_tk = tk + end + end + + # Return the code block with starting token and initial comments + # If there is no code in the block, return nil + @comments = @comments.compact if @comments + if @block || !@statement.empty? + sanitize_statement_end + sanitize_block + @statement.pop if [TkNL, TkSPACE, TkSEMICOLON].include?(@statement.last.class) + stmt = Statement.new(@statement, @block, @comments) + if @comments && @comments_line + stmt.comments_range = (@comments_line..(@comments_line + @comments.size - 1)) + stmt.comments_hash_flag = @comments_hash_flag + end + stmt + elsif @comments + @statement << TkCOMMENT.new(@comments_line, 0) + @statement.first.set_text("# " + @comments.join("\n# ")) + Statement.new(@statement, nil, @comments) + end + end + + def sanitize_statement_end + extra = [] + (@statement.size - 1).downto(0) do |index| + token = @statement[index] + next unless TkStatementEnd === token + + while [TkNL, TkSPACE, TkSEMICOLON].include?(@statement[index - 1].class) + extra.unshift(@statement.delete_at(index - 1)) + index -= 1 + end + @statement.insert(index + 1, *extra) + break + end + end + + def sanitize_block + return unless @block + extra = [] + while [TkSPACE, TkNL, TkSEMICOLON].include?(@block.last.class) + next(@block.pop) if TkSEMICOLON === @block.last + extra.unshift(@block.pop) + end + + @statement.each_with_index do |token, index| + if TkBlockContents === token + @statement[index, 1] = [token, *extra] + break + end + end + end + + # Processes a single token + # + # @param [RubyToken::Token] tk the token to process + def process_token(tk) + # p tk.class, tk.text, @state, @level, @current_block, "
    " + case @state + when :first_statement + return if process_initial_comment(tk) + return if @statement.empty? && [TkSPACE, TkNL, TkCOMMENT].include?(tk.class) + @comments_last_line = nil + if @statement.empty? && tk.class == TkALIAS + @state = :alias_statement + @alias_values = [] + push_token(tk) + return + end + return if process_simple_block_opener(tk) + push_token(tk) + return if process_complex_block_opener(tk) + + if balances?(tk) + process_statement_end(tk) + else + @state = :balance + end + when :alias_statement + push_token(tk) + @alias_values << tk unless [TkSPACE, TkNL, TkCOMMENT].include?(tk.class) + if @alias_values.size == 2 + @state = :first_statement + if [NilClass, TkNL, TkEND_OF_SCRIPT, TkSEMICOLON].include?(peek_no_space.class) + @done = true + end + end + when :balance + @statement << tk + return unless balances?(tk) + @state = :first_statement + process_statement_end(tk) + when :block_statement + push_token(tk) + return unless balances?(tk) + process_statement_end(tk) + when :pre_block + @current_block = nil + process_block_token(tk) unless tk.class == TkSEMICOLON + @state = :block + when :block + process_block_token(tk) + when :post_block + if tk.class == TkSPACE + @statement << tk + return + end + + process_statement_end(tk) + @state = :block + end + + if @first_line == tk.line_no && !@statement.empty? && TkCOMMENT === tk + process_initial_comment(tk) + end + end + + # Processes a token in a block + # + # @param [RubyToken::Token] tk the token to process + def process_block_token(tk) + if balances?(tk) + @statement << tk + @state = :first_statement + process_statement_end(tk) + elsif @block_num > 1 || (@block.empty? && [TkSPACE, TkNL].include?(tk.class)) + @statement << tk + else + if @block.empty? + @statement << TkBlockContents.new(tk.line_no, tk.char_no) + end + @block << tk + end + end + + # Processes a comment token that comes before a statement + # + # @param [RubyToken::Token] tk the token to process + # @return [Boolean] whether or not +tk+ was processed as an initial comment + def process_initial_comment(tk) + if @statement.empty? && (@comments_last_line || 0) < tk.line_no - 2 + @comments = nil + end + + return unless tk.class == TkCOMMENT + + case tk.text + when Parser::SourceParser::SHEBANG_LINE + if !@last_ns_tk && !@encoding_line + @shebang_line = tk.text + return + end + when Parser::SourceParser::ENCODING_LINE + if (@last_ns_tk.class == TkCOMMENT && @last_ns_tk.text == @shebang_line) || + !@last_ns_tk + @encoding_line = tk.text + return + end + end + + return if !@statement.empty? && @comments + return if @first_line && tk.line_no > @first_line + + if @comments_last_line && @comments_last_line < tk.line_no - 1 + if @comments && @statement.empty? + @tokens.unshift(tk) + return @done = true + end + @comments = nil + end + @comments_line = tk.line_no unless @comments + + # Remove the "#" and up to 1 space before the text + # Since, of course, the convention is to have "# text" + # and not "#text", which I deem ugly (you heard it here first) + @comments ||= [] + if tk.text.start_with?('=begin') + lines = tk.text.count("\n") + @comments += tk.text.gsub(/\A=begin.*\r?\n|\r?\n=end.*\r?\n?\Z/, '').split(/\r?\n/) + @comments_last_line = tk.line_no + lines + else + @comments << tk.text.gsub(/^(#+)\s{0,1}/, '') + @comments_hash_flag = $1 == '##' if @comments_hash_flag.nil? + @comments_last_line = tk.line_no + end + @comments.pop if @comments.size == 1 && @comments.first =~ /^\s*$/ + true + end + + # Processes a simple block-opening token; + # that is, a block opener such as +begin+ or +do+ + # that isn't followed by an expression + # + # @param [RubyToken::Token] tk the token to process + def process_simple_block_opener(tk) + return unless [TkLBRACE, TkDO, TkBEGIN, TkELSE].include?(tk.class) && + # Make sure hashes are parsed as hashes, not as blocks + (@last_ns_tk.nil? || @last_ns_tk.lex_state != EXPR_BEG) + + @level += 1 + @state = :block + @block_num += 1 + if @block.nil? + @block = TokenList.new + tokens = [tk, TkStatementEnd.new(tk.line_no, tk.char_no)] + tokens = tokens.reverse if TkBEGIN === tk.class + @statement.concat(tokens) + else + @statement << tk + end + + true + end + + # Processes a complex block-opening token; + # that is, a block opener such as +while+ or +for+ + # that is followed by an expression + # + # @param [RubyToken::Token] tk the token to process + def process_complex_block_opener(tk) + return unless OPEN_BLOCK_TOKENS.include?(tk.class) + + @current_block = tk.class + @state = :block_statement + + true + end + + # Processes a token that closes a statement + # + # @param [RubyToken::Token] tk the token to process + def process_statement_end(tk) + # Whitespace means that we keep the same value of @new_statement as last token + return if tk.class == TkSPACE + + return unless + # We might be coming after a statement-ending token... + (@last_tk && [TkSEMICOLON, TkNL, TkEND_OF_SCRIPT].include?(tk.class)) || + # Or we might be at the beginning of an argument list + (@current_block == TkDEF && tk.class == TkRPAREN) + + # Continue line ending on . or :: + return if @last_tk && [EXPR_DOT].include?(@last_tk.lex_state) + + # Continue a possible existing new statement unless we just finished an expression... + return unless (@last_tk && [EXPR_END, EXPR_ARG].include?(@last_tk.lex_state)) || + # Or we've opened a block and are ready to move into the body + (@current_block && [TkNL, TkSEMICOLON].include?(tk.class) && + # Handle the case where the block statement's expression is on the next line + # + # while + # foo + # end + @last_ns_tk.class != @current_block && + # And the case where part of the expression is on the next line + # + # while foo || + # bar + # end + @last_tk.lex_state != EXPR_BEG) + + # Continue with the statement if we've hit a comma in a def + return if @current_block == TkDEF && peek_no_space.class == TkCOMMA + + if [TkEND_OF_SCRIPT, TkNL, TkSEMICOLON].include?(tk.class) && @state == :block_statement && + [TkRBRACE, TkEND].include?(@last_ns_tk.class) && @level == 0 + @current_block = nil + end + + unless @current_block + @done = true + return + end + + @state = :pre_block + @level += 1 + @block_num += 1 + unless @block + @block = TokenList.new + @statement << TkStatementEnd.new(tk.line_no, tk.char_no) + end + end + + # Handles the balancing of parentheses and blocks + # + # @param [RubyToken::Token] tk the token to process + # @return [Boolean] whether or not the current statement's parentheses and blocks + # are balanced after +tk+ + def balances?(tk) + unless [TkALIAS, TkDEF].include?(@last_ns_tk.class) || @before_last_ns_tk.class == TkALIAS + if [TkLPAREN, TkLBRACK, TkLBRACE, TkDO, TkBEGIN].include?(tk.class) + @level += 1 + elsif OPEN_BLOCK_TOKENS.include?(tk.class) + @level += 1 unless tk.class == TkELSIF + elsif [TkRPAREN, TkRBRACK, TkRBRACE, TkEND].include?(tk.class) && @level > 0 + @level -= 1 + end + end + + @level == 0 + end + + # Adds a token to the current statement, + # unless it's a newline, semicolon, or comment + # + # @param [RubyToken::Token] tk the token to process + def push_token(tk) + @first_line = tk.line_no if @statement.empty? + @statement << tk unless @level == 0 && [TkCOMMENT].include?(tk.class) + end + + # Returns the next token in the stream that's not a space + # + # @return [RubyToken::Token] the next non-space token + def peek_no_space + return @tokens.first unless @tokens.first.class == TkSPACE + @tokens[1] + end + end + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/parser/ruby/legacy/token_list.rb b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/parser/ruby/legacy/token_list.rb new file mode 100644 index 000000000..05e15a892 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/parser/ruby/legacy/token_list.rb @@ -0,0 +1,74 @@ +# frozen_string_literal: true +module YARD + module Parser::Ruby::Legacy + class TokenList < Array + include RubyToken + + def initialize(content = nil) + self << content if content + end + + def to_s(full_statement = false, show_block = true) + inject([]) do |acc, token| + break acc if !full_statement && TkStatementEnd === token + acc << (!show_block && TkBlockContents === token ? "" : token.text) + end.join + end + + # @param [TokenList, Token, String] tokens + # A list of tokens. If the token is a string, it + # is parsed with {RubyLex}. + def push(*tokens) + tokens.each do |tok| + if tok.is_a?(TokenList) || tok.is_a?(Array) + concat tok + elsif tok.is_a?(Token) + super tok + elsif tok.is_a?(String) + parse_content(tok) + else + raise ArgumentError, "Expecting token, list of tokens or string of code to be tokenized. Got #{tok.class}" + end + end + self + end + alias << push + + def squeeze(type = TkSPACE) + last = nil + TokenList.new(map {|t| x = t.is_a?(type) && last.is_a?(type) ? nil : t; last = t; x }) + end + + private + + def parse_content(content) + lex = RubyLex.new(content) + loop do + tk = lex.token + break if tk.nil? + self << convert_token(lex, tk) + end + end + + def convert_token(lex, tk) + if TkIDENTIFIER === tk && lex.peek == ':' + next_tk = lex.token + sym = TkLABEL.new(tk.line_no, tk.char_no, nil) + sym.lex_state = lex.lex_state + sym.set_text(tk.text + next_tk.text) + elsif TkSYMBEG === tk + next_tk = lex.token + if next_tk + sym = TkSYMBOL.new(tk.line_no, tk.char_no, nil) + sym.lex_state = lex.lex_state + sym.set_text(tk.text + next_tk.text) + else + tk + end + else + tk + end + end + end + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/parser/ruby/ruby_parser.rb b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/parser/ruby/ruby_parser.rb new file mode 100644 index 000000000..a7085b5e0 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/parser/ruby/ruby_parser.rb @@ -0,0 +1,701 @@ +# frozen_string_literal: true +begin require 'ripper'; rescue LoadError; nil end + +module YARD + module Parser + module Ruby + # Ruby 1.9 parser + # @!attribute [r] encoding_line + # @!attribute [r] frozen_string_line + # @!attribute [r] shebang_line + # @!attribute [r] enumerator + class RubyParser < Parser::Base + def initialize(source, filename) + @parser = RipperParser.new(source, filename) + end + + def parse; @parser.parse end + def tokenize; @parser.tokens end + def enumerator; @parser.enumerator end + def shebang_line; @parser.shebang_line end + def encoding_line; @parser.encoding_line end + def frozen_string_line; @parser.frozen_string_line end + end + + # Internal parser class + # @since 0.5.6 + class RipperParser < Ripper + attr_reader :ast, :charno, :comments, :file, :tokens + attr_reader :shebang_line, :encoding_line, :frozen_string_line + alias root ast + + def initialize(source, filename, *args) + super + @last_ns_token = nil + @file = filename + @source = source + @tokens = [] + @comments = {} + @comments_range = {} + @comments_flags = {} + @heredoc_tokens = nil + @heredoc_state = nil + @map = {} + @ns_charno = 0 + @list = [] + @charno = 0 + @shebang_line = nil + @encoding_line = nil + @frozen_string_line = nil + @file_encoding = nil + @newline = true + @percent_ary = nil + end + + def parse + @ast = super + @ast.full_source = @source + @ast.file = @file + freeze_tree + insert_comments + self + end + + def enumerator + ast.children + end + + def file_encoding + return nil unless defined?(::Encoding) + return @file_encoding if @file_encoding + return Encoding.default_internal unless @encoding_line + match = @encoding_line.match(SourceParser::ENCODING_LINE) + @file_encoding = match.captures.last if match + end + + private + + MAPPINGS = { + :BEGIN => "BEGIN", + :END => "END", + :alias => "alias", + :array => :lbracket, + :arg_paren => :lparen, + :begin => "begin", + :blockarg => "&", + :brace_block => :lbrace, + :break => "break", + :case => "case", + :class => "class", + :def => "def", + :defined => "defined?", + :defs => "def", + :do_block => "do", + :else => "else", + :elsif => "elsif", + :ensure => "ensure", + :for => "for", + :hash => :lbrace, + :if => "if", + :lambda => [:tlambda, "lambda"], + :module => "module", + :next => "next", + :paren => :lparen, + :qwords_literal => :qwords_beg, + :words_literal => :words_beg, + :qsymbols_literal => :qsymbols_beg, + :symbols_literal => :symbols_beg, + :redo => "redo", + :regexp_literal => :regexp_beg, + :rescue => "rescue", + :rest_param => "*", + :retry => "retry", + :return => "return", + :return0 => "return", + :sclass => "class", + :string_embexpr => :embexpr_beg, + :string_literal => [:tstring_beg, :heredoc_beg], + :super => "super", + :symbol => :symbeg, + :top_const_ref => "::", + :undef => "undef", + :unless => "unless", + :until => "until", + :when => "when", + :while => "while", + :xstring_literal => :backtick, + :yield => "yield", + :yield0 => "yield", + :zsuper => "super" + } + REV_MAPPINGS = {} + + AST_TOKENS = [:CHAR, :backref, :const, :cvar, :gvar, :heredoc_end, :ident, + :int, :float, :ivar, :label, :period, :regexp_end, :tstring_content, :backtick] + + MAPPINGS.each do |k, v| + if Array === v + v.each {|vv| (REV_MAPPINGS[vv] ||= []) << k } + else + (REV_MAPPINGS[v] ||= []) << k + end + end + + PARSER_EVENT_TABLE.each do |event, arity| + node_class = AstNode.node_class_for(event) + + if /_new\z/ =~ event.to_s && arity == 0 + module_eval(<<-eof, __FILE__, __LINE__ + 1) + def on_#{event}(*args) + #{node_class}.new(:list, args, :listchar => charno...charno, :listline => lineno..lineno) + end + eof + elsif /_add(_.+)?\z/ =~ event.to_s + module_eval(<<-eof, __FILE__, __LINE__ + 1) + begin; undef on_#{event}; rescue NameError; end + def on_#{event}(list, item) + list.push(item) + list + end + eof + elsif MAPPINGS.key?(event) + module_eval(<<-eof, __FILE__, __LINE__ + 1) + begin; undef on_#{event}; rescue NameError; end + def on_#{event}(*args) + visit_event #{node_class}.new(:#{event}, args) + end + eof + else + module_eval(<<-eof, __FILE__, __LINE__ + 1) + begin; undef on_#{event}; rescue NameError; end + def on_#{event}(*args) + #{node_class}.new(:#{event}, args, :listline => lineno..lineno, :listchar => charno...charno) + end + eof + end + end + + SCANNER_EVENTS.each do |event| + ast_token = AST_TOKENS.include?(event) + module_eval(<<-eof, __FILE__, __LINE__ + 1) + begin; undef on_#{event}; rescue NameError; end + def on_#{event}(tok) + visit_ns_token(:#{event}, tok, #{ast_token.inspect}) + end + eof + end + + REV_MAPPINGS.select {|k, _v| k.is_a?(Symbol) }.each do |pair| + event = pair.first + ast_token = AST_TOKENS.include?(event) + module_eval(<<-eof, __FILE__, __LINE__ + 1) + begin; undef on_#{event}; rescue NameError; end + def on_#{event}(tok) + (@map[:#{event}] ||= []) << [lineno, charno] + visit_ns_token(:#{event}, tok, #{ast_token.inspect}) + end + eof + end + + [:kw, :op].each do |event| + module_eval(<<-eof, __FILE__, __LINE__ + 1) + begin; undef on_#{event}; rescue NameError; end + def on_#{event}(tok) + unless @last_ns_token == [:kw, "def"] || + (@tokens.last && @tokens.last[0] == :symbeg) + (@map[tok] ||= []) << [lineno, charno] + end + visit_ns_token(:#{event}, tok, true) + end + eof + end + + [:nl, :ignored_nl].each do |event| + module_eval(<<-eof, __FILE__, __LINE__ + 1) + begin; undef on_#{event}; rescue NameError; end + def on_#{event}(tok) + add_token(:#{event}, tok) + @newline = true + @charno += tok ? tok.length : 0 + end + eof + end + + undef on_sp + + def on_sp(tok) + add_token(:sp, tok) + @charno += tok.length + end + + def visit_event(node) + map = @map[MAPPINGS[node.type]] + lstart, sstart = *(map ? map.pop : [lineno, @ns_charno - 1]) + node.source_range = Range.new(sstart, @ns_charno - 1) + node.line_range = Range.new(lstart, lineno) + if node.respond_to?(:block) + sr = node.block.source_range + lr = node.block.line_range + node.block.source_range = Range.new(sr.first, @tokens.last[2][1] - 1) + node.block.line_range = Range.new(lr.first, @tokens.last[2][0]) + end + node + end + + def visit_event_arr(node) + mapping = MAPPINGS[node.type].find {|k| @map[k] && !@map[k].empty? } + lstart, sstart = *@map[mapping].pop + node.source_range = Range.new(sstart, @ns_charno - 1) + node.line_range = Range.new(lstart, lineno) + node + end + + def visit_ns_token(token, data, ast_token = false) + add_token(token, data) + ch = charno + @last_ns_token = [token, data] + @charno += data.length + @ns_charno = charno + @newline = [:semicolon, :comment, :kw, :op, :lparen, :lbrace].include?(token) + if ast_token + AstNode.new(token, [data], :line => lineno..lineno, :char => ch..charno - 1, :token => true) + end + end + + def add_token(token, data) + if @percent_ary + if token == :words_sep && data !~ /\s\z/ + rng = @percent_ary.source_range + rng = Range.new(rng.first, rng.last + data.length) + @percent_ary.source_range = rng + @tokens << [token, data, [lineno, charno]] + @percent_ary = nil + return + elsif token == :tstring_end && data =~ /\A\s/ + rng = @percent_ary.source_range + rng = Range.new(rng.first, rng.last + data.length) + @percent_ary.source_range = rng + @tokens << [token, data, [lineno, charno]] + @percent_ary = nil + return + end + end + + if @tokens.last && (@tokens.last[0] == :symbeg || + (@tokens.last[0] == :symbol && token.to_s =~ /^tstring/)) + @tokens[-1] = [:symbol, @tokens.last[1] + data, @tokens.last[2]] + elsif @heredoc_state == :started + @heredoc_tokens << [token, data, [lineno, charno]] + + # fix ripper encoding of heredoc bug + # (see http://bugs.ruby-lang.org/issues/6200) + data.force_encoding(file_encoding) if file_encoding + + @heredoc_state = :ended if token == :heredoc_end + elsif (token == :nl || token == :comment) && @heredoc_state == :ended + @heredoc_tokens.unshift([token, data, [lineno, charno]]) + @tokens += @heredoc_tokens + @heredoc_tokens = nil + @heredoc_state = nil + else + @tokens << [token, data, [lineno, charno]] + if token == :heredoc_beg + @heredoc_state = :started + @heredoc_tokens = [] + end + end + end + + undef on_program + undef on_assoc_new + undef on_array + undef on_hash + undef on_bare_assoc_hash + undef on_assoclist_from_args + undef on_aref + undef on_aref_field + undef on_lbracket + undef on_rbracket + undef on_string_literal + undef on_lambda + undef on_unary + undef on_string_content + undef on_rescue + undef on_void_stmt + undef on_params + undef on_label + undef on_comment + undef on_embdoc_beg + undef on_embdoc + undef on_embdoc_end + undef on_parse_error + undef on_bodystmt + undef on_top_const_ref + undef on_const_path_ref + undef on_dyna_symbol + + def on_program(*args) + args.first + end + + def on_body_stmt(*args) + args.compact.size == 1 ? args.first : AstNode.new(:list, args) + end + alias on_bodystmt on_body_stmt + + def on_assoc_new(*args) + AstNode.new(:assoc, args) + end + + def on_hash(*args) + visit_event AstNode.new(:hash, args.first || []) + end + + def on_bare_assoc_hash(*args) + AstNode.new(:list, args.first) + end + + def on_assoclist_from_args(*args) + args.first + end + + def on_unary(op, val) + map = @map[op.to_s[0, 1]] + lstart, sstart = *(map ? map.pop : [lineno, @ns_charno - 1]) + node = AstNode.node_class_for(:unary).new(:unary, [op, val]) + node.source_range = Range.new(sstart, @ns_charno - 1) + node.line_range = Range.new(lstart, lineno) + node + end + + def on_aref(*args) + @map[:lbracket].pop + ll, lc = *@map[:aref].shift + sr = args.first.source_range.first..lc + lr = args.first.line_range.first..ll + AstNode.new(:aref, args, :char => sr, :line => lr) + end + + def on_aref_field(*args) + @map[:lbracket].pop + AstNode.new(:aref_field, args, + :listline => lineno..lineno, :listchar => charno...charno) + end + + def on_array(other) + node = AstNode.node_class_for(:array).new(:array, [other]) + map = @map[MAPPINGS[node.type]] + if map && !map.empty? + lstart, sstart = *map.pop + node.source_range = Range.new(sstart, @ns_charno - 1) + node.line_range = Range.new(lstart, lineno) + else + sstart = other.source_range.begin + lstart = other.line_range.begin + node.source_range = Range.new(sstart, @ns_charno - 1) + node.line_range = Range.new(lstart, lineno) + node.source_range = other.source_range + node.line_range = other.line_range + end + node + end + + def on_lbracket(tok) + (@map[:lbracket] ||= []) << [lineno, charno] + visit_ns_token(:lbracket, tok, false) + end + + def on_rbracket(tok) + (@map[:aref] ||= []) << [lineno, charno] + visit_ns_token(:rbracket, tok, false) + end + + def on_dyna_symbol(sym) + rng = if sym.source_range.to_a.size == 0 # rubocop:disable Style/ZeroLengthPredicate + (sym.source_range.begin - 3)...sym.source_range.end + else + (sym.source_range.begin - 2)..(sym.source_range.end + 1) + end + AstNode.new(:dyna_symbol, [sym], :line => lineno..lineno, + :listline => lineno..lineno, :listchar => rng, :char => rng) + end + + def on_top_const_ref(*args) + type = :top_const_ref + node = AstNode.node_class_for(type).new(type, args) + mapping = @map[MAPPINGS[type]] + extra_op = mapping.last[1] + 2 == charno ? mapping.pop : nil + lstart, sstart = *mapping.pop + node.source_range = Range.new(sstart, args.last.source_range.last) + node.line_range = Range.new(lstart, args.last.line_range.last) + mapping.push(extra_op) if extra_op + node + end + + def on_const_path_ref(*args) + ReferenceNode.new(:const_path_ref, args, :listline => lineno..lineno, :listchar => charno..charno) + end + + [:if_mod, :unless_mod, :while_mod, :until_mod].each do |kw| + node_class = AstNode.node_class_for(kw) + module_eval(<<-eof, __FILE__, __LINE__ + 1) + begin; undef on_#{kw}; rescue NameError; end + def on_#{kw}(*args) + mapping = @map[#{kw.to_s.sub(/_mod$/, '').inspect}] + mapping.pop if mapping + sr = args.last.source_range.first..args.first.source_range.last + lr = args.last.line_range.first..args.first.line_range.last + #{node_class}.new(:#{kw}, args, :line => lr, :char => sr) + end + eof + end + + %w(symbols qsymbols words qwords).each do |kw| + module_eval(<<-eof, __FILE__, __LINE__ + 1) + begin; undef on_#{kw}_new; rescue NameError; end + def on_#{kw}_new(*args) + node = LiteralNode.new(:#{kw}_literal, args) + @percent_ary = node + if @map[:#{kw}_beg] + lstart, sstart = *@map[:#{kw}_beg].pop + node.source_range = Range.new(sstart, @ns_charno-1) + node.line_range = Range.new(lstart, lineno) + end + node + end + + begin; undef on_#{kw}_add; rescue NameError; end + def on_#{kw}_add(list, item) + last = @source[@ns_charno,1] == "\n" ? @ns_charno - 1 : @ns_charno + list.source_range = (list.source_range.first..last) + list.line_range = (list.line_range.first..lineno) + list.push(item) + list + end + eof + end + + def on_string_literal(*args) + node = visit_event_arr(LiteralNode.new(:string_literal, args)) + if args.size == 1 + r = args[0].source_range + if node.source_range != Range.new(r.first - 1, r.last + 1) + klass = AstNode.node_class_for(node[0].type) + r = Range.new(node.source_range.first + 1, node.source_range.last - 1) + node[0] = klass.new(node[0].type, [@source[r]], :line => node.line_range, :char => r) + end + end + node + end + + def on_lambda(*args) + visit_event_arr AstNode.new(:lambda, args) + end + + def on_string_content(*args) + chr_rng = args.empty? ? charno...charno : charno..charno + AstNode.new(:string_content, args, :listline => lineno..lineno, :listchar => chr_rng) + end + + def on_rescue(exc, *args) + exc = AstNode.new(:list, exc) if exc + visit_event AstNode.new(:rescue, [exc, *args]) + end + + def on_void_stmt + AstNode.new(:void_stmt, [], :line => lineno..lineno, :char => charno...charno) + end + + def on_params(*args) + args.map! do |arg| + next arg unless arg.class == Array + + if arg.first.class == Array + arg.map! do |sub_arg| + next sub_arg unless sub_arg.class == Array + type = sub_arg[0].type == :label ? + :named_arg : :unnamed_optional_arg + AstNode.new(type, sub_arg, :listline => lineno..lineno, :listchar => charno..charno) + end + end + + AstNode.new(:list, arg, :listline => lineno..lineno, :listchar => charno..charno) + end + + ParameterNode.new(:params, args, :listline => lineno..lineno, :listchar => charno..charno) + end + + def on_label(data) + add_token(:label, data) + ch = charno + @charno += data.length + @ns_charno = charno + AstNode.new(:label, [data[0...-1]], :line => lineno..lineno, :char => ch..charno - 1, :token => true) + end + + def on_comment(comment) + not_comment = false + if @last_ns_token.nil? || @last_ns_token.empty? + if comment =~ SourceParser::SHEBANG_LINE && !@encoding_line + @shebang_line = comment + not_comment = true + elsif comment =~ SourceParser::ENCODING_LINE + @encoding_line = comment + not_comment = true + elsif comment =~ SourceParser::FROZEN_STRING_LINE + @frozen_string_line = comment + not_comment = true + end + end + + ch = charno + visit_ns_token(:comment, comment) + if not_comment + @last_ns_token = nil + return + end + + source_range = ch..(charno - 1) + comment = comment.gsub(/^(\#+)\s{0,1}/, '').chomp + append_comment = @comments[lineno - 1] + + hash_flag = $1 == '##' ? true : false + + if append_comment && @comments_last_column && + @comments_last_column == column && comment_starts_line?(ch) + @comments.delete(lineno - 1) + @comments_flags[lineno] = @comments_flags[lineno - 1] + @comments_flags.delete(lineno - 1) + range = @comments_range.delete(lineno - 1) + source_range = range.first..source_range.last + comment = append_comment + "\n" + comment + end + + @comments[lineno] = comment + @comments_range[lineno] = source_range + @comments_flags[lineno] = hash_flag unless append_comment + @comments_last_column = column + end + + def on_embdoc_beg(text) + visit_ns_token(:embdoc_beg, text) + @embdoc_start = charno - text.length + @embdoc = String.new("") + end + + def on_embdoc(text) + visit_ns_token(:embdoc, text) + @embdoc << text + end + + def on_embdoc_end(text) + visit_ns_token(:embdoc_end, text) + @comments_last_column = nil + @comments[lineno] = @embdoc + @comments_range[lineno] = @embdoc_start...charno + @embdoc_start = nil + @embdoc = nil + end + + def on_parse_error(msg) + raise ParserSyntaxError, "syntax error in `#{file}`:(#{lineno},#{column}): #{msg}" + end + alias compile_error on_parse_error + + def comment_starts_line?(charno) + (charno - 1).downto(0) do |i| + ch = @source[i] + break if ch == "\n" + return false if ch != " " && ch != "\t" + end + true + end + + def insert_comments + root.traverse do |node| + next if [:comment, :void_stmt, :list].include?(node.type) || node.parent.type != :list + + # never attach comments to if/unless mod nodes + if node.type == :if_mod || node.type == :unless_mod + node = node.then_block + end + + # check upwards from line before node; check node's line at the end + ((node.line - 1).downto(node.line - 2).to_a + [node.line]).each do |line| + comment = @comments[line] + if comment && !comment.empty? + add_comment(line, node) + break + end + end + + @comments.keys.each do |line| + add_comment(line, nil, node) if node.line > line + end + end + + # insert any lone unadded comments before node + root.traverse do |node| + next if node.type == :list || node.parent.type != :list + @comments.keys.each do |line| + next unless node.line_range.include?(line) + pick = nil + node.traverse do |subnode| + next unless subnode.type == :list + pick ||= subnode + next unless subnode.line_range.include?(line) + pick = subnode + end + add_comment(line, nil, pick, true) if pick + end + end unless @comments.empty? + + # insert all remaining comments + @comments.each do |line, _comment| + add_comment(line, nil, root, true) + end + + @comments = {} + end + + def add_comment(line, node = nil, before_node = nil, into = false) + comment = @comments[line] + source_range = @comments_range[line] + line_range = ((line - comment.count("\n"))..line) + if node.nil? + node = CommentNode.new(:comment, [comment], :line => line_range, :char => source_range) + if into + before_node.push(node) + before_node.unfreeze + node.parent = before_node + elsif before_node + parent_node = before_node.parent + idx = parent_node.index(before_node) + parent_node.insert(idx, node) + parent_node.unfreeze + node.parent = parent_node + end + end + node.docstring = comment + node.docstring_hash_flag = @comments_flags[line] + node.docstring_range = line_range + @comments.delete(line) + @comments_range.delete(line) + @comments_flags.delete(line) + end + + def freeze_tree(node = nil) + @tokens = @tokens.sort_by {|t| t.last } + nodes = [node || root] + until nodes.empty? + p_node = nodes.shift + p_node.children.each do |child| + child.parent = p_node + nodes << child + end + end + end + end if defined?(::Ripper) + end + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/parser/ruby/token_resolver.rb b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/parser/ruby/token_resolver.rb new file mode 100644 index 000000000..56421acf5 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/parser/ruby/token_resolver.rb @@ -0,0 +1,158 @@ +# frozen_string_literal: true +module YARD + module Parser + module Ruby + # Supports {#each} enumeration over a source's tokens, yielding + # the token and a possible {CodeObjects::Base} associated with the + # constant or identifier token. + class TokenResolver + include Enumerable + include CodeObjects::NamespaceMapper + + # Creates a token resolver for given source. + # + # @param source [String] the source code to tokenize + # @param namespace [CodeObjects::Base] the object/namespace to resolve from + def initialize(source, namespace = Registry.root) + @tokens = RubyParser.parse(source, '(tokenize)').tokens + raise ParserSyntaxError if @tokens.empty? && !source.empty? + @default_namespace = namespace + end + + # Iterates over each token, yielding the token and a possible code + # object that is associated with the token. + # + # @yieldparam token [Array(Symbol,String,Array(Integer,Integer))] the + # current token object being iterated + # @yieldparam object [CodeObjects::Base, nil] the fully qualified code + # object associated with the current token, or nil if there is no object + # for the yielded token. + # @example Yielding code objects + # r = TokenResolver.new("A::B::C") + # r.each do |tok, obj| + # if obj + # puts "#{tok[0]} -> #{obj.path.inspect}" + # else + # puts "No object: #{tok.inspect}" + # end + # end + # + # # Prints: + # # :const -> "A" + # # No object: [:op, "::"] + # # :const -> "A::B" + # # No object: [:op, "::"] + # # :const -> "A::B::C" + def each + @states = [] + push_state + @tokens.each do |token| + yield_obj = false + + if skip_group && [:const, :ident, :op, :period].include?(token[0]) + yield token, nil + next + else + self.skip_group = false + end + + case token[0] + when :const + lookup(token[0], token[1]) + yield_obj = true + self.last_sep = nil + when :ident + lookup(token[0], token[1]) + yield_obj = true + self.last_sep = nil + when :op, :period + self.last_sep = token[1] + unless CodeObjects.types_for_separator(token[1]) + self.object = nil + self.last_sep = nil + end + when :lparen + push_state + when :rparen + pop_state + else + self.object = nil + end + + yield token, (yield_obj ? object : nil) + + if next_object + self.object = next_object + self.next_object = nil + end + self.skip_group = true if yield_obj && object.nil? + end + end + + def self.state_attr(*attrs) + attrs.each do |attr| + define_method(attr) { @states.last[attr.to_sym] } + define_method("#{attr}=") {|v| @states.last[attr.to_sym] = v } + protected attr, :"#{attr}=" + end + end + + private + + def push_state + @states.push :object => nil, :skip_group => false, :last_sep => nil + end + + def pop_state + @states.pop + end + + state_attr :object, :next_object, :skip_group, :last_sep + + def lookup(toktype, name) + types = object_resolved_types + return self.object = nil if types.empty? + + if toktype == :const + types.any? do |type| + prefix = type ? type.path : "" + prefix += last_sep.to_s if separators.include?(last_sep.to_s) + self.object = Registry.resolve(@default_namespace, "#{prefix}#{name}", true) + end + else # ident + types.any? do |type| + obj = Registry.resolve(type, name, true) + if obj.nil? && name == "new" + obj = Registry.resolve(object, "#initialize", true) + self.next_object = object if obj.nil? + end + self.object = obj + end + end + end + + def object_resolved_types(obj = object) + return [obj] unless obj.is_a?(CodeObjects::MethodObject) + + resolved_types = [] + tags = obj.tags(:return) + tags += obj.tags(:overload).map {|o| o.tags(:return) }.flatten + tags.each do |tag| + next if tag.types.nil? + tag.types.each do |type| + type = type.sub(/<.+>/, '') + if type == "self" + resolved_types << obj.parent + else + type_obj = Registry.resolve(obj, type, true) + resolved_types << type_obj if type_obj + end + end + end + + resolved_types + end + end + end + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/parser/source_parser.rb b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/parser/source_parser.rb new file mode 100644 index 000000000..8d133e193 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/parser/source_parser.rb @@ -0,0 +1,526 @@ +# frozen_string_literal: true +require 'stringio' +require 'ostruct' + +module YARD + module Parser + # Raised when an object is recognized but cannot be documented. This + # generally occurs when the Ruby syntax used to declare an object is + # too dynamic in nature. + class UndocumentableError < RuntimeError; end + + # Raised when the parser sees a Ruby syntax error + class ParserSyntaxError < UndocumentableError; end + + # Responsible for parsing a list of files in order. The + # {#parse} method of this class can be called from the + # {SourceParser#globals} globals state list to re-enter + # parsing for the remainder of files in the list recursively. + # + # @see Processor#parse_remaining_files + class OrderedParser + # @return [Array] the list of remaining files to parse + attr_accessor :files + + # Creates a new OrderedParser with the global state and a list + # of files to parse. + # + # @note OrderedParser sets itself as the +ordered_parser+ key on + # global_state for later use in {Handlers::Processor}. + # @param [OpenStruct] global_state a structure containing all global + # state during parsing + # @param [Array] files the list of files to parse + def initialize(global_state, files) + @global_state = global_state + @files = files.dup + @global_state.ordered_parser = self + end + + # Parses the remainder of the {#files} list. + # + # @see Processor#parse_remaining_files + def parse + until files.empty? + file = files.shift + log.capture("Parsing #{file}") do + SourceParser.new(SourceParser.parser_type, @global_state).parse(file) + end + end + end + end + + # Responsible for parsing a source file into the namespace. Parsing + # also invokes handlers to process the parsed statements and generate + # any code objects that may be recognized. + # + # == Custom Parsers + # SourceParser allows custom parsers to be registered and called when + # a certain filetype is recognized. To register a parser and hook it + # up to a set of file extensions, call {register_parser_type} + # + # @see register_parser_type + # @see Handlers::Base + # @see CodeObjects::Base + class SourceParser + SHEBANG_LINE = /\A\s*#!\S+/ + ENCODING_LINE = %r{\A(?:\s*#*!.*\r?\n)?\s*(?:#+|/\*+|//+).*coding\s*[:=]{1,2}\s*([a-z\d_\-]+)}i + FROZEN_STRING_LINE = /frozen(-|_)string(-|_)literal:\s+(true|false)/i + + # The default glob of files to be parsed. + # @since 0.9.0 + DEFAULT_PATH_GLOB = ["{lib,app}/**/*.rb", "ext/**/*.{c,cc,cxx,cpp,rb}"] + + # Byte order marks for various encodings + # @since 0.7.0 + ENCODING_BYTE_ORDER_MARKS = { + 'utf-8' => String.new("\xEF\xBB\xBF"), + # Not yet supported + # 'utf-16be' => "\xFE\xFF", + # 'utf-16le' => "\xFF\xFE", + # 'utf-32be' => "\x00\x00\xFF\xFE", + # 'utf-32le' => "\xFF\xFE", + } + + class << self + # @return [Symbol] the default parser type (defaults to :ruby) + attr_reader :parser_type + + def parser_type=(value) + @parser_type = validated_parser_type(value) + end + + # Parses a path or set of paths + # + # @param [String, Array] paths a path, glob, or list of paths to + # parse + # @param [Array] excluded a list of excluded path matchers + # @param [Fixnum] level the logger level to use during parsing. See + # {YARD::Logger} + # @return [void] + def parse(paths = DEFAULT_PATH_GLOB, excluded = [], level = log.level) + log.debug("Parsing #{paths.inspect} with `#{parser_type}` parser") + excluded = excluded.map do |path| + case path + when Regexp; path + else Regexp.new(path.to_s, Regexp::IGNORECASE) + end + end + files = [paths].flatten. + map {|p| File.directory?(p) ? "#{p}/**/*.{rb,c,cc,cxx,cpp}" : p }. + map {|p| p.include?("*") ? Dir[p].sort_by {|d| [d.length, d] } : p }.flatten. + reject {|p| !File.file?(p) || excluded.any? {|re| p =~ re } } + + log.enter_level(level) do + parse_in_order(*files.uniq) + end + end + + # Parses a string +content+ + # + # @param [String] content the block of code to parse + # @param [Symbol] ptype the parser type to use. See {parser_type}. + # @return the parser object that was used to parse +content+ + def parse_string(content, ptype = parser_type) + new(ptype).parse(StringIO.new(content)) + end + + # Tokenizes but does not parse the block of code + # + # @param [String] content the block of code to tokenize + # @param [Symbol] ptype the parser type to use. See {parser_type}. + # @return [Array] a list of tokens + def tokenize(content, ptype = parser_type) + new(ptype).tokenize(content) + end + + # Registers a new parser type. + # + # @example Registering a parser for "java" files + # SourceParser.register_parser_type :java, JavaParser, 'java' + # @param [Symbol] type a symbolic name for the parser type + # @param [Base] parser_klass a class that implements parsing and tokenization + # @param [Array, String, Regexp] extensions a list of extensions or a + # regex to match against the file extension + # @return [void] + # @see Parser::Base + def register_parser_type(type, parser_klass, extensions = nil) + unless Base > parser_klass + raise ArgumentError, "expecting parser_klass to be a subclass of YARD::Parser::Base" + end + parser_type_extensions[type.to_sym] = extensions if extensions + parser_types[type.to_sym] = parser_klass + end + + # @return [Hash{Symbol=>Object}] a list of registered parser types + # @private + # @since 0.5.6 + def parser_types; @@parser_types ||= {} end + def parser_types=(value) @@parser_types = value end + + # @return [Hash] a list of registered parser type extensions + # @private + # @since 0.5.6 + def parser_type_extensions; @@parser_type_extensions ||= {} end + def parser_type_extensions=(value) @@parser_type_extensions = value end + + # Finds a parser type that is registered for the extension. If no + # type is found, the default Ruby type is returned. + # + # @return [Symbol] the parser type to be used for the extension + # @since 0.5.6 + def parser_type_for_extension(extension) + type = parser_type_extensions.find do |_t, exts| + [exts].flatten.any? {|ext| ext === extension } + end + validated_parser_type(type ? type.first : :ruby) + end + + # Returns the validated parser type. Basically, enforces that :ruby + # type is never set if the Ripper library is not available + # + # @param [Symbol] type the parser type to set + # @return [Symbol] the validated parser type + # @private + def validated_parser_type(type) + !defined?(::Ripper) && type == :ruby ? :ruby18 : type + end + + # @group Parser Callbacks + + # Registers a callback to be called before a list of files is parsed + # via {parse}. The block passed to this method will be called on + # subsequent parse calls. + # + # @example Installing a simple callback + # SourceParser.before_parse_list do |files, globals| + # puts "Starting to parse..." + # end + # YARD.parse('lib/**/*.rb') + # # prints "Starting to parse..." + # + # @example Setting global state + # SourceParser.before_parse_list do |files, globals| + # globals.method_count = 0 + # end + # SourceParser.after_parse_list do |files, globals| + # puts "Found #{globals.method_count} methods" + # end + # class MyCountHandler < Handlers::Ruby::Base + # handles :def, :defs + # process { globals.method_count += 1 } + # end + # YARD.parse + # # Prints: "Found 37 methods" + # + # @example Using a global callback to cancel parsing + # SourceParser.before_parse_list do |files, globals| + # return false if files.include?('foo.rb') + # end + # + # YARD.parse(['foo.rb', 'bar.rb']) # callback cancels this method + # YARD.parse('bar.rb') # parses normally + # + # @yield [files, globals] the yielded block is called once before + # parsing all files + # @yieldparam [Array] files the list of files that will be parsed. + # @yieldparam [OpenStruct] globals a global structure to store arbitrary + # state for post processing (see {Handlers::Processor#globals}) + # @yieldreturn [Boolean] if the block returns +false+, parsing is + # cancelled. + # @return [Proc] the yielded block + # @see after_parse_list + # @see before_parse_file + # @since 0.7.0 + def before_parse_list(&block) + before_parse_list_callbacks << block + end + + # Registers a callback to be called after a list of files is parsed + # via {parse}. The block passed to this method will be called on + # subsequent parse calls. + # + # @example Printing results after parsing occurs + # SourceParser.after_parse_list do + # puts "Finished parsing!" + # end + # YARD.parse + # # Prints "Finished parsing!" after parsing files + # @yield [files, globals] the yielded block is called once before + # parsing all files + # @yieldparam [Array] files the list of files that will be parsed. + # @yieldparam [OpenStruct] globals a global structure to store arbitrary + # state for post processing (see {Handlers::Processor#globals}) + # @yieldreturn [void] the return value for the block is ignored. + # @return [Proc] the yielded block + # @see before_parse_list + # @see before_parse_file + # @since 0.7.0 + def after_parse_list(&block) + after_parse_list_callbacks << block + end + + # Registers a callback to be called before an individual file is parsed. + # The block passed to this method will be called on subsequent parse + # calls. + # + # To register a callback that is called before the entire list of files + # is processed, see {before_parse_list}. + # + # @example Installing a simple callback + # SourceParser.before_parse_file do |parser| + # puts "I'm parsing #{parser.file}" + # end + # YARD.parse('lib/**/*.rb') + # # prints: + # "I'm parsing lib/foo.rb" + # "I'm parsing lib/foo_bar.rb" + # "I'm parsing lib/last_file.rb" + # + # @example Cancel parsing of any test_*.rb files + # SourceParser.before_parse_file do |parser| + # return false if parser.file =~ /^test_.+\.rb$/ + # end + # + # @yield [parser] the yielded block is called once before each + # file that is parsed. This might happen many times for a single + # codebase. + # @yieldparam [SourceParser] parser the parser object that will {#parse} + # the file. + # @yieldreturn [Boolean] if the block returns +false+, parsing for + # the file is cancelled. + # @return [Proc] the yielded block + # @see after_parse_file + # @see before_parse_list + # @since 0.7.0 + def before_parse_file(&block) + before_parse_file_callbacks << block + end + + # Registers a callback to be called after an individual file is parsed. + # The block passed to this method will be called on subsequent parse + # calls. + # + # To register a callback that is called after the entire list of files + # is processed, see {after_parse_list}. + # + # @example Printing the length of each file after it is parsed + # SourceParser.after_parse_file do |parser| + # puts "#{parser.file} is #{parser.contents.size} characters" + # end + # YARD.parse('lib/**/*.rb') + # # prints: + # "lib/foo.rb is 1240 characters" + # "lib/foo_bar.rb is 248 characters" + # + # @yield [parser] the yielded block is called once after each file + # that is parsed. This might happen many times for a single codebase. + # @yieldparam [SourceParser] parser the parser object that parsed + # the file. + # @yieldreturn [void] the return value for the block is ignored. + # @return [Proc] the yielded block + # @see before_parse_file + # @see after_parse_list + # @since 0.7.0 + def after_parse_file(&block) + after_parse_file_callbacks << block + end + + # @return [Array] the list of callbacks to be called before + # parsing a list of files. Should only be used for testing. + # @since 0.7.0 + def before_parse_list_callbacks + @before_parse_list_callbacks ||= [] + end + + # @return [Array] the list of callbacks to be called after + # parsing a list of files. Should only be used for testing. + # @since 0.7.0 + def after_parse_list_callbacks + @after_parse_list_callbacks ||= [] + end + + # @return [Array] the list of callbacks to be called before + # parsing a file. Should only be used for testing. + # @since 0.7.0 + def before_parse_file_callbacks + @before_parse_file_callbacks ||= [] + end + + # @return [Array] the list of callbacks to be called after + # parsing a file. Should only be used for testing. + # @since 0.7.0 + def after_parse_file_callbacks + @after_parse_file_callbacks ||= [] + end + + # @endgroup + + private + + # Parses a list of files in a queue. + # + # @param [Array] files a list of files to queue for parsing + # @return [void] + def parse_in_order(*files) + global_state = OpenStruct.new + + return if before_parse_list_callbacks.any? do |cb| + cb.call(files, global_state) == false + end + + OrderedParser.new(global_state, files).parse + + after_parse_list_callbacks.each do |cb| + cb.call(files, global_state) + end + end + end + + register_parser_type :ruby, Ruby::RubyParser + register_parser_type :ruby18, Ruby::Legacy::RubyParser + register_parser_type :c, C::CParser, ['c', 'cc', 'cxx', 'cpp'] + + self.parser_type = :ruby + + # @return [String] the filename being parsed by the parser. + attr_accessor :file + + # @return [Symbol] the parser type associated with the parser instance. + # This should be set by the {#initialize constructor}. + attr_reader :parser_type + + # @return [OpenStruct] an open struct containing arbitrary global state + # shared between files and handlers. + # @since 0.7.0 + attr_reader :globals + + # @return [String] the contents of the file to be parsed + # @since 0.7.0 + attr_reader :contents + + # @overload initialize(parser_type = SourceParser.parser_type, globals = nil) + # Creates a new parser object for code parsing with a specific parser type. + # + # @param [Symbol] parser_type the parser type to use + # @param [OpenStruct] globals global state to be re-used across separate source files + def initialize(parser_type = SourceParser.parser_type, globals1 = nil, globals2 = nil) + globals = [true, false].include?(globals1) ? globals2 : globals1 + @file = '(stdin)' + @globals = globals || OpenStruct.new + self.parser_type = parser_type + end + + # The main parser method. This should not be called directly. Instead, + # use the class methods {parse} and {parse_string}. + # + # @param [String, #read, Object] content the source file to parse + # @return [Object, nil] the parser object used to parse the source + def parse(content = __FILE__) + case content + when String + @file = File.cleanpath(content) + content = convert_encoding(String.new(File.read_binary(file))) + checksum = Registry.checksum_for(content) + return if Registry.checksums[file] == checksum + + if Registry.checksums.key?(file) + log.info "File '#{file}' was modified, re-processing..." + end + Registry.checksums[@file] = checksum + self.parser_type = parser_type_for_filename(file) + else + content = content.read if content.respond_to? :read + end + + @contents = content + @parser = parser_class.new(content, file) + + self.class.before_parse_file_callbacks.each do |cb| + return @parser if cb.call(self) == false + end + + @parser.parse + post_process + + self.class.after_parse_file_callbacks.each do |cb| + cb.call(self) + end + + @parser + rescue ArgumentError, NotImplementedError => e + log.warn("Cannot parse `#{file}': #{e.message}") + log.backtrace(e, :warn) + rescue ParserSyntaxError => e + log.warn(e.message.capitalize) + log.backtrace(e, :warn) + end + + # Tokenizes but does not parse the block of code using the current {#parser_type} + # + # @param [String] content the block of code to tokenize + # @return [Array] a list of tokens + def tokenize(content) + @parser = parser_class.new(content, file) + @parser.tokenize + end + + private + + # Searches for encoding line and forces encoding + # @since 0.5.3 + def convert_encoding(content) + return content unless content.respond_to?(:force_encoding) + if content =~ ENCODING_LINE + content.force_encoding($1) + else + content.force_encoding('binary') + ENCODING_BYTE_ORDER_MARKS.each do |encoding, bom| + bom.force_encoding('binary') + if content[0, bom.size] == bom + content.force_encoding(encoding) + return content + end + end + content.force_encoding('utf-8') # UTF-8 is default encoding + content + end + end + + # Runs a {Handlers::Processor} object to post process the parsed statements. + # @return [void] + def post_process + return unless @parser.respond_to?(:enumerator) + + enumerator = @parser.enumerator + if enumerator + post = Handlers::Processor.new(self) + post.process(enumerator) + end + end + + def parser_type=(value) + @parser_type = self.class.validated_parser_type(value) + end + + # Guesses the parser type to use depending on the file extension. + # + # @param [String] filename the filename to use to guess the parser type + # @return [Symbol] a parser type that matches the filename + def parser_type_for_filename(filename) + ext = (File.extname(filename)[1..-1] || "").downcase + type = self.class.parser_type_for_extension(ext) + parser_type == :ruby18 && type == :ruby ? :ruby18 : type + end + + # @since 0.5.6 + def parser_class + klass = self.class.parser_types[parser_type] + unless klass + raise ArgumentError, "invalid parser type '#{parser_type}' or unrecognized file", caller[1..-1] + end + + klass + end + end + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/rake/yardoc_task.rb b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/rake/yardoc_task.rb new file mode 100644 index 000000000..a1597f5f9 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/rake/yardoc_task.rb @@ -0,0 +1,81 @@ +# frozen_string_literal: true +require 'rake' +require 'rake/tasklib' + +module YARD + module Rake + # The rake task to run {CLI::Yardoc} and generate documentation. + class YardocTask < ::Rake::TaskLib + # The name of the task + # @return [String] the task name + attr_accessor :name + + # Options to pass to {CLI::Yardoc} + # @return [Array] the options passed to the commandline utility + attr_accessor :options + + # Options to pass to {CLI::Stats} + # @return [Array] the options passed to the stats utility + attr_accessor :stats_options + + # The Ruby source files (and any extra documentation files separated by '-') + # to process. + # @example Task files assignment + # YARD::Rake::YardocTask.new do |t| + # t.files = ['app/**/*.rb', 'lib/**/*.rb', '-', 'doc/FAQ.md', 'doc/Changes.md'] + # end + # @return [Array] a list of files + attr_accessor :files + + # Runs a +Proc+ before the task + # @return [Proc] a proc to call before running the task + attr_accessor :before + + # Runs a +Proc+ after the task + # @return [Proc] a proc to call after running the task + attr_accessor :after + + # @return [Verifier, Proc] an optional {Verifier} to run against all objects + # being generated. Any object that the verifier returns false for will be + # excluded from documentation. This attribute can also be a lambda. + # @see Verifier + attr_accessor :verifier + + # Creates a new task with name +name+. + # + # @param [String, Symbol] name the name of the rake task + # @yield a block to allow any options to be modified on the task + # @yieldparam [YardocTask] _self the task object to allow any parameters + # to be changed. + def initialize(name = :yard) + @name = name + @options = [] + @stats_options = [] + @files = [] + + yield self if block_given? + self.options += ENV['OPTS'].split(/[ ,]/) if ENV['OPTS'] + self.files += ENV['FILES'].split(/[ ,]/) if ENV['FILES'] + self.options << '--no-stats' unless stats_options.empty? + + define + end + + protected + + # Defines the rake task + # @return [void] + def define + desc "Generate YARD Documentation" unless ::Rake.application.last_description + task(name) do + before.call if before.is_a?(Proc) + yardoc = YARD::CLI::Yardoc.new + yardoc.options[:verifier] = verifier if verifier + yardoc.run(*(options + files)) + YARD::CLI::Stats.run(*(stats_options + ['--use-cache'])) unless stats_options.empty? + after.call if after.is_a?(Proc) + end + end + end + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/registry.rb b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/registry.rb new file mode 100644 index 000000000..d70a442ea --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/registry.rb @@ -0,0 +1,439 @@ +# frozen_string_literal: true +require 'fileutils' +require 'digest/sha1' + +module YARD + # The +Registry+ is the centralized data store for all {CodeObjects} created + # during parsing. The storage is a key value store with the object's path + # (see {CodeObjects::Base#path}) as the key and the object itself as the value. + # Object paths must be unique to be stored in the Registry. All lookups for + # objects are done on the singleton Registry instance using the {Registry.at} + # or {Registry.resolve} methods. + # + # == Saving / Loading a Registry + # The registry is saved to a "yardoc file" (actually a directory), which can + # be loaded back to perform any lookups. See {Registry.load!} and + # {Registry.save} for information on saving and loading of a yardoc file. + # + # == Threading Notes + # The registry class is a singleton class that is accessed directly in many + # places across YARD. To mitigate threading issues, YARD (0.6.5+) makes + # the Registry thread local. This means all access to a registry for a specific + # object set must occur in the originating thread. + # + # @example Loading the Registry + # Registry.load!('/path/to/yardocfile') # loads all objects into memory + # Registry.at('YARD::CodeObjects::Base').docstring + # # => "+Base+ is the superclass of all code objects ..." + # @example Getting an object by a specific path + # Registry.at('YARD::CodeObjects::Base#docstring') + # @example Performing a lookup on a method anywhere in the inheritance tree + # Registry.resolve(P('YARD::CodeObjects::Base'), '#docstring', true) + module Registry + DEFAULT_YARDOC_FILE = ".yardoc" + LOCAL_YARDOC_INDEX = File.expand_path(File.join(Config::CONFIG_DIR, 'gem_index')) + DEFAULT_PO_DIR = "po" + + extend Enumerable + + class << self + # @group Getting .yardoc File Locations + + # Returns the .yardoc file associated with a gem. + # + # @param [String] gem the name of the gem to search for + # @param [String] ver_require an optional Gem version requirement + # @param [Boolean] for_writing whether or not the method should search + # for writable locations + # @return [String] if +for_writing+ is set to +true+, returns the best + # location suitable to write the .yardoc file. Otherwise, the first + # existing location associated with the gem's .yardoc file. + # @return [nil] if +for_writing+ is set to false and no yardoc file + # is found, returns nil. + def yardoc_file_for_gem(gem, ver_require = ">= 0", for_writing = false) + specs = YARD::GemIndex.find_all_by_name(gem, ver_require) + return if specs.empty? + + result = nil + specs.reverse.each do |spec| + if gem =~ /^yard-doc-/ + path = File.join(spec.full_gem_path, DEFAULT_YARDOC_FILE) + result = File.exist?(path) && !for_writing ? path : nil + result ? break : next + end + + if for_writing + result = global_yardoc_file(spec, for_writing) || + old_global_yardoc_file(spec, for_writing) || + local_yardoc_file(spec, for_writing) + else + result = local_yardoc_file(spec, for_writing) || + global_yardoc_file(spec, for_writing) || + old_global_yardoc_file(spec, for_writing) + end + + break if result + end + + result + end + + # Gets/sets the yardoc filename + # @return [String] the yardoc filename + # @see DEFAULT_YARDOC_FILE + attr_accessor :yardoc_file + undef yardoc_file, yardoc_file= + def yardoc_file=(v) Thread.current[:__yard_yardoc_file__] = v end + + def yardoc_file + Thread.current[:__yard_yardoc_file__] ||= DEFAULT_YARDOC_FILE + end + + # @group Loading Data from Disk + + # Loads the registry and/or parses a list of files + # + # @example Loads the yardoc file or parses files 'a', 'b' and 'c' (but not both) + # Registry.load(['a', 'b', 'c']) + # @example Reparses files 'a' and 'b' regardless of whether yardoc file exists + # Registry.load(['a', 'b'], true) + # @param [String, Array] files if +files+ is an Array, it should represent + # a list of files that YARD should parse into the registry. If reload is + # set to false and the yardoc file already exists, these files are skipped. + # If files is a String, it should represent the yardoc file to load + # into the registry. + # @param [Boolean] reparse if reparse is false and a yardoc file already + # exists, any files passed in will be ignored. + # @return [Registry] the registry object (for chaining) + # @raise [ArgumentError] if files is not a String or Array + def load(files = [], reparse = false) + if files.is_a?(Array) + if File.exist?(yardoc_file) && !reparse + load_yardoc + else + size = thread_local_store.keys.size + YARD.parse(files) + save if thread_local_store.keys.size > size + end + elsif files.is_a?(String) + load_yardoc(files) + else + raise ArgumentError, "Must take a list of files to parse or the .yardoc file to load." + end + self + end + + # Loads a yardoc file directly + # + # @param [String] file the yardoc file to load. + # @return [Registry] the registry object (for chaining) + def load_yardoc(file = yardoc_file) + clear + thread_local_store.load(file) + self + end + + # Loads a yardoc file and forces all objects cached on disk into + # memory. Equivalent to calling {load_yardoc} followed by {load_all} + # + # @param [String] file the yardoc file to load + # @return [Registry] the registry object (for chaining) + # @see #load_yardoc + # @see #load_all + # @since 0.5.1 + def load!(file = yardoc_file) + clear + thread_local_store.load!(file) + self + end + + # Forces all objects cached on disk into memory + # + # @example Loads all objects from disk + # Registry.load + # Registry.all.count #=> 0 + # Registry.load_all + # Registry.all.count #=> 17 + # @return [Registry] the registry object (for chaining) + # @since 0.5.1 + def load_all + thread_local_store.load_all + self + end + + # @group Saving and Deleting Data from Disk + + # Saves the registry to +file+ + # + # @param [String] file the yardoc file to save to + # @return [Boolean] true if the file was saved + def save(merge = false, file = yardoc_file) + thread_local_store.save(merge, file) + end + + # Deletes the yardoc file from disk + # @return [void] + def delete_from_disk + thread_local_store.destroy + end + + # @group Adding and Deleting Objects from the Registry + + # Registers a new object with the registry + # + # @param [CodeObjects::Base] object the object to register + # @return [CodeObjects::Base] the registered object + def register(object) + return if object.is_a?(CodeObjects::Proxy) + thread_local_store[object.path] = object + end + + # Deletes an object from the registry + # @param [CodeObjects::Base] object the object to remove + # @return [void] + def delete(object) + thread_local_store.delete(object.path) + end + + # Clears the registry + # @return [void] + def clear + self.thread_local_store = RegistryStore.new + end + + # Creates a pessmistic transactional lock on the database for writing. + # Use with {YARD.parse} to ensure the database is not written multiple + # times. + # + # @see locked_for_writing? + def lock_for_writing(file = yardoc_file, &block) + thread_local_store.lock_for_writing(file, &block) + end + + # (see Serializers::YardocSerializer#locked_for_writing?) + def locked_for_writing?(file = yardoc_file) + thread_local_store.locked_for_writing?(file) + end + + # @group Accessing Objects in the Registry + + # Iterates over {all} with no arguments + def each(&block) + all.each(&block) + end + + # Returns all objects in the registry that match one of the types provided + # in the +types+ list (if +types+ is provided). + # + # @example Returns all objects + # Registry.all + # @example Returns all classes and modules + # Registry.all(:class, :module) + # @param [Array] types an optional list of types to narrow the + # objects down by. Equivalent to performing a select: + # +Registry.all.select {|o| types.include(o.type) }+ + # @return [Array] the list of objects found + # @see CodeObjects::Base#type + def all(*types) + if types.empty? + thread_local_store.values.select {|obj| obj != root } + else + list = [] + types.each do |type| + list += thread_local_store.values_for_type(type) + end + list + end + end + + # Returns the paths of all of the objects in the registry. + # @param [Boolean] reload whether to load entire database + # @return [Array] all of the paths in the registry. + def paths(reload = false) + thread_local_store.keys(reload).map(&:to_s) + end + + # Returns the object at a specific path. + # @param [String, :root] path the pathname to look for. If +path+ is +root+, + # returns the {root} object. + # @return [CodeObjects::Base] the object at path + # @return [nil] if no object is found + def at(path) path ? thread_local_store[path] : nil end + alias [] at + + # The root namespace object. + # @return [CodeObjects::RootObject] the root object in the namespace + def root; thread_local_store[:root] end + + # @param [String] name the locale name. + # @return [I18n::Locale] the locale object for +name+. + # @since 0.8.3 + def locale(name) + thread_local_store.locale(name) + end + + # Attempts to find an object by name starting at +namespace+, performing + # a lookup similar to Ruby's method of resolving a constant in a namespace. + # + # @example Looks for instance method #reverse starting from A::B::C + # Registry.resolve(P("A::B::C"), "#reverse") + # @example Looks for a constant in the root namespace + # Registry.resolve(nil, 'CONSTANT') + # @example Looks for a class method respecting the inheritance tree + # Registry.resolve(myclass, 'mymethod', true) + # @example Looks for a constant but returns a proxy if not found + # Registry.resolve(P('A::B::C'), 'D', false, true) # => # + # @example Looks for a complex path from a namespace + # Registry.resolve(P('A::B'), 'B::D') # => # + # @param [CodeObjects::NamespaceObject, nil] namespace the starting namespace + # (module or class). If +nil+ or +:root+, starts from the {root} object. + # @param [String, Symbol] name the name (or complex path) to look for from + # +namespace+. + # @param [Boolean] inheritance Follows inheritance chain (mixins, superclass) + # when performing name resolution if set to +true+. + # @param [Boolean] proxy_fallback If +true+, returns a proxy representing + # the unresolved path (namespace + name) if no object is found. + # @param [Symbol, nil] type the {CodeObjects::Base#type} that the resolved + # object must be equal to. No type checking if nil. + # @return [CodeObjects::Base] the object if it is found + # @return [CodeObjects::Proxy] a Proxy representing the object if + # +proxy_fallback+ is +true+. + # @return [nil] if +proxy_fallback+ is +false+ and no object was found. + # @see P + def resolve(namespace, name, inheritance = false, proxy_fallback = false, type = nil) + thread_local_resolver.lookup_by_path name, + :namespace => namespace, :inheritance => inheritance, + :proxy_fallback => proxy_fallback, :type => type + end + + # @group Managing Source File Checksums + + # @return [Hash{String => String}] a set of checksums for files + def checksums + thread_local_store.checksums + end + + # @param [String] data data to checksum + # @return [String] the SHA1 checksum for data + def checksum_for(data) + Digest::SHA1.hexdigest(data) + end + + # @group Managing Internal State (Advanced / Testing Only) + + # Whether or not the Registry storage should load everything into a + # single object database (for disk efficiency), or spread them out + # (for load time efficiency). + # + # @note Setting this attribute to nil will offload the decision to + # the {RegistryStore storage adapter}. + # @return [Boolean, nil] if this value is set to nil, the storage + # adapter will decide how to store the data. + attr_accessor :single_object_db + undef single_object_db, single_object_db= + def single_object_db=(v) Thread.current[:__yard_single_db__] = v end + def single_object_db; Thread.current[:__yard_single_db__] end + + # The assumed types of a list of paths. This method is used by CodeObjects::Base + # @return [{String => Symbol}] a set of unresolved paths and their assumed type + # @private + # @deprecated The registry no longer globally tracks proxy types. + def proxy_types + thread_local_store.proxy_types + end + + # @group I18n features + + # Gets/sets the directory that has LANG.po files + # @return [String] the directory that has .po files + attr_accessor :po_dir + undef po_dir, po_dir= + def po_dir=(dir) Thread.current[:__yard_po_dir__] = dir end + + def po_dir + Thread.current[:__yard_po_dir__] ||= DEFAULT_PO_DIR + end + + # @group Legacy Methods + + # The registry singleton instance. + # + # @deprecated use Registry.methodname directly. + # @return [Registry] returns the registry instance + def instance; self end + + private + + # @group Accessing Objects in the Registry + + # Attempts to resolve a name in a namespace + # + # @param [CodeObjects::NamespaceObject] namespace the starting namespace + # @param [String] name the name to look for + # @param [Symbol, nil] type the {CodeObjects::Base#type} that the resolved + # object must be equal to + def partial_resolve(namespace, name, type = nil) + obj = at(name) || at('#' + name) if namespace.root? + return obj if obj && (type.nil? || obj.type == type) + [CodeObjects::NSEP, CodeObjects::CSEP, ''].each do |s| + next if s.empty? && name =~ /^\w/ + path = name + path = [namespace.path, name].join(s) if namespace != root + found = at(path) + return found if found && (type.nil? || found.type == type) + end + nil + end + + # @group Retrieving yardoc File Locations + + def global_yardoc_file(spec, for_writing = false) + path = spec.doc_dir + yfile = spec.doc_dir(DEFAULT_YARDOC_FILE) + if for_writing + if File.writable?(path) || + (!File.directory?(path) && File.writable?(File.dirname(path))) + return yfile + end + elsif !for_writing && File.exist?(yfile) + return yfile + end + end + + def old_global_yardoc_file(spec, for_writing = false) + path = spec.full_gem_path + yfile = File.join(path, DEFAULT_YARDOC_FILE) + return yfile if for_writing && File.writable?(path) + return yfile if !for_writing && File.exist?(yfile) + end + + def local_yardoc_file(spec, for_writing = false) + path = Registry::LOCAL_YARDOC_INDEX + FileUtils.mkdir_p(path) if for_writing + path = File.join(path, "#{spec.full_name}.yardoc") + if for_writing + path + else + File.exist?(path) ? path : nil + end + end + + # @group Threading support + + # @since 0.6.5 + def thread_local_store + Thread.current[:__yard_registry__] ||= clear + end + + # @since 0.6.5 + def thread_local_store=(value) + Thread.current[:__yard_registry__] = value + end + + # @since 0.9.1 + def thread_local_resolver + Thread.current[:__yard_resolver__] ||= RegistryResolver.new + end + end + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/registry_resolver.rb b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/registry_resolver.rb new file mode 100644 index 000000000..129d893ff --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/registry_resolver.rb @@ -0,0 +1,217 @@ +# frozen_string_literal: true +module YARD + # Handles all logic for complex lexical and inherited object resolution. + # Used by {Registry.resolve}, so there is no need to use this class + # directly. + # + # @see Registry.resolve + # @since 0.9.1 + class RegistryResolver + include CodeObjects::NamespaceMapper + + # Creates a new resolver object for a registry. + # + # @param registry [Registry] only set this if customizing the registry + # object + def initialize(registry = Registry) + @registry = registry + @default_sep = nil + + # Preload all code objects for separator declarations + YARD::CodeObjects.constants.map {|t| YARD::CodeObjects.const_get(t) } + end + + # Performs a lookup on a given path in the registry. Resolution will occur + # in a similar way to standard Ruby identifier resolution, doing lexical + # lookup, as well as (optionally) through the inheritance chain. A proxy + # object can be returned if the lookup fails for future resolution. The + # proxy will be type hinted with the +type+ used in the original lookup. + # + # @option opts namespace [CodeObjects::Base, :root, nil] (nil) the namespace + # object to start searching from. If root or nil is provided, {Registry.root} + # is assumed. + # @option opts inheritance [Boolean] (false) whether to perform lookups through + # the inheritance chain (includes mixins) + # @option opts proxy_fallback [Boolean] (false) when true, a proxy is returned + # if no match is found + # @option opts type [Symbol] (nil) an optional type hint for the resolver + # to consider when performing a lookup. If a type is provided and the + # resolved object's type does not match the hint, the object is discarded. + # @return [CodeObjects::Base, CodeObjects::Proxy, nil] the first object + # that matches the path lookup. If proxy_fallback is provided, a proxy + # object will be returned in the event of no match, otherwise nil will + # be returned. + # @example A lookup from root + # resolver.lookup_by_path("A::B::C") + # @example A lookup from the A::B namespace + # resolver.lookup_by_path("C", namespace: P("A::B")) + # @example A lookup on a method through the inheritance tree + # resolver.lookup_by_math("A::B#foo", inheritance: true) + def lookup_by_path(path, opts = {}) + path = path.to_s + namespace = opts[:namespace] + inheritance = opts[:inheritance] || false + proxy_fallback = opts[:proxy_fallback] || false + type = opts[:type] + + if namespace.is_a?(CodeObjects::Proxy) + return proxy_fallback ? CodeObjects::Proxy.new(namespace, path, type) : nil + end + + if namespace == :root || !namespace + namespace = @registry.root + else + namespace = namespace.parent until namespace.is_a?(CodeObjects::NamespaceObject) + end + orignamespace = namespace + + if path =~ starts_with_default_separator_match + path = $' + namespace = @registry.root + orignamespace = @registry.root + end + + resolved = nil + lexical_lookup = 0 + while namespace && !resolved + resolved = lookup_path_direct(namespace, path, type) + resolved ||= lookup_path_inherited(namespace, path, type) if inheritance + break if resolved + namespace = namespace.parent + lexical_lookup += 1 + end + + # method objects cannot be resolved through lexical lookup by more than 1 ns + if lexical_lookup > 1 && resolved.is_a?(CodeObjects::MethodObject) + resolved = nil + end + + if proxy_fallback + resolved ||= CodeObjects::Proxy.new(orignamespace, path, type) + end + + resolved + end + + private + + # return [Boolean] if the obj's type matches the provided type. + def validate(obj, type) + !type || (obj && obj.type == type) ? obj : nil + end + + # Performs a lexical lookup from a namespace for a path and a type hint. + def lookup_path_direct(namespace, path, type) + result = namespace.root? && validate(@registry.at(path), type) + return result if result + + if path =~ starts_with_separator_match + return validate(@registry.at(namespace.path + path), type) + end + + separators.each do |sep| + result = validate(@registry.at("#{namespace.path}#{sep}#{path}"), type) + return result if result + end + + nil + end + + # Performs a lookup through the inheritance chain on a path with a type hint. + def lookup_path_inherited(namespace, path, type) + resolved = nil + last_obj = namespace + scopes = [] + last_sep = nil + pos = 0 + + if path =~ starts_with_separator_match + last_sep = $1 + path = $' + end + + path.scan(split_on_separators_match).each do |part, sep| + cur_obj = nil + pos += "#{part}#{sep}".length + parsed_end = pos == path.length + + if !last_obj || (!parsed_end && !last_obj.is_a?(CodeObjects::NamespaceObject)) + break # can't continue + end + + collect_namespaces(last_obj).each do |ns| + next if ns.is_a?(CodeObjects::Proxy) + + found = nil + search_seps = [] + scopes.each do |scope| + search_seps += separators_for_type(scope) + end + + if search_seps.empty? + search_seps = + if ns.type == :root + [""] + elsif last_sep.nil? + separators + else + [@default_sep] + end + end + + ([last_sep] | search_seps).compact.each do |search_sep| + found = @registry.at(ns.path + search_sep.to_s + part) + break if found + end + + break cur_obj = found if found + end + + last_sep = sep + scopes = types_for_separator(sep) || [] + last_obj = cur_obj + resolved = cur_obj if parsed_end && cur_obj && (type.nil? || type == cur_obj.type) + end + + resolved + end + + # Collects and returns all inherited namespaces for a given object + def collect_namespaces(object) + return [] unless object.respond_to?(:inheritance_tree) + + nss = object.inheritance_tree(true) + if object.respond_to?(:superclass) + nss |= [P('Object')] if object.superclass != P('BasicObject') + nss |= [P('BasicObject')] + end + + nss + end + + # @return [Regexp] the regexp match of the default separator + def starts_with_default_separator_match + @@starts_with_default_separator_match ||= /\A#{default_separator}/ + end + + # @return [Regexp] the regexp that matches strings starting with + # a separator + def starts_with_separator_match + @@starts_with_separator_match ||= /\A(#{separators_match})/ + end + + # @return [Regexp] the regexp that can be used to split a string on all + # occurrences of separator tokens + def split_on_separators_match + @@split_on_separators_match ||= /(.+?)(#{separators_match}|$)/ + end + + # Additional invalidations to done when NamespaceMapper API methods are + # called on this class + YARD::CodeObjects::NamespaceMapper.on_invalidate do + @@starts_with_default_separator_match = nil + @@starts_with_separator_match = nil + @@split_on_separators_match = nil + end + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/registry_store.rb b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/registry_store.rb new file mode 100644 index 000000000..dff048599 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/registry_store.rb @@ -0,0 +1,342 @@ +# frozen_string_literal: true +require 'fileutils' + +module YARD + # The data store for the {Registry}. + # + # @see Registry + # @see Serializers::YardocSerializer + class RegistryStore + # @deprecated The registry no longer tracks proxy types + attr_reader :proxy_types + attr_reader :file, :checksums + + def initialize + @file = nil + @checksums = {} + @store = {} + @proxy_types = {} + @object_types = {:root => [:root]} + @notfound = {} + @loaded_objects = 0 + @available_objects = 0 + @locales = {} + @store[:root] = CodeObjects::RootObject.allocate + @store[:root].send(:initialize, nil, :root) + end + + # Gets a {CodeObjects::Base} from the store + # + # @param [String, Symbol] key the path name of the object to look for. + # If it is empty or :root, returns the {#root} object. + # @return [CodeObjects::Base, nil] a code object or nil if none is found + def get(key) + key = :root if key == '' + key = key.to_sym + return @store[key] if @store[key] + return if @loaded_objects >= @available_objects + + # check disk + return if @notfound[key] + obj = @serializer.deserialize(key) + if obj + @loaded_objects += 1 + put(key, obj) + else + @notfound[key] = true + nil + end + end + + # Associates an object with a path + # @param [String, Symbol] key the path name (:root or '' for root object) + # @param [CodeObjects::Base] value the object to store + # @return [CodeObjects::Base] returns +value+ + def put(key, value) + if key == '' + @object_types[:root] = [:root] + @store[:root] = value + else + @notfound.delete(key.to_sym) + (@object_types[value.type] ||= []) << key.to_s + if @store[key.to_sym] + @object_types[@store[key.to_sym].type].delete(key.to_s) + end + @store[key.to_sym] = value + end + end + + alias [] get + alias []= put + + # Deletes an object at a given path + # @param [#to_sym] key the key to delete + # @return [void] + def delete(key) + if @store[key.to_sym] + @object_types[@store[key.to_sym].type].delete(key.to_s) + @store.delete(key.to_sym) + end + end + + # Gets all path names from the store. Loads the entire database + # if +reload+ is +true+ + # + # @param [Boolean] reload if false, does not load the entire database + # before a lookup. + # @return [Array] the path names of all the code objects + def keys(reload = false) load_all if reload; @store.keys end + + # Gets all code objects from the store. Loads the entire database + # if +reload+ is +true+ + # + # @param [Boolean] reload if false, does not load the entire database + # before a lookup. + # @return [Array] all the code objects + def values(reload = false) load_all if reload; @store.values end + + # @param [Symbol] type the type to look for + # @return [Array] a list of object paths with a given + # {CodeObjects::Base#type} + # @since 0.8.0 + def paths_for_type(type, reload = false) + load_all if reload + @object_types[type] || [] + end + + # @param [Symbol] type the type to look for + # @return [Array] a list of objects with a given + # {CodeObjects::Base#type} + # @since 0.8.0 + def values_for_type(type, reload = false) + load_all if reload + paths_for_type(type).map {|t| @store[t.to_sym] } + end + + # @return [CodeObjects::RootObject] the root object + def root; @store[:root] end + + # @param [String] name the locale name. + # @return [I18n::Locale] the locale object for +name+. + # @since 0.8.3 + def locale(name) + @locales[name] ||= load_locale(name) + end + + # @param [String, nil] file the name of the yardoc db to load + # @return [Boolean] whether the database was loaded + def load(file = nil) + initialize + @file = file + @serializer = Serializers::YardocSerializer.new(@file) + load_yardoc + end + + # Loads the .yardoc file and loads all cached objects into memory + # automatically. + # + # @param [String, nil] file the name of the yardoc db to load + # @return [Boolean] whether the database was loaded + # @see #load_all + # @since 0.5.1 + def load!(file = nil) + if load(file) + load_all + true + else + false + end + end + + # Loads all cached objects into memory + # @return [void] + def load_all + return unless @file + return if @loaded_objects >= @available_objects + log.debug "Loading entire database: #{@file} ..." + objects = [] + + all_disk_objects.sort_by(&:size).each do |path| + obj = @serializer.deserialize(path, true) + objects << obj if obj + end + + objects.each do |obj| + put(obj.path, obj) + end + + @loaded_objects += objects.size + log.debug "Loaded database (file='#{@file}' count=#{objects.size} total=#{@available_objects})" + end + + # Saves the database to disk + # @param [Boolean] merge if true, merges the data in memory with the + # data on disk, otherwise the data on disk is deleted. + # @param [String, nil] file if supplied, the name of the file to save to + # @return [Boolean] whether the database was saved + def save(merge = true, file = nil) + if file && file != @file + @file = file + @serializer = Serializers::YardocSerializer.new(@file) + end + destroy unless merge + + sdb = Registry.single_object_db + if sdb == true || sdb.nil? + @serializer.serialize(@store) + else + values(false).each do |object| + @serializer.serialize(object) + end + end + write_proxy_types + write_object_types + write_checksums + write_complete_lock + true + end + + # (see Serializers::YardocSerializer#lock_for_writing) + # @param file [String] if supplied, the path to the database + def lock_for_writing(file = nil, &block) + Serializers::YardocSerializer.new(file || @file).lock_for_writing(&block) + end + + # (see Serializers::YardocSerializer#locked_for_writing?) + # @param file [String] if supplied, the path to the database + def locked_for_writing?(file = nil) + Serializers::YardocSerializer.new(file || @file).locked_for_writing? + end + + # Deletes the .yardoc database on disk + # + # @param [Boolean] force if force is not set to true, the file/directory + # will only be removed if it ends with .yardoc. This helps with + # cases where the directory might have been named incorrectly. + # @return [Boolean] true if the .yardoc database was deleted, false + # otherwise. + def destroy(force = false) + if (!force && file =~ /\.yardoc$/) || force + if File.file?(@file) + # Handle silent upgrade of old .yardoc format + File.unlink(@file) + elsif File.directory?(@file) + FileUtils.rm_rf(@file) + end + true + else + false + end + end + + protected + + def objects_path + @serializer.objects_path + end + + # @deprecated The registry no longer tracks proxy types + def proxy_types_path + @serializer.proxy_types_path + end + + def checksums_path + @serializer.checksums_path + end + + def object_types_path + @serializer.object_types_path + end + + def load_yardoc + return false unless @file + if File.directory?(@file) # new format + @loaded_objects = 0 + @available_objects = all_disk_objects.size + load_proxy_types + load_checksums + load_root + load_object_types + true + elsif File.file?(@file) # old format + load_yardoc_old + true + else + false + end + end + + private + + def load_yardoc_old + @store, @proxy_types = *Marshal.load(File.read_binary(@file)) + end + + # @deprecated The registry no longer tracks proxy types + def load_proxy_types + return unless File.file?(proxy_types_path) + @proxy_types = Marshal.load(File.read_binary(proxy_types_path)) + end + + def load_object_types + if File.file?(object_types_path) + @object_types = Marshal.load(File.read_binary(object_types_path)) + else # migrate db without object_types + values.each do |object| + (@object_types[object.type] ||= []) << object.path + end + end + end + + def load_checksums + return unless File.file?(checksums_path) + lines = File.readlines(checksums_path).map do |line| + line.strip.rpartition(' ').tap { |p| p.delete_at(1) } + end + @checksums = Hash[lines] + end + + def load_root + root = @serializer.deserialize('root') + return if root.nil? + + @loaded_objects += 1 + if root.is_a?(Hash) # single object db + log.debug "Loading single object DB from .yardoc" + @loaded_objects += (root.keys.size - 1) + @store = root + else # just the root object + @store[:root] = root + end + end + + def load_locale(name) + locale = I18n::Locale.new(name) + locale.load(Registry.po_dir) + locale + end + + def all_disk_objects + Dir.glob(File.join(objects_path, '**/*')).select {|f| File.file?(f) } + end + + # @deprecated The registry no longer tracks proxy types + def write_proxy_types + File.open!(proxy_types_path, 'wb') {|f| f.write(Marshal.dump(@proxy_types)) } + end + + def write_object_types + File.open!(object_types_path, 'wb') {|f| f.write(Marshal.dump(@object_types)) } + end + + def write_checksums + File.open!(checksums_path, 'w') do |f| + @checksums.each {|k, v| f.puts("#{k} #{v}") } + end + end + + def write_complete_lock + File.open!(@serializer.complete_lock_path, 'w') {} + end + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/rubygems/backports.rb b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/rubygems/backports.rb new file mode 100644 index 000000000..8d915e2da --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/rubygems/backports.rb @@ -0,0 +1,10 @@ +# frozen_string_literal: true +begin + require 'rubygems' + if defined?(Gem::VERSION) && Gem::VERSION >= '1.8.0' + require File.dirname(__FILE__) + '/backports/gem' + require File.dirname(__FILE__) + '/backports/source_index' + end +rescue LoadError + nil # noop +end diff --git a/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/rubygems/backports/LICENSE.txt b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/rubygems/backports/LICENSE.txt new file mode 100644 index 000000000..8fee9f6d6 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/rubygems/backports/LICENSE.txt @@ -0,0 +1,57 @@ +RubyGems is copyrighted free software by Chad Fowler, Rich Kilmer, Jim +Weirich and others. You can redistribute it and/or modify it under +either the terms of the MIT license (see the file MIT.txt), or the +conditions below: + +1. You may make and give away verbatim copies of the source form of the + software without restriction, provided that you duplicate all of the + original copyright notices and associated disclaimers. + +2. You may modify your copy of the software in any way, provided that + you do at least ONE of the following: + + a. place your modifications in the Public Domain or otherwise + make them Freely Available, such as by posting said + modifications to Usenet or an equivalent medium, or by allowing + the author to include your modifications in the software. + + b. use the modified software only within your corporation or + organization. + + c. give non-standard executables non-standard names, with + instructions on where to get the original software distribution. + + d. make other distribution arrangements with the author. + +3. You may distribute the software in object code or executable + form, provided that you do at least ONE of the following: + + a. distribute the executables and library files of the software, + together with instructions (in the manual page or equivalent) + on where to get the original distribution. + + b. accompany the distribution with the machine-readable source of + the software. + + c. give non-standard executables non-standard names, with + instructions on where to get the original software distribution. + + d. make other distribution arrangements with the author. + +4. You may modify and include the part of the software into any other + software (possibly commercial). But some files in the distribution + are not written by the author, so that they are not under these terms. + + For the list of those files and their copying conditions, see the + file LEGAL. + +5. The scripts and library files supplied as input to or produced as + output from the software do not automatically fall under the + copyright of the software, but belong to whomever generated them, + and may be sold commercially, and may be aggregated with this + software. + +6. THIS SOFTWARE IS PROVIDED "AS IS" AND WITHOUT ANY EXPRESS OR + IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + PURPOSE. diff --git a/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/rubygems/backports/MIT.txt b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/rubygems/backports/MIT.txt new file mode 100644 index 000000000..0e6643ab3 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/rubygems/backports/MIT.txt @@ -0,0 +1,20 @@ +Copyright (c) Chad Fowler, Rich Kilmer, Jim Weirich 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/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/rubygems/backports/gem.rb b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/rubygems/backports/gem.rb new file mode 100644 index 000000000..391fca894 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/rubygems/backports/gem.rb @@ -0,0 +1,10 @@ +# frozen_string_literal: true +module Gem + class << self + undef source_index if method_defined?(:source_index) + # Returns the Gem::SourceIndex of specifications that are in the Gem.path + def source_index + @@source_index ||= SourceIndex.from_installed_gems + end + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/rubygems/backports/source_index.rb b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/rubygems/backports/source_index.rb new file mode 100644 index 000000000..c3159503c --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/rubygems/backports/source_index.rb @@ -0,0 +1,365 @@ +# frozen_string_literal: true +#-- +# Copyright 2006 by Chad Fowler, Rich Kilmer, Jim Weirich and others. +# All rights reserved. +# See LICENSE.txt for permissions. +#++ + +require 'rubygems/specification' + +## +# The SourceIndex object indexes all the gems available from a +# particular source (e.g. a list of gem directories, or a remote +# source). A SourceIndex maps a gem full name to a gem +# specification. +# +# NOTE:: The class used to be named Cache, but that became +# confusing when cached source fetchers where introduced. The +# constant Gem::Cache is an alias for this class to allow old +# YAMLized source index objects to load properly. + +class Gem::SourceIndex + # Undef old methods + alias old_initialize initialize + undef old_initialize + %w(all_gems prerelease_gems load_gems_in latest_specs prerelease_specs + released_specs add_spec add_specs remove_spec each specification + index_signature gem_signature size length find_name search released_gems + refresh! outdated == dump gems spec_dirs spec_dirs=).each do |meth| + undef_method(meth) if method_defined?(meth) + end + + include Enumerable + + attr_reader :gems # :nodoc: + + ## + # Directories to use to refresh this SourceIndex when calling refresh! + + attr_accessor :spec_dirs + + class << self + # Undef old methods + %w(from_installed_gems installed_spec_directories + from_gems_in load_specification).each do |meth| + undef_method(meth) if instance_methods(true).find {|m| m.to_s == meth } + end + + ## + # Factory method to construct a source index instance for a given + # path. + # + # deprecated:: + # If supplied, from_installed_gems will act just like + # +from_gems_in+. This argument is deprecated and is provided + # just for backwards compatibility, and should not generally + # be used. + # + # return:: + # SourceIndex instance + + def from_installed_gems(*deprecated) + if deprecated.empty? + from_gems_in(*installed_spec_directories) + else + from_gems_in(*deprecated) # HACK: warn + end + end + + ## + # Returns a list of directories from Gem.path that contain specifications. + + def installed_spec_directories + Gem.path.collect {|dir| File.join(dir, "specifications") } + end + + ## + # Creates a new SourceIndex from the ruby format gem specifications in + # +spec_dirs+. + + def from_gems_in(*spec_dirs) + source_index = new + source_index.spec_dirs = spec_dirs + source_index.refresh! + end + + ## + # Loads a ruby-format specification from +file_name+ and returns the + # loaded spec. + + def load_specification(file_name) + Gem::Specification.load file_name + end + end + + ## + # Constructs a source index instance from the provided specifications, which + # is a Hash of gem full names and Gem::Specifications. + #-- + # TODO merge @gems and @prerelease_gems and provide a separate method + # #prerelease_gems + + def initialize(specifications = {}) + @gems = {} + specifications.each {|_full_name, spec| add_spec spec } + @spec_dirs = nil + end + + # TODO: remove method + def all_gems + @gems + end + + def prerelease_gems + @gems.reject {|_name, gem| !gem.version.prerelease? } + end + + def released_gems + @gems.reject {|_name, gem| gem.version.prerelease? } + end + + ## + # Reconstruct the source index from the specifications in +spec_dirs+. + + def load_gems_in(*spec_dirs) + @gems.clear + + spec_dirs.reverse_each do |spec_dir| + spec_files = Dir.glob File.join(spec_dir, '*.gemspec') + + spec_files.each do |spec_file| + gemspec = Gem::Specification.load spec_file + add_spec gemspec if gemspec + end + end + + self + end + + ## + # Returns an Array specifications for the latest released versions + # of each gem in this index. + + def latest_specs(include_prerelease = false) + result = Hash.new {|h, k| h[k] = [] } + latest = {} + + sort.each do |_, spec| + name = spec.name + curr_ver = spec.version + prev_ver = latest.key?(name) ? latest[name].version : nil + + next if !include_prerelease && curr_ver.prerelease? + next unless prev_ver.nil? || curr_ver >= prev_ver || + latest[name].platform != Gem::Platform::RUBY + + if prev_ver.nil? || + (curr_ver > prev_ver && spec.platform == Gem::Platform::RUBY) + result[name].clear + latest[name] = spec + end + + if spec.platform != Gem::Platform::RUBY + result[name].delete_if do |result_spec| + result_spec.platform == spec.platform + end + end + + result[name] << spec + end + + # TODO: why is this a hash while @gems is an array? Seems like + # structural similarity would be good. + result.values.flatten + end + + ## + # An array including only the prerelease gemspecs + + def prerelease_specs + prerelease_gems.values + end + + ## + # An array including only the released gemspecs + + def released_specs + released_gems.values + end + + ## + # Add a gem specification to the source index. + + def add_spec(gem_spec, name = gem_spec.full_name) + # No idea why, but the Indexer wants to insert them using original_name + # instead of full_name. So we make it an optional arg. + @gems[name] = gem_spec + end + + ## + # Add gem specifications to the source index. + + def add_specs(*gem_specs) + gem_specs.each do |spec| + add_spec spec + end + end + + ## + # Remove a gem specification named +full_name+. + + def remove_spec(full_name) + @gems.delete full_name + end + + ## + # Iterate over the specifications in the source index. + + def each(&block) # :yields: gem.full_name, gem + @gems.each(&block) + end + + ## + # The gem specification given a full gem spec name. + + def specification(full_name) + @gems[full_name] + end + + ## + # The signature for the source index. Changes in the signature indicate a + # change in the index. + + def index_signature + require 'digest' + + Digest::SHA256.new.hexdigest(@gems.keys.sort.join(',')).to_s + end + + ## + # The signature for the given gem specification. + + def gem_signature(gem_full_name) + require 'digest' + + Digest::SHA256.new.hexdigest(@gems[gem_full_name].to_yaml).to_s + end + + def size + @gems.size + end + alias length size + + ## + # Find a gem by an exact match on the short name. + + def find_name(gem_name, requirement = Gem::Requirement.default) + dep = Gem::Dependency.new gem_name, requirement + search dep + end + + ## + # Search for a gem by Gem::Dependency +gem_pattern+. If +only_platform+ + # is true, only gems matching Gem::Platform.local will be returned. An + # Array of matching Gem::Specification objects is returned. + # + # For backwards compatibility, a String or Regexp pattern may be passed as + # +gem_pattern+, and a Gem::Requirement for +platform_only+. This + # behavior is deprecated and will be removed. + + def search(gem_pattern, platform_only = false) + requirement = nil + only_platform = false + + # TODO: Remove support and warning for legacy arguments after 2008/11 + unless Gem::Dependency === gem_pattern + warn "#{Gem.location_of_caller.join ':'}:Warning: Gem::SourceIndex#search support for #{gem_pattern.class} patterns is deprecated, use #find_name" + end + + case gem_pattern + when Regexp then + requirement = platform_only || Gem::Requirement.default + when Gem::Dependency then + only_platform = platform_only + requirement = gem_pattern.requirement + + gem_pattern = if Regexp === gem_pattern.name + gem_pattern.name + elsif gem_pattern.name.empty? + // + else + /^#{Regexp.escape gem_pattern.name}$/ + end + else + requirement = platform_only || Gem::Requirement.default + gem_pattern = /#{gem_pattern}/i + end + + unless Gem::Requirement === requirement + requirement = Gem::Requirement.create requirement + end + + specs = all_gems.values.select do |spec| + spec.name =~ gem_pattern && + requirement.satisfied_by?(spec.version) + end + + if only_platform + specs = specs.select do |spec| + Gem::Platform.match spec.platform + end + end + + specs.sort_by(&:sort_obj) + end + + ## + # Replaces the gems in the source index from specifications in the + # directories this source index was created from. Raises an exception if + # this source index wasn't created from a directory (via from_gems_in or + # from_installed_gems, or having spec_dirs set). + + def refresh! + raise 'source index not created from disk' if @spec_dirs.nil? + load_gems_in(*@spec_dirs) + end + + ## + # Returns an Array of Gem::Specifications that are not up to date. + + def outdated + outdateds = [] + + latest_specs.each do |local| + dependency = Gem::Dependency.new local.name, ">= #{local.version}" + + fetcher = Gem::SpecFetcher.fetcher + remotes = fetcher.find_matching dependency + remotes = remotes.map {|(_, version, _), _| version } + + latest = remotes.sort.last + + outdateds << local.name if latest && local.version < latest + end + + outdateds + end + + def ==(other) # :nodoc: + self.class === other && @gems == other.gems + end + + def dump + Marshal.dump(self) + end +end + +# :stopdoc: +module Gem + ## + # Cache is an alias for SourceIndex to allow older YAMLized source index + # objects to load properly. + + Cache = SourceIndex unless defined?(Cache) +end +# :startdoc: diff --git a/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/rubygems/doc_manager.rb b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/rubygems/doc_manager.rb new file mode 100644 index 000000000..e33f442ab --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/rubygems/doc_manager.rb @@ -0,0 +1,90 @@ +# frozen_string_literal: true +begin + require 'rubygems/user_interaction' + require 'rubygems/doc_manager' +rescue LoadError + nil # noop +end + +class Gem::DocManager + def self.load_yardoc + require File.expand_path(File.join(File.dirname(__FILE__), *%w(.. .. yard))) + end + + def run_yardoc(*args) + args << '--quiet' + args << '--backtrace' if Gem.configuration.backtrace + unless File.file?(File.join(@spec.full_gem_path, '.yardopts')) + args << @spec.require_paths + unless @spec.extra_rdoc_files.empty? + args << '-' + args += @spec.extra_rdoc_files + end + end + args = args.flatten.map(&:to_s) + + old_pwd = Dir.pwd + Dir.chdir(@spec.full_gem_path) + YARD::CLI::Yardoc.run(*args) + rescue Errno::EACCES => e + dirname = File.dirname e.message.split("-")[1].strip + raise Gem::FilePermissionError, dirname + rescue => ex + alert_error "While generating documentation for #{@spec.full_name}" + ui.errs.puts "... MESSAGE: #{ex}" + ui.errs.puts "... YARDOC args: #{args.join(' ')}" + ui.errs.puts "\t#{ex.backtrace.join("\n\t")}" if Gem.configuration.backtrace + ui.errs.puts "(continuing with the rest of the installation)" + ensure + Dir.chdir(old_pwd) + end + + begin undef setup_rdoc; rescue NameError; nil end + def setup_rdoc + if File.exist?(@doc_dir) && !File.writable?(@doc_dir) + raise Gem::FilePermissionError, @doc_dir + end + + FileUtils.mkdir_p @doc_dir unless File.exist?(@doc_dir) + + self.class.load_rdoc if @spec.has_rdoc? + self.class.load_yardoc if @spec.has_yardoc? + end + + def install_yardoc + rdoc_dir = File.join(@doc_dir, 'rdoc') + + FileUtils.rm_rf rdoc_dir + + say "Installing YARD documentation for #{@spec.full_name}..." + run_yardoc '-o', rdoc_dir + end + + def install_ri_yard + install_ri_yard_orig if @spec.has_rdoc? + return if @spec.has_rdoc? == false + return if @spec.has_yardoc? + + self.class.load_yardoc + say "Building YARD (yri) index for #{@spec.full_name}..." + run_yardoc '-c', '-n' + end + + begin + alias install_ri_yard_orig install_ri + alias install_ri install_ri_yard + rescue NameError; nil end + + def install_rdoc_yard + if @spec.has_rdoc? + install_rdoc_yard_orig + elsif @spec.has_yardoc? + install_yardoc + end + end + + begin + alias install_rdoc_yard_orig install_rdoc + alias install_rdoc install_rdoc_yard + rescue NameError; nil end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/rubygems/hook.rb b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/rubygems/hook.rb new file mode 100644 index 000000000..4f1e0162f --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/rubygems/hook.rb @@ -0,0 +1,197 @@ +# frozen_string_literal: true +require 'rubygems' +require 'rubygems/user_interaction' +require 'fileutils' + +## +# Gem::YARDoc provides methods to generate YARDoc and yri data for installed gems +# upon gem installation. +# +# This file is automatically required by RubyGems 1.9 and newer. + +module YARD + class RubygemsHook + include Gem::UserInteraction + extend Gem::UserInteraction + + @yard_version = nil + + ## + # Force installation of documentation? + + attr_accessor :force + + ## + # Generate yard? + + attr_accessor :generate_yard + + ## + # Generate yri data? + + attr_accessor :generate_yri + + class << self + ## + # Loaded version of YARD. Set by ::load_yard + + attr_reader :yard_version + end + + ## + # Post installs hook that generates documentation for each specification in + # +specs+ + + def self.generation_hook(installer, specs) + start = Time.now + types = installer.document + + generate_yard = types.include?('yardoc') || types.include?('yard') + generate_yri = types.include? 'yri' + + specs.each do |spec| + gen_yard = generate_yard + gen_yri = generate_yri + gen_yri = false if gen_yard # never generate both, no need + unless types.empty? # --no-document is not in effect + # look at spec.metadata['yard.run'] for override + run_yard = spec.metadata['yard.run'] + gen_yard = true if run_yard && run_yard != 'yri' + gen_yri = true if run_yard == 'yri' + end + + new(spec, gen_yard, gen_yri).generate + end + + return unless generate_yard || generate_yri + + duration = (Time.now - start).to_i + names = specs.map(&:name).join ', ' + + say "Done installing documentation for #{names} after #{duration} seconds" + end + + ## + # Pre uninstalls hook that removes documentation + # + + def self.removal_hook(uninstaller) + new(uninstaller.spec).remove + end + + ## + # Loads the YARD generator + + def self.load_yard + return if @yard_version + + require 'yard' + + @yard_version = Gem::Version.new ::YARD::VERSION + end + + def initialize(spec, generate_yard = false, generate_yri = true) + @doc_dir = spec.doc_dir + @force = false + @spec = spec + + @generate_yard = generate_yard + @generate_yri = generate_yri + + @yard_dir = spec.doc_dir('yard') + @yri_dir = spec.doc_dir('.yardoc') + end + + def run_yardoc(*args) + args << '--quiet' unless Gem.configuration.really_verbose + args << '--backtrace' if Gem.configuration.backtrace + unless File.file?(File.join(@spec.full_gem_path, '.yardopts')) + args << @spec.require_paths + unless @spec.extra_rdoc_files.empty? + args << '-' + args += @spec.extra_rdoc_files + end + end + args = args.flatten.map(&:to_s) + + Dir.chdir(@spec.full_gem_path) do + YARD::CLI::Yardoc.run(*args) + end + rescue Errno::EACCES => e + dirname = File.dirname e.message.split("-")[1].strip + raise Gem::FilePermissionError, dirname + rescue => ex + alert_error "While generating documentation for #{@spec.full_name}" + ui.errs.puts "... MESSAGE: #{ex}" + ui.errs.puts "... YARDOC args: #{args.join(' ')}" + ui.errs.puts "\t#{ex.backtrace.join("\n\t")}" if Gem.configuration.backtrace + ui.errs.puts "(continuing with the rest of the installation)" + end + + def install_yard + FileUtils.rm_rf @yard_dir + + say "Installing YARD documentation for #{@spec.full_name}..." + run_yardoc '--no-progress', '--db', @yri_dir, '-o', @yard_dir + end + + def install_yri + FileUtils.rm_rf @yri_dir + + say "Building YARD (yri) index for #{@spec.full_name}..." + run_yardoc '--no-progress', '-c', '-n', '--db', @yri_dir + end + + ## + # Generates YARD and yri data + + def generate + return if @spec.default_gem? + return unless @generate_yri || @generate_yard + + setup + + install_yri if @generate_yri && (@force || !File.exist?(@yri_dir)) + + install_yard if @generate_yard && (@force || !File.exist?(@yard_dir)) + end + + ## + # Prepares the spec for documentation generation + + def setup + self.class.load_yard + + if File.exist?(@doc_dir) + raise Gem::FilePermissionError, @doc_dir unless File.writable?(@doc_dir) + else + FileUtils.mkdir_p @doc_dir + end + end + + def uninstall_yard + if File.exist?(@yard_dir) + raise Gem::FilePermissionError, @yard_dir unless File.writable?(@yard_dir) + FileUtils.rm_rf @yard_dir + end + end + + def uninstall_yri + if File.exist?(@yri_dir) + raise Gem::FilePermissionError, @yri_dir unless File.writable?(@yri_dir) + FileUtils.rm_rf @yri_dir + end + end + + ## + # Removes YARD and yri data + + def remove + uninstall_yri + uninstall_yard + end + end +end + +Gem.done_installing(&YARD::RubygemsHook.method(:generation_hook)) +Gem.pre_uninstall(&YARD::RubygemsHook.method(:removal_hook)) diff --git a/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/rubygems/specification.rb b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/rubygems/specification.rb new file mode 100644 index 000000000..905ba067a --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/rubygems/specification.rb @@ -0,0 +1,50 @@ +# frozen_string_literal: true +require 'rubygems/specification' + +class Gem::Specification + # @since 0.5.3 + def has_yardoc=(value) + @has_rdoc = value ? 'yard' : false + end + + def has_yardoc + @has_rdoc == 'yard' + end + + undef has_rdoc? + def has_rdoc? + (@has_rdoc ||= true) && @has_rdoc != 'yard' + end + + alias has_yardoc? has_yardoc + + # has_rdoc should not be ignored! + if respond_to?(:overwrite_accessor) + overwrite_accessor(:has_rdoc) { @has_rdoc ||= true } + overwrite_accessor(:has_rdoc=) {|v| @has_rdoc = v } + else + attr_accessor :has_rdoc + end + + if defined?(Gem::VERSION) && Gem::VERSION >= '1.7.' + def _dump_with_rdoc(limit) + dmp = _dump_without_rdoc(limit) + dmp[15] = @has_rdoc if dmp[15] == true + dmp + end + alias _dump_without_rdoc _dump + alias _dump _dump_with_rdoc + + if class_variable_defined?(:@@default_value) + if @@default_value.frozen? + t = @@default_value.dup + t[:has_rdoc] = true + @@default_value = t.freeze + else + @@default_value[:has_rdoc] = true + end + end + @@attributes << 'has_rdoc' if class_variable_defined?(:@@attributes) + @@nil_attributes << 'has_rdoc' if class_variable_defined?(:@@nil_attributes) + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/serializers/base.rb b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/serializers/base.rb new file mode 100644 index 000000000..101ee0197 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/serializers/base.rb @@ -0,0 +1,83 @@ +# frozen_string_literal: true +module YARD + module Serializers + # The abstract base serializer. Serializers allow templates to be + # rendered to various endpoints. For instance, a {FileSystemSerializer} + # would allow template contents to be written to the filesystem + # + # To implement a custom serializer, override the following methods: + # * {#serialize} + # * {#serialized_path} + # + # Optionally, a serializer can implement before and after filters: + # * {#before_serialize} + # * {#after_serialize} + # + # @abstract Override this class to implement a custom serializer. + class Base + # All serializer options are saved so they can be passed to other serializers. + # + # @return [SymbolHash] the serializer options + attr_reader :options + + # @group Creating a New Serializer + + # Creates a new serializer with options + # + # @param [Hash] opts the options to assign to {#options} + def initialize(opts = {}) + @options = SymbolHash.new(false).update(opts) + end + + # @group Serializing an Object + + # Serializes an object. + # + # @abstract This method should implement the logic that serializes + # +data+ to the respective endpoint. This method should also call + # the before and after callbacks {#before_serialize} and {#after_serialize} + # @param [CodeObjects::Base, String] object the object to serialize the + # data for. The object can also be a string (for non-object serialization) + # @param [String] data the contents that should be serialized + def serialize(object, data) end + + # The serialized path of an object + # + # @abstract This method should return the path of the object on the + # endpoint. For instance, for a file serializer, this should return + # the filename that represents the object on disk. + # @param [CodeObjects::Base] object the object to return a path for + # @return [String] the serialized path of an object + def serialized_path(object) end + + # Returns whether an object has been serialized + # + # @abstract This method should return whether the endpoint already exists. + # For instance, a file system serializer would check if the file exists + # on disk. You will most likely use +#basepath+ and {#serialized_path} to + # get the endpoint's location. + # @param [CodeObjects::Base] object the object to check existence of + # @return [Boolean] whether the endpoint exists. + # @since 0.6.0 + def exists?(object) # rubocop:disable Lint/UnusedMethodArgument + false + end + + # @group Callbacks + + # Called before serialization. + # + # @abstract Should run code before serialization. Should return false + # if serialization should not occur. + # @return [Boolean] whether or not serialization should occur + def before_serialize; end + + # Called after serialization. + # + # @abstract Should run code after serialization. + # @param [String] data the data that was serialized. + # @return [void] + def after_serialize(data); end + end + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/serializers/file_system_serializer.rb b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/serializers/file_system_serializer.rb new file mode 100644 index 000000000..c95f585f1 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/serializers/file_system_serializer.rb @@ -0,0 +1,123 @@ +# frozen_string_literal: true +module YARD + module Serializers + # Implements a serializer that reads from and writes to the filesystem. + class FileSystemSerializer < Base + # The base path to write data to. + # @return [String] a base path + attr_reader :basepath + + def basepath=(value) + @basepath = options[:basepath] = value + end + + # The extension of the filename (defaults to +html+) + # + # @return [String] the extension of the file. Empty string for no extension. + attr_reader :extension + + def extension=(value) + @extension = options[:extension] = value + end + + # Creates a new FileSystemSerializer with options + # + # @option opts [String] :basepath ('doc') the base path to write data to + # @option opts [String] :extension ('html') the extension of the serialized + # path filename. If this is set to the empty string, no extension is used. + def initialize(opts = {}) + super + @name_map = nil + @basepath = (options[:basepath] || 'doc').to_s + @extension = (options.key?(:extension) ? options[:extension] : 'html').to_s + end + + # Serializes object with data to its serialized path (prefixed by the +#basepath+). + # + # @return [String] the written data (for chaining) + def serialize(object, data) + path = File.join(basepath, serialized_path(object)) + log.debug "Serializing to #{path}" + File.open!(path, "wb") {|f| f.write data } + end + + # Implements the serialized path of a code object. + # + # @param [CodeObjects::Base, CodeObjects::ExtraFileObject, String] object + # the object to get a path for. The path of a string is the string itself. + # @return [String] if object is a String, returns + # object, otherwise the path on disk (without the basepath). + def serialized_path(object) + return object if object.is_a?(String) + + if object.is_a?(CodeObjects::ExtraFileObject) + fspath = ['file.' + object.name + (extension.empty? ? '' : ".#{extension}")] + else + objname = object != YARD::Registry.root ? mapped_name(object) : "top-level-namespace" + objname += '_' + object.scope.to_s[0, 1] if object.is_a?(CodeObjects::MethodObject) + fspath = [objname + (extension.empty? ? '' : ".#{extension}")] + if object.namespace && object.namespace.path != "" + fspath.unshift(*object.namespace.path.split(CodeObjects::NSEP)) + end + end + + File.join(encode_path_components(*fspath)) + end + + # Checks the disk for an object and returns whether it was serialized. + # + # @param [CodeObjects::Base] object the object to check + # @return [Boolean] whether an object has been serialized to disk + def exists?(object) + File.exist?(File.join(basepath, serialized_path(object))) + end + + private + + # Builds a filename mapping from object paths to filesystem path names. + # Needed to handle case sensitive YARD objects mapped into a case + # insensitive filesystem. Uses with {#mapped_name} to determine the + # mapping name for a given object. + # + # @note In order to use filesystem name mapping, you must initialize + # the serializer object after preparing the {YARD::Registry}. + def build_filename_map + @name_map = {} + YARD::Registry.all.each do |object| + lpath = nil + if object.parent && object.parent.type != :root + lpath = object.parent.path + "::" + object.name.to_s.downcase + else + lpath = object.path.downcase + end + + @name_map[lpath] ||= {} + size = @name_map[lpath].size + name = "#{object.name}#{size > 0 ? "_" * size : ""}" + @name_map[lpath][object.name] = name + end + end + + # @return [String] the filesystem mapped name of a given object. + def mapped_name(object) + build_filename_map unless @name_map + map = @name_map[object.path.downcase] + map && map[object.name] ? map[object.name] : object.name.to_s + end + + # Remove special chars from filenames. + # Windows disallows \ / : * ? " < > | but we will just remove any + # non alphanumeric (plus period, underscore and dash). + def encode_path_components(*components) + components.map! do |p| + p.gsub(/[^\w\.-]/) do |x| + encoded = String.new('_') + + x.each_byte {|b| encoded << ("%X" % b) } + encoded + end + end + end + end + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/serializers/process_serializer.rb b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/serializers/process_serializer.rb new file mode 100644 index 000000000..8c5a626f1 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/serializers/process_serializer.rb @@ -0,0 +1,24 @@ +# frozen_string_literal: true +module YARD + module Serializers + # Serializes an object to a process (like less) + # + # @example Serializing to a pager (less) + # serializer = ProcessSerializer.new('less') + # serializer.serialize(object, "data!") + class ProcessSerializer < Base + # Creates a new ProcessSerializer for the shell command +cmd+ + # + # @param [String] cmd the command that will accept data on stdin + def initialize(cmd) + @cmd = cmd + end + + # Overrides serialize behaviour and writes data to standard input + # of the associated command + def serialize(_object, data) + IO.popen(@cmd, 'w') {|io| io.write(data) } + end + end + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/serializers/stdout_serializer.rb b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/serializers/stdout_serializer.rb new file mode 100644 index 000000000..343b6ef7d --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/serializers/stdout_serializer.rb @@ -0,0 +1,34 @@ +# frozen_string_literal: true +module YARD + module Serializers + # A serializer that writes data to standard output. + class StdoutSerializer < Base + # Creates a serializer to print text to stdout + # + # @param [Fixnum, nil] wrap if wrap is a number, wraps text to +wrap+ + # columns, otherwise no wrapping is done. + def initialize(wrap = nil) + @wrap = wrap + end + + # Overrides serialize behaviour to write data to standard output + def serialize(_object, data) + print(@wrap ? word_wrap(data, @wrap) : data) + end + + private + + # Wraps text to a specific column length + # + # @param [String] text the text to wrap + # @param [Fixnum] _length the column length to wrap to + # @return [String] the wrapped text + def word_wrap(text, _length = 80) + # See ruby-talk/10655 / Ernest Ellingson + text.gsub(/\t/, " ").gsub(/.{1,50}(?:\s|\Z)/) do + ($& + 5.chr).gsub(/\n\005/, "\n").gsub(/\005/, "\n") + end + end + end + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/serializers/yardoc_serializer.rb b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/serializers/yardoc_serializer.rb new file mode 100644 index 000000000..875d73b83 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/serializers/yardoc_serializer.rb @@ -0,0 +1,152 @@ +# frozen_string_literal: true +module YARD + # Stubs marshal dumps and acts a delegate class for an object by path + # + # @private + class StubProxy + instance_methods.each {|m| undef_method(m) unless m.to_s =~ /^__|^object_id$/ } + + def _dump(_depth) @path end + def self._load(str) new(str) end + def hash; @path.hash end + + def initialize(path, transient = false) + @path = path + @transient = transient + end + + def method_missing(meth, *args, &block) + return true if meth == :respond_to? && args.first == :_dump + @object = nil if @transient + @object ||= Registry.at(@path) + @object.send(meth, *args, &block) + rescue NoMethodError => e + e.backtrace.delete_if {|l| l[0, FILELEN] == __FILE__ } + raise + end + + FILELEN = __FILE__.size + end + + module Serializers + class YardocSerializer < FileSystemSerializer + def initialize(yfile) + super(:basepath => yfile, :extension => 'dat') + end + + def objects_path; File.join(basepath, 'objects') end + # @deprecated The registry no longer tracks proxy types + def proxy_types_path; File.join(basepath, 'proxy_types') end + def checksums_path; File.join(basepath, 'checksums') end + def object_types_path; File.join(basepath, 'object_types') end + def complete_lock_path; File.join(basepath, 'complete') end + def processing_path; File.join(basepath, 'processing') end + + def complete? + File.exist?(complete_lock_path) && !locked_for_writing? + end + + # Creates a pessmistic transactional lock on the database for writing. + # Use with {YARD.parse} to ensure the database is not written multiple + # times. + # + # @see #locked_for_writing? + def lock_for_writing + File.open!(processing_path, 'w') {} + yield + ensure + File.unlink(processing_path) if File.exist?(processing_path) + end + + # @return [Boolean] whether the database is currently locked for writing + def locked_for_writing? + File.exist?(processing_path) + end + + def serialized_path(object) + path = + case object + when String, Symbol + object = object.to_s + if object =~ /#/ + object += '_i' + elsif object =~ /\./ + object += '_c' + end + object.split(/::|\.|#/).map do |p| + p.gsub(/[^\w\.-]/) do |x| + encoded = '_' + + x.each_byte {|b| encoded += ("%X" % b) } + encoded + end + end.join('/') + '.' + extension + when YARD::CodeObjects::RootObject + 'root.dat' + else + super(object) + end + + File.join('objects', path) + end + + def serialize(object) + if Hash === object + super(object[:root], dump(object)) if object[:root] + else + super(object, dump(object)) + end + end + + def deserialize(path, is_path = false) + path = File.join(basepath, serialized_path(path)) unless is_path + if File.file?(path) + log.debug "Deserializing #{path}..." + Marshal.load(File.read_binary(path)) + else + log.debug "Could not find #{path}" + nil + end + end + + private + + def dump(object) + object = internal_dump(object, true) unless object.is_a?(Hash) + Marshal.dump(object) + end + + def internal_dump(object, first_object = false) + if !first_object && object.is_a?(CodeObjects::Base) && + !(Tags::OverloadTag === object) + return StubProxy.new(object.path) + end + + if object.is_a?(Hash) || object.is_a?(Array) || + object.is_a?(CodeObjects::Base) || + !object.instance_variables.empty? + object = object.dup + end + + object.instance_variables.each do |ivar| + ivar_obj = object.instance_variable_get(ivar) + ivar_obj_dump = internal_dump(ivar_obj) + object.instance_variable_set(ivar, ivar_obj_dump) + end + + case object + when Hash + list = object.map do |k, v| + [k, v].map {|item| internal_dump(item) } + end + object.replace(Hash[list]) + when Array + list = object.map {|item| internal_dump(item) } + object.replace(list) + end + + object + end + end + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/server.rb b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/server.rb new file mode 100644 index 000000000..b8f323a0e --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/server.rb @@ -0,0 +1,13 @@ +# frozen_string_literal: true +module YARD + module Server + # Registers a static path to be used in static asset lookup. + # @param [String] path the pathname to register + # @return [void] + # @since 0.6.2 + def self.register_static_path(path) + static_paths = Commands::StaticFileCommand::STATIC_PATHS + static_paths.push(path) unless static_paths.include?(path) + end + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/server/adapter.rb b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/server/adapter.rb new file mode 100644 index 000000000..0dced5f80 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/server/adapter.rb @@ -0,0 +1,100 @@ +# frozen_string_literal: true +module YARD + module Server + # Short circuits a request by raising an error. This exception is caught + # by {Commands::Base#call} to immediately end a request and return a response. + class FinishRequest < RuntimeError; end + + # Raises an error if a resource is not found. This exception is caught by + # {Commands::Base#call} to immediately end a request and return a 404 response + # code. If a message is provided, the body is set to the exception message. + class NotFoundError < RuntimeError; end + + # This class implements the bridge between the {Router} and the server + # backend for a specific server type. YARD implements concrete adapters + # for WEBrick and Rack respectively, though other adapters can be made + # for other server architectures. + # + # == Subclassing Notes + # To create a concrete adapter class, implement the {#start} method to + # initiate the server backend. + # + # @abstract + class Adapter + # @return [String] the location where static files are located, if any. + # To set this field on initialization, pass +:DocumentRoot+ to the + # +server_opts+ argument in {#initialize} + attr_accessor :document_root + + # @return [Hash{String=>Array}] a map of libraries. + # @see LibraryVersion LibraryVersion for information on building a list of libraries + # @see #add_library + attr_accessor :libraries + + # @return [Hash] options passed and processed by adapters. The actual + # options mostly depend on the adapters themselves. + attr_accessor :options + + # @return [Hash] a set of options to pass to the server backend. Note + # that +:DocumentRoot+ also sets the {#document_root}. + attr_accessor :server_options + + # @return [Router] the router object used to route URLs to commands + attr_accessor :router + + # Performs any global initialization for the adapter. + # @note If you subclass this method, make sure to call +super+. + # @return [void] + def self.setup + Templates::Template.extra_includes |= [YARD::Server::DocServerHelper] + Templates::Engine.template_paths |= [File.dirname(__FILE__) + '/templates'] + end + + # Performs any global shutdown procedures for the adapter. + # @note If you subclass this method, make sure to call +super+. + # @return [void] + def self.shutdown + Templates::Template.extra_includes -= [YARD::Server::DocServerHelper] + Templates::Engine.template_paths -= [File.dirname(__FILE__) + '/templates'] + end + + # Creates a new adapter object + # + # @param [Hash{String=>Array}] libs a list of libraries, + # see {#libraries} for formulating this list. + # @param [Hash] opts extra options to pass to the adapter + # @option opts [Class] :router (Router) the router class to initialize as the + # adapter's router. + # @option opts [Boolean] :caching (false) whether or not caching is enabled + # @option opts [Boolean] :single_library (false) whether to server documentation + # for a single or multiple libraries (changes URL structure) + def initialize(libs, opts = {}, server_opts = {}) + self.class.setup + self.libraries = libs + self.options = opts + self.server_options = server_opts + self.document_root = server_options[:DocumentRoot] + self.router = (options[:router] || Router).new(self) + options[:adapter] = self + log.debug "Serving libraries using #{self.class}: #{libraries.keys.join(', ')}" + log.debug "Caching on" if options[:caching] + log.debug "Document root: #{document_root}" if document_root + end + + # Adds a library to the {#libraries} mapping for a given library object. + # @example Adding a new library to an adapter + # adapter.add_library LibraryVersion.new('mylib', '1.0', '/path/to/.yardoc') + # @param [LibraryVersion] library a library to add + def add_library(library) + libraries[library.name] ||= [] + libraries[library.name] |= [library] + end + + # Implement this method to connect your adapter to your server. + # @abstract + def start + raise NotImplementedError + end + end + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/server/commands/base.rb b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/server/commands/base.rb new file mode 100644 index 000000000..10e2320ae --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/server/commands/base.rb @@ -0,0 +1,209 @@ +# frozen_string_literal: true +require 'fileutils' + +module YARD + module Server + module Commands + # This is the base command class used to implement custom commands for + # a server. A command will be routed to by the {Router} class and return + # a Rack-style response. + # + # == Attribute Initializers + # All attributes can be initialized via options passed into the {#initialize} + # method. When creating a custom command, the {Adapter#options} will + # automatically be mapped to attributes by the same name on your class. + # + # class MyCommand < Base + # attr_accessor :myattr + # end + # + # Adapter.new(libs, {:myattr => 'foo'}).start + # + # # when a request comes in, cmd.myattr == 'foo' + # + # == Subclassing Notes + # To implement a custom command, override the {#run} method, not {#call}. + # In your implementation, you should set the body and status for requests. + # See details in the +#run+ method documentation. + # + # Note that if your command deals directly with libraries, you should + # consider subclassing the more specific {LibraryCommand} class instead. + # + # @abstract + # @see #run + class Base + # @group Basic Command and Adapter Options + + # @return [Hash] the options passed to the command's constructor + attr_accessor :command_options + + # @return [Adapter] the server adapter + attr_accessor :adapter + + # @return [Boolean] whether to cache + attr_accessor :caching + + # @group Attributes Set Per Request + + # @return [Rack::Request] request object + attr_accessor :request + + # @return [String] the path after the command base URI + attr_accessor :path + + # @return [Hash{String => String}] response headers + attr_accessor :headers + + # @return [Numeric] status code. Defaults to 200 per request + attr_accessor :status + + # @return [String] the response body. Defaults to empty string. + attr_accessor :body + + # @group Instance Method Summary + + # Creates a new command object, setting attributes named by keys + # in the options hash. After initialization, the options hash + # is saved in {#command_options} for further inspection. + # + # @example Creating a Command + # cmd = DisplayObjectCommand.new(:caching => true, :library => mylib) + # cmd.library # => mylib + # cmd.command_options # => {:caching => true, :library => mylib} + # @param [Hash] opts the options hash, saved to {#command_options} + # after initialization. + def initialize(opts = {}) + opts.each do |key, value| + send("#{key}=", value) if respond_to?("#{key}=") + end + self.command_options = opts + end + + # The main method called by a router with a request object. + # + # @note This command should not be overridden by subclasses. Implement + # the callback method {#run} instead. + # @param [Adapter Dependent] request the request object + # @return [Array(Numeric,Hash,Array)] a Rack-style response + # of status, headers, and body wrapped in an array. + def call(request) + self.request = request + self.path ||= request.path_info[1..-1] + self.headers = {'Content-Type' => 'text/html'} + self.body = '' + self.status = 200 + add_cache_control + begin + run + rescue FinishRequest + nil # noop + rescue NotFoundError => e + self.body = e.message if e.message != e.class.to_s + not_found + end + + # keep this to support commands setting status manually. + not_found if status == 404 + + [status, headers, body.is_a?(Array) ? body : [body]] + end + + # @group Abstract Methods + + # Subclass this method to implement a custom command. This method + # should set the {#status} and {#body}, and optionally modify the + # {#headers}. Note that +#status+ defaults to 200. + # + # @example A custom command + # class ErrorCommand < Base + # def run + # self.body = 'ERROR! The System is down!' + # self.status = 500 + # self.headers['Conten-Type'] = 'text/plain' + # end + # end + # + # @abstract + # @return [void] + def run + raise NotImplementedError + end + + protected + + # @group Helper Methods + + # Renders a specific object if provided, or a regular template rendering + # if object is not provided. + # + # @todo This method is dependent on +#options+, it should be in {LibraryCommand}. + # @param [CodeObjects::Base, nil] object calls {CodeObjects::Base#format} if + # an object is provided, or {Templates::Engine.render} if object is nil. Both + # receive +#options+ as an argument. + # @return [String] the resulting output to display + def render(object = nil) + case object + when CodeObjects::Base + cache object.format(options) + when nil + cache Templates::Engine.render(options) + else + cache object + end + end + + # Override this method to implement custom caching mechanisms for + # + # @example Caching to memory + # $memory_cache = {} + # def cache(data) + # $memory_cache[path] = data + # end + # @param [String] data the data to cache + # @return [String] the same cached data (for chaining) + # @see StaticCaching + def cache(data) + if caching && adapter.document_root + path = File.join(adapter.document_root, request.path_info.sub(/\.html$/, '') + '.html') + path = path.sub(%r{/\.html$}, '.html') + FileUtils.mkdir_p(File.dirname(path)) + log.debug "Caching data to #{path}" + File.open(path, 'wb') {|f| f.write(data) } + end + self.body = data + end + + # Sets the body and headers for a 404 response. Does not modify the + # body if already set. + # + # @return [void] + def not_found + self.status = 404 + return unless body.empty? + self.body = "Not found: #{request.path}" + headers['Content-Type'] = 'text/plain' + headers['X-Cascade'] = 'pass' + headers['Cache-Control'] = 'nocache' + end + + # Sets the headers and status code for a redirection to a given URL + # @param [String] url the URL to redirect to + # @raise [FinishRequest] causes the request to terminate. + def redirect(url) + headers['Location'] = url + self.status = 302 + raise FinishRequest + end + + private + + # Add a conservative cache control policy to reduce load on + # requests served with "?1234567890" style timestamp query strings. + def add_cache_control + return if request.query_string.to_i == 0 + headers['Cache-Control'] ||= 'public, max-age=300' + end + end + end + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/server/commands/display_file_command.rb b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/server/commands/display_file_command.rb new file mode 100644 index 000000000..b7828e498 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/server/commands/display_file_command.rb @@ -0,0 +1,29 @@ +# frozen_string_literal: true +module YARD + module Server + module Commands + # Displays a README or extra file. + # + # @todo Implement better support for detecting binary (image) filetypes + class DisplayFileCommand < LibraryCommand + attr_accessor :index + + def run + filename = File.cleanpath(File.join(library.source_path, path)) + raise NotFoundError unless File.file?(filename) + if filename =~ /\.(jpe?g|gif|png|bmp|svg)$/i + headers['Content-Type'] = StaticFileCommand::DefaultMimeTypes[$1.downcase] || 'text/html' + render File.read_binary(filename) + else + file = CodeObjects::ExtraFileObject.new(filename) + options.update :object => Registry.root, + :type => :layout, + :file => file, + :index => index ? true : false + render + end + end + end + end + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/server/commands/display_object_command.rb b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/server/commands/display_object_command.rb new file mode 100644 index 000000000..3f2e7e246 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/server/commands/display_object_command.rb @@ -0,0 +1,65 @@ +# frozen_string_literal: true +module YARD + module Server + module Commands + # Displays documentation for a specific object identified by the path + class DisplayObjectCommand < LibraryCommand + include DocServerHelper + + def run + if path.empty? + if options.readme + filename = options.readme.filename + opts = adapter.options.merge( + :index => true, :library => library, + :path => filename.sub(%r{^#{library.source_path.to_s}/}, '') + ) + self.status, self.headers, self.body = + *DisplayFileCommand.new(opts).call(request) + cache(body) + return + else + self.path = 'index' + end + end + return index if path == 'index' + + object = Registry.at(object_path) + if object + options.update(:type => :layout) + render(object) + else + not_found + end + end + + def index + Registry.load_all + + options.update( + :object => '_index.html', + :objects => Registry.all(:module, :class), + :type => :layout + ) + render + end + + def not_found + super + self.body = "Could not find object: #{object_path}" + end + + private + + def object_path + return @object_path if @object_path + if path == "toplevel" + @object_path = :root + else + @object_path = path.sub(':', '#').gsub('/', '::').sub(/^toplevel\b/, '').sub(/\.html$/, '') + end + end + end + end + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/server/commands/frames_command.rb b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/server/commands/frames_command.rb new file mode 100644 index 000000000..a895e25f2 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/server/commands/frames_command.rb @@ -0,0 +1,16 @@ +# frozen_string_literal: true +module YARD + module Server + module Commands + # Displays an object wrapped in frames + class FramesCommand < DisplayObjectCommand + def run + options.update(:frames => true, :type => :fulldoc) + tpl = fulldoc_template + tpl.generate_frameset + cache(tpl.contents) + end + end + end + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/server/commands/library_command.rb b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/server/commands/library_command.rb new file mode 100644 index 000000000..4a194d1e5 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/server/commands/library_command.rb @@ -0,0 +1,187 @@ +# frozen_string_literal: true +require 'thread' + +module YARD + module Server + module Commands + class LibraryOptions < CLI::YardocOptions + def adapter; @command.adapter end + def library; @command.library end + def single_library; @command.single_library end + def serializer; @command.serializer end + def serialize; false end + + attr_accessor :command + attr_accessor :frames + + def each(&block) + super(&block) + yield(:adapter, adapter) + yield(:library, library) + yield(:single_library, single_library) + yield(:serializer, serializer) + end + end + + # This is the base command for all commands that deal directly with libraries. + # Some commands do not, but most (like {DisplayObjectCommand}) do. If your + # command deals with libraries directly, subclass this class instead. + # See {Base} for notes on how to subclass a command. + # + # @abstract + class LibraryCommand < Base + begin + Process.fork { } + CAN_FORK = true + rescue Exception # rubocop:disable Lint/RescueException + CAN_FORK = false + end + + # @return [LibraryVersion] the object containing library information + attr_accessor :library + + # @return [LibraryOptions] default options for the library + attr_accessor :options + + # @return [Serializers::Base] the serializer used to perform file linking + attr_accessor :serializer + + # @return [Boolean] whether router should route for multiple libraries + attr_accessor :single_library + + # @return [Boolean] whether to reparse data + attr_accessor :incremental + + # @return [Boolean] whether or not this adapter calls +fork+ when serving + # library requests. Defaults to false. + attr_accessor :use_fork + + # Needed to synchronize threads in {#setup_yardopts} + # @private + @@library_chdir_lock = Mutex.new + + def initialize(opts = {}) + super + self.serializer = DocServerSerializer.new + end + + def call(request) + if can_fork? + call_with_fork(request) { super } + else + begin + save_default_template_info + call_without_fork(request) { super } + ensure + restore_template_info + end + end + end + + private + + def call_without_fork(request) + self.request = request + self.options = LibraryOptions.new + options.reset_defaults + options.command = self + setup_library + options.title = "Documentation for #{library.name} " + + (library.version ? '(' + library.version + ')' : '') + yield + rescue LibraryNotPreparedError + not_prepared + end + + def call_with_fork(request, &block) + reader, writer = IO.pipe + + fork do + log.debug "[pid=#{Process.pid}] fork serving: #{request.path}" + reader.close + writer.print(Marshal.dump(call_without_fork(request, &block))) + end + + writer.close + Marshal.load(reader.read) + end + + def can_fork? + CAN_FORK && use_fork + end + + def save_default_template_info + @old_template_paths = Templates::Engine.template_paths.dup + @old_extra_includes = Templates::Template.extra_includes.dup + end + + def restore_template_info + Templates::Engine.template_paths = @old_template_paths + Templates::Template.extra_includes = @old_extra_includes + end + + def setup_library + library.prepare! if request.xhr? && request.query['process'] + load_yardoc + setup_yardopts + true + end + + def setup_yardopts + @@library_chdir_lock.synchronize do + Dir.chdir(library.source_path) do + yardoc = CLI::Yardoc.new + if incremental + yardoc.run('-c', '-n', '--no-stats') + else + yardoc.parse_arguments + end + yardoc.send(:verify_markup_options) + yardoc.options.delete(:serializer) + yardoc.options.delete(:serialize) + options.update(yardoc.options.to_hash) + end + end + end + + def load_yardoc + raise LibraryNotPreparedError unless library.ready? + if Thread.current[:__yard_last_yardoc__] == library.yardoc_file + log.debug "Reusing yardoc file: #{library.yardoc_file}" + return + end + Registry.clear + Templates::ErbCache.clear! + Registry.load_yardoc(library.yardoc_file) + Thread.current[:__yard_last_yardoc__] = library.yardoc_file + end + + def not_prepared + options.update(:template => :doc_server, :type => :processing) + self.caching = false + self.status = 202 + self.body = render + self.headers = {'Content-Type' => 'text/html'} + [status, headers, [body]] + end + + # Hack to load a custom fulldoc template object that does + # not do any rendering/generation. We need this to access the + # generate_*_list methods. + def fulldoc_template + tplopts = [options.template, :fulldoc, options.format] + tplclass = Templates::Engine.template(*tplopts) + obj = Object.new.extend(tplclass) + class << obj; define_method(:init) {} end + obj.class = tplclass + obj.send(:initialize, options) + class << obj + attr_reader :contents + define_method(:asset) {|_, contents| @contents = contents } + end + obj + end + end + end + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/server/commands/library_index_command.rb b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/server/commands/library_index_command.rb new file mode 100644 index 000000000..b26eae19b --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/server/commands/library_index_command.rb @@ -0,0 +1,28 @@ +# frozen_string_literal: true +module YARD + module Server + module Commands + class LibraryIndexOptions < CLI::YardocOptions + attr_accessor :adapter, :libraries + default_attr :template, :doc_server + default_attr :type, :library_list + default_attr :serialize, false + end + + # Returns the index of libraries served by the server. + class LibraryIndexCommand < Base + attr_accessor :options + + def run + return unless path.empty? + + self.options = LibraryIndexOptions.new + options.adapter = adapter + options.libraries = adapter.libraries + options.reset_defaults + render + end + end + end + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/server/commands/list_command.rb b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/server/commands/list_command.rb new file mode 100644 index 000000000..cdaacd256 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/server/commands/list_command.rb @@ -0,0 +1,25 @@ +# frozen_string_literal: true +module YARD + module Server + module Commands + # Returns a list of objects of a specific type + class ListCommand < LibraryCommand + include Templates::Helpers::BaseHelper + + def run + Registry.load_all + options.update(:objects => run_verifier(Registry.all(:class, :module))) + list_type = request.path.split('/').last + meth = "generate_#{list_type}_list" + tpl = fulldoc_template + if tpl.respond_to?(meth) + tpl.send(meth) + cache(tpl.contents) + else + not_found + end + end + end + end + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/server/commands/root_request_command.rb b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/server/commands/root_request_command.rb new file mode 100644 index 000000000..c6164dac0 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/server/commands/root_request_command.rb @@ -0,0 +1,15 @@ +# frozen_string_literal: true +module YARD + module Server + module Commands + # Serves requests from the root of the server + class RootRequestCommand < Base + include StaticFileHelpers + + def run + static_template_file? || favicon? || not_found + end + end + end + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/server/commands/search_command.rb b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/server/commands/search_command.rb new file mode 100644 index 000000000..433514b47 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/server/commands/search_command.rb @@ -0,0 +1,79 @@ +# frozen_string_literal: true +module YARD + module Server + module Commands + # Performs a search over the objects inside of a library and returns + # the results as HTML or plaintext + class SearchCommand < LibraryCommand + include Templates::Helpers::BaseHelper + include Templates::Helpers::ModuleHelper + include DocServerHelper + + attr_accessor :results, :query + + def run + Registry.load_all + self.query = request.query['q'] + redirect(abs_url(adapter.router.docs_prefix, single_library ? library : '')) if query.nil? || query =~ /\A\s*\Z/ + + found = Registry.at(query) + redirect(url_for(found)) if found + + search_for_object + request.xhr? ? serve_xhr : serve_normal + end + + def visible_results + results[0, 10] + end + + private + + def url_for(object) + abs_url(base_path(router.docs_prefix), + serializer.serialized_path(object)) + end + + def serve_xhr + headers['Content-Type'] = 'text/plain' + self.body = visible_results.map {|o| + [(o.type == :method ? o.name(true) : o.name).to_s, + o.path, + o.namespace.root? ? '' : o.namespace.path, + url_for(o)].join(",") + }.join("\n") + end + + def serve_normal + options.update( + :visible_results => visible_results, + :query => query, + :results => results, + :template => :doc_server, + :type => :search + ) + self.body = Templates::Engine.render(options) + end + + def search_for_object + # rubocop:disable Style/MultilineBlockChain + self.results = run_verifier(Registry.all).select do |o| + o.path.downcase.include?(query.downcase) + end.reject do |o| + name = (o.type == :method ? o.name(true) : o.name).to_s.downcase + !name.include?(query.downcase) || + case o.type + when :method + !(query =~ /[#.]/) && query.include?("::") + when :class, :module, :constant, :class_variable + query =~ /[#.]/ + end + end.sort_by do |o| + name = (o.type == :method ? o.name(true) : o.name).to_s + name.length.to_f / query.length.to_f + end + end + end + end + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/server/commands/static_file_command.rb b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/server/commands/static_file_command.rb new file mode 100644 index 000000000..c7f4b7e68 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/server/commands/static_file_command.rb @@ -0,0 +1,23 @@ +# frozen_string_literal: true +module YARD + module Server + module Commands + # Serves static content when no other router matches a request + class StaticFileCommand < LibraryCommand + include StaticFileHelpers + + DefaultMimeTypes['js'] = 'text/javascript' + + # Defines the paths used to search for static assets. To define an + # extra path, use {YARD::Server.register_static_path} rather than + # modifying this constant directly. Also note that files in the + # document root will always take precedence over these paths. + STATIC_PATHS = [] + + def run + static_template_file? || not_found + end + end + end + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/server/commands/static_file_helpers.rb b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/server/commands/static_file_helpers.rb new file mode 100644 index 000000000..285fc8168 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/server/commands/static_file_helpers.rb @@ -0,0 +1,61 @@ +# frozen_string_literal: true +require 'webrick/httputils' + +module YARD + module Server + module Commands + # Include this module to get access to {#static_template_file?} + # and {favicon?} helpers. + module StaticFileHelpers + include WEBrick::HTTPUtils + + # Serves an empty favicon. + # @raise [FinishRequest] finalizes an empty body if the path matches + # /favicon.ico so browsers don't complain. + def favicon? + return unless request.path == '/favicon.ico' + headers['Content-Type'] = 'image/png' + self.status = 200 + self.body = '' + raise FinishRequest + end + + # Attempts to route a path to a static template file. + # + # @raise [FinishRequest] if a file was found and served + # @return [void] + def static_template_file? + # this const was defined in StaticFileCommand originally + default_mime_types = StaticFileCommand::DefaultMimeTypes + + file = find_file(adapter, path) + + if file + ext = "." + (path[/\.(\w+)$/, 1] || "html") + headers['Content-Type'] = mime_type(ext, default_mime_types) + self.body = File.read(file) + raise FinishRequest + end + end + + module_function + + def find_file(adapter, url) + # this const was defined in StaticFileCommand originally + static_paths = StaticFileCommand::STATIC_PATHS + + file = nil + ([adapter.document_root] + static_paths.reverse).compact.each do |path_prefix| + file = File.join(path_prefix, url) + break if File.exist?(file) + file = nil + end + + # Search in default/fulldoc/html template if nothing in static asset paths + assets_template = Templates::Engine.template(:default, :fulldoc, :html) + file || assets_template.find_file(url) + end + end + end + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/server/doc_server_helper.rb b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/server/doc_server_helper.rb new file mode 100644 index 000000000..9256afcaf --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/server/doc_server_helper.rb @@ -0,0 +1,91 @@ +# frozen_string_literal: true +module YARD + module Server + # A module that is mixed into {Templates::Template} in order to customize + # certain template methods. + module DocServerHelper + # Modifies {Templates::Helpers::HtmlHelper#url_for} to return a URL instead + # of a disk location. + # @param (see Templates::Helpers::HtmlHelper#url_for) + # @return (see Templates::Helpers::HtmlHelper#url_for) + def url_for(obj, anchor = nil, relative = false) # rubocop:disable Lint/UnusedMethodArgument + return '' if obj.nil? + return url_for_index if obj == '_index.html' + return abs_url(base_path(router.static_prefix), obj) if String === obj + url = super(obj, anchor, false) + return unless url + abs_url(base_path(router.docs_prefix), url) + end + + # Modifies {Templates::Helpers::HtmlHelper#url_for_file} to return a URL instead + # of a disk location. + # @param (see Templates::Helpers::HtmlHelper#url_for_file) + # @return (see Templates::Helpers::HtmlHelper#url_for_file) + def url_for_file(filename, anchor = nil) + if filename.is_a?(CodeObjects::ExtraFileObject) + filename = filename.filename + end + fname = filename.sub(%r{^#{@library.source_path.to_s}/}, '') + fname += "##{anchor}" if anchor && !anchor.empty? + abs_url(base_path(router.docs_prefix), 'file', fname) + end + + # Modifies {Templates::Helpers::HtmlHelper#url_for_list} to return a URL + # based on the list prefix instead of a HTML filename. + # @param (see Templates::Helpers::HtmlHelper#url_for_list) + # @return (see Templates::Helpers::HtmlHelper#url_for_list) + def url_for_list(type) + abs_url(base_path(router.list_prefix), type.to_s) + end + + # Returns the frames URL for the page + # @return (see Templates::Helpers::HtmlHelper#url_for_frameset) + def url_for_frameset + options.file ? url_for_file(options.file) : url_for(object) + end + + # Returns the main URL, first checking a readme and then linking to the index + # @return (see Templates::Helpers::HtmlHelper#url_for_main) + def url_for_main + options.readme ? url_for_file(options.readme) : url_for_index + end + + # Returns the URL for the alphabetic index page + # @return (see Templates::Helpers::HtmlHelper#url_for_index) + def url_for_index + abs_url(base_path(router.docs_prefix), 'index') + end + + # @param path_components [Array] components of a URL + # @return [String] the absolute path from any mounted base URI. + def abs_url(*path_components) + File.join(router.request.script_name, *path_components) + end + + # @example The base path for a library 'foo' + # base_path('docs') # => 'docs/foo' + # @param [String] path the path prefix for a base path URI + # @return [String] the base URI for a library with an extra +path+ prefix + def base_path(path) + libname = router.request.version_supplied ? @library.to_s : @library.name + path + (@single_library ? '' : "/#{libname}") + end + + # @return [Router] convenience method for accessing the router + def router; @adapter.router end + + # @return [String] a timestamp for a given file + def mtime(file) + file = YARD::Server::Commands::StaticFileHelpers.find_file(@adapter, file) + file ? File.mtime(file).to_i : nil + end + + # @return [String] a URL for a file with a timestamp + def mtime_url(file) + url = url_for(file) + time = mtime(file) + url + (time ? "?#{time}" : "") + end + end + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/server/doc_server_serializer.rb b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/server/doc_server_serializer.rb new file mode 100644 index 000000000..131cda807 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/server/doc_server_serializer.rb @@ -0,0 +1,39 @@ +# frozen_string_literal: true +module YARD + module Server + # A custom {Serializers::Base serializer} which returns resource URLs instead of + # static relative paths to files on disk. + class DocServerSerializer < Serializers::FileSystemSerializer + def initialize(_command = nil) + super(:basepath => '', :extension => '') + end + + def serialized_path(object) + case object + when CodeObjects::RootObject + "toplevel" + when CodeObjects::ExtendedMethodObject + serialized_path(object.namespace) + ':' + urlencode(object.name.to_s) + when CodeObjects::MethodObject + serialized_path(object.namespace) + + (object.scope == :instance ? ":" : ".") + urlencode(object.name.to_s) + when CodeObjects::ConstantObject, CodeObjects::ClassVariableObject + serialized_path(object.namespace) + "##{object.name}-#{object.type}" + when CodeObjects::ExtraFileObject + super(object).gsub(/^file\./, 'file/') + else + super(object) + end + end + + private + + def urlencode(name) + if name.respond_to?(:force_encoding) + name = name.dup.force_encoding('binary') + end + Templates::Helpers::HtmlHelper.urlencode(name) + end + end + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/server/library_version.rb b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/server/library_version.rb new file mode 100644 index 000000000..a3ab31b4d --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/server/library_version.rb @@ -0,0 +1,277 @@ +# frozen_string_literal: true +require 'fileutils' +require 'thread' + +module YARD + module Server + # This exception is raised when {LibraryVersion#prepare!} fails, or discovers + # that the library is not "prepared" to be served by + class LibraryNotPreparedError < RuntimeError; end + + # A library version encapsulates a library's documentation at a specific version. + # Although the version is optional, this allows for creating multiple documentation + # points for a specific library, each representing a unique version. The term + # "library" used in other parts of the YARD::Server documentation refers to + # objects of this class unless otherwise noted. + # + # A library points to a location where a {#yardoc_file} is located so that + # its documentation may be loaded and served. Optionally, a {#source_path} is + # given to point to a location where any extra files (and {YARD::CLI::Yardoc .yardopts}) + # should be loaded from. Both of these methods may not be known immediately, + # since the yardoc file may not be built until later. Resolving the yardoc + # file and source path are dependent on the specific library "source type" used. + # Source types (known as "library source") are discussed in detail below. + # + # == Using with Adapters + # A list of libraries need to be passed into adapters upon creation. In + # most cases, you will never do this manually, but if you use a {RackMiddleware}, + # you will need to pass in this list yourself. To build this list of libraries, + # you should create a hash of library names mapped to an *Array* of LibraryVersion + # objects. For example: + # + # {'mylib' => [LibraryVersion.new('mylib', '1.0', ...), + # LibraryVersion.new('mylib', '2.0', ...)]} + # + # Note that you can also use {Adapter#add_library} for convenience. + # + # The "array" part is required, even for just one library version. + # + # == Library Sources + # The {#source} method represents the library source type, ie. where the + # library "comes from". It might come from "disk", or it might come from a + # "gem" (technically the disk, but a separate type nonetheless). In these + # two cases, the yardoc file sits somewhere on your filesystem, though + # it may also be built dynamically if it does not yet exist. This behaviour + # is controlled through the {#prepare!} method, which prepares the yardoc file + # given a specific library source. We will see how this works in detail in + # the following section. + # + # == Implementing a Custom Library Source + # YARD can be extended to support custom library sources in order to + # build or retrieve a yardoc file at runtime from many different locations. + # + # To implement this behaviour, 3 methods can be added to the +LibraryVersion+ + # class, +#load_yardoc_from_SOURCE+, +#yardoc_file_for_SOURCE+, and + # +#source_path_for_SOURCE+. In all cases, "SOURCE" represents the source + # type used in {#source} when creating the library object. The + # +#yardoc_file_for_SOURCE+ and +#source_path_for_SOURCE+ methods are called upon + # creation and should return the location where the source code for the library + # lives. The load method is called from {#prepare!} if there is no yardoc file + # and should set {#yardoc_file}. Below is a full example for + # implementing a custom library source, +:http+, which reads packaged .yardoc + # databases from zipped archives off of an HTTP server. + # + # Note that only +#load_yardoc_from_SOURCE+ is required. The other two + # methods are optional and can be set manually (via {#source_path=} and + # {#yardoc_file=}) on the object at any time. + # + # @example Implementing a Custom Library Source + # # Adds the source type "http" for .yardoc files zipped on HTTP servers + # class LibraryVersion + # def load_yardoc_from_http + # Thread.new do + # # zip/unzip method implementations are not shown + # download_zip_file("http://mysite.com/yardocs/#{self}.zip") + # unzip_file_to("/path/to/yardocs/#{self}") + # end + # + # # tell the server it's not ready yet (but it might be next time) + # raise LibraryNotPreparedError + # end + # + # def yardoc_file_for_http + # "/path/to/yardocs/#{self}/.yardoc" + # end + # + # def source_path_for_http + # File.dirname(yardoc_file) + # end + # end + # + # # Creating a library of this source type: + # LibraryVersion.new('name', '1.0', nil, :http) + # + class LibraryVersion + # @return [String] the name of the library + attr_accessor :name + + # @return [String] the version of the specific library + attr_accessor :version + + # @return [String] the location of the yardoc file used to load the object + # information from. + # @return [nil] if no yardoc file exists yet. In this case, {#prepare!} will + # be called on this library to build the yardoc file. + # @note To implement a custom yardoc file getter, implement + def yardoc_file + @yardoc_file ||= load_yardoc_file + end + attr_writer :yardoc_file + + # @return [Symbol] the source type representing where the yardoc should be + # loaded from. Defaults are +:disk+ and +:gem+, though custom sources + # may be implemented. This value is used to inform {#prepare!} about how + # to load the necessary data in order to display documentation for an object. + # @see LibraryVersion LibraryVersion documentation for "Implementing a Custom Library Source" + attr_accessor :source + + # @return [String] the location of the source code for a library. This + # value is filled by calling +#source_path_for_SOURCE+ on this class. + # @return [nil] if there is no source code + # @see LibraryVersion LibraryVersion documentation for "Implementing a Custom Library Source" + def source_path + @source_path ||= load_source_path + end + attr_writer :source_path + + # @param [String] name the name of the library + # @param [String] version the specific (usually, but not always, numeric) library + # version + # @param [String] yardoc the location of the yardoc file, or nil if it is + # generated later + # @param [Symbol] source the location of the files used to build the yardoc. + # Builtin source types are +:disk+ or +:gem+. + def initialize(name, version = nil, yardoc = nil, source = :disk) + self.name = name + self.yardoc_file = yardoc + self.version = version + self.source = source + end + + # @param [Boolean] url_format if true, returns the string in a URI-compatible + # format (for appending to a URL). Otherwise, it is given in a more human + # readable format. + # @return [String] the string representation of the library. + def to_s(url_format = true) + version ? "#{name}#{url_format ? '/' : '-'}#{version}" : name.to_s + end + + # @return [Fixnum] used for Hash mapping. + def hash; to_s.hash end + + # @return [Boolean] whether another LibraryVersion is equal to this one + def eql?(other) + other.is_a?(LibraryVersion) && other.name == name && + other.version == version && other.yardoc_file == yardoc_file + end + alias == eql? + alias equal? eql? + + # @return [Boolean] whether the library has been completely processed + # and is ready to be served + def ready? + return false if yardoc_file.nil? + serializer.complete? + end + + # @note You should not directly override this method. Instead, implement + # +load_yardoc_from_SOURCENAME+ when implementing loading for a specific + # source type. See the {LibraryVersion} documentation for "Implementing + # a Custom Library Source" + # + # Prepares a library to be displayed by the server. This callback is + # performed before each request on a library to ensure that it is loaded + # and ready to be viewed. If any steps need to be performed prior to loading, + # they are performed through this method (though they should be implemented + # through the +load_yardoc_from_SOURCE+ method). + # + # @raise [LibraryNotPreparedError] if the library is not ready to be + # displayed. Usually when raising this error, you would simultaneously + # begin preparing the library for subsequent requests, although this + # is not necessary. + def prepare! + return if ready? + meth = "load_yardoc_from_#{source}" + send(meth) if respond_to?(meth, true) + end + + # @return [Gem::Specification] a gemspec object for a given library. Used + # for :gem source types. + # @return [nil] if there is no installed gem for the library + def gemspec + ver = version ? "= #{version}" : ">= 0" + YARD::GemIndex.find_all_by_name(name, ver).last + end + + protected + + @@chdir_mutex = Mutex.new + + # Called when a library of source type "disk" is to be prepared. In this + # case, the {#yardoc_file} should already be set, but the library may not + # be prepared. Run preparation if not done. + # + # @raise [LibraryNotPreparedError] if the yardoc file has not been + # prepared. + def load_yardoc_from_disk + return if ready? + + @@chdir_mutex.synchronize do + Dir.chdir(source_path_for_disk) do + Thread.new do + CLI::Yardoc.run('--no-stats', '-n', '-b', yardoc_file) + end + end + end + + raise LibraryNotPreparedError + end + + # Called when a library of source type "gem" is to be prepared. In this + # case, the {#yardoc_file} needs to point to the correct location for + # the installed gem. The yardoc file is built if it has not been done. + # + # @raise [LibraryNotPreparedError] if the gem does not have an existing + # yardoc file. + def load_yardoc_from_gem + return if ready? + ver = version ? "= #{version}" : ">= 0" + + @@chdir_mutex.synchronize do + Thread.new do + # Build gem docs on demand + log.debug "Building gem docs for #{to_s(false)}" + CLI::Gems.run(name, ver) + log.debug "Done building gem docs for #{to_s(false)}" + end + end + + raise LibraryNotPreparedError + end + + # @return [String] the source path for a disk source + def source_path_for_disk + File.dirname(yardoc_file) if yardoc_file + end + + # @return [String] the source path for a gem source + def source_path_for_gem + gemspec.full_gem_path if gemspec + end + + # @return [String] the yardoc file for a gem source + def yardoc_file_for_gem + require 'rubygems' + ver = version ? "= #{version}" : ">= 0" + Registry.yardoc_file_for_gem(name, ver) + end + + private + + def load_source_path + meth = "source_path_for_#{source}" + send(meth) if respond_to?(meth, true) + end + + def load_yardoc_file + meth = "yardoc_file_for_#{source}" + send(meth) if respond_to?(meth, true) + end + + def serializer + return if yardoc_file.nil? + Serializers::YardocSerializer.new(yardoc_file) + end + end + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/server/rack_adapter.rb b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/server/rack_adapter.rb new file mode 100644 index 000000000..0fadf8ede --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/server/rack_adapter.rb @@ -0,0 +1,89 @@ +# frozen_string_literal: true +require 'rack' +require 'webrick/httputils' + +module YARD + module Server + # This class wraps the {RackAdapter} into a Rack-compatible middleware. + # See {#initialize} for a list of options to pass via Rack's +#use+ method. + # + # @note You must pass a +:libraries+ option to the RackMiddleware via +#use+. To + # read about how to return a list of libraries, see {LibraryVersion} or look + # at the example below. + # @example Using the RackMiddleware in a Rack application + # libraries = {:mylib => [YARD::Server::LibraryVersion.new('mylib', nil, '/path/to/.yardoc')]} + # use YARD::Server::RackMiddleware, :libraries => libraries + # + class RackMiddleware + # Creates a new Rack-based middleware for serving YARD documentation. + # + # @param app the next Rack middleware in the stack + # @option opts [Hash{String=>Array}] :libraries ({}) + # the map of libraries to serve through the adapter. This option is *required*. + # @option opts [Hash] :options ({}) a list of options to pass to the adapter. + # See {Adapter#options} for a list. + # @option opts [Hash] :server_options ({}) a list of options to pass to the server. + # See {Adapter#server_options} for a list. + def initialize(app, opts = {}) + args = [opts[:libraries] || {}, opts[:options] || {}, opts[:server_options] || {}] + @app = app + @adapter = RackAdapter.new(*args) + end + + def call(env) + status, headers, body = *@adapter.call(env) + if status == 404 + @app.call(env) + else + [status, headers, body] + end + end + end + + # A server adapter to respond to requests using the Rack server infrastructure. + class RackAdapter < Adapter + include WEBrick::HTTPUtils + + # Responds to Rack requests and builds a response with the {Router}. + # @return [Array(Numeric,Hash,Array)] the Rack-style response + def call(env) + request = Rack::Request.new(env) + request.path_info = unescape(request.path_info) # unescape things like %3F + router.call(request) + rescue StandardError => ex + log.backtrace(ex) + [500, {'Content-Type' => 'text/plain'}, + [ex.message + "\n" + ex.backtrace.join("\n")]] + end + + # Starts the +Rack::Server+. This method will pass control to the server and + # block. + # @return [void] + def start + server = Rack::Server.new(server_options) + server.instance_variable_set("@app", self) + print_start_message(server) + server.start + end + + private + + def print_start_message(server) + opts = server.default_options.merge(server.options) + log.puts ">> YARD #{YARD::VERSION} documentation server at http://#{opts[:Host]}:#{opts[:Port]}" + + # Only happens for Mongrel + return unless server.server.to_s == "Rack::Handler::Mongrel" + log.puts ">> #{server.server.class_name} web server (running on Rack)" + log.puts ">> Listening on #{opts[:Host]}:#{opts[:Port]}, CTRL+C to stop" + end + end + end +end + +# @private +class Rack::Request + attr_accessor :version_supplied + alias query params + def xhr?; (env['HTTP_X_REQUESTED_WITH'] || "").casecmp("xmlhttprequest") == 0 end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/server/router.rb b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/server/router.rb new file mode 100644 index 000000000..c12753ceb --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/server/router.rb @@ -0,0 +1,187 @@ +# frozen_string_literal: true +module YARD + module Server + # A router class implements the logic used to recognize a request for a specific + # URL and run specific {Commands::Base commands}. + # + # == Subclassing Notes + # To create a custom router, subclass this class and pass it into the adapter + # options through {Adapter#initialize} or by directly modifying {Adapter#router}. + # + # The most general customization is to change the URL prefixes recognized by + # routing, which can be done by overriding {#docs_prefix}, {#list_prefix}, + # {#static_prefix}, and {#search_prefix}. + # + # == Implementing Custom Caching + # By default, the Router class performs static disk-based caching on all + # requests through the +#check_static_cache+. To override this behaviour, + # or create your own caching mechanism, mixin your own custom module with + # this method implemented as per {StaticCaching#check_static_cache}. + # + # @example Creating a subclassed router + # # Adds 'my' to all routing prefixes + # class MyRouter < YARD::Server::Router + # def docs_prefix; 'mydocs' end + # def list_prefix; 'mylist' end + # def static_prefix; 'mystatic' end + # def search_prefix; 'mysearch' end + # end + # + # # Using it: + # WebrickAdapter.new(libraries, :router => MyRouter).start + class Router + include StaticCaching + include Commands + + # @return [Adapter Dependent] the request data coming in with the routing + attr_accessor :request + + # @return [Adapter] the adapter used by the router + attr_accessor :adapter + + # Creates a new router for a specific adapter + # + # @param [Adapter] adapter the adapter to route requests to + def initialize(adapter) + self.adapter = adapter + end + + # Perform routing on a specific request, serving the request as a static + # file through {Commands::RootRequestCommand} if no route is found. + # + # @param [Adapter Dependent] request the request object + # @return [Array(Numeric,Hash,Array)] the Rack-style server response data + def call(request) + self.request = request + result = check_static_cache || route + result ? result : RootRequestCommand.new(adapter.options).call(request) + end + + # @group Route Prefixes + + # @return [String] the URI prefix for all object documentation requests + def docs_prefix; 'docs' end + + # @return [String] the URI prefix for all class/method/file list requests + def list_prefix; 'list' end + + # @return [String] the URI prefix for all search requests + def search_prefix; 'search' end + + # @return [String] the URI prefix for all static assets (templates) + def static_prefix; 'static' end + + # @group Routing Methods + + # @return [Array(LibraryVersion, Array)] the library followed + # by the rest of the path components in the request path. LibraryVersion + # will be nil if no matching library was found. + def parse_library_from_path(paths) + return [adapter.libraries.values.first.first, paths] if adapter.options[:single_library] + library = nil + paths = paths.dup + libs = adapter.libraries[paths.first] + if libs + paths.shift + library = libs.find {|l| l.version == paths.first } + if library + request.version_supplied = true if request + paths.shift + else # use the last lib in the list + request.version_supplied = false if request + library = libs.last + end + end + [library, paths] + end + + protected + + # Performs routing algorithm to find which prefix is called, first + # parsing out library name/version information. + # + # @return [Array(Numeric,Hash,Array)] the Rack-style response + # @return [nil] if no route is matched + def route(path = request.path_info) + path = path.gsub(%r{//+}, '/').gsub(%r{^/|/$}, '') + return route_index if path.empty? || path == docs_prefix + case path + when %r{^(#{docs_prefix}|#{list_prefix}|#{search_prefix}|#{static_prefix})(/.*|$)} + prefix = $1 + paths = $2.gsub(%r{^/|/$}, '').split('/') + library, paths = *parse_library_from_path(paths) + return unless library + return case prefix + when docs_prefix; route_docs(library, paths) + when list_prefix; route_list(library, paths) + when search_prefix; route_search(library, paths) + when static_prefix; route_static(library, paths) + end + end + nil + end + + # Routes requests from {#docs_prefix} and calls the appropriate command + # @param [LibraryVersion] library the library to route for + # @param [Array] paths path components (split by '/') + # @return (see #route) + def route_docs(library, paths) + return route_index if library.nil? + case paths.first + when "frames" + paths.shift + cmd = DisplayObjectCommand + when "file" + paths.shift + cmd = DisplayFileCommand + else + cmd = DisplayObjectCommand + end + cmd = cmd.new(final_options(library, paths)) + cmd.call(request) + end + + # Routes for the index of a library / multiple libraries + # @return (see #route) + def route_index + if adapter.options[:single_library] + route_docs(adapter.libraries.values.first.first, []) + else + LibraryIndexCommand.new(adapter.options.merge(:path => '')).call(request) + end + end + + # Routes requests from {#list_prefix} and calls the appropriate command + # @param (see #route_docs) + # @return (see #route_docs) + def route_list(library, paths) + return if paths.empty? + ListCommand.new(final_options(library, paths)).call(request) + end + + # Routes requests from {#search_prefix} and calls the appropriate command + # @param (see #route_docs) + # @return (see #route_docs) + def route_search(library, paths) + return unless paths.empty? + SearchCommand.new(final_options(library, paths)).call(request) + end + + def route_static(library, paths) + StaticFileCommand.new(final_options(library, paths)).call(request) + end + + # @group Utility Methods + + # Adds extra :library/:path option keys to the adapter options. + # Use this method when passing options to a command. + # + # @param (see #route_docs) + # @return [Hash] finalized options + def final_options(library, paths) + path = File.cleanpath(paths.join('/')).gsub(%r{^(\.\./)+}, '') + adapter.options.merge(:library => library, :path => path) + end + end + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/server/static_caching.rb b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/server/static_caching.rb new file mode 100644 index 000000000..ca43b15ac --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/server/static_caching.rb @@ -0,0 +1,46 @@ +# frozen_string_literal: true +module YARD + module Server + # Implements static caching for requests. + # + # @see Router Router documentation for "Caching" + module StaticCaching + # Called by a router to return the cached object. By default, this + # method performs disk-based caching. To perform other forms of caching, + # implement your own +#check_static_cache+ method and mix the module into + # the Router class. + # + # Note that caching does not occur here. This method simply checks for + # the existence of cached data. To actually cache a response, see + # {Commands::Base#cache}. + # + # @example Implementing In-Memory Cache Checking + # module MemoryCaching + # def check_static_cache + # # $memory_cache is filled by {Commands::Base#cache} + # cached_data = $memory_cache[request.path] + # if cached_data + # [200, {'Content-Type' => 'text/html'}, [cached_data]] + # else + # nil + # end + # end + # end + # + # class YARD::Server::Router; include MemoryCaching; end + # @return [Array(Numeric,Hash,Array)] the Rack-style response + # @return [nil] if no cache is available and routing should continue + # @see Commands::Base#cache + def check_static_cache + return nil unless adapter.document_root + cache_path = File.join(adapter.document_root, request.path.sub(/\.html$/, '') + '.html') + cache_path = cache_path.sub(%r{/\.html$}, '.html') + if File.file?(cache_path) + log.debug "Loading cache from disk: #{cache_path}" + return [200, {'Content-Type' => 'text/html'}, [File.read_binary(cache_path)]] + end + nil + end + end + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/server/templates/default/fulldoc/html/css/custom.css b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/server/templates/default/fulldoc/html/css/custom.css new file mode 100644 index 000000000..2b4ef6025 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/server/templates/default/fulldoc/html/css/custom.css @@ -0,0 +1,127 @@ +#search_results h1 { margin-bottom: 0; } +#search_results p { margin-top: 0; margin-bottom: 25px; } +#search_results ul { list-style-position: inside; padding-left: 0; list-style: none; } +#search_results ul li { padding: 7px 15px; font-size: 1.1em; } + +form.search { + z-index: 8000; + position: absolute; + color: #fff; + border: 1px solid #99f; width: 210px; background: #05a; + border-radius: 4px; border-top-left-radius: 0; border-top-right-radius: 0; +} +form.search input { + height: 25px; + padding: 0; + padding-left: 4px; + margin: 4px; + margin-right: 0; + width: 202px; + border: 1px solid #99f; + border-radius: 3px; + font-size: 1.1em; + box-sizing: border-box; + -webkit-appearance: none; +} + +@media (max-width: 920px) { + form.search { + position: absolute; + color: #fff; + width: 100%; + margin-top: 0; + background: #05a; + border-radius: 0; + border: 0; + margin-bottom: 10px; + left: 0; + top: 0; + } + form.search input { + margin-top: 9px; + margin-bottom: 11px; + margin-left: 12px; + padding-left: 6px; + border: 1px solid #eaf0ff; + } + #menu { margin-top: 41px; } + #search a { + border-top-left-radius: 3px; border-top-right-radius: 3px; + background: none; + border: 0; + box-shadow: none; + margin-top: 4px; + padding-bottom: 5px; + color: #eaf0ff; fill: #eaf0ff; + } + #search a.active { + background: #048; border: 0; + } +} + +@media (min-width: 920px) { + form.search { right: 12px; top: 0; } +} + +#menu { padding-top: 5px; } +#content h1 { margin-top: 15px; border-top: 0; } + +#content.error { font-size: 1.2em; } +#content.error p tt { font-size: 1.2em; } +#content.error .note { padding: 12px; } + +.signature .permalink { float: right; font-size: 0.9em; } + +/* autocomplete */ +.ac_results { + padding: 0px; + border: 1px solid black; + width: 500px; + overflow: hidden; + z-index: 99999; +} + +.ac_results ul { + width: 100%; + list-style-position: outside; + list-style: none; + padding: 0; + margin: 0; +} + +.ac_results li { + cursor: pointer; + margin: 0px; + padding: 3px; + display: block; + font-family: sans-serif; + font-size: 12px; + line-height: 16px; + overflow: hidden; + +} + +.ac_loading { + background: white url('/images/processing.gif') right center no-repeat; +} + +.ac_even { + background: #fafafa; border: 1px dotted #fafafa; border-left-width: 0; border-right-width: 0; +} + +.ac_odd { + background: #f0f0f0; border: 1px dotted #f0f0f0; border-left-width: 0; border-right-width: 0; +} + +.ac_over { + background: #ddd; cursor: pointer; border: 1px dotted #fff; border-left-width: 0; border-right-width: 0; +} + +#fade { display: none; position: absolute; top: 0px; left: 0; background: #eee; z-index: -1; width: 100%; height: 100%; border-top: 1px solid #e0e0e0; } +#processing { + position: absolute; width: 400px; height: 200px; margin: auto; background: #fff; padding: 10px 30px; z-index: 20; + -webkit-box-shadow: 0px 0px 20px #444; -moz-box-shadow: 0px 0px 20px #444; + -webkit-border-radius: 4px; + display: none; +} +#processing img { display: block; position: absolute; bottom: 30px; left: 44%; } diff --git a/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/server/templates/default/fulldoc/html/images/processing.gif b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/server/templates/default/fulldoc/html/images/processing.gif new file mode 100644 index 000000000..787eede8c Binary files /dev/null and b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/server/templates/default/fulldoc/html/images/processing.gif differ diff --git a/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/server/templates/default/fulldoc/html/js/autocomplete.js b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/server/templates/default/fulldoc/html/js/autocomplete.js new file mode 100644 index 000000000..2d86fdd4b --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/server/templates/default/fulldoc/html/js/autocomplete.js @@ -0,0 +1,12 @@ +/* + * jQuery Autocomplete plugin 1.1 + * + * Copyright (c) 2009 Jörn Zaefferer + * + * Dual licensed under the MIT and GPL licenses: + * http://www.opensource.org/licenses/mit-license.php + * http://www.gnu.org/licenses/gpl.html + * + * Revision: $Id: jquery.autocomplete.js 15 2009-08-22 10:30:27Z joern.zaefferer $ + */ +eval(function(p,a,c,k,e,r){e=function(c){return(c35?String.fromCharCode(c+29):c.toString(36))};if(!''.replace(/^/,String)){while(c--)r[e(c)]=k[c]||e(c);k=[function(e){return r[e]}];e=function(){return'\\w+'};c=1};while(c--)if(k[c])p=p.replace(new RegExp('\\b'+e(c)+'\\b','g'),k[c]);return p}(';(3($){$.2e.1u({19:3(b,d){5 c=W b=="1B";d=$.1u({},$.M.1T,{Y:c?b:P,y:c?P:b,1J:c?$.M.1T.1J:10,X:d&&!d.1D?10:48},d);d.1y=d.1y||3(a){6 a};d.1v=d.1v||d.1R;6 A.I(3(){1M $.M(A,d)})},L:3(a){6 A.11("L",a)},1k:3(a){6 A.14("1k",[a])},2b:3(){6 A.14("2b")},28:3(a){6 A.14("28",[a])},24:3(){6 A.14("24")}});$.M=3(o,r){5 t={2Y:38,2S:40,2N:46,2I:9,2E:13,2B:27,2x:3I,2v:33,2p:34,2n:8};5 u=$(o).3r("19","3o").Q(r.2Q);5 p;5 m="";5 n=$.M.3c(r);5 s=0;5 k;5 h={1F:C};5 l=$.M.32(r,o,1Z,h);5 j;$.1Y.2X&&$(o.2U).11("45.19",3(){4(j){j=C;6 C}});u.11(($.1Y.2X?"43":"42")+".19",3(a){s=1;k=a.2M;3V(a.2M){O t.2Y:a.1d();4(l.N()){l.30()}w{12(0,D)}R;O t.2S:a.1d();4(l.N()){l.2D()}w{12(0,D)}R;O t.2v:a.1d();4(l.N()){l.2C()}w{12(0,D)}R;O t.2p:a.1d();4(l.N()){l.2A()}w{12(0,D)}R;O r.17&&$.1c(r.S)==","&&t.2x:O t.2I:O t.2E:4(1Z()){a.1d();j=D;6 C}R;O t.2B:l.Z();R;3J:1P(p);p=1O(12,r.1J);R}}).2t(3(){s++}).3E(3(){s=0;4(!h.1F){2r()}}).2q(3(){4(s++>1&&!l.N()){12(0,D)}}).11("1k",3(){5 c=(1r.7>1)?1r[1]:P;3 1N(q,a){5 b;4(a&&a.7){16(5 i=0;i1){5 f=r.S.7;5 c=$(o).18().1I;5 d,1H=0;$.I(b,3(i,a){1H+=a.7;4(c<=1H){d=i;6 C}1H+=f});b[d]=v;v=b.3f(r.S)}v+=r.S}u.K(v);1l();u.14("L",[e.y,e.F]);6 D}3 12(b,c){4(k==t.2N){l.Z();6}5 a=u.K();4(!c&&a==m)6;m=a;a=1m(a);4(a.7>=r.29){u.Q(r.26);4(!r.1s)a=a.J();21(a,3a,1l)}w{1q();l.Z()}};3 15(b){4(!b)6[""];4(!r.17)6[$.1c(b)];6 $.4h(b.23(r.S),3(a){6 $.1c(b).7?$.1c(a):P})}3 1m(a){4(!r.17)6 a;5 c=15(a);4(c.7==1)6 c[0];5 b=$(o).18().1I;4(b==a.7){c=15(a)}w{c=15(a.22(a.37(b),""))}6 c[c.7-1]}3 1G(q,a){4(r.1G&&(1m(u.K()).J()==q.J())&&k!=t.2n){u.K(u.K()+a.37(1m(m).7));$(o).18(m.7,m.7+a.7)}};3 2r(){1P(p);p=1O(1l,4g)};3 1l(){5 c=l.N();l.Z();1P(p);1q();4(r.36){u.1k(3(a){4(!a){4(r.17){5 b=15(u.K()).1n(0,-1);u.K(b.3f(r.S)+(b.7?r.S:""))}w{u.K("");u.14("L",P)}}})}};3 3a(q,a){4(a&&a.7&&s){1q();l.35(a,q);1G(q,a[0].F);l.20()}w{1l()}};3 21(f,d,g){4(!r.1s)f=f.J();5 e=n.31(f);4(e&&e.7){d(f,e)}w 4((W r.Y=="1B")&&(r.Y.7>0)){5 c={4f:+1M 4e()};$.I(r.2Z,3(a,b){c[a]=W b=="3"?b():b});$.4d({4c:"4b",4a:"19"+o.49,2V:r.2V,Y:r.Y,y:$.1u({q:1m(f),47:r.X},c),44:3(a){5 b=r.1A&&r.1A(a)||1A(a);n.1i(f,b);d(f,b)}})}w{l.2T();g(f)}};3 1A(c){5 d=[];5 b=c.23("\\n");16(5 i=0;i]*)("+a.22(/([\\^\\$\\(\\)\\[\\]\\{\\}\\*\\.\\+\\?\\|\\\\])/2K,"\\\\$1")+")(?![^<>]*>)(?![^&;]+;)","2K"),"<2J>$1")},1D:D,1E:3S};$.M.3c=3(g){5 h={};5 j=0;3 1f(s,a){4(!g.1s)s=s.J();5 i=s.2H(a);4(g.1w=="3R"){i=s.J().1k("\\\\b"+a.J())}4(i==-1)6 C;6 i==0||g.1w};3 1i(q,a){4(j>g.1g){1o()}4(!h[q]){j++}h[q]=a}3 1e(){4(!g.y)6 C;5 f={},2G=0;4(!g.Y)g.1g=1;f[""]=[];16(5 i=0,2F=g.y.7;i<2F;i++){5 c=g.y[i];c=(W c=="1B")?[c]:c;5 d=g.1v(c,i+1,g.y.7);4(d===C)1V;5 e=d.3Q(0).J();4(!f[e])f[e]=[];5 b={F:d,y:c,L:g.1z&&g.1z(c)||d};f[e].1U(b);4(2G++0){5 c=h[k];$.I(c,3(i,x){4(1f(x.F,q)){a.1U(x)}})}}6 a}w 4(h[q]){6 h[q]}w 4(g.1f){16(5 i=q.7-1;i>=g.29;i--){5 c=h[q.3O(0,i)];4(c){5 a=[];$.I(c,3(i,x){4(1f(x.F,q)){a[a.7]=x}});6 a}}}6 P}}};$.M.32=3(e,g,f,k){5 h={H:"3N"};5 j,z=-1,y,1t="",1S=D,G,B;3 2y(){4(!1S)6;G=$("<3M/>").Z().Q(e.2P).T("3L","3K").1Q(1K.2w);B=$("<3H/>").1Q(G).3G(3(a){4(U(a).2u&&U(a).2u.3F()==\'2s\'){z=$("1L",B).1h(h.H).3D(U(a));$(U(a)).Q(h.H)}}).2q(3(a){$(U(a)).Q(h.H);f();g.2t();6 C}).3C(3(){k.1F=D}).3B(3(){k.1F=C});4(e.E>0)G.T("E",e.E);1S=C}3 U(a){5 b=a.U;3A(b&&b.3z!="2s")b=b.3y;4(!b)6[];6 b}3 V(b){j.1n(z,z+1).1h(h.H);2o(b);5 a=j.1n(z,z+1).Q(h.H);4(e.1D){5 c=0;j.1n(0,z).I(3(){c+=A.1a});4((c+a[0].1a-B.1b())>B[0].3x){B.1b(c+a[0].1a-B.3w())}w 4(c=j.1j()){z=0}}3 2m(a){6 e.X&&e.X").3v(e.1y(a,1t)).Q(i%2==0?"3u":"3P").1Q(B)[0];$.y(c,"2k",y[i])}j=B.3t("1L");4(e.1X){j.1n(0,1).Q(h.H);z=0}4($.2e.2W)B.2W()}6{35:3(d,q){2y();y=d;1t=q;2l()},2D:3(){V(1)},30:3(){V(-1)},2C:3(){4(z!=0&&z-8<0){V(-z)}w{V(-8)}},2A:3(){4(z!=j.1j()-1&&z+8>j.1j()){V(j.1j()-1-z)}w{V(8)}},Z:3(){G&&G.Z();j&&j.1h(h.H);z=-1},N:3(){6 G&&G.3s(":N")},3q:3(){6 A.N()&&(j.2j("."+h.H)[0]||e.1X&&j[0])},20:3(){5 a=$(g).3p();G.T({E:W e.E=="1B"||e.E>0?e.E:$(g).E(),2i:a.2i+g.1a,1W:a.1W}).20();4(e.1D){B.1b(0);B.T({2L:e.1E,3n:\'3X\'});4($.1Y.3m&&W 1K.2w.3l.2L==="1x"){5 c=0;j.I(3(){c+=A.1a});5 b=c>e.1E;B.T(\'3k\',b?e.1E:c);4(!b){j.E(B.E()-2R(j.T("2O-1W"))-2R(j.T("2O-3j")))}}}},2g:3(){5 a=j&&j.2j("."+h.H).1h(h.H);6 a&&a.7&&$.y(a[0],"2k")},2T:3(){B&&B.2z()},1p:3(){G&&G.3i()}}};$.2e.18=3(b,f){4(b!==1x){6 A.I(3(){4(A.2d){5 a=A.2d();4(f===1x||b==f){a.4n("2c",b);a.3h()}w{a.4m(D);a.4l("2c",b);a.4k("2c",f);a.3h()}}w 4(A.3g){A.3g(b,f)}w 4(A.1C){A.1C=b;A.3e=f}})}5 c=A[0];4(c.2d){5 e=1K.18.4j(),3d=c.F,2a="<->",2f=e.3b.7;e.3b=2a;5 d=c.F.2H(2a);c.F=3d;A.18(d,d+2f);6{1I:d,39:d+2f}}w 4(c.1C!==1x){6{1I:c.1C,39:c.3e}}}})(4i);',62,272,'|||function|if|var|return|length|||||||||||||||||||||||||else||data|active|this|list|false|true|width|value|element|ACTIVE|each|toLowerCase|val|result|Autocompleter|visible|case|null|addClass|break|multipleSeparator|css|target|moveSelect|typeof|max|url|hide||bind|onChange||trigger|trimWords|for|multiple|selection|autocomplete|offsetHeight|scrollTop|trim|preventDefault|populate|matchSubset|cacheLength|removeClass|add|size|search|hideResultsNow|lastWord|slice|flush|unbind|stopLoading|arguments|matchCase|term|extend|formatMatch|matchContains|undefined|highlight|formatResult|parse|string|selectionStart|scroll|scrollHeight|mouseDownOnSelect|autoFill|progress|start|delay|document|li|new|findValueCallback|setTimeout|clearTimeout|appendTo|formatItem|needsInit|defaults|push|continue|left|selectFirst|browser|selectCurrent|show|request|replace|split|unautocomplete||loadingClass||setOptions|minChars|teststring|flushCache|character|createTextRange|fn|textLength|selected|in|top|filter|ac_data|fillList|limitNumberOfItems|BACKSPACE|movePosition|PAGEDOWN|click|hideResults|LI|focus|nodeName|PAGEUP|body|COMMA|init|empty|pageDown|ESC|pageUp|next|RETURN|ol|nullData|indexOf|TAB|strong|gi|maxHeight|keyCode|DEL|padding|resultsClass|inputClass|parseInt|DOWN|emptyList|form|dataType|bgiframe|opera|UP|extraParams|prev|load|Select|||display|mustMatch|substring||end|receiveData|text|Cache|orig|selectionEnd|join|setSelectionRange|select|remove|right|height|style|msie|overflow|off|offset|current|attr|is|find|ac_even|html|innerHeight|clientHeight|parentNode|tagName|while|mouseup|mousedown|index|blur|toUpperCase|mouseover|ul|188|default|absolute|position|div|ac_over|substr|ac_odd|charAt|word|180|RegExp|100|switch|400|auto|ac_loading|ac_results||ac_input|keydown|keypress|success|submit||limit|150|name|port|abort|mode|ajax|Date|timestamp|200|map|jQuery|createRange|moveEnd|moveStart|collapse|move'.split('|'),0,{})) \ No newline at end of file diff --git a/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/server/templates/default/layout/html/breadcrumb.erb b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/server/templates/default/layout/html/breadcrumb.erb new file mode 100644 index 000000000..02d6d1a7f --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/server/templates/default/layout/html/breadcrumb.erb @@ -0,0 +1,37 @@ + + + + diff --git a/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/server/templates/default/layout/html/script_setup.erb b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/server/templates/default/layout/html/script_setup.erb new file mode 100644 index 000000000..a2870824c --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/server/templates/default/layout/html/script_setup.erb @@ -0,0 +1,7 @@ + diff --git a/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/server/templates/default/layout/html/setup.rb b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/server/templates/default/layout/html/setup.rb new file mode 100644 index 000000000..e81992a9f --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/server/templates/default/layout/html/setup.rb @@ -0,0 +1,8 @@ +# frozen_string_literal: true +def javascripts + super + %w(js/autocomplete.js) +end + +def stylesheets + super + %w(css/custom.css) +end diff --git a/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/server/templates/default/method_details/html/permalink.erb b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/server/templates/default/method_details/html/permalink.erb new file mode 100644 index 000000000..a994c2460 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/server/templates/default/method_details/html/permalink.erb @@ -0,0 +1,4 @@ + diff --git a/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/server/templates/default/method_details/html/setup.rb b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/server/templates/default/method_details/html/setup.rb new file mode 100644 index 000000000..42520913b --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/server/templates/default/method_details/html/setup.rb @@ -0,0 +1,5 @@ +# frozen_string_literal: true +def init + super + sections.place(:permalink).after_any(:method_signature) +end diff --git a/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/server/templates/doc_server/library_list/html/headers.erb b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/server/templates/doc_server/library_list/html/headers.erb new file mode 100644 index 000000000..42884907b --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/server/templates/doc_server/library_list/html/headers.erb @@ -0,0 +1,8 @@ + +YARD Documentation Server <%= YARD::VERSION %> - Library Listing + + + diff --git a/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/server/templates/doc_server/library_list/html/library_list.erb b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/server/templates/doc_server/library_list/html/library_list.erb new file mode 100644 index 000000000..c45ed6c3b --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/server/templates/doc_server/library_list/html/library_list.erb @@ -0,0 +1,14 @@ + + + + <%= erb(:headers) %> + + +
    +
    + <%= yieldall %> +
    +
    + + diff --git a/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/server/templates/doc_server/library_list/html/listing.erb b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/server/templates/doc_server/library_list/html/listing.erb new file mode 100644 index 000000000..c1ada1d42 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/server/templates/doc_server/library_list/html/listing.erb @@ -0,0 +1,13 @@ +
      + <% @libraries.sort_by {|name, y| name.downcase }.each do |name, library_versions| %> +
    • + <% library_versions = library_versions.dup %> + <% first_lib = library_versions.pop %> + <%= name %> + <% if first_lib.version %> + (<%= first_lib.version %><% if library_versions.size > 0 %>, + <%= library_versions.reverse.map {|lib| "#{lib.version}" }.join(', ') %><% end %>) + <% end %> +
    • + <% end %> +
    diff --git a/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/server/templates/doc_server/library_list/html/setup.rb b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/server/templates/doc_server/library_list/html/setup.rb new file mode 100644 index 000000000..a13cdeac6 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/server/templates/doc_server/library_list/html/setup.rb @@ -0,0 +1,6 @@ +# frozen_string_literal: true +include T('default/layout/html') + +def init + sections :library_list, [:title, :listing, :footer] +end diff --git a/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/server/templates/doc_server/library_list/html/title.erb b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/server/templates/doc_server/library_list/html/title.erb new file mode 100644 index 000000000..d58b51c60 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/server/templates/doc_server/library_list/html/title.erb @@ -0,0 +1,2 @@ +

    YARD Documentation Server <%= YARD::VERSION %>

    +

    Library Listing

    diff --git a/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/server/templates/doc_server/processing/html/processing.erb b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/server/templates/doc_server/processing/html/processing.erb new file mode 100644 index 000000000..4175bbe5a --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/server/templates/doc_server/processing/html/processing.erb @@ -0,0 +1,52 @@ + + + + + + + + + + Processing <%= @library.to_s(false) %> + + + +
    +
    +

    Processing <%= @library.name %>

    +

    + <%= @library.name %> <% if @library.version %>(<%= @library.version %>)<% end %> is being processed. + You'll be redirected when the pages are built, it shouldn't take much longer. +

    + +
    + + diff --git a/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/server/templates/doc_server/processing/html/setup.rb b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/server/templates/doc_server/processing/html/setup.rb new file mode 100644 index 000000000..3d200ef00 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/server/templates/doc_server/processing/html/setup.rb @@ -0,0 +1,4 @@ +# frozen_string_literal: true +def init + sections :processing +end diff --git a/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/server/templates/doc_server/search/html/search.erb b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/server/templates/doc_server/search/html/search.erb new file mode 100644 index 000000000..1ada2abd7 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/server/templates/doc_server/search/html/search.erb @@ -0,0 +1,18 @@ +
    +

    Search Results (for '<%= h @query %>')

    +

    Showing <%= @visible_results.size %> of <%= @results.size %> results

    +
      + <% n = 1 %> + <% @visible_results.each do |result| %> + <% name = result.type == :method ? result.name(true).to_s : result.name.to_s %> + <% path = name.gsub(/(#{Regexp.quote @query})/i, '\1') %> +
    • + <%= path %> + <% if !result.namespace.root? %> + (<%= result.namespace.path %>) + <% end %> +
    • + <% n = n == 2 ? 1 : 2 %> + <% end %> +
    +
    diff --git a/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/server/templates/doc_server/search/html/setup.rb b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/server/templates/doc_server/search/html/setup.rb new file mode 100644 index 000000000..d4483a5da --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/server/templates/doc_server/search/html/setup.rb @@ -0,0 +1,9 @@ +# frozen_string_literal: true +def init + sections :search, [T('../default/layout')] +end + +def search + options.breadcrumb_title = h("Search for '#{@query}'") + yieldall :contents => erb(:search) +end diff --git a/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/server/webrick_adapter.rb b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/server/webrick_adapter.rb new file mode 100644 index 000000000..568e22fd8 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/server/webrick_adapter.rb @@ -0,0 +1,45 @@ +# frozen_string_literal: true +require 'webrick' + +module YARD + module Server + # The main adapter to initialize a WEBrick server. + class WebrickAdapter < Adapter + # Initializes a WEBrick server. If {Adapter#server_options} contains a + # +:daemonize+ key set to true, the server will be daemonized. + def start + server_options[:ServerType] = WEBrick::Daemon if server_options[:daemonize] + server = WEBrick::HTTPServer.new(server_options) + server.mount('/', WebrickServlet, self) + trap("INT") { server.shutdown } + server.start + end + end + + # The main WEBrick servlet implementation, accepting only GET requests. + class WebrickServlet < WEBrick::HTTPServlet::AbstractServlet + attr_accessor :adapter + + def initialize(server, adapter) + super + self.adapter = adapter + end + + # @private + def do_GET(request, response) # rubocop:disable Style/MethodName + status, headers, body = *adapter.router.call(request) + response.status = status + response.body = body.is_a?(Array) ? body[0] : body + headers.each do |key, value| + response[key] = value + end + end + end + end +end + +# @private +class WEBrick::HTTPRequest + attr_accessor :version_supplied + def xhr?; (self['X-Requested-With'] || "").casecmp('xmlhttprequest') == 0 end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/tags/default_factory.rb b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/tags/default_factory.rb new file mode 100644 index 000000000..78bfce41e --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/tags/default_factory.rb @@ -0,0 +1,191 @@ +# frozen_string_literal: true +module YARD + module Tags + class DefaultFactory + TYPELIST_OPENING_CHARS = '[({<' + TYPELIST_CLOSING_CHARS = '>})]' + + # Parses tag text and creates a new tag with descriptive text + # + # @param tag_name the name of the tag to parse + # @param [String] text the raw tag text + # @return [Tag] a tag object with the tag_name and text values filled + def parse_tag(tag_name, text) + Tag.new(tag_name, text.strip) + end + + # Parses tag text and creates a new tag with a key name and descriptive text + # + # @param tag_name the name of the tag to parse + # @param [String] text the raw tag text + # @return [Tag] a tag object with the tag_name, name and text values filled + def parse_tag_with_name(tag_name, text) + name, text = *extract_name_from_text(text) + Tag.new(tag_name, text, nil, name) + end + + # Parses tag text and creates a new tag with formally declared types and + # descriptive text + # + # @param tag_name the name of the tag to parse + # @param [String] text the raw tag text + # @return [Tag] a tag object with the tag_name, types and text values filled + def parse_tag_with_types(tag_name, text) + name, types, text = *extract_types_and_name_from_text(text) + raise TagFormatError, "cannot specify a name before type list for '@#{tag_name}'" if name + Tag.new(tag_name, text, types) + end + + # Parses tag text and creates a new tag with formally declared types, a key + # name and descriptive text + # + # @param tag_name the name of the tag to parse + # @param [String] text the raw tag text + # @return [Tag] a tag object with the tag_name, name, types and text values filled + def parse_tag_with_types_and_name(tag_name, text) + name, types, text = *extract_types_and_name_from_text(text) + name, text = *extract_name_from_text(text) unless name + Tag.new(tag_name, text, types, name) + end + + # Parses tag text and creates a new tag with formally declared types, a title + # on the first line and descriptive text + # + # @param tag_name the name of the tag to parse + # @param [String] text the raw tag text + # @return [Tag] a tag object with the tag_name, name, types and text values filled + def parse_tag_with_types_and_title(tag_name, text) + name, types, text = *extract_types_and_name_from_text_unstripped(text) + if name + title = name + desc = text + else + title, desc = *extract_title_and_desc_from_text(text) + end + Tag.new(tag_name, desc, types, title) + rescue TagFormatError + Tag.new(tag_name, '', types, nil) + end + + def parse_tag_with_title_and_text(tag_name, text) + title, desc = *extract_title_and_desc_from_text(text) + Tag.new(tag_name, desc, nil, title) + end + + def parse_tag_with_types_name_and_default(tag_name, text) + # Can't allow () in a default tag, otherwise the grammar is too ambiguous when types is omitted. + open = TYPELIST_OPENING_CHARS.delete('(') + close = TYPELIST_CLOSING_CHARS.delete(')') + name, types, text = *extract_types_and_name_from_text(text, open, close) + name, text = *extract_name_from_text(text) unless name + if text && text.start_with?('(') + _, default, text = *extract_types_and_name_from_text(text, '(', ')') + DefaultTag.new(tag_name, text, types, name, default) + else + DefaultTag.new(tag_name, text, types, name, nil) + end + end + + def parse_tag_with_options(tag_name, text) + name, text = *extract_name_from_text(text) + OptionTag.new(tag_name, name, parse_tag_with_types_name_and_default(tag_name, text)) + end + + private + + # Extracts the name from raw tag text returning the name and remaining value + # + # @param [String] text the raw tag text + # @return [Array] an array holding the name as the first element and the + # value as the second element + def extract_name_from_text(text) + text.strip.split(/\s+/, 2) + end + + def extract_title_and_desc_from_text(text) + raise TagFormatError if text.nil? || text.empty? + title = nil + desc = nil + if text =~ /\A[ \t]\n/ + desc = text + else + text = text.split(/\r?\n/) + title = text.shift.squeeze(' ').strip + desc = text.join("\n") + end + [title, desc] + end + + # Parses a [], <>, {} or () block at the beginning of a line of text + # into a list of comma delimited values. + # + # @example + # obj.parse_types('[String, Array, nil]') # => [nil, ['String', 'Array', 'nil'], ""] + # obj.parse_types('b A string') # => ['b', ['String'], 'A string'] + # + # @return [Array(String, Array, String)] the text before the type + # list (or nil), followed by the type list parsed into an array of + # strings, followed by the text following the type list. + def extract_types_and_name_from_text(text, opening_types = TYPELIST_OPENING_CHARS, closing_types = TYPELIST_CLOSING_CHARS) + before, list, text = *extract_types_and_name_from_text_unstripped(text, opening_types, closing_types) + if list.nil? + [nil, nil, text.strip] + else + [before ? before.strip : nil, list.map(&:strip), text.strip] + end + end + + def extract_types_and_name_from_text_unstripped(text, opening_types = TYPELIST_OPENING_CHARS, closing_types = TYPELIST_CLOSING_CHARS) + e = 0 + before = String.new("") + list = [String.new("")] + level = 0 + seen_space = false + i = 0 + last_seen = '' + while i < text.length + c = text[i, 1] + + if (c == '"' || c == "'") && text[i..-1] =~ /#{c}.+?#{c}/ + list.last << $& + i += $&.length + next + end + + if level > 0 && c == '#' && text[i + 1..-1] =~ CodeObjects::METHODNAMEMATCH + list.last << c + $& + i += $&.length + 1 + next + elsif opening_types.include?(c) + list.last << c if level > 0 + level += 1 + elsif closing_types.include?(c) + level -= 1 unless last_seen == '=' && c == '>' + break e = i if level == 0 + list.last << c + elsif c == ',' && level == 1 + list.push String.new("") + elsif c =~ /\S/ && level == 0 + break e = i if seen_space && list == [''] + before << c + elsif c =~ /[ \t]/ && level == 0 && !before.empty? + seen_space = true + elsif level >= 1 + list.last << c + elsif level == 0 && c == "\n" + break e = i + end + last_seen = c + i += 1 + end + + before = before.empty? ? nil : before + if list.size == 1 && list.first == '' + [nil, nil, text] + else + [before, list, text[(e + 1)..-1]] + end + end + end + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/tags/default_tag.rb b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/tags/default_tag.rb new file mode 100644 index 000000000..c04f59df0 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/tags/default_tag.rb @@ -0,0 +1,13 @@ +# frozen_string_literal: true +module YARD + module Tags + class DefaultTag < Tag + attr_reader :defaults + + def initialize(tag_name, text, types = nil, name = nil, defaults = nil) + super(tag_name, text, types, name) + @defaults = defaults + end + end + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/tags/directives.rb b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/tags/directives.rb new file mode 100644 index 000000000..8a56da801 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/tags/directives.rb @@ -0,0 +1,625 @@ +# frozen_string_literal: true +require 'ostruct' + +module YARD + module Tags + # The base directive class. Subclass this class to create a custom + # directive, registering it with {Library.define_directive}. Directive + # classes are executed via the {#call} method, which perform all directive + # processing on the object. + # + # If processing occurs within a handler, the {#handler} attribute is + # available to access more information about parsing context and state. + # Handlers are only available when parsing from {Parser::SourceParser}, + # not when parsing directly from {DocstringParser}. If the docstring is + # attached to an object declaration, {#object} will be set and available + # to modify the generated code object directly. Note that both of these + # attributes may be nil, and directives should test their existence + # before attempting to use them. + # + # @abstract Subclasses should implement {#call}. + # @see Library.define_directive + # @since 0.8.0 + class Directive + # @return [Tag] the meta-data tag containing data input to the directive + attr_accessor :tag + + # Set this field to replace the directive definition inside of a docstring + # with arbitrary text. For instance, the {MacroDirective} uses this field + # to expand its macro data in place of the call to a +@!macro+. + # + # @return [String] the text to expand in the original docstring in place + # of this directive definition. + # @return [nil] if no expansion should take place for this directive + attr_accessor :expanded_text + + # @return [DocstringParser] the parser that is parsing all tag + # information out of the docstring + attr_accessor :parser + + # @!attribute [r] object + # @return [CodeObjects::Base, nil] the object the parent docstring is + # attached to. May be nil. + def object; parser.object end + + # @!attribute [r] handler + # @return [Handlers::Base, nil] the handler object the docstring parser + # might be attached to. May be nil. Only available when parsing + # through {Parser::SourceParser}. + def handler; parser.handler end + + # @!endgroup + + # @param [Tag] tag the meta-data tag containing all input to the docstring + # @param [DocstringParser] parser the docstring parser object + def initialize(tag, parser) + self.tag = tag + self.parser = parser + self.expanded_text = nil + end + + # @!group Parser callbacks + + # Called when processing the directive. Subclasses should implement + # this method to perform all functionality of the directive. + # + # @abstract implement this method to perform all data processing for + # the directive. + # @return [void] + def call; raise NotImplementedError end + + # Called after parsing all directives and tags in the docstring. Used + # to perform any cleanup after all directives perform their main task. + # @return [void] + def after_parse; end + + protected :parser + + protected + + def inside_directive? + return true if parser.state.inside_directive + parser.directives.any? { |d| d.is_a?(MethodDirective) && d.tag.text.empty? } + end + end + + # Ends a group listing definition. Group definition automatically end + # when class or module blocks are closed, and defining a new group overrides + # the last group definition, but occasionally you need to end the current + # group to return to the default listing. Use {tag:!group} to begin a + # group listing. + # + # @example + # class Controller + # # @!group Callbacks + # + # def before_filter; end + # def after_filter; end + # + # # @!endgroup + # + # def index; end + # end + # @see tag:!group + # @since 0.6.0 + class EndGroupDirective < Directive + def call + return unless handler + handler.extra_state.group = nil + end + end + + # Defines a group listing. All methods (and attributes) seen after this + # directive are placed into a group with the given description as the + # group name. The group listing is used by templates to organize methods + # and attributes into respective logical groups. To end a group listing + # use {tag:!endgroup}. + # + # @note A group definition only applies to the scope it is defined in. + # If a new class or module is opened after the directive, this directive + # will not apply to methods in that class or module. + # @example + # # @!group Callbacks + # + # def before_filter; end + # def after_filter; end + # @see tag:!endgroup + # @since 0.6.0 + class GroupDirective < Directive + def call + return unless handler + handler.extra_state.group = tag.text + end + end + + # Defines a block of text to be expanded whenever the macro is called by name + # in subsequent docstrings. The macro data can be any arbitrary text data, be + # it regular documentation, meta-data tags or directives. + # + # == Defining a Macro + # + # A macro must first be defined in order to be used. Note that a macro is also + # expanded upon definition if it defined on an object (the docstring of a + # method, class, module or constant object as opposed to a free standing + # comment). To define a macro, use the "new" or "attach" identifier in the + # types specifier list. A macro will also automatically be created if an + # indented macro data block is given, so the keywords are not strictly needed. + # + # === Anonymous Macros + # + # In addition to standard named macros, macros can be defined anonymously if + # no name is given. In this case, they can not be re-used in future docstrings, + # but they will expand in the first definition. This is useful when needing + # to take advantage of the macro expansion variables (described below). + # + # == Using a Macro + # + # To re-use a macro in another docstring after it is defined, simply use + # @!macro the_name with no indented block of macro data. The resulting + # data will be expanded in place. + # + # == Attaching a Macro to a DSL Method + # + # Macros can be defined to auto-expand on DSL-style class method calls. To + # define a macro to be auto expanded in this way, use the "attach" keyword + # in the type specifier list ("new" is implied). + # + # Attached macros can also be attached directly on the class method declaration + # that provides the DSL method to its subclasses. The syntax in either case + # is the same. + # + # == Macro Expansion Variables + # + # In the case of using macros on DSL-style method calls, a number of expansion + # variables can be used for interpolation inside of the macro data. The variables, + # similar in syntax to Ruby's global variables, are as follows: + # + # * $0 - the method name being called + # * $1, $2, $3, ... - the Nth argument in the method call + # * $& - the full source line + # + # The following example shows what the expansion variables might hold for a given + # DSL method call: + # + # property :foo, :a, :b, :c, String + # # $0 => "property" + # # $1 => "foo" + # # $2 => "a" + # # $& => "property :foo, :a, :b, :c, String" + # + # === Ranges + # + # Ranges are also acceptable with the syntax ${N-M}. Negative values + # on either N or M are valid, and refer to indexes from the end of the list. + # Consider a DSL method that creates a method using the first argument with + # argument names following, ending with the return type of the method. This + # could be documented as: + # + # # @!macro dsl_method + # # @!method $1(${2--2}) + # # @return [${-1}] the return value of $0 + # create_method_with_args :foo, :a, :b, :c, String + # + # As described, the method is using the signature foo(a, b, c) and the return + # type from the last argument, +String+. When using ranges, tokens are joined + # with commas. Note that this includes using $0: + # + # !!!plain + # $0-1 # => Interpolates to "create_method_with_args, foo" + # + # If you want to separate them with spaces, use $1 $2 $3 $4 .... Note that + # if the token cannot be expanded, it will return the empty string (not an error), + # so it would be safe to list $1 $2 ... $10, for example. + # + # === Escaping Interpolation + # + # Interpolation can be escaped by prefixing the +$+ with +\\\+, like so: + # + # # @!macro foo + # # I have \$2.00 USD. + # + # @example Defining a simple macro + # # @!macro [new] returnself + # # @return [self] returns itself + # @example Using a simple macro in multiple docstrings + # # Documentation for map + # # ... + # # @macro returnself + # def map; end + # + # # Documentation for filter + # # ... + # # @macro returnself + # def filter; end + # @example Attaching a macro to a class method (for DSL usage) + # class Resource + # # Defines a new property + # # @param [String] name the property name + # # @param [Class] type the property's type + # # @!macro [attach] property + # # @return [$2] the $1 property + # def self.property(name, type) end + # end + # + # class Post < Resource + # property :title, String + # property :view_count, Integer + # end + # @example Attaching a macro directly to a DSL method + # class Post < Resource + # # @!macro [attach] property + # # @return [$2] the $1 property + # property :title, String + # + # # Macro will expand on this definition too + # property :view_count, Integer + # end + # @since 0.7.0 + class MacroDirective < Directive + def call + raise TagFormatError if tag.name.nil? && tag.text.to_s.empty? + macro_data = find_or_create + unless macro_data + warn + return + end + + self.expanded_text = expand(macro_data) + end + + private + + def new? + (tag.types && tag.types.include?('new')) || + (tag.text && !tag.text.strip.empty?) + end + + def attach? + new? && # must have data or there is nothing to attach + class_method? || # always attach to class methods + (tag.types && tag.types.include?('attach')) + end + + def class_method? + object && object.is_a?(CodeObjects::MethodObject) && + object.scope == :class + end + + def anonymous? + tag.name.nil? || tag.name.empty? + end + + def expand(macro_data) + return if attach? && class_method? + return if !anonymous? && new? && + (!handler || handler.statement.source.empty?) + call_params = [] + caller_method = nil + full_source = '' + if handler + call_params = handler.call_params + caller_method = handler.caller_method + full_source = handler.statement.source + end + all_params = ([caller_method] + call_params).compact + CodeObjects::MacroObject.expand(macro_data, all_params, full_source) + end + + def find_or_create + if new? || attach? + if handler && attach? + if object && object.is_a?(CodeObjects::NamespaceObject) + log.warn "Attaching macros to non-methods is unsupported, ignoring: " \ + "#{object.path} (#{handler.parser.file}:#{handler.statement.line})" + obj = nil + else + obj = object ? object : + P("#{handler.namespace}.#{handler.caller_method}") + end + else + obj = nil + end + + return tag.text || "" if anonymous? # anonymous macro + macro = CodeObjects::MacroObject.create(tag.name, tag.text, obj) + else + macro = CodeObjects::MacroObject.find(tag.name) + end + + macro ? macro.macro_data : nil + end + + def warn + if object && handler + log.warn "Invalid/missing macro name for " \ + "#{object.path} (#{handler.parser.file}:#{handler.statement.line})" + end + end + end + + # Defines a method object with a given method signature, using indented + # block data as the method's docstring. The signature is similar to the + # {tag:overload} tag. The comment containing this directive does not need + # to be attached to any source, but if it is, that source code will be + # used as the method's source. + # + # To define an attribute method, see {tag:!attribute} + # + # @note This directive should only be used if there is no explicit + # declaration for the method in any source files (i.e., the method + # is declared dynamically via meta-programming). In all other cases, add + # documentation to the method definition itself. + # @note For backwards compatibility support, you do not need to indent + # the method's docstring text. If a +@!method+ directive is seen with + # no indented block, the entire docstring is used as the new method's + # docstring text. + # @example Defining a simple method + # # @!method quit(username, message = "Quit") + # # Sends a quit message to the server for a +username+. + # # @param [String] username the username to quit + # # @param [String] message the quit message + # quit_message_method + # @example Attaching multiple methods to the same source + # # @!method method1 + # # @!method method2 + # create_methods :method1, :method2 + # @see tag:!attribute + # @since 0.7.0 + class MethodDirective < Directive + SCOPE_MATCH = /\A\s*self\s*\.\s*/ + + def call; end + + def after_parse + return unless handler + use_indented_text + create_object + end + + protected + + def method_name + sig = sanitized_tag_signature + if sig && sig =~ /^#{CodeObjects::METHODNAMEMATCH}(\s|\(|$)/ + sig[/\A\s*([^\(; \t]+)/, 1] + else + handler.call_params.first + end + end + + def method_signature + "def #{sanitized_tag_signature || method_name}" + end + + def sanitized_tag_signature + if tag.name && tag.name =~ SCOPE_MATCH + parser.state.scope = :class + $' + else + tag.name + end + end + + def use_indented_text + return if tag.text.empty? + handler = parser.handler + object = parser.object + self.parser = parser.class.new(parser.library) + parser.state.inside_directive = true + parser.parse(tag.text, object, handler) + parser.state.inside_directive = false + end + + def create_object + name = method_name + scope = parser.state.scope || handler.scope + visibility = parser.state.visibility || handler.visibility + ns = CodeObjects::NamespaceObject === object ? object : handler.namespace + obj = CodeObjects::MethodObject.new(ns, name, scope) + handler.register_file_info(obj) + handler.register_source(obj) + handler.register_visibility(obj, visibility) + handler.register_group(obj) + obj.signature = method_signature + obj.parameters = OverloadTag.new(:overload, method_signature).parameters + obj.docstring = Docstring.new!(parser.text, parser.tags, obj, + parser.raw_text, parser.reference) + handler.register_module_function(obj) + old_obj = parser.object + parser.object = obj + parser.post_process + parser.object = old_obj + obj + end + end + + # Defines an attribute with a given name, using indented block data as the + # attribute's docstring. If the type specifier is supplied with "r", "w", or + # "rw", the attribute is made readonly, writeonly or readwrite respectively. + # A readwrite attribute is the default, if no type is specified. The comment + # containing this directive does not need to be attached to any source, but + # if it is, that source code will be used as the method's source. + # + # To define a regular method, see {tag:!method} + # + # @note This directive should only be used if there is no explicit +attr_*+ + # declaration for the attribute in any source files (i.e., the attribute + # is declared dynamically via meta-programming). In all other cases, add + # documentation to the attribute declaration itself. + # @note For backwards compatibility support, you do not need to indent + # the attribute's docstring text. If an +@!attribute+ directive is seen with + # no indented block, the entire docstring is used as the new attribute's + # docstring text. + # @example Defining a simple readonly attribute + # # @!attribute [r] count + # # @return [Fixnum] the size of the list + # @example Defining a simple readwrite attribute + # # @!attribute name + # # @return [String] the name of the user + # @see tag:!method + # @since 0.7.0 + class AttributeDirective < MethodDirective + def after_parse + return unless handler + use_indented_text + create_attribute_data(create_object) + end + + protected + + def method_name + name = sanitized_tag_signature || handler.call_params.first + name += '=' unless readable? + name + end + + def method_signature + if readable? + "def #{method_name}" + else + "def #{method_name}(value)" + end + end + + private + + def create_attribute_data(object) + return unless object + clean_name = object.name.to_s.sub(/=$/, '') + attrs = object.namespace.attributes[object.scope] + attrs[clean_name] ||= SymbolHash[:read => nil, :write => nil] + attrs[clean_name][:read] = object if readable? + if writable? + if object.name.to_s[-1, 1] == '=' + writer = object + writer.parameters = [['value', nil]] + else + writer = CodeObjects::MethodObject.new(object.namespace, + object.name.to_s + '=', object.scope) + writer.signature = "def #{object.name}=(value)" + writer.visibility = object.visibility + writer.dynamic = object.dynamic + writer.source = object.source + writer.group = object.group + writer.parameters = [['value', nil]] + writer.docstring = object.base_docstring + handler.register_file_info(writer) + end + attrs[clean_name][:write] = writer + end + end + + def writable? + !tag.types || tag.types.join.include?('w') + end + + def readable? + !tag.types || tag.types.join =~ /(?!w)r/ + end + end + + # Parses a block of code as if it were present in the source file at that + # location. This directive is useful if a class has dynamic meta-programmed + # behaviour that cannot be recognized by YARD. + # + # You can specify the language of the code block using the types + # specification list. By default, the code language is "ruby". + # + # @example Documenting dynamic module inclusion + # class User + # # includes "UserMixin" and extends "UserMixin::ClassMethods" + # # using the UserMixin.included callback. + # # @!parse include UserMixin + # # @!parse extend UserMixin::ClassMethods + # end + # @example Declaring a method as an attribute + # # This should really be an attribute + # # @!parse attr_reader :foo + # def object; @parent.object end + # @example Parsing C code + # # @!parse [c] + # # void Init_Foo() { + # # rb_define_method(rb_cFoo, "method", method, 0); + # # } + # @since 0.8.0 + class ParseDirective < Directive + def call + lang = tag.types ? tag.types.first.to_sym : + (handler ? handler.parser.parser_type : :ruby) + if handler && lang == handler.parser.parser_type + pclass = Parser::SourceParser.parser_types[handler.parser.parser_type] + pobj = pclass.new(tag.text, handler.parser.file) + pobj.parse + handler.parser.process(pobj.enumerator) + else # initialize a new parse chain + src_parser = Parser::SourceParser.new(lang, handler ? handler.globals : nil) + src_parser.file = handler.parser.file if handler + src_parser.parse(StringIO.new(tag.text)) + end + end + end + + # Modifies the current parsing scope (class or instance). If this + # directive is defined on a docstring attached to an object definition, + # it is applied only to that object. Otherwise, it applies the scope + # to all future objects in the namespace. + # + # @example Modifying the scope of a DSL method + # # @!scope class + # cattr_accessor :subclasses + # @example Modifying the scope of a set of methods + # # @!scope class + # + # # Documentation for method1 + # def method1; end + # + # # Documentation for method2 + # def method2; end + # @since 0.7.0 + class ScopeDirective < Directive + def call + if %w(class instance module).include?(tag.text) + if object.is_a?(CodeObjects::MethodObject) + object.scope = tag.text.to_sym + elsif handler && !inside_directive? + handler.scope = tag.text.to_sym + else + parser.state.scope = tag.text.to_sym + end + end + end + end + + # Modifies the current parsing visibility (public, protected, or private). + # If this directive is defined on a docstring attached to an object + # definition, it is applied only to that object. Otherwise, it applies + # the visibility to all future objects in the namespace. + # + # @example Modifying the visibility of a DSL method + # # @!visibility private + # cattr_accessor :subclasses + # @example Modifying the visibility of a set of methods + # # Note that Ruby's "protected" is recommended over this directive + # # @!visibility protected + # + # # Documentation for method1 + # def method1; end + # + # # Documentation for method2 + # def method2; end + # @since 0.7.0 + class VisibilityDirective < Directive + def call + if %w(public protected private).include?(tag.text) + if object.is_a?(CodeObjects::Base) + object.visibility = tag.text.to_sym + elsif handler && !inside_directive? + handler.visibility = tag.text.to_sym + else + parser.state.visibility = tag.text.to_sym + end + end + end + end + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/tags/library.rb b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/tags/library.rb new file mode 100644 index 000000000..807962608 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/tags/library.rb @@ -0,0 +1,633 @@ +# frozen_string_literal: true +module YARD + module Tags + # Keeps track of all the registered meta-data tags and directives. + # Also allows for defining of custom tags and customizing the tag parsing + # syntax. + # + # == Defining Custom Meta-Data Tags + # + # To define a custom tag, use {define_tag}. You should pass the tag + # name and the factory method to use when creating the tag. If you do not + # provide a factory method to use, it will default to {DefaultFactory#parse_tag} + # + # You can also define tag objects manually by simply implementing a "tagname_tag" + # method that returns a {Tag} object, but they will not take advantage of tag factory + # parsing: + # + # def mytag_tag(text) + # Tag.new(:mytag, text) + # end + # + # == Defining Custom Directives + # + # Directives can be defined by calling the {define_directive} method, taking + # the directive name, an optional tag factory parser method (to parse the + # data in the directive into a temporary {Tag} object) and a {Directive} subclass + # that performs the directive processing. For more information on creating a + # Directive subclass, see the {Directive} class documentation. + # + # Similar to tags, Directives can also be defined manually, in this case using + # the method name "mydirective_directive" and returning a new {Directive} object: + # + # def mydirective_directive(tag, parser) + # MyDirective.new(tag, parser) + # end + # + # == Namespaced Tags + # + # In YARD 0.8.0+, tags can be namespaced using the '.' character. It is recommended + # to namespace project specific tags, like +@yard.tag_name+, so that tags do not + # collide with other plugins or new built-in tags. + # + # == Adding/Changing the Tag Syntax + # + # If you have specialized tag parsing needs you can substitute the {#factory} + # object with your own by setting {Library.default_factory= Library.default_factory} + # to a new class with its own parsing methods before running YARD. This is useful + # if you want to change the syntax of existing tags (@see, @since, etc.) + # + # @example Defining a custom tag + # define_tag "Parameter", :param, :with_types_and_name + # define_tag "Author", :author + # @example Defining a custom directive + # define_directive :method, :with_title_and_text, MethodDirective + # @see DefaultFactory + # @see define_tag + # @see define_directive + # @see Directive + class Library + class << self + # @return [SymbolHash{Symbol=>String}] the map of tag names and their + # respective display labels. + attr_reader :labels + + # @!attribute instance + # @return [Library] the main Library instance object. + def instance + @instance ||= new + end + + # @!attribute default_factory + # Replace the factory object responsible for parsing tags by setting + # this to an object (or class) that responds to +parse_TAGNAME+ methods + # where +TAGNAME+ is the name of the tag. + # + # You should set this value before performing any source parsing with + # YARD, otherwise your factory class will not be used. + # + # @example + # YARD::Tags::Library.default_factory = MyFactory + # + # @see DefaultFactory + def default_factory + @default_factory ||= DefaultFactory.new + end + + def default_factory=(factory) + @default_factory = factory.is_a?(Class) ? factory.new : factory + end + + # Returns the factory method used to parse the tag text for a specific tag + # + # @param [Symbol] tag the tag name + # @return [Symbol] the factory method name for the tag + # @return [Class,Symbol] the Tag class to use to parse the tag + # or the method to call on the factory class + # @return [nil] if the tag is freeform text + # @since 0.6.0 + def factory_method_for(tag) + @factory_methods[tag] + end + + # Returns the factory method used to parse the tag text for a specific + # directive + # + # @param [Symbol] directive the directive name + # @return [Symbol] the factory method name for the tag + # @return [Class,Symbol] the Tag class to use to parse the tag or + # the methods to call on the factory class + # @return [nil] if the tag is freeform text + # @since 0.8.0 + def factory_method_for_directive(directive) + @directive_factory_classes[directive] + end + + # Sets the list of tags to display when rendering templates. The order of + # tags in the list is also significant, as it represents the order that + # tags are displayed in templates. + # + # You can use the {Array#place} to insert new tags to be displayed in + # the templates at specific positions: + # + # Library.visible_tags.place(:mytag).before(:return) + # + # @return [Array] a list of ordered tags + # @since 0.6.0 + attr_accessor :visible_tags + + # Sets the list of tags that should apply to any children inside the + # namespace they are defined in. For instance, a "@since" tag should + # apply to all methods inside a module it is defined in. Transitive + # tags can be overridden by directly defining a tag on the child object. + # + # @return [Array] a list of transitive tags + # @since 0.6.0 + attr_accessor :transitive_tags + + # Sorts the labels lexically by their label name, often used when displaying + # the tags. + # + # @return [Array, String] the sorted labels as an array of the tag name and label + def sorted_labels + labels.sort_by {|a| a.last.downcase } + end + + # Convenience method to define a new tag using one of {Tag}'s factory methods, or the + # regular {DefaultFactory#parse_tag} factory method if none is supplied. + # + # @!macro [attach] yard.tag + # @!method $2_tag + # @!visibility private + # @yard.tag $2 [$3] $1 + # @param [#to_s] label the label used when displaying the tag in templates + # @param [#to_s] tag the tag name to create + # @param [#to_s, Class] meth the {Tag} factory method to call when + # creating the tag or the name of the class to directly create a tag for + def define_tag(label, tag, meth = nil) + tag_meth = tag_method_name(tag) + if meth.is_a?(Class) && Tag > meth + class_eval(<<-eof, __FILE__, __LINE__ + 1) + def #{tag_meth}(text) + #{meth}.new(#{tag.inspect}, text) + end + eof + else + class_eval(<<-eof, __FILE__, __LINE__ + 1) + begin; undef #{tag_meth}; rescue NameError; end + def #{tag_meth}(text) + send_to_factory(#{tag.inspect}, #{meth.inspect}, text) + end + eof + end + + @labels ||= SymbolHash.new(false) + @labels.update(tag => label) + @factory_methods ||= SymbolHash.new(false) + @factory_methods.update(tag => meth) + tag + end + + # @macro [attach] yard.directive + # @!method $1_directive + # @!visibility private + # @yard.directive $1 [$2] $-1 + # @overload define_directive(tag, tag_meth = nil, directive_class) + # Convenience method to define a new directive using a {Tag} factory + # method and {Directive} subclass that implements the directive + # callbacks. + # + # @param [#to_s] tag the tag name of the directive + # @param [#to_s] tag_meth the tag factory method to use when + # parsing tag information + # @param [Class] the directive class that implements the + # directive behaviour + # @see define_tag + def define_directive(tag, tag_meth = nil, directive_class = nil) + directive_meth = directive_method_name(tag) + if directive_class.nil? + directive_class = tag_meth + tag_meth = nil + end + class_eval <<-eof, __FILE__, __LINE__ + def #{directive_meth}(tag, parser) + directive_call(tag, parser) + end + eof + + @factory_methods ||= SymbolHash.new(false) + @factory_methods.update(tag => tag_meth) + @directive_factory_classes ||= SymbolHash.new(false) + @directive_factory_classes.update(tag => directive_class) + + tag + end + + def tag_method_name(tag_name) + tag_or_directive_method_name(tag_name) + end + + def directive_method_name(tag_name) + tag_or_directive_method_name(tag_name, 'directive') + end + + private + + def tag_or_directive_method_name(tag_name, type = 'tag') + "#{tag_name.to_s.tr('.', '_')}_#{type}" + end + end + + private + + def send_to_factory(tag_name, meth, text) + meth = meth.to_s + send_name = "parse_tag" + (meth.empty? ? "" : "_" + meth) + if @factory.respond_to?(send_name) + @factory.send(send_name, tag_name, text) + else + raise NoMethodError, "Factory #{@factory.class_name} does not implement factory method :#{meth}." + end + end + + # @return [Directive] + def directive_call(tag, parser) + meth = self.class.factory_method_for_directive(tag.tag_name) + if meth <= Directive + meth = meth.new(tag, parser) + meth.call + meth + else + meth.call(tag, parser) + end + end + + public + + # A factory class to handle parsing of tags, defaults to {default_factory} + attr_accessor :factory + + def initialize(factory = Library.default_factory) + self.factory = factory + end + + # @param [#to_s] tag_name the name of the tag to look for + # @return [Boolean] whether a tag by the given name is registered in + # the library. + def has_tag?(tag_name) + tag_name && respond_to?(self.class.tag_method_name(tag_name)) + end + + # Creates a new {Tag} object with a given tag name and data + # @return [Tag] the newly created tag object + def tag_create(tag_name, tag_buf) + send(self.class.tag_method_name(tag_name), tag_buf) + end + + # @param [#to_s] tag_name the name of the tag to look for + # @return [Boolean] whether a directive by the given name is registered in + # the library. + def has_directive?(tag_name) + tag_name && respond_to?(self.class.directive_method_name(tag_name)) + end + + # Creates a new directive with tag information and a docstring parser + # object. + # @param [String] tag_name the name of the tag + # @param [String] tag_buf the tag data + # @param [DocstringParser] parser the parser object parsing the docstring + # @return [Directive] the newly created directive + def directive_create(tag_name, tag_buf, parser) + meth = self.class.factory_method_for(tag_name) + tag = send_to_factory(tag_name, meth, tag_buf) + meth = self.class.directive_method_name(tag_name) + send(meth, tag, parser) + end + + # @!macro yard.tag.transitive + # @note This tag is *transitive*. If it is applied on a + # namespace (module or class), it will immediately be + # applied to all children objects of that namespace unless + # it is redefined on the child object. + + # Marks a class/module/method as abstract with optional + # implementor information. + # + # @example + # # @abstract Subclass and override {#run} to implement + # # a custom Threadable class. + # class Runnable + # def run; raise NotImplementedError end + # end + define_tag "Abstract", :abstract + + # Declares the API that the object belongs to. Does not display in + # output, but useful for performing queries (+yardoc --query+). Any text is + # allowable in this tag, and there are no predefined values. + # + # @!macro yard.tag.transitive + # @note The special name +@api private+ does display a notice in + # documentation if it is listed, letting users know that the + # method is not to be used by external components. + # @example + # class Post + # # @api private + # def reset_table!; table.flush end + # end + define_tag "API Visibility", :api + + # Declares a readwrite attribute on a Struct or class. + # + # @note This attribute is only applicable on class docstrings + # @deprecated Use the more powerful {tag:!attribute} directive instead. + # @example + # # @attr [String] name the name of the structure + # # @attr [Fixnum] size the size of the structure + # class MyStruct < Struct; end + define_tag "Attribute", :attr, :with_types_and_name + + # Declares a readonly attribute on a Struct or class. + # + # @note This attribute is only applicable on class docstrings + # @deprecated Use the more powerful {tag:!attribute} directive instead. + # @example + # # @attr_reader [String] name the name of the structure + # # @attr_reader [Fixnum] size the size of the structure + # class MyStruct < Struct; end + define_tag "Attribute Getter", :attr_reader, :with_types_and_name + + # Declares a writeonly attribute on a Struct or class. + # + # @note This attribute is only applicable on class docstrings + # @deprecated Use the more powerful {tag:!attribute} directive instead. + # @example + # # @attr_reader [String] name the name of the structure + # # @attr_reader [Fixnum] size the size of the structure + # class MyStruct < Struct; end + define_tag "Attribute Setter", :attr_writer, :with_types_and_name + + # List the author or authors of a class, module, or method. + # + # @example + # # @author Foo Bar + # class MyClass; end + define_tag "Author", :author + + # Marks a method/class as deprecated with an optional description. + # The description should be used to inform users of the recommended + # migration path, and/or any useful information about why the object + # was marked as deprecated. + # + # @example Deprecate a method with a replacement API + # # @deprecated Use {#bar} instead. + # def foo; end + # @example Deprecate a method with no replacement + # class Thread + # # @deprecated Exiting a thread in this way is not reliable and + # # can cause a program crash. + # def kill; end + # end + define_tag "Deprecated", :deprecated + + # Show an example snippet of code for an object. The first line + # is an optional title. + # + # @example + # # @example Reverse a String + # # "mystring".reverse #=> "gnirtsym" + # def reverse; end + # @yard.signature Optional title + # Code block + define_tag "Example", :example, :with_title_and_text + + # Adds an emphasized note at the top of the docstring for the object + # + # @example + # # @note This method should only be used in outer space. + # def eject; end + # @see tag:todo + define_tag "Note", :note + + # Describe an options hash in a method. The tag takes the + # name of the options parameter first, followed by optional types, + # the option key name, a default value for the key and a + # description of the option. The default value should be placed within + # parentheses and is optional (can be omitted). + # + # Note that a +@param+ tag need not be defined for the options + # hash itself, though it is useful to do so for completeness. + # + # @note For keyword parameters, use +@param+, not +@option+. + # + # @example + # # @param [Hash] opts the options to create a message with. + # # @option opts [String] :subject The subject + # # @option opts [String] :from ('nobody') From address + # # @option opts [String] :to Recipient email + # # @option opts [String] :body ('') The email's body + # def send_email(opts = {}) end + # @yard.signature name [Types] option_key (default_value) description + define_tag "Options Hash", :option, :with_options + + # Describe that your method can be used in various + # contexts with various parameters or return types. The first + # line should declare the new method signature, and the following + # indented tag data will be a new documentation string with its + # own tags adding metadata for such an overload. + # + # @example + # # @overload set(key, value) + # # Sets a value on key + # # @param key [Symbol] describe key param + # # @param value [Object] describe value param + # # @overload set(value) + # # Sets a value on the default key +:foo+ + # # @param value [Object] describe value param + # def set(*args) end + # @yard.signature method_signature(parameters) + # Indented docstring for overload method + define_tag "Overloads", :overload, OverloadTag + + # Documents a single method parameter (either regular or keyword) with a given name, type + # and optional description. + # + # @example + # # @param url [String] the URL of the page to download + # # @param directory [String] the name of the directory to save to + # def load_page(url, directory: 'pages') end + define_tag "Parameters", :param, :with_types_and_name + + # Declares that the _logical_ visibility of an object is private. + # In other words, it specifies that this method should be marked + # private but cannot due to Ruby's visibility restrictions. This + # exists for classes, modules and constants that do not obey Ruby's + # visibility rules. For instance, an inner class might be considered + # "private", though Ruby would make no such distinction. + # + # This tag is meant to be used in conjunction with the +--no-private+ + # command-line option, and is required to actually remove these objects + # from documentation output. See {file:README.md} for more information on + # switches. + # + # If you simply want to set the API visibility of a method, you should + # look at the {tag:api} tag instead. + # + # @note This method is not recommended for hiding undocumented or + # "unimportant" methods. This tag should only be used to mark objects + # private when Ruby visibility rules cannot do so. In Ruby 1.9.3, you + # can use +private_constant+ to declare constants (like classes or + # modules) as private, and should be used instead of +@private+. + # @macro yard.tag.transitive + # @example + # # @private + # class InteralImplementation; end + # @see tag:api + # @yard.signature + define_tag "Private", :private + + # Describes that a method may raise a given exception, with + # an optional description of what it may mean. + # + # @example + # # @raise [AccountBalanceError] if the account does not have + # # sufficient funds to perform the transaction + # def withdraw(amount) end + define_tag "Raises", :raise, :with_types + + # Describes the return value (and type or types) of a method. + # You can list multiple return tags for a method in the case + # where a method has distinct return cases. In this case, each + # case should begin with "if ...". + # + # @example A regular return value + # # @return [Fixnum] the size of the file + # def size; @file.size end + # @example A method returns an Array or a single object + # # @return [String] if a single object was returned + # # from the database. + # # @return [Array] if multiple objects were + # # returned. + # def find(query) end + define_tag "Returns", :return, :with_types + + # "See Also" references for an object. Accepts URLs or + # other code objects with an optional description at the end. + # Note that the URL or object will be automatically linked by + # YARD and does not need to be formatted with markup. + # + # @example + # # Synchronizes system time using NTP. + # # @see http://ntp.org/documentation.html NTP Documentation + # # @see NTPHelperMethods + # class NTPUpdater; end + define_tag "See Also", :see, :with_name + + # Lists the version that the object was first added. + # + # @!macro yard.tag.transitive + # @example + # # @since 1.2.4 + # def clear_routes; end + define_tag "Since", :since + + # Marks a TODO note in the object being documented. + # For reference, objects with TODO items can be enumerated + # from the command line with a simple command: + # + # !!!sh + # mocker$ yard list --query '@todo' + # lib/mocker/mocker.rb:15: Mocker + # lib/mocker/report/html.rb:5: Mocker::Report::Html + # + # YARD can also be used to enumerate the TODO items from + # a short script: + # + # !!!ruby + # require 'yard' + # YARD::Registry.load!.all.each do |o| + # puts o.tag(:todo).text if o.tag(:todo) + # end + # + # @example + # # @todo Add support for Jabberwocky service. + # # There is an open source Jabberwocky library available + # # at http://jbrwcky.org that can be easily integrated. + # class Wonderlander; end + # @see tag:note + define_tag "Todo Item", :todo + + # Lists the version of a class, module or method. This is + # similar to a library version, but at finer granularity. + # In some cases, version of specific modules, classes, methods + # or generalized components might change independently between + # releases. A version tag is used to infer the API compatibility + # of a specific object. + # + # @example + # # The public REST API for http://jbrwcky.org + # # @version 2.0 + # class JabberwockyAPI; end + define_tag "Version", :version + + # Describes what a method might yield to a given block. + # The types specifier list should not list types, but names + # of the parameters yielded to the block. If you define + # parameters with +@yieldparam+, you do not need to define + # the parameters in the type specification of +@yield+ as + # well. + # + # @example + # # For a block {|a,b,c| ... } + # # @yield [a, b, c] Gives 3 random numbers to the block + # def provide3values(&block) yield(42, 42, 42) end + # @see tag:yieldparam + # @see tag:yieldreturn + # @yard.signature [parameters] description + define_tag "Yields", :yield, :with_types + + # Defines a parameter yielded by a block. If you define the + # parameters with +@yieldparam+, you do not need to define + # them via +@yield+ as well. + # + # @example + # # @yieldparam [String] name the name that is yielded + # def with_name(name) yield(name) end + define_tag "Yield Parameters", :yieldparam, :with_types_and_name + + # Documents the value and type that the block is expected + # to return to the method. + # + # @example + # # @yieldreturn [Fixnum] the number to add 5 to. + # def add5_block(&block) 5 + yield end + # @see tag:return + define_tag "Yield Returns", :yieldreturn, :with_types + + # @yard.signature [r | w | rw] attribute_name + # Indented attribute docstring + define_directive :attribute, :with_types_and_title, AttributeDirective + + # @yard.signature + define_directive :endgroup, EndGroupDirective + + define_directive :group, GroupDirective + + # @yard.signature [attach | new] optional_name + # Optional macro expansion data + define_directive :macro, :with_types_and_title, MacroDirective + + # @yard.signature method_signature(parameters) + # Indented method docstring + define_directive :method, :with_title_and_text, MethodDirective + + # @yard.signature [language] code + define_directive :parse, :with_types, ParseDirective + + # Sets the scope of a DSL method. Only applicable to DSL method + # calls. Acceptable values are 'class' or 'instance' + # @yard.signature class | instance + define_directive :scope, ScopeDirective + + # Sets the visibility of a DSL method. Only applicable to + # DSL method calls. Acceptable values are public, protected, or private. + # @yard.signature public | protected | private + define_directive :visibility, VisibilityDirective + + self.visible_tags = [:abstract, :deprecated, :note, :todo, :example, :overload, + :param, :option, :yield, :yieldparam, :yieldreturn, :return, :raise, + :see, :author, :since, :version] + + self.transitive_tags = [:since, :api] + end + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/tags/option_tag.rb b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/tags/option_tag.rb new file mode 100644 index 000000000..a63c8a96d --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/tags/option_tag.rb @@ -0,0 +1,13 @@ +# frozen_string_literal: true +module YARD + module Tags + class OptionTag < Tag + attr_accessor :pair + + def initialize(tag_name, name, pair) + super(tag_name, nil, nil, name) + @pair = pair + end + end + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/tags/overload_tag.rb b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/tags/overload_tag.rb new file mode 100644 index 000000000..2d7ec6ae1 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/tags/overload_tag.rb @@ -0,0 +1,71 @@ +# frozen_string_literal: true +module YARD + module Tags + class OverloadTag < Tag + attr_reader :signature, :parameters, :docstring + + def initialize(tag_name, text) + super(tag_name, nil) + parse_tag(text) + parse_signature + end + + def tag(name) docstring.tag(name) end + def tags(name = nil) docstring.tags(name) end + def has_tag?(name) docstring.has_tag?(name) end + + def object=(value) + super(value) + docstring.object = value + docstring.tags.each {|tag| tag.object = value } + end + + def name(prefix = false) + return @name unless prefix + object.scope == :class ? @name.to_s : "#{object.send(:sep)}#{@name}" + end + + def method_missing(*args, &block) + object.send(*args, &block) + end + + def type + object.type + end + + def is_a?(other) + object.is_a?(other) || self.class >= other.class || false + end + alias kind_of? is_a? + + private + + def parse_tag(text) + @signature, text = *text.split(/\r?\n/, 2) + @signature.strip! + text ||= String.new("") + numspaces = text[/\A(\s*)/, 1].length + text.gsub!(/^[ \t]{#{numspaces}}/, '') + text.strip! + @docstring = Docstring.new(text, nil) + end + + def parse_signature + if signature =~ /^(?:def\s)?\s*(#{CodeObjects::METHODMATCH})(?:(?:\s+|\s*\()(.*)(?:\)\s*$)?)?/m + meth = $1 + args = $2 + meth.gsub!(/\s+/, '') + # FIXME: refactor this code to not make use of the Handlers::Base class (tokval_list should be moved) + toks = YARD::Parser::Ruby::Legacy::TokenList.new(args) + args = YARD::Handlers::Ruby::Legacy::Base.new(nil, nil).send(:tokval_list, toks, :all) + args = args.map do |a| + k, v = *a.split(/:|=/, 2) + [k.strip.to_s + (a[k.size, 1] == ':' ? ':' : ''), (v ? v.strip : nil)] + end if args + @name = meth.to_sym + @parameters = args + end + end + end + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/tags/ref_tag.rb b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/tags/ref_tag.rb new file mode 100644 index 000000000..0d1ebd744 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/tags/ref_tag.rb @@ -0,0 +1,8 @@ +# frozen_string_literal: true +module YARD + module Tags + module RefTag + attr_accessor :owner + end + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/tags/ref_tag_list.rb b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/tags/ref_tag_list.rb new file mode 100644 index 000000000..933e9e6e3 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/tags/ref_tag_list.rb @@ -0,0 +1,28 @@ +# frozen_string_literal: true +module YARD + module Tags + class RefTagList + attr_accessor :owner, :tag_name, :name + + def initialize(tag_name, owner, name = nil) + @owner = CodeObjects::Proxy === owner ? owner : P(owner) + @tag_name = tag_name.to_s + @name = name + end + + def tags + if owner.is_a?(CodeObjects::Base) + o = owner.tags(tag_name) + o = o.select {|t| t.name.to_s == name.to_s } if name + o.each do |t| + t.extend(RefTag) + t.owner = owner + end + o + else + [] + end + end + end + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/tags/tag.rb b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/tags/tag.rb new file mode 100644 index 000000000..516b2910b --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/tags/tag.rb @@ -0,0 +1,71 @@ +# frozen_string_literal: true +module YARD + module Tags + # Represents a metadata tag value (+@tag+). Tags can have any combination of + # {#types}, {#name} and {#text}, or none of the above. + # + # @example Programmatic tag creation + # # The following docstring syntax: + # # @param [String, nil] arg an argument + # # + # # is equivalent to: + # Tag.new(:param, 'an argument', ['String', 'nil'], 'arg') + class Tag + # @return [String] the name of the tag + attr_accessor :tag_name + + # @return [String] the tag text associated with the tag + # @return [nil] if no tag text is supplied + attr_accessor :text + + # @return [Array] a list of types associated with the tag + # @return [nil] if no types are associated with the tag + attr_accessor :types + + # @return [String] a name associated with the tag + attr_accessor :name + + # @return [CodeObjects::Base] the associated object + attr_accessor :object + + # Creates a new tag object with a tag name and text. Optionally, formally declared types + # and a key name can be specified. + # + # Types are mainly for meta tags that rely on type information, such as +param+, +return+, etc. + # + # Key names are for tags that declare meta data for a specific key or name, such as +param+, + # +raise+, etc. + # + # @param [#to_s] tag_name the tag name to create the tag for + # @param [String] text the descriptive text for this tag + # @param [Array] types optional type list of formally declared types + # for the tag + # @param [String] name optional key name which the tag refers to + def initialize(tag_name, text, types = nil, name = nil) + @tag_name = tag_name.to_s + @text = text + @name = name + @types = (types ? [types].flatten.compact : nil) + end + + # Convenience method to access the first type specified. This should mainly + # be used for tags that only specify one type. + # + # @return [String] the first of the list of specified types + # @see #types + def type + types.first + end + + # Provides a plain English summary of the type specification, or nil + # if no types are provided or parseable. + # + # @return [String] a plain English description of the associated types + # @return [nil] if no types are provided or not parseable + def explain_types + return nil if !types || types.empty? + TypesExplainer.explain(*types) + end + end + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/tags/tag_format_error.rb b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/tags/tag_format_error.rb new file mode 100644 index 000000000..51f276f81 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/tags/tag_format_error.rb @@ -0,0 +1,7 @@ +# frozen_string_literal: true +module YARD + module Tags + class TagFormatError < RuntimeError + end + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/tags/types_explainer.rb b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/tags/types_explainer.rb new file mode 100644 index 000000000..a72d1a703 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/tags/types_explainer.rb @@ -0,0 +1,162 @@ +# frozen_string_literal: true +require 'strscan' + +module YARD + module Tags + class TypesExplainer + # (see Tag#explain_types) + # @param types [Array] a list of types to parse and summarize + def self.explain(*types) + explain!(*types) + rescue SyntaxError + nil + end + + # (see explain) + # @raise [SyntaxError] if the types are not parseable + def self.explain!(*types) + Parser.parse(types.join(", ")).join("; ") + end + + class << self + private :new + end + + # @private + class Type + attr_accessor :name + + def initialize(name) + @name = name + end + + def to_s(singular = true) + if name[0, 1] == "#" + singular ? "an object that responds to #{name}" : "objects that respond to #{name}" + elsif name[0, 1] =~ /[A-Z]/ + singular ? "a#{name[0, 1] =~ /[aeiou]/i ? 'n' : ''} " + name : "#{name}#{name[-1, 1] =~ /[A-Z]/ ? "'" : ''}s" + else + name + end + end + + private + + def list_join(list) + index = 0 + list.inject(String.new) do |acc, el| + acc << el.to_s + acc << ", " if index < list.size - 2 + acc << " or " if index == list.size - 2 + index += 1 + acc + end + end + end + + # @private + class CollectionType < Type + attr_accessor :types + + def initialize(name, types) + @name = name + @types = types + end + + def to_s(_singular = true) + "a#{name[0, 1] =~ /[aeiou]/i ? 'n' : ''} #{name} of (" + list_join(types.map {|t| t.to_s(false) }) + ")" + end + end + + # @private + class FixedCollectionType < CollectionType + def to_s(_singular = true) + "a#{name[0, 1] =~ /[aeiou]/i ? 'n' : ''} #{name} containing (" + types.map(&:to_s).join(" followed by ") + ")" + end + end + + # @private + class HashCollectionType < Type + attr_accessor :key_types, :value_types + + def initialize(name, key_types, value_types) + @name = name + @key_types = key_types + @value_types = value_types + end + + def to_s(_singular = true) + "a#{name[0, 1] =~ /[aeiou]/i ? 'n' : ''} #{name} with keys made of (" + + list_join(key_types.map {|t| t.to_s(false) }) + + ") and values of (" + list_join(value_types.map {|t| t.to_s(false) }) + ")" + end + end + + # @private + class Parser + include CodeObjects + + TOKENS = { + :collection_start => / />/, + :fixed_collection_start => /\(/, + :fixed_collection_end => /\)/, + :type_name => /#{ISEP}#{METHODNAMEMATCH}|#{NAMESPACEMATCH}|\w+/, + :type_next => /[,;]/, + :whitespace => /\s+/, + :hash_collection_start => /\{/, + :hash_collection_next => /=>/, + :hash_collection_end => /\}/, + :parse_end => nil + } + + def self.parse(string) + new(string).parse + end + + def initialize(string) + @scanner = StringScanner.new(string) + end + + def parse + types = [] + type = nil + name = nil + loop do + found = false + TOKENS.each do |token_type, match| + # TODO: cleanup this code. + # rubocop:disable Lint/AssignmentInCondition + next unless (match.nil? && @scanner.eos?) || (match && token = @scanner.scan(match)) + found = true + case token_type + when :type_name + raise SyntaxError, "expecting END, got name '#{token}'" if name + name = token + when :type_next + raise SyntaxError, "expecting name, got '#{token}' at #{@scanner.pos}" if name.nil? + type = Type.new(name) unless type + types << type + type = nil + name = nil + when :fixed_collection_start, :collection_start + name ||= "Array" + klass = token_type == :collection_start ? CollectionType : FixedCollectionType + type = klass.new(name, parse) + when :hash_collection_start + name ||= "Hash" + type = HashCollectionType.new(name, parse, parse) + when :hash_collection_next, :hash_collection_end, :fixed_collection_end, :collection_end, :parse_end + raise SyntaxError, "expecting name, got '#{token}'" if name.nil? + type = Type.new(name) unless type + types << type + return types + end + end + raise SyntaxError, "invalid character at #{@scanner.peek(1)}" unless found + end + end + end + end + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/templates/engine.rb b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/templates/engine.rb new file mode 100644 index 000000000..1f5570700 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/templates/engine.rb @@ -0,0 +1,186 @@ +# frozen_string_literal: true +require 'ostruct' + +module YARD + module Templates + # This module manages all creation, handling and rendering of {Template} + # objects. + # + # * To create a template object at a path, use {template}. + # * To render a template, call {render}. + # * To register a template path in the lookup paths, call {register_template_path}. + module Engine + class << self + # @return [Array] the list of registered template paths + attr_accessor :template_paths + + # Registers a new template path in {template_paths} + # + # @param [String] path a new template path + # @return [void] + def register_template_path(path) + template_paths.push(path) unless template_paths.include?(path) + end + + # Creates a template module representing the path. Searches on disk + # for the first directory named +path+ (joined by '/') within the + # template paths and builds a template module for. All other matching + # directories in other template paths will be included in the + # generated module as mixins (for overriding). + # + # @param [Array] path a list of path components + # @raise [ArgumentError] if the path does not exist within one of the + # {template_paths} on disk. + # @return [Template] the module representing the template + def template(*path) + from_template = nil + from_template = path.shift if path.first.is_a?(Template) + path = path.join('/') + full_paths = find_template_paths(from_template, path) + + path = File.cleanpath(path).gsub('../', '') + raise ArgumentError, "No such template for #{path}" if full_paths.empty? + mod = template!(path, full_paths) + + mod + end + + # Forces creation of a template at +path+ within a +full_path+. + # + # @param [String] path the path name of the template + # @param [Array] full_paths the full path on disk of the template + # @return [Template] the template module representing the +path+ + def template!(path, full_paths = nil) + full_paths ||= [path] + full_paths = [full_paths] unless full_paths.is_a?(Array) + name = template_module_name(full_paths.first) + begin; return const_get(name); rescue NameError; nil end + + mod = const_set(name, Module.new) + mod.send(:include, Template) + mod.send(:initialize, path, full_paths) + mod + end + + # Renders a template on a {CodeObjects::Base code object} using + # a set of default (overridable) options. Either the +:object+ + # or +:type+ keys must be provided. + # + # If a +:serializer+ key is provided and +:serialize+ is not set to + # false, the rendered contents will be serialized through the {Serializers::Base} + # object. See {with_serializer}. + # + # @example Renders an object with html formatting + # Engine.render(:format => :html, :object => obj) + # @example Renders without an object + # Engine.render(:type => :fulldoc, :otheropts => somevalue) + # @param [Hash] options the options hash + # @option options [Symbol] :format (:text) the default format + # @option options [Symbol] :type (nil) the :object's type. + # @option options [Symbol] :template (:default) the default template + # @return [String] the rendered template + def render(options = {}) + options = set_default_options(options) + mod = template(options.template, options.type, options.format) + + if options.serializer && options.serialize != false + with_serializer(options.object, options.serializer) { mod.run(options) } + else + mod.run(options) + end + end + + # Passes a set of objects to the +:fulldoc+ template for full documentation generation. + # This is called by {CLI::Yardoc} to most commonly perform HTML + # documentation generation. + # + # @param [Array] objects a list of {CodeObjects::Base} + # objects to pass to the template + # @param [Hash] options (see {render}) + # @return [void] + def generate(objects, options = {}) + options = set_default_options(options) + options.objects = objects + options.object = Registry.root + template(options.template, :fulldoc, options.format).run(options) + end + + # Serializes the results of a block with a +serializer+ object. + # + # @param [CodeObjects::Base] object the code object to serialize + # @param [Serializers::Base] serializer the serializer object + # @yield a block whose result will be serialize + # @yieldreturn [String] the contents to serialize + # @see Serializers::Base + def with_serializer(object, serializer) + output = nil + filename = serializer.serialized_path(object) + if serializer.respond_to?(:basepath) + filename = File.join(serializer.basepath, filename) + end + log.capture("Generating #{filename}", nil) do + serializer.before_serialize if serializer + output = yield + if serializer + serializer.serialize(object, output) + serializer.after_serialize(output) + end + end + output + end + + private + + # Sets default options on the options hash + # + # @param [Hash] options the options hash + # @option options [Symbol] :format (:text) the default format + # @option options [Symbol] :type (nil) the :object's type, if provided + # @option options [Symbol] :template (:default) the default template + # @return [void] + def set_default_options(options = {}) + if options.is_a?(Hash) + options = TemplateOptions.new.tap do |o| + o.reset_defaults + o.update(options) + end + end + options.type ||= options.object.type if options.object + options + end + + # Searches through the registered {template_paths} and returns + # all full directories that have the +path+ within them on disk. + # + # @param [Template] from_template if provided, allows a relative + # path to be specified from this template's full path. + # @param [String] path the path component to search for in the + # {template_paths} + # @return [Array] a list of full paths that are existing + # candidates for a template module + def find_template_paths(from_template, path) + paths = template_paths.dup + paths = from_template.full_paths + paths if from_template + + paths.inject([]) do |acc, tp| + full_path = File.cleanpath(File.join(tp, path)) + acc.unshift(full_path) if File.directory?(full_path) + acc + end.uniq + end + + # The name of the module that represents a +path+ + # + # @param [String] path the path to generate a module name for + # @return [String] the module name + def template_module_name(path) + 'Template_' + path.to_s.gsub(/[^a-z0-9]/i, '_') + end + end + + self.template_paths = [] + end + + Engine.register_template_path(File.join(YARD::ROOT, '..', 'templates')) + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/templates/erb_cache.rb b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/templates/erb_cache.rb new file mode 100644 index 000000000..8e7a99892 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/templates/erb_cache.rb @@ -0,0 +1,23 @@ +# frozen_string_literal: true +module YARD + module Templates + # @since 0.5.4 + module ErbCache + def self.method_for(filename) + @methods ||= {} + return @methods[filename] if @methods[filename] + @methods[filename] = name = "_erb_cache_#{@methods.size}" + erb = yield.src + encoding = erb[/\A(#coding[:=].*\r?\n)/, 1] || '' + module_eval "#{encoding}def #{name}; #{erb}; end", filename + + name + end + + def self.clear! + return unless defined?(@methods) && @methods + @methods.clear + end + end + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/templates/helpers/base_helper.rb b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/templates/helpers/base_helper.rb new file mode 100644 index 000000000..537497cba --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/templates/helpers/base_helper.rb @@ -0,0 +1,215 @@ +# frozen_string_literal: true +module YARD::Templates::Helpers + # The base helper module included in all templates. + module BaseHelper + attr_accessor :object, :serializer + + # @return [CodeObjects::Base] the object representing the current generated + # page. Might not be the current {#object} when inside sub-templates. + attr_reader :owner + undef owner + def owner; (defined?(@owner) && @owner) || object.namespace end + + # @group Managing Global Template State + + # An object that keeps track of global state throughout the entire template + # rendering process (including any sub-templates). + # + # @return [OpenStruct] a struct object that stores state + # @since 0.6.0 + def globals; options.globals end + + # @group Running the Verifier + + # Runs a list of objects against the {Verifier} object passed into the + # template and returns the subset of verified objects. + # + # @param [Array] list a list of code objects + # @return [Array] a list of code objects that match + # the verifier. If no verifier is supplied, all objects are returned. + def run_verifier(list) + options.verifier ? options.verifier.run(list) : list + end + + # @group Escaping Text + + # Escapes text. This is used a lot by the HtmlHelper and there should + # be some helper to "clean up" text for whatever, this is it. + def h(text) + text + end + + # @group Linking Objects and URLs + + # Links objects or URLs. This method will delegate to the correct +link_+ + # method depending on the arguments passed in. + # + # @example Linking a URL + # linkify('http://example.com') + # @example Including docstring contents of an object + # linkify('include:YARD::Docstring') + # @example Linking to an extra file + # linkify('file:README') + # @example Linking an object by path + # linkify('YARD::Docstring') + def linkify(*args) + if args.first.is_a?(String) + case args.first + when %r{://}, /^mailto:/ + link_url(args[0], args[1], {:target => '_parent'}.merge(args[2] || {})) + when /^include:file:(\S+)/ + file = $1 + relpath = File.relative_path(Dir.pwd, File.expand_path(file)) + if relpath =~ /^\.\./ + log.warn "Cannot include file from path `#{file}'" + "" + elsif File.file?(file) + link_include_file(file) + else + log.warn "Cannot find file at `#{file}' for inclusion" + "" + end + when /^include:(\S+)/ + path = $1 + obj = YARD::Registry.resolve(object.namespace, path) + if obj + link_include_object(obj) + else + log.warn "Cannot find object at `#{path}' for inclusion" + "" + end + when /^render:(\S+)/ + path = $1 + obj = YARD::Registry.resolve(object, path) + if obj + opts = options.dup + opts.delete(:serializer) + obj.format(opts) + else + '' + end + when /^file:(\S+?)(?:#(\S+))?$/ + link_file($1, args[1] ? args[1] : nil, $2) + else + link_object(*args) + end + else + link_object(*args) + end + end + + # Includes an object's docstring into output. + # @since 0.6.0 + # @param [CodeObjects::Base] obj the object to include + # @return [String] the object's docstring (no tags) + def link_include_object(obj) + obj.docstring + end + + # Include a file as a docstring in output + # @since 0.7.0 + # @param [String] file the filename to include + # @return [String] the file's contents + def link_include_file(file) + File.read(file) + end + + # Links to an object with an optional title + # + # @param [CodeObjects::Base] obj the object to link to + # @param [String] title the title to use for the link + # @return [String] the linked object + def link_object(obj, title = nil) + return title if title + + case obj + when YARD::CodeObjects::Base, YARD::CodeObjects::Proxy + obj.title + when String, Symbol + P(obj).title + else + obj + end + end + + # Links to a URL + # + # @param [String] url the URL to link to + # @param [String] title the optional title to display the link as + # @param [Hash] params optional parameters for the link + # @return [String] the linked URL + def link_url(url, title = nil, params = nil) # rubocop:disable Lint/UnusedMethodArgument + url + end + + # Links to an extra file + # + # @param [String] filename the filename to link to + # @param [String] title the title of the link + # @param [String] anchor optional anchor + # @return [String] the link to the file + # @since 0.5.5 + def link_file(filename, title = nil, anchor = nil) # rubocop:disable Lint/UnusedMethodArgument + return filename.filename if CodeObjects::ExtraFileObject === filename + filename + end + + # @group Formatting Object Attributes + + # Formats a list of return types for output and links each type. + # + # @example Formatting types + # format_types(['String', 'Array']) #=> "(String, Array)" + # @example Formatting types without surrounding brackets + # format_types(['String', 'Array'], false) #=> "String, Array" + # @param [Array] list a list of types + # @param [Boolean] brackets whether to surround the types in brackets + # @return [String] the formatted list of Ruby types + def format_types(list, brackets = true) + list.nil? || list.empty? ? "" : (brackets ? "(#{list.join(", ")})" : list.join(", ")) + end + + # @example Formatted type of an exception class + # o = ClassObject.new(:root, :MyError) + # o.superclass = P('RuntimeError') + # format_object_type(o) # => "Exception" + # @example Formatted type of a method + # o = MethodObject.new(:root, :to_s) + # format_object_type(o) # => "Method" + # @param [CodeObjects::Base] object the object to retrieve the type for + # @return [String] the human-readable formatted {CodeObjects::Base#type #type} + # for the object + def format_object_type(object) + case object + when YARD::CodeObjects::ClassObject + object.is_exception? ? "Exception" : "Class" + else + object.type.to_s.capitalize + end + end + + # @example + # s = format_object_title ModuleObject.new(:root, :MyModuleName) + # s # => "Module: MyModuleName" + # @param [CodeObjects::Base] object the object to retrieve a title for + # @return [String] the page title name for a given object + def format_object_title(object) + case object + when YARD::CodeObjects::RootObject + "Top Level Namespace" + else + format_object_type(object) + ": " + object.title + end + end + + # Indents and formats source code + # + # @param [String] value the input source code + # @return [String] formatted source code + def format_source(value) + sp = value.split("\n").last[/^(\s+)/, 1] + num = sp ? sp.size : 0 + value.gsub(/^\s{#{num}}/, '') + end + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/templates/helpers/filter_helper.rb b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/templates/helpers/filter_helper.rb new file mode 100644 index 000000000..707fb0cee --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/templates/helpers/filter_helper.rb @@ -0,0 +1,27 @@ +# frozen_string_literal: true +module YARD + module Templates::Helpers + # Helpers for various object types + module FilterHelper + # @return [Boolean] whether an object is a method + def is_method?(object) + object.type == :method + end + + # @return [Boolean] whether an object is a namespace + def is_namespace?(object) + object.is_a?(CodeObjects::NamespaceObject) + end + + # @return [Boolean] whether an object is a class + def is_class?(object) + object.is_a?(CodeObjects::ClassObject) + end + + # @return [Boolean] whether an object is a module + def is_module?(object) + object.is_a?(CodeObjects::ModuleObject) + end + end + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/templates/helpers/html_helper.rb b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/templates/helpers/html_helper.rb new file mode 100644 index 000000000..4d3d56862 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/templates/helpers/html_helper.rb @@ -0,0 +1,673 @@ +# frozen_string_literal: true +require 'cgi' + +module YARD + module Templates::Helpers + # The helper module for HTML templates. + module HtmlHelper + include MarkupHelper + include HtmlSyntaxHighlightHelper + + # @private + URLMATCH = /[^\w\s~!\*'\(\):;@&=\$,\[\]<>-]/ + + # @private + ASCIIDOC_ATTRIBUTES = {"env" => "yard", "env-yard" => ""}.freeze + + # @group Escaping Template Data + + # Escapes HTML entities + # + # @param [String] text the text to escape + # @return [String] the HTML with escaped entities + def h(text) + CGI.escapeHTML(text.to_s) + end + + # Escapes a URL + # + # @param [String] text the URL + # @return [String] the escaped URL + def urlencode(text) + text = text.dup + enc = nil + if text.respond_to?(:force_encoding) + enc = text.encoding + text = text.force_encoding('binary') + end + + text = text.gsub(/%[a-z0-9]{2}|#{URLMATCH}/i) do + $&.size > 1 ? $& : "%" + $&.ord.to_s(16).upcase + end.tr(' ', '+') + + text = text.force_encoding(enc) if enc + text + end + + module_function :urlencode + + # @group Converting Markup to HTML + + # Turns text into HTML using +markup+ style formatting. + # + # @param [String] text the text to format + # @param [Symbol] markup examples are +:markdown+, +:textile+, +:rdoc+. + # To add a custom markup type, see {MarkupHelper} + # @return [String] the HTML + def htmlify(text, markup = options.markup) + markup_meth = "html_markup_#{markup}" + return text unless respond_to?(markup_meth) + return "" unless text + return text unless markup + html = send(markup_meth, text).dup + if html.respond_to?(:encode) + html = html.force_encoding(text.encoding) # for libs that mess with encoding + html = html.encode(:invalid => :replace, :replace => '?') + end + html = resolve_links(html) + unless [:text, :none, :pre, :ruby].include?(markup) + html = parse_codeblocks(html) + end + html + end + + # Converts Markdown to HTML + # @param [String] text input Markdown text + # @return [String] output HTML + # @since 0.6.0 + def html_markup_markdown(text) + # TODO: other libraries might be more complex + provider = markup_class(:markdown) + case provider.to_s + when 'RDiscount' + provider.new(text, :autolink).to_html + when 'RedcarpetCompat' + provider.new(text, :autolink, + :fenced_code, + :gh_blockcode, + :lax_spacing, + :tables, + :with_toc_data, + :no_intraemphasis).to_html + when 'CommonMarker' + CommonMarker.render_html(text, %i[DEFAULT GITHUB_PRE_LANG], %i[autolink]) + else + provider.new(text).to_html + end + end + + # Converts org-mode to HTML + # @param [String] text input org-mode text + # @return [String] output HTML + def html_markup_org(text) + markup_class(:org).new(text).to_html + end + + # Converts Asciidoc to HTML + # @param [String] text input Asciidoc text + # @return [String] output HTML + def html_markup_asciidoc(text) + options = {:attributes => ASCIIDOC_ATTRIBUTES} + markup_class(:asciidoc).convert(text, options) + end + + # Converts Textile to HTML + # @param [String] text the input Textile text + # @return [String] output HTML + # @since 0.6.0 + def html_markup_textile(text) + doc = markup_class(:textile).new(text) + doc.hard_breaks = false if doc.respond_to?(:hard_breaks=) + doc.to_html + end + + # Converts plaintext to strict Textile (hard breaks) + # @param [String] text the input textile data + # @return [String] the output HTML + # @since 0.6.0 + def html_markup_textile_strict(text) + markup_class(:textile).new(text).to_html + end + + # Converts RDoc formatting (SimpleMarkup) to HTML + # @param [String] text the input RDoc formatted text + # @return [String] output HTML + # @since 0.6.0 + def html_markup_rdoc(text) + doc = markup_class(:rdoc).new(text) + doc.from_path = url_for(object) if doc.respond_to?(:from_path=) + doc.to_html + end + + # Converts plaintext to pre-formatted HTML + # @param [String] text the input text + # @return [String] the output HTML + # @since 0.6.0 + def html_markup_pre(text) + "
    " + h(text) + "
    " + end + + # Converts plaintext to regular HTML + # @param [String] text the input text + # @return [String] the output HTML + # @since 0.6.0 + def html_markup_text(text) + h(text).gsub(/\r?\n/, '
    ') + end + + # @return [String] the same text with no markup + # @since 0.6.6 + def html_markup_none(text) + h(text) + end + + # Converts HTML to HTML + # @param [String] text input html + # @return [String] output HTML + # @since 0.6.0 + def html_markup_html(text) + text + end + + # Highlights Ruby source. Similar to {#html_syntax_highlight}, but + # this method is meant to be called from {#htmlify} when markup is + # set to "ruby". + # + # @param [String] source the Ruby source + # @return [String] the highlighted HTML + # @since 0.7.0 + def html_markup_ruby(source) + '
    ' + html_syntax_highlight(source, :ruby) + '
    ' + end + + # @return [String] HTMLified text as a single line (paragraphs removed) + def htmlify_line(*args) + "
    " + htmlify(*args) + "
    " + end + + # @group Syntax Highlighting Source Code + + # Syntax highlights +source+ in language +type+. + # + # @note To support a specific language +type+, implement the method + # +html_syntax_highlight_TYPE+ in this class. + # + # @param [String] source the source code to highlight + # @param [Symbol, String] type the language type (:ruby, :plain, etc). Use + # :plain for no syntax highlighting. + # @return [String] the highlighted source + def html_syntax_highlight(source, type = nil) + return "" unless source + return h(source) unless options.highlight + + new_type, source = parse_lang_for_codeblock(source) + type ||= new_type || :ruby + meth = "html_syntax_highlight_#{type}" + respond_to?(meth) ? send(meth, source) : h(source) + end + + # @return [String] unhighlighted source + def html_syntax_highlight_plain(source) + h(source) + end + + # @group Linking Objects and URLs + + # Resolves any text in the form of +{Name}+ to the object specified by + # Name. Also supports link titles in the form +{Name title}+. + # + # @example Linking to an instance method + # resolve_links("{MyClass#method}") # => "MyClass#method" + # @example Linking to a class with a title + # resolve_links("{A::B::C the C class}") # => "the c class" + # @param [String] text the text to resolve links in + # @return [String] HTML with linkified references + def resolve_links(text) + code_tags = 0 + text.gsub(%r{<(/)?(pre|code|tt)|(\\|!)?\{(?!\})(\S+?)(?:\s([^\}]*?\S))?\}(?=[\W<]|.+.*\s*(.*)\Z} + name = $1 + title = $2 + title = nil if title.empty? + end + + name = CGI.unescapeHTML(name) + + if object.is_a?(String) + object + else + link = linkify(name, title) + if (link == name || link == title) && (name + ' ' + link !~ /\A/) + match = /(.+)?(\{#{Regexp.quote name}(?:\s.*?)?\})(.+)?/.match(text) + file = (defined?(@file) && @file ? @file.filename : object.file) || '(unknown)' + line = (defined?(@file) && @file ? 1 : (object.docstring.line_range ? object.docstring.line_range.first : 1)) + (match ? $`.count("\n") : 0) + log.warn "In file `#{file}':#{line}: Cannot resolve link to #{name} from text" + (match ? ":" : ".") + + "\n\t" + (match[1] ? '...' : '') + match[2].delete("\n") + (match[3] ? '...' : '') if match + end + + link + end + end + end + + # (see BaseHelper#link_file) + def link_file(filename, title = nil, anchor = nil) + if CodeObjects::ExtraFileObject === filename + file = filename + else + contents = File.file?(filename) ? nil : '' + file = CodeObjects::ExtraFileObject.new(filename, contents) + end + return title || file.title unless serializer + link_url(url_for_file(file, anchor), title || file.title) + end + + # (see BaseHelper#link_include_file) + def link_include_file(file) + unless file.is_a?(CodeObjects::ExtraFileObject) + file = CodeObjects::ExtraFileObject.new(file) + end + file.attributes[:markup] ||= markup_for_file('', file.filename) + insert_include(file.contents, file.attributes[:markup] || options.markup) + end + + # (see BaseHelper#link_include_object) + def link_include_object(obj) + insert_include(obj.docstring) + end + + # Inserts an include link while respecting inlining + def insert_include(text, markup = options.markup) + htmlify(text, markup).gsub(%r{\A\s*

    |

    \s*\Z}, '') + end + + # (see BaseHelper#link_object) + def link_object(obj, title = nil, anchor = nil, relative = true) + return title if obj.nil? + obj = Registry.resolve(object, obj, true, true) if obj.is_a?(String) + if title + title = title.to_s + elsif object.is_a?(CodeObjects::Base) + # Check if we're linking to a class method in the current + # object. If we are, create a title in the format of + # "CurrentClass.method_name" + if obj.is_a?(CodeObjects::MethodObject) && obj.scope == :class && obj.parent == object + title = h([object.name, obj.sep, obj.name].join) + elsif obj.title != obj.path + title = h(obj.title) + else + title = h(object.relative_path(obj)) + end + else + title = h(obj.title) + end + return title unless serializer + return title if obj.is_a?(CodeObjects::Proxy) + + link = url_for(obj, anchor, relative) + link = link ? link_url(link, title, :title => h("#{obj.title} (#{obj.type})")) : title + "" + link + "" + rescue Parser::UndocumentableError + log.warn "The namespace of link #{obj.inspect} is a constant or invalid." + title || obj.to_s + end + + # (see BaseHelper#link_url) + def link_url(url, title = nil, params = {}) + title ||= url + title = title.gsub(/[\r\n]/, ' ') + params = SymbolHash.new(false).update( + :href => url, + :title => h(title) + ).update(params) + params[:target] ||= '_parent' if url =~ %r{^(\w+)://} + "#{title}".gsub(/[\r\n]/, ' ') + end + + # @group URL Helpers + + # @param [CodeObjects::Base] object the object to get an anchor for + # @return [String] the anchor for a specific object + def anchor_for(object) + case object + when CodeObjects::MethodObject + "#{object.name}-#{object.scope}_#{object.type}" + when CodeObjects::ClassVariableObject + "#{object.name.to_s.gsub('@@', '')}-#{object.type}" + when CodeObjects::Base + "#{object.name}-#{object.type}" + when CodeObjects::Proxy + object.path + else + object.to_s + end + end + + # Returns the URL for an object. + # + # @param [String, CodeObjects::Base] obj the object (or object path) to link to + # @param [String] anchor the anchor to link to + # @param [Boolean] relative use a relative or absolute link + # @return [String] the URL location of the object + def url_for(obj, anchor = nil, relative = true) + link = nil + return link unless serializer + return link if obj.is_a?(CodeObjects::Base) && run_verifier([obj]).empty? + + if obj.is_a?(CodeObjects::Base) && !obj.is_a?(CodeObjects::NamespaceObject) + # If the obj is not a namespace obj make it the anchor. + anchor = obj + obj = obj.namespace + end + + objpath = serializer.serialized_path(obj) + return link unless objpath + + relative = false if object == Registry.root + if relative + fromobj = object + if object.is_a?(CodeObjects::Base) && + !object.is_a?(CodeObjects::NamespaceObject) + fromobj = owner + end + + from = serializer.serialized_path(fromobj) + link = File.relative_path(from, objpath) + else + link = objpath + end + + link + (anchor ? '#' + urlencode(anchor_for(anchor)) : '') + end + + alias mtime_url url_for + def mtime(_file) nil end + + # Returns the URL for a specific file + # + # @param [String, CodeObjects::ExtraFileObject] filename the filename to link to + # @param [String] anchor optional anchor + # @return [String] the URL pointing to the file + def url_for_file(filename, anchor = nil) + return '' unless serializer + fromobj = object + if CodeObjects::Base === fromobj && !fromobj.is_a?(CodeObjects::NamespaceObject) + fromobj = fromobj.namespace + end + from = serializer.serialized_path(fromobj) + path = filename == options.readme ? + 'index.html' : serializer.serialized_path(filename) + link = File.relative_path(from, path) + link += (anchor ? '#' + urlencode(anchor) : '') + link + end + + # Returns the URL for a list type + # + # @param [String, Symbol] type the list type to generate a URL for + # @return [String] the URL pointing to the list + # @since 0.8.0 + def url_for_list(type) + url_for_file("#{type}_list.html") + end + + # Returns the URL for the frameset page + # + # @return [String] the URL pointing to the frames page + # @since 0.8.0 + def url_for_frameset + url_for_file("frames.html") + end + + # Returns the URL for the main page (README or alphabetic index) + # + # @return [String] the URL pointing to the first main page the + # user should see. + def url_for_main + url_for_file("index.html") + end + + # Returns the URL for the alphabetic index page + # + # @return [String] the URL pointing to the first main page the + # user should see. + def url_for_index + url_for_file("_index.html") + end + + # @group Formatting Objects and Attributes + + # Formats a list of objects and links them + # @return [String] a formatted list of objects + def format_object_name_list(objects) + objects.sort_by {|o| o.name.to_s.downcase }.map do |o| + "" + linkify(o, o.name) + "" + end.join(", ") + end + + # Formats a list of types from a tag. + # + # @param [Array, FalseClass] typelist + # the list of types to be formatted. + # + # @param [Boolean] brackets omits the surrounding + # brackets if +brackets+ is set to +false+. + # + # @return [String] the list of types formatted + # as [Type1, Type2, ...] with the types linked + # to their respective descriptions. + # + def format_types(typelist, brackets = true) + return unless typelist.is_a?(Array) + list = typelist.map do |type| + type = type.gsub(/([<>])/) { h($1) } + type = type.gsub(/([\w:]+)/) { $1 == "lt" || $1 == "gt" ? $1 : linkify($1, $1) } + "" + type + "" + end + list.empty? ? "" : (brackets ? "(#{list.join(", ")})" : list.join(", ")) + end + + # Get the return types for a method signature. + # + # @param [CodeObjects::MethodObject] meth the method object + # @param [Boolean] link whether to link the types + # @return [String] the signature types + # @since 0.5.3 + def signature_types(meth, link = true) + meth = convert_method_to_overload(meth) + if meth.respond_to?(:object) && !meth.has_tag?(:return) + meth = meth.object + end + + type = options.default_return || "" + if meth.tag(:return) && meth.tag(:return).types + types = meth.tags(:return).map {|t| t.types ? t.types : [] }.flatten.uniq + first = link ? h(types.first) : format_types([types.first], false) + if types.size == 2 && types.last == 'nil' + type = first + '?' + elsif types.size == 2 && types.last =~ /^(Array)?<#{Regexp.quote types.first}>$/ + type = first + '+' + elsif types.size > 2 + type = [first, '...'].join(', ') + elsif types == ['void'] && options.hide_void_return + type = "" + else + type = link ? h(types.join(", ")) : format_types(types, false) + end + elsif !type.empty? + type = link ? h(type) : format_types([type], false) + end + type = "#{type} " unless type.empty? + type + end + + # Formats the signature of method +meth+. + # + # @param [CodeObjects::MethodObject] meth the method object to list + # the signature of + # @param [Boolean] link whether to link the method signature to the details view + # @param [Boolean] show_extras whether to show extra meta-data (visibility, attribute info) + # @param [Boolean] full_attr_name whether to show the full attribute name + # ("name=" instead of "name") + # @return [String] the formatted method signature + def signature(meth, link = true, show_extras = true, full_attr_name = true) + meth = convert_method_to_overload(meth) + + type = signature_types(meth, link) + type = "⇒ #{type}" if type && !type.empty? + scope = meth.scope == :class ? "." : "#" + name = full_attr_name ? meth.name : meth.name.to_s.gsub(/^(\w+)=$/, '\1') + blk = format_block(meth) + args = !full_attr_name && meth.writer? ? "" : format_args(meth) + extras = [] + extras_text = '' + if show_extras + rw = meth.attr_info + if rw + attname = [rw[:read] ? 'read' : nil, rw[:write] ? 'write' : nil].compact + attname = attname.size == 1 ? attname.join('') + 'only' : nil + extras << attname if attname + end + extras << meth.visibility if meth.visibility != :public + extras_text = ' (' + extras.join(", ") + ')' unless extras.empty? + end + title = "%s%s%s %s %s" % [scope, h(name), args, blk, type] + if link + if meth.is_a?(YARD::CodeObjects::MethodObject) + link_title = "#{h meth.name(true)} (#{meth.scope} #{meth.type})" + else + link_title = "#{h name} (#{meth.type})" + end + obj = meth.respond_to?(:object) ? meth.object : meth + url = url_for(object, obj) + link_url(url, title, :title => link_title) + extras_text + else + title + extras_text + end + end + + # @group Getting the Character Encoding + + # Returns the current character set. The default value can be overridden + # by setting the +LANG+ environment variable or by overriding this + # method. In Ruby 1.9 you can also modify this value by setting + # +Encoding.default_external+. + # + # @return [String] the current character set + # @since 0.5.4 + def charset + has_encoding = defined?(::Encoding) + if defined?(@file) && @file && has_encoding + lang = @file.contents.encoding.to_s + else + return 'utf-8' unless has_encoding || ENV['LANG'] + lang = + if has_encoding + ::Encoding.default_external.name.downcase + else + ENV['LANG'].downcase.split('.').last + end + end + + case lang + when "ascii-8bit", "us-ascii", "ascii-7bit"; 'iso-8859-1' + when "utf8"; 'utf-8' + else; lang + end + end + + # @endgroup + + private + + # Converts a set of hash options into HTML attributes for a tag + # + # @param [Hash{String => String}] opts the tag options + # @return [String] the tag attributes of an HTML tag + def tag_attrs(opts = {}) + opts.sort_by {|k, _v| k.to_s }.map {|k, v| "#{k}=#{v.to_s.inspect}" if v }.join(" ") + end + + # Converts a {CodeObjects::MethodObject} into an overload object + # @since 0.5.3 + def convert_method_to_overload(meth) + # use first overload tag if it has a return type and method itself does not + if !meth.tag(:return) && meth.tags(:overload).size == 1 && meth.tag(:overload).tag(:return) + return meth.tag(:overload) + end + meth + end + + # Parses !!!lang out of codeblock, returning the codeblock language + # followed by the source code. + # + # @param [String] source the source code whose language to determine + # @return [Array(String, String)] the language, if any, and the + # remaining source + # @since 0.7.5 + def parse_lang_for_codeblock(source) + type = nil + if source =~ /\A(?:[ \t]*\r?\n)?[ \t]*!!!([\w.+-]+)[ \t]*\r?\n/ + type = $1 + source = $' + end + + [type, source] + end + + # Parses code blocks out of html and performs syntax highlighting + # on code inside of the blocks. + # + # @param [String] html the html to search for code in + # @return [String] highlighted html + # @see #html_syntax_highlight + def parse_codeblocks(html) + html.gsub(%r{(?:\s*)?(.+?)(?:\s*)?
    }m) do + string = $3 + + # handle !!!LANG prefix to send to html_syntax_highlight_LANG + language, = parse_lang_for_codeblock(string) + language ||= detect_lang_in_codeblock_attributes($1, $2) + language ||= object.source_type + + if options.highlight + string = html_syntax_highlight(CGI.unescapeHTML(string), language) + end + classes = ['code', language].compact.join(' ') + %(
    #{string}
    ) + end + end + + # Parses code block's HTML attributes in order to detect the programming + # language of what's enclosed in that code block. + # + # @param [String, nil] pre_html_attrs HTML attribute list of +pre+ element + # @param [String, nil] code_html_attrs HTML attribute list of +code+ + # element + # @return [String, nil] detected programming language + def detect_lang_in_codeblock_attributes(pre_html_attrs, code_html_attrs) + detected = nil + detected ||= (/\bdata-lang="(.+?)"/ =~ code_html_attrs && $1) + detected ||= (/\blang="(.+?)"/ =~ pre_html_attrs && $1) + detected ||= (/\bclass="(.+?)"/ =~ code_html_attrs && $1) + detected + end + end + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/templates/helpers/html_syntax_highlight_helper.rb b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/templates/helpers/html_syntax_highlight_helper.rb new file mode 100644 index 000000000..07ab9be79 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/templates/helpers/html_syntax_highlight_helper.rb @@ -0,0 +1,78 @@ +# frozen_string_literal: true +module YARD + module Templates + module Helpers + # Helper methods for syntax highlighting. + module HtmlSyntaxHighlightHelper + include ModuleHelper + + # Highlights Ruby source + # @param [String] source the Ruby source code + # @return [String] the highlighted Ruby source + def html_syntax_highlight_ruby(source) + if Parser::SourceParser.parser_type == :ruby + html_syntax_highlight_ruby_ripper(source) + else + html_syntax_highlight_ruby_legacy(source) + end + end + + private + + def html_syntax_highlight_ruby_ripper(source) + resolver = Parser::Ruby::TokenResolver.new(source, object) + output = String.new("") + resolver.each do |s, token_obj| + token_obj = clean_token_object(token_obj) + output << "" if [:tstring_beg, :regexp_beg].include?(s[0]) + case s.first + when :nl, :ignored_nl, :sp + output << h(s[1]) + when :ident, :const + klass = s.first == :ident ? "id identifier rubyid_#{h(s[1])}" : s.first + val = token_obj ? link_object(token_obj, s[1]) : h(s[1]) + output << "#{val}" + else + output << "#{h(s[1])}" + end + output << "" if [:tstring_end, :regexp_end].include?(s[0]) + end + output + rescue Parser::ParserSyntaxError + source =~ /^#{prettyval}" + else + "#{h s.text}" + end + end.join + end + + def clean_token_object(token_obj) + return unless token_obj + if token_obj == object + token_obj = nil + elsif token_obj.is_a?(CodeObjects::MethodObject) + token_obj = prune_method_listing([token_obj], false).first + else + token_obj = run_verifier([token_obj]).first + end + + token_obj + end + end + end + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/templates/helpers/markup/rdoc_markdown.rb b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/templates/helpers/markup/rdoc_markdown.rb new file mode 100644 index 000000000..03f9645fb --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/templates/helpers/markup/rdoc_markdown.rb @@ -0,0 +1,23 @@ +# frozen_string_literal: true +module YARD + module Templates + module Helpers + module Markup + begin require 'rdoc'; rescue LoadError; nil end + begin + require 'rdoc/markdown' + rescue LoadError + raise NameError, "could not load RDoc Markdown support (rdoc is too old)" + end + + class RDocMarkdown < RDocMarkup + def initialize(text) + super RDoc::Markdown.new.parse(text) + end + + def fix_typewriter(html) html end + end + end + end + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/templates/helpers/markup/rdoc_markup.rb b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/templates/helpers/markup/rdoc_markup.rb new file mode 100644 index 000000000..764d41fa5 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/templates/helpers/markup/rdoc_markup.rb @@ -0,0 +1,110 @@ +# frozen_string_literal: true +require 'thread' + +module YARD + module Templates + module Helpers + module Markup + begin require 'rdoc'; rescue LoadError; nil end + begin + require 'rdoc/markup' + require 'rdoc/markup/to_html' + class RDocMarkup; MARKUP = RDoc::Markup end + class RDocMarkupToHtml < RDoc::Markup::ToHtml + if defined?(RDoc::VERSION) && RDoc::VERSION >= '4.0.0' && + defined?(RDoc::Options) + def initialize + options = RDoc::Options.new + options.pipe = true + super(options) + end + end + end + rescue LoadError + begin + require 'rdoc/markup/simple_markup' + require 'rdoc/markup/simple_markup/to_html' + class RDocMarkup; MARKUP = SM::SimpleMarkup end + class RDocMarkupToHtml < SM::ToHtml; end + rescue LoadError + raise NameError, "could not load RDocMarkup (rdoc is not installed)" + end + end + + class RDocMarkup + attr_accessor :from_path + + @@mutex = Mutex.new + @@formatter = nil + @@markup = nil + + def initialize(text) + @text = text + + @@mutex.synchronize do + @@formatter ||= RDocMarkupToHtml.new + @@markup ||= MARKUP.new + end + end + + def to_html + html = nil + @@mutex.synchronize do + @@formatter.from_path = from_path + html = @@markup.convert(@text, @@formatter) + end + html = fix_dash_dash(html) + html = fix_typewriter(html) + html + end + + private + + # Fixes RDoc behaviour with ++ only supporting alphanumeric text. + # + # @todo Refactor into own SimpleMarkup subclass + def fix_typewriter(text) + code_tags = 0 + text.gsub(%r{<(/)?(pre|code|tt)|(\s|^|>)\+(?! )([^\n\+]{1,900})(?! )\+}) do |str| + closed = $1 + tag = $2 + first_text = $3 + type_text = $4 + + if tag + code_tags += (closed ? -1 : 1) + next str + end + next str unless code_tags == 0 + first_text + '' + type_text + '' + end + end + + # Don't allow -- to turn into — element. The chances of this being + # some --option is far more likely than the typographical meaning. + # + # @todo Refactor into own SimpleMarkup subclass + def fix_dash_dash(text) + text.gsub(/—(?=\S)/, '--') + end + end + + class RDocMarkupToHtml + attr_accessor :from_path + + # Disable auto-link of URLs + def handle_special_HYPERLINK(special) # rubocop:disable Style/MethodName + @hyperlink ? special.text : super + end + + def accept_paragraph(*args) + par = args.last + text = par.respond_to?(:txt) ? par.txt : par.text + @hyperlink = text =~ /\{(https?:|mailto:|link:|www\.)/ ? true : false + super + end + end + end + end + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/templates/helpers/markup_helper.rb b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/templates/helpers/markup_helper.rb new file mode 100644 index 000000000..9d7a6dcd1 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/templates/helpers/markup_helper.rb @@ -0,0 +1,173 @@ +# frozen_string_literal: true +require 'rubygems' + +module YARD + module Templates::Helpers + # Helper methods for loading and managing markup types. + module MarkupHelper + class << self + # Clears the markup provider cache information. Mainly used for testing. + # @return [void] + def clear_markup_cache + self.markup_cache = {} + end + + # @return [Hash{Symbol=>{(:provider,:class)=>Object}}] the cached markup providers + # @private + # @since 0.6.4 + attr_accessor :markup_cache + end + + MarkupHelper.clear_markup_cache + + # The default list of markup providers for each markup type + MARKUP_PROVIDERS = { + :markdown => [ + {:lib => :redcarpet, :const => 'RedcarpetCompat'}, + {:lib => :rdiscount, :const => 'RDiscount'}, + {:lib => :kramdown, :const => 'Kramdown::Document'}, + {:lib => :bluecloth, :const => 'BlueCloth'}, + {:lib => :maruku, :const => 'Maruku'}, + {:lib => :'rpeg-markdown', :const => 'PEGMarkdown'}, + {:lib => :rdoc, :const => 'YARD::Templates::Helpers::Markup::RDocMarkdown'}, + {:lib => :commonmarker, :const => 'CommonMarker'} + ], + :textile => [ + {:lib => :redcloth, :const => 'RedCloth'} + ], + :textile_strict => [ + {:lib => :redcloth, :const => 'RedCloth'} + ], + :rdoc => [ + {:lib => nil, :const => 'YARD::Templates::Helpers::Markup::RDocMarkup'} + ], + :org => [ + {:lib => :'org-ruby', :const => 'Orgmode::Parser'} + ], + :asciidoc => [ + {:lib => :asciidoctor, :const => 'Asciidoctor'} + ], + :ruby => [], + :text => [], + :pre => [], + :html => [], + :none => [] + } + + # Returns a list of extensions for various markup types. To register + # extensions for a type, add them to the array of extensions for the + # type. + # @since 0.6.0 + MARKUP_EXTENSIONS = { + :html => ['htm', 'html', 'shtml'], + :text => ['txt'], + :textile => ['textile', 'txtile'], + :asciidoc => ['asciidoc', 'ad', 'adoc', 'asc'], + :markdown => ['markdown', 'md', 'mdown', 'mkd'], + :rdoc => ['rdoc'], + :org => ['org'], + :ruby => ['rb', 'ru'] + } + + # Contains the Regexp object that matches the shebang line of extra + # files to detect the markup type. + MARKUP_FILE_SHEBANG = /\A#!(\S+)\s*$/ + + # Attempts to load the first valid markup provider in {MARKUP_PROVIDERS}. + # If a provider is specified, immediately try to load it. + # + # On success this sets `@markup_provider` and `@markup_class` to + # the provider name and library constant class/module respectively for + # the loaded provider. + # + # On failure this method will inform the user that no provider could be + # found and exit the program. + # + # @return [Boolean] whether the markup provider was successfully loaded. + def load_markup_provider(type = options.markup) + return true if MarkupHelper.markup_cache[type] + MarkupHelper.markup_cache[type] ||= {} + + providers = MARKUP_PROVIDERS[type.to_sym] + return true if providers && providers.empty? + if providers && options.markup_provider + providers = providers.select {|p| p[:lib] == options.markup_provider } + end + + if providers.nil? || providers.empty? + log.error "Invalid markup type '#{type}' or markup provider " \ + "(#{options.markup_provider}) is not registered." + return false + end + + # Search for provider, return the library class name as const if found + providers.each do |provider| + begin require provider[:lib].to_s; rescue LoadError; next end if provider[:lib] + begin klass = eval("::" + provider[:const]); rescue NameError; next end # rubocop:disable Lint/Eval + MarkupHelper.markup_cache[type][:provider] = provider[:lib] # Cache the provider + MarkupHelper.markup_cache[type][:class] = klass + return true + end + + # Show error message telling user to install first potential provider + lib = providers.first[:lib] || type + log.error "Missing '#{lib}' gem for #{type.to_s.capitalize} formatting. Install it with `gem install #{lib}`" + false + end + + # Checks for a shebang or looks at the file extension to determine + # the markup type for the file contents. File extensions are registered + # for a markup type in {MARKUP_EXTENSIONS}. + # + # A shebang should be on the first line of a file and be in the form: + # + # #!markup_type + # + # Standard markup types are text, html, rdoc, markdown, textile + # + # @param [String] contents Unused. Was necessary prior to 0.7.0. + # Newer versions of YARD use {CodeObjects::ExtraFileObject#contents} + # @return [Symbol] the markup type recognized for the file + # @see MARKUP_EXTENSIONS + # @since 0.6.0 + def markup_for_file(contents, filename) + return $1.to_sym if contents && contents =~ MARKUP_FILE_SHEBANG # Shebang support + + ext = (File.extname(filename)[1..-1] || '').downcase + MARKUP_EXTENSIONS.each do |type, exts| + return type if exts.include?(ext) + end + options.markup + end + + # Strips any shebang lines on the file contents that pertain to + # markup or preprocessing data. + # + # @deprecated Use {CodeObjects::ExtraFileObject#contents} instead + # @return [String] the file contents minus any preprocessing tags + # @since 0.6.0 + def markup_file_contents(contents) + contents =~ MARKUP_FILE_SHEBANG ? $' : contents + end + + # Gets the markup provider class/module constant for a markup type + # Call {#load_markup_provider} before using this method. + # + # @param [Symbol] type the markup type (:rdoc, :markdown, etc.) + # @return [Class] the markup class + def markup_class(type = options.markup) + load_markup_provider(type) + MarkupHelper.markup_cache[type][:class] + end + + # Gets the markup provider name for a markup type + # Call {#load_markup_provider} before using this method. + # + # @param [Symbol] type the markup type (:rdoc, :markdown, etc.) + # @return [Symbol] the markup provider name (usually the gem name of the library) + def markup_provider(type = options.markup) + MarkupHelper.markup_cache[type][:provider] + end + end + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/templates/helpers/method_helper.rb b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/templates/helpers/method_helper.rb new file mode 100644 index 000000000..2bae46602 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/templates/helpers/method_helper.rb @@ -0,0 +1,75 @@ +# frozen_string_literal: true +module YARD + module Templates::Helpers + # Helper methods for method objects. + module MethodHelper + # @return [String] formatted arguments for a method + def format_args(object) + return if object.parameters.nil? + params = object.parameters + if object.has_tag?(:yield) || object.has_tag?(:yieldparam) + params.reject! do |param| + param[0].to_s[0, 1] == "&" && + !object.tags(:param).any? {|t| t.name == param[0][1..-1] } + end + end + + if params.empty? + "" + else + args = params.map do |n, v| + v ? "#{n}#{n[-1, 1] == ':' ? '' : ' ='} #{v}" : n.to_s + end.join(", ") + h("(#{args})") + end + end + + # @return [String] formatted and linked return types for a method + def format_return_types(object) + return unless object.has_tag?(:return) && object.tag(:return).types + return if object.tag(:return).types.empty? + format_types [object.tag(:return).types.first], false + end + + # @return [String] formatted block if one exists + def format_block(object) + if object.has_tag?(:yield) && object.tag(:yield).types + params = object.tag(:yield).types + elsif object.has_tag?(:yieldparam) + params = object.tags(:yieldparam).map(&:name) + elsif object.has_tag?(:yield) + return "{ ... }" + else + params = nil + end + + params ? h("{|" + params.join(", ") + "| ... }") : "" + end + + # @return [String] formats line numbers for source code of an object + def format_lines(object) + return "" if object.source.nil? || object.line.nil? + i = -1 + object.source.split(/\n/).map { object.line + (i += 1) }.join("\n") + end + + # @return [String] formats source of an object + def format_code(object, _show_lines = false) + i = -1 + lines = object.source.split(/\n/) + longestline = (object.line + lines.size).to_s.length + lines.map do |line| + lineno = object.line + (i += 1) + (" " * (longestline - lineno.to_s.length)) + lineno.to_s + " " + line + end.join("\n") + end + + # @return [String] formats source code of a constant value + def format_constant(value) + sp = value.split("\n").last[/^(\s+)/, 1] + num = sp ? sp.size : 0 + html_syntax_highlight value.gsub(/^\s{#{num}}/, '') + end + end + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/templates/helpers/module_helper.rb b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/templates/helpers/module_helper.rb new file mode 100644 index 000000000..e464b9459 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/templates/helpers/module_helper.rb @@ -0,0 +1,21 @@ +# frozen_string_literal: true +module YARD + module Templates + module Helpers + # Helper methods for managing module objects. + module ModuleHelper + # Prunes the method listing by running the verifier and removing attributes/aliases + # @param [Array] list a list of methods + # @param [Boolean] hide_attributes whether to prune attribute methods from the list + # @return [Array] a pruned list of methods + def prune_method_listing(list, hide_attributes = true) + list = run_verifier(list) + list = list.reject {|o| run_verifier([o.parent]).empty? } + list = list.reject {|o| o.is_alias? unless CodeObjects::Proxy === o.namespace } + list = list.reject {|o| o.is_attribute? unless CodeObjects::Proxy === o.namespace } if hide_attributes + list + end + end + end + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/templates/helpers/text_helper.rb b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/templates/helpers/text_helper.rb new file mode 100644 index 000000000..7d829afda --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/templates/helpers/text_helper.rb @@ -0,0 +1,112 @@ +# frozen_string_literal: true +module YARD + module Templates + module Helpers + # Helper methods for text template formats. + module TextHelper + # @return [String] escapes text + def h(text) + out = String.new("") + text = resolve_links(text) + text = text.split(/\n/) + text.each_with_index do |line, i| + out << + case line + when /^\s*$/; "\n\n" + when /^\s+\S/, /^=/; line + "\n" + else; line + (text[i + 1] =~ /^\s+\S/ ? "\n" : " ") + end + end + out + end + + # @return [String] wraps text at +col+ columns. + def wrap(text, col = 72) + text.gsub(/(.{1,#{col}})( +|$\n?)|(.{1,#{col}})/, "\\1\\3\n") + end + + # @return [String] indents +text+ by +len+ characters. + def indent(text, len = 4) + text.gsub(/^/, ' ' * len) + end + + # @return [String] aligns a title to the right + def title_align_right(text, col = 72) + align_right(text, '-', col) + end + + # @return [String] aligns text to the right + def align_right(text, spacer = ' ', col = 72) + text = text[0, col - 4] + '...' if (col - 1 - text.length) < 0 + spacer * (col - 1 - text.length) + " " + text + end + + # @return [String] returns a horizontal rule for output + def hr(col = 72, sep = "-") + sep * col + end + + # @return [String] the formatted signature for a method + def signature(meth) + # use first overload tag if it has a return type and method itself does not + if !meth.tag(:return) && meth.tag(:overload) && meth.tag(:overload).tag(:return) + meth = meth.tag(:overload) + end + + type = options.default_return || "" + rmeth = meth + if !rmeth.has_tag?(:return) && rmeth.respond_to?(:object) + rmeth = meth.object + end + if rmeth.tag(:return) && rmeth.tag(:return).types + types = rmeth.tags(:return).map {|t| t.types ? t.types : [] }.flatten.uniq + first = types.first + if types.size == 2 && types.last == 'nil' + type = first + '?' + elsif types.size == 2 && types.last =~ /^(Array)?<#{Regexp.quote types.first}>$/ + type = first + '+' + elsif types.size > 2 + type = [first, '...'].join(', ') + elsif types == ['void'] && options.hide_void_return + type = "" + else + type = types.join(", ") + end + end + type = "(#{type})" if type.include?(',') + type = " -> #{type} " unless type.empty? + scope = meth.scope == :class ? "#{meth.namespace.name}." : "#{meth.namespace.name.to_s.downcase}." + name = meth.name + blk = format_block(meth) + args = format_args(meth) + extras = [] + extras_text = '' + rw = meth.namespace.attributes[meth.scope][meth.name] + if rw + attname = [rw[:read] ? 'read' : nil, rw[:write] ? 'write' : nil].compact + attname = attname.size == 1 ? attname.join('') + 'only' : nil + extras << attname if attname + end + extras << meth.visibility if meth.visibility != :public + extras_text = '(' + extras.join(", ") + ')' unless extras.empty? + title = "%s%s%s %s%s%s" % [scope, name, args, blk, type, extras_text] + title.gsub(/\s+/, ' ') + end + + private + + def resolve_links(text) + text.gsub(/(\\|!)?\{(?!\})(\S+?)(?:\s([^\}]*?\S))?\}(?=[\W]|$)/m) do |_str| + escape = $1 + name = $2 + title = $3 + match = $& + next(match[1..-1]) if escape + next(match) if name[0, 1] == '|' + linkify(name, title) + end + end + end + end + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/templates/helpers/uml_helper.rb b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/templates/helpers/uml_helper.rb new file mode 100644 index 000000000..a295ace17 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/templates/helpers/uml_helper.rb @@ -0,0 +1,47 @@ +# frozen_string_literal: true +module YARD + module Templates::Helpers + # Helpers for UML template format + module UMLHelper + # Official UML visibility prefix syntax for an object given its visibility + # @param [CodeObjects::Base] object the object to retrieve visibility for + # @return [String] the UML visibility prefix + def uml_visibility(object) + case object.visibility + when :public; '+' + when :protected; '#' + when :private; '-' + end + end + + # Formats the path of an object for Graphviz syntax + # @param [CodeObjects::Base] object an object to format the path of + # @return [String] the encoded path + def format_path(object) + object.path.gsub('::', '_') + end + + # Encodes text in escaped Graphviz syntax + # @param [String] text text to encode + # @return [String] the encoded text + def h(text) + text.to_s.gsub(/(\W)/, '\\\\\1') + end + + # Tidies data by formatting and indenting text + # @param [String] data pre-formatted text + # @return [String] tidied text. + def tidy(data) + indent = 0 + data.split(/\n/).map do |line| + line.gsub!(/^\s*/, '') + next if line.empty? + indent -= 1 if line =~ /^\s*\}\s*$/ + line = (' ' * (indent * 2)) + line + indent += 1 if line =~ /\{\s*$/ + line + end.compact.join("\n") + "\n" + end + end + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/templates/section.rb b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/templates/section.rb new file mode 100644 index 000000000..ca42adddc --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/templates/section.rb @@ -0,0 +1,103 @@ +# frozen_string_literal: true +module YARD + module Templates + # Abstracts the structure for a section and its subsections into an ordered + # list of sections and subsections. + # @since 0.6.0 + class Section < Array + attr_accessor :name + + def initialize(name, *args) + self.name = name + replace(parse_sections(args)) + end + + def dup + obj = super + obj.name = name + obj + end + + def [](*args) + if args.first.is_a?(Range) || args.size > 1 + return self.class.new(name, *super(*args)) + elsif args.first.is_a?(Integer) + return super(*args) + end + find {|o| o.name == args.first } + end + + def eql?(other) + super(other) && name == other.name + end + + def ==(other) + case other + when Section + eql?(other) + when Array + to_a == other + else + name == other + end + end + + def push(*args) + super(*parse_sections(args)) + end + alias << push + + def unshift(*args) + super(*parse_sections(args)) + end + + def inspect + n = name.respond_to?(:path) ? "T('#{name.path}')" : name.inspect + subsects = empty? ? "" : ", subsections=#{super}" + "Section(#{n}#{subsects})" + end + + def place(*args) + super(*parse_sections(args)) + end + + def to_a + list = [name] + unless empty? + subsects = [] + each {|s| subsects += s.to_a } + list << subsects + end + list + end + + def any(item) + find do |section| + return section if section == item + return section.any(item) unless section.empty? + end + nil + end + + private + + def parse_sections(args) + if args.size == 1 && args.first.is_a?(Array) && !args.first.is_a?(Section) + args = args.first + end + sections = [] + args.each_with_index do |name, index| + case name + when Section; sections << name + when Array; next + else + subsections = args[index + 1].is_a?(Array) ? args[index + 1] : [] + subsections = [] if subsections.is_a?(Section) + sections << Section.new(name, subsections) + end + end + sections + end + end + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/templates/template.rb b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/templates/template.rb new file mode 100644 index 000000000..975be87c5 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/templates/template.rb @@ -0,0 +1,418 @@ +# frozen_string_literal: true +require 'erb' + +module YARD + module Templates + module Template + attr_accessor :class, :section + attr_reader :options + + class << self + # Extra includes are mixins that are included after a template is created. These + # mixins can be registered by plugins to operate on templates and override behaviour. + # + # Note that this array can be filled with modules or proc objects. If a proc object + # is given, the proc will be called with the {Template#options} hash containing + # relevant template information like the object, format, and more. The proc should + # return a module or nil if there is none. + # + # @example Adding in extra mixins to include on a template + # Template.extra_includes << MyHelper + # @example Conditionally including a mixin if the format is html + # Template.extra_includes << proc {|opts| MyHelper if opts.format == :html } + # @return [Array] a list of modules to be automatically included + # into any new template module + attr_accessor :extra_includes + + # @!parse extend ClassMethods + # @private + def included(klass) + klass.extend(ClassMethods) + end + + # Includes the {extra_includes} modules into the template object. + # + # @param [Template] template the template object to mixin the extra includes. + # @param [SymbolHash] options the options hash containing all template information + # @return [void] + def include_extra(template, options) + extra_includes.each do |mod| + mod = mod.call(options) if mod.is_a?(Proc) + next unless mod.is_a?(Module) + template.extend(mod) + end + end + end + + self.extra_includes = [ + proc do |options| + {:html => Helpers::HtmlHelper, + :text => Helpers::TextHelper, + :dot => Helpers::UMLHelper}[options.format] + end + ] + + include ErbCache + include Helpers::BaseHelper + include Helpers::MethodHelper + + module ClassMethods + attr_accessor :path, :full_path + + # @return [Array] a list of full paths + # @note This method caches path results. Paths should not be modified + # after this method is called; call {#reset_full_paths} to reset cache. + def full_paths + reset_full_paths unless defined? @cached_included_modules + return @full_paths if included_modules == @cached_included_modules + + @cached_included_modules = included_modules + @full_paths = included_modules.inject([full_path]) do |paths, mod| + paths |= mod.full_paths if mod.respond_to?(:full_paths) + paths + end + end + + # Resets cache for {#full_paths} + def reset_full_paths + @cached_included_modules = nil + end + + def initialize(path, full_paths) + full_path = full_paths.shift + self.path = path + self.full_path = full_path + include_inherited(full_paths) + include_parent + load_setup_rb + end + + # Searches for a file identified by +basename+ in the template's + # path as well as any mixed in template paths. Equivalent to calling + # {ClassMethods#find_nth_file} with index of 1. + # + # @param [String] basename the filename to search for + # @return [String] the full path of a file on disk with filename + # +basename+ in one of the template's paths. + # @see find_nth_file + def find_file(basename) + find_nth_file(basename) + end + + # Searches for the nth file (where n = +index+) identified + # by basename in the template's path and any mixed in template paths. + # + # @param [String] basename the filename to search for + # @param [Fixnum] index the nth existing file to return + # @return [String] the full path of the nth file on disk with + # filename +basename+ in one of the template paths + def find_nth_file(basename, index = 1) + n = 1 + full_paths.each do |path| + file = File.join(path, basename) + if File.file?(file) + return file if index == n + n += 1 + end + end + + nil + end + + def is_a?(klass) + return true if klass == Template + super(klass) + end + + # Creates a new template object to be rendered with {Template#run} + def new(*args) + obj = Object.new.extend(self) + obj.class = self + obj.send(:initialize, *args) + obj + end + + def run(*args) + new(*args).run + end + + # rubocop:disable Style/MethodName + + # Alias for creating {Engine.template}. + def T(*path) + Engine.template(*path) + end + + # Alias for creating a {Section} with arguments + # @see Section#initialize + # @since 0.6.0 + def S(*args) + Section.new(*args) + end + + # rubocop:enable Style/MethodName + + private + + def include_parent + pc = path.to_s.split('/') + if pc.size > 1 + pc.pop + pc = pc.join('/') + begin + include Engine.template(pc) + rescue ArgumentError + include Engine.template!(pc, full_path.gsub(%r{/[^/]+$}, '')) + end + end + end + + def include_inherited(full_paths) + full_paths.reverse.each do |full_path| + include Engine.template!(path, full_path) + end + end + + def load_setup_rb + setup_file = File.join(full_path, 'setup.rb') + if File.file? setup_file + module_eval(File.read(setup_file).taint, setup_file, 1) + end + end + end + + def initialize(opts = TemplateOptions.new) + opts_class = opts.class + opts_class = TemplateOptions if opts_class == Hash + @cache = {} + @cache_filename = {} + @sections = [] + @options = opts_class.new + add_options(opts) + Template.include_extra(self, options) + init + end + + # Loads a template specified by path. If +:template+ or +:format+ is + # specified in the {#options} hash, they are prepended and appended + # to the path respectively. + # + # @param [Array] path the path of the template + # @return [Template] the loaded template module + def T(*path) # rubocop:disable Style/MethodName + path.unshift(options.template) if options.template + path.push(options.format) if options.format + self.class.T(*path) + end + + # Sets the sections (and subsections) to be rendered for the template + # + # @example Sets a set of erb sections + # sections :a, :b, :c # searches for a.erb, b.erb, c.erb + # @example Sets a set of method and erb sections + # sections :a, :b, :c # a is a method, the rest are erb files + # @example Sections with subsections + # sections :header, [:name, :children] + # # the above will call header.erb and only renders the subsections + # # if they are yielded by the template (see #yieldall) + # @param [Array] args the sections + # to use to render the template. For symbols and strings, the + # section will be executed as a method (if one exists), or rendered + # from the file "name.erb" where name is the section name. For + # templates, they will have {Template::ClassMethods#run} called on them. + # Any subsections can be yielded to using yield or {#yieldall} + def sections(*args) + @sections = Section.new(nil, *args) unless args.empty? + @sections + end + + # Initialization called on the template. Override this in a 'setup.rb' + # file in the template's path to implement a template + # + # @example A default set of sections + # def init + # sections :section1, :section2, [:subsection1, :etc] + # end + # @see #sections + def init + end + + # Runs a template on +sects+ using extra options. This method should + # not be called directly. Instead, call the class method {ClassMethods#run} + # + # @param [Hash, nil] opts any extra options to apply to sections + # @param [Section, Array] sects a section list of sections to render + # @param [Fixnum] start_at the index in the section list to start from + # @param [Boolean] break_first if true, renders only the first section + # @yield [opts] calls for the subsections to be rendered + # @yieldparam [Hash] opts any extra options to yield + # @return [String] the rendered sections joined together + def run(opts = nil, sects = sections, start_at = 0, break_first = false, &block) + out = String.new("") + return out if sects.nil? + sects = sects[start_at..-1] if start_at > 0 + sects = Section.new(nil, sects) unless sects.is_a?(Section) + add_options(opts) do + sects.each do |s| + self.section = s + subsection_index = 0 + value = render_section(section) do |*args| + value = with_section do + run(args.first, section, subsection_index, true, &block) + end + subsection_index += 1 + value + end + out << (value || "") + break if break_first + end + end + out + end + + # Yields all subsections with any extra options + # + # @param [Hash] opts extra options to be applied to subsections + def yieldall(opts = nil, &block) + with_section { run(opts, section, &block) } + end + + # @param [String, Symbol] section the section name + # @yield calls subsections to be rendered + # @return [String] the contents of the ERB rendered section + def erb(section, &block) + method_name = ErbCache.method_for(cache_filename(section)) do + erb_with(cache(section), cache_filename(section)) + end + send(method_name, &block) + end + + # Returns the contents of a file. If +allow_inherited+ is set to +true+, + # use +{{{__super__}}}+ inside the file contents to insert the contents + # of the file from an inherited template. For instance, if +templates/b+ + # inherits from +templates/a+ and file "test.css" exists in both directories, + # both file contents can be retrieved by having +templates/b/test.css+ look + # like: + # + # {{{__super__}}} + # ... + # body { css styles here } + # p.class { other styles } + # + # @param [String] basename the name of the file + # @param [Boolean] allow_inherited whether inherited templates can + # be inserted with +{{{__super__}}}+ + # @return [String] the contents of a file identified by +basename+. All + # template paths (including any mixed in templates) are searched for + # the file + # @see ClassMethods#find_file + # @see ClassMethods#find_nth_file + def file(basename, allow_inherited = false) + file = self.class.find_file(basename) + raise ArgumentError, "no file for '#{basename}' in #{self.class.path}" unless file + + data = IO.read(file) + if allow_inherited + superfile = self.class.find_nth_file(basename, 2) + data.gsub!('{{{__super__}}}', superfile ? IO.read(superfile) : "") + end + + data + end + + # Calls the ERB file from the last inherited template with {#section}.erb + # + # @param [Symbol, String] sect if provided, uses a specific section name + # @return [String] the rendered ERB file in any of the inherited template + # paths. + def superb(sect = section, &block) + filename = self.class.find_nth_file(erb_file_for(sect), 2) + return "" unless filename + method_name = ErbCache.method_for(filename) { erb_with(IO.read(filename), filename) } + send(method_name, &block) + end + + def options=(value) + @options = value + set_ivars + end + + def inspect + "Template(#{self.class.path}) [section=#{section.name}]" + end + + protected + + def erb_file_for(section) + "#{section}.erb" + end + + def erb_with(content, filename = nil) + erb = if ERB.instance_method(:initialize).parameters.assoc(:key) # Ruby 2.6+ + ERB.new(content, :trim_mode => options.format == :text ? '<>' : nil) + else + ERB.new(content, nil, options.format == :text ? '<>' : nil) + end + erb.filename = filename if filename + erb + end + + private + + def render_section(section, &block) + section = section.name if section.is_a?(Section) + case section + when Section, String, Symbol + if respond_to?(section) + send(section, &block) + else + erb(section, &block) + end + when Module, Template + section.run(options, &block) if section.is_a?(Template) + end || "" + end + + def cache(section) + content = @cache[section.to_sym] + return content if content + + file = cache_filename(section) + @cache_filename[section.to_sym] = file + raise ArgumentError, "no template for section '#{section}' in #{self.class.path}" unless file + @cache[section.to_sym] = IO.read(file) + end + + def cache_filename(section) + @cache_filename[section.to_sym] ||= + self.class.find_file(erb_file_for(section)) + end + + def set_ivars + options.each do |k, v| + instance_variable_set("@#{k}", v) + end + end + + def add_options(opts = nil) + return(yield) if opts.nil? && block_given? + cur_opts = options if block_given? + + self.options = options.merge(opts) + + if block_given? + value = yield + self.options = cur_opts + value + end + end + + def with_section + sect = section + value = yield + self.section = sect + value + end + end + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/templates/template_options.rb b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/templates/template_options.rb new file mode 100644 index 000000000..98cee3458 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/templates/template_options.rb @@ -0,0 +1,92 @@ +# frozen_string_literal: true +require 'ostruct' + +module YARD + module Templates + # An Options class containing default options for base template rendering. For + # options specific to generation of HTML output, see {CLI::YardocOptions}. + # + # @see CLI::YardocOptions + class TemplateOptions < YARD::Options + # @return [Symbol] the template output format + default_attr :format, :text + + # @return [Symbol] the template name used to render output + default_attr :template, :default + + # @return [Symbol] the markup format to use when parsing docstrings + default_attr :markup, :rdoc # default is :rdoc but falls back on :none + + # @return [String] the default return type for a method with no return tags + default_attr :default_return, "Object" + + # @return [Boolean] whether void methods should show "void" in their signature + default_attr :hide_void_return, false + + # @return [Boolean] whether code blocks should be syntax highlighted + default_attr :highlight, true + + # @return [Class] the markup provider class for the markup format + attr_accessor :markup_provider + + # @return [OpenStruct] an open struct containing any global state across all + # generated objects in a template. + default_attr :globals, lambda { OpenStruct.new } + alias __globals globals + + # @return [CodeObjects::Base] the main object being generated in the template + attr_accessor :object + + # @return [CodeObjects::Base] the owner of the generated object + attr_accessor :owner + + # @return [Symbol] the template type used to generate output + attr_accessor :type + + # @return [Boolean] whether serialization should be performed + default_attr :serialize, true + + # @return [Serializers::Base] the serializer used to generate links and serialize + # output. Serialization output only occurs if {#serialize} is +true+. + attr_accessor :serializer + + # @deprecated use {#highlight} instead. + # @return [Boolean] whether highlighting should be ignored + attr_reader :no_highlight + undef no_highlight + def no_highlight; !highlight end + def no_highlight=(value) self.highlight = !value end + + # @return [String] the title of a given page + attr_accessor :page_title + + # @return [Boolean] whether the page is the "index" + attr_accessor :index + + # @example A list of mixin path names (including wildcards) + # opts.embed_mixins #=> ['ClassMethods', '*Helper', 'YARD::*'] + # @return [Array] an array of module name wildcards to embed into + # class documentation as if their methods were defined directly in the class. + # Useful for modules like ClassMethods. If the name contains '::', the module + # is matched against the full mixin path, otherwise only the module name is used. + default_attr :embed_mixins, lambda { [] } + + # @param [CodeObjects::Base] mixin accepts any code object, but returns + # nil unless the object is a module. + # @return [Boolean] whether a mixin matches the embed_mixins list + # @return [nil] if the mixin is not a module object + def embed_mixins_match?(mixin) + return true if mixin == object # the method is not inherited + return nil unless mixin.is_a?(CodeObjects::ModuleObject) + embed_mixins.any? do |embed_mixin| + re = /\A#{Regexp.quote(embed_mixin).gsub('\*', '.*')}\Z/ + matchstr = embed_mixin.include?("::") ? mixin.path : mixin.name + re.match(matchstr.to_s) + end + end + + # @return [Verifier] the verifier object + attr_accessor :verifier + end + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/verifier.rb b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/verifier.rb new file mode 100644 index 000000000..37d45129f --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/verifier.rb @@ -0,0 +1,151 @@ +# frozen_string_literal: true +module YARD + # Similar to a Proc, but runs a set of Ruby expressions using a small + # DSL to make tag lookups easier. + # + # The syntax is as follows: + # * All syntax is Ruby compatible + # * +object+ (+o+ for short) exist to access the object being verified + # * +@TAGNAME+ is translated into +object.tag('TAGNAME')+ + # * +@@TAGNAME+ is translated into +object.tags('TAGNAME')+ + # * +object+ can be omitted as target for method calls (it is implied) + # + # @example Create a verifier to check for objects that don't have @private tags + # verifier = Verifier.new('!@private') + # verifier.call(object) # => true (no @private tag) + # @example Create a verifier to find any return tag with an empty description + # Verifier.new('@return.text.empty?') + # # Equivalent to: + # Verifier.new('object.tag(:return).text.empty?') + # @example Check if there are any @param tags + # Verifier.new('@@param.empty?') + # # Equivalent to: + # Verifier.new('object.tags(:param).empty?') + # @example Using +object+ or +o+ to look up object attributes directly + # Verifier.new('object.docstring == "hello world"') + # # Equivalent to: + # Verifier.new('o.docstring == "hello world"') + # @example Without using +object+ or +o+ + # Verifier.new('tag(:return).size == 1 || has_tag?(:author)') + # @example Specifying multiple expressions + # Verifier.new('@return', '@param', '@yield') + # # Equivalent to: + # Verifier.new('@return && @param && @yield') + class Verifier + # @return [Array] a list of all expressions the verifier checks for + # @since 0.5.6 + attr_reader :expressions + + def expressions=(value) + @expressions = value + create_method_from_expressions + end + + # Creates a verifier from a set of expressions + # + # @param [Array] expressions a list of Ruby expressions to + # parse. + def initialize(*expressions) + @expressions = [] + add_expressions(*expressions) + end + + # Adds a set of expressions and recompiles the verifier + # + # @param [Array] expressions a list of expressions + # @return [void] + # @since 0.5.6 + def add_expressions(*expressions) + self.expressions += expressions.flatten + end + + # Passes any method calls to the object from the {#call} + def method_missing(sym, *args, &block) + if object.respond_to?(sym) + object.send(sym, *args, &block) + else + super + end + end + + # Tests the expressions on the object. + # + # @note If the object is a {CodeObjects::Proxy} the result will always be true. + # @param [CodeObjects::Base] object the object to verify + # @return [Boolean] the result of the expressions + def call(object) + return true if object.is_a?(CodeObjects::Proxy) + modify_nilclass + @object = object + retval = __execute ? true : false + unmodify_nilclass + retval + end + + # Runs a list of objects against the verifier and returns the subset + # of verified objects. + # + # @param [Array] list a list of code objects + # @return [Array] a list of code objects that match + # the verifier. + def run(list) + list.reject {|item| call(item).is_a?(FalseClass) } + end + + protected + + # @return [CodeObjects::Base] the current object being tested + attr_reader :object + alias o object + + private + + # @private + NILCLASS_METHODS = [:type, :method_missing] + + # Modifies nil to not throw NoMethodErrors. This allows + # syntax like object.tag(:return).text to work if the #tag + # call returns nil, which means users don't need to perform + # stringent nil checking + # + # @return [void] + def modify_nilclass + NILCLASS_METHODS.each do |meth| + NilClass.send(:define_method, meth) {|*args| } + end + end + + # Returns the state of NilClass back to normal + # @return [void] + def unmodify_nilclass + NILCLASS_METHODS.each do |meth| + next unless nil.respond_to?(meth) + NilClass.send(:remove_method, meth) + end + end + + # Creates the +__execute+ method by evaluating the expressions + # as Ruby code + # @return [void] + def create_method_from_expressions + expr = expressions.map {|e| "(#{parse_expression(e)})" }.join(" && ") + + instance_eval(<<-eof, __FILE__, __LINE__ + 1) + begin; undef __execute; rescue NameError; end + def __execute; #{expr}; end + eof + end + + # Parses a single expression, handling some of the DSL syntax. + # + # The syntax "@tag" should be turned into object.tag(:tag), + # and "@@tag" should be turned into object.tags(:tag) + # + # @return [String] the parsed expression + def parse_expression(expr) + expr = expr.gsub(/@@(?:(\w+)|\{([\w\.]+)\})/, 'object.tags("\1\2")') + expr = expr.gsub(/@(?:(\w+)|\{([\w\.]+)\})/, 'object.tag("\1\2")') + expr + end + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/version.rb b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/version.rb new file mode 100644 index 000000000..ea418b495 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/lib/yard/version.rb @@ -0,0 +1,6 @@ + +# frozen_string_literal: true + +module YARD + VERSION = '0.9.27' +end diff --git a/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/po/ja.po b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/po/ja.po new file mode 100644 index 000000000..199fb1486 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/po/ja.po @@ -0,0 +1,31108 @@ +# Japanese translations for PACKAGE package. +# Copyright (C) 2011 THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# , 2011. +# +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2011-11-20 22:17+0900\n" +"PO-Revision-Date: 2012-06-20 16:56+0900\n" +"Last-Translator: \n" +"Language-Team: Japanese\n" +"Language: ja\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +#: ../README.md:1 +msgid "" +"YARD: Yay! A Ruby Documentation Tool\n" +"====================================" +msgstr "" +"YARD: Yay! A Ruby Documentation Tool\n" +"====================================" + +#: ../README.md:4 +msgid "" +"**Homepage**: [http://yardoc.org](http://yardoc.org) \n" +"**IRC**: [irc.freenode.net / #yard](irc://irc.freenode.net/" +"yard) \n" +"**Git**: [http://github.com/lsegal/yard](http://github.com/lsegal/" +"yard) \n" +"**Author**: Loren Segal \n" +"**Contributors**: See Contributors section below \n" +"**Copyright**: 2007-2012 \n" +"**License**: MIT License \n" +"**Latest Version**: 0.8.2.1 (codename \"Shave It\") \n" +"**Release Date**: June 10th 2012" +msgstr "" +"**Homepage**: [http://yardoc.org](http://yardoc.org) \n" +"**IRC**: [irc.freenode.net / #yard](irc://irc.freenode.net/yard) \n" +"**Git**: [http://github.com/lsegal/yard](http://github.com/lsegal/yard) \n" +"**Author**: Loren Segal \n" +"**Contributors**: See Contributors section below \n" +"**Copyright**: 2007-2012 \n" +"**License**: MIT License \n" +"**Latest Version**: 0.8.2.1 (codename \"Shave It\") \n" +"**Release Date**: June 10th 2012" + +#: ../README.md:14 +msgid "" +"Synopsis\n" +"--------" +msgstr "" +"概要\n" +"--------" + +#: ../README.md:17 +msgid "" +"YARD is a documentation generation tool for the Ruby programming language.\n" +"It enables the user to generate consistent, usable documentation that can " +"be\n" +"exported to a number of formats very easily, and also supports extending " +"for\n" +"custom Ruby constructs such as custom class level definitions. Below is a\n" +"summary of some of YARD's notable features." +msgstr "" +"YARDはプログミング言語Rubyのドキュメント生成ツールである。\n" +"ユーザーが一貫性のあるドキュメント作成を可能にし、\n" +"いくつかの書式へ簡単にエキスポートできる。\n" +"又、カスタム定義によってRubyのカスタム構文用に\n" +"拡張することをサポートもする。\n" +"下はYARDの著名な機能の要約となる。" + +#: ../README.md:24 +msgid "" +"Feature List\n" +"------------" +msgstr "" +"機能リスト\n" +"------------" + +#: ../README.md:27 +msgid "" +"**1. RDoc/SimpleMarkup Formatting Compatibility**: YARD is made to be " +"compatible\n" +"with RDoc formatting. In fact, YARD does no processing on RDoc " +"documentation\n" +"strings, and leaves this up to the output generation tool to decide how to\n" +"render the documentation." +msgstr "" +"** 1. RDoc/SimpleMarkup書式との両立**: YARDはRDocの書式と両立する。\n" +"実際には、YARDはRDocドキュメント文字列の処理を行わない。\n" +"それは、後でドキュメント作成を表示する方法を選択する為、\n" +"その文字列を残している。" + +#: ../README.md:32 +msgid "" +"**2. Yardoc Meta-tag Formatting Like Python, Java, Objective-C and other " +"languages**:\n" +"YARD uses a '@tag' style definition syntax for meta tags alongside regular " +"code\n" +"documentation. These tags should be able to happily sit side by side RDoc " +"formatted\n" +"documentation, but provide a much more consistent and usable way to " +"describe\n" +"important information about objects, such as what parameters they take and " +"what types\n" +"they are expected to be, what type a method should return, what exceptions " +"it can\n" +"raise, if it is deprecated, etc.. It also allows information to be better " +"(and more\n" +"consistently) organized during the output generation phase. You can find a " +"list\n" +"of tags in the {file:docs/Tags.md#taglist Tags.md} file." +msgstr "" +"** 2. Python, Java, Objective-Cや他の言語のようなYardocのメタタグフォーマット **:\n" +"YARDは通常のコードのドキュメントの側にメタタグ用の'@tag'スタイルの定義構文を使う\n" +"これらのタグは幸いなことにRDoc形式にフォーマットされたドキュメントと並んで配置する事ができる\n" +"しかしオブジェクトについて重要な情報を提供する為に更に一貫して便利な方法を提供する。\n" +"それらの何らかのパラメーターとそれらの何らかの期待される型を取得するには、\n" +"どの型のメソッドを返さなければならないか、\n" +"どの例外を上げることができるか、\n" +"もしそれが重複した場合は,, etc..\n" +"それは出力生成段階の間によりよく(そして一貫して)整理された情報を受け入れる\n" +"{file:docs/Tags.md#taglist Tags.md} ファイルでタグのリストについて紹介している。" + +#: ../README.md:42 +msgid "" +"YARD also supports an optional \"types\" declarations for certain tags.\n" +"This allows the developer to document type signatures for ruby methods and\n" +"parameters in a non intrusive but helpful and consistent manner. Instead of\n" +"describing this data in the body of the description, a developer may " +"formally\n" +"declare the parameter or return type(s) in a single line. Consider the\n" +"following method documented with YARD formatting:" +msgstr "" +"YARDは特定のタグを用い省略可能な\"型\"の宣言をサポートもする。\n" +"これにより開発者はRubyメソッド用や、\n" +"煩わしくなく、しかし役に立つパラメータや、\n" +"一貫性のある形式を型の用法として記述可能になる。\n" +"説明の中にこのデータを記述する代わりに、\n" +"開発者は、1つの行の中でパラメータやリターンタイプを形式的に宣言できる。\n" +"YARDの書式を使用した次のメソッドの記述を考えてみる。" + +#: ../README.md:49 +msgid "" +" # Reverses the contents of a String or IO object.\n" +" #\n" +" # @param [String, #read] contents the contents to reverse\n" +" # @return [String] the contents reversed lexically\n" +" def reverse(contents)\n" +" contents = contents.read if respond_to? :read\n" +" contents.reverse\n" +" end" +msgstr "" +" # 文字列やIOオブジェクトの内容を逆にする\n" +" #\n" +" # @param [String, #read] 逆にするためのコンテンツを入れる\n" +" # @return [String] 逆になった単語のコンテンツ\n" +" def reverse(contents)\n" +" contents = contents.read if respond_to? :read\n" +" contents.reverse\n" +" end" + +#: ../README.md:58 +msgid "" +"With the above @param tag, we learn that the contents parameter can either " +"be\n" +"a String or any object that responds to the 'read' method, which is more\n" +"powerful than the textual description, which says it should be an IO " +"object.\n" +"This also informs the developer that they should expect to receive a String\n" +"object returned by the method, and although this may be obvious for a\n" +"'reverse' method, it becomes very useful when the method name may not be as\n" +"descriptive." +msgstr "" +"上記の@paramタグによって、contentsのパラメータが\n" +"Stringまたは何らかのオブジェクトのいずれかを\n" +"'read'メソッドに返すことが分かる。\n" +"それは原文の説明よりももっと強力な\n" +"IOオブジェクトになると言える。\n" +"これは開発者達がメソッドによって返された、\n" +"Stringオブジェクトを受け取ることを期待することや、\n" +"この場合は\"reverse\"メソッドの目的が明らかとはいえ、\n" +"メソッド名が説明を含んでいない時にとても便利という事を\n" +"意味している。" + +#: ../README.md:66 +msgid "" +"**3. Custom Constructs and Extensibility of YARD**: YARD is designed to be\n" +"extended and customized by plugins. Take for instance the scenario where " +"you\n" +"need to document the following code:" +msgstr "" +"** 3. YARDのカスタムコンストラクタと拡張性 **: YARDは\n" +"プラグインによって拡張やカスタマイズする為に設計されている。\n" +"例えばあなたが次のコードのドキュメントの場所を必要とするシナリオを考える。" + +#: ../README.md:70 +msgid "" +" class List\n" +" # Sets the publisher name for the list.\n" +" cattr_accessor :publisher\n" +" end" +msgstr "" +" class List\n" +" # リスト用の発行者名を設定する\n" +" cattr_accessor :publisher\n" +" end" + +#: ../README.md:75 +msgid "" +"This custom declaration provides dynamically generated code that is hard for " +"a\n" +"documentation tool to properly document without help from the developer. To\n" +"ease the pains of manually documenting the procedure, YARD can be extended " +"by\n" +"the developer to handle the `cattr_accessor` construct and automatically " +"create\n" +"an attribute on the class with the associated documentation. This makes\n" +"documenting external API's, especially dynamic ones, a lot more consistent " +"for\n" +"consumption by the users." +msgstr "" +"このカスタム宣言は動的に生成されるコードを提供する。\n" +"それは開発者からの助けなしで正確なドキュメントを\n" +"ドキュメント作成ツールで作るのが困難な為である。\n" +"手書きでドキュメント作成する苦労が楽になるように、\n" +"YARDは `cattr_accessor` コンストラクタを操作する。\n" +"又、関連するドキュメントとクラスの属性を自動的に生成するように、\n" +"開発者によって拡張できる。\n" +"この拡張によって、ユーザーによって使用する多くの一貫性のある動的な\n" +"ドキュメント作成の外部のAPIを作れる。" + +#: ../README.md:83 +msgid "" +"YARD is also designed for extensibility everywhere else, allowing you to " +"add\n" +"support for new programming languages, new data structures and even where/" +"how\n" +"data is stored." +msgstr "" +"YARDはどこでも拡張できるように設計されている。\n" +"新しいプログラム言語や新しいデータ構造や\n" +"どこにどのようにデータを格納するかといったサポートを追加できる。" + +#: ../README.md:87 +msgid "" +"**4. Raw Data Output**: YARD also outputs documented objects as raw data " +"(the\n" +"dumped Namespace) which can be reloaded to do generation at a later date, " +"or\n" +"even auditing on code. This means that any developer can use the raw data " +"to\n" +"perform output generation for any custom format, such as YAML, for " +"instance.\n" +"While YARD plans to support XHTML style documentation output as well as\n" +"command line (text based) and possibly XML, this may still be useful for " +"those\n" +"who would like to reap the benefits of YARD's processing in other forms, " +"such\n" +"as throwing all the documentation into a database. Another useful way of\n" +"exploiting this raw data format would be to write tools that can auto " +"generate\n" +"test cases, for example, or show possible unhandled exceptions in code." +msgstr "" +"**4. 未加工データの出力**: YARDはオブジェクトのドキュメントを未加工のままデー" +"タ(ダンプした名前空間)出力する。後で生成する時や、コードを等しく調査する時は" +"再ロードされる。\n" +"つまり、開発者の誰もが何らかのカスタム書式のように出力生成を実行する為に、未" +"加工データを使う。例えば、YAMLのように。\n" +"YARDはXHTMLスタイルドキュメント出力もコマンドライン(テキストベース)も\n" +"(もしかしたらXMLも)サポートを計画しているので、\n" +"全てのドキュメントをデータベースへ投げておけば、\n" +"将来、他の型でもYARDの処理の恩恵を受けようと考えている人にとっては、\n" +"役立つかもしれない。\n" +"この未加工データの書式を利用する他の有用な方法として、\n" +"自動生成テストケースができるツールを書く為や、\n" +"コードの未処理例外を明らかにすること、などがある。" + +#: ../README.md:98 +msgid "" +"**5. Local Documentation Server**: YARD can serve documentation for " +"projects\n" +"or installed gems (similar to `gem server`) with the added benefit of " +"dynamic\n" +"searching, as well as live reloading. Using the live reload feature, you " +"can\n" +"document your code and immediately preview the results by refreshing the " +"page;\n" +"YARD will do all the work in re-generating the HTML. This makes writing\n" +"documentation a much faster process." +msgstr "" +"**5. ローカルドキュメントサーバー**:\n" +"YARDは動的な検索も再ロードの利点も用い\n" +"プロジェクトやインストール済みのgem( `gem server` と同様)用のドキュメント作成を提供する。\n" +"live reload機能によって,あなたのコードを記述したり\n" +"ページをリフレーシュする事によって結果をすぐにプレビューできる\n" +"YARDはHTML再生成の全ての仕事をする\n" +"これによりドキュメントの作成をより高速のプロセスで行える。" + +#: ../README.md:106 +msgid "## Installing" +msgstr "## インストール" + +#: ../README.md:108 +msgid "To install YARD, use the following command:" +msgstr "YARDをインストールする為に次のコマンドを使う。" + +#: ../README.md:110 +msgid " $ gem install yard" +msgstr " $ gem install yard" + +#: ../README.md:112 +msgid "(Add `sudo` if you're installing under a POSIX system as root)" +msgstr "" +"(もしPOSIXシステムのルート下でインストールしている場合、sudoを追加する)" + +#: ../README.md:114 +msgid "" +"Alternatively, if you've checked the source out directly, you can call\n" +"`rake install` from the root project directory." +msgstr "" +"上のコマンドの代わりに、もしソースを直接チェックアウトしたならば、\n" +"あなたはプロジェクトのルートディレクトリから `rake install` を行う事ができる" + +#: ../README.md:117 +msgid "" +"**Important Note for Debian/Ubuntu users:** there's a possible chance your " +"Ruby\n" +"install lacks RDoc, which is occasionally used by YARD to convert markup to " +"HTML.\n" +"If running `which rdoc` turns up empty, install RDoc by issuing:" +msgstr "" +"**Debian/Ubuntuユーザーへの重要な注意:**\n" +"RubyがRDocなしでinstallされる可能性がある。\n" +"RDocはYARDによってマークアップをHTMLに変換する為に時々使われるので、\n" +"もし `which rdoc` コマンドでパスが存在しない場合は、次のコマンドでRDocをインストールする。" + +#: ../README.md:121 +msgid " $ sudo apt-get install rdoc" +msgstr " $ sudo apt-get install rdoc" + +# YARD::CLI::Yardoc +#: ../README.md:124 +msgid "## Usage" +msgstr "## 使用法" + +#: ../README.md:126 +msgid "" +"There are a couple of ways to use YARD. The first is via command-line, and " +"the\n" +"second is the Rake task." +msgstr "" +"それらYARDを使うにはいくつかの方法がある。\n" +"最初はコマンドライン経由で、もうひとつはRake taskという方法がある。" + +#: ../README.md:129 +msgid "**1. yard Command-line Tool**" +msgstr "**1. yardのコマンドラインツール**" + +#: ../README.md:131 +msgid "" +"YARD comes packaged with a executable named `yard` which can control the " +"many\n" +"functions of YARD, including generating documentation, graphs running the\n" +"YARD server, and so on. To view a list of available YARD commands, type:" +msgstr "" +"YARDは実行可能な `yard` という名前と一緒にパッケージが入っている。\n" +"ドキュメントの生成や、グラフ、YARDサーバーを起動などを含み\n" +"たくさんの機能を制御できる。\n" +"利用可能なYARDのコマンドの一覧を表示するには、以下をタイプする。" + +#: ../README.md:135 +msgid " $ yard --help" +msgstr " $ yard --help" + +#: ../README.md:137 +msgid "" +"Plugins can also add commands to the `yard` executable to provide extra\n" +"functionality." +msgstr "プラグインは追加の機能を提供する為に実行可能な `yard` コマンドを追加できる。" + +#: ../README.md:140 +msgid "### Generating Documentation" +msgstr "### ドキュメントを生成する" + +#: ../README.md:142 +msgid "" +"The `yardoc` executable is a shortcut for `yard doc`." +msgstr "The `yardoc` executable is a shortcut for `yard doc`." + +#: ../README.md:144 +msgid "" +"The most common command you will probably use is `yard doc`, or `yardoc`. " +"You\n" +"can type `yardoc --help` to see the options that YARD provides, but the\n" +"easiest way to generate docs for your code is to simply type `yardoc` in " +"your\n" +"project root. This will assume your files are\n" +"located in the `lib/` directory. If they are located elsewhere, you can " +"specify\n" +"paths and globs from the commandline via:" +msgstr "" +"恐らく最も使用される一般的なコマンドは `yard doc` 、または `yardoc` となるだろう。\n" +"YARDが提供するオプションを見るには `yardoc --help` をタイプする事で表示できる。\n" +"でも、ドキュメントを生成するのに最も簡単な方法は、\n" +"あなたのプロジェクトのルートで `yardoc` をタイプする方法である。\n" +"これはあなたのファイルが `lib/` ディレクトリの中で示されるとみなす。\n" +"もし他の場所にあるなら、次のようにコマンドラインからパスとglobを指定する:" + +#: ../README.md:151 +msgid " $ yardoc 'lib/**/*.rb' 'app/**/*.rb' ...etc..." +msgstr " $ yardoc 'lib/**/*.rb' 'app/**/*.rb' ...etc..." + +#: ../README.md:153 +msgid "" +"The tool will generate a `.yardoc` file which will store the cached " +"database\n" +"of your source code and documentation. If you want to re-generate your docs\n" +"with another template you can simply use the `--use-cache` (or -c)\n" +"option to speed up the generation process by skipping source parsing." +msgstr "" +"このツールは `.yardoc` ファイルを生成する。それは\n" +"あなたのソースコードとドキュメントをキャッシュしたデータベースを格納する。\n" +"もしあなたが他のテンプレートと共にドキュメントを再生成したいなら、\n" +"単に `--use-cache` (or -c) オプションを使えばよい。\n" +"ソースの解析をスキップする事によって生成プロセスをスピードアップする。" + +#: ../README.md:158 +msgid "" +"YARD will by default only document code in your public visibility. You can\n" +"document your protected and private code by adding `--protected` or\n" +"`--private` to the option switches. In addition, you can add `--no-private`\n" +"to also ignore any object that has the `@private` meta-tag. This is similar\n" +"to RDoc's \":nodoc:\" behaviour, though the distinction is important. RDoc\n" +"implies that the object with :nodoc: would not be documented, whereas\n" +"YARD still recommends documenting private objects for the private API (for\n" +"maintainer/developer consumption)." +msgstr "" +"YARDはデフォルトでpublicな可視性の中のコードだけを記述する。\n" +"`--protected` や `--private` オプション引数の追加によって\n" +"protectedとprivateなコードを記録できる。\n" +"さらに、 `--no-private` の追加によって、\n" +"`@private` メタタグを持った何らかのオブジェクトの無視もできる。\n" +"区別は重要であるものの、これはRDocの\":nodoc:\"の挙動と似ている。\n" +"RDocはオブジェクトと共に:nodoc:は記録されないことを暗示する。\n" +"ところが、YARDは今もなおprivate APIの為に\n" +"privateなオブジェクトのドキュメント作成を\n" +"推奨する。(メンテナーや開発者が利用する為に)" + +#: ../README.md:167 +msgid "" +"You can also add extra informative files (README, LICENSE) by separating\n" +"the globs and the filenames with '-'." +msgstr "" +"globとファイル名と共に'-'で区切ることによって、\n" +"追加の情報ファイル(README, LICENSE)を追加もできる。" + +#: ../README.md:170 +msgid " $ yardoc 'app/**/*.rb' - README LICENSE FAQ" +msgstr " $ yardoc 'app/**/*.rb' - README LICENSE FAQ" + +#: ../README.md:172 +msgid "" +"If no globs precede the '-' argument, the default glob (`lib/**/*.rb`) is\n" +"used:" +msgstr "もしglob無しで、'-'引数が先行する場合、デフォルトのglobは( `lib/**/*.rb` )を使う。" + +#: ../README.md:175 +msgid " $ yardoc - README LICENSE FAQ" +msgstr " $ yardoc - README LICENSE FAQ" + +#: ../README.md:177 +msgid "" +"Note that the README file can be specified with its own `--readme` switch." +msgstr "" +"次の事に留意する。READMEファイルは自身の`--readme`引数と共に指定される。" + +#: ../README.md:179 +msgid "" +"You can also add a `.yardopts` file to your project directory which lists\n" +"the switches separated by whitespace (newlines or space) to pass to yardoc\n" +"whenever it is run. A full overview of the `.yardopts` file can be found in\n" +"{YARD::CLI::Yardoc}." +msgstr "" +"あなたはあなたのプロジェクトディレクトリに `.yardopts` を追加することもできる。\n" +"これは起動する時に毎回、スペースによって区切られた引数のリストをyardocに渡す。\n" +" `.yardopts` ファイルの全ての概要は、 {YARD::CLI::Yardoc} で見つけることができる。" + +#: ../README.md:184 +msgid "### Queries" +msgstr "### クエリー" + +#: ../README.md:186 +msgid "" +"The `yardoc` tool also supports a `--query` argument to only include " +"objects\n" +"that match a certain data or meta-data query. The query syntax is Ruby, " +"though\n" +"a few shortcuts are available. For instance, to document only objects that " +"have\n" +"an \"@api\" tag with the value \"public\", all of the following syntaxes " +"would give\n" +"the same result:" +msgstr "" +"`yardoc` ツールは、 `--query` 引数をサポートもする。\n" +"これはマッチするいくらかのデータやメタデータクエリーのオブジェクトだけ含んでいる。\n" +"クエリーの構文はRubyで、いくつかのショートカットが利用可能。\n" +"例えば、\"@api\"タグと\"public\"な値を持つオブジェクトだけを記述するには、\n" +"次のようになる。(全て同じ結果となる。)" + +#: ../README.md:192 +msgid "" +" --query '@api.text == \"public\"'\n" +" --query 'object.has_tag?(:api) && object.tag(:api).text == \"public\"'\n" +" --query 'has_tag?(:api) && tag(:api).text == \"public\"'" +msgstr "" +" --query '@api.text == \"public\"'\n" +" --query 'object.has_tag?(:api) && object.tag(:api).text == \"public\"'\n" +" --query 'has_tag?(:api) && tag(:api).text == \"public\"'" + +#: ../README.md:196 +msgid "" +"Note that the \"@tag\" syntax returns the first tag named \"tag\" on the " +"object.\n" +"To return the array of all tags named \"tag\", use \"@@tag\"." +msgstr "" +"次の事に留意する。\n" +"\"@tag\"構文は、オブジェクトの最初に\"tag\"と名付けられたタグを返す。\n" +"全ての\"tag\"と名付けたタグの配列を返すには、\"@@tag\"を使う。" + +#: ../README.md:199 +msgid "" +"Multiple `--query` arguments are allowed in the command line parameters. " +"The\n" +"following two lines both check for the existence of a return and param tag:" +msgstr "" +"複数の`--query`引数はコマンドライン引数の中で許可される。\n" +"次の2行は両方とも実際の返り値とparamタグをチェックする。" + +#: ../README.md:202 +msgid "" +" --query '@return' --query '@param'\n" +" --query '@return && @param'" +msgstr "" +" --query '@return' --query '@param'\n" +" --query '@return && @param'" + +#: ../README.md:205 +msgid "" +"For more information about the query syntax, see the {YARD::Verifier} class." +msgstr "さらなるquery構文の情報については、 {YARD::Verifier} クラスを参照する。" + +#: ../README.md:207 +msgid "**2. Rake Task**" +msgstr "**2. Rake Task**" + +#: ../README.md:209 +msgid "" +"The second most obvious is to generate docs via a Rake task. You can do this " +"by\n" +"adding the following to your `Rakefile`:" +msgstr "" +"もう一つの方法として、Rakeのタスクを介してドキュメントを生成する。\n" +"あなたの `Rakefile` に次の内容を追加することによって作成できる:" + +#: ../README.md:212 +msgid "" +" YARD::Rake::YardocTask.new do |t|\n" +" t.files = ['lib/**/*.rb', OTHER_PATHS] # optional\n" +" t.options = ['--any', '--extra', '--opts'] # optional\n" +" end" +msgstr "" +" YARD::Rake::YardocTask.new do |t|\n" +" t.files = ['lib/**/*.rb', OTHER_PATHS] # optional\n" +" t.options = ['--any', '--extra', '--opts'] # optional\n" +" end" + +#: ../README.md:217 +msgid "" +"both the `files` and `options` settings are optional. `files` will default " +"to\n" +"`lib/**/*.rb` and `options` will represents any options you might want\n" +"to add. Again, a full list of options is available by typing `yardoc --" +"help`\n" +"in a shell. You can also override the options at the Rake command-line with " +"the\n" +"OPTS environment variable:" +msgstr "" +"`files` も `options` の設定も、省略可能。\n" +"`files` は `lib/**/*.rb` にデフォルトで設定される、\n" +"そして `options` は追加したいオプションを表している。\n" +"さらに、オプションの全てのリストは、\n" +"シェルで `yardoc --help` を\n" +"タイプすることによって利用可能。又、\n" +"RakeコマンドラインとOPTS環境変数でoptionsを上書きできる。" + +#: ../README.md:223 +msgid " $ rake yard OPTS='--any --extra --opts'" +msgstr " $ rake yard OPTS='--any --extra --opts'" + +#: ../README.md:225 +msgid "**3. `yri` RI Implementation**" +msgstr "**3. `yri` RIの実装**" + +#: ../README.md:227 +msgid "" +"The yri binary will use the cached .yardoc database to give you quick ri-" +"style\n" +"access to your documentation. It's way faster than ri but currently does " +"not\n" +"work with the stdlib or core Ruby libraries, only the active project. " +"Example:" +msgstr "" +"yriコマンドはドキュメントをri-styleで速くアクセスする為に、\n" +"キャッシュした.yardocデータベースを使うだろう。\n" +"これはriよりも速い方法だが、しかし、今の所、\n" +"stdlibかコアRubyライブラリ、アクティブプロジェクトだけでしか\n" +"動かない。\n" +"使用例:" + +#: ../README.md:231 +msgid "" +" $ yri YARD::Handlers::Base#register\n" +" $ yri File.relative_path" +msgstr "" +" $ yri YARD::Handlers::Base#register\n" +" $ yri File.relative_path" + +#: ../README.md:234 +msgid "" +"Note that class methods must not be referred to with the \"::\" namespace\n" +"separator. Only modules, classes and constants should use \"::\"." +msgstr "" +"次の事に留意する。\n" +"クラスメソッドは、\"::\"ネームスペース区切りとともに参照されるべきではない。\n" +"モジュールだけクラスと定数は\"::\"を使うべきである。" + +#: ../README.md:237 +msgid "" +"You can also do lookups on any installed gems. Just make sure to build the\n" +".yardoc databases for installed gems with:" +msgstr "" +"あなたはインストール済みの任意のgemを検索できる。\n" +"以下はインストール済みのgemとともに.yardocデータベースをビルドする。" + +#: ../README.md:240 +msgid " $ sudo yard gems" +msgstr " $ sudo yard gems" + +#: ../README.md:242 +msgid "" +"If you don't have sudo access, it will write these files to your `~/.yard`\n" +"directory. `yri` will also cache lookups there." +msgstr "" +"sudo権限をもっていない場合は、あなたの `~/.yard` ディレクトリにこれらを記述する。\n" +" `yri` はそれらをcache検索する。" + +#: ../README.md:245 +msgid "**4. `yard server` Documentation Server**" +msgstr "**4. `yard server` ドキュメント作成サーバー**" + +#: ../README.md:247 +msgid "" +"The `yard server` command serves documentation for a local project or all " +"installed\n" +"RubyGems. To serve documentation for a project you are working on, simply " +"run:" +msgstr "" +"`yard server` コマンドは、\n" +"ローカルプロジェクトやインストール済みのRubyGems用の\n" +"ドキュメント作成を提供する。\n" +"ドキュメント作成を提供するには、\n" +"あなたが取り組んでいるプロジェクト上で次のコマンドを単に実行する。" + +#: ../README.md:250 ../docs/WhatsNew.md:542 +msgid " $ yard server" +msgstr " $ yard server" + +#: ../README.md:252 +msgid "" +"And the project inside the current directory will be parsed (if the source " +"has\n" +"not yet been scanned by YARD) and served at [http://localhost:8808](http://" +"localhost:8808)." +msgstr "" +"上のコマンドによってプロジェクトの現在のディレクトリ内部は解析される。\n" +"(YARDによってスキャンされたにもかかわらずソースがなかった場合)\n" +"そして [http://localhost:8808](http://localhost:8808) で提供される。" + +#: ../README.md:255 +msgid "### Live Reloading" +msgstr "### Live Reloading" + +#: ../README.md:257 +msgid "" +"If you want to serve documentation on a project while you document it so " +"that\n" +"you can preview the results, simply pass `--reload` (`-r`) to the above " +"command\n" +"and YARD will reload any changed files on each request. This will allow you " +"to\n" +"change any documentation in the source and refresh to see the new contents." +msgstr "" +"結果をプレビューできるようにドキュメント化しながら、\n" +"プロジェクトのドキュメント作成を提供したいなら、\n" +"上のコマンドに単純に `--reload` (`-r`)を渡す。\n" +"YARDはそれぞれのリクエストのどれかの変更があったファイルを再ロードする。\n" +"これはあなたがソースの中のドキュメントの変更や\n" +"新しいコンテンツを見るのにリフレッシュを可能にする。" + +#: ../README.md:262 +msgid "### Serving Gems" +msgstr "### Serving Gems" + +#: ../README.md:264 +msgid "To serve documentation for all installed gems, call:" +msgstr "" +"全てのインストール済みのgemのドキュメント作成を提供するには、\n" +"次のコマンドを入力する。" + +#: ../README.md:266 ../docs/WhatsNew.md:562 +msgid " $ yard server --gems" +msgstr " $ yard server --gems" + +#: ../README.md:268 +msgid "" +"This will also automatically build documentation for any gems that have not\n" +"been previously scanned. Note that in this case there will be a slight " +"delay\n" +"between the first request of a newly parsed gem." +msgstr "" +"これは自動的に以前にスキャンされていないあらゆるgemのドキュメントをビルドす" +"る。\n" +"次の事に留意する。\n" +"この場合、新たに解析されたgemの最初の要求の間にわずかな遅延が発生する。" + +#: ../README.md:273 +msgid "**5. `yard graph` Graphviz Generator**" +msgstr "**5. `yard graph` はGraphvizのジェネレーター**" + +#: ../README.md:275 +msgid "" +"You can use `yard graph` to generate dot graphs of your code. This, of " +"course,\n" +"requires [Graphviz](http://www.graphviz.org) and the `dot` binary. By " +"default\n" +"this will generate a graph of the classes and modules in the best UML2 " +"notation\n" +"that Graphviz can support, but without any methods listed. With the `--" +"full`\n" +"option, methods and attributes will be listed. There is also a `--" +"dependencies`\n" +"option to show mixin inclusions. You can output to stdout or a file, or pipe " +"directly\n" +"to `dot`. The same public, protected and private visibility rules apply to " +"`yard graph`.\n" +"More options can be seen by typing `yard graph --help`, but here is an " +"example:" +msgstr "" +"あなたのコードの図を生成する為に `yard graph` を利用できる。\n" +"これにはもちろん、[Graphviz](http://www.graphviz.org)と `dot` が必要となる。\n" +"デフォルトでこれは、Graphvizのサポートできる最高のURL2表記で\n" +"クラスやモジュールの図を生成する。しかし、記載されたメソッドは生成しない。\n" +"`-- full` オプションを用いメソッドと属性が記述される。\n" +"mixinで含んでいるものを一覧する為に `--dependencies` オプションもある。\n" +"標準出力やファイルに出力したり、また `dot` に直接パイプできる。\n" +"同じpublic,protectedとprivateの可視性規則は、 `yard-graph` に適用される。\n" +"詳細なオプションは、 `yard-graph --help` とタイプすることによって見ることができる。\n" +"次に例がある:" + +#: ../README.md:284 +msgid " $ yard graph --protected --full --dependencies" +msgstr " $ yard graph --protected --full --dependencies" + +#: ../README.md:287 +msgid "## Changelog" +msgstr "## Changelog" + +#: ../README.md:289 +msgid "" +"- **June.9.12**: 0.8.2.1 release\n" +" - Fix a set of regressions in yard server search and dynamic generation" +msgstr "" +"- **June.9.12**: 0.8.2.1 release\n" +" - Fix a set of regressions in yard server search and dynamic generation" + +#: ../README.md:292 +msgid "" +"- **June.7.12**: 0.8.2 release\n" +" - Added progress style output in tty terminals\n" +" - Embedded mixins should ignore methods defined on module (#539)\n" +" - Fixed permalinks for embedded mixins in `yard server` (#540)\n" +" - Improve parsing in CRuby code (#543)\n" +" - Ensure Registry.resolve picks module when parsing mixins (#545)\n" +" - Fixed regression that caused various commands to not show output " +"(#548)\n" +" - Respect current visibility when parsing class conditions (#551)" +msgstr "" +"- **June.7.12**: 0.8.2 release\n" +" - Added progress style output in tty terminals\n" +" - Embedded mixins should ignore methods defined on module (#539)\n" +" - Fixed permalinks for embedded mixins in `yard server` (#540)\n" +" - Improve parsing in CRuby code (#543)\n" +" - Ensure Registry.resolve picks module when parsing mixins (#545)\n" +" - Fixed regression that caused various commands to not show output (#548)\n" +" - Respect current visibility when parsing class conditions (#551)" + +#: ../README.md:301 +msgid "" +"- **May.2.12**: 0.8.1 release\n" +" - Added `--[no-]api` switch to generate docs for API sets (see {file:" +"docs/WhatsNew.md} for details) (#532)\n" +" - The `yard list` command now uses cache by default (#533)\n" +" - Fix `yardoc` generating incorrectly named method list file (#528)\n" +" - Fix HTML output occasionally showing trailing mdash on options list " +"(#522)" +msgstr "" +"- **May.2.12**: 0.8.1 release\n" +" - Added `--[no-]api` switch to generate docs for API sets (see {file:docs/WhatsNew.md} for details) (#532)\n" +" - The `yard list` command now uses cache by default (#533)\n" +" - Fix `yardoc` generating incorrectly named method list file (#528)\n" +" - Fix HTML output occasionally showing trailing mdash on options list (#522)" + +#: ../README.md:307 +msgid "" +"- **April.30.12**: 0.8.0 release\n" +" - See {file:docs/WhatsNew.md} for a list of added features\n" +" - Over 20 bug fixes:\n" +" - Properly filter hidden setter/getter attributes (#394)\n" +" - Fix test failures in Linux environments (#397, #472, #473, #512, " +"#513)\n" +" - Fix attribute inheritance and @private (#432)\n" +" - Fix attribute parsing (#435)\n" +" - Allow aliases for attributes (#436)\n" +" - Fix namespace fetching in `handle_alias()` (#437)\n" +" - Fix overwritten attributes marked as inherited (#442)\n" +" - Fix documenting constants defined from C code with `rb_define_const()" +"` (#443)\n" +" - Do not escape snippets twice (#445)\n" +" - Ajax method/class search should not fire when a non-printable " +"character is pressed (#446)\n" +" - Fix yard server crashing when RDoc is not installed (#456)\n" +" - Fix tags ignored when `(see #foo)` is used (#457)\n" +" - Fix three \"Returns\" for two `@overload` tags (#458)\n" +" - Do not auto-detect DSL methods as method objects if parameter name " +"is not a valid method name (#464)\n" +" - Fix attaching of macros to Object (#465)\n" +" - Fix handling of `%w()` source in `[]/[]=` parsed context. (#461, " +"pull in #468)\n" +" - Don't add default `@return` if `@overload` has `@return`. (#458, " +"pull in #469)\n" +" - Don't discard tags by (see ...). (#457, pull in #470)\n" +" - Fix constants listed as inherited when overwritten (#474)\n" +" - Fix `yardoc --asset` behaving differently on first and subsequent " +"calls. (#477)\n" +" - `!!!lang` code blocks should set the lang in `
    `'s class. (#478, "
    +"#479)\n"
    +"      - Fix \"File List\" search tab error. (#502)\n"
    +"      - Fix search bar not redirecting to method page. (#509)\n"
    +"      - Fix server returning exception message bodies as String (#518)"
    +msgstr ""
    +"- **April.30.12**: 0.8.0 release\n"
    +"    - See {file:docs/WhatsNew.md} for a list of added features\n"
    +"    - Over 20 bug fixes:\n"
    +"      - Properly filter hidden setter/getter attributes (#394)\n"
    +"      - Fix test failures in Linux environments (#397, #472, #473, #512, #513)\n"
    +"      - Fix attribute inheritance and @private (#432)\n"
    +"      - Fix attribute parsing (#435)\n"
    +"      - Allow aliases for attributes (#436)\n"
    +"      - Fix namespace fetching in `handle_alias()` (#437)\n"
    +"      - Fix overwritten attributes marked as inherited (#442)\n"
    +"      - Fix documenting constants defined from C code with `rb_define_const()` (#443)\n"
    +"      - Do not escape snippets twice (#445)\n"
    +"      - Ajax method/class search should not fire when a non-printable character is pressed (#446)\n"
    +"      - Fix yard server crashing when RDoc is not installed (#456)\n"
    +"      - Fix tags ignored when `(see #foo)` is used (#457)\n"
    +"      - Fix three \"Returns\" for two `@overload` tags (#458)\n"
    +"      - Do not auto-detect DSL methods as method objects if parameter name is not a valid method name (#464)\n"
    +"      - Fix attaching of macros to Object (#465)\n"
    +"      - Fix handling of `%w()` source in `[]/[]=` parsed context. (#461, pull in #468)\n"
    +"      - Don't add default `@return` if `@overload` has `@return`. (#458, pull in #469)\n"
    +"      - Don't discard tags by (see ...). (#457, pull in #470)\n"
    +"      - Fix constants listed as inherited when overwritten (#474)\n"
    +"      - Fix `yardoc --asset` behaving differently on first and subsequent calls. (#477)\n"
    +"      - `!!!lang` code blocks should set the lang in `
    `'s class. (#478, #479)\n"
    +"      - Fix \"File List\" search tab error. (#502)\n"
    +"      - Fix search bar not redirecting to method page. (#509)\n"
    +"      - Fix server returning exception message bodies as String (#518)"
    +
    +#: ../README.md:335
    +msgid ""
    +"- **January.31.12**: 0.7.5 release\n"
    +"    - Various minor bug fixes"
    +msgstr ""
    +"- **January.31.12**: 0.7.5 release\n"
    +"    - Various minor bug fixes"
    +
    +#: ../README.md:338
    +msgid ""
    +"- **December.2.11**: 0.7.4 release\n"
    +"    - Redcarpet is now the default Markdown formatting library. GFM now "
    +"works out-of-box (#404)\n"
    +"    - Fix server side searching for elements that are marked private (#420)\n"
    +"    - Add 'textile_strict' and 'pre' markup types, reorganize text and none "
    +"(#416)\n"
    +"    - Improve encoding line detection (#415)\n"
    +"    - Add support for `rb_define_alias` in CRuby code (#413)\n"
    +"    - Fix rendering of some keywords in source view (#410)\n"
    +"    - Add support for RDoc 3.10+ (#406, #407)\n"
    +"    - Fix typewriter text being processed in code blocks (#403)\n"
    +"    - Improve support for has_rdoc in RubyGems 1.8.x (#401)\n"
    +"    - See the {file:docs/WhatsNew.md} document for details on added features"
    +msgstr ""
    +"- **December.2.11**: 0.7.4 release\n"
    +"    - Redcarpet is now the default Markdown formatting library. GFM now works out-of-box (#404)\n"
    +"    - Fix server side searching for elements that are marked private (#420)\n"
    +"    - Add 'textile_strict' and 'pre' markup types, reorganize text and none (#416)\n"
    +"    - Improve encoding line detection (#415)\n"
    +"    - Add support for `rb_define_alias` in CRuby code (#413)\n"
    +"    - Fix rendering of some keywords in source view (#410)\n"
    +"    - Add support for RDoc 3.10+ (#406, #407)\n"
    +"    - Fix typewriter text being processed in code blocks (#403)\n"
    +"    - Improve support for has_rdoc in RubyGems 1.8.x (#401)\n"
    +"    - See the {file:docs/WhatsNew.md} document for details on added features"
    +
    +#: ../README.md:350
    +msgid ""
    +"- **October.15.11**: 0.7.3 release\n"
    +"    - Improve support for parsing under Ruby 1.9.2p290 and 1.9.3 (#365, "
    +"#370)\n"
    +"    - Add support for SWIG generated CRuby code (#369)\n"
    +"    - Add support for `rb_define_attr` calls in CRuby code (#362)\n"
    +"    - Handle file pointers in CRuby code (#358)"
    +msgstr ""
    +"- **October.15.11**: 0.7.3 release\n"
    +"    - Improve support for parsing under Ruby 1.9.2p290 and 1.9.3 (#365, #370)\n"
    +"    - Add support for SWIG generated CRuby code (#369)\n"
    +"    - Add support for `rb_define_attr` calls in CRuby code (#362)\n"
    +"    - Handle file pointers in CRuby code (#358)"
    +
    +#: ../README.md:356
    +msgid ""
    +"- **June.14.11**: 0.7.2 release\n"
    +"    - Fix `yard --help` not showing proper output\n"
    +"    - YARD now expands path to `.yardoc` file in daemon mode for server "
    +"(#328)\n"
    +"    - Fix `@overload` tag linking to wrong method (#330)\n"
    +"    - Fix incorrect return type when using `@macro` (#334)\n"
    +"    - YARD now requires 'thread' to support RubyGems 1.7+ (#338)\n"
    +"    - Fix bug in constant documentation when using `%w()` (#348)\n"
    +"    - Fix YARD style URL links when using autolinking markdown (#353)"
    +msgstr ""
    +"- **June.14.11**: 0.7.2 release\n"
    +"    - Fix `yard --help` not showing proper output\n"
    +"    - YARD now expands path to `.yardoc` file in daemon mode for server (#328)\n"
    +"    - Fix `@overload` tag linking to wrong method (#330)\n"
    +"    - Fix incorrect return type when using `@macro` (#334)\n"
    +"    - YARD now requires 'thread' to support RubyGems 1.7+ (#338)\n"
    +"    - Fix bug in constant documentation when using `%w()` (#348)\n"
    +"    - Fix YARD style URL links when using autolinking markdown (#353)"
    +
    +#: ../README.md:365
    +msgid ""
    +"- **May.18.11**: 0.7.1 release\n"
    +"    - Fixes a bug in `yard server` not displaying class list properly."
    +msgstr ""
    +"- **May.18.11**: 0.7.1 release\n"
    +"    - Fixes a bug in `yard server` not displaying class list properly."
    +
    +#: ../README.md:368
    +msgid ""
    +"- **May.17.11**: 0.7.0 release\n"
    +"    - See the {file:docs/WhatsNew.md} document for details on added "
    +"features\n"
    +"    - Make sure that Docstring#line_range is filled when possible (#243)\n"
    +"    - Set #verifier in YardocTask (#282)\n"
    +"    - Parse BOM in UTF-8 files (#288)\n"
    +"    - Fix instance attributes not showing up in method list (#302)\n"
    +"    - Fix rendering of %w() literals in constants (#306)\n"
    +"    - Ignore keyboard shortcuts when an input is active (#312)\n"
    +"    - And more..."
    +msgstr ""
    +"- **May.17.11**: 0.7.0 release\n"
    +"    - See the {file:docs/WhatsNew.md} document for details on added features\n"
    +"    - Make sure that Docstring#line_range is filled when possible (#243)\n"
    +"    - Set #verifier in YardocTask (#282)\n"
    +"    - Parse BOM in UTF-8 files (#288)\n"
    +"    - Fix instance attributes not showing up in method list (#302)\n"
    +"    - Fix rendering of %w() literals in constants (#306)\n"
    +"    - Ignore keyboard shortcuts when an input is active (#312)\n"
    +"    - And more..."
    +
    +#: ../README.md:378
    +msgid ""
    +"- **April.14.11**: 0.6.8 release\n"
    +"    - Fix regression in RDoc 1.x markup loading\n"
    +"    - Fix regression in loading of markup libraries for `yard server`"
    +msgstr ""
    +"- **April.14.11**: 0.6.8 release\n"
    +"    - Fix regression in RDoc 1.x markup loading\n"
    +"    - Fix regression in loading of markup libraries for `yard server`"
    +
    +#: ../README.md:382
    +msgid ""
    +"- **April.6.11**: 0.6.7 release\n"
    +"    - Fix has_rdoc gem specification issue with new RubyGems plugin API "
    +"(oops!)"
    +msgstr ""
    +"- **April.6.11**: 0.6.7 release\n"
    +"    - Fix has_rdoc gem specification issue with new RubyGems plugin API (oops!)"
    +
    +#: ../README.md:385
    +msgid ""
    +"- **April.6.11**: 0.6.6 release\n"
    +"    - Fix error message when RDoc is not present (#270)\n"
    +"    - Add markup type 'none' to perform basic HTML translation (fallback "
    +"when RDoc is not present)\n"
    +"    - Add support for RubyGems 1.7.x (#272)\n"
    +"    - Fix rendering of `{url description}` syntax when description contains "
    +"newline"
    +msgstr ""
    +"- **April.6.11**: 0.6.6 release\n"
    +"    - Fix error message when RDoc is not present (#270)\n"
    +"    - Add markup type 'none' to perform basic HTML translation (fallback when RDoc is not present)\n"
    +"    - Add support for RubyGems 1.7.x (#272)\n"
    +"    - Fix rendering of `{url description}` syntax when description contains newline"
    +
    +#: ../README.md:391
    +msgid ""
    +"- **March.13.11**: 0.6.5 release\n"
    +"    - Support `ripper` gem in Ruby 1.8.7\n"
    +"    - Upgrade jQuery to 1.5.1\n"
    +"    - Fix handling of alias statements with quoted symbols (#262)\n"
    +"    - Add CSS styles (#260)\n"
    +"    - Unhandled exception in YARD::Handlers::Ruby::MixinHandler indexing "
    +"documentation for eventmachine (#248)\n"
    +"    - Splice any alias references on method re-definitions into separate "
    +"methods (#247)\n"
    +"    - Fix \"yard graph\" (#245)\n"
    +"    - Don't process ++ typewriter text inside of HTML attributes (#244)\n"
    +"    - Prioritize loading of Kramdown before Maruku (#241)\n"
    +"    - Skip shebang encoding in docstrings (#238)\n"
    +"    - Fix truncation of references in @deprecated (#232)\n"
    +"    - Show @api private note when no other tags are present (#231)\n"
    +"    - Detect docstrings starting with \"##\" as `Docstring#hash_flag` "
    +"(#230)\n"
    +"    - Remove trailing whitespace from freeform tags (#229)\n"
    +"    - Fix line through for deprecated methods (#225)\n"
    +"    - Mistake in Tags.md (#223)\n"
    +"    - Improve database storage by being more efficient with filesystem usage "
    +"(#222)\n"
    +"    - Make Registry thread local (#221)\n"
    +"    - Support `private_constant` class method for 1.9.3 (#219)\n"
    +"    - Do not assume RDoc is installed (#214)"
    +msgstr ""
    +"- **March.13.11**: 0.6.5 release\n"
    +"    - Support `ripper` gem in Ruby 1.8.7\n"
    +"    - Upgrade jQuery to 1.5.1\n"
    +"    - Fix handling of alias statements with quoted symbols (#262)\n"
    +"    - Add CSS styles (#260)\n"
    +"    - Unhandled exception in YARD::Handlers::Ruby::MixinHandler indexing documentation for eventmachine (#248)\n"
    +"    - Splice any alias references on method re-definitions into separate methods (#247)\n"
    +"    - Fix \"yard graph\" (#245)\n"
    +"    - Don't process ++ typewriter text inside of HTML attributes (#244)\n"
    +"    - Prioritize loading of Kramdown before Maruku (#241)\n"
    +"    - Skip shebang encoding in docstrings (#238)\n"
    +"    - Fix truncation of references in @deprecated (#232)\n"
    +"    - Show @api private note when no other tags are present (#231)\n"
    +"    - Detect docstrings starting with \"##\" as `Docstring#hash_flag` (#230)\n"
    +"    - Remove trailing whitespace from freeform tags (#229)\n"
    +"    - Fix line through for deprecated methods (#225)\n"
    +"    - Mistake in Tags.md (#223)\n"
    +"    - Improve database storage by being more efficient with filesystem usage (#222)\n"
    +"    - Make Registry thread local (#221)\n"
    +"    - Support `private_constant` class method for 1.9.3 (#219)\n"
    +"    - Do not assume RDoc is installed (#214)"
    +
    +#: ../README.md:413
    +msgid ""
    +"- **December.21.10**: 0.6.4 release\n"
    +"    - Fix yri tool crashing with new Config class (gh-217)\n"
    +"    - Fix support for ::TopLevelConstants (gh-216)\n"
    +"    - YARD's test suite is now RSpec2 compatible (gh-215)\n"
    +"    - Improved documentation for YARD::Server features (gh-207)\n"
    +"    - Fix displaying of collaped method summary lists (gh-204)\n"
    +"    - Fix automatic loading of markup providers (gh-206)\n"
    +"    - Fix keyboard shortcuts for Chrome (gh-203)\n"
    +"    - Disallow `extend self` inside of a class (gh-202)\n"
    +"    - Constants now recognized in C extensions (gh-201)"
    +msgstr ""
    +"- **December.21.10**: 0.6.4 release\n"
    +"    - Fix yri tool crashing with new Config class (gh-217)\n"
    +"    - Fix support for ::TopLevelConstants (gh-216)\n"
    +"    - YARD's test suite is now RSpec2 compatible (gh-215)\n"
    +"    - Improved documentation for YARD::Server features (gh-207)\n"
    +"    - Fix displaying of collaped method summary lists (gh-204)\n"
    +"    - Fix automatic loading of markup providers (gh-206)\n"
    +"    - Fix keyboard shortcuts for Chrome (gh-203)\n"
    +"    - Disallow `extend self` inside of a class (gh-202)\n"
    +"    - Constants now recognized in C extensions (gh-201)"
    +
    +#: ../README.md:424
    +msgid ""
    +"- **November.21.10**: 0.6.3 release\n"
    +"    - Fixed regression that caused `yardoc --markup` to silently exit"
    +msgstr ""
    +"- **November.21.10**: 0.6.3 release\n"
    +"    - Fixed regression that caused `yardoc --markup` to silently exit"
    +
    +#: ../README.md:427
    +msgid ""
    +"- **November.15.10**: 0.6.2 release\n"
    +"    - **Plugins no longer automatically load, use `--plugin` to load a "
    +"plugin**\n"
    +"    - Added YARD::Config and ~/.yard/config YAML configuration file\n"
    +"    - Added `yard config` command to view/edit YARD configuration file\n"
    +"    - Fixes for YARD in 1.8.6 (gh-178)\n"
    +"    - Various HTML template adjustments and fixes (gh-198,199,200)\n"
    +"    - Improved `yard server -m` multi-project stability (gh-193)\n"
    +"    - Fixed handling of `yardoc --no-private` with missing class definitions "
    +"(gh-197)\n"
    +"    - Added support for constants defined in C extensions (gh-177)\n"
    +"    - Added support for Structs defined as \"Klass = Struct.new"
    +"(...)\" (gh-187)\n"
    +"    - Improved parsing support for third-party gems (gh-174,180)\n"
    +"    - Improved support for JRuby 1.6.4+. YARD now passes all specs in JRuby "
    +"(gh-185)\n"
    +"    - Improved YARD documentation (gh-172,191,196)"
    +msgstr ""
    +"- **November.15.10**: 0.6.2 release\n"
    +"    - **Plugins no longer automatically load, use `--plugin` to load a plugin**\n"
    +"    - Added YARD::Config and ~/.yard/config YAML configuration file\n"
    +"    - Added `yard config` command to view/edit YARD configuration file\n"
    +"    - Fixes for YARD in 1.8.6 (gh-178)\n"
    +"    - Various HTML template adjustments and fixes (gh-198,199,200)\n"
    +"    - Improved `yard server -m` multi-project stability (gh-193)\n"
    +"    - Fixed handling of `yardoc --no-private` with missing class definitions (gh-197)\n"
    +"    - Added support for constants defined in C extensions (gh-177)\n"
    +"    - Added support for Structs defined as \"Klass = Struct.new(...)\" (gh-187)\n"
    +"    - Improved parsing support for third-party gems (gh-174,180)\n"
    +"    - Improved support for JRuby 1.6.4+. YARD now passes all specs in JRuby (gh-185)\n"
    +"    - Improved YARD documentation (gh-172,191,196)"
    +
    +#: ../README.md:441
    +msgid ""
    +"- **September.06.10**: 0.6.1 release\n"
    +"    - Fixed TOC showing on top of class/method list in no-frames view\n"
    +"    - A message now displays when running `yard server` with Rack/Mongrel "
    +"installed\n"
    +"    - Improved performance of JS inline search for large class/method lists\n"
    +"    - Improved link titles for relative object links\n"
    +"    - Removed `String#camelcase` and `String#underscore` for better Rails "
    +"compat.\n"
    +"    - Fixed support for loading .yardoc files under Windows\n"
    +"    - Fixed inheritance tree arrows not displaying in certain environments"
    +msgstr ""
    +"- **September.06.10**: 0.6.1 release\n"
    +"    - Fixed TOC showing on top of class/method list in no-frames view\n"
    +"    - A message now displays when running `yard server` with Rack/Mongrel installed\n"
    +"    - Improved performance of JS inline search for large class/method lists\n"
    +"    - Improved link titles for relative object links\n"
    +"    - Removed `String#camelcase` and `String#underscore` for better Rails compat.\n"
    +"    - Fixed support for loading .yardoc files under Windows\n"
    +"    - Fixed inheritance tree arrows not displaying in certain environments"
    +
    +#: ../README.md:450
    +msgid ""
    +"- **August.29.10**: 0.6.0 release\n"
    +"    - Added dynamic local documentation server\n"
    +"    - Added @group/@endgroup declarations to organize methods into groups\n"
    +"    - Added `yard` executable to serve as main CLI tool with pluggable "
    +"commands\n"
    +"    - Added `--asset` switch to `yardoc` to copy files/dirs to output dir\n"
    +"    - Added ability to register/manipulate tags via CLI (`--tag`, etc.)\n"
    +"    - Added `yard diff` command\n"
    +"    - Added statistics to `yardoc` output (and `yard stats` command)\n"
    +"    - Added Javascript generated Table of Contents to file pages\n"
    +"    - Updated various APIs\n"
    +"    - Removed `yard-graph` executable\n"
    +"    - See more changes in the {file:docs/WhatsNew.md what's new document}"
    +msgstr ""
    +"- **August.29.10**: 0.6.0 release\n"
    +"    - Added dynamic local documentation server\n"
    +"    - Added @group/@endgroup declarations to organize methods into groups\n"
    +"    - Added `yard` executable to serve as main CLI tool with pluggable commands\n"
    +"    - Added `--asset` switch to `yardoc` to copy files/dirs to output dir\n"
    +"    - Added ability to register/manipulate tags via CLI (`--tag`, etc.)\n"
    +"    - Added `yard diff` command\n"
    +"    - Added statistics to `yardoc` output (and `yard stats` command)\n"
    +"    - Added Javascript generated Table of Contents to file pages\n"
    +"    - Updated various APIs\n"
    +"    - Removed `yard-graph` executable\n"
    +"    - See more changes in the {file:docs/WhatsNew.md what's new document}"
    +
    +#: ../README.md:463
    +msgid ""
    +"- **June.22.10**: 0.5.8 release\n"
    +"    - Merge fix from 0.6 branch for --no-private visibility checking"
    +msgstr ""
    +"- **June.22.10**: 0.5.8 release\n"
    +"    - Merge fix from 0.6 branch for --no-private visibility checking"
    +
    +#: ../README.md:466
    +msgid ""
    +"- **June.21.10**: 0.5.7 release\n"
    +"    - Fixed visibility flag parsing in `yardoc`\n"
    +"    - Updated Parser Architecture documentation with new SourceParser API\n"
    +"    - Improved Registry documentation for new load commands\n"
    +"    - Fix loading of .yardoc file as cache (and preserving aliases)\n"
    +"    - Fix \"lib\" directory missing when running YARD on installed gems"
    +msgstr ""
    +"- **June.21.10**: 0.5.7 release\n"
    +"    - Fixed visibility flag parsing in `yardoc`\n"
    +"    - Updated Parser Architecture documentation with new SourceParser API\n"
    +"    - Improved Registry documentation for new load commands\n"
    +"    - Fix loading of .yardoc file as cache (and preserving aliases)\n"
    +"    - Fix \"lib\" directory missing when running YARD on installed gems"
    +
    +#: ../README.md:473
    +msgid ""
    +"- **June.12.10**: 0.5.6 release\n"
    +"    - Bug fixes for RubyGems plugin, `has_rdoc=false` should now work\n"
    +"    - New API for registering custom parsers. See {file:docs/WhatsNew.md}"
    +msgstr ""
    +"- **June.12.10**: 0.5.6 release\n"
    +"    - Bug fixes for RubyGems plugin, `has_rdoc=false` should now work\n"
    +"    - New API for registering custom parsers. See {file:docs/WhatsNew.md}"
    +
    +#: ../README.md:477
    +msgid ""
    +"- **May.22.10**: 0.5.5 release\n"
    +"    - Various bug fixes"
    +msgstr ""
    +"- **May.22.10**: 0.5.5 release\n"
    +"    - Various bug fixes"
    +
    +#: ../README.md:480
    +msgid ""
    +"- **March.22.10**: 0.5.4 release\n"
    +"    - See {file:docs/WhatsNew.md what's new document} for changes"
    +msgstr ""
    +"- **March.22.10**: 0.5.4 release\n"
    +"    - See {file:docs/WhatsNew.md what's new document} for changes"
    +
    +#: ../README.md:483
    +msgid ""
    +"- **January.11.10**: 0.5.3 release\n"
    +"    - See {file:docs/WhatsNew.md what's new document} for changes"
    +msgstr ""
    +"- **January.11.10**: 0.5.3 release\n"
    +"    - See {file:docs/WhatsNew.md what's new document} for changes"
    +
    +#: ../README.md:486
    +msgid ""
    +"- **December.16.09**: 0.5.2 release\n"
    +"    - See {file:docs/WhatsNew.md what's new document} for changes"
    +msgstr ""
    +"- **December.16.09**: 0.5.2 release\n"
    +"    - See {file:docs/WhatsNew.md what's new document} for changes"
    +
    +#: ../README.md:489
    +msgid ""
    +"- **December.15.09**: 0.5.1 release\n"
    +"    - See {file:docs/WhatsNew.md what's new document} for changes"
    +msgstr ""
    +"- **December.15.09**: 0.5.1 release\n"
    +"    - See {file:docs/WhatsNew.md what's new document} for changes"
    +
    +#: ../README.md:492
    +msgid ""
    +"- **December.13.09**: 0.5.0 release\n"
    +"    - See {file:docs/WhatsNew.md what's new document} for changes"
    +msgstr ""
    +"- **December.13.09**: 0.5.0 release\n"
    +"    - See {file:docs/WhatsNew.md what's new document} for changes"
    +
    +#: ../README.md:495
    +msgid ""
    +"- **November.15.09**: 0.4.0 release\n"
    +"    - Added new templating engine based on [tadpole](http://github.com/"
    +"lsegal/tadpole)\n"
    +"    - Added YARD queries (`--query` CLI argument to yardoc)\n"
    +"    - Greatly expanded YARD documentation\n"
    +"    - Added plugin support\n"
    +"    - New `@abstract` and `@private` tags\n"
    +"    - Changed default rake task to `rake yard`\n"
    +"    - Read about changes in {file:docs/WhatsNew.md}"
    +msgstr ""
    +"- **November.15.09**: 0.4.0 release\n"
    +"    - Added new templating engine based on [tadpole](http://github.com/lsegal/tadpole)\n"
    +"    - Added YARD queries (`--query` CLI argument to yardoc)\n"
    +"    - Greatly expanded YARD documentation\n"
    +"    - Added plugin support\n"
    +"    - New `@abstract` and `@private` tags\n"
    +"    - Changed default rake task to `rake yard`\n"
    +"    - Read about changes in {file:docs/WhatsNew.md}"
    +
    +#: ../README.md:504
    +msgid ""
    +"- **August.13.09**: 0.2.3.5 release\n"
    +"    - Minor bug fixes."
    +msgstr ""
    +"- **August.13.09**: 0.2.3.5 release\n"
    +"    - Minor bug fixes."
    +
    +#: ../README.md:507
    +msgid ""
    +"- **August.07.09**: 0.2.3.4 release\n"
    +"    - Minor bug fixes."
    +msgstr ""
    +"- **August.07.09**: 0.2.3.4 release\n"
    +"    - Minor bug fixes."
    +
    +#: ../README.md:510
    +msgid ""
    +"- **July.26.09**: 0.2.3.3 release\n"
    +"    - Minor bug fixes."
    +msgstr ""
    +"- **July.26.09**: 0.2.3.3 release\n"
    +"    - Minor bug fixes."
    +
    +#: ../README.md:513
    +msgid ""
    +"- **July.06.09**: 0.2.3.2 release\n"
    +"    - Fix Textile hard-break issues\n"
    +"    - Add description for @see tag to use as link title in HTML docs.\n"
    +"    - Add --title CLI option to specify a title for HTML doc files.\n"
    +"    - Add custom.css file that can be overridden with various custom\n"
    +"      styelsheet declarations. To use this, simply add `default/fulldoc/html/"
    +"custom.css`\n"
    +"      inside your code directory and use the `-t` template directory yardoc "
    +"CLI\n"
    +"      option to point to that template directory (the dir holding "
    +"'default').\n"
    +"    - Add support in `yardoc` CLI to specify extra files (formerly --files)\n"
    +"      by appending \"- extra files here\" after regular source files. "
    +"Example:"
    +msgstr ""
    +"- **July.06.09**: 0.2.3.2 release\n"
    +"    - Fix Textile hard-break issues\n"
    +"    - Add description for @see tag to use as link title in HTML docs.\n"
    +"    - Add --title CLI option to specify a title for HTML doc files.\n"
    +"    - Add custom.css file that can be overridden with various custom\n"
    +"      styelsheet declarations. To use this, simply add `default/fulldoc/html/custom.css`\n"
    +"      inside your code directory and use the `-t` template directory yardoc CLI\n"
    +"      option to point to that template directory (the dir holding 'default').\n"
    +"    - Add support in `yardoc` CLI to specify extra files (formerly --files)\n"
    +"      by appending \"- extra files here\" after regular source files. Example:"
    +
    +#: ../README.md:524
    +msgid "            yardoc --private lib/**/*.rb - FAQ LICENSE"
    +msgstr "            yardoc --private lib/**/*.rb - FAQ LICENSE"
    +
    +#: ../README.md:526
    +msgid ""
    +"- **Jun.13.09**: 0.2.3.1 release.\n"
    +"    - Add a RubyGems 1.3.2+ plugin to generate YARD documentation instead "
    +"of\n"
    +"      RDoc. To take advantage of this plugin, set `has_rdoc = 'yard'` in "
    +"your\n"
    +"      .gemspec file."
    +msgstr ""
    +"- **Jun.13.09**: 0.2.3.1 release.\n"
    +"    - Add a RubyGems 1.3.2+ plugin to generate YARD documentation instead of\n"
    +"      RDoc. To take advantage of this plugin, set `has_rdoc = 'yard'` in your\n"
    +"      .gemspec file."
    +
    +#: ../README.md:531
    +msgid ""
    +"- **Jun.07.09**: 0.2.3 release. See the {file:docs/WhatsNew.md} file for a\n"
    +"  list of important new features."
    +msgstr ""
    +"- **Jun.07.09**: 0.2.3 release. See the {file:docs/WhatsNew.md} file for a\n"
    +"  list of important new features."
    +
    +#: ../README.md:534
    +msgid ""
    +"- **Jun.16.08**: 0.2.2 release. This is the largest changset since yard's\n"
    +"  conception and involves a complete overhaul of the parser and API to make "
    +"it\n"
    +"  more robust and far easier to extend and use for the developer."
    +msgstr ""
    +"- **Jun.16.08**: 0.2.2 release. This is the largest changset since yard's\n"
    +"  conception and involves a complete overhaul of the parser and API to make it\n"
    +"  more robust and far easier to extend and use for the developer."
    +
    +#: ../README.md:538
    +msgid "- **Feb.20.08**: 0.2.1 release."
    +msgstr "- **Feb.20.08**: 0.2.1 release."
    +
    +#: ../README.md:540
    +msgid ""
    +"- **Feb.24.07**: Released 0.1a experimental version for testing. The goal "
    +"here is\n"
    +"  to get people testing YARD on their code because there are too many "
    +"possible\n"
    +"  code styles to fit into a sane amount of test cases. It also demonstrates "
    +"the\n"
    +"  power of YARD and what to expect from the syntax (Yardoc style meta tags)."
    +msgstr ""
    +"- **Feb.24.07**: Released 0.1a experimental version for testing. The goal here is\n"
    +"  to get people testing YARD on their code because there are too many possible\n"
    +"  code styles to fit into a sane amount of test cases. It also demonstrates the\n"
    +"  power of YARD and what to expect from the syntax (Yardoc style meta tags)."
    +
    +#: ../README.md:546
    +msgid "## Contributors"
    +msgstr "## 貢献者へ"
    +
    +#: ../README.md:548
    +msgid ""
    +"Special thanks to all contributors for submitting patches. A full list of\n"
    +"contributors including their patches can be found at:"
    +msgstr ""
    +"パッチの申請をした全ての貢献者へ本当に感謝する。\n"
    +"これらのパッチを投げた全ての貢献者のリストは次で見れる:"
    +
    +#: ../README.md:551
    +msgid "http://github.com/lsegal/yard/contributors"
    +msgstr "http://github.com/lsegal/yard/contributors"
    +
    +#: ../README.md:553
    +msgid "## Copyright"
    +msgstr "## Copyright"
    +
    +#: ../README.md:555
    +msgid ""
    +"YARD © 2007-2012 by [Loren Segal](mailto:lsegal@soen.ca). YARD is\n"
    +"licensed under the MIT license except for some files which come from the\n"
    +"RDoc/Ruby distributions. Please see the {file:LICENSE} and {file:LEGAL}\n"
    +"documents for more information."
    +msgstr ""
    +"YARD © 2007-2012 by [Loren Segal](mailto:lsegal@soen.ca). YARD is\n"
    +"licensed under the MIT license except for some files which come from the\n"
    +"RDoc/Ruby distributions. Please see the {file:LICENSE} and {file:LEGAL}\n"
    +"documents for more information."
    +
    +# title
    +#: ../docs/CodeObjects.md:1
    +msgid "CodeObjects Architecture"
    +msgstr "コードオブジェクト構造"
    +
    +#: ../docs/CodeObjects.md:3
    +msgid "# CodeObjects Architecture"
    +msgstr "# コードオブジェクト構造"
    +
    +#: ../docs/CodeObjects.md:5
    +msgid ""
    +"Code objects are Ruby objects that describe the code being documented. For "
    +"instance,\n"
    +"all classes, modules, methods, etc. are all extracted from the Ruby source "
    +"as code\n"
    +"objects. All of these code objects extend from the {YARD::CodeObjects::Base} "
    +"class, which\n"
    +"provides basic attributes like source location, source code, name and path."
    +msgstr ""
    +"コードオブジェクトは記述されているコードの用途を説明するRubyオブジェクトとな"
    +"る。\n"
    +"例えば、全てのクラス,モジュール,メソッド等は、\n"
    +"コードオブジェクトのようにRubyのソースから全て抽出される。\n"
    +"これらコードオブジェクトの全ては、{YARD::CodeObjects::Base}クラスから拡張す"
    +"る。\n"
    +"そして、ソースの位置や,ソースコードや,名前や,パスのように基本属性を提供する。"
    +
    +#: ../docs/CodeObjects.md:10
    +msgid "## CodeObjects Organization"
    +msgstr "## コードオブジェクト機構"
    +
    +#: ../docs/CodeObjects.md:12
    +msgid ""
    +"Code objects are divided into two basic types. {YARD::CodeObjects::"
    +"NamespaceObject NamespaceObjects}\n"
    +"and non-namespace objects. A namespace object refers to any object in Ruby "
    +"that can have\n"
    +"other objects defined inside of it. In the context of Ruby, this "
    +"specifically means\n"
    +"modules and classes (both of which are subclasses of `NamespaceObject`). "
    +"These objects\n"
    +"act like tree structures, maintaining a list of all of their direct "
    +"children. All non\n"
    +"namespace objects are simply subclasses of the Base class. The {YARD::"
    +"CodeObjects::RootObject RootObject}\n"
    +"is a special kind of `NamespaceObject` which refers to the top level "
    +"namespace in Ruby.\n"
    +"Methods that accept a namespace object as a parameter should also accept the "
    +"symbol\n"
    +"`:root` as a shortcut for the root object."
    +msgstr ""
    +"コードオブジェクトは二つの基本的な方に分割される。\n"
    +"それは{YARD::CodeObjects::NamespaceObject NamespaceObjects}とnamespaceではないオブジェクトである。\n"
    +"namespace オブジェクトは\n"
    +"その内部で定義された他のオブジェクトを持つ事ができる任意のRubyのオブジェクトを参照する。\n"
    +"これは特にモジュールとクラスを意味する。\n"
    +"( `NamespaceObject` のサブクラスのどちらとも)\n"
    +"これらのオブジェクトはツリー構造のように振る舞い、これらの直接の子全てのリストを維持している。\n"
    +"namespaceではない全てのオブジェクトは単純にベースクラスのサブクラスである。\n"
    +"{YARD::CodeObjects::RootObject RootObject} は\n"
    +"特別な `NamespaceObject` ともいえ、Rubyの中のトップレベルnamaspaceを参照する。\n"
    +"パラメータとして namespace オブジェクトを受け入れるメソッドは、\n"
    +"root オブジェクト用のショートカットとして `:root` シンボルも受け入れる。"
    +
    +#: ../docs/CodeObjects.md:22
    +msgid ""
    +"The following is an overview of the classes within the `CodeObjects` "
    +"namespace:"
    +msgstr "以下は `CodeObjects` のnamespaceの中で用いられるクラスの概要となる。"
    +
    +#: ../docs/CodeObjects.md:24
    +msgid "![CodeObjects Class Diagram](images/code-objects-class-diagram.png)"
    +msgstr "![CodeObjects Class Diagram](images/code-objects-class-diagram.png)"
    +
    +#: ../docs/CodeObjects.md:26
    +msgid "## Unique Path Representation"
    +msgstr ""
    +"## ユニークパス表現\n"
    +"## Unique Path Representation"
    +
    +#: ../docs/CodeObjects.md:28
    +msgid ""
    +"All CodeObjects are uniquely defined by their implementation of {YARD::"
    +"CodeObjects::Base#path}.\n"
    +"This path is used to locate or store a code object in the {YARD::Registry}. "
    +"It is therefore\n"
    +"essential that any Base subclass return a unique String value for #path so "
    +"that the\n"
    +"object may co-exist with other objects in the Registry."
    +msgstr ""
    +"全てのコードオブジェクトは\n"
    +"これらの{YARD::CodeObjects::Base#path}の実装によって個別に定義される。\n"
    +"このパスは場所を示すためや {YARD::Registry} の中でコードオブジェクトを登録するため利用される\n"
    +"それ故、任意の基本サブクラスが個別の#pathメソッド用の文字列値を返す必要がある。\n"
    +"オブジェクトはレジストリーの中で他のオブジェクトと一緒に共存する事になる。"
    +
    +#: ../docs/CodeObjects.md:33
    +msgid ""
    +"In practice, a path is simply the conventional Ruby representation of a "
    +"class,\n"
    +"module, constant, class variable or method. For example, the following "
    +"objects\n"
    +"would have the following respective paths:"
    +msgstr ""
    +"実際のパスは、単純に慣習的なRubyの\n"
    +"クラス,モジュール,定数,クラス変数,メソッドの表現となる。\n"
    +"例えば、次のオブジェクトは、後に続く個別のパスを持っている。"
    +
    +#: ../docs/CodeObjects.md:37
    +msgid ""
    +"* Class `Klass` inside module `Mod`: `Mod::Klass`\n"
    +"* Instance method `bar` inside class `Foo`: `Foo#bar`\n"
    +"* Class method `bar` inside class `Foo`: `Foo.bar`\n"
    +"* Constant `VERSION` inside class `YARD`: `YARD::VERSION`\n"
    +"* Class variable `@@abc` inside class `A`: `A::@@abc`"
    +msgstr ""
    +"* `Mod` モジュールの内部の `Klass` クラス: `Mod::Klass`\n"
    +"* `Foo` クラスの内部の `bar` インスタンスメソッド: `Foo#bar`\n"
    +"* `Foo` クラスの内部の `bar` クラスメソッド: `Foo.bar`\n"
    +"* `YARD` クラス内部の `VARSION` 定数: `YARD::VERSION`\n"
    +"* `A` クラス内部の `@@abc` クラス変数: `A::@@abc`"
    +
    +#: ../docs/CodeObjects.md:43
    +msgid "## Registry"
    +msgstr "## レジストリー"
    +
    +#: ../docs/CodeObjects.md:45
    +msgid ""
    +"CodeObjects classes are coupled with the {YARD::Registry} class which keeps "
    +"track of\n"
    +"all instantiated code objects. This is an explicit design choice to allow "
    +"objects\n"
    +"to be fetched, cached, imported and exported from a centralized location. As "
    +"mentioned\n"
    +"above, this coupling is a result of the fact that each object is uniquely "
    +"identified by\n"
    +"its path, which is used to implement lookups. You can read more about the "
    +"registry\n"
    +"in the {YARD::Registry} class."
    +msgstr ""
    +"コードオブジェクトクラスは {YARD::Registry} クラスを用い組み合わされ、\n"
    +"そしてインスタンス化されたコードオブジェクトのトラックを保持する。\n"
    +"これは集中化される場所から、\n"
    +"フェッチ,キャッシュ,インポート,エクスポートされるオブジェクトを許可するための\n"
    +"選択を明確に設計する。\n"
    +"上で言われた、\n"
    +"この組み合わせは個々のオブジェクトの要素の結果がそのパスによって独自に識別され,\n"
    +"検索を実装するために利用される。\n"
    +"レジストリーの詳細については、 {YARD::Registry} クラスの中で読むことができる。"
    +
    +#: ../docs/CodeObjects.md:52
    +msgid "## Identity Map"
    +msgstr "## Identity Map"
    +
    +#: ../docs/CodeObjects.md:54
    +msgid ""
    +"Code objects are instantiated using an identity-map like implementation that "
    +"guarantees\n"
    +"only one unique Ruby object exists for an object described by a specific "
    +"path. This\n"
    +"allows developers to create a code object without checking if it already "
    +"exists in\n"
    +"the {YARD::Registry}. The following example will only create one object:"
    +msgstr ""
    +"コードオブジェクトはidentity-mapによってインスタンス化される。\n"
    +"これは、特定のパスによって説明されるオブジェクトが\n"
    +"固有のRubyオブジェクトだと保証する実装のようなものである。\n"
    +"既に{YARD::Registry}の中に存在する場合\n"
    +"確認無しでコードオブジェクトを作成する為に開発者達を受け入れる\n"
    +"次の例は一つのオブジェクトだけ作成する。"
    +
    +#: ../docs/CodeObjects.md:59
    +msgid ""
    +"    id = ClassObject.new(:root, \"MyClass\").object_id #=> 13352\n"
    +"    ClassObject.new(:root, \"MyClass\").object_id #=> 13352"
    +msgstr ""
    +"    id = ClassObject.new(:root, \"MyClass\").object_id #=> 13352\n"
    +"    ClassObject.new(:root, \"MyClass\").object_id #=> 13352"
    +
    +#: ../docs/CodeObjects.md:62
    +msgid "## Proxy Objects"
    +msgstr "## プロキシ オブジェクト"
    +
    +#: ../docs/CodeObjects.md:64
    +msgid ""
    +"In addition to providing access to existing objects, a {YARD::CodeObjects::"
    +"Proxy}\n"
    +"class exists which can represent an object at a path that may or may not "
    +"have been\n"
    +"created. This is necessary to represent a reference to an object in code "
    +"that is\n"
    +"never defined in the same body of source code, or perhaps defined later. If "
    +"any\n"
    +"attributes of a proxy are accessed, it will immediately be resolved to the "
    +"object\n"
    +"at its declared path. In the case where such an object exists, it will act "
    +"as\n"
    +"a delegate to the object. However, if the object does not exist, a warning "
    +"will\n"
    +"be raised. Whenever arbitrary code objects are used, care should be taken "
    +"in\n"
    +"order to make sure attributes are not accessed on unresolvable proxies. An\n"
    +"unresolvable proxy will return a class name of `Proxy` and #type of `:"
    +"proxy`,\n"
    +"for example:"
    +msgstr ""
    +"さらに現在のオブジェクトにアクセスを提供するには、\n"
    +"{YARD::CodeObjects::Proxy} クラスがある。\n"
    +"それは作成されるかどうかはわからないがパスでオブジェクトを表せる。\n"
    +"これは同じソースコード内で定義されないコードでオブジェクトへの参照を表す為や、\n"
    +"ことによると後で定義される時に必要となる。\n"
    +"任意プロキシの属性がアクセスされる場合、\n"
    +"すぐに宣言されたパスでオブジェクトの為に解決される。\n"
    +"オブジェクトが存在する場合、オブジェクトに委譲するように振る舞う。\n"
    +"しかしながら、オブジェクトが存在しなかった場合は、警告が出るだろう。\n"
    +"任意のコードオブジェクトが利用される時はいつでも、\n"
    +"属性が未解決のプロキシ上でアクセスしないか確認する為に\n"
    +"順番にされるので注意しなければならない。\n"
    +"未解決のプロキシは `Proxy` のクラス名と `:proxy` の#typeメソッドを返す。\n"
    +"例えば以下のように:"
    +
    +#: ../docs/CodeObjects.md:76
    +msgid ""
    +"    P(:InvalidObject).type == :proxy  #=> true\n"
    +"    P(:InvalidObject).is_a?(Proxy)    #=> true"
    +msgstr ""
    +"    P(:InvalidObject).type == :proxy  #=> true\n"
    +"    P(:InvalidObject).is_a?(Proxy)    #=> true"
    +
    +#: ../docs/CodeObjects.md:79
    +msgid "## Adding Data to Code Objects"
    +msgstr "## コードオブジェクトにデータを追加する。"
    +
    +#: ../docs/CodeObjects.md:81
    +msgid ""
    +"Code objects act as hash-like structures that allow any arbitrary value to "
    +"be set.\n"
    +"This allows easy extending of existing objects without creating custom "
    +"subclasses.\n"
    +"For instance, to add a timestamp to a method object (when it was modified, "
    +"maybe),\n"
    +"it is possible to simply do:"
    +msgstr ""
    +"コードオブジェクトは設定される為の任意の値を受け入れるハッシュ構造のように振"
    +"る舞う。\n"
    +"これは、カスタムサブクラスを作成すること無しで、既存のオブジェクトの簡単な拡"
    +"張を受け入れる。\n"
    +"例えば、メソッドオブジェクトにtimestampを追加する為には、\n"
    +"以下の様に単純にする事が可能。"
    +
    +#: ../docs/CodeObjects.md:86
    +msgid ""
    +"    object = MethodObject.new(:root, \"my_method\")\n"
    +"    object[:modified_at] = Time.now"
    +msgstr ""
    +"    object = MethodObject.new(:root, \"my_method\")\n"
    +"    object[:modified_at] = Time.now"
    +
    +#: ../docs/CodeObjects.md:89
    +msgid ""
    +"This value can now be retrieved on this object both by the hash `[]` syntax "
    +"as\n"
    +"well as like any other method:"
    +msgstr ""
    +"この値はハッシュのような `[]` 構文でも以下のような\n"
    +"メソッド呼び出しでも取り出す事が出来る。"
    +
    +#: ../docs/CodeObjects.md:92
    +msgid "    object.modified_at #=> 2009-06-03 20:08:46 -0400"
    +msgstr "    object.modified_at #=> 2009-06-03 20:08:46 -0400"
    +
    +#: ../docs/CodeObjects.md:94
    +msgid "## Creating a Custom CodeObject"
    +msgstr "## カスタムコードオブジェクトを作成する"
    +
    +#: ../docs/CodeObjects.md:96
    +msgid ""
    +"It should first be mentioned that creating a custom code object should not "
    +"be\n"
    +"necessary in most cases, except when functionality that cannot be "
    +"represented\n"
    +"by classical Ruby objects is added. A good example *might* be a test class,\n"
    +"which although is technically a Ruby class, has a significantly different "
    +"purpose\n"
    +"in documentation and needs a different set of metadata, as well as its own\n"
    +"representation in documentation."
    +msgstr ""
    +"カスタムコードオブジェクトを作成する前に、最初に言及すべきこととして、\n"
    +"大抵の場合、カスタムコードオブジェクトを作成する事は必須ではないはずであ"
    +"る。\n"
    +"この項は標準的なRubyオブジェクトの追加によって表現できない機能がある時の事を"
    +"予期する。\n"
    +"いい例は、testクラスかもしれない、\n"
    +"それは、形の上ではRubyのクラスだけれども、\n"
    +"中のドキュメントやメタデータの入った異なる設定を必要とし\n"
    +"かなり異なる目的をもっている。\n"
    +"それ自身もドキュメントの中を表している。"
    +
    +#: ../docs/CodeObjects.md:103
    +msgid ""
    +"The {YARD::CodeObjects::Base#path} implementation is the most important part "
    +"of the\n"
    +"code object architecture. The first thing any custom code object must "
    +"guarantee is\n"
    +"that its path value is unique among all other objects. The recommended way "
    +"to do this\n"
    +"with custom objects is to add a descriptive prefix to the path. For example, "
    +"the\n"
    +"following is an implementation of the path for a hypothetical `FooObject`:"
    +msgstr ""
    +"{YARD::CodeObjects::Base#path}の実装がコードオブジェクト構造の最も重要な部分である。\n"
    +"どのカスタムコードオブジェクトでも最初に保証されなければならない事は、\n"
    +"パスの値が他の全てのオブジェクトとの間で固有でなければならない。\n"
    +"これを行うのに推奨される方法は、\n"
    +"カスタムオブジェクトがパスに説明のプレフィックス(接頭語)を\n"
    +"追加する方法である。\n"
    +"例えば、次は仮の `FooObject` 用のパスの実装となる。"
    +
    +#: ../docs/CodeObjects.md:109
    +msgid ""
    +"    def path\n"
    +"      \"__FooPrefix\" + sep + super\n"
    +"    end"
    +msgstr ""
    +"    def path\n"
    +"      \"__FooPrefix\" + sep + super\n"
    +"    end"
    +
    +#: ../docs/CodeObjects.md:113
    +msgid ""
    +"Note that if our FooObject is a `NamespaceObject`, meaning if it can have "
    +"child\n"
    +"FooObjects defined inside of it, you may need to verify that the prefix is "
    +"only\n"
    +"applied once."
    +msgstr ""
    +"次の事に留意する。\n"
    +"もし例のFooObjectが、 `NamespaceObject` の場合、\n"
    +"FooObjectがそれの内部で定義される子を持てるかどうか意味している。\n"
    +"一度だけ適用されるプレフィックスを確認する為に必要な場合がある。"
    +
    +# title
    +#: ../docs/GettingStarted.md:1
    +msgid "Getting Started Guide"
    +msgstr "導入の案内"
    +
    +#: ../docs/GettingStarted.md:3
    +msgid "# Getting Started with YARD"
    +msgstr "# YARDを使い始めるには"
    +
    +#: ../docs/GettingStarted.md:5
    +msgid ""
    +"There are a few ways which YARD can be of use to you or your project. This\n"
    +"document will cover the most common ways to use YARD:"
    +msgstr ""
    +"YARDにはプロジェクトの助けとなるいくつかの使用方法があるが、\n"
    +"このドキュメントでは以下の目次で一般的なYARDの使い方について説明する。"
    +
    +#: ../docs/GettingStarted.md:8
    +msgid ""
    +"* [Documenting Code with YARD](#docing)\n"
    +"* [Using YARD to Generate Documentation](#using)\n"
    +"* [Configuring YARD](#config)\n"
    +"* [Extending YARD](#extending)\n"
    +"* [Templating YARD](#templating)\n"
    +"* [Plugin Support](#plugins)"
    +msgstr ""
    +"* [YARDで文書を作る](#docing)\n"
    +"* [ドキュメントを生成するYARDの使い方](#using)\n"
    +"* [YARDの構成する](#config)\n"
    +"* [YARDの拡張する](#extending)\n"
    +"* [YARDのテンプレートを作成する](#templating)\n"
    +"* [プラグインサポート](#plugins)"
    +
    +#: ../docs/GettingStarted.md:15
    +msgid ""
    +msgstr ""
    +
    +#: ../docs/GettingStarted.md:17
    +msgid "## Documenting Code with YARD"
    +msgstr "## YARDで文書を作る"
    +
    +#: ../docs/GettingStarted.md:19
    +msgid ""
    +"By default, YARD is compatible with the same RDoc syntax most Ruby "
    +"developers\n"
    +"are already familiar with. However, one of the biggest advantages of YARD "
    +"is\n"
    +"the extended meta-data syntax, commonly known as \"tags\", that you can use\n"
    +"to express small bits of information in a structured and formal manner. "
    +"While\n"
    +"RDoc syntax expects you to describe your method in a completely free-form\n"
    +"manner, YARD recommends declaring your parameters, return types, etc. with\n"
    +"the `@tag` syntax, which makes outputting the documentation more consistent\n"
    +"and easier to read. Consider the RDoc documentation for a method to_format:"
    +msgstr ""
    +"デフォルトで、YARDは多くのRuby開発者たちがすでによく知っている\n"
    +"RDoc構文と両立できる。\n"
    +"しかしながら、\n"
    +"YARDの最も大きな利点の一つは、拡張できるメタデータ構文となる。\n"
    +"それは、一般的に知られる\"タグ\"のように、\n"
    +"小さくて構造化された情報の中を明確にする為や\n"
    +"形式的な方法で記述する為に利用できる。\n"
    +"さらに、RDoc構文はメソッドを説明する為に全てフリーフォームマナーで要求するが、\n"
    +"YARDは宣言しているパラメータ、リターンタイプなどを `@tag` 構文を用いて、\n"
    +"一貫した表現で簡単に読む為のドキュメント作りを推奨する。\n"
    +"RDocのドキュメントのto_formatメソッドについて考えてみる。"
    +
    +#: ../docs/GettingStarted.md:28
    +msgid ""
    +"    # Converts the object into textual markup given a specific `format`\n"
    +"    # (defaults to `:html`)\n"
    +"    #\n"
    +"    # == Parameters:\n"
    +"    # format::\n"
    +"    #   A Symbol declaring the format to convert the object to. This\n"
    +"    #   can be `:text` or `:html`.\n"
    +"    #\n"
    +"    # == Returns:\n"
    +"    # A string representing the object in a specified\n"
    +"    # format.\n"
    +"    #\n"
    +"    def to_format(format = :html)\n"
    +"      # format the object\n"
    +"    end"
    +msgstr ""
    +"    # 原文のマークアップの与えられた特定の `format` へオブジェクトを変換する\n"
    +"    # (defaults to `:html`)\n"
    +"    #\n"
    +"    # == Parameters:\n"
    +"    # format::\n"
    +"    #   A Symbol declaring the format to convert the object to. This\n"
    +"    #   can be `:text` or `:html`.\n"
    +"    #\n"
    +"    # == Returns:\n"
    +"    # A string representing the object in a specified\n"
    +"    # format.\n"
    +"    #\n"
    +"    def to_format(format = :html)\n"
    +"      # format the object\n"
    +"    end"
    +
    +#: ../docs/GettingStarted.md:44
    +msgid ""
    +"While this may seem easy enough to read and understand, it's hard for a "
    +"machine\n"
    +"to properly pull this data back out of our documentation. Also we've tied "
    +"our\n"
    +"markup to our content, and now our documentation becomes hard to maintain "
    +"if\n"
    +"we decide later to change our markup style (maybe we don't want the \":\" "
    +"suffix\n"
    +"on our headers anymore)."
    +msgstr ""
    +"これは読んだり理解するには簡単と思われるかもしれないが、\n"
    +"機械にとっては例のドキュメントを取消しデータを適切に再配置\n"
    +"するのは大変である。(フリーフォームなので)\n"
    +"内容と紐付いたマークアップになっているので、\n"
    +"マークアップスタイルを変更するのが後で決まった場合、\n"
    +"例のドキュメントはすぐに維持するのが大変になる\n"
    +"(恐らく、私達は例の見出しのサフィックス\":\"を望んでいない。)"
    +
    +#: ../docs/GettingStarted.md:50
    +msgid "In YARD, we would simply define our method as:"
    +msgstr "YARDの中で、私達は例のメソッドを単純に定義する。"
    +
    +#: ../docs/GettingStarted.md:52
    +msgid ""
    +"    # Converts the object into textual markup given a specific format.\n"
    +"    #\n"
    +"    # @param [Symbol] format the format type, `:text` or `:html`\n"
    +"    # @return [String] the object converted into the expected format.\n"
    +"    def to_format(format = :html)\n"
    +"      # format the object\n"
    +"    end"
    +msgstr ""
    +"    # 原文のマークアップの与えられた特定のフォーマットへオブジェクトを変換する\n"
    +"    #\n"
    +"    # @param [Symbol] format the format type, `:text` or `:html`\n"
    +"    # @return [String] the object converted into the expected format.\n"
    +"    def to_format(format = :html)\n"
    +"      # format the object\n"
    +"    end"
    +
    +#: ../docs/GettingStarted.md:60
    +msgid ""
    +"Using tags we can add semantic metadata to our code without worrying about\n"
    +"presentation. YARD will handle presentation for us when we decide to "
    +"generate\n"
    +"documentation later."
    +msgstr ""
    +"タグを用いることによって、\n"
    +"私達は(フリーフォームでの)見栄えを気にすることなく\n"
    +"意味のあるメタデータを追加することができる。\n"
    +"そしてYARDは後でドキュメントを生成すると決めた時、\n"
    +"見栄えを処理できる。"
    +
    +#: ../docs/GettingStarted.md:64
    +msgid "## Which Markup Format?"
    +msgstr "## どのマークアップフォーマット?"
    +
    +#: ../docs/GettingStarted.md:66
    +msgid ""
    +"YARD does not impose a specific markup. The above example uses standard "
    +"RDoc\n"
    +"markup formatting, but YARD also supports textile and markdown via the\n"
    +"command-line switch or `.yardopts` file (see below). This means that you "
    +"are\n"
    +"free to use whatever formatting you like. This guide is actually written\n"
    +"using markdown. YARD, however, does add a few important syntaxes that are\n"
    +"processed no matter which markup formatting you use, such as tag support\n"
    +"and inter-document linking. These syntaxes are discussed below."
    +msgstr ""
    +"YARDは特定のマークアップを強要しない。\n"
    +"上の例は標準のRDocマークアップ書式を例として使ったが、\n"
    +"それだけではなく、\n"
    +"コマンドラインや `.yardopts` ファイル経由でtexttileとmarkdownもサポートする(以下参照)\n"
    +"これが意味することは、\n"
    +"あなたが好きなどんな書式を使おうとも自由である。\n"
    +"このガイドは実際にmarkdownを使って書かれている。\n"
    +"ともあれYARDにはいくつかの重要な構文を追加された。\n"
    +"それは、\n"
    +" 1. あなた使うマークアップ書式で問題なく処理される\n"
    +" 2. タグの様なサポート\n"
    +" 3. ドキュメント内部のリンク\n"
    +"である。\n"
    +"これらの構文は以降で説明される。"
    +
    +#: ../docs/GettingStarted.md:74
    +msgid "## Adding Tags to Documentation"
    +msgstr "## ドキュメントにつけられているタグ"
    +
    +#: ../docs/GettingStarted.md:76
    +msgid ""
    +"The tag syntax that YARD uses is the same @tag-style syntax you may have "
    +"seen\n"
    +"if you've ever coded in Java, Python, PHP, Objective-C or a myriad of other\n"
    +"languages. The following tag adds an author tag to your class:"
    +msgstr ""
    +"YARDが使うタグ構文は,もしあなたが今まで\n"
    +"Java, Python, PHP, Objective-Cや無数の他の言語をプログラミングした事があれば\n"
    +"既にあなたが見たことがある@tagスタイルと同じ構文である\n"
    +"次のタグはauthorタグをあなたのクラスに追加する:"
    +
    +#: ../docs/GettingStarted.md:80
    +msgid ""
    +"    # @author Loren Segal\n"
    +"    class MyClass\n"
    +"    end"
    +msgstr ""
    +"    # @author Loren Segal\n"
    +"    class MyClass\n"
    +"    end"
    +
    +#: ../docs/GettingStarted.md:84
    +msgid ""
    +"To allow for large amounts of text, the @tag syntax will recognize any "
    +"indented\n"
    +"lines following a tag as part of the tag data. For example:"
    +msgstr ""
    +"大量のテキストを受け入れる為に、\n"
    +"タグ構文は続くインデントされた行をタグデータの一部として認識するだろう。\n"
    +"例えば以下の様になる。"
    +
    +#: ../docs/GettingStarted.md:87
    +msgid ""
    +"    # @deprecated Use {#my_new_method} instead of this method because\n"
    +"    #   it uses a library that is no longer supported in Ruby 1.9.\n"
    +"    #   The new method accepts the same parameters.\n"
    +"    def mymethod\n"
    +"    end"
    +msgstr ""
    +"    # @deprecated Use {#my_new_method} instead of this method because\n"
    +"    #   it uses a library that is no longer supported in Ruby 1.9.\n"
    +"    #   The new method accepts the same parameters.\n"
    +"    def mymethod\n"
    +"    end"
    +
    +#: ../docs/GettingStarted.md:93
    +msgid "### List of Tags"
    +msgstr "### タグのリスト"
    +
    +#: ../docs/GettingStarted.md:95
    +msgid "A list of tags can be found in {file:docs/Tags.md#taglist}"
    +msgstr "タグのリストは {file:docs/Tags.md#taglist} で見つけられる。"
    +
    +#: ../docs/GettingStarted.md:97 ../docs/Tags.md:230
    +msgid "### Reference Tags"
    +msgstr "### 参照タグ"
    +
    +#: ../docs/GettingStarted.md:99
    +msgid ""
    +"To reduce the amount of duplication in writing documentation for repetitive\n"
    +"code, YARD introduces \"reference tags\", which are not quite tags, but not\n"
    +"quite docstrings either. In a sense, they are tag (and docstring) "
    +"modifiers.\n"
    +"Basically, any docstring (or tag) that begins with \"(see OTHEROBJECT)\" "
    +"will\n"
    +"implicitly link the docstring or tag to the \"OTHEROBJECT\", copying any "
    +"data\n"
    +"from that docstring/tag into your current object. Consider the example:"
    +msgstr ""
    +"繰り返しの多いドキュメント中の重複の総量を減少させるために、\n"
    +"YARDはタグでもdocstringsでもない\"参照タグ\"を導入する。\n"
    +"ある意味で、それらのタグ(とdocstring)の修飾となる。\n"
    +"基本的には、\"(see OTHEROBJECT)\"から始まるdocstring(又はタグ)は\n"
    +"\"OTHEROBJECT\"に暗黙的にリンクされる。これによって\n"
    +"何らかのデータをdocstringやタグからあなたの作業オブジェクトの中へコピーするこ"
    +"とができる。\n"
    +"例を考えてみる。"
    +
    +#: ../docs/GettingStarted.md:106
    +msgid ""
    +"    class MyWebServer\n"
    +"      # Handles a request\n"
    +"      # @param [Request] request the request object\n"
    +"      # @return [String] the resulting webpage\n"
    +"      def get(request) \"hello\" end"
    +msgstr ""
    +"    class MyWebServer\n"
    +"      # リクエストを操作する\n"
    +"      # @param [Request] request the request object\n"
    +"      # @return [String] the resulting webpage\n"
    +"      def get(request) \"hello\" end"
    +
    +#: ../docs/GettingStarted.md:112
    +msgid ""
    +"      # (see #get)\n"
    +"      def post(request) \"hello\" end\n"
    +"    end"
    +msgstr ""
    +"      # (see #get)\n"
    +"      def post(request) \"hello\" end\n"
    +"    end"
    +
    +#: ../docs/GettingStarted.md:116
    +msgid ""
    +"The above `#post` method takes the docstring and all tags (`param` and "
    +"`return`)\n"
    +"of the `#get` method. When you generate HTML documentation, you will see "
    +"this\n"
    +"duplication automatically, so you don't have to manually type it out. We "
    +"can\n"
    +"also add our own custom docstring information below the \"see\" reference, "
    +"and\n"
    +"whatever we write will be appended to the docstring:"
    +msgstr ""
    +"上の `#post` メソッドは `#get` メソッドのdocstrigと\n"
    +"全てのタグ( `param` 及び `return` )を取得する。\n"
    +"HTMLドキュメントを生成する時には、\n"
    +"`#get` メソッドのタグの内容が自動的に複製されるので、\n"
    +"あなたが手でタイプする必要は無い。\n"
    +"また\"see\"の参照の下に、自分でカスタマイズしたdocstring情報を追加できる。\n"
    +"そして、以下の例の様に、\n"
    +"私達が書くものがどんなものでも、docstringに追加される。"
    +
    +#: ../docs/GettingStarted.md:122
    +msgid ""
    +"    # (see #get)\n"
    +"    # @note This method may modify our application state!\n"
    +"    def post(request) self.state += 1; \"hello\" end"
    +msgstr ""
    +"    # (see #get)\n"
    +"    # @note このメソッドはアプリケーションの状態が変更されるかもしれない\n"
    +"    def post(request) self.state += 1; \"hello\" end"
    +
    +#: ../docs/GettingStarted.md:126
    +msgid ""
    +"Here we added another tag, but we could have also added plain text. The\n"
    +"text must be appended *after* the `(see ...)` statement, preferably on\n"
    +"a separate line."
    +msgstr ""
    +"ここでは他のタグ(@note)を追加したが、他に簡単なテキストを持つこともできる。\n"
    +"その時はできればテキストを、`(see ...)`ステートメントの次の行に追加すべきである。"
    +
    +#: ../docs/GettingStarted.md:130
    +msgid ""
    +"Note that we don't have to \"refer\" the whole docstring. We can also link\n"
    +"individual tags instead. Since \"get\" and \"post\" actually have different\n"
    +"descriptions, a more accurate example would be to only refer our parameter\n"
    +"and return tags:"
    +msgstr ""
    +"次の事に留意する。\n"
    +"必ずしもdocstring全体を\"参照\"する必要はなく、\n"
    +"代わりに個々のタグをリンクすることができる。\n"
    +"実際に異なる説明を持っている\"get\"と\"post\"から、\n"
    +"より正確な例はパラメータやリターンタグ参照だけになる。"
    +
    +#: ../docs/GettingStarted.md:135
    +msgid ""
    +"    class MyWebServer\n"
    +"      # Handles a GET request\n"
    +"      # @param [Request] request the request object\n"
    +"      # @return [String] the resulting webpage\n"
    +"      def get(request) \"hello\" end"
    +msgstr ""
    +"    class MyWebServer\n"
    +"      # GETリクエストを操作する\n"
    +"      # @param [Request] request the request object\n"
    +"      # @return [String] the resulting webpage\n"
    +"      def get(request) \"hello\" end"
    +
    +#: ../docs/GettingStarted.md:141
    +msgid ""
    +"      # Handles a POST request\n"
    +"      # @note This method may modify our application state!\n"
    +"      # @param (see #get)\n"
    +"      # @return (see #get)\n"
    +"      def post(request) self.state += 1; \"hello\" end\n"
    +"    end"
    +msgstr ""
    +"      # POSTリクエストを操作する\n"
    +"      # @note This method may modify our application state!\n"
    +"      # @param (see #get)\n"
    +"      # @return (see #get)\n"
    +"      def post(request) self.state += 1; \"hello\" end\n"
    +"    end"
    +
    +#: ../docs/GettingStarted.md:148
    +msgid ""
    +"The above copies all of the param and return tags from `#get`. Note that "
    +"you\n"
    +"cannot copy individual tags of a specific type with this syntax."
    +msgstr ""
    +"上の構文は、 `#get` から@paramタグと@returnタグの全ての情報をコピーする。\n"
    +"次の事に留意する。\n"
    +"この構文を用いても特定の型の個々のタグをコピーできない。"
    +
    +#: ../docs/GettingStarted.md:151
    +msgid "## Declaring Types"
    +msgstr "## 型を宣言する"
    +
    +#: ../docs/GettingStarted.md:153
    +msgid ""
    +"Some tags also have an optional \"types\" field which let us declare a list "
    +"of\n"
    +"types associated with the tag. For instance, a return tag can be declared\n"
    +"with or without a types field."
    +msgstr ""
    +"いくつかのタグは省略可能な\"型\"フィールドも持つ。\n"
    +"それは関連する型のリストを宣言する場所となる。\n"
    +"例えば、@returnタグは、\n"
    +"型フィールドがあってもなくても宣言できる。"
    +
    +#: ../docs/GettingStarted.md:157
    +msgid ""
    +"    # @return [String, nil] the contents of our object or nil\n"
    +"    #   if the object has not been filled with data.\n"
    +"    def validate; end"
    +msgstr ""
    +"    # @return [String, nil] オブジェクトやnilとなる。\n"
    +"    #   nilはデータと共に内容が入っていない場合になる。(ここまでreturnのコメ"
    +"ント)\n"
    +"    def validate; end"
    +
    +#: ../docs/GettingStarted.md:161
    +msgid ""
    +"    # We don't care about the \"type\" here:\n"
    +"    # @return the object\n"
    +"    def to_obj; end"
    +msgstr ""
    +"    # 以下の様に\"型\"を気にする必要はない\n"
    +"    # @return the object\n"
    +"    def to_obj; end"
    +
    +#: ../docs/GettingStarted.md:165
    +msgid ""
    +"The list of types is in the form `[type1, type2, ...]` and is mostly free-"
    +"form,\n"
    +"so we can also specify duck-types or constant values. For example:"
    +msgstr ""
    +"この型のリストは `[type1, type2, ...]` の形式である。\n"
    +"そして大部分はフリーフォームとなる。\n"
    +"したがってダックタイプ、又は、定数を指定する。\n"
    +"例えば、"
    +
    +#: ../docs/GettingStarted.md:168
    +msgid ""
    +"    # @param [#to_s] argname any object that responds to `#to_s`\n"
    +"    # @param [true, false] argname only true or false"
    +msgstr ""
    +"    # @param [#to_s] argname any object that responds to `#to_s`\n"
    +"    # @param [true, false] argname only true or false"
    +
    +#: ../docs/GettingStarted.md:171
    +msgid ""
    +"Note the latter example can be replaced by the meta-type \"Boolean\".\n"
    +"Another meta-type is \"void\", which stands for \"no meaningful value\"\n"
    +"and is used for return values. These meta-types are by convention\n"
    +"only, but are recommended."
    +msgstr ""
    +"次の事に留意する。\n"
    +"後の例は、メタタイプの\"Boolean\"によって置換される。\n"
    +"他のメタタイプは\"void\"で\"意味のない値\"用であり、戻り値用に利用される。\n"
    +"これらのメタタイプは慣習で利用されるだけだが推奨される。"
    +
    +#: ../docs/GettingStarted.md:176
    +msgid ""
    +"List types can be specified in the form `CollectionClass`.\n"
    +"For instance, consider the following Array that holds a set of Strings and\n"
    +"Symbols:"
    +msgstr ""
    +"型のリストは、`CollectionClass`形式の中で指定されることができる。\n"
    +"例として、以下のArrayはStringそしてSymbolのセットをもっていると考える。"
    +
    +#: ../docs/GettingStarted.md:180
    +msgid ""
    +"    # @param [Array] list the list of strings and symbols."
    +msgstr "    # @param [Array] list the list of strings and symbols."
    +
    +#: ../docs/GettingStarted.md:182
    +msgid ""
    +"We mentioned that these type fields are \"mostly\" free-form. In truth, "
    +"they\n"
    +"are defined \"by convention\". To view samples of common type "
    +"specifications\n"
    +"and recommended conventions for writing type specifications, see\n"
    +"[http://yardoc.org/types.html](http://yardoc.org/types.html). Note that "
    +"these\n"
    +"conventions may change every now and then, although we are working on a "
    +"more\n"
    +"\"formal\" type specification proposal."
    +msgstr ""
    +"我々が述べてきたこれらのフィールドの型は殆どがフリーフォームである。\n"
    +"実のところ,それらは慣習によって定義される。\n"
    +"型の指定用に一般的な型指定の例や推奨される慣習を調べるには、\n"
    +"[http://yardoc.org/types.html](http://yardoc.org/types.html)を参照\n"
    +"これらの慣習はいつの日か変更されるかもしれない、\n"
    +"けれども我々はより正式な型指定の提案に取りかかっている。"
    +
    +#: ../docs/GettingStarted.md:189
    +msgid "## Documenting DSL Methods"
    +msgstr "## DSLメソッドを記述する"
    +
    +#: ../docs/GettingStarted.md:191
    +msgid ""
    +"Application code in Ruby often makes use of DSL style metaprogrammed "
    +"methods.\n"
    +"The most common is the `attr_accessor` method, which of course has built-in\n"
    +"support in YARD. However, frameworks and libraries often expose custom\n"
    +"methods that perform similar metaprogramming tasks, and it is often useful\n"
    +"to document their functionality in your application. Consider the "
    +"`property`\n"
    +"method in a project like [DataMapper](http://datamapper.org), which creates\n"
    +"a typed attribute for a database model. The code might look like:"
    +msgstr ""
    +"Rubyの中のアプリケーションコードは、\n"
    +"DSLスタイルのメタプログラミングしたメソッドをよく利用する。\n"
    +"最も一般的なのは、 `attr_accessor` メソッドで、\n"
    +"もちろんYARDの中でビルトインサポートされている。\n"
    +"とはいうものの、フレームワークやライブラリでは、\n"
    +"大抵似たようなメタプログラミング作業を実行するカスタムメソッドを目にする。\n"
    +"そして、それはアプリケーションの中にある機能を記述する為に便利である。\n"
    +"[DataMapper](http://datamapper.org)のようにプロジェクトの中の `property` メソッドを考え、\n"
    +"そして、データベースモデル用の属性の型を作成すると\n"
    +"コー​​ドは次のようになる。"
    +
    +#: ../docs/GettingStarted.md:199 ../docs/GettingStarted.md:209
    +#: ../docs/GettingStarted.md:263 ../docs/GettingStarted.md:293
    +msgid ""
    +"    class Post\n"
    +"      include DataMapper::Resource"
    +msgstr ""
    +"    class Post\n"
    +"      include DataMapper::Resource"
    +
    +#: ../docs/GettingStarted.md:202
    +msgid ""
    +"      property :title, String\n"
    +"    end"
    +msgstr ""
    +"      property :title, String\n"
    +"    end"
    +
    +#: ../docs/GettingStarted.md:205
    +msgid ""
    +"As of version 0.7.0, YARD will automatically pick up on these basic methods "
    +"if\n"
    +"you document them with a docstring. Therefore, simply adding some comments "
    +"to\n"
    +"the code will cause it to generate documentation:"
    +msgstr ""
    +"0.7.0版の時点で、もしあなたが今まで紹介した例のdocstringを記述した場合、\n"
    +"YARDは組み込みの基本メソッドによって自動的に取得するだろう。\n"
    +"したがって、簡単にドキュメントを生成しいくつかのコメントを追加するには、\n"
    +"以下の様に記述できる。"
    +
    +#: ../docs/GettingStarted.md:212
    +msgid ""
    +"      # @return [String] the title property of the post\n"
    +"      property :title, String\n"
    +"    end"
    +msgstr ""
    +"      # @return [String] the title property of the post\n"
    +"      property :title, String\n"
    +"    end"
    +
    +#: ../docs/GettingStarted.md:216
    +msgid ""
    +"Note that YARD uses the first argument in the method call to determine the\n"
    +"method name. In some cases, this would not be the method name, and you "
    +"would\n"
    +"need to declare it manually. You can do so with the `@!method` directive:"
    +msgstr ""
    +"次の事に留意する。\n"
    +"YARDはメソッド名を決定するのに、メソッド呼び出しの最初に引数を使う。\n"
    +"もし、これがメソッド名でない場合、手動で宣言する必要がある。\n"
    +"下の`@method`タグで宣言を行うことができる。"
    +
    +#: ../docs/GettingStarted.md:220
    +msgid ""
    +"    # @!method foo\n"
    +"    create_a_foo_method"
    +msgstr ""
    +"    # @!method foo\n"
    +"    create_a_foo_method"
    +
    +#: ../docs/GettingStarted.md:223
    +msgid ""
    +"The @!method directive can also accept a full method signature with "
    +"parameters:"
    +msgstr ""
    +"@!method 命令は\n"
    +"完全なメソッドのシグネチャ受け入れる事もできる。"
    +
    +#: ../docs/GettingStarted.md:225
    +msgid ""
    +"    # @!method foo(name, opts = {})\n"
    +"    create_a_foo_method"
    +msgstr ""
    +"    # @!method foo(name, opts = {})\n"
    +"    create_a_foo_method"
    +
    +#: ../docs/GettingStarted.md:228
    +msgid ""
    +"You can also set visibility and scope, or modify the method signature with\n"
    +"extra tags. The following adds documentation for a private class method:"
    +msgstr ""
    +"あなたは可視性やスコープも設定できたり、\n"
    +"追加のタグを用いメソッド用法を変更できる。\n"
    +"以下は、privateクラスメソッドに対してドキュメントに追加する。"
    +
    +#: ../docs/GettingStarted.md:231
    +msgid ""
    +"    # @!method foo(opts = {})\n"
    +"    # The foo method!\n"
    +"    # @!scope class\n"
    +"    # @!visibility private\n"
    +"    create_a_private_foo_class_method"
    +msgstr ""
    +"    # @!method foo(opts = {})\n"
    +"    # The foo method!\n"
    +"    # @!scope class\n"
    +"    # @!visibility private\n"
    +"    create_a_private_foo_class_method"
    +
    +#: ../docs/GettingStarted.md:237
    +msgid ""
    +"Finally, you can tag a method as an attribute by replacing the @!method\n"
    +"tag with @!attribute. The @!attribute directive allows for the flags [r], "
    +"[w],\n"
    +"or [rw] to declare a readonly, writeonly, or readwrite attribute, "
    +"respectively."
    +msgstr ""
    +"最終的に、@!attributeタグを用い@!methodタグを\n"
    +"置換する事によって属性の様にメソッドのタグが出来る。\n"
    +"読み込み専用,書込み専用,読み書きOK,個々に指定を宣言する為に\n"
    +"@!attribute指令は[r], [w], [rw]フラグ用に受け入れる\n"
    +
    +#: ../docs/GettingStarted.md:241
    +msgid ""
    +"    # @!attribute [w]\n"
    +"    # The writeonly foo attribute!\n"
    +"    a_writeonly_attribute :foo"
    +msgstr ""
    +"    # @!attribute [w]\n"
    +"    # The writeonly foo attribute!\n"
    +"    a_writeonly_attribute :foo"
    +
    +#: ../docs/GettingStarted.md:245
    +msgid ""
    +"(Note that if the name can be automatically detected, you do not need to\n"
    +"specify it in the @!method or @!attribute directives)"
    +msgstr ""
    +"(次のことに留意する。\n"
    +"名前が自動で認められる場合、@!methodや@!attributeタグの記入を\n"
    +"必要としないことに注意する。)"
    +
    +#: ../docs/GettingStarted.md:248
    +msgid "However, you will notice a few drawbacks with this basic support:"
    +msgstr ""
    +"とはいうものの、あなたはこの基本サポートの備えるいくつかの欠点に気づくだろ"
    +"う。"
    +
    +#: ../docs/GettingStarted.md:250
    +msgid ""
    +"1. There is a fair bit of duplication in such documentation. Specifically, "
    +"we\n"
    +"   repeat the term String and title twice in the property example.\n"
    +"2. We must write a code comment for this property to show up in the "
    +"documentation.\n"
    +"   If we do not write a comment, it is ignored."
    +msgstr ""
    +"1. このようなドキュメントでは重複を少し整形する。\n"
    +"   具体的には、繰り返しのString用語やproperty例の中の2度目のタイトル\n"
    +"2. 私達はドキュメントに表示する為、propertyでコードのコメントを書かなければな"
    +"らない。\n"
    +"   コメントを書かない場合、それは無視される。"
    +
    +#: ../docs/GettingStarted.md:255
    +msgid "### Macros"
    +msgstr "### マクロ"
    +
    +#: ../docs/GettingStarted.md:257
    +msgid ""
    +"Fortunately YARD 0.7.0 also adds macros, a powerful way to add support for\n"
    +"these DSL methods on the fly without writing extra plugins. Macros allow\n"
    +"you to interpolate arguments from the method call inside the docstring,\n"
    +"reducing duplication. If we re-wrote the `property` example from above\n"
    +"using a macro, it might look like:"
    +msgstr ""
    +"幸運にも、YARD 0.7.0はマクロも追加する。\n"
    +"これらのDSLメソッドは余計なプラグインを記述することなく\n"
    +"オンザフライでサポートを追加する為の強力な方法となる。\n"
    +"マクロは重複を減らしたり、docstring内部のメソッド\n"
    +"呼び出しから引数を挿入することを可能にする。\n"
    +"もし私達が、例の`property`をマクロを用いて書き直した場合は、\n"
    +"次のようになる。"
    +
    +#: ../docs/GettingStarted.md:266
    +msgid ""
    +"      # @!macro dm.property\n"
    +"      # @return [$2] the $1 $0 of the post\n"
    +"      property :title, String\n"
    +"    end"
    +msgstr ""
    +"      # @!macro dm.property\n"
    +"      # @return [$2] the $1 $0 of the post\n"
    +"      property :title, String\n"
    +"    end"
    +
    +#: ../docs/GettingStarted.md:271
    +msgid ""
    +"(Note that $0 represents the method call, in this case `property`. The rest\n"
    +"are arguments in the method call.)"
    +msgstr ""
    +"(次の事に留意する。\n"
    +"$0はメソッド呼び出しを表す、この場合は`property`となる。\n"
    +"残りはメソッド呼び出しの引数となる。)"
    +
    +#: ../docs/GettingStarted.md:274
    +msgid ""
    +"The above example is equivalent to the first version shown in the previous\n"
    +"section. There is also some extra benefit to using this macro, in that we\n"
    +"can re-apply it to any other property in our class by simply calling on\n"
    +"the macro. The following:"
    +msgstr ""
    +"上の例は、前項の中の最初の訳文と等しい。\n"
    +"このマクロを使うことによっていくつかの特別な恩恵もある。\n"
    +"それは、マクロを簡単に呼び出すことによって、\n"
    +"例のクラスの中の他のpropertyに最適用できる。\n"
    +"以下の例は、"
    +
    +#: ../docs/GettingStarted.md:279
    +msgid ""
    +"    # @!macro dm.property\n"
    +"    property :view_count, Integer"
    +msgstr ""
    +"    # @!macro dm.property\n"
    +"    property :view_count, Integer"
    +
    +#: ../docs/GettingStarted.md:282
    +msgid "Would be equivalent to:"
    +msgstr "下と同等になる。"
    +
    +#: ../docs/GettingStarted.md:284
    +msgid ""
    +"    # @return [Integer] the view_count property of the post\n"
    +"    property :view_count, Integer"
    +msgstr ""
    +"    # @return [Integer] the view_count property of the post\n"
    +"    property :view_count, Integer"
    +
    +#: ../docs/GettingStarted.md:287
    +msgid ""
    +"Finally, macros can be \"attached\" to method calls, allowing them to be "
    +"implicitly\n"
    +"activated every time the method call is seen in the source code of the "
    +"class,\n"
    +"or an inheriting class. By simply adding the `[attach]` flag, the macro\n"
    +"becomes implicit on future calls. All of the properties below get "
    +"documented\n"
    +"by using this snippet:"
    +msgstr ""
    +"最終的に、メソッド呼び出しの為に\"追加\"されるマクロは、\n"
    +"クラスや継承クラスのソースコードの中で見られるメソッド呼び出しを\n"
    +"いつでも起動できる様に実装される。\n"
    +"単に `[attach]` フラグを追加することで、\n"
    +"そのマクロは将来の呼び出しで暗黙的に呼び出される。\n"
    +"下記のすべてのpropertyは、このスニペットを使用してドキュメントになる。"
    +
    +#: ../docs/GettingStarted.md:296
    +msgid ""
    +"      # @!macro [attach] dm.property\n"
    +"      # @return [$2] the $1 $0 of the post\n"
    +"      property :title, String\n"
    +"      property :view_count, Integer\n"
    +"      property :email, String\n"
    +"    end"
    +msgstr ""
    +"      # @!macro [attach] dm.property\n"
    +"      # @return [$2] the $1 $0 of the post\n"
    +"      property :title, String\n"
    +"      property :view_count, Integer\n"
    +"      property :email, String\n"
    +"    end"
    +
    +#: ../docs/GettingStarted.md:303
    +msgid ""
    +"You can read more about macros in the {file:docs/Tags.md Tags Overview} "
    +"document."
    +msgstr ""
    +"もっとマクロについて知りたい場合は\n"
    +"{file:docs/Tags.md Tags Overview}ドキュメントの中で読むことができる。"
    +
    +#: ../docs/GettingStarted.md:305
    +msgid "## Customized YARD Markup"
    +msgstr "## YARDマークアップのカスタマイズ"
    +
    +#: ../docs/GettingStarted.md:307
    +msgid ""
    +"YARD supports a special syntax to link to other code objects, URLs, files,\n"
    +"or embed docstrings between documents. This syntax has the general form\n"
    +"of `{Name OptionalTitle}` (where `OptionalTitle` can have spaces, but "
    +"`Name`\n"
    +"cannot)."
    +msgstr ""
    +"YARDは他のコードオブジェクト、URL、ファイル、\n"
    +"ドキュメントの間で組み込むdocstringへのリンクの特別な構文をサポートする。\n"
    +"この構文は、`{Name OptionalTitle}`の一般的な型を持っている。\n"
    +"(`OptionalTitle`内でスペースを入れることはできるが、\n"
    +" `Name`は入れることができない)"
    +
    +#: ../docs/GettingStarted.md:312
    +msgid "### Linking Objects `{...}`"
    +msgstr "### オブジェクトのリンク `{...}`"
    +
    +#: ../docs/GettingStarted.md:314
    +msgid ""
    +"To link another \"object\" (class, method, module, etc.), use the format:"
    +msgstr ""
    +"他の\"オブジェクト\"(クラス、メソッド、モジュール、 etc.)へのリンクには、\n"
    +"以下の書式を使う:"
    +
    +#: ../docs/GettingStarted.md:316
    +msgid ""
    +"    {ObjectName#method OPTIONAL_TITLE}\n"
    +"    {Class::CONSTANT My constant's title}\n"
    +"    {#method_inside_current_namespace}"
    +msgstr ""
    +"    {ObjectName#method OPTIONAL_TITLE}\n"
    +"    {Class::CONSTANT My constant's title}\n"
    +"    {#method_inside_current_namespace}"
    +
    +#: ../docs/GettingStarted.md:320
    +msgid ""
    +"Without an explicit title, YARD will use the relative path to the object as\n"
    +"the link name. Note that you can also use relative paths inside the object\n"
    +"path to refer to an object inside the same namespace as your current "
    +"docstring."
    +msgstr ""
    +"明確なタイトルが無い時、YARDはオブジェクトのリンク名に相対パスを使う。\n"
    +"次の事に留意する。\n"
    +"現在のdocstringのように同じnamespace内にあるオブジェクトを参照する為に、\n"
    +"そのオブジェクトパス内で相対パスを使える。"
    +
    +#: ../docs/GettingStarted.md:324
    +msgid ""
    +"Note that the `@see` tag automatically links its data. You should not use\n"
    +"the link syntax in this tag:"
    +msgstr ""
    +"次の事に留意する。`@see`タグは自動リンクとなるので、\n"
    +"このタグのなかでリンク構文を使うべきではない。"
    +
    +#: ../docs/GettingStarted.md:327
    +msgid ""
    +"    # @see #methodname   <- Correct.\n"
    +"    # @see {#methodname} <- Incorrect."
    +msgstr ""
    +"    # @see #methodname   <- 正.\n"
    +"    # @see {#methodname} <- 誤."
    +
    +#: ../docs/GettingStarted.md:330
    +msgid "If you want to use a Hash, prefix the first { with \"!\":"
    +msgstr ""
    +"もしあなたがハッシュを使う為にプレフィックスに、\n"
    +"最初の{がほしい場合\"!\"を一緒につける。"
    +
    +#: ../docs/GettingStarted.md:332
    +msgid "   # !{ :some_key => 'value' }"
    +msgstr "   # !{ :some_key => 'value' }"
    +
    +#: ../docs/GettingStarted.md:334
    +msgid "### Linking URLs `{http://...}`"
    +msgstr "### URLのリンク `{http://...}`"
    +
    +#: ../docs/GettingStarted.md:336
    +msgid "URLs are also linked using this `{...}` syntax:"
    +msgstr "URLはこの`{...}`構文を用いリンクされる。"
    +
    +#: ../docs/GettingStarted.md:338
    +msgid ""
    +"    {http://example.com Optional Title}\n"
    +"    {mailto:email@example.com}"
    +msgstr ""
    +"    {http://example.com Optional Title}\n"
    +"    {mailto:email@example.com}"
    +
    +#: ../docs/GettingStarted.md:341
    +msgid "### Linking Files `{file:...}`"
    +msgstr "### ファイルのリンク `{file:...}`"
    +
    +#: ../docs/GettingStarted.md:343
    +msgid ""
    +"Files can also be linked using this same syntax but by adding the `file:`\n"
    +"prefix to the object name. Files refer to extra readme files you added\n"
    +"via the command-line. Consider the following examples:"
    +msgstr ""
    +"ファイルも同じ構文を使ってリンクされる、\n"
    +"しかし、オブジェクト名のプレフィックスに`file:`が追加される。\n"
    +"ファイルはあなたがコマンドライン経由で追加した特別なreadmeファイルを参照す"
    +"る。\n"
    +"次の例を考えてみる。"
    +
    +#: ../docs/GettingStarted.md:347
    +msgid ""
    +"    {file:docs/GettingStarted.md Getting Started}\n"
    +"    {file:mypage.html Name#anchor}"
    +msgstr ""
    +"    {file:docs/GettingStarted.md Getting Started}\n"
    +"    {file:mypage.html Name#anchor}"
    +
    +#: ../docs/GettingStarted.md:350
    +msgid ""
    +"As shown, you can also add an optional `#anchor` if the page is an HTML link."
    +msgstr ""
    +"上のように、\n"
    +"そのページがHTMLリンク可能な場合は省略可能な`#anchor`を追加できる。"
    +
    +#: ../docs/GettingStarted.md:352
    +msgid "### Embedding Docstrings `{include:...}`"
    +msgstr "### Docstringの組み込み `{include:...}`"
    +
    +#: ../docs/GettingStarted.md:354
    +msgid ""
    +"We saw the `(see ...)` syntax above, which allowed us to link an entire "
    +"docstring\n"
    +"with another. Sometimes, however, we just want to copy docstring text "
    +"without\n"
    +"tags. Using the same `{...}` syntax, but using the `include:` prefix, we "
    +"can\n"
    +"embed a docstring (minus tags) at a specific point in the text."
    +msgstr ""
    +"私達は上の`{see ...}`構文を見たが、\n"
    +"それは他と一緒にdocstring丸ごとリンクすることを可能にした。\n"
    +"とはいうものの、タグなしでdocstringのテキストコピーのみ欲しい場合がある。\n"
    +"そこで、同じ`{...}`構文と`include:`プレフィックスを用いると、\n"
    +"テキストの特定の場所で、タグなしのdocstringを組み込むことができる。"
    +
    +#: ../docs/GettingStarted.md:359
    +msgid ""
    +"    # This class is cool\n"
    +"    # @abstract\n"
    +"    class Foo; end"
    +msgstr ""
    +"    # This class is cool\n"
    +"    # @abstract\n"
    +"    class Foo; end"
    +
    +#: ../docs/GettingStarted.md:363
    +msgid ""
    +"    # This is another class. {include:Foo} too!\n"
    +"    class Bar; end"
    +msgstr ""
    +"    # This is another class. {include:Foo} too!\n"
    +"    class Bar; end"
    +
    +#: ../docs/GettingStarted.md:366
    +msgid "The docstring for Bar becomes:"
    +msgstr "docstringは次のようになる。"
    +
    +#: ../docs/GettingStarted.md:368
    +msgid "    \"This is another class. This class is cool too!\""
    +msgstr "    \"This is another class. This class is cool too!\""
    +
    +#: ../docs/GettingStarted.md:370
    +msgid "### Embedding Files `{include:file:...}`"
    +msgstr "### ファイルの埋め込み `{include:file:...}`"
    +
    +#: ../docs/GettingStarted.md:372
    +msgid ""
    +"You can embed the contents of files using `{include:file:path/to/file}`,\n"
    +"similar to the `{include:OBJECT}` tag above. If the file uses a specific "
    +"markup\n"
    +"type, it will be applied and embedded as marked up text. The following\n"
    +"shows how the tag can be used inside of comments:"
    +msgstr ""
    +"`{include:file:path/to/file}`は上の`{include:OBJECT}`タグと同様に\n"
    +"使う事によってファイルの内容を埋め込む事ができる。\n"
    +"ファイルが特定のマークアップの型を使う場合は,\n"
    +"マークアップテキストとして埋め込まれ適用される。\n"
    +"次はコメントの内部で利用されるタグにどのようなものがあるか一覧する。"
    +
    +#: ../docs/GettingStarted.md:377
    +msgid ""
    +"    # Here is an example of a highlighted Ruby file:\n"
    +"    #\n"
    +"    # {include:file:examples/test.rb}"
    +msgstr ""
    +"    # これはハイライトされたRubyのファイルの例である\n"
    +"    #\n"
    +"    # {include:file:examples/test.rb}"
    +
    +#: ../docs/GettingStarted.md:381
    +msgid "### Rendering Objects `{render:...}`"
    +msgstr "### オブジェクトのレンダリング `{render:...}`"
    +
    +#: ../docs/GettingStarted.md:383
    +msgid ""
    +"Entire objects can also be rendered in place in documentation. This can be\n"
    +"used for guide-style documentation which does not document the entire "
    +"source\n"
    +"tree, but instead selectively renders important classes or methods. "
    +"Consider\n"
    +"the following documentation inside of a README file:"
    +msgstr ""
    +"全てのオブジェクトはドキュメントの適当な位置に表示される。\n"
    +"{render:...}はガイドスタイルドキュメント用に使われるが\n"
    +"それは全てのソースツリーを記述しない。\n"
    +"しかし、代わりに重要なクラスやメソッドを選択的に表示する。\n"
    +"以下のREADMEファイルの内部のドキュメントを考えてみる。"
    +
    +#: ../docs/GettingStarted.md:388
    +msgid ""
    +"    !!!plain\n"
    +"    = igLatinPay!"
    +msgstr ""
    +"    !!!plain\n"
    +"    = igLatinPay!"
    +
    +#: ../docs/GettingStarted.md:391
    +msgid ""
    +"    This library adds pig latin methods to the string class, allowing you\n"
    +"    to transform sentences into pig latin."
    +msgstr ""
    +"    このライブラリはstring classの為にpig latinメソッドを追加する。\n"
    +"    pig latinへ文を変換する事を可能にする。"
    +
    +#: ../docs/GettingStarted.md:394
    +msgid "    {render:String#pig_latin}"
    +msgstr "    {render:String#pig_latin}"
    +
    +#: ../docs/GettingStarted.md:396
    +msgid "    You can also un-pig-latin-ify a word or sentence:"
    +msgstr "    あなたは単語や文を以下の様にpig-latinにしないこともできる。"
    +
    +#: ../docs/GettingStarted.md:398
    +msgid "    {render:String#de_pig_latin}"
    +msgstr "    {render:String#de_pig_latin}"
    +
    +#: ../docs/GettingStarted.md:400
    +msgid ""
    +"The above would render the methods in place inside the README document,\n"
    +"allowing you to summarize a small library in a single file."
    +msgstr ""
    +"上のように書くと、READMEドキュメント内部の{}の中のメソッドを表示する。\n"
    +"これによって、一つのファイルの中にライブラリの説明を要約できる。"
    +
    +#: ../docs/GettingStarted.md:403
    +msgid ""
    +msgstr ""
    +
    +#: ../docs/GettingStarted.md:405
    +msgid "## Using YARD to Generate Documentation"
    +msgstr "## ドキュメントを生成するYARDの使い方"
    +
    +#: ../docs/GettingStarted.md:407
    +msgid "### `yard` Executable"
    +msgstr "### 実行可能な`yard`コマンド"
    +
    +#: ../docs/GettingStarted.md:409
    +msgid ""
    +"YARD ships with a single executable aptly named `yard`. In addition to\n"
    +"generating standard documentation for your project, you would use this tool\n"
    +"if you wanted to:"
    +msgstr ""
    +"YARDは単一で適切に実行可能な'yard'コマンドとして送り出す。\n"
    +"あなたのプロジェクトの為の標準のドキュメントを生成することに加え、\n"
    +"次のツールも使える。"
    +
    +#: ../docs/GettingStarted.md:413
    +msgid ""
    +"* Document all installed gems\n"
    +"* Run a local documentation server\n"
    +"* Generate UML diagrams using [Graphviz][graphviz]\n"
    +"* View `ri`-style documentation\n"
    +"* Diff your documentation\n"
    +"* Analyze documentation statistics."
    +msgstr ""
    +"* 全てのインストール済のジェムを記述する\n"
    +"* ローカルドキュメントサーバーを起動する\n"
    +"* [Graphviz][graphviz]によってUML図を生成する\n"
    +"* `ri`スタイルドキュメントを一覧する\n"
    +"* あなたのドキュメントの差分を見る\n"
    +"* ドキュメントの統計を解析する"
    +
    +#: ../docs/GettingStarted.md:420
    +msgid ""
    +"The following commands are available in YARD 0.6.x (see `yard help` for a\n"
    +"full list):"
    +msgstr ""
    +"以下のコマンドは、YARD 0.6.xで利用できる。\n"
    +"(`yard help`コマンドで全てのリストが見れる)"
    +
    +#: ../docs/GettingStarted.md:423
    +msgid "    Usage: yard  [options]"
    +msgstr ""
    +"    !!!plain\n"
    +"    Usage: yard <コマンド> [オプション...]"
    +
    +#: ../docs/GettingStarted.md:425
    +msgid ""
    +"    Commands:\n"
    +"    config   Views or edits current global configuration\n"
    +"    diff     Returns the object diff of two gems or .yardoc files\n"
    +"    doc      Generates documentation\n"
    +"    gems     Builds YARD index for gems\n"
    +"    graph    Graphs class diagram using Graphviz\n"
    +"    help     Retrieves help for a command\n"
    +"    ri       A tool to view documentation in the console like `ri`\n"
    +"    server   Runs a local documentation server\n"
    +"    stats    Prints documentation statistics on a set of files"
    +msgstr ""
    +"    Commands:\n"
    +"    config   設定を見るか、現在の全体的な構成を編集する\n"
    +"    diff     2つのgemsまたは、'.yardoc'ファイルのオブジェクトの差分を返す\n"
    +"    doc      ドキュメントを生成する\n"
    +"    gems     gemsにYARDのインデックスを組み込む\n"
    +"    graph    Graphvizを用いてクラス図を図示する\n"
    +"    help     ヘルプコマンド\n"
    +"    ri       `ri`のようにコンソールの中でドキュメントを作成する\n"
    +"    server   ローカルなドキュメント作成サーバーを起動する\n"
    +"    stats    設定したファイルのドキュメントのステータスを出力する"
    +
    +#: ../docs/GettingStarted.md:436
    +msgid ""
    +"Note that `yardoc` is an alias for `yard doc`, and `yri` is an alias for\n"
    +"`yard ri`. These commands are maintained for backwards compatibility."
    +msgstr ""
    +"次の事に留意する。\n"
    +"`yardoc`は、`yard doc`コマンドのエイリアスで,\n"
    +"`yri`は`yard ri`コマンドのエイリアスとなる。\n"
    +"これらのコマンドは、後方互換が維持されている。"
    +
    +#: ../docs/GettingStarted.md:439
    +msgid "### `.yardopts` Options File"
    +msgstr "### `.yardopts` 設定ファイル"
    +
    +#: ../docs/GettingStarted.md:441
    +msgid ""
    +"Unless your documentation is very small, you'll end up needing to run "
    +"`yardoc`\n"
    +"with many options.  The `yardoc` tool will use the options found in this "
    +"file.\n"
    +"It is recommended to check this in to your repository and distribute it "
    +"with\n"
    +"your source. This file is placed at the root of your project (in the "
    +"directory\n"
    +"you run `yardoc` from) and contains all of arguments you would otherwise "
    +"pass\n"
    +"to the command-line tool. For instance, if you often type:"
    +msgstr ""
    +"ドキュメントが小さくない限り、\n"
    +"結局`yardoc`コマンドと一緒にたくさんの設定を必要としているだろう。\n"
    +"`yardoc`コマンドは.yardoptsファイルの中で見つけた設定を使う。\n"
    +"その為、あなたのリポジトリに入れてソースと一緒に配布することを推奨する。\n"
    +"このファイルはあなたのプロジェクトのルートに位置する。\n"
    +"(あなたが`yardoc`を起動するディレクトリの中からの)\n"
    +"そして、全ての引数を含んでなければコマンドラインではパスしないだろう。\n"
    +"例えば、以下をよくタイプするならば、"
    +
    +#: ../docs/GettingStarted.md:448
    +msgid "    yardoc --no-private --protected app/**/*.rb - README LEGAL COPYING"
    +msgstr "    yardoc --no-private --protected app/**/*.rb - README LEGAL COPYING"
    +
    +#: ../docs/GettingStarted.md:450
    +msgid "You can place the following into your `.yardopts`:"
    +msgstr "下の内容を`.yardopts`の中へ書くことで設定できる。"
    +
    +#: ../docs/GettingStarted.md:452
    +msgid "    --no-private --protected app/**/*.rb - README LEGAL COPYING"
    +msgstr "    --no-private --protected app/**/*.rb - README LEGAL COPYING"
    +
    +#: ../docs/GettingStarted.md:454
    +msgid "This way, you only need to type:"
    +msgstr "この方法を用いると、以下をタイプするだけでよい。"
    +
    +#: ../docs/GettingStarted.md:456
    +msgid "    yardoc"
    +msgstr "    yardoc"
    +
    +#: ../docs/GettingStarted.md:458
    +msgid ""
    +"Any extra switches passed to the command-line now will be appended to your\n"
    +"`.yardopts` options."
    +msgstr "あなたの`.yardopts`設定にコマンドラインに渡された引数は追加される。"
    +
    +#: ../docs/GettingStarted.md:461
    +msgid ""
    +"Note that options for `yardoc` are discussed in the {file:README.md "
    +"README},\n"
    +"and a full overview of the `.yardopts` file can be found in {YARD::CLI::"
    +"Yardoc}."
    +msgstr ""
    +"次の事に留意する。\n"
    +"`yardoc`用のオプションは {file:README.md README} の中で説明される。\n"
    +"全ての`.yardopts`ファイルの概要は {YARD::CLI::Yardoc} の中で見つけられる。"
    +
    +#: ../docs/GettingStarted.md:464
    +msgid "### Documenting Extra Files"
    +msgstr "### 追加のファイルを記述する"
    +
    +#: ../docs/GettingStarted.md:466
    +msgid ""
    +"\"Extra files\" are extra guide style documents that help to give a brief "
    +"overview\n"
    +"of how to use your library/framework, as well as any extra information that\n"
    +"might be vital for your users. The most common \"extra file\" is the "
    +"README,\n"
    +"which is automatically detected by YARD if found in the root of your "
    +"project\n"
    +"(any file starting with `README*`). You can specify extra files on the "
    +"command\n"
    +"line (or in the `.yardopts` file) by listing them after the '-' separator:"
    +msgstr ""
    +"\"Extra files\"はライブラリやフレームワークで使うのにも、\n"
    +"ユーザーにとっての何らかの特別な情報にも、\n"
    +"簡単な概要を提供することを助ける\n"
    +"追加のガイドスタイルドキュメントとなる。\n"
    +"最も一般的な\"extra file\"はREADMEで、\n"
    +"それは、もしあなたのプロジェクトのルートの中で見つけた場合、YARDによって自動"
    +"で検出する。\n"
    +"(`README*`で始まる何らかのファイル)\n"
    +"以下の用に、追加のファイルの前に'-'セパレータを記述することによって\n"
    +"コマンドライン上で(又は,`.yardopts`ファイル内で)指定できる。"
    +
    +#: ../docs/GettingStarted.md:473
    +msgid "    yardoc lib/**/*.rb ext/**/*.c - LICENSE.txt"
    +msgstr "    yardoc lib/**/*.rb ext/**/*.c - LICENSE.txt"
    +
    +#: ../docs/GettingStarted.md:475
    +msgid ""
    +"Note that the README will automatically be picked up, so you do not need to\n"
    +"specify it. If you don't want to modify the default file globs, you can "
    +"ignore\n"
    +"the first set of arguments:"
    +msgstr ""
    +"次の事に留意する。\n"
    +"READMEは、自動で選択される。\n"
    +"従って、それを指定する必要はない。\n"
    +"もしデフォルトのファイルglobを変更しないなら\n"
    +"最初に設定する引数は無視できる。"
    +
    +#: ../docs/GettingStarted.md:479
    +msgid "    yardoc - LICENSE.txt"
    +msgstr "    yardoc - LICENSE.txt"
    +
    +#: ../docs/GettingStarted.md:481
    +msgid ""
    +"Below you can read about how to customize the look of these extra files, "
    +"both\n"
    +"with markup and pretty titles."
    +msgstr ""
    +"以降は追加のファイルをカスタマイズする方法について読むことができる。\n"
    +"これによってマークアップやいいタイトル両方を使用できる。"
    +
    +#: ../docs/GettingStarted.md:484
    +msgid "#### Adding Meta-Data to Extra Files"
    +msgstr "#### 追加のファイルにメタデータを追加する"
    +
    +#: ../docs/GettingStarted.md:486
    +msgid ""
    +"You can add YARD-style `@tag` metadata to the top of any extra file if "
    +"prefixed\n"
    +"by a `#` hash comment. YARD allows for arbitrary meta-data, but pays "
    +"special\n"
    +"attention to the tags `@markup`, `@encoding`, and `@title`. Note that there\n"
    +"cannot be any whitespace before the tags. Here is an example of some tag "
    +"data\n"
    +"in a README:"
    +msgstr ""
    +"`#`のハッシュコメントによってプレフィックスした場合、\n"
    +"任意の追加のファイルのトップにYARDスタイルの`@tag`メタデータを追加できる。\n"
    +"YARDは任意のメタデータを受け入れる。\n"
    +"しかし`@markup`,`@encoding`,`@title`タグには特別な注意を払わなければならない。\n"
    +"次の事に留意する。\n"
    +"タグの前に空白があってはならない。\n"
    +"これはREADMEの中のいくつかのタグデータの例:"
    +
    +#: ../docs/GettingStarted.md:492
    +msgid ""
    +"    # @markup markdown\n"
    +"    # @title The Best Library in the World!\n"
    +"    # @author The Author Name"
    +msgstr ""
    +"    # @markup markdown\n"
    +"    # @title The Best Library in the World!\n"
    +"    # @author The Author Name"
    +
    +#: ../docs/GettingStarted.md:496
    +msgid "    This is the best library you will ever meet. Lipsum ..."
    +msgstr "    これはあなたが出会う最高のライブラリとなる。以下略..."
    +
    +#: ../docs/GettingStarted.md:498
    +msgid ""
    +"The `@markup` tag allows you to specify a markup format to use for the "
    +"file,\n"
    +"including \"markdown\", \"textile\", \"rdoc\", \"ruby\", \"text\", \"html\", "
    +"or \"none\"\n"
    +"(no markup). This can be used when the markup cannot be auto-detected using\n"
    +"the extension of the filename, if the file has no extension, or if you want\n"
    +"to override the auto-detection."
    +msgstr ""
    +"`@markup`タグは、\"markdown\", \"textile\", \"rdoc\", \"ruby\", \n"
    +"\"text\", \"html\", \"none\"(no markup)を含んでいるファイルを扱えるよう、\n"
    +"マークアップ書式の指定を可能にする。\n"
    +"このマークアップはファイル名の拡張子を自動検出できなかった時や、\n"
    +"ファイル名の拡張子がない時や、\n"
    +"あなたが(拡張子の)自動検出を上書きしたい時に使われる。"
    +
    +#: ../docs/GettingStarted.md:504
    +msgid ""
    +"By using `@encoding` you can specify a non-standard encoding. Note that\n"
    +"`yardoc --charset` sets the global encoding (for all comments / files),\n"
    +"so if you are using unicode across all your files, you can specify it "
    +"there.\n"
    +"Using the `@encoding` tag might be used to override the default global\n"
    +"charset, say, if you had a localized `README.jp` file with SJIS data.\n"
    +"Also note that this only affects Ruby 1.9.x, as Ruby 1.8 is not properly\n"
    +"encoding aware."
    +msgstr ""
    +"`@encoding`を使用することによって、\n"
    +"あなたは非標準のエンコーディングを指定できる。\n"
    +"次の事に留意する。\n"
    +"`yardoc --charset`は全体のエンコーディングを設定する(全てのコメント/ファイル)、\n"
    +"なので、もしあなたが全てのファイルでユニコードを使っているならこれを指定できる。\n"
    +"例えば、ローカライズした`README.jp`ファイルとSJISデータをもっていたら\n"
    +"`@encoding`タグを使うことによって、default global charsetを上書きする為に\n"
    +"使うことができる。\n"
    +"又、これはRuby1.9.xにだけ作用する、\n"
    +"Ruby1.8については適切なエンコーディングになっていない。"
    +
    +#: ../docs/GettingStarted.md:512
    +msgid ""
    +"The `@title` tag allows you to specify a full title name for the document.\n"
    +"By default, YARD uses the filename as the title of the document and lists\n"
    +"it in the file list in the index and file menu. In some cases, the file "
    +"name\n"
    +"might not be descriptive enough, so YARD allows you to specify a full title:"
    +msgstr ""
    +"`@title`タグはそのドキュメントでフルタイトル名による指定を許可する。\n"
    +"デフォルトでは、YARDはドキュメントのタイトルにファイル名を使う。\n"
    +"そして、ファイルリストの中のインデックスやファイルメニューを列挙する。\n"
    +"一部の例では、ファイル名は十分に説明できないかもしれない、\n"
    +"その為、YARDはあなたがフルタイトルを指定することを認めている。"
    +
    +#: ../docs/GettingStarted.md:517
    +msgid ""
    +"    contents of TITLE.txt:\n"
    +"    # @title The Title of The Document"
    +msgstr ""
    +"    contents of TITLE.txt:\n"
    +"    # @title The Title of The Document"
    +
    +#: ../docs/GettingStarted.md:520
    +msgid ""
    +"Currently all other meta-data is hidden from view, though accessible\n"
    +"programmatically using the {YARD::CodeObjects::ExtraFileObject} class."
    +msgstr ""
    +"現在の全ての他のメタデータは一覧から隠される。そうはいうものの、\n"
    +"{YARD::CodeObjects::ExtraFileObject}クラスによってプログラムにアクセス可能である。"
    +
    +#: ../docs/GettingStarted.md:523
    +msgid ""
    +msgstr ""
    +
    +#: ../docs/GettingStarted.md:525
    +msgid "## Configuring YARD"
    +msgstr "## YARDを構成する"
    +
    +#: ../docs/GettingStarted.md:527
    +msgid ""
    +"YARD (0.6.2+) supports a global configuration file stored in `~/.yard/"
    +"config`.\n"
    +"This file is stored as a YAML file and can contain arbitrary keys and "
    +"values\n"
    +"that can be used by YARD at run-time. YARD defines specific keys that are "
    +"used\n"
    +"to control various features, and they are listed in {YARD::Config::"
    +"DEFAULT_CONFIG_OPTIONS}.\n"
    +"A sample configuration file might look like:"
    +msgstr ""
    +"YARD (0.6.2)以降は`~/.yard/config`の中に格納した全体構成ファイルをサポートす"
    +"る。\n"
    +"このファイルはYAMLファイルのように格納され、\n"
    +"任意のキーと実行時にYARDによって利用できる値を含むことができる。\n"
    +"YARDは様々な機能を制御する為に使われるので特定のキーを定義する。\n"
    +"それは{YARD::Config::DEFAULT_CONFIG_OPTIONS}の中で列挙される。\n"
    +"サンプルの設定ファイルは次のようになる。"
    +
    +#: ../docs/GettingStarted.md:533 ../docs/WhatsNew.md:759
    +msgid ""
    +"    :load_plugins: false\n"
    +"    :ignored_plugins:\n"
    +"      - my_plugin\n"
    +"      - my_other_plugin\n"
    +"    :autoload_plugins:\n"
    +"      - my_autoload_plugin\n"
    +"    :safe_mode: false"
    +msgstr ""
    +"    :load_plugins: false\n"
    +"    :ignored_plugins:\n"
    +"      - my_plugin\n"
    +"      - my_other_plugin\n"
    +"    :autoload_plugins:\n"
    +"      - my_autoload_plugin\n"
    +"    :safe_mode: false"
    +
    +#: ../docs/GettingStarted.md:541
    +msgid ""
    +"You can also view and edit these configuration options from the commandline\n"
    +"using the `yard config` command. To list your configuration, use `yard "
    +"config --list`.\n"
    +"To view a key, use `yard config ITEM`, and to set it, use `yard config ITEM "
    +"VALUE`."
    +msgstr ""
    +"`yard config`コマンドを使って調べたり、構成設定を編集することもできる。\n"
    +"構成をリストするには、`yard config --list`を使う。\n"
    +"キーを調べるには、`yard config ITEM`, や、その値を設定する為に`yard config "
    +"ITEM VALUE`を使う。"
    +
    +#: ../docs/GettingStarted.md:545
    +msgid ""
    +msgstr ""
    +
    +#: ../docs/GettingStarted.md:547
    +msgid "## Extending YARD"
    +msgstr "## YARDを拡張する"
    +
    +#: ../docs/GettingStarted.md:549
    +msgid ""
    +"There are many ways to extend YARD to support non-standard Ruby syntax "
    +"(DSLs),\n"
    +"add new meta-data tags or programmatically access the intermediate metadata\n"
    +"and documentation from code. An overview of YARD's full architecture can be\n"
    +"found in the {file:docs/Overview.md} document."
    +msgstr ""
    +"非標準のRuby構文(DSL)をサポートするのにYARDを拡張するための沢山の方法がある。\n"
    +"新しいメタデータタグの追加や\n"
    +"プログラム的に中間のメタデータにアクセスする方法、\n"
    +"コードから記述する方法など。\n"
    +"YARDの全体構造の概要は、\n"
    +"{file:docs/Overview.md}ドキュメントの中で見つけられる。"
    +
    +#: ../docs/GettingStarted.md:554
    +msgid ""
    +"For information on adding support for Ruby DSLs, see the {file:docs/Handlers."
    +"md}\n"
    +"and {file:docs/Parser.md} architecture documents."
    +msgstr ""
    +"RubyDSLサポートを追加する方法については、\n"
    +"{file:docs/Handlers.md}や{file:docs/Parser.md}構造のドキュメントを参照。"
    +
    +#: ../docs/GettingStarted.md:557
    +msgid "For information on adding extra tags, see {file:docs/Tags.md}."
    +msgstr "特別なタグを追加する方法は{file:docs/Tags.md}を参照。"
    +
    +#: ../docs/GettingStarted.md:559
    +msgid ""
    +"For information on accessing the data YARD stores about your documentation,\n"
    +"look at the {file:docs/CodeObjects.md} architecture document."
    +msgstr ""
    +"あなたのドキュメントについて格納したYARDのデータがアクセスする方法は、\n"
    +"{file:docs/CodeObjects.md}構造ドキュメント参照。"
    +
    +#: ../docs/GettingStarted.md:562
    +msgid ""
    +msgstr ""
    +
    +#: ../docs/GettingStarted.md:564
    +msgid "## Templating YARD"
    +msgstr "## YARDのテンプレートを作る"
    +
    +#: ../docs/GettingStarted.md:566
    +msgid ""
    +"In many cases you may want to change the style of YARD's templates or add "
    +"extra\n"
    +"information after extending it. The {file:docs/Templates.md} architecture\n"
    +"document covers the basics of how YARD's templating system works."
    +msgstr ""
    +"多くの場合、あなたがYARDテンプレートのスタイルを変える為や\n"
    +"特別な情報を後で拡張し追加する為に必要だろう。\n"
    +"{file:docs/Templates.md}構造ドキュメントは、\n"
    +"YARDテンプレートシステム作業の基本をカバーする。"
    +
    +#: ../docs/GettingStarted.md:570
    +msgid ""
    +msgstr ""
    +
    +#: ../docs/GettingStarted.md:572
    +msgid "## Plugin Support"
    +msgstr "## プラグインサポート"
    +
    +#: ../docs/GettingStarted.md:574
    +msgid ""
    +"As of 0.4, YARD will automatically load any gem named with the prefix of\n"
    +"`yard-` or `yard_`. You can use this to load a custom plugin that\n"
    +"[extend](#extending) YARD's functionality. A good example of this\n"
    +"is the [yard-rspec][yard-rspec] plugin, which adds [RSpec][rspec] "
    +"specifications\n"
    +"to your documentation (`yardoc` and `yri`). You can try it out by "
    +"installing\n"
    +"the gem or cloning the project and trying the example:"
    +msgstr ""
    +"0.4以降、YARDは`yard-`や `yard_`から始まる名前のgemを\n"
    +"自動でロードするだろう。あなたはカスタムプラグインをロードする為に\n"
    +"YARDの機能の[extend](#extending)を使える。\n"
    +"これの良い例は[yard-rspec][yard-rspec] プラグインで、\n"
    +"ドキュメント(`yardoc` and `yri`)に[RSpec][rspec]の仕様を追加する。\n"
    +"gemをインストールすることによって、\n"
    +"またはプロジェクトをクローンすることで試すことができる。\n"
    +"例を以下に示す。"
    +
    +#: ../docs/GettingStarted.md:581
    +msgid ""
    +"    $ gem install yard-rspec -s http://gemcutter.org\n"
    +"    or\n"
    +"    $ git clone git://github.com/lsegal/yard-spec-plugin"
    +msgstr ""
    +"    $ gem install yard-rspec -s http://gemcutter.org\n"
    +"    or\n"
    +"    $ git clone git://github.com/lsegal/yard-spec-plugin"
    +
    +#: ../docs/GettingStarted.md:585
    +msgid ""
    +"YARD also provides a way to temporarily disable plugins on a per-user "
    +"basis.\n"
    +"To disable a plugin create the file `~/.yard/ignored_plugins` with a list\n"
    +"of plugin names separated by newlines. Note that the `.yard` directory "
    +"might\n"
    +"not exist, so you may need to create it."
    +msgstr ""
    +"YARDはユーザーごとの基本のプラグインを\n"
    +"一時的に無効にする方法も提供する。\n"
    +"プラグインを無効にする為には、\n"
    +"`~/.yard/ignored_plugins`ファイルを作り\n"
    +"改行によって区切られた、プラグイン名をリストする。\n"
    +"次の事に留意する。\n"
    +"`.yard`ディレクトリは存在しない場合、\n"
    +"作成する必要がある。"
    +
    +#: ../docs/GettingStarted.md:590
    +msgid ""
    +"[graphviz]:http://www.graphviz.org\n"
    +"[yard-rspec]:http://github.com/lsegal/yard-spec-plugin\n"
    +"[rspec]:http://rspec.info"
    +msgstr ""
    +"[graphviz]:http://www.graphviz.org\n"
    +"[yard-rspec]:http://github.com/lsegal/yard-spec-plugin\n"
    +"[rspec]:http://rspec.info"
    +
    +# title
    +#: ../docs/Handlers.md:1
    +msgid "Handlers Architecture"
    +msgstr "ハンドラー構造"
    +
    +#: ../docs/Handlers.md:3
    +msgid "# Handlers Architecture"
    +msgstr "# ハンドラー構造"
    +
    +#: ../docs/Handlers.md:5
    +msgid ""
    +"Handlers allow the processing of parsed source code. Handling is done after\n"
    +"parsing to abstract away the implementation details of lexical and semantic\n"
    +"analysis on source and to only deal with the logic regarding recognizing\n"
    +"source statements as {file:docs/CodeObjects.md code objects}."
    +msgstr ""
    +"ハンドラーは、ソースコードを解析した処理を受け入れる。\n"
    +"これの処理は、実行する単語の詳細の抽象化を解析の後で行う。\n"
    +"そして、意味のあるソースの分析や、\n"
    +"ロジックに関しては{file:docs/CodeObjects.md code objects}のような\n"
    +"ソースステートメントの受け入れだけで扱う。"
    +
    +#: ../docs/Handlers.md:10
    +msgid ""
    +"![Handlers Architecture Class Diagram](images/handlers-class-diagram.png)"
    +msgstr "![Handlers Architecture Class Diagram](images/handlers-class-diagram.png)"
    +
    +#: ../docs/Handlers.md:12
    +msgid "## The Pipeline"
    +msgstr "## パイプライン"
    +
    +#: ../docs/Handlers.md:14
    +msgid ""
    +"After the {file:docs/Parser.md parser component} finishes analyzing the\n"
    +"source, it is handed off for post-processing to the {YARD::Handlers::"
    +"Processor}\n"
    +"class, which is responsible for traversing the set of statements given by\n"
    +"the parser and delegating them to matching handlers. Handlers match when "
    +"the\n"
    +"{YARD::Handlers::Base.handles?} method returns true for a given statement.\n"
    +"The handler can then perform any action after being invoked by the "
    +"`process`\n"
    +"method."
    +msgstr ""
    +"{file:docs/Parser.md parser component}がソースを解析すると、\n"
    +"後処理する為に{YARD::Handlers::Processor} クラスに渡す。\n"
    +"そしてパーサーによって与えるステートメントの設定を辿ったり、\n"
    +"ハンドラーがマッチしているステートメントを委譲する責任がある。\n"
    +"{YARD::Handlers::Base.handles?}メソッドがtrueを返す時、\n"
    +"ハンドラーがマッチしているステートメントを与える。\n"
    +"ハンドラーは`process`メソッドによって呼び出した後で任意の処理を実行できる。"
    +
    +#: ../docs/Handlers.md:22
    +msgid "## The Processor Class"
    +msgstr "## プロセッサークラス"
    +
    +#: ../docs/Handlers.md:24
    +msgid ""
    +"The main purpose of the processor, as mentioned above, is to traverse "
    +"through\n"
    +"the list of statements given to it by the parser. The processor also keeps\n"
    +"state about what is being processed. For instance, the processor is what "
    +"keeps\n"
    +"track of the current namespace (the module or class an object is being "
    +"defined\n"
    +"in), scope (class or instance), file and owner. The owner refers to the "
    +"object\n"
    +"that is most directly responsible for the source statement being processed. "
    +"This\n"
    +"is most often the same as the namespace, except when parsing the body of a "
    +"method,\n"
    +"where the namespace would be the class/module the method is defined in and "
    +"the\n"
    +"owner would be the method object itself."
    +msgstr ""
    +"主なプロセッサーの目的は、上で述べたように、\n"
    +"パーサーによって与えるステートメントのリストを通じて辿ることである。\n"
    +"プロセッサーは処理されている状態について管理する。\n"
    +"例えば、プロセッサーは現在の\n"
    +"ネームスペース(モジュールやオブジェクトのクラスが定義される)、\n"
    +"スコープ(クラスやインスタンス)、ファイルとオーナー\n"
    +"を追跡する。\n"
    +"オーナーは、オブジェクトを参照する。\n"
    +"そのオブジェクトは処理されるソースステートメントに最も直接的な責任を持つ。\n"
    +"これは(参照するオブジェクトの対象は)、多くの場合ネームスペースと同じで、\n"
    +"メソッドの本体を解析した時を除き、\n"
    +"そのネームスペースでは、クラスやモジュール,メソッドが定義される。\n"
    +"そしてオーナーはメソッドオブジェクト自体となる。"
    +
    +#: ../docs/Handlers.md:34
    +msgid "## Implementing a Handler"
    +msgstr "## ハンドラーを実装する"
    +
    +#: ../docs/Handlers.md:36
    +msgid ""
    +"This section covers the basics of implementing a *new-style* Ruby handler. "
    +"For\n"
    +"details on implementing a legacy handler, see the \"API Differences\" "
    +"section below."
    +msgstr ""
    +"このセクションは *新しいスタイル* Rubyハンドラー処理の基本をカバーする。\n"
    +"レガシーなハンドラーの詳細は、\"API Differences\" セクション以下を参照。"
    +
    +#: ../docs/Handlers.md:39
    +msgid ""
    +"a Ruby handler can be implemented simply by subclassing the {YARD::Handlers::"
    +"Ruby::Base}\n"
    +"class and declaring what node types or source to process with the {YARD::"
    +"Handlers::Base.handles handles}\n"
    +"class method. A very simple handler that handles a module definition would "
    +"be:"
    +msgstr ""
    +"Rubyハンドラーは処理の為に、\n"
    +"{YARD::Handlers::Base.handles handles}クラスメソッドを用い、\n"
    +"{YARD::Handlers::Ruby::Base}サブクラスや、\n"
    +"ノードタイプやソースを宣言することによって実行される。\n"
    +"モジュール定義の処理は次のような非常に簡単なハンドラーである。"
    +
    +#: ../docs/Handlers.md:43
    +msgid ""
    +"    class MyModuleHandler < YARD::Handlers::Ruby::Base\n"
    +"      handles :module"
    +msgstr ""
    +"    class MyModuleHandler < YARD::Handlers::Ruby::Base\n"
    +"      handles :module"
    +
    +#: ../docs/Handlers.md:46
    +msgid ""
    +"      def process\n"
    +"        puts \"Handling a module named #{statement[0].source}\"\n"
    +"      end\n"
    +"    end"
    +msgstr ""
    +"      def process\n"
    +"        puts \"Handling a module named #{statement[0].source}\"\n"
    +"      end\n"
    +"    end"
    +
    +#: ../docs/Handlers.md:51
    +msgid ""
    +"For details on what nodes are, and what node types are, see the\n"
    +"{file:docs/Parser.md parser architecture document}."
    +msgstr ""
    +"ノードやノードの型の詳細については、\n"
    +"{file:docs/Parser.md パーサー構造のドキュメント}を参照。"
    +
    +#: ../docs/Handlers.md:54
    +msgid ""
    +"In this case the node type being handled is the `:module` type. More than "
    +"one\n"
    +"node type or `handles` declarations may describe a single handler, for "
    +"instance,\n"
    +"a handler that handles class definitions should handle the `:class` and `:"
    +"sclass`\n"
    +"node types respectively (the latter refers to classes defined as `class << "
    +"Something`).\n"
    +"The {YARD::Handlers::Base#statement statement} attribute refers to the "
    +"current\n"
    +"node (or statement) that is being handled by the handler."
    +msgstr ""
    +"このケースの場合、処理されるノードタイプは `:module` タイプである。\n"
    +"複数のノードタイプや `handles` 宣言は一つのハンドラーを記述する。\n"
    +"例えば、ハンドラーはhandlesクラス定義が `:class` や\n"
    +"`:sclass` ノードタイプそれぞれを処理する。\n"
    +"(後者の:sclassは `class << Something` のようにクラス定義を参照する。)\n"
    +"{YARD::Handlers::Base#statement statement}属性は、\n"
    +"ハンドラーによって処理される現在のノード(やステートメントを)参照する。"
    +
    +#: ../docs/Handlers.md:61
    +msgid "### Handling a Method Call"
    +msgstr "### メソッド呼び出しの処理"
    +
    +#: ../docs/Handlers.md:63
    +msgid ""
    +"In some cases, a developer might need to handle a method call. The parser "
    +"can\n"
    +"express a method call in many AST forms, so to simplify this process, a "
    +"method\n"
    +"call can be handled by declaring the following in a `handles` statement:"
    +msgstr ""
    +"場合によって開発者は、メソッド呼び出し操作を必要とするかもしれない。\n"
    +"パーサーは多くのAST型(Abstract Syntax Tree)の中で、\n"
    +"メソッド呼び出しを表現できる。そして、この処理を簡素化する為に、\n"
    +"メソッド呼び出しは、次のような`handles`ステートメントの中で宣言される事によって処理される。"
    +
    +#: ../docs/Handlers.md:67
    +msgid ""
    +"    class MyHandler < YARD::Handlers::Ruby::Base\n"
    +"      handles method_call(:describe)"
    +msgstr ""
    +"    class MyHandler < YARD::Handlers::Ruby::Base\n"
    +"      handles method_call(:describe)"
    +
    +#: ../docs/Handlers.md:70
    +msgid ""
    +"      def process\n"
    +"        # Process the method call\n"
    +"      end\n"
    +"    end"
    +msgstr ""
    +"      def process\n"
    +"        # メソッド呼び出しを処理する\n"
    +"      end\n"
    +"    end"
    +
    +#: ../docs/Handlers.md:75
    +msgid ""
    +"In this case we handle any of the method calls to method name `describe` "
    +"with\n"
    +"the following syntaxes:"
    +msgstr ""
    +"このケースでは、私達はメソッド名`describe`メソッドの呼び出しを\n"
    +"次の構文のように処理できる。"
    +
    +#: ../docs/Handlers.md:78
    +msgid ""
    +"    describe(something)\n"
    +"    describe arg1, arg2, arg3\n"
    +"    describe(something) { perform_a_block }\n"
    +"    describe \"Something\" do\n"
    +"      a_block\n"
    +"    end"
    +msgstr ""
    +"    describe(something)\n"
    +"    describe arg1, arg2, arg3\n"
    +"    describe(something) { perform_a_block }\n"
    +"    describe \"Something\" do\n"
    +"      a_block\n"
    +"    end"
    +
    +#: ../docs/Handlers.md:85
    +msgid "### Creating a new Code Object"
    +msgstr "### 新しいコードオブジェクトを作成する"
    +
    +#: ../docs/Handlers.md:87
    +msgid ""
    +"Usually (but not always) handling is performed to create new code objects to "
    +"add\n"
    +"to the registry (for information about code objects, see {file:docs/"
    +"CodeObjects.md this document}).\n"
    +"Code objects should simply be created and added to the existing `namespace`. "
    +"This\n"
    +"will be enough to add them to the registry. There is also a convenience\n"
    +"{YARD::Handlers::Base#register register} method which quickly sets standard "
    +"attributed\n"
    +"on the newly created object, such as the file, line, source and docstring of "
    +"the\n"
    +"object. This method will be seen in the next example."
    +msgstr ""
    +"通常(しかし、いつもではない)の処理は、\n"
    +"レジストリーを追加する新しいコードオブジェクトの作成する為に実行される。\n"
    +"(コードオブジェクトについては{file:docs/CodeObjects.md このドキュメント}を参照)\n"
    +"コードオブジェクトは単純に既存の `namespace` に作成され追加される。\n"
    +"これは、レジストリにそれらを追加するために十分である。\n"
    +"便利な{YARD::Handlers::Base#register register}メソッドがあり、\n"
    +"これは新たに作成されるオブジェクト、ファイル、行、\n"
    +"ソースやオブジェクトのdocstringのような標準属性を素早く設定する。\n"
    +"このメソッドは次の例の中で見られるだろう。"
    +
    +#: ../docs/Handlers.md:95
    +msgid "### Handling an Inner Block"
    +msgstr "### 内部のブロックの操作"
    +
    +#: ../docs/Handlers.md:97
    +msgid ""
    +"By default, the parser gives the processor class a list of all the top "
    +"level\n"
    +"statements and the processor parses only those top level statements. If an "
    +"inner\n"
    +"block of a module, class, method declaration or even a block passed to a "
    +"method call\n"
    +"needs to be handled, the {YARD::Handlers::Base#parse_block parse_block} "
    +"method must be called on the list of statements\n"
    +"to parse. This will send the list to the processor to continue processing on "
    +"that\n"
    +"statement list. The source tree can be selectively parsed in this manner by "
    +"parsing\n"
    +"only the inner blocks that are relevant to documentation."
    +msgstr ""
    +"デフォルトでパーサーは全てのトップレベルステートメントから、\n"
    +"プロセッサークラスのリストを与える。\n"
    +"そして、プロセッサーは、トップレベルステートメントだけ解析する。\n"
    +"モジュール、クラス、メソッド内でブロックが宣言される場合や、\n"
    +"ブロックが処理されるメソッド呼び出しを解析した場合でさえ、\n"
    +"{YARD::Handlers::Base#parse_block parse_block}メソッドは、\n"
    +"解析の為にステートメントのリストを呼び出さなければならない。\n"
    +"これはステートメントのリストの処理を継続するプロセッサーにリストを送信する。\n"
    +"ソースツリーは、ドキュメント作成に関連したブロック内だけ解析することによって、\n"
    +"この形式の中で選択され抜粋される。"
    +
    +#: ../docs/Handlers.md:105
    +msgid ""
    +"For example, the module handler parses the inner body of a module by "
    +"performing\n"
    +"the following commands:"
    +msgstr ""
    +"例えばモジュールハンドラーは、\n"
    +"以下のコマンドを実行することによってモジュールから内部の本体を解析する。"
    +
    +#: ../docs/Handlers.md:108
    +msgid ""
    +"    class YARD::Handlers::Ruby::ModuleHandler < YARD::Handlers::Ruby::Base\n"
    +"      handles :module"
    +msgstr ""
    +"    class YARD::Handlers::Ruby::ModuleHandler < YARD::Handlers::Ruby::Base\n"
    +"      handles :module"
    +
    +#: ../docs/Handlers.md:111
    +msgid ""
    +"      def process\n"
    +"        modname = statement[0].source\n"
    +"        mod = register ModuleObject.new(namespace, modname)\n"
    +"        parse_block(statement[1], :namespace => mod)\n"
    +"      end\n"
    +"    end"
    +msgstr ""
    +"      def process\n"
    +"        modname = statement[0].source\n"
    +"        mod = register ModuleObject.new(namespace, modname)\n"
    +"        parse_block(statement[1], :namespace => mod)\n"
    +"      end\n"
    +"    end"
    +
    +#: ../docs/Handlers.md:118
    +msgid ""
    +"In this case `statement[1]` refers to a list of extra statements, the block "
    +"we\n"
    +"wish to parse. Note here that when parsing objects like modules and "
    +"classes,\n"
    +"we set the namespace for the duration of the block parsing by setting "
    +"options\n"
    +"on the `parse_block` method."
    +msgstr ""
    +"この場合`statement[1]`は追加のステートメントで、\n"
    +"私達が解析するブロックのリストを参照する。\n"
    +"ここにあるように、\n"
    +"モジュールやクラスのようにオブジェクトを解析する時、\n"
    +"私達は`parse_block`メソッドのオプションが設定されることによって\n"
    +"解析しているブロックの範囲をネームスペースに設定する。"
    +
    +#: ../docs/Handlers.md:123
    +msgid "### API Differences for Legacy Handler"
    +msgstr "### Legacy Handler用のAPIの相違点"
    +
    +#: ../docs/Handlers.md:125
    +msgid ""
    +"Because the legacy handler uses the legacy parser and therefore a different "
    +"kind\n"
    +"of AST, there are subtle differences in the handler API. Most importantly, "
    +"the\n"
    +"`handles` method usually deals with either lexical tokens or source code as "
    +"a string\n"
    +"or RegExp object. The statement object, similarly, is made up of lexical "
    +"tokens instead\n"
    +"of semantically parsed nodes (this is described in the {file:docs/Parser.md "
    +"parser document})."
    +msgstr ""
    +"レガシーハンドラーはレガシーパーサーを使い,\n"
    +"それに伴い異る種類のASTがあるのでハンドラーAPIに微妙な違いがある。\n"
    +"最も重要なことだが、 `handles` メソッドは通常、\n"
    +"単語のトークンやソースコード、文字列やRegExpオブジェクトと共に処理する。\n"
    +"ステートメントのオブジェクトと同様、意味のある解析されるノードの代わりに、\n"
    +"単語のトークンから構成される。\n"
    +"(これは{file:docs/Parser.md パーサーのドキュメント}の中で記述される)"
    +
    +#: ../docs/Handlers.md:131
    +msgid ""
    +"The module example above can be rewritten as a legacy handler as follows:"
    +msgstr ""
    +"上記のモジュール例は、次のようなレガシーハンドラーによって再書込みされる。"
    +
    +#: ../docs/Handlers.md:133
    +msgid ""
    +"    class YARD::Handlers::Ruby::Legacy::ModuleHandler < YARD::Handlers::"
    +"Ruby::Legacy::Base\n"
    +"      handles TkMODULE"
    +msgstr ""
    +"    class YARD::Handlers::Ruby::Legacy::ModuleHandler < YARD::Handlers::Ruby::Legacy::Base\n"
    +"      handles TkMODULE"
    +
    +#: ../docs/Handlers.md:136
    +msgid ""
    +"      def process\n"
    +"        modname = statement.tokens.to_s[/^module\\s+(#{NAMESPACEMATCH})/, "
    +"1]\n"
    +"        mod = register ModuleObject.new(namespace, modname)\n"
    +"        parse_block(:namespace => mod)\n"
    +"      end\n"
    +"    end"
    +msgstr ""
    +"      def process\n"
    +"        modname = statement.tokens.to_s[/^module\\s+(#{NAMESPACEMATCH})/, 1]\n"
    +"        mod = register ModuleObject.new(namespace, modname)\n"
    +"        parse_block(:namespace => mod)\n"
    +"      end\n"
    +"    end"
    +
    +#: ../docs/Handlers.md:143
    +msgid "A few notes on the differences:"
    +msgstr "標準のハンドラーとの違いに関するいくつかの注意。"
    +
    +#: ../docs/Handlers.md:145
    +msgid ""
    +"  * We inherit from `Legacy::Base` instead of the standard Ruby Base handler "
    +"class.\n"
    +"  * We exchange node type `:module` for `TkMODULE`, which represents the\n"
    +"    first token in the statement.\n"
    +"  * We perform direct string manipulation to get the module name.\n"
    +"  * `parse_block` does not take a list of statements. In the old parser "
    +"API,\n"
    +"    each statement has a `block` attribute which defines the list of\n"
    +"    statements within that statement, if any. Therefore, `parse_block` will\n"
    +"    always parse the `statement.block` if it exists."
    +msgstr ""
    +"  * 標準のRubyBaseハンドラークラスの代わりに `Legacy::Base` から継承する。\n"
    +"  * ノードタイプ `:module` を `TkMODULE` へ交換する、\n"
    +"    それは、ステートメントの中の最初のトークンを表す。\n"
    +"  * モジュール名を取得する為に直接文字列操作を実行する。\n"
    +"  * `parse_block`はステートメントのリストを取得しない。\n"
    +"    古いパーサーの中のAPIで、\n"
    +"    それぞれのステートメントは `block` 属性を持っていたら\n"
    +"    ステートメントの中にステートメントのリストを定義する、\n"
    +"    従って、 `parse_block` は、 `statement.block` が存在すれば解析する。"
    +
    +# title
    +#: ../docs/Overview.md:1
    +msgid "Architecture Overview"
    +msgstr "基本設計概念の概要"
    +
    +#: ../docs/Overview.md:3
    +msgid "# Architecture Overview"
    +msgstr "# 基本設計概念の概要"
    +
    +#: ../docs/Overview.md:5
    +msgid ""
    +"YARD is separated in three major components, each of which allows YARD to "
    +"be\n"
    +"extended for a separate purpose. The split also emphasizes YARD's design "
    +"choice\n"
    +"to explicitly separate data gathering from HTML document generation, "
    +"something\n"
    +"that tools like RDoc do not do. These components are:"
    +msgstr ""
    +"YARDは主な構成として三つに分けられる。\n"
    +"いずれも、目的毎に拡張される為にYARDに受け入れられる。\n"
    +"これは、HTMLドキュメント生成から集めるデータを明確に分ける為に\n"
    +"YARD設計上の選択を重視する。"
    +
    +#: ../docs/Overview.md:10
    +msgid ""
    +"* [Code Parsing & Processing Component](#parsing)\n"
    +"* [Data Storage Component](#storage)\n"
    +"* [Post Processing & Templating System](#templates)"
    +msgstr ""
    +"* [Code Parsing & Processing Component](#parsing)\n"
    +"* [Data Storage Component](#storage)\n"
    +"* [Post Processing & Templating System](#templates)"
    +
    +#: ../docs/Overview.md:14
    +msgid ""
    +"This separation is a major goal of the project, and means that YARD is not "
    +"*just*\n"
    +"a tool to generate HTML output. The expectation is that any subset of "
    +"YARD's\n"
    +"major components may be used, extended or modified independently. YARD may "
    +"be\n"
    +"used just as a data gathering tool (to parse and audit code), just as a "
    +"data\n"
    +"source (a webserver containing raw unformatted data about code), or just as "
    +"a\n"
    +"conventional HTML documentation generation tool (like RDoc)."
    +msgstr ""
    +"この区分は、プロジェクトの主要な目的であり、\n"
    +"YARDがHTMLの出力を生成するただの道具では無い事を意味している。\n"
    +"期待することはYARDのメジャーな構成のサブセットが独自に利用,拡張,変更される事である。\n"
    +"YARDはデータ収集ツール(コードを解析,検査),\n"
    +"データの元(ウェブサーバーはコードについてフォーマットされて無い生のデータを含んでいる),\n"
    +"便利なHTMLドキュメント作成ツール(RDocのような)として利用される。"
    +
    +#: ../docs/Overview.md:21
    +msgid ""
    +"The important classes and dependencies of these components are shown in the\n"
    +"following class diagram:"
    +msgstr "重要なクラスやこれらの構成の依存関係は、次のクラス図の中で表示される。"
    +
    +#: ../docs/Overview.md:24
    +msgid "![Overview Class Diagram](images/overview-class-diagram.png)"
    +msgstr "![Overview Class Diagram](images/overview-class-diagram.png)"
    +
    +#: ../docs/Overview.md:26
    +msgid ""
    +msgstr ""
    +
    +#: ../docs/Overview.md:28
    +msgid "## Code Parsing & Processing Component"
    +msgstr "## コードの解析と処理の構成"
    +
    +#: ../docs/Overview.md:30
    +msgid ""
    +"This component is made up of four sub-components, each of which have "
    +"separate\n"
    +"tasks during the data gathering process (*note: the tag architecture is "
    +"not*\n"
    +"*shown in the class diagram*). These sub-components are:"
    +msgstr ""
    +"この構成は、4つの下位構成を作り上げる、\n"
    +"いずれも、\n"
    +"データ収集処理の間,別々のタスクを持つ。\n"
    +"(*注意: タグ構造はクラス図)\n"
    +"下位構成は以下のようになる。"
    +
    +#: ../docs/Overview.md:34
    +msgid ""
    +"  * {file:docs/Parser.md}\n"
    +"  * {file:docs/Handlers.md}\n"
    +"  * {file:docs/CodeObjects.md}\n"
    +"  * {file:docs/Tags.md}"
    +msgstr ""
    +"  * {file:docs/Parser.md}\n"
    +"  * {file:docs/Handlers.md}\n"
    +"  * {file:docs/CodeObjects.md}\n"
    +"  * {file:docs/Tags.md}"
    +
    +#: ../docs/Overview.md:39
    +msgid ""
    +"The parser component reads source files and converts it into a set of "
    +"statements\n"
    +"which the handlers then process, creating code objects which in turn create "
    +"tags\n"
    +"(meta-data) attached to the objects. These objects are all added to the "
    +"{YARD::Registry},\n"
    +"the data store component."
    +msgstr ""
    +"パーサーの構成は、ソースファイルを読み込み、\n"
    +"ステートメントのグループの中へそれを変換する\n"
    +"コードオブジェクトを作成し,\n"
    +"順番にオブジェクトを追加されたタグ(メタデータ)を作成する。\n"
    +"これらのオブジェクトは {YARD::Registry} に全て追加される。\n"
    +"データは構成を記録する。"
    +
    +#: ../docs/Overview.md:44
    +msgid ""
    +msgstr ""
    +
    +#: ../docs/Overview.md:46
    +msgid "## Data Storage Component"
    +msgstr "## データの記録内容"
    +
    +#: ../docs/Overview.md:48
    +msgid ""
    +"This component is currently implemented as a simple Ruby marshalled flat "
    +"namespace\n"
    +"of object. The implementation is found in the single class {YARD::Registry}, "
    +"which\n"
    +"is the centralized repository for all data being parsed, stored and "
    +"accessed. There\n"
    +"are future plans to improve this storage mechanism to be backend agnostic "
    +"and allow\n"
    +"for more robust storage."
    +msgstr ""
    +"この内容は現在の所、\n"
    +"単純にRubyの整理されたフラットなオブジェクトのnamespaceのように実装されている。\n"
    +"実装はシングルクラスの{YARD::Registry}の中で見つけられる。\n"
    +"始めに解析し,記憶,アクセスされる全てのデータ用に集中化されたリポジトリとなる。\n"
    +"寛容なバックエンドにこのストレージのメカニズムを修正し、\n"
    +"そして更なる堅牢なストレージを受け入れる為の将来の計画がある。"
    +
    +#: ../docs/Overview.md:54
    +msgid ""
    +msgstr ""
    +
    +#: ../docs/Overview.md:56
    +msgid "## Post Processing & Templating System"
    +msgstr "## 後処理とテンプレートシステム"
    +
    +#: ../docs/Overview.md:58
    +msgid ""
    +"This component handles processing of objects from the registry through a "
    +"templating\n"
    +"engine that allows output to a variety of formats. Practically speaking, "
    +"this is\n"
    +"where templates can be implemented to change the design, output or structure "
    +"of\n"
    +"the data. See {file:docs/Templates.md Templates Architecture} for a complete "
    +"overview."
    +msgstr ""
    +"この構成は\n"
    +"レジストリーから多様な書式を出力可能なテンプレートエンジンまで\n"
    +"オブジェクトの処理を操作する。\n"
    +"実際の話をすると、これは、設計や出力やデータの構造を変更する為に\n"
    +"テンプレートが実装される場所となる。\n"
    +"テンプレートの詳細な説明は\n"
    +"{file:docs/Templates.md Templates Architecture}参照。"
    +
    +# title
    +#: ../docs/Parser.md:1
    +msgid "Parser Architecture"
    +msgstr "パーサー構造"
    +
    +#: ../docs/Parser.md:3
    +msgid "# Parser Architecture"
    +msgstr "# パーサー構造"
    +
    +#: ../docs/Parser.md:5
    +msgid ""
    +"The parser component of YARD is the first component in the data processing "
    +"pipeline\n"
    +"that runs before any handling is done on the source. The parser is meant to "
    +"translate\n"
    +"the source into a set of statements that can be understood by the {file:docs/"
    +"Handlers.md Handlers}\n"
    +"that run immediately afterwards."
    +msgstr ""
    +"YARDのパーサーの構成要素は、\n"
    +"何らかの処理がソース上で行われる前に実行され\n"
    +"パイプラインのデータ処理の中の最初の構成要素となる。\n"
    +"パーサーはソースを、\n"
    +"後ですぐ実行する{file:docs/Handlers.md Handlers}によって理解され\n"
    +"ステートメントのグループの中へ変換するよう意図されている。"
    +
    +#: ../docs/Parser.md:10
    +msgid ""
    +"The important classes are described in the class diagram of the entire "
    +"parser\n"
    +"system below:"
    +msgstr "重要なクラスは、以下のパーサーの全体のシステムのクラス図表の中で記述する。"
    +
    +#: ../docs/Parser.md:13
    +msgid "![Parser Class Diagram](images/parser-class-diagram.png)"
    +msgstr "![Parser Class Diagram](images/parser-class-diagram.png)"
    +
    +#: ../docs/Parser.md:15
    +msgid "(Note: the RubyToken classes are omitted from the diagram)"
    +msgstr "(注意: RubyTokenクラスは、図表から省略されます。)"
    +
    +#: ../docs/Parser.md:17
    +msgid "## SourceParser"
    +msgstr "## ソースパーサー"
    +
    +#: ../docs/Parser.md:19
    +msgid ""
    +"The main class {YARD::Parser::SourceParser} acts as a factory class, "
    +"instantiating\n"
    +"the correct parser class, an implementation of {YARD::Parser::Base}. The "
    +"selected parser\n"
    +"is chosen based on either the file extension or by selecting it explicitly "
    +"(as an argument\n"
    +"to parsing methods). YARD supports Ruby and C source files, but custom "
    +"parsers can\n"
    +"be implemented and registered for various other languages by subclassing "
    +"`Parser::Base`\n"
    +"and registering the parser with {YARD::Parser::SourceParser."
    +"register_parser_type}."
    +msgstr ""
    +"主なクラス{YARD::Parser::SourceParser}は、ファクトリークラスのように振る舞"
    +"う。\n"
    +"そして正確なパーサークラスをインスタンス化する。これは{YARD::Parser::Base}か"
    +"ら実装する。\n"
    +"選ばれるパーサーは、\n"
    +"ファイル拡張子かパーサータイプを明確に指定する事によってベースが選ばれる。\n"
    +"(メソッドの解析の為の引数のように)\n"
    +"YARDはRubyやCのソースファイルをサポートするが。\n"
    +"カスタムパーサーが\n"
    +"`Parser::Base`をサブクラス化し\n"
    +"{YARD::Parser::SourceParser.register_parser_type}を用い登録する事によって\n"
    +"様々な他の言語用に実装され、登録される。"
    +
    +#: ../docs/Parser.md:26
    +msgid ""
    +"This factory class should always be used when parsing source files rather "
    +"than\n"
    +"the individual parser classes since it initiates the pipeline that runs the\n"
    +"handlers on the parsed source. The parser used must also match the "
    +"handlers,\n"
    +"and this is coordinated by the `SourceParser` class as well."
    +msgstr ""
    +"このファクトリークラスは、個々のパーサークラスを解析する時より\n"
    +"ソースファイルを解析する時に毎回利用される。\n"
    +"なので解析されたソース上でハンドラーを起動するパイプラインを開始する。\n"
    +"利用されるパーサーはハンドラーにマッチしなければならない、\n"
    +"これは `SourceParser` クラスによって同様にコーディネートされる。"
    +
    +#: ../docs/Parser.md:31
    +msgid "## Using the SourceParser Class"
    +msgstr "## ソースパーサークラスを使うには"
    +
    +#: ../docs/Parser.md:33
    +msgid ""
    +"The `SourceParser` class API is optimized for parsing globs of files. As "
    +"such,\n"
    +"the main method to use the class is the `parse` class method, which takes "
    +"an\n"
    +"array of file globs or a single file glob."
    +msgstr ""
    +"`SourceParser` クラスAPIは、ファイルのglobを解析する為に最適化される。\n"
    +"クラスを使う為の主なメソッドは、 `parse` クラスメソッドとなる。\n"
    +"そして、ファイルの配列や単一のファイルglobを取る。"
    +
    +#: ../docs/Parser.md:37
    +msgid ""
    +"    YARD::Parser::SourceParser.parse('spec_*.rb')\n"
    +"    YARD::Parser::SourceParser.parse(['spec_*.rb', '*_helper.rb'])"
    +msgstr ""
    +"    YARD::Parser::SourceParser.parse('spec_*.rb')\n"
    +"    YARD::Parser::SourceParser.parse(['spec_*.rb', '*_helper.rb'])"
    +
    +#: ../docs/Parser.md:40
    +msgid "This is equivalent to the convenience method {YARD.parse}:"
    +msgstr "これは以下の便宜的なメソッド{YARD.parse}と同等である。"
    +
    +#: ../docs/Parser.md:42
    +msgid "    YARD.parse('lib/**/*.rb')"
    +msgstr "    YARD.parse('lib/**/*.rb')"
    +
    +#: ../docs/Parser.md:44
    +msgid ""
    +"In some cases (ie. for testing), it may be more helpful to parse a string of "
    +"input\n"
    +"directly. In such a case, the method {YARD::Parser::SourceParser."
    +"parse_string} should be\n"
    +"used:"
    +msgstr ""
    +"場合によっては(つまりテストの為)、\n"
    +"それは直接入力の文字列を解析するのにとても役立つだろう。\n"
    +"このような場合には、\n"
    +"以下の{YARD::Parser::SourceParser.parse_string}メソッドが使われる。"
    +
    +#: ../docs/Parser.md:48
    +msgid "    YARD::Parser::SourceParser.parse_string(\"def method(a, b) end\")"
    +msgstr "    YARD::Parser::SourceParser.parse_string(\"def method(a, b) end\")"
    +
    +#: ../docs/Parser.md:50
    +msgid "You can also provide the parser type explicitly as the second argument:"
    +msgstr "あなたは、パーサーの型を第2引数のように提供できる。"
    +
    +#: ../docs/Parser.md:52
    +msgid ""
    +"    # Parses a string of C\n"
    +"    YARD::Parser::SourceParser.parse_string(\"int main() { }\", :c)"
    +msgstr ""
    +"    # C言語の文字列を解析する\n"
    +"    YARD::Parser::SourceParser.parse_string(\"int main() { }\", :c)"
    +
    +#: ../docs/Parser.md:55
    +msgid ""
    +"Note that these two methods are aliased as {YARD.parse} and {YARD."
    +"parse_string} for\n"
    +"convenience."
    +msgstr ""
    +"以下の事に留意する。\n"
    +"これらの二つのメソッドは、便利に使う為の\n"
    +"{YARD.parse}や{YARD.parse_string}のような別名となる。"
    +
    +#: ../docs/Parser.md:58
    +msgid "## Implementing and Registering a Custom Parser"
    +msgstr "## カスタムパーサーを実装及び登録する"
    +
    +#: ../docs/Parser.md:60
    +msgid ""
    +"To implement a custom parser, subclass {YARD::Parser::Base}. Documentation "
    +"on which\n"
    +"abstract methods should be implemented are documented in that class. After "
    +"the class\n"
    +"is implemented, it is registered with the {YARD::Parser::SourceParser} "
    +"factory class\n"
    +"to be called when a file of the right extension needs to be parsed, or when "
    +"a user\n"
    +"selects that parser type explicitly. To register your new parser class, call "
    +"the\n"
    +"method {YARD::Parser::SourceParser.register_parser_type}:"
    +msgstr ""
    +"カスタムパーサーを実装するには、{YARD::Parser::Base}をサブクラス化する。\n"
    +"抽象的なメソッドのドキュメントはクラスの中で記述され実装される。\n"
    +"クラスが実装されたあとで、\n"
    +"正しい拡張子のファイルが解析される為に必要となる時や\n"
    +"ユーザーが明示的にパーサーのタイプを選択する時に\n"
    +"呼び出される為に{YARD::Parser::SourceParser}ファクトリークラスを用い記録される。\n"
    +"あなたの新しいパーサークラスを登録するには、\n"
    +"以下の様に{YARD::Parser::SourceParser.register_parser_type}メソッドを呼び出す。"
    +
    +#: ../docs/Parser.md:67
    +msgid ""
    +"    SourceParser.register_parser_type(:my_parser, MyParser, 'my_parser_ext')"
    +msgstr "    SourceParser.register_parser_type(:my_parser, MyParser, 'my_parser_ext')"
    +
    +#: ../docs/Parser.md:69
    +msgid ""
    +"The last argument can be a single extension, a list of extensions (Array), a "
    +"single Regexp, or a\n"
    +"list of Regexps. Do not include the '.' in the extension."
    +msgstr ""
    +"最後の引数は、単一の拡張か、拡張のリストか、単独の正規表現か、正規表現のリス"
    +"トになる。\n"
    +"拡張する中に'.'を含めることはできない。"
    +
    +#: ../docs/Parser.md:73
    +msgid "## The Two Ruby Parser Types"
    +msgstr "## 2つのRubyパーサーの型"
    +
    +#: ../docs/Parser.md:75
    +msgid ""
    +"When parsing Ruby, the SourceParser can either instantiate the new {YARD::"
    +"Parser::Ruby::RubyParser}\n"
    +"class or the {YARD::Parser::Ruby::Legacy::StatementList} class. The first of "
    +"the\n"
    +"two, although faster, more robust and more efficient, is only available for\n"
    +"Ruby 1.9. The legacy parser parser is available in both 1.8.x and 1.9, if\n"
    +"compatibility is required. The choice of parser will affect which handlers\n"
    +"ultimately get used, since new handlers can only use the new parser and the\n"
    +"same requirement applies to the legacy parser & handlers."
    +msgstr ""
    +"Rubyを処理している時、\n"
    +"SourceParserは、{YARD::Parser::Ruby::RubyParser}クラスまたは、\n"
    +"{YARD::Parser::Ruby::Legacy::StatementList}クラスをインスタンス化する。\n"
    +"2つの内の最初の、{YARD::Parser::Ruby::RubyParser}は、\n"
    +"高速で、最も堅牢で最も効率的だが、Ruby 1.9のみ利用可能。\n"
    +"もし互換性が必要な場合、2番目のlegacy parserパーサーなら、\n"
    +"1.8.xと1.9の両方で利用可能。\n"
    +"パーサーの選択は、ハンドラーが最終的に取得する所で影響する。\n"
    +"だから、新しいハンドラーは新しいパーサーだけを使える。\n"
    +"その条件はレガシーパーサーとハンドラーも同様である。"
    +
    +#: ../docs/Parser.md:83
    +msgid "## Switching to Legacy Parser"
    +msgstr "## レガシーパーサーに切替える"
    +
    +#: ../docs/Parser.md:85
    +msgid ""
    +"By default, running YARD under Ruby 1.9 will automatically select the new "
    +"parser\n"
    +"and new handlers by extension. Although YARD supports both handler styles, "
    +"plugins\n"
    +"may choose to only implement one of the two (though this is not "
    +"recommended). If\n"
    +"only the legacy handlers are implemented, the `SourceParser` class should "
    +"force\n"
    +"the use of the legacy parser by setting the `parser_type` attribute as such:"
    +msgstr ""
    +"デフォルトで、稼動中のRuby1.9以下のバージョンで使われるYARDは、\n"
    +"拡張によって新しいパーサーと新しいハンドラーを自動で選択する。\n"
    +"YARDがどちらのハンドラースタイルもサポートするけれども、\n"
    +"プラグインは2つの内一つだけを実装する事を選択する事もできる。\n"
    +"(このような考えは推奨されない)\n"
    +"もし、レガシーハンドラーのみ実装する場合、\n"
    +"`SourceParser`クラスはレガシーパーサーの使用を\n"
    +"強制すべきである。\n"
    +"例として、以下の様に`parser_type`属性を設定する。"
    +
    +#: ../docs/Parser.md:91
    +msgid "    YARD::Parser::SourceParser.parser_type = :ruby18"
    +msgstr "    YARD::Parser::SourceParser.parser_type = :ruby18"
    +
    +#: ../docs/Parser.md:93
    +msgid ""
    +"The default value is `:ruby`. Note that this cannot be forced the other way "
    +"around,\n"
    +"a parser type of `:ruby` cannot be set under Ruby 1.8.x as the new parser is "
    +"not\n"
    +"supported under 1.8."
    +msgstr ""
    +"デフォルトの値は、`:ruby`となる。\n"
    +"次の事に留意する。`:ruby`にしても強制されるわけではない。\n"
    +"何故なら`:ruby`のパーサーの型はRipperライブラリが未定義の場合、\n"
    +"新しいパーサーが1.8.以下をサポートしない様にするので、\n"
    +"Ruby 1.8.x以下には設定されないからである。"
    +
    +#: ../docs/Parser.md:97
    +msgid "## RubyParser (the New Parser)"
    +msgstr "## Rubyパーサー(新しいパーサー)"
    +
    +#: ../docs/Parser.md:99
    +msgid ""
    +"The new Ruby parser uses the Ripper library that is packaged as part of "
    +"stdlib\n"
    +"in Ruby 1.9. Because of this, it can generate an AST from a string of Ruby "
    +"input\n"
    +"that is similar to the style of other sexp libraries (such as ParseTree). "
    +"Each\n"
    +"node generated in the tree is of the base type {YARD::Parser::Ruby::"
    +"AstNode},\n"
    +"which has some subclasses for common node types."
    +msgstr ""
    +"新しいRubyパーサーはRuby1.9の中のRipperライブラリを使用する。\n"
    +"これは標準ライブラリの一部としてパッケージされる。\n"
    +"そんな訳で、Rubyの入力文字列からのASTを生成することが出来る。\n"
    +"これは、他のS式ライブラリのスタイルと同様である。\n"
    +"ツリーの中のそれぞれの生成したノードは、\n"
    +"基準の型{YARD::Parser::Ruby::AstNode}となる。\n"
    +"そして、一般的なノードの型用のいくつかのサブクラスを\n"
    +"持っている。"
    +
    +#: ../docs/Parser.md:105
    +msgid "### AstNode Basics"
    +msgstr "### AstNodeの基本"
    +
    +#: ../docs/Parser.md:107
    +msgid ""
    +"The `AstNode` class behaves like a standard Array class in which all of its "
    +"data\n"
    +"make up the list of elements in the array. Unlike other sexp style "
    +"libraries, however,\n"
    +"the node type is not the first element of the list. Instead, the node type "
    +"is defined\n"
    +"by the `#type` method. The following examples show some of the basic uses of "
    +"`AstNode`:"
    +msgstr ""
    +"AstNodeクラスは、全てのデータが配列の中の要素のリストを\n"
    +"作り上げる所で標準の配列クラスのように振る舞う。\n"
    +"他のS式スタイルのライブラリとは異なっている。しかしながら、\n"
    +"ノードタイプは、リストの最初の要素では無い。\n"
    +"むしろ、ノードタイプは`#type`メソッドによって定義される。\n"
    +"以下の例は、いくつかの`AstNode`の基本的な使用法を表す。"
    +
    +#: ../docs/Parser.md:112
    +msgid ""
    +"    # The sexp defines the statement `hello if 1`\n"
    +"    node = s(:if_mod, s(:int, \"1\"), s(:var_ref, s(:ident, \"hello\")))\n"
    +"    node.type  #=> :if_mod\n"
    +"    node[0]    #=> s(:int, \"1\")\n"
    +"    node[0][0] #=> \"1\""
    +msgstr ""
    +"    # S式は `hello if 1` ステートメントを定義する\n"
    +"    node = s(:if_mod, s(:int, \"1\"), s(:var_ref, s(:ident, \"hello\")))\n"
    +"    node.type  #=> :if_mod\n"
    +"    node[0]    #=> s(:int, \"1\")\n"
    +"    node[0][0] #=> \"1\""
    +
    +#: ../docs/Parser.md:118
    +msgid ""
    +"(Note the `s()` syntax is shorthand for `AstNode.new(...)`. `s()` with no "
    +"type\n"
    +"is shorthand for a node of type `:list`)"
    +msgstr ""
    +"(注意 `s()`構文は`AstNode.new(...)`用の縮めた表記となる。\n"
    +"型がない`s()`は`:list`型のノード用の縮めた表記となる。)"
    +
    +#: ../docs/Parser.md:121
    +msgid ""
    +"As shown, not all of the elements are AstNodes in themselves, some are "
    +"String\n"
    +"objects containing values. A list of only the AstNodes within a node can be\n"
    +"accessed via the {YARD::Parser::Ruby::AstNode#children #children} method. "
    +"Using\n"
    +"the sexp declared above, we can do:"
    +msgstr ""
    +"示されたように、要素の全てがそれら自身の中のAstNodeでは無く、\n"
    +"いくつかは、値を含んでいるStringオブジェクトとなる。\n"
    +"ノード内部AstNodeだけのリストは、\n"
    +"{YARD::Parser::Ruby::AstNode#children #children}メソッド経由でアクセスされる。\n"
    +"上で宣言されたS式によって以下のようにできる。"
    +
    +#: ../docs/Parser.md:126
    +msgid ""
    +"    node.children #=> [s(:int, \"1\"), s(:var_ref, s(:ident, \"hello\"))]"
    +msgstr "    node.children #=> [s(:int, \"1\"), s(:var_ref, s(:ident, \"hello\"))]"
    +
    +#: ../docs/Parser.md:128
    +msgid "### AstNode#source and #line"
    +msgstr "### AstNode#source and #line"
    +
    +#: ../docs/Parser.md:130
    +msgid ""
    +"Every node defines the `#source` method which returns the source code that "
    +"the\n"
    +"node represents. One of the most common things to do with a node is to grab "
    +"its\n"
    +"source. The following example shows how this can be done:"
    +msgstr ""
    +"全てのノードは`#source`メソッドを定義する。\n"
    +"そして、ノードが意味するソースコードを返す。\n"
    +"ノードを用いた最も一般的な事は、ソースを取得する事となる。\n"
    +"以下の例は、これがどのように実行されるかを表す。"
    +
    +#: ../docs/Parser.md:134
    +msgid ""
    +"    source = \"if 1 == 1 then\\n  raise Exception\\n end\"\n"
    +"    ast = YARD::Parser::Ruby::RubyParser.parse(source).root\n"
    +"    ast[0].condition.source  #=> \"1 == 1\"\n"
    +"    ast[0].then_block.source #=> \"raise Exception\""
    +msgstr ""
    +"    source = \"if 1 == 1 then\\n  raise Exception\\n end\"\n"
    +"    ast = YARD::Parser::Ruby::RubyParser.parse(source).root\n"
    +"    ast[0].condition.source  #=> \"1 == 1\"\n"
    +"    ast[0].then_block.source #=> \"raise Exception\""
    +
    +#: ../docs/Parser.md:139
    +msgid ""
    +"Note that this only works on source parsed from the RubyParser, not sexps\n"
    +"declared using the `s()` syntax. This is because no source code is "
    +"generated\n"
    +"or stored by nodes. Instead, only the character ranges are stored, which "
    +"are\n"
    +"then looked up in the original full source string object. For example:"
    +msgstr ""
    +"次の事に留意する。\n"
    +"RubyParserから解析されるソース上だけで働き、\n"
    +"S式が`s()`構文によって宣言される時は働かない。\n"
    +"これは何故かというとノードによってソースコードは生成や格納されないからであ"
    +"る。\n"
    +"代わりに、文字列の範囲だけ格納され、\n"
    +"元の全てのソースのcharacterオブジェクトの中で検索される。\n"
    +"以下の様になる。"
    +
    +#: ../docs/Parser.md:144
    +msgid ""
    +"    # Following the code snippet above\n"
    +"    ast[0].then_block.source_range #=> 17..31"
    +msgstr ""
    +"    # 上のコードは次のようになる。(raise Exception部分のレンジ)\n"
    +"    ast[0].then_block.source_range #=> 17..31"
    +
    +#: ../docs/Parser.md:147
    +msgid "We can also get the line and line ranges in a similar fashion:"
    +msgstr "私達は以下の方法の様に、行や行の範囲を取得できる。\n"
    +
    +#: ../docs/Parser.md:149
    +msgid ""
    +"    ast[0].type       #=> :if\n"
    +"    ast[0].line       #=> 1\n"
    +"    ast[0].line_range #=> 1..3 (note the newlines in the source)"
    +msgstr ""
    +"    ast[0].type       #=> :if\n"
    +"    ast[0].line       #=> 1\n"
    +"    ast[0].line_range #=> 1..3 (ソース中の改行に注意)"
    +
    +#: ../docs/Parser.md:153
    +msgid "### AstNode#jump"
    +msgstr "### AstNode#jump"
    +
    +#: ../docs/Parser.md:155
    +msgid ""
    +"Often the AST will be such that the node we care about might be buried "
    +"arbitrarily\n"
    +"deep in a node's hierarchy. The {YARD::Parser::Ruby::AstNode#jump} method "
    +"exists\n"
    +"to quickly get at a node of a specific type in such a situation:"
    +msgstr ""
    +"多くの場合AST処理の中でノードに対し私達が気を付ける事は、\n"
    +"任意でノードの階層の中深くに埋められるかもしれないという事である。\n"
    +"{YARD::Parser::Ruby::AstNode#jump}メソッドは、以下の状況において特定の型の\n"
    +"ノードに素早く到達する為に存在する。"
    +
    +#: ../docs/Parser.md:159
    +msgid ""
    +"    # Get the first identifier in the statement\n"
    +"    ast = s(s(:int, \"1\"), s(s(:var_ref, s(:ident, \"hello\"))))\n"
    +"    ast.jump(:ident)[0] #=> \"hello\""
    +msgstr ""
    +"    # Get the first identifier in the statement\n"
    +"    ast = s(s(:int, \"1\"), s(s(:var_ref, s(:ident, \"hello\"))))\n"
    +"    ast.jump(:ident)[0] #=> \"hello\""
    +
    +#: ../docs/Parser.md:163
    +msgid ""
    +"Multiple types can be searched for at once. If none are found, the original "
    +"root\n"
    +"node is returned so that it may be chained."
    +msgstr ""
    +"複数のタイプは、すぐに検索される。\n"
    +"もし、見つからなかった場合、オリジナルのルートノードは、連鎖されるように返さ"
    +"れる。"
    +
    +#: ../docs/Parser.md:166
    +msgid "## The Legacy Parser"
    +msgstr "## レガシーパーサー"
    +
    +#: ../docs/Parser.md:168
    +msgid ""
    +"The goal of the legacy parser is much the same as the new parser, but it is "
    +"far\n"
    +"more simplistic. Instead of a full-blown AST, the legacy parser simply "
    +"groups\n"
    +"together lists of \"statements\" called a {YARD::Parser::Ruby::Legacy::"
    +"StatementList}.\n"
    +"These statement lists are made up of {YARD::Parser::Ruby::Legacy::Statement} "
    +"objects.\n"
    +"A statement is any method call condition, loop, or declaration. Each "
    +"statement\n"
    +"may or may not have a block. In the case of a condition or loop, the block "
    +"is\n"
    +"the inner list of statements; in the case of a method call, the block is a "
    +"do\n"
    +"block (if provided). The statements themselves are made up of tokens, so "
    +"instead\n"
    +"of being semantic in nature like the new parser, statements are tied "
    +"directly\n"
    +"to the lexical tokens that make them up. To convert a statement into source, "
    +"you\n"
    +"simply join all the tokens together (this is done through the use of "
    +"`#to_s`)."
    +msgstr ""
    +"レガシーパーサーの目的は、新しいパーサーと殆んど同様であるが、\n"
    +"しかし、それははるかに単純である。\n"
    +"完璧なASTの代わりに、\n"
    +"レガシーパーサーは、単純に\n"
    +"{YARD::Parser::Ruby::Legacy::StatementList}で呼び出される\"ステートメント\"のリストの\n"
    +"グループを作る。\n"
    +"これらのステートメントのリストは、{YARD::Parser::Ruby::Legacy::Statement}\n"
    +"オブジェクトで構成されている。\n"
    +"ステートメントは任意のメソッドで条件,ループ,宣言を呼び出す。\n"
    +"それぞれのステートメントはブロックを持っているかわからない。\n"
    +"条件やループの場合、ブロックはステートメントの内部のリストになる。\n"
    +"メソッド呼び出しの場合、ブロックはブロックを実行する。(もし提供されるなら)\n"
    +"ステートメントそれ自体は、トークンで構成されている。\n"
    +"その為、新しいパーサーのように自然な意味になる代わりに、\n"
    +"ステートメントはそれらを作り上げる単語のトークンに直接紐付けられる。\n"
    +"ステートメントをソースに変換する為には、\n"
    +"全てのトークンと共に単純に加えればいい。\n"
    +"(これは`#to_s`メソッドを使用し行われる。)"
    +
    +#: ../docs/Parser.md:180
    +msgid ""
    +"Note that because there is little semantic parsing, the legacy parser is "
    +"less\n"
    +"able to deal with certain Ruby syntaxes. Specifically, the `:if_mod` syntax\n"
    +"seen above (\"hello if 1\") would be considered two statements with the new "
    +"parser,\n"
    +"but using the legacy parser it is only one statement:"
    +msgstr ""
    +"次の事に留意する。\n"
    +"意味のある解析がほとんどないので、\n"
    +"レガシーパーサーは、特定のRuby構文と共に扱う事ができない。\n"
    +"具体的にいうと、\n"
    +"上の(\"hello if 1\")で見た`:if_mod`構文は、\n"
    +"新しいパーサーを用いた二つのステートメントと考えられる。\n"
    +"しかし、レガシーパーサーを使うと以下の一つのステートメントだけになる。"
    +
    +#: ../docs/Parser.md:185
    +msgid ""
    +"    stmts = ARD::Parser::Ruby::Legacy::StatementList.new(\"hello if 1\")\n"
    +"    stmts[0].block       #=> nil\n"
    +"    stmts[0].tokens.to_s #=> \"hello if 1\""
    +msgstr ""
    +"    stmts = ARD::Parser::Ruby::Legacy::StatementList.new(\"hello if 1\")\n"
    +"    stmts[0].block       #=> nil\n"
    +"    stmts[0].tokens.to_s #=> \"hello if 1\""
    +
    +#: ../docs/Parser.md:189
    +msgid ""
    +"In addition, this means that most handling still needs to be done via "
    +"string\n"
    +"manipulation and regular expression matching, making it considerably more\n"
    +"difficult to use in edge case scenarios."
    +msgstr ""
    +"さらに、ほとんどの処理は文字列操作や正規表現マッチ経由で行う\n"
    +"必要がある事を意味している。\n"
    +"それに合わせて作るには、極端なシナリオで利用する場合、大幅に難しくなる。"
    +
    +# title
    +#: ../docs/Tags.md:1
    +msgid "Tags Overview"
    +msgstr "タグの概要"
    +
    +#: ../docs/Tags.md:3
    +msgid "# Tags Overview"
    +msgstr "# タグの概要"
    +
    +#: ../docs/Tags.md:5
    +msgid ""
    +"Tags represent meta-data as well as behavioural data that can be added to\n"
    +"documentation through the `@tag` style syntax. As mentioned, there are two\n"
    +"basic types of tags in YARD, \"meta-data tags\" and \"behavioural tags\", "
    +"the\n"
    +"latter is more often known as \"directives\". These two tag types can be\n"
    +"visually identified by their prefix. Meta-data tags have a `@` prefix,\n"
    +"while directives have a prefix of `@!` to indicate that the directive\n"
    +"performs some potentially mutable action on or with the docstring. The\n"
    +"two tag types would be used in the following way, respectively:"
    +msgstr ""
    +"タグは`@tag`スタイルの構文からドキュメントを\n"
    +"作成するために追加されるデータの行動(behavioural)としてメタデータを表す。\n"
    +"上で述べた、\n"
    +"YARDの中でタグには基本的な2つの方があり、\n"
    +"\"メタデータタグ\"と\"行動(behavioural)タグ\"がある。\n"
    +"後者は、\"ディレクティブ\"としてよく知られている。\n"
    +"これらの2つのタグの型は\n"
    +"これらのプレフィックス(接頭辞)によって視覚的に指定される。\n"
    +"ディレクティブがdocstringと一緒に\n"
    +"幾つかの潜在的に変更可能なアクションを実行する指示をする為に\n"
    +"`@!`のプレフィックスを持つ間、\n"
    +"メタデータタグは`@`プレフィックスを持つ。\n"
    +"2つのタグの型はそれぞれ次の方法で利用される:"
    +
    +#: ../docs/Tags.md:14
    +msgid ""
    +"    # @meta_data_tag some data\n"
    +"    # @!directive_tag some data\n"
    +"    class Foo; end"
    +msgstr ""
    +"    # @meta_data_tag some data\n"
    +"    # @!directive_tag some data\n"
    +"    class Foo; end"
    +
    +#: ../docs/Tags.md:18
    +msgid ""
    +"This document describes how tags can be specified, how they affect your\n"
    +"documentation, and how to use specific built-in tags in YARD, as well\n"
    +"as how to define custom tags."
    +msgstr ""
    +"このドキュメントはタグについて\n"
    +"どのように指定されるか、\n"
    +"あなたのドキュメントにどれほど影響するか、\n"
    +"YARDの指定の組み込みタグをどのように使うのか、\n"
    +"どのようにカスタムタグを定義するのかを説明する"
    +
    +#: ../docs/Tags.md:22
    +msgid "## Meta-Data Tags"
    +msgstr "## メタデータタグ"
    +
    +#: ../docs/Tags.md:24
    +msgid ""
    +"Meta-data tags are useful to add arbitrary meta-data about a documented\n"
    +"object. These tags simply add data to objects that can be looked up later,\n"
    +"either programmatically, or displayed in templates. The benefit to "
    +"describing\n"
    +"objects using meta-data tags is that your documentation can be organized\n"
    +"semantically. Rather than having a huge listing of text with no distinction\n"
    +"of what each paragraph is discussing, tags allow you to focus in on "
    +"specific\n"
    +"elements of your documentation."
    +msgstr ""
    +"メタデータタグは記述されたオブジェクトについて\n"
    +"任意のメタデータを追加するのに便利である。\n"
    +"これらのタグは\n"
    +"簡単に後で検索でき、全てプログラムでき、テンプレートで表示できるように\n"
    +"オブジェクトにデータを追加する。\n"
    +"メタデータタグを使う事によるオブジェクトの説明の利点は、\n"
    +"あなたのドキュメントが意味を持って整理されることである。\n"
    +"個々の段落がどこで議論されるか\n"
    +"区別しないで巨大なテキストでの記述するより、\n"
    +"タグはあなたがあなたのドキュメントの特定の属性に集中するのを\n"
    +"考慮している。"
    +
    +#: ../docs/Tags.md:32
    +msgid ""
    +"For example, describing parameters of a method can often be important to "
    +"your\n"
    +"documentation, but should not be mixed up with the documentation that "
    +"describes\n"
    +"what the method itself does. In this case, separating the parameter "
    +"documentation\n"
    +"into {tag:param} tags can yield much better organized documentation, both "
    +"in\n"
    +"source and in your output, without having to manually format the data using\n"
    +"standard markup."
    +msgstr ""
    +"例えば、\n"
    +"メソッドのパラメータの説明は\n"
    +"あなたのドキュメントでしばしば必要になるが、\n"
    +"そのメソッド自体が何をするのか説明する\n"
    +"ドキュメントと一緒にごちゃ混ぜにすべきではない。\n"
    +"この場合は{tag:param}タグへドキュメントのパラメータを区切る事で\n"
    +"よりよく整理されたドキュメントにyieldでき、\n"
    +"ソースとあなたの出力両方で,\n"
    +"手動でなくても標準のマークアップでデータをフォーマットする。"
    +
    +#: ../docs/Tags.md:39
    +msgid ""
    +"All of this meta-data can be easily parsed by tools and used both in your "
    +"templates\n"
    +"as well as in code checker tools. An example of how you can leverage tags\n"
    +"programmatically is shown in the {tag:todo} tag, which lists a small snippet "
    +"of\n"
    +"Ruby code that can list all of your TODO items, if they are properly tagged."
    +msgstr ""
    +"このメタデータの全ては\n"
    +"ツールによって簡単に解析され、\n"
    +"それはあなたのテンプレートとコードチェッカーツールの両方で利用される。\n"
    +"プログラムでどのタグを利用できるかの例は{tag:todo}タグで一覧でき、\n"
    +"これらが適切にタグ付けられれば、\n"
    +"あなたの全てのTODOの項目をリストされ小さいRubyのコードのスニペットを記述する。"
    +
    +#: ../docs/Tags.md:44
    +msgid ""
    +"Custom meta-data tags can be added either programmatically or via the YARD\n"
    +"command-line. This is discussed in the \"[Adding Custom Tags]"
    +"(#Adding_Custom_Tags)\"\n"
    +"section."
    +msgstr ""
    +"カスタムメタデータタグはプログラムかYARDのコマンドラインで追加される。\n"
    +"これは\"[カスタムタグの追加](#Adding_Custom_Tags)\"の項の中で議論される。"
    +
    +#: ../docs/Tags.md:48
    +msgid ""
    +"A list of built-in meta-data tags are found below in the [Tag List]"
    +"(#Tag_List)."
    +msgstr "組み込みのメタデータタグのリストは下の [タグリスト](#Tag_List) で見つけられる。"
    +
    +#: ../docs/Tags.md:50
    +msgid "## Directives"
    +msgstr "## ディレクティブ"
    +
    +#: ../docs/Tags.md:52
    +msgid ""
    +"Directives are similar to meta-data tags in the way they are specified, but "
    +"they\n"
    +"do not add meta-data to the object directly. Instead, they affect the "
    +"parsing\n"
    +"context and objects themselves, allowing a developer to create objects\n"
    +"(like methods) outright, rather than simply add text to an existing object.\n"
    +"Directives have a `@!` prefix to differentiate these tags from meta-data "
    +"tags,\n"
    +"as well as to indicate that the tag may modify or create new objects when\n"
    +"it is called."
    +msgstr ""
    +"ディレクティブはメタデータタグが指定される方法と似ているが、\n"
    +"これは直接オブジェクトにメタデータを追加しない。\n"
    +"代わりに、\n"
    +"これらは解析のコンテキストとそれ自身のオブジェクトに影響し、\n"
    +"既存のオブジェクトにテキストを単純に追加するより、\n"
    +"完全なオブジェクト(メソッドのような)を作成する開発者を受け入れる。\n"
    +"ディレクティブは、メタデータタグからこれらのタグを識別するためや\n"
    +"タグが変更される示すためや\n"
    +"呼び出される時に新しいオブジェクトを作成するに\n"
    +"`@!`プレフィックスを持つ。"
    +
    +#: ../docs/Tags.md:60
    +msgid ""
    +"A list of built-in directives are found below in the [Directive List]"
    +"(#Directive_List)."
    +msgstr ""
    +"組み込みのディレクティブのリストは\n"
    +"以下の [ディレクティブリスト](#Directive_List) メソッドの中で定義される。"
    +
    +#: ../docs/Tags.md:62
    +msgid "## Tag Syntax"
    +msgstr "## タグ構文"
    +
    +#: ../docs/Tags.md:64
    +msgid ""
    +"Tags begin with the `@` or `@!` prefix at the start of a comment line, "
    +"followed\n"
    +"immediately by the tag name, and then optional tag data (if the tag requires "
    +"it).\n"
    +"Unless otherwise specified by documentation for the tag, all \"description\" "
    +"text\n"
    +"is considered free-form data and can include any arbitrary textual data."
    +msgstr ""
    +"タグはコメント行の始めで`@`や`@!`のプレフィックスと共に始まり、\n"
    +"すぐ次にタグ名、そして任意のタグデータ(もしタグにそれが必要なら)\n"
    +"別に必要ない場合は\n"
    +"タグ用のドキュメントを指定し、\n"
    +"全ての\"説明\"のテキストはフリーフォームのデータと見なされ、\n"
    +"任意の原文のデータを含む事ができる。"
    +
    +#: ../docs/Tags.md:69
    +msgid "### Multi-line Tags"
    +msgstr "### 複数行のタグ"
    +
    +#: ../docs/Tags.md:71
    +msgid ""
    +"Tags can span multiple lines if the subsequent lines are indented by more "
    +"than\n"
    +"one space. The typical convention is to indent subsequent lines by 2 "
    +"spaces.\n"
    +"In the following example, `@tagname` will have the text *\"This is indented "
    +"tag data\"*:"
    +msgstr ""
    +"タグは後続の行が一つ以上のスペースでインデントされる場合、複数の行に渡る事もできる。\n"
    +"一般的な慣習は2つのスペースによって続く行をする。\n"
    +"次の例の`@tagname`は *\"This is indented tag data\"* のテキストを持つ:"
    +
    +#: ../docs/Tags.md:75
    +msgid ""
    +"    # @tagname This is\n"
    +"    #   indented tag data\n"
    +"    # but this is not"
    +msgstr ""
    +"    # @tagname This is\n"
    +"    #   indented tag data\n"
    +"    # but this is not"
    +
    +#: ../docs/Tags.md:79
    +msgid ""
    +"For most tags, newlines and indented data are not significant and do not "
    +"impact\n"
    +"the result of the tag. In other words, you can decide to span a tag onto "
    +"multiple\n"
    +"lines at any point by creating an indented block. However, some tags like\n"
    +"{tag:example}, {tag:overload}, {tag:!macro}, {tag:!method}, and {tag:!"
    +"attribute}\n"
    +"rely on the first line for special information about the tag, and you "
    +"cannot\n"
    +"split this first line up. For instance, the {tag:example} tag uses the first "
    +"line\n"
    +"to indicate the example's title."
    +msgstr ""
    +"殆どのタグで、改行とインデントされたデータは\n"
    +"重要でないしタグの結果に影響しない。\n"
    +"つまり、あなたは\n"
    +"インデントされたブロックを作成する事によって全てのポイントで\n"
    +"複数行の上のタグに渡すのを決定できる。\n"
    +"しかしながら、\n"
    +"{tag:example}, {tag:overload}, {tag:!macro}, {tag:!method}, {tag:!attribute}のような、\n"
    +"いくつかのタグはタグについて特別な情報用に最初の行を頼り、\n"
    +"あなたはこの最初の行を分割できない。\n"
    +"例えば、{tag:example} タグは例のタイトルを指示するために最初の行を使う。"
    +
    +#: ../docs/Tags.md:87
    +msgid "### Common Tag Syntaxes"
    +msgstr "### 一般的なタグ構文"
    +
    +#: ../docs/Tags.md:89
    +msgid ""
    +"Although custom tags can be parsed in any way, the built-in tags follow a "
    +"few\n"
    +"common syntax structures by convention in order to simplify the syntax. The\n"
    +"following syntaxes are available:"
    +msgstr ""
    +"カスタムタグはどの方法でも解析され、\n"
    +"ビルトインタグは、構文を簡単にする為に定められた\n"
    +"いくつかの共通する構文構造に従う。\n"
    +"次の構文が用意されている。"
    +
    +#: ../docs/Tags.md:93
    +msgid ""
    +"1. **Freeform data** — In this case, any amount of textual data is "
    +"allowed,\n"
    +"  including no data. In some cases, no data is necessary for the tag.\n"
    +"2. **Freeform data with a types specifier list** — Mostly freeform "
    +"data\n"
    +"  beginning with an *optional* types specifier list surrounded in `[brackets]"
    +"`.\n"
    +"  Note that for extensibility, other bracket types are allowed, such as "
    +"`<>`,\n"
    +"  `()` and `{}`. The contents of the list are discussed in detail below.\n"
    +"3. **Freeform data with a name and types specifier list** — freeform\n"
    +"  data beginning with an *optional* types list, as well as a name key. The\n"
    +"  name key is *required*. Note that for extensibility, the name can be "
    +"placed\n"
    +"  *before* the types list, like: `name [Types] description`. In this case,\n"
    +"  a separating space is not required between the name and types, and you\n"
    +"  can still use any of the other brackets that the type specifier list "
    +"allows.\n"
    +"4. **Freeform data with title** — freeform data where the first line "
    +"cannot\n"
    +"  be split into multiple lines. The first line must also always refer to "
    +"the\n"
    +"  \"title\" portion, and therefore, if there is no title, the first line "
    +"must\n"
    +"  be blank. The \"title\" might occasionally be listed by another name in "
    +"tag\n"
    +"  documentation, however, you can identify this syntax by the existence of\n"
    +"  a multi-line signature with \"Indented block\" on the second line."
    +msgstr ""
    +"1. **フリーフォームデータ** — この場合は全ての単語のデータの総量は許可され、\n"
    +"データを含まない。場合によってはデータ無しではタグを必要としない。\n"
    +"2. **型指定のリストを用いたフリーフォームデータ** — 大抵のフリーフォームデータは\n"
    +"*optional(任意の)* の`[brackets(括弧)]`で囲まれた型指定のリストを用いて始まっている。\n"
    +"拡張用に留意する事として、\n"
    +"`<>`、`()`、`{}`などとして他のブラケットの型は許可される。\n"
    +"リストの内容は下の詳細で議論される。    \n"
    +"3. **名前と型指定のリストを用いたフリーフォームデータ** — フリーフォームデータは\n"
    +"*optional(任意の)*型のリストもキーの名前も用い始まるデータ。\n"
    +"キーの名前は *必須* である。\n"
    +"拡張性について次のことに留意する。\n"
    +"名前は型のリストの前に置く事ができる:`name [Types] description`。\n"
    +"この場合は、区切りのスペースはnameとtypesの間に必要ではない。\n"
    +"そしてあなた型指定のリストの許可の他のbracket(括弧)の何かを使う事ができる。\n"
    +"4. **タイトルを用いたフリーフォームデータ** — 最初の行のところのフリーフォームデータは\n"
    +"複数の行へ分割できない。\n"
    +"最初の行は常に\"title\"の場所とそれ自身を参照しなければならない。\n"
    +"タイトル無しの場合は、\n"
    +"最初の行はブランクにしなければならない。\n"
    +"\"title\"は時々、タグのドキュメントの中で他の名前によって記述される。\n"
    +"しかしながら、あなたは2番目の行の\"インデントされたブロック\"を用い\n"
    +"複数行のシグネチャの存在によってこの構文を認証できる"
    +
    +#: ../docs/Tags.md:112
    +msgid ""
    +"In the tag list below, the term \"description\" implies freeform data, `"
    +"[Types]`\n"
    +"implies a types specifier list, \"name\" implies a name key, and \"title\" "
    +"implies\n"
    +"the first line is a newline significant field that cannot be split into "
    +"multiple\n"
    +"lines."
    +msgstr ""
    +"下のタグのリストでは、\n"
    +"\"description\"の用語はフリーフォームデータを意味し、\n"
    +"`[Types]`は型指定のリストを意味する。\n"
    +"\"name\"はキーの名前を意味し、\n"
    +"最初の行を意味する\"title\"は改行で複数行へ分割できない特殊なフィールドである"
    +
    +#: ../docs/Tags.md:117
    +msgid "### Types Specifier List"
    +msgstr "### 型指定のリスト"
    +
    +#: ../docs/Tags.md:119
    +msgid ""
    +"In some cases, a tag will allow for a \"types specifier list\"; this will be "
    +"evident\n"
    +"from the use of the `[Types]` syntax in the tag signature. A types specifier "
    +"list\n"
    +"is a comma separated list of types, most often classes or modules, but "
    +"occasionally\n"
    +"literals. For example, the following {tag:return} tag lists a set of types "
    +"returned\n"
    +"by a method:"
    +msgstr ""
    +"幾つかの場合、タグは\"型指定のリスト\"用に許可する。\n"
    +"これはタグのシグネチャの中の`Types`の構文の利用から明らかである。\n"
    +"型指定のリストはコンマで区切られた型のリストである。\n"
    +"ほとんどはクラスやモジュールで、時々、リテラルである。\n"
    +"例えば、次の{tag:return}タグのリストはメソッドによって返された型のグループを記述する:"
    +
    +#: ../docs/Tags.md:125
    +msgid ""
    +"    # Finds an object or list of objects in the db using a query\n"
    +"    # @return [String, Array, nil] the object or objects to\n"
    +"    #   find in the database. Can be nil.\n"
    +"    def find(query) finder_code_here end"
    +msgstr ""
    +"    # queryによってdbの中のオブジェクトやオブジェクトのリストを見つける\n"
    +"    # @return [String, Array, nil] the object or objects to\n"
    +"    #   find in the database. Can be nil.\n"
    +"    def find(query) finder_code_here end"
    +
    +#: ../docs/Tags.md:130
    +msgid ""
    +"A list of conventions for type names is specified below. Typically, "
    +"however,\n"
    +"any Ruby literal or class/module is allowed here. Duck-types (method names\n"
    +"prefixed with \"#\") are also allowed."
    +msgstr ""
    +"型の名前用の慣習的なリストは下で指定される。\n"
    +"しかしながら一般的にRubyのリテラルやクラス/モジュールはここで許可される。\n"
    +"ダックタイピング(プレフィックスされたメソッド名を用いた\"#\")も許可される。"
    +
    +#: ../docs/Tags.md:134
    +msgid ""
    +"Note that the type specifier list is always an optional field and can be "
    +"omitted\n"
    +"when present in a tag signature. This is the reason why it is surrounded by\n"
    +"brackets. It is also a freeform list, and can contain any list of values, "
    +"though\n"
    +"a set of conventions for how to list types is described below."
    +msgstr ""
    +"留意する事として次の事がある。\n"
    +"型指定のリストは常に任意のフィールドとなり\n"
    +"タグのシグネチャを示す時にタグ構文の中で残される。\n"
    +"これがbracket(括弧)によってとりかこまれる理由である。\n"
    +"フリーフォームのリストも、任意のリストの値を含む事ができる。\n"
    +"どんな型をリストにするかの慣習のグループは下で説明される。"
    +
    +#: ../docs/Tags.md:139
    +msgid "### Type List Conventions"
    +msgstr "### 型のリストの慣習"
    +
    +#: ../docs/Tags.md:141
    +msgid ""
    +"

    \n" +" A list of examples of common type listings and what they translate into " +"is\n" +" available at http://yardoc.org/types.\n" +"

    " +msgstr "" +"

    \n" +" A list of examples of common type listings and what they translate into is\n" +" available at http://yardoc.org/types.\n" +"

    " + +#: ../docs/Tags.md:146 +msgid "" +"Typically, a type list contains a list of classes or modules that are " +"associated\n" +"with the tag. In some cases, however, certain special values are allowed or " +"required\n" +"to be listed. This section discusses the syntax for specifying Ruby types " +"inside of\n" +"type specifier lists, as well as the other non-Ruby types that are accepted " +"by\n" +"convention in these lists." +msgstr "" +"一般的に、型のリストはタグに関連付けられるクラスやモジュールのリストを含んでいる。\n" +"しかしながら、幾つかの特別な値は記述される為に許可され,受入られる。\n" +"このセクションは型の指定のリストの内部のRubyの型の指定用の構文も、\n" +"これらのリストの中の慣例によって認められる他のRubyではない型も議論する。" + +#: ../docs/Tags.md:152 +msgid "" +"It's important to realize that the conventions listed here may not always " +"adequately\n" +"describe every type signature, and is not meant to be a complete syntax. " +"This is\n" +"why the types specifier list is freeform and can contain any set of values. " +"The\n" +"conventions defined here are only conventions, and if they do not work for " +"your\n" +"type specifications, you can define your own appropriate conventions." +msgstr "" +"ここで慣例で記述されたものは常に\n" +"全ての型のシグネチャを説明しないのと\n" +"完璧な構文であるというのは意味しないという事を\n" +"理解するのが重要である。\n" +"型の指定のリストがフリーフォームなのは任意の値のグループを含むことができるからである。\n" +"ここで定義された慣例はここだけの慣例で、これはあなたの型の指定用には動作しない。\n" +"あなたは自身の適切な慣例を定義できる。" + +#: ../docs/Tags.md:158 +msgid "" +"Note that a types specifier list might also be used for non-Type values. In " +"this\n" +"case, the tag documentation will describe what values are allowed within " +"the\n" +"type specifier list." +msgstr "" +"次の事に留意する。\n" +"型の指定のリストは型ではない値にも使われるかもしれない。\n" +"この場合は,タグのドキュメントは\n" +"どの値が型の指定のリストの中で許可されるのかを説明する。" + +#: ../docs/Tags.md:162 +msgid "#### Class or Module Types" +msgstr "#### クラスやモジュールの型" + +#: ../docs/Tags.md:164 +msgid "" +"Any Ruby type is allowed as a class or module type. Such a type is simply " +"the name\n" +"of the class or module." +msgstr "" +"Rubyの型はクラスやモジュールを受け入れる。\n" +"タイプなどは単純にクラスやモジュールの名前である。" + +#: ../docs/Tags.md:167 +msgid "" +"Note that one extra type that is accepted by convention is the `Boolean` " +"type,\n" +"which represents both the `TrueClass` and `FalseClass` types. This type does " +"not\n" +"exist in Ruby, however." +msgstr "" +"次の事に留意する。\n" +"`Boolean`の型は慣例によって受入れられる追加の型で\n" +"`TrueClass`と`FalseClass`の型の両方を表す。\n" +"この型はRubyの中に存在しない。" + +#: ../docs/Tags.md:171 +msgid "#### Parametrized Types" +msgstr "#### パラメータ化された型" + +#: ../docs/Tags.md:173 +msgid "" +"In addition to basic types (like String or Array), YARD conventions allow " +"for\n" +"a \"generics\" like syntax to specify container objects or other " +"parametrized types.\n" +"The syntax is `Type`. For instance, an Array " +"might\n" +"contain only String objects, in which case the type specification would be\n" +"`Array`. Multiple parametrized types can be listed, separated by " +"commas." +msgstr "" +"基本の型(StringやArrayのような)に更に、YARDの慣例は\n" +"コンテナオブジェクトや他のパラメータ化された型を指定するための構文のような\n" +"\"generics(総称的な)\"の為に許可する。\n" +"構文は`Type`となる\n" +"例えば、配列は文字列オブジェクトだけを含んでいるかもしれない。\n" +"その場合の型の指定は`Array`になる。\n" +"複数のパラメータ化された型はカンマによって区切られ記述される。" + +#: ../docs/Tags.md:179 +msgid "" +"Note that parametrized types are typically not order-dependent, in other " +"words,\n" +"a list of parametrized types can occur in any order inside of a type. An " +"array\n" +"specified as `Array` can contain any amount of Strings or " +"Fixnums,\n" +"in any order. When the order matters, use \"order-dependent lists\", " +"described below." +msgstr "" +"次のことに留意する。\n" +"パラメータ化された型は一般的に順番に依存せず、\n" +"いいかえれば、パラメータ化された型のリストは\n" +"型の内部で好きなの順番におく事ができる。\n" +"`Array` などとして指定された配列はStringやFixnumの総量を\n" +"任意の順番で含む事ができる。\n" +"順番が問題になる時は、\n" +"下で説明される\"order-dependent lists(順番依存のリスト)\"を使う:" + +#: ../docs/Tags.md:184 +msgid "#### Duck-Types" +msgstr "#### ダックタイピング" + +#: ../docs/Tags.md:186 +msgid "" +"Duck-types are allowed in type specifier lists, and are identified by " +"method\n" +"names beginning with the \"#\" prefix. Typically, duck-types are " +"recommended\n" +"for {tag:param} tags only, though they can be used in other tags if needed.\n" +"The following example shows a method that takes a parameter of any type\n" +"that responds to the \"read\" method:" +msgstr "" +"ダックタイピングは型指定のリストを受入れ、\n" +"\"#\"プレフィックス(接頭辞)を用いた最初のメソッド名によってインデントされる。\n" +"一般的にダックタイピングは {tag:param} タグだけに推奨されているが、\n" +"必要なら他のタグで利用する事もできる。\n" +"次の例は\"read\"メソッドに返事をする任意の型のパラメータを\n" +"取得するメソッドを一覧できる:" + +#: ../docs/Tags.md:192 +msgid "" +" # Reads from any I/O object.\n" +" # @param [#read] io the input object to read from\n" +" def read(io) io.read end" +msgstr "" +" # 任意のI/O オブジェクトから読み込む\n" +" # @param [#read] io the input object to read from\n" +" def read(io) io.read end" + +#: ../docs/Tags.md:196 +msgid "#### Hashes" +msgstr "#### ハッシュ" + +#: ../docs/Tags.md:198 +msgid "" +"Hashes can be specified either via the parametrized type discussed above,\n" +"in the form `Hash`, or using the hash specific syntax:\n" +"`Hash{KeyTypes=>ValueTypes}`. In the latter case, KeyTypes or ValueTypes " +"can\n" +"also be a list of types separated by commas." +msgstr "" +"ハッシュは上で議論されたパラメータ化された型、\n" +"`Hash` 形式経由か\n" +"もしくは次の指定のハッシュ構文を使う:\n" +"`Hash{KeyTypes=>ValueTypes}` \n" +"後者の場合、KeyTypesやValueTypesはカンマで区切られた型のリストにもできる。" + +#: ../docs/Tags.md:203 +msgid "#### Order-Dependent Lists" +msgstr "#### Order-Dependent Lists(順番依存のリスト)" + +#: ../docs/Tags.md:205 +msgid "" +"An order dependent list is a set of types surrounded by \"()\" and separated " +"by\n" +"commas. This list must contain exactly those types in exactly the order " +"specified.\n" +"For instance, an Array containing a String, Fixnum and Hash in that order " +"(and\n" +"having exactly those 3 elements) would be listed as: `Array<(String, Fixnum, " +"Hash)>`." +msgstr "" +"順番依存のリストは\"()\"によって囲われた型のグループであり、\n" +"カンマによって区切られる。\n" +"このリストは正確に順番の指定された中で正確にそれらの型を含まなければならない。\n" +"例えばString,Fixnum,Hashの順番の(それは3つの属性をもっている)配列は、\n" +"`Array<(String, Fixnum, Hash)>` として記述される。" + +#: ../docs/Tags.md:210 +msgid "#### Literals" +msgstr "#### リテラル" + +#: ../docs/Tags.md:212 +msgid "" +"Some literals are accepted by virtue of being Ruby literals, but also by " +"YARD\n" +"conventions. Here is a non-exhaustive list of certain accepted literal " +"values:" +msgstr "" +"幾つかのリテラルはRubyのリテラルにある利点を受け入れるが、\n" +"YARDによる慣例もある。\n" +"ここで紹介するのは明確に受入れられたリテラルの網羅的なリストではない。" + +#: ../docs/Tags.md:215 +msgid "" +"* `true`, `false`, `nil` — used when a method returns these explicit " +"literal\n" +" values. Note that if your method returns both `true` or `false`, you " +"should use\n" +" the `Boolean` conventional type instead.\n" +"* `self` — has the same meaning as Ruby's \"self\" keyword in the " +"context of\n" +" parameters or return types. Recommended mostly for {tag:return} tags that " +"are\n" +" chainable.\n" +"* `void` — indicates that the type for this tag is explicitly " +"undefined.\n" +" Mostly used to specify {tag:return} tags that do not care about their " +"return\n" +" value. Using a `void` return tag is recommended over no type, because it " +"makes\n" +" the documentation more explicit about what the user should expect. YARD " +"will\n" +" also add a note for the user if they have undefined return types, making " +"things\n" +" clear that they should not use the return value of such a method." +msgstr "" +"* `true`, `false`, `nil` — メソッドがこれらの明確なリテラル値を返す時に\n" +" 利用される。次の事に留意する。\n" +" あなたのメソッドが `true` や `false` 両方を返す場合、\n" +" 代わりにあなたは `Boolean` の慣例の型を使わなければならない。\n" +"* `self` — パラメータや戻りの型のコンテキストでRubyの\"self\"キーワードのように\n" +" 同じ意味を持つ。\n" +" 大体はチェーン可能な {tag:return} タグが推奨される。\n" +"* `void` — このタグが明確に未定義とされる型を指示する。\n" +" 一般的にそれらの戻り値について気にしない {tag:return} タグに利用される。\n" +" `void` return タグを使う事によって、型がない事を知らせ、\n" +" ユーザーが期待する事についての明確な情報のドキュメントを作れる。\n" +" 未定義の戻りの型を持つ場合、YARDはユーザーの為に注釈も追加し、\n" +" それらのメソッドなどの戻り値を使わないものを明らかにする。" + +#: ../docs/Tags.md:228 +msgid "" +msgstr "" + +#: ../docs/Tags.md:232 +msgid "" +"

    \n" +" Reference tag syntax applies only to meta-data tags, not directives.\n" +"

    " +msgstr "" +"

    \n" +" Reference tag syntax applies only to meta-data tags, not directives.\n" +"

    " + +#: ../docs/Tags.md:236 +msgid "" +"If a tag's data begins with `(see OBJECT)` it is considered a \"reference tag" +"\".\n" +"A reference tag literally copies the tag data by the given tag name from " +"the\n" +"specified OBJECT. For instance, a method may copy all {tag:param} tags from\n" +"a given object using the reference tag syntax:" +msgstr "" +"`(see OBJECT)` を用い始まるタグデータの場合\"参照タグ\"と見なす。\n" +"参照タグは文字通り指定されたオブジェクトから与えられたタグ名によって\n" +"タグデータをコピーする。\n" +"例えばメソッドは次の参照タグ構文によって\n" +"与えられたオブジェクトから全ての {tag:param} タグをコピーする。" + +#: ../docs/Tags.md:241 +msgid "" +" # @param [String] user the username for the operation\n" +" # @param [String] host the host that this user is associated with\n" +" # @param [Time] time the time that this operation took place\n" +" def clean(user, host, time = Time.now) end" +msgstr "" +" # @param [String] user the username for the operation\n" +" # @param [String] host the host that this user is associated with\n" +" # @param [Time] time the time that this operation took place\n" +" def clean(user, host, time = Time.now) end" + +#: ../docs/Tags.md:246 +msgid "" +" # @param (see #clean)\n" +" def activate(user, host, time = Time.now) end" +msgstr "" +" # @param (see #clean)\n" +" def activate(user, host, time = Time.now) end" + +#: ../docs/Tags.md:249 +msgid "## Adding Custom Tags" +msgstr "## Adding Custom Tags" + +#: ../docs/Tags.md:251 +msgid "" +"

    If a tag is specific to a given project, consider " +"namespacing\n" +" it by naming it in the form projectname.tagname, ie.,\n" +" yard.tag_signature.

    " +msgstr "" +"

    If a tag is specific to a given project, consider namespacing\n" +" it by naming it in the form projectname.tagname, ie.,\n" +" yard.tag_signature.

    " + +#: ../docs/Tags.md:255 +msgid "" +"Custom tags can be added to YARD either via the command-line or " +"programmatically.\n" +"The programmatic method is not discussed in this document, but rather in " +"the\n" +"{file:docs/TagsArch.md} document." +msgstr "" +"カスタムタグはコマンドラインかプログラム経由でYARDに追加される。\n" +"プログラム的なメソッドはこのドキュメントの中で議論しないが、\n" +"{file:docs/TagsArch.md} のドキュメントで参照できる。" + +#: ../docs/Tags.md:259 +msgid "" +"To add a custom tag via the command-line or .yardopts file, you can use the\n" +"`--*-tag` options. A few different options are available for the common tag\n" +"syntaxes described above. For example, to add a basic freeform tag, use:" +msgstr "" +"コマンドラインや.yardoptsファイル経由でカスタムタグを追加するには、\n" +"`--*-tag` オプションを使う事ができる。\n" +"少数の異なるオプションは上で議論された一般的なタグ構文用に利用可能である。\n" +"例えば、基本のフリーフォームタグに追加するには次のようになる:" + +#: ../docs/Tags.md:263 +msgid "" +" !!!sh\n" +" $ yard doc --tag rest_url:\"REST URL\"" +msgstr "" +" !!!sh\n" +" $ yard doc --tag rest_url:\"REST URL\"" + +#: ../docs/Tags.md:266 +msgid "" +"This will register the `@rest_url` tag for use in your documentation and " +"display\n" +"this tag in HTML output wherever it is used with the heading \"REST URL\".\n" +"Note that the tag title should follow the tag name with a colon (`:`). " +"Other\n" +"tag syntaxes exist, such as the type specifier list freeform tag\n" +"(`--type-tag`), or a named key tag with types (`--type-name-tag`)." +msgstr "" +"これはあなたのドキュメントで利用するため `@rest_url` タグが追加され、\n" +"\"REST URL\"の表題と一緒にHTML出力でこのタグを表示する。\n" +"次の事に留意する。\n" +"タグタイトルは次のコロンを用いた(`:`)タグ名にしなければならない。\n" +"他のタグ構文は型指定のリストのフリーフォームタグの(`--type-tag`)や\n" +"(`--type-name-tag`)の型を用いるキー名のタグなどが存在する。" + +#: ../docs/Tags.md:272 +msgid "" +"If you want to create a tag but not display it in output (it is only for\n" +"programmatic use), add `--hide-tag tagname` after the definition:" +msgstr "" +"あなたがタグを作成する為にほしい場合\n" +"しかしその出力で表示しない場合(プログラム的にだけ利用する)\n" +"定義の後で `--hide-tag tagname` を追加する:" + +#: ../docs/Tags.md:275 +msgid "" +" !!!sh\n" +" $ yard doc --tag complexity:\"McCabe Complexity\" --hide-tag complexity" +msgstr "" +" !!!sh\n" +" $ yard doc --tag complexity:\"McCabe Complexity\" --hide-tag complexity" + +#: ../docs/Tags.md:278 +msgid "" +"Note that you might not need a tag title if you are hiding it. The title\n" +"part can be omitted." +msgstr "" +"次の事に留意する。\n" +"あなたはタグタイトル隠す場合は必要としないかもしれない。\n" +"タイトルの一部は除外できる。" + +#: ../docs/Tags.md:281 +msgid "{yard:include_tags}" +msgstr "{yard:include_tags}" + +# title +#: ../docs/TagsArch.md:1 +msgid "Tags Architecture" +msgstr "タグ構造" + +#: ../docs/TagsArch.md:3 +msgid "# Tags Architecture" +msgstr "# タグ構造" + +#: ../docs/TagsArch.md:5 +msgid "## Programmatic API" +msgstr "## プログラムのAPI" + +#: ../docs/TagsArch.md:7 +msgid "### Accessing Tag Information" +msgstr "### タグの情報を使う" + +#: ../docs/TagsArch.md:9 +msgid "" +"Tag metadata is added when a {YARD::Docstring} is added to a {file:docs/" +"CodeObjects.md code object}\n" +"using the {YARD::CodeObjects::Base#docstring=} attribute. In addition to " +"adding\n" +"conventional comments, tags are parsed and associated with the object. The " +"easiest\n" +"way to access tags on an object is to use the {YARD::CodeObjects::Base#tag} " +"and `#tags`\n" +"methods, for example:" +msgstr "" +"タグのメタデータは{YARD::Docstring}が\n" +"{YARD::CodeObjects::Base#docstring=} 属性を用い\n" +"{file:docs/CodeObjects.md コードオブジェクト} の為に追加される時、追加される。\n" +"通常型のコメントをつけることに加えて、タグは解析され、オブジェクトと関係付けられる。\n" +"オブジェクトのタグにアクセスするのに最も簡単な方法は、\n" +"{YARD::CodeObjects::Base#tag} や `#tags` メソッドを利用することである。\n" +"例えば:" + +#: ../docs/TagsArch.md:15 +msgid "" +" # Using the Foo class object from above\n" +" obj.tags(:tagname).first.text #=> \"some data\"" +msgstr "" +" # 上からFooクラスオブジェクトを使う\n" +" obj.tags(:tagname).first.text #=> \"some data\"" + +#: ../docs/TagsArch.md:18 +msgid "" +"Because multiple tags can be stored with the same name, they are stored as a " +"list\n" +"of tags. The `#tag` method is an alias for the first item in the list of " +"tags.\n" +"Also note that the `#tag`, `#tags` and `#has_tag?` methods are all " +"convenience\n" +"methods that delegate to the {YARD::Docstring} object described above." +msgstr "" +"同じ名前の複数のタグが格納されることもあるので、\n" +"それらはタグのリストとなっている。\n" +"`#tag` メソッドはタグのリストにおける最初のアイテムのエイリアスである。\n" +"また、the `#tag`についても述べておく。\n" +"`#tags` と `#has_tag?` のメソッドは上で記述された{YARD::Docstring}\n" +"オブジェクトを委譲する便利なメソッドである。" + +#: ../docs/TagsArch.md:23 +msgid "### Adding Custom Tags" +msgstr "### カスタムタグを付ける" + +#: ../docs/TagsArch.md:25 +msgid "" +"The `@tagname` tag used in the above examples is clearly not part of the " +"tags\n" +"that come with YARD. If such a tag would actually be part of documentation " +"under\n" +"a default install, YARD would raise a warning that the tag does not exist. " +"It is,\n" +"however, trivial to add this tag to be recognized by YARD." +msgstr "" +"前記の例などで使われている@tagnemeタグは明らかにYARDに存在するタグの一部では" +"ない。\n" +"もしそのようなタグがデフォルトでインストールされたドキュメントの一部であれ" +"ば、\n" +"YARDはそのようなタグは存在していないという警告を出すだろう。\n" +"つまり、YARDによって認識されるためのタグを付けることは、\n" +"重要ではない。" + +#: ../docs/TagsArch.md:30 +msgid "" +"All tags in YARD are added to the {YARD::Tags::Library tag library} which " +"makes\n" +"use of a tag factory class to parse the data inside the tags. To simply add " +"a\n" +"tag that stores simple text like our `@tagname` tag above, use:" +msgstr "" +"YARDのすべてのタグは{YARD::Tags::Library tag library}に追加される。\n" +"{YARD::Tags::Library tag library}はタグの中のデータを解析する為に、\n" +"タグファクトリークラスを利用している。\n" +"@tagnameタグのように単純なテキストを収納したタグを追加するなら、\n" +"次のようになる:" + +#: ../docs/TagsArch.md:34 +msgid " YARD::Tags::Library.define_tag(\"A Sample Tag\", :tagname)" +msgstr " YARD::Tags::Library.define_tag(\"A Sample Tag\", :tagname)" + +#: ../docs/TagsArch.md:36 +msgid "" +"This will now allow YARD to add the metadata from `@tagname` to the " +"docstring." +msgstr "docstringに`@tagname`からメタデータをつけることをYARDに許可する。" + +#: ../docs/TagsArch.md:38 +msgid "## Tag Factory Architecture" +msgstr "## タグファクトリー構造" + +#: ../docs/TagsArch.md:40 +msgid "" +"Recognizing a tag is one part of the process. Parsing the tag contents is " +"the\n" +"second step. YARD has a tag architecture that allows developers to add or " +"completely\n" +"change the way tags contents can be parsed." +msgstr "" +"タグを認識することはプロセスの一部である。\n" +"タグの中身を解析するのは第二段階となる。\n" +"YARDはタグの構造を持っている。\n" +"タグの構造によって、\n" +"開発者は中身が解析可能なタグを加えたり変更したりすることができる。\n" + +#: ../docs/TagsArch.md:44 +msgid "" +"The separation of registration and tag creation can be seen in the " +"following\n" +"class diagram:" +msgstr "登録の分離やタグ作成は次の表の通り。" + +#: ../docs/TagsArch.md:47 +msgid "![Tags Architecture Class Diagram](images/tags-class-diagram.png)" +msgstr "![Tags Architecture Class Diagram](images/tags-class-diagram.png)" + +#: ../docs/TagsArch.md:49 +msgid "### DefaultFactory" +msgstr "### デフォルトファクトリー" + +#: ../docs/TagsArch.md:51 +msgid "" +"By default, YARD has a few standard syntaxes that can be parsed for tags. " +"These\n" +"are all implemented by the {YARD::Tags::DefaultFactory} class. These " +"syntaxes\n" +"are:" +msgstr "" +"デフォルトで、YARDはタグを解析するいくつかの標準の構文を持っている。\n" +"それらはすべて {YARD::Tags::DefaultFactory}クラスで実装されている。\n" +"これらの構文は以下のとおり。\n" + +#: ../docs/TagsArch.md:55 +msgid "" +" * Standard text: no parsing is done, but text is stripped of newlines and\n" +" multiple spaces." +msgstr "" +" * Standard text: 解析されていない。\n" +" しかしテキストは新しい行や多重のスペースが取り除かれている。" + +#: ../docs/TagsArch.md:58 +msgid "" +" * Raw text: does no parsing at all, no stripping of newlines or spaces. " +"This\n" +" is best used for code snippets." +msgstr "" +" * Raw text: まったく解析していない、新しい行やスペースは取り除かれていない。\n" +" これはコードスニペットによく使われる。" + +#: ../docs/TagsArch.md:61 +msgid "" +" * Raw text with title: does no parsing on the text but extracts the first " +"line\n" +" of the metadata as the \"title\", useful for tags such as `@example`:" +msgstr "" +" * Raw text with title: テキストの上では解析していないが、\n" +" メタデータの最初の行を\"title\"として抽出する。以下の `@example` のようなタグで便利である:" + +#: ../docs/TagsArch.md:64 +msgid "" +" # @example Inspect an element\n" +" # myobj.inspect #=> #" +msgstr "" +" # @example Inspect an element\n" +" # myobj.inspect #=> #" + +#: ../docs/TagsArch.md:67 +msgid "" +" * Text with types: parses a list of types at the beginning of the text. " +"Types\n" +" are optional. The standard syntax is in the form `[type1, type2, ...]`,\n" +" for example:" +msgstr "" +" * Text with types: テキストの最初の部分で型のリストを解析する。型は任意で指定できる。\n" +"標準的な構文は`[type1, type2, ...]`という型をしている。例えば:" + +#: ../docs/TagsArch.md:71 +msgid "" +" # @return [String, Symbol] a description here\n" +" # @return description here with no types" +msgstr "" +" # @return [String, Symbol] a description here\n" +" # @return description here with no types" + +#: ../docs/TagsArch.md:74 +msgid "" +" * Text with types and a name: parses a list of types at the beginning of " +"text\n" +" followed by a name and extra descriptive text. For example:" +msgstr "" +" * Text with types and a name: 名前や説明文が続くテキストの最初の部分で\n" +"型のリストを解析する。例えば:" + +#: ../docs/TagsArch.md:77 +msgid "" +" # @param [String] str the string to reverse\n" +" def reverse(str) '...' end" +msgstr "" +" # @param [String] str the string to reverse\n" +" def reverse(str) '...' end" + +#: ../docs/TagsArch.md:80 +msgid "" +"As mentioned above, this syntax is implemented by the `DefaultFactory` which " +"can\n" +"be swapped out for any factory. In some cases, a developer may want to " +"change\n" +"the type declaration syntax to be in the form:" +msgstr "" +"上述のように、この構文はDefaultFactoryで実装されている。\n" +"DefaultFactoryは任意のfactoryに交換されることができる。\n" +"時には、開発者はfactory構造の型宣言構文を変えることができる。" + +#: ../docs/TagsArch.md:84 +msgid " # @tagname name description" +msgstr " # @tagname 名前 <型..., here> 説明" + +#: ../docs/TagsArch.md:86 +msgid "" +"This can be done by simply implementing a new factory that parses the data " +"in\n" +"this form." +msgstr "" +"このフォームの中でデータを解析する新しいファクトリーを実装するだけでよい。" + +#: ../docs/TagsArch.md:89 +msgid "### Implementing a Factory" +msgstr "### ファクトリー実装する" + +#: ../docs/TagsArch.md:91 +msgid "" +"Factories should implement the method `parse_tag` as well as any " +"`parse_tag_SUFFIX`\n" +"method where SUFFIX refers to the suffix added when declaring the tag. For " +"example,\n" +"a tag can also be declared as follows:" +msgstr "" +"ファクトリーはタグが宣言される時に、 `parse_tag_SUFFIX` メソッドのように\n" +"`parse_tag` メソッドが実装される。例えば、次のようにタグを定義できる。" + +#: ../docs/TagsArch.md:95 +msgid " YARD::Tags::Library.define_tag \"Parameter\", :param, :with_types" +msgstr " YARD::Tags::Library.define_tag \"Parameter\", :param, :with_types" + +#: ../docs/TagsArch.md:97 +msgid "" +"In such a case, the factory will be called with method " +"`parse_tag_with_types`. In\n" +"all cases, the method should return a new {YARD::Tags::Tag} object. " +"Generally,\n" +"the `parse_tag` methods take 2 or 3 parameters. A simple tag can be " +"implemented\n" +"as:" +msgstr "" +"上のようなケースでは、ファクトリーは `parse_tag_with_types` とともに呼び出される。\n" +"メソッドは新しい{YARD::Tags::Tag}オブジェクトを必ず返さなければならない。\n" +"一般に、 `parse_tag` メソッドは2つか3つの引数を取得する。\n" +"単純なタグは次のように実装することができる。" + +#: ../docs/TagsArch.md:102 +msgid "" +" def parse_tag(tag_name, text)\n" +" Tag.new(tag_name, text)\n" +" end" +msgstr "" +" def parse_tag(tag_name, text)\n" +" Tag.new(tag_name, text)\n" +" end" + +#: ../docs/TagsArch.md:106 +msgid "" +"The text parameter contains pre-parsed text with extra spaces and newlines " +"removed.\n" +"If required, the method could also be declared with a third parameter " +"containing\n" +"unmodified raw text:" +msgstr "" +"テキストパラメータは、\n" +"余分な空白と改行を削除するよう事前解析したテキストが含まれている。\n" +"もし必要なら以下のように、\n" +"3つ目の引数を用いて修正されていない生テキストを含めて宣言できる。" + +#: ../docs/TagsArch.md:110 +msgid "" +" def parse_tag_with_raw_text(tag_name, text, raw_text)\n" +" Tag.new(tag_name, raw_text)\n" +" end" +msgstr "" +" def parse_tag_with_raw_text(tag_name, text, raw_text)\n" +" Tag.new(tag_name, raw_text)\n" +" end" + +#: ../docs/TagsArch.md:114 +msgid "" +"Note that this method would be invoked for a tag declared with the `:" +"with_raw_text`\n" +"suffix." +msgstr "" +"次の事に留意する。\n" +"このメソッドはwith_raw_text suffixとともに宣言されたタグのために呼び出され" +"る。" + +#: ../docs/TagsArch.md:117 +msgid "### Changing the Factory" +msgstr "### ファクトリーを変更する" + +#: ../docs/TagsArch.md:119 +msgid "" +"To change the factory, set the {YARD::Tags::Library.default_factory} " +"attribute:" +msgstr "" +"ファクトリーを変更する為には、\n" +"以下の様に{YARD::Tags::Library.default_factory}属性を設定する。" + +#: ../docs/TagsArch.md:121 +msgid " YARD::Tags::Library.default_factory = MyFactory" +msgstr " YARD::Tags::Library.default_factory = MyFactory" + +#: ../docs/TagsArch.md:123 +msgid "" +"This must be done before any parsing is done, or the factory will not be " +"used." +msgstr "" +"これは解析が完了する前にしなければならない、でなければfactoryは使えない。" + +# title +#: ../docs/Templates.md:1 +msgid "Templates Architecture" +msgstr "テンプレート構造" + +#: ../docs/Templates.md:3 +msgid "# Templates Architecture" +msgstr "# テンプレート構造" + +#: ../docs/Templates.md:5 +msgid "" +"Templates are the main component in the output rendering process of YARD,\n" +"which is invoked when conventional HTML/text output needs to be rendered\n" +"for a set of code objects." +msgstr "" +"テンプレートは、YARDの処理を表示出力するのが主な内容となる。\n" +"そして、コードオブジェクトの集まりを表示する為に\n" +"従来のHTML/text出力が必要な時呼び出される。" + +#: ../docs/Templates.md:9 +msgid "## Design Goals" +msgstr "## 設計目標" + +#: ../docs/Templates.md:11 +msgid "" +"The general design attempts to be as abstracted from actual content and " +"templates\n" +"as possible. Unlike RDoc which uses one file to describe the entire " +"template,\n" +"YARD splits up the rendering of code objects into small components, " +"allowing\n" +"template modification for smaller subsets of a full template without having " +"to\n" +"duplicate the entire template itself. This is necessary because of YARD's " +"support\n" +"for plugins. YARD is designed for extensibility by external plugins, and " +"because\n" +"of this, no one plugin can be responsible for the entire template because " +"no\n" +"one plugin knows about the other plugins being used. For instance, if an " +"RSpec\n" +"plugin was added to support and document specifications in class templates,\n" +"this information would need to be transparently added to the template to " +"work\n" +"in conjunction with any other plugin that performed similar template " +"modifications.\n" +"The design goals can be summarized as follows:" +msgstr "" +"おおまかな設計目標は\n" +"テンプレートで、できるかぎり実際の内容から抽象化するのを試みる事である。\n" +"RDocとは違って、\n" +"YARDは、全てのテンプレートを説明する為に一つのファイルを利用し、\n" +"コードオブジェクトの表示を分割し小さい構成とする。\n" +"そして、テンプレートは\n" +"全てのテンプレートが重複無しに\n" +"最小のテンプレートの部分毎の修正を受け入れる\n" +"これは、プラグインのYARDのサポートの為に\n" +"必須となります。\n" +"YARDは、外部のプラグインによる拡張性を考え設計されている。\n" +"そんなわけで、プラグイン無しで全てのテンプレートを実行することが出来る。\n" +"何故なら、プラグインが無い場合は、\n" +"他のプラグインが利用される事について\n" +"識別するからである。\n" +"例えば、RSpecプラグインの場合、\n" +"サポートが追加されたり、\n" +"クラステンプレートの中の仕様が記述される。\n" +"同様のテンプレートの改良を施した\n" +"他のどんなプラグインを用いても、\n" +"連携するできるよう、テンプレートが\n" +"透過的に追加されることを必要とする。\n" +"設計目標は、以下の様に要約される。" + +#: ../docs/Templates.md:24 +msgid "" +" 1. Output should be able to be rendered for any arbitrary format with " +"little\n" +" modification to YARD's source code. The addition of extra templates " +"should\n" +" be sufficient.\n" +" 2. The output rendered for an object should independently rendered data\n" +" from arbitrary sources. These independent components are called " +"\"sections\".\n" +" 3. Sections should be able to be inserted into any object without " +"affecting\n" +" any existing sections in the document. This allows for easy " +"modification\n" +" of templates by plugins." +msgstr "" +" 1. 出力はYARDのソースコードへの少ない変更で\n" +" 全て任意のフォーマット用に表示可能にすべきである。\n" +" テンプレートの追加は充分なものにすべきである。\n" +"\n" +" 2. オブジェクト用に表示される出力は、任意のソースから独自にデータを\n" +" 表示するべきである。\n" +" これらの独自構成は\"sections\"を呼び出す。\n" +"\n" +" 3. セクションはドキュメントの中の任意の存在するセクションへの影響無しで\n" +" 任意のオブジェクトに挿入される事を可能にするべきである。\n" +" これはプラグインによるテンプレートの簡単な変更を受け入れる。" + +#: ../docs/Templates.md:33 +msgid "## Templates" +msgstr "## テンプレート" + +#: ../docs/Templates.md:35 +msgid "" +"Template modules are the objects used to orchestrate the design goals " +"listed\n" +"above. Specifically, they organize the sections and render the template " +"contents\n" +"depending on the format." +msgstr "" +"テンプレートモジュールは上で記述した設計目標を実現する為に利用されるオブジェクトとなる。\n" +"具体的にいうと、セクションを組織化したり、\n" +"フォーマットに依存するテンプレートの内容を表示する。" + +#: ../docs/Templates.md:39 +msgid "## Engine" +msgstr "## エンジン" + +#: ../docs/Templates.md:41 +msgid "" +"The Engine class orchestrates the creation and rendering of Template modules " +"and\n" +"handles serialization or specific rendering scenarios (like HTML). To " +"create\n" +"a template, use the {YARD::Templates::Engine.template template} method. The " +"two most\n" +"common methods used to initiate output are the {YARD::Templates::Engine." +"render render}\n" +"and {YARD::Templates::Engine.generate generate} methods which generate and\n" +"optionally serialize output to a file. The latter, `#generate`, is used\n" +"specially to generate HTML documentation and copy over assets that may be\n" +"needed. For instance, an object may be rendered with:" +msgstr "" +"エンジンクラスは、\n" +"作成とテンプレートモジュールの表示やシリアライズ処理や\n" +"特定の表示(HTMLのような)を統合する。\n" +"テンプレートを作成する為には、\n" +"{YARD::Templates::Engine.template template}メソッドを使用する。\n" +"出力を開始するために使われる二つの一般的なメソッドは\n" +"{YARD::Templates::Engine.render render} と\n" +"{YARD::Templates::Engine.generate generate} メソッドで\n" +"生成しファイルに任意で出力をシリアライズする。\n" +"その後で、 `#generate` メソッドは、\n" +"HTMLドキュメントを生成するための特別に使用され,\n" +"必要とされる資産をコピーする。\n" +"例えば,オブジェクトが次の例を用い表示される場合:" + +#: ../docs/Templates.md:50 +msgid " YARD::Templates::Engine.render(:object => myobject)" +msgstr " YARD::Templates::Engine.render(:object => myobject)" + +#: ../docs/Templates.md:52 +msgid "A set of objects may be rendered into HTML documentation by using:" +msgstr "" +"オブジェクトの設定は、以下の記法を用いる事によってHTMLドキュメントで表示され" +"る。" + +#: ../docs/Templates.md:54 +msgid "" +" # all_objects is an array of module and class objects\n" +" # options includes a :serializer key to copy output to the file system\n" +" YARD::Templates::Engine.generate(all_objects, options)" +msgstr "" +" # all_objects はモジュールの配列やクラスオブジェクトとなる\n" +" # options はファイルシステムにコピー出力するの為に:serializerキーを含んで" +"いる。\n" +" YARD::Templates::Engine.generate(all_objects, options)" + +#: ../docs/Templates.md:58 +msgid "" +"Note that these methods should not be called directly. The {YARD::" +"CodeObjects::Base}\n" +"class has a {YARD::CodeObjects::Base#format #format} helper method to render " +"an\n" +"object. For instance, the above render example is equivalent to the simple\n" +"call `myobject.format`. The `generate` method is a special kind of render\n" +"and is called from the {YARD::CLI::Yardoc} command line utility." +msgstr "" +"次の事に留意する。\n" +"これらのメソッドは、直接呼び出されるべきではない。\n" +"{YARD::CodeObjects::Base}クラスは\n" +"オブジェクトを表示する為の\n" +"{YARD::CodeObjects::Base#format #format} helper メソッドを\n" +"持っている。\n" +"例えば、上の表示の例は、\n" +"単純な`myobject.format`呼び出しと同等である。\n" +"`generate`メソッドは、特別な表示をし、\n" +"そしてそれは、{YARD::CLI::Yardoc}コマンドラインから呼び出せる。" + +#: ../docs/Templates.md:64 +msgid "## Template Options" +msgstr "## テンプレートオプション" + +#: ../docs/Templates.md:66 +msgid "" +"A template keeps state when it is rendering output. This state is kept in\n" +"an options hash which is initially passed to it during instantiation. Some\n" +"default options set the template style (`:template`), the output format (`:" +"format`),\n" +"and the serializer to use (`:serializer`). This options hash is modifiable\n" +"from all methods seen above. For example, initializing a template to output " +"as\n" +"HTML instead of text can be done as follows:" +msgstr "" +"テンプレートはそれが出力表示の時に状態を保持する。\n" +"この状態はハッシュのオプションの中で保持される。\n" +"そしは最初にインスタンス化される間に渡される。\n" +"幾つかのデフォルトのオプションはテンプレートスタイル(`:template`)\n" +"と出力フォーマット(`:format`)と(`:serializer`)を使うためのシリアライザーを設定する。\n" +"このハッシュのオプションは上で見られた全てのメソッドから変更可能\n" +"例えばテキストの代わりにHTMLとして出力するためにテンプレートを初期するには、次の様にできる。" + +#: ../docs/Templates.md:73 +msgid " myobject.format(:format => :html)" +msgstr " myobject.format(:format => :html)" + +#: ../docs/Templates.md:75 +msgid "## Serializer" +msgstr "## シリアライザー" + +#: ../docs/Templates.md:77 +msgid "" +"This class abstracts the logic involved in deciding how to serialize data " +"to\n" +"the expected endpoint. For instance, there is both a {YARD::Serializers::" +"StdoutSerializer StdoutSerializer}\n" +"and {YARD::Serializers::FileSystemSerializer FileSystemSerializer} class " +"for\n" +"outputting to console or to a file respectively. When endpoints with " +"locations\n" +"are used (like files or URLs), the serializer implements the {YARD::" +"Serializers::Base#serialized_path #serialized_path}\n" +"method. This allows the translation from a code object to its path at the " +"endpoint,\n" +"which enables inter-document linking." +msgstr "" +"このクラスは期待された出力先へ\n" +"データをシリアライズする為に、\n" +"決定方法,関連するロジックを抽象化する。\n" +"例えば、コンソールや個々のファイルの為の出力用の\n" +"{YARD::Serializers::StdoutSerializer StdoutSerializer}と、\n" +"{YARD::Serializers::FileSystemSerializer FileSystemSerializer} クラスがあ" +"る。\n" +"出力先が指定される時(ファイルやURLのような)、\n" +"シリアライザーは、{YARD::Serializers::Base#serialized_path #serialized_path}" +"メソッドを実装する。\n" +"これは、コードオブジェクトから出力先のパスまでの翻訳を受け入れ、\n" +"そして、内部のドキュメントのリンクを可能にする。" + +#: ../docs/Templates.md:85 +msgid "" +"Rendered objects are automatically serialized using the object if present,\n" +"otherwise the rendered object is returned as a string to its parent. Nested\n" +"Templates automatically set the serializer to nil so that they return\n" +"as a String to their parent." +msgstr "" +"表示されるオブジェクトが存在する場合は,\n" +"オブジェクトによって自動的にシリアライズされる。\n" +"それ以外の場合,表示されるオブジェクトはその親に文字列として返される。\n" +"ネストされたテンプレートはnilに自動的にシリアライザーを設定する。\n" +"なのでこれはそれらの親に文字列として返される。" + +#: ../docs/Templates.md:90 +msgid "## Creating a Template" +msgstr "## テンプレート作成" + +#: ../docs/Templates.md:92 +msgid "" +"Templates are represented by a directory inside the {YARD::Templates::Engine." +"template_paths}\n" +"on disk. A standard template directory looks like the following tree:" +msgstr "" +"テンプレートは\n" +"ディスク上の{YARD::Templates::Engine.template_paths}の中のディレクトリによって表される。\n" +"標準的なテンプレートは次の木構造のようになる。" + +#: ../docs/Templates.md:95 +msgid "" +" (Assuming templates/ is a template path)\n" +" templates\n" +" `-- default\n" +" |-- class\n" +" | |-- dot\n" +" | | |-- setup.rb\n" +" | | `-- superklass.erb\n" +" | |-- html\n" +" | | |-- constructor_details.erb\n" +" | | |-- setup.rb\n" +" | | `-- subclasses.erb\n" +" | |-- setup.rb\n" +" | `-- text\n" +" | |-- setup.rb\n" +" | `-- subclasses.erb\n" +" |-- docstring\n" +" | |-- html\n" +" | | |-- abstract.erb\n" +" | | |-- deprecated.erb\n" +" | | |-- index.erb\n" +" | | `-- text.erb\n" +" | |-- setup.rb\n" +" | `-- text\n" +" | |-- abstract.erb\n" +" | |-- deprecated.erb\n" +" | |-- index.erb\n" +" | `-- text.erb" +msgstr "" +" (Assuming templates/ is a template path)\n" +" templates\n" +" `-- default\n" +" |-- class\n" +" | |-- dot\n" +" | | |-- setup.rb\n" +" | | `-- superklass.erb\n" +" | |-- html\n" +" | | |-- constructor_details.erb\n" +" | | |-- setup.rb\n" +" | | `-- subclasses.erb\n" +" | |-- setup.rb\n" +" | `-- text\n" +" | |-- setup.rb\n" +" | `-- subclasses.erb\n" +" |-- docstring\n" +" | |-- html\n" +" | | |-- abstract.erb\n" +" | | |-- deprecated.erb\n" +" | | |-- index.erb\n" +" | | `-- text.erb\n" +" | |-- setup.rb\n" +" | `-- text\n" +" | |-- abstract.erb\n" +" | |-- deprecated.erb\n" +" | |-- index.erb\n" +" | `-- text.erb" + +#: ../docs/Templates.md:123 +msgid "" +"The path `default` refers to the template style (:template key in options " +"hash)\n" +"and the directories at the next level (such as `class`) refer to template\n" +"`:type` (options hash key) for a template. The next directory refers to the\n" +"output format being used defined by the `:format` template option." +msgstr "" +"パスの `default` はテンプレートスタイル(:template key in options hash)を参照し\n" +"次の階層でディレクトリは(例えば `class` など)\n" +"テンプレート用のテンプレートの `:type` (ハッシュのオプションキー)を参照する。\n" +"次のディレクトリは\n" +"`:format` テンプレートオプションによって定義され、\n" +"利用される出力フォーマットを参照する。" + +#: ../docs/Templates.md:128 +msgid "" +"As we saw in the above example, the format option can be set to `:html`, " +"which\n" +"would use the `html/` directory instead of `text/`. Finally, the individual ." +"erb\n" +"files are the sections that make up the template." +msgstr "" +"だれもが上の例で見た通り、\n" +"フォーマットオプションは `:html` に設定でき、\n" +"`text/` の代わりに `html/` ディレクトリを利用する。\n" +"最終的に個々の.erbファイルは、テンプレートを作り上げるセクションである。" + +#: ../docs/Templates.md:132 +msgid "" +"Note that the subdirectory `html/` is also its own \"template\" that " +"inherits\n" +"from the parent directory. We will see more on this later." +msgstr "" +"次の事に留意する。\n" +"`html/` サブディレクトリは\n" +"それ自身が親ディレクトリから継承する\"テンプレート\"でもある。\n" +"この後の項で詳細がされる。" + +#: ../docs/Templates.md:135 +msgid "## setup.rb" +msgstr "## setup.rb" + +#: ../docs/Templates.md:137 +msgid "" +"Every template should have at least one `setup.rb` file that defines the\n" +"{YARD::Templates::Template#init #init} method to set the\n" +"{YARD::Templates::Template#sections #sections} used by the template. If\n" +"a setup.rb is not defined in the template itself, there should be a " +"template\n" +"that is inherited (via parent directory or explcitly) that sets the " +"sections\n" +"on a newly created template." +msgstr "" +"常にテンプレートは少なくとも\n" +"テンプレートによって利用した{YARD::Templates::Template#sections #sections}を設定するために\n" +"{YARD::Templates::Template#init #init}メソッドを定義する\n" +"`setup.rb` ファイルを持つ。\n" +"setup.rbがテンプレートの中で未定義の場合は、\n" +"新規に作成されたテンプレート上のセクションを設定し、\n" +"継承される(親のディレクトリや明示的に)テンプレートになるべきである。" + +#: ../docs/Templates.md:144 +msgid "A standard setup.rb file looks like:" +msgstr "標準的なsetup.rbファイルは以下のように見える。" + +#: ../docs/Templates.md:146 +msgid "" +" def init\n" +" sections :section1, :section2, :section3\n" +" end" +msgstr "" +" def init\n" +" sections :section1, :section2, :section3\n" +" end" + +#: ../docs/Templates.md:150 +msgid "## Sections" +msgstr "## セクション" + +#: ../docs/Templates.md:152 +msgid "" +"Sections are smaller components that correlate to template\n" +"fragments. Practically speaking, a section can either be a template " +"fragment\n" +"(a conventional .erb file or other supported templating language), a method\n" +"(which returns a String) or another {YARD::Templates::Template} (which in " +"turn has its own\n" +"list of sections)." +msgstr "" +"セクションはテンプレートフラグに関連するより小さい構成要素である。\n" +"事実上、セクションはいづれかの\n" +"テンプレートの\n" +"フラグ(慣習で.erbファイルや他にサポートされたテンプレート言語),\n" +"メソッド(文字列を返す)やそれ以外{YARD::Templates::Template}にできる\n" +"(言い換えればセクションの自身のリストを持つ)" + +#: ../docs/Templates.md:158 +msgid "## Nested Sections" +msgstr "## ネストしたセクション" + +#: ../docs/Templates.md:160 +msgid "" +"Sections often require the ability to encapsulate a set of sub-sections in " +"markup\n" +"(HTML, for instance). Rather than use heavier Template subclass objects, a " +"more\n" +"lightweight solution is to nest a set of sub-sections as a list that " +"follows\n" +"a section, for example:" +msgstr "" +"セクションは時々マークアップで\n" +"サブセクションのグループを要約するのに能力を必要とする。(例えばHTML)\n" +"サブクラスオブジェクトのより重いテンプレートを使うより、\n" +"より軽い答えが\n" +"次のセクションのリストとしてサブセクションのグループをネストする事である。\n" +"例えば:" + +#: ../docs/Templates.md:165 +msgid "" +" def init\n" +" sections :header, [:section_a, :section_b]\n" +" end" +msgstr "" +" def init\n" +" sections :header, [:section_a, :section_b]\n" +" end" + +#: ../docs/Templates.md:169 +msgid "" +"The above example nests `section_a` and `section_b` within the `header` " +"section.\n" +"Practically speaking, these sections can be placed in the result by " +"`yield`ing\n" +"to them. A sample header.erb template might contain:" +msgstr "" +"上の例は、 `header` セクションの中に\n" +"`section_a` と `section_b` をネストする。\n" +"具体的には、これらのセクションは、\n" +"`yield` する事によってその結果の中に置かれる。\n" +"例のheader.erbテンプレートは以下を含んでいる" + +#: ../docs/Templates.md:173 +msgid "" +"

    Header

    \n" +"
    \n" +" <%= yieldall %>\n" +"
    " +msgstr "" +"

    Header

    \n" +"
    \n" +" <%= yieldall %>\n" +"
    " + +#: ../docs/Templates.md:178 +msgid "" +"This template code would place the output of `section_a` and `section_b` " +"within\n" +"the above div element. Using `yieldall`, we can also change the object that " +"is being\n" +"rendered. For example, we may want to yield the first method of the class.\n" +"We can do this like so:" +msgstr "" +"このテンプレートのコードは、\n" +"上のdiv属性の中で `section_a` と `section_b` の\n" +"出力ををセットする。\n" +"`yieldall` によって私達は、\n" +"表示されるオブジェクトを変更もできる。\n" +"例えばクラスの最初のメソッドをyieldの為にしたいとすると、\n" +"以下のようにできる。" + +#: ../docs/Templates.md:183 +msgid "" +"

    First method

    \n" +" <%= yieldall :object => object.meths.first %>" +msgstr "" +"

    First method

    \n" +" <%= yieldall :object => object.meths.first %>" + +#: ../docs/Templates.md:186 +msgid "" +"This would run the nested sections for the method object instead of the " +"class." +msgstr "" +"これは、クラスの代わりにメソッドオブジェクト用のネストされたセクションを起動" +"する。" + +#: ../docs/Templates.md:188 +msgid "" +"Note that `yieldall` yields to all subsections, whereas `yield` will yield\n" +"to each individually (in order) until there are no more left to yield to.\n" +"In the vast majority of cases, you'd want to use `yieldall`, since `yield`\n" +"makes it hard for users to override your template." +msgstr "" +"次の事に留意する。\n" +"`yieldall` は全ての下位セクションをyieldするのに対して、\n" +"`yield` は、要素が無くなるまで個々に(順番に)yieldする。\n" +"多くの場合あなたは `yieldall` を使いたいと思っただろう。\n" +"`yield` はユーザーがあなたのテンプレートを上書きする為に\n" +"確実に実行するからである。" + +#: ../docs/Templates.md:193 +msgid "## Inheriting Templates" +msgstr "## 継承するテンプレート" + +#: ../docs/Templates.md:195 +msgid "" +"Parent directory templates are automatically inherited (or mixed in, to be\n" +"more accurate) by the current template. This means that the 'default/class/" +"html'\n" +"template automatically inherits from 'default/class'. This also means that " +"anything\n" +"defined in 'default/class/setup.rb' can be overridden by 'default/class/html/" +"setup.rb'." +msgstr "" +"親のディレクトリのテンプレートは\n" +"現在のテンプレートによって自動的に継承される。\n" +"(または、正確にはmix-inされる)\n" +"つまり 'default/class/html' テンプレートは、\n" +"'default/class'から自動的に継承する。\n" +"そして 'default/class/setup.rb' の中に定義されるもの全ては、\n" +"'default/class/html/setup.rb' によって上書きされることも意味する。\n" +"(yard/lib以下の話ではなくyard/templetes以下の話)" + +#: ../docs/Templates.md:200 +msgid "" +"Since the Template module is a module, and not a class, they can be mixed " +"in\n" +"explicitly (via include/extend) from other templates, which allows " +"templates\n" +"to share erb files or helper logic. The 'default/class' template explicitly\n" +"mixes in the 'default/module' template, since it uses much of the same " +"sections.\n" +"This is done with the helper {YARD::Templates::Template::ClassMethods#T T} " +"method, which\n" +"is simply a shorthand for {YARD::Templates::Engine.template Engine." +"template}.\n" +"It can then override (using standard inheritance) the sections from the " +"module\n" +"template and insert sections pertaining to classes. This is one of the " +"design\n" +"goals described above." +msgstr "" +"Templateモジュールはモジュールであり,クラスではない。\n" +"他のテンプレートから(include/extend経由)明示的に混ぜられ、\n" +"erbファイルやヘルパーロジックを共有するためにテンプレートを受け入れる。\n" +"'default/class'テンプレートは明示的に'default/module'テンプレートの中で混ぜられ、\n" +"同じセクションを使う。\n" +"これはヘルパーメソッドの {YARD::Templates::Template::ClassMethods#T T} を用い完了し、\n" +"それは単純に{YARD::Templates::Engine.template Engine.template}用の略記法で、\n" +"その時モジュールのテンプレートからセクションを上書き(標準の継承を使う事によって)できる\n" +"そしてクラスに付随するセクションを挿入する。\n" +"これは上で説明された設計目標の一つである。" + +#: ../docs/Templates.md:210 +msgid "For instance, the first line in `default/class/html/setup.rb` is:" +msgstr "例えば `default/class/html/setup.rb` の中の最初の行は以下のように:" + +#: ../docs/Templates.md:212 +msgid " include T('default/module/html')" +msgstr " include T('default/module/html')" + +#: ../docs/Templates.md:214 +msgid "" +"This includes the 'default/module/html', which means it also includes " +"'default/module'\n" +"by extension. This allows class to make use of any of module's erb files." +msgstr "" +"この'default/module/html'のincludeは、\n" +"拡張によって'default/module'を含める意味となる。\n" +"この拡張は任意でerbモジュールのファイルから利用するクラスを受け入れる。" + +#: ../docs/Templates.md:217 +msgid "## Inserting and Traversing Sections" +msgstr "## 挿入とトラバース(辿る)セクション" + +#: ../docs/Templates.md:219 +msgid "" +"The ability to insert sections was mentioned above. The class template, for\n" +"instance, will modify the #init method to insert class specific sections:" +msgstr "" +"挿入セクションの機能は上で述べた。\n" +"テンプレートクラス、例えば、\n" +"以下のクラスの特定のセクションを挿入する為に#initメソッドを変更する:" + +#: ../docs/Templates.md:222 +msgid "" +" def init\n" +" super\n" +" sections.place(:subclasses).before(:children)\n" +" sections.delete(:children)\n" +" sections.place([:constructor_details, [T('method_details')]]).before(:" +"methodmissing)\n" +" end" +msgstr "" +" def init\n" +" super\n" +" sections.place(:subclasses).before(:children)\n" +" sections.delete(:children)\n" +" sections.place([:constructor_details, [T('method_details')]]).before(:methodmissing)\n" +" end" + +#: ../docs/Templates.md:229 +msgid "" +"Observe how sections has been modified after the super method was called " +"(the\n" +"super method would have been defined in `default/module/setup.rb`). The\n" +"`sections` object is of the {YARD::Templates::Section} class and allows " +"sections to be inserted\n" +"before or after another section using {Array#place} by it's given name " +"rather\n" +"than index. This allows the overriding of templates in a way that does not\n" +"depend on where the section is located (since it may have been overridden by\n" +"another module)." +msgstr "" +"superメソッドが呼び出された後でセクションが変更されたか確認する。\n" +"(superメソッドは `default/module/setup.rb` で定義されている)\n" +"`sections`オブジェクトは{YARD::Templates::Section}クラスのであり、\n" +"インデックスより与えられた名前によって\n" +"{Array#place}を使う事によって\n" +"他のセクションの前後で挿入されるセクションを受け入れる\n" +"これはセクションが示されるところに依存しない方法で\n" +"テンプレートの上書きを受け入れる。\n" +"(なので他のモジュールによって上書きされるかもしれない)" + +#: ../docs/Templates.md:237 +msgid "" +"You can also use `sections[:name]` to find the first child section named `:" +"name`.\n" +"For instance, with the following sections declaration:" +msgstr "" +"あなたは、 `:name` と名付けられた最初の子のセクション名を探す為に\n" +"`sections[:name]` を利用できる。\n" +"例えば、次のようなセクション宣言を用いる。" + +#: ../docs/Templates.md:240 +msgid " sections :a, [:b, :c, [:d]]" +msgstr " sections :a, [:b, :c, [:d]]" + +#: ../docs/Templates.md:242 +msgid "You can get to the :d section with:" +msgstr "次のようにすると、:dセクションを取得できる。" + +#: ../docs/Templates.md:244 +msgid " sections[:a][:c][:d]" +msgstr " sections[:a][:c][:d]" + +#: ../docs/Templates.md:246 +msgid "" +"You can use this to insert a section inside a nested set without using " +"indexed\n" +"access. The following command would result in `[:a, [:b, :c, [:d, :e]]]`:" +msgstr "" +"アクセスを索引しないで、\n" +"ネストした集合の内部の\n" +"セクションを挿入する為に\n" +"これを利用できる。<\n" +"次のコマンドは `[:a, [:b, :c, [:d, :e]]]` の様な結果になる。" + +#: ../docs/Templates.md:249 +msgid " sections[:a][:c].place(:e).after(:d)" +msgstr " sections[:a][:c].place(:e).after(:d)" + +#: ../docs/Templates.md:251 +msgid "" +"There are also two methods, {Insertion#before_any} and " +"{Insertion#after_any},\n" +"which allow you to insert sections before or after the first matching " +"section name\n" +"recursively. The above example could simply be rewritten as:" +msgstr "" +"二つのメソッド、{Insertion#before_any}と{Insertion#after_any}がある。\n" +"これは、再帰的に最初にマッチするセクション名の前後のセクションへの挿入を可能" +"にする。\n" +"上の例は、単純に次のように書き換えできた。" + +#: ../docs/Templates.md:255 +msgid " sections.place(:e).after_any(:d)" +msgstr " sections.place(:e).after_any(:d)" + +#: ../docs/Templates.md:257 +msgid "## Overriding Templates by Registering a Template Path" +msgstr "## テンプレートパスを記録しテンプレートを上書き" + +#: ../docs/Templates.md:259 +msgid "" +"Inheriting templates explicitly is useful when creating a customized " +"template\n" +"that wants to take advantage of code re-use. However, most users who want\n" +"to customize YARD templates will want to override existing behaviour " +"without\n" +"creating a template from scratch." +msgstr "" +"明示的に継承するテンプレートは、\n" +"再利用したいコードのテンプレートを\n" +"カスタマイズし作成する時に便利である。\n" +"しかしながら、一般的なYARDテンプレートをカスタマイズしたいユーザーは、\n" +"下書きからテンプレートの作成無しで既存の挙動を上書きしたいだろう。" + +#: ../docs/Templates.md:264 +msgid "" +"YARD solves this problem by allowing other template paths to be registered.\n" +"Because template modules are represented by a relative path such as 'default/" +"class',\n" +"they can be found within any of the registered template paths. A new " +"template\n" +"path is registered as:" +msgstr "" +"YARDは記録される他のテンプレートパスを\n" +"受け入れる事によってこの問題を解決する。\n" +"何故なら、テンプレートモジュールは、\n" +"'default/class'のような、相対パスによって表される。\n" +"それは、テンプレートパスの記録される全ての中で見られる\n" +"新しいテンプレートは、次のように記録される。" + +#: ../docs/Templates.md:269 +msgid "" +" YARD::Templates::Engine.register_template_path '/path/to/mytemplates'" +msgstr " YARD::Templates::Engine.register_template_path '/path/to/mytemplates'" + +#: ../docs/Templates.md:271 +msgid "" +"At this point, any time the 'default/class' template is loaded, the " +"template\n" +"will first be looked for inside the newly registered template path. If " +"found,\n" +"it will be used as the template module, with the modules from the other\n" +"template paths implicitly mixed in." +msgstr "" +"この場所で、毎回、'default/class'テンプレートは、ロードされる。\n" +"テンプレートは\n" +"新しく記録したテンプレートパス内部に最初に固定される。\n" +"もし見つかった場合、\n" +"暗黙の内にmix-inされる他のテンプレートパスからモジュールと共に、\n" +"テンプレートモジュールのように利用される。" + +#: ../docs/Templates.md:276 +msgid "" +"Therefore, by using the same directory structure as a builtin YARD " +"template,\n" +"a user can customize or override individual templates as if the old ones " +"were\n" +"inherited. A real world example would further modify the 'default/class' " +"template\n" +"seen above by creating such a path in our '/path/to/mytemplates' custom " +"template\n" +"path:" +msgstr "" +"従って組み込みのYARDのテンプレートとして同じディレクトリ構造体を\n" +"使うことによってユーザーはカスタマイズできたり、\n" +"古いものが継承される場合など個々のテンプレートを上書きできる。\n" +"実際の例は、\n" +"更に例の'/path/to/mytemplates'のカスタムテンプレートパスの中のパスなど作成することによって\n" +"上で見た'default/class'テンプレートを変更する。" + +#: ../docs/Templates.md:282 +msgid "" +" /path/to/mytemplates/:\n" +" |-- class\n" +" | |-- html\n" +" | | |-- customsection.erb\n" +" | |-- setup.rb" +msgstr "" +" /path/to/mytemplates/:\n" +" |-- class\n" +" | |-- html\n" +" | | |-- customsection.erb\n" +" | |-- setup.rb" + +#: ../docs/Templates.md:288 +msgid "The `setup.rb` file would look like:" +msgstr "`setup.rb` ファイルは次の様になる。" + +#: ../docs/Templates.md:290 +msgid "" +" def init\n" +" super\n" +" sections.push :customsection\n" +" end" +msgstr "" +" def init\n" +" super\n" +" sections.push :customsection\n" +" end" + +#: ../docs/Templates.md:295 +msgid "" +"Now, when a class object is formatted as HTML, our customsection.erb will " +"be\n" +"appended to the rendered data." +msgstr "" +"クラスオブジェクトがHTMLとしてフォーマットされる時は、\n" +"例のcustomsection.erbは表示されるデータに適用される。" + +#: ../docs/Templates.md:299 +msgid "### Overriding Stylesheets and Javascripts" +msgstr "### スタイルシートとJavascriptsを上書きする。" + +#: ../docs/Templates.md:301 +msgid "" +"Template authors can override existing stylesheets and javascripts by " +"creating\n" +"a file with the same name as existing files within the `fulldoc` template. " +"The\n" +"documentation output will utilize the new replacement file." +msgstr "" +"テンプレートの著者は\n" +"`fulldoc` テンプレートの中で既存のファイルのような同じ名前を用い、\n" +"ファイルを作成する事によって\n" +"既存のスタイルシートとjavascriptを\n" +"上書きできる。\n" +"ドキュメント出力は新しく置換するファイルを利用する。" + +#: ../docs/Templates.md:305 +msgid "YARD's `fulldoc` template defines three stylesheets:" +msgstr "YARDの `fulldoc` テンプレートはツリーのスタイルシートを定義する。" + +#: ../docs/Templates.md:307 +msgid "" +" /yard/templates/default/:\n" +" |-- fulldoc\n" +" | |-- html\n" +" | | |-- css\n" +" | | | |-- common.css\n" +" | | | |-- full_list.css\n" +" | | | |-- style.css" +msgstr "" +" /yard/templates/default/:\n" +" |-- fulldoc\n" +" | |-- html\n" +" | | |-- css\n" +" | | | |-- common.css\n" +" | | | |-- full_list.css\n" +" | | | |-- style.css" + +#: ../docs/Templates.md:315 +msgid "The `style.css` is the primary stylesheet for the HTML output." +msgstr "`style.css` は、HTML出力用の主要なスタイルシートとなる。" + +#: ../docs/Templates.md:317 +msgid "" +"The `full_list.css` is an additional stylesheet loaded specifically for the\n" +"search field menus (i.e. class list, method list, and file list)." +msgstr "" +"追加のスタイルシートの `full_list.css` は、厳密にいえば検索フィールドメニューの為にロードされる。\n" +"(すなわち、クラスリスト、メソッドリスト、ファイルリスト)" + +#: ../docs/Templates.md:320 +msgid "" +"The `common.css` is an empty css file that an template author can easily " +"override\n" +"to provide custom styles for their plugin. However, if a user installs " +"multiple\n" +"plugins that utilize this same file to deliver styles, it is possible that " +"they\n" +"will be overridden." +msgstr "" +"`common.css` は、\n" +"テンプレートの著者がプラグイン用の\n" +"カスタムスタイルを提供する為に\n" +"簡単に上書きする空のcssファイルとなる。\n" +"しかしながらユーザーがスタイルを実行するのに、\n" +"同じファイルを利用する複数のプラグインをインストールした場合、\n" +"上書きされる事が問題になる。" + +#: ../docs/Templates.md:325 +msgid "YARD's `fulldoc` template defines three javascript files:" +msgstr "YARDの `fulldoc` テンプレートは次の様にツリー上のjavascriptファイルを定義する。" + +#: ../docs/Templates.md:327 +msgid "" +" /yard/templates/default/:\n" +" |-- fulldoc\n" +" | |-- html\n" +" | | |-- js\n" +" | | | |-- app.js\n" +" | | | |-- full_list.js\n" +" | | | |-- jquery.js" +msgstr "" +" /yard/templates/default/:\n" +" |-- fulldoc\n" +" | |-- html\n" +" | | |-- js\n" +" | | | |-- app.js\n" +" | | | |-- full_list.js\n" +" | | | |-- jquery.js" + +#: ../docs/Templates.md:335 +msgid "The `app.js` is the primary javascript file for the HTML output." +msgstr "`app.js` はHTML出力用の主要なjavascriptファイルとなる。" + +#: ../docs/Templates.md:337 +msgid "" +"The `full_list.js` defines additional javascript loaded specifically for " +"the\n" +"search field menus (i.e. class list, method list, and file list)." +msgstr "" +"追加のjavascriptを定義する `full_list.js` は、\n" +"厳密にいえば検索フィールドメニュー用にロードされる。\n" +"(すなわち、クラスリスト、メソッドリスト、ファイルリスト)" + +#: ../docs/Templates.md:340 +msgid "The `jquery.js` is copy of the jquery javascript library." +msgstr "`jquery.js` はjquery javascriptライブラリをコピーする。" + +#: ../docs/Templates.md:342 +msgid "### Adding a Custom Stylesheet or Javascript" +msgstr "### カスタムスタイルシートとJavascritpを追加する" + +#: ../docs/Templates.md:344 +msgid "" +"To load additional stylesheets and javascripts with every page (except the " +"search\n" +"field menus) generated from the base `layout` template:" +msgstr "" +"基本の `layout` テンプレートから生成した\n" +"全てのページと共に、\n" +"追加のスタイルシートとjavascriptをロードするには\n" +"(但し、検索フィールドメニューを除く):\n" + +#: ../docs/Templates.md:347 +msgid "" +" 1. Define your own custom stylesheet and/or javascript file\n" +" (default/ is the default template name inside of the /template root " +"directory):" +msgstr "" +" 1. 自分のカスタムスタイルシートやjavascriptファイルを定義する。\n" +" (デフォルトのディレクトリは/templateルートディレクトリの内部のデフォルトのテンプレート名である):" + +#: ../docs/Templates.md:350 +msgid "" +" /template/default/:\n" +" |-- fulldoc\n" +" | |-- html\n" +" | | |-- css\n" +" | | | |-- custom.css\n" +" | | |-- js\n" +" | | | |-- custom.js" +msgstr "" +" /template/default/:\n" +" |-- fulldoc\n" +" | |-- html\n" +" | | |-- css\n" +" | | | |-- custom.css\n" +" | | |-- js\n" +" | | | |-- custom.js" + +#: ../docs/Templates.md:358 +msgid "" +" 2. Create a `setup.rb` in the `layout` template directory and override the " +"methods\n" +" `stylesheets` and `javascripts`. The path to the template would be:" +msgstr "" +" 2. `layout` テンプレートディレクトリの中の `setup.rb` を作成して\n" +" `javascripts` と `stylesheets` メソッドを上書きする。\n" +" テンプレートのパスは次の様になる:" + +#: ../docs/Templates.md:361 +msgid "" +" /template/default/:\n" +" |-- layout\n" +" | |-- html\n" +" | | |-- setup.rb" +msgstr "" +" /template/default/:\n" +" |-- layout\n" +" | |-- html\n" +" | | |-- setup.rb" + +#: ../docs/Templates.md:366 +msgid " And the code would look like:" +msgstr " そしてコードは次のようになる。" + +#: ../docs/Templates.md:368 +msgid "" +" def stylesheets\n" +" # Load the existing stylesheets while appending the custom one\n" +" super + %w(css/custom.css)\n" +" end" +msgstr "" +" def stylesheets\n" +" # カスタムのcssが追加される間、存在するスタイルシートをロードする\n" +" super + %w(css/custom.css)\n" +" end" + +#: ../docs/Templates.md:373 +msgid "" +" def javascripts\n" +" # Load the existing javascripts while appending the custom one\n" +" super + %w(js/custom.js)\n" +" end" +msgstr "" +" def javascripts\n" +" # カスタムのjavascriptが追加される間、存在するスタイルシートをロードする\n" +" super + %w(js/custom.js)\n" +" end" + +#: ../docs/Templates.md:379 +msgid "" +"To load additional stylesheets and javascripts for the search menus loaded " +"from\n" +"the `fulldoc` template:" +msgstr "" +"`fulldoc` テンプレートからロードされた検索メニュー用の\n" +"追加のスタイルシートとjavascriptをロードするには:" + +#: ../docs/Templates.md:382 +msgid " 1. Define your own custom stylesheet and/or javascript file." +msgstr " 1. 自分のカスタムスタイルシートとjavascriptファイルを定義する。" + +#: ../docs/Templates.md:384 +msgid "" +" /path/to/mytemplates/:\n" +" |-- fulldoc\n" +" | |-- html\n" +" | | |-- css\n" +" | | | |-- custom_full_menu.css\n" +" | | |-- js\n" +" | | | |-- custom_full_menu.js" +msgstr "" +" /path/to/mytemplates/:\n" +" |-- fulldoc\n" +" | |-- html\n" +" | | |-- css\n" +" | | | |-- custom_full_menu.css\n" +" | | |-- js\n" +" | | | |-- custom_full_menu.js" + +#: ../docs/Templates.md:393 +msgid "" +" 3. Override the methods `stylesheets_full_list` and " +"`javascripts_full_list`\n" +" in the `setup.rb` file inside fulldoc/html." +msgstr "" +" 3. fulldoc/html内の `setup.rb` ファイルの中の\n" +" `stylesheets_full_list` と `javascripts_full_list` メソッドを上書きする。" + +#: ../docs/Templates.md:396 +msgid "" +" def stylesheets_full_list\n" +" # Load the existing stylesheets while appending the custom one\n" +" super + %w(css/custom.css)\n" +" end" +msgstr "" +" def stylesheets_full_list\n" +" # カスタムのcssが追加される間、存在するスタイルシートをロードする\n" +" super + %w(css/custom.css)\n" +" end" + +#: ../docs/Templates.md:401 +msgid "" +" def javascripts_full_list\n" +" # Load the existing javascripts while appending the custom one\n" +" super + %w(js/custom.js)\n" +" end" +msgstr "" +" def javascripts_full_list\n" +" # カスタムのjavascriptが追加される間、存在するスタイルシートをロードする\n" +" # Load the existing javascripts while appending the custom one\n" +" super + %w(js/custom.js)\n" +" end" + +#: ../docs/Templates.md:406 +msgid "### Overriding Search Menus" +msgstr "### 検索メニューを上書きする。" + +#: ../docs/Templates.md:408 ../docs/Templates.md:443 +msgid "By default YARD's `fulldoc` template generates three search fields:" +msgstr "デフォルトでYARDの `fulldoc` テンプレートは次のような検索フィールドのツリーを生成する。" + +#: ../docs/Templates.md:410 ../docs/Templates.md:445 +msgid "" +" * Class List\n" +" * Method List\n" +" * File List" +msgstr "" +" * Class List\n" +" * Method List\n" +" * File List" + +#: ../docs/Templates.md:414 +msgid "Their contents are rendered in methods within the `fulldoc` template:" +msgstr "その内容は、 `fulldoc` テンプレートの中でメソッドの中を表示する。" + +#: ../docs/Templates.md:416 +msgid "" +" * `generate_class_list`\n" +" * `generate_method_list`\n" +" * `generate_file_list`" +msgstr "" +" * `generate_class_list`\n" +" * `generate_method_list`\n" +" * `generate_file_list`" + +#: ../docs/Templates.md:420 +msgid "To override these lists you will need to:" +msgstr "これらのリスト上書きするには:" + +#: ../docs/Templates.md:422 +msgid "" +" 1. Create a `setup.rb` in the `fulldoc` template directory and override " +"the\n" +" particular method." +msgstr "" +" 1. `fulldoc` テンプレートディレクトリの中の `setup.rb` を作成し、\n" +" メソッドの詳細を上書きする。" + +#: ../docs/Templates.md:425 ../docs/Templates.md:477 +msgid "" +" /path/to/mytemplates/:\n" +" |-- fulldoc\n" +" | |-- html\n" +" | | |-- setup.rb" +msgstr "" +" /path/to/mytemplates/:\n" +" |-- fulldoc\n" +" | |-- html\n" +" | | |-- setup.rb" + +#: ../docs/Templates.md:430 +msgid "" +" def generate_method_list\n" +" @items = prune_method_listing(Registry.all(:method), false)\n" +" @items = @items.reject {|m| m.name.to_s =~ /=$/ && m." +"is_attribute? }" +msgstr "" +" def generate_method_list\n" +" @items = prune_method_listing(Registry.all(:method), false)\n" +" @items = @items.reject {|m| m.name.to_s =~ /=$/ && m.is_attribute? }" + +#: ../docs/Templates.md:434 +msgid "" +" # Here we changed the functionality to reverse the order of " +"displayed methods\n" +" @items = @items.sort_by {|m| m.name.to_s }.reverse\n" +" @list_title = \"Method List\"\n" +" @list_type = \"methods\"\n" +" asset('method_list.html', erb(:full_list))\n" +" end" +msgstr "" +" # ここでメソッドを表示する順番を逆にする為の機能を変更する\n" +" @items = @items.sort_by {|m| m.name.to_s }.reverse\n" +" @list_title = \"Method List\"\n" +" @list_type = \"methods\"\n" +" asset('method_list.html', erb(:full_list))\n" +" end" + +#: ../docs/Templates.md:441 +msgid "### Adding Additional Search Menus" +msgstr "### 追加の検索メニューを追加する。" + +#: ../docs/Templates.md:449 +msgid "" +"These are defined in the `layout` template method `menu_lists` and pulled " +"into\n" +"the `fulldoc` template through a similarly named method." +msgstr "" +"これらは `layout` テンプレートメソッドの中の `menu_lists` を定義される。\n" +"そして同様に名付けられたメソッドを通じて `fulldoc` テンプレートに置かれる。" + +#: ../docs/Templates.md:452 +msgid "To load an additional menu item:" +msgstr "追加のメニュー項目をロードするには次のようになる:" + +#: ../docs/Templates.md:455 +msgid "" +" 1. Create a `setup.rb` in the `layout` template directory and override the " +"methods\n" +" `menu_lists`. The `type` informs the search field the name of the file.\n" +" The `title` is the name that appears above the section when viewed in " +"frames.\n" +" The `search_title` is the name that appears in the search field tab on " +"the page." +msgstr "" +" 1. `layout` テンプレートディレクトリの中で `setup.rb` を作成し `menu_lists` メソッドを上書きする。\n" +" `type` はファイルの検索フィールド名通知する。\n" +" `title` はフレームのなかで表示された時に上のセクションに登場する名前である。\n" +" `search_title` はページの検索フィールドタブの中で登場する名前である。" + +#: ../docs/Templates.md:461 +msgid "" +" /path/to/mytemplates/:\n" +" |-- layout\n" +" | |-- html\n" +" | | |-- setup.rb" +msgstr "" +" /path/to/mytemplates/:\n" +" |-- layout\n" +" | |-- html\n" +" | | |-- setup.rb" + +#: ../docs/Templates.md:466 +msgid "" +" def menu_lists\n" +" # Load the existing menus\n" +" super + [ { :type => 'feature', :title => 'Features', :" +"search_title => 'Feature List' } ]\n" +" end" +msgstr "" +" def menu_lists\n" +" # 既存のメニューをロードする\n" +" super + [ { :type => 'feature', :title => 'Features', :search_title => 'Feature List' } ]\n" +" end" + +#: ../docs/Templates.md:471 +msgid "" +" 2. Create a `setup.rb` in the `fulldoc` template directory and create a " +"method\n" +" to generate a menu for the specified `type`.\n" +" The method `generate_assets` will look for a function with a signature " +"prefixed\n" +" with `generate`, the type value specified, and the suffix `list`. " +"Within that\n" +" method you can configure and load the specific objects you wish to " +"display." +msgstr "" +" 2. `fulldoc` のテンプレートディレクトリの中で `setup.rb` を作成し、\n" +" 指定された `type` 用にメニューを生成するためのメソッドを作成する\n" +" `generate_assets` メソッドは、 `generate` で始まり,間に固有の値,末尾が `list` のシグネチャを探す。\n" +" メソッドの中をあなたが構成でき、表示するためにあなたが望む特定のオブジェクトをロードする。" + +#: ../docs/Templates.md:482 +msgid " def generate_feature_list" +msgstr " def generate_feature_list" + +#: ../docs/Templates.md:484 +msgid "" +" # load all the features from the Registry\n" +" @items = Registry.all(:feature)\n" +" @list_title = \"Feature List\"\n" +" @list_type = \"feature\"" +msgstr "" +" # レジストリーから全ての機能をロードす\n" +" @items = Registry.all(:feature)\n" +" @list_title = \"Feature List\"\n" +" @list_type = \"feature\"" + +#: ../docs/Templates.md:489 +msgid "" +" # optional: the specified stylesheet class\n" +" # when not specified it will default to the value of @list_type\n" +" @list_class = \"class\"" +msgstr "" +" # optional: the specified stylesheet class\n" +" # when not specified it will default to the value of @list_type\n" +" @list_class = \"class\"" + +#: ../docs/Templates.md:493 +msgid "" +" # Generate the full list html file with named feature_list.html\n" +" # @note this file must be match the name of the type\n" +" asset('feature_list.html', erb(:full_list))\n" +" end" +msgstr "" +" # feature_list.htmlの名前と共に完全なHTMLファイルのリストを作成する\n" +" # @note this file must be match the name of the type\n" +" asset('feature_list.html', erb(:full_list))\n" +" end" + +# title +#: ../docs/WhatsNew.md:1 +msgid "What's New?" +msgstr "What's New?" + +#: ../docs/WhatsNew.md:3 +msgid "# What's New in 0.8.x?" +msgstr "# What's New in 0.8.x?" + +#: ../docs/WhatsNew.md:5 +msgid "" +"1. **Directives (new behavioural tag syntax)** (0.8.0)\n" +"2. **Added `--embed-mixin(s)` to embed mixins into class docs** (0.8.0)\n" +"3. **Internationalization (I18n) support for translating docs** (0.8.0)\n" +"4. **New C parser / handlers architecture** (0.8.0)\n" +"5. **YARD will now warn if `@param` name not in method params** (0.8.0)\n" +"6. **Added support for `module_function` calls in Ruby code** (0.8.0)\n" +"7. **Greatly improved tag documentation using custom template** (0.8.0)\n" +"8. **Tags can now contain '.' for namespacing** (0.8.0)\n" +"9. **Added \"frames\" links for non-framed pages for better nav** (0.8.0)\n" +"10. **Added Gemfile support to YARD server for local gem sets** (0.8.0)\n" +"11. **Server now displays README on index route like static docs** (0.8.0)\n" +"12. **Added line numbers to `yard stats --list-undoc --compact`** (0.8.0)\n" +"13. **Single object db now default (multi-object db unsupported)** (0.8.0)\n" +"14. **Added `--api` tag to generate documentation for API sets** (0.8.1)" +msgstr "" +"1. **ディレクティブ (タグ構文の新しい行動)** (0.8.0)\n" +"2. **クラスのドキュメントの中にmixinを埋め込むのに `--embed-mixin(s)` が追加された** (0.8.0)\n" +"3. **翻訳ドキュメント用の国際化 (I18n) サポート** (0.8.0)\n" +"4. **新しい C パーサー / ハンドラー アーキテクチャ** (0.8.0)\n" +"5. **YARDはメソッドのパラメータの中に`@param`名が無い場合、警告を出すようになった。\n" +"6. **`module_function` がRubyのコードを呼び出すサポートが追加された** (0.8.0)\n" +"7. **カスタムテンプレートによって大きくタグドキュメントが修正された** (0.8.0)\n" +"8. **タグがネームスペース用の '.' を含むようになった** (0.8.0)\n" +"9. **より良いナビをするのにフレームでないページ用に\"フレーム\"のリンクが追加された** (0.8.0)\n" +"10. **ローカルのgemのグループ用にYARDサーバーにGemfileのサポートが追加された** (0.8.0)\n" +"11. **サーバーは静的なドキュメントのようにルートのインデックス上のREADMEを表示するようになった** (0.8.0)\n" +"12. **`yard stats --list-undoc --compact`に行数が追加された** (0.8.0)\n" +"13. **単一のオブジェクトdbがデフォルトになった (マルチオブジェクトdbは未サポート)** (0.8.0)\n" +"14. **API用のグループのドキュメントを生成するのに `--api` タグが追加された** (0.8.1)" + +#: ../docs/WhatsNew.md:20 +msgid "## Directives (new behavioural tag syntax) (0.8.0)" +msgstr "## ディレクティブ (タグ構文の新しい行動) (0.8.0)" + +#: ../docs/WhatsNew.md:22 +msgid "" +"

    \n" +" The tags {tag:!macro}, {tag:!method}, {tag:!attribute}, {tag:!group},\n" +" {tag:!endgroup}, {tag:!scope} and {tag:!visibility} have been changed\n" +" from meta-data tags to directives. This means they should now be called\n" +" with the \"@!\" prefix instead of \"@\". Note however that for \n" +" backward compatibility, the old \"@macro\", \"@method\", etc.,\n" +" syntax for all of these tags will still work and is supported.\n" +"

    " +msgstr "" +"

    \n" +" The tags {tag:!macro}, {tag:!method}, {tag:!attribute}, {tag:!group},\n" +" {tag:!endgroup}, {tag:!scope} and {tag:!visibility} have been changed\n" +" from meta-data tags to directives. This means they should now be called\n" +" with the \"@!\" prefix instead of \"@\". Note however that for \n" +" backward compatibility, the old \"@macro\", \"@method\", etc.,\n" +" syntax for all of these tags will still work and is supported.\n" +"

    " + +#: ../docs/WhatsNew.md:31 +msgid "" +"

    \n" +" Some backwards incompatible changes were made to {tag:!" +"macro} syntax.\n" +" Please read this section carefully if you are using this tag.\n" +"

    " +msgstr "" +"

    \n" +" Some backwards incompatible changes were made to {tag:!macro} syntax.\n" +" Please read this section carefully if you are using this tag.\n" +"

    " + +#: ../docs/WhatsNew.md:36 +msgid "" +"YARD 0.8.0 adds a new tag syntax called \"directives\" using the `@!`\n" +"prefix. These directive tags can be used to modify parser state while\n" +"processing objects, or even create new objects on the fly. A plugin\n" +"API is available similar to tags, and directives should be registered\n" +"in the {YARD::Tags::Library} class using {YARD::Tags::Library." +"define_directive}." +msgstr "" +"YARD 0.8.0で追加された新しいタグ構文は\n" +"`@!` プレフィックス(接頭辞)によって\"directives(ディレクティブ)\"を呼び出す。\n" +"これらのディレクティブタグは、\n" +"オブジェクトを処理している間やオンザフライで新しくオブジェクトを作成する時でさえ、\n" +"パーサーの状態を変更するのに利用できる。\n" +"プラグインAPIはタグ同様に可能で、\n" +"ディレクティブは {YARD::Tags::Library.define_directive} によって\n" +"{YARD::Tags::Library} クラスのなかに登録される。" + +#: ../docs/WhatsNew.md:42 +msgid "" +"To use a directive, simply call it the same way as any tag. Tag syntax\n" +"is documented in {file:docs/Tags.md}." +msgstr "" +"ディレクティブを使うには、単純にタグなどと同じ方法で呼び出す。\n" +"タグ構文は {file:docs/Tags.md} で記述される。" + +#: ../docs/WhatsNew.md:45 +msgid "### Notable features of directives" +msgstr "### 著名なディレクティブの機能" + +#: ../docs/WhatsNew.md:47 +msgid "#### Directives do not need to be attached to object docstrings" +msgstr "#### ディレクティブはオブジェクトのdocstringに追加するのに必要ない" + +#: ../docs/WhatsNew.md:49 +msgid "" +"Unlike meta-data tags which apply to created objects, directives\n" +"do not need to be attached to an object in order to be used. This\n" +"means you can have free-standing comments with directives, such as:" +msgstr "" +"メタデータタグとは違って作成されたオブジェクトに追加され、\n" +"ディレクティブは利用される順番で追加される必要はない。\n" +"これは次のようなディレクティブを用い自由な位置にコメントできる事を意味する:" + +#: ../docs/WhatsNew.md:53 +msgid "" +" # @macro mymacro\n" +" # A new macro, not attached to any docstring" +msgstr "" +" # @macro mymacro\n" +" # A new macro, not attached to any docstring" + +#: ../docs/WhatsNew.md:56 +msgid " # ...other Ruby code here..." +msgstr " # ...other Ruby code here..." + +#: ../docs/WhatsNew.md:58 +msgid "" +" # Using the macro:\n" +" # @macro mymacro\n" +" def mymethod; end" +msgstr "" +" # 上のマクロを呼び出す:\n" +" # @macro mymacro\n" +" def mymethod; end" + +#: ../docs/WhatsNew.md:62 +msgid "" +"You can do the same to define methods and attributes, as discussed\n" +"below." +msgstr "" +"下の項で議論されるように\n" +"あなたはメソッドと属性を定義するのを同じようにできる。" + +#: ../docs/WhatsNew.md:65 +msgid "#### `@!method` and `@!attribute` directives improved" +msgstr "#### 改良された `@!method` と `@!attribute` ディレクティブ" + +#: ../docs/WhatsNew.md:67 +msgid "" +"The method and attribute directives can now be used to create multiple\n" +"objects in a single docstring. Previously a `@method` or `@attribute`\n" +"tag would only create one method per docstring. In 0.8.0, you could\n" +"attach multiple methods to the same block of Ruby source, such as:" +msgstr "" +"メソッドと属性(attribute)のディレクティブは\n" +"単一のdocstringで複数のオブジェクトを作成するのに利用できるようになった。\n" +"以前は `@method` や `@attribute` タグは\n" +"メソッド一つで個々のdocstringだけ作成していた。\n" +"0.8.0ではRubyのソースの同じブロックに複数のメソッドを追加できる。\n" +"次のようになる:" + +#: ../docs/WhatsNew.md:72 +msgid "" +" # @!method foo(a, b, c)\n" +" # @!method bar(x, y, z)\n" +" # Docstring for code\n" +" some_ruby_source" +msgstr "" +" # @!method foo(a, b, c)\n" +" # @!method bar(x, y, z)\n" +" # コード用のdocstring\n" +" some_ruby_source" + +#: ../docs/WhatsNew.md:77 +msgid "" +"The above creates #foo and #bar and the source listing for both will\n" +"be `some_ruby_source` with \"Docstring for code\" as the docstring." +msgstr "" +"上の例は\n" +"両方がdocstringとして\"コード用のdocstring\"と一緒に\n" +"`some_ruby_source` の説明になるように、\n" +"#fooメソッドと#barメソッドとソースのリストを作成する。" + +#: ../docs/WhatsNew.md:80 +msgid "" +"The attribute directive can take advantage of this functionality as well.\n" +"Note that these directives also do not need to be attached to a line of\n" +"code to be recognized; they can be in free-standing comments if the\n" +"methods are defined dynamically and not associated with any code." +msgstr "" +"属性のディレクティブはさらにこの機能の平均を取得できる。\n" +"次の事に留意する。\n" +"これらのディレクティブは認識されるのにコードの行に追加される必要もない。\n" +"つまり、これはメソッドが動的に定義される場合\n" +"自由な場所にコメントでき、任意のコードと一緒に関連づけられない。" + +#: ../docs/WhatsNew.md:85 +msgid "#### New `@!parse` directive to parse Ruby code" +msgstr "#### Rubyのコードを解析する為の新しい `@!parse` ディレクティブ" + +#: ../docs/WhatsNew.md:87 +msgid "" +"A new {tag:!parse} directive was added that allows a developer to have\n" +"YARD parse code that might not necessarily be parseable in its original\n" +"form. This is useful when using `instance_eval` and other dynamic\n" +"meta-programming techniques to define methods or perform functionality.\n" +"For instance, a common case of the \"self.included\" callback in module\n" +"to extend a module on a class might be in the form:" +msgstr "" +"新しい {tag:!parse} ディレクティブは\n" +"YARDが元の形式で解析する必要はないコードの解析を開発者に\n" +"許可するのに追加された。\n" +"これはメソッドを定義する時や機能を実行する時に\n" +" `instance_eval` と他の動的なメタプログラミングのテクニックを使う時に便利である。\n" +"例えば、次の形式でクラス上でモジュールを拡張するのに\n" +"モジュールの中の\"self.included\"コールバックの一般的なケース:" + +#: ../docs/WhatsNew.md:94 +msgid "" +" def self.included(mod)\n" +" mod.extend(self)\n" +" end" +msgstr "" +" def self.included(mod)\n" +" mod.extend(self)\n" +" end" + +#: ../docs/WhatsNew.md:98 +msgid "" +"Unfortunately, this does not get picked up by YARD, but on the original\n" +"class, we can add:" +msgstr "" +"あいにく、これはYARDによって取得できないが、\n" +"元のクラス上で次のように追加できる:" + +#: ../docs/WhatsNew.md:101 +msgid "" +" class MyClass\n" +" # @!parse extend TheDynamicModule\n" +" include TheDynamicModule\n" +" end" +msgstr "" +" class MyClass\n" +" # @!parse extend TheDynamicModule\n" +" include TheDynamicModule\n" +" end" + +#: ../docs/WhatsNew.md:106 +msgid "" +"YARD will then parse the code `extend TheDynamicModule` as if\n" +"it were in the source file." +msgstr "" +"それがソースファイルの中だった場合など\n" +"YARDが `extend TheDynamicModule` のコードを解析する時" + +#: ../docs/WhatsNew.md:109 +msgid "" +"You can also use this technique to register regular methods as\n" +"attributes, if you did not define them with `attr_*` methods:" +msgstr "" +"これらの `attr_*` メソッドを用いて定義しなかった場合、\n" +"あなたは属性として標準のメソッドを登録するのにこのテクニックを使う事ができる。" + +#: ../docs/WhatsNew.md:112 +msgid "" +" def foo; @foo end\n" +" def foo=(v) @foo = v end" +msgstr "" +" def foo; @foo end\n" +" def foo=(v) @foo = v end" + +#: ../docs/WhatsNew.md:115 +msgid "" +" # Register them as methods:\n" +" # @!parse attr_accessor :foo" +msgstr "" +" # メソッドとしてそれらを登録する\n" +" # @!parse attr_accessor :foo" + +#: ../docs/WhatsNew.md:118 +msgid "### Backward incompatible changes to `@!macro` directive" +msgstr "### 後方互換性のない `@!macro` ディレクティブに変更する" + +#: ../docs/WhatsNew.md:120 +msgid "" +"Unfortunately, in order to create the new directives architecture,\n" +"some previously supported syntax in `@macro` tags are no longer supported.\n" +"Specifically, macros can no longer expand text on an entire docstring.\n" +"Instead, macros only expand the data that is indented inside of the tag\n" +"text." +msgstr "" +"あいにく、新しいディレクティブアーキテクチャを作成する為の順番、\n" +"`@macro` タグの中でいくつか前にサポートされた構文は、もうサポートされない。\n" +"すなわち、マクロは全てのdocstring上のテキストを展開することはできない。\n" +"代わりに、マクロはタグのテキストの内部のインデントされたデータだけ展開する。" + +#: ../docs/WhatsNew.md:126 +msgid "This syntax is **no longer supported**:" +msgstr "This syntax is **no longer supported**:" + +#: ../docs/WhatsNew.md:128 +msgid "" +" # @macro mymacro\n" +" # Expanding text $1 $2 $3\n" +" property :a, :b, :c" +msgstr "" +" # @macro mymacro\n" +" # Expanding text $1 $2 $3\n" +" property :a, :b, :c" + +#: ../docs/WhatsNew.md:132 +msgid "" +"In 0.7.0 to 0.7.5, the above would have created a method with the docstring\n" +"\"Expanding text a b c\". This will not work in 0.8.0. Instead, you must\n" +"indent all the macro expansion data so that it is part of the `@macro`\n" +"tag as follows:" +msgstr "" +"0.7.0 ~ 0.7.5で、\n" +"上はの例はdocstring \"Expanding text a b c\"と一緒に作成されたメソッドを持つ。\n" +"これは、0.8.0では動かない。\n" +"代わりに、あなたは全てのマクロ展開のデータをインデントしなければならない。\n" +"つまり `@macro` タグの一部を次のようにする:" + +#: ../docs/WhatsNew.md:137 +msgid "" +" # @!macro mymacro\n" +" # Expanding text $1 $2 $3\n" +" property :a, :b, :c" +msgstr "" +" # @!macro mymacro\n" +" # Expanding text $1 $2 $3\n" +" property :a, :b, :c" + +#: ../docs/WhatsNew.md:141 +msgid "" +"Note that we also use the recommended `@!macro` syntax, though `@macro`\n" +"is still supported." +msgstr "" +"次の事に留意する。\n" +"我々は推奨された `@!macro` 構文を使うけれども、\n" +"`@macro` はまだサポートされている。" + +#: ../docs/WhatsNew.md:144 +msgid "## Added `--embed-mixin(s)` to embed mixins into class docs (0.8.0)" +msgstr "## クラスのドキュメントにmixinを埋め込むのに `--embed-mixin(s)` が追加された (0.8.0)" + +#: ../docs/WhatsNew.md:146 +msgid "" +"Methods from mixins can now be embedded directly into the documentation\n" +"output for a class by using `--embed-mixin ModuleName`, or `--embed-mixins`\n" +"for all mixins. This enables a documentation writer to refactor methods\n" +"into modules without worrying about them showing up in separate files\n" +"in generated documentation. When mixin methods are embedded, they\n" +"show up in both the original module page and the pages of the classes\n" +"they are mixed into. A note is added to the method signature telling the\n" +"user where the method comes from." +msgstr "" +"mixinからのメソッドは\n" +"全てのmixin用に `--embed-mixin ModuleName` や `--embed-mixins` 用の\n" +"ドキュメント出力の中へ直接埋め込まれるようになった。\n" +"これは生成されたドキュメントの中の分割されたファイルのなかの\n" +"その時の一覧について警告無しでモジュールの中の\n" +"メソッドをリファクタリングする為にドキュメントを書ける。\n" +"mixinメソッドが埋め込まれた時、\n" +"これは元のモジュールのページとこれらの混じったクラスのページの両方を一覧する。\n" +"noteはメソッドのシグネチャがメソッドがどこからくるかユーザーに知らせるのに追加された。" + +#: ../docs/WhatsNew.md:155 +msgid "" +"The `--embed-mixin` command-line option can also take wildcard values\n" +"in order to match specific namespaces. For instance, you can embed\n" +"only mixins inside of a \"Foo::Bar\" namespace by doing:" +msgstr "" +"`--embed-mixin` コマンドラインオプションは、\n" +"指定のネームスペースにマッチするのにワイルドカードの値も取得できる。\n" +"例えば、次の様にする事によって\n" +"\"Foo::Bar\"ネームスペースの内部にmixinだけ埋め込むことができる。" + +#: ../docs/WhatsNew.md:159 +msgid "" +" !!!sh\n" +" $ yard doc --embed-mixin \"Foo::Bar::*\"" +msgstr "" +" !!!sh\n" +" $ yard doc --embed-mixin \"Foo::Bar::*\"" + +#: ../docs/WhatsNew.md:162 +msgid "## Internationalization (I18n) support for translating docs" +msgstr "## 翻訳ドキュメント用の国際化(I18n)サポート" + +#: ../docs/WhatsNew.md:164 +msgid "" +"YARD now ships with the beginnings of internationalization support\n" +"for translating documentation into multiple languages. The\n" +"`yard i18n` command now allows you to generate \".pot\" and ultimately\n" +"\".po\" files for translation with [gettext](http://www.gnu.org/software/" +"gettext)." +msgstr "" +"YARDは複数の言語に翻訳したドキュメント用に国際化サポートを送りだすことになった。\n" +"`yard i18n` コマンドは\n" +"あなたが[gettext](http://www.gnu.org/software/gettext)を用いた翻訳用の\n" +"\".pot\"と最後に\".po\"ファイルを生成するのを許可するようになった。" + +#: ../docs/WhatsNew.md:169 +msgid "" +"Note that this tool is a small step in the larger transition for\n" +"proper I18n support in YARD. We still have to add proper gettext\n" +"support to our templates for proper generation in multiple languages,\n" +"but this tool allows you to get started in translating your\n" +"documents. Improved I18n support will come throughout the 0.8.x series." +msgstr "" +"次の事に留意する。\n" +"このツールはYARDの正当なI18nサポートの小さな一歩である。\n" +"我々はまだ複数の言語の適切な生成の為に、\n" +"例のテンプレートに適切なgettextサポートを追加する仕事が残っている。\n" +"だがこのツールはあなたが翻訳ドキュメントを始めるのを受け入れる。\n" +"改良されたI18nサポートは0.8.xシリーズに至る中で登場するだろう。" + +#: ../docs/WhatsNew.md:175 +msgid "## New C parser / handlers architecture (0.8.0)" +msgstr "## 新しい Cパーサー / ハンドラー構造 (0.8.0)" + +#: ../docs/WhatsNew.md:177 +msgid "" +"The C parser was completely rewritten to take advantage of YARD's\n" +"parser and handler architecture. This means more YARD will be more robust\n" +"when parsing failures occur, tags and directives will now work consistently\n" +"across Ruby and CRuby files ({tag:!group} will now work, for instance),\n" +"and developers can now write custom handlers that target CRuby source files." +msgstr "" +"YARDパーサーの平均とハンドラーアーキテクチャを取得するのに\n" +"C パーサーは完全に書き直された。\n" +"これはYARDが解析異常が起きた時にさらに堅牢になる事を意味し\n" +"タグとディレクティブはRubyとCRubyのファイル(例えば {tag:!group} が動くようになった)\n" +"全域で堅実に動く様になった。\n" +"そして、開発者はCRubyのソースファイルを目的にするカスタムハンドラーを書ける様になった。\n" + +#: ../docs/WhatsNew.md:183 +msgid "## YARD will now warn if `@param` name not in method params (0.8.0)" +msgstr "## YARDはメソッドパラメーターの中に`@param`名がない場合、警告を出すようになった(0.8.0)" + +#: ../docs/WhatsNew.md:185 +msgid "" +"YARD will now give you a warning if you use a `@param` tag in your\n" +"source but give an invalid parameter name. This should catch a lot of\n" +"common documentation errors and help keep your documentation consistent." +msgstr "" +"YARDはあなたのソースの中の `@param` タグを使う場合、あなたが警告を出せるようになった。\n" +"しかし有効なパラメータ名を与える。\n" +"これは沢山の一般的なドキュメントエラーをキャッチし、\n" +"あなたの一貫したドキュメントの保守を助ける。" + +#: ../docs/WhatsNew.md:189 +msgid "## Added support for `module_function` calls in Ruby code (0.8.0)" +msgstr "## `module_function` がRubyのコードの中で呼び出されるサポートが追加された (0.8.0)" + +#: ../docs/WhatsNew.md:191 +msgid "" +"The `module_function` command in Ruby is now supported in Ruby files.\n" +"It defines two separate methods, one class and one instance method,\n" +"both having the exact same docstring, and marks the instance method\n" +"as private." +msgstr "" +"Rubyの `module_function` コマンドは\n" +"Rubyのファイルでサポートされるようになった。\n" +"それは\"区切られたメソッド\"と\n" +"\"一つのクラスと一つのインスタンスメソッド\"二つを定義し、\n" +"正確な同じdocstring両方、\n" +"privateとしてインスタンスメソッドをマークする。" + +#: ../docs/WhatsNew.md:196 +msgid "## Greatly improved tag documentation using custom template (0.8.0)" +msgstr "## カスタムテンプレートによって大きく改良されたタグのドキュメント (0.8.0)" + +#: ../docs/WhatsNew.md:198 +msgid "" +"We have completely revamped the {docs/Tags.md} to include documentation\n" +"for each meta-data tag and directive with at least one useful example\n" +"for each one. This was done using template customization and extension\n" +"available within YARD." +msgstr "" +"我々は個々のメタデータタグとディレクティブ用の\n" +"ドキュメントを含めるのに {docs/Tags.md} を\n" +"少なくとも各々一つ便利な例を用い完全に刷新しました。\n" +"これはYARDの中でテンプレートのカスタマイズと拡張が可能になる事によって\n" +"行なわれた。" + +#: ../docs/WhatsNew.md:203 +msgid "## Tags can now contain '.' for namespacing (0.8.0)" +msgstr "## タグはネームスペース用の '.' を含める事できるようになった (0.8.0)" + +#: ../docs/WhatsNew.md:205 +msgid "" +"Prior to 0.8.0, tags could only contain alphanumeric characters and\n" +"underscore. YARD now allows the '.' character in tag names, and it\n" +"is now recommended for namespacing project-specific custom tags.\n" +"YARD has its own set of custom tags that are namespaced in this\n" +"way (using the \"yard.tagname\" namespace). The namespace recommendation\n" +"is to use \"projectname.tagname\", or \"projectname.component.tagname\"." +msgstr "" +"0.8.0以前のタグはアルファベット文字列とアンダースコアだけ含める事ができた。\n" +"YARDはタグ名で '.' の文字を受け入れるようになり、\n" +"プロジェクトの指定のカスタムタグのネームスペース用に推奨する。\n" +"YARDは自身のカスタム\n" +"この方法でネームスペース(名前付け)されるタグのグループを持つ。\n" +"おすすめのネームスペースは\n" +"\"projectname.tagname\" や \"projectname.component.tagname\"を使う" + +#: ../docs/WhatsNew.md:212 +msgid "## Added \"frames\" links for non-framed pages for better nav (0.8.0)" +msgstr "## ナビの改良の為フレームのないページ用にフレームのリンクが追加された (0.8.0)" + +#: ../docs/WhatsNew.md:214 +msgid "" +"Frames navigation has always had a \"(no frames)\" link to get rid\n" +"of the frameset. YARD 0.8.0 introduces a \"(frames)\" link on non-framed\n" +"pages to reverse this, allowing you to navigate between framed and\n" +"frameless pages seamlessly." +msgstr "" +"フレームのナビゲーションは\n" +"フレームセットを取り除くのを取得するのに常に\"(no frames)\"のリンクを持っていた。\n" +"YARD 0.8.0はこれを置き換えるのにフレームの無いページで\n" +"\"(frames)\"のリンクを導入する\n" +"フレームとフレーム無しのページ間を\n" +"シームレスにナビゲートするのに許可される。" + +#: ../docs/WhatsNew.md:219 +msgid "## Added Gemfile support to YARD server for local gem sets (0.8.0)" +msgstr "## ローカルgemのグループ用にYARDサーバーにGemfileのサポートが追加された (0.8.0)" + +#: ../docs/WhatsNew.md:221 +msgid "" +"The `yard server` command now supports `--gemfile` to serve gems\n" +"from a Gemfile.lock, instead of all system-wide gems." +msgstr "" +"全てのシステム側のgemの代わりにGemfile.lockからgemを提供するのに、\n" +"`yard server` コマンドは、`--gemfile` をサポートするようになった。" + +#: ../docs/WhatsNew.md:224 +msgid "## Server now displays README on index route like static docs (0.8.0)" +msgstr "## サーバーは静的なドキュメントのようなルートのインデックス上でREADMEを表示する(0.8.0)" + +#: ../docs/WhatsNew.md:226 +msgid "" +"The `yard server` command will now behave like static docs regarding\n" +"the index action for a project, listing the README file if present\n" +"before displaying the alphabetic index. Note that the route for\n" +"the alphabetic index page has now moved to the explicit '/index' action." +msgstr "" +"`yard server` コマンドは\n" +"プロジェクト用のインデックスの動作について\n" +"静的なドキュメントのような挙動になり、\n" +"アルファベットのインデックスを表示する前に与える場合、\n" +"READMEファイルを記述する。\n" +"次の事に留意する。\n" +"アルファベット順のインデックスページ用のルートは\n" +"明示的な '/index' の動作に移るようになった。" + +#: ../docs/WhatsNew.md:231 +msgid "## Added line numbers to `yard stats --list-undoc --compact` (0.8.0)" +msgstr "## `yard stats --list-undoc --compact` に行数が追加された (0.8.0)" + +#: ../docs/WhatsNew.md:233 +msgid "" +"Line numbers are now listed in the compact listing of undocumented objects\n" +"so that they can be more easily located in the files." +msgstr "" +"行数はコンパクトなアンドキュメントなオブジェクトのリストで記述されるようになった。\n" +"なのでこれらはさらに簡単にファイルの中を示す事ができる。" + +#: ../docs/WhatsNew.md:236 +msgid "## Single object db now default (multi-object db unsupported) (0.8.0)" +msgstr "" + +#: ../docs/WhatsNew.md:238 +msgid "" +"YARD previously would split the .yardoc db into multiple marshal files\n" +"for load-time performance reasons if it grew past a specific number of\n" +"objects. This check is now disabled, and YARD will never automatically\n" +"switch to a multi-object DB. YARD will now always use the single object\n" +"db unless explicitly set with `--no-single-db`. If YARD is taking a\n" +"long time to load your .yardoc database, you can try using this\n" +"option to split your database into multiple files, but note that this\n" +"can cause problems with certain codebases (specifically, if you\n" +"have class methods using the same name as a module/class)." +msgstr "" + +#: ../docs/WhatsNew.md:248 +msgid "## Added `--api` tag to generate documentation for API sets (0.8.1)" +msgstr "" + +#: ../docs/WhatsNew.md:250 +msgid "" +"You can now use `yardoc --api APINAME` to generate documentation only\n" +"for objects with the `@api APINAME` tag (or any parent namespace objects,\n" +"since this tag is transitive). Multiple `--api` switches may be used to\n" +"generate documentation for multiple APIs together. The following generates\n" +"documentation for both the \"public\" and \"developer\" APIs, also " +"including\n" +"any objects with undefined API (via `--no-api`):" +msgstr "" + +#: ../docs/WhatsNew.md:257 +msgid " $ yard doc --api public --api developer --no-api" +msgstr " $ yard doc --api public --api developer --no-api" + +#: ../docs/WhatsNew.md:259 +msgid "" +"Note that if you use `--api`, you must ensure that you also add `@api`\n" +"tags to your namespace objects (modules and classes), not just your " +"methods.\n" +"If you do not want to do this, you can also include all objects with *no*\n" +"`@api` tag by using `--no-api` as shown above." +msgstr "" + +#: ../docs/WhatsNew.md:264 +msgid "" +"Remember that applying an `@api` tag to a class or module will apply it\n" +"to all children that do not have this tag already defined, so you can\n" +"declare an entire class public by applying it to the class itself. Note\n" +"also that these tags can be overridden by child elements if the tag is\n" +"re-applied to the individual object." +msgstr "" + +#: ../docs/WhatsNew.md:270 +msgid "" +"This feature is a simplified version of the more powerful `--query`\n" +"switch. The query to display the same API documentation as the\n" +"above example would be:" +msgstr "" + +#: ../docs/WhatsNew.md:274 +msgid " $ yard doc --query '!@api || @api.text =~ /^(public|private)$/'" +msgstr " $ yard doc --query '!@api || @api.text =~ /^(public|private)$/'" + +#: ../docs/WhatsNew.md:276 +msgid "" +"But note that `--query` does not work when YARD is in \"safe mode\"\n" +"due to security concerns, whereas `--api` works in either mode.\n" +"This enables `--api` to function on remote documentation sites like\n" +"[rubydoc.info](http://rubydoc.info)." +msgstr "" + +#: ../docs/WhatsNew.md:282 +msgid "# What's New in 0.7.x?" +msgstr "# What's New in 0.7.x?" + +#: ../docs/WhatsNew.md:284 +msgid "" +"1. **Macro support and detection of DSL methods** (0.7.0)\n" +"2. **Inherited attributes now show in HTML output** (0.7.0)\n" +"3. **The 'app' directory is now parsed by default** (0.7.0)\n" +"4. **Added support for metadata (@title, @markup) in extra files/readmes** " +"(0.7.0)\n" +"5. **Added `yard list` command (alias for `yardoc --list`)** (0.7.0)\n" +"6. **Added Git support in `yard diff`** (0.7.0)\n" +"7. **Added `{include:file:FILENAME}` syntax** (0.7.0)\n" +"8. **Added `{render:OBJECT}` syntax to embed object docs in extra files** " +"(0.7.0)\n" +"9. **Added improved templates API for custom CSS/JS/menus** (0.7.0)\n" +"10. **Added Ruby markup type (`-m ruby`)** (0.7.0)\n" +"11. **Added state tracking variables to Parser/Handler architecture** " +"(0.7.0)\n" +"12. **Added before/after callbacks to SourceParser** (0.7.0)\n" +"13. **Can now use `--yardopts FILE` to specify a custom yardopts file** " +"(0.7.0)\n" +"14. **Added new `-t guide` template for guide based docs** (0.7.0)\n" +"15. **Github Flavoured Markdown now works out-of-box** (0.7.4)\n" +"16. **Added `-m textile_strict` and `-m pre` markup types** (0.7.4)\n" +"17. **Reorganized markup types 'text' and 'none'** (0.7.4)\n" +"18. **Add support for `rb_define_alias`** (0.7.4)" +msgstr "" +"1. **マクロのサポートとDSLメソッドの検知** (0.7.0)\n" +"2. **継承された属性はすぐHTML出力で一覧できる** (0.7.0)\n" +"3. **'app'ディレクトリは、すぐデフォルトで解析される** (0.7.0)\n" +"4. **追加のファイル/readmesでメタデータ用(@title,@markup)のサポートが追加され" +"た** (0.7.0)\n" +"5. **`yard list`コマンドが追加された(`yardoc --list`用のエイリアス)** " +"(0.7.0)\n" +"6. **`yard diff`でGitサポートが追加された** (0.7.0)\n" +"7. **`{include:file:FILENAME}`構文** (0.7.0)\n" +"8. **追加のファイルでオブジェクトのdocsを組み込む為の`{render:OBJECT}`構文が" +"追加された** (0.7.0)\n" +"9. **カスタムCSS/JS/メニュー用の改良されたテンプレートAPIが追加された** " +"(0.7.0)\n" +"10. **Rubyのマークアップの型(`-m ruby`)が追加された** (0.7.0)\n" +"11. **パーサー/ハンドラーのアーキテクチャにトラッキングの状態変数が追加された" +"** (0.7.0)\n" +"12. **SourceParserにbefore/afterのコールバックが追加された** (0.7.0)\n" +"13. **カスタムyardoptsファイルを指定するのに、`--yardopts FILE`ですぐに、使う" +"事が出来る** (0.7.0)\n" +"14. **基底となるdocstringをガイドするのに、`-t guide`テンプレートを新しく追加" +"する** (0.7.0)<\n" +"15. **Github風のMarkdownが常識破りの仕事をするようになった** (0.7.4)\n" +"16. **`-m textile_strict`と`-m pre`マークアップの型が追加された** (0.7.4)\n" +"17. **'text'と'none'のマークアップ型が再編成された** (0.7.4)\n" +"18. **`rb_define_alias`用のサポートが追加された** (0.7.4)" + +#: ../docs/WhatsNew.md:303 +msgid "## Macro support and detection of DSL methods (0.7.0)" +msgstr "## マクロのサポートとDSLメソッドの検知 (0.7.0)" + +#: ../docs/WhatsNew.md:305 +msgid "" +"YARD will now automatically detect class level method calls, similar to the\n" +"way it knows what an `attr_accessor` is. By simply adding documentation to\n" +"your class level declarations, YARD can automatically detect them as " +"methods\n" +"or attributes in your class. Consider DataMapper's \"property\" declaration:" +msgstr "" +"YARDは自動でクラスレベルメソッドの呼び出しを検知するようになった。\n" +"'attr_accessor'何なのか知るのと似ている。\n" +"簡単にあなたのクラスレベル宣言にドキュメントを追加する。\n" +"DataMapperの\"property\"宣言を考慮する。" + +#: ../docs/WhatsNew.md:310 +msgid "" +" class Post\n" +" # @attribute\n" +" # @return [String] the title of the post\n" +" property :title, String\n" +" end" +msgstr "" +" class Post\n" +" # @attribute\n" +" # @return [String] the title of the post\n" +" property :title, String\n" +" end" + +#: ../docs/WhatsNew.md:316 +msgid "" +"The above declaration would be created as the `Post#title`. The optional\n" +"`@attribute` tag tells YARD that the property is an \"attribute\", and not " +"just\n" +"a regular method." +msgstr "" +"上の宣言は、`Post#title`メソッドとして作成されるだろう。\n" +"任意の`@attribute`タグがYARDの\"property\"に伝えるのは、\"attribute\"であ" +"り、\n" +"それは正規のメソッドではない。" + +#: ../docs/WhatsNew.md:320 +msgid "" +"In addition to basic DSL method detection, YARD also supports macros to " +"create\n" +"docstrings that can be copies to other objects; these macros can also be\n" +"\"attached\" to class level methods to create implicit documentation for " +"macros." +msgstr "" +"更に基本のDSLメソッド検知に加えて、\n" +"YARDは他のオブジェクトにコピーできるdocstringを作成するマクロもサポートする。\n" +"これらのマクロはマクロ用に暗黙のドキュメントを作成するために\n" +"クラスレベルメソッドに\"追加\"(attached)もできる。" + +#: ../docs/WhatsNew.md:324 +msgid "" +"Macros and DSL method detection are discussed in much more detail in the\n" +"{file:docs/GettingStarted.md}, so you should read about them there if " +"you're\n" +"interested in this feature." +msgstr "" +"マクロとDSLメソッド宣言の詳細は{file:docs/GettingStarted.md}で説明されるので、\n" +"あなたがこの機能に興味がある場合、そこで読む事ができる。" + +#: ../docs/WhatsNew.md:328 +msgid "## Inherited attributes now show in HTML output (0.7.0)" +msgstr "## 継承された属性をHTML出力ですぐに調べられるようになった (0.7.0)" + +#: ../docs/WhatsNew.md:330 +msgid "" +"Inherited attributes will now show up in HTML documentation using the " +"default\n" +"template in the same manner that inherited methods do." +msgstr "" +"継承された属性は、\n" +"継承されたメソッドと同じ形式で\n" +"デフォルトのテンプレートによって\n" +"HTMLドキュメントですぐに現れるだろう。" + +#: ../docs/WhatsNew.md:333 +msgid "## The 'app' directory is now parsed by default (0.7.0)" +msgstr "## デフォルトで'app'ディレクトリはすぐに解析される (0.7.0)" + +#: ../docs/WhatsNew.md:335 +msgid "" +"YARD tries to follow the \"It Just Works\" attitude in writing developer " +"tools,\n" +"and therefore has added `app/**/*.rb` to the default list of globs that it\n" +"searches for code in. You no longer need to create a `.yardopts` just to\n" +"list your app directory when documenting your code on rubydoc.info.\n" +"We should have done this a while ago! And don't worry, YARD still checks\n" +"lib and ext by default, too." +msgstr "" +"YARDは開発者のツールで書かれている\\\"ちゃんと動く\\\"姿勢をフォローしようとする、\n" +"従って、それがコード用に検索するglobのデフォルトのリストに\n" +"追加された`app/**/*.rb`を持つ\n" +"あなたはもはやrubydoc.infoであなたのコードを記述する時に\n" +"あなたのアプリのディレクトリ記述するのに`.yardopts`を作成する必要はない。\n" +"ちょっと前にこれが完成したが、心配しないで、\n" +"YARDはまだデフォルトでlibとextもチェックする。" + +#: ../docs/WhatsNew.md:342 +msgid "" +"## Added support for metadata (@title, @markup) in extra files/readmes " +"(0.7.0)" +msgstr "" +"## 追加のファイルとREADMEの中でメタデータ(@title,@markup)用のサポートが追加さ" +"れた(0.7.0)" + +#: ../docs/WhatsNew.md:344 +msgid "" +"Extra files (READMEs, ChangeLogs, LICENSE files, and other guides) now " +"support\n" +"metadata tags, just like docstrings in code comments. By adding @tag values\n" +"to the top of a file (no whitespace preceding it) inside of a `# comment` " +"line,\n" +"YARD will detect and parse these tags and store it for later usage." +msgstr "" +"追加のファイル(README,ChangeLogs,LICENSEファイルや他のガイド)は、\n" +"すぐに、メタデータタグをサポートする(コードのコメント中のdocstringのよう" +"に)。\n" +"`# comment`行の中のファイルの最初に@tagの値を追加する事で、\n" +"YARDは、このタグを検知,解析し、最新の方法でそれを記録するだろう。" + +#: ../docs/WhatsNew.md:349 +msgid "" +"Tags can contain arbitrary data as well as arbitrary tag names, however the\n" +"tag names @title and @markup are reserved to specify the document title and\n" +"markup format respectively. The title will be used in the file list menu,\n" +"index page, as well as any linking of the file via the `{file:Filename}`\n" +"syntax. An example of a document with metadata would be:" +msgstr "" +"タグは任意のデータも任意のタグ名も含める事ができる、\n" +"しかしながら、タグ名の@titleと@markupは、\n" +"ドキュメントのタイトルとマークアップフォーマットを個別に指定する為に用意される。\n" +"タイトルはファイルリストメニューや\n" +"index pageも`{file:Filename}`構文経由の任意のファイルへのリンクでも利用される。\n" +"次はメタデータを用いたドキュメントの例:" + +#: ../docs/WhatsNew.md:355 +msgid "" +" # @title The Best Project Ever!\n" +" # @markup rdoc\n" +" # @author Foo Bar (custom tag, does not display in templates)" +msgstr "" +" # @title The Best Project Ever!\n" +" # @markup rdoc\n" +" # @author Foo Bar (custom tag, does not display in templates)" + +#: ../docs/WhatsNew.md:359 +msgid " = This Project Rules" +msgstr " = This Project Rules" + +#: ../docs/WhatsNew.md:361 +msgid " == Contents" +msgstr " == Contents" + +#: ../docs/WhatsNew.md:363 +msgid " ..." +msgstr " ..." + +#: ../docs/WhatsNew.md:365 +msgid "" +"Note that previous versions of YARD recommended specifying the markup of an\n" +"extra file with the `#!markup` shebang, but the `@markup` metadata tag is " +"now\n" +"the \"best practice\" for specifying the markup format of an extra file." +msgstr "" +"次の事に留意する。\n" +"YARDの前のバージョンは、\n" +"`#!markup`のshebangを用いた追加のファイルのマークアップの指定が\n" +"推奨された。\n" +"しかし、今は`@markup`メタデータタグが、\n" +"追加のファイルのマークアップフォーマットを指定するのに最善の方法である。" + +#: ../docs/WhatsNew.md:369 +msgid "## Added `yard list` command (alias for `yardoc --list`) (0.7.0)" +msgstr "" +"## `yard list`コマンドを追加する。(`yardoc --list`用のエイリアス) (0.7.0)" + +#: ../docs/WhatsNew.md:371 +msgid "" +"The `yardoc --list` command is used to list objects that are parsed from\n" +"a codebase. This can be used to grep methods/classes in a codebase from the\n" +"command line. `yard list` now calls `yardoc --list` as a convenience command." +msgstr "" +"`yardoc --list`コマンドはソースコードから解析されるリストオブジェクトの為に利" +"用される。\n" +"これは、ソースコードの中でメソッド/クラスをgrepする為に利用できる。\n" +"`yard list`は、便利なメソッドとして`yardoc --list`を呼び出すようになった。" + +#: ../docs/WhatsNew.md:375 +msgid "" +"Note that the `yardoc --list` command may eventually be replaced by a more\n" +"feature-filled `yard list` command, so `yard list` should be used instead " +"of\n" +"`yardoc --list` when possible." +msgstr "" +"次の事に留意する。`yardoc --list`コマンドは、\n" +"将来、より多くの機能で満たされた`yard list`コマンドに切り替わるだろう。\n" +"なので可能であれば`yardoc --list`の代わりに、`yard list`を利用する方がよい。" + +#: ../docs/WhatsNew.md:379 +msgid "## Added Git support in `yard diff` (0.7.0)" +msgstr "## `yard diff`でGitのサポートが追加された (0.7.0)" + +#: ../docs/WhatsNew.md:381 +msgid "" +"The `yard diff` command can now perform object diffing on git repositories.\n" +"Provide the `--git` switch to `yard diff` with 2 commit/branches like so:" +msgstr "" +"`yard diff`コマンドは、すぐに、gitリポジトリ上でオブジェクトのdiffを実行す" +"る。\n" +"`yard diff`に切り替える`--git`を提供する。\n" +"次のように、2つのcommitとbrancheを切り替える。" + +#: ../docs/WhatsNew.md:384 +msgid "" +" $ yard diff --git HEAD~5 HEAD\n" +" Added objects:" +msgstr "" +" $ yard diff --git HEAD~5 HEAD\n" +" Added objects:" + +#: ../docs/WhatsNew.md:387 +msgid "" +" YARD::Parser::SourceParser#contents\n" +" YARD::Parser::SourceParser#globals\n" +" ..." +msgstr "" +" YARD::Parser::SourceParser#contents\n" +" YARD::Parser::SourceParser#globals\n" +" ..." + +#: ../docs/WhatsNew.md:391 +msgid "## Added `{include:file:FILENAME}` syntax (0.7.0)" +msgstr "## `{include:file:FILENAME}`構文 (0.7.0)" + +#: ../docs/WhatsNew.md:393 +msgid "" +"You can now use the `{include:file:FILENAME}` syntax to embed the contents\n" +"of an extra file marked up in its markup format. This syntax supports " +"embedding\n" +"Ruby source files and performing syntax highlighting on the code." +msgstr "" +"あなたはすぐに、\n" +"マークアップされた追加のファイルの内容を埋め込む為の\n" +"`{include:file:FILENAME}`構文を利用できる。\n" +"この構文は、Rubyのソースファイルの埋め込みと構文のコードハイライトの実行をサ" +"ポートする。" + +#: ../docs/WhatsNew.md:397 +msgid "" +"## Added `{render:OBJECT}` syntax to embed object docs in extra files (0.7.0)" +msgstr "" +"## 追加のファイルでdocsオブジェクトを埋め込む為に`{render:OBJECT}`構文を追加" +"した (0.7.0)" + +#: ../docs/WhatsNew.md:399 +msgid "" +"You can now use the `{render:Object}` syntax to embed the documentation\n" +"rendering of an entire object (method, class, module) inside of an extra " +"file.\n" +"This is useful when writing non-API based guides that might require listing\n" +"a few helper methods or classes. The {file:docs/GettingStarted.md} " +"discussed\n" +"this syntax in more detail (with example usage)." +msgstr "" +"あなたは、追加のファイルの中の全てのオブジェクト(メソッド,クラス,モジュール)のドキュメント表示を\n" +"埋め込む為に`{render:Object}`構文を利用できる。\n" +"これはいくつかのヘルパーメソッドや\n" +"クラスを記述する必要があるAPIベースではないガイドを書く時に便利である。\n" +"この構文の更なる詳細(例や使用法)は、\n" +"{file:docs/GettingStarted.md}で説明される。" + +#: ../docs/WhatsNew.md:405 +msgid "## Added improved templates API for custom CSS/JS/menus (0.7.0)" +msgstr "## CSS/JS/メニュー用に改良されたテンプレートAPIが追加された (0.7.0)" + +#: ../docs/WhatsNew.md:407 +msgid "" +"Plugin & template developers can now more easily insert custom stylesheet\n" +"or JavaScript files in their customized templates, thanks to an abstraction\n" +"of the template API. This is documented in the {docs/Templates.md} " +"document.\n" +"In addition to custom CSS/JS, developers can also create custom menu tabs\n" +"in both the framed and non framed version of the default theme." +msgstr "" +"プラグインとテンプレートの開発者は、\n" +"template APIの抽象化のおかげで、\n" +"カスタマイズされたテンプレートで\n" +"スタイルシートやJavaScriptのファイルを挿入できるようになった。\n" +"これは、{docs/Templates.md}ドキュメントの中で記述される。\n" +"さらに、カスタムCSS/JSで、開発者は、\n" +"フレーム有とデフォルトテーマのフレーム無しの両方のカスタムメニュータブを\n" +"作成する事もできる。" + +#: ../docs/WhatsNew.md:413 +msgid "## Added Ruby markup type (`-m ruby`) (0.7.0)" +msgstr "## Rubyマークアップ型(`-m ruby`)が追加された (0.7.0)" + +#: ../docs/WhatsNew.md:415 +msgid "" +"The Ruby markup type (`-m ruby`) will now use syntax highlighting for all\n" +"formatting. This is probably not useful as a global switch, but can be used\n" +"on individual extra files using the metadata markup specification discussed\n" +"above." +msgstr "" +"Rubyマークアップ型の(`-m ruby`)は、すぐに、\n" +"全てのフォーマット用に構文のハイライトを利用する。\n" +"これは全体の切り替えとしては、恐らく便利ではないが、\n" +"上で説明されたメタデータマークアップの指定によって\n" +"個々の追加のファイル上で利用できる。" + +#: ../docs/WhatsNew.md:420 +msgid "" +"## Added state tracking variables to Parser/Handler architecture (0.7.0)" +msgstr "" +"## Parser/Handlerアーキテクチャにトラッキング変数の状態が追加された (0.7.0)" + +#: ../docs/WhatsNew.md:422 +msgid "" +"The parser and handler architecture now contain state variables\n" +"{YARD::Handlers::Base#extra_state} and {YARD::Handlers::Processor#globals}\n" +"to share data across handlers and the entire processing phase. " +"`#extra_state`\n" +"provided a place to store per-file data, while `#globals` gives the " +"developer\n" +"access to inter-file state when parsing multiple files at once." +msgstr "" +"パーサーとハンドラーのアーキテクチャは、\n" +"ハンドラーと全ての処理段階に渡って共有する為に\n" +"{YARD::Handlers::Base#extra_state} と {YARD::Handlers::Processor#globals}の\n" +"変数の状態を含むようになった。\n" +"`#extra_state`メソッドは、ファイル毎にデータを記録する為の場所を提供し、\n" +"`#globals`メソッドは、一気に複数のファイルを解析する時に内部のファイルの状態に\n" +"開発者がアクセスする事を許可する。" + +#: ../docs/WhatsNew.md:428 +msgid "## Added before/after callbacks to SourceParser (0.7.0)" +msgstr "## SourceParserにbeforeとafterのコールバックが追加された (0.7.0)" + +#: ../docs/WhatsNew.md:430 +msgid "" +"The {YARD::Parser::SourceParser} class can now register callbacks to " +"execute\n" +"code before and after parsing of file globs, as well as before and after\n" +"parsing of individual files. This allows plugin developers to perform\n" +"setup/teardown (and set global state or update the {YARD::Registry})." +msgstr "" +"{YARD::Parser::SourceParser}クラスは、\n" +"ファイルグロブの解析の前後のコードも個々のファイルの解析の前後も\n" +"実行する為にすぐにコールバックを記録できる。\n" +"これは、セットアップ/開発(全体の状態や{YARD::Registry}の更新)を実行する為、\n" +"開発者のプラグインを受入れる。" + +#: ../docs/WhatsNew.md:435 +msgid "See the documentation for the following methods:" +msgstr "次のメソッド用のドキュメントを参照:" + +#: ../docs/WhatsNew.md:437 +msgid "" +"* {YARD::Parser::SourceParser.before_parse_list}\n" +"* {YARD::Parser::SourceParser.after_parse_list}\n" +"* {YARD::Parser::SourceParser.before_parse_file}\n" +"* {YARD::Parser::SourceParser.after_parse_file}" +msgstr "" +"* {YARD::Parser::SourceParser.before_parse_list}\n" +"* {YARD::Parser::SourceParser.after_parse_list}\n" +"* {YARD::Parser::SourceParser.before_parse_file}\n" +"* {YARD::Parser::SourceParser.after_parse_file}" + +#: ../docs/WhatsNew.md:442 +msgid "" +"## Can now use `--yardopts FILE` to specify a custom yardopts file (0.7.0)" +msgstr "" +"## カスタムyardoptsファイルを指定するのに、`--yardopts FILE`を利用できるよう" +"になった (0.7.0)" + +#: ../docs/WhatsNew.md:444 +msgid "" +"The `yardoc` command now supports `--yardopts FILE` to specify custom ." +"yardopts\n" +"options files. This is useful if you have multiple documentation sets, such\n" +"as a guide documentation set and an API documentation set." +msgstr "" +"`yardoc`コマンドは、すぐに\n" +"カスタム.yardopts設定ファイルを指定するのに、\n" +"`--yardopts FILE`をサポートする。\n" +"これは、ガイドキュメントやAPIドキュメントのような\n" +"複数のドキュメントのグループを持っている場合、便利である。" + +#: ../docs/WhatsNew.md:448 +msgid "## Added new `-t guide` template for guide based docs (0.7.0)" +msgstr "" +"## docstringベースのガイド用に`-t guide`テンプレートが新しく追加された " +"(0.7.0)" + +#: ../docs/WhatsNew.md:450 +msgid "" +"You can now write guide style documentation using a new 'guide' template " +"that\n" +"only generates documentation for extra files. You would use it in the form:" +msgstr "" +"あなたは、追加のファイル用のドキュメントだけ生成する\n" +"新しく追加された'guide'テンプレートによって\n" +"すぐにガイドスタイルドキュメントを書く事ができる。\n" +"あなたは、次のような形式で利用できる。" + +#: ../docs/WhatsNew.md:453 +msgid " yardoc -t guide - README GettingStarted FAQ TroubleShooting LICENSE" +msgstr " yardoc -t guide - README GettingStarted FAQ TroubleShooting LICENSE" + +#: ../docs/WhatsNew.md:455 +msgid "" +"This creates the sections for the readme, a getting started, frequently " +"asked\n" +"questions, trouble shooting and license page." +msgstr "" +"これは、README,GettingStarted,FAQ,トラブルシューティング,ライセンスページ用の" +"セクションを生成する。" + +#: ../docs/WhatsNew.md:458 +msgid "" +"If you need to refer to class / method documentation, you can embed API " +"documentation\n" +"using the `{render:Object}` tag discussed above." +msgstr "" +"クラスとメソッドドキュメントに参照する必要がある場合、\n" +"APIドキュメントを上で説明された`{render:Object}`タグによって埋め込む事が出来" +"る。" + +#: ../docs/WhatsNew.md:461 +msgid "## Github Flavoured Markdown now works out-of-box (0.7.4)" +msgstr "" + +#: ../docs/WhatsNew.md:463 +msgid "" +"Due to the growing popularity of Github-Flavoured-Markdown (GFM), YARD now " +"uses\n" +"the Redcarpet library as the default Markdown formatting library with GFM " +"fenced\n" +"code blocks enabled. This means that you can use fenced code blocks inside " +"of\n" +"Markdown files with redcarpet installed without any extra code. Previously, " +"users\n" +"who wanted GFM in their Markdown would have to specify `-m markdown -M " +"redcarpet`,\n" +"but this is now the default behaviour for YARD." +msgstr "" + +#: ../docs/WhatsNew.md:470 +msgid "" +"Note that you can still specify language types in code blocks without GFM in " +"YARD\n" +"by using the \"!!!lang\" prefix syntax. For example (plain means no markup):" +msgstr "" + +#: ../docs/WhatsNew.md:473 +msgid "" +" !!!plain\n" +" !!!plain\n" +" Some code\n" +" block here." +msgstr "" +" !!!plain\n" +" !!!plain\n" +" Some code\n" +" block here." + +#: ../docs/WhatsNew.md:478 +msgid "The GFM version would be:" +msgstr "" + +#: ../docs/WhatsNew.md:480 +msgid "" +" !!!plain\n" +" ```plain\n" +" Some code\n" +" block here.\n" +" ```" +msgstr "" +" !!!plain\n" +" ```plain\n" +" Some code\n" +" block here.\n" +" ```" + +#: ../docs/WhatsNew.md:486 +msgid "## Added `-m textile_strict` and `-m pre` markup types (0.7.4)" +msgstr "" + +#: ../docs/WhatsNew.md:488 +msgid "" +"A new \"textile_strict\" markup type was added which behaves exactly like " +"\"textile\"\n" +"except it enables hard breaks, so newlines behave as line breaks in the " +"HTML\n" +"(using `
    ` tags). This option is added for users who want the classic " +"textile\n" +"behaviour." +msgstr "" + +#: ../docs/WhatsNew.md:493 +msgid "## Reorganized markup types 'text' and 'none' (0.7.4)" +msgstr "" + +#: ../docs/WhatsNew.md:495 +msgid "" +"Due to the new pre markup type, the behaviour for text and none were " +"slightly\n" +"reorganized to be more intuitive. The following behaviours now represent " +"these\n" +"markup types:" +msgstr "" + +#: ../docs/WhatsNew.md:499 +msgid "" +" * pre: Used to wrap text inside `
    ` tags\n"
    +" * text: No formatting except for hard breaks (`
    `) on newlines\n" +" * none: No formatting at all." +msgstr "" + +#: ../docs/WhatsNew.md:503 +msgid "" +"In all cases, HTML is escaped from input. If you want no HTML escaping, use " +"the\n" +"html markup type." +msgstr "" + +#: ../docs/WhatsNew.md:506 +msgid "## Add support for `rb_define_alias` (0.7.4)" +msgstr "## `rb_define_alias`用のサポートが追加された (0.7.4)" + +#: ../docs/WhatsNew.md:508 +msgid "" +"CRuby code can now make use of the `rb_define_alias` function. " +"Documentation\n" +"for aliases is not supported, however." +msgstr "" + +#: ../docs/WhatsNew.md:511 +msgid "# What's New in 0.6.x?" +msgstr "" + +#: ../docs/WhatsNew.md:513 +msgid "" +"1. **Local documentation server for RubyGems or projects (`yard server`)** " +"(0.6.0)\n" +"2. **Groups support for method listing** (0.6.0)\n" +"3. **Single file template (`--one-file`) support** (0.6.0)\n" +"4. **`yard` CLI executable with pluggable commands** (0.6.0)\n" +"5. **`yard diff` command to object-diff two versions of a project** (0.6.0)\n" +"6. **Added `--asset` option to `yardoc`** (0.6.0)\n" +"7. **New template API** (0.6.0)\n" +"8. **HTML template now adds inline Table of Contents for extra files pages** " +"(0.6.0)\n" +"9. **Removed `--incremental` in favour of `--use-cache`** (0.6.0)\n" +"10. **Ad-hoc tag registration via `yardoc` CLI (`--tag`, etc.)** (0.6.0)\n" +"11. **Added `--transitive-tags` to register transitive tags** (0.6.0)\n" +"12. **`yardoc` now displays RDoc-like statistics (`--no-stats` to hide)** " +"(0.6.0)\n" +"13. **`yri` now works on constants** (0.6.0)\n" +"14. **Plugins are no longer auto-loaded (added `--plugin` switch)** (0.6.2)\n" +"15. **Added `YARD::Config` API and `~/.yard/config` configuration file** " +"(0.6.2)\n" +"16. **Added `yard config` command to view/edit configuration** (0.6.2)\n" +"17. **Added `yard server -t` template path switch** (0.6.2)\n" +"18. **Added `YARD::Server.register_static_path` for static server assets** " +"(0.6.2)\n" +"19. **YARD::Registry is now thread local** (0.6.5)\n" +"20. **Support for ripper gem in Ruby 1.8.7** (0.6.5)" +msgstr "" +"1. **RubyGemsやプロジェクト用のローカルドキュメントサーバー(`yard server`)** " +"(0.6.0)\n" +"2. **メソッド記述用のサポートをグループ化する** (0.6.0)\n" +"3. **単一のファイルのテンプレートのサポート(`--one-file`)** (0.6.0)\n" +"4. **`yard` のコマンドは、プラグインコマンドを用い実行可能となる** (0.6.0)\n" +"5. **プロジェクトの二つのバージョンのオブジェクトのdiffを見る為の`yard diff`" +"コマンド** (0.6.0)\n" +"6. **`yardoc`に`--asset`オプションが追加された** (0.6.0)\n" +"7. **新しいテンプレートAPI** (0.6.0)\n" +"8. **HTMLテンプレートは追加のファイルのページの内容のインラインテーブルを追加" +"する** (0.6.0)\n" +"9. **`--use-cache`のおかげで`--incremental`は削除された** (0.6.0)\n" +"10. **`yardoc`CLI経由で臨時のタグの記録(`--tag`, etc.)** (0.6.0)\n" +"11. **過渡的なタグを記録する為に、`--transitive-tags`が追加された** (0.6.0)\n" +"12. **`yardoc`がRDocのように統計値を表示するようになった(隠すには、`--no-" +"stats`)**\n" +"13. **`yri`定数で働くようになった** (0.6.0)\n" +"14. **プラグインは、自動ロードされなくなった(`--plugin`引数が追加された)** " +"(0.6.2)\n" +"15. **`YARD::Config`APIと`~/.yard/config`設定ファイルが追加された** (0.6.2)\n" +"16. **設定の調査/編集の為の`yard config`コマンドが追加された** (0.6.2)\n" +"17. **`yard server -t`テンプレートのパスの引数が追加された** (0.6.2)\n" +"18. **静的なサーバー資源用に`YARD::Server.register_static_path`が追加された" +"** (0.6.2)\n" +"19. **YARD::Registryがスレッドローカルになった** (0.6.5)\n" +"20. **Ruby 1.8.7でgemのripper用のサポート** (0.6.5)" + +#: ../docs/WhatsNew.md:534 +msgid "" +"## Local documentation server for RubyGems or projects (`yard server`) " +"(0.6.0)" +msgstr "" +"## RubyGems又はプロジェクト用のローカルドキュメントサーバー(`yard server`) " +"(0.6.0)" + +#: ../docs/WhatsNew.md:536 +msgid "" +"The new `yard server` command spawns a documentation server that can serve\n" +"either documentation for a local project or installed RubyGems. The server\n" +"will host (by default) on http://localhost:8808." +msgstr "" +"新しい`yard server`コマンドは\n" +"ローカルプロジェクトや既存のRubyGems用の全てのドキュメントを提供できる\n" +"ドキュメントサーバーを生みだす。\n" +"サーバーはhttp://localhost:8808のホスト(デフォルトで)になる。" + +#: ../docs/WhatsNew.md:540 +msgid "" +"To serve documentation for the active project (in the current directory):" +msgstr "" +"アーカイブのプロジェクト用にドキュメントを提供するには、(現在のディレクトリの" +"中の)" + +#: ../docs/WhatsNew.md:544 +msgid "" +"The server can also run in \"incremental\" mode for local projects. In this\n" +"situation, any modified sources will immediately be updated at each " +"request,\n" +"ensuring that the server always serve the code exactly as it is on disk.\n" +"Documenting your code in this fashion essentially gives you an efficient a\n" +"live preview without running a separate command everytime you make a " +"change.\n" +"To serve documentation for the active project in incremental mode:" +msgstr "" +"サーバーはローカルプロジェクト用の \"incremental\" モードでも起動できる。\n" +"この場合、任意の変更されるソースは個々のリクエストですぐに更新され、\n" +"サーバーが常にディスク上で確実にコードを提供することを保証する。\n" +"基本的にこのやり方であなたののコードのドキュメントは\n" +"毎回あなたが変更するたびに\n" +"区切られたコマンド無しで効率的に動いたままプレビューできる。\n" +"インクリメンタルモードで\n" +"アクティブなプロジェクトのためにドキュメントを提供するには:" + +#: ../docs/WhatsNew.md:551 +msgid " $ yard server --reload" +msgstr " $ yard server --reload" + +#: ../docs/WhatsNew.md:553 +msgid "" +"Note that in incremental mode, objects or method " +"groupings\n" +" cannot be removed. If you have removed objects or modified groupings, you\n" +" will need to flush the cache by deleting `.yardoc` and (optionally)\n" +" restarting the server." +msgstr "" +"Note that in incremental mode, objects or method groupings\n" +" cannot be removed. If you have removed objects or modified groupings, you\n" +" will need to flush the cache by deleting `.yardoc` and (optionally)\n" +" restarting the server." + +#: ../docs/WhatsNew.md:558 +msgid "" +"The documentation server can also serve documentation for all installed " +"gems\n" +"on your system, similar to `gem server`, but using YARD's functionality and\n" +"templates. To serve documentation for installed gems:" +msgstr "" +"ドキュメントサーバーはあなたのシステムで\n" +"`gem server`と同様にYARDの機能とテンプレートを使う事によって\n" +"既存の全てのgem用のドキュメントも提供できる\n" +"既存のgem用にドキュメントを提供するには:" + +#: ../docs/WhatsNew.md:564 +msgid "" +"Documentation for the gem need not be previously " +"generated\n" +" at install-time. If documentation for the gem has not been generated, " +"YARD\n" +" will do this for you on-the-fly. It is therefore possible to speed up " +"your\n" +" gem installs by using `gem install GEMNAME --no-rdoc` without " +"repercussion.\n" +" You can also add this switch to your `~/.gemrc` file so that you don't " +"need\n" +" to re-type it each time. See [this link](http://stackoverflow.com/" +"questions/1789376/how-do-i-make-no-ri-no-rdoc-the-default-for-gem-install)\n" +" for exact instructions." +msgstr "" +"Documentation for the gem need not be previously generated\n" +" at install-time. If documentation for the gem has not been generated, YARD\n" +" will do this for you on-the-fly. It is therefore possible to speed up your\n" +" gem installs by using `gem install GEMNAME --no-rdoc` without repercussion.\n" +" You can also add this switch to your `~/.gemrc` file so that you don't need\n" +" to re-type it each time. See [this link](http://stackoverflow.com/questions/1789376/how-do-i-make-no-ri-no-rdoc-the-default-for-gem-install)\n" +" for exact instructions." + +#: ../docs/WhatsNew.md:572 +msgid "## Groups support for method listing (0.6.0)" +msgstr "## メソッドの記述用のサポートをグループ化する (0.6.0)" + +#: ../docs/WhatsNew.md:574 +msgid "" +"You can now organize methods in a class/module into logical separated " +"groups.\n" +"These groups apply lexically and are listed in the order they are defined.\n" +"For instance, to define a group:" +msgstr "" +"あなたは論理的に分けられたグループへ\n" +"class/moduleの中のメソッドをまとめられるようになった。\n" +"これらのグループは単語的に適用され、\n" +"これらの命令が定義される中で記述される。\n" +"例えばグループを定義するには:" + +#: ../docs/WhatsNew.md:578 +msgid " # @group Rendering an Object" +msgstr " # @group Rendering an Object" + +#: ../docs/WhatsNew.md:580 +msgid "" +" # Documentation here\n" +" def foo; end" +msgstr "" +" # Documentation here\n" +" def foo; end" + +#: ../docs/WhatsNew.md:583 +msgid "" +" # Extra documentation...\n" +" def bar; end" +msgstr "" +" # Extra documentation...\n" +" def bar; end" + +#: ../docs/WhatsNew.md:586 +msgid " # @group Another Group" +msgstr " # @group Another Group" + +#: ../docs/WhatsNew.md:588 +msgid " def aaa; end" +msgstr " def aaa; end" + +#: ../docs/WhatsNew.md:590 +msgid "" +"Note that these `@group` and `@endgroup` declarations " +"are\n" +" not \"tags\" and should always be separated with at least 1 line of " +"whitespace\n" +" from any other documentation or code." +msgstr "" +"Note that these `@group` and `@endgroup` declarations are\n" +" not \"tags\" and should always be separated with at least 1 line of whitespace\n" +" from any other documentation or code." + +#: ../docs/WhatsNew.md:594 +msgid "" +"In the above example, \"Rendering an Object\" will be listed with \"foo\" " +"and\n" +"\"bar\" above \"Another Group\", even though \"aaa\" comes before the two " +"other\n" +"methods, alphabetically. To end a group, use `@endgroup`. It is not " +"necessary\n" +"to end a group to start a new one, only if there is an object following the\n" +"group that should not belong in any group." +msgstr "" +"上の例で \"表示されるオブジェクトは\"\n" +"\"Another Group\" の上の \"foo\" と \"bar\"の\n" +"二つの他のメソッドが前にあるけれども\n" +"実際にはアルファベット順で\"aaa\"が来て記述される。\n" +"グループを終りには`@endgroup`を使う。\n" +"これは新しくグループを作るのにグループを終了する必要はない。\n" +"任意のグループの中に所属すべきではないグループに続くオブジェクトがある場合だけである。" + +#: ../docs/WhatsNew.md:600 +msgid " # @group Group 1" +msgstr " # @group Group 1" + +#: ../docs/WhatsNew.md:602 +msgid " def foo; end" +msgstr " def foo; end" + +#: ../docs/WhatsNew.md:604 +msgid " # @endgroup" +msgstr " # @endgroup" + +#: ../docs/WhatsNew.md:606 +msgid "" +" # This method should not be listed in any group\n" +" def bar; end" +msgstr "" +" # This method should not be listed in any group\n" +" def bar; end" + +#: ../docs/WhatsNew.md:609 +msgid "## Single file template (`--one-file`) support (0.6.0)" +msgstr "## 単一のファイルのテンプレート (`--one-file`)のサポート (0.6.0)" + +#: ../docs/WhatsNew.md:611 +msgid "" +"`yardoc` now has the `--one-file` option to generate a single-file template\n" +"for small scripts and libraries. In this case, any comments at the top of\n" +"the script file will be recognized as a README." +msgstr "" +"`yardoc`は、小さいスクリプトやライブラリ用の\n" +"単一のファイルのテンプレートを生成する`--one-file`オプションが追加された。\n" +"この場合、任意の内容の\n" +"スクリプトファイルのトップでの任意のコメントは、READMEとして認識される。" + +#: ../docs/WhatsNew.md:615 +msgid "## `yard` CLI executable with pluggable commands (0.6.0)" +msgstr "## `yard` CLI がプラグイン可能なコマンドとして実行可能になる (0.6.0)" + +#: ../docs/WhatsNew.md:617 +msgid "" +"The `yardoc` and `yri` commands are not deprecated and " +"can\n" +" continue to be used. They are shortcuts for `yard doc` and `yard ri`\n" +" respectively. However, `yard-graph` has been removed." +msgstr "" +"The `yardoc` and `yri` commands are not deprecated and can\n" +" continue to be used. They are shortcuts for `yard doc` and `yard ri`\n" +" respectively. However, `yard-graph` has been removed." + +#: ../docs/WhatsNew.md:621 +msgid "" +"YARD now has a `yard` executable which combines all pre-existing and new\n" +"commands into a single pluggable command that is both easier to remember " +"and\n" +"access. To get a list of commands, type `yard --help`." +msgstr "" +"YARDは既存のものと新たなコマンドを一体化し、\n" +"思い出しとアクセスすることを簡単に両立する単一の付け外し自由な\n" +"`yard`コマンドを持つようになった。\n" +"コマンドのリストを取得するには`yard --help`とタイプする。" + +#: ../docs/WhatsNew.md:625 +msgid "" +"If you are a plugin developer, you can create your own `yard` command by " +"first\n" +"subclassing the {YARD::CLI::Command} class and then registering this class\n" +"with the {YARD::CLI::CommandParser.commands} list. For instance:" +msgstr "" +"あなたがプラグイン開発者なら、\n" +"先に {YARD::CLI::Command} クラスをサブクラス化する事によって`yard`コマンドを\n" +"あなた自身の手によって作成できる。\n" +"その時 {YARD::CLI::CommandParser.commands} のリストを用いこのクラスを登録する。\n" +"例えば:" + +#: ../docs/WhatsNew.md:629 +msgid " YARD::CLI::CommandParser.commands[:my_command] = MyCommandClass" +msgstr " YARD::CLI::CommandParser.commands[:my_command] = MyCommandClass" + +#: ../docs/WhatsNew.md:631 +msgid "" +"The above line will enable the user to execute `yard my_command [options]`." +msgstr "" +"上の行で、ユーザーが`yard my_command [options]`を実行する事が可能となる。" + +#: ../docs/WhatsNew.md:633 +msgid "## `yard diff` command to object-diff two versions of a project (0.6.0)" +msgstr "" +"## プロジェクトの二つのバージョンをオブジェクトのdiffするコマンド、`yard " +"diff` (0.6.0)" + +#: ../docs/WhatsNew.md:635 +msgid "" +"One of the built-in commands that comes with the new `yard` executable is " +"the\n" +"ability to do object-oriented diffing across multiple versions of the same\n" +"project, either by 2 versions of a gem, or 2 working copies. Just like\n" +"regular diffing tells you which lines have been added/removed in a file,\n" +"object diffing allows you to see what classes/methods/modules have been\n" +"added/removed between versions of a codebase." +msgstr "" +"新しく実行可能な`yard`は、\n" +"gemの二つのバージョンや、2つの作業中のコピーのような、\n" +"同じプロジェクトの複数のバージョンに渡ってオブジェクト思考のdiffをする機能で、\n" +"組み込みコマンドの一つである。\n" +"普通のdiffのように、\n" +"ファイルで追加/削除された行が表示される。\n" +"diffのオブジェクトは、\n" +"コードのバージョン間で追加/削除されたクラス/メソッド/モジュールの参照を受け入れる。" + +#: ../docs/WhatsNew.md:642 +msgid "" +"For an overview of how to use `yard diff`, see [YARD Object Oriented Diffing]" +"(http://gnuu.org/2010/06/26/yard-object-oriented-diffing/)." +msgstr "For an overview of how to use `yard diff`, see [YARD Object Oriented Diffing](http://gnuu.org/2010/06/26/yard-object-oriented-diffing/)." + +#: ../docs/WhatsNew.md:644 +msgid "## `yard stats` to display statistics and undocumented objects (0.6.0)" +msgstr "" +"## 統計値を表示する`yard stats`とそれを表示しないオブジェクトが追加された " +"(0.6.0)" + +#: ../docs/WhatsNew.md:646 +msgid "YARD now outputs the following statistics when `yard stats` is run:" +msgstr "YARDは、`yard stats`が起動する時に続く統計値を出力する。(次のように)" + +#: ../docs/WhatsNew.md:648 +msgid "" +" Files: 125\n" +" Modules: 35 ( 4 undocumented)\n" +" Classes: 139 ( 29 undocumented)\n" +" Constants: 53 ( 20 undocumented)\n" +" Methods: 602 ( 70 undocumented)\n" +" 85.16% documented" +msgstr "" +" Files: 125\n" +" Modules: 35 ( 4 undocumented)\n" +" Classes: 139 ( 29 undocumented)\n" +" Constants: 53 ( 20 undocumented)\n" +" Methods: 602 ( 70 undocumented)\n" +" 85.16% documented" + +#: ../docs/WhatsNew.md:655 +msgid "" +"Note that these statistics are based on what you have set to show in your\n" +"documentation. If you use `@private` tags and/or do not display\n" +"private/protected methods in your documentation, these will not show up as\n" +"undocumented. Therefore this metric is contextual." +msgstr "" +"次の事に留意する。\n" +"これらの統計はあなたのドキュメントの中を調べられた設定が基準となる。\n" +"`@private`タグを使う場合やあなたのドキュメントのなかでprivate/protectedメソッドを\n" +"表示しない場合は、undocumentとしてこれらは表示しない。\n" +"従ってこの計測はコンテキスト次第である。" + +#: ../docs/WhatsNew.md:660 +msgid "" +"You can also specifically list all undocumented objects (and their file\n" +"locations) with the `--list-undoc` option." +msgstr "" +"あなたは`--list-undoc`オプションを用い\n" +"全ての未記載のオブジェクト(とそのファイルの場所)を明示的に記述できる。" + +#: ../docs/WhatsNew.md:663 +msgid "## Added `--asset` option to `yardoc` (0.6.0)" +msgstr "## `yardoc`に`--asset`オプションが追加された(0.6.0)" + +#: ../docs/WhatsNew.md:665 +msgid "" +"The `yardoc` command can now take the `--asset` option to copy over\n" +"files/directories (recursively) to the output path after generating\n" +"documentation. The format of the argument is \"from:to\" where from is the\n" +"source path and to is the destination. For instance, YARD uses the " +"following\n" +"syntax in the `.yardopts` file to copy over image assets from the\n" +"'docs/images' directory into the 'images' directory after generating HTML:" +msgstr "" +"`yardoc`コマンドは、\n" +"ドキュメント生成の後で出力するパスに\n" +"files/directories(再帰的に)全域をコピーするための\n" +"`--asset`オプションが追加された。\n" +"引数のフォーマットは\n" +"fromがソースパスでtoが目的になる場所、\n" +"形式は\"from:to\"となる。\n" +"例えば、HTML生成の後で、\n" +"'images'ディレクトリの中へ\n" +"'docs/images'ディレクトリからイメージの資産全部をコピーするために\n" +"`.yardopts`ファイルの中に次の構文を使う:" + +#: ../docs/WhatsNew.md:672 +msgid " --asset docs/images:images" +msgstr " --asset docs/images:images" + +#: ../docs/WhatsNew.md:674 +msgid "## New template API (0.6.0)" +msgstr "## 新しくなったテンプレートAPI (0.6.0)" + +#: ../docs/WhatsNew.md:676 +msgid "" +"The new template API allows for easier insertion of sections within an\n" +"inherited template. You should no longer need to insert by index, an\n" +"error-prone process that could break when a template is updated. Instead of:" +msgstr "" +"新たなテンプレートAPIは\n" +"継承されたテンプレートの中のセクションの簡単な挿入用に許可する。\n" +"あなたはもはやindexで挿入する必要はない、\n" +"エラー傾向は\n" +"テンプレートが更新される時に中断され処理する。\n" +"代わりに:" + +#: ../docs/WhatsNew.md:680 +msgid " sections.last.place(:my_section).before(:another_section)" +msgstr " sections.last.place(:my_section).before(:another_section)" + +#: ../docs/WhatsNew.md:682 +msgid "use:" +msgstr "use:" + +#: ../docs/WhatsNew.md:684 +msgid " sections.place(:my_section).before_any(:another_section)" +msgstr " sections.place(:my_section).before_any(:another_section)" + +#: ../docs/WhatsNew.md:686 +msgid "" +"You can see more in the {file:docs/Templates." +"md#Inserting_and_Traversing_Sections}\n" +"document." +msgstr "" +"あなたは{file:docs/Templates.md#Inserting_and_Traversing_Sections}ドキュメン" +"トで、\n" +"更に詳細を見る事が出来る。" + +#: ../docs/WhatsNew.md:689 +msgid "" +"## HTML template now adds inline Table of Contents for extra files pages " +"(0.6.0)" +msgstr "" +"## HTML テンプレートは追加のファイルのページ用に、\n" +"その内容のインラインテーブルが追加された(0.6.0)" + +#: ../docs/WhatsNew.md:691 +msgid "" +"A table of contents is now generated dynamically using JavaScript for extra\n" +"file pages (such as README's, or this document). It is generated based off " +"the\n" +"headers (h1,h2,... tags) used in the document, and can be floated to the\n" +"right or listed inline on the page." +msgstr "" +"コンテンツのテーブルは追加のファイルのページ用に、\n" +"JavaScriptによって動的に生成されるようになった(READMEやこのドキュメントのように)。\n" +"これは、ドキュメントで利用されたヘッダー(h1,h2,... tags)がのぞかれた\n" +"ベースを生成し右側に添えられるか、又は、ページ上でインラインが記述される。" + +#: ../docs/WhatsNew.md:696 +msgid "## Ad-hoc tag registration via `yardoc` CLI (`--tag`, etc.) (0.6.0)" +msgstr "## `yardoc`CLI(`--tag`, etc.)経由での臨時のタグの記録 (0.6.0)" + +#: ../docs/WhatsNew.md:698 +msgid "" +"Simple meta-data tags can now be added at the command-line and registered " +"to\n" +"display in templates in a number of pre-defined ways. For instance, to " +"create\n" +"a freeform text tag, use the following:" +msgstr "" +"単純なメタデータタグは\n" +"コマンドラインで追加され、事前に定義されたいくつか方法で\n" +"テンプレートの中で表示されるために登録されるようになった。\n" +"例えばフリーフォームテキストのタグを作成するには、次のようになる:" + +#: ../docs/WhatsNew.md:702 +msgid " --tag my_tag_name:\"My Tag Title\"" +msgstr " --tag my_tag_name:\"My Tag Title\"" + +#: ../docs/WhatsNew.md:704 +msgid "" +"You can also create a \"typed\" tag (similar to `@return`), a typed named " +"tag\n" +"(similar to `@param`) as well as various combinations. The full list of\n" +"options are listed in `yardoc --help` under the \"Tag Options\" section." +msgstr "" +"あなたは\"型\"のタグ(`@return`と同様に)も\n" +"型のタグ名(`@param`と同様に)も様々な組み合わせもを作成する事もできる。\n" +"オプションの完全なリストは\n" +"`yardoc --help`の \"Tag Options\" のセクションよりで記述される。" + +#: ../docs/WhatsNew.md:708 +msgid "" +"If you wish to create a tag to store data but do not wish to show this data\n" +"in the templates, use the `--hide-tag` option to hide it from generated " +"output:" +msgstr "" +"あなたがデータを登録するためにタグを作成することを望むが、\n" +"テンプレートの中のこのデータを一覧したくない場合、\n" +"生成された出力からそれを隠すには`--hide-tag`オプションを使う。\n" +"\n" + +#: ../docs/WhatsNew.md:711 +msgid " --hide-tag my_tag_name" +msgstr " --hide-tag my_tag_name" + +#: ../docs/WhatsNew.md:713 +msgid "## Added `--transitive-tags` to register transitive tags (0.6.0)" +msgstr "## 過渡的なタグを記録するのに、`--transitive-tags`を追加された (0.6.0)" + +#: ../docs/WhatsNew.md:715 +msgid "" +"Transitive tags are tags that apply to all descendants of a namespace " +"(class\n" +"or module) when documented on that namespace. For instance, the `@since` " +"tag\n" +"is a transitive tag. Applying `@since` to a class will automatically apply\n" +"`@since` to all methods in the class. Creating a `@since` tag directly on a\n" +"method will override the inherited value." +msgstr "" +"transitiveタグは、namespace上(クラス又はモジュール)で記述された時、\n" +"全てのnamespaceの子孫に適用するタグである。\n" +"例えば、`@since`タグはTransitiveタグである。\n" +"クラスに`@since`タグを適用すると、\n" +"クラスの中の全てのメソッドに自動的に`@since`が適用される\n" +"メソッドで直接`@since`タグを作成すると継承された値をオーバーライドする。" + +#: ../docs/WhatsNew.md:721 +msgid "" +"You can specify transitive tags on the command-line by using this option. " +"Note\n" +"that the tags must already exist (built-in or created with the `--tag` " +"option)\n" +"to be specified as transitive. If you wish to do this programmatically, see\n" +"the {YARD::Tags::Library.transitive_tags} attribute." +msgstr "" +"このオプションによって\n" +"コマンドラインのタグを過渡的に指定できる\n" +"transitiveとして指定される\n" +"タグは既に存在しなければならない。\n" +"(組み込みや`--tag`オプションによって作成された)\n" +"あなたがこのプログラムを実行したいなら、 {YARD::Tags::Library.transitive_tags} 属性を参照する。" + +#: ../docs/WhatsNew.md:726 +msgid "" +"## `yardoc` now displays RDoc-like statistics (`--no-stats` to hide) (0.6.0)" +msgstr "" +"## `yardoc`は、RDocのような統計値の表示するようになった。(`--no-stats`で隠" +"す) (0.6.0)" + +#: ../docs/WhatsNew.md:728 +msgid "" +"As seen in the `yard stats` feature overview, `yardoc` displays RDoc-like\n" +"statistics when it is run. The output is equivalent to typing `yard stats`.\n" +"To hide this output when yardoc is run, use `--no-stats`." +msgstr "" +"上記のように`yard stats`機能の概要は\n" +"`yardoc`が起動する時にRDocのように統計を表示する\n" +"出力は`yard stats`をタイプするのと同様である。\n" +"yardocが起動する時にこの出力を隠すには、\n" +"`--no-stats`を使う" + +#: ../docs/WhatsNew.md:732 +msgid "## `yri` now works on constants (0.6.0)" +msgstr "## `yri`定数の処理をできるようになった (0.6.0)" + +#: ../docs/WhatsNew.md:734 +msgid "" +"Templates have now been added for text view of constants, which displays " +"any\n" +"documentation and the constant value." +msgstr "" +"テンプレートは定数の一覧を作成するため追加されるようになった。\n" +"これは任意のドキュメントと定数を表示する。" + +#: ../docs/WhatsNew.md:737 +msgid "## Plugins are no longer auto-loaded (added `--plugin` switch) (0.6.2)" +msgstr "" +"## プラグインは自動でロードされなくなった。(`--plugin`引数で追加できる) " +"(0.6.2)" + +#: ../docs/WhatsNew.md:739 +msgid "" +"This is a backwards-incompatible change that disables plugins from " +"automatically\n" +"loading when YARD starts up. From now on, you should manually declare which\n" +"plugins your project is using by adding `--plugin PLUGINNAME` to a `." +"yardopts`\n" +"file in the root of your project. You can also re-enable autoloaded plugins\n" +"by setting `load_plugins` to true in your configuration file (`yard config " +"load_plugins true`,\n" +"see next item). You can also set `autoload_plugins` to a list of plugins\n" +"to be automatically loaded on start." +msgstr "" +"これはYARDのスタートアップする時の自動的なロードから\n" +"プラグインを無効化する非後方互換な変更である。\n" +"今後はあなたは手動で宣言しなければならない、\n" +"それはあなたのプロジェクトのプラグインが\n" +"あなたのプロジェクトのrootで`.yardopts`ファイルに\n" +"`--plugin PLUGINNAME`を追加することによって利用される。\n" +"あなたの設定ファイルの中で`load_plugins`をtrueに設定する事によって\n" +"自動でロードされるプラグインを再度有効にできる。\n" +"(`yard config load_plugins true`, 事項参照)\n" +"あなたは、起動時に自動的にロードする為にプラグインのリストに\n" +"`autoload_plugins`に設定する事も出来る。" + +#: ../docs/WhatsNew.md:747 +msgid "" +"If you are a YARD plugin author, please make sure to inform your users of " +"these\n" +"changes." +msgstr "" +"あなたがYARDプラグインの作者の場合、\n" +"これらの変更をあなたのユーザーに通知するか確認してください。" + +#: ../docs/WhatsNew.md:750 +msgid "" +"Note that `--plugin` switches passed on the commandline (not via `." +"yardopts`)\n" +"are parsed before commands are loaded, and therefore can add in new CLI " +"commands." +msgstr "" +"次のことに留意する。\n" +"コマンドライン(`.yardopts`経由ではない)で渡された--pulugin引数はコマンドがロードされる前に解析され、\n" +"その結果、新しいCLIコマンドの中で追加できる。" + +#: ../docs/WhatsNew.md:753 +msgid "" +"## Added `YARD::Config` API and `~/.yard/config` configuration file (0.6.2)" +msgstr "" +"## `YARD::Config` APIと`~/.yard/config`設定ファイルが追加された。 (0.6.2)" + +#: ../docs/WhatsNew.md:755 +msgid "" +"There is a new global configuration API that can be accessed " +"programmatically\n" +"and set via the `~/.yard/config` file. The file is encoded as a YAML file,\n" +"and looks like:" +msgstr "" +"これらは、プログラムにアクセスできる新しいグローバル設定APIとなり、\n" +"`~/.yard/config`ファイル経由で設定される。\n" +"ファイルはYAMLファイルとしてエンコードされる、次のようになる" + +#: ../docs/WhatsNew.md:767 +msgid "" +"You can also set configuration options via the command-line (see next item)." +msgstr "あなたは、コマンドライン経由で設定オプションを設定できる。(次項参照)" + +#: ../docs/WhatsNew.md:769 +msgid "## Added `yard config` command to view/edit configuration (0.6.2)" +msgstr "## 設定を一覧/編集する為に`yard config` コマンドが追加された (0.6.2)" + +#: ../docs/WhatsNew.md:771 +msgid "" +"A new `yard config` command was created to view or edit the configuration\n" +"file via the commandline." +msgstr "" +"新しい`yard config`コマンドが、\n" +"コマンドライン経由で設定ファイルを一覧・編集する為に作成された。" + +#: ../docs/WhatsNew.md:774 +msgid "" +"* To view the current configuration use `yard config --list`.\n" +"* To view a specific item use `yard config ITEMNAME`\n" +"* To modify an item value use `yard config ITEMNAME VALUE`" +msgstr "" +"* 現在の設定を一覧するには、`yard config --list`を使う\n" +"* 特定の項目(item)を一覧するには、`yard config ITEMNAME`を使う\n" +"* 項目の値を変更するには、`yard config ITEMNAME VALUE`を使う" + +#: ../docs/WhatsNew.md:778 +msgid "## Added `yard server -t` template path switch (0.6.2)" +msgstr "## `yard server -t`テンプレートパス引数が追加された (0.6.2)" + +#: ../docs/WhatsNew.md:780 +msgid "" +"The `yard server` command now accepts `-t` or `--template-path` to register\n" +"a new template path for template customization." +msgstr "" +"`yard server` コマンドは、\n" +"テンプレートをカスタマイズする為に新しいテンプレートパスを記録する為、\n" +"`-t`、又は、`--template-path`を受け入れる。" + +#: ../docs/WhatsNew.md:783 +msgid "" +"## Added `YARD::Server.register_static_path` for static server assets (0.6.2)" +msgstr "" +"## 静的なサーバー資源用に`YARD::Sever.register_static_path`が追加された。 " +"(0.6.2)" + +#: ../docs/WhatsNew.md:785 +msgid "" +"The server now supports a command to register static asset paths. If you " +"are\n" +"extending the YARD::Server modules, make sure to register your asset paths\n" +"through this method." +msgstr "" +"サーバーは静的な資源のパスを記録する為のコマンドをサポートするようになっ" +"た。\n" +"あなたが、YARD::Serverモジュールを拡張する場合は、\n" +"このメソッドを通してあなたの資源のパスを記録するか確認してください。" + +#: ../docs/WhatsNew.md:789 +msgid "## YARD::Registry is now thread local (0.6.5)" +msgstr "## YARD::Registryはスレッドローカルとなった (0.6.5)" + +#: ../docs/WhatsNew.md:791 +msgid "" +"Creating a new thread will now implicitly load a new Registry that can be " +"used\n" +"to parse and process new code objects independently of the other threads. " +"Note\n" +"that this means you can no longer use the Registry across threads; you must\n" +"either access the threadlocal object directly, or synchronize threads to do\n" +"the processing in the initial registry's thread." +msgstr "" +"新しいスレッドの作成は暗黙の内に、\n" +"解析する為に利用できる新しいレジストリーをロードするだろう。\n" +"そして、他のスレッドとは独自に新しいコードオブジェクトを処理する。\n" +"次の事に留意する。\n" +"これはあなたがもう、スレッドを渡ってレジストリーを利用する必要はないことを意味する。\n" +"あなたは、スレッドのローカルオブジェクトに直接アクセスするか、又は、\n" +"スレッドのレジストリーの初期化の処理をする為にスレッドを同期しなければならない。" + +#: ../docs/WhatsNew.md:797 +msgid "## Support for ripper gem in Ruby 1.8.7 (0.6.5)" +msgstr "## Ruby 1.8.7 でのripper gemのサポート (0.6.5)" + +#: ../docs/WhatsNew.md:799 +msgid "" +"YARD now supports the Ruby 1.8.7 port of the `ripper` gem to improve " +"parsing\n" +"of source, both in terms of performance and functionality. When the " +"`ripper`\n" +"gem is available, YARD will use the \"new-style\" handlers. You can take " +"advantage\n" +"of this functionality by performing a `gem install ripper`." +msgstr "" +"パフォーマンスと機能性の両面で、\n" +"YARDはソースの解析を向上する為に`ripper`gemのRuby1.8.7の一部をサポートするよ" +"うになった。\n" +"`ripper`gemが実行可能な時、YARDは\"new-style\"のハンドラーを利用する。\n" +"`gem install ripper`を実行する事で、この機能の恩恵を受ける事ができる。" + +#: ../docs/WhatsNew.md:805 +msgid "" +"What's New in 0.5.x?\n" +"====================" +msgstr "" +"What's New in 0.5.x?\n" +"====================" + +#: ../docs/WhatsNew.md:808 +msgid "" +"1. **Support for documenting native Ruby C code** (0.5.0)\n" +"2. **Incremental parsing and output generation with `yardoc -c`** (0.5.0, " +"0.5.3)\n" +"2. **Improved `yri` support to perform lookups on installed Gems** (0.5.0)\n" +"3. **Added `yardoc --default-return` and `yardoc --hide-void-return`** " +"(0.5.0)\n" +"4. **Multiple syntax highlighting language support** (0.5.0)\n" +"5. **New .yardoc format** (0.5.0)\n" +"6. **Support for yard-doc-* gem packages as hosted .yardoc dbs** (0.5.1)\n" +"7. **Support for extra search paths in `yri`** (0.5.1)\n" +"8. **Generating HTML docs now adds frames view** (0.5.3)\n" +"9. **Tree view for class list** (0.5.3)\n" +"10. **Ability to specify markup format of extra files** (0.5.3)\n" +"11. **Keyboard shortcuts for default HTML template** (0.5.4)" +msgstr "" +"1. **RubyとCのコードのドキュメント化をサポートする** (0.5.0)\n" +"2. **`yaradoc -c`を用いたインクリメンタルな解析と出力生成ができるようになった" +"** (0.5.0, 0.5.3)\n" +"3. **`yardoc --default-return`と`yardoc --hide-void-return`が追加された** " +"(0.5.0)\n" +"4. **複数の構文のハイライトする言語をサポート** (0.5.0)\n" +"5. **新しい.yardocフォーマット** (0.5.0)\n" +"6. **ホストされた.yardoc dbsとしてyard-doc-* gem パッケージをサポートする** " +"(0.5.1)\n" +"7. **`yri`で追加の検索パスをサポートする** (0.5.1)\n" +"8. **HTMLドキュメントの生成はフレーム一覧が追加されるようになった** (0.5.3)\n" +"9. **クラスリスト用のツリービュー** (0.5.3)\n" +"10. **追加のファイルのマークアップフォーマットを指定する機能** (0.5.3)\n" +"11. **デフォルトのHTMLテンプレート用のキーボードショートカット** (0.5.4)" + +#: ../docs/WhatsNew.md:821 +msgid "" +"Support for documenting native Ruby C code (0.5.0)\n" +"--------------------------------------------------" +msgstr "" +"RubyとCのコードのドキュメント生成のサポート (0.5.0)\n" +"--------------------------------------------------" + +#: ../docs/WhatsNew.md:824 +msgid "" +"It is now possible to document native Ruby extensions with YARD with a new\n" +"C parser mostly borrowed from RDoc. This enables the ability to document\n" +"Ruby's core and stdlibs which will be hosted on http://yardoc.org/docs. In\n" +"addition, the .yardoc dump for the Ruby-core classes will become available\n" +"as an installable gem for yri support (see #3)." +msgstr "" +"大部分をRDocから取り入れた新しいCパーサーと共にYARDを用い\n" +"Rubyの拡張ドキュメントを実行可能になった。\n" +"これは、Rubyのコアと標準ライブラリを記述する事を可能にする。\n" +"そして、http://yardoc.org/docs でホスト(アクセスできる)されるだろう。\n" +"さらに、Rubyコアクラス用の.yardocのダンプは、\n" +"yriのサポートに用いるインストール可能なgemとして利用可能になるだろう。(#3 参" +"照)" + +#: ../docs/WhatsNew.md:830 +msgid "" +"Incremental parsing and output generation with `yardoc -c` (0.5.0, 0.5.3)\n" +"-------------------------------------------------------------------------" +msgstr "" +"`yaradoc -c`を用いたインクリメンタルな解析と出力生成 (0.5.0, 0.5.3)\n" +"-------------------------------------------------------------------------" + +#: ../docs/WhatsNew.md:833 +msgid "" +"

    Note: in 0.5.3 and above you must use --incremental\n" +" to incrementally generate HTML, otherwise only parsing will be done\n" +" incrementally but HTML will be generated with all objects. --" +"incremental\n" +" implies -c, so no need to specify them both.

    " +msgstr "" +"

    Note: in 0.5.3 and above you must use --incremental\n" +" to incrementally generate HTML, otherwise only parsing will be done\n" +" incrementally but HTML will be generated with all objects. --incremental\n" +" implies -c, so no need to specify them both.

    " + +#: ../docs/WhatsNew.md:838 +msgid "" +"YARD now compares file checksums before parsing when using `yardoc -c`\n" +"(aka `yardoc --use-cache`) to do incremental parsing of only the files that\n" +"have changed. HTML (or other output format) generation will also only be\n" +"done on the objects that were parsed from changed files (\\*). This makes " +"doing\n" +"a documentation development cycle much faster for quick HTML previews. Just\n" +"remember that when using incremental output generation, the index will not\n" +"be rebuilt and inter-file links might not hook up right, so it is best to\n" +"perform a full rebuild at the end of such previews." +msgstr "" +"YARDはインクリメンタルに変更されたファイルだけ解析をする為に、\n" +"`yardoc -c`(別名 `yardoc --use-cache`)を使う時、解析前のファイルを比較す" +"る。\n" +"HTML(又は、他の出力フォーマット)生成は、\n" +"変更されたファイル(\\*)から解析されるオブジェクト上で実行されるだけである。\n" +"これにより迅速なHTMLプレビューの為に、より速い開発サイクルを作りあげる事がで" +"きる。\n" +"ただインクリメンタルな出力生成によって覚えておいてほしいことは、\n" +"インデックスが再構築されない事とファイル間のリンクが正しく接続されないかもし" +"れない、\n" +"なので、このようなプレビューの終了時に完全な再構築を実行することをお勧めしま" +"す。" + +#: ../docs/WhatsNew.md:847 +msgid "" +"(\\*) Only for versions prior to 0.5.3. For 0.5.3+, use `--incremental` for\n" +"incremental HTML output." +msgstr "" +"(\\*) 0.5.3より前のバージョンのみ、0.5.3以上の場合は、\n" +"インクリメンタルHTML出力用の`--incremental`を使う。" + +#: ../docs/WhatsNew.md:850 +msgid "" +"Improved `yri` support to perform lookups on installed Gems (0.5.0)\n" +"-------------------------------------------------------------------" +msgstr "" +"インストールされたgemを検索する為の`yri`のサポートが改良された。(0.5.0)\n" +"-------------------------------------------------------------------" + +#: ../docs/WhatsNew.md:853 +msgid "" +"The `yri` executable can now perform lookups on gems that have been parsed\n" +"by yard. Therefore, to use this command you must first parse all gems with\n" +"YARD. To parse all gems, use the following command:" +msgstr "" +"実行可能な`yri`コマンドは、YARDで解析されていたgemの検索を実行できるように" +"なった。\n" +"したがって、このコマンドを使う為には、\n" +"あなたは、最初に全てのgemをYARDで解析しなければならない。\n" +"全てのgemを解析する為には、次のコマンドを利用する:" + +#: ../docs/WhatsNew.md:857 +msgid " $ sudo yardoc --build-gems" +msgstr " $ sudo yardoc --build-gems" + +#: ../docs/WhatsNew.md:859 +msgid "" +"The above command builds a .yardoc file for all installed gems in the\n" +"respective gem directory. If you do not have write access to the gem path,\n" +"YARD will write the yardoc file to `~/.yard/gem_index/NAME-VERSION.yardoc`." +msgstr "" +"上のコマンドは、gemディレクトリに関係する全てのインストール済みのgem用に." +"yardocファイルをビルドする。\n" +"あなたが、gemのパスへのアクセスを書き込んでいない場合、\n" +"YARDは`~/.yard/gem_index/NAME-VERSION.yardoc`にyardocファイルを書き込むだろ" +"う。" + +#: ../docs/WhatsNew.md:863 +msgid "" +"Note: you can also use `--re-build-gems` to force re-parsing of all gems." +msgstr "" +"注意:あなたは、全てのgemめ強制的に再解析するのに、`--re-build-gems`を使うこと" +"もできる。" + +#: ../docs/WhatsNew.md:865 +msgid "You can now do lookups with yri:" +msgstr "あなたは、下のようにyriで検索できるようになった" + +#: ../docs/WhatsNew.md:867 +msgid " $ yri JSON" +msgstr " $ yri JSON" + +#: ../docs/WhatsNew.md:869 +msgid "" +"All lookups are cached to `~/.yard/yri_cache` for quicker lookups the " +"second\n" +"time onward." +msgstr "" +"全ての検索は、2度目の検索をより早くする為に、\n" +"`~/.yard/yri_cache`にキャッシュされる。" + +#: ../docs/WhatsNew.md:872 +msgid "" +"Added `yardoc --default-return` and `yardoc --hide-void-return` (0.5.0)\n" +"-----------------------------------------------------------------------" +msgstr "" +"`yardoc --default-return`と`yardoc --hide-void-return`が追加された (0.5.0)\n" +"-----------------------------------------------------------------------" + +#: ../docs/WhatsNew.md:875 +msgid "" +"YARD defaults to displaying (Object) as the default return type of any\n" +"method that has not declared a @return tag. To customize the default\n" +"return type, you can specify:" +msgstr "" +"YARDは@returnタグで宣言されなかった、\n" +"任意のデフォルトのメソッドの型を返し表示する事をデフォルトにする。\n" +"デフォルトの返す型をカスタマイズするには、以下のように指定する:" + +#: ../docs/WhatsNew.md:879 +msgid " $ yardoc --default-return 'MyDefaultType'" +msgstr " $ yardoc --default-return 'MyDefaultType'" + +#: ../docs/WhatsNew.md:881 +msgid "You can also use the empty string to list no return type." +msgstr "あなたは、返す型が無いのを記述するのに、空の文字列を利用できる。" + +#: ../docs/WhatsNew.md:883 +msgid "" +"In addition, you can use --hide-void-return to ignore any method that\n" +"defines itself as a void type by: `@return [void]`" +msgstr "" +"さらに、あなたは、`@return [void]`でそれ自身をvoidの型として定義する\n" +"任意のメソッドに--hide-void-returnを利用できる。" + +#: ../docs/WhatsNew.md:886 +msgid "" +"Multiple syntax highlighting language support (0.5.0)\n" +"-----------------------------------------------------" +msgstr "" +"複数の構文ハイライト用の言語サポート (0.5.0)\n" +"-----------------------------------------------------" + +#: ../docs/WhatsNew.md:889 +msgid "" +"YARD now supports the ability to specify a language type for code blocks in\n" +"docstrings. Although no actual highlighting support is added for any " +"language\n" +"but Ruby, you can add your own support by writing your own helper method:" +msgstr "" +"YARDはdocstringの中のコードブロック用に、\n" +"言語の型を指定する機能をサポートするようになった。\n" +"実際のハイライトサポートは、全ての言語に追加されているわけではないが\n" +"Rubyは、あなた自身がhelperメソッドを書くことによってサポートを追加する事ができる。" + +#: ../docs/WhatsNew.md:893 +msgid "" +" # Where LANGNAME is the language:\n" +" def html_syntax_highlight_LANGNAME(source)\n" +" # return highlighted HTML\n" +" end" +msgstr "" +" # LANGNAMEがlanguageの場所:\n" +" def html_syntax_highlight_LANGNAME(source)\n" +" # ハイライトされたHTMLを返す\n" +" end" + +#: ../docs/WhatsNew.md:898 +msgid "" +"To use this language in code blocks, prefix the block with `!!!LANGNAME`:" +msgstr "" +"コードブロックでこの言語を利用するには、次のように`!!!LANGNAME`を用い前に置" +"く。" + +#: ../docs/WhatsNew.md:900 +msgid "" +" !!!plain\n" +" !!!python\n" +" def python_code(self):\n" +" return self" +msgstr "" +" !!!plain\n" +" !!!python\n" +" def python_code(self):\n" +" return self" + +#: ../docs/WhatsNew.md:905 +msgid "" +"By the same token. you can now use `!!!plain` to ignore highlighting for\n" +"a specific code block." +msgstr "" +"同じトークンで、\n" +"あなたは特定のコードブロック用のハイライトを無視する為に`!!!plain`が利用でき" +"るようになった。" + +#: ../docs/WhatsNew.md:908 +msgid "" +"New .yardoc format (0.5.0)\n" +"--------------------------" +msgstr "" +"新しい.yardocフォーマット (0.5.0)\n" +"--------------------------" + +#: ../docs/WhatsNew.md:911 +msgid "" +"To make the above yri support possible, the .yardoc format was redesigned\n" +"to be a directory instead of a file. YARD can still load old .yardoc files,\n" +"but they will be automatically upgraded if re-saved. The new .yardoc format\n" +"does have a larger memory footprint, but this will hopefully be optimized\n" +"downward." +msgstr "" +"上のyriサポートを可能にする為に、\n" +".yardocフォーマットはファイルの代わりにディレクトリに記録される事になった。\n" +"YARDは尚、古い.yardocファイルをロードできるが、\n" +"しかし、それは、再セーブした場合、自動的に上書きされるだろう。\n" +"新しい.yaradocフォーマットは、より大きいメモリ足跡をもっているが\n" +"しかしこれは、恐らく下方修正されるだろう。" + +#: ../docs/WhatsNew.md:917 +msgid "" +"Support for yard-doc-* gem packages as hosted .yardoc dbs (0.5.1)\n" +"-----------------------------------------------------------------" +msgstr "" +".yardoc dbs でホストされたyard-doc-* gem パッケージ用のサポート\n" +"-----------------------------------------------------------------" + +#: ../docs/WhatsNew.md:920 +msgid "" +"You can now install special YARD plugin gems titled yard-doc-NAME to get\n" +"packaged a .yardoc database. This will enable yri lookups or building docs\n" +"for the gem without the code." +msgstr "" +"あなたは、パッケージされた.yardocデータベースを取得する為に\n" +"yard-doc-NAMEと名付けられた特殊なYARDプラグインのgemをインストールできるよう" +"になった。\n" +"これは、コード無しでgem用のdocstringをyriで検索、又は、ビルドを可能にするだろ" +"う。" + +#: ../docs/WhatsNew.md:924 +msgid "" +"One main use for this is the `yard-doc-core` package, which enabled yri\n" +"support for Ruby core classes (stdlib coming soon as `yard-doc-stdlib`).\n" +"To install it, simply:" +msgstr "" +"これの主なものとしては、`yard-doc-core`パッケージである。\n" +"これはRubyのコアクラス用のyriサポートを有効化する\n" +"(標準ライブラリは`yard-doc-stdlib`として近日登場予定)\n" +"簡単にインストールするには:" + +#: ../docs/WhatsNew.md:928 +msgid "" +" $ sudo gem install yard-doc-core\n" +" # now you can use:\n" +" $ yri String" +msgstr "" +" $ sudo gem install yard-doc-core\n" +" # あなたは次のコマンドを使えるようになった:\n" +" $ yri String" + +#: ../docs/WhatsNew.md:932 +msgid "" +"This will by default install the 1.9.1 core library. To install a library\n" +"for a specific version of Ruby, use the `--version` switch on gem:" +msgstr "" +"これは、1.9.1のコアライブラリをデフォルトでインストールする。\n" +"Rubyの固有のバージョンのライブラリをインストールするには、\n" +"次のように、gemで`--version`引数を利用する:" + +#: ../docs/WhatsNew.md:935 +msgid " $ sudo gem install --version '= 1.8.6' yard-doc-core" +msgstr " $ sudo gem install --version '= 1.8.6' yard-doc-core" + +#: ../docs/WhatsNew.md:937 +msgid "" +"Support for extra search paths in `yri` (0.5.1)\n" +"-----------------------------------------------" +msgstr "" +"`yri`で追加の検索パスをサポートされた (0.5.1)\n" +"-----------------------------------------------" + +#: ../docs/WhatsNew.md:940 +msgid "" +"You can now add custom paths to non-gem .yardoc files\n" +"by adding them as newline separated paths in `~/.yard/yri_search_paths`." +msgstr "" +"あなたは`~/.yard/yri_search_paths`の中に\n" +"改行に区切られたパスとして追加する事によって\n" +"gem無しの.yardocファイルに\n" +"カスタムパスを追加できるようになった。" + +#: ../docs/WhatsNew.md:943 +msgid "" +"Generating HTML docs now adds frames view (0.5.3)\n" +"-------------------------------------------------" +msgstr "" +"HTMLのdocstringを生成するとフレームの一覧が追加されるようになった (0.5.3)\n" +"-------------------------------------------------" + +#: ../docs/WhatsNew.md:946 +msgid "" +"`yardoc` will now create a `frames.html` file when generating HTML " +"documents\n" +"which allows the user to view documentation inside frames, for those users " +"who\n" +"still find frames beneficial." +msgstr "" +"`yardoc`はHTMLドキュメントを生成する時、\n" +"`frames.html`ファイルを作成できるようになった。\n" +"これは、フレームで探すのが便利だとするユーザーの為に、\n" +"フレーム内のドキュメントを一覧する為にユーザーを受け入れる。" + +#: ../docs/WhatsNew.md:950 +msgid "" +"Tree view for class list (0.5.3)\n" +"--------------------------------" +msgstr "" +"クラスリスト用のツリー 一覧 (0.5.3)\n" +"--------------------------------" + +#: ../docs/WhatsNew.md:953 +msgid "" +"The class list now displays as an expandable tree view to better organized " +"an\n" +"otherwise cluttered namespace. If you properly namespace your less " +"important\n" +"classes (like Rails timezone classes), they will not take up space in the\n" +"class list unless the user looks for them." +msgstr "" +"クラスリストは別の乱雑なnamespaceをより体型化する為に\n" +"拡張可能なツリー 一覧を表示できるようになった。\n" +"あなたが重要でないクラスをnamespaceにした場合、\n" +"(Railsのtimezome classのような)\n" +"それら(重要でないクラス)は、ユーザーが検索しなければ、\n" +"クラスリストのスペースを専有しない。" + +#: ../docs/WhatsNew.md:958 +msgid "" +"Ability to specify markup format of extra files (0.5.3)\n" +"-------------------------------------------------------" +msgstr "" +"追加のファイルのマークアップフォーマットを指定する為の機能 (0.5.3)\n" +"-------------------------------------------------------" + +#: ../docs/WhatsNew.md:961 +msgid "" +"You can now specify the markup format of an extra file (like README) at the\n" +"top of the file with a shebang-like line:" +msgstr "" +"あなたは、次のshebangのような行を用いファイルのトップで\n" +"追加のファイルの(READMEのような)固有のマークアップフォーマットを指定できるよ" +"うになった。" + +#: ../docs/WhatsNew.md:964 +msgid "" +" #!textile\n" +" contents here" +msgstr "" +" #!textile\n" +" contents here" + +#: ../docs/WhatsNew.md:967 +msgid "" +"The above file contents will be rendered with a textile markup engine\n" +"(eg. RedCloth)." +msgstr "上のファイルの内容は、textileマークアップエンジンで表示される(つまりRedCloth)。" + +#: ../docs/WhatsNew.md:970 +msgid "" +"Keyboard shortcuts for default HTML template (0.5.4)\n" +"----------------------------------------------------" +msgstr "" +"Keyboard shortcuts for default HTML template (0.5.4)\n" +"----------------------------------------------------" + +#: ../docs/WhatsNew.md:973 +msgid "" +"You can now access the \"Class List\", \"Method List\" and \"File List\" " +"with the\n" +"'c', 'm' and 'f' keyboard shortcuts in the default HTML template, allowing\n" +"for keyboard-only navigation around YARD documentation." +msgstr "" +"あなたは、\n" +"デフォルトのHTMLテンプレートで'c', 'm', 'f'のキーボードショートカットを用" +"い、\n" +"\"Class List\",\"Method List\",\"File List\"にアクセスできるようになった。\n" +"これは、YARDドキュメントの周りのキーボードだけのナビゲーションを受入れる。" + +#: ../docs/WhatsNew.md:977 +msgid "" +"API for registering custom parsers (0.5.6)\n" +"------------------------------------------" +msgstr "" +"カスタムパーサーの記録用API (0.5.6)\n" +"------------------------------------------" + +#: ../docs/WhatsNew.md:980 +msgid "" +"You can now register parsers for custom source languages by calling the\n" +"following method:" +msgstr "" +"あなたは、次のメソッドの様に呼び出される事で、\n" +"カスタムソース言語用のパーサーを記録できるようになった。" + +#: ../docs/WhatsNew.md:983 +msgid " SourceParser.register_parser_type(:java, MyJavaParser, 'java')" +msgstr " SourceParser.register_parser_type(:java, MyJavaParser, 'java')" + +#: ../docs/WhatsNew.md:985 +msgid "" +"The parser class MyJavaParser should be a subclass of {YARD::Parser::Base},\n" +"and the last argument is a set of extensions (string, array or regexp). You\n" +"can read more about registering parsers at the {YARD::Parser::SourceParser}\n" +"class documentation." +msgstr "" +"パーサークラスMyJavaParserは、{YARD::Parser::Base}のサブクラスになり、\n" +"最後の引数は、拡張のグループ(string, array or regexp)になる。\n" +"{YARD::Parser::SourceParser} クラスのドキュメントでパーサーを記録する方法につ" +"いて、\n" +"詳細を見る事が出来る。" + +#: ../docs/WhatsNew.md:991 +msgid "" +"What's New in 0.4.x?\n" +"====================" +msgstr "" +"What's New in 0.4.x?\n" +"====================" + +#: ../docs/WhatsNew.md:994 +msgid "" +"1. **New templating engine and templates**\n" +"2. **yardoc `--query` argument**\n" +"3. **Greatly expanded API documentation**\n" +"4. **New plugin support**\n" +"5. **New tags (@abstract, @private)**\n" +"6. **Default rake task is now `rake yard`**" +msgstr "" +"1. **新しいテンプレートエンジンとテンプレート**\n" +"2. **yardoc `--query` 引数**\n" +"3. **Greatly ecpanded API ドキュメント**\n" +"4. **新しいプラグインのサポート**\n" +"5. **新しいタグ(@abstract, @private)**\n" +"6. **デフォルトのrake taskは`rake yard`コマンドになった**" + +#: ../docs/WhatsNew.md:1001 +msgid "" +"New templating engine and templates\n" +"-----------------------------------" +msgstr "" +"新しいテンプレートエンジンとテンプレート\n" +"-----------------------------------" + +#: ../docs/WhatsNew.md:1004 +msgid "" +"The templates were redesigned, most notably removing the ugly frameset, " +"adding\n" +"search to the class/method lists, simplifying the layout and making things\n" +"generally prettier. You should also notice that more tags are now visible " +"in\n" +"the templates such as @todo, the new @abstract and @note tags and some " +"others\n" +"that existed but were previously omitted from the generated documentation." +msgstr "" +"テンプレートは再設計された特に汚いフレームセットを削除しなければならない、\n" +"クラス/メソッドのリストに検索を追加する。\n" +"レイアウトを簡単にしてほとんどの場合きれいに作成するようになった。\n" +"あなたがさらにタグで注意することは、\n" +"@todo,新しい@abstract,@noteタグそしていくつか存在する他のタグなどのように\n" +"テンプレートの中の可視性になった事である。\n" +"しかし既に生成されたドキュメントからは除外される。" + +#: ../docs/WhatsNew.md:1010 +msgid "" +"There is also a new templating engine (based on the tadpole templating " +"library)\n" +"to allow for much more user customization. You can read about it in\n" +"{file:docs/Templates.md}." +msgstr "" +"これは更なるユーザーのカスタマイズを受け入れる為の\n" +"新しいテンプレートエンジンでもある(tadpoleテンプレートライブラリベースの)\n" +"これらのについては{file:docs/Templates.md}の中で読む事ができる。" + +#: ../docs/WhatsNew.md:1014 +msgid "" +"yardoc `--query` argument\n" +"-------------------------" +msgstr "" +"yardoc `--query` 引数\n" +"-------------------------" + +#: ../docs/WhatsNew.md:1017 +msgid "" +"The yardoc command-line tool now supports queries to select which classes,\n" +"modules or methods to include in documentation based on their data or meta-" +"data.\n" +"For instance, you can now generate documentation for your \"public\" API " +"only by\n" +"adding \"@api public\" to each of your public API methods/classes and using\n" +"the following argument:" +msgstr "" +"yardocのコマンドラインツールは、\n" +"データやメタデータの基のドキュメントを組み込む為に、\n" +"そのクラス,モジュールやメソッドで選択するクエリーをサポートするようになっ" +"た。\n" +"例えば、あなたは、個々のpublic API メソッド/クラスに\n" +"\"@api public\"を追加するだけで、自分の\"public\"API用にドキュメントを生成で" +"きるようになった。\n" +"次の様に、引数を用いる:" + +#: ../docs/WhatsNew.md:1023 +msgid " --query '@api.text == \"public\"'" +msgstr " --query '@api.text == \"public\"'" + +#: ../docs/WhatsNew.md:1025 +msgid "More information on queries is in the {file:README.md}." +msgstr "クエリーの詳細な情報は{file:README.md}で" + +#: ../docs/WhatsNew.md:1027 +msgid "" +"Greatly expanded API documentation\n" +"----------------------------------" +msgstr "" +"非常に拡張されたAPIドキュメント\n" +"----------------------------------" + +#: ../docs/WhatsNew.md:1030 +msgid "" +"Last release focused on many how-to and architecture documents to explain\n" +"the design of YARD, but many of the actual API classes/methods were still\n" +"left undocumented. This release marks a focus on getting YARD's own " +"documentation\n" +"up to par so that it can serve as an official reference on the recommended\n" +"conventions to use when documenting code." +msgstr "" +"最後のリリースは沢山の操作手順とYARDのデザインを詳細に説明する為の\n" +"アーキテクチャドキュメントに焦点を合わせた。\n" +"しかし、実際のAPIクラス/メソッドの大部分は、いまだ記述されていない。\n" +"このリリースは、標準的なYARD独自のドキュメントの取得に焦点を当てている。\n" +"なのでこれは、コードを書く時に利用する推奨された公式のリファレンスとして提供" +"できる。" + +#: ../docs/WhatsNew.md:1036 +msgid "" +"New plugin support\n" +"------------------" +msgstr "" +"新しいプラグインサポート\n" +"------------------" + +#: ../docs/WhatsNew.md:1039 +msgid "" +"YARD now supports loading of plugins via RubyGems. Any gem named `yard-*` " +"or\n" +"`yard_*` will now be loaded when YARD starts up. Note that the '-' " +"separator\n" +"is the recommended naming scheme." +msgstr "" +"YARDは、RubyGems経由でプラグインのロードをサポートできるようになった。\n" +"`yard-*`や`yard_*`で名付けられた任意のgemは、YARDが起動する時にロードされるだ" +"ろう。\n" +"次の事に留意する。'-'区切りは、推奨された命名スキームである。" + +#: ../docs/WhatsNew.md:1043 +msgid "" +"To ignore plugins, add the gem names to `~/.yard/ignored_plugins` on " +"separate\n" +"lines (or separated by whitespace)." +msgstr "" +"プラグインを無視するには、\n" +"`~/.yard/ignored_plugins`ファイルで行区切り(又は、スペース区切りで)\n" +"でgem名を追加する。" + +#: ../docs/WhatsNew.md:1046 +msgid "" +"New tags (@abstract, @private)\n" +"------------------------------" +msgstr "" +"新しいタグ(@abstract, @private)\n" +"------------------------------" + +#: ../docs/WhatsNew.md:1049 +msgid "" +"Two new tags were added to the list of builtin meta-tags in YARD. " +"`@abstract`\n" +"marks a class/module/method as abstract while `@private` marks an object\n" +"as \"private\". The latter tag is used in situations where an object is " +"public\n" +"due to Ruby's own visibility limitations (constants, classes and modules\n" +"can never be private) but not actually part of your public API. You should\n" +"use this tag sparingly, as it is not meant to be an equivalent to RDoc's\n" +"`:nodoc:` tag. Remember, YARD recommends documenting private objects too.\n" +"This tag exists so that you can create a query (`--query !@private`) to\n" +"ignore all of these private objects in your documentation. You can also\n" +"use the new `--no-private` switch, which is a shortcut to the " +"afformentioned\n" +"query. You can read more about the new tags in the {file:docs/GettingStarted." +"md}\n" +"guide." +msgstr "" +"二つの新しいタグが、YARDの中の組み込みのメタタグのリストに追加された。\n" +"`@abstract`は、概要(abstract)として、class/module/methodをマークする。\n" +"さらに、`@private`は、\"private\"として、オブジェクトをマークする。\n" +"後者のタグは、\n" +"後のタグはオブジェクトがRuby自身の可視性の制約の為に\n" +"実際のあなたのpublic APIの一部ではないにしてもpublic相当の場所で利用される\n" +"(定数は、クラス、モジュールはプライベートにはできない)\n" +"あなたは、慎重にこのタグを利用すべきである。\n" +"RDocが`:nodoc:`タグと同様であるという意味ではない。\n" +"YARDはprivate オブジェクトの記述も推奨する事を覚えておいてほしい。\n" +"このタグは、あなたが、自分のドキュメントでこれらのprivateオブジェクトの全てを無視する為に\n" +"クエリー(`--query !@private`)を作成できるように存在する。\n" +"あなたは新しい`--no-private`引数を利用する事もできる。\n" +"これは前述のクエリーへのショートカットである。\n" +"さらに新しいタグについて知りたい場合は、 {file:docs/GettingStarted.md} のガイドで読むことができる。" + +#: ../docs/WhatsNew.md:1062 +msgid "" +"Default rake task is now `rake yard`\n" +"------------------------------------" +msgstr "" +"デフォルトのrake taskは、`rake yard`となった\n" +"------------------------------------" + +#: ../docs/WhatsNew.md:1065 +msgid "" +"Not a big change, but anyone using the default \"rake yardoc\" task should\n" +"update their scripts:" +msgstr "" +"大きな変更ではないが、誰もが使うデフォルトの\"rake yardoc\" taskは、\n" +"次のスクリプトに変更された。" + +#: ../docs/WhatsNew.md:1068 +msgid "" +"[http://github.com/lsegal/yard/commit/" +"ad38a68dd73898b06bd5d0a1912b7d815878fae0](http://github.com/lsegal/yard/" +"commit/ad38a68dd73898b06bd5d0a1912b7d815878fae0)" +msgstr "[http://github.com/lsegal/yard/commit/ad38a68dd73898b06bd5d0a1912b7d815878fae0](http://github.com/lsegal/yard/commit/ad38a68dd73898b06bd5d0a1912b7d815878fae0)" + +#: ../docs/WhatsNew.md:1071 +msgid "" +"What's New in 0.2.3.x?\n" +"======================" +msgstr "" +"What's New in 0.2.3.x?\n" +"======================" + +#: ../docs/WhatsNew.md:1074 +msgid "" +"1. **Full Ruby 1.9 support**\n" +"2. **New parser code and handler API for 1.9**\n" +"3. **A new `@overload` tag**\n" +"4. **Better documentation**\n" +"5. **Template changes and bug fixes**" +msgstr "" +"1. **完全なRuby 1.9でのサポート**\n" +"2. **1.9用の新しいパーサーのコードとハンドラーAPI**\n" +"3. **新しい `@overload` タグ**\n" +"4. **より良いドキュメント**\n" +"5. **テンプレートの変更とバグの修正**" + +#: ../docs/WhatsNew.md:1080 +msgid "" +"Full Ruby 1.9 support\n" +"---------------------" +msgstr "" +"完全なRuby1.9のサポート\n" +"---------------------" + +#: ../docs/WhatsNew.md:1083 +msgid "" +"YARD's development actually focuses primarily on 1.9 from the get-go, so it " +"is\n" +"not an afterthought. All features are first implemented for compatibility " +"with\n" +"1.9, but of course all functionality is also tested in 1.8.x. YARD 0.2.2 " +"was\n" +"mostly compatible with 1.9, but the new release improves and extends in " +"certain\n" +"areas where compatibility was lacking. The new release should be fully " +"functional\n" +"in Ruby 1.9." +msgstr "" +"YARDの開発の実際の焦点は最初から1.9上が主で、結果として1.9になった訳ではな" +"い。\n" +"全ての機能は、始めに1.9互換で実装されるが、もちろん1.8.xでもテストされてい" +"る。\n" +"YARD 0.2.2は、大部分が1.9を用い互換性があるが、\n" +"新リリースは、互換性が欠けていた所を範囲を拡張する。\n" +"新しいリリースは、Ruby 1.9で完全に機能するはずである。" + +#: ../docs/WhatsNew.md:1090 +msgid "" +"New parser code and handler API for 1.9\n" +"---------------------------------------" +msgstr "" +"1.9用の新しいパーサーコードとハンドラーAPI\n" +"---------------------------------------" + +#: ../docs/WhatsNew.md:1093 +msgid "" +"Using Ruby 1.9 also gives YARD the advantage of using the new `ripper` " +"library\n" +"which was added to stdlib. The ripper parser is Ruby's official answer to\n" +"projects like ParseTree and ruby2ruby. Ripper allows access to the AST as " +"it\n" +"is parsed by the Ruby compiler. This has some large benefits over " +"alternative\n" +"projects:" +msgstr "" +"Ruby1.9の使用で、YARDの標準ライブラリに追加された\n" +"新しい`ripper`ライブラリの利点が与えられる。\n" +"ripperパーサーは、\n" +"ParseTreeとruby2rubyのように動かす為の\n" +"Rubyの公式な回答である。\n" +"Ripperは、Rubyコンパイラによって解析されるASTとしてアクセスを受入れる。\n" +"これは、別のプロジェクトにくらべていくつかの大きな恩恵がある。" + +#: ../docs/WhatsNew.md:1099 +msgid "" +" 1. It is officially supported and maintained by the Ruby core team.\n" +" 2. The AST is generated directly from the exact same code that drives the\n" +" compiler, meaning anything that compiles is guaranteed to generate the\n" +" equivalent AST.\n" +" 3. It needs no hacks, gems or extra libs and works out of the box in 1.9.\n" +" 4. It's *fast*." +msgstr "" +" 1. 公式にRubyのコアチームによってサポートとメンテナンスされている。\n" +" 2. ASTはコンパイラを起動する同じコードから直接生成され、 \n" +" コンパイルがASTと同様に生成する為に保証されるどんなものでも意味があ" +"る。\n" +" 3. 道具を必要としない。gemや、追加のライブラリ、1.9の箱の外の仕事を\n" +" 4. 速い" + +#: ../docs/WhatsNew.md:1106 +msgid "" +"Having the AST means that developers looking to extend YARD have much " +"better\n" +"access to the parsed code than in previous versions. The only caveat is " +"that\n" +"this library is not back-compatible to 1.8.x. Because of this, there are\n" +"subtle changes to the handler extension API that developers use to extend " +"YARD.\n" +"Namely, there is now a standard API for 1.9 and a \"legacy\" API that can " +"run in\n" +"both 1.8.x and 1.9 if needed. A developer can still use the legacy API to " +"write\n" +"handlers that are compatible for both 1.8.x and 1.9 in one shot, or decide " +"to\n" +"implement the handler using both APIs. Realize that the benefit of using the " +"new\n" +"API means 1.9 users will get a 2.5x parsing speed increase over running the " +"legacy\n" +"handlers (this is *in addition to* the ~1.8x speed increase of using YARV " +"over MRI)." +msgstr "" +"ASTを持つ事は、開発者が拡張されたYARDがより多くの\n" +"(前のバージョンより解析されたコードから)アクセスを持つので探す事を意味す" +"る。\n" +"\n" +"誤解を生まないよう注意するが、\n" +"このライブラリは、1.8.xの後方互換ではない。\n" +"これは何故かというと、\n" +"開発者がYARDを拡張する為に利用する\n" +"ハンドラーの拡張APIに難解な変更があるからである。\n" +"即ち、必要なら、1.8.xと1.9両方で起動できる1.9用の標準APIと\"legacy\"APIになっ" +"た。\n" +"開発者は、1.8.xと1.9の両方のハンドラーを一回で書くのに、legacyAPIを利用でき" +"る。\n" +"又、両方のAPIによってハンドラーを実装する事を決めた。\n" +"1.9ユーザーの新しいAPIの手法を使う事によっての恩恵は、\n" +"レガシーハンドラーの起動より解析するスピードが2.5x倍増大すると理解する。\n" +"(これで、 *さらに* ~1.8xのスピードがMRIでYARVを使う事によって増大する)" + +#: ../docs/WhatsNew.md:1117 +msgid "" +"A new `@overload` tag\n" +"---------------------" +msgstr "" +"新しい`@overload`タグ\n" +"---------------------" + +#: ../docs/WhatsNew.md:1120 +msgid "" +"The new `@overload` tag enables users to document methods that take " +"multiple\n" +"parameters depending on context. This is basically equivalent to RDoc's call-" +"seq,\n" +"but with a name that is more akin to the OOP concept of method overloading\n" +"that is actually being employed. Here's an example:" +msgstr "" +"新しい`@overload`タグは、ユーザーが\n" +"文脈の中で依存する複数のパラメータを取得するメソッドを記述する事を可能にす" +"る。\n" +"これは、基本的に、RDocのcall-seqと同様であるが、\n" +"オブジェクト指向の実際に用いられるオーバーロードのメソッドの概念により類似し" +"ている。\n" +"次のような例になる:" + +#: ../docs/WhatsNew.md:1125 +msgid "" +" # @overload def to_html(html, autolink = true)\n" +" # This docstring describes the specific overload only.\n" +" # @param [String] html the HTML\n" +" # @param [Boolean] autolink whether or not to atuomatically link\n" +" # URL references\n" +" # @overload def to_html(html, opts = {})\n" +" # @param [String] html the HTML\n" +" # @param [Hash] opts any attributes to add to the root HTML node\n" +" def to_html(*args)\n" +" # split args depending on context\n" +" end" +msgstr "" +" # @overload def to_html(html, autolink = true)\n" +" # This docstring describes the specific overload only.\n" +" # @param [String] html the HTML\n" +" # @param [Boolean] autolink whether or not to atuomatically link\n" +" # URL references\n" +" # @overload def to_html(html, opts = {})\n" +" # @param [String] html the HTML\n" +" # @param [Hash] opts any attributes to add to the root HTML node\n" +" def to_html(*args)\n" +" # split args depending on context\n" +" end" + +#: ../docs/WhatsNew.md:1137 +msgid "" +"As you can see each overload takes its own nested tags (including a " +"docstring)\n" +"as if it were its own method. This allows \"virtual\" overloading behaviour " +"at\n" +"the API level to make Ruby look like overload-aware languages without " +"caring\n" +"about the implementation details required to add the behaviour." +msgstr "" +"上のオーバーロードは、それが独自のメソッドのように\n" +"入れ子になった自身のタグを取得する(docstringを含んでいる)。\n" +"これは、振舞いを追加するのに必要とされる詳細の実装について気にすることな" +"く、\n" +"Rubyをオーバーロードに考慮した言語のように構成する為に、\n" +"APIレベルで\"仮の\"オーバーロードの挙動も受入れる。" + +#: ../docs/WhatsNew.md:1142 +msgid "" +"It is still recommended practice, however, to stay away from overloading " +"when\n" +"possible and document the types of each method's real parameters. This " +"allows\n" +"toolkits making use of YARD to get accurate type information for your " +"methods,\n" +"for instance, allowing IDE autocompletion. There are, of course, situations\n" +"where overload just makes more sense." +msgstr "" +"これはまだ推奨案だが、\n" +"可能な時はオーバーロードを使わないで、実際の引数の個々のメソッドの型を記述す" +"る。\n" +"これで、貴方のメソッド用に正確な型情報を取得する為にYARDのツールキットの使用" +"が受入れられる。\n" +"例えば、IDEの自動補完をがある。\n" +"これは勿論、オーバーロードでより多くの意味を成す場合もある。" + +#: ../docs/WhatsNew.md:1148 +msgid "" +"Better documentation\n" +"--------------------" +msgstr "" +"より良いドキュメント\n" +"--------------------" + +#: ../docs/WhatsNew.md:1151 +msgid "" +"The first few iterations of YARD were very much a proof of concept. Few " +"people\n" +"were paying attention and it was really just pieced together to see what " +"was\n" +"feasible. Now that YARD is gaining interest, there are many developers that\n" +"want to take advantage of its extensibility support to do some really cool " +"stuff.\n" +"Considerable time was spent for this release documenting, at a high level, " +"what\n" +"YARD can do and how it can be done. Expect this documentation to be extended " +"and\n" +"improved in future releases." +msgstr "" +"最初のいくつかのYARDのイテレータはよくできた概念の証明である。\n" +"いくらかの人は、注意を払ったり、それが本当に可能なのか見る為に一緒に試したり" +"しただろう。\n" +"現在のYARDは関心を集めているので、\n" +"いくつかの本当にイカした拡張サポートがほしい沢山の開発者がいる。\n" +"かなりの時間、このリリースで、\n" +"YARDで何ができるのかとどのような方法が出来るのかハイレベルで記述するのに費や" +"された。\n" +"このドキュメントが拡張され、機能のリリースで改良されるよう事を期待する。" + +#: ../docs/WhatsNew.md:1159 +msgid "" +"Template changes and bug fixes\n" +"------------------------------" +msgstr "" +"テンプレートの変更とバグ修正\n" +"------------------------------" + +#: ../docs/WhatsNew.md:1162 +msgid "" +"Of course no new release would be complete without fixing the old broken " +"code.\n" +"Some tags existed but were not present in generated documentation. The " +"templates\n" +"were mostly fixed to add the major omitted tags. In addition to template " +"adjustments,\n" +"many parsing bugs were ironed out to make YARD much more stable with " +"existing projects\n" +"(Rails, HAML, Sinatra, Ramaze, etc.)." +msgstr "" +"勿論、新しいリリースで、古い壊れたコードを修正無しで仕上げられるだろう。\n" +"いくつか存在したタグが、生成されるドキュメントで存在しなくなった。\n" +"テンプレートは、メジャーだが抜かされたタグを追加する為に大部分が修正され" +"た。\n" +"テンプレートの調整に加えて、\n" +"既存のプロジェクトを用い(Rails, HAML, Sinatra, Ramaze, etc.)より安定したYARD" +"を作る為に、\n" +"多くの解析のバグは無視された。" + +# YARD::ROOT +#: ../lib/yard.rb:5 +msgid "The root path for YARD source libraries" +msgstr "YARDソースライブラリ用のルートパス" + +# YARD::TEMPLATE_ROOT +#: ../lib/yard.rb:8 +msgid "The root path for YARD builtin templates" +msgstr "YARDビルトインテンプレート用のルートパス" + +# @deprecated +#: ../lib/yard.rb:11 +msgid "Use {Config::CONFIG_DIR}" +msgstr "Use {Config::CONFIG_DIR}" + +# YARD.parse +# YARD.parse_string +#: ../lib/yard.rb:14 ../lib/yard.rb:21 +msgid "An alias to {Parser::SourceParser}'s parsing method" +msgstr "解析用の{Parser::SourceParser}メソッドへのエイリアス" + +# @example Parse a glob of files +#: ../lib/yard.rb:18 +msgid "YARD.parse('lib/**/*.rb')" +msgstr "YARD.parse('lib/**/*.rb')" + +# @example +#: ../lib/yard.rb:18 +msgid "tag|example|Parse a glob of files" +msgstr "ファイルのglobを解析する。" + +# @see +#: ../lib/yard.rb:18 +msgid "tag|see|Parser::SourceParser.parse" +msgstr "tag|see|Parser::SourceParser.parse" + +# @example Parse a string of input +#: ../lib/yard.rb:25 +msgid "YARD.parse_string('class Foo; end')" +msgstr "YARD.parse_string('class Foo; end')" + +# @example +#: ../lib/yard.rb:25 +msgid "tag|example|Parse a string of input" +msgstr "tag|example|入力の文字列を解析する" + +# @see +#: ../lib/yard.rb:25 +msgid "tag|see|Parser::SourceParser.parse_string" +msgstr "tag|see|Parser::SourceParser.parse_string" + +# YARD.load_plugins +# YARD::Config.load_plugins +#: ../lib/yard.rb:30 ../lib/yard/config.rb:139 +msgid "" +"Loads gems that match the name 'yard-*' (recommended) or 'yard_*' except\n" +"those listed in +~/.yard/ignored_plugins+. This is called immediately\n" +"after YARD is loaded to allow plugin support." +msgstr "" +"'yard-*'(推奨される)や'yard_*'の名前にマッチするgemをロードする。\n" +"これを除外するには、 +~/.yard/ignored_plugins+ の中に対象の名前を記述する。\n" +"これは、YARDがプラグインサポートをロードした後すぐに呼び出される。" + +# YARD::CLI +#: ../lib/yard/autoload.rb:6 ../lib/yard/cli/command.rb:6 +#: ../lib/yard/cli/command_parser.rb:6 ../lib/yard/cli/config.rb:6 +#: ../lib/yard/cli/diff.rb:6 ../lib/yard/cli/gems.rb:6 +#: ../lib/yard/cli/graph.rb:6 ../lib/yard/cli/help.rb:6 +#: ../lib/yard/cli/i18n.rb:6 ../lib/yard/cli/list.rb:6 +#: ../lib/yard/cli/server.rb:6 ../lib/yard/cli/stats.rb:6 +#: ../lib/yard/cli/yardoc.rb:6 ../lib/yard/cli/yri.rb:6 +msgid "Namespace for command-line interface components" +msgstr "コマンドラインインタフェースコンポーネント用のNamespace" + +# YARD::CodeObjects +#: ../lib/yard/autoload.rb:22 ../lib/yard/code_objects/base.rb:22 +#: ../lib/yard/code_objects/class_object.rb:22 +#: ../lib/yard/code_objects/class_variable_object.rb:22 +#: ../lib/yard/code_objects/constant_object.rb:22 +#: ../lib/yard/code_objects/extended_method_object.rb:22 +#: ../lib/yard/code_objects/extra_file_object.rb:22 +#: ../lib/yard/code_objects/macro_object.rb:22 +#: ../lib/yard/code_objects/method_object.rb:22 +#: ../lib/yard/code_objects/module_object.rb:22 +#: ../lib/yard/code_objects/namespace_object.rb:22 +#: ../lib/yard/code_objects/proxy.rb:22 +#: ../lib/yard/code_objects/root_object.rb:22 +msgid "" +"A \"code object\" is defined as any entity in the Ruby language.\n" +"Classes, modules, methods, class variables and constants are the\n" +"major objects, but DSL languages can create their own by inheriting\n" +"from {CodeObjects::Base}." +msgstr "" +"\"code object\"は、Ruby言語の中の任意の構成要素が定義される。\n" +"クラスや、モジュール、メソッド、クラス変数、定数は重要なオブジェクトとな" +"る。\\n\n" +"そして、DSL言語は、{CodeObjects::Base}からの継承によって\n" +"DSL言語自身を作成できる。" + +# YARD::Handlers +#: ../lib/yard/autoload.rb:58 ../lib/yard/handlers/base.rb:58 +#: ../lib/yard/handlers/c/base.rb:58 +#: ../lib/yard/handlers/c/handler_methods.rb:58 +#: ../lib/yard/handlers/processor.rb:58 ../lib/yard/handlers/ruby/base.rb:58 +#: ../lib/yard/handlers/ruby/dsl_handler.rb:58 +#: ../lib/yard/handlers/ruby/dsl_handler_methods.rb:58 +#: ../lib/yard/handlers/ruby/legacy/base.rb:58 +#: ../lib/yard/handlers/ruby/legacy/dsl_handler.rb:58 +msgid "" +"Handlers are called during the data processing part of YARD's\n" +"parsing phase. This allows YARD as well as any custom extension to\n" +"analyze source and generate {CodeObjects} to be stored for later use." +msgstr "" +"ハンドラーは、YARDの解析段階でデータの処理の間に呼び出される。\n" +"これは、ソースの解析や後で使う為に記録される{CodeObjects}を生成する為に\n" +"YARD本体も任意のカスタム拡張も受け入れる。" + +# YARD::Handlers::Ruby +#: ../lib/yard/autoload.rb:62 ../lib/yard/handlers/c/base.rb:62 +#: ../lib/yard/handlers/c/handler_methods.rb:62 +msgid "CRuby Handlers" +msgstr "CRuby ハンドラー" + +# YARD::Handlers::Ruby +#: ../lib/yard/autoload.rb:82 ../lib/yard/handlers/ruby/base.rb:82 +#: ../lib/yard/handlers/ruby/dsl_handler.rb:82 +#: ../lib/yard/handlers/ruby/dsl_handler_methods.rb:82 +#: ../lib/yard/handlers/ruby/legacy/dsl_handler.rb:82 +msgid "All Ruby handlers" +msgstr "全てのRubyハンドラー" + +# YARD::Handlers::Ruby::Legacy +#: ../lib/yard/autoload.rb:83 ../lib/yard/handlers/ruby/legacy/base.rb:83 +#: ../lib/yard/handlers/ruby/legacy/dsl_handler.rb:83 +msgid "Handlers for old Ruby 1.8 parser" +msgstr "古いRuby1.8パーサー用のハンドラー" + +# YARD::Templates +#: ../lib/yard/autoload.rb:134 ../lib/yard/i18n/locale.rb:134 +#: ../lib/yard/i18n/message.rb:134 ../lib/yard/i18n/messages.rb:134 +#: ../lib/yard/i18n/pot_generator.rb:134 ../lib/yard/i18n/text.rb:134 +msgid "Namespace for internationalization (i18n)" +msgstr "国際化用のNamespace (i18n)" + +# YARD::Parser +#: ../lib/yard/autoload.rb:144 ../lib/yard/parser/base.rb:144 +#: ../lib/yard/parser/c/c_parser.rb:144 +#: ../lib/yard/parser/c/comment_parser.rb:144 +#: ../lib/yard/parser/c/statement.rb:144 +#: ../lib/yard/parser/ruby/ast_node.rb:144 +#: ../lib/yard/parser/ruby/legacy/ruby_parser.rb:144 +#: ../lib/yard/parser/ruby/ruby_parser.rb:144 +#: ../lib/yard/parser/source_parser.rb:144 +msgid "" +"The parser namespace holds all parsing engines used by YARD.\n" +"Currently only Ruby and C (Ruby) parsers are implemented." +msgstr "" +"ParserのnamespaceはYARDによって利用される全てのパーサーエンジンをサポートす" +"る。\n" +"今の所、RubyとC(Ruby)パーサーだけ実装されている。" + +# YARD::Parser::Ruby +#: ../lib/yard/autoload.rb:147 ../lib/yard/parser/c/c_parser.rb:147 +#: ../lib/yard/parser/c/comment_parser.rb:147 +#: ../lib/yard/parser/c/statement.rb:147 +msgid "CRuby Parsing components" +msgstr "CRubyのパーサーの構成" + +# YARD::Parser::Ruby +#: ../lib/yard/autoload.rb:156 ../lib/yard/parser/ruby/ast_node.rb:156 +#: ../lib/yard/parser/ruby/legacy/ruby_parser.rb:156 +#: ../lib/yard/parser/ruby/ruby_parser.rb:156 +msgid "Ruby parsing components." +msgstr "Rubyのパーサーの構成" + +# YARD::Parser::Ruby::Legacy +#: ../lib/yard/autoload.rb:157 ../lib/yard/parser/ruby/legacy/ruby_lex.rb:157 +#: ../lib/yard/parser/ruby/legacy/ruby_parser.rb:157 +#: ../lib/yard/parser/ruby/legacy/statement.rb:157 +#: ../lib/yard/parser/ruby/legacy/statement_list.rb:157 +#: ../lib/yard/parser/ruby/legacy/token_list.rb:157 +msgid "Handles Ruby parsing in Ruby 1.8." +msgstr "Ruby1.8で利用されるパーサー処理" + +# YARD::Rake +#: ../lib/yard/autoload.rb:176 ../lib/yard/rake/yardoc_task.rb:176 +msgid "Holds Rake tasks used by YARD" +msgstr "YARDによって利用されるRake taskを持つ" + +# YARD::Serializers +#: ../lib/yard/autoload.rb:180 ../lib/yard/serializers/base.rb:180 +#: ../lib/yard/serializers/file_system_serializer.rb:180 +#: ../lib/yard/serializers/process_serializer.rb:180 +#: ../lib/yard/serializers/stdout_serializer.rb:180 +#: ../lib/yard/serializers/yardoc_serializer.rb:180 +msgid "Namespace for components that serialize to various endpoints" +msgstr "様々な出力でシリアライズする構成用のNamespace" + +# YARD::Server +#: ../lib/yard/autoload.rb:188 ../lib/yard/server.rb:188 +#: ../lib/yard/server/adapter.rb:188 ../lib/yard/server/commands/base.rb:188 +#: ../lib/yard/server/commands/display_file_command.rb:188 +#: ../lib/yard/server/commands/display_object_command.rb:188 +#: ../lib/yard/server/commands/frames_command.rb:188 +#: ../lib/yard/server/commands/library_command.rb:188 +#: ../lib/yard/server/commands/library_index_command.rb:188 +#: ../lib/yard/server/commands/list_command.rb:188 +#: ../lib/yard/server/commands/search_command.rb:188 +#: ../lib/yard/server/commands/static_file_command.rb:188 +#: ../lib/yard/server/doc_server_helper.rb:188 +#: ../lib/yard/server/doc_server_serializer.rb:188 +#: ../lib/yard/server/library_version.rb:188 +#: ../lib/yard/server/rack_adapter.rb:188 ../lib/yard/server/router.rb:188 +#: ../lib/yard/server/static_caching.rb:188 +#: ../lib/yard/server/webrick_adapter.rb:188 +msgid "" +"Namespace for classes and modules that handle serving documentation over HTTP" +msgstr "HTTP経由でドキュメント作成の提供するクラスやモジュールの為のNamespace" + +# YARD::Server +#: ../lib/yard/autoload.rb:190 ../lib/yard/server.rb:190 +#: ../lib/yard/server/adapter.rb:190 ../lib/yard/server/commands/base.rb:190 +#: ../lib/yard/server/commands/display_file_command.rb:190 +#: ../lib/yard/server/commands/display_object_command.rb:190 +#: ../lib/yard/server/commands/frames_command.rb:190 +#: ../lib/yard/server/commands/library_command.rb:190 +#: ../lib/yard/server/commands/library_index_command.rb:190 +#: ../lib/yard/server/commands/list_command.rb:190 +#: ../lib/yard/server/commands/search_command.rb:190 +#: ../lib/yard/server/commands/static_file_command.rb:190 +#: ../lib/yard/server/doc_server_helper.rb:190 +#: ../lib/yard/server/doc_server_serializer.rb:190 +#: ../lib/yard/server/library_version.rb:190 +#: ../lib/yard/server/rack_adapter.rb:190 ../lib/yard/server/router.rb:190 +#: ../lib/yard/server/static_caching.rb:190 +#: ../lib/yard/server/webrick_adapter.rb:190 +msgid "" +"== Implementing a Custom Server\n" +"To customize the YARD server, see the {Adapter} and {Router} classes." +msgstr "" +"== カスタムサーバーの実装\n" +"YARDサーバーをカスタマイズするには、{Adapter}や{Router}クラス参照。" + +# YARD::Server +#: ../lib/yard/autoload.rb:193 ../lib/yard/server.rb:193 +#: ../lib/yard/server/adapter.rb:193 ../lib/yard/server/commands/base.rb:193 +#: ../lib/yard/server/commands/display_file_command.rb:193 +#: ../lib/yard/server/commands/display_object_command.rb:193 +#: ../lib/yard/server/commands/frames_command.rb:193 +#: ../lib/yard/server/commands/library_command.rb:193 +#: ../lib/yard/server/commands/library_index_command.rb:193 +#: ../lib/yard/server/commands/list_command.rb:193 +#: ../lib/yard/server/commands/search_command.rb:193 +#: ../lib/yard/server/commands/static_file_command.rb:193 +#: ../lib/yard/server/doc_server_helper.rb:193 +#: ../lib/yard/server/doc_server_serializer.rb:193 +#: ../lib/yard/server/library_version.rb:193 +#: ../lib/yard/server/rack_adapter.rb:193 ../lib/yard/server/router.rb:193 +#: ../lib/yard/server/static_caching.rb:193 +#: ../lib/yard/server/webrick_adapter.rb:193 +msgid "" +"== Rack Middleware\n" +"If you want to use the YARD server as a Rack middleware, see the " +"documentation\n" +"in {RackMiddleware}." +msgstr "" +"== Rack Middleware\n" +"あなたがRack MiddlewareのようにYARDサーバーを使いたい場合、\n" +"{RackMiddleware}ドキュメントを参照。" + +# YARD::Server::Commands +#: ../lib/yard/autoload.rb:201 ../lib/yard/server/commands/base.rb:201 +#: ../lib/yard/server/commands/display_file_command.rb:201 +#: ../lib/yard/server/commands/display_object_command.rb:201 +#: ../lib/yard/server/commands/frames_command.rb:201 +#: ../lib/yard/server/commands/library_command.rb:201 +#: ../lib/yard/server/commands/library_index_command.rb:201 +#: ../lib/yard/server/commands/list_command.rb:201 +#: ../lib/yard/server/commands/search_command.rb:201 +#: ../lib/yard/server/commands/static_file_command.rb:201 +msgid "" +"Commands implement specific kinds of server responses which are routed\n" +"to by the {Router} class. To implement a custom command, subclass {Commands::" +"Base}." +msgstr "" +"コマンドは特定のサーバーの応答のような実装。\n" +"そして、{Router}クラスによって送られる。\n" +"カスタムコマンドを実装する為には、{Commands::Base}サブクラス参照。" + +# YARD::Tags +#: ../lib/yard/autoload.rb:229 ../lib/yard/tags/default_factory.rb:229 +#: ../lib/yard/tags/default_tag.rb:229 ../lib/yard/tags/directives.rb:229 +#: ../lib/yard/tags/library.rb:229 ../lib/yard/tags/option_tag.rb:229 +#: ../lib/yard/tags/overload_tag.rb:229 ../lib/yard/tags/ref_tag.rb:229 +#: ../lib/yard/tags/ref_tag_list.rb:229 ../lib/yard/tags/tag.rb:229 +#: ../lib/yard/tags/tag_format_error.rb:229 +msgid "Namespace for Tag components" +msgstr "タグの構成の為のNamespace" + +# YARD::Templates +#: ../lib/yard/autoload.rb:249 ../lib/yard/templates/engine.rb:249 +#: ../lib/yard/templates/erb_cache.rb:249 +#: ../lib/yard/templates/helpers/html_syntax_highlight_helper.rb:249 +#: ../lib/yard/templates/helpers/markup/rdoc_markup.rb:249 +#: ../lib/yard/templates/helpers/module_helper.rb:249 +#: ../lib/yard/templates/helpers/text_helper.rb:249 +#: ../lib/yard/templates/section.rb:249 ../lib/yard/templates/template.rb:249 +#: ../lib/yard/templates/template_options.rb:249 +msgid "Namespace for templating system" +msgstr "テンプレートシステム用のNamespace" + +# YARD::Templates::Helpers +#: ../lib/yard/autoload.rb:251 +#: ../lib/yard/templates/helpers/base_helper.rb:251 +#: ../lib/yard/templates/helpers/filter_helper.rb:251 +#: ../lib/yard/templates/helpers/html_helper.rb:251 +#: ../lib/yard/templates/helpers/html_syntax_highlight_helper.rb:251 +#: ../lib/yard/templates/helpers/markup/rdoc_markup.rb:251 +#: ../lib/yard/templates/helpers/markup_helper.rb:251 +#: ../lib/yard/templates/helpers/method_helper.rb:251 +#: ../lib/yard/templates/helpers/module_helper.rb:251 +#: ../lib/yard/templates/helpers/text_helper.rb:251 +#: ../lib/yard/templates/helpers/uml_helper.rb:251 +msgid "Namespace for template helpers" +msgstr "テンプレートへルパー用のNamespace" + +# YARD::Templates::Helpers::Markup +#: ../lib/yard/autoload.rb:252 +#: ../lib/yard/templates/helpers/markup/rdoc_markup.rb:252 +msgid "Namespace for markup providers" +msgstr "マークアップを提供する為のNamespace" + +# YARD::CLI::Command +#: ../lib/yard/cli/command.rb:6 +msgid "" +"Abstract base class for CLI utilities. Provides some helper methods for\n" +"the option parser" +msgstr "" +"CLIユーティリティ用の抽象的なベースクラス。\n" +"オプションパーサー用のいくつかのヘルパーメソッドを提供する。" + +# YARD::CLI::YRI.run +# YARD::CLI::Command.run +#: ../lib/yard/cli/command.rb:12 ../lib/yard/cli/yri.rb:27 +msgid "Helper method to run the utility on an instance." +msgstr "インスタンス上のユーティリティを起動する為のヘルパーメソッド。" + +# @see +#: ../lib/yard/cli/command.rb:13 ../lib/yard/cli/yri.rb:28 +#: ../lib/yard/server/commands/base.rb:33 +msgid "tag|see|#run" +msgstr "tag|see|#run" + +# YARD::CLI::Command#common_options +#: ../lib/yard/cli/command.rb:20 +msgid "Adds a set of common options to the tail of the OptionParser" +msgstr "OptionParserの末尾に一般的なオプションのグループを追加する。" + +# @param [Hash] +# @param [OptionParser] +# @param [Hash{String => String}] +# @param [Hash, nil] +#: ../lib/yard/cli/command.rb:23 ../lib/yard/cli/command.rb:54 +#: ../lib/yard/code_objects/class_object.rb:63 +#: ../lib/yard/code_objects/class_object.rb:98 +#: ../lib/yard/code_objects/namespace_object.rb:113 +#: ../lib/yard/code_objects/namespace_object.rb:144 +#: ../lib/yard/code_objects/namespace_object.rb:164 +#: ../lib/yard/handlers/base.rb:355 +#: ../lib/yard/handlers/ruby/legacy/base.rb:34 ../lib/yard/options.rb:108 +#: ../lib/yard/options.rb:122 ../lib/yard/parser/ruby/ast_node.rb:152 +#: ../lib/yard/serializers/base.rb:27 +#: ../lib/yard/serializers/file_system_serializer.rb:27 +#: ../lib/yard/server/adapter.rb:71 ../lib/yard/server/commands/base.rb:74 +#: ../lib/yard/server/rack_adapter.rb:26 +#: ../lib/yard/templates/helpers/html_helper.rb:536 +#: ../lib/yard/templates/template.rb:230 ../lib/yard/templates/template.rb:256 +msgid "tag|param|opts" +msgstr "tag|param|opts" + +# @param [OptionParser] opts +#: ../lib/yard/cli/command.rb:23 ../lib/yard/cli/command.rb:54 +msgid "the option parser object" +msgstr "パーサーオブジェクトのオプション" + +# YARD::CLI::Command#parse_options +#: ../lib/yard/cli/command.rb:49 +msgid "Parses the option and gracefully handles invalid switches" +msgstr "オプションを解析し、無効な引数を処理する。" + +# @since +#: ../lib/yard/cli/command.rb:54 ../lib/yard/cli/diff.rb:201 +#: ../lib/yard/cli/gems.rb:59 ../lib/yard/cli/graph.rb:66 +#: ../lib/yard/cli/help.rb:8 ../lib/yard/cli/server.rb:109 +#: ../lib/yard/cli/stats.rb:179 ../lib/yard/cli/yardoc.rb:193 +#: ../lib/yard/cli/yardoc.rb:197 ../lib/yard/cli/yardoc.rb:201 +#: ../lib/yard/cli/yardoc.rb:388 ../lib/yard/cli/yardoc.rb:498 +#: ../lib/yard/cli/yardoc.rb:742 ../lib/yard/cli/yri.rb:24 +#: ../lib/yard/code_objects/base.rb:149 +#: ../lib/yard/code_objects/method_object.rb:132 +#: ../lib/yard/code_objects/namespace_object.rb:12 +#: ../lib/yard/core_ext/insertion.rb:30 ../lib/yard/core_ext/insertion.rb:34 +#: ../lib/yard/handlers/processor.rb:24 ../lib/yard/handlers/processor.rb:31 +#: ../lib/yard/handlers/processor.rb:33 ../lib/yard/serializers/base.rb:61 +#: ../lib/yard/server/commands/display_object_command.rb:47 +#: ../lib/yard/tags/directives.rb:98 ../lib/yard/tags/directives.rb:121 +#: ../lib/yard/tags/library.rb:100 ../lib/yard/tags/library.rb:128 +#: ../lib/yard/tags/library.rb:137 +#: ../lib/yard/templates/helpers/base_helper.rb:19 +#: ../lib/yard/templates/helpers/base_helper.rb:102 +#: ../lib/yard/templates/helpers/html_helper.rb:57 +#: ../lib/yard/templates/helpers/html_helper.rb:73 +#: ../lib/yard/templates/helpers/html_helper.rb:83 +#: ../lib/yard/templates/helpers/html_helper.rb:91 +#: ../lib/yard/templates/helpers/html_helper.rb:101 +#: ../lib/yard/templates/helpers/html_helper.rb:109 +#: ../lib/yard/templates/helpers/html_helper.rb:123 +#: ../lib/yard/templates/helpers/markup_helper.rb:52 +#: ../lib/yard/templates/helpers/markup_helper.rb:122 +#: ../lib/yard/templates/helpers/markup_helper.rb:140 +#: ../lib/yard/templates/section.rb:85 ../lib/yard/templates/template.rb:133 +msgid "0.6.0" +msgstr "0.6.0" + +# @param [Array] +# @param [Array] +#: ../lib/yard/cli/command.rb:54 ../lib/yard/cli/gems.rb:17 +#: ../lib/yard/cli/graph.rb:50 ../lib/yard/cli/graph.rb:66 +#: ../lib/yard/cli/list.rb:12 ../lib/yard/cli/stats.rb:33 +#: ../lib/yard/cli/stats.rb:165 ../lib/yard/cli/yardoc.rb:243 +#: ../lib/yard/cli/yardoc.rb:281 ../lib/yard/cli/yardoc.rb:507 +#: ../lib/yard/cli/yri.rb:49 ../lib/yard/cli/yri.rb:189 +#: ../lib/yard/docstring.rb:37 ../lib/yard/templates/template.rb:204 +msgid "tag|param|args" +msgstr "tag|param|args" + +# @param [Array] args +#: ../lib/yard/cli/command.rb:54 +msgid "" +"the arguments passed from input. This\n" +"array will be modified." +msgstr "" +"引数は入力から解析される。\n" +"この配列は、変更されるだろう。" + +# YARD::CLI::Command#load_script +#: ../lib/yard/cli/command.rb:63 +msgid "" +"Loads a Ruby script. If Config.options[:safe_mode] is enabled,\n" +"this method will do nothing." +msgstr "" +"Rubyスクリプトをロードする。 Config.options[:safe_mode] が有効の場合、\n" +"このメソッドは、何もしないだろう。" + +# @since +#: ../lib/yard/cli/command.rb:67 ../lib/yard/cli/config.rb:90 +#: ../lib/yard/cli/server.rb:20 ../lib/yard/cli/server.rb:24 +#: ../lib/yard/config.rb:263 ../lib/yard/handlers/base.rb:228 +#: ../lib/yard/handlers/base.rb:235 ../lib/yard/server.rb:7 +msgid "0.6.2" +msgstr "0.6.2" + +# @param [String] +# @param [String, nil] +#: ../lib/yard/cli/command.rb:67 ../lib/yard/code_objects/base.rb:260 +#: ../lib/yard/core_ext/file.rb:53 ../lib/yard/registry.rb:118 +#: ../lib/yard/registry.rb:132 ../lib/yard/registry.rb:158 +#: ../lib/yard/registry_store.rb:113 ../lib/yard/registry_store.rb:130 +#: ../lib/yard/registry_store.rb:164 +#: ../lib/yard/templates/helpers/base_helper.rb:110 +msgid "tag|param|file" +msgstr "tag|param|file" + +# @param [String] file +#: ../lib/yard/cli/command.rb:67 +msgid "the path to the script to load" +msgstr "ロードするスクリプトの為のパス" + +# YARD::CLI::CommandParser +#: ../lib/yard/cli/command_parser.rb:4 +msgid "" +"This class parses a command name out of the +yard+ CLI command and calls\n" +"that command in the form:" +msgstr "" +"このクラスは、 +yard+ CLIコマンド出力のコマンド名を解析する。\n" +"以下の形式のコマンド呼び出しとなる。" + +# YARD::CLI::CommandParser +#: ../lib/yard/cli/command_parser.rb:7 +msgid " $ yard command_name [options]" +msgstr " $ yard command_name [options]" + +# YARD::CLI::CommandParser +#: ../lib/yard/cli/command_parser.rb:9 +msgid "" +"If no command or arguments are specified, or if the arguments immediately\n" +"begin with a +--opt+ (not +--help+), the {default_command} will be used\n" +"(which itself defaults to +:doc+)." +msgstr "" +"コマンドが無い場合や、引数が指定される場合、\n" +"又は、引数が直後に +--opt+ ( +--help+ ではない)で始まる場合、\n" +"{default_command}が利用される。(そして自身の +:doc+ をデフォルトにする)" + +# YARD::CLI::CommandParser +#: ../lib/yard/cli/command_parser.rb:13 +msgid "== Adding a Command" +msgstr "== コマンドを追加する" + +# YARD::CLI::CommandParser +#: ../lib/yard/cli/command_parser.rb:15 +msgid "" +"To add a custom command via plugin, create a mapping in {commands} from\n" +"the Symbolic command name to the {Command} class that implements the\n" +"command. To implement a command, see the documentation for the {Command}\n" +"class." +msgstr "" +"プラグイン経由でカスタムコマンドを追加するには、\n" +"そのコマンド名の象徴から\n" +"コマンドを実装する{Command}クラスに\n" +"{commands}のマッピングを作成する。\n" +"コマンドを実装するには、{Command}クラス用のドキュメントを参照。" + +# @see +#: ../lib/yard/cli/command_parser.rb:22 +msgid "tag|see|Command" +msgstr "tag|see|Command" + +# @see +#: ../lib/yard/cli/command_parser.rb:22 +msgid "tag|see|commands" +msgstr "tag|see|commands" + +# @see +#: ../lib/yard/cli/command_parser.rb:22 +msgid "tag|see|default_command" +msgstr "tag|see|default_command" + +# @return [Hash{Symbol => Command}] +#: ../lib/yard/cli/command_parser.rb:26 +msgid "" +"the mapping of command names to\n" +"command classes to parse the user command." +msgstr "ユーザーコマンドを解析するコマンドクラスの為のコマンド名のマッピング" + +# @return [Symbol] +#: ../lib/yard/cli/command_parser.rb:30 +msgid "" +"the default command name to use when no options\n" +"are specified or" +msgstr "オプションが指定されない時に利用するデフォルトのコマンド名" + +# YARD::CLI::CommandParser.run +#: ../lib/yard/cli/command_parser.rb:50 +msgid "Convenience method to create a new CommandParser and call {#run}" +msgstr "" +"新しいCommandParserを作成し、{#run}メソッドを呼び出す為の便利メソッド。" + +# @return [CommandParser] +#: ../lib/yard/cli/command_parser.rb:53 +msgid "a new instance of CommandParser" +msgstr "CommandParserの新しいインスタンス" + +# YARD::CLI::CommandParser#run +#: ../lib/yard/cli/command_parser.rb:58 +msgid "" +"Runs the {Command} object matching the command name of the first\n" +"argument." +msgstr "最初の引数のコマンド名にマッチする{Command}オブジェクトを起動する。" + +# YARD::CLI::Config +#: ../lib/yard/cli/config.rb:4 +msgid "CLI command to view or edit configuration options" +msgstr "" +"CLIコマンドを調べる。\n" +"又は、設定オプションを編集する。" + +# @return [Symbol, nil] +#: ../lib/yard/cli/config.rb:7 +msgid "the key to view/edit, if any" +msgstr "調べたり、編集する為のkey" + +# @return [Array, nil] +#: ../lib/yard/cli/config.rb:10 +msgid "the list of values to set (or single value), if modifying" +msgstr "変更する場合、セットする値のリストを返す(又は、単一の値)" + +# @return [Boolean] +#: ../lib/yard/cli/config.rb:13 +msgid "whether to reset the {#key}" +msgstr "{#key}をリセットするかどうか" + +# @return [Boolean] +#: ../lib/yard/cli/config.rb:16 +msgid "whether the value being set should be inside a list" +msgstr "設定される値がリストの内部になるかどうか" + +# @return [Boolean] +#: ../lib/yard/cli/config.rb:19 +msgid "whether to append values to existing key" +msgstr "既存のkeyに値を追加するかどうか" + +# @return [Config] +#: ../lib/yard/cli/config.rb:21 +msgid "a new instance of Config" +msgstr "Configの新しいインスタンス" + +# YARD::CLI::Diff +#: ../lib/yard/cli/diff.rb:8 +msgid "" +"CLI command to return the objects that were added/removed from 2 versions\n" +"of a project (library, gem, working copy)." +msgstr "" +"プロジェクトの2つのバージョンから追加や削除された所のオブジェクトを返す為の" +"CLIコマンド。\n" +"(library, gem, working copy)" + +# @return [Diff] +#: ../lib/yard/cli/diff.rb:11 +msgid "a new instance of Diff" +msgstr "Diffの新しいインスタンス" + +# @return [Gems] +#: ../lib/yard/cli/gems.rb:5 +msgid "a new instance of Gems" +msgstr "Gemsの新しいインスタンス" + +# YARD::CLI::Gems#run +#: ../lib/yard/cli/gems.rb:13 +msgid "" +"Runs the commandline utility, parsing arguments and generating\n" +"YARD indexes for gems." +msgstr "" +"コマンドラインユーティリティを起動し、引数を解析し、gem用のYARDインデックスを" +"生成する。" + +# @param [Array] args +#: ../lib/yard/cli/gems.rb:17 ../lib/yard/cli/stats.rb:33 +#: ../lib/yard/cli/yardoc.rb:281 +msgid "the list of arguments" +msgstr "引数のリスト" + +# YARD::CLI::Gems#build_gems +#: ../lib/yard/cli/gems.rb:26 +msgid "Builds .yardoc files for all non-existing gems" +msgstr "存在しないgem用に.yardocファイルをビルドする。" + +# @param [Array] +#: ../lib/yard/cli/gems.rb:27 +msgid "tag|param|gems" +msgstr "tag|param|gems" + +# YARD::CLI::Gems#optparse +#: ../lib/yard/cli/gems.rb:59 +msgid "Parses options" +msgstr "オプションを解析する。" + +# YARD::Rake::YardocTask#options +# YARD::Rake::YardocTask#options= +#: ../lib/yard/cli/graph.rb:4 +msgid "Options to pass to the {Graph} CLI." +msgstr "{Graph} CLIに渡す為のオプション" + +# @param [String] text +#: ../lib/yard/cli/graph.rb:6 +msgid "the default output format" +msgstr "デフォルトの出力フォーマット" + +# @param [Boolean] link +#: ../lib/yard/cli/graph.rb:9 +msgid "whether to list the full class diagram" +msgstr "全てのクラス図をリストするかどうか" + +# @return [Boolean] +#: ../lib/yard/cli/graph.rb:12 +msgid "whether to show the object dependencies" +msgstr "オブジェクトの依存関係を調べるかどうか" + +# @param [Hash] opts +#: ../lib/yard/cli/graph.rb:15 +msgid "any contents to pass to the digraph" +msgstr "図に渡す内容" + +# YARD::CLI::Graph +#: ../lib/yard/cli/graph.rb:19 +msgid "" +"A command-line utility to generate Graphviz graphs from\n" +"a set of objects" +msgstr "" +"オブジェクトのグループからGraphvizのグラフを生成する為のコマンドラインユー" +"ティリティ" + +# @see +#: ../lib/yard/cli/graph.rb:23 +msgid "tag|see|Graph#run" +msgstr "tag|see|Graph#run" + +# YARD::CLI::Graph#options +#: ../lib/yard/cli/graph.rb:25 +msgid "" +"The options parsed out of the commandline.\n" +"Default options are:\n" +" :format => :dot" +msgstr "" +"optionsはコマンドラインの出力を解析する。\n" +"optionsのデフォルトは:\n" +" :format => dot" + +# YARD::CLI::Graph#objects +#: ../lib/yard/cli/graph.rb:30 +msgid "The set of objects to include in the graph." +msgstr "graphでインクルードする為のオブジェクトのグループ" + +# YARD::CLI::Graph#initialize +#: ../lib/yard/cli/graph.rb:33 +msgid "Creates a new instance of the command-line utility" +msgstr "コマンドラインユーティリティの新しいインスタンスを作成する。" + +# @return [Graph] +#: ../lib/yard/cli/graph.rb:33 +msgid "a new instance of Graph" +msgstr "Graphの新しいインスタンス" + +# YARD::CLI::YRI#run +# YARD::CLI::Graph#run +#: ../lib/yard/cli/graph.rb:45 ../lib/yard/cli/yri.rb:45 +msgid "Runs the command-line utility." +msgstr "コマンドラインユーティリティを起動する。" + +# @param [Array] args +#: ../lib/yard/cli/graph.rb:50 ../lib/yard/cli/graph.rb:66 +#: ../lib/yard/cli/stats.rb:165 ../lib/yard/cli/yardoc.rb:507 +#: ../lib/yard/cli/yri.rb:49 ../lib/yard/cli/yri.rb:189 +msgid "each tokenized argument" +msgstr "個々にトークナイズされた引数" + +# @example +#: ../lib/yard/cli/graph.rb:50 +msgid "" +"grapher = Graph.new\n" +"grapher.run('--private')" +msgstr "" +"grapher = Graph.new\n" +"grapher.run('--private')" + +# YARD::CLI::YRI#optparse +# YARD::CLI::Graph#optparse +# YARD::CLI::Stats#optparse +# YARD::CLI::Yardoc#optparse +#: ../lib/yard/cli/graph.rb:65 ../lib/yard/cli/stats.rb:164 +#: ../lib/yard/cli/yardoc.rb:506 ../lib/yard/cli/yri.rb:188 +msgid "Parses commandline options." +msgstr "コマンドラインオプションを解析する。" + +# YARD::CLI::Help +#: ../lib/yard/cli/help.rb:4 +msgid "Handles help for commands" +msgstr "コマンド用のヘルプを操作する。" + +# YARD::CLI::I18n +#: ../lib/yard/cli/i18n.rb:6 +msgid "" +"CLI command to support internationalization (a.k.a. i18n).\n" +"I18n feature is based on gettext technology.\n" +"This command generates .pot file from docstring and extra\n" +"documentation." +msgstr "" + +# @todo +#: ../lib/yard/cli/i18n.rb:12 +msgid "Support msgminit and msgmerge features?" +msgstr "" + +# @return [YRI] +#: ../lib/yard/cli/i18n.rb:13 +msgid "a new instance of I18n" +msgstr "I18nの新しいインスタンス" + +# @since +#: ../lib/yard/cli/i18n.rb:60 ../lib/yard/code_objects/base.rb:233 +#: ../lib/yard/code_objects/base.rb:531 +#: ../lib/yard/code_objects/method_object.rb:83 +#: ../lib/yard/docstring_parser.rb:268 ../lib/yard/handlers/base.rb:411 +#: ../lib/yard/handlers/base.rb:424 ../lib/yard/handlers/base.rb:433 +#: ../lib/yard/handlers/base.rb:456 ../lib/yard/handlers/base.rb:470 +#: ../lib/yard/handlers/base.rb:483 ../lib/yard/handlers/base.rb:495 +#: ../lib/yard/handlers/base.rb:506 ../lib/yard/handlers/base.rb:520 +#: ../lib/yard/handlers/c/override_comment_handler.rb:27 +#: ../lib/yard/i18n/pot_generator.rb:258 ../lib/yard/registry_store.rb:94 +#: ../lib/yard/registry_store.rb:103 ../lib/yard/tags/directives.rb:73 +#: ../lib/yard/tags/directives.rb:519 ../lib/yard/tags/library.rb:113 +#: ../lib/yard/templates/helpers/html_helper.rb:364 +#: ../lib/yard/templates/helpers/html_helper.rb:372 +msgid "0.8.0" +msgstr "" + +# YARD::CLI::List +#: ../lib/yard/cli/list.rb:4 +msgid "" +"Lists all constant and method names in the codebase. Uses {Yardoc} --list." +msgstr "" +"全ての定数とコードベースの中のメソッド名を記述する。{yardoc} --list で利用す" +"る。" + +# YARD::CLI::List#run +#: ../lib/yard/cli/list.rb:8 +msgid "" +"Runs the commandline utility, parsing arguments and displaying a\n" +"list of objects" +msgstr "" +"コマンドラインユーティリティを起動し、引数を解析する。\n" +"そして、オブジェクトのリストを表示する。" + +# @param [Array] args +#: ../lib/yard/cli/list.rb:12 +msgid "the list of arguments." +msgstr "引数のリスト" + +# YARD::CLI::Server +#: ../lib/yard/cli/server.rb:4 +msgid "A local documentation server" +msgstr "ローカルドキュメントサーバー" + +# @return [Hash] +#: ../lib/yard/cli/server.rb:7 +msgid "a list of options to pass to the doc server" +msgstr "ドキュメントサーバーに渡す為のオプションのリスト" + +# @return [Hash] +#: ../lib/yard/cli/server.rb:10 +msgid "a list of options to pass to the web server" +msgstr "webサーバーに渡す為のオプションのリスト" + +# @return [Hash] +#: ../lib/yard/cli/server.rb:13 +msgid "a list of library names and yardoc files to serve" +msgstr "ライブラリ名のリストと提供する為のyardocファイル" + +# @return [Adapter] +#: ../lib/yard/cli/server.rb:16 +msgid "the adapter to use for loading the web server" +msgstr "ロードするwebサーバー用に利用されるアダプタ" + +# @return [Array] +#: ../lib/yard/cli/server.rb:20 +msgid "a list of scripts to load" +msgstr "ロードする為のスクリプトのリスト" + +# @return [Array] +#: ../lib/yard/cli/server.rb:24 +msgid "a list of template paths to register" +msgstr "登録するテンプレートのパスのリスト" + +# YARD::CLI::Yardoc#initialize +#: ../lib/yard/cli/server.rb:27 +msgid "Creates a new instance of the Server command line utility" +msgstr "サーバーコマンドラインユーティリティの新しいインスタンスを作成する。" + +# @return [Verifier] +#: ../lib/yard/cli/server.rb:27 +msgid "a new instance of Server" +msgstr "サーバーの新しいインスタンス" + +# YARD::CLI::Stats::STATS_ORDER +#: ../lib/yard/cli/stats.rb:8 +msgid "" +"Maintains the order in which +stats_for_+ statistics methods should be\n" +"printed." +msgstr "" +"オーダーを継続する。そして統計用の +stats_for_+ メソッドは、プリントされるべ" +"きである。" + +# @see +#: ../lib/yard/cli/stats.rb:11 +msgid "tag|see|#print_statistics" +msgstr "" + +# @return [Boolean] +#: ../lib/yard/cli/stats.rb:14 +msgid "whether to parse and load registry" +msgstr "解析するかレジストリーをロードするかどうか" + +# @return [Stats] +#: ../lib/yard/cli/stats.rb:17 +msgid "a new instance of Stats" +msgstr "Statsの新しいインスタンス" + +# @param [Boolean] +#: ../lib/yard/cli/stats.rb:17 +msgid "tag|param|parse" +msgstr "" + +# @param [Boolean] parse +#: ../lib/yard/cli/stats.rb:17 +msgid "whether to parse and load registry (see {#parse})" +msgstr "解析するかレジストリーがロードされるかどうか(see {#parse})" + +# YARD::CLI::Stats#run +# YARD::CLI::Yardoc#run +#: ../lib/yard/cli/stats.rb:29 ../lib/yard/cli/yardoc.rb:238 +msgid "" +"Runs the commandline utility, parsing arguments and generating\n" +"output if set." +msgstr "" +"コマンドラインユーティリティを起動し、引数を解析する。\n" +"そしてグループの場合、出力を生成する。" + +# YARD::CLI::Stats#print_statistics +#: ../lib/yard/cli/stats.rb:48 +msgid "Prints statistics for different object types" +msgstr "色々なオブジェクト型用に統計値をプリントする。" + +# YARD::CLI::Stats#print_statistics +#: ../lib/yard/cli/stats.rb:50 +msgid "" +"To add statistics for a specific type, add a method +#stats_for_TYPE+\n" +"to this class that calls {#output}." +msgstr "" +"特定の型用に統計値を追加するには、\n" +"{#output}メソッドに呼び出されるこのクラスに +#stats_for_TYPE+ メソッドを追加" +"する。" + +# YARD::CLI::Stats#print_undocumented_objects +#: ../lib/yard/cli/stats.rb:71 +msgid "Prints list of undocumented objects" +msgstr "記述されなかったオブジェクトのリストをプリントする。" + +# @return [Array] +#: ../lib/yard/cli/stats.rb:99 +msgid "" +"all the parsed objects in the registry,\n" +"removing any objects that are not visible (private, protected) depending\n" +"on the arguments passed to the command." +msgstr "" +"レジストリーの中の全ての解析されたオブジェクト,\n" +"コマンドに渡された引数に応じて不可視(private,protected)のオブジェクトを削除している。" + +# YARD::CLI::Stats#stats_for_files +#: ../lib/yard/cli/stats.rb:104 +msgid "Statistics for files" +msgstr "ファイル用の統計値" + +# YARD::CLI::Stats#stats_for_modules +#: ../lib/yard/cli/stats.rb:111 +msgid "Statistics for modules" +msgstr "モジュール用の統計値" + +# YARD::CLI::Stats#stats_for_classes +#: ../lib/yard/cli/stats.rb:116 +msgid "Statistics for classes" +msgstr "クラス用の統計値" + +# YARD::CLI::Stats#stats_for_constants +#: ../lib/yard/cli/stats.rb:121 +msgid "Statistics for constants" +msgstr "定数用の統計値" + +# YARD::CLI::Stats#stats_for_methods +#: ../lib/yard/cli/stats.rb:126 +msgid "Statistics for methods" +msgstr "メソッド用の統計値" + +# YARD::CLI::Stats#output +#: ../lib/yard/cli/stats.rb:135 +msgid "" +"Prints a statistic to standard out. This method is optimized for\n" +"getting Integer values, though it allows any data to be printed." +msgstr "" +"標準出力に統計値をプリントする。このメソッドは、\n" +"Integerの値の取得用に最適化され、プリントされる為に任意のデータを受入れる。" + +# @param [Integer, nil] undoc +#: ../lib/yard/cli/stats.rb:143 +msgid "number of undocumented objects for the type" +msgstr "型によって記述されなかったオブジェクトの数" + +# @param [String] +# @param [Integer, String] +#: ../lib/yard/cli/stats.rb:143 +#: ../lib/yard/code_objects/extra_file_object.rb:47 +#: ../lib/yard/code_objects/macro_object.rb:39 ../lib/yard/registry.rb:323 +#: ../lib/yard/serializers/base.rb:41 ../lib/yard/serializers/base.rb:77 +#: ../lib/yard/server/commands/base.rb:159 +#: ../lib/yard/templates/helpers/uml_helper.rb:33 +msgid "tag|param|data" +msgstr "" + +# @param [String] +# @param [Symbol, String] +# @param [String, Symbol] +# @param [Object] +# @param [#to_s] +#: ../lib/yard/cli/stats.rb:143 ../lib/yard/cli/yri.rb:109 +#: ../lib/yard/cli/yri.rb:141 ../lib/yard/code_objects/base.rb:207 +#: ../lib/yard/code_objects/method_object.rb:33 ../lib/yard/config.rb:154 +#: ../lib/yard/config.rb:247 ../lib/yard/docstring.rb:237 +#: ../lib/yard/docstring.rb:245 ../lib/yard/docstring.rb:255 +#: ../lib/yard/docstring.rb:263 ../lib/yard/handlers/ruby/base.rb:21 +#: ../lib/yard/handlers/ruby/base.rb:83 ../lib/yard/i18n/locale.rb:20 +#: ../lib/yard/rake/yardoc_task.rb:46 ../lib/yard/registry.rb:270 +#: ../lib/yard/registry.rb:368 ../lib/yard/server/library_version.rb:120 +#: ../lib/yard/tags/tag.rb:43 +msgid "tag|param|name" +msgstr "" + +# @param [Integer, nil] +#: ../lib/yard/cli/stats.rb:143 +msgid "tag|param|undoc" +msgstr "" + +# @param [Integer, String] data +#: ../lib/yard/cli/stats.rb:143 +msgid "" +"the numeric (or any) data representing\n" +"the statistic. If +data+ is an Integer, it should represent the\n" +"total objects of a type." +msgstr "" +"数(又は何か)のデータを表す統計値。\n" +"+data+ がIntegerの場合、型の全体のオブジェクトを表すはずである。" + +# @param [String] name +#: ../lib/yard/cli/stats.rb:143 +msgid "the statistic name" +msgstr "統計値の名前" + +# YARD::CLI::YardocOptions +#: ../lib/yard/cli/yardoc.rb:7 +msgid "Default options used in +yard doc+ command." +msgstr "" + +# @return [Array] +#: ../lib/yard/cli/yardoc.rb:10 +msgid "the list of extra files rendered along with objects" +msgstr "オブジェクトと一緒に表示される追加のファイルのリスト" + +# @return [String] +#: ../lib/yard/cli/yardoc.rb:13 +msgid "the default title appended to each generated page" +msgstr "" + +# @return [Verifier] +#: ../lib/yard/cli/yardoc.rb:16 +msgid "the default verifier object to filter queries" +msgstr "" + +# @return [Serializers::Base] +#: ../lib/yard/cli/yardoc.rb:20 +msgid "" +"the default serializer for generating output\n" +"to disk." +msgstr "" + +# @return [String] +#: ../lib/yard/cli/yardoc.rb:23 +msgid "the default output format (:html)." +msgstr "デフォルト出力フォーマット (:html)" + +# @return [Boolean] +#: ../lib/yard/cli/yardoc.rb:27 +msgid "" +"whether the data should be rendered in a single page,\n" +"if the template supports it." +msgstr "" + +# @return [CodeObjects::ExtraFileObject] +#: ../lib/yard/cli/yardoc.rb:31 +msgid "" +"the README file object rendered\n" +"along with objects" +msgstr "" + +# @return [Array] +#: ../lib/yard/cli/yardoc.rb:35 +msgid "" +"the list of code objects to render\n" +"the templates with." +msgstr "リストと共にテンプレートを表示する為のコードオブジェクトのリスト" + +# @return [Numeric] +#: ../lib/yard/cli/yardoc.rb:38 +msgid "An index value for rendering sequentially related templates" +msgstr "" + +# @return [CodeObjects::Base] +#: ../lib/yard/cli/yardoc.rb:42 +msgid "" +"an extra item to send to a template that is not\n" +"the main rendered object" +msgstr "" + +# @return [CodeObjects::ExtraFileObject] +#: ../lib/yard/cli/yardoc.rb:47 +msgid "" +"the file object being rendered.\n" +"The +object+ key is not used so that a file may be rendered in the context\n" +"of an object's namespace (for generating links)." +msgstr "" + +# YARD::CLI::Yardoc +#: ../lib/yard/cli/yardoc.rb:51 +msgid "" +"Yardoc is the default YARD CLI command (+yard doc+ and historic +yardoc+\n" +"executable) used to generate and output (mainly) HTML documentation given\n" +"a set of source files." +msgstr "" +"Yardocは、デフォルトのYARD CLIコマンドとなり( +yard doc+ と省略表記の +yardoc" +"+ が実行可能)、\n" +"生成し、与えられたソースファイルのグループのHTMLドキュメントの出力(主な機能)" +"の為に利用される。" + +# YARD::CLI::Yardoc +#: ../lib/yard/cli/yardoc.rb:55 ../lib/yard/i18n/pot_generator.rb:38 +msgid "== Usage" +msgstr "== 使用法" + +# YARD::CLI::Yardoc +#: ../lib/yard/cli/yardoc.rb:57 +msgid "Main usage for this command is:" +msgstr "このコマンドの主な使用法は次のようになる:" + +# YARD::CLI::Yardoc +#: ../lib/yard/cli/yardoc.rb:59 +msgid " $ yardoc [options] [source_files [- extra_files]]" +msgstr "" + +# YARD::CLI::Yardoc +#: ../lib/yard/cli/yardoc.rb:61 +msgid "See +yardoc --help+ for details on valid options." +msgstr "有効なオプションの詳細は +yardoc --help+ で参照できる。" + +# YARD::CLI::Yardoc +#: ../lib/yard/cli/yardoc.rb:63 +msgid "== Options File (+.yardopts+)" +msgstr "== オプションファイル (+.yardopts+)" + +# YARD::CLI::Yardoc +#: ../lib/yard/cli/yardoc.rb:65 +msgid "" +"If a +.yardopts+ file is found in the source directory being processed,\n" +"YARD will use the contents of the file as arguments to the command,\n" +"treating newlines as spaces. You can use shell-style quotations to\n" +"group space delimited arguments, just like on the command line." +msgstr "" +"+.yardopts+ ファイルが、処理されるソースディレクトリで見つかった場合、\n" +"YARDは、コマンドに引数としてファイルの内容を利用し、改行をスペースとして処理" +"する。\n" +"あなたはスペースで区切られた引数のグループに、\n" +"コマンドラインのようなシェルスタイルの引用を利用できる。" + +# YARD::CLI::Yardoc +#: ../lib/yard/cli/yardoc.rb:70 +msgid "A valid +.yardopts+ file might look like:" +msgstr "有効な +.yardopts+ ファイルは、次のようになる。" + +# YARD::CLI::Yardoc +#: ../lib/yard/cli/yardoc.rb:72 +msgid "" +" --no-private\n" +" --title \"My Title\"\n" +" --exclude foo --exclude bar\n" +" lib/**/*.erb\n" +" lib/**/*.rb -\n" +" HACKING.rdoc LEGAL COPYRIGHT" +msgstr "" + +# YARD::CLI::Yardoc +#: ../lib/yard/cli/yardoc.rb:79 +msgid "" +"Note that Yardoc also supports the legacy RDoc style +.document+ file,\n" +"though this file can only specify source globs to parse, not options." +msgstr "" +"次の事に留意する。Yardocは、レガシーなRDocスタイルの +.document+ ファイルもサ" +"ポートするけれども、\n" +"このファイルは、オプションはなしで、解析の為にソースのglobだけ指定できる。" + +# YARD::CLI::Yardoc +#: ../lib/yard/cli/yardoc.rb:82 +msgid "== Queries (+--query+)" +msgstr "== クエリー (+--query+)" + +# YARD::CLI::Yardoc +#: ../lib/yard/cli/yardoc.rb:84 +msgid "" +"Yardoc supports queries to select specific code objects for which to\n" +"generate documentation. For example, you might want to generate\n" +"documentation only for your public API. If you've documented your public\n" +"methods with +@api public+, you can use the following query to select\n" +"all of these objects:" +msgstr "" +"Yardocは、ドキュメントを生成する時に、\n" +"特定のコードオブジェクトを選択する為にクエリーをサポートする。\n" +"例えば、あなたが、\n" +"自分のpublic APIの為だけにドキュメント生成したいかもしれない。\n" +"あなたが、 +@api public+ を用いて記述されたpublicメソッドを持っていた場合、\n" +"これらのオブジェクトの全てを選択する為に、次の様なクエリーを利用できる:" + +# YARD::CLI::Yardoc +#: ../lib/yard/cli/yardoc.rb:90 +msgid " --query '@api.text == \"public\"'" +msgstr "" + +# YARD::CLI::Yardoc +#: ../lib/yard/cli/yardoc.rb:92 +msgid "" +"Note that the syntax for queries is mostly Ruby with a few syntactic\n" +"simplifications for meta-data tags. See the {Verifier} class for an\n" +"overview of this syntax." +msgstr "" +"次の事に留意する。クエリー用の構文は、\n" +"主にRuby構文で、メタデータタグ用のいくつかの構文の簡単にしたものも用いてい" +"る。\n" +"この構文の概要は、{Verifier}クラス参照。" + +# YARD::CLI::Yardoc +#: ../lib/yard/cli/yardoc.rb:96 +msgid "== Adding Custom Ad-Hoc Meta-data Tags (+--tag+)" +msgstr "== カスタムした特別なメタデータタグ(+--tag+)を追加する" + +# YARD::CLI::Yardoc +#: ../lib/yard/cli/yardoc.rb:98 +msgid "" +"YARD allows specification of {file:docs/Tags.md meta-data tags}\n" +"programmatically via the {YARD::Tags::Library} class, but often this is not\n" +"practical for users writing documentation. To make adding custom tags\n" +"easier, Yardoc has a few command-line switches for creating basic tags\n" +"and displaying them in generated HTML output." +msgstr "" +"YARDは、{YARD::Tags::Library}クラス経由でプラグラムされた{file:docs/Tags.md " +"meta-data tags}の仕様を受入れるが、時々これは、ユーザーが書いているドキュメン" +"トとはそぐわない場合がある。\n" +"簡単なカスタムタグを作成するには、\n" +"Yardocが基本的なタグ作成用にいくつかのコマンドライン引数を持っており、\n" +"それをHTML出力し表示できる。" + +# YARD::CLI::Yardoc +#: ../lib/yard/cli/yardoc.rb:104 +msgid "" +"To specify a custom tag to be displayed in output, use any of the\n" +"following:" +msgstr "出力に表示されるカスタムタグを指定するには、次のように利用できる。" + +# YARD::CLI::Yardoc +#: ../lib/yard/cli/yardoc.rb:107 +msgid "" +"* +--tag+ TAG:TITLE\n" +"* +--name-tag+ TAG:TITLE\n" +"* +--type-tag+ TAG:TITLE\n" +"* +--type-name-tag+ TAG:TITLE\n" +"* +--title-tag+ TAG:TITLE" +msgstr "" + +# YARD::CLI::Yardoc +#: ../lib/yard/cli/yardoc.rb:113 +msgid "\"TAG:TITLE\" is of the form: name:\"Display Title\", for example:" +msgstr "" +"以下のように\"TAG:TITLE\" は、 形式: 名前:\"表示されるタイトル\" とする。" + +# YARD::CLI::Yardoc +#: ../lib/yard/cli/yardoc.rb:115 +msgid " --tag overload:\"Overloaded Method\"" +msgstr "" + +# YARD::CLI::Yardoc +#: ../lib/yard/cli/yardoc.rb:117 +msgid "See +yardoc --help+ for a description of the various options." +msgstr "様々なオプションの説明は +yardoc --help+ 参照。" + +# YARD::CLI::Yardoc +#: ../lib/yard/cli/yardoc.rb:119 +msgid "" +"Tags added in this way are automatically displayed in output. To add\n" +"a meta-data tag that does not show up in output, use +--hide-tag TAG+.\n" +"Note that you can also use this option on existing tags to hide\n" +"builtin tags, for instance." +msgstr "" +"この方法で追加したタグは、自動的に出力で表示される。\n" +"出力に表示しないでメタデータタグを追加するには、 +--hide-tag TAG+ を使う。\n" +"次の事に留意する。あなたは、\n" +"組み込みタグを隠す為に既存のタグ上でこのオプションも利用できる。" + +# YARD::CLI::Yardoc +#: ../lib/yard/cli/yardoc.rb:124 +msgid "== Processed Data Storage (+.yardoc+ directory)" +msgstr "== 処理されたデータストレージ (+.yardoc+ ディレクトリ)" + +# YARD::CLI::Yardoc +#: ../lib/yard/cli/yardoc.rb:126 +msgid "" +"When Yardoc parses a source directory, it creates a +.yardoc+ directory\n" +"(by default, override with +-b+) at the root of the project. This directory\n" +"contains marshal dumps for all raw object data in the source, so that\n" +"you can access it later for various commands (+stats+, +graph+, etc.).\n" +"This directory is also used as a cache for any future calls to +yardoc+\n" +"so as to process only the files which have changed since the last call." +msgstr "" +"Yardocがソースディレクトリを解析する時、プロジェクトのルートで +.yardoc+ ディ" +"レクトリを作成する。\n" +"(デフォルトで、 +-b+ と共に上書きする)\n" +"このディレクトリは、\n" +"全てのソースの生のオブジェクトデータ用に整理されたダンプを含んでいるので、\n" +"後で様々なコマンド用(+stats+, +graph+ 等)にアクセスできる。\n" +"このディレクトリは、いつか +yardoc+ を呼び出す為にもキャッシュとして利用す" +"る。\n" +"最後の呼び出しから変更した所のファイルだけ処理する為に。" + +# YARD::CLI::Yardoc +#: ../lib/yard/cli/yardoc.rb:133 +msgid "" +"When Yardoc uses the cache in subsequent calls to +yardoc+, methods\n" +"or classes that have been deleted from source since the last parsing\n" +"will not be erased from the cache (YARD never deletes objects). In such\n" +"a case, you should wipe the cache and do a clean parsing of the source " +"tree.\n" +"You can do this by deleting the +.yardoc+ directory manually, or running\n" +"Yardoc without +--use-cache+ (+-c+)." +msgstr "" +"Yardocが +yardoc+ 呼び出しに続くキャッシュを使う時、\n" +"最後に解析しているのでソースから削除されているメソッドやクラスは、\n" +"キャッシュから削除されない。(YARDはオブジェクトを決して削除しない)\n" +"このような場合、あなたは、キャッシュを一掃し、クリーンなソースツリーの解析に" +"するべきである。\n" +"+.yardoc+ ディレクトリを手動で削除する事に上記の事ができる。\n" +"又は、yardoc の +--use-cache+ (+-c+)無しで起動する。" + +# @see +#: ../lib/yard/cli/yardoc.rb:141 ../lib/yard/rake/yardoc_task.rb:38 +msgid "tag|see|Verifier" +msgstr "" + +# YARD::CLI::Yardoc::DEFAULT_YARDOPTS_FILE +#: ../lib/yard/cli/yardoc.rb:143 +msgid "The configuration filename to load extra options from" +msgstr "追加のオプションをロードする設定ファイル名" + +# @see +#: ../lib/yard/cli/yardoc.rb:147 ../lib/yard/code_objects/base.rb:463 +msgid "tag|see|Templates::Engine#render" +msgstr "" + +# @return [Hash] +#: ../lib/yard/cli/yardoc.rb:147 +msgid "the hash of options passed to the template." +msgstr "テンプレートに解析された、optionsのハッシュ" + +# @return [Array] +#: ../lib/yard/cli/yardoc.rb:150 +msgid "list of Ruby source files to process" +msgstr "処理する為のRubyソースファイルのリスト" + +# @since +#: ../lib/yard/cli/yardoc.rb:154 ../lib/yard/code_objects/base.rb:430 +#: ../lib/yard/code_objects/method_object.rb:91 +#: ../lib/yard/code_objects/method_object.rb:98 +#: ../lib/yard/code_objects/method_object.rb:104 +#: ../lib/yard/core_ext/file.rb:62 ../lib/yard/parser/source_parser.rb:469 +#: ../lib/yard/templates/helpers/html_helper.rb:430 +#: ../lib/yard/templates/helpers/html_helper.rb:542 +msgid "0.5.3" +msgstr "" + +# @return [Array] +#: ../lib/yard/cli/yardoc.rb:154 +msgid "list of excluded paths (regexp matches)" +msgstr "除外されたパス(正規表現にマッチする)のリスト" + +# @return [Boolean] +#: ../lib/yard/cli/yardoc.rb:159 +msgid "" +"whether to use the existing yardoc db if the\n" +".yardoc already exists. Also makes use of file checksums to\n" +"parse only changed files." +msgstr "" +".yardocが既に存在する場合、既存のyardoc dbを利用するかどうか。\n" +"従って、変更されたファイルだけ解析する為にファイルチェックサムを活用する。" + +# @return [Boolean] +#: ../lib/yard/cli/yardoc.rb:162 +msgid "whether to parse options from .yardopts" +msgstr ".yardoptsから、オプションを解析するかどうか" + +# @return [Boolean] +#: ../lib/yard/cli/yardoc.rb:165 +msgid "whether to parse options from .document" +msgstr ".documentからオプションを解析するかどうか" + +# @return [Boolean] +#: ../lib/yard/cli/yardoc.rb:168 +msgid "whether objects should be serialized to .yardoc db" +msgstr "オブジェクトが.yardoc dbにシリアライズされるかどうか" + +# @return [Boolean] +#: ../lib/yard/cli/yardoc.rb:171 +msgid "whether to generate output" +msgstr "出力を生成するかどうか" + +# @since +#: ../lib/yard/cli/yardoc.rb:175 ../lib/yard/cli/yardoc.rb:402 +#: ../lib/yard/handlers/ruby/legacy/class_condition_handler.rb:28 +#: ../lib/yard/handlers/ruby/legacy/class_condition_handler.rb:67 +#: ../lib/yard/handlers/ruby/legacy/class_condition_handler.rb:72 +#: ../lib/yard/templates/helpers/base_helper.rb:149 +msgid "0.5.5" +msgstr "" + +# @return [Boolean] +#: ../lib/yard/cli/yardoc.rb:175 +msgid "whether to print a list of objects" +msgstr "オブジェクトのリストをプリントするかどうか" + +# YARD::CLI::Yardoc#options_file +# YARD::CLI::Yardoc#options_file= +#: ../lib/yard/cli/yardoc.rb:178 +msgid "The options file name (defaults to {DEFAULT_YARDOPTS_FILE})" +msgstr "ファイル名のオプション(デフォルトでは{DEFAULT_YARDOPTS_FILE}になる)" + +# @return [String] +#: ../lib/yard/cli/yardoc.rb:179 +msgid "the filename to load extra options from" +msgstr "追加のオプションをロードする為のファイル名" + +# YARD::CLI::Yardoc#visibilities +# YARD::CLI::Yardoc#visibilities= +#: ../lib/yard/cli/yardoc.rb:182 +msgid "Keep track of which visibilities are to be shown" +msgstr "visibilitiesで示されるその中で手順を維持する。" + +# @since +#: ../lib/yard/cli/yardoc.rb:184 ../lib/yard/cli/yardoc.rb:281 +#: ../lib/yard/cli/yardoc.rb:476 ../lib/yard/cli/yri.rb:74 +#: ../lib/yard/handlers/ruby/struct_handler_methods.rb:133 +#: ../lib/yard/parser/base.rb:51 +#: ../lib/yard/parser/ruby/legacy/ruby_parser.rb:26 +#: ../lib/yard/parser/source_parser.rb:150 +#: ../lib/yard/parser/source_parser.rb:152 +#: ../lib/yard/parser/source_parser.rb:158 +#: ../lib/yard/parser/source_parser.rb:160 +#: ../lib/yard/parser/source_parser.rb:168 +#: ../lib/yard/parser/source_parser.rb:512 ../lib/yard/verifier.rb:36 +#: ../lib/yard/verifier.rb:57 +msgid "0.5.6" +msgstr "" + +# @return [Array] +#: ../lib/yard/cli/yardoc.rb:184 +msgid "a list of visibilities" +msgstr "visibilitiesのリスト" + +# YARD::CLI::Yardoc#visibilities +# YARD::CLI::Yardoc#visibilities= +#: ../lib/yard/cli/yardoc.rb:187 +msgid "Keep track of which APIs are to be shown" +msgstr "そのAPIが表示される経過を追う" + +# @since +#: ../lib/yard/cli/yardoc.rb:189 ../lib/yard/cli/yardoc.rb:484 +#: ../lib/yard/i18n/message.rb:48 ../lib/yard/i18n/messages.rb:52 +#: ../lib/yard/i18n/pot_generator.rb:69 +msgid "0.8.1" +msgstr "" + +# @return [Array] +#: ../lib/yard/cli/yardoc.rb:189 +msgid "a list of APIs" +msgstr "APIのリスト" + +# @return [Array] +#: ../lib/yard/cli/yardoc.rb:193 +msgid "a list of tags to hide from templates" +msgstr "テンプレートから隠すタグのリスト" + +# @return [Boolean] +#: ../lib/yard/cli/yardoc.rb:197 +msgid "whether to print statistics after parsing" +msgstr "解析の後で統計値をプリントするかどうか" + +# @return [Array] +#: ../lib/yard/cli/yardoc.rb:201 +msgid "a list of assets to copy after generation" +msgstr "生成の後でコピーする資産のリスト" + +# @since +#: ../lib/yard/cli/yardoc.rb:205 ../lib/yard/docstring.rb:138 +#: ../lib/yard/docstring.rb:186 ../lib/yard/docstring.rb:263 +#: ../lib/yard/docstring.rb:272 ../lib/yard/parser/source_parser.rb:68 +#: ../lib/yard/parser/source_parser.rb:231 +#: ../lib/yard/parser/source_parser.rb:255 +#: ../lib/yard/parser/source_parser.rb:292 +#: ../lib/yard/parser/source_parser.rb:321 +#: ../lib/yard/parser/source_parser.rb:328 +#: ../lib/yard/parser/source_parser.rb:335 +#: ../lib/yard/parser/source_parser.rb:342 +#: ../lib/yard/parser/source_parser.rb:349 +#: ../lib/yard/parser/source_parser.rb:393 +#: ../lib/yard/parser/source_parser.rb:397 ../lib/yard/tags/directives.rb:318 +#: ../lib/yard/tags/directives.rb:393 ../lib/yard/tags/directives.rb:489 +#: ../lib/yard/tags/directives.rb:553 ../lib/yard/tags/directives.rb:583 +#: ../lib/yard/templates/helpers/base_helper.rb:110 +#: ../lib/yard/templates/helpers/html_helper.rb:134 +msgid "0.7.0" +msgstr "" + +# @return [Boolean] +#: ../lib/yard/cli/yardoc.rb:205 +msgid "whether markup option was specified" +msgstr "マークアップオプションが指定されたかどうか" + +# YARD::CLI::Yardoc#initialize +#: ../lib/yard/cli/yardoc.rb:208 +msgid "Creates a new instance of the commandline utility" +msgstr "コマンドラインユーティリティの新しいインスタンスを作成する。" + +# @return [Yardoc] +#: ../lib/yard/cli/yardoc.rb:208 +msgid "a new instance of Yardoc" +msgstr "Yardocの新しいインスタンス" + +# @param [Array] args +#: ../lib/yard/cli/yardoc.rb:243 +msgid "" +"the list of arguments. If the list only\n" +"contains a single nil value, skip calling of {#parse_arguments}" +msgstr "" +"引数のリスト。リストがnilだけの場合、\n" +"{#parse_arguments}メソッドを呼び出しスキップする。" + +# YARD::CLI::Yardoc#parse_arguments +#: ../lib/yard/cli/yardoc.rb:278 +msgid "Parses commandline arguments" +msgstr "コマンドライン引数を解析する" + +# @return [Boolean] +#: ../lib/yard/cli/yardoc.rb:281 +msgid "whether or not arguments are valid" +msgstr "引数が有効かどうか" + +# YARD::CLI::Yardoc#all_objects +#: ../lib/yard/cli/yardoc.rb:317 +msgid "" +"The list of all objects to process. Override this method to change\n" +"which objects YARD should generate documentation for." +msgstr "" +"処理する上での全てのオブジェクトのリスト。\n" +"変更するたびに、このメソッドは上書きするので、\n" +"YARDのオブジェクトは、ドキュメントを生成するべきである。" + +# @deprecated +#: ../lib/yard/cli/yardoc.rb:321 +msgid "To hide methods use the +@private+ tag instead." +msgstr "メソッドを隠すには、代わりに、 +@private+ タグを使う" + +# @return [Array] +#: ../lib/yard/cli/yardoc.rb:321 +msgid "a list of code objects to process" +msgstr "処理する為のコードオブジェクトのリスト" + +# YARD::CLI::Yardoc#yardopts +#: ../lib/yard/cli/yardoc.rb:326 +msgid "Parses the .yardopts file for default yard options" +msgstr "デフォルトのyardオプション用に.yardoptsファイルを解析する。" + +# @return [Array] +#: ../lib/yard/cli/yardoc.rb:327 +msgid "an array of options parsed from .yardopts" +msgstr ".yardoptsから解析されたオプションの配列" + +# YARD::CLI::Yardoc#run_generate +#: ../lib/yard/cli/yardoc.rb:337 +msgid "Generates output for objects" +msgstr "オブジェクト用の出力を生成する" + +# @since +#: ../lib/yard/cli/yardoc.rb:340 ../lib/yard/cli/yri.rb:14 +#: ../lib/yard/cli/yri.rb:180 ../lib/yard/registry.rb:132 +#: ../lib/yard/registry.rb:147 ../lib/yard/registry_store.rb:130 +msgid "0.5.1" +msgstr "" + +# @param [Hash, nil] checksums +#: ../lib/yard/cli/yardoc.rb:340 +msgid "if supplied, a list of checkums for files." +msgstr "提供する場合は、ファイルの為のチェックサムのリスト" + +# @param [Hash, nil] +#: ../lib/yard/cli/yardoc.rb:340 +msgid "tag|param|checksums" +msgstr "" + +# YARD::CLI::Yardoc#verify_markup_options +#: ../lib/yard/cli/yardoc.rb:361 +msgid "" +"Verifies that the markup options are valid before parsing any code.\n" +"Failing early is better than failing late." +msgstr "" +"任意のコードを解析する前に、有効なマークアップオプションを認証する。\n" +"(早期に失敗が分かるほうが、後で失敗するよりいいので)" + +# YARD::CLI::Yardoc#copy_assets +#: ../lib/yard/cli/yardoc.rb:386 +msgid "Copies any assets to the output directory" +msgstr "出力ディレクトリに任意の資産をコピーする。" + +# YARD::CLI::Yardoc#print_list +#: ../lib/yard/cli/yardoc.rb:400 +msgid "Prints a list of all objects" +msgstr "全てのオブジェクトのリストをプリントする" + +# YARD::CLI::Yardoc#parse_yardopts_options +#: ../lib/yard/cli/yardoc.rb:411 +msgid "Parses out the yardopts/document options" +msgstr "yardopts/documentオプションの出力を解析する" + +# YARD::CLI::Yardoc#support_rdoc_document_file! +#: ../lib/yard/cli/yardoc.rb:426 +msgid "Reads a .document file in the directory to get source file globs" +msgstr "" +"ソースファイルのglobを取得する為にディレクトリの中の.documentファイルをロード" +"する" + +# @return [Array] +#: ../lib/yard/cli/yardoc.rb:427 +msgid "an array of files parsed from .document" +msgstr ".documentから解析されたファイルの配列" + +# YARD::CLI::Yardoc#add_extra_files +#: ../lib/yard/cli/yardoc.rb:435 +msgid "Adds a set of extra documentation files to be processed" +msgstr "処理される追加のドキュメントファイルのグループを追加する" + +# @param [Array] +# @param [String, Array] +#: ../lib/yard/cli/yardoc.rb:436 ../lib/yard/cli/yardoc.rb:456 +#: ../lib/yard/i18n/pot_generator.rb:102 +#: ../lib/yard/parser/source_parser.rb:32 +#: ../lib/yard/parser/source_parser.rb:361 ../lib/yard/registry.rb:97 +msgid "tag|param|files" +msgstr "" + +# @param [Array] files +#: ../lib/yard/cli/yardoc.rb:436 +msgid "the set of documentation files" +msgstr "ドキュメントファイルのグループ" + +# YARD::CLI::Yardoc#parse_files +#: ../lib/yard/cli/yardoc.rb:448 +msgid "" +"Parses the file arguments into Ruby files and extra files, which are\n" +"separated by a '-' element." +msgstr "" +"Rubyのファイルと追加のファイルをfilesの引数として解析する。\n" +"それは、'-'要素によって区切られる。" + +# @example Parses a set of Ruby files with a separator and extra files +#: ../lib/yard/cli/yardoc.rb:456 +msgid "parse_files %w(file1 file2 - extrafile1 extrafile2)" +msgstr "" + +# @example Parses a set of Ruby source files +#: ../lib/yard/cli/yardoc.rb:456 +msgid "parse_files %w(file1 file2 file3)" +msgstr "" + +# @example +#: ../lib/yard/cli/yardoc.rb:456 +msgid "tag|example|Parses a set of Ruby files with a separator and extra files" +msgstr "Rubyのファイルと区切りを用いた追加のファイルのグループを解析する" + +# @example +#: ../lib/yard/cli/yardoc.rb:456 +msgid "tag|example|Parses a set of Ruby source files" +msgstr "Rubyソースファイルのグループを解析する" + +# @param [Array] files +#: ../lib/yard/cli/yardoc.rb:456 ../lib/yard/parser/source_parser.rb:32 +msgid "the list of files to parse" +msgstr "解析するファイルのリスト" + +# YARD::CLI::Yardoc#add_visibility_verifier +#: ../lib/yard/cli/yardoc.rb:474 +msgid "Adds verifier rule for visibilities" +msgstr "visibilities用に認証ルールを追加する" + +# YARD::CLI::Yardoc#add_visibility_verifier +#: ../lib/yard/cli/yardoc.rb:482 +msgid "Adds verifier rule for APIs" +msgstr "API用に認証ルールを追加する" + +# YARD::CLI::Yardoc#run_verifier +# YARD::Templates::Helpers::BaseHelper#run_verifier +#: ../lib/yard/cli/yardoc.rb:494 +#: ../lib/yard/templates/helpers/base_helper.rb:24 +msgid "" +"Runs a list of objects against the {Verifier} object passed into the\n" +"template and returns the subset of verified objects." +msgstr "" +"テンプレートへ渡された{Verifier}オブジェクトに対してオブジェクトのリストを起" +"動する。\n" +"そして、認証されたオブジェクトのサブセットを返す。" + +# YARD::CLI::Yardoc#general_options +#: ../lib/yard/cli/yardoc.rb:532 +msgid "Adds general options" +msgstr "全体的なオプションを追加する。" + +# YARD::CLI::Yardoc#yardopts_options +#: ../lib/yard/cli/yardoc.rb:573 +msgid "Adds --[no-]yardopts / --[no-]document" +msgstr "" + +# @since +#: ../lib/yard/cli/yardoc.rb:592 +msgid "0.2.1" +msgstr "" + +# YARD::CLI::Yardoc#output_options +#: ../lib/yard/cli/yardoc.rb:592 +msgid "Adds output options" +msgstr "オプションの出力を追加する。" + +# YARD::CLI::Yardoc#tag_options +#: ../lib/yard/cli/yardoc.rb:741 +msgid "Adds tag options" +msgstr "タグのオプションを追加する。" + +# YARD::CLI::YRI +#: ../lib/yard/cli/yri.rb:6 +msgid "A tool to view documentation in the console like `ri`" +msgstr "`ri`のようなコンソールでドキュメントを調べる為のツール" + +# YARD::CLI::YRI::CACHE_FILE +#: ../lib/yard/cli/yri.rb:8 +msgid "" +"The location in {YARD::CONFIG_DIR} where the YRI cache file is loaded\n" +"from." +msgstr "YRIキャッシュファイルがロードされる、{YARD::CONFIG_DIR}の中の場所" + +# YARD::CLI::YRI::SEARCH_PATHS_FILE +#: ../lib/yard/cli/yri.rb:12 +msgid "" +"A file containing all paths, delimited by newlines, to search for\n" +"yardoc databases." +msgstr "" +"ファイルは、改行によって区切られたyardocデータベース用の検索する為の\n" +"全てのパスを含んでいる。" + +# YARD::CLI::YRI::DEFAULT_SEARCH_PATHS +#: ../lib/yard/cli/yri.rb:17 +msgid "" +"Default search paths that should be loaded dynamically into YRI. These " +"paths\n" +"take precedence over all other paths ({SEARCH_PATHS_FILE} and RubyGems\n" +"paths). To add a path, call:" +msgstr "" +"デフォルトでは、YRIへ動的にロードされるべきパスを検索する。\n" +"これらのパスは、他のパス全てより優先して取得する({SEARCH_PATHS_FILE}と" +"RubyGemsパス)。\n" +"パスを追加するには、次のように呼び出す。" + +# YARD::CLI::YRI::DEFAULT_SEARCH_PATHS +#: ../lib/yard/cli/yri.rb:21 +msgid " DEFAULT_SEARCH_PATHS.push(\"/path/to/.yardoc\")" +msgstr "" + +# @return [Array] +#: ../lib/yard/cli/yri.rb:24 +msgid "a list of extra search paths" +msgstr "追加の検索パスのリスト" + +# @return [YRI] +#: ../lib/yard/cli/yri.rb:30 +msgid "a new instance of YRI" +msgstr "YRIの新しいインスタンス" + +# @example +#: ../lib/yard/cli/yri.rb:49 +msgid "YRI.new.run('String#reverse')" +msgstr "" + +# YARD::CLI::YRI#print_usage +#: ../lib/yard/cli/yri.rb:72 +msgid "Prints the command usage" +msgstr "コマンドの使用法をプリントする。" + +# YARD::CLI::YRI#cache_object +#: ../lib/yard/cli/yri.rb:80 +msgid "" +"Caches the .yardoc file where an object can be found in the {CACHE_FILE}" +msgstr "" +"オブジェクトが{CACHE_FILE}の中を見つけられる場合、\n" +".yardocファイルをキャッシュする。" + +# @param [CodeObjects::Base, nil] +# @param [CodeObjects::Base] +# @param [Base, Proxy, String, Symbol, nil] +# @param [Proxy, CodeObjects::Base] +# @param [CodeObjects::Base, String] +# @param [CodeObjects::Base, CodeObjects::ExtraFileObject, String] +#: ../lib/yard/cli/yri.rb:94 ../lib/yard/code_objects/class_object.rb:122 +#: ../lib/yard/docstring.rb:74 ../lib/yard/docstring.rb:99 +#: ../lib/yard/docstring_parser.rb:106 ../lib/yard/handlers/base.rb:411 +#: ../lib/yard/handlers/base.rb:424 ../lib/yard/handlers/base.rb:433 +#: ../lib/yard/handlers/base.rb:456 ../lib/yard/handlers/base.rb:470 +#: ../lib/yard/handlers/base.rb:483 ../lib/yard/handlers/base.rb:495 +#: ../lib/yard/handlers/base.rb:506 ../lib/yard/handlers/base.rb:520 +#: ../lib/yard/handlers/base.rb:544 ../lib/yard/registry.rb:174 +#: ../lib/yard/registry.rb:182 ../lib/yard/serializers/base.rb:41 +#: ../lib/yard/serializers/base.rb:50 ../lib/yard/serializers/base.rb:61 +#: ../lib/yard/serializers/file_system_serializer.rb:48 +#: ../lib/yard/serializers/file_system_serializer.rb:69 +#: ../lib/yard/server/commands/base.rb:138 ../lib/yard/templates/engine.rb:114 +#: ../lib/yard/templates/helpers/base_helper.rb:102 +#: ../lib/yard/templates/helpers/base_helper.rb:119 +#: ../lib/yard/templates/helpers/base_helper.rb:179 +#: ../lib/yard/templates/helpers/base_helper.rb:193 +#: ../lib/yard/templates/helpers/html_helper.rb:288 +#: ../lib/yard/templates/helpers/uml_helper.rb:8 +#: ../lib/yard/templates/helpers/uml_helper.rb:19 ../lib/yard/verifier.rb:75 +msgid "tag|param|object" +msgstr "" + +# @return [String] +#: ../lib/yard/cli/yri.rb:94 +msgid "the formatted output for an object." +msgstr "オブジェクト用にフォーマットされた出力" + +# @param [CodeObjects::Base] object +#: ../lib/yard/cli/yri.rb:94 +msgid "the object to print." +msgstr "プリントする為のオブジェクト" + +# YARD::CLI::YRI#find_object +#: ../lib/yard/cli/yri.rb:104 +msgid "" +"Locates an object by name starting in the cached paths and then\n" +"searching through any search paths." +msgstr "" +"キャッシュされたパスで始まる名前のオブジェクトを示し、\n" +"その時、任意の検索パスを通して検索する。" + +# @return [CodeObjects::Base] +#: ../lib/yard/cli/yri.rb:109 +msgid "an object if found" +msgstr "見つかった場合は、オブジェクト" + +# @return [nil] +#: ../lib/yard/cli/yri.rb:109 ../lib/yard/registry.rb:235 +msgid "if no object is found" +msgstr "オブジェクトが見つからない場合" + +# @param [String] name +#: ../lib/yard/cli/yri.rb:109 +msgid "the full name of the object" +msgstr "オブジェクトのフルネーム" + +# YARD::CLI::YRI#try_load_object +#: ../lib/yard/cli/yri.rb:134 +msgid "" +"Tries to load the object with name. If successful, caches the object\n" +"with the cache_path" +msgstr "" + +# @param [String] +# @param [Array] +# @param [String, :root] +#: ../lib/yard/cli/yri.rb:141 +msgid "tag|param|cache_path" +msgstr "" + +# @param [String] cache_path +#: ../lib/yard/cli/yri.rb:141 +msgid "" +"the location of the yardoc\n" +"db containing the object to cache for future lookups.\n" +"No caching is done if this is nil." +msgstr "" + +# @return [CodeObjects::Base] +#: ../lib/yard/cli/yri.rb:141 +msgid "the object path" +msgstr "オブジェクトパス" + +# YARD::CLI::YRI#load_cache +#: ../lib/yard/cli/yri.rb:151 +msgid "Loads {CACHE_FILE}" +msgstr "{CACHE_FILE}をロードする" + +# YARD::CLI::YRI#add_gem_paths +#: ../lib/yard/cli/yri.rb:161 +msgid "Adds all RubyGems yardoc files to search paths" +msgstr "パスを検索する為に全てのRubyGemsyardocファイルを追加する\n" + +# YARD::CLI::YRI#add_default_paths +#: ../lib/yard/cli/yri.rb:179 +msgid "Adds paths in {SEARCH_PATHS_FILE}" +msgstr "{SEARCH_PATHS_FILE}の中のパスを追加する。" + +# YARD::CodeObjects::CodeObjectList +#: ../lib/yard/code_objects/base.rb:4 +msgid "" +"A list of code objects. This array acts like a set (no unique items)\n" +"but also disallows any {Proxy} objects from being added." +msgstr "" +"コードオブジェクトのリスト、この配列はグループ(固有の物ではない)のように振る" +"舞う。\n" +"しかしながら、追加される任意の{Proxy}オブジェクトを拒否する。" + +# YARD::CodeObjects::CodeObjectList#initialize +#: ../lib/yard/code_objects/base.rb:7 +msgid "Creates a new object list associated with a namespace" +msgstr "namespaceに関連付けられた新しいオブジェクトのリストを作成する。" + +# @param [NamespaceObject] +#: ../lib/yard/code_objects/base.rb:10 +msgid "tag|param|owner" +msgstr "" + +# @param [NamespaceObject] owner +#: ../lib/yard/code_objects/base.rb:10 +msgid "the namespace the list should be associated with" +msgstr "リストで関連付けられるべき、namespace" + +# YARD::CodeObjects::CodeObjectList#push +# YARD::CodeObjects::CodeObjectList#<< +#: ../lib/yard/code_objects/base.rb:15 ../lib/yard/code_objects/base.rb:28 +msgid "Adds a new value to the list" +msgstr "リストに新しく値を追加する" + +# @param [Base] value +#: ../lib/yard/code_objects/base.rb:18 +msgid "a code object to add" +msgstr "追加するコードオブジェクト" + +# @return [CodeObjectList] +# @return [Proxy] +# @return [SymbolHash] +#: ../lib/yard/code_objects/base.rb:18 ../lib/yard/code_objects/proxy.rb:28 +#: ../lib/yard/core_ext/symbol_hash.rb:65 +msgid "self" +msgstr "" + +# @param +# @param [Base] +# @param [Object] +# @param [String] +# @param [CodeObjects::Base] +#: ../lib/yard/code_objects/base.rb:18 ../lib/yard/code_objects/base.rb:325 +#: ../lib/yard/code_objects/extra_file_object.rb:7 +#: ../lib/yard/code_objects/extra_file_object.rb:8 +#: ../lib/yard/code_objects/extra_file_object.rb:9 +#: ../lib/yard/code_objects/extra_file_object.rb:10 +#: ../lib/yard/code_objects/namespace_object.rb:6 +#: ../lib/yard/code_objects/namespace_object.rb:7 +#: ../lib/yard/code_objects/namespace_object.rb:8 +#: ../lib/yard/core_ext/insertion.rb:13 ../lib/yard/core_ext/symbol_hash.rb:41 +#: ../lib/yard/handlers/base.rb:311 ../lib/yard/handlers/base.rb:314 +#: ../lib/yard/handlers/base.rb:317 ../lib/yard/handlers/base.rb:320 +#: ../lib/yard/handlers/base.rb:333 ../lib/yard/handlers/base.rb:335 +#: ../lib/yard/handlers/base.rb:337 ../lib/yard/handlers/base.rb:339 +#: ../lib/yard/logging.rb:20 ../lib/yard/logging.rb:30 +#: ../lib/yard/options.rb:99 ../lib/yard/parser/c/statement.rb:5 +#: ../lib/yard/parser/c/statement.rb:6 ../lib/yard/parser/c/statement.rb:7 +#: ../lib/yard/parser/c/statement.rb:13 ../lib/yard/parser/c/statement.rb:39 +#: ../lib/yard/parser/c/statement.rb:43 ../lib/yard/parser/c/statement.rb:44 +#: ../lib/yard/parser/c/statement.rb:45 ../lib/yard/parser/c/statement.rb:51 +#: ../lib/yard/parser/c/statement.rb:52 ../lib/yard/parser/c/statement.rb:53 +#: ../lib/yard/parser/ruby/ast_node.rb:41 +#: ../lib/yard/parser/ruby/ast_node.rb:42 +#: ../lib/yard/parser/ruby/ast_node.rb:48 +#: ../lib/yard/parser/ruby/legacy/ruby_lex.rb:485 +#: ../lib/yard/parser/ruby/legacy/ruby_lex.rb:486 +#: ../lib/yard/parser/ruby/legacy/ruby_lex.rb:487 +#: ../lib/yard/parser/ruby/legacy/statement.rb:5 +#: ../lib/yard/parser/ruby/legacy/statement.rb:11 +#: ../lib/yard/parser/ruby/legacy/statement_list.rb:6 +#: ../lib/yard/registry_store.rb:52 ../lib/yard/tags/option_tag.rb:4 +#: ../lib/yard/tags/ref_tag.rb:4 ../lib/yard/tags/ref_tag_list.rb:4 +#: ../lib/yard/templates/helpers/base_helper.rb:4 +#: ../lib/yard/templates/helpers/base_helper.rb:206 +#: ../lib/yard/templates/helpers/markup/rdoc_markup.rb:23 +#: ../lib/yard/templates/helpers/markup/rdoc_markup.rb:68 +#: ../lib/yard/templates/template.rb:6 ../lib/yard/templates/template.rb:59 +msgid "tag|param|value" +msgstr "" + +# YARD::CodeObjects::NSEP +#: ../lib/yard/code_objects/base.rb:32 +msgid "Namespace separator" +msgstr "Namespace separator(ネームスペース区切り)" + +# YARD::CodeObjects::NSEPQ +#: ../lib/yard/code_objects/base.rb:35 +msgid "Regex-quoted namespace separator" +msgstr "" +"Regex-quoted namespace separator(クオートされた正規表現ネームスペース区切り)" + +# YARD::CodeObjects::ISEP +#: ../lib/yard/code_objects/base.rb:38 +msgid "Instance method separator" +msgstr "Instance method separator(インスタンスメソッドの区切り)" + +# YARD::CodeObjects::ISEPQ +#: ../lib/yard/code_objects/base.rb:41 +msgid "Regex-quoted instance method separator" +msgstr "" +"Regex-quoted instance method separator(正規表現でクオートされたインスタンスメ" +"ソッド区切り)" + +# YARD::CodeObjects::CSEP +#: ../lib/yard/code_objects/base.rb:44 +msgid "Class method separator" +msgstr "Class method separator(クラスメソッド区切り)" + +# YARD::CodeObjects::CSEPQ +#: ../lib/yard/code_objects/base.rb:47 +msgid "Regex-quoted class method separator" +msgstr "" +"Regex-quoted class method separator(正規表現でクオートされたクラスメソッド区" +"切り)" + +# YARD::CodeObjects::CONSTANTMATCH +#: ../lib/yard/code_objects/base.rb:50 +msgid "Regular expression to match constant name" +msgstr "Regular expression to match constant name(定数名にマッチする正規表現)" + +# YARD::CodeObjects::NAMESPACEMATCH +#: ../lib/yard/code_objects/base.rb:53 +msgid "Regular expression to match namespaces (const A or complex path A::B)" +msgstr "namespaceにマッチする正規表現(const A or complex path A::B)" + +# YARD::CodeObjects::METHODNAMEMATCH +#: ../lib/yard/code_objects/base.rb:56 +msgid "Regular expression to match a method name" +msgstr "メソッド名にマッチする正規表現" + +# YARD::CodeObjects::METHODMATCH +#: ../lib/yard/code_objects/base.rb:59 +msgid "" +"Regular expression to match a fully qualified method def (self.foo, Class." +"foo)." +msgstr "全てに有効なメソッド定義(self.foo Class.fooなど)にマッチする正規表現" + +# YARD::CodeObjects::BUILTIN_EXCEPTIONS +#: ../lib/yard/code_objects/base.rb:62 +msgid "All builtin Ruby exception classes for inheritance tree." +msgstr "継承ツリー用の全ての組み込みRuby例外クラス" + +# YARD::CodeObjects::BUILTIN_CLASSES +#: ../lib/yard/code_objects/base.rb:68 +msgid "All builtin Ruby classes for inheritance tree." +msgstr "継承ツリー用の全てのRubyクラス" + +# @note +#: ../lib/yard/code_objects/base.rb:69 +msgid "MatchingData is a 1.8.x legacy class" +msgstr "マッチデータが1.8以降のレガシーケースの場合\n" + +# YARD::CodeObjects::BUILTIN_MODULES +#: ../lib/yard/code_objects/base.rb:74 +msgid "All builtin Ruby modules for mixin handling." +msgstr "mixin操作用の全てのRuby組み込みモジュール" + +# YARD::CodeObjects::BUILTIN_ALL +#: ../lib/yard/code_objects/base.rb:77 +msgid "All builtin Ruby classes and modules." +msgstr "全ての組み込みRubyクラスやモジュール" + +# YARD::CodeObjects::BUILTIN_EXCEPTIONS_HASH +#: ../lib/yard/code_objects/base.rb:80 +msgid "" +"Hash of {BUILTIN_EXCEPTIONS} as keys and true as value (for O(1) lookups)" +msgstr "{BUILTIN_EXCEPTIONS}のキーと,値がtrueのハッシュ,(for O(1) lookups)" + +# YARD::CodeObjects::Base +#: ../lib/yard/code_objects/base.rb:83 +msgid "" +"+Base+ is the superclass of all code objects recognized by YARD. A code\n" +"object is any entity in the Ruby language (class, method, module). A\n" +"DSL might subclass +Base+ to create a new custom object representing\n" +"a new entity type." +msgstr "" +"+Base+ は、YARDによって表される全てのコードオブジェクトのスーパークラスとな" +"る。\n" +"コードオブジェクトは、Ruby言語の中の何らかの(class,method,module)構成要素とな" +"る。\n" +"DSLは新しい構成要素の型で表されるカスタムオブジェクトを作成する為に、\n" +"+Base+ をサブクラスとするかもしれない。\n" + +# YARD::CodeObjects::Base +#: ../lib/yard/code_objects/base.rb:88 +msgid "" +"== Registry Integration\n" +"Any created object associated with a namespace is immediately registered\n" +"with the registry. This allows the Registry to act as an identity map\n" +"to ensure that no object is represented by more than one Ruby object\n" +"in memory. A unique {#path} is essential for this identity map to work\n" +"correctly." +msgstr "" +"== レジストリーの統合\n" +"namespaceと共に関連付けられ作成される任意のオブジェクトは、レジストリーと共に直ぐに記録される。\n" +"これは、メモリの中で一つ以上のRubyオブジェクトによって表される事を保証し、\n" +"レジストリーが独自のマップの様に振る舞う事を受け入れる。\n" +"固有の{#path}メソッドは、この独自のマップを正常に機能させる為に必須のものである。" + +# YARD::CodeObjects::Base +#: ../lib/yard/code_objects/base.rb:95 +msgid "" +"== Custom Attributes\n" +"Code objects allow arbitrary custom attributes to be set using the\n" +"{#[]=} assignment method." +msgstr "" + +# YARD::CodeObjects::Base +#: ../lib/yard/code_objects/base.rb:99 +msgid "" +"== Namespaces\n" +"There is a special type of object called a \"namespace\". These are " +"subclasses\n" +"of the {NamespaceObject} and represent Ruby entities that can have\n" +"objects defined within them. Classically these are modules and classes,\n" +"though a DSL might create a custom {NamespaceObject} to describe a\n" +"specific set of objects." +msgstr "" +"== Namespaces\n" +"\"namespace\"に呼び出されるオブジェクトの特別な型がある。\n" +"これらは{NamespaceObject}をサブクラス化し、\n" +"それらの中で定義されるオブジェクトが持つ事が出来るRubyの構成要素を表す。\n" +"オーソドックスなこれらのモジュールやクラスは、\n" +"DSLが特定のオブジェクトのグループを説明する為に、\n" +"カスタム{NamespaceObject}を作成するかもしれない。\n" + +# @abstract +#: ../lib/yard/code_objects/base.rb:111 +msgid "" +"This class should not be used directly. Instead, create a\n" +"subclass that implements {#path}, {#sep} or {#type}." +msgstr "" +"このクラスは、直接利用するべきではない。\n" +"代わりに、{#path}, {#sep} , {#type}メソッドを実装するサブクラスを作成する。" + +# @see +#: ../lib/yard/code_objects/base.rb:111 ../lib/yard/code_objects/base.rb:312 +msgid "tag|see|#[]=" +msgstr "" + +# @see +#: ../lib/yard/code_objects/base.rb:111 +msgid "tag|see|#path" +msgstr "" + +# @see +#: ../lib/yard/code_objects/base.rb:111 +msgid "tag|see|NamespaceObject" +msgstr "" + +# @see +#: ../lib/yard/code_objects/base.rb:111 ../lib/yard/registry_store.rb:8 +msgid "tag|see|Registry" +msgstr "" + +# YARD::CodeObjects::Base#files +#: ../lib/yard/code_objects/base.rb:113 +msgid "The files the object was defined in. To add a file, use {#add_file}." +msgstr "" +"中で定義されたオブジェクトから成るファイル、\n" +"ファイルを追加するには、{#add_file}メソッドを使う。" + +# @return [Array] +#: ../lib/yard/code_objects/base.rb:115 ../lib/yard/rake/yardoc_task.rb:24 +msgid "a list of files" +msgstr "ファイルのリスト" + +# @see +#: ../lib/yard/code_objects/base.rb:115 +msgid "tag|see|#add_file" +msgstr "" + +# YARD::CodeObjects::Base#namespace +# YARD::CodeObjects::Base#parent +#: ../lib/yard/code_objects/base.rb:118 ../lib/yard/code_objects/base.rb:496 +msgid "" +"The namespace the object is defined in. If the object is in the\n" +"top level namespace, this is {Registry.root}" +msgstr "" +"中で定義されるオブジェクトから成るnamespace,オブジェクトがtop level namespace" +"の場合、\n" +"これは、{Registry.root}になる。" + +# @return [NamespaceObject] +#: ../lib/yard/code_objects/base.rb:120 +msgid "the namespace object" +msgstr "namespaceオブジェクト" + +# YARD::CodeObjects::Base#source +#: ../lib/yard/code_objects/base.rb:123 +msgid "The source code associated with the object" +msgstr "オブジェクトに関連付けられたソースコード" + +# @return [String, nil] +#: ../lib/yard/code_objects/base.rb:124 +msgid "source, if present, or nil" +msgstr "存在する場合はソース,そうでなけば、nil" + +# YARD::CodeObjects::Base#source_type +# YARD::CodeObjects::Base#source_type= +#: ../lib/yard/code_objects/base.rb:127 +msgid "" +"Language of the source code associated with the object. Defaults to\n" +"+:ruby+." +msgstr "" +"オブジェクトと共に関連付けられたソースコードの言語。\n" +"デフォルトは +:ruby+ 。" + +# @return [Symbol] +#: ../lib/yard/code_objects/base.rb:130 +msgid "the language type" +msgstr "言語の型" + +# YARD::CodeObjects::Base#signature +# YARD::CodeObjects::Base#signature= +#: ../lib/yard/code_objects/base.rb:133 +msgid "" +"The one line signature representing an object. For a method, this will\n" +"be of the form \"def meth(arguments...)\". This is usually the first\n" +"source line." +msgstr "" +"オブジェクトを一行の用法で表している。メソッド用、\n" +"これは、\"def meth(arguments...)\"のような形式になるだろう。\n" +"普通は、最初のソースの最初の行となる。" + +# @return [String] +#: ../lib/yard/code_objects/base.rb:137 +msgid "a line of source" +msgstr "ソースの行" + +# YARD::CodeObjects::Base#docstring +#: ../lib/yard/code_objects/base.rb:140 +msgid "The documentation string associated with the object" +msgstr "オブジェクトに関連付けられたドキュメント文字列" + +# @return [Docstring] +#: ../lib/yard/code_objects/base.rb:141 ../lib/yard/code_objects/base.rb:367 +msgid "the documentation string" +msgstr "ドキュメント文字列(docstring)" + +# YARD::CodeObjects::Base#dynamic +# YARD::CodeObjects::Base#dynamic= +#: ../lib/yard/code_objects/base.rb:144 +msgid "Marks whether or not the method is conditionally defined at runtime" +msgstr "メソッドが実行時に定義された条件となるか、マークする。" + +# @return [Boolean] +#: ../lib/yard/code_objects/base.rb:145 +msgid "true if the method is conditionally defined at runtime" +msgstr "メソッドが実行時に定義された条件となる場合、true" + +# @return [String] +#: ../lib/yard/code_objects/base.rb:149 +msgid "the group this object is associated with" +msgstr "このオブジェクトに関連付けられたグループ" + +# YARD::CodeObjects::Base#dynamic? +#: ../lib/yard/code_objects/base.rb:152 +msgid "Is the object defined conditionally at runtime?" +msgstr "オブジェクトが実行時に条件が定義されたか?" + +# @see +#: ../lib/yard/code_objects/base.rb:153 +msgid "tag|see|#dynamic" +msgstr "" + +# @return [Symbol] +#: ../lib/yard/code_objects/base.rb:156 ../lib/yard/code_objects/base.rb:158 +msgid "the visibility of an object (:public, :private, :protected)" +msgstr "オブジェクトの可視性(:public, :private, :protected)" + +# YARD::CodeObjects::Base.new +#: ../lib/yard/code_objects/base.rb:162 +msgid "Allocates a new code object" +msgstr "新しいコードオブジェクトを割り当てる。" + +# @see +#: ../lib/yard/code_objects/base.rb:164 +#: ../lib/yard/code_objects/extended_method_object.rb:21 +msgid "tag|see|#initialize" +msgstr "" + +# YARD::CodeObjects::Base.=== +#: ../lib/yard/code_objects/base.rb:185 +msgid "Compares the class with subclasses" +msgstr "サブクラスとクラスを比較する" + +# @param [Object] +# @param [Base, Proxy] +# @param [Base, String] +# @param [Docstring, String] +#: ../lib/yard/code_objects/base.rb:188 ../lib/yard/code_objects/base.rb:233 +#: ../lib/yard/code_objects/base.rb:292 ../lib/yard/code_objects/base.rb:430 +#: ../lib/yard/docstring.rb:112 ../lib/yard/i18n/message.rb:48 +#: ../lib/yard/i18n/messages.rb:44 +msgid "tag|param|other" +msgstr "" + +# @param [Object] other +#: ../lib/yard/code_objects/base.rb:188 +msgid "the other object to compare classes with" +msgstr "クラスと比較する他のオブジェクト" + +# @return [Boolean] +#: ../lib/yard/code_objects/base.rb:188 +msgid "true if other is a subclass of self" +msgstr "otherが自身のサブクラスの場合、true" + +# YARD::CodeObjects::Base#initialize +#: ../lib/yard/code_objects/base.rb:194 +msgid "Creates a new code object" +msgstr "新しいコードオブジェクトを作成する。" + +# @example Create a method in the root namespace +#: ../lib/yard/code_objects/base.rb:207 +msgid "CodeObjects::Base.new(:root, '#method') # => #" +msgstr "" + +# @example Create class Z inside namespace X::Y +#: ../lib/yard/code_objects/base.rb:207 +msgid "" +"CodeObjects::Base.new(P(\"X::Y\"), :Z) # or\n" +"CodeObjects::Base.new(Registry.root, \"X::Y\")" +msgstr "" + +# @yield [self] +#: ../lib/yard/code_objects/base.rb:207 +msgid "a block to perform any extra initialization on the object" +msgstr "オブジェクト上で任意の追加のイニシャライズを実行するblock" + +# @example +#: ../lib/yard/code_objects/base.rb:207 +msgid "tag|example|Create a method in the root namespace" +msgstr "root namespaceの中にメソッドを作成する" + +# @example +#: ../lib/yard/code_objects/base.rb:207 +msgid "tag|example|Create class Z inside namespace X::Y" +msgstr "namespace X::Yの中にZクラスを作成する。" + +# @param [NamespaceObject] +# @param [CodeObjects::NamespaceObject, nil] +# @param [CodeObjects::NamespaceObject] +#: ../lib/yard/code_objects/base.rb:207 +#: ../lib/yard/code_objects/method_object.rb:33 ../lib/yard/registry.rb:270 +#: ../lib/yard/registry.rb:368 +msgid "tag|param|namespace" +msgstr "namespace" + +# @yieldparam [Base] +#: ../lib/yard/code_objects/base.rb:207 +msgid "tag|yieldparam|self" +msgstr "self" + +# @param [Symbol, String] name +#: ../lib/yard/code_objects/base.rb:207 +msgid "the name (or complex path) of the object." +msgstr "オブジェクトの名前(又は、complex path)" + +# @param [NamespaceObject] namespace +#: ../lib/yard/code_objects/base.rb:207 +msgid "" +"the namespace the object belongs in,\n" +"{Registry.root} or :root should be provided if it is associated with\n" +"the top level namespace." +msgstr "" +"その中でオブジェクトの属するnamespace,\n" +"top level namespaceと共に、\n" +"{Registry.root} と :rootは、提供されるべきである。" + +# @return [Base] +# @return [MacroObject] +#: ../lib/yard/code_objects/base.rb:207 +#: ../lib/yard/code_objects/macro_object.rb:39 +msgid "the newly created object" +msgstr "新たに作成されたオブジェクト" + +# @yieldparam [Base] self +#: ../lib/yard/code_objects/base.rb:207 +msgid "the newly initialized code object" +msgstr "新たにinitializeされるコードオジェクト" + +# YARD::CodeObjects::Base#copy_to +#: ../lib/yard/code_objects/base.rb:228 +msgid "" +"Copies all data in this object to another code object, except for\n" +"uniquely identifying information (path, namespace, name, scope)." +msgstr "" + +# @return [CodeObjects::Base] +#: ../lib/yard/code_objects/base.rb:233 +msgid "the object to copy data to" +msgstr "オブジェクトにデータをコピーする為のオブジェクト" + +# @return [CodeObjects::RootObject] +#: ../lib/yard/code_objects/base.rb:233 +msgid "the other object" +msgstr "他のオブジェクト" + +# YARD::CodeObjects::Base#name +# YARD::CodeObjects::Proxy#name +#: ../lib/yard/code_objects/base.rb:243 ../lib/yard/code_objects/proxy.rb:71 +msgid "The name of the object" +msgstr "オブジェクトの名前" + +# @return [Symbol] +#: ../lib/yard/code_objects/base.rb:248 +msgid "if prefix is false, the symbolized name" +msgstr "prefixがfalseの場合、シンボル化される名前" + +# @return [String] +#: ../lib/yard/code_objects/base.rb:248 +msgid "" +"if prefix is true, prefix + the name as a String.\n" +"This must be implemented by the subclass." +msgstr "" +"prefixがtrueの場合、prefix + 名前の文字列となる。\n" +"これは、サブクラスによって実装されなければならない。" + +# @param [Boolean] +#: ../lib/yard/code_objects/base.rb:248 +#: ../lib/yard/code_objects/method_object.rb:170 +msgid "tag|param|prefix" +msgstr "prefix" + +# @param [Boolean] prefix +#: ../lib/yard/code_objects/base.rb:248 +msgid "" +"whether to show a prefix. Implement\n" +"this in a subclass to define how the prefix is showed." +msgstr "" +"prefixを見せるかどうか。\n" +"prefixがどのようにみせられるか定義する為に、\n" +"このサブクラスの中で実装する。" + +# YARD::CodeObjects::Base#add_file +#: ../lib/yard/code_objects/base.rb:253 +msgid "" +"Associates a file with a code object, optionally adding the line where it " +"was defined.\n" +"By convention, '' should be used to associate code that comes form " +"standard input." +msgstr "" +"コードオブジェクトと共に、ファイルを関連付け、\n" +"定義された場所で任意で行を追加する。\n" +"慣習で、''は、標準入力形式で入って来るコードに関連付けて利用されるべき" +"である。" + +# @param [Boolean] +#: ../lib/yard/code_objects/base.rb:260 +msgid "tag|param|has_comments" +msgstr "has_comments" + +# @param [Fixnum, nil] +#: ../lib/yard/code_objects/base.rb:260 ../lib/yard/i18n/message.rb:34 +msgid "tag|param|line" +msgstr "param|line" + +# @param [String] file +#: ../lib/yard/code_objects/base.rb:260 +msgid "the filename ('' for standard input)" +msgstr "ファイル名('' は標準入力用)" + +# @param [Fixnum, nil] line +#: ../lib/yard/code_objects/base.rb:260 +msgid "the line number where the object lies in the file" +msgstr "ファイルの中でオブジェクトが位置する,行数" + +# @param [Boolean] has_comments +#: ../lib/yard/code_objects/base.rb:260 +msgid "" +"whether or not the definition has comments associated. This\n" +"will allow {#file} to return the definition where the comments were made " +"instead\n" +"of any empty definitions that might have been parsed before (module " +"namespaces for instance)." +msgstr "" +"定義が関連付けられたコメントを持っているかどうか。\n" +"これは、解析される前に(例えば、module namespace)、空の定義の代わりに任意の作" +"られたコメントで、\n" +"定義を返す為に、{#file}メソッドを受け入れる。" + +# YARD::CodeObjects::Base#file +#: ../lib/yard/code_objects/base.rb:273 +msgid "" +"Returns the filename the object was first parsed at, taking\n" +"definitions with docstrings first." +msgstr "" +"オブジェクトが、最初に解析された所で、\n" +"最初のdocstringと共に、定義を取ってくるファイル名を返す" + +# @return [String] +#: ../lib/yard/code_objects/base.rb:276 +msgid "a filename" +msgstr "ファイル名" + +# YARD::CodeObjects::Base#line +#: ../lib/yard/code_objects/base.rb:281 +msgid "Returns the line the object was first parsed at (or nil)" +msgstr "オブジェクトが、最初に解析された所(又は、nil)の行を返す" + +# @return [nil] +#: ../lib/yard/code_objects/base.rb:284 +msgid "if there is no line associated with the object" +msgstr "オブジェクトと共に関連付けられた行がない場合" + +# @return [Fixnum] +#: ../lib/yard/code_objects/base.rb:284 +msgid "the line where the object was first defined." +msgstr "オブジェクトが最初に定義された所の行" + +# YARD::CodeObjects::Base#equal? +# YARD::CodeObjects::Base#== +# YARD::CodeObjects::Base#eql? +#: ../lib/yard/code_objects/base.rb:289 ../lib/yard/code_objects/base.rb:300 +#: ../lib/yard/code_objects/base.rb:301 +msgid "Tests if another object is equal to this, including a proxy" +msgstr "他のオブジェクトがBaseとイコールかProxyを含んでいるかテストする。" + +# @param [Base, Proxy] other +#: ../lib/yard/code_objects/base.rb:292 +msgid "" +"if other is a {Proxy}, tests if\n" +"the paths are equal" +msgstr "" +"pathがイコールの場合、\n" +"otherが{Proxy}か、テストする。\n" + +# @return [Boolean] +#: ../lib/yard/code_objects/base.rb:292 +msgid "whether or not the objects are considered the same" +msgstr "オブジェクトが同じものかどうか判断する" + +# @return [Integer] +#: ../lib/yard/code_objects/base.rb:303 ../lib/yard/code_objects/proxy.rb:138 +msgid "the object's hash value (for equality checking)" +msgstr "オブジェクトのハッシュ値(イコールかチェック用)" + +# @return [nil] +#: ../lib/yard/code_objects/base.rb:306 +msgid "this object does not turn into an array" +msgstr "このオブジェクトは配列にはできない" + +# YARD::CodeObjects::Base#[] +#: ../lib/yard/code_objects/base.rb:309 +msgid "Accesses a custom attribute on the object" +msgstr "オブジェクト上のカスタム属性にアクセスする" + +# @param [#to_s] +# @param [String, Symbol] +# @param [#to_sym] +#: ../lib/yard/code_objects/base.rb:312 ../lib/yard/code_objects/base.rb:325 +#: ../lib/yard/core_ext/symbol_hash.rb:41 +#: ../lib/yard/core_ext/symbol_hash.rb:48 +#: ../lib/yard/core_ext/symbol_hash.rb:53 +#: ../lib/yard/core_ext/symbol_hash.rb:58 ../lib/yard/options.rb:79 +#: ../lib/yard/options.rb:90 ../lib/yard/options.rb:99 +#: ../lib/yard/options.rb:204 ../lib/yard/registry_store.rb:31 +#: ../lib/yard/registry_store.rb:52 ../lib/yard/registry_store.rb:72 +msgid "tag|param|key" +msgstr "key" + +# @return [Object, nil] +#: ../lib/yard/code_objects/base.rb:312 +msgid "the custom attribute or nil if not found." +msgstr "カスタム属性や見つからなかった場合はnilを返す" + +# @param [#to_s] key +#: ../lib/yard/code_objects/base.rb:312 ../lib/yard/code_objects/base.rb:325 +msgid "the name of the custom attribute" +msgstr "カスタム属性の名前" + +# YARD::CodeObjects::Base#[]= +#: ../lib/yard/code_objects/base.rb:321 +msgid "Sets a custom attribute on the object" +msgstr "オブジェクトにカスタム属性を設定する" + +# @see +#: ../lib/yard/code_objects/base.rb:325 +msgid "tag|see|#[]" +msgstr "" + +# @param [Object] value +#: ../lib/yard/code_objects/base.rb:325 +msgid "the value to associate" +msgstr "関連する値" + +# @overload +#: ../lib/yard/code_objects/base.rb:342 +msgid "tag|overload|dynamic_attr_name" +msgstr "dynamic_attr_name" + +# @overload +#: ../lib/yard/code_objects/base.rb:342 +msgid "tag|overload|dynamic_attr_name=" +msgstr "dynamic_attr_name=" + +# YARD::CodeObjects::Base#source= +#: ../lib/yard/code_objects/base.rb:353 +msgid "Attaches source code to a code object with an optional file location" +msgstr "" +"任意のファイルの場所と共にコードオブジェクトの為にソースコードを追加する。" + +# @param [#source, String] +# @param +#: ../lib/yard/code_objects/base.rb:357 ../lib/yard/handlers/base.rb:198 +#: ../lib/yard/handlers/processor.rb:149 +msgid "tag|param|statement" +msgstr "statement" + +# @param [#source, String] statement +#: ../lib/yard/code_objects/base.rb:357 +msgid "" +"the +Parser::Statement+ holding the source code or the raw source\n" +"as a +String+ for the definition of the code object only (not the block)" +msgstr "" +"+Parser::Statement+ はソースコードや\n" +"コードオブジェクトだけの定義用に(blockではない)\n" +" +String+ のような未加工のソースを保持する。" + +# YARD::CodeObjects::Base#docstring= +#: ../lib/yard/code_objects/base.rb:382 +msgid "" +"Attaches a docstring to a code object by parsing the comments attached to " +"the statement\n" +"and filling the {#tags} and {#docstring} methods with the parsed information." +msgstr "" +"ステートメントに添付されたコメントを解析する事によって、\n" +"コードオブジェクトにdocstringを追加する。\n" +"そして、解析された情報と共に、{#tags}や{#docstring}メソッドを埋め込む。" + +# @param [String, Array, Docstring] +# @param [String] +#: ../lib/yard/code_objects/base.rb:387 ../lib/yard/docstring.rb:310 +msgid "tag|param|comments" +msgstr "comments" + +# @param [String, Array, Docstring] comments +#: ../lib/yard/code_objects/base.rb:387 +msgid "" +"the comments attached to the code object to be parsed\n" +"into a docstring and meta tags." +msgstr "" +"docstringとメタタグの中を解析する為に、コードオブジェクトに追加される,コメン" +"ト" + +# YARD::CodeObjects::Base#type +#: ../lib/yard/code_objects/base.rb:402 +msgid "" +"Default type is the lowercase class name without the \"Object\" suffix.\n" +"Override this method to provide a custom object type" +msgstr "" +"デフォルトの型は\"Object\"サフィックスなしの小文字のクラス名となる。\n" +"このメソッドを上書きする為にカスタムオブジェクト型を提供する。" + +# @return [Symbol] +#: ../lib/yard/code_objects/base.rb:405 +msgid "the type of code object this represents" +msgstr "これを表すコードオブジェクトの型" + +# YARD::CodeObjects::Base#path +# YARD::CodeObjects::Base#to_s +#: ../lib/yard/code_objects/base.rb:410 ../lib/yard/code_objects/base.rb:426 +msgid "" +"Represents the unique path of the object. The default implementation\n" +"joins the path of {#namespace} with {#name} via the value of {#sep}.\n" +"Custom code objects should ensure that the path is unique to the code\n" +"object by either overriding {#sep} or this method." +msgstr "" +"オブジェクトの固有のパスを表す。\n" +"デフォルトの実装は、{#sep}の値を挟んで{#namespace} と {#name}のパスを加え" +"た、\n" +"実装となる。\n" +"カスタムコードオブジェクトは、{#sep}メソッドやこのメソッドによって\n" +"固有のパスが確保されるべきである。" + +# @example The path of an instance method +#: ../lib/yard/code_objects/base.rb:418 +msgid "MethodObject.new(P(\"A::B\"), :c).path # => \"A::B#c\"" +msgstr "" + +# @example +#: ../lib/yard/code_objects/base.rb:418 +msgid "tag|example|The path of an instance method" +msgstr "インスタンスメソッドのパス" + +# @see +#: ../lib/yard/code_objects/base.rb:418 +msgid "tag|see|#sep" +msgstr "" + +# @return [String] +#: ../lib/yard/code_objects/base.rb:418 +msgid "the unique path of the object" +msgstr "オブジェクトの固有のパス" + +# @param [Base, String] other +#: ../lib/yard/code_objects/base.rb:430 +msgid "another code object (or object path)" +msgstr "他のコードオブジェクト(又は、オブジェクトのパス)" + +# @return [String] +#: ../lib/yard/code_objects/base.rb:430 +msgid "the shortest relative path from this object to +other+" +msgstr "このオブジェクトから +other+ への最短の相対パス" + +# YARD::CodeObjects::Base#format +#: ../lib/yard/code_objects/base.rb:451 +msgid "Renders the object using the {Templates::Engine templating system}." +msgstr "{Templates::Engine templating system}によってオブジェクトを表示する。" + +# @param [Hash] options +#: ../lib/yard/code_objects/base.rb:463 +msgid "a set of options to pass to the template" +msgstr "テンプレートに渡すoptionのグループ" + +# @example Formats a method in html with rdoc markup +#: ../lib/yard/code_objects/base.rb:463 +msgid "puts P('MyClass#meth').format(:format => :html, :markup => :rdoc)" +msgstr "" + +# @example Formats a class in plaintext +#: ../lib/yard/code_objects/base.rb:463 +msgid "puts P('MyClass').format" +msgstr "" + +# @example +#: ../lib/yard/code_objects/base.rb:463 +msgid "tag|example|Formats a class in plaintext" +msgstr "プレーンテキストでクラスを書式化する" + +# @example +#: ../lib/yard/code_objects/base.rb:463 +msgid "tag|example|Formats a method in html with rdoc markup" +msgstr "rdocマークアップと共に、htmlで、メソッドを書式化する" + +# @option +#: ../lib/yard/code_objects/base.rb:463 ../lib/yard/i18n/text.rb:11 +#: ../lib/yard/templates/engine.rb:81 ../lib/yard/templates/engine.rb:140 +msgid "tag|option|options" +msgstr "" + +# @param [Hash] +#: ../lib/yard/code_objects/base.rb:463 ../lib/yard/i18n/text.rb:11 +#: ../lib/yard/templates/engine.rb:81 ../lib/yard/templates/engine.rb:100 +#: ../lib/yard/templates/engine.rb:140 ../lib/yard/templates/template.rb:37 +msgid "tag|param|options" +msgstr "" + +# @return [String] +#: ../lib/yard/code_objects/base.rb:463 ../lib/yard/templates/engine.rb:81 +msgid "the rendered template" +msgstr "テンプレートを表示する。" + +# YARD::CodeObjects::Base#inspect +#: ../lib/yard/code_objects/base.rb:469 +msgid "Inspects the object, returning the type and path" +msgstr "オブジェクトを検査し、型とパスを返す。" + +# @return [String] +#: ../lib/yard/code_objects/base.rb:470 +msgid "a string describing the object" +msgstr "オブジェクトを説明する文字列" + +# YARD::CodeObjects::Base#namespace= +# YARD::CodeObjects::Base#parent= +#: ../lib/yard/code_objects/base.rb:475 ../lib/yard/code_objects/base.rb:497 +msgid "Sets the namespace the object is defined in." +msgstr "中で定義されるオブジェクトのnamespaceを設定する。" + +# @param [String, CodeObjects::Base] +# @param [NamespaceObject, :root, nil] +# @param [MethodObject] +#: ../lib/yard/code_objects/base.rb:479 +#: ../lib/yard/code_objects/extended_method_object.rb:16 +#: ../lib/yard/templates/helpers/html_helper.rb:309 +msgid "tag|param|obj" +msgstr "obj" + +# @param [NamespaceObject, :root, nil] obj +#: ../lib/yard/code_objects/base.rb:479 +msgid "" +"the new namespace (:root\n" +"for {Registry.root}). If obj is nil, the object is unregistered\n" +"from the Registry." +msgstr "" +"新しいnamespace({Registry.root}用の:root)\n" +"objがnilの場合、記録されたオブジェクトはレジストリから戻される。" + +# YARD::CodeObjects::Base#tag +#: ../lib/yard/code_objects/base.rb:499 +msgid "Gets a tag from the {#docstring}" +msgstr "{#docstring}メソッドから、取得する。" + +# @see +#: ../lib/yard/code_objects/base.rb:500 +msgid "tag|see|Docstring#tag" +msgstr "" + +# YARD::CodeObjects::Base#tags +#: ../lib/yard/code_objects/base.rb:503 +msgid "Gets a list of tags from the {#docstring}" +msgstr "{#docstring}メソッドから、タグのリストを取得する。" + +# @see +#: ../lib/yard/code_objects/base.rb:504 +msgid "tag|see|Docstring#tags" +msgstr "" + +# YARD::CodeObjects::Base#has_tag? +#: ../lib/yard/code_objects/base.rb:507 +msgid "Tests if the {#docstring} has a tag" +msgstr "{#docstring}メソッドがタグを持つ場合、テストする。" + +# @see +#: ../lib/yard/code_objects/base.rb:508 +msgid "tag|see|Docstring#has_tag?" +msgstr "" + +# @return [Boolean] +#: ../lib/yard/code_objects/base.rb:511 +msgid "whether or not this object is a RootObject" +msgstr "このオブジェクトがRootObjectかどうか" + +# YARD::CodeObjects::Base#sep +#: ../lib/yard/code_objects/base.rb:514 +msgid "" +"Override this method with a custom component separator. For instance,\n" +"{MethodObject} implements sep as '#' or '.' (depending on if the\n" +"method is instance or class respectively). {#path} depends on this\n" +"value to generate the full path in the form: namespace.path + sep + name" +msgstr "" +"このメソッドは、区切りのカスタム構成を上書きする。\n" +"例えば、{MethodObject}は'#'や'.'のような区切りを実装する。\n" +"(メソッドのインスタンスやクラスの関係に依存している)\n" +"{#path}メソッドは namespace.path + sep + name の形式で、\n" +"フルパスを生成する為、この値に依存している。" + +# @return [String] +#: ../lib/yard/code_objects/base.rb:520 +msgid "" +"the component that separates the namespace path\n" +"and the name (default is {NSEP})" +msgstr "namespace path と name で区切る構成となる。(デフォルトは{NSEP})" + +# YARD::CodeObjects::Base#copyable_attributes +#: ../lib/yard/code_objects/base.rb:525 +msgid "" +"Override this method if your code object subclass does not allow\n" +"copying of certain attributes." +msgstr "" + +# @see +#: ../lib/yard/code_objects/base.rb:531 +msgid "tag|see|#copy_to" +msgstr "" + +# @return [Array] +#: ../lib/yard/code_objects/base.rb:531 +msgid "" +"the list of instance variable names (without\n" +"\"@\" prefix) that should be copied when {#copy_to} is called" +msgstr "" + +# YARD::CodeObjects::Base#format_source +#: ../lib/yard/code_objects/base.rb:540 +msgid "Formats source code by removing leading indentation" +msgstr "インデントを読み込み削除する事によってソースコードを書式化する" + +# @return [String] +#: ../lib/yard/code_objects/base.rb:543 +msgid "formatted source" +msgstr "書式化されたソース" + +# @param [Symbol] +# @param [String] +#: ../lib/yard/code_objects/base.rb:543 ../lib/yard/parser/base.rb:25 +#: ../lib/yard/server/library_version.rb:120 +#: ../lib/yard/templates/helpers/html_helper.rb:134 +#: ../lib/yard/templates/helpers/html_helper.rb:154 +#: ../lib/yard/templates/helpers/html_helper.rb:557 +#: ../lib/yard/templates/helpers/html_syntax_highlight_helper.rb:9 +msgid "tag|param|source" +msgstr "source" + +# @param [String] source +#: ../lib/yard/code_objects/base.rb:543 +msgid "the source code to format" +msgstr "書式化するソースコード" + +# YARD::CodeObjects::ClassObject +#: ../lib/yard/code_objects/class_object.rb:3 +msgid "" +"A ClassObject represents a Ruby class in source code. It is a " +"{ModuleObject}\n" +"with extra inheritance semantics through the superclass." +msgstr "" +"クラスオブジェクトはソースコードの中のRubyクラスを意味する。\n" +"それは、スーパークラスを介した特別な継承の意味を持つ {ModuleObject} となる。" + +# YARD::CodeObjects::ClassObject#superclass +#: ../lib/yard/code_objects/class_object.rb:6 +msgid "The {ClassObject} that this class object inherits from in Ruby source." +msgstr "このクラスオブジェクトがRubyのソースから継承する{ClassObject}" + +# @return [ClassObject] +#: ../lib/yard/code_objects/class_object.rb:7 +msgid "a class object that is the superclass of this one" +msgstr "このクラスオブジェクトのスーパークラスとなるクラスオブジェクトを返す" + +# YARD::CodeObjects::ClassObject#initialize +#: ../lib/yard/code_objects/class_object.rb:10 +msgid "Creates a new class object in +namespace+ with +name+" +msgstr "+name+ と共に +namespace+ の中で新しいクラスオブジェクトを作成する。" + +# @return [ClassObject] +#: ../lib/yard/code_objects/class_object.rb:12 +msgid "a new instance of ClassObject" +msgstr "クラスオブジェクトの新しいインスタンス" + +# @see +#: ../lib/yard/code_objects/class_object.rb:12 +msgid "tag|see|Base.new" +msgstr "" + +# YARD::CodeObjects::ClassObject#is_exception? +#: ../lib/yard/code_objects/class_object.rb:30 +msgid "Whether or not the class is a Ruby Exception" +msgstr "Ruby Exceptionクラスかどうか" + +# @return [Boolean] +#: ../lib/yard/code_objects/class_object.rb:32 +msgid "whether the object represents a Ruby exception" +msgstr "Ruby exceptionクラスを表すオブジェクトかどうか" + +# YARD::CodeObjects::ClassObject#inheritance_tree +#: ../lib/yard/code_objects/class_object.rb:37 +msgid "Returns the inheritance tree of the object including self." +msgstr "自身を含んでいるオブジェクトの継承ツリーを返す" + +# @param [Boolean] +#: ../lib/yard/code_objects/class_object.rb:42 +#: ../lib/yard/code_objects/module_object.rb:9 +msgid "tag|param|include_mods" +msgstr "include_mods" + +# @return [Array] +#: ../lib/yard/code_objects/class_object.rb:42 +msgid "" +"the list of code objects that make up\n" +"the inheritance tree." +msgstr "継承ツリーを作り上げるコードオブジェクトのリスト" + +# @param [Boolean] include_mods +#: ../lib/yard/code_objects/class_object.rb:42 +msgid "" +"whether or not to include mixins in the\n" +"inheritance tree." +msgstr "継承ツリーの中でmixinを含んでいるかどうか" + +# YARD::CodeObjects::ClassObject#meths +#: ../lib/yard/code_objects/class_object.rb:55 +msgid "" +"Returns the list of methods matching the options hash. Returns\n" +"all methods if hash is empty." +msgstr "" +"ハッシュのオプションにマッチするメソッドのリストを返す。\n" +"(ハッシュが空の場合は、全てのメソッド)" + +# @option +#: ../lib/yard/code_objects/class_object.rb:63 +#: ../lib/yard/code_objects/class_object.rb:98 +#: ../lib/yard/code_objects/namespace_object.rb:113 +#: ../lib/yard/code_objects/namespace_object.rb:144 +#: ../lib/yard/code_objects/namespace_object.rb:164 +#: ../lib/yard/handlers/base.rb:355 ../lib/yard/parser/ruby/ast_node.rb:152 +#: ../lib/yard/serializers/file_system_serializer.rb:27 +#: ../lib/yard/server/adapter.rb:71 ../lib/yard/server/rack_adapter.rb:26 +msgid "tag|option|opts" +msgstr "opts" + +# @return [Array] +#: ../lib/yard/code_objects/class_object.rb:63 +msgid "the list of methods that matched" +msgstr "マッチしたメソッドのリスト" + +# @param [Hash] opts +#: ../lib/yard/code_objects/class_object.rb:63 +#: ../lib/yard/code_objects/class_object.rb:98 +msgid "the options hash to match" +msgstr "マッチするハッシュのオプション" + +# YARD::CodeObjects::ClassObject#inherited_meths +#: ../lib/yard/code_objects/class_object.rb:74 +msgid "Returns only the methods that were inherited." +msgstr "継承したメソッドだけを返す" + +# @return [Array] +#: ../lib/yard/code_objects/class_object.rb:76 +msgid "the list of inherited method objects" +msgstr "メソッドオブジェクトを継承したリスト" + +# YARD::CodeObjects::ClassObject#constants +#: ../lib/yard/code_objects/class_object.rb:91 +msgid "Returns the list of constants matching the options hash." +msgstr "ハッシュのオプションにマッチする定数のリストを返す" + +# @return [Array] +#: ../lib/yard/code_objects/class_object.rb:98 +msgid "the list of constant that matched" +msgstr "マッチした定数のリスト" + +# YARD::CodeObjects::ClassObject#inherited_constants +#: ../lib/yard/code_objects/class_object.rb:104 +msgid "Returns only the constants that were inherited." +msgstr "継承された定数だけ返す" + +# @return [Array] +#: ../lib/yard/code_objects/class_object.rb:106 +msgid "the list of inherited constant objects" +msgstr "定数オブジェクトを継承したリスト" + +# YARD::CodeObjects::ClassObject#superclass= +#: ../lib/yard/code_objects/class_object.rb:119 +msgid "Sets the superclass of the object" +msgstr "オブジェクトのスーパークラスをグループ化する。" + +# @param [Base, Proxy, String, Symbol, nil] object +#: ../lib/yard/code_objects/class_object.rb:122 +msgid "the superclass value" +msgstr "スーパークラスの値" + +# YARD::CodeObjects::ClassVariableObject +#: ../lib/yard/code_objects/class_variable_object.rb:3 +msgid "" +"Represents a class variable inside a namespace. The path is expressed\n" +"in the form \"A::B::@@classvariable\"" +msgstr "" +"namespaceの内部でクラス変数を表す。\n" +"パスは、\"A::B::@@クラス変数\"形式で表される。" + +# @return [String] +#: ../lib/yard/code_objects/class_variable_object.rb:6 +msgid "the class variable's value" +msgstr "クラス変数の値" + +# YARD::CodeObjects::ConstantObject +#: ../lib/yard/code_objects/constant_object.rb:3 +msgid "" +"A +ConstantObject+ represents a Ruby constant (not a module or class).\n" +"To access the constant's (source code) value, use {#value}." +msgstr "" +"+ConstantObject+ は、Ruby定数を表す。(モジュールやクラスではない)\n" +"定数(ソースコード)の値にアクセスする為には、{#value}メソッドを利用する。" + +# YARD::CodeObjects::ConstantObject#value +#: ../lib/yard/code_objects/constant_object.rb:6 +msgid "The source code representing the constant's value" +msgstr "定数の値を表しているソースコード" + +# @return [String] +#: ../lib/yard/code_objects/constant_object.rb:7 +msgid "the value the constant is set to" +msgstr "定数を設定される値" + +# YARD::CodeObjects::ExtendedMethodObject +#: ../lib/yard/code_objects/extended_method_object.rb:3 +msgid "" +"Represents an instance method of a module that was mixed into the class\n" +"scope of another namespace." +msgstr "" +"他のnamespaceのクラススコープの中へ混ぜられたモジュールのインスタンスメソッド" +"を表す。" + +# @see +#: ../lib/yard/code_objects/extended_method_object.rb:6 +#: ../lib/yard/code_objects/extended_method_object.rb:21 +msgid "tag|see|MethodObject" +msgstr "" + +# @return [Symbol] +#: ../lib/yard/code_objects/extended_method_object.rb:10 +msgid "always +:class+" +msgstr "常に +:class+" + +# YARD::CodeObjects::ExtendedMethodObject#initialize +#: ../lib/yard/code_objects/extended_method_object.rb:13 +msgid "Sets up a delegate for {MethodObject} obj." +msgstr "{MethodObject}オブジェクト用に委譲をセットアップする" + +# @return [ExtendedMethodObject] +#: ../lib/yard/code_objects/extended_method_object.rb:16 +msgid "a new instance of ExtendedMethodObject" +msgstr "ExtendedMethodObjectの新しいインスタンス" + +# @param [MethodObject] obj +#: ../lib/yard/code_objects/extended_method_object.rb:16 +msgid "" +"the instance method to treat as a mixed in\n" +"class method on another namespace." +msgstr "" +"別のnamespace上でクラスメソッドを混ぜたような処理をする,インスタンスメソッド" + +# YARD::CodeObjects::ExtendedMethodObject#method_missing +#: ../lib/yard/code_objects/extended_method_object.rb:19 +msgid "Sends all methods to the {MethodObject} assigned in {#initialize}" +msgstr "" +"{MethodObject}が{#initialize}メソッドを割り当てる事によって、\n" +"全てのメソッドを__send__する。" + +# YARD::CodeObjects::ExtraFileObject +#: ../lib/yard/code_objects/extra_file_object.rb:3 +msgid "" +"An ExtraFileObject represents an extra documentation file (README or other\n" +"file). It is not strictly a CodeObject (does not inherit from `Base`) " +"although\n" +"it implements `path`, `name` and `type`, and therefore should be " +"structurally\n" +"compatible with most CodeObject interfaces." +msgstr "" +"ExtraFileObjectは、追加のドキュメントファイル(README や 他のファイル)を表すけ" +"れど、\n" +"コードオブジェクトに限らず(`Base`から継承はできない)`path`, `name` , `type`を" +"実装できる。\n" +"従って、殆どのCodeObjectインターフェースと互換性があり、構造上両立されるべき" +"である。" + +# @param value +#: ../lib/yard/code_objects/extra_file_object.rb:7 +msgid "the value to set the attribute filename to." +msgstr "filename属性を設定する値" + +# YARD::CodeObjects::ExtraFileObject#filename +#: ../lib/yard/code_objects/extra_file_object.rb:8 +msgid "Returns the value of attribute filename" +msgstr "filename属性の値を返す" + +# YARD::CodeObjects::ExtraFileObject#filename= +#: ../lib/yard/code_objects/extra_file_object.rb:8 +msgid "Sets the attribute filename" +msgstr "filename属性を設定する" + +# @param value +#: ../lib/yard/code_objects/extra_file_object.rb:8 +msgid "the value to set the attribute attributes to." +msgstr "attributesの属性を設定する値" + +# YARD::CodeObjects::ExtraFileObject#attributes +#: ../lib/yard/code_objects/extra_file_object.rb:9 +msgid "Returns the value of attribute attributes" +msgstr "attributes属性の値を返す" + +# YARD::CodeObjects::ExtraFileObject#attributes= +#: ../lib/yard/code_objects/extra_file_object.rb:9 +msgid "Sets the attribute attributes" +msgstr "attributes属性を設定する" + +# @param value +#: ../lib/yard/code_objects/extra_file_object.rb:9 +#: ../lib/yard/tags/ref_tag_list.rb:4 +msgid "the value to set the attribute name to." +msgstr "name属性を設定する値" + +# YARD::CodeObjects::ExtraFileObject#name +# YARD::CodeObjects::ExtraFileObject#path +# YARD::Parser::Ruby::Legacy::RubyToken::TkId#name +# YARD::Parser::Ruby::Legacy::RubyToken::TkUnknownChar#name +# YARD::Tags::RefTagList#name +# YARD::Templates::Section#name +#: ../lib/yard/code_objects/extra_file_object.rb:10 +#: ../lib/yard/code_objects/extra_file_object.rb:24 +#: ../lib/yard/parser/ruby/legacy/ruby_lex.rb:79 +#: ../lib/yard/parser/ruby/legacy/ruby_lex.rb:114 +#: ../lib/yard/tags/ref_tag_list.rb:5 +msgid "Returns the value of attribute name" +msgstr "name属性の値を返す" + +# YARD::CodeObjects::ExtraFileObject#name= +# YARD::Tags::RefTagList#name= +# YARD::Templates::Section#name= +#: ../lib/yard/code_objects/extra_file_object.rb:10 +#: ../lib/yard/tags/ref_tag_list.rb:5 +msgid "Sets the attribute name" +msgstr "name属性を設定する" + +# @param value +#: ../lib/yard/code_objects/extra_file_object.rb:10 +msgid "the value to set the attribute contents to." +msgstr "値に属性の内容を設定するための値" + +# YARD::Parser::Ruby::Legacy::Statement#comments +# YARD::Parser::Ruby::RipperParser#comments +#: ../lib/yard/code_objects/extra_file_object.rb:11 +msgid "Returns the value of attribute contents" +msgstr "属性の内容の値を返す" + +# YARD::CodeObjects::NamespaceObject#constants= +#: ../lib/yard/code_objects/extra_file_object.rb:11 +msgid "Sets the attribute contents" +msgstr "属性の内容を設定する" + +# YARD::CodeObjects::ExtraFileObject#initialize +#: ../lib/yard/code_objects/extra_file_object.rb:13 +msgid "Creates a new extra file object." +msgstr "新しく追加のファイルオブジェクトを作成する" + +# @return [ExtraFileObject] +#: ../lib/yard/code_objects/extra_file_object.rb:16 +msgid "a new instance of ExtraFileObject" +msgstr "ExtraFileObjectの新しいインスタンス" + +# @param [String] +#: ../lib/yard/code_objects/extra_file_object.rb:16 +#: ../lib/yard/templates/helpers/markup_helper.rb:122 +msgid "tag|param|contents" +msgstr "contents" + +# @param [String, CodeObjects::ExtraFileObject] +# @param [String] +# @param [String, Regexp] +#: ../lib/yard/code_objects/extra_file_object.rb:16 +#: ../lib/yard/handlers/base.rb:228 ../lib/yard/parser/base.rb:25 +#: ../lib/yard/parser/source_parser.rb:505 +#: ../lib/yard/templates/helpers/base_helper.rb:149 +#: ../lib/yard/templates/helpers/html_helper.rb:342 +msgid "tag|param|filename" +msgstr "filename" + +# @param [String] contents +#: ../lib/yard/code_objects/extra_file_object.rb:16 +msgid "" +"the file contents. If not set, the contents\n" +"will be read from disk using the +filename+." +msgstr "" +"ファイルの内容となる。設定しない場合、\n" +"contentsは、 +filename+ によってディスクから読み込まれるだろう。" + +# @param [String] filename +#: ../lib/yard/code_objects/extra_file_object.rb:16 +msgid "the location on disk of the file" +msgstr "ファイルのディスク上の場所" + +# @param [String] data +#: ../lib/yard/code_objects/extra_file_object.rb:47 +msgid "the file contents" +msgstr "ファイルの内容" + +# YARD::CodeObjects::MacroObject +#: ../lib/yard/code_objects/macro_object.rb:6 +msgid "" +"A MacroObject represents a docstring defined through +@!macro NAME+ and can " +"be\n" +"reused by specifying the tag +@!macro NAME+. You can also provide the\n" +"+attached+ type flag to the macro definition to have it attached to the\n" +"specific DSL method so it will be implicitly reused." +msgstr "" +"マクロオブジェクトは、+@!macro NAME+ を通じて定義した docstring を表し、\n" +"+@!macro NAME+ タグを指定する事によって、再利用できる。\n" +"あなたは、固有のDSLメソッドに加えるマクロ定義の為に\n" +"+attached+ 型フラグを提供もできる。\n" +"なので、暗黙の内に再利用される。" + +# YARD::CodeObjects::MacroObject +#: ../lib/yard/code_objects/macro_object.rb:11 +msgid "" +"Macros are fully described in the {file:docs/Tags.md#macro Tags Overview}\n" +"document." +msgstr "" +"マクロは、{file:docs/Tags.md#macros Tags Overview}ドキュメントで詳細に説明さ" +"れている。" + +# @example Creating a macro that is attached to the method call +#: ../lib/yard/code_objects/macro_object.rb:29 +msgid "" +"# @!macro [attach] prop2\n" +"# @!method $1(value)\n" +"property :foo\n" +"\n" +"# Extra data added to docstring\n" +"property :bar" +msgstr "" + +# @example Creating a basic named macro +#: ../lib/yard/code_objects/macro_object.rb:29 +msgid "" +"# @!macro prop\n" +"# @!method $1(${3-})\n" +"# @return [$2] the value of the $0\n" +"property :foo, String, :a, :b\n" +"\n" +"# @!macro prop\n" +"property :bar, Numeric, :value" +msgstr "" + +# @example +#: ../lib/yard/code_objects/macro_object.rb:29 +msgid "tag|example|Creating a basic named macro" +msgstr "一般的なマクロを作成" + +# @example +#: ../lib/yard/code_objects/macro_object.rb:29 +msgid "tag|example|Creating a macro that is attached to the method call" +msgstr "メソッド呼び出しの為に加えられるマクロを作成する。" + +# YARD::CodeObjects::MacroObject.create +#: ../lib/yard/code_objects/macro_object.rb:34 +msgid "Creates a new macro and fills in the relevant properties." +msgstr "関連したプロパティのファイルと新しいマクロを作成する。" + +# @param [CodeObjects::Base] method_object +#: ../lib/yard/code_objects/macro_object.rb:39 +msgid "" +"an object to attach this\n" +"macro to. If supplied, {#attached?} will be true" +msgstr "" +"このマクロに加えるオブジェクト。もし提供された場合、\n" +"{#attached?}はtrueになる。" + +# @param [String] +#: ../lib/yard/code_objects/macro_object.rb:39 +#: ../lib/yard/code_objects/macro_object.rb:50 +#: ../lib/yard/code_objects/macro_object.rb:70 +msgid "tag|param|macro_name" +msgstr "macro_name" + +# @param [CodeObjects::Base] +#: ../lib/yard/code_objects/macro_object.rb:39 +#: ../lib/yard/code_objects/macro_object.rb:70 +msgid "tag|param|method_object" +msgstr "method_object" + +# @param [String] data +#: ../lib/yard/code_objects/macro_object.rb:39 +msgid "the data the macro should expand when re-used" +msgstr "再利用された時、マクロが展開するであろうデータ" + +# @param [String] macro_name +#: ../lib/yard/code_objects/macro_object.rb:39 +msgid "the name of the macro, must be unique." +msgstr "マクロの名前、固有のものにしなければならない" + +# YARD::CodeObjects::MacroObject.find +#: ../lib/yard/code_objects/macro_object.rb:47 +msgid "Finds a macro using +macro_name+" +msgstr "+macro_name+ のマクロを見つける" + +# @return [MacroObject] +#: ../lib/yard/code_objects/macro_object.rb:50 +msgid "if a macro is found" +msgstr "マクロが見つかった場合" + +# @return [nil] +#: ../lib/yard/code_objects/macro_object.rb:50 +msgid "if there is no registered macro by that name" +msgstr "マクロの名前が記録されない場合" + +# @return [String] +#: ../lib/yard/code_objects/macro_object.rb:50 +#: ../lib/yard/code_objects/macro_object.rb:70 +msgid "the name of the macro" +msgstr "マクロの名前" + +# YARD::CodeObjects::MacroObject.find_or_create +# YARD::CodeObjects::MacroObject.create_docstring +#: ../lib/yard/code_objects/macro_object.rb:55 +#: ../lib/yard/code_objects/macro_object.rb:78 +msgid "" +"Parses a given docstring and determines if the macro is \"new\" or\n" +"not. If the macro has $variable names or if it has a @!macro tag\n" +"with the [new] or [attached] flag, it is considered new." +msgstr "" +"与えらたdocstringを解析しマクロが新しく作成されるものかどうか決める。\n" +"もしマクロが$variable名を持っていた場合や\n" +"[new]や[attached]フラグと一緒に@!macroタグを持っていた場合、\n" +"新規に作成されるものとみなされる。" + +# YARD::CodeObjects::MacroObject.find_or_create +# YARD::CodeObjects::MacroObject.create_docstring +#: ../lib/yard/code_objects/macro_object.rb:59 +#: ../lib/yard/code_objects/macro_object.rb:82 +msgid "" +"If a new macro is found, the macro is created and registered. Otherwise\n" +"the macro name is searched and returned. If a macro is not found,\n" +"nil is returned." +msgstr "" +"新しいマクロが見つかった場合、作成され記録される。\n" +"その他の場合、マクロ名が検索され返される。\n" +"マクロが見つからなかった場合は、nilが返される。" + +# @param [CodeObjects::Base] method_object +#: ../lib/yard/code_objects/macro_object.rb:70 +msgid "" +"an optional method to attach\n" +"the macro to. Only used if the macro is being created, otherwise\n" +"this argument is ignored." +msgstr "" +"マクロを加える為の任意のメソッド\n" +"マクロが作成される場合、利用されるだけである。\n" +"さもなければ、この引数は無視される。" + +# @return [nil] +#: ../lib/yard/code_objects/macro_object.rb:70 +msgid "" +"if the +data+ has no macro tag or if the macro is\n" +"not new and no macro by the macro name is found." +msgstr "" +"+data+ がマクロタグを持っていないか、\n" +"マクロが、\"new\"でなかったり、\n" +"macro name is foundによって、マクロ自体が無い場合、nilを返す。" + +# @return [MacroObject] +#: ../lib/yard/code_objects/macro_object.rb:70 +msgid "" +"the newly created or existing macro, depending\n" +"on whether the @!macro tag was a new tag or not." +msgstr "" +"新たに作成された、又は、既存のマクロを返す。\n" +"@!macroタグはnewタグかそうでないかに依存する。" + +# YARD::CodeObjects::MacroObject.expand +#: ../lib/yard/code_objects/macro_object.rb:80 +msgid "Expands +macro_data+ using the interpolation parameters." +msgstr "補完の引数によって、 +macro_data+ を展開する。" + +# YARD::CodeObjects::MacroObject.expand +#: ../lib/yard/code_objects/macro_object.rb:82 +msgid "" +"Interpolation rules:\n" +"* $0, $1, $2, ... = the Nth parameter in +call_params+\n" +"* $* = the full statement source (excluding block)\n" +"* Also supports $!{N-M} ranges, as well as negative indexes on N or M\n" +"* Use \\$ to escape the variable name in a macro." +msgstr "" +"補完のルール:\n" +"* $0, $1, $2, ... = +call_params+ の中のN番目の引数\n" +"* $* = 完全なステートメントのソース(blockを除外する)\n" +"* $!{N-M}の範囲もサポートし,マイナスのインデックスも利用できる\n" +"* マクロの中の変数名のエスケープには\\$を使う" + +# @param [String] +#: ../lib/yard/code_objects/macro_object.rb:96 +msgid "tag|param|macro_data" +msgstr "マクロデータ" + +# @param [String] macro_data +#: ../lib/yard/code_objects/macro_object.rb:96 +msgid "the macro data to expand (taken from {#macro_data})" +msgstr "拡張する為のマクロデータ({#macro_data}メソッドから取得する)" + +# YARD::CodeObjects::MacroObject.apply +#: ../lib/yard/code_objects/macro_object.rb:114 +msgid "" +"Applies a macro on a docstring by creating any macro data inside of\n" +"the docstring first. Equivalent to calling {find_or_create} and " +"{apply_macro}\n" +"on the new macro object." +msgstr "" +"最初にdocstringの内部の何らかのマクロデータを作成する事によって\n" +"docstring上のマクロを適用する。\n" +"{find_or_create}と、\n" +"新しいマクロオブジェクト上で{apply_macro}を呼び出すのは同様である。" + +# @param [Docstring] +#: ../lib/yard/code_objects/macro_object.rb:120 +msgid "tag|param|docstring" +msgstr "docstring" + +# @see +#: ../lib/yard/code_objects/macro_object.rb:120 +msgid "tag|see|find_or_create" +msgstr "" + +# @param [Docstring] docstring +#: ../lib/yard/code_objects/macro_object.rb:120 +msgid "the docstring to create a macro out of" +msgstr "マクロの出力を作成する為のdocstrng" + +# YARD::CodeObjects::MacroObject.apply_macro +#: ../lib/yard/code_objects/macro_object.rb:131 +msgid "" +"Applies a macro to a docstring, interpolating the macro's data on the\n" +"docstring and appending any extra local docstring data that was in\n" +"the original +docstring+ object." +msgstr "" +"docstringにmacroが適用され、\n" +"docstring上のマクロデータを補完する。\n" +"そして、元の +docstring+ オブジェクトの中の\n" +"任意で加えられるローカルなdocstringのデータを適用する。\n" + +# @param [MacroObject] +# @param [CodeObjects::MacroObject] +#: ../lib/yard/code_objects/macro_object.rb:136 +msgid "tag|param|macro" +msgstr "macro" + +# @param [MacroObject] macro +#: ../lib/yard/code_objects/macro_object.rb:136 +msgid "the macro object" +msgstr "マクロオブジェクト" + +# @return [String] +#: ../lib/yard/code_objects/macro_object.rb:142 +msgid "the macro data stored on the object" +msgstr "マクロ上で記録されるデータ" + +# @return [CodeObjects::Base] +#: ../lib/yard/code_objects/macro_object.rb:146 +msgid "" +"the method object that this macro is\n" +"attached to." +msgstr "このマクロが追加されるメソッドオブジェクト\n" + +# @return [Boolean] +#: ../lib/yard/code_objects/macro_object.rb:149 +msgid "whether this macro is attached to a method" +msgstr "このマクロがメソッドに加えられるかどうか" + +# YARD::CodeObjects::MacroObject#path +#: ../lib/yard/code_objects/macro_object.rb:152 +msgid "Overrides {Base#path} so the macro path is \".macro.MACRONAME\"" +msgstr "" + +# YARD::CodeObjects::MacroObject#sep +#: ../lib/yard/code_objects/macro_object.rb:155 +msgid "Overrides the separator to be '.'" +msgstr "" + +# YARD::CodeObjects::MacroObject#expand +#: ../lib/yard/code_objects/macro_object.rb:158 +msgid "Expands the macro using" +msgstr "マクロによって展開される" + +# @param [Array] call_params +#: ../lib/yard/code_objects/macro_object.rb:167 +msgid "" +"a list of tokens that are passed\n" +"to the method call" +msgstr "メソッド呼び出しに渡されるトークンのリスト" + +# @example Expanding a Macro +#: ../lib/yard/code_objects/macro_object.rb:167 +msgid "" +"macro.expand(%w(property foo bar), 'property :foo, :bar', '') #=>\n" +" \"...macro data interpolating this line of code...\"" +msgstr "" + +# @example +#: ../lib/yard/code_objects/macro_object.rb:167 +msgid "tag|example|Expanding a Macro" +msgstr "マクロを展開する" + +# @param [String] +#: ../lib/yard/code_objects/macro_object.rb:167 +msgid "tag|param|block_source" +msgstr "block_source" + +# @param [Array] +#: ../lib/yard/code_objects/macro_object.rb:167 +msgid "tag|param|call_params" +msgstr "call_params" + +# @param [String] +#: ../lib/yard/code_objects/macro_object.rb:167 +msgid "tag|param|full_source" +msgstr "full_source" + +# @see +#: ../lib/yard/code_objects/macro_object.rb:167 +msgid "tag|see|expand" +msgstr "" + +# @param [String] full_source +#: ../lib/yard/code_objects/macro_object.rb:167 +msgid "the full method call (not including the block)" +msgstr "全てのメソッド呼び出し(blockを含んでいない)" + +# @param [String] block_source +#: ../lib/yard/code_objects/macro_object.rb:167 +msgid "" +"the source passed in the block of the method\n" +"call, if there is a block." +msgstr "ブロックがある場合、メソッド呼び出しのブロックの中で解析されたソース。" + +# YARD::CodeObjects::MethodObject +#: ../lib/yard/code_objects/method_object.rb:3 +msgid "Represents a Ruby method in source" +msgstr "ソースの中のRubyメソッドを表す。" + +# YARD::CodeObjects::MethodObject#scope +#: ../lib/yard/code_objects/method_object.rb:5 +msgid "The scope of the method (+:class+ or +:instance+)" +msgstr "メソッドのスコープ( +:class+ や +:instance+ )" + +# @return [Symbol] +#: ../lib/yard/code_objects/method_object.rb:7 +msgid "the scope" +msgstr "スコープ" + +# YARD::CodeObjects::MethodObject#explicit +# YARD::CodeObjects::MethodObject#explicit= +#: ../lib/yard/code_objects/method_object.rb:10 +msgid "" +"Whether the object is explicitly defined in source or whether it was\n" +"inferred by a handler. For instance, attribute methods are generally\n" +"inferred and therefore not explicitly defined in source." +msgstr "" +"オブジェクトがソースの中で明確に定義されるかどうかや、\n" +"それがハンドラーによって推察されたかどうか。\n" +"例えば、大抵メソッドの属性は推察されるが、\n" +"ソースの中で明確に定義されない場合、マーカーはどこも示せない。" + +# @return [Boolean] +#: ../lib/yard/code_objects/method_object.rb:14 +msgid "whether the object is explicitly defined in source." +msgstr "オブジェクトがソースの中で明確に定義されたかどうか" + +# YARD::CodeObjects::MethodObject#parameters +# YARD::CodeObjects::MethodObject#parameters= +#: ../lib/yard/code_objects/method_object.rb:17 +msgid "" +"Returns the list of parameters parsed out of the method signature\n" +"with their default values." +msgstr "" +"メソッドの用法のデフォルトの値と共に、その出力の解析された引数のリストを返" +"す。" + +# @return [Array] +#: ../lib/yard/code_objects/method_object.rb:21 +msgid "" +"a list of parameter names followed\n" +"by their default values (or nil)" +msgstr "引数名のデフォルトの値をフォローする(又は、nil)" + +# YARD::CodeObjects::MethodObject#initialize +#: ../lib/yard/code_objects/method_object.rb:24 +msgid "" +"Creates a new method object in +namespace+ with +name+ and an instance\n" +"or class +scope+" +msgstr "" +"+name+ とインスタンスや +scope+ クラスと共に、\n" +"+namespace+の中で新しいメソッドオブジェクトを作成する。" + +# YARD::CodeObjects::MethodObject#initialize +#: ../lib/yard/code_objects/method_object.rb:27 +msgid "" +"If scope is +:module+, this object is instantiated as a public\n" +"method in +:class+ scope, but also creates a new (empty) method\n" +"as a private +:instance+ method on the same class or module." +msgstr "" + +# @param [Symbol] scope +#: ../lib/yard/code_objects/method_object.rb:33 +msgid "+:instance+, +:class+, or +:module+" +msgstr "+:instance+ や +:class+ や +:module+" + +# @return [MethodObject] +#: ../lib/yard/code_objects/method_object.rb:33 +msgid "a new instance of MethodObject" +msgstr "メソッドオブジェクトの新しいインスタンス" + +# @param [Symbol] +#: ../lib/yard/code_objects/method_object.rb:33 +msgid "tag|param|scope" +msgstr "" + +# @param [String, Symbol] name +#: ../lib/yard/code_objects/method_object.rb:33 +msgid "the method name" +msgstr "メソッド名" + +# @param [NamespaceObject] namespace +#: ../lib/yard/code_objects/method_object.rb:33 +msgid "the namespace" +msgstr "namespace" + +# YARD::CodeObjects::MethodObject#scope= +#: ../lib/yard/code_objects/method_object.rb:53 +msgid "Changes the scope of an object from :instance or :class" +msgstr ":instanceや:classからオブジェクトのスコープを変更する。" + +# @param [Symbol] +#: ../lib/yard/code_objects/method_object.rb:54 +msgid "tag|param|v" +msgstr "v" + +# @param [Symbol] v +#: ../lib/yard/code_objects/method_object.rb:54 +msgid "the new scope" +msgstr "新しいスコープ" + +# @return [Boolean] +#: ../lib/yard/code_objects/method_object.rb:76 +msgid "whether or not the method is the #initialize constructor method" +msgstr "メソッドが#initialize,コンストラクタメソッドかどうか" + +# @return [Boolean] +#: ../lib/yard/code_objects/method_object.rb:83 +msgid "" +"whether or not this method was created as a module\n" +"function" +msgstr "このメソッドがモジュール関数として作成されたかどうか" + +# YARD::CodeObjects::MethodObject#attr_info +#: ../lib/yard/code_objects/method_object.rb:88 +msgid "Returns the read/writer info for the attribute if it is one" +msgstr "属性がひとつだけの場合、読み/書きする為の情報を返す。" + +# @return [nil] +#: ../lib/yard/code_objects/method_object.rb:91 +msgid "if the method is not an attribute" +msgstr "メソッドが属性で無い場合" + +# @return [SymbolHash] +#: ../lib/yard/code_objects/method_object.rb:91 +msgid "if there is information about the attribute" +msgstr "属性についての情報がある場合" + +# @return [Boolean] +#: ../lib/yard/code_objects/method_object.rb:98 +msgid "whether the method is a writer attribute" +msgstr "メソッドがwriter属性かどうか" + +# @return [Boolean] +#: ../lib/yard/code_objects/method_object.rb:104 +msgid "whether the method is a reader attribute" +msgstr "メソッドがreader属性かどうか" + +# YARD::CodeObjects::MethodObject#is_attribute? +#: ../lib/yard/code_objects/method_object.rb:109 +msgid "Tests if the object is defined as an attribute in the namespace" +msgstr "オブジェクトがnamespaceの中でその属性を定義される場合、テストする。" + +# @return [Boolean] +#: ../lib/yard/code_objects/method_object.rb:110 +msgid "whether the object is an attribute" +msgstr "オブジェクトが属性かどうか" + +# YARD::CodeObjects::MethodObject#is_alias? +#: ../lib/yard/code_objects/method_object.rb:116 +msgid "Tests if the object is defined as an alias of another method" +msgstr "" +"オブジェクトが別のメソッドがそのエイリアスに定義される場合、テストする。" + +# @return [Boolean] +#: ../lib/yard/code_objects/method_object.rb:117 +msgid "whether the object is an alias" +msgstr "オブジェクトがエイリアスかどうか" + +# YARD::CodeObjects::MethodObject#is_explicit? +#: ../lib/yard/code_objects/method_object.rb:123 +msgid "Tests boolean {#explicit} value." +msgstr "ブールの{#explicit}メソッドの値をテストする。" + +# @return [Boolean] +#: ../lib/yard/code_objects/method_object.rb:125 +msgid "whether the method is explicitly defined in source" +msgstr "メソッドがソースの中で明確に定義されるかどうか" + +# @return [nil] +#: ../lib/yard/code_objects/method_object.rb:132 +msgid "if it does not override a method" +msgstr "メソッドが上書きされない場合" + +# @return [MethodObject] +#: ../lib/yard/code_objects/method_object.rb:132 +msgid "the object that this method overrides" +msgstr "このメソッドが上書きするオブジェクト" + +# YARD::CodeObjects::MethodObject#aliases +#: ../lib/yard/code_objects/method_object.rb:139 +msgid "Returns all alias names of the object" +msgstr "オブジェクトの全てのエイリアスの名前を返す" + +# @return [Array] +#: ../lib/yard/code_objects/method_object.rb:140 +msgid "the alias names" +msgstr "エイリアスの名前" + +# YARD::CodeObjects::MethodObject#path +#: ../lib/yard/code_objects/method_object.rb:150 +msgid "" +"Override path handling for instance methods in the root namespace\n" +"(they should still have a separator as a prefix)." +msgstr "" +"root namespaseの中のインスタンスメソッド用に操作するパスを上書きする。\n" +"(root namespaseはプレフィックスとして区切りが必要である)" + +# @return [String] +#: ../lib/yard/code_objects/method_object.rb:152 +msgid "the path of a method" +msgstr "メソッドのパス" + +# YARD::CodeObjects::MethodObject#name +#: ../lib/yard/code_objects/method_object.rb:161 +msgid "Returns the name of the object." +msgstr "オブジェクトの名前を返す" + +# @example The name of a class method (with prefix) +#: ../lib/yard/code_objects/method_object.rb:170 +msgid "a_class_method.name(true) # => \"mymethod\"" +msgstr "" + +# @example The name of an instance method (with prefix) +#: ../lib/yard/code_objects/method_object.rb:170 +msgid "an_instance_method.name(true) # => \"#mymethod\"" +msgstr "" + +# @return [String] +#: ../lib/yard/code_objects/method_object.rb:170 +msgid "" +"returns {#sep} + +name+ for an instance method if\n" +"prefix is true" +msgstr "" +"プレフィックスがtrueの場合、インスタンスメソッド用に{#sep} + +name+ を返す" + +# @example +#: ../lib/yard/code_objects/method_object.rb:170 +msgid "tag|example|The name of a class method (with prefix)" +msgstr "クラスメソッドの名前(プレフィックスを用いる)" + +# @example +#: ../lib/yard/code_objects/method_object.rb:170 +msgid "tag|example|The name of an instance method (with prefix)" +msgstr "インスタンスメソッドの名前(プレフィックスを用いる)" + +# @return [Symbol] +#: ../lib/yard/code_objects/method_object.rb:170 +msgid "the name without {#sep} if prefix is set to false" +msgstr "プレフィックスにfalseを設定する場合、{#sep}メソッド無しの名前となる。" + +# @param [Boolean] prefix +#: ../lib/yard/code_objects/method_object.rb:170 +msgid "whether or not to show the prefix" +msgstr "プレフィックスを見せるかどうか" + +# YARD::CodeObjects::MethodObject#sep +#: ../lib/yard/code_objects/method_object.rb:175 +msgid "" +"Override separator to differentiate between class and instance\n" +"methods." +msgstr "インスタンスメソッドとクラスの間で区別する為に区切りを上書きする。" + +# @return [String] +#: ../lib/yard/code_objects/method_object.rb:177 +msgid "\"#\" for an instance method, \".\" for class" +msgstr "インスタンスメソッド用の\"#\"、クラス用の\".\"。" + +# YARD::CodeObjects::ModuleObject +#: ../lib/yard/code_objects/module_object.rb:3 +msgid "Represents a Ruby module." +msgstr "Rubyモジュールを表す。" + +# YARD::CodeObjects::ModuleObject#inheritance_tree +#: ../lib/yard/code_objects/module_object.rb:5 +msgid "Returns the inheritance tree of mixins." +msgstr "mixinの継承ツリーを返す" + +# @return [Array] +#: ../lib/yard/code_objects/module_object.rb:9 +msgid "a list of namespace objects" +msgstr "オブジェクトのnamespaceのリスト" + +# @param [Boolean] include_mods +#: ../lib/yard/code_objects/module_object.rb:9 +msgid "" +"if true, will include mixed in\n" +"modules (which is likely what is wanted)." +msgstr "" +"trueの場合、mixinされるモジュールを含んでいる(それが何ができそうであるか)" + +# YARD::CodeObjects::NamespaceObject +#: ../lib/yard/code_objects/namespace_object.rb:3 +msgid "" +"A \"namespace\" is any object that can store other objects within itself.\n" +"The two main Ruby objects that can act as namespaces are modules\n" +"({ModuleObject}) and classes ({ClassObject})." +msgstr "" +"namespaceはそれ自身の中で他のオブジェクトを記録できる任意のオブジェクトとな" +"る。\n" +"namespaceがモジュール({ModuleObject})とクラス({ClassObject})のように振る舞え" +"るオブジェクトとなる。" + +# @param value +#: ../lib/yard/code_objects/namespace_object.rb:6 +msgid "the value to set the attribute child to." +msgstr "child属性を設定する値" + +# @param value +#: ../lib/yard/code_objects/namespace_object.rb:6 +msgid "the value to set the attribute constants to." +msgstr "属性の定数を設定する値" + +# @param value +#: ../lib/yard/code_objects/namespace_object.rb:6 +msgid "the value to set the attribute cvars to." +msgstr "cvars(クラス変数)の属性を設定する値" + +# @param value +#: ../lib/yard/code_objects/namespace_object.rb:6 +msgid "the value to set the attribute meths to." +msgstr "meths(メソッド)属性を設定する値" + +# @param value +#: ../lib/yard/code_objects/namespace_object.rb:6 +msgid "the value to set the attribute mixins to." +msgstr "mixinの属性を設定する値" + +# YARD::CodeObjects::NamespaceObject#child= +#: ../lib/yard/code_objects/namespace_object.rb:7 +msgid "Sets the attribute child" +msgstr "child属性を設定する" + +# YARD::CodeObjects::NamespaceObject#constants= +#: ../lib/yard/code_objects/namespace_object.rb:7 +msgid "Sets the attribute constants" +msgstr "定数の属性を設定する" + +# YARD::CodeObjects::NamespaceObject#cvars= +#: ../lib/yard/code_objects/namespace_object.rb:7 +msgid "Sets the attribute cvars" +msgstr "cvarsの属性を設定する" + +# YARD::CodeObjects::NamespaceObject#meths= +#: ../lib/yard/code_objects/namespace_object.rb:7 +msgid "Sets the attribute meths" +msgstr "meths属性を設定する" + +# YARD::CodeObjects::NamespaceObject#mixins= +#: ../lib/yard/code_objects/namespace_object.rb:7 +msgid "Sets the attribute mixins" +msgstr "mixinの属性を設定する" + +# @param value +#: ../lib/yard/code_objects/namespace_object.rb:7 +msgid "the value to set the attribute class_attributes to." +msgstr "class_attributes属性を設定する値" + +# @param value +#: ../lib/yard/code_objects/namespace_object.rb:7 +msgid "the value to set the attribute instance_attributes to." +msgstr "instance_attributes属性を設定する値" + +# YARD::CodeObjects::NamespaceObject#class_attributes= +#: ../lib/yard/code_objects/namespace_object.rb:8 +msgid "Sets the attribute class_attributes" +msgstr "class_attributes属性を設定する" + +# YARD::CodeObjects::NamespaceObject#instance_attributes= +#: ../lib/yard/code_objects/namespace_object.rb:8 +msgid "Sets the attribute instance_attributes" +msgstr "instance_attributes属性を設定する" + +# @param value +#: ../lib/yard/code_objects/namespace_object.rb:8 +msgid "the value to set the attribute included_constants to." +msgstr "included_constants属性を設定する値" + +# @param value +#: ../lib/yard/code_objects/namespace_object.rb:8 +msgid "the value to set the attribute included_meths to." +msgstr "included_meths属性を設定する値" + +# YARD::CodeObjects::NamespaceObject#included_constants= +#: ../lib/yard/code_objects/namespace_object.rb:9 +msgid "Sets the attribute included_constants" +msgstr "included_constants属性を設定する" + +# YARD::CodeObjects::NamespaceObject#included_meths= +#: ../lib/yard/code_objects/namespace_object.rb:9 +msgid "Sets the attribute included_meths" +msgstr "included_meths属性を設定する" + +# @return [Array] +#: ../lib/yard/code_objects/namespace_object.rb:12 +msgid "a list of ordered group names inside the namespace" +msgstr "namespace内部の名前のグループへの命令の入ったリスト" + +# YARD::CodeObjects::NamespaceObject#children +#: ../lib/yard/code_objects/namespace_object.rb:15 +msgid "The list of objects defined in this namespace" +msgstr "このnamespaceの中で定義されたオブジェクトのリスト" + +# @return [Array] +#: ../lib/yard/code_objects/namespace_object.rb:16 +msgid "a list of objects" +msgstr "オブジェクトのリスト" + +# YARD::CodeObjects::NamespaceObject#attributes +#: ../lib/yard/code_objects/namespace_object.rb:19 +msgid "" +"A hash containing two keys, class and instance, each containing\n" +"the attribute name with a { :read, :write } hash for the read and\n" +"write objects respectively." +msgstr "" +"ハッシュはクラスとインスタンスの二つのキーを含んでいる,\n" +"読み書きオブジェクトそれぞれ{:read, :write}ハッシュと共に\n" +"属性の名前をそれぞれ含んでいる。" + +# @example The attributes of an object +#: ../lib/yard/code_objects/namespace_object.rb:39 +msgid "" +">> Registry.at('YARD::Docstring').attributes\n" +"=> {\n" +" :class => { },\n" +" :instance => {\n" +" :ref_tags => {\n" +" :read => #,\n" +" :write => nil\n" +" },\n" +" :object => {\n" +" :read => #,\n" +" :write => #\n" +" },\n" +" ...\n" +" }\n" +" }" +msgstr "" + +# @return [Hash] +# @param [Array] list +#: ../lib/yard/code_objects/namespace_object.rb:39 +#: ../lib/yard/code_objects/namespace_object.rb:44 +#: ../lib/yard/templates/helpers/module_helper.rb:10 +msgid "a list of methods" +msgstr "メソッドのリスト" + +# @example +#: ../lib/yard/code_objects/namespace_object.rb:39 +msgid "tag|example|The attributes of an object" +msgstr "オブジェクトの属性" + +# YARD::CodeObjects::NamespaceObject#aliases +#: ../lib/yard/code_objects/namespace_object.rb:42 +msgid "" +"A hash containing two keys, :class and :instance, each containing\n" +"a hash of objects and their alias names." +msgstr "" +"二つのキーを含んでいるハッシュで,クラスとインスタンスはそれぞれ、\n" +"オブジェクトのハッシュと、そのエイリアスの名前を含んでいる。" + +# YARD::CodeObjects::NamespaceObject#class_mixins +#: ../lib/yard/code_objects/namespace_object.rb:47 +msgid "Class mixins" +msgstr "mixinのクラス" + +# @return [Array] +#: ../lib/yard/code_objects/namespace_object.rb:48 +#: ../lib/yard/code_objects/namespace_object.rb:52 +#: ../lib/yard/code_objects/namespace_object.rb:194 +msgid "a list of mixins" +msgstr "mixinのリスト" + +# YARD::CodeObjects::NamespaceObject#instance_mixins +#: ../lib/yard/code_objects/namespace_object.rb:51 +msgid "Instance mixins" +msgstr "mixinのインスタンス" + +# YARD::CodeObjects::NamespaceObject#initialize +#: ../lib/yard/code_objects/namespace_object.rb:55 +msgid "Creates a new namespace object inside +namespace+ with +name+." +msgstr "" +"+name+ と共に、 +namespace+ の内部で新しいnamespaceオブジェクトを作成する。" + +# @return [NamespaceObject] +#: ../lib/yard/code_objects/namespace_object.rb:56 +msgid "a new instance of NamespaceObject" +msgstr "NamespaceObjectの新しいインスタンス" + +# @see +#: ../lib/yard/code_objects/namespace_object.rb:56 +msgid "tag|see|Base#initialize" +msgstr "" + +# YARD::CodeObjects::NamespaceObject#class_attributes +#: ../lib/yard/code_objects/namespace_object.rb:67 +msgid "Only the class attributes" +msgstr "クラス属性だけ" + +# @return [Hash] +#: ../lib/yard/code_objects/namespace_object.rb:69 +#: ../lib/yard/code_objects/namespace_object.rb:76 +msgid "a list of method names and their read/write objects" +msgstr "メソッド名のリストとそれを読み/書きするオブジェクト" + +# @see +#: ../lib/yard/code_objects/namespace_object.rb:69 +#: ../lib/yard/code_objects/namespace_object.rb:76 +msgid "tag|see|#attributes" +msgstr "" + +# YARD::CodeObjects::NamespaceObject#instance_attributes +#: ../lib/yard/code_objects/namespace_object.rb:74 +msgid "Only the instance attributes" +msgstr "インスタンス属性だけ" + +# YARD::CodeObjects::NamespaceObject#child +#: ../lib/yard/code_objects/namespace_object.rb:81 +msgid "Looks for a child that matches the attributes specified by +opts+." +msgstr "+opts+に指定された属性にマッチする子を検索する" + +# @example Finds a child by name and scope +#: ../lib/yard/code_objects/namespace_object.rb:86 +msgid "" +"namespace.child(:name => :to_s, :scope => :instance)\n" +"# => #" +msgstr "" + +# @example +#: ../lib/yard/code_objects/namespace_object.rb:86 +msgid "tag|example|Finds a child by name and scope" +msgstr "名前とスコープの子を検索する" + +# @return [Base, nil] +#: ../lib/yard/code_objects/namespace_object.rb:86 +msgid "the first matched child object, or nil" +msgstr "最初にマッチした子のオブジェクト、又はnil" + +# YARD::CodeObjects::NamespaceObject#meths +#: ../lib/yard/code_objects/namespace_object.rb:100 +msgid "" +"Returns all methods that match the attributes specified by +opts+. If\n" +"no options are provided, returns all methods." +msgstr "" +"+opts+に指定された属性にマッチする全てのメソッドを返す。\n" +"optionが提供されない場合は、全てのメソッドを返す。" + +# @param [Hash] opts +#: ../lib/yard/code_objects/namespace_object.rb:113 +#: ../lib/yard/code_objects/namespace_object.rb:144 +#: ../lib/yard/code_objects/namespace_object.rb:164 +#: ../lib/yard/handlers/base.rb:355 ../lib/yard/i18n/text.rb:11 +#: ../lib/yard/serializers/file_system_serializer.rb:27 +#: ../lib/yard/server/rack_adapter.rb:26 +msgid "a customizable set of options" +msgstr "カスタマイズ可能なオプションのグループ" + +# @return [Array] +#: ../lib/yard/code_objects/namespace_object.rb:113 +msgid "a list of method objects" +msgstr "オブジェクトのメソッドのリスト" + +# @example Finds all private and protected class methods +#: ../lib/yard/code_objects/namespace_object.rb:113 +msgid "" +"namespace.meths(:visibility => [:private, :protected], :scope => :class)\n" +"# => [#, #]" +msgstr "" + +# @example +#: ../lib/yard/code_objects/namespace_object.rb:113 +msgid "tag|example|Finds all private and protected class methods" +msgstr "全てのprivateとクラスメソッドのprotectedを検索する" + +# YARD::CodeObjects::NamespaceObject#included_meths +#: ../lib/yard/code_objects/namespace_object.rb:133 +msgid "" +"Returns methods included from any mixins that match the attributes\n" +"specified by +opts+. If no options are specified, returns all included\n" +"methods." +msgstr "" +"+opts+で指定された属性にマッチする任意のmixinから含んでいるメソッドを返す\n" +"オプションが指定されない場合、全ての含んでいるメソッドを返すmethods." + +# @see +#: ../lib/yard/code_objects/namespace_object.rb:144 +msgid "tag|see|#meths" +msgstr "" + +# YARD::CodeObjects::NamespaceObject#constants +#: ../lib/yard/code_objects/namespace_object.rb:160 +msgid "Returns all constants in the namespace" +msgstr "namespaceの中の全ての定数を返す" + +# @return [Array] +#: ../lib/yard/code_objects/namespace_object.rb:164 +#: ../lib/yard/code_objects/namespace_object.rb:172 +msgid "a list of constant objects" +msgstr "定数オブジェクトのリスト" + +# YARD::CodeObjects::NamespaceObject#included_constants +#: ../lib/yard/code_objects/namespace_object.rb:171 +msgid "Returns constants included from any mixins" +msgstr "任意のmixinから、含んでいる定数を返す" + +# YARD::CodeObjects::NamespaceObject#cvars +#: ../lib/yard/code_objects/namespace_object.rb:185 +msgid "Returns class variables defined in this namespace." +msgstr "このnamespaseの中で定義されたクラス変数を返す" + +# @return [Array] +#: ../lib/yard/code_objects/namespace_object.rb:186 +msgid "a list of class variable objects" +msgstr "オブジェクトのクラス変数のリスト" + +# YARD::CodeObjects::NamespaceObject#mixins +#: ../lib/yard/code_objects/namespace_object.rb:191 +msgid "" +"Returns for specific scopes. If no scopes are provided, returns all mixins." +msgstr "固有のスコープを返す。スコープが提供されない場合、全てのmixinを返す" + +# @param [Array] scopes +#: ../lib/yard/code_objects/namespace_object.rb:194 +msgid "" +"a list of scopes (:class, :instance) to\n" +"return mixins for. If this is empty, all scopes will be returned." +msgstr "" +"mixinを返す為のスコープのリスト(:class, :instance).\n" +"これが空の場合、全てのスコープが、返されるだろう。" + +# @param [Array] +#: ../lib/yard/code_objects/namespace_object.rb:194 +msgid "tag|param|scopes" +msgstr "scopes" + +# YARD::CodeObjects::ProxyMethodError +#: ../lib/yard/code_objects/proxy.rb:4 +msgid "A special type of +NoMethodError+ when raised from a {Proxy}" +msgstr "{Proxy}から、例外が上げられる時の、+NoMethodError+の特別な型" + +# YARD::CodeObjects::Proxy +#: ../lib/yard/code_objects/proxy.rb:7 +msgid "" +"The Proxy class is a way to lazily resolve code objects in\n" +"cases where the object may not yet exist. A proxy simply stores\n" +"an unresolved path until a method is called on the object, at which\n" +"point it does a lookup using {Registry.resolve}. If the object is\n" +"not found, a warning is raised and {ProxyMethodError} might be raised." +msgstr "" +"Proxyクラスは、オブジェクトがまだ存在しないかもしれないケースで、\n" +"コードオブジェクトを簡単に解決する為の方法である。\n" +"単純にproxyは、メソッドが解決されなかったパスを記録し、\n" +"オブジェクト上で呼び出され{Registry.resolve}によって検索する。\n" +"オブジェクトが見つからない場合、警告がでたり、{ProxyMethodError}が出るかもし" +"れない。" + +# @example Creates a Proxy to the String class from a module +#: ../lib/yard/code_objects/proxy.rb:18 +msgid "" +"# When the String class is parsed this method will\n" +"# begin to act like the String ClassObject.\n" +"Proxy.new(mymoduleobj, \"String\")" +msgstr "" + +# @example +#: ../lib/yard/code_objects/proxy.rb:18 +msgid "tag|example|Creates a Proxy to the String class from a module" +msgstr "モジュールからStringクラスの為のProxyを作成する" + +# @see +#: ../lib/yard/code_objects/proxy.rb:18 +msgid "tag|see|ProxyMethodError" +msgstr "" + +# @see +#: ../lib/yard/code_objects/proxy.rb:18 +msgid "tag|see|Registry.resolve" +msgstr "" + +# YARD::CodeObjects::Proxy#namespace +# YARD::CodeObjects::Proxy#parent +#: ../lib/yard/code_objects/proxy.rb:22 ../lib/yard/code_objects/proxy.rb:23 +#: ../lib/yard/handlers/base.rb:315 ../lib/yard/handlers/base.rb:335 +msgid "Returns the value of attribute namespace" +msgstr "namespaxe属性の値を返す" + +# YARD::CodeObjects::Proxy#initialize +#: ../lib/yard/code_objects/proxy.rb:25 +msgid "Creates a new Proxy" +msgstr "新しいProxyを返す" + +# @raise [ArgumentError] +#: ../lib/yard/code_objects/proxy.rb:28 +msgid "if namespace is not a NamespaceObject" +msgstr "namespaceがNamespaceObjectでない場合" + +# YARD::CodeObjects::Proxy#inspect +#: ../lib/yard/code_objects/proxy.rb:76 +msgid "Returns a text representation of the Proxy" +msgstr "Proxyのテキスト表現を返す" + +# @return [String] +#: ../lib/yard/code_objects/proxy.rb:77 +msgid "the object's #inspect method or P(OBJECTPATH)" +msgstr "#inspectメソッドやP(OBJECTPATH)のオブジェクト" + +# YARD::CodeObjects::Proxy#path +# YARD::CodeObjects::Proxy#to_s +# YARD::CodeObjects::Proxy#to_str +#: ../lib/yard/code_objects/proxy.rb:86 ../lib/yard/code_objects/proxy.rb:98 +#: ../lib/yard/code_objects/proxy.rb:99 +msgid "" +"If the proxy resolves to an object, returns its path, otherwise\n" +"guesses at the correct path using the original namespace and name." +msgstr "" +"proxyがオブジェクトを解決する場合、パスを返す。\n" +"他の場合、\n" +"元のnamespaceとnameによって正しいパスを推測する" + +# @return [String] +#: ../lib/yard/code_objects/proxy.rb:90 +msgid "" +"the assumed path of the proxy (or the real path\n" +"of the resolved object)" +msgstr "proxyのパスを装う(又は、解決したオブジェクトの実際のパス)" + +# YARD::CodeObjects::Proxy#class +#: ../lib/yard/code_objects/proxy.rb:141 +msgid "" +"Returns the class name of the object the proxy is mimicking, if\n" +"resolved. Otherwise returns +Proxy+." +msgstr "" +"解決した場合、proxyが模倣するオブジェクトのクラス名を返す。\n" +"他の場合、+Proxy+を返す。" + +# @return [Class] +#: ../lib/yard/code_objects/proxy.rb:143 +msgid "the resolved object's class or +Proxy+" +msgstr "解決したオブジェクトのクラスや +Proxy+" + +# YARD::CodeObjects::Proxy#type +#: ../lib/yard/code_objects/proxy.rb:152 +msgid "" +"Returns the type of the proxy. If it cannot be resolved at the\n" +"time of the call, it will either return the inferred proxy type\n" +"(see {#type=}) or +:proxy+" +msgstr "" +"proxyの型を返す。呼び出される時間で解決できない場合、\n" +"予想されるproxyの型(see {#type=})や +:proxy+ を返す。" + +# @see +#: ../lib/yard/code_objects/proxy.rb:156 +msgid "tag|see|#type=" +msgstr "" + +# @return [Symbol] +#: ../lib/yard/code_objects/proxy.rb:156 +msgid "the Proxy's type" +msgstr "Proxyの型" + +# YARD::CodeObjects::Proxy#type= +#: ../lib/yard/code_objects/proxy.rb:165 +msgid "Allows a parser to infer the type of the proxy by its path." +msgstr "パスによってproxyの型を推測する為に、パーサーを受け入れる。" + +# @param [#to_sym] +# @param [Symbol] +#: ../lib/yard/code_objects/proxy.rb:167 ../lib/yard/handlers/ruby/base.rb:102 +#: ../lib/yard/handlers/ruby/struct_handler_methods.rb:16 +#: ../lib/yard/handlers/ruby/struct_handler_methods.rb:37 +#: ../lib/yard/parser/ruby/ast_node.rb:110 +#: ../lib/yard/parser/ruby/ast_node.rb:152 +#: ../lib/yard/parser/source_parser.rb:139 +#: ../lib/yard/parser/source_parser.rb:181 ../lib/yard/registry.rb:270 +#: ../lib/yard/registry.rb:368 ../lib/yard/registry_store.rb:94 +#: ../lib/yard/registry_store.rb:103 +#: ../lib/yard/templates/helpers/html_helper.rb:154 +#: ../lib/yard/templates/helpers/html_helper.rb:364 +#: ../lib/yard/templates/helpers/markup_helper.rb:149 +#: ../lib/yard/templates/helpers/markup_helper.rb:159 +msgid "tag|param|type" +msgstr "type" + +# @param [#to_sym] type +#: ../lib/yard/code_objects/proxy.rb:167 +msgid "the proxy's inferred type" +msgstr "推察されたproxyの型" + +# YARD::CodeObjects::Proxy#method_missing +#: ../lib/yard/code_objects/proxy.rb:189 +msgid "Dispatches the method to the resolved object." +msgstr "解決したオブジェクトにメソッドを送る" + +# @raise [ProxyMethodError] +#: ../lib/yard/code_objects/proxy.rb:191 +msgid "if the proxy cannot find the real object" +msgstr "proxyが実際のオブジェクトを見つけられない場合" + +# YARD::CodeObjects::Proxy#root? +#: ../lib/yard/code_objects/proxy.rb:213 +msgid "This class is never a root object" +msgstr "このクラスrootオブジェクトにはならない" + +# @note +#: ../lib/yard/code_objects/proxy.rb:218 +msgid "this method fixes a bug in 1.9.2: http://gist.github.com/437136" +msgstr "" +"このメソッドはバグを修正する。\n" +"(in 1.9.2: http://gist.github.com/4371369)" + +# YARD::CodeObjects::Proxy#to_obj +#: ../lib/yard/code_objects/proxy.rb:221 +msgid "" +"Attempts to find the object that this unresolved object\n" +"references by checking if any objects by this name are\n" +"registered all the way up the namespace tree." +msgstr "" +"この名前によって任意のオブジェクトが\n" +"namespaceツリーの変更を記録する場合、\n" +"これがチェックするオブジェクトの参照が\n" +"未解決だったオブジェクトを見つける為に試みる。" + +# @return [Base, nil] +#: ../lib/yard/code_objects/proxy.rb:225 +msgid "the registered code object or nil" +msgstr "記録されるコードオブジェクト、又は、nil" + +# YARD::CodeObjects::RootObject +#: ../lib/yard/code_objects/root_object.rb:4 +msgid "" +"Represents the root namespace object (the invisible Ruby module that\n" +"holds all top level modules, class and other objects)." +msgstr "" +"root namespaceオブジェクトを表す(全てのtop levelのモジュール,クラス,他のオブ" +"ジェクトを把握する隠れたRubyモジュール)" + +# YARD::Config +#: ../lib/yard/config.rb:3 +msgid "" +"This class maintains all system-wide configuration for YARD and handles\n" +"the loading of plugins. To access options call {options}, and to load\n" +"a plugin use {load_plugin}. All other public methods are used by YARD\n" +"during load time." +msgstr "" +"このクラスは\n" +"YARDとプラグインのロードを操作するシステム全体の設定を維持する。\n" +"設定を呼び出す{options}にアクセスする為や、\n" +"プラグインを使う{load_plugin}をロードする事を目的に、\n" +"全ての他のpublicなメソッドが、\n" +"ロード中にYARDによって利用される。" + +# YARD::Config +#: ../lib/yard/config.rb:8 +msgid "== User Configuration Files" +msgstr "== ユーザー設定ファイル" + +# YARD::Config +#: ../lib/yard/config.rb:10 +msgid "" +"Persistent user configuration files can be stored in the file\n" +"+~/.yard/config+, which is read when YARD first loads. The file should\n" +"be formatted as YAML, and should contain a map of keys and values." +msgstr "" +"persistent(長く使った)ユーザーの設定ファイルは、+~/.yard/config+ ファイルの中" +"に記録される。\n" +"そして、YARDが最初にロードする時に、読み出される。\n" +"このファイルはYAMLのように書式化される、\n" +"そして、キーや値のマップを含んでいるはずである。" + +# YARD::Config +#: ../lib/yard/config.rb:14 +msgid "" +"Although you can specify any key-value mapping in the configuration file,\n" +"YARD defines special keys specified in {DEFAULT_CONFIG_OPTIONS}." +msgstr "" +"あなたは、設定ファイルの中に任意のキーや値のマッピングを指定できるけれど" +"も、\n" +"YARDは{DEFAULT_CONFIG_OPTIONS}の中の規定の特別なキーを定義する。" + +# YARD::Config +#: ../lib/yard/config.rb:17 +msgid "An example of a configuration file is listed below:" +msgstr "設定ファイルの例は次のよう記述される。" + +# YARD::Config +#: ../lib/yard/config.rb:19 +msgid "" +" !!!yaml\n" +" load_plugins: true # Auto-load plugins when YARD starts\n" +" ignored_plugins:\n" +" - yard-broken\n" +" - broken2 # yard- prefix not necessary\n" +" autoload_plugins:\n" +" - yard-rspec" +msgstr "" + +# YARD::Config +#: ../lib/yard/config.rb:27 +msgid "== Automatic Loading of Plugins" +msgstr "== プラグインの自動ロード" + +# YARD::Config +#: ../lib/yard/config.rb:29 +msgid "" +"YARD 0.6.2 will no longer automatically load all plugins by default. This\n" +"option can be reset by setting 'load_plugins' to true in the configuration\n" +"file. In addition, you can specify a set of specific plugins to load on\n" +"load through the 'autoload_plugins' list setting. This setting is\n" +"independent of the 'load_plugins' value and will always be processed." +msgstr "" +"YARD 0.6.2からは、デフォルトで全てのプラグインを自動ロードしない。\n" +"この設定は、設定ファイルの中の'load_plugins'をtrueに設定する事によってリセッ" +"トできる。\n" +"さらに、あなたは、\n" +"'autoload_plugins'リストのセッティングを通して、\n" +"ロード毎に特定のプラグインの設定を指定できる。\n" +"特定のプラグインのグループを指定できる。\n" +"この設定は、'load_plugins'の独自の値となり、そして常に処理されるだろう。" + +# YARD::Config +#: ../lib/yard/config.rb:35 +msgid "== Ignored Plugins File" +msgstr "== プラグインファイルを無視する" + +# YARD::Config +#: ../lib/yard/config.rb:37 +msgid "" +"YARD 0.5 and below used a +~/.yard/ignored_plugins+ file to specify\n" +"plugins to be ignored at load time. Ignored plugins in 0.6.2 and above\n" +"should now be specified in the main configuration file, though YARD\n" +"will support the +ignored_plugins+ file until 0.7.x." +msgstr "" +"YARD 0.5やそれ以下では、\n" +"ロード時間で無視されるプラグインを指定する為に\n" +"+~/.yard/ignored_plugins+ ファイルを利用した。\n" +"0.6.2以上で無視されるプラグインは、\n" +"現在、主に設定ファイルの中で規定されるはずである。\n" +"とはいえ,YARDは +ignored_pluginis+ ファイルを0.7.xまで、サポートする。" + +# YARD::Config +#: ../lib/yard/config.rb:42 +msgid "== Safe Mode" +msgstr "== セーフモード" + +# YARD::Config +#: ../lib/yard/config.rb:44 +msgid "" +"YARD supports running in safe-mode. By doing this, it will avoid executing\n" +"any user code such as require files or queries. Plugins will still be\n" +"loaded with safe mode on, because plugins are properly namespaced with\n" +"a 'yard-' prefix, must be installed as a gem, and therefore cannot be\n" +"touched by the user. To specify safe mode, use the +safe_mode+ key." +msgstr "" +"YARDはセーフモードでの起動をサポートする。\n" +"これを行うことにより、requireファイルやクエリーのような\n" +"任意のユーザーコードの実行を無効にする。\n" +"しかし、プラグインはセーフモードの実行と共にロードされる。\n" +"何故なら、プラグインは、'yard-'プレフィックスと共に、\n" +"適切にnamespaceが設定され,\n" +"gemのようにインストールされるはずである,\n" +"そして、これ自身の設定はユーザーによって変更できない。\n" +"セーフモードを指定するには、 +safe_mode+ キーを利用する。" + +# YARD::Config +#: ../lib/yard/config.rb:50 +msgid "== Plugin Specific Configuration" +msgstr "== プラグインの詳細な設定" + +# YARD::Config +#: ../lib/yard/config.rb:52 +msgid "" +"Additional settings can be defined within the configuration file\n" +"specifically to provide configuration for a plugin. A plugin that utilizes\n" +"the YARD configuration is strongly encouraged to utilize namespacing of\n" +"their configuration content." +msgstr "" +"追加の設定は\n" +"プラグイン用の設定を提供する為に、\n" +"明確に設定ファイルの中で\n" +"定義される。\n" +"YARDの設定を利用するプラグインは、\n" +"その設定内容のnamespaceを利用する為に\n" +"強力に後押しされる。" + +# YARD::Config +#: ../lib/yard/config.rb:57 +msgid "" +" !!!yaml\n" +" load_plugins: true # Auto-load plugins when YARD starts\n" +" ignored_plugins:\n" +" - yard-broken\n" +" - broken2 # yard- prefix not necessary\n" +" autoload_plugins:\n" +" - yard-rspec\n" +" # Plugin Specific Configuration\n" +" yard-sample-plugin:\n" +" show-results-inline: true" +msgstr "" + +# YARD::Config +#: ../lib/yard/config.rb:68 +msgid "" +"As the configuration is available system wide, it can be\n" +"accessed within the plugin code." +msgstr "" +"この設定はシステム全体に及び、\n" +"プラグインのコードの中で、アクセスできる。" + +# YARD::Config +#: ../lib/yard/config.rb:72 +msgid "" +" if YARD::Config.options['yard-sample-plugin'] and\n" +" YARD::Config.options['yard-sample-plugin']['show-results-inline']\n" +" # ... perform the action that places the results inline ...\n" +" else\n" +" # ... do the default behavior of not showing the results inline ...\n" +" end" +msgstr "" + +# YARD::Config +#: ../lib/yard/config.rb:79 +msgid "" +"When accessing the configuration, be aware that this file is user managed\n" +"so configuration keys and values may not be present. Make no assumptions " +"and\n" +"instead ensure that you check for the existence of keys before proceeding " +"to\n" +"retrieve values." +msgstr "" +"設定にアクセスする時、\n" +"このファイルはユーザーが扱う事に注意する。\n" +"なので、キーや値の設定は見つからないかもしれない。\n" +"勝手に作成しない代わりに、\n" +"あなたが値を取り出す手続きをする前にキーの存在の管理する事を保証する。" + +# @see +#: ../lib/yard/config.rb:85 +msgid "tag|see|options" +msgstr "" + +# YARD::Config.options +# YARD::Config.options= +#: ../lib/yard/config.rb:88 +msgid "The system-wide configuration options for YARD" +msgstr "YARD用のシステム全体の設定オプション" + +# @return [SymbolHash] +#: ../lib/yard/config.rb:90 +msgid "a map a key-value pair settings." +msgstr "キー,値のペア設定のマップ" + +# @see +#: ../lib/yard/config.rb:90 +msgid "tag|see|DEFAULT_CONFIG_OPTIONS" +msgstr "" + +# YARD::Config::CONFIG_DIR +#: ../lib/yard/config.rb:94 +msgid "The location where YARD stores user-specific settings" +msgstr "YARDがユーザー固有の設定を記録する場所" + +# YARD::Config::CONFIG_FILE +#: ../lib/yard/config.rb:97 +msgid "The main configuration YAML file." +msgstr "YAMLファイルの主な設定" + +# YARD::Config::IGNORED_PLUGINS +#: ../lib/yard/config.rb:100 +msgid "File listing all ignored plugins" +msgstr "ファイルに記述する、無視されるプラグイン" + +# @deprecated +#: ../lib/yard/config.rb:101 +msgid "Set `ignored_plugins` in the {CONFIG_FILE} instead." +msgstr "{CONFIG_FILE}の代わりに、`ignored_plugins`を設定する。" + +# YARD::Config::DEFAULT_CONFIG_OPTIONS +#: ../lib/yard/config.rb:104 +msgid "Default configuration options" +msgstr "デフォルトの設定オプション" + +# YARD::Config::YARD_PLUGIN_PREFIX +#: ../lib/yard/config.rb:112 +msgid "" +"The prefix used for YARD plugins. Name your gem with this prefix\n" +"to allow it to be used as a plugin." +msgstr "" +"プレフィックスは、YARDプラグイン用に利用される。\n" +"あなたのgemがプラグインの様に利用される為に、\n" +"このプレフィックスと共に名付ける。" + +# YARD::Config.load +#: ../lib/yard/config.rb:116 +msgid "" +"Loads settings from {CONFIG_FILE}. This method is called by YARD at\n" +"load time and should not be called by the user." +msgstr "" +"{CONFIG_FILE}からの設定をロードする。\n" +"これメソッドは、ロード時間でYARDによって呼び出される。\n" +"そして、ユーザーによって呼び出されないはずである。" + +# YARD::Config.save +#: ../lib/yard/config.rb:132 +msgid "Saves settings to {CONFIG_FILE}." +msgstr "{CONFIG_FILE}の為の設定を保存する。" + +# @deprecated +#: ../lib/yard/config.rb:143 +msgid "Use {Config.load_plugins}" +msgstr "" + +# @return [Boolean] +#: ../lib/yard/config.rb:143 +msgid "true if all plugins loaded successfully, false otherwise." +msgstr "全てのプラグインが正しくロードした場合、true、そうでなければ、false" + +# YARD::Config.load_plugin +#: ../lib/yard/config.rb:150 +msgid "" +"Loads an individual plugin by name. It is not necessary to include the\n" +"+yard-+ plugin prefix here." +msgstr "" +"名前によって、個々のプラグインをロードする。\n" +"ここで +yard-+ プラグインのプレフィックスを含む必要は無い。" + +# @param [String] name +#: ../lib/yard/config.rb:154 +msgid "the name of the plugin (with or without +yard-+ prefix)" +msgstr "プラグインの名前( +yard-+ プレフィックスの有無にかかわらず)" + +# @return [Boolean] +#: ../lib/yard/config.rb:154 +msgid "whether the plugin was successfully loaded" +msgstr "プラグインがロードに成功したかどうか" + +# YARD::Config.load_gem_plugins +#: ../lib/yard/config.rb:168 +msgid "Load gem plugins if :load_plugins is true" +msgstr ":load_pluginsがtrueの場合、gemプラグインをロードする" + +# YARD::Config.load_autoload_plugins +#: ../lib/yard/config.rb:188 +msgid "Load plugins set in :autoload_plugins" +msgstr ":autoload_pluginsの中のグループのプラグインをロードする。" + +# YARD::Config.load_commandline_plugins +#: ../lib/yard/config.rb:193 +msgid "Load plugins from {#arguments}" +msgstr "(#arguments)メソッドからプラグインをロードする。" + +# YARD::Config.load_commandline_safemode +#: ../lib/yard/config.rb:203 +msgid "Check for command-line safe_mode switch in {#arguments}" +msgstr "" + +# YARD::Config.load_plugin_failed +#: ../lib/yard/config.rb:212 +msgid "Print a warning if the plugin failed to load" +msgstr "ロードに失敗したプラグインの場合、警告をプリントする。" + +# YARD::Config.add_ignored_plugins_file +#: ../lib/yard/config.rb:220 +msgid "Legacy support for {IGNORED_PLUGINS}" +msgstr "{IGNORED_PLUGINS}用のレガシーサポート" + +# YARD::Config.translate_plugin_names +#: ../lib/yard/config.rb:227 +msgid "Translates plugin names to add yard- prefix." +msgstr "yard-プレフィックスを追加する為にプラグイン名を翻訳する。" + +# YARD::Config.read_config_file +#: ../lib/yard/config.rb:233 +msgid "Loads the YAML configuration file into memory" +msgstr "メモリの中にYAML設定ファイルをロードする。" + +# @see +#: ../lib/yard/config.rb:235 +msgid "tag|see|CONFIG_FILE" +msgstr "" + +# @return [Hash] +#: ../lib/yard/config.rb:235 +msgid "the contents of the YAML file from disk" +msgstr "ディスクからのYAMLファイルの内容" + +# YARD::Config.translate_plugin_name +#: ../lib/yard/config.rb:245 +msgid "Sanitizes and normalizes a plugin name to include the 'yard-' prefix." +msgstr "'yard-'プレフィックスを含んでいるプラグイン名を正規化する。" + +# @param [String] name +#: ../lib/yard/config.rb:247 +msgid "the plugin name" +msgstr "プラグイン名" + +# @return [String] +#: ../lib/yard/config.rb:247 +msgid "the sanitized and normalized plugin name." +msgstr "正規化されるプラグイン名" + +# YARD::Config.with_yardopts +#: ../lib/yard/config.rb:254 +msgid "Temporarily loads .yardopts file into @yardopts" +msgstr "@yardoptsの中に、.yardoptsファイルを一時的にロードする。" + +# @return [Array] +#: ../lib/yard/config.rb:263 +msgid "arguments from commandline and yardopts file" +msgstr "コマンドラインやyardoptsファイルからの引数" + +# Array#place +#: ../lib/yard/core_ext/array.rb:3 +msgid "" +"Places values before or after another object (by value) in\n" +"an array. This is used in tandem with the before and after\n" +"methods of the {Insertion} class." +msgstr "" +"配列の前後に他のオブジェクト(値として)の値を置く\n" +"これは、前後に{Insertion}クラスのメソッドを用いている。" + +# @example Places an item before another +#: ../lib/yard/core_ext/array.rb:14 +msgid "[1, 2, 3].place(4).before(3) # => [1, 2, 4, 3]" +msgstr "" + +# @example Places an item after another +#: ../lib/yard/core_ext/array.rb:14 +msgid "[:a, :b, :c].place(:x).after(:a) # => [:a, :x, :b, :c]" +msgstr "" + +# @return [Insertion] +#: ../lib/yard/core_ext/array.rb:14 +msgid "an insertion object to" +msgstr "挿入されたオブジェクト" + +# @example +#: ../lib/yard/core_ext/array.rb:14 +msgid "tag|example|Places an item after another" +msgstr "後ろに別の要素を置く" + +# @example +#: ../lib/yard/core_ext/array.rb:14 +msgid "tag|example|Places an item before another" +msgstr "前に別の要素を置く" + +# @param [Array] +#: ../lib/yard/core_ext/array.rb:14 +msgid "tag|param|values" +msgstr "values" + +# @see +#: ../lib/yard/core_ext/array.rb:14 +msgid "tag|see|Insertion#after" +msgstr "" + +# @see +#: ../lib/yard/core_ext/array.rb:14 +msgid "tag|see|Insertion#before" +msgstr "" + +# @param [Array] values +#: ../lib/yard/core_ext/array.rb:14 +msgid "value to insert" +msgstr "挿入する値" + +# File.relative_path +#: ../lib/yard/core_ext/file.rb:10 +msgid "" +"Turns a path +to+ into a relative path from starting\n" +"point +from+. The argument +from+ is assumed to be\n" +"a filename. To treat it as a directory, make sure it\n" +"ends in +File::SEPARATOR+ ('/' on UNIX filesystems)." +msgstr "" +"+from+ で始まる場所から、相対パスの情報へパスを変える。\n" +"+from+ の引数は、ファイル名になるように処理される。\n" +"ディレクトリとして取得するには、 +File::SEPARATOR+ で終わる必要がある。\n" +"(UNIX上のファイルシステムなら、'/')" + +# File.relative_path +# File.cleanpath +#: ../lib/yard/core_ext/file.rb:18 ../lib/yard/core_ext/file.rb:35 +msgid "Manipulating Paths" +msgstr "パスを操作する" + +# @param [String] +#: ../lib/yard/core_ext/file.rb:18 +msgid "tag|param|from" +msgstr "from" + +# @param [String] +#: ../lib/yard/core_ext/file.rb:18 +msgid "tag|param|to" +msgstr "to" + +# @param [String] to +#: ../lib/yard/core_ext/file.rb:18 +msgid "the final path that should be made relative." +msgstr "対応して作られる最後のパス" + +# @return [String] +#: ../lib/yard/core_ext/file.rb:18 +msgid "the relative path from +from+ to +to+." +msgstr "+from+ から +to+ への相対パス" + +# @param [String] from +#: ../lib/yard/core_ext/file.rb:18 +msgid "" +"the starting filename\n" +"(or directory with +from_isdir+ set to +true+)." +msgstr "" +"ファイル名(又は +from_isdir+ を +true+ を設定した場合はディレクトリ)の文字列" + +# File.cleanpath +#: ../lib/yard/core_ext/file.rb:30 +msgid "Cleans a path by removing extraneous '..', '.' and '/' characters" +msgstr "無関係の '..', '.', '/' 文字を削除し、パスをきれいにする。" + +# @example Clean a path +#: ../lib/yard/core_ext/file.rb:35 +msgid "File.cleanpath('a/b//./c/../e') # => \"a/b/e\"" +msgstr "" + +# @example +#: ../lib/yard/core_ext/file.rb:35 +msgid "tag|example|Clean a path" +msgstr "pathをきれいにする" + +# @param [String] +# @param [Array] +# @param [String, :root] +#: ../lib/yard/core_ext/file.rb:35 ../lib/yard/i18n/message.rb:34 +#: ../lib/yard/registry.rb:235 ../lib/yard/server.rb:7 +#: ../lib/yard/server/doc_server_helper.rb:65 +#: ../lib/yard/templates/engine.rb:20 ../lib/yard/templates/engine.rb:34 +#: ../lib/yard/templates/engine.rb:52 ../lib/yard/templates/engine.rb:160 +#: ../lib/yard/templates/engine.rb:175 ../lib/yard/templates/template.rb:182 +msgid "tag|param|path" +msgstr "path" + +# @param [String] path +#: ../lib/yard/core_ext/file.rb:35 +msgid "the path to clean" +msgstr "きれいにするパス" + +# @return [String] +#: ../lib/yard/core_ext/file.rb:35 +msgid "the sanitized path" +msgstr "きれいにされたパス" + +# File.open! +#: ../lib/yard/core_ext/file.rb:51 +msgid "" +"Forces opening a file (for writing) by first creating the file's directory" +msgstr "" +"最初にファイルのディレクトリを作成する事によって、開くファイル(書込み用)を強" +"制する。" + +# @since +#: ../lib/yard/core_ext/file.rb:53 +msgid "0.5.2" +msgstr "" + +# File.open! +# File.read_binary +#: ../lib/yard/core_ext/file.rb:53 ../lib/yard/core_ext/file.rb:62 +msgid "Reading Files" +msgstr "ファイルを読み込む" + +# @param [String] file +#: ../lib/yard/core_ext/file.rb:53 +msgid "the filename to open" +msgstr "展開するファイル名" + +# File.read_binary +#: ../lib/yard/core_ext/file.rb:60 +msgid "Reads a file with binary encoding" +msgstr "バイナリコードにしてファイルを読み込む" + +# @return [String] +#: ../lib/yard/core_ext/file.rb:62 +msgid "the ascii-8bit encoded data" +msgstr "ascii-8bitにエンコードされたデータ" + +# Insertion +#: ../lib/yard/core_ext/insertion.rb:2 +msgid "" +"The Insertion class inserts a value before or after another\n" +"value in a list." +msgstr "Insertionクラスはリストの中の前後に他の値を挿入する。" + +# @example +#: ../lib/yard/core_ext/insertion.rb:6 +msgid "Insertion.new([1, 2, 3], 4).before(3) # => [1, 2, 4, 3]" +msgstr "" + +# Insertion#initialize +#: ../lib/yard/core_ext/insertion.rb:8 +msgid "" +"Creates an insertion object on a list with a value to be\n" +"inserted. To finalize the insertion, call {#before} or\n" +"{#after} on the object." +msgstr "" +"挿入される値と共にリスト上のinsertionオブジェクトを作成する。\n" +"最終的にinsertionは、オブジェクト上の{#before}や{#after}メソッドを呼び出す。" + +# @return [Insertion] +#: ../lib/yard/core_ext/insertion.rb:13 +msgid "a new instance of Insertion" +msgstr "Insertionの新しいインスタンス" + +# @param [Array] +# @param [Array] +# @param [Array] +#: ../lib/yard/core_ext/insertion.rb:13 ../lib/yard/core_ext/insertion.rb:45 +#: ../lib/yard/templates/helpers/base_helper.rb:29 +#: ../lib/yard/templates/helpers/base_helper.rb:165 +#: ../lib/yard/templates/helpers/module_helper.rb:10 +#: ../lib/yard/verifier.rb:90 +msgid "tag|param|list" +msgstr "list" + +# @param [Array] list +#: ../lib/yard/core_ext/insertion.rb:13 +msgid "the list to perform the insertion on" +msgstr "insertionで実行するリスト" + +# @param [Object] value +# @param [Object] val +#: ../lib/yard/core_ext/insertion.rb:13 ../lib/yard/core_ext/insertion.rb:45 +msgid "the value to insert" +msgstr "挿入する値" + +# Insertion#before +#: ../lib/yard/core_ext/insertion.rb:16 +msgid "Inserts the value before +val+" +msgstr "+val+ の前に値を挿入する" + +# @param [Boolean] recursive +#: ../lib/yard/core_ext/insertion.rb:18 ../lib/yard/core_ext/insertion.rb:26 +#: ../lib/yard/core_ext/insertion.rb:45 +msgid "look inside sublists" +msgstr "ネストした配列の内部をみるかどうか" + +# @param [Boolean] +#: ../lib/yard/core_ext/insertion.rb:18 ../lib/yard/core_ext/insertion.rb:26 +#: ../lib/yard/core_ext/insertion.rb:45 +msgid "tag|param|recursive" +msgstr "recursive" + +# @param [Object] +#: ../lib/yard/core_ext/insertion.rb:18 ../lib/yard/core_ext/insertion.rb:26 +#: ../lib/yard/core_ext/insertion.rb:45 +msgid "tag|param|val" +msgstr "val" + +# @param [Object] val +#: ../lib/yard/core_ext/insertion.rb:18 +msgid "the object the value will be inserted before" +msgstr "値が前に挿入される,オブジェクト" + +# Insertion#after +#: ../lib/yard/core_ext/insertion.rb:21 +msgid "Inserts the value after +val+." +msgstr "+val+ の前に値を挿入する" + +# @example If subsections are ignored +#: ../lib/yard/core_ext/insertion.rb:26 +msgid "Insertion.new([1, [2], 3], :X).after(1) # => [1, [2], :X, 3]" +msgstr "" + +# @example +#: ../lib/yard/core_ext/insertion.rb:26 +msgid "tag|example|If subsections are ignored" +msgstr "ネストした配列が無視される場合" + +# @param [Object] val +#: ../lib/yard/core_ext/insertion.rb:26 +msgid "the object the value will be inserted after" +msgstr "値が前に挿入される,オブジェクト" + +# Insertion#before_any +#: ../lib/yard/core_ext/insertion.rb:29 +msgid "Alias for {#before} with +recursive+ set to true" +msgstr "+recursive+ にtrueを設定する{#before}メソッド用のエイリアス" + +# Insertion#after_any +#: ../lib/yard/core_ext/insertion.rb:33 +msgid "Alias for {#after} with +recursive+ set to true" +msgstr "+recursive+ にtrueを設定する{#after}メソッド用のエイリアス" + +# Insertion#insertion +#: ../lib/yard/core_ext/insertion.rb:39 +msgid "This method performs the actual insertion" +msgstr "このメソッドが、実際にinsertionを実行する。" + +# @param [Fixnum] +#: ../lib/yard/core_ext/insertion.rb:45 +msgid "tag|param|rel" +msgstr "rel" + +# @param [Array] list +#: ../lib/yard/core_ext/insertion.rb:45 +msgid "the list to place objects into" +msgstr "オブジェクトの情報を置く為のリスト" + +# @param [Fixnum] rel +#: ../lib/yard/core_ext/insertion.rb:45 +msgid "" +"the relative index (0 or 1) of where the object\n" +"should be placed" +msgstr "オブジェクトが置かれる所の相対インデックス(0又は1)" + +# Module#class_name +#: ../lib/yard/core_ext/module.rb:3 +msgid "Returns the class name of a full module namespace path" +msgstr "モジュールの完全なnamespaceパスのクラス名を返す" + +# @example +#: ../lib/yard/core_ext/module.rb:7 +msgid "module A::B::C; class_name end # => \"C\"" +msgstr "" + +# @return [String] +#: ../lib/yard/core_ext/module.rb:7 +msgid "the last part of a module path" +msgstr "モジュールパスの最後の部分" + +# @return [String] +#: ../lib/yard/core_ext/module.rb:16 +msgid "the namespace minus the class/module name" +msgstr "クラス/モジュール名を引いたnamespace" + +# String#shell_split +#: ../lib/yard/core_ext/string.rb:3 +msgid "" +"Splits text into tokens the way a shell would, handling quoted\n" +"text as a single token. Use '\\\"' and \"\\'\" to escape quotes and\n" +"'\\\\' to escape a backslash." +msgstr "" +"シェルの場合テキスト情報のトークンを分割し、\n" +"単一のトークンとしてクオートされたテキストを操作する。\n" +"エスケープをクオートするには、'\\\"'と\"\\'\"、\n" +"バックスラッシュをエスケープするには'\\\\'を使う。" + +# @return [Array] +#: ../lib/yard/core_ext/string.rb:7 +msgid "an array representing the tokens" +msgstr "トークンを表す配列" + +# SymbolHash +#: ../lib/yard/core_ext/symbol_hash.rb:2 +msgid "" +"A subclass of Hash where all keys are converted into Symbols, and\n" +"optionally, all String values are converted into Symbols." +msgstr "" +"全てのキーがSymbolsに変換される所のハッシュのサブクラス、\n" +"自由に全てのStringの値をSymblosに変換できる。" + +# SymbolHash#initialize +#: ../lib/yard/core_ext/symbol_hash.rb:5 +msgid "Creates a new SymbolHash object" +msgstr "新しいSymbolHashオブジェクトを作成する" + +# @return [SymbolHash] +#: ../lib/yard/core_ext/symbol_hash.rb:8 +msgid "a new instance of SymbolHash" +msgstr "SymbolHashの新しいインスタンス" + +# @param [Boolean] symbolize_value +#: ../lib/yard/core_ext/symbol_hash.rb:8 +msgid "" +"converts any String values into Symbols\n" +"if this is set to +true+." +msgstr "" +"この設定がtrueの場合、\n" +"全てのStringの値をSymbolへ変換する。" + +# @param [Boolean] +#: ../lib/yard/core_ext/symbol_hash.rb:8 +msgid "tag|param|symbolize_value" +msgstr "symbolize_value" + +# @overload +#: ../lib/yard/core_ext/symbol_hash.rb:27 +msgid "tag|overload|[]" +msgstr "" + +# SymbolHash#[]= +#: ../lib/yard/core_ext/symbol_hash.rb:38 +msgid "Assigns a value to a symbolized key" +msgstr "シンボル化されたキーに値を割り当てる" + +# @param [#to_sym] key +#: ../lib/yard/core_ext/symbol_hash.rb:41 +msgid "the key" +msgstr "キー" + +# @param [Object] value +#: ../lib/yard/core_ext/symbol_hash.rb:41 +msgid "" +"the value to be assigned. If this is a String and\n" +"values are set to be symbolized, it will be converted into a Symbol." +msgstr "" +"割り当てられる値。\n" +"これが、文字列の場合には、値がシンボル化される為に設定され、\n" +"シンボルへ変換されるだろう。" + +# SymbolHash#[] +#: ../lib/yard/core_ext/symbol_hash.rb:46 +msgid "Accessed a symbolized key" +msgstr "シンボル化されるキーにアクセスされる" + +# @param [#to_sym] key +#: ../lib/yard/core_ext/symbol_hash.rb:48 +msgid "the key to access" +msgstr "アクセスする為のキー" + +# @return [Object] +#: ../lib/yard/core_ext/symbol_hash.rb:48 +msgid "the value associated with the key" +msgstr "キーに関連付けられた値" + +# SymbolHash#delete +#: ../lib/yard/core_ext/symbol_hash.rb:51 +msgid "Deleted a key and value associated with it" +msgstr "関連付けられたキーと値が削除される" + +# @param [#to_sym] key +#: ../lib/yard/core_ext/symbol_hash.rb:53 ../lib/yard/registry_store.rb:72 +msgid "the key to delete" +msgstr "削除するキー" + +# SymbolHash#has_key? +#: ../lib/yard/core_ext/symbol_hash.rb:56 +msgid "Tests if a symbolized key exists" +msgstr "シンボル化されたキーがあるかテストする" + +# @param [#to_sym] key +#: ../lib/yard/core_ext/symbol_hash.rb:58 +msgid "the key to test" +msgstr "テストするキー" + +# @return [Boolean] +#: ../lib/yard/core_ext/symbol_hash.rb:58 +msgid "whether the key exists" +msgstr "キーが存在するかどうか" + +# SymbolHash#update +# SymbolHash#merge! +#: ../lib/yard/core_ext/symbol_hash.rb:61 +#: ../lib/yard/core_ext/symbol_hash.rb:67 +msgid "" +"Updates the object with the contents of another Hash object.\n" +"This method modifies the original SymbolHash object" +msgstr "" +"他のハッシュオブジェクトの内容と共にオブジェクトを更新する。\n" +"このメソッドは元のSymbolHashオブジェクトを変更する。" + +# @param [Hash] +#: ../lib/yard/core_ext/symbol_hash.rb:65 +#: ../lib/yard/core_ext/symbol_hash.rb:72 +msgid "tag|param|hash" +msgstr "" + +# @param [Hash] hash +#: ../lib/yard/core_ext/symbol_hash.rb:65 +msgid "the hash object to copy the values from" +msgstr "ハッシュオブジェクトから値をコピーする,ハッシュ" + +# SymbolHash#merge +#: ../lib/yard/core_ext/symbol_hash.rb:69 +msgid "Merges the contents of another hash into a new SymbolHash object" +msgstr "新しいSymbolHashオブジェクトへ他のハッシュの内容をマージする。" + +# @return [SymbolHash] +#: ../lib/yard/core_ext/symbol_hash.rb:72 +msgid "a new SymbolHash containing the merged data" +msgstr "マージされたデータを含んでいる新しいSymbolHash" + +# @param [Hash] hash +#: ../lib/yard/core_ext/symbol_hash.rb:72 +msgid "the hash of objects to copy" +msgstr "コピーするオブジェクトのハッシュ" + +# YARD::Docstring +#: ../lib/yard/docstring.rb:3 +msgid "" +"A documentation string, or \"docstring\" for short, encapsulates the\n" +"comments and metadata, or \"tags\", of an object. Meta-data is expressed\n" +"in the form +@tag VALUE+, where VALUE can span over multiple lines as\n" +"long as they are indented. The following +@example+ tag shows how tags\n" +"can be indented:" +msgstr "" +"documentation stringを略して\"docstring\"は、\n" +"コメントやメタデータ,オブジェクトのタグをカプセル化する。\n" +"メタデータは +@tag VALUE+ から\n" +"VALUEがインデントされる間の複数行に渡って表される。\n" +"次の +@example+ タグは\n" +"タグがどのようにインデントされるか表す。" + +# YARD::Docstring +#: ../lib/yard/docstring.rb:9 +msgid "" +" # @example My example\n" +" # a = \"hello world\"\n" +" # a.reverse\n" +" # @version 1.0" +msgstr "" + +# YARD::Docstring +#: ../lib/yard/docstring.rb:14 +msgid "" +"Tags can be nested in a documentation string, though the {Tags::Tag}\n" +"itself is responsible for parsing the inner tags." +msgstr "" +"タグはドキュメント文字列の中でネストされ、{Tags::Tag}自身は、\n" +"中のタグを解析する責任がある。" + +# @note +#: ../lib/yard/docstring.rb:27 +msgid "" +"Plugin developers should make sure to reset this value\n" +"after parsing finishes. This can be done via the\n" +"{Parser::SourceParser.after_parse_list} callback. This will\n" +"ensure that YARD can properly parse multiple projects in\n" +"the same process." +msgstr "" + +# @param [Docstring] +#: ../lib/yard/docstring.rb:27 +msgid "tag|see|DocstringParser" +msgstr "" + +# @see +#: ../lib/yard/docstring.rb:27 +msgid "tag|see|Parser::SourceParser.after_parse_list" +msgstr "" + +# @return [Class] +#: ../lib/yard/docstring.rb:27 +msgid "" +"the parser class used to parse\n" +"text and optional meta-data from docstrings. Defaults to\n" +"{DocstringParser}." +msgstr "" + +# YARD::Docstring.parser +#: ../lib/yard/docstring.rb:30 +msgid "" +"Creates a parser object using the current {default_parser}.\n" +"Equivalent to:\n" +" Docstring.default_parser.new(*args)" +msgstr "" + +# @param args +#: ../lib/yard/docstring.rb:37 +msgid "" +"arguments are passed to the {DocstringParser}\n" +"class. See {DocstringParser#initialize} for details on\n" +"arguments." +msgstr "" + +# @return [Object, nil] +#: ../lib/yard/docstring.rb:37 +msgid "" +"the parser object used to parse a\n" +"docstring." +msgstr "docstringを解析する為に利用したパーサーオブジェクト。" + +# @return [Array] +#: ../lib/yard/docstring.rb:43 +msgid "the list of reference tags" +msgstr "参照タグのリスト" + +# @return [CodeObjects::Base] +#: ../lib/yard/docstring.rb:46 +msgid "the object that owns the docstring." +msgstr "docstring自身のオブジェクト" + +# @return [Range] +#: ../lib/yard/docstring.rb:49 +msgid "line range in the {#object}'s file where the docstring was parsed from" +msgstr "解析されるdocstringの{#object}ファイルの中のline range" + +# @return [String] +#: ../lib/yard/docstring.rb:52 +msgid "the raw documentation (including raw tag text)" +msgstr "未加工のドキュメント(未加工のタグテキストを含んでいる)" + +# @return [Boolean] +#: ../lib/yard/docstring.rb:55 +msgid "whether the docstring was started with \"##\"" +msgstr "docstringが\"##\"と共に記録される" + +# YARD::Docstring::META_MATCH +#: ../lib/yard/docstring.rb:59 +msgid "Matches a tag at the start of a comment line" +msgstr "コメント行の始まりでタグにマッチする。" + +# @deprecated +#: ../lib/yard/docstring.rb:60 +msgid "Use {DocstringParser::META_MATCH}" +msgstr "" + +# YARD::Docstring.new! +#: ../lib/yard/docstring.rb:65 +msgid "" +"Creates a new docstring without performing any parsing through\n" +"a {DocstringParser}. This method is called by +DocstringParser+\n" +"when creating the new docstring object." +msgstr "" + +# YARD::Docstring#initialize +# YARD::Docstring#+ +# YARD::Docstring#replace +# YARD::Docstring#dup +#: ../lib/yard/docstring.rb:74 ../lib/yard/docstring.rb:99 +#: ../lib/yard/docstring.rb:112 ../lib/yard/docstring.rb:123 +#: ../lib/yard/docstring.rb:129 ../lib/yard/docstring.rb:138 +msgid "Creating a Docstring Object" +msgstr "Docstringオブジェクトを作成する" + +# @param [String] +#: ../lib/yard/docstring.rb:74 +msgid "tag|param|raw_data" +msgstr "" + +# @param [Tags::Tag, Tags::RefTag] +#: ../lib/yard/docstring.rb:74 ../lib/yard/docstring.rb:214 +msgid "tag|param|tags" +msgstr "" + +# @param [String] +#: ../lib/yard/docstring.rb:74 ../lib/yard/parser/ruby/legacy/ruby_lex.rb:48 +#: ../lib/yard/serializers/stdout_serializer.rb:25 +#: ../lib/yard/tags/default_factory.rb:12 +#: ../lib/yard/tags/default_factory.rb:21 +#: ../lib/yard/tags/default_factory.rb:32 +#: ../lib/yard/tags/default_factory.rb:44 +#: ../lib/yard/tags/default_factory.rb:56 +#: ../lib/yard/tags/default_factory.rb:98 ../lib/yard/tags/tag.rb:43 +#: ../lib/yard/templates/helpers/html_helper.rb:16 +#: ../lib/yard/templates/helpers/html_helper.rb:24 +#: ../lib/yard/templates/helpers/html_helper.rb:36 +#: ../lib/yard/templates/helpers/html_helper.rb:57 +#: ../lib/yard/templates/helpers/html_helper.rb:73 +#: ../lib/yard/templates/helpers/html_helper.rb:83 +#: ../lib/yard/templates/helpers/html_helper.rb:91 +#: ../lib/yard/templates/helpers/html_helper.rb:101 +#: ../lib/yard/templates/helpers/html_helper.rb:109 +#: ../lib/yard/templates/helpers/html_helper.rb:123 +#: ../lib/yard/templates/helpers/html_helper.rb:180 +#: ../lib/yard/templates/helpers/uml_helper.rb:26 +msgid "tag|param|text" +msgstr "" + +# @param [String] raw_data +#: ../lib/yard/docstring.rb:74 +msgid "" +"the complete docstring, including all\n" +"original formatting and any unparsed tags/directives." +msgstr "" + +# YARD::CodeObjects::Base#tags +#: ../lib/yard/docstring.rb:74 +msgid "the list of tag objects in the docstring" +msgstr "docstringの中のタグオブジェクトのリスト" + +# @param [CodeObjects::Base] object +#: ../lib/yard/docstring.rb:74 +msgid "" +"the object associated with the\n" +"docstring. May be nil." +msgstr "docstringと共に関連したオブジェクト, nilになるかもしれない。" + +# @return [CodeObjects::Base] +#: ../lib/yard/docstring.rb:74 +msgid "the textual portion of the docstring" +msgstr "docstringの原文の一部" + +# YARD::Docstring#initialize +#: ../lib/yard/docstring.rb:84 +msgid "" +"Creates a new docstring with the raw contents attached to an optional\n" +"object. Parsing will be done by the {DocstringParser} class." +msgstr "" +"任意のオブジェクトに追加された未加工のコンテンツを用い新しいdocstringを作成する。\n" +"解析は {DocstringParser} クラスによって完了する。" + +# @example +#: ../lib/yard/docstring.rb:99 +msgid "Docstring.new(\"hello world\\n@return Object return\", someobj)" +msgstr "" + +# @note +#: ../lib/yard/docstring.rb:99 +msgid "" +"To properly parse directives with proper parser context within\n" +"handlers, you should not use this method to create a Docstring.\n" +"Instead, use the {parser}, which takes a handler object that\n" +"can pass parser state onto directives. If a Docstring is created\n" +"with this method, directives do not have access to any parser\n" +"state, and may not function as expected." +msgstr "" + +# @return [Docstring] +#: ../lib/yard/docstring.rb:99 +msgid "a new instance of Docstring" +msgstr "Docstringの新しいインスタンス" + +# @param [CodeObjects::Base] object +#: ../lib/yard/docstring.rb:99 +msgid "" +"an object to associate the docstring\n" +"with." +msgstr "docstringと関連するオブジェクト" + +# @param [TokenList, String] +# @param [String] +# @param [String, #read, Object] +#: ../lib/yard/docstring.rb:99 ../lib/yard/docstring.rb:123 +#: ../lib/yard/docstring_parser.rb:106 ../lib/yard/docstring_parser.rb:123 +#: ../lib/yard/parser/ruby/legacy/statement_list.rb:16 +#: ../lib/yard/parser/source_parser.rb:116 +#: ../lib/yard/parser/source_parser.rb:125 +#: ../lib/yard/parser/source_parser.rb:416 +#: ../lib/yard/parser/source_parser.rb:460 +msgid "tag|param|content" +msgstr "内容" + +# @param [String] content +#: ../lib/yard/docstring.rb:99 +msgid "" +"the raw comments to be parsed into a docstring\n" +"and associated meta-data." +msgstr "docstring,関連するメタデータの中で解析される未加工の内容," + +# YARD::Docstring#+ +#: ../lib/yard/docstring.rb:108 +msgid "Adds another {Docstring}, copying over tags." +msgstr "別の{Docstring}を追加し、タグをコピーする。" + +# @return [Docstring] +#: ../lib/yard/docstring.rb:112 +msgid "a new docstring with both docstrings combines" +msgstr "docstring化し,一体化(別のdocstringと)した、新しいdocstring" + +# @param [Docstring, String] other +#: ../lib/yard/docstring.rb:112 +msgid "" +"the other docstring (or string) to\n" +"add." +msgstr "他の追加するdocstring(やstring)" + +# YARD::Docstring#replace +# YARD::Docstring#all= +#: ../lib/yard/docstring.rb:122 ../lib/yard/docstring.rb:130 +msgid "Replaces the docstring with new raw content. Called by {#all=}." +msgstr "" +"{#all=}メソッドが呼ばれる事によって、新しい整形前の内容にdocstringを置換す" +"る。" + +# @param [String] content +#: ../lib/yard/docstring.rb:123 +msgid "the raw comments to be parsed" +msgstr "解析される未加工のコメント" + +# YARD::Docstring#dup +#: ../lib/yard/docstring.rb:132 +msgid "Deep-copies a docstring" +msgstr "docstringを深い階層までコピーする。" + +# @note +#: ../lib/yard/docstring.rb:138 +msgid "" +"This method creates a new docstring with new tag lists, but does\n" +"not create new individual tags. Modifying the tag objects will still\n" +"affect the original tags." +msgstr "" +"このメソッドは新しいタグリストと共に新しいdocstringを作成する。\n" +"しかし、新しい個々のタグは作成できない。\n" +"タグオブジェクトを変更すると、元のタグに影響するだろう。" + +# @return [Docstring] +#: ../lib/yard/docstring.rb:138 +msgid "a new copied docstring" +msgstr "新しくコピーされたdocstring" + +# @return [nil] +#: ../lib/yard/docstring.rb:151 +msgid "if there is no associated {#line_range}" +msgstr "{#line_range}メソッドに関係ない場合" + +# @return [Fixnum] +#: ../lib/yard/docstring.rb:151 +msgid "the first line of the {#line_range}" +msgstr "{#line_range}メソッドの最初の行" + +# YARD::Docstring#summary +#: ../lib/yard/docstring.rb:156 +msgid "" +"Gets the first line of a docstring to the period or the first paragraph." +msgstr "" +"ピリオドや最初の段落の為に、\n" +"docstringの最初の行を取得する。" + +# @return [String] +#: ../lib/yard/docstring.rb:157 +msgid "" +"The first line or paragraph of the docstring; always ends with a period." +msgstr "docstringの最初の行や段落、そして常にperiodと共に終わる。" + +# YARD::Docstring#to_raw +#: ../lib/yard/docstring.rb:181 +msgid "" +"Reformats and returns a raw representation of the tag data using the\n" +"current tag and docstring data, not the original text." +msgstr "" +"再書式化し返す、\n" +"現在のタグやdocstringデータによって\n" +"未加工のタグデータで表される。\n" +"しかし元のテキストではない。" + +# @todo +#: ../lib/yard/docstring.rb:186 +msgid "Add Tags::Tag#to_raw and refactor" +msgstr "Tags::Tag#to_rawメソッドや再編集を追加する" + +# @return [String] +#: ../lib/yard/docstring.rb:186 +msgid "the updated raw formatted docstring data" +msgstr "更新され書式化される未加工のdocstringのデータ" + +# YARD::Docstring#add_tag +#: ../lib/yard/docstring.rb:209 +msgid "" +"Adds a tag or reftag object to the tag list. If you want to parse\n" +"tag data based on the {Tags::DefaultFactory} tag factory, use\n" +"{DocstringParser} instead." +msgstr "" +"タグのリストにタグや参照タグオブジェクトを追加する。\n" +"あなたが、 {Tags::DefaultFactory} タグファクトリーを元にしたタグデータを解析したい場合\n" +"代わりに {DocstringParser} を使う。" + +# YARD::Docstring#create_tag +# YARD::Docstring#add_tag +# YARD::Docstring#tag +# YARD::Docstring#tags +# YARD::Docstring#has_tag? +# YARD::Docstring#delete_tags +# YARD::Docstring#delete_tag_if +# YARD::Docstring#blank? +#: ../lib/yard/docstring.rb:214 ../lib/yard/docstring.rb:237 +#: ../lib/yard/docstring.rb:245 ../lib/yard/docstring.rb:255 +#: ../lib/yard/docstring.rb:263 ../lib/yard/docstring.rb:272 +#: ../lib/yard/docstring.rb:282 ../lib/yard/docstring.rb:297 +#: ../lib/yard/docstring.rb:310 +msgid "Creating and Accessing Meta-data" +msgstr "メタデータを作成しアクセスする。" + +# @param [Tags::Tag, Tags::RefTag] tags +#: ../lib/yard/docstring.rb:214 +msgid "list of tag objects to add" +msgstr "追加のタグオブジェクトのリスト" + +# YARD::Docstring#tag +#: ../lib/yard/docstring.rb:229 +msgid "" +"Convenience method to return the first tag\n" +"object in the list of tag objects of that name" +msgstr "" +"タグオブジェクトのリストのような名前の中の、\n" +"最初のタグオブジェクトを返す為の便利なメソッド。" + +# @example +#: ../lib/yard/docstring.rb:237 +msgid "" +"doc = Docstring.new(\"@return zero when nil\")\n" +"doc.tag(:return).text # => \"zero when nil\"" +msgstr "" + +# @return [Tags::Tag] +#: ../lib/yard/docstring.rb:237 +msgid "the first tag in the list of {#tags}" +msgstr "{#tags}メソッドのリストの中の、最初のタグ" + +# @param [#to_s] name +#: ../lib/yard/docstring.rb:237 +msgid "the tag name to return data for" +msgstr "データを返す為のタグ名" + +# YARD::Docstring#tags +#: ../lib/yard/docstring.rb:242 +msgid "" +"Returns a list of tags specified by +name+ or all tags if +name+ is not " +"specified." +msgstr "" +"+name+ が指定されない場合、\n" +"+name+ やallタグによって指定されたタグのリストを返す" + +# @return [Array] +#: ../lib/yard/docstring.rb:245 +msgid "the list of tags by the specified tag name" +msgstr "指定されたタグ名によってタグのリストとなる。" + +# @param [#to_s] name +#: ../lib/yard/docstring.rb:245 +msgid "the tag name to return data for, or nil for all tags" +msgstr "データからタグ名を返す、又は、nilの場合、全てのタグ。" + +# YARD::Docstring#has_tag? +#: ../lib/yard/docstring.rb:252 +msgid "Returns true if at least one tag by the name +name+ was declared" +msgstr "宣言されるnameのタグ名が1つでもあれば、trueを返す。" + +# @param [String] name +#: ../lib/yard/docstring.rb:255 +msgid "the tag name to search for" +msgstr "検索の為のタグ名" + +# @return [Boolean] +#: ../lib/yard/docstring.rb:255 +msgid "whether or not the tag +name+ was declared" +msgstr "タグ +name+が宣言されるかどうか\n" + +# YARD::Docstring#delete_tags +#: ../lib/yard/docstring.rb:260 +msgid "Delete all tags with +name+" +msgstr "全てのタグ +name+ を用いた削除する。" + +# @param [Symbol] tag +# @param [String] tag_name +# @param [String] name +#: ../lib/yard/docstring.rb:263 ../lib/yard/docstring_parser.rb:185 +#: ../lib/yard/tags/library.rb:100 +msgid "the tag name" +msgstr "タグ名" + +# YARD::Docstring#delete_tag_if +#: ../lib/yard/docstring.rb:268 +msgid "Deletes all tags where the block returns true" +msgstr "ブロックがtrueを返す所で全てのタグを削除する。" + +# @yieldparam [Tags::Tag] +#: ../lib/yard/docstring.rb:272 +msgid "tag|yieldparam|tag" +msgstr "tag" + +# @yieldparam [Tags::Tag] tag +#: ../lib/yard/docstring.rb:272 +msgid "the tag that is being tested" +msgstr "試されるタグ" + +# @yieldreturn [Boolean] +#: ../lib/yard/docstring.rb:272 +msgid "true if the tag should be deleted" +msgstr "タグが削除される場合、true" + +# YARD::Docstring#blank? +#: ../lib/yard/docstring.rb:278 +msgid "" +"Returns true if the docstring has no content that is visible to a template." +msgstr "docstringがテンプレートの為、明確な内容を持たない場合、trueを返す。" + +# @param [Boolean] +#: ../lib/yard/docstring.rb:282 +msgid "tag|param|only_visible_tags" +msgstr "only_visible_tags" + +# @param [Boolean] only_visible_tags +#: ../lib/yard/docstring.rb:282 +msgid "" +"whether only {Tags::Library.visible_tags}\n" +"should be checked, or if all tags should be considered." +msgstr "" +"{Tags::Library.visible_tags}が、チェックされるかどうか、\n" +"又は、全てのタグが考慮される場合" + +# @return [Boolean] +#: ../lib/yard/docstring.rb:282 +msgid "whether or not the docstring has content" +msgstr "docstringが内容を持っているかどうか" + +# YARD::Docstring#convert_ref_tags +#: ../lib/yard/docstring.rb:295 +msgid "Maps valid reference tags" +msgstr "有効な参照タグをマップする" + +# @return [Array] +#: ../lib/yard/docstring.rb:297 +msgid "the list of valid reference tags" +msgstr "有効な参照タグのリストを返す" + +# YARD::Docstring#parse_comments +#: ../lib/yard/docstring.rb:303 +msgid "Parses out comments split by newlines into a new code object" +msgstr "新しいコードオブジェクトの中の改行によって分割されるコメントを解析する" + +# @param [String] comments +#: ../lib/yard/docstring.rb:310 +msgid "" +"the newline delimited array of comments. If the comments\n" +"are passed as a String, they will be split by newlines." +msgstr "" +"コメントの配列を改行で区切る。\n" +"コメントが文字列の様に解析される場合、改行によって分割される。" + +# @return [String] +#: ../lib/yard/docstring.rb:310 +msgid "" +"the non-metadata portion of the comments to\n" +"be used as a docstring" +msgstr "docstringのように利用される為のコメントのメタデータではない部分" + +# YARD::DocstringParser +#: ../lib/yard/docstring_parser.rb:5 +msgid "" +"Parses text and creates a {Docstring} object to represent documentation\n" +"for a {CodeObjects::Base}. To create a new docstring, you should initialize\n" +"the parser and call {#parse} followed by {#to_docstring}." +msgstr "" + +# YARD::DocstringParser +#: ../lib/yard/docstring_parser.rb:9 +msgid "== Subclassing Notes" +msgstr "" + +# YARD::DocstringParser +#: ../lib/yard/docstring_parser.rb:11 +msgid "" +"The DocstringParser can be subclassed and subtituted during parsing by\n" +"setting the {Docstring.default_parser} attribute with the name of the\n" +"subclass. This allows developers to change the way docstrings are\n" +"parsed, allowing for completely different docstring syntaxes." +msgstr "" + +# @example Creating a Custom DocstringParser +#: ../lib/yard/docstring_parser.rb:29 +msgid "" +"# Parses docstrings backwards!\n" +"class ReverseDocstringParser\n" +" def parse_content(content)\n" +" super(content.reverse)\n" +" end\n" +"end\n" +"\n" +"# Set the parser as default when parsing\n" +"YARD::Docstring.default_parser = ReverseDocstringParser" +msgstr "" + +# @example Creating a Docstring with a DocstringParser +#: ../lib/yard/docstring_parser.rb:29 +msgid "DocstringParser.new.parse(\"text here\").to_docstring" +msgstr "" + +# @example +#: ../lib/yard/docstring_parser.rb:29 +msgid "tag|example|Creating a Custom DocstringParser" +msgstr "tag|example|カスタムDocstringParserを作成する" + +# @example +#: ../lib/yard/docstring_parser.rb:29 +msgid "tag|example|Creating a Docstring with a DocstringParser" +msgstr "tag|example|DocstringParserを用いDocstringを作成する" + +# @param [TokenList, String] +# @param [String] +# @param [String, #read, Object] +#: ../lib/yard/docstring_parser.rb:29 +msgid "tag|see|#parse_content" +msgstr "" + +# @param [String] tag_buf +#: ../lib/yard/docstring_parser.rb:32 +msgid "" +"the parsed text portion of the docstring,\n" +"with tags removed." +msgstr "解析されたdocstringのテキストの一部, 削除されたタグと一緒" + +# @param [String] content +#: ../lib/yard/docstring_parser.rb:35 +msgid "the complete input string to the parser." +msgstr "パーサーの為の完全な入力文字列" + +# @return [Array] +#: ../lib/yard/docstring_parser.rb:39 +msgid "" +"the list of meta-data tags identified\n" +"by the parser" +msgstr "パーサーに認証されたメタデータタグのリスト" + +# @return [Array] +#: ../lib/yard/docstring_parser.rb:44 +msgid "" +"a list of directives identified\n" +"by the parser. This list will not be passed on to the\n" +"Docstring object." +msgstr "" + +# @return [OpenStruct] +#: ../lib/yard/docstring_parser.rb:50 +msgid "" +"any arbitrary state to be passed between\n" +"tags during parsing. Mainly used by directives to coordinate\n" +"behaviour (so that directives can be aware of other directives\n" +"used in a docstring)." +msgstr "" + +# @return [CodeObjects::Base, nil] +#: ../lib/yard/docstring_parser.rb:55 +msgid "" +"the object associated with\n" +"the docstring being parsed. May be nil if the docstring is\n" +"not attached to any object." +msgstr "" + +# @return [Handlers::Base, nil] +#: ../lib/yard/docstring_parser.rb:60 +msgid "" +"the handler parsing this\n" +"docstring. May be nil if this docstring parser is not\n" +"initialized through" +msgstr "" + +# @return [Tags::Library] +#: ../lib/yard/docstring_parser.rb:64 +msgid "" +"the tag library being used to\n" +"identify registered tags in the docstring." +msgstr "" + +# YARD::CodeObjects::CONSTANTMATCH +#: ../lib/yard/docstring_parser.rb:67 +msgid "The regular expression to match the tag syntax" +msgstr "タグ構文にマッチする為の正規表現" + +# YARD::Server::Router#initialize +#: ../lib/yard/docstring_parser.rb:72 +msgid "Creates a new parser to parse docstring data" +msgstr "docstringのデータを解析する為の新しいパーサーを作成する" + +# YARD::Docstring#create_tag +# YARD::Docstring#add_tag +# YARD::Docstring#tag +# YARD::Docstring#tags +# YARD::Docstring#has_tag? +# YARD::Docstring#delete_tags +# YARD::Docstring#delete_tag_if +# YARD::Docstring#blank? +#: ../lib/yard/docstring_parser.rb:75 ../lib/yard/docstring_parser.rb:88 +msgid "Creation and Conversion Methods" +msgstr "作成、変換メソッド" + +# @return [Docstring] +#: ../lib/yard/docstring_parser.rb:75 +msgid "a new instance of DocstringParser" +msgstr "DocstringParserの新しいインスタンス" + +# @param [Tags::Library] library +#: ../lib/yard/docstring_parser.rb:75 +msgid "" +"a tag library for recognizing\n" +"tags." +msgstr "" + +# @param [LibraryVersion] +#: ../lib/yard/docstring_parser.rb:75 ../lib/yard/server/adapter.rb:88 +#: ../lib/yard/server/router.rb:122 +msgid "tag|param|library" +msgstr "" + +# YARD::Docstring#initialize +# YARD::Docstring#+ +# YARD::Docstring#replace +# YARD::Docstring#dup +#: ../lib/yard/docstring_parser.rb:88 +msgid "" +"translates parsed text into\n" +"a Docstring object." +msgstr "Docstringオブジェクトへ解析されたテキストを変換する" + +# YARD::DocstringParser#parse +#: ../lib/yard/docstring_parser.rb:95 +msgid "Parses all content and returns itself." +msgstr "" + +# YARD::Server::Router#parse_library_from_path +# YARD::Server::Router#route +# YARD::Server::Router#route_docs +# YARD::Server::Router#route_index +# YARD::Server::Router#route_list +# YARD::Server::Router#route_search +#: ../lib/yard/docstring_parser.rb:106 ../lib/yard/docstring_parser.rb:123 +msgid "Parsing Methods" +msgstr "解析メソッド" + +# @param [Parser::Ruby::AstNode] +#: ../lib/yard/docstring_parser.rb:106 +msgid "tag|param|handler" +msgstr "" + +# @param [Docstring] +#: ../lib/yard/docstring_parser.rb:106 +msgid "tag|see|#to_docstring" +msgstr "" + +# @param [String, #read, Object] content +#: ../lib/yard/docstring_parser.rb:106 +msgid "the docstring text to parse" +msgstr "解析の為のdocstringのテキスト" + +# @param [Handlers::Base, nil] handler +#: ../lib/yard/docstring_parser.rb:106 +msgid "" +"the handler object that is\n" +"parsing this object. May be nil if this parser is not being\n" +"called from a {Parser::SourceParser} context." +msgstr "" + +# @param [CodeObjects::Base] object +#: ../lib/yard/docstring_parser.rb:106 +msgid "" +"the object that the docstring\n" +"is attached to. Will be passed to directives to act on\n" +"this object." +msgstr "" + +# @return [self] +#: ../lib/yard/docstring_parser.rb:106 +msgid "" +"the parser object. To get the docstring,\n" +"call {#to_docstring}." +msgstr "" + +# YARD::Parser::SourceParser.parse_string +#: ../lib/yard/docstring_parser.rb:119 +msgid "Parses a given block of text." +msgstr "テキストの与えられたブロックを解析する" + +# YARD::Handlers::Base#process +#: ../lib/yard/docstring_parser.rb:123 +msgid "" +"Subclasses can override this method to perform custom\n" +"parsing of content data." +msgstr "" +"サブクラスは内容のデータのカスタム解析を実行する為に\n" +"このメソッドを上書きできる" + +# @yieldreturn [String] +#: ../lib/yard/docstring_parser.rb:123 +msgid "the content to parse" +msgstr "解析する為の内容" + +# YARD::Docstring#create_tag +#: ../lib/yard/docstring_parser.rb:179 +msgid "Creates a tag from the {Tags::DefaultFactory tag factory}." +msgstr "{Tags::DefaultFactory tag factory}から、タグを作成する。" + +# YARD::Docstring#create_tag +#: ../lib/yard/docstring_parser.rb:181 +msgid "To add an already created tag object, append it to {#tags}." +msgstr "既に作成されたタグオブジェクトを追加するには、{#tags}メソッドを追加する。" + +# File.relative_path +# File.cleanpath +#: ../lib/yard/docstring_parser.rb:185 ../lib/yard/docstring_parser.rb:202 +#: ../lib/yard/docstring_parser.rb:208 ../lib/yard/docstring_parser.rb:228 +msgid "Tag Manipulation Methods" +msgstr "タグ操作メソッド" + +# @return [Tags::Tag, Tags::RefTag] +#: ../lib/yard/docstring_parser.rb:185 +msgid "a tag" +msgstr "タグ" + +# @param [String] +#: ../lib/yard/docstring_parser.rb:185 ../lib/yard/tags/library.rb:290 +msgid "tag|param|tag_buf" +msgstr "tag_buf" + +# @param [#to_s] +# @param +# @param [String] +#: ../lib/yard/docstring_parser.rb:185 ../lib/yard/tags/default_factory.rb:12 +#: ../lib/yard/tags/default_factory.rb:21 +#: ../lib/yard/tags/default_factory.rb:32 +#: ../lib/yard/tags/default_factory.rb:44 +#: ../lib/yard/tags/default_factory.rb:56 ../lib/yard/tags/library.rb:267 +#: ../lib/yard/tags/library.rb:280 ../lib/yard/tags/library.rb:290 +#: ../lib/yard/tags/tag.rb:43 +msgid "tag|param|tag_name" +msgstr "tag_name" + +# @param [String] tag_buf +#: ../lib/yard/docstring_parser.rb:185 +msgid "the text attached to the tag with newlines removed." +msgstr "空白文字が削除されたタグを追加したテキスト" + +# YARD::Docstring#create_ref_tag +#: ../lib/yard/docstring_parser.rb:202 +msgid "Creates a {Tags::RefTag}" +msgstr "{Tags::RefTag}を作成する" + +# YARD::Registry.register +#: ../lib/yard/docstring_parser.rb:207 +msgid "Creates a new directive using the registered {#library}" +msgstr "記録された{#library}メソッドを使って新しい命令を作成する" + +# @return [OpenStruct] +#: ../lib/yard/docstring_parser.rb:208 +msgid "the directive object that is created" +msgstr "作成される命令オブジェクト" + +# YARD::DocstringParser#tag_is_directive? +#: ../lib/yard/docstring_parser.rb:227 +msgid "" +"Backward compatibility to detect old tags that should be specified\n" +"as directives in 0.8 and onward." +msgstr "" + +# YARD::DocstringParser#call_directives_after_parse +#: ../lib/yard/docstring_parser.rb:238 +msgid "" +"Calls the {Directive#after_parse} callback on all the\n" +"created directives." +msgstr "" + +# YARD::Parser::SourceParser.before_parse_list +# YARD::Parser::SourceParser.after_parse_list +# YARD::Parser::SourceParser.before_parse_file +# YARD::Parser::SourceParser.after_parse_file +# YARD::Parser::SourceParser.before_parse_list_callbacks +# YARD::Parser::SourceParser.after_parse_list_callbacks +# YARD::Parser::SourceParser.before_parse_file_callbacks +# YARD::Parser::SourceParser.after_parse_file_callbacks +#: ../lib/yard/docstring_parser.rb:239 ../lib/yard/docstring_parser.rb:246 +#: ../lib/yard/docstring_parser.rb:263 ../lib/yard/docstring_parser.rb:268 +msgid "Parser Callback Methods" +msgstr "パーサーコールバックメソッド" + +# YARD::DocstringParser#call_after_parse_callbacks +#: ../lib/yard/docstring_parser.rb:246 +msgid "Calls all {after_parse} callbacks" +msgstr "" + +# YARD::DocstringParser.after_parse +#: ../lib/yard/docstring_parser.rb:255 +msgid "" +"Creates a callback that is called after a docstring is successfully\n" +"parsed. Use this method to perform sanity checks on a docstring's\n" +"tag data, or add any extra tags automatically to a docstring." +msgstr "" + +# @return [Proc] +#: ../lib/yard/docstring_parser.rb:263 +msgid "a block to be called after a docstring is parsed" +msgstr "docstringが解析された後で呼び出されるためのブロック" + +# @yieldparam [SourceParser] +#: ../lib/yard/docstring_parser.rb:263 ../lib/yard/parser/source_parser.rb:292 +#: ../lib/yard/parser/source_parser.rb:321 +msgid "tag|yieldparam|parser" +msgstr "parser" + +# @yieldparam [DocstringParser] parser +#: ../lib/yard/docstring_parser.rb:263 +msgid "" +"the docstring parser object\n" +"with all directives and tags created." +msgstr "" + +# @return [Array] +#: ../lib/yard/docstring_parser.rb:268 +msgid "the {after_parse} callback proc objects" +msgstr "" + +# #P +#: ../lib/yard/globals.rb:4 +msgid "Shortcut for creating a YARD::CodeObjects::Proxy via a path" +msgstr "" + +# #P +# #log +#: ../lib/yard/globals.rb:7 ../lib/yard/globals.rb:16 +msgid "Global Convenience Methods" +msgstr "グローバルな便利メソッド" + +# @see +#: ../lib/yard/globals.rb:7 +msgid "tag|see|YARD::CodeObjects::Proxy" +msgstr "" + +# @see +#: ../lib/yard/globals.rb:7 +msgid "tag|see|YARD::Registry.resolve" +msgstr "" + +# #log +#: ../lib/yard/globals.rb:13 +msgid "The global {YARD::Logger} instance" +msgstr "" + +# @see +#: ../lib/yard/globals.rb:16 +msgid "tag|see|YARD::Logger" +msgstr "" + +# @return [YARD::Logger] +#: ../lib/yard/globals.rb:16 +msgid "the global {YARD::Logger} instance" +msgstr "" + +# YARD::Handlers::NamespaceMissingError +#: ../lib/yard/handlers/base.rb:4 +msgid "" +"Raised during processing phase when a handler needs to perform\n" +"an operation on an object's namespace but the namespace could\n" +"not be resolved." +msgstr "" +"ハンドラーがnamespaceオブジェクトの演算を実行する必要がある時、\n" +"処理している間に例外を上げる。しかし、namespaceは解決されない。" + +# YARD::Handlers::NamespaceMissingError#object +# YARD::Handlers::NamespaceMissingError#object= +#: ../lib/yard/handlers/base.rb:8 +msgid "The object the error occurred on" +msgstr "エラーが生じたコードオブジェクトを返す。" + +# @return [CodeObjects::Base] +#: ../lib/yard/handlers/base.rb:9 +msgid "a code object" +msgstr "コードオブジェクト" + +# @return [NamespaceMissingError] +#: ../lib/yard/handlers/base.rb:11 +msgid "a new instance of NamespaceMissingError" +msgstr "NamespaceMissingErrorの新しいインスタンス" + +# YARD::Handlers::Base +#: ../lib/yard/handlers/base.rb:15 +msgid "" +"Handlers are pluggable semantic parsers for YARD's code generation\n" +"phase. They allow developers to control what information gets\n" +"generated by YARD, giving them the ability to, for instance, document\n" +"any Ruby DSLs that a customized framework may use. A good example\n" +"of this would be the ability to document and generate meta data for\n" +"the 'describe' declaration of the RSpec testing framework by simply\n" +"adding a handler for such a keyword. Similarly, any Ruby API that\n" +"takes advantage of class level declarations could add these to the\n" +"documentation in a very explicit format by treating them as first-\n" +"class objects in any outputted documentation." +msgstr "" +"ハンドラーは、YARDがコード生成段階で、\n" +"プラグイン可能という意味のパーサーである。\n" +"ハンドラーは、YARDによって生成される情報や、\n" +"その情報に機能を与える為や、\n" +"例えば、利用するかもしれない\n" +"カスタマイズされたフレームワークの何らかのRuby DSLを記述すること等を\n" +"制御する為に開発者を受け入れる。\n" +"いい例は、キーワードのような単純なハンドラーの追加によって、\n" +"RSpec testing フレームワークの'describe'宣言のように、\n" +"ドキュメント作成やメタデータを生成する機能である。\n" +"同様に、クラスレベル宣言から利用する何らかのRubyAPIは、\n" +"出力されたドキュメントで、\n" +"最初のクラスオブジェクトとしてそれらを処理することによって、\n" +"明確な書式でドキュメントにこれらを追加できた。" + +# YARD::Handlers::Base +#: ../lib/yard/handlers/base.rb:26 +msgid "== Overview of a Typical Handler Scenario" +msgstr "== 標準的なハンドラーの処理概要" + +# YARD::Handlers::Base +#: ../lib/yard/handlers/base.rb:28 +msgid "" +"Generally, a handler class will declare a set of statements which\n" +"it will handle using the {handles} class declaration. It will then\n" +"implement the {#process} method to do the work. The processing would\n" +"usually involve the manipulation of the {#namespace}, {#owner}\n" +"{CodeObjects::Base code objects} or the creation of new ones, in\n" +"which case they should be registered by {#register}, a method that\n" +"sets some basic attributes for the new objects." +msgstr "" +"一般的に、ハンドラークラスはステートメントのグループを宣言する。\n" +"そして、それは {handles} クラス宣言によって処理する。\n" +"それは、処理の為に {#process} メソッドを実装する。\n" +"処理中は、通常 {#namespace} , {#owner} , {CodeObjects::Base code objects} や\n" +"新規作成を含む場合に、それらは、 {#register} によって登録されるべき、\n" +"メソッドは新しいオブジェクト用にいくつかの基本的属性を設定する。" + +# YARD::Handlers::Base +#: ../lib/yard/handlers/base.rb:36 +msgid "" +"Handlers are usually simple and take up to a page of code to process\n" +"and register a new object or add new attributes to the current +namespace+." +msgstr "" +"ハンドラーは一般的にシンプルで、処理の為にコードのページを取り上げ、\n" +"新しいオブジェクトを登録し、現在の +namespace+ に新しい属性を追加する。" + +# YARD::Handlers::Base +#: ../lib/yard/handlers/base.rb:39 +msgid "== Setting up a Handler for Use" +msgstr "== ハンドラーを使う為の設定" + +# YARD::Handlers::Base +#: ../lib/yard/handlers/base.rb:41 +msgid "" +"A Handler is automatically registered when it is subclassed from the\n" +"base class. The only other thing that needs to be done is to specify\n" +"which statement the handler will process. This is done with the +handles+\n" +"declaration, taking either a {Parser::Ruby::Legacy::RubyToken}, {String} or " +"`Regexp`.\n" +"Here is a simple example which processes module statements." +msgstr "" +"ハンドラーはベースクラスからサブクラス化される時に、\n" +"自動的に登録される。\n" +"必要なその他のこととしては、\n" +"ハンドラーがどのステートメントを処理するかを指定する。\n" +"これは、 +handles+ の宣言と共に、\n" +"{Parser::Ruby::Legacy::RubyToken} か {String} や `Regexp`が取得される。\n" +"これは、モジュールステートメントの処理の簡単な例です。" + +# YARD::Handlers::Base +#: ../lib/yard/handlers/base.rb:47 +msgid "" +" class MyModuleHandler < YARD::Handlers::Base\n" +" handles TkMODULE" +msgstr "" + +# YARD::Handlers::Base +#: ../lib/yard/handlers/base.rb:50 +msgid "" +" def process\n" +" # do something\n" +" end\n" +" end" +msgstr "" + +# YARD::Handlers::Base +#: ../lib/yard/handlers/base.rb:55 +msgid "== Processing Handler Data" +msgstr "== ハンドラーデータ処理" + +# YARD::Handlers::Base +#: ../lib/yard/handlers/base.rb:57 +msgid "" +"The goal of a specific handler is really up to the developer, and as\n" +"such there is no real guideline on how to process the data. However,\n" +"it is important to know where the data is coming from to be able to use\n" +"it." +msgstr "" +"具体的なハンドラーの使い方は、開発者次第となる。\n" +"データ処理の方法のガイドラインは何もない。\n" +"しかしながら、データを扱う為には、\n" +"そのデータがどこから来るか知る事が重要となる。" + +# YARD::Handlers::Base +#: ../lib/yard/handlers/base.rb:62 +msgid "=== +statement+ Attribute" +msgstr "=== +statement+ 属性" + +# YARD::Handlers::Base +#: ../lib/yard/handlers/base.rb:64 +msgid "" +"The +statement+ attribute pertains to the {Parser::Ruby::Legacy::Statement} " +"object\n" +"containing a set of tokens parsed in by the parser. This is the main set\n" +"of data to be analyzed and processed. The comments attached to the " +"statement\n" +"can be accessed by the {Parser::Ruby::Legacy::Statement#comments} method, " +"but generally\n" +"the data to be processed will live in the +tokens+ attribute. This list\n" +"can be converted to a +String+ using +#to_s+ to parse the data with\n" +"regular expressions (or other text processing mechanisms), if needed." +msgstr "" +"パーサーによって解析されたトークンの設定を\n" +"{Parser::Ruby::Legacy::Statement} オブジェクトが含んでいる為、\n" +"+statement+ 属性は関係がある。\n" +"これは解析や処理される為のデータの主な設定となる。\n" +"コメントはstatementが {Parser::Ruby::Legacy::Statement#comments} メソッドに" +"よってアクセスされる為に付加される、\n" +"しかし、処理される一般的なデータは +tokens+ 属性の中に存在する。\n" +"必要であれば、このリストは、正規表現(又は、他のテキストが処理しているメカニズ" +"ム)を用い、データを解析する為に+#to_s+メソッドによって +String+ に変換され" +"る。\n" + +# YARD::Handlers::Base +#: ../lib/yard/handlers/base.rb:72 +msgid "=== +namespace+ Attribute" +msgstr "=== +namespace+ 属性" + +# YARD::Handlers::Base +#: ../lib/yard/handlers/base.rb:74 +msgid "" +"The +namespace+ attribute is a {CodeObjects::NamespaceObject namespace " +"object}\n" +"which represents the current namespace that the parser is in. For instance:" +msgstr "" +"+namespace+ 属性は {CodeObjects::NamespaceObject namespace object} となる。\n" +"それは、そのパーサーの中では現在のnamespaceを表す。\n" +"例えば:" + +# YARD::Handlers::Base +#: ../lib/yard/handlers/base.rb:77 +msgid "" +" module SomeModule\n" +" class MyClass\n" +" def mymethod; end\n" +" end\n" +" end" +msgstr "" + +# YARD::Handlers::Base +#: ../lib/yard/handlers/base.rb:83 +msgid "" +"If a handler was to parse the 'class MyClass' statement, it would\n" +"be necessary to know that it belonged inside the SomeModule module.\n" +"This is the value that +namespace+ would return when processing such\n" +"a statement. If the class was then entered and another handler was\n" +"called on the method, the +namespace+ would be set to the 'MyClass'\n" +"code object." +msgstr "" +"ハンドラー処理が'class MyClass'ステートメントを解析する場合、\n" +"class My ClassがSomeModuleモジュールの内部に\n" +"属していることを知ることが必須になる。\n" +"ステートメントのような処理(class MyClassを解析)をしている時、\n" +"SomeModuleが +namespace+ 値となり返されるだろう。\n" +"もしMyClassがエントリーされたり、\n" +"他のハンドラーがメソッド上で呼び出された場合、\n" +"'MyClass'コードオブジェクトが +namespace+ に設定される。" + +# YARD::Handlers::Base +#: ../lib/yard/handlers/base.rb:90 +msgid "=== +owner+ Attribute" +msgstr "=== +owner+ 属性" + +# YARD::Handlers::Base +#: ../lib/yard/handlers/base.rb:92 +msgid "" +"The +owner+ attribute is similar to the +namespace+ attribute in that\n" +"it also follows the scope of the code during parsing. However, a namespace\n" +"object is loosely defined as a module or class and YARD has the ability\n" +"to parse beyond module and class blocks (inside methods, for instance),\n" +"so the +owner+ attribute would not be limited to modules and classes." +msgstr "" +"+owner+ 属性は +namespace+ 属性と似ているが、\n" +"解析中のコードのスコープをフォローもする。\n" +"しかしながら、namespace オブジェクトは\n" +"モジュールやクラスのように曖昧に定義される。\n" +"その為、YARDはモジュールやクラスブロック(例えば、内部メソッド)を\n" +"越えて解析する為の機能を持つ。\n" +"なので、この +owner+ 属性は、モジュールやクラスに制限されない。" + +# YARD::Handlers::Base +#: ../lib/yard/handlers/base.rb:98 +msgid "" +"To put this into context, the example from above will be used. If a method\n" +"handler was added to the mix and decided to parse inside the method body,\n" +"the +owner+ would be set to the method object but the namespace would " +"remain\n" +"set to the class. This would allow the developer to process any method\n" +"definitions set inside a method (def x; def y; 2 end end) by adding them\n" +"to the correct namespace (the class, not the method)." +msgstr "" +"この文脈の中では、上の例が使われる。\n" +"ハンドラーのメソッドは、組み合わせる為に追加されたり、\n" +"メソッド本体の内部を解析する場合、\n" +"+owner+ はメソッドオブジェクトを設定する。\n" +"しかし、namespaceはクラスに設定されたままとなる。\n" +"これは開発者に以下のことを可能とする。全てのメソッド定義は、\n" +"正しいnamespaceを追加する事によって(クラスの,メソッドでは無い)、\n" +"メソッドの内部(def x; def y; 2 end end)のグループを処理する。" + +# YARD::Handlers::Base +#: ../lib/yard/handlers/base.rb:105 +msgid "" +"In summary, the distinction between +namespace+ and +owner+ can be thought\n" +"of as the difference between first-class Ruby objects (namespaces) and\n" +"second-class Ruby objects (methods)." +msgstr "" +"要約すると、+namespace+ と +owner+ の違いは、\n" +"ネストするクラスで考えると、:ownerは\n" +"最初のクラスのRubyオブジェクトでは(namespace)となるが、\n" +"次のネストしたクラスのRubyオブジェクトでは前のクラスのnamespaceとなる。" + +# YARD::Handlers::Base +#: ../lib/yard/handlers/base.rb:109 +msgid "=== +visibility+ and +scope+ Attributes" +msgstr "=== +visibility+ と +scope+ 属性" + +# YARD::Handlers::Base +#: ../lib/yard/handlers/base.rb:111 +msgid "" +"Mainly needed for parsing methods, the +visibility+ and +scope+ attributes\n" +"refer to the public/protected/private and class/instance values " +"(respectively)\n" +"of the current parsing position." +msgstr "" +"大抵は解析されるメソッドの為に必要とされる、\n" +"+visibility+ と +scope+ 属性は現在の解析している場所の\n" +"public/protected/privateとclass/instanceの値(それぞれについて)を\n" +"参照する。" + +# YARD::Handlers::Base +#: ../lib/yard/handlers/base.rb:115 +msgid "== Parsing Blocks in Statements" +msgstr "== ステートメントの中のブロックを解析する" + +# YARD::Handlers::Base +#: ../lib/yard/handlers/base.rb:117 +msgid "" +"In addition to parsing a statement and creating new objects, some\n" +"handlers may wish to continue parsing the code inside the statement's\n" +"block (if there is one). In this context, a block means the inside\n" +"of any statement, be it class definition, module definition, if\n" +"statement or classic 'Ruby block'." +msgstr "" +"ステートメントの解析や新しくオブジェクトを作成する事に加えて、\n" +"いくつかのハンドラーはステートメントのブロック(が一つでもある場合)の\n" +"内部コードの解析処理を継続するかもしれない。\n" +"このコンテキストでブロックとは、何らかのステートメントの内部を意味する。\n" +"それはステートメントやRubyで使われるblockの場合、クラス定義、モジュール定義になる。" + +# YARD::Handlers::Base +#: ../lib/yard/handlers/base.rb:123 +msgid "" +"For example, a class statement would be \"class MyClass\" and the block\n" +"would be a list of statements including the method definitions inside\n" +"the class. For a class handler, the programmer would execute the\n" +"{#parse_block} method to continue parsing code inside the block, with\n" +"the +namespace+ now pointing to the class object the handler created." +msgstr "" +"例えば、ステートメントのクラスが\"class MyClass\"になるかもしれない\n" +"そして、ブロックはクラスの内部でメソッドの定義を\n" +"含んでいるステートメントのリストになるかもしれない。\n" +"ハンドラーのクラス用に、\n" +"プログラマーは、{#parse_block} メソッドを実行する。\n" +"ブロックの内部のコード解析を継続する為に、\n" +"+namespace+ は、現在、ハンドラーが作成したクラスオブジェクトを指定する。" + +# YARD::Handlers::Base +#: ../lib/yard/handlers/base.rb:129 +msgid "" +"YARD has the ability to continue into any block: class, module, method,\n" +"even if statements. For this reason, the block parsing method must be\n" +"invoked explicitly out of efficiency sake." +msgstr "" +"YARDは何らかのブロックの中へ(クラス,モジュール,メソッド,ステートメントでさえ)\n" +"継続する特性がある。\n" +"従って、メソッドを解析するブロックは、\n" +"効率良く処理する為、明示的に呼び出されるべきである。" + +# @abstract +#: ../lib/yard/handlers/base.rb:142 +msgid "" +"Subclass this class to provide a handler for YARD to use\n" +"during the processing phase." +msgstr "" +"YARDが処理段階で使用するハンドラーを提供する為に、\n" +"このクラスをサブクラス化する。" + +# @see +#: ../lib/yard/handlers/base.rb:142 +msgid "tag|see|#namespace" +msgstr "" + +# @see +#: ../lib/yard/handlers/base.rb:142 +msgid "tag|see|#owner" +msgstr "" + +# @see +#: ../lib/yard/handlers/base.rb:142 +msgid "tag|see|#parse_block" +msgstr "" + +# @see +#: ../lib/yard/handlers/base.rb:142 ../lib/yard/handlers/base.rb:290 +msgid "tag|see|#register" +msgstr "" + +# @see +#: ../lib/yard/handlers/base.rb:142 ../lib/yard/parser/source_parser.rb:62 +msgid "tag|see|CodeObjects::Base" +msgstr "" + +# @see +#: ../lib/yard/handlers/base.rb:142 +msgid "tag|see|CodeObjects::NamespaceObject" +msgstr "" + +# @see +#: ../lib/yard/handlers/base.rb:142 ../lib/yard/handlers/base.rb:290 +msgid "tag|see|handles" +msgstr "" + +# YARD::Handlers::Base.clear_subclasses +#: ../lib/yard/handlers/base.rb:151 +msgid "Clear all registered subclasses. Testing purposes only" +msgstr "全ての登録されたサブクラスを消去する。テスト用" + +# YARD::Handlers::Base.subclasses +#: ../lib/yard/handlers/base.rb:157 +msgid "Returns all registered handler subclasses." +msgstr "全ての登録されたサブクラスのハンドラーを返す。" + +# @return [Array] +#: ../lib/yard/handlers/base.rb:158 +msgid "a list of handlers" +msgstr "ハンドラーのリスト" + +# YARD::Handlers::Base.handles +#: ../lib/yard/handlers/base.rb:168 +msgid "" +"Declares the statement type which will be processed\n" +"by this handler." +msgstr "このハンドラーによって処理されるステートメントの型を宣言する。" + +# YARD::Handlers::Base.handles +#: ../lib/yard/handlers/base.rb:171 +msgid "" +"A match need not be unique to a handler. Multiple\n" +"handlers can process the same statement. However,\n" +"in this case, care should be taken to make sure that\n" +"{#parse_block} would only be executed by one of\n" +"the handlers, otherwise the same code will be parsed\n" +"multiple times and slow YARD down." +msgstr "" +"ハンドラーでマッチするものは、一つでなくてもよい。\n" +"複数のハンドラーは同じステートメントを処理できる。\n" +"しかしながら、このケースの場合は、\n" +"{#parse_block}がハンドラーの一つによって実行されるだけで、\n" +"他の同じコードが複数回解析されYARDが遅くなる事に注意しなければならない。" + +# @param [Parser::RubyToken, Symbol, String, Regexp] matches +#: ../lib/yard/handlers/base.rb:185 +msgid "" +"statements that match the declaration will be\n" +"processed by this handler. A {String} match is\n" +"equivalent to a +/\\Astring/+ regular expression\n" +"(match from the beginning of the line), and all\n" +"token matches match only the first token of the\n" +"statement." +msgstr "" +"このハンドラーによって処理される宣言がマッチするステートメント。\n" +"A {String} のマッチは +/\\Astring/+ の正規表現と同様となる。\n" +"(行の最初からマッチ)、\n" +"そして全てのトークンのマッチは、ステートメントの最初のトークンにだけマッチする。" + +# @param [Parser::RubyToken, Symbol, String, Regexp] +#: ../lib/yard/handlers/base.rb:185 +msgid "tag|param|matches" +msgstr "" + +# YARD::Handlers::Base.handles? +#: ../lib/yard/handlers/base.rb:190 +msgid "" +"This class is implemented by {Ruby::Base} and {Ruby::Legacy::Base}.\n" +"To implement a base handler class for another language, implement\n" +"this method to return true if the handler should process the given\n" +"statement object. Use {handlers} to enumerate the matchers declared\n" +"for the handler class." +msgstr "" +"このクラスは、 {Ruby::Base} や {Ruby::Legacy::Base} によって実装される。\n" +"他の言語用のbase handlerクラスを実装する為には、\n" +"ハンドラーが与えられたステートメントオブジェクトを処理する場合、\n" +"trueを返す為にこのメソッドを実装する。\n" +"ハンドラークラス用のマッチする宣言を列挙するには、{handlers} を使用する。" + +# @param statement +#: ../lib/yard/handlers/base.rb:198 +msgid "a statement object or node (depends on language type)" +msgstr "オブジェクトやノードのステートメント(言語タイプに左右される)" + +# @return [Boolean] +#: ../lib/yard/handlers/base.rb:198 +msgid "" +"whether or not this handler object should process\n" +"the given statement" +msgstr "いずれにせよ、このハンドラーオブジェクトは指定されたステートメントを処理するべき" + +# @return [Array] +#: ../lib/yard/handlers/base.rb:204 +msgid "a list of matchers for the handler object." +msgstr "ハンドラーオブジェクト用の照合されるリスト" + +# @see +#: ../lib/yard/handlers/base.rb:204 +msgid "tag|see|handles?" +msgstr "" + +# YARD::Handlers::Base.namespace_only +#: ../lib/yard/handlers/base.rb:209 +msgid "" +"Declares that the handler should only be called when inside a\n" +"{CodeObjects::NamespaceObject}, not a method body." +msgstr "" +"ハンドラーが {CodeObjects::NamespaceObject} 内部の時だけ\n" +"呼び出される事を宣言する、このメソッドは本体ではない。" + +# @return [Boolean] +#: ../lib/yard/handlers/base.rb:218 +msgid "" +"whether the handler should only be processed inside\n" +"a namespace." +msgstr "このハンドラがnamespace内だけで処理されるかどうか" + +# YARD::Handlers::Base.in_file +#: ../lib/yard/handlers/base.rb:223 +msgid "" +"Declares that a handler should only be called when inside a filename\n" +"by its basename or a regex match for the full path." +msgstr "" +"ハンドラーがフルパス用のベースネームや正規表現マッチによって、\n" +"ファイルネーム内部の時だけ呼び出される事を宣言する。" + +# @param [String, Regexp] filename +#: ../lib/yard/handlers/base.rb:228 +msgid "a matching filename or regex" +msgstr "マッチするファイルネームや正規表現" + +# @return [Boolean] +#: ../lib/yard/handlers/base.rb:235 +msgid "" +"whether the filename matches the declared file\n" +"match for a handler. If no file match is specified, returns true." +msgstr "" +"ファイル名が宣言されたハンドラー用のファイルとマッチするかどうか、\n" +"ファイルがマッチしない場合は、trueを返す。" + +# YARD::Handlers::Base.process +#: ../lib/yard/handlers/base.rb:251 +msgid "" +"Generates a +process+ method, equivalent to +def process; ... end+.\n" +"Blocks defined with this syntax will be wrapped inside an anonymous\n" +"module so that the handler class can be extended with mixins that\n" +"override the +process+ method without alias chaining." +msgstr "" +"+process+ メソッドを生成する、 +def process; ...end+ と同等となる。\n" +"この構文を用いた定義されるブロックは、無名モジュールの内部でラップされる。\n" +"理由としては、ハンドラークラスが +procecc+ メソッドの上書きを\n" +"エイリアスチェーン無しでmixinを用い拡張できるようにする為である。" + +# @since +#: ../lib/yard/handlers/base.rb:262 +#: ../lib/yard/handlers/ruby/class_condition_handler.rb:11 +#: ../lib/yard/parser/ruby/legacy/statement.rb:49 +#: ../lib/yard/templates/erb_cache.rb:16 +#: ../lib/yard/templates/helpers/html_helper.rb:510 +msgid "0.5.4" +msgstr "" + +# @see +#: ../lib/yard/handlers/base.rb:262 +msgid "tag|see|#process" +msgstr "" + +# @return [Base] +#: ../lib/yard/handlers/base.rb:269 ../lib/yard/parser/base.rb:25 +#: ../lib/yard/serializers/base.rb:27 ../lib/yard/server/commands/base.rb:74 +msgid "a new instance of Base" +msgstr "ベースの新しいインスタンス" + +# YARD::Handlers::Base#process +#: ../lib/yard/handlers/base.rb:275 +msgid "" +"The main handler method called by the parser on a statement\n" +"that matches the {handles} declaration." +msgstr "" +"主なハンドラーのメソッドは {handles} の宣言で\n" +"マッチするstatementのパーサーによって呼び出される。" + +# YARD::Handlers::Base#process +#: ../lib/yard/handlers/base.rb:278 +msgid "" +"Subclasses should override this method to provide the handling\n" +"functionality for the class." +msgstr "" +"サブクラスはクラス用の処理機能を提供する為に、\n" +"このメソッドを上書きする。" + +# @return [Array, CodeObjects::Base, Object] +#: ../lib/yard/handlers/base.rb:290 +msgid "" +"If this method returns a code object (or a list of them),\n" +"they are passed to the +#register+ method which adds basic\n" +"attributes. It is not necessary to return any objects and in\n" +"some cases you may want to explicitly avoid the returning of\n" +"any objects for post-processing by the register method." +msgstr "" +"このメソッドがコードオブジェクト(やそれらのリスト)を返す場合、\n" +"それらは、+#register+ メソッドに解析され、基本属性が追加される。\n" +"何らかのオブジェクトを返すのは必須ではなく、\n" +"場合によっては、\n" +"あなたはregisterメソッドによって後処理用の\n" +"何らかのオブジェクトを返すことを明確に無視できる。" + +# YARD::Handlers::Base#parse_block +#: ../lib/yard/handlers/base.rb:295 +msgid "Parses the semantic \"block\" contained in the statement node." +msgstr "ステートメントノードに含まれている意味のある\"block\"を解析する。" + +# @abstract +#: ../lib/yard/handlers/base.rb:297 +msgid "Subclasses should call {Processor#process parser.process}" +msgstr "{Processor#process parser.process} を呼び出しサブクラス化する。" + +# @return [Processor] +#: ../lib/yard/handlers/base.rb:303 +msgid "" +"the processor object that manages all global state\n" +"during handling." +msgstr "全てのグローバルな状態の処理の間に扱うプロセッサーオブジェクト" + +# @return [Object] +#: ../lib/yard/handlers/base.rb:308 +msgid "" +"the statement object currently being processed. Usually\n" +"refers to one semantic language statement, though the strict definition\n" +"depends on the parser used." +msgstr "" +"現在の処理されるステートメントオブジェクト。\n" +"厳格な定義は使われるパーサー次第とはいえ、\n" +"一般的には、一つの意味のある言語を参照する。" + +# @param value +#: ../lib/yard/handlers/base.rb:311 ../lib/yard/handlers/base.rb:333 +#: ../lib/yard/tags/ref_tag.rb:4 ../lib/yard/tags/ref_tag_list.rb:4 +msgid "the value to set the attribute owner to." +msgstr "owner属性を設定する為の値" + +# YARD::Tags::RefTag#owner +# YARD::Tags::RefTagList#owner +#: ../lib/yard/handlers/base.rb:312 ../lib/yard/handlers/base.rb:333 +#: ../lib/yard/tags/ref_tag.rb:5 ../lib/yard/tags/ref_tag_list.rb:5 +msgid "Returns the value of attribute owner" +msgstr "owner属性の値を返す" + +# YARD::Tags::RefTag#owner= +# YARD::Tags::RefTagList#owner= +#: ../lib/yard/handlers/base.rb:312 ../lib/yard/handlers/base.rb:334 +#: ../lib/yard/tags/ref_tag.rb:5 ../lib/yard/tags/ref_tag_list.rb:5 +msgid "Sets the attribute owner" +msgstr "owner属性を設定する" + +# @param value +#: ../lib/yard/handlers/base.rb:314 ../lib/yard/handlers/base.rb:335 +msgid "the value to set the attribute namespace to." +msgstr "値にnamespace属性を設定するための値" + +# YARD::CodeObjects::ExtraFileObject#name= +# YARD::Tags::RefTagList#name= +# YARD::Templates::Section#name= +#: ../lib/yard/handlers/base.rb:315 ../lib/yard/handlers/base.rb:336 +msgid "Sets the attribute namespace" +msgstr "namespace属性を設定する" + +# @param value +#: ../lib/yard/handlers/base.rb:317 ../lib/yard/handlers/base.rb:337 +msgid "the value to set the attribute visibility to." +msgstr "値にvisibility属性を設定するための値" + +# YARD::Parser::Ruby::RipperParser#ast +# YARD::Parser::Ruby::RipperParser#root +#: ../lib/yard/handlers/base.rb:318 ../lib/yard/handlers/base.rb:337 +msgid "Returns the value of attribute visibility" +msgstr "visibility属性の値を返す" + +# YARD::Parser::Ruby::AstNode#file= +#: ../lib/yard/handlers/base.rb:318 ../lib/yard/handlers/base.rb:338 +msgid "Sets the attribute visibility" +msgstr "visibility属性を設定する。" + +# @param value +#: ../lib/yard/handlers/base.rb:320 ../lib/yard/handlers/base.rb:339 +msgid "the value to set the attribute scope to." +msgstr "値にスコープ属性を設定するための値" + +# YARD::Parser::Ruby::Legacy::RubyToken::TkOPASGN#op +#: ../lib/yard/handlers/base.rb:321 ../lib/yard/handlers/base.rb:339 +msgid "Returns the value of attribute scope" +msgstr "スコープ属性の値を返す" + +# YARD::Parser::Ruby::AstNode#source= +#: ../lib/yard/handlers/base.rb:321 ../lib/yard/handlers/base.rb:340 +msgid "Sets the attribute scope" +msgstr "スコープ属性を設定する" + +# YARD::Tags::Library.labels +#: ../lib/yard/handlers/base.rb:324 ../lib/yard/handlers/base.rb:341 +msgid "Returns the value of attribute globals" +msgstr "globals(全体)属性の値を返す" + +# YARD::Parser::Ruby::Legacy::RubyLex#lex_state +#: ../lib/yard/handlers/base.rb:327 ../lib/yard/handlers/base.rb:342 +msgid "Returns the value of attribute extra_state" +msgstr "extra_state属性の値を返す" + +# YARD::Handlers::Base#push_state +#: ../lib/yard/handlers/base.rb:344 +msgid "" +"Executes a given block with specific state values for {#owner},\n" +"{#namespace} and {#scope}." +msgstr "" +"{#owner}, {#namespace} , {#scope}メソッド用の特定の状態値と\n" +"一緒に与えられたブロックを実行する。" + +# @yield +#: ../lib/yard/handlers/base.rb:355 +msgid "a block to execute with the given state values." +msgstr "状態を指定すると共に実行するブロック。" + +# @param [Proc] +#: ../lib/yard/handlers/base.rb:355 +msgid "tag|param|block" +msgstr "" + +# @param [Proc] block +#: ../lib/yard/handlers/base.rb:355 +msgid "the block to execute with specific state" +msgstr "与えられた値の状態と共に実行するブロック。" + +# YARD::Handlers::Base#register +#: ../lib/yard/handlers/base.rb:378 +msgid "" +"Do some post processing on a list of code objects.\n" +"Adds basic attributes to the list of objects like\n" +"the filename, line number, {CodeObjects::Base#dynamic},\n" +"source code and {CodeObjects::Base#docstring},\n" +"but only if they don't exist." +msgstr "" +"コードオブジェクトのリストのいくつかの後処理をする。\n" +"ファイル名、行数、{CodeObjects::Base#dynamic} 、ソースコード、\n" +"{CodeObjects::Base#docstring}のようなオブジェクトのリストに、\n" +"基本属性を追加する。\n" +"しかし、それらが存在しない場合だけである。" + +# @return [CodeObjects::Base, Array] +#: ../lib/yard/handlers/base.rb:389 +msgid "returns whatever is passed in, for chainability." +msgstr "メソッドチェーンの為、解析されるものを返す" + +# @param [Array] +#: ../lib/yard/handlers/base.rb:389 ../lib/yard/i18n/pot_generator.rb:90 +#: ../lib/yard/templates/engine.rb:100 +msgid "tag|param|objects" +msgstr "" + +# @param [Array] objects +#: ../lib/yard/handlers/base.rb:389 +msgid "the list of objects to post-process." +msgstr "後処理の為のオブジェクトのリスト" + +# YARD::Handlers::Base#register_ensure_loaded +#: ../lib/yard/handlers/base.rb:406 +msgid "" +"Ensures that the object's namespace is loaded before attaching it\n" +"to the namespace." +msgstr "" + +# @param [CodeObjects::Base] object +#: ../lib/yard/handlers/base.rb:411 ../lib/yard/handlers/base.rb:424 +#: ../lib/yard/handlers/base.rb:433 ../lib/yard/handlers/base.rb:456 +#: ../lib/yard/handlers/base.rb:470 ../lib/yard/handlers/base.rb:483 +#: ../lib/yard/handlers/base.rb:495 ../lib/yard/handlers/base.rb:520 +#: ../lib/yard/registry.rb:174 +msgid "the object to register" +msgstr "記録するオブジェクト" + +# YARD::Logger#enter_level +#: ../lib/yard/handlers/base.rb:420 +msgid "Registers the file/line of the declaration with the object" +msgstr "オブジェクトを用い宣言のファイル/行を登録する" + +# YARD::Handlers::Base#expand_macro +#: ../lib/yard/handlers/base.rb:429 +msgid "Registers any docstring found for the object and expands macros" +msgstr "オブジェクト用に見つかった任意のdocstringを登録し、マクロを拡張する" + +# YARD::Registry.at +# YARD::Registry.[] +#: ../lib/yard/handlers/base.rb:452 +msgid "Registers the object as being inside a specific group" +msgstr "特定のグループ内部のものとしてオブジェクトを登録する" + +# YARD::CodeObjects::MethodObject#aliases +#: ../lib/yard/handlers/base.rb:466 +msgid "Registers any transitive tags from the namespace on the object" +msgstr "オブジェクト上のnamespaceから全てのtransitiveタグを登録する" + +# YARD::Handlers::Base#register_visibility +#: ../lib/yard/handlers/base.rb:490 +msgid "" +"Registers visibility on a method object. If the object does not\n" +"respond to setting visibility, nothing is done." +msgstr "" + +# @param [Array] +# @param [Array] +# @param [Array] +#: ../lib/yard/handlers/base.rb:495 +msgid "tag|param|visibility" +msgstr "" + +# @return [String] +#: ../lib/yard/handlers/base.rb:495 +msgid "the visibility to set on the object" +msgstr "オブジェクトを設定するためのvisibility" + +# YARD::Handlers::Base#register_module_function +#: ../lib/yard/handlers/base.rb:501 +msgid "" +"Registers the same method information on the module function, if\n" +"the object was defined as a module function." +msgstr "" + +# @param [CodeObjects::Base] object +#: ../lib/yard/handlers/base.rb:506 +msgid "" +"the possible module function object\n" +"to copy data for" +msgstr "" + +# YARD::Handlers::Base#register_dynamic +#: ../lib/yard/handlers/base.rb:515 +msgid "" +"Registers the object as dynamic if the object is defined inside\n" +"a method or block (owner != namespace)" +msgstr "" + +# YARD::Handlers::Base#ensure_loaded! +#: ../lib/yard/handlers/base.rb:525 +msgid "" +"Ensures that a specific +object+ has been parsed and loaded into the\n" +"registry. This is necessary when adding data to a namespace, for instance,\n" +"since the namespace may not have been processed yet (it can be located\n" +"in a file that has not been handled)." +msgstr "" +"特定の +object+ は解析されて、レジストリの中へロードされる事を保証する。\n" +"例えば、namespaceは、まだ処理されないかもしれないので\n" +"(処理されないファイルの中にそれはある可能性がある。)\n" +"これはnamespaceにデータを追加する時に必要である。" + +# YARD::Handlers::Base#ensure_loaded! +#: ../lib/yard/handlers/base.rb:530 +msgid "" +"Calling this method defers the handler until all other files have been\n" +"processed. If the object gets resolved, the rest of the handler continues,\n" +"otherwise an exception is raised." +msgstr "" +"このメソッドの呼び出しは\n" +"他の全てのファイルが処理されるまでハンドラーを延期する。\n" +"もしオブジェクトが解決された場合、ハンドラーの残りが続き、\n" +"さもなければ、例外を上げる。" + +# @example Adding a mixin to the String class programmatically +#: ../lib/yard/handlers/base.rb:544 +msgid "" +"ensure_loaded! P('String')\n" +"# \"String\" is now guaranteed to be loaded\n" +"P('String').mixins << P('MyMixin')" +msgstr "" + +# @raise [NamespaceMissingError] +#: ../lib/yard/handlers/base.rb:544 +msgid "" +"if the object is not resolved within\n" +"+max_retries+ attempts, this exception is raised and the handler\n" +"finishes processing." +msgstr "" +"オブジェクトが +max_retries+ を試みても解決されない場合、\n" +"この例外を上げ、ハンドラーが処理を終了させる。" + +# @example +#: ../lib/yard/handlers/base.rb:544 +msgid "tag|example|Adding a mixin to the String class programmatically" +msgstr "Stringクラスのプログラムにmixinを追加する" + +# @param [Integer] +#: ../lib/yard/handlers/base.rb:544 +msgid "tag|param|max_retries" +msgstr "" + +# @param [Integer] max_retries +#: ../lib/yard/handlers/base.rb:544 +msgid "" +"the number of times to defer the handler\n" +"before raising a +NamespaceMissingError+." +msgstr "+NamespaceMissingError+ を上げる前にハンドラーがリトライする回数" + +# @param [Proxy, CodeObjects::Base] object +#: ../lib/yard/handlers/base.rb:544 +msgid "the object to resolve." +msgstr "解決したいオブジェクト" + +# @abstract +#: ../lib/yard/handlers/base.rb:567 +msgid "" +"Implement this method to return the parameters in a method call\n" +"statement. It should return an empty list if the statement is not a\n" +"method call." +msgstr "" +"メソッド呼び出しステートメントの中のパラメータを返す為にこのメソッドを実装する。\n" +"ステートメントがメソッド呼び出しでない場合は空のリストを返すべき。" + +# YARD::Handlers::Base#call_params +# YARD::Handlers::Base#caller_method +# YARD::Handlers::Base#find_or_create_macro +# YARD::Handlers::Base#expand_macro +#: ../lib/yard/handlers/base.rb:567 ../lib/yard/handlers/base.rb:576 +msgid "Macro Support" +msgstr "マクロのサポート" + +# @return [Array] +#: ../lib/yard/handlers/base.rb:567 +msgid "a list of argument names" +msgstr "引数の名前のリスト" + +# @abstract +#: ../lib/yard/handlers/base.rb:576 +msgid "" +"Implement this method to return the method being called in\n" +"a method call. It should return nil if the statement is not a method\n" +"call." +msgstr "" +"メソッド呼び出しの中で呼び出されるメソッドが返す為に\n" +"このメソッドが実装する。\n" +"ステートメントがメソッド呼び出しでない場合はnilを返すべき。" + +# @return [nil] +#: ../lib/yard/handlers/base.rb:576 +msgid "if the statement is not a method call" +msgstr "ステートメントがメソッド呼び出しでない場合" + +# @return [String] +#: ../lib/yard/handlers/base.rb:576 +msgid "the method name being called" +msgstr "呼び出されるメソッド名" + +# YARD::Handlers::C::AliasHandler#process +# YARD::Handlers::C::AttributeHandler#process +# YARD::Handlers::C::ClassHandler#process +# YARD::Handlers::C::ConstantHandler#process +# YARD::Handlers::C::InitHandler#process +# YARD::Handlers::C::MethodHandler#process +# YARD::Handlers::C::MixinHandler#process +# YARD::Handlers::C::ModuleHandler#process +# YARD::Handlers::C::OverrideCommentHandler#process +# YARD::Handlers::C::PathHandler#process +# YARD::Handlers::C::StructHandler#process +# YARD::Handlers::C::SymbolHandler#process +# YARD::Handlers::Ruby::AliasHandler#process +# YARD::Handlers::Ruby::AttributeHandler#process +# YARD::Handlers::Ruby::ClassConditionHandler#process +# YARD::Handlers::Ruby::ClassHandler#process +# YARD::Handlers::Ruby::ClassVariableHandler#process +# YARD::Handlers::Ruby::CommentHandler#process +# YARD::Handlers::Ruby::ConstantHandler#process +# YARD::Handlers::Ruby::DSLHandler#process +# YARD::Handlers::Ruby::ExceptionHandler#process +# YARD::Handlers::Ruby::Legacy::AliasHandler#process +# YARD::Handlers::Ruby::Legacy::AttributeHandler#process +# YARD::Handlers::Ruby::Legacy::ClassConditionHandler#process +# YARD::Handlers::Ruby::Legacy::ClassHandler#process +# YARD::Handlers::Ruby::Legacy::ClassVariableHandler#process +# YARD::Handlers::Ruby::Legacy::CommentHandler#process +# YARD::Handlers::Ruby::Legacy::ConstantHandler#process +# YARD::Handlers::Ruby::Legacy::DSLHandler#process +# YARD::Handlers::Ruby::Legacy::ExceptionHandler#process +# YARD::Handlers::Ruby::Legacy::MethodHandler#process +# YARD::Handlers::Ruby::Legacy::MixinHandler#process +# YARD::Handlers::Ruby::Legacy::ModuleFunctionHandler#process +# YARD::Handlers::Ruby::Legacy::ModuleHandler#process +# YARD::Handlers::Ruby::Legacy::PrivateConstantHandler#process +# YARD::Handlers::Ruby::Legacy::VisibilityHandler#process +# YARD::Handlers::Ruby::Legacy::YieldHandler#process +# YARD::Handlers::Ruby::MethodConditionHandler#process +# YARD::Handlers::Ruby::MethodHandler#process +# YARD::Handlers::Ruby::MixinHandler#process +# YARD::Handlers::Ruby::ModuleFunctionHandler#process +# YARD::Handlers::Ruby::ModuleHandler#process +# YARD::Handlers::Ruby::PrivateConstantHandler#process +# YARD::Handlers::Ruby::VisibilityHandler#process +# YARD::Handlers::Ruby::YieldHandler#process +#: ../lib/yard/handlers/c/alias_handler.rb:10 +#: ../lib/yard/handlers/c/attribute_handler.rb:6 +#: ../lib/yard/handlers/c/class_handler.rb:19 +#: ../lib/yard/handlers/c/constant_handler.rb:8 +#: ../lib/yard/handlers/c/init_handler.rb:8 +#: ../lib/yard/handlers/c/method_handler.rb:22 +#: ../lib/yard/handlers/c/mixin_handler.rb:7 +#: ../lib/yard/handlers/c/module_handler.rb:9 +#: ../lib/yard/handlers/c/override_comment_handler.rb:7 +#: ../lib/yard/handlers/c/path_handler.rb:6 +#: ../lib/yard/handlers/c/struct_handler.rb:8 +#: ../lib/yard/handlers/c/symbol_handler.rb:7 +#: ../lib/yard/handlers/ruby/alias_handler.rb:7 +#: ../lib/yard/handlers/ruby/attribute_handler.rb:10 +#: ../lib/yard/handlers/ruby/class_condition_handler.rb:16 +#: ../lib/yard/handlers/ruby/class_handler.rb:8 +#: ../lib/yard/handlers/ruby/class_variable_handler.rb:7 +#: ../lib/yard/handlers/ruby/comment_handler.rb:7 +#: ../lib/yard/handlers/ruby/constant_handler.rb:8 +#: ../lib/yard/handlers/ruby/dsl_handler.rb:11 +#: ../lib/yard/handlers/ruby/exception_handler.rb:6 +#: ../lib/yard/handlers/ruby/legacy/alias_handler.rb:7 +#: ../lib/yard/handlers/ruby/legacy/attribute_handler.rb:7 +#: ../lib/yard/handlers/ruby/legacy/class_condition_handler.rb:8 +#: ../lib/yard/handlers/ruby/legacy/class_handler.rb:8 +#: ../lib/yard/handlers/ruby/legacy/class_variable_handler.rb:8 +#: ../lib/yard/handlers/ruby/legacy/comment_handler.rb:7 +#: ../lib/yard/handlers/ruby/legacy/constant_handler.rb:9 +#: ../lib/yard/handlers/ruby/legacy/dsl_handler.rb:12 +#: ../lib/yard/handlers/ruby/legacy/exception_handler.rb:6 +#: ../lib/yard/handlers/ruby/legacy/method_handler.rb:6 +#: ../lib/yard/handlers/ruby/legacy/mixin_handler.rb:7 +#: ../lib/yard/handlers/ruby/legacy/module_function_handler.rb:7 +#: ../lib/yard/handlers/ruby/legacy/module_handler.rb:7 +#: ../lib/yard/handlers/ruby/legacy/private_constant_handler.rb:7 +#: ../lib/yard/handlers/ruby/legacy/visibility_handler.rb:7 +#: ../lib/yard/handlers/ruby/legacy/yield_handler.rb:6 +#: ../lib/yard/handlers/ruby/method_condition_handler.rb:6 +#: ../lib/yard/handlers/ruby/method_handler.rb:6 +#: ../lib/yard/handlers/ruby/mixin_handler.rb:7 +#: ../lib/yard/handlers/ruby/module_function_handler.rb:8 +#: ../lib/yard/handlers/ruby/module_handler.rb:7 +#: ../lib/yard/handlers/ruby/private_constant_handler.rb:7 +#: ../lib/yard/handlers/ruby/visibility_handler.rb:9 +#: ../lib/yard/handlers/ruby/yield_handler.rb:6 +msgid "Main processing callback" +msgstr "" + +# @return [Boolean] +#: ../lib/yard/handlers/c/base.rb:9 +msgid "whether the handler handles this statement" +msgstr "ハンドラーがこのステートメントを操作するかどうか" + +# @return [CodeObjects::Base] +#: ../lib/yard/handlers/c/base.rb:36 ../lib/yard/handlers/c/base.rb:40 +#: ../lib/yard/handlers/c/base.rb:44 ../lib/yard/handlers/c/base.rb:48 +msgid "Registering objects" +msgstr "オブジェクトを登録する" + +# YARD::Handlers::C::Base#namespace_for_variable +# YARD::Handlers::C::Base#namespaces +# YARD::Handlers::C::Base#override_comments +# YARD::Handlers::C::Base#processed_files +# YARD::Handlers::C::Base#symbols +#: ../lib/yard/handlers/c/base.rb:54 ../lib/yard/handlers/c/base.rb:58 +#: ../lib/yard/handlers/c/base.rb:62 ../lib/yard/handlers/c/base.rb:68 +#: ../lib/yard/handlers/c/base.rb:72 +msgid "Looking up Symbol and Var Values" +msgstr "" + +# YARD::Handlers::Ruby::Base#parse_block +#: ../lib/yard/handlers/c/base.rb:78 ../lib/yard/handlers/ruby/base.rb:132 +msgid "Parsing an Inner Block" +msgstr "内部のブロックを解析する" + +# @return [String] +#: ../lib/yard/handlers/c/base.rb:87 ../lib/yard/handlers/c/base.rb:104 +msgid "Processing other files" +msgstr "他のファイルを処理する" + +# YARD::Handlers::Ruby::MethodConditionHandler +#: ../lib/yard/handlers/c/init_handler.rb:2 +msgid "Handles the Init_Libname() method" +msgstr "Init_Libname()メソッドを操作する" + +# YARD::CLI::Yardoc#parse_arguments +#: ../lib/yard/handlers/c/override_comment_handler.rb:2 +msgid "Parses comments" +msgstr "コメントを解析する" + +# YARD::Handlers::C::SymbolHandler +#: ../lib/yard/handlers/c/symbol_handler.rb:2 +msgid "" +"Keeps track of function bodies for symbol lookup during Ruby method " +"declarations" +msgstr "" + +# YARD::Handlers::Processor +#: ../lib/yard/handlers/processor.rb:6 +msgid "" +"Iterates over all statements in a file and delegates them to the\n" +"{Handlers::Base} objects that are registered to handle the statement." +msgstr "" +"ファイルの中の全てのステートメントにまたがり繰り返し、\n" +"ステートメントを操作する為に記録される{Handlers::Base}オブジェクトに委譲す" +"る。" + +# YARD::Handlers::Processor +#: ../lib/yard/handlers/processor.rb:9 +msgid "" +"This class is passed to each handler and keeps overall processing state.\n" +"For example, if the {#visibility} is set in a handler, all following\n" +"statements will have access to this state. This allows \"public\",\n" +"\"protected\" and \"private\" statements to be handled in classes and " +"modules.\n" +"In addition, the {#namespace} can be set during parsing to control\n" +"where objects are being created from. You can also access extra stateful\n" +"properties that any handler can set during the duration of the post\n" +"processing of a file from {#extra_state}. If you need to access state\n" +"across different files, look at {#globals}." +msgstr "" +"このクラスはそれぞれのハンドラーが渡される。\n" +"そして、総合的な処理の状態を維持する。\n" +"例えば、{#visibility}はハンドラーの中で設定される。\n" +"全ての次のステートメントは、この状態にアクセス可能である。\n" +"これは、クラスやモジュールの中で操作される\n" +"\"public\",\"protected\",\"private\"ステートメントを受け入れる。\n" +"さらに、{#namespace}メソッドは、\n" +"オブジェクトが作成される場所で、制御の為に解析している間に設定される。\n" +"あなたは、追加の処理状態を把握する属性にアクセスも出来る。\n" +"任意のハンドラーが\n" +"{#extra_state}メソッドからファイルの後処理をしている間に\n" +"設定できる。\n" +"あなたが複数のファイルに渡って状態にアクセスする必要がある場合、\n" +"{#globals}メソッドで調べられる。" + +# @see +#: ../lib/yard/handlers/processor.rb:19 ../lib/yard/handlers/ruby/base.rb:62 +#: ../lib/yard/parser/source_parser.rb:62 +msgid "tag|see|Handlers::Base" +msgstr "" + +# YARD::Handlers::Processor.register_handler_namespace +#: ../lib/yard/handlers/processor.rb:23 +msgid "Registers a new namespace for handlers of the given type." +msgstr "与える型の入ったハンドラー用の記録する。" + +# @return [Hash] +#: ../lib/yard/handlers/processor.rb:31 ../lib/yard/handlers/processor.rb:33 +#: ../lib/yard/parser/source_parser.rb:158 +#: ../lib/yard/parser/source_parser.rb:160 +msgid "a list of registered parser type extensions" +msgstr "parser type extensionsが,記録されるリスト" + +# @return [String] +#: ../lib/yard/handlers/processor.rb:41 +msgid "the filename" +msgstr "ファイル名" + +# @return [CodeObjects::NamespaceObject] +#: ../lib/yard/handlers/processor.rb:44 +msgid "the current namespace" +msgstr "現在のnamespace" + +# @return [Symbol] +#: ../lib/yard/handlers/processor.rb:47 +msgid "the current visibility (public, private, protected)" +msgstr "現在の可視性(public,private,protected)" + +# @return [Symbol] +#: ../lib/yard/handlers/processor.rb:50 +msgid "the current scope (class, instance)" +msgstr "現在のスコープ(クラス,インスタンス)" + +# @return [CodeObjects::Base, nil] +#: ../lib/yard/handlers/processor.rb:56 +msgid "" +"unlike the namespace, the owner\n" +"is a non-namespace object that should be stored between statements.\n" +"For instance, when parsing a method body, the {CodeObjects::MethodObject}\n" +"is set as the owner, in case any extra method information is processed." +msgstr "" +"namespaceとは異なり、ownerは、\n" +"ステートメントの間に記録されるnamespaceオブジェクトを持たない。\n" +"例えば、メソッド本体を解析する時、{CodeObjects::MethodObject}は、\n" +"このownerのように設定される。この場合、何らかの追加のメソッド情報が処理され" +"る。" + +# @return [Symbol] +#: ../lib/yard/handlers/processor.rb:59 +msgid "the parser type (:ruby, :ruby18, :c)" +msgstr "パーサー型(:ruby, :ruby18, :c)" + +# YARD::Handlers::Base#globals +# YARD::Handlers::Processor#globals +# YARD::Handlers::Processor#globals= +#: ../lib/yard/handlers/processor.rb:62 +msgid "" +"Handlers can share state for the entire post processing stage through\n" +"this attribute. Note that post processing stage spans multiple files.\n" +"To share state only within a single file, use {#extra_state}" +msgstr "" +"ハンドラーはこの属性を通して全体の後処理環境用の状態を共有できる。\n" +"以下の事に留意する。\n" +"後処理の状態は、複数ファイルに渡す。\n" +"単一のファイルの中でだけ状態を共有するには、 {#extra_state} を使用する。" + +# @example Sharing state among two handlers +#: ../lib/yard/handlers/processor.rb:77 +msgid "" +"class Handler1 < YARD::Handlers::Ruby::Base\n" +" handles :class\n" +" process { globals.foo = :bar }\n" +"end\n" +"\n" +"class Handler2 < YARD::Handlers::Ruby::Base\n" +" handles :method\n" +" process { puts globals.foo }\n" +"end" +msgstr "" + +# @return [OpenStruct] +#: ../lib/yard/handlers/processor.rb:77 +msgid "global shared state for post-processing stage" +msgstr "後処理環境用に状態を共有される,global" + +# @example +#: ../lib/yard/handlers/processor.rb:77 +msgid "tag|example|Sharing state among two handlers" +msgstr "2つのハンドラーの間で状態を共有する" + +# @see +#: ../lib/yard/handlers/processor.rb:77 +msgid "tag|see|#extra_state" +msgstr "" + +# YARD::Handlers::Base#extra_state +# YARD::Handlers::Processor#extra_state +# YARD::Handlers::Processor#extra_state= +#: ../lib/yard/handlers/processor.rb:80 +msgid "" +"Share state across different handlers inside of a file.\n" +"This attribute is similar to {#visibility}, {#scope}, {#namespace}\n" +"and {#owner}, in that they all maintain state across all handlers\n" +"for the entire source file. Use this attribute to store any data\n" +"your handler might need to save during the parsing of a file. If\n" +"you need to save state across files, see {#globals}." +msgstr "" +"ファイルの内部の別のハンドラーの行き来の状態を共有する。\n" +"それらは全体のソースファイルの為に全てのハンドラーの行き来の状態を\n" +"全て維持するという点で {#visibility}, {#scope}, {#namespace}, {#owner}属性と" +"似ている。\n" +"この属性を使って、あなたのハンドラーが必要とするかもしれないデータを格納し\n" +"ファイルの解析中に保存する。\n" +"ファイル全体の状態の保存が必要な場合、 {#globals} を参照。" + +# @return [OpenStruct] +#: ../lib/yard/handlers/processor.rb:88 +msgid "an open structure that can store arbitrary data" +msgstr "任意のデータを記録できる簡単な構造体" + +# @see +#: ../lib/yard/handlers/processor.rb:88 +msgid "tag|see|#globals" +msgstr "" + +# YARD::Handlers::Processor#initialize +#: ../lib/yard/handlers/processor.rb:91 +msgid "Creates a new Processor for a +file+." +msgstr "+file+用の新しいProcessorを作成する" + +# @return [Processor] +#: ../lib/yard/handlers/processor.rb:92 +msgid "a new instance of Processor" +msgstr "プロセッサーの新しいインスタンス" + +# @param [Array] +# @param [Hash] +#: ../lib/yard/handlers/processor.rb:92 ../lib/yard/tags/directives.rb:54 +#: ../lib/yard/tags/library.rb:290 +msgid "tag|param|parser" +msgstr "" + +# @param [Integer] char_no +#: ../lib/yard/handlers/processor.rb:92 +msgid "the parser used to initialize the processor" +msgstr "プロセッサを初期化するために使ったパーサー" + +# YARD::Handlers::Processor#process +#: ../lib/yard/handlers/processor.rb:106 +msgid "" +"Processes a list of statements by finding handlers to process each\n" +"one." +msgstr "" +"処理の各自の処理ハンドラーが見つけることによって\n" +"処理ステートメントのリスト\n" + +# @param [Array] statements +#: ../lib/yard/handlers/processor.rb:110 +msgid "a list of statements" +msgstr "ステートメントのリスト" + +# @param [Array] +#: ../lib/yard/handlers/processor.rb:110 +msgid "tag|param|statements" +msgstr "statements" + +# YARD::Handlers::Processor#parse_remaining_files +#: ../lib/yard/handlers/processor.rb:133 +msgid "" +"Continue parsing the remainder of the files in the +globals.ordered_parser+\n" +"object. After the remainder of files are parsed, processing will continue\n" +"on the current file." +msgstr "" + +# @see +#: ../lib/yard/handlers/processor.rb:138 +msgid "tag|see|Parser::OrderedParser" +msgstr "" + +# YARD::Handlers::Processor#find_handlers +#: ../lib/yard/handlers/processor.rb:146 +msgid "" +"Searches for all handlers in {Base.subclasses} that match the +statement+" +msgstr "" +"+statement+ にマッチする{Base.sublasses}の中の全てのハンドラー用に検索する。" + +# @return [Array] +#: ../lib/yard/handlers/processor.rb:149 +msgid "a list of handlers to process the statement with." +msgstr "ステートメントと共に処理する為のハンドラーのリスト" + +# @param statement +#: ../lib/yard/handlers/processor.rb:149 +msgid "the statement object to match." +msgstr "オブジェクトにマッチするステートメント" + +# YARD::Handlers::Processor#handler_base_class +#: ../lib/yard/handlers/processor.rb:169 +msgid "Returns the handler base class" +msgstr "ハンドラーのbaseクラスを返す" + +# @return [Base] +#: ../lib/yard/handlers/processor.rb:170 +msgid "the base class" +msgstr "" + +# YARD::Handlers::Processor#handler_base_namespace +#: ../lib/yard/handlers/processor.rb:175 +msgid "The module holding the handlers to be loaded" +msgstr "ロードされるハンドラーを保持する,モジュール" + +# @return [Module] +#: ../lib/yard/handlers/processor.rb:178 +msgid "" +"the module containing the handlers depending on\n" +"{#parser_type}." +msgstr "{#parser_type}メソッドに依存しているハンドラーを含んでいる,モジュール" + +# YARD::Handlers::Processor#load_handlers +#: ../lib/yard/handlers/processor.rb:183 +msgid "" +"Loads handlers from {#handler_base_namespace}. This ensures that\n" +"Ruby1.9 handlers are never loaded into 1.8; also lowers the amount\n" +"of modules that are loaded" +msgstr "" +"{#handler_base_namespace}から、ハンドラーをロードする。\n" +"これはロードされるモジュールの量を減少させると共に\n" +"Ruby1.9ハンドラーが1.8でロードされない事を保証する。" + +# YARD::Handlers::Ruby::Legacy::AliasHandler +# YARD::Handlers::Ruby::AliasHandler +#: ../lib/yard/handlers/ruby/alias_handler.rb:2 +#: ../lib/yard/handlers/ruby/legacy/alias_handler.rb:2 +msgid "Handles alias and alias_method calls" +msgstr "aliasを操作し、alias_methodを呼び出す。" + +# YARD::Handlers::Ruby::Legacy::AttributeHandler +# YARD::Handlers::Ruby::AttributeHandler +#: ../lib/yard/handlers/ruby/attribute_handler.rb:2 +#: ../lib/yard/handlers/ruby/legacy/attribute_handler.rb:2 +msgid "Handles +attr_*+ statements in modules/classes" +msgstr "モジュール/クラスの中の +attr_+ ステートメントを操作する。" + +# YARD::Handlers::Ruby::AttributeHandler#validated_attribute_names +#: ../lib/yard/handlers/ruby/attribute_handler.rb:65 +msgid "Strips out any non-essential arguments from the attr statement." +msgstr "attrステートメントから、任意の重要ではない引数を取り除く" + +# @param [Array] params +#: ../lib/yard/handlers/ruby/attribute_handler.rb:70 +msgid "" +"a list of the parameters\n" +"in the attr call." +msgstr "attrの中で呼ばれる引数のリスト" + +# @raise [Parser::UndocumentableError] +#: ../lib/yard/handlers/ruby/attribute_handler.rb:70 +msgid "if the arguments are not valid." +msgstr "引数が有効でない場合" + +# @param [Array] +# @param [Hash] +#: ../lib/yard/handlers/ruby/attribute_handler.rb:70 +#: ../lib/yard/templates/helpers/base_helper.rb:138 +msgid "tag|param|params" +msgstr "params" + +# @return [Array] +#: ../lib/yard/handlers/ruby/attribute_handler.rb:70 +msgid "the validated attribute names" +msgstr "有効化された属性名" + +# YARD::Handlers::Ruby::HandlesExtension +#: ../lib/yard/handlers/ruby/base.rb:5 +msgid "" +"To implement a custom handler matcher, subclass this class and implement\n" +"{#matches?} to return whether a node matches the handler." +msgstr "" +"カスタムハンドラーのマッチャーを実装するには、このクラスをサブクラス化す" +"る。\n" +"そして、ノードがハンドラーにマッチするかどうかを返す為に{#matches?}メソッドを" +"実装する。" + +# @example A Custom Handler Matcher Extension +#: ../lib/yard/handlers/ruby/base.rb:18 +msgid "" +"# Implements a handler that checks for a specific string\n" +"# in the node's source.\n" +"class MyExtension < HandlesExtension\n" +" def matches?(node) node.source.include?(name) end\n" +"end\n" +"\n" +"# This handler will handle any node where the source includes 'foo'\n" +"class MyHandler < Handlers::Ruby::Base\n" +" handles MyExtension.new('foo')\n" +"end" +msgstr "" +"# 特定の文字列をチェックするハンドラーを実装する\n" +"# ノードのソースの中で\n" +"class MyExtension < HandlesExtension\n" +" def matches?(node) node.source.include?(name) end\n" +"end\n" +"\n" +"# このハンドラーは'foo'を含んでいるソースの所で任意のノードを操作する。\n" +"class MyHandler < Handlers::Ruby::Base\n" +" handles MyExtension.new('foo')\n" +"end" + +# @example +#: ../lib/yard/handlers/ruby/base.rb:18 +msgid "tag|example|A Custom Handler Matcher Extension" +msgstr "カスタムハンドラーのマッチャーの拡張" + +# YARD::Handlers::Ruby::HandlesExtension#initialize +#: ../lib/yard/handlers/ruby/base.rb:20 +msgid "Creates a new extension with a specific matcher value +name+" +msgstr "特定のマッチャーの値の +name+ と共に、新たな拡張を作成する" + +# @return [HandlesExtension] +#: ../lib/yard/handlers/ruby/base.rb:21 +msgid "a new instance of HandlesExtension" +msgstr "HandlesExtensionの新しいインスタンス" + +# @param [Object] name +#: ../lib/yard/handlers/ruby/base.rb:21 +msgid "the matcher value to check against {#matches?}" +msgstr "{#matches?}メソッドに備えて確認する,マッチャーの値" + +# YARD::Handlers::Ruby::HandlesExtension#matches? +#: ../lib/yard/handlers/ruby/base.rb:24 +msgid "Tests if the node matches the handler" +msgstr "ノードがハンドラーにマッチする場合、テストする。" + +# @param [Parser::Ruby::AstNode] node +#: ../lib/yard/handlers/ruby/base.rb:26 +msgid "a Ruby node" +msgstr "Rubyのノード" + +# @param [Parser::Ruby::AstNode] +#: ../lib/yard/handlers/ruby/base.rb:26 +msgid "tag|param|node" +msgstr "node" + +# @return [Boolean] +#: ../lib/yard/handlers/ruby/base.rb:26 +msgid "whether the +node+ matches the handler" +msgstr "+node+ がハンドラーにマッチするかどうか" + +# @return [String] +#: ../lib/yard/handlers/ruby/base.rb:31 +msgid "the extension matcher value" +msgstr "拡張のマッチャーの値" + +# YARD::Handlers::Ruby::Base +#: ../lib/yard/handlers/ruby/base.rb:55 +msgid "" +"This is the base handler class for the new-style (1.9) Ruby parser.\n" +"All handlers that subclass this base class will be used when the\n" +"new-style parser is used. For implementing legacy handlers, see\n" +"{Legacy::Base}." +msgstr "" +"これは、新しい(1.9用)Rubyパーサー用の基本ハンドラークラスとなる。\n" +"この基本クラスからサブクラス化する全てのハンドラーは、\n" +"新しいスタイルのパーサーを使う時に利用される。\n" +"レガシーハンドラーの実装には、{Legacy::Base}を参照。" + +# @abstract +#: ../lib/yard/handlers/ruby/base.rb:62 +msgid "See {Handlers::Base} for subclassing information." +msgstr "サブクラス化用の情報には、{Handlers::Base}を参照" + +# @see +#: ../lib/yard/handlers/ruby/base.rb:62 +msgid "tag|see|Legacy::Base" +msgstr "" + +# YARD::Handlers::Ruby::Base.method_call +#: ../lib/yard/handlers/ruby/base.rb:69 +msgid "" +"Matcher for handling any type of method call. Method calls can\n" +"be expressed by many {AstNode} types depending on the syntax\n" +"with which it is called, so YARD allows you to use this matcher\n" +"to simplify matching a method call." +msgstr "" +"任意のメソッド呼び出しの型を操作する為のマッチャー\n" +"メソッド呼び出しは、\n" +"構文から多くの{AstNode}型となって表され\n" +"呼び出す事ができる。\n" +"なので、YARDは\n" +"あなたがメソッド呼び出しのマッチを簡単にする為に\n" +"このマッチャーを使う事を許可する。" + +# YARD::Handlers::Ruby::Base.method_call +# YARD::Handlers::Ruby::Base.meta_type +#: ../lib/yard/handlers/ruby/base.rb:83 ../lib/yard/handlers/ruby/base.rb:102 +msgid "Statement Matcher Extensions" +msgstr "ステートメントマッチャーの拡張" + +# @example Match the "describe" method call +#: ../lib/yard/handlers/ruby/base.rb:83 +msgid "" +"handles method_call(:describe)\n" +"\n" +"# The following will be matched:\n" +"# describe(...)\n" +"# object.describe(...)\n" +"# describe \"argument\" do ... end" +msgstr "" + +# @param [#to_s] name +#: ../lib/yard/handlers/ruby/base.rb:83 +msgid "matches the method call of this name" +msgstr "この名前のメソッド呼び出しのマッチャー" + +# @example +#: ../lib/yard/handlers/ruby/base.rb:83 +msgid "tag|example|Match the \"describe\" method call" +msgstr "\"describe\"メソッド呼び出しにマッチする" + +# YARD::Handlers::Ruby::Base.meta_type +#: ../lib/yard/handlers/ruby/base.rb:88 +msgid "" +"Matcher for handling a node with a specific meta-type. An {AstNode}\n" +"has a {AstNode#type} to define its type but can also be associated\n" +"with a set of types. For instance, +:if+ and +:unless+ are both\n" +"of the meta-type +:condition+." +msgstr "" +"特定のメタタイプと共にノードを処理する為のマッチャー。\n" +"{AstNode}はAstNodeの型を定義する為に\n" +"{AstNode#type}メソッドを持っている。\n" +"しかし、型のグループと共に関連付ける事もできる。\n" +"例えば、 +:if+ と +:unless+ は、両方とも +:condition+ のメタタイプとなる。" + +# YARD::Handlers::Ruby::Base.meta_type +#: ../lib/yard/handlers/ruby/base.rb:93 +msgid "" +"A meta-type is any method on the {AstNode} class ending in \"?\",\n" +"though you should not include the \"?\" suffix in your declaration.\n" +"Some examples are: \"condition\", \"call\", \"literal\", \"kw\", \"token\",\n" +"\"ref\"." +msgstr "" +"メタタイプは、\"?\"で終わる{AstNode}クラスの任意のメソッドである。\n" +"なので、あなたは、自身の宣言の中で\"?\"サフィックスを含むべきではない。\n" +"いくつかの例を上げると、\"condition\", \"call\", \"literal\", \"kw\", \"token" +"\",\"ref\" となる。" + +# @example Handling any conditional statement (if, unless) +#: ../lib/yard/handlers/ruby/base.rb:102 +msgid "handles meta_type(:condition)" +msgstr "" + +# @example +#: ../lib/yard/handlers/ruby/base.rb:102 +msgid "tag|example|Handling any conditional statement (if, unless)" +msgstr "任意の条件文(if, unless)を操作する" + +# @param [Symbol] type +#: ../lib/yard/handlers/ruby/base.rb:102 +msgid "" +"the meta-type to match. A meta-type can be\n" +"any method name + \"?\" that {AstNode} responds to." +msgstr "" +"マッチするメタタイプ。\n" +"メタタイプは、{AstNode}に対応する任意のメソッド名 + \"?\" でできる。" + +# YARD::Handlers::Ruby::Base.handles? +#: ../lib/yard/handlers/ruby/base.rb:110 +msgid "Testing for a Handler" +msgstr "ハンドラー用にテストする。" + +# @return [Boolean] +#: ../lib/yard/handlers/ruby/base.rb:110 +msgid "" +"whether or not an {AstNode} object should be\n" +"handled by this handler" +msgstr "{AstNode}オブジェクトはこのハンドラーによって処理されるかどうか" + +# YARD::Handlers::Ruby::Base#call_params +# YARD::Handlers::Ruby::Base#caller_method +#: ../lib/yard/handlers/ruby/base.rb:141 ../lib/yard/handlers/ruby/base.rb:152 +msgid "Macro Handling" +msgstr "マクロを処理する" + +# YARD::Handlers::Ruby::Legacy::ClassConditionHandler +# YARD::Handlers::Ruby::ClassConditionHandler +#: ../lib/yard/handlers/ruby/class_condition_handler.rb:2 +#: ../lib/yard/handlers/ruby/legacy/class_condition_handler.rb:2 +msgid "" +"Matches if/unless conditions inside classes and attempts to process only\n" +"one branch (by evaluating the condition if possible)." +msgstr "" +"クラス内部のif/unless条件にマッチし、一つのブランチだけを処理する。(条件を評" +"価し可能ならば)" + +# @example A simple class conditional +#: ../lib/yard/handlers/ruby/class_condition_handler.rb:11 +msgid "" +"class Foo\n" +" if 0\n" +" # This method is ignored\n" +" def xyz; end\n" +" end\n" +"end" +msgstr "" +"class Foo\n" +" if 0\n" +" # このメソッドは無視される\n" +" def xyz; end\n" +" end\n" +"end" + +# @example +#: ../lib/yard/handlers/ruby/class_condition_handler.rb:11 +msgid "tag|example|A simple class conditional" +msgstr "シンプルな条件のクラス" + +# YARD::Handlers::Ruby::Legacy::ClassConditionHandler#parse_condition +# YARD::Handlers::Ruby::ClassConditionHandler#parse_condition +#: ../lib/yard/handlers/ruby/class_condition_handler.rb:31 +#: ../lib/yard/handlers/ruby/legacy/class_condition_handler.rb:23 +msgid "Parses the condition part of the if/unless statement" +msgstr "if/unlessステートメントの部分の条件を解析する。" + +# @return [true, false, nil] +#: ../lib/yard/handlers/ruby/class_condition_handler.rb:35 +#: ../lib/yard/handlers/ruby/legacy/class_condition_handler.rb:28 +msgid "" +"true if the condition can be definitely\n" +"parsed to true, false if not, and nil if the condition cannot be\n" +"parsed with certainty (it's dynamic)" +msgstr "" +"条件が間違いなく解析できる場合、true\n" +"そうでない場合、falseや、\n" +"条件が完璧に解析できない場合、nilとなる。\n" +"(it's dynamic)" + +# YARD::Handlers::Ruby::Legacy::ClassHandler +# YARD::Handlers::Ruby::ClassHandler +#: ../lib/yard/handlers/ruby/class_handler.rb:2 +#: ../lib/yard/handlers/ruby/legacy/class_handler.rb:2 +msgid "Handles class declarations" +msgstr "クラスの宣言を操作する" + +# YARD::Handlers::Ruby::ClassHandler#extract_parameters +# YARD::Handlers::Ruby::ConstantHandler#extract_parameters +#: ../lib/yard/handlers/ruby/class_handler.rb:63 +#: ../lib/yard/handlers/ruby/constant_handler.rb:35 +msgid "" +"Extract the parameters from the Struct.new AST node, returning them as a " +"list\n" +"of strings" +msgstr "" +"パラメータをStrct.new Astノードから抽出し、文字列のリストとしてAstノードを返" +"す。" + +# @param [MethodCallNode] +# @param [String] +#: ../lib/yard/handlers/ruby/class_handler.rb:67 +#: ../lib/yard/handlers/ruby/constant_handler.rb:39 +#: ../lib/yard/handlers/ruby/struct_handler_methods.rb:91 +msgid "tag|param|superclass" +msgstr "superclass" + +# @param [MethodCallNode] superclass +#: ../lib/yard/handlers/ruby/class_handler.rb:67 +#: ../lib/yard/handlers/ruby/constant_handler.rb:39 +msgid "the AST node for the Struct.new call" +msgstr "Struct.new呼び出し用のASTノード" + +# @return [Array] +#: ../lib/yard/handlers/ruby/class_handler.rb:67 +#: ../lib/yard/handlers/ruby/constant_handler.rb:39 +msgid "the member names to generate methods for" +msgstr "member名にメソッドを生成する,member名" + +# YARD::Handlers::Ruby::Legacy::ClassVariableHandler +# YARD::Handlers::Ruby::ClassVariableHandler +#: ../lib/yard/handlers/ruby/class_variable_handler.rb:2 +#: ../lib/yard/handlers/ruby/legacy/class_variable_handler.rb:2 +msgid "Handles a class variable (@@variable)" +msgstr "クラス変数を操作する(@@変数)" + +# YARD::Handlers::Ruby::Legacy::ConstantHandler +# YARD::Handlers::Ruby::ConstantHandler +#: ../lib/yard/handlers/ruby/comment_handler.rb:2 +#: ../lib/yard/handlers/ruby/legacy/comment_handler.rb:2 +msgid "Handles any lone comment statement in a Ruby file" +msgstr "Rubyのファイルの中の任意の単一のコメントステートメントを操作する" + +# YARD::Handlers::Ruby::Legacy::ConstantHandler +# YARD::Handlers::Ruby::ConstantHandler +#: ../lib/yard/handlers/ruby/constant_handler.rb:2 +#: ../lib/yard/handlers/ruby/legacy/constant_handler.rb:2 +msgid "Handles any constant assignment" +msgstr "任意の定数割り当てを操作する" + +# YARD::Handlers::Ruby::Legacy::MacroHandler +# YARD::Handlers::Ruby::MacroHandler +#: ../lib/yard/handlers/ruby/dsl_handler.rb:5 +#: ../lib/yard/handlers/ruby/legacy/dsl_handler.rb:6 +msgid "Handles automatic detection of dsl-style methods" +msgstr "DSLスタイルのメソッドの自動宣言を操作する" + +# YARD::Handlers::Ruby::Legacy::ExceptionHandler +# YARD::Handlers::Ruby::ExceptionHandler +#: ../lib/yard/handlers/ruby/exception_handler.rb:2 +#: ../lib/yard/handlers/ruby/legacy/exception_handler.rb:2 +msgid "Handles 'raise' calls inside methods" +msgstr "メソッドの内部で呼び出す'raise'を操作する" + +# YARD::Handlers::Ruby::Legacy::ExtendHandler +# YARD::Handlers::Ruby::ExtendHandler +#: ../lib/yard/handlers/ruby/extend_handler.rb:2 +#: ../lib/yard/handlers/ruby/legacy/extend_handler.rb:2 +msgid "" +"Handles 'extend' call to include modules into the class scope of another" +msgstr "" +"他のクラススコープの中へモジュールを含める為に、'extend'呼び出しを操作する。" + +# @see +#: ../lib/yard/handlers/ruby/extend_handler.rb:3 +msgid "tag|see|MixinHandler" +msgstr "" + +# YARD::Handlers::Ruby::Legacy::Base +#: ../lib/yard/handlers/ruby/legacy/base.rb:5 +msgid "" +"This is the base handler for the legacy parser. To implement a legacy\n" +"handler, subclass this class." +msgstr "" +"これは、legacy parser用のbase handlerとなる。\n" +"legacy handlerの実装には、このクラスをサブクラスにする。" + +# @return [Boolean] +#: ../lib/yard/handlers/ruby/legacy/base.rb:14 +msgid "" +"whether or not a {Parser::Ruby::Legacy::Statement} object should be handled\n" +"by this handler." +msgstr "" +"{Parser::Ruby::Legacy::Statement}オブジェクトが、\n" +"このハンドラーによって操作されるかどうか" + +# YARD::Handlers::Ruby::Legacy::Base#parse_block +#: ../lib/yard/handlers/ruby/legacy/base.rb:28 +msgid "" +"Parses a statement's block with a set of state values. If the\n" +"statement has no block, nothing happens. A description of state\n" +"values can be found at {Handlers::Base#push_state}" +msgstr "" +"値の状態のグループと共に、ブロックのステートメントを解析する。\n" +"ステートメントがブロックを持たない場合、何も起こらない。\n" +"値の状態の説明は、{Handlers::Base#push_state}で見つけられる。" + +# @see Handlers::Base#push_state +#: ../lib/yard/handlers/ruby/legacy/base.rb:34 +msgid "#push_state" +msgstr "" + +# @param [Hash] opts +#: ../lib/yard/handlers/ruby/legacy/base.rb:34 +msgid "State options" +msgstr "オプションの状態" + +# @see +#: ../lib/yard/handlers/ruby/legacy/base.rb:34 +msgid "tag|see|Handlers::Base#push_state" +msgstr "" + +# YARD::Handlers::Ruby::Legacy::Base#extract_method_details +#: ../lib/yard/handlers/ruby/legacy/base.rb:67 +msgid "Extracts method information for macro expansion only" +msgstr "" + +# @todo +#: ../lib/yard/handlers/ruby/legacy/base.rb:71 +msgid "This is a duplicate implementation of {MethodHandler}. Refactor." +msgstr "" + +# @return [Array>>] +#: ../lib/yard/handlers/ruby/legacy/base.rb:71 +msgid "" +"the method name followed by method\n" +"arguments (name and optional value)" +msgstr "" + +# YARD::Handlers::Ruby::Legacy::Base#tokval +#: ../lib/yard/handlers/ruby/legacy/base.rb:85 +msgid "" +"The string value of a token. For example, the return value for the symbol :" +"sym\n" +"would be :sym. The return value for a string +\"foo #{ bar}\"+ would be the " +"literal\n" +"+\"foo #{ bar}\"+ without any interpolation. The return value of the " +"identifier\n" +"'test' would be the same value: 'test'. Here is a list of common types and\n" +"their return values:" +msgstr "" +"トークンの文字列の値。例えば、シンボル:sym用に返す値は、:symになる。\n" +"文字列 +\"foo #{ bar}\"+ 用に返す値は、補完を含まない +\"foo #{ bar}\"+ リテ" +"ラルになる。\n" +"'test'識別子の返す値は、'test'と同じ値になるだろう。\n" +"ここでは、一般的な型のリストやそれらの値を返す。" + +# @param [Array>, Symbol] accepted_types +#: ../lib/yard/handlers/ruby/legacy/base.rb:116 +msgid "" +"The allowed token types that this token can be. Defaults to [{TkVal}].\n" +"A list of types would be, for example, [+TkSTRING+, +TkSYMBOL+], to return\n" +"the token's value if it is either of those types. If +TkVal+ is accepted,\n" +"+TkNode+ is also accepted.\n" +"\n" +"Certain symbol keys are allowed to specify multiple types in one fell " +"swoop.\n" +"These symbols are:\n" +" :string => +TkSTRING+, +TkDSTRING+, +TkDXSTRING+ and +TkXSTRING+\n" +" :attr => +TkSYMBOL+ and +TkSTRING+\n" +" :identifier => +TkIDENTIFIER, +TkFID+ and +TkGVAR+.\n" +" :number => +TkFLOAT+, +TkINTEGER+" +msgstr "" +"トークンにできる受け入れられるトークンの型となる。\n" +"デフォルトでは、[{TkVal}]になる。\n" +"型のリストになる、\n" +"\n" +"例えば、[+TkSTRING+, +TkSYMBOL+]は、\n" +"どちらかがこれらの型の場合、トークンの値を返す。\n" +"+TkVal+が受け入れられる場合、+TkNode+も受け入れられる。\n" +"\n" +"特定のシンボルキーは、一つで複数の型を一気に指定する為に受け入れられる。\n" +"このようなシンボルとなる:\n" +" :string => +TkSTRING+, +TkDSTRING+, +TkDXSTRING+ and +TkXSTRING+\n" +" :attr => +TkSYMBOL+ and +TkSTRING+\n" +" :identifier => +TkIDENTIFIER, +TkFID+ and +TkGVAR+.\n" +" :number => +TkFLOAT+, +TkINTEGER+" + +# @param [Token] token +#: ../lib/yard/handlers/ruby/legacy/base.rb:116 +msgid "The token of the class" +msgstr "クラスのトークン" + +# @return [nil] +#: ../lib/yard/handlers/ruby/legacy/base.rb:116 +msgid "if the token is not any of the specified accepted types" +msgstr "トークンが指定され受け入れられる型のどれでもない場合、" + +# @return [Object] +#: ../lib/yard/handlers/ruby/legacy/base.rb:116 +msgid "" +"if the token is one of the accepted types, in its real value form.\n" +"It should be noted that identifiers and constants are kept in String form." +msgstr "" +"トークンが受け入れられる型の一つの場合、その中は、実際の値の形式になる。\n" +"そして、識別子と定数がString形式で注釈される。" + +# @param [Array>, Symbol] +# @param [Array>] +#: ../lib/yard/handlers/ruby/legacy/base.rb:116 +#: ../lib/yard/handlers/ruby/legacy/base.rb:182 +msgid "tag|param|accepted_types" +msgstr "accepted_types" + +# @param [Token] +#: ../lib/yard/handlers/ruby/legacy/base.rb:116 +msgid "tag|param|token" +msgstr "token" + +# @example +#: ../lib/yard/handlers/ruby/legacy/base.rb:116 +msgid "" +"tokval(TokenList.new('\"foo\"').first) => \"foo\"\n" +"tokval(TokenList.new(':foo').first) => :foo\n" +"tokval(TokenList.new('CONSTANT').first, RubyToken::TkId) => \"CONSTANT\"\n" +"tokval(TokenList.new('identifier').first, RubyToken::TkId) => \"identifier" +"\"\n" +"tokval(TokenList.new('3.25').first) => 3.25\n" +"tokval(TokenList.new('/xyz/i').first) => /xyz/i" +msgstr "" + +# YARD::Handlers::Ruby::Legacy::Base#tokval_list +#: ../lib/yard/handlers/ruby/legacy/base.rb:162 +msgid "" +"Returns a list of symbols or string values from a statement.\n" +"The list must be a valid comma delimited list, and values\n" +"will only be returned to the end of the list only." +msgstr "" +"ステートメントから、シンボル,又は,文字列の値のリストを返す。\n" +"リストは、有効なカンマで区切られたリストでなければならない、\n" +"そして、値はリストで返されるだけにしなければならない。" + +# YARD::Handlers::Ruby::Legacy::Base#tokval_list +#: ../lib/yard/handlers/ruby/legacy/base.rb:166 +msgid "" +"Example:\n" +" attr_accessor :a, 'b', :c, :d => ['a', 'b', 'c', 'd']\n" +" attr_accessor 'a', UNACCEPTED_TYPE, 'c' => ['a', 'c']" +msgstr "" + +# YARD::Handlers::Ruby::Legacy::Base#tokval_list +#: ../lib/yard/handlers/ruby/legacy/base.rb:170 +msgid "" +"The tokval list of a {Parser::Ruby::Legacy::TokenList} of the above\n" +"code would be the {#tokval} value of :a, 'b',\n" +":c and :d." +msgstr "" +"上のコード{Parser::Ruby::Legacy::TokenList}のtokvalのリストは、\n" +":a, 'b', :c, :d の入った{#tokval}の値になる。" + +# YARD::Handlers::Ruby::Legacy::Base#tokval_list +#: ../lib/yard/handlers/ruby/legacy/base.rb:174 +msgid "" +"It should also be noted that this function stops immediately at\n" +"any ruby keyword encountered:\n" +" \"attr_accessor :a, :b, :c if x == 5\" => ['a', 'b', 'c']" +msgstr "" +"それは、この機能が任意のrubyキーワードが出会った所で、\n" +"直後に止めて注釈される。\n" +" \"attr_accessor :a, :b, :c if x == 5\" => ['a', 'b', 'c']" + +# @param [TokenList] tokenlist +#: ../lib/yard/handlers/ruby/legacy/base.rb:182 +msgid "The list of tokens to process." +msgstr "処理されるトークンのリスト" + +# @return [Array] +#: ../lib/yard/handlers/ruby/legacy/base.rb:182 +msgid "if there are no symbols or Strings in the list" +msgstr "シンボルやリストの文字列がない場合" + +# @param [Array>] accepted_types +#: ../lib/yard/handlers/ruby/legacy/base.rb:182 +msgid "passed to {#tokval}" +msgstr "{#tokval}に渡される" + +# @param [TokenList] +#: ../lib/yard/handlers/ruby/legacy/base.rb:182 +msgid "tag|param|tokenlist" +msgstr "tokenlist" + +# @see +#: ../lib/yard/handlers/ruby/legacy/base.rb:182 +msgid "tag|see|#tokval" +msgstr "" + +# @return [Array] +#: ../lib/yard/handlers/ruby/legacy/base.rb:182 +msgid "the list of tokvalues in the list." +msgstr "リストの中のtokvaluesのリスト" + +# YARD::Handlers::Ruby::Legacy::ClassHandler#extract_parameters +#: ../lib/yard/handlers/ruby/legacy/class_handler.rb:62 +msgid "" +"Extracts the parameter list from the Struct.new declaration and returns it\n" +"formatted as a list of member names. Expects the user will have used " +"symbols\n" +"to define the struct member names" +msgstr "" +"Struct.new宣言から、引数のリストを抽出し、\n" +"それをメンバー名のリストとして、書式化して返す\n" +"ユーザーは、structメンバー名を定義する為に、シンボルを\n" +"利用する事を要求するだろう。" + +# @return [Array] +# @param [Array] members +#: ../lib/yard/handlers/ruby/legacy/class_handler.rb:67 +#: ../lib/yard/handlers/ruby/struct_handler_methods.rb:133 +msgid "a list of member names" +msgstr "メンバー名のリスト" + +# @param [String] +#: ../lib/yard/handlers/ruby/legacy/class_handler.rb:67 +msgid "tag|param|superstring" +msgstr "superstring" + +# @param [String] superstring +#: ../lib/yard/handlers/ruby/legacy/class_handler.rb:67 +msgid "the string declaring the superclass" +msgstr "文字列で宣言しているsuperclass" + +# YARD::Handlers::Ruby::Legacy::MethodHandler +# YARD::Handlers::Ruby::MethodHandler +#: ../lib/yard/handlers/ruby/legacy/method_handler.rb:2 +#: ../lib/yard/handlers/ruby/method_handler.rb:2 +msgid "Handles a method definition" +msgstr "メソッドの定義を操作する" + +# YARD::Handlers::Ruby::Legacy::MixinHandler +# YARD::Handlers::Ruby::MixinHandler +#: ../lib/yard/handlers/ruby/legacy/mixin_handler.rb:2 +#: ../lib/yard/handlers/ruby/mixin_handler.rb:2 +msgid "Handles the 'include' statement to mixin a module in the instance scope" +msgstr "" +"インスタンススコープのモジュールをmixinする為に、'include'ステートメントを操" +"作する。" + +# YARD::Handlers::Ruby::Legacy::ModuleFunctionHandler +# YARD::Handlers::Ruby::ModuleFunctionHandler +#: ../lib/yard/handlers/ruby/legacy/module_function_handler.rb:2 +#: ../lib/yard/handlers/ruby/module_function_handler.rb:2 +msgid "" +"Handles module_function calls to turn methods into public class methods.\n" +"Also creates a private instance copy of the method." +msgstr "" + +# YARD::Handlers::Ruby::Legacy::ModuleHandler +# YARD::Handlers::Ruby::ModuleHandler +#: ../lib/yard/handlers/ruby/legacy/module_handler.rb:2 +#: ../lib/yard/handlers/ruby/module_handler.rb:2 +msgid "Handles the declaration of a module" +msgstr "モジュールの宣言を操作する" + +# YARD::Handlers::Ruby::Legacy::PrivateConstantHandler +# YARD::Handlers::Ruby::PrivateConstantHandler +#: ../lib/yard/handlers/ruby/legacy/private_constant_handler.rb:2 +#: ../lib/yard/handlers/ruby/private_constant_handler.rb:2 +msgid "Sets visibility of a constant (class, module, const)" +msgstr "定数の可視性を設定する(クラス,モジュール,定数)" + +# YARD::Handlers::Ruby::Legacy::VisibilityHandler +# YARD::Handlers::Ruby::VisibilityHandler +#: ../lib/yard/handlers/ruby/legacy/visibility_handler.rb:2 +#: ../lib/yard/handlers/ruby/visibility_handler.rb:2 +msgid "Handles 'private', 'protected', and 'public' calls." +msgstr "'private', 'protected', 'public' 呼び出しを操作する。" + +# YARD::Handlers::Ruby::Legacy::YieldHandler +# YARD::Handlers::Ruby::YieldHandler +#: ../lib/yard/handlers/ruby/legacy/yield_handler.rb:2 +#: ../lib/yard/handlers/ruby/yield_handler.rb:2 +msgid "Handles 'yield' calls" +msgstr "'yield'を呼び出し操作する" + +# YARD::Handlers::Ruby::MethodConditionHandler +#: ../lib/yard/handlers/ruby/method_condition_handler.rb:2 +msgid "Handles a conditional inside a method" +msgstr "メソッドの内部の条件を操作する" + +# YARD::Handlers::Ruby::StructHandlerMethods +#: ../lib/yard/handlers/ruby/struct_handler_methods.rb:2 +msgid "Helper methods to parse @attr_* tags on a class." +msgstr "クラスの@attr_* タグを解析する為のHelperメソッド" + +# @deprecated +#: ../lib/yard/handlers/ruby/struct_handler_methods.rb:6 +msgid "" +"The use of +@attr+ tags are deprecated since 0.8.0 in favour of\n" +"the +@!attribute+ directive. This module should not be relied on." +msgstr "" + +# YARD::Handlers::Ruby::StructHandlerMethods#member_tag_for_member +#: ../lib/yard/handlers/ruby/struct_handler_methods.rb:10 +msgid "" +"Extracts the user's defined @member tag for a given class and its member. " +"Returns\n" +"nil if the user did not define a @member tag for this struct entry." +msgstr "" +"与えられたクラスとそのメンバー用に\n" +"ユーザーの定義した@memberタグを抽出する。\n" +"この構造体の登録用の@memberタグが未定義だった場合、nilを返す。" + +# @param [Symbol] type +#: ../lib/yard/handlers/ruby/struct_handler_methods.rb:16 +msgid "reader method, or writer method?" +msgstr "readerメソッドかwriterメソッドか?" + +# @param [ClassObject] +#: ../lib/yard/handlers/ruby/struct_handler_methods.rb:16 +#: ../lib/yard/handlers/ruby/struct_handler_methods.rb:25 +#: ../lib/yard/handlers/ruby/struct_handler_methods.rb:37 +#: ../lib/yard/handlers/ruby/struct_handler_methods.rb:61 +#: ../lib/yard/handlers/ruby/struct_handler_methods.rb:76 +#: ../lib/yard/handlers/ruby/struct_handler_methods.rb:103 +#: ../lib/yard/handlers/ruby/struct_handler_methods.rb:120 +#: ../lib/yard/handlers/ruby/struct_handler_methods.rb:133 +msgid "tag|param|klass" +msgstr "klass" + +# @param [String] +#: ../lib/yard/handlers/ruby/struct_handler_methods.rb:16 +#: ../lib/yard/handlers/ruby/struct_handler_methods.rb:37 +#: ../lib/yard/handlers/ruby/struct_handler_methods.rb:61 +#: ../lib/yard/handlers/ruby/struct_handler_methods.rb:76 +#: ../lib/yard/handlers/ruby/struct_handler_methods.rb:103 +#: ../lib/yard/handlers/ruby/struct_handler_methods.rb:120 +msgid "tag|param|member" +msgstr "member" + +# @param [ClassObject] klass +#: ../lib/yard/handlers/ruby/struct_handler_methods.rb:16 +#: ../lib/yard/handlers/ruby/struct_handler_methods.rb:37 +msgid "the class whose tags we're searching" +msgstr "検索しているタグのクラス" + +# @param [String] member +#: ../lib/yard/handlers/ruby/struct_handler_methods.rb:16 +#: ../lib/yard/handlers/ruby/struct_handler_methods.rb:37 +msgid "the name of the struct member we need" +msgstr "必要とする構造体memberの名前" + +# @return [Tags::Tag, nil] +#: ../lib/yard/handlers/ruby/struct_handler_methods.rb:16 +msgid "the tag matching the request, or nil if not found" +msgstr "マッチしているタグのリクエスト、見つからない場合は、nil" + +# YARD::Handlers::Ruby::StructHandlerMethods#members_from_tags +#: ../lib/yard/handlers/ruby/struct_handler_methods.rb:22 +msgid "Retrieves all members defined in @attr* tags" +msgstr "@attr* タグの中で定義した全てのメンバーを回収する" + +# @param [ClassObject] klass +#: ../lib/yard/handlers/ruby/struct_handler_methods.rb:25 +msgid "the class with the attributes" +msgstr "属性と一緒のクラス" + +# @return [Array] +#: ../lib/yard/handlers/ruby/struct_handler_methods.rb:25 +msgid "the list of members defined as attributes on the class" +msgstr "クラス上の属性として、定義したメンバーのリスト" + +# YARD::Handlers::Ruby::StructHandlerMethods#create_member_method? +#: ../lib/yard/handlers/ruby/struct_handler_methods.rb:31 +msgid "" +"Determines whether to create an attribute method based on the class's\n" +"tags." +msgstr "クラス上で、基底のメソッド属性を作成するかどうか、確定する。" + +# @param [Symbol] type +#: ../lib/yard/handlers/ruby/struct_handler_methods.rb:37 +msgid "(:read) reader method, or writer method?" +msgstr "(:read) readerメソッドか、writerメソッドか?" + +# @return [Boolean] +#: ../lib/yard/handlers/ruby/struct_handler_methods.rb:37 +msgid "should the attribute be created?" +msgstr "属性が作成されるかどうか?" + +# YARD::Handlers::Ruby::StructHandlerMethods#return_type_from_tag +#: ../lib/yard/handlers/ruby/struct_handler_methods.rb:45 +msgid "" +"Gets the return type for the member in a nicely formatted string. Used\n" +"to be injected into auto-generated docstrings." +msgstr "" +"より良く書式化された文字列でmember用に返す型を取得する。\n" +"自動生成されたdocstrigの中へ入れる為に利用される" + +# @param [String] +#: ../lib/yard/handlers/ruby/struct_handler_methods.rb:50 +msgid "tag|param|member_tag" +msgstr "" + +# @param [CodeObjects::Base] object +#: ../lib/yard/handlers/ruby/struct_handler_methods.rb:50 +msgid "the tag object to check for types" +msgstr "型をチェックする為のタグオブジェクト" + +# @return [String] +#: ../lib/yard/handlers/ruby/struct_handler_methods.rb:50 +msgid "" +"the user-declared type of the struct member, or [Object] if\n" +"the user did not define a type for this member." +msgstr "" +"構造体memberの宣言されたユーザーの型、\\n\n" +"又はこのmember用にuserが、型を定義しなかった場合 [Object] となる。" + +# YARD::Handlers::Ruby::StructHandlerMethods#add_reader_tags +#: ../lib/yard/handlers/ruby/struct_handler_methods.rb:55 +msgid "" +"Creates the auto-generated docstring for the getter method of a struct's\n" +"member. This is used so the generated documentation will look just like " +"that\n" +"of an attribute defined using attr_accessor." +msgstr "" +"構造体memberのgetterメソッド用に自動生成されるdocstringを作成する。\n" +"これを用いて生成されるドキュメントは、attr_accessorによって定義された属性のよ" +"うに見える。" + +# @return [String] +#: ../lib/yard/handlers/ruby/struct_handler_methods.rb:61 +msgid "a docstring to be attached to the getter method for this member" +msgstr "このmember用にgetterメソッドに加えられるdocstring" + +# @param [ClassObject] klass +#: ../lib/yard/handlers/ruby/struct_handler_methods.rb:61 +#: ../lib/yard/handlers/ruby/struct_handler_methods.rb:76 +msgid "the class whose members we're working with" +msgstr "操作するmemberクラスに用いるクラス" + +# @param [String] member +#: ../lib/yard/handlers/ruby/struct_handler_methods.rb:61 +#: ../lib/yard/handlers/ruby/struct_handler_methods.rb:76 +msgid "the name of the member we're generating documentation for" +msgstr "生成されるドキュメントのmemberの名前" + +# YARD::Handlers::Ruby::StructHandlerMethods#add_writer_tags +#: ../lib/yard/handlers/ruby/struct_handler_methods.rb:70 +msgid "" +"Creates the auto-generated docstring for the setter method of a struct's\n" +"member. This is used so the generated documentation will look just like " +"that\n" +"of an attribute defined using attr_accessor." +msgstr "" +"構造体のメンバーのsetterメソッド用に、自動生成されたdocstringを作成する。\n" +"これは、生成されたドキュメントが、\n" +"attr_accessorによって定義された属性のように見えるように利用される。" + +# @return [String] +#: ../lib/yard/handlers/ruby/struct_handler_methods.rb:76 +msgid "a docstring to be attached to the setter method for this member" +msgstr "このメンバー用にsetterメソッドに加えられるdocstring" + +# YARD::Handlers::Ruby::StructHandlerMethods#create_class +#: ../lib/yard/handlers/ruby/struct_handler_methods.rb:86 +msgid "" +"Creates and registers a class object with the given name and superclass " +"name.\n" +"Returns it for further use." +msgstr "" +"与えられたクラス名、スーパークラス名と共に、\n" +"クラスオブジェクトを作成,記録する。\n" +"更に利用する為に返す。" + +# @param [String] +#: ../lib/yard/handlers/ruby/struct_handler_methods.rb:91 +msgid "tag|param|classname" +msgstr "classname" + +# @return [ClassObject] +#: ../lib/yard/handlers/ruby/struct_handler_methods.rb:91 +msgid "the class object for further processing/method attaching" +msgstr "処理/メソッドを加える為のクラスオブジェクト" + +# @param [String] classname +#: ../lib/yard/handlers/ruby/struct_handler_methods.rb:91 +msgid "the name of the class" +msgstr "クラスの名前" + +# @param [String] superclass +#: ../lib/yard/handlers/ruby/struct_handler_methods.rb:91 +msgid "the name of the superclass" +msgstr "スーパークラスの名前" + +# YARD::Handlers::Ruby::StructHandlerMethods#create_writer +#: ../lib/yard/handlers/ruby/struct_handler_methods.rb:99 +msgid "" +"Creates the setter (writer) method and attaches it to the class as an " +"attribute.\n" +"Also sets up the docstring to prettify the documentation output." +msgstr "" +"setter(writer)メソッドを作成し、属性としてクラスに追加する。\n" +"それに加え、ドキュメント出力を装飾する為にdocstringをセットアップする。" + +# @param [ClassObject] klass +#: ../lib/yard/handlers/ruby/struct_handler_methods.rb:103 +#: ../lib/yard/handlers/ruby/struct_handler_methods.rb:120 +msgid "the class to attach the method to" +msgstr "クラスにメソッドを追加するクラス" + +# @param [String] member +#: ../lib/yard/handlers/ruby/struct_handler_methods.rb:103 +#: ../lib/yard/handlers/ruby/struct_handler_methods.rb:120 +msgid "the name of the member we're generating a method for" +msgstr "私達がメソッド用に生成するメンバーの名前" + +# YARD::Handlers::Ruby::StructHandlerMethods#create_reader +#: ../lib/yard/handlers/ruby/struct_handler_methods.rb:116 +msgid "" +"Creates the getter (reader) method and attaches it to the class as an " +"attribute.\n" +"Also sets up the docstring to prettify the documentation output." +msgstr "" +"getter(reader)メソッドを作成し、属性として、クラスに追加する。\n" +"さらに、ドキュメント出力を装飾する為に、docstringをセットアップする。" + +# YARD::Handlers::Ruby::StructHandlerMethods#create_attributes +#: ../lib/yard/handlers/ruby/struct_handler_methods.rb:130 +msgid "" +"Creates the given member methods and attaches them to the given ClassObject." +msgstr "" +"与えられたメンバーメソッドを作成し、与えられたClassObjectにそれらを加える。" + +# @param [Array] +#: ../lib/yard/handlers/ruby/struct_handler_methods.rb:133 +msgid "tag|param|members" +msgstr "members" + +# @param [ClassObject] klass +#: ../lib/yard/handlers/ruby/struct_handler_methods.rb:133 +msgid "the class to generate attributes for" +msgstr "属性を生成するクラス用のクラス" + +# YARD::I18n::Locale +#: ../lib/yard/i18n/locale.rb:7 +msgid "" +"+Locale+ is a unit of translation. It has {#name} and a set of\n" +"messages." +msgstr "" + +# @see http://tools.ietf.org/rfc/bcp/bcp47.txt +#: ../lib/yard/i18n/locale.rb:15 +msgid "BCP 47 - Tags for Identifying Languages" +msgstr "" + +# @see +#: ../lib/yard/i18n/locale.rb:15 +msgid "tag|see|http://tools.ietf.org/rfc/bcp/bcp47.txt" +msgstr "" + +# @return [String] +#: ../lib/yard/i18n/locale.rb:15 +msgid "" +"the name of the locale. It used IETF language\n" +"tag format +[language[_territory][.codeset][@modifier]]+." +msgstr "" + +# YARD::Handlers::Processor#initialize +#: ../lib/yard/i18n/locale.rb:18 +msgid "Creates a locale for +name+ locale." +msgstr "+name+ の言語別にlocaleを作成する" + +# @return [Logger] +#: ../lib/yard/i18n/locale.rb:20 +msgid "a new instance of Locale" +msgstr "Localeの新しいインスタンス" + +# @return [String] +#: ../lib/yard/i18n/locale.rb:20 +msgid "the locale name." +msgstr "言語名(地域名)" + +# YARD::I18n::Locale#load +#: ../lib/yard/i18n/locale.rb:26 +msgid "Loads translation messages from +locale_directory+/{#name}.po." +msgstr "+locale_directory+/{#name}.po.から翻訳メッセージをロードする" + +# @return [Boolean] +#: ../lib/yard/i18n/locale.rb:30 +msgid "+true+ if PO file exists, +false+ otherwise." +msgstr "POファイルが存在すればtrue、そうでなければ、false" + +# @param [Boolean] +#: ../lib/yard/i18n/locale.rb:30 +msgid "tag|param|locale_directory" +msgstr "" + +# @param [String] locale_directory +#: ../lib/yard/i18n/locale.rb:30 +msgid "" +"the directory path that has\n" +"{#name}.po." +msgstr "" + +# @since +#: ../lib/yard/i18n/locale.rb:45 ../lib/yard/logging.rb:11 +#: ../lib/yard/logging.rb:15 ../lib/yard/logging.rb:82 +#: ../lib/yard/logging.rb:106 ../lib/yard/logging.rb:117 +msgid "0.8.2" +msgstr "" + +# @param [NamespaceObject] +# @param [CodeObjects::NamespaceObject, nil] +# @param [CodeObjects::NamespaceObject] +#: ../lib/yard/i18n/locale.rb:45 +msgid "tag|param|message" +msgstr "" + +# @param [CodeObjects::NamespaceObject] namespace +#: ../lib/yard/i18n/locale.rb:45 +msgid "the translation target message." +msgstr "翻訳目標のメッセージ" + +# @return [String] +#: ../lib/yard/i18n/locale.rb:45 +msgid "" +"translated message. If tarnslation isn't\n" +"registered, the +message+ is returned." +msgstr "" + +# YARD::I18n::Message +#: ../lib/yard/i18n/message.rb:6 +msgid "" +"+Message+ is a translation target message. It has message ID as\n" +"{#id} and some properties {#locations} and {#comments}." +msgstr "" + +# @param tag_name +#: ../lib/yard/i18n/message.rb:11 +msgid "the message ID of the trnslation target message." +msgstr "翻訳目標のメッセージのメッセージID" + +# @param [Fixnum, nil] line +#: ../lib/yard/i18n/message.rb:14 +msgid "path and line number where the message is appered." +msgstr "メッセージが現れるところのパスと行数" + +# @return [Set] +#: ../lib/yard/i18n/message.rb:15 +msgid "the set of locations. Location is an array of" +msgstr "" + +# @return [Array] +#: ../lib/yard/i18n/message.rb:18 +msgid "the set of comments for the messages." +msgstr "メッセージ用のコメントのグループ" + +# YARD::Handlers::Processor#initialize +#: ../lib/yard/i18n/message.rb:21 +msgid "Creates a trasnlate target message for message ID +id+." +msgstr "メッセージID +id+ 用の翻訳目標のメッセージを作成する" + +# @return [Tag] +#: ../lib/yard/i18n/message.rb:23 +msgid "a new instance of Message" +msgstr "メッセージの新しいインスタンス" + +# @param [Fixnum] +#: ../lib/yard/i18n/message.rb:23 ../lib/yard/i18n/messages.rb:26 +#: ../lib/yard/i18n/messages.rb:36 +msgid "tag|param|id" +msgstr "" + +# @param [String] id +#: ../lib/yard/i18n/message.rb:23 +msgid "the message ID of the translate target message." +msgstr "翻訳目標のメッセージのメッセージID" + +# YARD::I18n::Message#add_location +#: ../lib/yard/i18n/message.rb:30 +msgid "Adds location information for the message." +msgstr "メッセージ用の地域情報を追加する" + +# @param [Fixnum, nil] line +#: ../lib/yard/i18n/message.rb:34 +msgid "the line number where the message appears." +msgstr "メッセージが見えるところの行数" + +# @return [String] +#: ../lib/yard/i18n/message.rb:34 +msgid "the path where the message appears." +msgstr "メッセージが見えるところのパス" + +# YARD::I18n::Message#add_comment +#: ../lib/yard/i18n/message.rb:39 +msgid "Adds a comment for the message." +msgstr "メッセージ用のコメントを追加する" + +# @param [String, Array, Docstring] +# @param [String] +#: ../lib/yard/i18n/message.rb:42 +msgid "tag|param|comment" +msgstr "" + +# @return [String] +#: ../lib/yard/i18n/message.rb:42 +msgid "the comment for the message to be added." +msgstr "追加されるメッセージ用のコメント" + +# @return [Boolean] +#: ../lib/yard/i18n/message.rb:48 +msgid "checks whether this message is equal to another." +msgstr "このメッセージが他と同じかどうか" + +# @param [String] content +#: ../lib/yard/i18n/message.rb:48 +msgid "the +Message+ to be compared." +msgstr "比較される為の +message+" + +# YARD::I18n::Messages +#: ../lib/yard/i18n/messages.rb:4 +msgid "Acts as a container for {Message} objects." +msgstr "" + +# YARD::Logger#initialize +#: ../lib/yard/i18n/messages.rb:10 +msgid "Creates a new container." +msgstr "新しいコンテナを作成する" + +# @return [Tag] +#: ../lib/yard/i18n/messages.rb:10 +msgid "a new instance of Messages" +msgstr "メッセージの新しいインスタンス" + +# YARD::I18n::Messages#each +#: ../lib/yard/i18n/messages.rb:15 +msgid "Enumerates each {Message} in the container." +msgstr "" + +# @yieldparam [Tags::Tag] +#: ../lib/yard/i18n/messages.rb:19 +msgid "tag|yieldparam|message" +msgstr "" + +# @return [CodeObjects::RootObject] +#: ../lib/yard/i18n/messages.rb:19 +msgid "" +"the next message object in\n" +"the enumeration." +msgstr "配列の中の次のメッセージオブジェクト" + +# @return [Message, nil] +#: ../lib/yard/i18n/messages.rb:26 +msgid "" +"a registered message for the given +id+,\n" +"or nil if no message for the ID is found." +msgstr "" + +# @param [String] id +#: ../lib/yard/i18n/messages.rb:26 +msgid "the message ID to perform a lookup on." +msgstr "" + +# YARD::I18n::Messages#register +#: ../lib/yard/i18n/messages.rb:31 +msgid "" +"Registers a {Message}, the mssage ID of which is +id+. If\n" +"corresponding +Message+ is already registered, the previously\n" +"registered object is returned." +msgstr "" + +# @param [String] path +#: ../lib/yard/i18n/messages.rb:36 +msgid "the ID of the message to be registered." +msgstr "記録されるメッセージのID" + +# @return [CodeObjects::Base] +#: ../lib/yard/i18n/messages.rb:36 +msgid "the registered +Message+." +msgstr "記録された +Message+" + +# YARD::I18n::Messages#== +#: ../lib/yard/i18n/messages.rb:41 +msgid "Checks if this messages list is equal to another messages list." +msgstr "" + +# @param [#to_s] tag +#: ../lib/yard/i18n/messages.rb:44 +msgid "the container to compare." +msgstr "比較するためのコンテナ" + +# @return [Boolean] +#: ../lib/yard/i18n/messages.rb:44 +msgid "whether +self+ and +other+ is equivalence or not." +msgstr "" + +# @return [Array] +#: ../lib/yard/i18n/messages.rb:52 +msgid "the set of message objects" +msgstr "メッセージオブジェクトのグループ" + +# YARD::I18n::PotGenerator +#: ../lib/yard/i18n/pot_generator.rb:6 +msgid "" +"The +PotGenerator+ generates POT format string from\n" +"{CodeObjects::Base} and {CodeObjects::ExtraFileObject}." +msgstr "" + +# YARD::I18n::PotGenerator +#: ../lib/yard/i18n/pot_generator.rb:9 +msgid "== POT and PO" +msgstr "" + +# YARD::I18n::PotGenerator +#: ../lib/yard/i18n/pot_generator.rb:11 +msgid "" +"POT is an acronym for \"Portable Object Template\". POT is a\n" +"template file to create PO file. The extension for POT is\n" +"\".pot\". PO file is an acronym for \"Portable Object\". PO file has\n" +"many parts of message ID (msgid) that is translation target\n" +"message and message string (msgstr) that is translated message\n" +"of message ID. If you want to translate \"Hello\" in English into\n" +"\"Bonjour\" in French, \"Hello\" is the msgid ID and \"Bonjour\" is\n" +"msgstr. The extension for PO is \".po\"." +msgstr "" + +# YARD::I18n::PotGenerator +#: ../lib/yard/i18n/pot_generator.rb:20 +msgid "== How to extract msgids" +msgstr "" + +# YARD::I18n::PotGenerator +#: ../lib/yard/i18n/pot_generator.rb:22 +msgid "The +PotGenerator+ has two parse methods:" +msgstr "" + +# YARD::I18n::PotGenerator +#: ../lib/yard/i18n/pot_generator.rb:24 +msgid "" +"* {#parse_objects} for {CodeObjects::Base}\n" +"* {#parse_files} for {CodeObjects::ExtraFileObject}" +msgstr "" + +# YARD::I18n::PotGenerator +#: ../lib/yard/i18n/pot_generator.rb:27 +msgid "" +"{#parse_objects} extracts msgids from docstring and tags of\n" +"{CodeObjects::Base} objects. The docstring of\n" +"{CodeObjects::Base} object is parsed and a paragraph is\n" +"extracted as a msgid. Tag name and tag text are extracted as\n" +"msgids from a tag." +msgstr "" + +# YARD::I18n::PotGenerator +#: ../lib/yard/i18n/pot_generator.rb:33 +msgid "" +"{#parse_files} extracts msgids from\n" +"{CodeObjects::ExtraFileObject} objects. The file content of\n" +"{CodeObjects::ExtraFileObject} object is parsed and a paragraph\n" +"is extracted as a msgid." +msgstr "" + +# YARD::I18n::PotGenerator +#: ../lib/yard/i18n/pot_generator.rb:40 +msgid "" +"To create a .pot file by +PotGenerator+, instantiate a\n" +"+PotGenerator+ with a relative working directory path from a\n" +"directory path that has created .pot file, parse\n" +"{CodeObjects::Base} objects and {CodeObjects::ExtraFileObject}\n" +"objects, generate a POT and write the generated POT to a .pot\n" +"file. The relative working directory path is \"..\" when the\n" +"working directory path is \".\" and the POT is wrote into\n" +"\"po/yard.pot\"." +msgstr "" + +# @see http://www.gnu.org/software/gettext/manual/html_node/PO-Files.html +#: ../lib/yard/i18n/pot_generator.rb:64 +msgid "GNU gettext manual about details of PO file" +msgstr "" + +# @example Generate a .pot file +#: ../lib/yard/i18n/pot_generator.rb:64 +msgid "" +"po_file_path = \"po/yard.pot\"\n" +"po_file_directory_pathname = Pathname.new(po_file_path).directory)\n" +"working_directory_pathname = Pathname.new(\".\")\n" +"relative_base_path = working_directory_pathname.relative_path_from" +"(po_file_directory_pathname).to_s\n" +"# relative_base_path -> \"..\"\n" +"generator = YARD::I18n::PotGenerator.new(relative_base_path)\n" +"generator.parse_objects(objects)\n" +"generator.parse_files(files)\n" +"pot = generator.generate\n" +"po_file_directory_pathname.mkpath\n" +"File.open(po_file_path, \"w\") do |pot_file|\n" +" pot_file.print(pot)\n" +"end" +msgstr "" + +# @example +#: ../lib/yard/i18n/pot_generator.rb:64 +msgid "tag|example|Generate a .pot file" +msgstr "tag|example|.popファイルを生成する" + +# @see +#: ../lib/yard/i18n/pot_generator.rb:64 +msgid "" +"tag|see|http://www.gnu.org/software/gettext/manual/html_node/PO-Files.html" +msgstr "" + +# YARD::I18n::PotGenerator#messages +#: ../lib/yard/i18n/pot_generator.rb:66 +msgid "Extracted messages." +msgstr "" + +# YARD::I18n::PotGenerator#initialize +#: ../lib/yard/i18n/pot_generator.rb:72 +msgid "" +"Creates a POT generator that uses +relative_base_path+ to\n" +"generate locations for a msgid. +relative_base_path+ is\n" +"prepended to all locations." +msgstr "" + +# @return [Router] +#: ../lib/yard/i18n/pot_generator.rb:78 +msgid "a new instance of PotGenerator" +msgstr "PotGeneratorの新しいインスタンス" + +# @param [String] relative_base_path +#: ../lib/yard/i18n/pot_generator.rb:78 +msgid "" +"a relative working\n" +"directory path from a directory path that has created .pot\n" +"file." +msgstr "" + +# @param [Boolean] +#: ../lib/yard/i18n/pot_generator.rb:78 +msgid "tag|param|relative_base_path" +msgstr "" + +# @param [Array] objects +#: ../lib/yard/i18n/pot_generator.rb:85 +msgid "" +"Parses {CodeObjects::Base} objects and stores extracted msgids\n" +"into {#messages}" +msgstr "" +"{CodeObjects::Base}オブジェクトを解析し、\n" +"{#messages}メソッドの中へ抽出されたmsgidを登録する" + +# @param [Array] objects +#: ../lib/yard/i18n/pot_generator.rb:90 +msgid "" +"a list of\n" +"{CodeObjects::Base} to be parsed." +msgstr "解析される {CodeObjects::Base} のリスト" + +# @deprecated +#: ../lib/yard/i18n/pot_generator.rb:97 +msgid "" +"Parses {CodeObjects::ExtraFileObject} objects and stores\n" +"extracted msgids into {#messages}." +msgstr "" +"{CodeObjects::ExtraFileObject} オブジェクトを解析し、\n" +"抽出されたmsgidを{#messages}の中へ登録する。" + +# @deprecated +#: ../lib/yard/i18n/pot_generator.rb:102 +msgid "" +"a list\n" +"of {CodeObjects::ExtraFileObject} objects to be parsed." +msgstr "解析される {CodeObjects::ExtraFileObject} オブジェクトのリスト" + +# YARD::I18n::PotGenerator#generate +#: ../lib/yard/i18n/pot_generator.rb:109 +msgid "Generates POT from +@messages+." +msgstr "" + +# YARD::I18n::PotGenerator#generate +#: ../lib/yard/i18n/pot_generator.rb:111 +msgid "" +"One PO file entry is generated from a +Message+ in\n" +"+@messages+." +msgstr "" + +# YARD::I18n::PotGenerator#generate +#: ../lib/yard/i18n/pot_generator.rb:114 +msgid "" +"Locations of the +Message+ are used to generate the reference\n" +"line that is started with \"#: \". +relative_base_path+ passed\n" +"when the generater is created is prepended to each path in location." +msgstr "" + +# YARD::I18n::PotGenerator#generate +#: ../lib/yard/i18n/pot_generator.rb:118 +msgid "" +"Comments of the +Message+ are used to generate the\n" +"translator-comment line that is started with \"# \"." +msgstr "" + +# @return [String] +#: ../lib/yard/i18n/pot_generator.rb:121 +msgid "POT format string" +msgstr "" + +# YARD::I18n::Text +#: ../lib/yard/i18n/text.rb:4 +msgid "Provides some convenient features for translating a text." +msgstr "" + +# YARD::I18n::Text#initialize +#: ../lib/yard/i18n/text.rb:6 +msgid "" +"Creates a text object that has translation related features for\n" +"the input text." +msgstr "" + +# @return [Text] +#: ../lib/yard/i18n/text.rb:11 +msgid "a new instance of Text" +msgstr "Textの新しいインスタンス" + +# @param [String] text +#: ../lib/yard/i18n/text.rb:11 +msgid "a text to be translated." +msgstr "翻訳されるテキスト" + +# @param [Fixnum, nil] +#: ../lib/yard/i18n/text.rb:11 +msgid "tag|param|input" +msgstr "" + +# YARD::I18n::Text#extract_messages +#: ../lib/yard/i18n/text.rb:17 +msgid "Extracts translation target messages from +@input+." +msgstr "" + +# @yieldparam [Array] +#: ../lib/yard/i18n/text.rb:34 +msgid "tag|yieldparam|line_no" +msgstr "" + +# @yieldparam [Tags::Tag] +#: ../lib/yard/i18n/text.rb:34 +msgid "tag|yieldparam|name" +msgstr "" + +# @yieldparam [Tags::Tag] +#: ../lib/yard/i18n/text.rb:34 +msgid "tag|yieldparam|start_line_no" +msgstr "" + +# @yieldparam [Tags::Tag] +#: ../lib/yard/i18n/text.rb:34 +msgid "tag|yieldparam|text" +msgstr "" + +# @yieldparam [Array] +#: ../lib/yard/i18n/text.rb:34 ../lib/yard/options.rb:142 +msgid "tag|yieldparam|value" +msgstr "" + +# @yield [:paragraph, text, start_line_no] +#: ../lib/yard/i18n/text.rb:34 +msgid "" +"the block that\n" +"receives extracted a paragraph in body. Paragraph is a text\n" +"block separated by one or more empty lines. Empty line is a\n" +"line that contains only zero or more whitespaces. It may\n" +"called many times." +msgstr "" + +# @yield [:attribute, name, value, line_no] +#: ../lib/yard/i18n/text.rb:34 +msgid "" +"the block that\n" +"receives extracted an attribute in header. It may called many\n" +"times." +msgstr "" + +# @return [Fixnum] +#: ../lib/yard/i18n/text.rb:34 +msgid "" +"the defined line number of extracted\n" +"attribute." +msgstr "抽出された属性の定義された行数" + +# @param [#to_s] key +#: ../lib/yard/i18n/text.rb:34 +msgid "the name of extracted attribute." +msgstr "抽出された属性の名前" + +# @return [Fixnum] +#: ../lib/yard/i18n/text.rb:34 +msgid "" +"the start line number of\n" +"extracted paragraph." +msgstr "抽出された段落の最初の行数" + +# @param [String] text +#: ../lib/yard/i18n/text.rb:34 +msgid "the text of extracted paragraph." +msgstr "抽出された段落のテキスト" + +# @param value +#: ../lib/yard/i18n/text.rb:34 +msgid "the value of extracted attribute." +msgstr "抽出された属性の値" + +# YARD::I18n::Text#translate +#: ../lib/yard/i18n/text.rb:49 +msgid "Translates into +locale+." +msgstr "" + +# @param [Object] +#: ../lib/yard/i18n/text.rb:52 +msgid "tag|param|locale" +msgstr "" + +# @return [String] +#: ../lib/yard/i18n/text.rb:52 +msgid "the translation target locale." +msgstr "翻訳目標の地域" + +# @return [String] +#: ../lib/yard/i18n/text.rb:52 +msgid "translated text." +msgstr "翻訳されたテキスト" + +# YARD::Logger +#: ../lib/yard/logging.rb:6 +msgid "" +"Handles console logging for info, warnings and errors.\n" +"Uses the stdlib Logger class in Ruby for all the backend logic." +msgstr "" +"コンソールがinfoや,警告や,エラー用にロギングし操作する。\n" +"全てのバックエンドの処理の為にRuby標準ライブラリのloggerクラスを使う。" + +# YARD::Logger::PROGRESS_INDICATORS +#: ../lib/yard/logging.rb:9 +msgid "" +"The list of characters displayed beside the progress bar to indicate\n" +"\"movement\"." +msgstr "" + +# @return [CodeObjects::Base] +#: ../lib/yard/logging.rb:15 +msgid "the IO object being logged to" +msgstr "IOオブジェクトに記録されるIOオブジェクト" + +# @return [Boolean] +#: ../lib/yard/logging.rb:19 +msgid "" +"whether backtraces should be shown (by default\n" +"this is on)." +msgstr "" + +# @param value +#: ../lib/yard/logging.rb:20 +msgid "the value to set the attribute show_backtraces to." +msgstr "show_backtraces属性を設定する値" + +# YARD::Logger#show_backtraces= +#: ../lib/yard/logging.rb:21 +msgid "Sets the attribute show_backtraces" +msgstr "show_backtraces属性を設定する" + +# @return [Boolean] +#: ../lib/yard/logging.rb:24 +msgid "" +"whether progress indicators should be shown when\n" +"logging CLIs (by default this is off)." +msgstr "" + +# @param value +#: ../lib/yard/logging.rb:30 +msgid "the value to set the attribute show_progress to." +msgstr "値にshow_progress属性を設定する為の値" + +# YARD::Logger#show_backtraces= +#: ../lib/yard/logging.rb:31 +msgid "Sets the attribute show_progress" +msgstr "show_progress属性を設定する" + +# YARD::Logger.instance +#: ../lib/yard/logging.rb:33 +msgid "The logger instance" +msgstr "loggerインスタンス" + +# @return [Logger] +#: ../lib/yard/logging.rb:34 +msgid "the logger instance" +msgstr "loggerインスタンス" + +# YARD::Logger#initialize +#: ../lib/yard/logging.rb:39 +msgid "Creates a new logger" +msgstr "新しいloggerを作成する" + +# @return [Logger] +#: ../lib/yard/logging.rb:39 +msgid "a new instance of Logger" +msgstr "Loggerの新しいインスタンス" + +# YARD::Logger#debug +#: ../lib/yard/logging.rb:51 +msgid "" +"Changes the debug level to DEBUG if $DEBUG is set\n" +"and writes a debugging message." +msgstr "" +"$DEBUGが設定された場合、debug levelをDEBUGに変更し、\n" +"デバッグメッセージを書き込む。" + +# YARD::Logger#capture +#: ../lib/yard/logging.rb:58 +msgid "" +"Captures the duration of a block of code for benchmark analysis. Also\n" +"calls {#progress} on the message to display it to the user." +msgstr "" + +# @todo +#: ../lib/yard/logging.rb:66 +msgid "Implement capture storage for reporting of benchmarks" +msgstr "" + +# @param [String] content +#: ../lib/yard/logging.rb:66 +msgid "a block of arbitrary code to benchmark" +msgstr "ベンチマークの為の任意のコードの入ったブロック" + +# @param [Symbol] +# @param [#to_s] +#: ../lib/yard/logging.rb:66 ../lib/yard/logging.rb:82 +#: ../lib/yard/logging.rb:117 +msgid "tag|param|msg" +msgstr "" + +# @param [TokenList, String] +# @param [String] +# @param [String, #read, Object] +#: ../lib/yard/logging.rb:66 ../lib/yard/logging.rb:82 +msgid "tag|param|nontty_log" +msgstr "" + +# @param [Symbol, nil] nontty_log +#: ../lib/yard/logging.rb:66 ../lib/yard/logging.rb:82 +msgid "" +"the level to log as if the output\n" +"stream is not a TTY. Use +nil+ for no alternate logging." +msgstr "" + +# @return [String] +#: ../lib/yard/logging.rb:66 ../lib/yard/logging.rb:117 +msgid "the message to display" +msgstr "表示するメッセージ" + +# YARD::Logger#progress +#: ../lib/yard/logging.rb:74 +msgid "" +"Displays a progress indicator for a given message. This progress report\n" +"is only displayed on TTY displays, otherwise the message is passed to\n" +"the +nontty_log+ level." +msgstr "" + +# @param [String, CodeObjects::ExtraFileObject] filename +# @param [String] filename +#: ../lib/yard/logging.rb:82 +msgid "the message to log" +msgstr "記録するメッセージ" + +# YARD::Logger#clear_progress +#: ../lib/yard/logging.rb:104 +msgid "Clears the progress indicator in the TTY display." +msgstr "" + +# YARD::Logger#puts +#: ../lib/yard/logging.rb:113 +msgid "" +"Displays an unformatted line to the logger output stream. Similar to\n" +"the +#<<+ method, but adds a newline." +msgstr "" + +# YARD::Logger#backtrace +#: ../lib/yard/logging.rb:122 +msgid "Prints the backtrace +exc+ to the logger as error data." +msgstr "+exc+ のバックトレースをエラーデータとしてloggerにプリントする。" + +# @param [Array] +#: ../lib/yard/logging.rb:126 +msgid "tag|param|exc" +msgstr "exc" + +# @param [Fixnum] +#: ../lib/yard/logging.rb:126 +msgid "tag|param|level_meth" +msgstr "" + +# @param [Array] exc +#: ../lib/yard/logging.rb:126 +msgid "the backtrace list" +msgstr "バックトレースのリスト" + +# @param [Array] exc +#: ../lib/yard/logging.rb:126 +msgid "the level to log backtrace at" +msgstr "バックトレースを記録する階層" + +# YARD::Logger#warn_no_continuations +#: ../lib/yard/logging.rb:134 +msgid "" +"Warns that the Ruby environment does not support continuations. Applies\n" +"to JRuby, Rubinius and MacRuby. This warning will only display once\n" +"per Ruby process." +msgstr "" +"Rubyの環境がcontinuationをサポートしない警告を出す。\n" +"JRuby,Rubinius,MacRubyに適用される。\n" +"この警告は、Rubyの処理毎に一度だけ表示されるだろう" + +# @deprecated +#: ../lib/yard/logging.rb:139 +msgid "Continuations are no longer needed by YARD 0.8.0+." +msgstr "" + +# YARD::Logger#enter_level +#: ../lib/yard/logging.rb:143 +msgid "Sets the logger level for the duration of the block" +msgstr "ブロックの継続するlogger levelを設定する。" + +# @example +#: ../lib/yard/logging.rb:151 +msgid "" +"log.enter_level(Logger::ERROR) do\n" +" YARD.parse_string \"def x; end\"\n" +"end" +msgstr "" + +# @param [Fixnum] +#: ../lib/yard/logging.rb:151 +msgid "tag|param|new_level" +msgstr "new_level" + +# @yield +#: ../lib/yard/logging.rb:151 +msgid "the block with the logger temporarily set to +new_level+" +msgstr "loggerが一時的に+new_level+を設定するブロック" + +# @param [Fixnum] new_level +#: ../lib/yard/logging.rb:151 +msgid "" +"the logger level for the duration of the block.\n" +"values can be found in Ruby's Logger class." +msgstr "" +"ブロックの継続するlogger level.\n" +"値はRuby loggerクラスで見つける事が出来る。" + +# YARD::Logger#format_log +#: ../lib/yard/logging.rb:160 +msgid "Log format (from Logger implementation). Used by Logger internally" +msgstr "ログ書式(loggerの実装から)。Loggerによって内部で利用される。" + +# YARD::Options +#: ../lib/yard/options.rb:3 +msgid "" +"Generalized options class for passing around large amounts of options " +"between objects." +msgstr "" + +# YARD::Options +#: ../lib/yard/options.rb:5 +msgid "" +"The options class exists for better visibility and documentability of " +"options being\n" +"passed through to other objects. Because YARD has parser and template " +"architectures\n" +"that are heavily reliant on options, it is necessary to make these option " +"keys easily\n" +"visible and understood by developers. Since the options class is more than " +"just a\n" +"basic Hash, the subclass can provide aliasing and convenience methods to " +"simplify\n" +"option property access, and, if needed, support backward-compatibility for " +"deprecated\n" +"key names." +msgstr "" + +# YARD::Options +#: ../lib/yard/options.rb:13 +msgid "== Hash and OpenStruct-like Access" +msgstr "" + +# YARD::Options +#: ../lib/yard/options.rb:15 +msgid "" +"Although the options class allows for Hash-like access (opts[:key]), the recommended\n" +"mechanism for accessing an option key will be via standard method calls on " +"attributes" +msgstr "" + +# YARD::Options +#: ../lib/yard/options.rb:18 +msgid "" +"The options class can also act as an open ended key value storage structure " +"(like a\n" +"Hash or OpenStruct), and allows for setting and getting of unregistered " +"option keys.\n" +"This methodology is not recommended, however, and is only supported for " +"backward\n" +"compatibility inside YARD. Whenever possible, developers should define all " +"keys used\n" +"by an options class." +msgstr "" + +# YARD::Options +#: ../lib/yard/options.rb:24 +msgid "== Declaring Default Values" +msgstr "" + +# YARD::Options +#: ../lib/yard/options.rb:26 +msgid "" +"Note that the options class can contain default value definitions for " +"certain options,\n" +"but to initialize these defaults, {#reset_defaults} must be called manually " +"after\n" +"initialization; the options object is always created empty until defaults " +"are applied." +msgstr "" + +# @abstract +#: ../lib/yard/options.rb:68 +msgid "" +"Subclasses should define (and document) custom attributes that are expected\n" +"to be made available as option keys." +msgstr "" + +# @example Deprecating an option while still supporting it +#: ../lib/yard/options.rb:68 +msgid "" +"class TemplateOptions < YARD::Options\n" +" # @return [Boolean] if syntax highlighting should be performed on code " +"blocks.\n" +" # Defaults to true.\n" +" attr_accessor :highlight\n" +"\n" +" # @deprecated Use {#highlight} instead.\n" +" # @return [Boolean] if no syntax highlighting should be performs on code " +"blocks.\n" +" # Defaults to false.\n" +" attr_accessor :no_highlight\n" +" def no_highlight=(value) @highlight = !value end\n" +" def no_highlight; !highlight end\n" +"end" +msgstr "" + +# @example Defining an Options class with custom option keys +#: ../lib/yard/options.rb:68 +msgid "" +"class TemplateOptions < YARD::Options\n" +" # @return [Symbol] the output format to generate templates in\n" +" attr_accessor :format\n" +"\n" +" # @return [Symbol] the template to use when generating output\n" +" attr_accessor :template\n" +"end" +msgstr "" + +# @example Initializing default option values +#: ../lib/yard/options.rb:68 +msgid "" +"class TemplateOptions < YARD::Options\n" +" def reset_defaults\n" +" super\n" +" self.format = :html\n" +" self.template = :default\n" +" self.highlight = true\n" +" # ...\n" +" end\n" +"end" +msgstr "" + +# @example Using +default_attr+ to create default attributes +#: ../lib/yard/options.rb:68 +msgid "" +"class TemplateOptions < YARD::Options\n" +" default_attr :format, :html\n" +" default_attr :template, :default\n" +" default_attr :highlight, true\n" +"end" +msgstr "" + +# @example +#: ../lib/yard/options.rb:68 +msgid "tag|example|Defining an Options class with custom option keys" +msgstr "カスタムオプションのkeyを用いたオプションクラス定義" + +# @example +#: ../lib/yard/options.rb:68 +msgid "tag|example|Deprecating an option while still supporting it" +msgstr "まだサポートしているけれど廃止するオプション" + +# @example +#: ../lib/yard/options.rb:68 +msgid "tag|example|Initializing default option values" +msgstr "tag|example|初期化されたデフォルトのオプション値" + +# @example +#: ../lib/yard/options.rb:68 +msgid "tag|example|Using +default_attr+ to create default attributes" +msgstr "tag|example|デフォルト属性を作成するための +default_attr+ を用いる" + +# YARD::Options.default_attr +#: ../lib/yard/options.rb:70 +msgid "Defines an attribute named +key+ and sets a default value for it" +msgstr "" + +# @example Defining a default option key +#: ../lib/yard/options.rb:79 +msgid "" +"default_attr :name, 'Default Name'\n" +"default_attr :time, lambda { Time.now }" +msgstr "" + +# @example +#: ../lib/yard/options.rb:79 +msgid "tag|example|Defining a default option key" +msgstr "tag|example|デフォルトのオプションキーの定義" + +# @param [Object] +#: ../lib/yard/options.rb:79 +msgid "tag|param|default" +msgstr "" + +# @param [Object, Proc] default +#: ../lib/yard/options.rb:79 +msgid "" +"the default object value. If the default\n" +"value is a proc, it is executed upon initialization." +msgstr "" + +# @param [String, Symbol] section +#: ../lib/yard/options.rb:79 +msgid "the option key name" +msgstr "オプションキー名" + +# YARD::Options#[] +#: ../lib/yard/options.rb:85 +msgid "Delegates calls with Hash syntax to actual method with key name" +msgstr "" + +# @example Calling on an option key with Hash syntax +#: ../lib/yard/options.rb:90 +msgid "options[:format] # equivalent to: options.format" +msgstr "" + +# @example +#: ../lib/yard/options.rb:90 +msgid "tag|example|Calling on an option key with Hash syntax" +msgstr "tag|example|ハッシュ構文を用いたオプションキーを呼び出す" + +# @param [Hash] opts +#: ../lib/yard/options.rb:90 +msgid "the option name to access" +msgstr "アクセスするためのオプション名" + +# @param value +#: ../lib/yard/options.rb:90 +msgid "the value of the option named +key+" +msgstr "+key+ と名付けられたオプションの値" + +# YARD::Options#[]= +#: ../lib/yard/options.rb:93 +msgid "" +"Delegates setter calls with Hash syntax to the attribute setter with the key " +"name" +msgstr "" + +# @example Setting an option with Hash syntax +#: ../lib/yard/options.rb:99 +msgid "options[:format] = :html # equivalent to: options.format = :html" +msgstr "" + +# @example +#: ../lib/yard/options.rb:99 +msgid "tag|example|Setting an option with Hash syntax" +msgstr "tag|example|ハッシュ構文を用いたオプションの設定" + +# @param [Hash] options +#: ../lib/yard/options.rb:99 +msgid "the optin to set" +msgstr "設定するためのオプション" + +# @param [Object] value +# @param [Object] val +#: ../lib/yard/options.rb:99 +msgid "the value being set" +msgstr "設定される値" + +# @param [String] title +#: ../lib/yard/options.rb:99 +msgid "the value to set for the option" +msgstr "オプション用に設定するための値" + +# YARD::Options#update +#: ../lib/yard/options.rb:102 +msgid "" +"Updates values from an options hash or options object on this object.\n" +"All keys passed should be key names defined by attributes on the class." +msgstr "" + +# @example Updating a set of options on an Options object +#: ../lib/yard/options.rb:108 +msgid "opts.update(:template => :guide, :type => :fulldoc)" +msgstr "" + +# @example +#: ../lib/yard/options.rb:108 +msgid "tag|example|Updating a set of options on an Options object" +msgstr "tag|example|オプションオブジェクトでオプションのグループの更新" + +# YARD::Options#merge +#: ../lib/yard/options.rb:117 +msgid "" +"Creates a new options object and sets options hash or object value\n" +"onto that object." +msgstr "" + +# @see +#: ../lib/yard/options.rb:122 +msgid "tag|see|#update" +msgstr "" + +# @return [Base] +# @return [MacroObject] +#: ../lib/yard/options.rb:122 +msgid "the newly created options object" +msgstr "新たに作成されたオプションオブジェクト" + +# @return [Hash] +#: ../lib/yard/options.rb:128 +msgid "" +"Converts options object to an options hash. All keys\n" +"will be symbolized." +msgstr "" + +# YARD::Options#each +#: ../lib/yard/options.rb:138 +msgid "Yields over every option key and value" +msgstr "" + +# @yield [key, value] +#: ../lib/yard/options.rb:142 +msgid "every option key and value" +msgstr "" + +# @yieldparam [Base] +#: ../lib/yard/options.rb:142 +msgid "tag|yieldparam|key" +msgstr "" + +# @param [Hash] options +#: ../lib/yard/options.rb:142 +msgid "the option key" +msgstr "オプションのキー" + +# @param [Hash] options +#: ../lib/yard/options.rb:142 +msgid "the option value" +msgstr "オプションの値" + +# @return [String] +#: ../lib/yard/options.rb:150 +msgid "Inspects the object" +msgstr "オブジェクトを解析する" + +# @return [Boolean] +#: ../lib/yard/options.rb:156 +msgid "" +"whether another Options object equals the\n" +"keys and values of this options object" +msgstr "" + +# YARD::Options#method_missing +#: ../lib/yard/options.rb:165 +msgid "" +"Handles setting and accessing of unregistered keys similar\n" +"to an OpenStruct object." +msgstr "" + +# @note +#: ../lib/yard/options.rb:169 +msgid "" +"It is not recommended to set and access unregistered keys on\n" +"an Options object. Instead, register the attribute before using it." +msgstr "" + +# YARD::Tags::DefaultTag#defaults +#: ../lib/yard/options.rb:182 +msgid "Resets all values to their defaults." +msgstr "それらのデフォルトの全ての値をリセットする" + +# @abstract +#: ../lib/yard/options.rb:187 +msgid "" +"Subclasses should override this method to perform custom\n" +"value initialization if not using {default_attr}. Be sure to call\n" +"+super+ so that default initialization can take place." +msgstr "" + +# YARD::Options#delete +#: ../lib/yard/options.rb:201 +msgid "Deletes an option value for +key+" +msgstr "" + +# @param [#to_sym] key +#: ../lib/yard/options.rb:204 +msgid "the key to delete a value for" +msgstr "キー用に値を削除する為のキー" + +# @param [String] data +#: ../lib/yard/options.rb:204 +msgid "the value that was deleted" +msgstr "削除された値" + +# YARD::Parser::Base +#: ../lib/yard/parser/base.rb:4 +msgid "" +"Represents the abstract base parser class that parses source code in\n" +"a specific way. A parser should implement {#parse}, {#tokenize} and\n" +"{#enumerator}." +msgstr "" +"独自の方法でソースコードを解析する抽象的なベースパーサークラスを表す。\n" +"パーサーは{#parse}や,{#tokenize}や{#enumerator}メソッドを実装しなくてはならな" +"い。" + +# YARD::Parser::Base +#: ../lib/yard/parser/base.rb:8 +msgid "" +"== Registering a Custom Parser\n" +"To register a parser, see {SourceParser.register_parser_type}" +msgstr "" +"== カスタムパーサーを記録する\n" +"パーサーを記録する為には、{SourceParser.register_parser_type}を参照。" + +# @see +#: ../lib/yard/parser/base.rb:15 +msgid "tag|see|#enumerator" +msgstr "" + +# @see +#: ../lib/yard/parser/base.rb:15 +msgid "tag|see|#parse" +msgstr "" + +# @see +#: ../lib/yard/parser/base.rb:15 +msgid "tag|see|#tokenize" +msgstr "" + +# YARD::Parser::Base.parse +#: ../lib/yard/parser/base.rb:17 +msgid "Convenience method to create a new parser and {#parse}" +msgstr "新しいパーサーや(#parse)メソッドを作成する為の便利なメソッド" + +# YARD::Parser::Base#initialize +#: ../lib/yard/parser/base.rb:22 +msgid "" +"This default constructor does nothing. The subclass is responsible for\n" +"storing the source contents and filename if they are required." +msgstr "" +"このデフォルトのコンストラクターは何もしない。\n" +"サブクラスがソースの内容やファイル名が必要とされる場合、それらを記憶する責任" +"がある。" + +# @param [String] filename +#: ../lib/yard/parser/base.rb:25 +msgid "the name of the file if from disk" +msgstr "ディスクからの場合、ファイルの名前" + +# @param [String] source +#: ../lib/yard/parser/base.rb:25 +msgid "the source contents" +msgstr "ソースの内容" + +# YARD::Parser::Base#parse +#: ../lib/yard/parser/base.rb:30 +msgid "" +"This method should be implemented to parse the source and return itself." +msgstr "" +"このメソッドはソースの解析やそれ自身を返す為に\n" +"実装されなくてはならない。" + +# @return [Base] +#: ../lib/yard/parser/base.rb:32 +msgid "this method should return itself" +msgstr "このメソッドはそれ自身を返さなくてはならない。" + +# YARD::Parser::Base#tokenize +#: ../lib/yard/parser/base.rb:37 +msgid "This method should be implemented to tokenize given source" +msgstr "" +"このメソッドは与えられたソースを\n" +"トークナイズする為に実装されなければならない。" + +# @return [Array] +#: ../lib/yard/parser/base.rb:39 +msgid "a list/tree of lexical tokens" +msgstr "単語のトークンの入ったリストやツリー" + +# YARD::Parser::Base#enumerator +#: ../lib/yard/parser/base.rb:44 +msgid "" +"This method should be implemented to return a list of semantic tokens\n" +"representing the source code to be post-processed. Otherwise the method\n" +"should return nil." +msgstr "" +"後処理される為にソースコードを表している意味のあるトークンのリストを返す為" +"に\n" +"このメソッドは実装されなければならない。\n" +"そうでなければこのメソッドは、nilを返さなければならない。" + +# @return [Array] +#: ../lib/yard/parser/base.rb:51 +msgid "" +"a list of semantic tokens representing the source code\n" +"to be post-processed" +msgstr "後処理される為のソースコードを表す意味のあるトークンのリスト" + +# @return [nil] +#: ../lib/yard/parser/base.rb:51 +msgid "if no post-processing should be done" +msgstr "後処理がない場合、nilを返さなければならない。" + +# @return [CParser] +#: ../lib/yard/parser/c/c_parser.rb:5 +msgid "a new instance of CParser" +msgstr "Cパーサーの新しいインスタンス" + +# @param value +#: ../lib/yard/parser/c/statement.rb:5 ../lib/yard/parser/ruby/ast_node.rb:42 +msgid "the value to set the attribute source to." +msgstr "ソースの属性を設定する,値" + +# YARD::Parser::Ruby::AstNode#to_s +#: ../lib/yard/parser/c/statement.rb:6 ../lib/yard/parser/ruby/ast_node.rb:53 +msgid "Returns the value of attribute source" +msgstr "source属性の入った値を返す。" + +# YARD::Parser::Ruby::AstNode#source= +#: ../lib/yard/parser/c/statement.rb:6 ../lib/yard/parser/ruby/ast_node.rb:43 +msgid "Sets the attribute source" +msgstr "ソース属性を設定する。" + +# @param value +#: ../lib/yard/parser/c/statement.rb:6 +msgid "the value to set the attribute line to." +msgstr "値に行属性を設定するための値" + +# YARD::Parser::Ruby::Legacy::RubyLex::BufferedReader#line_num +#: ../lib/yard/parser/c/statement.rb:7 +msgid "Returns the value of attribute line" +msgstr "行属性の値を返す" + +# YARD::CodeObjects::ExtraFileObject#name= +# YARD::Tags::RefTagList#name= +# YARD::Templates::Section#name= +#: ../lib/yard/parser/c/statement.rb:7 +msgid "Sets the attribute line" +msgstr "行属性を設定" + +# @param value +#: ../lib/yard/parser/c/statement.rb:7 ../lib/yard/parser/ruby/ast_node.rb:48 +msgid "the value to set the attribute file to." +msgstr "ファイル属性を設定する,値" + +# YARD::Parser::Ruby::RipperParser#file +# YARD::RegistryStore#file +#: ../lib/yard/parser/c/statement.rb:8 +#: ../lib/yard/parser/ruby/ruby_parser.rb:26 ../lib/yard/registry_store.rb:12 +msgid "Returns the value of attribute file" +msgstr "file属性の値を返す。" + +# YARD::Parser::Ruby::AstNode#file= +#: ../lib/yard/parser/c/statement.rb:8 ../lib/yard/parser/ruby/ast_node.rb:49 +msgid "Sets the attribute file" +msgstr "ファイル属性を設定する。" + +# @deprecated +#: ../lib/yard/parser/c/statement.rb:11 ../lib/yard/parser/ruby/ast_node.rb:46 +#: ../lib/yard/parser/ruby/legacy/statement.rb:9 +msgid "Groups are now defined by directives" +msgstr "" + +# @see +#: ../lib/yard/parser/c/statement.rb:11 ../lib/yard/parser/ruby/ast_node.rb:46 +#: ../lib/yard/parser/ruby/legacy/statement.rb:9 +msgid "tag|see|Tags::GroupDirective" +msgstr "" + +# @param value +#: ../lib/yard/parser/c/statement.rb:13 +#: ../lib/yard/parser/ruby/legacy/statement.rb:11 +msgid "the value to set the attribute comments_hash_flag to." +msgstr "comments_hash_flag属性を設定する。" + +# YARD::Parser::Ruby::Legacy::Statement#comments_hash_flag +#: ../lib/yard/parser/c/statement.rb:14 +#: ../lib/yard/parser/ruby/legacy/statement.rb:12 +msgid "Returns the value of attribute comments_hash_flag" +msgstr "comments_hash_flag属性を返す。" + +# YARD::Parser::Ruby::Legacy::Statement#comments_hash_flag= +#: ../lib/yard/parser/c/statement.rb:14 +#: ../lib/yard/parser/ruby/legacy/statement.rb:12 +msgid "Sets the attribute comments_hash_flag" +msgstr "comments_hash_flag属性を設定する。" + +# @return [Statement] +#: ../lib/yard/parser/c/statement.rb:15 +#: ../lib/yard/parser/ruby/legacy/statement.rb:13 +msgid "a new instance of Statement" +msgstr "ステートメントの新しいインスタンス" + +# @param value +#: ../lib/yard/parser/c/statement.rb:39 ../lib/yard/parser/c/statement.rb:45 +msgid "the value to set the attribute comments to." +msgstr "値にコメント属性を設定するための値" + +# YARD::Parser::Ruby::Legacy::Statement#comments +# YARD::Parser::Ruby::RipperParser#comments +#: ../lib/yard/parser/c/statement.rb:40 ../lib/yard/parser/c/statement.rb:46 +#: ../lib/yard/parser/ruby/legacy/statement.rb:5 +#: ../lib/yard/parser/ruby/ruby_parser.rb:26 +msgid "Returns the value of attribute comments" +msgstr "コメント属性の値を返す。" + +# YARD::CodeObjects::NamespaceObject#meths= +#: ../lib/yard/parser/c/statement.rb:40 ../lib/yard/parser/c/statement.rb:46 +msgid "Sets the attribute comments" +msgstr "コメント属性を設定する" + +# @param value +#: ../lib/yard/parser/c/statement.rb:43 +msgid "the value to set the attribute block to." +msgstr "値にblock属性を設定するための値" + +# YARD::Parser::Ruby::Legacy::Statement#block +#: ../lib/yard/parser/c/statement.rb:44 +#: ../lib/yard/parser/ruby/legacy/statement.rb:5 +msgid "Returns the value of attribute block" +msgstr "ブロック属性の値を返す。" + +# YARD::Parser::Ruby::AstNode#source= +#: ../lib/yard/parser/c/statement.rb:44 +msgid "Sets the attribute block" +msgstr "block属性を設定する。" + +# @param value +#: ../lib/yard/parser/c/statement.rb:44 +msgid "the value to set the attribute declaration to." +msgstr "値に宣言属性を設定するための値" + +# YARD::Templates::Template#section +#: ../lib/yard/parser/c/statement.rb:45 +msgid "Returns the value of attribute declaration" +msgstr "宣言属性の値を返す" + +# YARD::Templates::Template#section= +#: ../lib/yard/parser/c/statement.rb:45 +msgid "Sets the attribute declaration" +msgstr "宣言属性を設定する" + +# @param value +#: ../lib/yard/parser/c/statement.rb:51 +msgid "the value to set the attribute type to." +msgstr "値に型属性を設定するための値" + +# YARD::Parser::Ruby::Legacy::RubyToken::TkOPASGN#op +#: ../lib/yard/parser/c/statement.rb:52 +msgid "Returns the value of attribute type" +msgstr "型属性の値を返す" + +# YARD::CodeObjects::ExtraFileObject#name= +# YARD::Tags::RefTagList#name= +# YARD::Templates::Section#name= +#: ../lib/yard/parser/c/statement.rb:52 +msgid "Sets the attribute type" +msgstr "型属性を設定する" + +# @param value +#: ../lib/yard/parser/c/statement.rb:52 +msgid "the value to set the attribute overrides to." +msgstr "値にオーバーライド属性を設定するための値" + +# YARD::Parser::Ruby::Legacy::RubyToken::TkNode#node +#: ../lib/yard/parser/c/statement.rb:53 +msgid "Returns the value of attribute overrides" +msgstr "オーバーライド属性の値を返す" + +# YARD::Tags::RefTag#owner= +# YARD::Tags::RefTagList#owner= +#: ../lib/yard/parser/c/statement.rb:53 +msgid "Sets the attribute overrides" +msgstr "オーバーライド属性を設定する" + +# @param value +#: ../lib/yard/parser/c/statement.rb:53 +msgid "the value to set the attribute statement to." +msgstr "値にステートメント属性を設定するための値" + +# YARD::CodeObjects::ExtraFileObject#name +# YARD::CodeObjects::ExtraFileObject#path +# YARD::Parser::Ruby::Legacy::RubyToken::TkId#name +# YARD::Parser::Ruby::Legacy::RubyToken::TkUnknownChar#name +# YARD::Tags::RefTagList#name +# YARD::Templates::Section#name +#: ../lib/yard/parser/c/statement.rb:54 +msgid "Returns the value of attribute statement" +msgstr "ステートメント属性の値を返す" + +# YARD::CodeObjects::ExtraFileObject#name= +# YARD::Tags::RefTagList#name= +# YARD::Templates::Section#name= +#: ../lib/yard/parser/c/statement.rb:54 +msgid "Sets the attribute statement" +msgstr "ステートメント属性を設定する" + +# @return [Token] +#: ../lib/yard/parser/c/statement.rb:55 +msgid "a new instance of Comment" +msgstr "コメントの新しいインスタンス" + +# YARD::Parser::Ruby#s +#: ../lib/yard/parser/ruby/ast_node.rb:5 +msgid "" +"Builds and s-expression by creating {AstNode} objects with\n" +"the type provided by the first argument." +msgstr "" +"最初の引数によって提供された型を用い{AstNode}オブジェクトを作成する事によって\n" +"ビルドされS式にされる。" + +# @example An implicit list of keywords +#: ../lib/yard/parser/ruby/ast_node.rb:24 +msgid "" +"ast = s(s(:kw, \"if\"), s(:kw, \"else\"))\n" +"ast.type # => :list" +msgstr "" + +# @example A method call +#: ../lib/yard/parser/ruby/ast_node.rb:24 +msgid "s(:command, s(:var_ref, \"mymethod\"))" +msgstr "" + +# @example +#: ../lib/yard/parser/ruby/ast_node.rb:24 +msgid "tag|example|A method call" +msgstr "メソッド呼び出し" + +# @example +#: ../lib/yard/parser/ruby/ast_node.rb:24 +msgid "tag|example|An implicit list of keywords" +msgstr "キーワードの暗黙のリスト" + +# @overload +#: ../lib/yard/parser/ruby/ast_node.rb:24 +msgid "tag|overload|s" +msgstr "" + +# @see +#: ../lib/yard/parser/ruby/ast_node.rb:24 +msgid "tag|see|AstNode#initialize" +msgstr "" + +# YARD::Parser::Ruby::AstNode +#: ../lib/yard/parser/ruby/ast_node.rb:31 +msgid "" +"An AST node is characterized by a type and a list of children. It\n" +"is most easily represented by the s-expression {#s} such as:\n" +" # AST for \"if true; 5 end\":\n" +" s(s(:if, s(:var_ref, s(:kw, \"true\")), s(s(:int, \"5\")), nil))" +msgstr "" +"ASTノードは型や子のリストによって特徴付けられる。\n" +"それは最も簡単にS式 {#s}メソッドによって表される。\n" +"以下の通り。\n" +" # AST for \"if true; 5 end\":\n" +" s(s(:if, s(:var_ref, s(:kw, \"true\")), s(s(:int, \"5\")), nil))" + +# YARD::Parser::Ruby::AstNode +#: ../lib/yard/parser/ruby/ast_node.rb:36 +msgid "" +"The node type is not considered part of the list, only its children.\n" +"So +ast[0]+ does not refer to the type, but rather the first child\n" +"(or object). Items that are not +AstNode+ objects can be part of the\n" +"list, like Strings or Symbols representing names. To return only\n" +"the AstNode children of the node, use {#children}." +msgstr "" +"ノードの型は、リストの一部とは考えられていない。\n" +"その為,そのリストは子だけとなる。\n" +"そして +ast[0]+ は型を参照しない、\n" +"しかし、最初の子(やオブジェクト)が選ばれる。\n" +"+AstNode+ オブジェクトではない事項は、リストの一部にでき、\n" +"文字列やシンボルのように、名前を表現している。\n" +"ノードからAstNodeの子だけ返すには、{#children}メソッドを使用する。" + +# @param value +#: ../lib/yard/parser/ruby/ast_node.rb:41 +msgid "the value to set the attribute docstring_hash_flag to." +msgstr "docstring_hash_flag属性を設定する,値" + +# YARD::Parser::Ruby::AstNode#docstring_hash_flag +# YARD::Parser::Ruby::AstNode#comments_hash_flag +#: ../lib/yard/parser/ruby/ast_node.rb:42 +#: ../lib/yard/parser/ruby/ast_node.rb:52 +msgid "Returns the value of attribute docstring_hash_flag" +msgstr "docstring_hash_flag属性の値を返す。" + +# YARD::Parser::Ruby::AstNode#docstring_hash_flag= +#: ../lib/yard/parser/ruby/ast_node.rb:42 +msgid "Sets the attribute docstring_hash_flag" +msgstr "docstring_hash_flag属性を設定する。" + +# @return [String] +#: ../lib/yard/parser/ruby/ast_node.rb:42 +#: ../lib/yard/parser/ruby/ast_node.rb:88 +msgid "the parse of {#full_source} that the node represents" +msgstr "ノードを表す{#full_source}の入った,parse" + +# @param value +#: ../lib/yard/parser/ruby/ast_node.rb:42 +msgid "the value to set the attribute docstring to." +msgstr "docstring属性を設定する,値" + +# @param value +#: ../lib/yard/parser/ruby/ast_node.rb:42 +msgid "the value to set the attribute docstring_range to." +msgstr "docstring_range属性を設定する,値" + +# YARD::Parser::Ruby::AstNode#docstring +# YARD::Parser::Ruby::AstNode#comments +# YARD::Tags::OverloadTag#docstring +#: ../lib/yard/parser/ruby/ast_node.rb:43 +#: ../lib/yard/parser/ruby/ast_node.rb:50 ../lib/yard/tags/overload_tag.rb:5 +msgid "Returns the value of attribute docstring" +msgstr "docstring属性の入った値を返す。" + +# YARD::Parser::Ruby::AstNode#docstring_range +# YARD::Parser::Ruby::AstNode#comments_range +#: ../lib/yard/parser/ruby/ast_node.rb:43 +#: ../lib/yard/parser/ruby/ast_node.rb:51 +msgid "Returns the value of attribute docstring_range" +msgstr "docstring_range属性の入った値を返す。" + +# YARD::Parser::Ruby::AstNode#docstring= +#: ../lib/yard/parser/ruby/ast_node.rb:43 +msgid "Sets the attribute docstring" +msgstr "docstring属性を設定する。" + +# YARD::Parser::Ruby::AstNode#docstring_range= +#: ../lib/yard/parser/ruby/ast_node.rb:43 +msgid "Sets the attribute docstring_range" +msgstr "docstring_range属性を設定する。" + +# @param value +#: ../lib/yard/parser/ruby/ast_node.rb:48 +msgid "the value to set the attribute full_source to." +msgstr "full_source属性を設定する,値" + +# @param value +#: ../lib/yard/parser/ruby/ast_node.rb:48 +msgid "the value to set the attribute line_range to." +msgstr "line_range属性を設定する,値" + +# @param value +#: ../lib/yard/parser/ruby/ast_node.rb:48 +msgid "the value to set the attribute source_range to." +msgstr "source_range属性を設定する,値" + +# YARD::Parser::Ruby::AstNode#full_source= +#: ../lib/yard/parser/ruby/ast_node.rb:49 +msgid "Sets the attribute full_source" +msgstr "full_source属性を設定する。" + +# YARD::Parser::Ruby::AstNode#line_range= +#: ../lib/yard/parser/ruby/ast_node.rb:49 +msgid "Sets the attribute line_range" +msgstr "line_range属性を設定する。" + +# YARD::Parser::Ruby::AstNode#source_range= +#: ../lib/yard/parser/ruby/ast_node.rb:49 +msgid "Sets the attribute source_range" +msgstr "source_range属性を設定する。" + +# @return [Symbol] +#: ../lib/yard/parser/ruby/ast_node.rb:55 +msgid "the node's unique symbolic type" +msgstr "独自のsymbolic型のノード群。" + +# @return [AstNode, nil] +#: ../lib/yard/parser/ruby/ast_node.rb:58 +msgid "the node's parent or nil if it is a root node." +msgstr "親ノード群(ルートノードの場合,nilとなる。)" + +# @return [Range] +#: ../lib/yard/parser/ruby/ast_node.rb:62 +msgid "" +"the character range in {#full_source} represented\n" +"by the node" +msgstr "ノードによって表される{#full_source}メソッドの中の固有の範囲。" + +# @return [Range] +#: ../lib/yard/parser/ruby/ast_node.rb:69 +msgid "" +"the line range in {#full_source} represented\n" +"by the node" +msgstr "ノードによって表される{#full_source}メソッドの中の行の範囲。" + +# @return [String] +#: ../lib/yard/parser/ruby/ast_node.rb:75 +msgid "the filename the node was parsed from" +msgstr "ノードを解析した,ファイル名" + +# @return [String] +#: ../lib/yard/parser/ruby/ast_node.rb:81 +msgid "the full source that the node was parsed from" +msgstr "ノードから解析されたソースの全て。" + +# YARD::Parser::Ruby::AstNode::KEYWORDS +#: ../lib/yard/parser/ruby/ast_node.rb:94 +msgid "List of all known keywords" +msgstr "著名なキーワードのリスト。" + +# YARD::Parser::Ruby::AstNode.node_class_for +#: ../lib/yard/parser/ruby/ast_node.rb:106 +msgid "" +"Finds the node subclass that should be instantiated for a specific\n" +"node type" +msgstr "" +"特定のノード型用の\n" +"インスタンス化されるべきサブクラスのノードを見つける。" + +# YARD::Parser::Ruby::AstNode.node_class_for +# YARD::Parser::Ruby::AstNode#initialize +# YARD::Parser::Ruby::AstNode#== +#: ../lib/yard/parser/ruby/ast_node.rb:110 +#: ../lib/yard/parser/ruby/ast_node.rb:152 +#: ../lib/yard/parser/ruby/ast_node.rb:165 +msgid "Creating an AstNode" +msgstr "AstNodeを作成する。" + +# @return [Class] +#: ../lib/yard/parser/ruby/ast_node.rb:110 +msgid "a subclass of AstNode to instantiate the node with." +msgstr "nodeをインスタンス化するAstNodeのサブクラス" + +# @param [Symbol] type +#: ../lib/yard/parser/ruby/ast_node.rb:110 +msgid "the node type to find a subclass for" +msgstr "ノードの型用のサブクラスを見つける,型" + +# YARD::Parser::Ruby::AstNode#initialize +#: ../lib/yard/parser/ruby/ast_node.rb:140 +msgid "Creates a new AST node" +msgstr "新しいASTノードを作成する。" + +# @return [AstNode] +#: ../lib/yard/parser/ruby/ast_node.rb:152 +msgid "a new instance of AstNode" +msgstr "AstNodeの新しいインスタンス" + +# @param [Hash] opts +#: ../lib/yard/parser/ruby/ast_node.rb:152 +msgid "any extra line options" +msgstr "行の為の追加の設定" + +# @param [Array] +#: ../lib/yard/parser/ruby/ast_node.rb:152 +msgid "tag|param|arr" +msgstr "" + +# @param [Array] arr +#: ../lib/yard/parser/ruby/ast_node.rb:152 +msgid "the child nodes" +msgstr "子のノード" + +# @param [Symbol] type +#: ../lib/yard/parser/ruby/ast_node.rb:152 +msgid "the type of node being created" +msgstr "作成されるノードのタイプ" + +# @return [Boolean] +#: ../lib/yard/parser/ruby/ast_node.rb:165 +msgid "" +"whether the node is equal to another by checking\n" +"the list and type" +msgstr "ノードがリストか型かチェックすることによって他と等しくなるかどうか" + +# YARD::Parser::Ruby::AstNode#jump +#: ../lib/yard/parser/ruby/ast_node.rb:172 +msgid "" +"Searches through the node and all descendants and returns the\n" +"first node with a type matching any of +node_types+, otherwise\n" +"returns the original node (self)." +msgstr "" +"ノードや,全ての子孫の中を検索する。\n" +"+node_types+ の入った型マッチと共に\n" +"最初のノードを返す。\n" +"さもなければ、(自身の)オリジナルノードを返す。" + +# YARD::Parser::Ruby::AstNode#jump +# YARD::Parser::Ruby::AstNode#children +# YARD::Parser::Ruby::AstNode#traverse +#: ../lib/yard/parser/ruby/ast_node.rb:191 +#: ../lib/yard/parser/ruby/ast_node.rb:197 +#: ../lib/yard/parser/ruby/ast_node.rb:206 +msgid "Traversing a Node" +msgstr "ノードを辿る。" + +# @param [Array] node_types +#: ../lib/yard/parser/ruby/ast_node.rb:191 +msgid "a set of node types to match" +msgstr "マッチするノードの型の設定。" + +# @example If the node types are not present in the AST +#: ../lib/yard/parser/ruby/ast_node.rb:191 +msgid "" +"ast = YARD.parse(\"def x; end\")\n" +"ast.jump(:def)" +msgstr "" + +# @example Returns first 'def' or 'class' statement +#: ../lib/yard/parser/ruby/ast_node.rb:191 +msgid "" +"ast = YARD.parse_string(\"class X; def y; end end\")\n" +"ast.jump(:def, :class).first\n" +"# =>" +msgstr "" + +# @example Returns the first method definition in a block of code +#: ../lib/yard/parser/ruby/ast_node.rb:191 +msgid "" +"ast = YARD.parse_string(\"if true; def x; end end\").ast\n" +"ast.jump(:def)\n" +"# => s(:def, s(:ident, \"x\"), s(:params, nil, nil, nil, nil,\n" +"# nil), s(s(:void_stmt, )))" +msgstr "" + +# @return [self] +#: ../lib/yard/parser/ruby/ast_node.rb:191 +msgid "if no node was found" +msgstr "ノードが見つからなかった場合" + +# @example +#: ../lib/yard/parser/ruby/ast_node.rb:191 +msgid "tag|example|If the node types are not present in the AST" +msgstr "ノードの型がASTの中に渡さない場合" + +# @example +#: ../lib/yard/parser/ruby/ast_node.rb:191 +msgid "tag|example|Returns first 'def' or 'class' statement" +msgstr "最初の'def'や'class'ステートメントを返す。" + +# @example +#: ../lib/yard/parser/ruby/ast_node.rb:191 +msgid "tag|example|Returns the first method definition in a block of code" +msgstr "コードのブロックの中の最初のメソッド定義を返す。" + +# @param [Array] +#: ../lib/yard/parser/ruby/ast_node.rb:191 +msgid "tag|param|node_types" +msgstr "" + +# @return [AstNode] +#: ../lib/yard/parser/ruby/ast_node.rb:191 +msgid "the matching node, if one was found" +msgstr "マッチするノード(一つ見つかった場合)" + +# @return [Array] +#: ../lib/yard/parser/ruby/ast_node.rb:197 +msgid "the {AstNode} children inside the node" +msgstr "ノード内部の{AstNode}の子。" + +# YARD::Parser::Ruby::AstNode#traverse +#: ../lib/yard/parser/ruby/ast_node.rb:202 +msgid "" +"Traverses the object and yields each node (including descendants) in order." +msgstr "" +"オブジェクトを辿り、\n" +"順番にそれぞれのノード(子孫を含んでいる)を\n" +"yieldする。" + +# @yield +#: ../lib/yard/parser/ruby/ast_node.rb:206 +msgid "each descendant node in order" +msgstr "整理されたそれぞれの子孫のノード。" + +# @yieldparam [AstNode] self, +#: ../lib/yard/parser/ruby/ast_node.rb:206 +msgid "or a child/descendant node" +msgstr "自身や子や子孫のノード。" + +# @yieldparam [AstNode] +#: ../lib/yard/parser/ruby/ast_node.rb:206 +msgid "tag|yieldparam|self," +msgstr "" + +# YARD::Parser::Ruby::AstNode#token? +# YARD::Parser::Ruby::AstNode#ref? +# YARD::Parser::Ruby::AstNode#literal? +# YARD::Parser::Ruby::AstNode#kw? +# YARD::Parser::Ruby::AstNode#call? +# YARD::Parser::Ruby::AstNode#condition? +#: ../lib/yard/parser/ruby/ast_node.rb:217 +#: ../lib/yard/parser/ruby/ast_node.rb:223 +#: ../lib/yard/parser/ruby/ast_node.rb:228 +#: ../lib/yard/parser/ruby/ast_node.rb:233 +#: ../lib/yard/parser/ruby/ast_node.rb:238 +#: ../lib/yard/parser/ruby/ast_node.rb:243 +#: ../lib/yard/parser/ruby/ast_node.rb:248 +#: ../lib/yard/parser/ruby/ast_node.rb:253 +#: ../lib/yard/parser/ruby/ast_node.rb:258 +msgid "Node Meta Types" +msgstr "" + +# @return [Boolean] +#: ../lib/yard/parser/ruby/ast_node.rb:217 +msgid "whether the node is a token" +msgstr "ノードがトークンかどうか" + +# @return [Boolean] +#: ../lib/yard/parser/ruby/ast_node.rb:223 +msgid "" +"whether the node is a reference (variable,\n" +"constant name)" +msgstr "ノードが参照するかどうか(変数,定数名)" + +# @return [Boolean] +#: ../lib/yard/parser/ruby/ast_node.rb:228 +msgid "whether the node is a literal value" +msgstr "ノードがリテラル値かどうか" + +# @return [Boolean] +#: ../lib/yard/parser/ruby/ast_node.rb:233 +msgid "whether the node is a keyword" +msgstr "ノードがキーワードかどうか" + +# @return [Boolean] +#: ../lib/yard/parser/ruby/ast_node.rb:238 +msgid "whether the node is a method call" +msgstr "ノードがメソッド呼び出しかどうか" + +# @return [Boolean] +#: ../lib/yard/parser/ruby/ast_node.rb:243 +msgid "whether the node is a method definition" +msgstr "ノードがメソッド定義かどうか" + +# @return [Boolean] +#: ../lib/yard/parser/ruby/ast_node.rb:248 +msgid "whether the node is a if/elsif/else condition" +msgstr "ノードがifやelsifやelseの条件かどうか" + +# @return [Boolean] +#: ../lib/yard/parser/ruby/ast_node.rb:253 +msgid "whether the node is a loop" +msgstr "ノードがループかどうか" + +# @return [Boolean] +#: ../lib/yard/parser/ruby/ast_node.rb:258 +msgid "whether the node has a block" +msgstr "ノードがblockかどうか" + +# YARD::Parser::Ruby::AstNode#has_line? +# YARD::Parser::Ruby::AstNode#line +# YARD::Parser::Ruby::AstNode#first_line +#: ../lib/yard/parser/ruby/ast_node.rb:265 +#: ../lib/yard/parser/ruby/ast_node.rb:270 +#: ../lib/yard/parser/ruby/ast_node.rb:275 +msgid "Getting Line Information" +msgstr "行の情報を取得する。" + +# @return [Boolean] +#: ../lib/yard/parser/ruby/ast_node.rb:265 +msgid "whether the node has a {#line_range} set" +msgstr "ノードが{#line_range}設定を持っているかどうか" + +# @return [Fixnum] +#: ../lib/yard/parser/ruby/ast_node.rb:270 +msgid "the starting line number of the node" +msgstr "ノードの文字列の行数" + +# @return [String] +#: ../lib/yard/parser/ruby/ast_node.rb:275 +msgid "the first line of source represented by the node." +msgstr "ノードによって表されるソースの最初の行" + +# YARD::Parser::Ruby::AstNode#show +# YARD::Parser::Ruby::AstNode#pretty_print +# YARD::Parser::Ruby::AstNode#inspect +#: ../lib/yard/parser/ruby/ast_node.rb:282 +#: ../lib/yard/parser/ruby/ast_node.rb:287 +#: ../lib/yard/parser/ruby/ast_node.rb:322 +msgid "Printing a Node" +msgstr "ノードをプリントする。" + +# @return [String] +#: ../lib/yard/parser/ruby/ast_node.rb:282 +msgid "the first line of source the node represents" +msgstr "ノードを表すソースの最初の行" + +# @return [nil] +#: ../lib/yard/parser/ruby/ast_node.rb:287 +msgid "pretty prints the node" +msgstr "ノードの出力" + +# @return [String] +#: ../lib/yard/parser/ruby/ast_node.rb:322 +msgid "inspects the object" +msgstr "解析するオブジェクト" + +# YARD::Templates::Helpers::BaseHelper#globals +#: ../lib/yard/parser/ruby/ast_node.rb:330 +#: ../lib/yard/parser/ruby/ast_node.rb:340 +#: ../lib/yard/parser/ruby/ast_node.rb:358 +#: ../lib/yard/parser/ruby/ast_node.rb:359 +#: ../lib/yard/parser/ruby/ast_node.rb:361 +#: ../lib/yard/parser/ruby/ast_node.rb:365 +#: ../lib/yard/parser/ruby/ast_node.rb:370 +#: ../lib/yard/parser/ruby/ast_node.rb:371 +#: ../lib/yard/parser/ruby/ast_node.rb:374 +#: ../lib/yard/parser/ruby/ast_node.rb:375 +#: ../lib/yard/parser/ruby/ast_node.rb:378 +#: ../lib/yard/parser/ruby/ast_node.rb:379 +#: ../lib/yard/parser/ruby/ast_node.rb:380 +#: ../lib/yard/parser/ruby/ast_node.rb:381 +#: ../lib/yard/parser/ruby/ast_node.rb:382 +#: ../lib/yard/parser/ruby/ast_node.rb:383 +#: ../lib/yard/parser/ruby/ast_node.rb:386 +#: ../lib/yard/parser/ruby/ast_node.rb:387 +#: ../lib/yard/parser/ruby/ast_node.rb:388 +#: ../lib/yard/parser/ruby/ast_node.rb:390 +#: ../lib/yard/parser/ruby/ast_node.rb:395 +#: ../lib/yard/parser/ruby/ast_node.rb:404 +#: ../lib/yard/parser/ruby/ast_node.rb:405 +#: ../lib/yard/parser/ruby/ast_node.rb:411 +#: ../lib/yard/parser/ruby/ast_node.rb:415 +#: ../lib/yard/parser/ruby/ast_node.rb:420 +#: ../lib/yard/parser/ruby/ast_node.rb:421 +#: ../lib/yard/parser/ruby/ast_node.rb:422 +#: ../lib/yard/parser/ruby/ast_node.rb:423 +#: ../lib/yard/parser/ruby/ast_node.rb:425 +#: ../lib/yard/parser/ruby/ast_node.rb:430 +#: ../lib/yard/parser/ruby/ast_node.rb:436 +#: ../lib/yard/parser/ruby/ast_node.rb:440 +#: ../lib/yard/parser/ruby/ast_node.rb:445 +#: ../lib/yard/parser/ruby/ast_node.rb:446 +#: ../lib/yard/parser/ruby/ast_node.rb:447 +#: ../lib/yard/parser/ruby/ast_node.rb:448 +#: ../lib/yard/parser/ruby/ast_node.rb:450 +#: ../lib/yard/parser/ruby/ast_node.rb:458 +#: ../lib/yard/parser/ruby/ast_node.rb:461 +#: ../lib/yard/parser/ruby/ast_node.rb:462 +#: ../lib/yard/parser/ruby/ast_node.rb:463 +#: ../lib/yard/parser/ruby/ast_node.rb:464 +#: ../lib/yard/parser/ruby/ast_node.rb:467 +#: ../lib/yard/parser/ruby/ast_node.rb:468 +#: ../lib/yard/parser/ruby/ast_node.rb:469 +#: ../lib/yard/parser/ruby/ast_node.rb:472 +#: ../lib/yard/parser/ruby/ast_node.rb:473 +#: ../lib/yard/parser/ruby/ast_node.rb:474 +#: ../lib/yard/parser/ruby/ast_node.rb:475 +#: ../lib/yard/parser/ruby/ast_node.rb:479 +#: ../lib/yard/parser/ruby/ast_node.rb:480 +#: ../lib/yard/parser/ruby/ast_node.rb:481 +#: ../lib/yard/parser/ruby/ast_node.rb:482 +#: ../lib/yard/parser/ruby/ast_node.rb:484 +#: ../lib/yard/parser/ruby/ast_node.rb:485 +msgid "Managing node state" +msgstr "ノードの状態の管理" + +# YARD::Parser::Ruby::Legacy::RubyToken::TkStatementEnd +#: ../lib/yard/parser/ruby/ast_node.rb:330 +msgid "Resets node state in tree" +msgstr "ツリーの中でノードの状態をリセットする" + +# YARD::Parser::Ruby::AstNode#reset_line_info +#: ../lib/yard/parser/ruby/ast_node.rb:339 +msgid "Resets line information" +msgstr "行情報をリセットする。" + +# YARD::CodeObjects::MethodObject +#: ../lib/yard/parser/ruby/ast_node.rb:479 +msgid "Represents a lone comment block in source" +msgstr "ソースの中の単一のコメントブロックを表す" + +# YARD::Parser::Ruby::Legacy::RubyToken +#: ../lib/yard/parser/ruby/legacy/ruby_lex.rb:7 +msgid "Legacy lexical tokenizer module." +msgstr "" + +# YARD::Parser::Ruby::Legacy::RubyToken::Token +#: ../lib/yard/parser/ruby/legacy/ruby_lex.rb:17 +msgid "Represents a token in the Ruby lexer" +msgstr "Ruby lexerの中のトークンを表す" + +# @return [Integer] +#: ../lib/yard/parser/ruby/legacy/ruby_lex.rb:20 +msgid "" +"the line number in the file/stream the token is\n" +"located." +msgstr "トークンが位置する,ファイルやストリームの中の行の数" + +# @return [Integer] +#: ../lib/yard/parser/ruby/legacy/ruby_lex.rb:24 +msgid "" +"the character number in the file/stream the token\n" +"is located." +msgstr "トークンが位置する,ファイルやストリームの中のcharacterの数" + +# @return [String] +#: ../lib/yard/parser/ruby/legacy/ruby_lex.rb:27 +msgid "the token text value" +msgstr "トークンのテキストの値" + +# @return [Symbol] +#: ../lib/yard/parser/ruby/legacy/ruby_lex.rb:30 +msgid "the lexical state at the token" +msgstr "トークンにおける単語の状態" + +# YARD::Parser::Ruby::Legacy::RubyToken::Token#initialize +#: ../lib/yard/parser/ruby/legacy/ruby_lex.rb:36 +msgid "Creates a new Token object" +msgstr "新しいトークンオブジェクトを作成する" + +# @return [Token] +#: ../lib/yard/parser/ruby/legacy/ruby_lex.rb:38 +msgid "a new instance of Token" +msgstr "トークンの新しいインスタンス" + +# @param [Integer] +#: ../lib/yard/parser/ruby/legacy/ruby_lex.rb:38 +msgid "tag|param|char_no" +msgstr "" + +# @param [Integer] +#: ../lib/yard/parser/ruby/legacy/ruby_lex.rb:38 +msgid "tag|param|line_no" +msgstr "" + +# @param [Integer] char_no +#: ../lib/yard/parser/ruby/legacy/ruby_lex.rb:38 +msgid "the char number to initialize the token to" +msgstr "char numberをトークンにイニシャライズする, char number" + +# @param [Integer] line_no +#: ../lib/yard/parser/ruby/legacy/ruby_lex.rb:38 +msgid "the line number to initialize the token to" +msgstr "行数をトークンにイニシャライズする。行数" + +# YARD::Parser::Ruby::Legacy::RubyToken::Token#set_text +#: ../lib/yard/parser/ruby/legacy/ruby_lex.rb:45 +msgid "Chainable way to sets the text attribute" +msgstr "テキスト属性を設定する為の方法を紐付ける。" + +# @param [String] text +#: ../lib/yard/parser/ruby/legacy/ruby_lex.rb:48 +msgid "the new text" +msgstr "新しいテキスト" + +# @return [Token] +#: ../lib/yard/parser/ruby/legacy/ruby_lex.rb:48 +msgid "this token object" +msgstr "このトークンオブジェクト" + +# YARD::Parser::Ruby::Legacy::RubyToken::TkBlockContents +#: ../lib/yard/parser/ruby/legacy/ruby_lex.rb:55 +msgid "Represents a block" +msgstr "ブロックを表す" + +# YARD::Parser::Ruby::Legacy::RubyToken::TkStatementEnd +#: ../lib/yard/parser/ruby/legacy/ruby_lex.rb:60 +msgid "Represents an end statement" +msgstr "ステートメントの終りを表す。" + +# YARD::Parser::Ruby::Legacy::RubyToken::TkNode#node +#: ../lib/yard/parser/ruby/legacy/ruby_lex.rb:66 +msgid "Returns the value of attribute node" +msgstr "node属性の値を返す。" + +# YARD::Parser::Ruby::Legacy::RubyToken::TkWhitespace +#: ../lib/yard/parser/ruby/legacy/ruby_lex.rb:69 +msgid "Represents whitespace" +msgstr "空白を表す" + +# YARD::Parser::Ruby::Legacy::RubyToken::TkId +#: ../lib/yard/parser/ruby/legacy/ruby_lex.rb:73 +msgid "Represents a Ruby identifier" +msgstr "RubyのIDを表す。" + +# @return [TkId] +#: ../lib/yard/parser/ruby/legacy/ruby_lex.rb:74 +msgid "a new instance of TkId" +msgstr "TkIdの新しいインスタンス" + +# YARD::Parser::Ruby::Legacy::RubyToken::TkKW +#: ../lib/yard/parser/ruby/legacy/ruby_lex.rb:82 +msgid "Represents a Ruby keyword" +msgstr "Rubyキーワードを表す。" + +# YARD::Parser::Ruby::Legacy::RubyToken::TkVal +#: ../lib/yard/parser/ruby/legacy/ruby_lex.rb:86 +msgid "Represents a Ruby value" +msgstr "Rubyの値を表す。" + +# @return [TkVal] +#: ../lib/yard/parser/ruby/legacy/ruby_lex.rb:87 +msgid "a new instance of TkVal" +msgstr "TkValの新しいインスタンス" + +# @return [TkOPASGN] +#: ../lib/yard/parser/ruby/legacy/ruby_lex.rb:100 +msgid "a new instance of TkOPASGN" +msgstr "TkOPASGNの新しいインスタンス" + +# YARD::Parser::Ruby::Legacy::RubyToken::TkOPASGN#op +#: ../lib/yard/parser/ruby/legacy/ruby_lex.rb:106 +msgid "Returns the value of attribute op" +msgstr "op属性の値を返す。" + +# @return [TkUnknownChar] +#: ../lib/yard/parser/ruby/legacy/ruby_lex.rb:109 +msgid "a new instance of TkUnknownChar" +msgstr "TkUnknownCharの新しいインスタンス" + +# YARD::Parser::Ruby::Legacy::RubyToken::TkReading2Token +#: ../lib/yard/parser/ruby/legacy/ruby_lex.rb:284 +msgid "" +"{ reading => token_class }\n" +"{ reading => [token_class, *opt] }" +msgstr "" + +# YARD::Parser::Ruby::Legacy::RubyLex +#: ../lib/yard/parser/ruby/legacy/ruby_lex.rb:330 +msgid "Lexical analyzer for Ruby source" +msgstr "Rubyソース用の単語解析" + +# YARD::Parser::Ruby::Legacy::RubyLex::BufferedReader +#: ../lib/yard/parser/ruby/legacy/ruby_lex.rb:333 +msgid "" +"Read an input stream character by character. We allow for unlimited\n" +"ungetting of characters just read." +msgstr "" +"character毎にストリームの入力を読み込む。\n" +"そこで読まれたcharacterの書き戻しを無制限に許可する。" + +# YARD::Parser::Ruby::Legacy::RubyLex::BufferedReader +#: ../lib/yard/parser/ruby/legacy/ruby_lex.rb:336 +msgid "" +"We simplify the implementation greatly by reading the entire input\n" +"into a buffer initially, and then simply traversing it using\n" +"pointers." +msgstr "" +"最初にバッファの中へ全ての入力を読み込む事によって\n" +"実装する事を非常に簡潔にする。\n" +"そして、それはポインターを利用する事によって簡単に辿ることができる。" + +# YARD::Parser::Ruby::Legacy::RubyLex::BufferedReader +#: ../lib/yard/parser/ruby/legacy/ruby_lex.rb:340 +msgid "" +"We also have to allow for the here document diversion. This\n" +"little gem comes about when the lexer encounters a here\n" +"document. At this point we effectively need to split the input\n" +"stream into two parts: one to read the body of the here document,\n" +"the other to read the rest of the input line where the here\n" +"document was initially encountered. For example, we might have" +msgstr "" +"私達は 複数のヒアドキュメント も考慮しなければならない。\n" +"この複数のヒアドキュメントは、字句解析器がヒアドキュメントに出会う時に起こ" +"る。\n" +"この時点で私達は、事実上2つの部分に入力ストリームを分割する必要がある。\n" +"一つはヒアドキュメントの本体を読み込む部分、\n" +"もう一つは、それ以外の\n" +"ヒアドキュメントが最初に出会った所から、\n" +"入力行の残りを読み込む為の部分。\n" +"例えば、" + +# YARD::Parser::Ruby::Legacy::RubyLex::BufferedReader +#: ../lib/yard/parser/ruby/legacy/ruby_lex.rb:347 +msgid "" +" do_something(<<-A, <<-B)\n" +" stuff\n" +" for\n" +" A\n" +" stuff\n" +" for\n" +" B" +msgstr "" + +# YARD::Parser::Ruby::Legacy::RubyLex::BufferedReader +#: ../lib/yard/parser/ruby/legacy/ruby_lex.rb:355 +msgid "" +"When the lexer encounters the <] +#: ../lib/yard/parser/ruby/legacy/statement.rb:49 +msgid "the first to last lines of Ruby source" +msgstr "Rubyのソースの入った,最初から最後までの行" + +# @param value +#: ../lib/yard/parser/ruby/legacy/statement_list.rb:6 +msgid "the value to set the attribute encoding_line to." +msgstr "encoding_line属性を設定する,値" + +# @param value +#: ../lib/yard/parser/ruby/legacy/statement_list.rb:6 +msgid "the value to set the attribute shebang_line to." +msgstr "shebang_line属性を設定する,値" + +# YARD::Parser::Ruby::Legacy::StatementList#encoding_line +# YARD::Parser::Ruby::RipperParser#encoding_line +#: ../lib/yard/parser/ruby/legacy/statement_list.rb:7 +#: ../lib/yard/parser/ruby/ruby_parser.rb:27 +msgid "Returns the value of attribute encoding_line" +msgstr "encoding_line属性を返す。" + +# YARD::Parser::Ruby::Legacy::StatementList#shebang_line +# YARD::Parser::Ruby::RipperParser#shebang_line +#: ../lib/yard/parser/ruby/legacy/statement_list.rb:7 +#: ../lib/yard/parser/ruby/ruby_parser.rb:27 +msgid "Returns the value of attribute shebang_line" +msgstr "shebang_line属性の値を返す。" + +# YARD::Parser::Ruby::Legacy::StatementList#encoding_line= +#: ../lib/yard/parser/ruby/legacy/statement_list.rb:7 +msgid "Sets the attribute encoding_line" +msgstr "encoding_line属性を設定する。" + +# YARD::Parser::Ruby::Legacy::StatementList#shebang_line= +#: ../lib/yard/parser/ruby/legacy/statement_list.rb:7 +msgid "Sets the attribute shebang_line" +msgstr "shebang_line属性を設定する。" + +# YARD::Parser::Ruby::Legacy::StatementList::OPEN_BLOCK_TOKENS +#: ../lib/yard/parser/ruby/legacy/statement_list.rb:9 +msgid "" +"The following list of tokens will require a block to be opened\n" +"if used at the beginning of a statement." +msgstr "" +"続くトークンのリストは、\n" +"ステートメントの最初で使う場合、ブロックを必要とする。" + +# YARD::Parser::Ruby::Legacy::StatementList#initialize +#: ../lib/yard/parser/ruby/legacy/statement_list.rb:14 +msgid "Creates a new statement list" +msgstr "新しいステートメントのリストを作成する。" + +# @return [StatementList] +#: ../lib/yard/parser/ruby/legacy/statement_list.rb:16 +msgid "a new instance of StatementList" +msgstr "StatementListの新しいインスタンス" + +# @param [TokenList, String] content +#: ../lib/yard/parser/ruby/legacy/statement_list.rb:16 +msgid "the tokens to create the list from" +msgstr "トークンのリストを作成する,トークン" + +# YARD::Parser::Ruby::Legacy::StatementList#next_statement +#: ../lib/yard/parser/ruby/legacy/statement_list.rb:37 +msgid "Returns the next statement in the token stream" +msgstr "処理するトークンの中の次の文を返す。" + +# @return [Statement] +#: ../lib/yard/parser/ruby/legacy/statement_list.rb:39 +msgid "the next statement" +msgstr "次のステートメント" + +# YARD::Parser::Ruby::Legacy::StatementList#process_token +#: ../lib/yard/parser/ruby/legacy/statement_list.rb:117 +msgid "Processes a single token" +msgstr "単一のトークンを処理する。" + +# @param [RubyToken::Token] +#: ../lib/yard/parser/ruby/legacy/statement_list.rb:119 +#: ../lib/yard/parser/ruby/legacy/statement_list.rb:183 +#: ../lib/yard/parser/ruby/legacy/statement_list.rb:202 +#: ../lib/yard/parser/ruby/legacy/statement_list.rb:257 +#: ../lib/yard/parser/ruby/legacy/statement_list.rb:282 +#: ../lib/yard/parser/ruby/legacy/statement_list.rb:294 +#: ../lib/yard/parser/ruby/legacy/statement_list.rb:349 +#: ../lib/yard/parser/ruby/legacy/statement_list.rb:367 +msgid "tag|param|tk" +msgstr "" + +# @param [RubyToken::Token] tk +#: ../lib/yard/parser/ruby/legacy/statement_list.rb:119 +#: ../lib/yard/parser/ruby/legacy/statement_list.rb:183 +#: ../lib/yard/parser/ruby/legacy/statement_list.rb:202 +#: ../lib/yard/parser/ruby/legacy/statement_list.rb:257 +#: ../lib/yard/parser/ruby/legacy/statement_list.rb:282 +#: ../lib/yard/parser/ruby/legacy/statement_list.rb:294 +#: ../lib/yard/parser/ruby/legacy/statement_list.rb:349 +#: ../lib/yard/parser/ruby/legacy/statement_list.rb:367 +msgid "the token to process" +msgstr "処理の為のトークン" + +# YARD::Parser::Ruby::Legacy::StatementList#process_block_token +#: ../lib/yard/parser/ruby/legacy/statement_list.rb:181 +msgid "Processes a token in a block" +msgstr "ブロックの中のトークンを処理する。" + +# YARD::Parser::Ruby::Legacy::StatementList#process_initial_comment +#: ../lib/yard/parser/ruby/legacy/statement_list.rb:199 +msgid "Processes a comment token that comes before a statement" +msgstr "statement処理の前にトークンのコメントを処理する。" + +# @return [Boolean] +#: ../lib/yard/parser/ruby/legacy/statement_list.rb:202 +msgid "whether or not +tk+ was processed as an initial comment" +msgstr "" +"+tk+ がこの#process_initial_commentメソッドが正常に処理されたかどうか。" + +# YARD::Parser::Ruby::Legacy::StatementList#process_simple_block_opener +#: ../lib/yard/parser/ruby/legacy/statement_list.rb:253 +msgid "" +"Processes a simple block-opening token;\n" +"that is, a block opener such as +begin+ or +do+\n" +"that isn't followed by an expression" +msgstr "" +"後に式がない +begin+ や +do+ 等のような単純なトークンの\n" +"blockを開く処理をする。" + +# YARD::Parser::Ruby::Legacy::StatementList#process_complex_block_opener +#: ../lib/yard/parser/ruby/legacy/statement_list.rb:278 +msgid "" +"Processes a complex block-opening token;\n" +"that is, a block opener such as +while+ or +for+\n" +"that is followed by an expression" +msgstr "" +"後に式が来る +while+ や +for+ 等のようなトークンの\n" +"複雑なblockを開く処理をする。" + +# YARD::Parser::Ruby::Legacy::StatementList#process_statement_end +#: ../lib/yard/parser/ruby/legacy/statement_list.rb:292 +msgid "Processes a token that closes a statement" +msgstr "ステートメントを閉じるトークンを処理する。" + +# YARD::Parser::Ruby::Legacy::StatementList#balances? +#: ../lib/yard/parser/ruby/legacy/statement_list.rb:345 +msgid "Handles the balancing of parentheses and blocks" +msgstr "丸括弧とブロックの両立の為の処理する。" + +# @return [Boolean] +#: ../lib/yard/parser/ruby/legacy/statement_list.rb:349 +msgid "" +"whether or not the current statement's parentheses and blocks\n" +"are balanced after +tk+" +msgstr "現在のステートメントの丸括弧とブロックが +tk+ の後で両立するかどうか。" + +# YARD::Parser::Ruby::Legacy::StatementList#push_token +#: ../lib/yard/parser/ruby/legacy/statement_list.rb:364 +msgid "" +"Adds a token to the current statement,\n" +"unless it's a newline, semicolon, or comment" +msgstr "" +"現在のステートメントの為にトークンを追加する。\n" +"ただし改行や、セミコロンや、コメントの場合を除く。" + +# YARD::Parser::Ruby::Legacy::StatementList#peek_no_space +#: ../lib/yard/parser/ruby/legacy/statement_list.rb:373 +msgid "Returns the next token in the stream that's not a space" +msgstr "スペースの無いストリームの中の次のトークンを返す。" + +# @return [RubyToken::Token] +#: ../lib/yard/parser/ruby/legacy/statement_list.rb:375 +msgid "the next non-space token" +msgstr "スペースの無い次のトークン" + +# @return [TokenList] +#: ../lib/yard/parser/ruby/legacy/token_list.rb:6 +msgid "a new instance of TokenList" +msgstr "TokenListの新しいインスタンス" + +# @param [TokenList, Token, String] tokens +#: ../lib/yard/parser/ruby/legacy/token_list.rb:25 +msgid "" +"A list of tokens. If the token is a string, it\n" +"is parsed with {RubyLex}." +msgstr "トークンのリスト。トークンが文字列の場合、{RubyLex}と共に解析される。" + +# @param [TokenList, Token, String] +#: ../lib/yard/parser/ruby/legacy/token_list.rb:25 +msgid "tag|param|tokens" +msgstr "" + +# YARD::Parser::Ruby::RubyParser +#: ../lib/yard/parser/ruby/ruby_parser.rb:7 +#: ../lib/yard/parser/ruby/ruby_parser.rb:11 +#: ../lib/yard/parser/ruby/ruby_parser.rb:18 +#: ../lib/yard/parser/ruby/ruby_parser.rb:19 +#: ../lib/yard/parser/ruby/ruby_parser.rb:20 +msgid "Ruby 1.9 parser" +msgstr "" + +# YARD::Parser::Ruby::RipperParser#ast +# YARD::Parser::Ruby::RipperParser#root +#: ../lib/yard/parser/ruby/ruby_parser.rb:26 +#: ../lib/yard/parser/ruby/ruby_parser.rb:28 +msgid "Returns the value of attribute ast" +msgstr "ast属性の値を返す。" + +# YARD::Parser::Ruby::RipperParser#charno +#: ../lib/yard/parser/ruby/ruby_parser.rb:26 +msgid "Returns the value of attribute charno" +msgstr "charno属性の値を返す。" + +# @return [RipperParser] +#: ../lib/yard/parser/ruby/ruby_parser.rb:29 +msgid "a new instance of RipperParser" +msgstr "RipperParserの新しいインスタンス" + +# YARD::Parser::UndocumentableError +#: ../lib/yard/parser/source_parser.rb:7 +msgid "" +"Raised when an object is recognized but cannot be documented. This\n" +"generally occurs when the Ruby syntax used to declare an object is\n" +"too dynamic in nature." +msgstr "" +"オブジェクトが認識される時に例外を上げる。\n" +"しかし、記述される事はない。\n" +"これは通常オブジェクトを宣言する為に\n" +"使われたRuby構文が動的すぎる時に起る。" + +# YARD::Parser::ParserSyntaxError +#: ../lib/yard/parser/source_parser.rb:12 +msgid "Raised when the parser sees a Ruby syntax error" +msgstr "パーサーがRubyの構文のエラーを発見した時、例外を上げる。" + +# YARD::Parser::OrderedParser +#: ../lib/yard/parser/source_parser.rb:15 +msgid "" +"Responsible for parsing a list of files in order. The\n" +"{#parse} method of this class can be called from the\n" +"{SourceParser#globals} globals state list to re-enter\n" +"parsing for the remainder of files in the list recursively." +msgstr "" + +# @see +#: ../lib/yard/parser/source_parser.rb:20 +#: ../lib/yard/parser/source_parser.rb:41 +msgid "tag|see|Processor#parse_remaining_files" +msgstr "" + +# @param [Array] files +#: ../lib/yard/parser/source_parser.rb:22 +msgid "the list of remaining files to parse" +msgstr "解析のための残りのファイルのリスト" + +# YARD::Parser::OrderedParser#initialize +#: ../lib/yard/parser/source_parser.rb:25 +msgid "" +"Creates a new OrderedParser with the global state and a list\n" +"of files to parse." +msgstr "" + +# @note +#: ../lib/yard/parser/source_parser.rb:32 +msgid "" +"OrderedParser sets itself as the +ordered_parser+ key on\n" +"global_state for later use in {Handlers::Processor}." +msgstr "" + +# @return [CParser] +#: ../lib/yard/parser/source_parser.rb:32 +msgid "a new instance of OrderedParser" +msgstr "OrderedParserの新しいインスタンス" + +# @return [Processor] +#: ../lib/yard/parser/source_parser.rb:32 +msgid "" +"a structure containing all global\n" +"state during parsing" +msgstr "解析中の全ての全体の状態を含んでいる構造体" + +# @yieldparam [OpenStruct] +#: ../lib/yard/parser/source_parser.rb:32 +msgid "tag|param|global_state" +msgstr "" + +# YARD::Handlers::Ruby::Legacy::ClassConditionHandler#parse_condition +# YARD::Handlers::Ruby::ClassConditionHandler#parse_condition +#: ../lib/yard/parser/source_parser.rb:39 +msgid "Parses the remainder of the {#files} list." +msgstr "{#files} のリストの残りを解析する" + +# YARD::Parser::SourceParser +#: ../lib/yard/parser/source_parser.rb:51 +msgid "" +"Responsible for parsing a source file into the namespace. Parsing\n" +"also invokes handlers to process the parsed statements and generate\n" +"any code objects that may be recognized." +msgstr "" +"namespaceの中のソースファイルを解析する為の責任がある。\n" +"そして解析する事は、解析されるステートメントや\n" +"認識されるかもしれないコードオブジェクトを生成する\n" +"処理の為にハンドラーも起動する。" + +# YARD::Parser::SourceParser +#: ../lib/yard/parser/source_parser.rb:55 +msgid "" +"== Custom Parsers\n" +"SourceParser allows custom parsers to be registered and called when\n" +"a certain filetype is recognized. To register a parser and hook it\n" +"up to a set of file extensions, call {register_parser_type}" +msgstr "" +"== カスタムパーサー\n" +"ソースパーサーによってカスタムパーサーは\n" +"明確にファイルタイプが認識される時に\n" +"記録され呼び出される。\n" +"パーサーを記録しファイル拡張子の設定をつなぐには、\n" +"{register_parser_type}を呼び出す。" + +# @see +#: ../lib/yard/parser/source_parser.rb:62 +msgid "tag|see|register_parser_type" +msgstr "" + +# YARD::Parser::SourceParser::ENCODING_BYTE_ORDER_MARKS +#: ../lib/yard/parser/source_parser.rb:67 +msgid "Byte order marks for various encodings" +msgstr "様々なエンコーディング用のバイトオーダーマーク" + +# @return [Symbol] +#: ../lib/yard/parser/source_parser.rb:79 +msgid "the default parser type (defaults to :ruby)" +msgstr "デフォルトのパーサータイプ(デフォルト :ruby)" + +# YARD::Parser::SourceParser.parse +#: ../lib/yard/parser/source_parser.rb:86 +msgid "Parses a path or set of paths" +msgstr "パスやパスの設定を解析する。" + +# @param [Array] excluded +#: ../lib/yard/parser/source_parser.rb:93 +msgid "a list of excluded path matchers" +msgstr "パスの照合を除外されるリスト。" + +# @param [String, Array] paths +#: ../lib/yard/parser/source_parser.rb:93 +msgid "" +"a path, glob, or list of paths to\n" +"parse" +msgstr "パス,glob,解析の為のパスのリスト" + +# @param [Array] +#: ../lib/yard/parser/source_parser.rb:93 +msgid "tag|param|excluded" +msgstr "excluded" + +# @param [Fixnum] +#: ../lib/yard/parser/source_parser.rb:93 +msgid "tag|param|level" +msgstr "level" + +# @param [Array] +# @param [String, Array] +#: ../lib/yard/parser/source_parser.rb:93 ../lib/yard/server/router.rb:122 +msgid "tag|param|paths" +msgstr "paths" + +# @param [Fixnum] level +#: ../lib/yard/parser/source_parser.rb:93 +msgid "" +"the logger level to use during parsing. See\n" +"{YARD::Logger}" +msgstr "" +"解析される間、使用する為のloggerレベル。\n" +"{YARD::Logger}参照。" + +# YARD::Parser::SourceParser.parse_string +#: ../lib/yard/parser/source_parser.rb:112 +msgid "Parses a string +content+" +msgstr "" +"+content+ の文字列を解析する。\n" +"Parses a string +content+" + +# @param [Symbol] +#: ../lib/yard/parser/source_parser.rb:116 +#: ../lib/yard/parser/source_parser.rb:125 +msgid "tag|param|ptype" +msgstr "ptype" + +# @param [String] content +#: ../lib/yard/parser/source_parser.rb:116 +msgid "the block of code to parse" +msgstr "解析する為のコードの入ったブロック。" + +# @return +#: ../lib/yard/parser/source_parser.rb:116 +msgid "the parser object that was used to parse +content+" +msgstr "+content+ を解析する為に利用されるパーサーオブジェクト。" + +# @param [Symbol] ptype +#: ../lib/yard/parser/source_parser.rb:116 +#: ../lib/yard/parser/source_parser.rb:125 +msgid "the parser type to use. See {parser_type}." +msgstr "利用するパーサーの型。{parser_type}参照。" + +# YARD::Parser::SourceParser.tokenize +#: ../lib/yard/parser/source_parser.rb:121 +msgid "Tokenizes but does not parse the block of code" +msgstr "トークナイズする。しかしコードの入ったブロックは解析しない。" + +# @return [Array] +#: ../lib/yard/parser/source_parser.rb:125 +#: ../lib/yard/parser/source_parser.rb:460 +msgid "a list of tokens" +msgstr "トークンの入ったリスト。" + +# @param [String] content +#: ../lib/yard/parser/source_parser.rb:125 +#: ../lib/yard/parser/source_parser.rb:460 +msgid "the block of code to tokenize" +msgstr "トークナイズする為のコードの入ったブロック。" + +# YARD::Parser::SourceParser.register_parser_type +#: ../lib/yard/parser/source_parser.rb:130 +msgid "Registers a new parser type." +msgstr "新しいパーサーの型を記録する。" + +# @example Registering a parser for "java" files +#: ../lib/yard/parser/source_parser.rb:139 +msgid "SourceParser.register_parser_type :java, JavaParser, 'java'" +msgstr "" + +# @param [Base] parser_klass +#: ../lib/yard/parser/source_parser.rb:139 +msgid "a class that implements parsing and tokenization" +msgstr "解析やトークナイズを実装するクラス。" + +# @param [Array, String, Regexp] extensions +#: ../lib/yard/parser/source_parser.rb:139 +msgid "" +"a list of extensions or a\n" +"regex to match against the file extension" +msgstr "拡張子のリストやファイル拡張子に対しマッチする正規表現。" + +# @param [Symbol] type +#: ../lib/yard/parser/source_parser.rb:139 +msgid "a symbolic name for the parser type" +msgstr "パーサー型用のシンボリック名。" + +# @example +#: ../lib/yard/parser/source_parser.rb:139 +msgid "tag|example|Registering a parser for \"java\" files" +msgstr "\"java\"ファイル用にパーサーを記録する" + +# @param [Array, String, Regexp] +#: ../lib/yard/parser/source_parser.rb:139 +msgid "tag|param|extensions" +msgstr "extensions" + +# @param [Base] +#: ../lib/yard/parser/source_parser.rb:139 +msgid "tag|param|parser_klass" +msgstr "parser_klass" + +# @see +#: ../lib/yard/parser/source_parser.rb:139 +msgid "tag|see|Parser::Base" +msgstr "" + +# @return [Hash{Symbol=>Object}] +#: ../lib/yard/parser/source_parser.rb:150 +#: ../lib/yard/parser/source_parser.rb:152 +msgid "a list of registered parser types" +msgstr "パーサーの型が記録されるリスト。" + +# YARD::Parser::SourceParser.parser_type_for_extension +#: ../lib/yard/parser/source_parser.rb:164 +msgid "" +"Finds a parser type that is registered for the extension. If no\n" +"type is found, the default Ruby type is returned." +msgstr "" +"拡張用の記録されるパーサーの型を見つける。\n" +"型が見つからない無い場合、デフォルトのRuby型が返される。" + +# @return [Symbol] +#: ../lib/yard/parser/source_parser.rb:168 +msgid "the parser type to be used for the extension" +msgstr "拡張用に利用されるパーサーの型。" + +# YARD::Parser::SourceParser.validated_parser_type +#: ../lib/yard/parser/source_parser.rb:176 +msgid "" +"Returns the validated parser type. Basically, enforces that :ruby\n" +"type is never set if the Ripper library is not available" +msgstr "" +"有効なパーサー型を返す。\n" +"基本的に、Ripperライブラリが利用不可の場合、\n" +":ruby型が設定されないよう実行される。" + +# @param [Symbol] type +#: ../lib/yard/parser/source_parser.rb:181 +msgid "the parser type to set" +msgstr "設定するパーサーの型。" + +# @return [Symbol] +#: ../lib/yard/parser/source_parser.rb:181 +msgid "the validated parser type" +msgstr "有効なパーサーの型。" + +# YARD::Parser::SourceParser.before_parse_list +#: ../lib/yard/parser/source_parser.rb:188 +msgid "" +"Registers a callback to be called before a list of files is parsed\n" +"via {parse}. The block passed to this method will be called on\n" +"subsequent parse calls." +msgstr "" +"{parse} 経由でファイルのリストが解析される前に呼び出されるコールバックを記録する\n" +"このメソッドに渡されるブロックはそれに続く、parse呼び出し上で呼び出される。" + +# YARD::Parser::SourceParser.before_parse_list +# YARD::Parser::SourceParser.after_parse_list +# YARD::Parser::SourceParser.before_parse_file +# YARD::Parser::SourceParser.after_parse_file +# YARD::Parser::SourceParser.before_parse_list_callbacks +# YARD::Parser::SourceParser.after_parse_list_callbacks +# YARD::Parser::SourceParser.before_parse_file_callbacks +# YARD::Parser::SourceParser.after_parse_file_callbacks +#: ../lib/yard/parser/source_parser.rb:231 +#: ../lib/yard/parser/source_parser.rb:255 +#: ../lib/yard/parser/source_parser.rb:292 +#: ../lib/yard/parser/source_parser.rb:321 +#: ../lib/yard/parser/source_parser.rb:328 +#: ../lib/yard/parser/source_parser.rb:335 +#: ../lib/yard/parser/source_parser.rb:342 +#: ../lib/yard/parser/source_parser.rb:349 +#: ../lib/yard/parser/source_parser.rb:361 +#: ../lib/yard/parser/source_parser.rb:384 +#: ../lib/yard/parser/source_parser.rb:388 +#: ../lib/yard/parser/source_parser.rb:393 +#: ../lib/yard/parser/source_parser.rb:397 +#: ../lib/yard/parser/source_parser.rb:404 +#: ../lib/yard/parser/source_parser.rb:416 +#: ../lib/yard/parser/source_parser.rb:460 +#: ../lib/yard/parser/source_parser.rb:469 +#: ../lib/yard/parser/source_parser.rb:490 +#: ../lib/yard/parser/source_parser.rb:497 +#: ../lib/yard/parser/source_parser.rb:505 +#: ../lib/yard/parser/source_parser.rb:512 +msgid "Parser Callbacks" +msgstr "パーサーのコールバック" + +# @example Setting global state +#: ../lib/yard/parser/source_parser.rb:231 +msgid "" +"SourceParser.before_parse_list do |files, globals|\n" +" globals.method_count = 0\n" +"end\n" +"SourceParser.after_parse_list do |files, globals|\n" +" puts \"Found #{globals.method_count} methods\"\n" +"end\n" +"class MyCountHandler < Handlers::Ruby::Base\n" +" handles :def, :defs\n" +" process { globals.method_count += 1 }\n" +"end\n" +"YARD.parse\n" +"# Prints: \"Found 37 methods\"" +msgstr "" + +# @example Installing a simple callback +#: ../lib/yard/parser/source_parser.rb:231 +msgid "" +"SourceParser.before_parse_list do |files, globals|\n" +" puts \"Starting to parse...\"\n" +"end\n" +"YARD.parse('lib/**/*.rb')\n" +"# prints \"Starting to parse...\"" +msgstr "" + +# @example Using a global callback to cancel parsing +#: ../lib/yard/parser/source_parser.rb:231 +msgid "" +"SourceParser.before_parse_list do |files, globals|\n" +" return false if files.include?('foo.rb')\n" +"end\n" +"\n" +"YARD.parse(['foo.rb', 'bar.rb']) # callback cancels this method\n" +"YARD.parse('bar.rb') # parses normally" +msgstr "" + +# @yieldparam [OpenStruct] globals +#: ../lib/yard/parser/source_parser.rb:231 +#: ../lib/yard/parser/source_parser.rb:255 +msgid "" +"a global structure to store arbitrary\n" +"state for post processing (see {Handlers::Processor#globals})" +msgstr "" +"後処理用の任意の状態を格納する、globalなデータ(see {Handlers::" +"Processor#globals})" + +# @yieldreturn [Boolean] +#: ../lib/yard/parser/source_parser.rb:231 +msgid "" +"if the block returns +false+, parsing is\n" +"cancelled." +msgstr "ブロックが +false+ を返す場合、解析処理はキャンセルされる。" + +# @example +#: ../lib/yard/parser/source_parser.rb:231 +#: ../lib/yard/parser/source_parser.rb:292 +msgid "tag|example|Installing a simple callback" +msgstr "簡単なコールバックを実装する" + +# @example +#: ../lib/yard/parser/source_parser.rb:231 +msgid "tag|example|Setting global state" +msgstr "globalの状態を設定する" + +# @example +#: ../lib/yard/parser/source_parser.rb:231 +msgid "tag|example|Using a global callback to cancel parsing" +msgstr "解析するのをキャンセルする為にコールバックにglobalを使う" + +# @see +#: ../lib/yard/parser/source_parser.rb:231 +#: ../lib/yard/parser/source_parser.rb:321 +msgid "tag|see|after_parse_list" +msgstr "" + +# @see +#: ../lib/yard/parser/source_parser.rb:231 +#: ../lib/yard/parser/source_parser.rb:255 +#: ../lib/yard/parser/source_parser.rb:321 +msgid "tag|see|before_parse_file" +msgstr "" + +# @yieldparam [Array] +#: ../lib/yard/parser/source_parser.rb:231 +#: ../lib/yard/parser/source_parser.rb:255 +msgid "tag|yieldparam|files" +msgstr "files" + +# @yieldparam [OpenStruct] +#: ../lib/yard/parser/source_parser.rb:231 +#: ../lib/yard/parser/source_parser.rb:255 +msgid "tag|yieldparam|globals" +msgstr "globals" + +# @yieldparam [Array] files +#: ../lib/yard/parser/source_parser.rb:231 +#: ../lib/yard/parser/source_parser.rb:255 +msgid "the list of files that will be parsed." +msgstr "解析されるファイルのリスト。" + +# @return [Proc] +#: ../lib/yard/parser/source_parser.rb:231 +#: ../lib/yard/parser/source_parser.rb:255 +#: ../lib/yard/parser/source_parser.rb:292 +#: ../lib/yard/parser/source_parser.rb:321 +msgid "the yielded block" +msgstr "yieldされるブロック。" + +# @yield [files, globals] +#: ../lib/yard/parser/source_parser.rb:231 +#: ../lib/yard/parser/source_parser.rb:255 +msgid "" +"the yielded block is called once before\n" +"parsing all files" +msgstr "" +"yieldされたブロックは\n" +"全てのファイルを解析する前に一度だけ呼び出される。" + +# YARD::Parser::SourceParser.after_parse_list +#: ../lib/yard/parser/source_parser.rb:236 +msgid "" +"Registers a callback to be called after a list of files is parsed\n" +"via {parse}. The block passed to this method will be called on\n" +"subsequent parse calls." +msgstr "" +"ファイルのリストが {parse} 経由で解析された後で呼び出される為にコールバックを記録する。\n" +"このメソッドの為に渡されるブロックはその後のparse呼び出し上で呼び出される。" + +# @example Printing results after parsing occurs +#: ../lib/yard/parser/source_parser.rb:255 +msgid "" +"SourceParser.after_parse_list do\n" +" puts \"Finished parsing!\"\n" +"end\n" +"YARD.parse\n" +"# Prints \"Finished parsing!\" after parsing files" +msgstr "" + +# @example +#: ../lib/yard/parser/source_parser.rb:255 +msgid "tag|example|Printing results after parsing occurs" +msgstr "解析が終わった後で、結果をプリントする。" + +# @see +#: ../lib/yard/parser/source_parser.rb:255 +#: ../lib/yard/parser/source_parser.rb:292 +msgid "tag|see|before_parse_list" +msgstr "" + +# @yieldreturn [void] +#: ../lib/yard/parser/source_parser.rb:255 +#: ../lib/yard/parser/source_parser.rb:321 +msgid "the return value for the block is ignored." +msgstr "ブロックが無視される為の戻り値" + +# YARD::Parser::SourceParser.before_parse_file +#: ../lib/yard/parser/source_parser.rb:260 +msgid "" +"Registers a callback to be called before an individual file is parsed.\n" +"The block passed to this method will be called on subsequent parse\n" +"calls." +msgstr "" +"個々のファイルが解析される前に呼び出されるコールバックを記録する\n" +"blockはこのメソッドが続くparse呼び出しで呼び出されるために解析される。" + +# YARD::Parser::SourceParser.before_parse_file +#: ../lib/yard/parser/source_parser.rb:264 +msgid "" +"To register a callback that is called before the entire list of files\n" +"is processed, see {before_parse_list}." +msgstr "" +"全てのファイルのリストが処理される前に呼び出される\n" +"コールバックを記録する為には、{before_parse_list}参照。" + +# @example Installing a simple callback +#: ../lib/yard/parser/source_parser.rb:292 +msgid "" +"SourceParser.before_parse_file do |parser|\n" +" puts \"I'm parsing #{parser.file}\"\n" +"end\n" +"YARD.parse('lib/**/*.rb')\n" +"# prints:\n" +"\"I'm parsing lib/foo.rb\"\n" +"\"I'm parsing lib/foo_bar.rb\"\n" +"\"I'm parsing lib/last_file.rb\"" +msgstr "" + +# @example Cancel parsing of any test_*.rb files +#: ../lib/yard/parser/source_parser.rb:292 +msgid "" +"SourceParser.before_parse_file do |parser|\n" +" return false if parser.file =~ /^test_.+\\.rb$/\n" +"end" +msgstr "" + +# @yieldreturn [Boolean] +#: ../lib/yard/parser/source_parser.rb:292 +msgid "" +"if the block returns +false+, parsing for\n" +"the file is cancelled." +msgstr "" +"ブロックが +false+ を返す場合、\n" +"ファイルがキャンセルされる為に解析する。" + +# @example +#: ../lib/yard/parser/source_parser.rb:292 +msgid "tag|example|Cancel parsing of any test_*.rb files" +msgstr "全てのtest_*.rbファイルの解析をキャンセルする" + +# @see +#: ../lib/yard/parser/source_parser.rb:292 +msgid "tag|see|after_parse_file" +msgstr "" + +# @yieldparam [SourceParser] parser +#: ../lib/yard/parser/source_parser.rb:292 +msgid "" +"the parser object that will {#parse}\n" +"the file." +msgstr "ファイルを{#parse}メソッドで解析するパーサーオブジェクト。" + +# @yield [parser] +#: ../lib/yard/parser/source_parser.rb:292 +msgid "" +"the yielded block is called once before each\n" +"file that is parsed. This might happen many times for a single\n" +"codebase." +msgstr "" +"yieldされるブロックは、それぞれのファイルが解析される前に一度呼び出される。\n" +"これは、単一のコードベースでは何回も起きる可能性がある。" + +# YARD::Parser::SourceParser.after_parse_file +#: ../lib/yard/parser/source_parser.rb:297 +msgid "" +"Registers a callback to be called after an individual file is parsed.\n" +"The block passed to this method will be called on subsequent parse\n" +"calls." +msgstr "" +"個々のファイルが解析された後で呼び出されるコールバックを登録する。\n" +"このメソッドに渡されたブロックは次のparseメソッドの呼び出しで呼び出される。" + +# YARD::Parser::SourceParser.after_parse_file +#: ../lib/yard/parser/source_parser.rb:301 +msgid "" +"To register a callback that is called after the entire list of files\n" +"is processed, see {after_parse_list}." +msgstr "" +"ファイルリストが全て処理された後で呼び出される。\n" +"コールバックを記録するには、{after_parse_list}参照。" + +# @example Printing the length of each file after it is parsed +#: ../lib/yard/parser/source_parser.rb:321 +msgid "" +"SourceParser.after_parse_file do |parser|\n" +" puts \"#{parser.file} is #{parser.contents.size} characters\"\n" +"end\n" +"YARD.parse('lib/**/*.rb')\n" +"# prints:\n" +"\"lib/foo.rb is 1240 characters\"\n" +"\"lib/foo_bar.rb is 248 characters\"" +msgstr "" + +# @example +#: ../lib/yard/parser/source_parser.rb:321 +msgid "tag|example|Printing the length of each file after it is parsed" +msgstr "tag|example|解析された後でそれぞれのファイルのサイズをプリントする" + +# @yieldparam [SourceParser] parser +#: ../lib/yard/parser/source_parser.rb:321 +msgid "" +"the parser object that parsed\n" +"the file." +msgstr "ファイルを解析した、パーサーオブジェクト。" + +# @yield [parser] +#: ../lib/yard/parser/source_parser.rb:321 +msgid "" +"the yielded block is called once after each file\n" +"that is parsed. This might happen many times for a single codebase." +msgstr "" +"yieldされたブロックは解析される個々のファイルの後で一度呼び出される。\n" +"これは単一のコードベースの為に何回も起る可能性がある。" + +# @return [Array] +#: ../lib/yard/parser/source_parser.rb:328 +msgid "" +"the list of callbacks to be called before\n" +"parsing a list of files. Should only be used for testing." +msgstr "" +"ファイルのリストを解析する前に呼び出されるコールバックのリスト。\n" +"検査用にだけ利用されるべきである。" + +# @return [Array] +#: ../lib/yard/parser/source_parser.rb:335 +msgid "" +"the list of callbacks to be called after\n" +"parsing a list of files. Should only be used for testing." +msgstr "" +"ファイルのリストを解析する前に呼び出される為のコールバックのリスト。\n" +"検査用にだけ利用されるべきである。" + +# @return [Array] +#: ../lib/yard/parser/source_parser.rb:342 +msgid "" +"the list of callbacks to be called before\n" +"parsing a file. Should only be used for testing." +msgstr "" +"ファイルが解析する前に呼び出される為のコールバックのリスト。\n" +"検査用にだけ利用されるべきである。" + +# @return [Array] +#: ../lib/yard/parser/source_parser.rb:349 +msgid "" +"the list of callbacks to be called after\n" +"parsing a file. Should only be used for testing." +msgstr "" +"ファイルが解析する前に呼び出される為のコールバックのリスト。\n" +"検査用にだけ利用されるべきである。" + +# @param [Array] files +#: ../lib/yard/parser/source_parser.rb:358 +msgid "Parses a list of files in a queue." +msgstr "キューのなかのファイルのリストを解析する" + +# @param [Array] files +#: ../lib/yard/parser/source_parser.rb:361 +msgid "a list of files to queue for parsing" +msgstr "解析用のキューの為のファイルのリスト。" + +# @return [String] +#: ../lib/yard/parser/source_parser.rb:384 +msgid "the filename being parsed by the parser." +msgstr "パーサーによって解析されているファイル名。" + +# @return [Symbol] +#: ../lib/yard/parser/source_parser.rb:388 +msgid "" +"the parser type associated with the parser instance.\n" +"This should be set by the {#initialize constructor}." +msgstr "" +"パーサーのインスタンスと共に関連付られるパーサーの型。\n" +"これは、{#initialize constructor}メソッドによって設定されるべきである。" + +# @return [OpenStruct] +#: ../lib/yard/parser/source_parser.rb:393 +msgid "" +"an open struct containing arbitrary global state\n" +"shared between files and handlers." +msgstr "" +"ファイルとハンドラーとの間で共有される\n" +"任意のグローバルな状態を含んでいるOpenStruct" + +# @return [String] +#: ../lib/yard/parser/source_parser.rb:397 +msgid "the contents of the file to be parsed" +msgstr "解析されるファイルの内容。" + +# @return [SourceParser] +#: ../lib/yard/parser/source_parser.rb:404 +msgid "a new instance of SourceParser" +msgstr "ソースパーサーの新しいインスタンス。" + +# @overload +#: ../lib/yard/parser/source_parser.rb:404 +msgid "tag|overload|initialize" +msgstr "" + +# YARD::Parser::SourceParser#parse +#: ../lib/yard/parser/source_parser.rb:412 +msgid "" +"The main parser method. This should not be called directly. Instead,\n" +"use the class methods {parse} and {parse_string}." +msgstr "" +"主なパーサーメソッド。これは直接呼ばれるべきではない。\n" +"代わりに、{parse}や{parse_string}クラスメソッドを利用する。" + +# @return [Object, nil] +#: ../lib/yard/parser/source_parser.rb:416 +msgid "the parser object used to parse the source" +msgstr "ソースを解析する為に利用されるパーサーオブジェクト。" + +# @param [String, #read, Object] content +#: ../lib/yard/parser/source_parser.rb:416 +msgid "the source file to parse" +msgstr "解析の為のソースファイル。" + +# YARD::Parser::SourceParser#tokenize +#: ../lib/yard/parser/source_parser.rb:457 +msgid "" +"Tokenizes but does not parse the block of code using the current " +"{#parser_type}" +msgstr "" +"トークナイズする。しかし、\n" +"現在の{#parser_type}メソッドを使用して、コードの入ったブロックは解析しない。" + +# YARD::Parser::SourceParser#convert_encoding +#: ../lib/yard/parser/source_parser.rb:468 +msgid "Searches for encoding line and forces encoding" +msgstr "エンコーディング行を検索し、エンコーディングを強制する。" + +# YARD::Parser::SourceParser#post_process +#: ../lib/yard/parser/source_parser.rb:489 +msgid "" +"Runs a {Handlers::Processor} object to post process the parsed statements." +msgstr "解析したステートメントの後処理の為に、{Handlers::Processor}オブジェクトを起動する。" + +# YARD::Parser::SourceParser#parser_type_for_filename +#: ../lib/yard/parser/source_parser.rb:502 +msgid "Guesses the parser type to use depending on the file extension." +msgstr "ファイル拡張子に応じて使用するパーサーの型を推測する。" + +# @return [Symbol] +#: ../lib/yard/parser/source_parser.rb:505 +msgid "a parser type that matches the filename" +msgstr "ファイル名の拡張子に応じたパーサータイプ。" + +# @param [String] filename +#: ../lib/yard/parser/source_parser.rb:505 +msgid "the filename to use to guess the parser type" +msgstr "パーサー型を推測する為に利用するファイル名。" + +# YARD::Rake::YardocTask +#: ../lib/yard/rake/yardoc_task.rb:8 +msgid "The rake task to run {CLI::Yardoc} and generate documentation." +msgstr "{CLI::Yardoc}を起動する為のrake taskとなり、ドキュメントを生成する。" + +# YARD::Rake::YardocTask#name +# YARD::Rake::YardocTask#name= +#: ../lib/yard/rake/yardoc_task.rb:10 +msgid "The name of the task" +msgstr "taskの名前" + +# @return [String] +#: ../lib/yard/rake/yardoc_task.rb:11 +msgid "the task name" +msgstr "task名" + +# YARD::Rake::YardocTask#options +# YARD::Rake::YardocTask#options= +#: ../lib/yard/rake/yardoc_task.rb:14 +msgid "Options to pass to {CLI::Yardoc}" +msgstr "{CLI::Yardoc}の為のパスの設定" + +# @return [Hash] +#: ../lib/yard/rake/yardoc_task.rb:15 +msgid "the options passed to the commandline utility" +msgstr "コマンドライン用途の為に渡される設定" + +# YARD::Rake::YardocTask#files +# YARD::Rake::YardocTask#files= +#: ../lib/yard/rake/yardoc_task.rb:18 +msgid "" +"The Ruby source files (and any extra documentation files separated by '-')\n" +"to process." +msgstr "" +"処理の為のRubyソースファイル(と'-'によって分割された、任意の特別なドキュメン" +"トファイル)" + +# @example Task files assignment +#: ../lib/yard/rake/yardoc_task.rb:24 +msgid "" +"YARD::Rake::YardocTask.new do |t|\n" +" t.files = ['app/**/*.rb', 'lib/**/*.rb', '-', 'doc/FAQ.md', 'doc/Changes." +"md']\n" +"end" +msgstr "" + +# @example +#: ../lib/yard/rake/yardoc_task.rb:24 +msgid "tag|example|Task files assignment" +msgstr "Taskのファイルを代入する" + +# YARD::Rake::YardocTask#before +# YARD::Rake::YardocTask#before= +#: ../lib/yard/rake/yardoc_task.rb:27 +msgid "Runs a +Proc+ before the task" +msgstr "taskの前に +Proc+ を起動する。" + +# @return [Proc] +#: ../lib/yard/rake/yardoc_task.rb:28 +msgid "a proc to call before running the task" +msgstr "task を起動する前に、呼び出される,proc" + +# YARD::Rake::YardocTask#after +# YARD::Rake::YardocTask#after= +#: ../lib/yard/rake/yardoc_task.rb:31 +msgid "Runs a +Proc+ after the task" +msgstr "taskの後で起動する +Proc+" + +# @return [Proc] +#: ../lib/yard/rake/yardoc_task.rb:32 +msgid "a proc to call after running the task" +msgstr "taskを起動した後で呼び出される,proc" + +# @return [Verifier, Proc] +#: ../lib/yard/rake/yardoc_task.rb:38 +msgid "" +"an optional {Verifier} to run against all objects\n" +"being generated. Any object that the verifier returns false for will be\n" +"excluded from documentation. This attribute can also be a lambda." +msgstr "" +"全てのオブジェクトに対して起動するための任意の {Verifier}(認証者)\n" +"verifierがドキュメントから除外される為のfalseを返す任意のオブジェクト\n" +"この属性はlmbdaにもできる。" + +# YARD::Rake::YardocTask#initialize +#: ../lib/yard/rake/yardoc_task.rb:41 +msgid "Creates a new task with name +name+." +msgstr "+name+ 名を用いる新しいタスクを作成する" + +# @yield +#: ../lib/yard/rake/yardoc_task.rb:46 +msgid "a block to allow any options to be modified on the task" +msgstr "task上で変更される為に任意のオプションを受け入れる,block" + +# @return [YardocTask] +#: ../lib/yard/rake/yardoc_task.rb:46 +msgid "a new instance of YardocTask" +msgstr "YardocTaskの新しいインスタンス" + +# @yieldparam [YardocTask] +#: ../lib/yard/rake/yardoc_task.rb:46 +msgid "tag|yieldparam|_self" +msgstr "" + +# @param [String, Symbol] name +#: ../lib/yard/rake/yardoc_task.rb:46 +msgid "the name of the rake task" +msgstr "rake taskの名前" + +# @yieldparam [YardocTask] _self +#: ../lib/yard/rake/yardoc_task.rb:46 +msgid "" +"the task object to allow any parameters\n" +"to be changed." +msgstr "変更される任意のパラメータを受け入れるtask オブジェクト" + +# YARD::Rake::YardocTask#define +#: ../lib/yard/rake/yardoc_task.rb:61 +msgid "Defines the rake task" +msgstr "rake taskを定義する。" + +# YARD::Registry +#: ../lib/yard/registry.rb:6 +msgid "" +"The +Registry+ is the centralized data store for all {CodeObjects} created\n" +"during parsing. The storage is a key value store with the object's path\n" +"(see {CodeObjects::Base#path}) as the key and the object itself as the " +"value.\n" +"Object paths must be unique to be stored in the Registry. All lookups for\n" +"objects are done on the singleton Registry instance using the {Registry.at}\n" +"or {Registry.resolve} methods." +msgstr "" +"+Registry+ は解析している間に、\n" +"全ての{CodeObjects}が作成される為の\n" +"集中データストアとなる。\n" +"ストレージは、\n" +"キーのようなオブジェクトパス(see {CodeObjects::Base#path})と\n" +"値のようなオブジェクトを用い、key valueストアとなる。\n" +"オブジェクトパスは、Registryの中で記録される為に固有でなければならない。\n" +"オブジェクト用の全ての検索は、\n" +"{Registry.at} や {Registry.resolve}メソッドによって\n" +"シングルトンレジストリインスタンスの上で行われる。\n" + +# YARD::Registry +#: ../lib/yard/registry.rb:13 +msgid "" +"== Saving / Loading a Registry\n" +"The registry is saved to a \"yardoc file\" (actually a directory), which " +"can\n" +"be loaded back to perform any lookups. See {Registry.load!} and\n" +"{Registry.save} for information on saving and loading of a yardoc file." +msgstr "" +"== レジストリーをセーブ/ロードする\n" +"レジストリーは\"yardoc file\"(実際はディレクトリ)にセーブされ、\n" +"任意の検索を実行する為に、ロードできる。\n" +"yardocファイルのセーブやロードの情報は、\n" +"{Registry.load!} , {Registry.save}を参照。" + +# YARD::Registry +#: ../lib/yard/registry.rb:18 +msgid "" +"== Threading Notes\n" +"The registry class is a singleton class that is accessed directly in many\n" +"places across YARD. To mitigate threading issues, YARD (0.6.5+) makes\n" +"the Registry thread local. This means all access to a registry for a " +"specific\n" +"object set must occur in the originating thread." +msgstr "" +"== スレッドの注意\n" +"レジストリークラスは、YARD全体で直接アクセスされるシングルトンクラスとなる。\n" +"スレッドの問題を緩和するには、YARD(0.6.5+)でthread localなレジストリーを作る。\n" +"これはスレッドの中で固有のオブジェクトのグループが生成される、\n" +"レジストリーにアクセスする全てのものを意味する。" + +# @example Getting an object by a specific path +#: ../lib/yard/registry.rb:31 +msgid "Registry.at('YARD::CodeObjects::Base#docstring')" +msgstr "" + +# @example Loading a Registry +#: ../lib/yard/registry.rb:31 +msgid "" +"Registry.load!('/path/to/yardocfile') # loads all objects into memory\n" +"Registry.at('YARD::CodeObjects::Base').docstring\n" +"# => \"+Base+ is the superclass of all code objects ...\"" +msgstr "" + +# @example Performing a lookup on a method anywhere in the inheritance tree +#: ../lib/yard/registry.rb:31 +msgid "Registry.resolve(P('YARD::CodeObjects::Base'), '#docstring', true)" +msgstr "" + +# @example +#: ../lib/yard/registry.rb:31 +msgid "tag|example|Getting an object by a specific path" +msgstr "tag|example|パスによってオブジェクトを取得する" + +# @example +#: ../lib/yard/registry.rb:31 +msgid "tag|example|Loading the Registry" +msgstr "tag|example|レジストリーをロードする" + +# @example +#: ../lib/yard/registry.rb:31 +msgid "" +"tag|example|Performing a lookup on a method anywhere in the inheritance tree" +msgstr "tag|example|継承ツリーのどこでもメソッドで検索を実行する" + +# YARD::Registry.yardoc_file_for_gem +#: ../lib/yard/registry.rb:41 +msgid "Returns the .yardoc file associated with a gem." +msgstr "gemと共に関連した.yardocファイルを返す。" + +# YARD::Registry.yardoc_file_for_gem +# YARD::Registry.yardoc_file +# YARD::Registry.yardoc_file= +#: ../lib/yard/registry.rb:51 ../lib/yard/registry.rb:73 +#: ../lib/yard/registry.rb:75 ../lib/yard/registry.rb:76 +msgid "Getting .yardoc File Locations" +msgstr ".yardocファイルの場所を取得する。" + +# @param [String] ver_require +#: ../lib/yard/registry.rb:51 +msgid "an optional Gem version requirement" +msgstr "任意のGemのバージョン要求" + +# @return [String] +#: ../lib/yard/registry.rb:51 +msgid "" +"if +for_writing+ is set to +true+, returns the best\n" +"location suitable to write the .yardoc file. Otherwise, the first\n" +"existing location associated with the gem's .yardoc file." +msgstr "" +"+for_writing+ にtrueをセットした場合、\n" +".yardocファイルを書き込む為に最適な場所を返す。\n" +"若しくは、.yardocファイルに関連づけられた\n" +"既存の場所になる。" + +# @return [nil] +#: ../lib/yard/registry.rb:51 +msgid "" +"if +for_writing+ is set to false and no yardoc file\n" +"is found, returns nil." +msgstr "" +"+for_writing+ がfalseを設定する場合と、\n" +"yardocファイルが見つからない場合は、nilを返す。" + +# @param [Boolean] +#: ../lib/yard/registry.rb:51 +msgid "tag|param|for_writing" +msgstr "" + +# @param [String] +#: ../lib/yard/registry.rb:51 +msgid "tag|param|gem" +msgstr "" + +# @param [String] +#: ../lib/yard/registry.rb:51 +msgid "tag|param|ver_require" +msgstr "" + +# @param [String] gem +#: ../lib/yard/registry.rb:51 +msgid "the name of the gem to search for" +msgstr "検索するgemの名前" + +# @param [Boolean] for_writing +#: ../lib/yard/registry.rb:51 +msgid "" +"whether or not the method should search\n" +"for writable locations" +msgstr "メソッドが書き込み可能な場所を検索するかどうか" + +# YARD::Registry.yardoc_file +# YARD::Registry.yardoc_file= +#: ../lib/yard/registry.rb:71 +msgid "Gets/sets the yardoc filename" +msgstr "yardocのファイル名を取得/設定する。" + +# @see +#: ../lib/yard/registry.rb:73 ../lib/yard/registry.rb:75 +#: ../lib/yard/registry.rb:76 +msgid "tag|see|DEFAULT_YARDOC_FILE" +msgstr "" + +# @return [String] +#: ../lib/yard/registry.rb:73 ../lib/yard/registry.rb:75 +#: ../lib/yard/registry.rb:76 +msgid "the yardoc filename" +msgstr "yardocのファイル名" + +# YARD::Registry.load +#: ../lib/yard/registry.rb:83 +msgid "Loads the registry and/or parses a list of files" +msgstr "レジストリのロードやファイルのリストを解析する" + +# YARD::Registry.load +# YARD::Registry.load_yardoc +# YARD::Registry.load! +# YARD::Registry.load_all +#: ../lib/yard/registry.rb:97 ../lib/yard/registry.rb:118 +#: ../lib/yard/registry.rb:132 ../lib/yard/registry.rb:147 +msgid "Loading Data from Disk" +msgstr "ディスクから、データをロードする" + +# @example Loads the yardoc file or parses files 'a', 'b' and 'c' (but not both) +#: ../lib/yard/registry.rb:97 +msgid "Registry.load(['a', 'b', 'c'])" +msgstr "" + +# @example Reparses files 'a' and 'b' regardless of whether yardoc file exists +#: ../lib/yard/registry.rb:97 +msgid "Registry.load(['a', 'b'], true)" +msgstr "" + +# @param [String, Array] files +#: ../lib/yard/registry.rb:97 +msgid "" +"if +files+ is an Array, it should represent\n" +"a list of files that YARD should parse into the registry. If reload is\n" +"set to false and the yardoc file already exists, these files are skipped.\n" +"If files is a String, it should represent the yardoc file to load\n" +"into the registry." +msgstr "" +"+files+が配列の場合、YARDがレジストリーの中を解析するべきファイルのリストを表す。\n" +"reloadがfalseを設定された場合や、yardocファイルが既に存在する場合、\n" +"これらのファイルは、スキップされる。\n" +"ファイルがStringの場合、\n" +"レジストリーの中へロードするyardocファイルを表す。" + +# @raise [ArgumentError] +#: ../lib/yard/registry.rb:97 +msgid "if files is not a String or Array" +msgstr "ファイルがStringやArrayでない場合" + +# @param [Boolean] reparse +#: ../lib/yard/registry.rb:97 +msgid "" +"if reparse is false and a yardoc file already\n" +"exists, any files passed in will be ignored." +msgstr "" +"reparseがfalseの場合や、yardocファイルが既に存在する場合、\n" +"オプションの解析されるファイルは、無視される。" + +# @example +#: ../lib/yard/registry.rb:97 +msgid "" +"tag|example|Loads the yardoc file or parses files 'a', 'b' and 'c' (but not " +"both)" +msgstr "" +"yardocファイルをロードする。又は、'a','b','c'のファイルを解析する。(どちらか" +"だけ行う)" + +# @example +#: ../lib/yard/registry.rb:97 +msgid "" +"tag|example|Reparses files 'a' and 'b' regardless of whether yardoc file " +"exists" +msgstr "" +"yardocファイルが存在するかどうかにかかわらず、ファイル'a'と'b'を再解析する。" + +# @param [Boolean] +#: ../lib/yard/registry.rb:97 +msgid "tag|param|reparse" +msgstr "" + +# @return [Registry] +#: ../lib/yard/registry.rb:97 ../lib/yard/registry.rb:118 +#: ../lib/yard/registry.rb:132 ../lib/yard/registry.rb:147 +msgid "the registry object (for chaining)" +msgstr "レジストリオブジェクト(チェーン用)" + +# YARD::Registry.load_yardoc +#: ../lib/yard/registry.rb:115 +msgid "Loads a yardoc file directly" +msgstr "直接yardocファイルをロードする" + +# @param [String] file +#: ../lib/yard/registry.rb:118 +msgid "the yardoc file to load." +msgstr "ロードするyardocファイル" + +# YARD::Registry.load! +#: ../lib/yard/registry.rb:125 +msgid "" +"Loads a yardoc file and forces all objects cached on disk into\n" +"memory. Equivalent to calling {load_yardoc} followed by {load_all}" +msgstr "" +"yardocファイルをロードし、\n" +"メモリの中へディスク上の全てのキャッシュされるオブジェクトを強制する。\n" +"{load_all}に続いて呼び出す{load_yardoc}と同等である。" + +# @see +#: ../lib/yard/registry.rb:132 ../lib/yard/registry_store.rb:130 +msgid "tag|see|#load_all" +msgstr "" + +# @see +#: ../lib/yard/registry.rb:132 +msgid "tag|see|#load_yardoc" +msgstr "" + +# @param [String] file +#: ../lib/yard/registry.rb:132 +msgid "the yardoc file to load" +msgstr "ロードするyardocファイル" + +# YARD::Registry.load_all +#: ../lib/yard/registry.rb:139 +msgid "Forces all objects cached on disk into memory" +msgstr "メモリの中へディスク上のキャッシュされる全てのオブジェクトを強制する" + +# @example Loads all objects from disk +#: ../lib/yard/registry.rb:147 +msgid "" +"Registry.load\n" +"Registry.all.count #=> 0\n" +"Registry.load_all\n" +"Registry.all.count #=> 17" +msgstr "" + +# @example +#: ../lib/yard/registry.rb:147 +msgid "tag|example|Loads all objects from disk" +msgstr "ディスクから全てのオブジェクトをロードする" + +# YARD::Registry.save +#: ../lib/yard/registry.rb:155 +msgid "Saves the registry to +file+" +msgstr "+file+ をレジストリーにセーブする" + +# YARD::Registry.save +# YARD::Registry.delete_from_disk +#: ../lib/yard/registry.rb:158 ../lib/yard/registry.rb:164 +msgid "Saving and Deleting Data from Disk" +msgstr "ディスクからデータをセーブ/削除する。" + +# @param [String] file +#: ../lib/yard/registry.rb:158 +msgid "the yardoc file to save to" +msgstr "セーブされるyardocファイル" + +# @return [Boolean] +#: ../lib/yard/registry.rb:158 +msgid "true if the file was saved" +msgstr "ファイルがセーブされた場合、trueを返す" + +# YARD::Registry.delete_from_disk +#: ../lib/yard/registry.rb:163 +msgid "Deletes the yardoc file from disk" +msgstr "ディスクからyardocファイルを削除する" + +# YARD::Registry.register +#: ../lib/yard/registry.rb:171 +msgid "Registers a new object with the registry" +msgstr "リジストリを用い新しいオブジェクトを記録する" + +# YARD::Registry.register +# YARD::Registry.delete +# YARD::Registry.clear +#: ../lib/yard/registry.rb:174 ../lib/yard/registry.rb:182 +#: ../lib/yard/registry.rb:188 +msgid "Adding and Deleting Objects from the Registry" +msgstr "レジストリから、オブジェクトを追加,削除する。" + +# @return [CodeObjects::Base] +#: ../lib/yard/registry.rb:174 +msgid "the registered object" +msgstr "記録されたオブジェクト" + +# YARD::Registry.delete +#: ../lib/yard/registry.rb:180 +msgid "Deletes an object from the registry" +msgstr "レジストリーから、オブジェクトを削除する" + +# @param [CodeObjects::Base] object +#: ../lib/yard/registry.rb:182 +msgid "the object to remove" +msgstr "削除するオブジェクト" + +# YARD::Registry.clear +#: ../lib/yard/registry.rb:187 +msgid "Clears the registry" +msgstr "レジストリーを空にする" + +# YARD::Registry.each +# YARD::Registry.all +# YARD::Registry.paths +# YARD::Registry.at +# YARD::Registry.[] +# YARD::Registry.root +# YARD::Registry.resolve +# YARD::Registry.partial_resolve +#: ../lib/yard/registry.rb:195 ../lib/yard/registry.rb:211 +#: ../lib/yard/registry.rb:226 ../lib/yard/registry.rb:235 +#: ../lib/yard/registry.rb:236 ../lib/yard/registry.rb:240 +#: ../lib/yard/registry.rb:270 ../lib/yard/registry.rb:368 +msgid "Accessing Objects in the Registry" +msgstr "レジストリーの中でオブジェクトにアクセスする" + +# YARD::Registry.each +#: ../lib/yard/registry.rb:195 +msgid "Iterates over {all} with no arguments" +msgstr "引数無しで{all}を繰り返す。" + +# YARD::Registry.all +#: ../lib/yard/registry.rb:200 +msgid "" +"Returns all objects in the registry that match one of the types provided\n" +"in the +types+ list (if +types+ is provided)." +msgstr "" +"+types+ リスト(タイプが供給される場合 )\n" +"供給される型の一つにマッチするレジストリーの中でオブジェクトの全てを返す" + +# @example Returns all objects +#: ../lib/yard/registry.rb:211 +msgid "Registry.all" +msgstr "" + +# @example Returns all classes and modules +#: ../lib/yard/registry.rb:211 +msgid "Registry.all(:class, :module)" +msgstr "" + +# @param [Array] types +#: ../lib/yard/registry.rb:211 +msgid "" +"an optional list of types to narrow the\n" +"objects down by. Equivalent to performing a select:\n" +" +Registry.all.select {|o| types.include(o.type) }+" +msgstr "" +"任意の型のリストを絞り込む。次の選択と同様である。\n" +" +Registry.all.select {|o| types.include(o.type) }+" + +# @example +#: ../lib/yard/registry.rb:211 +msgid "tag|example|Returns all classes and modules" +msgstr "全てのクラスとモジュールを返す" + +# @example +#: ../lib/yard/registry.rb:211 +msgid "tag|example|Returns all objects" +msgstr "全てのオブジェクトを返す" + +# @param [Array] +# @param [Array] +#: ../lib/yard/registry.rb:211 ../lib/yard/tags/tag.rb:43 +msgid "tag|param|types" +msgstr "" + +# @see +#: ../lib/yard/registry.rb:211 +msgid "tag|see|CodeObjects::Base#type" +msgstr "" + +# @return [Array] +#: ../lib/yard/registry.rb:211 +msgid "the list of objects found" +msgstr "オブジェクトのリストをみつける" + +# YARD::Registry.paths +#: ../lib/yard/registry.rb:224 +msgid "Returns the paths of all of the objects in the registry." +msgstr "レジストリーの中の全てのオブジェクトのパスを返す" + +# @return [Array] +#: ../lib/yard/registry.rb:226 +msgid "all of the paths in the registry." +msgstr "レジストリーの中のパスの全て" + +# @param [Boolean] +#: ../lib/yard/registry.rb:226 ../lib/yard/registry_store.rb:80 +#: ../lib/yard/registry_store.rb:88 +msgid "tag|param|reload" +msgstr "" + +# @param [Boolean] reload +#: ../lib/yard/registry.rb:226 +msgid "whether to load entire database" +msgstr "データベース全体をロードするかどうか" + +# YARD::Registry.at +# YARD::Registry.[] +#: ../lib/yard/registry.rb:231 ../lib/yard/registry.rb:237 +msgid "Returns the object at a specific path." +msgstr "固有のパスでオブジェクトを返す" + +# @return [CodeObjects::Base] +#: ../lib/yard/registry.rb:235 +msgid "the object at path" +msgstr "パスのオブジェクト" + +# @param [String, :root] path +#: ../lib/yard/registry.rb:235 +msgid "" +"the pathname to look for. If +path+ is +root+,\n" +"returns the {root} object." +msgstr "" +"検索の為のパス名、 +path+ が +root+ の場合\n" +"{root}を返す。" + +# YARD::Registry.root +#: ../lib/yard/registry.rb:239 +msgid "The root namespace object." +msgstr "rootは名前空間オブジェクトとなる" + +# @return [CodeObjects::RootObject] +#: ../lib/yard/registry.rb:240 +msgid "the root object in the namespace" +msgstr "namespaceの中のrootオブジェクト" + +# YARD::Registry.resolve +#: ../lib/yard/registry.rb:243 +msgid "" +"Attempts to find an object by name starting at +namespace+, performing\n" +"a lookup similar to Ruby's method of resolving a constant in a namespace." +msgstr "" +"+namespace+ でnameで始まるオブジェクトが見つかるか試みる\n" +"namespaceの中で定数を解決するのに、Rubyメソッドと同様に検索を実行する。" + +# @param [Boolean] inheritance +#: ../lib/yard/registry.rb:270 +msgid "" +"Follows inheritance chain (mixins, superclass)\n" +"when performing name resolution if set to +true+." +msgstr "" +"+true+が設定された時、名前解決を実行する、継承のチェーン(mixin,superクラス)" + +# @param [Boolean] proxy_fallback +#: ../lib/yard/registry.rb:270 +msgid "" +"If +true+, returns a proxy representing\n" +"the unresolved path (namespace + name) if no object is found." +msgstr "" +"+true+の場合やオブジェクトが見つからなかった場合、\n" +"未解決のパス(namespace + name)を表すproxyを返す。" + +# @example Looks for instance method #reverse starting from A::B::C +#: ../lib/yard/registry.rb:270 +msgid "Registry.resolve(P(\"A::B::C\"), \"#reverse\")" +msgstr "" + +# @example Looks for a complex path from a namespace +#: ../lib/yard/registry.rb:270 +msgid "Registry.resolve(P('A::B'), 'B::D') # => #" +msgstr "Registry.resolve(P('A::B'), 'B::D') # => #" + +# @example Looks for a constant but returns a proxy if not found +#: ../lib/yard/registry.rb:270 +msgid "" +"Registry.resolve(P('A::B::C'), 'D', false, true) # => #" +msgstr "" + +# @example Looks for a class method respecting the inheritance tree +#: ../lib/yard/registry.rb:270 +msgid "Registry.resolve(myclass, 'mymethod', true)" +msgstr "" + +# @example Looks for a constant in the root namespace +#: ../lib/yard/registry.rb:270 +msgid "Registry.resolve(nil, 'CONSTANT')" +msgstr "" + +# @return [CodeObjects::Proxy] +#: ../lib/yard/registry.rb:270 +msgid "" +"a Proxy representing the object if\n" +"+proxy_fallback+ is +true+." +msgstr "+proxy_fallback+ が +true+の場合、オブジェクトを表すproxyとなる。" + +# @return [nil] +#: ../lib/yard/registry.rb:270 +msgid "if +proxy_fallback+ is +false+ and no object was found." +msgstr "+proxy_fallback+ が +false+ 又は、オブジェクトが見つからなかった場合" + +# @example +#: ../lib/yard/registry.rb:270 +msgid "tag|example|Looks for a class method respecting the inheritance tree" +msgstr "関連する継承ツリーのクラスメソッドを探す" + +# @example +#: ../lib/yard/registry.rb:270 +msgid "tag|example|Looks for a complex path from a namespace" +msgstr "namespaceから複雑なパスを検索する" + +# @example +#: ../lib/yard/registry.rb:270 +msgid "tag|example|Looks for a constant but returns a proxy if not found" +msgstr "定数を探すが、見つからない場合は、proxyを返す。" + +# @example +#: ../lib/yard/registry.rb:270 +msgid "tag|example|Looks for a constant in the root namespace" +msgstr "root namespaseの中の定数をを探す" + +# @example +#: ../lib/yard/registry.rb:270 +msgid "tag|example|Looks for instance method #reverse starting from A::B::C" +msgstr "A::B::Cで始まる、インスタンスメソッド#reverseを探す" + +# @param [Boolean] +#: ../lib/yard/registry.rb:270 +msgid "tag|param|inheritance" +msgstr "継承" + +# @param [Boolean] +#: ../lib/yard/registry.rb:270 +msgid "tag|param|proxy_fallback" +msgstr "" + +# @see +#: ../lib/yard/registry.rb:270 +msgid "tag|see|P" +msgstr "" + +# @param [String, Symbol] name +#: ../lib/yard/registry.rb:270 +msgid "" +"the name (or complex path) to look for from\n" +"+namespace+." +msgstr "+namespace+ から検索する名前(や複雑なパス)" + +# @return [CodeObjects::Base] +#: ../lib/yard/registry.rb:270 +msgid "the object if it is found" +msgstr "見つかったオブジェクト" + +# @param [CodeObjects::NamespaceObject, nil] namespace +#: ../lib/yard/registry.rb:270 +msgid "" +"the starting namespace\n" +"(module or class). If +nil+ or +:root+, starts from the {root} object." +msgstr "" +"始まりのnamespace(モジュールやクラス)。\n" +"+nil+ や +:root+ の場合、{root}オブジェクトから始まる。" + +# @param [Symbol, nil] type +#: ../lib/yard/registry.rb:270 +msgid "" +"the {CodeObjects::Base#type} that the resolved\n" +"object must be equal to. No type checking if nil." +msgstr "" + +# YARD::Registry.checksums +# YARD::Registry.checksum_for +#: ../lib/yard/registry.rb:317 ../lib/yard/registry.rb:323 +msgid "Managing Source File Checksums" +msgstr "ソースファイルチェックサムを管理する" + +# @return [Hash{String => String}] +#: ../lib/yard/registry.rb:317 +msgid "a set of checksums for files" +msgstr "ファイル用のチェックサムのグループ" + +# @param [String] data +#: ../lib/yard/registry.rb:323 +msgid "data to checksum" +msgstr "チェックサムするデータ" + +# @return [String] +#: ../lib/yard/registry.rb:323 +msgid "the SHA1 checksum for data" +msgstr "データのSHA1チェックサム" + +# YARD::Registry.single_object_db +# YARD::Registry.single_object_db= +#: ../lib/yard/registry.rb:330 +msgid "" +"Whether or not the Registry storage should load everything into a\n" +"single object database (for disk efficiency), or spread them out\n" +"(for load time efficiency)." +msgstr "" +"レジストリーストレージは単一のオブジェクトのデータベースの中へ\n" +"毎回ロードするか、(ディスク効率の為)\n" +"又は、データベースを展開する。(ロード時間効率の為)" + +# YARD::Registry.single_object_db +# YARD::Registry.single_object_db= +# YARD::Registry.proxy_types +#: ../lib/yard/registry.rb:337 ../lib/yard/registry.rb:339 +#: ../lib/yard/registry.rb:340 ../lib/yard/registry.rb:346 +msgid "Managing Internal State (Advanced / Testing Only)" +msgstr "内部の状態を管理する(Advanced / Testing Only)" + +# @note +#: ../lib/yard/registry.rb:337 ../lib/yard/registry.rb:339 +#: ../lib/yard/registry.rb:340 +msgid "" +"Setting this attribute to nil will offload the decision to\n" +"the {RegistryStore storage adapter}." +msgstr "" +"この属性にnilを設定すると、{RegistryStore storage adapter}の決定をunloadす" +"る。" + +# @return [Boolean, nil] +#: ../lib/yard/registry.rb:337 ../lib/yard/registry.rb:339 +#: ../lib/yard/registry.rb:340 +msgid "" +"if this value is set to nil, the storage\n" +"adapter will decide how to store the data." +msgstr "" +"この値にnilを設定した場合、\n" +"ストレージアダプターがデータを記録する方法を決める。" + +# YARD::Registry.proxy_types +#: ../lib/yard/registry.rb:343 +msgid "" +"The assumed types of a list of paths. This method is used by CodeObjects::" +"Base" +msgstr "" +"パスのリストの想定される型。このメソッドはCodeObjects::Baseによって利用され" +"る。" + +# @deprecated +#: ../lib/yard/registry.rb:346 +msgid "The registry no longer globally tracks proxy types." +msgstr "" + +# @return [{String => Symbol}] +#: ../lib/yard/registry.rb:346 +msgid "a set of unresolved paths and their assumed type" +msgstr "未解決のパスのグループやその想定される型" + +# YARD::Registry.instance +#: ../lib/yard/registry.rb:353 +msgid "The registry singleton instance." +msgstr "レジストリーのシングルトンインスタンス" + +# YARD::Registry.instance +#: ../lib/yard/registry.rb:356 +msgid "Legacy Methods" +msgstr "Legacy Methods" + +# @return [Registry] +#: ../lib/yard/registry.rb:356 +msgid "returns the registry instance" +msgstr "レジストリーインスタンスを返す" + +# @deprecated +#: ../lib/yard/registry.rb:356 +msgid "use Registry.methodname directly." +msgstr "直接Registry.methodnameを使う" + +# YARD::Registry.partial_resolve +#: ../lib/yard/registry.rb:363 +msgid "Attempts to resolve a name in a namespace" +msgstr "namespaceの中で名前の解決を試みる" + +# @param [String] name +#: ../lib/yard/registry.rb:368 +msgid "the name to look for" +msgstr "検索するname" + +# @param [CodeObjects::NamespaceObject] namespace +#: ../lib/yard/registry.rb:368 +msgid "the starting namespace" +msgstr "始まりのnamespace" + +# @param [Symbol, nil] type +#: ../lib/yard/registry.rb:368 +msgid "" +"the {CodeObjects::Base#type} that the resolved\n" +"object must be equal to" +msgstr "" + +# YARD::Registry.global_yardoc_file +# YARD::Registry.local_yardoc_file +#: ../lib/yard/registry.rb:385 ../lib/yard/registry.rb:395 +msgid "Retrieving yardoc File Locations" +msgstr "yardocファイルの場所を取り出す" + +# @since +#: ../lib/yard/registry.rb:409 ../lib/yard/registry.rb:414 +msgid "0.6.5" +msgstr "" + +# YARD::Registry.thread_local_store +# YARD::Registry.thread_local_store= +#: ../lib/yard/registry.rb:409 ../lib/yard/registry.rb:414 +msgid "Threading support" +msgstr "スレッドをサポート" + +# YARD::RegistryStore +#: ../lib/yard/registry_store.rb:5 +msgid "The data store for the {Registry}." +msgstr "{Registry}用のデータストア" + +# @see +#: ../lib/yard/registry_store.rb:8 +msgid "tag|see|Serializers::YardocSerializer" +msgstr "" + +# YARD::Registry.instance +#: ../lib/yard/registry_store.rb:10 ../lib/yard/registry_store.rb:213 +#: ../lib/yard/registry_store.rb:250 ../lib/yard/registry_store.rb:291 +#: ../lib/yard/serializers/yardoc_serializer.rb:36 +msgid "The registry no longer tracks proxy types" +msgstr "レジストリはプロキシタイプの追跡をしない" + +# YARD::RegistryStore#checksums +#: ../lib/yard/registry_store.rb:12 +msgid "Returns the value of attribute checksums" +msgstr "checksums属性の値を返す" + +# @return [RegistryStore] +#: ../lib/yard/registry_store.rb:13 +msgid "a new instance of RegistryStore" +msgstr "RegistryStoreの新しいインスタンス" + +# YARD::RegistryStore#get +# YARD::RegistryStore#[] +#: ../lib/yard/registry_store.rb:27 ../lib/yard/registry_store.rb:67 +msgid "Gets a {CodeObjects::Base} from the store" +msgstr "記録から{CodeObjects::Base}を取得する" + +# @return [CodeObjects::Base, nil] +#: ../lib/yard/registry_store.rb:31 +msgid "a code object or nil if none is found" +msgstr "コードオブジェクトか見つからない場合はnilを返す" + +# @param [String, Symbol] key +#: ../lib/yard/registry_store.rb:31 +msgid "" +"the path name of the object to look for.\n" +"If it is empty or :root, returns the {#root} object." +msgstr "" +"検索の為のオブジェクトのパス名。\n" +"空か:rootの場合、{#root}オブジェクトを返す。" + +# YARD::RegistryStore#put +# YARD::RegistryStore#[]= +#: ../lib/yard/registry_store.rb:49 ../lib/yard/registry_store.rb:68 +msgid "Associates an object with a path" +msgstr "パスと一緒にオブジェクトを関連付ける。" + +# @return [CodeObjects::Base] +#: ../lib/yard/registry_store.rb:52 +msgid "returns +value+" +msgstr "+value+ を返す" + +# @param [CodeObjects::Base] value +#: ../lib/yard/registry_store.rb:52 +msgid "the object to store" +msgstr "記録するオブジェクト" + +# @param [String, Symbol] key +#: ../lib/yard/registry_store.rb:52 +msgid "the path name (:root or '' for root object)" +msgstr "パス名(:rootやrootオブジェクト用の'')" + +# YARD::RegistryStore#put +# YARD::RegistryStore#[]= +#: ../lib/yard/registry_store.rb:70 +msgid "Deletes an object at a given path" +msgstr "与えられたパスでオブジェクトを削除する" + +# YARD::RegistryStore#keys +#: ../lib/yard/registry_store.rb:75 +msgid "" +"Gets all path names from the store. Loads the entire database\n" +"if +reload+ is +true+" +msgstr "" +"記録から全てのパス名を取得する。\n" +"+reload+ が +true+ の場合、全体のデータベースをロードする。" + +# @param [Boolean] reload +#: ../lib/yard/registry_store.rb:80 ../lib/yard/registry_store.rb:88 +msgid "" +"if false, does not load the entire database\n" +"before a lookup." +msgstr "falseの場合、検索の前に全体のデータベースをロードしない" + +# @return [Array] +#: ../lib/yard/registry_store.rb:80 +msgid "the path names of all the code objects" +msgstr "全てのコードオブジェクトのパス名" + +# YARD::RegistryStore#values +#: ../lib/yard/registry_store.rb:83 +msgid "" +"Gets all code objects from the store. Loads the entire database\n" +"if +reload+ is +true+" +msgstr "" +"記録から全てのパス名を取得する。\n" +"+reload+ が +true+ の場合、全体のデータベースをロードする。" + +# @return [Array] +#: ../lib/yard/registry_store.rb:88 +msgid "all the code objects" +msgstr "全てのコードオブジェクト" + +# @return [Array] +#: ../lib/yard/registry_store.rb:94 +msgid "" +"a list of object paths with a given\n" +"{CodeObjects::Base#type}" +msgstr "" + +# @param [String] name +#: ../lib/yard/registry_store.rb:94 ../lib/yard/registry_store.rb:103 +msgid "the type to look for" +msgstr "型用に検索する型" + +# @return [Array] +#: ../lib/yard/registry_store.rb:103 +msgid "" +"a list of objects with a given\n" +"{CodeObjects::Base#type}" +msgstr "" + +# @return [CodeObjects::RootObject] +#: ../lib/yard/registry_store.rb:109 +msgid "the root object" +msgstr "rootオブジェクト" + +# @param [String, nil] file +#: ../lib/yard/registry_store.rb:113 ../lib/yard/registry_store.rb:130 +msgid "the name of the yardoc db to load" +msgstr "ロードするyardoc dbの名前" + +# @return [Boolean] +#: ../lib/yard/registry_store.rb:113 ../lib/yard/registry_store.rb:130 +msgid "whether the database was loaded" +msgstr "データベースがロードされたかどうか" + +# YARD::RegistryStore#load! +#: ../lib/yard/registry_store.rb:124 +msgid "" +"Loads the .yardoc file and loads all cached objects into memory\n" +"automatically." +msgstr "" +".yardocファイルをロードしたり、\n" +"全てのキャッシュされたオブジェクトを自動的にメモリの中へロードする。" + +# YARD::RegistryStore#load_all +#: ../lib/yard/registry_store.rb:140 +msgid "Loads all cached objects into memory" +msgstr "メモリの中へ全てのキャッシュされたオブジェクトをロードする" + +# YARD::RegistryStore#save +#: ../lib/yard/registry_store.rb:160 +msgid "Saves the database to disk" +msgstr "ディスクにデータベースをセーブする" + +# @param [String, nil] file +#: ../lib/yard/registry_store.rb:164 +msgid "if supplied, the name of the file to save to" +msgstr "指定された場合、セーブするファイルの名前となる" + +# @param [Boolean] merge +#: ../lib/yard/registry_store.rb:164 +msgid "" +"if true, merges the data in memory with the\n" +"data on disk, otherwise the data on disk is deleted." +msgstr "" +"trueの場合、ディスク上のデータと共にメモリの中のデータをマージする。\n" +"そうでなければ、ディスク上のデータは削除される。" + +# @param [Boolean] +#: ../lib/yard/registry_store.rb:164 +msgid "tag|param|merge" +msgstr "" + +# @return [Boolean] +#: ../lib/yard/registry_store.rb:164 +msgid "whether the database was saved" +msgstr "データベースがセーブされるかどうか" + +# YARD::RegistryStore#destroy +#: ../lib/yard/registry_store.rb:186 +msgid "Deletes the .yardoc database on disk" +msgstr "ディスク上のデータベースの.yardocの削除" + +# @param [Boolean] force +#: ../lib/yard/registry_store.rb:192 +msgid "" +"if force is not set to true, the file/directory\n" +"will only be removed if it ends with .yardoc. This helps with\n" +"cases where the directory might have been named incorrectly." +msgstr "" +"forceにtrueが設定されず、そのファイルの末尾に.yardocが付く場合、\n" +"ファイル/ディレクトリは削除される。\n" +"これは、ディレクトリが間違って名付けられた場合、役立つだろう。" + +# @param [Boolean] +#: ../lib/yard/registry_store.rb:192 +msgid "tag|param|force" +msgstr "" + +# @return [Boolean] +#: ../lib/yard/registry_store.rb:192 +msgid "" +"true if the .yardoc database was deleted, false\n" +"otherwise." +msgstr "" +".yardocデータベースが削除された場合、true。\n" +"それ以外はfalse。" + +# YARD::Serializers::Base +#: ../lib/yard/serializers/base.rb:4 +msgid "" +"The abstract base serializer. Serializers allow templates to be\n" +"rendered to various endpoints. For instance, a {FileSystemSerializer}\n" +"would allow template contents to be written to the filesystem" +msgstr "" +"これは抽象的なベースのシリアライザとなる。\n" +"シリアライザは、様々なエンドポイントで表示される\n" +"テンプレートを受け入れる。\n" +"例えば、{FileSystemSerializer}は、\n" +"ファイルシステムに書かれる内容のテンプレートを受け入れる。" + +# YARD::Serializers::Base +#: ../lib/yard/serializers/base.rb:8 +msgid "" +"To implement a custom serializer, override the following methods:\n" +"* {#serialize}\n" +"* {#serialized_path}" +msgstr "" +"カスタムシリアライザを実装するには、次のメソッドを上書きする。:\n" +"* {#serialize}\n" +"* {#serialized_path}" + +# YARD::Serializers::Base +#: ../lib/yard/serializers/base.rb:12 +msgid "" +"Optionally, a serializer can implement before and after filters:\n" +"* {#before_serialize}\n" +"* {#after_serialize}" +msgstr "" +"任意で、シリアライザはフィルターの前後に実装できる。:\n" +"* {#before_serialize}\n" +"* {#after_serialize}" + +# @abstract +#: ../lib/yard/serializers/base.rb:16 +msgid "Override this class to implement a custom serializer." +msgstr "カスタムシリアライザを実装する為に、このクラスを上書きする。" + +# YARD::Serializers::Base#options +#: ../lib/yard/serializers/base.rb:18 +msgid "" +"All serializer options are saved so they can be passed to other serializers." +msgstr "" +"全てのシリアライザのオプションはセーブされるので、他のシリアライザに渡す事が" +"出来る。" + +# @return [SymbolHash] +#: ../lib/yard/serializers/base.rb:20 +msgid "the serializer options" +msgstr "シリアライザのオプション" + +# YARD::Serializers::Base#initialize +#: ../lib/yard/serializers/base.rb:25 +msgid "Creates a new serializer with options" +msgstr "オプションと共に新しいシリアライザを作成する。" + +# YARD::Serializers::Base#initialize +#: ../lib/yard/serializers/base.rb:27 +msgid "Creating a New Serializer" +msgstr "新しいシリアライザを作成する。" + +# @param [Hash] opts +#: ../lib/yard/serializers/base.rb:27 +msgid "the options to assign to {#options}" +msgstr "{#options}メソッドに割り当てるオプション" + +# YARD::Serializers::Base#serialize +#: ../lib/yard/serializers/base.rb:34 +msgid "Serializes an object." +msgstr "シリアライズするオブジェクト" + +# YARD::Serializers::Base#serialize +# YARD::Serializers::Base#serialized_path +# YARD::Serializers::Base#exists? +#: ../lib/yard/serializers/base.rb:41 ../lib/yard/serializers/base.rb:50 +#: ../lib/yard/serializers/base.rb:61 +msgid "Serializing an Object" +msgstr "シリアライズするオブジェクト" + +# @abstract +#: ../lib/yard/serializers/base.rb:41 +msgid "" +"This method should implement the logic that serializes\n" +"+data+ to the respective endpoint. This method should also call\n" +"the before and after callbacks {#before_serialize} and {#after_serialize}" +msgstr "" +"このメソッドはそれぞれのエンドポイントに +data+ をシリアライズするロジック" +"を\n" +"実装するべきである。\n" +"また、このメソッドは前後に{#before_serialize} と {#after_serialize}の\n" +"コールバックも呼び出すべきである。" + +# @param [String] data +#: ../lib/yard/serializers/base.rb:41 +msgid "the contents that should be serialized" +msgstr "シリアライズされるべき内容" + +# @param [CodeObjects::Base, String] object +#: ../lib/yard/serializers/base.rb:41 +msgid "" +"the object to serialize the\n" +"data for. The object can also be a string (for non-object serialization)" +msgstr "" +"オブジェクトのデータをシリアライズするオブジェクト、\n" +"このオブジェクトは文字列にもできる。(非オブジェクトをシリアライズする場合)" + +# YARD::Serializers::Base#serialized_path +#: ../lib/yard/serializers/base.rb:44 +msgid "The serialized path of an object" +msgstr "シリアライズされるオブジェクトのパス" + +# @abstract +#: ../lib/yard/serializers/base.rb:50 +msgid "" +"This method should return the path of the object on the\n" +"endpoint. For instance, for a file serializer, this should return\n" +"the filename that represents the object on disk." +msgstr "" +"このメソッドは、エンドポイント上のオブジェクトのパスを返す。\n" +"例えば、ファイルシリアライザは、ディスクの中のそのオブジェクトを表すファイル" +"名を返す。" + +# @param [CodeObjects::Base] object +#: ../lib/yard/serializers/base.rb:50 +msgid "the object to return a path for" +msgstr "パスを返す為のオブジェクト" + +# @return [String] +#: ../lib/yard/serializers/base.rb:50 +msgid "the serialized path of an object" +msgstr "シリアライズされたオブジェクトのパス" + +# YARD::Serializers::Base#exists? +#: ../lib/yard/serializers/base.rb:53 +msgid "Returns whether an object has been serialized" +msgstr "シリアライズされたオブジェクトかどうかを返す" + +# @abstract +#: ../lib/yard/serializers/base.rb:61 +msgid "" +"This method should return whether the endpoint already exists.\n" +"For instance, a file system serializer would check if the file exists\n" +"on disk. You will most likely use +#basepath+ and {#serialized_path} to\n" +"get the endpoint's location." +msgstr "" +"このメソッドは既にエンドポイントが存在するかどうかを返す。\n" +"例えば、ファイルがディスク上に存在する場合、\n" +"ファイルシステムシリアライザは、このチェックを行うだろう。\n" +"あなたは、恐らくエンドポイントの場所を取得する為に、\n" +"+#basepath+ や {#serialized_path} メソッドを使うだろう。" + +# @param [CodeObjects::Base] object +#: ../lib/yard/serializers/base.rb:61 +msgid "the object to check existence of" +msgstr "存在するかチェックするオブジェクト" + +# @return [Boolean] +#: ../lib/yard/serializers/base.rb:61 +msgid "whether the endpoint exists." +msgstr "エンドポイントが存在するかどうか" + +# YARD::Serializers::Base#before_serialize +#: ../lib/yard/serializers/base.rb:66 +msgid "Called before serialization." +msgstr "シリアライズする前に呼び出される" + +# YARD::Serializers::Base#before_serialize +# YARD::Serializers::Base#after_serialize +#: ../lib/yard/serializers/base.rb:70 ../lib/yard/serializers/base.rb:77 +msgid "Callbacks" +msgstr "" + +# @abstract +#: ../lib/yard/serializers/base.rb:70 +msgid "" +"Should run code before serialization. Should return false\n" +"if serialization should not occur." +msgstr "" +"シリアライズする前にコードを起動する。\n" +"シリアライズしても何も存在しない場合、falseを返す。" + +# @return [Boolean] +#: ../lib/yard/serializers/base.rb:70 +msgid "whether or not serialization should occur" +msgstr "シリアライズが存在するかどうか" + +# YARD::Serializers::Base#after_serialize +#: ../lib/yard/serializers/base.rb:73 +msgid "Called after serialization." +msgstr "後で呼び出されるシリアライズ" + +# @abstract +#: ../lib/yard/serializers/base.rb:77 +msgid "Should run code after serialization." +msgstr "後でシリアライズのコードを起動する" + +# @param [String] data +#: ../lib/yard/serializers/base.rb:77 +msgid "the data that was serialized." +msgstr "シリアライズされたデータ" + +# YARD::Serializers::FileSystemSerializer +#: ../lib/yard/serializers/file_system_serializer.rb:4 +msgid "Implements a serializer that reads from and writes to the filesystem." +msgstr "ファイルシステムに読み書き込みするシリアライザを実装する。" + +# YARD::Serializers::FileSystemSerializer#basepath +#: ../lib/yard/serializers/file_system_serializer.rb:6 +msgid "The base path to write data to." +msgstr "データに書き込む為のベースパス" + +# @return [String] +#: ../lib/yard/serializers/file_system_serializer.rb:7 +msgid "a base path" +msgstr "ベースパス" + +# YARD::Serializers::FileSystemSerializer#extension +#: ../lib/yard/serializers/file_system_serializer.rb:14 +msgid "The extension of the filename (defaults to +html+)" +msgstr "ファイル名の拡張子(デフォルトは +html+ )" + +# @return [String] +#: ../lib/yard/serializers/file_system_serializer.rb:16 +msgid "the extension of the file. Empty string for no extension." +msgstr "ファイルの拡張子。拡張子無しは空文字" + +# YARD::Serializers::FileSystemSerializer#initialize +#: ../lib/yard/serializers/file_system_serializer.rb:23 +msgid "Creates a new FileSystemSerializer with options" +msgstr "オプションと共に、新しいFileSystemSerializerを作成する。" + +# @return [FileSystemSerializer] +#: ../lib/yard/serializers/file_system_serializer.rb:27 +msgid "a new instance of FileSystemSerializer" +msgstr "FileSystemSerializerの新しいインスタンス" + +# YARD::Serializers::FileSystemSerializer#serialize +#: ../lib/yard/serializers/file_system_serializer.rb:34 +msgid "" +"Serializes object with data to its serialized path (prefixed by the " +"+#basepath+)." +msgstr "" +"パス(+#basepath+ がプレフィックスされる)をシリアライズする為、\n" +"データと共に、オブジェクトをシリアライズする。" + +# @return [String] +#: ../lib/yard/serializers/file_system_serializer.rb:36 +msgid "the written data (for chaining)" +msgstr "書き込まれるデータ(チェーン用)" + +# YARD::Serializers::FileSystemSerializer#serialized_path +#: ../lib/yard/serializers/file_system_serializer.rb:43 +msgid "Implements the serialized path of a code object." +msgstr "コードオブジェクトのシリアライズされるパスを実装する。" + +# @return [String] +#: ../lib/yard/serializers/file_system_serializer.rb:48 +msgid "" +"if object is a String, returns\n" +"object, otherwise the path on disk (without the basepath)." +msgstr "" +"オブジェクトがStringの場合、オブジェクトを返し、\n" +"それ以外は、ディスク上のパスを返す。(basepathを含まない)" + +# @param [CodeObjects::Base, CodeObjects::ExtraFileObject, String] object +#: ../lib/yard/serializers/file_system_serializer.rb:48 +msgid "" +"the object to get a path for. The path of a string is the string itself." +msgstr "パスを取得する為のオブジェクト。文字列のパスはその文字列自身を返す。" + +# YARD::Serializers::FileSystemSerializer#exists? +#: ../lib/yard/serializers/file_system_serializer.rb:66 +msgid "Checks the disk for an object and returns whether it was serialized." +msgstr "" +"オブジェクト用にディスクをチェックしたり、シリアライズされたかどうか返す。" + +# @param [CodeObjects::Base] object +#: ../lib/yard/serializers/file_system_serializer.rb:69 +msgid "the object to check" +msgstr "チェックするオブジェクト" + +# @return [Boolean] +#: ../lib/yard/serializers/file_system_serializer.rb:69 +msgid "whether an object has been serialized to disk" +msgstr "オブジェクトが既にディスクにシリアライズされているかどうか" + +# YARD::Serializers::FileSystemSerializer#encode_path_components +#: ../lib/yard/serializers/file_system_serializer.rb:76 +msgid "" +"Remove special chars from filenames.\n" +"Windows disallows \\ / : * ? \" < > | but we will just remove any\n" +"non alphanumeric (plus period, underscore and dash)." +msgstr "" + +# YARD::Serializers::ProcessSerializer +#: ../lib/yard/serializers/process_serializer.rb:4 +msgid "Serializes an object to a process (like less)" +msgstr "処理の為のオブジェクトをシリアライズする。(lessのような)" + +# @example Serializing to a pager (less) +#: ../lib/yard/serializers/process_serializer.rb:8 +msgid "" +"serializer = ProcessSerializer.new('less')\n" +"serializer.serialize(object, \"data!\")" +msgstr "" + +# @example +#: ../lib/yard/serializers/process_serializer.rb:8 +msgid "tag|example|Serializing to a pager (less)" +msgstr "ページャーをシリアライズする(less)" + +# YARD::Serializers::ProcessSerializer#initialize +#: ../lib/yard/serializers/process_serializer.rb:10 +msgid "Creates a new ProcessSerializer for the shell command +cmd+" +msgstr "シェルコマンド +cmd+ 用に新しいProcessSerializerを作成する。" + +# @return [ProcessSerializer] +#: ../lib/yard/serializers/process_serializer.rb:12 +msgid "a new instance of ProcessSerializer" +msgstr "ProcessSerializerの新しいインスタンス" + +# @param [String] +#: ../lib/yard/serializers/process_serializer.rb:12 +msgid "tag|param|cmd" +msgstr "" + +# @param [String] cmd +#: ../lib/yard/serializers/process_serializer.rb:12 +msgid "the command that will accept data on stdin" +msgstr "標準入力上でデータを受け入れるコマンド" + +# YARD::Serializers::ProcessSerializer#serialize +#: ../lib/yard/serializers/process_serializer.rb:17 +msgid "" +"Overrides serialize behaviour and writes data to standard input\n" +"of the associated command" +msgstr "" +"シリアライズの挙動を上書きし、\n" +"関連付けられたコマンドの標準入力にデータを書き込む。" + +# YARD::Serializers::StdoutSerializer +#: ../lib/yard/serializers/stdout_serializer.rb:4 +msgid "A serializer that writes data to standard output." +msgstr "標準出力にデータを書くシリアライザ" + +# YARD::Serializers::StdoutSerializer#initialize +#: ../lib/yard/serializers/stdout_serializer.rb:6 +msgid "Creates a serializer to print text to stdout" +msgstr "標準出力にテキストをプリントするシリアライザを作成する。" + +# @return [StdoutSerializer] +#: ../lib/yard/serializers/stdout_serializer.rb:9 +msgid "a new instance of StdoutSerializer" +msgstr "StdoutSerializerの新しいインスタンス" + +# @param [Fixnum, nil] wrap +#: ../lib/yard/serializers/stdout_serializer.rb:9 +msgid "" +"if wrap is a number, wraps text to +wrap+\n" +"columns, otherwise no wrapping is done." +msgstr "" +"wrapが数字の場合、+wrap+ カラムにテキストをラップする。\n" +"それ以外では、ラップは行わない。" + +# @param [Fixnum, nil] +#: ../lib/yard/serializers/stdout_serializer.rb:9 +msgid "tag|param|wrap" +msgstr "" + +# YARD::Serializers::StdoutSerializer#serialize +#: ../lib/yard/serializers/stdout_serializer.rb:14 +msgid "Overrides serialize behaviour to write data to standard output" +msgstr "標準出力にデータを書き込む為にシリアライズの挙動を上書きする。" + +# YARD::Serializers::StdoutSerializer#word_wrap +#: ../lib/yard/serializers/stdout_serializer.rb:21 +msgid "Wraps text to a specific column length" +msgstr "特定のカラムの長さにテキストをラップする。" + +# @param [Fixnum] +#: ../lib/yard/serializers/stdout_serializer.rb:25 +msgid "tag|param|length" +msgstr "" + +# @param [Fixnum] length +#: ../lib/yard/serializers/stdout_serializer.rb:25 +msgid "the column length to wrap to" +msgstr "ラップの為のカラムの長さ" + +# @param [String] text +#: ../lib/yard/serializers/stdout_serializer.rb:25 +msgid "the text to wrap" +msgstr "ラップされるテキスト" + +# @return [String] +#: ../lib/yard/serializers/stdout_serializer.rb:25 +msgid "the wrapped text" +msgstr "ラップされたテキスト" + +# YARD::StubProxy +#: ../lib/yard/serializers/yardoc_serializer.rb:3 +msgid "Stubs marshal dumps and acts a delegate class for an object by path" +msgstr "" +"引抜き、選別し、出力する。オブジェクトがパスによって委譲クラスのように振る舞" +"う" + +# @return [StubProxy] +#: ../lib/yard/serializers/yardoc_serializer.rb:12 +msgid "a new instance of StubProxy" +msgstr "StubProxyの新しいインスタンス" + +# @return [YardocSerializer] +#: ../lib/yard/serializers/yardoc_serializer.rb:30 +msgid "a new instance of YardocSerializer" +msgstr "YardocSerializerの新しいインスタンス" + +# YARD::Server.register_static_path +#: ../lib/yard/server.rb:4 +msgid "Registers a static path to be used in static asset lookup." +msgstr "静的な資源の検索の中で利用される静的パスを記録する。" + +# @param [String] path +#: ../lib/yard/server.rb:7 +msgid "the pathname to register" +msgstr "記録する為のパス名" + +# YARD::Server::FinishRequest +#: ../lib/yard/server/adapter.rb:5 +msgid "" +"Short circuits a request by raising an error. This exception is caught\n" +"by {Commands::Base#call} to immediately end a request and return a response." +msgstr "" +"エラーを上げることによってリクエストを省く。\n" +"この例外はすぐに、リクエストの終了とレスポンスを返す為に\n" +"{Commands::Base#call} によってキャッチされる。" + +# YARD::Server::NotFoundError +#: ../lib/yard/server/adapter.rb:9 +msgid "" +"Raises an error if a resource is not found. This exception is caught by\n" +"{Commands::Base#call} to immediately end a request and return a 404 " +"response\n" +"code. If a message is provided, the body is set to the exception message." +msgstr "" +"リソースが見つからない場合、エラーを上げる。\n" +"この例外は、すぐにリクエストの終りと404レスポンスコードを返す為に\n" +"{Commands::Base#call}によってキャッチされる。\n" +"メッセージが提供される場合、本体に、例外メッサージが設定される。" + +# YARD::Server::Adapter +#: ../lib/yard/server/adapter.rb:14 +msgid "" +"This class implements the bridge between the {Router} and the server\n" +"backend for a specific server type. YARD implements concrete adapters\n" +"for WEBrick and Rack respectively, though other adapters can be made\n" +"for other server architectures." +msgstr "" +"このクラスは {Router} と固有のサーバータイプ用にサーバーバックエンドの間の\n" +"ブリッジを実装する。\n" +"YARDはWEBrickとRackそれぞれに\n" +"具体的なアダプターを実装するけれども、\n" +"他のアダプターを、他のサーバーアーキテクチャ用に作る事も出来る。" + +# YARD::Server::Adapter +#: ../lib/yard/server/adapter.rb:19 +msgid "" +"== Subclassing Notes\n" +"To create a concrete adapter class, implement the {#start} method to\n" +"initiate the server backend." +msgstr "" +"== サブクラス化する注意\n" +"具体的なアダプタークラスを作成するには、\n" +"サーバーバックエンドを開始する為に{#start}メソッドを実装する。" + +# @return [String] +#: ../lib/yard/server/adapter.rb:27 +msgid "" +"the location where static files are located, if any.\n" +"To set this field on initialization, pass +:DocumentRoot+ to the\n" +"+server_opts+ argument in {#initialize}" +msgstr "" +"任意で、スタティックファイルが示される場所。\n" +"初期にこのフィールドを設定するには、\n" +"{#initialize}メソッドの中の +server_opts+ 引数に\n" +"+:DocumentRoot+ を渡す。" + +# @see LibraryVersion +#: ../lib/yard/server/adapter.rb:32 +msgid "LibraryVersion for information on building a list of libraries" +msgstr "" + +# @return [Hash{String=>Array}] +#: ../lib/yard/server/adapter.rb:32 +msgid "a map of libraries." +msgstr "ライブラリのマップ" + +# @see +#: ../lib/yard/server/adapter.rb:32 +msgid "tag|see|#add_library" +msgstr "" + +# @see +#: ../lib/yard/server/adapter.rb:32 ../lib/yard/server/library_version.rb:105 +#: ../lib/yard/server/library_version.rb:111 +msgid "tag|see|LibraryVersion" +msgstr "" + +# @return [Hash] +#: ../lib/yard/server/adapter.rb:36 +msgid "" +"options passed and processed by adapters. The actual\n" +"options mostly depend on the adapters themselves." +msgstr "" +"アダプターによって渡され、処理されたoptions。\n" +"実際のoptionsの大抵は、アダプター自身に依存する。" + +# @return [Hash] +#: ../lib/yard/server/adapter.rb:40 +msgid "" +"a set of options to pass to the server backend. Note\n" +"that +:DocumentRoot+ also sets the {#document_root}." +msgstr "" +"サーバーのバックエンドに渡す為のoptionsのグループ\n" +"次の事に留意する。 +:DocumentRoot+ は {#document_root} にも設定する。" + +# @return [Router] +#: ../lib/yard/server/adapter.rb:43 +msgid "the router object used to route URLs to commands" +msgstr "コマンドにURLを送る為に利用された、routerオブジェクト" + +# YARD::Server::Adapter.setup +#: ../lib/yard/server/adapter.rb:46 +msgid "Performs any global initialization for the adapter." +msgstr "アダプター用に任意で全体の初期化を実行する。" + +# @note +#: ../lib/yard/server/adapter.rb:48 ../lib/yard/server/adapter.rb:56 +msgid "If you subclass this method, make sure to call +super+." +msgstr "" +"あなたがこのメソッドをサブクラス化する場合、\n" +"+super+ を呼び出すか確認する事。" + +# YARD::Server::Adapter.shutdown +#: ../lib/yard/server/adapter.rb:54 +msgid "Performs any global shutdown procedures for the adapter." +msgstr "任意で全体的なアダプター用の手続きのシャットダウンを実行する。" + +# YARD::Server::Adapter#initialize +#: ../lib/yard/server/adapter.rb:62 +msgid "Creates a new adapter object" +msgstr "新しいアダプターオブジェクトを作成する。" + +# @param [Hash{String=>Array}] libs +#: ../lib/yard/server/adapter.rb:71 +msgid "" +"a list of libraries,\n" +"see {#libraries} for formulating this list." +msgstr "" +"ライブラリのリスト、\n" +"このリストを公式化する為には、{#librathries}を参照。" + +# @return [Adapter] +#: ../lib/yard/server/adapter.rb:71 +msgid "a new instance of Adapter" +msgstr "アダプターの新しいインスタンス" + +# @param [Hash] opts +#: ../lib/yard/server/adapter.rb:71 +msgid "extra options to pass to the adapter" +msgstr "アダプターに渡す為の追加のoptions" + +# @param [Hash{String=>Array}] +#: ../lib/yard/server/adapter.rb:71 +msgid "tag|param|libs" +msgstr "" + +# YARD::Server::Adapter#add_library +#: ../lib/yard/server/adapter.rb:85 +msgid "Adds a library to the {#libraries} mapping for a given library object." +msgstr "" +"与えられたライブラリオブジェクト用の{#libraries}マッピングにライブラリを追加" +"する。" + +# @param [LibraryVersion] library +#: ../lib/yard/server/adapter.rb:88 +msgid "a library to add" +msgstr "追加する為のライブラリ" + +# @example Adding a new library to an adapter +#: ../lib/yard/server/adapter.rb:88 +msgid "" +"adapter.add_library LibraryVersion.new('mylib', '1.0', '/path/to/.yardoc')" +msgstr "" + +# @example +#: ../lib/yard/server/adapter.rb:88 +msgid "tag|example|Adding a new library to an adapter" +msgstr "アダプターに新しいライブラリを追加する。" + +# YARD::Server::Adapter#start +#: ../lib/yard/server/adapter.rb:94 +msgid "Implement this method to connect your adapter to your server." +msgstr "" +"あなたのサーバーにあなたのアダプターを接続する為に、このメソッドを実装する。" + +# YARD::Server::Commands::Base +#: ../lib/yard/server/commands/base.rb:7 +msgid "" +"This is the base command class used to implement custom commands for\n" +"a server. A command will be routed to by the {Router} class and return\n" +"a Rack-style response." +msgstr "" +"これは、サーバー用にカスタムコマンドを実装する為に、\n" +"利用されるベースコマンドクラスである。\n" +"コマンドは、{Router}クラスによって送られ、Rackスタイルのレスポンスを返す。" + +# YARD::Server::Commands::Base +#: ../lib/yard/server/commands/base.rb:11 +msgid "" +"== Attribute Initializers\n" +"All attributes can be initialized via options passed into the {#initialize}\n" +"method. When creating a custom command, the {Adapter#options} will\n" +"automatically be mapped to attributes by the same name on your class." +msgstr "" +"== 初期化子の属性\n" +"全ての属性は、{#initialize}メソッドへ渡されたoptions経由でイニシャライズされ" +"る。\n" +"カスタムメソッドが作成される時、{Adapter#options}メソッドは、\n" +"あなたのクラスの属性と同じ名前で自動的にマッピングされるだろう。" + +# YARD::Server::Commands::Base +#: ../lib/yard/server/commands/base.rb:16 +msgid "" +" class MyCommand < Base\n" +" attr_accessor :myattr\n" +" end" +msgstr "" + +# YARD::Server::Commands::Base +#: ../lib/yard/server/commands/base.rb:20 +msgid " Adapter.new(libs, {:myattr => 'foo'}).start" +msgstr "" + +# YARD::Server::Commands::Base +#: ../lib/yard/server/commands/base.rb:22 +msgid " # when a request comes in, cmd.myattr == 'foo'" +msgstr "" + +# YARD::Server::Commands::Base +#: ../lib/yard/server/commands/base.rb:24 +msgid "" +"== Subclassing Notes\n" +"To implement a custom command, override the {#run} method, not {#call}.\n" +"In your implementation, you should set the body and status for requests.\n" +"See details in the +#run+ method documentation." +msgstr "" +"== サブクラス化する時の注意\n" +"カスタムコマンドを実装するには、{#run}メソッドを上書きする({#call}メソッドで" +"はない)。\n" +"あなたの実装で、あなたがボディと、リクエスト用のステータスを設定するべきであ" +"る。\n" +"詳細は +#run+ メソッドのドキュメントを参照。" + +# YARD::Server::Commands::Base +#: ../lib/yard/server/commands/base.rb:29 +msgid "" +"Note that if your command deals directly with libraries, you should\n" +"consider subclassing the more specific {LibraryCommand} class instead." +msgstr "" +"次の事に留意する。あなたのコマンドが\n" +"直接ライブラリを用い処理する場合、代わりに、\n" +"サブクラス化する{LibraryCommand}クラスの詳細を考慮するべきである。" + +# YARD::Server::Commands::Base#command_options +# YARD::Server::Commands::Base#command_options= +# YARD::Server::Commands::Base#adapter +# YARD::Server::Commands::Base#adapter= +# YARD::Server::Commands::Base#caching +# YARD::Server::Commands::Base#caching= +#: ../lib/yard/server/commands/base.rb:37 +#: ../lib/yard/server/commands/base.rb:40 +#: ../lib/yard/server/commands/base.rb:43 +msgid "Basic Command and Adapter Options" +msgstr "基本的なコマンドとアダプターオプション" + +# @return [Hash] +#: ../lib/yard/server/commands/base.rb:37 +msgid "the options passed to the command's constructor" +msgstr "コマンドのコンストラクタに渡されたoptions" + +# @return [Adapter] +#: ../lib/yard/server/commands/base.rb:40 +msgid "the server adapter" +msgstr "サーバーアダプター" + +# @return [Boolean] +#: ../lib/yard/server/commands/base.rb:43 +msgid "whether to cache" +msgstr "キャッシュするかどうか" + +# YARD::Server::Commands::Base#request +# YARD::Server::Commands::Base#request= +# YARD::Server::Commands::Base#path +# YARD::Server::Commands::Base#path= +# YARD::Server::Commands::Base#headers +# YARD::Server::Commands::Base#headers= +# YARD::Server::Commands::Base#status +# YARD::Server::Commands::Base#status= +# YARD::Server::Commands::Base#body +# YARD::Server::Commands::Base#body= +#: ../lib/yard/server/commands/base.rb:48 +#: ../lib/yard/server/commands/base.rb:51 +#: ../lib/yard/server/commands/base.rb:54 +#: ../lib/yard/server/commands/base.rb:57 +#: ../lib/yard/server/commands/base.rb:60 +msgid "Attributes Set Per Request" +msgstr "リクエスト毎のグループを属性化する。" + +# @return [Request] +#: ../lib/yard/server/commands/base.rb:48 +msgid "request object" +msgstr "オブジェクトのリクエスト" + +# @return [String] +#: ../lib/yard/server/commands/base.rb:51 +msgid "the path after the command base URI" +msgstr "コマンドのベースURIの後で返す、パス" + +# @return [Hash{String => String}] +#: ../lib/yard/server/commands/base.rb:54 +msgid "response headers" +msgstr "ヘッダーのレスポンス" + +# @return [Numeric] +#: ../lib/yard/server/commands/base.rb:57 +msgid "status code. Defaults to 200 per request" +msgstr "コードの状態。デフォルトで200リクエスト毎。" + +# @return [String] +#: ../lib/yard/server/commands/base.rb:60 +msgid "the response body. Defaults to empty string." +msgstr "ボディのレスポンス。デフォルトでは空の文字列になる。" + +# YARD::Server::Commands::Base#initialize +#: ../lib/yard/server/commands/base.rb:65 +msgid "" +"Creates a new command object, setting attributes named by keys\n" +"in the options hash. After initialization, the options hash\n" +"is saved in {#command_options} for further inspection." +msgstr "" +"新しいコマンドオブジェクトを作成し、\n" +"ハッシュオプションのキーによって、名付けられた属性をセッティングする。\n" +"イニシャライズの後でハッシュのオプションは、\n" +"調査を進める為に{#command_options}メソッドの中でセーブされる。" + +# YARD::Server::Commands::Base#initialize +# YARD::Server::Commands::Base#call +#: ../lib/yard/server/commands/base.rb:74 +#: ../lib/yard/server/commands/base.rb:88 +msgid "Instance Method Summary" +msgstr "インスタンスメソッドの概要" + +# @example Creating a Command +#: ../lib/yard/server/commands/base.rb:74 +msgid "" +"cmd = DisplayObjectCommand.new(:caching => true, :library => mylib)\n" +"cmd.library # => mylib\n" +"cmd.command_options # => {:caching => true, :library => mylib}" +msgstr "" + +# @example +#: ../lib/yard/server/commands/base.rb:74 +msgid "tag|example|Creating a Command" +msgstr "コマンドを作成する" + +# @param [Hash] opts +#: ../lib/yard/server/commands/base.rb:74 +msgid "" +"the options hash, saved to {#command_options}\n" +"after initialization." +msgstr "" +"ハッシュのオプション、イニシャライズされた後で、\n" +"{#command_options}にセーブされる。" + +# YARD::Server::Commands::Base#call +#: ../lib/yard/server/commands/base.rb:82 +msgid "The main method called by a router with a request object." +msgstr "" +"主なメソッドは、requestオブジェクトを用い\n" +"routerによって呼び出される。" + +# @note +#: ../lib/yard/server/commands/base.rb:88 +msgid "" +"This command should not be overridden by subclasses. Implement\n" +"the callback method {#run} instead." +msgstr "" +"このコマンドは、サブクラスによって上書きされるべきではない、\n" +"代わりにコールバックの{#run}メソッドを実装する。" + +# @return [Array(Number,Hash,Array)] +#: ../lib/yard/server/commands/base.rb:88 +msgid "" +"a Rack-style response\n" +"of status, headers, and body wrapped in an array." +msgstr "" +"配列でラップされた\n" +"Rackスタイルのステータス、ヘッダー、ボディのレスポンス" + +# @param [Adapter Dependent] +#: ../lib/yard/server/commands/base.rb:88 ../lib/yard/server/router.rb:52 +msgid "tag|param|request" +msgstr "" + +# @param [Adapter Dependent] request +#: ../lib/yard/server/commands/base.rb:88 ../lib/yard/server/router.rb:52 +msgid "the request object" +msgstr "リクエストするオブジェクト" + +# YARD::Server::Commands::Base#run +#: ../lib/yard/server/commands/base.rb:108 +msgid "" +"Subclass this method to implement a custom command. This method\n" +"should set the {#status} and {#body}, and optionally modify the\n" +"{#headers}. Note that +#status+ defaults to 200." +msgstr "" +"カスタムコマンドを実装する為にこのメソッドをサブクラス化する。\n" +"このメソッドは、{#status}と{#body}を設定するべきで、\n" +"任意で、{#headers}を変更する。\n" +"留意する事として、 +#status+ はデフォルトで200になる。" + +# YARD::Server::Commands::Base#run +#: ../lib/yard/server/commands/base.rb:122 +msgid "Abstract Methods" +msgstr "抽象メソッド" + +# @example A custom command +#: ../lib/yard/server/commands/base.rb:122 +msgid "" +"class ErrorCommand < Base\n" +" def run\n" +" self.body = 'ERROR! The System is down!'\n" +" self.status = 500\n" +" self.headers['Conten-Type'] = 'text/plain'\n" +" end\n" +"end" +msgstr "" + +# @example +#: ../lib/yard/server/commands/base.rb:122 +msgid "tag|example|A custom command" +msgstr "カスタムコマンド" + +# YARD::Server::Commands::Base#render +#: ../lib/yard/server/commands/base.rb:131 +msgid "" +"Renders a specific object if provided, or a regular template rendering\n" +"if object is not provided." +msgstr "" +"提供された場合、特定のオブジェクトを表示するか、\n" +"オブジェクトが提供されない場合、規定のテンプレートが表示される。" + +# YARD::Server::Commands::Base#render +# YARD::Server::Commands::Base#cache +# YARD::Server::Commands::Base#not_found +# YARD::Server::Commands::Base#redirect +#: ../lib/yard/server/commands/base.rb:138 +#: ../lib/yard/server/commands/base.rb:159 +#: ../lib/yard/server/commands/base.rb:174 +#: ../lib/yard/server/commands/base.rb:184 +msgid "Helper Methods" +msgstr "ヘルパーメソッド" + +# @todo +#: ../lib/yard/server/commands/base.rb:138 +msgid "" +"This method is dependent on +#options+, it should be in {LibraryCommand}." +msgstr "" +"このメソッドは、 +#options+ メソッドに依存している。\n" +"+#options+ メソッドは {LibraryCommand} にするべきである。" + +# @param [CodeObjects::Base, nil] object +#: ../lib/yard/server/commands/base.rb:138 +msgid "" +"calls {CodeObjects::Base#format} if\n" +"an object is provided, or {Templates::Engine.render} if object is nil. Both\n" +"receive +#options+ as an argument." +msgstr "" +"オブジェクトが提供される場合、\n" +"{CodeObjects::Base#format}を呼び出す、\n" +"又は、オブジェクトがnilの場合\n" +"{Templates::Engine.render}を呼び出す。\n" +"両者は、引数として +#options+ メソッドを受け取る。" + +# @return [String] +#: ../lib/yard/server/commands/base.rb:138 +msgid "the resulting output to display" +msgstr "表示する出力結果" + +# YARD::Server::Commands::Base#cache +#: ../lib/yard/server/commands/base.rb:150 +msgid "Override this method to implement custom caching mechanisms for" +msgstr "カスタムキャッシュメカニズムを実装する為にこのメソッドを上書きする。" + +# @example Caching to memory +#: ../lib/yard/server/commands/base.rb:159 +msgid "" +"$memory_cache = {}\n" +"def cache(data)\n" +" $memory_cache[path] = data\n" +"end" +msgstr "" + +# @example +#: ../lib/yard/server/commands/base.rb:159 +msgid "tag|example|Caching to memory" +msgstr "メモリーにキャッシュする" + +# @see +#: ../lib/yard/server/commands/base.rb:159 +msgid "tag|see|StaticCaching" +msgstr "" + +# @param [String] data +#: ../lib/yard/server/commands/base.rb:159 +msgid "the data to cache" +msgstr "キャッシュするデータ" + +# @return [String] +#: ../lib/yard/server/commands/base.rb:159 +msgid "the same cached data (for chaining)" +msgstr "同じキャッシュされたデータ(メソッドチェーン用)" + +# YARD::Server::Commands::Base#not_found +#: ../lib/yard/server/commands/base.rb:171 +msgid "" +"Sets the body and headers (but not status) for a 404 response. Does\n" +"nothing if the body is already set." +msgstr "" +"404レスポンス用にボディとヘッダー(しかしステータスはない)を設定する。\n" +"ボディが既に設定されている場合は何もしない。" + +# YARD::Server::Commands::Base#redirect +#: ../lib/yard/server/commands/base.rb:182 +msgid "Sets the headers and status code for a redirection to a given URL" +msgstr "" +"与えられたURLへのリダイレクト用にヘッダーとステータスコードを設定する。" + +# @raise [FinishRequest] +#: ../lib/yard/server/commands/base.rb:184 +msgid "causes the request to terminate." +msgstr "打ち切る為にリクエストする。" + +# @param [String] +#: ../lib/yard/server/commands/base.rb:184 +#: ../lib/yard/templates/helpers/base_helper.rb:138 +msgid "tag|param|url" +msgstr "" + +# @param [String] url +#: ../lib/yard/server/commands/base.rb:184 +msgid "the URL to redirect to" +msgstr "リダイレクトするURL" + +# YARD::Server::Commands::DisplayFileCommand +#: ../lib/yard/server/commands/display_file_command.rb:5 +msgid "Displays a README or extra file." +msgstr "README 又は、追加のファイルを表示する。" + +# @todo +#: ../lib/yard/server/commands/display_file_command.rb:7 +msgid "Implement better support for detecting binary (image) filetypes" +msgstr "バイナリ(画像)ファイルタイプを見つける為のより良いサポートを実装する。" + +# YARD::Server::Commands::DisplayObjectCommand +#: ../lib/yard/server/commands/display_object_command.rb:5 +msgid "Displays documentation for a specific object identified by the path" +msgstr "パスによって識別された固有のオブジェクト用にドキュメントを表示する。" + +# YARD::Server::Commands::FramesCommand +#: ../lib/yard/server/commands/frames_command.rb:5 +msgid "Displays an object wrapped in frames" +msgstr "フレームの中のラップされたオブジェクトを表示する。" + +# YARD::Server::Commands::LibraryCommand +#: ../lib/yard/server/commands/library_command.rb:26 +msgid "" +"This is the base command for all commands that deal directly with " +"libraries.\n" +"Some commands do not, but most (like {DisplayObjectCommand}) do. If your\n" +"command deals with libraries directly, subclass this class instead.\n" +"See {Base} for notes on how to subclass a command." +msgstr "" +"これは、ライブラリを用い直接処理する全てのコマンドの為のベースコマンド。\n" +"いくつかのコマンドには、用いないが({DisplayObjectCommand}のように)大抵の事は" +"行う。\n" +"あなたのコマンドが直接ライブラリを用い処理する場合、代わりにこのクラスをサブ" +"クラス化する。\n" +"コマンドをサブクラス化する為の方法については{Base}を参照。\n" + +# @return [LibraryVersion] +#: ../lib/yard/server/commands/library_command.rb:33 +msgid "the object containing library information" +msgstr "ライブラリの情報含んでいるオブジェクト" + +# @return [Hash{Symbol => Object}] +#: ../lib/yard/server/commands/library_command.rb:36 +msgid "default options for the library" +msgstr "ライブラリ用のデフォルトのoptions" + +# @return [Serializers::Base] +#: ../lib/yard/server/commands/library_command.rb:39 +msgid "the serializer used to perform file linking" +msgstr "ファイルリンクを実行する為に利用されるシリアライザ" + +# @return [Boolean] +#: ../lib/yard/server/commands/library_command.rb:42 +msgid "whether router should route for multiple libraries" +msgstr "routerが複数のライブラリ用に送るべきかどうか" + +# @return [Boolean] +#: ../lib/yard/server/commands/library_command.rb:45 +msgid "whether to reparse data" +msgstr "データを再解析するかどうか" + +# YARD::Server::Commands::LibraryCommand::@@library_chdir_lock +#: ../lib/yard/server/commands/library_command.rb:48 +msgid "Needed to synchronize threads in {#setup_yardopts}" +msgstr "{#setup_yardopts}メソッドの中で、スレッドを同期する為の必要とされる" + +# @return [LibraryCommand] +#: ../lib/yard/server/commands/library_command.rb:51 +msgid "a new instance of LibraryCommand" +msgstr "LibraryCommandの新しいインスタンス" + +# YARD::Server::Commands::LibraryCommand#fulldoc_template +#: ../lib/yard/server/commands/library_command.rb:127 +msgid "" +"Hack to load a custom fulldoc template object that does\n" +"not do any rendering/generation. We need this to access the\n" +"generate_*_list methods." +msgstr "" + +# YARD::Server::Commands::LibraryIndexCommand +#: ../lib/yard/server/commands/library_index_command.rb:5 +msgid "Returns the index of libraries served by the server." +msgstr "サーバーによって提供されたライブラリのインデックスを返す" + +# YARD::Server::Commands::ListCommand +#: ../lib/yard/server/commands/list_command.rb:5 +msgid "Returns a list of objects of a specific type" +msgstr "特定の型のオブジェクトのリストを返す" + +# YARD::Server::Commands::SearchCommand +#: ../lib/yard/server/commands/search_command.rb:5 +msgid "" +"Performs a search over the objects inside of a library and returns\n" +"the results as HTML or plaintext" +msgstr "" +"ライブラリの内部オブジェクトの検索を実行し、\n" +"HTMLやプレーンテキストとして結果を返す。" + +# YARD::Server::Commands::StaticFileCommand +#: ../lib/yard/server/commands/static_file_command.rb:7 +msgid "Serves static content when no other router matches a request" +msgstr "リクエストにマッチする他のrouterが無い時、静的な内容を提供する。" + +# YARD::Server::Commands::StaticFileCommand::STATIC_PATHS +#: ../lib/yard/server/commands/static_file_command.rb:13 +msgid "" +"Defines the paths used to search for static assets. To define an\n" +"extra path, use {YARD::Server.register_static_path} rather than\n" +"modifying this constant directly. Also note that files in the\n" +"document root will always take precedence over these paths." +msgstr "" +"静的な資産用に検索に利用されるパスを定義する。\n" +"追加のパスを定義するには、直接この定数を変更するよりも\n" +"{YARD::Server.register_static_path}を利用する。\n" +"尚、ドキュメントのrootのファイルは常時これらのパスより優先する。" + +# YARD::Server::Commands::StaticFileCommand#favicon? +#: ../lib/yard/server/commands/static_file_command.rb:39 +msgid "" +"Return an empty favicon.ico if it does not exist so that\n" +"browsers don't complain." +msgstr "" +"favicon.icoが存在しない場合、空のfavicon.icoを返す。\n" +"その為、ブラウザに問題は発生しない。" + +# YARD::Server::DocServerHelper +#: ../lib/yard/server/doc_server_helper.rb:4 +msgid "" +"A module that is mixed into {Templates::Template} in order to customize\n" +"certain template methods." +msgstr "" +"テンプレートメソッドをカスタマイズする為に、\n" +"{Templates::Template}へmixinされるモジュール。" + +# YARD::Server::DocServerHelper#url_for +#: ../lib/yard/server/doc_server_helper.rb:7 +msgid "" +"Modifies {Templates::Helpers::HtmlHelper#url_for} to return a URL instead\n" +"of a disk location." +msgstr "" +"ディスクの上の場所の代わりにURLを返す{Templates::Helpers::HtmlHelper#url_for}" +"を変更する。" + +# YARD::Server::DocServerHelper#url_for_file +#: ../lib/yard/server/doc_server_helper.rb:18 +msgid "" +"Modifies {Templates::Helpers::HtmlHelper#url_for_file} to return a URL " +"instead\n" +"of a disk location." +msgstr "" +"ディスク上の場所の代わりにURLを返す{Templates::Helpers::" +"HtmlHelper#url_for_file}を変更する。" + +# YARD::Server::DocServerHelper#url_for_file +#: ../lib/yard/server/doc_server_helper.rb:30 +msgid "" +"Modifies {Templates::Helpers::HtmlHelper#url_for_list} to return a URL\n" +"based on the list prefix instead of a HTML filename." +msgstr "" +"HTMLファイル名の代わりにリストのプレフィックス基準のURLを返すには、\n" +"{Templates::Helpers::HtmlHelper#url_for_list} を変更する" + +# YARD::CodeObjects::MethodObject#name +#: ../lib/yard/server/doc_server_helper.rb:38 +msgid "Returns the frames URL for the page" +msgstr "ページ用のフレームのURLを返す" + +# YARD::Server::DocServerHelper#url_for_main +#: ../lib/yard/server/doc_server_helper.rb:46 +msgid "" +"Returns the main URL, first checking a readme and then linking to the index" +msgstr "メインのURLを返し、最初にreadmeをチェックしその時インデックスにリンクする。" + +# YARD::Templates::Helpers::HtmlHelper#url_for_file +#: ../lib/yard/server/doc_server_helper.rb:56 +#: ../lib/yard/templates/helpers/html_helper.rb:385 +msgid "Returns the URL for the alphabetic index page" +msgstr "アルファベット順のインデックスのページ用にURLを返す" + +# @example The base path for a library 'foo' +#: ../lib/yard/server/doc_server_helper.rb:65 +msgid "base_path('docs') # => 'docs/foo'" +msgstr "" + +# @example +#: ../lib/yard/server/doc_server_helper.rb:65 +msgid "tag|example|The base path for a library 'foo'" +msgstr "'foo'ライブラリ用のベースパス" + +# @return [String] +#: ../lib/yard/server/doc_server_helper.rb:65 +msgid "the base URI for a library with an extra +path+ prefix" +msgstr "追加の +path+ のプレフィックスを用いたライブラリ用のベースURI" + +# @param [String] path +#: ../lib/yard/server/doc_server_helper.rb:65 +msgid "the path prefix for a base path URI" +msgstr "URIベースパス用のパスのプレフィックス" + +# @return [Router] +#: ../lib/yard/server/doc_server_helper.rb:71 +msgid "convenience method for accessing the router" +msgstr "routerにアクセスする為の便利メソッド" + +# YARD::Server::DocServerSerializer +#: ../lib/yard/server/doc_server_serializer.rb:6 +msgid "" +"A custom {Serializers::Base serializer} which returns resource URLs instead " +"of\n" +"static relative paths to files on disk." +msgstr "" +"カスタム{Serializers::Base serializer}。\n" +"ディスク上のファイルの為に静的な相対パスの代わりに、URLリソースを返す。" + +# @return [DocServerSerializer] +#: ../lib/yard/server/doc_server_serializer.rb:10 +msgid "a new instance of DocServerSerializer" +msgstr "DocServerSerializerの新しいインスタンス" + +# YARD::Server::LibraryNotPreparedError +#: ../lib/yard/server/library_version.rb:6 +msgid "" +"This exception is raised when {LibraryVersion#prepare!} fails, or discovers\n" +"that the library is not \"prepared\" to be served by" +msgstr "" +"この例外は、{LibraryVersion#prepare!}が失敗した時や、\n" +"ライブラリが提供される為に\"prepared\"されない事をかぎつけた場合、上げられ" +"る。" + +# YARD::Server::LibraryVersion +#: ../lib/yard/server/library_version.rb:10 +msgid "" +"A library version encapsulates a library's documentation at a specific " +"version.\n" +"Although the version is optional, this allows for creating multiple " +"documentation\n" +"points for a specific library, each representing a unique version. The term\n" +"\"library\" used in other parts of the YARD::Server documentation refers to\n" +"objects of this class unless otherwise noted." +msgstr "" +"ライブラリバージョンは、特定のバージョンでライブラリドキュメントをカプセル化" +"する。\n" +"バージョンは任意だけれども、\n" +"これは、複数のドキュメントの特定のライブラリ用にポイントを作成する為に受入" +"れ、\n" +"それぞれ固有のバージョンを表す。\n" +"\"library\"の表現は、YARD::Serverドキュメントの他の部分で利用され、\n" +"他の方法で注意されなかった場合、このクラスのオブジェクトを参照する。" + +# YARD::Server::LibraryVersion +#: ../lib/yard/server/library_version.rb:16 +msgid "" +"A library points to a location where a {#yardoc_file} is located so that\n" +"its documentation may be loaded and served. Optionally, a {#source_path} is\n" +"given to point to a location where any extra files (and {YARD::CLI::Yardoc ." +"yardopts})\n" +"should be loaded from. Both of these methods may not be known immediately,\n" +"since the yardoc file may not be built until later. Resolving the yardoc\n" +"file and source path are dependent on the specific library \"source type\" " +"used.\n" +"Source types (known as \"library source\") are discussed in detail below." +msgstr "" +"ライブラリの{#yardoc_file}メソッドの指す場所は、\n" +"そのドキュメントがロードされセーブされる場所を示される。\n" +"任意で、{#source_path}メソッドは、\n" +"追加のファイル(と{YARD::CLI::Yardoc .yardopts})が、\n" +"ロードされるべき場所のポイントを与えられる。\n" +"これらのメソッドの両方は、直ぐに理解できないかもしれない、\n" +"なぜなら、yardocファイルが最新でない場合、ビルドされないかもしれないからであ" +"る。\n" +"yardocファイルとソースパスを解決するには、\"source type\"に利用される固有のラ" +"イブラリに依存する。\n" +"ソースの型(\"library source\"として知られる)は、下の詳細の中で検討される。" + +# YARD::Server::LibraryVersion +#: ../lib/yard/server/library_version.rb:24 +msgid "" +"== Using with Adapters\n" +"A list of libraries need to be passed into adapters upon creation. In\n" +"most cases, you will never do this manually, but if you use a " +"{RackMiddleware},\n" +"you will need to pass in this list yourself. To build this list of " +"libraries,\n" +"you should create a hash of library names mapped to an *Array* of " +"LibraryVersion\n" +"objects. For example:" +msgstr "" +"== アダプタと一緒に使用する\n" +"ライブラリのリストは、\n" +"作成する上でアダプターへ渡される必要がある。\n" +"大抵の場合、これを手動で行う事はしないだろう、\n" +"だが、あなたが {RackMiddleware}を利用する場合、\n" +"あなた自身が配列でこの中へ渡す必要があるだろう。\n" +"このライブラリの配列をビルドするには、\n" +"次のように、オブジェクトのLibraryVersionの*配列*に、\n" +"マップされ名付けられたライブラリのハッシュを作成すべきである。" + +# YARD::Server::LibraryVersion +#: ../lib/yard/server/library_version.rb:31 +msgid "" +" {'mylib' => [LibraryVersion.new('mylib', '1.0', ...),\n" +" LibraryVersion.new('mylib', '2.0', ...)]}" +msgstr "" + +# YARD::Server::LibraryVersion +#: ../lib/yard/server/library_version.rb:34 +msgid "Note that you can also use {Adapter#add_library} for convenience." +msgstr "" +"次の事に留意する。あなたは、\n" +"便利な{Adapter#add_library}メソッドを\n" +"使う事もできる。" + +# YARD::Server::LibraryVersion +#: ../lib/yard/server/library_version.rb:36 +msgid "The \"array\" part is required, even for just one library version." +msgstr "\"配列\"の部分は、たった一つのライブラリのバージョンでも必要とされる。" + +# YARD::Server::LibraryVersion +#: ../lib/yard/server/library_version.rb:38 +msgid "" +"== Library Sources\n" +"The {#source} method represents the library source type, ie. where the\n" +"library \"comes from\". It might come from \"disk\", or it might come from " +"a\n" +"\"gem\" (technically the disk, but a separate type nonetheless). In these\n" +"two cases, the yardoc file sits somewhere on your filesystem, though\n" +"it may also be built dynamically if it does not yet exist. This behaviour\n" +"is controlled through the {#prepare!} method, which prepares the yardoc " +"file\n" +"given a specific library source. We will see how this works in detail in\n" +"the following section." +msgstr "" +"== ライブラリのソース\n" +"{#source}メソッドはライブラリのソースのタイプを表す、\n" +"つまり、ライブラリの場所である。\n" +"それは、\"disk\"からくるかもしれない、\n" +"又は、\"gem\"からくるかもしれない。\n" +"(実際にはどちらもディスク上だが、型は別れる)\n" +"この二つのケースの場合、\n" +"yardocのファイルは、あなたのファイルシステムの何処かに置いてあり、\n" +"まだ見つかっていない場合、動的にビルドされるかもしれない。\n" +"この挙動は、{#prepare!}メソッドを通じて制御され、\n" +"与えられた固有のライブラリのソースのyardocファイルを用意する。\n" +"私達は、続くセクションの中でこの仕組みを理解するだろう。" + +# YARD::Server::LibraryVersion +#: ../lib/yard/server/library_version.rb:48 +msgid "" +"== Implementing a Custom Library Source\n" +"YARD can be extended to support custom library sources in order to\n" +"build or retrieve a yardoc file at runtime from many different locations." +msgstr "" +"== カスタムライブラリのソースを実装する\n" +"YARDはカスタムライブラリのソースをビルドするのをサポートする為、拡張され、\n" +"多くのの異なる場所から実行時にyardocファイルを読み出す。" + +# YARD::Server::LibraryVersion +#: ../lib/yard/server/library_version.rb:52 +msgid "" +"To implement this behaviour, two methods must be added to the +LibraryVersion" +"+\n" +"class, +#load_yardoc_from_SOURCE+ and +#source_path_for_SOURCE+. In both\n" +"cases, \"SOURCE\" represents the source type used in {#source} when " +"creating\n" +"the library object. The +#source_path_for_SOURCE+ method is called upon\n" +"creation and should return the location where the source code for the " +"library\n" +"lives. The load method is called from {#prepare!} if there is no yardoc " +"file\n" +"and should set {#yardoc_file}. Below is a full example for\n" +"implementing a custom library source, +:http+, which reads packaged .yardoc\n" +"databases from zipped archives off of an HTTP server." +msgstr "" +"この挙動を実装するには、\n" +"+LibraryVersion+クラスの +#load_yardoc_from_SOURCE+ メソッドと " +"+#source_path_for_SOURCE+ メソッドの\n" +"2つのメソッドが大抵追加される。\n" +"どちらの場合も、ライブラリのオブジェクトが作成される時の、\n" +"\"SOURCE\"は{#source}メソッドで利用されたsource typeを表す。\n" +"+#source_path_for_SOURCE+ メソッドは、作成される所で呼び出され、\n" +"存在するライブラリのソースコードの場所を返すべきである。\n" +"loadメソッドは、yardocファイルが無い場合、{#prepare!}メソッドから呼び出され" +"る。\n" +"そして、{#yardoc_file}を設定すべきである。\n" +"下は、カスタムライブラリのソースと +:http+ を実装する為の、完全な例であり、\n" +"これは、HTTPサーバー経由でzipされたアーカイブからパーケージされた.yardocデー" +"タベースを読み出す。" + +# @example Implementing a Custom Library Source +#: ../lib/yard/server/library_version.rb:87 +msgid "" +"# Adds the source type \"http\" for .yardoc files zipped on HTTP servers\n" +"class LibraryVersion\n" +" def load_yardoc_from_http\n" +" return if yardoc_file # we have the library\n" +"\n" +" # otherwise download it in a thread and return immediately\n" +" Thread.new do\n" +" # zip/unzip method implementations are not shown\n" +" download_zip_file(\"http://mysite.com/yardocs/#{self}.zip\")\n" +" unzip_file_to(\"/path/to/yardocs/#{self}\")\n" +" self.yardoc_file = \"/path/to/yardocs/#{self}/.yardoc\"\n" +" self.source_path = self.yardoc_file\n" +" end\n" +"\n" +" # tell the server it's not ready yet (but it might be next time)\n" +" raise LibraryNotPreparedError\n" +" end\n" +"\n" +" # we set this later\n" +" def source_path_for_http; nil end\n" +"end\n" +"\n" +"# Creating a library of this source type:\n" +"LibraryVersion.new('name', '1.0', nil, :http)" +msgstr "" +"# HTTPサーバー上でzipされた.yardocファイル用にソースの型\"http\"を追加す" +"る。\n" +"class LibraryVersion\n" +" def load_yardoc_from_http\n" +" return if yardoc_file #ライブラリを持っている場合\n" +"\n" +" # その他の場合、そのスレッドの中でダウンロードし直ぐに返す\n" +" Thread.new do\n" +" # zip/unzip メソッドの実装は示さない\n" +" download_zip_file(\"http://mysite.com/yardocs/#{self}.zip\")\n" +" unzip_file_to(\"/path/to/yardocs/#{self}\")\n" +" self.yardoc_file = \"/path/to/yardocs/#{self}/.yardoc\"\n" +" self.source_path = self.yardoc_file\n" +" end\n" +"\n" +" # サーバーを呼び出す準備がまだできていない場合(でも次回になるかもしれな" +"い)\n" +" raise LibraryNotPreparedError\n" +" end\n" +"\n" +" # 最新のものを設定する\n" +" def source_path_for_http; nil end\n" +"end\n" +"\n" +"#次の様に、このソースの型を指定して、ライブラリを作成する。\n" +"LibraryVersion.new('name', '1.0', nil, :http)" + +# @example +#: ../lib/yard/server/library_version.rb:87 +msgid "tag|example|Implementing a Custom Library Source" +msgstr "カスタムライブラリのソースを実装する" + +# @return [String] +# @param [String] name +#: ../lib/yard/server/library_version.rb:89 +#: ../lib/yard/server/library_version.rb:120 +msgid "the name of the library" +msgstr "ライブラリの名前" + +# @return [String] +#: ../lib/yard/server/library_version.rb:92 +msgid "the version of the specific library" +msgstr "固有のライブラリのバージョン" + +# @return [nil] +#: ../lib/yard/server/library_version.rb:98 +msgid "" +"if no yardoc file exists yet. In this case, {#prepare!} will\n" +"be called on this library to build the yardoc file." +msgstr "" +"yardocファイルがまだ存在しない場合、\n" +"yardocファイルをビルドする為に、\n" +"{#prepare!}がこのライブラリ上で呼び出されるだろう。" + +# @return [String] +#: ../lib/yard/server/library_version.rb:98 +msgid "" +"the location of the yardoc file used to load the object\n" +"information from." +msgstr "オブジェクトの情報をロードするのに利用されるyardocファイルの場所" + +# @see LibraryVersion +#: ../lib/yard/server/library_version.rb:105 +#: ../lib/yard/server/library_version.rb:111 +msgid "" +"LibraryVersion documentation for \"Implementing a Custom Library Source\"" +msgstr "" + +# @return [Symbol] +#: ../lib/yard/server/library_version.rb:105 +msgid "" +"the source type representing where the yardoc should be\n" +"loaded from. Defaults are +:disk+ and +:gem+, though custom sources\n" +"may be implemented. This value is used to inform {#prepare!} about how\n" +"to load the necessary data in order to display documentation for an object." +msgstr "" +"ソースは、yardocがロードされるべき場所を表す。\n" +"デフォルトは +:disk+ と +:gem+ となるが、カスタムソースの実装もできる。\n" +"この値は、オブジェクト用のドキュメントを表示する為に\n" +"必要なデータをロードする方法について、{#prepare!}メソッドに通知する為に利用さ" +"れる。" + +# @return [nil] +#: ../lib/yard/server/library_version.rb:111 +msgid "if there is no source code" +msgstr "これらがソースコードでない場合" + +# @return [String] +#: ../lib/yard/server/library_version.rb:111 +msgid "" +"the location of the source code for a library. This\n" +"value is filled by calling +#source_path_for_SOURCE+ on this class." +msgstr "" +"ライブラリの為のソースコードの場所。\n" +"この値は、このクラスで +#source_path_for_SOURCE+ を呼び出して埋められる。" + +# @return [LibraryVersion] +#: ../lib/yard/server/library_version.rb:120 +msgid "a new instance of LibraryVersion" +msgstr "LibraryVersionの新しいインスタンス" + +# @param [String] +#: ../lib/yard/server/library_version.rb:120 +msgid "tag|param|version" +msgstr "" + +# @param [String] +#: ../lib/yard/server/library_version.rb:120 +msgid "tag|param|yardoc" +msgstr "" + +# @param [Symbol] source +#: ../lib/yard/server/library_version.rb:120 +msgid "" +"the location of the files used to build the yardoc.\n" +"Builtin source types are +:disk+ or +:gem+." +msgstr "" +"yardocをビルドする為に利用されるファイルの場所。\n" +"組み込みのソースの型は +:disk+ 又は +:gem+ 。" + +# @param [String] yardoc +#: ../lib/yard/server/library_version.rb:120 +msgid "" +"the location of the yardoc file, or nil if it is\n" +"generated later" +msgstr "yardocの場所、又は、最新のものが生成される場合は、nil" + +# @param [String] version +#: ../lib/yard/server/library_version.rb:120 +msgid "" +"the specific (usually, but not always, numeric) library\n" +"version" +msgstr "" +"固有(普通は数字で表されるが、しかし常にではない)のライブラリのバージョン" + +# @param [Boolean] url_format +#: ../lib/yard/server/library_version.rb:132 +msgid "" +"if true, returns the string in a URI-compatible\n" +"format (for appending to a URL). Otherwise, it is given in a more human\n" +"readable format." +msgstr "" +"trueの場合、URI-compatibleフォーマット(URL追加用)で文字列を返し、\n" +"それ以外の場合、人間が読めるフォーマットが与えられる。" + +# @param [Boolean] +#: ../lib/yard/server/library_version.rb:132 +msgid "tag|param|url_format" +msgstr "" + +# @return [String] +#: ../lib/yard/server/library_version.rb:132 +msgid "the string representation of the library." +msgstr "ライブラリの文字列表現" + +# @return [Fixnum] +#: ../lib/yard/server/library_version.rb:137 +msgid "used for Hash mapping." +msgstr "ハッシュのマッピング用に利用される" + +# @return [Boolean] +#: ../lib/yard/server/library_version.rb:140 +msgid "whether another LibraryVersion is equal to this one" +msgstr "LibraryVersionが条件と一致するかどうか" + +# YARD::Server::LibraryVersion#prepare! +#: ../lib/yard/server/library_version.rb:148 +msgid "" +"Prepares a library to be displayed by the server. This callback is\n" +"performed before each request on a library to ensure that it is loaded\n" +"and ready to be viewed. If any steps need to be performed prior to loading,\n" +"they are performed through this method (though they should be implemented\n" +"through the +load_yardoc_from_SOURCE+ method)." +msgstr "" +"サーバーで表示されるライブラリを準備する。\n" +"このコールバックは、ロードされその一覧を準備する事を\n" +"保証する為にライブラリ上で、個々のリクエストの前に実行される。\n" +"任意のステップが、ロードの為に先に実行する必要がある場合、\n" +"このメソッドを通じて実行される。\n" +"(けれどもこれは +load_yardoc_from_SOURCE+ メソッドを通じて実装されるべきであ" +"る。)" + +# @note +#: ../lib/yard/server/library_version.rb:162 +msgid "" +"You should not directly override this method. Instead, implement\n" +"+load_yardoc_from_SOURCENAME+ when implementing loading for a specific\n" +"source type. See the {LibraryVersion} documentation for \"Implementing\n" +"a Custom Library Source\"" +msgstr "" +"あなたは、このメソッドを直接上書きすべきではない。\n" +"固有のソースの型用にロードを実装する時は、\n" +"代わりに、 +load_yardoc_form_SOURCENAME+ を実装する。\n" +"\"カスタムライブラリのソースの実装\"には、{LibraryVersion}ドキュメントを参" +"照。" + +# @raise [LibraryNotPreparedError] +#: ../lib/yard/server/library_version.rb:162 +msgid "" +"if the library is not ready to be\n" +"displayed. Usually when raising this error, you would simultaneously\n" +"begin preparing the library for subsequent requests, although this\n" +"is not necessary." +msgstr "" +"ライブラリが表示する為の準備ができていない場合、\n" +"通常このエラーを上げる時は、\n" +"次のリクエストの為のライブラリの準備が一斉に始まる。\n" +"なので、これは、必須ではない。" + +# @return [Gem::Specification] +#: ../lib/yard/server/library_version.rb:171 +msgid "" +"a gemspec object for a given library. Used\n" +"for :gem source types." +msgstr "" +"与えられたライブラリ用のgemspecオブジェクト。\n" +":gemのソースの型用に利用される。" + +# @return [nil] +#: ../lib/yard/server/library_version.rb:171 +msgid "if there is no installed gem for the library" +msgstr "これらが、ライブラリ用のgemをインストールされない場合" + +# YARD::Server::LibraryVersion#load_yardoc_from_disk +#: ../lib/yard/server/library_version.rb:179 +msgid "" +"Called when a library of source type \"disk\" is to be prepared. In this\n" +"case, the {#yardoc_file} should already be set, so nothing needs to be\n" +"done." +msgstr "" +"ソースの型が\"disk\"のライブラリの時呼び出され、準備する。\n" +"この場合、{#yardoc_file}は、既に設定されるべきであり、\n" +"何も必要としない。" + +# YARD::Server::LibraryVersion#load_yardoc_from_gem +#: ../lib/yard/server/library_version.rb:186 +msgid "" +"Called when a library of source type \"gem\" is to be prepared. In this\n" +"case, the {#yardoc_file} needs to point to the correct location for\n" +"the installed gem. The yardoc file is built if it has not been done." +msgstr "" +"ソースの型が\"gem\"のライブラリの時呼び出され、準備する。\n" +"この場合、{#yardoc_file}は\n" +"インストールされたgemの正規の場所を必要とする。\n" +"yardocファイルを持っていない場合は、ビルドされる。" + +# @raise [LibraryNotPreparedError] +#: ../lib/yard/server/library_version.rb:191 +msgid "" +"if the gem does not have an existing\n" +"yardoc file." +msgstr "gemがyardocファイルに存在しない場合" + +# @return [String] +#: ../lib/yard/server/library_version.rb:210 +msgid "the source path for a disk source" +msgstr "ディスクのソース用のソースのパス" + +# @return [String] +#: ../lib/yard/server/library_version.rb:215 +msgid "the source path for a gem source" +msgstr "gemのソース用のソースのパス" + +# YARD::Server::RackMiddleware +#: ../lib/yard/server/rack_adapter.rb:7 +msgid "" +"This class wraps the {RackAdapter} into a Rack-compatible middleware.\n" +"See {#initialize} for a list of options to pass via Rack's +#use+ method." +msgstr "" +"このクラスは、Rackと互換性のあるミドルウェアの{RackAdapter}をラップする。\n" +"Rack の +#use+ メソッド経由で渡す為のoptionsのリストは、{#initialize}メソッド" +"を参照。\n" + +# @note +#: ../lib/yard/server/rack_adapter.rb:16 +msgid "" +"You must pass a +:libraries+ option to the RackMiddleware via +#use+. To\n" +"read about how to return a list of libraries, see {LibraryVersion} or look\n" +"at the example below." +msgstr "" +"あなたは +#use+ メソッド経由でRackWiddlewareに +:libraries+ のオプションを渡" +"さなければならない。\n" +"librariesのリストを返す為の方法について読むには、{LibraryVersion}又は、下の例" +"を参照。" + +# @example Using the RackMiddleware in a Rack application +#: ../lib/yard/server/rack_adapter.rb:16 +msgid "" +"libraries = {:mylib => [YARD::Server::LibraryVersion.new('mylib', nil, '/" +"path/to/.yardoc')]}\n" +"use YARD::Server::RackMiddleware, :libraries => libraries" +msgstr "" + +# @example +#: ../lib/yard/server/rack_adapter.rb:16 +msgid "tag|example|Using the RackMiddleware in a Rack application" +msgstr "RackアプリケーションでRackミドルウェアを使用する。" + +# YARD::Server::RackMiddleware#initialize +#: ../lib/yard/server/rack_adapter.rb:18 +msgid "Creates a new Rack-based middleware for serving YARD documentation." +msgstr "" +"YARDドキュメントに提供する為に、\n" +"新しくRackが基本となるミドルウェアを作成する。" + +# @return [RackMiddleware] +#: ../lib/yard/server/rack_adapter.rb:26 +msgid "a new instance of RackMiddleware" +msgstr "Rackミドルウェアの新しいインスタンス" + +# @param +#: ../lib/yard/server/rack_adapter.rb:26 +msgid "tag|param|app" +msgstr "" + +# @param app +#: ../lib/yard/server/rack_adapter.rb:26 +msgid "the next Rack middleware in the stack" +msgstr "スタックの中の次のRackミドルウェア" + +# YARD::Server::RackAdapter +#: ../lib/yard/server/rack_adapter.rb:43 +msgid "" +"A server adapter to respond to requests using the Rack server infrastructure." +msgstr "" +"Rackサーバーのインフラによって、リクエストに答える為のサーバーアダプター。" + +# YARD::Server::RackAdapter#call +#: ../lib/yard/server/rack_adapter.rb:47 +msgid "Responds to Rack requests and builds a response with the {Router}." +msgstr "Rackのリクエストにレスポンスし、{Router}を用いレスポンスをビルドする。" + +# @return [Array(Numeric,Hash,Array)] +# @return [Array(Number,Hash,Array)] +#: ../lib/yard/server/rack_adapter.rb:48 ../lib/yard/server/router.rb:100 +#: ../lib/yard/server/static_caching.rb:33 +msgid "the Rack-style response" +msgstr "Rackスタイルのレスポンス" + +# YARD::Server::RackAdapter#start +#: ../lib/yard/server/rack_adapter.rb:59 +msgid "" +"Starts the +Rack::Server+. This method will pass control to the server and\n" +"block." +msgstr "" +"+Rack::Server+ をスタートする。\n" +"このメソッドは、サーバーとブロックに制御を渡すだろう。" + +# YARD::Server::Router +#: ../lib/yard/server/router.rb:4 +msgid "" +"A router class implements the logic used to recognize a request for a " +"specific\n" +"URL and run specific {Commands::Base commands}." +msgstr "" +"routerクラスは、特定のURL用のリクエストを認識する為に利用されたロジックを実装" +"し、\n" +"特定の{Commands::Base commands}を起動する。" + +# YARD::Server::Router +#: ../lib/yard/server/router.rb:7 +msgid "" +"== Subclassing Notes\n" +"To create a custom router, subclass this class and pass it into the adapter\n" +"options through {Adapter#initialize} or by directly modifying " +"{Adapter#router}." +msgstr "" +"== サブクラス化する時の注意\n" +"カスタムrouterを作成するには、\n" +"このクラスをサブクラス化し、\n" +"{Adapter#initialize}を通じてアダプタオプションへ渡すか、\n" +"直接{Adapter#router}を変更する。" + +# YARD::Server::Router +#: ../lib/yard/server/router.rb:11 +msgid "" +"The most general customization is to change the URL prefixes recognized by\n" +"routing, which can be done by overriding {#docs_prefix}, {#list_prefix}\n" +"and {#search_prefix}." +msgstr "" +"多くの場合、カスタマイズは、\n" +"routerで認識されるURLのプレフィックスを変更する為である。\n" +"{#docs_prefix}、{#list_prefix}、{#search_prefix}メソッドを上書きする事で、\n" +"実現できる。" + +# YARD::Server::Router +#: ../lib/yard/server/router.rb:15 +msgid "" +"== Implementing Custom Caching\n" +"By default, the Router class performs static disk-based caching on all\n" +"requests through the +#check_static_cache+. To override this behaviour,\n" +"or create your own caching mechanism, mixin your own custom module with\n" +"this method implemented as per {StaticCaching#check_static_cache}." +msgstr "" +"== カスタムキャッシュを実装する\n" +"デフォルトで、Routerクラスは、\n" +"+#check_static_cache+ を通じて\n" +"全てのリクエストで静的なディスクベースのキャッシュを実行する。\n" +"この挙動を上書きしたり、あなた自身でキャッシュのメカニズムを作成するには、\n" +"{StaticCaching#check_static_cache}メソッドとして実装されたこのメソッドを用い" +"て\n" +"あなた自身のカスタムモジュールをmixinする。" + +# @example Creating a subclassed router +#: ../lib/yard/server/router.rb:30 +msgid "" +"# Adds 'my' to all routing prefixes\n" +"class MyRouter < YARD::Server::Router\n" +" def docs_prefix; 'mydocs' end\n" +" def list_prefix; 'mylist' end\n" +" def search_prefix; 'mysearch' end\n" +"end\n" +"\n" +"# Using it:\n" +"WebrickAdapter.new(libraries, :router => MyRouter).start" +msgstr "" + +# @example +#: ../lib/yard/server/router.rb:30 +msgid "tag|example|Creating a subclassed router" +msgstr "サブクラス化されたrouterを作成する" + +# @return [Adapter Dependent] +#: ../lib/yard/server/router.rb:35 +msgid "the request data coming in with the routing" +msgstr "routerを用いやってくるデータのリクエスト" + +# @return [Adapter] +#: ../lib/yard/server/router.rb:38 +msgid "the adapter used by the router" +msgstr "routerによって利用されたアダプタ" + +# YARD::Server::Router#initialize +#: ../lib/yard/server/router.rb:41 +msgid "Creates a new router for a specific adapter" +msgstr "特定のアダプタ用に新しいrouterを作成する" + +# @return [Router] +#: ../lib/yard/server/router.rb:43 +msgid "a new instance of Router" +msgstr "Routerの新しいインスタンス" + +# @param [Adapter] +#: ../lib/yard/server/router.rb:43 +msgid "tag|param|adapter" +msgstr "" + +# @param [Adapter] adapter +#: ../lib/yard/server/router.rb:43 +msgid "the adapter to route requests to" +msgstr "リクエストを送る為のアダプタ" + +# YARD::Server::Router#call +#: ../lib/yard/server/router.rb:48 +msgid "" +"Perform routing on a specific request, serving the request as a static\n" +"file through {Commands::StaticFileCommand} if no route is found." +msgstr "" +"特定のリクエストでrouterを実行し、\n" +"routeが見つからない場合、\n" +"{Commands::StaticFileCommand}を通じて、\n" +"静的なファイルとしてリクエストを提供する。" + +# @return [Array(Number,Hash,Array)] +#: ../lib/yard/server/router.rb:52 +msgid "the Rack-style server response data" +msgstr "Rackスタイルサーバーが返すデータ" + +# YARD::Server::Router#docs_prefix +# YARD::Server::Router#list_prefix +# YARD::Server::Router#search_prefix +#: ../lib/yard/server/router.rb:64 ../lib/yard/server/router.rb:67 +#: ../lib/yard/server/router.rb:70 +msgid "Route Prefixes" +msgstr "プレフィックスを送る" + +# @return [String] +#: ../lib/yard/server/router.rb:64 +msgid "the URI prefix for all object documentation requests" +msgstr "全てのオブジェクトのドキュメントのリクエスト用のURIのプレフィックス" + +# @return [String] +#: ../lib/yard/server/router.rb:67 +msgid "the URI prefix for all class/method/file list requests" +msgstr "" +"全てのクラス/メソッド/ファイルのリストのリクエスト用のURIのプレフィックス" + +# @return [String] +#: ../lib/yard/server/router.rb:70 +msgid "the URI prefix for all search requests" +msgstr "全ての検索リクエスト用のURIプレフィックス" + +# YARD::Server::Router#parse_library_from_path +# YARD::Server::Router#route +# YARD::Server::Router#route_docs +# YARD::Server::Router#route_index +# YARD::Server::Router#route_list +# YARD::Server::Router#route_search +#: ../lib/yard/server/router.rb:77 ../lib/yard/server/router.rb:100 +#: ../lib/yard/server/router.rb:122 ../lib/yard/server/router.rb:140 +#: ../lib/yard/server/router.rb:151 ../lib/yard/server/router.rb:159 +msgid "Routing Methods" +msgstr "メソッドを送る" + +# @return [Array(LibraryVersion, Array)] +#: ../lib/yard/server/router.rb:77 +msgid "" +"the library followed\n" +"by the rest of the path components in the request path. LibraryVersion\n" +"will be nil if no matching library was found." +msgstr "" +"ライブラリは、リクエストのパスの中で\n" +"そのパスの構成の残りによってフォローされる。\n" +"見つかったライブラリが一致しなかった場合、\n" +"LibraryVersionは、nilになるだろう。" + +# YARD::Server::Router#route +#: ../lib/yard/server/router.rb:96 +msgid "" +"Performs routing algorithm to find which prefix is called, first\n" +"parsing out library name/version information." +msgstr "" +"プレフィックスを検索する為のrouterアルゴリズムを実行する。\n" +"ライブラリのname/version情報の出力を最初に解析する。" + +# @return [nil] +#: ../lib/yard/server/router.rb:100 +msgid "if no route is matched" +msgstr "route処理がマッチしない場合" + +# YARD::Server::Router#route_docs +#: ../lib/yard/server/router.rb:119 +msgid "Routes requests from {#docs_prefix} and calls the appropriate command" +msgstr "{#docs_prefix}からリクエストを送り、適当なコマンドを呼び出す。" + +# @param [Array] paths +#: ../lib/yard/server/router.rb:122 +msgid "path components (split by '/')" +msgstr "パスの構成('/'区切り)" + +# @param [LibraryVersion] library +#: ../lib/yard/server/router.rb:122 +msgid "the library to route for" +msgstr "routeする為のライブラリ" + +# YARD::Server::Router#route_index +#: ../lib/yard/server/router.rb:139 +msgid "Routes for the index of a library / multiple libraries" +msgstr "単一のライブラリ/複数のライブラリのインデックス用に送る" + +# YARD::Server::Router#route_list +#: ../lib/yard/server/router.rb:149 +msgid "Routes requests from {#list_prefix} and calls the appropriate command" +msgstr "{#list_prefix}メソッドからリクエストを送り、適切なコマンドを呼び出す" + +# YARD::Server::Router#route_search +#: ../lib/yard/server/router.rb:157 +msgid "Routes requests from {#search_prefix} and calls the appropriate command" +msgstr "{#search_prefix}メソッドからリクエストを送り、適切なコマンドを呼び出す" + +# YARD::Server::Router#final_options +#: ../lib/yard/server/router.rb:167 +msgid "" +"Adds extra :library/:path option keys to the adapter options.\n" +"Use this method when passing options to a command." +msgstr "" +"アダプタオプションに追加の:library/:pathオプションのキーを追加する。\n" +"このメソッドは、コマンドがオプションを解析する時に利用する。" + +# YARD::Server::Router#final_options +#: ../lib/yard/server/router.rb:171 +msgid "Utility Methods" +msgstr "ユーティリティメソッド" + +# @return [Hash] +#: ../lib/yard/server/router.rb:171 +msgid "finalized options" +msgstr "終わらせるオプション" + +# YARD::Server::StaticCaching +#: ../lib/yard/server/static_caching.rb:4 +msgid "Implements static caching for requests." +msgstr "リクエスト用の静的なキャッシュを実装する" + +# @see Router +#: ../lib/yard/server/static_caching.rb:6 +msgid "Router documentation for \"Caching\"" +msgstr "" + +# @see +#: ../lib/yard/server/static_caching.rb:6 +msgid "tag|see|Router" +msgstr "" + +# YARD::Server::StaticCaching#check_static_cache +#: ../lib/yard/server/static_caching.rb:8 +msgid "" +"Called by a router to return the cached object. By default, this\n" +"method performs disk-based caching. To perform other forms of caching,\n" +"implement your own +#check_static_cache+ method and mix the module into\n" +"the Router class." +msgstr "" +"キャッシュされたオブジェクトを返す為にrouterによって呼び出される。\n" +"デフォルトで、このメソッドは、ディスクベースのキャッシュを実行する。\n" +"キャッシュの他の形式を実行するには、\n" +"あなた自身が +#check_static_cache+ メソッドを実装し、\n" +"Routerクラスへモジュールをmixinする。" + +# YARD::Server::StaticCaching#check_static_cache +#: ../lib/yard/server/static_caching.rb:13 +msgid "" +"Note that caching does not occur here. This method simply checks for\n" +"the existence of cached data. To actually cache a response, see\n" +"{Commands::Base#cache}." +msgstr "" +"次の事に留意する。キャッシュは、ここでは発生しない。\n" +"このメソッドは、単純にキャッシュデータの存在をチェックする。\n" +"実際にレスポンスをキャッシュするには、{Commands::Base#cache}を参照する。" + +# @return [nil] +#: ../lib/yard/server/static_caching.rb:33 +msgid "if no cache is available and routing should continue" +msgstr "" +"キャッシュが利用できない場合、nilを返す。\n" +"routerは継続すべきである。" + +# @example Implementing In-Memory Cache Checking +#: ../lib/yard/server/static_caching.rb:33 +msgid "" +"module MemoryCaching\n" +" def check_static_cache\n" +" # $memory_cache is filled by {Commands::Base#cache}\n" +" cached_data = $memory_cache[request.path]\n" +" if cached_data\n" +" [200, {'Content-Type' => 'text/html'}, [cached_data]]\n" +" else\n" +" nil\n" +" end\n" +" end\n" +"end\n" +"\n" +"class YARD::Server::Router; include MemoryCaching; end" +msgstr "" + +# @example +#: ../lib/yard/server/static_caching.rb:33 +msgid "tag|example|Implementing In-Memory Cache Checking" +msgstr "メモリ内のキャッシュのチェックを実装する" + +# @see +#: ../lib/yard/server/static_caching.rb:33 +msgid "tag|see|Commands::Base#cache" +msgstr "" + +# YARD::Server::WebrickAdapter +#: ../lib/yard/server/webrick_adapter.rb:6 +msgid "The main adapter to initialize a WEBrick server." +msgstr "WEBrickサーバーをイニシャライズする為の主なアダプタ" + +# YARD::Server::WebrickAdapter#start +#: ../lib/yard/server/webrick_adapter.rb:8 +msgid "" +"Initializes a WEBrick server. If {Adapter#server_options} contains a\n" +"+:daemonize+ key set to true, the server will be daemonized." +msgstr "" +"WEBrickサーバーをイニシャライズする。\n" +"{Adapter#server_options}の内容の\n" +"+:daemonize+ キーにtrueが設定された場合、\n" +"サーバーは、デーモンで起動される。" + +# YARD::Server::WebrickServlet +#: ../lib/yard/server/webrick_adapter.rb:19 +msgid "The main WEBrick servlet implementation, accepting only GET requests." +msgstr "" +"主にWEBrickサーブレットの実装、取得するリクエストだけ受入れる。\n" +"(servlet:サーバー側で動くプログラムの事)" + +# @return [WebrickServlet] +#: ../lib/yard/server/webrick_adapter.rb:22 +msgid "a new instance of WebrickServlet" +msgstr "WebrickServletの新しいインスタンス" + +# YARD::Tags::DefaultFactory#parse_tag +#: ../lib/yard/tags/default_factory.rb:8 +msgid "Parses tag text and creates a new tag with descriptive text" +msgstr "タグテキストを解析し、説明文と共に新しいタグを作成する。" + +# @return [Tag] +#: ../lib/yard/tags/default_factory.rb:12 +msgid "a tag object with the tag_name and text values filled" +msgstr "タグ名やテキストの入ったタグオブジェクト" + +# @param tag_name +#: ../lib/yard/tags/default_factory.rb:12 +#: ../lib/yard/tags/default_factory.rb:21 +#: ../lib/yard/tags/default_factory.rb:32 +#: ../lib/yard/tags/default_factory.rb:44 +#: ../lib/yard/tags/default_factory.rb:56 +msgid "the name of the tag to parse" +msgstr "解析の為のタグの名前" + +# @param [String] text +#: ../lib/yard/tags/default_factory.rb:12 +#: ../lib/yard/tags/default_factory.rb:21 +#: ../lib/yard/tags/default_factory.rb:32 +#: ../lib/yard/tags/default_factory.rb:44 +#: ../lib/yard/tags/default_factory.rb:56 +#: ../lib/yard/tags/default_factory.rb:98 +msgid "the raw tag text" +msgstr "元のタグテキスト" + +# YARD::Tags::DefaultFactory#parse_tag_with_name +#: ../lib/yard/tags/default_factory.rb:17 +msgid "" +"Parses tag text and creates a new tag with a key name and descriptive text" +msgstr "タグテキストを解析し、キー名と説明文と共に新しいタグを作成する。" + +# @return [Tag] +#: ../lib/yard/tags/default_factory.rb:21 +msgid "a tag object with the tag_name, name and text values filled" +msgstr "タグ名,キー名,テキストの入ったタグオブジェクト" + +# YARD::Tags::DefaultFactory#parse_tag_with_types +#: ../lib/yard/tags/default_factory.rb:27 +msgid "" +"Parses tag text and creates a new tag with formally declared types and\n" +"descriptive text" +msgstr "" +"タグテキストを解析し、形式的に宣言される型と説明文と共に新しいタグを作成す" +"る。" + +# @return [Tag] +#: ../lib/yard/tags/default_factory.rb:32 +msgid "a tag object with the tag_name, types and text values filled" +msgstr "タグ名,型,テキストを含んだタグオブジェクト" + +# YARD::Tags::DefaultFactory#parse_tag_with_types_and_name +#: ../lib/yard/tags/default_factory.rb:39 +msgid "" +"Parses tag text and creates a new tag with formally declared types, a key\n" +"name and descriptive text" +msgstr "" +"タグタキストを解析し,形式的に宣言された型と共に新しいタグを作成する,\n" +"キー名と説明文。" + +# @return [Tag] +#: ../lib/yard/tags/default_factory.rb:44 +#: ../lib/yard/tags/default_factory.rb:56 +msgid "a tag object with the tag_name, name, types and text values filled" +msgstr "タグ名,キー名,型,テキストの入ったタグオブジェクト" + +# YARD::Tags::DefaultFactory#parse_tag_with_types_and_name +#: ../lib/yard/tags/default_factory.rb:51 +msgid "" +"Parses tag text and creates a new tag with formally declared types, a title\n" +"on the first line and descriptive text" +msgstr "" +"タグテキストを解析し、新しいタグを作成する。\n" +"形式的に宣言された型、最初の行のタイトル、説明文を用いる。" + +# YARD::Tags::DefaultFactory#extract_name_from_text +#: ../lib/yard/tags/default_factory.rb:94 +msgid "" +"Extracts the name from raw tag text returning the name and remaining value" +msgstr "元のタグテキストの返す名前から名前を抽出する。又、残りの値は残す。" + +# @return [Array] +#: ../lib/yard/tags/default_factory.rb:98 +msgid "" +"an array holding the name as the first element and the\n" +"value as the second element" +msgstr "最初の要素は名前を含み、次の要素は残りの値を含んだ配列" + +# YARD::Tags::DefaultFactory#extract_types_and_name_from_text +#: ../lib/yard/tags/default_factory.rb:116 +msgid "" +"Parses a [], <>, {} or () block at the beginning of a line of text\n" +"into a list of comma delimited values." +msgstr "" +"テキスト行の先頭で[],<>,{},()ブロックのカンマで区切られた値の配列の中を解析す" +"る\n" + +# @example +#: ../lib/yard/tags/default_factory.rb:125 +msgid "" +"obj.parse_types('[String, Array, nil]') # => [nil, ['String', " +"'Array', 'nil'], \"\"]\n" +"obj.parse_types('b A string') # => ['b', ['String'], 'A string']" +msgstr "" + +# @return [Array(String, Array, String)] +#: ../lib/yard/tags/default_factory.rb:125 +msgid "" +"the text before the type\n" +"list (or nil), followed by the type list parsed into an array of\n" +"strings, followed by the text following the type list." +msgstr "" +"型の配列の前のテキスト(又はnil)、\n" +"続いて、文字列の配列の中を解析されることによって処理される,型のリスト,\n" +"続いて、型のリストをフォローする事によって処理される,テキストを含んだ配列" + +# YARD::Tags::DefaultTag#defaults +#: ../lib/yard/tags/default_tag.rb:5 +msgid "Returns the value of attribute defaults" +msgstr "デフォルトの属性の値を返す" + +# @return [DefaultTag] +#: ../lib/yard/tags/default_tag.rb:6 +msgid "a new instance of DefaultTag" +msgstr "DefaultTagクラスの新しいインスタンス" + +# YARD::Tags::Directive +#: ../lib/yard/tags/directives.rb:6 +msgid "" +"The base directive class. Subclass this class to create a custom\n" +"directive, registering it with {Library.define_directive}. Directive\n" +"classes are executed via the {#call} method, which perform all directive\n" +"processing on the object." +msgstr "" + +# YARD::Tags::Directive +#: ../lib/yard/tags/directives.rb:11 +msgid "" +"If processing occurs within a handler, the {#handler} attribute is\n" +"available to access more information about parsing context and state.\n" +"Handlers are only available when parsing from {Parser::SourceParser},\n" +"not when parsing directly from {DocstringParser}. If the docstring is\n" +"attached to an object declaration, {#object} will be set and available\n" +"to modify the generated code object directly. Note that both of these\n" +"attributes may be nil, and directives should test their existence\n" +"before attempting to use them." +msgstr "" + +# @abstract +#: ../lib/yard/tags/directives.rb:22 +msgid "Subclasses should implement {#call}." +msgstr "" + +# @see +#: ../lib/yard/tags/directives.rb:22 +msgid "tag|see|Library.define_directive" +msgstr "" + +# @return [Tag] +#: ../lib/yard/tags/directives.rb:24 +msgid "the meta-data tag containing data input to the directive" +msgstr "" + +# YARD::Tags::Directive#expanded_text +# YARD::Tags::Directive#expanded_text= +#: ../lib/yard/tags/directives.rb:27 +msgid "" +"Set this field to replace the directive definition inside of a docstring\n" +"with arbitrary text. For instance, the {MacroDirective} uses this field\n" +"to expand its macro data in place of the call to a +@!macro+." +msgstr "" + +# @return [nil] +#: ../lib/yard/tags/directives.rb:33 +msgid "if no expansion should take place for this directive" +msgstr "" + +# @return [String] +#: ../lib/yard/tags/directives.rb:33 +msgid "" +"the text to expand in the original docstring in place\n" +"of this directive definition." +msgstr "" + +# @return [DocstringParser] +#: ../lib/yard/tags/directives.rb:37 +msgid "" +"the parser that is parsing all tag\n" +"information out of the docstring" +msgstr "" + +# @return [CodeObjects::Base] +#: ../lib/yard/tags/directives.rb:42 +msgid "" +"the object the parent docstring is\n" +"attached to. May be nil." +msgstr "" +"オブジェクトを返す、親のdocstringがオブジェクトに追加される。\n" +"nilになるかもしれない。" + +# @return [Handlers::Base, nil] +#: ../lib/yard/tags/directives.rb:48 +msgid "" +"the handler object the docstring parser\n" +"might be attached to. May be nil. Only available when parsing\n" +"through {Parser::SourceParser}." +msgstr "" + +# @return [Section] +#: ../lib/yard/tags/directives.rb:54 +msgid "a new instance of Directive" +msgstr "ディレクティブの新しいインスタンス" + +# @param [Symbol] +# @param [#to_s] +#: ../lib/yard/tags/directives.rb:54 ../lib/yard/tags/library.rb:100 +#: ../lib/yard/tags/library.rb:158 +msgid "tag|param|tag" +msgstr "" + +# @param [OptionParser] opts +#: ../lib/yard/tags/directives.rb:54 +msgid "the docstring parser object" +msgstr "docstringのパーサーオブジェクト" + +# @return [Adapter Dependent] +#: ../lib/yard/tags/directives.rb:54 +msgid "the meta-data tag containing all input to the docstring" +msgstr "メタデータタグ、docstringに全て入力するデータを含んでいる" + +# YARD::Tags::Directive#call +#: ../lib/yard/tags/directives.rb:63 +msgid "" +"Called when processing the directive. Subclasses should implement\n" +"this method to perform all functionality of the directive." +msgstr "" + +# YARD::Parser::SourceParser.before_parse_list +# YARD::Parser::SourceParser.after_parse_list +# YARD::Parser::SourceParser.before_parse_file +# YARD::Parser::SourceParser.after_parse_file +# YARD::Parser::SourceParser.before_parse_list_callbacks +# YARD::Parser::SourceParser.after_parse_list_callbacks +# YARD::Parser::SourceParser.before_parse_file_callbacks +# YARD::Parser::SourceParser.after_parse_file_callbacks +#: ../lib/yard/tags/directives.rb:68 ../lib/yard/tags/directives.rb:73 +#: ../lib/yard/tags/directives.rb:97 ../lib/yard/tags/directives.rb:98 +#: ../lib/yard/tags/directives.rb:120 ../lib/yard/tags/directives.rb:121 +#: ../lib/yard/tags/directives.rb:250 ../lib/yard/tags/directives.rb:251 +#: ../lib/yard/tags/directives.rb:263 ../lib/yard/tags/directives.rb:268 +#: ../lib/yard/tags/directives.rb:273 ../lib/yard/tags/directives.rb:278 +#: ../lib/yard/tags/directives.rb:282 ../lib/yard/tags/directives.rb:298 +#: ../lib/yard/tags/directives.rb:318 ../lib/yard/tags/directives.rb:350 +#: ../lib/yard/tags/directives.rb:351 ../lib/yard/tags/directives.rb:353 +#: ../lib/yard/tags/directives.rb:355 ../lib/yard/tags/directives.rb:363 +#: ../lib/yard/tags/directives.rb:372 ../lib/yard/tags/directives.rb:376 +#: ../lib/yard/tags/directives.rb:385 ../lib/yard/tags/directives.rb:393 +#: ../lib/yard/tags/directives.rb:433 ../lib/yard/tags/directives.rb:434 +#: ../lib/yard/tags/directives.rb:442 ../lib/yard/tags/directives.rb:448 +#: ../lib/yard/tags/directives.rb:458 ../lib/yard/tags/directives.rb:485 +#: ../lib/yard/tags/directives.rb:489 ../lib/yard/tags/directives.rb:518 +#: ../lib/yard/tags/directives.rb:519 ../lib/yard/tags/directives.rb:552 +#: ../lib/yard/tags/directives.rb:553 ../lib/yard/tags/directives.rb:582 +#: ../lib/yard/tags/directives.rb:583 +msgid "Parser callbacks" +msgstr "パーサーのコールバック" + +# YARD::Server::Adapter#start +#: ../lib/yard/tags/directives.rb:68 +msgid "" +"implement this method to perform all data processing for\n" +"the directive." +msgstr "ディレクディブ用に全てのデータ処理を実行する為にこのメソッドを実装する" + +# YARD::Tags::Directive#after_parse +#: ../lib/yard/tags/directives.rb:71 +msgid "" +"Called after parsing all directives and tags in the docstring. Used\n" +"to perform any cleanup after all directives perform their main task." +msgstr "" + +# YARD::Tags::EndGroupDirective +#: ../lib/yard/tags/directives.rb:79 +msgid "" +"Ends a group listing definition. Group definition automatically end\n" +"when class or module blocks are closed, and defining a new group overrides\n" +"the last group definition, but occasionally you need to end the current\n" +"group to return to the default listing. Use {tag:!group} to begin a\n" +"group listing." +msgstr "" + +# @example +#: ../lib/yard/tags/directives.rb:97 +msgid "" +"class Controller\n" +" # @!group Callbacks\n" +"\n" +" def before_filter; end\n" +" def after_filter; end\n" +"\n" +" # @!endgroup\n" +"\n" +" def index; end\n" +"end" +msgstr "" + +# @see +#: ../lib/yard/tags/directives.rb:97 +msgid "tag|see|tag:!group" +msgstr "" + +# YARD::Tags::GroupDirective +#: ../lib/yard/tags/directives.rb:105 +msgid "" +"Defines a group listing. All methods (and attributes) seen after this\n" +"directive are placed into a group with the given description as the\n" +"group name. The group listing is used by templates to organize methods\n" +"and attributes into respective logical groups. To end a group listing\n" +"use {tag:!endgroup}." +msgstr "" + +# @example +#: ../lib/yard/tags/directives.rb:120 +msgid "" +"# @!group Callbacks\n" +"\n" +"def before_filter; end\n" +"def after_filter; end" +msgstr "" + +# @note +#: ../lib/yard/tags/directives.rb:120 +msgid "" +"A group definition only applies to the scope it is defined in.\n" +"If a new class or module is opened after the directive, this directive\n" +"will not apply to methods in that class or module." +msgstr "" + +# @see +#: ../lib/yard/tags/directives.rb:120 +msgid "tag|see|tag:!endgroup" +msgstr "" + +# YARD::Tags::MacroDirective +#: ../lib/yard/tags/directives.rb:128 +msgid "" +"Defines a block of text to be expanded whenever the macro is called by name\n" +"in subsequent docstrings. The macro data can be any arbitrary text data, be\n" +"it regular documentation, meta-data tags or directives." +msgstr "" + +#: ../lib/yard/tags/directives.rb:132 +msgid "== Defining a Macro" +msgstr "== マクロを定義する" + +# YARD::Tags::MacroDirective +#: ../lib/yard/tags/directives.rb:134 +msgid "" +"A macro must first be defined in order to be used. Note that a macro is " +"also\n" +"expanded upon definition if it defined on an object (the docstring of a\n" +"method, class, module or constant object as opposed to a free standing\n" +"comment). To define a macro, use the \"new\" or \"attach\" identifier in " +"the\n" +"types specifier list. A macro will also automatically be created if an\n" +"indented macro data block is given, so the keywords are not strictly needed." +msgstr "" + +# YARD::Tags::MacroDirective +#: ../lib/yard/tags/directives.rb:141 +msgid "=== Anonymous Macros" +msgstr "" + +# YARD::Tags::MacroDirective +#: ../lib/yard/tags/directives.rb:143 +msgid "" +"In addition to standard named macros, macros can be defined anonymously if\n" +"no name is given. In this case, they can not be re-used in future " +"docstrings,\n" +"but they will expand in the first definition. This is useful when needing\n" +"to take advantage of the macro expansion variables (described below)." +msgstr "" + +#: ../lib/yard/tags/directives.rb:148 +msgid "== Using a Macro" +msgstr "== マクロを使う" + +# YARD::Tags::MacroDirective +#: ../lib/yard/tags/directives.rb:150 +msgid "" +"To re-use a macro in another docstring after it is defined, simply use\n" +"@!macro the_name with no indented block of macro data. The " +"resulting\n" +"data will be expanded in place." +msgstr "" + +#: ../lib/yard/tags/directives.rb:154 +msgid "== Attaching a Macro to a DSL Method" +msgstr "== DSL(Class)メソッドにマクロを追加する" + +# YARD::Tags::MacroDirective +#: ../lib/yard/tags/directives.rb:156 +msgid "" +"Macros can be defined to auto-expand on DSL-style class method calls. To\n" +"define a macro to be auto expanded in this way, use the \"attach\" keyword\n" +"in the type specifier list (\"new\" is implied)." +msgstr "" + +# YARD::Tags::MacroDirective +#: ../lib/yard/tags/directives.rb:160 +msgid "" +"Attached macros can also be attached directly on the class method " +"declaration\n" +"that provides the DSL method to its subclasses. The syntax in either case\n" +"is the same." +msgstr "" + +# YARD::Tags::MacroDirective +#: ../lib/yard/tags/directives.rb:164 +msgid "== Macro Expansion Variables" +msgstr "" + +# YARD::Tags::MacroDirective +#: ../lib/yard/tags/directives.rb:166 +msgid "" +"In the case of using macros on DSL-style method calls, a number of " +"expansion\n" +"variables can be used for interpolation inside of the macro data. The " +"variables,\n" +"similar in syntax to Ruby's global variables, are as follows:" +msgstr "" + +# YARD::Tags::MacroDirective +#: ../lib/yard/tags/directives.rb:170 +msgid "" +"* $0 - the method name being called\n" +"* $1, $2, $3, ... - the Nth argument in the method call\n" +"* $& - the full source line" +msgstr "" + +# YARD::Tags::MacroDirective +#: ../lib/yard/tags/directives.rb:174 +msgid "" +"The following example shows what the expansion variables might hold for a " +"given\n" +"DSL method call:" +msgstr "" + +# YARD::Tags::MacroDirective +#: ../lib/yard/tags/directives.rb:177 +msgid "" +" property :foo, :a, :b, :c, String\n" +" # $0 => \"property\"\n" +" # $1 => \"foo\"\n" +" # $2 => \"a\"\n" +" # $& => \"property :foo, :a, :b, :c, String\"" +msgstr "" + +#: ../lib/yard/tags/directives.rb:183 +msgid "=== Ranges" +msgstr "=== 範囲" + +#: ../lib/yard/tags/directives.rb:185 +msgid "" +"Ranges are also acceptable with the syntax ${N-M}. Negative values\n" +"on either N or M are valid, and refer to indexes from the end of the list.\n" +"Consider a DSL method that creates a method using the first argument with\n" +"argument names following, ending with the return type of the method. This\n" +"could be documented as:" +msgstr "" +"範囲は ${N-M} の構文で指定できる。\n" +"NやMには負の値を指定可能で、\n" +"その場合リストの最後からのインデックスを参照する。\n" +"最初の引数でそれに続く引数名とともに使われて、\n" +"メソッドのリターンタイプとともに終了するメソッドを作るDSLメソッドを考えよう。\n" +"これは次のように記述できる。" + +# YARD::Tags::MacroDirective +#: ../lib/yard/tags/directives.rb:191 +msgid "" +" # @!macro dsl_method\n" +" # @!method $1(${2--2})\n" +" # @return [${-1}] the return value of $0\n" +" create_method_with_args :foo, :a, :b, :c, String" +msgstr "" + +#: ../lib/yard/tags/directives.rb:196 +msgid "" +"As described, the method is using the signature foo(a, b, c) and " +"the return\n" +"type from the last argument, +String+. When using ranges, tokens are joined\n" +"with commas. Note that this includes using $0:" +msgstr "" +"上記の通り、メソッドは foo(a, b, c) の用法と最後の引数、\n" +"`String`からのリターンタイプを使っている。\n" +"範囲を使うときは、トークンはコンマでつながれている。\n" +"$0を使った場合を記述する。" + +# YARD::Tags::MacroDirective +#: ../lib/yard/tags/directives.rb:200 +msgid "" +" !!!plain\n" +" $0-1 # => Interpolates to \"create_method_with_args, foo\"" +msgstr "" + +#: ../lib/yard/tags/directives.rb:203 +msgid "" +"If you want to separate them with spaces, use $1 $2 $3 $4 .... Note " +"that\n" +"if the token cannot be expanded, it will return the empty string (not an " +"error),\n" +"so it would be safe to list $1 $2 ... $10, for example." +msgstr "" +"それらをスペースを用い区切りたい場合は、$1 $2 $3 $4 ... を使う\n" +"留意する事としてトークンが拡張できない場合は\n" +"空の文字列を返すだろう。(エラーではない)\n" +"なので例えば\n" +"$1 $2 ... $10 のように記述すると安全だろう。" + +#: ../lib/yard/tags/directives.rb:207 +msgid "=== Escaping Interpolation" +msgstr "=== 補間をエスケープする" + +#: ../lib/yard/tags/directives.rb:209 +msgid "Interpolation can be escaped by prefixing the +$+ with +\\+, like so:" +msgstr "補間文字をエスケープするには、下の様に +$+ の前に +\\+ 置く事でエスケープする。" + +# YARD::Tags::MacroDirective +#: ../lib/yard/tags/directives.rb:211 +msgid "" +" # @!macro foo\n" +" # I have \\$2.00 USD." +msgstr "" + +# @example Defining a simple macro +#: ../lib/yard/tags/directives.rb:250 +msgid "" +"# @!macro [new] returnself\n" +"# @return [self] returns itself" +msgstr "" + +# @example Using a simple macro in multiple docstrings +#: ../lib/yard/tags/directives.rb:250 +msgid "" +"# Documentation for map\n" +"# ...\n" +"# @macro returnself\n" +"def map; end\n" +"\n" +"# Documentation for filter\n" +"# ...\n" +"# @macro returnself\n" +"def filter; end" +msgstr "" + +# @example Attaching a macro directly to a DSL method +#: ../lib/yard/tags/directives.rb:250 +msgid "" +"class Post < Resource\n" +" # @!macro [attach] property\n" +" # @return [$2] the $1 property\n" +" property :title, String\n" +"\n" +" # Macro will expand on this definition too\n" +" property :view_count, Integer\n" +"end" +msgstr "" + +# @example Attaching a macro to a class method (for DSL usage) +#: ../lib/yard/tags/directives.rb:250 +msgid "" +"class Resource\n" +" # Defines a new property\n" +" # @param [String] name the property name\n" +" # @param [Class] type the property's type\n" +" # @!macro [attach] property\n" +" # @return [$2] the $1 property\n" +" def self.property(name, type) end\n" +"end\n" +"\n" +"class Post < Resource\n" +" property :title, String\n" +" property :view_count, Integer\n" +"end" +msgstr "" + +# @example +#: ../lib/yard/tags/directives.rb:250 +msgid "tag|example|Attaching a macro directly to a DSL method" +msgstr "tag|example|DSLメソッドに直接マクロを追加する" + +# @example +#: ../lib/yard/tags/directives.rb:250 +msgid "tag|example|Attaching a macro to a class method (for DSL usage)" +msgstr "tag|example|クラスメソッドにマクロを追加する(DSL使用)" + +# @example +#: ../lib/yard/tags/directives.rb:250 +msgid "tag|example|Defining a simple macro" +msgstr "tag|example|簡単なマクロ定義" + +# @example +#: ../lib/yard/tags/directives.rb:250 +msgid "tag|example|Using a simple macro in multiple docstrings" +msgstr "tag|example|複数のdocstringの中の単純名マクロを使う" + +# YARD::Tags::MethodDirective +#: ../lib/yard/tags/directives.rb:327 +msgid "" +"Defines a method object with a given method signature, using indented\n" +"block data as the method's docstring. The signature is similar to the\n" +"{tag:overload} tag. The comment containing this directive does not need\n" +"to be attached to any source, but if it is, that source code will be\n" +"used as the method's source." +msgstr "" + +# YARD::Tags::MethodDirective +#: ../lib/yard/tags/directives.rb:333 +msgid "To define an attribute method, see {tag:!attribute}" +msgstr "" + +# @example Attaching multiple methods to the same source +#: ../lib/yard/tags/directives.rb:350 +msgid "" +"# @!method method1\n" +"# @!method method2\n" +"create_methods :method1, :method2" +msgstr "" + +# @example Defining a simple method +#: ../lib/yard/tags/directives.rb:350 +msgid "" +"# @!method quit(username, message = \"Quit\")\n" +"# Sends a quit message to the server for a +username+.\n" +"# @param [String] username the username to quit\n" +"# @param [String] message the quit message\n" +"quit_message_method" +msgstr "" + +# @note +#: ../lib/yard/tags/directives.rb:350 +msgid "" +"For backwards compatibility support, you do not need to indent\n" +"the method's docstring text. If a +@!method+ directive is seen with\n" +"no indented block, the entire docstring is used as the new method's\n" +"docstring text." +msgstr "" + +# @example +#: ../lib/yard/tags/directives.rb:350 +msgid "tag|example|Attaching multiple methods to the same source" +msgstr "tag|example|同じソースに複数のメソッドを追加する" + +# @example +#: ../lib/yard/tags/directives.rb:350 +msgid "tag|example|Defining a simple method" +msgstr "tag|example|簡単なメソッドを定義する" + +# @see +#: ../lib/yard/tags/directives.rb:350 +msgid "tag|see|tag:!attribute" +msgstr "" + +# YARD::Tags::AttributeDirective +#: ../lib/yard/tags/directives.rb:413 +msgid "" +"Defines an attribute with a given name, using indented block data as the\n" +"attribute's docstring. If the type specifier is supplied with \"r\", \"w\", " +"or\n" +"\"rw\", the attribute is made readonly, writeonly or readwrite " +"respectively.\n" +"A readwrite attribute is the default, if no type is specified. The comment\n" +"containing this directive does not need to be attached to any source, but\n" +"if it is, that source code will be used as the method's source." +msgstr "" + +# YARD::Tags::AttributeDirective +#: ../lib/yard/tags/directives.rb:420 +msgid "To define an regular method, see {tag:!method}" +msgstr "" + +# @example Defining a simple readonly attribute +#: ../lib/yard/tags/directives.rb:433 +msgid "" +"# @!attribute [r] count\n" +"# @return [Fixnum] the size of the list" +msgstr "" + +# @example Defining a simple readwrite attribute +#: ../lib/yard/tags/directives.rb:433 +msgid "" +"# @!attribute name\n" +"# @return [String] the name of the user" +msgstr "" + +# @note +#: ../lib/yard/tags/directives.rb:433 +msgid "" +"For backwards compatibility support, you do not need to indent\n" +"the attribute's docstring text. If an +@!attribute+ directive is seen with\n" +"no indented block, the entire docstring is used as the new attribute's\n" +"docstring text." +msgstr "" + +# @example +#: ../lib/yard/tags/directives.rb:433 +msgid "tag|example|Defining a simple readonly attribute" +msgstr "tag|example|readonly属性を簡単に定義する" + +# @example +#: ../lib/yard/tags/directives.rb:433 +msgid "tag|example|Defining a simple readwrite attribute" +msgstr "tag|example|readwrite属性を簡単に定義する" + +# @see +#: ../lib/yard/tags/directives.rb:433 +msgid "tag|see|tag:!method" +msgstr "" + +# YARD::Tags::ParseDirective +#: ../lib/yard/tags/directives.rb:495 +msgid "" +"Parses a block of code as if it were present in the source file at that\n" +"location. This directive is useful if a class has dynamic meta-programmed\n" +"behaviour that cannot be recognized by YARD." +msgstr "" + +# YARD::Tags::ParseDirective +#: ../lib/yard/tags/directives.rb:499 +msgid "" +"You can specify the language of the code block using the types\n" +"specification list. By default, the code language is \"ruby\"." +msgstr "" + +# @example Parsing C code +#: ../lib/yard/tags/directives.rb:518 +msgid "" +"# @!parse [c]\n" +"# void Init_Foo() {\n" +"# rb_define_method(rb_cFoo, \"method\", method, 0);\n" +"# }" +msgstr "" + +# @example Declaring a method as an attribute +#: ../lib/yard/tags/directives.rb:518 +msgid "" +"# This should really be an attribute\n" +"# @!parse attr_reader :foo\n" +"def object; @parent.object end" +msgstr "" + +# @example Documenting dynamic module inclusion +#: ../lib/yard/tags/directives.rb:518 +msgid "" +"class User\n" +" # includes \"UserMixin\" and extends \"UserMixin::ClassMethods\"\n" +" # using the UserMixin.included callback.\n" +" # @!parse include UserMixin\n" +" # @!parse extend UserMixin::ClassMethods\n" +"end" +msgstr "" + +# @example +#: ../lib/yard/tags/directives.rb:518 +msgid "tag|example|Declaring a method as an attribute" +msgstr "tag|example|属性としてメソッドを宣言する" + +# @example +#: ../lib/yard/tags/directives.rb:518 +msgid "tag|example|Documenting dynamic module inclusion" +msgstr "tag|example|動的にモジュール含有するドキュメントを作成する" + +# @example +#: ../lib/yard/tags/directives.rb:518 +msgid "tag|example|Parsing C code" +msgstr "tag|example|Cのコードを解析する" + +# YARD::Tags::ScopeDirective +#: ../lib/yard/tags/directives.rb:536 +msgid "" +"Modifies the current parsing scope (class or instance). If this\n" +"directive is defined on a docstring attached to an object definition,\n" +"it is applied only to that object. Otherwise, it applies the scope\n" +"to all future objects in the namespace." +msgstr "" + +# @example Modifying the scope of a set of methods +#: ../lib/yard/tags/directives.rb:552 +msgid "" +"# @!scope class\n" +"\n" +"# Documentation for method1\n" +"def method1; end\n" +"\n" +"# Documentation for method2\n" +"def method2; end" +msgstr "" + +# @example Modifying the scope of a DSL method +#: ../lib/yard/tags/directives.rb:552 +msgid "" +"# @!scope class\n" +"cattr_accessor :subclasses" +msgstr "" + +# @example +#: ../lib/yard/tags/directives.rb:552 +msgid "tag|example|Modifying the scope of a DSL method" +msgstr "tag|example|DSLメソッドのスコープを変更する" + +# @example +#: ../lib/yard/tags/directives.rb:552 +msgid "tag|example|Modifying the scope of a set of methods" +msgstr "tag|example|メソッドのグループのスコープを変更する" + +# YARD::Tags::VisibilityDirective +#: ../lib/yard/tags/directives.rb:565 +msgid "" +"Modifies the current parsing visibility (public, protected, or private).\n" +"If this directive is defined on a docstring attached to an object\n" +"definition, it is applied only to that object. Otherwise, it applies\n" +"the visibility to all future objects in the namespace." +msgstr "" + +# @example Modifying the visibility of a DSL method +#: ../lib/yard/tags/directives.rb:582 +msgid "" +"# @!visibility private\n" +"cattr_accessor :subclasses" +msgstr "" + +# @example Modifying the visibility of a set of methods +#: ../lib/yard/tags/directives.rb:582 +msgid "" +"# Note that Ruby's \"protected\" is recommended over this directive\n" +"# @!visibility protected\n" +"\n" +"# Documentation for method1\n" +"def method1; end\n" +"\n" +"# Documentation for method2\n" +"def method2; end" +msgstr "" + +# @example +#: ../lib/yard/tags/directives.rb:582 +msgid "tag|example|Modifying the visibility of a DSL method" +msgstr "tag|example|DSLメソッドの可視性を変更する" + +# @example +#: ../lib/yard/tags/directives.rb:582 +msgid "tag|example|Modifying the visibility of a set of methods" +msgstr "tag|example|メソッドのグループの可視性を変更する" + +# YARD::Tags::Library +#: ../lib/yard/tags/library.rb:4 +msgid "" +"Keeps track of all the registered meta-data tags and directives.\n" +"Also allows for defining of custom tags and customizing the tag parsing\n" +"syntax." +msgstr "" + +# YARD::CLI::Yardoc +#: ../lib/yard/tags/library.rb:8 +msgid "== Defining Custom Meta-Data Tags" +msgstr "== カスタムメタデータタグを定義する" + +# YARD::Tags::Library +#: ../lib/yard/tags/library.rb:10 +msgid "" +"To define a custom tag, use {define_tag}. You should pass the tag\n" +"name and the factory method to use when creating the tag. If you do not\n" +"provide a factory method to use, it will default to " +"{DefaultFactory#parse_tag}" +msgstr "" + +# YARD::Tags::Library +#: ../lib/yard/tags/library.rb:14 +msgid "" +"You can also define tag objects manually by simply implementing a " +"\"tagname_tag\"\n" +"method that returns a {Tag} object, but they will not take advantage of tag " +"factory\n" +"parsing:" +msgstr "" + +# YARD::Tags::Library +#: ../lib/yard/tags/library.rb:18 +msgid "" +" def mytag_tag(text)\n" +" Tag.new(:mytag, text)\n" +" end" +msgstr "" + +# YARD::Tags::Library +#: ../lib/yard/tags/library.rb:22 +msgid "== Defining Custom Directives" +msgstr "" + +# YARD::Tags::Library +#: ../lib/yard/tags/library.rb:24 +msgid "" +"Directives can be defined by calling the {define_directive} method, taking\n" +"the directive name, an optional tag factory parser method (to parse the\n" +"data in the directive into a temporary {Tag} object) and a {Directive} " +"subclass\n" +"that performs the directive processing. For more information on creating a\n" +"Directive subclass, see the {Directive} class documentation." +msgstr "" + +# YARD::Tags::Library +#: ../lib/yard/tags/library.rb:30 +msgid "" +"Similar to tags, Directives can also be defined manually, in this case " +"using\n" +"the method name \"mydirective_directive\" and returning a new {Directive} " +"object:" +msgstr "" + +# YARD::Tags::Library +#: ../lib/yard/tags/library.rb:33 +msgid "" +" def mydirective_directive(tag, parser)\n" +" MyDirective.new(tag, parser)\n" +" end" +msgstr "" + +# YARD::Tags +#: ../lib/yard/tags/library.rb:37 +msgid "== Namespaced Tags" +msgstr "== Namespaceタグ" + +# YARD::Tags::Library +#: ../lib/yard/tags/library.rb:39 +msgid "" +"In YARD 0.8.0+, tags can be namespaced using the '.' character. It is " +"recommended\n" +"to namespace project specific tags, like +@yard.tag_name+, so that tags do " +"not\n" +"collide with other plugins or new built-in tags." +msgstr "" + +# YARD::Tags::Library +#: ../lib/yard/tags/library.rb:43 +msgid "== Adding/Changing the Tag Syntax" +msgstr "" + +# YARD::Tags::Library +#: ../lib/yard/tags/library.rb:45 +msgid "" +"If you have specialized tag parsing needs you can substitute the {#factory}\n" +"object with your own by setting {Library.default_factory= Library." +"default_factory}\n" +"to a new class with its own parsing methods before running YARD. This is " +"useful\n" +"if you want to change the syntax of existing tags (@see, @since, etc.)" +msgstr "" +"== 追加や変更のタグ構文\n" +"あなたが、専用のタグ解析が必要な場合、\n" +"自分で{Library.default_factory= Library.default_factory}を\n" +"YARDが起動する前に自身を解析するメソッドを用い\n" +"新しいクラスに設定する事によって\n" +"{#factory} オブジェクトを代替できる\n" +"これは、既に存在するタグ(@see,@since等)構文を変更したい場合、便利である。" + +# @example Defining a custom directive +#: ../lib/yard/tags/library.rb:58 +msgid "define_directive :method, :with_title_and_text, MethodDirective" +msgstr "" + +# @example Defining a custom tag +#: ../lib/yard/tags/library.rb:58 +msgid "" +"define_tag \"Parameter\", :param, :with_types_and_name\n" +"define_tag \"Author\", :author" +msgstr "" + +# @example +#: ../lib/yard/tags/library.rb:58 +msgid "tag|example|Defining a custom directive" +msgstr "tag|example|カスタムディレクティブを定義する" + +# @example +#: ../lib/yard/tags/library.rb:58 +msgid "tag|example|Defining a custom tag" +msgstr "tag|example|カスタムタグを定義する" + +# @see +#: ../lib/yard/tags/library.rb:58 ../lib/yard/tags/library.rb:84 +msgid "tag|see|DefaultFactory" +msgstr "" + +# @see +#: ../lib/yard/tags/library.rb:58 +msgid "tag|see|Directive" +msgstr "" + +# @see +#: ../lib/yard/tags/library.rb:58 +msgid "tag|see|define_directive" +msgstr "" + +# @see +#: ../lib/yard/tags/library.rb:58 +msgid "tag|see|define_tag" +msgstr "" + +# @return [SymbolHash{Symbol=>String}] +#: ../lib/yard/tags/library.rb:62 +msgid "" +"the map of tag names and their\n" +"respective display labels." +msgstr "" + +# @return [NamespaceObject] +#: ../lib/yard/tags/library.rb:66 +msgid "the main Library instance object." +msgstr "メインライブライリのインスタンスオブジェクト" + +# YARD::Tags::Library.default_factory= +#: ../lib/yard/tags/library.rb:71 +msgid "" +"Replace the factory object responsible for parsing tags by setting\n" +"this to an object (or class) that responds to +parse_TAGNAME+ methods\n" +"where +TAGNAME+ is the name of the tag." +msgstr "" +"+TAGNAME+ がタグの名前となる処理の所で、\n" +"+parse_TAGNAME+ メソッドに関連するオブジェクト(又は,クラス)の為に、\n" +"これを設定する事によってタグを解析するベースであるfactoryオブジェクトを変更す" +"る。" + +# YARD::Tags::Library.default_factory= +#: ../lib/yard/tags/library.rb:75 +msgid "" +"You should set this value before performing any source parsing with\n" +"YARD, otherwise your factory class will not be used." +msgstr "" +"あなたはYARDによって何らかのソースの解析を実行する前に、この値を設定しなけれ" +"ばならない。\n" +"設定しない場合、あなたのfactoryクラスは利用できない。" + +# @example +#: ../lib/yard/tags/library.rb:84 +msgid "YARD::Tags::Library.default_factory = MyFactory" +msgstr "" + +# @param [Class, Object] +#: ../lib/yard/tags/library.rb:84 +msgid "tag|param|factory" +msgstr "" + +# @param [Class, Object] factory +#: ../lib/yard/tags/library.rb:84 +msgid "the factory that parses all tags" +msgstr "全てのタグを解析するファクトリー" + +# YARD::Tags::Library.factory_method_for +#: ../lib/yard/tags/library.rb:93 +msgid "" +"Returns the factory method used to parse the tag text for a specific tag" +msgstr "" +"特定のタグ用のタグテキストを解析するのに、利用されるファクトリーメソッドを返" +"す。" + +# @return [nil] +#: ../lib/yard/tags/library.rb:100 ../lib/yard/tags/library.rb:113 +msgid "if the tag is freeform text" +msgstr "タグがフリーフォームテキストの場合" + +# @return [Class] +#: ../lib/yard/tags/library.rb:100 +msgid "" +"the Tag class to use to parse the tag\n" +"or the method to call on the factory class" +msgstr "ファクトリークラスで呼び出すタグやメソッドを解析し利用する為のタグクラス" + +# @return [Symbol] +#: ../lib/yard/tags/library.rb:100 ../lib/yard/tags/library.rb:113 +msgid "the factory method name for the tag" +msgstr "タグの為のfactoryメソッド名" + +# YARD::Tags::Library.factory_method_for +#: ../lib/yard/tags/library.rb:105 +msgid "" +"Returns the factory method used to parse the tag text for a specific\n" +"directive" +msgstr "" +"特定のディレクティブ用に\n" +"タグテキストを解析する為に利用されたファクトリーメソッドを返す" + +# @param [Boolean] +#: ../lib/yard/tags/library.rb:113 +msgid "tag|param|directive" +msgstr "" + +# @return [Class] +#: ../lib/yard/tags/library.rb:113 +msgid "" +"the Tag class to use to parse the tag or\n" +"the methods to call on the factory class" +msgstr "" +"ファクトリークラスで呼び出す為に\n" +"タグやメソッドを解析し利用する為のタグクラス" + +# @param [String, Symbol] section +#: ../lib/yard/tags/library.rb:113 +msgid "the directive name" +msgstr "ディレクティブ名" + +# YARD::Tags::Library.visible_tags +# YARD::Tags::Library.visible_tags= +#: ../lib/yard/tags/library.rb:118 +msgid "" +"Sets the list of tags to display when rendering templates. The order of\n" +"tags in the list is also significant, as it represents the order that\n" +"tags are displayed in templates." +msgstr "" +"テンプレートをレンダリングする時、\n" +"表示する為にタグのリストをセットする。\n" +"リストの中のタグの順番は重要である。\n" +"これは、タグがテンプレートの中で表示される順番を表す。" + +# YARD::Tags::Library.visible_tags +# YARD::Tags::Library.visible_tags= +#: ../lib/yard/tags/library.rb:122 +msgid "" +"You can use the {Array#place} to insert new tags to be displayed in\n" +"the templates at specific positions:" +msgstr "" +"特定の場所でテンプレートの中で、\n" +"表示される新しいタグを挿入する為に{Array#place}メソッドを利用できる。" + +# YARD::Tags::Library.visible_tags +# YARD::Tags::Library.visible_tags= +#: ../lib/yard/tags/library.rb:125 +msgid " Library.visible_tags.place(:mytag).before(:return)" +msgstr "" + +# @return [Array] +#: ../lib/yard/tags/library.rb:128 +msgid "a list of ordered tags" +msgstr "命令されるタグのリスト" + +# YARD::Tags::Library.transitive_tags +# YARD::Tags::Library.transitive_tags= +#: ../lib/yard/tags/library.rb:131 +msgid "" +"Sets the list of tags that should apply to any children inside the\n" +"namespace they are defined in. For instance, a \"@since\" tag should\n" +"apply to all methods inside a module it is defined in. Transitive\n" +"tags can be overridden by directly defining a tag on the child object." +msgstr "" +"定義されるnamespaceの内部で任意の子を適用しタグのリストをグループ化すべきであ" +"る。\n" +"例えば、\"@since\"タグは、モジュールの内部で定義される全てのメソッドが適用さ" +"れる。\n" +"過渡的なタグは、子のオブジェクトの上(親)のタグを直接定義する事によって上書き" +"できる。" + +# @return [Array] +#: ../lib/yard/tags/library.rb:137 +msgid "a list of transitive tags" +msgstr "過渡的なタグのリスト" + +# YARD::Tags::Library.sorted_labels +#: ../lib/yard/tags/library.rb:140 +msgid "" +"Sorts the labels lexically by their label name, often used when displaying\n" +"the tags." +msgstr "" +"ラベルをそのラベル名によってソートする。\n" +"タグを表示する時に、よく利用される。" + +# @return [Array, String] +#: ../lib/yard/tags/library.rb:143 +msgid "the sorted labels as an array of the tag name and label" +msgstr "ソートされるタグ名やラベルの配列" + +# YARD::Tags::Library.define_tag +#: ../lib/yard/tags/library.rb:148 +msgid "" +"Convenience method to define a new tag using one of {Tag}'s factory methods, " +"or the\n" +"regular {DefaultFactory#parse_tag} factory method if none is supplied." +msgstr "" +"{Tag}factoryメソッドの一つによって新しいタグを定義する便利なメソッド、\n" +"又、提供されない場合、正規の{DefaultFactory#parse_tag}メソッド" + +# @param [Fixnum] +#: ../lib/yard/tags/library.rb:158 +msgid "tag|param|label" +msgstr "" + +# @param [#to_s, Class] +# @param [CodeObjects::MethodObject] +#: ../lib/yard/tags/library.rb:158 +#: ../lib/yard/templates/helpers/html_helper.rb:430 +#: ../lib/yard/templates/helpers/html_helper.rb:467 +msgid "tag|param|meth" +msgstr "" + +# @param [#to_s] label +#: ../lib/yard/tags/library.rb:158 +msgid "the label used when displaying the tag in templates" +msgstr "" + +# @param [#to_s] tag +#: ../lib/yard/tags/library.rb:158 +msgid "the tag name to create" +msgstr "作成するタグ名" + +# @param [#to_s, Class] meth +#: ../lib/yard/tags/library.rb:158 +msgid "" +"the {Tag} factory method to call when\n" +"creating the tag or the name of the class to directly create a tag for" +msgstr "" +"タグや直接タグを作成するクラスの名前を作成する時、呼び出すfactoryメソッドの" +"{Tag}" + +# @overload +#: ../lib/yard/tags/library.rb:196 +msgid "tag|overload|define_directive" +msgstr "" + +# YARD::Tags::Library#factory +# YARD::Tags::Library#factory= +#: ../lib/yard/tags/library.rb:258 +msgid "" +"A factory class to handle parsing of tags, defaults to {default_factory}" +msgstr "" +"タグの解析を操作するfactoryクラス、デフォルトは{default_factory}となる。" + +# @return [Library] +#: ../lib/yard/tags/library.rb:260 +msgid "a new instance of Library" +msgstr "ライブラリの新しいインスタンス" + +# @param tag_name +#: ../lib/yard/tags/library.rb:267 ../lib/yard/tags/library.rb:280 +msgid "the name of the tag to look for" +msgstr "検索する為のタグの名前" + +# @return [Boolean] +#: ../lib/yard/tags/library.rb:267 +msgid "" +"whether a tag by the given name is registered in\n" +"the library." +msgstr "" + +# YARD::CodeObjects::CodeObjectList#initialize +#: ../lib/yard/tags/library.rb:272 +msgid "Creates a new {Tag} object with a given tag name and data" +msgstr "与えられたタグ名とデータを用い新しい {Tag} オブジェクトを作成する。" + +# @return [Base] +# @return [MacroObject] +#: ../lib/yard/tags/library.rb:273 +msgid "the newly created tag object" +msgstr "新たに作成されたオブジェクト" + +# @return [Boolean] +#: ../lib/yard/tags/library.rb:280 +msgid "" +"whether a directive by the given name is registered in\n" +"the library." +msgstr "" + +# YARD::Docstring#initialize +#: ../lib/yard/tags/library.rb:285 +msgid "" +"Creates a new directive with tag information and a docstring parser\n" +"object." +msgstr "タグ情報とdocstringパーサーオブジェクトを用い新しいディレクティブを作成する" + +# @return [String] +#: ../lib/yard/tags/library.rb:290 ../lib/yard/tags/tag.rb:14 +msgid "the name of the tag" +msgstr "タグの名前" + +# @return [Base] +# @return [MacroObject] +#: ../lib/yard/tags/library.rb:290 +msgid "the newly created directive" +msgstr "新たに作成されたディレクティブ" + +# @return [CodeObjects::Base] +#: ../lib/yard/tags/library.rb:290 +msgid "the parser object parsing the docstring" +msgstr "パーサーオブジェクト、docstringを解析する" + +# @param [Symbol] tag +# @param [String] tag_name +# @param [String] name +#: ../lib/yard/tags/library.rb:290 +msgid "the tag data" +msgstr "タグデータ" + +#: ../lib/yard/tags/library.rb:312 +msgid "" +"# @abstract Subclass and override {#run} to implement\n" +"# a custom Threadable class.\n" +"class Runnable\n" +" def run; raise NotImplementedError end\n" +"end" +msgstr "" + +# @yard.tag abstract +#: ../lib/yard/tags/library.rb:312 +msgid "[] Abstract" +msgstr "" + +# @param [Boolean] +#: ../lib/yard/tags/library.rb:312 +msgid "tag|yard.tag|abstract" +msgstr "" + +#: ../lib/yard/tags/library.rb:313 +msgid "" +"Marks a class/module/method as abstract with optional\n" +"implementor information." +msgstr "任意の実装情報をと一緒に用い概要としてclass/module/methodをマークする" + +#: ../lib/yard/tags/library.rb:327 +msgid "" +"The special name +@api private+ does display a notice in\n" +"documentation if it is listed, letting users know that the\n" +"method is not to be used by external components." +msgstr "" +"特別な名前の +@api private+ は\n" +"それが記述された場合ドキュメントの中で通知を表示するようになり\n" +"ユーザーにメソッドが外部の構成要素によって使えないことを知らせる。" + +# @note +#: ../lib/yard/tags/library.rb:327 ../lib/yard/tags/library.rb:473 +#: ../lib/yard/tags/library.rb:518 +msgid "" +"This tag is *transitive*. If it is applied on a\n" +"namespace (module or class), it will automatically be\n" +"applied to all children objects of that namespace unless\n" +"it is redefined on the child object." +msgstr "" + +# @yard.tag api +#: ../lib/yard/tags/library.rb:327 +msgid "[] API Visibility" +msgstr "" + +# @example +#: ../lib/yard/tags/library.rb:327 +msgid "" +"class Post\n" +" # @api private\n" +" def reset_table!; table.flush end\n" +"end" +msgstr "" + +# @param [Boolean] +#: ../lib/yard/tags/library.rb:327 +msgid "tag|yard.tag|api" +msgstr "" + +#: ../lib/yard/tags/library.rb:328 +msgid "" +"Declares the API that the object belongs to. Does not display in\n" +"output, but useful for performing queries (+yardoc --query+). Any text is\n" +"allowable in this tag, and there are no predefined values." +msgstr "" +"オブジェクトが属するAPIを宣言する。\n" +"出力を表示できないが、クエリーの実行用に便利である(+yardoc --query+)。\n" +"任意のテキストは\n" +"このタグを受入可能であり、事前定義された値はない。" + +# @example +#: ../lib/yard/tags/library.rb:337 +msgid "" +"# @attr [String] name the name of the structure\n" +"# @attr [Fixnum] size the size of the structure\n" +"class MyStruct < Struct; end" +msgstr "" + +# YARD::Handlers::Base +#: ../lib/yard/tags/library.rb:337 +msgid "Attribute" +msgstr "属性" + +# @note +#: ../lib/yard/tags/library.rb:337 ../lib/yard/tags/library.rb:347 +#: ../lib/yard/tags/library.rb:357 +msgid "This attribute is only applicable on class docstrings" +msgstr "" + +# @deprecated +#: ../lib/yard/tags/library.rb:337 ../lib/yard/tags/library.rb:347 +#: ../lib/yard/tags/library.rb:357 +msgid "Use the more powerful {tag:!attribute} directive instead." +msgstr "" + +# @param [String] +# @param [Array] +# @param [String, :root] +#: ../lib/yard/tags/library.rb:337 +msgid "tag|yard.tag|attr" +msgstr "" + +# YARD::Tags::Library#attr_tag +#: ../lib/yard/tags/library.rb:338 +msgid "Declares a readwrite attribute on a Struct or class." +msgstr "" + +# @example +#: ../lib/yard/tags/library.rb:347 ../lib/yard/tags/library.rb:357 +msgid "" +"# @attr_reader [String] name the name of the structure\n" +"# @attr_reader [Fixnum] size the size of the structure\n" +"class MyStruct < Struct; end" +msgstr "" + +# YARD::Server::Commands::Base#request +# YARD::Server::Commands::Base#request= +# YARD::Server::Commands::Base#path +# YARD::Server::Commands::Base#path= +# YARD::Server::Commands::Base#headers +# YARD::Server::Commands::Base#headers= +# YARD::Server::Commands::Base#status +# YARD::Server::Commands::Base#status= +# YARD::Server::Commands::Base#body +# YARD::Server::Commands::Base#body= +#: ../lib/yard/tags/library.rb:347 +msgid "Attribute Getter" +msgstr "Getter属性" + +# @param [Boolean] +#: ../lib/yard/tags/library.rb:347 +msgid "tag|yard.tag|attr_reader" +msgstr "" + +# YARD::Tags::Library#attr_reader_tag +#: ../lib/yard/tags/library.rb:348 +msgid "Declares a readonly attribute on a Struct or class." +msgstr "" + +# YARD::Server::Commands::Base#request +# YARD::Server::Commands::Base#request= +# YARD::Server::Commands::Base#path +# YARD::Server::Commands::Base#path= +# YARD::Server::Commands::Base#headers +# YARD::Server::Commands::Base#headers= +# YARD::Server::Commands::Base#status +# YARD::Server::Commands::Base#status= +# YARD::Server::Commands::Base#body +# YARD::Server::Commands::Base#body= +#: ../lib/yard/tags/library.rb:357 +msgid "Attribute Setter" +msgstr "Setter属性" + +# @param [String] +#: ../lib/yard/tags/library.rb:357 +msgid "tag|yard.tag|attr_writer" +msgstr "" + +# YARD::Tags::Library#attr_writer_tag +#: ../lib/yard/tags/library.rb:358 +msgid "Declares a writeonly attribute on a Struct or class." +msgstr "" + +# @example +#: ../lib/yard/tags/library.rb:364 +msgid "" +"# @author Foo Bar \n" +"class MyClass; end" +msgstr "" + +# @yard.tag author +#: ../lib/yard/tags/library.rb:364 +msgid "[] Author" +msgstr "" + +# @param [String] +#: ../lib/yard/tags/library.rb:364 +msgid "tag|yard.tag|author" +msgstr "" + +#: ../lib/yard/tags/library.rb:365 +msgid "List the author or authors of a class, module, or method." +msgstr "著者やクラス,モジュール,メソッドの著者を記述する" + +# @example Deprecate a method with a replacement API +#: ../lib/yard/tags/library.rb:380 +msgid "" +"# @deprecated Use {#bar} instead.\n" +"def foo; end" +msgstr "" + +# @yard.tag deprecated +#: ../lib/yard/tags/library.rb:380 +msgid "[] Deprecated" +msgstr "" + +# @example Deprecate a method with no replacement +#: ../lib/yard/tags/library.rb:380 +msgid "" +"class Thread\n" +" # @deprecated Exiting a thread in this way is not reliable and\n" +" # can cause a program crash.\n" +" def kill; end\n" +"end" +msgstr "" + +# @example +#: ../lib/yard/tags/library.rb:380 +msgid "tag|example|Deprecate a method with a replacement API" +msgstr "tag|example|置換APIを用いメソッドをメソッドを廃止する" + +# @example +#: ../lib/yard/tags/library.rb:380 +msgid "tag|example|Deprecate a method with no replacement" +msgstr "tag|example|置換APIを用いないでメソッドを廃止する" + +# @param [Boolean] +#: ../lib/yard/tags/library.rb:380 +msgid "tag|yard.tag|deprecated" +msgstr "" + +# YARD::Tags::Library#deprecated_tag +#: ../lib/yard/tags/library.rb:381 +msgid "" +"Marks a method/class as deprecated with an optional description.\n" +"The description should be used to inform users of the recommended\n" +"migration path, and/or any useful information about why the object\n" +"was marked as deprecated." +msgstr "" + +# @example +#: ../lib/yard/tags/library.rb:391 +msgid "" +"# @example Reverse a String\n" +"# \"mystring\".reverse #=> \"gnirtsym\"\n" +"def reverse; end" +msgstr "" + +# @yard.tag [with_title_and_text] example +#: ../lib/yard/tags/library.rb:391 +msgid "Example" +msgstr "" + +# @yard.signature +#: ../lib/yard/tags/library.rb:391 +msgid "" +"Optional title\n" +"Code block" +msgstr "" + +# @param [String, CodeObjects::ExtraFileObject] +# @param [String] +# @param [String, Regexp] +#: ../lib/yard/tags/library.rb:391 +msgid "tag|yard.tag|example" +msgstr "" + +#: ../lib/yard/tags/library.rb:392 +msgid "" +"Show an example snippet of code for an object. The first line\n" +"is an optional title." +msgstr "オブジェクト用にコード片の例を表示する。最初の行は任意のタイトル。" + +#: ../lib/yard/tags/library.rb:399 +msgid "" +"# @note This method should only be used in outer space.\n" +"def eject; end" +msgstr "" + +# @yard.tag note +#: ../lib/yard/tags/library.rb:399 +msgid "[] Note" +msgstr "" + +# @see +#: ../lib/yard/tags/library.rb:399 +msgid "tag|see|tag:todo" +msgstr "" + +# @param [Parser::Ruby::AstNode] +#: ../lib/yard/tags/library.rb:399 +msgid "tag|yard.tag|note" +msgstr "" + +# YARD::Tags::Library#note_tag +#: ../lib/yard/tags/library.rb:400 +msgid "Adds an emphasized note at the top of the docstring for the object" +msgstr "" + +# @example +#: ../lib/yard/tags/library.rb:418 +msgid "" +"# @param [Hash] opts the options to create a message with.\n" +"# @option opts [String] :subject The subject\n" +"# @option opts [String] :from ('nobody') From address\n" +"# @option opts [String] :to Recipient email\n" +"# @option opts [String] :body ('') The email's body\n" +"def send_email(opts = {}) end" +msgstr "" + +# @param [Hash] options +#: ../lib/yard/tags/library.rb:418 +msgid "Options Hash" +msgstr "ハッシュのオプション" + +# @yard.signature +#: ../lib/yard/tags/library.rb:418 +msgid "name [Types] option_key (default_value) description" +msgstr "" + +# @param [String, Symbol] +# @param [Symbol, String] +#: ../lib/yard/tags/library.rb:418 +msgid "tag|yard.tag|option" +msgstr "" + +#: ../lib/yard/tags/library.rb:419 +msgid "" +"Describe an options hash in a method. The tag takes the\n" +"name of the options parameter first, followed by optional types,\n" +"the option key name, a default value for the key and a\n" +"description of the option. The default value should be placed within\n" +"parentheses and is optional (can be omitted)." +msgstr "" +"メソッドの中のハッシュのオプションを説明する。\n" +"タグは最初にoptionsのパラメータの名前(name)を取得し、\n" +"続いて任意で型(types)、オプションのキー名、\n" +"キー用のデフォルトの値、オプションの説明となる。\n" +"デフォルト値は任意で(入れなくてもよい)\n" +"括弧の中に置なければならない。" + +# YARD::Tags::Library#option_tag +#: ../lib/yard/tags/library.rb:425 +msgid "" +"Note that a +@param+ tag need not be defined for the options\n" +"hash itself, though it is useful to do so for completeness." +msgstr "" + +# @example +#: ../lib/yard/tags/library.rb:437 +msgid "" +"# @overload set(key, value)\n" +"# Sets a value on key\n" +"# @param [Symbol] key describe key param\n" +"# @param [Object] value describe value param\n" +"# @overload set(value)\n" +"# Sets a value on the default key +:foo+\n" +"# @param [Object] value describe value param\n" +"def set(*args) end" +msgstr "" + +# @yard.tag [OverloadTag] overload +#: ../lib/yard/tags/library.rb:437 +msgid "Overloads" +msgstr "" + +# @yard.signature +#: ../lib/yard/tags/library.rb:437 +msgid "" +"method_signature(parameters)\n" +"Indented docstring for overload method" +msgstr "" + +# @param [Fixnum] +#: ../lib/yard/tags/library.rb:437 +msgid "tag|yard.tag|overload" +msgstr "" + +#: ../lib/yard/tags/library.rb:438 +msgid "" +"Describe that your method can be used in various\n" +"contexts with various parameters or return types. The first\n" +"line should declare the new method signature, and the following\n" +"indented tag data will be a new documentation string with its\n" +"own tags adding metadata for such an overload." +msgstr "" +"あなたのメソッドが様々なパラメータや戻りの型と一緒に\n" +"様々なコンテキストで利用される説明をする。\n" +"最初に行は新しいメソッドのシグネチャで宣言しなければならない、\n" +"そして続くインデントされたタグデータは\n" +"オーバーロードの様に自身の追加するメタデータタグを用い\n" +"新しいドキュメント文字列になる。" + +# @example +#: ../lib/yard/tags/library.rb:445 +msgid "" +"# @param [String] the URL of the page to download\n" +"def load_page(url) end" +msgstr "" + +# @yard.tag [with_types_and_name] param +#: ../lib/yard/tags/library.rb:445 +msgid "Parameters" +msgstr "" + +# @param [Array] +# @param [Hash] +#: ../lib/yard/tags/library.rb:445 +msgid "tag|yard.tag|param" +msgstr "" + +# YARD::Tags::Library#param_tag +#: ../lib/yard/tags/library.rb:446 +msgid "" +"Documents a single method parameter with a given name, type\n" +"and optional description." +msgstr "" + +# @example +#: ../lib/yard/tags/library.rb:473 +msgid "" +"# @private\n" +"class InteralImplementation; end" +msgstr "" + +# @note +#: ../lib/yard/tags/library.rb:473 +msgid "" +"This method is not recommended for hiding undocumented or\n" +"\"unimportant\" methods. This tag should only be used to mark objects\n" +"private when Ruby visibility rules cannot do so. In Ruby 1.9.3, you\n" +"can use +private_constant+ to declare constants (like classes or\n" +"modules) as private, and should be used instead of +@private+." +msgstr "" + +# @yard.tag private +#: ../lib/yard/tags/library.rb:473 +msgid "[] Private" +msgstr "" + +# @see +#: ../lib/yard/tags/library.rb:473 +msgid "tag|see|tag:api" +msgstr "" + +# @param [String] +# @param [Array] +# @param [String, :root] +#: ../lib/yard/tags/library.rb:473 +msgid "tag|yard.tag|private" +msgstr "" + +# YARD::Tags::Library#private_tag +#: ../lib/yard/tags/library.rb:474 +msgid "" +"Declares that the _logical_ visibility of an object is private.\n" +"In other words, it specifies that this method should be marked\n" +"private but cannot due to Ruby's visibility restrictions. This\n" +"exists for classes, modules and constants that do not obey Ruby's\n" +"visibility rules. For instance, an inner class might be considered\n" +"\"private\", though Ruby would make no such distinction." +msgstr "" + +# YARD::Tags::Library#private_tag +#: ../lib/yard/tags/library.rb:481 +msgid "" +"This tag is meant to be used in conjunction with the +--no-private+\n" +"command-line option, and is required to actually remove these objects\n" +"from documentation output. See {file:README.md} for more information on\n" +"switches." +msgstr "" + +# @example +#: ../lib/yard/tags/library.rb:482 +msgid "" +"# @raise [AccountBalanceError] if the account does not have\n" +"# sufficient funds to perform the transaction\n" +"def withdraw(amount) end" +msgstr "" + +# @yard.tag [with_types] raise +#: ../lib/yard/tags/library.rb:482 +msgid "Raises" +msgstr "" + +# @param [Boolean] +#: ../lib/yard/tags/library.rb:482 +msgid "tag|yard.tag|raise" +msgstr "" + +# YARD::Tags::Library#raise_tag +#: ../lib/yard/tags/library.rb:483 +msgid "" +"Describes that a method may raise a given exception, with\n" +"an optional description of what it may mean." +msgstr "" + +# YARD::Tags::Library#private_tag +#: ../lib/yard/tags/library.rb:486 +msgid "" +"If you simply want to set the API visibility of a method, you should\n" +"look at the {tag:api} tag instead." +msgstr "" + +# @example A regular return value +#: ../lib/yard/tags/library.rb:498 +msgid "" +"# @return [Fixnum] the size of the file\n" +"def size; @file.size end" +msgstr "" + +# @example A method returns an Array or a single object +#: ../lib/yard/tags/library.rb:498 +msgid "" +"# @return [String] if a single object was returned\n" +"# from the database.\n" +"# @return [Array] if multiple objects were\n" +"# returned.\n" +"def find(query) end" +msgstr "" + +# @yard.tag [with_types] return +#: ../lib/yard/tags/library.rb:498 +msgid "Returns" +msgstr "" + +# @example +#: ../lib/yard/tags/library.rb:498 +msgid "tag|example|A method returns an Array or a single object" +msgstr "tag|example|メソッドは配列や単一のオブジェクトを返す" + +# @example +#: ../lib/yard/tags/library.rb:498 +msgid "tag|example|A regular return value" +msgstr "tag|example|慣習的な戻り値の例" + +# @param [Boolean] +#: ../lib/yard/tags/library.rb:498 +msgid "tag|yard.tag|return" +msgstr "" + +# YARD::Tags::Library#return_tag +#: ../lib/yard/tags/library.rb:499 +msgid "" +"Describes the return value (and type or types) of a method.\n" +"You can list multiple return tags for a method in the case\n" +"where a method has distinct return cases. In this case, each\n" +"case should begin with \"if ...\"." +msgstr "" + +# @example +#: ../lib/yard/tags/library.rb:510 +msgid "" +"# Synchronizes system time using NTP.\n" +"# @see http://ntp.org/documentation.html NTP Documentation\n" +"# @see NTPHelperMethods\n" +"class NTPUpdater; end" +msgstr "" + +# @yard.tag [with_name] see +#: ../lib/yard/tags/library.rb:510 +msgid "See Also" +msgstr "" + +# @param [Tags::Tag, Tags::RefTag] +#: ../lib/yard/tags/library.rb:510 +msgid "tag|yard.tag|see" +msgstr "" + +#: ../lib/yard/tags/library.rb:511 +msgid "" +"\"See Also\" references for an object. Accepts URLs or\n" +"other code objects with an optional description at the end.\n" +"Note that the URL or object will be automatically linked by\n" +"YARD and does not need to be formatted with markup." +msgstr "" +"\"See Also(参照)\"はオブジェクトに参照される。\n" +"URLや最後で任意の説明を用いた他のコードオブジェクトを受入れる。\n" +"留意する事としてURLやオブジェクトは\n" +"YARDによって自動的にリンクされ、\n" +"マークアップを用いフォーマットされる必要はない。" + +# @example +#: ../lib/yard/tags/library.rb:518 +msgid "" +"# @since 1.2.4\n" +"def clear_routes; end" +msgstr "" + +# @yard.tag since +#: ../lib/yard/tags/library.rb:518 +msgid "[] Since" +msgstr "" + +# @param [Fixnum, nil] +#: ../lib/yard/tags/library.rb:518 +msgid "tag|yard.tag|since" +msgstr "" + +#: ../lib/yard/tags/library.rb:519 +msgid "Lists the version that the object was first added." +msgstr "オブジェクトが最初に追加されたバージョンを記述する" + +#: ../lib/yard/tags/library.rb:544 +msgid "" +"# @todo Add support for Jabberwocky service.\n" +"# There is an open source Jabberwocky library available\n" +"# at http://jbrwcky.org that can be easily integrated.\n" +"class Wonderlander; end" +msgstr "" + +# @yard.tag todo +#: ../lib/yard/tags/library.rb:544 +msgid "[] Todo Item" +msgstr "" + +# @see +#: ../lib/yard/tags/library.rb:544 +msgid "tag|see|tag:note" +msgstr "" + +# @param [String] +#: ../lib/yard/tags/library.rb:544 +msgid "tag|yard.tag|todo" +msgstr "" + +# YARD::Tags::Library#todo_tag +#: ../lib/yard/tags/library.rb:545 +msgid "" +"Marks a TODO note in the object being documented.\n" +"For reference, objects with TODO items can be enumerated\n" +"from the command line with a simple command:" +msgstr "" + +# YARD::Tags::Library#todo_tag +#: ../lib/yard/tags/library.rb:549 +msgid "" +" !!!sh\n" +" mocker$ yard list --query '@todo'\n" +" lib/mocker/mocker.rb:15: Mocker\n" +" lib/mocker/report/html.rb:5: Mocker::Report::Html" +msgstr "" + +# YARD::Tags::Library#todo_tag +#: ../lib/yard/tags/library.rb:554 +msgid "" +"YARD can also be used to enumerate the TODO items from\n" +"a short script:" +msgstr "" + +# YARD::Tags::Library#todo_tag +#: ../lib/yard/tags/library.rb:557 +msgid "" +" !!!ruby\n" +" require 'yard'\n" +" YARD::Registry.load!.all.each do |o|\n" +" puts o.tag(:todo).text if o.tag(:todo)\n" +" end" +msgstr "" + +# @example +#: ../lib/yard/tags/library.rb:557 +msgid "" +"# The public REST API for http://jbrwcky.org\n" +"# @version 2.0\n" +"class JabberwockyAPI; end" +msgstr "" + +# @yard.tag version +#: ../lib/yard/tags/library.rb:557 +msgid "[] Version" +msgstr "" + +# @param [Array] +#: ../lib/yard/tags/library.rb:557 +msgid "tag|yard.tag|version" +msgstr "" + +# YARD::Tags::Library#version_tag +#: ../lib/yard/tags/library.rb:558 +msgid "" +"Lists the version of a class, module or method. This is\n" +"similar to a library version, but at finer granularity.\n" +"In some cases, version of specific modules, classes, methods\n" +"or generalized components might change independently between\n" +"releases. A version tag is used to infer the API compatibility\n" +"of a specific object." +msgstr "" + +# @example +#: ../lib/yard/tags/library.rb:573 +msgid "" +"# For a block {|a,b,c| ... }\n" +"# @yield [a, b, c] Gives 3 random numbers to the block\n" +"def provide3values(&block) yield(42, 42, 42) end" +msgstr "" + +# @yard.tag [with_types] yield +#: ../lib/yard/tags/library.rb:573 +msgid "Yields" +msgstr "" + +#: ../lib/yard/tags/library.rb:573 +msgid "[parameters] description" +msgstr "" + +# @yieldparam [Tags::Tag] +#: ../lib/yard/tags/library.rb:573 +msgid "tag|see|tag:yieldparam" +msgstr "" + +# @see +#: ../lib/yard/tags/library.rb:573 +msgid "tag|see|tag:yieldreturn" +msgstr "" + +# @param [Fixnum] +#: ../lib/yard/tags/library.rb:573 +msgid "tag|yard.tag|yield" +msgstr "" + +# YARD::Tags::Library#yield_tag +#: ../lib/yard/tags/library.rb:574 +msgid "" +"Describes what a method might yield to a given block.\n" +"The types specifier list should not list types, but names\n" +"of the parameters yielded to the block. If you define\n" +"parameters with +@yieldparam+, you do not need to define\n" +"the parameters in the type specification of +@yield+ as\n" +"well." +msgstr "" + +# @example +#: ../lib/yard/tags/library.rb:582 +msgid "" +"# @yieldparam [String] name the name that is yielded\n" +"def with_name(name) yield(name) end" +msgstr "" + +# @yard.tag [with_types_and_name] yieldparam +#: ../lib/yard/tags/library.rb:582 +msgid "Yield Parameters" +msgstr "" + +# @yieldparam [Tags::Tag] +#: ../lib/yard/tags/library.rb:582 +msgid "tag|yard.tag|yieldparam" +msgstr "" + +# YARD::Tags::Library#yieldparam_tag +#: ../lib/yard/tags/library.rb:583 +msgid "" +"Defines a parameter yielded by a block. If you define the\n" +"parameters with +@yieldparam+, you do not need to define\n" +"them via +@yield+ as well." +msgstr "" + +# @example +#: ../lib/yard/tags/library.rb:591 +msgid "" +"# @yieldreturn [Fixnum] the number to add 5 to.\n" +"def add5_block(&block) 5 + yield end" +msgstr "" + +# @yard.tag [with_types] yieldreturn +#: ../lib/yard/tags/library.rb:591 +msgid "Yield Returns" +msgstr "" + +# @see +#: ../lib/yard/tags/library.rb:591 +msgid "tag|see|tag:return" +msgstr "" + +# @yard.tag [with_types] +#: ../lib/yard/tags/library.rb:591 +msgid "tag|yard.tag|yieldreturn" +msgstr "" + +# YARD::Tags::Library#yieldreturn_tag +#: ../lib/yard/tags/library.rb:592 +msgid "" +"Documents the value and type that the block is expected\n" +"to return to the method." +msgstr "" + +# @yard.directive [with_types_and_title] attribute +#: ../lib/yard/tags/library.rb:595 +msgid "AttributeDirective" +msgstr "" + +# @yard.signature +#: ../lib/yard/tags/library.rb:595 +msgid "" +"[r | w | rw] attribute_name\n" +"Indented attribute docstring" +msgstr "" + +# @param [Boolean] +#: ../lib/yard/tags/library.rb:595 +msgid "tag|yard.directive|attribute" +msgstr "" + +# @yard.directive [EndGroupDirective] endgroup +#: ../lib/yard/tags/library.rb:598 +msgid "EndGroupDirective" +msgstr "" + +# @yard.directive [EndGroupDirective] +#: ../lib/yard/tags/library.rb:598 +msgid "tag|yard.directive|endgroup" +msgstr "" + +# @yard.directive [GroupDirective] group +#: ../lib/yard/tags/library.rb:600 +msgid "GroupDirective" +msgstr "" + +# @yard.directive [GroupDirective] +#: ../lib/yard/tags/library.rb:600 +msgid "tag|yard.directive|group" +msgstr "" + +# @yard.directive [with_types_and_title] macro +#: ../lib/yard/tags/library.rb:604 +msgid "MacroDirective" +msgstr "" + +# @yard.signature +#: ../lib/yard/tags/library.rb:604 +msgid "" +"[attach | new] optional_name\n" +"Optional macro expansion data" +msgstr "" + +# @param [MacroObject] +# @param [CodeObjects::MacroObject] +#: ../lib/yard/tags/library.rb:604 +msgid "tag|yard.directive|macro" +msgstr "" + +# @yard.directive [with_title_and_text] method +#: ../lib/yard/tags/library.rb:608 +msgid "MethodDirective" +msgstr "" + +# @yard.signature +#: ../lib/yard/tags/library.rb:608 +msgid "" +"method_signature(parameters)\n" +"Indented method docstring" +msgstr "" + +# @yard.directive [with_title_and_text] +#: ../lib/yard/tags/library.rb:608 +msgid "tag|yard.directive|method" +msgstr "" + +# title +#: ../lib/yard/tags/library.rb:611 +msgid "ParseDirective" +msgstr "パーサーディレクティブ" + +# @return [Symbol] +#: ../lib/yard/tags/library.rb:611 +msgid "[language] code" +msgstr "" + +# @yard.directive [with_types] +#: ../lib/yard/tags/library.rb:611 +msgid "tag|yard.directive|parse" +msgstr "" + +# @yard.directive [ScopeDirective] scope +#: ../lib/yard/tags/library.rb:616 +msgid "ScopeDirective" +msgstr "" + +#: ../lib/yard/tags/library.rb:616 +msgid "class | instance" +msgstr "" + +# @param [Symbol] +#: ../lib/yard/tags/library.rb:616 +msgid "tag|yard.directive|scope" +msgstr "" + +#: ../lib/yard/tags/library.rb:617 +msgid "" +"Sets the scope of a DSL method. Only applicable to DSL method\n" +"calls. Acceptable values are 'class' or 'instance'" +msgstr "" +"DSLメソッドのスコープに設定する。DSLメソッド呼び出しにだけ適用できる。\n" +"受け入れる値は'class'または'instance'である。" + +# @yard.directive [VisibilityDirective] visibility +#: ../lib/yard/tags/library.rb:621 +msgid "VisibilityDirective" +msgstr "" + +# @yard.signature +#: ../lib/yard/tags/library.rb:621 +msgid "public | protected | private" +msgstr "" + +# @yard.directive [VisibilityDirective] +#: ../lib/yard/tags/library.rb:621 +msgid "tag|yard.directive|visibility" +msgstr "" + +#: ../lib/yard/tags/library.rb:622 +msgid "" +"Sets the visibility of a DSL method. Only applicable to\n" +"DSL method calls. Acceptable values are public, protected, or private." +msgstr "" +"DSLメソッドの可視性を設定する。\n" +"DSLメソッド呼び出しに適用できる。\n" +"受け入れる値はpublic,protected,privateとなる" + +# @param value +#: ../lib/yard/tags/option_tag.rb:4 +msgid "the value to set the attribute pair to." +msgstr "pair属性に設定する値" + +# YARD::Tags::OptionTag#pair +#: ../lib/yard/tags/option_tag.rb:5 +msgid "Returns the value of attribute pair" +msgstr "pair属性の値を返す" + +# YARD::Tags::OptionTag#pair= +#: ../lib/yard/tags/option_tag.rb:5 +msgid "Sets the attribute pair" +msgstr "pair属性を設定する" + +# @return [OptionTag] +#: ../lib/yard/tags/option_tag.rb:6 +msgid "a new instance of OptionTag" +msgstr "オプションタグの新しいインスタンス" + +# YARD::Tags::OverloadTag#parameters +#: ../lib/yard/tags/overload_tag.rb:5 +msgid "Returns the value of attribute parameters" +msgstr "parameters属性の値を返す" + +# YARD::Tags::OverloadTag#signature +#: ../lib/yard/tags/overload_tag.rb:5 +msgid "Returns the value of attribute signature" +msgstr "signature属性の値を返す" + +# @return [OverloadTag] +#: ../lib/yard/tags/overload_tag.rb:6 +msgid "a new instance of OverloadTag" +msgstr "OverloadTagの新しいインスタンス" + +# @param value +#: ../lib/yard/tags/ref_tag_list.rb:4 +msgid "the value to set the attribute tag_name to." +msgstr "tag_name属性を設定する値" + +# YARD::Tags::RefTagList#tag_name +#: ../lib/yard/tags/ref_tag_list.rb:5 +msgid "Returns the value of attribute tag_name" +msgstr "tag_name属性の値を返す" + +# YARD::Tags::RefTagList#tag_name= +#: ../lib/yard/tags/ref_tag_list.rb:5 +msgid "Sets the attribute tag_name" +msgstr "tag_name属性を設定する" + +# @return [RefTagList] +#: ../lib/yard/tags/ref_tag_list.rb:6 +msgid "a new instance of RefTagList" +msgstr "RefTagListの新しいインスタンス" + +# YARD::Tags::Tag +#: ../lib/yard/tags/tag.rb:4 +msgid "" +"Represents a metadata tag value (+@tag+). Tags can have any combination of\n" +"{#types}, {#name} and {#text}, or none of the above." +msgstr "" +"タグはメタデータタグの値(+@tag+)を表し\n" +"任意の{#types},{#name},{#text},又は,\n" +"前述のどれでもないメソッドの組み合わせを持つ事が出来る。" + +# @example Programmatic tag creation +#: ../lib/yard/tags/tag.rb:12 +msgid "" +"# The following docstring syntax:\n" +"# @param [String, nil] arg an argument\n" +"#\n" +"# is equivalent to:\n" +"Tag.new(:param, 'an argument', ['String', 'nil'], 'arg')" +msgstr "" +"# 次のdocstring構文は:\n" +"# @param [String, nil] arg an argument\n" +"#\n" +"# 以下と同様になる。\n" +"Tag.new(:param, 'an argument', ['String', 'nil'], 'arg')" + +# @example +#: ../lib/yard/tags/tag.rb:12 +msgid "tag|example|Programmatic tag creation" +msgstr "タグを作成するプログラム例" + +# @return [nil] +#: ../lib/yard/tags/tag.rb:18 +msgid "if no tag text is supplied" +msgstr "タグテキストが指定されない場合" + +# @return [String] +#: ../lib/yard/tags/tag.rb:18 +msgid "the tag text associated with the tag" +msgstr "タグと一緒に関連付けられるタグテキスト" + +# @return [Array] +#: ../lib/yard/tags/tag.rb:22 +msgid "a list of types associated with the tag" +msgstr "タグと一緒に関連付けられる型のリスト" + +# @return [nil] +#: ../lib/yard/tags/tag.rb:22 +msgid "if no types are associated with the tag" +msgstr "型がタグと一緒に関連付けられない場合" + +# @return [String] +#: ../lib/yard/tags/tag.rb:25 +msgid "a name associated with the tag" +msgstr "タグと共に関連づけられる,名前" + +# @return [CodeObjects::Base] +#: ../lib/yard/tags/tag.rb:28 +msgid "the associated object" +msgstr "関連するオブジェクト" + +# YARD::Tags::Tag#initialize +#: ../lib/yard/tags/tag.rb:31 +msgid "" +"Creates a new tag object with a tag name and text. Optionally, formally " +"declared types\n" +"and a key name can be specified." +msgstr "" +"タグ名とテキストと共に新しいタグオブジェクトを作成する。\n" +"任意で、形式的に宣言される型やキー名を指定する事が出来る。" + +# YARD::Tags::Tag#initialize +#: ../lib/yard/tags/tag.rb:34 +msgid "" +"Types are mainly for meta tags that rely on type information, such as +param" +"+, +return+, etc." +msgstr "型は主に、+param+, +return+等の様な型情報を頼るメタタグ用である。" + +# YARD::Tags::Tag#initialize +#: ../lib/yard/tags/tag.rb:36 +msgid "" +"Key names are for tags that declare meta data for a specific key or name, " +"such as +param+,\n" +"+raise+, etc." +msgstr "" +"キー名(name)は +param+ , +raise+ 等のような\n" +"特定のキーや名前用のメタデータを宣言するタグの為にある。" + +# @return [Tag] +#: ../lib/yard/tags/tag.rb:43 +msgid "a new instance of Tag" +msgstr "タグの新しいインスタンス" + +# @param [String] name +#: ../lib/yard/tags/tag.rb:43 +msgid "optional key name which the tag refers to" +msgstr "タグが参照する,任意のキー名" + +# @param [Array] types +#: ../lib/yard/tags/tag.rb:43 +msgid "" +"optional type list of formally declared types\n" +"for the tag" +msgstr "タグ用に形式的に宣言された型の入った,任意の型配列" + +# @param [String] text +#: ../lib/yard/tags/tag.rb:43 +msgid "the descriptive text for this tag" +msgstr "このタグの為の説明文" + +# @param [#to_s] tag_name +#: ../lib/yard/tags/tag.rb:43 +msgid "the tag name to create the tag for" +msgstr "タグを作成する為のタグ名" + +# YARD::Tags::Tag#type +#: ../lib/yard/tags/tag.rb:48 +msgid "" +"Convenience method to access the first type specified. This should mainly\n" +"be used for tags that only specify one type." +msgstr "" +"最初の指定される型にアクセスする為の便利なメソッド,\n" +"これは、主に型が一つだけのタグを指定する時に利用されるべきである。" + +# @see +#: ../lib/yard/tags/tag.rb:52 +msgid "tag|see|#types" +msgstr "" + +# @return [String] +#: ../lib/yard/tags/tag.rb:52 +msgid "the first of the list of specified types" +msgstr "指定される型のリストの最初の部分" + +# YARD::Templates::Engine +#: ../lib/yard/templates/engine.rb:6 +msgid "" +"This module manages all creation, handling and rendering of {Template}\n" +"objects." +msgstr "" +"このモジュールは、全ての作成を管理し,操作する。そして、{Template}オブジェクト" +"から表示する。" + +# YARD::Templates::Engine +#: ../lib/yard/templates/engine.rb:9 +msgid "" +"* To create a template object at a path, use {template}.\n" +"* To render a template, call {render}.\n" +"* To register a template path in the lookup paths, call " +"{register_template_path}." +msgstr "" +"* パスでテンプレートオブジェクトを作成するには、{template}を使う\n" +"* テンプレートを表示するには、{render}を呼び出す\n" +"* 検索するパスでテンプレートパスを記録するには、{register_template_path}を呼" +"び出す。" + +# @return [Array] +#: ../lib/yard/templates/engine.rb:14 +msgid "the list of registered template paths" +msgstr "渡されたテンプレートパスのリスト" + +# YARD::Templates::Engine.register_template_path +#: ../lib/yard/templates/engine.rb:17 +msgid "Registers a new template path in {template_paths}" +msgstr "{template_paths}の中で、新しいテンプレートパスを記録する" + +# @param [String] path +#: ../lib/yard/templates/engine.rb:20 +msgid "a new template path" +msgstr "新しいテンプレートパス" + +# YARD::Templates::Engine.template +#: ../lib/yard/templates/engine.rb:25 +msgid "" +"Creates a template module representing the path. Searches on disk\n" +"for the first directory named +path+ (joined by '/') within the\n" +"template paths and builds a template module for. All other matching\n" +"directories in other template paths will be included in the\n" +"generated module as mixins (for overriding)." +msgstr "" +"パスを表すテンプレートモジュールを作成する。\n" +"テンプレートパスの内部で、\n" +"+path+ と名付けられた最初のディレクトリ('/'区切り)用に、\n" +"ディスク上をサーチする。\n" +"そして、テンプレートモジュール用にビルドする。\n" +"他にマッチするテンプレートパスの中のディレクトリ全ては、mixinとして(オーバー" +"ライド用に)、\n" +"生成されたモジュールが含まれる。" + +# @param [Array] path +#: ../lib/yard/templates/engine.rb:34 +msgid "a list of path components" +msgstr "構成要素のパスのリスト" + +# @raise [ArgumentError] +#: ../lib/yard/templates/engine.rb:34 +msgid "" +"if the path does not exist within one of the\n" +"{template_paths} on disk." +msgstr "ディスク上に{template_paths}が一つも存在しない場合、例外を上げる。" + +# @return [Template] +#: ../lib/yard/templates/engine.rb:34 +msgid "the module representing the template" +msgstr "モジュールの表しているテンプレート" + +# YARD::Templates::Engine.template! +#: ../lib/yard/templates/engine.rb:48 +msgid "Forces creation of a template at +path+ within a +full_path+." +msgstr "" +"+fullpath+ 内部の\n" +"+path+ で、テンプレートの作成を強制する。" + +# @param [Array] +#: ../lib/yard/templates/engine.rb:52 +msgid "tag|param|full_paths" +msgstr "" + +# @param [Array] full_paths +#: ../lib/yard/templates/engine.rb:52 +msgid "the full path on disk of the template" +msgstr "テンプレートのディスク上のフルパス" + +# @param [String] path +#: ../lib/yard/templates/engine.rb:52 +msgid "the path name of the template" +msgstr "テンプレートのパス名" + +# @return [Template] +#: ../lib/yard/templates/engine.rb:52 +msgid "the template module representing the +path+" +msgstr "テンプレートモジュールは、+path+ を表している。" + +# YARD::Templates::Engine.render +#: ../lib/yard/templates/engine.rb:65 +msgid "" +"Renders a template on a {CodeObjects::Base code object} using\n" +"a set of default (overridable) options. Either the +:object+\n" +"or +:type+ keys must be provided." +msgstr "" +"デフォルトのオプション(上書き可能)のグループによって、\n" +"{Codeobject::base code object}のテンプレートを表示する。\n" +"+:object+ か +:type+ キーが提供されければならない。" + +# YARD::Templates::Engine.render +#: ../lib/yard/templates/engine.rb:69 +msgid "" +"If a +:serializer+ key is provided and +:serialize+ is not set to\n" +"false, the rendered contents will be serialized through the {Serializers::" +"Base}\n" +"object. See {with_serializer}." +msgstr "" +"+:serializer+ キーが提供されるか、 +:serialize+ にfalseを設定しない場合、\n" +"表示される内容は、{Serializers::Base}オブジェクトを通して、シリアライズされる" +"だろう。\n" +"{with_serializer}参照。" + +# @example Renders an object with html formatting +#: ../lib/yard/templates/engine.rb:81 +msgid "Engine.render(:format => :html, :object => obj)" +msgstr "" + +# @example Renders without an object +#: ../lib/yard/templates/engine.rb:81 +msgid "Engine.render(:type => :fulldoc, :otheropts => somevalue)" +msgstr "" + +# @example +#: ../lib/yard/templates/engine.rb:81 +msgid "tag|example|Renders an object with html formatting" +msgstr "htmlフォーマットと共にオブジェクトを表示する" + +# @example +#: ../lib/yard/templates/engine.rb:81 +msgid "tag|example|Renders without an object" +msgstr "オブジェクト無しの表示" + +# @param [Hash] options +#: ../lib/yard/templates/engine.rb:81 ../lib/yard/templates/engine.rb:140 +msgid "the options hash" +msgstr "ハッシュのオプション" + +# YARD::Templates::Engine.generate +#: ../lib/yard/templates/engine.rb:93 +msgid "" +"Passes a set of objects to the +:fulldoc+ template for full documentation " +"generation.\n" +"This is called by {CLI::Yardoc} to most commonly perform HTML\n" +"documentation generation." +msgstr "" +"完璧なドキュメント生成用に、+:fulldoc+ テンプレートに\n" +"オブジェクトのグループが渡される。\n" +"これは、{CLI::Yardoc}によって呼び出される\n" +"一般的にhtmlドキュメント生成を実行しなければならない。" + +# @param [Hash] options +#: ../lib/yard/templates/engine.rb:100 +msgid "(see {render})" +msgstr "" + +# @param [Array] objects +#: ../lib/yard/templates/engine.rb:100 +msgid "" +"a list of {CodeObjects::Base}\n" +"objects to pass to the template" +msgstr "" +"テンプレートに渡す為の\n" +"{CodeObjects::Base} オブジェクトのリスト" + +# YARD::Templates::Engine.with_serializer +#: ../lib/yard/templates/engine.rb:108 +msgid "Serializes the results of a block with a +serializer+ object." +msgstr "+serializer+ オブジェクトを用いブロックの結果をシリアライズする。" + +# @yield +#: ../lib/yard/templates/engine.rb:114 +msgid "a block whose result will be serialize" +msgstr "結果がシリアライズされるブロック" + +# @param [Serializers::Base] +#: ../lib/yard/templates/engine.rb:114 +msgid "tag|param|serializer" +msgstr "serializer" + +# @see +#: ../lib/yard/templates/engine.rb:114 +msgid "tag|see|Serializers::Base" +msgstr "" + +# @param [CodeObjects::Base] object +#: ../lib/yard/templates/engine.rb:114 +msgid "the code object to serialize" +msgstr "シリアライズする為のコードオブジェクト" + +# @yieldreturn [String] +#: ../lib/yard/templates/engine.rb:114 +msgid "the contents to serialize" +msgstr "シリアライズする為の内容" + +# @param [Serializers::Base] serializer +#: ../lib/yard/templates/engine.rb:114 +msgid "the serializer object" +msgstr "シリアライザーオブジェクト" + +# YARD::Templates::Engine.set_default_options +#: ../lib/yard/templates/engine.rb:134 +msgid "Sets default options on the options hash" +msgstr "ハッシュのオプションのデフォルトのオプションを設定する。" + +# YARD::Templates::Engine.find_template_paths +#: ../lib/yard/templates/engine.rb:152 +msgid "" +"Searches through the registered {template_paths} and returns\n" +"all full directories that have the +path+ within them on disk." +msgstr "" +"記録される{template_paths}を通して、検索され、\n" +"ディスク上に +path+ を持つ全てのディレクトリを返す。\n" + +# @return [Array] +#: ../lib/yard/templates/engine.rb:160 +msgid "" +"a list of full paths that are existing\n" +"candidates for a template module" +msgstr "テンプレートモジュール用の候補が存在するフルパスのリスト" + +# @param [Template] from_template +#: ../lib/yard/templates/engine.rb:160 +msgid "" +"if provided, allows a relative\n" +"path to be specified from this template's full path." +msgstr "" +"提供された場合、\n" +"このテンプレートのフルパスから指定される相対パスを受入れる。" + +# @param [Template] +#: ../lib/yard/templates/engine.rb:160 +msgid "tag|param|from_template" +msgstr "from_template" + +# @param [String] path +#: ../lib/yard/templates/engine.rb:160 +msgid "" +"the path component to search for in the\n" +"{template_paths}" +msgstr "{template_paths}用に検索する為のパスの構成" + +# YARD::Templates::Engine.template_module_name +#: ../lib/yard/templates/engine.rb:172 +msgid "The name of the module that represents a +path+" +msgstr "+path+ を表すモジュール名" + +# @return [String] +#: ../lib/yard/templates/engine.rb:175 +msgid "the module name" +msgstr "モジュール名" + +# @param [String] the +#: ../lib/yard/templates/engine.rb:175 +msgid "the path to generate a module name for" +msgstr "パス用のモジュール名を生成する為のパス" + +# YARD::Templates::Helpers::BaseHelper +#: ../lib/yard/templates/helpers/base_helper.rb:3 +msgid "The base helper module included in all templates." +msgstr "ベースへルパーモジュールは、全てのテンプレートを含んでいる。" + +# @param value +#: ../lib/yard/templates/helpers/base_helper.rb:4 +msgid "the value to set the attribute object to." +msgstr "オブジェクトの属性を設定する値" + +# @param value +#: ../lib/yard/templates/helpers/base_helper.rb:4 +msgid "the value to set the attribute serializer to." +msgstr "シリアライザーの属性を設定する値" + +# YARD::Templates::Helpers::BaseHelper#object +#: ../lib/yard/templates/helpers/base_helper.rb:5 +msgid "Returns the value of attribute object" +msgstr "オブジェクトの属性の値を返す" + +# YARD::Templates::Helpers::BaseHelper#serializer +#: ../lib/yard/templates/helpers/base_helper.rb:5 +msgid "Returns the value of attribute serializer" +msgstr "シリアライザーの属性の値を返す" + +# YARD::Templates::Helpers::BaseHelper#object= +#: ../lib/yard/templates/helpers/base_helper.rb:5 +msgid "Sets the attribute object" +msgstr "オブジェクトの属性を設定する。" + +# YARD::Templates::Helpers::BaseHelper#serializer= +#: ../lib/yard/templates/helpers/base_helper.rb:5 +msgid "Sets the attribute serializer" +msgstr "シリアライザーの属性を設定する。" + +# @return [CodeObjects::Base] +#: ../lib/yard/templates/helpers/base_helper.rb:8 +#: ../lib/yard/templates/helpers/base_helper.rb:10 +msgid "" +"the object representing the current generated\n" +"page. Might not be the current {#object} when inside sub-templates." +msgstr "" + +# YARD::Templates::Helpers::BaseHelper#globals +#: ../lib/yard/templates/helpers/base_helper.rb:15 +msgid "" +"An object that keeps track of global state throughout the entire template\n" +"rendering process (including any sub-templates)." +msgstr "" +"全体のテンプレートの表示処理を通じて、globalの状態の軌跡を保持するオブジェク" +"ト。\n" +"(任意のサブテンプレートを含んでいる)" + +# YARD::Templates::Helpers::BaseHelper#globals +#: ../lib/yard/templates/helpers/base_helper.rb:19 +msgid "Managing Global Template State" +msgstr "グローバルなテンプレートの状態を管理する。" + +# @return [OpenStruct] +#: ../lib/yard/templates/helpers/base_helper.rb:19 +msgid "a struct object that stores state" +msgstr "状態を記憶する構造体オブジェクト" + +# YARD::Templates::Helpers::BaseHelper#run_verifier +#: ../lib/yard/templates/helpers/base_helper.rb:29 +msgid "Running the Verifier" +msgstr "Verifierを起動する。" + +# @param [Array] list +#: ../lib/yard/templates/helpers/base_helper.rb:29 ../lib/yard/verifier.rb:90 +msgid "a list of code objects" +msgstr "コードオブジェクトのリスト" + +# @return [Array] +#: ../lib/yard/templates/helpers/base_helper.rb:29 +msgid "" +"a list of code objects that match\n" +"the verifier. If no verifier is supplied, all objects are returned." +msgstr "" +"verifierにマッチするコードオブジェクトのリスト\n" +"verifierが提供されない場合、全てのオブジェクトが、返される。" + +# YARD::Templates::Helpers::BaseHelper#h +#: ../lib/yard/templates/helpers/base_helper.rb:36 +msgid "" +"Escapes text. This is used a lot by the HtmlHelper and there should\n" +"be some helper to \"clean up\" text for whatever, this is it." +msgstr "" +"テキストをエスケープする。これは、HtmlHelperに多く利用され、\n" +"どんなテキストでも仕上げる為にいくつかのhelperメソッドになる。" + +# YARD::Templates::Helpers::BaseHelper#h +#: ../lib/yard/templates/helpers/base_helper.rb:37 +msgid "Escaping Text" +msgstr "テキストをエスケープする。" + +# YARD::Templates::Helpers::BaseHelper#linkify +#: ../lib/yard/templates/helpers/base_helper.rb:44 +msgid "" +"Links objects or URLs. This method will delegate to the correct +link_+\n" +"method depending on the arguments passed in." +msgstr "" +"オブジェクトやURLをリンクする。このメソッドは、\n" +"渡された引数に応じて、妥当な +link_+ メソッドに委譲するだろう。" + +# YARD::Templates::Helpers::BaseHelper#linkify +# YARD::Templates::Helpers::BaseHelper#link_include_object +# YARD::Templates::Helpers::BaseHelper#link_include_file +# YARD::Templates::Helpers::BaseHelper#link_object +# YARD::Templates::Helpers::BaseHelper#link_url +# YARD::Templates::Helpers::BaseHelper#link_file +# YARD::Templates::Helpers::HtmlHelper#resolve_links +# YARD::Templates::Helpers::HtmlHelper#link_file +# YARD::Templates::Helpers::HtmlHelper#link_include_file +# YARD::Templates::Helpers::HtmlHelper#link_include_object +# YARD::Templates::Helpers::HtmlHelper#link_object +# YARD::Templates::Helpers::HtmlHelper#link_url +#: ../lib/yard/templates/helpers/base_helper.rb:54 +#: ../lib/yard/templates/helpers/base_helper.rb:102 +#: ../lib/yard/templates/helpers/base_helper.rb:110 +#: ../lib/yard/templates/helpers/base_helper.rb:119 +#: ../lib/yard/templates/helpers/base_helper.rb:138 +#: ../lib/yard/templates/helpers/base_helper.rb:149 +#: ../lib/yard/templates/helpers/html_helper.rb:180 +#: ../lib/yard/templates/helpers/html_helper.rb:219 +#: ../lib/yard/templates/helpers/html_helper.rb:231 +#: ../lib/yard/templates/helpers/html_helper.rb:240 +#: ../lib/yard/templates/helpers/html_helper.rb:245 +#: ../lib/yard/templates/helpers/html_helper.rb:273 +msgid "Linking Objects and URLs" +msgstr "オブジェクトとURLにリンクする。" + +# @example Linking an object by path +#: ../lib/yard/templates/helpers/base_helper.rb:54 +msgid "linkify('YARD::Docstring')" +msgstr "" + +# @example Linking to an extra file +#: ../lib/yard/templates/helpers/base_helper.rb:54 +msgid "linkify('file:README')" +msgstr "" + +# @example Linking a URL +#: ../lib/yard/templates/helpers/base_helper.rb:54 +msgid "linkify('http://example.com')" +msgstr "" + +# @example Including docstring contents of an object +#: ../lib/yard/templates/helpers/base_helper.rb:54 +msgid "linkify('include:YARD::Docstring')" +msgstr "" + +# @example +#: ../lib/yard/templates/helpers/base_helper.rb:54 +msgid "tag|example|Including docstring contents of an object" +msgstr "インクルードしているdocstringは、オブジェクトの内容となる。" + +# @example +#: ../lib/yard/templates/helpers/base_helper.rb:54 +msgid "tag|example|Linking a URL" +msgstr "URLにリンクする。" + +# @example +#: ../lib/yard/templates/helpers/base_helper.rb:54 +msgid "tag|example|Linking an object by path" +msgstr "パスによってオブジェクトにリンクする" + +# @example +#: ../lib/yard/templates/helpers/base_helper.rb:54 +msgid "tag|example|Linking to an extra file" +msgstr "extraファイル(追加のファイル)にリンクする。" + +# YARD::Templates::Helpers::BaseHelper#link_include_object +# YARD::Templates::Helpers::HtmlHelper#link_include_object +#: ../lib/yard/templates/helpers/base_helper.rb:99 +#: ../lib/yard/templates/helpers/html_helper.rb:241 +msgid "Includes an object's docstring into output." +msgstr "出力へ、オブジェクトのdocstringを含める" + +# @param [CodeObjects::Base] object +#: ../lib/yard/templates/helpers/base_helper.rb:102 +msgid "the object to include" +msgstr "含めるオブジェクト" + +# @return [String] +#: ../lib/yard/templates/helpers/base_helper.rb:102 +msgid "the object's docstring (no tags)" +msgstr "docstringオブジェクト(タグ無し)" + +# YARD::Templates::Helpers::BaseHelper#link_include_file +# YARD::Templates::Helpers::HtmlHelper#link_include_file +#: ../lib/yard/templates/helpers/base_helper.rb:107 +#: ../lib/yard/templates/helpers/html_helper.rb:232 +msgid "Include a file as a docstring in output" +msgstr "出力でdocstringとして、ファイルを含める" + +# @return [String] +#: ../lib/yard/templates/helpers/base_helper.rb:110 +msgid "the file's contents" +msgstr "ファイルの内容" + +# @param [String] file +#: ../lib/yard/templates/helpers/base_helper.rb:110 +msgid "the filename to include" +msgstr "含めるファイル名" + +# YARD::Templates::Helpers::BaseHelper#link_object +# YARD::Templates::Helpers::HtmlHelper#link_object +#: ../lib/yard/templates/helpers/base_helper.rb:115 +#: ../lib/yard/templates/helpers/html_helper.rb:246 +msgid "Links to an object with an optional title" +msgstr "任意のタイトルと共にオブジェクトにリンクする" + +# @param [String] +#: ../lib/yard/templates/helpers/base_helper.rb:119 +#: ../lib/yard/templates/helpers/base_helper.rb:138 +#: ../lib/yard/templates/helpers/base_helper.rb:149 +msgid "tag|param|title" +msgstr "title" + +# @return [String] +#: ../lib/yard/templates/helpers/base_helper.rb:119 +msgid "the linked object" +msgstr "リンクしたオブジェクト" + +# @param [CodeObjects::Base] object +#: ../lib/yard/templates/helpers/base_helper.rb:119 +msgid "the object to link to" +msgstr "リンクするオブジェクト" + +# @param [String] title +#: ../lib/yard/templates/helpers/base_helper.rb:119 +msgid "the title to use for the link" +msgstr "リンク用に利用するタイトル" + +# YARD::Templates::Helpers::BaseHelper#link_url +# YARD::Templates::Helpers::HtmlHelper#link_url +#: ../lib/yard/templates/helpers/base_helper.rb:133 +#: ../lib/yard/templates/helpers/html_helper.rb:274 +msgid "Links to a URL" +msgstr "URLにリンクする" + +# @param [Hash] params +#: ../lib/yard/templates/helpers/base_helper.rb:138 +msgid "optional parameters for the link" +msgstr "リンク用の任意のパラメーター" + +# @param [String] url +#: ../lib/yard/templates/helpers/base_helper.rb:138 +msgid "the URL to link to" +msgstr "リンクするURL" + +# @return [String] +#: ../lib/yard/templates/helpers/base_helper.rb:138 +msgid "the linked URL" +msgstr "リンクしたURL" + +# @param [String] title +#: ../lib/yard/templates/helpers/base_helper.rb:138 +msgid "the optional title to display the link as" +msgstr "任意のタイトルとして、リンクに表示する" + +# YARD::Templates::Helpers::BaseHelper#link_file +# YARD::Templates::Helpers::HtmlHelper#link_file +#: ../lib/yard/templates/helpers/base_helper.rb:143 +#: ../lib/yard/templates/helpers/html_helper.rb:220 +msgid "Links to an extra file" +msgstr "extarファイルにリンクする" + +# @param [String] anchor +#: ../lib/yard/templates/helpers/base_helper.rb:149 +#: ../lib/yard/templates/helpers/html_helper.rb:342 +msgid "optional anchor" +msgstr "任意のアンカー" + +# @param [String] +#: ../lib/yard/templates/helpers/base_helper.rb:149 +#: ../lib/yard/templates/helpers/html_helper.rb:309 +#: ../lib/yard/templates/helpers/html_helper.rb:342 +msgid "tag|param|anchor" +msgstr "anchor" + +# @param [String, CodeObjects::ExtraFileObject] filename +# @param [String] filename +#: ../lib/yard/templates/helpers/base_helper.rb:149 +#: ../lib/yard/templates/helpers/html_helper.rb:342 +msgid "the filename to link to" +msgstr "リンクするファイル名" + +# @return [String] +#: ../lib/yard/templates/helpers/base_helper.rb:149 +msgid "the link to the file" +msgstr "ファイルへのリンク" + +# @param [String] title +#: ../lib/yard/templates/helpers/base_helper.rb:149 +msgid "the title of the link" +msgstr "リンクのタイトル" + +# YARD::Templates::Helpers::BaseHelper#format_types +#: ../lib/yard/templates/helpers/base_helper.rb:157 +msgid "Formats a list of return types for output and links each type." +msgstr "出力用に戻りの型のリストをフォーマットし、それぞれの型にリンクする。" + +# YARD::Templates::Helpers::BaseHelper#format_types +# YARD::Templates::Helpers::BaseHelper#format_object_type +# YARD::Templates::Helpers::BaseHelper#format_object_title +# YARD::Templates::Helpers::BaseHelper#format_source +#: ../lib/yard/templates/helpers/base_helper.rb:165 +#: ../lib/yard/templates/helpers/base_helper.rb:179 +#: ../lib/yard/templates/helpers/base_helper.rb:193 +#: ../lib/yard/templates/helpers/base_helper.rb:206 +msgid "Formatting Object Attributes" +msgstr "オブジェクトの属性をフォーマットする" + +# @param [Array] list +#: ../lib/yard/templates/helpers/base_helper.rb:165 +msgid "a list of types" +msgstr "型のリスト" + +# @example Formatting types +#: ../lib/yard/templates/helpers/base_helper.rb:165 +msgid "format_types(['String', 'Array']) #=> \"(String, Array)\"" +msgstr "" + +# @example Formatting types without surrounding brackets +#: ../lib/yard/templates/helpers/base_helper.rb:165 +msgid "format_types(['String', 'Array'], false) #=> \"String, Array\"" +msgstr "" + +# @example +#: ../lib/yard/templates/helpers/base_helper.rb:165 +msgid "tag|example|Formatting types" +msgstr "型をフォーマットする" + +# @example +#: ../lib/yard/templates/helpers/base_helper.rb:165 +msgid "tag|example|Formatting types without surrounding brackets" +msgstr "周りをブラケット(括弧)無しの型へフォーマットする" + +# @param [Boolean] +#: ../lib/yard/templates/helpers/base_helper.rb:165 +#: ../lib/yard/templates/helpers/html_helper.rb:414 +msgid "tag|param|brackets" +msgstr "brackets" + +# @return [String] +#: ../lib/yard/templates/helpers/base_helper.rb:165 +msgid "the formatted list of Ruby types" +msgstr "フォーマットされたRubyの型のリスト" + +# @param [Boolean] brackets +#: ../lib/yard/templates/helpers/base_helper.rb:165 +msgid "whether to surround the types in brackets" +msgstr "ブラケット(括弧)の型で囲むかどうか" + +# @example Formatted type of an exception class +#: ../lib/yard/templates/helpers/base_helper.rb:179 +msgid "" +"o = ClassObject.new(:root, :MyError)\n" +"o.superclass = P('RuntimeError')\n" +"format_object_type(o) # => \"Exception\"" +msgstr "" + +# @example Formatted type of a method +#: ../lib/yard/templates/helpers/base_helper.rb:179 +msgid "" +"o = MethodObject.new(:root, :to_s)\n" +"format_object_type(o) # => \"Method\"" +msgstr "" + +# @example +#: ../lib/yard/templates/helpers/base_helper.rb:179 +msgid "tag|example|Formatted type of a method" +msgstr "メソッドの入ったフォーマットされた型" + +# @example +#: ../lib/yard/templates/helpers/base_helper.rb:179 +msgid "tag|example|Formatted type of an exception class" +msgstr "exceptionクラスのフォーマットされた型" + +# @return [String] +#: ../lib/yard/templates/helpers/base_helper.rb:179 +msgid "" +"the human-readable formatted {CodeObjects::Base#type #type}\n" +"for the object" +msgstr "" +"人が読みやすくフォーマットされたオブジェクト用の{CodeObjects::Base#type " +"#type}メソッド" + +# @param [CodeObjects::Base] object +#: ../lib/yard/templates/helpers/base_helper.rb:179 +msgid "the object to retrieve the type for" +msgstr "型を回収するオブジェクト" + +# @example +#: ../lib/yard/templates/helpers/base_helper.rb:193 +msgid "" +"s = format_object_title ModuleObject.new(:root, :MyModuleName)\n" +"s # => \"Module: MyModuleName\"" +msgstr "" + +# @param [CodeObjects::Base] object +#: ../lib/yard/templates/helpers/base_helper.rb:193 +msgid "the object to retrieve a title for" +msgstr "タイトルを回収するオブジェクト" + +# @return [String] +#: ../lib/yard/templates/helpers/base_helper.rb:193 +msgid "the page title name for a given object" +msgstr "与えられたオブジェクト用のページのタイトル名" + +# YARD::Templates::Helpers::BaseHelper#format_source +#: ../lib/yard/templates/helpers/base_helper.rb:203 +msgid "Indents and formats source code" +msgstr "インデントし、ソースコードをフォーマットする" + +# @return [String] +#: ../lib/yard/templates/helpers/base_helper.rb:206 +msgid "formatted source code" +msgstr "フォーマットされたソースコード" + +# @param [String] value +#: ../lib/yard/templates/helpers/base_helper.rb:206 +msgid "the input source code" +msgstr "入力のソースコード" + +# YARD::Templates::Helpers::FilterHelper +#: ../lib/yard/templates/helpers/filter_helper.rb:4 +msgid "Helpers for various object types" +msgstr "様々なオブジェクト型用のHelperメソッド" + +# @return [Boolean] +#: ../lib/yard/templates/helpers/filter_helper.rb:6 +msgid "whether an object is a method" +msgstr "オブジェクトがメソッドかどうか" + +# @return [Boolean] +#: ../lib/yard/templates/helpers/filter_helper.rb:11 +msgid "whether an object is a namespace" +msgstr "オブジェクトがnamespaceかどうか" + +# @return [Boolean] +#: ../lib/yard/templates/helpers/filter_helper.rb:16 +msgid "whether an object is a class" +msgstr "オブジェクトがクラスかどうか" + +# @return [Boolean] +#: ../lib/yard/templates/helpers/filter_helper.rb:21 +msgid "whether an object is a module" +msgstr "オブジェクトがモジュールかどうか" + +# YARD::Templates::Helpers::HtmlHelper +#: ../lib/yard/templates/helpers/html_helper.rb:6 +msgid "The helper module for HTML templates." +msgstr "HTMLテンプレート用のhelperモジュール。" + +# YARD::Templates::Helpers::HtmlHelper#h +#: ../lib/yard/templates/helpers/html_helper.rb:13 +msgid "Escapes HTML entities" +msgstr "HTMLの構成要素をエスケープする。" + +# YARD::Templates::Helpers::HtmlHelper#h +# YARD::Templates::Helpers::HtmlHelper#urlencode +#: ../lib/yard/templates/helpers/html_helper.rb:16 +#: ../lib/yard/templates/helpers/html_helper.rb:24 +msgid "Escaping Template Data" +msgstr "テンプレートのデータをエスケープする。" + +# @return [String] +#: ../lib/yard/templates/helpers/html_helper.rb:16 +msgid "the HTML with escaped entities" +msgstr "エスケープされたものと一緒のHTML" + +# @param [String] text +#: ../lib/yard/templates/helpers/html_helper.rb:16 +msgid "the text to escape" +msgstr "エスケープするテキスト" + +# YARD::Templates::Helpers::HtmlHelper#urlencode +#: ../lib/yard/templates/helpers/html_helper.rb:21 +msgid "Escapes a URL" +msgstr "URLをエスケープする" + +# @param [String] text +#: ../lib/yard/templates/helpers/html_helper.rb:24 +msgid "the URL" +msgstr "URL" + +# @return [String] +#: ../lib/yard/templates/helpers/html_helper.rb:24 +msgid "the escaped URL" +msgstr "エスケープされたURL" + +# YARD::Templates::Helpers::HtmlHelper#htmlify +#: ../lib/yard/templates/helpers/html_helper.rb:31 +msgid "Turns text into HTML using +markup+ style formatting." +msgstr "" +"+markup+ スタイルフォーマットにする事によって、HTMLへテキストを切り替える。" + +# YARD::Templates::Helpers::HtmlHelper#htmlify +# YARD::Templates::Helpers::HtmlHelper#html_markup_markdown +# YARD::Templates::Helpers::HtmlHelper#html_markup_textile +# YARD::Templates::Helpers::HtmlHelper#html_markup_rdoc +# YARD::Templates::Helpers::HtmlHelper#html_markup_text +# YARD::Templates::Helpers::HtmlHelper#html_markup_none +# YARD::Templates::Helpers::HtmlHelper#html_markup_html +# YARD::Templates::Helpers::HtmlHelper#html_markup_ruby +# YARD::Templates::Helpers::HtmlHelper#htmlify_line +#: ../lib/yard/templates/helpers/html_helper.rb:36 +#: ../lib/yard/templates/helpers/html_helper.rb:57 +#: ../lib/yard/templates/helpers/html_helper.rb:73 +#: ../lib/yard/templates/helpers/html_helper.rb:83 +#: ../lib/yard/templates/helpers/html_helper.rb:91 +#: ../lib/yard/templates/helpers/html_helper.rb:101 +#: ../lib/yard/templates/helpers/html_helper.rb:109 +#: ../lib/yard/templates/helpers/html_helper.rb:115 +#: ../lib/yard/templates/helpers/html_helper.rb:123 +#: ../lib/yard/templates/helpers/html_helper.rb:134 +#: ../lib/yard/templates/helpers/html_helper.rb:139 +msgid "Converting Markup to HTML" +msgstr "HTMLへMarkupを変換する。" + +# @param [Symbol] markup +#: ../lib/yard/templates/helpers/html_helper.rb:36 +msgid "" +"examples are +:markdown+, +:textile+, +:rdoc+.\n" +"To add a custom markup type, see {MarkupHelper}" +msgstr "" +"例えば、 +:markdown+ , +:textile+ , +:rdoc+ がある。\n" +"カスタムマークアップの型を追加するには、 {MarkupHelper}参照。" + +# @param [Symbol] +#: ../lib/yard/templates/helpers/html_helper.rb:36 +msgid "tag|param|markup" +msgstr "markup" + +# @return [String] +#: ../lib/yard/templates/helpers/html_helper.rb:36 +msgid "the HTML" +msgstr "HTML" + +# @param [String] text +#: ../lib/yard/templates/helpers/html_helper.rb:36 +msgid "the text to format" +msgstr "フォーマットするテキスト" + +# YARD::Templates::Helpers::HtmlHelper#html_markup_markdown +#: ../lib/yard/templates/helpers/html_helper.rb:54 +msgid "Converts Markdown to HTML" +msgstr "HTMLへMarkdownを変換する。" + +# @param [String] text +#: ../lib/yard/templates/helpers/html_helper.rb:57 +msgid "input Markdown text" +msgstr "Markdownテキストを入力する" + +# @return [String] +#: ../lib/yard/templates/helpers/html_helper.rb:57 +#: ../lib/yard/templates/helpers/html_helper.rb:73 +#: ../lib/yard/templates/helpers/html_helper.rb:91 +#: ../lib/yard/templates/helpers/html_helper.rb:123 +msgid "output HTML" +msgstr "HTMLを出力する" + +# YARD::Templates::Helpers::HtmlHelper#html_markup_textile +#: ../lib/yard/templates/helpers/html_helper.rb:70 +msgid "Converts Textile to HTML" +msgstr "HTMLへTextileを変換する。" + +# @param [String] text +#: ../lib/yard/templates/helpers/html_helper.rb:73 +msgid "the input Textile text" +msgstr "入力するTextileテキスト" + +# YARD::Templates::Helpers::HtmlHelper#html_markup_text +#: ../lib/yard/templates/helpers/html_helper.rb:80 +msgid "Converts plaintext to strict Textile (hard breaks)" +msgstr "厳格なTextileにプレーンテキストを変換する。(hard breaks)" + +# @param [String] text +#: ../lib/yard/templates/helpers/html_helper.rb:83 +msgid "the input textile data" +msgstr "入力するTextileのデータ" + +# @return [String] +#: ../lib/yard/templates/helpers/html_helper.rb:83 +#: ../lib/yard/templates/helpers/html_helper.rb:101 +#: ../lib/yard/templates/helpers/html_helper.rb:109 +msgid "the output HTML" +msgstr "出力HTML" + +# YARD::Templates::Helpers::HtmlHelper#html_markup_rdoc +#: ../lib/yard/templates/helpers/html_helper.rb:88 +msgid "Converts RDoc formatting (SimpleMarkup) to HTML" +msgstr "RDocフォーマット(SimpleMarkup)をHTMLへ変換する。" + +# @param [String] text +#: ../lib/yard/templates/helpers/html_helper.rb:91 +msgid "the input RDoc formatted text" +msgstr "RDocでフォーマットされたテキストの入力" + +# YARD::Templates::Helpers::HtmlHelper#html_markup_text +#: ../lib/yard/templates/helpers/html_helper.rb:98 +msgid "Converts plaintext to pre-formatted HTML" +msgstr "事前にフォーマットされたHTMLにプレーンテキストを変換する。" + +# @param [String] text +#: ../lib/yard/templates/helpers/html_helper.rb:101 +#: ../lib/yard/templates/helpers/html_helper.rb:109 +msgid "the input text" +msgstr "入力テキスト" + +# YARD::Templates::Helpers::HtmlHelper#html_markup_text +#: ../lib/yard/templates/helpers/html_helper.rb:106 +msgid "Converts plaintext to regular HTML" +msgstr "通常のHTMLにプレーンテキストを変換する。" + +# @since +#: ../lib/yard/templates/helpers/html_helper.rb:115 +msgid "0.6.6" +msgstr "" + +# @return [String] +#: ../lib/yard/templates/helpers/html_helper.rb:115 +msgid "the same text with no markup" +msgstr "markupの無い、同じテキスト" + +# YARD::Templates::Helpers::HtmlHelper#html_markup_html +#: ../lib/yard/templates/helpers/html_helper.rb:120 +msgid "Converts HTML to HTML" +msgstr "HTMLからHTMLへ変換する" + +# @param [String] text +#: ../lib/yard/templates/helpers/html_helper.rb:123 +msgid "input html" +msgstr "htmlを入力する" + +# YARD::Templates::Helpers::HtmlHelper#html_markup_ruby +#: ../lib/yard/templates/helpers/html_helper.rb:128 +msgid "" +"Highlights Ruby source. Similar to {#html_syntax_highlight}, but\n" +"this method is meant to be called from {#htmlify} when markup is\n" +"set to \"ruby\"." +msgstr "" +"Rubyのソースをハイライトする。\n" +"{#html_syntax_highlight}メソッドと同様である。\n" +"しかし、このメソッドはmarkupが\"ruby\"を設定する時に、\n" +"{#htmlify}メソッドから呼び出される事を意味している。" + +# @param [String] source +#: ../lib/yard/templates/helpers/html_helper.rb:134 +msgid "the Ruby source" +msgstr "Rubyのソース" + +# @return [String] +#: ../lib/yard/templates/helpers/html_helper.rb:134 +msgid "the highlighted HTML" +msgstr "ハイライトされたHTML" + +# @return [String] +#: ../lib/yard/templates/helpers/html_helper.rb:139 +msgid "HTMLified text as a single line (paragraphs removed)" +msgstr "単一の行として、HTML化された(パラグラフが削除された)テキスト" + +# YARD::Templates::Helpers::HtmlHelper#html_syntax_highlight +#: ../lib/yard/templates/helpers/html_helper.rb:146 +msgid "Syntax highlights +source+ in language +type+." +msgstr "構文は、+type+ の言語で +source+ をハイライトする。" + +# YARD::Templates::Helpers::HtmlHelper#html_syntax_highlight +# YARD::Templates::Helpers::HtmlHelper#html_syntax_highlight_plain +#: ../lib/yard/templates/helpers/html_helper.rb:154 +#: ../lib/yard/templates/helpers/html_helper.rb:165 +msgid "Syntax Highlighting Source Code" +msgstr "ソースコードをハイライトする構文" + +# @note +#: ../lib/yard/templates/helpers/html_helper.rb:154 +msgid "" +"To support a specific language +type+, implement the method\n" +"+html_syntax_highlight_TYPE+ in this class." +msgstr "" +"特定の +type+ の言語をサポートするには、\n" +"このクラスの中の、+html_syntax_highlight_TYPE+メソッドを実装する。" + +# @return [String] +#: ../lib/yard/templates/helpers/html_helper.rb:154 +msgid "the highlighted source" +msgstr "ハイライトされたソース" + +# @param [Symbol] type +#: ../lib/yard/templates/helpers/html_helper.rb:154 +msgid "" +"the language type (:ruby, :plain, etc). Use\n" +":plain for no syntax highlighting." +msgstr "" +"言語の型(:ruby, :plain, etc.)。\n" +"ハイライト無しの構文には、 :plain を使う" + +# @param [String] source +#: ../lib/yard/templates/helpers/html_helper.rb:154 +msgid "the source code to highlight" +msgstr "ハイライトするソースコード" + +# @return [String] +#: ../lib/yard/templates/helpers/html_helper.rb:165 +msgid "unhighlighted source" +msgstr "ハイライトを戻されたソース" + +# YARD::Templates::Helpers::HtmlHelper#resolve_links +#: ../lib/yard/templates/helpers/html_helper.rb:172 +msgid "" +"Resolves any text in the form of +{Name}+ to the object specified by\n" +"Name. Also supports link titles in the form +{Name title}+." +msgstr "" +"Nameによって指定されたオブジェクトに +{Name}+ の形式で\n" +"任意のテキストを解決する。\n" +"さらに、 +{Name title}+ 形式のタイトルのリンクもサポートする。" + +# @return [String] +#: ../lib/yard/templates/helpers/html_helper.rb:180 +msgid "HTML with linkified references" +msgstr "リンクされた参照を用いたHTML" + +# @example Linking to a class with a title +#: ../lib/yard/templates/helpers/html_helper.rb:180 +msgid "" +"resolve_links(\"{A::B::C the C class}\") # => \"the c class" +"\"" +msgstr "" + +# @example Linking to an instance method +#: ../lib/yard/templates/helpers/html_helper.rb:180 +msgid "" +"resolve_links(\"{MyClass#method}\") # => \"MyClass#method\"" +msgstr "" + +# @example +#: ../lib/yard/templates/helpers/html_helper.rb:180 +msgid "tag|example|Linking to a class with a title" +msgstr "タイトルと共にクラスにリンクする" + +# @example +#: ../lib/yard/templates/helpers/html_helper.rb:180 +msgid "tag|example|Linking to an instance method" +msgstr "インスタンスメソッドにリンクする" + +# @param [String] text +#: ../lib/yard/templates/helpers/html_helper.rb:180 +msgid "the text to resolve links in" +msgstr "リンクを解決する為のテキスト" + +# YARD::Templates::Helpers::HtmlHelper#anchor_for +# YARD::Templates::Helpers::HtmlHelper#url_for +# YARD::Templates::Helpers::HtmlHelper#url_for_file +#: ../lib/yard/templates/helpers/html_helper.rb:288 +#: ../lib/yard/templates/helpers/html_helper.rb:309 +#: ../lib/yard/templates/helpers/html_helper.rb:342 +#: ../lib/yard/templates/helpers/html_helper.rb:364 +#: ../lib/yard/templates/helpers/html_helper.rb:372 +#: ../lib/yard/templates/helpers/html_helper.rb:380 +#: ../lib/yard/templates/helpers/html_helper.rb:388 +msgid "URL Helpers" +msgstr "" + +# @return [String] +#: ../lib/yard/templates/helpers/html_helper.rb:288 +msgid "the anchor for a specific object" +msgstr "固有のオブジェクト用のアンカー" + +# @param [CodeObjects::Base] object +#: ../lib/yard/templates/helpers/html_helper.rb:288 +msgid "the object to get an anchor for" +msgstr "アンカーを取得するオブジェクト" + +# YARD::Templates::Helpers::HtmlHelper#url_for +#: ../lib/yard/templates/helpers/html_helper.rb:304 +msgid "Returns the URL for an object." +msgstr "オブジェクト用にURLを返す" + +# @param [Boolean] +#: ../lib/yard/templates/helpers/html_helper.rb:309 +msgid "tag|param|relative" +msgstr "relative" + +# @return [String] +#: ../lib/yard/templates/helpers/html_helper.rb:309 +msgid "the URL location of the object" +msgstr "オブジェクトのURLの場所" + +# @param [String] anchor +#: ../lib/yard/templates/helpers/html_helper.rb:309 +msgid "the anchor to link to" +msgstr "リンクするアンカー" + +# @param [String, CodeObjects::Base] obj +#: ../lib/yard/templates/helpers/html_helper.rb:309 +msgid "the object (or object path) to link to" +msgstr "リンクするオブジェクト(又は、オブジェクトパス)" + +# @param [Boolean] relative +#: ../lib/yard/templates/helpers/html_helper.rb:309 +msgid "use a relative or absolute link" +msgstr "相対or絶対リンクを使うかどうか(trueで相対リンク)" + +# YARD::Templates::Helpers::HtmlHelper#url_for_file +#: ../lib/yard/templates/helpers/html_helper.rb:338 +msgid "Returns the URL for a specific file" +msgstr "固有のファイル用のURLを返す" + +# @return [String] +#: ../lib/yard/templates/helpers/html_helper.rb:342 +msgid "the URL pointing to the file" +msgstr "ファイルの場所を指し示す、URL" + +# YARD::Templates::Helpers::HtmlHelper#url_for_file +#: ../lib/yard/templates/helpers/html_helper.rb:360 +msgid "Returns the URL for a list type" +msgstr "リストのタイプ用にURLを返す" + +# @return [String] +#: ../lib/yard/templates/helpers/html_helper.rb:364 +msgid "the URL pointing to the list" +msgstr "リストの為の場所を示すURL" + +# @param [ClassObject] klass +#: ../lib/yard/templates/helpers/html_helper.rb:364 +msgid "the list type to generate a URL for" +msgstr "リストの型用のURLを生成するためのリストの型" + +# YARD::Templates::Helpers::HtmlHelper#url_for_file +#: ../lib/yard/templates/helpers/html_helper.rb:369 +msgid "Returns the URL for the frameset page" +msgstr "フレームセットページ用のURLを返す" + +# @return [String] +#: ../lib/yard/templates/helpers/html_helper.rb:372 +msgid "the URL pointing to the frames page" +msgstr "フレームページのURLのポイント" + +# YARD::Templates::Helpers::HtmlHelper#url_for_main +#: ../lib/yard/templates/helpers/html_helper.rb:377 +msgid "Returns the URL for the main page (README or alphabetic index)" +msgstr "" + +# @return [String] +#: ../lib/yard/templates/helpers/html_helper.rb:380 +#: ../lib/yard/templates/helpers/html_helper.rb:388 +msgid "" +"the URL pointing to the first main page the\n" +"user should see." +msgstr "ユーザーが調べる最初のメインページの為のURLのポイント" + +# YARD::Templates::Helpers::HtmlHelper#format_object_name_list +#: ../lib/yard/templates/helpers/html_helper.rb:395 +msgid "Formats a list of objects and links them" +msgstr "オブジェクトのリストをフォーマットし、それをリンクする。" + +# YARD::Templates::Helpers::HtmlHelper#format_object_name_list +# YARD::Templates::Helpers::HtmlHelper#format_types +# YARD::Templates::Helpers::HtmlHelper#signature_types +# YARD::Templates::Helpers::HtmlHelper#signature +#: ../lib/yard/templates/helpers/html_helper.rb:396 +#: ../lib/yard/templates/helpers/html_helper.rb:414 +#: ../lib/yard/templates/helpers/html_helper.rb:430 +#: ../lib/yard/templates/helpers/html_helper.rb:467 +msgid "Formatting Objects and Attributes" +msgstr "オブジェクトと属性をフォーマットする。" + +# @return [String] +#: ../lib/yard/templates/helpers/html_helper.rb:396 +msgid "a formatted list of objects" +msgstr "フォーマットされたオブジェクトのリストを返す" + +# YARD::Templates::Helpers::HtmlHelper#format_types +#: ../lib/yard/templates/helpers/html_helper.rb:403 +msgid "Formats a list of types from a tag." +msgstr "タグから型のリストをフォーマットする。" + +# @param [Boolean] brackets +#: ../lib/yard/templates/helpers/html_helper.rb:414 +msgid "" +"omits the surrounding\n" +"brackets if +brackets+ is set to +false+." +msgstr "" +"+brackets+ に +false+ が設定された場合、\n" +"周りのブラケット(括弧)を除外する。" + +# @param [Array, FalseClass] +#: ../lib/yard/templates/helpers/html_helper.rb:414 +msgid "tag|param|typelist" +msgstr "typelist" + +# @return [String] +#: ../lib/yard/templates/helpers/html_helper.rb:414 +msgid "" +"the list of types formatted\n" +"as [Type1, Type2, ...] with the types linked\n" +"to their respective descriptions." +msgstr "" +"それらの関連する説明にリンクした型と共に、\n" +"[Type1, Type2, ...]としてフォーマットされた型のリスト" + +# @param [Array, FalseClass] typelist +#: ../lib/yard/templates/helpers/html_helper.rb:414 +msgid "the list of types to be formatted." +msgstr "フォーマットされる型のリスト" + +# YARD::Templates::Helpers::HtmlHelper#signature_types +#: ../lib/yard/templates/helpers/html_helper.rb:425 +msgid "Get the return types for a method signature." +msgstr "メソッドのシグネチャ用に、返す型を取得する。" + +# @param [Boolean] +#: ../lib/yard/templates/helpers/html_helper.rb:430 +#: ../lib/yard/templates/helpers/html_helper.rb:467 +msgid "tag|param|link" +msgstr "link" + +# @param [CodeObjects::MethodObject] meth +#: ../lib/yard/templates/helpers/html_helper.rb:430 +msgid "the method object" +msgstr "メソッドのオブジェクト" + +# @return [String] +#: ../lib/yard/templates/helpers/html_helper.rb:430 +msgid "the signature types" +msgstr "シグネチャの型" + +# @param [Boolean] link +#: ../lib/yard/templates/helpers/html_helper.rb:430 +msgid "whether to link the types" +msgstr "型をリンクするかどうか" + +# YARD::Templates::Helpers::HtmlHelper#signature +#: ../lib/yard/templates/helpers/html_helper.rb:459 +msgid "Formats the signature of method +meth+." +msgstr "+meth+ メソッドのシグネチャをフォーマットする" + +# @param [Boolean] +#: ../lib/yard/templates/helpers/html_helper.rb:467 +msgid "tag|param|full_attr_name" +msgstr "full_attr_name" + +# @param [Boolean] +#: ../lib/yard/templates/helpers/html_helper.rb:467 +msgid "tag|param|show_extras" +msgstr "show_extras" + +# @return [String] +#: ../lib/yard/templates/helpers/html_helper.rb:467 +msgid "the formatted method signature" +msgstr "フォーマットされたメソッドのシグネチャ" + +# @param [CodeObjects::MethodObject] meth +#: ../lib/yard/templates/helpers/html_helper.rb:467 +msgid "" +"the method object to list\n" +"the signature of" +msgstr "シグネチャを記述するメソッドオブジェクト" + +# @param [Boolean] link +#: ../lib/yard/templates/helpers/html_helper.rb:467 +msgid "whether to link the method signature to the details view" +msgstr "詳細の一覧にメソッドのシグネチャをリンクするかどうか" + +# @param [Boolean] show_extras +#: ../lib/yard/templates/helpers/html_helper.rb:467 +msgid "whether to show extra meta-data (visibility, attribute info)" +msgstr "追加のメタデータを見せるかどうか(可視性、infoの属性)" + +# @param [Boolean] full_attr_name +#: ../lib/yard/templates/helpers/html_helper.rb:467 +msgid "" +"whether to show the full attribute name\n" +"(\"name=\" instead of \"name\")" +msgstr "完全なnameの属性を見せるかどうか(\"name=\" instead of \"name\")" + +# YARD::Templates::Helpers::HtmlHelper#charset +#: ../lib/yard/templates/helpers/html_helper.rb:504 +msgid "" +"Returns the current character set. The default value can be overridden\n" +"by setting the +LANG+ environment variable or by overriding this\n" +"method. In Ruby 1.9 you can also modify this value by setting\n" +"+Encoding.default_external+." +msgstr "" +"現在の文字集合を返す。\n" +"デフォルトの値は、 +LANG+ 環境変数を設定したり、このメソッドを上書きする事に" +"よって\n" +"上書きできる。\n" +"又、Ruby1.9では +Encoding.default_external+ を設定する事によって、\n" +"この値を変更できる。" + +# YARD::Templates::Helpers::HtmlHelper#charset +#: ../lib/yard/templates/helpers/html_helper.rb:510 +#: ../lib/yard/templates/helpers/html_helper.rb:536 +#: ../lib/yard/templates/helpers/html_helper.rb:542 +#: ../lib/yard/templates/helpers/html_helper.rb:557 +#: ../lib/yard/templates/helpers/html_helper.rb:572 +msgid "Getting the Character Encoding" +msgstr "Character Encodingを取得する" + +# @return [String] +#: ../lib/yard/templates/helpers/html_helper.rb:510 +msgid "the current character set" +msgstr "現在の文字集合" + +# YARD::Templates::Helpers::HtmlHelper#tag_attrs +#: ../lib/yard/templates/helpers/html_helper.rb:533 +msgid "Converts a set of hash options into HTML attributes for a tag" +msgstr "タグ用にHTML属性へハッシュのオプションのグループを変換する。" + +# @return [String] +#: ../lib/yard/templates/helpers/html_helper.rb:536 +msgid "the tag attributes of an HTML tag" +msgstr "HTMLタグのタグ属性" + +# @param [Hash{String => String}] opts +#: ../lib/yard/templates/helpers/html_helper.rb:536 +msgid "the tag options" +msgstr "そのタグのオプション" + +# YARD::Templates::Helpers::HtmlHelper#convert_method_to_overload +#: ../lib/yard/templates/helpers/html_helper.rb:541 +msgid "Converts a {CodeObjects::MethodObject} into an overload object" +msgstr "上書きするオブジェクトへ{CodeObjects::MethodObject}を変換する" + +# YARD::Templates::Helpers::HtmlHelper#parse_lang_for_codeblock +#: ../lib/yard/templates/helpers/html_helper.rb:551 +msgid "" +"Parses !!!lang out of codeblock, returning the codeblock language\n" +"followed by the source code." +msgstr "" + +# @since +#: ../lib/yard/templates/helpers/html_helper.rb:557 +msgid "0.7.5" +msgstr "" + +# @return [Array(String, String)] +#: ../lib/yard/templates/helpers/html_helper.rb:557 +msgid "" +"the language, if any, and the\n" +"remaining source" +msgstr "" + +# @param [String] source +#: ../lib/yard/templates/helpers/html_helper.rb:557 +msgid "the source code whose language to determine" +msgstr "どの言語か決める為のソースコード" + +# YARD::Templates::Helpers::HtmlHelper#parse_codeblocks +#: ../lib/yard/templates/helpers/html_helper.rb:567 +msgid "" +"Parses code blocks out of html and performs syntax highlighting\n" +"on code inside of the blocks." +msgstr "" + +# @return [String] +#: ../lib/yard/templates/helpers/html_helper.rb:572 +msgid "highlighted html" +msgstr "ハイライトされたHTML" + +# @param [String] +#: ../lib/yard/templates/helpers/html_helper.rb:572 +msgid "tag|param|html" +msgstr "" + +# @see +#: ../lib/yard/templates/helpers/html_helper.rb:572 +msgid "tag|see|#html_syntax_highlight" +msgstr "" + +# @param [String] name +#: ../lib/yard/templates/helpers/html_helper.rb:572 +msgid "the html to search for code in" +msgstr "HTMLの中のコード用に検索するためのHTML" + +# YARD::Templates::Helpers::HtmlSyntaxHighlightHelper +#: ../lib/yard/templates/helpers/html_syntax_highlight_helper.rb:5 +msgid "Helper methods for syntax highlighting." +msgstr "構文ハイライト用のHelperメソッド" + +# YARD::Templates::Helpers::HtmlSyntaxHighlightHelper#html_syntax_highlight_ruby +#: ../lib/yard/templates/helpers/html_syntax_highlight_helper.rb:7 +msgid "Highlights Ruby source" +msgstr "Rubyのソースをハイライトする" + +# @param [String] source +#: ../lib/yard/templates/helpers/html_syntax_highlight_helper.rb:9 +msgid "the Ruby source code" +msgstr "Rubyのソースコード" + +# @return [String] +#: ../lib/yard/templates/helpers/html_syntax_highlight_helper.rb:9 +msgid "the highlighted Ruby source" +msgstr "ハイライトされたRubyのソース" + +# @param value +#: ../lib/yard/templates/helpers/markup/rdoc_markup.rb:23 +#: ../lib/yard/templates/helpers/markup/rdoc_markup.rb:68 +msgid "the value to set the attribute from_path to." +msgstr "from_path属性を設定する値" + +# YARD::Templates::Helpers::Markup::RDocMarkup#from_path +# YARD::Templates::Helpers::Markup::RDocMarkupToHtml#from_path +#: ../lib/yard/templates/helpers/markup/rdoc_markup.rb:24 +#: ../lib/yard/templates/helpers/markup/rdoc_markup.rb:69 +msgid "Returns the value of attribute from_path" +msgstr "from_path属性の値を返す" + +# YARD::Templates::Helpers::Markup::RDocMarkup#from_path= +# YARD::Templates::Helpers::Markup::RDocMarkupToHtml#from_path= +#: ../lib/yard/templates/helpers/markup/rdoc_markup.rb:24 +#: ../lib/yard/templates/helpers/markup/rdoc_markup.rb:69 +msgid "Sets the attribute from_path" +msgstr "from_path属性を設定する" + +# @return [RDocMarkup] +#: ../lib/yard/templates/helpers/markup/rdoc_markup.rb:25 +msgid "a new instance of RDocMarkup" +msgstr "RDocMarkupの新しいインスタンス" + +# YARD::Templates::Helpers::Markup::RDocMarkup#fix_typewriter +#: ../lib/yard/templates/helpers/markup/rdoc_markup.rb:42 +msgid "Fixes RDoc behaviour with ++ only supporting alphanumeric text." +msgstr "" +"RDocの振舞いを修正する(アルファベットと数字を組み合わせたテキストのサポートだ" +"け追加)" + +# @todo +#: ../lib/yard/templates/helpers/markup/rdoc_markup.rb:44 +#: ../lib/yard/templates/helpers/markup/rdoc_markup.rb:62 +msgid "Refactor into own SimpleMarkup subclass" +msgstr "自身をSimpleMarkupサブクラスへリファクタリング予定" + +# YARD::Templates::Helpers::Markup::RDocMarkup#fix_dash_dash +#: ../lib/yard/templates/helpers/markup/rdoc_markup.rb:59 +msgid "" +"Don't allow -- to turn into — element. The chances of this being\n" +"some --option is far more likely than the typographical meaning." +msgstr "" +"--を—へ変換する事は許可していない。\n" +"表示している意味よりも、いくつかの--optionになる可能性が高い。" + +# YARD::Templates::Helpers::Markup::RDocMarkupToHtml#handle_special_HYPERLINK +#: ../lib/yard/templates/helpers/markup/rdoc_markup.rb:71 +msgid "Disable auto-link of URLs" +msgstr "URLの自動リンクを無効にする" + +# YARD::Templates::Helpers::MarkupHelper +#: ../lib/yard/templates/helpers/markup_helper.rb:6 +msgid "Helper methods for loading and managing markup types." +msgstr "読み込みと,型のmarkupの管理用のHelperメソッド" + +# YARD::Templates::Helpers::MarkupHelper.clear_markup_cache +#: ../lib/yard/templates/helpers/markup_helper.rb:9 +msgid "Clears the markup provider cache information. Mainly used for testing." +msgstr "" +"マークアッププロバイダーのキャッシュ情報を初期化する。\n" +"主にtest用に利用される。" + +# @since +#: ../lib/yard/templates/helpers/markup_helper.rb:17 +msgid "0.6.4" +msgstr "" + +# @return [Hash{Symbol=>{(:provider,:class)=>Object}}] +#: ../lib/yard/templates/helpers/markup_helper.rb:17 +msgid "the cached markup providers" +msgstr "キャッシュされたマークアッププロバイダー" + +# YARD::Templates::Helpers::MarkupHelper::MARKUP_PROVIDERS +#: ../lib/yard/templates/helpers/markup_helper.rb:23 +msgid "The default list of markup providers for each markup type" +msgstr "" +"それぞれのマークアップの型用の\n" +"マークアッププロバイダーのデフォルトのリスト。" + +# YARD::Templates::Helpers::MarkupHelper::MARKUP_EXTENSIONS +#: ../lib/yard/templates/helpers/markup_helper.rb:49 +msgid "" +"Returns a list of extensions for various markup types. To register\n" +"extensions for a type, add them to the array of extensions for the\n" +"type." +msgstr "" +"様々なmarkupの型の為に拡張のリストを返す。\n" +"型用に拡張を記録するには、型用の拡張の配列に拡張を追加する。" + +# YARD::Templates::Helpers::MarkupHelper::MARKUP_FILE_SHEBANG +#: ../lib/yard/templates/helpers/markup_helper.rb:62 +msgid "" +"Contains the Regexp object that matches the shebang line of extra\n" +"files to detect the markup type." +msgstr "" +"markup型を認識する為に、\n" +"追加のファイルのshebang行にマッチする\n" +"Regexpオブジェクトを含んでいる。" + +# YARD::Templates::Helpers::MarkupHelper#load_markup_provider +#: ../lib/yard/templates/helpers/markup_helper.rb:66 +msgid "" +"Attempts to load the first valid markup provider in {MARKUP_PROVIDERS}.\n" +"If a provider is specified, immediately try to load it." +msgstr "" +"{MARKUP_PROVIDERS}で最初の有効なマークアップロバイダーを読み込む。\n" +"プロバイダーが指定される場合、直ぐにロードするか試す。" + +# YARD::Templates::Helpers::MarkupHelper#load_markup_provider +#: ../lib/yard/templates/helpers/markup_helper.rb:69 +msgid "" +"On success this sets `@markup_provider` and `@markup_class` to\n" +"the provider name and library constant class/module respectively for\n" +"the loaded provider." +msgstr "" +"これは成功した場合、プロバイダー名に\n" +"`@markup_provider`と`@markup_class`を設定し、\n" +"ロードされたプロバイダーの為に、\n" +"それぞれライブラリ,定数,クラス/モジュールとなる。" + +# YARD::Templates::Helpers::MarkupHelper#load_markup_provider +#: ../lib/yard/templates/helpers/markup_helper.rb:73 +msgid "" +"On failure this method will inform the user that no provider could be\n" +"found and exit the program." +msgstr "" +"失敗した場合、このメソッドは、\n" +"プロバイダーが見つける事ができないユーザーを知らせて、プラグラムを脱出するだ" +"ろう。" + +# @return [Boolean] +#: ../lib/yard/templates/helpers/markup_helper.rb:76 +msgid "whether the markup provider was successfully loaded." +msgstr "マークアップのプロバイダーが正常に読み込まれたかどうか" + +# YARD::Templates::Helpers::MarkupHelper#markup_for_file +#: ../lib/yard/templates/helpers/markup_helper.rb:108 +msgid "" +"Checks for a shebang or looks at the file extension to determine\n" +"the markup type for the file contents. File extensions are registered\n" +"for a markup type in {MARKUP_EXTENSIONS}." +msgstr "" +"shebangをチェックし、\n" +"ファイルの内容の為にマークアップの型を決めるファイル拡張子を探す。\n" +"ファイル拡張子は、{MARKUP_EXTENSIONS}のマークアップの型が記録される。" + +# YARD::Templates::Helpers::MarkupHelper#markup_for_file +#: ../lib/yard/templates/helpers/markup_helper.rb:112 +msgid "A shebang should be on the first line of a file and be in the form:" +msgstr "shebangは、ファイルの最初の行になり、次のような形式となる。" + +# YARD::Templates::Helpers::MarkupHelper#markup_for_file +#: ../lib/yard/templates/helpers/markup_helper.rb:114 +msgid " #!markup_type" +msgstr "" + +# YARD::Templates::Helpers::MarkupHelper#markup_for_file +#: ../lib/yard/templates/helpers/markup_helper.rb:116 +msgid "Standard markup types are text, html, rdoc, markdown, textile" +msgstr "標準のマークアップは、text,htmlcrdoc,markdown,textileとなる。" + +# @param [String] contents +#: ../lib/yard/templates/helpers/markup_helper.rb:122 +msgid "" +"Unused. Was necessary prior to 0.7.0.\n" +"Newer versions of YARD use {CodeObjects::ExtraFileObject#contents}" +msgstr "" +"利用されない。0.7.0.より前では、必須だった。\n" +"YARDの最新バージョンでは、{CodeObjects::ExtraFileObject#contents}を用いる。" + +# @see +#: ../lib/yard/templates/helpers/markup_helper.rb:122 +msgid "tag|see|MARKUP_EXTENSIONS" +msgstr "" + +# @return [Symbol] +#: ../lib/yard/templates/helpers/markup_helper.rb:122 +msgid "the markup type recognized for the file" +msgstr "ファイルに認識されたマークアップタイプ" + +# YARD::Templates::Helpers::MarkupHelper#markup_file_contents +#: ../lib/yard/templates/helpers/markup_helper.rb:135 +msgid "" +"Strips any shebang lines on the file contents that pertain to\n" +"markup or preprocessing data." +msgstr "" +"マークアップや処理するデータに関係があるファイルの内容の\n" +"任意のshebang行をStripする。" + +# @deprecated +#: ../lib/yard/templates/helpers/markup_helper.rb:140 +msgid "Use {CodeObjects::ExtraFileObject#contents} instead" +msgstr "替わりに{CodeObjects::ExtraFileObject#contents}を使う" + +# @return [String] +#: ../lib/yard/templates/helpers/markup_helper.rb:140 +msgid "the file contents minus any preprocessing tags" +msgstr "" +"ファイルの内容が任意のtagを表す\n" +"\n" + +# YARD::Templates::Helpers::MarkupHelper#markup_class +#: ../lib/yard/templates/helpers/markup_helper.rb:145 +msgid "" +"Gets the markup provider class/module constant for a markup type\n" +"Call {#load_markup_provider} before using this method." +msgstr "" +"マークアップ型がこのメソッドを使う前に{#load_markup_provider}を呼び出すマーク" +"アッププロバイダーのクラス/モジュールの定数を取得する。" + +# @return [Class] +#: ../lib/yard/templates/helpers/markup_helper.rb:149 +msgid "the markup class" +msgstr "マークアップのクラス" + +# @param [Symbol] the +#: ../lib/yard/templates/helpers/markup_helper.rb:149 +#: ../lib/yard/templates/helpers/markup_helper.rb:159 +msgid "the markup type (:rdoc, :markdown, etc.)" +msgstr "マークアップの型(:rdoc, :markdown, etc.)" + +# YARD::Templates::Helpers::MarkupHelper#markup_provider +#: ../lib/yard/templates/helpers/markup_helper.rb:155 +msgid "" +"Gets the markup provider name for a markup type\n" +"Call {#load_markup_provider} before using this method." +msgstr "" +"マークアップ型がこのメソッド使う前に{#load_markup_provider}を呼び出すマーク" +"アッププロバイダー名を取得する。" + +# @return [Symbol] +#: ../lib/yard/templates/helpers/markup_helper.rb:159 +msgid "the markup provider name (usually the gem name of the library)" +msgstr "マークアッププロバイダー名(慣習では、ライブラリのgem名)" + +# YARD::Templates::Helpers::MethodHelper +#: ../lib/yard/templates/helpers/method_helper.rb:4 +msgid "Helper methods for method objects." +msgstr "メソッドオブジェクト用のHelperメソッド" + +# @return [String] +#: ../lib/yard/templates/helpers/method_helper.rb:6 +msgid "formatted arguments for a method" +msgstr "メソッド用にフォーマットされた引数" + +# @return [String] +#: ../lib/yard/templates/helpers/method_helper.rb:25 +msgid "formatted and linked return types for a method" +msgstr "メソッド用にフォーマットとリンクされた型を返す" + +# @return [String] +#: ../lib/yard/templates/helpers/method_helper.rb:32 +msgid "formatted block if one exists" +msgstr "何か渡された場合、フォーマットされたブロックを返す" + +# @return [String] +#: ../lib/yard/templates/helpers/method_helper.rb:47 +msgid "formats line numbers for source code of an object" +msgstr "オブジェクトのソースコード用に行数をフォーマットする" + +# @return [String] +#: ../lib/yard/templates/helpers/method_helper.rb:54 +msgid "formats source of an object" +msgstr "オブジェクトのソースをフォーマットする" + +# @return [String] +#: ../lib/yard/templates/helpers/method_helper.rb:65 +msgid "formats source code of a constant value" +msgstr "定数の値の入ったソースコードをフォーマットする" + +# YARD::Templates::Helpers::ModuleHelper +#: ../lib/yard/templates/helpers/module_helper.rb:5 +msgid "Helper methods for managing module objects." +msgstr "モジュールオブジェクトを管理用のHelperメソッド" + +# YARD::Templates::Helpers::ModuleHelper#prune_method_listing +#: ../lib/yard/templates/helpers/module_helper.rb:7 +msgid "" +"Prunes the method listing by running the verifier and removing attributes/" +"aliases" +msgstr "" +"verifierを起動する事によって、メソッドのリストを切り詰め、属性/エイリアスを削" +"除する。" + +# @return [Array] +#: ../lib/yard/templates/helpers/module_helper.rb:10 +msgid "a pruned list of methods" +msgstr "切り詰められたメソッドのリスト" + +# @param [Boolean] +#: ../lib/yard/templates/helpers/module_helper.rb:10 +msgid "tag|param|hide_attributes" +msgstr "hide_attributes" + +# @param [Boolean] hide_attributes +#: ../lib/yard/templates/helpers/module_helper.rb:10 +msgid "whether to prune attribute methods from the list" +msgstr "リストからメソッドの属性を切り詰めるかどうか" + +# YARD::Templates::Helpers::TextHelper +#: ../lib/yard/templates/helpers/text_helper.rb:5 +msgid "Helper methods for text template formats." +msgstr "テキストテンプレートフォーマット用のHelperメソッド" + +# @return [String] +#: ../lib/yard/templates/helpers/text_helper.rb:7 +msgid "escapes text" +msgstr "テキストをエスケープする" + +# @return [String] +#: ../lib/yard/templates/helpers/text_helper.rb:22 +msgid "wraps text at +col+ columns." +msgstr "+col+ 列でテキストをラップする。" + +# @return [String] +#: ../lib/yard/templates/helpers/text_helper.rb:27 +msgid "indents +text+ by +len+ characters." +msgstr "+len+ 文字で +text+ をインデントする" + +# @return [String] +#: ../lib/yard/templates/helpers/text_helper.rb:32 +msgid "aligns a title to the right" +msgstr "右にタイトルを並べる" + +# @return [String] +#: ../lib/yard/templates/helpers/text_helper.rb:37 +msgid "aligns text to the right" +msgstr "右にテキストを並べる" + +# @return [String] +#: ../lib/yard/templates/helpers/text_helper.rb:43 +msgid "returns a horizontal rule for output" +msgstr "出力用に横方向の罫線を返す" + +# @return [String] +#: ../lib/yard/templates/helpers/text_helper.rb:48 +msgid "the formatted signature for a method" +msgstr "メソッド用にフォーマットされたシグネチャ" + +# YARD::Templates::Helpers::UMLHelper +#: ../lib/yard/templates/helpers/uml_helper.rb:4 +msgid "Helpers for UML template format" +msgstr "UMLテンプレートフォーマット用のHelperメソッド" + +# YARD::Templates::Helpers::UMLHelper#uml_visibility +#: ../lib/yard/templates/helpers/uml_helper.rb:6 +msgid "" +"Official UML visibility prefix syntax for an object given its visibility" +msgstr "オブジェクト用に与えられた可視性の為の公式のUMLプレフィックス構文" + +# @return [String] +#: ../lib/yard/templates/helpers/uml_helper.rb:8 +msgid "the UML visibility prefix" +msgstr "UML可視性のプレフィックス" + +# @param [CodeObjects::Base] object +#: ../lib/yard/templates/helpers/uml_helper.rb:8 +msgid "the object to retrieve visibility for" +msgstr "可視性を回収するオブジェクト" + +# YARD::Templates::Helpers::UMLHelper#format_path +#: ../lib/yard/templates/helpers/uml_helper.rb:17 +msgid "Formats the path of an object for Graphviz syntax" +msgstr "Graphviz構文用にオブジェクトのパスをフォーマットする。" + +# @param [CodeObjects::Base] object +#: ../lib/yard/templates/helpers/uml_helper.rb:19 +msgid "an object to format the path of" +msgstr "パスをフォーマットするオブジェクト" + +# @return [String] +#: ../lib/yard/templates/helpers/uml_helper.rb:19 +msgid "the encoded path" +msgstr "エンコードされたパス" + +# YARD::Templates::Helpers::UMLHelper#h +#: ../lib/yard/templates/helpers/uml_helper.rb:24 +msgid "Encodes text in escaped Graphviz syntax" +msgstr "Graphviz構文用にエスケープされたテキストをエンコードする" + +# @param [String] text +#: ../lib/yard/templates/helpers/uml_helper.rb:26 +msgid "text to encode" +msgstr "エンコードするテキスト" + +# @return [String] +#: ../lib/yard/templates/helpers/uml_helper.rb:26 +msgid "the encoded text" +msgstr "エンコードされたテキスト" + +# YARD::Templates::Helpers::UMLHelper#tidy +#: ../lib/yard/templates/helpers/uml_helper.rb:31 +msgid "Tidies data by formatting and indenting text" +msgstr "フォーマットによってデータを整える、テキストをインデントする。" + +# @param [String] data +#: ../lib/yard/templates/helpers/uml_helper.rb:33 +msgid "pre-formatted text" +msgstr "フォーマットされる前のテキスト" + +# @return [String] +#: ../lib/yard/templates/helpers/uml_helper.rb:33 +msgid "tidied text." +msgstr "整えられたテキスト" + +# YARD::Templates::Section +#: ../lib/yard/templates/section.rb:4 +msgid "" +"Abstracts the structure for a section and its subsections into an ordered\n" +"list of sections and subsections." +msgstr "" +"セクションに構造体を抽象化し、セクションとサブセクションのオーダーされたリス" +"トをサブサクションにする。" + +# @return [Section] +#: ../lib/yard/templates/section.rb:9 +msgid "a new instance of Section" +msgstr "セクションの新しいインスタンス" + +# @param value +#: ../lib/yard/templates/template.rb:6 +msgid "the value to set the attribute class to." +msgstr "class属性を設定する値" + +# @param value +#: ../lib/yard/templates/template.rb:6 +msgid "the value to set the attribute section to." +msgstr "section属性を設定する値" + +# YARD::Templates::Template#class +#: ../lib/yard/templates/template.rb:7 +msgid "Returns the value of attribute class" +msgstr "class属性の値を返す" + +# YARD::Templates::Template#section +#: ../lib/yard/templates/template.rb:7 +msgid "Returns the value of attribute section" +msgstr "section属性の値を返す" + +# YARD::Templates::Template#class= +#: ../lib/yard/templates/template.rb:7 +msgid "Sets the attribute class" +msgstr "classの属性を設定する" + +# YARD::Templates::Template#section= +#: ../lib/yard/templates/template.rb:7 +msgid "Sets the attribute section" +msgstr "section属性を設定する" + +# YARD::Server::Commands::LibraryIndexCommand#options +# YARD::Templates::Template#options +#: ../lib/yard/templates/template.rb:8 +msgid "Returns the value of attribute options" +msgstr "options属性の値を返す" + +# YARD::Templates::Template.extra_includes +# YARD::Templates::Template.extra_includes= +#: ../lib/yard/templates/template.rb:11 +msgid "" +"Extra includes are mixins that are included after a template is created. " +"These\n" +"mixins can be registered by plugins to operate on templates and override " +"behaviour." +msgstr "" + +# YARD::Templates::Template.extra_includes +# YARD::Templates::Template.extra_includes= +#: ../lib/yard/templates/template.rb:14 +msgid "" +"Note that this array can be filled with modules or proc objects. If a proc " +"object\n" +"is given, the proc will be called with the {Template#options} hash " +"containing\n" +"relevant template information like the object, format, and more. The proc " +"should\n" +"return a module or nil if there is none." +msgstr "" + +# @example Adding in extra mixins to include on a template +#: ../lib/yard/templates/template.rb:24 +msgid "Template.extra_includes << MyHelper" +msgstr "" + +# @example Conditionally including a mixin if the format is html +#: ../lib/yard/templates/template.rb:24 +msgid "" +"Template.extra_includes << proc {|opts| MyHelper if opts.format == :html }" +msgstr "" + +# @return [Array] +#: ../lib/yard/templates/template.rb:24 +msgid "" +"a list of modules to be automatically included\n" +"into any new template module" +msgstr "" +"任意の新しいテンプレートモジュールへ自動でインクルードされるモジュールのリス" +"ト" + +# @example +#: ../lib/yard/templates/template.rb:24 +msgid "tag|example|Adding in extra mixins to include on a template" +msgstr "tag|example|テンプレート上でincludeするために追加のmixinを追加する" + +# @example +#: ../lib/yard/templates/template.rb:24 +msgid "tag|example|Conditionally including a mixin if the format is html" +msgstr "" + +# YARD::Templates::Template.include_extra +#: ../lib/yard/templates/template.rb:33 +msgid "Includes the {extra_includes} modules into the template object." +msgstr "" + +# @param [Template] +#: ../lib/yard/templates/template.rb:37 +msgid "tag|param|template" +msgstr "tag|param|template" + +# @return [LibraryVersion] +#: ../lib/yard/templates/template.rb:37 +msgid "the options hash containing all template information" +msgstr "ハッシュのオプションは全てのテンプレート情報を含んでいる" + +# @param [CodeObjects::Base] object +#: ../lib/yard/templates/template.rb:37 +msgid "the template object to mixin the extra includes." +msgstr "追加のincludeをmixinする為のテンプレートオブジェクト" + +# @param value +#: ../lib/yard/templates/template.rb:59 +msgid "the value to set the attribute full_path to." +msgstr "full_path属性を設定する値" + +# @param value +#: ../lib/yard/templates/template.rb:59 +msgid "the value to set the attribute path to." +msgstr "path属性を設定する値" + +# YARD::Templates::Template::ClassMethods#full_path +#: ../lib/yard/templates/template.rb:60 +msgid "Returns the value of attribute full_path" +msgstr "full_path属性の値を返す" + +# YARD::Templates::Template::ClassMethods#path +#: ../lib/yard/templates/template.rb:60 +msgid "Returns the value of attribute path" +msgstr "path属性の値を返す" + +# YARD::Templates::Template::ClassMethods#full_path= +#: ../lib/yard/templates/template.rb:60 +msgid "Sets the attribute full_path" +msgstr "full_path属性を設定する" + +# YARD::Templates::Template::ClassMethods#path= +#: ../lib/yard/templates/template.rb:60 +msgid "Sets the attribute path" +msgstr "path属性を設定する" + +# @return [ClassMethods] +#: ../lib/yard/templates/template.rb:68 +msgid "a new instance of ClassMethods" +msgstr "ClassMethodsの新しいインスタンス" + +# YARD::Templates::Template::ClassMethods#find_file +#: ../lib/yard/templates/template.rb:78 +msgid "" +"Searches for a file identified by +basename+ in the template's\n" +"path as well as any mixed in template paths. Equivalent to calling\n" +"{ClassMethods#find_nth_file} with index of 1." +msgstr "" +"テンプレートパスも\n" +"任意の混ぜられたテンプレートパスも +basename+ でファイルが一致する為に検索す" +"る。\n" +"{ClassMethods#find_nth_file}メソッドを index 1 で呼び出すのと同様である。" + +# @param [String] +#: ../lib/yard/templates/template.rb:85 ../lib/yard/templates/template.rb:96 +#: ../lib/yard/templates/template.rb:290 +msgid "tag|param|basename" +msgstr "basename" + +# @see +#: ../lib/yard/templates/template.rb:85 +msgid "tag|see|find_nth_file" +msgstr "find_nth_file" + +# @param [String] basename +#: ../lib/yard/templates/template.rb:85 ../lib/yard/templates/template.rb:96 +msgid "the filename to search for" +msgstr "検索するファイル名" + +# @return [String] +#: ../lib/yard/templates/template.rb:85 +msgid "" +"the full path of a file on disk with filename\n" +"+basename+ in one of the template's paths." +msgstr "" +"テンプレートパスの一つである +basename+ の入ったディスク上のファイルのフルパ" +"スを返す" + +# YARD::Templates::Template::ClassMethods#find_nth_file +#: ../lib/yard/templates/template.rb:90 +msgid "" +"Searches for the nth file (where n = +index+) identified\n" +"by basename in the template's path and any mixed in template paths." +msgstr "" +"n番目のファイルがテンプレートパスか任意の混ぜられたテンプレートパスのbasename" +"によって\n" +"一致するかサーチする。" + +# @param [Fixnum] +#: ../lib/yard/templates/template.rb:96 +msgid "tag|param|index" +msgstr "index" + +# @return [String] +#: ../lib/yard/templates/template.rb:96 +msgid "" +"the full path of the nth file on disk with\n" +"filename +basename+ in one of the template paths" +msgstr "" +"テンプレートパスの一つの +basename+ を用いたディスク上のn番目のファイルフルパ" +"ス" + +# @param [Fixnum] index +#: ../lib/yard/templates/template.rb:96 +msgid "the nth existing file to return" +msgstr "n番目に存在するファイルを戻すindex" + +# YARD::Templates::Template::ClassMethods#new +#: ../lib/yard/templates/template.rb:115 +msgid "Creates a new template object to be rendered with {Template#run}" +msgstr "{Template#run}と共に表示される新しいテンプレートオブジェクトを作成する" + +# YARD::Templates::Template::ClassMethods#S +#: ../lib/yard/templates/template.rb:131 +msgid "Alias for creating a {Section} with arguments" +msgstr "引数と共に{Section}の作成用のエイリアス" + +# @see +#: ../lib/yard/templates/template.rb:133 +msgid "tag|see|Section#initialize" +msgstr "Section#initialize" + +# @return [Template] +#: ../lib/yard/templates/template.rb:166 +msgid "a new instance of Template" +msgstr "テンプレートの新しいインスタンス" + +# YARD::Templates::Template#T +#: ../lib/yard/templates/template.rb:177 +msgid "" +"Loads a template specified by path. If +:template+ or +:format+ is\n" +"specified in the {#options} hash, they are prepended and appended\n" +"to the path respectively." +msgstr "" +"pathによって指定されたテンプレートをロードする。\n" +"+:template+ や +:format+ が{#options}ハッシュメソッドで指定される場合、\n" +"#optionsメソッドに関係するパスが前後に加えられる。" + +# @return [Template] +#: ../lib/yard/templates/template.rb:182 +msgid "the loaded template module" +msgstr "ロードされたテンプレートモジュール" + +# @param [Array] path +#: ../lib/yard/templates/template.rb:182 +msgid "the path of the template" +msgstr "テンプレートのパス" + +# YARD::Templates::Template#sections +#: ../lib/yard/templates/template.rb:189 +msgid "Sets the sections (and subsections) to be rendered for the template" +msgstr "テンプレート用に表示されるセクション(とサブサクション)を設定する。" + +# @example Sets a set of method and erb sections +#: ../lib/yard/templates/template.rb:204 +msgid "sections :a, :b, :c # a is a method, the rest are erb files" +msgstr "" + +# @example Sets a set of erb sections +#: ../lib/yard/templates/template.rb:204 +msgid "sections :a, :b, :c # searches for a.erb, b.erb, c.erb" +msgstr "" + +# @example Sections with subsections +#: ../lib/yard/templates/template.rb:204 +msgid "" +"sections :header, [:name, :children]\n" +"# the above will call header.erb and only renders the subsections\n" +"# if they are yielded by the template (see #yieldall)" +msgstr "" +"sections :header, [:name, :children]\n" +"# 上は、header.erbが呼び出され、subsectionをが表示する。\n" +"# テンプレートでyieldしたい場合は (see #yieldall) 参照" + +# @example +#: ../lib/yard/templates/template.rb:204 +msgid "tag|example|Sections with subsections" +msgstr "subsectionsを用いたsection" + +# @example +#: ../lib/yard/templates/template.rb:204 +msgid "tag|example|Sets a set of erb sections" +msgstr "erb sectionのグループを設置する" + +# @example +#: ../lib/yard/templates/template.rb:204 +msgid "tag|example|Sets a set of method and erb sections" +msgstr "メソッドのグループとercセクションを設定する" + +# @param [Array] args +#: ../lib/yard/templates/template.rb:204 +msgid "" +"the sections\n" +"to use to render the template. For symbols and strings, the\n" +"section will be executed as a method (if one exists), or rendered\n" +"from the file \"name.erb\" where name is the section name. For\n" +"templates, they will have {Template::ClassMethods#run} called on them.\n" +"Any subsections can be yielded to using yield or {#yieldall}" +msgstr "" +"テンプレートを表示する為に利用するセクション。\n" +"symbolとstringでセクションは、メソッドとして実行される。(存在する場合)\n" +"又、nameがsection名の所で\"name.erb\"ファイルから表示される\n" +"テンプレート用に、呼び出された{Template::ClassMethods#run}を持つだろう。\n" +"任意のsubsectionは、yieldや{#yieldall}メソッドによってyieldされる。" + +# YARD::Templates::Template#init +#: ../lib/yard/templates/template.rb:210 +msgid "" +"Initialization called on the template. Override this in a 'setup.rb'\n" +"file in the template's path to implement a template" +msgstr "" +"テンプレート上で呼び出される初期化処理。\n" +"テンプレートを実装するテンプレートのパスで'setup.rb'ファイルを上書きする。" + +# @example A default set of sections +#: ../lib/yard/templates/template.rb:217 +msgid "" +"def init\n" +" sections :section1, :section2, [:subsection1, :etc]\n" +"end" +msgstr "" + +# @example +#: ../lib/yard/templates/template.rb:217 +msgid "tag|example|A default set of sections" +msgstr "セクションのデフォルトのグループ" + +# @see +#: ../lib/yard/templates/template.rb:217 +msgid "tag|see|#sections" +msgstr "" + +# YARD::Templates::Template#run +#: ../lib/yard/templates/template.rb:221 +msgid "" +"Runs a template on +sects+ using extra options. This method should\n" +"not be called directly. Instead, call the class method {ClassMethods#run}" +msgstr "" +"追加のオプションによって、+sects+上でテンプレートを起動する。\n" +"このメソッドは、直接呼び出されないだろう。\n" +"代わりに、{ClassMethods#run}クラスメソッドを呼び出す。" + +# @param [Section, Array] sects +#: ../lib/yard/templates/template.rb:230 +msgid "a section list of sections to render" +msgstr "表示する為のsectionのリスト" + +# @param [Hash, nil] opts +#: ../lib/yard/templates/template.rb:230 +msgid "any extra options to apply to sections" +msgstr "sectionsに適用する任意の追加のオプション" + +# @yieldparam [Hash] opts +#: ../lib/yard/templates/template.rb:230 +msgid "any extra options to yield" +msgstr "yieldする任意の追加のオプション" + +# @yield [opts] +#: ../lib/yard/templates/template.rb:230 +msgid "calls for the subsections to be rendered" +msgstr "表示されるサブセクション用に呼び出される" + +# @param [Boolean] break_first +#: ../lib/yard/templates/template.rb:230 +msgid "if true, renders only the first section" +msgstr "trueなら、最初のセクションだけ表示される" + +# @param [Boolean] +#: ../lib/yard/templates/template.rb:230 +msgid "tag|param|break_first" +msgstr " break_first" + +# @param [Section, Array] +#: ../lib/yard/templates/template.rb:230 +msgid "tag|param|sects" +msgstr "sects" + +# @param [Fixnum] +#: ../lib/yard/templates/template.rb:230 +msgid "tag|param|start_at" +msgstr "start_at" + +# @yieldparam [Hash] +#: ../lib/yard/templates/template.rb:230 +msgid "tag|yieldparam|opts" +msgstr "" + +# @param [Fixnum] start_at +#: ../lib/yard/templates/template.rb:230 +msgid "the index in the section list to start from" +msgstr "セクションのリストの最初のindex" + +# @return [String] +#: ../lib/yard/templates/template.rb:230 +msgid "the rendered sections joined together" +msgstr "一緒に加えられた,表示されたsection" + +# YARD::Templates::Template#yieldall +#: ../lib/yard/templates/template.rb:254 +msgid "Yields all subsections with any extra options" +msgstr "任意の追加のオプションと共に全てのサブセクションをyieldする。" + +# @param [Hash] opts +#: ../lib/yard/templates/template.rb:256 +msgid "extra options to be applied to subsections" +msgstr "サブセクションに適用される追加のオプション" + +# @yield +#: ../lib/yard/templates/template.rb:263 +msgid "calls subsections to be rendered" +msgstr "表示されるサブセクションを呼び出す" + +# @param [String, Symbol] +# @param [Symbol, String] +#: ../lib/yard/templates/template.rb:263 ../lib/yard/templates/template.rb:308 +msgid "tag|param|section" +msgstr "section" + +# @return [String] +#: ../lib/yard/templates/template.rb:263 +msgid "the contents of the ERB rendered section" +msgstr "セクションに表示されるERBの内容" + +# @param [String, Symbol] section +#: ../lib/yard/templates/template.rb:263 +msgid "the section name" +msgstr "セクション名" + +# YARD::Templates::Template#file +#: ../lib/yard/templates/template.rb:271 +msgid "" +"Returns the contents of a file. If +allow_inherited+ is set to +true+,\n" +"use +{{{__super__}}}+ inside the file contents to insert the contents\n" +"of the file from an inherited template. For instance, if +templates/b+\n" +"inherits from +templates/a+ and file \"test.css\" exists in both " +"directories,\n" +"both file contents can be retrieved by having +templates/b/test.css+ look\n" +"like:" +msgstr "" +"ファイルの内容を返す。\n" +"+allow_inherited+ が +true+ に設定される場合、\n" +"継承されたテンプレートから\n" +"ファイルの入った内容を挿入する為、\n" +"ファイルの内容の内部で\n" +"+{{{__super__}}}+ を使う。\n" +"例えば、 +templates/b+ が +templates/a+ から継承され、 \"test.css\"ファイルが" +"存在する\n" +"ディレクトリの中で両方とも存在している場合、\n" +"両方ファイルの内容は、以下の用に\n" +"+templates/b/test.css+ を持つ事によって回収できる。" + +# YARD::Templates::Template#file +#: ../lib/yard/templates/template.rb:278 +msgid "" +" {{{__super__}}}\n" +" ...\n" +" body { css styles here }\n" +" p.class { other styles }" +msgstr "" + +# @param [Boolean] +#: ../lib/yard/templates/template.rb:290 +msgid "tag|param|allow_inherited" +msgstr "allow_inherited" + +# @see +#: ../lib/yard/templates/template.rb:290 +msgid "tag|see|ClassMethods#find_file" +msgstr "" + +# @see +#: ../lib/yard/templates/template.rb:290 +msgid "tag|see|ClassMethods#find_nth_file" +msgstr "" + +# @return [String] +#: ../lib/yard/templates/template.rb:290 +msgid "" +"the contents of a file identified by +basename+. All\n" +"template paths (including any mixed in templates) are searched for\n" +"the file" +msgstr "" +"+basename+ によって指定されたファイルの内容。\n" +"全てのテンプレートパスは(任意の混ぜられたテンプレートを含んでいる)、\n" +"ファイル用に検索される。" + +# @param [String] basename +#: ../lib/yard/templates/template.rb:290 +msgid "the name of the file" +msgstr "ファイルの名前" + +# @param [Boolean] allow_inherited +#: ../lib/yard/templates/template.rb:290 +msgid "" +"whether inherited templates can\n" +"be inserted with +{{{__super__}}}+" +msgstr "継承されたテンプレートが +{{{__super__}}}+ を用いて継承されるかどうか" + +# YARD::Templates::Template#superb +#: ../lib/yard/templates/template.rb:304 +msgid "Calls the ERB file from the last inherited template with {#section}.erb" +msgstr "" +"{#section}.erbと共に継承されたテンプレートの最後からERBファイルを呼び出す。" + +# @param [Symbol, String] section +#: ../lib/yard/templates/template.rb:308 +msgid "if provided, uses a specific section name" +msgstr "提供された場合、固有のセクション名を使う" + +# @return [String] +#: ../lib/yard/templates/template.rb:308 +msgid "" +"the rendered ERB file in any of the inherited template\n" +"paths." +msgstr "継承されたテンプレートパスの任意で表示されるERBファイル" + +# YARD::Templates::TemplateOptions +#: ../lib/yard/templates/template_options.rb:6 +msgid "" +"An Options class containing default options for base template rendering. " +"For\n" +"options specific to generation of HTML output, see {CLI::YardocOptions}." +msgstr "" + +# @see +#: ../lib/yard/templates/template_options.rb:9 +msgid "tag|see|CLI::YardocOptions" +msgstr "" + +# @param [String] text +#: ../lib/yard/templates/template_options.rb:11 +msgid "the template output format" +msgstr "テンプレート出力のフォーマット" + +# @param [String] path +#: ../lib/yard/templates/template_options.rb:14 +msgid "the template name used to render output" +msgstr "出力を表示するため利用されたテンプレート名" + +# @param value +#: ../lib/yard/templates/template_options.rb:17 +msgid "the markup format to use when parsing docstrings" +msgstr "docstringを解析する時に使うためのマークアップフォーマット" + +# YARD::Templates::Helpers::HtmlHelper#signature_types +#: ../lib/yard/templates/template_options.rb:20 +msgid "the default return type for a method with no return tags" +msgstr "returnタグを用いないメソッド用のデフォルトの戻りの型" + +# @return [Boolean] +#: ../lib/yard/templates/template_options.rb:23 +msgid "whether void methods should show \"void\" in their signature" +msgstr "" + +# @param [String] source +#: ../lib/yard/templates/template_options.rb:26 +msgid "whether code blocks should be syntax highlighted" +msgstr "コードブロックが構文ハイライトされるかどうか" + +# YARD::Templates::Helpers::MarkupHelper::MARKUP_PROVIDERS +#: ../lib/yard/templates/template_options.rb:29 +msgid "the markup provider class for the markup format" +msgstr "マークアップフォーマット用のマークアッププロバイダークラス" + +# @return [OpenStruct] +#: ../lib/yard/templates/template_options.rb:33 +msgid "" +"an open struct containing any global state across all\n" +"generated objects in a template." +msgstr "" +"テンプレートの中で生成された全てのオブジェクトに渡って\n" +"全てのglobalの状態を含んでいるopen struct" + +# @return [Template] +#: ../lib/yard/templates/template_options.rb:37 +msgid "the main object being generated in the template" +msgstr "テンプレートの中で生成されるメインオブジェクト" + +# YARD::CodeObjects::Base#name +# YARD::CodeObjects::Proxy#name +#: ../lib/yard/templates/template_options.rb:40 +msgid "the owner of the generated object" +msgstr "生成されたオブジェクトのオーナー" + +# @return [Boolean] +#: ../lib/yard/templates/template_options.rb:43 +msgid "the template type used to generate output" +msgstr "出力を生成するために使ったテンプレートタイプ" + +# @return [Boolean] +#: ../lib/yard/templates/template_options.rb:46 +msgid "whether serialization should be performed" +msgstr "シリアライズが実行されるかどうか" + +# @return [Serializers::Base] +#: ../lib/yard/templates/template_options.rb:50 +msgid "" +"the serializer used to generate links and serialize\n" +"output. Serialization output only occurs if {#serialize} is +true+." +msgstr "" + +# @deprecated +#: ../lib/yard/templates/template_options.rb:54 +#: ../lib/yard/templates/template_options.rb:56 +msgid "use {#highlight} instead." +msgstr "" + +# @return [String] +#: ../lib/yard/templates/template_options.rb:54 +#: ../lib/yard/templates/template_options.rb:56 +msgid "whether highlighting should be ignored" +msgstr "ハイライトが無視されるかどうか" + +# @param [String] title +#: ../lib/yard/templates/template_options.rb:60 +msgid "the title of a given page" +msgstr "与えられたページのタイトル" + +# @return [Array] +#: ../lib/yard/templates/template_options.rb:68 +msgid "" +"an array of module name wildcards to embed into\n" +"class documentation as if their methods were defined directly in the class.\n" +"Useful for modules like ClassMethods. If the name contains '::', the module\n" +"is matched against the full mixin path, otherwise only the module name is " +"used." +msgstr "" + +# @example A list of mixin path names (including wildcards) +#: ../lib/yard/templates/template_options.rb:68 +msgid "opts.embed_mixins #=> ['ClassMethods', '*Helper', 'YARD::*']" +msgstr "" + +# @example +#: ../lib/yard/templates/template_options.rb:68 +msgid "tag|example|A list of mixin path names (including wildcards)" +msgstr "" + +# @param [CodeObjects::Base] mixin +#: ../lib/yard/templates/template_options.rb:74 +msgid "" +"accepts any code object, but returns\n" +"nil unless the object is a module." +msgstr "" + +# @return [nil] +#: ../lib/yard/templates/template_options.rb:74 +msgid "if the mixin is not a module object" +msgstr "mixinがモジュールオブジェクトでない場合" + +# @param [Fixnum, nil] +#: ../lib/yard/templates/template_options.rb:74 +msgid "tag|param|mixin" +msgstr "tag|param|mixin" + +# @return [Boolean] +#: ../lib/yard/templates/template_options.rb:74 +msgid "whether a mixin matches the embed_mixins list" +msgstr "mixinがembed_mixinsのリストにマッチするかどうか" + +# @param [Serializers::Base] serializer +#: ../lib/yard/templates/template_options.rb:85 +msgid "the verifier object" +msgstr "verifier(認証)オブジェクト" + +# YARD::Verifier +#: ../lib/yard/verifier.rb:3 +msgid "" +"Similar to a Proc, but runs a set of Ruby expressions using a small\n" +"DSL to make tag lookups easier." +msgstr "" +"Procと同様であるが、検索しやすいタグを作る為に、\n" +"ちょっとしたDSLによって、Rubyの式のグループを起動する。" + +# YARD::Verifier +#: ../lib/yard/verifier.rb:6 +msgid "" +"The syntax is as follows:\n" +"* All syntax is Ruby compatible\n" +"* +object+ (+o+ for short) exist to access the object being verified\n" +"* +@TAGNAME+ is translated into +object.tag('TAGNAME')+\n" +"* +@@TAGNAME+ is translated into +object.tags('TAGNAME')+\n" +"* +object+ can be omitted as target for method calls (it is implied)" +msgstr "" +"次の様な構文となる:\n" +"* 全ての構文は、Rubyと互換性がある。\n" +"* +object+ (略字は +o+)は検証されるオブジェクトにアクセスする為に存在する。\n" +"* +@TAGNAME+ は +object.tag('TAGNAME')+ の中で変換される\n" +"* +@@TAGNAME+ は +object.tags('TAGNAME')+ の中で変換される\n" +"* +object+ は、メソッド呼び出し用の対象として省略できる。(ほのめかす)" + +# @example Check if there are any @param tags +#: ../lib/yard/verifier.rb:33 +msgid "" +"Verifier.new('@@param.empty?')\n" +"# Equivalent to:\n" +"Verifier.new('object.tags(:param).empty?')" +msgstr "" +"Verifier.new('@@param.empty?')\n" +"# 下は上と同様\n" +"Verifier.new('object.tags(:param).empty?')" + +# @example Specifying multiple expressions +#: ../lib/yard/verifier.rb:33 +msgid "" +"Verifier.new('@return', '@param', '@yield')\n" +"# Equivalent to:\n" +"Verifier.new('@return && @param && @yield')" +msgstr "" +"Verifier.new('@return', '@param', '@yield')\n" +"# 以下は上と同様\n" +"Verifier.new('@return && @param && @yield')" + +# @example Create a verifier to find any return tag with an empty description +#: ../lib/yard/verifier.rb:33 +msgid "" +"Verifier.new('@return.text.empty?')\n" +"# Equivalent to:\n" +"Verifier.new('object.tag(:return).text.empty?')" +msgstr "" +"Verifier.new('@return.text.empty?')\n" +"# 下は上と同様\n" +"Verifier.new('object.tag(:return).text.empty?')" + +# @example Using +object+ or +o+ to look up object attributes directly +#: ../lib/yard/verifier.rb:33 +msgid "" +"Verifier.new('object.docstring == \"hello world\"')\n" +"# Equivalent to:\n" +"Verifier.new('o.docstring == \"hello world\"')" +msgstr "" +"Verifier.new('object.docstring == \"hello world\"')\n" +"# 下は上と同様\n" +"Verifier.new('o.docstring == \"hello world\"')" + +# @example Without using +object+ or +o+ +#: ../lib/yard/verifier.rb:33 +msgid "Verifier.new('tag(:return).size == 1 || has_tag?(:author)')" +msgstr "" + +# @example +#: ../lib/yard/verifier.rb:33 +msgid "tag|example|Check if there are any @param tags" +msgstr "@paramタグがあるかチェックする" + +# @example +#: ../lib/yard/verifier.rb:33 +msgid "" +"tag|example|Create a verifier to check for objects that don't have @private " +"tags" +msgstr "@privateタグを持たないオブジェクト用にチェックする検証器を作成する。" + +# @example +#: ../lib/yard/verifier.rb:33 +msgid "" +"tag|example|Create a verifier to find any return tag with an empty " +"description" +msgstr "空の説明と共に、任意のreturnタグを見つける検証器を作成する。" + +# @example +#: ../lib/yard/verifier.rb:33 +msgid "tag|example|Specifying multiple expressions" +msgstr "複数の表現を指定する" + +# @example +#: ../lib/yard/verifier.rb:33 +msgid "tag|example|Using +object+ or +o+ to look up object attributes directly" +msgstr "直接オブジェクト属性を検索するには、+object+ や +o+を使う" + +# @example +#: ../lib/yard/verifier.rb:33 +msgid "tag|example|Without using +object+ or +o+" +msgstr "+object+ と +o+ を使わない例" + +# @example Create a verifier to check for objects that don't have @private tags +#: ../lib/yard/verifier.rb:33 +msgid "" +"verifier = Verifier.new('!@private')\n" +"verifier.call(object) # => true (no @private tag)" +msgstr "" + +# @return [Array] +#: ../lib/yard/verifier.rb:36 +msgid "a list of all expressions the verifier checks for" +msgstr "チェックする検証器用の全ての式のリスト" + +# YARD::Verifier#initialize +#: ../lib/yard/verifier.rb:44 +msgid "Creates a verifier from a set of expressions" +msgstr "式のグループから検証器を作成する。" + +# @param [Array] expressions +#: ../lib/yard/verifier.rb:47 +msgid "" +"a list of Ruby expressions to\n" +"parse." +msgstr "解析するRubyの式のリスト" + +# @return [Verifier] +#: ../lib/yard/verifier.rb:47 +msgid "a new instance of Verifier" +msgstr "検証器の新しいインスタンス" + +# @param [Array] +#: ../lib/yard/verifier.rb:47 ../lib/yard/verifier.rb:57 +msgid "tag|param|expressions" +msgstr "式" + +# YARD::Verifier#add_expressions +#: ../lib/yard/verifier.rb:53 +msgid "Adds a set of expressions and recompiles the verifier" +msgstr "式のグループを追加し、検証器を再編集する。" + +# @param [Array] expressions +#: ../lib/yard/verifier.rb:57 +msgid "a list of expressions" +msgstr "式のリスト" + +# YARD::Verifier#method_missing +#: ../lib/yard/verifier.rb:62 +msgid "Passes any method calls to the object from the {#call}" +msgstr "{#call}メソッドからオブジェクトに任意のメソッド呼び出しを解析する" + +# YARD::Verifier#call +#: ../lib/yard/verifier.rb:71 +msgid "Tests the expressions on the object." +msgstr "オブジェクト上の式をテストする" + +# @note +#: ../lib/yard/verifier.rb:75 +msgid "If the object is a {CodeObjects::Proxy} the result will always be true." +msgstr "オブジェクトが{CodeObjects::Proxy}なら、評価結果は,常にtrueになる。" + +# @param [CodeObjects::Base] object +#: ../lib/yard/verifier.rb:75 +msgid "the object to verify" +msgstr "検証するオブジェクト" + +# @return [Boolean] +#: ../lib/yard/verifier.rb:75 +msgid "the result of the expressions" +msgstr "式の結果" + +# YARD::Verifier#run +#: ../lib/yard/verifier.rb:85 +msgid "" +"Runs a list of objects against the verifier and returns the subset\n" +"of verified objects." +msgstr "" +"オブジェクトに対する検証器のリストを起動し、検証されるオブジェクトの下位集合" +"を返す" + +# @return [Array] +#: ../lib/yard/verifier.rb:90 +msgid "" +"a list of code objects that match\n" +"the verifier." +msgstr "検証器にマッチするコードオブジェクトのリスト" + +# @return [CodeObjects::Base] +#: ../lib/yard/verifier.rb:97 +msgid "the current object being tested" +msgstr "テストされる現在のオブジェクト" + +# YARD::Verifier#modify_nilclass +#: ../lib/yard/verifier.rb:106 +msgid "" +"Modifies nil to not throw NoMethodErrors. This allows\n" +"syntax like object.tag(:return).text to work if the #tag\n" +"call returns nil, which means users don't need to perform\n" +"stringent nil checking" +msgstr "" +"NoMethodErrorsにthrowせずnil classに変更する。\n" +"#tagメソッド呼び出しがnilを返す場合、\n" +"これはobject.tag(:return).textのような構文を受け入れる。\n" +"ユーザーが厳密なnilのチェックする為に必要としない事を意味する。" + +# YARD::Verifier#unmodify_nilclass +#: ../lib/yard/verifier.rb:118 +msgid "Returns the state of NilClass back to normal" +msgstr "NilClassの状態を元に戻す" + +# YARD::Verifier#create_method_from_expressions +#: ../lib/yard/verifier.rb:126 +msgid "" +"Creates the +__execute+ method by evaluating the expressions\n" +"as Ruby code" +msgstr "" +"Rubyのコードのような式を評価する事によって +__execute+ メソッドを作成する。" + +# YARD::Verifier#parse_expression +#: ../lib/yard/verifier.rb:137 +msgid "Parses a single expression, handling some of the DSL syntax." +msgstr "単独の式を解析し、いくつかのDSL構文を操作する。" + +# YARD::Verifier#parse_expression +#: ../lib/yard/verifier.rb:139 +msgid "" +"The syntax \"@tag\" should be turned into object.tag(:tag),\n" +"and \"@@tag\" should be turned into object.tags(:tag)" +msgstr "" +"\"@tag\"構文は、object.tag(:tag)へ渡され、\n" +"\"@tags\"構文は、object.tags(:tag)へ渡される。" + +# @return [String] +#: ../lib/yard/verifier.rb:142 +msgid "the parsed expression" +msgstr "解析された式" + +# YARD::Tags::Library +#~ msgid "" +#~ "This will allow you to use @mytag TEXT to add meta data to classes " +#~ "through\n" +#~ "the docstring. You can use the {Library#factory} object to help parse " +#~ "standard\n" +#~ "tag syntax." +#~ msgstr "" +#~ "この例は、\n" +#~ "あなたが、docstringを通じてクラス化するメタデータを追加する為に\n" +#~ "@mytag TEXTを使う事を受け入れる。\n" +#~ "あなたは、標準のタグ構文を解析し補助する為に\n" +#~ "{Library#factory}オブジェクトを利用できる。" + +# YARD::Tags::Library +#~ msgid "" +#~ "== Method #2\n" +#~ "Write your own +tagname_tag+ method that takes the raw text as a " +#~ "parameter.\n" +#~ "Example:\n" +#~ " def mytag_tag(text)\n" +#~ " # parse your tag contents here\n" +#~ " end" +#~ msgstr "" +#~ "== 方法 #2\n" +#~ "自分で引数の様に生のテキストを取得し、 +tagname_tag+ メソッドを書く。\n" +#~ "\\nExample:\n" +#~ " def mytag_tag(text)\n" +#~ " # parse your tag contents here\n" +#~ " end" + +# YARD::Tags::Library +#~ msgid "" +#~ "Note that +tag_factory+ is the factory object used to parse tags. This " +#~ "value\n" +#~ "defaults to the {DefaultFactory} class and can be set by changing " +#~ "{Library.default_factory}." +#~ msgstr "" +#~ "次の事に留意する。\n" +#~ "+tag_facotory+ は、タグを解析する為に利用されるfactoryオブジェクトとな" +#~ "る。\n" +#~ "この値は{DefaultFactory}クラスがデフォルトとなり、\n" +#~ "{Library.default_factory}を変更する事によって設定できる。" + +# YARD::Tags::Library +#~ msgid "" +#~ "The second line will expand to:\n" +#~ " def author_tag(text) tag_factory.parse_tag(text) end" +#~ msgstr "" +#~ "例の2番目の行は次の様になる:\n" +#~ " def author_tag(text) tag_factory.parse_tag(text) end" + +# YARD::Tags::Library +#~ msgid "" +#~ "The first line will expand to the code:\n" +#~ " def param_tag(text) tag_factory.parse_tag_with_types_and_name(text) end" +#~ msgstr "" +#~ "例の最初の行は、次の様になる:\n" +#~ " def param_tag(text) tag_factory.parse_tag_with_types_and_name(text) end" + +# YARD::Tags::Library +#~ msgid "" +#~ "== Method #1\n" +#~ "Use {Library.define_tag} to define a new tag by passing the tag name\n" +#~ "and the factory method to use when creating the tag. These definitions " +#~ "will\n" +#~ "be auto expanded into ruby code similar to what is shown in method #2. If " +#~ "you\n" +#~ "do not provide a factory method to use, it will default to " +#~ "{DefaultFactory#parse_tag}\n" +#~ "Example:\n" +#~ " define_tag \"Parameter\", :param, :with_types_and_name\n" +#~ " define_tag \"Author\", :author" +#~ msgstr "" +#~ "== 方法 #1\n" +#~ "{Library.define_tag}を使い,タグ名を解析する事によって新しいタグを定義" +#~ "し、\n" +#~ "タグを作成する時にfactoryメソッドを使用する。\n" +#~ "これらの定義は 方法 #2の中の見られる事と同様に\n" +#~ "Rubyコードの中で自動拡張される。\n" +#~ "あなたがfactoryメソッドを利用しない場合、\n" +#~ "デフォルトは{DefaultFactory#parse_tag}になるだろう。\n" +#~ "\\nExample:\n" +#~ " define_tag \"Parameter\", :param, :with_types_and_name\n" +#~ " define_tag \"Author\", :author" + +# YARD::Tags::Library +#~ msgid "" +#~ "Holds all the registered meta tags. If you want to extend YARD and add\n" +#~ "a new meta tag, you can do it in one of two ways." +#~ msgstr "" +#~ "全ての記録されるメタタグを把握する。あなたがYARDを拡張したい場合や\n" +#~ "新しいメタタグを追加したい場合は、2つの方法のうちどちらかを選択することが" +#~ "できる。" + +# YARD::Server::WebrickServlet#adapter= +#~ msgid "Sets the attribute adapter" +#~ msgstr "アダプタの属性を設定する" + +# YARD::Server::WebrickServlet#adapter +#~ msgid "Returns the value of attribute adapter" +#~ msgstr "アダプタの属性の値を返す" + +# @param value +#~ msgid "the value to set the attribute adapter to." +#~ msgstr "アダプタの属性を設定する値" + +# YARD::Server::Commands::SearchCommand#results= +#~ msgid "Sets the attribute results" +#~ msgstr "results属性を設定する" + +# YARD::Server::Commands::SearchCommand#query= +#~ msgid "Sets the attribute query" +#~ msgstr "query属性を設定する" + +# YARD::Server::Commands::SearchCommand#results +#~ msgid "Returns the value of attribute results" +#~ msgstr "results属性の値を返す" + +# YARD::Server::Commands::SearchCommand#query +#~ msgid "Returns the value of attribute query" +#~ msgstr "query属性の値を返す" + +# @param value +#~ msgid "the value to set the attribute results to." +#~ msgstr "results属性を設定する値" + +# @param value +#~ msgid "the value to set the attribute query to." +#~ msgstr "query属性を設定する値" + +# YARD::Server::Commands::ListFilesCommand +#~ msgid "Returns the list of README/extra files in a library" +#~ msgstr "ライブラリの中のREADMEと追加のファイルのリストを返す" + +# YARD::Server::Commands::ListMethodsCommand +#~ msgid "Returns the list of methods in a library" +#~ msgstr "ライブラリの中のメソッドのリストを返す" + +# YARD::Server::Commands::ListClassesCommand +#~ msgid "Returns the list of classes / modules in a library" +#~ msgstr "ライブラリの中のクラスとモジュールのリストを返す" + +# YARD::Server::Commands::LibraryIndexCommand#options= +#~ msgid "Sets the attribute options" +#~ msgstr "options属性を設定する" + +# @param value +#~ msgid "the value to set the attribute options to." +#~ msgstr "options属性を設定する為の値" + +# YARD::RegistryStore#proxy_types +#~ msgid "Returns the value of attribute proxy_types" +#~ msgstr "proxy_types属性の値を返す" + +# @example +#~ msgid "tag|example|Performing a Search on a Registry" +#~ msgstr "レジストリー上で検索を実行する" + +# @param [Boolean] load_order_errors +#~ msgid "whether or not to raise the {LoadOrderError}" +#~ msgstr "{LoadOrderError}の例外を上げるかどうか" + +# @param [Symbol] parser_type +#~ msgid "the parser type to use" +#~ msgstr "使用するパーサータイプ。" + +# @param [Boolean] +#~ msgid "tag|param|load_order_errors" +#~ msgstr "load_order_errors" + +# @param [OpenStruct] globals +#~ msgid "global state to be re-used across separate source files" +#~ msgstr "ソースファイルをまたいで再利用される、globals" + +# YARD::Parser::SourceParser#initialize +#~ msgid "" +#~ "Creates a new parser object for code parsing with a specific parser type." +#~ msgstr "" +#~ "明確なパーサー型と共にコード解析用の\n" +#~ "新しいパーサーオブジェクトを作成する。" + +# YARD::Parser::SourceParser.parse_in_order +#~ msgid "" +#~ "Parses a list of files in a queue. If a {LoadOrderError} is caught,\n" +#~ "the file is moved to the back of the queue with a Continuation object\n" +#~ "that can continue processing the file." +#~ msgstr "" +#~ "err節の説明が入ってない\n" +#~ "Errorの時は Continuation オブジェクトではなく、\n" +#~ "e.contextと共にファイルの後ろにpushされる。)\n" +#~ "\n" +#~ "キューの中のファイルのリストを解析する。\n" +#~ "{LoadOrderError}が見つかった場合、\n" +#~ "ファイルはキューの後ろに移動され、Continuationオブジェクトを用い、\n" +#~ "処理しているファイルを継続できる" + +# @param [Continuation] +#~ msgid "tag|param|context" +#~ msgstr "context" + +# @return [LoadOrderError] +#~ msgid "a new instance of LoadOrderError" +#~ msgstr "LoadOrderErrorの新しいインスタンス。" + +# @return [Continuation] +#~ msgid "" +#~ "the context representing the\n" +#~ "point at which the load order error occurred." +#~ msgstr "" +#~ "コンテキストはload order errorが起こされる所の\n" +#~ "ポイントを指摘する。" + +# YARD::Parser::LoadOrderError +#~ msgid "" +#~ "A LoadOrderError occurs when a handler needs to modify a\n" +#~ "{CodeObjects::NamespaceObject} (usually by adding a child to it)\n" +#~ "that has not yet been resolved." +#~ msgstr "" +#~ "LoadOrderErrorは、ハンドラーが解決されない{CodeObjects::NamespaceObject}" +#~ "を\n" +#~ "修正する必要がある時に起こる。(通常は、NamespaceObjectに子を追加する)" + +# @return [Object] +#~ msgid "the current value of shebang_line" +#~ msgstr "shebang_lineの現在の値" + +# @return [Object] +#~ msgid "the current value of enumerator" +#~ msgstr "enumeratorの現在の値" + +# @return [Object] +#~ msgid "the current value of encoding_line" +#~ msgstr "encoding_lineの現在の値" + +# YARD::Parser::Ruby::Legacy::Statement#group= +# YARD::Parser::Ruby::AstNode#group= +#~ msgid "Sets the attribute group" +#~ msgstr "グループ属性を設定する。" + +# YARD::Parser::Ruby::Legacy::Statement#group +# YARD::Parser::Ruby::AstNode#group +#~ msgid "Returns the value of attribute group" +#~ msgstr "グループ属性の入った値を返す。" + +# @param value +#~ msgid "the value to set the attribute group to." +#~ msgstr "グループ属性を設定する,値" + +# @return [LocaleInfoCollector] +#~ msgid "a new instance of LocaleInfoCollector" +#~ msgstr "LocaleInfoCollectorの新しいインスタンス" + +# @param [String] member +#~ msgid "the name of the struct member whose return type we need" +#~ msgstr "必要とする型を返す構造体memberの名前" + +# @param [Boolean] load_order_error +#~ msgid "" +#~ "whether or not to raise {Parser::LoadOrderError}\n" +#~ "when a file has unresolved references that need to be parsed first.\n" +#~ "If these errors are raised, the processor will attempt to load all\n" +#~ "other files before continuing to parse the file." +#~ msgstr "" +#~ "ファイルが最初に解析される必要がある参照を未解決の時、\n" +#~ "{Parser::LoadOrderError}の例外を上げるかどうか\n" +#~ "もしこれらのエラーが上げられる場合、\n" +#~ "プロセッサーは、ファイルの解析を継続する前に\n" +#~ "全ての他のファイルをロードをする。" + +# @param [Symbol] parser_type +#~ msgid "" +#~ "the parser type (:ruby, :ruby18, :c) from\n" +#~ "the parser. Used to select the handler (since handlers are specific\n" +#~ "to a parser type)." +#~ msgstr "" +#~ "パーサーが提供する,パーサータイプ(:ruby, :ruby18, :c)\n" +#~ "利用するハンドラーを選択するには、(ハンドラーがパーサータイプを指定す" +#~ "る。)\n" +#~ "the parser. Used to select the handler (since handlers are specific to a " +#~ "parser type)." + +# @param [OpenStruct] globals +#~ msgid "" +#~ "the object holding all state during the\n" +#~ "post processing stage" +#~ msgstr "後処理段階の間に全ての状態を保持するオブジェクト" + +# @param [String] file +#~ msgid "" +#~ "the name of the file that is being processed.\n" +#~ "uses '(stdin)' if file is nil." +#~ msgstr "" +#~ "処理されるファイルの名前、\n" +#~ "ファイルがnilの場合、'(stdin)'を使う。" + +# @param [Symbol] +#~ msgid "tag|param|parser_type" +#~ msgstr "parser_type" + +# @return [Boolean] +#~ msgid "whether or not {Parser::LoadOrderError} is raised" +#~ msgstr "{Parser::LoadOrderError}の例外を上げるかどうか" + +# @param [CodeObjects::Base] object +#~ msgid "the object to expand the macro on" +#~ msgstr "拡張するオブジェクトのマクロ" + +# @param [CodeObjects::MacroObject] macro +#~ msgid "the macro object to expand" +#~ msgstr "マクロによって拡張する為のオブジェクト" + +# @return [CodeObjects::MacroObject] +#~ msgid "the newly created macro" +#~ msgstr "新たに作成されたマクロ" + +# @param [Docstring, CodeObjects::Base] object_or_docstring +#~ msgid "" +#~ "the docstring\n" +#~ "or it's object with which to check for a macro" +#~ msgstr "マクロのチェックの為のdocstringやオブジェクト" + +# @return [nil] +#~ msgid "if the docstring does not create or reference a macro" +#~ msgstr "docstringが作られていない場合やマクロの参照がない場合" + +# YARD::Handlers::Base#find_or_create_macro +#~ msgid "" +#~ "Attempts to find or create a macro if a +@macro+ tag is found in the\n" +#~ "docstring (or the object's docstring)." +#~ msgstr "" +#~ "+@macro+ タグがdocstring(やオブジェクトのdocstring)の中で見つかった場" +#~ "合、\n" +#~ "マクロタグがあるか探し、マクロ作成を試みる。" + +# @return [String] +#~ msgid "the localized docstring." +#~ msgstr "docstringを局所化する" + +# YARD::Docstring#document +#~ msgid "" +#~ "Gets a localized docstring. Use String#to_s to get non\n" +#~ "localized docstring." +#~ msgstr "" +#~ "局所化されるdocstringを取得する。\n" +#~ "局所化されないdocstringを取得するには、\n" +#~ "String#to_sメソッドを使う。" + +# @param [Array] call_params +#~ msgid "" +#~ "the method name and parameters\n" +#~ "to the method call. These arguments will fill $0-N" +#~ msgstr "" +#~ "メソッド名やメソッド呼び出しの為のパラメータ。\n" +#~ "これらの引数には、$0-Nを入れる。" + +# @param [String] full_source +#~ msgid "" +#~ "the full source line (excluding block) \n" +#~ "interpolated as $*" +#~ msgstr "$*のように、補完される完全なソースの行(blockを除外する)" + +# @return [String] +#~ msgid "the expanded macro data" +#~ msgstr "拡張されたマクロデータ" + +# @param [String] block_source +#~ msgid "" +#~ "Currently unused. Will support \n" +#~ "interpolating the block data as a variable." +#~ msgstr "" +#~ "実際には、使われない。\n" +#~ "変数のように補完するブロックデータをサポートする。" + +# @return [Boolean] +#~ msgid "whether to report missing translations." +#~ msgstr "見つからない変換をレポートするかどうか" + +# @return [String] +#~ msgid "a language for output document." +#~ msgstr "ドキュメント出力用の言語" + +# @return [Array] +#~ msgid "the default list of locale path." +#~ msgstr "デフォルトのロケールパスのリスト" + +# @return [Array] +#~ msgid "a list of locale path." +#~ msgstr "ロケールパスのリスト" + +#~ msgid "" +#~ " 3. Define custom javascript to load the search fields and the keyboard " +#~ "shortcuts." +#~ msgstr "" +#~ " 3. 検索フィールドとキーボードショートカットをロードするカスタム" +#~ "javascriptを定義する。" + +#~ msgid "" +#~ "The interpolation syntax is similar to Ruby's regular expression variable " +#~ "syntax.\n" +#~ "It uses $1, $2, $3, ..., referring to the Nth argument in the method " +#~ "call. Using\n" +#~ "the above property example, $1 would be 'title', and $2 would be " +#~ "'String'.\n" +#~ "$0 is a special variable that refers to the method call itself, in this " +#~ "case\n" +#~ "'property'. Finally, there is a $& variable which refers to the full " +#~ "line,\n" +#~ "or 'property :title, String'." +#~ msgstr "" +#~ "補間の構文法は、Rubyの正規表現の変数の構文の表現に似ている。\n" +#~ "メソッドコールでのN番目の引数かを参照して、\n" +#~ "$1,$2,$3・・・を使う。\n" +#~ "上記の例で言うと、$1は'title'、$2は'String'となる。\n" +#~ "$0は、このケースのプロパティでは、\n" +#~ "メソッドコール自体を参照する特別な変数である。\n" +#~ "最後に、$&変数というのがある。\n" +#~ "これは全ての行あるいは'property :title, String'.を参照する。" + +#~ msgid "### Macro Variable Interpolation Syntax" +#~ msgstr "### マクロの変数補間構文" + +#~ msgid "" +#~ "If you cannot declare the macro on the actual method declaration, you " +#~ "can\n" +#~ "arbitrarily attach the macro to any method call. Suppose we only had the\n" +#~ "Post class in our codebase, we could add the macro to the first usage of\n" +#~ "the `property` call:" +#~ msgstr "" +#~ "もし、元々のクラスのメソッドでマクロを宣言してなくても、\n" +#~ "他のメソッド呼び出しでマクロを付けることができる。\n" +#~ "自身のコードベースの中でしかPostクラスを持っていないとすれば、\n" +#~ "`property`呼び出しで初めて使う時にマクロをつけることができる。" + +#~ msgid "" +#~ "Macros can be created on class level methods (or class level method " +#~ "calls) in \n" +#~ "order to implicitly expand a macro whenever that method is subsequently " +#~ "called \n" +#~ "in a class, or any class that mixes in or inherits the method. These " +#~ "macros\n" +#~ "are called \"attached\" and are declared with the `[attach]` flag. For " +#~ "instance, \n" +#~ "a library that uses a class level method call `property` in its codebase " +#~ "can \n" +#~ "document these declarations in any future call like so:" +#~ msgstr "" +#~ "マクロはメソッドがクラスの中で呼び出された後で、\n" +#~ "何らかのマクロの拡張を実装する時にコードの中の\n" +#~ "クラスレベルメソッド上に作成される。(または、クラスレベルメソッド呼び出" +#~ "し)\n" +#~ "これらのマクロは`[attach]`フラグを用いる。\n" +#~ "これが宣言される事によってマクロが追加される。\n" +#~ "例えば、ライブラリーが`property`クラスレベルメソッド呼び出しを利用するに" +#~ "は、\n" +#~ "以下の様に、将来呼び出せるように宣言を記述できる。" + +#~ msgid "" +#~ "In the above case, the macro 'macro_name' will always show both lines of " +#~ "text\n" +#~ "when expanded on other objects." +#~ msgstr "" +#~ "上記のケースだと、 'macro_name' というマクロは他のオブジェクトで\n" +#~ "展開すると、テキストの両方の行を表示する。" + +#~ msgid "" +#~ "If there is no indented macro data, the entire docstring is saved as the\n" +#~ "macro data. For instance," +#~ msgstr "" +#~ "インデントされたマクロのデータがないならば、\n" +#~ "docstring全体はマクロのデータとして保存される。\n" +#~ "例えば、" + +#~ msgid "" +#~ "You can therefore keep portions of docstrings local to objects even when\n" +#~ "creating a macro, by indenting the portion of the data that should be " +#~ "re-\n" +#~ "expanded, and listing the local docstring data above or below." +#~ msgstr "" +#~ "マクロを作った時でも、docstringの一部をマクロとは別にしておくことができ" +#~ "る。\n" +#~ "それには、再度展開されるべきマクロデータの一部をインデントして、なおか" +#~ "つ、\n" +#~ "上か下にローカルのdocstringのデータを列挙する。" + +#~ msgid "" +#~ "In the above case, \"The macro data is here.\" is the only portion that " +#~ "will be\n" +#~ "re-used if the macro is called again on another object. However, for the " +#~ "case\n" +#~ "of the above method, both the macro data and the local docstring will be\n" +#~ "applied to the method, creating the docstring:" +#~ msgstr "" +#~ "上記のケースで、\"The macro data is here.\"はマクロが、\n" +#~ "別のオブジェクトで呼ばれたら再利用されるものの一部である。\n" +#~ "だが、ここで使われないというわけではなく、\n" +#~ "上記のケースでは、マクロデータと他のdocstring(This data is~)はメソッドに適" +#~ "用され\n" +#~ "docstringを生成する。" + +#~ msgid "" +#~ "If a macro tag has an indented body of macro data (shown below), it will " +#~ "be\n" +#~ "the only portion of the docstring saved for re-use." +#~ msgstr "" +#~ "マクロのタグが以下のようなインデントされたマクロデータの構造を有しているな" +#~ "らば、\n" +#~ "それは再利用のために保存されたdocstringの一部分にすぎない。\n" + +#~ msgid "### Indenting the Macro Data" +#~ msgstr "### マクロのデータをインデントする。" + +#~ msgid "" +#~ "Note that the name is never optional. Even if the macro is never re-" +#~ "used,\n" +#~ "it must be named." +#~ msgstr "" +#~ "次の事に留意する。\n" +#~ "名前は必ずつける。\n" +#~ "(マクロが再利用されていない時でも、必ず命名されなければならない。)" + +#~ msgid "" +#~ "Any time 'foo' is called in the class scope of an inheriting class, the " +#~ "macro\n" +#~ "will automatically expand on that method call (potentially creating a " +#~ "new\n" +#~ "method object). Attaching macros is discussed below." +#~ msgstr "" +#~ "上のfooは常時、継承クラスのクラススコープの中に呼び出される。\n" +#~ "そしてマクロはメソッド呼び出しで自動的に展開する。\n" +#~ "(暗黙の内に新しいメソッドオブジェクトを生成する。)\n" +#~ "マクロを追加する方法は、以降で説明される。" + +#~ msgid "" +#~ "You can also \"attach\" a macro to a method if it is in the class scope. " +#~ "In\n" +#~ "this case, you do not need to also provide the 'new' flag, using " +#~ "'attach'\n" +#~ "is sufficient:" +#~ msgstr "" +#~ "クラスのスコープの中にあれば、\n" +#~ "メソッドにマクロを\"attach\"できる。\n" +#~ "この場合、\"new\"フラグを提供する必要はなく、\n" +#~ "以下の様に\"attach\"で十分である。\n" + +#~ msgid "Or:" +#~ msgstr "または:" + +#~ msgid "" +#~ "For instance, creating a new macro might look like (see the section on\n" +#~ "interpolation below for a description of the `$2` syntax):" +#~ msgstr "" +#~ "例えば、新しいマクロを作ることは以下のようになる。\n" +#~ "(`$2`構文の説明は補間のセクション参照)" + +#~ msgid "" +#~ " 1. there are interpolation variables (`$1`, `$2`, `${3-5}`, etc.) in " +#~ "the\n" +#~ " docstring, or,\n" +#~ " 2. the macro is specified with the `[new]` or `[attached]` flag." +#~ msgstr "" +#~ " 1. docstringには補間変数(`$1`,`$2`,`$3-5`,etc.)がある。\n" +#~ " (ここでいう補間変数とは、それを使用した場所と補間元とを置換するとい" +#~ "う意味)\n" +#~ " 2. あるいは、マクロは[new]か[attached]のフラグで指定されている。\n" + +#~ msgid "If the macro does not already exist, it will be created if:" +#~ msgstr "マクロがまだ存在しない場合で、次の条件の時はマクロが生成される。" + +#~ msgid "" +#~ "In the above example, both attributes `foo` and `bar` will get the " +#~ "docstring\n" +#~ "that includes a return tag \"the attribute as a String\". It would be " +#~ "equivalent\n" +#~ "to writing the following:" +#~ msgstr "" +#~ "上記の例では、fooとbarの2つの属性ともリターンタグの\n" +#~ "\"the attribute as a String\"を含んだdocstringを取得している。\n" +#~ "次のように書いた場合と同じである。" + +#~ msgid "" +#~ "Macros enable the documenter to write repetitive documentation once and " +#~ "then\n" +#~ "re-apply it to other objects. Macros are defined on docstrings using the\n" +#~ "`@macro` tag. The same `@macro` tag is used to expand them. The " +#~ "following\n" +#~ "is an example of a simple macro declaration and expansion:" +#~ msgstr "" +#~ "マクロを使うと一度書いたドキュメントを、\n" +#~ "他のオブジェクトで再利用できる。\n" +#~ "マクロはdocstringsで@macroタグを使って定義される。\n" +#~ "同じ名前の@macroタグは展開するために使われる。\n" +#~ "以下は、単純なマクロの宣言と展開の例である。" + +#~ msgid "## Macros" +#~ msgstr "## マクロ" + +#~ msgid "" +#~ "Reference tags are represented by the {YARD::Tags::RefTag} class and are " +#~ "created\n" +#~ "directly during parsing by {YARD::Docstring}." +#~ msgstr "" +#~ "リファレンスタグは、{YARD::Tags::RefTag}クラスによって表わされ、\n" +#~ "{YARD::Docstring}を解析する間に作られる。\n" + +#~ msgid "" +#~ "Because the UserHelper module methods delegate directly to `User.new`, " +#~ "copying\n" +#~ "the documentation details would be unmaintainable. In this case, the (see " +#~ "METHODNAME)\n" +#~ "syntax is used to reference the tags from the User constructor to the " +#~ "helper methods.\n" +#~ "For the first method, all `@param` tags are referenced in one shot, but " +#~ "the second\n" +#~ "method only references one of the tags by adding `username` before the " +#~ "reference." +#~ msgstr "" +#~ "何故なら、上のUserHelperモジュールのメソッドは直接`User.new`へ委譲するの" +#~ "で、\n" +#~ "ドキュメントの詳細をコピーすることはできない。\n" +#~ "このような場合、 (see METHODNAME) 構文はユーザーコンストラクターから\n" +#~ "ヘルパーメソッドまでのタグを参照するために利用される。\n" +#~ "最初のメソッドは、すべての@paramタグを一発で参照する。\n" +#~ "しかし、次のメソッドはリファレンスの前にユーザーネームが\n" +#~ "加えられたタグのみを参照する。" + +#~ msgid "" +#~ "Although attempt is made in YARD to leave as many of the syntax details " +#~ "as\n" +#~ "possible to the factory provider, there is a special tag syntax for " +#~ "referencing\n" +#~ "tags created in other objects so that they can be reused again. This is " +#~ "common\n" +#~ "when an object describes a return type or parameters that are passed " +#~ "through to\n" +#~ "other methods. In such a case, it is more manageable to use the reference " +#~ "tag\n" +#~ "syntax. Consider the following example:" +#~ msgstr "" +#~ "ファクトリーの提供者によってYARDの中では沢山の構文の詳細を残すように試みら" +#~ "れたけれども、\n" +#~ "再利用できるように、他のオブジェクトの中に作成されたタグを参照する特別なタ" +#~ "グ構文がある。\n" +#~ "これは、オブジェクトが返す型や他のオブジェクトの為に解析されるパラメータ" +#~ "を\n" +#~ "説明する時に一般的に用いられる。\n" +#~ "このような場合には参照タグ構文を使うとより扱いやすい、\n" +#~ "以下の例を考えてみる。\n" + +#~ msgid "## Reference Tags" +#~ msgstr "## 参照タグ" + +#~ msgid " @yieldreturn [optional, types, ...] description" +#~ msgstr "" +#~ " !!!plain\n" +#~ " @yieldreturn [型(省略可能)...] 説明" + +#~ msgid " * `@yieldreturn`: Defines return type of a block" +#~ msgstr " * `@yieldreturn`: ブロックのリターンタイプを定義する。" + +#~ msgid " @yieldparam [optional, types, ...] argname description" +#~ msgstr "" +#~ " !!!plain\n" +#~ " @yieldparam [型(省略可能)...] 引数名 説明" + +#~ msgid " * `@yieldparam`: Defines parameters yielded by a block" +#~ msgstr " * `@yieldparam`: ブロックでyieldされたパラメータを定義する。" + +#~ msgid "" +#~ " # for block {|a, b, c| ... }\n" +#~ " @yield [a, b, c] Description of block" +#~ msgstr "" +#~ " !!!plain\n" +#~ " # for block {|a, b, c| ... }\n" +#~ " @yield [a, b, c] ブロックの説明" + +#~ msgid "" +#~ " * `@yield`: Describes the block. Use types to list the parameter\n" +#~ " names the block yields." +#~ msgstr " * `@yield`: パラメータを列挙してブロックを説明する。" + +#~ msgid " * `@todo`: Marks a TODO note in the object being documented" +#~ msgstr "" +#~ " * `@todo`: ドキュメントを作成しているオブジェクトの中に、\n" +#~ " TODOをマークする。" + +#~ msgid " @return [optional, types, ...] description" +#~ msgstr "" +#~ " !!!plain\n" +#~ " @return [型(省略可能)...] 説明" + +#~ msgid " * `@return`: Describes return value of method" +#~ msgstr " * `@return`: メソッドの戻り値を説明する。" + +#~ msgid " @raise [ExceptionClass] description" +#~ msgstr "" +#~ " !!!plain\n" +#~ " @raise [ExceptionClass] 説明" + +#~ msgid " * `@raise`: Describes an Exception that a method may throw" +#~ msgstr " * `@raise`: メソッドが投げる例外を記述する。" + +#~ msgid "" +#~ " * `@private`: Defines an object as private. This exists for classes,\n" +#~ " modules and constants that do not obey Ruby's visibility rules. For\n" +#~ " instance, an inner class might be considered \"private\", though " +#~ "Ruby\n" +#~ " would make no such distinction. By declaring the @private tag, the\n" +#~ " class can be hidden from documentation by using the `--no-private`\n" +#~ " command-line switch to yardoc (see {file:README.md})." +#~ msgstr "" +#~ " * `@private`: privateとしてオブジェクトを定義する。\n" +#~ "これはRubyの可視性に従わないクラス、モジュール、定数のために存在する。\n" +#~ "たとえば、Rubyはそのような区分はしないだろうが,内部クラスは\"private\"だと" +#~ "考える場合、\n" +#~ "yardoc用のコマンド`--no-private`({file:README.md} 参照)を使うことによっ" +#~ "て\n" +#~ "@privateタグを宣言すると、クラスをドキュメンテーションから隠すことができ" +#~ "る。" + +#~ msgid " @param [optional, types, ...] argname description" +#~ msgstr "" +#~ " !!!plain\n" +#~ " @param [型(省略可能)...] 引数名 説明" + +#~ msgid " * `@param`: Defines method parameters" +#~ msgstr " * `@param`: メソッドのパラメータを定義する。" + +#~ msgid "" +#~ " * `@note`: Creates an emphasized note for the users to read about the\n" +#~ " object." +#~ msgstr "" +#~ " * `@note`: ユーザがオブジェクトのことを読んで知るために、\n" +#~ " 強調された注意書きを作る。\n" + +#~ msgid "" +#~ " * `@method`: Recognizes a DSL class method as a method with the given " +#~ "name\n" +#~ " and optional signature. Only used with DSL methods." +#~ msgstr "" +#~ " * `@method`: DSLクラスメソッドを名前と省略可能な用法がついたメソッドとし" +#~ "て認識する。DSLメソッドと一緒の時だけ使われる。" + +#~ msgid "" +#~ " @macro [new|attached] macro_name\n" +#~ " The macro contents to expand" +#~ msgstr "" +#~ " !!!plain\n" +#~ " @macro [new,又は,attached] マクロ名\n" +#~ " 展開する内容をここ以降に書く" + +#~ msgid "" +#~ " * `@macro`: Registers or expands a new macro. See the [Macros]" +#~ "(#macros)\n" +#~ " section for more details. Note that the name parameter is never " +#~ "optional." +#~ msgstr "" +#~ " * `@macro`: 新しいマクロを登録または拡張する。\n" +#~ " 詳細は [Macros](#macros) 参照。\n" +#~ " NAMEというパラメータは省略できないことに注意する。" + +#~ msgid "" +#~ " @deprecated Describe the reason or provide alt. references here" +#~ msgstr "" +#~ " !!!plain\n" +#~ " @deprecated 廃止される理由や代替の提供についての参照をここに書く。" + +#~ msgid "" +#~ " * `@deprecated`: Marks a method/class as deprecated with an optional\n" +#~ " reason." +#~ msgstr "" +#~ " * `@deprecated`: 廃止予定のメソッド,クラスをマークする。任意で理由を書く" + +#~ msgid " @author Full Name" +#~ msgstr "" +#~ " !!!plain\n" +#~ " @author フルネーム" + +#~ msgid " * `@author`: List the author(s) of a class/method" +#~ msgstr " * `@author`: クラス,メソッドの作者リスト" + +#~ msgid " @attribute [rw|r|w] NAME" +#~ msgstr "" +#~ " !!!plain\n" +#~ " @attribute [rw|r|w] 名前" + +#~ msgid "" +#~ " * `@attribute`: Recognizes a DSL class method as an attribute with the " +#~ "given\n" +#~ " name. Also accepts the r, w, or rw flag to signify that the attribute " +#~ "is \n" +#~ " readonly, writeonly, or readwrite (default). Only used with DSL " +#~ "methods." +#~ msgstr "" +#~ " * `@attribute`: DSLクラスメソッドを指定された名前を持つ属性として認識す" +#~ "る。\n" +#~ " 又,r,w,rwフラグは読み込み専用,書込み専用,読書き両用(デフォルト)とな" +#~ "る。\n" +#~ " DSLのメソッドだけで使用される。\n" + +#~ msgid " @attr_writer [Types] name description of writeonly attribute" +#~ msgstr "" +#~ " !!!plain\n" +#~ " @attr_writer [型...] 名前 書込み専用属性の説明" + +#~ msgid "" +#~ " * `@attr_writer`: Declares a writeonly attribute from the docstring of " +#~ "class.\n" +#~ " Meant to be used on Struct classes only (classes that inherit " +#~ "Struct). See `@attr`." +#~ msgstr "" +#~ " * `@attr_writer`: クラスのdocstringから書き込み専用属性と宣言する\n" +#~ " Structクラスだけで使用できる。(Structクラスを継承するクラス)`@attr`参" +#~ "照。" + +#~ msgid "" +#~ " @attr_reader [Types] name description of a readonly attribute" +#~ msgstr "" +#~ " !!!plain\n" +#~ " @attr_reader [型...] 名前 読取り専用属性の説明" + +#~ msgid "" +#~ " * `@attr_reader`: Declares a readonly attribute from the docstring of a " +#~ "class.\n" +#~ " Meant to be used on Struct classes only (classes that inherit " +#~ "Struct). See `@attr`." +#~ msgstr "" +#~ " * `@attr_reader`: クラスのdocstringから読み込み専用属性と宣言する。\n" +#~ " Structクラスだけで使用できる。(Structクラスを継承するクラス)`@attr`参" +#~ "照。" + +#~ msgid "" +#~ " @attr [Types] attribute_name a full description of the attribute" +#~ msgstr "" +#~ " !!!plain\n" +#~ " @attr [型...] 属性名 属性の全ての説明" + +#~ msgid "" +#~ " * `@attr`: Declares an attribute from the docstring of a class. Meant " +#~ "to be\n" +#~ " used on Struct classes only (classes that inherit Struct)." +#~ msgstr "" +#~ " * `@attr`: クラスのdocstringから属性を宣言する。\n" +#~ " Structクラスだけで使用できる。(Structクラスを継承するクラス)" + +#~ msgid " @api freeform text" +#~ msgstr "" +#~ " !!!plain\n" +#~ " @api フリーフォームテキスト" + +#~ msgid "YARD supplies the following built-in tags:" +#~ msgstr "YARDは、以下のビルトインタグを用意している。" + +#~ msgid "## List of Available Tags" +#~ msgstr "## 利用可能なタグのリスト" + +#~ msgid "As mentioned, types are optional, so the following is also valid:" +#~ msgstr "型は省略可能で, 以下は同様に有効である" + +#~ msgid "" +#~ "Note that \"url\" in the above example is the key name. The syntax is of " +#~ "the form:" +#~ msgstr "" +#~ "次の事に留意する。\n" +#~ "上の例の中の\"url\"は、キー名である。\n" +#~ "この構文は次の形式になる。" + +#~ msgid "" +#~ "A special case of the above data with optional type information is the " +#~ "case\n" +#~ "of tags like `@param`, where the data is further associated with a key. " +#~ "In\n" +#~ "the case of `@param` the key is an argument name in the method. The " +#~ "following\n" +#~ "shows how this can be used:" +#~ msgstr "" +#~ "省略可能な型情報を用いた上のデータの様な特殊なケースは、\n" +#~ "データがキーを用い更に関連付けられる場合、\n" +#~ "@paramのようなタグのケースとなる。\n" +#~ "`@param`キーのケースの場合は、メソッドの中の名前は引数となる。\n" +#~ "次のような用法で使われる。" + +#~ msgid "### Data With Name and Optional Type Information" +#~ msgstr "### 名前と任意の型情報のついたデータ" + +#~ msgid "" +#~ "This syntax optionally contains type information to be associated with " +#~ "the\n" +#~ "tag. Type information is specified as a freeform list of Ruby types, " +#~ "duck\n" +#~ "types or literal values. The following is a valid tag with type " +#~ "information:" +#~ msgstr "" +#~ "この構文は、省略できるタグに関連付けられる型情報が含まれる。\n" +#~ "型情報は、Rubyの型かダックタイプやリテラル値の\n" +#~ "フリーフォームのリストとして指定される。\n" +#~ "以下は、型情報を持つ有効なタグとなる。" + +#~ msgid "### Data With Optional Type Information" +#~ msgstr "### 任意の型情報がついたデータ" + +#~ msgid "" +#~ "Occasionally a freeform tag may reserve the first line for a title (or " +#~ "some\n" +#~ "other associative identifier) and treat only the subsequent indented " +#~ "lines as\n" +#~ "the tag data. Two examples are the `@example` and `@overload` tags. In " +#~ "the case\n" +#~ "of `@example` the first line is a title, and in the case of `@overload` " +#~ "the\n" +#~ "first line is the method signature for the overload. Here is an example " +#~ "of both:" +#~ msgstr "" +#~ "いくつかのフリーフォームタグは最初の行をタイトル(又は,他の関連する識別子)" +#~ "にする。\n" +#~ "そして、それに続くインデントされた行をタグデータとして処理する。\n" +#~ "2つの例は@exampleと@overloadタグのケースで、\n" +#~ "@exampleの場合は最初の行はタイトルとなる。\n" +#~ "@overloadの場合は最初の行はメソッドの用法となる。\n" +#~ "ここで両方の例を次に示す。" + +#~ msgid "### Freeform Data With Title" +#~ msgstr "### タイトルを用いたフリーフォームデータ" + +#~ msgid "" +#~ "This syntax has no special syntax, it is simply a tagname followed by " +#~ "any\n" +#~ "data." +#~ msgstr "" +#~ "この構文は特別な構文ではなく,\n" +#~ "何らかのデータに続いたタグ名があるだけとなる。" + +#~ msgid "### Freeform Data" +#~ msgstr "### フリーフォームデータ" + +#~ msgid "" +#~ "If a tag's data begins with `(see NAME)` it is considered a \"reference " +#~ "tag\".\n" +#~ "The syntax and semantics of a reference tag are discussed in the section " +#~ "below\n" +#~ "titled \"[Reference Tags](#reftags)\"" +#~ msgstr "" +#~ "タグのデータが、`(see NAME)`で始まる場合、`それは、`参照タグ`とみなされ" +#~ "る。\n" +#~ "`参照タグ`の構文と文法は、\"[Reference Tags](#reftags)\"以下のセクションで" +#~ "説明されている。" + +#~ msgid "" +#~ "In the above example, \"@tagname\" will have the text *\"This is tag data" +#~ "\"*." +#~ msgstr "" +#~ "上記の例で、\"@tagname\"内の情報は\"this is tag data\"となる。\n" +#~ "(but this is not は含まない)" + +#~ msgid "" +#~ "Tags begin with \"@tagname\" at the start of a comment line. Tags can " +#~ "span multiple\n" +#~ "lines if the subsequent lines are indented by more than one space. The " +#~ "following\n" +#~ "syntax is valid:" +#~ msgstr "" +#~ "タグは、コメント行の冒頭にある\"@tagname\"から始まる。\n" +#~ "後続の行がスペースでインデントされている場合は、\n" +#~ "複数行にまたがることができる。\n" +#~ "次の構文は有効となる。" + +#~ msgid "" +#~ "Tags are the best way to add arbitrary metadata when documenting an " +#~ "object in a\n" +#~ "way to access it later without having to parse the entire comment string. " +#~ "The\n" +#~ "rest of the document will describe the tag syntax, how to access the " +#~ "tag \n" +#~ "metadata and how to extend YARD to support custom tags or override " +#~ "existing tags." +#~ msgstr "" +#~ "タグはオブジェクトをドキュメント化する際、\n" +#~ "コメント文字列全てを解析せずにアクセスできるように、\n" +#~ "メタデータを追加する最善の方法となる。\n" +#~ "このドキュメントの残りの部分は、\n" +#~ "タグのメタデータにアクセスする方法\n" +#~ "カスタムタグをサポートしたり、既存のタグを上書きしたりするために\n" +#~ "YARDを拡張する方法といった、タグの構文の説明になる。" + +#~ msgid "" +#~ "The above example adds metadata under the name `tagname` to the Foo class " +#~ "object." +#~ msgstr "" +#~ "上記の例では、\n" +#~ "Fooクラスオブジェクトの為に`@tagname`以降にメタデータを追加する。" + +#~ msgid "" +#~ "Tags represent the metadata that can be added to documentation through " +#~ "the `@tag`\n" +#~ "style syntax:" +#~ msgstr "" +#~ "タグとは以下の様に@tag形式の構文を介して、\n" +#~ "ドキュメントに追加できるメタデータを表す。" + +#~ msgid "" +#~ "* **Docstring (Documentation String)**: Comments associated with a code " +#~ "object\n" +#~ " used for documentation purposes." +#~ msgstr "" +#~ "* **Docstring (Documentation String)**: コードオブジェクトに関連するコメン" +#~ "ト,\n" +#~ "用途を記述する為に利用される。" + +#~ msgid "" +#~ "* **Domain Specific Language (DSL)**: In the context of Ruby, a DSL is a " +#~ "languge\n" +#~ " optimized for a specific domain (problem) but represented using Ruby " +#~ "syntax." +#~ msgstr "" +#~ "* **Domain Specific Language (DSL)**: Ruby関連の用語で、\n" +#~ "DSLとは、特定のドメイン(問題)用に最適化された言語である。\n" +#~ "しかし、内容自体はRuby構文によって表される。" + +#~ msgid "" +#~ "* **Code Object**: Any explicitly defined Ruby source that describes a " +#~ "feature\n" +#~ " of the code. By default, this refers to classes, modules, methods, " +#~ "constants\n" +#~ " and class variables, though it can be extended to refer to custom " +#~ "functionality\n" +#~ " defined by a DSL (like a spec, for instance)." +#~ msgstr "" +#~ "* **Code Object**: コードの機能を説明するRubyソースを明確に定義される。\n" +#~ "デフォルトでこれはクラス,モジュール,メソッド,定数,クラス変数を参照する。\n" +#~ "それは、DSLによって定義されるカスタム機能を参照する為に拡張できると考え" +#~ "る。\n" +#~ "(例えば、rspecのように)" + +#~ msgid "# Glossary" +#~ msgstr "# 用語集" + +#~ msgid "" +#~ "Usage\n" +#~ "-----" +#~ msgstr "" +#~ "使用法\n" +#~ "-----" + +#~ msgid "" +#~ "Installing\n" +#~ "----------" +#~ msgstr "" +#~ "インストール\n" +#~ "----------" diff --git a/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/samus.json b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/samus.json new file mode 100644 index 000000000..2bfcdcb17 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/samus.json @@ -0,0 +1,49 @@ +{ + "actions": [ + { + "action": "fs-sedfiles", + "files": [ + "lib/*/version.rb" + ], + "arguments": { + "search": "VERSION = ['\"](.+?)['\"]", + "replace": "VERSION = '$version'" + } + }, + { + "action": "chmod-files", + "files": [ + "**/*,644", + "bin/*,755" + ] + }, + { + "action": "changelog-rotate", + "files": [ + "CHANGELOG.md" + ], + "arguments": { + "title_format": "$version - %B %-d$day_nth, %Y" + } + }, + { + "action": "git-commit", + "files": [ + "CHANGELOG.md", + "lib/*/version.rb" + ] + }, + { + "action": "git-merge", + "arguments": { + "branch": "main" + } + }, + { + "action": "ruby-bundle" + }, + { + "action": "rake-task" + } + ] +} diff --git a/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/tasks/prepare_tag.rake b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/tasks/prepare_tag.rake new file mode 100644 index 000000000..85ebb5fd3 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/tasks/prepare_tag.rake @@ -0,0 +1,45 @@ +require 'json' +require 'tempfile' + +namespace :release do + desc 'Updates repository and tags VERSION=X.Y.Z' + task :tag do + restore_file = Tempfile.new + restore_file.close + at_exit { restore_file.unlink } + + version = ENV['VERSION'] + build_path = File.expand_path(File.join(`gem which samus`.strip, '..', '..', 'commands', 'build')) + samus_contents = File.read(File.join(__dir__, '..', 'samus.json')) + samus_json = JSON.parse(samus_contents.gsub('$version', version)) + + samus_json['actions'].each do |action| + env = { + '_VERSION' => version, + '__ORIG_BRANCH' => `git rev-parse --abbrev-ref HEAD`.strip, + '__RESTORE_FILE' => restore_file.path, + } + (action['arguments'] || {}).each {|k, v| env["_#{k.upcase}"] = v } + cmd = [File.join(build_path, action['action']), *action['files']] + puts "[C] #{action['action']} #{(action['files'] || []).join(' ')}" + output = "" + IO.popen(env, cmd) {|io| output = io.read } + status = $? + unless status.success? + puts "[F] Last command failed with: #{status.to_i}" + puts output + exit(status.to_i) + end + end + + puts "" + puts "Tag v#{version} created. To publish, type the following:" + puts "" + puts " bundle exec rake release:push VERSION=#{version}" + end + + desc 'Pushes the main branch and tag for VERSION=X.Y.Z' + task :push do + sh "git push main v#{ENV['VERSION']}" + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/tasks/update_error_map.rake b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/tasks/update_error_map.rake new file mode 100644 index 000000000..547d19584 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/tasks/update_error_map.rake @@ -0,0 +1,53 @@ +# frozen_string_literal: true + +# Script to generate the Error class name map in: +# lib/yard/handlers/c/base.rb + +require 'open-uri' +require 'stringio' + +desc 'Update the error class names map' +task :update_error_map do + + ERROR_C_URL = 'https://raw.githubusercontent.com/ruby/ruby/master/error.c' + + INIT_MATCH = /void\s+Init_Exception\(void\)\s*\{(.+?)^\}/m + NAME_MATCH = /(\w+)\s*=\s*rb_define_class\("([^"]+)"/ + + $stderr.puts "Downloading #{ERROR_C_URL} ..." + content = open(ERROR_C_URL) { |io| io.read } + + $stderr.puts "Extracting class names ..." + init_source = content.match(INIT_MATCH).captures.first + map = init_source.scan(NAME_MATCH).sort_by { |key, value| key } + + $stderr.puts "Generating new lookup table ..." + indent = ' ' * 4 + source = StringIO.new + source.puts "#{indent}ERROR_CLASS_NAMES = {" + map.each do |variable, name| + source.puts "#{indent} '#{variable}' => '#{name}'," + end + source.puts "#{indent}}" + + $stderr.puts source.string + + $stderr.puts "Patching 'lib/yard/handlers/c/base.rb' ..." + CLASS_NAME_MAP_MATCH = /^\s+ERROR_CLASS_NAMES = {[^}]+}/ + + PROJECT_PATH = File.expand_path('..', __dir__) + C_BASE_HANDLER = File.join(PROJECT_PATH, 'lib/yard/handlers/c/base.rb') + + File.open(C_BASE_HANDLER, 'r+') { |file| + content = file.read + # .rstrip is added to avoid adding new empty lines due to the new lines + # added by `.puts` when building the string. + content.gsub!(CLASS_NAME_MAP_MATCH, source.string.rstrip) + file.rewind + file.truncate(0) + file.write(content) + } + + $stderr.puts "Done!" + +end diff --git a/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/templates/default/class/dot/setup.rb b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/templates/default/class/dot/setup.rb new file mode 100644 index 000000000..da92c4c72 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/templates/default/class/dot/setup.rb @@ -0,0 +1,7 @@ +# frozen_string_literal: true +include T('default/module/dot') + +def init + super + sections.push :superklass +end diff --git a/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/templates/default/class/dot/superklass.erb b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/templates/default/class/dot/superklass.erb new file mode 100644 index 000000000..becd82531 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/templates/default/class/dot/superklass.erb @@ -0,0 +1,3 @@ +<% if object.superclass.path != "Object" && object.superclass.path != "BasicObject" %> + <%= format_path object %> -> <%= format_path object.superclass %>; +<% end %> \ No newline at end of file diff --git a/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/templates/default/class/html/constructor_details.erb b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/templates/default/class/html/constructor_details.erb new file mode 100644 index 000000000..3f59a41bf --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/templates/default/class/html/constructor_details.erb @@ -0,0 +1,8 @@ +
    +

    Constructor Details

    + <% if @ctor.namespace != object %> +

    This class inherits a constructor from <%= linkify @ctor, @ctor.namespace.path %>

    + <% else %> + <%= yieldall :object => @ctor, :index => 0 %> + <% end %> +
    diff --git a/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/templates/default/class/html/setup.rb b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/templates/default/class/html/setup.rb new file mode 100644 index 000000000..f1f8fe117 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/templates/default/class/html/setup.rb @@ -0,0 +1,2 @@ +# frozen_string_literal: true +include T('default/module/html') diff --git a/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/templates/default/class/html/subclasses.erb b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/templates/default/class/html/subclasses.erb new file mode 100644 index 000000000..ea5748ad8 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/templates/default/class/html/subclasses.erb @@ -0,0 +1,4 @@ +
    +

    Direct Known Subclasses

    +

    <%= @subclasses.map {|name, child| linkify(child, name) }.join(", ") %>

    +
    diff --git a/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/templates/default/class/setup.rb b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/templates/default/class/setup.rb new file mode 100644 index 000000000..a4e0a71dc --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/templates/default/class/setup.rb @@ -0,0 +1,36 @@ +# frozen_string_literal: true +include T('default/module') + +def init + super + sections.place(:subclasses).before(:children) + sections.place(:constructor_details, [T('method_details')]).before(:methodmissing) +end + +def constructor_details + ctors = object.meths(:inherited => true, :included => true) + @ctor = ctors.find(&:constructor?) + return unless @ctor + return if prune_method_listing([@ctor]).empty? + erb(:constructor_details) +end + +def subclasses + return if object.path == "Object" # don't show subclasses for Object + unless globals.subclasses + globals.subclasses = {} + list = run_verifier Registry.all(:class) + list.each do |o| + (globals.subclasses[o.superclass.path] ||= []) << o if o.superclass + end + end + + @subclasses = globals.subclasses[object.path] + return if @subclasses.nil? || @subclasses.empty? + @subclasses = @subclasses.sort_by(&:path).map do |child| + name = child.path + name = object.relative_path(child) if object.namespace + [name, child] + end + erb(:subclasses) +end diff --git a/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/templates/default/class/text/setup.rb b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/templates/default/class/text/setup.rb new file mode 100644 index 000000000..b696807ed --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/templates/default/class/text/setup.rb @@ -0,0 +1,12 @@ +# frozen_string_literal: true +include T('default/module/text') + +def init + super + sections.place(:subclasses).before(:children) + sections.delete(:children) +end + +def format_object_title(object) + "Class: #{object.title} < #{object.superclass.title}" +end diff --git a/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/templates/default/class/text/subclasses.erb b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/templates/default/class/text/subclasses.erb new file mode 100644 index 000000000..0d6aac95b --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/templates/default/class/text/subclasses.erb @@ -0,0 +1,5 @@ +Direct Known Subclasses: +------------------------ + +<%= indent(wrap(@subclasses.map {|name, child| name }.join(", "))) %> + diff --git a/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/templates/default/constant/text/header.erb b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/templates/default/constant/text/header.erb new file mode 100644 index 000000000..1ec147793 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/templates/default/constant/text/header.erb @@ -0,0 +1,11 @@ +<%= title_align_right format_object_title(object) %> + + +<%= object.name %> = <%= object.value.size > 40 ? "\n\n" + indent(object.value) : object.value %> + + +<%= hr %> + +<%= yieldall %> + +<%= hr %> diff --git a/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/templates/default/constant/text/setup.rb b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/templates/default/constant/text/setup.rb new file mode 100644 index 000000000..cbf2f4992 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/templates/default/constant/text/setup.rb @@ -0,0 +1,4 @@ +# frozen_string_literal: true +def init + sections :header, [T('docstring')] +end diff --git a/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/templates/default/docstring/html/abstract.erb b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/templates/default/docstring/html/abstract.erb new file mode 100644 index 000000000..771d79767 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/templates/default/docstring/html/abstract.erb @@ -0,0 +1,4 @@ +
    + This <%= object.type %> is abstract. + <%= htmlify_line object.tag(:abstract).text %> +
    diff --git a/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/templates/default/docstring/html/deprecated.erb b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/templates/default/docstring/html/deprecated.erb new file mode 100644 index 000000000..2b3b31253 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/templates/default/docstring/html/deprecated.erb @@ -0,0 +1 @@ +
    Deprecated. <%= htmlify_line object.tag(:deprecated).text %>
    diff --git a/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/templates/default/docstring/html/index.erb b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/templates/default/docstring/html/index.erb new file mode 100644 index 000000000..997c2502c --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/templates/default/docstring/html/index.erb @@ -0,0 +1,5 @@ +
    +
    + <%= yieldall %> +
    +
    diff --git a/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/templates/default/docstring/html/note.erb b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/templates/default/docstring/html/note.erb new file mode 100644 index 000000000..88c9ffb1e --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/templates/default/docstring/html/note.erb @@ -0,0 +1,6 @@ +<% object.tags(:note).each do |tag| %> +
    + Note: + <%= htmlify_line tag.text %> +
    +<% end %> diff --git a/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/templates/default/docstring/html/private.erb b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/templates/default/docstring/html/private.erb new file mode 100644 index 000000000..e5996dd6e --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/templates/default/docstring/html/private.erb @@ -0,0 +1,4 @@ +

    + This <%= object.type %> is part of a private API. + You should avoid using this <%= object.type %> if possible, as it may be removed or be changed in the future. +

    diff --git a/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/templates/default/docstring/html/returns_void.erb b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/templates/default/docstring/html/returns_void.erb new file mode 100644 index 000000000..1c45c6ec3 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/templates/default/docstring/html/returns_void.erb @@ -0,0 +1 @@ +

    This method returns an undefined value.

    \ No newline at end of file diff --git a/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/templates/default/docstring/html/text.erb b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/templates/default/docstring/html/text.erb new file mode 100644 index 000000000..9bf38e86b --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/templates/default/docstring/html/text.erb @@ -0,0 +1 @@ +<%= htmlify(docstring_text) %> diff --git a/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/templates/default/docstring/html/todo.erb b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/templates/default/docstring/html/todo.erb new file mode 100644 index 000000000..8f91636fb --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/templates/default/docstring/html/todo.erb @@ -0,0 +1,6 @@ +<% object.tags(:todo).each do |tag| %> +
    + TODO: + <%= htmlify_line tag.text %> +
    +<% end %> diff --git a/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/templates/default/docstring/setup.rb b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/templates/default/docstring/setup.rb new file mode 100644 index 000000000..5ff09f866 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/templates/default/docstring/setup.rb @@ -0,0 +1,52 @@ +# frozen_string_literal: true +def init + return if object.docstring.blank? && !object.has_tag?(:api) + sections :index, [:private, :deprecated, :abstract, :todo, :note, :returns_void, :text], T('tags') +end + +def private + return unless object.has_tag?(:api) && object.tag(:api).text == 'private' + erb(:private) +end + +def abstract + return unless object.has_tag?(:abstract) + erb(:abstract) +end + +def deprecated + return unless object.has_tag?(:deprecated) + erb(:deprecated) +end + +def todo + return unless object.has_tag?(:todo) + erb(:todo) +end + +def note + return unless object.has_tag?(:note) + erb(:note) +end + +def returns_void + return unless object.type == :method + return if object.name == :initialize && object.scope == :instance + return unless object.tags(:return).size == 1 && object.tag(:return).types == ['void'] + erb(:returns_void) +end + +def docstring_text + text = "" + unless object.tags(:overload).size == 1 && object.docstring.empty? + text = object.docstring + end + + if text.strip.empty? && object.tags(:return).size == 1 && object.tag(:return).text + text = object.tag(:return).text.gsub(/\A([a-z])/, &:downcase) + text = "Returns #{text.sub(/\.\Z/, '')}." unless text.empty? || text =~ /^\s*return/i + text = text.gsub(/\A([a-z])/, &:upcase) + end + + text.strip +end diff --git a/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/templates/default/docstring/text/abstract.erb b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/templates/default/docstring/text/abstract.erb new file mode 100644 index 000000000..521d039e4 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/templates/default/docstring/text/abstract.erb @@ -0,0 +1,2 @@ +<%= indent(wrap("Abstract. #{object.tag(:abstract).text}")) %> + diff --git a/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/templates/default/docstring/text/deprecated.erb b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/templates/default/docstring/text/deprecated.erb new file mode 100644 index 000000000..659cbfa82 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/templates/default/docstring/text/deprecated.erb @@ -0,0 +1,2 @@ +<%= indent(wrap("Deprecated. #{object.tag(:deprecated).text}")) %> + diff --git a/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/templates/default/docstring/text/index.erb b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/templates/default/docstring/text/index.erb new file mode 100644 index 000000000..889dfaaec --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/templates/default/docstring/text/index.erb @@ -0,0 +1,2 @@ + +<%= yieldall %> diff --git a/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/templates/default/docstring/text/note.erb b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/templates/default/docstring/text/note.erb new file mode 100644 index 000000000..745113ae5 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/templates/default/docstring/text/note.erb @@ -0,0 +1,4 @@ +<% object.tags(:note).each do |tag| %> +<%= indent(wrap("Note: #{tag.text}")) %> + +<% end %> \ No newline at end of file diff --git a/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/templates/default/docstring/text/private.erb b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/templates/default/docstring/text/private.erb new file mode 100644 index 000000000..86ebd8f58 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/templates/default/docstring/text/private.erb @@ -0,0 +1,2 @@ +<%= indent(wrap("This #{object.type} is part of a private API.")) %> + diff --git a/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/templates/default/docstring/text/returns_void.erb b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/templates/default/docstring/text/returns_void.erb new file mode 100644 index 000000000..e7381db66 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/templates/default/docstring/text/returns_void.erb @@ -0,0 +1 @@ +<%= indent(wrap("This method returns an undefined value.")) %> \ No newline at end of file diff --git a/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/templates/default/docstring/text/text.erb b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/templates/default/docstring/text/text.erb new file mode 100644 index 000000000..ac1f5e007 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/templates/default/docstring/text/text.erb @@ -0,0 +1 @@ +<%= indent wrap(h(docstring_text.strip), 68) %> diff --git a/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/templates/default/docstring/text/todo.erb b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/templates/default/docstring/text/todo.erb new file mode 100644 index 000000000..99ae3f288 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/templates/default/docstring/text/todo.erb @@ -0,0 +1,4 @@ +<% object.tags(:todo).each do |tag| %> +<%= indent(wrap("TODO: #{tag.text}")) %> + +<% end %> \ No newline at end of file diff --git a/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/templates/default/fulldoc/html/css/common.css b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/templates/default/fulldoc/html/css/common.css new file mode 100644 index 000000000..cf25c4523 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/templates/default/fulldoc/html/css/common.css @@ -0,0 +1 @@ +/* Override this file with custom rules */ \ No newline at end of file diff --git a/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/templates/default/fulldoc/html/css/full_list.css b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/templates/default/fulldoc/html/css/full_list.css new file mode 100644 index 000000000..fa3598242 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/templates/default/fulldoc/html/css/full_list.css @@ -0,0 +1,58 @@ +body { + margin: 0; + font-family: "Lucida Sans", "Lucida Grande", Verdana, Arial, sans-serif; + font-size: 13px; + height: 101%; + overflow-x: hidden; + background: #fafafa; +} + +h1 { padding: 12px 10px; padding-bottom: 0; margin: 0; font-size: 1.4em; } +.clear { clear: both; } +.fixed_header { position: fixed; background: #fff; width: 100%; padding-bottom: 10px; margin-top: 0; top: 0; z-index: 9999; height: 70px; } +#search { position: absolute; right: 5px; top: 9px; padding-left: 24px; } +#content.insearch #search, #content.insearch #noresults { background: url(data:image/gif;base64,R0lGODlhEAAQAPYAAP///wAAAPr6+pKSkoiIiO7u7sjIyNjY2J6engAAAI6OjsbGxjIyMlJSUuzs7KamppSUlPLy8oKCghwcHLKysqSkpJqamvT09Pj4+KioqM7OzkRERAwMDGBgYN7e3ujo6Ly8vCoqKjY2NkZGRtTU1MTExDw8PE5OTj4+PkhISNDQ0MrKylpaWrS0tOrq6nBwcKysrLi4uLq6ul5eXlxcXGJiYoaGhuDg4H5+fvz8/KKiohgYGCwsLFZWVgQEBFBQUMzMzDg4OFhYWBoaGvDw8NbW1pycnOLi4ubm5kBAQKqqqiQkJCAgIK6urnJyckpKSjQ0NGpqatLS0sDAwCYmJnx8fEJCQlRUVAoKCggICLCwsOTk5ExMTPb29ra2tmZmZmhoaNzc3KCgoBISEiIiIgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH/C05FVFNDQVBFMi4wAwEAAAAh/hpDcmVhdGVkIHdpdGggYWpheGxvYWQuaW5mbwAh+QQJCAAAACwAAAAAEAAQAAAHaIAAgoMgIiYlg4kACxIaACEJCSiKggYMCRselwkpghGJBJEcFgsjJyoAGBmfggcNEx0flBiKDhQFlIoCCA+5lAORFb4AJIihCRbDxQAFChAXw9HSqb60iREZ1omqrIPdJCTe0SWI09GBACH5BAkIAAAALAAAAAAQABAAAAdrgACCgwc0NTeDiYozCQkvOTo9GTmDKy8aFy+NOBA7CTswgywJDTIuEjYFIY0JNYMtKTEFiRU8Pjwygy4ws4owPyCKwsMAJSTEgiQlgsbIAMrO0dKDGMTViREZ14kYGRGK38nHguHEJcvTyIEAIfkECQgAAAAsAAAAABAAEAAAB2iAAIKDAggPg4iJAAMJCRUAJRIqiRGCBI0WQEEJJkWDERkYAAUKEBc4Po1GiKKJHkJDNEeKig4URLS0ICImJZAkuQAhjSi/wQyNKcGDCyMnk8u5rYrTgqDVghgZlYjcACTA1sslvtHRgQAh+QQJCAAAACwAAAAAEAAQAAAHZ4AAgoOEhYaCJSWHgxGDJCQARAtOUoQRGRiFD0kJUYWZhUhKT1OLhR8wBaaFBzQ1NwAlkIszCQkvsbOHL7Y4q4IuEjaqq0ZQD5+GEEsJTDCMmIUhtgk1lo6QFUwJVDKLiYJNUd6/hoEAIfkECQgAAAAsAAAAABAAEAAAB2iAAIKDhIWGgiUlh4MRgyQkjIURGRiGGBmNhJWHm4uen4ICCA+IkIsDCQkVACWmhwSpFqAABQoQF6ALTkWFnYMrVlhWvIKTlSAiJiVVPqlGhJkhqShHV1lCW4cMqSkAR1ofiwsjJyqGgQAh+QQJCAAAACwAAAAAEAAQAAAHZ4AAgoOEhYaCJSWHgxGDJCSMhREZGIYYGY2ElYebi56fhyWQniSKAKKfpaCLFlAPhl0gXYNGEwkhGYREUywag1wJwSkHNDU3D0kJYIMZQwk8MjPBLx9eXwuETVEyAC/BOKsuEjYFhoEAIfkECQgAAAAsAAAAABAAEAAAB2eAAIKDhIWGgiUlh4MRgyQkjIURGRiGGBmNhJWHm4ueICImip6CIQkJKJ4kigynKaqKCyMnKqSEK05StgAGQRxPYZaENqccFgIID4KXmQBhXFkzDgOnFYLNgltaSAAEpxa7BQoQF4aBACH5BAkIAAAALAAAAAAQABAAAAdogACCg4SFggJiPUqCJSWGgkZjCUwZACQkgxGEXAmdT4UYGZqCGWQ+IjKGGIUwPzGPhAc0NTewhDOdL7Ykji+dOLuOLhI2BbaFETICx4MlQitdqoUsCQ2vhKGjglNfU0SWmILaj43M5oEAOwAAAAAAAAAAAA==) no-repeat center left; } +#full_list { padding: 0; list-style: none; margin-left: 0; margin-top: 80px; font-size: 1.1em; } +#full_list ul { padding: 0; } +#full_list li { padding: 0; margin: 0; list-style: none; } +#full_list li .item { padding: 5px 5px 5px 12px; } +#noresults { padding: 7px 12px; background: #fff; } +#content.insearch #noresults { margin-left: 7px; } +li.collapsed ul { display: none; } +li a.toggle { cursor: default; position: relative; left: -5px; top: 4px; text-indent: -999px; width: 10px; height: 9px; margin-left: -10px; display: block; float: left; background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAASCAYAAABb0P4QAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAK8AAACvABQqw0mAAAABx0RVh0U29mdHdhcmUAQWRvYmUgRmlyZXdvcmtzIENTM5jWRgMAAAAVdEVYdENyZWF0aW9uIFRpbWUAMy8xNC8wOeNZPpQAAAE2SURBVDiNrZTBccIwEEXfelIAHUA6CZ24BGaWO+FuzZAK4k6gg5QAdGAq+Bxs2Yqx7BzyL7Llp/VfzZeQhCTc/ezuGzKKnKSzpCxXJM8fwNXda3df5RZETlIt6YUzSQDs93sl8w3wBZxCCE10GM1OcWbWjB2mWgEH4Mfdyxm3PSepBHibgQE2wLe7r4HjEidpnXMYdQPKEMJcsZ4zs2POYQOcaPfwMVOo58zsAdMt18BuoVDPxUJRacELbXv3hUIX2vYmOUvi8C8ydz/ThjXrqKqqLbDIAdsCKBd+Wo7GWa7o9qzOQHVVVXeAbs+yHHCH4aTsaCOQqunmUy1yBUAXkdMIfMlgF5EXLo2OpV/c/Up7jG4hhHcYLgWzAZXUc2b2ixsfvc/RmNNfOXD3Q/oeL9axJE1yT9IOoUu6MGUkAAAAAElFTkSuQmCC) no-repeat bottom left; } +li.collapsed a.toggle { opacity: 0.5; cursor: default; background-position: top left; } +li { color: #888; cursor: pointer; } +li.deprecated { text-decoration: line-through; font-style: italic; } +li.odd { background: #f0f0f0; } +li.even { background: #fafafa; } +.item:hover { background: #ddd; } +li small:before { content: "("; } +li small:after { content: ")"; } +li small.search_info { display: none; } +a, a:visited { text-decoration: none; color: #05a; } +li.clicked > .item { background: #05a; color: #ccc; } +li.clicked > .item a, li.clicked > .item a:visited { color: #eee; } +li.clicked > .item a.toggle { opacity: 0.5; background-position: bottom right; } +li.collapsed.clicked a.toggle { background-position: top right; } +#search input { border: 1px solid #bbb; border-radius: 3px; } +#full_list_nav { margin-left: 10px; font-size: 0.9em; display: block; color: #aaa; } +#full_list_nav a, #nav a:visited { color: #358; } +#full_list_nav a:hover { background: transparent; color: #5af; } +#full_list_nav span:after { content: ' | '; } +#full_list_nav span:last-child:after { content: ''; } + +#content h1 { margin-top: 0; } +li { white-space: nowrap; cursor: normal; } +li small { display: block; font-size: 0.8em; } +li small:before { content: ""; } +li small:after { content: ""; } +li small.search_info { display: none; } +#search { width: 170px; position: static; margin: 3px; margin-left: 10px; font-size: 0.9em; color: #888; padding-left: 0; padding-right: 24px; } +#content.insearch #search { background-position: center right; } +#search input { width: 110px; } + +#full_list.insearch ul { display: block; } +#full_list.insearch .item { display: none; } +#full_list.insearch .found { display: block; padding-left: 11px !important; } +#full_list.insearch li a.toggle { display: none; } +#full_list.insearch li small.search_info { display: block; } diff --git a/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/templates/default/fulldoc/html/css/style.css b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/templates/default/fulldoc/html/css/style.css new file mode 100644 index 000000000..eb0dbc86f --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/templates/default/fulldoc/html/css/style.css @@ -0,0 +1,497 @@ +html { + width: 100%; + height: 100%; +} +body { + font-family: "Lucida Sans", "Lucida Grande", Verdana, Arial, sans-serif; + font-size: 13px; + width: 100%; + margin: 0; + padding: 0; + display: flex; + display: -webkit-flex; + display: -ms-flexbox; +} + +#nav { + position: relative; + width: 100%; + height: 100%; + border: 0; + border-right: 1px dotted #eee; + overflow: auto; +} +.nav_wrap { + margin: 0; + padding: 0; + width: 20%; + height: 100%; + position: relative; + display: flex; + display: -webkit-flex; + display: -ms-flexbox; + flex-shrink: 0; + -webkit-flex-shrink: 0; + -ms-flex: 1 0; +} +#resizer { + position: absolute; + right: -5px; + top: 0; + width: 10px; + height: 100%; + cursor: col-resize; + z-index: 9999; +} +#main { + flex: 5 1; + -webkit-flex: 5 1; + -ms-flex: 5 1; + outline: none; + position: relative; + background: #fff; + padding: 1.2em; + padding-top: 0.2em; + box-sizing: border-box; +} + +@media (max-width: 920px) { + .nav_wrap { width: 100%; top: 0; right: 0; overflow: visible; position: absolute; } + #resizer { display: none; } + #nav { + z-index: 9999; + background: #fff; + display: none; + position: absolute; + top: 40px; + right: 12px; + width: 500px; + max-width: 80%; + height: 80%; + overflow-y: scroll; + border: 1px solid #999; + border-collapse: collapse; + box-shadow: -7px 5px 25px #aaa; + border-radius: 2px; + } +} + +@media (min-width: 920px) { + body { height: 100%; overflow: hidden; } + #main { height: 100%; overflow: auto; } + #search { display: none; } +} + +#main img { max-width: 100%; } +h1 { font-size: 25px; margin: 1em 0 0.5em; padding-top: 4px; border-top: 1px dotted #d5d5d5; } +h1.noborder { border-top: 0px; margin-top: 0; padding-top: 4px; } +h1.title { margin-bottom: 10px; } +h1.alphaindex { margin-top: 0; font-size: 22px; } +h2 { + padding: 0; + padding-bottom: 3px; + border-bottom: 1px #aaa solid; + font-size: 1.4em; + margin: 1.8em 0 0.5em; + position: relative; +} +h2 small { font-weight: normal; font-size: 0.7em; display: inline; position: absolute; right: 0; } +h2 small a { + display: block; + height: 20px; + border: 1px solid #aaa; + border-bottom: 0; + border-top-left-radius: 5px; + background: #f8f8f8; + position: relative; + padding: 2px 7px; +} +.clear { clear: both; } +.inline { display: inline; } +.inline p:first-child { display: inline; } +.docstring, .tags, #filecontents { font-size: 15px; line-height: 1.5145em; } +.docstring p > code, .docstring p > tt, .tags p > code, .tags p > tt { + color: #c7254e; background: #f9f2f4; padding: 2px 4px; font-size: 1em; + border-radius: 4px; +} +.docstring h1, .docstring h2, .docstring h3, .docstring h4 { padding: 0; border: 0; border-bottom: 1px dotted #bbb; } +.docstring h1 { font-size: 1.2em; } +.docstring h2 { font-size: 1.1em; } +.docstring h3, .docstring h4 { font-size: 1em; border-bottom: 0; padding-top: 10px; } +.summary_desc .object_link a, .docstring .object_link a { + font-family: monospace; font-size: 1.05em; + color: #05a; background: #EDF4FA; padding: 2px 4px; font-size: 1em; + border-radius: 4px; +} +.rdoc-term { padding-right: 25px; font-weight: bold; } +.rdoc-list p { margin: 0; padding: 0; margin-bottom: 4px; } +.summary_desc pre.code .object_link a, .docstring pre.code .object_link a { + padding: 0px; background: inherit; color: inherit; border-radius: inherit; +} + +/* style for */ +#filecontents table, .docstring table { border-collapse: collapse; } +#filecontents table th, #filecontents table td, +.docstring table th, .docstring table td { border: 1px solid #ccc; padding: 8px; padding-right: 17px; } +#filecontents table tr:nth-child(odd), +.docstring table tr:nth-child(odd) { background: #eee; } +#filecontents table tr:nth-child(even), +.docstring table tr:nth-child(even) { background: #fff; } +#filecontents table th, .docstring table th { background: #fff; } + +/* style for
      */ +#filecontents li > p, .docstring li > p { margin: 0px; } +#filecontents ul, .docstring ul { padding-left: 20px; } +/* style for
      */ +#filecontents dl, .docstring dl { border: 1px solid #ccc; } +#filecontents dt, .docstring dt { background: #ddd; font-weight: bold; padding: 3px 5px; } +#filecontents dd, .docstring dd { padding: 5px 0px; margin-left: 18px; } +#filecontents dd > p, .docstring dd > p { margin: 0px; } + +.note { + color: #222; + margin: 20px 0; + padding: 10px; + border: 1px solid #eee; + border-radius: 3px; + display: block; +} +.docstring .note { + border-left-color: #ccc; + border-left-width: 5px; +} +.note.todo { background: #ffffc5; border-color: #ececaa; } +.note.returns_void { background: #efefef; } +.note.deprecated { background: #ffe5e5; border-color: #e9dada; } +.note.title.deprecated { background: #ffe5e5; border-color: #e9dada; } +.note.private { background: #ffffc5; border-color: #ececaa; } +.note.title { padding: 3px 6px; font-size: 0.9em; font-family: "Lucida Sans", "Lucida Grande", Verdana, Arial, sans-serif; display: inline; } +.summary_signature + .note.title { margin-left: 7px; } +h1 .note.title { font-size: 0.5em; font-weight: normal; padding: 3px 5px; position: relative; top: -3px; text-transform: capitalize; } +.note.title { background: #efefef; } +.note.title.constructor { color: #fff; background: #6a98d6; border-color: #6689d6; } +.note.title.writeonly { color: #fff; background: #45a638; border-color: #2da31d; } +.note.title.readonly { color: #fff; background: #6a98d6; border-color: #6689d6; } +.note.title.private { background: #d5d5d5; border-color: #c5c5c5; } +.note.title.not_defined_here { background: transparent; border: none; font-style: italic; } +.discussion .note { margin-top: 6px; } +.discussion .note:first-child { margin-top: 0; } + +h3.inherited { + font-style: italic; + font-family: "Lucida Sans", "Lucida Grande", Verdana, Arial, sans-serif; + font-weight: normal; + padding: 0; + margin: 0; + margin-top: 12px; + margin-bottom: 3px; + font-size: 13px; +} +p.inherited { + padding: 0; + margin: 0; + margin-left: 25px; +} + +.box_info dl { + margin: 0; + border: 0; + width: 100%; + font-size: 1em; + display: flex; + display: -webkit-flex; + display: -ms-flexbox; +} +.box_info dl dt { + flex-shrink: 0; + -webkit-flex-shrink: 1; + -ms-flex-shrink: 1; + width: 100px; + text-align: right; + font-weight: bold; + border: 1px solid #aaa; + border-width: 1px 0px 0px 1px; + padding: 6px 0; + padding-right: 10px; +} +.box_info dl dd { + flex-grow: 1; + -webkit-flex-grow: 1; + -ms-flex: 1; + max-width: 420px; + padding: 6px 0; + padding-right: 20px; + border: 1px solid #aaa; + border-width: 1px 1px 0 0; + overflow: hidden; + position: relative; +} +.box_info dl:last-child > * { + border-bottom: 1px solid #aaa; +} +.box_info dl:nth-child(odd) > * { background: #eee; } +.box_info dl:nth-child(even) > * { background: #fff; } +.box_info dl > * { margin: 0; } + +ul.toplevel { list-style: none; padding-left: 0; font-size: 1.1em; } +.index_inline_list { padding-left: 0; font-size: 1.1em; } + +.index_inline_list li { + list-style: none; + display: inline-block; + padding: 0 12px; + line-height: 30px; + margin-bottom: 5px; +} + +dl.constants { margin-left: 10px; } +dl.constants dt { font-weight: bold; font-size: 1.1em; margin-bottom: 5px; } +dl.constants.compact dt { display: inline-block; font-weight: normal } +dl.constants dd { width: 75%; white-space: pre; font-family: monospace; margin-bottom: 18px; } +dl.constants .docstring .note:first-child { margin-top: 5px; } + +.summary_desc { + margin-left: 32px; + display: block; + font-family: sans-serif; + font-size: 1.1em; + margin-top: 8px; + line-height: 1.5145em; + margin-bottom: 0.8em; +} +.summary_desc tt { font-size: 0.9em; } +dl.constants .note { padding: 2px 6px; padding-right: 12px; margin-top: 6px; } +dl.constants .docstring { margin-left: 32px; font-size: 0.9em; font-weight: normal; } +dl.constants .tags { padding-left: 32px; font-size: 0.9em; line-height: 0.8em; } +dl.constants .discussion *:first-child { margin-top: 0; } +dl.constants .discussion *:last-child { margin-bottom: 0; } + +.method_details { border-top: 1px dotted #ccc; margin-top: 25px; padding-top: 0; } +.method_details.first { border: 0; margin-top: 5px; } +.method_details.first h3.signature { margin-top: 1em; } +p.signature, h3.signature { + font-size: 1.1em; font-weight: normal; font-family: Monaco, Consolas, Courier, monospace; + padding: 6px 10px; margin-top: 1em; + background: #E8F4FF; border: 1px solid #d8d8e5; border-radius: 5px; +} +p.signature tt, +h3.signature tt { font-family: Monaco, Consolas, Courier, monospace; } +p.signature .overload, +h3.signature .overload { display: block; } +p.signature .extras, +h3.signature .extras { font-weight: normal; font-family: sans-serif; color: #444; font-size: 1em; } +p.signature .not_defined_here, +h3.signature .not_defined_here, +p.signature .aliases, +h3.signature .aliases { display: block; font-weight: normal; font-size: 0.9em; font-family: sans-serif; margin-top: 0px; color: #555; } +p.signature .aliases .names, +h3.signature .aliases .names { font-family: Monaco, Consolas, Courier, monospace; font-weight: bold; color: #000; font-size: 1.2em; } + +.tags .tag_title { font-size: 1.05em; margin-bottom: 0; font-weight: bold; } +.tags .tag_title tt { color: initial; padding: initial; background: initial; } +.tags ul { margin-top: 5px; padding-left: 30px; list-style: square; } +.tags ul li { margin-bottom: 3px; } +.tags ul .name { font-family: monospace; font-weight: bold; } +.tags ul .note { padding: 3px 6px; } +.tags { margin-bottom: 12px; } + +.tags .examples .tag_title { margin-bottom: 10px; font-weight: bold; } +.tags .examples .inline p { padding: 0; margin: 0; font-weight: bold; font-size: 1em; } +.tags .examples .inline p:before { content: "▸"; font-size: 1em; margin-right: 5px; } + +.tags .overload .overload_item { list-style: none; margin-bottom: 25px; } +.tags .overload .overload_item .signature { + padding: 2px 8px; + background: #F1F8FF; border: 1px solid #d8d8e5; border-radius: 3px; +} +.tags .overload .signature { margin-left: -15px; font-family: monospace; display: block; font-size: 1.1em; } +.tags .overload .docstring { margin-top: 15px; } + +.defines { display: none; } + +#method_missing_details .notice.this { position: relative; top: -8px; color: #888; padding: 0; margin: 0; } + +.showSource { font-size: 0.9em; } +.showSource a, .showSource a:visited { text-decoration: none; color: #666; } + +#content a, #content a:visited { text-decoration: none; color: #05a; } +#content a:hover { background: #ffffa5; } + +ul.summary { + list-style: none; + font-family: monospace; + font-size: 1em; + line-height: 1.5em; + padding-left: 0px; +} +ul.summary a, ul.summary a:visited { + text-decoration: none; font-size: 1.1em; +} +ul.summary li { margin-bottom: 5px; } +.summary_signature { padding: 4px 8px; background: #f8f8f8; border: 1px solid #f0f0f0; border-radius: 5px; } +.summary_signature:hover { background: #CFEBFF; border-color: #A4CCDA; cursor: pointer; } +.summary_signature.deprecated { background: #ffe5e5; border-color: #e9dada; } +ul.summary.compact li { display: inline-block; margin: 0px 5px 0px 0px; line-height: 2.6em;} +ul.summary.compact .summary_signature { padding: 5px 7px; padding-right: 4px; } +#content .summary_signature:hover a, +#content .summary_signature:hover a:visited { + background: transparent; + color: #049; +} + +p.inherited a { font-family: monospace; font-size: 0.9em; } +p.inherited { word-spacing: 5px; font-size: 1.2em; } + +p.children { font-size: 1.2em; } +p.children a { font-size: 0.9em; } +p.children strong { font-size: 0.8em; } +p.children strong.modules { padding-left: 5px; } + +ul.fullTree { display: none; padding-left: 0; list-style: none; margin-left: 0; margin-bottom: 10px; } +ul.fullTree ul { margin-left: 0; padding-left: 0; list-style: none; } +ul.fullTree li { text-align: center; padding-top: 18px; padding-bottom: 12px; background: url(data:image/gif;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKCAYAAACNMs+9AAAACXBIWXMAAAsTAAALEwEAmpwYAAAKT2lDQ1BQaG90b3Nob3AgSUNDIHByb2ZpbGUAAHjanVNnVFPpFj333vRCS4iAlEtvUhUIIFJCi4AUkSYqIQkQSoghodkVUcERRUUEG8igiAOOjoCMFVEsDIoK2AfkIaKOg6OIisr74Xuja9a89+bN/rXXPues852zzwfACAyWSDNRNYAMqUIeEeCDx8TG4eQuQIEKJHAAEAizZCFz/SMBAPh+PDwrIsAHvgABeNMLCADATZvAMByH/w/qQplcAYCEAcB0kThLCIAUAEB6jkKmAEBGAYCdmCZTAKAEAGDLY2LjAFAtAGAnf+bTAICd+Jl7AQBblCEVAaCRACATZYhEAGg7AKzPVopFAFgwABRmS8Q5ANgtADBJV2ZIALC3AMDOEAuyAAgMADBRiIUpAAR7AGDIIyN4AISZABRG8lc88SuuEOcqAAB4mbI8uSQ5RYFbCC1xB1dXLh4ozkkXKxQ2YQJhmkAuwnmZGTKBNA/g88wAAKCRFRHgg/P9eM4Ors7ONo62Dl8t6r8G/yJiYuP+5c+rcEAAAOF0ftH+LC+zGoA7BoBt/qIl7gRoXgugdfeLZrIPQLUAoOnaV/Nw+H48PEWhkLnZ2eXk5NhKxEJbYcpXff5nwl/AV/1s+X48/Pf14L7iJIEyXYFHBPjgwsz0TKUcz5IJhGLc5o9H/LcL//wd0yLESWK5WCoU41EScY5EmozzMqUiiUKSKcUl0v9k4t8s+wM+3zUAsGo+AXuRLahdYwP2SycQWHTA4vcAAPK7b8HUKAgDgGiD4c93/+8//UegJQCAZkmScQAAXkQkLlTKsz/HCAAARKCBKrBBG/TBGCzABhzBBdzBC/xgNoRCJMTCQhBCCmSAHHJgKayCQiiGzbAdKmAv1EAdNMBRaIaTcA4uwlW4Dj1wD/phCJ7BKLyBCQRByAgTYSHaiAFiilgjjggXmYX4IcFIBBKLJCDJiBRRIkuRNUgxUopUIFVIHfI9cgI5h1xGupE7yAAygvyGvEcxlIGyUT3UDLVDuag3GoRGogvQZHQxmo8WoJvQcrQaPYw2oefQq2gP2o8+Q8cwwOgYBzPEbDAuxsNCsTgsCZNjy7EirAyrxhqwVqwDu4n1Y8+xdwQSgUXACTYEd0IgYR5BSFhMWE7YSKggHCQ0EdoJNwkDhFHCJyKTqEu0JroR+cQYYjIxh1hILCPWEo8TLxB7iEPENyQSiUMyJ7mQAkmxpFTSEtJG0m5SI+ksqZs0SBojk8naZGuyBzmULCAryIXkneTD5DPkG+Qh8lsKnWJAcaT4U+IoUspqShnlEOU05QZlmDJBVaOaUt2ooVQRNY9aQq2htlKvUYeoEzR1mjnNgxZJS6WtopXTGmgXaPdpr+h0uhHdlR5Ol9BX0svpR+iX6AP0dwwNhhWDx4hnKBmbGAcYZxl3GK+YTKYZ04sZx1QwNzHrmOeZD5lvVVgqtip8FZHKCpVKlSaVGyovVKmqpqreqgtV81XLVI+pXlN9rkZVM1PjqQnUlqtVqp1Q61MbU2epO6iHqmeob1Q/pH5Z/YkGWcNMw09DpFGgsV/jvMYgC2MZs3gsIWsNq4Z1gTXEJrHN2Xx2KruY/R27iz2qqaE5QzNKM1ezUvOUZj8H45hx+Jx0TgnnKKeX836K3hTvKeIpG6Y0TLkxZVxrqpaXllirSKtRq0frvTau7aedpr1Fu1n7gQ5Bx0onXCdHZ4/OBZ3nU9lT3acKpxZNPTr1ri6qa6UbobtEd79up+6Ynr5egJ5Mb6feeb3n+hx9L/1U/W36p/VHDFgGswwkBtsMzhg8xTVxbzwdL8fb8VFDXcNAQ6VhlWGX4YSRudE8o9VGjUYPjGnGXOMk423GbcajJgYmISZLTepN7ppSTbmmKaY7TDtMx83MzaLN1pk1mz0x1zLnm+eb15vft2BaeFostqi2uGVJsuRaplnutrxuhVo5WaVYVVpds0atna0l1rutu6cRp7lOk06rntZnw7Dxtsm2qbcZsOXYBtuutm22fWFnYhdnt8Wuw+6TvZN9un2N/T0HDYfZDqsdWh1+c7RyFDpWOt6azpzuP33F9JbpL2dYzxDP2DPjthPLKcRpnVOb00dnF2e5c4PziIuJS4LLLpc+Lpsbxt3IveRKdPVxXeF60vWdm7Obwu2o26/uNu5p7ofcn8w0nymeWTNz0MPIQ+BR5dE/C5+VMGvfrH5PQ0+BZ7XnIy9jL5FXrdewt6V3qvdh7xc+9j5yn+M+4zw33jLeWV/MN8C3yLfLT8Nvnl+F30N/I/9k/3r/0QCngCUBZwOJgUGBWwL7+Hp8Ib+OPzrbZfay2e1BjKC5QRVBj4KtguXBrSFoyOyQrSH355jOkc5pDoVQfujW0Adh5mGLw34MJ4WHhVeGP45wiFga0TGXNXfR3ENz30T6RJZE3ptnMU85ry1KNSo+qi5qPNo3ujS6P8YuZlnM1VidWElsSxw5LiquNm5svt/87fOH4p3iC+N7F5gvyF1weaHOwvSFpxapLhIsOpZATIhOOJTwQRAqqBaMJfITdyWOCnnCHcJnIi/RNtGI2ENcKh5O8kgqTXqS7JG8NXkkxTOlLOW5hCepkLxMDUzdmzqeFpp2IG0yPTq9MYOSkZBxQqohTZO2Z+pn5mZ2y6xlhbL+xW6Lty8elQfJa7OQrAVZLQq2QqboVFoo1yoHsmdlV2a/zYnKOZarnivN7cyzytuQN5zvn//tEsIS4ZK2pYZLVy0dWOa9rGo5sjxxedsK4xUFK4ZWBqw8uIq2Km3VT6vtV5eufr0mek1rgV7ByoLBtQFr6wtVCuWFfevc1+1dT1gvWd+1YfqGnRs+FYmKrhTbF5cVf9go3HjlG4dvyr+Z3JS0qavEuWTPZtJm6ebeLZ5bDpaql+aXDm4N2dq0Dd9WtO319kXbL5fNKNu7g7ZDuaO/PLi8ZafJzs07P1SkVPRU+lQ27tLdtWHX+G7R7ht7vPY07NXbW7z3/T7JvttVAVVN1WbVZftJ+7P3P66Jqun4lvttXa1ObXHtxwPSA/0HIw6217nU1R3SPVRSj9Yr60cOxx++/p3vdy0NNg1VjZzG4iNwRHnk6fcJ3/ceDTradox7rOEH0x92HWcdL2pCmvKaRptTmvtbYlu6T8w+0dbq3nr8R9sfD5w0PFl5SvNUyWna6YLTk2fyz4ydlZ19fi753GDborZ752PO32oPb++6EHTh0kX/i+c7vDvOXPK4dPKy2+UTV7hXmq86X23qdOo8/pPTT8e7nLuarrlca7nuer21e2b36RueN87d9L158Rb/1tWeOT3dvfN6b/fF9/XfFt1+cif9zsu72Xcn7q28T7xf9EDtQdlD3YfVP1v+3Njv3H9qwHeg89HcR/cGhYPP/pH1jw9DBY+Zj8uGDYbrnjg+OTniP3L96fynQ89kzyaeF/6i/suuFxYvfvjV69fO0ZjRoZfyl5O/bXyl/erA6xmv28bCxh6+yXgzMV70VvvtwXfcdx3vo98PT+R8IH8o/2j5sfVT0Kf7kxmTk/8EA5jz/GMzLdsAAAAgY0hSTQAAeiUAAICDAAD5/wAAgOkAAHUwAADqYAAAOpgAABdvkl/FRgAAAHtJREFUeNqMzrEJAkEURdGzuhgZbSoYWcAWoBVsB4JgZAGmphsZCZYzTQgWNCYrDN9RvMmHx+X916SUBFbo8CzD1idXrLErw1mQttgXtyrOcQ/Ny5p4Qh+2XqLYYazsPWNTiuMkRxa4vcV+evuNAUOLIx5+c2hyzv7hNQC67Q+/HHmlEwAAAABJRU5ErkJggg==) no-repeat top center; } +ul.fullTree li:first-child { padding-top: 0; background: transparent; } +ul.fullTree li:last-child { padding-bottom: 0; } +.showAll ul.fullTree { display: block; } +.showAll .inheritName { display: none; } + +#search { position: absolute; right: 12px; top: 0px; z-index: 9000; } +#search a { + display: block; float: left; + padding: 4px 8px; text-decoration: none; color: #05a; fill: #05a; + border: 1px solid #d8d8e5; + border-bottom-left-radius: 3px; border-bottom-right-radius: 3px; + background: #F1F8FF; + box-shadow: -1px 1px 3px #ddd; +} +#search a:hover { background: #f5faff; color: #06b; fill: #06b; } +#search a.active { + background: #568; padding-bottom: 20px; color: #fff; fill: #fff; + border: 1px solid #457; + border-top-left-radius: 5px; border-top-right-radius: 5px; +} +#search a.inactive { color: #999; fill: #999; } +.inheritanceTree, .toggleDefines { + float: right; + border-left: 1px solid #aaa; + position: absolute; top: 0; right: 0; + height: 100%; + background: #f6f6f6; + padding: 5px; + min-width: 55px; + text-align: center; +} + +#menu { font-size: 1.3em; color: #bbb; } +#menu .title, #menu a { font-size: 0.7em; } +#menu .title a { font-size: 1em; } +#menu .title { color: #555; } +#menu a, #menu a:visited { color: #333; text-decoration: none; border-bottom: 1px dotted #bbd; } +#menu a:hover { color: #05a; } + +#footer { margin-top: 15px; border-top: 1px solid #ccc; text-align: center; padding: 7px 0; color: #999; } +#footer a, #footer a:visited { color: #444; text-decoration: none; border-bottom: 1px dotted #bbd; } +#footer a:hover { color: #05a; } + +#listing ul.alpha { font-size: 1.1em; } +#listing ul.alpha { margin: 0; padding: 0; padding-bottom: 10px; list-style: none; } +#listing ul.alpha li.letter { font-size: 1.4em; padding-bottom: 10px; } +#listing ul.alpha ul { margin: 0; padding-left: 15px; } +#listing ul small { color: #666; font-size: 0.7em; } + +li.r1 { background: #f0f0f0; } +li.r2 { background: #fafafa; } + +#content ul.summary li.deprecated .summary_signature a, +#content ul.summary li.deprecated .summary_signature a:visited { text-decoration: line-through; font-style: italic; } + +#toc { + position: relative; + float: right; + overflow-x: auto; + right: -3px; + margin-left: 20px; + margin-bottom: 20px; + padding: 20px; padding-right: 30px; + max-width: 300px; + z-index: 5000; + background: #fefefe; + border: 1px solid #ddd; + box-shadow: -2px 2px 6px #bbb; +} +#toc .title { margin: 0; } +#toc ol { padding-left: 1.8em; } +#toc li { font-size: 1.1em; line-height: 1.7em; } +#toc > ol > li { font-size: 1.1em; font-weight: bold; } +#toc ol > li > ol { font-size: 0.9em; } +#toc ol ol > li > ol { padding-left: 2.3em; } +#toc ol + li { margin-top: 0.3em; } +#toc.hidden { padding: 10px; background: #fefefe; box-shadow: none; } +#toc.hidden:hover { background: #fafafa; } +#filecontents h1 + #toc.nofloat { margin-top: 0; } +@media (max-width: 560px) { + #toc { + margin-left: 0; + margin-top: 16px; + float: none; + max-width: none; + } +} + +/* syntax highlighting */ +.source_code { display: none; padding: 3px 8px; border-left: 8px solid #ddd; margin-top: 5px; } +#filecontents pre.code, .docstring pre.code, .source_code pre { font-family: monospace; } +#filecontents pre.code, .docstring pre.code { display: block; } +.source_code .lines { padding-right: 12px; color: #555; text-align: right; } +#filecontents pre.code, .docstring pre.code, +.tags pre.example { + padding: 9px 14px; + margin-top: 4px; + border: 1px solid #e1e1e8; + background: #f7f7f9; + border-radius: 4px; + font-size: 1em; + overflow-x: auto; + line-height: 1.2em; +} +pre.code { color: #000; tab-size: 2; } +pre.code .info.file { color: #555; } +pre.code .val { color: #036A07; } +pre.code .tstring_content, +pre.code .heredoc_beg, pre.code .heredoc_end, +pre.code .qwords_beg, pre.code .qwords_end, pre.code .qwords_sep, +pre.code .words_beg, pre.code .words_end, pre.code .words_sep, +pre.code .qsymbols_beg, pre.code .qsymbols_end, pre.code .qsymbols_sep, +pre.code .symbols_beg, pre.code .symbols_end, pre.code .symbols_sep, +pre.code .tstring, pre.code .dstring { color: #036A07; } +pre.code .fid, pre.code .rubyid_new, pre.code .rubyid_to_s, +pre.code .rubyid_to_sym, pre.code .rubyid_to_f, +pre.code .dot + pre.code .id, +pre.code .rubyid_to_i pre.code .rubyid_each { color: #0085FF; } +pre.code .comment { color: #0066FF; } +pre.code .const, pre.code .constant { color: #585CF6; } +pre.code .label, +pre.code .symbol { color: #C5060B; } +pre.code .kw, +pre.code .rubyid_require, +pre.code .rubyid_extend, +pre.code .rubyid_include { color: #0000FF; } +pre.code .ivar { color: #318495; } +pre.code .gvar, +pre.code .rubyid_backref, +pre.code .rubyid_nth_ref { color: #6D79DE; } +pre.code .regexp, .dregexp { color: #036A07; } +pre.code a { border-bottom: 1px dotted #bbf; } +/* inline code */ +*:not(pre) > code { + padding: 1px 3px 1px 3px; + border: 1px solid #E1E1E8; + background: #F7F7F9; + border-radius: 4px; +} + +/* Color fix for links */ +#content .summary_desc pre.code .id > .object_link a, /* identifier */ +#content .docstring pre.code .id > .object_link a { color: #0085FF; } +#content .summary_desc pre.code .const > .object_link a, /* constant */ +#content .docstring pre.code .const > .object_link a { color: #585CF6; } diff --git a/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/templates/default/fulldoc/html/frames.erb b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/templates/default/fulldoc/html/frames.erb new file mode 100644 index 000000000..e803bcd6c --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/templates/default/fulldoc/html/frames.erb @@ -0,0 +1,17 @@ + + + + + <%= options.title %> + + + + diff --git a/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/templates/default/fulldoc/html/full_list.erb b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/templates/default/fulldoc/html/full_list.erb new file mode 100644 index 000000000..7392782bc --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/templates/default/fulldoc/html/full_list.erb @@ -0,0 +1,37 @@ + + + + + + <% stylesheets_full_list.each do |stylesheet| %> + + <% end %> + + <% javascripts_full_list.each do |javascript| %> + + <% end %> + + <%= @list_title %> + + + +
      +
      +

      <%= @list_title %>

      +
      + <% menu_lists.each do |list| %> + + <%= list[:title] %> + + <% end %> +
      + + +
      + +
        + <%= erb "full_list_#{@list_type}" %> +
      +
      + + diff --git a/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/templates/default/fulldoc/html/full_list_class.erb b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/templates/default/fulldoc/html/full_list_class.erb new file mode 100644 index 000000000..244287e05 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/templates/default/fulldoc/html/full_list_class.erb @@ -0,0 +1,2 @@ +
    • <%= link_object(Registry.root, Registry.root.title, nil, false) %>
    • +<%= class_list %> diff --git a/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/templates/default/fulldoc/html/full_list_file.erb b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/templates/default/fulldoc/html/full_list_file.erb new file mode 100644 index 000000000..a50709a5e --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/templates/default/fulldoc/html/full_list_file.erb @@ -0,0 +1,7 @@ +<% even_odd = 'odd' %> +<% @items.each do |item| %> +
    • +
      <%= link_file item %>
      +
    • + <% even_odd = (even_odd == 'even' ? 'odd' : 'even') %> +<% end %> diff --git a/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/templates/default/fulldoc/html/full_list_method.erb b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/templates/default/fulldoc/html/full_list_method.erb new file mode 100644 index 000000000..f305c62f1 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/templates/default/fulldoc/html/full_list_method.erb @@ -0,0 +1,10 @@ +<% even_odd = 'odd' %> +<% @items.each do |item| %> +
    • +
      + <%= linkify item, h(item.name(true)) %> + <%= item.namespace.title %> +
      +
    • + <% even_odd = (even_odd == 'even' ? 'odd' : 'even') %> +<% end %> diff --git a/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/templates/default/fulldoc/html/js/app.js b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/templates/default/fulldoc/html/js/app.js new file mode 100644 index 000000000..8d067fe30 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/templates/default/fulldoc/html/js/app.js @@ -0,0 +1,314 @@ +(function() { + +var localStorage = {}, sessionStorage = {}; +try { localStorage = window.localStorage; } catch (e) { } +try { sessionStorage = window.sessionStorage; } catch (e) { } + +function createSourceLinks() { + $('.method_details_list .source_code'). + before("[View source]"); + $('.toggleSource').toggle(function() { + $(this).parent().nextAll('.source_code').slideDown(100); + $(this).text("Hide source"); + }, + function() { + $(this).parent().nextAll('.source_code').slideUp(100); + $(this).text("View source"); + }); +} + +function createDefineLinks() { + var tHeight = 0; + $('.defines').after(" more..."); + $('.toggleDefines').toggle(function() { + tHeight = $(this).parent().prev().height(); + $(this).prev().css('display', 'inline'); + $(this).parent().prev().height($(this).parent().height()); + $(this).text("(less)"); + }, + function() { + $(this).prev().hide(); + $(this).parent().prev().height(tHeight); + $(this).text("more..."); + }); +} + +function createFullTreeLinks() { + var tHeight = 0; + $('.inheritanceTree').toggle(function() { + tHeight = $(this).parent().prev().height(); + $(this).parent().toggleClass('showAll'); + $(this).text("(hide)"); + $(this).parent().prev().height($(this).parent().height()); + }, + function() { + $(this).parent().toggleClass('showAll'); + $(this).parent().prev().height(tHeight); + $(this).text("show all"); + }); +} + +function searchFrameButtons() { + $('.full_list_link').click(function() { + toggleSearchFrame(this, $(this).attr('href')); + return false; + }); + window.addEventListener('message', function(e) { + if (e.data === 'navEscape') { + $('#nav').slideUp(100); + $('#search a').removeClass('active inactive'); + $(window).focus(); + } + }); + + $(window).resize(function() { + if ($('#search:visible').length === 0) { + $('#nav').removeAttr('style'); + $('#search a').removeClass('active inactive'); + $(window).focus(); + } + }); +} + +function toggleSearchFrame(id, link) { + var frame = $('#nav'); + $('#search a').removeClass('active').addClass('inactive'); + if (frame.attr('src') === link && frame.css('display') !== "none") { + frame.slideUp(100); + $('#search a').removeClass('active inactive'); + } + else { + $(id).addClass('active').removeClass('inactive'); + if (frame.attr('src') !== link) frame.attr('src', link); + frame.slideDown(100); + } +} + +function linkSummaries() { + $('.summary_signature').click(function() { + document.location = $(this).find('a').attr('href'); + }); +} + +function summaryToggle() { + $('.summary_toggle').click(function(e) { + e.preventDefault(); + localStorage.summaryCollapsed = $(this).text(); + $('.summary_toggle').each(function() { + $(this).text($(this).text() == "collapse" ? "expand" : "collapse"); + var next = $(this).parent().parent().nextAll('ul.summary').first(); + if (next.hasClass('compact')) { + next.toggle(); + next.nextAll('ul.summary').first().toggle(); + } + else if (next.hasClass('summary')) { + var list = $('
        '); + list.html(next.html()); + list.find('.summary_desc, .note').remove(); + list.find('a').each(function() { + $(this).html($(this).find('strong').html()); + $(this).parent().html($(this)[0].outerHTML); + }); + next.before(list); + next.toggle(); + } + }); + return false; + }); + if (localStorage.summaryCollapsed == "collapse") { + $('.summary_toggle').first().click(); + } else { localStorage.summaryCollapsed = "expand"; } +} + +function constantSummaryToggle() { + $('.constants_summary_toggle').click(function(e) { + e.preventDefault(); + localStorage.summaryCollapsed = $(this).text(); + $('.constants_summary_toggle').each(function() { + $(this).text($(this).text() == "collapse" ? "expand" : "collapse"); + var next = $(this).parent().parent().nextAll('dl.constants').first(); + if (next.hasClass('compact')) { + next.toggle(); + next.nextAll('dl.constants').first().toggle(); + } + else if (next.hasClass('constants')) { + var list = $('
        '); + list.html(next.html()); + list.find('dt').each(function() { + $(this).addClass('summary_signature'); + $(this).text( $(this).text().split('=')[0]); + if ($(this).has(".deprecated").length) { + $(this).addClass('deprecated'); + }; + }); + // Add the value of the constant as "Tooltip" to the summary object + list.find('pre.code').each(function() { + console.log($(this).parent()); + var dt_element = $(this).parent().prev(); + var tooltip = $(this).text(); + if (dt_element.hasClass("deprecated")) { + tooltip = 'Deprecated. ' + tooltip; + }; + dt_element.attr('title', tooltip); + }); + list.find('.docstring, .tags, dd').remove(); + next.before(list); + next.toggle(); + } + }); + return false; + }); + if (localStorage.summaryCollapsed == "collapse") { + $('.constants_summary_toggle').first().click(); + } else { localStorage.summaryCollapsed = "expand"; } +} + +function generateTOC() { + if ($('#filecontents').length === 0) return; + var _toc = $('
          '); + var show = false; + var toc = _toc; + var counter = 0; + var tags = ['h2', 'h3', 'h4', 'h5', 'h6']; + var i; + var curli; + if ($('#filecontents h1').length > 1) tags.unshift('h1'); + for (i = 0; i < tags.length; i++) { tags[i] = '#filecontents ' + tags[i]; } + var lastTag = parseInt(tags[0][1], 10); + $(tags.join(', ')).each(function() { + if ($(this).parents('.method_details .docstring').length != 0) return; + if (this.id == "filecontents") return; + show = true; + var thisTag = parseInt(this.tagName[1], 10); + if (this.id.length === 0) { + var proposedId = $(this).attr('toc-id'); + if (typeof(proposedId) != "undefined") this.id = proposedId; + else { + var proposedId = $(this).text().replace(/[^a-z0-9-]/ig, '_'); + if ($('#' + proposedId).length > 0) { proposedId += counter; counter++; } + this.id = proposedId; + } + } + if (thisTag > lastTag) { + for (i = 0; i < thisTag - lastTag; i++) { + if ( typeof(curli) == "undefined" ) { + curli = $('
        1. '); + toc.append(curli); + } + toc = $('
            '); + curli.append(toc); + curli = undefined; + } + } + if (thisTag < lastTag) { + for (i = 0; i < lastTag - thisTag; i++) { + toc = toc.parent(); + toc = toc.parent(); + } + } + var title = $(this).attr('toc-title'); + if (typeof(title) == "undefined") title = $(this).text(); + curli =$('
          1. ' + title + '
          2. '); + toc.append(curli); + lastTag = thisTag; + }); + if (!show) return; + html = ''; + $('#content').prepend(html); + $('#toc').append(_toc); + $('#toc .hide_toc').toggle(function() { + $('#toc .top').slideUp('fast'); + $('#toc').toggleClass('hidden'); + $('#toc .title small').toggle(); + }, function() { + $('#toc .top').slideDown('fast'); + $('#toc').toggleClass('hidden'); + $('#toc .title small').toggle(); + }); +} + +function navResizeFn(e) { + if (e.which !== 1) { + navResizeFnStop(); + return; + } + + sessionStorage.navWidth = e.pageX.toString(); + $('.nav_wrap').css('width', e.pageX); + $('.nav_wrap').css('-ms-flex', 'inherit'); +} + +function navResizeFnStop() { + $(window).unbind('mousemove', navResizeFn); + window.removeEventListener('message', navMessageFn, false); +} + +function navMessageFn(e) { + if (e.data.action === 'mousemove') navResizeFn(e.data.event); + if (e.data.action === 'mouseup') navResizeFnStop(); +} + +function navResizer() { + $('#resizer').mousedown(function(e) { + e.preventDefault(); + $(window).mousemove(navResizeFn); + window.addEventListener('message', navMessageFn, false); + }); + $(window).mouseup(navResizeFnStop); + + if (sessionStorage.navWidth) { + navResizeFn({which: 1, pageX: parseInt(sessionStorage.navWidth, 10)}); + } +} + +function navExpander() { + var done = false, timer = setTimeout(postMessage, 500); + function postMessage() { + if (done) return; + clearTimeout(timer); + var opts = { action: 'expand', path: pathId }; + document.getElementById('nav').contentWindow.postMessage(opts, '*'); + done = true; + } + + window.addEventListener('message', function(event) { + if (event.data === 'navReady') postMessage(); + return false; + }, false); +} + +function mainFocus() { + var hash = window.location.hash; + if (hash !== '' && $(hash)[0]) { + $(hash)[0].scrollIntoView(); + } + + setTimeout(function() { $('#main').focus(); }, 10); +} + +function navigationChange() { + // This works around the broken anchor navigation with the YARD template. + window.onpopstate = function() { + var hash = window.location.hash; + if (hash !== '' && $(hash)[0]) { + $(hash)[0].scrollIntoView(); + } + }; +} + +$(document).ready(function() { + navResizer(); + navExpander(); + createSourceLinks(); + createDefineLinks(); + createFullTreeLinks(); + searchFrameButtons(); + linkSummaries(); + summaryToggle(); + constantSummaryToggle(); + generateTOC(); + mainFocus(); + navigationChange(); +}); + +})(); diff --git a/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/templates/default/fulldoc/html/js/full_list.js b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/templates/default/fulldoc/html/js/full_list.js new file mode 100644 index 000000000..59069c5e2 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/templates/default/fulldoc/html/js/full_list.js @@ -0,0 +1,216 @@ +(function() { + +var $clicked = $(null); +var searchTimeout = null; +var searchCache = []; +var caseSensitiveMatch = false; +var ignoreKeyCodeMin = 8; +var ignoreKeyCodeMax = 46; +var commandKey = 91; + +RegExp.escape = function(text) { + return text.replace(/[-[\]{}()*+?.,\\^$|#\s]/g, "\\$&"); +} + +function escapeShortcut() { + $(document).keydown(function(evt) { + if (evt.which == 27) { + window.parent.postMessage('navEscape', '*'); + } + }); +} + +function navResizer() { + $(window).mousemove(function(e) { + window.parent.postMessage({ + action: 'mousemove', event: {pageX: e.pageX, which: e.which} + }, '*'); + }).mouseup(function(e) { + window.parent.postMessage({action: 'mouseup'}, '*'); + }); + window.parent.postMessage("navReady", "*"); +} + +function clearSearchTimeout() { + clearTimeout(searchTimeout); + searchTimeout = null; +} + +function enableLinks() { + // load the target page in the parent window + $('#full_list li').on('click', function(evt) { + $('#full_list li').removeClass('clicked'); + $clicked = $(this); + $clicked.addClass('clicked'); + evt.stopPropagation(); + + if (evt.target.tagName === 'A') return true; + + var elem = $clicked.find('> .item .object_link a')[0]; + var e = evt.originalEvent; + var newEvent = new MouseEvent(evt.originalEvent.type); + newEvent.initMouseEvent(e.type, e.canBubble, e.cancelable, e.view, e.detail, e.screenX, e.screenY, e.clientX, e.clientY, e.ctrlKey, e.altKey, e.shiftKey, e.metaKey, e.button, e.relatedTarget); + elem.dispatchEvent(newEvent); + evt.preventDefault(); + return false; + }); +} + +function enableToggles() { + // show/hide nested classes on toggle click + $('#full_list a.toggle').on('click', function(evt) { + evt.stopPropagation(); + evt.preventDefault(); + $(this).parent().parent().toggleClass('collapsed'); + highlight(); + }); +} + +function populateSearchCache() { + $('#full_list li .item').each(function() { + var $node = $(this); + var $link = $node.find('.object_link a'); + if ($link.length > 0) { + searchCache.push({ + node: $node, + link: $link, + name: $link.text(), + fullName: $link.attr('title').split(' ')[0] + }); + } + }); +} + +function enableSearch() { + $('#search input').keyup(function(event) { + if (ignoredKeyPress(event)) return; + if (this.value === "") { + clearSearch(); + } else { + performSearch(this.value); + } + }); + + $('#full_list').after(""); +} + +function ignoredKeyPress(event) { + if ( + (event.keyCode > ignoreKeyCodeMin && event.keyCode < ignoreKeyCodeMax) || + (event.keyCode == commandKey) + ) { + return true; + } else { + return false; + } +} + +function clearSearch() { + clearSearchTimeout(); + $('#full_list .found').removeClass('found').each(function() { + var $link = $(this).find('.object_link a'); + $link.text($link.text()); + }); + $('#full_list, #content').removeClass('insearch'); + $clicked.parents().removeClass('collapsed'); + highlight(); +} + +function performSearch(searchString) { + clearSearchTimeout(); + $('#full_list, #content').addClass('insearch'); + $('#noresults').text('').hide(); + partialSearch(searchString, 0); +} + +function partialSearch(searchString, offset) { + var lastRowClass = ''; + var i = null; + for (i = offset; i < Math.min(offset + 50, searchCache.length); i++) { + var item = searchCache[i]; + var searchName = (searchString.indexOf('::') != -1 ? item.fullName : item.name); + var matchString = buildMatchString(searchString); + var matchRegexp = new RegExp(matchString, caseSensitiveMatch ? "" : "i"); + if (searchName.match(matchRegexp) == null) { + item.node.removeClass('found'); + item.link.text(item.link.text()); + } + else { + item.node.addClass('found'); + item.node.removeClass(lastRowClass).addClass(lastRowClass == 'r1' ? 'r2' : 'r1'); + lastRowClass = item.node.hasClass('r1') ? 'r1' : 'r2'; + item.link.html(item.name.replace(matchRegexp, "$&")); + } + } + if(i == searchCache.length) { + searchDone(); + } else { + searchTimeout = setTimeout(function() { + partialSearch(searchString, i); + }, 0); + } +} + +function searchDone() { + searchTimeout = null; + highlight(); + if ($('#full_list li:visible').size() === 0) { + $('#noresults').text('No results were found.').hide().fadeIn(); + } else { + $('#noresults').text('').hide(); + } + $('#content').removeClass('insearch'); +} + +function buildMatchString(searchString, event) { + caseSensitiveMatch = searchString.match(/[A-Z]/) != null; + var regexSearchString = RegExp.escape(searchString); + if (caseSensitiveMatch) { + regexSearchString += "|" + + $.map(searchString.split(''), function(e) { return RegExp.escape(e); }). + join('.+?'); + } + return regexSearchString; +} + +function highlight() { + $('#full_list li:visible').each(function(n) { + $(this).removeClass('even odd').addClass(n % 2 == 0 ? 'odd' : 'even'); + }); +} + +/** + * Expands the tree to the target element and its immediate + * children. + */ +function expandTo(path) { + var $target = $(document.getElementById('object_' + path)); + $target.addClass('clicked'); + $target.removeClass('collapsed'); + $target.parentsUntil('#full_list', 'li').removeClass('collapsed'); + if($target[0]) { + window.scrollTo(window.scrollX, $target.offset().top - 250); + highlight(); + } +} + +function windowEvents(event) { + var msg = event.data; + if (msg.action === "expand") { + expandTo(msg.path); + } + return false; +} + +window.addEventListener("message", windowEvents, false); + +$(document).ready(function() { + escapeShortcut(); + navResizer(); + enableLinks(); + enableToggles(); + populateSearchCache(); + enableSearch(); +}); + +})(); diff --git a/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/templates/default/fulldoc/html/js/jquery.js b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/templates/default/fulldoc/html/js/jquery.js new file mode 100644 index 000000000..198b3ff07 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/templates/default/fulldoc/html/js/jquery.js @@ -0,0 +1,4 @@ +/*! jQuery v1.7.1 jquery.com | jquery.org/license */ +(function(a,b){function cy(a){return f.isWindow(a)?a:a.nodeType===9?a.defaultView||a.parentWindow:!1}function cv(a){if(!ck[a]){var b=c.body,d=f("<"+a+">").appendTo(b),e=d.css("display");d.remove();if(e==="none"||e===""){cl||(cl=c.createElement("iframe"),cl.frameBorder=cl.width=cl.height=0),b.appendChild(cl);if(!cm||!cl.createElement)cm=(cl.contentWindow||cl.contentDocument).document,cm.write((c.compatMode==="CSS1Compat"?"":"")+""),cm.close();d=cm.createElement(a),cm.body.appendChild(d),e=f.css(d,"display"),b.removeChild(cl)}ck[a]=e}return ck[a]}function cu(a,b){var c={};f.each(cq.concat.apply([],cq.slice(0,b)),function(){c[this]=a});return c}function ct(){cr=b}function cs(){setTimeout(ct,0);return cr=f.now()}function cj(){try{return new a.ActiveXObject("Microsoft.XMLHTTP")}catch(b){}}function ci(){try{return new a.XMLHttpRequest}catch(b){}}function cc(a,c){a.dataFilter&&(c=a.dataFilter(c,a.dataType));var d=a.dataTypes,e={},g,h,i=d.length,j,k=d[0],l,m,n,o,p;for(g=1;g0){if(c!=="border")for(;g=0===c})}function S(a){return!a||!a.parentNode||a.parentNode.nodeType===11}function K(){return!0}function J(){return!1}function n(a,b,c){var d=b+"defer",e=b+"queue",g=b+"mark",h=f._data(a,d);h&&(c==="queue"||!f._data(a,e))&&(c==="mark"||!f._data(a,g))&&setTimeout(function(){!f._data(a,e)&&!f._data(a,g)&&(f.removeData(a,d,!0),h.fire())},0)}function m(a){for(var b in a){if(b==="data"&&f.isEmptyObject(a[b]))continue;if(b!=="toJSON")return!1}return!0}function l(a,c,d){if(d===b&&a.nodeType===1){var e="data-"+c.replace(k,"-$1").toLowerCase();d=a.getAttribute(e);if(typeof d=="string"){try{d=d==="true"?!0:d==="false"?!1:d==="null"?null:f.isNumeric(d)?parseFloat(d):j.test(d)?f.parseJSON(d):d}catch(g){}f.data(a,c,d)}else d=b}return d}function h(a){var b=g[a]={},c,d;a=a.split(/\s+/);for(c=0,d=a.length;c)[^>]*$|#([\w\-]*)$)/,j=/\S/,k=/^\s+/,l=/\s+$/,m=/^<(\w+)\s*\/?>(?:<\/\1>)?$/,n=/^[\],:{}\s]*$/,o=/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g,p=/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g,q=/(?:^|:|,)(?:\s*\[)+/g,r=/(webkit)[ \/]([\w.]+)/,s=/(opera)(?:.*version)?[ \/]([\w.]+)/,t=/(msie) ([\w.]+)/,u=/(mozilla)(?:.*? rv:([\w.]+))?/,v=/-([a-z]|[0-9])/ig,w=/^-ms-/,x=function(a,b){return(b+"").toUpperCase()},y=d.userAgent,z,A,B,C=Object.prototype.toString,D=Object.prototype.hasOwnProperty,E=Array.prototype.push,F=Array.prototype.slice,G=String.prototype.trim,H=Array.prototype.indexOf,I={};e.fn=e.prototype={constructor:e,init:function(a,d,f){var g,h,j,k;if(!a)return this;if(a.nodeType){this.context=this[0]=a,this.length=1;return this}if(a==="body"&&!d&&c.body){this.context=c,this[0]=c.body,this.selector=a,this.length=1;return this}if(typeof a=="string"){a.charAt(0)!=="<"||a.charAt(a.length-1)!==">"||a.length<3?g=i.exec(a):g=[null,a,null];if(g&&(g[1]||!d)){if(g[1]){d=d instanceof e?d[0]:d,k=d?d.ownerDocument||d:c,j=m.exec(a),j?e.isPlainObject(d)?(a=[c.createElement(j[1])],e.fn.attr.call(a,d,!0)):a=[k.createElement(j[1])]:(j=e.buildFragment([g[1]],[k]),a=(j.cacheable?e.clone(j.fragment):j.fragment).childNodes);return e.merge(this,a)}h=c.getElementById(g[2]);if(h&&h.parentNode){if(h.id!==g[2])return f.find(a);this.length=1,this[0]=h}this.context=c,this.selector=a;return this}return!d||d.jquery?(d||f).find(a):this.constructor(d).find(a)}if(e.isFunction(a))return f.ready(a);a.selector!==b&&(this.selector=a.selector,this.context=a.context);return e.makeArray(a,this)},selector:"",jquery:"1.7.1",length:0,size:function(){return this.length},toArray:function(){return F.call(this,0)},get:function(a){return a==null?this.toArray():a<0?this[this.length+a]:this[a]},pushStack:function(a,b,c){var d=this.constructor();e.isArray(a)?E.apply(d,a):e.merge(d,a),d.prevObject=this,d.context=this.context,b==="find"?d.selector=this.selector+(this.selector?" ":"")+c:b&&(d.selector=this.selector+"."+b+"("+c+")");return d},each:function(a,b){return e.each(this,a,b)},ready:function(a){e.bindReady(),A.add(a);return this},eq:function(a){a=+a;return a===-1?this.slice(a):this.slice(a,a+1)},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},slice:function(){return this.pushStack(F.apply(this,arguments),"slice",F.call(arguments).join(","))},map:function(a){return this.pushStack(e.map(this,function(b,c){return a.call(b,c,b)}))},end:function(){return this.prevObject||this.constructor(null)},push:E,sort:[].sort,splice:[].splice},e.fn.init.prototype=e.fn,e.extend=e.fn.extend=function(){var a,c,d,f,g,h,i=arguments[0]||{},j=1,k=arguments.length,l=!1;typeof i=="boolean"&&(l=i,i=arguments[1]||{},j=2),typeof i!="object"&&!e.isFunction(i)&&(i={}),k===j&&(i=this,--j);for(;j0)return;A.fireWith(c,[e]),e.fn.trigger&&e(c).trigger("ready").off("ready")}},bindReady:function(){if(!A){A=e.Callbacks("once memory");if(c.readyState==="complete")return setTimeout(e.ready,1);if(c.addEventListener)c.addEventListener("DOMContentLoaded",B,!1),a.addEventListener("load",e.ready,!1);else if(c.attachEvent){c.attachEvent("onreadystatechange",B),a.attachEvent("onload",e.ready);var b=!1;try{b=a.frameElement==null}catch(d){}c.documentElement.doScroll&&b&&J()}}},isFunction:function(a){return e.type(a)==="function"},isArray:Array.isArray||function(a){return e.type(a)==="array"},isWindow:function(a){return a&&typeof a=="object"&&"setInterval"in a},isNumeric:function(a){return!isNaN(parseFloat(a))&&isFinite(a)},type:function(a){return a==null?String(a):I[C.call(a)]||"object"},isPlainObject:function(a){if(!a||e.type(a)!=="object"||a.nodeType||e.isWindow(a))return!1;try{if(a.constructor&&!D.call(a,"constructor")&&!D.call(a.constructor.prototype,"isPrototypeOf"))return!1}catch(c){return!1}var d;for(d in a);return d===b||D.call(a,d)},isEmptyObject:function(a){for(var b in a)return!1;return!0},error:function(a){throw new Error(a)},parseJSON:function(b){if(typeof b!="string"||!b)return null;b=e.trim(b);if(a.JSON&&a.JSON.parse)return a.JSON.parse(b);if(n.test(b.replace(o,"@").replace(p,"]").replace(q,"")))return(new Function("return "+b))();e.error("Invalid JSON: "+b)},parseXML:function(c){var d,f;try{a.DOMParser?(f=new DOMParser,d=f.parseFromString(c,"text/xml")):(d=new ActiveXObject("Microsoft.XMLDOM"),d.async="false",d.loadXML(c))}catch(g){d=b}(!d||!d.documentElement||d.getElementsByTagName("parsererror").length)&&e.error("Invalid XML: "+c);return d},noop:function(){},globalEval:function(b){b&&j.test(b)&&(a.execScript||function(b){a.eval.call(a,b)})(b)},camelCase:function(a){return a.replace(w,"ms-").replace(v,x)},nodeName:function(a,b){return a.nodeName&&a.nodeName.toUpperCase()===b.toUpperCase()},each:function(a,c,d){var f,g=0,h=a.length,i=h===b||e.isFunction(a);if(d){if(i){for(f in a)if(c.apply(a[f],d)===!1)break}else for(;g0&&a[0]&&a[j-1]||j===0||e.isArray(a));if(k)for(;i1?i.call(arguments,0):b,j.notifyWith(k,e)}}function l(a){return function(c){b[a]=arguments.length>1?i.call(arguments,0):c,--g||j.resolveWith(j,b)}}var b=i.call(arguments,0),c=0,d=b.length,e=Array(d),g=d,h=d,j=d<=1&&a&&f.isFunction(a.promise)?a:f.Deferred(),k=j.promise();if(d>1){for(;c
      a",d=q.getElementsByTagName("*"),e=q.getElementsByTagName("a")[0];if(!d||!d.length||!e)return{};g=c.createElement("select"),h=g.appendChild(c.createElement("option")),i=q.getElementsByTagName("input")[0],b={leadingWhitespace:q.firstChild.nodeType===3,tbody:!q.getElementsByTagName("tbody").length,htmlSerialize:!!q.getElementsByTagName("link").length,style:/top/.test(e.getAttribute("style")),hrefNormalized:e.getAttribute("href")==="/a",opacity:/^0.55/.test(e.style.opacity),cssFloat:!!e.style.cssFloat,checkOn:i.value==="on",optSelected:h.selected,getSetAttribute:q.className!=="t",enctype:!!c.createElement("form").enctype,html5Clone:c.createElement("nav").cloneNode(!0).outerHTML!=="<:nav>",submitBubbles:!0,changeBubbles:!0,focusinBubbles:!1,deleteExpando:!0,noCloneEvent:!0,inlineBlockNeedsLayout:!1,shrinkWrapBlocks:!1,reliableMarginRight:!0},i.checked=!0,b.noCloneChecked=i.cloneNode(!0).checked,g.disabled=!0,b.optDisabled=!h.disabled;try{delete q.test}catch(s){b.deleteExpando=!1}!q.addEventListener&&q.attachEvent&&q.fireEvent&&(q.attachEvent("onclick",function(){b.noCloneEvent=!1}),q.cloneNode(!0).fireEvent("onclick")),i=c.createElement("input"),i.value="t",i.setAttribute("type","radio"),b.radioValue=i.value==="t",i.setAttribute("checked","checked"),q.appendChild(i),k=c.createDocumentFragment(),k.appendChild(q.lastChild),b.checkClone=k.cloneNode(!0).cloneNode(!0).lastChild.checked,b.appendChecked=i.checked,k.removeChild(i),k.appendChild(q),q.innerHTML="",a.getComputedStyle&&(j=c.createElement("div"),j.style.width="0",j.style.marginRight="0",q.style.width="2px",q.appendChild(j),b.reliableMarginRight=(parseInt((a.getComputedStyle(j,null)||{marginRight:0}).marginRight,10)||0)===0);if(q.attachEvent)for(o in{submit:1,change:1,focusin:1})n="on"+o,p=n in q,p||(q.setAttribute(n,"return;"),p=typeof q[n]=="function"),b[o+"Bubbles"]=p;k.removeChild(q),k=g=h=j=q=i=null,f(function(){var a,d,e,g,h,i,j,k,m,n,o,r=c.getElementsByTagName("body")[0];!r||(j=1,k="position:absolute;top:0;left:0;width:1px;height:1px;margin:0;",m="visibility:hidden;border:0;",n="style='"+k+"border:5px solid #000;padding:0;'",o="
      "+""+"
      ",a=c.createElement("div"),a.style.cssText=m+"width:0;height:0;position:static;top:0;margin-top:"+j+"px",r.insertBefore(a,r.firstChild),q=c.createElement("div"),a.appendChild(q),q.innerHTML="
      t
      ",l=q.getElementsByTagName("td"),p=l[0].offsetHeight===0,l[0].style.display="",l[1].style.display="none",b.reliableHiddenOffsets=p&&l[0].offsetHeight===0,q.innerHTML="",q.style.width=q.style.paddingLeft="1px",f.boxModel=b.boxModel=q.offsetWidth===2,typeof q.style.zoom!="undefined"&&(q.style.display="inline",q.style.zoom=1,b.inlineBlockNeedsLayout=q.offsetWidth===2,q.style.display="",q.innerHTML="
      ",b.shrinkWrapBlocks=q.offsetWidth!==2),q.style.cssText=k+m,q.innerHTML=o,d=q.firstChild,e=d.firstChild,h=d.nextSibling.firstChild.firstChild,i={doesNotAddBorder:e.offsetTop!==5,doesAddBorderForTableAndCells:h.offsetTop===5},e.style.position="fixed",e.style.top="20px",i.fixedPosition=e.offsetTop===20||e.offsetTop===15,e.style.position=e.style.top="",d.style.overflow="hidden",d.style.position="relative",i.subtractsBorderForOverflowNotVisible=e.offsetTop===-5,i.doesNotIncludeMarginInBodyOffset=r.offsetTop!==j,r.removeChild(a),q=a=null,f.extend(b,i))});return b}();var j=/^(?:\{.*\}|\[.*\])$/,k=/([A-Z])/g;f.extend({cache:{},uuid:0,expando:"jQuery"+(f.fn.jquery+Math.random()).replace(/\D/g,""),noData:{embed:!0,object:"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000",applet:!0},hasData:function(a){a=a.nodeType?f.cache[a[f.expando]]:a[f.expando];return!!a&&!m(a)},data:function(a,c,d,e){if(!!f.acceptData(a)){var g,h,i,j=f.expando,k=typeof c=="string",l=a.nodeType,m=l?f.cache:a,n=l?a[j]:a[j]&&j,o=c==="events";if((!n||!m[n]||!o&&!e&&!m[n].data)&&k&&d===b)return;n||(l?a[j]=n=++f.uuid:n=j),m[n]||(m[n]={},l||(m[n].toJSON=f.noop));if(typeof c=="object"||typeof c=="function")e?m[n]=f.extend(m[n],c):m[n].data=f.extend(m[n].data,c);g=h=m[n],e||(h.data||(h.data={}),h=h.data),d!==b&&(h[f.camelCase(c)]=d);if(o&&!h[c])return g.events;k?(i=h[c],i==null&&(i=h[f.camelCase(c)])):i=h;return i}},removeData:function(a,b,c){if(!!f.acceptData(a)){var d,e,g,h=f.expando,i=a.nodeType,j=i?f.cache:a,k=i?a[h]:h;if(!j[k])return;if(b){d=c?j[k]:j[k].data;if(d){f.isArray(b)||(b in d?b=[b]:(b=f.camelCase(b),b in d?b=[b]:b=b.split(" ")));for(e=0,g=b.length;e-1)return!0;return!1},val:function(a){var c,d,e,g=this[0];{if(!!arguments.length){e=f.isFunction(a);return this.each(function(d){var g=f(this),h;if(this.nodeType===1){e?h=a.call(this,d,g.val()):h=a,h==null?h="":typeof h=="number"?h+="":f.isArray(h)&&(h=f.map(h,function(a){return a==null?"":a+""})),c=f.valHooks[this.nodeName.toLowerCase()]||f.valHooks[this.type];if(!c||!("set"in c)||c.set(this,h,"value")===b)this.value=h}})}if(g){c=f.valHooks[g.nodeName.toLowerCase()]||f.valHooks[g.type];if(c&&"get"in c&&(d=c.get(g,"value"))!==b)return d;d=g.value;return typeof d=="string"?d.replace(q,""):d==null?"":d}}}}),f.extend({valHooks:{option:{get:function(a){var b=a.attributes.value;return!b||b.specified?a.value:a.text}},select:{get:function(a){var b,c,d,e,g=a.selectedIndex,h=[],i=a.options,j=a.type==="select-one";if(g<0)return null;c=j?g:0,d=j?g+1:i.length;for(;c=0}),c.length||(a.selectedIndex=-1);return c}}},attrFn:{val:!0,css:!0,html:!0,text:!0,data:!0,width:!0,height:!0,offset:!0},attr:function(a,c,d,e){var g,h,i,j=a.nodeType;if(!!a&&j!==3&&j!==8&&j!==2){if(e&&c in f.attrFn)return f(a)[c](d);if(typeof a.getAttribute=="undefined")return f.prop(a,c,d);i=j!==1||!f.isXMLDoc(a),i&&(c=c.toLowerCase(),h=f.attrHooks[c]||(u.test(c)?x:w));if(d!==b){if(d===null){f.removeAttr(a,c);return}if(h&&"set"in h&&i&&(g=h.set(a,d,c))!==b)return g;a.setAttribute(c,""+d);return d}if(h&&"get"in h&&i&&(g=h.get(a,c))!==null)return g;g=a.getAttribute(c);return g===null?b:g}},removeAttr:function(a,b){var c,d,e,g,h=0;if(b&&a.nodeType===1){d=b.toLowerCase().split(p),g=d.length;for(;h=0}})});var z=/^(?:textarea|input|select)$/i,A=/^([^\.]*)?(?:\.(.+))?$/,B=/\bhover(\.\S+)?\b/,C=/^key/,D=/^(?:mouse|contextmenu)|click/,E=/^(?:focusinfocus|focusoutblur)$/,F=/^(\w*)(?:#([\w\-]+))?(?:\.([\w\-]+))?$/,G=function(a){var b=F.exec(a);b&&(b[1]=(b[1]||"").toLowerCase(),b[3]=b[3]&&new RegExp("(?:^|\\s)"+b[3]+"(?:\\s|$)"));return b},H=function(a,b){var c=a.attributes||{};return(!b[1]||a.nodeName.toLowerCase()===b[1])&&(!b[2]||(c.id||{}).value===b[2])&&(!b[3]||b[3].test((c["class"]||{}).value))},I=function(a){return f.event.special.hover?a:a.replace(B,"mouseenter$1 mouseleave$1")}; +f.event={add:function(a,c,d,e,g){var h,i,j,k,l,m,n,o,p,q,r,s;if(!(a.nodeType===3||a.nodeType===8||!c||!d||!(h=f._data(a)))){d.handler&&(p=d,d=p.handler),d.guid||(d.guid=f.guid++),j=h.events,j||(h.events=j={}),i=h.handle,i||(h.handle=i=function(a){return typeof f!="undefined"&&(!a||f.event.triggered!==a.type)?f.event.dispatch.apply(i.elem,arguments):b},i.elem=a),c=f.trim(I(c)).split(" ");for(k=0;k=0&&(h=h.slice(0,-1),k=!0),h.indexOf(".")>=0&&(i=h.split("."),h=i.shift(),i.sort());if((!e||f.event.customEvent[h])&&!f.event.global[h])return;c=typeof c=="object"?c[f.expando]?c:new f.Event(h,c):new f.Event(h),c.type=h,c.isTrigger=!0,c.exclusive=k,c.namespace=i.join("."),c.namespace_re=c.namespace?new RegExp("(^|\\.)"+i.join("\\.(?:.*\\.)?")+"(\\.|$)"):null,o=h.indexOf(":")<0?"on"+h:"";if(!e){j=f.cache;for(l in j)j[l].events&&j[l].events[h]&&f.event.trigger(c,d,j[l].handle.elem,!0);return}c.result=b,c.target||(c.target=e),d=d!=null?f.makeArray(d):[],d.unshift(c),p=f.event.special[h]||{};if(p.trigger&&p.trigger.apply(e,d)===!1)return;r=[[e,p.bindType||h]];if(!g&&!p.noBubble&&!f.isWindow(e)){s=p.delegateType||h,m=E.test(s+h)?e:e.parentNode,n=null;for(;m;m=m.parentNode)r.push([m,s]),n=m;n&&n===e.ownerDocument&&r.push([n.defaultView||n.parentWindow||a,s])}for(l=0;le&&i.push({elem:this,matches:d.slice(e)});for(j=0;j0?this.on(b,null,a,c):this.trigger(b)},f.attrFn&&(f.attrFn[b]=!0),C.test(b)&&(f.event.fixHooks[b]=f.event.keyHooks),D.test(b)&&(f.event.fixHooks[b]=f.event.mouseHooks)}),function(){function x(a,b,c,e,f,g){for(var h=0,i=e.length;h0){k=j;break}}j=j[a]}e[h]=k}}}function w(a,b,c,e,f,g){for(var h=0,i=e.length;h+~,(\[\\]+)+|[>+~])(\s*,\s*)?((?:.|\r|\n)*)/g,d="sizcache"+(Math.random()+"").replace(".",""),e=0,g=Object.prototype.toString,h=!1,i=!0,j=/\\/g,k=/\r\n/g,l=/\W/;[0,0].sort(function(){i=!1;return 0});var m=function(b,d,e,f){e=e||[],d=d||c;var h=d;if(d.nodeType!==1&&d.nodeType!==9)return[];if(!b||typeof b!="string")return e;var i,j,k,l,n,q,r,t,u=!0,v=m.isXML(d),w=[],x=b;do{a.exec(""),i=a.exec(x);if(i){x=i[3],w.push(i[1]);if(i[2]){l=i[3];break}}}while(i);if(w.length>1&&p.exec(b))if(w.length===2&&o.relative[w[0]])j=y(w[0]+w[1],d,f);else{j=o.relative[w[0]]?[d]:m(w.shift(),d);while(w.length)b=w.shift(),o.relative[b]&&(b+=w.shift()),j=y(b,j,f)}else{!f&&w.length>1&&d.nodeType===9&&!v&&o.match.ID.test(w[0])&&!o.match.ID.test(w[w.length-1])&&(n=m.find(w.shift(),d,v),d=n.expr?m.filter(n.expr,n.set)[0]:n.set[0]);if(d){n=f?{expr:w.pop(),set:s(f)}:m.find(w.pop(),w.length===1&&(w[0]==="~"||w[0]==="+")&&d.parentNode?d.parentNode:d,v),j=n.expr?m.filter(n.expr,n.set):n.set,w.length>0?k=s(j):u=!1;while(w.length)q=w.pop(),r=q,o.relative[q]?r=w.pop():q="",r==null&&(r=d),o.relative[q](k,r,v)}else k=w=[]}k||(k=j),k||m.error(q||b);if(g.call(k)==="[object Array]")if(!u)e.push.apply(e,k);else if(d&&d.nodeType===1)for(t=0;k[t]!=null;t++)k[t]&&(k[t]===!0||k[t].nodeType===1&&m.contains(d,k[t]))&&e.push(j[t]);else for(t=0;k[t]!=null;t++)k[t]&&k[t].nodeType===1&&e.push(j[t]);else s(k,e);l&&(m(l,h,e,f),m.uniqueSort(e));return e};m.uniqueSort=function(a){if(u){h=i,a.sort(u);if(h)for(var b=1;b0},m.find=function(a,b,c){var d,e,f,g,h,i;if(!a)return[];for(e=0,f=o.order.length;e":function(a,b){var c,d=typeof b=="string",e=0,f=a.length;if(d&&!l.test(b)){b=b.toLowerCase();for(;e=0)?c||d.push(h):c&&(b[g]=!1));return!1},ID:function(a){return a[1].replace(j,"")},TAG:function(a,b){return a[1].replace(j,"").toLowerCase()},CHILD:function(a){if(a[1]==="nth"){a[2]||m.error(a[0]),a[2]=a[2].replace(/^\+|\s*/g,"");var b=/(-?)(\d*)(?:n([+\-]?\d*))?/.exec(a[2]==="even"&&"2n"||a[2]==="odd"&&"2n+1"||!/\D/.test(a[2])&&"0n+"+a[2]||a[2]);a[2]=b[1]+(b[2]||1)-0,a[3]=b[3]-0}else a[2]&&m.error(a[0]);a[0]=e++;return a},ATTR:function(a,b,c,d,e,f){var g=a[1]=a[1].replace(j,"");!f&&o.attrMap[g]&&(a[1]=o.attrMap[g]),a[4]=(a[4]||a[5]||"").replace(j,""),a[2]==="~="&&(a[4]=" "+a[4]+" ");return a},PSEUDO:function(b,c,d,e,f){if(b[1]==="not")if((a.exec(b[3])||"").length>1||/^\w/.test(b[3]))b[3]=m(b[3],null,null,c);else{var g=m.filter(b[3],c,d,!0^f);d||e.push.apply(e,g);return!1}else if(o.match.POS.test(b[0])||o.match.CHILD.test(b[0]))return!0;return b},POS:function(a){a.unshift(!0);return a}},filters:{enabled:function(a){return a.disabled===!1&&a.type!=="hidden"},disabled:function(a){return a.disabled===!0},checked:function(a){return a.checked===!0},selected:function(a){a.parentNode&&a.parentNode.selectedIndex;return a.selected===!0},parent:function(a){return!!a.firstChild},empty:function(a){return!a.firstChild},has:function(a,b,c){return!!m(c[3],a).length},header:function(a){return/h\d/i.test(a.nodeName)},text:function(a){var b=a.getAttribute("type"),c=a.type;return a.nodeName.toLowerCase()==="input"&&"text"===c&&(b===c||b===null)},radio:function(a){return a.nodeName.toLowerCase()==="input"&&"radio"===a.type},checkbox:function(a){return a.nodeName.toLowerCase()==="input"&&"checkbox"===a.type},file:function(a){return a.nodeName.toLowerCase()==="input"&&"file"===a.type},password:function(a){return a.nodeName.toLowerCase()==="input"&&"password"===a.type},submit:function(a){var b=a.nodeName.toLowerCase();return(b==="input"||b==="button")&&"submit"===a.type},image:function(a){return a.nodeName.toLowerCase()==="input"&&"image"===a.type},reset:function(a){var b=a.nodeName.toLowerCase();return(b==="input"||b==="button")&&"reset"===a.type},button:function(a){var b=a.nodeName.toLowerCase();return b==="input"&&"button"===a.type||b==="button"},input:function(a){return/input|select|textarea|button/i.test(a.nodeName)},focus:function(a){return a===a.ownerDocument.activeElement}},setFilters:{first:function(a,b){return b===0},last:function(a,b,c,d){return b===d.length-1},even:function(a,b){return b%2===0},odd:function(a,b){return b%2===1},lt:function(a,b,c){return bc[3]-0},nth:function(a,b,c){return c[3]-0===b},eq:function(a,b,c){return c[3]-0===b}},filter:{PSEUDO:function(a,b,c,d){var e=b[1],f=o.filters[e];if(f)return f(a,c,b,d);if(e==="contains")return(a.textContent||a.innerText||n([a])||"").indexOf(b[3])>=0;if(e==="not"){var g=b[3];for(var h=0,i=g.length;h=0}},ID:function(a,b){return a.nodeType===1&&a.getAttribute("id")===b},TAG:function(a,b){return b==="*"&&a.nodeType===1||!!a.nodeName&&a.nodeName.toLowerCase()===b},CLASS:function(a,b){return(" "+(a.className||a.getAttribute("class"))+" ").indexOf(b)>-1},ATTR:function(a,b){var c=b[1],d=m.attr?m.attr(a,c):o.attrHandle[c]?o.attrHandle[c](a):a[c]!=null?a[c]:a.getAttribute(c),e=d+"",f=b[2],g=b[4];return d==null?f==="!=":!f&&m.attr?d!=null:f==="="?e===g:f==="*="?e.indexOf(g)>=0:f==="~="?(" "+e+" ").indexOf(g)>=0:g?f==="!="?e!==g:f==="^="?e.indexOf(g)===0:f==="$="?e.substr(e.length-g.length)===g:f==="|="?e===g||e.substr(0,g.length+1)===g+"-":!1:e&&d!==!1},POS:function(a,b,c,d){var e=b[2],f=o.setFilters[e];if(f)return f(a,c,b,d)}}},p=o.match.POS,q=function(a,b){return"\\"+(b-0+1)};for(var r in o.match)o.match[r]=new RegExp(o.match[r].source+/(?![^\[]*\])(?![^\(]*\))/.source),o.leftMatch[r]=new RegExp(/(^(?:.|\r|\n)*?)/.source+o.match[r].source.replace(/\\(\d+)/g,q));var s=function(a,b){a=Array.prototype.slice.call(a,0);if(b){b.push.apply(b,a);return b}return a};try{Array.prototype.slice.call(c.documentElement.childNodes,0)[0].nodeType}catch(t){s=function(a,b){var c=0,d=b||[];if(g.call(a)==="[object Array]")Array.prototype.push.apply(d,a);else if(typeof a.length=="number")for(var e=a.length;c",e.insertBefore(a,e.firstChild),c.getElementById(d)&&(o.find.ID=function(a,c,d){if(typeof c.getElementById!="undefined"&&!d){var e=c.getElementById(a[1]);return e?e.id===a[1]||typeof e.getAttributeNode!="undefined"&&e.getAttributeNode("id").nodeValue===a[1]?[e]:b:[]}},o.filter.ID=function(a,b){var c=typeof a.getAttributeNode!="undefined"&&a.getAttributeNode("id");return a.nodeType===1&&c&&c.nodeValue===b}),e.removeChild(a),e=a=null}(),function(){var a=c.createElement("div");a.appendChild(c.createComment("")),a.getElementsByTagName("*").length>0&&(o.find.TAG=function(a,b){var c=b.getElementsByTagName(a[1]);if(a[1]==="*"){var d=[];for(var e=0;c[e];e++)c[e].nodeType===1&&d.push(c[e]);c=d}return c}),a.innerHTML="",a.firstChild&&typeof a.firstChild.getAttribute!="undefined"&&a.firstChild.getAttribute("href")!=="#"&&(o.attrHandle.href=function(a){return a.getAttribute("href",2)}),a=null}(),c.querySelectorAll&&function(){var a=m,b=c.createElement("div"),d="__sizzle__";b.innerHTML="

      ";if(!b.querySelectorAll||b.querySelectorAll(".TEST").length!==0){m=function(b,e,f,g){e=e||c;if(!g&&!m.isXML(e)){var h=/^(\w+$)|^\.([\w\-]+$)|^#([\w\-]+$)/.exec(b);if(h&&(e.nodeType===1||e.nodeType===9)){if(h[1])return s(e.getElementsByTagName(b),f);if(h[2]&&o.find.CLASS&&e.getElementsByClassName)return s(e.getElementsByClassName(h[2]),f)}if(e.nodeType===9){if(b==="body"&&e.body)return s([e.body],f);if(h&&h[3]){var i=e.getElementById(h[3]);if(!i||!i.parentNode)return s([],f);if(i.id===h[3])return s([i],f)}try{return s(e.querySelectorAll(b),f)}catch(j){}}else if(e.nodeType===1&&e.nodeName.toLowerCase()!=="object"){var k=e,l=e.getAttribute("id"),n=l||d,p=e.parentNode,q=/^\s*[+~]/.test(b);l?n=n.replace(/'/g,"\\$&"):e.setAttribute("id",n),q&&p&&(e=e.parentNode);try{if(!q||p)return s(e.querySelectorAll("[id='"+n+"'] "+b),f)}catch(r){}finally{l||k.removeAttribute("id")}}}return a(b,e,f,g)};for(var e in a)m[e]=a[e];b=null}}(),function(){var a=c.documentElement,b=a.matchesSelector||a.mozMatchesSelector||a.webkitMatchesSelector||a.msMatchesSelector;if(b){var d=!b.call(c.createElement("div"),"div"),e=!1;try{b.call(c.documentElement,"[test!='']:sizzle")}catch(f){e=!0}m.matchesSelector=function(a,c){c=c.replace(/\=\s*([^'"\]]*)\s*\]/g,"='$1']");if(!m.isXML(a))try{if(e||!o.match.PSEUDO.test(c)&&!/!=/.test(c)){var f=b.call(a,c);if(f||!d||a.document&&a.document.nodeType!==11)return f}}catch(g){}return m(c,null,null,[a]).length>0}}}(),function(){var a=c.createElement("div");a.innerHTML="
      ";if(!!a.getElementsByClassName&&a.getElementsByClassName("e").length!==0){a.lastChild.className="e";if(a.getElementsByClassName("e").length===1)return;o.order.splice(1,0,"CLASS"),o.find.CLASS=function(a,b,c){if(typeof b.getElementsByClassName!="undefined"&&!c)return b.getElementsByClassName(a[1])},a=null}}(),c.documentElement.contains?m.contains=function(a,b){return a!==b&&(a.contains?a.contains(b):!0)}:c.documentElement.compareDocumentPosition?m.contains=function(a,b){return!!(a.compareDocumentPosition(b)&16)}:m.contains=function(){return!1},m.isXML=function(a){var b=(a?a.ownerDocument||a:0).documentElement;return b?b.nodeName!=="HTML":!1};var y=function(a,b,c){var d,e=[],f="",g=b.nodeType?[b]:b;while(d=o.match.PSEUDO.exec(a))f+=d[0],a=a.replace(o.match.PSEUDO,"");a=o.relative[a]?a+"*":a;for(var h=0,i=g.length;h0)for(h=g;h=0:f.filter(a,this).length>0:this.filter(a).length>0)},closest:function(a,b){var c=[],d,e,g=this[0];if(f.isArray(a)){var h=1;while(g&&g.ownerDocument&&g!==b){for(d=0;d-1:f.find.matchesSelector(g,a)){c.push(g);break}g=g.parentNode;if(!g||!g.ownerDocument||g===b||g.nodeType===11)break}}c=c.length>1?f.unique(c):c;return this.pushStack(c,"closest",a)},index:function(a){if(!a)return this[0]&&this[0].parentNode?this.prevAll().length:-1;if(typeof a=="string")return f.inArray(this[0],f(a));return f.inArray(a.jquery?a[0]:a,this)},add:function(a,b){var c=typeof a=="string"?f(a,b):f.makeArray(a&&a.nodeType?[a]:a),d=f.merge(this.get(),c);return this.pushStack(S(c[0])||S(d[0])?d:f.unique(d))},andSelf:function(){return this.add(this.prevObject)}}),f.each({parent:function(a){var b=a.parentNode;return b&&b.nodeType!==11?b:null},parents:function(a){return f.dir(a,"parentNode")},parentsUntil:function(a,b,c){return f.dir(a,"parentNode",c)},next:function(a){return f.nth(a,2,"nextSibling")},prev:function(a){return f.nth(a,2,"previousSibling")},nextAll:function(a){return f.dir(a,"nextSibling")},prevAll:function(a){return f.dir(a,"previousSibling")},nextUntil:function(a,b,c){return f.dir(a,"nextSibling",c)},prevUntil:function(a,b,c){return f.dir(a,"previousSibling",c)},siblings:function(a){return f.sibling(a.parentNode.firstChild,a)},children:function(a){return f.sibling(a.firstChild)},contents:function(a){return f.nodeName(a,"iframe")?a.contentDocument||a.contentWindow.document:f.makeArray(a.childNodes)}},function(a,b){f.fn[a]=function(c,d){var e=f.map(this,b,c);L.test(a)||(d=c),d&&typeof d=="string"&&(e=f.filter(d,e)),e=this.length>1&&!R[a]?f.unique(e):e,(this.length>1||N.test(d))&&M.test(a)&&(e=e.reverse());return this.pushStack(e,a,P.call(arguments).join(","))}}),f.extend({filter:function(a,b,c){c&&(a=":not("+a+")");return b.length===1?f.find.matchesSelector(b[0],a)?[b[0]]:[]:f.find.matches(a,b)},dir:function(a,c,d){var e=[],g=a[c];while(g&&g.nodeType!==9&&(d===b||g.nodeType!==1||!f(g).is(d)))g.nodeType===1&&e.push(g),g=g[c];return e},nth:function(a,b,c,d){b=b||1;var e=0;for(;a;a=a[c])if(a.nodeType===1&&++e===b)break;return a},sibling:function(a,b){var c=[];for(;a;a=a.nextSibling)a.nodeType===1&&a!==b&&c.push(a);return c}});var V="abbr|article|aside|audio|canvas|datalist|details|figcaption|figure|footer|header|hgroup|mark|meter|nav|output|progress|section|summary|time|video",W=/ jQuery\d+="(?:\d+|null)"/g,X=/^\s+/,Y=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/ig,Z=/<([\w:]+)/,$=/",""],legend:[1,"
      ","
      "],thead:[1,"","
      "],tr:[2,"","
      "],td:[3,"","
      "],col:[2,"","
      "],area:[1,"",""],_default:[0,"",""]},bh=U(c);bg.optgroup=bg.option,bg.tbody=bg.tfoot=bg.colgroup=bg.caption=bg.thead,bg.th=bg.td,f.support.htmlSerialize||(bg._default=[1,"div
      ","
      "]),f.fn.extend({text:function(a){if(f.isFunction(a))return this.each(function(b){var c=f(this);c.text(a.call(this,b,c.text()))});if(typeof a!="object"&&a!==b)return this.empty().append((this[0]&&this[0].ownerDocument||c).createTextNode(a));return f.text(this)},wrapAll:function(a){if(f.isFunction(a))return this.each(function(b){f(this).wrapAll(a.call(this,b))});if(this[0]){var b=f(a,this[0].ownerDocument).eq(0).clone(!0);this[0].parentNode&&b.insertBefore(this[0]),b.map(function(){var a=this;while(a.firstChild&&a.firstChild.nodeType===1)a=a.firstChild;return a}).append(this)}return this},wrapInner:function(a){if(f.isFunction(a))return this.each(function(b){f(this).wrapInner(a.call(this,b))});return this.each(function(){var b=f(this),c=b.contents();c.length?c.wrapAll(a):b.append(a)})},wrap:function(a){var b=f.isFunction(a);return this.each(function(c){f(this).wrapAll(b?a.call(this,c):a)})},unwrap:function(){return this.parent().each(function(){f.nodeName(this,"body")||f(this).replaceWith(this.childNodes)}).end()},append:function(){return this.domManip(arguments,!0,function(a){this.nodeType===1&&this.appendChild(a)})},prepend:function(){return this.domManip(arguments,!0,function(a){this.nodeType===1&&this.insertBefore(a,this.firstChild)})},before:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,!1,function(a){this.parentNode.insertBefore(a,this)});if(arguments.length){var a=f.clean(arguments);a.push.apply(a,this.toArray());return this.pushStack(a,"before",arguments)}},after:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,!1,function(a){this.parentNode.insertBefore(a,this.nextSibling)});if(arguments.length){var a=this.pushStack(this,"after",arguments);a.push.apply(a,f.clean(arguments));return a}},remove:function(a,b){for(var c=0,d;(d=this[c])!=null;c++)if(!a||f.filter(a,[d]).length)!b&&d.nodeType===1&&(f.cleanData(d.getElementsByTagName("*")),f.cleanData([d])),d.parentNode&&d.parentNode.removeChild(d);return this},empty:function() +{for(var a=0,b;(b=this[a])!=null;a++){b.nodeType===1&&f.cleanData(b.getElementsByTagName("*"));while(b.firstChild)b.removeChild(b.firstChild)}return this},clone:function(a,b){a=a==null?!1:a,b=b==null?a:b;return this.map(function(){return f.clone(this,a,b)})},html:function(a){if(a===b)return this[0]&&this[0].nodeType===1?this[0].innerHTML.replace(W,""):null;if(typeof a=="string"&&!ba.test(a)&&(f.support.leadingWhitespace||!X.test(a))&&!bg[(Z.exec(a)||["",""])[1].toLowerCase()]){a=a.replace(Y,"<$1>");try{for(var c=0,d=this.length;c1&&l0?this.clone(!0):this).get();f(e[h])[b](j),d=d.concat(j)}return this.pushStack(d,a,e.selector)}}),f.extend({clone:function(a,b,c){var d,e,g,h=f.support.html5Clone||!bc.test("<"+a.nodeName)?a.cloneNode(!0):bo(a);if((!f.support.noCloneEvent||!f.support.noCloneChecked)&&(a.nodeType===1||a.nodeType===11)&&!f.isXMLDoc(a)){bk(a,h),d=bl(a),e=bl(h);for(g=0;d[g];++g)e[g]&&bk(d[g],e[g])}if(b){bj(a,h);if(c){d=bl(a),e=bl(h);for(g=0;d[g];++g)bj(d[g],e[g])}}d=e=null;return h},clean:function(a,b,d,e){var g;b=b||c,typeof b.createElement=="undefined"&&(b=b.ownerDocument||b[0]&&b[0].ownerDocument||c);var h=[],i;for(var j=0,k;(k=a[j])!=null;j++){typeof k=="number"&&(k+="");if(!k)continue;if(typeof k=="string")if(!_.test(k))k=b.createTextNode(k);else{k=k.replace(Y,"<$1>");var l=(Z.exec(k)||["",""])[1].toLowerCase(),m=bg[l]||bg._default,n=m[0],o=b.createElement("div");b===c?bh.appendChild(o):U(b).appendChild(o),o.innerHTML=m[1]+k+m[2];while(n--)o=o.lastChild;if(!f.support.tbody){var p=$.test(k),q=l==="table"&&!p?o.firstChild&&o.firstChild.childNodes:m[1]===""&&!p?o.childNodes:[];for(i=q.length-1;i>=0;--i)f.nodeName(q[i],"tbody")&&!q[i].childNodes.length&&q[i].parentNode.removeChild(q[i])}!f.support.leadingWhitespace&&X.test(k)&&o.insertBefore(b.createTextNode(X.exec(k)[0]),o.firstChild),k=o.childNodes}var r;if(!f.support.appendChecked)if(k[0]&&typeof (r=k.length)=="number")for(i=0;i=0)return b+"px"}}}),f.support.opacity||(f.cssHooks.opacity={get:function(a,b){return br.test((b&&a.currentStyle?a.currentStyle.filter:a.style.filter)||"")?parseFloat(RegExp.$1)/100+"":b?"1":""},set:function(a,b){var c=a.style,d=a.currentStyle,e=f.isNumeric(b)?"alpha(opacity="+b*100+")":"",g=d&&d.filter||c.filter||"";c.zoom=1;if(b>=1&&f.trim(g.replace(bq,""))===""){c.removeAttribute("filter");if(d&&!d.filter)return}c.filter=bq.test(g)?g.replace(bq,e):g+" "+e}}),f(function(){f.support.reliableMarginRight||(f.cssHooks.marginRight={get:function(a,b){var c;f.swap(a,{display:"inline-block"},function(){b?c=bz(a,"margin-right","marginRight"):c=a.style.marginRight});return c}})}),c.defaultView&&c.defaultView.getComputedStyle&&(bA=function(a,b){var c,d,e;b=b.replace(bs,"-$1").toLowerCase(),(d=a.ownerDocument.defaultView)&&(e=d.getComputedStyle(a,null))&&(c=e.getPropertyValue(b),c===""&&!f.contains(a.ownerDocument.documentElement,a)&&(c=f.style(a,b)));return c}),c.documentElement.currentStyle&&(bB=function(a,b){var c,d,e,f=a.currentStyle&&a.currentStyle[b],g=a.style;f===null&&g&&(e=g[b])&&(f=e),!bt.test(f)&&bu.test(f)&&(c=g.left,d=a.runtimeStyle&&a.runtimeStyle.left,d&&(a.runtimeStyle.left=a.currentStyle.left),g.left=b==="fontSize"?"1em":f||0,f=g.pixelLeft+"px",g.left=c,d&&(a.runtimeStyle.left=d));return f===""?"auto":f}),bz=bA||bB,f.expr&&f.expr.filters&&(f.expr.filters.hidden=function(a){var b=a.offsetWidth,c=a.offsetHeight;return b===0&&c===0||!f.support.reliableHiddenOffsets&&(a.style&&a.style.display||f.css(a,"display"))==="none"},f.expr.filters.visible=function(a){return!f.expr.filters.hidden(a)});var bD=/%20/g,bE=/\[\]$/,bF=/\r?\n/g,bG=/#.*$/,bH=/^(.*?):[ \t]*([^\r\n]*)\r?$/mg,bI=/^(?:color|date|datetime|datetime-local|email|hidden|month|number|password|range|search|tel|text|time|url|week)$/i,bJ=/^(?:about|app|app\-storage|.+\-extension|file|res|widget):$/,bK=/^(?:GET|HEAD)$/,bL=/^\/\//,bM=/\?/,bN=/)<[^<]*)*<\/script>/gi,bO=/^(?:select|textarea)/i,bP=/\s+/,bQ=/([?&])_=[^&]*/,bR=/^([\w\+\.\-]+:)(?:\/\/([^\/?#:]*)(?::(\d+))?)?/,bS=f.fn.load,bT={},bU={},bV,bW,bX=["*/"]+["*"];try{bV=e.href}catch(bY){bV=c.createElement("a"),bV.href="",bV=bV.href}bW=bR.exec(bV.toLowerCase())||[],f.fn.extend({load:function(a,c,d){if(typeof a!="string"&&bS)return bS.apply(this,arguments);if(!this.length)return this;var e=a.indexOf(" ");if(e>=0){var g=a.slice(e,a.length);a=a.slice(0,e)}var h="GET";c&&(f.isFunction(c)?(d=c,c=b):typeof c=="object"&&(c=f.param(c,f.ajaxSettings.traditional),h="POST"));var i=this;f.ajax({url:a,type:h,dataType:"html",data:c,complete:function(a,b,c){c=a.responseText,a.isResolved()&&(a.done(function(a){c=a}),i.html(g?f("
      ").append(c.replace(bN,"")).find(g):c)),d&&i.each(d,[c,b,a])}});return this},serialize:function(){return f.param(this.serializeArray())},serializeArray:function(){return this.map(function(){return this.elements?f.makeArray(this.elements):this}).filter(function(){return this.name&&!this.disabled&&(this.checked||bO.test(this.nodeName)||bI.test(this.type))}).map(function(a,b){var c=f(this).val();return c==null?null:f.isArray(c)?f.map(c,function(a,c){return{name:b.name,value:a.replace(bF,"\r\n")}}):{name:b.name,value:c.replace(bF,"\r\n")}}).get()}}),f.each("ajaxStart ajaxStop ajaxComplete ajaxError ajaxSuccess ajaxSend".split(" "),function(a,b){f.fn[b]=function(a){return this.on(b,a)}}),f.each(["get","post"],function(a,c){f[c]=function(a,d,e,g){f.isFunction(d)&&(g=g||e,e=d,d=b);return f.ajax({type:c,url:a,data:d,success:e,dataType:g})}}),f.extend({getScript:function(a,c){return f.get(a,b,c,"script")},getJSON:function(a,b,c){return f.get(a,b,c,"json")},ajaxSetup:function(a,b){b?b_(a,f.ajaxSettings):(b=a,a=f.ajaxSettings),b_(a,b);return a},ajaxSettings:{url:bV,isLocal:bJ.test(bW[1]),global:!0,type:"GET",contentType:"application/x-www-form-urlencoded",processData:!0,async:!0,accepts:{xml:"application/xml, text/xml",html:"text/html",text:"text/plain",json:"application/json, text/javascript","*":bX},contents:{xml:/xml/,html:/html/,json:/json/},responseFields:{xml:"responseXML",text:"responseText"},converters:{"* text":a.String,"text html":!0,"text json":f.parseJSON,"text xml":f.parseXML},flatOptions:{context:!0,url:!0}},ajaxPrefilter:bZ(bT),ajaxTransport:bZ(bU),ajax:function(a,c){function w(a,c,l,m){if(s!==2){s=2,q&&clearTimeout(q),p=b,n=m||"",v.readyState=a>0?4:0;var o,r,u,w=c,x=l?cb(d,v,l):b,y,z;if(a>=200&&a<300||a===304){if(d.ifModified){if(y=v.getResponseHeader("Last-Modified"))f.lastModified[k]=y;if(z=v.getResponseHeader("Etag"))f.etag[k]=z}if(a===304)w="notmodified",o=!0;else try{r=cc(d,x),w="success",o=!0}catch(A){w="parsererror",u=A}}else{u=w;if(!w||a)w="error",a<0&&(a=0)}v.status=a,v.statusText=""+(c||w),o?h.resolveWith(e,[r,w,v]):h.rejectWith(e,[v,w,u]),v.statusCode(j),j=b,t&&g.trigger("ajax"+(o?"Success":"Error"),[v,d,o?r:u]),i.fireWith(e,[v,w]),t&&(g.trigger("ajaxComplete",[v,d]),--f.active||f.event.trigger("ajaxStop"))}}typeof a=="object"&&(c=a,a=b),c=c||{};var d=f.ajaxSetup({},c),e=d.context||d,g=e!==d&&(e.nodeType||e instanceof f)?f(e):f.event,h=f.Deferred(),i=f.Callbacks("once memory"),j=d.statusCode||{},k,l={},m={},n,o,p,q,r,s=0,t,u,v={readyState:0,setRequestHeader:function(a,b){if(!s){var c=a.toLowerCase();a=m[c]=m[c]||a,l[a]=b}return this},getAllResponseHeaders:function(){return s===2?n:null},getResponseHeader:function(a){var c;if(s===2){if(!o){o={};while(c=bH.exec(n))o[c[1].toLowerCase()]=c[2]}c=o[a.toLowerCase()]}return c===b?null:c},overrideMimeType:function(a){s||(d.mimeType=a);return this},abort:function(a){a=a||"abort",p&&p.abort(a),w(0,a);return this}};h.promise(v),v.success=v.done,v.error=v.fail,v.complete=i.add,v.statusCode=function(a){if(a){var b;if(s<2)for(b in a)j[b]=[j[b],a[b]];else b=a[v.status],v.then(b,b)}return this},d.url=((a||d.url)+"").replace(bG,"").replace(bL,bW[1]+"//"),d.dataTypes=f.trim(d.dataType||"*").toLowerCase().split(bP),d.crossDomain==null&&(r=bR.exec(d.url.toLowerCase()),d.crossDomain=!(!r||r[1]==bW[1]&&r[2]==bW[2]&&(r[3]||(r[1]==="http:"?80:443))==(bW[3]||(bW[1]==="http:"?80:443)))),d.data&&d.processData&&typeof d.data!="string"&&(d.data=f.param(d.data,d.traditional)),b$(bT,d,c,v);if(s===2)return!1;t=d.global,d.type=d.type.toUpperCase(),d.hasContent=!bK.test(d.type),t&&f.active++===0&&f.event.trigger("ajaxStart");if(!d.hasContent){d.data&&(d.url+=(bM.test(d.url)?"&":"?")+d.data,delete d.data),k=d.url;if(d.cache===!1){var x=f.now(),y=d.url.replace(bQ,"$1_="+x);d.url=y+(y===d.url?(bM.test(d.url)?"&":"?")+"_="+x:"")}}(d.data&&d.hasContent&&d.contentType!==!1||c.contentType)&&v.setRequestHeader("Content-Type",d.contentType),d.ifModified&&(k=k||d.url,f.lastModified[k]&&v.setRequestHeader("If-Modified-Since",f.lastModified[k]),f.etag[k]&&v.setRequestHeader("If-None-Match",f.etag[k])),v.setRequestHeader("Accept",d.dataTypes[0]&&d.accepts[d.dataTypes[0]]?d.accepts[d.dataTypes[0]]+(d.dataTypes[0]!=="*"?", "+bX+"; q=0.01":""):d.accepts["*"]);for(u in d.headers)v.setRequestHeader(u,d.headers[u]);if(d.beforeSend&&(d.beforeSend.call(e,v,d)===!1||s===2)){v.abort();return!1}for(u in{success:1,error:1,complete:1})v[u](d[u]);p=b$(bU,d,c,v);if(!p)w(-1,"No Transport");else{v.readyState=1,t&&g.trigger("ajaxSend",[v,d]),d.async&&d.timeout>0&&(q=setTimeout(function(){v.abort("timeout")},d.timeout));try{s=1,p.send(l,w)}catch(z){if(s<2)w(-1,z);else throw z}}return v},param:function(a,c){var d=[],e=function(a,b){b=f.isFunction(b)?b():b,d[d.length]=encodeURIComponent(a)+"="+encodeURIComponent(b)};c===b&&(c=f.ajaxSettings.traditional);if(f.isArray(a)||a.jquery&&!f.isPlainObject(a))f.each(a,function(){e(this.name,this.value)});else for(var g in a)ca(g,a[g],c,e);return d.join("&").replace(bD,"+")}}),f.extend({active:0,lastModified:{},etag:{}});var cd=f.now(),ce=/(\=)\?(&|$)|\?\?/i;f.ajaxSetup({jsonp:"callback",jsonpCallback:function(){return f.expando+"_"+cd++}}),f.ajaxPrefilter("json jsonp",function(b,c,d){var e=b.contentType==="application/x-www-form-urlencoded"&&typeof b.data=="string";if(b.dataTypes[0]==="jsonp"||b.jsonp!==!1&&(ce.test(b.url)||e&&ce.test(b.data))){var g,h=b.jsonpCallback=f.isFunction(b.jsonpCallback)?b.jsonpCallback():b.jsonpCallback,i=a[h],j=b.url,k=b.data,l="$1"+h+"$2";b.jsonp!==!1&&(j=j.replace(ce,l),b.url===j&&(e&&(k=k.replace(ce,l)),b.data===k&&(j+=(/\?/.test(j)?"&":"?")+b.jsonp+"="+h))),b.url=j,b.data=k,a[h]=function(a){g=[a]},d.always(function(){a[h]=i,g&&f.isFunction(i)&&a[h](g[0])}),b.converters["script json"]=function(){g||f.error(h+" was not called");return g[0]},b.dataTypes[0]="json";return"script"}}),f.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/javascript|ecmascript/},converters:{"text script":function(a){f.globalEval(a);return a}}}),f.ajaxPrefilter("script",function(a){a.cache===b&&(a.cache=!1),a.crossDomain&&(a.type="GET",a.global=!1)}),f.ajaxTransport("script",function(a){if(a.crossDomain){var d,e=c.head||c.getElementsByTagName("head")[0]||c.documentElement;return{send:function(f,g){d=c.createElement("script"),d.async="async",a.scriptCharset&&(d.charset=a.scriptCharset),d.src=a.url,d.onload=d.onreadystatechange=function(a,c){if(c||!d.readyState||/loaded|complete/.test(d.readyState))d.onload=d.onreadystatechange=null,e&&d.parentNode&&e.removeChild(d),d=b,c||g(200,"success")},e.insertBefore(d,e.firstChild)},abort:function(){d&&d.onload(0,1)}}}});var cf=a.ActiveXObject?function(){for(var a in ch)ch[a](0,1)}:!1,cg=0,ch;f.ajaxSettings.xhr=a.ActiveXObject?function(){return!this.isLocal&&ci()||cj()}:ci,function(a){f.extend(f.support,{ajax:!!a,cors:!!a&&"withCredentials"in a})}(f.ajaxSettings.xhr()),f.support.ajax&&f.ajaxTransport(function(c){if(!c.crossDomain||f.support.cors){var d;return{send:function(e,g){var h=c.xhr(),i,j;c.username?h.open(c.type,c.url,c.async,c.username,c.password):h.open(c.type,c.url,c.async);if(c.xhrFields)for(j in c.xhrFields)h[j]=c.xhrFields[j];c.mimeType&&h.overrideMimeType&&h.overrideMimeType(c.mimeType),!c.crossDomain&&!e["X-Requested-With"]&&(e["X-Requested-With"]="XMLHttpRequest");try{for(j in e)h.setRequestHeader(j,e[j])}catch(k){}h.send(c.hasContent&&c.data||null),d=function(a,e){var j,k,l,m,n;try{if(d&&(e||h.readyState===4)){d=b,i&&(h.onreadystatechange=f.noop,cf&&delete ch[i]);if(e)h.readyState!==4&&h.abort();else{j=h.status,l=h.getAllResponseHeaders(),m={},n=h.responseXML,n&&n.documentElement&&(m.xml=n),m.text=h.responseText;try{k=h.statusText}catch(o){k=""}!j&&c.isLocal&&!c.crossDomain?j=m.text?200:404:j===1223&&(j=204)}}}catch(p){e||g(-1,p)}m&&g(j,k,m,l)},!c.async||h.readyState===4?d():(i=++cg,cf&&(ch||(ch={},f(a).unload(cf)),ch[i]=d),h.onreadystatechange=d)},abort:function(){d&&d(0,1)}}}});var ck={},cl,cm,cn=/^(?:toggle|show|hide)$/,co=/^([+\-]=)?([\d+.\-]+)([a-z%]*)$/i,cp,cq=[["height","marginTop","marginBottom","paddingTop","paddingBottom"],["width","marginLeft","marginRight","paddingLeft","paddingRight"],["opacity"]],cr;f.fn.extend({show:function(a,b,c){var d,e;if(a||a===0)return this.animate(cu("show",3),a,b,c);for(var g=0,h=this.length;g=i.duration+this.startTime){this.now=this.end,this.pos=this.state=1,this.update(),i.animatedProperties[this.prop]=!0;for(b in i.animatedProperties)i.animatedProperties[b]!==!0&&(g=!1);if(g){i.overflow!=null&&!f.support.shrinkWrapBlocks&&f.each(["","X","Y"],function(a,b){h.style["overflow"+b]=i.overflow[a]}),i.hide&&f(h).hide();if(i.hide||i.show)for(b in i.animatedProperties)f.style(h,b,i.orig[b]),f.removeData(h,"fxshow"+b,!0),f.removeData(h,"toggle"+b,!0);d=i.complete,d&&(i.complete=!1,d.call(h))}return!1}i.duration==Infinity?this.now=e:(c=e-this.startTime,this.state=c/i.duration,this.pos=f.easing[i.animatedProperties[this.prop]](this.state,c,0,1,i.duration),this.now=this.start+(this.end-this.start)*this.pos),this.update();return!0}},f.extend(f.fx,{tick:function(){var a,b=f.timers,c=0;for(;c-1,k={},l={},m,n;j?(l=e.position(),m=l.top,n=l.left):(m=parseFloat(h)||0,n=parseFloat(i)||0),f.isFunction(b)&&(b=b.call(a,c,g)),b.top!=null&&(k.top=b.top-g.top+m),b.left!=null&&(k.left=b.left-g.left+n),"using"in b?b.using.call(a,k):e.css(k)}},f.fn.extend({position:function(){if(!this[0])return null;var a=this[0],b=this.offsetParent(),c=this.offset(),d=cx.test(b[0].nodeName)?{top:0,left:0}:b.offset();c.top-=parseFloat(f.css(a,"marginTop"))||0,c.left-=parseFloat(f.css(a,"marginLeft"))||0,d.top+=parseFloat(f.css(b[0],"borderTopWidth"))||0,d.left+=parseFloat(f.css(b[0],"borderLeftWidth"))||0;return{top:c.top-d.top,left:c.left-d.left}},offsetParent:function(){return this.map(function(){var a=this.offsetParent||c.body;while(a&&!cx.test(a.nodeName)&&f.css(a,"position")==="static")a=a.offsetParent;return a})}}),f.each(["Left","Top"],function(a,c){var d="scroll"+c;f.fn[d]=function(c){var e,g;if(c===b){e=this[0];if(!e)return null;g=cy(e);return g?"pageXOffset"in g?g[a?"pageYOffset":"pageXOffset"]:f.support.boxModel&&g.document.documentElement[d]||g.document.body[d]:e[d]}return this.each(function(){g=cy(this),g?g.scrollTo(a?f(g).scrollLeft():c,a?c:f(g).scrollTop()):this[d]=c})}}),f.each(["Height","Width"],function(a,c){var d=c.toLowerCase();f.fn["inner"+c]=function(){var a=this[0];return a?a.style?parseFloat(f.css(a,d,"padding")):this[d]():null},f.fn["outer"+c]=function(a){var b=this[0];return b?b.style?parseFloat(f.css(b,d,a?"margin":"border")):this[d]():null},f.fn[d]=function(a){var e=this[0];if(!e)return a==null?null:this;if(f.isFunction(a))return this.each(function(b){var c=f(this);c[d](a.call(this,b,c[d]()))});if(f.isWindow(e)){var g=e.document.documentElement["client"+c],h=e.document.body;return e.document.compatMode==="CSS1Compat"&&g||h&&h["client"+c]||g}if(e.nodeType===9)return Math.max(e.documentElement["client"+c],e.body["scroll"+c],e.documentElement["scroll"+c],e.body["offset"+c],e.documentElement["offset"+c]);if(a===b){var i=f.css(e,d),j=parseFloat(i);return f.isNumeric(j)?j:i}return this.css(d,typeof a=="string"?a:a+"px")}}),a.jQuery=a.$=f,typeof define=="function"&&define.amd&&define.amd.jQuery&&define("jquery",[],function(){return f})})(window); \ No newline at end of file diff --git a/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/templates/default/fulldoc/html/setup.rb b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/templates/default/fulldoc/html/setup.rb new file mode 100644 index 000000000..201ba63c5 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/templates/default/fulldoc/html/setup.rb @@ -0,0 +1,241 @@ +# frozen_string_literal: true +include Helpers::ModuleHelper + +def init + options.objects = objects = run_verifier(options.objects) + + return serialize_onefile if options.onefile + generate_assets + serialize('_index.html') + options.files.each_with_index do |file, _i| + serialize_file(file, file.title) + end + + options.delete(:objects) + options.delete(:files) + + objects.each do |object| + begin + serialize(object) + rescue => e + path = options.serializer.serialized_path(object) + log.error "Exception occurred while generating '#{path}'" + log.backtrace(e) + end + end +end + +# Generate an HTML document for the specified object. This method is used by +# most of the objects found in the Registry. +# @param [CodeObject] object to be saved to HTML +def serialize(object) + options.object = object + serialize_index(options) if object == '_index.html' && options.readme.nil? + Templates::Engine.with_serializer(object, options.serializer) do + T('layout').run(options) + end +end + +# Generate the documentation output in one file (--one-file) which will load the +# contents of all the javascript and css and output the entire contents without +# depending on any additional files +def serialize_onefile + Templates::Engine.with_serializer('index.html', options.serializer) do + T('onefile').run(options) + end +end + +# Generate the index document for the output +# @params [Hash] options contains data and flags that influence the output +def serialize_index(options) + Templates::Engine.with_serializer('index.html', options.serializer) do + T('layout').run(options.merge(:index => true)) + end +end + +# Generate a single HTML file with the layout template applied. This is generally +# the README file or files specified on the command-line. +# +# @param [File] file object to be saved to the output +# @param [String] title currently unused +# +# @see layout#diskfile +def serialize_file(file, title = nil) # rubocop:disable Lint/UnusedMethodArgument + options.object = Registry.root + options.file = file + outfile = 'file.' + file.name + '.html' + + serialize_index(options) if file == options.readme + Templates::Engine.with_serializer(outfile, options.serializer) do + T('layout').run(options) + end + options.delete(:file) +end + +# +# Generates a file to the output with the specified contents. +# +# @example saving a custom html file to the documentation root +# +# asset('my_custom.html','Custom File') +# +# @param [String] path relative to the document output where the file will be +# created. +# @param [String] content the contents that are saved to the file. +def asset(path, content) + if options.serializer + log.capture("Generating asset #{path}") do + options.serializer.serialize(path, content) + end + end +end + +# @return [Array] Stylesheet files that are additionally loaded for the +# searchable full lists, e.g., Class List, Method List, File List +# @since 0.7.0 +def stylesheets_full_list + %w(css/full_list.css css/common.css) +end + +# @return [Array] Javascript files that are additionally loaded for the +# searchable full lists, e.g., Class List, Method List, File List. +# @since 0.7.0 +def javascripts_full_list + %w(js/jquery.js js/full_list.js) +end + +def menu_lists + Object.new.extend(T('layout')).menu_lists +end + +# Generates all the javascript files, stylesheet files, menu lists +# (i.e. class, method, and file) based on the the values returned from the +# layout's menu_list method, and the frameset in the documentation output +# +def generate_assets + @object = Registry.root + + layout = Object.new.extend(T('layout')) + (layout.javascripts + javascripts_full_list + + layout.stylesheets + stylesheets_full_list).uniq.each do |file| + asset(file, file(file, true)) + end + layout.menu_lists.each do |list| + list_generator_method = "generate_#{list[:type]}_list" + if respond_to?(list_generator_method) + send(list_generator_method) + else + log.error "Unable to generate '#{list[:title]}' list because no method " \ + "'#{list_generator_method}' exists" + end + end + + generate_frameset +end + +# Generate a searchable method list in the output +# @see ModuleHelper#prune_method_listing +def generate_method_list + @items = prune_method_listing(Registry.all(:method), false) + @items = @items.reject {|m| m.name.to_s =~ /=$/ && m.is_attribute? } + @items = @items.sort_by {|m| m.name.to_s } + @list_title = "Method List" + @list_type = "method" + generate_list_contents +end + +# Generate a searchable class list in the output +def generate_class_list + @items = options.objects if options.objects + @list_title = "Class List" + @list_type = "class" + generate_list_contents +end + +# Generate a searchable file list in the output +def generate_file_list + @file_list = true + @items = options.files + @list_title = "File List" + @list_type = "file" + generate_list_contents + @file_list = nil +end + +def generate_list_contents + asset(url_for_list(@list_type), erb(:full_list)) +end + +# Generate the frame documentation in the output +def generate_frameset + @javascripts = javascripts_full_list + @stylesheets = stylesheets_full_list + asset(url_for_frameset, erb(:frames)) +end + +# @api private +class TreeContext + def initialize + @depth = 0 + @even_odd = Alternator.new(:even, :odd) + end + + def nest + @depth += 1 + yield + @depth -= 1 + end + + # @return [String] Returns a css pixel offset, e.g. "30px" + def indent + "#{(@depth + 2) * 15}px" + end + + def classes + classes = [] + classes << 'collapsed' if @depth > 0 + classes << @even_odd.next if @depth < 2 + classes + end + + class Alternator + def initialize(first, second) + @next = first + @after = second + end + + def next + @next, @after = @after, @next + @after + end + end +end + +# @return [String] HTML output of the classes to be displayed in the +# full_list_class template. +def class_list(root = Registry.root, tree = TreeContext.new) + out = String.new("") + children = run_verifier(root.children) + if root == Registry.root + children += @items.select {|o| o.namespace.is_a?(CodeObjects::Proxy) } + end + children.compact.sort_by(&:path).each do |child| + next unless child.is_a?(CodeObjects::NamespaceObject) + name = child.namespace.is_a?(CodeObjects::Proxy) ? child.path : child.name + has_children = run_verifier(child.children).any? {|o| o.is_a?(CodeObjects::NamespaceObject) } + out << "
    • " + out << "
      " + out << " " if has_children + out << linkify(child, name) + out << " < #{child.superclass.name}" if child.is_a?(CodeObjects::ClassObject) && child.superclass + out << "" + out << child.namespace.title + out << "" + out << "
      " + tree.nest do + out << "
        #{class_list(child, tree)}
      " if has_children + end + out << "
    • " + end + out +end diff --git a/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/templates/default/layout/dot/header.erb b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/templates/default/layout/dot/header.erb new file mode 100644 index 000000000..22511986e --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/templates/default/layout/dot/header.erb @@ -0,0 +1,6 @@ +digraph yard { + graph [rankdir=BT rank=sink outputMode=nodesfirst packMode="graph" splines=true]; + node [shape=record rank=sink rankType=sink]; + + <%= yieldall %> +} \ No newline at end of file diff --git a/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/templates/default/layout/dot/setup.rb b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/templates/default/layout/dot/setup.rb new file mode 100644 index 000000000..ccdba6205 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/templates/default/layout/dot/setup.rb @@ -0,0 +1,15 @@ +# frozen_string_literal: true +attr_reader :contents + +def init + if object + type = object.root? ? :module : object.type + sections :header, [T(type)] + else + sections :header, [:contents] + end +end + +def header + tidy erb(:header) +end diff --git a/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/templates/default/layout/html/breadcrumb.erb b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/templates/default/layout/html/breadcrumb.erb new file mode 100644 index 000000000..b4006b238 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/templates/default/layout/html/breadcrumb.erb @@ -0,0 +1,11 @@ + diff --git a/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/templates/default/layout/html/files.erb b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/templates/default/layout/html/files.erb new file mode 100644 index 000000000..cae592b82 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/templates/default/layout/html/files.erb @@ -0,0 +1,11 @@ +<% if @files && @files.size > 0 %> +

      File Listing

      +
        + <% n = 1 %> + <% @files.each_with_index do |file, i| %> +
      • <%= link_file(file) %>
      • + <% n = n == 2 ? 1 : 2 %> + <% end %> +
      +<% end %> +
      diff --git a/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/templates/default/layout/html/footer.erb b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/templates/default/layout/html/footer.erb new file mode 100644 index 000000000..e57a0f2a2 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/templates/default/layout/html/footer.erb @@ -0,0 +1,5 @@ + diff --git a/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/templates/default/layout/html/headers.erb b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/templates/default/layout/html/headers.erb new file mode 100644 index 000000000..1edaab09b --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/templates/default/layout/html/headers.erb @@ -0,0 +1,15 @@ + + + + <%= h @page_title %> + <% if options.title && @page_title != options.title %> + — <%= h options.title %> + <% end %> + +<% stylesheets.each do |stylesheet| %> + +<% end %> +<%= erb :script_setup %> +<% javascripts.each do |javascript| %> + +<% end %> diff --git a/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/templates/default/layout/html/index.erb b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/templates/default/layout/html/index.erb new file mode 100644 index 000000000..b4a858c86 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/templates/default/layout/html/index.erb @@ -0,0 +1,2 @@ +

      <%= options.title %>

      +<%= yieldall %> diff --git a/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/templates/default/layout/html/layout.erb b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/templates/default/layout/html/layout.erb new file mode 100644 index 000000000..74aedf701 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/templates/default/layout/html/layout.erb @@ -0,0 +1,24 @@ + + + + <%= erb(:headers) %> + + + + +
      + + +
      <%= yieldall %>
      + + <%= erb(:footer) %> +
      + + \ No newline at end of file diff --git a/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/templates/default/layout/html/listing.erb b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/templates/default/layout/html/listing.erb new file mode 100644 index 000000000..de43c2a1b --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/templates/default/layout/html/listing.erb @@ -0,0 +1,4 @@ +
      +

      Alphabetic Index

      + <%= yieldall %> +
      diff --git a/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/templates/default/layout/html/objects.erb b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/templates/default/layout/html/objects.erb new file mode 100644 index 000000000..82ad52f75 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/templates/default/layout/html/objects.erb @@ -0,0 +1,32 @@ +

      Namespace Listing A-Z

      + +<% if Registry.root.meths(:included => false).size > 0 %> +
      • <%= linkify(Registry.root) %>
      +<% end %> + +<% i = 0 %> +
      + + + +
      + <% @objects_by_letter.sort_by {|l,o| l.to_s }.each do |letter, objects| %> + <% if (i += 1) % 8 == 0 %> + + <% i = 0 %> + <% end %> +
        +
      • <%= letter %>
      • +
          + <% objects.each do |obj| %> +
        • + <%= linkify obj, obj.name %> + <% if !obj.namespace.root? %> + (<%= obj.namespace.path %>) + <% end %> +
        • + <% end %> +
        +
      + <% end %> +
      diff --git a/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/templates/default/layout/html/script_setup.erb b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/templates/default/layout/html/script_setup.erb new file mode 100644 index 000000000..e0cd26617 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/templates/default/layout/html/script_setup.erb @@ -0,0 +1,4 @@ + diff --git a/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/templates/default/layout/html/search.erb b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/templates/default/layout/html/search.erb new file mode 100644 index 000000000..3442b056d --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/templates/default/layout/html/search.erb @@ -0,0 +1,13 @@ + \ No newline at end of file diff --git a/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/templates/default/layout/html/setup.rb b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/templates/default/layout/html/setup.rb new file mode 100644 index 000000000..ab97c5f1e --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/templates/default/layout/html/setup.rb @@ -0,0 +1,89 @@ +# frozen_string_literal: true +def init + @breadcrumb = [] + @page_title = '' + @breadcrumb_title = '' + if @onefile + sections :layout + elsif defined?(@file) && @file + if @file.attributes[:namespace] + @object = options.object = Registry.at(@file.attributes[:namespace]) || Registry.root + end + @breadcrumb_title = "File: " + @file.title + @page_title = @breadcrumb_title + sections :layout, [:diskfile] + elsif @contents + sections :layout, [:contents] + else + case object + when '_index.html' + @page_title = options.title + sections :layout, [:index, [:listing, [:files, :objects]]] + when CodeObjects::Base + unless object.root? + cur = object.namespace + until cur.root? + @breadcrumb.unshift(cur) + cur = cur.namespace + end + end + + @page_title = format_object_title(object) + type = object.root? ? :module : object.type + sections :layout, [T(type)] + end + end +end + +attr_reader :contents + +def index + @objects_by_letter = {} + objects = Registry.all(:class, :module).sort_by {|o| o.name.to_s } + objects = run_verifier(objects) + objects.each {|o| (@objects_by_letter[o.name.to_s[0, 1].upcase] ||= []) << o } + erb(:index) +end + +def layout + @nav_url = url_for_list(!(defined?(@file) && @file) || options.index ? 'class' : 'file') + + @path = + if !object || object.is_a?(String) + nil + elsif defined?(@file) && @file + @file.path + elsif !object.is_a?(YARD::CodeObjects::NamespaceObject) + object.parent.path + else + object.path + end + + erb(:layout) +end + +def diskfile + @file.attributes[:markup] ||= markup_for_file('', @file.filename) + data = htmlify(@file.contents, @file.attributes[:markup]) + "
      " + data + "
      " +end + +# @return [Array] core javascript files for layout +# @since 0.7.0 +def javascripts + %w(js/jquery.js js/app.js) +end + +# @return [Array] core stylesheets for the layout +# @since 0.7.0 +def stylesheets + %w(css/style.css css/common.css) +end + +# @return [ArrayString}>] the list of search links and drop-down menus +# @since 0.7.0 +def menu_lists + [{:type => 'class', :title => 'Classes', :search_title => 'Class List'}, + {:type => 'method', :title => 'Methods', :search_title => 'Method List'}, + {:type => 'file', :title => 'Files', :search_title => 'File List'}] +end diff --git a/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/templates/default/method/html/header.erb b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/templates/default/method/html/header.erb new file mode 100644 index 000000000..1ca030b9d --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/templates/default/method/html/header.erb @@ -0,0 +1,17 @@ +

      Method: <%= object.path %>

      +
      +
      +
      Defined in:
      +
      + <%= object.file %><% if object.files.size > 1 %>,
      + <%= object.files[1..-1].map {|f| f.first }.join(",
      ") %>
      + <% end %> + + + + +
      +
      + <%= yieldall :index => 0 %> +
      +
      \ No newline at end of file diff --git a/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/templates/default/method/setup.rb b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/templates/default/method/setup.rb new file mode 100644 index 000000000..81c03d533 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/templates/default/method/setup.rb @@ -0,0 +1,4 @@ +# frozen_string_literal: true +def init + sections :header, [T('method_details')] +end diff --git a/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/templates/default/method/text/header.erb b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/templates/default/method/text/header.erb new file mode 100644 index 000000000..561207b2d --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/templates/default/method/text/header.erb @@ -0,0 +1 @@ +<%= yieldall %> \ No newline at end of file diff --git a/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/templates/default/method_details/html/header.erb b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/templates/default/method_details/html/header.erb new file mode 100644 index 000000000..182ebf6ed --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/templates/default/method_details/html/header.erb @@ -0,0 +1,3 @@ +
      + <%= yieldall %> +
      \ No newline at end of file diff --git a/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/templates/default/method_details/html/method_signature.erb b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/templates/default/method_details/html/method_signature.erb new file mode 100644 index 000000000..1faf8477e --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/templates/default/method_details/html/method_signature.erb @@ -0,0 +1,25 @@ +

      + <% if object.tags(:overload).size == 1 %> + <%= signature(object.tag(:overload), false) %> + <% elsif object.tags(:overload).size > 1 %> + <% object.tags(:overload).each do |overload| %> + <%= signature(overload, false) %> + <% end %> + <% else %> + <%= signature(object, false) %> + <% end %> + + <% if object.aliases.size > 0 %> + Also known as: + <%= object.aliases.map {|o| + "" + h(o.name.to_s) + "" }.join(", ") %> + + <% end %> + + <% if owner != object.namespace %> + + Originally defined in <%= object.namespace.type %> + <%= linkify object, owner.relative_path(object.namespace) %> + + <% end %> +

      \ No newline at end of file diff --git a/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/templates/default/method_details/html/source.erb b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/templates/default/method_details/html/source.erb new file mode 100644 index 000000000..eb6609b7d --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/templates/default/method_details/html/source.erb @@ -0,0 +1,10 @@ + + + + + +
      +
      <%= "\n\n\n" %><%= h format_lines(object) %>
      +
      +
      # File '<%= h object.file %>'<% if object.line %>, line <%= object.line %><% end %><%= "\n\n" %><%= html_syntax_highlight object.source %>
      +
      \ No newline at end of file diff --git a/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/templates/default/method_details/setup.rb b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/templates/default/method_details/setup.rb new file mode 100644 index 000000000..91b52fd7a --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/templates/default/method_details/setup.rb @@ -0,0 +1,11 @@ +# frozen_string_literal: true +def init + sections :header, [:method_signature, T('docstring'), :source] +end + +def source + return if owner != object.namespace + return if Tags::OverloadTag === object + return if object.source.nil? + erb(:source) +end diff --git a/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/templates/default/method_details/text/header.erb b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/templates/default/method_details/text/header.erb new file mode 100644 index 000000000..b52320ed1 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/templates/default/method_details/text/header.erb @@ -0,0 +1,10 @@ +<%= title_align_right format_object_title(object) %> + +<%= align_right "(Defined in: #{object.file})" %> +<% if object.aliases.size > 0 %> + +<%= align_right "(Also known as: #{object.aliases.map {|o| o.name(true).to_s }.join(',')})" %> +<% end %> + +<%= yieldall %> + diff --git a/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/templates/default/method_details/text/method_signature.erb b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/templates/default/method_details/text/method_signature.erb new file mode 100644 index 000000000..aed0128b3 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/templates/default/method_details/text/method_signature.erb @@ -0,0 +1,12 @@ + +<% if object.tags(:overload).size == 1 %> +<%= indent wrap(signature(object.tag(:overload))) %> +<% elsif object.tags(:overload).size > 1 %> +<% object.tags(:overload).each do |overload| %> +<%= indent wrap(signature(overload)) %> +<% end %> +<% else %> +<%= indent wrap(signature(object)) %> +<% end %> +<%= hr %> + diff --git a/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/templates/default/method_details/text/setup.rb b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/templates/default/method_details/text/setup.rb new file mode 100644 index 000000000..97704364d --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/templates/default/method_details/text/setup.rb @@ -0,0 +1,11 @@ +# frozen_string_literal: true +def init + super + sections.last.pop +end + +def format_object_title(object) + title = "Method: #{object.name(true)}" + title += " (#{object.namespace})" unless object.namespace.root? + title +end diff --git a/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/templates/default/module/dot/child.erb b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/templates/default/module/dot/child.erb new file mode 100644 index 000000000..e4c1725fe --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/templates/default/module/dot/child.erb @@ -0,0 +1 @@ +<%= format_path object %> [label="{<%= yieldall.gsub("\n", '') %>}" rank=sink]; diff --git a/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/templates/default/module/dot/dependencies.erb b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/templates/default/module/dot/dependencies.erb new file mode 100644 index 000000000..8ec90f481 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/templates/default/module/dot/dependencies.erb @@ -0,0 +1,3 @@ +<% object.mixins(:instance).each do |obj| %> + <%= format_path object %> -> <%= format_path obj %> [style=dotted arrowType=none]; +<% end %> \ No newline at end of file diff --git a/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/templates/default/module/dot/header.erb b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/templates/default/module/dot/header.erb new file mode 100644 index 000000000..dae853675 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/templates/default/module/dot/header.erb @@ -0,0 +1,6 @@ +subgraph cluster_<%= format_path object %> { + label = "<%= h(object.name) unless object.path == "" %>"; labelloc=b; + <% for obj in @modules %> + <%= yieldall :object => obj %> + <% end %> +} diff --git a/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/templates/default/module/dot/info.erb b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/templates/default/module/dot/info.erb new file mode 100644 index 000000000..2b48e556c --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/templates/default/module/dot/info.erb @@ -0,0 +1,14 @@ +<%= object.type %> <%= h object.name %> +<% if options.full %> +| +<% object.attributes.each do |scope, list| %> +<% list.sort_by {|name, rw| name.to_s }.each do |name, rw| %> +<%= uml_visibility(rw.values.compact.first) %> <%= h (rw[:read]||rw[:write]).name(true).gsub(/=$/,'') %> [<%= 'R' if rw[:read] %><%= 'W' if rw[:write] %>]\l +<% end %> +<% end %> +| +<% method_listing.each do |obj| %> +<%= uml_visibility obj %> <%= h obj.name(true) %> +<%= h(" : #{obj.tag(:return).types.first}") if obj.has_tag?(:return) && obj.tag(:return).types && obj.tag(:return).types.size > 0 %>\l +<% end %> +<% end %> \ No newline at end of file diff --git a/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/templates/default/module/dot/setup.rb b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/templates/default/module/dot/setup.rb new file mode 100644 index 000000000..a9344eb9a --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/templates/default/module/dot/setup.rb @@ -0,0 +1,15 @@ +# frozen_string_literal: true +def init + @modules = object.children.select {|o| o.type == :module } + @classes = object.children.select {|o| o.type == :class } + sections :child, [:info], :classes, [T('class')], :header, [T('module')], :dependencies +end + +def dependencies + return unless options.dependencies + erb(:dependencies) +end + +def classes + @classes.map {|k| yieldall :object => k }.join("\n") +end diff --git a/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/templates/default/module/html/attribute_details.erb b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/templates/default/module/html/attribute_details.erb new file mode 100644 index 000000000..365a2d947 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/templates/default/module/html/attribute_details.erb @@ -0,0 +1,10 @@ +<% scopes(attr_listing) do |list, scope| %> +
      +

      <%= scope.to_s.capitalize %> Attribute Details

      + <% list.each_with_index do |meth, i| %> + <% rw = meth.attr_info %> + + <%= yieldall :object => meth, :owner => object, :index => i %> + <% end %> +
      +<% end %> diff --git a/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/templates/default/module/html/attribute_summary.erb b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/templates/default/module/html/attribute_summary.erb new file mode 100644 index 000000000..316b4520b --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/templates/default/module/html/attribute_summary.erb @@ -0,0 +1,8 @@ +<% groups(attr_listing, "Attribute") do |list, name| %> +

      <%= name %> collapse

      +
        + <% list.each do |meth| %> + <%= yieldall :item => meth %> + <% end %> +
      +<% end %> diff --git a/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/templates/default/module/html/box_info.erb b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/templates/default/module/html/box_info.erb new file mode 100644 index 000000000..488287011 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/templates/default/module/html/box_info.erb @@ -0,0 +1,43 @@ +
      + <% if CodeObjects::ClassObject === object && object.superclass %> +
      +
      Inherits:
      +
      + <%= linkify object.superclass %> + <% if object.superclass.name != :BasicObject %> +
        +
      • <%= linkify P(:Object) %>
      • + <% object.inheritance_tree.reverse.each_with_index do |obj, i| %> + + <% end %> +
      + show all + <% end %> +
      +
      + <% end %> + + <% [[:class, "Extended by"], [:instance, "Includes"]].each do |scope, name| %> + <% if (mix = run_verifier(object.mixins(scope))).size > 0 %> +
      +
      <%= name %>:
      +
      <%= mix.sort_by {|o| o.path }.map {|o| linkify(o) }.join(", ") %>
      +
      + <% end %> + <% end %> + + <% if (mixed_into = mixed_into(object)).size > 0 %> +
      +
      Included in:
      +
      <%= mixed_into.sort_by {|o| o.path }.map {|o| linkify(o) }.join(", ") %>
      +
      + <% end %> + + <% unless object.root? %> +
      +
      Defined in:
      +
      <%= erb(:defines) %>
      +
      + <% end %> +
      + diff --git a/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/templates/default/module/html/children.erb b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/templates/default/module/html/children.erb new file mode 100644 index 000000000..27be4aed5 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/templates/default/module/html/children.erb @@ -0,0 +1,8 @@ +

      Defined Under Namespace

      +

      + <% @inner.each do |name, list| %> + <% if list.size > 0 %> + <%= name.to_s.capitalize %>: <%= list.map {|child| linkify(child, child.name(true)) }.join(", ") %> + <% end %> + <% end %> +

      diff --git a/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/templates/default/module/html/constant_summary.erb b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/templates/default/module/html/constant_summary.erb new file mode 100644 index 000000000..46f7ef861 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/templates/default/module/html/constant_summary.erb @@ -0,0 +1,17 @@ +<% if constant_listing.size > 0 %> + <% groups(constant_listing, "Constant") do |list, name| %> +

      + <%= name %> + collapse +

      + +
      + <% list.each do |cnst| %> +
      <%= cnst.name %> = + <%= yieldall :object => cnst %> +
      +
      <%= format_constant cnst.value %>
      + <% end %> +
      + <% end %> +<% end %> diff --git a/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/templates/default/module/html/defines.erb b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/templates/default/module/html/defines.erb new file mode 100644 index 000000000..216b5493d --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/templates/default/module/html/defines.erb @@ -0,0 +1,3 @@ +<%= object.file ? object.file : '(unknown)' %><% if object.files.size > 1 %>,
      + <%= object.files[1..-1].map {|f| f.first }.join(",
      ") %>
      +<% end %> \ No newline at end of file diff --git a/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/templates/default/module/html/header.erb b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/templates/default/module/html/header.erb new file mode 100644 index 000000000..fe8c52a48 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/templates/default/module/html/header.erb @@ -0,0 +1,5 @@ +

      <%= format_object_title(object) %> + <% if object.has_tag?(:abstract) %>Abstract<% end %> + <% if object.has_tag?(:deprecated) %>Deprecated<% end %> + <% if object.has_tag?(:api) && object.tag(:api).text == 'private' %>Private<% end %> +

      diff --git a/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/templates/default/module/html/inherited_attributes.erb b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/templates/default/module/html/inherited_attributes.erb new file mode 100644 index 000000000..e1ecad0fb --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/templates/default/module/html/inherited_attributes.erb @@ -0,0 +1,14 @@ +<% found_method = false %> +<% inherited_attr_list do |superclass, attribs| %> + <% if attr_listing.size == 0 && !found_method %>

      Instance Attribute Summary

      <% end %> + <% found_method = true %> +

      Attributes <%= superclass.type == :class ? 'inherited' : 'included' %> from <%= linkify superclass %>

      +

      <%= attribs.map do |method| + name = method.name(true).gsub(/=$/, '') + if superclass.type == :module && object.instance_mixins.include?(superclass) + name = "##{name}" unless name =~ /^#/ + end + linkify(method, name) + end.join(", ") + %>

      +<% end %> diff --git a/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/templates/default/module/html/inherited_constants.erb b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/templates/default/module/html/inherited_constants.erb new file mode 100644 index 000000000..d82594e92 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/templates/default/module/html/inherited_constants.erb @@ -0,0 +1,8 @@ +<% found_const = false %> +<% inherited_constant_list do |superclass, consts| %> + <% if constant_listing.size == 0 && !found_const %>

      Constant Summary

      <% end %> + <% found_const = true %> +

      Constants <%= superclass.type == :class ? 'inherited' : 'included' %> + from <%= linkify superclass %>

      +

      <%= consts.map {|c| linkify c }.join(", ") %>

      +<% end %> diff --git a/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/templates/default/module/html/inherited_methods.erb b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/templates/default/module/html/inherited_methods.erb new file mode 100644 index 000000000..7d13ce46e --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/templates/default/module/html/inherited_methods.erb @@ -0,0 +1,19 @@ +<% found_method = false %> +<% object.inheritance_tree(true)[1..-1].each do |superclass| %> + <% next if superclass.is_a?(YARD::CodeObjects::Proxy) %> + <% next if options.embed_mixins.size > 0 && options.embed_mixins_match?(superclass) != false %> + <% meths = prune_method_listing(superclass.meths(:included => false, :inherited => false)) %> + <% meths.reject! {|m| object.child(:scope => m.scope, :name => m.name) != nil } %> + <% meths.reject! {|m| m.is_alias? || m.is_attribute? } %> + <% next if meths.size == 0 %> + <% if method_listing.size == 0 && !found_method %>

      Method Summary

      <% end %> + <% found_method = true %> +

      Methods <%= superclass.type == :class ? 'inherited' : 'included' %> from <%= linkify superclass %>

      +

      <%= + meths.sort_by {|o| o.name.to_s }.map do |m| + name = m.name(true) + name = name.gsub(/^#/,'') if superclass.type == :module && object.class_mixins.include?(superclass) + linkify(m, name) + end.join(", ") + %>

      +<% end %> \ No newline at end of file diff --git a/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/templates/default/module/html/item_summary.erb b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/templates/default/module/html/item_summary.erb new file mode 100644 index 000000000..605096a50 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/templates/default/module/html/item_summary.erb @@ -0,0 +1,40 @@ +
    • + + <% if @item.tags(:overload).size == 1 %> + <%= signature(@item.tag(:overload), true, false, !@item.attr_info) %> + <% else %> + <%= signature(@item, true, false, !@item.attr_info) %> + <% end %> + + <% if @item.aliases.size > 0 %> + (also: <%= @item.aliases.map {|o| h(o.name(true)) }.join(", ") %>) + <% end %> + + <% if object != @item.namespace %> + + <%= @item.namespace.type == :class ? 'inherited' : (@item.scope == :class ? 'extended' : 'included') %> + from <%= linkify @item, object.relative_path(@item.namespace) %> + + <% end %> + <% if @item.constructor? %> + constructor + <% end %> + <% if rw = @item.attr_info %> + <% if !run_verifier([rw[:read]].compact).empty? && run_verifier([rw[:write]].compact).empty? %> + readonly + <% end %> + <% if !run_verifier([rw[:write]].compact).empty? && run_verifier([rw[:read]].compact).empty? %> + writeonly + <% end %> + <% end %> + <% if @item.visibility != :public %><%= @item.visibility %><% end %> + <% if @item.has_tag?(:abstract) %>abstract<% end %> + <% if @item.has_tag?(:deprecated) %>deprecated<% end %> + <% if @item.has_tag?(:api) && @item.tag(:api).text == 'private' %>private<% end %> + + <% if @item.has_tag?(:deprecated) %> + Deprecated. <%= htmlify_line @item.tag(:deprecated).text %> + <% else %> + <%= htmlify_line docstring_summary(@item) %> + <% end %> +
    • diff --git a/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/templates/default/module/html/method_details_list.erb b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/templates/default/module/html/method_details_list.erb new file mode 100644 index 000000000..52313b93c --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/templates/default/module/html/method_details_list.erb @@ -0,0 +1,9 @@ +<% scopes(method_listing(false)) do |list, scope| %> +
      +

      <%= scope.to_s.capitalize %> Method Details

      + + <% list.each_with_index do |meth, i| %> + <%= yieldall :object => meth, :owner => object, :index => i %> + <% end %> +
      +<% end %> diff --git a/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/templates/default/module/html/method_summary.erb b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/templates/default/module/html/method_summary.erb new file mode 100644 index 000000000..c05c4ee9a --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/templates/default/module/html/method_summary.erb @@ -0,0 +1,14 @@ +<% if method_listing.size > 0 %> + <% groups(method_listing) do |list, name| %> +

      + <%= name %> + collapse +

      + +
        + <% list.each do |meth| %> + <%= yieldall :item => meth %> + <% end %> +
      + <% end %> +<% end %> \ No newline at end of file diff --git a/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/templates/default/module/html/methodmissing.erb b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/templates/default/module/html/methodmissing.erb new file mode 100644 index 000000000..92899b5cf --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/templates/default/module/html/methodmissing.erb @@ -0,0 +1,12 @@ +
      +

      Dynamic Method Handling

      +

      + This class handles dynamic methods through the method_missing method + <% if @mm.namespace != object %> + in the class <%= linkify @mm, @mm.namespace.path %> + <% end %> +

      + <% if @mm.namespace == object %> + <%= yieldall :object => @mm, :index => 0 %> + <% end %> +
      diff --git a/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/templates/default/module/html/pre_docstring.erb b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/templates/default/module/html/pre_docstring.erb new file mode 100644 index 000000000..9f816c7dc --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/templates/default/module/html/pre_docstring.erb @@ -0,0 +1 @@ +

      Overview

      \ No newline at end of file diff --git a/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/templates/default/module/setup.rb b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/templates/default/module/setup.rb new file mode 100644 index 000000000..95bf3a4bb --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/templates/default/module/setup.rb @@ -0,0 +1,167 @@ +# frozen_string_literal: true +include Helpers::ModuleHelper + +def init + sections :header, :box_info, :pre_docstring, T('docstring'), :children, + :constant_summary, [T('docstring')], :inherited_constants, + :attribute_summary, [:item_summary], :inherited_attributes, + :method_summary, [:item_summary], :inherited_methods, + :methodmissing, [T('method_details')], + :attribute_details, [T('method_details')], + :method_details_list, [T('method_details')] +end + +def pre_docstring + return if object.docstring.blank? + erb(:pre_docstring) +end + +def children + @inner = [[:modules, []], [:classes, []]] + object.children.each do |child| + @inner[0][1] << child if child.type == :module + @inner[1][1] << child if child.type == :class + end + @inner.map! {|v| [v[0], run_verifier(v[1].sort_by {|o| o.name.to_s })] } + return if (@inner[0][1].size + @inner[1][1].size) == 0 + erb(:children) +end + +def methodmissing + mms = object.meths(:inherited => true, :included => true) + @mm = mms.find {|o| o.name == :method_missing && o.scope == :instance } + erb(:methodmissing) if @mm +end + +def method_listing(include_specials = true) + return @smeths ||= method_listing.reject {|o| special_method?(o) } unless include_specials + return @meths if defined?(@meths) && @meths + @meths = object.meths(:inherited => false, :included => !options.embed_mixins.empty?) + unless options.embed_mixins.empty? + @meths = @meths.reject {|m| options.embed_mixins_match?(m.namespace) == false } + end + @meths = sort_listing(prune_method_listing(@meths)) + @meths +end + +def special_method?(meth) + return true if meth.name(true) == '#method_missing' + return true if meth.constructor? + false +end + +def attr_listing + return @attrs if defined?(@attrs) && @attrs + @attrs = [] + object.inheritance_tree(true).each do |superclass| + next if superclass.is_a?(CodeObjects::Proxy) + next if !options.embed_mixins.empty? && + !options.embed_mixins_match?(superclass) + [:class, :instance].each do |scope| + superclass.attributes[scope].each do |_name, rw| + attr = prune_method_listing([rw[:read], rw[:write]].compact, false).first + @attrs << attr if attr + end + end + break if options.embed_mixins.empty? + end + @attrs = sort_listing(@attrs) +end + +def constant_listing + return @constants if defined?(@constants) && @constants + @constants = object.constants(:included => false, :inherited => false) + @constants += object.cvars + @constants = run_verifier(@constants) + @constants +end + +def sort_listing(list) + list.sort_by {|o| [o.scope.to_s, o.name.to_s.downcase] } +end + +def inherited_attr_list + object.inheritance_tree(true)[1..-1].each do |superclass| + next if superclass.is_a?(YARD::CodeObjects::Proxy) + next if !options.embed_mixins.empty? && options.embed_mixins_match?(superclass) != false + attribs = superclass.attributes[:instance] + attribs = attribs.select {|name, _rw| object.child(:scope => :instance, :name => name).nil? } + attribs = attribs.sort_by {|args| args.first.to_s }.map {|_n, m| m[:read] || m[:write] } + attribs = prune_method_listing(attribs, false) + yield superclass, attribs unless attribs.empty? + end +end + +def inherited_constant_list + object.inheritance_tree(true)[1..-1].each do |superclass| + next if superclass.is_a?(YARD::CodeObjects::Proxy) + next if !options.embed_mixins.empty? && options.embed_mixins_match?(superclass) != false + consts = superclass.constants(:included => false, :inherited => false) + consts = consts.select {|const| object.child(:type => :constant, :name => const.name).nil? } + consts = consts.sort_by {|const| const.name.to_s } + consts = run_verifier(consts) + yield superclass, consts unless consts.empty? + end +end + +def docstring_full(obj) + docstring = obj.tags(:overload).size == 1 && obj.docstring.empty? ? + obj.tag(:overload).docstring : obj.docstring + + if docstring.summary.empty? && obj.tags(:return).size == 1 && obj.tag(:return).text + docstring = Docstring.new(obj.tag(:return).text.gsub(/\A([a-z])/, &:upcase).strip) + end + + docstring +end + +def docstring_summary(obj) + docstring_full(obj).summary +end + +def groups(list, type = "Method") + groups_data = object.groups + if groups_data + list.each {|m| groups_data |= [m.group] if m.group && owner != m.namespace } + others = list.select {|m| !m.group || !groups_data.include?(m.group) } + groups_data.each do |name| + items = list.select {|m| m.group == name } + yield(items, name) unless items.empty? + end + else + others = [] + group_data = {} + list.each do |itm| + if itm.group + (group_data[itm.group] ||= []) << itm + else + others << itm + end + end + group_data.each {|group, items| yield(items, group) unless items.empty? } + end + + return if others.empty? + if others.first.respond_to?(:scope) + scopes(others) {|items, scope| yield(items, "#{scope.to_s.capitalize} #{type} Summary") } + else + yield(others, "#{type} Summary") + end +end + +def scopes(list) + [:class, :instance].each do |scope| + items = list.select {|m| m.scope == scope } + yield(items, scope) unless items.empty? + end +end + +def mixed_into(object) + unless globals.mixed_into + globals.mixed_into = {} + list = run_verifier Registry.all(:class, :module) + list.each {|o| o.mixins.each {|m| (globals.mixed_into[m.path] ||= []) << o } } + end + + globals.mixed_into[object.path] || [] +end diff --git a/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/templates/default/module/text/children.erb b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/templates/default/module/text/children.erb new file mode 100644 index 000000000..b17744633 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/templates/default/module/text/children.erb @@ -0,0 +1,10 @@ +Defined Under Namespace: +------------------------ + +<% @inner.each do |name, list| %> +<% if list.size > 0 %> +<% text = list.map {|c| c.name }.join(", ") + " (#{name})" %> +<%= indent(wrap(text)) %> + +<% end %> +<% end %> \ No newline at end of file diff --git a/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/templates/default/module/text/class_meths_list.erb b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/templates/default/module/text/class_meths_list.erb new file mode 100644 index 000000000..2fd508601 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/templates/default/module/text/class_meths_list.erb @@ -0,0 +1,8 @@ +<% if class_meths.size > 0 %> +Class methods: +-------------- + +<%= indent wrap(class_meths.map {|o| o.name.to_s }.join(", "), 68) %> + + +<% end %> \ No newline at end of file diff --git a/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/templates/default/module/text/extends.erb b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/templates/default/module/text/extends.erb new file mode 100644 index 000000000..1c03dcfb6 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/templates/default/module/text/extends.erb @@ -0,0 +1,8 @@ +<% if object.mixins(:class).size > 0 %> +Extended by: +------------ + +<%= indent wrap(object.mixins(:class).join(", "), 68) %> + + +<% end %> \ No newline at end of file diff --git a/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/templates/default/module/text/header.erb b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/templates/default/module/text/header.erb new file mode 100644 index 000000000..ea0b5eeb5 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/templates/default/module/text/header.erb @@ -0,0 +1,7 @@ +<%= title_align_right format_object_title(object) %> + +<%= yieldall %> + +<%= hr %> + + diff --git a/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/templates/default/module/text/includes.erb b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/templates/default/module/text/includes.erb new file mode 100644 index 000000000..7802f90aa --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/templates/default/module/text/includes.erb @@ -0,0 +1,8 @@ +<% if object.mixins(:instance).size > 0 %> +Includes: +--------- + +<%= indent wrap(object.mixins(:instance).join(", "), 68) %> + + +<% end %> \ No newline at end of file diff --git a/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/templates/default/module/text/instance_meths_list.erb b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/templates/default/module/text/instance_meths_list.erb new file mode 100644 index 000000000..b4507f3bc --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/templates/default/module/text/instance_meths_list.erb @@ -0,0 +1,8 @@ +<% if instance_meths.size > 0 %> +Instance methods: +----------------- + +<%= indent wrap(instance_meths.map {|o| o.name.to_s }.join(", "), 68) %> + + +<% end %> \ No newline at end of file diff --git a/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/templates/default/module/text/setup.rb b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/templates/default/module/text/setup.rb new file mode 100644 index 000000000..4f4dbf24e --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/templates/default/module/text/setup.rb @@ -0,0 +1,13 @@ +# frozen_string_literal: true +def init + sections :header, [T('docstring')], :children, :includes, :extends, + :class_meths_list, :instance_meths_list +end + +def class_meths + @classmeths ||= method_listing.select {|o| o.scope == :class } +end + +def instance_meths + @instmeths ||= method_listing.select {|o| o.scope == :instance } +end diff --git a/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/templates/default/onefile/html/files.erb b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/templates/default/onefile/html/files.erb new file mode 100644 index 000000000..c43eaec2b --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/templates/default/onefile/html/files.erb @@ -0,0 +1,5 @@ +<% @files.each do |file| %> + <% @file = file %> +

      <%= file.title %>

      + <%= diskfile %> +<% end %> \ No newline at end of file diff --git a/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/templates/default/onefile/html/headers.erb b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/templates/default/onefile/html/headers.erb new file mode 100644 index 000000000..bede05a1a --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/templates/default/onefile/html/headers.erb @@ -0,0 +1,6 @@ + + diff --git a/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/templates/default/onefile/html/layout.erb b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/templates/default/onefile/html/layout.erb new file mode 100644 index 000000000..4cb746913 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/templates/default/onefile/html/layout.erb @@ -0,0 +1,17 @@ + + + + + <%= defined?(@title) ? @title : '' %> + <%= erb(:headers) %> + + +
      +

      <%= defined?(@title) ? @title : '' %>

      + <%= yieldall %> +
      + + <%= erb(:footer) %> + + diff --git a/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/templates/default/onefile/html/readme.erb b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/templates/default/onefile/html/readme.erb new file mode 100644 index 000000000..b650b007b --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/templates/default/onefile/html/readme.erb @@ -0,0 +1,3 @@ +
      + <%= htmlify(parse_top_comments_from_file) %> +
      \ No newline at end of file diff --git a/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/templates/default/onefile/html/setup.rb b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/templates/default/onefile/html/setup.rb new file mode 100644 index 000000000..cd82aea14 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/templates/default/onefile/html/setup.rb @@ -0,0 +1,62 @@ +# frozen_string_literal: true +include T('default/layout/html') +include YARD::Parser::Ruby::Legacy + +def init + override_serializer + @object = YARD::Registry.root + @files.shift + @objects.delete(YARD::Registry.root) + @objects.unshift(YARD::Registry.root) + sections :layout, [:readme, :files, :all_objects] +end + +def all_objects + @objects.map {|obj| obj.format(options) }.join("\n") +end + +def layout + layout = Object.new.extend(T('layout')) + @css_data = layout.stylesheets.map {|sheet| read_asset(sheet) }.join("\n") + @js_data = layout.javascripts.map {|script| read_asset(script) }.join("") + + erb(:layout) +end + +def read_asset(file) + file = T('fulldoc').find_file(file) + return unless file + data = File.read(file) + superfile = self.class.find_nth_file('fulldoc', 2) + data.gsub!('{{{__super__}}}', superfile ? IO.read(superfile) : "") + data +end + +private + +def parse_top_comments_from_file + return unless defined?(@readme) && @readme + return @readme.contents unless @readme.filename =~ /\.rb$/ + data = "" + tokens = TokenList.new(@readme.contents) + tokens.each do |token| + break unless token.is_a?(RubyToken::TkCOMMENT) || token.is_a?(RubyToken::TkNL) + data += (token.text[/\A#\s{0,1}(.*)/, 1] || "\n") + end + YARD::Docstring.new(data) +end + +def override_serializer + return if @serializer.nil? + class << @serializer + define_method(:serialize) do |object, data| + return unless object == 'index.html' + super(object, data) + end + + define_method(:serialized_path) do |object| + return object if object.is_a?(String) + 'index.html' + end + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/templates/default/root/dot/child.erb b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/templates/default/root/dot/child.erb new file mode 100644 index 000000000..f3e8a7439 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/templates/default/root/dot/child.erb @@ -0,0 +1,3 @@ +<% if inner = yieldall.gsub("\n", '') %> +Root [label="{<%= inner %>}" rank=sink]; +<% end %> \ No newline at end of file diff --git a/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/templates/default/root/dot/setup.rb b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/templates/default/root/dot/setup.rb new file mode 100644 index 000000000..09e955732 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/templates/default/root/dot/setup.rb @@ -0,0 +1,6 @@ +# frozen_string_literal: true +include T('default/module/dot') + +def format_path(_object) + "" +end diff --git a/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/templates/default/root/html/setup.rb b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/templates/default/root/html/setup.rb new file mode 100644 index 000000000..f1f8fe117 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/templates/default/root/html/setup.rb @@ -0,0 +1,2 @@ +# frozen_string_literal: true +include T('default/module/html') diff --git a/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/templates/default/tags/html/example.erb b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/templates/default/tags/html/example.erb new file mode 100644 index 000000000..1129dfce6 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/templates/default/tags/html/example.erb @@ -0,0 +1,11 @@ +<% if object.has_tag?(:example) %> +
      +

      Examples:

      + <% object.tags(:example).each do |tag| %> + <% unless tag.name.empty? %> +

      <%= htmlify_line(tag.name) %>

      + <% end %> +
      <%= html_syntax_highlight(tag.text) %>
      + <% end %> +
      +<% end %> \ No newline at end of file diff --git a/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/templates/default/tags/html/index.erb b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/templates/default/tags/html/index.erb new file mode 100644 index 000000000..46d689321 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/templates/default/tags/html/index.erb @@ -0,0 +1,3 @@ +
      + <%= yieldall %> +
      \ No newline at end of file diff --git a/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/templates/default/tags/html/option.erb b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/templates/default/tags/html/option.erb new file mode 100644 index 000000000..0a6babccf --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/templates/default/tags/html/option.erb @@ -0,0 +1,24 @@ +<% if object.has_tag?(:option) %> + <% object.parameters.each do |param, default| %> + <% tags = object.tags(:option).select {|x| x.name.to_s == param.to_s.sub(/^\*+|:$/, '') } %> + <% next if tags.empty? %> +

      Options Hash (<%= param %>):

      +
        + <% for tag in tags %> +
      • + <%= tag.pair.name %> + <%= format_types(tag.pair.types || ['Object']) %> + + <% if tag.pair.defaults %> + — default: + <%= tag.pair.defaults.map {|t| "#{h t}" }.join(", ") %> + <% end %> + + <% if tag.pair.text && tag.pair.text =~ /\S/ %> + — <%= htmlify_line(tag.pair.text) %> + <% end %> +
      • + <% end %> +
      + <% end %> +<% end %> diff --git a/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/templates/default/tags/html/overload.erb b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/templates/default/tags/html/overload.erb new file mode 100644 index 000000000..85e6b67a5 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/templates/default/tags/html/overload.erb @@ -0,0 +1,14 @@ +<% if object.tags(:overload).size == 1 %> + <%= yieldall :object => object.tag(:overload) %> +<% elsif object.has_tag?(:overload) && object.tags(:overload).any? {|o| !o.docstring.blank? } %> +

      Overloads:

      +
        + <% object.tags(:overload).each do |overload| %> + <% next if overload.docstring.blank? %> +
      • + <%= signature(overload, false, false) %> + <%= yieldall :object => overload %> +
      • + <% end %> +
      +<% end %> \ No newline at end of file diff --git a/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/templates/default/tags/html/see.erb b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/templates/default/tags/html/see.erb new file mode 100644 index 000000000..725b2d550 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/templates/default/tags/html/see.erb @@ -0,0 +1,8 @@ +<% if object.has_tag?(:see) %> +

      See Also:

      +
        + <% for tag in object.tags(:see) %> +
      • <%= linkify(tag.name, tag.text) %>
      • + <% end %> +
      +<% end %> \ No newline at end of file diff --git a/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/templates/default/tags/html/tag.erb b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/templates/default/tags/html/tag.erb new file mode 100644 index 000000000..a7490ee80 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/templates/default/tags/html/tag.erb @@ -0,0 +1,20 @@ +

      <%= (defined?(@label) && @label) ? @label : YARD::Tags::Library.labels[@name] %>:

      +
        + <% object.tags(@name).each do |tag| %> +
      • + <% unless @no_names %> + <%= h tag.name %> + <% end %> + <% unless @no_types %> + <%= format_types(tag.types) %> + <% end %> + <% if @name == :param && (o=object.parameters.find {|a| [tag.name.to_s, tag.name.to_s + ":"].include?(a[0]) }) && o[1] %> + (defaults to: <%= h o[1] %>) + <% end %> + <% if tag.text && !tag.text.empty? %> + <% unless (@no_types || tag.types.nil? || tag.types.empty?) && @no_names %>—<% end %> + <%= htmlify_line(tag.text) %> + <% end %> +
      • + <% end %> +
      diff --git a/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/templates/default/tags/setup.rb b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/templates/default/tags/setup.rb new file mode 100644 index 000000000..6344ab43f --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/templates/default/tags/setup.rb @@ -0,0 +1,57 @@ +# frozen_string_literal: true +def init + tags = Tags::Library.visible_tags - [:abstract, :deprecated, :note, :todo] + create_tag_methods(tags - [:example, :option, :overload, :see]) + sections :index, tags.map {|t| t.to_s.tr('.', '_').to_sym } + sections.any(:overload).push(T('docstring')) +end + +def return + if object.type == :method + return if object.constructor? + return if object.tags(:return).size == 1 && object.tag(:return).types == ['void'] + end + tag(:return) +end + +def param + tag(:param) if object.type == :method +end + +private + +def tag(name, opts = nil) + return unless object.has_tag?(name) + opts ||= options_for_tag(name) + @no_names = opts[:no_names] ? true : false + @no_types = opts[:no_types] ? true : false + @name = name + out = erb('tag') + @no_names = nil + @no_types = nil + out +end + +def create_tag_methods(tags) + tags.each do |tag| + tag_meth = tag.to_s.tr('.', '_') + next if respond_to?(tag_meth) + instance_eval(<<-eof, __FILE__, __LINE__ + 1) + def #{tag_meth}; tag(#{tag.inspect}) end + eof + end +end + +def options_for_tag(tag) + opts = {:no_types => true, :no_names => true} + case Tags::Library.factory_method_for(tag) + when :with_types + opts[:no_types] = false + when :with_types_and_name + opts[:no_types] = false + opts[:no_names] = false + when :with_name + opts[:no_names] = false + end + opts +end diff --git a/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/templates/default/tags/text/example.erb b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/templates/default/tags/text/example.erb new file mode 100644 index 000000000..16a0e1143 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/templates/default/tags/text/example.erb @@ -0,0 +1,12 @@ +<% if object.has_tag?(:example) %> + +Examples: +--------- + +<% object.tags(:example).each_with_index do |tag, i| %> +<%= indent("# " + tag.name + "\n") if tag.name %> +<%= indent(format_source(tag.text)) + "\n" %> +<%= "\n" if i < object.tags(:example).size - 1 %> +<% end %> +<% end %> + diff --git a/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/templates/default/tags/text/index.erb b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/templates/default/tags/text/index.erb new file mode 100644 index 000000000..f2356c3da --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/templates/default/tags/text/index.erb @@ -0,0 +1 @@ +<%= yieldall %> diff --git a/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/templates/default/tags/text/option.erb b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/templates/default/tags/text/option.erb new file mode 100644 index 000000000..1957979ca --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/templates/default/tags/text/option.erb @@ -0,0 +1,20 @@ +<% if object.has_tag?(:option) %> +<% object.parameters.each do |param, default| %> +<% tags = object.tags(:option).select {|x| x.name.to_s == param.to_s.sub(/^\*+|:$/, '') } %> +<% next if tags.empty? %> +Options Hash (<%= param %>): +--------------<%= hr(param.to_s.length) %>-- + +<% for tag in tags %> +<% text = "" %> +<% text += format_types(tag.pair.types || ['Object']) %> +<% text += " " + tag.pair.name.to_s %> +<% if tag.pair.defaults %> +<% text += " - default: " + tag.pair.defaults.join(", ") %> +<% end %> +<% text += " - " + tag.pair.text if tag.pair.text %> +<%= indent(wrap(text)) %> + +<% end %> +<% end %> +<% end %> diff --git a/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/templates/default/tags/text/overload.erb b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/templates/default/tags/text/overload.erb new file mode 100644 index 000000000..cb3c60490 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/templates/default/tags/text/overload.erb @@ -0,0 +1,19 @@ +<% if object.tags(:overload).size == 1 %> +<%= wrap(yieldall(:object => object.tag(:overload))) %> +<% elsif object.has_tag?(:overload) %> +Overloads: +---------- + +<% object.tags(:overload).each do |overload| %> +<% if overload.tags.size > 0 %> +<%= hr %> + +<%= indent signature(overload) %> + +<%= hr %> + +<%= indent(wrap(yieldall(:object => overload))) %> + +<% end %> +<% end %> +<% end %> diff --git a/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/templates/default/tags/text/see.erb b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/templates/default/tags/text/see.erb new file mode 100644 index 000000000..af07f8b00 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/templates/default/tags/text/see.erb @@ -0,0 +1,11 @@ +<% if object.has_tag?(:see) %> +See Also: +--------- + +<% for tag in object.tags(:see) %> +<% text = "- " + tag.name %> +<% text += " - " + tag.text if tag.text && !tag.text.empty? %> +<%= indent(wrap(text)) %> +<% end %> +<% end %> + diff --git a/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/templates/default/tags/text/tag.erb b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/templates/default/tags/text/tag.erb new file mode 100644 index 000000000..5c51656ff --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/templates/default/tags/text/tag.erb @@ -0,0 +1,13 @@ +<% title = (defined?(@label) && @label) ? @label : YARD::Tags::Library.labels[@name] %> +<%= title %>: +<%= hr(title.length) %>- + +<% object.tags(@name).each do |tag| %> +<% text = "" %> +<% text += format_types(tag.types) + " " unless @no_types || tag.types.nil? %> +<% text += tag.name.to_s + " " unless @no_names %> +<% text += "- " unless @no_names && @no_types %> +<% text += tag.text if tag.text && !tag.text.empty? %> +<%= indent wrap(text) %> + +<% end %> diff --git a/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/templates/guide/class/html/setup.rb b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/templates/guide/class/html/setup.rb new file mode 100644 index 000000000..29dd77462 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/templates/guide/class/html/setup.rb @@ -0,0 +1,2 @@ +# frozen_string_literal: true +include T('guide/module/html') diff --git a/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/templates/guide/docstring/html/setup.rb b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/templates/guide/docstring/html/setup.rb new file mode 100644 index 000000000..8ac0a27ff --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/templates/guide/docstring/html/setup.rb @@ -0,0 +1,2 @@ +# frozen_string_literal: true +include T('default/docstring/html') diff --git a/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/templates/guide/fulldoc/html/css/style.css b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/templates/guide/fulldoc/html/css/style.css new file mode 100644 index 000000000..da037b56f --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/templates/guide/fulldoc/html/css/style.css @@ -0,0 +1,108 @@ +body { color: #3e4349; font-family: Georgia, serif; font-size: 17px; margin: 0; } +h1, h2, h3, h4, h5, h6 { font-weight: normal; color: #000; font-family: Georgia, serif; } +h1 { color: #040; } +h2 { color: #060; } +h3 { color: #070; } +h4 { color: #080; } +h5 { color: #090; } +#sidebar h2 { color: #2f2; } +strong { color: #000; } +.object_link, tt, code { font-family: 'Consolas', 'BitStream Vera Sans Mono', monospace; font-size: 14px; } +.method_header .path, .module_header .path { font-family: 'Consolas', 'BitStream Vera Sans Mono', monospace; } +.method_header .path.space, .module_header .path.space { padding-left: 5px; } +.method_header { font-size: 0.95em; } +.method_body { margin-left: 2em; } +.tags h3, .tags h4 { font-size: 0.9em; font-weight: bold; color: #3e4349; } +.tags .param .name { font-style: italic; } +.tags .option .name { font-family: monospace; color: #000; font-size: 0.8em; } +.tags .option .type, .tags .param .type { font-size: 10px; vertical-align: super; } +.tags .option .type tt, .tags .param .type tt, +.tags .option .type tt .object_link, .tags .param .type tt .object_link { font-size: 10px; } +.module_methods { margin-left: 2em; } +.method_header .since, .module_header .since { font-size: 0.75em; color: #888; vertical-align: super; } +ul { list-style: square; } +.inline { display: inline; } +.inline p:first-child { display: inline; } +.inline p { font-family: Georgia, serif; font-size: 16px; color: #3e4349; } +#filecontents table, .docstring table { border-collapse: collapse; } +#filecontents table th, #filecontents table td, +.docstring table th, .docstring table td { border: 1px solid #ccc; padding: 8px; padding-right: 17px; } +#filecontents table tr:nth-child(odd), +.docstring table tr:nth-child(odd) { background: #eee; } +#filecontents table tr:nth-child(even), +.docstring table tr:nth-child(even) { background: #fff; } +#filecontents table th, .docstring table th { background: #fff; } +.docstring .note { margin: 1em 0; } +.docstring h1, .docstring h2, .docstring h3, .docstring h4 { padding: 0; border: 0; border-bottom: 1px dotted #bbb; } +.docstring h1 { font-size: 1.2em; } +.docstring h2 { font-size: 1.1em; } +.docstring h3 { font-size: 1.1em; } +.docstring h4 { font-size: 1.0em; font-weight: bold; } +.docstring h5 { font-size: 1.0em; font-weight: bold; } +.docstring h6 { font-size: 1.0em; font-weight: bold; } +#filecontents strong { font-weight: normal; color: #000; } +.readonly { font-size: 0.75em; color: #888; vertical-align: super; } +.rdoc-term { padding-right: 25px; font-weight: bold; } +.rdoc-list p { margin: 0; padding: 0; margin-bottom: 4px; } + +#page { width: 940px; margin: 0px auto; } +#top_nav { background: #7d0; padding: 8px 12px; } +#inner_nav { width: 940px; margin: 0px auto; } +#inner_nav a { border: 0; text-decoration: none; color: #777; } +#inner_nav a:hover { color: #222; } +#top_nav .links { display: block; float: right; } +#content { margin-left: 30px; width: 660px; float: left; } +#sidebar { float: left; width: 200px; float: left; padding: 18px 10px; padding-top: 0; } +#sidebar h2 { font-weight: 100; color: #3e4349; font-size: 1.45em; } +#sidebar ol { padding-left: 16px; margin-left: 0; list-style: square; } +#sidebar a { color: #468; text-decoration: none; } +#sidebar a:hover { color: #000; background: #8e0; padding: 4px; } +#sidebar ol.top { padding-left: 0; margin-left: 0; list-style: none; } +#sidebar a { font-size: 0.9em; } +#footer { margin: 0 auto; width: 940px; text-align: center; margin-top: 30px; padding: 20px 0; color: #888; font-size: 0.8em; border-top: 1px dotted #bbb; } +#footer a { color: #444; } +#links strong { font-size: 0.95em; font-weight: normal; color: #000; } + +a { color: #268; text-decoration: none; } +a:hover { color: #6ae; } + +/* syntax highlighting */ +.source_code { display: none; padding: 3px 8px; border-left: 8px solid #ddd; margin-top: 5px; } +#filecontents pre.code, .docstring pre.code, .source_code pre { font-family: monospace; } +#filecontents pre.code, .docstring pre.code { display: block; } +.source_code .lines { padding-right: 12px; color: #555; text-align: right; } +#filecontents pre.code, .docstring pre.code, +.tags pre.example { + font-size: 0.9em; + padding: 7px 30px; + margin: 15px -30px; + margin-left: -30px; + background: #eee; + line-height: 1.3em; + font-family: 'Consolas', 'BitStream Vera Sans Mono', monospace; + } +pre.code { color: #3e4349; } +pre.code .info.file { color: #555; } +pre.code .val { color: #036A07; } +pre.code .tstring_content, +pre.code .heredoc_beg, pre.code .heredoc_end, +pre.code .qwords_beg, pre.code .qwords_end, +pre.code .tstring, pre.code .dstring { color: #036A07; } +pre.code .fid, pre.code .rubyid_new, pre.code .rubyid_to_s, +pre.code .rubyid_to_sym, pre.code .rubyid_to_f, +pre.code .dot + pre.code .id, +pre.code .rubyid_to_i pre.code .rubyid_each { color: #0085FF; } +pre.code .comment { color: #0066FF; } +pre.code .const, pre.code .constant { color: #585CF6; } +pre.code .symbol { color: #C5060B; } +pre.code .kw, +pre.code .label, +pre.code .rubyid_require, +pre.code .rubyid_extend, +pre.code .rubyid_include { color: #0000FF; } +pre.code .ivar { color: #318495; } +pre.code .gvar, +pre.code .rubyid_backref, +pre.code .rubyid_nth_ref { color: #6D79DE; } +pre.code .regexp, .dregexp { color: #036A07; } +pre.code a { border-bottom: 1px dotted #bbf; } diff --git a/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/templates/guide/fulldoc/html/js/app.js b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/templates/guide/fulldoc/html/js/app.js new file mode 100644 index 000000000..b069e8bca --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/templates/guide/fulldoc/html/js/app.js @@ -0,0 +1,33 @@ +function generateTOC() { + if ($('#filecontents').length == 0) return; + var _toc = $('
        '); + var show = false; + var toc = _toc; + var counter = 0; + var tags = ['h1', 'h2', 'h3', 'h4', 'h5', 'h6']; + for (i in tags) { tags[i] = '#filecontents > ' + tags[i] } + var lastTag = parseInt(tags[0][1]); + $(tags.join(', ')).each(function() { + if (this.id == "filecontents") return; + show = true; + var thisTag = parseInt(this.tagName[1]); + if (this.id.length == 0) { + var proposedId = $(this).text().replace(/[^a-z0-9-]/ig, '_'); + if ($('#' + proposedId).length > 0) proposedId += counter++; + this.id = proposedId; + } + if (thisTag > lastTag) { + for (var i = 0; i < thisTag - lastTag; i++) { + var tmp = $('
          '); toc.append(tmp); toc = tmp; + } + } + if (thisTag < lastTag) { + for (var i = 0; i < lastTag - thisTag; i++) toc = toc.parent(); + } + toc.append('
        1. ' + $(this).text() + '
        2. '); + lastTag = thisTag; + }); + if (!show) return; + $('#toc').append() + $('#toc').append(_toc); +} diff --git a/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/templates/guide/fulldoc/html/setup.rb b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/templates/guide/fulldoc/html/setup.rb new file mode 100644 index 000000000..87d4b121b --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/templates/guide/fulldoc/html/setup.rb @@ -0,0 +1,74 @@ +# frozen_string_literal: true +include T('default/fulldoc/html') + +module OverrideFileLinks + def resolve_links(text) + result = '' + log.enter_level(Logger::ERROR) { result = super } + result + end + + def url_for(object, *args) + if CodeObjects::ExtraFileObject === object && object == options.readme + 'index.html' + else + super + end + end +end + +Template.extra_includes << OverrideFileLinks + +def init + class << options.serializer + define_method(:serialized_path) do |object| + if CodeObjects::ExtraFileObject === object + super(object).sub(/^file\./, '').downcase + else + super(object) + end + end + end if options.serializer + + return serialize_onefile if options.onefile + + generate_assets + options.delete(:objects) + options.files.each {|file| serialize_file(file) } + serialize_file(options.readme) if options.readme +end + +def generate_assets + %w(js/jquery.js js/app.js css/style.css css/common.css).each do |file| + asset(file, file(file, true)) + end +end + +def serialize_file(file) + index = options.files.index(file) + outfile = file.name.downcase + '.html' + options.file = file + if file.attributes[:namespace] + options.object = Registry.at(file.attributes[:namespace]) + end + options.object ||= Registry.root + + if file == options.readme + serialize_index(options) + else + serialize_index(options) if !options.readme && index == 0 + Templates::Engine.with_serializer(outfile, options.serializer) do + T('layout').run(options) + end + end + options.delete(:file) +end + +def serialize_onefile + layout = Object.new.extend(T('layout')) + options.css_data = layout.stylesheets.map {|sheet| file(sheet, true) }.join("\n") + options.js_data = layout.javascripts.map {|script| file(script, true) }.join("") + Templates::Engine.with_serializer('onefile.html', options.serializer) do + T('onefile').run(options) + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/templates/guide/layout/html/layout.erb b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/templates/guide/layout/html/layout.erb new file mode 100644 index 000000000..8e2a1223b --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/templates/guide/layout/html/layout.erb @@ -0,0 +1,81 @@ + + + + <%= erb(:headers) %> + + + +
          +
          + <% if options.readme != options.file && options.title %> + <%= options.title %>: <%= @page_title %> + + <% links = [@prevfile ? link_file(@prevfile, '←') : nil, + link_file('index.html', '↑'), + @nextfile ? link_file(@nextfile, '→') : nil].compact %> + <%= links.join(" ") %> + + <% end %> +
          +
          +
          + +
          <%= yieldall %>
          +
          +
          + <%= erb(:footer) %> + + diff --git a/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/templates/guide/layout/html/setup.rb b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/templates/guide/layout/html/setup.rb new file mode 100644 index 000000000..e6e236893 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/templates/guide/layout/html/setup.rb @@ -0,0 +1,25 @@ +# frozen_string_literal: true +include T('default/layout/html') + +def init + super + + @topfile = options.readme + if options.files + if @topfile + @toptitle = @topfile.attributes[:title] || "Documentation Overview" + end + @page_title = @file == options.readme ? options.title : @file.title + + index = options.files.index(@file) + if index + @prevfile = index > 0 ? (options.files[index - 1] || options.readme) : nil + @nextfile = options.files[index + 1] + end + end +end + +def diskfile + options.including_object = @object + super +end diff --git a/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/templates/guide/method/html/header.erb b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/templates/guide/method/html/header.erb new file mode 100644 index 000000000..bded2eef8 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/templates/guide/method/html/header.erb @@ -0,0 +1,18 @@ +
          + <% if options.in_module %> + <% if object.constructor? %> + self.new(<%= format_args(object) %>) <%= format_block(object) %> + <% else %> + <%= object.scope == :class ? 'self.' : '' %><%= object.is_attribute? ? object.name.to_s.sub(/=$/, '') : object.name %><% if object.is_attribute? %> + <% rw = object.attr_info %> + <% if rw && rw[:read] && !rw[:write] %>readonly + <% elsif rw && !rw[:read] && rw[:write] %>writeonly + <% end %> + <% else %>(<%= format_args(object) %>) <%= format_block(object) %><% end %> + <% end %> + <% else %> + def <%= options.including_object.relative_path(object.namespace) %><%= object.send(:sep) %><%= object.name %>(<%= format_args(object) %>) <%= format_block(object) %> + <% end %> + <% if object.has_tag?(:since) && object.namespace.tag(:since) != object.tag(:since) %>since <%= object.tag(:since).text %><% end %> +
          +
          <%= yieldall %>
          \ No newline at end of file diff --git a/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/templates/guide/method/html/setup.rb b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/templates/guide/method/html/setup.rb new file mode 100644 index 000000000..e2888fea0 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/templates/guide/method/html/setup.rb @@ -0,0 +1,22 @@ +# frozen_string_literal: true +def init + sections :header, [T('docstring')] +end + +def format_args(object) + return if object.parameters.nil? + params = object.parameters + if object.has_tag?(:yield) || object.has_tag?(:yieldparam) + params.reject! do |param| + param[0].to_s[0, 1] == "&" && + !object.tags(:param).any? {|t| t.name == param[0][1..-1] } + end + end + + if params.empty? + "" + else + args = params.map {|n, v| v ? "#{h n} = #{h v}" : "" + n.to_s + "" }.join(", ") + args + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/templates/guide/module/html/header.erb b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/templates/guide/module/html/header.erb new file mode 100644 index 000000000..f29eac52b --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/templates/guide/module/html/header.erb @@ -0,0 +1,7 @@ +
          + <%= object.type %> <%= object.namespace == Registry.root ? '' : object.namespace.path + '::' %><%= object.name %> + <% if object.has_tag?(:since) %>since <%= object.tag(:since).text %><% end %> +
          +
          + <%= yieldall %> +
          \ No newline at end of file diff --git a/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/templates/guide/module/html/method_list.erb b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/templates/guide/module/html/method_list.erb new file mode 100644 index 000000000..27d0832b5 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/templates/guide/module/html/method_list.erb @@ -0,0 +1,5 @@ +
          + <% @meths.each_with_index do |meth, i| %> + <%= yieldall(:object => meth, :index => i, :in_module => true) %> + <% end %> +
          \ No newline at end of file diff --git a/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/templates/guide/module/html/setup.rb b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/templates/guide/module/html/setup.rb new file mode 100644 index 000000000..9cb28a540 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/templates/guide/module/html/setup.rb @@ -0,0 +1,27 @@ +# frozen_string_literal: true +include Helpers::ModuleHelper + +def init + sections :header, [T('docstring')], :method_list, [T('method')] +end + +def method_list + @meths = object.meths(:inherited => false, :included => false) + cons = @meths.find(&:constructor?) + @meths = @meths.reject {|meth| special_method?(meth) } + @meths = sort_listing(prune_method_listing(@meths, false)) + @meths.unshift(cons) if cons + erb(:method_list) +end + +def sort_listing(list) + list.sort_by {|o| [o.scope.to_s, o.name.to_s.downcase] } +end + +def special_method?(meth) + return true if meth.writer? && meth.attr_info[:read] + return true if meth.name(true) == 'new' + return true if meth.name(true) == '#method_missing' + return true if meth.constructor? + false +end diff --git a/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/templates/guide/onefile/html/files.erb b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/templates/guide/onefile/html/files.erb new file mode 100644 index 000000000..4d02a7bc6 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/templates/guide/onefile/html/files.erb @@ -0,0 +1,4 @@ +<% @files.each do |file| %> + <% @file = file %> + <%= diskfile %> +<% end %> diff --git a/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/templates/guide/onefile/html/setup.rb b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/templates/guide/onefile/html/setup.rb new file mode 100644 index 000000000..6c2efd108 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/templates/guide/onefile/html/setup.rb @@ -0,0 +1,6 @@ +# frozen_string_literal: true +include T('default/onefile/html') + +def init + sections :layout, [:toc, :files] +end diff --git a/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/templates/guide/onefile/html/toc.erb b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/templates/guide/onefile/html/toc.erb new file mode 100644 index 000000000..96f947393 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/templates/guide/onefile/html/toc.erb @@ -0,0 +1,3 @@ +

          <%= @title %>

          +

          Table of Contents

          +
          diff --git a/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/templates/guide/tags/html/setup.rb b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/templates/guide/tags/html/setup.rb new file mode 100644 index 000000000..fe59cd75c --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/templates/guide/tags/html/setup.rb @@ -0,0 +1,9 @@ +# frozen_string_literal: true +include T('default/tags/html') + +def init + super + [:since, :see, :return].each do |section| + sections[:index].delete(section) + end +end diff --git a/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/yard.gemspec b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/yard.gemspec new file mode 100644 index 000000000..6b2d921e3 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/gems/yard-0.9.27/yard.gemspec @@ -0,0 +1,25 @@ +# frozen_string_literal: true +require File.expand_path('../lib/yard/version', __FILE__) + +Gem::Specification.new do |s| + s.name = "yard" + s.summary = "Documentation tool for consistent and usable documentation in Ruby." + s.description = <<-eof + YARD is a documentation generation tool for the Ruby programming language. + It enables the user to generate consistent, usable documentation that can be + exported to a number of formats very easily, and also supports extending for + custom Ruby constructs such as custom class level definitions. + eof + s.version = YARD::VERSION + s.author = "Loren Segal" + s.email = "lsegal@soen.ca" + s.homepage = "http://yardoc.org" + s.platform = Gem::Platform::RUBY + s.files = `git ls-files`.strip.split(/\s+/).reject {|f| f.match(%r{^spec/}) } + s.require_paths = ['lib'] + s.executables = ['yard', 'yardoc', 'yri'] + s.license = 'MIT' if s.respond_to?(:license=) + s.metadata['yard.run'] = 'yri' + + s.add_runtime_dependency 'webrick', '~> 1.7.0' +end diff --git a/vendor/bundle/ruby/3.1.0/plugins/yard_plugin.rb b/vendor/bundle/ruby/3.1.0/plugins/yard_plugin.rb new file mode 100644 index 000000000..efb8f5abd --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/plugins/yard_plugin.rb @@ -0,0 +1 @@ +require_relative '../gems/yard-0.9.27/lib/rubygems_plugin.rb' diff --git a/vendor/bundle/ruby/3.1.0/specifications/addressable-2.8.0.gemspec b/vendor/bundle/ruby/3.1.0/specifications/addressable-2.8.0.gemspec new file mode 100644 index 000000000..72dc15514 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/specifications/addressable-2.8.0.gemspec @@ -0,0 +1,36 @@ +# -*- encoding: utf-8 -*- +# stub: addressable 2.8.0 ruby lib + +Gem::Specification.new do |s| + s.name = "addressable".freeze + s.version = "2.8.0" + + s.required_rubygems_version = Gem::Requirement.new(">= 0".freeze) if s.respond_to? :required_rubygems_version= + s.require_paths = ["lib".freeze] + s.authors = ["Bob Aman".freeze] + s.date = "2021-07-03" + s.description = "Addressable is an alternative implementation to the URI implementation that is\npart of Ruby's standard library. It is flexible, offers heuristic parsing, and\nadditionally provides extensive support for IRIs and URI templates.\n".freeze + s.email = "bob@sporkmonger.com".freeze + s.extra_rdoc_files = ["README.md".freeze] + s.files = ["README.md".freeze] + s.homepage = "https://github.com/sporkmonger/addressable".freeze + s.licenses = ["Apache-2.0".freeze] + s.rdoc_options = ["--main".freeze, "README.md".freeze] + s.required_ruby_version = Gem::Requirement.new(">= 2.0".freeze) + s.rubygems_version = "3.3.27".freeze + s.summary = "URI Implementation".freeze + + s.installed_by_version = "3.3.27" if s.respond_to? :installed_by_version + + if s.respond_to? :specification_version then + s.specification_version = 4 + end + + if s.respond_to? :add_runtime_dependency then + s.add_runtime_dependency(%q.freeze, [">= 2.0.2", "< 5.0"]) + s.add_development_dependency(%q.freeze, [">= 1.0", "< 3.0"]) + else + s.add_dependency(%q.freeze, [">= 2.0.2", "< 5.0"]) + s.add_dependency(%q.freeze, [">= 1.0", "< 3.0"]) + end +end diff --git a/vendor/bundle/ruby/3.1.0/specifications/ast-2.4.2.gemspec b/vendor/bundle/ruby/3.1.0/specifications/ast-2.4.2.gemspec new file mode 100644 index 000000000..daec0c551 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/specifications/ast-2.4.2.gemspec @@ -0,0 +1,42 @@ +# -*- encoding: utf-8 -*- +# stub: ast 2.4.2 ruby lib + +Gem::Specification.new do |s| + s.name = "ast".freeze + s.version = "2.4.2" + + s.required_rubygems_version = Gem::Requirement.new(">= 0".freeze) if s.respond_to? :required_rubygems_version= + s.require_paths = ["lib".freeze] + s.authors = ["whitequark".freeze] + s.date = "2021-01-23" + s.description = "A library for working with Abstract Syntax Trees.".freeze + s.email = ["whitequark@whitequark.org".freeze] + s.homepage = "https://whitequark.github.io/ast/".freeze + s.licenses = ["MIT".freeze] + s.rubygems_version = "3.3.27".freeze + s.summary = "A library for working with Abstract Syntax Trees.".freeze + + s.installed_by_version = "3.3.27" if s.respond_to? :installed_by_version + + if s.respond_to? :specification_version then + s.specification_version = 4 + end + + if s.respond_to? :add_runtime_dependency then + s.add_development_dependency(%q.freeze, ["~> 12.3"]) + s.add_development_dependency(%q.freeze, ["~> 1.2"]) + s.add_development_dependency(%q.freeze, [">= 0"]) + s.add_development_dependency(%q.freeze, [">= 0"]) + s.add_development_dependency(%q.freeze, ["~> 0.8.23"]) + s.add_development_dependency(%q.freeze, [">= 0"]) + s.add_development_dependency(%q.freeze, [">= 0"]) + else + s.add_dependency(%q.freeze, ["~> 12.3"]) + s.add_dependency(%q.freeze, ["~> 1.2"]) + s.add_dependency(%q.freeze, [">= 0"]) + s.add_dependency(%q.freeze, [">= 0"]) + s.add_dependency(%q.freeze, ["~> 0.8.23"]) + s.add_dependency(%q.freeze, [">= 0"]) + s.add_dependency(%q.freeze, [">= 0"]) + end +end diff --git a/vendor/bundle/ruby/3.1.0/specifications/crack-0.4.5.gemspec b/vendor/bundle/ruby/3.1.0/specifications/crack-0.4.5.gemspec new file mode 100644 index 000000000..9dfb33b8d --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/specifications/crack-0.4.5.gemspec @@ -0,0 +1,30 @@ +# -*- encoding: utf-8 -*- +# stub: crack 0.4.5 ruby lib + +Gem::Specification.new do |s| + s.name = "crack".freeze + s.version = "0.4.5" + + s.required_rubygems_version = Gem::Requirement.new(">= 0".freeze) if s.respond_to? :required_rubygems_version= + s.require_paths = ["lib".freeze] + s.authors = ["John Nunemaker".freeze] + s.date = "2020-12-27" + s.description = "Really simple JSON and XML parsing, ripped from Merb and Rails.".freeze + s.email = ["nunemaker@gmail.com".freeze] + s.homepage = "https://github.com/jnunemaker/crack".freeze + s.licenses = ["MIT".freeze] + s.rubygems_version = "3.3.27".freeze + s.summary = "Really simple JSON and XML parsing, ripped from Merb and Rails.".freeze + + s.installed_by_version = "3.3.27" if s.respond_to? :installed_by_version + + if s.respond_to? :specification_version then + s.specification_version = 4 + end + + if s.respond_to? :add_runtime_dependency then + s.add_runtime_dependency(%q.freeze, [">= 0"]) + else + s.add_dependency(%q.freeze, [">= 0"]) + end +end diff --git a/vendor/bundle/ruby/3.1.0/specifications/diff-lcs-1.5.0.gemspec b/vendor/bundle/ruby/3.1.0/specifications/diff-lcs-1.5.0.gemspec new file mode 100644 index 000000000..beef025b6 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/specifications/diff-lcs-1.5.0.gemspec @@ -0,0 +1,50 @@ +# -*- encoding: utf-8 -*- +# stub: diff-lcs 1.5.0 ruby lib + +Gem::Specification.new do |s| + s.name = "diff-lcs".freeze + s.version = "1.5.0" + + s.required_rubygems_version = Gem::Requirement.new(">= 0".freeze) if s.respond_to? :required_rubygems_version= + s.metadata = { "bug_tracker_uri" => "https://github.com/halostatue/diff-lcs/issues", "homepage_uri" => "https://github.com/halostatue/diff-lcs", "source_code_uri" => "https://github.com/halostatue/diff-lcs" } if s.respond_to? :metadata= + s.require_paths = ["lib".freeze] + s.authors = ["Austin Ziegler".freeze] + s.date = "2021-12-23" + s.description = "Diff::LCS computes the difference between two Enumerable sequences using the\nMcIlroy-Hunt longest common subsequence (LCS) algorithm. It includes utilities\nto create a simple HTML diff output format and a standard diff-like tool.\n\nThis is release 1.4.3, providing a simple extension that allows for\nDiff::LCS::Change objects to be treated implicitly as arrays and fixes a\nnumber of formatting issues.\n\nRuby versions below 2.5 are soft-deprecated, which means that older versions\nare no longer part of the CI test suite. If any changes have been introduced\nthat break those versions, bug reports and patches will be accepted, but it\nwill be up to the reporter to verify any fixes prior to release. The next\nmajor release will completely break compatibility.".freeze + s.email = ["halostatue@gmail.com".freeze] + s.executables = ["htmldiff".freeze, "ldiff".freeze] + s.extra_rdoc_files = ["Code-of-Conduct.md".freeze, "Contributing.md".freeze, "History.md".freeze, "License.md".freeze, "Manifest.txt".freeze, "README.rdoc".freeze, "docs/COPYING.txt".freeze, "docs/artistic.txt".freeze] + s.files = ["Code-of-Conduct.md".freeze, "Contributing.md".freeze, "History.md".freeze, "License.md".freeze, "Manifest.txt".freeze, "README.rdoc".freeze, "bin/htmldiff".freeze, "bin/ldiff".freeze, "docs/COPYING.txt".freeze, "docs/artistic.txt".freeze] + s.homepage = "https://github.com/halostatue/diff-lcs".freeze + s.licenses = ["MIT".freeze, "Artistic-2.0".freeze, "GPL-2.0+".freeze] + s.rdoc_options = ["--main".freeze, "README.rdoc".freeze] + s.required_ruby_version = Gem::Requirement.new(">= 1.8".freeze) + s.rubygems_version = "3.3.27".freeze + s.summary = "Diff::LCS computes the difference between two Enumerable sequences using the McIlroy-Hunt longest common subsequence (LCS) algorithm".freeze + + s.installed_by_version = "3.3.27" if s.respond_to? :installed_by_version + + if s.respond_to? :specification_version then + s.specification_version = 4 + end + + if s.respond_to? :add_runtime_dependency then + s.add_development_dependency(%q.freeze, ["~> 1.0"]) + s.add_development_dependency(%q.freeze, ["~> 1.1"]) + s.add_development_dependency(%q.freeze, ["~> 1.6"]) + s.add_development_dependency(%q.freeze, ["~> 1.0"]) + s.add_development_dependency(%q.freeze, [">= 2.0", "< 4"]) + s.add_development_dependency(%q.freeze, [">= 10.0", "< 14"]) + s.add_development_dependency(%q.freeze, [">= 6.3.1", "< 7"]) + s.add_development_dependency(%q.freeze, ["~> 3.23"]) + else + s.add_dependency(%q.freeze, ["~> 1.0"]) + s.add_dependency(%q.freeze, ["~> 1.1"]) + s.add_dependency(%q.freeze, ["~> 1.6"]) + s.add_dependency(%q.freeze, ["~> 1.0"]) + s.add_dependency(%q.freeze, [">= 2.0", "< 4"]) + s.add_dependency(%q.freeze, [">= 10.0", "< 14"]) + s.add_dependency(%q.freeze, [">= 6.3.1", "< 7"]) + s.add_dependency(%q.freeze, ["~> 3.23"]) + end +end diff --git a/vendor/bundle/ruby/3.1.0/specifications/hashdiff-1.0.1.gemspec b/vendor/bundle/ruby/3.1.0/specifications/hashdiff-1.0.1.gemspec new file mode 100644 index 000000000..203f0246b --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/specifications/hashdiff-1.0.1.gemspec @@ -0,0 +1,40 @@ +# -*- encoding: utf-8 -*- +# stub: hashdiff 1.0.1 ruby lib + +Gem::Specification.new do |s| + s.name = "hashdiff".freeze + s.version = "1.0.1" + + s.required_rubygems_version = Gem::Requirement.new(">= 0".freeze) if s.respond_to? :required_rubygems_version= + s.metadata = { "bug_tracker_uri" => "https://github.com/liufengyun/hashdiff/issues", "changelog_uri" => "https://github.com/liufengyun/hashdiff/blob/master/changelog.md", "documentation_uri" => "https://www.rubydoc.info/gems/hashdiff", "homepage_uri" => "https://github.com/liufengyun/hashdiff", "source_code_uri" => "https://github.com/liufengyun/hashdiff" } if s.respond_to? :metadata= + s.require_paths = ["lib".freeze] + s.authors = ["Liu Fengyun".freeze] + s.date = "2020-02-27" + s.description = " Hashdiff is a diff lib to compute the smallest difference between two hashes. ".freeze + s.email = ["liufengyunchina@gmail.com".freeze] + s.homepage = "https://github.com/liufengyun/hashdiff".freeze + s.licenses = ["MIT".freeze] + s.required_ruby_version = Gem::Requirement.new(">= 2.0.0".freeze) + s.rubygems_version = "3.3.27".freeze + s.summary = "Hashdiff is a diff lib to compute the smallest difference between two hashes.".freeze + + s.installed_by_version = "3.3.27" if s.respond_to? :installed_by_version + + if s.respond_to? :specification_version then + s.specification_version = 4 + end + + if s.respond_to? :add_runtime_dependency then + s.add_development_dependency(%q.freeze, [">= 0"]) + s.add_development_dependency(%q.freeze, ["~> 2.0"]) + s.add_development_dependency(%q.freeze, ["~> 0.49.1"]) + s.add_development_dependency(%q.freeze, [">= 0"]) + s.add_development_dependency(%q.freeze, [">= 0"]) + else + s.add_dependency(%q.freeze, [">= 0"]) + s.add_dependency(%q.freeze, ["~> 2.0"]) + s.add_dependency(%q.freeze, ["~> 0.49.1"]) + s.add_dependency(%q.freeze, [">= 0"]) + s.add_dependency(%q.freeze, [">= 0"]) + end +end diff --git a/vendor/bundle/ruby/3.1.0/specifications/parallel-1.22.1.gemspec b/vendor/bundle/ruby/3.1.0/specifications/parallel-1.22.1.gemspec new file mode 100644 index 000000000..3d0d06380 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/specifications/parallel-1.22.1.gemspec @@ -0,0 +1,21 @@ +# -*- encoding: utf-8 -*- +# stub: parallel 1.22.1 ruby lib + +Gem::Specification.new do |s| + s.name = "parallel".freeze + s.version = "1.22.1" + + s.required_rubygems_version = Gem::Requirement.new(">= 0".freeze) if s.respond_to? :required_rubygems_version= + s.metadata = { "bug_tracker_uri" => "https://github.com/grosser/parallel/issues", "documentation_uri" => "https://github.com/grosser/parallel/blob/v1.22.1/Readme.md", "source_code_uri" => "https://github.com/grosser/parallel/tree/v1.22.1", "wiki_uri" => "https://github.com/grosser/parallel/wiki" } if s.respond_to? :metadata= + s.require_paths = ["lib".freeze] + s.authors = ["Michael Grosser".freeze] + s.date = "2022-03-25" + s.email = "michael@grosser.it".freeze + s.homepage = "https://github.com/grosser/parallel".freeze + s.licenses = ["MIT".freeze] + s.required_ruby_version = Gem::Requirement.new(">= 2.5".freeze) + s.rubygems_version = "3.3.27".freeze + s.summary = "Run any kind of code in parallel processes".freeze + + s.installed_by_version = "3.3.27" if s.respond_to? :installed_by_version +end diff --git a/vendor/bundle/ruby/3.1.0/specifications/parser-3.1.2.0.gemspec b/vendor/bundle/ruby/3.1.0/specifications/parser-3.1.2.0.gemspec new file mode 100644 index 000000000..9bd106b7f --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/specifications/parser-3.1.2.0.gemspec @@ -0,0 +1,52 @@ +# -*- encoding: utf-8 -*- +# stub: parser 3.1.2.0 ruby lib + +Gem::Specification.new do |s| + s.name = "parser".freeze + s.version = "3.1.2.0" + + s.required_rubygems_version = Gem::Requirement.new(">= 0".freeze) if s.respond_to? :required_rubygems_version= + s.metadata = { "bug_tracker_uri" => "https://github.com/whitequark/parser/issues", "changelog_uri" => "https://github.com/whitequark/parser/blob/v3.1.2.0/CHANGELOG.md", "documentation_uri" => "https://www.rubydoc.info/gems/parser/3.1.2.0", "source_code_uri" => "https://github.com/whitequark/parser/tree/v3.1.2.0" } if s.respond_to? :metadata= + s.require_paths = ["lib".freeze] + s.authors = ["whitequark".freeze] + s.date = "2022-04-12" + s.description = "A Ruby parser written in pure Ruby.".freeze + s.email = ["whitequark@whitequark.org".freeze] + s.executables = ["ruby-parse".freeze, "ruby-rewrite".freeze] + s.files = ["bin/ruby-parse".freeze, "bin/ruby-rewrite".freeze] + s.homepage = "https://github.com/whitequark/parser".freeze + s.licenses = ["MIT".freeze] + s.required_ruby_version = Gem::Requirement.new(">= 2.0.0".freeze) + s.rubygems_version = "3.3.27".freeze + s.summary = "A Ruby parser written in pure Ruby.".freeze + + s.installed_by_version = "3.3.27" if s.respond_to? :installed_by_version + + if s.respond_to? :specification_version then + s.specification_version = 4 + end + + if s.respond_to? :add_runtime_dependency then + s.add_runtime_dependency(%q.freeze, ["~> 2.4.1"]) + s.add_development_dependency(%q.freeze, [">= 1.15", "< 3.0.0"]) + s.add_development_dependency(%q.freeze, ["~> 13.0.1"]) + s.add_development_dependency(%q.freeze, ["= 1.4.15"]) + s.add_development_dependency(%q.freeze, ["~> 0.3.2"]) + s.add_development_dependency(%q.freeze, [">= 0"]) + s.add_development_dependency(%q.freeze, [">= 0"]) + s.add_development_dependency(%q.freeze, ["~> 5.10"]) + s.add_development_dependency(%q.freeze, ["~> 0.15.1"]) + s.add_development_dependency(%q.freeze, [">= 0"]) + else + s.add_dependency(%q.freeze, ["~> 2.4.1"]) + s.add_dependency(%q.freeze, [">= 1.15", "< 3.0.0"]) + s.add_dependency(%q.freeze, ["~> 13.0.1"]) + s.add_dependency(%q.freeze, ["= 1.4.15"]) + s.add_dependency(%q.freeze, ["~> 0.3.2"]) + s.add_dependency(%q.freeze, [">= 0"]) + s.add_dependency(%q.freeze, [">= 0"]) + s.add_dependency(%q.freeze, ["~> 5.10"]) + s.add_dependency(%q.freeze, ["~> 0.15.1"]) + s.add_dependency(%q.freeze, [">= 0"]) + end +end diff --git a/vendor/bundle/ruby/3.1.0/specifications/public_suffix-4.0.7.gemspec b/vendor/bundle/ruby/3.1.0/specifications/public_suffix-4.0.7.gemspec new file mode 100644 index 000000000..4b295de18 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/specifications/public_suffix-4.0.7.gemspec @@ -0,0 +1,24 @@ +# -*- encoding: utf-8 -*- +# stub: public_suffix 4.0.7 ruby lib + +Gem::Specification.new do |s| + s.name = "public_suffix".freeze + s.version = "4.0.7" + + s.required_rubygems_version = Gem::Requirement.new(">= 0".freeze) if s.respond_to? :required_rubygems_version= + s.metadata = { "bug_tracker_uri" => "https://github.com/weppos/publicsuffix-ruby/issues", "changelog_uri" => "https://github.com/weppos/publicsuffix-ruby/blob/master/CHANGELOG.md", "documentation_uri" => "https://rubydoc.info/gems/public_suffix/4.0.7", "homepage_uri" => "https://simonecarletti.com/code/publicsuffix-ruby", "source_code_uri" => "https://github.com/weppos/publicsuffix-ruby/tree/v4.0.7" } if s.respond_to? :metadata= + s.require_paths = ["lib".freeze] + s.authors = ["Simone Carletti".freeze] + s.date = "2022-04-12" + s.description = "PublicSuffix can parse and decompose a domain name into top level domain, domain and subdomains.".freeze + s.email = ["weppos@weppos.net".freeze] + s.extra_rdoc_files = ["LICENSE.txt".freeze] + s.files = ["LICENSE.txt".freeze] + s.homepage = "https://simonecarletti.com/code/publicsuffix-ruby".freeze + s.licenses = ["MIT".freeze] + s.required_ruby_version = Gem::Requirement.new(">= 2.3".freeze) + s.rubygems_version = "3.3.27".freeze + s.summary = "Domain name parser based on the Public Suffix List.".freeze + + s.installed_by_version = "3.3.27" if s.respond_to? :installed_by_version +end diff --git a/vendor/bundle/ruby/3.1.0/specifications/rainbow-3.1.1.gemspec b/vendor/bundle/ruby/3.1.0/specifications/rainbow-3.1.1.gemspec new file mode 100644 index 000000000..a769ed7dc --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/specifications/rainbow-3.1.1.gemspec @@ -0,0 +1,31 @@ +# -*- encoding: utf-8 -*- +# stub: rainbow 3.1.1 ruby lib + +Gem::Specification.new do |s| + s.name = "rainbow".freeze + s.version = "3.1.1" + + s.required_rubygems_version = Gem::Requirement.new(">= 0".freeze) if s.respond_to? :required_rubygems_version= + s.require_paths = ["lib".freeze] + s.authors = ["Marcin Kulik".freeze, "Olle Jonsson".freeze] + s.date = "2022-01-11" + s.description = "Colorize printed text on ANSI terminals".freeze + s.email = ["m@ku1ik.com".freeze] + s.homepage = "https://github.com/sickill/rainbow".freeze + s.licenses = ["MIT".freeze] + s.required_ruby_version = Gem::Requirement.new(">= 2.3.0".freeze) + s.rubygems_version = "3.3.27".freeze + s.summary = "Colorize printed text on ANSI terminals".freeze + + s.installed_by_version = "3.3.27" if s.respond_to? :installed_by_version + + if s.respond_to? :specification_version then + s.specification_version = 4 + end + + if s.respond_to? :add_runtime_dependency then + s.add_development_dependency(%q.freeze, [">= 1.3", "< 3"]) + else + s.add_dependency(%q.freeze, [">= 1.3", "< 3"]) + end +end diff --git a/vendor/bundle/ruby/3.1.0/specifications/rake-13.0.6.gemspec b/vendor/bundle/ruby/3.1.0/specifications/rake-13.0.6.gemspec new file mode 100644 index 000000000..ef0751d4e --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/specifications/rake-13.0.6.gemspec @@ -0,0 +1,26 @@ +# -*- encoding: utf-8 -*- +# stub: rake 13.0.6 ruby lib + +Gem::Specification.new do |s| + s.name = "rake".freeze + s.version = "13.0.6" + + s.required_rubygems_version = Gem::Requirement.new(">= 0".freeze) if s.respond_to? :required_rubygems_version= + s.metadata = { "bug_tracker_uri" => "https://github.com/ruby/rake/issues", "changelog_uri" => "https://github.com/ruby/rake/blob/v13.0.6/History.rdoc", "documentation_uri" => "https://ruby.github.io/rake", "source_code_uri" => "https://github.com/ruby/rake/tree/v13.0.6" } if s.respond_to? :metadata= + s.require_paths = ["lib".freeze] + s.authors = ["Hiroshi SHIBATA".freeze, "Eric Hodel".freeze, "Jim Weirich".freeze] + s.bindir = "exe".freeze + s.date = "2021-07-09" + s.description = "Rake is a Make-like program implemented in Ruby. Tasks and dependencies are\nspecified in standard Ruby syntax.\nRake has the following features:\n * Rakefiles (rake's version of Makefiles) are completely defined in standard Ruby syntax.\n No XML files to edit. No quirky Makefile syntax to worry about (is that a tab or a space?)\n * Users can specify tasks with prerequisites.\n * Rake supports rule patterns to synthesize implicit tasks.\n * Flexible FileLists that act like arrays but know about manipulating file names and paths.\n * Supports parallel execution of tasks.\n".freeze + s.email = ["hsbt@ruby-lang.org".freeze, "drbrain@segment7.net".freeze, "".freeze] + s.executables = ["rake".freeze] + s.files = ["exe/rake".freeze] + s.homepage = "https://github.com/ruby/rake".freeze + s.licenses = ["MIT".freeze] + s.rdoc_options = ["--main".freeze, "README.rdoc".freeze] + s.required_ruby_version = Gem::Requirement.new(">= 2.2".freeze) + s.rubygems_version = "3.3.27".freeze + s.summary = "Rake is a Make-like program implemented in Ruby".freeze + + s.installed_by_version = "3.3.27" if s.respond_to? :installed_by_version +end diff --git a/vendor/bundle/ruby/3.1.0/specifications/redcarpet-3.5.1.gemspec b/vendor/bundle/ruby/3.1.0/specifications/redcarpet-3.5.1.gemspec new file mode 100644 index 000000000..7f1ba4d9f --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/specifications/redcarpet-3.5.1.gemspec @@ -0,0 +1,40 @@ +# -*- encoding: utf-8 -*- +# stub: redcarpet 3.5.1 ruby lib +# stub: ext/redcarpet/extconf.rb + +Gem::Specification.new do |s| + s.name = "redcarpet".freeze + s.version = "3.5.1" + + s.required_rubygems_version = Gem::Requirement.new(">= 0".freeze) if s.respond_to? :required_rubygems_version= + s.require_paths = ["lib".freeze] + s.authors = ["Natacha Port\u00E9".freeze, "Vicent Mart\u00ED".freeze] + s.date = "2020-12-15" + s.description = "A fast, safe and extensible Markdown to (X)HTML parser".freeze + s.email = "vicent@github.com".freeze + s.executables = ["redcarpet".freeze] + s.extensions = ["ext/redcarpet/extconf.rb".freeze] + s.extra_rdoc_files = ["COPYING".freeze] + s.files = ["COPYING".freeze, "bin/redcarpet".freeze, "ext/redcarpet/extconf.rb".freeze] + s.homepage = "http://github.com/vmg/redcarpet".freeze + s.licenses = ["MIT".freeze] + s.required_ruby_version = Gem::Requirement.new(">= 1.9.2".freeze) + s.rubygems_version = "3.3.27".freeze + s.summary = "Markdown that smells nice".freeze + + s.installed_by_version = "3.3.27" if s.respond_to? :installed_by_version + + if s.respond_to? :specification_version then + s.specification_version = 4 + end + + if s.respond_to? :add_runtime_dependency then + s.add_development_dependency(%q.freeze, ["~> 12.2.1"]) + s.add_development_dependency(%q.freeze, ["~> 1.0.3"]) + s.add_development_dependency(%q.freeze, ["~> 3.2.3"]) + else + s.add_dependency(%q.freeze, ["~> 12.2.1"]) + s.add_dependency(%q.freeze, ["~> 1.0.3"]) + s.add_dependency(%q.freeze, ["~> 3.2.3"]) + end +end diff --git a/vendor/bundle/ruby/3.1.0/specifications/regexp_parser-2.3.1.gemspec b/vendor/bundle/ruby/3.1.0/specifications/regexp_parser-2.3.1.gemspec new file mode 100644 index 000000000..b228b4f41 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/specifications/regexp_parser-2.3.1.gemspec @@ -0,0 +1,23 @@ +# -*- encoding: utf-8 -*- +# stub: regexp_parser 2.3.1 ruby lib + +Gem::Specification.new do |s| + s.name = "regexp_parser".freeze + s.version = "2.3.1" + + s.required_rubygems_version = Gem::Requirement.new(">= 0".freeze) if s.respond_to? :required_rubygems_version= + s.metadata = { "bug_tracker_uri" => "https://github.com/ammar/regexp_parser/issues", "changelog_uri" => "https://github.com/ammar/regexp_parser/blob/master/CHANGELOG.md", "homepage_uri" => "https://github.com/ammar/regexp_parser", "source_code_uri" => "https://github.com/ammar/regexp_parser", "wiki_uri" => "https://github.com/ammar/regexp_parser/wiki" } if s.respond_to? :metadata= + s.require_paths = ["lib".freeze] + s.authors = ["Ammar Ali".freeze] + s.date = "2022-04-24" + s.description = "A library for tokenizing, lexing, and parsing Ruby regular expressions.".freeze + s.email = ["ammarabuali@gmail.com".freeze] + s.homepage = "https://github.com/ammar/regexp_parser".freeze + s.licenses = ["MIT".freeze] + s.rdoc_options = ["--inline-source".freeze, "--charset=UTF-8".freeze] + s.required_ruby_version = Gem::Requirement.new(">= 2.0.0".freeze) + s.rubygems_version = "3.3.27".freeze + s.summary = "Scanner, lexer, parser for ruby's regular expressions".freeze + + s.installed_by_version = "3.3.27" if s.respond_to? :installed_by_version +end diff --git a/vendor/bundle/ruby/3.1.0/specifications/rexml-3.2.5.gemspec b/vendor/bundle/ruby/3.1.0/specifications/rexml-3.2.5.gemspec new file mode 100644 index 000000000..c6f26ed7b --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/specifications/rexml-3.2.5.gemspec @@ -0,0 +1,38 @@ +# -*- encoding: utf-8 -*- +# stub: rexml 3.2.5 ruby lib + +Gem::Specification.new do |s| + s.name = "rexml".freeze + s.version = "3.2.5" + + s.required_rubygems_version = Gem::Requirement.new(">= 0".freeze) if s.respond_to? :required_rubygems_version= + s.require_paths = ["lib".freeze] + s.authors = ["Kouhei Sutou".freeze] + s.bindir = "exe".freeze + s.date = "2021-04-05" + s.description = "An XML toolkit for Ruby".freeze + s.email = ["kou@cozmixng.org".freeze] + s.extra_rdoc_files = ["LICENSE.txt".freeze, "NEWS.md".freeze, "README.md".freeze, "doc/rexml/context.rdoc".freeze, "doc/rexml/tasks/rdoc/child.rdoc".freeze, "doc/rexml/tasks/rdoc/document.rdoc".freeze, "doc/rexml/tasks/rdoc/element.rdoc".freeze, "doc/rexml/tasks/rdoc/node.rdoc".freeze, "doc/rexml/tasks/rdoc/parent.rdoc".freeze, "doc/rexml/tasks/tocs/child_toc.rdoc".freeze, "doc/rexml/tasks/tocs/document_toc.rdoc".freeze, "doc/rexml/tasks/tocs/element_toc.rdoc".freeze, "doc/rexml/tasks/tocs/master_toc.rdoc".freeze, "doc/rexml/tasks/tocs/node_toc.rdoc".freeze, "doc/rexml/tasks/tocs/parent_toc.rdoc".freeze] + s.files = ["LICENSE.txt".freeze, "NEWS.md".freeze, "README.md".freeze, "doc/rexml/context.rdoc".freeze, "doc/rexml/tasks/rdoc/child.rdoc".freeze, "doc/rexml/tasks/rdoc/document.rdoc".freeze, "doc/rexml/tasks/rdoc/element.rdoc".freeze, "doc/rexml/tasks/rdoc/node.rdoc".freeze, "doc/rexml/tasks/rdoc/parent.rdoc".freeze, "doc/rexml/tasks/tocs/child_toc.rdoc".freeze, "doc/rexml/tasks/tocs/document_toc.rdoc".freeze, "doc/rexml/tasks/tocs/element_toc.rdoc".freeze, "doc/rexml/tasks/tocs/master_toc.rdoc".freeze, "doc/rexml/tasks/tocs/node_toc.rdoc".freeze, "doc/rexml/tasks/tocs/parent_toc.rdoc".freeze] + s.homepage = "https://github.com/ruby/rexml".freeze + s.licenses = ["BSD-2-Clause".freeze] + s.rdoc_options = ["--main".freeze, "README.md".freeze] + s.rubygems_version = "3.3.27".freeze + s.summary = "An XML toolkit for Ruby".freeze + + s.installed_by_version = "3.3.27" if s.respond_to? :installed_by_version + + if s.respond_to? :specification_version then + s.specification_version = 4 + end + + if s.respond_to? :add_runtime_dependency then + s.add_development_dependency(%q.freeze, [">= 0"]) + s.add_development_dependency(%q.freeze, [">= 0"]) + s.add_development_dependency(%q.freeze, [">= 0"]) + else + s.add_dependency(%q.freeze, [">= 0"]) + s.add_dependency(%q.freeze, [">= 0"]) + s.add_dependency(%q.freeze, [">= 0"]) + end +end diff --git a/vendor/bundle/ruby/3.1.0/specifications/rspec-3.11.0.gemspec b/vendor/bundle/ruby/3.1.0/specifications/rspec-3.11.0.gemspec new file mode 100644 index 000000000..3f272feae --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/specifications/rspec-3.11.0.gemspec @@ -0,0 +1,39 @@ +# -*- encoding: utf-8 -*- +# stub: rspec 3.11.0 ruby lib + +Gem::Specification.new do |s| + s.name = "rspec".freeze + s.version = "3.11.0" + + s.required_rubygems_version = Gem::Requirement.new(">= 0".freeze) if s.respond_to? :required_rubygems_version= + s.metadata = { "bug_tracker_uri" => "https://github.com/rspec/rspec-metagem/issues", "documentation_uri" => "https://rspec.info/documentation/", "mailing_list_uri" => "https://groups.google.com/forum/#!forum/rspec", "source_code_uri" => "https://github.com/rspec/rspec-metagem" } if s.respond_to? :metadata= + s.require_paths = ["lib".freeze] + s.authors = ["Steven Baker".freeze, "David Chelimsky".freeze, "Myron Marston".freeze] + s.cert_chain = ["-----BEGIN CERTIFICATE-----\nMIIF1TCCA72gAwIBAgIJAPXjfUbCjdXUMA0GCSqGSIb3DQEBBQUAMIGAMQswCQYD\nVQQGEwJVUzETMBEGA1UECAwKV2FzaGluZ3RvbjEQMA4GA1UEBwwHU2VhdHRsZTEO\nMAwGA1UECgwFUlNwZWMxEzARBgNVBAMMCnJzcGVjLmluZm8xJTAjBgkqhkiG9w0B\nCQEWFnJzcGVjQGdvb2dsZWdyb3Vwcy5jb20wHhcNMTQxMjIzMDkzNTIyWhcNMjQx\nMjIyMDkzNTIyWjCBgDELMAkGA1UEBhMCVVMxEzARBgNVBAgMCldhc2hpbmd0b24x\nEDAOBgNVBAcMB1NlYXR0bGUxDjAMBgNVBAoMBVJTcGVjMRMwEQYDVQQDDApyc3Bl\nYy5pbmZvMSUwIwYJKoZIhvcNAQkBFhZyc3BlY0Bnb29nbGVncm91cHMuY29tMIIC\nIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAsSmjgcHaKlD0jizRJowi2bGI\nKMOHnJoExxRNHHxH+3w9kkl95YldvDRVX495b13ZCzwRe0AyqX24wq04tp0G5Z5C\ne/w2pnNK4ol1eECPwQu+YGpepeODlZICL5gwQspe0cDifbBnHx5QySMiPpvx6bC0\ntQTox0ppDIaMhch8IPCwyoE4DQK5bpsdwnLSHTsQjUIb7IM8tUMpd/iKrJgNffwc\n6gC1TmhIlzQoB26nCNh9uK7xZjUM+sGECzvcYuImchUaIgJA/ybrlZS+m/hxzvBo\nmLnn/xNEC6Vz5HG+3TR0Gb0cSUf6XUu2s51Jk/SJi3MhCZp2gs9OUg4EVZNzQVkZ\nefLBjAZG2Mxk14JyB4/Omc+Jk0ajprINCBbUNnxzCJrYDM3J9TVWIwyUGNX/U3MO\ns3tMAT+EVgx/mZMPnBO8EULlyF51MRUp3Wy9Mnw8AYLk30UnMG5AjqgO5JNyFlA7\nXeh3EVdWY3vMB1pkhPwlsenpcmj5gOzrd54lELOVbCGHCf48iSqeflY2Lhe0pvzK\nblXCJBDmtrebvus291rM/dHcbEfK1SVd5Wut/n131iouf6dnNCFskFygDcgBbthC\ngpEMqf80lEmhX59VUsm0Pv6OEo+ZPHBvXPiJA6DShQh9t3YtpwyA8uVDMbT/i32u\n2FUsqZbbJcCmkBrGposCAwEAAaNQME4wHQYDVR0OBBYEFPPvQ5XT0Nvuhi6k+hrW\nVv35J+TeMB8GA1UdIwQYMBaAFPPvQ5XT0Nvuhi6k+hrWVv35J+TeMAwGA1UdEwQF\nMAMBAf8wDQYJKoZIhvcNAQEFBQADggIBAIqbQSWH2aAF537DKwAMB8nMFsoe24MD\ngtuQAyjTtbH+QBE4N2RdQF/sU7Y3PYR7nqdrCsYc3RxyqM5XXi7I3IYdpfe1RuxY\n+pyPzVQsPPDhMlJlCrwJsADnxlpxZlAgxYSLKOan55ihscaAWA90wqRUrf/ZJM36\n8LWCPVn5teIt5aaxZWX68RMxa+AXvpbtJOBwXLkIFk3apD8CX4DhelIdw67DbkUe\nghUd/u62qrnqBTVgditt7OoWIZjzh24/Fda5d0MxZyvLILGOrf5bN4cTbe/q9Cid\nXrik7Upm+mu3y3yQIfrw85xybHq6iNXyYHvCdSrFfCIKrGpd/0CAdmYnJlx59Fk/\nUbD3Eyx4psBSkU+WKO0Uf+3zNI7N/nVeNIwU/Ft+l8l7/K+427656c+ZGWDO0Gt/\nBeEOSTDKP7qQ1T+JvMrBcBQo+i0cnRT10J1aoV90BhxsvWTRizIbugbaqR6Tq3bj\nAkt00cIlNSplL6DenIAKSh5kF7s0tRD0tC3bNkZmNjNGkdoGEcUODEpTB3RHKKiu\ne6k2Jg6m00z5vGFQhOnROG/QaUzMA3A3mFBe1RHFo07xd0pFeoeWL3vF69Gx9Jwp\nZsVDj6a7lH3cNqtWXZxrb2wO38qV5AkYj8SQK7Hj3/Yui9myUX3crr+PdetazSqQ\nF3MdtaDehhjC\n-----END CERTIFICATE-----\n".freeze] + s.date = "2022-02-09" + s.description = "BDD for Ruby".freeze + s.email = "rspec@googlegroups.com".freeze + s.extra_rdoc_files = ["README.md".freeze] + s.files = ["README.md".freeze] + s.homepage = "http://github.com/rspec".freeze + s.licenses = ["MIT".freeze] + s.rdoc_options = ["--charset=UTF-8".freeze] + s.rubygems_version = "3.3.27".freeze + s.summary = "rspec-3.11.0".freeze + + s.installed_by_version = "3.3.27" if s.respond_to? :installed_by_version + + if s.respond_to? :specification_version then + s.specification_version = 4 + end + + if s.respond_to? :add_runtime_dependency then + s.add_runtime_dependency(%q.freeze, ["~> 3.11.0"]) + s.add_runtime_dependency(%q.freeze, ["~> 3.11.0"]) + s.add_runtime_dependency(%q.freeze, ["~> 3.11.0"]) + else + s.add_dependency(%q.freeze, ["~> 3.11.0"]) + s.add_dependency(%q.freeze, ["~> 3.11.0"]) + s.add_dependency(%q.freeze, ["~> 3.11.0"]) + end +end diff --git a/vendor/bundle/ruby/3.1.0/specifications/rspec-core-3.11.0.gemspec b/vendor/bundle/ruby/3.1.0/specifications/rspec-core-3.11.0.gemspec new file mode 100644 index 000000000..907a0c832 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/specifications/rspec-core-3.11.0.gemspec @@ -0,0 +1,53 @@ +# -*- encoding: utf-8 -*- +# stub: rspec-core 3.11.0 ruby lib + +Gem::Specification.new do |s| + s.name = "rspec-core".freeze + s.version = "3.11.0" + + s.required_rubygems_version = Gem::Requirement.new(">= 0".freeze) if s.respond_to? :required_rubygems_version= + s.metadata = { "bug_tracker_uri" => "https://github.com/rspec/rspec-core/issues", "changelog_uri" => "https://github.com/rspec/rspec-core/blob/v3.11.0/Changelog.md", "documentation_uri" => "https://rspec.info/documentation/", "mailing_list_uri" => "https://groups.google.com/forum/#!forum/rspec", "source_code_uri" => "https://github.com/rspec/rspec-core" } if s.respond_to? :metadata= + s.require_paths = ["lib".freeze] + s.authors = ["Steven Baker".freeze, "David Chelimsky".freeze, "Chad Humphries".freeze, "Myron Marston".freeze] + s.bindir = "exe".freeze + s.cert_chain = ["-----BEGIN CERTIFICATE-----\nMIIF1TCCA72gAwIBAgIJAPXjfUbCjdXUMA0GCSqGSIb3DQEBBQUAMIGAMQswCQYD\nVQQGEwJVUzETMBEGA1UECAwKV2FzaGluZ3RvbjEQMA4GA1UEBwwHU2VhdHRsZTEO\nMAwGA1UECgwFUlNwZWMxEzARBgNVBAMMCnJzcGVjLmluZm8xJTAjBgkqhkiG9w0B\nCQEWFnJzcGVjQGdvb2dsZWdyb3Vwcy5jb20wHhcNMTQxMjIzMDkzNTIyWhcNMjQx\nMjIyMDkzNTIyWjCBgDELMAkGA1UEBhMCVVMxEzARBgNVBAgMCldhc2hpbmd0b24x\nEDAOBgNVBAcMB1NlYXR0bGUxDjAMBgNVBAoMBVJTcGVjMRMwEQYDVQQDDApyc3Bl\nYy5pbmZvMSUwIwYJKoZIhvcNAQkBFhZyc3BlY0Bnb29nbGVncm91cHMuY29tMIIC\nIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAsSmjgcHaKlD0jizRJowi2bGI\nKMOHnJoExxRNHHxH+3w9kkl95YldvDRVX495b13ZCzwRe0AyqX24wq04tp0G5Z5C\ne/w2pnNK4ol1eECPwQu+YGpepeODlZICL5gwQspe0cDifbBnHx5QySMiPpvx6bC0\ntQTox0ppDIaMhch8IPCwyoE4DQK5bpsdwnLSHTsQjUIb7IM8tUMpd/iKrJgNffwc\n6gC1TmhIlzQoB26nCNh9uK7xZjUM+sGECzvcYuImchUaIgJA/ybrlZS+m/hxzvBo\nmLnn/xNEC6Vz5HG+3TR0Gb0cSUf6XUu2s51Jk/SJi3MhCZp2gs9OUg4EVZNzQVkZ\nefLBjAZG2Mxk14JyB4/Omc+Jk0ajprINCBbUNnxzCJrYDM3J9TVWIwyUGNX/U3MO\ns3tMAT+EVgx/mZMPnBO8EULlyF51MRUp3Wy9Mnw8AYLk30UnMG5AjqgO5JNyFlA7\nXeh3EVdWY3vMB1pkhPwlsenpcmj5gOzrd54lELOVbCGHCf48iSqeflY2Lhe0pvzK\nblXCJBDmtrebvus291rM/dHcbEfK1SVd5Wut/n131iouf6dnNCFskFygDcgBbthC\ngpEMqf80lEmhX59VUsm0Pv6OEo+ZPHBvXPiJA6DShQh9t3YtpwyA8uVDMbT/i32u\n2FUsqZbbJcCmkBrGposCAwEAAaNQME4wHQYDVR0OBBYEFPPvQ5XT0Nvuhi6k+hrW\nVv35J+TeMB8GA1UdIwQYMBaAFPPvQ5XT0Nvuhi6k+hrWVv35J+TeMAwGA1UdEwQF\nMAMBAf8wDQYJKoZIhvcNAQEFBQADggIBAIqbQSWH2aAF537DKwAMB8nMFsoe24MD\ngtuQAyjTtbH+QBE4N2RdQF/sU7Y3PYR7nqdrCsYc3RxyqM5XXi7I3IYdpfe1RuxY\n+pyPzVQsPPDhMlJlCrwJsADnxlpxZlAgxYSLKOan55ihscaAWA90wqRUrf/ZJM36\n8LWCPVn5teIt5aaxZWX68RMxa+AXvpbtJOBwXLkIFk3apD8CX4DhelIdw67DbkUe\nghUd/u62qrnqBTVgditt7OoWIZjzh24/Fda5d0MxZyvLILGOrf5bN4cTbe/q9Cid\nXrik7Upm+mu3y3yQIfrw85xybHq6iNXyYHvCdSrFfCIKrGpd/0CAdmYnJlx59Fk/\nUbD3Eyx4psBSkU+WKO0Uf+3zNI7N/nVeNIwU/Ft+l8l7/K+427656c+ZGWDO0Gt/\nBeEOSTDKP7qQ1T+JvMrBcBQo+i0cnRT10J1aoV90BhxsvWTRizIbugbaqR6Tq3bj\nAkt00cIlNSplL6DenIAKSh5kF7s0tRD0tC3bNkZmNjNGkdoGEcUODEpTB3RHKKiu\ne6k2Jg6m00z5vGFQhOnROG/QaUzMA3A3mFBe1RHFo07xd0pFeoeWL3vF69Gx9Jwp\nZsVDj6a7lH3cNqtWXZxrb2wO38qV5AkYj8SQK7Hj3/Yui9myUX3crr+PdetazSqQ\nF3MdtaDehhjC\n-----END CERTIFICATE-----\n".freeze] + s.date = "2022-02-09" + s.description = "BDD for Ruby. RSpec runner and example groups.".freeze + s.email = "rspec@googlegroups.com".freeze + s.executables = ["rspec".freeze] + s.files = ["exe/rspec".freeze] + s.homepage = "https://github.com/rspec/rspec-core".freeze + s.licenses = ["MIT".freeze] + s.rdoc_options = ["--charset=UTF-8".freeze] + s.required_ruby_version = Gem::Requirement.new(">= 1.8.7".freeze) + s.rubygems_version = "3.3.27".freeze + s.summary = "rspec-core-3.11.0".freeze + + s.installed_by_version = "3.3.27" if s.respond_to? :installed_by_version + + if s.respond_to? :specification_version then + s.specification_version = 4 + end + + if s.respond_to? :add_runtime_dependency then + s.add_runtime_dependency(%q.freeze, ["~> 3.11.0"]) + s.add_development_dependency(%q.freeze, ["~> 1.3"]) + s.add_development_dependency(%q.freeze, ["~> 5.3"]) + s.add_development_dependency(%q.freeze, ["~> 0.14.9"]) + s.add_development_dependency(%q.freeze, ["~> 1.1.1"]) + s.add_development_dependency(%q.freeze, ["~> 0.13.0"]) + s.add_development_dependency(%q.freeze, ["~> 1.0.4"]) + s.add_development_dependency(%q.freeze, ["~> 0.9.0"]) + s.add_development_dependency(%q.freeze, ["~> 1.1.0"]) + else + s.add_dependency(%q.freeze, ["~> 3.11.0"]) + s.add_dependency(%q.freeze, ["~> 1.3"]) + s.add_dependency(%q.freeze, ["~> 5.3"]) + s.add_dependency(%q.freeze, ["~> 0.14.9"]) + s.add_dependency(%q.freeze, ["~> 1.1.1"]) + s.add_dependency(%q.freeze, ["~> 0.13.0"]) + s.add_dependency(%q.freeze, ["~> 1.0.4"]) + s.add_dependency(%q.freeze, ["~> 0.9.0"]) + s.add_dependency(%q.freeze, ["~> 1.1.0"]) + end +end diff --git a/vendor/bundle/ruby/3.1.0/specifications/rspec-expectations-3.11.0.gemspec b/vendor/bundle/ruby/3.1.0/specifications/rspec-expectations-3.11.0.gemspec new file mode 100644 index 000000000..2a1b835c5 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/specifications/rspec-expectations-3.11.0.gemspec @@ -0,0 +1,44 @@ +# -*- encoding: utf-8 -*- +# stub: rspec-expectations 3.11.0 ruby lib + +Gem::Specification.new do |s| + s.name = "rspec-expectations".freeze + s.version = "3.11.0" + + s.required_rubygems_version = Gem::Requirement.new(">= 0".freeze) if s.respond_to? :required_rubygems_version= + s.metadata = { "bug_tracker_uri" => "https://github.com/rspec/rspec-expectations/issues", "changelog_uri" => "https://github.com/rspec/rspec-expectations/blob/v3.11.0/Changelog.md", "documentation_uri" => "https://rspec.info/documentation/", "mailing_list_uri" => "https://groups.google.com/forum/#!forum/rspec", "source_code_uri" => "https://github.com/rspec/rspec-expectations" } if s.respond_to? :metadata= + s.require_paths = ["lib".freeze] + s.authors = ["Steven Baker".freeze, "David Chelimsky".freeze, "Myron Marston".freeze] + s.cert_chain = ["-----BEGIN CERTIFICATE-----\nMIIF1TCCA72gAwIBAgIJAPXjfUbCjdXUMA0GCSqGSIb3DQEBBQUAMIGAMQswCQYD\nVQQGEwJVUzETMBEGA1UECAwKV2FzaGluZ3RvbjEQMA4GA1UEBwwHU2VhdHRsZTEO\nMAwGA1UECgwFUlNwZWMxEzARBgNVBAMMCnJzcGVjLmluZm8xJTAjBgkqhkiG9w0B\nCQEWFnJzcGVjQGdvb2dsZWdyb3Vwcy5jb20wHhcNMTQxMjIzMDkzNTIyWhcNMjQx\nMjIyMDkzNTIyWjCBgDELMAkGA1UEBhMCVVMxEzARBgNVBAgMCldhc2hpbmd0b24x\nEDAOBgNVBAcMB1NlYXR0bGUxDjAMBgNVBAoMBVJTcGVjMRMwEQYDVQQDDApyc3Bl\nYy5pbmZvMSUwIwYJKoZIhvcNAQkBFhZyc3BlY0Bnb29nbGVncm91cHMuY29tMIIC\nIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAsSmjgcHaKlD0jizRJowi2bGI\nKMOHnJoExxRNHHxH+3w9kkl95YldvDRVX495b13ZCzwRe0AyqX24wq04tp0G5Z5C\ne/w2pnNK4ol1eECPwQu+YGpepeODlZICL5gwQspe0cDifbBnHx5QySMiPpvx6bC0\ntQTox0ppDIaMhch8IPCwyoE4DQK5bpsdwnLSHTsQjUIb7IM8tUMpd/iKrJgNffwc\n6gC1TmhIlzQoB26nCNh9uK7xZjUM+sGECzvcYuImchUaIgJA/ybrlZS+m/hxzvBo\nmLnn/xNEC6Vz5HG+3TR0Gb0cSUf6XUu2s51Jk/SJi3MhCZp2gs9OUg4EVZNzQVkZ\nefLBjAZG2Mxk14JyB4/Omc+Jk0ajprINCBbUNnxzCJrYDM3J9TVWIwyUGNX/U3MO\ns3tMAT+EVgx/mZMPnBO8EULlyF51MRUp3Wy9Mnw8AYLk30UnMG5AjqgO5JNyFlA7\nXeh3EVdWY3vMB1pkhPwlsenpcmj5gOzrd54lELOVbCGHCf48iSqeflY2Lhe0pvzK\nblXCJBDmtrebvus291rM/dHcbEfK1SVd5Wut/n131iouf6dnNCFskFygDcgBbthC\ngpEMqf80lEmhX59VUsm0Pv6OEo+ZPHBvXPiJA6DShQh9t3YtpwyA8uVDMbT/i32u\n2FUsqZbbJcCmkBrGposCAwEAAaNQME4wHQYDVR0OBBYEFPPvQ5XT0Nvuhi6k+hrW\nVv35J+TeMB8GA1UdIwQYMBaAFPPvQ5XT0Nvuhi6k+hrWVv35J+TeMAwGA1UdEwQF\nMAMBAf8wDQYJKoZIhvcNAQEFBQADggIBAIqbQSWH2aAF537DKwAMB8nMFsoe24MD\ngtuQAyjTtbH+QBE4N2RdQF/sU7Y3PYR7nqdrCsYc3RxyqM5XXi7I3IYdpfe1RuxY\n+pyPzVQsPPDhMlJlCrwJsADnxlpxZlAgxYSLKOan55ihscaAWA90wqRUrf/ZJM36\n8LWCPVn5teIt5aaxZWX68RMxa+AXvpbtJOBwXLkIFk3apD8CX4DhelIdw67DbkUe\nghUd/u62qrnqBTVgditt7OoWIZjzh24/Fda5d0MxZyvLILGOrf5bN4cTbe/q9Cid\nXrik7Upm+mu3y3yQIfrw85xybHq6iNXyYHvCdSrFfCIKrGpd/0CAdmYnJlx59Fk/\nUbD3Eyx4psBSkU+WKO0Uf+3zNI7N/nVeNIwU/Ft+l8l7/K+427656c+ZGWDO0Gt/\nBeEOSTDKP7qQ1T+JvMrBcBQo+i0cnRT10J1aoV90BhxsvWTRizIbugbaqR6Tq3bj\nAkt00cIlNSplL6DenIAKSh5kF7s0tRD0tC3bNkZmNjNGkdoGEcUODEpTB3RHKKiu\ne6k2Jg6m00z5vGFQhOnROG/QaUzMA3A3mFBe1RHFo07xd0pFeoeWL3vF69Gx9Jwp\nZsVDj6a7lH3cNqtWXZxrb2wO38qV5AkYj8SQK7Hj3/Yui9myUX3crr+PdetazSqQ\nF3MdtaDehhjC\n-----END CERTIFICATE-----\n".freeze] + s.date = "2022-02-09" + s.description = "rspec-expectations provides a simple, readable API to express expected outcomes of a code example.".freeze + s.email = "rspec@googlegroups.com".freeze + s.homepage = "https://github.com/rspec/rspec-expectations".freeze + s.licenses = ["MIT".freeze] + s.rdoc_options = ["--charset=UTF-8".freeze] + s.required_ruby_version = Gem::Requirement.new(">= 1.8.7".freeze) + s.rubygems_version = "3.3.27".freeze + s.summary = "rspec-expectations-3.11.0".freeze + + s.installed_by_version = "3.3.27" if s.respond_to? :installed_by_version + + if s.respond_to? :specification_version then + s.specification_version = 4 + end + + if s.respond_to? :add_runtime_dependency then + s.add_runtime_dependency(%q.freeze, ["~> 3.11.0"]) + s.add_runtime_dependency(%q.freeze, [">= 1.2.0", "< 2.0"]) + s.add_development_dependency(%q.freeze, ["~> 0.14.10"]) + s.add_development_dependency(%q.freeze, [">= 1.3"]) + s.add_development_dependency(%q.freeze, ["~> 5.2"]) + s.add_development_dependency(%q.freeze, ["> 10.0.0"]) + else + s.add_dependency(%q.freeze, ["~> 3.11.0"]) + s.add_dependency(%q.freeze, [">= 1.2.0", "< 2.0"]) + s.add_dependency(%q.freeze, ["~> 0.14.10"]) + s.add_dependency(%q.freeze, [">= 1.3"]) + s.add_dependency(%q.freeze, ["~> 5.2"]) + s.add_dependency(%q.freeze, ["> 10.0.0"]) + end +end diff --git a/vendor/bundle/ruby/3.1.0/specifications/rspec-mocks-3.11.1.gemspec b/vendor/bundle/ruby/3.1.0/specifications/rspec-mocks-3.11.1.gemspec new file mode 100644 index 000000000..26ffdb86d --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/specifications/rspec-mocks-3.11.1.gemspec @@ -0,0 +1,44 @@ +# -*- encoding: utf-8 -*- +# stub: rspec-mocks 3.11.1 ruby lib + +Gem::Specification.new do |s| + s.name = "rspec-mocks".freeze + s.version = "3.11.1" + + s.required_rubygems_version = Gem::Requirement.new(">= 0".freeze) if s.respond_to? :required_rubygems_version= + s.metadata = { "bug_tracker_uri" => "https://github.com/rspec/rspec-mocks/issues", "changelog_uri" => "https://github.com/rspec/rspec-mocks/blob/v3.11.1/Changelog.md", "documentation_uri" => "https://rspec.info/documentation/", "mailing_list_uri" => "https://groups.google.com/forum/#!forum/rspec", "source_code_uri" => "https://github.com/rspec/rspec-mocks" } if s.respond_to? :metadata= + s.require_paths = ["lib".freeze] + s.authors = ["Steven Baker".freeze, "David Chelimsky".freeze, "Myron Marston".freeze] + s.cert_chain = ["-----BEGIN CERTIFICATE-----\nMIIF1TCCA72gAwIBAgIJAPXjfUbCjdXUMA0GCSqGSIb3DQEBBQUAMIGAMQswCQYD\nVQQGEwJVUzETMBEGA1UECAwKV2FzaGluZ3RvbjEQMA4GA1UEBwwHU2VhdHRsZTEO\nMAwGA1UECgwFUlNwZWMxEzARBgNVBAMMCnJzcGVjLmluZm8xJTAjBgkqhkiG9w0B\nCQEWFnJzcGVjQGdvb2dsZWdyb3Vwcy5jb20wHhcNMTQxMjIzMDkzNTIyWhcNMjQx\nMjIyMDkzNTIyWjCBgDELMAkGA1UEBhMCVVMxEzARBgNVBAgMCldhc2hpbmd0b24x\nEDAOBgNVBAcMB1NlYXR0bGUxDjAMBgNVBAoMBVJTcGVjMRMwEQYDVQQDDApyc3Bl\nYy5pbmZvMSUwIwYJKoZIhvcNAQkBFhZyc3BlY0Bnb29nbGVncm91cHMuY29tMIIC\nIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAsSmjgcHaKlD0jizRJowi2bGI\nKMOHnJoExxRNHHxH+3w9kkl95YldvDRVX495b13ZCzwRe0AyqX24wq04tp0G5Z5C\ne/w2pnNK4ol1eECPwQu+YGpepeODlZICL5gwQspe0cDifbBnHx5QySMiPpvx6bC0\ntQTox0ppDIaMhch8IPCwyoE4DQK5bpsdwnLSHTsQjUIb7IM8tUMpd/iKrJgNffwc\n6gC1TmhIlzQoB26nCNh9uK7xZjUM+sGECzvcYuImchUaIgJA/ybrlZS+m/hxzvBo\nmLnn/xNEC6Vz5HG+3TR0Gb0cSUf6XUu2s51Jk/SJi3MhCZp2gs9OUg4EVZNzQVkZ\nefLBjAZG2Mxk14JyB4/Omc+Jk0ajprINCBbUNnxzCJrYDM3J9TVWIwyUGNX/U3MO\ns3tMAT+EVgx/mZMPnBO8EULlyF51MRUp3Wy9Mnw8AYLk30UnMG5AjqgO5JNyFlA7\nXeh3EVdWY3vMB1pkhPwlsenpcmj5gOzrd54lELOVbCGHCf48iSqeflY2Lhe0pvzK\nblXCJBDmtrebvus291rM/dHcbEfK1SVd5Wut/n131iouf6dnNCFskFygDcgBbthC\ngpEMqf80lEmhX59VUsm0Pv6OEo+ZPHBvXPiJA6DShQh9t3YtpwyA8uVDMbT/i32u\n2FUsqZbbJcCmkBrGposCAwEAAaNQME4wHQYDVR0OBBYEFPPvQ5XT0Nvuhi6k+hrW\nVv35J+TeMB8GA1UdIwQYMBaAFPPvQ5XT0Nvuhi6k+hrWVv35J+TeMAwGA1UdEwQF\nMAMBAf8wDQYJKoZIhvcNAQEFBQADggIBAIqbQSWH2aAF537DKwAMB8nMFsoe24MD\ngtuQAyjTtbH+QBE4N2RdQF/sU7Y3PYR7nqdrCsYc3RxyqM5XXi7I3IYdpfe1RuxY\n+pyPzVQsPPDhMlJlCrwJsADnxlpxZlAgxYSLKOan55ihscaAWA90wqRUrf/ZJM36\n8LWCPVn5teIt5aaxZWX68RMxa+AXvpbtJOBwXLkIFk3apD8CX4DhelIdw67DbkUe\nghUd/u62qrnqBTVgditt7OoWIZjzh24/Fda5d0MxZyvLILGOrf5bN4cTbe/q9Cid\nXrik7Upm+mu3y3yQIfrw85xybHq6iNXyYHvCdSrFfCIKrGpd/0CAdmYnJlx59Fk/\nUbD3Eyx4psBSkU+WKO0Uf+3zNI7N/nVeNIwU/Ft+l8l7/K+427656c+ZGWDO0Gt/\nBeEOSTDKP7qQ1T+JvMrBcBQo+i0cnRT10J1aoV90BhxsvWTRizIbugbaqR6Tq3bj\nAkt00cIlNSplL6DenIAKSh5kF7s0tRD0tC3bNkZmNjNGkdoGEcUODEpTB3RHKKiu\ne6k2Jg6m00z5vGFQhOnROG/QaUzMA3A3mFBe1RHFo07xd0pFeoeWL3vF69Gx9Jwp\nZsVDj6a7lH3cNqtWXZxrb2wO38qV5AkYj8SQK7Hj3/Yui9myUX3crr+PdetazSqQ\nF3MdtaDehhjC\n-----END CERTIFICATE-----\n".freeze] + s.date = "2022-03-31" + s.description = "RSpec's 'test double' framework, with support for stubbing and mocking".freeze + s.email = "rspec@googlegroups.com".freeze + s.homepage = "https://github.com/rspec/rspec-mocks".freeze + s.licenses = ["MIT".freeze] + s.rdoc_options = ["--charset=UTF-8".freeze] + s.required_ruby_version = Gem::Requirement.new(">= 1.8.7".freeze) + s.rubygems_version = "3.3.27".freeze + s.summary = "rspec-mocks-3.11.1".freeze + + s.installed_by_version = "3.3.27" if s.respond_to? :installed_by_version + + if s.respond_to? :specification_version then + s.specification_version = 4 + end + + if s.respond_to? :add_runtime_dependency then + s.add_runtime_dependency(%q.freeze, ["~> 3.11.0"]) + s.add_runtime_dependency(%q.freeze, [">= 1.2.0", "< 2.0"]) + s.add_development_dependency(%q.freeze, ["> 10.0.0"]) + s.add_development_dependency(%q.freeze, [">= 1.3"]) + s.add_development_dependency(%q.freeze, ["~> 0.14.10"]) + s.add_development_dependency(%q.freeze, ["~> 5.2"]) + else + s.add_dependency(%q.freeze, ["~> 3.11.0"]) + s.add_dependency(%q.freeze, [">= 1.2.0", "< 2.0"]) + s.add_dependency(%q.freeze, ["> 10.0.0"]) + s.add_dependency(%q.freeze, [">= 1.3"]) + s.add_dependency(%q.freeze, ["~> 0.14.10"]) + s.add_dependency(%q.freeze, ["~> 5.2"]) + end +end diff --git a/vendor/bundle/ruby/3.1.0/specifications/rspec-support-3.11.0.gemspec b/vendor/bundle/ruby/3.1.0/specifications/rspec-support-3.11.0.gemspec new file mode 100644 index 000000000..84422661f --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/specifications/rspec-support-3.11.0.gemspec @@ -0,0 +1,36 @@ +# -*- encoding: utf-8 -*- +# stub: rspec-support 3.11.0 ruby lib + +Gem::Specification.new do |s| + s.name = "rspec-support".freeze + s.version = "3.11.0" + + s.required_rubygems_version = Gem::Requirement.new(">= 0".freeze) if s.respond_to? :required_rubygems_version= + s.metadata = { "bug_tracker_uri" => "https://github.com/rspec/rspec-support/issues", "changelog_uri" => "https://github.com/rspec/rspec-support/blob/v3.11.0/Changelog.md", "documentation_uri" => "https://rspec.info/documentation/", "mailing_list_uri" => "https://groups.google.com/forum/#!forum/rspec", "source_code_uri" => "https://github.com/rspec/rspec-support" } if s.respond_to? :metadata= + s.require_paths = ["lib".freeze] + s.authors = ["David Chelimsky".freeze, "Myron Marson".freeze, "Jon Rowe".freeze, "Sam Phippen".freeze, "Xaviery Shay".freeze, "Bradley Schaefer".freeze] + s.cert_chain = ["-----BEGIN CERTIFICATE-----\nMIIF1TCCA72gAwIBAgIJAPXjfUbCjdXUMA0GCSqGSIb3DQEBBQUAMIGAMQswCQYD\nVQQGEwJVUzETMBEGA1UECAwKV2FzaGluZ3RvbjEQMA4GA1UEBwwHU2VhdHRsZTEO\nMAwGA1UECgwFUlNwZWMxEzARBgNVBAMMCnJzcGVjLmluZm8xJTAjBgkqhkiG9w0B\nCQEWFnJzcGVjQGdvb2dsZWdyb3Vwcy5jb20wHhcNMTQxMjIzMDkzNTIyWhcNMjQx\nMjIyMDkzNTIyWjCBgDELMAkGA1UEBhMCVVMxEzARBgNVBAgMCldhc2hpbmd0b24x\nEDAOBgNVBAcMB1NlYXR0bGUxDjAMBgNVBAoMBVJTcGVjMRMwEQYDVQQDDApyc3Bl\nYy5pbmZvMSUwIwYJKoZIhvcNAQkBFhZyc3BlY0Bnb29nbGVncm91cHMuY29tMIIC\nIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAsSmjgcHaKlD0jizRJowi2bGI\nKMOHnJoExxRNHHxH+3w9kkl95YldvDRVX495b13ZCzwRe0AyqX24wq04tp0G5Z5C\ne/w2pnNK4ol1eECPwQu+YGpepeODlZICL5gwQspe0cDifbBnHx5QySMiPpvx6bC0\ntQTox0ppDIaMhch8IPCwyoE4DQK5bpsdwnLSHTsQjUIb7IM8tUMpd/iKrJgNffwc\n6gC1TmhIlzQoB26nCNh9uK7xZjUM+sGECzvcYuImchUaIgJA/ybrlZS+m/hxzvBo\nmLnn/xNEC6Vz5HG+3TR0Gb0cSUf6XUu2s51Jk/SJi3MhCZp2gs9OUg4EVZNzQVkZ\nefLBjAZG2Mxk14JyB4/Omc+Jk0ajprINCBbUNnxzCJrYDM3J9TVWIwyUGNX/U3MO\ns3tMAT+EVgx/mZMPnBO8EULlyF51MRUp3Wy9Mnw8AYLk30UnMG5AjqgO5JNyFlA7\nXeh3EVdWY3vMB1pkhPwlsenpcmj5gOzrd54lELOVbCGHCf48iSqeflY2Lhe0pvzK\nblXCJBDmtrebvus291rM/dHcbEfK1SVd5Wut/n131iouf6dnNCFskFygDcgBbthC\ngpEMqf80lEmhX59VUsm0Pv6OEo+ZPHBvXPiJA6DShQh9t3YtpwyA8uVDMbT/i32u\n2FUsqZbbJcCmkBrGposCAwEAAaNQME4wHQYDVR0OBBYEFPPvQ5XT0Nvuhi6k+hrW\nVv35J+TeMB8GA1UdIwQYMBaAFPPvQ5XT0Nvuhi6k+hrWVv35J+TeMAwGA1UdEwQF\nMAMBAf8wDQYJKoZIhvcNAQEFBQADggIBAIqbQSWH2aAF537DKwAMB8nMFsoe24MD\ngtuQAyjTtbH+QBE4N2RdQF/sU7Y3PYR7nqdrCsYc3RxyqM5XXi7I3IYdpfe1RuxY\n+pyPzVQsPPDhMlJlCrwJsADnxlpxZlAgxYSLKOan55ihscaAWA90wqRUrf/ZJM36\n8LWCPVn5teIt5aaxZWX68RMxa+AXvpbtJOBwXLkIFk3apD8CX4DhelIdw67DbkUe\nghUd/u62qrnqBTVgditt7OoWIZjzh24/Fda5d0MxZyvLILGOrf5bN4cTbe/q9Cid\nXrik7Upm+mu3y3yQIfrw85xybHq6iNXyYHvCdSrFfCIKrGpd/0CAdmYnJlx59Fk/\nUbD3Eyx4psBSkU+WKO0Uf+3zNI7N/nVeNIwU/Ft+l8l7/K+427656c+ZGWDO0Gt/\nBeEOSTDKP7qQ1T+JvMrBcBQo+i0cnRT10J1aoV90BhxsvWTRizIbugbaqR6Tq3bj\nAkt00cIlNSplL6DenIAKSh5kF7s0tRD0tC3bNkZmNjNGkdoGEcUODEpTB3RHKKiu\ne6k2Jg6m00z5vGFQhOnROG/QaUzMA3A3mFBe1RHFo07xd0pFeoeWL3vF69Gx9Jwp\nZsVDj6a7lH3cNqtWXZxrb2wO38qV5AkYj8SQK7Hj3/Yui9myUX3crr+PdetazSqQ\nF3MdtaDehhjC\n-----END CERTIFICATE-----\n".freeze] + s.date = "2022-02-09" + s.description = "Support utilities for RSpec gems".freeze + s.email = "rspec-users@rubyforge.org".freeze + s.homepage = "https://github.com/rspec/rspec-support".freeze + s.licenses = ["MIT".freeze] + s.rdoc_options = ["--charset=UTF-8".freeze] + s.required_ruby_version = Gem::Requirement.new(">= 1.8.7".freeze) + s.rubygems_version = "3.3.27".freeze + s.summary = "rspec-support-3.11.0".freeze + + s.installed_by_version = "3.3.27" if s.respond_to? :installed_by_version + + if s.respond_to? :specification_version then + s.specification_version = 4 + end + + if s.respond_to? :add_runtime_dependency then + s.add_development_dependency(%q.freeze, ["> 10.0.0"]) + s.add_development_dependency(%q.freeze, ["~> 1.1.0"]) + else + s.add_dependency(%q.freeze, ["> 10.0.0"]) + s.add_dependency(%q.freeze, ["~> 1.1.0"]) + end +end diff --git a/vendor/bundle/ruby/3.1.0/specifications/rubocop-1.28.2.gemspec b/vendor/bundle/ruby/3.1.0/specifications/rubocop-1.28.2.gemspec new file mode 100644 index 000000000..65d6d4162 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/specifications/rubocop-1.28.2.gemspec @@ -0,0 +1,52 @@ +# -*- encoding: utf-8 -*- +# stub: rubocop 1.28.2 ruby lib + +Gem::Specification.new do |s| + s.name = "rubocop".freeze + s.version = "1.28.2" + + s.required_rubygems_version = Gem::Requirement.new(">= 0".freeze) if s.respond_to? :required_rubygems_version= + s.metadata = { "bug_tracker_uri" => "https://github.com/rubocop/rubocop/issues", "changelog_uri" => "https://github.com/rubocop/rubocop/blob/master/CHANGELOG.md", "documentation_uri" => "https://docs.rubocop.org/rubocop/1.28/", "homepage_uri" => "https://rubocop.org/", "rubygems_mfa_required" => "true", "source_code_uri" => "https://github.com/rubocop/rubocop/" } if s.respond_to? :metadata= + s.require_paths = ["lib".freeze] + s.authors = ["Bozhidar Batsov".freeze, "Jonas Arvidsson".freeze, "Yuji Nakayama".freeze] + s.bindir = "exe".freeze + s.date = "2022-04-25" + s.description = " RuboCop is a Ruby code style checking and code formatting tool.\n It aims to enforce the community-driven Ruby Style Guide.\n".freeze + s.email = "rubocop@googlegroups.com".freeze + s.executables = ["rubocop".freeze] + s.extra_rdoc_files = ["LICENSE.txt".freeze, "README.md".freeze] + s.files = ["LICENSE.txt".freeze, "README.md".freeze, "exe/rubocop".freeze] + s.homepage = "https://github.com/rubocop/rubocop".freeze + s.licenses = ["MIT".freeze] + s.required_ruby_version = Gem::Requirement.new(">= 2.5.0".freeze) + s.rubygems_version = "3.3.27".freeze + s.summary = "Automatic Ruby code style checking tool.".freeze + + s.installed_by_version = "3.3.27" if s.respond_to? :installed_by_version + + if s.respond_to? :specification_version then + s.specification_version = 4 + end + + if s.respond_to? :add_runtime_dependency then + s.add_runtime_dependency(%q.freeze, ["~> 1.10"]) + s.add_runtime_dependency(%q.freeze, [">= 3.1.0.0"]) + s.add_runtime_dependency(%q.freeze, [">= 2.2.2", "< 4.0"]) + s.add_runtime_dependency(%q.freeze, [">= 1.8", "< 3.0"]) + s.add_runtime_dependency(%q.freeze, [">= 0"]) + s.add_runtime_dependency(%q.freeze, [">= 1.17.0", "< 2.0"]) + s.add_runtime_dependency(%q.freeze, ["~> 1.7"]) + s.add_runtime_dependency(%q.freeze, [">= 1.4.0", "< 3.0"]) + s.add_development_dependency(%q.freeze, [">= 1.15.0", "< 3.0"]) + else + s.add_dependency(%q.freeze, ["~> 1.10"]) + s.add_dependency(%q.freeze, [">= 3.1.0.0"]) + s.add_dependency(%q.freeze, [">= 2.2.2", "< 4.0"]) + s.add_dependency(%q.freeze, [">= 1.8", "< 3.0"]) + s.add_dependency(%q.freeze, [">= 0"]) + s.add_dependency(%q.freeze, [">= 1.17.0", "< 2.0"]) + s.add_dependency(%q.freeze, ["~> 1.7"]) + s.add_dependency(%q.freeze, [">= 1.4.0", "< 3.0"]) + s.add_dependency(%q.freeze, [">= 1.15.0", "< 3.0"]) + end +end diff --git a/vendor/bundle/ruby/3.1.0/specifications/rubocop-ast-1.17.0.gemspec b/vendor/bundle/ruby/3.1.0/specifications/rubocop-ast-1.17.0.gemspec new file mode 100644 index 000000000..8cb051119 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/specifications/rubocop-ast-1.17.0.gemspec @@ -0,0 +1,36 @@ +# -*- encoding: utf-8 -*- +# stub: rubocop-ast 1.17.0 ruby lib + +Gem::Specification.new do |s| + s.name = "rubocop-ast".freeze + s.version = "1.17.0" + + s.required_rubygems_version = Gem::Requirement.new(">= 0".freeze) if s.respond_to? :required_rubygems_version= + s.metadata = { "bug_tracker_uri" => "https://github.com/rubocop/rubocop-ast/issues", "changelog_uri" => "https://github.com/rubocop/rubocop-ast/blob/master/CHANGELOG.md", "documentation_uri" => "https://docs.rubocop.org/rubocop-ast/", "homepage_uri" => "https://www.rubocop.org/", "rubygems_mfa_required" => "true", "source_code_uri" => "https://github.com/rubocop/rubocop-ast/" } if s.respond_to? :metadata= + s.require_paths = ["lib".freeze] + s.authors = ["Bozhidar Batsov".freeze, "Jonas Arvidsson".freeze, "Yuji Nakayama".freeze] + s.date = "2022-04-09" + s.description = " RuboCop's Node and NodePattern classes.\n".freeze + s.email = "rubocop@googlegroups.com".freeze + s.extra_rdoc_files = ["LICENSE.txt".freeze, "README.md".freeze] + s.files = ["LICENSE.txt".freeze, "README.md".freeze] + s.homepage = "https://github.com/rubocop/rubocop-ast".freeze + s.licenses = ["MIT".freeze] + s.required_ruby_version = Gem::Requirement.new(">= 2.5.0".freeze) + s.rubygems_version = "3.3.27".freeze + s.summary = "RuboCop tools to deal with Ruby code AST.".freeze + + s.installed_by_version = "3.3.27" if s.respond_to? :installed_by_version + + if s.respond_to? :specification_version then + s.specification_version = 4 + end + + if s.respond_to? :add_runtime_dependency then + s.add_runtime_dependency(%q.freeze, [">= 3.1.1.0"]) + s.add_development_dependency(%q.freeze, [">= 1.15.0", "< 3.0"]) + else + s.add_dependency(%q.freeze, [">= 3.1.1.0"]) + s.add_dependency(%q.freeze, [">= 1.15.0", "< 3.0"]) + end +end diff --git a/vendor/bundle/ruby/3.1.0/specifications/rubocop-rspec-2.10.0.gemspec b/vendor/bundle/ruby/3.1.0/specifications/rubocop-rspec-2.10.0.gemspec new file mode 100644 index 000000000..ab23838ad --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/specifications/rubocop-rspec-2.10.0.gemspec @@ -0,0 +1,46 @@ +# -*- encoding: utf-8 -*- +# stub: rubocop-rspec 2.10.0 ruby lib + +Gem::Specification.new do |s| + s.name = "rubocop-rspec".freeze + s.version = "2.10.0" + + s.required_rubygems_version = Gem::Requirement.new(">= 0".freeze) if s.respond_to? :required_rubygems_version= + s.metadata = { "changelog_uri" => "https://github.com/rubocop/rubocop-rspec/blob/master/CHANGELOG.md", "documentation_uri" => "https://docs.rubocop.org/rubocop-rspec/", "rubygems_mfa_required" => "true" } if s.respond_to? :metadata= + s.require_paths = ["lib".freeze] + s.authors = ["John Backus".freeze, "Ian MacLeod".freeze, "Nils Gemeinhardt".freeze] + s.date = "2022-04-19" + s.description = " Code style checking for RSpec files.\n A plugin for the RuboCop code style enforcing & linting tool.\n".freeze + s.email = ["johncbackus@gmail.com".freeze, "ian@nevir.net".freeze, "git@nilsgemeinhardt.de".freeze] + s.extra_rdoc_files = ["MIT-LICENSE.md".freeze, "README.md".freeze] + s.files = ["MIT-LICENSE.md".freeze, "README.md".freeze] + s.homepage = "https://github.com/rubocop/rubocop-rspec".freeze + s.licenses = ["MIT".freeze] + s.required_ruby_version = Gem::Requirement.new(">= 2.5.0".freeze) + s.rubygems_version = "3.3.27".freeze + s.summary = "Code style checking for RSpec files".freeze + + s.installed_by_version = "3.3.27" if s.respond_to? :installed_by_version + + if s.respond_to? :specification_version then + s.specification_version = 4 + end + + if s.respond_to? :add_runtime_dependency then + s.add_runtime_dependency(%q.freeze, ["~> 1.19"]) + s.add_development_dependency(%q.freeze, [">= 0"]) + s.add_development_dependency(%q.freeze, [">= 0"]) + s.add_development_dependency(%q.freeze, [">= 3.4"]) + s.add_development_dependency(%q.freeze, ["~> 1.7"]) + s.add_development_dependency(%q.freeze, ["~> 0.6"]) + s.add_development_dependency(%q.freeze, [">= 0"]) + else + s.add_dependency(%q.freeze, ["~> 1.19"]) + s.add_dependency(%q.freeze, [">= 0"]) + s.add_dependency(%q.freeze, [">= 0"]) + s.add_dependency(%q.freeze, [">= 3.4"]) + s.add_dependency(%q.freeze, ["~> 1.7"]) + s.add_dependency(%q.freeze, ["~> 0.6"]) + s.add_dependency(%q.freeze, [">= 0"]) + end +end diff --git a/vendor/bundle/ruby/3.1.0/specifications/ruby-progressbar-1.11.0.gemspec b/vendor/bundle/ruby/3.1.0/specifications/ruby-progressbar-1.11.0.gemspec new file mode 100644 index 000000000..f520f0e80 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/specifications/ruby-progressbar-1.11.0.gemspec @@ -0,0 +1,38 @@ +# -*- encoding: utf-8 -*- +# stub: ruby-progressbar 1.11.0 ruby lib + +Gem::Specification.new do |s| + s.name = "ruby-progressbar".freeze + s.version = "1.11.0" + + s.required_rubygems_version = Gem::Requirement.new(">= 0".freeze) if s.respond_to? :required_rubygems_version= + s.metadata = { "bug_tracker_uri" => "https://github.com/jfelchner/ruby-progressbar/issues", "changelog_uri" => "https://github.com/jfelchner/ruby-progressbar/blob/master/CHANGELOG.md", "documentation_uri" => "https://github.com/jfelchner/ruby-progressbar/tree/releases/v1.11.0", "homepage_uri" => "https://github.com/jfelchner/ruby-progressbar", "source_code_uri" => "https://github.com/jfelchner/ruby-progressbar", "wiki_uri" => "https://github.com/jfelchner/ruby-progressbar/wiki" } if s.respond_to? :metadata= + s.require_paths = ["lib".freeze] + s.authors = ["thekompanee".freeze, "jfelchner".freeze] + s.cert_chain = ["-----BEGIN CERTIFICATE-----\nMIIEGDCCAoCgAwIBAgIBAjANBgkqhkiG9w0BAQsFADAyMTAwLgYDVQQDDCdhY2Nv\ndW50c19ydWJ5Z2Vtcy9EQz10aGVrb21wYW5lZS9EQz1jb20wHhcNMjAxMjI2MjIz\nMTE2WhcNMjExMjI2MjIzMTE2WjAyMTAwLgYDVQQDDCdhY2NvdW50c19ydWJ5Z2Vt\ncy9EQz10aGVrb21wYW5lZS9EQz1jb20wggGiMA0GCSqGSIb3DQEBAQUAA4IBjwAw\nggGKAoIBgQCqhYn5ODEoLvuBIF2M1GzoaZU28+ntP5QApvDE0Te04n0JbBC1cNYH\nmr71neeSx7tlZ9w9kJ/8GNcY5bm7pNJqhyhfc+uG9M7FttcxM8AYXogjcdUDP234\n+TdmZIz20JxtWBgAZK2I3ktlgLFLC3Pxq63yzhJ75Xok07Wh+ypwjGzDNofPhz+y\nXR+UeUTp2UGe7kDVoqu/AwwPVhk1qUIRFLfC8SLDTD0CuNW3/AnkwQrKSm8vkiIn\nq9GCnOq0+jQly0b6a1Gi3ZDYEEswnTzziw2gotUZnQkF5bcOcxK1CB/Okk2jtG7i\nztMEU785tERbOSszZrz9rBS/+GnMxlD0pxy50zFfHX3jY1hwnwGjE8Gg+0iYr/tm\neysjhcbZfKrMynoqAioCSwstIwtYYYYpYzCPZzwaIBaBqQmUTkuMeiGbAdOdFOrR\nlOgl5jxCYbNOOTaXbm0nGBFaTucB88+JLbsNAuoNGUf/ybDcZ1zKRkMr2vtb+OtL\nGoP81fN6l88CAwEAAaM5MDcwCQYDVR0TBAIwADALBgNVHQ8EBAMCBLAwHQYDVR0O\nBBYEFC+HleDjPYe35DNu6n/aeK2oB4ugMA0GCSqGSIb3DQEBCwUAA4IBgQCbuxKj\nZyvFu5mUDEWCf1dT5mqFSyFznVCjQAQygDnz6JkCQlIG93IDtVLEmHrx7hm3dOYt\nHgPlsSgkoYIgsLYsR9ZIKjA2O5m3QUbo9uOtF4iRi0Obni8fVv7VZVebRfA7ypCo\nn625lDRIzc/zGVcI37bzIlDXC0aK3oaBVFmN1Uj5LNMW62hTDdMBx4HcUKI45R3g\nclUG96OBIyrYky3j6zpy6EpBaEdRWR68Yn4Tdba7xE9WzP3DCInjX3KPx+f0PPVK\nHzsXX6TlwXk2P9DwOTZRjz7vAmvTgZGWjlfq3dgQJBgjB+UKQVHxKEGUC/comr7c\nvPnXgn+nF38pK/hp/O9/lTpNplKrUvOB9+6nkwbxCPTQQO8In3pC6ixUzr/6wx9R\nURbz4/Czf5LMUmzqDni0GvBkXElaXzaIRoPM/T7b1LrRsZO3DwGFAasSrR27+ZgU\nSv+7zM1SqVOK2Vhp99UBBVIZTHSJWh4sCU7dJrUJTqvwwS3ayTiUlIi5TdQ=\n-----END CERTIFICATE-----\n".freeze] + s.date = "2020-12-31" + s.description = "Ruby/ProgressBar is an extremely flexible text progress bar library for Ruby. The output can be customized with a flexible formatting system including: percentage, bars of various formats, elapsed time and estimated time remaining.".freeze + s.email = ["support@thekompanee.com".freeze] + s.homepage = "https://github.com/jfelchner/ruby-progressbar".freeze + s.licenses = ["MIT".freeze] + s.rubygems_version = "3.3.27".freeze + s.summary = "Ruby/ProgressBar is a flexible text progress bar library for Ruby.".freeze + + s.installed_by_version = "3.3.27" if s.respond_to? :installed_by_version + + if s.respond_to? :specification_version then + s.specification_version = 4 + end + + if s.respond_to? :add_runtime_dependency then + s.add_development_dependency(%q.freeze, ["~> 3.7"]) + s.add_development_dependency(%q.freeze, ["~> 0.70.6"]) + s.add_development_dependency(%q.freeze, ["~> 2.3"]) + s.add_development_dependency(%q.freeze, ["= 0.6.0"]) + else + s.add_dependency(%q.freeze, ["~> 3.7"]) + s.add_dependency(%q.freeze, ["~> 0.70.6"]) + s.add_dependency(%q.freeze, ["~> 2.3"]) + s.add_dependency(%q.freeze, ["= 0.6.0"]) + end +end diff --git a/vendor/bundle/ruby/3.1.0/specifications/rubyzip-2.3.2.gemspec b/vendor/bundle/ruby/3.1.0/specifications/rubyzip-2.3.2.gemspec new file mode 100644 index 000000000..9ed6ab977 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/specifications/rubyzip-2.3.2.gemspec @@ -0,0 +1,40 @@ +# -*- encoding: utf-8 -*- +# stub: rubyzip 2.3.2 ruby lib + +Gem::Specification.new do |s| + s.name = "rubyzip".freeze + s.version = "2.3.2" + + s.required_rubygems_version = Gem::Requirement.new(">= 0".freeze) if s.respond_to? :required_rubygems_version= + s.metadata = { "bug_tracker_uri" => "https://github.com/rubyzip/rubyzip/issues", "changelog_uri" => "https://github.com/rubyzip/rubyzip/blob/v2.3.2/Changelog.md", "documentation_uri" => "https://www.rubydoc.info/gems/rubyzip/2.3.2", "source_code_uri" => "https://github.com/rubyzip/rubyzip/tree/v2.3.2", "wiki_uri" => "https://github.com/rubyzip/rubyzip/wiki" } if s.respond_to? :metadata= + s.require_paths = ["lib".freeze] + s.authors = ["Alexander Simonov".freeze] + s.date = "2021-07-05" + s.email = ["alex@simonov.me".freeze] + s.homepage = "http://github.com/rubyzip/rubyzip".freeze + s.licenses = ["BSD 2-Clause".freeze] + s.post_install_message = "RubyZip 3.0 is coming!\n**********************\n\nThe public API of some Rubyzip classes has been modernized to use named\nparameters for optional arguments. Please check your usage of the\nfollowing classes:\n * `Zip::File`\n * `Zip::Entry`\n * `Zip::InputStream`\n * `Zip::OutputStream`\n\nPlease ensure that your Gemfiles and .gemspecs are suitably restrictive\nto avoid an unexpected breakage when 3.0 is released (e.g. ~> 2.3.0).\nSee https://github.com/rubyzip/rubyzip for details. The Changelog also\nlists other enhancements and bugfixes that have been implemented since\nversion 2.3.0.\n".freeze + s.required_ruby_version = Gem::Requirement.new(">= 2.4".freeze) + s.rubygems_version = "3.3.27".freeze + s.summary = "rubyzip is a ruby module for reading and writing zip files".freeze + + s.installed_by_version = "3.3.27" if s.respond_to? :installed_by_version + + if s.respond_to? :specification_version then + s.specification_version = 4 + end + + if s.respond_to? :add_runtime_dependency then + s.add_development_dependency(%q.freeze, ["~> 0.7"]) + s.add_development_dependency(%q.freeze, ["~> 5.4"]) + s.add_development_dependency(%q.freeze, ["~> 0.10"]) + s.add_development_dependency(%q.freeze, ["~> 12.3", ">= 12.3.3"]) + s.add_development_dependency(%q.freeze, ["~> 0.79"]) + else + s.add_dependency(%q.freeze, ["~> 0.7"]) + s.add_dependency(%q.freeze, ["~> 5.4"]) + s.add_dependency(%q.freeze, ["~> 0.10"]) + s.add_dependency(%q.freeze, ["~> 12.3", ">= 12.3.3"]) + s.add_dependency(%q.freeze, ["~> 0.79"]) + end +end diff --git a/vendor/bundle/ruby/3.1.0/specifications/tee-1.0.0.gemspec b/vendor/bundle/ruby/3.1.0/specifications/tee-1.0.0.gemspec new file mode 100644 index 000000000..e1ffcd285 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/specifications/tee-1.0.0.gemspec @@ -0,0 +1,33 @@ +# -*- encoding: utf-8 -*- +# stub: tee 1.0.0 ruby lib + +Gem::Specification.new do |s| + s.name = "tee".freeze + s.version = "1.0.0" + + s.required_rubygems_version = Gem::Requirement.new(">= 0".freeze) if s.respond_to? :required_rubygems_version= + s.require_paths = ["lib".freeze] + s.authors = ["Masaki Takeuchi".freeze] + s.date = "2012-08-21" + s.description = "A class like tee(1).".freeze + s.email = "m.ishihara@gmail.com".freeze + s.homepage = "https://github.com/m4i/tee".freeze + s.licenses = ["MIT".freeze] + s.required_ruby_version = Gem::Requirement.new(">= 1.9.2".freeze) + s.rubygems_version = "3.3.27".freeze + s.summary = "A class like tee(1).".freeze + + s.installed_by_version = "3.3.27" if s.respond_to? :installed_by_version + + if s.respond_to? :specification_version then + s.specification_version = 3 + end + + if s.respond_to? :add_runtime_dependency then + s.add_development_dependency(%q.freeze, ["~> 0.9.2.2"]) + s.add_development_dependency(%q.freeze, ["~> 2.11.0"]) + else + s.add_dependency(%q.freeze, ["~> 0.9.2.2"]) + s.add_dependency(%q.freeze, ["~> 2.11.0"]) + end +end diff --git a/vendor/bundle/ruby/3.1.0/specifications/terminal-table-3.0.2.gemspec b/vendor/bundle/ruby/3.1.0/specifications/terminal-table-3.0.2.gemspec new file mode 100644 index 000000000..b717f91d2 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/specifications/terminal-table-3.0.2.gemspec @@ -0,0 +1,39 @@ +# -*- encoding: utf-8 -*- +# stub: terminal-table 3.0.2 ruby lib + +Gem::Specification.new do |s| + s.name = "terminal-table".freeze + s.version = "3.0.2" + + s.required_rubygems_version = Gem::Requirement.new(">= 0".freeze) if s.respond_to? :required_rubygems_version= + s.require_paths = ["lib".freeze] + s.authors = ["TJ Holowaychuk".freeze, "Scott J. Goldman".freeze] + s.date = "2021-09-19" + s.email = ["tj@vision-media.ca".freeze] + s.homepage = "https://github.com/tj/terminal-table".freeze + s.licenses = ["MIT".freeze] + s.rubygems_version = "3.3.27".freeze + s.summary = "Simple, feature rich ascii table generation library".freeze + + s.installed_by_version = "3.3.27" if s.respond_to? :installed_by_version + + if s.respond_to? :specification_version then + s.specification_version = 4 + end + + if s.respond_to? :add_runtime_dependency then + s.add_development_dependency(%q.freeze, ["~> 2"]) + s.add_development_dependency(%q.freeze, ["~> 13.0"]) + s.add_development_dependency(%q.freeze, [">= 3.0"]) + s.add_development_dependency(%q.freeze, [">= 0"]) + s.add_development_dependency(%q.freeze, [">= 0"]) + s.add_runtime_dependency(%q.freeze, [">= 1.1.1", "< 3"]) + else + s.add_dependency(%q.freeze, ["~> 2"]) + s.add_dependency(%q.freeze, ["~> 13.0"]) + s.add_dependency(%q.freeze, [">= 3.0"]) + s.add_dependency(%q.freeze, [">= 0"]) + s.add_dependency(%q.freeze, [">= 0"]) + s.add_dependency(%q.freeze, [">= 1.1.1", "< 3"]) + end +end diff --git a/vendor/bundle/ruby/3.1.0/specifications/unicode-display_width-2.1.0.gemspec b/vendor/bundle/ruby/3.1.0/specifications/unicode-display_width-2.1.0.gemspec new file mode 100644 index 000000000..44bb1bb43 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/specifications/unicode-display_width-2.1.0.gemspec @@ -0,0 +1,36 @@ +# -*- encoding: utf-8 -*- +# stub: unicode-display_width 2.1.0 ruby lib + +Gem::Specification.new do |s| + s.name = "unicode-display_width".freeze + s.version = "2.1.0" + + s.required_rubygems_version = Gem::Requirement.new(">= 0".freeze) if s.respond_to? :required_rubygems_version= + s.metadata = { "bug_tracker_uri" => "https://github.com/janlelis/unicode-display_width/issues", "changelog_uri" => "https://github.com/janlelis/unicode-display_width/blob/master/CHANGELOG.md", "source_code_uri" => "https://github.com/janlelis/unicode-display_width" } if s.respond_to? :metadata= + s.require_paths = ["lib".freeze] + s.authors = ["Jan Lelis".freeze] + s.date = "2021-09-15" + s.description = "[Unicode 14.0.0] Determines the monospace display width of a string using EastAsianWidth.txt, Unicode general category, and other data.".freeze + s.email = ["hi@ruby.consulting".freeze] + s.extra_rdoc_files = ["README.md".freeze, "MIT-LICENSE.txt".freeze, "CHANGELOG.md".freeze] + s.files = ["CHANGELOG.md".freeze, "MIT-LICENSE.txt".freeze, "README.md".freeze] + s.homepage = "https://github.com/janlelis/unicode-display_width".freeze + s.licenses = ["MIT".freeze] + s.required_ruby_version = Gem::Requirement.new(">= 1.9.3".freeze) + s.rubygems_version = "3.3.27".freeze + s.summary = "Determines the monospace display width of a string in Ruby.".freeze + + s.installed_by_version = "3.3.27" if s.respond_to? :installed_by_version + + if s.respond_to? :specification_version then + s.specification_version = 4 + end + + if s.respond_to? :add_runtime_dependency then + s.add_development_dependency(%q.freeze, ["~> 3.4"]) + s.add_development_dependency(%q.freeze, ["~> 13.0"]) + else + s.add_dependency(%q.freeze, ["~> 3.4"]) + s.add_dependency(%q.freeze, ["~> 13.0"]) + end +end diff --git a/vendor/bundle/ruby/3.1.0/specifications/webmock-3.14.0.gemspec b/vendor/bundle/ruby/3.1.0/specifications/webmock-3.14.0.gemspec new file mode 100644 index 000000000..74c5adad2 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/specifications/webmock-3.14.0.gemspec @@ -0,0 +1,66 @@ +# -*- encoding: utf-8 -*- +# stub: webmock 3.14.0 ruby lib + +Gem::Specification.new do |s| + s.name = "webmock".freeze + s.version = "3.14.0" + + s.required_rubygems_version = Gem::Requirement.new(">= 0".freeze) if s.respond_to? :required_rubygems_version= + s.metadata = { "bug_tracker_uri" => "https://github.com/bblimke/webmock/issues", "changelog_uri" => "https://github.com/bblimke/webmock/blob/v3.14.0/CHANGELOG.md", "documentation_uri" => "https://www.rubydoc.info/gems/webmock/3.14.0", "source_code_uri" => "https://github.com/bblimke/webmock/tree/v3.14.0", "wiki_uri" => "https://github.com/bblimke/webmock/wiki" } if s.respond_to? :metadata= + s.require_paths = ["lib".freeze] + s.authors = ["Bartosz Blimke".freeze] + s.date = "2021-08-05" + s.description = "WebMock allows stubbing HTTP requests and setting expectations on HTTP requests.".freeze + s.email = ["bartosz.blimke@gmail.com".freeze] + s.homepage = "http://github.com/bblimke/webmock".freeze + s.licenses = ["MIT".freeze] + s.required_ruby_version = Gem::Requirement.new(">= 2.0".freeze) + s.rubygems_version = "3.3.27".freeze + s.summary = "Library for stubbing HTTP requests in Ruby.".freeze + + s.installed_by_version = "3.3.27" if s.respond_to? :installed_by_version + + if s.respond_to? :specification_version then + s.specification_version = 4 + end + + if s.respond_to? :add_runtime_dependency then + s.add_runtime_dependency(%q.freeze, [">= 2.8.0"]) + s.add_runtime_dependency(%q.freeze, [">= 0.3.2"]) + s.add_runtime_dependency(%q.freeze, [">= 0.4.0", "< 2.0.0"]) + s.add_development_dependency(%q.freeze, [">= 0.4.18"]) + s.add_development_dependency(%q.freeze, [">= 0.7.16"]) + s.add_development_dependency(%q.freeze, [">= 0.5.0"]) + s.add_development_dependency(%q.freeze, [">= 0.8.0"]) + s.add_development_dependency(%q.freeze, ["> 1.6"]) + s.add_development_dependency(%q.freeze, [">= 3.1.0"]) + s.add_development_dependency(%q.freeze, [">= 2.2.4"]) + s.add_development_dependency(%q.freeze, [">= 1.0.2"]) + s.add_development_dependency(%q.freeze, [">= 1.0.0"]) + s.add_development_dependency(%q.freeze, [">= 0.27.5"]) + s.add_development_dependency(%q.freeze, [">= 0.48.0"]) + s.add_development_dependency(%q.freeze, [">= 5.0.0"]) + s.add_development_dependency(%q.freeze, [">= 3.0.0"]) + s.add_development_dependency(%q.freeze, ["> 3.5.0"]) + s.add_development_dependency(%q.freeze, [">= 0"]) + else + s.add_dependency(%q.freeze, [">= 2.8.0"]) + s.add_dependency(%q.freeze, [">= 0.3.2"]) + s.add_dependency(%q.freeze, [">= 0.4.0", "< 2.0.0"]) + s.add_dependency(%q.freeze, [">= 0.4.18"]) + s.add_dependency(%q.freeze, [">= 0.7.16"]) + s.add_dependency(%q.freeze, [">= 0.5.0"]) + s.add_dependency(%q.freeze, [">= 0.8.0"]) + s.add_dependency(%q.freeze, ["> 1.6"]) + s.add_dependency(%q.freeze, [">= 3.1.0"]) + s.add_dependency(%q.freeze, [">= 2.2.4"]) + s.add_dependency(%q.freeze, [">= 1.0.2"]) + s.add_dependency(%q.freeze, [">= 1.0.0"]) + s.add_dependency(%q.freeze, [">= 0.27.5"]) + s.add_dependency(%q.freeze, [">= 0.48.0"]) + s.add_dependency(%q.freeze, [">= 5.0.0"]) + s.add_dependency(%q.freeze, [">= 3.0.0"]) + s.add_dependency(%q.freeze, ["> 3.5.0"]) + s.add_dependency(%q.freeze, [">= 0"]) + end +end diff --git a/vendor/bundle/ruby/3.1.0/specifications/webrick-1.7.0.gemspec b/vendor/bundle/ruby/3.1.0/specifications/webrick-1.7.0.gemspec new file mode 100644 index 000000000..c7dafd645 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/specifications/webrick-1.7.0.gemspec @@ -0,0 +1,32 @@ +# -*- encoding: utf-8 -*- +# stub: webrick 1.7.0 ruby lib + +Gem::Specification.new do |s| + s.name = "webrick".freeze + s.version = "1.7.0" + + s.required_rubygems_version = Gem::Requirement.new(">= 0".freeze) if s.respond_to? :required_rubygems_version= + s.metadata = { "bug_tracker_uri" => "https://github.com/ruby/webrick/issues" } if s.respond_to? :metadata= + s.require_paths = ["lib".freeze] + s.authors = ["TAKAHASHI Masayoshi".freeze, "GOTOU YUUZOU".freeze, "Eric Wong".freeze] + s.date = "2020-12-11" + s.description = "WEBrick is an HTTP server toolkit that can be configured as an HTTPS server, a proxy server, and a virtual-host server.".freeze + s.email = [nil, nil, "normal@ruby-lang.org".freeze] + s.homepage = "https://github.com/ruby/webrick".freeze + s.licenses = ["Ruby".freeze, "BSD-2-Clause".freeze] + s.required_ruby_version = Gem::Requirement.new(">= 2.3.0".freeze) + s.rubygems_version = "3.3.27".freeze + s.summary = "HTTP server toolkit".freeze + + s.installed_by_version = "3.3.27" if s.respond_to? :installed_by_version + + if s.respond_to? :specification_version then + s.specification_version = 4 + end + + if s.respond_to? :add_runtime_dependency then + s.add_development_dependency(%q.freeze, [">= 0"]) + else + s.add_dependency(%q.freeze, [">= 0"]) + end +end diff --git a/vendor/bundle/ruby/3.1.0/specifications/yard-0.9.27.gemspec b/vendor/bundle/ruby/3.1.0/specifications/yard-0.9.27.gemspec new file mode 100644 index 000000000..3e3612d08 --- /dev/null +++ b/vendor/bundle/ruby/3.1.0/specifications/yard-0.9.27.gemspec @@ -0,0 +1,33 @@ +# -*- encoding: utf-8 -*- +# stub: yard 0.9.27 ruby lib + +Gem::Specification.new do |s| + s.name = "yard".freeze + s.version = "0.9.27" + + s.required_rubygems_version = Gem::Requirement.new(">= 0".freeze) if s.respond_to? :required_rubygems_version= + s.metadata = { "yard.run" => "yri" } if s.respond_to? :metadata= + s.require_paths = ["lib".freeze] + s.authors = ["Loren Segal".freeze] + s.date = "2021-11-29" + s.description = " YARD is a documentation generation tool for the Ruby programming language.\n It enables the user to generate consistent, usable documentation that can be\n exported to a number of formats very easily, and also supports extending for\n custom Ruby constructs such as custom class level definitions.\n".freeze + s.email = "lsegal@soen.ca".freeze + s.executables = ["yard".freeze, "yardoc".freeze, "yri".freeze] + s.files = ["bin/yard".freeze, "bin/yardoc".freeze, "bin/yri".freeze] + s.homepage = "http://yardoc.org".freeze + s.licenses = ["MIT".freeze] + s.rubygems_version = "3.3.27".freeze + s.summary = "Documentation tool for consistent and usable documentation in Ruby.".freeze + + s.installed_by_version = "3.3.27" if s.respond_to? :installed_by_version + + if s.respond_to? :specification_version then + s.specification_version = 4 + end + + if s.respond_to? :add_runtime_dependency then + s.add_runtime_dependency(%q.freeze, ["~> 1.7.0"]) + else + s.add_dependency(%q.freeze, ["~> 1.7.0"]) + end +end